libwebp-1.4.0/0000755000014400001440000000000014606317244010057 5ustar libwebp-1.4.0/makefile.unix0000644000014400001440000004167314606317060012550 0ustar # This makefile is a simpler alternative to the autoconf-based build # system, for simple local building of the libraries and tools. # It will not install the libraries system-wide, but just create the 'cwebp' # and 'dwebp' tools in the examples/ directory, along with the static # libraries 'src/libwebp.a', 'src/libwebpdecoder.a', 'src/mux/libwebpmux.a', # 'src/demux/libwebpdemux.a', 'extras/libwebpextras.a' and # 'sharpyuv/libsharpyuv.a'. # # To build the library and examples, use: # make -f makefile.unix # from this top directory. #### Customizable part #### # These flags assume you have libpng, libjpeg, libtiff and libgif installed. If # not, either follow the install instructions below or just comment out the next # four lines. EXTRA_FLAGS= -DWEBP_HAVE_PNG -DWEBP_HAVE_JPEG -DWEBP_HAVE_TIFF DWEBP_LIBS= -lpng -lz CWEBP_LIBS= $(DWEBP_LIBS) -ljpeg -ltiff GIF_LIBS = -lgif ifeq ($(strip $(shell uname)), Darwin) # Work around a problem linking tables marked as common symbols, # cf., src/enc/yuv.[hc] # Failure observed with: gcc 4.2.1 and 4.0.1. EXTRA_FLAGS += -fno-common EXTRA_FLAGS += -DHAVE_GLUT_GLUT_H EXTRA_FLAGS += -Wno-deprecated-declarations EXTRA_FLAGS += -I/opt/local/include EXTRA_LIBS += -L/opt/local/lib GL_LIBS = -framework GLUT -framework OpenGL else EXTRA_FLAGS += -I/usr/local/include EXTRA_LIBS += -L/usr/local/lib GL_LIBS = -lglut -lGL endif # SDL flags: use sdl-config if it exists SDL_CONFIG = $(shell sdl2-config --version 2> /dev/null) ifneq ($(SDL_CONFIG),) SDL_LIBS = $(shell sdl2-config --libs) SDL_FLAGS = $(shell sdl2-config --cflags) else # use best-guess SDL_LIBS = -lSDL2 SDL_FLAGS = endif # To install libraries on Mac OS X: # 1. Install MacPorts (https://www.macports.org/install.php) # 2. Run "sudo port install jpeg" # 3. Run "sudo port install libpng" # 4. Run "sudo port install tiff" # 5. Run "sudo port install giflib" # To install libraries on Linux: # 1. Run "sudo apt-get install libjpeg62-dev" # 2. Run "sudo apt-get install libpng12-dev" # 3. Run "sudo apt-get install libtiff4-dev" # 4. Run "sudo apt-get install libgif-dev" # Uncomment for build for 32bit platform # Alternatively, you can just use the command # 'make -f makefile.unix EXTRA_FLAGS=-m32' to that effect. # EXTRA_FLAGS += -m32 # Extra flags to enable byte swap for 16 bit colorspaces. # EXTRA_FLAGS += -DWEBP_SWAP_16BIT_CSP=1 # Extra flags to enable multi-threading EXTRA_FLAGS += -DWEBP_USE_THREAD EXTRA_LIBS += -lpthread # Control symbol visibility. Comment out if your compiler doesn't support it. EXTRA_FLAGS += -fvisibility=hidden # Extra flags to emulate C89 strictness with the full ANSI EXTRA_FLAGS += -Wextra -Wold-style-definition EXTRA_FLAGS += -Wmissing-prototypes EXTRA_FLAGS += -Wmissing-declarations EXTRA_FLAGS += -Wdeclaration-after-statement EXTRA_FLAGS += -Wshadow EXTRA_FLAGS += -Wformat-security -Wformat-nonliteral # EXTRA_FLAGS += -Wvla # SSE4.1-specific flags: ifeq ($(HAVE_SSE41), 1) EXTRA_FLAGS += -DWEBP_HAVE_SSE41 src/dsp/%_sse41.o: EXTRA_FLAGS += -msse4.1 endif # NEON-specific flags: # EXTRA_FLAGS += -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a8 # -> seems to make the overall lib slower: -fno-split-wide-types # MIPS (MSA) 32-bit build specific flags for mips32r5 (p5600): # EXTRA_FLAGS += -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 # EXTRA_FLAGS += -msched-weight -mload-store-pairs # MIPS (MSA) 64-bit build specific flags for mips64r6 (i6400): # EXTRA_FLAGS += -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 # EXTRA_FLAGS += -msched-weight -mload-store-pairs #### Nothing should normally be changed below this line #### AR = ar ARFLAGS = r CPPFLAGS = -I. -Isrc/ -Wall ifeq ($(DEBUG), 1) CFLAGS = -g else CFLAGS = -O3 -DNDEBUG endif CFLAGS += $(EXTRA_FLAGS) CC = gcc INSTALL = install GROFF = /usr/bin/groff COL = /usr/bin/col LDFLAGS = $(EXTRA_LIBS) $(EXTRA_FLAGS) -lm ifdef BITTRACE CFLAGS += -DBITTRACE=$(BITTRACE) endif ANIM_UTIL_OBJS = \ examples/anim_util.o \ SHARPYUV_OBJS = \ sharpyuv/sharpyuv.o \ sharpyuv/sharpyuv_cpu.o \ sharpyuv/sharpyuv_csp.o \ sharpyuv/sharpyuv_dsp.o \ sharpyuv/sharpyuv_gamma.o \ sharpyuv/sharpyuv_neon.o \ sharpyuv/sharpyuv_sse2.o \ DEC_OBJS = \ src/dec/alpha_dec.o \ src/dec/buffer_dec.o \ src/dec/frame_dec.o \ src/dec/idec_dec.o \ src/dec/io_dec.o \ src/dec/quant_dec.o \ src/dec/tree_dec.o \ src/dec/vp8_dec.o \ src/dec/vp8l_dec.o \ src/dec/webp_dec.o \ DEMUX_OBJS = \ src/demux/anim_decode.o \ src/demux/demux.o \ DSP_DEC_OBJS = \ src/dsp/alpha_processing.o \ src/dsp/alpha_processing_mips_dsp_r2.o \ src/dsp/alpha_processing_neon.o \ src/dsp/alpha_processing_sse2.o \ src/dsp/alpha_processing_sse41.o \ src/dsp/cpu.o \ src/dsp/dec.o \ src/dsp/dec_clip_tables.o \ src/dsp/dec_mips32.o \ src/dsp/dec_mips_dsp_r2.o \ src/dsp/dec_msa.o \ src/dsp/dec_neon.o \ src/dsp/dec_sse2.o \ src/dsp/dec_sse41.o \ src/dsp/filters.o \ src/dsp/filters_mips_dsp_r2.o \ src/dsp/filters_msa.o \ src/dsp/filters_neon.o \ src/dsp/filters_sse2.o \ src/dsp/lossless.o \ src/dsp/lossless_mips_dsp_r2.o \ src/dsp/lossless_msa.o \ src/dsp/lossless_neon.o \ src/dsp/lossless_sse2.o \ src/dsp/lossless_sse41.o \ src/dsp/rescaler.o \ src/dsp/rescaler_mips32.o \ src/dsp/rescaler_mips_dsp_r2.o \ src/dsp/rescaler_msa.o \ src/dsp/rescaler_neon.o \ src/dsp/rescaler_sse2.o \ src/dsp/upsampling.o \ src/dsp/upsampling_mips_dsp_r2.o \ src/dsp/upsampling_msa.o \ src/dsp/upsampling_neon.o \ src/dsp/upsampling_sse2.o \ src/dsp/upsampling_sse41.o \ src/dsp/yuv.o \ src/dsp/yuv_mips32.o \ src/dsp/yuv_mips_dsp_r2.o \ src/dsp/yuv_neon.o \ src/dsp/yuv_sse2.o \ src/dsp/yuv_sse41.o \ DSP_ENC_OBJS = \ src/dsp/cost.o \ src/dsp/cost_mips32.o \ src/dsp/cost_mips_dsp_r2.o \ src/dsp/cost_neon.o \ src/dsp/cost_sse2.o \ src/dsp/enc.o \ src/dsp/enc_mips32.o \ src/dsp/enc_mips_dsp_r2.o \ src/dsp/enc_msa.o \ src/dsp/enc_neon.o \ src/dsp/enc_sse2.o \ src/dsp/enc_sse41.o \ src/dsp/lossless_enc.o \ src/dsp/lossless_enc_mips32.o \ src/dsp/lossless_enc_mips_dsp_r2.o \ src/dsp/lossless_enc_msa.o \ src/dsp/lossless_enc_neon.o \ src/dsp/lossless_enc_sse2.o \ src/dsp/lossless_enc_sse41.o \ src/dsp/ssim.o \ src/dsp/ssim_sse2.o \ ENC_OBJS = \ src/enc/alpha_enc.o \ src/enc/analysis_enc.o \ src/enc/backward_references_cost_enc.o \ src/enc/backward_references_enc.o \ src/enc/config_enc.o \ src/enc/cost_enc.o \ src/enc/filter_enc.o \ src/enc/frame_enc.o \ src/enc/histogram_enc.o \ src/enc/iterator_enc.o \ src/enc/near_lossless_enc.o \ src/enc/picture_enc.o \ src/enc/picture_csp_enc.o \ src/enc/picture_psnr_enc.o \ src/enc/picture_rescale_enc.o \ src/enc/picture_tools_enc.o \ src/enc/predictor_enc.o \ src/enc/quant_enc.o \ src/enc/syntax_enc.o \ src/enc/token_enc.o \ src/enc/tree_enc.o \ src/enc/vp8l_enc.o \ src/enc/webp_enc.o \ EX_FORMAT_DEC_OBJS = \ imageio/image_dec.o \ imageio/jpegdec.o \ imageio/metadata.o \ imageio/pngdec.o \ imageio/pnmdec.o \ imageio/tiffdec.o \ imageio/webpdec.o \ EX_FORMAT_ENC_OBJS = \ imageio/image_enc.o \ EX_UTIL_OBJS = \ examples/example_util.o \ GIFDEC_OBJS = \ examples/gifdec.o \ IMAGE_UTIL_OBJS = \ imageio/imageio_util.o \ MUX_OBJS = \ src/mux/anim_encode.o \ src/mux/muxedit.o \ src/mux/muxinternal.o \ src/mux/muxread.o \ UTILS_DEC_OBJS = \ src/utils/bit_reader_utils.o \ src/utils/color_cache_utils.o \ src/utils/filters_utils.o \ src/utils/huffman_utils.o \ src/utils/palette.o \ src/utils/quant_levels_dec_utils.o \ src/utils/random_utils.o \ src/utils/rescaler_utils.o \ src/utils/thread_utils.o \ src/utils/utils.o \ UTILS_ENC_OBJS = \ src/utils/bit_writer_utils.o \ src/utils/huffman_encode_utils.o \ src/utils/quant_levels_utils.o \ EXTRA_OBJS = \ extras/extras.o \ extras/quality_estimate.o \ extras/sharpyuv_risk_table.o \ LIBWEBPDECODER_OBJS = $(DEC_OBJS) $(DSP_DEC_OBJS) $(UTILS_DEC_OBJS) LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) \ $(DSP_ENC_OBJS) $(UTILS_ENC_OBJS) LIBWEBPMUX_OBJS = $(MUX_OBJS) LIBWEBPDEMUX_OBJS = $(DEMUX_OBJS) LIBWEBPEXTRA_OBJS = $(EXTRA_OBJS) LIBSHARPYUV_OBJS = $(SHARPYUV_OBJS) HDRS_INSTALLED = \ src/webp/decode.h \ src/webp/demux.h \ src/webp/encode.h \ src/webp/mux.h \ src/webp/mux_types.h \ src/webp/types.h \ SHARPYUV_HDRS_INSTALLED = \ sharpyuv/sharpyuv.h \ sharpyuv/sharpyuv_cpu.h \ sharpyuv/sharpyuv_csp.h \ HDRS = \ src/dec/alphai_dec.h \ src/dec/common_dec.h \ src/dec/vp8_dec.h \ src/dec/vp8i_dec.h \ src/dec/vp8li_dec.h \ src/dec/webpi_dec.h \ src/dsp/common_sse2.h \ src/dsp/cpu.h \ src/dsp/dsp.h \ src/dsp/lossless.h \ src/dsp/lossless_common.h \ src/dsp/mips_macro.h \ src/dsp/msa_macro.h \ src/dsp/neon.h \ src/dsp/yuv.h \ src/enc/backward_references_enc.h \ src/enc/cost_enc.h \ src/enc/histogram_enc.h \ src/enc/vp8i_enc.h \ src/enc/vp8li_enc.h \ src/mux/animi.h \ src/mux/muxi.h \ src/utils/bit_reader_utils.h \ src/utils/bit_reader_inl_utils.h \ src/utils/bit_writer_utils.h \ src/utils/color_cache_utils.h \ src/utils/endian_inl_utils.h \ src/utils/filters_utils.h \ src/utils/huffman_utils.h \ src/utils/huffman_encode_utils.h \ src/utils/palette.h \ src/utils/quant_levels_utils.h \ src/utils/quant_levels_dec_utils.h \ src/utils/random_utils.h \ src/utils/rescaler_utils.h \ src/utils/thread_utils.h \ src/utils/utils.h \ src/webp/format_constants.h \ $(HDRS_INSTALLED) \ $(SHARPYUV_HDRS_INSTALLED) \ OUT_LIBS = examples/libexample_util.a OUT_LIBS += imageio/libimageio_util.a OUT_LIBS += imageio/libimagedec.a OUT_LIBS += imageio/libimageenc.a OUT_LIBS += src/libwebpdecoder.a OUT_LIBS += src/libwebp.a OUT_LIBS += sharpyuv/libsharpyuv.a EXTRA_LIB = extras/libwebpextras.a OUT_EXAMPLES = examples/cwebp examples/dwebp EXTRA_EXAMPLES = examples/gif2webp examples/vwebp examples/webpmux \ examples/anim_diff examples/anim_dump \ examples/img2webp examples/webpinfo OTHER_EXAMPLES = extras/get_disto extras/webp_quality extras/vwebp_sdl OUTPUT = $(OUT_LIBS) $(OUT_EXAMPLES) ifeq ($(MAKECMDGOALS),clean) OUTPUT += $(EXTRA_EXAMPLES) $(OTHER_EXAMPLES) OUTPUT += src/demux/libwebpdemux.a src/mux/libwebpmux.a $(EXTRA_LIB) OUTPUT += examples/libgifdec.a examples/libanim_util.a endif ex: $(OUT_EXAMPLES) all: ex $(EXTRA_EXAMPLES) $(OTHER_EXAMPLES) extras: $(EXTRA_LIB) $(EX_FORMAT_DEC_OBJS): %.o: %.h # special dependencies: # tree_dec.c/vp8_dec.c/bit_reader_utils.c <-> # bit_reader_inl_utils.h, endian_inl_utils.h # bit_writer_utils.c <-> endian_inl_utils.h src/dec/tree_dec.o: src/utils/bit_reader_inl_utils.h src/dec/tree_dec.o: src/utils/endian_inl_utils.h src/dec/vp8_dec.o: src/utils/bit_reader_inl_utils.h src/utils/endian_inl_utils.h src/utils/bit_reader_utils.o: src/utils/bit_reader_inl_utils.h src/utils/bit_reader_utils.o: src/utils/endian_inl_utils.h src/utils/bit_writer_utils.o: src/utils/endian_inl_utils.h %.o: %.c $(HDRS) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ examples/libanim_util.a: $(ANIM_UTIL_OBJS) examples/libexample_util.a: $(EX_UTIL_OBJS) examples/libgifdec.a: $(GIFDEC_OBJS) extras/libwebpextras.a: $(LIBWEBPEXTRA_OBJS) imageio/libimagedec.a: $(EX_FORMAT_DEC_OBJS) imageio/libimageenc.a: $(EX_FORMAT_ENC_OBJS) imageio/libimageio_util.a: $(IMAGE_UTIL_OBJS) src/libwebpdecoder.a: $(LIBWEBPDECODER_OBJS) src/libwebp.a: $(LIBWEBP_OBJS) src/mux/libwebpmux.a: $(LIBWEBPMUX_OBJS) src/demux/libwebpdemux.a: $(LIBWEBPDEMUX_OBJS) sharpyuv/libsharpyuv.a: $(LIBSHARPYUV_OBJS) %.a: $(AR) $(ARFLAGS) $@ $^ examples/anim_diff: examples/anim_diff.o $(ANIM_UTIL_OBJS) $(GIFDEC_OBJS) examples/anim_dump: examples/anim_dump.o $(ANIM_UTIL_OBJS) $(GIFDEC_OBJS) examples/cwebp: examples/cwebp.o examples/dwebp: examples/dwebp.o examples/gif2webp: examples/gif2webp.o $(GIFDEC_OBJS) examples/vwebp: examples/vwebp.o examples/webpmux: examples/webpmux.o examples/img2webp: examples/img2webp.o examples/webpinfo: examples/webpinfo.o examples/anim_diff: examples/libanim_util.a examples/libgifdec.a examples/anim_diff: src/demux/libwebpdemux.a examples/libexample_util.a examples/anim_diff: imageio/libimageio_util.a src/libwebp.a examples/anim_diff: sharpyuv/libsharpyuv.a examples/anim_diff: override EXTRA_LIBS += $(GIF_LIBS) examples/anim_diff: EXTRA_FLAGS += -DWEBP_HAVE_GIF examples/anim_dump: examples/libanim_util.a examples/libgifdec.a examples/anim_dump: src/demux/libwebpdemux.a examples/anim_dump: examples/libexample_util.a examples/anim_dump: imageio/libimageio_util.a examples/anim_dump: imageio/libimageenc.a examples/anim_dump: src/libwebp.a examples/anim_dump: sharpyuv/libsharpyuv.a examples/anim_dump: override EXTRA_LIBS += $(GIF_LIBS) $(DWEBP_LIBS) examples/cwebp: examples/libexample_util.a examples/cwebp: imageio/libimagedec.a examples/cwebp: src/demux/libwebpdemux.a examples/cwebp: imageio/libimageio_util.a examples/cwebp: src/libwebp.a examples/cwebp: sharpyuv/libsharpyuv.a examples/cwebp: override EXTRA_LIBS += $(CWEBP_LIBS) examples/dwebp: examples/libexample_util.a examples/dwebp: imageio/libimagedec.a examples/dwebp: src/demux/libwebpdemux.a examples/dwebp: imageio/libimageenc.a examples/dwebp: imageio/libimageio_util.a examples/dwebp: src/libwebp.a examples/dwebp: sharpyuv/libsharpyuv.a examples/dwebp: override EXTRA_LIBS += $(DWEBP_LIBS) examples/gif2webp: examples/libexample_util.a imageio/libimageio_util.a examples/gif2webp: examples/libgifdec.a src/mux/libwebpmux.a src/libwebp.a examples/gif2webp: sharpyuv/libsharpyuv.a examples/gif2webp: override EXTRA_LIBS += $(GIF_LIBS) examples/gif2webp: EXTRA_FLAGS += -DWEBP_HAVE_GIF examples/vwebp: examples/libexample_util.a src/demux/libwebpdemux.a examples/vwebp: imageio/libimageio_util.a src/libwebp.a examples/vwebp: sharpyuv/libsharpyuv.a examples/vwebp: override EXTRA_LIBS += $(GL_LIBS) examples/vwebp: EXTRA_FLAGS += -DWEBP_HAVE_GL examples/webpmux: examples/libexample_util.a imageio/libimageio_util.a examples/webpmux: src/mux/libwebpmux.a src/libwebpdecoder.a examples/img2webp: examples/libexample_util.a imageio/libimageio_util.a examples/img2webp: imageio/libimagedec.a examples/img2webp: src/demux/libwebpdemux.a examples/img2webp: src/mux/libwebpmux.a examples/img2webp: src/libwebp.a examples/img2webp: sharpyuv/libsharpyuv.a examples/img2webp: override EXTRA_LIBS += $(CWEBP_LIBS) examples/webpinfo: examples/libexample_util.a imageio/libimageio_util.a examples/webpinfo: src/libwebpdecoder.a extras/get_disto: extras/get_disto.o extras/get_disto: imageio/libimagedec.a extras/get_disto: src/demux/libwebpdemux.a extras/get_disto: imageio/libimageio_util.a extras/get_disto: src/libwebp.a extras/get_disto: sharpyuv/libsharpyuv.a extras/get_disto: override EXTRA_LIBS += $(CWEBP_LIBS) extras/webp_quality: extras/webp_quality.o extras/webp_quality: imageio/libimageio_util.a extras/webp_quality: $(EXTRA_LIB) src/libwebp.a extras/webp_quality: sharpyuv/libsharpyuv.a extras/vwebp_sdl: extras/vwebp_sdl.o extras/vwebp_sdl: extras/webp_to_sdl.o extras/vwebp_sdl: imageio/libimageio_util.a extras/vwebp_sdl: src/libwebp.a extras/vwebp_sdl: sharpyuv/libsharpyuv.a extras/vwebp_sdl: EXTRA_FLAGS += -DWEBP_HAVE_SDL $(SDL_FLAGS) extras/vwebp_sdl: override EXTRA_LIBS += $(SDL_LIBS) $(OUT_EXAMPLES) $(EXTRA_EXAMPLES) $(OTHER_EXAMPLES): $(CC) -o $@ $^ $(LDFLAGS) dist: DESTDIR := dist dist: OUT_EXAMPLES += $(EXTRA_EXAMPLES) dist: all $(INSTALL) -m755 -d $(DESTDIR)/include/webp \ $(DESTDIR)/include/webp/sharpyuv \ $(DESTDIR)/bin $(DESTDIR)/doc $(DESTDIR)/lib $(INSTALL) -m755 -s $(OUT_EXAMPLES) $(DESTDIR)/bin $(INSTALL) -m644 $(HDRS_INSTALLED) $(DESTDIR)/include/webp $(INSTALL) -m644 $(SHARPYUV_HDRS_INSTALLED) $(DESTDIR)/include/webp/sharpyuv $(INSTALL) -m644 src/libwebp.a $(DESTDIR)/lib $(INSTALL) -m644 src/demux/libwebpdemux.a $(DESTDIR)/lib $(INSTALL) -m644 src/mux/libwebpmux.a $(DESTDIR)/lib $(INSTALL) -m644 sharpyuv/libsharpyuv.a $(DESTDIR)/lib umask 022; \ for m in man/[cdv]webp.1 man/gif2webp.1 man/webpmux.1 \ man/img2webp.1 man/webpinfo.1; do \ basenam=$$(basename $$m .1); \ $(GROFF) -t -e -man -T ascii $$m \ | $(COL) -bx >$(DESTDIR)/doc/$${basenam}.txt; \ $(GROFF) -t -e -man -T html $$m \ | $(COL) -bx >$(DESTDIR)/doc/$${basenam}.html; \ done clean: $(RM) $(OUTPUT) *~ \ examples/*.o examples/*~ \ extras/*.o extras/*~ \ imageio/*.o imageio/*~ \ sharpyuv/*.o sharpyuv/*~ \ src/dec/*.o src/dec/*~ \ src/demux/*.o src/demux/*~ \ src/dsp/*.o src/dsp/*~ \ src/enc/*.o src/enc/*~ \ src/mux/*.o src/mux/*~ \ src/utils/*.o src/utils/*~ \ src/webp/*~ man/*~ doc/*~ swig/*~ \ .PHONY: all clean dist ex .SUFFIXES: libwebp-1.4.0/imageio/0000755000014400001440000000000014606317244011471 5ustar libwebp-1.4.0/imageio/imageio_util.h0000644000014400001440000000474514606317060014317 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utility functions used by the image decoders. // #ifndef WEBP_IMAGEIO_IMAGEIO_UTIL_H_ #define WEBP_IMAGEIO_IMAGEIO_UTIL_H_ #include #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // File I/O // Reopen file in binary (O_BINARY) mode. // Returns 'file' on success, NULL otherwise. FILE* ImgIoUtilSetBinaryMode(FILE* file); // Allocates storage for entire file 'file_name' and returns contents and size // in 'data' and 'data_size'. Returns 1 on success, 0 otherwise. '*data' should // be deleted using WebPFree(). // Note: for convenience, the data will be null-terminated with an extra byte // (not accounted for in *data_size), in case the file is text and intended // to be used as a C-string. // If 'file_name' is NULL or equal to "-", input is read from stdin by calling // the function ImgIoUtilReadFromStdin(). int ImgIoUtilReadFile(const char* const file_name, const uint8_t** data, size_t* data_size); // Same as ImgIoUtilReadFile(), but reads until EOF from stdin instead. int ImgIoUtilReadFromStdin(const uint8_t** data, size_t* data_size); // Write a data segment into a file named 'file_name'. Returns true if ok. // If 'file_name' is NULL or equal to "-", output is written to stdout. int ImgIoUtilWriteFile(const char* const file_name, const uint8_t* data, size_t data_size); //------------------------------------------------------------------------------ // Copy width x height pixels from 'src' to 'dst' honoring the strides. void ImgIoUtilCopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height); //------------------------------------------------------------------------------ // Returns 0 in case of overflow, memory over-allocation or excessive dimension. int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t stride, size_t height); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_IMAGEIO_UTIL_H_ libwebp-1.4.0/imageio/metadata.h0000644000014400001440000000242414606317060013420 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Metadata types and functions. // #ifndef WEBP_IMAGEIO_METADATA_H_ #define WEBP_IMAGEIO_METADATA_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif typedef struct MetadataPayload { uint8_t* bytes; size_t size; } MetadataPayload; typedef struct Metadata { MetadataPayload exif; MetadataPayload iccp; MetadataPayload xmp; } Metadata; #define METADATA_OFFSET(x) offsetof(Metadata, x) void MetadataInit(Metadata* const metadata); void MetadataPayloadDelete(MetadataPayload* const payload); void MetadataFree(Metadata* const metadata); // Stores 'metadata' to 'payload->bytes', returns false on allocation error. int MetadataCopy(const char* metadata, size_t metadata_len, MetadataPayload* const payload); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_METADATA_H_ libwebp-1.4.0/imageio/image_dec.h0000644000014400001440000000436114606317060013537 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // All-in-one library to decode PNG/JPEG/WebP/TIFF/WIC input images. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_IMAGEIO_IMAGE_DEC_H_ #define WEBP_IMAGEIO_IMAGE_DEC_H_ #include "webp/types.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "./metadata.h" #include "./jpegdec.h" #include "./pngdec.h" #include "./pnmdec.h" #include "./tiffdec.h" #include "./webpdec.h" #include "./wicdec.h" #ifdef __cplusplus extern "C" { #endif typedef enum { WEBP_PNG_FORMAT = 0, WEBP_JPEG_FORMAT, WEBP_TIFF_FORMAT, WEBP_WEBP_FORMAT, WEBP_PNM_FORMAT, WEBP_UNSUPPORTED_FORMAT } WebPInputFileFormat; // Returns a comma separated list of enabled input formats. const char* WebPGetEnabledInputFileFormats(void); // Try to infer the image format. 'data_size' should be larger than 12. // Returns WEBP_UNSUPPORTED_FORMAT if format can't be guess safely. WebPInputFileFormat WebPGuessImageType(const uint8_t* const data, size_t data_size); // Signature for common image-reading functions (ReadPNG, ReadJPEG, ...) typedef int (*WebPImageReader)(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); // Return the reader associated to a given file format. WebPImageReader WebPGetImageReader(WebPInputFileFormat format); // This function is similar to WebPGuessImageType(), but returns a // suitable reader function. The returned reader is never NULL, but // unknown formats will return an always-failing valid reader. WebPImageReader WebPGuessImageReader(const uint8_t* const data, size_t data_size); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_IMAGE_DEC_H_ libwebp-1.4.0/imageio/tiffdec.h0000644000014400001440000000226714606317060013251 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // TIFF decode. #ifndef WEBP_IMAGEIO_TIFFDEC_H_ #define WEBP_IMAGEIO_TIFFDEC_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; // Reads a TIFF from 'data', returning the decoded output in 'pic'. // Output is RGBA or YUVA, depending on pic->use_argb value. // If 'keep_alpha' is true and the TIFF has an alpha channel, the output is RGBA // or YUVA. Otherwise, alpha channel is dropped and output is RGB or YUV. // Returns true on success. int ReadTIFF(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_TIFFDEC_H_ libwebp-1.4.0/imageio/image_enc.c0000644000014400001440000005311314606317060013543 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Save image #include "./image_enc.h" #include #include #ifdef WEBP_HAVE_PNG #include #include // note: this must be included *after* png.h #endif #ifdef HAVE_WINCODEC_H #ifdef __MINGW32__ #define INITGUID // Without this GUIDs are declared extern and fail to link #endif #define CINTERFACE #define COBJMACROS #define _WIN32_IE 0x500 // Workaround bug in shlwapi.h when compiling C++ // code with COBJMACROS. #include // CreateStreamOnHGlobal() #include #include #include #include #endif #include "./imageio_util.h" #include "../examples/unicode.h" //------------------------------------------------------------------------------ // PNG #ifdef HAVE_WINCODEC_H #define IFS(fn) \ do { \ if (SUCCEEDED(hr)) { \ hr = (fn); \ if (FAILED(hr)) fprintf(stderr, #fn " failed %08lx\n", hr); \ } \ } while (0) #ifdef __cplusplus #define MAKE_REFGUID(x) (x) #else #define MAKE_REFGUID(x) &(x) #endif static HRESULT CreateOutputStream(const char* out_file_name, int write_to_mem, IStream** stream) { HRESULT hr = S_OK; if (write_to_mem) { // Output to a memory buffer. This is freed when 'stream' is released. IFS(CreateStreamOnHGlobal(NULL, TRUE, stream)); } else { IFS(SHCreateStreamOnFile((const LPTSTR)out_file_name, STGM_WRITE | STGM_CREATE, stream)); } if (FAILED(hr)) { _ftprintf(stderr, _T("Error opening output file %s (%08lx)\n"), (const LPTSTR)out_file_name, hr); } return hr; } static HRESULT WriteUsingWIC(const char* out_file_name, int use_stdout, REFGUID container_guid, uint8_t* rgb, int stride, uint32_t width, uint32_t height, int has_alpha) { HRESULT hr = S_OK; IWICImagingFactory* factory = NULL; IWICBitmapFrameEncode* frame = NULL; IWICBitmapEncoder* encoder = NULL; IStream* stream = NULL; WICPixelFormatGUID pixel_format = has_alpha ? GUID_WICPixelFormat32bppBGRA : GUID_WICPixelFormat24bppBGR; if (out_file_name == NULL || rgb == NULL) return E_INVALIDARG; IFS(CoInitialize(NULL)); IFS(CoCreateInstance(MAKE_REFGUID(CLSID_WICImagingFactory), NULL, CLSCTX_INPROC_SERVER, MAKE_REFGUID(IID_IWICImagingFactory), (LPVOID*)&factory)); if (hr == REGDB_E_CLASSNOTREG) { fprintf(stderr, "Couldn't access Windows Imaging Component (are you running " "Windows XP SP3 or newer?). PNG support not available. " "Use -ppm or -pgm for available PPM and PGM formats.\n"); } IFS(CreateOutputStream(out_file_name, use_stdout, &stream)); IFS(IWICImagingFactory_CreateEncoder(factory, container_guid, NULL, &encoder)); IFS(IWICBitmapEncoder_Initialize(encoder, stream, WICBitmapEncoderNoCache)); IFS(IWICBitmapEncoder_CreateNewFrame(encoder, &frame, NULL)); IFS(IWICBitmapFrameEncode_Initialize(frame, NULL)); IFS(IWICBitmapFrameEncode_SetSize(frame, width, height)); IFS(IWICBitmapFrameEncode_SetPixelFormat(frame, &pixel_format)); IFS(IWICBitmapFrameEncode_WritePixels(frame, height, stride, height * stride, rgb)); IFS(IWICBitmapFrameEncode_Commit(frame)); IFS(IWICBitmapEncoder_Commit(encoder)); if (SUCCEEDED(hr) && use_stdout) { HGLOBAL image; IFS(GetHGlobalFromStream(stream, &image)); if (SUCCEEDED(hr)) { HANDLE std_output = GetStdHandle(STD_OUTPUT_HANDLE); DWORD mode; const BOOL update_mode = GetConsoleMode(std_output, &mode); const void* const image_mem = GlobalLock(image); DWORD bytes_written = 0; // Clear output processing if necessary, then output the image. if (update_mode) SetConsoleMode(std_output, 0); if (!WriteFile(std_output, image_mem, (DWORD)GlobalSize(image), &bytes_written, NULL) || bytes_written != GlobalSize(image)) { hr = E_FAIL; } if (update_mode) SetConsoleMode(std_output, mode); GlobalUnlock(image); } } if (frame != NULL) IUnknown_Release(frame); if (encoder != NULL) IUnknown_Release(encoder); if (factory != NULL) IUnknown_Release(factory); if (stream != NULL) IUnknown_Release(stream); return hr; } int WebPWritePNG(const char* out_file_name, int use_stdout, const WebPDecBuffer* const buffer) { const uint32_t width = buffer->width; const uint32_t height = buffer->height; uint8_t* const rgb = buffer->u.RGBA.rgba; const int stride = buffer->u.RGBA.stride; const int has_alpha = WebPIsAlphaMode(buffer->colorspace); return SUCCEEDED(WriteUsingWIC(out_file_name, use_stdout, MAKE_REFGUID(GUID_ContainerFormatPng), rgb, stride, width, height, has_alpha)); } #elif defined(WEBP_HAVE_PNG) // !HAVE_WINCODEC_H static void PNGAPI PNGErrorFunction(png_structp png, png_const_charp unused) { (void)unused; // remove variable-unused warning longjmp(png_jmpbuf(png), 1); } int WebPWritePNG(FILE* out_file, const WebPDecBuffer* const buffer) { volatile png_structp png; volatile png_infop info; if (out_file == NULL || buffer == NULL) return 0; png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, PNGErrorFunction, NULL); if (png == NULL) { return 0; } info = png_create_info_struct(png); if (info == NULL) { png_destroy_write_struct((png_structpp)&png, NULL); return 0; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct((png_structpp)&png, (png_infopp)&info); return 0; } png_init_io(png, out_file); { const uint32_t width = buffer->width; const uint32_t height = buffer->height; png_bytep row = buffer->u.RGBA.rgba; const int stride = buffer->u.RGBA.stride; const int has_alpha = WebPIsAlphaMode(buffer->colorspace); uint32_t y; png_set_IHDR(png, info, width, height, 8, has_alpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png, info); for (y = 0; y < height; ++y) { png_write_rows(png, &row, 1); row += stride; } } png_write_end(png, info); png_destroy_write_struct((png_structpp)&png, (png_infopp)&info); return 1; } #else // !HAVE_WINCODEC_H && !WEBP_HAVE_PNG int WebPWritePNG(FILE* fout, const WebPDecBuffer* const buffer) { if (fout == NULL || buffer == NULL) return 0; fprintf(stderr, "PNG support not compiled. Please install the libpng " "development package before building.\n"); fprintf(stderr, "You can run with -ppm flag to decode in PPM format.\n"); return 0; } #endif //------------------------------------------------------------------------------ // PPM / PAM static int WritePPMPAM(FILE* fout, const WebPDecBuffer* const buffer, int alpha) { if (fout == NULL || buffer == NULL) { return 0; } else { const uint32_t width = buffer->width; const uint32_t height = buffer->height; const uint8_t* row = buffer->u.RGBA.rgba; const int stride = buffer->u.RGBA.stride; const size_t bytes_per_px = alpha ? 4 : 3; uint32_t y; if (row == NULL) return 0; if (alpha) { fprintf(fout, "P7\nWIDTH %u\nHEIGHT %u\nDEPTH 4\nMAXVAL 255\n" "TUPLTYPE RGB_ALPHA\nENDHDR\n", width, height); } else { fprintf(fout, "P6\n%u %u\n255\n", width, height); } for (y = 0; y < height; ++y) { if (fwrite(row, width, bytes_per_px, fout) != bytes_per_px) { return 0; } row += stride; } } return 1; } int WebPWritePPM(FILE* fout, const WebPDecBuffer* const buffer) { return WritePPMPAM(fout, buffer, 0); } int WebPWritePAM(FILE* fout, const WebPDecBuffer* const buffer) { return WritePPMPAM(fout, buffer, 1); } //------------------------------------------------------------------------------ // Raw PGM // Save 16b mode (RGBA4444, RGB565, ...) for debugging purpose. int WebPWrite16bAsPGM(FILE* fout, const WebPDecBuffer* const buffer) { uint32_t width, height; uint8_t* rgba; int stride; const uint32_t bytes_per_px = 2; uint32_t y; if (fout == NULL || buffer == NULL) return 0; width = buffer->width; height = buffer->height; rgba = buffer->u.RGBA.rgba; stride = buffer->u.RGBA.stride; if (rgba == NULL) return 0; fprintf(fout, "P5\n%u %u\n255\n", width * bytes_per_px, height); for (y = 0; y < height; ++y) { if (fwrite(rgba, width, bytes_per_px, fout) != bytes_per_px) { return 0; } rgba += stride; } return 1; } //------------------------------------------------------------------------------ // BMP (see https://en.wikipedia.org/wiki/BMP_file_format#Pixel_storage) static void PutLE16(uint8_t* const dst, uint32_t value) { dst[0] = (value >> 0) & 0xff; dst[1] = (value >> 8) & 0xff; } static void PutLE32(uint8_t* const dst, uint32_t value) { PutLE16(dst + 0, (value >> 0) & 0xffff); PutLE16(dst + 2, (value >> 16) & 0xffff); } #define BMP_HEADER_SIZE 54 #define BMP_HEADER_ALPHA_EXTRA_SIZE 16 // for alpha info int WebPWriteBMP(FILE* fout, const WebPDecBuffer* const buffer) { int has_alpha, header_size; uint32_t width, height; uint8_t* rgba; int stride; uint32_t y; uint32_t bytes_per_px, line_size, image_size, bmp_stride, total_size; uint8_t bmp_header[BMP_HEADER_SIZE + BMP_HEADER_ALPHA_EXTRA_SIZE] = { 0 }; if (fout == NULL || buffer == NULL) return 0; has_alpha = WebPIsAlphaMode(buffer->colorspace); header_size = BMP_HEADER_SIZE + (has_alpha ? BMP_HEADER_ALPHA_EXTRA_SIZE : 0); width = buffer->width; height = buffer->height; rgba = buffer->u.RGBA.rgba; stride = buffer->u.RGBA.stride; bytes_per_px = has_alpha ? 4 : 3; line_size = bytes_per_px * width; bmp_stride = (line_size + 3) & ~3; // pad to 4 image_size = bmp_stride * height; total_size = image_size + header_size; if (rgba == NULL) return 0; // bitmap file header PutLE16(bmp_header + 0, 0x4d42); // signature 'BM' PutLE32(bmp_header + 2, total_size); // size including header PutLE32(bmp_header + 6, 0); // reserved PutLE32(bmp_header + 10, header_size); // offset to pixel array // bitmap info header PutLE32(bmp_header + 14, header_size - 14); // DIB header size PutLE32(bmp_header + 18, width); // dimensions PutLE32(bmp_header + 22, height); // no vertical flip PutLE16(bmp_header + 26, 1); // number of planes PutLE16(bmp_header + 28, bytes_per_px * 8); // bits per pixel PutLE32(bmp_header + 30, has_alpha ? 3 : 0); // BI_BITFIELDS or BI_RGB PutLE32(bmp_header + 34, image_size); PutLE32(bmp_header + 38, 2400); // x pixels/meter PutLE32(bmp_header + 42, 2400); // y pixels/meter PutLE32(bmp_header + 46, 0); // number of palette colors PutLE32(bmp_header + 50, 0); // important color count if (has_alpha) { // BITMAPV3INFOHEADER complement PutLE32(bmp_header + 54, 0x00ff0000); // red mask PutLE32(bmp_header + 58, 0x0000ff00); // green mask PutLE32(bmp_header + 62, 0x000000ff); // blue mask PutLE32(bmp_header + 66, 0xff000000); // alpha mask } // TODO(skal): color profile // write header if (fwrite(bmp_header, header_size, 1, fout) != 1) { return 0; } // write pixel array, bottom to top for (y = 0; y < height; ++y) { const uint8_t* const src = &rgba[(uint64_t)(height - 1 - y) * stride]; if (fwrite(src, line_size, 1, fout) != 1) { return 0; } // write padding zeroes if (bmp_stride != line_size) { const uint8_t zeroes[3] = { 0 }; if (fwrite(zeroes, bmp_stride - line_size, 1, fout) != 1) { return 0; } } } return 1; } #undef BMP_HEADER_SIZE #undef BMP_HEADER_ALPHA_EXTRA_SIZE //------------------------------------------------------------------------------ // TIFF #define NUM_IFD_ENTRIES 15 #define EXTRA_DATA_SIZE 16 // 10b for signature/header + n * 12b entries + 4b for IFD terminator: #define EXTRA_DATA_OFFSET (10 + 12 * NUM_IFD_ENTRIES + 4) #define TIFF_HEADER_SIZE (EXTRA_DATA_OFFSET + EXTRA_DATA_SIZE) int WebPWriteTIFF(FILE* fout, const WebPDecBuffer* const buffer) { int has_alpha; uint32_t width, height; uint8_t* rgba; int stride; uint8_t bytes_per_px = 0; const uint8_t assoc_alpha = 0; // For non-alpha case, we omit tag 0x152 (ExtraSamples). const uint8_t num_ifd_entries = 0; uint8_t tiff_header[TIFF_HEADER_SIZE] = { 0x49, 0x49, 0x2a, 0x00, // little endian signature 8, 0, 0, 0, // offset to the unique IFD that follows // IFD (offset = 8). Entries must be written in increasing tag order. num_ifd_entries, 0, // Number of entries in the IFD (12 bytes each). 0x00, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 10: Width (TBD) 0x01, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 22: Height (TBD) 0x02, 0x01, 3, 0, bytes_per_px, 0, 0, 0, // 34: BitsPerSample: 8888 EXTRA_DATA_OFFSET + 0, 0, 0, 0, 0x03, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 46: Compression: none 0x06, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 58: Photometric: RGB 0x11, 0x01, 4, 0, 1, 0, 0, 0, // 70: Strips offset: TIFF_HEADER_SIZE, 0, 0, 0, // data follows header 0x12, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 82: Orientation: topleft 0x15, 0x01, 3, 0, 1, 0, 0, 0, // 94: SamplesPerPixels bytes_per_px, 0, 0, 0, 0x16, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 106: Rows per strip (TBD) 0x17, 0x01, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 118: StripByteCount (TBD) 0x1a, 0x01, 5, 0, 1, 0, 0, 0, // 130: X-resolution EXTRA_DATA_OFFSET + 8, 0, 0, 0, 0x1b, 0x01, 5, 0, 1, 0, 0, 0, // 142: Y-resolution EXTRA_DATA_OFFSET + 8, 0, 0, 0, 0x1c, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 154: PlanarConfiguration 0x28, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 166: ResolutionUnit (inch) 0x52, 0x01, 3, 0, 1, 0, 0, 0, assoc_alpha, 0, 0, 0, // 178: ExtraSamples: rgbA/RGBA 0, 0, 0, 0, // 190: IFD terminator // EXTRA_DATA_OFFSET: 8, 0, 8, 0, 8, 0, 8, 0, // BitsPerSample 72, 0, 0, 0, 1, 0, 0, 0 // 72 pixels/inch, for X/Y-resolution }; uint32_t y; if (fout == NULL || buffer == NULL) return 0; has_alpha = WebPIsAlphaMode(buffer->colorspace); width = buffer->width; height = buffer->height; rgba = buffer->u.RGBA.rgba; stride = buffer->u.RGBA.stride; if (rgba == NULL) return 0; // Update bytes_per_px, num_ifd_entries and assoc_alpha. tiff_header[38] = tiff_header[102] = bytes_per_px = has_alpha ? 4 : 3; tiff_header[8] = has_alpha ? NUM_IFD_ENTRIES : NUM_IFD_ENTRIES - 1; tiff_header[186] = WebPIsPremultipliedMode(buffer->colorspace) ? 1 : 2; // Fill placeholders in IFD: PutLE32(tiff_header + 10 + 8, width); PutLE32(tiff_header + 22 + 8, height); PutLE32(tiff_header + 106 + 8, height); PutLE32(tiff_header + 118 + 8, width * bytes_per_px * height); if (!has_alpha) PutLE32(tiff_header + 178, 0); // IFD terminator // write header if (fwrite(tiff_header, sizeof(tiff_header), 1, fout) != 1) { return 0; } // write pixel values for (y = 0; y < height; ++y) { if (fwrite(rgba, bytes_per_px, width, fout) != width) { return 0; } rgba += stride; } return 1; } #undef TIFF_HEADER_SIZE #undef EXTRA_DATA_OFFSET #undef EXTRA_DATA_SIZE #undef NUM_IFD_ENTRIES //------------------------------------------------------------------------------ // Raw Alpha int WebPWriteAlphaPlane(FILE* fout, const WebPDecBuffer* const buffer) { if (fout == NULL || buffer == NULL) { return 0; } else { const uint32_t width = buffer->width; const uint32_t height = buffer->height; const uint8_t* a = buffer->u.YUVA.a; const int a_stride = buffer->u.YUVA.a_stride; uint32_t y; if (a == NULL) return 0; fprintf(fout, "P5\n%u %u\n255\n", width, height); for (y = 0; y < height; ++y) { if (fwrite(a, width, 1, fout) != 1) return 0; a += a_stride; } return 1; } } //------------------------------------------------------------------------------ // PGM with IMC4 layout int WebPWritePGM(FILE* fout, const WebPDecBuffer* const buffer) { if (fout == NULL || buffer == NULL) { return 0; } else { const int width = buffer->width; const int height = buffer->height; const WebPYUVABuffer* const yuv = &buffer->u.YUVA; const uint8_t* src_y = yuv->y; const uint8_t* src_u = yuv->u; const uint8_t* src_v = yuv->v; const uint8_t* src_a = yuv->a; const int uv_width = (width + 1) / 2; const int uv_height = (height + 1) / 2; const int a_height = (src_a != NULL) ? height : 0; int ok = 1; int y; if (src_y == NULL || src_u == NULL || src_v == NULL) return 0; fprintf(fout, "P5\n%d %d\n255\n", (width + 1) & ~1, height + uv_height + a_height); for (y = 0; ok && y < height; ++y) { ok &= (fwrite(src_y, width, 1, fout) == 1); if (width & 1) fputc(0, fout); // padding byte src_y += yuv->y_stride; } for (y = 0; ok && y < uv_height; ++y) { ok &= (fwrite(src_u, uv_width, 1, fout) == 1); ok &= (fwrite(src_v, uv_width, 1, fout) == 1); src_u += yuv->u_stride; src_v += yuv->v_stride; } for (y = 0; ok && y < a_height; ++y) { ok &= (fwrite(src_a, width, 1, fout) == 1); if (width & 1) fputc(0, fout); // padding byte src_a += yuv->a_stride; } return ok; } } //------------------------------------------------------------------------------ // Raw YUV(A) planes int WebPWriteYUV(FILE* fout, const WebPDecBuffer* const buffer) { if (fout == NULL || buffer == NULL) { return 0; } else { const int width = buffer->width; const int height = buffer->height; const WebPYUVABuffer* const yuv = &buffer->u.YUVA; const uint8_t* src_y = yuv->y; const uint8_t* src_u = yuv->u; const uint8_t* src_v = yuv->v; const uint8_t* src_a = yuv->a; const int uv_width = (width + 1) / 2; const int uv_height = (height + 1) / 2; const int a_height = (src_a != NULL) ? height : 0; int ok = 1; int y; if (src_y == NULL || src_u == NULL || src_v == NULL) return 0; for (y = 0; ok && y < height; ++y) { ok &= (fwrite(src_y, width, 1, fout) == 1); src_y += yuv->y_stride; } for (y = 0; ok && y < uv_height; ++y) { ok &= (fwrite(src_u, uv_width, 1, fout) == 1); src_u += yuv->u_stride; } for (y = 0; ok && y < uv_height; ++y) { ok &= (fwrite(src_v, uv_width, 1, fout) == 1); src_v += yuv->v_stride; } for (y = 0; ok && y < a_height; ++y) { ok &= (fwrite(src_a, width, 1, fout) == 1); src_a += yuv->a_stride; } return ok; } } //------------------------------------------------------------------------------ // Generic top-level call int WebPSaveImage(const WebPDecBuffer* const buffer, WebPOutputFileFormat format, const char* const out_file_name) { FILE* fout = NULL; int needs_open_file = 1; const int use_stdout = (out_file_name != NULL) && !WSTRCMP(out_file_name, "-"); int ok = 1; if (buffer == NULL || out_file_name == NULL) return 0; #ifdef HAVE_WINCODEC_H needs_open_file = (format != PNG); #endif if (needs_open_file) { fout = use_stdout ? ImgIoUtilSetBinaryMode(stdout) : WFOPEN(out_file_name, "wb"); if (fout == NULL) { WFPRINTF(stderr, "Error opening output file %s\n", (const W_CHAR*)out_file_name); return 0; } } if (format == PNG || format == RGBA || format == BGRA || format == ARGB || format == rgbA || format == bgrA || format == Argb) { #ifdef HAVE_WINCODEC_H ok &= WebPWritePNG(out_file_name, use_stdout, buffer); #else ok &= WebPWritePNG(fout, buffer); #endif } else if (format == PAM) { ok &= WebPWritePAM(fout, buffer); } else if (format == PPM || format == RGB || format == BGR) { ok &= WebPWritePPM(fout, buffer); } else if (format == RGBA_4444 || format == RGB_565 || format == rgbA_4444) { ok &= WebPWrite16bAsPGM(fout, buffer); } else if (format == BMP) { ok &= WebPWriteBMP(fout, buffer); } else if (format == TIFF) { ok &= WebPWriteTIFF(fout, buffer); } else if (format == RAW_YUV) { ok &= WebPWriteYUV(fout, buffer); } else if (format == PGM || format == YUV || format == YUVA) { ok &= WebPWritePGM(fout, buffer); } else if (format == ALPHA_PLANE_ONLY) { ok &= WebPWriteAlphaPlane(fout, buffer); } if (fout != NULL && fout != stdout) { fclose(fout); } return ok; } libwebp-1.4.0/imageio/metadata.c0000644000014400001440000000300414606317060013406 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Metadata types and functions. // #include "./metadata.h" #include #include #include "webp/types.h" void MetadataInit(Metadata* const metadata) { if (metadata == NULL) return; memset(metadata, 0, sizeof(*metadata)); } void MetadataPayloadDelete(MetadataPayload* const payload) { if (payload == NULL) return; free(payload->bytes); payload->bytes = NULL; payload->size = 0; } void MetadataFree(Metadata* const metadata) { if (metadata == NULL) return; MetadataPayloadDelete(&metadata->exif); MetadataPayloadDelete(&metadata->iccp); MetadataPayloadDelete(&metadata->xmp); } int MetadataCopy(const char* metadata, size_t metadata_len, MetadataPayload* const payload) { if (metadata == NULL || metadata_len == 0 || payload == NULL) return 0; payload->bytes = (uint8_t*)malloc(metadata_len); if (payload->bytes == NULL) return 0; payload->size = metadata_len; memcpy(payload->bytes, metadata, metadata_len); return 1; } // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/Android.mk0000644000014400001440000000221114606317060013372 0ustar # Ignore this file during non-NDK builds. ifdef NDK_ROOT LOCAL_PATH := $(call my-dir) ################################################################################ # libimageio_util include $(CLEAR_VARS) LOCAL_SRC_FILES := \ imageio_util.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src LOCAL_MODULE := imageio_util include $(BUILD_STATIC_LIBRARY) ################################################################################ # libimagedec include $(CLEAR_VARS) LOCAL_SRC_FILES := \ image_dec.c \ jpegdec.c \ metadata.c \ pngdec.c \ pnmdec.c \ tiffdec.c \ webpdec.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src LOCAL_STATIC_LIBRARIES := imageio_util LOCAL_MODULE := imagedec include $(BUILD_STATIC_LIBRARY) ################################################################################ # libimageenc include $(CLEAR_VARS) LOCAL_SRC_FILES := \ image_enc.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src LOCAL_STATIC_LIBRARIES := imageio_util LOCAL_MODULE := imageenc include $(BUILD_STATIC_LIBRARY) endif # NDK_ROOT libwebp-1.4.0/imageio/webpdec.c0000644000014400001440000001744514606317060013255 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP decode. #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "./webpdec.h" #include #include #include #include "webp/decode.h" #include "webp/demux.h" #include "webp/encode.h" #include "../examples/unicode.h" #include "./imageio_util.h" #include "./metadata.h" //------------------------------------------------------------------------------ // WebP decoding static const char* const kStatusMessages[VP8_STATUS_NOT_ENOUGH_DATA + 1] = { "OK", "OUT_OF_MEMORY", "INVALID_PARAM", "BITSTREAM_ERROR", "UNSUPPORTED_FEATURE", "SUSPENDED", "USER_ABORT", "NOT_ENOUGH_DATA" }; static void PrintAnimationWarning(const WebPDecoderConfig* const config) { if (config->input.has_animation) { fprintf(stderr, "Error! Decoding of an animated WebP file is not supported.\n" " Use webpmux to extract the individual frames or\n" " vwebp to view this image.\n"); } } void PrintWebPError(const char* const in_file, int status) { WFPRINTF(stderr, "Decoding of %s failed.\n", (const W_CHAR*)in_file); fprintf(stderr, "Status: %d", status); if (status >= VP8_STATUS_OK && status <= VP8_STATUS_NOT_ENOUGH_DATA) { fprintf(stderr, "(%s)", kStatusMessages[status]); } fprintf(stderr, "\n"); } int LoadWebP(const char* const in_file, const uint8_t** data, size_t* data_size, WebPBitstreamFeatures* bitstream) { VP8StatusCode status; WebPBitstreamFeatures local_features; if (!ImgIoUtilReadFile(in_file, data, data_size)) return 0; if (bitstream == NULL) { bitstream = &local_features; } status = WebPGetFeatures(*data, *data_size, bitstream); if (status != VP8_STATUS_OK) { WebPFree((void*)*data); *data = NULL; *data_size = 0; PrintWebPError(in_file, status); return 0; } return 1; } //------------------------------------------------------------------------------ VP8StatusCode DecodeWebP(const uint8_t* const data, size_t data_size, WebPDecoderConfig* const config) { if (config == NULL) return VP8_STATUS_INVALID_PARAM; PrintAnimationWarning(config); return WebPDecode(data, data_size, config); } VP8StatusCode DecodeWebPIncremental( const uint8_t* const data, size_t data_size, WebPDecoderConfig* const config) { VP8StatusCode status = VP8_STATUS_OK; if (config == NULL) return VP8_STATUS_INVALID_PARAM; PrintAnimationWarning(config); // Decoding call. { WebPIDecoder* const idec = WebPIDecode(data, data_size, config); if (idec == NULL) { fprintf(stderr, "Failed during WebPIDecode().\n"); return VP8_STATUS_OUT_OF_MEMORY; } else { status = WebPIUpdate(idec, data, data_size); WebPIDelete(idec); } } return status; } // ----------------------------------------------------------------------------- // Metadata static int ExtractMetadata(const uint8_t* const data, size_t data_size, Metadata* const metadata) { WebPData webp_data = { data, data_size }; WebPDemuxer* const demux = WebPDemux(&webp_data); WebPChunkIterator chunk_iter; uint32_t flags; if (demux == NULL) return 0; assert(metadata != NULL); flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); if ((flags & ICCP_FLAG) && WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter)) { MetadataCopy((const char*)chunk_iter.chunk.bytes, chunk_iter.chunk.size, &metadata->iccp); WebPDemuxReleaseChunkIterator(&chunk_iter); } if ((flags & EXIF_FLAG) && WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter)) { MetadataCopy((const char*)chunk_iter.chunk.bytes, chunk_iter.chunk.size, &metadata->exif); WebPDemuxReleaseChunkIterator(&chunk_iter); } if ((flags & XMP_FLAG) && WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter)) { MetadataCopy((const char*)chunk_iter.chunk.bytes, chunk_iter.chunk.size, &metadata->xmp); WebPDemuxReleaseChunkIterator(&chunk_iter); } WebPDemuxDelete(demux); return 1; } // ----------------------------------------------------------------------------- int ReadWebP(const uint8_t* const data, size_t data_size, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { int ok = 0; VP8StatusCode status = VP8_STATUS_OK; WebPDecoderConfig config; WebPDecBuffer* const output_buffer = &config.output; WebPBitstreamFeatures* const bitstream = &config.input; if (data == NULL || data_size == 0 || pic == NULL) return 0; if (!WebPInitDecoderConfig(&config)) { fprintf(stderr, "Library version mismatch!\n"); return 0; } status = WebPGetFeatures(data, data_size, bitstream); if (status != VP8_STATUS_OK) { PrintWebPError("input data", status); return 0; } do { const int has_alpha = keep_alpha && bitstream->has_alpha; uint64_t stride; pic->width = bitstream->width; pic->height = bitstream->height; if (pic->use_argb) { stride = (uint64_t)bitstream->width * 4; } else { stride = (uint64_t)bitstream->width * (has_alpha ? 5 : 3) / 2; pic->colorspace = has_alpha ? WEBP_YUV420A : WEBP_YUV420; } if (!ImgIoUtilCheckSizeArgumentsOverflow(stride, bitstream->height)) { status = VP8_STATUS_OUT_OF_MEMORY; break; } ok = WebPPictureAlloc(pic); if (!ok) { status = VP8_STATUS_OUT_OF_MEMORY; break; } if (pic->use_argb) { #ifdef WORDS_BIGENDIAN output_buffer->colorspace = MODE_ARGB; #else output_buffer->colorspace = MODE_BGRA; #endif output_buffer->u.RGBA.rgba = (uint8_t*)pic->argb; output_buffer->u.RGBA.stride = pic->argb_stride * sizeof(uint32_t); output_buffer->u.RGBA.size = output_buffer->u.RGBA.stride * pic->height; } else { output_buffer->colorspace = has_alpha ? MODE_YUVA : MODE_YUV; output_buffer->u.YUVA.y = pic->y; output_buffer->u.YUVA.u = pic->u; output_buffer->u.YUVA.v = pic->v; output_buffer->u.YUVA.a = has_alpha ? pic->a : NULL; output_buffer->u.YUVA.y_stride = pic->y_stride; output_buffer->u.YUVA.u_stride = pic->uv_stride; output_buffer->u.YUVA.v_stride = pic->uv_stride; output_buffer->u.YUVA.a_stride = has_alpha ? pic->a_stride : 0; output_buffer->u.YUVA.y_size = pic->height * pic->y_stride; output_buffer->u.YUVA.u_size = (pic->height + 1) / 2 * pic->uv_stride; output_buffer->u.YUVA.v_size = (pic->height + 1) / 2 * pic->uv_stride; output_buffer->u.YUVA.a_size = pic->height * pic->a_stride; } output_buffer->is_external_memory = 1; status = DecodeWebP(data, data_size, &config); ok = (status == VP8_STATUS_OK); if (ok && !keep_alpha && pic->use_argb) { // Need to wipe out the alpha value, as requested. int x, y; uint32_t* argb = pic->argb; for (y = 0; y < pic->height; ++y) { for (x = 0; x < pic->width; ++x) argb[x] |= 0xff000000u; argb += pic->argb_stride; } } } while (0); // <- so we can 'break' out of the loop if (status != VP8_STATUS_OK) { PrintWebPError("input data", status); ok = 0; } WebPFreeDecBuffer(output_buffer); if (ok && metadata != NULL) { ok = ExtractMetadata(data, data_size, metadata); if (!ok) { PrintWebPError("metadata", VP8_STATUS_BITSTREAM_ERROR); } } if (!ok) WebPPictureFree(pic); return ok; } // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/pnmdec.c0000644000014400001440000002302214606317060013076 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // (limited) PNM decoder #include "./pnmdec.h" #include #include #include #include #include #include "webp/encode.h" #include "./imageio_util.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif typedef enum { WIDTH_FLAG = 1 << 0, HEIGHT_FLAG = 1 << 1, DEPTH_FLAG = 1 << 2, MAXVAL_FLAG = 1 << 3, TUPLE_FLAG = 1 << 4, ALL_NEEDED_FLAGS = WIDTH_FLAG | HEIGHT_FLAG | DEPTH_FLAG | MAXVAL_FLAG } PNMFlags; typedef struct { const uint8_t* data; size_t data_size; int width, height; int bytes_per_px; int depth; // 1 (grayscale), 2 (grayscale + alpha), 3 (rgb), 4 (rgba) int max_value; int type; // 5, 6 or 7 int seen_flags; } PNMInfo; // ----------------------------------------------------------------------------- // PNM decoding #define MAX_LINE_SIZE 1024 static const size_t kMinPNMHeaderSize = 3; static size_t ReadLine(const uint8_t* const data, size_t off, size_t data_size, char out[MAX_LINE_SIZE + 1], size_t* const out_size) { size_t i = 0; *out_size = 0; redo: for (i = 0; i < MAX_LINE_SIZE && off < data_size; ++i) { out[i] = data[off++]; if (out[i] == '\n') break; } if (off < data_size) { if (i == 0) goto redo; // empty line if (out[0] == '#') goto redo; // skip comment } out[i] = 0; // safety sentinel *out_size = i; return off; } static size_t FlagError(const char flag[]) { fprintf(stderr, "PAM header error: flags '%s' already seen.\n", flag); return 0; } // inspired from http://netpbm.sourceforge.net/doc/pam.html static size_t ReadPAMFields(PNMInfo* const info, size_t off) { char out[MAX_LINE_SIZE + 1]; size_t out_size; int tmp; int expected_depth = -1; assert(info != NULL); while (1) { off = ReadLine(info->data, off, info->data_size, out, &out_size); if (off == 0) return 0; if (sscanf(out, "WIDTH %d", &tmp) == 1) { if (info->seen_flags & WIDTH_FLAG) return FlagError("WIDTH"); info->seen_flags |= WIDTH_FLAG; info->width = tmp; } else if (sscanf(out, "HEIGHT %d", &tmp) == 1) { if (info->seen_flags & HEIGHT_FLAG) return FlagError("HEIGHT"); info->seen_flags |= HEIGHT_FLAG; info->height = tmp; } else if (sscanf(out, "DEPTH %d", &tmp) == 1) { if (info->seen_flags & DEPTH_FLAG) return FlagError("DEPTH"); info->seen_flags |= DEPTH_FLAG; info->depth = tmp; } else if (sscanf(out, "MAXVAL %d", &tmp) == 1) { if (info->seen_flags & MAXVAL_FLAG) return FlagError("MAXVAL"); info->seen_flags |= MAXVAL_FLAG; info->max_value = tmp; } else if (!strcmp(out, "TUPLTYPE RGB_ALPHA")) { expected_depth = 4; info->seen_flags |= TUPLE_FLAG; } else if (!strcmp(out, "TUPLTYPE RGB")) { expected_depth = 3; info->seen_flags |= TUPLE_FLAG; } else if (!strcmp(out, "TUPLTYPE GRAYSCALE_ALPHA")) { expected_depth = 2; info->seen_flags |= TUPLE_FLAG; } else if (!strcmp(out, "TUPLTYPE GRAYSCALE")) { expected_depth = 1; info->seen_flags |= TUPLE_FLAG; } else if (!strcmp(out, "ENDHDR")) { break; } else { static const char kEllipsis[] = " ..."; const size_t kLen = strlen(kEllipsis) + 1; // +1 = trailing \0 int i; if (out_size > 20) snprintf(out + 20 - kLen, kLen, kEllipsis); for (i = 0; i < (int)strlen(out); ++i) { // isprint() might trigger a "char-subscripts" warning if given a char. if (!isprint((int)out[i])) out[i] = ' '; } fprintf(stderr, "PAM header error: unrecognized entry [%s]\n", out); return 0; } } if (!(info->seen_flags & ALL_NEEDED_FLAGS)) { fprintf(stderr, "PAM header error: missing tags%s%s%s%s\n", (info->seen_flags & WIDTH_FLAG) ? "" : " WIDTH", (info->seen_flags & HEIGHT_FLAG) ? "" : " HEIGHT", (info->seen_flags & DEPTH_FLAG) ? "" : " DEPTH", (info->seen_flags & MAXVAL_FLAG) ? "" : " MAXVAL"); return 0; } if (expected_depth != -1 && info->depth != expected_depth) { fprintf(stderr, "PAM header error: expected DEPTH %d but got DEPTH %d\n", expected_depth, info->depth); return 0; } return off; } static size_t ReadHeader(PNMInfo* const info) { size_t off = 0; char out[MAX_LINE_SIZE + 1]; size_t out_size; if (info == NULL) return 0; if (info->data == NULL || info->data_size < kMinPNMHeaderSize) return 0; info->width = info->height = 0; info->type = -1; info->seen_flags = 0; info->bytes_per_px = 0; info->depth = 0; info->max_value = 0; off = ReadLine(info->data, off, info->data_size, out, &out_size); if (off == 0 || sscanf(out, "P%d", &info->type) != 1) return 0; if (info->type == 7) { off = ReadPAMFields(info, off); } else { off = ReadLine(info->data, off, info->data_size, out, &out_size); if (off == 0 || sscanf(out, "%d %d", &info->width, &info->height) != 2) { return 0; } off = ReadLine(info->data, off, info->data_size, out, &out_size); if (off == 0 || sscanf(out, "%d", &info->max_value) != 1) return 0; // finish initializing missing fields info->depth = (info->type == 5) ? 1 : 3; } // perform some basic numerical validation if (info->width <= 0 || info->height <= 0 || info->type <= 0 || info->type >= 9 || info->depth <= 0 || info->depth > 4 || info->max_value <= 0 || info->max_value >= 65536) { return 0; } info->bytes_per_px = info->depth * (info->max_value > 255 ? 2 : 1); return off; } int ReadPNM(const uint8_t* const data, size_t data_size, WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { int ok = 0; int i, j; uint64_t stride, pixel_bytes, sample_size, depth; uint8_t* rgb = NULL, *tmp_rgb; size_t offset; PNMInfo info; info.data = data; info.data_size = data_size; offset = ReadHeader(&info); if (offset == 0) { fprintf(stderr, "Error parsing PNM header.\n"); goto End; } if (info.type < 5 || info.type > 7) { fprintf(stderr, "Unsupported P%d PNM format.\n", info.type); goto End; } // Some basic validations. if (pic == NULL) goto End; if (info.width > WEBP_MAX_DIMENSION || info.height > WEBP_MAX_DIMENSION) { fprintf(stderr, "Invalid %dx%d dimension for PNM\n", info.width, info.height); goto End; } pixel_bytes = (uint64_t)info.width * info.height * info.bytes_per_px; if (data_size < offset + pixel_bytes) { fprintf(stderr, "Truncated PNM file (P%d).\n", info.type); goto End; } sample_size = (info.max_value > 255) ? 2 : 1; // final depth depth = (info.depth == 1 || info.depth == 3 || !keep_alpha) ? 3 : 4; stride = depth * info.width; if (stride != (size_t)stride || !ImgIoUtilCheckSizeArgumentsOverflow(stride, info.height)) { goto End; } rgb = (uint8_t*)malloc((size_t)stride * info.height); if (rgb == NULL) goto End; // Convert input. // We only optimize for the sample_size=1, max_value=255, depth=1 case. tmp_rgb = rgb; for (j = 0; j < info.height; ++j) { const uint8_t* in = data + offset; offset += info.bytes_per_px * info.width; assert(offset <= data_size); if (info.max_value == 255 && info.depth >= 3) { // RGB or RGBA if (info.depth == 3 || keep_alpha) { memcpy(tmp_rgb, in, info.depth * info.width * sizeof(*in)); } else { assert(info.depth == 4 && !keep_alpha); for (i = 0; i < info.width; ++i) { tmp_rgb[3 * i + 0] = in[4 * i + 0]; tmp_rgb[3 * i + 1] = in[4 * i + 1]; tmp_rgb[3 * i + 2] = in[4 * i + 2]; } } } else { // Unoptimized case, we need to handle non-trivial operations: // * convert 16b to 8b (if max_value > 255) // * rescale to [0..255] range (if max_value != 255) // * drop the alpha channel (if keep_alpha is false) const uint32_t round = info.max_value / 2; int k = 0; for (i = 0; i < info.width * info.depth; ++i) { uint32_t v = (sample_size == 2) ? 256u * in[2 * i + 0] + in[2 * i + 1] : in[i]; if (info.max_value != 255) v = (v * 255u + round) / info.max_value; if (v > 255u) v = 255u; if (info.depth > 2) { if (!keep_alpha && info.depth == 4 && (i % 4) == 3) { // skip alpha } else { tmp_rgb[k] = v; k += 1; } } else if (info.depth == 1 || (i % 2) == 0) { tmp_rgb[k + 0] = tmp_rgb[k + 1] = tmp_rgb[k + 2] = v; k += 3; } else if (keep_alpha && info.depth == 2) { tmp_rgb[k] = v; k += 1; } else { // skip alpha } } } tmp_rgb += stride; } // WebP conversion. pic->width = info.width; pic->height = info.height; ok = (depth == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride) : WebPPictureImportRGB(pic, rgb, (int)stride); if (!ok) goto End; ok = 1; End: free((void*)rgb); (void)metadata; (void)keep_alpha; return ok; } // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/webpdec.h0000644000014400001440000000477114606317060013260 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP decode. #ifndef WEBP_IMAGEIO_WEBPDEC_H_ #define WEBP_IMAGEIO_WEBPDEC_H_ #include "webp/decode.h" #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; //------------------------------------------------------------------------------ // WebP decoding // Prints an informative error message regarding decode failure of 'in_file'. // 'status' is treated as a VP8StatusCode and if valid will be printed as a // text string. void PrintWebPError(const char* const in_file, int status); // Reads a WebP from 'in_file', returning the contents and size in 'data' and // 'data_size'. If not NULL, 'bitstream' is populated using WebPGetFeatures(). // Returns true on success. int LoadWebP(const char* const in_file, const uint8_t** data, size_t* data_size, WebPBitstreamFeatures* bitstream); // Decodes the WebP contained in 'data'. // 'config' is a structure previously initialized by WebPInitDecoderConfig(). // 'config->output' should have the desired colorspace selected. // Returns the decoder status. On success 'config->output' will contain the // decoded picture. VP8StatusCode DecodeWebP(const uint8_t* const data, size_t data_size, WebPDecoderConfig* const config); // Same as DecodeWebP(), but using the incremental decoder. VP8StatusCode DecodeWebPIncremental( const uint8_t* const data, size_t data_size, WebPDecoderConfig* const config); //------------------------------------------------------------------------------ // Decodes a WebP contained in 'data', returning the decoded output in 'pic'. // Output is RGBA or YUVA, depending on pic->use_argb value. // If 'keep_alpha' is true and the WebP has an alpha channel, the output is RGBA // or YUVA. Otherwise, alpha channel is dropped and output is RGB or YUV. // Returns true on success. int ReadWebP(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_WEBPDEC_H_ libwebp-1.4.0/imageio/wicdec.h0000644000014400001440000000221014606317060013067 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Windows Imaging Component (WIC) decode. #ifndef WEBP_IMAGEIO_WICDEC_H_ #define WEBP_IMAGEIO_WICDEC_H_ #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; // Reads an image from 'filename', returning the decoded output in 'pic'. // If 'keep_alpha' is true and the image has an alpha channel, the output is // RGBA otherwise it will be RGB. pic->use_argb is always forced to true. // Returns true on success. int ReadPictureWithWIC(const char* const filename, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_WICDEC_H_ libwebp-1.4.0/imageio/wicdec.c0000644000014400001440000003642114606317060013075 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Windows Imaging Component (WIC) decode. #include "./wicdec.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include #include #include #ifdef HAVE_WINCODEC_H #ifdef __MINGW32__ #define INITGUID // Without this GUIDs are declared extern and fail to link #endif #define CINTERFACE #define COBJMACROS #define _WIN32_IE 0x500 // Workaround bug in shlwapi.h when compiling C++ // code with COBJMACROS. #include // CreateStreamOnHGlobal() #include #include #include #include #include "../examples/unicode.h" #include "./imageio_util.h" #include "./metadata.h" #include "webp/encode.h" #define IFS(fn) \ do { \ if (SUCCEEDED(hr)) { \ hr = (fn); \ if (FAILED(hr)) fprintf(stderr, #fn " failed %08lx\n", hr); \ } \ } while (0) // modified version of DEFINE_GUID from guiddef.h. #define WEBP_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ static const GUID name = \ { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #ifdef __cplusplus #define MAKE_REFGUID(x) (x) #else #define MAKE_REFGUID(x) &(x) #endif typedef struct WICFormatImporter { const GUID* pixel_format; int bytes_per_pixel; int (*import)(WebPPicture* const, const uint8_t* const, int); } WICFormatImporter; // From Microsoft SDK 7.0a -- wincodec.h // Create local copies for compatibility when building against earlier // versions of the SDK. WEBP_DEFINE_GUID(GUID_WICPixelFormat24bppBGR_, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c); WEBP_DEFINE_GUID(GUID_WICPixelFormat24bppRGB_, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0d); WEBP_DEFINE_GUID(GUID_WICPixelFormat32bppBGRA_, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f); WEBP_DEFINE_GUID(GUID_WICPixelFormat32bppRGBA_, 0xf5c7ad2d, 0x6a8d, 0x43dd, 0xa7, 0xa8, 0xa2, 0x99, 0x35, 0x26, 0x1a, 0xe9); WEBP_DEFINE_GUID(GUID_WICPixelFormat64bppBGRA_, 0x1562ff7c, 0xd352, 0x46f9, 0x97, 0x9e, 0x42, 0x97, 0x6b, 0x79, 0x22, 0x46); WEBP_DEFINE_GUID(GUID_WICPixelFormat64bppRGBA_, 0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x16); static HRESULT OpenInputStream(const char* filename, IStream** stream) { HRESULT hr = S_OK; if (!WSTRCMP(filename, "-")) { const uint8_t* data = NULL; size_t data_size = 0; const int ok = ImgIoUtilReadFile(filename, &data, &data_size); if (ok) { HGLOBAL image = GlobalAlloc(GMEM_MOVEABLE, data_size); if (image != NULL) { void* const image_mem = GlobalLock(image); if (image_mem != NULL) { memcpy(image_mem, data, data_size); GlobalUnlock(image); IFS(CreateStreamOnHGlobal(image, TRUE, stream)); } else { hr = E_FAIL; } } else { hr = E_OUTOFMEMORY; } free((void*)data); } else { hr = E_FAIL; } } else { IFS(SHCreateStreamOnFile((const LPTSTR)filename, STGM_READ, stream)); } if (FAILED(hr)) { _ftprintf(stderr, _T("Error opening input file %s (%08lx)\n"), (const LPTSTR)filename, hr); } return hr; } // ----------------------------------------------------------------------------- // Metadata processing // Stores the first non-zero sized color profile from 'frame' to 'iccp'. // Returns an HRESULT to indicate success or failure. The caller is responsible // for freeing 'iccp->bytes' in either case. static HRESULT ExtractICCP(IWICImagingFactory* const factory, IWICBitmapFrameDecode* const frame, MetadataPayload* const iccp) { HRESULT hr = S_OK; UINT i, count; IWICColorContext** color_contexts; IFS(IWICBitmapFrameDecode_GetColorContexts(frame, 0, NULL, &count)); if (FAILED(hr) || count == 0) { // Treat unsupported operation as a non-fatal error. See crbug.com/webp/506. return (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION) ? S_OK : hr; } color_contexts = (IWICColorContext**)calloc(count, sizeof(*color_contexts)); if (color_contexts == NULL) return E_OUTOFMEMORY; for (i = 0; SUCCEEDED(hr) && i < count; ++i) { IFS(IWICImagingFactory_CreateColorContext(factory, &color_contexts[i])); } if (SUCCEEDED(hr)) { UINT num_color_contexts; IFS(IWICBitmapFrameDecode_GetColorContexts(frame, count, color_contexts, &num_color_contexts)); assert(FAILED(hr) || num_color_contexts <= count); for (i = 0; SUCCEEDED(hr) && i < num_color_contexts; ++i) { WICColorContextType type; IFS(IWICColorContext_GetType(color_contexts[i], &type)); if (SUCCEEDED(hr) && type == WICColorContextProfile) { UINT size; IFS(IWICColorContext_GetProfileBytes(color_contexts[i], 0, NULL, &size)); if (SUCCEEDED(hr) && size > 0) { iccp->bytes = (uint8_t*)malloc(size); if (iccp->bytes == NULL) { hr = E_OUTOFMEMORY; break; } iccp->size = size; IFS(IWICColorContext_GetProfileBytes(color_contexts[i], (UINT)iccp->size, iccp->bytes, &size)); if (SUCCEEDED(hr) && size != iccp->size) { fprintf(stderr, "Warning! ICC profile size (%u) != expected (%u)\n", size, (uint32_t)iccp->size); iccp->size = size; } break; } } } } for (i = 0; i < count; ++i) { if (color_contexts[i] != NULL) IUnknown_Release(color_contexts[i]); } free(color_contexts); return hr; } static HRESULT ExtractMetadata(IWICImagingFactory* const factory, IWICBitmapFrameDecode* const frame, Metadata* const metadata) { // TODO(jzern): add XMP/EXIF extraction. const HRESULT hr = ExtractICCP(factory, frame, &metadata->iccp); if (FAILED(hr)) MetadataFree(metadata); return hr; } // ----------------------------------------------------------------------------- static int HasPalette(GUID pixel_format) { return (IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat1bppIndexed)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat2bppIndexed)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat4bppIndexed)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat8bppIndexed))); } static int HasAlpha(IWICImagingFactory* const factory, IWICBitmapDecoder* const decoder, IWICBitmapFrameDecode* const frame, GUID pixel_format) { int has_alpha; if (HasPalette(pixel_format)) { IWICPalette* frame_palette = NULL; IWICPalette* global_palette = NULL; BOOL frame_palette_has_alpha = FALSE; BOOL global_palette_has_alpha = FALSE; // A palette may exist at the frame or container level, // check IWICPalette::HasAlpha() for both if present. if (SUCCEEDED(IWICImagingFactory_CreatePalette(factory, &frame_palette)) && SUCCEEDED(IWICBitmapFrameDecode_CopyPalette(frame, frame_palette))) { IWICPalette_HasAlpha(frame_palette, &frame_palette_has_alpha); } if (SUCCEEDED(IWICImagingFactory_CreatePalette(factory, &global_palette)) && SUCCEEDED(IWICBitmapDecoder_CopyPalette(decoder, global_palette))) { IWICPalette_HasAlpha(global_palette, &global_palette_has_alpha); } has_alpha = frame_palette_has_alpha || global_palette_has_alpha; if (frame_palette != NULL) IUnknown_Release(frame_palette); if (global_palette != NULL) IUnknown_Release(global_palette); } else { has_alpha = IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat32bppRGBA_)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat32bppBGRA_)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat64bppRGBA_)) || IsEqualGUID(MAKE_REFGUID(pixel_format), MAKE_REFGUID(GUID_WICPixelFormat64bppBGRA_)); } return has_alpha; } int ReadPictureWithWIC(const char* const filename, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { // From Microsoft SDK 6.0a -- ks.h // Define a local copy to avoid link errors under mingw. WEBP_DEFINE_GUID(GUID_NULL_, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); static const WICFormatImporter kAlphaFormatImporters[] = { { &GUID_WICPixelFormat32bppBGRA_, 4, WebPPictureImportBGRA }, { &GUID_WICPixelFormat32bppRGBA_, 4, WebPPictureImportRGBA }, { NULL, 0, NULL }, }; static const WICFormatImporter kNonAlphaFormatImporters[] = { { &GUID_WICPixelFormat24bppBGR_, 3, WebPPictureImportBGR }, { &GUID_WICPixelFormat24bppRGB_, 3, WebPPictureImportRGB }, { NULL, 0, NULL }, }; HRESULT hr = S_OK; IWICBitmapFrameDecode* frame = NULL; IWICFormatConverter* converter = NULL; IWICImagingFactory* factory = NULL; IWICBitmapDecoder* decoder = NULL; IStream* stream = NULL; UINT frame_count = 0; UINT width = 0, height = 0; BYTE* rgb = NULL; WICPixelFormatGUID src_pixel_format = GUID_WICPixelFormatUndefined; const WICFormatImporter* importer = NULL; GUID src_container_format = GUID_NULL_; // From Windows Kits\10\Include\10.0.19041.0\um\wincodec.h WEBP_DEFINE_GUID(GUID_ContainerFormatWebp_, 0xe094b0e2, 0x67f2, 0x45b3, 0xb0, 0xea, 0x11, 0x53, 0x37, 0xca, 0x7c, 0xf3); static const GUID* kAlphaContainers[] = { &GUID_ContainerFormatBmp, &GUID_ContainerFormatPng, &GUID_ContainerFormatTiff, &GUID_ContainerFormatWebp_, NULL }; int has_alpha = 0; int64_t stride; if (filename == NULL || pic == NULL) return 0; IFS(CoInitialize(NULL)); IFS(CoCreateInstance(MAKE_REFGUID(CLSID_WICImagingFactory), NULL, CLSCTX_INPROC_SERVER, MAKE_REFGUID(IID_IWICImagingFactory), (LPVOID*)&factory)); if (hr == REGDB_E_CLASSNOTREG) { fprintf(stderr, "Couldn't access Windows Imaging Component (are you running " "Windows XP SP3 or newer?). Most formats not available. " "Use -s for the available YUV input.\n"); } // Prepare for image decoding. IFS(OpenInputStream(filename, &stream)); IFS(IWICImagingFactory_CreateDecoderFromStream( factory, stream, NULL, WICDecodeMetadataCacheOnDemand, &decoder)); IFS(IWICBitmapDecoder_GetFrameCount(decoder, &frame_count)); if (SUCCEEDED(hr)) { if (frame_count == 0) { fprintf(stderr, "No frame found in input file.\n"); hr = E_FAIL; } else if (frame_count > 1) { // WIC will be tried before native WebP decoding so avoid duplicating the // error message. hr = E_FAIL; } } IFS(IWICBitmapDecoder_GetFrame(decoder, 0, &frame)); IFS(IWICBitmapFrameDecode_GetPixelFormat(frame, &src_pixel_format)); IFS(IWICBitmapDecoder_GetContainerFormat(decoder, &src_container_format)); if (SUCCEEDED(hr) && keep_alpha) { const GUID** guid; for (guid = kAlphaContainers; *guid != NULL; ++guid) { if (IsEqualGUID(MAKE_REFGUID(src_container_format), MAKE_REFGUID(**guid))) { has_alpha = HasAlpha(factory, decoder, frame, src_pixel_format); break; } } } // Prepare for pixel format conversion (if necessary). IFS(IWICImagingFactory_CreateFormatConverter(factory, &converter)); for (importer = has_alpha ? kAlphaFormatImporters : kNonAlphaFormatImporters; hr == S_OK && importer->import != NULL; ++importer) { BOOL can_convert; const HRESULT cchr = IWICFormatConverter_CanConvert( converter, MAKE_REFGUID(src_pixel_format), MAKE_REFGUID(*importer->pixel_format), &can_convert); if (SUCCEEDED(cchr) && can_convert) break; } if (importer->import == NULL) hr = E_FAIL; IFS(IWICFormatConverter_Initialize(converter, (IWICBitmapSource*)frame, importer->pixel_format, WICBitmapDitherTypeNone, NULL, 0.0, WICBitmapPaletteTypeCustom)); // Decode. IFS(IWICFormatConverter_GetSize(converter, &width, &height)); stride = (int64_t)importer->bytes_per_pixel * width * sizeof(*rgb); if (stride != (int)stride || !ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) { hr = E_FAIL; } if (SUCCEEDED(hr)) { rgb = (BYTE*)malloc((size_t)stride * height); if (rgb == NULL) hr = E_OUTOFMEMORY; } IFS(IWICFormatConverter_CopyPixels(converter, NULL, (UINT)stride, (UINT)stride * height, rgb)); // WebP conversion. if (SUCCEEDED(hr)) { int ok; pic->width = width; pic->height = height; pic->use_argb = 1; // For WIC, we always force to argb ok = importer->import(pic, rgb, (int)stride); if (!ok) hr = E_FAIL; } if (SUCCEEDED(hr)) { if (metadata != NULL) { hr = ExtractMetadata(factory, frame, metadata); if (FAILED(hr)) { fprintf(stderr, "Error extracting image metadata using WIC!\n"); } } } // Cleanup. if (converter != NULL) IUnknown_Release(converter); if (frame != NULL) IUnknown_Release(frame); if (decoder != NULL) IUnknown_Release(decoder); if (factory != NULL) IUnknown_Release(factory); if (stream != NULL) IUnknown_Release(stream); free(rgb); return SUCCEEDED(hr); } #else // !HAVE_WINCODEC_H int ReadPictureWithWIC(const char* const filename, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { (void)filename; (void)pic; (void)keep_alpha; (void)metadata; fprintf(stderr, "Windows Imaging Component (WIC) support not compiled. " "Visual Studio and mingw-w64 builds support WIC. Make sure " "wincodec.h detection is working correctly if using autoconf " "and HAVE_WINCODEC_H is defined before building.\n"); return 0; } #endif // HAVE_WINCODEC_H // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/pngdec.c0000644000014400001440000002646114606317060013102 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // PNG decode. #include "./pngdec.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include #ifdef WEBP_HAVE_PNG #ifndef PNG_USER_MEM_SUPPORTED #define PNG_USER_MEM_SUPPORTED // for png_create_read_struct_2 #endif #include #include // note: this must be included *after* png.h #include #include #include "webp/encode.h" #include "./imageio_util.h" #include "./metadata.h" #define LOCAL_PNG_VERSION ((PNG_LIBPNG_VER_MAJOR << 8) | PNG_LIBPNG_VER_MINOR) #define LOCAL_PNG_PREREQ(maj, min) \ (LOCAL_PNG_VERSION >= (((maj) << 8) | (min))) static void PNGAPI error_function(png_structp png, png_const_charp error) { if (error != NULL) fprintf(stderr, "libpng error: %s\n", error); longjmp(png_jmpbuf(png), 1); } #if LOCAL_PNG_PREREQ(1,4) typedef png_alloc_size_t LocalPngAllocSize; #else typedef png_size_t LocalPngAllocSize; #endif static png_voidp MallocFunc(png_structp png_ptr, LocalPngAllocSize size) { (void)png_ptr; if (size != (size_t)size) return NULL; if (!ImgIoUtilCheckSizeArgumentsOverflow(size, 1)) return NULL; return (png_voidp)malloc((size_t)size); } static void FreeFunc(png_structp png_ptr, png_voidp ptr) { (void)png_ptr; free(ptr); } // Converts the NULL terminated 'hexstring' which contains 2-byte character // representations of hex values to raw data. // 'hexstring' may contain values consisting of [A-F][a-f][0-9] in pairs, // e.g., 7af2..., separated by any number of newlines. // 'expected_length' is the anticipated processed size. // On success the raw buffer is returned with its length equivalent to // 'expected_length'. NULL is returned if the processed length is less than // 'expected_length' or any character aside from those above is encountered. // The returned buffer must be freed by the caller. static uint8_t* HexStringToBytes(const char* hexstring, size_t expected_length) { const char* src = hexstring; size_t actual_length = 0; uint8_t* const raw_data = (uint8_t*)malloc(expected_length); uint8_t* dst; if (raw_data == NULL) return NULL; for (dst = raw_data; actual_length < expected_length && *src != '\0'; ++src) { char* end; char val[3]; if (*src == '\n') continue; val[0] = *src++; val[1] = *src; val[2] = '\0'; *dst++ = (uint8_t)strtol(val, &end, 16); if (end != val + 2) break; ++actual_length; } if (actual_length != expected_length) { free(raw_data); return NULL; } return raw_data; } static int ProcessRawProfile(const char* profile, size_t profile_len, MetadataPayload* const payload) { const char* src = profile; char* end; int expected_length; if (profile == NULL || profile_len == 0) return 0; // ImageMagick formats 'raw profiles' as // '\n\n(%8lu)\n\n'. if (*src != '\n') { fprintf(stderr, "Malformed raw profile, expected '\\n' got '\\x%.2X'\n", *src); return 0; } ++src; // skip the profile name and extract the length. while (*src != '\0' && *src++ != '\n') {} expected_length = (int)strtol(src, &end, 10); if (*end != '\n') { fprintf(stderr, "Malformed raw profile, expected '\\n' got '\\x%.2X'\n", *end); return 0; } ++end; // 'end' now points to the profile payload. payload->bytes = HexStringToBytes(end, expected_length); if (payload->bytes == NULL) return 0; payload->size = expected_length; return 1; } static const struct { const char* name; int (*process)(const char* profile, size_t profile_len, MetadataPayload* const payload); size_t storage_offset; } kPNGMetadataMap[] = { // https://exiftool.org/TagNames/PNG.html#TextualData // See also: ExifTool on CPAN. { "Raw profile type exif", ProcessRawProfile, METADATA_OFFSET(exif) }, { "Raw profile type xmp", ProcessRawProfile, METADATA_OFFSET(xmp) }, // Exiftool puts exif data in APP1 chunk, too. { "Raw profile type APP1", ProcessRawProfile, METADATA_OFFSET(exif) }, // XMP Specification Part 3, Section 3 #PNG { "XML:com.adobe.xmp", MetadataCopy, METADATA_OFFSET(xmp) }, { NULL, NULL, 0 }, }; // Looks for metadata at both the beginning and end of the PNG file, giving // preference to the head. // Returns true on success. The caller must use MetadataFree() on 'metadata' in // all cases. static int ExtractMetadataFromPNG(png_structp png, png_infop const head_info, png_infop const end_info, Metadata* const metadata) { int p; for (p = 0; p < 2; ++p) { png_infop const info = (p == 0) ? head_info : end_info; png_textp text = NULL; const png_uint_32 num = png_get_text(png, info, &text, NULL); png_uint_32 i; // Look for EXIF / XMP metadata. for (i = 0; i < num; ++i, ++text) { int j; for (j = 0; kPNGMetadataMap[j].name != NULL; ++j) { if (!strcmp(text->key, kPNGMetadataMap[j].name)) { MetadataPayload* const payload = (MetadataPayload*)((uint8_t*)metadata + kPNGMetadataMap[j].storage_offset); png_size_t text_length; switch (text->compression) { #ifdef PNG_iTXt_SUPPORTED case PNG_ITXT_COMPRESSION_NONE: case PNG_ITXT_COMPRESSION_zTXt: text_length = text->itxt_length; break; #endif case PNG_TEXT_COMPRESSION_NONE: case PNG_TEXT_COMPRESSION_zTXt: default: text_length = text->text_length; break; } if (payload->bytes != NULL) { fprintf(stderr, "Ignoring additional '%s'\n", text->key); } else if (!kPNGMetadataMap[j].process(text->text, text_length, payload)) { fprintf(stderr, "Failed to process: '%s'\n", text->key); return 0; } break; } } } // Look for an ICC profile. { png_charp name; int comp_type; #if LOCAL_PNG_PREREQ(1,5) png_bytep profile; #else png_charp profile; #endif png_uint_32 len; if (png_get_iCCP(png, info, &name, &comp_type, &profile, &len) == PNG_INFO_iCCP) { if (!MetadataCopy((const char*)profile, len, &metadata->iccp)) return 0; } } } return 1; } typedef struct { const uint8_t* data; size_t data_size; png_size_t offset; } PNGReadContext; static void ReadFunc(png_structp png_ptr, png_bytep data, png_size_t length) { PNGReadContext* const ctx = (PNGReadContext*)png_get_io_ptr(png_ptr); if (ctx->data_size - ctx->offset < length) { png_error(png_ptr, "ReadFunc: invalid read length (overflow)!"); } memcpy(data, ctx->data + ctx->offset, length); ctx->offset += length; } int ReadPNG(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { volatile png_structp png = NULL; volatile png_infop info = NULL; volatile png_infop end_info = NULL; PNGReadContext context = { NULL, 0, 0 }; int color_type, bit_depth, interlaced; int num_channels; int num_passes; int p; volatile int ok = 0; png_uint_32 width, height, y; int64_t stride; uint8_t* volatile rgb = NULL; if (data == NULL || data_size == 0 || pic == NULL) return 0; context.data = data; context.data_size = data_size; png = png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL, NULL, MallocFunc, FreeFunc); if (png == NULL) goto End; png_set_error_fn(png, 0, error_function, NULL); if (setjmp(png_jmpbuf(png))) { Error: MetadataFree(metadata); goto End; } #if LOCAL_PNG_PREREQ(1,5) || \ (LOCAL_PNG_PREREQ(1,4) && PNG_LIBPNG_VER_RELEASE >= 1) // If it looks like the bitstream is going to need more memory than libpng's // internal limit (default: 8M), try to (reasonably) raise it. if (data_size > png_get_chunk_malloc_max(png) && data_size < (1u << 24)) { png_set_chunk_malloc_max(png, data_size); } #endif info = png_create_info_struct(png); if (info == NULL) goto Error; end_info = png_create_info_struct(png); if (end_info == NULL) goto Error; png_set_read_fn(png, &context, ReadFunc); png_read_info(png, info); if (!png_get_IHDR(png, info, &width, &height, &bit_depth, &color_type, &interlaced, NULL, NULL)) goto Error; png_set_strip_16(png); png_set_packing(png); if (color_type == PNG_COLOR_TYPE_PALETTE) { png_set_palette_to_rgb(png); } if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (bit_depth < 8) { png_set_expand_gray_1_2_4_to_8(png); } png_set_gray_to_rgb(png); } if (png_get_valid(png, info, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png); } // Apply gamma correction if needed. { double image_gamma = 1 / 2.2, screen_gamma = 2.2; int srgb_intent; if (png_get_sRGB(png, info, &srgb_intent) || png_get_gAMA(png, info, &image_gamma)) { png_set_gamma(png, screen_gamma, image_gamma); } } if (!keep_alpha) { png_set_strip_alpha(png); } num_passes = png_set_interlace_handling(png); png_read_update_info(png, info); num_channels = png_get_channels(png, info); if (num_channels != 3 && num_channels != 4) { goto Error; } stride = (int64_t)num_channels * width * sizeof(*rgb); if (stride != (int)stride || !ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) { goto Error; } rgb = (uint8_t*)malloc((size_t)stride * height); if (rgb == NULL) goto Error; for (p = 0; p < num_passes; ++p) { png_bytep row = rgb; for (y = 0; y < height; ++y) { png_read_rows(png, &row, NULL, 1); row += stride; } } png_read_end(png, end_info); if (metadata != NULL && !ExtractMetadataFromPNG(png, info, end_info, metadata)) { fprintf(stderr, "Error extracting PNG metadata!\n"); goto Error; } pic->width = (int)width; pic->height = (int)height; ok = (num_channels == 4) ? WebPPictureImportRGBA(pic, rgb, (int)stride) : WebPPictureImportRGB(pic, rgb, (int)stride); if (!ok) { goto Error; } End: if (png != NULL) { png_destroy_read_struct((png_structpp)&png, (png_infopp)&info, (png_infopp)&end_info); } free(rgb); return ok; } #else // !WEBP_HAVE_PNG int ReadPNG(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { (void)data; (void)data_size; (void)pic; (void)keep_alpha; (void)metadata; fprintf(stderr, "PNG support not compiled. Please install the libpng " "development package before building.\n"); return 0; } #endif // WEBP_HAVE_PNG // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/image_dec.c0000644000014400001440000000523514606317060013533 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Generic image-type guessing. #include "./image_dec.h" const char* WebPGetEnabledInputFileFormats(void) { return "WebP" #ifdef WEBP_HAVE_JPEG ", JPEG" #endif #ifdef WEBP_HAVE_PNG ", PNG" #endif ", PNM (PGM, PPM, PAM)" #ifdef WEBP_HAVE_TIFF ", TIFF" #endif #ifdef HAVE_WINCODEC_H ", Windows Imaging Component (WIC)" #endif ""; } static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) { return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; } WebPInputFileFormat WebPGuessImageType(const uint8_t* const data, size_t data_size) { WebPInputFileFormat format = WEBP_UNSUPPORTED_FORMAT; if (data != NULL && data_size >= 12) { const uint32_t magic1 = GetBE32(data + 0); const uint32_t magic2 = GetBE32(data + 8); if (magic1 == 0x89504E47U) { format = WEBP_PNG_FORMAT; } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) { format = WEBP_JPEG_FORMAT; } else if (magic1 == 0x49492A00 || magic1 == 0x4D4D002A) { format = WEBP_TIFF_FORMAT; } else if (magic1 == 0x52494646 && magic2 == 0x57454250) { format = WEBP_WEBP_FORMAT; } else if (((magic1 >> 24) & 0xff) == 'P') { const int type = (magic1 >> 16) & 0xff; // we only support 'P5 -> P7' for now. if (type >= '5' && type <= '7') format = WEBP_PNM_FORMAT; } } return format; } static int FailReader(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { (void)data; (void)data_size; (void)pic; (void)keep_alpha; (void)metadata; return 0; } WebPImageReader WebPGetImageReader(WebPInputFileFormat format) { switch (format) { case WEBP_PNG_FORMAT: return ReadPNG; case WEBP_JPEG_FORMAT: return ReadJPEG; case WEBP_TIFF_FORMAT: return ReadTIFF; case WEBP_WEBP_FORMAT: return ReadWebP; case WEBP_PNM_FORMAT: return ReadPNM; default: return FailReader; } } WebPImageReader WebPGuessImageReader(const uint8_t* const data, size_t data_size) { return WebPGetImageReader(WebPGuessImageType(data, data_size)); } libwebp-1.4.0/imageio/Makefile.am0000644000014400001440000000221214606317060013516 0ustar AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src noinst_LTLIBRARIES = noinst_LTLIBRARIES += libimageio_util.la if BUILD_DEMUX noinst_LTLIBRARIES += libimagedec.la endif noinst_LTLIBRARIES += libimageenc.la noinst_HEADERS = noinst_HEADERS += ../src/webp/decode.h noinst_HEADERS += ../src/webp/types.h libimageio_util_la_SOURCES = libimageio_util_la_SOURCES += imageio_util.c imageio_util.h libimagedec_la_SOURCES = libimagedec_la_SOURCES += image_dec.c image_dec.h libimagedec_la_SOURCES += jpegdec.c jpegdec.h libimagedec_la_SOURCES += metadata.c metadata.h libimagedec_la_SOURCES += pngdec.c pngdec.h libimagedec_la_SOURCES += pnmdec.c pnmdec.h libimagedec_la_SOURCES += tiffdec.c tiffdec.h libimagedec_la_SOURCES += webpdec.c webpdec.h libimagedec_la_SOURCES += wicdec.c wicdec.h libimagedec_la_CPPFLAGS = $(JPEG_INCLUDES) $(PNG_INCLUDES) $(TIFF_INCLUDES) libimagedec_la_CPPFLAGS += $(AM_CPPFLAGS) libimagedec_la_LIBADD = ../src/demux/libwebpdemux.la libimageenc_la_SOURCES = libimageenc_la_SOURCES += image_enc.c image_enc.h libimageenc_la_CPPFLAGS = $(JPEG_INCLUDES) $(PNG_INCLUDES) $(TIFF_INCLUDES) libimageenc_la_CPPFLAGS += $(AM_CPPFLAGS) libwebp-1.4.0/imageio/pnmdec.h0000644000014400001440000000222614606317060013106 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // partial PNM format decoder (ppm/pgm) #ifndef WEBP_IMAGEIO_PNMDEC_H_ #define WEBP_IMAGEIO_PNMDEC_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; // Reads a PNM file from 'data', returning the decoded output in 'pic'. // The output is RGB or YUV depending on pic->use_argb value. // Returns true on success. // 'metadata' has no effect, but is kept for coherence with other signatures // for image readers. int ReadPNM(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_PNMDEC_H_ libwebp-1.4.0/imageio/jpegdec.h0000644000014400001440000000220214606317060013233 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // JPEG decode. #ifndef WEBP_IMAGEIO_JPEGDEC_H_ #define WEBP_IMAGEIO_JPEGDEC_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; // Reads a JPEG from 'data', returning the decoded output in 'pic'. // The output is RGB or YUV depending on pic->use_argb value. // Returns true on success. // 'keep_alpha' has no effect, but is kept for coherence with other signatures // for image readers. int ReadJPEG(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_JPEGDEC_H_ libwebp-1.4.0/imageio/imageio_util.c0000644000014400001440000001150314606317060014300 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utility functions used by the image decoders. // #include "./imageio_util.h" #if defined(_WIN32) #include // for _O_BINARY #include // for _setmode() #endif #include #include #include "../examples/unicode.h" // ----------------------------------------------------------------------------- // File I/O FILE* ImgIoUtilSetBinaryMode(FILE* file) { #if defined(_WIN32) if (_setmode(_fileno(file), _O_BINARY) == -1) { fprintf(stderr, "Failed to reopen file in O_BINARY mode.\n"); return NULL; } #endif return file; } int ImgIoUtilReadFromStdin(const uint8_t** data, size_t* data_size) { static const size_t kBlockSize = 16384; // default initial size size_t max_size = 0; size_t size = 0; uint8_t* input = NULL; if (data == NULL || data_size == NULL) return 0; *data = NULL; *data_size = 0; if (!ImgIoUtilSetBinaryMode(stdin)) return 0; while (!feof(stdin)) { // We double the buffer size each time and read as much as possible. const size_t extra_size = (max_size == 0) ? kBlockSize : max_size; // we allocate one extra byte for the \0 terminator void* const new_data = realloc(input, max_size + extra_size + 1); if (new_data == NULL) goto Error; input = (uint8_t*)new_data; max_size += extra_size; size += fread(input + size, 1, extra_size, stdin); if (size < max_size) break; } if (ferror(stdin)) goto Error; if (input != NULL) input[size] = '\0'; // convenient 0-terminator *data = input; *data_size = size; return 1; Error: free(input); fprintf(stderr, "Could not read from stdin\n"); return 0; } int ImgIoUtilReadFile(const char* const file_name, const uint8_t** data, size_t* data_size) { int ok; uint8_t* file_data; size_t file_size; FILE* in; const int from_stdin = (file_name == NULL) || !WSTRCMP(file_name, "-"); if (from_stdin) return ImgIoUtilReadFromStdin(data, data_size); if (data == NULL || data_size == NULL) return 0; *data = NULL; *data_size = 0; in = WFOPEN(file_name, "rb"); if (in == NULL) { WFPRINTF(stderr, "cannot open input file '%s'\n", (const W_CHAR*)file_name); return 0; } fseek(in, 0, SEEK_END); file_size = ftell(in); fseek(in, 0, SEEK_SET); // we allocate one extra byte for the \0 terminator file_data = (uint8_t*)WebPMalloc(file_size + 1); if (file_data == NULL) { fclose(in); WFPRINTF(stderr, "memory allocation failure when reading file %s\n", (const W_CHAR*)file_name); return 0; } ok = (fread(file_data, file_size, 1, in) == 1); fclose(in); if (!ok) { WFPRINTF(stderr, "Could not read %d bytes of data from file %s\n", (int)file_size, (const W_CHAR*)file_name); WebPFree(file_data); return 0; } file_data[file_size] = '\0'; // convenient 0-terminator *data = file_data; *data_size = file_size; return 1; } // ----------------------------------------------------------------------------- int ImgIoUtilWriteFile(const char* const file_name, const uint8_t* data, size_t data_size) { int ok; FILE* out; const int to_stdout = (file_name == NULL) || !WSTRCMP(file_name, "-"); if (data == NULL) { return 0; } out = to_stdout ? ImgIoUtilSetBinaryMode(stdout) : WFOPEN(file_name, "wb"); if (out == NULL) { WFPRINTF(stderr, "Error! Cannot open output file '%s'\n", (const W_CHAR*)file_name); return 0; } ok = (fwrite(data, data_size, 1, out) == 1); if (out != stdout) fclose(out); return ok; } // ----------------------------------------------------------------------------- void ImgIoUtilCopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height) { while (height-- > 0) { memcpy(dst, src, width * sizeof(*dst)); src += src_stride; dst += dst_stride; } } // ----------------------------------------------------------------------------- int ImgIoUtilCheckSizeArgumentsOverflow(uint64_t stride, size_t height) { const uint64_t total_size = stride * height; int ok = (total_size == (size_t)total_size); // check that 'stride' is representable as int: ok = ok && ((uint64_t)(int)stride == stride); #if defined(WEBP_MAX_IMAGE_SIZE) ok = ok && (total_size <= (uint64_t)WEBP_MAX_IMAGE_SIZE); #endif return ok; } // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/Makefile.in0000644000014400001440000007746114606317244013555 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_DEMUX_TRUE@am__append_1 = libimagedec.la subdir = imageio ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libimagedec_la_DEPENDENCIES = ../src/demux/libwebpdemux.la am_libimagedec_la_OBJECTS = libimagedec_la-image_dec.lo \ libimagedec_la-jpegdec.lo libimagedec_la-metadata.lo \ libimagedec_la-pngdec.lo libimagedec_la-pnmdec.lo \ libimagedec_la-tiffdec.lo libimagedec_la-webpdec.lo \ libimagedec_la-wicdec.lo libimagedec_la_OBJECTS = $(am_libimagedec_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = @BUILD_DEMUX_TRUE@am_libimagedec_la_rpath = libimageenc_la_LIBADD = am_libimageenc_la_OBJECTS = libimageenc_la-image_enc.lo libimageenc_la_OBJECTS = $(am_libimageenc_la_OBJECTS) libimageio_util_la_LIBADD = am_libimageio_util_la_OBJECTS = imageio_util.lo libimageio_util_la_OBJECTS = $(am_libimageio_util_la_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/imageio_util.Plo \ ./$(DEPDIR)/libimagedec_la-image_dec.Plo \ ./$(DEPDIR)/libimagedec_la-jpegdec.Plo \ ./$(DEPDIR)/libimagedec_la-metadata.Plo \ ./$(DEPDIR)/libimagedec_la-pngdec.Plo \ ./$(DEPDIR)/libimagedec_la-pnmdec.Plo \ ./$(DEPDIR)/libimagedec_la-tiffdec.Plo \ ./$(DEPDIR)/libimagedec_la-webpdec.Plo \ ./$(DEPDIR)/libimagedec_la-wicdec.Plo \ ./$(DEPDIR)/libimageenc_la-image_enc.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libimagedec_la_SOURCES) $(libimageenc_la_SOURCES) \ $(libimageio_util_la_SOURCES) DIST_SOURCES = $(libimagedec_la_SOURCES) $(libimageenc_la_SOURCES) \ $(libimageio_util_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/src -I$(top_srcdir)/src AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libimageio_util.la $(am__append_1) libimageenc.la noinst_HEADERS = ../src/webp/decode.h ../src/webp/types.h libimageio_util_la_SOURCES = imageio_util.c imageio_util.h libimagedec_la_SOURCES = image_dec.c image_dec.h jpegdec.c jpegdec.h \ metadata.c metadata.h pngdec.c pngdec.h pnmdec.c pnmdec.h \ tiffdec.c tiffdec.h webpdec.c webpdec.h wicdec.c wicdec.h libimagedec_la_CPPFLAGS = $(JPEG_INCLUDES) $(PNG_INCLUDES) \ $(TIFF_INCLUDES) $(AM_CPPFLAGS) libimagedec_la_LIBADD = ../src/demux/libwebpdemux.la libimageenc_la_SOURCES = image_enc.c image_enc.h libimageenc_la_CPPFLAGS = $(JPEG_INCLUDES) $(PNG_INCLUDES) \ $(TIFF_INCLUDES) $(AM_CPPFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign imageio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign imageio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libimagedec.la: $(libimagedec_la_OBJECTS) $(libimagedec_la_DEPENDENCIES) $(EXTRA_libimagedec_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libimagedec_la_rpath) $(libimagedec_la_OBJECTS) $(libimagedec_la_LIBADD) $(LIBS) libimageenc.la: $(libimageenc_la_OBJECTS) $(libimageenc_la_DEPENDENCIES) $(EXTRA_libimageenc_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libimageenc_la_OBJECTS) $(libimageenc_la_LIBADD) $(LIBS) libimageio_util.la: $(libimageio_util_la_OBJECTS) $(libimageio_util_la_DEPENDENCIES) $(EXTRA_libimageio_util_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libimageio_util_la_OBJECTS) $(libimageio_util_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imageio_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-image_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-jpegdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-metadata.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-pngdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-pnmdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-tiffdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-webpdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimagedec_la-wicdec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libimageenc_la-image_enc.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libimagedec_la-image_dec.lo: image_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-image_dec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-image_dec.Tpo -c -o libimagedec_la-image_dec.lo `test -f 'image_dec.c' || echo '$(srcdir)/'`image_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-image_dec.Tpo $(DEPDIR)/libimagedec_la-image_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image_dec.c' object='libimagedec_la-image_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-image_dec.lo `test -f 'image_dec.c' || echo '$(srcdir)/'`image_dec.c libimagedec_la-jpegdec.lo: jpegdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-jpegdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-jpegdec.Tpo -c -o libimagedec_la-jpegdec.lo `test -f 'jpegdec.c' || echo '$(srcdir)/'`jpegdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-jpegdec.Tpo $(DEPDIR)/libimagedec_la-jpegdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jpegdec.c' object='libimagedec_la-jpegdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-jpegdec.lo `test -f 'jpegdec.c' || echo '$(srcdir)/'`jpegdec.c libimagedec_la-metadata.lo: metadata.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-metadata.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-metadata.Tpo -c -o libimagedec_la-metadata.lo `test -f 'metadata.c' || echo '$(srcdir)/'`metadata.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-metadata.Tpo $(DEPDIR)/libimagedec_la-metadata.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metadata.c' object='libimagedec_la-metadata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-metadata.lo `test -f 'metadata.c' || echo '$(srcdir)/'`metadata.c libimagedec_la-pngdec.lo: pngdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-pngdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-pngdec.Tpo -c -o libimagedec_la-pngdec.lo `test -f 'pngdec.c' || echo '$(srcdir)/'`pngdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-pngdec.Tpo $(DEPDIR)/libimagedec_la-pngdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pngdec.c' object='libimagedec_la-pngdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-pngdec.lo `test -f 'pngdec.c' || echo '$(srcdir)/'`pngdec.c libimagedec_la-pnmdec.lo: pnmdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-pnmdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-pnmdec.Tpo -c -o libimagedec_la-pnmdec.lo `test -f 'pnmdec.c' || echo '$(srcdir)/'`pnmdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-pnmdec.Tpo $(DEPDIR)/libimagedec_la-pnmdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pnmdec.c' object='libimagedec_la-pnmdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-pnmdec.lo `test -f 'pnmdec.c' || echo '$(srcdir)/'`pnmdec.c libimagedec_la-tiffdec.lo: tiffdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-tiffdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-tiffdec.Tpo -c -o libimagedec_la-tiffdec.lo `test -f 'tiffdec.c' || echo '$(srcdir)/'`tiffdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-tiffdec.Tpo $(DEPDIR)/libimagedec_la-tiffdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tiffdec.c' object='libimagedec_la-tiffdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-tiffdec.lo `test -f 'tiffdec.c' || echo '$(srcdir)/'`tiffdec.c libimagedec_la-webpdec.lo: webpdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-webpdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-webpdec.Tpo -c -o libimagedec_la-webpdec.lo `test -f 'webpdec.c' || echo '$(srcdir)/'`webpdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-webpdec.Tpo $(DEPDIR)/libimagedec_la-webpdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webpdec.c' object='libimagedec_la-webpdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-webpdec.lo `test -f 'webpdec.c' || echo '$(srcdir)/'`webpdec.c libimagedec_la-wicdec.lo: wicdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimagedec_la-wicdec.lo -MD -MP -MF $(DEPDIR)/libimagedec_la-wicdec.Tpo -c -o libimagedec_la-wicdec.lo `test -f 'wicdec.c' || echo '$(srcdir)/'`wicdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimagedec_la-wicdec.Tpo $(DEPDIR)/libimagedec_la-wicdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='wicdec.c' object='libimagedec_la-wicdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimagedec_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimagedec_la-wicdec.lo `test -f 'wicdec.c' || echo '$(srcdir)/'`wicdec.c libimageenc_la-image_enc.lo: image_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimageenc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libimageenc_la-image_enc.lo -MD -MP -MF $(DEPDIR)/libimageenc_la-image_enc.Tpo -c -o libimageenc_la-image_enc.lo `test -f 'image_enc.c' || echo '$(srcdir)/'`image_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libimageenc_la-image_enc.Tpo $(DEPDIR)/libimageenc_la-image_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='image_enc.c' object='libimageenc_la-image_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libimageenc_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libimageenc_la-image_enc.lo `test -f 'image_enc.c' || echo '$(srcdir)/'`image_enc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/imageio_util.Plo -rm -f ./$(DEPDIR)/libimagedec_la-image_dec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-jpegdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-metadata.Plo -rm -f ./$(DEPDIR)/libimagedec_la-pngdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-pnmdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-tiffdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-webpdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-wicdec.Plo -rm -f ./$(DEPDIR)/libimageenc_la-image_enc.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/imageio_util.Plo -rm -f ./$(DEPDIR)/libimagedec_la-image_dec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-jpegdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-metadata.Plo -rm -f ./$(DEPDIR)/libimagedec_la-pngdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-pnmdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-tiffdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-webpdec.Plo -rm -f ./$(DEPDIR)/libimagedec_la-wicdec.Plo -rm -f ./$(DEPDIR)/libimageenc_la-image_enc.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/imageio/jpegdec.c0000644000014400001440000002653314606317060013243 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // JPEG decode. #include "./jpegdec.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include #ifdef WEBP_HAVE_JPEG #include #include #include #include #include #include "webp/encode.h" #include "./imageio_util.h" #include "./metadata.h" // ----------------------------------------------------------------------------- // Metadata processing #ifndef JPEG_APP1 # define JPEG_APP1 (JPEG_APP0 + 1) #endif #ifndef JPEG_APP2 # define JPEG_APP2 (JPEG_APP0 + 2) #endif typedef struct { const uint8_t* data; size_t data_length; int seq; // this segment's sequence number [1, 255] for use in reassembly. } ICCPSegment; static void SaveMetadataMarkers(j_decompress_ptr dinfo) { const unsigned int max_marker_length = 0xffff; jpeg_save_markers(dinfo, JPEG_APP1, max_marker_length); // Exif/XMP jpeg_save_markers(dinfo, JPEG_APP2, max_marker_length); // ICC profile } static int CompareICCPSegments(const void* a, const void* b) { const ICCPSegment* s1 = (const ICCPSegment*)a; const ICCPSegment* s2 = (const ICCPSegment*)b; return s1->seq - s2->seq; } // Extract ICC profile segments from the marker list in 'dinfo', reassembling // and storing them in 'iccp'. // Returns true on success and false for memory errors and corrupt profiles. static int StoreICCP(j_decompress_ptr dinfo, MetadataPayload* const iccp) { // ICC.1:2010-12 (4.3.0.0) Annex B.4 Embedding ICC Profiles in JPEG files static const char kICCPSignature[] = "ICC_PROFILE"; static const size_t kICCPSignatureLength = 12; // signature includes '\0' static const size_t kICCPSkipLength = 14; // signature + seq & count int expected_count = 0; int actual_count = 0; int seq_max = 0; size_t total_size = 0; ICCPSegment iccp_segments[255]; jpeg_saved_marker_ptr marker; memset(iccp_segments, 0, sizeof(iccp_segments)); for (marker = dinfo->marker_list; marker != NULL; marker = marker->next) { if (marker->marker == JPEG_APP2 && marker->data_length > kICCPSkipLength && !memcmp(marker->data, kICCPSignature, kICCPSignatureLength)) { // ICC_PROFILE\0; 'seq' starts at 1. const int seq = marker->data[kICCPSignatureLength]; const int count = marker->data[kICCPSignatureLength + 1]; const size_t segment_size = marker->data_length - kICCPSkipLength; ICCPSegment* segment; if (segment_size == 0 || count == 0 || seq == 0) { fprintf(stderr, "[ICCP] size (%d) / count (%d) / sequence number (%d)" " cannot be 0!\n", (int)segment_size, seq, count); return 0; } if (expected_count == 0) { expected_count = count; } else if (expected_count != count) { fprintf(stderr, "[ICCP] Inconsistent segment count (%d / %d)!\n", expected_count, count); return 0; } segment = iccp_segments + seq - 1; if (segment->data_length != 0) { fprintf(stderr, "[ICCP] Duplicate segment number (%d)!\n" , seq); return 0; } segment->data = marker->data + kICCPSkipLength; segment->data_length = segment_size; segment->seq = seq; total_size += segment_size; if (seq > seq_max) seq_max = seq; ++actual_count; } } if (actual_count == 0) return 1; if (seq_max != actual_count) { fprintf(stderr, "[ICCP] Discontinuous segments, expected: %d actual: %d!\n", actual_count, seq_max); return 0; } if (expected_count != actual_count) { fprintf(stderr, "[ICCP] Segment count: %d does not match expected: %d!\n", actual_count, expected_count); return 0; } // The segments may appear out of order in the file, sort them based on // sequence number before assembling the payload. qsort(iccp_segments, actual_count, sizeof(*iccp_segments), CompareICCPSegments); iccp->bytes = (uint8_t*)malloc(total_size); if (iccp->bytes == NULL) return 0; iccp->size = total_size; { int i; size_t offset = 0; for (i = 0; i < seq_max; ++i) { memcpy(iccp->bytes + offset, iccp_segments[i].data, iccp_segments[i].data_length); offset += iccp_segments[i].data_length; } } return 1; } // Returns true on success and false for memory errors and corrupt profiles. // The caller must use MetadataFree() on 'metadata' in all cases. static int ExtractMetadataFromJPEG(j_decompress_ptr dinfo, Metadata* const metadata) { static const struct { int marker; const char* signature; size_t signature_length; size_t storage_offset; } kJPEGMetadataMap[] = { // Exif 2.2 Section 4.7.2 Interoperability Structure of APP1 ... { JPEG_APP1, "Exif\0", 6, METADATA_OFFSET(exif) }, // XMP Specification Part 3 Section 3 Embedding XMP Metadata ... #JPEG // TODO(jzern) Add support for 'ExtendedXMP' { JPEG_APP1, "http://ns.adobe.com/xap/1.0/", 29, METADATA_OFFSET(xmp) }, { 0, NULL, 0, 0 }, }; jpeg_saved_marker_ptr marker; // Treat ICC profiles separately as they may be segmented and out of order. if (!StoreICCP(dinfo, &metadata->iccp)) return 0; for (marker = dinfo->marker_list; marker != NULL; marker = marker->next) { int i; for (i = 0; kJPEGMetadataMap[i].marker != 0; ++i) { if (marker->marker == kJPEGMetadataMap[i].marker && marker->data_length > kJPEGMetadataMap[i].signature_length && !memcmp(marker->data, kJPEGMetadataMap[i].signature, kJPEGMetadataMap[i].signature_length)) { MetadataPayload* const payload = (MetadataPayload*)((uint8_t*)metadata + kJPEGMetadataMap[i].storage_offset); if (payload->bytes == NULL) { const char* marker_data = (const char*)marker->data + kJPEGMetadataMap[i].signature_length; const size_t marker_data_length = marker->data_length - kJPEGMetadataMap[i].signature_length; if (!MetadataCopy(marker_data, marker_data_length, payload)) return 0; } else { fprintf(stderr, "Ignoring additional '%s' marker\n", kJPEGMetadataMap[i].signature); } } } } return 1; } #undef JPEG_APP1 #undef JPEG_APP2 // ----------------------------------------------------------------------------- // JPEG decoding struct my_error_mgr { struct jpeg_error_mgr pub; jmp_buf setjmp_buffer; }; static void my_error_exit(j_common_ptr dinfo) { struct my_error_mgr* myerr = (struct my_error_mgr*)dinfo->err; fprintf(stderr, "libjpeg error: "); dinfo->err->output_message(dinfo); longjmp(myerr->setjmp_buffer, 1); } typedef struct { struct jpeg_source_mgr pub; const uint8_t* data; size_t data_size; } JPEGReadContext; static void ContextInit(j_decompress_ptr cinfo) { JPEGReadContext* const ctx = (JPEGReadContext*)cinfo->src; ctx->pub.next_input_byte = ctx->data; ctx->pub.bytes_in_buffer = ctx->data_size; } static boolean ContextFill(j_decompress_ptr cinfo) { // we shouldn't get here. ERREXIT(cinfo, JERR_FILE_READ); return FALSE; } static void ContextSkip(j_decompress_ptr cinfo, long jump_size) { JPEGReadContext* const ctx = (JPEGReadContext*)cinfo->src; size_t jump = (size_t)jump_size; if (jump > ctx->pub.bytes_in_buffer) { // Don't overflow the buffer. jump = ctx->pub.bytes_in_buffer; } ctx->pub.bytes_in_buffer -= jump; ctx->pub.next_input_byte += jump; } static void ContextTerm(j_decompress_ptr cinfo) { (void)cinfo; } static void ContextSetup(volatile struct jpeg_decompress_struct* const cinfo, JPEGReadContext* const ctx) { cinfo->src = (struct jpeg_source_mgr*)ctx; ctx->pub.init_source = ContextInit; ctx->pub.fill_input_buffer = ContextFill; ctx->pub.skip_input_data = ContextSkip; ctx->pub.resync_to_restart = jpeg_resync_to_restart; ctx->pub.term_source = ContextTerm; ctx->pub.bytes_in_buffer = 0; ctx->pub.next_input_byte = NULL; } int ReadJPEG(const uint8_t* const data, size_t data_size, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { volatile int ok = 0; int width, height; int64_t stride; volatile struct jpeg_decompress_struct dinfo; struct my_error_mgr jerr; uint8_t* volatile rgb = NULL; JSAMPROW buffer[1]; JPEGReadContext ctx; if (data == NULL || data_size == 0 || pic == NULL) return 0; (void)keep_alpha; memset(&ctx, 0, sizeof(ctx)); ctx.data = data; ctx.data_size = data_size; memset((j_decompress_ptr)&dinfo, 0, sizeof(dinfo)); // for setjmp safety dinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { Error: MetadataFree(metadata); jpeg_destroy_decompress((j_decompress_ptr)&dinfo); goto End; } jpeg_create_decompress((j_decompress_ptr)&dinfo); ContextSetup(&dinfo, &ctx); if (metadata != NULL) SaveMetadataMarkers((j_decompress_ptr)&dinfo); jpeg_read_header((j_decompress_ptr)&dinfo, TRUE); dinfo.out_color_space = JCS_RGB; dinfo.do_fancy_upsampling = TRUE; jpeg_start_decompress((j_decompress_ptr)&dinfo); if (dinfo.output_components != 3) { goto Error; } width = dinfo.output_width; height = dinfo.output_height; stride = (int64_t)dinfo.output_width * dinfo.output_components * sizeof(*rgb); if (stride != (int)stride || !ImgIoUtilCheckSizeArgumentsOverflow(stride, height)) { goto Error; } rgb = (uint8_t*)malloc((size_t)stride * height); if (rgb == NULL) { goto Error; } buffer[0] = (JSAMPLE*)rgb; while (dinfo.output_scanline < dinfo.output_height) { if (jpeg_read_scanlines((j_decompress_ptr)&dinfo, buffer, 1) != 1) { goto Error; } buffer[0] += stride; } if (metadata != NULL) { ok = ExtractMetadataFromJPEG((j_decompress_ptr)&dinfo, metadata); if (!ok) { fprintf(stderr, "Error extracting JPEG metadata!\n"); goto Error; } } jpeg_finish_decompress((j_decompress_ptr)&dinfo); jpeg_destroy_decompress((j_decompress_ptr)&dinfo); // WebP conversion. pic->width = width; pic->height = height; ok = WebPPictureImportRGB(pic, rgb, (int)stride); if (!ok) { pic->width = 0; // WebPPictureImportRGB() barely touches 'pic' on failure. pic->height = 0; // Just reset dimensions but keep any 'custom_ptr' etc. MetadataFree(metadata); // In case the caller forgets to free it on error. } End: free(rgb); return ok; } #else // !WEBP_HAVE_JPEG int ReadJPEG(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { (void)data; (void)data_size; (void)pic; (void)keep_alpha; (void)metadata; fprintf(stderr, "JPEG support not compiled. Please install the libjpeg " "development package before building.\n"); return 0; } #endif // WEBP_HAVE_JPEG // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/image_enc.h0000644000014400001440000000571514606317060013555 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // All-in-one library to save PNG/JPEG/WebP/TIFF/WIC images. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_IMAGEIO_IMAGE_ENC_H_ #define WEBP_IMAGEIO_IMAGE_ENC_H_ #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "webp/types.h" #include "webp/decode.h" #ifdef __cplusplus extern "C" { #endif // Output types typedef enum { PNG = 0, PAM, PPM, PGM, BMP, TIFF, RAW_YUV, ALPHA_PLANE_ONLY, // this is for experimenting only // forced colorspace output (for testing, mostly) RGB, RGBA, BGR, BGRA, ARGB, RGBA_4444, RGB_565, rgbA, bgrA, Argb, rgbA_4444, YUV, YUVA } WebPOutputFileFormat; // General all-purpose call. // Most formats expect a 'buffer' containing RGBA-like samples, except // RAW_YUV, YUV and YUVA formats. // If 'out_file_name' is "-", data is saved to stdout. // Returns false if an error occurred, true otherwise. int WebPSaveImage(const WebPDecBuffer* const buffer, WebPOutputFileFormat format, const char* const out_file_name); // Save to PNG. #ifdef HAVE_WINCODEC_H int WebPWritePNG(const char* out_file_name, int use_stdout, const struct WebPDecBuffer* const buffer); #else int WebPWritePNG(FILE* out_file, const WebPDecBuffer* const buffer); #endif // Save to PPM format (RGB, no alpha) int WebPWritePPM(FILE* fout, const struct WebPDecBuffer* const buffer); // Save to PAM format (= PPM + alpha) int WebPWritePAM(FILE* fout, const struct WebPDecBuffer* const buffer); // Save 16b mode (RGBA4444, RGB565, ...) for debugging purposes. int WebPWrite16bAsPGM(FILE* fout, const struct WebPDecBuffer* const buffer); // Save as BMP int WebPWriteBMP(FILE* fout, const struct WebPDecBuffer* const buffer); // Save as TIFF int WebPWriteTIFF(FILE* fout, const struct WebPDecBuffer* const buffer); // Save the ALPHA plane (only) as a PGM int WebPWriteAlphaPlane(FILE* fout, const struct WebPDecBuffer* const buffer); // Save as YUV samples as PGM format (using IMC4 layout). // See: https://www.fourcc.org/yuv.php#IMC4. // (very convenient format for viewing the samples, esp. for odd dimensions). int WebPWritePGM(FILE* fout, const struct WebPDecBuffer* const buffer); // Save YUV(A) planes sequentially (raw dump) int WebPWriteYUV(FILE* fout, const struct WebPDecBuffer* const buffer); // Save 16b mode (RGBA4444, RGB565, ...) as PGM format, for debugging purposes. int WebPWrite16bAsPGM(FILE* fout, const struct WebPDecBuffer* const buffer); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_IMAGE_ENC_H_ libwebp-1.4.0/imageio/tiffdec.c0000644000014400001440000002212414606317060013236 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // TIFF decode. #include "./tiffdec.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include #include #include #ifdef WEBP_HAVE_TIFF #include #include "webp/encode.h" #include "./imageio_util.h" #include "./metadata.h" static const struct { ttag_t tag; size_t storage_offset; } kTIFFMetadataMap[] = { { TIFFTAG_ICCPROFILE, METADATA_OFFSET(iccp) }, { TIFFTAG_XMLPACKET, METADATA_OFFSET(xmp) }, { 0, 0 }, }; // Returns true on success. The caller must use MetadataFree() on 'metadata' in // all cases. static int ExtractMetadataFromTIFF(TIFF* const tif, Metadata* const metadata) { int i; toff_t exif_ifd_offset; for (i = 0; kTIFFMetadataMap[i].tag != 0; ++i) { MetadataPayload* const payload = (MetadataPayload*)((uint8_t*)metadata + kTIFFMetadataMap[i].storage_offset); void* tag_data; uint32_t tag_data_len; if (TIFFGetField(tif, kTIFFMetadataMap[i].tag, &tag_data_len, &tag_data) && !MetadataCopy((const char*)tag_data, tag_data_len, payload)) { return 0; } } // TODO(jzern): To extract the raw EXIF directory some parsing of it would be // necessary to determine the overall size. In addition, value offsets in // individual directory entries may need to be updated as, depending on the // type, they are file based. // Exif 2.2 Section 4.6.2 Tag Structure // TIFF Revision 6.0 Part 1 Section 2 TIFF Structure #Image File Directory if (TIFFGetField(tif, TIFFTAG_EXIFIFD, &exif_ifd_offset)) { fprintf(stderr, "Warning: EXIF extraction from TIFF is unsupported.\n"); } return 1; } // Ad-hoc structure to supply read-from-memory functionalities. typedef struct { const uint8_t* data; toff_t size; toff_t pos; } MyData; static int MyClose(thandle_t opaque) { (void)opaque; return 0; } static toff_t MySize(thandle_t opaque) { const MyData* const my_data = (MyData*)opaque; return my_data->size; } static toff_t MySeek(thandle_t opaque, toff_t offset, int whence) { MyData* const my_data = (MyData*)opaque; offset += (whence == SEEK_CUR) ? my_data->pos : (whence == SEEK_SET) ? 0 : my_data->size; if (offset > my_data->size) return (toff_t)-1; my_data->pos = offset; return offset; } static int MyMapFile(thandle_t opaque, void** base, toff_t* size) { (void)opaque; (void)base; (void)size; return 0; } static void MyUnmapFile(thandle_t opaque, void* base, toff_t size) { (void)opaque; (void)base; (void)size; } static tsize_t MyRead(thandle_t opaque, void* dst, tsize_t size) { MyData* const my_data = (MyData*)opaque; if (my_data->pos + size > my_data->size) { size = (tsize_t)(my_data->size - my_data->pos); } if (size > 0) { memcpy(dst, my_data->data + my_data->pos, size); my_data->pos += size; } return size; } // Unmultiply Argb data. Taken from dsp/alpha_processing // (we don't want to force a dependency to a libdspdec library). #define MFIX 24 // 24bit fixed-point arithmetic #define HALF ((1u << MFIX) >> 1) static uint32_t Unmult(uint8_t x, uint32_t mult) { const uint32_t v = (x * mult + HALF) >> MFIX; return (v > 255u) ? 255u : v; } static WEBP_INLINE uint32_t GetScale(uint32_t a) { return (255u << MFIX) / a; } #undef MFIX #undef HALF static void MultARGBRow(uint8_t* ptr, int width) { int x; for (x = 0; x < width; ++x, ptr += 4) { const uint32_t alpha = ptr[3]; if (alpha < 255) { if (alpha == 0) { // alpha == 0 ptr[0] = ptr[1] = ptr[2] = 0; } else { const uint32_t scale = GetScale(alpha); ptr[0] = Unmult(ptr[0], scale); ptr[1] = Unmult(ptr[1], scale); ptr[2] = Unmult(ptr[2], scale); } } } } int ReadTIFF(const uint8_t* const data, size_t data_size, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { MyData my_data = { data, (toff_t)data_size, 0 }; TIFF* tif; uint32_t image_width, image_height, tile_width, tile_height; uint64_t stride; uint16_t samples_per_px = 0; uint16_t extra_samples = 0; uint16_t* extra_samples_ptr = NULL; uint32_t* raster; int64_t alloc_size; int ok = 0; tdir_t dircount; if (data == NULL || data_size == 0 || data_size > INT_MAX || pic == NULL) { return 0; } tif = TIFFClientOpen("Memory", "r", &my_data, MyRead, MyRead, MySeek, MyClose, MySize, MyMapFile, MyUnmapFile); if (tif == NULL) { fprintf(stderr, "Error! Cannot parse TIFF file\n"); return 0; } dircount = TIFFNumberOfDirectories(tif); if (dircount > 1) { fprintf(stderr, "Warning: multi-directory TIFF files are not supported.\n" "Only the first will be used, %d will be ignored.\n", dircount - 1); } if (!TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_px)) { fprintf(stderr, "Error! Cannot retrieve TIFF samples-per-pixel info.\n"); goto End; } if (!(samples_per_px == 1 || samples_per_px == 3 || samples_per_px == 4)) { goto End; // not supported } if (!(TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &image_width) && TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &image_height))) { fprintf(stderr, "Error! Cannot retrieve TIFF image dimensions.\n"); goto End; } stride = (uint64_t)image_width * sizeof(*raster); if (!ImgIoUtilCheckSizeArgumentsOverflow(stride, image_height)) { fprintf(stderr, "Error! TIFF image dimension (%d x %d) is too large.\n", image_width, image_height); goto End; } // According to spec, a tile can be bigger than the image. However it should // be a multiple of 16 and not way too large, so check that it's not more // than twice the image size, for dimensions above some arbitrary minimum // 32. We also check that they respect WebP's dimension and memory limit. // Note that a tile can be 6byte/px in some cases. Here we assume // 4byte/px with sizeof(*raster), to be conservative. if (TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width) && TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height)) { if ((tile_width > 32 && tile_width / 2 > image_width) || (tile_height > 32 && tile_height / 2 > image_height) || !ImgIoUtilCheckSizeArgumentsOverflow( (uint64_t)tile_width * sizeof(*raster), tile_height)) { fprintf(stderr, "Error! TIFF tile dimension (%d x %d) is too large.\n", tile_width, tile_height); goto End; } } if (samples_per_px > 3 && !TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_samples, &extra_samples_ptr)) { fprintf(stderr, "Error! Cannot retrieve TIFF ExtraSamples info.\n"); goto End; } // _Tiffmalloc uses a signed type for size. alloc_size = (int64_t)(stride * image_height); if (alloc_size < 0 || alloc_size != (tsize_t)alloc_size) goto End; raster = (uint32_t*)_TIFFmalloc((tsize_t)alloc_size); if (raster != NULL) { if (TIFFReadRGBAImageOriented(tif, image_width, image_height, raster, ORIENTATION_TOPLEFT, 1)) { pic->width = image_width; pic->height = image_height; // TIFF data is ABGR #ifdef WORDS_BIGENDIAN TIFFSwabArrayOfLong(raster, image_width * image_height); #endif // if we have an alpha channel, we must un-multiply from rgbA to RGBA if (extra_samples == 1 && extra_samples_ptr != NULL && extra_samples_ptr[0] == EXTRASAMPLE_ASSOCALPHA) { uint32_t y; uint8_t* tmp = (uint8_t*)raster; for (y = 0; y < image_height; ++y) { MultARGBRow(tmp, image_width); tmp += stride; } } ok = keep_alpha ? WebPPictureImportRGBA(pic, (const uint8_t*)raster, (int)stride) : WebPPictureImportRGBX(pic, (const uint8_t*)raster, (int)stride); } _TIFFfree(raster); } else { fprintf(stderr, "Error allocating TIFF RGBA memory!\n"); } if (ok) { if (metadata != NULL) { ok = ExtractMetadataFromTIFF(tif, metadata); if (!ok) { fprintf(stderr, "Error extracting TIFF metadata!\n"); MetadataFree(metadata); WebPPictureFree(pic); } } } End: TIFFClose(tif); return ok; } #else // !WEBP_HAVE_TIFF int ReadTIFF(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata) { (void)data; (void)data_size; (void)pic; (void)keep_alpha; (void)metadata; fprintf(stderr, "TIFF support not compiled. Please install the libtiff " "development package before building.\n"); return 0; } #endif // WEBP_HAVE_TIFF // ----------------------------------------------------------------------------- libwebp-1.4.0/imageio/pngdec.h0000644000014400001440000000225614606317060013103 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // PNG decode. #ifndef WEBP_IMAGEIO_PNGDEC_H_ #define WEBP_IMAGEIO_PNGDEC_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif struct Metadata; struct WebPPicture; // Reads a PNG from 'data', returning the decoded output in 'pic'. // Output is RGBA or YUVA, depending on pic->use_argb value. // If 'keep_alpha' is true and the PNG has an alpha channel, the output is RGBA // or YUVA. Otherwise, alpha channel is dropped and output is RGB or YUV. // Returns true on success. int ReadPNG(const uint8_t* const data, size_t data_size, struct WebPPicture* const pic, int keep_alpha, struct Metadata* const metadata); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_IMAGEIO_PNGDEC_H_ libwebp-1.4.0/tests/0000755000014400001440000000000014606317060011215 5ustar libwebp-1.4.0/tests/fuzzer/0000755000014400001440000000000014606317060012542 5ustar libwebp-1.4.0/tests/fuzzer/makefile.unix0000644000014400001440000000175214606317060015231 0ustar # This Makefile will compile all fuzzing targets. It doesn't check tool # requirements and paths may need to be updated depending on your environment. # Note a clang 6+ toolchain is assumed for use of -fsanitize=fuzzer. CC = clang CXX = clang++ CFLAGS = -fsanitize=fuzzer -I../../src -I../.. -Wall -Wextra CXXFLAGS = $(CFLAGS) LDFLAGS = -fsanitize=fuzzer LDLIBS = ../../src/mux/libwebpmux.a ../../src/demux/libwebpdemux.a LDLIBS += ../../src/libwebp.a ../../imageio/libimageio_util.a LDLIBS += ../../sharpyuv/libsharpyuv.a FUZZERS = advanced_api_fuzzer animation_api_fuzzer animdecoder_fuzzer FUZZERS += animencoder_fuzzer enc_dec_fuzzer huffman_fuzzer FUZZERS += mux_demux_api_fuzzer simple_api_fuzzer %.o: fuzz_utils.h img_alpha.h img_grid.h img_peak.h all: $(FUZZERS) define FUZZER_template $(1): $$(addsuffix .o, $(1)) $(LDLIBS) OBJS += $$(addsuffix .o, $(1)) endef $(foreach fuzzer, $(FUZZERS), $(eval $(call FUZZER_template, $(fuzzer)))) clean: $(RM) $(FUZZERS) $(OBJS) .PHONY: all clean libwebp-1.4.0/tests/fuzzer/huffman_fuzzer.c0000644000014400001440000000457614606317060015753 0ustar // Copyright 2023 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include #include #include "src/dec/vp8li_dec.h" #include "src/utils/bit_reader_utils.h" #include "src/utils/huffman_utils.h" #include "src/utils/utils.h" #include "src/webp/format_constants.h" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { // Number of bits to initialize data. static const int kColorCacheBitsBits = 4; // 'num_htree_groups' is contained in the RG channel, hence 16 bits. static const int kNumHtreeGroupsBits = 16; if (size * sizeof(*data) < kColorCacheBitsBits + kNumHtreeGroupsBits) { return 0; } // A non-NULL mapping brings minor changes that are tested by the normal // fuzzer. int* const mapping = NULL; HuffmanTables huffman_tables; memset(&huffman_tables, 0, sizeof(huffman_tables)); HTreeGroup* htree_groups = NULL; VP8LDecoder* dec = VP8LNew(); if (dec == NULL) goto Error; VP8LBitReader* const br = &dec->br_; VP8LInitBitReader(br, data, size); const int color_cache_bits = VP8LReadBits(br, kColorCacheBitsBits); if (color_cache_bits < 1 || color_cache_bits > MAX_CACHE_BITS) goto Error; const int num_htree_groups = VP8LReadBits(br, kNumHtreeGroupsBits); // 'num_htree_groups' cannot be 0 as it is built from a non-empty image. if (num_htree_groups == 0) goto Error; // This variable is only useful when mapping is not NULL. const int num_htree_groups_max = num_htree_groups; (void)ReadHuffmanCodesHelper(color_cache_bits, num_htree_groups, num_htree_groups_max, mapping, dec, &huffman_tables, &htree_groups); Error: WebPSafeFree(mapping); VP8LHtreeGroupsFree(htree_groups); VP8LHuffmanTablesDeallocate(&huffman_tables); VP8LDelete(dec); return 0; } libwebp-1.4.0/tests/fuzzer/mux_demux_api_fuzzer.c0000644000014400001440000000547214606317060017167 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include "./fuzz_utils.h" #include "src/webp/demux.h" #include "src/webp/mux.h" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { WebPData webp_data; WebPDataInit(&webp_data); webp_data.size = size; webp_data.bytes = data; // Extracted chunks and frames are not processed or decoded, // which is already covered extensively by the other fuzz targets. if (size & 1) { // Mux API WebPMux* mux = WebPMuxCreate(&webp_data, size & 2); if (!mux) return 0; WebPData chunk; (void)WebPMuxGetChunk(mux, "EXIF", &chunk); (void)WebPMuxGetChunk(mux, "ICCP", &chunk); (void)WebPMuxGetChunk(mux, "FUZZ", &chunk); // unknown uint32_t flags; (void)WebPMuxGetFeatures(mux, &flags); WebPMuxAnimParams params; (void)WebPMuxGetAnimationParams(mux, ¶ms); WebPMuxError status; WebPMuxFrameInfo info; for (int i = 0; i < kFuzzFrameLimit; i++) { status = WebPMuxGetFrame(mux, i + 1, &info); if (status == WEBP_MUX_NOT_FOUND) { break; } else if (status == WEBP_MUX_OK) { WebPDataClear(&info.bitstream); } } WebPMuxDelete(mux); } else { // Demux API WebPDemuxer* demux; if (size & 2) { WebPDemuxState state; demux = WebPDemuxPartial(&webp_data, &state); if (state < WEBP_DEMUX_PARSED_HEADER) { WebPDemuxDelete(demux); return 0; } } else { demux = WebPDemux(&webp_data); if (!demux) return 0; } WebPChunkIterator chunk_iter; if (WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter)) { (void)WebPDemuxNextChunk(&chunk_iter); } WebPDemuxReleaseChunkIterator(&chunk_iter); if (WebPDemuxGetChunk(demux, "ICCP", 0, &chunk_iter)) { // 0 == last (void)WebPDemuxPrevChunk(&chunk_iter); } WebPDemuxReleaseChunkIterator(&chunk_iter); // Skips FUZZ because the Demux API has no concept of (un)known chunks. WebPIterator iter; if (WebPDemuxGetFrame(demux, 1, &iter)) { for (int i = 1; i < kFuzzFrameLimit; i++) { if (!WebPDemuxNextFrame(&iter)) break; } } WebPDemuxReleaseIterator(&iter); WebPDemuxDelete(demux); } return 0; } libwebp-1.4.0/tests/fuzzer/img_peak.h0000644000014400001440000145476014606317060014510 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #ifndef WEBP_TESTS_FUZZER_IMG_PEAK_H_ #define WEBP_TESTS_FUZZER_IMG_PEAK_H_ #include static const int kImgPeakWidth = 128; static const int kImgPeakHeight = 128; /*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/ static const uint8_t kImgPeakData[] = { 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0xd9, 0xc6, 0xb4, 0xff, 0xa7, 0x94, 0x84, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xc0, 0xaa, 0x9c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xe6, 0xd6, 0xcc, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xde, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xc0, 0xaa, 0x9c, 0xff, 0x9c, 0x7e, 0x6c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xde, 0xd4, 0xff, 0xd4, 0xb8, 0xac, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x84, 0x6e, 0x5c, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xdc, 0xbe, 0xb4, 0xff, 0xac, 0x8e, 0x7c, 0xff, 0x9c, 0x81, 0x74, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0xa4, 0x89, 0x7c, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xe4, 0xd2, 0xc4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0xa4, 0x89, 0x7c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0x94, 0x76, 0x64, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xe7, 0xce, 0xbc, 0xff, 0x84, 0x6e, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xcc, 0xaa, 0xac, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x96, 0x85, 0x84, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xdc, 0xbe, 0xb4, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0x84, 0x6e, 0x5c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x94, 0x79, 0x6c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xb4, 0x96, 0x94, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xe7, 0xce, 0xbc, 0xff, 0x9c, 0x7e, 0x6c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x96, 0x85, 0x84, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xe4, 0xce, 0xcc, 0xff, 0xec, 0xde, 0xdc, 0xff, 0xf8, 0xea, 0xec, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xd4, 0xc2, 0xac, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xe7, 0xce, 0xbc, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xc7, 0xb2, 0xa4, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x78, 0x66, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xe6, 0xd6, 0xcc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0x9c, 0x7e, 0x6c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x78, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xec, 0xd6, 0xc4, 0xff, 0x84, 0x6e, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xd9, 0xc6, 0xb4, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7e, 0x67, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xd9, 0xc6, 0xb4, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x75, 0x56, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xd4, 0xb8, 0xac, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x75, 0x56, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x75, 0x56, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xac, 0x8e, 0x7c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0x88, 0x8a, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xa4, 0x86, 0x74, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xac, 0x8e, 0x7c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x64, 0x5a, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xec, 0xdb, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf7, 0xdd, 0xcc, 0xff, 0x94, 0x76, 0x64, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x6f, 0x56, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x69, 0x55, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xe6, 0xd6, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe2, 0xcc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xac, 0x8e, 0x7c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe6, 0xcc, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0x94, 0x79, 0x6c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0x9c, 0x7e, 0x6c, 0xff, 0x7c, 0x62, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x94, 0x79, 0x6c, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x75, 0x62, 0x64, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x84, 0x77, 0x74, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x96, 0x85, 0x84, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xb4, 0x9a, 0x8c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x64, 0x5a, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5c, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8c, 0x6d, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x78, 0x66, 0x64, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xf9, 0xe2, 0xd4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xb0, 0xaa, 0x9c, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xea, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xe4, 0xde, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x75, 0x56, 0x54, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x7c, 0x5e, 0x5c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xe8, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xb4, 0x96, 0x94, 0xff, 0x75, 0x62, 0x64, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xec, 0xde, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x84, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xee, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x71, 0x72, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x75, 0x62, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x83, 0x82, 0x84, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8c, 0x86, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xf8, 0xea, 0xec, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x7c, 0x5d, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xee, 0xdd, 0xd4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9c, 0x92, 0x84, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x83, 0x82, 0x84, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x75, 0x62, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf1, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x78, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0xe6, 0xd6, 0xcc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x78, 0x77, 0x74, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x89, 0x86, 0x84, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xcc, 0xbe, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0x84, 0x77, 0x74, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x74, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x83, 0x82, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xf8, 0xea, 0xec, 0xff, 0xec, 0xe2, 0xe4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7d, 0x62, 0x5c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x96, 0x85, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xd2, 0xd4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x61, 0x48, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x89, 0x86, 0x84, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x78, 0x66, 0x64, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x80, 0x67, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x89, 0x86, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xfc, 0xf6, 0xf4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xec, 0xe2, 0xe4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x84, 0x77, 0x74, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xf4, 0xf2, 0xf4, 0xff, 0xf4, 0xf2, 0xf4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x78, 0x77, 0x74, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x88, 0x8a, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x78, 0x66, 0x64, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x75, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x75, 0x56, 0x54, 0xff, 0x69, 0x4e, 0x44, 0xff, 0x74, 0x5b, 0x4c, 0xff, 0x74, 0x4e, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xec, 0xe2, 0xe4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0x61, 0x48, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x89, 0x86, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x69, 0x55, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x78, 0x77, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xec, 0xea, 0xec, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xfc, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x71, 0x72, 0x6c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x83, 0x82, 0x84, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x83, 0x82, 0x84, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x81, 0x72, 0x74, 0xff, 0x75, 0x62, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x74, 0x55, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x54, 0x46, 0x3c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x90, 0x7f, 0x74, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x96, 0x85, 0x84, 0xff, 0x78, 0x66, 0x64, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x84, 0x79, 0x7c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x89, 0x86, 0x84, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x83, 0x82, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x89, 0x86, 0x84, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6a, 0x53, 0x4c, 0xff, 0x75, 0x56, 0x54, 0xff, 0x6c, 0x4a, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xb4, 0xae, 0x9c, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x75, 0x62, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfc, 0xf9, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf0, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x60, 0x46, 0x3c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x94, 0x8b, 0x84, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x61, 0x48, 0x44, 0xff, 0x5c, 0x42, 0x44, 0xff, 0x5c, 0x42, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x92, 0x92, 0x8c, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x83, 0x82, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x61, 0x48, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x69, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x78, 0x77, 0x74, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x61, 0x48, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x69, 0x55, 0x54, 0xff, 0x75, 0x62, 0x64, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x69, 0x4e, 0x4c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x94, 0x8e, 0x94, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0x9e, 0x8e, 0x94, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xe4, 0xce, 0xcc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0x81, 0x72, 0x74, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xec, 0xea, 0xec, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb4, 0xaa, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xe6, 0xd6, 0xd6, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x78, 0x77, 0x74, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe4, 0xde, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xf4, 0xf2, 0xf4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xba, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x89, 0x86, 0x84, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xec, 0xea, 0xec, 0xff, 0xec, 0xea, 0xec, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x78, 0x77, 0x74, 0xff, 0x71, 0x72, 0x74, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x78, 0x77, 0x74, 0xff, 0x83, 0x82, 0x84, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xcf, 0xc6, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xfc, 0xfe, 0xf4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xfa, 0xfe, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x8c, 0x86, 0x8c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x94, 0x8c, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x63, 0x66, 0x64, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xfb, 0xf9, 0xec, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xc0, 0xaa, 0x9c, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0xcc, 0xbe, 0xac, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xbc, 0xb1, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xec, 0xea, 0xec, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xd7, 0xcc, 0xc4, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xc4, 0xb2, 0xac, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0xa7, 0x94, 0x84, 0xff, 0x9c, 0x8e, 0x7c, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xb4, 0xaa, 0x94, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xa4, 0x9e, 0xa4, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x88, 0x8a, 0x84, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x83, 0x82, 0x84, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xf4, 0xf2, 0xf4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xbc, 0xb6, 0xac, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xcc, 0xbd, 0xbc, 0xff, 0xef, 0xe2, 0xdc, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0xac, 0x8d, 0x84, 0xff, 0xa4, 0x89, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x8e, 0x7c, 0xff, 0x9c, 0x8e, 0x7c, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xb4, 0xae, 0x9c, 0xff, 0xd9, 0xcc, 0xbc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xa1, 0x99, 0x9c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x89, 0x86, 0x84, 0xff, 0x71, 0x72, 0x6c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xec, 0xea, 0xec, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc4, 0xbe, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xf2, 0xf0, 0xec, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xdc, 0xba, 0xbc, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa4, 0x86, 0x74, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xb4, 0xae, 0x9c, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x94, 0x8e, 0x94, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xe8, 0xe7, 0xe4, 0xff, 0xd7, 0xd6, 0xd4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xba, 0xb6, 0xb4, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x90, 0x7f, 0x74, 0xff, 0xac, 0x8d, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xf4, 0xe9, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x71, 0x72, 0x74, 0xff, 0x88, 0x8a, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x78, 0x77, 0x74, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xac, 0xa9, 0xac, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0xd6, 0xd2, 0xd4, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xbc, 0xb0, 0xac, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xa7, 0x94, 0x84, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf7, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x71, 0x72, 0x74, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0x71, 0x72, 0x74, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xc8, 0xca, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xb3, 0xae, 0xac, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xe1, 0xe4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd5, 0xcd, 0xcc, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0xb4, 0x96, 0x94, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0xc5, 0xb7, 0xb4, 0xff, 0xbc, 0xa4, 0x9c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0x9c, 0x92, 0x84, 0xff, 0xc7, 0xb8, 0xac, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x83, 0x82, 0x84, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0xa1, 0xa2, 0x9c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xc2, 0xc2, 0xbc, 0xff, 0x83, 0x82, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0xdc, 0xd6, 0xdc, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xc6, 0xb1, 0xb4, 0xff, 0xe6, 0xd6, 0xd6, 0xff, 0xcc, 0xbe, 0xc4, 0xff, 0xb4, 0x96, 0x94, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x90, 0x7f, 0x74, 0xff, 0x9c, 0x81, 0x74, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xd8, 0xdc, 0xd4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xc4, 0xc3, 0xc4, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0x71, 0x72, 0x74, 0xff, 0x83, 0x82, 0x84, 0xff, 0x89, 0x86, 0x84, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xbc, 0xb9, 0xbc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xa6, 0x95, 0x94, 0xff, 0xd4, 0xc6, 0xc4, 0xff, 0xe4, 0xd2, 0xd4, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x8e, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x84, 0x7e, 0x74, 0xff, 0x90, 0x7f, 0x74, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xd9, 0xc6, 0xb4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0xb4, 0xb2, 0xb4, 0xff, 0xcc, 0xc5, 0xc4, 0xff, 0xac, 0xa9, 0xac, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x9c, 0x7a, 0x7c, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xae, 0xa4, 0xa4, 0xff, 0xbf, 0xaa, 0xa4, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8a, 0x76, 0x6c, 0xff, 0x84, 0x7e, 0x74, 0xff, 0xa9, 0x9b, 0x8c, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x83, 0x82, 0x84, 0xff, 0xb3, 0xae, 0xac, 0xff, 0x9c, 0x9a, 0x94, 0xff, 0xa3, 0xa3, 0xa4, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x9c, 0x93, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8c, 0x6e, 0x64, 0xff, 0x90, 0x7f, 0x74, 0xff, 0xa7, 0x94, 0x84, 0xff, 0xb0, 0xa3, 0x9c, 0xff, 0xe4, 0xd2, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x92, 0x92, 0x8c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x83, 0x82, 0x84, 0xff, 0x7b, 0x7a, 0x7c, 0xff, 0x8b, 0x8b, 0x8c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x96, 0x85, 0x84, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x9e, 0x8b, 0x84, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x92, 0x84, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0xa7, 0x94, 0x84, 0xff, 0xb1, 0xa3, 0x94, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x81, 0x72, 0x74, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xad, 0x9a, 0x9c, 0xff, 0xa4, 0x85, 0x84, 0xff, 0xa4, 0x85, 0x84, 0xff, 0x8d, 0x72, 0x6b, 0xff, 0x78, 0x66, 0x64, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0xa4, 0x89, 0x7c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xe2, 0xdc, 0xcc, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x6a, 0x6c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x81, 0x7e, 0x7c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xbc, 0xaa, 0xac, 0xff, 0xac, 0x8d, 0x8c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x75, 0x62, 0x64, 0xff, 0x84, 0x77, 0x74, 0xff, 0xbd, 0xa6, 0xa4, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x9c, 0x7a, 0x74, 0xff, 0x9c, 0x88, 0x7c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x96, 0x86, 0x8c, 0xff, 0xac, 0x8d, 0x84, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x7f, 0x6a, 0x64, 0xff, 0xad, 0x9e, 0x9e, 0xff, 0xba, 0xb0, 0xa4, 0xff, 0xb4, 0x9b, 0x94, 0xff, 0x8e, 0x72, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x84, 0x7e, 0x74, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x78, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0xa8, 0x93, 0x8c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0x9c, 0x80, 0x7c, 0xff, 0x8e, 0x79, 0x74, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf3, 0xf2, 0xdc, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x8f, 0x7f, 0x7c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x7e, 0x6d, 0x6c, 0xff, 0x9d, 0x8d, 0x8c, 0xff, 0x84, 0x79, 0x7c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7f, 0x72, 0x6c, 0xff, 0x7c, 0x72, 0x64, 0xff, 0x94, 0x8b, 0x84, 0xff, 0xda, 0xd4, 0xc4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xf2, 0xe9, 0xdc, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xf4, 0xf8, 0xe4, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x78, 0x66, 0x64, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x8c, 0x81, 0x84, 0xff, 0x81, 0x72, 0x74, 0xff, 0x81, 0x72, 0x74, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x63, 0x6a, 0x64, 0xff, 0x84, 0x7e, 0x74, 0xff, 0xc2, 0xbe, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0xc9, 0xc0, 0xb4, 0xff, 0xf4, 0xea, 0xe4, 0xff, 0xf4, 0xf2, 0xe4, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x63, 0x66, 0x64, 0xff, 0x63, 0x66, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x81, 0x72, 0x74, 0xff, 0x84, 0x77, 0x74, 0xff, 0x77, 0x66, 0x6c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x71, 0x72, 0x6c, 0xff, 0xb1, 0xaa, 0xa4, 0xff, 0xd6, 0xc5, 0xbc, 0xff, 0x9a, 0x94, 0x94, 0xff, 0xd9, 0xd4, 0xcc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x6c, 0x61, 0x64, 0xff, 0x6c, 0x66, 0x6c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x84, 0x77, 0x74, 0xff, 0x89, 0x86, 0x84, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0xcc, 0xc2, 0xbc, 0xff, 0xe4, 0xe2, 0xd8, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x6f, 0x6c, 0x6c, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x71, 0x6a, 0x64, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x72, 0x62, 0x5c, 0xff, 0x88, 0x8a, 0x84, 0xff, 0xa8, 0x9b, 0x94, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x72, 0x5b, 0x54, 0xff, 0x78, 0x77, 0x74, 0xff, 0x8f, 0x86, 0x7c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x70, 0x5e, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x70, 0x66, 0x5c, 0xff, 0x63, 0x66, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x69, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x69, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x5d, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x5f, 0x62, 0x64, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x50, 0x4e, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x64, 0x4e, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x46, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x5d, 0x5a, 0x54, 0xff, 0x6b, 0x56, 0x5c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x5c, 0x3e, 0x34, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x53, 0x41, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x5d, 0x62, 0x5c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x58, 0x5c, 0x5c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x44, 0x47, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x58, 0x49, 0x4c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x53, 0x5a, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x34, 0x33, 0x34, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x4e, 0x4c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x30, 0x26, 0x24, 0xff, 0x34, 0x33, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x55, 0x55, 0x54, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x42, 0x42, 0x44, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x2c, 0x26, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x44, 0x47, 0x44, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x33, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x26, 0x24, 0xff, 0x30, 0x26, 0x24, 0xff, 0x3c, 0x2e, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x30, 0x2a, 0x24, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x55, 0x52, 0x4c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3c, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x53, 0x54, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4c, 0x52, 0x4c, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x55, 0x55, 0x54, 0xff, 0x4b, 0x4e, 0x4c, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x34, 0x32, 0x2c, 0xff, 0x33, 0x2c, 0x2c, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x4e, 0x42, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x34, 0x2e, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x34, 0xff, 0x44, 0x3a, 0x3c, 0xff, 0x42, 0x42, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, 0x49, 0x4a, 0x4c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3c, 0x35, 0x34, 0xff, 0x3b, 0x3a, 0x3c, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x44, 0x47, 0x44, 0xff, 0x44, 0x47, 0x44, 0xff, 0x4c, 0x47, 0x44, 0xff, }; #endif // WEBP_TESTS_FUZZER_IMG_PEAK_H_ libwebp-1.4.0/tests/fuzzer/animencoder_fuzzer.cc0000644000014400001440000001452414606317060016750 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include #include #include "./fuzz_utils.h" #include "src/webp/encode.h" #include "src/webp/mux.h" namespace { const VP8CPUInfo default_VP8GetCPUInfo = VP8GetCPUInfo; int AddFrame(WebPAnimEncoder** const enc, const WebPAnimEncoderOptions& anim_config, int* const width, int* const height, int timestamp_ms, const uint8_t data[], size_t size, uint32_t* const bit_pos) { if (enc == nullptr || width == nullptr || height == nullptr) { fprintf(stderr, "NULL parameters.\n"); if (enc != nullptr) WebPAnimEncoderDelete(*enc); abort(); } // Init the source picture. WebPPicture pic; if (!WebPPictureInit(&pic)) { fprintf(stderr, "WebPPictureInit failed.\n"); WebPAnimEncoderDelete(*enc); abort(); } pic.use_argb = Extract(1, data, size, bit_pos); // Read the source picture. if (!ExtractSourcePicture(&pic, data, size, bit_pos)) { const WebPEncodingError error_code = pic.error_code; WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "Can't read input image. Error code: %d\n", error_code); abort(); } // Crop and scale. if (*enc == nullptr) { // First frame will set canvas width and height. if (!ExtractAndCropOrScale(&pic, data, size, bit_pos)) { const WebPEncodingError error_code = pic.error_code; WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "ExtractAndCropOrScale failed. Error code: %d\n", error_code); abort(); } } else { // Other frames will be resized to the first frame's dimensions. if (!WebPPictureRescale(&pic, *width, *height)) { const WebPEncodingError error_code = pic.error_code; WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "WebPPictureRescale failed. Size: %d,%d. Error code: %d\n", *width, *height, error_code); abort(); } } // Create encoder if it doesn't exist. if (*enc == nullptr) { *width = pic.width; *height = pic.height; *enc = WebPAnimEncoderNew(*width, *height, &anim_config); if (*enc == nullptr) { WebPPictureFree(&pic); return 0; } } // Create frame encoding config. WebPConfig config; if (!ExtractWebPConfig(&config, data, size, bit_pos)) { fprintf(stderr, "ExtractWebPConfig failed.\n"); WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); abort(); } // Skip slow settings on big images, it's likely to timeout. if (pic.width * pic.height > 32 * 32) { config.method = (config.method > 4) ? 4 : config.method; config.quality = (config.quality > 99.0f) ? 99.0f : config.quality; config.alpha_quality = (config.alpha_quality > 99) ? 99 : config.alpha_quality; } // Encode. if (!WebPAnimEncoderAdd(*enc, &pic, timestamp_ms, &config)) { const WebPEncodingError error_code = pic.error_code; WebPAnimEncoderDelete(*enc); WebPPictureFree(&pic); // Tolerate failures when running under the nallocfuzz engine as // WebPAnimEncoderAdd() may fail due to memory allocation errors outside of // the encoder; in muxer functions that return booleans for instance. if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY || error_code == VP8_ENC_ERROR_BAD_WRITE || getenv("NALLOC_FUZZ_VERSION") != nullptr) { return 0; } fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code); abort(); } WebPPictureFree(&pic); return 1; } } // namespace extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { WebPAnimEncoder* enc = nullptr; int width = 0, height = 0, timestamp_ms = 0; uint32_t bit_pos = 0; ExtractAndDisableOptimizations(default_VP8GetCPUInfo, data, size, &bit_pos); // Extract a configuration from the packed bits. WebPAnimEncoderOptions anim_config; if (!WebPAnimEncoderOptionsInit(&anim_config)) { fprintf(stderr, "WebPAnimEncoderOptionsInit failed.\n"); abort(); } anim_config.minimize_size = Extract(1, data, size, &bit_pos); anim_config.kmax = Extract(15, data, size, &bit_pos); const int min_kmin = (anim_config.kmax > 1) ? (anim_config.kmax / 2) : 0; const int max_kmin = (anim_config.kmax > 1) ? (anim_config.kmax - 1) : 0; anim_config.kmin = min_kmin + Extract((uint32_t)(max_kmin - min_kmin), data, size, &bit_pos); anim_config.allow_mixed = Extract(1, data, size, &bit_pos); anim_config.verbose = 0; const int nb_frames = 1 + Extract(15, data, size, &bit_pos); // For each frame. for (int i = 0; i < nb_frames; ++i) { if (!AddFrame(&enc, anim_config, &width, &height, timestamp_ms, data, size, &bit_pos)) { return 0; } timestamp_ms += (1 << (2 + Extract(15, data, size, &bit_pos))) + Extract(1, data, size, &bit_pos); // [1..131073], arbitrary } // Assemble. if (!WebPAnimEncoderAdd(enc, nullptr, timestamp_ms, nullptr)) { fprintf(stderr, "Last WebPAnimEncoderAdd failed: %s.\n", WebPAnimEncoderGetError(enc)); WebPAnimEncoderDelete(enc); abort(); } WebPData webp_data; WebPDataInit(&webp_data); // Tolerate failures when running under the nallocfuzz engine as allocations // during assembly may fail. if (!WebPAnimEncoderAssemble(enc, &webp_data) && getenv("NALLOC_FUZZ_VERSION") == nullptr) { fprintf(stderr, "WebPAnimEncoderAssemble failed: %s.\n", WebPAnimEncoderGetError(enc)); WebPAnimEncoderDelete(enc); WebPDataClear(&webp_data); abort(); } WebPAnimEncoderDelete(enc); WebPDataClear(&webp_data); return 0; } libwebp-1.4.0/tests/fuzzer/img_alpha.h0000644000014400001440000006456414606317060014653 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #ifndef WEBP_TESTS_FUZZER_IMG_ALPHA_H_ #define WEBP_TESTS_FUZZER_IMG_ALPHA_H_ #include static const int kImgAlphaWidth = 32; static const int kImgAlphaHeight = 32; /*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/ static const uint8_t kImgAlphaData[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xf9, 0xf5, 0xff, 0xfd, 0xf9, 0xf3, 0xff, 0xfd, 0xf8, 0xf2, 0xff, 0xfd, 0xf7, 0xf1, 0xff, 0xfc, 0xf7, 0xf0, 0xff, 0xfc, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfb, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf7, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfd, 0xf9, 0xf4, 0xff, 0xfd, 0xf8, 0xf2, 0xff, 0xfc, 0xf7, 0xf1, 0xff, 0xfc, 0xf7, 0xf0, 0xff, 0xfc, 0xf7, 0xef, 0xff, 0xfc, 0xf6, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0xfe, 0xfd, 0xfd, 0xff, 0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xf9, 0xf4, 0xff, 0xfe, 0xf8, 0xf3, 0xff, 0xfd, 0xf8, 0xf2, 0xff, 0xfc, 0xf7, 0xf1, 0xff, 0xfc, 0xf5, 0xf0, 0xff, 0xfc, 0xf6, 0xee, 0xff, 0xfc, 0xf5, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfc, 0xfb, 0xfb, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfe, 0xfd, 0xfb, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xf9, 0xf4, 0xff, 0xfe, 0xf9, 0xf3, 0xff, 0xfe, 0xf8, 0xf2, 0xff, 0xfd, 0xf7, 0xf1, 0xff, 0xfc, 0xf6, 0xf0, 0xff, 0xfc, 0xf6, 0xee, 0xff, 0xfc, 0xf5, 0xec, 0xff, 0xfb, 0xf5, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xfa, 0xf9, 0xf9, 0xff, 0xf7, 0xf6, 0xf6, 0xff, 0xfd, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xfa, 0xff, 0xfe, 0xfc, 0xf9, 0xff, 0xfe, 0xfb, 0xf9, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf3, 0xff, 0xfe, 0xfa, 0xf4, 0xfb, 0xfe, 0xf9, 0xf4, 0xeb, 0xfe, 0xfb, 0xf6, 0xdc, 0xfd, 0xfa, 0xf6, 0xcf, 0xfd, 0xfa, 0xf5, 0xcc, 0xfc, 0xf9, 0xf4, 0xcb, 0xfd, 0xf8, 0xf3, 0xc7, 0xfc, 0xf8, 0xf2, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfb, 0xfa, 0xfa, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf6, 0xf4, 0xf4, 0xff, 0xf7, 0xf5, 0xf5, 0xff, 0xf5, 0xf5, 0xf4, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xfd, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfb, 0xf7, 0xff, 0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfa, 0xf4, 0xff, 0xfd, 0xfa, 0xf4, 0xfc, 0xfe, 0xfc, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x94, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfa, 0xf9, 0xf9, 0xff, 0xf6, 0xf5, 0xf4, 0xff, 0xf5, 0xf3, 0xf3, 0xff, 0xf4, 0xf2, 0xf1, 0xff, 0xf2, 0xf1, 0xf0, 0xff, 0xf2, 0xf0, 0xf0, 0xff, 0xf0, 0xee, 0xee, 0xff, 0xf1, 0xf0, 0xef, 0xff, 0xfe, 0xfb, 0xf8, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfa, 0xf6, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfb, 0xf4, 0xff, 0xfe, 0xfb, 0xf5, 0xf3, 0xff, 0xfe, 0xfe, 0xb4, 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xa7, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfc, 0xfb, 0xfb, 0xff, 0xf9, 0xf8, 0xf8, 0xff, 0xf6, 0xf5, 0xf4, 0xff, 0xf3, 0xf1, 0xf1, 0xff, 0xf0, 0xed, 0xed, 0xff, 0xef, 0xec, 0xeb, 0xff, 0xee, 0xeb, 0xeb, 0xff, 0xf0, 0xee, 0xee, 0xff, 0xea, 0xe7, 0xe7, 0xff, 0xec, 0xe9, 0xe9, 0xff, 0xf5, 0xf2, 0xf0, 0xff, 0xfe, 0xfb, 0xf6, 0xff, 0xfe, 0xfb, 0xf5, 0xff, 0xfe, 0xfa, 0xf4, 0xff, 0xfe, 0xfb, 0xf6, 0xeb, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xab, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfc, 0xfc, 0xff, 0xfb, 0xfb, 0xfa, 0xff, 0xf8, 0xf6, 0xf6, 0xff, 0xf4, 0xf3, 0xf2, 0xff, 0xf2, 0xf0, 0xf0, 0xff, 0xef, 0xec, 0xeb, 0xff, 0xef, 0xec, 0xeb, 0xff, 0xeb, 0xe7, 0xe6, 0xff, 0xea, 0xe6, 0xe5, 0xff, 0xeb, 0xe8, 0xe8, 0xff, 0xe9, 0xe6, 0xe7, 0xff, 0xe5, 0xe2, 0xe2, 0xff, 0xed, 0xeb, 0xeb, 0xff, 0xf7, 0xf5, 0xf2, 0xff, 0xfe, 0xfa, 0xf5, 0xff, 0xfe, 0xfb, 0xf5, 0xf8, 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0x94, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf6, 0xf5, 0xf4, 0xff, 0xf3, 0xf1, 0xf0, 0xff, 0xf1, 0xef, 0xef, 0xff, 0xef, 0xed, 0xec, 0xff, 0xec, 0xe8, 0xe7, 0xff, 0xe9, 0xe6, 0xe6, 0xff, 0xec, 0xe9, 0xe9, 0xff, 0xe4, 0xe0, 0xdf, 0xff, 0xec, 0xe9, 0xe9, 0xff, 0xea, 0xe6, 0xe6, 0xff, 0xe6, 0xe2, 0xe2, 0xff, 0xea, 0xe8, 0xe8, 0xff, 0xec, 0xe8, 0xe7, 0xff, 0xfc, 0xf9, 0xf4, 0xff, 0xfe, 0xfd, 0xfa, 0xc3, 0xff, 0xff, 0xff, 0xa7, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8c, 0xfe, 0xfc, 0xf9, 0xa3, 0xfc, 0xfb, 0xf5, 0xb0, 0xfc, 0xf9, 0xf1, 0xbb, 0xfb, 0xf8, 0xf1, 0xb8, 0xfb, 0xf8, 0xef, 0xb4, 0xfb, 0xf9, 0xf2, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf5, 0xf3, 0xf3, 0xff, 0xf1, 0xef, 0xef, 0xff, 0xef, 0xec, 0xeb, 0xff, 0xeb, 0xe7, 0xe7, 0xff, 0xea, 0xe7, 0xe6, 0xff, 0xe7, 0xe3, 0xe2, 0xff, 0xe4, 0xdf, 0xde, 0xff, 0xe6, 0xe2, 0xe2, 0xff, 0xe4, 0xe1, 0xe0, 0xff, 0xe6, 0xe3, 0xe2, 0xff, 0xe0, 0xdc, 0xdc, 0xff, 0xe3, 0xdf, 0xdf, 0xff, 0xe8, 0xe5, 0xe5, 0xff, 0xe4, 0xe1, 0xe2, 0xff, 0xec, 0xe8, 0xe5, 0xf8, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x90, 0xfe, 0xfe, 0xfb, 0x9c, 0xfc, 0xf9, 0xef, 0xf7, 0xfc, 0xf8, 0xed, 0xff, 0xfc, 0xf7, 0xeb, 0xff, 0xfb, 0xf7, 0xeb, 0xff, 0xfa, 0xf6, 0xe9, 0xff, 0xfa, 0xf5, 0xe7, 0xff, 0xf8, 0xf4, 0xe5, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf1, 0xef, 0xee, 0xff, 0xed, 0xea, 0xe9, 0xff, 0xea, 0xe6, 0xe5, 0xff, 0xe7, 0xe3, 0xe2, 0xff, 0xe4, 0xe0, 0xdf, 0xff, 0xe3, 0xde, 0xdd, 0xff, 0xe2, 0xde, 0xdd, 0xff, 0xe5, 0xe1, 0xe1, 0xff, 0xde, 0xda, 0xda, 0xff, 0xe0, 0xdd, 0xdc, 0xff, 0xe1, 0xdd, 0xdd, 0xff, 0xe3, 0xe0, 0xdf, 0xff, 0xe4, 0xe1, 0xe1, 0xff, 0xe3, 0xe0, 0xe0, 0xff, 0xec, 0xea, 0xea, 0xe8, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8f, 0xfe, 0xfe, 0xfe, 0x8c, 0xfd, 0xfb, 0xef, 0xff, 0xfd, 0xfb, 0xed, 0xff, 0xfd, 0xf8, 0xec, 0xff, 0xfc, 0xf8, 0xeb, 0xff, 0xfc, 0xf7, 0xea, 0xff, 0xfb, 0xf6, 0xe9, 0xff, 0xfa, 0xf6, 0xe7, 0xff, 0xfa, 0xf5, 0xe5, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xf8, 0xf7, 0xf8, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0xf1, 0xf0, 0xf0, 0xff, 0xed, 0xec, 0xec, 0xff, 0xe9, 0xe6, 0xe5, 0xff, 0xe6, 0xe1, 0xe0, 0xff, 0xe2, 0xde, 0xdc, 0xff, 0xe0, 0xda, 0xd8, 0xff, 0xdd, 0xd7, 0xd5, 0xff, 0xde, 0xda, 0xd9, 0xff, 0xde, 0xda, 0xda, 0xff, 0xdc, 0xd7, 0xd8, 0xff, 0xdf, 0xdc, 0xdc, 0xff, 0xe5, 0xe3, 0xe4, 0xff, 0xe1, 0xde, 0xde, 0xff, 0xde, 0xdc, 0xdc, 0xff, 0xe9, 0xe7, 0xe8, 0xff, 0xe8, 0xe7, 0xe6, 0xe7, 0xff, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0x88, 0xfe, 0xfe, 0xfa, 0x9b, 0xfc, 0xfb, 0xee, 0xff, 0xfc, 0xfa, 0xed, 0xff, 0xfb, 0xfa, 0xeb, 0xff, 0xfb, 0xf8, 0xeb, 0xff, 0xfb, 0xf7, 0xea, 0xff, 0xfa, 0xf6, 0xe8, 0xff, 0xf8, 0xf6, 0xe6, 0xff, 0xf7, 0xf5, 0xe3, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xf7, 0xf6, 0xf7, 0xff, 0xf5, 0xf4, 0xf4, 0xff, 0xf0, 0xee, 0xef, 0xff, 0xe8, 0xe7, 0xe7, 0xff, 0xe7, 0xe4, 0xe3, 0xff, 0xe2, 0xdd, 0xdb, 0xff, 0xdf, 0xd9, 0xd7, 0xff, 0xdc, 0xd6, 0xd4, 0xff, 0xd8, 0xd2, 0xcf, 0xff, 0xd8, 0xd2, 0xd1, 0xff, 0xe0, 0xdc, 0xdc, 0xff, 0xdb, 0xd7, 0xd7, 0xff, 0xdb, 0xd7, 0xd7, 0xff, 0xe7, 0xe5, 0xe5, 0xff, 0xde, 0xda, 0xdb, 0xff, 0xdb, 0xd8, 0xd9, 0xff, 0xe0, 0xde, 0xde, 0xff, 0xed, 0xeb, 0xec, 0xe4, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x80, 0xfe, 0xfe, 0xfa, 0x94, 0xfd, 0xfb, 0xee, 0xff, 0xfd, 0xfb, 0xed, 0xff, 0xfc, 0xfb, 0xec, 0xff, 0xfc, 0xfa, 0xea, 0xff, 0xf8, 0xf7, 0xe9, 0xff, 0xf8, 0xf6, 0xe7, 0xff, 0xf7, 0xf7, 0xe5, 0xff, 0xf7, 0xf5, 0xe3, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xf5, 0xf4, 0xf4, 0xff, 0xf2, 0xf2, 0xf2, 0xff, 0xe9, 0xe6, 0xe6, 0xff, 0xe9, 0xe7, 0xe6, 0xff, 0xe9, 0xe7, 0xe7, 0xff, 0xe0, 0xdb, 0xda, 0xff, 0xda, 0xd3, 0xd2, 0xff, 0xd6, 0xd0, 0xce, 0xff, 0xd4, 0xcd, 0xcb, 0xff, 0xd0, 0xc8, 0xc7, 0xff, 0xd7, 0xd2, 0xd1, 0xff, 0xd8, 0xd3, 0xd3, 0xff, 0xd4, 0xd1, 0xd1, 0xff, 0xe6, 0xe3, 0xe2, 0xff, 0xdd, 0xda, 0xda, 0xff, 0xe3, 0xe1, 0xe1, 0xff, 0xe0, 0xde, 0xde, 0xff, 0xe7, 0xe5, 0xe5, 0xe3, 0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7b, 0xfe, 0xfe, 0xfb, 0x88, 0xfc, 0xfc, 0xef, 0xff, 0xfb, 0xfc, 0xee, 0xff, 0xfb, 0xfa, 0xeb, 0xff, 0xfa, 0xfa, 0xea, 0xff, 0xf9, 0xf9, 0xe7, 0xff, 0xf7, 0xf7, 0xe6, 0xff, 0xf6, 0xf5, 0xe5, 0xff, 0xf7, 0xf5, 0xe3, 0xff, 0xf8, 0xf7, 0xf7, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xf2, 0xf2, 0xf1, 0xff, 0xe8, 0xe6, 0xe6, 0xff, 0xe4, 0xe1, 0xe1, 0xff, 0xdd, 0xda, 0xda, 0xff, 0xe7, 0xe3, 0xe3, 0xff, 0xd6, 0xcf, 0xcd, 0xff, 0xd4, 0xcc, 0xca, 0xff, 0xcf, 0xc7, 0xc5, 0xff, 0xcc, 0xc3, 0xc1, 0xff, 0xd3, 0xce, 0xcc, 0xff, 0xd9, 0xd4, 0xd4, 0xff, 0xda, 0xd6, 0xd6, 0xff, 0xe3, 0xe1, 0xe0, 0xff, 0xdb, 0xd8, 0xd7, 0xff, 0xe4, 0xe2, 0xe2, 0xff, 0xe1, 0xde, 0xdf, 0xff, 0xe3, 0xe1, 0xe1, 0xf0, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0x78, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0xff, 0x6f, 0xfb, 0xfc, 0xed, 0xff, 0xfa, 0xfb, 0xed, 0xff, 0xfb, 0xfa, 0xeb, 0xff, 0xfa, 0xf9, 0xe9, 0xff, 0xfa, 0xf9, 0xe7, 0xff, 0xf8, 0xf9, 0xe7, 0xff, 0xf7, 0xf5, 0xe3, 0xff, 0xf7, 0xf4, 0xe1, 0xff, 0xf2, 0xf2, 0xf2, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0, 0xef, 0xff, 0xe5, 0xe3, 0xe3, 0xff, 0xdd, 0xd9, 0xd9, 0xff, 0xdf, 0xdc, 0xdc, 0xff, 0xe6, 0xe3, 0xe3, 0xff, 0xe1, 0xda, 0xdb, 0xff, 0xd2, 0xca, 0xc7, 0xff, 0xca, 0xc2, 0xc0, 0xff, 0xc7, 0xbe, 0xbc, 0xff, 0xc8, 0xc2, 0xc0, 0xff, 0xd2, 0xcf, 0xce, 0xff, 0xd5, 0xcf, 0xd0, 0xff, 0xd5, 0xd1, 0xd1, 0xff, 0xda, 0xd6, 0xd7, 0xff, 0xde, 0xdc, 0xdd, 0xff, 0xde, 0xdd, 0xdc, 0xff, 0xe2, 0xe0, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x6c, 0xff, 0xff, 0xff, 0x67, 0xfa, 0xfd, 0xed, 0xf8, 0xf9, 0xfc, 0xeb, 0xff, 0xf9, 0xfb, 0xea, 0xff, 0xf8, 0xf9, 0xe8, 0xff, 0xf7, 0xf9, 0xe6, 0xff, 0xf7, 0xf8, 0xe6, 0xff, 0xf6, 0xf5, 0xe4, 0xff, 0xf6, 0xf4, 0xe1, 0xff, 0xe7, 0xe7, 0xe7, 0xff, 0xe3, 0xe4, 0xe3, 0xff, 0xe1, 0xe2, 0xe2, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xd7, 0xd6, 0xd5, 0xff, 0xd5, 0xd4, 0xd4, 0xff, 0xdd, 0xdc, 0xdc, 0xff, 0xdc, 0xda, 0xda, 0xff, 0xd0, 0xc9, 0xc9, 0xff, 0xc9, 0xbf, 0xbe, 0xff, 0xc2, 0xba, 0xb8, 0xff, 0xc0, 0xb8, 0xb6, 0xff, 0xcc, 0xc7, 0xc7, 0xff, 0xd2, 0xcd, 0xcd, 0xff, 0xd2, 0xce, 0xcf, 0xff, 0xd1, 0xcc, 0xcd, 0xff, 0xdf, 0xde, 0xde, 0xff, 0xe7, 0xe6, 0xe6, 0xff, 0xe4, 0xe3, 0xe3, 0xff, 0xfd, 0xfd, 0xfd, 0x78, 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0x6b, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0x60, 0xfc, 0xfe, 0xef, 0xcf, 0xf9, 0xfc, 0xec, 0xff, 0xfa, 0xfa, 0xe9, 0xff, 0xf8, 0xfa, 0xe8, 0xff, 0xf7, 0xf7, 0xe5, 0xff, 0xf6, 0xf7, 0xe5, 0xff, 0xf5, 0xf5, 0xe3, 0xff, 0xf6, 0xf4, 0xe0, 0xff, 0xdc, 0xdd, 0xdd, 0xff, 0xdb, 0xdc, 0xdc, 0xff, 0xd3, 0xd4, 0xd4, 0xff, 0xd8, 0xd8, 0xd8, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xca, 0xcb, 0xcb, 0xff, 0xcc, 0xcc, 0xcd, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xc6, 0xc1, 0xc1, 0xff, 0xc0, 0xbc, 0xba, 0xff, 0xba, 0xb1, 0xaf, 0xff, 0xc5, 0xbf, 0xc0, 0xff, 0xd6, 0xd2, 0xd2, 0xff, 0xc4, 0xbf, 0xbf, 0xff, 0xd3, 0xce, 0xcd, 0xff, 0xd3, 0xd1, 0xd2, 0xff, 0xe3, 0xe2, 0xe2, 0xff, 0xe6, 0xe4, 0xe4, 0xff, 0xee, 0xee, 0xed, 0x9b, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0x5b, 0xfd, 0xfe, 0xf6, 0x80, 0xf9, 0xfc, 0xeb, 0xff, 0xf7, 0xfa, 0xeb, 0xff, 0xf7, 0xf9, 0xe9, 0xff, 0xf6, 0xf8, 0xe8, 0xff, 0xf6, 0xf7, 0xe5, 0xff, 0xf5, 0xf4, 0xe4, 0xff, 0xf5, 0xf4, 0xe3, 0xff, 0xd7, 0xd8, 0xd8, 0xff, 0xd4, 0xd5, 0xd4, 0xff, 0xd2, 0xd3, 0xd3, 0xff, 0xcf, 0xd0, 0xd0, 0xff, 0xcc, 0xce, 0xcd, 0xff, 0xc9, 0xca, 0xca, 0xff, 0xc5, 0xc6, 0xc6, 0xff, 0xc3, 0xc4, 0xc4, 0xff, 0xbf, 0xbf, 0xbd, 0xff, 0xbe, 0xbf, 0xbf, 0xff, 0xba, 0xba, 0xba, 0xff, 0xb4, 0xb1, 0xb1, 0xff, 0xbb, 0xba, 0xb9, 0xff, 0xc9, 0xc8, 0xc7, 0xff, 0xe2, 0xde, 0xde, 0xff, 0xc1, 0xbd, 0xbd, 0xff, 0xd6, 0xd5, 0xd5, 0xff, 0xde, 0xdd, 0xdc, 0xff, 0xdc, 0xda, 0xda, 0xff, 0xe6, 0xe5, 0xe5, 0xcf, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0x5c, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, 0x4f, 0xf9, 0xfc, 0xeb, 0xfb, 0xf6, 0xf9, 0xeb, 0xff, 0xf6, 0xf9, 0xea, 0xff, 0xf6, 0xf9, 0xe8, 0xff, 0xf5, 0xf5, 0xe4, 0xff, 0xf6, 0xf6, 0xe4, 0xff, 0xf5, 0xf4, 0xe2, 0xff, 0xd3, 0xd4, 0xd4, 0xff, 0xcc, 0xcd, 0xcd, 0xff, 0xce, 0xcf, 0xcf, 0xff, 0xc9, 0xcb, 0xcb, 0xff, 0xc6, 0xc7, 0xc7, 0xff, 0xc3, 0xc5, 0xc4, 0xff, 0xc0, 0xc1, 0xc1, 0xff, 0xbb, 0xbd, 0xbc, 0xff, 0xb7, 0xb9, 0xb8, 0xff, 0xb6, 0xb7, 0xb7, 0xff, 0xb4, 0xb7, 0xb6, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xb0, 0xb2, 0xb2, 0xff, 0xb5, 0xb5, 0xb5, 0xff, 0xc1, 0xc0, 0xc0, 0xff, 0xc9, 0xc6, 0xc7, 0xff, 0xb3, 0xad, 0xae, 0xff, 0xcf, 0xcd, 0xce, 0xff, 0xe3, 0xe2, 0xe2, 0xff, 0xe4, 0xe2, 0xe2, 0xff, 0xfd, 0xfd, 0xfd, 0x60, 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, 0xff, 0x47, 0xfa, 0xfb, 0xef, 0xa8, 0xf8, 0xfc, 0xed, 0xff, 0xf7, 0xf9, 0xea, 0xff, 0xf6, 0xf7, 0xe7, 0xff, 0xf6, 0xf4, 0xe7, 0xff, 0xf5, 0xf4, 0xe5, 0xff, 0xf4, 0xf3, 0xe3, 0xff, 0xce, 0xcf, 0xcf, 0xff, 0xc8, 0xc9, 0xc9, 0xff, 0xc6, 0xc8, 0xc8, 0xff, 0xc4, 0xc6, 0xc6, 0xff, 0xc2, 0xc3, 0xc3, 0xff, 0xba, 0xbd, 0xbc, 0xff, 0xbc, 0xbe, 0xbe, 0xff, 0xb5, 0xb8, 0xb7, 0xff, 0xb4, 0xb6, 0xb5, 0xff, 0xb0, 0xb2, 0xb2, 0xff, 0xaf, 0xb1, 0xb0, 0xff, 0xaa, 0xad, 0xac, 0xff, 0xaa, 0xad, 0xac, 0xff, 0xa7, 0xa9, 0xa8, 0xff, 0xa4, 0xa5, 0xa5, 0xff, 0xa7, 0xa8, 0xa8, 0xff, 0xc4, 0xc3, 0xc3, 0xff, 0xb8, 0xb7, 0xb7, 0xff, 0xc0, 0xbf, 0xbe, 0xff, 0xd0, 0xce, 0xce, 0xff, 0xe3, 0xe2, 0xe2, 0x94, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x40, 0xed, 0xe7, 0xe6, 0x48, 0xba, 0xad, 0xa1, 0xff, 0xd6, 0xcf, 0xc1, 0xff, 0xf4, 0xf3, 0xe4, 0xff, 0xf5, 0xf4, 0xe5, 0xff, 0xf5, 0xf3, 0xe5, 0xff, 0xf5, 0xf5, 0xe5, 0xff, 0xc7, 0xc9, 0xc8, 0xff, 0xc5, 0xc6, 0xc6, 0xff, 0xc1, 0xc2, 0xc2, 0xff, 0xbd, 0xbe, 0xbe, 0xff, 0xba, 0xbc, 0xbb, 0xff, 0xb3, 0xb4, 0xb4, 0xff, 0xb2, 0xb5, 0xb4, 0xff, 0xb1, 0xb4, 0xb3, 0xff, 0xac, 0xaf, 0xae, 0xff, 0xa8, 0xaa, 0xa9, 0xff, 0xa8, 0xab, 0xaa, 0xff, 0xa1, 0xa4, 0xa3, 0xff, 0xa1, 0xa4, 0xa3, 0xff, 0xa3, 0xa5, 0xa4, 0xff, 0x9f, 0xa1, 0xa0, 0xff, 0x99, 0x9b, 0x9a, 0xff, 0x98, 0x9a, 0x9a, 0xff, 0x97, 0x9a, 0x99, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0x9f, 0xa0, 0x9f, 0xe8, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3b, 0xff, 0xff, 0xff, 0x34, 0xbb, 0xa7, 0xa5, 0xd8, 0xb9, 0xa9, 0xa6, 0xff, 0xb9, 0xac, 0xa0, 0xff, 0xf8, 0xfa, 0xe7, 0xff, 0xf5, 0xf4, 0xe6, 0xff, 0xf4, 0xf3, 0xe4, 0xff, 0xc0, 0xc0, 0xbf, 0xff, 0xbb, 0xbb, 0xbb, 0xff, 0xbb, 0xbc, 0xbb, 0xff, 0xb6, 0xb6, 0xb6, 0xff, 0xb0, 0xb1, 0xb1, 0xff, 0xad, 0xad, 0xad, 0xff, 0xa8, 0xa7, 0xa7, 0xff, 0xa8, 0xa9, 0xa9, 0xff, 0xa5, 0xa6, 0xa6, 0xff, 0xa4, 0xa6, 0xa5, 0xff, 0xa3, 0xa6, 0xa6, 0xff, 0x9b, 0x9d, 0x9c, 0xff, 0x96, 0x99, 0x99, 0xff, 0x9b, 0x9d, 0x9d, 0xff, 0x97, 0x99, 0x98, 0xff, 0x8e, 0x91, 0x91, 0xff, 0x98, 0x9b, 0x9b, 0xff, 0x89, 0x8c, 0x8b, 0xff, 0x87, 0x8b, 0x89, 0xff, 0x84, 0x7f, 0x81, 0xff, 0x82, 0x82, 0x83, 0xff, 0xc0, 0xbe, 0xbf, 0x67, 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0x37, 0xff, 0xff, 0xff, 0x33, 0xff, 0xff, 0xff, 0x2f, 0xc6, 0xbb, 0xb9, 0x50, 0xac, 0x9c, 0x99, 0xff, 0xa8, 0x98, 0x91, 0xff, 0xbd, 0xb0, 0xa5, 0xff, 0xf6, 0xf5, 0xe6, 0xff, 0xf4, 0xf3, 0xe4, 0xff, 0xbb, 0xbb, 0xba, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0xb3, 0xb4, 0xb4, 0xff, 0xae, 0xaf, 0xae, 0xff, 0xad, 0xae, 0xae, 0xff, 0xb2, 0xb4, 0xb4, 0xfc, 0xa8, 0xa8, 0xa9, 0xf3, 0xa7, 0xa7, 0xa7, 0xf3, 0x9e, 0x9f, 0x9d, 0xfc, 0x9b, 0x9c, 0x9a, 0xff, 0x9c, 0x9e, 0x9e, 0xff, 0x94, 0x96, 0x94, 0xff, 0x90, 0x90, 0x90, 0xff, 0x96, 0x98, 0x99, 0xff, 0x8d, 0x8f, 0x8e, 0xff, 0x83, 0x83, 0x84, 0xff, 0x8f, 0x92, 0x91, 0xff, 0x83, 0x85, 0x85, 0xff, 0x87, 0x87, 0x87, 0xff, 0x7c, 0x7d, 0x7d, 0xff, 0x78, 0x74, 0x72, 0xff, 0x95, 0x93, 0x92, 0x97, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0x27, 0xff, 0xff, 0xff, 0x23, 0xa2, 0x93, 0x94, 0xe7, 0x96, 0x83, 0x81, 0xff, 0xa8, 0x91, 0x8b, 0xff, 0xc4, 0xbc, 0xb2, 0xff, 0xf5, 0xf5, 0xe4, 0xff, 0xb7, 0xb9, 0xb8, 0xff, 0xaf, 0xaf, 0xae, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xac, 0xad, 0xae, 0xff, 0xa8, 0xaa, 0xa9, 0xff, 0xae, 0xaf, 0xaf, 0xec, 0xc6, 0xc7, 0xc7, 0xb4, 0xc5, 0xc6, 0xc6, 0xb3, 0x9a, 0x99, 0x99, 0xeb, 0x91, 0x91, 0x90, 0xff, 0x94, 0x95, 0x95, 0xff, 0x95, 0x96, 0x96, 0xff, 0x8c, 0x8e, 0x8e, 0xff, 0x86, 0x88, 0x87, 0xff, 0x83, 0x82, 0x82, 0xff, 0x80, 0x81, 0x81, 0xff, 0x82, 0x84, 0x84, 0xff, 0x7b, 0x79, 0x7a, 0xff, 0x73, 0x74, 0x73, 0xff, 0x79, 0x7a, 0x7b, 0xff, 0x75, 0x73, 0x72, 0xff, 0x6f, 0x70, 0x6e, 0xfc, 0xe8, 0xe7, 0xe7, 0x37, 0xff, 0xff, 0xff, 0x2b, 0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0x1c, 0x70, 0x6e, 0x6d, 0xeb, 0x6c, 0x69, 0x66, 0xff, 0x83, 0x78, 0x7b, 0xff, 0x83, 0x7f, 0x78, 0xff, 0xdc, 0xd5, 0xcd, 0xff, 0xb3, 0xb5, 0xb4, 0xff, 0xa9, 0xa9, 0xaa, 0xff, 0xa7, 0xa8, 0xa7, 0xff, 0xa7, 0xa8, 0xa7, 0xff, 0xa6, 0xa8, 0xa8, 0xff, 0xab, 0xac, 0xab, 0xe3, 0xdb, 0xdc, 0xdc, 0x97, 0xd9, 0xda, 0xda, 0x93, 0x99, 0x99, 0x98, 0xe0, 0x94, 0x95, 0x95, 0xff, 0x8e, 0x8f, 0x8e, 0xff, 0x8f, 0x93, 0x92, 0xff, 0x88, 0x8a, 0x89, 0xff, 0x79, 0x78, 0x78, 0xff, 0x80, 0x82, 0x82, 0xff, 0x7f, 0x81, 0x81, 0xff, 0x7f, 0x7d, 0x7e, 0xff, 0x76, 0x72, 0x72, 0xff, 0x70, 0x70, 0x70, 0xff, 0x73, 0x73, 0x73, 0xff, 0x67, 0x66, 0x64, 0xff, 0x6b, 0x6b, 0x6a, 0xff, 0x70, 0x73, 0x72, 0xd4, 0xff, 0xff, 0xff, 0x23, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1b, 0x79, 0x74, 0x72, 0x67, 0x63, 0x61, 0x61, 0xff, 0x63, 0x62, 0x60, 0xff, 0x5e, 0x5c, 0x5a, 0xff, 0x61, 0x5f, 0x5c, 0xff, 0x6b, 0x63, 0x5e, 0xff, 0xae, 0xaf, 0xaf, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0x9c, 0x9b, 0x99, 0xff, 0x9d, 0x9c, 0x9b, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0x9c, 0x9c, 0x9d, 0xf7, 0xaa, 0xac, 0xac, 0xd4, 0xa5, 0xa7, 0xa6, 0xd3, 0x98, 0x9a, 0x9a, 0xf4, 0x8d, 0x8e, 0x8e, 0xff, 0x85, 0x85, 0x85, 0xff, 0x85, 0x86, 0x86, 0xff, 0x82, 0x84, 0x84, 0xff, 0x7b, 0x7b, 0x7b, 0xff, 0x7e, 0x82, 0x81, 0xff, 0x79, 0x7b, 0x7b, 0xff, 0x79, 0x7b, 0x7b, 0xff, 0x72, 0x73, 0x73, 0xff, 0x70, 0x6e, 0x6e, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0x61, 0x5f, 0x5d, 0xff, 0x5d, 0x5d, 0x5b, 0xff, 0x64, 0x60, 0x61, 0xff, 0x5e, 0x5d, 0x5d, 0xec, 0x6a, 0x69, 0x67, 0xa0, 0x67, 0x66, 0x64, 0xbc, 0x59, 0x56, 0x55, 0xff, 0x54, 0x51, 0x4e, 0xff, 0x56, 0x52, 0x51, 0xff, 0x55, 0x52, 0x4f, 0xff, 0x52, 0x4e, 0x49, 0xff, 0x54, 0x54, 0x52, 0xff, 0xa9, 0xac, 0xab, 0xff, 0xa1, 0xa0, 0xa0, 0xff, 0x9a, 0x99, 0x98, 0xff, 0x97, 0x97, 0x96, 0xff, 0x95, 0x94, 0x94, 0xff, 0x8e, 0x8c, 0x8c, 0xff, 0x95, 0x98, 0x97, 0xfc, 0x90, 0x91, 0x91, 0xfc, 0x95, 0x96, 0x96, 0xff, 0x86, 0x86, 0x86, 0xff, 0x81, 0x82, 0x80, 0xff, 0x7d, 0x7e, 0x7b, 0xff, 0x78, 0x79, 0x78, 0xff, 0x71, 0x70, 0x6e, 0xff, 0x72, 0x71, 0x70, 0xff, 0x72, 0x73, 0x72, 0xff, 0x70, 0x70, 0x6e, 0xff, 0x6d, 0x6a, 0x6a, 0xff, 0x64, 0x64, 0x63, 0xff, 0x69, 0x68, 0x67, 0xff, 0x61, 0x5f, 0x5e, 0xff, 0x59, 0x57, 0x57, 0xff, 0x5f, 0x5f, 0x5e, 0xff, 0x55, 0x55, 0x53, 0xff, 0x57, 0x58, 0x57, 0xff, 0x51, 0x53, 0x50, 0xff, 0x54, 0x51, 0x51, 0xff, 0x4c, 0x4b, 0x4a, 0xff, 0x49, 0x4a, 0x47, 0xff, 0x4f, 0x51, 0x4e, 0xff, 0x4f, 0x4d, 0x49, 0xff, 0x4c, 0x4b, 0x46, 0xff, 0xa7, 0xaa, 0xaa, 0xff, 0x99, 0x98, 0x98, 0xff, 0x95, 0x92, 0x92, 0xff, 0x94, 0x93, 0x92, 0xff, 0x8a, 0x87, 0x84, 0xff, 0x85, 0x80, 0x7f, 0xff, 0x8d, 0x90, 0x8f, 0xff, 0x85, 0x85, 0x85, 0xff, 0x8e, 0x8e, 0x8e, 0xff, 0x80, 0x80, 0x81, 0xff, 0x7c, 0x7d, 0x7b, 0xff, 0x79, 0x79, 0x78, 0xff, 0x78, 0x79, 0x78, 0xff, 0x6e, 0x6c, 0x6b, 0xff, 0x68, 0x66, 0x66, 0xff, 0x69, 0x6a, 0x67, 0xff, 0x60, 0x5e, 0x5d, 0xff, 0x5b, 0x58, 0x57, 0xff, 0x58, 0x56, 0x55, 0xff, 0x61, 0x5e, 0x5d, 0xff, 0x54, 0x53, 0x52, 0xff, 0x60, 0x5d, 0x5c, 0xff, 0x5b, 0x5b, 0x5a, 0xff, 0x59, 0x5a, 0x58, 0xff, 0x48, 0x43, 0x42, 0xff, 0x44, 0x40, 0x40, 0xff, 0x48, 0x46, 0x44, 0xff, 0x4a, 0x46, 0x46, 0xff, 0x4c, 0x4f, 0x4c, 0xff, 0x49, 0x4a, 0x48, 0xff, 0x47, 0x46, 0x41, 0xff, 0x44, 0x43, 0x3f, 0xff, 0xa2, 0xa4, 0xa4, 0xff, 0x96, 0x95, 0x96, 0xff, 0x8e, 0x8c, 0x8a, 0xff, 0x89, 0x86, 0x86, 0xff, 0x82, 0x7c, 0x7c, 0xff, 0x83, 0x80, 0x7f, 0xff, 0x82, 0x82, 0x80, 0xff, 0x82, 0x83, 0x81, 0xff, 0x82, 0x85, 0x85, 0xff, 0x7c, 0x7c, 0x7c, 0xff, 0x77, 0x78, 0x75, 0xff, 0x75, 0x77, 0x76, 0xff, 0x71, 0x72, 0x70, 0xff, 0x68, 0x66, 0x65, 0xff, 0x62, 0x60, 0x5f, 0xff, 0x5f, 0x5e, 0x5c, 0xff, 0x5a, 0x52, 0x4f, 0xff, 0x5b, 0x53, 0x4f, 0xff, 0x50, 0x49, 0x49, 0xff, 0x5c, 0x58, 0x57, 0xff, 0x50, 0x4b, 0x49, 0xff, 0x57, 0x54, 0x53, 0xff, 0x4f, 0x4f, 0x4e, 0xff, 0x53, 0x57, 0x55, 0xff, 0x48, 0x45, 0x44, 0xff, 0x3c, 0x33, 0x33, 0xff, 0x49, 0x45, 0x43, 0xff, 0x41, 0x3f, 0x3d, 0xff, 0x49, 0x46, 0x44, 0xff, 0x4a, 0x48, 0x47, 0xff, 0x3f, 0x3c, 0x3a, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x99, 0x9c, 0x9a, 0xff, 0x90, 0x8e, 0x8f, 0xff, 0x8c, 0x8b, 0x89, 0xff, 0x81, 0x7c, 0x7c, 0xff, 0x7d, 0x78, 0x78, 0xff, 0x82, 0x82, 0x80, 0xff, 0x77, 0x74, 0x73, 0xff, 0x75, 0x73, 0x73, 0xff, 0x78, 0x76, 0x76, 0xff, 0x70, 0x6f, 0x6f, 0xff, 0x6d, 0x6c, 0x6b, 0xff, 0x6e, 0x6f, 0x6d, 0xff, 0x68, 0x68, 0x66, 0xff, 0x5f, 0x5b, 0x5b, 0xff, 0x5b, 0x56, 0x56, 0xff, 0x5a, 0x58, 0x57, 0xff, 0x53, 0x49, 0x47, 0xff, 0x4e, 0x45, 0x43, 0xff, 0x49, 0x43, 0x41, 0xff, 0x5f, 0x5b, 0x5a, 0xff, 0x46, 0x3f, 0x3e, 0xff, 0x4b, 0x48, 0x47, 0xff, 0x42, 0x3f, 0x3f, 0xff, 0x4d, 0x50, 0x50, 0xff, 0x52, 0x52, 0x51, 0xff, 0x37, 0x31, 0x30, 0xff, 0x3d, 0x38, 0x37, 0xff, 0x3f, 0x39, 0x38, 0xff, 0x40, 0x3c, 0x3b, 0xff, 0x4a, 0x48, 0x47, 0xff, 0x3f, 0x3d, 0x3b, 0xff, 0x46, 0x45, 0x43, 0xff, }; #endif // WEBP_TESTS_FUZZER_IMG_ALPHA_H_ libwebp-1.4.0/tests/fuzzer/fuzz_utils.h0000644000014400001440000002064414606317060015137 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #ifndef WEBP_TESTS_FUZZER_FUZZ_UTILS_H_ #define WEBP_TESTS_FUZZER_FUZZ_UTILS_H_ #include #include #include "./img_alpha.h" #include "./img_grid.h" #include "./img_peak.h" #include "src/dsp/dsp.h" #include "src/webp/encode.h" //------------------------------------------------------------------------------ // Arbitrary limits to prevent OOM, timeout, or slow execution. // The decoded image size, and for animations additionally the canvas size. // Enabling some sanitizers slow down runtime significantly. // Use a very low threshold in this case to avoid timeouts. #if defined(__SANITIZE_ADDRESS__) // GCC static const size_t kFuzzPxLimit = 1024 * 1024 / 10; #elif !defined(__has_feature) // Clang static const size_t kFuzzPxLimit = 1024 * 1024; #elif __has_feature(address_sanitizer) || __has_feature(memory_sanitizer) static const size_t kFuzzPxLimit = 1024 * 1024 / 18; #else static const size_t kFuzzPxLimit = 1024 * 1024; #endif // Demuxed or decoded animation frames. static const int kFuzzFrameLimit = 3; // Reads and sums (up to) 128 spread-out bytes. static WEBP_INLINE uint8_t FuzzHash(const uint8_t* const data, size_t size) { uint8_t value = 0; size_t incr = size / 128; if (!incr) incr = 1; for (size_t i = 0; i < size; i += incr) value += data[i]; return value; } //------------------------------------------------------------------------------ // Extract an integer in [0, max_value]. static WEBP_INLINE uint32_t Extract(uint32_t max_value, const uint8_t data[], size_t size, uint32_t* const bit_pos) { uint32_t v = 0; uint32_t range = 1; while (*bit_pos < 8 * size && range <= max_value) { const uint8_t mask = 1u << (*bit_pos & 7); v = (v << 1) | !!(data[*bit_pos >> 3] & mask); range <<= 1; ++*bit_pos; } return v % (max_value + 1); } //------------------------------------------------------------------------------ // Some functions to override VP8GetCPUInfo and disable some optimizations. #ifdef __cplusplus extern "C" VP8CPUInfo VP8GetCPUInfo; #else extern VP8CPUInfo VP8GetCPUInfo; #endif static VP8CPUInfo GetCPUInfo; static WEBP_INLINE int GetCPUInfoNoSSE41(CPUFeature feature) { if (feature == kSSE4_1 || feature == kAVX) return 0; return GetCPUInfo(feature); } static WEBP_INLINE int GetCPUInfoNoAVX(CPUFeature feature) { if (feature == kAVX) return 0; return GetCPUInfo(feature); } static WEBP_INLINE int GetCPUInfoForceSlowSSSE3(CPUFeature feature) { if (feature == kSlowSSSE3 && GetCPUInfo(kSSE3)) { return 1; // we have SSE3 -> force SlowSSSE3 } return GetCPUInfo(feature); } static WEBP_INLINE int GetCPUInfoOnlyC(CPUFeature feature) { (void)feature; return 0; } static WEBP_INLINE void ExtractAndDisableOptimizations( VP8CPUInfo default_VP8GetCPUInfo, const uint8_t data[], size_t size, uint32_t* const bit_pos) { GetCPUInfo = default_VP8GetCPUInfo; const VP8CPUInfo kVP8CPUInfos[5] = {GetCPUInfoOnlyC, GetCPUInfoForceSlowSSSE3, GetCPUInfoNoSSE41, GetCPUInfoNoAVX, GetCPUInfo}; int VP8GetCPUInfo_index = Extract(4, data, size, bit_pos); VP8GetCPUInfo = kVP8CPUInfos[VP8GetCPUInfo_index]; } //------------------------------------------------------------------------------ static WEBP_INLINE int ExtractWebPConfig(WebPConfig* const config, const uint8_t data[], size_t size, uint32_t* const bit_pos) { if (config == NULL || !WebPConfigInit(config)) return 0; config->lossless = Extract(1, data, size, bit_pos); config->quality = Extract(100, data, size, bit_pos); config->method = Extract(6, data, size, bit_pos); config->image_hint = (WebPImageHint)Extract(WEBP_HINT_LAST - 1, data, size, bit_pos); config->segments = 1 + Extract(3, data, size, bit_pos); config->sns_strength = Extract(100, data, size, bit_pos); config->filter_strength = Extract(100, data, size, bit_pos); config->filter_sharpness = Extract(7, data, size, bit_pos); config->filter_type = Extract(1, data, size, bit_pos); config->autofilter = Extract(1, data, size, bit_pos); config->alpha_compression = Extract(1, data, size, bit_pos); config->alpha_filtering = Extract(2, data, size, bit_pos); config->alpha_quality = Extract(100, data, size, bit_pos); config->pass = 1 + Extract(9, data, size, bit_pos); config->show_compressed = 1; config->preprocessing = Extract(2, data, size, bit_pos); config->partitions = Extract(3, data, size, bit_pos); config->partition_limit = 10 * Extract(10, data, size, bit_pos); config->emulate_jpeg_size = Extract(1, data, size, bit_pos); config->thread_level = Extract(1, data, size, bit_pos); config->low_memory = Extract(1, data, size, bit_pos); config->near_lossless = 20 * Extract(5, data, size, bit_pos); config->exact = Extract(1, data, size, bit_pos); config->use_delta_palette = Extract(1, data, size, bit_pos); config->use_sharp_yuv = Extract(1, data, size, bit_pos); return WebPValidateConfig(config); } //------------------------------------------------------------------------------ static WEBP_INLINE int ExtractSourcePicture(WebPPicture* const pic, const uint8_t data[], size_t size, uint32_t* const bit_pos) { if (pic == NULL) return 0; // Pick a source picture. const uint8_t* kImagesData[] = { kImgAlphaData, kImgGridData, kImgPeakData }; const int kImagesWidth[] = { kImgAlphaWidth, kImgGridWidth, kImgPeakWidth }; const int kImagesHeight[] = { kImgAlphaHeight, kImgGridHeight, kImgPeakHeight }; const size_t kNbImages = sizeof(kImagesData) / sizeof(kImagesData[0]); const size_t image_index = Extract(kNbImages - 1, data, size, bit_pos); const uint8_t* const image_data = kImagesData[image_index]; pic->width = kImagesWidth[image_index]; pic->height = kImagesHeight[image_index]; pic->argb_stride = pic->width * 4 * sizeof(uint8_t); // Read the bytes. return WebPPictureImportRGBA(pic, image_data, pic->argb_stride); } //------------------------------------------------------------------------------ static WEBP_INLINE int Max(int a, int b) { return ((a < b) ? b : a); } static WEBP_INLINE int ExtractAndCropOrScale(WebPPicture* const pic, const uint8_t data[], size_t size, uint32_t* const bit_pos) { if (pic == NULL) return 0; #if !defined(WEBP_REDUCE_SIZE) const int alter_input = Extract(1, data, size, bit_pos); const int crop_or_scale = Extract(1, data, size, bit_pos); const int width_ratio = 1 + Extract(7, data, size, bit_pos); const int height_ratio = 1 + Extract(7, data, size, bit_pos); if (alter_input) { if (crop_or_scale) { const uint32_t left_ratio = 1 + Extract(7, data, size, bit_pos); const uint32_t top_ratio = 1 + Extract(7, data, size, bit_pos); const int cropped_width = Max(1, pic->width / width_ratio); const int cropped_height = Max(1, pic->height / height_ratio); const int cropped_left = (pic->width - cropped_width) / left_ratio; const int cropped_top = (pic->height - cropped_height) / top_ratio; return WebPPictureCrop(pic, cropped_left, cropped_top, cropped_width, cropped_height); } else { const int scaled_width = 1 + (pic->width * width_ratio) / 8; const int scaled_height = 1 + (pic->height * height_ratio) / 8; return WebPPictureRescale(pic, scaled_width, scaled_height); } } #else // defined(WEBP_REDUCE_SIZE) (void)data; (void)size; (void)bit_pos; #endif // !defined(WEBP_REDUCE_SIZE) return 1; } #endif // WEBP_TESTS_FUZZER_FUZZ_UTILS_H_ libwebp-1.4.0/tests/fuzzer/simple_api_fuzzer.c0000644000014400001440000000624614606317060016445 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include "./fuzz_utils.h" #include "src/webp/decode.h" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { int w, h; if (!WebPGetInfo(data, size, &w, &h)) return 0; if ((size_t)w * h > kFuzzPxLimit) return 0; const uint8_t value = FuzzHash(data, size); uint8_t* buf = NULL; // For *Into functions, which decode into an external buffer, an // intentionally too small buffer can be given with low probability. if (value < 0x16) { buf = WebPDecodeRGBA(data, size, &w, &h); } else if (value < 0x2b) { buf = WebPDecodeBGRA(data, size, &w, &h); #if !defined(WEBP_REDUCE_CSP) } else if (value < 0x40) { buf = WebPDecodeARGB(data, size, &w, &h); } else if (value < 0x55) { buf = WebPDecodeRGB(data, size, &w, &h); } else if (value < 0x6a) { buf = WebPDecodeBGR(data, size, &w, &h); #endif // !defined(WEBP_REDUCE_CSP) } else if (value < 0x7f) { uint8_t *u, *v; int stride, uv_stride; buf = WebPDecodeYUV(data, size, &w, &h, &u, &v, &stride, &uv_stride); } else if (value < 0xe8) { const int stride = (value < 0xbe ? 4 : 3) * w; size_t buf_size = stride * h; if (value % 0x10 == 0) buf_size--; uint8_t* const ext_buf = (uint8_t*)malloc(buf_size); if (value < 0x94) { (void)WebPDecodeRGBAInto(data, size, ext_buf, buf_size, stride); #if !defined(WEBP_REDUCE_CSP) } else if (value < 0xa9) { (void)WebPDecodeARGBInto(data, size, ext_buf, buf_size, stride); } else if (value < 0xbe) { (void)WebPDecodeBGRInto(data, size, ext_buf, buf_size, stride); } else if (value < 0xd3) { (void)WebPDecodeRGBInto(data, size, ext_buf, buf_size, stride); #endif // !defined(WEBP_REDUCE_CSP) } else { (void)WebPDecodeBGRAInto(data, size, ext_buf, buf_size, stride); } free(ext_buf); } else { size_t luma_size = w * h; const int uv_stride = (w + 1) / 2; size_t u_size = uv_stride * (h + 1) / 2; size_t v_size = uv_stride * (h + 1) / 2; if (value % 0x10 == 0) { if (size & 1) luma_size--; if (size & 2) u_size--; if (size & 4) v_size--; } uint8_t* const luma_buf = (uint8_t*)malloc(luma_size); uint8_t* const u_buf = (uint8_t*)malloc(u_size); uint8_t* const v_buf = (uint8_t*)malloc(v_size); (void)WebPDecodeYUVInto(data, size, luma_buf, luma_size, w /* luma_stride */, u_buf, u_size, uv_stride, v_buf, v_size, uv_stride); free(luma_buf); free(u_buf); free(v_buf); } if (buf) WebPFree(buf); return 0; } libwebp-1.4.0/tests/fuzzer/img_grid.h0000644000014400001440000001655614606317060014511 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #ifndef WEBP_TESTS_FUZZER_IMG_GRID_H_ #define WEBP_TESTS_FUZZER_IMG_GRID_H_ #include static const int kImgGridWidth = 16; static const int kImgGridHeight = 16; /*Pixel format: Red: 8 bit, Green: 8 bit, Blue: 8 bit, Fix 0xFF: 8 bit*/ static const uint8_t kImgGridData[] = { 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, }; #endif // WEBP_TESTS_FUZZER_IMG_GRID_H_ libwebp-1.4.0/tests/fuzzer/advanced_api_fuzzer.c0000644000014400001440000001305314606317060016713 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include #include #include "./fuzz_utils.h" #include "src/utils/rescaler_utils.h" #include "src/webp/decode.h" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { WebPDecoderConfig config; if (!WebPInitDecoderConfig(&config)) return 0; if (WebPGetFeatures(data, size, &config.input) != VP8_STATUS_OK) return 0; if ((size_t)config.input.width * config.input.height > kFuzzPxLimit) return 0; // Using two independent criteria ensures that all combinations of options // can reach each path at the decoding stage, with meaningful differences. const uint8_t value = FuzzHash(data, size); const float factor = value / 255.f; // 0-1 config.options.flip = value & 1; config.options.bypass_filtering = value & 2; config.options.no_fancy_upsampling = value & 4; config.options.use_threads = value & 8; if (size & 1) { config.options.use_cropping = 1; config.options.crop_width = (int)(config.input.width * (1 - factor)); config.options.crop_height = (int)(config.input.height * (1 - factor)); config.options.crop_left = config.input.width - config.options.crop_width; config.options.crop_top = config.input.height - config.options.crop_height; } if (size & 2) { int strength = (int)(factor * 100); config.options.dithering_strength = strength; config.options.alpha_dithering_strength = 100 - strength; } if (size & 4) { config.options.use_scaling = 1; config.options.scaled_width = (int)(config.input.width * factor * 2); config.options.scaled_height = (int)(config.input.height * factor * 2); } #if defined(WEBP_REDUCE_CSP) config.output.colorspace = (value & 1) ? ((value & 2) ? MODE_RGBA : MODE_BGRA) : ((value & 2) ? MODE_rgbA : MODE_bgrA); #else config.output.colorspace = (WEBP_CSP_MODE)(value % MODE_LAST); #endif // WEBP_REDUCE_CSP for (int i = 0; i < 2; ++i) { if (i == 1) { // Use the bitstream data to generate extreme ranges for the options. An // alternative approach would be to use a custom corpus containing webp // files prepended with sizeof(config.options) zeroes to allow the fuzzer // to modify these independently. const int data_offset = 50; if (data_offset + sizeof(config.options) >= size) break; memcpy(&config.options, data + data_offset, sizeof(config.options)); // Skip easily avoidable out-of-memory fuzzing errors. if (config.options.use_scaling) { int scaled_width = config.options.scaled_width; int scaled_height = config.options.scaled_height; if (WebPRescalerGetScaledDimensions(config.input.width, config.input.height, &scaled_width, &scaled_height)) { size_t fuzz_px_limit = kFuzzPxLimit; if (scaled_width != config.input.width || scaled_height != config.input.height) { // Using the WebPRescalerImport internally can significantly slow // down the execution. Avoid timeouts due to that. fuzz_px_limit /= 2; } // A big output canvas can lead to out-of-memory and timeout issues, // but a big internal working buffer can too. Also, rescaling from a // very wide input image to a very tall canvas can be as slow as // decoding a huge number of pixels. Avoid timeouts due to these. const uint64_t max_num_operations = (uint64_t)Max(scaled_width, config.input.width) * Max(scaled_height, config.input.height); if (max_num_operations > fuzz_px_limit) { break; } } } } if (size % 3) { // Decodes incrementally in chunks of increasing size. WebPIDecoder* idec = WebPIDecode(NULL, 0, &config); if (!idec) return 0; VP8StatusCode status; if (size & 8) { size_t available_size = value + 1; while (1) { if (available_size > size) available_size = size; status = WebPIUpdate(idec, data, available_size); if (status != VP8_STATUS_SUSPENDED || available_size == size) break; available_size *= 2; } } else { // WebPIAppend expects new data and its size with each call. // Implemented here by simply advancing the pointer into data. const uint8_t* new_data = data; size_t new_size = value + 1; while (1) { if (new_data + new_size > data + size) { new_size = data + size - new_data; } status = WebPIAppend(idec, new_data, new_size); if (status != VP8_STATUS_SUSPENDED || new_size == 0) break; new_data += new_size; new_size *= 2; } } WebPIDelete(idec); } else { (void)WebPDecode(data, size, &config); } WebPFreeDecBuffer(&config.output); } return 0; } libwebp-1.4.0/tests/fuzzer/animdecoder_fuzzer.cc0000644000014400001440000000426014606317060016732 0ustar // Copyright 2020 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include #include #include "imageio/imageio_util.h" #include "src/webp/decode.h" #include "src/webp/demux.h" #include "src/webp/mux_types.h" extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { // WebPAnimDecoderGetInfo() is too late to check the canvas size as // WebPAnimDecoderNew() will handle the allocations. const size_t kMaxNumBytes = 2684354560; // RSS (resident set size) limit. const size_t kMaxNumPixels = kMaxNumBytes / 4; // At most ARGB. const size_t kMaxNumPixelsSafe = kMaxNumPixels / 2; // Allow one buffer copy. WebPBitstreamFeatures features; if (WebPGetFeatures(data, size, &features) == VP8_STATUS_OK) { if (!ImgIoUtilCheckSizeArgumentsOverflow(features.width * 4, features.height) || static_cast(features.width) * features.height > kMaxNumPixelsSafe) { return 0; } } // decode everything as an animation WebPData webp_data = {data, size}; WebPAnimDecoder* const dec = WebPAnimDecoderNew(&webp_data, nullptr); if (dec == nullptr) return 0; WebPAnimInfo info; if (!WebPAnimDecoderGetInfo(dec, &info)) goto End; if (!ImgIoUtilCheckSizeArgumentsOverflow(info.canvas_width * 4, info.canvas_height)) { goto End; } while (WebPAnimDecoderHasMoreFrames(dec)) { uint8_t* buf; int timestamp; if (!WebPAnimDecoderGetNext(dec, &buf, ×tamp)) break; } End: WebPAnimDecoderDelete(dec); return 0; } libwebp-1.4.0/tests/fuzzer/enc_dec_fuzzer.cc0000644000014400001440000001232114606317060016035 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include #include #include "./fuzz_utils.h" #include "src/webp/decode.h" #include "src/webp/encode.h" namespace { const VP8CPUInfo default_VP8GetCPUInfo = VP8GetCPUInfo; } // namespace extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { uint32_t bit_pos = 0; ExtractAndDisableOptimizations(default_VP8GetCPUInfo, data, size, &bit_pos); // Init the source picture. WebPPicture pic; if (!WebPPictureInit(&pic)) { fprintf(stderr, "WebPPictureInit failed.\n"); abort(); } pic.use_argb = Extract(1, data, size, &bit_pos); // Read the source picture. if (!ExtractSourcePicture(&pic, data, size, &bit_pos)) { const WebPEncodingError error_code = pic.error_code; WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "Can't read input image. Error code: %d\n", error_code); abort(); } // Crop and scale. if (!ExtractAndCropOrScale(&pic, data, size, &bit_pos)) { const WebPEncodingError error_code = pic.error_code; WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0; fprintf(stderr, "ExtractAndCropOrScale failed. Error code: %d\n", error_code); abort(); } // Extract a configuration from the packed bits. WebPConfig config; if (!ExtractWebPConfig(&config, data, size, &bit_pos)) { fprintf(stderr, "ExtractWebPConfig failed.\n"); abort(); } // Skip slow settings on big images, it's likely to timeout. if (pic.width * pic.height > 32 * 32) { if (config.lossless) { if (config.quality > 99.0f && config.method >= 5) { config.quality = 99.0f; config.method = 5; } } else { if (config.quality > 99.0f && config.method == 6) { config.quality = 99.0f; } } if (config.alpha_quality == 100 && config.method == 6) { config.alpha_quality = 99; } } // Encode. WebPMemoryWriter memory_writer; WebPMemoryWriterInit(&memory_writer); pic.writer = WebPMemoryWrite; pic.custom_ptr = &memory_writer; if (!WebPEncode(&config, &pic)) { const WebPEncodingError error_code = pic.error_code; WebPMemoryWriterClear(&memory_writer); WebPPictureFree(&pic); if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY || error_code == VP8_ENC_ERROR_BAD_WRITE) { return 0; } fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code); abort(); } // Try decoding the result. const uint8_t* const out_data = memory_writer.mem; const size_t out_size = memory_writer.size; WebPDecoderConfig dec_config; if (!WebPInitDecoderConfig(&dec_config)) { fprintf(stderr, "WebPInitDecoderConfig failed.\n"); WebPMemoryWriterClear(&memory_writer); WebPPictureFree(&pic); abort(); } dec_config.output.colorspace = MODE_BGRA; const VP8StatusCode status = WebPDecode(out_data, out_size, &dec_config); if ((status != VP8_STATUS_OK && status != VP8_STATUS_OUT_OF_MEMORY && status != VP8_STATUS_USER_ABORT) || (status == VP8_STATUS_OK && (dec_config.output.width != pic.width || dec_config.output.height != pic.height))) { fprintf(stderr, "WebPDecode failed. status: %d.\n", status); WebPFreeDecBuffer(&dec_config.output); WebPMemoryWriterClear(&memory_writer); WebPPictureFree(&pic); abort(); } if (status == VP8_STATUS_OK) { const uint8_t* const rgba = dec_config.output.u.RGBA.rgba; const int w = dec_config.output.width; const int h = dec_config.output.height; // Compare the results if exact encoding. if (pic.use_argb && config.lossless && config.near_lossless == 100) { const uint32_t* src1 = (const uint32_t*)rgba; const uint32_t* src2 = pic.argb; for (int y = 0; y < h; ++y, src1 += w, src2 += pic.argb_stride) { for (int x = 0; x < w; ++x) { uint32_t v1 = src1[x], v2 = src2[x]; if (!config.exact) { if ((v1 & 0xff000000u) == 0 || (v2 & 0xff000000u) == 0) { // Only keep alpha for comparison of fully transparent area. v1 &= 0xff000000u; v2 &= 0xff000000u; } } if (v1 != v2) { fprintf(stderr, "Lossless compression failed pixel-exactness.\n"); WebPFreeDecBuffer(&dec_config.output); WebPMemoryWriterClear(&memory_writer); WebPPictureFree(&pic); abort(); } } } } } WebPFreeDecBuffer(&dec_config.output); WebPMemoryWriterClear(&memory_writer); WebPPictureFree(&pic); return 0; } libwebp-1.4.0/tests/fuzzer/fuzz.dict0000644000014400001440000000026614606317060014411 0ustar # https://developers.google.com/speed/webp/docs/riff_container # FourCC "ALPH" "ANIM" "ANMF" "EXIF" "ICCP" "RIFF" "VP8 " "VP8L" "VP8X" "WEBP" "XMP " # VP8 signature "\x9D\x01\x2A" libwebp-1.4.0/tests/fuzzer/animation_api_fuzzer.c0000644000014400001440000000500414606317060017122 0ustar // Copyright 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// #include "./fuzz_utils.h" #include "src/webp/decode.h" #include "src/webp/demux.h" #include "src/webp/mux_types.h" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) { WebPData webp_data; WebPDataInit(&webp_data); webp_data.size = size; webp_data.bytes = data; // WebPAnimDecoderNew uses WebPDemux internally to calloc canvas size. WebPDemuxer* const demux = WebPDemux(&webp_data); if (!demux) return 0; const uint32_t cw = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); const uint32_t ch = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); if ((size_t)cw * ch > kFuzzPxLimit) { WebPDemuxDelete(demux); return 0; } // In addition to canvas size, check each frame separately. WebPIterator iter; for (int i = 0; i < kFuzzFrameLimit; i++) { if (!WebPDemuxGetFrame(demux, i + 1, &iter)) break; int w, h; if (WebPGetInfo(iter.fragment.bytes, iter.fragment.size, &w, &h)) { if ((size_t)w * h > kFuzzPxLimit) { // image size of the frame payload WebPDemuxReleaseIterator(&iter); WebPDemuxDelete(demux); return 0; } } } WebPDemuxReleaseIterator(&iter); WebPDemuxDelete(demux); WebPAnimDecoderOptions dec_options; if (!WebPAnimDecoderOptionsInit(&dec_options)) return 0; dec_options.use_threads = size & 1; // Animations only support 4 (of 12) modes. dec_options.color_mode = (WEBP_CSP_MODE)(size % MODE_LAST); if (dec_options.color_mode != MODE_BGRA && dec_options.color_mode != MODE_rgbA && dec_options.color_mode != MODE_bgrA) { dec_options.color_mode = MODE_RGBA; } WebPAnimDecoder* dec = WebPAnimDecoderNew(&webp_data, &dec_options); if (!dec) return 0; for (int i = 0; i < kFuzzFrameLimit; i++) { uint8_t* buf; int timestamp; if (!WebPAnimDecoderGetNext(dec, &buf, ×tamp)) break; } WebPAnimDecoderDelete(dec); return 0; } libwebp-1.4.0/tests/README.md0000644000014400001440000000077614606317060012506 0ustar # Tests This is a collection of tests for the libwebp libraries, currently covering fuzzing through the APIs. Additional test vector coverage can be found at: https://chromium.googlesource.com/webm/libwebp-test-data ## Building ### Fuzzers Follow the [build instructions](../doc/building.md) for libwebp, optionally adding build flags for various sanitizers (e.g., -fsanitize=address). `fuzzer/makefile.unix` can then be used to compile the fuzzer targets: ```shell $ make -C fuzzer -f makefile.unix ``` libwebp-1.4.0/build.gradle0000644000014400001440000002657314606317060012347 0ustar // Define dependencies. buildscript { repositories { maven { url "https://jcenter.bintray.com" } } dependencies { classpath "com.android.tools.build:gradle:${ANDROID_GRADLE_PLUGIN_VERSION}" } } // Define versions in the project. project.ext { buildToolsVersion = "${BUILD_TOOLS_VERSION}" compileSdkVersion = COMPILE_SDK_VERSION.toInteger() } // Core libraries and executables. apply plugin: "c" def NEON model { buildTypes { debug release } platforms { arm { architecture "arm" } arm64 { architecture "arm64" } x86 { architecture "x86" } x64 { architecture "x86_64" } mips32r2 mips32r5 mips64r6 } toolChains { gcc(Gcc) { target("mips32r2") { cCompiler.args "-mips32r2" } target("mips32r5") { cCompiler.args "-mips32r5" } target("mips64r6") { cCompiler.args "-mips64r6" } } } binaries { all { if (toolChain in Gcc) { cCompiler.args "-fPIC" cCompiler.args "-Wall" cCompiler.define "ANDROID" cCompiler.define "HAVE_MALLOC_H" } // Optimizations. if (buildType == buildTypes.release) { if (toolChain in Gcc) { cCompiler.args "-finline-functions" cCompiler.args "-ffast-math" cCompiler.args "-ffunction-sections" cCompiler.args "-fdata-sections" } if (toolChain in Clang) { cCompiler.args "-frename-registers -s" } } // mips32 fails to build with clang from r14b // https://bugs.chromium.org/p/webp/issues/detail?id=343 if (toolChain in Clang) { if (getTargetPlatform() == "mips") { cCompiler.args "-no-integrated-as" } } // Check for NEON usage. if (getTargetPlatform() == "arm") { NEON = "c.neon" cCompiler.define "HAVE_CPU_FEATURES_H" } else { NEON = "c" } cCompiler.args "-I" + file(".").absolutePath } // Link to pthread for shared libraries. withType(SharedLibraryBinarySpec) { if (toolChain in Gcc) { cCompiler.define "HAVE_PTHREAD" cCompiler.define "WEBP_USE_THREAD" linker.args "-pthread" } } } components { webp(NativeLibrarySpec) { sources { c { source { srcDir "sharpyuv" include "sharpyuv.c" include "sharpyuv_cpu.c" include "sharpyuv_csp.c" include "sharpyuv_dsp.c" include "sharpyuv_gamma.c" include "sharpyuv_neon.c" include "sharpyuv_sse2.c" srcDir "src/dec" include "alpha_dec.c" include "buffer_dec.c" include "frame_dec.c" include "idec_dec.c" include "io_dec.c" include "quant_dec.c" include "tree_dec.c" include "vp8_dec.c" include "vp8l_dec.c" include "webp_dec.c" srcDir "src/dsp" include "alpha_processing.c" include "alpha_processing_mips_dsp_r2.c" include "alpha_processing_neon.$NEON" include "alpha_processing_sse2.c" include "alpha_processing_sse41.c" include "cpu.c" include "dec.c" include "dec_clip_tables.c" include "dec_mips32.c" include "dec_mips_dsp_r2.c" include "dec_msa.c" include "dec_neon.$NEON" include "dec_sse2.c" include "dec_sse41.c" include "filters.c" include "filters_mips_dsp_r2.c" include "filters_msa.c" include "filters_neon.$NEON" include "filters_sse2.c" include "lossless.c" include "lossless_mips_dsp_r2.c" include "lossless_msa.c" include "lossless_neon.$NEON" include "lossless_sse2.c" include "lossless_sse41.c" include "rescaler.c" include "rescaler_mips32.c" include "rescaler_mips_dsp_r2.c" include "rescaler_msa.c" include "rescaler_neon.$NEON" include "rescaler_sse2.c" include "upsampling.c" include "upsampling_mips_dsp_r2.c" include "upsampling_msa.c" include "upsampling_neon.$NEON" include "upsampling_sse2.c" include "upsampling_sse41.c" include "yuv.c" include "yuv_mips32.c" include "yuv_mips_dsp_r2.c" include "yuv_neon.$NEON" include "yuv_sse2.c" include "yuv_sse41.c" srcDir "src/utils" include "bit_reader_utils.c" include "color_cache_utils.c" include "filters_utils.c" include "huffman_utils.c" include "palette.c" include "quant_levels_dec_utils.c" include "random_utils.c" include "rescaler_utils.c" include "thread_utils.c" include "utils.c" srcDir "src/dsp" include "cost.c" include "cost_mips32.c" include "cost_mips_dsp_r2.c" include "cost_neon.$NEON" include "cost_sse2.c" include "enc.c" include "enc_mips32.c" include "enc_mips_dsp_r2.c" include "enc_msa.c" include "enc_neon.$NEON" include "enc_sse2.c" include "enc_sse41.c" include "lossless_enc.c" include "lossless_enc_mips32.c" include "lossless_enc_mips_dsp_r2.c" include "lossless_enc_msa.c" include "lossless_enc_neon.$NEON" include "lossless_enc_sse2.c" include "lossless_enc_sse41.c" include "ssim.c" include "ssim_sse2.c" srcDir "src/enc" include "alpha_enc.c" include "analysis_enc.c" include "backward_references_cost_enc.c" include "backward_references_enc.c" include "config_enc.c" include "cost_enc.c" include "filter_enc.c" include "frame_enc.c" include "histogram_enc.c" include "iterator_enc.c" include "near_lossless_enc.c" include "picture_enc.c" include "picture_csp_enc.c" include "picture_psnr_enc.c" include "picture_rescale_enc.c" include "picture_tools_enc.c" include "predictor_enc.c" include "quant_enc.c" include "syntax_enc.c" include "token_enc.c" include "tree_enc.c" include "vp8l_enc.c" include "webp_enc.c" srcDir "src/utils" include "bit_writer_utils.c" include "huffman_encode_utils.c" include "quant_levels_utils.c" } exportedHeaders { srcDir "src" } } } } webpdemux(NativeLibrarySpec) { sources { c { source { srcDir "src/demux" include "anim_decode.c" include "demux.c" } } } } webpmux(NativeLibrarySpec) { sources { c { source { srcDir "src/mux/" include "anim_encode.c" include "muxedit.c" include "muxinternal.c" include "muxread.c" } } } } // Executables from examples. example_util(NativeLibrarySpec) { binaries { all { lib library: "webp", linkage: "static" } } sources { c { source { srcDir "./examples" include "example_util.c" } } } } imageio_util(NativeLibrarySpec) { binaries { all { lib library: "webp", linkage: "static" } } sources { c { source { srcDir "./imageio" include "imageio_util.c" } } } } imagedec(NativeLibrarySpec) { binaries { all { lib library: "webpdemux", linkage: "static" lib library: "webp", linkage: "static" } } sources { c { source { srcDir "./imageio" include "image_dec.c" include "jpegdec.c" include "metadata.c" include "pngdec.c" include "pnmdec.c" include "tiffdec.c" include "webpdec.c" } } } } imageenc(NativeLibrarySpec) { binaries { all { lib library: "webp", linkage: "static" lib library: "imageio_util", linkage: "static" } } sources { c { source { srcDir "./imageio" include "image_enc.c" } } } } cwebp(NativeExecutableSpec) { binaries { all { lib library: "example_util", linkage: "static" lib library: "imagedec", linkage: "static" lib library: "imageio_util", linkage: "static" lib library: "webpdemux", linkage: "static" lib library: "webp", linkage: "static" } } sources { c { source { srcDir "./examples" include "cwebp.c" } } } } dwebp(NativeExecutableSpec) { binaries { all { lib library: "example_util", linkage: "static" lib library: "imagedec", linkage: "static" lib library: "imageenc", linkage: "static" lib library: "imageio_util", linkage: "static" lib library: "webpdemux", linkage: "static" lib library: "webp" } } sources { c { source { srcDir "./examples" include "dwebp.c" } } } } webpmux_example(NativeExecutableSpec) { binaries { all { lib library: "example_util", linkage: "static" lib library: "imageio_util", linkage: "static" lib library: "webpmux", linkage: "static" lib library: "webp" } } sources { c { source { srcDir "./examples" include "webpmux.c" } } } } img2webp_example(NativeExecutableSpec) { binaries { all { lib library: "example_util", linkage: "static" lib library: "imagedec", linkage: "static" lib library: "imageio_util", linkage: "static" lib library: "webpmux", linkage: "static" lib library: "webpdemux", linkage: "static" lib library: "webp" } } sources { c { source { srcDir "./examples" include "img2webp.c" } } } } webpinfo_example(NativeExecutableSpec) { binaries { all { lib library: "example_util", linkage: "static" lib library: "imageio_util", linkage: "static" lib library: "webp" } } sources { c { source { srcDir "./examples" include "webpinfo.c" } } } } } tasks { // Task to test all possible configurations. buildAllExecutables(Task) { dependsOn $.binaries.findAll { it.buildable } } } } libwebp-1.4.0/extras/0000755000014400001440000000000014606317243011364 5ustar libwebp-1.4.0/extras/get_disto.c0000644000014400001440000002776114606317060013523 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple tool to load two webp/png/jpg/tiff files and compute PSNR/SSIM. // This is mostly a wrapper around WebPPictureDistortion(). // /* gcc -o get_disto get_disto.c -O3 -I../ -L../examples -L../imageio \ -lexample_util -limageio_util -limagedec -lwebp -L/opt/local/lib \ -lpng -lz -ljpeg -ltiff -lm -lpthread */ // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include #include "webp/encode.h" #include "imageio/image_dec.h" #include "imageio/imageio_util.h" #include "../examples/unicode.h" static size_t ReadPicture(const char* const filename, WebPPicture* const pic, int keep_alpha) { const uint8_t* data = NULL; size_t data_size = 0; WebPImageReader reader = NULL; int ok = ImgIoUtilReadFile(filename, &data, &data_size); if (!ok) goto End; pic->use_argb = 1; // force ARGB #ifdef HAVE_WINCODEC_H // Try to decode the file using WIC falling back to the other readers for // e.g., WebP. ok = ReadPictureWithWIC(filename, pic, keep_alpha, NULL); if (ok) goto End; #endif reader = WebPGuessImageReader(data, data_size); ok = reader(data, data_size, pic, keep_alpha, NULL); End: if (!ok) { WFPRINTF(stderr, "Error! Could not process file %s\n", (const W_CHAR*)filename); } free((void*)data); return ok ? data_size : 0; } static void RescalePlane(uint8_t* plane, int width, int height, int x_stride, int y_stride, int max) { const uint32_t factor = (max > 0) ? (255u << 16) / max : 0; int x, y; for (y = 0; y < height; ++y) { uint8_t* const ptr = plane + y * y_stride; for (x = 0; x < width * x_stride; x += x_stride) { const uint32_t diff = (ptr[x] * factor + (1 << 15)) >> 16; ptr[x] = diff; } } } // Return the max absolute difference. static int DiffScaleChannel(uint8_t* src1, int stride1, const uint8_t* src2, int stride2, int x_stride, int w, int h, int do_scaling) { int x, y; int max = 0; for (y = 0; y < h; ++y) { uint8_t* const ptr1 = src1 + y * stride1; const uint8_t* const ptr2 = src2 + y * stride2; for (x = 0; x < w * x_stride; x += x_stride) { const int diff = abs(ptr1[x] - ptr2[x]); if (diff > max) max = diff; ptr1[x] = diff; } } if (do_scaling) RescalePlane(src1, w, h, x_stride, stride1, max); return max; } //------------------------------------------------------------------------------ // SSIM calculation. We re-implement these functions here, out of dsp/, to avoid // breaking the library's hidden visibility. This code duplication avoids the // bigger annoyance of having to open up internal details of libdsp... #define SSIM_KERNEL 3 // total size of the kernel: 2 * SSIM_KERNEL + 1 // struct for accumulating statistical moments typedef struct { uint32_t w; // sum(w_i) : sum of weights uint32_t xm, ym; // sum(w_i * x_i), sum(w_i * y_i) uint32_t xxm, xym, yym; // sum(w_i * x_i * x_i), etc. } DistoStats; // hat-shaped filter. Sum of coefficients is equal to 16. static const uint32_t kWeight[2 * SSIM_KERNEL + 1] = { 1, 2, 3, 4, 3, 2, 1 }; static WEBP_INLINE double SSIMCalculation(const DistoStats* const stats) { const uint32_t N = stats->w; const uint32_t w2 = N * N; const uint32_t C1 = 20 * w2; const uint32_t C2 = 60 * w2; const uint32_t C3 = 8 * 8 * w2; // 'dark' limit ~= 6 const uint64_t xmxm = (uint64_t)stats->xm * stats->xm; const uint64_t ymym = (uint64_t)stats->ym * stats->ym; if (xmxm + ymym >= C3) { const int64_t xmym = (int64_t)stats->xm * stats->ym; const int64_t sxy = (int64_t)stats->xym * N - xmym; // can be negative const uint64_t sxx = (uint64_t)stats->xxm * N - xmxm; const uint64_t syy = (uint64_t)stats->yym * N - ymym; // we descale by 8 to prevent overflow during the fnum/fden multiply. const uint64_t num_S = (2 * (uint64_t)(sxy < 0 ? 0 : sxy) + C2) >> 8; const uint64_t den_S = (sxx + syy + C2) >> 8; const uint64_t fnum = (2 * xmym + C1) * num_S; const uint64_t fden = (xmxm + ymym + C1) * den_S; const double r = (double)fnum / fden; assert(r >= 0. && r <= 1.0); return r; } return 1.; // area is too dark to contribute meaningfully } static double SSIMGetClipped(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2, int xo, int yo, int W, int H) { DistoStats stats = { 0, 0, 0, 0, 0, 0 }; const int ymin = (yo - SSIM_KERNEL < 0) ? 0 : yo - SSIM_KERNEL; const int ymax = (yo + SSIM_KERNEL > H - 1) ? H - 1 : yo + SSIM_KERNEL; const int xmin = (xo - SSIM_KERNEL < 0) ? 0 : xo - SSIM_KERNEL; const int xmax = (xo + SSIM_KERNEL > W - 1) ? W - 1 : xo + SSIM_KERNEL; int x, y; src1 += ymin * stride1; src2 += ymin * stride2; for (y = ymin; y <= ymax; ++y, src1 += stride1, src2 += stride2) { for (x = xmin; x <= xmax; ++x) { const uint32_t w = kWeight[SSIM_KERNEL + x - xo] * kWeight[SSIM_KERNEL + y - yo]; const uint32_t s1 = src1[x]; const uint32_t s2 = src2[x]; stats.w += w; stats.xm += w * s1; stats.ym += w * s2; stats.xxm += w * s1 * s1; stats.xym += w * s1 * s2; stats.yym += w * s2 * s2; } } return SSIMCalculation(&stats); } // Compute SSIM-score map. Return -1 in case of error, max diff otherwise. static int SSIMScaleChannel(uint8_t* src1, int stride1, const uint8_t* src2, int stride2, int x_stride, int w, int h, int do_scaling) { int x, y; int max = 0; uint8_t* const plane1 = (uint8_t*)malloc(2 * w * h * sizeof(*plane1)); uint8_t* const plane2 = plane1 + w * h; if (plane1 == NULL) return -1; // extract plane for (y = 0; y < h; ++y) { for (x = 0; x < w; ++x) { plane1[x + y * w] = src1[x * x_stride + y * stride1]; plane2[x + y * w] = src2[x * x_stride + y * stride2]; } } for (y = 0; y < h; ++y) { for (x = 0; x < w; ++x) { const double ssim = SSIMGetClipped(plane1, w, plane2, w, x, y, w, h); int diff = (int)(255 * (1. - ssim)); if (diff < 0) { diff = 0; } else if (diff > max) { max = diff; } src1[x * x_stride + y * stride1] = (diff > 255) ? 255u : (uint8_t)diff; } } free(plane1); if (do_scaling) RescalePlane(src1, w, h, x_stride, stride1, max); return max; } // Convert an argb picture to luminance. static void ConvertToGray(WebPPicture* const pic) { int x, y; assert(pic != NULL); assert(pic->use_argb); for (y = 0; y < pic->height; ++y) { uint32_t* const row = &pic->argb[y * pic->argb_stride]; for (x = 0; x < pic->width; ++x) { const uint32_t argb = row[x]; const uint32_t r = (argb >> 16) & 0xff; const uint32_t g = (argb >> 8) & 0xff; const uint32_t b = (argb >> 0) & 0xff; // We use BT.709 for converting to luminance. const uint32_t Y = (uint32_t)(0.2126 * r + 0.7152 * g + 0.0722 * b + .5); row[x] = (argb & 0xff000000u) | (Y * 0x010101u); } } } static void Help(void) { fprintf(stderr, "Usage: get_disto [-ssim][-psnr][-alpha] compressed.webp orig.webp\n" " -ssim ..... print SSIM distortion\n" " -psnr ..... print PSNR distortion (default)\n" " -alpha .... preserve alpha plane\n" " -h ........ this message\n" " -o . save the diff map as a WebP lossless file\n" " -scale .... scale the difference map to fit [0..255] range\n" " -gray ..... use grayscale for difference map (-scale)\n" "\nSupported input formats:\n %s\n", WebPGetEnabledInputFileFormats()); } int main(int argc, const char* argv[]) { WebPPicture pic1, pic2; size_t size1 = 0, size2 = 0; int ret = 1; float disto[5]; int type = 0; int c; int help = 0; int keep_alpha = 0; int scale = 0; int use_gray = 0; const char* name1 = NULL; const char* name2 = NULL; const char* output = NULL; INIT_WARGV(argc, argv); if (!WebPPictureInit(&pic1) || !WebPPictureInit(&pic2)) { fprintf(stderr, "Can't init pictures\n"); FREE_WARGV_AND_RETURN(1); } for (c = 1; c < argc; ++c) { if (!strcmp(argv[c], "-ssim")) { type = 1; } else if (!strcmp(argv[c], "-psnr")) { type = 0; } else if (!strcmp(argv[c], "-alpha")) { keep_alpha = 1; } else if (!strcmp(argv[c], "-scale")) { scale = 1; } else if (!strcmp(argv[c], "-gray")) { use_gray = 1; } else if (!strcmp(argv[c], "-h")) { help = 1; ret = 0; } else if (!strcmp(argv[c], "-o")) { if (++c == argc) { fprintf(stderr, "missing file name after %s option.\n", argv[c - 1]); goto End; } output = (const char*)GET_WARGV(argv, c); } else if (name1 == NULL) { name1 = (const char*)GET_WARGV(argv, c); } else { name2 = (const char*)GET_WARGV(argv, c); } } if (help || name1 == NULL || name2 == NULL) { if (!help) { fprintf(stderr, "Error: missing arguments.\n"); } Help(); goto End; } size1 = ReadPicture(name1, &pic1, 1); size2 = ReadPicture(name2, &pic2, 1); if (size1 == 0 || size2 == 0) goto End; if (!keep_alpha) { WebPBlendAlpha(&pic1, 0x00000000); WebPBlendAlpha(&pic2, 0x00000000); } if (!WebPPictureDistortion(&pic1, &pic2, type, disto)) { fprintf(stderr, "Error while computing the distortion.\n"); goto End; } printf("%u %.2f %.2f %.2f %.2f %.2f [ %.2f bpp ]\n", (unsigned int)size1, disto[4], disto[0], disto[1], disto[2], disto[3], 8.f * size1 / pic1.width / pic1.height); if (output != NULL) { uint8_t* data = NULL; size_t data_size = 0; if (pic1.use_argb != pic2.use_argb) { fprintf(stderr, "Pictures are not in the same argb format. " "Can't save the difference map.\n"); goto End; } if (pic1.use_argb) { int n; fprintf(stderr, "max differences per channel: "); for (n = 0; n < 3; ++n) { // skip the alpha channel const int range = (type == 1) ? SSIMScaleChannel((uint8_t*)pic1.argb + n, pic1.argb_stride * 4, (const uint8_t*)pic2.argb + n, pic2.argb_stride * 4, 4, pic1.width, pic1.height, scale) : DiffScaleChannel((uint8_t*)pic1.argb + n, pic1.argb_stride * 4, (const uint8_t*)pic2.argb + n, pic2.argb_stride * 4, 4, pic1.width, pic1.height, scale); if (range < 0) fprintf(stderr, "\nError computing diff map\n"); fprintf(stderr, "[%d]", range); } fprintf(stderr, "\n"); if (use_gray) ConvertToGray(&pic1); } else { fprintf(stderr, "Can only compute the difference map in ARGB format.\n"); goto End; } #if !defined(WEBP_REDUCE_CSP) data_size = WebPEncodeLosslessBGRA((const uint8_t*)pic1.argb, pic1.width, pic1.height, pic1.argb_stride * 4, &data); if (data_size == 0) { fprintf(stderr, "Error during lossless encoding.\n"); goto End; } ret = ImgIoUtilWriteFile(output, data, data_size) ? 0 : 1; WebPFree(data); if (ret) goto End; #else (void)data; (void)data_size; fprintf(stderr, "Cannot save the difference map. Please recompile " "without the WEBP_REDUCE_CSP flag.\n"); #endif // WEBP_REDUCE_CSP } ret = 0; End: WebPPictureFree(&pic1); WebPPictureFree(&pic2); FREE_WARGV_AND_RETURN(ret); } libwebp-1.4.0/extras/quality_estimate.c0000644000014400001440000000737714606317060015126 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // VP8EstimateQuality(): rough encoding quality estimate // // Author: Skal (pascal.massimino@gmail.com) #include "extras/extras.h" #include "webp/decode.h" #include //------------------------------------------------------------------------------ #define INVALID_BIT_POS (1ull << 63) // In most cases, we don't need to use a full arithmetic decoder, since // all the header's bits are written using a uniform probability of 128. // We can just parse the header as if it was bits (works in 99.999% cases). static WEBP_INLINE uint32_t GetBit(const uint8_t* const data, size_t nb, uint64_t max_size, uint64_t* const bit_pos) { uint32_t val = 0; if (*bit_pos + nb <= 8 * max_size) { while (nb-- > 0) { const uint64_t p = (*bit_pos)++; const int bit = !!(data[p >> 3] & (128 >> ((p & 7)))); val = (val << 1) | bit; } } else { *bit_pos = INVALID_BIT_POS; } return val; } #define GET_BIT(n) GetBit(data, (n), size, &bit_pos) #define CONDITIONAL_SKIP(n) (GET_BIT(1) ? GET_BIT((n)) : 0) int VP8EstimateQuality(const uint8_t* const data, size_t size) { size_t pos = 0; uint64_t bit_pos; uint64_t sig = 0x00; int ok = 0; int Q = -1; WebPBitstreamFeatures features; if (data == NULL) return -1; if (WebPGetFeatures(data, size, &features) != VP8_STATUS_OK) { return -1; // invalid file } if (features.format == 2) return 101; // lossless if (features.format == 0 || features.has_animation) return -1; // mixed while (pos < size) { sig = (sig >> 8) | ((uint64_t)data[pos++] << 40); if ((sig >> 24) == 0x2a019dull) { ok = 1; break; } } if (!ok) return -1; if (pos + 4 > size) return -1; // Skip main Header // width = (data[pos + 0] | (data[pos + 1] << 8)) & 0x3fff; // height = (data[pos + 2] | (data[pos + 3] << 8)) & 0x3fff; pos += 4; bit_pos = pos * 8; GET_BIT(2); // colorspace + clamp type // Segment header if (GET_BIT(1)) { // use_segment_ int s; const int update_map = GET_BIT(1); if (GET_BIT(1)) { // update data const int absolute_delta = GET_BIT(1); int q[4] = { 0, 0, 0, 0 }; for (s = 0; s < 4; ++s) { if (GET_BIT(1)) { q[s] = GET_BIT(7); if (GET_BIT(1)) q[s] = -q[s]; // sign } } if (absolute_delta) Q = q[0]; // just use the first segment's quantizer for (s = 0; s < 4; ++s) CONDITIONAL_SKIP(7); // filter strength } if (update_map) { for (s = 0; s < 3; ++s) CONDITIONAL_SKIP(8); } } // Filter header GET_BIT(1 + 6 + 3); // simple + level + sharpness if (GET_BIT(1)) { // use_lf_delta if (GET_BIT(1)) { // update lf_delta? int n; for (n = 0; n < 4 + 4; ++n) CONDITIONAL_SKIP(6); } } // num partitions GET_BIT(2); // ParseQuant { const int base_q = GET_BIT(7); /* dqy1_dc = */ CONDITIONAL_SKIP(5); /* dqy2_dc = */ CONDITIONAL_SKIP(5); /* dqy2_ac = */ CONDITIONAL_SKIP(5); /* dquv_dc = */ CONDITIONAL_SKIP(5); /* dquv_ac = */ CONDITIONAL_SKIP(5); if (Q < 0) Q = base_q; } if (bit_pos == INVALID_BIT_POS) return -1; // base mapping Q = (127 - Q) * 100 / 127; // correction for power-law behavior in low range if (Q < 80) { Q = (int)(pow(Q / 80., 1. / 0.38) * 80); } return Q; } libwebp-1.4.0/extras/webp_quality.c0000644000014400001440000000305614606317060014236 0ustar // Simple tool to roughly evaluate the quality encoding of a webp bitstream // // Result is a *rough* estimation of the quality. You should just consider // the bucket it's in (q > 80? > 50? > 20?) and not take it for face value. /* gcc -o webp_quality webp_quality.c -O3 -I../ -L. -L../imageio \ -limageio_util -lwebpextras -lwebp -lm -lpthread */ #include #include #include #include "extras/extras.h" #include "imageio/imageio_util.h" #include "../examples/unicode.h" int main(int argc, const char* argv[]) { int c; int quiet = 0; int ok = 1; INIT_WARGV(argc, argv); for (c = 1; ok && c < argc; ++c) { if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-help") || !strcmp(argv[c], "-h")) { printf("webp_quality [-h][-quiet] webp_files...\n"); FREE_WARGV_AND_RETURN(0); } else { const char* const filename = (const char*)GET_WARGV(argv, c); const uint8_t* data = NULL; size_t data_size = 0; int q; ok = ImgIoUtilReadFile(filename, &data, &data_size); if (!ok) break; q = VP8EstimateQuality(data, data_size); if (!quiet) WPRINTF("[%s] ", (const W_CHAR*)filename); if (q < 0) { fprintf(stderr, "Not a WebP file, or not a lossy WebP file.\n"); ok = 0; } else { if (!quiet) { printf("Estimated quality factor: %d\n", q); } else { printf("%d\n", q); // just print the number } } free((void*)data); } } FREE_WARGV_AND_RETURN(ok ? 0 : 1); } libwebp-1.4.0/extras/webp_to_sdl.c0000644000014400001440000000540314606317060014030 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple WebP-to-SDL wrapper. Useful for emscripten. // // Author: James Zern (jzern@google.com) #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #if defined(WEBP_HAVE_SDL) #include "webp_to_sdl.h" #include #include "src/webp/decode.h" #if defined(WEBP_HAVE_JUST_SDL_H) #include #else #include #endif static int init_ok = 0; int WebPToSDL(const char* data, unsigned int data_size) { int ok = 0; VP8StatusCode status; WebPBitstreamFeatures input; uint8_t* output = NULL; SDL_Window* window = NULL; SDL_Renderer* renderer = NULL; SDL_Texture* texture = NULL; int width, height; if (!init_ok) { SDL_Init(SDL_INIT_VIDEO); init_ok = 1; } status = WebPGetFeatures((uint8_t*)data, (size_t)data_size, &input); if (status != VP8_STATUS_OK) goto Error; width = input.width; height = input.height; SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer); if (window == NULL || renderer == NULL) { fprintf(stderr, "Unable to create window or renderer!\n"); goto Error; } SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. SDL_RenderSetLogicalSize(renderer, width, height); texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, width, height); if (texture == NULL) { fprintf(stderr, "Unable to create %dx%d RGBA texture!\n", width, height); goto Error; } #if SDL_BYTEORDER == SDL_BIG_ENDIAN output = WebPDecodeBGRA((const uint8_t*)data, (size_t)data_size, &width, &height); #else output = WebPDecodeRGBA((const uint8_t*)data, (size_t)data_size, &width, &height); #endif if (output == NULL) { fprintf(stderr, "Error decoding image (%d)\n", status); goto Error; } SDL_UpdateTexture(texture, NULL, output, width * sizeof(uint32_t)); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); ok = 1; Error: // We should call SDL_DestroyWindow(window) but that makes .js fail. SDL_DestroyRenderer(renderer); SDL_DestroyTexture(texture); WebPFree(output); return ok; } //------------------------------------------------------------------------------ #endif // WEBP_HAVE_SDL libwebp-1.4.0/extras/Makefile.am0000644000014400001440000000256714606317060013427 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src noinst_LTLIBRARIES = libwebpextras.la noinst_HEADERS = noinst_HEADERS += ../src/webp/types.h libwebpextras_la_SOURCES = libwebpextras_la_SOURCES += extras.c extras.h quality_estimate.c libwebpextras_la_SOURCES += sharpyuv_risk_table.c sharpyuv_risk_table.h libwebpextras_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpextras_la_LDFLAGS = -lm libwebpextras_la_LIBADD = ../src/libwebp.la noinst_PROGRAMS = noinst_PROGRAMS += webp_quality if BUILD_DEMUX noinst_PROGRAMS += get_disto endif if BUILD_VWEBP_SDL noinst_PROGRAMS += vwebp_sdl endif get_disto_SOURCES = get_disto.c get_disto_CPPFLAGS = $(AM_CPPFLAGS) get_disto_LDADD = get_disto_LDADD += ../imageio/libimageio_util.la get_disto_LDADD += ../imageio/libimagedec.la get_disto_LDADD += ../src/libwebp.la get_disto_LDADD += $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) webp_quality_SOURCES = webp_quality.c webp_quality_CPPFLAGS = $(AM_CPPFLAGS) webp_quality_LDADD = webp_quality_LDADD += ../imageio/libimageio_util.la webp_quality_LDADD += libwebpextras.la webp_quality_LDADD += ../src/libwebp.la vwebp_sdl_SOURCES = vwebp_sdl.c webp_to_sdl.c webp_to_sdl.h vwebp_sdl_CPPFLAGS = $(AM_CPPFLAGS) $(SDL_INCLUDES) vwebp_sdl_LDADD = vwebp_sdl_LDADD += ../imageio/libimageio_util.la vwebp_sdl_LDADD += ../src/libwebp.la vwebp_sdl_LDADD += $(SDL_LIBS) libwebp-1.4.0/extras/webp_to_sdl.h0000644000014400001440000000157214606317060014040 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple WebP-to-SDL wrapper. Useful for emscripten. // // Author: James Zern (jzern@google.com) #ifndef WEBP_EXTRAS_WEBP_TO_SDL_H_ #define WEBP_EXTRAS_WEBP_TO_SDL_H_ // Exports the method WebPToSDL(const char* data, int data_size) which decodes // a WebP bitstream into an RGBA SDL surface. // Return false on failure. extern int WebPToSDL(const char* data, unsigned int data_size); #endif // WEBP_EXTRAS_WEBP_TO_SDL_H_ libwebp-1.4.0/extras/sharpyuv_risk_table.c0000644000014400001440000170417414606317060015623 0ustar // Copyright 2023 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Precomputed data for 420 risk estimation. #include "src/webp/types.h" const int kSharpYuvPrecomputedRiskYuvSampling = 7; const uint8_t kSharpYuvPrecomputedRisk[] = { 0, 2, 2, 3, 3, 2, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 4, 4, 8, 8, 8, 7, 5, 4, 4, 14, 12, 9, 8, 6, 4, 4, 2, 1, 2, 2, 2, 2, 1, 2, 0, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 3, 2, 2, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 4, 4, 11, 9, 9, 8, 6, 5, 4, 18, 14, 11, 9, 7, 5, 4, 2, 1, 1, 1, 1, 3, 6, 2, 2, 1, 1, 1, 3, 6, 3, 2, 2, 2, 3, 3, 7, 6, 3, 5, 6, 6, 6, 8, 9, 7, 9, 9, 9, 8, 8, 14, 12, 13, 12, 11, 10, 8, 20, 18, 16, 14, 13, 11, 10, 3, 6, 6, 7, 7, 7, 10, 6, 7, 7, 8, 8, 8, 10, 10, 7, 9, 9, 10, 10, 10, 13, 10, 12, 13, 13, 13, 12, 13, 15, 17, 17, 17, 16, 15, 14, 22, 21, 20, 19, 18, 17, 20, 27, 25, 23, 20, 19, 19, 14, 15, 14, 14, 15, 14, 9, 16, 16, 16, 16, 16, 15, 9, 16, 17, 18, 18, 18, 17, 14, 16, 21, 21, 22, 22, 20, 17, 19, 26, 27, 26, 25, 24, 18, 23, 30, 32, 29, 28, 25, 20, 27, 33, 35, 32, 30, 28, 22, 24, 25, 24, 24, 21, 17, 12, 23, 27, 25, 26, 22, 17, 14, 24, 30, 29, 28, 24, 20, 17, 24, 31, 32, 32, 28, 24, 20, 27, 34, 37, 36, 32, 27, 22, 30, 36, 42, 41, 34, 29, 23, 33, 39, 44, 44, 38, 31, 26, 32, 37, 36, 29, 23, 19, 15, 31, 38, 39, 31, 25, 20, 16, 31, 38, 41, 34, 28, 24, 20, 31, 38, 44, 38, 33, 27, 24, 34, 41, 46, 45, 37, 31, 25, 36, 43, 47, 49, 40, 33, 27, 39, 44, 49, 49, 42, 36, 29, 2, 0, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 3, 2, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 9, 9, 9, 8, 6, 5, 5, 15, 14, 10, 8, 7, 5, 5, 2, 2, 1, 2, 1, 1, 4, 2, 2, 0, 2, 1, 1, 4, 2, 2, 1, 1, 1, 3, 5, 3, 3, 3, 3, 3, 4, 6, 7, 6, 7, 6, 6, 5, 6, 12, 11, 10, 9, 8, 7, 6, 19, 16, 12, 10, 9, 8, 6, 2, 2, 3, 3, 3, 5, 7, 3, 2, 3, 4, 4, 5, 7, 7, 2, 4, 6, 6, 6, 9, 10, 4, 8, 9, 9, 9, 11, 13, 8, 11, 13, 13, 12, 11, 17, 14, 15, 16, 15, 14, 10, 21, 20, 18, 18, 16, 15, 13, 7, 7, 9, 9, 10, 8, 11, 11, 8, 10, 11, 11, 11, 11, 13, 8, 11, 13, 13, 14, 13, 16, 11, 16, 17, 17, 17, 15, 17, 17, 20, 21, 21, 20, 18, 18, 23, 25, 24, 23, 21, 20, 21, 29, 28, 26, 25, 23, 22, 16, 17, 17, 17, 18, 17, 11, 20, 18, 19, 19, 19, 18, 11, 19, 20, 20, 22, 21, 20, 16, 19, 24, 26, 25, 26, 24, 22, 21, 29, 31, 30, 31, 27, 22, 26, 33, 35, 33, 31, 30, 25, 30, 36, 39, 36, 35, 31, 26, 27, 28, 28, 27, 23, 20, 15, 26, 30, 29, 29, 25, 21, 17, 27, 32, 32, 32, 28, 24, 21, 26, 35, 38, 37, 32, 29, 25, 30, 38, 41, 41, 36, 31, 25, 34, 40, 47, 45, 39, 33, 27, 37, 44, 48, 49, 41, 35, 29, 35, 42, 40, 33, 27, 22, 18, 36, 41, 42, 34, 29, 24, 21, 36, 41, 46, 38, 32, 28, 24, 35, 43, 49, 42, 37, 32, 28, 38, 45, 51, 48, 42, 36, 30, 40, 47, 53, 51, 44, 38, 32, 44, 49, 54, 55, 47, 39, 34, 2, 2, 0, 2, 2, 1, 2, 3, 2, 1, 2, 2, 1, 3, 3, 2, 1, 1, 2, 3, 5, 3, 3, 3, 3, 3, 4, 5, 6, 6, 7, 6, 6, 5, 6, 11, 10, 10, 9, 7, 5, 5, 17, 15, 12, 10, 8, 5, 6, 3, 2, 2, 1, 1, 3, 6, 3, 2, 2, 1, 1, 3, 6, 4, 3, 2, 2, 3, 5, 7, 7, 4, 4, 5, 6, 6, 8, 11, 7, 8, 9, 9, 6, 9, 14, 12, 12, 11, 11, 10, 8, 20, 17, 14, 12, 13, 11, 9, 4, 3, 4, 5, 6, 6, 8, 8, 3, 4, 6, 7, 6, 9, 11, 3, 5, 9, 10, 8, 11, 14, 5, 9, 12, 13, 12, 13, 17, 10, 12, 16, 17, 16, 13, 21, 15, 17, 20, 19, 17, 12, 23, 20, 20, 21, 20, 19, 16, 11, 8, 12, 13, 12, 10, 13, 15, 9, 12, 14, 14, 14, 14, 18, 10, 13, 16, 17, 17, 16, 20, 14, 18, 20, 21, 21, 18, 21, 20, 22, 24, 25, 24, 21, 21, 25, 27, 28, 27, 26, 25, 23, 31, 30, 30, 28, 27, 26, 19, 19, 20, 21, 21, 20, 13, 23, 21, 21, 22, 23, 21, 14, 23, 22, 23, 25, 25, 25, 19, 23, 26, 28, 29, 29, 28, 25, 24, 31, 34, 34, 34, 32, 26, 28, 36, 40, 38, 37, 34, 28, 32, 40, 43, 40, 39, 35, 29, 29, 32, 31, 30, 26, 22, 17, 29, 33, 32, 32, 29, 25, 21, 29, 36, 36, 36, 32, 28, 24, 29, 38, 42, 40, 36, 32, 28, 32, 42, 45, 44, 40, 35, 30, 37, 45, 50, 49, 42, 37, 31, 40, 47, 52, 52, 46, 39, 33, 38, 45, 42, 36, 30, 25, 21, 39, 45, 45, 38, 32, 28, 24, 39, 45, 49, 42, 37, 32, 28, 38, 46, 52, 46, 41, 35, 31, 42, 49, 55, 52, 45, 40, 34, 45, 51, 57, 57, 48, 42, 36, 48, 53, 58, 57, 51, 44, 38, 3, 2, 2, 0, 0, 2, 4, 3, 2, 2, 0, 1, 3, 6, 3, 3, 2, 2, 2, 4, 7, 4, 4, 4, 5, 4, 5, 7, 8, 7, 8, 8, 7, 6, 7, 12, 11, 12, 10, 8, 6, 7, 18, 16, 13, 11, 9, 6, 8, 3, 2, 2, 2, 3, 5, 7, 4, 3, 2, 2, 3, 6, 8, 8, 3, 2, 3, 6, 7, 9, 11, 4, 5, 6, 9, 8, 11, 14, 8, 9, 10, 12, 8, 11, 17, 13, 13, 13, 14, 12, 11, 22, 18, 15, 13, 16, 15, 11, 8, 3, 5, 8, 8, 8, 10, 12, 3, 5, 8, 10, 8, 11, 15, 5, 6, 11, 13, 9, 13, 18, 9, 10, 15, 16, 16, 16, 21, 12, 14, 19, 19, 19, 16, 24, 17, 18, 21, 22, 21, 16, 26, 22, 20, 23, 23, 22, 19, 15, 9, 13, 15, 16, 12, 15, 18, 11, 14, 16, 17, 17, 17, 22, 13, 15, 19, 21, 21, 19, 26, 17, 20, 24, 23, 25, 21, 26, 22, 24, 27, 28, 27, 24, 25, 27, 30, 31, 31, 29, 27, 25, 33, 33, 33, 32, 31, 30, 23, 20, 22, 24, 24, 23, 16, 26, 22, 25, 25, 26, 25, 17, 26, 25, 26, 28, 30, 28, 22, 26, 29, 31, 33, 33, 32, 27, 28, 34, 37, 36, 38, 36, 30, 30, 39, 42, 42, 41, 37, 32, 34, 43, 46, 44, 42, 39, 33, 31, 34, 33, 33, 30, 26, 20, 31, 36, 35, 35, 32, 28, 24, 32, 37, 39, 39, 36, 31, 28, 32, 40, 45, 42, 40, 37, 32, 34, 44, 50, 48, 44, 40, 34, 39, 47, 54, 52, 47, 40, 35, 43, 48, 56, 56, 49, 43, 37, 43, 46, 45, 39, 32, 29, 25, 42, 47, 47, 40, 35, 31, 28, 41, 47, 49, 44, 39, 36, 31, 42, 48, 55, 50, 44, 40, 34, 45, 52, 57, 55, 49, 43, 38, 48, 54, 59, 60, 53, 44, 39, 51, 57, 61, 60, 54, 47, 41, 3, 2, 2, 0, 0, 2, 4, 3, 2, 2, 1, 0, 3, 6, 3, 2, 2, 2, 2, 4, 6, 4, 4, 4, 4, 4, 5, 7, 8, 7, 8, 8, 7, 6, 8, 12, 12, 11, 11, 8, 6, 8, 18, 16, 13, 11, 9, 6, 8, 3, 2, 2, 2, 3, 5, 7, 4, 3, 2, 2, 3, 6, 8, 8, 3, 2, 3, 6, 7, 9, 12, 5, 5, 6, 9, 8, 11, 14, 8, 9, 10, 12, 8, 10, 17, 13, 13, 13, 14, 13, 11, 22, 18, 15, 13, 15, 15, 11, 8, 3, 5, 8, 8, 8, 10, 12, 3, 5, 9, 10, 8, 11, 16, 5, 6, 11, 13, 9, 13, 17, 8, 9, 15, 16, 15, 15, 22, 12, 14, 19, 20, 20, 16, 24, 17, 18, 21, 22, 21, 16, 26, 22, 20, 23, 24, 22, 19, 15, 9, 13, 15, 15, 12, 16, 18, 11, 14, 16, 17, 17, 17, 21, 13, 15, 19, 21, 21, 19, 26, 17, 20, 23, 24, 25, 20, 25, 21, 24, 27, 27, 27, 24, 24, 27, 29, 30, 30, 29, 27, 26, 33, 32, 33, 32, 31, 30, 23, 21, 23, 24, 23, 22, 15, 26, 22, 24, 24, 26, 25, 17, 26, 24, 25, 28, 30, 27, 22, 26, 29, 30, 33, 33, 32, 27, 28, 34, 36, 38, 37, 35, 30, 30, 38, 43, 42, 41, 37, 32, 33, 42, 46, 44, 42, 39, 34, 32, 34, 33, 33, 29, 26, 20, 32, 37, 35, 35, 32, 28, 24, 31, 38, 38, 39, 36, 32, 28, 31, 40, 44, 44, 39, 36, 32, 35, 42, 49, 48, 44, 40, 33, 39, 47, 54, 53, 46, 40, 36, 44, 50, 54, 55, 48, 43, 37, 40, 47, 44, 37, 33, 28, 25, 41, 48, 47, 40, 35, 31, 28, 40, 47, 50, 44, 40, 35, 31, 41, 49, 55, 50, 44, 39, 35, 44, 52, 58, 55, 47, 43, 38, 48, 55, 60, 59, 50, 45, 39, 50, 57, 62, 62, 53, 47, 42, 2, 2, 1, 2, 2, 0, 3, 2, 2, 1, 2, 2, 1, 4, 2, 2, 1, 2, 4, 3, 5, 3, 3, 4, 4, 6, 6, 6, 6, 7, 7, 7, 9, 8, 6, 11, 11, 11, 10, 9, 8, 6, 18, 15, 13, 11, 10, 7, 6, 2, 2, 2, 1, 1, 3, 5, 3, 2, 2, 1, 1, 4, 6, 6, 2, 2, 3, 4, 5, 7, 10, 4, 5, 6, 7, 6, 9, 11, 8, 9, 9, 10, 7, 8, 16, 13, 13, 12, 12, 11, 9, 21, 18, 15, 13, 14, 13, 9, 6, 2, 4, 6, 6, 6, 8, 10, 2, 4, 7, 8, 6, 9, 14, 3, 5, 9, 10, 7, 11, 16, 6, 9, 13, 14, 13, 13, 18, 11, 12, 17, 18, 17, 13, 22, 16, 17, 20, 20, 18, 13, 25, 22, 20, 22, 22, 20, 17, 14, 7, 12, 13, 13, 9, 13, 17, 9, 12, 14, 15, 14, 14, 20, 12, 13, 17, 18, 19, 16, 22, 15, 18, 22, 22, 22, 18, 22, 20, 22, 25, 26, 25, 21, 23, 25, 28, 28, 28, 27, 24, 24, 31, 31, 30, 30, 29, 27, 22, 19, 21, 21, 21, 20, 13, 24, 20, 22, 22, 23, 22, 14, 24, 22, 23, 26, 26, 25, 19, 25, 26, 28, 29, 32, 29, 25, 25, 32, 34, 35, 35, 32, 27, 28, 36, 41, 39, 37, 34, 30, 32, 40, 43, 43, 39, 36, 30, 29, 32, 32, 30, 26, 22, 17, 29, 35, 32, 32, 29, 25, 22, 29, 35, 35, 36, 33, 29, 25, 29, 38, 41, 41, 37, 33, 29, 33, 41, 47, 45, 42, 37, 30, 38, 44, 52, 52, 44, 38, 32, 41, 47, 53, 53, 47, 40, 34, 39, 46, 42, 36, 30, 26, 22, 39, 45, 45, 38, 33, 29, 25, 39, 44, 48, 42, 36, 33, 28, 39, 46, 52, 47, 41, 37, 33, 42, 50, 54, 52, 45, 39, 36, 45, 52, 58, 56, 49, 43, 35, 49, 54, 58, 59, 52, 44, 37, 1, 1, 2, 4, 4, 3, 0, 2, 1, 2, 4, 4, 3, 2, 2, 1, 1, 4, 5, 4, 4, 2, 3, 3, 5, 7, 7, 6, 5, 6, 7, 8, 10, 8, 7, 10, 10, 11, 11, 10, 8, 7, 17, 15, 12, 11, 11, 8, 7, 2, 1, 1, 3, 2, 2, 3, 2, 2, 1, 2, 2, 2, 4, 2, 2, 1, 3, 3, 3, 5, 6, 3, 4, 5, 5, 4, 6, 9, 7, 8, 8, 8, 6, 6, 13, 12, 12, 11, 9, 8, 6, 20, 18, 13, 12, 11, 9, 6, 2, 2, 3, 3, 3, 5, 6, 6, 2, 3, 4, 4, 4, 6, 11, 2, 4, 7, 7, 5, 8, 15, 4, 8, 10, 10, 10, 10, 16, 9, 11, 14, 14, 14, 10, 19, 14, 16, 18, 16, 15, 10, 23, 21, 19, 19, 18, 16, 14, 11, 7, 9, 10, 10, 7, 11, 15, 7, 10, 11, 12, 11, 11, 17, 9, 12, 14, 15, 15, 12, 19, 13, 16, 18, 18, 18, 14, 19, 17, 20, 22, 23, 22, 18, 20, 23, 26, 26, 25, 23, 21, 22, 29, 29, 27, 26, 25, 23, 19, 17, 18, 18, 18, 17, 11, 22, 18, 20, 19, 20, 19, 11, 22, 20, 21, 23, 23, 22, 17, 22, 24, 26, 27, 27, 26, 22, 23, 30, 31, 32, 32, 28, 24, 25, 34, 37, 36, 34, 30, 26, 30, 37, 41, 37, 36, 33, 27, 27, 29, 27, 27, 24, 20, 15, 26, 31, 30, 29, 26, 22, 18, 27, 33, 32, 33, 30, 26, 22, 26, 35, 39, 36, 34, 29, 25, 31, 37, 43, 42, 38, 33, 28, 35, 44, 48, 47, 40, 34, 30, 38, 45, 49, 49, 42, 37, 31, 35, 41, 38, 32, 26, 23, 18, 36, 42, 41, 35, 29, 25, 22, 36, 40, 43, 38, 33, 29, 25, 36, 42, 50, 43, 37, 34, 29, 39, 45, 52, 47, 42, 37, 31, 42, 47, 53, 54, 45, 39, 33, 46, 51, 54, 54, 46, 40, 35, 1, 2, 3, 3, 3, 2, 2, 0, 2, 2, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 3, 4, 4, 5, 4, 4, 7, 7, 7, 7, 5, 4, 4, 13, 12, 9, 7, 6, 4, 4, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 4, 4, 10, 9, 9, 8, 6, 4, 4, 17, 14, 11, 8, 6, 5, 4, 2, 1, 1, 2, 2, 2, 5, 2, 1, 1, 1, 1, 2, 6, 2, 2, 1, 2, 2, 2, 6, 5, 3, 4, 4, 5, 5, 7, 8, 7, 8, 8, 8, 7, 7, 13, 12, 12, 11, 10, 9, 7, 20, 17, 15, 13, 11, 10, 9, 2, 5, 6, 6, 6, 6, 9, 5, 6, 6, 7, 7, 7, 9, 8, 7, 8, 8, 9, 9, 9, 11, 9, 11, 12, 12, 12, 11, 12, 15, 15, 16, 15, 15, 14, 14, 20, 20, 20, 18, 17, 16, 19, 27, 24, 21, 20, 18, 17, 13, 14, 13, 14, 14, 13, 9, 15, 15, 14, 15, 15, 14, 9, 15, 17, 17, 17, 17, 16, 12, 15, 21, 20, 20, 21, 19, 16, 18, 25, 25, 24, 24, 23, 17, 22, 29, 30, 29, 26, 24, 19, 26, 32, 33, 31, 29, 26, 21, 23, 24, 23, 22, 20, 15, 12, 23, 27, 25, 25, 21, 16, 13, 23, 28, 28, 26, 23, 19, 15, 23, 30, 32, 31, 28, 22, 19, 26, 32, 36, 36, 31, 26, 20, 29, 34, 41, 39, 34, 28, 23, 31, 38, 41, 42, 35, 30, 25, 31, 37, 35, 29, 23, 18, 14, 31, 37, 38, 30, 25, 19, 15, 30, 36, 40, 33, 27, 23, 18, 30, 37, 44, 37, 31, 26, 23, 33, 39, 45, 43, 36, 30, 24, 36, 42, 48, 47, 39, 31, 27, 38, 43, 48, 49, 42, 34, 28, 2, 1, 2, 2, 2, 2, 1, 2, 0, 2, 3, 2, 2, 1, 2, 1, 1, 2, 2, 1, 3, 2, 2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 5, 5, 4, 9, 8, 8, 8, 6, 5, 4, 15, 13, 10, 8, 7, 5, 4, 2, 1, 2, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 3, 2, 2, 1, 1, 1, 2, 5, 2, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 4, 6, 11, 10, 10, 9, 7, 5, 6, 19, 15, 12, 9, 8, 7, 6, 2, 2, 2, 2, 2, 4, 7, 3, 2, 3, 3, 3, 5, 7, 5, 2, 4, 5, 5, 5, 8, 9, 3, 7, 8, 8, 8, 9, 12, 8, 11, 11, 12, 11, 10, 16, 13, 15, 15, 14, 12, 10, 21, 19, 18, 17, 15, 14, 13, 5, 7, 8, 8, 9, 8, 11, 9, 7, 9, 10, 10, 10, 11, 12, 8, 11, 11, 12, 12, 12, 16, 11, 15, 16, 16, 15, 14, 16, 17, 19, 19, 20, 19, 17, 16, 23, 24, 23, 22, 20, 19, 21, 29, 27, 25, 23, 22, 20, 16, 16, 17, 16, 17, 16, 10, 18, 18, 18, 18, 18, 17, 11, 18, 19, 20, 20, 21, 19, 16, 18, 24, 24, 25, 25, 23, 20, 21, 29, 29, 28, 28, 26, 21, 24, 32, 34, 33, 31, 28, 24, 29, 36, 38, 34, 33, 30, 25, 26, 28, 26, 26, 22, 18, 14, 25, 31, 28, 28, 23, 19, 16, 26, 32, 31, 31, 27, 23, 19, 26, 33, 36, 33, 32, 26, 22, 29, 36, 40, 38, 35, 30, 25, 33, 39, 45, 44, 36, 31, 27, 35, 42, 45, 46, 41, 33, 29, 35, 41, 38, 31, 26, 21, 17, 35, 40, 41, 34, 27, 23, 19, 35, 41, 44, 37, 30, 26, 22, 34, 41, 47, 41, 35, 31, 26, 37, 43, 50, 47, 40, 34, 29, 39, 46, 52, 51, 42, 37, 30, 42, 49, 53, 53, 44, 39, 32, 2, 1, 1, 2, 2, 1, 2, 2, 2, 0, 2, 2, 1, 3, 3, 2, 1, 1, 2, 2, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 5, 5, 10, 10, 9, 8, 7, 5, 5, 17, 15, 11, 9, 7, 5, 5, 3, 2, 1, 1, 1, 3, 5, 3, 2, 2, 1, 1, 3, 6, 3, 2, 2, 2, 2, 4, 7, 6, 4, 4, 4, 5, 5, 8, 9, 7, 7, 8, 8, 5, 8, 13, 12, 11, 11, 10, 9, 8, 20, 17, 13, 11, 11, 10, 8, 3, 2, 4, 5, 5, 6, 8, 6, 3, 4, 6, 6, 6, 8, 10, 3, 5, 8, 8, 7, 10, 13, 4, 9, 11, 12, 11, 12, 16, 9, 12, 15, 15, 15, 12, 20, 14, 16, 18, 17, 16, 12, 22, 20, 19, 20, 19, 17, 16, 10, 7, 11, 11, 11, 9, 12, 13, 8, 11, 12, 13, 13, 13, 16, 10, 13, 16, 16, 16, 15, 18, 13, 17, 19, 19, 19, 17, 20, 18, 22, 23, 24, 22, 19, 20, 24, 27, 27, 25, 25, 22, 23, 30, 30, 28, 27, 26, 25, 19, 18, 19, 19, 20, 18, 12, 21, 19, 20, 21, 21, 20, 13, 22, 21, 23, 24, 25, 23, 18, 21, 26, 27, 28, 28, 27, 23, 24, 31, 33, 32, 33, 30, 25, 27, 36, 38, 36, 34, 31, 26, 31, 39, 41, 38, 37, 34, 28, 28, 31, 30, 29, 25, 21, 17, 28, 33, 32, 31, 28, 23, 19, 27, 35, 35, 34, 31, 26, 23, 28, 36, 40, 38, 35, 30, 27, 32, 41, 45, 44, 39, 34, 29, 35, 43, 51, 48, 42, 36, 30, 39, 46, 51, 50, 44, 38, 32, 37, 44, 41, 34, 29, 24, 20, 39, 44, 44, 37, 32, 26, 23, 38, 43, 47, 40, 36, 31, 26, 38, 45, 50, 45, 39, 35, 30, 40, 48, 54, 50, 43, 37, 32, 44, 51, 56, 53, 46, 40, 34, 46, 52, 57, 57, 49, 42, 37, 3, 2, 2, 0, 0, 2, 4, 3, 3, 2, 0, 1, 2, 5, 3, 3, 2, 2, 2, 3, 6, 4, 4, 4, 4, 4, 5, 7, 7, 7, 7, 7, 7, 6, 7, 12, 11, 11, 10, 8, 6, 7, 17, 15, 12, 10, 9, 6, 7, 3, 3, 2, 2, 2, 5, 7, 3, 3, 2, 2, 2, 5, 8, 7, 3, 2, 3, 5, 6, 9, 10, 4, 5, 6, 8, 7, 10, 13, 8, 9, 9, 12, 8, 10, 16, 13, 13, 12, 13, 12, 10, 22, 18, 14, 13, 15, 14, 10, 7, 3, 5, 7, 7, 8, 10, 11, 3, 5, 8, 9, 8, 11, 14, 4, 6, 11, 12, 9, 12, 17, 7, 9, 14, 15, 15, 15, 19, 11, 13, 18, 19, 18, 15, 24, 16, 18, 20, 21, 20, 15, 25, 21, 20, 22, 22, 21, 18, 14, 8, 13, 14, 14, 11, 15, 17, 10, 13, 15, 17, 16, 16, 20, 12, 14, 18, 20, 20, 18, 22, 16, 19, 22, 23, 23, 19, 23, 21, 24, 26, 27, 27, 23, 24, 26, 29, 30, 30, 28, 27, 25, 32, 32, 31, 31, 29, 29, 22, 20, 22, 23, 23, 22, 15, 27, 21, 24, 24, 25, 24, 16, 25, 23, 26, 28, 28, 27, 21, 25, 29, 30, 32, 33, 31, 27, 27, 34, 36, 37, 37, 34, 29, 30, 38, 42, 41, 38, 35, 31, 32, 41, 45, 42, 42, 38, 33, 32, 33, 34, 32, 29, 25, 19, 31, 36, 35, 34, 32, 27, 24, 31, 38, 37, 38, 34, 30, 27, 31, 39, 43, 42, 39, 35, 31, 35, 43, 50, 47, 44, 39, 33, 39, 47, 55, 52, 46, 39, 34, 43, 50, 54, 55, 49, 42, 36, 41, 46, 44, 38, 32, 27, 24, 41, 46, 46, 40, 34, 31, 27, 40, 48, 50, 44, 40, 35, 30, 41, 47, 55, 48, 43, 39, 34, 44, 50, 58, 54, 48, 42, 37, 47, 54, 60, 58, 52, 45, 37, 50, 55, 61, 60, 54, 47, 39, 2, 2, 2, 1, 1, 2, 4, 3, 2, 2, 1, 0, 2, 5, 3, 2, 2, 2, 2, 4, 6, 4, 4, 4, 4, 4, 5, 7, 8, 7, 7, 7, 7, 6, 7, 12, 11, 11, 10, 8, 6, 7, 17, 15, 13, 10, 9, 6, 7, 3, 2, 2, 1, 3, 5, 8, 4, 2, 2, 2, 3, 5, 8, 7, 3, 2, 3, 6, 6, 9, 11, 4, 5, 6, 9, 7, 10, 14, 8, 8, 9, 12, 8, 10, 17, 13, 13, 12, 14, 12, 10, 22, 18, 14, 13, 15, 14, 10, 7, 3, 5, 8, 8, 9, 11, 12, 3, 5, 8, 9, 8, 11, 15, 5, 5, 11, 12, 9, 13, 18, 8, 9, 15, 16, 15, 15, 21, 12, 13, 18, 19, 19, 15, 25, 16, 18, 21, 21, 21, 15, 25, 22, 20, 23, 23, 22, 19, 15, 8, 13, 15, 15, 12, 16, 18, 10, 14, 16, 17, 17, 17, 21, 13, 14, 19, 20, 21, 18, 25, 17, 19, 23, 23, 24, 20, 25, 21, 24, 27, 28, 27, 23, 25, 26, 29, 31, 30, 28, 26, 25, 32, 32, 32, 31, 31, 29, 23, 21, 22, 24, 24, 23, 16, 26, 22, 23, 24, 26, 25, 17, 26, 24, 26, 28, 30, 28, 21, 26, 28, 31, 33, 33, 32, 27, 27, 35, 36, 36, 38, 35, 30, 29, 38, 41, 42, 39, 36, 31, 34, 41, 45, 43, 42, 38, 33, 32, 34, 34, 32, 30, 25, 20, 31, 35, 35, 35, 32, 28, 23, 31, 38, 38, 38, 35, 31, 28, 31, 40, 44, 43, 39, 35, 32, 34, 43, 49, 47, 43, 40, 32, 40, 46, 54, 52, 46, 39, 35, 43, 50, 55, 55, 48, 42, 36, 42, 47, 45, 39, 33, 28, 24, 41, 47, 48, 40, 35, 31, 27, 41, 47, 50, 45, 40, 35, 31, 42, 48, 56, 49, 44, 39, 35, 45, 51, 57, 55, 48, 42, 37, 48, 53, 61, 59, 51, 44, 39, 50, 57, 61, 61, 54, 48, 40, 2, 1, 1, 3, 3, 1, 3, 2, 1, 1, 2, 2, 0, 3, 2, 2, 1, 1, 2, 2, 4, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 6, 5, 10, 10, 9, 9, 8, 6, 5, 16, 14, 11, 9, 8, 6, 5, 2, 2, 1, 1, 2, 4, 6, 2, 2, 1, 1, 2, 3, 5, 4, 2, 1, 2, 3, 4, 6, 9, 3, 4, 4, 6, 5, 7, 11, 7, 7, 8, 9, 5, 7, 14, 11, 11, 11, 11, 9, 7, 19, 16, 13, 11, 12, 11, 7, 5, 2, 4, 6, 7, 7, 9, 9, 2, 4, 7, 7, 6, 8, 13, 2, 5, 9, 9, 6, 10, 15, 5, 8, 12, 12, 12, 12, 18, 9, 11, 16, 16, 15, 12, 21, 14, 16, 19, 18, 17, 12, 23, 20, 18, 20, 19, 18, 16, 13, 7, 11, 12, 13, 11, 14, 16, 8, 12, 14, 15, 14, 13, 19, 10, 13, 16, 17, 18, 15, 21, 14, 17, 20, 20, 20, 16, 22, 19, 21, 24, 24, 24, 20, 21, 24, 26, 27, 26, 26, 23, 22, 30, 29, 28, 28, 27, 26, 20, 19, 20, 20, 22, 21, 14, 23, 20, 22, 23, 23, 21, 13, 23, 22, 24, 25, 26, 24, 19, 24, 26, 28, 29, 29, 28, 23, 25, 31, 34, 33, 34, 32, 25, 28, 36, 39, 37, 36, 33, 28, 30, 39, 41, 39, 38, 34, 30, 29, 32, 31, 31, 28, 23, 19, 28, 33, 33, 32, 29, 24, 20, 28, 37, 35, 37, 32, 28, 24, 28, 37, 41, 40, 37, 33, 28, 31, 39, 46, 43, 40, 35, 29, 37, 43, 51, 48, 42, 36, 31, 39, 46, 51, 51, 44, 39, 33, 39, 44, 42, 36, 30, 26, 22, 39, 44, 45, 38, 32, 28, 24, 39, 44, 47, 41, 35, 31, 27, 38, 47, 51, 45, 40, 35, 31, 41, 48, 54, 51, 44, 39, 33, 46, 51, 56, 57, 47, 40, 35, 47, 53, 58, 58, 49, 43, 37, 1, 1, 3, 6, 6, 4, 2, 1, 1, 3, 5, 5, 3, 0, 2, 1, 2, 3, 4, 3, 2, 2, 2, 2, 3, 5, 5, 4, 4, 5, 5, 6, 8, 6, 4, 9, 8, 8, 8, 8, 6, 4, 14, 12, 10, 8, 9, 6, 4, 2, 1, 2, 4, 3, 3, 5, 2, 1, 1, 3, 3, 2, 3, 2, 1, 1, 1, 1, 2, 4, 3, 3, 3, 3, 3, 3, 4, 8, 6, 6, 6, 6, 4, 4, 12, 10, 10, 9, 7, 6, 5, 18, 14, 11, 10, 8, 7, 5, 2, 1, 3, 4, 5, 6, 8, 4, 2, 3, 5, 5, 5, 6, 9, 2, 4, 6, 6, 4, 6, 12, 3, 7, 9, 9, 9, 8, 16, 8, 10, 12, 13, 12, 8, 18, 13, 14, 15, 14, 13, 8, 20, 18, 16, 17, 16, 15, 13, 8, 6, 9, 10, 11, 9, 11, 13, 7, 10, 11, 12, 12, 11, 15, 8, 11, 13, 13, 13, 11, 17, 11, 15, 16, 16, 16, 13, 19, 16, 19, 21, 21, 20, 16, 18, 21, 23, 24, 23, 22, 19, 20, 27, 26, 25, 24, 23, 21, 17, 17, 18, 18, 19, 18, 12, 21, 18, 19, 19, 20, 18, 11, 20, 20, 21, 22, 22, 21, 15, 20, 24, 25, 25, 26, 24, 19, 22, 28, 29, 29, 30, 28, 22, 24, 33, 36, 35, 32, 29, 24, 28, 36, 39, 36, 35, 31, 26, 27, 29, 27, 27, 24, 21, 17, 26, 32, 30, 29, 25, 21, 16, 26, 33, 33, 31, 27, 23, 20, 25, 36, 36, 34, 32, 28, 23, 29, 37, 42, 41, 34, 31, 26, 32, 40, 46, 44, 38, 33, 27, 37, 41, 47, 46, 40, 34, 29, 36, 41, 39, 32, 27, 24, 19, 36, 41, 41, 35, 29, 24, 20, 35, 40, 44, 37, 32, 27, 24, 36, 43, 47, 42, 37, 32, 27, 38, 44, 50, 47, 40, 34, 29, 41, 47, 52, 49, 42, 37, 31, 43, 49, 52, 52, 46, 39, 33, 2, 2, 3, 3, 3, 2, 2, 1, 2, 3, 3, 3, 2, 2, 0, 2, 2, 3, 2, 2, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 3, 3, 7, 7, 7, 6, 5, 3, 3, 13, 11, 9, 7, 5, 3, 3, 0, 2, 2, 3, 2, 2, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 3, 4, 9, 8, 8, 7, 5, 4, 4, 16, 13, 10, 8, 6, 4, 3, 2, 1, 2, 2, 2, 1, 4, 2, 1, 1, 1, 1, 1, 4, 2, 1, 1, 0, 0, 1, 5, 3, 2, 3, 3, 3, 3, 6, 7, 6, 6, 6, 7, 6, 6, 12, 11, 11, 10, 8, 7, 6, 19, 17, 13, 12, 10, 9, 8, 2, 4, 4, 5, 5, 5, 8, 3, 5, 5, 6, 6, 6, 8, 7, 6, 6, 7, 7, 7, 8, 10, 9, 10, 10, 10, 11, 10, 10, 14, 14, 14, 14, 13, 13, 13, 19, 19, 18, 16, 15, 14, 18, 25, 22, 20, 18, 16, 16, 12, 12, 12, 12, 12, 12, 8, 14, 14, 14, 13, 14, 13, 8, 14, 16, 15, 15, 15, 14, 11, 14, 19, 19, 19, 19, 18, 14, 17, 23, 23, 23, 23, 20, 16, 21, 27, 28, 27, 26, 23, 18, 25, 31, 32, 29, 28, 25, 20, 21, 23, 22, 21, 18, 14, 10, 21, 25, 23, 23, 20, 16, 11, 21, 27, 26, 25, 22, 18, 14, 21, 27, 30, 29, 25, 21, 18, 24, 30, 34, 34, 30, 25, 19, 27, 33, 39, 37, 32, 26, 21, 30, 36, 40, 40, 35, 28, 23, 29, 34, 33, 27, 22, 17, 13, 29, 35, 37, 29, 23, 19, 14, 29, 35, 39, 32, 25, 22, 17, 30, 35, 42, 35, 30, 25, 21, 31, 37, 44, 40, 35, 29, 23, 33, 41, 46, 46, 36, 31, 25, 36, 43, 47, 46, 39, 32, 26, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 4, 4, 8, 8, 8, 7, 5, 4, 4, 14, 12, 9, 8, 6, 4, 4, 2, 0, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 4, 2, 2, 2, 3, 2, 3, 5, 6, 5, 5, 5, 5, 4, 5, 11, 10, 9, 8, 6, 5, 5, 18, 15, 11, 9, 7, 5, 5, 2, 2, 1, 2, 1, 3, 6, 2, 2, 2, 2, 2, 4, 6, 4, 2, 3, 3, 4, 4, 7, 7, 3, 6, 6, 6, 7, 9, 11, 7, 9, 10, 10, 10, 8, 15, 12, 14, 13, 12, 11, 8, 20, 18, 17, 15, 14, 12, 11, 4, 6, 7, 7, 8, 7, 10, 8, 7, 8, 8, 9, 9, 10, 11, 8, 10, 10, 11, 11, 11, 14, 10, 14, 14, 14, 14, 13, 14, 16, 18, 18, 18, 17, 16, 15, 21, 22, 21, 20, 18, 18, 20, 28, 26, 24, 22, 20, 19, 14, 15, 15, 15, 16, 15, 10, 17, 17, 16, 16, 17, 15, 10, 16, 18, 19, 19, 19, 18, 14, 17, 22, 23, 23, 23, 21, 18, 19, 27, 27, 27, 27, 24, 20, 24, 31, 34, 32, 29, 27, 21, 28, 34, 36, 33, 31, 28, 23, 24, 26, 24, 24, 21, 17, 13, 24, 29, 27, 26, 23, 18, 14, 24, 30, 29, 28, 25, 21, 17, 24, 31, 34, 32, 29, 25, 22, 29, 35, 38, 37, 34, 29, 23, 32, 37, 44, 42, 36, 31, 25, 34, 40, 45, 44, 39, 33, 26, 33, 38, 37, 30, 24, 20, 16, 32, 39, 40, 32, 26, 21, 18, 32, 38, 42, 35, 30, 25, 21, 33, 40, 46, 39, 33, 28, 24, 34, 41, 48, 43, 38, 32, 27, 37, 43, 49, 49, 41, 35, 28, 40, 46, 49, 50, 44, 36, 30, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 0, 2, 1, 2, 3, 2, 3, 2, 3, 3, 4, 5, 5, 5, 6, 5, 6, 5, 5, 10, 9, 9, 8, 6, 5, 5, 16, 14, 11, 8, 7, 5, 4, 2, 2, 1, 2, 1, 2, 5, 2, 2, 1, 1, 1, 2, 5, 3, 2, 1, 1, 1, 3, 6, 4, 3, 3, 3, 4, 4, 7, 8, 6, 7, 7, 7, 5, 7, 12, 11, 10, 10, 9, 7, 7, 19, 16, 13, 11, 10, 9, 7, 2, 2, 4, 4, 5, 6, 8, 4, 2, 4, 5, 5, 6, 8, 8, 2, 5, 7, 7, 6, 9, 11, 4, 8, 10, 10, 10, 11, 14, 8, 11, 14, 14, 14, 11, 18, 14, 16, 17, 16, 15, 11, 21, 20, 18, 19, 18, 16, 14, 8, 7, 10, 11, 11, 9, 12, 11, 8, 11, 11, 12, 12, 12, 14, 8, 12, 14, 14, 15, 14, 17, 12, 17, 18, 18, 17, 15, 18, 17, 21, 21, 22, 21, 19, 18, 23, 26, 25, 24, 23, 21, 22, 30, 29, 27, 26, 24, 23, 17, 18, 18, 18, 19, 18, 12, 19, 19, 19, 20, 20, 19, 12, 20, 20, 21, 23, 23, 22, 17, 20, 25, 27, 26, 27, 26, 21, 22, 30, 32, 31, 31, 29, 23, 26, 35, 37, 35, 33, 30, 25, 30, 37, 40, 37, 36, 32, 27, 28, 29, 28, 28, 25, 20, 17, 27, 32, 31, 30, 26, 22, 18, 27, 34, 34, 34, 29, 25, 21, 27, 35, 38, 37, 34, 30, 25, 31, 38, 43, 41, 38, 33, 27, 34, 41, 49, 47, 39, 33, 29, 38, 44, 49, 49, 43, 36, 30, 36, 43, 41, 34, 28, 24, 20, 37, 43, 44, 36, 30, 25, 21, 36, 43, 46, 38, 34, 29, 24, 37, 44, 49, 44, 38, 34, 29, 40, 46, 53, 49, 42, 36, 30, 42, 49, 55, 54, 45, 38, 33, 45, 51, 55, 55, 48, 41, 34, 2, 2, 1, 2, 2, 2, 4, 2, 2, 1, 2, 2, 1, 3, 3, 2, 2, 0, 1, 2, 4, 3, 3, 3, 3, 2, 3, 5, 6, 6, 6, 6, 5, 4, 5, 10, 10, 9, 8, 6, 4, 5, 16, 14, 11, 9, 7, 4, 5, 2, 2, 1, 2, 3, 5, 7, 3, 2, 2, 2, 3, 4, 6, 4, 2, 2, 2, 3, 5, 7, 7, 3, 4, 4, 6, 6, 8, 10, 7, 7, 8, 9, 6, 8, 14, 11, 11, 10, 11, 10, 8, 19, 16, 13, 11, 13, 11, 8, 4, 2, 5, 7, 8, 9, 11, 8, 3, 4, 7, 8, 8, 10, 11, 3, 5, 9, 10, 8, 11, 14, 5, 8, 12, 13, 13, 13, 18, 9, 12, 16, 17, 16, 13, 21, 14, 16, 19, 19, 18, 13, 22, 20, 18, 21, 20, 19, 17, 11, 8, 12, 14, 14, 12, 16, 15, 8, 13, 14, 15, 16, 15, 18, 10, 14, 17, 18, 17, 16, 20, 14, 18, 20, 21, 21, 18, 21, 19, 23, 24, 25, 24, 21, 21, 24, 27, 28, 27, 27, 24, 23, 30, 31, 29, 29, 27, 27, 20, 19, 21, 22, 23, 22, 16, 23, 21, 23, 23, 24, 22, 15, 23, 23, 24, 26, 26, 25, 20, 23, 27, 29, 30, 31, 29, 25, 25, 32, 33, 34, 34, 32, 27, 27, 36, 39, 38, 36, 34, 29, 31, 39, 43, 41, 39, 37, 30, 30, 33, 33, 32, 29, 25, 20, 29, 34, 34, 34, 30, 25, 21, 29, 37, 37, 37, 33, 28, 25, 30, 39, 41, 40, 37, 33, 29, 33, 42, 47, 45, 41, 38, 30, 36, 44, 51, 49, 44, 38, 33, 40, 47, 52, 53, 46, 38, 34, 41, 46, 44, 37, 32, 28, 23, 40, 45, 46, 40, 33, 29, 25, 40, 46, 49, 42, 37, 33, 28, 40, 47, 53, 47, 41, 36, 32, 43, 50, 55, 52, 46, 40, 35, 45, 52, 57, 56, 49, 43, 36, 48, 54, 57, 58, 52, 44, 38, 2, 1, 2, 2, 2, 4, 5, 2, 2, 2, 2, 2, 2, 4, 3, 2, 2, 1, 0, 2, 5, 3, 3, 3, 2, 2, 3, 6, 7, 6, 6, 5, 5, 4, 6, 11, 9, 9, 8, 6, 4, 6, 16, 13, 10, 8, 7, 4, 6, 3, 2, 2, 3, 4, 7, 9, 3, 2, 2, 3, 4, 6, 8, 5, 2, 2, 2, 4, 5, 8, 9, 4, 4, 4, 7, 6, 9, 13, 7, 7, 7, 10, 6, 9, 16, 11, 11, 10, 12, 11, 9, 20, 16, 12, 11, 13, 12, 9, 5, 2, 5, 9, 9, 10, 13, 9, 3, 5, 9, 10, 9, 11, 13, 3, 5, 10, 11, 8, 11, 15, 6, 8, 13, 14, 14, 14, 20, 11, 12, 16, 18, 18, 13, 23, 15, 16, 19, 20, 18, 14, 23, 19, 18, 20, 21, 20, 18, 13, 8, 13, 15, 16, 14, 18, 16, 9, 14, 16, 17, 17, 17, 19, 11, 14, 18, 18, 19, 17, 23, 15, 18, 21, 22, 22, 19, 24, 20, 23, 25, 26, 25, 22, 24, 24, 27, 28, 28, 28, 25, 23, 30, 31, 30, 30, 29, 27, 21, 20, 23, 23, 25, 24, 18, 25, 22, 24, 25, 26, 24, 17, 24, 24, 27, 28, 28, 26, 21, 24, 28, 30, 31, 31, 29, 26, 26, 32, 35, 36, 36, 33, 28, 28, 37, 40, 39, 39, 35, 29, 30, 40, 45, 42, 40, 37, 32, 31, 34, 33, 34, 31, 27, 22, 31, 36, 35, 36, 32, 28, 23, 30, 38, 38, 38, 34, 30, 26, 30, 41, 42, 42, 39, 33, 29, 34, 43, 48, 47, 42, 37, 31, 36, 45, 53, 51, 44, 40, 34, 41, 47, 53, 54, 47, 40, 35, 41, 47, 45, 39, 34, 30, 26, 41, 47, 47, 41, 35, 30, 26, 42, 48, 50, 44, 37, 34, 30, 42, 48, 54, 47, 42, 38, 33, 43, 51, 56, 52, 47, 40, 35, 47, 53, 59, 57, 49, 42, 37, 50, 55, 59, 59, 52, 46, 39, 1, 2, 2, 4, 4, 3, 4, 2, 1, 2, 4, 4, 2, 3, 2, 2, 2, 2, 3, 0, 3, 2, 2, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 4, 4, 8, 8, 7, 7, 6, 4, 4, 13, 11, 9, 7, 6, 4, 4, 2, 1, 2, 3, 4, 6, 7, 2, 1, 2, 3, 4, 5, 6, 3, 2, 1, 1, 2, 3, 5, 6, 3, 2, 3, 4, 4, 6, 10, 5, 5, 6, 7, 4, 6, 12, 9, 9, 8, 9, 7, 6, 17, 14, 10, 9, 10, 9, 6, 2, 2, 5, 7, 8, 9, 11, 7, 2, 4, 8, 8, 8, 9, 11, 2, 4, 7, 8, 6, 8, 14, 4, 7, 10, 10, 11, 10, 17, 8, 10, 14, 15, 14, 10, 19, 12, 14, 16, 16, 15, 10, 20, 17, 15, 17, 18, 17, 15, 11, 7, 12, 14, 14, 12, 15, 14, 8, 12, 15, 16, 15, 15, 17, 9, 12, 15, 16, 16, 14, 19, 12, 16, 18, 19, 18, 15, 21, 17, 20, 22, 23, 22, 18, 20, 22, 24, 25, 25, 23, 22, 20, 26, 26, 27, 26, 25, 24, 18, 18, 21, 22, 23, 22, 16, 21, 20, 22, 23, 24, 23, 15, 22, 21, 24, 25, 24, 23, 18, 22, 26, 26, 28, 28, 27, 23, 23, 30, 31, 32, 33, 29, 24, 26, 34, 38, 36, 34, 31, 26, 27, 36, 39, 37, 37, 34, 27, 28, 31, 32, 32, 29, 25, 20, 29, 33, 33, 33, 29, 25, 21, 27, 36, 35, 34, 30, 27, 23, 28, 38, 39, 37, 34, 29, 26, 31, 39, 43, 42, 38, 32, 28, 34, 41, 48, 46, 41, 34, 30, 37, 44, 49, 49, 42, 37, 31, 39, 44, 42, 36, 31, 27, 23, 39, 45, 45, 38, 33, 28, 23, 39, 45, 47, 40, 34, 30, 26, 40, 45, 52, 44, 38, 34, 30, 41, 47, 52, 49, 42, 37, 33, 43, 48, 55, 53, 45, 39, 33, 46, 51, 56, 55, 48, 40, 35, 2, 3, 5, 6, 6, 5, 4, 1, 2, 4, 6, 6, 4, 2, 1, 2, 3, 4, 5, 3, 0, 1, 1, 1, 3, 4, 3, 2, 3, 3, 3, 4, 6, 4, 2, 7, 6, 6, 6, 6, 4, 2, 11, 9, 7, 6, 6, 4, 2, 1, 2, 3, 5, 4, 5, 6, 1, 2, 3, 4, 4, 4, 5, 2, 1, 2, 3, 2, 2, 3, 2, 1, 1, 1, 1, 2, 4, 5, 4, 4, 4, 3, 2, 3, 9, 8, 7, 7, 5, 4, 4, 14, 11, 8, 7, 7, 6, 4, 2, 1, 5, 5, 6, 8, 9, 2, 1, 4, 6, 6, 6, 8, 5, 1, 4, 6, 6, 5, 6, 10, 2, 5, 7, 7, 7, 7, 13, 6, 8, 10, 11, 10, 7, 15, 11, 11, 13, 13, 11, 7, 16, 14, 13, 14, 14, 13, 12, 6, 6, 11, 11, 12, 11, 13, 11, 7, 11, 12, 13, 13, 12, 13, 7, 11, 13, 13, 13, 11, 16, 10, 14, 15, 14, 15, 12, 17, 15, 17, 19, 19, 18, 15, 16, 19, 20, 21, 21, 20, 18, 16, 22, 23, 23, 23, 21, 20, 15, 17, 18, 19, 20, 19, 13, 18, 18, 20, 20, 21, 20, 12, 18, 19, 21, 21, 21, 19, 15, 18, 22, 24, 24, 24, 22, 18, 20, 27, 28, 28, 28, 26, 20, 21, 30, 33, 31, 29, 28, 22, 24, 33, 34, 33, 32, 28, 24, 27, 30, 29, 29, 26, 22, 17, 26, 31, 30, 31, 27, 22, 18, 26, 34, 33, 31, 27, 23, 19, 26, 34, 35, 33, 31, 27, 22, 28, 36, 40, 38, 34, 29, 24, 31, 37, 43, 42, 36, 30, 26, 33, 39, 45, 44, 39, 33, 27, 37, 41, 39, 34, 29, 25, 21, 36, 41, 42, 36, 30, 25, 21, 37, 41, 45, 37, 31, 26, 22, 36, 42, 46, 41, 35, 31, 26, 37, 43, 48, 44, 38, 31, 28, 39, 45, 50, 48, 41, 34, 29, 41, 46, 51, 51, 45, 36, 29, 2, 2, 3, 4, 4, 3, 2, 2, 2, 3, 4, 4, 3, 2, 1, 2, 2, 3, 3, 2, 1, 0, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 7, 6, 7, 6, 4, 3, 3, 12, 11, 8, 7, 5, 3, 3, 1, 2, 3, 3, 2, 2, 2, 0, 2, 2, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 3, 4, 3, 4, 4, 4, 3, 3, 9, 8, 8, 7, 5, 3, 3, 16, 13, 10, 8, 6, 4, 3, 1, 2, 2, 2, 2, 2, 3, 2, 1, 1, 2, 2, 2, 3, 2, 0, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 5, 6, 5, 5, 5, 5, 4, 5, 12, 10, 10, 9, 7, 6, 5, 18, 17, 13, 10, 9, 7, 6, 2, 3, 3, 4, 4, 4, 7, 2, 4, 4, 5, 5, 5, 8, 5, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 9, 9, 13, 13, 12, 13, 12, 11, 12, 19, 17, 16, 15, 14, 13, 18, 24, 21, 18, 17, 15, 15, 11, 11, 11, 11, 11, 11, 8, 13, 13, 12, 13, 13, 12, 8, 12, 15, 15, 14, 14, 13, 10, 13, 18, 18, 17, 18, 16, 13, 16, 23, 22, 22, 22, 20, 15, 20, 26, 28, 26, 25, 21, 17, 24, 29, 30, 27, 27, 23, 18, 20, 23, 21, 21, 17, 13, 10, 21, 24, 23, 22, 19, 15, 10, 21, 25, 26, 24, 21, 17, 12, 21, 27, 28, 27, 25, 20, 17, 23, 29, 33, 33, 29, 23, 19, 25, 32, 38, 36, 30, 26, 20, 29, 35, 39, 39, 34, 27, 21, 28, 34, 33, 25, 21, 17, 12, 28, 34, 34, 29, 22, 17, 13, 28, 34, 38, 30, 25, 20, 16, 29, 34, 40, 33, 29, 24, 20, 30, 37, 42, 38, 33, 26, 22, 33, 39, 44, 43, 36, 29, 24, 35, 41, 44, 44, 38, 32, 26, 1, 2, 3, 4, 4, 3, 3, 2, 2, 3, 4, 4, 3, 2, 1, 2, 3, 3, 3, 2, 1, 2, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 7, 6, 6, 6, 4, 3, 3, 13, 11, 8, 6, 5, 3, 3, 2, 2, 3, 3, 3, 3, 3, 2, 1, 2, 3, 3, 2, 3, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 3, 4, 4, 4, 4, 4, 3, 3, 9, 8, 8, 7, 5, 3, 3, 16, 13, 10, 7, 5, 4, 3, 2, 1, 2, 2, 3, 4, 6, 2, 2, 2, 3, 3, 4, 6, 2, 2, 2, 2, 3, 3, 6, 5, 2, 4, 4, 4, 5, 7, 8, 6, 8, 8, 8, 7, 6, 13, 11, 12, 11, 10, 9, 7, 19, 16, 15, 13, 11, 10, 9, 2, 6, 7, 8, 8, 7, 10, 5, 6, 8, 8, 9, 9, 10, 9, 7, 8, 9, 9, 9, 10, 12, 9, 12, 12, 12, 12, 11, 12, 14, 15, 15, 16, 15, 14, 13, 20, 20, 19, 18, 16, 15, 18, 26, 24, 21, 19, 18, 18, 13, 14, 15, 15, 16, 15, 10, 14, 16, 15, 16, 17, 16, 10, 15, 18, 17, 17, 17, 16, 12, 15, 21, 21, 21, 21, 19, 16, 18, 25, 25, 25, 25, 22, 17, 21, 28, 30, 28, 26, 24, 19, 25, 32, 34, 31, 30, 26, 21, 24, 24, 25, 25, 21, 17, 13, 23, 27, 26, 25, 23, 18, 14, 23, 29, 28, 27, 23, 19, 15, 23, 30, 31, 31, 27, 23, 19, 26, 32, 36, 35, 31, 26, 21, 29, 35, 41, 41, 34, 28, 23, 31, 38, 42, 43, 35, 30, 24, 32, 38, 36, 30, 25, 20, 16, 31, 38, 39, 32, 26, 21, 17, 31, 38, 41, 33, 27, 23, 19, 32, 37, 44, 36, 31, 26, 23, 34, 39, 45, 42, 36, 30, 25, 35, 41, 47, 46, 39, 33, 26, 38, 44, 48, 49, 42, 34, 29, 1, 2, 3, 4, 4, 4, 3, 2, 2, 3, 4, 4, 3, 2, 1, 2, 2, 3, 3, 1, 1, 2, 2, 0, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 7, 7, 7, 6, 4, 3, 3, 13, 11, 8, 6, 5, 3, 3, 2, 2, 2, 3, 4, 4, 6, 2, 2, 2, 3, 3, 3, 5, 2, 1, 2, 2, 2, 2, 4, 2, 2, 2, 1, 1, 2, 5, 5, 5, 4, 4, 4, 3, 5, 10, 9, 8, 7, 6, 4, 5, 17, 14, 10, 8, 7, 6, 5, 2, 2, 4, 5, 5, 7, 9, 2, 2, 4, 5, 6, 7, 8, 5, 2, 4, 5, 5, 6, 7, 8, 3, 6, 7, 7, 7, 9, 12, 6, 9, 10, 11, 10, 9, 15, 11, 13, 14, 13, 12, 9, 19, 17, 16, 16, 14, 13, 12, 4, 7, 10, 11, 12, 10, 13, 9, 7, 11, 12, 12, 12, 13, 12, 8, 11, 12, 12, 12, 12, 14, 10, 14, 15, 15, 15, 13, 16, 15, 18, 18, 20, 18, 16, 15, 21, 23, 22, 21, 20, 19, 19, 27, 26, 24, 22, 21, 20, 15, 17, 18, 19, 19, 18, 13, 17, 18, 19, 20, 21, 19, 13, 18, 20, 21, 21, 20, 19, 15, 17, 24, 24, 24, 24, 23, 18, 20, 27, 28, 29, 28, 26, 21, 23, 32, 34, 32, 30, 27, 22, 27, 35, 37, 35, 32, 29, 23, 26, 29, 28, 28, 25, 21, 17, 27, 31, 30, 30, 26, 21, 17, 27, 33, 33, 31, 27, 22, 19, 27, 34, 36, 34, 31, 26, 22, 28, 36, 41, 40, 36, 28, 24, 33, 38, 45, 43, 37, 32, 26, 35, 41, 45, 45, 40, 34, 28, 35, 41, 40, 33, 29, 24, 20, 35, 42, 43, 35, 29, 25, 20, 36, 41, 45, 37, 31, 26, 22, 36, 41, 47, 40, 35, 30, 25, 37, 43, 48, 46, 40, 33, 27, 39, 44, 51, 51, 42, 35, 30, 43, 47, 52, 52, 46, 38, 31, 2, 2, 3, 5, 5, 4, 5, 2, 2, 3, 4, 4, 3, 3, 2, 2, 3, 3, 2, 1, 3, 2, 2, 2, 0, 2, 1, 3, 4, 4, 3, 3, 3, 2, 3, 8, 7, 7, 6, 4, 2, 4, 13, 11, 8, 6, 5, 2, 3, 2, 2, 3, 3, 5, 6, 8, 2, 2, 2, 3, 4, 5, 7, 2, 2, 2, 2, 3, 4, 6, 4, 2, 2, 2, 3, 4, 6, 8, 5, 5, 5, 6, 4, 7, 11, 9, 9, 8, 8, 7, 7, 17, 13, 10, 8, 10, 8, 7, 2, 2, 5, 7, 8, 10, 12, 4, 2, 5, 8, 9, 9, 11, 8, 2, 5, 8, 8, 7, 9, 11, 3, 6, 10, 10, 10, 10, 15, 7, 9, 13, 14, 13, 11, 18, 12, 13, 16, 15, 15, 11, 19, 17, 16, 17, 17, 16, 15, 8, 8, 12, 14, 15, 13, 16, 12, 8, 13, 14, 16, 15, 15, 15, 8, 13, 15, 16, 15, 15, 17, 12, 16, 17, 18, 18, 16, 19, 16, 20, 22, 22, 22, 18, 18, 22, 24, 25, 24, 23, 22, 19, 26, 27, 26, 26, 24, 24, 17, 19, 21, 21, 23, 22, 16, 20, 20, 22, 24, 24, 23, 16, 20, 22, 23, 24, 24, 22, 18, 20, 25, 27, 27, 27, 26, 22, 22, 30, 31, 32, 31, 29, 24, 25, 34, 36, 36, 34, 30, 26, 29, 37, 40, 37, 36, 33, 27, 28, 32, 32, 31, 29, 25, 20, 28, 34, 33, 33, 29, 25, 21, 28, 36, 36, 35, 30, 25, 22, 29, 37, 39, 37, 33, 30, 25, 31, 39, 44, 43, 38, 33, 27, 34, 41, 49, 46, 41, 35, 29, 39, 43, 49, 49, 42, 37, 31, 39, 46, 43, 37, 31, 27, 23, 39, 45, 46, 39, 33, 28, 23, 39, 46, 49, 41, 34, 29, 25, 39, 45, 50, 44, 37, 34, 29, 40, 47, 52, 49, 42, 37, 31, 43, 49, 54, 53, 46, 39, 32, 45, 51, 54, 55, 49, 42, 34, 2, 3, 3, 4, 4, 6, 7, 2, 2, 3, 4, 3, 4, 5, 2, 2, 3, 2, 2, 2, 4, 3, 2, 2, 2, 0, 2, 5, 5, 4, 4, 3, 3, 3, 5, 9, 8, 7, 6, 4, 3, 5, 13, 10, 8, 6, 5, 3, 5, 2, 2, 3, 4, 6, 9, 10, 3, 2, 3, 4, 6, 7, 9, 3, 2, 2, 3, 4, 6, 8, 6, 3, 2, 2, 5, 5, 8, 10, 5, 5, 5, 8, 6, 8, 13, 9, 8, 8, 10, 9, 8, 16, 13, 9, 8, 11, 11, 8, 3, 2, 6, 9, 11, 12, 14, 7, 2, 6, 10, 11, 11, 13, 10, 3, 5, 9, 11, 10, 12, 13, 4, 7, 11, 12, 13, 12, 18, 9, 10, 14, 16, 15, 13, 21, 12, 13, 17, 18, 17, 12, 20, 16, 15, 18, 19, 19, 17, 10, 8, 14, 16, 17, 15, 18, 13, 8, 14, 17, 18, 18, 18, 16, 10, 14, 17, 19, 19, 17, 20, 13, 17, 20, 21, 21, 18, 21, 18, 21, 23, 25, 24, 21, 21, 22, 25, 26, 27, 25, 24, 20, 26, 27, 28, 28, 27, 26, 19, 20, 23, 25, 26, 25, 19, 22, 22, 25, 26, 27, 25, 18, 23, 23, 26, 27, 27, 26, 21, 22, 26, 29, 30, 31, 29, 24, 24, 31, 34, 34, 34, 31, 27, 26, 34, 38, 37, 36, 34, 28, 28, 36, 41, 38, 38, 35, 30, 31, 35, 35, 35, 31, 28, 23, 31, 37, 36, 36, 33, 28, 24, 30, 39, 38, 37, 33, 29, 25, 31, 38, 41, 40, 36, 32, 28, 32, 41, 46, 44, 40, 35, 29, 35, 43, 52, 49, 42, 37, 32, 37, 45, 51, 51, 45, 39, 33, 40, 48, 45, 39, 34, 31, 26, 42, 48, 48, 41, 36, 30, 26, 42, 48, 50, 43, 37, 32, 28, 41, 48, 53, 46, 39, 35, 31, 43, 49, 54, 52, 45, 39, 33, 44, 52, 57, 56, 47, 42, 36, 46, 53, 57, 58, 50, 43, 37, 3, 4, 4, 5, 5, 6, 7, 2, 3, 4, 5, 5, 4, 5, 2, 3, 4, 3, 3, 2, 3, 2, 2, 2, 2, 2, 0, 3, 3, 2, 2, 2, 3, 2, 3, 6, 5, 5, 4, 3, 2, 3, 9, 7, 5, 4, 3, 2, 3, 2, 3, 4, 5, 6, 8, 9, 2, 3, 3, 5, 6, 6, 7, 2, 2, 3, 3, 4, 5, 6, 4, 2, 1, 1, 3, 3, 5, 8, 3, 3, 4, 5, 3, 5, 10, 6, 6, 5, 7, 6, 5, 12, 9, 6, 5, 8, 7, 5, 2, 2, 6, 8, 9, 11, 12, 5, 2, 5, 9, 9, 9, 11, 9, 2, 5, 8, 9, 8, 10, 13, 2, 5, 8, 9, 9, 9, 15, 6, 8, 11, 12, 12, 9, 16, 8, 10, 13, 14, 13, 9, 15, 12, 11, 15, 15, 15, 13, 9, 7, 13, 15, 15, 14, 17, 14, 8, 13, 15, 16, 16, 16, 16, 8, 13, 15, 16, 16, 15, 18, 10, 14, 17, 17, 17, 14, 19, 15, 18, 20, 20, 20, 17, 16, 18, 21, 22, 22, 22, 20, 15, 21, 22, 24, 24, 23, 22, 17, 19, 22, 23, 24, 23, 16, 20, 20, 23, 24, 25, 23, 16, 20, 21, 24, 25, 24, 23, 19, 20, 24, 25, 26, 27, 25, 21, 21, 29, 30, 29, 30, 28, 23, 22, 30, 33, 33, 31, 29, 24, 22, 31, 36, 35, 33, 31, 26, 28, 32, 32, 32, 30, 26, 21, 28, 34, 34, 34, 30, 25, 21, 29, 36, 35, 35, 31, 26, 22, 28, 36, 38, 36, 32, 28, 24, 29, 38, 44, 40, 36, 32, 26, 32, 40, 46, 43, 38, 33, 28, 33, 42, 46, 46, 41, 35, 30, 39, 46, 44, 37, 32, 28, 24, 40, 45, 46, 40, 33, 29, 24, 40, 46, 48, 40, 33, 29, 24, 40, 45, 50, 43, 37, 33, 28, 40, 45, 51, 47, 40, 34, 29, 41, 47, 52, 51, 43, 37, 31, 43, 48, 53, 53, 46, 39, 32, 4, 5, 6, 7, 8, 6, 7, 4, 4, 5, 7, 7, 5, 4, 3, 4, 4, 5, 6, 3, 2, 3, 3, 3, 3, 5, 3, 0, 2, 1, 1, 2, 4, 2, 0, 3, 2, 2, 2, 3, 2, 0, 5, 3, 2, 2, 3, 2, 0, 4, 4, 5, 6, 7, 8, 8, 3, 4, 4, 5, 6, 6, 6, 2, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 2, 2, 1, 3, 4, 3, 2, 2, 2, 2, 3, 8, 5, 3, 2, 4, 3, 3, 3, 4, 6, 7, 9, 10, 11, 2, 3, 6, 8, 8, 8, 9, 5, 3, 6, 7, 7, 6, 8, 9, 2, 4, 7, 6, 7, 6, 12, 3, 5, 7, 8, 8, 6, 13, 4, 6, 9, 9, 9, 6, 11, 8, 6, 9, 10, 10, 10, 5, 7, 11, 12, 13, 13, 14, 10, 8, 12, 13, 14, 14, 13, 13, 8, 12, 13, 14, 14, 12, 15, 8, 12, 14, 14, 14, 11, 15, 10, 13, 15, 16, 15, 14, 13, 12, 15, 17, 17, 17, 16, 11, 15, 17, 18, 19, 18, 18, 15, 17, 20, 20, 21, 21, 14, 18, 18, 21, 21, 21, 20, 13, 18, 20, 22, 22, 22, 20, 16, 18, 20, 22, 22, 23, 21, 17, 16, 23, 26, 24, 24, 22, 18, 16, 24, 27, 28, 26, 24, 20, 17, 25, 30, 28, 28, 26, 21, 27, 29, 30, 29, 26, 23, 18, 27, 32, 31, 31, 27, 22, 18, 27, 33, 33, 32, 27, 23, 19, 27, 33, 35, 32, 29, 24, 19, 26, 33, 37, 35, 31, 26, 22, 27, 34, 39, 37, 32, 28, 23, 27, 34, 40, 40, 35, 29, 24, 37, 42, 41, 34, 29, 25, 21, 37, 42, 43, 35, 30, 25, 21, 37, 43, 44, 36, 31, 27, 22, 37, 42, 46, 40, 32, 27, 23, 36, 41, 46, 41, 35, 28, 24, 36, 42, 46, 45, 37, 31, 26, 36, 41, 46, 46, 39, 33, 27, 4, 5, 6, 8, 8, 6, 5, 4, 5, 6, 7, 8, 6, 4, 3, 4, 5, 6, 7, 4, 3, 3, 3, 4, 4, 4, 3, 2, 0, 2, 2, 2, 3, 2, 2, 4, 4, 4, 3, 3, 2, 2, 10, 8, 6, 4, 3, 2, 2, 3, 4, 5, 6, 5, 5, 5, 3, 4, 5, 6, 6, 5, 4, 2, 4, 4, 5, 4, 4, 3, 2, 2, 3, 3, 3, 2, 1, 2, 2, 2, 2, 2, 2, 1, 6, 5, 6, 5, 2, 1, 1, 13, 11, 7, 5, 3, 1, 1, 2, 3, 4, 4, 5, 5, 5, 2, 3, 4, 4, 5, 4, 5, 2, 2, 4, 3, 4, 4, 4, 2, 1, 1, 1, 1, 1, 2, 3, 3, 2, 2, 3, 1, 2, 9, 8, 7, 6, 4, 3, 2, 15, 14, 10, 7, 6, 4, 3, 2, 3, 5, 5, 6, 6, 8, 1, 4, 5, 6, 6, 6, 8, 3, 5, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 7, 7, 6, 10, 9, 10, 10, 9, 8, 9, 15, 14, 13, 12, 11, 10, 15, 21, 18, 15, 14, 12, 12, 11, 11, 11, 12, 13, 11, 8, 12, 13, 13, 13, 14, 12, 8, 12, 14, 14, 14, 15, 13, 9, 12, 16, 15, 15, 15, 14, 10, 14, 19, 19, 19, 19, 17, 12, 17, 23, 24, 23, 21, 19, 13, 21, 26, 28, 25, 23, 21, 15, 20, 22, 21, 22, 19, 14, 10, 20, 24, 23, 24, 20, 16, 11, 20, 26, 25, 25, 21, 16, 12, 20, 25, 26, 25, 22, 18, 14, 20, 26, 30, 29, 25, 20, 15, 22, 29, 36, 33, 28, 23, 17, 25, 31, 35, 36, 30, 25, 19, 28, 35, 32, 26, 22, 17, 13, 28, 35, 36, 29, 24, 18, 14, 28, 34, 38, 30, 25, 19, 14, 28, 35, 38, 31, 26, 21, 17, 26, 33, 38, 36, 30, 26, 19, 29, 36, 40, 39, 33, 28, 20, 32, 37, 40, 40, 33, 29, 23, 4, 5, 6, 7, 7, 7, 6, 3, 5, 6, 7, 7, 6, 5, 3, 4, 5, 6, 6, 4, 3, 3, 3, 3, 4, 4, 2, 1, 2, 0, 1, 2, 3, 2, 2, 4, 4, 4, 3, 2, 2, 1, 10, 8, 5, 4, 2, 2, 1, 3, 4, 5, 7, 7, 7, 6, 3, 4, 5, 6, 6, 5, 5, 2, 3, 5, 5, 5, 4, 3, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 1, 1, 0, 7, 6, 5, 4, 2, 1, 0, 13, 11, 7, 5, 3, 1, 0, 3, 3, 4, 5, 6, 7, 8, 2, 3, 4, 5, 6, 6, 7, 2, 2, 4, 4, 4, 4, 6, 2, 2, 2, 2, 3, 3, 5, 5, 3, 5, 5, 5, 4, 5, 10, 8, 9, 8, 7, 6, 5, 15, 13, 12, 10, 8, 7, 6, 2, 6, 7, 8, 9, 9, 11, 2, 7, 8, 8, 9, 9, 10, 6, 7, 8, 9, 9, 9, 10, 9, 7, 9, 9, 9, 9, 9, 9, 11, 12, 12, 13, 12, 11, 10, 17, 17, 16, 14, 13, 13, 16, 23, 20, 18, 16, 15, 14, 13, 14, 14, 15, 16, 15, 11, 13, 16, 16, 16, 17, 16, 11, 14, 17, 17, 17, 17, 16, 12, 14, 18, 17, 18, 18, 16, 13, 15, 22, 22, 21, 22, 19, 14, 19, 26, 27, 26, 24, 21, 16, 23, 30, 31, 28, 26, 23, 18, 23, 25, 24, 24, 22, 17, 13, 23, 27, 26, 25, 23, 18, 14, 23, 29, 29, 26, 23, 18, 14, 23, 28, 29, 28, 24, 20, 16, 23, 29, 33, 32, 28, 23, 18, 26, 32, 39, 37, 31, 25, 19, 29, 33, 38, 39, 34, 27, 21, 31, 37, 37, 29, 24, 20, 16, 32, 38, 39, 31, 26, 21, 17, 31, 37, 41, 33, 27, 21, 17, 31, 36, 43, 34, 28, 24, 20, 30, 37, 42, 40, 32, 26, 21, 31, 38, 44, 44, 35, 29, 23, 35, 40, 46, 46, 39, 31, 24, 4, 5, 6, 8, 8, 7, 6, 4, 5, 6, 7, 7, 6, 5, 3, 4, 5, 6, 6, 4, 3, 3, 3, 3, 3, 4, 2, 1, 2, 1, 0, 2, 2, 1, 1, 4, 4, 4, 3, 2, 1, 1, 10, 8, 5, 3, 2, 1, 1, 4, 4, 5, 7, 7, 8, 8, 3, 4, 5, 6, 7, 6, 7, 3, 4, 5, 5, 5, 4, 5, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 1, 0, 3, 7, 6, 5, 4, 2, 1, 3, 13, 10, 7, 5, 4, 2, 3, 3, 4, 6, 7, 8, 10, 10, 2, 3, 6, 7, 8, 8, 9, 3, 3, 6, 6, 6, 7, 8, 6, 2, 4, 5, 5, 6, 7, 8, 4, 6, 7, 7, 7, 7, 12, 8, 10, 10, 9, 8, 7, 15, 13, 13, 12, 10, 10, 8, 2, 7, 10, 11, 11, 12, 13, 6, 8, 10, 11, 12, 12, 13, 10, 8, 11, 11, 12, 12, 12, 12, 8, 11, 12, 12, 12, 11, 12, 12, 14, 15, 16, 14, 14, 12, 18, 20, 19, 17, 17, 15, 15, 23, 22, 21, 19, 18, 16, 14, 17, 18, 18, 19, 18, 14, 15, 19, 19, 19, 19, 19, 13, 16, 19, 20, 20, 20, 19, 15, 16, 21, 22, 21, 21, 20, 16, 16, 24, 25, 24, 24, 22, 17, 19, 27, 30, 29, 27, 24, 19, 24, 32, 34, 31, 29, 26, 20, 26, 29, 28, 28, 25, 21, 16, 26, 31, 29, 30, 26, 21, 16, 25, 32, 32, 30, 26, 21, 17, 26, 31, 33, 32, 27, 23, 19, 25, 32, 37, 35, 31, 26, 20, 28, 34, 41, 39, 34, 27, 23, 32, 36, 42, 42, 36, 30, 24, 35, 41, 39, 33, 28, 24, 19, 35, 41, 42, 35, 29, 24, 19, 35, 42, 45, 36, 30, 24, 19, 35, 40, 46, 38, 31, 26, 22, 33, 40, 46, 43, 37, 29, 24, 35, 43, 47, 47, 39, 32, 26, 39, 45, 49, 48, 41, 34, 29, 4, 5, 6, 8, 8, 7, 8, 4, 5, 6, 7, 7, 6, 6, 3, 5, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 0, 2, 1, 2, 5, 4, 4, 3, 2, 1, 2, 9, 7, 5, 3, 2, 1, 2, 4, 5, 5, 7, 8, 10, 10, 3, 4, 5, 6, 7, 8, 8, 3, 4, 5, 5, 5, 6, 6, 3, 2, 3, 3, 3, 4, 5, 4, 2, 2, 2, 3, 3, 5, 8, 6, 5, 5, 5, 4, 5, 12, 9, 6, 5, 6, 5, 5, 3, 4, 7, 9, 10, 12, 13, 3, 3, 7, 9, 9, 10, 11, 6, 3, 6, 8, 8, 8, 10, 9, 2, 5, 7, 8, 8, 9, 11, 4, 7, 10, 10, 10, 9, 14, 8, 10, 12, 12, 11, 9, 14, 11, 11, 14, 13, 12, 11, 6, 8, 12, 13, 14, 14, 16, 10, 9, 13, 14, 15, 15, 16, 13, 9, 13, 14, 15, 15, 15, 15, 9, 13, 15, 15, 16, 14, 15, 13, 16, 18, 18, 18, 17, 14, 18, 21, 21, 20, 19, 18, 14, 21, 23, 23, 22, 21, 20, 16, 19, 20, 21, 22, 22, 16, 18, 20, 22, 23, 23, 22, 16, 18, 21, 23, 23, 24, 22, 18, 18, 23, 24, 24, 25, 23, 19, 18, 27, 28, 27, 27, 25, 20, 21, 30, 33, 31, 30, 27, 22, 24, 31, 35, 33, 32, 29, 23, 27, 32, 31, 31, 28, 24, 20, 28, 34, 32, 33, 29, 24, 20, 27, 35, 36, 34, 29, 25, 20, 28, 35, 37, 36, 31, 27, 22, 27, 34, 40, 39, 35, 29, 23, 31, 38, 44, 43, 37, 31, 25, 34, 39, 45, 46, 40, 33, 27, 38, 45, 43, 37, 31, 26, 22, 39, 44, 46, 39, 33, 27, 23, 39, 45, 47, 40, 33, 28, 23, 39, 45, 49, 41, 35, 30, 26, 37, 43, 49, 46, 39, 33, 27, 38, 45, 51, 50, 43, 35, 29, 41, 46, 51, 51, 44, 38, 31, 5, 5, 6, 7, 7, 9, 10, 5, 5, 6, 7, 7, 7, 8, 4, 5, 6, 5, 5, 5, 6, 4, 3, 3, 3, 3, 3, 4, 3, 3, 2, 2, 0, 1, 4, 4, 3, 3, 2, 1, 1, 4, 6, 5, 3, 2, 2, 2, 4, 4, 5, 6, 7, 9, 11, 12, 4, 5, 5, 7, 9, 10, 10, 4, 4, 5, 5, 7, 8, 9, 5, 3, 3, 3, 5, 6, 7, 6, 3, 2, 3, 6, 5, 7, 8, 4, 4, 4, 7, 7, 7, 10, 7, 4, 4, 8, 8, 7, 3, 5, 8, 11, 12, 14, 15, 5, 4, 7, 11, 12, 12, 14, 8, 4, 7, 10, 11, 11, 13, 12, 3, 5, 10, 11, 12, 11, 13, 4, 7, 12, 13, 13, 12, 14, 6, 8, 12, 14, 14, 12, 14, 9, 9, 13, 16, 16, 15, 8, 9, 14, 17, 18, 17, 20, 12, 10, 15, 17, 19, 19, 19, 15, 10, 16, 18, 19, 19, 18, 17, 10, 15, 18, 18, 19, 17, 16, 14, 17, 20, 21, 21, 20, 15, 16, 20, 22, 23, 23, 22, 14, 18, 21, 23, 24, 24, 24, 19, 21, 24, 25, 26, 26, 19, 21, 22, 25, 26, 28, 26, 19, 21, 24, 26, 28, 27, 25, 21, 21, 25, 26, 27, 28, 27, 22, 20, 28, 30, 30, 31, 29, 24, 21, 29, 34, 33, 32, 30, 25, 21, 30, 37, 35, 34, 33, 27, 30, 34, 35, 34, 32, 28, 24, 30, 37, 37, 37, 33, 28, 24, 30, 39, 39, 37, 33, 29, 25, 31, 38, 40, 39, 35, 30, 25, 30, 39, 43, 41, 36, 32, 27, 31, 40, 47, 44, 39, 33, 29, 32, 41, 45, 47, 41, 36, 31, 42, 48, 47, 40, 35, 31, 26, 43, 49, 49, 42, 36, 32, 27, 42, 48, 51, 44, 37, 32, 27, 43, 48, 53, 44, 39, 33, 29, 41, 47, 53, 49, 41, 35, 31, 42, 48, 52, 50, 44, 38, 32, 43, 48, 53, 53, 46, 40, 33, 4, 5, 5, 6, 6, 8, 8, 4, 5, 5, 6, 6, 6, 6, 3, 4, 5, 4, 4, 4, 4, 3, 3, 3, 2, 3, 2, 3, 2, 2, 1, 1, 1, 0, 2, 3, 2, 2, 2, 1, 0, 2, 5, 3, 2, 1, 1, 0, 2, 4, 4, 5, 6, 8, 10, 10, 3, 4, 5, 6, 7, 8, 9, 3, 3, 4, 4, 5, 6, 7, 4, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 4, 3, 5, 7, 3, 2, 2, 5, 5, 5, 9, 5, 3, 2, 6, 6, 5, 3, 4, 7, 9, 11, 12, 14, 5, 3, 7, 10, 10, 10, 12, 9, 3, 6, 9, 9, 9, 10, 13, 2, 5, 8, 9, 10, 9, 13, 3, 5, 9, 10, 11, 9, 16, 5, 6, 10, 12, 12, 9, 14, 8, 7, 11, 13, 13, 13, 9, 8, 13, 15, 16, 15, 17, 13, 8, 13, 16, 16, 17, 17, 16, 8, 13, 16, 17, 16, 16, 18, 9, 14, 16, 17, 17, 14, 18, 12, 15, 18, 19, 18, 17, 15, 13, 17, 19, 20, 20, 20, 14, 16, 19, 21, 21, 21, 21, 16, 19, 22, 23, 24, 24, 18, 20, 20, 22, 24, 25, 23, 17, 20, 21, 25, 25, 25, 24, 19, 20, 24, 25, 26, 26, 24, 20, 18, 25, 27, 28, 28, 25, 21, 18, 26, 30, 30, 29, 27, 23, 18, 27, 32, 32, 31, 30, 25, 29, 33, 33, 32, 30, 26, 21, 28, 35, 34, 34, 31, 26, 21, 29, 38, 37, 35, 31, 27, 22, 28, 36, 38, 37, 32, 28, 23, 28, 36, 41, 39, 34, 29, 25, 29, 36, 42, 42, 35, 30, 26, 30, 37, 43, 43, 38, 33, 27, 40, 47, 45, 37, 33, 28, 24, 40, 45, 46, 40, 34, 29, 25, 41, 46, 49, 41, 34, 29, 25, 40, 45, 50, 42, 36, 31, 26, 39, 44, 49, 46, 38, 33, 28, 39, 45, 50, 47, 40, 34, 30, 39, 46, 50, 49, 43, 36, 30, 4, 5, 6, 8, 8, 6, 6, 4, 4, 5, 7, 7, 5, 4, 3, 4, 5, 5, 6, 4, 2, 3, 3, 3, 3, 5, 3, 0, 2, 1, 1, 2, 4, 2, 0, 2, 2, 2, 2, 3, 2, 0, 4, 3, 2, 2, 3, 2, 0, 4, 4, 5, 6, 6, 8, 8, 3, 4, 5, 5, 6, 6, 6, 3, 4, 4, 4, 4, 4, 5, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 3, 4, 2, 2, 2, 2, 2, 3, 7, 5, 2, 2, 3, 3, 3, 3, 4, 6, 8, 9, 10, 11, 2, 3, 6, 8, 8, 8, 9, 5, 3, 6, 7, 7, 7, 8, 9, 2, 4, 7, 6, 7, 6, 11, 2, 4, 7, 8, 8, 6, 13, 4, 5, 8, 9, 9, 6, 10, 8, 6, 9, 10, 10, 10, 5, 7, 11, 12, 13, 13, 14, 10, 7, 11, 13, 14, 14, 13, 13, 8, 12, 13, 14, 13, 12, 15, 7, 12, 14, 14, 14, 11, 16, 10, 13, 15, 15, 15, 14, 12, 12, 15, 16, 17, 17, 16, 10, 15, 17, 18, 18, 18, 18, 15, 17, 20, 20, 21, 20, 14, 18, 18, 21, 21, 22, 20, 13, 18, 19, 21, 22, 22, 20, 17, 17, 21, 23, 23, 23, 21, 16, 16, 22, 25, 25, 25, 23, 18, 16, 24, 27, 27, 25, 24, 20, 17, 25, 30, 28, 28, 26, 21, 25, 29, 30, 30, 26, 23, 18, 27, 32, 32, 30, 27, 23, 18, 27, 34, 34, 33, 28, 23, 19, 27, 33, 34, 32, 29, 25, 20, 26, 33, 37, 34, 30, 26, 21, 27, 33, 41, 38, 32, 28, 23, 27, 34, 39, 41, 35, 29, 24, 36, 42, 39, 34, 29, 25, 21, 37, 43, 42, 36, 31, 26, 22, 37, 43, 45, 38, 31, 26, 22, 38, 42, 47, 39, 32, 28, 23, 37, 40, 45, 42, 34, 29, 24, 35, 41, 46, 44, 36, 30, 26, 36, 42, 46, 45, 40, 33, 27, 8, 9, 10, 12, 12, 11, 10, 8, 9, 10, 12, 12, 10, 9, 7, 8, 9, 10, 11, 8, 7, 7, 7, 7, 8, 8, 6, 3, 4, 4, 4, 5, 4, 3, 2, 0, 2, 2, 2, 3, 3, 2, 6, 5, 2, 2, 2, 3, 2, 7, 8, 10, 11, 11, 11, 10, 7, 8, 9, 10, 10, 10, 9, 6, 7, 9, 9, 9, 8, 7, 6, 6, 6, 7, 6, 5, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 7, 4, 2, 1, 2, 2, 6, 8, 9, 9, 10, 11, 10, 6, 7, 8, 9, 9, 9, 9, 5, 6, 7, 7, 8, 8, 7, 5, 5, 5, 5, 5, 5, 3, 2, 1, 1, 2, 2, 2, 3, 5, 4, 3, 2, 0, 2, 3, 11, 10, 6, 4, 2, 2, 3, 6, 7, 8, 9, 11, 12, 11, 5, 7, 8, 10, 10, 10, 10, 4, 7, 8, 8, 8, 9, 8, 5, 6, 5, 6, 6, 6, 6, 3, 6, 6, 6, 7, 7, 7, 5, 11, 10, 9, 8, 8, 8, 11, 16, 13, 12, 10, 9, 10, 9, 10, 11, 11, 12, 12, 12, 11, 12, 12, 12, 13, 12, 10, 11, 13, 14, 13, 13, 12, 8, 11, 15, 14, 14, 14, 13, 9, 11, 16, 16, 15, 15, 15, 10, 12, 18, 21, 20, 18, 16, 11, 17, 21, 24, 21, 20, 18, 13, 18, 20, 20, 21, 18, 14, 11, 19, 23, 23, 22, 19, 14, 10, 19, 24, 25, 24, 20, 15, 10, 18, 24, 25, 26, 22, 16, 11, 18, 24, 27, 27, 23, 17, 13, 19, 24, 30, 29, 24, 20, 15, 21, 27, 31, 31, 27, 21, 16, 27, 33, 33, 26, 21, 16, 12, 27, 33, 35, 27, 22, 17, 13, 27, 33, 36, 29, 23, 18, 13, 28, 33, 37, 30, 25, 19, 15, 26, 33, 36, 33, 26, 22, 16, 27, 32, 35, 34, 28, 23, 19, 28, 31, 36, 36, 31, 25, 20, 8, 9, 10, 11, 11, 11, 10, 7, 8, 10, 11, 11, 10, 8, 7, 8, 9, 10, 9, 8, 6, 6, 6, 7, 7, 7, 5, 2, 4, 4, 4, 4, 4, 2, 2, 2, 0, 2, 2, 2, 2, 2, 6, 4, 2, 2, 2, 2, 2, 7, 8, 9, 11, 11, 11, 11, 6, 8, 9, 10, 11, 9, 9, 6, 7, 8, 9, 8, 7, 6, 6, 5, 6, 6, 6, 5, 2, 3, 3, 3, 3, 2, 2, 2, 3, 2, 2, 2, 1, 2, 2, 9, 7, 3, 2, 1, 2, 2, 6, 7, 8, 9, 11, 11, 12, 6, 6, 8, 9, 10, 10, 10, 6, 6, 8, 8, 8, 8, 8, 5, 5, 6, 6, 5, 5, 5, 3, 2, 3, 3, 3, 3, 4, 5, 5, 5, 4, 3, 4, 5, 11, 9, 8, 6, 5, 5, 5, 6, 9, 9, 11, 12, 14, 13, 5, 8, 10, 11, 12, 12, 11, 5, 8, 9, 9, 9, 10, 9, 8, 7, 8, 8, 8, 9, 8, 6, 8, 9, 9, 10, 10, 10, 6, 13, 13, 12, 11, 11, 11, 11, 18, 16, 14, 12, 12, 13, 12, 13, 14, 14, 15, 15, 13, 12, 15, 15, 16, 16, 14, 11, 13, 16, 17, 16, 16, 15, 11, 13, 17, 17, 16, 17, 16, 12, 12, 19, 19, 18, 18, 17, 13, 14, 22, 23, 21, 20, 18, 14, 19, 24, 26, 24, 22, 20, 16, 22, 24, 24, 24, 21, 17, 13, 22, 26, 25, 25, 22, 17, 12, 22, 28, 28, 27, 22, 17, 13, 22, 27, 29, 27, 24, 19, 14, 22, 27, 30, 30, 25, 20, 16, 21, 28, 34, 33, 27, 21, 17, 25, 30, 34, 35, 30, 24, 18, 31, 37, 36, 29, 23, 19, 15, 30, 36, 39, 32, 25, 20, 16, 30, 37, 40, 32, 26, 21, 17, 31, 35, 41, 33, 27, 22, 17, 29, 35, 41, 36, 29, 23, 19, 29, 35, 41, 38, 32, 26, 20, 30, 37, 40, 42, 34, 27, 22, 8, 9, 10, 12, 11, 11, 10, 7, 8, 10, 11, 11, 9, 8, 7, 8, 9, 9, 9, 7, 6, 6, 6, 7, 7, 7, 5, 2, 4, 4, 3, 4, 3, 2, 2, 2, 2, 0, 2, 2, 2, 2, 5, 3, 2, 1, 2, 2, 2, 7, 8, 9, 10, 11, 11, 12, 7, 8, 9, 10, 11, 10, 10, 6, 7, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 4, 4, 3, 3, 3, 3, 2, 2, 4, 3, 2, 2, 1, 2, 2, 3, 7, 5, 3, 1, 1, 2, 3, 6, 7, 9, 11, 12, 14, 14, 6, 7, 10, 11, 12, 12, 12, 6, 7, 9, 10, 9, 9, 9, 5, 5, 7, 7, 7, 7, 6, 6, 2, 4, 5, 5, 5, 6, 8, 4, 7, 7, 6, 6, 6, 8, 7, 8, 9, 7, 7, 8, 6, 10, 11, 12, 14, 15, 15, 5, 9, 11, 12, 13, 13, 13, 8, 9, 11, 11, 12, 11, 11, 10, 8, 11, 11, 11, 12, 10, 9, 9, 11, 12, 12, 12, 13, 8, 13, 15, 15, 14, 14, 14, 8, 16, 17, 16, 15, 15, 15, 13, 16, 17, 17, 18, 18, 15, 15, 17, 18, 18, 19, 17, 13, 15, 18, 20, 19, 19, 18, 14, 15, 20, 20, 20, 20, 19, 14, 13, 22, 22, 21, 21, 20, 15, 16, 24, 26, 24, 23, 21, 17, 18, 25, 28, 27, 25, 23, 19, 24, 27, 27, 27, 24, 20, 16, 26, 29, 29, 29, 25, 21, 16, 25, 31, 31, 30, 25, 21, 17, 24, 31, 32, 30, 26, 22, 17, 24, 30, 34, 32, 28, 23, 18, 24, 31, 36, 36, 30, 24, 20, 27, 33, 38, 39, 33, 27, 21, 35, 39, 39, 32, 27, 22, 18, 34, 41, 42, 34, 28, 23, 19, 35, 41, 44, 36, 29, 24, 19, 34, 40, 44, 37, 30, 25, 21, 33, 39, 44, 39, 32, 26, 22, 32, 39, 43, 43, 34, 29, 23, 34, 40, 45, 45, 39, 30, 25, 7, 8, 9, 10, 10, 10, 11, 7, 7, 8, 10, 10, 9, 8, 6, 7, 8, 9, 8, 7, 6, 6, 6, 6, 6, 6, 4, 3, 3, 3, 3, 3, 2, 1, 2, 2, 2, 2, 0, 2, 2, 2, 4, 3, 2, 1, 1, 1, 2, 7, 7, 8, 9, 10, 12, 13, 6, 7, 8, 9, 10, 10, 11, 6, 7, 7, 7, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 3, 2, 2, 2, 2, 3, 5, 3, 2, 2, 2, 2, 3, 4, 6, 4, 2, 2, 3, 3, 4, 6, 7, 10, 11, 13, 14, 15, 5, 6, 9, 12, 12, 12, 12, 4, 6, 9, 10, 10, 10, 10, 8, 4, 6, 8, 8, 8, 8, 10, 2, 4, 7, 8, 8, 8, 11, 3, 5, 8, 9, 9, 8, 10, 7, 6, 10, 10, 10, 11, 5, 10, 13, 13, 15, 15, 17, 8, 9, 12, 14, 14, 14, 15, 11, 9, 13, 13, 14, 14, 14, 13, 8, 13, 14, 14, 15, 13, 13, 10, 14, 15, 16, 16, 16, 11, 12, 16, 16, 17, 16, 17, 10, 15, 17, 18, 18, 18, 18, 15, 18, 20, 20, 22, 21, 17, 17, 20, 22, 22, 22, 21, 15, 17, 20, 23, 22, 22, 22, 17, 17, 22, 23, 23, 23, 22, 17, 16, 24, 25, 25, 25, 23, 19, 16, 25, 28, 27, 26, 24, 20, 17, 26, 30, 28, 29, 26, 22, 27, 31, 31, 31, 27, 24, 19, 27, 32, 33, 33, 28, 24, 19, 27, 35, 35, 34, 29, 24, 20, 27, 33, 35, 34, 29, 25, 21, 26, 33, 38, 36, 31, 26, 22, 27, 32, 39, 39, 33, 27, 23, 28, 34, 39, 40, 35, 30, 25, 38, 44, 42, 36, 31, 26, 21, 38, 45, 45, 38, 31, 27, 22, 37, 44, 47, 39, 32, 27, 22, 38, 43, 48, 40, 34, 28, 23, 37, 42, 48, 43, 35, 30, 25, 36, 43, 47, 45, 37, 32, 27, 37, 42, 47, 47, 41, 33, 28, 6, 6, 7, 8, 8, 9, 10, 5, 6, 7, 8, 8, 8, 8, 5, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 3, 3, 2, 2, 2, 0, 1, 3, 5, 4, 2, 2, 1, 1, 3, 5, 6, 7, 8, 10, 12, 13, 5, 5, 6, 8, 10, 10, 10, 4, 5, 6, 6, 7, 8, 8, 4, 3, 3, 4, 5, 6, 7, 5, 3, 2, 2, 4, 4, 7, 6, 3, 3, 2, 5, 5, 7, 8, 5, 3, 3, 6, 6, 7, 4, 5, 8, 11, 13, 14, 15, 4, 4, 8, 11, 12, 12, 14, 8, 4, 8, 10, 10, 11, 12, 11, 3, 5, 9, 10, 11, 11, 12, 3, 5, 10, 11, 12, 11, 13, 4, 7, 11, 13, 13, 11, 12, 8, 7, 12, 13, 14, 14, 8, 9, 14, 16, 17, 17, 19, 11, 9, 14, 17, 18, 17, 18, 14, 9, 15, 17, 18, 18, 17, 16, 10, 14, 17, 18, 19, 16, 16, 12, 16, 18, 20, 19, 19, 14, 14, 18, 20, 21, 21, 21, 12, 16, 20, 22, 22, 22, 22, 17, 21, 23, 24, 25, 25, 19, 20, 21, 24, 25, 26, 25, 18, 20, 22, 26, 26, 27, 25, 21, 20, 25, 26, 27, 27, 26, 21, 18, 26, 28, 29, 29, 27, 22, 18, 27, 31, 32, 30, 29, 24, 19, 29, 33, 33, 33, 30, 25, 30, 33, 34, 34, 31, 27, 23, 30, 37, 36, 35, 32, 27, 23, 30, 38, 38, 37, 33, 28, 23, 30, 38, 39, 37, 33, 29, 24, 28, 37, 42, 39, 35, 30, 25, 30, 37, 44, 42, 36, 32, 27, 31, 38, 43, 44, 38, 33, 29, 42, 48, 45, 40, 34, 30, 26, 41, 48, 48, 41, 35, 30, 26, 42, 47, 50, 42, 36, 31, 27, 41, 47, 51, 44, 37, 32, 27, 40, 45, 51, 46, 39, 34, 29, 40, 46, 50, 49, 42, 36, 30, 40, 46, 51, 51, 44, 37, 32, 4, 5, 5, 6, 6, 8, 8, 4, 5, 5, 6, 6, 6, 6, 3, 4, 5, 4, 4, 4, 4, 3, 3, 3, 2, 3, 2, 2, 2, 2, 1, 1, 2, 0, 2, 3, 2, 2, 1, 2, 0, 2, 5, 3, 2, 1, 1, 0, 2, 4, 4, 5, 6, 8, 9, 10, 3, 4, 5, 6, 8, 8, 8, 3, 4, 4, 4, 6, 6, 7, 4, 2, 2, 2, 4, 4, 5, 6, 2, 2, 2, 4, 3, 5, 7, 3, 2, 2, 5, 5, 5, 9, 5, 3, 2, 6, 6, 5, 3, 4, 7, 9, 10, 12, 14, 5, 3, 7, 10, 10, 10, 12, 9, 3, 6, 8, 9, 9, 10, 13, 2, 5, 8, 9, 10, 9, 13, 3, 5, 9, 11, 11, 9, 17, 5, 6, 10, 11, 12, 9, 14, 9, 7, 11, 13, 13, 13, 9, 8, 13, 15, 15, 15, 17, 15, 8, 13, 16, 17, 17, 16, 16, 8, 14, 15, 16, 17, 16, 19, 9, 13, 17, 17, 17, 14, 18, 12, 15, 18, 18, 19, 17, 15, 13, 17, 19, 20, 20, 20, 15, 16, 19, 21, 21, 21, 22, 17, 19, 22, 23, 25, 23, 18, 20, 20, 23, 24, 26, 23, 17, 20, 21, 25, 25, 26, 24, 19, 20, 23, 25, 25, 26, 24, 20, 19, 25, 27, 28, 28, 26, 22, 18, 26, 30, 30, 29, 27, 23, 19, 27, 32, 32, 31, 28, 25, 28, 32, 32, 33, 30, 26, 21, 29, 35, 35, 34, 31, 26, 22, 29, 37, 36, 36, 31, 26, 22, 28, 36, 39, 37, 33, 28, 23, 29, 35, 40, 40, 33, 29, 24, 28, 36, 42, 41, 36, 30, 26, 30, 37, 43, 44, 38, 33, 28, 40, 46, 44, 38, 32, 29, 25, 40, 46, 47, 39, 33, 29, 24, 42, 45, 49, 41, 35, 30, 25, 39, 46, 50, 42, 36, 30, 26, 39, 44, 49, 46, 39, 32, 28, 39, 45, 50, 48, 40, 34, 29, 39, 45, 50, 50, 43, 37, 31, 4, 5, 6, 7, 7, 6, 6, 4, 4, 5, 7, 7, 5, 4, 3, 4, 5, 5, 6, 4, 2, 3, 3, 3, 3, 5, 3, 0, 2, 1, 1, 2, 4, 2, 0, 2, 2, 2, 2, 3, 2, 0, 4, 3, 2, 2, 3, 2, 0, 4, 4, 5, 6, 7, 8, 8, 3, 4, 4, 5, 6, 6, 7, 3, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 3, 4, 2, 2, 2, 2, 2, 3, 7, 5, 2, 2, 4, 3, 3, 3, 4, 6, 8, 9, 10, 11, 2, 3, 7, 8, 8, 8, 9, 5, 3, 6, 7, 6, 6, 8, 9, 2, 4, 7, 6, 6, 6, 11, 2, 4, 7, 8, 8, 6, 12, 4, 5, 8, 9, 9, 6, 10, 8, 6, 9, 10, 10, 10, 5, 7, 11, 13, 13, 13, 14, 10, 7, 11, 13, 14, 14, 13, 13, 8, 12, 13, 14, 13, 12, 15, 8, 12, 14, 14, 14, 11, 15, 10, 13, 15, 15, 15, 14, 13, 12, 15, 16, 17, 16, 17, 10, 15, 17, 18, 18, 18, 18, 15, 17, 19, 20, 21, 20, 15, 18, 19, 20, 21, 22, 21, 13, 18, 20, 22, 22, 22, 20, 16, 18, 22, 22, 22, 23, 22, 17, 16, 23, 24, 24, 25, 23, 18, 16, 24, 27, 27, 26, 23, 20, 17, 25, 30, 28, 28, 25, 21, 27, 30, 29, 30, 27, 23, 19, 27, 32, 32, 31, 27, 23, 18, 26, 34, 34, 32, 27, 23, 19, 27, 33, 34, 33, 29, 24, 19, 25, 33, 37, 35, 31, 26, 21, 27, 33, 40, 38, 32, 26, 22, 27, 34, 40, 40, 34, 29, 24, 37, 43, 40, 34, 29, 26, 21, 37, 42, 44, 36, 31, 25, 22, 36, 41, 46, 37, 30, 26, 22, 37, 42, 47, 39, 32, 28, 23, 36, 41, 46, 42, 36, 29, 24, 36, 40, 45, 44, 36, 31, 25, 35, 41, 45, 46, 40, 33, 28, 14, 15, 16, 18, 18, 17, 16, 13, 15, 16, 18, 17, 16, 14, 13, 14, 16, 16, 16, 13, 11, 12, 13, 13, 13, 13, 9, 5, 10, 10, 10, 9, 6, 5, 5, 6, 6, 5, 4, 5, 5, 4, 0, 2, 2, 3, 4, 5, 4, 13, 14, 16, 17, 17, 17, 16, 12, 14, 15, 16, 17, 16, 14, 12, 13, 15, 15, 14, 13, 11, 11, 12, 12, 12, 11, 9, 4, 9, 8, 8, 8, 5, 4, 4, 5, 4, 4, 3, 3, 4, 4, 3, 2, 2, 2, 3, 4, 4, 12, 13, 15, 16, 17, 17, 17, 11, 13, 14, 15, 16, 15, 15, 12, 12, 13, 13, 13, 12, 11, 11, 11, 10, 10, 10, 8, 4, 7, 7, 7, 7, 3, 4, 4, 2, 2, 2, 2, 3, 3, 4, 5, 4, 1, 2, 3, 4, 5, 11, 13, 14, 16, 17, 18, 18, 11, 13, 14, 16, 17, 16, 16, 10, 13, 14, 14, 14, 14, 12, 7, 12, 11, 11, 11, 9, 9, 4, 8, 7, 7, 5, 5, 6, 3, 6, 6, 6, 7, 6, 7, 5, 11, 8, 8, 8, 8, 8, 12, 12, 14, 15, 17, 18, 19, 10, 12, 14, 15, 16, 16, 16, 10, 12, 13, 13, 13, 13, 12, 10, 12, 12, 12, 12, 10, 7, 8, 13, 13, 13, 14, 13, 8, 8, 14, 16, 16, 16, 15, 10, 11, 17, 19, 18, 18, 17, 11, 16, 18, 18, 19, 16, 17, 18, 16, 20, 20, 21, 17, 15, 15, 16, 22, 22, 21, 17, 12, 11, 16, 21, 23, 23, 19, 14, 10, 15, 20, 25, 24, 20, 17, 11, 15, 22, 27, 25, 23, 18, 13, 17, 23, 27, 28, 24, 20, 15, 25, 31, 30, 24, 18, 16, 17, 25, 31, 32, 26, 20, 15, 14, 25, 31, 33, 27, 21, 16, 11, 25, 30, 35, 28, 23, 18, 13, 24, 30, 32, 28, 24, 21, 15, 24, 28, 31, 30, 25, 21, 17, 24, 28, 31, 31, 27, 23, 19, 12, 13, 15, 16, 16, 16, 15, 12, 13, 14, 15, 15, 14, 12, 11, 12, 14, 14, 13, 11, 9, 11, 11, 11, 11, 10, 7, 3, 8, 8, 8, 7, 5, 3, 3, 5, 4, 3, 3, 3, 3, 3, 2, 0, 2, 2, 3, 3, 3, 11, 12, 14, 15, 16, 16, 15, 11, 12, 13, 15, 15, 14, 12, 11, 12, 13, 13, 12, 11, 9, 11, 10, 10, 10, 9, 7, 3, 8, 7, 7, 7, 3, 3, 3, 4, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 3, 10, 12, 13, 14, 15, 16, 17, 10, 11, 13, 14, 14, 14, 14, 11, 11, 12, 12, 12, 11, 10, 10, 10, 10, 10, 9, 7, 5, 5, 6, 7, 6, 4, 4, 5, 3, 2, 3, 3, 3, 4, 5, 3, 2, 3, 3, 3, 4, 4, 11, 13, 14, 15, 17, 18, 18, 9, 13, 14, 15, 16, 16, 15, 7, 13, 14, 13, 13, 13, 11, 8, 11, 11, 11, 10, 9, 9, 6, 7, 8, 8, 8, 8, 8, 3, 8, 9, 9, 9, 9, 10, 3, 11, 11, 11, 10, 11, 11, 12, 13, 14, 15, 17, 18, 17, 11, 13, 14, 15, 16, 16, 15, 11, 14, 15, 15, 15, 14, 11, 11, 15, 15, 15, 15, 14, 10, 10, 17, 17, 16, 17, 15, 12, 11, 17, 20, 19, 18, 17, 13, 13, 18, 22, 20, 21, 19, 14, 20, 22, 22, 22, 19, 18, 17, 20, 24, 23, 24, 20, 16, 15, 20, 26, 26, 25, 20, 16, 12, 20, 26, 27, 25, 22, 17, 13, 19, 24, 28, 28, 24, 19, 14, 19, 25, 31, 30, 25, 20, 16, 20, 25, 31, 33, 27, 22, 17, 28, 34, 33, 27, 22, 18, 17, 29, 36, 36, 29, 23, 18, 14, 28, 35, 39, 30, 25, 19, 14, 29, 34, 39, 31, 25, 20, 16, 27, 33, 38, 34, 28, 22, 18, 28, 33, 37, 36, 30, 25, 19, 27, 34, 38, 39, 33, 26, 21, 9, 11, 12, 13, 13, 13, 12, 9, 10, 11, 13, 12, 11, 9, 9, 9, 11, 11, 10, 9, 7, 8, 8, 8, 8, 8, 5, 2, 6, 6, 5, 5, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 9, 9, 11, 12, 12, 13, 13, 9, 9, 10, 12, 12, 11, 11, 8, 9, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 5, 3, 5, 5, 4, 4, 2, 2, 3, 2, 2, 1, 1, 2, 2, 3, 4, 2, 2, 1, 2, 2, 3, 8, 9, 11, 12, 13, 15, 15, 8, 8, 11, 12, 13, 13, 13, 8, 8, 11, 11, 10, 10, 10, 6, 7, 8, 8, 8, 7, 6, 5, 3, 5, 6, 4, 5, 6, 6, 2, 4, 5, 5, 5, 6, 5, 4, 5, 6, 6, 6, 7, 8, 11, 12, 13, 15, 16, 16, 5, 11, 12, 14, 14, 14, 14, 7, 11, 12, 12, 12, 12, 11, 10, 9, 10, 10, 10, 10, 10, 8, 7, 10, 11, 11, 12, 12, 6, 10, 13, 12, 13, 13, 13, 5, 13, 14, 14, 14, 14, 15, 12, 15, 16, 16, 17, 18, 16, 14, 16, 17, 18, 18, 17, 14, 13, 18, 19, 19, 19, 17, 13, 13, 19, 18, 19, 18, 18, 14, 13, 20, 20, 20, 20, 19, 15, 13, 21, 22, 22, 22, 20, 16, 16, 22, 26, 24, 24, 22, 18, 23, 26, 25, 25, 23, 19, 16, 24, 28, 28, 28, 24, 19, 15, 24, 30, 30, 29, 24, 20, 15, 23, 29, 30, 29, 25, 21, 16, 23, 29, 33, 31, 27, 22, 17, 24, 29, 35, 34, 29, 23, 19, 23, 29, 34, 36, 32, 26, 21, 33, 39, 38, 31, 25, 21, 18, 33, 40, 41, 33, 27, 22, 18, 33, 39, 43, 35, 29, 22, 18, 33, 39, 44, 36, 29, 24, 19, 32, 37, 43, 38, 30, 25, 20, 31, 36, 43, 41, 33, 27, 22, 31, 37, 43, 42, 36, 30, 24, 7, 8, 10, 11, 11, 11, 11, 7, 8, 9, 11, 10, 9, 8, 7, 8, 9, 9, 8, 7, 6, 6, 6, 6, 6, 6, 4, 2, 4, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 2, 1, 2, 3, 2, 1, 0, 2, 1, 2, 7, 8, 8, 10, 11, 12, 13, 7, 7, 8, 9, 10, 10, 10, 6, 7, 8, 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 4, 3, 3, 2, 3, 2, 3, 4, 3, 2, 2, 1, 2, 2, 4, 6, 3, 2, 2, 2, 3, 4, 6, 7, 10, 11, 13, 14, 14, 6, 7, 10, 11, 12, 12, 12, 4, 6, 9, 10, 10, 10, 9, 6, 5, 7, 8, 8, 7, 8, 8, 2, 4, 7, 7, 7, 8, 9, 3, 5, 8, 8, 8, 8, 8, 6, 6, 9, 9, 9, 10, 5, 10, 12, 13, 14, 15, 16, 7, 9, 12, 13, 14, 14, 14, 10, 9, 12, 13, 13, 13, 13, 13, 8, 12, 13, 13, 14, 12, 12, 9, 13, 14, 15, 15, 15, 9, 12, 15, 16, 16, 16, 16, 8, 15, 17, 18, 17, 16, 18, 14, 18, 19, 19, 21, 20, 16, 16, 19, 20, 21, 21, 20, 14, 16, 20, 22, 22, 21, 20, 16, 16, 22, 23, 22, 23, 21, 17, 15, 23, 24, 24, 23, 22, 18, 15, 23, 27, 26, 25, 24, 19, 17, 24, 29, 27, 27, 26, 20, 26, 30, 29, 30, 27, 22, 18, 26, 31, 31, 31, 28, 22, 18, 27, 34, 33, 33, 28, 23, 19, 26, 32, 35, 34, 29, 24, 19, 27, 33, 36, 35, 30, 25, 21, 25, 33, 40, 38, 33, 26, 22, 27, 33, 40, 39, 34, 29, 24, 37, 43, 41, 34, 29, 25, 21, 37, 43, 43, 37, 30, 26, 21, 36, 43, 46, 38, 32, 26, 21, 38, 41, 48, 40, 33, 27, 23, 35, 41, 47, 42, 35, 29, 24, 35, 42, 47, 44, 37, 31, 26, 35, 41, 47, 46, 39, 32, 27, 6, 7, 8, 9, 9, 10, 11, 6, 7, 7, 9, 9, 8, 8, 5, 6, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, 3, 3, 3, 2, 2, 2, 2, 1, 3, 3, 2, 2, 1, 1, 1, 3, 4, 3, 2, 2, 0, 1, 3, 5, 6, 7, 8, 10, 12, 13, 5, 6, 7, 8, 10, 10, 10, 4, 6, 6, 7, 8, 8, 8, 4, 4, 4, 4, 5, 6, 6, 4, 2, 2, 2, 3, 3, 6, 5, 3, 2, 2, 4, 4, 6, 7, 4, 3, 2, 5, 5, 6, 5, 6, 9, 11, 12, 14, 14, 4, 5, 9, 11, 12, 12, 13, 7, 5, 8, 10, 10, 10, 11, 10, 3, 6, 9, 9, 9, 10, 12, 3, 5, 9, 10, 10, 10, 13, 4, 6, 10, 11, 11, 10, 11, 8, 7, 11, 12, 13, 13, 6, 9, 13, 15, 16, 16, 18, 10, 9, 13, 15, 17, 17, 17, 14, 9, 14, 15, 16, 17, 16, 16, 9, 14, 16, 17, 17, 15, 15, 11, 15, 17, 18, 18, 18, 13, 13, 17, 19, 19, 19, 19, 12, 16, 18, 20, 20, 21, 21, 16, 19, 22, 23, 24, 23, 18, 19, 20, 23, 24, 25, 23, 17, 19, 22, 25, 25, 25, 23, 19, 18, 24, 25, 26, 26, 25, 20, 17, 26, 27, 27, 27, 26, 21, 17, 25, 29, 30, 29, 27, 23, 19, 28, 33, 31, 30, 29, 24, 29, 32, 33, 32, 30, 25, 21, 29, 35, 35, 34, 31, 26, 22, 28, 37, 36, 35, 30, 26, 22, 29, 36, 38, 37, 32, 27, 22, 28, 35, 40, 38, 34, 29, 23, 29, 36, 42, 41, 36, 31, 26, 30, 36, 43, 44, 38, 32, 27, 40, 46, 44, 38, 33, 28, 24, 41, 46, 47, 40, 34, 29, 24, 40, 46, 50, 41, 35, 29, 25, 39, 46, 49, 42, 36, 30, 26, 39, 45, 49, 46, 38, 33, 27, 38, 45, 49, 48, 40, 34, 29, 39, 45, 49, 48, 43, 36, 30, 4, 5, 5, 6, 6, 8, 8, 4, 5, 5, 6, 6, 6, 6, 3, 4, 5, 4, 4, 4, 4, 3, 3, 3, 2, 3, 2, 2, 2, 2, 1, 1, 2, 0, 2, 3, 2, 2, 2, 1, 0, 2, 5, 3, 2, 1, 1, 0, 2, 4, 4, 5, 6, 8, 10, 10, 3, 4, 5, 6, 8, 8, 8, 3, 4, 4, 4, 5, 6, 7, 4, 2, 2, 2, 3, 4, 5, 6, 2, 2, 2, 4, 3, 5, 7, 3, 2, 2, 5, 4, 5, 10, 5, 3, 2, 6, 6, 5, 3, 4, 7, 9, 10, 12, 14, 5, 3, 7, 10, 10, 10, 12, 9, 3, 6, 8, 9, 9, 10, 13, 2, 5, 8, 9, 10, 9, 14, 3, 5, 9, 11, 10, 9, 15, 5, 6, 10, 12, 11, 9, 14, 8, 7, 11, 13, 13, 13, 10, 8, 13, 15, 16, 15, 18, 14, 8, 13, 15, 17, 17, 16, 16, 9, 14, 16, 16, 17, 16, 18, 9, 14, 16, 17, 17, 14, 18, 12, 15, 18, 18, 19, 17, 16, 13, 17, 19, 20, 20, 19, 14, 16, 19, 20, 21, 21, 21, 17, 19, 22, 23, 24, 23, 18, 19, 20, 23, 24, 26, 23, 17, 20, 21, 25, 25, 25, 24, 19, 20, 23, 25, 26, 26, 24, 20, 18, 26, 28, 28, 28, 26, 21, 18, 26, 31, 31, 29, 27, 23, 19, 27, 33, 32, 32, 28, 24, 28, 33, 33, 32, 30, 26, 22, 29, 34, 35, 35, 31, 27, 22, 28, 38, 37, 35, 31, 26, 23, 29, 37, 37, 37, 32, 27, 23, 28, 35, 40, 39, 34, 29, 24, 29, 35, 43, 41, 36, 31, 27, 29, 38, 43, 44, 38, 32, 27, 40, 46, 44, 37, 32, 28, 24, 39, 45, 46, 40, 33, 29, 24, 41, 45, 49, 41, 34, 30, 25, 40, 45, 50, 42, 35, 31, 26, 39, 44, 49, 45, 38, 33, 28, 39, 46, 50, 47, 41, 35, 29, 40, 44, 50, 50, 43, 36, 31, 4, 5, 6, 8, 8, 6, 6, 4, 4, 5, 7, 7, 5, 4, 3, 4, 5, 5, 6, 4, 2, 3, 3, 3, 4, 5, 3, 0, 2, 2, 1, 2, 4, 2, 0, 2, 2, 2, 2, 3, 2, 0, 4, 3, 2, 2, 3, 2, 0, 4, 4, 5, 6, 6, 8, 8, 3, 4, 4, 5, 6, 6, 7, 3, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 3, 4, 3, 2, 2, 2, 2, 3, 7, 5, 2, 2, 3, 3, 3, 3, 4, 6, 8, 9, 10, 11, 2, 3, 6, 8, 8, 8, 9, 5, 3, 6, 7, 6, 6, 8, 9, 2, 4, 7, 6, 6, 6, 11, 2, 4, 7, 8, 8, 6, 12, 4, 5, 8, 9, 9, 6, 10, 8, 6, 9, 10, 10, 10, 5, 7, 11, 12, 13, 13, 14, 10, 7, 12, 13, 13, 14, 13, 14, 8, 12, 13, 13, 13, 12, 14, 8, 12, 14, 14, 14, 11, 15, 10, 13, 15, 15, 15, 14, 14, 12, 15, 16, 17, 16, 16, 10, 15, 17, 18, 18, 18, 18, 15, 18, 19, 20, 21, 20, 14, 18, 18, 20, 21, 22, 20, 13, 18, 20, 22, 22, 21, 20, 16, 18, 22, 23, 22, 23, 22, 17, 16, 24, 24, 24, 24, 22, 18, 16, 24, 27, 27, 26, 24, 20, 17, 25, 30, 29, 28, 26, 21, 26, 29, 30, 29, 26, 22, 18, 26, 32, 30, 30, 27, 23, 19, 27, 33, 33, 32, 27, 23, 19, 26, 33, 34, 32, 28, 24, 20, 27, 34, 36, 35, 31, 25, 21, 27, 34, 40, 38, 33, 27, 23, 28, 34, 39, 39, 35, 29, 24, 36, 42, 40, 34, 29, 25, 21, 37, 43, 43, 36, 30, 25, 21, 36, 42, 45, 37, 32, 27, 21, 37, 41, 46, 38, 32, 27, 23, 35, 40, 45, 41, 35, 28, 24, 36, 42, 46, 44, 37, 32, 25, 37, 41, 46, 46, 38, 33, 27, 2, 2, 3, 3, 3, 2, 2, 1, 2, 3, 3, 3, 2, 2, 0, 2, 2, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 4, 3, 3, 3, 4, 4, 3, 4, 7, 7, 7, 6, 5, 4, 4, 13, 11, 9, 7, 5, 4, 4, 0, 2, 2, 3, 2, 2, 1, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 4, 4, 4, 9, 9, 9, 7, 5, 4, 4, 16, 14, 10, 8, 6, 4, 4, 2, 1, 2, 1, 2, 1, 4, 2, 1, 2, 1, 1, 1, 4, 2, 1, 0, 0, 1, 0, 5, 3, 2, 3, 3, 3, 3, 6, 7, 6, 6, 6, 7, 6, 7, 12, 11, 11, 10, 9, 7, 7, 19, 17, 14, 12, 10, 9, 8, 2, 4, 5, 5, 5, 5, 8, 3, 5, 5, 6, 6, 6, 8, 7, 6, 6, 7, 7, 8, 8, 10, 9, 10, 10, 10, 11, 10, 10, 14, 14, 14, 14, 14, 12, 13, 20, 19, 17, 16, 15, 14, 19, 26, 22, 20, 18, 16, 15, 12, 13, 12, 13, 12, 12, 8, 13, 14, 14, 14, 14, 13, 8, 14, 16, 16, 15, 16, 15, 11, 13, 20, 19, 19, 19, 18, 14, 17, 25, 24, 22, 23, 21, 16, 21, 27, 30, 26, 25, 23, 17, 25, 31, 32, 29, 27, 25, 20, 21, 23, 22, 21, 18, 15, 11, 21, 26, 24, 23, 20, 16, 11, 22, 27, 26, 25, 22, 18, 14, 22, 28, 30, 29, 25, 22, 18, 25, 31, 35, 34, 30, 25, 20, 27, 33, 40, 38, 33, 26, 22, 31, 37, 41, 41, 35, 28, 23, 29, 35, 34, 27, 22, 17, 13, 29, 35, 36, 29, 23, 19, 15, 30, 35, 38, 31, 26, 21, 17, 30, 36, 41, 35, 30, 25, 21, 31, 37, 43, 40, 35, 28, 24, 34, 40, 46, 45, 38, 31, 25, 37, 42, 46, 46, 39, 33, 27, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 3, 2, 2, 1, 2, 0, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 4, 4, 8, 8, 8, 7, 6, 4, 4, 14, 13, 9, 8, 6, 4, 4, 2, 0, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 4, 2, 2, 2, 3, 2, 3, 5, 6, 5, 5, 6, 5, 4, 5, 11, 10, 10, 8, 6, 5, 5, 18, 15, 11, 9, 7, 5, 5, 2, 2, 1, 1, 1, 3, 6, 2, 2, 2, 2, 2, 4, 6, 3, 2, 3, 3, 4, 4, 7, 7, 3, 6, 6, 7, 7, 9, 11, 7, 10, 10, 11, 9, 9, 15, 12, 14, 13, 12, 11, 9, 20, 18, 17, 16, 14, 12, 12, 4, 6, 7, 8, 8, 7, 10, 7, 7, 8, 8, 9, 9, 10, 11, 8, 10, 10, 11, 11, 11, 14, 10, 13, 14, 14, 14, 13, 14, 16, 18, 18, 18, 17, 15, 15, 22, 23, 21, 21, 19, 18, 20, 28, 26, 24, 22, 20, 19, 15, 15, 15, 15, 16, 14, 10, 17, 17, 17, 17, 17, 15, 10, 17, 19, 19, 19, 19, 18, 14, 17, 22, 23, 23, 23, 22, 18, 20, 27, 28, 26, 28, 25, 20, 24, 30, 34, 32, 29, 27, 21, 29, 34, 35, 33, 31, 28, 22, 25, 26, 24, 25, 21, 17, 13, 24, 29, 27, 26, 23, 18, 14, 25, 31, 30, 29, 25, 22, 17, 25, 32, 34, 33, 29, 25, 22, 28, 34, 38, 38, 34, 28, 23, 31, 37, 45, 42, 36, 30, 25, 34, 39, 45, 45, 38, 32, 27, 33, 38, 36, 30, 25, 20, 16, 33, 39, 40, 32, 26, 21, 18, 34, 39, 43, 34, 30, 26, 21, 33, 39, 46, 39, 33, 29, 25, 35, 40, 48, 44, 38, 31, 27, 38, 44, 50, 48, 42, 34, 29, 40, 46, 51, 51, 44, 37, 30, 2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 3, 2, 3, 2, 3, 3, 4, 5, 5, 5, 6, 5, 6, 5, 5, 10, 9, 9, 8, 7, 5, 5, 16, 13, 11, 8, 7, 5, 5, 2, 2, 0, 2, 1, 2, 4, 3, 2, 1, 2, 1, 2, 5, 3, 2, 1, 1, 1, 3, 6, 4, 3, 3, 3, 3, 4, 7, 8, 7, 7, 7, 7, 5, 7, 12, 11, 11, 10, 9, 7, 7, 20, 16, 13, 11, 10, 9, 7, 3, 2, 4, 4, 4, 5, 7, 5, 2, 4, 4, 5, 5, 8, 8, 3, 5, 7, 7, 6, 9, 11, 4, 8, 10, 10, 10, 11, 15, 9, 11, 14, 14, 13, 11, 18, 14, 16, 17, 16, 15, 11, 21, 19, 19, 19, 18, 16, 15, 8, 7, 10, 10, 10, 8, 11, 12, 8, 11, 11, 12, 12, 12, 15, 9, 12, 14, 14, 15, 14, 17, 12, 17, 18, 18, 18, 15, 18, 17, 20, 21, 22, 22, 19, 18, 24, 26, 25, 23, 23, 21, 22, 30, 28, 28, 25, 24, 23, 17, 18, 19, 18, 19, 17, 12, 20, 19, 20, 19, 20, 19, 12, 20, 20, 22, 23, 23, 22, 17, 20, 24, 26, 27, 27, 26, 22, 23, 29, 31, 31, 31, 29, 24, 25, 33, 36, 35, 33, 30, 25, 30, 38, 40, 38, 36, 31, 27, 28, 29, 28, 27, 24, 21, 15, 27, 32, 31, 30, 26, 22, 18, 27, 33, 33, 32, 30, 25, 22, 28, 35, 39, 37, 33, 29, 25, 31, 38, 43, 42, 38, 32, 27, 35, 42, 48, 46, 40, 34, 28, 38, 44, 49, 49, 43, 36, 30, 37, 42, 39, 34, 27, 23, 19, 37, 42, 43, 36, 30, 25, 21, 37, 42, 46, 39, 33, 29, 25, 37, 44, 50, 42, 38, 32, 28, 39, 45, 52, 49, 42, 36, 31, 43, 48, 54, 54, 46, 39, 33, 44, 50, 55, 55, 48, 41, 33, 2, 2, 1, 2, 2, 1, 3, 3, 2, 2, 2, 1, 1, 4, 3, 2, 2, 2, 3, 3, 5, 3, 3, 4, 3, 4, 5, 6, 6, 6, 7, 7, 7, 6, 6, 11, 11, 11, 10, 8, 6, 6, 17, 15, 12, 10, 8, 6, 6, 3, 2, 2, 0, 1, 4, 6, 3, 2, 2, 1, 1, 4, 6, 5, 3, 2, 3, 3, 5, 8, 8, 4, 4, 5, 7, 6, 9, 11, 7, 8, 9, 10, 7, 9, 15, 12, 12, 12, 12, 10, 9, 21, 18, 14, 12, 13, 12, 9, 5, 3, 5, 6, 6, 7, 8, 8, 3, 5, 7, 7, 6, 9, 11, 3, 5, 9, 10, 8, 11, 15, 5, 9, 13, 13, 13, 13, 18, 10, 12, 17, 18, 16, 13, 21, 16, 17, 20, 19, 18, 13, 24, 21, 20, 21, 21, 19, 17, 11, 8, 12, 12, 13, 10, 13, 15, 9, 12, 14, 15, 14, 15, 18, 11, 14, 17, 18, 19, 16, 20, 14, 18, 20, 21, 21, 18, 21, 20, 22, 24, 25, 24, 21, 22, 25, 29, 28, 26, 27, 24, 23, 31, 31, 31, 29, 29, 27, 20, 19, 20, 21, 21, 20, 13, 24, 20, 21, 23, 23, 22, 14, 23, 22, 24, 26, 27, 25, 20, 24, 26, 29, 30, 30, 29, 25, 24, 33, 35, 35, 35, 31, 27, 28, 37, 40, 39, 37, 33, 28, 32, 40, 44, 40, 40, 37, 32, 29, 32, 31, 32, 27, 23, 18, 29, 35, 33, 33, 30, 26, 22, 29, 36, 36, 37, 32, 28, 25, 29, 37, 41, 41, 37, 33, 29, 33, 41, 47, 46, 42, 36, 31, 36, 45, 52, 50, 44, 38, 31, 40, 46, 53, 53, 46, 40, 34, 40, 45, 43, 37, 30, 26, 22, 40, 46, 45, 38, 32, 28, 25, 39, 45, 49, 43, 38, 32, 28, 39, 46, 53, 46, 41, 36, 33, 44, 49, 54, 52, 46, 40, 35, 45, 52, 58, 57, 48, 43, 36, 48, 54, 60, 59, 52, 44, 38, 2, 1, 1, 3, 3, 1, 2, 2, 2, 1, 2, 3, 2, 3, 2, 2, 1, 3, 4, 4, 4, 2, 3, 4, 5, 6, 6, 6, 6, 7, 7, 8, 10, 8, 6, 11, 11, 11, 10, 10, 8, 7, 17, 15, 13, 11, 10, 8, 7, 2, 2, 1, 1, 0, 2, 4, 2, 2, 1, 1, 1, 3, 5, 5, 2, 2, 2, 3, 4, 6, 9, 3, 4, 5, 6, 5, 8, 11, 7, 8, 9, 10, 6, 8, 15, 13, 13, 12, 11, 10, 8, 21, 18, 15, 13, 13, 12, 8, 5, 2, 4, 5, 5, 5, 7, 10, 2, 4, 6, 7, 5, 8, 13, 2, 5, 9, 10, 6, 10, 15, 5, 8, 12, 13, 12, 12, 17, 10, 12, 16, 17, 16, 12, 21, 16, 17, 19, 19, 17, 12, 24, 21, 20, 21, 20, 19, 16, 13, 7, 11, 12, 11, 8, 11, 16, 9, 11, 12, 14, 13, 13, 19, 11, 13, 16, 17, 17, 15, 21, 14, 17, 20, 20, 21, 17, 21, 19, 22, 24, 23, 24, 21, 22, 25, 27, 28, 27, 26, 23, 24, 31, 31, 30, 28, 27, 26, 21, 18, 19, 20, 20, 19, 11, 24, 19, 21, 21, 22, 22, 13, 25, 21, 23, 25, 26, 24, 19, 24, 26, 27, 30, 29, 28, 24, 25, 31, 33, 34, 35, 33, 26, 27, 36, 39, 38, 36, 34, 28, 32, 41, 42, 41, 39, 35, 30, 28, 30, 30, 28, 25, 22, 16, 29, 33, 31, 31, 28, 24, 20, 28, 35, 34, 35, 31, 28, 24, 29, 37, 40, 39, 37, 31, 28, 32, 40, 45, 45, 41, 35, 29, 36, 44, 51, 48, 42, 37, 32, 39, 48, 51, 50, 45, 39, 33, 38, 43, 41, 34, 28, 24, 21, 38, 43, 43, 37, 31, 28, 24, 37, 44, 46, 39, 36, 31, 28, 37, 45, 51, 45, 39, 36, 31, 41, 49, 54, 51, 45, 39, 33, 44, 51, 57, 56, 47, 41, 34, 47, 52, 57, 58, 50, 43, 37, 2, 1, 3, 5, 5, 3, 2, 2, 1, 3, 4, 6, 4, 3, 2, 1, 2, 5, 7, 6, 5, 2, 3, 4, 6, 8, 8, 8, 5, 6, 7, 9, 11, 10, 8, 11, 11, 11, 12, 12, 10, 8, 17, 15, 13, 12, 12, 10, 8, 2, 1, 2, 4, 2, 0, 2, 2, 2, 2, 3, 3, 1, 4, 2, 2, 1, 4, 4, 3, 5, 5, 3, 4, 6, 6, 6, 6, 8, 7, 8, 9, 9, 7, 7, 14, 13, 12, 12, 10, 8, 6, 21, 18, 15, 12, 10, 9, 7, 2, 2, 3, 2, 2, 3, 5, 6, 2, 3, 3, 4, 4, 6, 10, 2, 4, 6, 7, 5, 7, 13, 3, 8, 10, 10, 10, 10, 15, 9, 12, 14, 14, 13, 10, 19, 15, 17, 17, 16, 15, 10, 23, 22, 19, 19, 17, 16, 14, 10, 7, 9, 9, 9, 6, 8, 14, 7, 10, 10, 11, 11, 10, 16, 9, 11, 13, 14, 15, 12, 19, 12, 16, 18, 18, 18, 14, 18, 17, 20, 22, 22, 21, 17, 19, 24, 25, 25, 25, 24, 21, 23, 30, 29, 28, 26, 24, 23, 19, 16, 17, 17, 17, 16, 9, 23, 18, 18, 18, 20, 18, 10, 23, 20, 21, 22, 23, 21, 16, 22, 24, 26, 27, 27, 26, 22, 22, 29, 31, 31, 31, 29, 23, 25, 35, 37, 36, 34, 31, 25, 31, 38, 39, 37, 35, 32, 26, 27, 28, 27, 26, 23, 18, 14, 28, 31, 27, 27, 25, 21, 18, 26, 32, 32, 32, 29, 25, 21, 26, 34, 37, 36, 32, 29, 25, 30, 38, 43, 42, 39, 31, 28, 35, 42, 49, 46, 39, 33, 28, 39, 44, 49, 49, 42, 38, 30, 35, 41, 36, 31, 25, 21, 18, 34, 39, 39, 32, 27, 25, 20, 36, 40, 41, 36, 33, 29, 25, 35, 42, 47, 42, 36, 32, 29, 39, 44, 52, 49, 41, 37, 31, 42, 48, 54, 52, 44, 38, 32, 45, 50, 53, 54, 47, 41, 34, 1, 4, 5, 7, 7, 5, 3, 1, 3, 5, 7, 8, 6, 5, 1, 2, 5, 7, 9, 8, 6, 2, 3, 6, 8, 10, 9, 8, 5, 6, 8, 10, 12, 10, 8, 10, 10, 12, 13, 12, 10, 8, 16, 15, 13, 13, 13, 10, 8, 1, 2, 4, 5, 4, 2, 0, 2, 1, 4, 5, 4, 3, 2, 2, 1, 3, 6, 5, 4, 4, 2, 3, 5, 7, 7, 6, 6, 6, 7, 8, 10, 10, 8, 6, 12, 12, 12, 13, 10, 8, 6, 20, 17, 14, 13, 11, 9, 6, 2, 1, 1, 1, 2, 2, 3, 2, 2, 1, 1, 1, 2, 4, 5, 2, 2, 3, 3, 3, 5, 10, 3, 6, 7, 6, 7, 7, 12, 8, 10, 11, 11, 10, 7, 17, 14, 15, 14, 12, 11, 7, 22, 20, 18, 16, 14, 13, 11, 5, 6, 6, 6, 6, 5, 7, 11, 6, 7, 7, 8, 8, 7, 14, 7, 9, 10, 11, 11, 9, 16, 10, 14, 14, 14, 15, 11, 16, 16, 18, 18, 18, 18, 15, 17, 23, 23, 22, 21, 19, 18, 22, 30, 26, 24, 22, 21, 20, 16, 14, 14, 13, 14, 13, 7, 18, 15, 15, 15, 16, 15, 7, 18, 18, 18, 19, 19, 17, 13, 19, 22, 22, 23, 23, 22, 18, 20, 27, 28, 28, 28, 25, 20, 24, 31, 34, 32, 29, 26, 22, 29, 34, 37, 34, 32, 29, 23, 24, 24, 23, 23, 19, 15, 11, 24, 28, 25, 24, 21, 18, 14, 24, 30, 28, 27, 26, 21, 18, 24, 31, 33, 32, 29, 26, 22, 27, 34, 39, 36, 33, 29, 23, 32, 38, 44, 42, 35, 30, 25, 34, 41, 45, 45, 39, 33, 26, 30, 37, 33, 27, 22, 18, 14, 32, 36, 35, 29, 24, 21, 18, 32, 36, 38, 32, 28, 25, 21, 31, 37, 44, 38, 33, 29, 25, 34, 40, 46, 42, 38, 32, 27, 38, 44, 48, 48, 41, 34, 29, 42, 48, 50, 50, 43, 35, 30, 2, 2, 3, 4, 4, 3, 2, 2, 2, 3, 4, 4, 2, 2, 1, 2, 2, 3, 3, 2, 1, 0, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 7, 6, 7, 6, 5, 3, 3, 13, 11, 9, 7, 5, 3, 3, 1, 2, 3, 3, 2, 2, 2, 0, 2, 2, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 3, 3, 9, 8, 8, 7, 5, 4, 3, 16, 13, 10, 8, 6, 4, 3, 1, 2, 2, 2, 2, 2, 3, 2, 2, 2, 1, 2, 1, 3, 2, 1, 1, 1, 1, 1, 4, 2, 2, 2, 2, 2, 2, 6, 6, 6, 5, 5, 6, 5, 5, 12, 11, 10, 9, 7, 6, 5, 18, 16, 13, 11, 9, 7, 7, 2, 3, 4, 4, 4, 4, 8, 2, 5, 4, 5, 5, 5, 8, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 9, 9, 13, 13, 13, 13, 12, 12, 12, 18, 17, 16, 15, 14, 13, 18, 24, 21, 19, 16, 15, 15, 11, 11, 12, 12, 12, 11, 7, 13, 13, 13, 13, 13, 12, 8, 13, 15, 14, 15, 14, 13, 10, 13, 19, 18, 18, 18, 17, 14, 16, 23, 22, 21, 23, 20, 15, 20, 26, 27, 26, 24, 22, 17, 24, 29, 31, 28, 26, 24, 19, 20, 22, 21, 21, 18, 14, 9, 21, 24, 23, 22, 19, 15, 10, 21, 26, 25, 25, 21, 17, 13, 21, 27, 29, 28, 25, 20, 17, 23, 28, 33, 32, 29, 23, 18, 26, 31, 38, 37, 32, 25, 20, 29, 35, 38, 39, 34, 28, 22, 28, 35, 33, 26, 21, 17, 12, 28, 34, 35, 28, 23, 18, 14, 28, 34, 38, 30, 25, 20, 16, 28, 34, 40, 35, 29, 24, 20, 30, 36, 43, 39, 32, 28, 23, 32, 38, 43, 42, 36, 29, 24, 34, 40, 44, 46, 38, 32, 26, 0, 2, 2, 3, 3, 2, 2, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 4, 4, 8, 8, 8, 7, 5, 4, 4, 14, 12, 9, 7, 6, 4, 4, 2, 1, 2, 3, 2, 2, 1, 2, 0, 2, 2, 2, 1, 1, 2, 1, 2, 2, 2, 1, 3, 2, 2, 2, 2, 2, 3, 4, 5, 5, 5, 5, 5, 4, 4, 10, 9, 9, 8, 6, 4, 4, 17, 15, 11, 9, 7, 5, 4, 2, 1, 1, 1, 1, 2, 6, 2, 2, 1, 1, 1, 3, 6, 2, 2, 2, 2, 2, 3, 7, 6, 3, 5, 5, 5, 6, 8, 9, 7, 9, 9, 9, 8, 8, 14, 12, 13, 12, 11, 10, 8, 20, 18, 16, 14, 12, 11, 10, 3, 6, 6, 6, 7, 6, 9, 6, 7, 7, 8, 8, 8, 9, 9, 7, 9, 9, 10, 10, 10, 12, 10, 12, 13, 13, 13, 12, 13, 15, 16, 17, 17, 16, 14, 14, 21, 21, 20, 19, 17, 16, 20, 28, 24, 22, 20, 19, 18, 14, 15, 14, 14, 15, 13, 9, 16, 17, 16, 15, 16, 15, 10, 16, 17, 18, 18, 18, 17, 13, 15, 22, 21, 21, 22, 20, 17, 19, 26, 27, 26, 26, 23, 19, 23, 31, 32, 30, 28, 25, 20, 27, 33, 35, 31, 29, 27, 21, 24, 25, 24, 24, 20, 16, 12, 23, 27, 25, 25, 22, 18, 14, 24, 30, 28, 27, 25, 20, 17, 23, 30, 33, 31, 28, 24, 20, 27, 33, 38, 36, 32, 28, 22, 30, 36, 42, 41, 34, 29, 24, 33, 39, 43, 42, 37, 31, 26, 32, 37, 36, 29, 23, 19, 15, 32, 37, 38, 30, 25, 20, 17, 31, 36, 40, 33, 28, 23, 20, 32, 38, 44, 38, 32, 28, 24, 34, 41, 46, 44, 37, 31, 25, 36, 43, 48, 49, 40, 34, 28, 39, 45, 49, 50, 42, 35, 30, 2, 0, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 5, 4, 9, 9, 9, 8, 6, 5, 4, 15, 13, 10, 8, 7, 5, 4, 2, 2, 1, 2, 1, 1, 4, 2, 2, 0, 2, 1, 1, 4, 2, 2, 1, 1, 1, 2, 5, 3, 3, 3, 3, 3, 4, 6, 7, 6, 6, 6, 6, 4, 6, 11, 11, 11, 9, 7, 6, 6, 19, 16, 12, 10, 9, 7, 6, 3, 2, 3, 3, 3, 5, 7, 3, 2, 3, 4, 4, 5, 7, 7, 2, 4, 6, 6, 5, 8, 10, 3, 7, 9, 9, 9, 10, 13, 8, 11, 12, 13, 12, 10, 17, 13, 15, 16, 15, 13, 10, 21, 19, 18, 17, 16, 15, 14, 7, 7, 9, 9, 10, 8, 11, 11, 8, 10, 10, 11, 11, 11, 13, 8, 11, 12, 13, 13, 12, 16, 11, 15, 16, 16, 17, 14, 17, 17, 20, 20, 20, 19, 18, 18, 23, 24, 24, 23, 21, 20, 21, 30, 27, 25, 24, 22, 22, 17, 17, 17, 17, 18, 16, 11, 19, 18, 18, 18, 18, 18, 11, 19, 20, 21, 21, 22, 20, 16, 19, 23, 25, 25, 25, 24, 20, 21, 30, 30, 29, 29, 26, 22, 25, 34, 35, 34, 31, 29, 24, 30, 36, 39, 35, 34, 31, 26, 26, 28, 27, 27, 23, 19, 15, 26, 31, 29, 28, 25, 21, 17, 26, 32, 32, 31, 28, 24, 20, 26, 34, 37, 35, 31, 28, 23, 30, 36, 41, 40, 36, 30, 26, 33, 41, 46, 45, 38, 32, 27, 37, 42, 48, 48, 41, 35, 28, 35, 41, 39, 32, 26, 22, 18, 35, 41, 42, 34, 29, 24, 20, 36, 42, 45, 37, 33, 27, 23, 36, 42, 49, 41, 37, 31, 27, 38, 45, 50, 47, 42, 35, 29, 41, 48, 53, 52, 44, 37, 31, 44, 50, 53, 54, 46, 40, 32, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 3, 3, 2, 1, 2, 3, 3, 4, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 6, 7, 6, 5, 10, 10, 10, 9, 8, 6, 5, 17, 15, 12, 10, 8, 6, 5, 3, 2, 2, 1, 1, 3, 5, 3, 2, 2, 0, 1, 3, 6, 3, 2, 2, 2, 2, 4, 7, 6, 4, 4, 5, 5, 5, 8, 10, 7, 8, 8, 9, 6, 8, 14, 12, 12, 11, 10, 9, 8, 20, 17, 14, 12, 12, 11, 8, 3, 2, 4, 5, 5, 6, 8, 7, 3, 4, 6, 6, 6, 9, 10, 3, 5, 8, 9, 7, 10, 14, 5, 9, 12, 12, 12, 12, 16, 9, 12, 15, 16, 15, 12, 20, 15, 16, 19, 18, 17, 12, 23, 21, 20, 21, 19, 18, 16, 10, 7, 11, 12, 12, 9, 13, 14, 8, 12, 13, 14, 13, 13, 17, 10, 13, 16, 16, 17, 15, 19, 13, 17, 20, 20, 20, 17, 20, 18, 22, 24, 24, 23, 20, 20, 24, 26, 28, 26, 25, 23, 23, 30, 30, 29, 27, 26, 25, 19, 19, 20, 20, 20, 19, 13, 23, 20, 21, 22, 22, 21, 13, 22, 22, 23, 25, 26, 24, 19, 22, 26, 28, 28, 29, 28, 24, 24, 32, 33, 33, 33, 31, 25, 27, 37, 39, 38, 35, 32, 27, 31, 40, 42, 39, 39, 35, 29, 28, 31, 30, 29, 27, 22, 17, 29, 33, 32, 31, 28, 24, 20, 28, 35, 34, 35, 32, 27, 23, 28, 37, 40, 39, 36, 31, 27, 32, 41, 46, 44, 41, 34, 29, 36, 43, 50, 49, 42, 37, 32, 40, 47, 51, 51, 45, 38, 32, 38, 44, 41, 35, 28, 25, 20, 38, 44, 44, 37, 32, 28, 24, 39, 44, 47, 41, 36, 31, 27, 38, 45, 52, 46, 40, 36, 31, 41, 48, 55, 52, 44, 39, 34, 45, 51, 57, 56, 47, 40, 35, 48, 53, 56, 58, 51, 43, 37, 2, 1, 1, 3, 3, 1, 2, 2, 1, 1, 2, 3, 2, 3, 2, 2, 1, 3, 4, 4, 4, 2, 3, 3, 4, 6, 6, 6, 5, 6, 7, 7, 9, 8, 6, 11, 11, 11, 10, 10, 8, 6, 17, 15, 12, 10, 9, 8, 6, 2, 2, 1, 1, 1, 3, 4, 2, 2, 1, 1, 0, 3, 5, 4, 2, 1, 2, 2, 4, 6, 8, 3, 4, 5, 5, 5, 7, 10, 7, 8, 9, 9, 6, 7, 14, 12, 12, 12, 11, 9, 7, 21, 17, 14, 12, 12, 11, 7, 4, 2, 4, 5, 5, 6, 8, 9, 2, 4, 6, 6, 5, 8, 13, 2, 5, 8, 9, 6, 10, 15, 5, 8, 12, 12, 12, 12, 17, 10, 12, 16, 17, 16, 12, 21, 15, 17, 19, 19, 17, 12, 24, 21, 19, 20, 19, 18, 16, 13, 7, 11, 12, 11, 9, 12, 16, 8, 11, 12, 14, 13, 13, 19, 11, 12, 15, 17, 17, 14, 21, 14, 17, 20, 20, 20, 16, 20, 19, 22, 23, 25, 24, 19, 22, 25, 27, 27, 27, 25, 24, 23, 31, 30, 30, 28, 27, 26, 21, 17, 19, 20, 20, 19, 12, 24, 19, 21, 21, 22, 21, 13, 24, 21, 23, 24, 25, 24, 18, 24, 26, 27, 28, 30, 28, 24, 25, 32, 32, 34, 33, 32, 25, 27, 34, 39, 38, 36, 33, 27, 32, 39, 43, 39, 38, 36, 29, 28, 29, 29, 29, 26, 22, 16, 28, 33, 31, 31, 27, 24, 20, 28, 36, 35, 33, 31, 27, 24, 28, 37, 39, 38, 35, 31, 27, 32, 39, 45, 44, 40, 34, 30, 35, 43, 51, 47, 41, 36, 31, 39, 48, 52, 52, 45, 38, 33, 38, 43, 40, 34, 29, 24, 21, 38, 43, 43, 37, 32, 27, 24, 37, 43, 46, 40, 36, 32, 27, 37, 44, 50, 44, 40, 34, 31, 41, 48, 53, 51, 43, 39, 33, 45, 51, 55, 56, 48, 40, 34, 47, 53, 55, 57, 51, 41, 37, 1, 1, 4, 6, 5, 4, 2, 1, 1, 3, 5, 5, 3, 2, 2, 1, 2, 4, 6, 5, 4, 2, 2, 3, 5, 7, 6, 6, 5, 5, 6, 8, 10, 8, 6, 10, 9, 9, 10, 10, 8, 6, 15, 14, 11, 10, 10, 8, 6, 2, 1, 2, 4, 3, 1, 3, 2, 1, 1, 3, 3, 0, 3, 2, 2, 1, 3, 3, 2, 4, 4, 3, 4, 5, 5, 4, 5, 7, 6, 7, 8, 7, 6, 5, 12, 11, 11, 10, 8, 6, 5, 19, 16, 12, 10, 9, 8, 5, 2, 1, 3, 2, 3, 4, 6, 4, 2, 3, 3, 4, 3, 5, 8, 2, 4, 6, 6, 4, 6, 13, 3, 7, 9, 9, 9, 8, 14, 8, 11, 13, 13, 12, 8, 18, 14, 15, 16, 15, 13, 8, 21, 19, 18, 18, 16, 15, 13, 9, 6, 9, 9, 9, 7, 10, 13, 7, 9, 10, 10, 10, 9, 16, 8, 11, 13, 13, 13, 11, 18, 11, 15, 16, 17, 17, 13, 18, 17, 19, 20, 21, 19, 16, 18, 23, 25, 23, 23, 21, 19, 21, 28, 27, 26, 24, 23, 22, 18, 16, 17, 16, 17, 17, 10, 21, 18, 18, 18, 19, 17, 9, 21, 19, 20, 22, 21, 20, 15, 21, 23, 24, 25, 25, 24, 20, 22, 29, 30, 30, 30, 27, 22, 25, 33, 35, 34, 32, 29, 24, 29, 37, 38, 35, 34, 31, 26, 26, 28, 27, 26, 22, 19, 14, 26, 30, 28, 27, 25, 21, 17, 25, 32, 31, 30, 28, 24, 20, 26, 34, 36, 35, 32, 28, 24, 28, 36, 41, 40, 36, 31, 26, 33, 41, 47, 43, 38, 31, 27, 37, 41, 47, 47, 40, 34, 29, 35, 40, 37, 30, 26, 22, 18, 34, 40, 40, 33, 27, 24, 20, 35, 40, 43, 36, 31, 27, 24, 34, 42, 46, 41, 36, 32, 28, 37, 43, 48, 46, 40, 35, 30, 41, 46, 52, 51, 42, 36, 31, 44, 49, 53, 52, 45, 39, 32, 1, 5, 6, 8, 8, 6, 4, 0, 3, 6, 8, 8, 5, 3, 1, 2, 5, 6, 8, 6, 5, 1, 3, 5, 7, 9, 7, 6, 4, 5, 7, 8, 10, 9, 6, 8, 8, 10, 11, 11, 9, 7, 14, 12, 11, 11, 10, 8, 7, 1, 2, 5, 7, 5, 4, 2, 1, 1, 4, 6, 5, 3, 0, 2, 1, 3, 5, 4, 3, 2, 2, 2, 4, 5, 5, 4, 4, 5, 6, 7, 8, 7, 6, 4, 11, 10, 10, 10, 8, 6, 4, 17, 14, 12, 10, 8, 6, 4, 1, 1, 1, 2, 3, 3, 5, 2, 1, 0, 1, 2, 2, 3, 3, 1, 2, 2, 2, 2, 4, 7, 2, 5, 5, 5, 5, 5, 11, 7, 9, 9, 9, 8, 5, 15, 12, 13, 12, 11, 9, 5, 19, 17, 15, 14, 12, 10, 9, 3, 5, 6, 6, 7, 6, 8, 8, 6, 7, 7, 8, 8, 7, 11, 7, 8, 9, 9, 9, 8, 14, 9, 13, 13, 13, 13, 10, 15, 14, 17, 16, 17, 16, 13, 15, 20, 21, 20, 19, 17, 16, 20, 26, 24, 22, 21, 19, 18, 14, 14, 14, 14, 15, 14, 8, 17, 16, 15, 15, 16, 14, 7, 17, 17, 18, 18, 18, 17, 12, 16, 21, 22, 21, 22, 20, 16, 19, 27, 27, 26, 26, 24, 18, 22, 30, 31, 30, 27, 25, 21, 27, 33, 35, 32, 30, 27, 22, 24, 25, 24, 23, 20, 17, 12, 24, 27, 25, 24, 21, 17, 12, 23, 29, 27, 27, 24, 20, 16, 24, 31, 31, 30, 27, 24, 20, 26, 33, 37, 35, 32, 27, 21, 30, 36, 43, 39, 33, 29, 24, 33, 39, 43, 41, 36, 29, 25, 31, 35, 33, 27, 23, 19, 15, 32, 36, 35, 28, 24, 20, 16, 32, 37, 38, 32, 27, 24, 20, 30, 37, 41, 36, 31, 27, 23, 34, 39, 44, 41, 36, 30, 25, 37, 41, 47, 46, 39, 32, 28, 39, 45, 48, 47, 41, 34, 29, 2, 2, 4, 8, 8, 6, 2, 2, 2, 3, 7, 8, 4, 2, 2, 2, 3, 4, 5, 3, 2, 1, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 6, 6, 6, 6, 4, 3, 2, 12, 10, 8, 6, 4, 3, 3, 2, 2, 3, 5, 5, 2, 2, 1, 2, 3, 4, 4, 2, 2, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 4, 4, 3, 3, 3, 8, 7, 8, 7, 4, 3, 3, 15, 13, 10, 7, 5, 3, 3, 0, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 4, 5, 5, 4, 4, 5, 3, 4, 11, 10, 9, 8, 6, 4, 4, 17, 16, 12, 9, 7, 6, 5, 2, 2, 2, 3, 3, 3, 7, 2, 3, 3, 4, 4, 4, 7, 4, 4, 4, 5, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 7, 11, 11, 11, 12, 11, 10, 11, 17, 16, 15, 14, 12, 12, 18, 22, 19, 17, 16, 14, 13, 10, 10, 10, 10, 11, 10, 7, 12, 12, 12, 11, 12, 11, 7, 12, 14, 13, 13, 13, 12, 8, 12, 17, 16, 17, 16, 15, 12, 15, 21, 20, 20, 20, 19, 13, 18, 24, 26, 24, 24, 21, 15, 22, 28, 29, 26, 25, 23, 17, 19, 21, 20, 20, 16, 12, 8, 19, 23, 22, 22, 18, 13, 9, 20, 25, 24, 24, 20, 15, 11, 19, 25, 27, 27, 23, 19, 15, 21, 28, 31, 31, 28, 22, 17, 25, 30, 36, 35, 30, 24, 18, 27, 33, 38, 36, 31, 27, 21, 27, 32, 31, 25, 20, 16, 11, 27, 33, 34, 27, 22, 16, 12, 27, 32, 36, 29, 24, 19, 15, 27, 33, 38, 32, 27, 23, 19, 28, 35, 40, 36, 32, 26, 21, 31, 36, 41, 40, 33, 28, 22, 34, 37, 42, 41, 35, 31, 24, 1, 2, 3, 3, 3, 2, 2, 0, 2, 2, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 2, 4, 4, 3, 4, 4, 4, 4, 4, 7, 7, 7, 7, 5, 4, 4, 13, 11, 9, 7, 6, 4, 4, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 4, 5, 4, 4, 5, 4, 4, 3, 9, 9, 8, 8, 5, 4, 4, 17, 14, 10, 8, 6, 4, 3, 2, 0, 1, 1, 2, 2, 5, 2, 2, 1, 1, 1, 2, 5, 2, 2, 1, 1, 1, 1, 6, 4, 2, 4, 4, 4, 4, 7, 8, 6, 7, 8, 8, 7, 7, 13, 11, 12, 11, 9, 8, 7, 19, 17, 15, 13, 11, 10, 9, 2, 5, 5, 6, 6, 5, 8, 5, 6, 6, 7, 7, 7, 9, 8, 7, 7, 8, 8, 8, 9, 11, 9, 11, 11, 11, 11, 11, 11, 14, 15, 15, 15, 14, 13, 13, 20, 20, 19, 18, 16, 15, 19, 26, 23, 20, 19, 17, 17, 12, 13, 13, 13, 14, 12, 8, 14, 15, 15, 15, 15, 13, 8, 14, 17, 16, 16, 16, 15, 12, 14, 21, 20, 19, 20, 19, 15, 18, 26, 24, 24, 25, 22, 17, 21, 29, 30, 29, 26, 23, 19, 26, 31, 33, 30, 29, 26, 20, 22, 24, 22, 22, 19, 15, 11, 23, 26, 24, 23, 21, 16, 12, 22, 28, 27, 26, 22, 19, 15, 22, 28, 31, 30, 26, 22, 19, 26, 32, 35, 35, 31, 26, 21, 28, 34, 40, 39, 32, 28, 23, 32, 37, 42, 41, 36, 29, 25, 30, 36, 35, 28, 22, 18, 14, 30, 36, 37, 29, 23, 19, 15, 30, 36, 39, 32, 27, 22, 19, 31, 38, 42, 36, 31, 26, 23, 32, 39, 44, 42, 34, 30, 24, 34, 40, 47, 45, 38, 32, 27, 37, 42, 48, 48, 41, 34, 27, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 3, 4, 4, 5, 4, 5, 5, 4, 4, 9, 8, 8, 7, 6, 4, 4, 15, 13, 10, 8, 6, 4, 4, 2, 1, 1, 2, 1, 1, 3, 2, 1, 1, 2, 1, 1, 3, 2, 2, 0, 1, 2, 1, 5, 2, 3, 2, 3, 3, 3, 5, 6, 6, 6, 6, 5, 4, 5, 11, 10, 10, 9, 6, 5, 5, 18, 15, 12, 9, 8, 6, 5, 2, 2, 2, 2, 2, 5, 7, 2, 2, 3, 3, 3, 5, 7, 5, 2, 4, 4, 5, 5, 8, 8, 3, 7, 7, 8, 8, 9, 12, 7, 10, 11, 11, 10, 9, 15, 13, 15, 15, 13, 12, 9, 21, 19, 17, 16, 15, 13, 12, 5, 7, 8, 9, 9, 8, 11, 9, 7, 9, 10, 10, 10, 11, 11, 8, 11, 11, 12, 12, 12, 14, 10, 15, 15, 15, 15, 13, 15, 16, 18, 19, 19, 18, 17, 16, 22, 23, 22, 21, 20, 19, 21, 28, 27, 25, 23, 22, 21, 15, 16, 16, 16, 17, 16, 11, 17, 18, 18, 18, 18, 17, 11, 17, 19, 20, 21, 21, 19, 15, 17, 23, 24, 23, 24, 22, 19, 20, 29, 28, 28, 28, 25, 21, 24, 33, 34, 33, 31, 27, 23, 29, 35, 37, 33, 32, 30, 24, 26, 27, 26, 26, 23, 18, 14, 25, 30, 28, 27, 24, 20, 15, 26, 31, 31, 31, 26, 23, 19, 25, 33, 34, 35, 31, 26, 22, 28, 35, 40, 38, 36, 29, 24, 32, 39, 45, 43, 37, 32, 26, 36, 41, 46, 46, 40, 34, 28, 34, 41, 38, 32, 26, 22, 17, 34, 41, 41, 34, 27, 22, 19, 34, 40, 43, 37, 31, 26, 22, 34, 41, 47, 41, 35, 30, 26, 36, 43, 49, 44, 40, 33, 28, 39, 45, 52, 51, 43, 35, 30, 42, 48, 52, 51, 45, 38, 32, 2, 1, 2, 4, 3, 3, 3, 2, 1, 2, 3, 3, 2, 1, 2, 2, 1, 2, 2, 1, 3, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 5, 4, 4, 9, 9, 8, 8, 6, 4, 4, 15, 13, 10, 8, 7, 4, 4, 2, 2, 1, 3, 3, 4, 6, 2, 2, 1, 2, 2, 3, 5, 2, 2, 1, 0, 0, 3, 6, 4, 3, 3, 3, 3, 4, 7, 8, 6, 6, 7, 6, 4, 7, 12, 10, 10, 9, 8, 7, 7, 19, 16, 12, 10, 10, 9, 7, 2, 2, 4, 5, 6, 7, 9, 4, 2, 4, 6, 6, 6, 8, 7, 2, 4, 6, 7, 6, 9, 11, 3, 7, 10, 10, 10, 10, 14, 8, 11, 14, 14, 13, 10, 18, 13, 15, 17, 15, 15, 10, 21, 18, 18, 18, 17, 16, 14, 7, 7, 10, 11, 12, 10, 14, 11, 8, 11, 12, 13, 13, 13, 14, 8, 12, 13, 14, 14, 13, 17, 12, 16, 17, 18, 18, 15, 17, 17, 20, 21, 22, 21, 19, 18, 23, 26, 24, 23, 22, 21, 21, 29, 28, 27, 25, 23, 24, 17, 18, 19, 19, 20, 20, 14, 20, 19, 21, 21, 21, 20, 13, 19, 20, 22, 23, 23, 22, 17, 20, 25, 26, 27, 27, 26, 21, 22, 31, 30, 31, 32, 29, 23, 25, 35, 36, 35, 33, 30, 25, 30, 37, 40, 37, 36, 32, 26, 27, 30, 29, 29, 26, 22, 18, 27, 32, 31, 30, 27, 23, 18, 28, 34, 34, 33, 30, 25, 21, 27, 36, 39, 38, 33, 29, 25, 30, 39, 42, 41, 37, 32, 27, 34, 41, 47, 46, 40, 34, 29, 38, 42, 49, 50, 43, 35, 30, 36, 44, 41, 34, 29, 25, 20, 38, 43, 43, 36, 30, 26, 21, 38, 44, 47, 40, 34, 29, 25, 37, 44, 50, 44, 38, 33, 29, 39, 45, 52, 50, 42, 36, 30, 42, 49, 54, 54, 46, 37, 33, 47, 51, 56, 55, 49, 41, 34, 2, 1, 3, 6, 6, 4, 3, 2, 1, 2, 5, 6, 3, 1, 2, 2, 1, 3, 4, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 7, 5, 4, 9, 8, 8, 8, 7, 5, 4, 14, 12, 10, 7, 8, 5, 4, 2, 2, 1, 3, 3, 4, 5, 2, 2, 1, 2, 2, 3, 4, 2, 2, 1, 0, 0, 2, 4, 4, 3, 3, 3, 3, 3, 5, 8, 6, 6, 6, 6, 3, 5, 12, 10, 10, 9, 8, 7, 5, 18, 15, 11, 9, 9, 8, 5, 2, 2, 4, 5, 5, 6, 8, 5, 2, 3, 6, 6, 6, 7, 8, 2, 4, 6, 7, 4, 7, 12, 3, 7, 10, 10, 9, 9, 15, 8, 10, 13, 14, 13, 9, 18, 12, 14, 17, 16, 14, 9, 21, 18, 16, 18, 17, 16, 14, 9, 6, 10, 11, 12, 10, 13, 12, 7, 10, 12, 13, 12, 12, 15, 8, 12, 13, 14, 14, 12, 16, 11, 15, 17, 17, 17, 14, 18, 16, 19, 21, 22, 21, 17, 18, 22, 24, 24, 24, 22, 21, 20, 27, 27, 26, 25, 24, 23, 17, 17, 19, 19, 20, 19, 13, 20, 19, 20, 20, 21, 20, 12, 20, 20, 22, 23, 23, 22, 16, 20, 23, 26, 26, 27, 25, 21, 22, 29, 31, 31, 30, 28, 23, 25, 34, 37, 35, 33, 29, 25, 29, 37, 40, 37, 35, 32, 26, 27, 30, 29, 29, 26, 22, 17, 26, 32, 31, 30, 27, 22, 18, 26, 34, 34, 33, 29, 25, 21, 27, 35, 39, 37, 33, 29, 25, 30, 39, 44, 41, 37, 32, 26, 34, 41, 48, 46, 39, 33, 29, 37, 44, 48, 48, 43, 36, 30, 37, 42, 40, 33, 29, 25, 21, 37, 42, 42, 36, 29, 25, 21, 37, 42, 45, 38, 34, 29, 24, 37, 44, 49, 43, 36, 33, 28, 38, 46, 50, 48, 42, 35, 30, 42, 49, 53, 52, 45, 38, 32, 45, 49, 55, 55, 47, 40, 34, 1, 3, 5, 7, 7, 5, 3, 1, 1, 4, 6, 6, 4, 2, 2, 1, 3, 5, 5, 3, 2, 2, 1, 2, 4, 6, 5, 4, 4, 4, 4, 6, 8, 6, 4, 8, 7, 7, 8, 8, 6, 4, 13, 11, 9, 8, 8, 6, 4, 1, 1, 3, 5, 4, 3, 4, 1, 1, 2, 4, 4, 2, 3, 2, 1, 1, 3, 2, 0, 3, 2, 2, 2, 3, 3, 2, 4, 6, 5, 5, 6, 5, 4, 4, 11, 9, 9, 8, 6, 4, 3, 16, 13, 10, 8, 7, 6, 3, 2, 1, 3, 4, 4, 6, 7, 2, 2, 4, 4, 5, 5, 6, 5, 2, 3, 4, 4, 3, 5, 10, 3, 6, 7, 7, 7, 7, 13, 7, 9, 11, 11, 10, 7, 16, 12, 13, 14, 12, 12, 7, 19, 17, 15, 15, 14, 13, 12, 5, 6, 9, 10, 11, 9, 11, 11, 7, 9, 11, 11, 11, 10, 14, 7, 11, 11, 11, 11, 10, 16, 10, 14, 14, 15, 15, 11, 17, 15, 18, 19, 19, 18, 14, 16, 20, 22, 22, 20, 20, 18, 18, 25, 25, 24, 23, 21, 20, 15, 16, 17, 18, 18, 17, 11, 19, 17, 19, 19, 20, 18, 10, 19, 19, 20, 20, 20, 18, 14, 19, 22, 23, 23, 24, 22, 18, 21, 28, 28, 28, 28, 25, 20, 23, 31, 34, 32, 30, 27, 23, 26, 34, 36, 35, 32, 29, 24, 26, 28, 27, 27, 24, 19, 16, 25, 30, 28, 28, 25, 21, 16, 25, 32, 30, 29, 25, 22, 18, 25, 33, 34, 34, 30, 26, 22, 28, 35, 40, 38, 34, 29, 23, 31, 40, 45, 41, 36, 30, 26, 35, 40, 44, 45, 39, 33, 27, 36, 40, 37, 31, 25, 23, 19, 35, 40, 40, 33, 28, 23, 19, 35, 40, 42, 35, 30, 26, 22, 34, 41, 45, 39, 32, 30, 26, 37, 43, 48, 44, 37, 33, 28, 38, 44, 50, 49, 41, 35, 29, 42, 47, 49, 50, 44, 37, 31, 3, 5, 7, 9, 9, 7, 5, 2, 5, 7, 8, 9, 6, 4, 1, 4, 6, 7, 8, 5, 3, 1, 1, 4, 6, 8, 6, 5, 3, 3, 5, 6, 9, 7, 4, 7, 6, 7, 8, 8, 7, 4, 10, 9, 8, 8, 8, 7, 5, 1, 4, 6, 8, 7, 5, 4, 1, 3, 5, 7, 6, 4, 2, 1, 1, 5, 6, 4, 3, 0, 2, 1, 3, 4, 3, 3, 2, 4, 4, 4, 6, 5, 4, 2, 9, 8, 7, 8, 6, 4, 2, 14, 11, 8, 8, 6, 4, 2, 1, 1, 3, 3, 4, 5, 6, 2, 1, 3, 3, 3, 4, 5, 2, 1, 2, 2, 2, 2, 3, 4, 2, 4, 4, 3, 3, 4, 9, 6, 7, 7, 7, 6, 4, 12, 10, 10, 9, 9, 8, 4, 16, 13, 12, 11, 10, 9, 8, 2, 6, 7, 8, 8, 8, 9, 5, 6, 8, 8, 9, 9, 8, 9, 6, 8, 9, 9, 9, 7, 12, 8, 11, 11, 10, 11, 8, 13, 13, 15, 14, 15, 14, 12, 12, 17, 18, 17, 17, 15, 14, 16, 22, 21, 19, 19, 17, 16, 13, 14, 15, 15, 16, 15, 9, 15, 15, 16, 17, 17, 16, 8, 15, 17, 18, 17, 17, 15, 12, 15, 20, 20, 20, 20, 18, 15, 17, 25, 24, 25, 24, 21, 16, 20, 27, 29, 27, 26, 23, 18, 23, 29, 32, 29, 28, 25, 20, 23, 25, 24, 23, 21, 17, 14, 24, 27, 26, 25, 23, 18, 13, 23, 29, 28, 26, 22, 18, 14, 23, 30, 31, 29, 26, 22, 18, 26, 32, 36, 33, 29, 25, 20, 29, 35, 39, 37, 32, 26, 21, 31, 36, 40, 39, 33, 28, 23, 31, 37, 34, 28, 23, 20, 17, 32, 36, 35, 29, 25, 20, 16, 32, 37, 39, 31, 25, 22, 17, 32, 36, 40, 35, 29, 26, 21, 33, 38, 43, 39, 33, 28, 23, 36, 40, 43, 44, 36, 30, 25, 38, 42, 45, 45, 39, 32, 26, 2, 3, 7, 11, 11, 10, 6, 2, 2, 6, 10, 11, 9, 3, 2, 2, 4, 7, 9, 6, 2, 2, 2, 2, 4, 6, 4, 2, 2, 2, 2, 3, 5, 4, 2, 6, 6, 6, 5, 4, 4, 2, 11, 11, 8, 6, 4, 4, 2, 2, 2, 4, 8, 9, 5, 2, 1, 2, 3, 6, 8, 3, 2, 1, 2, 2, 4, 4, 2, 2, 0, 2, 2, 2, 2, 1, 2, 3, 3, 3, 3, 3, 2, 2, 8, 7, 8, 7, 4, 3, 2, 15, 13, 10, 7, 5, 3, 2, 1, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 2, 0, 2, 1, 1, 1, 1, 1, 2, 5, 4, 4, 4, 4, 3, 2, 11, 10, 9, 8, 6, 3, 2, 17, 16, 12, 9, 6, 5, 3, 1, 1, 1, 1, 1, 2, 6, 1, 2, 3, 3, 3, 3, 6, 3, 3, 3, 4, 4, 4, 6, 6, 6, 6, 6, 7, 7, 8, 6, 10, 10, 10, 10, 10, 9, 11, 15, 15, 14, 12, 11, 10, 17, 21, 18, 16, 15, 13, 12, 9, 9, 9, 10, 10, 9, 6, 11, 11, 11, 11, 11, 10, 6, 11, 12, 12, 12, 13, 11, 7, 11, 16, 15, 15, 15, 14, 10, 14, 20, 19, 19, 20, 18, 12, 17, 23, 25, 23, 22, 20, 14, 21, 27, 28, 26, 24, 22, 16, 18, 19, 19, 20, 16, 12, 7, 18, 22, 21, 21, 18, 13, 9, 18, 23, 23, 23, 19, 15, 10, 18, 24, 27, 25, 22, 18, 14, 20, 27, 30, 27, 26, 21, 16, 23, 28, 34, 31, 28, 24, 18, 27, 31, 35, 34, 30, 25, 20, 26, 32, 29, 24, 20, 15, 10, 26, 31, 32, 26, 21, 16, 11, 26, 32, 33, 28, 23, 18, 14, 25, 31, 36, 29, 26, 22, 18, 26, 31, 37, 34, 29, 25, 20, 30, 34, 38, 36, 30, 26, 22, 31, 36, 37, 37, 32, 29, 24, 2, 3, 4, 4, 4, 4, 3, 2, 3, 4, 4, 4, 3, 3, 1, 2, 3, 4, 4, 3, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 6, 6, 6, 5, 3, 2, 2, 11, 10, 7, 6, 4, 2, 2, 1, 3, 3, 4, 3, 3, 3, 1, 2, 3, 4, 3, 3, 2, 1, 2, 3, 3, 3, 2, 1, 2, 0, 1, 2, 2, 1, 2, 3, 3, 3, 3, 3, 2, 2, 8, 7, 7, 6, 4, 2, 2, 15, 12, 9, 7, 5, 3, 2, 1, 2, 2, 3, 3, 3, 5, 2, 1, 2, 3, 3, 3, 5, 2, 1, 2, 2, 2, 2, 4, 2, 1, 2, 2, 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 11, 10, 10, 9, 7, 6, 5, 17, 15, 12, 10, 9, 7, 6, 2, 4, 5, 5, 6, 6, 9, 2, 5, 6, 7, 7, 7, 8, 6, 6, 7, 7, 7, 8, 9, 9, 8, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 11, 11, 18, 17, 16, 15, 14, 13, 17, 25, 20, 19, 17, 15, 14, 12, 12, 13, 13, 14, 12, 9, 13, 14, 14, 14, 15, 13, 9, 13, 15, 16, 16, 16, 14, 10, 13, 18, 18, 18, 18, 17, 13, 16, 23, 22, 22, 22, 20, 15, 20, 26, 27, 26, 24, 22, 16, 24, 29, 31, 27, 26, 24, 17, 22, 23, 22, 22, 20, 15, 11, 21, 25, 24, 24, 21, 16, 12, 21, 27, 26, 26, 21, 17, 13, 22, 27, 29, 27, 24, 20, 16, 23, 29, 34, 32, 28, 23, 18, 26, 32, 39, 37, 32, 26, 20, 29, 35, 40, 40, 34, 27, 22, 29, 36, 35, 28, 22, 18, 14, 29, 36, 38, 30, 24, 19, 15, 30, 37, 39, 31, 25, 20, 17, 30, 34, 41, 34, 29, 24, 20, 29, 37, 42, 39, 34, 28, 22, 32, 38, 44, 43, 37, 30, 24, 35, 41, 45, 46, 39, 32, 25, 2, 3, 4, 5, 5, 5, 4, 2, 3, 4, 5, 5, 4, 3, 2, 2, 3, 4, 4, 2, 1, 2, 1, 2, 2, 2, 1, 2, 3, 2, 2, 3, 3, 2, 2, 6, 6, 6, 5, 3, 2, 2, 12, 10, 7, 5, 4, 2, 2, 2, 2, 3, 4, 4, 4, 5, 2, 2, 3, 4, 4, 3, 4, 2, 2, 2, 3, 3, 2, 2, 2, 2, 0, 1, 2, 1, 3, 4, 3, 3, 3, 3, 2, 4, 9, 8, 7, 6, 4, 2, 4, 16, 13, 9, 7, 5, 3, 3, 2, 2, 3, 4, 5, 6, 8, 2, 2, 3, 4, 5, 5, 8, 2, 2, 3, 4, 4, 4, 6, 5, 2, 4, 5, 5, 5, 7, 9, 5, 8, 8, 8, 7, 7, 12, 10, 12, 11, 10, 9, 7, 17, 16, 15, 13, 11, 10, 9, 2, 6, 8, 9, 10, 9, 11, 5, 7, 9, 10, 11, 11, 12, 9, 8, 10, 10, 10, 11, 11, 12, 9, 12, 12, 12, 13, 11, 12, 14, 15, 15, 16, 16, 14, 13, 20, 21, 20, 18, 17, 16, 18, 26, 24, 22, 19, 18, 17, 13, 15, 16, 17, 18, 17, 11, 15, 17, 17, 18, 19, 17, 11, 15, 18, 19, 18, 19, 18, 13, 15, 22, 21, 20, 21, 20, 16, 17, 26, 26, 25, 25, 23, 17, 22, 30, 31, 30, 27, 24, 19, 26, 33, 34, 32, 29, 26, 21, 25, 27, 26, 26, 23, 20, 15, 24, 29, 28, 27, 24, 20, 16, 25, 31, 30, 30, 25, 20, 16, 24, 31, 32, 32, 28, 23, 19, 26, 32, 36, 36, 32, 26, 21, 29, 35, 42, 41, 35, 28, 23, 33, 38, 42, 42, 37, 30, 25, 33, 40, 37, 32, 27, 22, 18, 32, 39, 40, 33, 27, 22, 18, 34, 40, 43, 35, 28, 23, 19, 33, 38, 44, 38, 32, 28, 23, 34, 40, 45, 43, 36, 31, 25, 36, 43, 48, 47, 40, 33, 26, 38, 44, 49, 49, 42, 35, 28, 2, 3, 5, 6, 6, 6, 4, 2, 3, 4, 6, 6, 4, 3, 2, 2, 3, 4, 4, 2, 1, 2, 2, 1, 2, 2, 1, 2, 3, 2, 2, 3, 3, 2, 2, 7, 6, 6, 5, 4, 2, 2, 12, 10, 8, 5, 4, 2, 2, 2, 3, 3, 5, 5, 6, 7, 2, 2, 3, 5, 5, 4, 5, 2, 2, 3, 3, 3, 3, 4, 2, 2, 2, 0, 0, 2, 5, 5, 4, 3, 4, 3, 3, 4, 9, 8, 7, 7, 5, 4, 5, 15, 13, 9, 8, 7, 5, 5, 2, 2, 5, 6, 7, 8, 10, 2, 2, 5, 6, 7, 7, 9, 4, 2, 5, 6, 6, 6, 8, 8, 2, 5, 7, 7, 7, 8, 11, 6, 8, 10, 11, 10, 8, 15, 11, 12, 13, 12, 11, 8, 17, 15, 15, 16, 14, 13, 11, 4, 7, 11, 11, 12, 11, 14, 8, 7, 11, 12, 13, 13, 14, 11, 8, 12, 13, 13, 13, 13, 14, 10, 14, 14, 15, 14, 13, 14, 14, 17, 18, 18, 18, 16, 15, 20, 22, 21, 20, 19, 18, 17, 26, 25, 24, 22, 21, 20, 15, 17, 18, 19, 20, 19, 14, 17, 19, 20, 21, 21, 20, 14, 17, 20, 21, 22, 22, 20, 16, 17, 23, 24, 24, 23, 23, 19, 19, 27, 28, 28, 28, 26, 20, 22, 31, 33, 32, 30, 27, 22, 27, 34, 37, 34, 32, 29, 23, 27, 29, 29, 28, 26, 22, 18, 27, 32, 30, 30, 27, 22, 18, 27, 33, 33, 32, 28, 23, 18, 27, 33, 35, 34, 30, 25, 21, 28, 36, 40, 38, 35, 29, 24, 31, 38, 45, 43, 36, 30, 26, 34, 40, 45, 46, 39, 34, 27, 37, 42, 41, 35, 29, 25, 20, 36, 42, 43, 37, 30, 25, 21, 36, 43, 45, 38, 31, 26, 22, 37, 42, 48, 41, 35, 30, 25, 37, 43, 49, 46, 39, 33, 28, 38, 46, 51, 50, 42, 35, 30, 41, 47, 52, 53, 45, 38, 32, 2, 3, 6, 9, 9, 7, 5, 2, 3, 5, 8, 9, 6, 3, 2, 2, 3, 6, 7, 4, 1, 2, 1, 1, 3, 5, 3, 2, 3, 2, 2, 3, 5, 3, 2, 6, 6, 6, 5, 5, 4, 2, 11, 9, 7, 5, 5, 3, 2, 2, 2, 3, 7, 6, 6, 7, 2, 2, 3, 5, 6, 5, 5, 2, 2, 3, 3, 3, 3, 4, 2, 2, 2, 0, 0, 1, 4, 5, 3, 3, 3, 3, 2, 4, 9, 7, 7, 6, 5, 4, 4, 14, 11, 8, 7, 6, 5, 4, 1, 2, 5, 6, 7, 8, 9, 2, 2, 5, 6, 7, 7, 8, 5, 2, 4, 6, 6, 5, 7, 8, 2, 5, 7, 7, 7, 7, 12, 5, 8, 10, 11, 10, 7, 15, 11, 11, 13, 12, 11, 7, 16, 14, 13, 14, 14, 13, 11, 5, 6, 10, 11, 12, 11, 13, 9, 7, 11, 12, 13, 13, 12, 11, 7, 11, 12, 13, 13, 11, 14, 9, 13, 14, 14, 14, 12, 15, 14, 17, 19, 19, 18, 15, 14, 18, 21, 22, 21, 19, 18, 16, 23, 23, 22, 22, 21, 20, 15, 16, 18, 19, 20, 19, 14, 18, 18, 20, 21, 21, 20, 13, 18, 19, 21, 22, 21, 19, 15, 17, 22, 24, 24, 23, 22, 18, 19, 26, 28, 27, 28, 25, 20, 21, 30, 32, 31, 30, 27, 22, 24, 34, 36, 34, 32, 29, 23, 26, 29, 29, 29, 26, 22, 17, 26, 31, 31, 30, 27, 22, 17, 26, 33, 33, 32, 27, 22, 18, 26, 33, 35, 34, 30, 25, 21, 28, 35, 39, 38, 35, 29, 24, 31, 37, 44, 42, 37, 31, 25, 34, 38, 44, 45, 39, 34, 27, 36, 42, 41, 33, 29, 25, 20, 37, 43, 43, 36, 30, 25, 21, 36, 42, 45, 38, 31, 26, 22, 36, 42, 46, 41, 34, 29, 25, 37, 43, 48, 45, 39, 33, 27, 38, 46, 51, 50, 42, 35, 29, 40, 47, 51, 51, 43, 36, 31, 3, 4, 6, 8, 8, 6, 4, 3, 3, 5, 7, 7, 5, 3, 2, 3, 4, 6, 6, 4, 2, 1, 1, 2, 4, 5, 3, 2, 2, 2, 2, 4, 6, 4, 2, 6, 5, 5, 5, 6, 4, 2, 9, 7, 5, 5, 6, 4, 2, 2, 3, 4, 6, 5, 6, 6, 2, 3, 4, 5, 5, 4, 4, 1, 2, 3, 4, 3, 2, 3, 1, 1, 1, 2, 1, 0, 3, 4, 3, 3, 3, 3, 2, 3, 8, 6, 5, 5, 3, 2, 2, 11, 8, 6, 5, 5, 4, 3, 1, 2, 5, 5, 6, 8, 9, 2, 2, 5, 6, 6, 6, 7, 3, 1, 5, 5, 5, 5, 6, 8, 1, 4, 5, 5, 5, 5, 11, 5, 7, 9, 9, 8, 5, 12, 9, 9, 11, 10, 9, 5, 13, 11, 10, 12, 11, 11, 10, 3, 6, 10, 11, 11, 11, 12, 8, 7, 11, 12, 12, 12, 11, 11, 7, 11, 12, 12, 12, 10, 14, 8, 12, 13, 13, 13, 10, 15, 13, 15, 17, 17, 16, 13, 12, 16, 18, 19, 18, 18, 16, 13, 19, 21, 20, 19, 19, 18, 14, 16, 18, 19, 20, 19, 13, 17, 18, 19, 20, 20, 19, 12, 17, 18, 21, 20, 20, 19, 15, 17, 21, 22, 22, 23, 21, 17, 19, 26, 26, 26, 25, 24, 18, 20, 28, 30, 29, 27, 25, 20, 21, 29, 32, 30, 29, 27, 21, 25, 28, 28, 28, 24, 21, 17, 26, 30, 29, 29, 26, 21, 17, 26, 32, 31, 29, 26, 21, 18, 25, 32, 34, 31, 27, 24, 20, 28, 33, 38, 35, 31, 27, 22, 29, 35, 41, 39, 33, 28, 24, 30, 36, 42, 40, 36, 31, 26, 35, 40, 39, 32, 27, 23, 19, 35, 40, 41, 34, 29, 24, 20, 36, 41, 43, 35, 29, 25, 20, 36, 39, 43, 38, 33, 28, 23, 35, 42, 45, 42, 36, 30, 26, 38, 43, 47, 45, 39, 32, 27, 38, 43, 47, 47, 41, 33, 29, 4, 7, 8, 11, 10, 9, 6, 4, 6, 8, 10, 10, 7, 5, 3, 5, 7, 8, 9, 6, 3, 3, 3, 5, 7, 8, 5, 3, 1, 0, 3, 5, 7, 5, 3, 2, 2, 4, 5, 7, 5, 3, 4, 3, 3, 4, 6, 5, 3, 4, 5, 7, 9, 8, 6, 7, 3, 4, 6, 8, 7, 5, 4, 2, 3, 5, 7, 5, 3, 2, 2, 2, 3, 5, 4, 3, 0, 1, 1, 2, 4, 3, 2, 0, 4, 3, 3, 4, 2, 2, 0, 7, 4, 3, 3, 3, 1, 0, 3, 4, 4, 5, 7, 8, 8, 2, 3, 5, 6, 6, 6, 6, 2, 3, 5, 4, 4, 4, 5, 3, 2, 3, 3, 2, 3, 3, 6, 2, 4, 4, 4, 4, 3, 7, 4, 5, 5, 5, 5, 3, 8, 6, 6, 7, 6, 6, 6, 2, 7, 8, 8, 9, 10, 11, 3, 7, 9, 9, 10, 10, 9, 8, 7, 9, 9, 10, 10, 8, 11, 7, 10, 10, 10, 10, 7, 10, 9, 11, 11, 12, 11, 11, 7, 11, 13, 13, 13, 13, 12, 8, 14, 15, 15, 14, 14, 14, 12, 15, 15, 16, 17, 16, 11, 14, 16, 17, 18, 17, 15, 9, 14, 18, 18, 18, 18, 16, 12, 14, 20, 19, 18, 18, 17, 13, 14, 21, 22, 21, 20, 18, 14, 14, 22, 24, 23, 22, 20, 15, 16, 22, 27, 25, 23, 21, 17, 24, 27, 24, 24, 22, 18, 14, 24, 28, 27, 26, 23, 18, 14, 24, 29, 29, 26, 22, 19, 15, 24, 30, 30, 27, 24, 20, 15, 23, 30, 32, 30, 25, 21, 17, 24, 30, 36, 33, 27, 23, 19, 25, 30, 35, 34, 30, 25, 20, 32, 37, 34, 29, 24, 20, 17, 33, 37, 37, 30, 26, 21, 16, 32, 38, 39, 32, 26, 22, 17, 32, 37, 40, 33, 27, 23, 19, 31, 37, 40, 36, 30, 24, 20, 31, 37, 41, 38, 32, 27, 21, 33, 36, 42, 40, 34, 28, 23, 5, 7, 10, 14, 14, 11, 8, 5, 6, 9, 13, 14, 11, 8, 4, 6, 8, 11, 13, 10, 6, 4, 4, 5, 8, 11, 8, 2, 2, 2, 2, 4, 6, 6, 2, 3, 3, 3, 3, 5, 6, 2, 9, 8, 5, 3, 4, 6, 2, 4, 6, 8, 11, 11, 8, 6, 4, 5, 7, 9, 10, 7, 5, 3, 5, 6, 8, 8, 6, 4, 3, 3, 4, 5, 5, 4, 1, 0, 2, 2, 2, 2, 2, 1, 5, 5, 5, 4, 2, 2, 1, 12, 10, 7, 5, 2, 2, 1, 4, 5, 5, 6, 7, 6, 5, 3, 4, 5, 5, 5, 5, 5, 2, 4, 4, 4, 4, 4, 4, 2, 2, 2, 3, 3, 3, 1, 2, 2, 2, 2, 2, 1, 1, 8, 7, 7, 5, 3, 1, 1, 14, 14, 9, 6, 4, 1, 1, 2, 4, 4, 5, 5, 6, 6, 2, 3, 5, 5, 5, 5, 6, 2, 3, 4, 5, 5, 5, 6, 3, 4, 4, 4, 5, 5, 6, 3, 7, 7, 7, 7, 7, 6, 8, 13, 12, 11, 9, 8, 8, 14, 18, 15, 13, 11, 10, 9, 9, 9, 10, 10, 11, 9, 6, 10, 11, 11, 11, 12, 10, 6, 10, 12, 12, 12, 13, 12, 7, 10, 14, 13, 13, 14, 12, 8, 11, 17, 17, 16, 16, 15, 9, 14, 19, 21, 20, 19, 16, 11, 18, 22, 24, 21, 20, 19, 13, 17, 20, 20, 20, 17, 12, 8, 18, 22, 21, 21, 18, 13, 9, 17, 23, 23, 22, 19, 15, 10, 18, 22, 24, 23, 20, 16, 11, 17, 23, 26, 24, 22, 19, 13, 19, 25, 28, 27, 23, 20, 15, 22, 26, 29, 27, 24, 21, 17, 25, 30, 28, 25, 20, 15, 11, 26, 30, 31, 26, 22, 16, 12, 26, 31, 33, 27, 22, 18, 13, 26, 30, 33, 27, 23, 19, 15, 24, 29, 32, 29, 24, 21, 17, 25, 28, 32, 31, 26, 22, 19, 27, 30, 32, 32, 28, 23, 20, 5, 6, 7, 8, 8, 7, 7, 5, 6, 7, 8, 8, 7, 6, 4, 5, 6, 7, 7, 5, 4, 3, 4, 5, 5, 5, 3, 2, 1, 2, 2, 2, 3, 2, 1, 3, 3, 3, 2, 3, 2, 1, 9, 7, 5, 3, 2, 2, 2, 4, 5, 7, 7, 7, 7, 7, 4, 5, 6, 7, 7, 6, 5, 3, 4, 6, 6, 6, 5, 4, 3, 3, 3, 4, 3, 3, 1, 2, 0, 2, 2, 2, 1, 1, 5, 4, 4, 3, 1, 2, 1, 12, 9, 6, 4, 2, 1, 1, 3, 5, 5, 6, 7, 7, 8, 3, 4, 5, 6, 6, 6, 7, 2, 3, 4, 5, 5, 5, 5, 3, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 8, 7, 6, 5, 4, 3, 3, 14, 12, 9, 7, 5, 4, 4, 3, 5, 6, 7, 8, 9, 10, 2, 5, 6, 7, 8, 8, 9, 3, 6, 6, 6, 7, 7, 8, 6, 6, 7, 7, 7, 8, 8, 6, 10, 9, 10, 10, 9, 9, 8, 15, 14, 13, 12, 10, 10, 14, 21, 18, 15, 13, 12, 11, 11, 12, 12, 13, 14, 13, 10, 12, 14, 14, 14, 15, 14, 9, 12, 15, 15, 15, 15, 14, 9, 13, 17, 16, 15, 16, 15, 11, 13, 20, 19, 19, 19, 17, 12, 17, 22, 24, 23, 20, 18, 13, 21, 26, 28, 25, 23, 21, 15, 21, 22, 21, 23, 20, 16, 11, 21, 24, 24, 24, 21, 16, 12, 21, 26, 27, 25, 22, 17, 12, 21, 26, 27, 26, 22, 17, 13, 20, 26, 29, 29, 25, 20, 15, 22, 28, 35, 34, 28, 22, 17, 25, 33, 36, 36, 31, 25, 18, 29, 36, 35, 28, 22, 19, 14, 29, 35, 37, 29, 24, 19, 15, 30, 36, 39, 30, 25, 20, 15, 29, 35, 39, 32, 26, 21, 17, 28, 34, 38, 36, 31, 24, 19, 29, 35, 41, 40, 32, 27, 21, 32, 37, 43, 41, 35, 28, 23, 5, 7, 8, 9, 9, 9, 8, 5, 6, 7, 9, 9, 7, 6, 4, 5, 7, 7, 7, 5, 4, 4, 4, 4, 5, 5, 3, 1, 2, 1, 2, 2, 2, 2, 1, 3, 3, 3, 2, 2, 2, 1, 8, 7, 4, 2, 2, 2, 1, 4, 5, 7, 8, 8, 8, 8, 4, 5, 7, 8, 8, 7, 7, 4, 5, 6, 6, 6, 5, 4, 3, 3, 3, 4, 3, 3, 2, 2, 2, 0, 1, 1, 1, 2, 5, 4, 4, 3, 1, 1, 2, 12, 9, 6, 3, 2, 1, 2, 4, 5, 6, 7, 8, 10, 10, 3, 4, 6, 7, 8, 8, 9, 3, 4, 6, 6, 6, 6, 7, 3, 3, 4, 4, 4, 5, 6, 5, 2, 4, 5, 5, 4, 5, 9, 7, 9, 8, 6, 5, 6, 14, 12, 11, 9, 8, 7, 7, 3, 7, 8, 9, 10, 12, 12, 3, 7, 9, 10, 10, 10, 11, 7, 8, 9, 10, 10, 10, 11, 10, 7, 10, 10, 10, 10, 10, 9, 11, 12, 12, 12, 12, 11, 9, 16, 17, 15, 14, 13, 13, 14, 22, 20, 18, 16, 15, 14, 13, 15, 15, 16, 17, 16, 12, 14, 16, 17, 17, 18, 16, 11, 14, 18, 19, 18, 17, 17, 13, 14, 19, 19, 19, 19, 17, 13, 14, 23, 21, 21, 20, 19, 14, 18, 25, 27, 25, 23, 21, 16, 23, 28, 31, 28, 25, 23, 18, 24, 25, 26, 26, 22, 18, 14, 23, 29, 26, 28, 24, 19, 15, 24, 29, 30, 28, 24, 20, 15, 24, 29, 30, 30, 26, 20, 16, 23, 29, 33, 32, 28, 23, 17, 26, 31, 38, 37, 30, 24, 19, 28, 34, 39, 38, 33, 26, 21, 33, 39, 38, 31, 26, 20, 17, 33, 39, 41, 32, 27, 22, 17, 33, 40, 42, 34, 27, 23, 18, 33, 38, 43, 36, 29, 24, 19, 31, 37, 42, 39, 33, 28, 21, 32, 37, 44, 44, 35, 29, 23, 34, 41, 45, 45, 38, 32, 25, 5, 6, 9, 10, 10, 9, 8, 5, 6, 8, 9, 9, 8, 6, 4, 5, 7, 8, 7, 6, 4, 4, 4, 4, 5, 6, 4, 2, 2, 2, 2, 2, 3, 2, 1, 3, 3, 3, 2, 2, 2, 1, 8, 7, 4, 2, 2, 2, 1, 4, 6, 7, 9, 9, 9, 10, 4, 5, 6, 8, 9, 8, 8, 4, 5, 6, 6, 6, 6, 6, 3, 3, 3, 4, 3, 3, 3, 2, 2, 2, 0, 0, 1, 4, 6, 5, 4, 3, 2, 2, 4, 11, 8, 6, 4, 3, 2, 4, 4, 5, 7, 9, 10, 11, 12, 3, 4, 8, 9, 9, 10, 10, 3, 4, 7, 8, 8, 8, 8, 6, 3, 5, 6, 6, 6, 7, 8, 3, 5, 7, 7, 6, 7, 11, 7, 9, 10, 8, 8, 7, 13, 11, 11, 12, 10, 9, 9, 3, 8, 10, 11, 12, 13, 14, 6, 8, 11, 12, 13, 13, 13, 9, 8, 11, 12, 13, 12, 13, 12, 8, 12, 12, 13, 13, 11, 11, 11, 14, 14, 15, 14, 14, 11, 16, 18, 18, 16, 16, 16, 13, 20, 21, 20, 18, 17, 17, 13, 17, 18, 19, 19, 19, 15, 16, 18, 19, 20, 21, 19, 13, 15, 19, 21, 21, 21, 19, 15, 16, 21, 22, 21, 22, 20, 15, 15, 24, 25, 24, 24, 22, 17, 19, 27, 29, 28, 26, 23, 18, 22, 28, 32, 30, 29, 25, 20, 26, 29, 28, 28, 26, 22, 17, 27, 31, 31, 30, 26, 22, 17, 26, 34, 33, 32, 27, 22, 18, 26, 33, 34, 32, 27, 23, 18, 25, 32, 36, 35, 31, 25, 20, 27, 35, 40, 39, 33, 28, 22, 30, 36, 41, 42, 35, 30, 24, 37, 42, 40, 34, 28, 24, 20, 36, 43, 43, 35, 30, 23, 20, 36, 42, 45, 37, 31, 24, 20, 36, 41, 46, 39, 32, 26, 22, 35, 40, 45, 42, 34, 30, 24, 35, 42, 47, 46, 38, 32, 25, 38, 43, 48, 48, 41, 34, 27, 5, 6, 9, 12, 13, 10, 8, 5, 6, 8, 12, 12, 9, 6, 4, 5, 7, 9, 10, 7, 3, 4, 4, 4, 6, 8, 5, 2, 2, 1, 1, 3, 6, 4, 1, 3, 2, 2, 2, 4, 4, 1, 5, 3, 2, 2, 3, 4, 1, 4, 5, 7, 10, 10, 9, 9, 4, 5, 6, 9, 9, 7, 7, 3, 4, 5, 7, 6, 5, 5, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 0, 0, 1, 3, 4, 3, 2, 2, 2, 1, 3, 7, 4, 3, 2, 3, 2, 3, 4, 5, 7, 8, 10, 11, 11, 3, 4, 7, 9, 9, 9, 9, 3, 4, 7, 7, 7, 7, 8, 7, 2, 4, 6, 6, 6, 6, 9, 2, 5, 7, 7, 7, 6, 9, 4, 6, 9, 9, 8, 6, 9, 7, 7, 10, 9, 9, 9, 3, 7, 11, 11, 12, 13, 14, 8, 7, 11, 12, 13, 13, 13, 11, 8, 12, 12, 13, 12, 12, 12, 7, 12, 13, 13, 13, 11, 12, 10, 14, 14, 15, 15, 14, 10, 12, 15, 16, 16, 16, 15, 9, 15, 18, 18, 17, 17, 17, 14, 17, 18, 19, 20, 20, 14, 16, 18, 20, 20, 21, 19, 13, 16, 19, 21, 21, 21, 19, 15, 16, 21, 21, 22, 22, 20, 16, 15, 24, 24, 24, 24, 22, 17, 16, 24, 28, 27, 26, 23, 18, 18, 27, 30, 28, 27, 25, 20, 27, 30, 28, 28, 25, 22, 18, 26, 31, 30, 31, 27, 22, 17, 26, 34, 33, 31, 26, 22, 18, 26, 32, 34, 32, 28, 23, 18, 25, 32, 37, 35, 31, 26, 20, 26, 33, 39, 38, 32, 28, 22, 27, 34, 40, 40, 35, 29, 24, 37, 43, 40, 34, 30, 24, 21, 37, 42, 43, 36, 30, 25, 20, 37, 42, 45, 36, 30, 26, 21, 36, 41, 46, 38, 31, 27, 22, 35, 41, 44, 40, 34, 28, 24, 36, 42, 46, 45, 38, 31, 26, 35, 41, 46, 45, 40, 33, 28, 4, 5, 6, 8, 8, 7, 6, 4, 4, 5, 8, 8, 5, 4, 3, 4, 5, 6, 6, 4, 2, 3, 3, 3, 4, 6, 3, 1, 2, 1, 0, 2, 5, 3, 1, 2, 2, 2, 3, 4, 3, 1, 4, 3, 2, 3, 3, 3, 1, 4, 4, 5, 6, 6, 7, 8, 3, 4, 5, 6, 6, 6, 6, 3, 4, 4, 4, 3, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 3, 2, 2, 2, 1, 1, 2, 7, 4, 2, 2, 3, 2, 2, 3, 4, 6, 7, 8, 9, 10, 2, 3, 6, 7, 7, 8, 9, 3, 3, 6, 6, 6, 6, 7, 7, 2, 4, 6, 6, 5, 5, 9, 2, 4, 6, 7, 7, 5, 10, 4, 5, 7, 8, 8, 5, 9, 7, 6, 8, 9, 9, 9, 3, 7, 10, 11, 12, 12, 13, 8, 7, 11, 12, 13, 12, 12, 12, 8, 12, 12, 12, 12, 11, 14, 7, 11, 13, 13, 13, 10, 14, 10, 12, 14, 14, 14, 13, 11, 12, 14, 15, 16, 16, 15, 9, 15, 16, 17, 17, 17, 17, 14, 17, 19, 19, 20, 19, 13, 17, 18, 19, 20, 20, 19, 12, 17, 19, 20, 21, 20, 19, 15, 17, 21, 21, 21, 22, 20, 15, 16, 22, 24, 24, 23, 22, 17, 15, 23, 26, 26, 24, 22, 18, 16, 24, 28, 27, 26, 24, 20, 26, 29, 28, 28, 25, 21, 17, 26, 31, 30, 30, 26, 22, 17, 26, 33, 32, 31, 26, 22, 17, 26, 32, 33, 32, 27, 23, 18, 25, 32, 35, 33, 30, 25, 20, 26, 33, 38, 36, 30, 26, 21, 26, 33, 38, 39, 33, 27, 23, 36, 41, 38, 32, 27, 24, 20, 35, 41, 42, 34, 29, 25, 20, 35, 41, 44, 36, 30, 25, 20, 35, 40, 45, 37, 31, 26, 22, 35, 40, 44, 40, 33, 27, 23, 34, 40, 44, 43, 36, 30, 25, 35, 40, 45, 45, 37, 31, 25, 4, 6, 9, 11, 10, 9, 6, 4, 6, 8, 10, 10, 7, 4, 3, 5, 7, 8, 9, 6, 4, 3, 3, 5, 7, 8, 5, 3, 1, 0, 3, 5, 7, 5, 3, 2, 2, 4, 5, 7, 5, 3, 4, 3, 3, 4, 6, 5, 3, 4, 5, 7, 9, 8, 7, 6, 3, 4, 6, 8, 7, 5, 4, 3, 4, 5, 6, 5, 3, 2, 2, 2, 4, 5, 4, 3, 0, 1, 1, 2, 3, 3, 2, 0, 3, 2, 3, 4, 2, 2, 0, 6, 4, 3, 3, 2, 1, 0, 3, 4, 4, 5, 7, 8, 8, 2, 3, 5, 6, 6, 6, 6, 2, 3, 5, 4, 4, 4, 5, 3, 2, 3, 3, 3, 3, 3, 6, 2, 4, 4, 4, 4, 3, 7, 4, 5, 5, 5, 5, 3, 9, 7, 6, 6, 6, 6, 6, 2, 7, 8, 9, 9, 10, 11, 3, 7, 9, 9, 10, 10, 9, 8, 7, 9, 9, 10, 9, 8, 11, 7, 10, 10, 9, 10, 7, 10, 9, 11, 11, 12, 11, 10, 8, 11, 13, 13, 13, 13, 12, 8, 14, 15, 15, 14, 14, 13, 13, 15, 16, 16, 16, 16, 11, 14, 17, 17, 17, 18, 16, 10, 14, 18, 18, 18, 18, 16, 12, 14, 20, 19, 18, 18, 17, 13, 14, 21, 21, 20, 20, 18, 14, 15, 22, 24, 23, 21, 19, 15, 16, 23, 26, 24, 24, 20, 17, 24, 25, 24, 24, 21, 18, 14, 24, 28, 27, 25, 22, 18, 14, 24, 30, 29, 27, 22, 19, 15, 23, 29, 30, 27, 23, 20, 15, 23, 29, 32, 30, 26, 22, 17, 24, 30, 36, 33, 28, 23, 18, 25, 30, 35, 35, 29, 25, 20, 32, 37, 34, 29, 23, 20, 17, 32, 37, 36, 30, 25, 21, 17, 33, 37, 39, 31, 26, 22, 17, 32, 37, 40, 33, 27, 23, 18, 31, 38, 39, 36, 29, 25, 20, 31, 36, 40, 39, 32, 26, 20, 32, 36, 41, 40, 34, 28, 23, 10, 12, 14, 17, 18, 16, 13, 10, 11, 13, 17, 17, 14, 12, 9, 11, 12, 14, 15, 12, 10, 9, 9, 10, 11, 14, 9, 4, 6, 7, 7, 8, 8, 7, 4, 2, 2, 3, 3, 6, 7, 4, 5, 4, 2, 3, 5, 8, 4, 9, 11, 12, 15, 15, 14, 12, 9, 10, 12, 14, 14, 12, 11, 8, 10, 11, 12, 12, 11, 9, 8, 8, 9, 9, 9, 8, 3, 5, 5, 5, 5, 4, 4, 3, 0, 2, 2, 2, 3, 3, 3, 8, 6, 3, 2, 2, 3, 3, 8, 10, 11, 11, 13, 13, 12, 8, 9, 11, 11, 12, 12, 11, 7, 8, 10, 10, 10, 10, 9, 7, 7, 7, 7, 8, 7, 4, 3, 3, 4, 4, 3, 3, 3, 3, 2, 2, 1, 2, 2, 3, 9, 9, 5, 2, 1, 3, 3, 7, 9, 10, 11, 12, 13, 13, 7, 8, 10, 11, 12, 12, 12, 6, 8, 9, 10, 10, 10, 10, 4, 7, 7, 7, 7, 7, 5, 2, 3, 4, 4, 4, 4, 5, 3, 8, 7, 7, 6, 6, 6, 9, 13, 11, 9, 7, 7, 8, 7, 8, 9, 11, 12, 13, 13, 8, 9, 9, 10, 11, 11, 12, 8, 10, 11, 11, 11, 9, 9, 9, 12, 12, 11, 12, 11, 6, 8, 13, 13, 14, 14, 13, 8, 9, 15, 16, 15, 15, 15, 10, 13, 17, 18, 16, 16, 16, 12, 16, 18, 19, 19, 15, 12, 13, 16, 20, 20, 20, 16, 12, 11, 16, 22, 22, 21, 18, 12, 9, 16, 21, 21, 21, 19, 14, 10, 15, 21, 22, 21, 18, 16, 12, 16, 20, 22, 21, 19, 16, 13, 17, 21, 23, 22, 20, 17, 15, 24, 28, 27, 23, 18, 14, 12, 24, 28, 28, 24, 20, 15, 10, 24, 28, 30, 23, 21, 16, 11, 24, 27, 29, 25, 20, 18, 13, 22, 26, 28, 25, 20, 18, 15, 22, 25, 27, 26, 20, 18, 16, 22, 24, 27, 28, 22, 19, 16, 9, 11, 12, 13, 13, 13, 12, 9, 10, 12, 13, 13, 11, 10, 8, 10, 11, 11, 11, 10, 8, 8, 8, 9, 9, 9, 6, 3, 5, 6, 6, 6, 4, 3, 2, 2, 2, 2, 2, 3, 3, 3, 4, 3, 2, 2, 3, 3, 3, 8, 10, 11, 12, 13, 13, 12, 8, 9, 10, 12, 12, 11, 10, 7, 9, 10, 10, 10, 9, 7, 7, 7, 7, 8, 7, 6, 2, 5, 4, 4, 5, 3, 2, 2, 2, 0, 1, 2, 2, 2, 2, 7, 5, 2, 2, 2, 2, 2, 8, 9, 10, 11, 12, 13, 13, 7, 8, 10, 11, 11, 11, 11, 7, 8, 9, 9, 9, 9, 8, 7, 7, 6, 6, 7, 6, 4, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 9, 8, 5, 3, 3, 3, 4, 7, 9, 10, 11, 13, 14, 14, 7, 9, 10, 11, 12, 12, 12, 5, 9, 10, 10, 10, 10, 9, 6, 8, 7, 7, 8, 7, 7, 4, 6, 7, 7, 7, 7, 8, 3, 10, 10, 9, 9, 9, 9, 9, 16, 13, 11, 10, 10, 11, 10, 11, 11, 12, 13, 14, 14, 10, 12, 13, 13, 14, 12, 12, 11, 14, 14, 14, 14, 12, 9, 11, 15, 15, 15, 15, 13, 9, 10, 17, 16, 16, 17, 15, 11, 12, 18, 20, 18, 18, 16, 12, 16, 21, 23, 20, 20, 18, 14, 19, 21, 21, 21, 18, 15, 14, 20, 23, 23, 23, 19, 15, 12, 19, 25, 25, 24, 20, 15, 11, 19, 25, 26, 25, 21, 17, 12, 18, 23, 29, 27, 23, 18, 14, 19, 25, 31, 30, 25, 20, 15, 21, 27, 32, 32, 27, 22, 17, 29, 34, 33, 27, 21, 17, 14, 28, 34, 36, 29, 23, 18, 13, 28, 34, 39, 30, 24, 19, 14, 28, 34, 38, 30, 25, 20, 15, 27, 33, 39, 35, 28, 22, 17, 26, 32, 37, 37, 29, 24, 18, 27, 33, 36, 37, 32, 26, 20, 9, 11, 12, 13, 13, 13, 12, 9, 10, 11, 13, 13, 11, 10, 8, 9, 11, 11, 10, 9, 7, 8, 8, 8, 9, 8, 6, 2, 6, 5, 5, 5, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 2, 2, 2, 2, 8, 10, 11, 12, 13, 13, 13, 8, 9, 10, 12, 12, 11, 10, 8, 8, 10, 10, 9, 9, 7, 8, 7, 7, 7, 7, 5, 3, 5, 4, 4, 4, 2, 2, 2, 2, 1, 0, 2, 2, 2, 2, 6, 4, 2, 1, 2, 2, 3, 8, 9, 10, 11, 13, 14, 15, 8, 8, 10, 12, 12, 12, 12, 7, 8, 10, 10, 10, 10, 9, 6, 7, 8, 8, 8, 6, 5, 4, 3, 5, 5, 4, 4, 5, 5, 3, 5, 4, 4, 4, 5, 7, 6, 7, 6, 5, 5, 5, 8, 11, 12, 13, 14, 16, 15, 6, 10, 12, 13, 14, 14, 13, 6, 10, 12, 11, 11, 11, 10, 9, 9, 9, 9, 9, 9, 9, 7, 7, 9, 10, 10, 10, 11, 5, 12, 12, 12, 12, 12, 12, 7, 15, 15, 14, 13, 13, 13, 11, 14, 15, 15, 16, 16, 16, 13, 15, 16, 16, 16, 15, 13, 12, 16, 17, 17, 17, 15, 12, 13, 18, 18, 18, 18, 17, 13, 12, 19, 19, 19, 19, 18, 13, 13, 22, 23, 22, 20, 19, 15, 17, 22, 26, 24, 22, 21, 16, 22, 24, 25, 24, 22, 18, 16, 22, 26, 26, 27, 23, 18, 13, 22, 29, 28, 27, 23, 18, 14, 22, 27, 28, 28, 24, 19, 15, 22, 28, 31, 31, 26, 21, 16, 22, 28, 34, 32, 27, 22, 18, 24, 29, 35, 36, 30, 24, 20, 32, 38, 37, 29, 24, 21, 16, 31, 38, 38, 32, 26, 21, 16, 31, 37, 41, 32, 27, 21, 17, 31, 37, 42, 34, 28, 23, 18, 30, 35, 42, 38, 30, 24, 19, 29, 35, 41, 40, 33, 26, 21, 30, 36, 40, 41, 34, 28, 22, 8, 9, 11, 12, 13, 12, 11, 8, 9, 11, 12, 12, 11, 9, 7, 8, 10, 10, 10, 8, 6, 7, 7, 7, 8, 8, 5, 2, 5, 4, 4, 5, 3, 2, 2, 2, 2, 1, 2, 2, 2, 2, 3, 2, 1, 1, 2, 2, 2, 8, 8, 10, 12, 12, 12, 13, 7, 8, 9, 11, 12, 10, 10, 7, 8, 9, 10, 9, 8, 8, 6, 6, 6, 7, 6, 5, 4, 4, 3, 3, 3, 2, 2, 4, 2, 2, 2, 0, 1, 2, 4, 5, 3, 2, 1, 2, 3, 4, 7, 8, 10, 11, 13, 14, 15, 6, 7, 10, 12, 12, 13, 12, 6, 7, 10, 10, 10, 10, 10, 5, 6, 7, 8, 8, 7, 6, 6, 2, 4, 5, 5, 6, 6, 7, 2, 5, 6, 6, 7, 6, 6, 5, 6, 8, 7, 8, 8, 6, 10, 12, 13, 14, 16, 15, 5, 10, 12, 13, 14, 14, 13, 8, 10, 12, 12, 12, 12, 11, 11, 8, 11, 11, 11, 12, 11, 10, 8, 12, 12, 12, 13, 13, 8, 11, 14, 14, 14, 14, 14, 6, 14, 15, 16, 15, 15, 16, 13, 16, 17, 18, 19, 18, 15, 15, 18, 19, 19, 19, 18, 13, 15, 18, 20, 19, 20, 18, 14, 14, 20, 21, 20, 21, 20, 15, 14, 21, 22, 22, 22, 20, 16, 14, 23, 25, 24, 24, 22, 17, 16, 23, 27, 26, 25, 23, 19, 25, 27, 27, 27, 24, 21, 17, 25, 31, 29, 30, 25, 20, 16, 25, 31, 31, 30, 26, 21, 16, 25, 31, 32, 31, 27, 22, 18, 23, 31, 34, 33, 29, 24, 18, 24, 31, 36, 34, 31, 25, 20, 26, 32, 37, 38, 33, 27, 22, 35, 40, 40, 33, 27, 23, 19, 35, 41, 42, 34, 29, 24, 19, 35, 40, 44, 36, 30, 25, 19, 35, 41, 45, 37, 31, 26, 20, 33, 39, 44, 40, 33, 27, 23, 33, 39, 45, 42, 35, 30, 23, 33, 39, 44, 44, 38, 30, 25, 6, 8, 11, 14, 14, 12, 9, 6, 7, 10, 13, 13, 11, 7, 5, 6, 9, 11, 12, 9, 5, 5, 5, 6, 8, 10, 7, 2, 2, 2, 2, 5, 7, 5, 2, 2, 1, 1, 2, 5, 5, 2, 3, 2, 2, 2, 4, 5, 2, 5, 6, 8, 11, 11, 10, 10, 5, 6, 7, 10, 11, 8, 8, 4, 5, 6, 8, 8, 6, 6, 4, 4, 4, 5, 5, 3, 2, 2, 1, 1, 2, 2, 1, 2, 3, 2, 2, 1, 0, 1, 2, 6, 3, 2, 2, 1, 1, 2, 5, 6, 8, 9, 10, 11, 12, 4, 5, 8, 9, 10, 10, 9, 3, 5, 8, 8, 8, 8, 7, 5, 3, 5, 5, 5, 5, 5, 8, 2, 4, 5, 6, 6, 5, 9, 3, 5, 7, 7, 7, 5, 8, 6, 6, 8, 8, 8, 8, 3, 8, 10, 10, 11, 13, 14, 6, 8, 10, 11, 12, 12, 13, 10, 8, 11, 12, 12, 12, 11, 12, 7, 11, 12, 11, 12, 10, 12, 8, 12, 13, 13, 13, 13, 9, 11, 13, 14, 14, 14, 15, 8, 14, 16, 16, 15, 15, 16, 13, 16, 17, 18, 20, 18, 14, 15, 17, 19, 19, 20, 19, 12, 15, 19, 20, 20, 20, 19, 14, 15, 20, 20, 21, 21, 19, 14, 14, 21, 22, 22, 22, 20, 16, 14, 23, 25, 24, 23, 22, 17, 16, 24, 28, 26, 27, 24, 19, 26, 29, 27, 28, 24, 21, 16, 25, 30, 29, 29, 26, 21, 17, 25, 33, 33, 31, 26, 22, 17, 25, 32, 33, 31, 27, 23, 17, 25, 31, 35, 33, 28, 24, 18, 25, 32, 36, 36, 30, 24, 20, 26, 32, 38, 39, 33, 27, 22, 35, 41, 39, 33, 28, 23, 19, 36, 41, 42, 35, 29, 24, 19, 36, 40, 45, 36, 30, 24, 20, 35, 40, 45, 37, 31, 25, 21, 34, 40, 44, 40, 33, 27, 22, 34, 39, 43, 43, 35, 29, 23, 35, 39, 44, 44, 38, 31, 25, 4, 6, 10, 12, 13, 11, 8, 4, 5, 9, 12, 12, 9, 6, 4, 5, 7, 10, 10, 8, 4, 3, 3, 4, 7, 9, 6, 2, 1, 1, 1, 4, 6, 4, 2, 2, 2, 2, 3, 5, 4, 2, 4, 3, 2, 2, 4, 5, 2, 4, 5, 7, 10, 10, 8, 8, 4, 5, 6, 9, 9, 6, 6, 3, 4, 5, 7, 7, 4, 4, 3, 2, 2, 4, 4, 2, 2, 2, 2, 1, 2, 1, 1, 2, 3, 2, 2, 2, 1, 0, 2, 6, 4, 2, 2, 2, 1, 2, 3, 4, 6, 7, 8, 10, 10, 3, 4, 6, 7, 8, 8, 8, 2, 3, 6, 6, 6, 6, 7, 6, 2, 4, 5, 5, 5, 5, 8, 2, 4, 6, 6, 6, 5, 9, 4, 5, 7, 7, 7, 5, 8, 7, 6, 8, 8, 8, 8, 2, 7, 10, 10, 11, 12, 13, 7, 7, 11, 11, 12, 12, 12, 11, 7, 11, 12, 11, 12, 10, 12, 7, 11, 12, 12, 12, 10, 12, 9, 13, 13, 13, 13, 13, 9, 11, 14, 14, 15, 15, 14, 9, 14, 16, 17, 16, 16, 16, 13, 16, 18, 18, 18, 18, 13, 15, 17, 19, 20, 20, 18, 12, 15, 19, 20, 20, 20, 18, 14, 15, 20, 21, 21, 20, 19, 15, 15, 22, 23, 22, 23, 21, 16, 15, 23, 27, 24, 24, 21, 18, 16, 24, 28, 27, 25, 23, 19, 25, 28, 27, 27, 25, 20, 16, 26, 30, 29, 29, 25, 21, 16, 25, 32, 32, 31, 26, 21, 17, 26, 32, 33, 31, 26, 22, 18, 24, 31, 35, 33, 29, 23, 19, 25, 32, 37, 35, 30, 25, 21, 25, 32, 37, 38, 32, 27, 22, 35, 40, 39, 32, 27, 23, 19, 36, 40, 41, 34, 27, 24, 19, 35, 39, 43, 35, 30, 24, 19, 36, 39, 44, 36, 31, 26, 21, 34, 39, 44, 38, 32, 27, 23, 34, 39, 43, 42, 35, 29, 24, 34, 40, 43, 44, 37, 30, 25, 4, 6, 8, 11, 11, 9, 6, 4, 6, 8, 10, 10, 7, 4, 3, 5, 7, 8, 9, 6, 4, 3, 3, 5, 7, 8, 5, 3, 1, 0, 3, 5, 7, 5, 3, 2, 2, 4, 4, 7, 5, 3, 4, 3, 3, 4, 6, 5, 3, 4, 5, 7, 9, 8, 6, 6, 3, 4, 6, 8, 7, 5, 4, 3, 4, 5, 7, 5, 4, 2, 2, 2, 4, 5, 4, 3, 0, 1, 1, 2, 4, 3, 2, 0, 3, 2, 3, 4, 2, 2, 0, 7, 4, 3, 3, 3, 1, 0, 3, 4, 5, 5, 7, 8, 8, 2, 3, 5, 6, 6, 6, 6, 2, 3, 5, 4, 4, 4, 5, 3, 2, 3, 3, 2, 3, 3, 6, 2, 4, 4, 4, 4, 3, 7, 4, 5, 5, 5, 5, 3, 8, 7, 6, 6, 6, 6, 6, 2, 7, 8, 8, 9, 10, 11, 3, 7, 9, 9, 10, 10, 10, 9, 7, 10, 9, 10, 10, 8, 11, 7, 10, 10, 9, 10, 7, 10, 9, 11, 11, 12, 11, 11, 7, 11, 13, 12, 13, 13, 12, 8, 14, 15, 14, 14, 14, 14, 12, 16, 16, 16, 17, 16, 11, 14, 16, 17, 17, 18, 16, 10, 15, 18, 18, 18, 17, 16, 12, 14, 20, 19, 19, 19, 17, 12, 14, 21, 21, 21, 20, 18, 14, 15, 22, 24, 22, 21, 19, 15, 16, 23, 26, 25, 23, 21, 17, 24, 26, 24, 25, 21, 18, 14, 24, 28, 26, 25, 22, 18, 14, 24, 30, 29, 27, 23, 19, 14, 24, 29, 30, 28, 25, 19, 15, 23, 29, 32, 30, 25, 21, 17, 24, 30, 35, 32, 27, 23, 18, 25, 30, 35, 35, 30, 25, 20, 32, 37, 35, 28, 24, 21, 16, 32, 37, 38, 31, 25, 20, 17, 33, 37, 39, 32, 27, 22, 17, 32, 37, 40, 33, 27, 22, 18, 31, 36, 41, 37, 30, 24, 20, 31, 35, 40, 40, 32, 26, 21, 32, 37, 40, 41, 34, 28, 23, 17, 19, 20, 23, 22, 21, 20, 17, 19, 20, 22, 22, 20, 18, 16, 18, 19, 19, 20, 17, 14, 16, 16, 16, 17, 17, 12, 7, 13, 13, 13, 12, 10, 10, 7, 9, 9, 7, 6, 8, 9, 7, 3, 3, 4, 6, 7, 9, 7, 16, 18, 19, 21, 21, 21, 20, 15, 18, 19, 20, 20, 19, 17, 15, 17, 18, 19, 18, 17, 14, 14, 15, 15, 16, 14, 11, 7, 12, 12, 12, 11, 7, 7, 7, 8, 7, 6, 5, 6, 6, 6, 0, 2, 4, 4, 5, 6, 6, 15, 17, 18, 19, 21, 21, 20, 14, 16, 17, 19, 19, 19, 17, 15, 16, 17, 17, 17, 16, 13, 15, 14, 14, 14, 13, 11, 6, 10, 10, 10, 9, 5, 6, 6, 3, 5, 5, 4, 5, 6, 6, 2, 2, 2, 4, 5, 5, 6, 15, 16, 17, 18, 20, 21, 21, 14, 16, 18, 19, 19, 19, 19, 12, 16, 17, 17, 17, 16, 15, 9, 15, 14, 14, 13, 10, 10, 6, 11, 10, 9, 5, 5, 7, 4, 4, 4, 4, 4, 5, 6, 2, 7, 5, 5, 5, 5, 6, 14, 15, 17, 19, 19, 21, 21, 12, 15, 16, 18, 19, 18, 19, 11, 14, 15, 15, 16, 15, 14, 12, 12, 12, 12, 11, 10, 6, 9, 10, 10, 10, 11, 11, 6, 6, 11, 13, 12, 12, 12, 7, 7, 12, 14, 13, 13, 12, 9, 13, 15, 16, 17, 17, 19, 21, 13, 17, 17, 18, 16, 17, 18, 13, 19, 18, 18, 14, 14, 13, 13, 18, 19, 18, 16, 11, 8, 12, 17, 19, 18, 15, 12, 9, 12, 16, 19, 17, 15, 13, 11, 13, 15, 18, 18, 16, 14, 12, 21, 25, 24, 21, 16, 18, 19, 21, 25, 25, 21, 17, 16, 16, 21, 24, 26, 22, 18, 13, 12, 21, 23, 25, 21, 18, 14, 11, 19, 21, 24, 20, 16, 14, 12, 18, 21, 22, 21, 16, 15, 13, 17, 19, 22, 22, 18, 15, 13, 15, 16, 17, 19, 18, 18, 17, 14, 16, 17, 18, 18, 17, 15, 13, 15, 16, 16, 16, 14, 11, 13, 14, 14, 13, 12, 9, 5, 11, 11, 10, 9, 6, 5, 4, 7, 7, 5, 4, 5, 5, 5, 2, 2, 2, 3, 5, 5, 4, 14, 15, 16, 18, 18, 18, 17, 14, 15, 16, 17, 18, 16, 14, 13, 14, 15, 16, 15, 13, 10, 13, 12, 13, 12, 11, 9, 4, 10, 9, 9, 8, 4, 4, 4, 6, 5, 4, 3, 3, 4, 4, 2, 0, 2, 2, 3, 4, 4, 13, 14, 15, 16, 18, 18, 18, 13, 13, 15, 16, 16, 16, 15, 13, 13, 14, 14, 14, 13, 11, 12, 12, 11, 11, 10, 8, 5, 8, 8, 8, 8, 3, 4, 4, 3, 4, 4, 3, 3, 4, 4, 2, 2, 1, 2, 3, 4, 5, 13, 15, 15, 17, 19, 19, 19, 12, 15, 16, 17, 17, 18, 16, 10, 15, 15, 15, 15, 14, 13, 7, 14, 13, 13, 12, 9, 9, 5, 10, 9, 8, 6, 6, 7, 3, 6, 6, 7, 7, 7, 8, 2, 9, 9, 8, 8, 9, 9, 13, 14, 15, 17, 18, 19, 20, 11, 14, 15, 16, 17, 17, 17, 12, 13, 14, 14, 15, 14, 12, 11, 13, 12, 12, 13, 12, 8, 9, 13, 14, 14, 14, 14, 9, 8, 15, 16, 17, 16, 15, 11, 10, 16, 19, 19, 19, 17, 12, 16, 19, 19, 20, 17, 18, 19, 16, 21, 21, 21, 18, 16, 16, 16, 23, 23, 22, 18, 14, 12, 17, 22, 24, 23, 19, 15, 11, 15, 22, 25, 25, 22, 17, 12, 16, 22, 28, 28, 24, 19, 14, 17, 23, 28, 29, 25, 21, 16, 26, 32, 31, 24, 20, 17, 18, 25, 31, 33, 26, 21, 16, 15, 26, 31, 35, 27, 22, 17, 12, 25, 31, 36, 29, 23, 18, 14, 24, 30, 35, 32, 25, 21, 15, 24, 31, 35, 33, 28, 23, 17, 24, 31, 35, 33, 29, 24, 19, 11, 12, 14, 15, 15, 15, 14, 10, 12, 13, 15, 14, 13, 11, 10, 11, 13, 13, 12, 10, 8, 10, 10, 10, 10, 9, 6, 3, 7, 7, 7, 6, 4, 3, 2, 4, 3, 3, 2, 3, 3, 2, 2, 1, 1, 2, 3, 3, 2, 10, 11, 13, 14, 15, 14, 14, 10, 11, 12, 13, 14, 12, 12, 10, 10, 11, 12, 11, 10, 8, 10, 9, 9, 9, 8, 6, 3, 7, 6, 6, 6, 3, 2, 3, 3, 2, 2, 2, 2, 2, 3, 4, 2, 0, 2, 2, 2, 3, 10, 10, 11, 13, 14, 16, 16, 10, 10, 12, 13, 13, 14, 14, 10, 10, 11, 12, 11, 11, 10, 9, 8, 9, 9, 9, 6, 5, 4, 5, 6, 6, 4, 3, 5, 3, 2, 3, 3, 3, 4, 5, 4, 3, 4, 4, 4, 5, 5, 10, 13, 13, 14, 16, 17, 17, 8, 12, 13, 14, 15, 15, 14, 6, 12, 13, 13, 13, 12, 11, 8, 11, 10, 10, 10, 9, 9, 6, 7, 8, 9, 9, 10, 9, 4, 9, 10, 10, 11, 11, 11, 4, 12, 12, 12, 12, 12, 12, 11, 13, 14, 15, 16, 17, 17, 11, 14, 15, 15, 16, 15, 14, 11, 15, 16, 16, 16, 14, 11, 11, 17, 17, 16, 17, 15, 11, 11, 18, 17, 18, 18, 17, 12, 12, 19, 21, 20, 20, 18, 14, 14, 20, 23, 21, 22, 20, 16, 21, 23, 23, 23, 20, 17, 17, 21, 25, 25, 25, 21, 17, 14, 21, 28, 27, 26, 22, 17, 13, 21, 25, 29, 27, 22, 19, 14, 20, 27, 31, 29, 25, 20, 15, 20, 26, 33, 32, 26, 21, 17, 22, 27, 32, 34, 29, 24, 18, 30, 35, 35, 28, 23, 19, 16, 30, 36, 38, 31, 24, 19, 15, 30, 36, 39, 32, 26, 20, 15, 30, 35, 40, 32, 27, 22, 17, 28, 35, 40, 35, 29, 23, 19, 28, 35, 40, 38, 30, 26, 20, 29, 35, 40, 41, 33, 28, 21, 9, 10, 12, 13, 13, 13, 12, 8, 9, 11, 13, 13, 11, 9, 8, 9, 11, 11, 11, 9, 7, 8, 7, 8, 9, 8, 5, 2, 5, 5, 5, 5, 4, 2, 2, 2, 2, 1, 2, 3, 2, 2, 3, 2, 1, 2, 2, 2, 2, 8, 9, 11, 12, 13, 12, 13, 8, 9, 10, 12, 12, 10, 10, 7, 8, 9, 10, 10, 8, 8, 7, 7, 7, 8, 7, 5, 4, 5, 4, 3, 4, 3, 2, 3, 2, 2, 1, 1, 2, 2, 3, 4, 2, 2, 0, 1, 2, 3, 8, 8, 10, 11, 13, 14, 14, 7, 8, 10, 12, 12, 12, 12, 7, 7, 10, 10, 10, 10, 9, 5, 6, 8, 8, 8, 6, 6, 5, 3, 5, 5, 5, 5, 6, 6, 2, 5, 5, 5, 6, 6, 5, 4, 5, 7, 7, 7, 7, 7, 11, 12, 13, 14, 16, 15, 5, 10, 12, 14, 13, 13, 13, 7, 10, 11, 11, 12, 12, 11, 10, 9, 10, 11, 11, 11, 10, 9, 8, 11, 11, 12, 12, 12, 7, 10, 13, 13, 13, 13, 14, 5, 13, 14, 15, 14, 14, 15, 12, 15, 16, 17, 18, 17, 15, 14, 16, 18, 18, 19, 17, 13, 14, 17, 19, 19, 18, 17, 13, 14, 20, 19, 19, 20, 18, 14, 13, 21, 21, 20, 20, 19, 15, 14, 22, 23, 23, 22, 21, 17, 16, 22, 26, 25, 25, 23, 18, 24, 27, 26, 26, 23, 19, 16, 24, 29, 28, 28, 24, 21, 15, 24, 31, 31, 29, 26, 20, 16, 24, 30, 31, 30, 27, 21, 17, 23, 30, 33, 31, 27, 22, 18, 23, 30, 35, 34, 29, 24, 19, 25, 30, 35, 36, 32, 27, 21, 33, 40, 39, 32, 26, 22, 18, 34, 40, 42, 34, 28, 23, 18, 33, 40, 43, 35, 29, 23, 18, 34, 40, 44, 36, 30, 25, 19, 32, 38, 44, 39, 32, 26, 21, 33, 38, 43, 42, 34, 28, 23, 32, 39, 42, 43, 36, 30, 24, 7, 9, 13, 15, 15, 14, 10, 6, 8, 11, 15, 15, 12, 9, 6, 7, 10, 12, 13, 10, 7, 6, 5, 7, 10, 11, 8, 4, 3, 3, 4, 6, 8, 6, 3, 1, 1, 2, 3, 6, 6, 3, 3, 2, 2, 2, 5, 6, 3, 6, 7, 10, 13, 13, 10, 10, 6, 7, 9, 12, 12, 9, 8, 5, 6, 8, 10, 10, 7, 6, 5, 5, 5, 7, 6, 5, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 1, 2, 3, 5, 3, 2, 1, 0, 1, 2, 5, 6, 8, 9, 11, 12, 12, 5, 6, 8, 9, 10, 10, 10, 4, 5, 8, 8, 8, 8, 8, 4, 4, 5, 6, 6, 5, 5, 6, 2, 3, 4, 4, 4, 4, 8, 3, 4, 5, 5, 5, 5, 7, 5, 5, 7, 7, 7, 7, 5, 8, 10, 10, 12, 13, 13, 4, 8, 10, 11, 11, 11, 11, 7, 8, 10, 10, 10, 10, 10, 10, 7, 10, 11, 11, 11, 9, 10, 8, 11, 11, 12, 11, 12, 8, 10, 13, 13, 13, 13, 13, 7, 13, 15, 15, 15, 14, 15, 12, 16, 16, 17, 18, 17, 14, 14, 16, 18, 18, 19, 17, 12, 14, 18, 19, 19, 18, 17, 13, 14, 19, 19, 19, 19, 18, 13, 13, 21, 21, 21, 21, 19, 15, 13, 22, 23, 23, 22, 20, 16, 15, 23, 26, 25, 24, 22, 18, 24, 27, 26, 26, 23, 19, 15, 24, 30, 28, 28, 25, 20, 15, 24, 31, 30, 29, 24, 20, 16, 25, 31, 31, 30, 25, 21, 16, 24, 30, 34, 32, 27, 23, 17, 24, 30, 36, 35, 28, 23, 20, 24, 31, 35, 36, 31, 26, 20, 34, 39, 39, 32, 26, 21, 18, 34, 40, 39, 33, 28, 23, 18, 34, 41, 43, 35, 28, 23, 18, 33, 39, 44, 35, 30, 24, 19, 32, 39, 42, 39, 31, 26, 20, 32, 39, 43, 41, 34, 28, 23, 32, 38, 42, 43, 36, 30, 24, 5, 8, 11, 15, 15, 13, 9, 5, 7, 10, 14, 14, 11, 7, 4, 5, 9, 11, 13, 9, 6, 4, 4, 6, 8, 11, 7, 3, 1, 1, 2, 5, 8, 6, 3, 2, 2, 2, 3, 6, 6, 3, 4, 3, 2, 3, 5, 6, 3, 4, 5, 9, 12, 12, 9, 9, 4, 5, 8, 11, 11, 8, 7, 3, 5, 6, 8, 8, 6, 4, 3, 3, 3, 6, 5, 4, 1, 2, 1, 1, 2, 2, 2, 1, 3, 2, 2, 3, 1, 1, 1, 7, 4, 2, 2, 1, 0, 1, 4, 5, 6, 7, 9, 10, 10, 3, 4, 7, 7, 8, 8, 8, 3, 4, 6, 6, 6, 6, 6, 4, 2, 4, 4, 4, 4, 4, 7, 2, 4, 5, 5, 4, 4, 8, 3, 5, 6, 6, 6, 4, 8, 6, 6, 7, 7, 7, 7, 3, 7, 9, 9, 10, 11, 12, 5, 7, 10, 10, 11, 11, 11, 8, 7, 10, 10, 10, 11, 10, 11, 7, 10, 11, 11, 11, 8, 10, 9, 11, 12, 12, 12, 12, 8, 11, 13, 13, 14, 13, 13, 8, 14, 15, 15, 14, 14, 15, 13, 16, 16, 17, 18, 17, 12, 15, 16, 17, 18, 19, 17, 11, 15, 18, 19, 19, 19, 18, 13, 15, 20, 20, 20, 20, 18, 13, 14, 21, 21, 21, 21, 19, 15, 14, 22, 25, 23, 22, 21, 16, 16, 24, 27, 25, 25, 23, 18, 24, 28, 27, 26, 23, 19, 15, 24, 29, 28, 27, 24, 19, 15, 24, 32, 31, 29, 25, 20, 16, 24, 31, 31, 29, 26, 21, 16, 23, 29, 33, 31, 27, 22, 18, 24, 30, 37, 34, 28, 24, 19, 25, 30, 37, 36, 31, 26, 21, 34, 39, 37, 31, 26, 22, 18, 35, 40, 39, 33, 27, 22, 18, 34, 39, 42, 34, 29, 24, 18, 34, 37, 42, 34, 29, 24, 19, 33, 38, 42, 37, 31, 26, 21, 34, 38, 41, 41, 34, 27, 23, 33, 38, 42, 42, 35, 28, 24, 4, 6, 8, 11, 11, 9, 6, 4, 6, 8, 10, 10, 7, 4, 3, 5, 7, 8, 9, 6, 4, 3, 3, 5, 6, 8, 5, 3, 1, 0, 3, 5, 8, 5, 3, 2, 2, 4, 5, 7, 5, 3, 4, 3, 3, 4, 6, 5, 3, 4, 5, 7, 9, 8, 7, 6, 3, 4, 6, 8, 7, 5, 4, 3, 4, 5, 7, 5, 4, 2, 2, 2, 3, 5, 4, 3, 0, 1, 1, 2, 4, 3, 2, 0, 3, 2, 3, 4, 2, 2, 0, 7, 4, 3, 3, 3, 1, 0, 3, 4, 5, 5, 7, 8, 8, 2, 3, 5, 6, 6, 6, 6, 2, 3, 5, 4, 4, 4, 5, 3, 2, 3, 3, 3, 3, 3, 5, 2, 4, 4, 4, 4, 3, 7, 4, 5, 5, 5, 5, 3, 8, 7, 6, 6, 6, 6, 6, 2, 7, 8, 9, 9, 10, 11, 3, 7, 9, 9, 10, 10, 9, 9, 7, 10, 9, 9, 10, 8, 11, 7, 10, 10, 10, 10, 7, 9, 9, 11, 11, 11, 11, 11, 8, 11, 13, 13, 13, 13, 12, 8, 14, 15, 14, 14, 14, 13, 12, 15, 16, 16, 16, 16, 11, 14, 17, 17, 17, 18, 16, 10, 14, 17, 18, 18, 18, 16, 12, 14, 19, 18, 19, 18, 17, 12, 14, 21, 21, 20, 19, 19, 14, 15, 22, 24, 23, 21, 19, 16, 16, 22, 26, 24, 23, 21, 17, 24, 26, 24, 24, 21, 18, 14, 24, 28, 27, 26, 23, 18, 14, 24, 30, 28, 27, 23, 19, 15, 24, 29, 31, 27, 24, 20, 16, 23, 28, 32, 30, 25, 21, 17, 24, 30, 34, 33, 28, 23, 19, 24, 30, 35, 34, 30, 24, 20, 32, 37, 35, 28, 24, 20, 17, 33, 37, 36, 30, 25, 21, 16, 33, 37, 39, 31, 26, 22, 17, 32, 37, 40, 33, 27, 23, 19, 31, 36, 39, 36, 30, 23, 20, 31, 36, 40, 38, 32, 26, 21, 33, 36, 41, 40, 34, 28, 22, 2, 3, 4, 8, 8, 6, 2, 2, 2, 3, 7, 8, 4, 2, 2, 2, 2, 4, 5, 2, 2, 1, 2, 2, 2, 3, 2, 3, 2, 3, 3, 3, 4, 3, 3, 6, 6, 6, 6, 4, 3, 3, 12, 11, 8, 6, 5, 3, 3, 2, 2, 3, 5, 5, 2, 2, 1, 2, 3, 3, 4, 2, 1, 0, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 4, 3, 4, 4, 4, 3, 3, 8, 8, 8, 7, 5, 3, 3, 15, 13, 10, 7, 5, 4, 3, 0, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 4, 6, 5, 5, 5, 5, 4, 4, 11, 10, 9, 8, 6, 5, 4, 18, 16, 12, 9, 7, 6, 5, 2, 2, 2, 3, 3, 3, 7, 2, 3, 4, 4, 4, 4, 7, 4, 4, 5, 5, 5, 5, 7, 7, 7, 7, 7, 8, 8, 8, 8, 12, 11, 11, 12, 11, 10, 12, 17, 16, 15, 14, 13, 12, 18, 23, 20, 17, 15, 14, 13, 10, 10, 10, 10, 11, 10, 7, 12, 12, 12, 11, 12, 11, 7, 12, 13, 13, 14, 13, 12, 8, 12, 17, 16, 16, 17, 15, 12, 15, 21, 21, 20, 20, 19, 14, 19, 24, 25, 25, 23, 20, 15, 22, 27, 30, 27, 25, 22, 17, 19, 21, 20, 20, 17, 13, 8, 19, 22, 22, 22, 18, 14, 10, 19, 24, 24, 24, 19, 15, 11, 19, 25, 27, 27, 23, 19, 15, 22, 28, 32, 31, 28, 23, 17, 24, 30, 36, 35, 30, 25, 18, 27, 34, 37, 37, 32, 26, 20, 27, 32, 32, 25, 20, 16, 11, 27, 33, 34, 28, 22, 17, 13, 26, 34, 36, 29, 24, 19, 15, 28, 34, 38, 32, 27, 23, 19, 29, 35, 40, 36, 32, 27, 21, 31, 37, 40, 40, 33, 27, 23, 33, 38, 42, 42, 36, 30, 25, 1, 2, 3, 3, 3, 2, 2, 1, 2, 2, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 4, 4, 3, 4, 4, 4, 4, 4, 8, 7, 7, 7, 5, 4, 4, 13, 12, 9, 7, 6, 4, 4, 1, 2, 2, 3, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 4, 5, 5, 5, 5, 5, 4, 4, 10, 9, 9, 8, 6, 4, 4, 17, 14, 11, 8, 6, 5, 4, 2, 0, 1, 2, 2, 1, 5, 2, 1, 1, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 6, 4, 2, 4, 4, 4, 4, 7, 8, 6, 7, 7, 8, 7, 7, 13, 12, 12, 11, 10, 8, 7, 19, 17, 15, 13, 11, 10, 9, 2, 5, 5, 6, 6, 6, 9, 5, 6, 6, 7, 7, 7, 9, 8, 7, 7, 8, 8, 8, 9, 11, 10, 11, 11, 11, 12, 11, 11, 15, 15, 15, 15, 15, 14, 13, 20, 20, 18, 17, 16, 15, 19, 26, 23, 21, 18, 18, 17, 13, 14, 13, 13, 13, 13, 9, 14, 15, 14, 15, 15, 14, 9, 14, 17, 16, 17, 16, 15, 12, 15, 21, 20, 20, 20, 19, 16, 18, 25, 25, 24, 24, 22, 17, 22, 28, 30, 29, 26, 24, 19, 26, 31, 33, 30, 29, 26, 20, 22, 24, 23, 23, 19, 15, 11, 23, 26, 25, 24, 21, 16, 12, 23, 28, 27, 26, 23, 19, 15, 23, 29, 31, 30, 27, 22, 19, 25, 32, 36, 34, 31, 26, 21, 29, 34, 41, 39, 34, 27, 22, 32, 37, 42, 41, 36, 30, 24, 31, 36, 34, 28, 23, 18, 14, 30, 37, 37, 30, 23, 20, 15, 31, 36, 39, 33, 26, 22, 19, 30, 36, 42, 36, 31, 27, 23, 32, 39, 45, 41, 35, 29, 24, 34, 40, 47, 45, 39, 31, 26, 38, 43, 47, 46, 41, 34, 28, 1, 3, 4, 5, 5, 4, 3, 1, 2, 4, 5, 5, 4, 3, 2, 1, 4, 4, 5, 5, 5, 2, 2, 4, 5, 6, 6, 6, 4, 4, 6, 7, 8, 7, 6, 8, 8, 9, 10, 8, 7, 6, 14, 13, 10, 10, 9, 7, 6, 2, 1, 3, 4, 4, 3, 1, 2, 1, 3, 4, 4, 3, 1, 2, 2, 2, 4, 4, 3, 3, 2, 3, 3, 5, 5, 5, 5, 5, 5, 6, 7, 7, 6, 4, 11, 10, 10, 10, 8, 6, 4, 18, 15, 12, 10, 8, 6, 4, 2, 1, 0, 1, 1, 2, 5, 2, 2, 1, 1, 1, 2, 4, 3, 2, 2, 2, 3, 3, 6, 7, 3, 6, 6, 6, 6, 8, 10, 7, 9, 9, 9, 9, 8, 15, 12, 13, 13, 11, 10, 7, 21, 19, 16, 14, 13, 11, 10, 3, 6, 6, 6, 7, 6, 8, 8, 6, 7, 7, 8, 8, 9, 10, 7, 9, 9, 10, 10, 10, 12, 10, 13, 13, 13, 13, 11, 13, 15, 17, 17, 17, 16, 14, 15, 22, 22, 21, 19, 18, 17, 20, 27, 25, 22, 21, 20, 19, 14, 15, 15, 14, 15, 13, 8, 16, 15, 16, 16, 15, 14, 8, 16, 17, 18, 19, 18, 17, 13, 16, 22, 22, 22, 22, 21, 17, 19, 27, 27, 26, 26, 24, 18, 23, 31, 33, 31, 29, 25, 21, 28, 34, 35, 32, 31, 28, 22, 23, 25, 24, 23, 20, 16, 12, 23, 28, 26, 25, 21, 17, 13, 24, 29, 28, 28, 25, 21, 17, 24, 31, 33, 32, 28, 24, 21, 27, 33, 39, 36, 33, 27, 21, 31, 37, 42, 41, 36, 29, 24, 33, 40, 45, 44, 38, 31, 26, 32, 38, 36, 29, 24, 19, 15, 32, 37, 38, 30, 25, 21, 17, 31, 38, 40, 35, 29, 24, 19, 32, 39, 45, 39, 32, 28, 24, 34, 41, 46, 44, 37, 31, 25, 37, 44, 48, 48, 41, 33, 28, 40, 45, 49, 50, 43, 36, 30, 1, 3, 6, 8, 8, 6, 3, 1, 2, 5, 7, 8, 6, 4, 1, 2, 4, 7, 8, 7, 5, 2, 2, 5, 7, 9, 8, 7, 4, 5, 7, 9, 11, 9, 8, 9, 9, 10, 11, 11, 9, 8, 16, 14, 12, 11, 11, 9, 7, 1, 1, 4, 6, 5, 3, 1, 2, 1, 3, 5, 5, 2, 2, 2, 1, 2, 5, 5, 4, 3, 2, 3, 4, 6, 6, 5, 5, 6, 6, 7, 9, 8, 7, 5, 12, 11, 11, 11, 9, 7, 5, 19, 17, 13, 11, 9, 7, 5, 2, 2, 1, 0, 1, 2, 4, 2, 2, 1, 1, 1, 2, 4, 5, 2, 3, 3, 3, 3, 6, 8, 3, 6, 7, 7, 7, 7, 11, 8, 10, 10, 10, 10, 8, 16, 13, 15, 14, 13, 11, 8, 21, 20, 18, 16, 14, 12, 11, 5, 6, 7, 7, 7, 5, 7, 9, 6, 7, 8, 8, 8, 8, 12, 7, 9, 10, 11, 11, 10, 14, 10, 14, 15, 14, 14, 12, 15, 15, 18, 18, 18, 18, 15, 16, 23, 22, 21, 21, 19, 17, 22, 29, 26, 24, 22, 20, 20, 15, 14, 14, 14, 14, 13, 7, 18, 15, 16, 15, 16, 15, 8, 18, 17, 18, 19, 19, 17, 14, 17, 22, 23, 23, 23, 22, 18, 20, 28, 28, 27, 27, 25, 20, 23, 32, 34, 32, 28, 26, 22, 28, 35, 37, 34, 32, 28, 23, 24, 26, 24, 23, 20, 16, 12, 24, 28, 26, 26, 22, 18, 14, 24, 30, 29, 29, 25, 21, 18, 24, 32, 34, 33, 30, 25, 22, 28, 35, 40, 38, 34, 29, 23, 32, 37, 45, 42, 36, 30, 25, 36, 42, 45, 45, 39, 33, 27, 32, 38, 35, 29, 23, 19, 15, 32, 38, 37, 31, 26, 21, 18, 33, 38, 41, 35, 29, 26, 21, 32, 40, 45, 39, 35, 29, 25, 36, 43, 48, 44, 39, 33, 26, 38, 45, 50, 50, 41, 35, 29, 41, 47, 51, 51, 44, 37, 30, 1, 3, 6, 8, 8, 6, 3, 2, 2, 5, 7, 8, 6, 5, 2, 1, 5, 8, 9, 8, 6, 2, 3, 5, 8, 10, 9, 8, 5, 6, 8, 10, 12, 10, 9, 10, 11, 12, 13, 13, 10, 9, 17, 15, 13, 12, 12, 10, 9, 2, 1, 4, 6, 5, 2, 2, 2, 1, 3, 5, 5, 3, 2, 2, 2, 2, 6, 5, 4, 4, 2, 3, 5, 7, 7, 6, 7, 7, 7, 8, 10, 10, 8, 7, 13, 12, 13, 13, 10, 9, 7, 21, 18, 14, 13, 11, 9, 7, 2, 2, 1, 1, 0, 2, 4, 3, 2, 1, 1, 2, 3, 5, 7, 2, 3, 4, 5, 4, 6, 10, 3, 7, 8, 8, 8, 8, 13, 9, 11, 12, 12, 11, 8, 17, 15, 16, 15, 14, 13, 8, 23, 21, 19, 17, 15, 14, 13, 6, 6, 7, 7, 7, 4, 7, 11, 7, 8, 8, 9, 9, 8, 13, 7, 10, 11, 12, 12, 11, 16, 10, 15, 16, 16, 16, 13, 16, 17, 19, 20, 20, 19, 16, 18, 24, 25, 23, 22, 21, 19, 23, 30, 28, 25, 23, 22, 22, 16, 15, 15, 15, 15, 13, 7, 19, 17, 16, 16, 18, 16, 8, 19, 18, 19, 20, 21, 19, 15, 19, 23, 23, 25, 25, 24, 20, 20, 28, 30, 29, 29, 26, 21, 24, 33, 35, 33, 31, 29, 23, 30, 37, 38, 35, 33, 30, 25, 25, 26, 25, 24, 20, 16, 12, 24, 28, 26, 25, 22, 19, 15, 24, 30, 29, 30, 27, 23, 19, 25, 32, 35, 34, 31, 27, 23, 28, 36, 41, 39, 35, 30, 25, 33, 40, 46, 43, 38, 32, 27, 37, 42, 47, 46, 40, 34, 28, 32, 38, 35, 28, 23, 19, 16, 33, 37, 38, 31, 26, 22, 19, 34, 38, 40, 35, 31, 27, 22, 33, 40, 45, 40, 35, 31, 27, 35, 43, 47, 46, 39, 34, 29, 41, 46, 50, 50, 42, 36, 30, 43, 48, 50, 53, 45, 38, 32, 3, 5, 7, 8, 8, 6, 5, 2, 4, 6, 8, 9, 7, 6, 1, 3, 6, 9, 10, 9, 8, 2, 4, 7, 9, 12, 11, 10, 5, 7, 10, 11, 14, 12, 10, 11, 12, 13, 14, 14, 12, 10, 17, 16, 15, 14, 14, 12, 10, 1, 4, 5, 7, 5, 3, 2, 2, 2, 5, 6, 6, 4, 3, 2, 2, 5, 7, 7, 6, 5, 2, 3, 6, 8, 8, 7, 8, 6, 7, 10, 11, 11, 9, 8, 13, 13, 14, 14, 11, 10, 8, 21, 18, 15, 14, 12, 10, 8, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 1, 2, 1, 4, 4, 2, 1, 3, 3, 3, 5, 9, 3, 5, 6, 6, 7, 7, 11, 9, 10, 10, 10, 10, 7, 17, 15, 15, 14, 12, 11, 7, 23, 21, 17, 15, 14, 12, 11, 4, 5, 5, 5, 5, 3, 5, 9, 6, 6, 6, 7, 7, 7, 12, 7, 8, 9, 10, 11, 9, 15, 10, 13, 14, 14, 14, 11, 15, 15, 18, 18, 18, 17, 15, 17, 23, 23, 22, 20, 19, 17, 24, 30, 26, 24, 22, 20, 19, 15, 13, 13, 12, 13, 11, 5, 18, 15, 14, 14, 15, 14, 7, 19, 16, 17, 19, 19, 18, 13, 19, 21, 22, 23, 23, 21, 18, 19, 27, 28, 27, 27, 24, 19, 23, 31, 34, 31, 29, 25, 21, 29, 35, 36, 33, 31, 28, 23, 23, 24, 22, 20, 18, 14, 10, 23, 26, 24, 22, 20, 17, 13, 23, 28, 27, 27, 23, 21, 17, 23, 30, 32, 30, 29, 24, 21, 27, 34, 37, 36, 32, 28, 23, 31, 38, 43, 42, 35, 30, 25, 35, 40, 44, 43, 37, 31, 26, 31, 33, 30, 25, 20, 17, 14, 30, 33, 33, 27, 23, 20, 17, 31, 33, 36, 31, 27, 25, 21, 30, 35, 42, 36, 32, 28, 25, 34, 39, 44, 43, 37, 32, 27, 38, 42, 47, 47, 40, 33, 28, 41, 46, 49, 48, 42, 36, 30, 6, 7, 9, 10, 10, 8, 6, 5, 6, 8, 10, 11, 9, 8, 4, 6, 8, 11, 13, 11, 9, 3, 6, 9, 12, 14, 12, 11, 5, 8, 10, 13, 15, 14, 11, 11, 13, 14, 14, 16, 14, 11, 17, 17, 15, 15, 14, 13, 11, 4, 6, 7, 9, 7, 5, 3, 3, 5, 7, 8, 7, 6, 5, 1, 5, 7, 9, 8, 7, 6, 1, 5, 8, 10, 9, 9, 8, 5, 8, 10, 12, 11, 10, 8, 12, 13, 15, 15, 12, 10, 8, 20, 18, 16, 14, 12, 10, 8, 1, 5, 5, 4, 4, 2, 0, 2, 3, 5, 4, 3, 3, 2, 2, 2, 4, 5, 4, 5, 4, 4, 3, 6, 6, 6, 6, 6, 8, 8, 10, 10, 10, 8, 6, 15, 15, 15, 13, 11, 9, 6, 22, 20, 17, 14, 11, 9, 8, 2, 2, 2, 2, 1, 2, 3, 5, 3, 3, 2, 3, 3, 4, 8, 5, 4, 6, 6, 6, 6, 11, 7, 9, 10, 10, 10, 8, 12, 14, 14, 14, 14, 13, 11, 15, 20, 19, 17, 16, 15, 13, 22, 26, 22, 20, 18, 16, 15, 12, 10, 9, 9, 9, 8, 3, 15, 12, 11, 11, 11, 10, 4, 15, 14, 13, 14, 14, 13, 10, 14, 18, 18, 18, 19, 17, 14, 17, 25, 23, 23, 23, 20, 15, 22, 28, 30, 27, 24, 21, 17, 26, 31, 33, 29, 26, 23, 19, 20, 19, 18, 16, 14, 10, 6, 19, 22, 18, 17, 15, 13, 9, 19, 23, 22, 21, 19, 16, 13, 20, 25, 26, 26, 23, 20, 17, 23, 30, 33, 30, 28, 23, 19, 27, 33, 38, 35, 29, 25, 20, 32, 35, 40, 38, 32, 27, 22, 24, 28, 25, 19, 15, 13, 10, 25, 28, 27, 21, 17, 15, 13, 25, 28, 29, 25, 22, 19, 16, 25, 29, 35, 31, 27, 23, 20, 28, 35, 39, 36, 31, 27, 22, 32, 37, 41, 41, 34, 28, 23, 36, 40, 42, 43, 37, 30, 26, 2, 3, 8, 12, 12, 10, 7, 2, 3, 6, 11, 11, 9, 4, 2, 2, 4, 8, 9, 7, 2, 2, 2, 2, 4, 7, 5, 2, 2, 2, 2, 3, 5, 5, 2, 6, 6, 6, 5, 4, 5, 2, 11, 11, 8, 6, 4, 5, 2, 2, 2, 5, 8, 9, 6, 2, 1, 2, 3, 7, 9, 4, 2, 2, 2, 2, 4, 5, 2, 2, 0, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 7, 7, 8, 6, 4, 3, 2, 15, 13, 10, 7, 5, 3, 2, 1, 2, 2, 2, 3, 2, 2, 0, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 2, 5, 4, 4, 4, 4, 3, 2, 11, 9, 9, 7, 5, 3, 2, 17, 16, 12, 9, 6, 4, 3, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 3, 3, 3, 6, 2, 3, 3, 3, 4, 4, 6, 5, 5, 6, 6, 6, 7, 7, 6, 10, 10, 10, 10, 9, 9, 11, 15, 14, 14, 12, 11, 10, 17, 21, 18, 16, 14, 13, 12, 9, 9, 9, 9, 10, 9, 6, 11, 11, 10, 11, 11, 10, 6, 11, 12, 12, 12, 12, 11, 7, 11, 15, 14, 15, 15, 14, 11, 13, 20, 19, 19, 19, 18, 12, 17, 23, 25, 24, 21, 20, 14, 21, 26, 27, 24, 24, 21, 16, 18, 20, 19, 19, 16, 12, 7, 18, 21, 21, 21, 18, 12, 9, 18, 23, 22, 22, 18, 14, 10, 18, 24, 26, 25, 22, 18, 14, 20, 25, 30, 28, 25, 21, 16, 22, 28, 33, 31, 27, 23, 18, 25, 31, 34, 34, 29, 25, 19, 26, 31, 29, 24, 19, 15, 10, 26, 31, 31, 26, 21, 16, 11, 26, 31, 33, 27, 23, 18, 14, 25, 31, 35, 30, 26, 21, 18, 27, 32, 35, 33, 28, 24, 20, 29, 35, 37, 36, 31, 27, 22, 32, 34, 36, 37, 31, 28, 23, 2, 2, 3, 3, 3, 2, 2, 1, 2, 3, 3, 3, 2, 2, 1, 2, 2, 3, 3, 2, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 3, 3, 7, 6, 7, 6, 5, 3, 3, 13, 11, 8, 7, 5, 3, 3, 1, 2, 2, 3, 2, 2, 2, 1, 2, 2, 3, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 1, 2, 3, 4, 4, 4, 4, 4, 3, 3, 9, 8, 8, 7, 5, 4, 3, 16, 14, 10, 8, 6, 4, 3, 2, 1, 2, 2, 2, 2, 3, 2, 0, 1, 1, 1, 2, 3, 2, 1, 1, 0, 1, 0, 4, 3, 2, 2, 2, 3, 3, 6, 7, 6, 6, 6, 6, 5, 6, 12, 11, 10, 9, 8, 7, 6, 18, 17, 13, 11, 9, 8, 7, 2, 4, 4, 4, 5, 4, 8, 3, 5, 5, 5, 6, 6, 8, 6, 6, 6, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 12, 12, 19, 18, 16, 16, 15, 14, 18, 25, 22, 19, 18, 16, 15, 12, 12, 12, 12, 12, 12, 8, 14, 14, 13, 13, 14, 12, 8, 13, 15, 15, 15, 15, 14, 11, 13, 19, 19, 18, 19, 18, 14, 17, 24, 23, 23, 23, 20, 16, 20, 27, 29, 27, 25, 22, 17, 25, 30, 31, 29, 28, 25, 19, 21, 23, 22, 21, 18, 14, 10, 21, 25, 23, 23, 20, 15, 11, 20, 26, 27, 26, 22, 17, 13, 21, 27, 28, 28, 25, 21, 17, 24, 30, 34, 33, 30, 24, 19, 27, 33, 40, 37, 32, 26, 21, 30, 36, 40, 39, 34, 29, 22, 29, 36, 33, 27, 20, 17, 13, 29, 35, 35, 28, 23, 18, 14, 29, 35, 38, 31, 25, 20, 16, 29, 34, 42, 35, 30, 25, 21, 31, 37, 43, 40, 34, 29, 22, 33, 40, 45, 43, 37, 30, 25, 35, 42, 46, 46, 39, 32, 27, 1, 3, 4, 5, 5, 4, 3, 1, 3, 4, 5, 5, 4, 3, 1, 2, 4, 4, 5, 4, 4, 1, 2, 4, 5, 5, 5, 6, 4, 4, 6, 7, 7, 6, 6, 8, 8, 10, 10, 8, 7, 6, 14, 12, 11, 10, 9, 7, 6, 1, 2, 4, 5, 4, 3, 1, 1, 1, 3, 4, 4, 3, 0, 2, 1, 3, 4, 3, 4, 3, 2, 2, 3, 5, 5, 5, 5, 5, 5, 6, 8, 7, 6, 5, 10, 10, 10, 11, 8, 6, 5, 18, 15, 11, 10, 8, 7, 5, 2, 1, 1, 1, 1, 1, 4, 2, 1, 0, 1, 1, 1, 4, 2, 1, 2, 2, 2, 2, 5, 5, 3, 5, 5, 5, 5, 7, 9, 7, 8, 8, 8, 8, 7, 14, 12, 13, 11, 10, 9, 7, 20, 18, 15, 14, 12, 10, 9, 2, 5, 6, 6, 6, 5, 8, 6, 6, 6, 7, 7, 7, 8, 9, 7, 8, 8, 9, 9, 9, 11, 9, 12, 12, 12, 12, 11, 12, 15, 16, 16, 16, 16, 14, 14, 21, 20, 19, 18, 17, 16, 20, 27, 24, 21, 20, 18, 17, 13, 13, 13, 14, 14, 13, 8, 15, 15, 14, 15, 15, 14, 8, 15, 17, 17, 17, 17, 16, 12, 15, 22, 21, 20, 21, 20, 16, 18, 26, 25, 24, 25, 23, 18, 23, 30, 32, 29, 28, 24, 20, 26, 33, 35, 31, 30, 26, 21, 23, 25, 23, 23, 19, 15, 11, 23, 27, 25, 24, 20, 16, 12, 23, 28, 27, 28, 24, 19, 16, 22, 30, 32, 31, 28, 23, 19, 26, 33, 36, 35, 31, 26, 21, 29, 35, 41, 40, 34, 29, 22, 33, 38, 43, 43, 36, 30, 24, 30, 37, 35, 28, 22, 18, 14, 31, 36, 37, 30, 24, 20, 16, 31, 36, 40, 33, 28, 22, 19, 30, 38, 44, 38, 31, 27, 23, 33, 39, 45, 42, 36, 31, 25, 35, 41, 48, 46, 39, 32, 27, 40, 44, 48, 51, 41, 35, 29, 1, 4, 6, 9, 9, 7, 4, 1, 3, 5, 8, 8, 7, 5, 1, 2, 5, 7, 9, 8, 6, 1, 3, 5, 8, 10, 8, 8, 5, 5, 7, 9, 11, 10, 8, 9, 9, 11, 12, 11, 9, 8, 15, 14, 12, 12, 11, 10, 8, 1, 2, 4, 7, 6, 3, 1, 1, 1, 4, 6, 6, 3, 1, 2, 1, 3, 6, 5, 4, 3, 2, 3, 4, 6, 6, 6, 6, 5, 6, 7, 9, 9, 7, 6, 11, 11, 11, 12, 9, 8, 6, 19, 16, 13, 12, 9, 8, 6, 2, 1, 1, 1, 2, 1, 3, 2, 1, 1, 0, 1, 1, 4, 3, 2, 2, 2, 2, 3, 5, 7, 3, 5, 6, 5, 6, 7, 10, 8, 9, 9, 10, 8, 7, 15, 13, 14, 13, 11, 10, 7, 21, 20, 17, 15, 13, 11, 10, 3, 5, 6, 6, 6, 4, 7, 8, 6, 7, 7, 7, 7, 7, 11, 7, 8, 9, 10, 10, 9, 13, 9, 13, 13, 13, 13, 11, 13, 15, 17, 16, 17, 17, 14, 16, 22, 22, 21, 19, 18, 16, 21, 28, 26, 23, 21, 20, 18, 14, 14, 14, 14, 14, 13, 7, 16, 15, 15, 15, 15, 14, 7, 16, 17, 17, 18, 18, 17, 13, 16, 21, 22, 22, 22, 21, 17, 19, 27, 27, 27, 26, 24, 19, 23, 30, 32, 31, 28, 26, 20, 28, 33, 35, 32, 31, 28, 22, 23, 24, 23, 23, 19, 16, 11, 22, 27, 25, 24, 21, 17, 13, 23, 30, 28, 28, 24, 21, 17, 23, 31, 33, 32, 28, 24, 21, 28, 34, 36, 36, 33, 27, 22, 31, 36, 44, 42, 36, 29, 24, 34, 39, 43, 45, 37, 32, 26, 31, 36, 35, 28, 22, 18, 14, 31, 37, 37, 31, 25, 20, 17, 31, 37, 41, 33, 29, 25, 19, 31, 38, 45, 39, 33, 28, 24, 35, 39, 46, 44, 36, 32, 26, 38, 45, 51, 50, 40, 33, 28, 40, 46, 50, 51, 43, 35, 30, 1, 4, 7, 10, 10, 8, 4, 1, 3, 6, 9, 9, 7, 5, 1, 2, 5, 8, 10, 8, 6, 2, 3, 6, 8, 11, 9, 8, 5, 6, 8, 10, 12, 10, 8, 10, 10, 12, 12, 12, 10, 8, 16, 14, 12, 12, 12, 10, 8, 1, 2, 5, 7, 7, 4, 1, 1, 1, 4, 6, 6, 4, 2, 2, 1, 3, 6, 6, 5, 3, 2, 3, 5, 7, 7, 6, 6, 5, 6, 8, 9, 9, 7, 6, 12, 11, 12, 12, 9, 8, 6, 19, 17, 13, 12, 10, 8, 6, 2, 1, 1, 1, 2, 2, 3, 2, 2, 1, 1, 0, 1, 4, 4, 2, 2, 3, 3, 2, 5, 8, 3, 6, 6, 6, 6, 7, 11, 8, 9, 10, 10, 9, 7, 16, 14, 14, 13, 12, 10, 7, 21, 20, 17, 15, 13, 12, 11, 4, 5, 6, 6, 6, 4, 7, 8, 6, 7, 7, 7, 7, 7, 12, 6, 8, 10, 10, 10, 9, 13, 9, 13, 13, 14, 14, 11, 14, 15, 17, 17, 18, 17, 14, 16, 22, 22, 21, 20, 18, 17, 21, 28, 25, 23, 22, 20, 19, 15, 14, 14, 14, 14, 13, 7, 17, 15, 15, 15, 15, 14, 7, 16, 17, 17, 19, 19, 17, 13, 17, 21, 23, 23, 22, 21, 17, 19, 27, 27, 27, 27, 24, 19, 24, 32, 34, 31, 30, 26, 20, 28, 36, 36, 34, 31, 29, 23, 23, 25, 23, 23, 20, 16, 11, 23, 27, 25, 24, 22, 17, 14, 23, 29, 28, 28, 24, 20, 17, 23, 31, 34, 33, 29, 25, 21, 27, 34, 38, 37, 33, 28, 22, 30, 38, 44, 42, 36, 30, 24, 35, 40, 44, 44, 37, 32, 26, 32, 35, 34, 27, 22, 18, 14, 31, 37, 36, 29, 24, 21, 17, 31, 36, 38, 33, 29, 24, 21, 32, 39, 43, 38, 33, 28, 24, 35, 42, 46, 44, 37, 32, 27, 37, 43, 49, 48, 42, 34, 28, 41, 46, 49, 51, 44, 36, 30, 3, 5, 6, 8, 8, 6, 4, 2, 5, 6, 8, 8, 6, 5, 1, 4, 6, 8, 9, 8, 6, 2, 4, 7, 9, 11, 9, 8, 4, 6, 8, 10, 12, 10, 8, 10, 10, 12, 12, 12, 10, 8, 15, 15, 13, 12, 12, 10, 8, 1, 4, 5, 7, 5, 4, 2, 1, 3, 5, 6, 5, 3, 2, 2, 2, 5, 6, 6, 5, 4, 2, 3, 5, 7, 7, 6, 6, 5, 6, 8, 10, 9, 7, 6, 12, 11, 12, 12, 10, 8, 6, 19, 16, 14, 12, 10, 8, 6, 2, 1, 2, 2, 3, 1, 3, 2, 1, 1, 1, 1, 0, 3, 3, 1, 1, 2, 2, 2, 4, 7, 3, 5, 5, 5, 5, 5, 11, 8, 9, 9, 9, 8, 5, 15, 14, 13, 12, 11, 9, 5, 21, 18, 16, 14, 12, 11, 9, 2, 5, 5, 5, 5, 4, 6, 7, 6, 6, 6, 6, 6, 6, 11, 6, 7, 8, 9, 9, 7, 14, 9, 12, 12, 12, 12, 10, 14, 14, 17, 16, 17, 16, 13, 16, 21, 21, 20, 19, 17, 16, 21, 27, 25, 22, 20, 18, 18, 14, 13, 13, 13, 13, 13, 6, 16, 15, 14, 14, 14, 13, 6, 17, 16, 16, 17, 17, 16, 12, 17, 21, 21, 21, 22, 19, 15, 19, 27, 27, 26, 25, 23, 18, 23, 30, 32, 30, 27, 25, 20, 27, 33, 34, 31, 29, 27, 21, 23, 23, 22, 21, 18, 15, 10, 23, 26, 23, 22, 19, 16, 12, 23, 28, 26, 25, 23, 19, 16, 23, 29, 32, 29, 27, 23, 19, 26, 33, 37, 34, 31, 26, 21, 31, 37, 40, 40, 33, 28, 23, 33, 38, 42, 42, 35, 29, 24, 30, 34, 30, 25, 20, 16, 13, 29, 34, 33, 27, 22, 20, 16, 30, 34, 36, 30, 26, 23, 19, 29, 36, 40, 34, 30, 27, 23, 33, 39, 43, 41, 35, 30, 25, 37, 41, 46, 46, 37, 31, 27, 40, 44, 47, 47, 40, 34, 28, 6, 7, 9, 12, 11, 9, 6, 5, 6, 8, 11, 11, 8, 6, 4, 6, 8, 10, 11, 9, 8, 3, 6, 9, 10, 13, 11, 9, 5, 7, 9, 11, 14, 12, 9, 9, 10, 11, 12, 14, 12, 9, 15, 14, 12, 12, 13, 12, 9, 4, 6, 7, 9, 8, 6, 4, 3, 6, 7, 8, 7, 5, 3, 1, 5, 7, 8, 7, 6, 5, 1, 4, 8, 9, 8, 8, 6, 5, 7, 9, 10, 9, 9, 6, 11, 11, 12, 12, 10, 8, 6, 18, 16, 13, 12, 10, 8, 6, 1, 5, 5, 4, 5, 4, 2, 1, 3, 4, 4, 4, 3, 0, 1, 2, 4, 4, 3, 3, 2, 2, 3, 5, 5, 4, 4, 4, 7, 8, 8, 7, 8, 6, 4, 14, 13, 12, 10, 8, 7, 4, 20, 17, 14, 11, 9, 7, 5, 1, 2, 2, 2, 2, 3, 5, 2, 3, 2, 2, 3, 3, 3, 7, 4, 4, 5, 5, 5, 4, 10, 7, 8, 8, 8, 8, 6, 10, 13, 12, 12, 12, 11, 9, 14, 19, 17, 15, 14, 13, 11, 19, 23, 20, 17, 15, 14, 13, 11, 10, 9, 9, 10, 9, 5, 13, 12, 11, 10, 11, 9, 3, 13, 13, 13, 14, 13, 11, 8, 13, 18, 17, 16, 17, 15, 12, 16, 23, 22, 21, 21, 18, 13, 20, 26, 27, 25, 22, 20, 15, 23, 28, 31, 26, 24, 22, 16, 19, 19, 17, 16, 15, 11, 8, 19, 22, 18, 17, 15, 11, 8, 19, 23, 21, 20, 17, 14, 12, 20, 25, 25, 24, 22, 18, 15, 22, 28, 31, 28, 25, 22, 17, 27, 31, 36, 33, 27, 23, 19, 29, 34, 38, 35, 29, 25, 20, 25, 27, 25, 19, 16, 13, 10, 25, 27, 27, 20, 17, 14, 11, 25, 28, 29, 24, 21, 18, 15, 25, 29, 34, 29, 25, 21, 18, 28, 33, 36, 34, 30, 24, 20, 31, 35, 40, 38, 32, 26, 21, 35, 38, 41, 41, 34, 28, 23, 3, 7, 12, 15, 16, 14, 11, 2, 5, 10, 14, 15, 14, 8, 2, 4, 8, 11, 13, 11, 6, 2, 2, 5, 8, 10, 10, 5, 2, 2, 3, 6, 8, 9, 5, 5, 6, 6, 5, 7, 9, 5, 12, 11, 8, 4, 7, 9, 5, 2, 4, 8, 12, 13, 11, 5, 2, 3, 7, 10, 12, 9, 3, 2, 2, 5, 7, 8, 6, 2, 1, 2, 2, 4, 5, 3, 2, 2, 3, 3, 3, 3, 3, 2, 7, 7, 7, 6, 3, 2, 2, 15, 13, 9, 7, 4, 3, 2, 2, 2, 3, 5, 6, 4, 2, 1, 2, 2, 3, 4, 3, 1, 0, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 3, 2, 10, 9, 9, 8, 5, 3, 2, 17, 16, 12, 9, 6, 4, 2, 0, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 1, 1, 5, 1, 2, 2, 3, 3, 3, 5, 4, 4, 5, 5, 5, 6, 7, 5, 9, 8, 9, 9, 8, 7, 11, 14, 13, 13, 11, 10, 9, 17, 20, 17, 15, 13, 12, 11, 8, 8, 8, 9, 9, 8, 5, 10, 10, 9, 10, 10, 9, 5, 10, 11, 11, 11, 12, 11, 6, 10, 14, 13, 14, 14, 13, 9, 12, 18, 18, 18, 18, 17, 11, 16, 21, 22, 21, 20, 19, 13, 19, 24, 24, 22, 21, 20, 16, 17, 18, 18, 18, 15, 11, 7, 17, 20, 19, 19, 16, 12, 7, 17, 22, 22, 21, 19, 14, 9, 17, 22, 23, 22, 20, 17, 13, 18, 24, 26, 24, 23, 20, 15, 21, 26, 29, 28, 24, 21, 17, 23, 28, 30, 29, 26, 22, 18, 25, 28, 26, 22, 19, 14, 9, 24, 28, 28, 24, 20, 16, 10, 24, 29, 31, 24, 21, 17, 13, 24, 29, 31, 26, 23, 20, 17, 25, 28, 32, 30, 25, 22, 18, 27, 29, 33, 32, 27, 23, 20, 28, 31, 33, 34, 29, 24, 21, 2, 2, 3, 5, 5, 3, 2, 2, 2, 3, 4, 5, 2, 2, 2, 2, 2, 3, 3, 2, 1, 0, 2, 2, 2, 3, 2, 3, 2, 2, 3, 3, 4, 3, 3, 6, 6, 7, 6, 4, 3, 3, 12, 11, 8, 6, 5, 3, 3, 1, 2, 3, 3, 3, 2, 2, 1, 2, 2, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 3, 4, 3, 4, 4, 4, 3, 3, 9, 8, 8, 7, 5, 3, 3, 16, 13, 10, 8, 5, 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 3, 2, 2, 2, 1, 2, 2, 5, 6, 5, 5, 5, 5, 4, 5, 12, 10, 10, 8, 7, 5, 5, 18, 17, 12, 10, 8, 7, 6, 2, 3, 3, 3, 4, 4, 7, 2, 4, 4, 5, 5, 5, 8, 5, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 9, 9, 9, 9, 13, 12, 12, 13, 12, 11, 12, 18, 16, 16, 15, 13, 12, 18, 23, 20, 18, 17, 15, 14, 11, 11, 11, 11, 11, 11, 7, 12, 13, 12, 13, 13, 12, 7, 12, 14, 14, 14, 14, 13, 9, 13, 18, 17, 17, 18, 16, 13, 16, 22, 22, 21, 22, 19, 14, 19, 26, 27, 26, 24, 22, 16, 24, 29, 31, 28, 26, 23, 18, 19, 21, 20, 20, 17, 13, 9, 20, 23, 22, 23, 19, 14, 10, 20, 25, 25, 24, 20, 16, 12, 20, 26, 28, 28, 24, 20, 16, 23, 28, 32, 32, 29, 23, 18, 26, 32, 37, 37, 31, 25, 20, 28, 34, 39, 39, 33, 28, 22, 28, 34, 32, 26, 20, 16, 12, 28, 34, 34, 27, 22, 17, 13, 27, 34, 38, 30, 24, 20, 16, 28, 34, 39, 34, 28, 23, 20, 30, 36, 41, 39, 32, 28, 22, 32, 38, 44, 41, 36, 30, 24, 34, 40, 45, 43, 38, 31, 25, 2, 4, 5, 6, 6, 5, 4, 1, 4, 5, 6, 6, 5, 4, 0, 3, 5, 5, 5, 4, 4, 1, 2, 4, 5, 5, 5, 6, 3, 4, 6, 6, 7, 6, 6, 8, 8, 9, 9, 8, 6, 6, 13, 12, 11, 9, 8, 6, 6, 0, 3, 5, 5, 5, 4, 2, 1, 2, 4, 5, 5, 4, 2, 1, 1, 4, 4, 4, 3, 2, 2, 2, 3, 5, 4, 5, 5, 5, 4, 6, 7, 7, 6, 5, 9, 9, 10, 10, 8, 6, 5, 17, 14, 11, 10, 8, 6, 5, 1, 1, 2, 3, 3, 1, 4, 2, 1, 2, 2, 2, 1, 4, 2, 1, 0, 0, 0, 0, 5, 4, 2, 3, 3, 3, 3, 6, 8, 6, 7, 7, 7, 6, 6, 13, 11, 11, 10, 9, 7, 6, 19, 18, 14, 12, 10, 9, 8, 2, 4, 5, 5, 5, 5, 7, 4, 5, 5, 6, 6, 6, 8, 8, 6, 7, 7, 7, 8, 8, 10, 9, 10, 10, 11, 11, 10, 11, 14, 14, 15, 15, 14, 13, 13, 20, 19, 18, 17, 15, 15, 19, 26, 22, 20, 18, 17, 16, 12, 13, 12, 13, 13, 12, 7, 13, 14, 14, 14, 14, 13, 8, 14, 16, 16, 16, 16, 15, 11, 13, 20, 19, 19, 20, 18, 15, 18, 25, 24, 24, 24, 21, 16, 22, 28, 30, 28, 26, 23, 18, 26, 31, 33, 29, 28, 25, 20, 22, 23, 22, 22, 18, 14, 10, 22, 25, 24, 24, 20, 16, 12, 22, 27, 26, 26, 23, 18, 14, 21, 29, 30, 29, 26, 22, 18, 26, 31, 36, 34, 30, 25, 20, 27, 34, 39, 38, 33, 27, 21, 31, 37, 41, 41, 34, 28, 23, 29, 35, 34, 27, 22, 17, 13, 29, 36, 36, 29, 24, 19, 14, 29, 36, 39, 32, 26, 22, 17, 30, 36, 42, 35, 30, 26, 22, 31, 38, 44, 41, 33, 29, 24, 34, 40, 47, 47, 38, 30, 26, 37, 43, 47, 47, 39, 33, 27, 2, 6, 9, 11, 11, 10, 7, 2, 5, 8, 11, 11, 9, 6, 0, 3, 7, 9, 10, 7, 6, 1, 2, 5, 7, 9, 8, 7, 3, 4, 6, 8, 10, 9, 7, 7, 8, 10, 10, 10, 9, 7, 14, 13, 11, 10, 10, 9, 7, 0, 3, 7, 10, 9, 6, 3, 1, 2, 5, 8, 9, 6, 2, 1, 1, 4, 6, 6, 4, 2, 2, 2, 4, 6, 6, 5, 4, 4, 5, 6, 8, 7, 6, 4, 10, 9, 10, 10, 8, 6, 4, 17, 14, 11, 11, 8, 6, 4, 1, 1, 2, 3, 4, 3, 5, 2, 0, 2, 2, 3, 2, 4, 2, 1, 0, 0, 0, 0, 3, 4, 2, 3, 3, 3, 3, 5, 8, 6, 7, 7, 7, 6, 5, 13, 11, 11, 10, 9, 7, 5, 19, 17, 14, 12, 10, 9, 8, 2, 4, 5, 5, 6, 6, 8, 5, 5, 6, 6, 7, 7, 7, 10, 6, 7, 7, 7, 7, 7, 11, 9, 10, 11, 11, 10, 9, 12, 14, 14, 15, 14, 14, 12, 13, 20, 19, 18, 17, 16, 14, 19, 26, 23, 21, 18, 17, 16, 12, 13, 12, 13, 14, 13, 8, 15, 14, 14, 15, 15, 14, 7, 14, 16, 16, 16, 15, 14, 11, 14, 20, 19, 19, 20, 17, 14, 17, 25, 24, 23, 24, 21, 16, 21, 28, 30, 28, 26, 23, 18, 25, 31, 33, 30, 27, 25, 20, 22, 24, 22, 22, 19, 16, 12, 21, 26, 24, 24, 20, 16, 12, 22, 28, 26, 26, 21, 18, 14, 22, 29, 30, 30, 26, 22, 18, 25, 33, 36, 34, 30, 25, 19, 28, 34, 41, 38, 33, 27, 22, 31, 37, 42, 41, 36, 29, 23, 30, 35, 34, 28, 23, 18, 14, 29, 36, 36, 30, 23, 19, 14, 30, 35, 38, 32, 26, 21, 17, 29, 37, 41, 35, 31, 25, 21, 32, 39, 45, 39, 34, 29, 23, 34, 41, 47, 46, 38, 31, 26, 37, 43, 47, 46, 40, 33, 27, 3, 6, 9, 13, 13, 10, 7, 2, 5, 8, 12, 12, 9, 6, 0, 4, 7, 10, 11, 8, 6, 1, 3, 5, 8, 10, 9, 7, 4, 4, 6, 8, 11, 9, 7, 7, 8, 10, 10, 10, 9, 7, 13, 12, 10, 10, 10, 9, 7, 1, 4, 7, 10, 10, 7, 3, 1, 2, 6, 9, 9, 6, 2, 1, 1, 5, 7, 7, 4, 2, 1, 2, 4, 6, 6, 5, 4, 4, 5, 6, 8, 7, 5, 4, 10, 9, 10, 10, 7, 6, 4, 16, 14, 11, 10, 8, 6, 4, 1, 1, 3, 4, 5, 3, 4, 1, 1, 2, 2, 3, 2, 3, 2, 1, 0, 0, 0, 1, 3, 4, 2, 3, 3, 3, 3, 4, 8, 6, 7, 7, 7, 6, 4, 13, 12, 11, 10, 9, 7, 4, 19, 17, 14, 12, 10, 9, 8, 1, 5, 5, 5, 6, 6, 8, 5, 6, 6, 6, 7, 7, 7, 9, 6, 7, 7, 7, 7, 6, 11, 8, 11, 11, 10, 11, 8, 12, 14, 15, 15, 15, 14, 12, 13, 19, 19, 18, 17, 15, 14, 19, 26, 23, 20, 19, 17, 16, 12, 13, 13, 13, 14, 13, 8, 14, 15, 14, 14, 15, 13, 7, 15, 16, 16, 16, 16, 14, 11, 14, 20, 20, 20, 20, 18, 14, 17, 25, 25, 24, 23, 21, 16, 22, 29, 30, 28, 26, 23, 18, 26, 32, 33, 31, 28, 25, 20, 22, 23, 23, 23, 20, 16, 11, 22, 26, 24, 24, 21, 16, 12, 23, 29, 27, 26, 22, 17, 14, 23, 29, 31, 29, 26, 22, 18, 25, 32, 37, 34, 30, 25, 19, 28, 35, 41, 38, 33, 27, 22, 31, 36, 41, 40, 34, 30, 23, 31, 35, 33, 27, 22, 18, 14, 30, 36, 36, 29, 23, 18, 14, 29, 36, 38, 31, 25, 21, 17, 31, 36, 40, 35, 30, 26, 22, 32, 38, 43, 40, 34, 29, 23, 36, 41, 45, 45, 37, 31, 25, 37, 43, 46, 46, 40, 34, 27, 3, 6, 8, 9, 9, 7, 5, 2, 6, 7, 9, 9, 6, 4, 1, 4, 6, 8, 8, 6, 5, 1, 3, 5, 7, 9, 8, 6, 4, 4, 7, 8, 11, 9, 6, 8, 8, 10, 10, 10, 9, 6, 13, 12, 10, 10, 10, 9, 6, 0, 4, 6, 8, 7, 5, 3, 1, 3, 5, 7, 6, 4, 2, 1, 1, 5, 6, 4, 3, 2, 2, 2, 4, 6, 5, 5, 4, 5, 5, 6, 8, 7, 6, 4, 10, 9, 10, 10, 7, 6, 4, 16, 13, 11, 10, 8, 6, 4, 1, 1, 3, 3, 4, 3, 5, 2, 1, 2, 3, 3, 2, 3, 2, 1, 0, 0, 0, 0, 2, 4, 2, 3, 3, 3, 3, 4, 9, 7, 7, 7, 7, 6, 4, 14, 11, 11, 10, 9, 7, 4, 18, 16, 13, 11, 10, 9, 8, 2, 5, 5, 6, 6, 6, 8, 5, 6, 6, 6, 7, 7, 6, 9, 6, 7, 7, 8, 7, 6, 11, 8, 11, 11, 10, 11, 8, 12, 14, 15, 14, 15, 14, 11, 13, 20, 19, 18, 16, 16, 14, 18, 25, 22, 20, 18, 17, 16, 13, 13, 13, 13, 14, 13, 8, 15, 15, 14, 15, 15, 13, 7, 15, 16, 16, 16, 16, 14, 10, 15, 20, 20, 20, 20, 18, 15, 18, 25, 24, 23, 24, 21, 16, 22, 28, 29, 28, 26, 23, 18, 25, 30, 32, 29, 28, 25, 20, 23, 24, 23, 22, 19, 16, 11, 23, 26, 24, 22, 20, 16, 11, 23, 28, 26, 24, 21, 18, 14, 22, 29, 31, 28, 25, 22, 18, 25, 31, 35, 34, 29, 24, 19, 28, 33, 39, 37, 31, 26, 22, 31, 35, 41, 39, 33, 27, 23, 29, 34, 32, 26, 22, 18, 14, 30, 34, 33, 27, 22, 18, 14, 29, 33, 36, 29, 24, 21, 17, 29, 34, 39, 34, 29, 26, 21, 32, 37, 42, 38, 34, 27, 23, 34, 40, 44, 44, 35, 29, 25, 37, 41, 45, 45, 37, 31, 27, 7, 9, 11, 13, 13, 11, 8, 6, 8, 10, 12, 13, 10, 6, 5, 7, 9, 11, 11, 8, 6, 3, 6, 7, 10, 12, 10, 8, 4, 6, 8, 10, 13, 10, 8, 7, 8, 9, 10, 12, 10, 7, 11, 10, 9, 9, 11, 11, 8, 5, 7, 9, 11, 10, 7, 5, 4, 6, 8, 10, 9, 6, 4, 1, 6, 7, 9, 7, 5, 3, 0, 4, 6, 8, 7, 6, 5, 4, 5, 7, 8, 8, 7, 5, 9, 8, 9, 10, 7, 7, 5, 13, 11, 10, 9, 8, 6, 5, 2, 6, 6, 6, 6, 5, 4, 0, 4, 5, 5, 5, 4, 2, 1, 3, 5, 3, 3, 3, 0, 1, 2, 3, 3, 3, 3, 2, 6, 6, 6, 5, 5, 4, 2, 12, 10, 8, 8, 6, 4, 2, 15, 13, 10, 8, 6, 5, 3, 1, 2, 3, 3, 4, 5, 6, 1, 3, 3, 4, 4, 4, 5, 4, 5, 4, 4, 4, 4, 4, 7, 7, 7, 6, 6, 6, 5, 8, 12, 11, 10, 10, 9, 8, 12, 16, 14, 13, 12, 11, 10, 15, 20, 16, 14, 14, 12, 11, 11, 10, 10, 10, 11, 10, 6, 12, 12, 11, 11, 12, 10, 5, 12, 14, 13, 12, 12, 10, 7, 12, 17, 15, 15, 15, 13, 10, 15, 22, 20, 19, 18, 16, 12, 19, 23, 25, 22, 20, 18, 13, 20, 25, 27, 24, 22, 19, 15, 19, 19, 18, 17, 15, 12, 9, 19, 22, 19, 18, 16, 12, 8, 19, 23, 21, 19, 16, 13, 10, 19, 23, 24, 22, 19, 17, 13, 21, 27, 29, 27, 23, 20, 15, 24, 28, 34, 29, 25, 20, 17, 26, 30, 34, 34, 27, 23, 18, 25, 28, 26, 20, 17, 14, 11, 25, 28, 28, 22, 18, 14, 11, 25, 28, 30, 23, 19, 16, 12, 25, 29, 32, 27, 23, 19, 16, 27, 31, 36, 33, 27, 22, 18, 29, 33, 38, 36, 29, 24, 20, 30, 36, 38, 38, 32, 26, 21, 6, 10, 15, 18, 18, 17, 15, 5, 9, 13, 16, 17, 15, 12, 3, 7, 11, 14, 15, 13, 10, 2, 5, 8, 11, 13, 13, 9, 2, 2, 6, 9, 11, 13, 10, 5, 5, 5, 8, 11, 13, 10, 11, 10, 6, 6, 10, 13, 9, 3, 7, 12, 15, 15, 13, 10, 2, 6, 10, 13, 15, 13, 7, 2, 4, 8, 11, 12, 10, 4, 2, 2, 5, 8, 8, 8, 3, 2, 3, 3, 6, 7, 7, 3, 7, 7, 6, 5, 5, 6, 3, 14, 12, 9, 5, 4, 4, 3, 2, 4, 7, 9, 10, 9, 4, 2, 3, 5, 7, 8, 7, 2, 1, 2, 4, 5, 4, 4, 1, 0, 2, 1, 1, 2, 1, 2, 4, 4, 4, 4, 4, 3, 2, 10, 10, 9, 8, 6, 3, 2, 16, 15, 11, 9, 7, 4, 2, 1, 1, 1, 2, 2, 3, 3, 0, 1, 1, 1, 1, 1, 4, 1, 1, 2, 2, 2, 2, 4, 3, 3, 3, 4, 4, 4, 5, 5, 8, 7, 8, 8, 7, 6, 10, 13, 12, 12, 10, 9, 8, 16, 18, 15, 13, 12, 11, 10, 7, 7, 8, 8, 9, 7, 3, 9, 9, 9, 10, 9, 8, 4, 9, 10, 11, 11, 11, 10, 5, 9, 13, 13, 13, 13, 12, 8, 11, 16, 16, 16, 15, 15, 10, 14, 19, 19, 18, 17, 16, 12, 18, 21, 21, 19, 18, 17, 14, 16, 16, 16, 16, 14, 11, 6, 16, 19, 17, 17, 15, 12, 7, 16, 20, 19, 18, 16, 13, 8, 15, 20, 20, 19, 17, 15, 12, 17, 21, 23, 21, 19, 17, 14, 19, 22, 25, 24, 21, 18, 15, 21, 23, 27, 25, 22, 18, 16, 21, 25, 23, 19, 17, 14, 9, 21, 25, 26, 20, 17, 15, 10, 22, 25, 27, 21, 18, 15, 12, 21, 24, 28, 22, 18, 17, 15, 20, 25, 29, 26, 21, 19, 16, 22, 26, 29, 28, 23, 20, 17, 24, 27, 30, 30, 24, 21, 18, 3, 3, 5, 8, 8, 6, 3, 2, 3, 4, 7, 8, 5, 3, 2, 3, 4, 5, 6, 4, 2, 2, 2, 3, 3, 4, 2, 2, 1, 2, 2, 2, 3, 2, 2, 5, 5, 5, 4, 3, 2, 2, 11, 9, 7, 5, 3, 2, 2, 2, 3, 4, 6, 5, 4, 3, 2, 3, 4, 5, 5, 3, 2, 1, 2, 3, 3, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 7, 6, 7, 6, 3, 2, 2, 14, 12, 8, 6, 4, 2, 2, 1, 2, 3, 3, 3, 3, 3, 1, 2, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 2, 4, 4, 3, 3, 4, 2, 3, 10, 9, 8, 7, 5, 3, 3, 17, 15, 11, 8, 6, 5, 4, 2, 3, 3, 4, 4, 4, 7, 2, 4, 4, 5, 5, 5, 8, 3, 5, 5, 6, 6, 6, 8, 5, 6, 6, 6, 7, 7, 8, 6, 10, 10, 10, 10, 10, 9, 10, 16, 15, 14, 13, 11, 11, 16, 21, 18, 16, 14, 13, 12, 10, 11, 11, 11, 12, 11, 7, 11, 12, 12, 12, 13, 12, 8, 12, 13, 14, 14, 14, 13, 9, 12, 16, 16, 15, 15, 15, 11, 14, 20, 19, 19, 19, 17, 12, 17, 23, 25, 24, 22, 20, 14, 20, 27, 29, 26, 24, 22, 16, 19, 21, 21, 20, 18, 14, 9, 20, 23, 23, 23, 19, 14, 10, 19, 25, 25, 24, 21, 16, 11, 19, 24, 26, 26, 22, 18, 14, 21, 26, 31, 29, 27, 21, 16, 23, 29, 34, 34, 28, 24, 17, 26, 31, 35, 34, 31, 25, 20, 28, 34, 32, 26, 22, 17, 12, 27, 34, 34, 28, 23, 18, 13, 27, 33, 37, 30, 24, 19, 14, 28, 33, 38, 31, 26, 22, 18, 27, 34, 39, 36, 30, 25, 19, 29, 36, 39, 39, 33, 27, 22, 33, 37, 39, 41, 34, 30, 24, 5, 8, 9, 10, 10, 9, 8, 4, 7, 9, 10, 9, 8, 7, 3, 6, 8, 8, 8, 7, 5, 2, 4, 6, 6, 7, 5, 4, 1, 2, 4, 5, 5, 5, 4, 5, 5, 7, 6, 5, 5, 4, 10, 10, 8, 7, 6, 5, 4, 3, 6, 8, 9, 8, 8, 6, 2, 5, 7, 9, 8, 7, 5, 1, 4, 7, 7, 7, 6, 4, 1, 2, 4, 5, 5, 4, 3, 2, 2, 4, 5, 4, 4, 3, 7, 6, 8, 7, 5, 4, 3, 14, 11, 9, 8, 5, 4, 3, 2, 4, 6, 6, 7, 5, 6, 1, 2, 5, 5, 6, 5, 5, 1, 2, 3, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0, 3, 5, 4, 3, 3, 3, 3, 3, 10, 9, 8, 7, 5, 4, 3, 16, 15, 11, 8, 7, 6, 5, 1, 4, 5, 5, 6, 6, 9, 2, 5, 5, 6, 7, 7, 8, 4, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 11, 11, 11, 11, 10, 10, 10, 17, 16, 14, 13, 12, 11, 16, 22, 19, 17, 15, 14, 13, 11, 12, 12, 12, 13, 12, 8, 12, 13, 14, 14, 14, 13, 8, 12, 15, 15, 15, 15, 13, 9, 12, 17, 16, 16, 16, 15, 11, 15, 21, 21, 20, 20, 18, 13, 18, 25, 26, 25, 22, 19, 14, 23, 27, 29, 26, 25, 22, 16, 21, 22, 22, 22, 19, 15, 11, 21, 25, 24, 24, 20, 15, 11, 21, 26, 25, 25, 20, 16, 12, 21, 26, 27, 26, 23, 18, 14, 21, 28, 31, 31, 27, 21, 16, 24, 30, 37, 35, 29, 23, 18, 28, 33, 37, 38, 31, 25, 20, 29, 33, 34, 27, 22, 18, 13, 28, 36, 36, 29, 23, 18, 14, 28, 35, 38, 30, 24, 19, 14, 28, 34, 39, 32, 26, 22, 18, 29, 35, 42, 38, 32, 26, 20, 31, 37, 43, 41, 34, 27, 22, 33, 39, 44, 44, 37, 30, 23, 5, 9, 12, 15, 15, 13, 10, 4, 8, 11, 14, 15, 12, 9, 3, 6, 10, 13, 13, 10, 7, 2, 4, 7, 10, 11, 8, 7, 1, 2, 5, 8, 10, 9, 7, 5, 5, 7, 8, 9, 8, 7, 10, 10, 8, 8, 8, 8, 7, 3, 7, 10, 13, 12, 10, 7, 2, 5, 9, 12, 12, 9, 5, 1, 4, 8, 10, 10, 7, 4, 1, 2, 5, 7, 7, 5, 3, 3, 2, 4, 6, 6, 6, 3, 7, 6, 8, 8, 6, 5, 3, 13, 12, 9, 8, 6, 4, 3, 1, 4, 6, 7, 8, 6, 6, 1, 2, 5, 6, 6, 5, 4, 1, 1, 3, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0, 3, 5, 4, 3, 3, 3, 3, 3, 10, 8, 8, 7, 5, 4, 3, 16, 14, 11, 9, 7, 5, 5, 1, 4, 5, 5, 6, 7, 8, 1, 5, 6, 6, 7, 7, 7, 5, 6, 6, 6, 6, 7, 7, 8, 7, 7, 7, 7, 7, 6, 9, 11, 11, 11, 11, 11, 9, 11, 17, 16, 15, 13, 12, 11, 16, 22, 19, 17, 15, 14, 12, 11, 12, 12, 13, 14, 13, 9, 12, 14, 13, 14, 15, 13, 8, 12, 15, 15, 14, 15, 13, 9, 12, 17, 16, 16, 16, 15, 11, 15, 22, 20, 20, 20, 18, 12, 18, 25, 27, 25, 22, 19, 14, 23, 28, 29, 27, 25, 22, 16, 21, 22, 22, 22, 19, 15, 11, 21, 24, 24, 24, 20, 15, 11, 21, 26, 26, 25, 20, 16, 11, 21, 26, 28, 26, 22, 18, 15, 22, 27, 31, 30, 26, 21, 16, 25, 31, 37, 35, 29, 23, 18, 28, 33, 37, 37, 32, 25, 20, 29, 35, 33, 27, 22, 18, 14, 29, 36, 36, 30, 23, 19, 14, 30, 35, 38, 30, 24, 19, 14, 29, 35, 40, 33, 27, 22, 18, 28, 35, 40, 38, 31, 25, 20, 31, 37, 43, 40, 34, 27, 22, 33, 40, 44, 43, 37, 29, 23, 6, 9, 13, 16, 16, 14, 10, 5, 8, 11, 15, 15, 12, 9, 3, 6, 10, 13, 14, 11, 7, 2, 4, 7, 10, 12, 9, 6, 1, 3, 5, 8, 11, 9, 6, 5, 6, 7, 8, 10, 9, 6, 10, 9, 8, 8, 9, 9, 6, 3, 7, 10, 13, 13, 10, 7, 2, 6, 9, 12, 12, 9, 5, 1, 4, 8, 10, 10, 7, 3, 1, 2, 5, 7, 7, 5, 2, 3, 2, 4, 6, 6, 5, 2, 7, 6, 8, 8, 5, 5, 2, 13, 10, 9, 8, 6, 4, 3, 1, 4, 6, 7, 8, 6, 6, 1, 3, 5, 6, 6, 5, 4, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 3, 5, 4, 4, 4, 4, 3, 3, 11, 9, 8, 7, 6, 4, 3, 15, 13, 10, 9, 7, 6, 5, 1, 5, 5, 6, 6, 7, 9, 2, 6, 6, 6, 7, 7, 7, 5, 6, 7, 7, 7, 7, 6, 8, 7, 8, 7, 7, 7, 6, 9, 11, 12, 11, 12, 10, 9, 11, 17, 16, 15, 13, 12, 11, 15, 21, 19, 17, 15, 14, 13, 11, 13, 13, 13, 14, 13, 9, 12, 14, 14, 14, 15, 13, 8, 12, 16, 15, 15, 15, 13, 10, 13, 18, 17, 17, 16, 15, 11, 14, 22, 21, 21, 21, 18, 13, 19, 26, 27, 25, 22, 20, 15, 22, 27, 29, 27, 25, 22, 16, 21, 24, 22, 22, 19, 16, 11, 22, 26, 25, 24, 21, 16, 11, 21, 28, 26, 25, 20, 16, 12, 21, 27, 27, 27, 23, 19, 15, 23, 28, 34, 31, 27, 22, 16, 25, 31, 37, 35, 28, 24, 18, 28, 33, 37, 37, 32, 26, 19, 31, 35, 33, 29, 22, 18, 14, 30, 36, 36, 30, 23, 18, 15, 29, 35, 37, 31, 24, 20, 14, 31, 36, 39, 33, 28, 22, 18, 29, 35, 40, 37, 32, 26, 20, 31, 38, 42, 41, 34, 27, 22, 34, 39, 44, 43, 37, 31, 24, 6, 9, 12, 16, 16, 13, 11, 5, 8, 12, 15, 16, 12, 9, 3, 7, 10, 13, 14, 11, 7, 2, 5, 8, 10, 13, 9, 6, 1, 3, 6, 8, 12, 10, 7, 5, 5, 7, 8, 11, 10, 6, 8, 7, 7, 7, 9, 9, 7, 3, 7, 10, 13, 13, 10, 7, 2, 6, 9, 12, 12, 9, 5, 1, 4, 8, 10, 10, 7, 3, 1, 2, 5, 7, 7, 5, 3, 3, 2, 4, 6, 6, 5, 3, 7, 6, 7, 7, 5, 5, 3, 11, 8, 7, 7, 5, 4, 3, 2, 5, 6, 7, 8, 6, 6, 1, 3, 5, 6, 6, 5, 4, 1, 2, 4, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 2, 6, 4, 4, 4, 4, 3, 2, 9, 8, 6, 6, 5, 4, 2, 13, 10, 8, 7, 7, 6, 5, 1, 5, 5, 6, 6, 7, 9, 2, 6, 6, 7, 7, 7, 7, 6, 6, 7, 7, 7, 7, 6, 8, 7, 8, 8, 7, 8, 6, 9, 12, 12, 11, 11, 10, 9, 10, 15, 15, 14, 13, 12, 11, 12, 18, 17, 15, 14, 14, 13, 12, 13, 13, 13, 14, 13, 9, 13, 14, 14, 15, 15, 13, 7, 13, 16, 16, 15, 15, 13, 10, 13, 18, 17, 16, 17, 15, 11, 15, 23, 21, 21, 20, 18, 13, 18, 24, 26, 24, 22, 20, 14, 20, 25, 28, 25, 23, 22, 16, 22, 24, 22, 21, 19, 15, 11, 22, 25, 24, 23, 20, 16, 12, 22, 28, 26, 24, 20, 16, 12, 22, 26, 27, 25, 22, 19, 15, 23, 29, 33, 30, 25, 22, 16, 25, 30, 35, 33, 28, 23, 18, 26, 31, 36, 36, 30, 25, 20, 30, 34, 31, 26, 22, 18, 14, 30, 33, 33, 28, 22, 19, 14, 29, 33, 35, 28, 23, 19, 15, 29, 34, 37, 30, 26, 22, 18, 29, 34, 39, 36, 29, 24, 21, 31, 36, 40, 39, 32, 27, 21, 32, 37, 40, 40, 33, 27, 23, 8, 11, 13, 15, 15, 13, 10, 7, 10, 12, 15, 15, 12, 8, 6, 8, 11, 13, 14, 10, 7, 5, 7, 9, 10, 12, 9, 6, 2, 5, 7, 9, 12, 9, 6, 3, 5, 6, 8, 11, 9, 6, 4, 5, 6, 8, 10, 9, 6, 6, 8, 11, 13, 12, 10, 7, 6, 8, 10, 12, 12, 8, 5, 4, 7, 9, 10, 9, 7, 4, 2, 5, 7, 8, 7, 5, 3, 1, 3, 6, 7, 6, 5, 3, 3, 4, 5, 6, 6, 5, 3, 6, 5, 5, 6, 5, 4, 3, 4, 7, 7, 7, 8, 7, 6, 2, 6, 7, 7, 6, 5, 4, 1, 5, 5, 5, 4, 4, 2, 2, 2, 3, 3, 3, 2, 0, 3, 3, 2, 2, 2, 1, 0, 5, 4, 3, 2, 3, 1, 0, 9, 5, 4, 3, 2, 2, 2, 2, 4, 4, 5, 6, 8, 8, 1, 5, 4, 5, 6, 5, 6, 1, 6, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 4, 5, 8, 7, 7, 7, 7, 6, 6, 10, 9, 8, 8, 8, 7, 9, 14, 12, 10, 10, 9, 9, 11, 11, 11, 11, 12, 11, 8, 12, 13, 12, 12, 12, 11, 6, 12, 14, 14, 13, 12, 11, 7, 12, 16, 14, 13, 13, 12, 8, 13, 18, 16, 16, 15, 14, 9, 14, 19, 20, 18, 16, 14, 10, 15, 20, 22, 21, 18, 16, 12, 19, 21, 18, 18, 16, 13, 9, 19, 22, 20, 19, 17, 13, 9, 20, 24, 22, 20, 16, 13, 10, 20, 24, 23, 21, 17, 15, 11, 19, 24, 26, 24, 21, 16, 12, 20, 24, 30, 27, 23, 17, 14, 21, 26, 29, 30, 25, 19, 14, 26, 30, 27, 22, 18, 14, 12, 26, 30, 30, 23, 18, 15, 12, 26, 30, 32, 24, 19, 16, 12, 26, 30, 33, 26, 21, 16, 14, 25, 29, 34, 30, 24, 19, 15, 25, 30, 35, 34, 27, 21, 16, 27, 32, 36, 35, 29, 23, 17, 9, 13, 17, 22, 21, 18, 16, 8, 12, 16, 20, 21, 18, 15, 7, 10, 14, 18, 20, 17, 13, 6, 9, 12, 15, 17, 15, 11, 4, 5, 8, 11, 13, 14, 12, 2, 3, 6, 10, 12, 14, 12, 7, 5, 5, 8, 12, 13, 11, 7, 10, 15, 18, 18, 15, 13, 6, 9, 13, 16, 17, 15, 11, 5, 8, 11, 14, 15, 13, 9, 5, 6, 9, 11, 12, 11, 6, 2, 3, 5, 8, 9, 10, 6, 3, 3, 4, 6, 8, 8, 6, 10, 8, 4, 5, 6, 6, 5, 5, 8, 10, 11, 13, 11, 8, 5, 7, 9, 10, 11, 10, 7, 4, 6, 7, 8, 9, 8, 6, 4, 4, 5, 5, 5, 6, 3, 0, 2, 1, 1, 1, 2, 3, 6, 6, 5, 4, 1, 2, 3, 11, 10, 7, 5, 2, 1, 2, 5, 6, 6, 7, 7, 8, 7, 4, 5, 6, 6, 7, 7, 7, 3, 5, 6, 6, 6, 6, 6, 2, 3, 3, 4, 4, 4, 3, 2, 3, 4, 4, 4, 3, 3, 6, 8, 7, 7, 6, 5, 5, 11, 13, 9, 8, 8, 7, 6, 6, 7, 7, 7, 8, 7, 7, 7, 8, 8, 9, 9, 7, 7, 7, 10, 10, 10, 11, 9, 6, 7, 11, 10, 10, 10, 10, 5, 7, 11, 10, 10, 10, 10, 6, 9, 13, 13, 12, 11, 10, 8, 12, 15, 15, 13, 12, 11, 9, 14, 15, 14, 14, 13, 9, 7, 14, 16, 15, 15, 14, 11, 6, 14, 17, 16, 16, 14, 11, 7, 14, 16, 16, 15, 14, 11, 8, 13, 15, 17, 16, 14, 11, 9, 13, 16, 20, 18, 14, 12, 10, 15, 18, 20, 19, 16, 13, 10, 18, 23, 21, 17, 15, 12, 8, 18, 22, 23, 18, 16, 13, 9, 18, 23, 24, 18, 16, 13, 10, 19, 22, 24, 19, 15, 13, 10, 17, 20, 23, 20, 16, 13, 11, 17, 20, 23, 22, 18, 14, 11, 18, 22, 24, 24, 19, 15, 12, 7, 8, 10, 12, 12, 11, 9, 6, 8, 9, 12, 12, 9, 8, 6, 7, 8, 10, 11, 8, 6, 6, 6, 6, 7, 9, 6, 3, 3, 3, 4, 4, 4, 3, 2, 1, 2, 2, 2, 3, 3, 2, 7, 6, 3, 2, 3, 3, 2, 6, 7, 8, 10, 10, 9, 8, 6, 7, 8, 10, 9, 8, 7, 5, 6, 7, 8, 8, 7, 5, 4, 5, 5, 6, 5, 5, 2, 2, 2, 2, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 10, 8, 5, 3, 1, 2, 2, 5, 6, 7, 8, 9, 9, 8, 4, 6, 7, 8, 8, 8, 8, 4, 5, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 3, 2, 0, 1, 1, 1, 2, 3, 6, 5, 5, 3, 1, 1, 2, 12, 11, 7, 4, 2, 1, 2, 4, 6, 7, 8, 9, 9, 9, 4, 5, 7, 8, 8, 8, 9, 3, 5, 6, 7, 7, 7, 7, 4, 4, 5, 5, 5, 5, 5, 3, 6, 6, 6, 7, 7, 7, 6, 12, 11, 10, 9, 7, 8, 12, 17, 14, 12, 10, 9, 9, 9, 10, 10, 10, 11, 10, 9, 10, 11, 11, 12, 12, 11, 9, 11, 12, 13, 13, 13, 12, 8, 10, 14, 13, 14, 14, 13, 8, 11, 16, 16, 16, 16, 14, 9, 13, 19, 21, 20, 19, 16, 11, 17, 22, 24, 22, 20, 18, 12, 18, 20, 20, 20, 17, 13, 9, 18, 22, 22, 22, 19, 14, 9, 18, 24, 24, 24, 19, 15, 10, 19, 23, 25, 24, 21, 16, 11, 17, 23, 27, 25, 23, 18, 13, 19, 25, 31, 28, 25, 20, 14, 23, 28, 31, 30, 26, 22, 16, 27, 33, 32, 26, 21, 16, 11, 26, 32, 33, 28, 23, 17, 12, 27, 32, 35, 28, 23, 18, 13, 26, 32, 36, 29, 25, 19, 14, 26, 31, 33, 31, 26, 22, 16, 25, 30, 35, 33, 28, 23, 18, 27, 31, 34, 35, 30, 25, 20, 9, 11, 12, 14, 13, 13, 12, 8, 11, 12, 13, 13, 11, 10, 6, 10, 11, 12, 12, 10, 8, 5, 8, 9, 10, 10, 8, 5, 2, 5, 6, 6, 6, 5, 4, 1, 3, 4, 5, 5, 5, 4, 7, 7, 5, 4, 5, 5, 4, 6, 10, 11, 13, 12, 12, 10, 5, 9, 11, 12, 12, 11, 9, 4, 7, 10, 11, 10, 9, 7, 4, 5, 7, 8, 8, 7, 4, 2, 2, 4, 5, 5, 4, 4, 4, 3, 5, 4, 4, 4, 4, 10, 8, 6, 5, 3, 4, 4, 5, 7, 9, 10, 11, 10, 10, 4, 6, 8, 9, 10, 8, 8, 4, 5, 7, 7, 7, 7, 6, 4, 3, 3, 3, 4, 4, 2, 2, 1, 0, 0, 0, 1, 2, 6, 5, 4, 3, 2, 1, 2, 12, 10, 7, 5, 4, 3, 2, 4, 6, 7, 8, 10, 11, 10, 3, 6, 7, 8, 9, 9, 9, 3, 6, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 7, 6, 4, 8, 7, 8, 8, 8, 8, 7, 13, 12, 11, 10, 9, 9, 12, 18, 15, 13, 11, 10, 10, 11, 12, 12, 12, 13, 12, 10, 11, 13, 13, 13, 14, 12, 9, 12, 14, 14, 14, 14, 13, 9, 11, 16, 15, 15, 15, 14, 9, 12, 18, 17, 17, 17, 15, 11, 14, 20, 21, 21, 19, 16, 12, 18, 23, 26, 23, 21, 18, 13, 20, 22, 22, 22, 19, 15, 11, 19, 24, 23, 24, 19, 15, 11, 20, 26, 24, 24, 20, 15, 11, 20, 25, 26, 26, 21, 17, 12, 19, 25, 29, 27, 23, 18, 13, 20, 26, 32, 32, 26, 19, 14, 23, 29, 33, 35, 28, 22, 16, 27, 35, 33, 28, 21, 17, 13, 29, 34, 36, 29, 23, 18, 13, 28, 35, 38, 30, 24, 19, 14, 29, 34, 38, 30, 25, 20, 15, 27, 34, 38, 34, 28, 22, 17, 27, 34, 39, 38, 31, 24, 19, 30, 36, 40, 41, 34, 26, 21, 9, 13, 16, 19, 18, 17, 14, 8, 11, 15, 18, 18, 16, 13, 6, 10, 14, 16, 16, 13, 10, 5, 8, 11, 13, 14, 11, 8, 2, 5, 7, 10, 11, 9, 7, 2, 3, 5, 7, 10, 9, 7, 7, 6, 6, 7, 9, 9, 7, 7, 10, 14, 16, 16, 14, 11, 5, 9, 12, 15, 16, 13, 9, 4, 7, 11, 13, 13, 11, 7, 4, 5, 8, 10, 10, 9, 4, 2, 2, 4, 7, 7, 7, 4, 4, 3, 5, 5, 5, 6, 4, 9, 7, 6, 5, 4, 5, 4, 5, 7, 9, 10, 12, 10, 9, 4, 6, 8, 9, 10, 9, 8, 4, 5, 7, 7, 7, 7, 5, 4, 3, 3, 3, 4, 4, 2, 1, 1, 0, 0, 0, 1, 2, 6, 5, 4, 3, 2, 1, 2, 11, 9, 7, 5, 3, 2, 2, 4, 6, 7, 8, 9, 11, 10, 4, 6, 7, 8, 8, 9, 8, 3, 6, 7, 6, 6, 7, 7, 6, 6, 6, 6, 6, 6, 5, 5, 8, 7, 7, 8, 8, 7, 7, 13, 12, 11, 10, 9, 9, 11, 17, 15, 13, 11, 10, 10, 11, 12, 12, 12, 13, 13, 10, 11, 13, 13, 14, 14, 13, 8, 11, 14, 15, 14, 14, 12, 9, 11, 17, 15, 15, 15, 13, 9, 11, 18, 17, 17, 17, 15, 10, 15, 21, 22, 21, 19, 16, 12, 19, 23, 25, 23, 21, 18, 13, 21, 22, 22, 21, 19, 15, 11, 20, 24, 24, 23, 20, 15, 10, 21, 26, 26, 24, 20, 15, 11, 20, 26, 26, 25, 21, 16, 12, 19, 25, 29, 27, 23, 18, 13, 21, 26, 33, 32, 25, 20, 15, 24, 30, 33, 33, 28, 22, 16, 28, 35, 33, 27, 21, 17, 13, 29, 35, 36, 29, 22, 18, 13, 29, 35, 39, 30, 23, 18, 14, 29, 34, 38, 32, 25, 19, 14, 28, 33, 39, 34, 27, 22, 17, 28, 33, 39, 38, 30, 24, 18, 29, 34, 39, 40, 33, 26, 20, 9, 13, 16, 20, 20, 18, 15, 8, 12, 15, 19, 20, 17, 13, 7, 10, 14, 17, 18, 14, 11, 5, 8, 11, 14, 16, 13, 8, 3, 5, 7, 10, 13, 10, 8, 2, 3, 5, 8, 11, 10, 8, 3, 4, 4, 7, 10, 11, 8, 7, 10, 14, 17, 16, 14, 11, 5, 9, 13, 17, 16, 12, 9, 5, 8, 11, 14, 14, 11, 7, 4, 6, 8, 11, 10, 9, 4, 2, 2, 5, 7, 7, 7, 4, 3, 2, 4, 5, 6, 6, 4, 6, 3, 3, 5, 4, 5, 4, 5, 8, 10, 11, 12, 10, 10, 4, 6, 8, 9, 10, 9, 8, 4, 5, 7, 7, 7, 7, 5, 4, 4, 3, 4, 4, 4, 2, 1, 1, 0, 0, 0, 1, 2, 5, 3, 3, 2, 2, 1, 2, 7, 5, 4, 4, 3, 2, 2, 4, 6, 7, 8, 9, 11, 10, 4, 6, 7, 8, 9, 9, 8, 3, 6, 7, 6, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 8, 8, 8, 8, 7, 7, 5, 10, 10, 10, 10, 8, 8, 7, 13, 12, 11, 11, 10, 10, 11, 12, 12, 13, 13, 12, 10, 12, 13, 13, 14, 14, 13, 8, 12, 15, 15, 14, 14, 13, 9, 11, 17, 15, 15, 15, 13, 9, 12, 18, 17, 17, 16, 15, 10, 14, 19, 21, 19, 19, 16, 12, 15, 20, 23, 21, 21, 18, 13, 22, 22, 22, 21, 19, 15, 11, 21, 24, 23, 23, 19, 15, 11, 20, 26, 25, 24, 20, 15, 11, 21, 25, 26, 26, 21, 16, 12, 20, 25, 30, 27, 23, 18, 13, 21, 26, 32, 31, 25, 19, 15, 21, 26, 32, 31, 27, 21, 16, 29, 35, 32, 26, 22, 17, 13, 29, 34, 35, 29, 23, 18, 14, 29, 35, 37, 30, 23, 18, 14, 29, 34, 38, 31, 25, 20, 15, 28, 32, 37, 33, 27, 22, 16, 28, 34, 38, 36, 30, 24, 18, 29, 34, 39, 39, 32, 26, 20, 8, 12, 16, 19, 20, 17, 14, 7, 11, 15, 19, 19, 16, 12, 6, 9, 13, 16, 17, 14, 10, 4, 7, 10, 13, 15, 12, 8, 1, 4, 7, 9, 13, 11, 8, 2, 3, 5, 8, 12, 11, 8, 4, 4, 4, 7, 10, 11, 8, 6, 10, 13, 16, 16, 14, 10, 5, 8, 12, 15, 16, 12, 8, 3, 7, 11, 13, 13, 10, 6, 3, 5, 8, 10, 9, 8, 4, 1, 2, 4, 7, 7, 7, 4, 3, 3, 4, 6, 5, 6, 4, 6, 4, 3, 5, 4, 4, 4, 4, 7, 9, 10, 11, 9, 8, 3, 5, 8, 9, 9, 8, 6, 3, 4, 6, 6, 6, 6, 4, 3, 2, 3, 3, 3, 3, 1, 2, 2, 1, 1, 1, 0, 1, 4, 3, 3, 2, 2, 2, 1, 8, 6, 4, 3, 3, 2, 2, 3, 5, 6, 7, 8, 10, 9, 2, 6, 6, 7, 7, 8, 7, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 8, 8, 8, 8, 8, 7, 5, 10, 10, 9, 9, 8, 8, 8, 14, 12, 11, 10, 10, 10, 11, 12, 12, 12, 13, 13, 9, 12, 14, 13, 14, 14, 12, 7, 12, 15, 15, 14, 14, 13, 8, 12, 17, 15, 15, 15, 13, 9, 13, 19, 17, 17, 16, 15, 10, 14, 19, 20, 18, 18, 16, 11, 14, 20, 23, 21, 19, 18, 13, 21, 23, 22, 21, 18, 14, 10, 22, 25, 23, 23, 19, 15, 11, 21, 26, 25, 23, 19, 15, 11, 21, 25, 26, 24, 21, 16, 11, 20, 25, 28, 26, 22, 17, 13, 21, 26, 30, 28, 23, 19, 15, 21, 27, 30, 30, 25, 20, 16, 28, 33, 30, 25, 21, 17, 13, 28, 33, 33, 26, 22, 18, 13, 29, 33, 35, 27, 22, 18, 14, 29, 32, 35, 29, 23, 19, 15, 27, 32, 36, 31, 25, 20, 16, 28, 32, 35, 34, 27, 23, 18, 27, 31, 36, 35, 29, 23, 19, 8, 10, 13, 16, 15, 13, 10, 7, 10, 12, 15, 15, 12, 8, 6, 8, 11, 13, 14, 10, 7, 5, 6, 9, 10, 13, 9, 6, 2, 5, 7, 9, 12, 9, 6, 3, 5, 6, 8, 11, 10, 6, 4, 4, 6, 8, 10, 9, 6, 6, 9, 11, 13, 12, 10, 7, 5, 8, 10, 13, 12, 8, 5, 4, 7, 9, 10, 9, 7, 4, 2, 5, 7, 8, 7, 6, 3, 1, 3, 5, 7, 6, 5, 3, 3, 3, 5, 6, 5, 5, 3, 6, 4, 5, 6, 5, 4, 3, 4, 7, 8, 8, 9, 7, 6, 2, 6, 7, 7, 7, 5, 4, 2, 5, 6, 5, 4, 4, 2, 2, 3, 3, 3, 3, 2, 0, 3, 3, 2, 2, 2, 1, 0, 5, 4, 3, 2, 2, 1, 0, 8, 5, 3, 3, 2, 2, 1, 2, 4, 4, 5, 7, 8, 8, 1, 5, 4, 5, 6, 6, 6, 1, 6, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 5, 8, 7, 7, 7, 6, 6, 5, 10, 9, 8, 8, 8, 7, 8, 13, 12, 10, 9, 9, 9, 11, 11, 11, 11, 12, 11, 8, 12, 12, 12, 13, 12, 11, 6, 12, 14, 14, 13, 12, 11, 7, 12, 16, 14, 13, 13, 12, 8, 13, 18, 16, 16, 15, 13, 9, 14, 19, 20, 17, 16, 14, 10, 15, 20, 23, 20, 18, 16, 12, 20, 21, 19, 18, 15, 13, 9, 20, 22, 20, 18, 16, 13, 9, 20, 24, 22, 20, 16, 13, 10, 20, 24, 23, 21, 17, 14, 11, 19, 23, 26, 24, 20, 16, 12, 20, 24, 30, 28, 23, 17, 14, 21, 26, 29, 30, 25, 19, 14, 26, 30, 28, 22, 17, 15, 12, 26, 30, 29, 24, 18, 15, 11, 26, 30, 32, 25, 19, 16, 12, 25, 29, 33, 26, 21, 17, 13, 25, 29, 33, 30, 24, 20, 15, 26, 31, 35, 34, 27, 20, 16, 27, 32, 35, 35, 29, 23, 17, 14, 17, 21, 24, 24, 22, 19, 13, 16, 20, 24, 25, 21, 18, 12, 15, 18, 21, 23, 19, 15, 12, 13, 15, 17, 21, 16, 12, 9, 9, 11, 14, 14, 15, 12, 5, 5, 8, 11, 13, 14, 12, 2, 3, 6, 9, 13, 15, 12, 13, 15, 19, 21, 22, 19, 17, 12, 14, 17, 20, 21, 18, 14, 11, 13, 15, 18, 18, 16, 12, 11, 11, 13, 14, 15, 12, 7, 8, 8, 9, 10, 9, 10, 7, 3, 3, 5, 7, 9, 9, 7, 3, 3, 3, 6, 8, 8, 7, 11, 13, 14, 16, 18, 17, 15, 11, 12, 14, 15, 16, 15, 14, 10, 11, 13, 13, 13, 13, 12, 10, 10, 10, 10, 11, 9, 5, 6, 6, 6, 6, 5, 5, 5, 0, 2, 1, 2, 4, 4, 5, 4, 4, 2, 1, 3, 4, 5, 10, 11, 13, 14, 15, 16, 15, 10, 11, 12, 14, 14, 15, 14, 9, 10, 12, 12, 12, 13, 12, 6, 9, 9, 9, 10, 9, 7, 4, 5, 4, 5, 5, 4, 4, 0, 2, 2, 2, 3, 3, 5, 4, 6, 3, 3, 3, 4, 5, 9, 10, 12, 13, 14, 15, 15, 8, 9, 11, 12, 13, 13, 14, 8, 9, 10, 10, 11, 11, 12, 8, 8, 8, 8, 9, 8, 5, 5, 8, 7, 7, 7, 6, 5, 4, 7, 7, 7, 7, 7, 5, 5, 8, 9, 8, 8, 8, 5, 11, 12, 12, 13, 12, 14, 15, 11, 13, 13, 13, 12, 12, 13, 11, 14, 14, 13, 11, 10, 11, 11, 13, 13, 13, 11, 9, 5, 9, 11, 13, 12, 10, 8, 5, 8, 11, 14, 13, 11, 8, 6, 8, 12, 15, 15, 11, 9, 7, 15, 19, 18, 15, 13, 13, 14, 15, 19, 20, 16, 13, 11, 12, 15, 18, 21, 16, 14, 11, 9, 15, 18, 20, 15, 13, 9, 6, 14, 16, 19, 16, 11, 9, 7, 13, 15, 18, 17, 13, 10, 8, 12, 16, 19, 19, 14, 11, 8, 12, 14, 15, 17, 17, 16, 14, 12, 13, 15, 16, 17, 14, 13, 11, 12, 14, 15, 15, 12, 11, 10, 11, 11, 12, 12, 8, 4, 8, 8, 8, 8, 6, 5, 4, 4, 4, 4, 3, 4, 5, 4, 2, 2, 2, 3, 4, 5, 4, 11, 13, 14, 15, 16, 15, 14, 10, 12, 13, 15, 15, 14, 12, 10, 11, 13, 13, 13, 12, 10, 9, 10, 10, 10, 11, 9, 4, 7, 7, 7, 7, 4, 4, 4, 2, 3, 3, 3, 3, 4, 4, 5, 4, 2, 2, 3, 3, 4, 10, 11, 13, 14, 15, 15, 15, 9, 10, 12, 13, 14, 14, 13, 9, 10, 12, 12, 12, 11, 10, 9, 9, 9, 9, 9, 8, 4, 5, 5, 5, 5, 3, 3, 4, 2, 0, 1, 2, 2, 3, 4, 7, 6, 2, 0, 3, 3, 4, 10, 11, 12, 13, 15, 16, 16, 9, 11, 12, 13, 14, 14, 14, 8, 11, 12, 12, 12, 12, 11, 5, 9, 9, 9, 9, 8, 7, 3, 5, 5, 5, 5, 5, 5, 2, 7, 7, 6, 6, 6, 7, 7, 13, 10, 8, 8, 8, 8, 10, 11, 12, 13, 14, 16, 16, 9, 10, 11, 13, 14, 14, 14, 9, 11, 11, 11, 12, 12, 11, 9, 12, 11, 12, 12, 11, 7, 8, 13, 14, 13, 14, 13, 9, 9, 15, 17, 17, 16, 15, 10, 12, 17, 19, 18, 18, 16, 11, 16, 19, 18, 19, 16, 15, 16, 16, 21, 21, 21, 17, 13, 13, 16, 22, 23, 21, 17, 12, 10, 16, 22, 23, 23, 19, 14, 10, 15, 21, 25, 23, 21, 17, 11, 16, 22, 27, 25, 21, 18, 13, 18, 22, 26, 25, 23, 20, 15, 25, 30, 29, 25, 19, 15, 14, 25, 30, 31, 26, 20, 15, 12, 25, 30, 33, 26, 21, 16, 11, 25, 30, 34, 28, 22, 18, 14, 24, 29, 32, 27, 23, 20, 16, 24, 27, 30, 29, 24, 21, 17, 23, 27, 30, 30, 25, 22, 19, 13, 16, 17, 18, 18, 17, 16, 12, 15, 17, 18, 18, 16, 14, 11, 14, 16, 16, 15, 13, 11, 10, 12, 13, 13, 13, 10, 5, 7, 9, 10, 10, 8, 6, 5, 3, 5, 7, 5, 6, 6, 5, 2, 3, 5, 5, 6, 6, 5, 11, 14, 16, 17, 17, 17, 15, 10, 13, 15, 16, 17, 15, 13, 9, 12, 15, 15, 14, 13, 10, 9, 9, 12, 13, 11, 9, 5, 7, 6, 8, 9, 6, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 3, 3, 5, 4, 5, 5, 9, 12, 14, 15, 16, 15, 14, 9, 10, 12, 14, 15, 13, 12, 9, 10, 11, 11, 11, 11, 9, 9, 8, 8, 8, 8, 7, 3, 5, 5, 5, 4, 3, 3, 3, 1, 1, 0, 1, 2, 3, 3, 6, 5, 3, 1, 2, 3, 3, 9, 11, 11, 13, 15, 15, 15, 9, 11, 12, 13, 14, 14, 13, 7, 11, 11, 11, 11, 11, 10, 5, 9, 8, 8, 8, 7, 7, 3, 5, 5, 6, 6, 6, 6, 2, 8, 8, 7, 7, 8, 8, 6, 12, 11, 9, 9, 9, 9, 10, 10, 11, 13, 14, 15, 15, 9, 11, 12, 13, 13, 13, 13, 10, 12, 13, 13, 13, 11, 9, 10, 13, 13, 13, 13, 12, 8, 9, 15, 14, 15, 15, 14, 9, 10, 16, 18, 17, 17, 15, 11, 13, 18, 21, 18, 18, 17, 13, 18, 20, 20, 20, 17, 15, 15, 18, 22, 21, 21, 18, 13, 12, 18, 24, 24, 23, 18, 14, 10, 18, 23, 25, 24, 20, 15, 11, 18, 23, 27, 26, 21, 17, 13, 17, 23, 29, 28, 24, 18, 14, 19, 25, 29, 31, 26, 20, 16, 27, 33, 32, 25, 20, 16, 14, 26, 32, 34, 27, 22, 17, 12, 27, 33, 36, 28, 22, 17, 12, 27, 32, 37, 29, 24, 19, 14, 25, 31, 37, 32, 26, 20, 16, 25, 31, 36, 35, 28, 22, 17, 26, 32, 37, 37, 30, 24, 19, 12, 16, 19, 22, 22, 20, 18, 12, 15, 18, 21, 21, 19, 15, 10, 13, 17, 19, 19, 17, 13, 8, 11, 14, 16, 17, 13, 8, 6, 8, 10, 12, 12, 10, 8, 2, 4, 7, 9, 11, 10, 8, 2, 3, 5, 8, 10, 10, 8, 10, 13, 17, 20, 20, 17, 14, 9, 12, 16, 19, 19, 16, 12, 8, 11, 14, 17, 16, 14, 9, 8, 9, 11, 13, 13, 11, 5, 5, 5, 8, 10, 8, 8, 5, 1, 2, 4, 6, 6, 7, 5, 4, 3, 3, 5, 5, 6, 5, 8, 11, 13, 14, 16, 13, 13, 8, 9, 12, 13, 14, 12, 11, 7, 8, 10, 10, 10, 10, 7, 8, 7, 7, 7, 7, 6, 2, 4, 3, 3, 3, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 4, 3, 2, 2, 1, 2, 2, 8, 9, 10, 11, 13, 14, 14, 8, 9, 10, 11, 12, 12, 11, 5, 9, 10, 9, 9, 9, 8, 5, 8, 7, 6, 7, 6, 6, 3, 6, 6, 6, 6, 6, 6, 2, 8, 8, 7, 7, 7, 7, 4, 11, 10, 9, 9, 9, 9, 9, 11, 11, 12, 13, 13, 13, 9, 11, 12, 12, 13, 12, 11, 10, 13, 14, 13, 13, 11, 8, 10, 15, 13, 14, 14, 12, 8, 10, 16, 15, 15, 15, 13, 9, 11, 16, 18, 17, 16, 14, 11, 12, 17, 20, 19, 18, 17, 12, 19, 21, 20, 20, 18, 14, 13, 18, 23, 22, 22, 18, 14, 10, 19, 24, 24, 23, 19, 14, 10, 19, 24, 25, 23, 20, 15, 10, 18, 24, 28, 26, 21, 17, 12, 18, 24, 30, 29, 23, 18, 13, 18, 24, 30, 30, 25, 19, 15, 27, 34, 32, 26, 20, 16, 12, 27, 34, 34, 28, 22, 17, 12, 27, 34, 37, 28, 22, 17, 13, 28, 33, 37, 30, 23, 18, 14, 26, 32, 36, 33, 25, 19, 15, 26, 31, 36, 34, 28, 21, 17, 26, 31, 36, 37, 29, 24, 18, 11, 15, 18, 21, 22, 20, 16, 10, 14, 17, 21, 22, 18, 14, 8, 12, 16, 19, 20, 16, 12, 7, 10, 13, 16, 18, 14, 9, 4, 7, 9, 12, 14, 12, 9, 0, 3, 6, 9, 13, 12, 9, 3, 3, 5, 8, 11, 12, 9, 8, 12, 16, 19, 18, 16, 12, 7, 11, 14, 18, 18, 14, 10, 6, 10, 13, 16, 15, 13, 9, 6, 7, 10, 12, 12, 10, 5, 3, 4, 6, 9, 9, 8, 5, 2, 2, 4, 6, 7, 7, 5, 5, 4, 3, 6, 5, 6, 5, 6, 10, 11, 13, 14, 12, 11, 5, 8, 10, 11, 12, 11, 8, 5, 7, 9, 9, 9, 9, 6, 6, 5, 5, 5, 6, 5, 3, 1, 1, 2, 2, 2, 2, 2, 4, 3, 2, 1, 0, 1, 2, 7, 4, 3, 2, 1, 1, 2, 6, 7, 8, 9, 10, 12, 11, 5, 7, 8, 9, 9, 9, 9, 4, 7, 7, 7, 7, 7, 6, 5, 6, 6, 5, 5, 5, 5, 3, 7, 6, 6, 6, 6, 6, 4, 9, 8, 8, 8, 7, 7, 7, 12, 10, 9, 9, 9, 9, 10, 11, 11, 11, 12, 12, 11, 11, 12, 12, 13, 13, 11, 9, 11, 14, 14, 13, 13, 11, 8, 11, 15, 14, 13, 14, 12, 8, 11, 17, 16, 15, 15, 13, 9, 12, 17, 18, 17, 16, 15, 10, 13, 17, 20, 19, 18, 16, 12, 20, 21, 20, 21, 18, 14, 11, 20, 23, 23, 23, 19, 14, 9, 19, 25, 24, 23, 19, 14, 10, 20, 24, 26, 24, 20, 15, 11, 18, 24, 27, 26, 21, 16, 12, 19, 23, 30, 29, 23, 18, 14, 19, 24, 29, 31, 25, 20, 15, 28, 34, 32, 26, 21, 16, 12, 27, 34, 34, 27, 21, 17, 12, 27, 33, 36, 29, 23, 18, 13, 28, 32, 37, 29, 24, 19, 13, 26, 32, 36, 33, 25, 20, 15, 26, 32, 37, 33, 28, 22, 17, 27, 32, 35, 36, 30, 23, 18, 10, 14, 18, 21, 21, 18, 15, 9, 12, 16, 20, 21, 17, 13, 7, 11, 15, 18, 19, 16, 11, 6, 9, 12, 14, 16, 14, 9, 3, 6, 8, 11, 14, 12, 9, 2, 4, 6, 9, 13, 12, 9, 4, 4, 5, 8, 11, 12, 9, 7, 11, 14, 18, 18, 15, 11, 6, 10, 13, 17, 17, 13, 9, 5, 8, 12, 14, 14, 12, 8, 4, 6, 9, 11, 11, 10, 5, 1, 3, 5, 8, 8, 8, 5, 2, 3, 4, 7, 7, 7, 5, 6, 4, 4, 6, 5, 6, 5, 5, 8, 10, 11, 13, 11, 9, 3, 7, 9, 10, 11, 9, 7, 3, 6, 7, 8, 7, 7, 4, 3, 3, 4, 4, 4, 4, 1, 2, 1, 1, 1, 1, 2, 1, 4, 3, 2, 2, 1, 0, 1, 8, 6, 3, 3, 2, 1, 1, 3, 5, 6, 7, 8, 10, 9, 3, 5, 6, 7, 8, 8, 7, 2, 5, 6, 6, 5, 6, 5, 5, 6, 6, 5, 5, 5, 4, 4, 8, 7, 6, 7, 6, 6, 4, 10, 8, 8, 8, 8, 7, 8, 12, 11, 10, 9, 9, 9, 11, 11, 11, 11, 12, 12, 9, 12, 13, 12, 13, 13, 12, 7, 12, 14, 14, 13, 12, 11, 8, 11, 16, 14, 14, 14, 12, 8, 12, 18, 17, 15, 16, 13, 9, 13, 18, 19, 18, 16, 15, 11, 14, 18, 21, 19, 19, 16, 12, 20, 21, 20, 20, 17, 14, 10, 20, 23, 22, 22, 18, 14, 9, 20, 25, 24, 23, 19, 14, 10, 20, 25, 24, 23, 20, 15, 10, 19, 25, 26, 25, 21, 16, 12, 20, 25, 29, 28, 22, 18, 14, 20, 25, 29, 30, 24, 19, 15, 28, 33, 29, 24, 20, 16, 12, 28, 32, 31, 26, 21, 16, 12, 28, 32, 34, 27, 23, 17, 13, 27, 31, 35, 28, 23, 18, 14, 26, 31, 34, 31, 24, 20, 15, 26, 31, 35, 33, 26, 21, 17, 27, 30, 35, 35, 29, 22, 18, 8, 11, 12, 16, 15, 13, 10, 7, 10, 12, 15, 15, 12, 8, 6, 8, 11, 13, 14, 10, 7, 5, 6, 9, 10, 12, 9, 6, 2, 5, 7, 9, 12, 9, 6, 3, 5, 6, 8, 11, 9, 6, 4, 5, 6, 8, 10, 9, 6, 6, 9, 11, 13, 12, 10, 7, 5, 8, 10, 12, 12, 8, 5, 4, 7, 9, 10, 9, 7, 4, 2, 5, 7, 8, 7, 6, 3, 1, 3, 5, 7, 6, 5, 3, 3, 3, 5, 6, 5, 5, 3, 6, 4, 5, 6, 5, 4, 3, 4, 7, 8, 8, 9, 7, 6, 2, 6, 7, 7, 7, 5, 4, 2, 5, 6, 5, 4, 4, 2, 2, 3, 3, 3, 3, 2, 0, 3, 2, 2, 2, 2, 1, 0, 5, 4, 3, 2, 2, 1, 0, 8, 6, 3, 2, 2, 2, 1, 2, 4, 4, 5, 6, 7, 8, 1, 4, 4, 5, 6, 5, 6, 1, 6, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 5, 8, 7, 7, 7, 7, 6, 5, 10, 9, 8, 8, 8, 7, 8, 13, 12, 10, 9, 9, 9, 11, 11, 11, 11, 12, 11, 8, 12, 12, 13, 12, 12, 11, 6, 12, 14, 14, 13, 12, 11, 7, 12, 16, 14, 13, 13, 12, 8, 12, 18, 17, 15, 15, 13, 9, 13, 19, 20, 18, 16, 14, 10, 14, 20, 23, 20, 18, 16, 11, 20, 20, 19, 17, 15, 13, 9, 20, 22, 20, 19, 16, 13, 9, 20, 23, 22, 20, 17, 13, 10, 19, 24, 24, 21, 17, 14, 11, 19, 24, 26, 24, 20, 16, 12, 20, 24, 30, 27, 22, 17, 13, 21, 25, 30, 29, 24, 19, 14, 26, 30, 27, 21, 17, 14, 12, 26, 30, 29, 23, 18, 15, 12, 26, 30, 32, 25, 19, 16, 12, 26, 29, 33, 26, 21, 17, 13, 25, 29, 33, 30, 24, 19, 15, 25, 31, 34, 34, 27, 21, 16, 27, 32, 35, 35, 29, 23, 17, 20, 21, 23, 25, 26, 24, 23, 20, 21, 23, 24, 25, 23, 20, 19, 21, 21, 23, 24, 20, 16, 18, 19, 19, 19, 20, 15, 11, 15, 15, 15, 14, 14, 15, 10, 11, 11, 8, 10, 12, 14, 10, 5, 3, 5, 8, 11, 14, 10, 19, 20, 22, 24, 24, 23, 22, 18, 20, 21, 23, 24, 22, 20, 17, 19, 20, 20, 21, 18, 16, 17, 17, 18, 18, 16, 13, 8, 14, 14, 14, 12, 9, 9, 8, 9, 9, 7, 6, 8, 8, 8, 2, 2, 4, 5, 7, 8, 8, 17, 19, 20, 21, 23, 24, 22, 17, 18, 20, 21, 22, 21, 19, 17, 18, 19, 19, 19, 18, 15, 16, 16, 16, 16, 15, 12, 9, 11, 12, 12, 11, 7, 8, 8, 4, 7, 6, 4, 6, 8, 8, 0, 2, 2, 4, 6, 6, 8, 17, 18, 20, 21, 22, 23, 23, 16, 18, 20, 20, 21, 21, 21, 14, 19, 19, 19, 18, 18, 17, 10, 17, 16, 16, 15, 11, 11, 8, 12, 12, 10, 6, 7, 8, 5, 5, 5, 3, 4, 6, 7, 0, 3, 3, 3, 4, 5, 6, 15, 17, 19, 20, 21, 23, 23, 12, 17, 18, 20, 20, 20, 21, 12, 16, 16, 17, 17, 16, 15, 12, 13, 13, 13, 12, 10, 7, 9, 9, 8, 8, 7, 6, 6, 6, 7, 7, 6, 7, 7, 6, 4, 6, 8, 7, 7, 8, 6, 13, 14, 15, 16, 18, 21, 23, 13, 14, 15, 16, 17, 19, 19, 13, 14, 15, 15, 14, 15, 14, 13, 13, 13, 13, 12, 9, 6, 10, 12, 13, 12, 9, 8, 6, 9, 10, 13, 13, 10, 8, 6, 7, 10, 14, 14, 11, 8, 7, 16, 19, 18, 16, 17, 20, 21, 16, 19, 20, 17, 15, 17, 18, 16, 18, 21, 16, 14, 13, 13, 16, 17, 20, 15, 12, 10, 7, 14, 16, 18, 15, 11, 9, 7, 12, 15, 17, 16, 12, 10, 8, 11, 15, 18, 17, 13, 10, 8, 18, 19, 21, 22, 22, 21, 21, 18, 19, 20, 22, 22, 19, 18, 17, 18, 19, 20, 19, 17, 14, 17, 17, 17, 17, 15, 12, 8, 14, 13, 13, 11, 9, 8, 8, 10, 10, 7, 7, 8, 9, 8, 4, 2, 4, 6, 8, 8, 8, 17, 19, 20, 21, 22, 21, 20, 16, 18, 19, 20, 21, 19, 17, 16, 17, 19, 19, 18, 16, 13, 16, 16, 16, 16, 14, 11, 7, 14, 12, 12, 11, 7, 7, 7, 9, 8, 6, 5, 6, 7, 7, 2, 2, 3, 4, 6, 6, 7, 16, 17, 18, 20, 21, 21, 21, 16, 17, 18, 19, 20, 19, 18, 15, 17, 17, 17, 16, 16, 13, 15, 15, 14, 14, 13, 10, 6, 10, 11, 11, 9, 5, 6, 6, 4, 6, 5, 3, 4, 5, 6, 2, 0, 2, 3, 4, 5, 6, 16, 17, 18, 19, 21, 22, 22, 15, 17, 19, 19, 20, 19, 19, 13, 17, 18, 18, 17, 16, 15, 9, 16, 15, 15, 14, 10, 11, 7, 12, 11, 10, 5, 5, 7, 4, 6, 5, 5, 5, 5, 6, 2, 7, 6, 6, 6, 6, 7, 15, 17, 18, 20, 20, 22, 22, 12, 16, 18, 18, 19, 19, 19, 12, 15, 16, 16, 16, 15, 13, 12, 13, 13, 13, 12, 10, 6, 10, 10, 11, 11, 13, 11, 7, 7, 11, 14, 14, 15, 13, 8, 8, 13, 16, 16, 16, 15, 10, 14, 16, 17, 17, 19, 21, 21, 14, 18, 18, 19, 17, 18, 18, 14, 19, 20, 19, 16, 14, 13, 14, 19, 21, 21, 17, 12, 8, 12, 18, 22, 21, 18, 16, 10, 12, 19, 22, 20, 19, 17, 12, 14, 19, 22, 21, 20, 17, 13, 22, 27, 27, 22, 18, 20, 20, 22, 28, 29, 24, 18, 17, 17, 22, 27, 30, 24, 19, 14, 12, 22, 26, 30, 24, 20, 16, 12, 20, 25, 29, 24, 19, 17, 14, 20, 25, 26, 25, 20, 18, 15, 21, 23, 25, 25, 22, 19, 17, 16, 19, 19, 21, 20, 20, 19, 15, 18, 19, 20, 20, 18, 16, 14, 16, 18, 19, 18, 15, 13, 13, 15, 16, 15, 15, 11, 7, 10, 11, 12, 11, 9, 7, 6, 6, 8, 8, 6, 7, 7, 6, 1, 3, 5, 6, 7, 7, 6, 14, 17, 19, 19, 20, 19, 18, 13, 16, 18, 19, 19, 17, 15, 12, 14, 18, 17, 16, 15, 12, 12, 12, 14, 15, 13, 10, 6, 9, 9, 11, 10, 7, 6, 6, 5, 5, 7, 6, 6, 6, 6, 2, 1, 4, 5, 5, 6, 6, 12, 15, 16, 18, 19, 18, 17, 12, 13, 16, 17, 17, 16, 14, 12, 12, 14, 14, 14, 13, 10, 11, 11, 10, 11, 10, 8, 4, 7, 7, 7, 7, 4, 4, 3, 2, 2, 3, 2, 3, 3, 3, 2, 2, 0, 2, 3, 4, 4, 12, 13, 14, 16, 17, 18, 17, 11, 13, 14, 15, 16, 16, 14, 9, 13, 13, 14, 13, 13, 11, 6, 12, 11, 11, 10, 8, 8, 4, 8, 7, 7, 5, 5, 6, 2, 6, 6, 6, 6, 6, 6, 2, 8, 8, 7, 7, 7, 8, 12, 12, 14, 15, 16, 17, 17, 10, 12, 13, 14, 15, 15, 15, 10, 12, 12, 12, 12, 12, 10, 10, 12, 11, 12, 12, 10, 7, 8, 13, 13, 13, 14, 12, 8, 8, 14, 16, 16, 16, 14, 9, 10, 15, 18, 17, 18, 16, 11, 16, 19, 18, 19, 16, 17, 17, 15, 20, 20, 20, 16, 14, 14, 15, 22, 22, 20, 17, 12, 10, 16, 21, 22, 23, 18, 13, 10, 15, 21, 25, 24, 20, 16, 11, 15, 21, 27, 27, 22, 17, 12, 17, 22, 29, 30, 24, 19, 14, 24, 31, 30, 24, 19, 16, 16, 25, 31, 33, 26, 19, 15, 13, 24, 30, 35, 27, 21, 16, 11, 24, 30, 35, 27, 22, 17, 13, 24, 29, 35, 31, 24, 19, 14, 24, 29, 34, 34, 27, 21, 16, 24, 30, 34, 35, 29, 23, 18, 14, 18, 21, 23, 23, 22, 19, 13, 17, 20, 22, 23, 20, 17, 11, 15, 19, 20, 20, 18, 15, 10, 13, 16, 18, 18, 14, 9, 7, 10, 12, 14, 14, 11, 9, 4, 6, 8, 10, 12, 11, 9, 2, 3, 6, 9, 11, 11, 9, 12, 15, 19, 21, 21, 19, 16, 11, 14, 18, 21, 20, 17, 13, 9, 12, 16, 18, 18, 15, 11, 9, 10, 13, 16, 14, 12, 7, 6, 7, 9, 11, 10, 9, 6, 2, 3, 6, 8, 8, 8, 6, 4, 2, 4, 7, 7, 7, 6, 9, 13, 14, 16, 17, 16, 14, 9, 11, 13, 15, 15, 13, 11, 9, 10, 12, 12, 12, 11, 8, 9, 8, 8, 9, 9, 7, 3, 5, 4, 5, 5, 4, 3, 2, 1, 0, 1, 1, 2, 3, 2, 4, 3, 2, 0, 2, 2, 3, 9, 10, 11, 12, 13, 14, 14, 9, 10, 11, 12, 13, 12, 12, 7, 10, 10, 10, 10, 10, 9, 4, 9, 7, 7, 7, 6, 6, 2, 5, 4, 5, 5, 5, 5, 1, 7, 6, 6, 6, 6, 6, 4, 9, 9, 8, 7, 7, 8, 9, 10, 10, 12, 13, 14, 14, 9, 10, 11, 12, 12, 12, 12, 9, 12, 12, 12, 12, 10, 8, 9, 13, 12, 12, 13, 11, 7, 8, 14, 13, 13, 13, 12, 8, 10, 15, 17, 16, 15, 13, 9, 11, 16, 19, 17, 17, 15, 10, 17, 19, 18, 18, 16, 14, 14, 17, 21, 21, 20, 17, 12, 11, 17, 23, 22, 21, 18, 13, 9, 17, 22, 24, 22, 19, 14, 9, 17, 21, 26, 24, 20, 16, 10, 16, 22, 28, 27, 22, 16, 12, 16, 23, 28, 29, 24, 18, 13, 26, 32, 31, 24, 19, 15, 13, 26, 31, 33, 26, 20, 15, 11, 25, 31, 34, 27, 21, 16, 11, 26, 31, 36, 29, 22, 17, 12, 24, 30, 35, 32, 23, 18, 14, 25, 30, 35, 33, 26, 21, 15, 25, 30, 35, 35, 29, 23, 17, 12, 16, 20, 23, 23, 20, 18, 12, 15, 19, 22, 23, 19, 16, 10, 14, 17, 20, 21, 17, 14, 9, 11, 14, 17, 19, 15, 10, 5, 8, 10, 13, 15, 13, 10, 2, 5, 7, 10, 13, 13, 10, 3, 3, 6, 9, 12, 12, 10, 10, 14, 17, 21, 20, 17, 14, 9, 12, 16, 19, 20, 16, 12, 7, 11, 15, 17, 17, 14, 10, 6, 8, 11, 13, 13, 12, 6, 4, 5, 8, 10, 9, 9, 6, 1, 3, 5, 7, 8, 8, 6, 5, 3, 4, 6, 6, 7, 6, 7, 11, 13, 14, 15, 13, 11, 6, 9, 12, 13, 13, 12, 9, 6, 8, 10, 10, 10, 10, 6, 6, 6, 7, 7, 7, 7, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 2, 2, 5, 4, 3, 2, 0, 1, 2, 6, 7, 8, 9, 11, 12, 11, 6, 7, 8, 9, 10, 10, 9, 5, 7, 7, 7, 7, 7, 6, 3, 6, 5, 5, 5, 4, 5, 2, 6, 5, 5, 5, 5, 5, 3, 8, 7, 7, 7, 6, 6, 5, 11, 9, 8, 8, 8, 8, 9, 10, 10, 11, 11, 12, 11, 10, 11, 11, 12, 12, 11, 9, 10, 12, 13, 12, 12, 11, 7, 10, 14, 13, 12, 13, 11, 7, 10, 16, 14, 14, 14, 12, 8, 11, 16, 17, 16, 15, 13, 9, 12, 16, 20, 18, 17, 15, 11, 18, 20, 20, 19, 16, 13, 11, 18, 22, 21, 21, 18, 13, 9, 19, 24, 24, 22, 18, 13, 9, 19, 23, 25, 23, 19, 14, 10, 17, 23, 26, 25, 20, 15, 11, 18, 23, 28, 27, 22, 17, 13, 18, 24, 29, 29, 24, 19, 14, 27, 32, 31, 25, 19, 15, 11, 27, 32, 33, 26, 21, 16, 11, 27, 33, 35, 27, 22, 17, 12, 26, 32, 36, 29, 22, 18, 12, 26, 31, 36, 32, 24, 19, 14, 25, 30, 36, 34, 26, 20, 16, 25, 30, 35, 36, 29, 23, 17, 11, 15, 19, 22, 22, 20, 17, 10, 14, 17, 21, 22, 18, 15, 9, 12, 16, 19, 20, 17, 12, 7, 10, 13, 16, 18, 15, 10, 4, 7, 9, 12, 15, 13, 10, 2, 5, 7, 10, 14, 13, 10, 4, 4, 6, 9, 12, 13, 10, 9, 12, 16, 20, 19, 16, 12, 7, 11, 15, 18, 18, 15, 11, 6, 9, 13, 16, 16, 13, 9, 5, 7, 10, 13, 12, 11, 6, 1, 4, 7, 9, 9, 9, 6, 3, 3, 5, 8, 8, 8, 6, 5, 4, 5, 7, 7, 7, 6, 6, 10, 12, 12, 14, 12, 9, 4, 8, 10, 12, 12, 11, 7, 4, 7, 9, 9, 9, 9, 5, 4, 5, 6, 5, 6, 6, 2, 1, 1, 3, 2, 2, 2, 2, 4, 3, 3, 2, 1, 1, 2, 7, 5, 4, 2, 1, 0, 1, 4, 5, 6, 7, 9, 10, 9, 4, 5, 6, 7, 8, 8, 7, 4, 5, 6, 5, 5, 5, 5, 4, 5, 4, 4, 4, 4, 3, 2, 6, 5, 5, 5, 5, 5, 4, 8, 7, 7, 7, 6, 6, 7, 12, 9, 9, 8, 8, 8, 10, 10, 10, 11, 11, 11, 9, 11, 12, 11, 12, 12, 10, 7, 11, 13, 13, 12, 12, 10, 7, 11, 15, 13, 13, 13, 11, 7, 11, 16, 15, 14, 14, 12, 8, 12, 17, 17, 16, 16, 13, 9, 13, 17, 21, 18, 17, 16, 11, 20, 20, 19, 19, 16, 13, 9, 19, 22, 21, 20, 18, 13, 9, 19, 24, 23, 22, 17, 13, 9, 19, 23, 25, 22, 18, 14, 9, 18, 23, 26, 24, 20, 16, 11, 18, 23, 28, 27, 21, 17, 13, 19, 23, 29, 29, 24, 19, 14, 27, 31, 29, 24, 20, 16, 11, 26, 30, 31, 25, 20, 16, 12, 27, 32, 33, 27, 21, 16, 11, 27, 31, 34, 28, 22, 17, 12, 26, 29, 34, 30, 23, 19, 14, 25, 30, 34, 32, 25, 21, 16, 25, 30, 35, 34, 28, 22, 17, 10, 14, 17, 19, 19, 17, 14, 9, 13, 15, 18, 19, 16, 13, 8, 11, 14, 16, 18, 15, 11, 7, 9, 12, 15, 17, 13, 10, 3, 6, 9, 12, 15, 13, 10, 3, 5, 8, 10, 14, 13, 10, 5, 4, 7, 10, 12, 13, 10, 8, 11, 15, 17, 16, 14, 11, 7, 10, 14, 16, 15, 13, 10, 5, 9, 12, 15, 13, 12, 8, 4, 6, 9, 12, 11, 10, 6, 1, 4, 7, 9, 9, 9, 6, 3, 4, 5, 8, 8, 8, 6, 7, 5, 5, 7, 7, 7, 6, 5, 9, 11, 11, 12, 11, 8, 3, 7, 10, 10, 11, 9, 5, 2, 6, 8, 8, 8, 8, 3, 2, 4, 5, 5, 5, 5, 2, 2, 2, 3, 2, 2, 2, 1, 5, 4, 3, 2, 2, 1, 1, 8, 6, 4, 3, 2, 1, 0, 2, 4, 4, 6, 7, 9, 8, 2, 3, 4, 6, 6, 6, 6, 1, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 3, 8, 6, 5, 5, 5, 5, 5, 10, 8, 7, 7, 6, 6, 8, 13, 10, 9, 8, 8, 7, 10, 10, 10, 10, 11, 10, 8, 11, 12, 11, 11, 11, 10, 6, 12, 13, 12, 12, 11, 10, 6, 12, 15, 13, 12, 12, 11, 6, 12, 17, 15, 14, 13, 12, 8, 13, 17, 18, 16, 15, 13, 9, 13, 18, 20, 17, 16, 14, 10, 19, 19, 18, 17, 15, 12, 8, 19, 20, 19, 18, 16, 12, 8, 19, 23, 21, 19, 15, 12, 8, 19, 23, 22, 19, 16, 13, 9, 18, 22, 24, 22, 18, 14, 10, 19, 23, 27, 25, 20, 15, 12, 18, 23, 28, 27, 22, 17, 13, 25, 28, 25, 20, 17, 14, 11, 24, 28, 27, 22, 17, 14, 11, 24, 28, 29, 22, 17, 14, 11, 25, 27, 30, 24, 19, 16, 12, 23, 27, 31, 28, 22, 17, 13, 24, 28, 32, 31, 24, 19, 14, 25, 28, 32, 32, 26, 20, 15, 3, 7, 11, 15, 16, 13, 11, 2, 5, 10, 14, 15, 13, 8, 2, 4, 8, 11, 13, 10, 5, 2, 2, 5, 8, 10, 9, 5, 2, 2, 2, 5, 8, 10, 5, 5, 6, 6, 5, 8, 9, 5, 12, 10, 8, 5, 6, 9, 5, 2, 4, 8, 11, 13, 10, 5, 2, 3, 7, 10, 13, 8, 3, 2, 2, 5, 7, 9, 5, 2, 1, 2, 2, 4, 5, 3, 2, 2, 3, 3, 3, 3, 3, 2, 7, 7, 8, 6, 3, 2, 2, 15, 13, 10, 7, 5, 3, 2, 2, 2, 3, 5, 6, 4, 2, 1, 2, 2, 3, 4, 3, 1, 0, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 4, 4, 4, 4, 4, 3, 2, 10, 10, 9, 8, 6, 4, 2, 17, 16, 12, 9, 6, 4, 2, 0, 1, 1, 1, 2, 2, 5, 1, 2, 2, 2, 2, 2, 5, 2, 2, 3, 3, 3, 3, 5, 4, 4, 5, 5, 5, 6, 7, 6, 9, 9, 9, 9, 8, 7, 10, 15, 14, 13, 11, 10, 9, 17, 20, 17, 15, 13, 12, 11, 8, 8, 8, 9, 9, 8, 5, 10, 10, 10, 10, 10, 9, 5, 10, 11, 11, 12, 12, 10, 6, 10, 14, 14, 14, 14, 13, 9, 13, 18, 18, 18, 18, 17, 11, 15, 21, 23, 21, 20, 18, 13, 20, 24, 25, 23, 21, 20, 15, 17, 18, 18, 18, 16, 11, 7, 17, 20, 20, 19, 17, 12, 7, 17, 22, 21, 20, 19, 14, 9, 17, 23, 22, 22, 20, 17, 14, 18, 24, 26, 25, 23, 20, 15, 21, 26, 29, 28, 24, 20, 17, 24, 28, 29, 30, 25, 23, 18, 24, 29, 27, 22, 19, 15, 9, 24, 28, 29, 23, 20, 16, 11, 24, 29, 30, 25, 21, 17, 13, 24, 29, 30, 26, 22, 20, 17, 25, 28, 32, 29, 25, 23, 19, 26, 30, 33, 32, 26, 24, 20, 28, 32, 34, 33, 28, 25, 22, 6, 7, 8, 8, 9, 7, 7, 5, 7, 8, 9, 9, 7, 6, 4, 6, 7, 8, 8, 7, 6, 3, 6, 7, 7, 8, 7, 7, 3, 6, 7, 8, 9, 8, 7, 7, 9, 10, 9, 9, 8, 7, 13, 13, 11, 10, 9, 8, 7, 4, 6, 7, 7, 7, 6, 5, 3, 6, 7, 7, 7, 6, 5, 2, 5, 7, 7, 6, 6, 6, 1, 4, 7, 7, 6, 6, 7, 4, 5, 7, 8, 7, 7, 6, 9, 9, 11, 10, 8, 7, 7, 16, 14, 12, 11, 8, 7, 7, 2, 5, 6, 6, 6, 5, 2, 1, 4, 5, 5, 5, 5, 2, 1, 3, 4, 4, 5, 5, 2, 1, 3, 4, 4, 5, 5, 4, 6, 6, 6, 6, 6, 5, 4, 11, 11, 11, 9, 7, 5, 4, 18, 17, 13, 10, 7, 5, 4, 1, 0, 1, 1, 1, 2, 4, 1, 2, 2, 2, 2, 2, 4, 2, 3, 2, 2, 3, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 10, 9, 9, 10, 9, 8, 12, 15, 14, 13, 11, 11, 9, 19, 21, 18, 15, 13, 12, 11, 9, 8, 8, 8, 9, 7, 4, 10, 10, 9, 9, 10, 8, 4, 10, 11, 11, 11, 11, 10, 6, 10, 15, 14, 14, 14, 13, 10, 13, 19, 18, 18, 19, 17, 11, 17, 22, 24, 23, 21, 19, 13, 20, 26, 28, 25, 24, 21, 15, 17, 18, 17, 17, 14, 10, 6, 17, 21, 19, 19, 16, 11, 7, 17, 21, 22, 21, 17, 13, 9, 17, 24, 25, 25, 21, 17, 13, 20, 25, 31, 30, 25, 20, 15, 22, 28, 35, 33, 28, 22, 16, 25, 31, 35, 36, 30, 24, 18, 25, 31, 29, 22, 17, 13, 9, 25, 30, 32, 25, 19, 15, 10, 25, 31, 34, 27, 21, 17, 13, 24, 31, 37, 30, 26, 21, 17, 27, 33, 38, 36, 31, 25, 18, 28, 36, 40, 40, 33, 27, 20, 32, 38, 41, 41, 35, 29, 23, 6, 9, 12, 13, 13, 11, 9, 5, 8, 11, 13, 13, 11, 10, 4, 7, 10, 12, 13, 12, 10, 3, 7, 10, 12, 14, 12, 11, 5, 7, 9, 12, 14, 13, 11, 8, 9, 11, 12, 14, 13, 11, 14, 14, 12, 12, 13, 13, 11, 5, 7, 10, 12, 11, 9, 6, 4, 6, 9, 11, 11, 9, 6, 2, 5, 8, 10, 10, 9, 7, 1, 5, 8, 11, 10, 10, 8, 4, 6, 8, 10, 10, 11, 8, 10, 11, 11, 12, 10, 10, 8, 17, 16, 13, 12, 10, 9, 8, 2, 5, 6, 7, 7, 5, 2, 1, 4, 5, 6, 6, 5, 2, 1, 3, 5, 5, 5, 5, 3, 1, 3, 5, 5, 5, 6, 4, 6, 7, 7, 7, 7, 6, 4, 13, 12, 12, 10, 8, 6, 4, 20, 18, 14, 11, 8, 6, 4, 1, 1, 0, 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, 3, 4, 3, 3, 3, 3, 3, 4, 7, 6, 6, 6, 6, 7, 6, 8, 11, 10, 10, 10, 10, 8, 13, 16, 15, 14, 12, 11, 10, 19, 22, 19, 16, 14, 13, 12, 9, 8, 8, 8, 8, 7, 3, 11, 10, 9, 9, 9, 8, 3, 10, 12, 12, 12, 11, 10, 7, 10, 16, 15, 14, 15, 14, 10, 14, 21, 20, 20, 19, 17, 12, 18, 24, 25, 23, 21, 18, 14, 22, 27, 28, 26, 24, 21, 15, 17, 19, 17, 17, 13, 9, 5, 17, 21, 19, 18, 15, 11, 6, 17, 22, 22, 21, 17, 13, 10, 18, 24, 26, 25, 21, 17, 13, 20, 27, 30, 30, 26, 20, 15, 23, 29, 36, 35, 29, 23, 17, 27, 32, 37, 37, 31, 25, 19, 25, 30, 29, 22, 16, 12, 8, 25, 31, 31, 24, 18, 14, 10, 25, 30, 35, 27, 22, 17, 13, 26, 31, 37, 31, 26, 21, 17, 27, 34, 39, 37, 30, 25, 19, 30, 37, 43, 41, 33, 27, 20, 33, 38, 43, 43, 36, 29, 23, 7, 9, 12, 15, 15, 13, 10, 6, 8, 11, 14, 15, 13, 10, 5, 7, 10, 13, 15, 14, 11, 4, 7, 11, 14, 16, 14, 12, 5, 8, 11, 13, 17, 15, 12, 9, 11, 12, 13, 16, 14, 12, 16, 15, 14, 13, 15, 15, 12, 5, 8, 10, 13, 12, 9, 6, 4, 7, 9, 12, 12, 9, 6, 3, 5, 9, 11, 11, 10, 8, 1, 5, 9, 11, 11, 11, 9, 5, 7, 9, 11, 11, 11, 9, 11, 12, 13, 13, 11, 10, 8, 19, 17, 14, 13, 10, 10, 8, 3, 6, 6, 6, 7, 5, 2, 1, 4, 6, 6, 6, 5, 2, 1, 3, 5, 5, 5, 6, 3, 2, 4, 5, 5, 6, 6, 5, 7, 8, 8, 8, 8, 7, 5, 14, 13, 13, 11, 9, 7, 5, 21, 19, 15, 12, 9, 7, 6, 1, 1, 1, 0, 1, 1, 3, 2, 2, 2, 1, 2, 1, 3, 5, 3, 3, 4, 4, 4, 5, 8, 6, 7, 7, 7, 7, 7, 9, 12, 11, 11, 12, 10, 9, 14, 18, 16, 15, 14, 12, 11, 21, 24, 20, 17, 15, 13, 12, 10, 9, 8, 8, 8, 7, 3, 11, 10, 9, 9, 9, 8, 3, 11, 12, 12, 13, 12, 11, 7, 11, 16, 16, 16, 16, 15, 11, 15, 22, 21, 20, 21, 18, 13, 19, 25, 26, 25, 22, 20, 14, 23, 28, 30, 27, 25, 21, 16, 18, 19, 17, 17, 14, 9, 5, 18, 21, 19, 19, 15, 11, 7, 18, 23, 22, 22, 18, 14, 11, 18, 25, 27, 25, 23, 19, 15, 21, 28, 32, 32, 26, 21, 16, 24, 32, 37, 36, 29, 23, 18, 28, 34, 38, 38, 32, 26, 20, 26, 31, 29, 22, 17, 12, 8, 25, 31, 31, 24, 19, 15, 11, 25, 30, 33, 28, 24, 18, 14, 26, 31, 37, 32, 27, 22, 18, 29, 35, 40, 38, 31, 26, 20, 31, 38, 42, 42, 34, 28, 22, 34, 39, 44, 44, 37, 30, 24, 7, 10, 12, 15, 15, 12, 10, 6, 9, 11, 14, 15, 13, 11, 5, 7, 11, 15, 16, 15, 12, 4, 8, 11, 14, 17, 16, 13, 6, 9, 11, 14, 18, 16, 13, 11, 12, 14, 14, 17, 16, 13, 17, 17, 15, 14, 16, 15, 13, 5, 8, 10, 13, 11, 9, 6, 4, 7, 10, 12, 12, 9, 7, 3, 6, 9, 12, 12, 10, 8, 2, 6, 10, 12, 12, 11, 9, 5, 8, 10, 12, 12, 12, 9, 12, 13, 14, 15, 12, 11, 9, 20, 19, 16, 14, 12, 10, 9, 3, 6, 7, 6, 7, 5, 1, 1, 5, 6, 6, 6, 5, 2, 2, 4, 5, 6, 6, 6, 4, 2, 4, 6, 6, 6, 6, 6, 7, 9, 9, 9, 10, 8, 6, 15, 15, 14, 12, 10, 9, 6, 22, 21, 17, 14, 11, 9, 7, 2, 1, 1, 1, 0, 1, 3, 3, 2, 2, 2, 2, 2, 3, 7, 3, 3, 4, 5, 5, 5, 9, 6, 8, 9, 9, 8, 7, 10, 12, 12, 12, 13, 12, 10, 16, 19, 17, 16, 15, 14, 12, 22, 25, 21, 18, 16, 15, 14, 10, 9, 8, 8, 8, 7, 2, 13, 11, 10, 9, 10, 9, 3, 13, 12, 12, 13, 13, 12, 9, 13, 17, 17, 18, 17, 16, 12, 16, 23, 22, 22, 22, 19, 14, 21, 27, 28, 26, 24, 21, 16, 24, 29, 31, 28, 27, 23, 17, 18, 19, 18, 17, 13, 9, 5, 19, 21, 19, 18, 15, 12, 8, 18, 23, 22, 23, 19, 16, 12, 19, 24, 28, 27, 23, 19, 16, 22, 29, 32, 31, 28, 23, 17, 27, 32, 39, 36, 29, 24, 19, 30, 36, 38, 39, 33, 27, 21, 25, 29, 26, 21, 16, 12, 8, 25, 30, 29, 23, 19, 16, 12, 26, 30, 31, 26, 23, 19, 15, 25, 32, 35, 31, 27, 24, 20, 29, 35, 39, 38, 32, 26, 21, 32, 38, 43, 42, 35, 29, 23, 35, 40, 43, 45, 37, 31, 25, 6, 8, 10, 12, 12, 9, 8, 6, 8, 9, 11, 12, 11, 9, 5, 7, 9, 12, 14, 12, 11, 4, 7, 10, 13, 16, 14, 13, 6, 9, 12, 14, 18, 15, 13, 11, 13, 15, 16, 17, 15, 13, 18, 18, 16, 15, 16, 15, 13, 5, 7, 8, 10, 8, 6, 5, 4, 6, 8, 9, 9, 7, 6, 3, 6, 8, 10, 10, 9, 8, 2, 6, 9, 11, 11, 11, 10, 6, 9, 11, 13, 13, 12, 9, 13, 14, 16, 15, 13, 12, 10, 22, 19, 17, 16, 13, 11, 10, 3, 6, 5, 5, 5, 3, 2, 2, 5, 5, 4, 4, 4, 3, 2, 4, 5, 5, 6, 6, 5, 3, 4, 6, 7, 7, 7, 8, 8, 9, 10, 11, 11, 10, 8, 16, 17, 15, 14, 12, 10, 8, 23, 22, 18, 14, 12, 10, 8, 2, 2, 1, 1, 1, 0, 2, 4, 2, 2, 2, 2, 3, 4, 8, 4, 3, 5, 6, 6, 6, 11, 6, 8, 9, 9, 10, 8, 11, 13, 13, 14, 14, 12, 11, 16, 20, 18, 17, 16, 14, 13, 23, 26, 22, 19, 17, 16, 15, 11, 9, 8, 8, 8, 7, 2, 14, 11, 10, 9, 10, 9, 4, 14, 13, 12, 13, 14, 12, 9, 14, 17, 17, 17, 17, 17, 13, 16, 23, 23, 23, 22, 19, 15, 21, 27, 28, 26, 23, 21, 17, 26, 31, 31, 28, 26, 22, 18, 18, 17, 15, 13, 12, 9, 6, 18, 19, 16, 14, 12, 12, 9, 18, 21, 18, 19, 17, 15, 13, 18, 23, 25, 24, 22, 19, 17, 22, 29, 31, 29, 26, 23, 18, 26, 33, 37, 34, 28, 23, 20, 30, 36, 38, 37, 30, 25, 21, 22, 25, 22, 17, 13, 10, 9, 22, 25, 24, 18, 15, 14, 12, 22, 25, 27, 22, 20, 18, 15, 22, 27, 33, 29, 25, 22, 20, 27, 31, 37, 34, 30, 25, 21, 31, 36, 40, 40, 32, 27, 22, 35, 39, 42, 41, 35, 29, 24, 9, 11, 13, 16, 16, 13, 10, 9, 11, 12, 15, 16, 14, 12, 8, 9, 12, 16, 17, 15, 13, 8, 10, 13, 16, 19, 16, 14, 8, 11, 13, 17, 20, 18, 14, 11, 13, 15, 16, 19, 18, 15, 18, 17, 16, 16, 18, 17, 14, 8, 10, 12, 13, 11, 8, 7, 8, 9, 11, 13, 12, 10, 8, 7, 8, 11, 14, 13, 11, 9, 6, 8, 11, 14, 13, 12, 11, 6, 10, 12, 14, 14, 13, 11, 13, 14, 16, 15, 14, 13, 11, 22, 19, 17, 15, 13, 12, 11, 7, 8, 8, 7, 7, 5, 3, 6, 8, 8, 7, 7, 6, 4, 5, 7, 7, 8, 8, 8, 6, 3, 7, 8, 8, 9, 9, 8, 7, 9, 10, 10, 10, 9, 8, 16, 16, 15, 13, 11, 9, 8, 23, 22, 18, 14, 11, 9, 8, 5, 4, 3, 3, 3, 3, 0, 2, 2, 3, 2, 2, 2, 2, 6, 2, 2, 3, 3, 3, 4, 10, 3, 5, 6, 6, 6, 6, 9, 10, 10, 10, 10, 9, 7, 15, 18, 16, 14, 12, 10, 8, 24, 25, 19, 15, 13, 11, 9, 4, 3, 2, 2, 2, 2, 0, 6, 3, 3, 2, 3, 3, 2, 6, 4, 4, 5, 6, 6, 5, 6, 8, 9, 10, 10, 9, 8, 9, 14, 15, 15, 15, 13, 9, 16, 20, 22, 20, 17, 14, 10, 22, 25, 25, 21, 19, 15, 11, 8, 7, 6, 5, 3, 2, 1, 7, 10, 7, 6, 4, 4, 3, 8, 11, 10, 11, 9, 8, 7, 8, 14, 17, 17, 14, 12, 10, 12, 19, 23, 23, 20, 16, 11, 18, 24, 30, 28, 22, 17, 13, 24, 28, 31, 30, 24, 19, 14, 13, 16, 14, 8, 5, 3, 2, 13, 16, 16, 10, 7, 6, 5, 13, 16, 19, 15, 12, 10, 8, 13, 18, 25, 21, 18, 15, 13, 17, 24, 30, 28, 23, 19, 14, 22, 28, 34, 34, 27, 21, 15, 27, 32, 35, 35, 29, 23, 17, 6, 10, 15, 18, 18, 16, 15, 5, 9, 14, 17, 18, 15, 13, 3, 8, 11, 15, 16, 14, 11, 2, 5, 9, 11, 13, 13, 10, 1, 2, 6, 10, 12, 14, 10, 5, 5, 5, 8, 11, 14, 10, 11, 9, 5, 7, 10, 14, 10, 3, 7, 12, 15, 16, 14, 10, 2, 6, 11, 14, 15, 13, 8, 2, 5, 9, 11, 12, 11, 5, 2, 2, 6, 8, 9, 8, 3, 2, 2, 3, 6, 7, 8, 3, 7, 7, 6, 5, 6, 6, 4, 15, 12, 8, 5, 4, 5, 4, 2, 5, 7, 9, 11, 9, 5, 2, 3, 6, 8, 8, 8, 2, 1, 2, 4, 5, 5, 5, 1, 0, 2, 2, 1, 2, 1, 1, 4, 4, 4, 4, 4, 2, 1, 10, 9, 9, 8, 5, 3, 1, 16, 15, 11, 9, 6, 4, 2, 1, 1, 1, 2, 3, 4, 2, 0, 1, 1, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 7, 7, 8, 7, 6, 9, 13, 11, 11, 10, 9, 8, 16, 18, 14, 13, 12, 10, 9, 7, 7, 7, 8, 8, 7, 3, 8, 8, 9, 9, 9, 8, 3, 8, 10, 10, 10, 11, 9, 5, 8, 13, 12, 13, 13, 12, 8, 11, 16, 15, 15, 15, 14, 10, 14, 18, 19, 17, 16, 16, 12, 17, 20, 21, 18, 18, 16, 13, 16, 16, 16, 16, 14, 10, 5, 15, 18, 17, 16, 14, 11, 7, 15, 19, 18, 17, 16, 13, 8, 15, 19, 19, 18, 16, 15, 11, 16, 20, 22, 21, 18, 16, 13, 18, 22, 25, 23, 20, 17, 14, 20, 24, 25, 25, 21, 18, 15, 21, 25, 22, 19, 16, 14, 8, 21, 25, 25, 20, 16, 14, 10, 20, 25, 27, 21, 17, 15, 11, 21, 24, 27, 22, 18, 17, 15, 21, 25, 28, 26, 21, 18, 16, 21, 25, 29, 28, 23, 19, 17, 24, 26, 29, 29, 24, 20, 17, 7, 8, 9, 11, 11, 9, 7, 6, 7, 8, 10, 10, 8, 7, 5, 7, 8, 9, 9, 8, 7, 4, 6, 7, 8, 8, 8, 8, 4, 7, 8, 8, 9, 8, 8, 7, 8, 9, 9, 9, 8, 8, 13, 13, 11, 9, 9, 8, 7, 5, 7, 8, 9, 9, 7, 6, 4, 7, 8, 8, 8, 7, 6, 3, 6, 7, 7, 7, 7, 6, 2, 5, 7, 8, 7, 7, 7, 3, 5, 7, 8, 7, 7, 7, 8, 9, 10, 10, 8, 7, 7, 16, 15, 12, 10, 8, 7, 7, 3, 6, 6, 6, 7, 6, 3, 2, 5, 6, 6, 6, 6, 3, 1, 4, 5, 5, 6, 6, 3, 1, 4, 5, 5, 6, 6, 5, 5, 6, 6, 6, 6, 6, 5, 11, 11, 11, 9, 7, 5, 5, 18, 17, 13, 10, 7, 5, 3, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 4, 4, 4, 4, 4, 4, 5, 6, 8, 8, 8, 8, 7, 6, 11, 14, 13, 12, 10, 9, 8, 18, 20, 16, 14, 12, 10, 9, 7, 7, 7, 7, 7, 6, 2, 9, 9, 8, 8, 8, 7, 3, 9, 10, 10, 10, 10, 8, 4, 9, 13, 13, 12, 13, 12, 8, 12, 18, 17, 17, 18, 15, 10, 15, 21, 23, 21, 20, 17, 11, 19, 24, 26, 23, 22, 18, 13, 16, 17, 17, 16, 13, 9, 5, 15, 20, 18, 18, 14, 10, 6, 15, 21, 20, 20, 16, 12, 8, 16, 22, 24, 23, 19, 15, 11, 18, 24, 29, 28, 24, 19, 13, 20, 27, 32, 31, 27, 21, 15, 25, 30, 34, 32, 28, 23, 17, 23, 29, 28, 22, 16, 12, 7, 23, 29, 30, 24, 18, 13, 9, 23, 30, 33, 26, 20, 15, 11, 24, 29, 34, 29, 24, 20, 15, 24, 31, 35, 34, 28, 23, 17, 27, 33, 37, 36, 30, 25, 19, 30, 35, 39, 38, 33, 27, 22, 7, 10, 12, 14, 14, 12, 10, 7, 9, 12, 13, 14, 12, 10, 5, 8, 10, 13, 13, 12, 11, 4, 8, 10, 12, 14, 13, 12, 5, 8, 10, 13, 15, 13, 12, 8, 10, 11, 13, 14, 13, 11, 14, 14, 13, 12, 13, 13, 12, 5, 8, 11, 12, 11, 10, 7, 5, 7, 10, 12, 11, 10, 7, 3, 6, 9, 11, 11, 10, 8, 3, 6, 9, 11, 11, 11, 9, 5, 6, 8, 11, 11, 11, 9, 10, 11, 12, 12, 10, 10, 9, 17, 16, 13, 12, 10, 9, 9, 4, 6, 7, 7, 8, 6, 3, 2, 5, 6, 7, 7, 6, 3, 1, 4, 5, 5, 6, 6, 3, 1, 4, 5, 6, 6, 6, 4, 6, 7, 7, 7, 7, 6, 5, 12, 12, 11, 10, 8, 6, 4, 19, 19, 14, 11, 8, 6, 5, 2, 2, 1, 1, 2, 2, 3, 1, 1, 0, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 4, 6, 5, 5, 5, 5, 5, 5, 7, 9, 9, 9, 9, 9, 7, 12, 15, 14, 13, 11, 10, 9, 19, 21, 17, 15, 13, 11, 11, 8, 7, 7, 7, 7, 6, 3, 9, 9, 8, 8, 8, 7, 3, 9, 10, 10, 10, 10, 9, 5, 9, 14, 14, 14, 14, 13, 9, 13, 19, 19, 18, 18, 16, 11, 17, 22, 24, 23, 20, 18, 12, 21, 26, 28, 24, 23, 20, 14, 16, 18, 17, 16, 13, 9, 4, 16, 20, 18, 18, 14, 9, 6, 17, 21, 21, 20, 16, 12, 8, 17, 24, 25, 24, 21, 16, 12, 20, 25, 30, 29, 25, 19, 14, 22, 28, 35, 32, 28, 21, 16, 25, 31, 35, 36, 28, 23, 18, 24, 30, 27, 21, 16, 12, 7, 24, 30, 30, 23, 18, 13, 9, 24, 30, 33, 26, 21, 16, 12, 24, 31, 36, 30, 24, 20, 16, 25, 32, 38, 34, 29, 23, 18, 28, 34, 39, 40, 33, 26, 20, 31, 37, 41, 41, 35, 28, 21, 8, 10, 13, 16, 16, 13, 11, 7, 9, 12, 15, 16, 14, 11, 6, 8, 11, 14, 16, 14, 12, 5, 9, 11, 14, 17, 15, 13, 6, 8, 11, 14, 17, 16, 13, 10, 11, 12, 14, 17, 16, 13, 16, 15, 13, 13, 15, 15, 13, 6, 8, 11, 14, 12, 10, 7, 5, 8, 10, 13, 12, 10, 7, 4, 7, 10, 12, 12, 10, 9, 3, 7, 10, 12, 12, 12, 9, 5, 7, 9, 12, 12, 12, 9, 11, 11, 13, 13, 11, 12, 9, 19, 17, 15, 13, 10, 10, 9, 4, 7, 7, 7, 8, 6, 2, 3, 5, 7, 7, 7, 6, 2, 1, 5, 6, 6, 6, 6, 4, 1, 5, 6, 6, 7, 7, 5, 7, 8, 8, 8, 8, 7, 5, 14, 14, 13, 11, 9, 7, 5, 21, 20, 15, 12, 9, 7, 5, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 0, 1, 1, 3, 3, 2, 2, 2, 3, 3, 4, 6, 5, 6, 6, 6, 6, 6, 8, 11, 10, 10, 10, 9, 8, 14, 17, 15, 14, 12, 11, 9, 21, 23, 18, 16, 14, 12, 11, 8, 8, 7, 7, 7, 6, 3, 10, 9, 8, 8, 8, 7, 3, 10, 11, 11, 11, 11, 10, 6, 10, 15, 15, 15, 15, 14, 10, 13, 20, 20, 19, 19, 16, 11, 18, 25, 25, 24, 21, 18, 13, 22, 27, 28, 26, 23, 20, 15, 17, 18, 17, 16, 12, 8, 4, 17, 20, 18, 17, 14, 10, 6, 17, 22, 22, 21, 17, 13, 9, 17, 24, 26, 25, 21, 17, 13, 20, 26, 30, 30, 25, 20, 15, 23, 29, 36, 33, 28, 22, 17, 27, 32, 36, 37, 30, 24, 19, 24, 30, 28, 21, 16, 11, 7, 24, 29, 29, 23, 18, 13, 10, 24, 30, 33, 27, 21, 17, 13, 24, 31, 37, 30, 25, 21, 17, 28, 33, 39, 36, 31, 24, 19, 30, 36, 41, 41, 33, 27, 20, 33, 38, 43, 43, 36, 28, 22, 8, 11, 14, 17, 17, 15, 12, 7, 10, 13, 17, 17, 14, 12, 6, 9, 12, 15, 18, 15, 13, 5, 9, 12, 15, 19, 16, 14, 6, 9, 12, 15, 19, 17, 14, 10, 12, 13, 14, 18, 17, 14, 16, 15, 14, 14, 16, 16, 14, 6, 9, 11, 15, 14, 11, 8, 5, 8, 11, 13, 13, 10, 8, 4, 7, 10, 13, 13, 11, 9, 3, 7, 11, 13, 13, 12, 10, 5, 8, 10, 12, 13, 12, 10, 12, 12, 14, 14, 12, 12, 10, 19, 17, 15, 14, 11, 11, 10, 4, 7, 8, 8, 9, 7, 3, 3, 6, 7, 7, 7, 6, 3, 1, 5, 6, 7, 7, 7, 4, 1, 5, 7, 7, 7, 7, 6, 7, 8, 9, 8, 8, 7, 6, 14, 14, 14, 12, 9, 7, 6, 21, 20, 16, 12, 10, 8, 6, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 2, 4, 2, 2, 3, 3, 3, 3, 7, 5, 6, 6, 6, 6, 5, 8, 11, 10, 10, 11, 9, 8, 14, 17, 15, 14, 12, 11, 10, 21, 23, 19, 16, 14, 12, 11, 8, 7, 7, 7, 7, 6, 2, 10, 9, 8, 8, 8, 7, 2, 10, 11, 10, 11, 11, 10, 6, 10, 15, 15, 15, 15, 14, 10, 14, 21, 20, 20, 19, 17, 12, 18, 24, 26, 24, 21, 18, 13, 23, 28, 29, 26, 24, 21, 15, 17, 18, 17, 15, 12, 9, 4, 16, 19, 18, 17, 13, 10, 6, 17, 22, 21, 21, 18, 13, 9, 16, 24, 26, 25, 22, 18, 13, 20, 27, 30, 30, 26, 21, 15, 24, 30, 37, 35, 28, 23, 17, 28, 32, 37, 37, 30, 24, 19, 24, 28, 25, 20, 15, 11, 7, 24, 28, 28, 22, 17, 13, 10, 24, 29, 31, 25, 21, 17, 13, 24, 30, 35, 31, 25, 21, 17, 28, 33, 38, 35, 30, 24, 19, 30, 35, 41, 40, 32, 27, 21, 34, 39, 41, 42, 35, 29, 23, 8, 11, 14, 17, 17, 15, 11, 7, 10, 13, 16, 16, 14, 12, 6, 9, 12, 15, 17, 16, 13, 5, 9, 12, 16, 18, 16, 14, 6, 9, 12, 15, 18, 17, 14, 10, 12, 13, 14, 18, 17, 14, 17, 16, 14, 14, 16, 17, 14, 6, 9, 12, 14, 13, 11, 8, 5, 8, 11, 13, 13, 10, 8, 4, 7, 10, 14, 13, 11, 9, 3, 7, 11, 13, 13, 12, 10, 5, 8, 10, 13, 13, 12, 10, 11, 12, 14, 13, 12, 12, 10, 19, 17, 15, 14, 11, 11, 9, 4, 7, 8, 8, 9, 7, 3, 3, 6, 7, 7, 7, 6, 3, 2, 5, 6, 7, 7, 7, 4, 1, 5, 7, 7, 7, 7, 6, 6, 8, 9, 9, 8, 7, 6, 14, 14, 13, 11, 9, 8, 6, 21, 19, 15, 12, 10, 8, 6, 2, 2, 1, 1, 2, 3, 2, 1, 1, 1, 1, 0, 0, 2, 5, 2, 2, 3, 3, 3, 3, 7, 5, 6, 6, 6, 6, 5, 9, 11, 10, 11, 10, 10, 8, 14, 17, 16, 14, 13, 11, 10, 21, 23, 19, 16, 14, 13, 12, 9, 8, 7, 6, 7, 6, 2, 11, 10, 8, 8, 8, 7, 2, 11, 11, 10, 11, 11, 10, 6, 10, 15, 15, 15, 15, 14, 10, 14, 21, 20, 20, 19, 16, 12, 18, 24, 25, 23, 21, 18, 13, 23, 27, 29, 25, 22, 20, 15, 16, 16, 14, 13, 11, 8, 5, 16, 18, 15, 13, 12, 10, 6, 16, 20, 17, 17, 15, 12, 10, 17, 21, 23, 21, 19, 17, 13, 20, 26, 28, 26, 23, 20, 15, 24, 29, 33, 30, 25, 21, 17, 27, 33, 34, 33, 26, 23, 19, 21, 23, 20, 15, 13, 10, 7, 21, 24, 23, 17, 14, 13, 9, 21, 24, 25, 21, 18, 16, 13, 21, 25, 30, 25, 22, 19, 16, 25, 29, 34, 32, 27, 23, 19, 29, 33, 37, 36, 29, 24, 20, 32, 35, 37, 38, 32, 26, 21, 9, 11, 14, 17, 17, 14, 11, 9, 11, 13, 16, 17, 13, 11, 8, 10, 12, 15, 17, 15, 12, 8, 10, 13, 16, 18, 15, 13, 8, 10, 13, 15, 19, 17, 13, 11, 11, 13, 15, 18, 16, 13, 16, 15, 14, 14, 16, 17, 13, 8, 10, 12, 14, 13, 10, 7, 8, 9, 11, 13, 13, 9, 7, 7, 8, 11, 13, 12, 10, 8, 6, 9, 12, 14, 13, 12, 9, 6, 9, 11, 13, 13, 12, 10, 11, 12, 13, 13, 12, 11, 10, 19, 17, 14, 13, 11, 11, 10, 7, 9, 9, 8, 9, 7, 4, 6, 8, 8, 7, 7, 6, 3, 5, 8, 8, 7, 7, 6, 5, 4, 7, 8, 8, 7, 7, 6, 7, 9, 9, 8, 8, 7, 6, 14, 14, 13, 11, 9, 7, 6, 21, 19, 14, 11, 9, 7, 6, 5, 4, 3, 3, 3, 4, 2, 3, 3, 3, 2, 2, 2, 0, 2, 2, 2, 3, 2, 2, 2, 7, 3, 4, 5, 4, 4, 4, 8, 9, 9, 8, 8, 7, 5, 14, 15, 14, 11, 10, 8, 6, 20, 21, 16, 13, 11, 9, 7, 5, 3, 2, 2, 2, 2, 2, 6, 4, 3, 2, 3, 2, 0, 5, 5, 4, 4, 4, 4, 3, 5, 8, 8, 8, 8, 8, 6, 9, 14, 13, 13, 13, 10, 7, 14, 19, 20, 18, 15, 12, 8, 20, 23, 23, 19, 17, 14, 9, 9, 9, 7, 6, 4, 3, 2, 9, 11, 9, 8, 5, 3, 2, 8, 12, 11, 11, 9, 6, 5, 9, 14, 17, 16, 13, 10, 8, 12, 18, 22, 21, 18, 14, 9, 17, 23, 27, 25, 20, 15, 11, 22, 26, 29, 28, 23, 17, 12, 14, 18, 15, 10, 6, 3, 2, 13, 18, 18, 12, 8, 5, 3, 14, 18, 20, 15, 12, 9, 6, 14, 19, 25, 21, 17, 13, 11, 17, 23, 28, 26, 22, 17, 12, 22, 26, 32, 32, 25, 19, 14, 26, 30, 33, 33, 27, 20, 15, 10, 14, 18, 22, 22, 20, 17, 8, 12, 17, 20, 22, 19, 16, 7, 11, 14, 17, 20, 17, 13, 5, 9, 12, 15, 16, 15, 13, 3, 6, 10, 13, 15, 16, 14, 4, 5, 8, 11, 14, 16, 13, 10, 7, 7, 11, 13, 15, 14, 7, 11, 15, 18, 20, 17, 13, 5, 9, 14, 17, 19, 15, 12, 4, 8, 12, 13, 15, 14, 9, 3, 6, 9, 11, 12, 13, 8, 2, 3, 7, 10, 12, 12, 8, 6, 5, 6, 8, 10, 11, 8, 12, 10, 6, 8, 8, 8, 8, 4, 8, 10, 12, 13, 12, 9, 2, 7, 9, 11, 11, 11, 7, 1, 5, 8, 9, 9, 10, 4, 1, 3, 4, 5, 5, 5, 1, 3, 3, 3, 3, 3, 3, 1, 9, 8, 7, 5, 4, 2, 1, 14, 13, 9, 7, 5, 4, 1, 2, 2, 4, 5, 7, 8, 6, 1, 1, 2, 3, 4, 5, 2, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 6, 6, 6, 6, 5, 4, 9, 10, 9, 8, 8, 7, 6, 14, 15, 11, 10, 9, 8, 8, 6, 6, 6, 6, 6, 4, 6, 7, 7, 8, 8, 8, 6, 3, 7, 9, 8, 8, 9, 8, 3, 7, 10, 10, 10, 10, 9, 6, 9, 13, 12, 12, 12, 11, 8, 11, 15, 15, 14, 13, 12, 9, 14, 17, 17, 15, 14, 13, 10, 13, 13, 13, 13, 11, 8, 5, 12, 15, 14, 13, 12, 9, 6, 12, 16, 15, 14, 12, 10, 7, 13, 15, 16, 15, 13, 11, 9, 13, 16, 18, 17, 16, 12, 10, 14, 18, 22, 20, 17, 14, 11, 16, 20, 22, 21, 18, 15, 12, 17, 20, 19, 16, 13, 11, 6, 18, 21, 21, 16, 13, 11, 8, 17, 21, 23, 17, 14, 11, 9, 17, 21, 23, 19, 15, 13, 11, 17, 21, 24, 21, 18, 15, 12, 18, 22, 25, 25, 19, 16, 13, 20, 23, 26, 25, 21, 16, 14, 7, 8, 10, 13, 13, 11, 9, 7, 8, 10, 12, 13, 10, 8, 6, 8, 9, 10, 11, 9, 7, 5, 7, 8, 9, 10, 8, 8, 5, 7, 8, 9, 10, 9, 8, 7, 8, 9, 9, 9, 8, 8, 13, 13, 11, 9, 9, 8, 8, 7, 8, 9, 10, 11, 9, 7, 6, 7, 8, 10, 11, 8, 7, 4, 7, 8, 8, 8, 7, 6, 3, 6, 7, 8, 7, 7, 7, 3, 6, 8, 8, 8, 8, 7, 8, 9, 10, 9, 7, 7, 7, 16, 15, 12, 10, 8, 7, 7, 4, 7, 7, 7, 7, 7, 5, 3, 6, 7, 7, 7, 6, 4, 2, 5, 6, 6, 6, 6, 5, 1, 5, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 11, 11, 10, 9, 7, 5, 6, 18, 17, 13, 10, 7, 5, 4, 2, 3, 3, 3, 3, 4, 2, 1, 1, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1, 2, 3, 2, 2, 3, 3, 3, 3, 5, 7, 6, 6, 7, 6, 5, 11, 12, 12, 11, 9, 8, 7, 18, 20, 15, 13, 11, 9, 8, 6, 6, 6, 6, 6, 5, 2, 7, 7, 7, 7, 7, 6, 2, 8, 9, 9, 8, 9, 7, 3, 8, 12, 11, 11, 12, 11, 7, 10, 16, 16, 15, 17, 14, 9, 13, 19, 22, 20, 19, 16, 11, 18, 23, 24, 22, 20, 18, 12, 14, 16, 15, 16, 12, 8, 4, 14, 18, 17, 18, 14, 9, 5, 14, 20, 19, 20, 16, 11, 7, 14, 20, 22, 22, 19, 14, 10, 16, 22, 27, 24, 22, 18, 12, 19, 25, 30, 28, 24, 20, 14, 23, 28, 31, 30, 26, 22, 16, 22, 28, 26, 20, 16, 11, 6, 22, 28, 28, 23, 18, 12, 8, 22, 27, 31, 24, 19, 14, 10, 22, 27, 32, 25, 22, 18, 14, 23, 28, 33, 30, 25, 22, 16, 26, 30, 34, 32, 28, 24, 18, 28, 31, 34, 35, 29, 25, 21, 9, 12, 14, 14, 15, 13, 12, 8, 10, 13, 14, 15, 13, 11, 6, 10, 12, 14, 14, 12, 11, 5, 8, 11, 13, 14, 13, 12, 6, 8, 11, 14, 15, 14, 12, 8, 9, 11, 13, 15, 14, 12, 14, 14, 12, 12, 13, 14, 12, 6, 10, 12, 13, 13, 11, 9, 6, 9, 11, 13, 13, 11, 8, 4, 7, 10, 12, 12, 10, 9, 3, 7, 10, 12, 11, 11, 9, 4, 6, 9, 11, 11, 12, 10, 9, 10, 12, 12, 11, 11, 9, 17, 15, 13, 12, 10, 10, 9, 4, 7, 9, 9, 9, 8, 4, 3, 6, 8, 8, 8, 7, 4, 2, 5, 7, 7, 7, 7, 4, 2, 5, 6, 6, 7, 7, 5, 6, 6, 7, 6, 7, 6, 5, 12, 12, 11, 10, 7, 6, 5, 19, 18, 14, 10, 8, 6, 4, 2, 2, 3, 3, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 2, 4, 3, 3, 4, 4, 4, 5, 6, 8, 7, 7, 8, 7, 6, 12, 14, 12, 11, 10, 8, 7, 19, 20, 16, 13, 11, 10, 9, 7, 6, 6, 6, 6, 5, 2, 8, 8, 7, 7, 8, 6, 2, 8, 9, 9, 9, 9, 7, 4, 8, 13, 12, 12, 12, 11, 7, 11, 17, 17, 16, 16, 14, 9, 15, 21, 23, 20, 19, 16, 11, 19, 24, 26, 23, 21, 18, 13, 15, 17, 15, 16, 12, 8, 4, 15, 18, 18, 17, 13, 9, 5, 15, 20, 19, 19, 15, 11, 7, 15, 21, 23, 23, 19, 15, 11, 18, 25, 28, 26, 23, 18, 12, 20, 26, 33, 31, 26, 19, 14, 23, 29, 33, 33, 28, 22, 16, 22, 28, 27, 21, 15, 11, 6, 22, 28, 30, 22, 17, 12, 8, 23, 28, 32, 25, 19, 15, 11, 23, 29, 34, 28, 22, 18, 15, 24, 31, 37, 34, 28, 21, 16, 27, 34, 39, 37, 31, 25, 18, 30, 35, 40, 40, 33, 26, 20, 9, 13, 16, 19, 19, 17, 14, 8, 12, 15, 18, 19, 16, 13, 7, 10, 14, 17, 18, 15, 13, 6, 9, 12, 15, 17, 15, 13, 6, 9, 11, 15, 17, 15, 13, 8, 9, 11, 14, 16, 16, 13, 14, 14, 12, 13, 16, 15, 13, 7, 11, 14, 17, 16, 13, 10, 6, 9, 13, 16, 16, 13, 9, 5, 8, 11, 14, 14, 11, 8, 4, 7, 10, 12, 12, 12, 9, 5, 7, 10, 12, 12, 12, 9, 9, 10, 11, 12, 11, 11, 9, 17, 15, 13, 11, 10, 10, 9, 5, 8, 9, 10, 11, 9, 6, 4, 6, 8, 9, 10, 9, 5, 3, 5, 7, 7, 7, 7, 4, 2, 6, 6, 6, 6, 7, 5, 6, 7, 7, 6, 6, 6, 5, 12, 12, 11, 9, 7, 5, 5, 19, 17, 13, 10, 7, 5, 4, 3, 2, 3, 4, 4, 5, 3, 1, 2, 2, 3, 3, 3, 3, 1, 1, 0, 0, 0, 0, 2, 4, 3, 3, 3, 3, 3, 4, 6, 8, 7, 7, 7, 7, 5, 12, 14, 12, 11, 10, 8, 7, 19, 20, 16, 13, 11, 10, 8, 7, 6, 6, 7, 7, 6, 3, 8, 8, 7, 8, 8, 7, 3, 8, 9, 9, 9, 9, 7, 4, 8, 13, 12, 12, 12, 11, 7, 11, 17, 17, 16, 16, 14, 9, 15, 21, 22, 21, 18, 16, 11, 19, 24, 25, 23, 21, 18, 12, 15, 17, 16, 16, 13, 9, 5, 15, 19, 18, 17, 14, 9, 5, 15, 20, 19, 18, 14, 11, 7, 15, 22, 24, 22, 19, 15, 10, 18, 24, 28, 26, 23, 18, 12, 21, 26, 34, 32, 25, 20, 14, 24, 29, 34, 33, 27, 22, 16, 23, 28, 27, 21, 16, 12, 7, 23, 29, 29, 22, 17, 12, 8, 23, 28, 32, 24, 19, 15, 10, 22, 29, 35, 29, 22, 18, 14, 23, 30, 36, 34, 27, 22, 16, 27, 32, 39, 38, 31, 24, 18, 30, 36, 40, 40, 33, 26, 20, 10, 14, 18, 20, 21, 19, 15, 8, 12, 16, 20, 21, 17, 13, 7, 10, 15, 18, 19, 16, 13, 6, 9, 12, 15, 19, 16, 13, 6, 9, 12, 15, 18, 16, 14, 8, 9, 11, 14, 18, 17, 13, 14, 13, 12, 13, 16, 17, 14, 7, 11, 15, 18, 17, 14, 11, 6, 10, 13, 16, 17, 13, 9, 5, 8, 12, 14, 14, 11, 9, 4, 7, 10, 13, 13, 12, 10, 5, 7, 10, 12, 12, 12, 9, 10, 10, 11, 12, 12, 11, 10, 17, 15, 12, 12, 10, 11, 9, 5, 8, 10, 11, 12, 10, 6, 4, 7, 9, 10, 10, 9, 5, 3, 6, 7, 7, 7, 7, 4, 1, 6, 6, 6, 7, 7, 5, 6, 7, 7, 6, 6, 6, 5, 13, 12, 11, 9, 7, 6, 5, 19, 17, 13, 10, 7, 5, 4, 3, 3, 3, 4, 5, 6, 3, 1, 1, 2, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 1, 4, 3, 4, 3, 3, 3, 3, 6, 8, 7, 7, 7, 6, 5, 13, 14, 12, 11, 9, 8, 6, 19, 21, 15, 13, 11, 9, 8, 7, 6, 6, 6, 7, 6, 3, 9, 8, 7, 7, 8, 6, 2, 9, 10, 9, 8, 8, 7, 3, 9, 13, 12, 12, 12, 11, 7, 12, 18, 17, 16, 16, 13, 8, 15, 21, 22, 20, 18, 15, 10, 19, 24, 26, 23, 21, 17, 12, 15, 16, 15, 15, 12, 9, 4, 15, 19, 17, 17, 13, 9, 4, 15, 20, 19, 18, 14, 10, 7, 15, 21, 23, 21, 18, 14, 10, 18, 24, 29, 26, 23, 17, 12, 20, 27, 33, 31, 25, 19, 14, 24, 29, 33, 33, 28, 21, 15, 22, 27, 26, 20, 15, 11, 7, 23, 27, 27, 21, 16, 12, 7, 22, 27, 29, 23, 18, 14, 10, 23, 28, 33, 27, 23, 18, 13, 25, 30, 35, 33, 26, 22, 16, 27, 32, 38, 38, 30, 23, 18, 29, 34, 38, 37, 32, 25, 20, 10, 14, 17, 21, 21, 18, 15, 9, 12, 15, 20, 20, 17, 13, 7, 11, 14, 17, 19, 15, 13, 6, 9, 12, 16, 18, 16, 14, 6, 9, 12, 15, 19, 17, 14, 9, 10, 11, 14, 18, 17, 14, 14, 13, 12, 14, 17, 17, 13, 7, 11, 15, 18, 17, 15, 11, 6, 10, 13, 16, 17, 13, 9, 5, 8, 12, 15, 14, 11, 9, 4, 8, 11, 13, 13, 12, 9, 5, 7, 10, 12, 13, 12, 10, 10, 10, 11, 12, 12, 12, 10, 16, 14, 12, 12, 11, 11, 10, 5, 8, 10, 11, 12, 10, 6, 4, 7, 9, 10, 10, 9, 5, 3, 6, 7, 8, 7, 7, 4, 2, 6, 7, 7, 7, 7, 5, 6, 7, 7, 7, 7, 6, 5, 13, 12, 11, 9, 7, 5, 5, 17, 16, 12, 10, 7, 5, 4, 3, 3, 3, 4, 5, 6, 4, 1, 1, 2, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 1, 4, 4, 4, 3, 3, 3, 3, 7, 9, 8, 7, 8, 6, 5, 13, 14, 12, 10, 9, 8, 6, 18, 19, 15, 13, 11, 9, 8, 7, 6, 6, 6, 7, 6, 4, 9, 8, 7, 7, 8, 6, 2, 9, 10, 9, 8, 8, 7, 3, 9, 14, 13, 12, 12, 10, 7, 12, 18, 17, 16, 16, 14, 9, 15, 21, 22, 20, 18, 15, 10, 18, 23, 24, 22, 19, 17, 12, 15, 15, 14, 13, 11, 9, 4, 16, 17, 15, 14, 12, 9, 4, 15, 19, 17, 15, 12, 10, 7, 15, 20, 21, 18, 16, 14, 10, 18, 23, 26, 23, 20, 17, 12, 21, 25, 31, 27, 22, 18, 14, 23, 28, 31, 29, 24, 20, 15, 20, 23, 20, 15, 13, 11, 7, 21, 23, 22, 17, 13, 11, 7, 20, 23, 23, 19, 15, 13, 10, 20, 24, 28, 22, 18, 17, 14, 23, 26, 30, 28, 23, 19, 16, 26, 29, 33, 32, 25, 21, 17, 28, 31, 34, 34, 27, 22, 18, 11, 13, 16, 19, 19, 16, 13, 10, 12, 15, 18, 18, 15, 11, 8, 11, 14, 16, 17, 14, 11, 7, 9, 12, 15, 17, 15, 12, 8, 10, 12, 15, 18, 15, 12, 8, 9, 12, 14, 17, 16, 12, 12, 12, 11, 13, 16, 16, 12, 9, 11, 14, 16, 15, 12, 9, 7, 10, 12, 15, 14, 11, 8, 7, 9, 12, 13, 12, 10, 7, 6, 9, 11, 13, 12, 10, 8, 6, 8, 10, 12, 12, 11, 9, 10, 9, 10, 12, 11, 11, 8, 15, 13, 11, 11, 10, 9, 8, 7, 9, 10, 10, 11, 9, 6, 6, 8, 9, 9, 9, 7, 4, 4, 7, 8, 7, 6, 6, 4, 4, 8, 7, 7, 6, 6, 5, 6, 8, 7, 7, 6, 6, 5, 12, 11, 10, 8, 6, 5, 5, 16, 15, 11, 9, 6, 5, 4, 5, 4, 4, 4, 5, 6, 4, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 2, 1, 1, 0, 4, 2, 3, 3, 2, 2, 2, 7, 7, 6, 6, 6, 5, 3, 12, 13, 11, 9, 7, 6, 4, 17, 18, 13, 10, 8, 7, 5, 4, 4, 3, 3, 3, 4, 4, 5, 5, 3, 3, 3, 3, 2, 6, 5, 4, 4, 4, 3, 2, 5, 9, 8, 7, 7, 6, 4, 8, 14, 13, 12, 12, 9, 5, 13, 17, 18, 16, 14, 11, 7, 16, 20, 21, 18, 15, 13, 8, 10, 10, 9, 9, 7, 4, 3, 9, 12, 11, 10, 8, 4, 2, 9, 13, 12, 12, 8, 5, 3, 9, 15, 16, 15, 12, 9, 6, 13, 18, 22, 20, 17, 12, 8, 16, 21, 27, 24, 19, 14, 10, 20, 24, 27, 27, 21, 16, 11, 15, 19, 18, 13, 9, 6, 3, 15, 20, 20, 15, 10, 6, 3, 15, 20, 22, 16, 12, 8, 5, 15, 20, 25, 20, 16, 13, 9, 18, 23, 28, 26, 21, 16, 11, 21, 26, 31, 30, 23, 17, 13, 24, 29, 31, 32, 25, 20, 14, 13, 16, 20, 25, 25, 24, 19, 11, 14, 18, 23, 25, 21, 17, 10, 14, 17, 20, 23, 19, 16, 8, 12, 14, 17, 20, 18, 15, 6, 9, 12, 15, 17, 18, 15, 5, 8, 11, 13, 16, 18, 15, 7, 8, 9, 13, 15, 18, 15, 9, 14, 17, 20, 21, 19, 15, 8, 13, 15, 19, 21, 18, 14, 7, 11, 14, 17, 17, 15, 12, 6, 9, 12, 14, 14, 14, 11, 3, 7, 10, 12, 13, 14, 11, 4, 6, 9, 11, 12, 12, 11, 9, 7, 8, 10, 10, 11, 11, 7, 11, 13, 14, 16, 15, 11, 5, 10, 11, 13, 13, 14, 9, 4, 8, 10, 11, 11, 11, 7, 3, 5, 7, 8, 8, 8, 5, 2, 4, 6, 6, 6, 6, 5, 6, 6, 5, 5, 5, 5, 5, 10, 9, 7, 4, 3, 4, 4, 4, 6, 7, 7, 9, 11, 11, 3, 4, 6, 6, 7, 8, 7, 1, 3, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 2, 6, 7, 6, 5, 4, 4, 3, 10, 12, 8, 6, 5, 4, 4, 4, 4, 4, 4, 6, 8, 10, 4, 5, 5, 5, 5, 5, 7, 4, 5, 6, 5, 5, 5, 2, 4, 7, 6, 6, 6, 5, 3, 5, 9, 8, 8, 8, 7, 4, 7, 11, 11, 11, 9, 8, 5, 10, 13, 13, 12, 11, 9, 6, 9, 10, 9, 9, 8, 6, 8, 9, 11, 10, 10, 8, 6, 4, 9, 12, 11, 11, 9, 6, 4, 9, 12, 12, 12, 10, 7, 5, 9, 13, 15, 14, 12, 9, 6, 11, 14, 18, 16, 13, 10, 7, 13, 16, 18, 18, 14, 11, 8, 14, 17, 16, 12, 10, 7, 6, 14, 18, 17, 14, 10, 7, 5, 14, 17, 19, 14, 11, 8, 5, 13, 16, 20, 15, 12, 9, 7, 13, 17, 20, 17, 15, 11, 8, 14, 18, 21, 20, 16, 12, 9, 16, 19, 22, 22, 17, 14, 10, 10, 11, 14, 17, 17, 14, 12, 9, 11, 13, 16, 17, 14, 11, 9, 11, 12, 13, 14, 13, 10, 8, 9, 10, 12, 13, 10, 8, 6, 7, 8, 9, 11, 9, 8, 6, 7, 8, 8, 10, 9, 8, 12, 12, 9, 8, 9, 9, 8, 9, 10, 12, 14, 14, 12, 10, 8, 10, 11, 13, 14, 11, 9, 7, 9, 10, 11, 11, 10, 8, 6, 8, 9, 9, 9, 8, 7, 4, 6, 7, 8, 7, 7, 7, 7, 8, 9, 8, 7, 7, 7, 15, 13, 11, 8, 6, 7, 7, 7, 9, 10, 9, 10, 9, 8, 5, 8, 9, 9, 9, 9, 7, 4, 8, 9, 9, 8, 8, 7, 3, 6, 6, 7, 7, 7, 6, 3, 4, 5, 6, 6, 6, 6, 9, 9, 10, 8, 6, 6, 6, 17, 16, 12, 9, 6, 5, 5, 4, 5, 6, 6, 6, 7, 3, 3, 4, 5, 5, 5, 5, 3, 2, 2, 3, 3, 4, 4, 2, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 4, 4, 4, 3, 9, 11, 10, 9, 7, 5, 4, 17, 19, 14, 10, 9, 7, 6, 5, 5, 6, 6, 6, 5, 3, 6, 7, 7, 7, 8, 6, 3, 6, 8, 9, 9, 9, 7, 3, 6, 10, 9, 9, 10, 9, 4, 8, 14, 14, 14, 14, 12, 6, 11, 17, 19, 17, 16, 14, 8, 16, 21, 21, 19, 17, 16, 10, 13, 16, 16, 16, 13, 8, 3, 14, 18, 17, 17, 14, 9, 5, 14, 19, 20, 18, 15, 10, 6, 14, 19, 20, 19, 17, 13, 8, 14, 20, 22, 21, 18, 16, 10, 17, 21, 26, 23, 21, 17, 12, 20, 23, 26, 25, 21, 19, 14, 22, 26, 25, 20, 16, 11, 6, 21, 26, 26, 21, 17, 13, 8, 22, 26, 28, 23, 19, 14, 9, 21, 26, 28, 23, 19, 16, 12, 21, 25, 28, 25, 20, 18, 14, 22, 26, 29, 28, 23, 19, 16, 23, 26, 30, 28, 24, 21, 17, 13, 16, 18, 20, 19, 17, 16, 11, 14, 17, 19, 20, 17, 15, 10, 14, 17, 18, 18, 15, 13, 8, 11, 14, 16, 17, 14, 12, 6, 9, 12, 13, 15, 13, 12, 5, 8, 11, 13, 15, 14, 12, 11, 11, 10, 13, 14, 14, 12, 10, 13, 16, 18, 17, 16, 13, 9, 12, 16, 18, 17, 16, 13, 7, 11, 14, 16, 16, 14, 11, 6, 9, 12, 14, 13, 12, 10, 4, 7, 10, 12, 12, 12, 10, 7, 8, 9, 11, 11, 11, 10, 14, 12, 10, 10, 10, 10, 10, 7, 11, 13, 14, 15, 13, 9, 6, 10, 12, 13, 13, 12, 8, 5, 8, 11, 11, 11, 11, 7, 3, 6, 7, 7, 8, 8, 5, 3, 5, 6, 6, 6, 7, 5, 9, 9, 9, 7, 5, 5, 5, 16, 15, 11, 8, 5, 5, 4, 5, 5, 6, 7, 8, 8, 5, 3, 4, 5, 6, 6, 6, 4, 2, 2, 3, 4, 4, 4, 3, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 3, 2, 9, 11, 9, 8, 6, 5, 4, 16, 18, 12, 9, 8, 6, 5, 5, 5, 6, 6, 7, 6, 5, 7, 7, 7, 7, 8, 6, 4, 7, 8, 8, 8, 8, 6, 3, 7, 10, 9, 9, 9, 7, 4, 8, 14, 13, 13, 13, 11, 5, 11, 17, 18, 17, 15, 12, 7, 15, 20, 21, 19, 17, 15, 9, 14, 15, 15, 16, 13, 8, 5, 14, 17, 17, 16, 14, 9, 4, 14, 20, 19, 18, 14, 9, 5, 14, 19, 21, 19, 15, 11, 7, 14, 20, 24, 23, 19, 14, 9, 17, 23, 29, 28, 22, 16, 11, 20, 25, 30, 30, 24, 19, 13, 22, 28, 27, 21, 16, 11, 7, 22, 28, 29, 23, 16, 12, 7, 22, 28, 32, 24, 17, 12, 8, 22, 28, 33, 25, 20, 15, 11, 21, 27, 33, 30, 24, 19, 13, 23, 30, 35, 34, 27, 21, 15, 25, 31, 35, 36, 29, 23, 17, 13, 16, 20, 23, 24, 21, 18, 11, 15, 19, 23, 23, 19, 16, 10, 14, 17, 21, 21, 19, 15, 9, 11, 15, 18, 20, 16, 14, 6, 9, 12, 15, 18, 16, 13, 6, 8, 11, 14, 17, 16, 14, 11, 11, 11, 13, 16, 16, 13, 10, 14, 17, 20, 20, 17, 14, 9, 13, 16, 20, 20, 16, 13, 7, 11, 15, 18, 17, 15, 11, 6, 9, 12, 14, 14, 13, 10, 4, 7, 10, 13, 13, 13, 10, 7, 7, 9, 11, 12, 12, 10, 14, 12, 10, 11, 11, 11, 10, 8, 11, 13, 14, 15, 14, 9, 6, 10, 12, 13, 14, 13, 8, 5, 8, 11, 10, 11, 11, 7, 4, 6, 7, 7, 8, 8, 5, 4, 5, 6, 6, 6, 6, 5, 9, 9, 8, 7, 5, 5, 5, 16, 14, 10, 7, 5, 4, 4, 5, 6, 6, 7, 8, 9, 6, 3, 4, 5, 6, 6, 6, 5, 2, 3, 3, 4, 3, 4, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 4, 4, 3, 2, 9, 11, 9, 7, 6, 5, 3, 16, 17, 12, 9, 7, 6, 5, 6, 6, 6, 6, 7, 6, 6, 7, 7, 7, 7, 8, 6, 5, 7, 8, 8, 8, 8, 6, 3, 7, 10, 9, 9, 9, 7, 4, 9, 14, 13, 13, 13, 10, 5, 11, 17, 19, 17, 15, 12, 7, 15, 19, 22, 19, 17, 14, 9, 14, 15, 15, 15, 12, 9, 6, 14, 18, 17, 16, 13, 9, 4, 14, 19, 19, 18, 14, 9, 5, 14, 19, 20, 19, 15, 11, 7, 14, 20, 25, 23, 19, 14, 9, 17, 23, 29, 28, 21, 16, 10, 20, 26, 30, 30, 24, 18, 12, 22, 27, 26, 20, 15, 11, 7, 22, 28, 29, 22, 16, 12, 7, 21, 28, 31, 23, 17, 12, 7, 22, 27, 31, 24, 19, 15, 11, 21, 28, 33, 29, 24, 18, 12, 24, 29, 35, 34, 27, 20, 14, 26, 31, 36, 36, 29, 22, 16, 13, 17, 21, 24, 24, 21, 18, 12, 15, 19, 23, 24, 20, 16, 10, 14, 17, 21, 22, 18, 15, 9, 12, 15, 18, 21, 17, 14, 6, 9, 12, 15, 19, 17, 14, 6, 8, 11, 14, 18, 17, 14, 11, 10, 10, 13, 16, 16, 14, 10, 14, 18, 22, 20, 18, 14, 9, 13, 17, 20, 20, 16, 12, 8, 11, 15, 18, 17, 14, 11, 7, 9, 12, 14, 14, 13, 9, 5, 7, 10, 12, 13, 12, 10, 7, 8, 9, 11, 12, 12, 10, 13, 11, 10, 11, 11, 11, 10, 8, 11, 13, 14, 15, 14, 10, 6, 10, 12, 13, 14, 12, 8, 5, 9, 10, 11, 10, 11, 6, 4, 7, 7, 7, 7, 7, 5, 4, 5, 6, 6, 6, 6, 5, 10, 9, 8, 7, 5, 5, 5, 15, 13, 10, 7, 5, 4, 4, 5, 6, 6, 7, 8, 9, 6, 4, 4, 5, 6, 6, 6, 4, 2, 3, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 4, 4, 3, 2, 9, 11, 9, 7, 6, 5, 3, 15, 16, 12, 9, 7, 6, 5, 6, 6, 6, 6, 7, 6, 6, 7, 7, 7, 7, 8, 6, 4, 7, 8, 8, 8, 8, 6, 2, 7, 10, 9, 9, 9, 7, 4, 9, 14, 14, 12, 13, 10, 5, 12, 17, 19, 17, 15, 12, 7, 15, 20, 22, 19, 17, 14, 9, 14, 16, 15, 15, 12, 8, 6, 15, 18, 17, 17, 14, 9, 4, 15, 19, 19, 18, 14, 9, 5, 14, 19, 20, 19, 15, 10, 7, 15, 21, 24, 23, 19, 14, 9, 17, 23, 30, 27, 21, 16, 11, 20, 25, 30, 29, 24, 18, 12, 22, 27, 26, 20, 15, 11, 7, 22, 27, 27, 21, 16, 11, 7, 22, 27, 30, 23, 17, 12, 7, 22, 27, 30, 24, 19, 15, 11, 22, 26, 32, 29, 23, 18, 13, 24, 29, 34, 34, 26, 20, 14, 26, 31, 35, 35, 28, 22, 16, 13, 17, 20, 24, 25, 22, 19, 12, 16, 19, 24, 24, 21, 16, 10, 14, 18, 21, 23, 19, 15, 9, 12, 15, 19, 21, 17, 14, 7, 10, 12, 16, 19, 16, 14, 6, 9, 11, 15, 18, 18, 14, 9, 9, 10, 13, 17, 17, 14, 11, 14, 18, 21, 21, 18, 14, 9, 13, 17, 20, 20, 17, 13, 8, 11, 15, 17, 18, 15, 11, 7, 9, 12, 15, 14, 13, 9, 5, 8, 10, 13, 13, 13, 10, 7, 7, 9, 12, 12, 12, 10, 10, 9, 9, 11, 11, 11, 10, 8, 12, 13, 15, 16, 14, 10, 7, 10, 12, 13, 14, 12, 8, 5, 9, 11, 11, 10, 10, 6, 4, 7, 8, 7, 7, 8, 5, 4, 5, 7, 6, 6, 6, 5, 9, 8, 7, 6, 5, 5, 5, 11, 10, 8, 6, 4, 4, 4, 6, 6, 6, 7, 9, 9, 6, 4, 4, 5, 6, 6, 7, 4, 2, 3, 4, 4, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 4, 4, 3, 2, 9, 9, 8, 6, 6, 5, 3, 12, 13, 10, 8, 7, 6, 5, 6, 6, 6, 6, 7, 6, 6, 7, 7, 7, 8, 8, 6, 4, 7, 9, 8, 8, 8, 6, 2, 7, 11, 9, 9, 9, 7, 3, 9, 15, 13, 13, 13, 10, 5, 12, 16, 17, 16, 14, 12, 7, 13, 18, 19, 18, 16, 13, 8, 14, 15, 14, 13, 12, 8, 6, 15, 17, 15, 14, 12, 9, 4, 15, 18, 17, 15, 12, 9, 5, 14, 18, 18, 15, 14, 11, 7, 15, 20, 22, 20, 17, 13, 8, 17, 22, 25, 22, 18, 15, 10, 18, 23, 26, 24, 21, 16, 12, 20, 22, 20, 15, 13, 10, 7, 20, 23, 22, 17, 14, 11, 7, 20, 23, 23, 17, 14, 11, 7, 20, 23, 24, 19, 16, 14, 10, 20, 23, 27, 24, 20, 16, 12, 22, 26, 29, 29, 22, 18, 14, 24, 27, 29, 29, 24, 19, 15, 12, 15, 18, 21, 20, 18, 15, 11, 13, 17, 20, 20, 17, 13, 10, 13, 15, 18, 18, 15, 12, 9, 11, 13, 15, 18, 14, 11, 7, 9, 11, 14, 17, 14, 11, 6, 8, 10, 12, 16, 14, 11, 8, 9, 10, 12, 14, 14, 11, 11, 13, 16, 18, 17, 15, 11, 10, 12, 14, 17, 16, 13, 10, 8, 11, 14, 15, 14, 11, 8, 8, 9, 11, 13, 12, 10, 7, 6, 8, 10, 11, 11, 10, 7, 5, 7, 9, 11, 10, 10, 7, 10, 9, 9, 10, 9, 9, 7, 8, 11, 12, 12, 13, 11, 8, 8, 10, 11, 11, 11, 10, 6, 7, 9, 10, 9, 8, 8, 5, 5, 8, 7, 6, 6, 6, 4, 3, 5, 6, 5, 5, 5, 4, 7, 7, 7, 6, 5, 4, 4, 11, 11, 8, 6, 5, 3, 3, 7, 6, 6, 6, 7, 8, 6, 4, 5, 5, 6, 6, 5, 4, 2, 3, 4, 4, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 3, 3, 3, 2, 7, 9, 7, 6, 5, 4, 3, 12, 13, 10, 8, 6, 5, 4, 4, 4, 5, 5, 6, 6, 6, 5, 6, 5, 6, 6, 5, 4, 6, 7, 7, 6, 6, 5, 2, 6, 8, 7, 7, 7, 6, 3, 7, 12, 11, 11, 11, 8, 4, 10, 15, 16, 14, 12, 10, 6, 13, 17, 19, 16, 14, 12, 7, 11, 13, 12, 12, 10, 7, 6, 11, 14, 13, 13, 10, 7, 4, 12, 16, 16, 14, 11, 7, 4, 11, 16, 16, 15, 12, 9, 6, 12, 17, 21, 19, 15, 11, 7, 15, 20, 24, 23, 18, 13, 8, 17, 21, 25, 25, 20, 15, 10, 18, 22, 21, 16, 12, 9, 5, 18, 22, 23, 17, 13, 9, 5, 18, 22, 25, 18, 13, 10, 6, 18, 22, 26, 21, 16, 12, 9, 18, 23, 27, 24, 19, 15, 10, 20, 25, 30, 28, 21, 16, 11, 22, 26, 30, 30, 24, 18, 13, 13, 17, 21, 26, 25, 22, 19, 11, 15, 19, 23, 25, 22, 19, 10, 14, 18, 21, 24, 21, 17, 9, 12, 15, 18, 21, 19, 15, 6, 9, 12, 15, 16, 18, 15, 3, 6, 10, 13, 16, 17, 15, 4, 6, 8, 12, 15, 18, 15, 10, 14, 18, 21, 21, 18, 16, 9, 13, 16, 20, 21, 18, 14, 7, 11, 15, 17, 18, 18, 12, 6, 9, 12, 15, 15, 15, 10, 3, 6, 9, 12, 12, 14, 10, 2, 4, 7, 10, 12, 11, 10, 6, 5, 6, 9, 10, 10, 10, 7, 11, 14, 15, 16, 15, 12, 6, 10, 12, 13, 15, 14, 10, 5, 8, 11, 11, 12, 12, 8, 5, 6, 8, 8, 9, 9, 5, 1, 3, 4, 5, 5, 6, 5, 4, 3, 3, 3, 3, 4, 5, 8, 7, 4, 2, 2, 2, 3, 6, 6, 8, 9, 10, 11, 9, 5, 6, 7, 8, 8, 9, 8, 4, 5, 6, 6, 6, 7, 7, 3, 4, 4, 4, 4, 4, 3, 0, 2, 1, 1, 2, 1, 3, 4, 5, 4, 3, 2, 2, 3, 8, 9, 6, 4, 3, 2, 3, 4, 6, 6, 6, 7, 8, 9, 5, 6, 6, 6, 7, 7, 8, 5, 6, 7, 7, 7, 6, 6, 5, 7, 6, 6, 6, 5, 3, 4, 7, 6, 6, 6, 5, 3, 5, 9, 9, 8, 7, 6, 4, 8, 11, 11, 9, 9, 7, 4, 9, 11, 11, 11, 9, 7, 8, 9, 12, 11, 12, 10, 7, 7, 10, 13, 12, 12, 10, 8, 6, 9, 12, 12, 12, 9, 7, 4, 8, 11, 13, 12, 10, 7, 5, 9, 12, 16, 15, 11, 8, 5, 11, 13, 16, 16, 12, 9, 6, 14, 18, 17, 14, 11, 8, 7, 14, 18, 19, 14, 12, 9, 7, 14, 19, 21, 14, 12, 9, 7, 14, 17, 20, 15, 11, 8, 5, 13, 16, 19, 16, 12, 9, 6, 13, 17, 19, 18, 14, 10, 7, 14, 17, 20, 19, 15, 11, 8, 15, 17, 19, 22, 22, 19, 17, 15, 16, 18, 21, 22, 19, 16, 14, 16, 18, 19, 20, 18, 14, 13, 14, 15, 17, 18, 15, 10, 10, 11, 12, 13, 14, 12, 10, 6, 8, 9, 9, 12, 12, 10, 8, 8, 8, 9, 11, 12, 10, 13, 16, 17, 19, 19, 18, 16, 13, 14, 17, 18, 18, 16, 15, 11, 14, 16, 17, 16, 15, 13, 10, 12, 14, 14, 14, 13, 9, 7, 9, 10, 11, 10, 9, 9, 3, 6, 7, 8, 9, 9, 9, 10, 9, 7, 8, 8, 8, 9, 12, 14, 16, 15, 16, 16, 14, 10, 13, 15, 15, 15, 15, 13, 9, 13, 14, 14, 14, 13, 12, 7, 10, 11, 11, 12, 11, 9, 3, 6, 8, 8, 8, 8, 8, 5, 5, 5, 6, 7, 7, 8, 12, 12, 8, 5, 6, 6, 8, 9, 10, 11, 12, 12, 13, 10, 7, 8, 9, 10, 11, 11, 9, 6, 7, 8, 8, 8, 9, 8, 3, 4, 4, 5, 5, 5, 4, 2, 0, 0, 0, 0, 2, 3, 5, 7, 6, 4, 2, 1, 3, 12, 14, 9, 6, 4, 3, 3, 4, 5, 7, 8, 9, 9, 10, 5, 6, 6, 7, 8, 8, 9, 5, 7, 7, 7, 7, 6, 7, 5, 8, 8, 8, 8, 6, 3, 4, 10, 10, 10, 10, 9, 3, 7, 12, 13, 12, 12, 10, 5, 12, 14, 15, 13, 12, 11, 7, 12, 14, 14, 15, 11, 8, 9, 12, 16, 15, 16, 13, 8, 8, 12, 18, 18, 17, 14, 9, 6, 12, 16, 18, 16, 14, 10, 5, 12, 16, 17, 16, 14, 11, 7, 12, 16, 19, 17, 15, 12, 9, 14, 17, 19, 18, 15, 13, 10, 20, 23, 22, 19, 14, 10, 8, 19, 23, 23, 19, 15, 12, 7, 19, 23, 25, 20, 16, 12, 7, 19, 22, 25, 19, 16, 13, 9, 18, 21, 23, 20, 16, 14, 10, 17, 19, 23, 22, 17, 13, 12, 18, 21, 23, 23, 18, 14, 12, 17, 20, 22, 25, 24, 23, 20, 15, 19, 21, 24, 24, 21, 19, 14, 17, 21, 22, 22, 20, 17, 13, 15, 18, 20, 21, 18, 13, 9, 12, 15, 17, 17, 15, 13, 6, 9, 11, 14, 16, 15, 13, 7, 8, 10, 13, 15, 15, 13, 14, 17, 20, 22, 21, 20, 18, 13, 16, 21, 22, 21, 19, 16, 11, 15, 18, 19, 20, 17, 15, 10, 12, 16, 17, 17, 16, 11, 7, 9, 12, 14, 13, 12, 11, 4, 7, 9, 12, 12, 12, 11, 10, 9, 8, 11, 11, 12, 11, 11, 15, 17, 18, 19, 18, 14, 10, 13, 16, 17, 18, 16, 12, 8, 12, 14, 14, 15, 15, 11, 7, 10, 11, 11, 11, 11, 7, 4, 6, 7, 8, 7, 8, 7, 4, 5, 5, 6, 6, 7, 7, 11, 11, 7, 4, 5, 5, 6, 9, 9, 10, 11, 13, 13, 10, 7, 8, 9, 10, 10, 11, 9, 6, 7, 7, 7, 7, 8, 6, 3, 4, 4, 4, 4, 4, 3, 1, 0, 0, 0, 0, 1, 2, 5, 6, 5, 4, 2, 2, 2, 11, 13, 8, 6, 4, 3, 3, 4, 5, 6, 8, 9, 10, 10, 6, 6, 6, 7, 8, 8, 9, 6, 7, 7, 7, 7, 6, 6, 6, 9, 8, 8, 8, 6, 2, 5, 10, 10, 9, 9, 8, 3, 7, 13, 14, 13, 12, 9, 5, 11, 16, 18, 15, 14, 11, 6, 13, 15, 15, 15, 11, 9, 10, 12, 16, 16, 16, 12, 8, 8, 13, 18, 18, 17, 13, 9, 5, 13, 18, 19, 18, 15, 10, 5, 12, 18, 21, 20, 16, 11, 6, 12, 19, 25, 24, 19, 13, 8, 16, 21, 26, 26, 21, 15, 10, 20, 27, 26, 20, 15, 10, 9, 21, 27, 28, 22, 16, 11, 7, 20, 28, 31, 23, 17, 12, 7, 21, 26, 31, 24, 18, 13, 8, 20, 25, 31, 27, 21, 15, 10, 20, 26, 31, 31, 23, 17, 11, 22, 28, 32, 32, 25, 19, 13, 17, 21, 24, 28, 27, 25, 22, 15, 20, 23, 26, 26, 24, 20, 14, 18, 21, 24, 25, 22, 19, 13, 16, 19, 21, 23, 20, 15, 9, 12, 15, 18, 20, 18, 15, 6, 9, 12, 15, 18, 17, 15, 7, 7, 11, 14, 17, 18, 14, 14, 18, 21, 25, 24, 22, 18, 13, 16, 21, 24, 24, 21, 17, 11, 15, 18, 21, 21, 18, 14, 10, 13, 15, 17, 18, 16, 11, 7, 10, 12, 14, 15, 14, 11, 4, 7, 10, 12, 13, 13, 11, 9, 8, 9, 11, 11, 12, 11, 11, 15, 17, 18, 20, 18, 14, 10, 14, 16, 17, 18, 16, 12, 8, 12, 14, 14, 15, 15, 10, 8, 10, 11, 11, 11, 11, 7, 4, 6, 7, 7, 8, 7, 7, 5, 5, 6, 6, 6, 6, 7, 11, 10, 7, 4, 5, 5, 6, 9, 9, 10, 11, 13, 13, 10, 7, 8, 9, 10, 10, 10, 8, 6, 6, 7, 7, 7, 7, 6, 3, 4, 4, 4, 4, 4, 3, 1, 0, 0, 0, 0, 1, 2, 5, 6, 5, 4, 2, 2, 2, 10, 11, 8, 5, 4, 3, 3, 5, 5, 6, 8, 8, 10, 10, 6, 6, 6, 7, 8, 8, 8, 6, 7, 8, 7, 7, 6, 5, 6, 9, 8, 8, 8, 6, 2, 5, 10, 10, 9, 9, 7, 3, 7, 13, 14, 13, 11, 9, 4, 10, 15, 18, 15, 13, 11, 6, 13, 14, 14, 15, 11, 9, 10, 13, 17, 16, 16, 12, 8, 7, 13, 19, 18, 17, 13, 8, 5, 13, 18, 19, 18, 14, 9, 4, 12, 17, 21, 19, 15, 10, 6, 13, 19, 24, 23, 18, 12, 8, 16, 22, 26, 26, 20, 14, 9, 21, 27, 26, 20, 15, 10, 8, 21, 27, 28, 21, 16, 11, 6, 20, 26, 31, 22, 17, 12, 6, 20, 26, 31, 23, 18, 13, 7, 19, 26, 30, 27, 20, 14, 9, 20, 25, 31, 30, 23, 16, 11, 22, 27, 32, 32, 25, 19, 12, 17, 20, 24, 28, 29, 26, 23, 16, 20, 24, 28, 28, 24, 20, 14, 18, 22, 25, 26, 23, 19, 13, 16, 19, 22, 25, 21, 15, 10, 13, 15, 19, 21, 19, 15, 7, 9, 13, 15, 20, 18, 16, 5, 8, 12, 15, 17, 19, 15, 14, 18, 22, 26, 25, 22, 19, 13, 17, 20, 24, 24, 21, 17, 11, 15, 19, 22, 21, 19, 15, 10, 13, 16, 18, 18, 17, 12, 7, 10, 12, 14, 15, 14, 11, 4, 7, 10, 12, 13, 14, 12, 5, 6, 9, 12, 12, 12, 11, 11, 16, 17, 18, 20, 18, 14, 10, 14, 16, 17, 18, 16, 12, 9, 13, 15, 14, 15, 14, 10, 8, 11, 11, 11, 12, 11, 7, 4, 7, 8, 8, 8, 8, 7, 4, 5, 6, 6, 6, 6, 7, 6, 5, 5, 5, 5, 5, 6, 9, 9, 10, 12, 13, 14, 10, 8, 8, 9, 10, 10, 10, 8, 7, 7, 8, 7, 7, 7, 6, 3, 4, 4, 4, 4, 4, 3, 2, 0, 0, 0, 0, 1, 2, 5, 5, 3, 2, 2, 1, 1, 6, 7, 4, 4, 3, 2, 2, 5, 5, 6, 8, 9, 10, 10, 6, 6, 6, 7, 8, 8, 8, 6, 7, 7, 7, 7, 5, 5, 6, 9, 8, 7, 8, 6, 2, 6, 11, 9, 9, 9, 7, 3, 7, 12, 13, 12, 10, 8, 4, 7, 12, 15, 14, 12, 10, 5, 13, 15, 14, 14, 11, 9, 10, 13, 17, 16, 15, 12, 8, 7, 13, 19, 18, 16, 13, 8, 4, 13, 18, 19, 18, 13, 9, 4, 13, 17, 20, 19, 15, 10, 5, 13, 18, 24, 22, 18, 11, 7, 13, 18, 24, 25, 19, 14, 8, 20, 26, 24, 19, 14, 10, 9, 20, 26, 27, 21, 15, 10, 6, 21, 26, 28, 21, 16, 11, 6, 21, 25, 29, 23, 17, 12, 7, 20, 25, 28, 25, 19, 14, 9, 20, 26, 30, 27, 21, 15, 10, 20, 26, 30, 30, 24, 17, 12, 16, 20, 24, 28, 28, 26, 21, 15, 19, 23, 27, 28, 24, 20, 13, 17, 21, 24, 26, 22, 18, 12, 15, 18, 21, 24, 20, 15, 9, 12, 15, 17, 21, 18, 15, 7, 10, 12, 16, 19, 18, 16, 5, 8, 11, 15, 18, 18, 15, 14, 17, 21, 25, 24, 21, 18, 12, 16, 20, 23, 23, 20, 16, 11, 14, 18, 20, 21, 18, 14, 9, 12, 15, 18, 18, 16, 11, 7, 9, 11, 14, 14, 14, 11, 4, 7, 10, 13, 13, 14, 11, 5, 6, 9, 12, 12, 12, 11, 11, 15, 17, 17, 19, 17, 13, 9, 13, 15, 16, 17, 16, 11, 8, 12, 14, 14, 14, 14, 9, 7, 10, 10, 10, 11, 11, 7, 3, 6, 7, 7, 7, 8, 6, 4, 5, 6, 6, 6, 6, 7, 7, 5, 5, 5, 5, 5, 5, 8, 9, 10, 11, 12, 13, 9, 7, 7, 8, 9, 10, 9, 7, 5, 6, 7, 7, 6, 6, 5, 3, 4, 3, 3, 3, 3, 3, 1, 2, 1, 1, 1, 0, 1, 4, 5, 3, 3, 2, 2, 1, 7, 8, 5, 4, 3, 2, 2, 5, 5, 5, 7, 8, 9, 9, 7, 6, 6, 7, 7, 7, 7, 7, 8, 7, 7, 7, 5, 4, 7, 10, 8, 7, 7, 6, 2, 6, 11, 10, 9, 9, 7, 2, 8, 12, 12, 11, 10, 8, 4, 8, 12, 15, 12, 11, 10, 5, 14, 14, 13, 12, 11, 8, 9, 14, 16, 15, 14, 11, 8, 6, 14, 18, 16, 14, 11, 8, 4, 14, 18, 17, 14, 12, 8, 4, 12, 17, 19, 16, 13, 10, 5, 13, 17, 21, 18, 14, 11, 7, 14, 18, 21, 20, 15, 12, 8, 19, 22, 19, 15, 12, 10, 7, 19, 22, 21, 17, 14, 10, 6, 20, 22, 23, 17, 13, 10, 6, 19, 22, 23, 18, 14, 11, 7, 18, 21, 23, 20, 16, 12, 8, 18, 21, 23, 23, 17, 13, 10, 19, 22, 24, 24, 19, 15, 11, 14, 18, 21, 23, 24, 21, 18, 14, 17, 20, 23, 23, 20, 16, 12, 15, 19, 21, 22, 18, 15, 11, 14, 16, 19, 20, 17, 14, 8, 11, 13, 16, 20, 18, 14, 7, 10, 13, 15, 19, 18, 14, 6, 8, 12, 15, 18, 17, 14, 13, 16, 18, 21, 20, 18, 15, 11, 15, 17, 20, 19, 16, 13, 10, 13, 16, 18, 17, 15, 12, 9, 11, 14, 16, 15, 14, 11, 6, 9, 12, 14, 14, 13, 10, 5, 8, 11, 13, 13, 12, 11, 7, 7, 9, 12, 12, 12, 11, 10, 14, 15, 15, 16, 14, 11, 8, 12, 14, 15, 14, 13, 10, 7, 11, 13, 12, 12, 12, 8, 6, 9, 9, 9, 9, 9, 6, 3, 7, 8, 7, 7, 7, 6, 4, 5, 6, 6, 6, 6, 6, 8, 7, 6, 5, 5, 5, 5, 8, 8, 9, 9, 10, 11, 7, 6, 6, 7, 8, 8, 8, 5, 4, 5, 6, 5, 5, 5, 3, 2, 3, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 1, 0, 5, 5, 4, 3, 2, 2, 1, 7, 10, 6, 4, 3, 2, 2, 4, 4, 4, 5, 6, 7, 7, 5, 5, 4, 4, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 4, 6, 4, 4, 4, 3, 1, 5, 8, 8, 7, 7, 5, 2, 6, 11, 12, 11, 9, 7, 3, 9, 13, 15, 12, 11, 8, 4, 8, 9, 9, 9, 7, 6, 7, 8, 11, 10, 10, 7, 4, 4, 8, 12, 12, 11, 7, 4, 2, 8, 12, 13, 12, 9, 6, 3, 9, 13, 17, 15, 12, 8, 4, 11, 16, 21, 19, 14, 10, 5, 13, 18, 21, 21, 16, 11, 7, 15, 19, 17, 13, 9, 6, 6, 14, 18, 19, 14, 9, 6, 3, 14, 19, 21, 15, 10, 6, 3, 14, 18, 22, 16, 12, 9, 6, 14, 18, 23, 21, 16, 11, 7, 16, 21, 25, 25, 19, 13, 8, 19, 23, 25, 26, 20, 15, 10, 14, 17, 22, 25, 25, 23, 20, 13, 16, 20, 24, 25, 22, 18, 13, 15, 18, 21, 24, 19, 16, 12, 13, 16, 19, 21, 17, 14, 9, 10, 12, 14, 15, 16, 13, 5, 6, 8, 11, 13, 15, 13, 3, 3, 6, 9, 13, 15, 13, 13, 15, 18, 22, 22, 19, 17, 12, 14, 17, 21, 21, 18, 16, 11, 13, 16, 18, 18, 16, 12, 11, 11, 13, 15, 15, 13, 7, 8, 8, 9, 11, 10, 11, 8, 3, 3, 5, 8, 9, 9, 8, 4, 3, 4, 7, 8, 8, 7, 12, 13, 15, 16, 17, 17, 16, 11, 13, 14, 15, 16, 16, 14, 10, 12, 13, 13, 13, 14, 12, 10, 10, 10, 10, 11, 10, 6, 6, 6, 6, 6, 5, 5, 5, 0, 2, 1, 2, 4, 4, 5, 5, 4, 2, 1, 3, 4, 5, 11, 12, 13, 13, 15, 16, 16, 10, 11, 12, 14, 14, 15, 14, 9, 10, 12, 12, 13, 13, 12, 6, 9, 9, 9, 9, 9, 7, 4, 5, 5, 5, 5, 4, 4, 0, 2, 2, 1, 2, 3, 5, 5, 6, 3, 2, 3, 3, 4, 9, 11, 12, 13, 14, 15, 16, 8, 9, 11, 12, 13, 14, 14, 8, 9, 10, 11, 11, 12, 12, 8, 8, 8, 8, 8, 8, 5, 5, 7, 7, 6, 6, 5, 4, 3, 6, 7, 7, 7, 6, 4, 5, 8, 9, 8, 8, 7, 5, 10, 11, 12, 12, 12, 14, 15, 10, 12, 12, 13, 12, 12, 14, 10, 13, 13, 13, 11, 10, 11, 10, 12, 13, 12, 11, 8, 5, 8, 11, 12, 12, 9, 7, 5, 7, 10, 14, 13, 10, 8, 5, 8, 11, 14, 14, 11, 9, 6, 14, 19, 17, 15, 12, 12, 14, 15, 19, 19, 16, 13, 11, 12, 15, 19, 21, 15, 13, 10, 9, 15, 18, 21, 15, 12, 9, 6, 13, 16, 18, 15, 11, 9, 7, 12, 15, 18, 17, 13, 9, 7, 12, 16, 18, 19, 14, 11, 8, 21, 23, 24, 27, 27, 25, 23, 20, 23, 25, 26, 26, 23, 21, 20, 22, 23, 24, 24, 22, 18, 18, 20, 21, 21, 21, 18, 12, 15, 17, 18, 17, 16, 13, 12, 11, 13, 13, 12, 13, 13, 12, 6, 8, 10, 12, 13, 13, 12, 19, 22, 23, 25, 25, 24, 23, 18, 21, 23, 25, 24, 22, 21, 17, 21, 22, 22, 21, 20, 18, 16, 19, 20, 20, 19, 16, 11, 12, 15, 16, 16, 12, 12, 11, 8, 11, 12, 10, 11, 11, 11, 4, 6, 9, 10, 10, 11, 11, 17, 20, 21, 23, 23, 23, 20, 15, 19, 21, 22, 22, 21, 18, 14, 18, 20, 20, 19, 20, 16, 13, 15, 16, 16, 16, 15, 11, 8, 12, 13, 13, 10, 10, 10, 2, 7, 8, 8, 9, 9, 10, 5, 6, 6, 7, 8, 9, 10, 14, 15, 17, 18, 19, 20, 18, 12, 13, 16, 17, 17, 17, 16, 10, 12, 13, 14, 14, 14, 13, 7, 11, 11, 11, 11, 9, 9, 4, 7, 6, 6, 4, 5, 5, 2, 0, 0, 2, 3, 4, 6, 5, 7, 3, 2, 2, 3, 4, 11, 12, 13, 15, 16, 17, 18, 8, 11, 13, 14, 15, 15, 16, 8, 10, 11, 11, 12, 13, 12, 8, 8, 8, 8, 8, 7, 5, 6, 7, 7, 7, 8, 6, 4, 3, 8, 9, 8, 8, 8, 3, 5, 8, 9, 9, 9, 8, 5, 10, 12, 12, 13, 13, 16, 18, 10, 14, 14, 15, 12, 14, 14, 10, 15, 15, 14, 11, 10, 11, 9, 14, 15, 13, 12, 7, 3, 9, 13, 14, 13, 10, 9, 5, 9, 12, 14, 13, 11, 9, 7, 9, 11, 14, 14, 12, 10, 8, 17, 20, 19, 17, 13, 14, 16, 17, 20, 20, 18, 14, 11, 13, 17, 20, 22, 17, 14, 9, 9, 17, 19, 21, 16, 13, 11, 7, 15, 17, 19, 16, 12, 10, 8, 13, 16, 18, 17, 13, 10, 8, 12, 15, 18, 18, 14, 11, 9, 21, 24, 28, 30, 29, 29, 26, 20, 24, 27, 28, 30, 27, 23, 18, 23, 26, 27, 27, 24, 20, 17, 20, 23, 24, 25, 21, 15, 14, 17, 20, 21, 19, 17, 15, 10, 13, 15, 16, 18, 17, 15, 6, 9, 12, 15, 17, 17, 15, 19, 23, 25, 28, 28, 26, 23, 17, 21, 25, 27, 27, 24, 21, 16, 19, 24, 25, 24, 22, 18, 15, 17, 21, 22, 21, 18, 13, 12, 14, 17, 18, 15, 14, 13, 7, 10, 12, 14, 14, 14, 13, 4, 6, 10, 13, 13, 13, 13, 16, 20, 22, 23, 25, 22, 18, 15, 18, 20, 22, 22, 21, 17, 14, 17, 19, 19, 19, 19, 14, 12, 15, 16, 16, 15, 14, 9, 7, 11, 12, 12, 10, 10, 9, 2, 7, 7, 8, 8, 8, 9, 5, 5, 6, 6, 7, 7, 8, 14, 14, 15, 16, 18, 18, 16, 12, 13, 14, 15, 16, 16, 13, 9, 12, 12, 12, 12, 12, 10, 6, 10, 9, 9, 9, 7, 8, 4, 6, 5, 5, 3, 3, 4, 1, 0, 0, 1, 2, 3, 3, 5, 6, 3, 2, 2, 2, 2, 10, 11, 12, 13, 14, 15, 16, 7, 10, 11, 12, 13, 13, 14, 7, 9, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 6, 3, 5, 7, 7, 7, 8, 6, 2, 3, 8, 10, 9, 9, 8, 3, 5, 11, 13, 11, 11, 10, 5, 10, 13, 13, 13, 12, 14, 15, 10, 14, 14, 15, 11, 12, 13, 10, 16, 16, 16, 11, 9, 8, 10, 15, 17, 17, 12, 7, 3, 9, 15, 19, 18, 15, 10, 5, 9, 15, 22, 21, 17, 11, 7, 11, 17, 22, 23, 20, 14, 8, 18, 25, 24, 18, 13, 13, 14, 19, 25, 26, 19, 14, 11, 11, 18, 24, 29, 21, 15, 10, 7, 18, 25, 29, 22, 17, 11, 6, 18, 23, 28, 25, 19, 13, 8, 17, 23, 28, 27, 21, 15, 10, 18, 23, 28, 29, 22, 18, 12, 20, 24, 27, 31, 31, 28, 26, 19, 23, 27, 30, 30, 27, 23, 18, 21, 25, 27, 29, 26, 21, 16, 19, 22, 25, 26, 23, 17, 13, 16, 18, 21, 22, 19, 16, 10, 12, 15, 17, 20, 19, 16, 6, 9, 12, 16, 18, 19, 16, 18, 21, 25, 28, 28, 26, 22, 16, 20, 24, 27, 27, 23, 19, 15, 18, 22, 24, 24, 22, 17, 14, 16, 19, 22, 21, 19, 13, 11, 13, 16, 18, 16, 15, 13, 7, 9, 12, 14, 14, 14, 12, 4, 7, 10, 13, 13, 14, 12, 15, 18, 21, 22, 24, 21, 18, 14, 17, 20, 21, 21, 19, 16, 13, 16, 18, 18, 18, 17, 13, 11, 13, 15, 14, 15, 14, 8, 7, 10, 11, 11, 10, 9, 8, 2, 6, 7, 7, 8, 8, 8, 3, 5, 6, 6, 7, 7, 7, 13, 13, 14, 15, 16, 17, 14, 11, 11, 13, 14, 14, 14, 11, 8, 10, 11, 11, 11, 10, 9, 5, 8, 7, 7, 7, 6, 6, 3, 4, 4, 4, 2, 2, 3, 1, 2, 1, 0, 1, 2, 3, 3, 4, 2, 2, 2, 2, 2, 9, 9, 10, 11, 12, 14, 13, 6, 8, 9, 10, 11, 11, 11, 6, 8, 8, 8, 9, 9, 8, 6, 7, 6, 6, 6, 5, 3, 4, 8, 8, 8, 8, 6, 2, 3, 9, 10, 10, 9, 7, 3, 5, 9, 12, 11, 11, 9, 5, 11, 13, 13, 13, 11, 12, 13, 11, 15, 15, 15, 11, 10, 10, 11, 16, 16, 16, 11, 8, 7, 11, 16, 17, 16, 12, 8, 3, 10, 15, 19, 17, 14, 9, 5, 10, 15, 22, 21, 16, 10, 6, 11, 16, 21, 23, 18, 13, 8, 19, 25, 24, 18, 13, 11, 12, 19, 25, 27, 20, 14, 9, 9, 18, 25, 29, 21, 15, 10, 6, 19, 24, 29, 22, 16, 11, 6, 18, 24, 29, 24, 18, 13, 8, 18, 23, 29, 27, 20, 14, 9, 18, 24, 30, 29, 22, 16, 11, 19, 23, 26, 31, 30, 27, 24, 17, 22, 26, 29, 30, 27, 22, 16, 20, 23, 27, 28, 25, 21, 15, 17, 21, 24, 27, 23, 17, 12, 15, 17, 20, 22, 20, 17, 8, 11, 13, 17, 21, 20, 16, 6, 9, 13, 16, 19, 20, 17, 16, 20, 24, 28, 27, 25, 21, 15, 19, 22, 26, 27, 23, 19, 14, 18, 21, 24, 23, 21, 17, 12, 15, 18, 20, 20, 18, 13, 9, 12, 14, 17, 16, 16, 13, 6, 9, 12, 14, 14, 15, 12, 4, 7, 10, 13, 13, 14, 13, 14, 18, 19, 20, 22, 20, 17, 12, 15, 19, 19, 20, 19, 14, 11, 15, 17, 16, 16, 17, 12, 10, 13, 13, 13, 13, 13, 8, 6, 9, 10, 10, 9, 9, 8, 3, 6, 7, 7, 8, 8, 8, 4, 5, 6, 6, 7, 7, 7, 11, 12, 12, 14, 15, 16, 12, 10, 10, 11, 12, 13, 13, 10, 8, 9, 10, 9, 9, 9, 7, 4, 7, 6, 6, 6, 6, 5, 2, 2, 2, 2, 2, 2, 3, 2, 4, 2, 1, 0, 1, 2, 4, 6, 3, 2, 2, 1, 2, 6, 7, 8, 9, 10, 11, 12, 5, 6, 7, 9, 9, 9, 10, 5, 6, 7, 6, 6, 7, 6, 5, 7, 6, 6, 6, 5, 3, 4, 9, 8, 7, 7, 5, 2, 5, 9, 10, 9, 9, 7, 3, 6, 10, 12, 11, 10, 9, 4, 11, 13, 13, 13, 10, 10, 11, 12, 15, 14, 14, 11, 8, 9, 11, 17, 16, 15, 11, 7, 5, 11, 16, 17, 16, 12, 8, 3, 11, 16, 19, 18, 14, 9, 4, 11, 16, 22, 20, 15, 10, 6, 11, 16, 22, 22, 17, 12, 7, 19, 25, 23, 17, 13, 9, 10, 19, 25, 25, 19, 14, 9, 7, 20, 25, 27, 20, 15, 10, 5, 19, 24, 28, 22, 16, 11, 6, 18, 24, 28, 23, 17, 12, 7, 18, 23, 27, 25, 20, 14, 9, 18, 23, 27, 28, 22, 16, 10, 18, 22, 26, 29, 29, 26, 23, 16, 20, 24, 29, 29, 25, 21, 15, 19, 23, 25, 28, 23, 19, 14, 16, 19, 23, 25, 22, 16, 10, 13, 16, 19, 23, 20, 16, 8, 11, 14, 17, 21, 20, 17, 7, 10, 13, 16, 19, 20, 16, 15, 19, 23, 26, 26, 23, 19, 14, 17, 22, 25, 25, 21, 18, 12, 16, 20, 22, 23, 20, 16, 11, 14, 16, 19, 19, 17, 13, 8, 11, 13, 16, 16, 15, 13, 6, 9, 12, 14, 14, 14, 13, 5, 7, 11, 13, 13, 13, 13, 13, 16, 18, 19, 21, 19, 15, 11, 15, 17, 18, 19, 17, 13, 10, 13, 16, 15, 16, 15, 11, 9, 11, 12, 12, 12, 12, 8, 5, 8, 9, 9, 9, 9, 8, 3, 6, 7, 8, 7, 7, 8, 5, 5, 6, 6, 7, 7, 7, 10, 10, 11, 12, 14, 14, 10, 9, 9, 10, 11, 11, 11, 8, 7, 8, 8, 8, 8, 8, 6, 3, 5, 5, 5, 5, 5, 4, 2, 1, 2, 2, 1, 2, 2, 3, 4, 3, 2, 1, 0, 1, 5, 7, 4, 3, 2, 2, 2, 4, 4, 6, 7, 8, 9, 10, 5, 5, 5, 7, 7, 7, 8, 5, 6, 6, 6, 5, 5, 5, 5, 8, 7, 6, 6, 5, 1, 5, 9, 8, 7, 8, 5, 2, 6, 10, 11, 10, 9, 7, 3, 7, 10, 13, 11, 11, 9, 4, 12, 13, 12, 12, 10, 8, 9, 12, 15, 14, 13, 11, 7, 7, 12, 17, 16, 13, 11, 6, 4, 13, 16, 16, 14, 12, 7, 3, 11, 16, 18, 15, 13, 9, 4, 11, 16, 20, 18, 14, 10, 6, 12, 16, 21, 20, 15, 12, 7, 18, 21, 19, 15, 12, 9, 8, 18, 21, 20, 16, 13, 9, 5, 18, 21, 23, 16, 13, 9, 5, 18, 21, 23, 17, 14, 10, 6, 18, 20, 23, 20, 15, 12, 8, 18, 20, 23, 21, 17, 13, 9, 18, 21, 23, 23, 18, 13, 10, 17, 20, 24, 27, 27, 24, 21, 16, 19, 23, 26, 27, 23, 20, 14, 18, 21, 24, 26, 22, 18, 13, 16, 18, 21, 24, 21, 17, 10, 12, 15, 18, 22, 20, 16, 8, 11, 14, 17, 21, 20, 16, 7, 10, 13, 16, 20, 19, 17, 14, 17, 21, 24, 23, 21, 18, 13, 17, 20, 23, 23, 20, 16, 11, 15, 19, 21, 20, 18, 14, 10, 13, 16, 19, 17, 16, 12, 7, 11, 13, 15, 16, 15, 12, 6, 9, 12, 14, 15, 14, 12, 6, 8, 11, 13, 13, 13, 12, 12, 15, 17, 17, 19, 17, 13, 10, 13, 16, 17, 17, 16, 11, 9, 12, 14, 14, 14, 14, 10, 8, 10, 11, 11, 11, 11, 7, 5, 8, 9, 9, 8, 8, 7, 5, 7, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 9, 9, 10, 11, 12, 13, 8, 8, 8, 9, 9, 9, 10, 6, 6, 7, 7, 7, 6, 6, 4, 3, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 5, 5, 4, 2, 2, 1, 0, 7, 7, 4, 3, 2, 2, 2, 3, 3, 4, 5, 6, 8, 8, 4, 4, 4, 5, 5, 5, 6, 4, 5, 4, 3, 3, 3, 3, 4, 6, 4, 3, 3, 3, 0, 5, 6, 5, 4, 4, 3, 2, 6, 8, 9, 7, 6, 4, 2, 7, 10, 11, 8, 7, 5, 2, 6, 6, 6, 6, 5, 7, 7, 6, 8, 7, 7, 5, 4, 5, 6, 9, 8, 7, 4, 2, 2, 6, 8, 9, 8, 5, 3, 2, 7, 10, 13, 12, 9, 5, 2, 8, 12, 17, 15, 11, 7, 3, 10, 14, 18, 17, 12, 8, 4, 11, 15, 14, 9, 6, 6, 6, 10, 15, 16, 10, 6, 3, 3, 10, 15, 18, 11, 7, 3, 2, 10, 14, 18, 12, 8, 5, 3, 10, 15, 20, 17, 12, 8, 4, 12, 17, 22, 20, 15, 10, 5, 14, 20, 23, 22, 17, 11, 7, 20, 21, 23, 26, 26, 25, 23, 19, 21, 23, 25, 26, 23, 21, 18, 20, 21, 23, 23, 19, 16, 18, 18, 19, 19, 20, 15, 11, 15, 15, 15, 14, 14, 14, 10, 11, 11, 8, 10, 12, 14, 10, 5, 3, 5, 8, 11, 14, 10, 19, 20, 22, 23, 24, 23, 22, 18, 20, 21, 24, 24, 21, 19, 18, 19, 21, 21, 20, 19, 16, 17, 17, 18, 18, 16, 13, 8, 14, 14, 14, 13, 9, 9, 8, 9, 9, 7, 6, 8, 9, 9, 2, 2, 4, 5, 7, 8, 8, 18, 20, 20, 21, 23, 23, 22, 17, 18, 20, 21, 22, 21, 19, 17, 18, 19, 20, 19, 18, 16, 16, 17, 16, 16, 15, 12, 9, 11, 12, 12, 11, 7, 8, 8, 4, 7, 6, 4, 6, 8, 8, 0, 2, 2, 4, 6, 6, 8, 17, 18, 19, 21, 23, 24, 23, 16, 18, 20, 20, 21, 21, 20, 14, 18, 19, 19, 19, 18, 17, 10, 17, 16, 16, 15, 12, 12, 7, 12, 11, 11, 6, 7, 8, 5, 5, 5, 3, 4, 5, 6, 0, 3, 3, 3, 4, 5, 6, 15, 17, 19, 20, 22, 23, 23, 12, 16, 18, 19, 20, 20, 21, 12, 16, 17, 17, 17, 17, 15, 12, 13, 13, 13, 12, 10, 7, 10, 9, 8, 8, 7, 6, 6, 6, 7, 7, 6, 7, 7, 5, 4, 6, 8, 7, 7, 8, 6, 13, 14, 15, 16, 19, 22, 23, 13, 14, 14, 16, 17, 18, 19, 13, 15, 15, 14, 14, 15, 14, 13, 13, 13, 13, 12, 9, 6, 11, 12, 13, 12, 9, 8, 6, 8, 10, 13, 13, 10, 8, 7, 7, 10, 13, 14, 11, 8, 7, 16, 19, 18, 16, 17, 20, 21, 16, 18, 19, 17, 16, 17, 18, 16, 18, 20, 16, 14, 13, 13, 16, 17, 20, 15, 12, 10, 7, 14, 16, 18, 16, 11, 8, 7, 12, 15, 17, 17, 12, 10, 8, 11, 15, 18, 18, 14, 10, 8, 27, 30, 31, 32, 32, 31, 30, 26, 29, 31, 32, 32, 29, 27, 25, 28, 29, 30, 29, 26, 23, 24, 26, 27, 27, 25, 21, 15, 21, 24, 23, 21, 18, 16, 15, 17, 19, 16, 15, 17, 17, 15, 11, 11, 13, 15, 16, 16, 15, 25, 28, 30, 31, 30, 30, 29, 24, 27, 30, 31, 30, 29, 26, 22, 26, 29, 28, 27, 25, 22, 22, 24, 25, 25, 23, 20, 14, 18, 20, 22, 20, 15, 15, 14, 13, 16, 15, 14, 14, 14, 14, 7, 9, 12, 13, 13, 14, 14, 23, 26, 27, 29, 30, 29, 26, 21, 25, 27, 29, 29, 27, 23, 20, 24, 26, 26, 25, 24, 20, 18, 21, 22, 22, 21, 18, 14, 13, 17, 18, 17, 14, 14, 13, 6, 13, 12, 10, 12, 12, 13, 3, 7, 8, 10, 11, 11, 13, 20, 21, 22, 24, 25, 26, 25, 18, 20, 22, 23, 23, 22, 21, 15, 20, 20, 21, 20, 19, 18, 11, 19, 17, 17, 16, 12, 13, 9, 14, 13, 11, 7, 8, 9, 6, 7, 6, 4, 6, 7, 7, 3, 0, 3, 4, 5, 6, 8, 16, 19, 20, 21, 22, 24, 24, 12, 18, 20, 21, 21, 21, 21, 12, 18, 18, 18, 18, 17, 16, 12, 14, 15, 14, 13, 10, 8, 10, 8, 9, 8, 5, 4, 7, 6, 5, 5, 5, 5, 4, 6, 3, 3, 5, 5, 6, 5, 5, 13, 14, 16, 17, 20, 22, 24, 13, 13, 14, 16, 18, 19, 20, 13, 13, 13, 14, 15, 16, 14, 13, 12, 12, 12, 10, 9, 6, 10, 10, 11, 9, 7, 5, 5, 7, 8, 10, 9, 7, 6, 4, 5, 7, 10, 10, 8, 7, 4, 14, 17, 16, 15, 18, 21, 22, 14, 16, 17, 15, 16, 18, 18, 14, 17, 18, 14, 13, 13, 13, 14, 15, 17, 13, 11, 8, 4, 12, 13, 15, 12, 8, 6, 5, 10, 12, 14, 13, 9, 7, 5, 8, 11, 14, 14, 10, 8, 6, 25, 28, 31, 33, 33, 32, 29, 23, 27, 30, 32, 33, 30, 26, 21, 26, 29, 30, 30, 27, 23, 21, 23, 26, 27, 28, 22, 17, 17, 20, 22, 23, 21, 19, 16, 13, 16, 17, 17, 20, 19, 17, 8, 11, 14, 17, 19, 19, 16, 22, 25, 29, 31, 31, 29, 27, 20, 25, 28, 30, 29, 28, 24, 19, 23, 26, 28, 27, 25, 21, 18, 21, 24, 25, 23, 20, 15, 15, 17, 19, 20, 17, 16, 15, 11, 13, 15, 15, 15, 16, 15, 5, 9, 12, 14, 15, 15, 15, 20, 23, 26, 27, 28, 26, 22, 18, 22, 24, 25, 26, 24, 20, 17, 21, 23, 22, 22, 22, 17, 15, 18, 19, 19, 19, 17, 11, 9, 14, 15, 15, 12, 12, 12, 3, 10, 11, 10, 10, 11, 11, 3, 6, 8, 8, 9, 9, 10, 17, 18, 18, 19, 21, 22, 19, 14, 16, 17, 18, 19, 19, 16, 11, 15, 16, 16, 15, 15, 13, 8, 13, 12, 12, 11, 10, 10, 6, 9, 8, 8, 5, 5, 6, 3, 3, 3, 2, 3, 4, 4, 3, 3, 0, 2, 3, 4, 5, 12, 14, 15, 16, 17, 18, 19, 8, 13, 14, 15, 16, 16, 16, 8, 12, 13, 13, 13, 13, 11, 8, 10, 10, 10, 9, 7, 4, 6, 6, 5, 5, 6, 4, 4, 4, 6, 8, 8, 8, 6, 3, 2, 7, 10, 10, 10, 8, 3, 9, 11, 11, 13, 15, 17, 18, 9, 12, 12, 13, 13, 15, 16, 9, 14, 14, 14, 11, 11, 10, 9, 13, 15, 15, 11, 7, 3, 7, 12, 17, 17, 13, 8, 3, 7, 13, 19, 19, 15, 10, 5, 8, 14, 20, 20, 17, 12, 6, 16, 22, 22, 16, 13, 16, 17, 16, 23, 24, 18, 12, 13, 14, 17, 23, 26, 19, 13, 9, 10, 17, 22, 26, 20, 14, 9, 5, 15, 21, 25, 23, 17, 12, 6, 15, 21, 25, 23, 18, 14, 8, 16, 21, 24, 24, 20, 15, 10, 23, 26, 30, 33, 32, 30, 27, 21, 25, 29, 32, 32, 29, 26, 19, 24, 27, 31, 31, 27, 22, 18, 21, 24, 27, 28, 24, 18, 15, 18, 20, 23, 23, 21, 18, 11, 14, 17, 18, 22, 21, 18, 8, 11, 14, 17, 20, 21, 18, 19, 23, 27, 31, 29, 27, 25, 18, 22, 26, 30, 29, 25, 22, 17, 20, 25, 26, 26, 24, 19, 16, 19, 22, 24, 23, 20, 15, 13, 15, 18, 19, 18, 17, 14, 9, 11, 14, 16, 16, 16, 14, 5, 8, 12, 15, 15, 15, 14, 17, 21, 23, 24, 26, 23, 20, 16, 19, 22, 23, 23, 21, 18, 15, 18, 20, 20, 20, 20, 15, 13, 16, 16, 17, 17, 15, 10, 8, 12, 13, 13, 12, 11, 10, 3, 8, 9, 9, 9, 10, 10, 3, 6, 7, 8, 8, 9, 8, 15, 15, 16, 17, 19, 19, 15, 13, 14, 15, 16, 17, 17, 13, 10, 12, 13, 13, 13, 13, 10, 6, 10, 9, 9, 9, 8, 8, 4, 6, 6, 6, 4, 3, 4, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2, 0, 2, 2, 3, 9, 10, 11, 12, 13, 15, 15, 6, 10, 11, 12, 13, 13, 13, 6, 9, 9, 9, 10, 9, 9, 6, 7, 6, 6, 6, 5, 3, 4, 6, 6, 6, 6, 4, 3, 2, 7, 9, 8, 8, 6, 2, 4, 8, 11, 10, 9, 8, 3, 9, 11, 11, 12, 12, 14, 15, 9, 13, 13, 13, 11, 11, 11, 9, 15, 15, 14, 10, 8, 8, 9, 14, 15, 15, 11, 6, 2, 8, 13, 18, 16, 12, 8, 3, 8, 14, 20, 19, 14, 9, 5, 9, 14, 20, 21, 16, 11, 6, 17, 23, 22, 17, 11, 12, 13, 17, 23, 24, 18, 12, 10, 10, 17, 23, 27, 19, 13, 8, 7, 17, 22, 27, 20, 15, 9, 5, 16, 21, 27, 22, 16, 11, 6, 16, 22, 27, 25, 18, 13, 8, 16, 22, 27, 27, 21, 15, 9, 20, 25, 28, 32, 32, 30, 27, 20, 23, 27, 31, 32, 27, 24, 17, 22, 25, 29, 30, 26, 22, 17, 19, 22, 25, 28, 24, 18, 14, 16, 19, 21, 24, 22, 18, 10, 12, 15, 18, 22, 21, 18, 8, 10, 14, 17, 20, 21, 18, 18, 22, 26, 29, 29, 25, 22, 17, 20, 23, 27, 28, 24, 20, 15, 19, 23, 25, 25, 22, 19, 14, 17, 20, 22, 22, 20, 14, 11, 14, 15, 18, 18, 17, 14, 7, 10, 13, 15, 16, 17, 14, 5, 8, 12, 14, 15, 15, 14, 16, 19, 20, 22, 24, 22, 18, 14, 17, 20, 21, 22, 20, 15, 13, 17, 18, 18, 19, 17, 13, 12, 15, 15, 14, 15, 14, 10, 8, 11, 11, 11, 11, 10, 9, 3, 8, 9, 9, 9, 9, 9, 4, 6, 7, 7, 8, 8, 8, 13, 14, 14, 15, 17, 18, 13, 12, 12, 13, 14, 14, 14, 11, 9, 11, 11, 11, 11, 11, 8, 5, 9, 8, 7, 7, 7, 6, 3, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 4, 5, 3, 2, 0, 1, 2, 7, 7, 8, 9, 11, 12, 12, 5, 7, 8, 9, 9, 10, 10, 5, 6, 7, 7, 7, 7, 7, 5, 6, 5, 5, 5, 4, 2, 3, 7, 6, 6, 6, 4, 2, 3, 8, 9, 8, 8, 6, 2, 4, 8, 11, 10, 10, 7, 3, 10, 12, 12, 11, 9, 11, 12, 10, 14, 13, 13, 10, 8, 9, 10, 16, 15, 14, 10, 6, 6, 10, 15, 16, 15, 11, 6, 2, 9, 14, 18, 17, 12, 8, 3, 9, 15, 20, 19, 14, 9, 5, 10, 15, 20, 21, 16, 11, 6, 18, 24, 23, 16, 12, 10, 10, 18, 23, 24, 18, 13, 8, 8, 18, 24, 26, 19, 13, 8, 5, 18, 23, 28, 21, 15, 10, 4, 17, 22, 27, 23, 16, 11, 6, 17, 22, 27, 26, 18, 13, 8, 17, 22, 27, 27, 21, 15, 9, 20, 24, 27, 31, 30, 28, 25, 18, 22, 25, 29, 30, 27, 23, 16, 20, 24, 27, 28, 25, 21, 15, 18, 21, 24, 27, 23, 18, 12, 15, 17, 21, 24, 21, 18, 9, 12, 15, 18, 22, 21, 18, 8, 11, 14, 17, 21, 21, 18, 17, 20, 24, 28, 28, 25, 21, 15, 20, 23, 26, 27, 23, 19, 14, 17, 21, 24, 24, 21, 17, 13, 15, 19, 20, 20, 19, 14, 10, 12, 15, 17, 17, 17, 14, 7, 10, 13, 15, 16, 16, 14, 6, 9, 12, 15, 14, 14, 14, 14, 17, 20, 21, 22, 20, 16, 13, 16, 18, 19, 20, 19, 14, 12, 15, 17, 17, 17, 16, 12, 11, 13, 13, 13, 14, 13, 9, 7, 9, 10, 10, 10, 10, 9, 4, 8, 9, 9, 9, 9, 9, 5, 7, 7, 7, 8, 8, 8, 12, 12, 13, 14, 15, 16, 11, 10, 11, 11, 12, 13, 13, 9, 9, 9, 10, 10, 9, 9, 7, 5, 7, 6, 6, 6, 6, 5, 2, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 1, 1, 2, 5, 6, 4, 3, 1, 0, 1, 5, 5, 6, 8, 8, 10, 11, 4, 5, 6, 7, 8, 8, 9, 4, 5, 5, 5, 5, 5, 5, 4, 6, 5, 5, 5, 3, 2, 3, 8, 7, 6, 6, 4, 1, 4, 9, 10, 8, 8, 6, 2, 5, 9, 12, 10, 10, 8, 3, 10, 12, 11, 11, 9, 9, 10, 10, 14, 13, 12, 10, 7, 7, 10, 16, 14, 13, 10, 5, 4, 10, 15, 15, 14, 10, 6, 2, 10, 14, 17, 15, 12, 8, 3, 10, 15, 19, 17, 13, 9, 5, 10, 15, 20, 19, 15, 11, 6, 17, 21, 19, 15, 11, 8, 8, 17, 21, 20, 16, 12, 8, 6, 18, 21, 22, 16, 12, 8, 4, 17, 20, 22, 17, 13, 9, 5, 17, 20, 23, 20, 15, 11, 6, 16, 20, 23, 21, 16, 13, 8, 16, 20, 23, 23, 18, 13, 9, 19, 23, 26, 29, 30, 28, 24, 17, 21, 24, 29, 29, 26, 22, 16, 20, 23, 27, 27, 24, 20, 14, 17, 20, 24, 26, 22, 18, 11, 14, 16, 20, 23, 21, 18, 10, 13, 15, 19, 22, 21, 18, 8, 11, 15, 18, 21, 21, 18, 16, 20, 23, 27, 26, 23, 20, 14, 19, 22, 26, 25, 22, 18, 13, 17, 20, 23, 23, 20, 16, 12, 15, 17, 21, 20, 18, 14, 9, 12, 14, 17, 17, 17, 14, 8, 11, 13, 16, 16, 16, 14, 6, 9, 12, 15, 15, 15, 14, 13, 17, 19, 20, 21, 19, 15, 12, 16, 18, 19, 19, 18, 13, 11, 14, 16, 16, 16, 16, 11, 10, 12, 13, 12, 13, 13, 9, 6, 9, 10, 10, 10, 10, 9, 5, 8, 9, 9, 9, 9, 9, 6, 7, 8, 8, 8, 8, 8, 11, 11, 12, 13, 14, 15, 9, 9, 9, 10, 11, 12, 11, 7, 8, 8, 9, 9, 8, 8, 6, 4, 6, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 2, 2, 2, 2, 6, 8, 5, 3, 2, 1, 0, 2, 3, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 6, 7, 2, 3, 3, 3, 3, 4, 4, 2, 5, 3, 2, 2, 2, 1, 3, 7, 5, 4, 4, 3, 0, 5, 8, 7, 5, 3, 3, 2, 7, 8, 8, 6, 5, 3, 2, 6, 6, 5, 5, 6, 7, 9, 6, 8, 5, 5, 5, 5, 6, 6, 8, 6, 5, 3, 3, 3, 6, 7, 7, 5, 4, 3, 1, 7, 9, 10, 8, 6, 3, 2, 8, 10, 13, 11, 7, 4, 3, 9, 11, 14, 14, 9, 5, 3, 8, 11, 10, 6, 5, 7, 7, 8, 11, 11, 7, 4, 4, 4, 8, 11, 13, 7, 4, 3, 2, 8, 11, 14, 9, 6, 4, 3, 9, 11, 15, 13, 8, 5, 3, 9, 13, 18, 16, 11, 6, 3, 11, 15, 18, 17, 12, 7, 4, 14, 17, 20, 24, 23, 22, 19, 13, 16, 19, 23, 23, 21, 17, 12, 14, 17, 20, 21, 18, 16, 11, 13, 15, 17, 20, 18, 15, 11, 13, 14, 15, 19, 17, 15, 9, 11, 13, 15, 17, 17, 15, 12, 12, 12, 14, 16, 17, 15, 12, 15, 17, 20, 21, 19, 16, 11, 13, 16, 19, 21, 18, 14, 11, 13, 15, 17, 18, 16, 13, 9, 12, 14, 15, 15, 14, 13, 9, 11, 13, 14, 14, 14, 13, 7, 10, 11, 13, 13, 13, 13, 14, 14, 11, 12, 12, 12, 12, 10, 13, 14, 15, 16, 15, 12, 9, 12, 13, 13, 15, 14, 11, 8, 11, 12, 12, 12, 13, 11, 7, 10, 11, 11, 12, 11, 11, 6, 9, 11, 11, 11, 11, 11, 9, 10, 10, 9, 10, 11, 11, 15, 16, 12, 9, 9, 10, 11, 8, 8, 9, 10, 10, 11, 4, 7, 7, 8, 8, 8, 9, 5, 6, 6, 6, 7, 7, 7, 4, 4, 5, 5, 6, 6, 6, 4, 4, 4, 4, 5, 5, 5, 4, 9, 11, 10, 8, 6, 3, 3, 15, 16, 12, 9, 7, 4, 2, 0, 1, 1, 2, 2, 2, 4, 2, 2, 2, 2, 2, 1, 5, 2, 3, 3, 3, 4, 2, 4, 2, 6, 5, 6, 6, 5, 2, 4, 9, 8, 7, 7, 7, 3, 9, 11, 11, 9, 9, 8, 4, 14, 14, 13, 10, 9, 8, 6, 8, 8, 8, 8, 7, 2, 3, 8, 10, 9, 9, 7, 3, 2, 7, 11, 10, 9, 8, 5, 0, 8, 10, 11, 10, 8, 7, 4, 8, 11, 14, 13, 11, 8, 6, 10, 13, 17, 15, 12, 9, 7, 12, 15, 17, 16, 13, 10, 8, 12, 16, 14, 11, 8, 6, 2, 12, 16, 16, 12, 9, 6, 2, 12, 16, 18, 12, 9, 7, 4, 12, 15, 19, 14, 11, 8, 7, 12, 16, 19, 17, 13, 10, 7, 13, 17, 20, 19, 15, 11, 8, 15, 18, 20, 21, 16, 12, 9, 15, 17, 19, 20, 21, 18, 17, 14, 16, 18, 20, 20, 19, 17, 12, 15, 18, 19, 20, 18, 17, 11, 14, 17, 18, 20, 19, 17, 11, 14, 17, 19, 21, 19, 17, 10, 14, 16, 18, 20, 19, 17, 13, 13, 15, 18, 20, 19, 17, 13, 15, 18, 19, 18, 16, 14, 12, 15, 17, 19, 18, 16, 14, 11, 14, 16, 17, 17, 16, 14, 9, 13, 16, 17, 17, 17, 15, 9, 12, 15, 17, 17, 17, 15, 8, 11, 14, 16, 16, 16, 15, 16, 14, 13, 15, 15, 15, 15, 10, 14, 14, 15, 15, 13, 10, 9, 12, 14, 14, 14, 13, 10, 8, 11, 12, 13, 13, 13, 10, 7, 11, 12, 12, 13, 13, 11, 7, 10, 11, 12, 12, 12, 11, 10, 11, 10, 11, 11, 11, 11, 17, 17, 12, 10, 10, 10, 10, 8, 8, 8, 9, 9, 9, 3, 7, 7, 7, 7, 8, 8, 3, 6, 6, 6, 6, 6, 6, 4, 4, 5, 5, 6, 6, 6, 4, 6, 6, 5, 5, 5, 5, 4, 10, 12, 10, 9, 6, 5, 3, 17, 19, 14, 10, 7, 5, 3, 1, 0, 1, 1, 2, 2, 3, 2, 2, 1, 2, 2, 1, 3, 2, 3, 3, 3, 3, 1, 3, 2, 7, 6, 6, 6, 5, 3, 5, 11, 10, 10, 11, 8, 3, 10, 14, 16, 15, 13, 10, 5, 16, 19, 20, 16, 15, 12, 7, 9, 10, 10, 10, 7, 2, 2, 8, 12, 12, 11, 8, 3, 2, 8, 14, 14, 14, 9, 5, 1, 8, 15, 17, 17, 13, 9, 5, 11, 17, 22, 21, 17, 12, 7, 14, 20, 26, 25, 20, 15, 9, 18, 23, 27, 25, 21, 17, 11, 17, 22, 21, 15, 10, 5, 1, 16, 22, 24, 17, 12, 6, 2, 16, 22, 25, 18, 13, 9, 4, 16, 22, 27, 22, 17, 13, 9, 18, 24, 29, 26, 21, 17, 11, 20, 26, 30, 29, 23, 18, 13, 23, 28, 30, 30, 25, 21, 15, 14, 17, 20, 22, 23, 20, 18, 13, 16, 19, 22, 23, 20, 18, 12, 15, 18, 21, 23, 20, 18, 11, 14, 17, 21, 23, 22, 19, 12, 14, 18, 20, 24, 23, 19, 11, 14, 17, 20, 23, 22, 19, 14, 14, 16, 19, 22, 21, 19, 12, 15, 18, 21, 19, 17, 14, 11, 14, 18, 19, 19, 16, 14, 10, 13, 16, 19, 18, 17, 15, 9, 13, 16, 18, 18, 18, 16, 10, 13, 15, 18, 18, 18, 15, 10, 11, 15, 17, 18, 18, 16, 17, 16, 14, 16, 17, 16, 16, 10, 13, 15, 15, 15, 13, 9, 9, 12, 13, 13, 14, 12, 9, 8, 11, 12, 12, 12, 13, 10, 8, 11, 12, 12, 12, 13, 11, 7, 10, 12, 12, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 19, 18, 14, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 2, 7, 7, 7, 7, 7, 7, 2, 6, 6, 6, 6, 6, 6, 3, 4, 6, 6, 6, 6, 6, 4, 6, 7, 6, 6, 6, 5, 4, 12, 13, 12, 10, 8, 6, 4, 19, 20, 15, 11, 8, 6, 5, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 4, 3, 4, 4, 2, 3, 2, 7, 7, 7, 7, 6, 4, 6, 12, 12, 11, 11, 9, 5, 11, 15, 17, 16, 14, 11, 6, 18, 21, 20, 17, 16, 13, 7, 9, 11, 9, 9, 6, 2, 2, 9, 13, 11, 11, 7, 3, 1, 9, 14, 14, 14, 10, 6, 2, 9, 16, 18, 17, 14, 10, 6, 12, 18, 23, 21, 18, 13, 7, 15, 21, 28, 26, 20, 15, 9, 19, 25, 29, 27, 23, 17, 11, 16, 22, 21, 15, 9, 5, 1, 17, 22, 23, 16, 11, 6, 2, 16, 22, 26, 19, 13, 9, 5, 16, 23, 29, 23, 18, 14, 10, 18, 25, 31, 28, 22, 17, 11, 22, 28, 33, 33, 26, 19, 13, 25, 30, 34, 34, 28, 21, 15, 14, 17, 21, 23, 24, 20, 18, 14, 16, 19, 23, 24, 21, 18, 12, 15, 18, 22, 23, 22, 19, 11, 15, 18, 22, 25, 23, 20, 12, 15, 18, 22, 26, 23, 20, 11, 14, 17, 21, 25, 23, 20, 16, 15, 17, 20, 23, 22, 19, 12, 15, 18, 20, 20, 17, 14, 12, 14, 17, 20, 19, 17, 14, 10, 13, 17, 19, 19, 18, 15, 9, 13, 17, 20, 19, 18, 16, 10, 13, 16, 18, 19, 19, 16, 11, 12, 15, 18, 18, 18, 16, 18, 17, 15, 17, 17, 17, 16, 10, 13, 14, 15, 15, 12, 9, 9, 12, 13, 13, 14, 12, 9, 9, 11, 13, 13, 13, 13, 10, 8, 11, 13, 13, 13, 14, 11, 7, 10, 12, 12, 12, 12, 11, 13, 13, 13, 12, 12, 11, 11, 20, 19, 15, 12, 10, 11, 10, 9, 8, 8, 8, 8, 8, 2, 8, 7, 7, 7, 7, 6, 2, 6, 6, 6, 7, 6, 6, 3, 4, 6, 6, 6, 6, 6, 5, 6, 8, 8, 8, 8, 6, 5, 13, 15, 13, 11, 9, 7, 5, 21, 21, 16, 12, 9, 7, 6, 2, 1, 1, 0, 1, 1, 2, 3, 2, 2, 2, 2, 0, 2, 2, 4, 4, 4, 4, 3, 3, 2, 8, 8, 8, 8, 7, 5, 7, 13, 12, 12, 13, 10, 6, 13, 17, 18, 17, 14, 12, 7, 19, 22, 22, 19, 17, 14, 8, 9, 11, 9, 9, 6, 2, 2, 10, 12, 11, 11, 7, 3, 2, 10, 15, 14, 14, 11, 6, 3, 9, 17, 18, 18, 15, 10, 7, 13, 19, 24, 22, 18, 13, 8, 16, 22, 29, 27, 21, 16, 10, 21, 26, 30, 30, 25, 17, 12, 17, 22, 20, 14, 9, 5, 1, 17, 22, 23, 16, 11, 6, 3, 17, 22, 25, 19, 14, 10, 6, 17, 24, 29, 24, 18, 14, 10, 20, 26, 31, 29, 23, 18, 12, 23, 30, 35, 33, 26, 19, 14, 25, 32, 35, 36, 28, 22, 16, 15, 18, 21, 24, 24, 21, 18, 14, 17, 19, 23, 24, 22, 19, 12, 15, 19, 23, 25, 23, 20, 11, 16, 19, 22, 26, 24, 20, 12, 16, 19, 23, 26, 24, 21, 12, 15, 18, 22, 26, 24, 21, 17, 17, 18, 20, 24, 24, 21, 12, 16, 19, 22, 20, 17, 14, 12, 15, 18, 20, 20, 17, 15, 10, 14, 17, 20, 20, 19, 16, 10, 14, 17, 20, 20, 19, 16, 10, 14, 17, 19, 20, 20, 17, 12, 14, 16, 19, 19, 19, 17, 20, 18, 16, 18, 18, 18, 17, 10, 14, 15, 14, 15, 13, 9, 10, 12, 13, 14, 14, 13, 10, 9, 12, 13, 14, 14, 14, 11, 9, 12, 14, 14, 14, 14, 12, 8, 11, 13, 13, 13, 13, 12, 14, 14, 14, 13, 13, 12, 12, 22, 20, 16, 12, 11, 11, 10, 9, 8, 8, 8, 8, 8, 2, 9, 7, 7, 7, 7, 7, 3, 6, 6, 6, 7, 7, 7, 4, 6, 6, 7, 7, 7, 7, 6, 7, 8, 9, 9, 9, 8, 6, 14, 16, 14, 12, 10, 8, 6, 22, 22, 17, 13, 10, 8, 7, 2, 2, 1, 1, 0, 1, 2, 3, 2, 2, 2, 2, 1, 3, 3, 4, 4, 5, 5, 4, 3, 3, 8, 8, 9, 9, 7, 6, 7, 14, 13, 13, 13, 11, 7, 14, 18, 19, 18, 15, 12, 8, 20, 23, 23, 19, 18, 14, 9, 10, 10, 9, 8, 5, 2, 2, 10, 12, 10, 9, 7, 4, 2, 10, 13, 12, 13, 10, 7, 4, 10, 15, 17, 16, 15, 11, 7, 13, 19, 23, 21, 18, 14, 9, 17, 23, 28, 26, 20, 16, 11, 21, 27, 29, 28, 23, 18, 13, 15, 17, 14, 10, 8, 4, 1, 15, 17, 15, 11, 9, 7, 3, 15, 17, 18, 15, 13, 11, 7, 15, 19, 23, 20, 17, 15, 11, 18, 23, 27, 25, 22, 18, 13, 23, 27, 31, 30, 24, 19, 15, 27, 30, 32, 32, 26, 21, 17, 13, 16, 20, 23, 23, 20, 17, 13, 16, 18, 22, 23, 21, 19, 12, 14, 18, 22, 25, 22, 19, 11, 15, 19, 22, 26, 23, 20, 12, 15, 18, 21, 25, 23, 20, 12, 15, 18, 21, 25, 23, 20, 18, 18, 17, 20, 23, 23, 20, 12, 15, 17, 20, 18, 15, 13, 11, 14, 17, 19, 19, 17, 14, 10, 13, 16, 19, 20, 17, 15, 9, 12, 16, 20, 19, 18, 16, 9, 13, 16, 19, 20, 19, 16, 13, 14, 16, 18, 18, 18, 15, 21, 19, 17, 17, 17, 17, 16, 10, 13, 13, 13, 14, 11, 8, 9, 12, 12, 12, 13, 12, 9, 8, 11, 12, 13, 13, 13, 10, 7, 11, 12, 13, 13, 13, 11, 7, 11, 12, 13, 13, 13, 11, 15, 16, 15, 13, 12, 12, 11, 23, 22, 17, 14, 11, 10, 10, 8, 7, 7, 7, 7, 7, 2, 7, 6, 6, 6, 6, 6, 2, 4, 5, 5, 6, 6, 6, 4, 8, 5, 6, 6, 6, 7, 6, 8, 9, 10, 10, 10, 9, 7, 15, 17, 16, 14, 11, 9, 8, 23, 24, 18, 15, 12, 10, 8, 2, 2, 2, 1, 1, 0, 2, 4, 2, 2, 2, 2, 2, 2, 4, 3, 3, 4, 5, 5, 4, 4, 7, 7, 8, 8, 8, 8, 8, 13, 13, 13, 13, 11, 8, 15, 19, 19, 17, 14, 12, 9, 22, 24, 22, 18, 15, 13, 10, 6, 6, 4, 3, 3, 2, 1, 6, 7, 5, 4, 3, 3, 2, 6, 9, 6, 7, 6, 6, 6, 6, 11, 12, 12, 11, 10, 9, 11, 15, 19, 17, 15, 13, 10, 17, 21, 25, 22, 17, 13, 11, 22, 25, 26, 24, 19, 15, 12, 10, 12, 8, 5, 3, 2, 2, 10, 12, 10, 6, 4, 4, 4, 10, 12, 13, 9, 9, 8, 7, 10, 14, 18, 16, 13, 12, 10, 14, 18, 23, 22, 18, 15, 12, 19, 23, 27, 27, 21, 16, 13, 24, 27, 28, 29, 23, 18, 13, 9, 11, 13, 15, 16, 13, 11, 9, 11, 12, 15, 16, 14, 12, 8, 10, 12, 16, 18, 15, 13, 7, 10, 13, 16, 19, 17, 15, 8, 11, 14, 17, 20, 17, 14, 11, 13, 15, 16, 19, 17, 14, 18, 18, 16, 16, 18, 17, 15, 8, 10, 11, 14, 11, 9, 7, 7, 9, 11, 13, 12, 10, 8, 7, 8, 11, 14, 13, 11, 10, 6, 9, 12, 14, 13, 12, 11, 6, 10, 12, 14, 14, 13, 11, 13, 14, 15, 16, 14, 13, 11, 21, 19, 17, 15, 13, 12, 11, 7, 9, 8, 7, 7, 5, 3, 6, 8, 8, 7, 7, 7, 5, 5, 7, 7, 8, 8, 8, 6, 3, 7, 8, 9, 9, 9, 8, 7, 10, 10, 10, 10, 9, 8, 16, 16, 15, 13, 11, 9, 8, 23, 22, 18, 14, 12, 10, 8, 5, 4, 3, 3, 3, 2, 0, 3, 2, 3, 2, 2, 3, 2, 6, 2, 2, 3, 3, 3, 4, 10, 3, 5, 6, 6, 6, 6, 9, 10, 10, 10, 10, 9, 7, 16, 18, 16, 14, 12, 10, 8, 23, 24, 19, 15, 12, 11, 9, 4, 3, 2, 2, 2, 2, 0, 6, 4, 3, 2, 2, 3, 2, 6, 4, 4, 5, 5, 5, 5, 6, 8, 8, 9, 10, 9, 8, 9, 15, 15, 15, 15, 12, 9, 15, 21, 21, 19, 16, 14, 10, 22, 25, 25, 21, 18, 15, 11, 8, 7, 5, 5, 3, 2, 1, 8, 10, 7, 6, 4, 4, 3, 8, 11, 10, 11, 9, 7, 6, 8, 13, 16, 16, 15, 12, 10, 12, 19, 23, 22, 19, 16, 11, 18, 24, 30, 27, 22, 16, 13, 23, 28, 31, 30, 24, 18, 14, 12, 16, 14, 8, 5, 3, 2, 13, 16, 16, 10, 6, 5, 4, 12, 16, 19, 15, 12, 10, 8, 13, 18, 25, 21, 18, 15, 12, 17, 23, 29, 28, 23, 19, 14, 22, 27, 33, 33, 26, 20, 16, 27, 32, 34, 34, 28, 23, 17, 16, 19, 23, 26, 26, 25, 22, 15, 19, 22, 25, 26, 23, 21, 14, 17, 20, 23, 24, 22, 19, 13, 15, 17, 20, 22, 20, 18, 12, 14, 16, 18, 21, 19, 18, 10, 12, 15, 17, 20, 20, 18, 10, 11, 13, 16, 19, 20, 18, 14, 17, 20, 24, 24, 23, 18, 13, 16, 19, 22, 24, 22, 17, 12, 14, 18, 20, 20, 18, 15, 11, 13, 15, 17, 18, 16, 14, 10, 12, 14, 15, 16, 17, 14, 8, 11, 13, 14, 15, 15, 15, 11, 11, 12, 13, 14, 15, 14, 12, 14, 16, 17, 19, 19, 14, 11, 13, 15, 16, 16, 17, 13, 10, 12, 14, 14, 15, 15, 12, 9, 12, 12, 12, 12, 13, 12, 7, 10, 12, 12, 11, 12, 12, 8, 9, 10, 10, 11, 11, 12, 12, 12, 10, 9, 10, 11, 12, 10, 10, 11, 11, 12, 14, 6, 8, 9, 9, 10, 10, 11, 6, 7, 7, 8, 8, 9, 9, 5, 4, 6, 7, 7, 7, 7, 6, 5, 5, 5, 6, 6, 7, 4, 8, 8, 7, 6, 5, 5, 4, 12, 12, 8, 6, 5, 4, 2, 2, 2, 2, 2, 3, 4, 6, 0, 1, 1, 2, 1, 2, 5, 0, 2, 2, 1, 1, 1, 4, 0, 2, 2, 1, 1, 1, 4, 2, 4, 3, 3, 4, 2, 2, 5, 7, 7, 6, 5, 3, 2, 9, 10, 9, 7, 6, 4, 2, 4, 5, 5, 5, 3, 2, 4, 4, 6, 6, 6, 3, 1, 3, 4, 7, 7, 6, 4, 1, 2, 4, 7, 8, 7, 5, 3, 2, 4, 8, 10, 9, 7, 4, 2, 6, 10, 14, 11, 9, 6, 2, 9, 12, 14, 13, 10, 6, 3, 9, 12, 11, 8, 5, 2, 2, 9, 12, 12, 8, 5, 2, 1, 9, 12, 14, 9, 6, 3, 1, 9, 12, 15, 10, 7, 5, 2, 9, 12, 15, 13, 10, 7, 4, 10, 13, 17, 16, 11, 8, 5, 12, 15, 16, 17, 13, 9, 6, 16, 19, 20, 22, 22, 20, 18, 15, 18, 20, 21, 22, 20, 17, 14, 16, 18, 21, 22, 19, 18, 13, 15, 19, 20, 22, 20, 18, 13, 16, 18, 20, 22, 21, 19, 11, 15, 18, 19, 21, 20, 18, 12, 13, 17, 19, 20, 20, 18, 14, 17, 19, 21, 19, 18, 16, 13, 16, 18, 20, 19, 18, 16, 12, 15, 17, 19, 18, 17, 16, 11, 14, 17, 18, 17, 18, 16, 11, 14, 17, 19, 18, 18, 17, 9, 12, 15, 17, 18, 18, 16, 15, 14, 14, 16, 16, 17, 16, 12, 15, 16, 16, 16, 15, 12, 11, 14, 15, 15, 15, 15, 12, 10, 13, 14, 14, 15, 15, 12, 9, 12, 14, 13, 14, 14, 12, 8, 11, 13, 13, 13, 13, 12, 10, 10, 11, 12, 13, 13, 12, 17, 16, 12, 10, 11, 11, 12, 10, 9, 10, 10, 10, 11, 4, 9, 8, 9, 9, 9, 9, 4, 7, 7, 7, 8, 8, 8, 5, 5, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 10, 11, 10, 9, 6, 5, 4, 17, 18, 13, 10, 7, 5, 3, 2, 2, 2, 2, 2, 2, 4, 1, 0, 1, 1, 1, 2, 4, 1, 2, 2, 2, 1, 0, 4, 1, 5, 5, 5, 5, 4, 3, 4, 9, 9, 9, 9, 7, 3, 9, 13, 15, 14, 12, 9, 4, 16, 18, 18, 15, 14, 11, 5, 7, 9, 8, 9, 5, 1, 3, 7, 11, 10, 10, 7, 2, 3, 7, 13, 13, 12, 8, 3, 2, 7, 13, 15, 15, 12, 7, 4, 9, 16, 19, 18, 16, 11, 5, 12, 18, 22, 20, 17, 13, 7, 17, 21, 23, 22, 18, 15, 9, 15, 20, 18, 14, 9, 4, 2, 15, 19, 20, 15, 11, 5, 1, 15, 19, 21, 16, 12, 7, 3, 15, 20, 23, 19, 16, 12, 7, 16, 21, 24, 22, 18, 15, 9, 18, 22, 25, 24, 20, 16, 12, 21, 23, 26, 25, 21, 18, 13, 16, 19, 21, 24, 24, 22, 19, 15, 18, 20, 23, 25, 21, 19, 13, 17, 20, 23, 24, 21, 20, 13, 16, 19, 22, 24, 22, 20, 13, 16, 19, 22, 25, 23, 20, 12, 15, 18, 21, 24, 23, 21, 13, 14, 17, 20, 23, 24, 21, 13, 17, 20, 22, 21, 18, 16, 12, 16, 18, 21, 20, 18, 15, 12, 14, 17, 20, 20, 18, 16, 10, 14, 17, 21, 19, 19, 17, 11, 14, 17, 19, 20, 20, 17, 9, 13, 16, 18, 19, 19, 17, 16, 15, 15, 18, 17, 18, 17, 11, 14, 16, 16, 16, 14, 11, 10, 13, 15, 15, 15, 14, 11, 10, 12, 14, 13, 14, 14, 11, 9, 12, 14, 14, 14, 14, 12, 8, 11, 13, 13, 13, 13, 12, 11, 11, 12, 12, 12, 12, 12, 18, 17, 13, 11, 11, 11, 11, 10, 9, 9, 9, 10, 9, 3, 9, 8, 8, 8, 8, 8, 3, 8, 7, 7, 7, 7, 7, 3, 5, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, 6, 6, 4, 11, 13, 11, 9, 7, 5, 4, 18, 20, 14, 10, 8, 6, 4, 2, 1, 2, 2, 2, 2, 3, 1, 1, 0, 1, 1, 1, 3, 1, 2, 2, 2, 2, 1, 3, 1, 6, 6, 6, 6, 5, 4, 5, 10, 10, 10, 10, 8, 4, 11, 14, 16, 14, 12, 9, 5, 17, 19, 19, 16, 14, 12, 6, 7, 9, 8, 8, 5, 1, 2, 7, 11, 10, 10, 6, 2, 2, 7, 13, 12, 12, 8, 4, 2, 8, 14, 16, 16, 12, 8, 5, 10, 17, 21, 20, 16, 11, 6, 13, 20, 26, 25, 19, 13, 8, 17, 23, 26, 27, 22, 16, 9, 15, 20, 19, 13, 8, 4, 1, 16, 21, 22, 15, 10, 5, 0, 15, 20, 24, 17, 12, 8, 4, 15, 22, 27, 21, 16, 12, 8, 17, 24, 29, 27, 21, 15, 10, 20, 26, 31, 32, 24, 18, 12, 23, 29, 33, 33, 26, 19, 14, 16, 19, 22, 25, 25, 22, 20, 15, 18, 21, 25, 25, 22, 19, 13, 16, 20, 23, 26, 22, 21, 13, 16, 19, 23, 26, 24, 21, 13, 16, 19, 22, 26, 25, 21, 12, 16, 19, 22, 25, 24, 22, 15, 15, 17, 21, 25, 25, 21, 14, 16, 20, 22, 21, 19, 15, 13, 15, 19, 21, 21, 19, 15, 12, 14, 17, 20, 21, 19, 17, 11, 15, 18, 21, 21, 20, 17, 12, 14, 17, 20, 20, 21, 17, 11, 13, 16, 19, 20, 19, 17, 18, 16, 15, 18, 18, 18, 17, 12, 14, 16, 16, 17, 14, 11, 11, 13, 15, 15, 15, 14, 10, 10, 12, 14, 15, 14, 15, 11, 9, 13, 14, 14, 15, 15, 12, 9, 12, 13, 14, 14, 14, 12, 12, 13, 12, 12, 12, 13, 12, 19, 18, 14, 11, 12, 12, 11, 10, 9, 9, 9, 9, 9, 2, 9, 8, 8, 8, 8, 8, 2, 8, 7, 7, 8, 7, 8, 3, 5, 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 4, 13, 14, 13, 11, 8, 6, 5, 19, 21, 16, 12, 9, 7, 5, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 0, 1, 1, 3, 2, 2, 2, 3, 3, 2, 3, 2, 6, 6, 6, 7, 5, 5, 6, 12, 11, 11, 11, 8, 5, 12, 16, 17, 15, 13, 10, 6, 18, 21, 20, 17, 15, 12, 7, 8, 9, 8, 8, 5, 1, 2, 8, 11, 10, 9, 6, 2, 2, 8, 13, 13, 13, 9, 5, 3, 8, 15, 17, 17, 13, 9, 6, 11, 18, 22, 21, 17, 12, 7, 14, 20, 26, 26, 19, 14, 9, 19, 24, 28, 28, 22, 16, 10, 15, 21, 19, 13, 8, 3, 1, 15, 20, 21, 15, 9, 5, 1, 15, 21, 24, 18, 13, 9, 5, 15, 22, 28, 23, 17, 13, 9, 18, 24, 30, 27, 21, 16, 11, 20, 27, 32, 32, 24, 18, 12, 24, 30, 34, 34, 27, 20, 14, 16, 19, 23, 26, 26, 23, 20, 15, 18, 21, 25, 26, 23, 20, 14, 17, 20, 23, 25, 24, 22, 13, 17, 20, 24, 26, 25, 22, 14, 17, 20, 24, 27, 25, 21, 12, 16, 18, 23, 27, 25, 22, 16, 16, 18, 22, 25, 25, 22, 14, 17, 20, 23, 22, 19, 16, 13, 16, 19, 22, 22, 18, 16, 12, 15, 18, 21, 20, 20, 17, 11, 15, 18, 22, 21, 20, 17, 12, 15, 18, 20, 21, 21, 17, 11, 14, 17, 20, 20, 20, 18, 18, 17, 16, 19, 18, 19, 17, 12, 15, 15, 16, 17, 15, 11, 11, 14, 15, 15, 15, 14, 11, 10, 13, 14, 15, 15, 15, 12, 10, 13, 15, 15, 15, 15, 12, 9, 13, 14, 14, 14, 14, 12, 13, 14, 14, 13, 13, 13, 12, 20, 19, 15, 12, 12, 12, 12, 10, 9, 9, 9, 10, 10, 3, 9, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 3, 5, 7, 8, 8, 8, 8, 6, 7, 8, 8, 8, 8, 7, 4, 13, 15, 13, 11, 9, 7, 5, 20, 21, 16, 12, 10, 8, 6, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 2, 3, 1, 2, 3, 3, 3, 2, 3, 1, 6, 7, 7, 7, 6, 5, 6, 11, 11, 11, 11, 8, 6, 12, 17, 18, 16, 13, 10, 7, 19, 21, 21, 17, 16, 12, 7, 8, 9, 8, 7, 4, 1, 2, 8, 11, 9, 8, 6, 2, 2, 8, 12, 11, 12, 9, 5, 3, 8, 14, 16, 15, 13, 9, 6, 11, 17, 21, 20, 18, 13, 7, 15, 21, 27, 25, 19, 14, 9, 20, 24, 28, 26, 21, 16, 11, 14, 16, 14, 10, 7, 3, 1, 13, 16, 15, 11, 9, 5, 2, 14, 16, 18, 14, 12, 9, 5, 14, 18, 23, 19, 16, 12, 9, 17, 22, 25, 24, 20, 16, 11, 21, 25, 29, 29, 23, 18, 13, 24, 29, 31, 30, 25, 19, 14, 15, 18, 21, 26, 25, 22, 18, 14, 17, 20, 24, 25, 22, 19, 13, 16, 19, 23, 24, 23, 19, 12, 15, 19, 23, 25, 23, 20, 13, 15, 19, 22, 26, 24, 21, 11, 14, 17, 21, 25, 24, 20, 16, 15, 16, 20, 23, 23, 21, 13, 16, 18, 22, 21, 19, 15, 12, 15, 17, 21, 21, 17, 14, 11, 14, 17, 20, 19, 18, 15, 10, 13, 17, 20, 20, 19, 16, 10, 14, 16, 19, 19, 19, 16, 11, 13, 16, 18, 18, 18, 16, 18, 17, 16, 17, 16, 17, 16, 11, 14, 15, 15, 16, 14, 10, 10, 12, 13, 13, 14, 13, 9, 9, 11, 13, 14, 13, 13, 10, 8, 12, 13, 13, 13, 13, 11, 7, 11, 12, 12, 12, 13, 11, 14, 14, 13, 12, 11, 11, 11, 20, 19, 15, 12, 10, 10, 10, 9, 8, 8, 8, 9, 9, 3, 8, 7, 7, 7, 7, 7, 2, 6, 6, 6, 7, 6, 6, 2, 5, 6, 6, 6, 6, 6, 5, 7, 8, 8, 8, 8, 7, 5, 14, 16, 13, 11, 9, 7, 5, 21, 22, 16, 12, 10, 8, 6, 1, 1, 1, 0, 1, 2, 3, 2, 2, 1, 1, 2, 0, 2, 2, 3, 3, 4, 3, 3, 3, 2, 6, 6, 6, 6, 6, 5, 7, 12, 11, 10, 10, 8, 6, 13, 16, 17, 14, 11, 9, 7, 19, 21, 20, 15, 13, 10, 7, 6, 6, 4, 3, 3, 2, 2, 6, 7, 5, 4, 3, 2, 2, 6, 9, 6, 6, 4, 4, 3, 6, 10, 10, 9, 8, 7, 7, 9, 13, 16, 14, 13, 10, 8, 14, 19, 22, 19, 14, 11, 9, 19, 22, 23, 21, 16, 12, 9, 10, 11, 8, 5, 3, 2, 1, 10, 12, 10, 5, 4, 3, 2, 10, 12, 12, 8, 7, 5, 5, 10, 13, 16, 13, 10, 9, 8, 12, 15, 20, 19, 15, 12, 9, 16, 20, 24, 24, 17, 13, 10, 20, 24, 25, 25, 19, 14, 11, 9, 11, 14, 17, 17, 14, 11, 9, 11, 13, 16, 17, 13, 11, 8, 10, 12, 15, 17, 15, 12, 8, 10, 13, 16, 18, 16, 14, 8, 11, 13, 16, 19, 16, 13, 10, 11, 13, 15, 18, 17, 13, 16, 15, 14, 15, 17, 17, 13, 8, 10, 12, 14, 13, 11, 7, 8, 9, 11, 13, 13, 9, 7, 7, 8, 11, 13, 12, 10, 8, 6, 9, 12, 14, 13, 12, 9, 6, 9, 11, 13, 13, 12, 10, 12, 12, 13, 13, 12, 12, 10, 19, 17, 14, 13, 11, 11, 10, 7, 9, 8, 8, 9, 7, 4, 6, 8, 8, 7, 7, 6, 4, 5, 8, 7, 8, 7, 7, 5, 4, 7, 8, 8, 7, 7, 6, 7, 9, 9, 8, 8, 8, 6, 14, 14, 13, 11, 9, 7, 6, 21, 19, 15, 12, 9, 7, 6, 5, 4, 3, 3, 3, 4, 2, 3, 3, 3, 3, 2, 2, 0, 3, 2, 2, 3, 2, 2, 2, 7, 3, 4, 5, 4, 4, 4, 8, 9, 9, 8, 8, 7, 5, 14, 16, 14, 12, 10, 8, 6, 21, 22, 16, 13, 10, 9, 7, 5, 3, 2, 2, 3, 2, 2, 5, 4, 3, 2, 3, 2, 0, 5, 5, 4, 4, 4, 4, 3, 5, 8, 8, 8, 8, 8, 6, 9, 14, 14, 13, 13, 10, 7, 14, 18, 19, 18, 14, 11, 8, 20, 22, 23, 19, 16, 13, 9, 9, 9, 7, 6, 4, 3, 2, 8, 10, 8, 7, 5, 3, 2, 9, 12, 11, 11, 9, 6, 4, 9, 14, 16, 16, 13, 10, 8, 12, 18, 22, 20, 18, 14, 9, 16, 22, 28, 26, 20, 15, 10, 21, 26, 29, 28, 22, 17, 12, 14, 18, 15, 10, 6, 3, 2, 13, 17, 18, 12, 8, 5, 3, 13, 17, 20, 15, 12, 9, 6, 14, 19, 25, 21, 16, 14, 10, 18, 23, 28, 26, 21, 17, 12, 21, 27, 32, 32, 25, 19, 14, 26, 30, 32, 33, 26, 21, 15, 16, 19, 23, 26, 26, 25, 23, 15, 18, 21, 25, 26, 23, 21, 14, 17, 20, 23, 24, 22, 19, 13, 15, 17, 20, 22, 20, 18, 12, 14, 15, 18, 21, 20, 18, 11, 12, 14, 17, 20, 20, 17, 10, 11, 13, 16, 19, 20, 18, 13, 17, 21, 24, 24, 23, 18, 13, 15, 19, 22, 24, 21, 17, 12, 14, 17, 20, 21, 18, 15, 10, 13, 15, 17, 17, 17, 15, 10, 12, 14, 15, 15, 17, 14, 8, 11, 13, 15, 15, 15, 14, 11, 11, 12, 14, 14, 15, 14, 12, 14, 16, 18, 19, 19, 15, 11, 13, 15, 16, 17, 17, 13, 10, 13, 13, 15, 14, 15, 12, 9, 12, 12, 12, 13, 13, 12, 7, 10, 11, 11, 11, 12, 12, 8, 9, 9, 10, 11, 11, 12, 12, 12, 10, 9, 10, 11, 12, 10, 10, 10, 11, 13, 13, 6, 8, 9, 9, 10, 10, 10, 5, 7, 7, 8, 8, 9, 9, 5, 4, 6, 6, 7, 7, 7, 6, 5, 5, 6, 6, 6, 7, 5, 8, 8, 7, 6, 5, 5, 4, 12, 12, 8, 6, 5, 4, 2, 2, 2, 2, 3, 3, 4, 6, 0, 1, 1, 2, 1, 2, 5, 0, 2, 2, 1, 1, 1, 5, 0, 2, 2, 1, 2, 1, 3, 2, 4, 4, 3, 4, 2, 2, 5, 7, 7, 6, 5, 3, 2, 9, 10, 10, 7, 6, 4, 2, 4, 5, 4, 5, 3, 2, 4, 4, 6, 6, 6, 3, 1, 3, 4, 7, 7, 6, 4, 1, 2, 4, 7, 8, 7, 5, 3, 2, 4, 8, 10, 9, 7, 4, 2, 6, 10, 13, 12, 9, 6, 2, 9, 12, 14, 13, 10, 7, 3, 9, 12, 11, 8, 5, 2, 2, 9, 12, 13, 8, 5, 2, 1, 9, 13, 14, 9, 6, 3, 1, 9, 12, 15, 10, 7, 5, 2, 9, 12, 15, 13, 10, 7, 3, 10, 14, 17, 16, 11, 8, 5, 12, 15, 17, 17, 13, 9, 6, 18, 19, 22, 24, 24, 22, 19, 17, 20, 21, 24, 24, 22, 19, 15, 18, 20, 22, 24, 22, 20, 15, 18, 20, 21, 23, 22, 19, 14, 17, 19, 21, 24, 22, 21, 13, 16, 19, 21, 23, 22, 20, 12, 14, 17, 20, 22, 22, 20, 15, 18, 20, 23, 22, 20, 17, 14, 17, 20, 22, 20, 19, 17, 13, 17, 19, 21, 21, 18, 18, 12, 16, 18, 20, 19, 18, 17, 12, 15, 18, 19, 19, 20, 18, 11, 13, 17, 19, 18, 19, 17, 14, 13, 15, 17, 18, 18, 18, 13, 17, 17, 18, 18, 17, 14, 12, 15, 16, 16, 17, 16, 13, 11, 14, 16, 16, 16, 17, 14, 10, 13, 15, 15, 16, 16, 14, 9, 12, 14, 14, 15, 15, 14, 9, 11, 12, 13, 13, 14, 14, 16, 16, 12, 12, 13, 13, 13, 11, 11, 12, 12, 12, 13, 4, 10, 10, 11, 11, 11, 11, 5, 9, 9, 9, 9, 10, 10, 5, 5, 8, 8, 8, 8, 9, 7, 6, 7, 7, 7, 8, 8, 5, 9, 10, 9, 8, 6, 6, 5, 16, 18, 13, 9, 6, 5, 3, 3, 3, 4, 4, 4, 3, 4, 1, 2, 2, 2, 2, 2, 5, 1, 0, 1, 1, 1, 2, 5, 1, 3, 3, 3, 4, 2, 5, 3, 8, 8, 8, 8, 6, 3, 8, 13, 14, 12, 10, 8, 3, 15, 17, 16, 13, 11, 9, 4, 6, 8, 8, 8, 4, 2, 4, 6, 10, 9, 9, 6, 1, 4, 6, 11, 11, 10, 7, 2, 3, 6, 12, 12, 12, 10, 6, 4, 8, 13, 15, 14, 12, 9, 4, 11, 15, 18, 16, 13, 11, 6, 15, 17, 19, 17, 14, 12, 8, 13, 16, 15, 12, 8, 2, 2, 13, 16, 16, 12, 9, 4, 2, 13, 16, 18, 13, 10, 6, 1, 13, 16, 19, 14, 12, 10, 6, 13, 16, 20, 17, 14, 12, 8, 15, 17, 21, 20, 15, 13, 10, 17, 19, 22, 21, 17, 14, 11, 18, 21, 24, 26, 26, 24, 21, 17, 20, 23, 26, 26, 24, 21, 15, 19, 22, 26, 25, 23, 22, 14, 17, 21, 24, 26, 24, 22, 14, 17, 21, 23, 26, 25, 22, 13, 16, 20, 23, 26, 25, 21, 13, 15, 18, 21, 24, 24, 22, 15, 19, 21, 24, 23, 21, 17, 15, 18, 21, 24, 23, 20, 17, 13, 17, 20, 22, 22, 20, 17, 12, 16, 19, 22, 22, 20, 18, 12, 15, 18, 21, 21, 22, 18, 11, 14, 17, 20, 21, 20, 18, 15, 14, 16, 19, 19, 19, 18, 13, 17, 18, 18, 19, 17, 13, 12, 15, 17, 17, 17, 17, 13, 11, 14, 16, 16, 16, 16, 13, 10, 13, 15, 15, 16, 16, 13, 10, 13, 15, 15, 15, 15, 14, 10, 11, 13, 13, 14, 14, 13, 16, 16, 12, 12, 13, 13, 13, 11, 11, 11, 11, 12, 12, 4, 10, 10, 10, 11, 10, 11, 4, 8, 9, 9, 9, 9, 9, 5, 6, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 4, 10, 11, 10, 8, 7, 6, 4, 17, 18, 13, 9, 7, 5, 3, 3, 3, 3, 4, 4, 3, 4, 2, 2, 2, 2, 2, 3, 4, 2, 1, 0, 0, 0, 2, 4, 2, 4, 3, 3, 4, 3, 4, 4, 8, 8, 8, 8, 6, 3, 9, 13, 14, 12, 10, 7, 4, 15, 18, 18, 14, 12, 9, 5, 5, 7, 7, 7, 3, 2, 3, 5, 9, 9, 8, 5, 1, 3, 5, 11, 11, 10, 6, 2, 3, 6, 12, 14, 14, 10, 6, 4, 8, 14, 19, 18, 15, 9, 5, 11, 17, 24, 23, 18, 11, 6, 16, 21, 25, 26, 20, 13, 7, 13, 19, 18, 12, 7, 2, 2, 13, 19, 20, 14, 9, 3, 2, 13, 19, 23, 16, 11, 6, 2, 13, 20, 25, 19, 15, 10, 6, 15, 21, 26, 25, 19, 14, 8, 17, 24, 29, 28, 21, 16, 10, 20, 26, 30, 31, 24, 17, 11, 18, 22, 26, 29, 29, 26, 23, 17, 20, 25, 28, 29, 26, 22, 15, 19, 23, 26, 28, 24, 22, 14, 17, 20, 24, 27, 25, 22, 14, 17, 20, 23, 27, 25, 22, 13, 16, 20, 23, 26, 25, 22, 13, 14, 18, 22, 25, 25, 22, 15, 19, 23, 26, 25, 22, 19, 14, 18, 22, 25, 24, 21, 18, 13, 16, 20, 23, 22, 20, 17, 13, 16, 19, 21, 22, 21, 18, 12, 15, 18, 21, 21, 21, 18, 11, 14, 17, 20, 20, 21, 18, 15, 14, 17, 19, 19, 19, 18, 13, 17, 19, 19, 21, 18, 14, 12, 15, 17, 19, 19, 17, 13, 11, 14, 16, 16, 16, 16, 12, 10, 14, 15, 15, 15, 15, 12, 10, 13, 14, 14, 14, 15, 13, 10, 11, 13, 13, 13, 13, 13, 17, 16, 12, 12, 12, 12, 12, 11, 11, 12, 12, 13, 13, 5, 11, 10, 10, 11, 11, 11, 4, 9, 9, 9, 9, 8, 8, 4, 5, 9, 8, 8, 8, 8, 6, 7, 7, 7, 7, 7, 7, 3, 10, 11, 10, 9, 6, 6, 3, 17, 18, 13, 9, 7, 5, 3, 3, 3, 4, 4, 5, 4, 5, 1, 2, 2, 3, 3, 4, 4, 1, 1, 0, 0, 0, 2, 3, 1, 4, 4, 3, 4, 3, 3, 4, 8, 8, 8, 8, 5, 3, 10, 13, 14, 12, 10, 7, 4, 15, 18, 17, 14, 12, 9, 4, 6, 7, 7, 7, 4, 3, 4, 6, 10, 8, 9, 6, 2, 3, 6, 11, 10, 10, 6, 2, 2, 6, 12, 14, 13, 10, 6, 4, 9, 15, 18, 18, 14, 9, 4, 12, 17, 24, 22, 17, 11, 6, 16, 21, 24, 25, 19, 13, 7, 14, 19, 18, 12, 7, 3, 4, 13, 19, 20, 14, 8, 3, 2, 13, 19, 22, 15, 10, 6, 2, 14, 20, 25, 19, 14, 10, 5, 15, 21, 27, 24, 19, 13, 8, 17, 24, 29, 29, 22, 15, 9, 21, 27, 30, 30, 23, 17, 11, 18, 22, 26, 29, 30, 27, 23, 17, 21, 24, 28, 30, 26, 21, 15, 19, 23, 26, 27, 24, 21, 14, 17, 21, 24, 27, 25, 22, 14, 17, 20, 23, 27, 25, 22, 14, 16, 19, 23, 26, 25, 21, 13, 15, 18, 21, 25, 25, 22, 15, 19, 23, 26, 26, 23, 20, 14, 18, 22, 25, 25, 22, 18, 13, 16, 20, 23, 23, 20, 17, 12, 15, 19, 21, 22, 21, 17, 13, 15, 18, 21, 21, 20, 17, 11, 13, 17, 19, 20, 20, 17, 15, 15, 15, 18, 18, 18, 18, 13, 16, 18, 19, 21, 19, 15, 12, 15, 18, 18, 19, 17, 13, 12, 14, 16, 16, 15, 16, 11, 11, 14, 14, 15, 15, 15, 12, 10, 13, 14, 14, 14, 14, 12, 10, 12, 13, 13, 13, 13, 12, 17, 16, 13, 12, 12, 12, 11, 12, 11, 11, 12, 13, 13, 6, 11, 9, 10, 11, 11, 11, 4, 9, 9, 9, 8, 8, 8, 4, 5, 9, 8, 8, 8, 8, 6, 7, 7, 7, 7, 7, 7, 3, 11, 12, 10, 8, 6, 5, 3, 17, 18, 13, 10, 7, 5, 3, 4, 3, 4, 4, 5, 5, 5, 1, 1, 2, 3, 3, 3, 4, 1, 1, 0, 0, 0, 1, 2, 1, 4, 4, 3, 4, 3, 3, 5, 9, 8, 8, 8, 6, 3, 10, 14, 14, 12, 10, 7, 4, 15, 18, 17, 13, 12, 9, 5, 6, 7, 7, 7, 4, 4, 5, 6, 9, 8, 8, 5, 2, 3, 6, 11, 10, 9, 6, 2, 2, 6, 13, 13, 12, 10, 6, 4, 9, 15, 18, 17, 14, 9, 5, 12, 18, 23, 21, 16, 11, 6, 16, 20, 24, 23, 18, 13, 7, 13, 15, 13, 10, 7, 3, 4, 13, 16, 15, 11, 8, 3, 1, 12, 15, 17, 11, 9, 6, 2, 12, 17, 20, 16, 13, 9, 6, 15, 19, 23, 21, 18, 13, 7, 18, 23, 26, 26, 20, 15, 9, 21, 25, 28, 28, 22, 17, 11, 17, 20, 25, 28, 28, 25, 21, 16, 19, 23, 28, 28, 24, 21, 14, 18, 21, 25, 27, 23, 20, 13, 16, 19, 22, 26, 23, 20, 13, 16, 19, 22, 26, 24, 21, 12, 15, 18, 22, 25, 24, 21, 13, 14, 17, 21, 23, 24, 21, 14, 18, 21, 25, 24, 22, 18, 13, 17, 20, 24, 23, 20, 16, 12, 16, 19, 22, 21, 19, 15, 11, 14, 17, 20, 20, 19, 16, 12, 14, 17, 20, 19, 19, 16, 9, 12, 15, 18, 18, 19, 16, 16, 14, 14, 17, 17, 17, 16, 12, 15, 17, 18, 19, 17, 13, 11, 14, 16, 17, 17, 16, 11, 11, 13, 15, 14, 15, 14, 10, 10, 13, 13, 13, 13, 13, 11, 9, 12, 12, 12, 12, 12, 11, 11, 12, 11, 11, 12, 11, 11, 17, 16, 12, 10, 10, 10, 10, 10, 10, 10, 11, 12, 12, 6, 9, 8, 9, 9, 10, 10, 4, 8, 7, 7, 7, 7, 7, 3, 5, 7, 6, 6, 6, 6, 5, 6, 6, 6, 5, 6, 5, 2, 11, 12, 10, 9, 7, 5, 3, 17, 17, 13, 10, 7, 5, 3, 2, 1, 2, 3, 4, 5, 5, 1, 0, 1, 2, 2, 3, 3, 1, 2, 2, 2, 1, 0, 2, 1, 5, 4, 4, 4, 3, 3, 5, 9, 8, 8, 8, 6, 3, 11, 14, 14, 11, 9, 7, 4, 16, 17, 17, 13, 10, 8, 5, 5, 5, 4, 3, 3, 3, 5, 5, 7, 5, 4, 3, 2, 2, 5, 7, 5, 4, 2, 2, 1, 5, 8, 8, 7, 6, 5, 4, 8, 11, 13, 11, 10, 8, 5, 12, 15, 18, 16, 11, 8, 6, 16, 18, 19, 18, 13, 9, 7, 8, 9, 7, 5, 3, 3, 3, 8, 9, 8, 6, 3, 2, 1, 8, 9, 10, 6, 4, 3, 2, 7, 10, 13, 10, 8, 6, 6, 10, 13, 17, 16, 12, 9, 7, 13, 17, 20, 19, 14, 10, 8, 17, 20, 21, 21, 16, 11, 8, 13, 16, 19, 22, 22, 20, 16, 12, 15, 18, 22, 22, 19, 15, 11, 15, 18, 20, 21, 18, 15, 10, 12, 15, 18, 21, 19, 16, 9, 12, 15, 18, 21, 20, 16, 8, 11, 14, 17, 21, 19, 16, 11, 11, 13, 16, 20, 19, 16, 11, 14, 17, 20, 18, 17, 14, 10, 13, 16, 19, 18, 15, 12, 8, 12, 15, 17, 16, 14, 12, 7, 10, 13, 16, 16, 14, 12, 7, 10, 12, 15, 15, 15, 12, 9, 10, 11, 14, 14, 14, 12, 14, 12, 11, 13, 13, 13, 12, 8, 12, 13, 14, 15, 13, 10, 7, 10, 13, 13, 13, 13, 8, 6, 9, 11, 11, 11, 10, 7, 5, 9, 9, 9, 9, 9, 7, 6, 8, 9, 9, 9, 8, 7, 12, 11, 9, 8, 7, 7, 7, 15, 13, 10, 8, 7, 6, 6, 6, 6, 7, 8, 9, 9, 5, 5, 4, 5, 6, 6, 7, 3, 3, 3, 4, 4, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 6, 7, 6, 5, 5, 4, 2, 12, 12, 9, 8, 6, 5, 3, 15, 16, 11, 9, 7, 5, 4, 4, 3, 3, 2, 3, 4, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 4, 3, 2, 2, 0, 4, 8, 5, 5, 4, 4, 3, 8, 12, 9, 9, 8, 6, 4, 11, 14, 14, 12, 10, 7, 5, 15, 17, 17, 14, 12, 9, 5, 8, 7, 6, 5, 4, 4, 4, 7, 9, 6, 6, 4, 3, 2, 8, 11, 8, 7, 5, 3, 2, 8, 11, 12, 11, 9, 6, 5, 10, 14, 17, 16, 13, 9, 5, 13, 18, 22, 20, 15, 10, 7, 16, 20, 23, 22, 17, 12, 8, 12, 15, 13, 9, 5, 4, 3, 11, 15, 16, 11, 6, 3, 2, 12, 15, 18, 12, 8, 5, 3, 12, 16, 21, 16, 12, 9, 6, 14, 19, 24, 21, 16, 12, 8, 16, 21, 26, 26, 19, 13, 9, 20, 24, 27, 27, 22, 15, 10, 15, 19, 23, 26, 26, 25, 22, 14, 18, 22, 25, 25, 23, 21, 13, 17, 20, 23, 24, 21, 19, 13, 15, 18, 20, 22, 20, 18, 12, 14, 16, 18, 21, 20, 18, 10, 12, 15, 17, 20, 20, 18, 10, 11, 13, 15, 19, 19, 18, 14, 17, 20, 23, 24, 23, 19, 13, 16, 19, 22, 24, 21, 17, 12, 14, 17, 20, 20, 19, 15, 11, 13, 16, 17, 17, 17, 15, 10, 12, 14, 16, 16, 17, 14, 8, 11, 12, 14, 14, 15, 15, 11, 11, 12, 14, 14, 14, 14, 12, 14, 16, 17, 19, 19, 15, 11, 13, 15, 16, 17, 17, 12, 10, 13, 14, 14, 14, 15, 12, 9, 12, 12, 12, 13, 13, 12, 7, 10, 12, 12, 12, 12, 12, 8, 9, 9, 10, 11, 12, 12, 12, 13, 10, 9, 10, 11, 11, 10, 10, 10, 11, 13, 14, 6, 8, 9, 9, 10, 10, 11, 5, 7, 8, 8, 8, 9, 9, 5, 4, 6, 6, 7, 7, 7, 5, 5, 5, 6, 6, 6, 7, 5, 8, 8, 7, 6, 5, 5, 4, 12, 12, 8, 6, 5, 4, 2, 2, 2, 2, 2, 3, 4, 6, 0, 1, 1, 2, 1, 2, 5, 0, 1, 1, 1, 1, 1, 5, 0, 2, 2, 1, 2, 1, 4, 2, 4, 4, 3, 4, 2, 2, 5, 7, 7, 6, 5, 3, 2, 9, 10, 10, 7, 6, 4, 2, 4, 5, 4, 5, 3, 2, 5, 4, 6, 6, 5, 3, 1, 3, 4, 7, 7, 6, 4, 1, 2, 4, 7, 8, 7, 5, 3, 2, 4, 8, 11, 9, 7, 4, 2, 6, 10, 14, 12, 9, 6, 2, 9, 12, 14, 13, 10, 7, 3, 9, 12, 11, 7, 5, 2, 2, 9, 12, 13, 8, 5, 2, 1, 9, 12, 14, 9, 6, 3, 1, 9, 12, 15, 10, 7, 5, 2, 8, 12, 15, 13, 9, 7, 4, 10, 14, 17, 16, 11, 8, 5, 12, 15, 17, 17, 13, 9, 6, 21, 24, 26, 29, 28, 27, 25, 21, 23, 26, 28, 29, 26, 23, 19, 22, 25, 26, 27, 25, 23, 18, 21, 23, 26, 27, 24, 21, 16, 19, 21, 23, 25, 23, 22, 15, 19, 21, 22, 24, 23, 21, 12, 15, 19, 22, 24, 23, 22, 20, 23, 25, 27, 26, 24, 22, 18, 21, 24, 26, 26, 23, 21, 17, 20, 23, 25, 23, 23, 20, 16, 18, 21, 23, 22, 21, 19, 14, 17, 19, 22, 21, 21, 19, 12, 15, 18, 20, 21, 20, 19, 12, 12, 17, 19, 20, 19, 20, 17, 21, 22, 22, 22, 21, 18, 15, 20, 21, 22, 21, 20, 17, 14, 18, 20, 20, 20, 20, 17, 12, 16, 17, 17, 18, 18, 16, 11, 14, 16, 16, 17, 17, 16, 8, 12, 14, 14, 16, 16, 16, 13, 13, 11, 13, 15, 15, 15, 14, 15, 16, 16, 17, 17, 8, 13, 13, 14, 15, 15, 15, 8, 10, 12, 13, 13, 13, 14, 8, 7, 10, 10, 10, 10, 11, 9, 7, 8, 9, 9, 9, 10, 6, 8, 8, 7, 7, 7, 8, 6, 13, 14, 10, 7, 6, 6, 5, 6, 6, 7, 8, 8, 6, 8, 2, 5, 6, 6, 6, 6, 8, 2, 3, 4, 4, 4, 5, 9, 2, 0, 0, 0, 0, 2, 6, 3, 5, 4, 5, 5, 3, 5, 5, 9, 9, 8, 6, 4, 3, 11, 12, 11, 8, 6, 5, 2, 4, 6, 6, 6, 3, 5, 7, 4, 7, 7, 7, 4, 5, 6, 4, 8, 8, 8, 6, 3, 6, 4, 8, 8, 7, 5, 3, 3, 4, 8, 9, 8, 7, 5, 2, 7, 9, 12, 11, 8, 6, 3, 11, 12, 13, 12, 9, 6, 4, 9, 12, 11, 9, 6, 3, 6, 9, 12, 13, 9, 7, 3, 5, 9, 13, 15, 10, 7, 4, 3, 10, 12, 15, 9, 7, 6, 3, 8, 11, 14, 12, 8, 6, 5, 9, 13, 15, 14, 10, 7, 6, 11, 14, 16, 16, 12, 8, 6, 22, 26, 28, 31, 31, 29, 26, 21, 24, 28, 31, 31, 28, 25, 19, 23, 26, 29, 29, 27, 23, 18, 20, 24, 27, 29, 26, 22, 15, 18, 21, 24, 27, 25, 22, 14, 16, 20, 23, 27, 25, 22, 12, 15, 18, 22, 25, 25, 22, 19, 23, 26, 30, 27, 26, 22, 18, 21, 25, 28, 28, 24, 22, 16, 20, 24, 27, 25, 24, 20, 15, 18, 21, 23, 23, 21, 19, 13, 16, 19, 22, 22, 21, 19, 11, 15, 17, 21, 21, 21, 19, 12, 12, 16, 19, 20, 20, 19, 16, 20, 22, 23, 24, 22, 18, 15, 18, 21, 22, 22, 21, 17, 14, 17, 20, 20, 20, 20, 15, 13, 15, 16, 16, 17, 17, 14, 10, 13, 15, 15, 15, 16, 14, 8, 12, 13, 14, 14, 14, 14, 13, 13, 12, 12, 13, 13, 13, 13, 14, 15, 16, 17, 17, 9, 12, 13, 14, 15, 15, 15, 8, 9, 11, 12, 13, 12, 13, 8, 6, 9, 9, 9, 9, 9, 7, 6, 8, 8, 8, 8, 8, 4, 8, 8, 7, 6, 6, 7, 4, 13, 15, 10, 7, 5, 5, 3, 5, 6, 7, 8, 8, 7, 8, 2, 5, 5, 6, 7, 6, 8, 2, 3, 3, 4, 4, 4, 5, 2, 0, 0, 0, 0, 2, 4, 3, 5, 5, 4, 5, 3, 3, 6, 10, 11, 9, 7, 4, 2, 12, 15, 14, 11, 9, 6, 2, 4, 6, 7, 7, 4, 6, 7, 4, 8, 8, 9, 5, 5, 6, 4, 10, 10, 10, 6, 2, 4, 4, 10, 11, 11, 7, 3, 2, 5, 11, 15, 15, 12, 6, 2, 8, 14, 20, 19, 14, 8, 3, 13, 17, 21, 21, 16, 10, 4, 12, 19, 18, 12, 7, 5, 6, 13, 19, 21, 14, 8, 3, 5, 13, 19, 23, 15, 10, 4, 2, 13, 18, 23, 17, 11, 7, 3, 12, 18, 23, 21, 16, 10, 4, 14, 20, 25, 24, 19, 12, 6, 17, 23, 25, 25, 20, 14, 8, 22, 26, 29, 32, 33, 30, 26, 20, 24, 28, 33, 33, 29, 26, 19, 23, 27, 30, 31, 28, 23, 18, 20, 24, 27, 30, 26, 23, 15, 18, 21, 24, 28, 26, 23, 14, 17, 19, 23, 27, 26, 22, 12, 15, 18, 22, 26, 25, 22, 19, 23, 27, 29, 29, 27, 23, 18, 21, 26, 29, 29, 25, 22, 16, 20, 24, 27, 26, 24, 20, 15, 18, 21, 24, 23, 22, 19, 13, 16, 19, 21, 22, 21, 19, 12, 15, 18, 20, 21, 21, 18, 12, 12, 17, 19, 20, 19, 19, 16, 20, 22, 23, 24, 22, 19, 15, 18, 20, 22, 23, 22, 17, 13, 17, 19, 19, 20, 19, 15, 13, 15, 15, 16, 16, 17, 13, 10, 13, 15, 15, 14, 15, 13, 8, 12, 13, 14, 14, 13, 13, 13, 13, 12, 12, 13, 13, 12, 14, 14, 15, 16, 17, 18, 10, 13, 13, 14, 15, 15, 15, 8, 10, 11, 12, 12, 12, 12, 7, 6, 10, 9, 9, 9, 9, 7, 6, 8, 8, 8, 7, 7, 4, 8, 8, 7, 6, 6, 6, 3, 13, 14, 9, 6, 5, 5, 2, 6, 6, 7, 8, 9, 8, 9, 1, 5, 6, 6, 7, 6, 8, 1, 3, 3, 3, 4, 4, 5, 1, 0, 0, 0, 0, 2, 3, 3, 5, 4, 4, 4, 2, 2, 6, 10, 11, 9, 6, 3, 2, 12, 15, 14, 10, 9, 5, 2, 4, 6, 7, 7, 5, 7, 8, 4, 8, 8, 8, 5, 5, 6, 4, 10, 10, 9, 5, 2, 3, 4, 9, 11, 10, 6, 2, 2, 5, 11, 15, 14, 11, 5, 2, 8, 14, 20, 18, 13, 7, 2, 12, 17, 21, 21, 15, 10, 4, 13, 19, 17, 12, 7, 5, 7, 13, 18, 20, 13, 8, 3, 4, 13, 19, 21, 14, 9, 4, 1, 13, 17, 22, 16, 10, 6, 2, 12, 17, 24, 21, 15, 9, 4, 14, 20, 25, 25, 18, 11, 6, 17, 22, 26, 26, 20, 14, 8, 22, 26, 30, 34, 33, 30, 28, 21, 24, 29, 33, 33, 30, 26, 19, 23, 27, 31, 32, 28, 24, 18, 20, 24, 28, 30, 27, 23, 15, 18, 21, 25, 29, 26, 23, 14, 17, 20, 23, 27, 27, 23, 12, 15, 19, 23, 26, 26, 22, 19, 23, 28, 30, 29, 26, 24, 18, 21, 25, 29, 30, 26, 22, 17, 20, 24, 27, 27, 23, 20, 15, 18, 21, 23, 24, 22, 18, 14, 16, 19, 22, 22, 22, 18, 12, 15, 17, 20, 20, 21, 19, 12, 13, 17, 20, 19, 20, 18, 17, 20, 22, 23, 24, 23, 18, 15, 19, 21, 22, 23, 21, 17, 15, 17, 20, 19, 20, 19, 15, 13, 16, 16, 17, 17, 16, 13, 10, 14, 15, 15, 15, 15, 13, 9, 12, 14, 14, 14, 14, 13, 12, 12, 12, 12, 13, 13, 12, 15, 15, 15, 16, 17, 18, 10, 13, 13, 14, 15, 15, 15, 8, 10, 12, 12, 12, 12, 12, 7, 6, 10, 9, 9, 9, 9, 7, 6, 8, 8, 8, 7, 8, 4, 8, 8, 7, 7, 6, 6, 3, 12, 12, 9, 6, 5, 5, 2, 6, 6, 7, 8, 9, 8, 10, 2, 5, 6, 7, 7, 6, 8, 1, 4, 4, 4, 4, 4, 4, 1, 0, 0, 0, 0, 1, 3, 3, 5, 4, 4, 4, 2, 2, 6, 10, 10, 8, 6, 3, 2, 11, 13, 13, 10, 8, 5, 1, 5, 7, 7, 7, 5, 7, 8, 5, 9, 8, 8, 5, 5, 6, 5, 10, 9, 8, 5, 2, 3, 5, 10, 10, 9, 6, 2, 2, 5, 11, 14, 13, 10, 5, 1, 8, 14, 19, 17, 12, 7, 2, 12, 16, 20, 20, 14, 9, 3, 12, 15, 13, 10, 6, 6, 7, 12, 15, 15, 11, 7, 4, 4, 12, 15, 16, 11, 8, 3, 2, 12, 15, 17, 13, 10, 6, 2, 11, 16, 19, 17, 14, 9, 4, 14, 19, 23, 23, 16, 11, 5, 16, 21, 24, 23, 19, 13, 7, 21, 24, 28, 32, 33, 29, 25, 19, 23, 27, 31, 32, 28, 25, 18, 21, 25, 29, 30, 27, 23, 17, 20, 22, 25, 28, 25, 21, 14, 17, 20, 23, 27, 24, 21, 13, 16, 18, 22, 26, 25, 21, 11, 14, 17, 21, 24, 24, 21, 17, 22, 25, 29, 28, 26, 23, 17, 20, 24, 28, 28, 24, 20, 15, 19, 22, 26, 26, 23, 18, 14, 16, 20, 22, 22, 21, 17, 12, 15, 18, 20, 20, 20, 17, 10, 13, 16, 19, 19, 19, 17, 10, 12, 15, 18, 18, 18, 17, 16, 19, 21, 21, 24, 21, 17, 14, 17, 20, 21, 21, 20, 15, 13, 16, 18, 18, 18, 18, 14, 12, 14, 15, 15, 15, 15, 11, 10, 13, 14, 13, 13, 13, 12, 8, 11, 12, 12, 12, 12, 11, 10, 10, 10, 11, 11, 11, 11, 13, 13, 14, 15, 16, 17, 9, 11, 12, 13, 14, 14, 14, 7, 9, 11, 10, 11, 10, 10, 6, 5, 9, 8, 7, 7, 7, 6, 5, 6, 6, 6, 6, 6, 3, 8, 7, 6, 5, 4, 5, 3, 10, 10, 7, 5, 4, 3, 2, 5, 5, 6, 7, 8, 8, 9, 1, 4, 5, 5, 6, 6, 7, 1, 2, 3, 3, 3, 3, 4, 1, 2, 2, 2, 1, 0, 2, 2, 6, 5, 4, 4, 2, 2, 6, 9, 9, 7, 5, 3, 1, 9, 11, 10, 7, 6, 4, 2, 5, 4, 4, 4, 5, 7, 8, 5, 6, 4, 4, 4, 4, 6, 5, 8, 5, 4, 2, 2, 3, 5, 7, 7, 4, 3, 2, 1, 5, 8, 10, 8, 6, 4, 2, 8, 11, 13, 10, 7, 5, 3, 10, 12, 13, 12, 8, 6, 3, 9, 11, 8, 5, 5, 6, 6, 9, 11, 9, 5, 4, 4, 4, 9, 11, 11, 6, 4, 2, 1, 8, 11, 11, 7, 5, 3, 2, 8, 10, 13, 11, 8, 5, 4, 10, 13, 15, 14, 9, 7, 4, 11, 14, 15, 15, 11, 7, 5, 17, 21, 24, 28, 27, 25, 22, 16, 20, 24, 27, 27, 23, 20, 14, 18, 21, 24, 26, 23, 18, 13, 16, 19, 22, 25, 20, 17, 10, 13, 15, 19, 22, 20, 17, 9, 11, 14, 18, 22, 21, 17, 7, 10, 14, 16, 20, 20, 17, 14, 18, 21, 25, 24, 22, 18, 13, 17, 21, 24, 23, 20, 16, 12, 15, 20, 21, 21, 19, 14, 11, 13, 16, 19, 18, 17, 13, 8, 11, 13, 16, 16, 16, 13, 7, 9, 12, 15, 15, 15, 12, 6, 8, 12, 14, 13, 14, 13, 12, 16, 17, 18, 19, 18, 14, 10, 14, 16, 17, 17, 16, 12, 9, 13, 15, 14, 14, 14, 10, 9, 11, 11, 11, 11, 11, 8, 5, 8, 9, 9, 9, 9, 8, 5, 7, 8, 8, 8, 8, 8, 6, 6, 7, 6, 7, 7, 6, 10, 10, 10, 11, 12, 13, 9, 8, 8, 9, 10, 10, 10, 6, 6, 7, 7, 7, 7, 7, 4, 3, 4, 4, 3, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 5, 5, 3, 3, 2, 1, 0, 6, 7, 4, 3, 2, 2, 1, 2, 3, 4, 5, 6, 8, 8, 4, 3, 4, 5, 5, 5, 6, 4, 5, 4, 3, 3, 3, 3, 4, 6, 4, 3, 3, 2, 0, 4, 6, 5, 4, 4, 2, 1, 6, 7, 8, 7, 5, 3, 2, 7, 9, 11, 8, 7, 5, 2, 7, 6, 5, 5, 5, 7, 7, 7, 8, 6, 6, 4, 4, 5, 7, 8, 7, 7, 4, 2, 2, 7, 8, 8, 8, 5, 3, 2, 6, 9, 12, 11, 8, 5, 2, 7, 11, 16, 15, 10, 6, 3, 9, 13, 17, 17, 12, 7, 3, 10, 14, 13, 8, 5, 6, 6, 10, 14, 15, 10, 6, 3, 3, 10, 14, 17, 10, 6, 3, 2, 10, 13, 17, 12, 8, 5, 2, 10, 14, 19, 16, 11, 8, 4, 12, 16, 21, 20, 14, 9, 5, 14, 18, 22, 22, 16, 11, 6, 19, 22, 24, 28, 28, 25, 22, 18, 21, 23, 26, 28, 25, 22, 17, 20, 22, 24, 26, 23, 20, 16, 18, 20, 22, 24, 21, 17, 13, 15, 17, 18, 21, 19, 16, 11, 12, 14, 16, 19, 18, 16, 8, 10, 12, 15, 17, 18, 16, 17, 20, 23, 25, 25, 23, 20, 17, 19, 22, 24, 24, 22, 19, 15, 18, 21, 22, 22, 20, 18, 14, 16, 18, 19, 19, 18, 14, 10, 13, 14, 15, 15, 15, 14, 8, 10, 12, 14, 14, 15, 14, 9, 9, 11, 12, 13, 13, 14, 15, 18, 19, 20, 20, 20, 16, 13, 17, 18, 19, 19, 18, 16, 12, 16, 17, 17, 17, 17, 15, 11, 14, 15, 15, 15, 15, 13, 7, 10, 12, 11, 12, 12, 13, 5, 8, 9, 10, 11, 12, 12, 10, 10, 8, 8, 10, 11, 11, 12, 14, 14, 15, 15, 16, 9, 11, 12, 13, 13, 13, 14, 9, 9, 10, 11, 11, 12, 12, 9, 6, 8, 8, 9, 9, 9, 7, 4, 5, 5, 5, 6, 6, 6, 5, 6, 5, 4, 4, 5, 5, 10, 10, 6, 4, 3, 3, 3, 4, 5, 6, 7, 7, 8, 9, 2, 4, 5, 6, 6, 7, 9, 2, 3, 4, 4, 4, 5, 8, 2, 3, 3, 3, 3, 2, 4, 0, 3, 2, 2, 2, 1, 3, 3, 4, 5, 4, 3, 1, 1, 7, 7, 7, 5, 4, 3, 1, 5, 6, 6, 7, 5, 6, 8, 5, 7, 7, 7, 5, 5, 7, 5, 8, 8, 8, 6, 4, 6, 5, 7, 8, 7, 5, 2, 1, 3, 6, 9, 8, 5, 2, 1, 4, 8, 11, 10, 7, 4, 1, 6, 10, 12, 11, 8, 5, 2, 10, 13, 13, 9, 6, 5, 6, 10, 14, 14, 10, 7, 5, 6, 10, 14, 15, 10, 7, 5, 3, 10, 13, 15, 10, 7, 4, 1, 9, 11, 14, 12, 8, 5, 2, 8, 12, 15, 14, 9, 6, 3, 10, 13, 15, 15, 11, 7, 4, 27, 29, 32, 35, 35, 32, 30, 25, 29, 31, 34, 34, 31, 28, 25, 27, 31, 32, 33, 30, 26, 22, 26, 28, 30, 32, 28, 24, 20, 23, 25, 26, 28, 26, 23, 16, 19, 21, 24, 26, 25, 23, 13, 17, 21, 23, 26, 26, 23, 24, 28, 31, 33, 32, 29, 28, 23, 26, 29, 32, 32, 29, 26, 21, 25, 28, 30, 30, 28, 25, 20, 23, 26, 28, 26, 25, 21, 16, 20, 22, 24, 24, 22, 21, 14, 17, 20, 21, 22, 22, 21, 10, 13, 18, 21, 21, 21, 21, 21, 25, 28, 28, 28, 27, 24, 20, 24, 26, 27, 27, 27, 23, 18, 22, 24, 25, 26, 25, 22, 16, 20, 21, 22, 22, 23, 18, 11, 16, 17, 18, 18, 18, 18, 7, 13, 16, 16, 16, 17, 18, 9, 10, 13, 15, 15, 16, 17, 18, 19, 21, 22, 22, 22, 15, 16, 18, 20, 20, 20, 21, 14, 13, 16, 17, 18, 18, 18, 14, 9, 14, 14, 14, 15, 15, 12, 7, 10, 10, 10, 10, 11, 8, 7, 7, 7, 8, 9, 9, 6, 9, 9, 6, 6, 7, 8, 7, 9, 11, 12, 14, 14, 13, 14, 4, 9, 11, 12, 12, 11, 14, 4, 7, 8, 8, 9, 9, 12, 4, 5, 5, 5, 5, 6, 6, 3, 0, 0, 0, 0, 3, 6, 3, 3, 3, 2, 1, 1, 6, 6, 6, 5, 2, 2, 2, 5, 4, 5, 6, 6, 9, 12, 13, 4, 5, 6, 6, 8, 10, 11, 4, 6, 6, 6, 5, 7, 9, 4, 5, 5, 5, 3, 3, 6, 2, 3, 5, 4, 2, 2, 4, 2, 4, 7, 6, 3, 2, 2, 5, 5, 8, 7, 4, 2, 1, 7, 10, 9, 7, 7, 10, 12, 7, 10, 11, 8, 6, 8, 10, 7, 10, 12, 7, 5, 5, 6, 7, 9, 12, 7, 4, 2, 2, 5, 8, 10, 7, 4, 2, 1, 4, 7, 10, 9, 5, 2, 1, 5, 9, 11, 11, 7, 3, 2, 27, 30, 34, 37, 37, 34, 32, 25, 29, 32, 36, 36, 34, 29, 23, 27, 32, 34, 35, 32, 28, 22, 25, 28, 31, 33, 29, 24, 19, 22, 25, 27, 30, 28, 24, 16, 19, 21, 24, 29, 27, 24, 13, 17, 20, 24, 27, 27, 24, 24, 27, 31, 34, 33, 31, 28, 22, 26, 30, 33, 33, 31, 27, 20, 24, 29, 31, 30, 29, 25, 19, 22, 25, 28, 28, 27, 22, 16, 18, 22, 25, 24, 23, 21, 13, 16, 19, 23, 22, 23, 21, 10, 14, 18, 21, 21, 21, 21, 21, 24, 27, 29, 29, 28, 23, 19, 23, 26, 27, 28, 26, 22, 18, 21, 24, 24, 25, 24, 20, 16, 20, 20, 20, 21, 22, 17, 10, 16, 17, 17, 17, 18, 16, 7, 13, 15, 16, 16, 16, 16, 8, 11, 13, 13, 15, 15, 15, 18, 19, 20, 21, 22, 23, 15, 15, 17, 19, 20, 19, 19, 14, 12, 16, 17, 17, 17, 17, 13, 8, 13, 13, 13, 14, 14, 11, 6, 9, 9, 9, 9, 9, 8, 6, 7, 7, 8, 8, 8, 5, 8, 9, 5, 6, 6, 7, 5, 8, 10, 12, 13, 13, 13, 15, 3, 9, 10, 11, 11, 11, 14, 3, 8, 8, 8, 8, 8, 9, 3, 5, 4, 4, 4, 5, 5, 2, 0, 0, 0, 0, 2, 4, 3, 5, 6, 5, 3, 1, 4, 7, 10, 10, 6, 5, 2, 4, 4, 5, 6, 7, 9, 11, 13, 4, 7, 7, 7, 8, 9, 11, 4, 9, 9, 8, 5, 7, 8, 4, 8, 10, 10, 5, 3, 4, 2, 7, 12, 12, 7, 2, 3, 3, 9, 15, 15, 10, 4, 2, 8, 12, 16, 16, 12, 6, 1, 11, 17, 16, 11, 7, 10, 12, 11, 18, 19, 13, 7, 8, 9, 11, 17, 21, 14, 8, 4, 6, 11, 17, 21, 15, 9, 4, 2, 10, 16, 21, 17, 12, 6, 1, 10, 16, 20, 19, 14, 8, 2, 13, 18, 20, 20, 16, 10, 4, 27, 30, 33, 37, 36, 35, 31, 25, 29, 32, 36, 37, 35, 30, 23, 27, 31, 35, 35, 32, 28, 22, 25, 29, 31, 34, 30, 24, 19, 22, 24, 27, 31, 28, 25, 16, 18, 21, 25, 29, 28, 25, 13, 16, 20, 23, 27, 27, 25, 23, 28, 30, 34, 33, 31, 29, 22, 26, 30, 33, 34, 29, 26, 20, 24, 28, 30, 31, 28, 23, 19, 22, 24, 27, 28, 26, 20, 17, 19, 21, 24, 24, 23, 20, 14, 16, 19, 22, 21, 22, 20, 10, 14, 18, 20, 21, 21, 21, 20, 24, 26, 27, 29, 27, 23, 19, 22, 25, 26, 26, 25, 21, 18, 21, 23, 24, 24, 24, 19, 15, 20, 20, 20, 21, 20, 16, 10, 16, 16, 17, 16, 16, 16, 7, 14, 14, 15, 15, 15, 16, 8, 11, 13, 14, 14, 14, 14, 18, 18, 19, 20, 22, 22, 15, 15, 17, 18, 19, 20, 20, 13, 11, 16, 16, 16, 16, 16, 12, 8, 14, 12, 13, 13, 13, 11, 6, 10, 9, 9, 9, 9, 7, 6, 7, 7, 7, 7, 8, 4, 8, 8, 5, 6, 6, 6, 4, 7, 10, 12, 13, 13, 13, 14, 3, 9, 10, 11, 11, 10, 13, 3, 8, 8, 8, 8, 8, 9, 3, 5, 4, 4, 4, 4, 4, 2, 0, 0, 0, 0, 2, 3, 3, 5, 6, 4, 2, 1, 3, 6, 9, 9, 6, 4, 2, 2, 4, 5, 6, 7, 9, 12, 13, 4, 7, 7, 7, 8, 9, 10, 4, 8, 9, 8, 5, 6, 7, 4, 8, 9, 9, 5, 3, 3, 2, 7, 11, 11, 7, 2, 3, 3, 9, 15, 15, 9, 3, 2, 7, 12, 17, 17, 11, 5, 1, 11, 17, 16, 11, 7, 10, 11, 11, 17, 19, 12, 7, 8, 9, 11, 17, 20, 14, 8, 4, 5, 11, 17, 21, 14, 9, 3, 2, 10, 15, 21, 17, 11, 5, 1, 10, 16, 21, 21, 14, 7, 2, 12, 18, 22, 22, 16, 10, 4, 26, 30, 33, 39, 37, 35, 31, 25, 29, 32, 37, 37, 33, 30, 23, 26, 32, 34, 36, 32, 28, 22, 24, 28, 31, 33, 30, 25, 19, 21, 25, 27, 30, 28, 25, 16, 19, 21, 25, 28, 28, 25, 14, 17, 20, 24, 27, 28, 25, 23, 28, 30, 34, 34, 31, 27, 22, 26, 29, 32, 33, 30, 26, 21, 24, 28, 30, 31, 28, 24, 20, 22, 25, 28, 29, 26, 20, 17, 19, 21, 23, 24, 23, 20, 14, 16, 19, 21, 22, 23, 20, 12, 15, 18, 21, 21, 21, 20, 21, 24, 27, 27, 29, 27, 23, 19, 23, 26, 26, 26, 25, 21, 18, 22, 23, 23, 24, 24, 19, 15, 20, 20, 20, 20, 20, 15, 10, 16, 17, 17, 17, 16, 15, 7, 14, 15, 15, 15, 15, 14, 7, 12, 14, 14, 14, 14, 14, 18, 19, 20, 20, 22, 21, 15, 15, 17, 18, 20, 20, 19, 13, 12, 16, 16, 16, 16, 16, 12, 8, 14, 13, 12, 13, 13, 11, 6, 10, 9, 9, 9, 9, 7, 6, 8, 8, 7, 7, 8, 4, 7, 5, 6, 6, 6, 6, 4, 7, 11, 12, 12, 13, 13, 15, 4, 9, 10, 11, 11, 10, 13, 4, 8, 8, 8, 8, 8, 8, 4, 5, 5, 4, 4, 4, 4, 2, 0, 0, 0, 0, 2, 3, 3, 4, 4, 3, 2, 2, 3, 4, 5, 5, 4, 4, 2, 2, 4, 5, 6, 7, 9, 11, 13, 4, 7, 7, 7, 8, 9, 10, 4, 9, 8, 7, 5, 6, 7, 4, 8, 9, 8, 5, 3, 3, 2, 7, 11, 9, 6, 2, 2, 3, 9, 14, 12, 8, 3, 2, 4, 9, 14, 14, 10, 5, 1, 10, 14, 12, 9, 8, 10, 11, 10, 14, 14, 10, 7, 8, 8, 10, 14, 15, 10, 7, 4, 5, 10, 13, 15, 11, 8, 3, 2, 10, 13, 16, 14, 10, 5, 1, 10, 15, 18, 17, 12, 7, 2, 11, 15, 18, 18, 13, 9, 3, 24, 27, 31, 35, 36, 33, 29, 22, 26, 30, 34, 36, 32, 28, 21, 25, 28, 32, 33, 29, 25, 19, 22, 26, 29, 31, 27, 23, 17, 19, 21, 25, 29, 26, 23, 15, 17, 19, 23, 27, 26, 22, 13, 16, 19, 22, 26, 26, 23, 21, 25, 28, 32, 31, 28, 25, 20, 22, 27, 31, 31, 28, 23, 19, 22, 26, 28, 28, 25, 21, 17, 20, 23, 25, 25, 23, 18, 15, 17, 19, 22, 22, 21, 18, 13, 15, 17, 20, 20, 21, 19, 10, 14, 17, 19, 19, 19, 18, 19, 22, 23, 25, 27, 24, 20, 18, 21, 23, 24, 24, 23, 18, 17, 19, 21, 22, 21, 20, 16, 15, 17, 18, 18, 18, 18, 13, 10, 14, 15, 14, 14, 15, 13, 6, 13, 14, 13, 13, 13, 13, 6, 12, 12, 12, 12, 12, 12, 17, 17, 17, 18, 19, 19, 13, 14, 15, 16, 16, 17, 17, 10, 11, 14, 14, 14, 14, 13, 9, 7, 12, 11, 10, 10, 10, 9, 5, 8, 8, 7, 7, 7, 5, 5, 6, 6, 6, 6, 6, 3, 6, 4, 4, 4, 4, 4, 3, 7, 8, 9, 10, 11, 11, 13, 2, 7, 8, 8, 9, 8, 10, 2, 6, 6, 5, 6, 6, 6, 2, 3, 3, 2, 2, 3, 3, 1, 3, 2, 2, 2, 0, 2, 2, 5, 5, 4, 2, 1, 2, 3, 6, 7, 4, 3, 2, 2, 3, 4, 5, 7, 8, 10, 11, 3, 4, 5, 6, 7, 7, 8, 3, 6, 5, 4, 4, 4, 5, 3, 5, 5, 3, 2, 1, 2, 3, 7, 7, 5, 4, 2, 1, 5, 7, 10, 7, 4, 3, 0, 6, 8, 10, 8, 5, 3, 1, 6, 8, 7, 5, 7, 8, 9, 6, 8, 7, 6, 6, 6, 6, 6, 8, 9, 5, 3, 3, 3, 6, 8, 10, 7, 4, 2, 0, 7, 10, 11, 8, 5, 3, 2, 8, 10, 11, 10, 6, 4, 2, 9, 10, 11, 11, 7, 4, 3, 19, 22, 26, 30, 30, 27, 23, 17, 21, 25, 29, 29, 25, 22, 16, 20, 23, 26, 28, 24, 20, 15, 17, 21, 24, 26, 23, 18, 12, 14, 17, 20, 24, 22, 18, 10, 13, 16, 19, 22, 22, 18, 8, 11, 15, 18, 20, 21, 18, 16, 20, 23, 27, 25, 23, 20, 15, 18, 22, 26, 26, 22, 18, 14, 17, 21, 23, 23, 20, 16, 12, 15, 18, 21, 20, 19, 14, 9, 12, 15, 17, 17, 17, 14, 8, 11, 14, 16, 16, 16, 14, 6, 9, 13, 15, 14, 15, 14, 14, 17, 19, 19, 21, 20, 15, 12, 15, 17, 18, 19, 18, 13, 11, 14, 16, 16, 16, 16, 11, 10, 12, 13, 12, 13, 13, 9, 6, 9, 10, 10, 10, 10, 9, 5, 8, 9, 9, 9, 9, 9, 6, 7, 8, 8, 8, 8, 8, 11, 11, 12, 13, 14, 15, 9, 10, 10, 10, 11, 11, 12, 7, 8, 9, 9, 9, 8, 8, 5, 4, 6, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 2, 2, 4, 3, 2, 2, 2, 2, 1, 6, 7, 4, 3, 2, 1, 0, 3, 3, 5, 6, 7, 8, 9, 2, 3, 4, 5, 6, 6, 7, 2, 3, 3, 3, 3, 3, 4, 2, 5, 3, 2, 2, 2, 1, 3, 6, 4, 3, 3, 2, 0, 4, 7, 6, 4, 3, 2, 2, 6, 8, 8, 6, 4, 3, 2, 6, 6, 5, 5, 6, 7, 8, 6, 7, 5, 5, 5, 5, 5, 6, 8, 6, 4, 3, 2, 2, 6, 8, 6, 5, 4, 3, 1, 6, 7, 9, 8, 5, 3, 2, 7, 9, 13, 11, 7, 4, 2, 8, 10, 14, 13, 9, 5, 3, 8, 11, 9, 6, 5, 7, 7, 8, 11, 11, 7, 4, 4, 4, 8, 11, 13, 7, 4, 3, 2, 8, 10, 14, 8, 5, 3, 2, 8, 11, 15, 13, 8, 5, 3, 9, 13, 17, 17, 10, 6, 3, 11, 15, 18, 18, 12, 7, 4, 23, 25, 27, 31, 31, 29, 25, 23, 24, 26, 29, 30, 27, 25, 21, 24, 27, 27, 28, 25, 22, 20, 21, 24, 25, 26, 22, 16, 17, 19, 20, 21, 20, 18, 16, 12, 14, 16, 16, 18, 18, 16, 8, 11, 14, 16, 18, 18, 16, 21, 24, 25, 28, 27, 26, 24, 20, 23, 25, 27, 27, 24, 23, 18, 22, 25, 24, 25, 22, 20, 17, 20, 22, 22, 21, 20, 15, 14, 16, 18, 19, 16, 15, 14, 9, 12, 14, 15, 14, 15, 15, 6, 8, 12, 14, 14, 15, 15, 19, 22, 23, 24, 24, 24, 21, 16, 20, 22, 23, 24, 23, 21, 15, 19, 21, 22, 22, 21, 19, 14, 17, 18, 18, 18, 19, 14, 9, 13, 14, 15, 14, 14, 13, 4, 9, 10, 11, 12, 13, 13, 7, 7, 8, 10, 11, 12, 13, 15, 17, 18, 20, 20, 21, 16, 14, 15, 16, 18, 18, 18, 14, 11, 13, 15, 15, 15, 15, 12, 7, 11, 11, 11, 12, 11, 10, 5, 7, 7, 7, 6, 7, 6, 3, 3, 3, 3, 5, 6, 6, 6, 6, 4, 2, 3, 4, 5, 8, 10, 11, 13, 14, 15, 16, 5, 9, 10, 12, 12, 13, 15, 5, 8, 9, 9, 10, 10, 11, 5, 6, 6, 6, 6, 6, 5, 3, 3, 3, 3, 3, 2, 4, 0, 3, 3, 2, 2, 2, 5, 4, 4, 5, 3, 3, 3, 3, 7, 8, 8, 9, 11, 14, 15, 7, 9, 8, 9, 9, 11, 13, 7, 9, 9, 9, 7, 8, 10, 7, 8, 8, 8, 6, 5, 5, 5, 7, 9, 7, 5, 3, 2, 3, 5, 10, 8, 6, 3, 2, 4, 7, 10, 10, 7, 4, 2, 10, 13, 13, 10, 9, 12, 13, 10, 14, 14, 11, 9, 9, 11, 10, 13, 16, 11, 8, 7, 8, 10, 13, 15, 10, 8, 6, 2, 9, 11, 14, 11, 7, 4, 2, 7, 10, 13, 12, 8, 5, 3, 7, 11, 13, 13, 9, 6, 3, 30, 34, 36, 38, 39, 38, 34, 29, 33, 36, 38, 38, 35, 33, 27, 31, 33, 36, 37, 34, 30, 26, 29, 31, 35, 35, 30, 24, 23, 26, 27, 30, 29, 27, 24, 18, 22, 23, 25, 27, 26, 24, 14, 18, 21, 24, 26, 26, 24, 27, 31, 35, 37, 36, 35, 31, 25, 30, 33, 36, 36, 33, 29, 24, 28, 31, 34, 34, 31, 28, 23, 26, 30, 32, 29, 28, 22, 19, 23, 25, 27, 25, 24, 22, 15, 18, 20, 22, 23, 24, 22, 11, 15, 19, 22, 22, 22, 22, 24, 29, 30, 32, 33, 32, 28, 22, 26, 30, 31, 30, 31, 26, 22, 25, 28, 28, 28, 28, 23, 19, 23, 24, 25, 25, 25, 18, 13, 19, 21, 21, 19, 19, 19, 7, 15, 16, 16, 18, 18, 19, 7, 11, 14, 15, 16, 17, 17, 21, 23, 24, 26, 27, 27, 21, 18, 21, 22, 24, 24, 24, 19, 14, 20, 20, 21, 21, 21, 17, 11, 17, 17, 17, 17, 17, 15, 9, 12, 12, 13, 12, 12, 11, 6, 8, 8, 9, 9, 10, 8, 7, 5, 6, 7, 8, 8, 8, 11, 14, 16, 17, 18, 19, 20, 7, 13, 14, 16, 17, 16, 19, 7, 13, 13, 13, 14, 14, 15, 7, 9, 10, 9, 9, 9, 8, 5, 3, 5, 5, 4, 5, 7, 3, 0, 2, 2, 1, 3, 7, 3, 3, 3, 2, 2, 2, 5, 7, 9, 10, 12, 15, 18, 20, 7, 7, 9, 11, 13, 16, 16, 7, 8, 8, 8, 10, 12, 12, 7, 7, 7, 7, 6, 7, 6, 5, 5, 6, 5, 3, 2, 5, 2, 3, 5, 4, 3, 2, 4, 3, 5, 6, 6, 4, 2, 3, 9, 11, 11, 9, 12, 16, 17, 9, 11, 12, 10, 10, 13, 15, 9, 11, 13, 9, 7, 9, 11, 9, 10, 12, 8, 6, 5, 4, 7, 9, 10, 8, 4, 2, 3, 5, 7, 9, 8, 4, 3, 2, 4, 6, 9, 9, 5, 3, 2, 32, 36, 40, 42, 43, 41, 37, 31, 35, 39, 42, 42, 39, 35, 29, 33, 38, 40, 41, 37, 33, 28, 30, 35, 37, 39, 34, 27, 25, 27, 30, 32, 33, 30, 27, 21, 23, 26, 28, 31, 31, 27, 16, 20, 24, 27, 30, 30, 27, 29, 34, 37, 39, 39, 37, 34, 28, 33, 35, 38, 39, 35, 32, 26, 30, 34, 36, 36, 33, 28, 25, 28, 31, 33, 34, 30, 24, 21, 24, 27, 29, 27, 26, 24, 16, 20, 23, 25, 25, 27, 24, 13, 17, 21, 24, 24, 25, 24, 26, 30, 32, 34, 35, 34, 29, 25, 28, 31, 33, 33, 31, 26, 22, 26, 30, 30, 29, 29, 24, 19, 25, 26, 26, 27, 25, 20, 13, 21, 22, 23, 20, 21, 20, 8, 17, 18, 18, 18, 19, 20, 7, 14, 16, 16, 17, 17, 18, 23, 24, 25, 26, 28, 29, 21, 19, 22, 24, 25, 26, 26, 19, 15, 21, 22, 22, 22, 22, 18, 11, 18, 18, 18, 18, 17, 16, 9, 13, 15, 14, 13, 12, 12, 7, 8, 10, 10, 10, 11, 9, 7, 5, 8, 9, 9, 10, 7, 11, 16, 17, 18, 19, 19, 21, 7, 15, 16, 17, 18, 17, 20, 7, 13, 14, 14, 14, 14, 14, 7, 9, 11, 10, 10, 9, 8, 5, 3, 6, 6, 4, 5, 6, 3, 2, 0, 2, 3, 4, 6, 4, 3, 3, 2, 2, 3, 5, 7, 10, 12, 13, 16, 18, 20, 7, 9, 11, 12, 14, 16, 16, 7, 7, 9, 9, 11, 13, 12, 7, 6, 7, 7, 7, 7, 6, 5, 4, 9, 9, 5, 3, 5, 3, 5, 11, 11, 7, 2, 5, 1, 7, 11, 12, 9, 4, 4, 9, 15, 14, 10, 14, 17, 18, 8, 15, 16, 10, 12, 14, 14, 9, 14, 18, 11, 8, 10, 11, 8, 14, 18, 12, 7, 5, 5, 7, 13, 17, 14, 9, 4, 4, 7, 13, 16, 14, 11, 6, 3, 8, 13, 15, 15, 12, 8, 2, 30, 33, 38, 42, 43, 38, 36, 29, 33, 37, 41, 41, 38, 35, 28, 31, 35, 39, 40, 36, 31, 26, 29, 33, 35, 38, 33, 27, 23, 26, 28, 30, 32, 30, 27, 19, 22, 25, 27, 31, 30, 27, 16, 19, 22, 26, 30, 29, 27, 27, 31, 34, 39, 38, 35, 32, 26, 30, 34, 38, 37, 34, 30, 26, 29, 32, 35, 34, 31, 26, 23, 25, 30, 32, 31, 29, 23, 20, 23, 26, 28, 26, 26, 22, 16, 19, 22, 23, 23, 25, 23, 12, 17, 20, 23, 23, 24, 23, 25, 29, 30, 31, 34, 32, 27, 23, 27, 29, 31, 31, 29, 25, 22, 26, 28, 28, 28, 27, 22, 18, 23, 25, 25, 25, 23, 18, 12, 20, 21, 21, 20, 19, 18, 7, 16, 17, 17, 17, 18, 18, 6, 14, 16, 16, 16, 16, 16, 21, 23, 24, 25, 26, 26, 20, 18, 22, 23, 23, 24, 23, 17, 14, 20, 21, 20, 21, 21, 16, 10, 17, 17, 17, 17, 16, 14, 8, 12, 13, 13, 12, 11, 11, 7, 8, 10, 10, 9, 10, 7, 6, 5, 8, 8, 8, 8, 5, 9, 15, 15, 17, 17, 17, 19, 6, 13, 14, 15, 15, 14, 17, 6, 12, 12, 12, 12, 11, 12, 6, 8, 9, 9, 8, 7, 7, 4, 2, 5, 4, 3, 4, 5, 2, 2, 2, 0, 2, 3, 4, 3, 2, 3, 2, 2, 2, 4, 6, 9, 10, 11, 13, 16, 17, 6, 7, 9, 10, 12, 13, 14, 6, 7, 7, 8, 9, 10, 9, 6, 6, 7, 7, 5, 6, 4, 4, 5, 9, 9, 4, 2, 3, 2, 5, 11, 11, 6, 1, 3, 2, 6, 11, 13, 8, 3, 3, 9, 15, 14, 9, 12, 14, 15, 9, 15, 17, 10, 10, 12, 12, 9, 15, 18, 11, 7, 9, 9, 9, 14, 19, 12, 7, 4, 3, 7, 13, 19, 15, 8, 3, 2, 7, 13, 18, 17, 10, 5, 2, 8, 14, 19, 18, 13, 7, 2, 29, 31, 36, 40, 40, 38, 34, 27, 30, 35, 39, 38, 36, 32, 25, 29, 33, 37, 38, 33, 30, 24, 27, 31, 34, 36, 32, 26, 21, 24, 26, 30, 32, 30, 25, 18, 20, 23, 27, 30, 28, 26, 16, 18, 22, 25, 29, 29, 26, 26, 29, 33, 37, 35, 34, 30, 25, 28, 32, 35, 36, 32, 27, 22, 27, 30, 33, 33, 30, 25, 22, 24, 26, 30, 30, 27, 21, 19, 21, 23, 26, 25, 25, 22, 16, 18, 20, 23, 24, 24, 21, 12, 16, 19, 22, 22, 23, 21, 23, 26, 28, 29, 31, 29, 25, 22, 25, 27, 29, 28, 27, 23, 20, 24, 26, 26, 26, 25, 20, 17, 22, 22, 22, 23, 22, 16, 11, 18, 19, 19, 18, 18, 16, 7, 16, 17, 16, 16, 17, 16, 7, 15, 15, 15, 15, 16, 15, 20, 21, 21, 22, 24, 24, 17, 17, 20, 20, 21, 21, 21, 15, 13, 19, 19, 18, 18, 18, 13, 9, 16, 15, 15, 15, 14, 12, 7, 11, 11, 11, 10, 10, 9, 7, 8, 10, 9, 9, 9, 6, 7, 5, 8, 8, 8, 8, 4, 8, 13, 14, 14, 15, 14, 16, 5, 12, 12, 13, 13, 11, 15, 5, 10, 10, 10, 10, 9, 10, 5, 6, 7, 6, 6, 5, 5, 3, 1, 3, 2, 2, 2, 3, 2, 1, 3, 2, 0, 2, 3, 4, 2, 4, 2, 2, 1, 3, 4, 6, 7, 9, 10, 13, 14, 4, 5, 6, 8, 9, 10, 11, 4, 7, 7, 6, 7, 7, 7, 4, 6, 7, 7, 3, 4, 3, 2, 5, 10, 8, 5, 1, 2, 0, 6, 11, 11, 6, 2, 2, 3, 7, 12, 12, 8, 3, 2, 9, 12, 11, 8, 9, 11, 12, 9, 13, 12, 9, 8, 9, 9, 9, 13, 14, 9, 6, 6, 7, 9, 12, 14, 10, 7, 2, 2, 8, 12, 15, 13, 8, 3, 2, 8, 13, 16, 15, 10, 5, 1, 8, 13, 16, 16, 11, 7, 2, 26, 28, 32, 36, 37, 34, 31, 24, 27, 31, 36, 36, 33, 29, 23, 26, 29, 33, 34, 32, 27, 21, 24, 27, 31, 33, 29, 24, 18, 21, 24, 27, 31, 27, 24, 16, 18, 22, 25, 28, 27, 24, 15, 17, 21, 23, 27, 27, 24, 23, 27, 30, 35, 33, 31, 27, 21, 26, 29, 32, 32, 28, 25, 21, 23, 28, 30, 31, 28, 23, 20, 22, 24, 27, 27, 25, 20, 17, 18, 21, 24, 24, 23, 20, 15, 17, 19, 22, 22, 22, 20, 12, 16, 18, 20, 20, 21, 19, 21, 24, 25, 27, 28, 27, 22, 19, 22, 25, 25, 26, 24, 20, 18, 21, 23, 23, 23, 22, 18, 16, 19, 20, 20, 20, 19, 15, 10, 16, 16, 16, 16, 16, 14, 7, 15, 16, 15, 15, 15, 14, 7, 14, 14, 13, 14, 14, 13, 18, 19, 18, 20, 21, 21, 14, 15, 17, 18, 18, 19, 18, 12, 12, 16, 16, 16, 15, 15, 11, 8, 14, 13, 12, 12, 11, 10, 6, 10, 9, 9, 8, 8, 7, 6, 8, 8, 7, 7, 7, 4, 7, 4, 6, 6, 6, 6, 3, 8, 10, 11, 12, 12, 12, 13, 3, 9, 9, 10, 11, 9, 11, 3, 8, 7, 7, 7, 7, 7, 3, 4, 4, 3, 3, 3, 3, 1, 1, 1, 1, 2, 1, 2, 2, 3, 4, 3, 2, 0, 3, 3, 5, 5, 3, 3, 2, 2, 3, 5, 6, 7, 8, 10, 11, 3, 4, 6, 7, 7, 8, 8, 3, 4, 4, 4, 5, 5, 6, 3, 4, 4, 3, 2, 2, 2, 2, 5, 6, 4, 3, 2, 2, 3, 6, 8, 6, 3, 2, 1, 5, 7, 8, 7, 4, 3, 0, 5, 7, 6, 6, 8, 9, 10, 5, 7, 7, 6, 6, 7, 7, 6, 7, 8, 4, 3, 4, 4, 5, 7, 8, 5, 3, 2, 1, 5, 8, 9, 7, 4, 2, 0, 6, 8, 10, 9, 5, 3, 2, 7, 9, 10, 10, 6, 4, 3, 20, 24, 29, 32, 32, 29, 25, 20, 23, 27, 31, 31, 28, 25, 18, 21, 25, 29, 30, 25, 22, 16, 19, 22, 26, 28, 23, 20, 13, 16, 19, 22, 26, 23, 19, 11, 14, 17, 20, 24, 23, 20, 10, 13, 16, 19, 22, 23, 20, 18, 21, 25, 29, 28, 26, 22, 16, 20, 24, 28, 28, 24, 20, 15, 19, 23, 25, 24, 23, 18, 14, 17, 20, 22, 22, 20, 16, 11, 13, 16, 18, 19, 18, 16, 10, 12, 15, 17, 18, 17, 15, 7, 11, 14, 16, 16, 16, 16, 15, 19, 21, 21, 23, 21, 17, 14, 17, 20, 21, 21, 20, 15, 13, 16, 18, 17, 18, 18, 14, 12, 14, 15, 15, 15, 15, 11, 8, 11, 12, 12, 12, 12, 11, 5, 10, 11, 10, 10, 10, 11, 5, 8, 9, 9, 10, 9, 9, 14, 13, 14, 14, 16, 17, 10, 11, 11, 12, 13, 13, 14, 8, 9, 10, 11, 11, 10, 10, 7, 5, 8, 7, 7, 7, 7, 6, 4, 5, 5, 4, 4, 4, 3, 5, 3, 3, 3, 3, 3, 3, 6, 5, 3, 2, 2, 2, 2, 4, 5, 6, 7, 8, 9, 10, 2, 4, 5, 6, 6, 7, 8, 2, 3, 4, 4, 4, 4, 5, 2, 3, 2, 2, 2, 1, 2, 1, 6, 4, 3, 3, 2, 2, 4, 7, 7, 5, 3, 2, 0, 6, 8, 8, 5, 4, 3, 1, 5, 5, 5, 5, 6, 8, 9, 4, 6, 5, 5, 5, 6, 6, 5, 7, 5, 4, 3, 3, 3, 5, 7, 7, 5, 4, 3, 0, 6, 8, 8, 6, 4, 3, 1, 7, 9, 10, 8, 5, 3, 2, 8, 9, 11, 10, 6, 4, 2, 8, 10, 7, 5, 6, 7, 7, 8, 9, 9, 6, 5, 5, 5, 8, 10, 10, 5, 4, 2, 2, 8, 10, 11, 7, 5, 3, 2, 9, 10, 12, 10, 6, 4, 3, 9, 10, 14, 13, 8, 5, 3, 9, 11, 14, 14, 9, 5, 3, 27, 30, 32, 34, 33, 31, 30, 26, 29, 32, 33, 33, 30, 28, 25, 29, 30, 31, 31, 27, 24, 24, 25, 27, 28, 28, 23, 17, 20, 23, 24, 23, 21, 18, 17, 17, 19, 19, 17, 19, 18, 17, 11, 13, 16, 18, 18, 18, 17, 25, 27, 31, 32, 31, 30, 30, 24, 28, 30, 31, 31, 29, 26, 22, 25, 28, 30, 28, 26, 23, 21, 24, 26, 26, 25, 21, 16, 18, 20, 22, 22, 17, 16, 16, 13, 16, 17, 16, 16, 16, 16, 7, 11, 14, 16, 15, 16, 16, 22, 26, 28, 29, 30, 29, 26, 21, 25, 27, 28, 28, 27, 24, 19, 23, 25, 26, 26, 25, 20, 18, 21, 22, 22, 22, 20, 15, 11, 17, 18, 18, 15, 15, 14, 5, 12, 13, 13, 13, 13, 15, 4, 7, 10, 11, 12, 13, 13, 19, 20, 22, 23, 25, 25, 22, 17, 19, 20, 22, 23, 23, 20, 14, 18, 19, 19, 19, 18, 16, 11, 16, 15, 15, 15, 13, 13, 8, 11, 11, 10, 8, 8, 9, 5, 5, 5, 5, 6, 7, 7, 4, 3, 2, 4, 5, 5, 7, 13, 16, 18, 19, 20, 22, 22, 9, 15, 17, 18, 18, 19, 20, 9, 15, 15, 16, 16, 16, 14, 9, 11, 12, 12, 11, 9, 7, 7, 6, 7, 6, 4, 3, 7, 4, 3, 4, 3, 4, 3, 6, 0, 3, 4, 3, 4, 4, 4, 10, 11, 13, 14, 17, 20, 21, 10, 10, 12, 13, 16, 17, 18, 10, 11, 11, 11, 12, 14, 13, 10, 10, 10, 9, 8, 7, 6, 8, 8, 9, 8, 5, 4, 5, 5, 7, 9, 8, 5, 4, 3, 4, 5, 8, 9, 7, 5, 3, 12, 14, 14, 13, 15, 19, 20, 12, 14, 15, 13, 13, 15, 17, 12, 14, 16, 12, 10, 11, 11, 12, 13, 15, 11, 9, 6, 3, 10, 12, 14, 11, 7, 4, 3, 9, 10, 13, 12, 8, 5, 4, 7, 10, 12, 13, 9, 6, 4, 34, 37, 39, 42, 42, 40, 38, 32, 35, 39, 42, 42, 39, 36, 31, 34, 37, 39, 39, 36, 31, 29, 32, 34, 37, 36, 31, 25, 26, 29, 30, 31, 30, 27, 25, 22, 24, 25, 25, 28, 27, 25, 16, 19, 21, 25, 27, 27, 25, 30, 34, 38, 41, 40, 37, 35, 29, 33, 37, 39, 40, 36, 33, 27, 32, 35, 37, 36, 33, 30, 26, 29, 33, 34, 32, 28, 23, 23, 26, 28, 29, 27, 24, 23, 17, 21, 23, 22, 24, 24, 23, 11, 16, 20, 22, 23, 24, 23, 27, 31, 34, 35, 36, 35, 30, 26, 29, 33, 34, 35, 33, 29, 23, 29, 31, 31, 31, 30, 25, 21, 26, 27, 28, 27, 25, 20, 15, 22, 24, 23, 20, 20, 20, 9, 18, 18, 17, 17, 18, 20, 6, 13, 15, 15, 16, 17, 18, 25, 26, 27, 28, 30, 31, 25, 20, 24, 26, 27, 27, 27, 23, 17, 23, 24, 24, 24, 23, 21, 13, 20, 20, 20, 20, 18, 17, 11, 14, 15, 15, 12, 12, 13, 8, 8, 11, 9, 10, 11, 10, 6, 4, 7, 7, 8, 9, 9, 13, 19, 20, 22, 22, 24, 25, 10, 19, 19, 21, 21, 21, 22, 10, 17, 18, 18, 18, 17, 17, 10, 12, 15, 14, 13, 11, 9, 7, 6, 10, 9, 5, 6, 7, 4, 3, 3, 2, 2, 5, 8, 3, 0, 3, 2, 2, 3, 7, 10, 14, 15, 17, 20, 22, 24, 10, 12, 14, 16, 18, 19, 20, 10, 10, 12, 12, 15, 16, 14, 10, 9, 8, 9, 10, 9, 7, 8, 7, 7, 6, 4, 3, 7, 5, 5, 7, 5, 4, 2, 6, 2, 4, 6, 6, 4, 3, 5, 10, 13, 13, 13, 17, 21, 22, 10, 13, 13, 12, 16, 18, 19, 10, 13, 14, 11, 11, 13, 13, 10, 12, 13, 10, 8, 7, 6, 8, 10, 11, 9, 5, 3, 5, 7, 8, 9, 8, 5, 3, 3, 5, 7, 9, 9, 6, 4, 2, 36, 39, 42, 47, 46, 43, 40, 33, 38, 41, 46, 46, 42, 38, 33, 35, 40, 43, 43, 39, 35, 31, 33, 37, 39, 41, 36, 31, 27, 30, 34, 35, 35, 32, 30, 23, 26, 28, 30, 33, 33, 30, 19, 22, 26, 29, 32, 32, 30, 32, 36, 41, 44, 42, 41, 38, 31, 34, 39, 42, 42, 39, 35, 29, 34, 37, 39, 40, 38, 32, 28, 31, 35, 36, 36, 32, 26, 23, 27, 30, 32, 30, 29, 26, 18, 23, 26, 27, 27, 27, 27, 13, 20, 23, 26, 26, 26, 26, 30, 34, 35, 37, 38, 38, 32, 27, 31, 35, 36, 36, 35, 30, 25, 30, 34, 34, 33, 32, 27, 21, 28, 29, 29, 29, 28, 22, 15, 24, 26, 25, 23, 23, 22, 9, 20, 21, 20, 20, 21, 22, 8, 17, 18, 19, 19, 20, 20, 25, 28, 29, 31, 31, 32, 26, 20, 26, 28, 29, 29, 29, 23, 17, 24, 25, 26, 25, 25, 21, 14, 21, 22, 21, 22, 20, 18, 11, 15, 18, 18, 15, 14, 14, 9, 10, 13, 13, 13, 13, 11, 8, 5, 10, 10, 11, 12, 8, 13, 20, 20, 22, 23, 22, 25, 10, 18, 19, 21, 21, 20, 23, 9, 16, 18, 17, 17, 17, 17, 10, 11, 14, 13, 13, 10, 10, 7, 5, 10, 9, 6, 7, 8, 5, 3, 3, 3, 3, 5, 8, 4, 3, 0, 2, 3, 5, 7, 8, 14, 15, 17, 19, 22, 23, 9, 12, 14, 15, 17, 19, 19, 9, 9, 12, 12, 14, 15, 14, 9, 8, 8, 8, 10, 9, 7, 6, 5, 7, 7, 3, 5, 7, 4, 3, 8, 7, 5, 4, 7, 2, 4, 8, 8, 6, 2, 5, 9, 12, 12, 13, 17, 20, 21, 9, 12, 14, 11, 15, 17, 18, 9, 12, 15, 9, 11, 13, 13, 9, 11, 14, 10, 7, 7, 6, 7, 10, 13, 11, 6, 2, 5, 5, 10, 11, 10, 7, 4, 4, 5, 8, 10, 10, 8, 6, 3, 32, 36, 39, 43, 44, 41, 38, 31, 35, 38, 43, 44, 39, 35, 29, 33, 37, 40, 40, 38, 33, 28, 30, 34, 37, 38, 34, 29, 25, 28, 30, 33, 35, 31, 29, 22, 24, 26, 29, 32, 31, 28, 18, 21, 24, 28, 31, 32, 29, 29, 34, 38, 40, 41, 37, 34, 28, 32, 35, 39, 39, 36, 31, 27, 30, 35, 38, 37, 33, 29, 25, 28, 31, 34, 33, 31, 24, 21, 25, 27, 29, 28, 27, 24, 17, 21, 23, 25, 26, 27, 24, 13, 18, 22, 24, 24, 25, 25, 27, 30, 33, 34, 35, 33, 29, 25, 29, 31, 33, 34, 32, 27, 23, 28, 30, 30, 30, 29, 24, 19, 25, 25, 26, 26, 26, 20, 13, 21, 22, 23, 21, 20, 19, 8, 17, 19, 19, 19, 19, 19, 7, 16, 17, 18, 18, 19, 18, 23, 25, 26, 27, 29, 28, 21, 18, 23, 24, 26, 26, 25, 19, 15, 22, 23, 22, 22, 21, 18, 12, 19, 19, 19, 18, 17, 16, 9, 13, 15, 15, 13, 12, 12, 8, 9, 11, 11, 11, 11, 9, 8, 5, 10, 9, 10, 10, 6, 11, 16, 18, 19, 20, 18, 21, 7, 15, 16, 17, 17, 16, 19, 7, 12, 14, 14, 13, 13, 14, 7, 8, 11, 10, 10, 7, 8, 5, 2, 6, 6, 4, 4, 6, 3, 2, 2, 2, 2, 3, 5, 3, 2, 2, 0, 2, 3, 4, 6, 10, 11, 13, 15, 16, 19, 6, 9, 10, 11, 13, 14, 15, 6, 7, 8, 9, 10, 11, 10, 6, 5, 6, 5, 6, 7, 5, 4, 3, 7, 7, 3, 3, 4, 2, 3, 10, 10, 5, 2, 4, 1, 4, 10, 12, 7, 2, 3, 7, 13, 12, 10, 13, 16, 16, 7, 13, 15, 9, 11, 13, 13, 7, 13, 17, 10, 8, 10, 10, 7, 12, 17, 11, 5, 5, 4, 6, 11, 17, 13, 7, 2, 3, 5, 12, 17, 16, 9, 4, 3, 6, 12, 17, 17, 11, 6, 2, 30, 35, 39, 42, 42, 39, 36, 29, 34, 38, 41, 42, 38, 34, 28, 31, 36, 39, 41, 36, 33, 27, 28, 32, 36, 38, 33, 28, 24, 25, 29, 33, 34, 31, 28, 20, 22, 26, 28, 32, 31, 28, 18, 20, 24, 27, 30, 31, 28, 28, 31, 35, 40, 39, 35, 32, 26, 30, 34, 38, 39, 34, 30, 25, 28, 32, 36, 36, 32, 27, 24, 26, 29, 33, 33, 30, 23, 20, 23, 26, 28, 28, 26, 23, 16, 20, 23, 25, 26, 26, 24, 13, 19, 21, 24, 24, 24, 23, 25, 29, 30, 32, 33, 31, 27, 23, 27, 29, 31, 30, 30, 25, 21, 26, 28, 29, 28, 27, 22, 18, 25, 25, 25, 25, 24, 18, 12, 20, 22, 21, 21, 19, 18, 8, 18, 18, 19, 19, 18, 18, 8, 16, 18, 17, 18, 18, 16, 20, 24, 24, 25, 26, 25, 19, 17, 22, 22, 23, 24, 22, 17, 14, 20, 21, 20, 20, 20, 15, 11, 17, 17, 17, 17, 16, 14, 8, 12, 14, 14, 13, 12, 11, 7, 9, 11, 11, 11, 11, 7, 7, 6, 10, 9, 9, 10, 5, 9, 15, 16, 17, 18, 15, 18, 6, 14, 15, 15, 16, 13, 16, 6, 11, 12, 12, 12, 10, 12, 6, 6, 9, 9, 8, 6, 7, 4, 2, 5, 4, 4, 3, 4, 3, 2, 2, 2, 2, 2, 4, 4, 2, 3, 2, 0, 2, 3, 5, 8, 9, 10, 12, 14, 16, 5, 6, 8, 9, 11, 11, 12, 5, 5, 6, 6, 8, 9, 8, 4, 4, 6, 5, 4, 5, 4, 2, 4, 7, 7, 3, 2, 3, 2, 4, 10, 9, 4, 1, 3, 2, 5, 10, 11, 6, 2, 2, 7, 11, 10, 7, 11, 13, 14, 7, 11, 11, 8, 9, 11, 11, 7, 11, 13, 8, 6, 7, 8, 7, 11, 13, 9, 5, 3, 3, 6, 10, 14, 12, 7, 2, 3, 6, 11, 15, 14, 8, 3, 2, 7, 12, 15, 15, 10, 5, 1, 27, 31, 36, 39, 39, 36, 33, 27, 30, 34, 38, 39, 36, 32, 24, 27, 34, 36, 37, 33, 30, 24, 26, 29, 32, 36, 32, 26, 21, 23, 26, 29, 32, 29, 26, 18, 20, 23, 26, 30, 29, 26, 17, 19, 22, 25, 28, 29, 26, 24, 28, 32, 37, 35, 33, 29, 24, 27, 32, 34, 36, 30, 27, 23, 26, 29, 32, 31, 30, 25, 22, 23, 27, 29, 29, 27, 22, 18, 20, 23, 26, 25, 24, 21, 16, 18, 20, 23, 23, 24, 22, 12, 17, 20, 22, 22, 23, 21, 23, 26, 28, 29, 30, 28, 23, 21, 25, 27, 28, 28, 27, 22, 20, 23, 26, 25, 26, 25, 20, 17, 22, 21, 21, 21, 21, 16, 11, 18, 18, 18, 18, 18, 16, 8, 16, 17, 16, 17, 16, 16, 8, 15, 15, 15, 15, 15, 14, 20, 21, 21, 22, 23, 23, 15, 16, 19, 20, 20, 21, 19, 14, 13, 18, 18, 18, 17, 17, 12, 9, 15, 14, 14, 13, 13, 12, 7, 11, 11, 10, 10, 10, 8, 7, 9, 10, 9, 9, 9, 5, 8, 5, 8, 8, 8, 8, 3, 8, 12, 13, 14, 14, 13, 15, 4, 11, 12, 12, 12, 10, 13, 4, 9, 9, 9, 9, 8, 9, 4, 5, 6, 5, 5, 4, 5, 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 1, 2, 3, 4, 3, 5, 3, 2, 0, 3, 3, 6, 7, 8, 9, 11, 13, 3, 5, 7, 8, 8, 9, 10, 3, 4, 5, 5, 6, 6, 6, 3, 3, 3, 2, 2, 3, 3, 1, 4, 6, 4, 3, 0, 3, 2, 6, 8, 5, 4, 2, 2, 4, 7, 8, 7, 4, 2, 2, 4, 6, 6, 7, 9, 10, 11, 4, 6, 7, 6, 7, 8, 8, 4, 6, 7, 4, 4, 4, 6, 4, 6, 8, 4, 2, 1, 2, 3, 8, 9, 7, 4, 2, 2, 6, 9, 9, 9, 5, 3, 0, 7, 9, 9, 9, 6, 4, 2, 22, 26, 29, 33, 33, 30, 27, 21, 24, 29, 33, 32, 29, 26, 19, 23, 27, 30, 32, 28, 24, 18, 21, 24, 27, 30, 26, 21, 15, 17, 21, 24, 27, 24, 21, 13, 15, 18, 22, 25, 25, 21, 12, 15, 18, 20, 24, 24, 21, 20, 23, 27, 31, 29, 26, 23, 18, 22, 26, 29, 29, 26, 21, 17, 20, 24, 27, 27, 24, 20, 16, 18, 21, 24, 23, 22, 17, 13, 15, 17, 20, 20, 20, 17, 12, 13, 16, 18, 19, 19, 16, 9, 12, 16, 18, 17, 18, 17, 18, 20, 23, 24, 25, 23, 19, 17, 19, 21, 22, 22, 21, 17, 15, 18, 20, 20, 20, 19, 15, 14, 16, 16, 16, 16, 16, 12, 9, 13, 14, 13, 13, 13, 12, 6, 12, 13, 12, 12, 12, 12, 6, 10, 10, 11, 11, 11, 10, 15, 15, 16, 17, 18, 18, 11, 14, 14, 14, 15, 15, 15, 9, 11, 12, 13, 12, 12, 11, 8, 6, 11, 9, 9, 9, 9, 7, 4, 7, 6, 6, 5, 5, 4, 5, 5, 5, 5, 4, 4, 2, 6, 4, 3, 3, 3, 3, 2, 6, 7, 7, 8, 9, 10, 11, 2, 5, 6, 7, 7, 8, 9, 2, 4, 5, 4, 5, 5, 5, 2, 2, 2, 2, 1, 2, 2, 1, 4, 3, 3, 2, 1, 2, 3, 5, 5, 3, 3, 2, 1, 4, 7, 6, 4, 3, 3, 0, 4, 4, 5, 6, 7, 8, 10, 3, 5, 5, 6, 6, 6, 7, 4, 6, 5, 4, 4, 3, 4, 4, 6, 5, 4, 3, 2, 1, 4, 7, 8, 5, 4, 3, 0, 5, 7, 9, 7, 4, 3, 2, 6, 8, 9, 8, 5, 3, 2, 7, 9, 7, 5, 6, 8, 8, 7, 9, 8, 5, 5, 5, 5, 7, 9, 9, 5, 3, 2, 3, 7, 8, 11, 6, 4, 3, 1, 8, 9, 11, 9, 5, 3, 2, 8, 9, 11, 11, 6, 4, 2, 8, 10, 12, 12, 8, 5, 3, 24, 27, 29, 32, 31, 29, 26, 23, 26, 28, 30, 32, 29, 25, 22, 24, 27, 29, 31, 29, 25, 21, 23, 26, 28, 31, 28, 27, 20, 23, 25, 28, 31, 29, 26, 19, 23, 25, 27, 30, 29, 27, 16, 20, 23, 26, 29, 28, 27, 22, 24, 27, 30, 28, 25, 24, 21, 24, 26, 29, 28, 26, 24, 19, 22, 25, 28, 27, 25, 24, 18, 22, 24, 27, 26, 25, 23, 18, 21, 24, 27, 26, 26, 24, 16, 19, 22, 24, 25, 25, 24, 13, 16, 21, 24, 25, 24, 24, 19, 22, 23, 24, 24, 23, 19, 18, 20, 23, 23, 24, 23, 19, 17, 20, 22, 22, 22, 23, 19, 16, 19, 21, 21, 22, 23, 20, 14, 18, 19, 20, 21, 22, 19, 11, 16, 18, 19, 19, 20, 20, 13, 14, 16, 17, 19, 19, 18, 17, 18, 17, 18, 18, 17, 8, 15, 15, 16, 16, 17, 16, 9, 13, 14, 15, 15, 15, 15, 10, 9, 14, 14, 14, 15, 15, 11, 9, 12, 12, 13, 13, 14, 8, 10, 10, 10, 11, 11, 12, 6, 13, 13, 10, 9, 10, 10, 6, 8, 9, 9, 9, 10, 6, 8, 4, 7, 7, 8, 8, 6, 9, 4, 6, 5, 6, 6, 5, 7, 4, 4, 4, 4, 5, 5, 7, 5, 4, 4, 4, 4, 3, 6, 7, 7, 7, 6, 4, 3, 4, 10, 10, 8, 6, 5, 3, 4, 0, 2, 2, 2, 2, 5, 7, 0, 3, 2, 2, 1, 4, 8, 0, 4, 3, 2, 1, 3, 6, 0, 3, 3, 2, 1, 2, 5, 2, 3, 5, 5, 3, 3, 4, 5, 6, 9, 8, 5, 3, 3, 8, 9, 10, 9, 6, 4, 3, 4, 7, 6, 3, 2, 3, 6, 4, 7, 7, 4, 2, 2, 5, 4, 7, 9, 4, 2, 0, 5, 4, 7, 10, 6, 3, 2, 3, 4, 7, 11, 9, 5, 3, 3, 5, 9, 12, 11, 7, 4, 3, 7, 11, 12, 13, 8, 5, 3, 25, 29, 32, 33, 34, 31, 29, 25, 27, 31, 34, 34, 32, 29, 23, 26, 29, 32, 34, 31, 29, 21, 24, 28, 32, 34, 33, 30, 21, 24, 28, 32, 35, 33, 30, 20, 23, 27, 31, 34, 33, 30, 18, 23, 25, 30, 33, 33, 31, 23, 25, 29, 31, 30, 27, 25, 21, 25, 28, 31, 30, 27, 25, 21, 24, 27, 30, 29, 27, 25, 19, 22, 27, 28, 29, 29, 25, 20, 22, 26, 29, 29, 28, 26, 19, 21, 24, 28, 28, 28, 25, 15, 19, 23, 27, 27, 27, 26, 21, 25, 25, 26, 26, 24, 19, 19, 22, 25, 24, 25, 24, 19, 18, 22, 23, 23, 24, 24, 20, 17, 21, 22, 23, 23, 23, 20, 14, 20, 22, 21, 22, 22, 21, 12, 18, 20, 21, 21, 22, 20, 13, 16, 18, 19, 20, 20, 18, 19, 19, 19, 19, 19, 18, 7, 16, 17, 18, 17, 18, 16, 9, 13, 16, 16, 17, 16, 15, 10, 10, 16, 16, 15, 16, 15, 12, 11, 14, 15, 15, 14, 14, 9, 11, 12, 13, 13, 13, 13, 6, 14, 14, 10, 11, 12, 12, 6, 8, 10, 10, 11, 10, 6, 7, 5, 9, 9, 9, 9, 6, 9, 5, 8, 7, 7, 7, 5, 6, 5, 6, 6, 6, 7, 4, 6, 6, 5, 5, 5, 5, 4, 6, 8, 9, 10, 9, 6, 5, 5, 11, 14, 14, 11, 8, 6, 4, 2, 0, 1, 1, 3, 5, 6, 2, 2, 2, 2, 2, 4, 6, 2, 4, 4, 4, 1, 4, 7, 2, 5, 7, 7, 4, 3, 5, 3, 7, 12, 11, 9, 6, 4, 6, 12, 16, 13, 11, 7, 4, 12, 16, 16, 14, 12, 8, 5, 6, 11, 11, 6, 1, 3, 5, 6, 12, 12, 8, 2, 3, 5, 6, 11, 13, 9, 4, 2, 5, 6, 12, 14, 12, 8, 4, 4, 8, 13, 16, 15, 12, 8, 5, 10, 15, 17, 16, 13, 10, 6, 14, 17, 18, 17, 14, 11, 7, 24, 27, 31, 33, 34, 31, 28, 23, 27, 29, 33, 34, 31, 28, 22, 25, 29, 32, 33, 31, 28, 21, 25, 28, 31, 35, 32, 29, 22, 24, 28, 31, 35, 33, 30, 21, 24, 26, 30, 34, 33, 29, 18, 21, 25, 29, 33, 33, 30, 21, 24, 28, 31, 29, 26, 24, 21, 24, 27, 30, 30, 26, 23, 20, 23, 26, 28, 30, 27, 25, 19, 22, 26, 29, 29, 28, 24, 20, 22, 26, 28, 28, 28, 25, 18, 21, 24, 27, 28, 27, 25, 16, 19, 23, 26, 26, 27, 24, 20, 23, 24, 24, 24, 22, 17, 19, 21, 23, 24, 23, 22, 17, 18, 21, 22, 23, 23, 21, 18, 16, 21, 22, 22, 23, 22, 18, 14, 20, 22, 22, 22, 22, 18, 12, 18, 20, 20, 21, 21, 19, 15, 17, 19, 19, 19, 19, 17, 18, 17, 17, 17, 18, 15, 6, 16, 16, 16, 16, 17, 14, 7, 12, 15, 16, 15, 15, 14, 9, 9, 16, 15, 15, 15, 14, 12, 10, 14, 14, 15, 14, 13, 9, 12, 12, 12, 13, 13, 12, 6, 15, 16, 11, 11, 12, 11, 5, 8, 10, 10, 10, 9, 4, 6, 4, 9, 8, 8, 8, 4, 7, 4, 8, 7, 7, 7, 4, 6, 4, 6, 7, 6, 7, 4, 5, 6, 6, 6, 6, 6, 5, 5, 8, 10, 12, 10, 7, 6, 5, 12, 16, 15, 12, 9, 7, 5, 2, 1, 0, 1, 2, 3, 4, 2, 2, 2, 2, 2, 3, 4, 2, 4, 4, 4, 1, 3, 5, 2, 6, 8, 8, 5, 4, 5, 4, 8, 13, 13, 9, 7, 5, 8, 13, 19, 18, 12, 8, 5, 13, 18, 20, 19, 14, 9, 6, 6, 12, 11, 5, 1, 2, 4, 6, 12, 13, 7, 1, 2, 4, 6, 12, 15, 9, 5, 2, 4, 6, 13, 18, 13, 9, 6, 5, 9, 15, 21, 19, 13, 9, 6, 12, 18, 24, 23, 16, 10, 7, 16, 21, 25, 25, 18, 12, 8, 24, 27, 30, 33, 33, 31, 26, 23, 26, 30, 33, 33, 31, 27, 21, 24, 28, 32, 33, 31, 28, 21, 24, 29, 32, 35, 32, 29, 21, 24, 28, 31, 35, 33, 30, 20, 23, 27, 30, 34, 32, 28, 19, 21, 26, 29, 33, 33, 29, 21, 25, 27, 31, 28, 26, 22, 21, 23, 27, 30, 28, 26, 23, 19, 22, 26, 28, 29, 28, 23, 19, 23, 26, 29, 29, 28, 24, 20, 23, 25, 28, 29, 28, 25, 18, 22, 24, 28, 28, 27, 25, 16, 19, 23, 27, 27, 26, 24, 20, 23, 23, 24, 23, 21, 16, 19, 21, 23, 23, 23, 21, 16, 18, 20, 22, 22, 22, 22, 17, 16, 21, 22, 22, 22, 22, 18, 15, 20, 22, 22, 22, 21, 17, 13, 19, 20, 20, 21, 20, 18, 16, 18, 19, 19, 19, 19, 17, 18, 17, 17, 17, 17, 14, 5, 16, 17, 16, 16, 15, 13, 6, 13, 15, 16, 15, 15, 13, 9, 9, 16, 15, 15, 15, 13, 12, 11, 15, 14, 15, 14, 13, 8, 12, 13, 13, 13, 13, 12, 6, 16, 17, 13, 11, 12, 11, 5, 8, 10, 10, 9, 8, 3, 5, 5, 9, 8, 8, 7, 3, 6, 5, 8, 7, 7, 7, 3, 5, 5, 6, 7, 7, 7, 4, 5, 6, 6, 7, 7, 7, 7, 5, 9, 12, 13, 11, 9, 7, 5, 14, 17, 17, 13, 10, 8, 6, 2, 1, 1, 0, 2, 3, 4, 2, 3, 2, 2, 2, 3, 3, 2, 4, 4, 5, 2, 3, 4, 2, 6, 9, 9, 6, 5, 5, 4, 9, 14, 13, 10, 8, 6, 9, 14, 20, 18, 12, 9, 7, 15, 19, 21, 20, 15, 10, 7, 6, 9, 7, 4, 0, 2, 3, 6, 9, 8, 5, 2, 2, 3, 6, 9, 10, 8, 5, 3, 4, 6, 11, 15, 12, 9, 7, 6, 10, 14, 19, 18, 14, 10, 8, 13, 19, 23, 23, 16, 11, 8, 18, 22, 24, 24, 19, 13, 9, 20, 23, 27, 30, 30, 28, 24, 19, 23, 26, 29, 29, 27, 24, 18, 21, 25, 28, 31, 29, 26, 17, 21, 25, 28, 31, 29, 26, 18, 22, 24, 28, 32, 29, 26, 18, 21, 24, 27, 32, 29, 25, 16, 19, 23, 26, 29, 29, 26, 18, 21, 24, 27, 27, 22, 19, 18, 20, 23, 26, 26, 23, 20, 17, 19, 22, 26, 26, 24, 21, 16, 19, 23, 26, 26, 25, 22, 17, 20, 23, 26, 25, 25, 21, 15, 18, 22, 24, 24, 24, 21, 17, 18, 20, 23, 23, 23, 21, 17, 19, 19, 20, 21, 17, 13, 16, 18, 19, 19, 19, 18, 14, 15, 18, 19, 20, 20, 19, 14, 15, 18, 20, 19, 20, 19, 15, 13, 17, 19, 18, 19, 19, 16, 12, 16, 17, 18, 17, 18, 15, 19, 19, 16, 16, 17, 16, 15, 15, 14, 13, 14, 14, 12, 3, 14, 13, 13, 13, 12, 11, 4, 11, 12, 12, 13, 12, 11, 7, 8, 13, 13, 12, 12, 12, 9, 9, 12, 12, 11, 11, 10, 7, 12, 14, 12, 11, 10, 10, 5, 19, 20, 15, 12, 9, 9, 6, 7, 6, 6, 6, 5, 2, 3, 3, 5, 5, 4, 4, 3, 4, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 5, 5, 5, 5, 5, 9, 9, 9, 9, 8, 6, 10, 15, 16, 13, 10, 8, 6, 17, 20, 19, 15, 12, 9, 7, 2, 3, 2, 2, 0, 2, 3, 2, 4, 3, 2, 2, 2, 3, 2, 6, 4, 4, 4, 3, 4, 2, 7, 8, 8, 7, 6, 6, 7, 12, 14, 13, 12, 9, 7, 12, 16, 20, 18, 13, 10, 8, 18, 21, 22, 19, 15, 11, 8, 7, 9, 5, 3, 2, 1, 2, 7, 9, 7, 3, 2, 2, 3, 7, 9, 9, 6, 5, 5, 4, 7, 9, 13, 11, 9, 8, 8, 9, 14, 17, 17, 14, 11, 8, 15, 18, 21, 22, 16, 13, 9, 19, 23, 23, 23, 18, 14, 10, 16, 20, 23, 26, 25, 23, 20, 15, 18, 21, 25, 25, 24, 20, 14, 17, 21, 25, 26, 24, 21, 14, 18, 21, 24, 28, 25, 22, 14, 18, 20, 25, 28, 26, 22, 13, 17, 20, 23, 27, 26, 23, 17, 17, 19, 22, 25, 26, 22, 14, 17, 20, 23, 22, 19, 15, 14, 16, 19, 22, 22, 20, 17, 12, 15, 18, 22, 22, 20, 17, 12, 15, 19, 22, 22, 21, 18, 12, 16, 18, 21, 22, 21, 18, 12, 15, 18, 21, 21, 20, 18, 19, 18, 17, 19, 19, 20, 18, 13, 15, 16, 16, 17, 14, 11, 12, 14, 15, 15, 16, 15, 11, 11, 13, 14, 16, 16, 16, 12, 11, 13, 15, 15, 15, 15, 13, 9, 13, 15, 14, 15, 15, 13, 14, 15, 14, 14, 14, 14, 13, 22, 20, 17, 13, 13, 13, 12, 11, 10, 9, 9, 9, 9, 2, 10, 9, 9, 8, 9, 8, 3, 8, 8, 8, 9, 9, 9, 4, 6, 8, 8, 9, 9, 8, 7, 7, 8, 9, 9, 9, 8, 6, 14, 16, 14, 13, 10, 8, 7, 21, 23, 18, 13, 11, 9, 7, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 3, 2, 2, 2, 3, 4, 3, 4, 2, 5, 6, 7, 7, 7, 7, 6, 11, 12, 11, 11, 9, 7, 13, 18, 19, 15, 13, 10, 8, 20, 22, 21, 17, 14, 11, 9, 5, 5, 3, 3, 2, 0, 2, 5, 6, 4, 3, 2, 2, 3, 5, 8, 6, 6, 5, 5, 4, 5, 9, 11, 10, 9, 9, 8, 9, 14, 17, 15, 14, 12, 8, 15, 19, 23, 20, 15, 12, 10, 21, 23, 24, 21, 17, 13, 10, 9, 11, 7, 4, 3, 2, 1, 9, 11, 9, 5, 3, 3, 3, 9, 11, 11, 8, 7, 6, 6, 9, 12, 15, 13, 11, 10, 10, 12, 16, 20, 19, 16, 13, 11, 17, 21, 24, 24, 19, 15, 11, 21, 24, 25, 25, 20, 16, 12, 12, 15, 18, 20, 20, 17, 15, 11, 14, 17, 20, 20, 18, 16, 10, 13, 16, 20, 21, 20, 17, 10, 13, 17, 20, 23, 20, 18, 10, 14, 16, 20, 24, 21, 18, 11, 13, 16, 19, 23, 22, 18, 18, 17, 16, 18, 21, 22, 18, 11, 13, 16, 18, 17, 14, 11, 9, 12, 15, 17, 16, 15, 13, 8, 11, 15, 18, 17, 16, 14, 7, 11, 15, 18, 17, 17, 14, 8, 11, 14, 17, 17, 16, 14, 12, 14, 15, 16, 16, 16, 14, 20, 19, 17, 16, 15, 15, 14, 8, 11, 12, 12, 12, 10, 7, 7, 10, 11, 11, 11, 10, 7, 7, 9, 10, 11, 11, 11, 8, 6, 9, 11, 11, 11, 11, 9, 7, 10, 11, 11, 11, 11, 9, 16, 16, 15, 13, 11, 9, 9, 22, 21, 17, 14, 11, 9, 8, 6, 6, 5, 5, 5, 6, 1, 6, 5, 4, 4, 4, 4, 2, 5, 3, 4, 5, 4, 4, 3, 8, 3, 5, 6, 6, 6, 6, 8, 9, 9, 10, 10, 9, 7, 16, 17, 15, 14, 11, 9, 7, 23, 24, 18, 15, 12, 10, 8, 3, 2, 2, 2, 2, 1, 1, 5, 3, 2, 2, 2, 2, 2, 4, 4, 3, 4, 5, 5, 4, 5, 7, 7, 8, 9, 8, 7, 8, 13, 13, 13, 12, 11, 8, 15, 19, 20, 17, 14, 12, 9, 22, 24, 23, 18, 16, 13, 10, 7, 6, 4, 3, 3, 2, 0, 7, 8, 5, 4, 3, 3, 3, 7, 10, 7, 8, 7, 6, 6, 7, 11, 13, 13, 11, 10, 9, 11, 16, 20, 19, 16, 13, 10, 17, 21, 26, 24, 19, 14, 11, 22, 25, 28, 25, 21, 16, 12, 10, 13, 10, 6, 3, 2, 2, 11, 13, 12, 7, 4, 4, 4, 11, 13, 16, 11, 9, 8, 7, 11, 15, 21, 17, 14, 12, 11, 14, 21, 24, 24, 20, 16, 12, 19, 24, 30, 30, 22, 17, 13, 25, 29, 31, 30, 25, 19, 14, 23, 27, 29, 32, 32, 30, 27, 22, 25, 28, 31, 31, 29, 26, 21, 24, 27, 29, 31, 28, 26, 20, 23, 26, 29, 30, 29, 27, 20, 23, 26, 28, 30, 29, 26, 19, 21, 25, 27, 30, 28, 27, 16, 20, 23, 27, 29, 28, 27, 22, 24, 27, 29, 29, 26, 24, 20, 24, 27, 28, 28, 26, 24, 20, 22, 26, 28, 26, 25, 22, 18, 22, 24, 27, 26, 26, 24, 18, 21, 24, 26, 26, 26, 24, 16, 19, 22, 24, 25, 25, 24, 13, 17, 21, 24, 24, 24, 24, 19, 22, 23, 25, 25, 23, 20, 18, 21, 22, 23, 23, 23, 19, 17, 20, 22, 22, 22, 22, 19, 15, 19, 21, 21, 22, 22, 20, 14, 18, 20, 20, 21, 21, 20, 11, 16, 18, 18, 19, 20, 20, 13, 14, 16, 17, 18, 19, 19, 17, 17, 17, 18, 18, 18, 8, 15, 15, 16, 16, 17, 16, 9, 13, 15, 15, 15, 16, 15, 9, 9, 13, 14, 14, 14, 14, 12, 9, 12, 13, 13, 13, 13, 8, 10, 10, 10, 11, 12, 12, 6, 13, 13, 9, 9, 10, 10, 6, 7, 9, 9, 9, 10, 6, 7, 4, 7, 8, 8, 8, 6, 9, 4, 6, 6, 6, 6, 5, 7, 4, 4, 4, 4, 5, 4, 7, 5, 4, 4, 4, 4, 3, 6, 7, 7, 7, 6, 4, 3, 5, 10, 10, 8, 6, 5, 3, 3, 0, 2, 2, 2, 2, 5, 7, 0, 3, 2, 2, 2, 4, 8, 0, 4, 3, 2, 1, 3, 6, 0, 3, 3, 2, 1, 2, 5, 2, 3, 5, 5, 3, 3, 3, 5, 6, 9, 8, 5, 3, 3, 8, 8, 10, 9, 6, 4, 3, 4, 7, 6, 3, 2, 3, 6, 4, 7, 7, 4, 2, 2, 5, 4, 7, 9, 4, 2, 0, 4, 4, 7, 10, 5, 3, 2, 3, 4, 7, 11, 9, 5, 3, 3, 5, 9, 12, 11, 7, 4, 3, 7, 11, 12, 12, 8, 5, 3, 28, 31, 34, 36, 36, 33, 31, 26, 29, 33, 36, 37, 35, 32, 25, 29, 32, 35, 37, 34, 31, 24, 27, 31, 34, 36, 34, 32, 24, 27, 31, 34, 37, 36, 31, 23, 25, 30, 33, 36, 35, 32, 20, 24, 28, 32, 35, 35, 32, 25, 29, 32, 34, 34, 31, 27, 24, 27, 30, 33, 32, 30, 27, 22, 26, 29, 32, 32, 30, 28, 22, 25, 29, 32, 32, 31, 28, 23, 24, 28, 32, 31, 31, 28, 20, 24, 27, 30, 30, 31, 29, 17, 20, 25, 29, 29, 29, 28, 23, 26, 27, 28, 28, 26, 21, 22, 25, 27, 26, 27, 25, 21, 21, 24, 25, 26, 25, 27, 22, 18, 23, 26, 24, 26, 25, 22, 16, 22, 24, 24, 25, 24, 23, 13, 20, 22, 23, 23, 24, 22, 14, 17, 20, 22, 22, 23, 21, 20, 20, 21, 22, 22, 19, 10, 18, 19, 20, 20, 21, 19, 11, 15, 18, 18, 18, 19, 17, 12, 11, 18, 18, 18, 18, 17, 14, 12, 16, 17, 17, 17, 16, 11, 12, 14, 14, 15, 15, 15, 8, 14, 13, 12, 13, 14, 13, 8, 10, 12, 13, 13, 12, 7, 10, 6, 11, 11, 11, 11, 7, 10, 6, 10, 9, 9, 9, 7, 9, 6, 8, 8, 8, 9, 6, 7, 7, 5, 7, 7, 7, 4, 7, 8, 7, 9, 8, 5, 4, 6, 10, 12, 12, 9, 7, 5, 5, 3, 2, 2, 3, 4, 6, 8, 3, 0, 1, 1, 3, 7, 8, 3, 2, 2, 2, 2, 5, 8, 3, 3, 5, 5, 2, 3, 6, 4, 5, 8, 7, 7, 5, 5, 5, 9, 11, 9, 8, 6, 4, 11, 13, 12, 10, 8, 7, 4, 4, 8, 7, 4, 3, 4, 7, 4, 8, 7, 5, 2, 4, 7, 4, 7, 9, 6, 2, 4, 6, 4, 8, 10, 7, 6, 4, 4, 6, 9, 10, 9, 8, 7, 4, 8, 10, 12, 12, 9, 7, 5, 11, 12, 13, 13, 10, 8, 6, 26, 29, 33, 35, 36, 33, 29, 25, 29, 32, 35, 35, 33, 30, 23, 27, 31, 33, 35, 35, 30, 22, 26, 30, 34, 37, 34, 31, 23, 25, 29, 33, 37, 34, 31, 23, 25, 29, 33, 37, 35, 31, 20, 24, 27, 32, 34, 34, 31, 23, 27, 30, 33, 32, 28, 25, 23, 26, 29, 32, 32, 29, 25, 22, 24, 28, 31, 31, 29, 26, 21, 25, 28, 31, 31, 29, 27, 21, 23, 27, 31, 31, 30, 26, 20, 23, 26, 29, 30, 30, 26, 17, 21, 25, 27, 28, 29, 27, 22, 25, 26, 26, 26, 23, 19, 21, 24, 25, 25, 25, 24, 18, 20, 22, 24, 24, 24, 24, 19, 17, 23, 24, 24, 25, 24, 20, 15, 22, 23, 23, 24, 23, 20, 13, 20, 22, 22, 22, 22, 20, 15, 18, 20, 21, 21, 21, 19, 19, 19, 19, 19, 19, 16, 7, 17, 18, 18, 18, 18, 15, 9, 13, 17, 17, 17, 17, 15, 10, 10, 17, 17, 17, 17, 15, 13, 12, 16, 16, 16, 16, 14, 10, 12, 14, 14, 14, 15, 14, 7, 15, 15, 12, 13, 13, 13, 5, 9, 11, 12, 11, 10, 5, 7, 6, 11, 10, 10, 9, 5, 8, 6, 9, 9, 9, 8, 5, 7, 5, 7, 8, 8, 8, 4, 6, 7, 5, 7, 7, 7, 5, 5, 9, 9, 11, 9, 7, 6, 5, 12, 14, 14, 10, 8, 7, 5, 2, 2, 2, 2, 3, 4, 5, 2, 1, 0, 1, 2, 4, 5, 2, 2, 2, 2, 2, 4, 6, 2, 4, 6, 6, 4, 4, 5, 4, 7, 11, 11, 9, 7, 5, 7, 12, 17, 15, 11, 8, 5, 12, 16, 19, 18, 13, 9, 6, 4, 10, 9, 4, 2, 3, 4, 4, 10, 12, 6, 1, 3, 4, 4, 10, 14, 8, 3, 3, 4, 4, 11, 17, 12, 7, 5, 5, 7, 13, 19, 17, 12, 9, 6, 10, 17, 22, 21, 15, 10, 7, 15, 19, 23, 23, 17, 11, 8, 26, 28, 32, 35, 35, 32, 29, 25, 27, 31, 34, 35, 31, 29, 23, 26, 30, 34, 35, 33, 29, 22, 25, 30, 33, 36, 34, 31, 23, 25, 29, 33, 37, 35, 29, 23, 25, 28, 32, 35, 34, 32, 20, 23, 27, 31, 34, 34, 31, 23, 26, 29, 32, 31, 27, 23, 22, 25, 29, 32, 30, 27, 24, 22, 24, 28, 31, 31, 29, 25, 21, 24, 27, 31, 31, 30, 25, 21, 24, 27, 30, 30, 29, 26, 20, 23, 26, 30, 29, 29, 25, 18, 21, 24, 28, 27, 28, 25, 22, 24, 25, 25, 25, 23, 17, 20, 22, 25, 25, 24, 22, 17, 19, 22, 24, 24, 24, 22, 17, 17, 23, 23, 23, 24, 23, 19, 15, 23, 23, 24, 23, 23, 19, 13, 20, 22, 22, 22, 22, 19, 15, 19, 20, 20, 21, 21, 18, 20, 19, 18, 18, 18, 15, 6, 17, 18, 18, 17, 17, 14, 8, 13, 17, 17, 17, 16, 14, 10, 10, 17, 17, 17, 17, 14, 13, 12, 16, 16, 16, 15, 14, 10, 13, 14, 14, 14, 14, 13, 7, 16, 16, 13, 13, 13, 13, 5, 9, 12, 11, 11, 9, 4, 6, 6, 10, 10, 9, 8, 4, 8, 6, 9, 8, 9, 8, 4, 6, 5, 7, 9, 8, 8, 4, 6, 7, 6, 7, 7, 7, 6, 5, 9, 10, 12, 10, 8, 7, 5, 13, 16, 15, 12, 9, 8, 6, 2, 2, 2, 2, 2, 3, 4, 2, 1, 1, 0, 2, 3, 4, 2, 2, 3, 3, 2, 3, 4, 2, 4, 7, 7, 5, 5, 5, 4, 8, 12, 11, 9, 8, 6, 8, 13, 18, 16, 11, 8, 6, 14, 18, 20, 18, 13, 9, 7, 5, 8, 7, 3, 1, 2, 3, 5, 8, 8, 4, 0, 2, 4, 5, 8, 10, 7, 4, 3, 4, 5, 10, 14, 11, 8, 6, 6, 8, 13, 18, 17, 12, 9, 7, 11, 17, 22, 22, 15, 11, 8, 16, 21, 23, 23, 18, 12, 8, 22, 25, 28, 31, 32, 29, 26, 21, 23, 27, 31, 32, 27, 25, 19, 23, 26, 29, 32, 29, 27, 19, 23, 26, 30, 32, 30, 27, 20, 22, 26, 29, 32, 31, 28, 19, 22, 25, 29, 32, 30, 27, 17, 20, 24, 27, 31, 31, 27, 20, 23, 26, 29, 28, 24, 21, 18, 22, 25, 28, 27, 24, 21, 18, 20, 24, 27, 27, 26, 21, 17, 21, 25, 27, 26, 25, 22, 19, 21, 24, 26, 26, 26, 22, 16, 20, 22, 25, 26, 26, 23, 16, 18, 21, 24, 25, 24, 22, 18, 20, 21, 22, 23, 19, 15, 17, 19, 21, 21, 21, 20, 15, 17, 19, 20, 20, 20, 20, 15, 15, 19, 20, 20, 21, 20, 16, 14, 19, 20, 20, 20, 19, 16, 12, 17, 18, 19, 19, 18, 16, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, 15, 16, 13, 4, 14, 14, 14, 14, 14, 12, 5, 12, 14, 13, 14, 13, 12, 8, 8, 14, 14, 13, 13, 12, 10, 10, 13, 13, 13, 12, 11, 7, 12, 12, 11, 11, 11, 11, 5, 17, 18, 14, 10, 10, 10, 5, 7, 8, 7, 7, 7, 3, 4, 3, 7, 6, 6, 6, 3, 5, 3, 6, 5, 6, 5, 3, 4, 3, 4, 5, 5, 5, 4, 4, 5, 7, 8, 8, 8, 7, 5, 9, 13, 14, 12, 9, 7, 6, 15, 18, 18, 13, 11, 8, 6, 1, 2, 2, 2, 2, 2, 3, 2, 3, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 2, 3, 2, 6, 8, 7, 6, 5, 5, 6, 10, 13, 12, 10, 8, 6, 11, 16, 19, 16, 12, 9, 7, 16, 20, 21, 18, 14, 10, 7, 6, 7, 5, 3, 1, 2, 2, 6, 7, 7, 3, 2, 2, 3, 5, 7, 8, 5, 4, 3, 3, 6, 8, 12, 10, 8, 7, 7, 9, 12, 16, 16, 13, 10, 7, 13, 17, 20, 21, 15, 12, 8, 18, 21, 21, 21, 17, 13, 9, 17, 21, 24, 28, 28, 26, 22, 17, 19, 24, 28, 28, 24, 21, 15, 19, 22, 25, 27, 25, 22, 15, 18, 21, 25, 29, 26, 22, 15, 18, 21, 24, 28, 26, 23, 14, 17, 20, 24, 28, 26, 23, 15, 16, 19, 23, 25, 27, 23, 16, 19, 22, 25, 24, 22, 18, 14, 18, 21, 23, 23, 21, 16, 13, 16, 20, 22, 22, 20, 18, 13, 16, 20, 23, 22, 22, 19, 13, 16, 19, 22, 22, 21, 19, 12, 14, 18, 21, 21, 21, 19, 17, 16, 17, 19, 20, 20, 18, 14, 16, 17, 18, 19, 17, 13, 13, 15, 16, 17, 17, 16, 12, 12, 14, 15, 16, 16, 16, 12, 11, 14, 16, 16, 16, 16, 13, 11, 14, 15, 15, 15, 15, 13, 12, 13, 14, 14, 14, 14, 13, 19, 18, 14, 13, 13, 13, 12, 12, 11, 10, 11, 12, 12, 4, 11, 10, 10, 10, 10, 10, 3, 9, 9, 9, 9, 9, 9, 4, 6, 9, 9, 9, 9, 9, 7, 7, 8, 8, 8, 8, 7, 4, 12, 14, 12, 10, 8, 7, 4, 18, 20, 14, 12, 9, 7, 5, 4, 3, 3, 3, 4, 3, 4, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 2, 2, 2, 3, 1, 5, 5, 5, 5, 4, 4, 5, 10, 9, 9, 9, 7, 5, 12, 15, 16, 13, 10, 8, 6, 17, 20, 18, 14, 11, 9, 6, 4, 5, 3, 3, 2, 2, 3, 4, 6, 4, 3, 2, 0, 2, 4, 7, 5, 5, 3, 3, 2, 4, 8, 9, 8, 7, 6, 5, 8, 12, 14, 13, 11, 9, 6, 12, 16, 20, 17, 12, 10, 7, 18, 21, 21, 19, 14, 11, 8, 8, 10, 6, 4, 3, 2, 2, 8, 10, 8, 5, 3, 2, 1, 8, 10, 10, 7, 5, 4, 3, 9, 10, 14, 11, 9, 8, 7, 10, 14, 17, 16, 14, 11, 8, 14, 18, 21, 21, 16, 12, 9, 19, 21, 23, 22, 18, 13, 10, 14, 16, 21, 24, 24, 21, 18, 13, 16, 19, 23, 24, 20, 17, 11, 14, 18, 21, 23, 20, 18, 10, 14, 18, 21, 24, 21, 18, 11, 14, 17, 20, 24, 22, 18, 10, 13, 16, 19, 23, 22, 18, 15, 14, 15, 18, 22, 21, 18, 11, 14, 18, 21, 20, 17, 14, 11, 14, 17, 20, 20, 16, 13, 9, 12, 15, 18, 18, 16, 14, 9, 12, 15, 18, 17, 17, 14, 9, 12, 15, 17, 17, 17, 14, 11, 12, 13, 16, 16, 16, 14, 18, 16, 14, 15, 15, 15, 14, 10, 12, 14, 14, 16, 13, 9, 9, 11, 12, 13, 13, 12, 8, 7, 10, 12, 11, 11, 12, 8, 7, 10, 11, 11, 11, 11, 9, 6, 9, 11, 11, 10, 10, 9, 13, 13, 12, 10, 9, 9, 9, 19, 17, 15, 11, 9, 8, 8, 8, 7, 6, 7, 8, 9, 3, 7, 6, 6, 6, 6, 6, 2, 6, 5, 5, 5, 4, 4, 2, 4, 5, 4, 4, 4, 4, 4, 7, 8, 8, 7, 7, 6, 4, 14, 15, 13, 11, 8, 7, 5, 19, 20, 15, 12, 9, 7, 6, 2, 2, 1, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 3, 6, 6, 6, 6, 5, 5, 7, 11, 11, 10, 9, 8, 5, 13, 16, 16, 13, 11, 9, 7, 19, 20, 19, 15, 12, 10, 7, 7, 6, 4, 3, 3, 3, 3, 7, 7, 5, 4, 3, 2, 0, 7, 9, 6, 6, 4, 3, 3, 7, 10, 10, 10, 8, 7, 6, 9, 14, 16, 15, 12, 10, 7, 15, 18, 22, 20, 14, 10, 8, 19, 21, 23, 21, 16, 12, 9, 10, 12, 9, 5, 3, 3, 2, 10, 12, 11, 6, 3, 2, 2, 10, 12, 13, 9, 6, 5, 4, 10, 13, 17, 13, 11, 9, 8, 13, 16, 21, 20, 16, 12, 9, 16, 21, 25, 24, 18, 13, 10, 20, 23, 25, 26, 20, 15, 11, 24, 26, 29, 32, 32, 30, 26, 23, 25, 28, 31, 31, 29, 26, 22, 24, 27, 29, 31, 28, 26, 20, 23, 26, 29, 30, 29, 27, 20, 23, 26, 29, 31, 28, 27, 19, 22, 24, 27, 30, 29, 26, 16, 20, 24, 26, 29, 29, 27, 22, 24, 27, 29, 28, 26, 23, 21, 24, 27, 29, 27, 25, 24, 19, 23, 25, 27, 27, 25, 23, 18, 21, 25, 27, 25, 25, 25, 18, 21, 24, 27, 26, 25, 25, 16, 19, 23, 25, 25, 25, 24, 13, 16, 20, 24, 24, 25, 24, 19, 23, 23, 24, 25, 23, 19, 18, 21, 22, 23, 24, 22, 20, 17, 20, 22, 22, 22, 23, 19, 15, 19, 21, 21, 22, 22, 20, 14, 19, 19, 20, 21, 22, 20, 11, 17, 18, 19, 20, 20, 19, 13, 14, 16, 17, 18, 19, 19, 17, 17, 17, 18, 18, 18, 7, 15, 16, 16, 16, 17, 16, 8, 13, 15, 15, 15, 15, 15, 10, 9, 14, 14, 14, 14, 14, 12, 9, 12, 12, 13, 13, 14, 8, 10, 10, 10, 11, 11, 12, 6, 13, 13, 9, 9, 10, 10, 6, 8, 8, 9, 10, 10, 6, 8, 4, 7, 7, 8, 8, 6, 9, 4, 6, 6, 5, 6, 5, 8, 4, 4, 4, 4, 5, 5, 6, 5, 4, 4, 4, 4, 3, 6, 7, 7, 7, 6, 4, 3, 5, 10, 10, 8, 6, 4, 3, 4, 0, 2, 2, 2, 2, 5, 7, 0, 3, 2, 2, 2, 4, 8, 0, 4, 2, 2, 1, 4, 6, 0, 3, 3, 2, 1, 2, 5, 2, 3, 5, 5, 3, 3, 4, 5, 6, 9, 8, 5, 3, 3, 8, 9, 10, 9, 6, 4, 3, 4, 7, 6, 3, 2, 3, 6, 4, 7, 8, 4, 2, 2, 5, 4, 7, 9, 4, 2, 0, 5, 4, 7, 10, 6, 3, 2, 3, 4, 7, 10, 9, 5, 4, 3, 5, 9, 12, 11, 7, 4, 3, 7, 11, 12, 12, 8, 5, 3, 30, 32, 35, 39, 38, 37, 32, 28, 32, 34, 37, 39, 36, 33, 27, 31, 33, 37, 38, 36, 32, 26, 29, 32, 35, 38, 37, 34, 25, 28, 33, 36, 38, 37, 35, 24, 27, 31, 35, 38, 37, 35, 22, 25, 31, 34, 36, 37, 34, 27, 31, 33, 36, 36, 32, 29, 26, 29, 33, 35, 34, 32, 28, 24, 28, 32, 34, 35, 33, 30, 24, 27, 31, 34, 34, 33, 30, 23, 26, 29, 33, 32, 33, 30, 21, 25, 29, 32, 32, 33, 30, 19, 22, 27, 30, 31, 31, 30, 24, 28, 28, 29, 30, 28, 23, 23, 27, 28, 29, 29, 28, 22, 22, 25, 27, 28, 28, 28, 23, 20, 25, 26, 27, 28, 27, 25, 17, 24, 25, 26, 26, 26, 24, 14, 23, 24, 24, 25, 26, 24, 15, 19, 21, 23, 24, 25, 23, 22, 23, 23, 23, 23, 21, 11, 19, 21, 21, 21, 22, 20, 12, 16, 20, 20, 20, 20, 19, 13, 12, 20, 19, 20, 19, 19, 16, 13, 17, 18, 19, 19, 18, 12, 13, 15, 16, 17, 17, 17, 9, 15, 13, 14, 15, 16, 16, 8, 10, 14, 14, 14, 14, 9, 11, 7, 12, 13, 13, 12, 9, 12, 7, 11, 11, 11, 11, 7, 10, 7, 8, 10, 10, 10, 8, 9, 8, 6, 9, 8, 9, 6, 8, 9, 8, 8, 7, 7, 4, 7, 11, 10, 9, 7, 5, 3, 6, 4, 3, 4, 4, 6, 8, 10, 4, 2, 2, 2, 4, 7, 9, 4, 0, 1, 1, 3, 6, 8, 4, 1, 2, 1, 2, 4, 7, 4, 3, 4, 4, 4, 3, 7, 6, 6, 8, 6, 5, 4, 5, 8, 9, 9, 6, 5, 4, 4, 2, 5, 3, 2, 3, 6, 9, 2, 5, 4, 3, 2, 5, 9, 2, 5, 5, 3, 0, 4, 7, 2, 5, 6, 2, 2, 3, 5, 2, 4, 7, 5, 4, 4, 4, 5, 6, 8, 8, 5, 4, 4, 8, 8, 9, 9, 6, 5, 4, 29, 33, 36, 39, 39, 36, 33, 28, 31, 34, 38, 38, 36, 32, 26, 29, 34, 37, 38, 35, 32, 25, 28, 31, 36, 39, 36, 33, 25, 29, 31, 36, 39, 37, 34, 24, 27, 30, 34, 38, 37, 33, 22, 26, 29, 33, 36, 37, 33, 26, 29, 34, 36, 34, 32, 29, 25, 29, 32, 36, 35, 32, 27, 24, 27, 30, 34, 34, 31, 28, 23, 26, 30, 33, 33, 32, 28, 24, 27, 30, 32, 32, 31, 29, 22, 25, 29, 32, 32, 32, 29, 19, 23, 27, 30, 30, 30, 28, 24, 27, 28, 29, 30, 26, 22, 23, 25, 28, 28, 28, 27, 21, 22, 25, 27, 26, 27, 26, 21, 18, 25, 25, 25, 26, 25, 21, 16, 24, 25, 25, 26, 25, 22, 13, 22, 24, 24, 24, 24, 22, 15, 20, 22, 23, 23, 23, 20, 22, 22, 22, 22, 23, 19, 10, 18, 20, 21, 22, 21, 18, 11, 15, 20, 20, 20, 19, 17, 12, 11, 19, 19, 19, 18, 16, 15, 13, 17, 18, 18, 19, 16, 11, 13, 15, 16, 16, 16, 15, 8, 15, 14, 14, 15, 15, 14, 6, 10, 14, 14, 14, 12, 6, 10, 7, 13, 12, 13, 11, 6, 11, 7, 11, 11, 11, 10, 5, 8, 7, 8, 10, 10, 9, 5, 8, 8, 6, 9, 9, 8, 5, 6, 9, 8, 9, 7, 7, 5, 6, 11, 12, 12, 9, 6, 5, 5, 3, 4, 4, 5, 4, 5, 7, 3, 2, 2, 3, 3, 5, 6, 3, 1, 0, 0, 3, 5, 7, 2, 2, 4, 4, 2, 4, 5, 4, 5, 9, 8, 8, 5, 5, 6, 10, 15, 13, 10, 6, 4, 10, 14, 17, 15, 11, 8, 4, 2, 8, 8, 2, 3, 4, 6, 2, 8, 10, 4, 2, 4, 6, 2, 8, 12, 5, 1, 3, 5, 2, 9, 14, 9, 5, 4, 5, 5, 11, 16, 14, 10, 8, 4, 8, 14, 19, 18, 13, 9, 5, 13, 18, 19, 19, 15, 10, 6, 28, 32, 36, 38, 38, 35, 33, 27, 30, 35, 37, 39, 36, 31, 26, 29, 33, 36, 39, 34, 32, 24, 27, 31, 35, 37, 35, 32, 25, 27, 31, 35, 37, 36, 33, 23, 26, 30, 33, 37, 35, 33, 21, 25, 29, 31, 35, 35, 32, 25, 29, 33, 37, 35, 31, 27, 25, 29, 31, 36, 34, 32, 27, 24, 26, 31, 33, 33, 30, 26, 23, 25, 29, 32, 32, 30, 26, 22, 25, 29, 32, 32, 31, 26, 21, 25, 27, 31, 30, 29, 27, 19, 22, 26, 30, 29, 28, 27, 24, 26, 29, 29, 30, 27, 20, 22, 25, 28, 28, 28, 26, 20, 21, 23, 26, 26, 26, 24, 19, 18, 25, 25, 24, 25, 23, 19, 16, 23, 24, 24, 24, 23, 20, 13, 22, 23, 23, 23, 23, 20, 15, 20, 21, 21, 21, 22, 18, 20, 21, 21, 22, 23, 18, 11, 18, 20, 20, 21, 21, 17, 11, 14, 19, 18, 19, 18, 15, 12, 11, 18, 18, 17, 18, 15, 14, 12, 16, 17, 17, 17, 14, 11, 13, 15, 16, 16, 16, 13, 7, 14, 14, 14, 14, 15, 13, 5, 9, 14, 13, 15, 12, 7, 11, 6, 13, 12, 13, 12, 6, 11, 6, 10, 11, 10, 9, 4, 7, 6, 7, 10, 9, 8, 4, 7, 8, 6, 8, 8, 7, 4, 4, 9, 8, 9, 8, 6, 4, 4, 11, 12, 12, 9, 6, 5, 4, 2, 4, 4, 5, 4, 6, 8, 2, 2, 2, 3, 3, 5, 6, 2, 1, 0, 0, 3, 3, 5, 2, 2, 4, 4, 2, 3, 4, 4, 5, 9, 8, 7, 5, 4, 6, 10, 15, 13, 9, 6, 4, 10, 14, 16, 15, 10, 7, 4, 3, 7, 6, 2, 3, 5, 6, 3, 7, 7, 4, 2, 3, 4, 3, 7, 8, 5, 1, 2, 4, 3, 8, 11, 9, 4, 4, 4, 5, 11, 15, 14, 9, 7, 4, 8, 14, 19, 19, 12, 8, 5, 13, 17, 20, 20, 14, 9, 6, 24, 29, 32, 35, 36, 33, 29, 23, 27, 31, 34, 35, 32, 28, 22, 25, 28, 33, 34, 31, 27, 20, 22, 26, 30, 32, 30, 28, 21, 23, 26, 30, 34, 31, 27, 20, 22, 26, 29, 33, 31, 27, 17, 21, 24, 27, 31, 32, 28, 22, 25, 30, 33, 31, 28, 25, 21, 23, 27, 31, 32, 28, 23, 20, 22, 27, 29, 28, 26, 22, 19, 21, 24, 27, 27, 26, 22, 20, 21, 24, 27, 27, 27, 22, 18, 20, 23, 25, 26, 26, 23, 14, 18, 22, 25, 25, 24, 22, 20, 23, 24, 25, 27, 23, 19, 19, 21, 24, 24, 25, 22, 17, 18, 21, 22, 22, 22, 21, 16, 16, 20, 21, 21, 21, 21, 16, 14, 20, 20, 20, 20, 19, 16, 11, 17, 19, 19, 19, 19, 16, 14, 15, 17, 17, 18, 18, 15, 18, 18, 17, 18, 19, 17, 9, 15, 16, 16, 17, 17, 15, 9, 12, 16, 15, 15, 14, 12, 8, 9, 16, 14, 13, 13, 12, 11, 10, 14, 13, 13, 12, 11, 8, 11, 11, 11, 11, 11, 10, 4, 14, 14, 10, 10, 10, 10, 3, 7, 9, 10, 10, 10, 6, 9, 4, 9, 8, 9, 9, 4, 9, 4, 7, 6, 6, 6, 3, 5, 4, 6, 6, 5, 5, 2, 4, 6, 5, 5, 5, 5, 4, 3, 7, 10, 11, 9, 6, 5, 3, 12, 14, 14, 10, 8, 6, 4, 1, 1, 1, 2, 4, 5, 7, 1, 2, 2, 2, 3, 3, 4, 1, 3, 4, 3, 0, 2, 4, 1, 5, 5, 4, 4, 3, 3, 3, 7, 10, 9, 8, 6, 4, 8, 12, 16, 13, 9, 6, 4, 13, 16, 18, 15, 11, 7, 5, 5, 6, 5, 3, 2, 4, 5, 4, 6, 6, 4, 2, 2, 3, 4, 6, 7, 3, 2, 1, 2, 4, 7, 9, 7, 6, 4, 4, 6, 9, 13, 13, 10, 7, 5, 10, 14, 17, 17, 13, 9, 6, 15, 18, 18, 18, 14, 10, 6, 20, 24, 28, 32, 32, 29, 25, 19, 23, 26, 31, 31, 28, 24, 17, 21, 25, 28, 30, 26, 23, 17, 19, 23, 26, 29, 26, 23, 16, 18, 21, 25, 29, 27, 23, 15, 18, 21, 24, 27, 26, 23, 12, 16, 19, 23, 26, 27, 23, 17, 21, 25, 29, 28, 24, 21, 16, 20, 24, 28, 27, 24, 20, 16, 18, 23, 25, 25, 21, 18, 15, 17, 20, 23, 22, 22, 19, 14, 17, 20, 22, 22, 22, 18, 12, 16, 18, 21, 21, 21, 18, 13, 14, 17, 20, 20, 20, 19, 15, 18, 21, 22, 23, 20, 16, 14, 17, 19, 21, 21, 19, 15, 14, 16, 18, 18, 18, 18, 13, 13, 16, 16, 16, 16, 16, 13, 12, 15, 16, 16, 16, 15, 13, 10, 12, 14, 14, 14, 14, 13, 15, 15, 12, 12, 13, 13, 12, 14, 13, 13, 14, 15, 15, 7, 13, 12, 12, 13, 13, 13, 6, 10, 11, 11, 10, 10, 10, 5, 6, 10, 9, 9, 9, 9, 7, 7, 9, 8, 8, 8, 8, 4, 10, 10, 9, 7, 7, 7, 2, 15, 16, 11, 8, 6, 5, 3, 5, 5, 6, 6, 7, 6, 7, 1, 3, 4, 5, 5, 4, 6, 1, 2, 2, 2, 2, 2, 3, 1, 3, 2, 2, 2, 2, 2, 4, 7, 7, 6, 6, 4, 2, 9, 12, 12, 10, 7, 5, 3, 14, 16, 15, 11, 9, 6, 4, 3, 4, 3, 3, 3, 5, 6, 3, 5, 4, 3, 3, 3, 3, 3, 6, 5, 4, 2, 0, 2, 4, 6, 6, 5, 4, 3, 3, 6, 9, 11, 10, 8, 6, 4, 10, 13, 16, 14, 10, 7, 4, 14, 16, 18, 15, 11, 8, 5, 7, 8, 7, 4, 3, 4, 4, 6, 8, 8, 5, 3, 2, 2, 7, 8, 9, 5, 3, 2, 1, 7, 8, 11, 8, 6, 5, 4, 8, 11, 14, 14, 11, 8, 5, 12, 15, 18, 18, 13, 9, 6, 16, 18, 19, 19, 14, 10, 7, 17, 20, 25, 28, 28, 26, 21, 15, 19, 23, 27, 28, 25, 20, 14, 18, 21, 25, 27, 22, 19, 12, 16, 19, 22, 24, 22, 19, 12, 14, 17, 21, 24, 23, 19, 10, 14, 16, 20, 23, 22, 19, 11, 12, 15, 19, 22, 22, 19, 14, 17, 22, 25, 24, 22, 17, 13, 16, 20, 24, 23, 20, 16, 12, 15, 19, 21, 21, 18, 15, 10, 13, 16, 18, 19, 17, 14, 10, 13, 15, 18, 18, 18, 15, 9, 11, 14, 17, 17, 17, 14, 13, 12, 13, 15, 16, 16, 14, 12, 15, 16, 18, 19, 17, 13, 10, 13, 16, 16, 17, 16, 12, 9, 12, 14, 14, 14, 14, 10, 8, 11, 12, 12, 12, 12, 10, 7, 10, 11, 11, 11, 11, 10, 11, 10, 10, 10, 10, 10, 9, 14, 13, 10, 9, 9, 9, 8, 9, 9, 10, 11, 12, 13, 7, 8, 8, 9, 9, 10, 10, 5, 7, 6, 7, 7, 6, 7, 3, 4, 6, 5, 5, 5, 5, 4, 6, 6, 5, 4, 5, 4, 2, 11, 11, 9, 7, 5, 4, 2, 14, 14, 10, 8, 6, 4, 3, 0, 1, 2, 3, 4, 5, 6, 2, 2, 2, 3, 3, 3, 4, 2, 3, 3, 2, 2, 1, 2, 2, 6, 4, 3, 3, 3, 2, 6, 9, 8, 7, 6, 5, 2, 10, 12, 12, 9, 7, 6, 3, 13, 14, 14, 11, 8, 6, 4, 6, 6, 5, 4, 4, 4, 6, 6, 8, 6, 4, 3, 2, 3, 6, 8, 7, 5, 3, 2, 0, 6, 9, 8, 6, 5, 4, 3, 8, 11, 13, 11, 9, 6, 4, 11, 14, 17, 15, 10, 7, 5, 14, 16, 18, 16, 12, 8, 6, 9, 10, 8, 6, 4, 4, 4, 10, 10, 10, 6, 4, 2, 2, 9, 10, 11, 6, 4, 3, 2, 9, 11, 14, 10, 7, 6, 5, 10, 13, 17, 15, 11, 8, 6, 13, 16, 20, 19, 13, 9, 6, 16, 19, 20, 20, 15, 11, 7, 24, 27, 29, 31, 31, 31, 27, 23, 26, 28, 31, 32, 28, 27, 21, 24, 27, 30, 31, 28, 25, 20, 24, 27, 29, 30, 29, 27, 20, 23, 26, 28, 30, 28, 26, 18, 22, 24, 27, 31, 29, 26, 16, 20, 24, 26, 29, 28, 26, 21, 24, 28, 29, 28, 26, 23, 21, 23, 25, 28, 28, 26, 23, 19, 23, 26, 28, 26, 26, 24, 18, 21, 25, 26, 26, 26, 25, 17, 21, 24, 26, 25, 26, 24, 16, 19, 22, 25, 26, 25, 24, 13, 16, 21, 24, 24, 25, 24, 19, 23, 24, 24, 25, 23, 20, 18, 21, 22, 23, 23, 23, 19, 17, 21, 22, 22, 22, 23, 19, 15, 20, 21, 21, 22, 22, 20, 14, 18, 20, 20, 21, 21, 20, 11, 16, 18, 19, 20, 20, 20, 13, 14, 16, 17, 18, 19, 19, 17, 17, 18, 18, 18, 18, 8, 15, 15, 16, 17, 17, 16, 9, 13, 15, 15, 15, 15, 15, 10, 9, 13, 14, 14, 15, 15, 12, 9, 12, 13, 13, 13, 14, 8, 10, 10, 10, 11, 11, 12, 6, 13, 13, 9, 9, 10, 11, 6, 8, 8, 9, 9, 10, 6, 8, 4, 7, 8, 8, 8, 6, 9, 4, 6, 5, 6, 6, 5, 7, 4, 4, 4, 4, 5, 5, 7, 5, 4, 4, 4, 4, 3, 6, 7, 7, 7, 6, 4, 3, 5, 10, 10, 8, 6, 4, 3, 4, 0, 2, 2, 2, 2, 5, 7, 0, 3, 2, 2, 2, 4, 8, 0, 4, 3, 2, 1, 4, 6, 0, 3, 3, 2, 1, 2, 5, 2, 3, 5, 5, 3, 3, 4, 5, 6, 9, 8, 4, 3, 3, 8, 9, 10, 9, 6, 4, 3, 4, 7, 6, 3, 2, 3, 6, 4, 7, 8, 4, 2, 2, 5, 4, 7, 9, 4, 2, 0, 5, 4, 7, 10, 6, 3, 2, 3, 4, 7, 11, 9, 5, 3, 3, 5, 9, 12, 12, 7, 4, 3, 7, 10, 12, 13, 8, 5, 3, 30, 34, 37, 40, 39, 38, 34, 29, 34, 37, 40, 40, 38, 34, 28, 32, 35, 39, 38, 38, 34, 27, 29, 34, 37, 39, 36, 33, 25, 28, 32, 35, 39, 37, 33, 23, 28, 31, 34, 38, 37, 34, 21, 25, 29, 33, 36, 36, 34, 28, 32, 35, 37, 37, 34, 31, 26, 31, 34, 37, 36, 33, 31, 25, 29, 33, 34, 35, 33, 30, 24, 28, 31, 33, 33, 33, 30, 23, 26, 29, 32, 33, 32, 30, 20, 24, 28, 31, 32, 32, 30, 18, 22, 26, 30, 30, 30, 28, 25, 30, 32, 32, 32, 30, 25, 24, 27, 30, 31, 32, 30, 25, 22, 26, 28, 29, 29, 28, 24, 20, 25, 26, 27, 27, 27, 24, 16, 23, 25, 26, 26, 27, 24, 13, 22, 24, 23, 25, 25, 24, 13, 18, 21, 22, 23, 23, 22, 23, 24, 24, 25, 26, 23, 14, 19, 22, 22, 23, 23, 22, 14, 16, 21, 21, 21, 23, 20, 15, 12, 19, 19, 19, 19, 18, 15, 12, 17, 18, 18, 18, 17, 12, 12, 14, 15, 16, 16, 16, 9, 14, 12, 13, 14, 15, 15, 7, 10, 15, 16, 16, 15, 11, 13, 7, 13, 14, 15, 14, 10, 13, 7, 11, 12, 12, 12, 8, 12, 7, 8, 10, 10, 10, 7, 8, 7, 5, 8, 8, 8, 5, 8, 8, 7, 6, 6, 6, 3, 8, 10, 9, 8, 6, 4, 3, 6, 3, 5, 6, 6, 7, 9, 11, 3, 3, 4, 4, 6, 8, 10, 3, 1, 2, 2, 4, 6, 9, 3, 0, 2, 2, 2, 5, 7, 3, 2, 3, 3, 3, 3, 6, 5, 5, 7, 5, 3, 3, 4, 7, 8, 7, 5, 4, 3, 3, 2, 4, 4, 2, 5, 7, 10, 2, 4, 5, 3, 4, 6, 9, 2, 5, 6, 3, 2, 5, 6, 2, 4, 5, 3, 1, 2, 5, 2, 4, 6, 5, 3, 3, 3, 4, 5, 7, 7, 4, 3, 3, 7, 7, 8, 9, 5, 3, 3, 33, 36, 41, 43, 44, 41, 38, 31, 35, 39, 43, 44, 41, 37, 30, 35, 37, 41, 43, 38, 35, 29, 33, 35, 39, 41, 38, 34, 27, 29, 33, 38, 40, 37, 33, 25, 28, 32, 36, 40, 38, 34, 23, 26, 32, 34, 37, 38, 35, 30, 34, 38, 40, 40, 37, 33, 29, 33, 36, 40, 40, 37, 32, 26, 32, 35, 39, 38, 35, 32, 26, 29, 32, 36, 35, 33, 31, 25, 27, 30, 34, 34, 33, 29, 22, 26, 29, 33, 32, 32, 30, 19, 24, 27, 31, 31, 32, 29, 27, 31, 34, 34, 34, 32, 27, 26, 29, 32, 33, 33, 32, 26, 24, 28, 30, 31, 31, 30, 24, 20, 27, 27, 28, 28, 27, 23, 16, 25, 26, 27, 27, 26, 23, 13, 24, 24, 25, 25, 26, 23, 14, 21, 23, 23, 24, 24, 22, 23, 25, 26, 27, 28, 25, 17, 20, 24, 25, 26, 25, 22, 16, 15, 23, 23, 23, 23, 21, 17, 12, 20, 20, 20, 19, 18, 16, 12, 17, 19, 19, 19, 16, 13, 13, 14, 17, 17, 17, 16, 9, 14, 12, 15, 16, 16, 15, 7, 11, 17, 18, 19, 17, 12, 16, 8, 15, 16, 17, 16, 10, 16, 8, 12, 14, 14, 13, 8, 12, 8, 8, 11, 11, 10, 7, 9, 8, 5, 10, 10, 9, 5, 6, 8, 7, 7, 7, 7, 4, 8, 10, 9, 8, 6, 6, 3, 5, 3, 7, 8, 9, 8, 10, 13, 3, 5, 6, 7, 7, 9, 10, 3, 2, 4, 4, 5, 6, 8, 3, 2, 0, 0, 3, 6, 6, 3, 2, 5, 5, 4, 3, 5, 5, 6, 11, 10, 6, 3, 5, 7, 11, 13, 11, 8, 4, 4, 1, 7, 7, 4, 7, 9, 10, 1, 7, 9, 3, 6, 7, 9, 1, 7, 11, 4, 3, 5, 6, 1, 7, 11, 6, 1, 2, 5, 1, 7, 12, 10, 7, 4, 3, 4, 10, 13, 13, 10, 5, 3, 9, 13, 14, 15, 11, 7, 3, 33, 36, 40, 42, 44, 41, 37, 30, 34, 38, 44, 43, 40, 35, 29, 33, 38, 41, 42, 38, 34, 28, 31, 35, 37, 40, 37, 32, 26, 28, 32, 35, 39, 36, 33, 25, 27, 30, 34, 38, 36, 33, 23, 26, 30, 33, 36, 36, 33, 29, 33, 36, 41, 38, 36, 32, 28, 32, 36, 39, 38, 35, 31, 26, 30, 33, 37, 36, 33, 29, 25, 27, 32, 34, 34, 31, 28, 24, 26, 30, 32, 33, 32, 28, 22, 25, 28, 31, 31, 31, 28, 18, 23, 27, 29, 30, 30, 27, 27, 31, 33, 33, 34, 31, 25, 25, 28, 31, 32, 32, 30, 23, 22, 27, 29, 30, 30, 28, 22, 19, 25, 26, 26, 27, 26, 21, 15, 25, 25, 26, 25, 24, 21, 12, 23, 24, 24, 24, 23, 21, 13, 20, 21, 22, 23, 22, 19, 22, 24, 25, 25, 27, 23, 16, 18, 22, 24, 24, 24, 21, 15, 14, 21, 23, 22, 21, 18, 15, 12, 19, 19, 19, 19, 15, 15, 12, 16, 19, 18, 17, 14, 12, 13, 14, 16, 16, 16, 14, 8, 13, 12, 14, 15, 15, 14, 5, 10, 17, 17, 18, 16, 12, 16, 7, 15, 16, 16, 15, 9, 16, 7, 11, 14, 13, 12, 7, 11, 7, 7, 11, 10, 9, 4, 7, 7, 5, 10, 9, 8, 3, 5, 8, 7, 7, 7, 7, 3, 5, 10, 9, 8, 5, 5, 2, 4, 2, 7, 8, 8, 8, 10, 13, 2, 5, 6, 7, 7, 8, 10, 2, 1, 4, 4, 4, 5, 6, 2, 2, 0, 0, 2, 4, 5, 3, 2, 5, 5, 4, 2, 4, 5, 6, 11, 10, 6, 3, 3, 7, 10, 13, 12, 7, 4, 3, 2, 6, 6, 4, 7, 9, 10, 1, 6, 7, 3, 6, 6, 7, 1, 6, 8, 4, 2, 3, 5, 1, 6, 8, 5, 1, 2, 3, 1, 7, 11, 11, 6, 4, 3, 4, 10, 15, 15, 9, 5, 2, 9, 13, 16, 16, 11, 6, 3, 28, 32, 36, 40, 41, 36, 33, 27, 31, 35, 39, 40, 35, 32, 26, 29, 34, 36, 39, 35, 30, 24, 27, 31, 34, 36, 32, 29, 22, 25, 28, 31, 34, 32, 29, 21, 24, 26, 30, 33, 32, 29, 19, 22, 25, 28, 33, 31, 29, 26, 29, 34, 37, 35, 33, 29, 25, 28, 32, 36, 35, 32, 28, 23, 27, 31, 34, 33, 30, 25, 22, 25, 28, 30, 30, 28, 24, 20, 22, 25, 28, 28, 27, 23, 19, 22, 24, 27, 27, 27, 24, 16, 19, 23, 26, 25, 26, 24, 23, 26, 29, 29, 31, 28, 23, 22, 26, 28, 28, 29, 26, 21, 20, 23, 26, 25, 26, 25, 19, 17, 22, 22, 22, 23, 22, 18, 13, 21, 21, 21, 21, 21, 17, 11, 19, 20, 20, 20, 19, 17, 12, 17, 18, 19, 19, 19, 16, 20, 21, 22, 22, 24, 22, 15, 16, 20, 20, 21, 22, 19, 13, 13, 18, 19, 18, 18, 16, 13, 10, 16, 15, 15, 15, 13, 12, 9, 14, 15, 14, 14, 12, 9, 10, 12, 12, 12, 12, 11, 6, 12, 10, 11, 11, 11, 11, 4, 8, 14, 14, 15, 14, 11, 14, 5, 12, 12, 13, 13, 8, 13, 5, 10, 10, 10, 10, 6, 8, 5, 5, 7, 6, 6, 3, 5, 5, 4, 5, 5, 5, 2, 3, 6, 6, 7, 5, 3, 2, 4, 8, 9, 9, 6, 4, 2, 3, 1, 4, 5, 6, 8, 9, 12, 1, 2, 4, 5, 6, 7, 8, 1, 2, 2, 2, 4, 4, 5, 1, 2, 4, 2, 0, 3, 4, 2, 4, 6, 6, 4, 2, 3, 4, 8, 12, 10, 6, 3, 2, 8, 11, 13, 11, 7, 4, 2, 4, 5, 4, 4, 6, 8, 9, 4, 5, 5, 4, 5, 6, 6, 4, 6, 6, 3, 2, 3, 3, 3, 7, 8, 4, 3, 1, 2, 4, 6, 9, 9, 7, 4, 2, 6, 10, 13, 13, 9, 5, 2, 11, 13, 14, 14, 10, 6, 3, 25, 28, 32, 36, 36, 34, 29, 23, 26, 31, 35, 35, 31, 28, 22, 25, 29, 33, 33, 30, 25, 20, 23, 27, 30, 33, 28, 24, 17, 20, 23, 26, 29, 27, 24, 16, 19, 22, 25, 28, 27, 24, 14, 17, 21, 24, 28, 27, 24, 21, 25, 29, 32, 32, 28, 25, 21, 24, 28, 31, 32, 27, 23, 18, 22, 27, 29, 29, 25, 22, 19, 20, 24, 27, 26, 24, 20, 16, 18, 20, 23, 23, 22, 20, 14, 17, 19, 22, 22, 22, 19, 11, 14, 18, 21, 21, 21, 20, 19, 22, 25, 26, 27, 25, 20, 18, 21, 24, 25, 24, 23, 19, 17, 20, 22, 22, 22, 22, 16, 15, 18, 18, 18, 19, 19, 14, 11, 16, 16, 16, 16, 16, 14, 9, 14, 15, 15, 15, 15, 14, 9, 12, 13, 13, 14, 14, 13, 17, 17, 18, 18, 20, 19, 12, 15, 15, 17, 17, 17, 16, 10, 11, 15, 15, 15, 14, 14, 9, 7, 12, 11, 11, 11, 11, 9, 7, 10, 9, 9, 9, 8, 6, 8, 7, 8, 8, 8, 7, 3, 9, 9, 6, 6, 6, 6, 3, 7, 9, 9, 10, 11, 10, 12, 3, 8, 8, 9, 9, 7, 10, 3, 6, 6, 6, 6, 5, 6, 3, 3, 3, 2, 2, 2, 3, 2, 4, 3, 3, 3, 1, 3, 5, 7, 7, 6, 4, 2, 2, 7, 9, 9, 7, 5, 3, 2, 2, 3, 4, 5, 6, 8, 10, 2, 3, 4, 5, 5, 6, 7, 2, 4, 4, 3, 3, 3, 4, 2, 5, 5, 4, 3, 0, 2, 2, 6, 8, 6, 5, 3, 2, 6, 9, 12, 9, 6, 4, 1, 9, 11, 12, 11, 7, 5, 2, 6, 8, 6, 4, 6, 7, 8, 6, 8, 7, 5, 5, 5, 5, 6, 8, 9, 4, 2, 2, 3, 6, 9, 11, 5, 3, 2, 1, 6, 8, 10, 10, 7, 5, 2, 8, 11, 13, 12, 8, 5, 3, 10, 13, 14, 14, 10, 6, 4, 20, 24, 28, 32, 31, 29, 25, 19, 23, 27, 31, 31, 28, 24, 18, 21, 25, 28, 31, 27, 22, 17, 19, 22, 26, 28, 25, 19, 13, 16, 19, 22, 26, 23, 20, 11, 15, 17, 20, 24, 23, 19, 10, 13, 16, 19, 23, 23, 20, 18, 22, 25, 29, 28, 25, 21, 17, 21, 24, 27, 28, 24, 20, 15, 19, 23, 25, 24, 22, 18, 14, 17, 19, 22, 22, 20, 16, 11, 14, 16, 18, 19, 19, 15, 10, 12, 15, 18, 18, 18, 15, 7, 10, 14, 16, 16, 16, 15, 15, 19, 20, 22, 23, 21, 17, 14, 17, 20, 21, 21, 19, 15, 13, 16, 18, 18, 18, 18, 13, 12, 14, 15, 14, 14, 14, 10, 9, 11, 12, 12, 12, 11, 10, 5, 10, 11, 10, 11, 11, 11, 6, 8, 10, 9, 9, 9, 9, 13, 13, 14, 15, 16, 16, 10, 12, 12, 12, 13, 13, 13, 8, 9, 10, 11, 10, 10, 10, 7, 5, 8, 7, 7, 7, 7, 6, 4, 5, 5, 4, 4, 4, 3, 5, 4, 3, 3, 3, 3, 2, 6, 6, 3, 2, 2, 2, 1, 4, 5, 6, 7, 7, 9, 10, 2, 4, 5, 6, 6, 7, 8, 2, 3, 4, 4, 4, 4, 5, 2, 3, 3, 2, 2, 1, 2, 1, 6, 4, 3, 3, 2, 1, 5, 6, 6, 4, 3, 2, 0, 5, 7, 7, 5, 4, 3, 1, 5, 5, 5, 5, 6, 8, 9, 5, 6, 5, 5, 5, 5, 6, 5, 7, 5, 4, 3, 3, 3, 5, 7, 6, 5, 4, 3, 0, 6, 8, 8, 6, 4, 3, 1, 6, 9, 11, 8, 5, 3, 2, 7, 9, 11, 10, 6, 4, 2, 7, 9, 7, 5, 6, 7, 7, 8, 10, 9, 5, 5, 5, 5, 8, 10, 10, 5, 3, 2, 2, 8, 9, 11, 7, 4, 3, 2, 8, 9, 12, 10, 6, 4, 2, 8, 10, 14, 13, 8, 4, 3, 9, 12, 14, 14, 9, 5, 3, 27, 31, 32, 35, 35, 33, 30, 25, 29, 33, 35, 35, 32, 29, 23, 27, 30, 33, 34, 31, 29, 23, 26, 28, 31, 33, 28, 26, 20, 23, 25, 28, 30, 28, 26, 18, 22, 24, 27, 30, 28, 26, 15, 19, 22, 26, 28, 28, 26, 24, 28, 30, 33, 32, 30, 27, 23, 27, 30, 31, 31, 29, 26, 21, 25, 28, 31, 30, 28, 26, 20, 24, 27, 28, 28, 25, 23, 18, 20, 23, 25, 25, 26, 23, 16, 18, 22, 25, 25, 24, 23, 12, 15, 20, 23, 24, 24, 23, 22, 25, 27, 27, 28, 26, 23, 20, 24, 26, 28, 28, 26, 22, 18, 23, 25, 25, 24, 26, 22, 17, 20, 22, 22, 22, 24, 20, 12, 18, 19, 20, 20, 21, 19, 9, 15, 17, 18, 19, 20, 19, 10, 12, 15, 16, 17, 19, 19, 18, 20, 20, 22, 22, 22, 12, 16, 18, 19, 20, 21, 20, 13, 13, 17, 17, 18, 18, 18, 13, 9, 14, 14, 14, 15, 15, 12, 8, 12, 12, 12, 12, 13, 8, 9, 9, 9, 10, 11, 11, 6, 10, 10, 7, 8, 9, 9, 7, 9, 11, 12, 13, 13, 10, 12, 4, 9, 10, 11, 11, 9, 12, 4, 8, 8, 8, 9, 8, 10, 4, 4, 5, 5, 5, 6, 6, 3, 2, 2, 2, 2, 3, 6, 5, 5, 5, 4, 2, 2, 6, 8, 8, 6, 4, 2, 1, 5, 2, 3, 4, 4, 7, 9, 11, 2, 4, 4, 4, 6, 8, 9, 2, 4, 4, 4, 3, 6, 8, 2, 3, 3, 3, 2, 2, 6, 0, 3, 4, 3, 2, 1, 5, 3, 4, 7, 5, 2, 1, 3, 6, 7, 8, 7, 3, 2, 1, 5, 8, 7, 5, 5, 8, 9, 5, 8, 9, 6, 4, 6, 9, 5, 8, 10, 6, 4, 3, 6, 5, 7, 10, 5, 2, 2, 3, 4, 6, 9, 7, 3, 2, 1, 4, 7, 10, 9, 5, 2, 1, 5, 9, 10, 10, 6, 3, 1, 34, 37, 40, 44, 42, 41, 38, 33, 35, 39, 43, 43, 40, 37, 30, 34, 38, 41, 43, 39, 36, 29, 32, 35, 39, 41, 37, 33, 26, 30, 32, 35, 39, 34, 33, 23, 26, 30, 33, 36, 37, 33, 21, 25, 29, 33, 36, 36, 34, 31, 35, 38, 42, 40, 37, 35, 29, 33, 37, 40, 41, 36, 33, 28, 31, 34, 38, 38, 36, 31, 26, 29, 33, 35, 35, 34, 29, 23, 26, 29, 32, 31, 31, 28, 20, 24, 27, 30, 31, 33, 29, 17, 21, 26, 29, 30, 30, 29, 27, 31, 33, 36, 36, 33, 29, 26, 30, 32, 34, 34, 33, 28, 24, 28, 31, 32, 33, 32, 27, 21, 27, 27, 28, 29, 28, 24, 15, 23, 25, 25, 25, 25, 25, 12, 21, 23, 24, 24, 24, 24, 12, 18, 21, 22, 22, 23, 22, 25, 26, 27, 29, 28, 28, 19, 20, 23, 26, 26, 27, 24, 18, 16, 22, 24, 24, 24, 23, 17, 12, 20, 20, 20, 21, 20, 17, 11, 16, 17, 17, 17, 17, 13, 11, 13, 15, 15, 16, 15, 10, 12, 10, 12, 14, 14, 14, 8, 12, 17, 18, 19, 20, 16, 19, 8, 15, 17, 18, 18, 13, 18, 8, 13, 15, 15, 15, 11, 15, 8, 8, 11, 10, 11, 8, 9, 6, 3, 8, 7, 8, 6, 7, 7, 5, 4, 5, 5, 5, 8, 8, 7, 5, 3, 3, 4, 7, 3, 7, 8, 10, 11, 14, 16, 3, 6, 7, 8, 10, 12, 13, 3, 3, 5, 5, 7, 9, 11, 3, 2, 2, 2, 4, 6, 8, 3, 0, 3, 2, 1, 4, 7, 3, 3, 4, 3, 2, 3, 7, 5, 6, 5, 4, 2, 1, 5, 4, 6, 6, 6, 10, 12, 14, 4, 6, 7, 5, 8, 10, 11, 3, 6, 7, 4, 4, 7, 9, 4, 5, 7, 3, 2, 3, 5, 2, 4, 5, 4, 2, 1, 5, 3, 4, 6, 5, 3, 2, 4, 4, 5, 6, 6, 3, 2, 2, 38, 41, 46, 49, 49, 47, 45, 37, 41, 44, 48, 50, 45, 41, 35, 38, 43, 46, 48, 44, 40, 33, 36, 39, 43, 46, 43, 36, 31, 33, 37, 40, 43, 41, 36, 27, 30, 35, 38, 41, 40, 36, 25, 28, 33, 37, 40, 40, 37, 35, 40, 42, 46, 46, 42, 37, 33, 37, 42, 46, 46, 41, 37, 31, 36, 40, 43, 44, 40, 35, 30, 33, 37, 39, 40, 38, 33, 25, 30, 33, 36, 37, 36, 32, 22, 27, 32, 34, 35, 35, 32, 18, 25, 30, 33, 33, 34, 32, 31, 36, 38, 39, 41, 37, 32, 29, 35, 37, 38, 39, 36, 31, 27, 33, 34, 36, 36, 35, 29, 23, 31, 32, 32, 33, 31, 25, 17, 27, 28, 28, 28, 27, 25, 14, 25, 26, 27, 27, 27, 26, 13, 22, 25, 25, 26, 26, 24, 26, 30, 31, 32, 33, 31, 23, 22, 28, 30, 31, 30, 29, 22, 19, 25, 27, 28, 28, 26, 22, 15, 22, 24, 24, 24, 22, 20, 13, 17, 21, 21, 21, 18, 17, 13, 14, 18, 19, 19, 18, 13, 13, 11, 17, 17, 18, 17, 10, 14, 21, 22, 24, 23, 19, 23, 10, 19, 21, 21, 21, 15, 22, 10, 15, 19, 18, 18, 13, 17, 10, 9, 15, 15, 15, 10, 12, 8, 5, 12, 12, 11, 7, 9, 9, 6, 9, 9, 9, 7, 8, 9, 7, 7, 7, 7, 7, 7, 5, 11, 13, 13, 14, 17, 20, 5, 8, 11, 12, 13, 14, 16, 5, 4, 9, 9, 10, 11, 12, 5, 3, 5, 5, 6, 8, 8, 4, 3, 0, 0, 3, 6, 7, 4, 3, 6, 5, 1, 5, 8, 6, 5, 7, 6, 2, 4, 6, 4, 5, 5, 9, 13, 15, 16, 4, 6, 7, 8, 11, 13, 14, 4, 5, 9, 5, 8, 9, 11, 4, 5, 9, 4, 3, 6, 7, 2, 4, 7, 5, 2, 3, 7, 2, 5, 8, 7, 4, 3, 5, 4, 7, 8, 8, 5, 1, 4, 36, 40, 45, 47, 48, 45, 42, 35, 40, 43, 48, 47, 44, 40, 33, 37, 42, 45, 46, 43, 39, 32, 35, 39, 43, 44, 40, 35, 30, 32, 35, 39, 41, 38, 35, 27, 29, 32, 36, 40, 38, 34, 23, 28, 32, 34, 38, 38, 34, 34, 38, 41, 45, 46, 41, 37, 33, 35, 40, 44, 44, 38, 35, 31, 35, 39, 42, 42, 38, 33, 28, 32, 35, 39, 38, 35, 31, 24, 29, 32, 34, 36, 33, 30, 20, 27, 30, 33, 33, 32, 30, 17, 24, 29, 32, 31, 31, 30, 31, 35, 36, 38, 38, 37, 30, 28, 34, 36, 36, 38, 35, 29, 25, 32, 35, 34, 34, 33, 26, 21, 29, 31, 31, 30, 30, 23, 15, 26, 27, 28, 27, 25, 24, 12, 23, 26, 27, 25, 25, 24, 12, 21, 24, 24, 24, 24, 22, 25, 30, 29, 32, 31, 29, 23, 20, 27, 29, 29, 29, 26, 21, 17, 26, 27, 26, 26, 23, 20, 14, 21, 23, 23, 22, 20, 19, 12, 17, 20, 20, 19, 16, 15, 12, 13, 18, 18, 18, 15, 12, 12, 10, 16, 16, 17, 15, 8, 12, 20, 22, 22, 21, 17, 22, 9, 18, 19, 21, 20, 14, 21, 9, 14, 18, 17, 17, 11, 16, 9, 8, 15, 14, 13, 8, 11, 8, 4, 12, 11, 9, 5, 8, 7, 5, 9, 9, 8, 4, 6, 8, 6, 7, 7, 7, 4, 5, 5, 11, 12, 13, 13, 15, 19, 5, 7, 11, 11, 12, 13, 14, 5, 4, 9, 8, 9, 10, 11, 5, 3, 5, 5, 6, 6, 6, 3, 2, 0, 0, 2, 4, 5, 3, 3, 6, 5, 1, 3, 5, 5, 5, 7, 7, 2, 3, 4, 4, 5, 5, 9, 12, 14, 15, 4, 5, 5, 8, 10, 12, 12, 4, 5, 6, 5, 7, 8, 9, 4, 4, 6, 3, 3, 4, 5, 2, 4, 7, 6, 1, 3, 4, 1, 5, 11, 11, 4, 1, 4, 4, 8, 12, 12, 6, 1, 3, 33, 37, 41, 43, 44, 41, 38, 31, 35, 39, 43, 44, 39, 36, 29, 34, 37, 42, 42, 38, 33, 28, 31, 34, 39, 41, 36, 30, 26, 28, 31, 35, 37, 33, 31, 23, 24, 28, 32, 35, 34, 30, 21, 24, 27, 30, 35, 34, 30, 30, 33, 38, 41, 40, 37, 32, 29, 31, 36, 40, 41, 37, 31, 28, 30, 35, 37, 37, 34, 29, 26, 28, 31, 34, 34, 32, 26, 22, 25, 27, 30, 31, 29, 25, 19, 23, 26, 29, 29, 28, 25, 14, 21, 25, 27, 27, 27, 25, 28, 31, 33, 34, 35, 33, 28, 26, 30, 32, 33, 33, 31, 25, 22, 28, 30, 29, 30, 29, 23, 19, 27, 27, 26, 28, 25, 19, 13, 22, 24, 23, 23, 22, 19, 10, 20, 22, 21, 21, 21, 20, 9, 18, 20, 20, 20, 20, 18, 23, 26, 26, 27, 27, 27, 20, 18, 24, 25, 25, 26, 23, 18, 15, 22, 23, 23, 22, 21, 17, 12, 19, 19, 19, 20, 17, 15, 10, 14, 16, 15, 15, 13, 12, 9, 10, 15, 14, 14, 12, 9, 9, 7, 13, 13, 13, 12, 6, 11, 18, 18, 19, 19, 15, 19, 7, 16, 16, 18, 17, 12, 18, 7, 12, 15, 14, 14, 10, 13, 7, 7, 11, 11, 10, 6, 8, 5, 2, 7, 7, 6, 4, 5, 5, 3, 5, 4, 5, 3, 4, 5, 4, 3, 3, 3, 3, 4, 3, 9, 9, 10, 12, 13, 17, 3, 7, 9, 9, 11, 11, 12, 3, 4, 8, 7, 8, 8, 9, 3, 3, 4, 4, 4, 5, 4, 2, 1, 3, 2, 0, 3, 4, 2, 3, 5, 4, 2, 2, 4, 3, 4, 5, 5, 3, 1, 3, 4, 5, 6, 9, 11, 13, 13, 4, 5, 6, 8, 9, 10, 10, 4, 5, 6, 6, 6, 7, 7, 4, 3, 5, 2, 2, 3, 3, 2, 3, 6, 5, 3, 1, 3, 2, 5, 7, 6, 3, 2, 3, 4, 6, 7, 7, 4, 2, 2, 26, 31, 35, 39, 39, 35, 33, 26, 30, 33, 39, 38, 36, 31, 24, 29, 32, 36, 37, 33, 29, 23, 26, 30, 33, 34, 31, 26, 20, 24, 26, 29, 32, 29, 26, 18, 20, 23, 26, 30, 30, 26, 17, 18, 22, 26, 29, 29, 26, 24, 28, 32, 36, 35, 33, 29, 24, 26, 31, 35, 34, 30, 27, 22, 25, 29, 33, 31, 29, 24, 21, 24, 27, 29, 29, 27, 21, 18, 20, 23, 25, 25, 24, 21, 16, 19, 21, 23, 23, 24, 21, 13, 17, 20, 23, 22, 22, 22, 22, 25, 28, 28, 30, 28, 24, 21, 24, 27, 27, 28, 27, 22, 20, 23, 25, 25, 25, 25, 20, 17, 21, 22, 21, 22, 22, 16, 11, 18, 18, 18, 18, 18, 16, 7, 17, 17, 16, 16, 17, 16, 8, 15, 15, 15, 16, 16, 14, 20, 20, 20, 21, 23, 23, 16, 16, 19, 20, 20, 21, 19, 14, 13, 18, 18, 18, 17, 17, 13, 9, 15, 15, 14, 14, 14, 11, 7, 12, 11, 10, 10, 10, 8, 7, 8, 10, 9, 9, 9, 5, 7, 5, 8, 8, 7, 8, 3, 8, 12, 13, 14, 14, 13, 15, 4, 11, 11, 12, 13, 10, 13, 4, 10, 9, 9, 9, 8, 9, 4, 5, 6, 6, 5, 4, 5, 3, 2, 2, 2, 2, 2, 3, 3, 2, 3, 2, 1, 2, 3, 4, 3, 5, 3, 2, 0, 3, 3, 6, 7, 8, 9, 11, 13, 3, 5, 7, 8, 8, 9, 10, 3, 3, 5, 5, 6, 6, 6, 3, 3, 3, 2, 2, 3, 3, 1, 4, 6, 4, 3, 0, 3, 2, 5, 8, 5, 3, 2, 2, 4, 7, 8, 7, 4, 2, 2, 4, 6, 6, 7, 8, 10, 11, 4, 6, 6, 6, 7, 8, 8, 4, 6, 7, 4, 4, 4, 6, 4, 6, 8, 4, 2, 1, 2, 3, 8, 9, 7, 4, 2, 2, 6, 8, 10, 9, 5, 3, 0, 7, 9, 10, 9, 6, 4, 2, 21, 26, 31, 32, 34, 32, 27, 20, 24, 28, 32, 34, 30, 25, 19, 22, 27, 30, 32, 28, 23, 18, 21, 24, 28, 30, 26, 21, 15, 18, 21, 24, 27, 24, 21, 13, 15, 18, 21, 24, 24, 20, 12, 14, 17, 21, 24, 25, 21, 20, 23, 26, 31, 29, 27, 24, 19, 22, 26, 29, 29, 26, 22, 17, 21, 24, 27, 27, 24, 19, 16, 18, 21, 24, 23, 22, 17, 13, 15, 17, 20, 20, 20, 17, 12, 13, 16, 19, 19, 19, 17, 9, 12, 15, 18, 17, 18, 17, 18, 20, 22, 23, 25, 23, 18, 16, 19, 21, 22, 23, 21, 16, 15, 18, 19, 19, 19, 19, 15, 14, 16, 16, 16, 16, 16, 12, 9, 12, 13, 13, 12, 13, 12, 6, 12, 12, 12, 11, 12, 12, 6, 10, 11, 10, 11, 11, 10, 15, 15, 15, 16, 17, 18, 11, 13, 13, 14, 15, 15, 15, 9, 10, 12, 12, 12, 12, 11, 8, 6, 11, 9, 8, 8, 8, 7, 4, 7, 6, 6, 5, 5, 4, 5, 5, 5, 4, 4, 4, 2, 6, 4, 3, 3, 3, 3, 2, 6, 7, 7, 8, 9, 10, 11, 2, 5, 6, 7, 7, 8, 9, 2, 4, 5, 4, 5, 5, 5, 2, 2, 2, 2, 1, 2, 2, 1, 4, 4, 3, 2, 2, 2, 3, 5, 5, 4, 2, 2, 1, 4, 6, 7, 4, 3, 3, 0, 3, 4, 5, 6, 7, 8, 10, 4, 5, 5, 6, 6, 6, 7, 4, 7, 5, 4, 4, 4, 4, 4, 6, 5, 4, 3, 2, 1, 4, 7, 8, 5, 4, 3, 0, 6, 7, 9, 7, 4, 3, 2, 6, 8, 10, 8, 5, 3, 2, 7, 9, 7, 5, 6, 8, 8, 7, 9, 8, 5, 5, 5, 5, 7, 9, 10, 5, 3, 2, 3, 7, 8, 11, 6, 4, 3, 1, 7, 9, 11, 8, 5, 3, 2, 8, 9, 12, 11, 6, 4, 2, 8, 10, 12, 12, 8, 5, 3, 31, 34, 37, 39, 39, 37, 34, 28, 33, 36, 38, 38, 35, 32, 27, 31, 34, 37, 37, 35, 31, 26, 28, 32, 34, 35, 32, 27, 22, 25, 29, 30, 32, 29, 27, 18, 22, 24, 26, 30, 29, 27, 15, 19, 23, 26, 29, 28, 27, 26, 31, 35, 36, 36, 34, 32, 26, 30, 34, 36, 37, 33, 31, 24, 28, 31, 34, 34, 31, 28, 22, 26, 30, 32, 30, 30, 24, 20, 22, 25, 28, 27, 26, 24, 16, 19, 22, 24, 25, 25, 24, 12, 16, 20, 24, 24, 25, 24, 24, 29, 31, 31, 33, 30, 27, 23, 26, 29, 30, 31, 31, 26, 21, 26, 28, 28, 29, 29, 25, 19, 23, 25, 24, 25, 25, 20, 12, 19, 20, 21, 21, 21, 20, 8, 16, 18, 18, 19, 20, 20, 8, 13, 16, 16, 18, 18, 19, 21, 22, 24, 25, 25, 27, 18, 18, 20, 21, 24, 23, 24, 17, 14, 19, 21, 21, 21, 21, 16, 11, 17, 17, 17, 17, 17, 15, 8, 12, 12, 13, 13, 13, 11, 7, 9, 9, 10, 11, 12, 8, 9, 7, 7, 8, 9, 10, 8, 10, 14, 15, 16, 17, 17, 18, 6, 12, 13, 15, 15, 14, 17, 6, 11, 11, 11, 12, 11, 14, 6, 7, 8, 8, 8, 8, 7, 4, 2, 3, 3, 3, 5, 7, 3, 2, 2, 2, 0, 3, 7, 5, 5, 4, 2, 2, 2, 5, 5, 6, 8, 9, 12, 15, 17, 5, 5, 7, 8, 11, 13, 14, 5, 6, 6, 6, 8, 10, 11, 5, 5, 5, 5, 4, 6, 6, 3, 3, 4, 3, 2, 2, 6, 0, 4, 5, 4, 2, 1, 5, 4, 4, 6, 5, 2, 2, 3, 7, 9, 9, 8, 10, 13, 15, 7, 9, 10, 8, 8, 11, 13, 7, 9, 11, 7, 6, 7, 9, 7, 8, 10, 6, 4, 3, 5, 5, 7, 9, 6, 3, 1, 3, 4, 5, 9, 8, 3, 2, 1, 5, 6, 9, 9, 4, 2, 1, 37, 41, 44, 47, 48, 44, 42, 35, 39, 43, 47, 48, 44, 40, 33, 38, 41, 45, 45, 42, 38, 32, 36, 38, 42, 45, 40, 34, 29, 31, 35, 39, 39, 36, 34, 24, 28, 31, 33, 37, 37, 34, 22, 25, 29, 32, 36, 36, 34, 33, 36, 41, 46, 42, 42, 39, 31, 36, 41, 44, 45, 42, 36, 30, 34, 38, 41, 41, 39, 35, 29, 32, 36, 38, 39, 35, 30, 25, 29, 31, 34, 33, 33, 30, 20, 25, 28, 32, 31, 31, 28, 16, 22, 26, 31, 30, 30, 30, 30, 35, 36, 37, 39, 37, 33, 28, 33, 35, 36, 37, 36, 31, 26, 31, 33, 34, 34, 34, 29, 22, 29, 30, 31, 31, 30, 24, 16, 24, 26, 26, 25, 26, 25, 11, 21, 23, 24, 24, 24, 25, 10, 19, 21, 23, 23, 23, 22, 26, 29, 30, 31, 32, 33, 24, 21, 26, 29, 30, 31, 29, 23, 18, 25, 27, 27, 27, 26, 21, 14, 22, 23, 23, 23, 22, 19, 12, 16, 19, 19, 18, 17, 16, 11, 12, 15, 16, 16, 16, 12, 10, 8, 13, 14, 14, 15, 9, 13, 20, 21, 22, 24, 21, 24, 10, 18, 20, 20, 22, 18, 22, 10, 15, 17, 17, 18, 15, 17, 10, 9, 14, 14, 13, 10, 12, 8, 4, 9, 9, 9, 8, 9, 5, 3, 5, 5, 6, 6, 9, 7, 5, 3, 3, 4, 5, 7, 6, 12, 13, 14, 17, 19, 21, 6, 10, 11, 13, 15, 17, 18, 6, 6, 9, 10, 12, 13, 14, 6, 5, 6, 6, 8, 9, 8, 4, 3, 3, 3, 3, 6, 7, 4, 0, 4, 3, 1, 4, 7, 3, 3, 5, 3, 2, 3, 6, 6, 8, 8, 10, 15, 17, 19, 6, 8, 9, 9, 13, 15, 16, 6, 8, 9, 7, 9, 11, 12, 6, 7, 8, 5, 5, 7, 6, 4, 5, 6, 5, 2, 3, 7, 2, 4, 5, 4, 2, 1, 5, 3, 5, 5, 5, 3, 2, 4, 42, 47, 50, 55, 55, 54, 48, 41, 45, 49, 54, 55, 52, 45, 39, 43, 47, 51, 52, 50, 45, 38, 40, 45, 48, 51, 45, 39, 34, 38, 41, 44, 46, 42, 40, 31, 34, 38, 41, 44, 42, 39, 27, 30, 35, 40, 42, 43, 40, 40, 43, 48, 51, 52, 48, 44, 38, 43, 47, 51, 50, 46, 42, 35, 40, 45, 48, 48, 46, 42, 34, 38, 42, 44, 44, 42, 35, 29, 35, 38, 41, 40, 38, 34, 22, 31, 34, 37, 37, 38, 34, 19, 29, 33, 35, 36, 37, 36, 37, 40, 44, 44, 45, 44, 39, 33, 40, 42, 42, 43, 42, 37, 29, 38, 40, 41, 40, 39, 34, 25, 35, 37, 36, 37, 35, 30, 20, 30, 33, 33, 32, 29, 29, 14, 26, 30, 30, 29, 30, 29, 13, 23, 27, 29, 28, 28, 27, 29, 34, 36, 37, 39, 38, 30, 25, 32, 34, 36, 36, 34, 27, 21, 30, 33, 32, 33, 30, 26, 18, 26, 29, 28, 29, 26, 25, 16, 20, 25, 25, 24, 20, 21, 14, 14, 22, 21, 21, 20, 17, 14, 10, 19, 20, 20, 19, 13, 17, 27, 28, 29, 29, 25, 30, 13, 22, 27, 27, 27, 22, 28, 13, 18, 24, 23, 24, 18, 22, 13, 12, 20, 20, 19, 13, 17, 11, 7, 16, 15, 14, 9, 12, 9, 5, 11, 11, 11, 8, 10, 9, 6, 8, 10, 10, 8, 9, 9, 15, 18, 20, 20, 23, 26, 9, 12, 17, 18, 19, 20, 22, 9, 8, 15, 15, 16, 17, 17, 9, 7, 11, 11, 12, 11, 11, 7, 5, 6, 6, 5, 8, 9, 5, 4, 0, 1, 4, 6, 9, 5, 3, 2, 2, 3, 6, 8, 7, 8, 11, 16, 19, 21, 22, 7, 7, 9, 14, 18, 18, 18, 8, 7, 8, 11, 14, 15, 15, 7, 6, 6, 7, 10, 10, 9, 6, 4, 5, 3, 3, 5, 8, 4, 2, 4, 4, 2, 5, 7, 3, 2, 4, 4, 2, 4, 6, 42, 45, 48, 52, 53, 51, 46, 40, 42, 47, 52, 52, 48, 43, 38, 42, 46, 49, 52, 47, 42, 35, 40, 44, 46, 48, 45, 38, 32, 37, 39, 44, 44, 42, 38, 29, 33, 36, 39, 42, 41, 37, 26, 30, 34, 38, 41, 41, 38, 38, 42, 46, 49, 48, 46, 43, 37, 40, 45, 49, 48, 44, 40, 35, 38, 43, 47, 46, 42, 35, 33, 38, 40, 43, 41, 39, 33, 26, 34, 36, 39, 38, 36, 32, 22, 29, 32, 36, 35, 35, 32, 17, 28, 32, 35, 34, 34, 33, 35, 40, 42, 42, 44, 41, 35, 31, 39, 39, 42, 42, 39, 33, 28, 37, 39, 38, 38, 37, 30, 24, 33, 34, 35, 35, 32, 28, 18, 28, 31, 31, 30, 29, 28, 13, 24, 29, 28, 29, 28, 28, 13, 21, 27, 27, 27, 27, 25, 27, 34, 34, 35, 37, 33, 27, 23, 30, 33, 34, 33, 31, 26, 20, 27, 32, 31, 30, 27, 24, 16, 24, 28, 28, 27, 23, 23, 14, 17, 24, 23, 23, 18, 19, 13, 13, 21, 21, 20, 17, 16, 12, 9, 19, 20, 19, 17, 11, 16, 24, 26, 27, 26, 23, 27, 12, 20, 25, 26, 24, 19, 26, 12, 16, 23, 23, 21, 15, 20, 12, 10, 19, 19, 17, 10, 15, 10, 6, 15, 15, 12, 7, 11, 9, 5, 11, 11, 11, 6, 8, 8, 5, 7, 9, 9, 6, 7, 8, 14, 18, 18, 18, 19, 24, 8, 9, 16, 16, 17, 17, 19, 8, 6, 14, 13, 14, 14, 14, 8, 5, 10, 9, 10, 9, 9, 6, 3, 5, 5, 4, 6, 7, 4, 3, 1, 0, 3, 5, 7, 4, 3, 1, 2, 2, 4, 6, 6, 7, 11, 14, 17, 19, 20, 6, 7, 10, 13, 15, 16, 16, 6, 6, 9, 10, 12, 13, 13, 6, 5, 5, 6, 8, 8, 7, 4, 4, 4, 3, 3, 4, 6, 3, 2, 6, 6, 1, 4, 5, 2, 3, 6, 6, 2, 3, 4, 34, 39, 42, 47, 46, 43, 40, 34, 37, 42, 46, 46, 43, 37, 32, 35, 40, 44, 45, 41, 36, 31, 33, 37, 40, 42, 38, 32, 28, 30, 33, 37, 38, 36, 33, 25, 27, 29, 33, 37, 36, 32, 23, 25, 28, 32, 35, 36, 32, 32, 35, 40, 44, 44, 40, 36, 32, 35, 38, 43, 42, 38, 33, 30, 33, 38, 40, 40, 36, 31, 28, 31, 34, 37, 36, 34, 28, 22, 29, 30, 34, 33, 30, 27, 19, 25, 27, 30, 30, 30, 28, 15, 25, 27, 29, 29, 30, 27, 30, 34, 37, 36, 36, 34, 29, 27, 32, 34, 35, 36, 33, 28, 24, 30, 33, 32, 32, 30, 25, 21, 29, 29, 30, 30, 27, 23, 15, 24, 26, 26, 25, 23, 22, 11, 22, 24, 23, 23, 22, 22, 10, 19, 22, 22, 22, 22, 20, 25, 28, 28, 29, 30, 29, 23, 20, 26, 27, 28, 28, 25, 20, 16, 24, 26, 25, 25, 22, 19, 13, 20, 22, 21, 22, 18, 18, 11, 15, 19, 18, 17, 14, 14, 10, 11, 17, 15, 15, 14, 11, 10, 7, 15, 14, 14, 13, 7, 12, 20, 20, 21, 21, 17, 22, 9, 17, 19, 20, 19, 14, 20, 9, 13, 17, 17, 16, 11, 15, 9, 8, 14, 13, 12, 7, 10, 7, 3, 10, 9, 8, 4, 7, 6, 3, 7, 6, 6, 3, 5, 5, 4, 5, 5, 4, 4, 4, 5, 10, 12, 12, 13, 15, 19, 5, 8, 11, 11, 12, 13, 14, 4, 4, 10, 9, 9, 10, 10, 5, 3, 6, 6, 6, 6, 5, 3, 2, 1, 1, 2, 3, 4, 2, 1, 4, 3, 0, 3, 4, 3, 2, 4, 3, 2, 2, 3, 5, 5, 8, 10, 12, 14, 15, 5, 5, 7, 10, 11, 12, 12, 5, 5, 6, 7, 8, 9, 9, 5, 4, 4, 4, 4, 5, 4, 3, 2, 5, 4, 2, 2, 4, 1, 4, 5, 5, 2, 2, 3, 3, 4, 5, 5, 3, 0, 2, 28, 33, 37, 40, 41, 38, 35, 28, 31, 36, 40, 39, 37, 33, 26, 29, 35, 38, 38, 34, 31, 26, 28, 31, 35, 37, 33, 28, 23, 25, 28, 30, 34, 31, 27, 19, 22, 24, 28, 32, 31, 27, 18, 21, 23, 27, 30, 31, 28, 27, 30, 34, 38, 36, 35, 30, 26, 30, 32, 37, 37, 33, 28, 25, 28, 31, 34, 33, 32, 26, 23, 26, 28, 30, 30, 28, 22, 20, 22, 25, 27, 27, 26, 22, 17, 20, 22, 25, 25, 25, 22, 13, 19, 21, 24, 24, 25, 22, 25, 28, 29, 30, 31, 30, 25, 23, 26, 29, 30, 29, 28, 23, 21, 26, 27, 27, 27, 27, 21, 18, 23, 23, 23, 24, 23, 17, 12, 20, 20, 20, 20, 19, 17, 8, 19, 19, 18, 18, 18, 17, 8, 16, 17, 17, 17, 17, 15, 21, 22, 22, 23, 24, 23, 17, 17, 21, 22, 22, 23, 21, 15, 13, 19, 20, 20, 19, 18, 14, 10, 16, 16, 16, 16, 15, 13, 8, 12, 13, 12, 12, 11, 10, 8, 9, 11, 11, 10, 10, 6, 8, 6, 10, 9, 9, 9, 4, 9, 14, 15, 16, 16, 13, 17, 5, 13, 13, 14, 14, 10, 15, 6, 11, 11, 11, 11, 8, 10, 6, 6, 8, 7, 7, 5, 6, 4, 2, 4, 3, 3, 3, 3, 3, 2, 2, 1, 2, 2, 3, 4, 2, 4, 2, 1, 2, 3, 3, 7, 8, 9, 10, 12, 14, 3, 6, 7, 8, 9, 10, 10, 3, 4, 6, 6, 6, 7, 7, 3, 3, 3, 3, 3, 4, 3, 1, 3, 5, 3, 2, 1, 3, 1, 5, 6, 4, 3, 0, 3, 2, 5, 6, 6, 3, 2, 2, 4, 6, 6, 7, 9, 11, 12, 4, 7, 6, 7, 8, 9, 9, 4, 6, 6, 5, 5, 5, 6, 4, 5, 6, 3, 2, 2, 2, 2, 5, 7, 6, 3, 2, 2, 5, 6, 8, 7, 4, 2, 1, 5, 7, 8, 8, 5, 3, 0, 24, 28, 32, 36, 35, 32, 29, 23, 26, 30, 34, 36, 32, 28, 21, 25, 29, 32, 34, 31, 25, 19, 22, 26, 30, 32, 28, 23, 17, 20, 22, 26, 28, 27, 23, 15, 17, 20, 23, 27, 26, 23, 14, 16, 19, 22, 25, 26, 23, 21, 24, 28, 34, 32, 28, 26, 20, 24, 28, 31, 31, 28, 24, 18, 22, 26, 29, 28, 26, 22, 18, 20, 23, 25, 26, 23, 19, 15, 17, 20, 22, 21, 21, 18, 13, 15, 18, 20, 20, 21, 19, 11, 13, 17, 20, 19, 19, 18, 18, 22, 24, 25, 27, 25, 20, 17, 20, 23, 24, 24, 23, 19, 17, 19, 22, 22, 21, 22, 17, 14, 18, 18, 18, 18, 18, 14, 10, 14, 15, 15, 15, 15, 14, 6, 13, 14, 13, 13, 14, 13, 6, 12, 12, 12, 12, 13, 12, 17, 17, 17, 18, 20, 20, 13, 14, 15, 16, 17, 17, 17, 11, 11, 14, 14, 14, 14, 13, 10, 7, 12, 11, 11, 11, 10, 9, 5, 9, 8, 7, 7, 7, 5, 6, 7, 7, 6, 6, 6, 3, 7, 4, 5, 5, 5, 5, 3, 7, 9, 9, 10, 11, 11, 13, 2, 7, 8, 9, 9, 8, 11, 2, 6, 6, 6, 6, 6, 7, 2, 3, 3, 2, 2, 3, 3, 1, 2, 2, 2, 2, 0, 2, 2, 4, 5, 4, 2, 1, 2, 3, 6, 7, 4, 3, 2, 2, 3, 4, 5, 7, 8, 10, 11, 3, 4, 5, 6, 7, 7, 8, 3, 5, 4, 4, 4, 5, 5, 3, 4, 5, 3, 2, 1, 2, 3, 6, 8, 5, 4, 2, 2, 4, 8, 10, 7, 4, 3, 0, 6, 9, 10, 8, 5, 3, 1, 6, 8, 6, 5, 7, 8, 9, 6, 8, 8, 6, 6, 6, 7, 6, 8, 9, 5, 3, 3, 4, 6, 7, 10, 7, 5, 2, 0, 7, 9, 10, 8, 5, 3, 2, 8, 10, 11, 10, 6, 4, 2, 9, 10, 11, 11, 7, 5, 3, 33, 37, 40, 43, 42, 41, 37, 32, 36, 40, 42, 42, 40, 36, 30, 34, 38, 40, 41, 37, 34, 29, 32, 36, 37, 38, 33, 27, 25, 28, 32, 33, 32, 29, 28, 22, 24, 27, 28, 32, 29, 28, 16, 20, 24, 27, 29, 30, 28, 30, 34, 38, 40, 40, 38, 35, 29, 33, 37, 42, 40, 37, 34, 27, 31, 35, 38, 36, 34, 30, 26, 29, 32, 34, 34, 32, 25, 23, 26, 28, 31, 28, 27, 25, 18, 22, 24, 25, 27, 26, 25, 13, 17, 21, 24, 24, 25, 24, 27, 32, 33, 35, 36, 35, 31, 26, 29, 33, 34, 35, 34, 29, 24, 29, 31, 31, 31, 31, 26, 20, 26, 27, 28, 28, 26, 21, 14, 22, 24, 24, 22, 21, 21, 8, 17, 19, 19, 19, 20, 21, 7, 14, 17, 17, 18, 19, 19, 24, 25, 26, 28, 30, 30, 24, 20, 24, 25, 27, 27, 27, 22, 17, 23, 24, 24, 24, 23, 20, 13, 19, 20, 20, 20, 19, 17, 11, 14, 16, 16, 14, 13, 14, 8, 9, 11, 10, 11, 12, 10, 7, 5, 8, 9, 10, 10, 9, 12, 18, 19, 20, 22, 22, 23, 9, 17, 18, 19, 20, 19, 22, 9, 15, 16, 16, 16, 16, 16, 9, 11, 13, 13, 12, 10, 10, 6, 5, 8, 8, 4, 6, 8, 4, 3, 1, 2, 3, 5, 8, 3, 2, 2, 1, 2, 4, 7, 8, 12, 14, 15, 18, 21, 22, 8, 10, 12, 14, 16, 18, 18, 8, 8, 10, 10, 13, 14, 14, 8, 7, 7, 7, 8, 9, 7, 6, 5, 6, 5, 3, 4, 7, 3, 3, 5, 4, 3, 2, 6, 0, 3, 5, 5, 3, 2, 5, 8, 11, 11, 11, 16, 19, 20, 9, 11, 12, 10, 14, 16, 17, 9, 11, 12, 9, 10, 12, 13, 9, 10, 11, 8, 6, 6, 6, 7, 8, 10, 7, 4, 2, 5, 5, 7, 8, 7, 4, 3, 3, 4, 5, 7, 8, 4, 3, 2, 39, 43, 46, 51, 52, 48, 44, 38, 42, 45, 50, 49, 46, 43, 36, 39, 44, 48, 48, 45, 39, 35, 38, 42, 44, 45, 40, 34, 31, 35, 36, 40, 41, 37, 34, 27, 30, 33, 34, 38, 38, 34, 22, 26, 29, 34, 37, 37, 33, 36, 40, 46, 48, 48, 43, 41, 34, 38, 42, 47, 47, 42, 38, 32, 36, 41, 43, 44, 41, 35, 31, 34, 38, 41, 40, 37, 30, 27, 32, 34, 36, 34, 33, 30, 21, 27, 30, 31, 32, 33, 30, 15, 23, 25, 30, 30, 30, 29, 33, 36, 40, 41, 42, 40, 35, 31, 35, 38, 40, 41, 39, 33, 28, 34, 37, 38, 36, 36, 31, 24, 31, 33, 33, 33, 31, 26, 17, 27, 28, 29, 27, 26, 26, 12, 22, 25, 24, 24, 25, 26, 10, 18, 22, 23, 23, 24, 24, 27, 31, 32, 34, 35, 35, 28, 23, 30, 31, 32, 32, 33, 25, 20, 28, 30, 29, 29, 28, 24, 16, 24, 25, 26, 25, 22, 22, 13, 18, 21, 21, 18, 18, 18, 12, 11, 17, 16, 16, 17, 14, 10, 7, 15, 14, 15, 15, 11, 15, 23, 24, 25, 26, 25, 28, 12, 20, 22, 24, 24, 22, 26, 12, 17, 21, 21, 20, 18, 20, 12, 11, 17, 16, 16, 12, 14, 10, 5, 13, 12, 9, 8, 10, 7, 5, 7, 6, 7, 7, 9, 5, 4, 4, 4, 5, 7, 8, 9, 16, 18, 19, 22, 23, 25, 9, 13, 16, 18, 20, 20, 22, 9, 9, 14, 14, 16, 17, 16, 9, 8, 10, 10, 12, 11, 9, 7, 6, 5, 5, 4, 7, 9, 4, 3, 3, 3, 2, 5, 9, 4, 0, 3, 4, 2, 4, 7, 9, 9, 10, 15, 19, 22, 22, 9, 9, 10, 13, 18, 19, 19, 9, 9, 11, 11, 13, 15, 14, 9, 8, 10, 7, 9, 9, 7, 7, 7, 8, 6, 3, 4, 7, 5, 5, 6, 5, 3, 3, 6, 2, 4, 5, 5, 3, 2, 5, 44, 47, 53, 55, 56, 52, 48, 42, 47, 51, 53, 55, 51, 47, 41, 45, 50, 51, 54, 50, 44, 39, 42, 44, 49, 50, 47, 40, 36, 39, 42, 46, 46, 42, 39, 31, 34, 38, 40, 44, 43, 39, 27, 31, 35, 39, 42, 43, 39, 40, 45, 49, 52, 52, 48, 45, 39, 44, 47, 52, 50, 47, 42, 36, 42, 45, 48, 49, 45, 39, 35, 39, 42, 44, 44, 41, 34, 28, 36, 39, 41, 39, 38, 35, 23, 32, 35, 36, 37, 36, 35, 18, 29, 32, 36, 35, 36, 34, 36, 42, 44, 45, 47, 44, 38, 33, 41, 41, 45, 45, 43, 37, 30, 39, 40, 41, 41, 39, 34, 25, 35, 37, 37, 37, 36, 30, 20, 31, 34, 34, 31, 30, 30, 15, 26, 30, 29, 30, 29, 30, 13, 22, 28, 28, 28, 29, 28, 29, 35, 36, 38, 39, 38, 31, 26, 34, 36, 37, 37, 35, 29, 22, 31, 34, 33, 34, 31, 27, 18, 27, 30, 29, 30, 26, 25, 16, 20, 26, 25, 24, 21, 22, 15, 14, 22, 21, 21, 20, 17, 14, 10, 19, 20, 20, 19, 14, 17, 25, 28, 30, 29, 26, 31, 14, 23, 27, 28, 28, 23, 29, 14, 19, 25, 25, 24, 20, 24, 14, 13, 21, 20, 21, 13, 16, 12, 8, 16, 16, 13, 10, 13, 9, 5, 11, 11, 12, 9, 11, 9, 6, 8, 10, 10, 8, 10, 10, 16, 19, 21, 22, 24, 27, 10, 12, 18, 20, 21, 22, 23, 9, 8, 17, 16, 17, 18, 18, 10, 8, 13, 12, 13, 12, 11, 8, 5, 7, 7, 5, 8, 10, 6, 5, 2, 1, 4, 7, 9, 5, 3, 0, 2, 4, 6, 8, 9, 8, 12, 17, 21, 23, 24, 9, 8, 11, 16, 20, 20, 20, 9, 8, 9, 13, 15, 16, 16, 8, 7, 7, 8, 11, 11, 9, 6, 5, 5, 3, 4, 5, 8, 4, 3, 4, 4, 2, 5, 7, 3, 2, 4, 4, 2, 4, 6, 44, 48, 53, 55, 55, 53, 49, 41, 48, 50, 54, 54, 52, 48, 40, 44, 49, 52, 53, 49, 44, 39, 42, 47, 48, 51, 47, 42, 35, 39, 42, 45, 46, 44, 40, 31, 34, 38, 42, 44, 43, 40, 27, 33, 36, 39, 43, 43, 40, 41, 44, 48, 53, 53, 48, 43, 39, 45, 48, 51, 50, 47, 42, 36, 42, 46, 48, 48, 46, 39, 33, 40, 43, 46, 45, 42, 35, 28, 36, 40, 41, 40, 38, 35, 22, 32, 35, 39, 38, 37, 35, 18, 29, 34, 37, 35, 36, 36, 36, 41, 44, 45, 46, 44, 37, 34, 39, 43, 44, 43, 41, 35, 29, 39, 41, 41, 40, 39, 33, 26, 37, 37, 37, 37, 36, 30, 19, 31, 34, 34, 32, 30, 29, 15, 26, 31, 30, 30, 29, 29, 14, 21, 30, 29, 29, 28, 27, 30, 36, 38, 38, 38, 36, 30, 25, 33, 35, 37, 35, 33, 28, 21, 30, 34, 34, 32, 30, 26, 17, 24, 31, 30, 30, 24, 25, 15, 19, 26, 27, 24, 20, 21, 15, 14, 24, 23, 22, 19, 17, 14, 10, 20, 22, 21, 18, 14, 16, 25, 29, 30, 27, 24, 30, 13, 22, 27, 28, 26, 20, 28, 13, 17, 25, 24, 23, 17, 23, 13, 12, 21, 21, 19, 12, 17, 11, 7, 17, 17, 13, 8, 13, 10, 6, 12, 13, 12, 7, 10, 9, 6, 8, 12, 11, 7, 9, 9, 14, 19, 20, 19, 22, 26, 9, 10, 18, 18, 18, 19, 22, 9, 6, 16, 15, 15, 16, 16, 9, 5, 12, 12, 11, 11, 10, 7, 4, 6, 7, 5, 7, 8, 5, 3, 2, 2, 3, 5, 8, 5, 3, 2, 0, 3, 5, 7, 7, 7, 12, 16, 18, 20, 22, 7, 7, 11, 14, 17, 17, 18, 7, 7, 9, 12, 13, 14, 14, 7, 6, 5, 8, 9, 9, 8, 5, 4, 3, 2, 4, 5, 7, 3, 2, 5, 4, 2, 4, 6, 3, 1, 5, 5, 1, 4, 5, 38, 42, 47, 47, 48, 47, 43, 36, 41, 44, 48, 49, 45, 41, 34, 39, 43, 45, 47, 44, 38, 33, 36, 40, 43, 45, 41, 34, 31, 33, 37, 39, 41, 39, 35, 26, 29, 32, 35, 39, 37, 35, 23, 28, 31, 34, 38, 38, 34, 34, 39, 43, 47, 46, 41, 38, 34, 38, 41, 45, 44, 40, 36, 31, 35, 40, 43, 42, 39, 33, 29, 34, 36, 40, 39, 36, 30, 24, 30, 33, 36, 35, 33, 30, 21, 27, 30, 32, 32, 32, 29, 16, 26, 29, 31, 31, 31, 30, 31, 35, 38, 39, 39, 37, 31, 29, 35, 37, 38, 38, 35, 30, 26, 32, 35, 35, 36, 33, 27, 22, 31, 32, 31, 32, 30, 24, 16, 26, 27, 28, 27, 25, 24, 11, 24, 25, 26, 25, 24, 24, 11, 20, 24, 24, 24, 24, 22, 25, 30, 30, 31, 32, 30, 24, 21, 29, 28, 30, 31, 28, 22, 18, 26, 28, 28, 27, 24, 21, 15, 21, 24, 25, 24, 20, 20, 12, 15, 21, 20, 20, 16, 16, 11, 12, 18, 18, 17, 15, 12, 11, 8, 17, 17, 16, 15, 9, 13, 21, 23, 24, 23, 19, 24, 10, 19, 22, 22, 21, 16, 23, 10, 14, 19, 19, 18, 13, 17, 10, 9, 16, 16, 15, 8, 12, 8, 4, 12, 12, 10, 5, 9, 7, 4, 9, 8, 8, 4, 6, 7, 4, 6, 7, 7, 4, 5, 6, 12, 14, 15, 15, 17, 20, 6, 8, 12, 13, 14, 14, 16, 6, 5, 11, 10, 11, 11, 12, 6, 4, 8, 7, 7, 7, 6, 4, 2, 2, 2, 3, 4, 5, 2, 2, 3, 3, 2, 3, 5, 3, 2, 4, 3, 0, 3, 4, 5, 5, 10, 12, 14, 16, 17, 5, 6, 9, 11, 12, 13, 13, 5, 6, 8, 9, 9, 10, 10, 5, 5, 4, 5, 6, 6, 5, 3, 2, 3, 3, 1, 3, 4, 2, 3, 5, 4, 2, 2, 4, 2, 4, 5, 4, 3, 2, 3, 31, 36, 40, 43, 43, 40, 36, 30, 33, 38, 43, 43, 39, 35, 28, 32, 37, 39, 42, 37, 33, 28, 30, 33, 36, 40, 35, 29, 25, 27, 29, 33, 35, 32, 29, 21, 24, 26, 30, 34, 32, 29, 20, 21, 26, 29, 32, 32, 29, 29, 32, 36, 40, 38, 35, 33, 29, 31, 35, 38, 37, 35, 30, 26, 30, 33, 36, 36, 32, 29, 25, 28, 30, 33, 33, 31, 24, 20, 25, 27, 29, 29, 27, 24, 18, 22, 25, 27, 27, 27, 24, 14, 21, 24, 26, 26, 26, 24, 26, 30, 32, 33, 34, 32, 27, 25, 29, 30, 31, 31, 30, 25, 23, 27, 29, 29, 29, 28, 22, 18, 26, 25, 26, 26, 24, 19, 13, 22, 22, 22, 22, 21, 19, 9, 20, 20, 20, 20, 20, 19, 9, 17, 20, 18, 19, 19, 17, 23, 24, 24, 26, 27, 25, 19, 18, 23, 23, 25, 24, 22, 17, 14, 22, 22, 21, 22, 19, 16, 11, 18, 19, 18, 18, 16, 14, 9, 13, 15, 14, 14, 12, 11, 9, 10, 13, 12, 12, 12, 8, 9, 7, 12, 11, 11, 11, 5, 10, 17, 17, 18, 18, 15, 19, 7, 15, 16, 16, 16, 12, 17, 6, 12, 13, 13, 13, 9, 12, 7, 6, 10, 9, 9, 6, 7, 5, 2, 6, 5, 5, 3, 5, 4, 2, 4, 3, 3, 3, 4, 4, 3, 2, 2, 2, 2, 3, 4, 9, 9, 10, 11, 13, 16, 4, 7, 9, 9, 10, 11, 12, 4, 4, 8, 7, 8, 8, 8, 4, 3, 4, 4, 4, 5, 4, 2, 1, 4, 3, 1, 2, 3, 2, 3, 6, 4, 2, 2, 3, 2, 5, 6, 5, 3, 0, 3, 4, 5, 6, 8, 10, 12, 13, 4, 5, 6, 8, 9, 10, 10, 4, 5, 6, 5, 6, 6, 7, 4, 4, 6, 3, 2, 3, 3, 2, 4, 8, 5, 3, 0, 3, 3, 6, 7, 7, 4, 2, 2, 5, 7, 7, 8, 5, 2, 2, 25, 28, 34, 37, 37, 34, 31, 24, 28, 32, 36, 37, 32, 29, 23, 26, 30, 34, 36, 32, 27, 22, 24, 28, 31, 34, 30, 24, 19, 21, 24, 27, 31, 28, 24, 17, 18, 21, 24, 29, 28, 24, 15, 17, 21, 24, 27, 27, 24, 23, 27, 31, 34, 33, 30, 27, 22, 25, 29, 33, 33, 28, 25, 20, 24, 28, 31, 30, 27, 24, 20, 22, 24, 28, 27, 26, 20, 17, 18, 21, 23, 24, 23, 20, 15, 17, 19, 21, 22, 22, 20, 12, 16, 19, 21, 21, 21, 20, 21, 24, 26, 27, 28, 26, 22, 20, 23, 24, 25, 26, 25, 20, 19, 21, 23, 23, 23, 22, 18, 16, 20, 20, 20, 19, 19, 14, 10, 16, 16, 16, 16, 16, 14, 7, 16, 15, 15, 15, 15, 15, 7, 14, 14, 14, 14, 14, 13, 18, 19, 19, 20, 21, 21, 14, 15, 17, 18, 19, 19, 18, 12, 12, 16, 16, 16, 15, 15, 11, 8, 14, 13, 12, 12, 12, 10, 6, 10, 9, 9, 8, 8, 7, 6, 8, 8, 7, 7, 7, 4, 7, 4, 6, 6, 6, 6, 3, 8, 11, 11, 12, 13, 12, 14, 3, 9, 10, 10, 11, 9, 12, 4, 8, 8, 7, 7, 7, 8, 3, 4, 4, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 3, 4, 3, 2, 0, 2, 3, 5, 5, 3, 2, 2, 2, 3, 5, 6, 7, 8, 10, 12, 3, 4, 6, 7, 7, 8, 9, 3, 4, 4, 4, 5, 5, 6, 3, 3, 4, 3, 2, 2, 2, 1, 5, 6, 4, 3, 2, 2, 3, 6, 8, 6, 3, 2, 1, 5, 7, 8, 7, 4, 3, 0, 5, 7, 6, 6, 8, 9, 10, 5, 7, 6, 6, 6, 7, 7, 5, 7, 8, 4, 3, 4, 4, 5, 7, 8, 5, 3, 2, 1, 5, 8, 9, 7, 4, 3, 0, 6, 8, 10, 9, 5, 3, 2, 7, 9, 10, 10, 6, 4, 2, 31, 36, 39, 41, 40, 39, 36, 31, 35, 38, 41, 41, 38, 36, 30, 33, 36, 40, 42, 39, 36, 29, 32, 36, 39, 41, 39, 38, 28, 31, 35, 38, 42, 40, 37, 28, 30, 34, 38, 41, 42, 36, 25, 29, 33, 37, 40, 40, 37, 29, 32, 36, 40, 38, 35, 32, 28, 32, 35, 38, 38, 34, 32, 27, 30, 34, 38, 38, 34, 32, 25, 29, 34, 36, 37, 36, 32, 25, 29, 32, 36, 36, 36, 33, 24, 28, 32, 35, 36, 35, 32, 21, 26, 30, 34, 34, 35, 32, 27, 31, 31, 32, 33, 30, 25, 27, 29, 30, 30, 32, 29, 25, 24, 28, 29, 30, 30, 30, 25, 21, 27, 28, 29, 30, 30, 25, 19, 27, 28, 28, 29, 30, 26, 15, 24, 26, 28, 28, 28, 26, 16, 22, 25, 26, 26, 26, 25, 24, 25, 25, 25, 25, 22, 13, 22, 23, 23, 25, 24, 21, 14, 17, 22, 22, 23, 22, 20, 15, 14, 22, 21, 22, 23, 20, 17, 15, 19, 20, 21, 21, 19, 14, 15, 17, 19, 19, 19, 18, 10, 16, 14, 17, 17, 18, 17, 8, 12, 16, 16, 17, 15, 10, 12, 9, 15, 15, 15, 14, 10, 13, 9, 13, 13, 13, 13, 8, 12, 9, 9, 13, 13, 12, 9, 10, 10, 7, 11, 11, 11, 6, 8, 10, 9, 8, 9, 9, 5, 8, 12, 11, 9, 7, 7, 4, 7, 4, 6, 6, 6, 7, 9, 10, 4, 4, 4, 5, 5, 9, 10, 4, 2, 2, 3, 5, 7, 9, 4, 2, 1, 1, 3, 6, 8, 5, 4, 4, 4, 4, 4, 7, 7, 6, 8, 6, 4, 4, 6, 9, 9, 9, 7, 5, 4, 5, 0, 4, 3, 1, 4, 7, 9, 0, 4, 4, 2, 4, 6, 8, 0, 4, 5, 2, 2, 5, 8, 0, 3, 4, 2, 2, 4, 6, 2, 4, 5, 5, 5, 4, 5, 5, 6, 8, 8, 5, 5, 4, 8, 8, 9, 9, 6, 5, 4, 37, 41, 45, 47, 47, 45, 41, 37, 40, 44, 46, 48, 46, 42, 36, 39, 42, 47, 47, 46, 43, 34, 37, 41, 45, 48, 46, 42, 34, 37, 41, 45, 49, 46, 42, 33, 36, 41, 44, 47, 45, 42, 30, 35, 38, 43, 47, 46, 42, 36, 39, 42, 45, 43, 41, 36, 34, 37, 41, 44, 44, 39, 36, 33, 36, 40, 42, 43, 40, 36, 32, 36, 38, 43, 42, 42, 37, 30, 35, 38, 42, 41, 40, 37, 28, 34, 38, 41, 41, 40, 37, 25, 31, 36, 40, 40, 40, 37, 33, 36, 38, 38, 37, 34, 28, 31, 34, 36, 38, 36, 34, 28, 28, 34, 36, 36, 35, 34, 29, 25, 34, 34, 36, 36, 34, 30, 22, 32, 34, 35, 35, 34, 30, 19, 30, 33, 33, 33, 32, 30, 18, 28, 31, 31, 32, 32, 28, 28, 31, 31, 30, 29, 25, 16, 25, 29, 29, 30, 28, 24, 18, 21, 28, 28, 28, 27, 23, 20, 17, 26, 29, 27, 27, 23, 23, 18, 23, 27, 27, 26, 22, 19, 19, 20, 25, 25, 25, 21, 15, 18, 17, 23, 24, 24, 21, 11, 16, 22, 22, 22, 16, 12, 16, 12, 19, 21, 21, 16, 11, 18, 13, 16, 19, 19, 16, 9, 15, 13, 12, 19, 19, 15, 11, 14, 14, 10, 17, 17, 13, 8, 11, 13, 11, 14, 14, 12, 7, 10, 14, 13, 12, 13, 11, 6, 8, 7, 11, 12, 9, 9, 11, 13, 7, 8, 10, 8, 7, 9, 12, 7, 5, 8, 7, 6, 8, 10, 7, 4, 7, 6, 6, 8, 10, 8, 6, 5, 5, 4, 6, 9, 9, 8, 8, 7, 5, 6, 8, 11, 9, 8, 7, 6, 5, 7, 4, 0, 2, 4, 6, 9, 11, 4, 0, 2, 3, 5, 7, 10, 4, 0, 3, 2, 6, 9, 10, 4, 1, 3, 2, 4, 5, 8, 4, 3, 5, 5, 5, 5, 7, 6, 6, 8, 8, 6, 5, 6, 7, 9, 8, 8, 7, 5, 6, 36, 40, 42, 44, 44, 42, 39, 35, 38, 42, 44, 45, 42, 38, 34, 37, 41, 44, 45, 42, 40, 33, 37, 41, 45, 46, 43, 40, 33, 36, 40, 43, 47, 44, 39, 32, 35, 39, 43, 46, 44, 40, 30, 34, 38, 41, 45, 44, 39, 34, 37, 40, 43, 41, 36, 34, 32, 35, 39, 42, 42, 37, 33, 31, 35, 38, 40, 41, 37, 34, 31, 35, 37, 41, 41, 39, 34, 29, 35, 36, 40, 39, 39, 35, 27, 33, 36, 39, 39, 38, 35, 24, 31, 35, 38, 37, 37, 35, 31, 34, 36, 35, 35, 31, 24, 29, 33, 34, 35, 34, 31, 24, 27, 33, 34, 34, 32, 31, 26, 23, 33, 33, 34, 33, 31, 27, 21, 31, 33, 33, 33, 29, 27, 18, 29, 32, 31, 31, 30, 28, 18, 27, 30, 30, 31, 29, 25, 27, 29, 28, 28, 27, 22, 14, 22, 28, 27, 27, 25, 20, 16, 19, 26, 27, 27, 25, 20, 18, 15, 24, 27, 26, 25, 20, 21, 17, 22, 25, 25, 24, 19, 17, 17, 19, 24, 25, 23, 18, 14, 18, 16, 22, 22, 22, 18, 10, 14, 20, 20, 20, 14, 8, 14, 11, 18, 19, 19, 14, 8, 15, 11, 14, 19, 18, 13, 7, 14, 11, 11, 18, 18, 13, 7, 13, 13, 9, 16, 16, 12, 6, 9, 12, 11, 14, 14, 11, 6, 7, 14, 13, 12, 12, 10, 6, 7, 6, 10, 11, 7, 5, 7, 10, 6, 7, 9, 7, 5, 7, 9, 6, 3, 8, 6, 5, 7, 8, 6, 4, 7, 6, 4, 6, 7, 7, 6, 5, 5, 6, 6, 7, 9, 8, 11, 11, 8, 6, 7, 11, 10, 12, 12, 10, 6, 6, 3, 2, 0, 3, 4, 6, 8, 3, 2, 2, 2, 4, 5, 7, 3, 2, 3, 2, 4, 6, 7, 3, 2, 6, 4, 4, 5, 6, 4, 5, 10, 11, 9, 6, 6, 6, 10, 15, 16, 11, 7, 6, 9, 14, 17, 17, 13, 8, 6, 28, 32, 36, 38, 38, 36, 32, 29, 31, 35, 38, 39, 36, 32, 27, 31, 34, 37, 39, 36, 33, 26, 30, 34, 37, 40, 37, 34, 27, 30, 33, 36, 40, 38, 34, 26, 29, 32, 36, 39, 38, 34, 24, 27, 30, 35, 37, 38, 34, 28, 30, 34, 36, 34, 30, 27, 26, 28, 32, 35, 34, 31, 27, 25, 28, 32, 34, 34, 32, 28, 24, 28, 31, 35, 34, 32, 28, 24, 28, 31, 34, 34, 34, 29, 23, 27, 29, 33, 33, 33, 29, 21, 25, 28, 31, 32, 31, 29, 26, 29, 29, 28, 29, 25, 19, 25, 26, 28, 28, 28, 25, 19, 23, 26, 27, 28, 28, 25, 20, 19, 26, 27, 28, 27, 26, 22, 17, 25, 27, 26, 26, 25, 22, 15, 25, 25, 25, 26, 24, 22, 16, 22, 24, 24, 24, 24, 20, 22, 23, 22, 21, 21, 17, 8, 18, 22, 21, 21, 20, 16, 10, 15, 21, 21, 21, 20, 16, 13, 12, 20, 21, 20, 19, 16, 16, 14, 18, 21, 20, 19, 15, 12, 15, 16, 18, 18, 17, 15, 9, 16, 15, 16, 17, 16, 14, 6, 11, 15, 15, 14, 10, 5, 8, 7, 14, 13, 13, 10, 5, 10, 8, 11, 12, 12, 10, 5, 9, 7, 9, 12, 12, 10, 5, 8, 9, 7, 11, 11, 9, 6, 6, 10, 9, 10, 9, 8, 6, 5, 13, 13, 13, 10, 8, 7, 5, 3, 6, 5, 4, 3, 4, 6, 3, 4, 4, 3, 3, 4, 5, 3, 2, 2, 2, 3, 4, 6, 3, 2, 4, 4, 4, 5, 5, 5, 6, 9, 9, 8, 7, 5, 7, 10, 16, 14, 10, 7, 6, 11, 15, 17, 15, 12, 8, 6, 2, 4, 3, 0, 2, 3, 4, 2, 4, 4, 2, 2, 3, 5, 2, 4, 5, 3, 2, 3, 4, 2, 6, 9, 7, 6, 5, 5, 5, 9, 13, 12, 11, 8, 6, 9, 14, 18, 18, 13, 10, 7, 14, 18, 19, 19, 15, 11, 7, 24, 27, 30, 33, 32, 30, 27, 24, 26, 29, 32, 33, 31, 27, 22, 25, 28, 31, 33, 31, 29, 21, 25, 28, 32, 34, 32, 29, 22, 25, 27, 31, 35, 33, 29, 21, 24, 27, 30, 34, 33, 29, 19, 22, 25, 29, 33, 33, 28, 21, 24, 28, 30, 29, 25, 23, 21, 24, 27, 30, 29, 25, 22, 20, 22, 26, 29, 28, 27, 23, 20, 22, 26, 29, 28, 27, 24, 21, 23, 26, 29, 29, 27, 23, 19, 21, 24, 28, 27, 27, 24, 16, 20, 23, 26, 26, 26, 24, 20, 22, 23, 23, 23, 20, 15, 19, 22, 22, 23, 22, 20, 16, 19, 20, 22, 23, 22, 21, 17, 16, 22, 23, 23, 23, 21, 18, 15, 21, 21, 21, 22, 21, 18, 13, 19, 20, 20, 21, 20, 17, 17, 18, 19, 19, 19, 20, 17, 19, 17, 16, 17, 16, 13, 5, 16, 16, 16, 16, 15, 12, 6, 13, 16, 15, 16, 15, 13, 9, 10, 16, 16, 15, 15, 13, 12, 11, 14, 14, 14, 14, 12, 8, 12, 13, 13, 13, 13, 12, 6, 17, 18, 13, 12, 12, 11, 5, 8, 10, 9, 9, 8, 3, 5, 5, 9, 8, 8, 7, 3, 6, 5, 8, 7, 7, 7, 3, 5, 5, 6, 7, 7, 7, 5, 5, 6, 7, 7, 7, 8, 7, 5, 9, 12, 14, 12, 9, 8, 6, 15, 18, 17, 13, 10, 8, 6, 2, 1, 1, 1, 2, 3, 3, 2, 3, 2, 1, 1, 3, 4, 2, 3, 3, 3, 2, 3, 4, 2, 5, 7, 7, 6, 5, 6, 5, 10, 13, 12, 11, 8, 6, 10, 15, 19, 17, 12, 9, 7, 16, 19, 21, 18, 14, 10, 8, 4, 6, 4, 2, 0, 2, 3, 4, 6, 5, 3, 1, 2, 3, 4, 6, 7, 5, 5, 3, 4, 4, 8, 12, 9, 8, 7, 7, 8, 12, 16, 15, 13, 10, 8, 13, 16, 20, 21, 15, 11, 9, 18, 22, 21, 21, 17, 13, 9, 19, 23, 25, 29, 28, 25, 22, 19, 21, 24, 27, 28, 26, 23, 17, 20, 24, 27, 30, 27, 24, 17, 20, 24, 28, 30, 29, 25, 18, 20, 23, 27, 31, 28, 25, 16, 19, 22, 26, 29, 29, 25, 16, 18, 22, 25, 28, 29, 26, 18, 20, 23, 25, 23, 21, 18, 16, 19, 23, 25, 25, 21, 19, 15, 18, 21, 25, 24, 22, 20, 15, 19, 22, 25, 24, 23, 20, 16, 18, 21, 24, 24, 23, 21, 14, 17, 20, 23, 23, 23, 20, 18, 18, 19, 22, 22, 22, 21, 15, 18, 19, 19, 19, 16, 13, 15, 17, 18, 18, 18, 17, 13, 15, 16, 18, 18, 18, 18, 14, 14, 17, 18, 18, 18, 18, 15, 12, 15, 17, 17, 17, 17, 15, 13, 15, 16, 17, 16, 16, 15, 20, 19, 16, 15, 15, 15, 13, 15, 13, 12, 12, 12, 11, 2, 14, 12, 12, 11, 11, 10, 3, 11, 11, 11, 12, 11, 11, 6, 7, 11, 11, 11, 11, 10, 9, 9, 10, 10, 10, 10, 10, 6, 13, 14, 13, 11, 9, 9, 6, 19, 21, 16, 13, 10, 8, 7, 6, 5, 5, 5, 4, 2, 3, 2, 4, 4, 3, 3, 2, 3, 2, 2, 2, 3, 3, 3, 4, 2, 3, 5, 5, 6, 6, 6, 5, 10, 10, 10, 10, 8, 7, 11, 16, 17, 15, 11, 9, 7, 18, 21, 20, 15, 13, 10, 8, 3, 4, 2, 2, 1, 2, 2, 3, 4, 3, 2, 2, 2, 3, 3, 6, 4, 5, 5, 4, 4, 3, 8, 9, 9, 8, 7, 7, 8, 12, 15, 14, 13, 10, 8, 13, 17, 20, 19, 14, 11, 8, 19, 22, 23, 21, 16, 12, 9, 7, 9, 6, 3, 2, 0, 2, 7, 9, 7, 4, 3, 2, 2, 7, 9, 9, 7, 6, 5, 5, 7, 11, 14, 12, 10, 9, 8, 10, 15, 18, 17, 15, 13, 9, 15, 19, 22, 23, 17, 13, 10, 20, 23, 23, 24, 19, 15, 11, 15, 18, 21, 24, 25, 22, 18, 14, 17, 20, 24, 25, 22, 20, 13, 16, 20, 23, 26, 24, 21, 12, 16, 20, 23, 26, 24, 21, 13, 16, 19, 23, 27, 24, 21, 12, 16, 18, 22, 25, 24, 21, 17, 16, 17, 21, 24, 24, 21, 13, 16, 19, 21, 21, 18, 15, 12, 15, 18, 20, 20, 18, 15, 11, 14, 17, 20, 21, 19, 16, 10, 14, 18, 21, 21, 19, 17, 11, 14, 17, 20, 20, 20, 17, 12, 13, 16, 19, 19, 19, 16, 19, 17, 16, 18, 18, 18, 17, 11, 14, 15, 15, 16, 14, 10, 10, 13, 14, 14, 14, 13, 10, 9, 11, 13, 14, 14, 14, 11, 9, 12, 14, 14, 14, 14, 12, 8, 11, 13, 13, 13, 13, 12, 14, 14, 14, 13, 12, 12, 12, 22, 20, 16, 13, 11, 11, 11, 9, 9, 8, 8, 9, 9, 2, 8, 7, 7, 7, 7, 7, 2, 6, 6, 7, 7, 7, 7, 3, 6, 6, 7, 7, 7, 7, 6, 7, 8, 9, 9, 9, 7, 6, 14, 16, 14, 12, 10, 8, 6, 21, 22, 17, 13, 10, 8, 7, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 3, 3, 2, 6, 6, 7, 7, 7, 6, 6, 11, 12, 11, 11, 9, 7, 13, 17, 18, 15, 12, 10, 7, 20, 22, 21, 16, 13, 11, 8, 6, 5, 4, 3, 2, 1, 2, 5, 7, 4, 3, 3, 2, 2, 6, 9, 6, 6, 5, 4, 4, 6, 10, 10, 10, 9, 8, 7, 9, 14, 16, 15, 13, 11, 8, 15, 19, 22, 19, 15, 12, 9, 20, 23, 24, 22, 16, 13, 10, 9, 11, 7, 4, 3, 2, 0, 10, 11, 9, 5, 3, 3, 3, 9, 11, 12, 8, 7, 6, 5, 9, 13, 16, 13, 11, 10, 9, 12, 16, 20, 19, 16, 13, 10, 17, 20, 24, 24, 18, 14, 11, 21, 25, 25, 25, 20, 16, 12, 32, 36, 39, 42, 41, 39, 35, 31, 35, 37, 41, 41, 40, 35, 29, 33, 36, 39, 41, 39, 36, 29, 32, 35, 39, 42, 40, 37, 29, 31, 35, 39, 42, 41, 37, 27, 31, 34, 38, 42, 40, 36, 24, 28, 33, 37, 40, 41, 37, 30, 33, 36, 38, 38, 35, 31, 28, 31, 36, 38, 37, 34, 32, 27, 31, 34, 37, 37, 35, 31, 25, 30, 34, 37, 36, 35, 33, 26, 29, 33, 36, 36, 36, 33, 24, 29, 31, 35, 36, 35, 32, 21, 26, 30, 34, 34, 34, 32, 27, 30, 31, 32, 33, 30, 24, 25, 29, 31, 32, 31, 30, 25, 25, 27, 28, 30, 31, 30, 25, 21, 27, 28, 30, 29, 30, 26, 19, 26, 29, 30, 29, 28, 25, 15, 25, 26, 28, 27, 27, 25, 16, 23, 24, 25, 27, 27, 25, 24, 24, 25, 25, 25, 22, 13, 21, 23, 24, 24, 24, 21, 14, 17, 22, 22, 23, 22, 20, 15, 14, 22, 21, 22, 22, 20, 18, 14, 19, 20, 21, 21, 19, 14, 15, 17, 19, 19, 19, 18, 11, 16, 14, 16, 18, 18, 17, 8, 12, 16, 17, 17, 15, 10, 12, 9, 15, 15, 15, 14, 10, 13, 9, 13, 13, 13, 12, 8, 11, 9, 10, 13, 13, 12, 9, 10, 10, 7, 11, 11, 10, 6, 8, 10, 9, 8, 9, 9, 5, 8, 12, 11, 9, 7, 7, 4, 7, 4, 6, 6, 6, 7, 9, 11, 4, 4, 4, 5, 6, 9, 10, 4, 2, 2, 3, 4, 7, 9, 4, 2, 1, 1, 4, 6, 8, 5, 4, 4, 4, 4, 4, 7, 7, 6, 8, 6, 5, 4, 6, 8, 9, 9, 7, 5, 4, 5, 0, 4, 3, 2, 4, 7, 9, 0, 4, 4, 2, 3, 7, 9, 0, 4, 5, 2, 2, 6, 8, 0, 4, 5, 2, 2, 4, 6, 2, 4, 5, 5, 5, 4, 5, 4, 6, 8, 8, 5, 5, 4, 8, 8, 9, 9, 6, 5, 4, 37, 41, 45, 47, 47, 44, 41, 36, 40, 43, 47, 47, 44, 41, 35, 38, 43, 46, 47, 44, 41, 33, 37, 41, 45, 48, 45, 42, 35, 37, 41, 45, 48, 46, 43, 33, 37, 40, 43, 47, 46, 43, 31, 35, 39, 43, 46, 46, 43, 34, 39, 43, 44, 44, 39, 36, 34, 37, 42, 44, 43, 41, 36, 33, 36, 40, 43, 43, 39, 36, 31, 36, 40, 43, 43, 41, 37, 30, 36, 39, 42, 42, 42, 38, 28, 34, 37, 40, 40, 41, 37, 25, 32, 37, 40, 39, 39, 37, 32, 36, 38, 37, 37, 34, 28, 31, 35, 37, 37, 38, 34, 28, 28, 33, 34, 36, 36, 34, 28, 25, 34, 35, 34, 35, 34, 30, 23, 33, 35, 34, 35, 34, 29, 18, 30, 32, 34, 34, 32, 30, 18, 28, 32, 31, 33, 32, 28, 29, 30, 31, 31, 30, 25, 16, 25, 30, 30, 30, 28, 23, 18, 21, 28, 28, 29, 27, 22, 20, 17, 26, 28, 28, 27, 23, 22, 18, 23, 27, 27, 27, 22, 18, 19, 20, 25, 25, 25, 21, 15, 18, 17, 22, 23, 24, 21, 11, 16, 22, 23, 22, 17, 12, 16, 12, 20, 21, 21, 16, 11, 18, 13, 16, 20, 19, 15, 9, 15, 12, 12, 19, 19, 15, 11, 14, 14, 10, 17, 17, 13, 8, 11, 13, 11, 15, 15, 13, 7, 10, 14, 13, 12, 13, 11, 6, 9, 7, 11, 12, 9, 9, 11, 13, 7, 8, 10, 8, 7, 10, 12, 7, 5, 8, 7, 6, 8, 10, 7, 4, 7, 6, 6, 8, 10, 8, 6, 5, 5, 5, 6, 9, 9, 8, 7, 7, 5, 6, 8, 11, 9, 8, 7, 6, 5, 7, 4, 0, 2, 4, 6, 9, 11, 4, 0, 2, 3, 5, 7, 10, 4, 0, 3, 2, 5, 9, 10, 4, 1, 3, 2, 4, 5, 8, 4, 3, 5, 5, 5, 5, 7, 6, 6, 8, 8, 6, 5, 6, 7, 8, 8, 8, 6, 5, 6, 39, 41, 46, 47, 47, 45, 41, 37, 41, 43, 47, 46, 43, 40, 37, 39, 42, 46, 48, 45, 42, 35, 38, 43, 46, 48, 46, 43, 36, 39, 43, 45, 49, 46, 44, 35, 38, 42, 45, 48, 47, 43, 32, 35, 40, 43, 47, 47, 43, 36, 39, 43, 45, 43, 39, 36, 35, 38, 42, 43, 44, 40, 35, 34, 37, 42, 44, 42, 40, 36, 32, 37, 41, 43, 42, 40, 37, 31, 37, 40, 43, 43, 41, 37, 29, 35, 39, 42, 42, 40, 37, 25, 33, 38, 41, 40, 39, 37, 35, 37, 37, 38, 38, 33, 26, 31, 36, 37, 37, 36, 33, 27, 29, 35, 37, 37, 36, 33, 28, 25, 34, 36, 37, 36, 33, 30, 23, 34, 36, 36, 35, 32, 30, 19, 31, 34, 35, 35, 32, 30, 19, 29, 33, 33, 33, 31, 27, 29, 31, 31, 31, 30, 24, 16, 25, 30, 31, 30, 27, 22, 18, 21, 28, 29, 30, 27, 22, 20, 18, 26, 29, 28, 28, 22, 23, 19, 23, 28, 28, 26, 21, 19, 19, 20, 26, 26, 26, 20, 16, 19, 17, 24, 24, 24, 20, 12, 16, 23, 23, 22, 16, 10, 16, 13, 20, 22, 21, 15, 10, 17, 13, 16, 21, 20, 15, 9, 16, 12, 13, 21, 19, 15, 9, 15, 14, 11, 19, 19, 13, 7, 11, 15, 12, 16, 16, 12, 7, 9, 15, 14, 14, 15, 11, 7, 8, 7, 12, 13, 8, 7, 9, 12, 8, 7, 12, 8, 6, 8, 10, 7, 4, 10, 7, 6, 8, 10, 7, 5, 9, 7, 5, 7, 9, 9, 7, 7, 5, 6, 7, 8, 10, 9, 9, 10, 7, 6, 7, 12, 10, 11, 11, 9, 6, 7, 4, 2, 2, 3, 5, 7, 9, 4, 2, 0, 3, 5, 6, 9, 4, 2, 2, 2, 5, 8, 9, 4, 2, 5, 3, 4, 6, 8, 5, 4, 9, 10, 8, 6, 7, 7, 8, 14, 14, 11, 7, 6, 8, 12, 15, 15, 12, 8, 6, 31, 35, 38, 40, 41, 38, 34, 30, 34, 37, 40, 41, 37, 34, 29, 31, 36, 39, 41, 39, 35, 28, 32, 36, 38, 42, 39, 36, 29, 32, 35, 39, 42, 40, 36, 28, 32, 34, 38, 40, 40, 36, 25, 29, 33, 36, 40, 40, 35, 30, 33, 36, 38, 36, 32, 28, 28, 31, 34, 37, 36, 32, 29, 27, 30, 34, 36, 36, 34, 30, 26, 30, 34, 36, 36, 34, 30, 26, 30, 33, 36, 36, 35, 31, 24, 29, 32, 34, 35, 34, 30, 22, 26, 31, 34, 34, 33, 30, 28, 30, 31, 31, 31, 27, 20, 26, 29, 29, 30, 29, 27, 21, 24, 29, 29, 30, 30, 27, 22, 20, 28, 30, 30, 29, 27, 24, 18, 28, 29, 29, 29, 27, 23, 16, 26, 28, 28, 28, 26, 23, 17, 24, 25, 26, 27, 26, 21, 24, 25, 24, 24, 22, 18, 10, 20, 23, 23, 24, 22, 17, 12, 16, 22, 22, 22, 21, 16, 15, 13, 21, 22, 22, 21, 17, 18, 14, 19, 22, 21, 20, 16, 14, 15, 17, 19, 20, 19, 16, 10, 17, 15, 18, 18, 18, 16, 7, 12, 17, 16, 16, 11, 5, 11, 8, 15, 15, 15, 11, 6, 12, 9, 12, 14, 14, 11, 5, 10, 9, 9, 14, 13, 11, 5, 10, 10, 8, 13, 12, 10, 6, 7, 11, 10, 10, 10, 9, 5, 6, 13, 12, 11, 9, 8, 6, 5, 4, 7, 7, 5, 4, 5, 7, 4, 5, 5, 5, 3, 5, 6, 4, 3, 4, 4, 4, 5, 6, 4, 3, 3, 3, 4, 5, 5, 6, 5, 8, 8, 8, 6, 5, 8, 9, 14, 13, 10, 7, 5, 10, 13, 16, 14, 11, 8, 5, 2, 3, 2, 2, 3, 4, 5, 2, 3, 3, 0, 2, 4, 5, 2, 3, 4, 2, 2, 4, 5, 2, 5, 8, 6, 5, 5, 5, 4, 8, 12, 12, 10, 8, 6, 7, 12, 17, 18, 13, 9, 6, 12, 17, 19, 18, 14, 10, 7, 25, 29, 32, 35, 35, 31, 29, 24, 28, 30, 35, 35, 32, 28, 23, 26, 30, 33, 35, 32, 30, 23, 26, 30, 33, 36, 33, 30, 24, 25, 29, 32, 36, 34, 30, 22, 25, 28, 32, 35, 33, 30, 20, 23, 27, 31, 33, 34, 30, 24, 26, 30, 33, 30, 28, 23, 23, 25, 28, 32, 31, 28, 24, 22, 23, 28, 31, 30, 27, 24, 21, 24, 27, 30, 30, 28, 25, 21, 25, 27, 30, 29, 29, 25, 20, 23, 25, 29, 29, 29, 25, 17, 20, 24, 27, 28, 27, 25, 22, 24, 25, 26, 26, 22, 17, 21, 22, 24, 25, 24, 23, 17, 20, 22, 24, 24, 24, 22, 17, 17, 23, 24, 23, 24, 23, 18, 15, 22, 23, 22, 23, 22, 18, 13, 20, 21, 21, 22, 21, 18, 15, 18, 19, 20, 20, 21, 17, 20, 19, 18, 18, 19, 15, 7, 16, 18, 18, 17, 17, 14, 8, 14, 18, 17, 16, 17, 14, 10, 10, 17, 17, 16, 16, 14, 13, 12, 16, 16, 15, 16, 13, 9, 12, 14, 14, 14, 14, 12, 6, 15, 16, 12, 12, 13, 12, 5, 9, 11, 11, 11, 9, 4, 6, 5, 10, 9, 9, 8, 3, 8, 5, 9, 8, 8, 8, 3, 6, 5, 7, 9, 8, 7, 4, 6, 7, 6, 7, 7, 7, 6, 4, 9, 10, 12, 10, 8, 6, 5, 13, 16, 16, 11, 9, 7, 5, 2, 2, 1, 2, 2, 3, 4, 2, 2, 1, 0, 2, 3, 4, 2, 2, 2, 2, 2, 3, 4, 2, 4, 6, 6, 5, 5, 5, 4, 8, 11, 10, 9, 7, 5, 8, 13, 18, 15, 11, 8, 6, 14, 18, 19, 17, 12, 9, 7, 4, 5, 3, 2, 1, 2, 3, 4, 5, 4, 2, 0, 2, 4, 4, 5, 6, 4, 3, 2, 3, 4, 7, 10, 8, 7, 6, 6, 7, 11, 14, 14, 11, 9, 7, 11, 15, 19, 19, 14, 10, 7, 16, 19, 20, 20, 16, 12, 8, 21, 24, 27, 31, 32, 29, 25, 19, 23, 27, 30, 31, 28, 24, 18, 22, 26, 29, 30, 28, 25, 18, 21, 24, 28, 31, 28, 25, 19, 21, 24, 27, 31, 29, 25, 17, 20, 23, 26, 30, 29, 25, 15, 19, 22, 26, 29, 29, 26, 19, 21, 25, 29, 28, 25, 21, 18, 20, 24, 28, 27, 24, 20, 17, 20, 22, 26, 25, 23, 21, 16, 20, 22, 25, 25, 24, 21, 17, 19, 22, 24, 24, 24, 21, 15, 18, 21, 23, 24, 23, 21, 16, 16, 19, 22, 22, 22, 21, 17, 19, 21, 22, 22, 20, 16, 16, 18, 19, 21, 21, 19, 14, 16, 17, 19, 19, 19, 18, 15, 14, 18, 18, 18, 18, 18, 16, 13, 17, 18, 18, 17, 18, 15, 11, 15, 17, 17, 17, 16, 15, 17, 16, 15, 15, 16, 16, 14, 16, 14, 14, 14, 15, 14, 6, 14, 13, 13, 13, 13, 12, 5, 11, 12, 12, 12, 11, 11, 6, 8, 12, 12, 12, 11, 11, 9, 9, 11, 11, 11, 10, 10, 6, 11, 11, 11, 9, 9, 9, 4, 17, 18, 13, 10, 8, 8, 4, 7, 7, 6, 6, 7, 4, 5, 2, 5, 5, 5, 5, 3, 5, 2, 4, 3, 3, 3, 2, 3, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 7, 8, 6, 4, 9, 13, 14, 12, 9, 7, 5, 16, 18, 17, 13, 10, 8, 5, 2, 3, 2, 2, 2, 3, 4, 2, 4, 3, 2, 2, 2, 2, 2, 5, 4, 3, 2, 2, 2, 2, 6, 7, 6, 6, 5, 5, 6, 10, 13, 11, 10, 8, 5, 11, 15, 18, 16, 12, 9, 6, 16, 19, 19, 18, 13, 10, 7, 6, 8, 5, 3, 2, 2, 3, 6, 7, 7, 4, 2, 0, 2, 6, 7, 8, 5, 4, 3, 3, 6, 9, 12, 9, 8, 7, 6, 8, 12, 16, 15, 12, 10, 7, 13, 16, 20, 21, 15, 11, 8, 18, 21, 20, 21, 16, 12, 9, 17, 20, 24, 28, 28, 25, 22, 16, 19, 23, 27, 28, 24, 20, 14, 17, 21, 24, 26, 24, 20, 13, 17, 20, 23, 27, 24, 21, 14, 17, 20, 23, 27, 25, 21, 12, 15, 19, 22, 26, 24, 21, 14, 14, 18, 21, 25, 24, 21, 14, 18, 22, 25, 24, 21, 18, 13, 17, 20, 23, 23, 20, 16, 13, 15, 18, 21, 21, 19, 16, 12, 15, 18, 20, 21, 19, 16, 12, 15, 18, 20, 20, 20, 17, 10, 13, 16, 19, 20, 19, 17, 16, 15, 15, 18, 18, 18, 17, 13, 16, 17, 18, 19, 17, 13, 12, 14, 16, 16, 17, 15, 11, 10, 13, 14, 14, 14, 14, 11, 10, 13, 14, 14, 14, 14, 12, 9, 12, 14, 13, 13, 14, 12, 12, 12, 12, 12, 13, 12, 12, 18, 17, 13, 11, 11, 11, 11, 11, 10, 10, 11, 12, 12, 5, 10, 9, 9, 9, 10, 10, 3, 8, 8, 8, 8, 7, 7, 3, 5, 8, 7, 7, 7, 7, 5, 7, 7, 7, 6, 6, 6, 3, 12, 13, 11, 9, 7, 6, 4, 18, 18, 14, 10, 8, 6, 4, 2, 2, 2, 3, 3, 4, 4, 1, 1, 0, 1, 2, 2, 3, 1, 2, 2, 2, 1, 1, 2, 1, 5, 5, 4, 4, 4, 3, 5, 10, 9, 8, 8, 6, 4, 11, 14, 14, 12, 10, 7, 5, 17, 19, 17, 13, 10, 8, 5, 5, 5, 4, 3, 3, 3, 4, 5, 7, 4, 4, 3, 1, 2, 5, 8, 6, 4, 3, 2, 2, 5, 9, 9, 7, 6, 6, 5, 9, 12, 14, 12, 10, 8, 5, 12, 16, 19, 16, 12, 9, 6, 17, 19, 20, 18, 14, 10, 7, 9, 10, 7, 5, 3, 2, 3, 10, 10, 9, 5, 4, 2, 0, 9, 10, 11, 7, 5, 4, 3, 10, 11, 14, 10, 8, 7, 6, 10, 14, 17, 16, 13, 10, 8, 14, 17, 21, 20, 15, 11, 8, 18, 20, 22, 22, 17, 12, 9, 32, 35, 38, 41, 41, 38, 36, 30, 34, 37, 41, 41, 39, 37, 29, 32, 37, 40, 42, 39, 37, 28, 32, 36, 39, 42, 39, 37, 28, 31, 35, 39, 42, 41, 36, 28, 30, 34, 38, 41, 40, 36, 25, 29, 33, 37, 40, 39, 37, 29, 33, 36, 39, 38, 35, 32, 28, 32, 35, 39, 37, 35, 31, 27, 31, 34, 37, 37, 35, 31, 25, 30, 33, 36, 36, 36, 33, 25, 30, 33, 36, 35, 36, 32, 24, 27, 31, 35, 36, 35, 33, 21, 26, 30, 34, 34, 34, 32, 27, 31, 31, 32, 32, 30, 25, 26, 29, 31, 32, 32, 30, 25, 24, 28, 30, 30, 30, 30, 24, 21, 28, 28, 30, 30, 29, 26, 18, 26, 28, 29, 29, 29, 25, 15, 25, 27, 27, 28, 28, 25, 16, 22, 25, 26, 26, 27, 25, 24, 25, 24, 25, 25, 23, 13, 20, 23, 24, 24, 24, 21, 14, 18, 22, 23, 22, 22, 20, 15, 14, 21, 21, 22, 22, 20, 18, 14, 19, 20, 21, 21, 19, 14, 15, 17, 18, 19, 19, 18, 11, 16, 14, 16, 17, 18, 17, 8, 12, 16, 17, 17, 15, 10, 13, 9, 15, 15, 15, 13, 10, 14, 9, 13, 13, 13, 12, 8, 12, 9, 9, 12, 12, 12, 9, 10, 10, 7, 11, 11, 10, 6, 8, 10, 9, 8, 8, 9, 5, 8, 12, 10, 9, 7, 7, 4, 7, 4, 6, 6, 6, 7, 9, 11, 4, 4, 4, 5, 6, 9, 10, 4, 2, 2, 3, 4, 7, 9, 4, 2, 1, 1, 3, 6, 8, 5, 4, 4, 4, 4, 4, 7, 7, 6, 8, 6, 5, 4, 6, 9, 9, 9, 7, 5, 4, 6, 0, 4, 3, 2, 4, 7, 9, 0, 4, 4, 2, 4, 6, 8, 0, 4, 5, 2, 2, 6, 8, 0, 4, 4, 2, 2, 4, 6, 2, 4, 5, 5, 5, 4, 5, 4, 6, 8, 8, 6, 5, 4, 8, 8, 9, 9, 6, 5, 4, 38, 41, 44, 47, 47, 44, 41, 37, 40, 43, 47, 47, 45, 42, 35, 39, 42, 46, 47, 45, 42, 34, 37, 42, 45, 48, 46, 42, 34, 38, 41, 45, 49, 46, 43, 34, 36, 41, 44, 48, 46, 42, 32, 35, 38, 42, 46, 46, 42, 35, 39, 43, 44, 42, 39, 36, 34, 38, 41, 45, 43, 39, 36, 33, 36, 39, 43, 42, 40, 36, 31, 36, 39, 43, 41, 40, 37, 31, 35, 39, 43, 41, 41, 37, 28, 34, 38, 41, 40, 40, 37, 24, 31, 36, 39, 40, 39, 37, 33, 36, 38, 38, 37, 34, 27, 32, 34, 37, 38, 37, 33, 28, 28, 33, 36, 35, 36, 34, 28, 25, 34, 35, 36, 35, 34, 30, 22, 33, 35, 35, 35, 33, 30, 19, 31, 32, 33, 33, 32, 29, 19, 28, 31, 32, 33, 31, 28, 29, 31, 30, 30, 29, 25, 16, 24, 29, 29, 29, 28, 24, 18, 21, 28, 29, 29, 27, 23, 19, 17, 26, 27, 28, 28, 23, 22, 18, 23, 27, 26, 26, 22, 19, 19, 19, 25, 25, 24, 22, 14, 19, 17, 23, 24, 24, 20, 11, 16, 22, 21, 22, 17, 12, 16, 13, 20, 21, 20, 16, 12, 17, 12, 16, 20, 19, 16, 9, 15, 12, 12, 19, 19, 15, 10, 14, 14, 10, 18, 17, 14, 8, 11, 14, 11, 15, 15, 12, 7, 10, 15, 13, 12, 13, 11, 6, 9, 7, 11, 12, 9, 9, 10, 13, 7, 8, 10, 8, 7, 10, 12, 7, 5, 8, 7, 6, 8, 10, 7, 5, 7, 6, 6, 8, 9, 8, 6, 6, 5, 5, 6, 9, 9, 8, 7, 7, 5, 6, 8, 11, 9, 8, 7, 6, 5, 7, 4, 0, 2, 4, 6, 9, 11, 4, 0, 2, 3, 5, 7, 10, 4, 0, 3, 2, 5, 9, 9, 4, 1, 3, 2, 4, 5, 8, 4, 3, 5, 5, 5, 5, 7, 6, 6, 8, 8, 6, 5, 6, 7, 9, 8, 8, 6, 5, 6, 41, 44, 47, 50, 50, 47, 43, 40, 43, 48, 50, 51, 47, 44, 39, 42, 46, 48, 51, 46, 44, 37, 41, 45, 48, 51, 48, 45, 38, 41, 45, 49, 51, 49, 45, 37, 40, 44, 47, 51, 49, 46, 34, 38, 42, 46, 49, 48, 44, 39, 42, 46, 48, 46, 42, 38, 38, 41, 45, 48, 46, 42, 37, 37, 40, 43, 46, 45, 43, 39, 33, 40, 43, 46, 46, 43, 39, 33, 40, 43, 45, 45, 44, 39, 30, 38, 40, 44, 44, 43, 38, 27, 36, 40, 43, 42, 41, 39, 37, 40, 41, 40, 40, 37, 29, 34, 39, 39, 41, 38, 36, 29, 31, 38, 40, 38, 38, 36, 30, 27, 37, 38, 40, 37, 36, 32, 25, 35, 38, 38, 37, 35, 32, 21, 33, 36, 36, 36, 34, 32, 21, 30, 35, 35, 36, 33, 29, 31, 34, 33, 34, 31, 27, 19, 26, 32, 34, 33, 31, 25, 20, 23, 30, 32, 31, 30, 24, 22, 19, 27, 31, 32, 29, 23, 25, 20, 25, 31, 30, 28, 22, 21, 21, 22, 29, 28, 27, 22, 17, 21, 18, 26, 27, 26, 21, 14, 18, 26, 26, 25, 18, 13, 19, 14, 22, 25, 24, 17, 12, 20, 14, 18, 23, 23, 16, 10, 18, 14, 15, 22, 22, 15, 10, 17, 15, 12, 21, 20, 14, 9, 13, 16, 13, 18, 18, 14, 8, 10, 16, 14, 15, 17, 12, 8, 9, 9, 13, 15, 10, 9, 11, 15, 9, 9, 14, 10, 8, 10, 13, 9, 5, 12, 8, 7, 9, 11, 9, 6, 11, 8, 7, 9, 10, 11, 8, 9, 6, 6, 7, 9, 11, 9, 8, 8, 6, 7, 9, 12, 11, 9, 9, 8, 6, 7, 5, 3, 3, 5, 7, 9, 12, 5, 3, 2, 4, 6, 8, 11, 5, 3, 0, 4, 7, 9, 11, 5, 3, 3, 3, 4, 7, 9, 6, 4, 7, 8, 7, 6, 8, 7, 6, 10, 11, 8, 6, 7, 9, 10, 11, 11, 9, 7, 6, 34, 38, 42, 44, 45, 41, 37, 32, 37, 41, 44, 44, 41, 37, 31, 35, 39, 43, 43, 41, 36, 30, 33, 37, 40, 43, 40, 37, 30, 33, 37, 40, 43, 40, 38, 29, 32, 35, 40, 42, 41, 36, 26, 31, 35, 38, 42, 41, 38, 32, 35, 39, 43, 40, 36, 33, 31, 34, 38, 41, 40, 37, 32, 30, 32, 36, 39, 38, 35, 30, 27, 31, 34, 37, 38, 35, 31, 27, 31, 34, 38, 37, 36, 31, 25, 30, 33, 36, 37, 35, 31, 21, 27, 32, 35, 35, 34, 31, 29, 33, 34, 35, 33, 31, 25, 27, 31, 33, 35, 33, 30, 24, 24, 30, 31, 32, 31, 29, 23, 21, 30, 30, 30, 30, 28, 24, 19, 28, 30, 30, 29, 28, 24, 16, 26, 28, 28, 29, 26, 25, 16, 24, 27, 26, 28, 26, 22, 23, 27, 26, 28, 27, 22, 15, 20, 25, 26, 26, 26, 21, 15, 17, 23, 24, 24, 23, 18, 16, 14, 23, 23, 23, 21, 18, 19, 15, 19, 23, 22, 21, 17, 15, 15, 17, 21, 21, 20, 16, 11, 16, 15, 19, 19, 20, 16, 7, 13, 19, 18, 19, 15, 9, 15, 9, 17, 18, 17, 14, 8, 15, 9, 13, 16, 15, 12, 6, 12, 9, 10, 15, 14, 11, 6, 10, 10, 8, 14, 13, 10, 5, 7, 11, 9, 11, 11, 9, 4, 5, 12, 11, 9, 10, 8, 4, 5, 4, 9, 9, 8, 6, 8, 11, 4, 6, 8, 7, 5, 7, 9, 4, 3, 5, 5, 3, 5, 6, 4, 3, 4, 4, 3, 4, 5, 6, 4, 5, 5, 6, 4, 5, 7, 6, 11, 10, 7, 5, 5, 9, 11, 12, 12, 9, 6, 4, 2, 2, 2, 3, 5, 7, 8, 2, 2, 2, 2, 4, 5, 7, 2, 2, 3, 0, 3, 5, 6, 2, 3, 6, 4, 3, 3, 4, 3, 5, 9, 10, 8, 5, 4, 5, 9, 15, 15, 11, 7, 4, 9, 14, 17, 17, 12, 8, 5, 27, 33, 36, 39, 39, 37, 33, 27, 30, 35, 38, 40, 37, 32, 25, 29, 34, 37, 38, 34, 30, 25, 27, 32, 35, 37, 34, 32, 25, 27, 30, 34, 37, 35, 31, 24, 26, 29, 33, 36, 34, 31, 21, 24, 28, 32, 35, 34, 32, 26, 29, 34, 37, 35, 32, 28, 24, 29, 32, 35, 36, 32, 27, 24, 26, 30, 33, 33, 30, 25, 23, 25, 28, 31, 31, 29, 26, 23, 25, 28, 31, 31, 28, 26, 21, 24, 27, 30, 30, 29, 26, 18, 22, 25, 28, 29, 28, 26, 24, 26, 29, 30, 30, 27, 22, 22, 25, 28, 28, 29, 26, 20, 21, 24, 26, 26, 26, 25, 18, 17, 24, 24, 24, 25, 24, 19, 16, 23, 23, 23, 23, 22, 19, 13, 21, 22, 22, 22, 20, 19, 14, 19, 21, 21, 21, 21, 17, 21, 22, 21, 22, 23, 20, 13, 17, 20, 21, 21, 21, 18, 12, 14, 19, 19, 18, 19, 15, 12, 11, 19, 17, 17, 17, 14, 13, 12, 16, 16, 17, 16, 13, 10, 13, 14, 15, 15, 15, 13, 7, 14, 13, 13, 13, 13, 13, 4, 9, 14, 14, 15, 13, 9, 13, 6, 13, 12, 13, 12, 6, 12, 6, 10, 10, 10, 9, 4, 8, 6, 7, 9, 9, 8, 4, 6, 7, 5, 8, 7, 7, 3, 4, 8, 7, 8, 7, 6, 3, 4, 10, 11, 11, 8, 5, 4, 3, 2, 4, 5, 5, 5, 7, 9, 2, 2, 3, 4, 4, 5, 7, 2, 0, 1, 1, 2, 3, 4, 2, 2, 3, 2, 2, 2, 3, 4, 5, 8, 7, 6, 4, 3, 5, 9, 14, 12, 8, 5, 3, 10, 13, 16, 13, 9, 6, 3, 3, 6, 4, 2, 5, 6, 7, 2, 5, 5, 2, 3, 4, 5, 3, 6, 7, 3, 0, 3, 4, 2, 5, 7, 5, 4, 3, 3, 4, 7, 11, 11, 8, 6, 4, 7, 11, 15, 15, 11, 7, 4, 12, 16, 16, 16, 12, 8, 5, 24, 29, 32, 36, 35, 32, 29, 23, 27, 31, 35, 34, 31, 28, 21, 25, 29, 33, 34, 30, 26, 20, 22, 26, 30, 32, 29, 27, 19, 22, 24, 28, 32, 30, 27, 18, 21, 23, 27, 31, 30, 27, 16, 19, 23, 26, 29, 30, 26, 22, 25, 28, 33, 31, 28, 25, 20, 24, 28, 31, 31, 27, 24, 19, 22, 26, 30, 29, 26, 22, 18, 20, 23, 26, 26, 25, 21, 18, 20, 22, 26, 26, 25, 22, 16, 19, 22, 25, 24, 24, 22, 13, 17, 20, 23, 23, 24, 22, 19, 22, 24, 26, 26, 24, 20, 18, 21, 23, 24, 25, 23, 18, 17, 20, 22, 21, 22, 21, 16, 15, 19, 19, 19, 20, 19, 15, 13, 17, 19, 18, 18, 18, 15, 11, 16, 17, 17, 18, 17, 16, 13, 14, 15, 16, 16, 17, 14, 17, 17, 17, 18, 19, 18, 10, 15, 16, 17, 17, 17, 15, 9, 11, 15, 15, 15, 14, 13, 8, 8, 14, 13, 12, 12, 11, 10, 9, 12, 12, 11, 11, 10, 6, 10, 10, 10, 10, 10, 9, 3, 13, 14, 10, 8, 9, 8, 3, 7, 9, 10, 10, 11, 8, 10, 3, 7, 8, 9, 9, 5, 9, 3, 6, 6, 6, 6, 3, 5, 3, 4, 4, 4, 3, 2, 3, 5, 5, 4, 4, 4, 3, 3, 7, 9, 10, 8, 6, 4, 2, 11, 14, 13, 10, 7, 4, 2, 0, 2, 2, 3, 4, 6, 8, 0, 4, 3, 3, 3, 4, 5, 0, 4, 3, 2, 1, 2, 3, 0, 5, 5, 3, 3, 2, 2, 3, 7, 9, 8, 7, 4, 2, 7, 12, 15, 12, 9, 5, 3, 12, 15, 16, 14, 10, 7, 4, 6, 9, 6, 3, 3, 5, 6, 6, 9, 8, 4, 2, 3, 4, 6, 9, 11, 5, 3, 0, 3, 6, 7, 9, 6, 4, 4, 3, 6, 9, 12, 12, 9, 6, 4, 9, 13, 16, 16, 11, 8, 4, 14, 17, 17, 17, 13, 9, 5, 20, 23, 27, 31, 30, 28, 24, 19, 22, 26, 31, 31, 27, 24, 17, 21, 25, 28, 29, 26, 22, 16, 19, 22, 25, 27, 24, 21, 14, 17, 20, 23, 27, 25, 22, 14, 16, 19, 23, 26, 25, 21, 11, 14, 18, 22, 25, 25, 22, 17, 20, 25, 29, 28, 25, 21, 16, 20, 24, 28, 27, 23, 20, 15, 18, 22, 24, 24, 22, 18, 14, 16, 19, 21, 21, 19, 17, 13, 16, 18, 20, 20, 21, 17, 11, 14, 17, 20, 20, 20, 17, 12, 12, 16, 19, 19, 18, 17, 15, 18, 21, 22, 23, 21, 16, 14, 17, 19, 20, 21, 20, 15, 13, 16, 18, 18, 18, 17, 13, 12, 14, 14, 14, 15, 15, 12, 10, 13, 14, 14, 14, 14, 12, 9, 11, 12, 12, 13, 12, 12, 13, 12, 11, 11, 11, 11, 11, 13, 13, 13, 14, 15, 15, 8, 11, 11, 12, 13, 13, 13, 7, 9, 10, 11, 10, 10, 10, 6, 5, 9, 8, 7, 7, 7, 6, 7, 7, 7, 7, 6, 6, 3, 9, 9, 8, 6, 5, 5, 2, 13, 13, 9, 7, 5, 4, 2, 4, 5, 5, 6, 7, 7, 8, 1, 3, 4, 5, 5, 5, 6, 1, 1, 2, 2, 2, 2, 3, 1, 3, 2, 1, 2, 1, 2, 3, 6, 6, 5, 5, 3, 2, 8, 11, 11, 9, 6, 4, 2, 12, 14, 13, 10, 8, 6, 3, 5, 5, 4, 4, 4, 6, 7, 5, 7, 4, 4, 4, 3, 4, 5, 7, 5, 4, 2, 1, 2, 5, 7, 6, 5, 3, 3, 2, 6, 9, 11, 9, 7, 6, 3, 9, 12, 15, 13, 9, 6, 4, 13, 15, 16, 14, 10, 7, 4, 8, 10, 7, 4, 4, 5, 5, 8, 10, 9, 5, 3, 3, 3, 8, 10, 11, 6, 4, 3, 0, 8, 9, 11, 7, 5, 4, 3, 8, 10, 14, 13, 9, 7, 5, 11, 14, 17, 16, 12, 8, 6, 14, 16, 17, 17, 13, 9, 6, 32, 35, 38, 42, 42, 39, 35, 31, 35, 38, 41, 41, 39, 37, 29, 33, 37, 40, 41, 39, 37, 29, 31, 35, 38, 42, 39, 37, 28, 31, 35, 39, 42, 40, 37, 27, 31, 35, 37, 41, 40, 36, 24, 28, 33, 36, 41, 39, 36, 29, 33, 37, 39, 38, 34, 32, 29, 32, 35, 38, 37, 35, 31, 27, 30, 33, 38, 37, 34, 32, 26, 29, 33, 36, 36, 35, 33, 26, 29, 33, 35, 36, 36, 33, 23, 28, 31, 35, 35, 35, 33, 21, 25, 29, 33, 34, 34, 32, 27, 31, 32, 32, 33, 30, 24, 26, 28, 32, 31, 32, 29, 25, 24, 28, 29, 30, 30, 29, 24, 21, 28, 28, 29, 30, 30, 26, 19, 26, 29, 28, 29, 28, 26, 15, 24, 27, 27, 28, 27, 26, 16, 22, 25, 25, 27, 26, 25, 24, 25, 25, 25, 25, 22, 13, 21, 23, 24, 24, 24, 21, 14, 18, 22, 23, 23, 22, 20, 15, 13, 22, 22, 22, 23, 20, 17, 15, 20, 21, 21, 21, 19, 14, 15, 17, 19, 19, 19, 18, 11, 16, 14, 16, 17, 18, 17, 8, 12, 17, 16, 17, 14, 10, 13, 9, 15, 15, 15, 14, 10, 14, 9, 12, 13, 13, 13, 8, 12, 9, 10, 13, 12, 12, 9, 10, 10, 7, 11, 11, 10, 6, 8, 10, 9, 8, 9, 9, 5, 8, 12, 10, 9, 7, 7, 4, 7, 4, 6, 6, 6, 7, 9, 10, 4, 4, 4, 5, 5, 9, 10, 4, 2, 2, 3, 4, 7, 9, 4, 2, 1, 1, 4, 6, 8, 5, 4, 4, 4, 4, 4, 7, 7, 6, 8, 6, 4, 4, 6, 9, 9, 8, 7, 5, 4, 5, 0, 4, 3, 2, 4, 7, 9, 0, 4, 4, 2, 4, 6, 8, 0, 4, 5, 2, 2, 6, 8, 0, 4, 4, 2, 2, 4, 6, 2, 4, 6, 5, 5, 4, 5, 4, 6, 8, 8, 6, 5, 4, 8, 8, 9, 9, 6, 5, 4, 38, 42, 46, 49, 49, 46, 42, 37, 41, 46, 48, 50, 45, 42, 36, 39, 44, 47, 48, 45, 40, 34, 38, 41, 45, 48, 44, 41, 34, 37, 41, 45, 48, 45, 41, 32, 37, 40, 43, 47, 46, 42, 30, 34, 39, 43, 46, 46, 42, 36, 40, 44, 46, 44, 41, 37, 34, 38, 42, 45, 45, 40, 37, 33, 37, 42, 43, 44, 41, 38, 30, 36, 39, 42, 40, 39, 37, 30, 35, 38, 42, 42, 40, 36, 27, 33, 36, 40, 41, 39, 38, 24, 31, 35, 39, 39, 37, 37, 32, 36, 39, 39, 39, 36, 29, 32, 35, 37, 39, 37, 35, 29, 28, 34, 36, 37, 36, 35, 28, 25, 34, 33, 34, 35, 33, 29, 22, 32, 34, 34, 34, 33, 30, 18, 29, 31, 33, 33, 32, 29, 17, 27, 30, 31, 32, 31, 27, 28, 31, 32, 31, 31, 27, 19, 24, 30, 31, 31, 30, 25, 19, 20, 27, 29, 28, 28, 24, 21, 16, 26, 27, 27, 26, 22, 22, 17, 22, 26, 26, 25, 22, 18, 18, 19, 24, 24, 24, 21, 14, 17, 15, 22, 23, 23, 20, 11, 15, 22, 23, 24, 18, 14, 19, 12, 20, 22, 21, 18, 13, 19, 12, 16, 19, 19, 17, 10, 16, 12, 12, 18, 18, 15, 10, 13, 13, 9, 17, 16, 13, 8, 10, 12, 10, 14, 14, 12, 7, 10, 13, 12, 11, 12, 10, 6, 8, 7, 11, 13, 11, 9, 12, 15, 7, 7, 11, 10, 8, 11, 13, 7, 5, 9, 8, 7, 8, 11, 7, 4, 7, 6, 7, 9, 9, 7, 5, 5, 4, 4, 6, 8, 8, 7, 6, 6, 4, 5, 8, 10, 8, 8, 6, 5, 4, 6, 4, 1, 2, 6, 8, 10, 13, 4, 1, 2, 5, 7, 9, 10, 4, 1, 3, 3, 5, 7, 9, 4, 0, 3, 1, 3, 5, 7, 4, 2, 4, 4, 4, 4, 6, 5, 5, 7, 7, 5, 4, 6, 7, 7, 7, 7, 5, 4, 5, 45, 49, 52, 55, 56, 52, 48, 43, 47, 51, 55, 54, 51, 47, 41, 45, 50, 52, 53, 50, 46, 40, 44, 47, 51, 52, 49, 46, 38, 41, 45, 49, 52, 50, 46, 37, 41, 44, 48, 51, 50, 46, 34, 39, 43, 47, 50, 49, 47, 42, 45, 49, 53, 51, 48, 43, 40, 45, 49, 53, 51, 47, 42, 37, 43, 47, 51, 49, 46, 40, 35, 40, 44, 48, 46, 45, 40, 33, 41, 44, 46, 45, 45, 40, 30, 39, 42, 45, 45, 44, 40, 26, 36, 40, 44, 43, 42, 40, 38, 43, 45, 46, 45, 42, 34, 34, 41, 44, 44, 44, 40, 34, 31, 40, 42, 41, 41, 39, 33, 28, 37, 39, 39, 38, 36, 33, 24, 36, 38, 40, 38, 35, 33, 21, 32, 37, 37, 37, 34, 33, 19, 30, 34, 35, 35, 34, 30, 31, 37, 38, 37, 36, 32, 25, 27, 34, 36, 35, 35, 30, 25, 24, 31, 35, 34, 33, 27, 25, 20, 28, 31, 32, 30, 25, 26, 20, 25, 31, 31, 29, 23, 22, 21, 21, 29, 29, 28, 23, 19, 20, 17, 26, 28, 27, 22, 14, 18, 27, 29, 29, 23, 19, 25, 15, 23, 27, 27, 22, 16, 25, 15, 19, 25, 25, 20, 13, 20, 15, 15, 23, 23, 17, 11, 17, 15, 12, 21, 21, 15, 10, 14, 16, 12, 18, 19, 15, 8, 12, 15, 13, 14, 17, 13, 8, 12, 10, 14, 19, 15, 13, 16, 21, 10, 10, 17, 13, 12, 14, 18, 10, 6, 15, 11, 9, 11, 14, 10, 5, 11, 8, 7, 10, 11, 10, 6, 9, 6, 5, 8, 10, 10, 8, 6, 5, 4, 6, 10, 11, 9, 7, 5, 4, 6, 8, 5, 3, 6, 9, 12, 14, 16, 5, 3, 5, 8, 10, 12, 14, 5, 3, 3, 6, 7, 9, 11, 5, 3, 0, 3, 6, 10, 10, 5, 3, 3, 3, 3, 5, 8, 6, 5, 5, 6, 4, 5, 7, 8, 6, 6, 6, 5, 4, 6, 38, 43, 47, 49, 51, 47, 43, 36, 41, 43, 50, 49, 46, 41, 35, 39, 44, 46, 47, 45, 39, 34, 37, 40, 44, 46, 42, 38, 31, 34, 38, 42, 44, 42, 38, 30, 34, 36, 40, 44, 43, 37, 28, 31, 35, 39, 42, 42, 38, 34, 40, 44, 47, 45, 42, 38, 34, 38, 42, 46, 45, 41, 37, 32, 36, 40, 43, 43, 39, 34, 31, 34, 37, 40, 39, 38, 33, 27, 32, 35, 38, 38, 37, 33, 24, 32, 34, 37, 37, 36, 33, 20, 29, 33, 36, 36, 35, 34, 33, 36, 38, 38, 39, 36, 30, 29, 34, 38, 39, 39, 35, 29, 26, 33, 36, 36, 36, 34, 27, 23, 31, 32, 33, 33, 31, 26, 19, 29, 32, 32, 31, 29, 25, 15, 28, 30, 31, 31, 28, 25, 15, 25, 28, 29, 29, 27, 24, 26, 30, 31, 31, 32, 28, 21, 22, 29, 30, 31, 30, 25, 20, 18, 26, 28, 29, 27, 23, 20, 16, 22, 25, 25, 25, 19, 20, 14, 19, 25, 24, 23, 17, 16, 15, 16, 22, 22, 21, 18, 12, 15, 13, 20, 20, 20, 17, 9, 14, 22, 23, 24, 20, 15, 20, 10, 19, 21, 22, 18, 13, 21, 11, 14, 19, 19, 16, 10, 16, 10, 9, 17, 16, 12, 7, 12, 10, 7, 15, 15, 11, 7, 9, 11, 8, 12, 12, 10, 5, 7, 11, 9, 10, 11, 9, 4, 6, 5, 11, 14, 12, 11, 13, 17, 5, 7, 12, 11, 10, 11, 14, 6, 3, 9, 8, 7, 8, 10, 5, 3, 6, 5, 4, 5, 7, 5, 3, 4, 3, 2, 4, 6, 6, 5, 7, 6, 4, 3, 7, 8, 7, 8, 8, 5, 3, 4, 2, 2, 4, 7, 9, 12, 13, 2, 2, 3, 6, 8, 9, 10, 2, 2, 3, 4, 5, 6, 8, 2, 1, 3, 0, 3, 5, 6, 2, 1, 5, 6, 4, 3, 5, 3, 5, 11, 11, 7, 3, 4, 5, 9, 12, 13, 8, 4, 3, 32, 37, 41, 44, 43, 41, 38, 30, 35, 39, 44, 44, 41, 36, 30, 34, 39, 41, 42, 38, 34, 28, 32, 35, 38, 41, 37, 32, 26, 29, 31, 35, 38, 36, 32, 24, 27, 30, 34, 38, 36, 33, 22, 25, 29, 34, 36, 36, 32, 30, 35, 38, 41, 41, 37, 33, 30, 32, 36, 40, 38, 36, 31, 27, 31, 35, 38, 37, 34, 30, 25, 29, 32, 35, 35, 32, 27, 23, 26, 30, 32, 32, 31, 28, 21, 25, 28, 30, 31, 30, 27, 18, 23, 27, 30, 29, 29, 28, 27, 31, 33, 34, 35, 33, 26, 25, 29, 31, 33, 33, 30, 24, 23, 28, 31, 30, 31, 29, 23, 19, 26, 27, 26, 28, 26, 21, 15, 24, 25, 25, 25, 24, 21, 13, 23, 24, 23, 23, 23, 21, 12, 21, 22, 22, 23, 23, 19, 22, 25, 26, 27, 27, 25, 18, 19, 24, 24, 25, 25, 22, 17, 15, 22, 23, 23, 22, 19, 16, 12, 19, 19, 19, 20, 16, 16, 11, 16, 18, 17, 17, 14, 12, 12, 13, 16, 16, 16, 13, 9, 12, 11, 15, 14, 15, 13, 6, 10, 17, 18, 18, 17, 13, 18, 7, 16, 16, 17, 16, 10, 17, 7, 12, 15, 14, 13, 8, 12, 7, 7, 11, 10, 10, 5, 8, 7, 4, 9, 9, 8, 4, 5, 7, 6, 6, 7, 6, 3, 5, 9, 8, 7, 5, 5, 2, 4, 3, 8, 9, 9, 9, 11, 15, 3, 6, 7, 8, 8, 9, 11, 3, 2, 5, 4, 6, 6, 7, 3, 1, 1, 1, 3, 3, 4, 2, 2, 3, 3, 2, 2, 4, 4, 5, 9, 8, 4, 2, 5, 6, 9, 11, 9, 6, 2, 3, 2, 4, 4, 6, 8, 10, 11, 2, 4, 4, 5, 7, 8, 8, 2, 4, 5, 3, 4, 4, 5, 2, 3, 7, 3, 0, 3, 4, 1, 4, 7, 7, 5, 2, 3, 3, 8, 11, 12, 7, 3, 2, 8, 12, 13, 12, 8, 4, 2, 27, 32, 36, 39, 40, 36, 33, 27, 30, 35, 39, 38, 35, 32, 25, 29, 33, 37, 38, 34, 30, 25, 26, 30, 34, 36, 32, 27, 21, 24, 27, 30, 34, 31, 27, 19, 22, 25, 28, 32, 31, 28, 18, 20, 24, 27, 30, 31, 27, 26, 29, 34, 37, 35, 33, 28, 24, 27, 31, 35, 36, 31, 28, 23, 26, 30, 33, 32, 29, 24, 21, 24, 28, 30, 29, 28, 23, 19, 21, 24, 26, 26, 26, 22, 17, 20, 22, 25, 26, 25, 22, 14, 18, 22, 25, 24, 24, 22, 23, 26, 28, 29, 31, 28, 24, 22, 25, 27, 28, 28, 27, 21, 20, 25, 25, 26, 26, 25, 19, 17, 22, 22, 22, 22, 22, 17, 13, 19, 20, 19, 20, 19, 16, 10, 18, 19, 19, 18, 18, 17, 10, 15, 17, 17, 18, 17, 15, 20, 21, 21, 22, 23, 22, 15, 17, 20, 19, 21, 21, 20, 14, 13, 19, 19, 18, 18, 17, 13, 9, 16, 15, 15, 14, 13, 12, 8, 13, 13, 12, 12, 11, 8, 9, 11, 11, 11, 11, 10, 6, 10, 8, 9, 9, 10, 9, 4, 8, 13, 13, 14, 15, 12, 15, 5, 12, 12, 13, 13, 9, 13, 5, 10, 10, 9, 10, 7, 9, 5, 5, 6, 6, 6, 3, 5, 4, 2, 4, 3, 3, 3, 3, 5, 5, 5, 4, 2, 2, 4, 6, 7, 7, 5, 3, 1, 3, 2, 4, 6, 7, 8, 10, 12, 2, 3, 5, 6, 7, 8, 9, 2, 3, 4, 4, 4, 5, 6, 2, 2, 2, 2, 1, 2, 3, 2, 3, 6, 4, 3, 1, 3, 3, 7, 10, 8, 5, 2, 3, 6, 9, 10, 9, 6, 3, 2, 4, 6, 5, 5, 7, 9, 10, 4, 6, 6, 5, 6, 7, 7, 3, 5, 7, 3, 3, 4, 5, 4, 5, 10, 5, 3, 0, 3, 4, 6, 8, 8, 5, 3, 1, 6, 9, 12, 11, 7, 4, 1, 9, 11, 12, 12, 8, 5, 2, 24, 27, 32, 36, 36, 33, 29, 23, 26, 30, 34, 35, 32, 28, 21, 25, 29, 32, 33, 30, 26, 20, 22, 26, 29, 32, 28, 23, 17, 19, 22, 26, 28, 26, 23, 15, 17, 20, 23, 27, 26, 22, 14, 16, 19, 22, 26, 26, 22, 21, 25, 28, 33, 31, 29, 25, 20, 24, 28, 31, 31, 27, 23, 19, 22, 26, 28, 28, 25, 22, 18, 20, 23, 25, 25, 24, 19, 15, 17, 19, 21, 22, 22, 18, 13, 15, 18, 20, 20, 21, 18, 11, 14, 17, 20, 19, 19, 18, 19, 22, 24, 25, 27, 25, 20, 18, 21, 23, 24, 24, 23, 18, 17, 20, 21, 22, 22, 21, 17, 15, 17, 18, 18, 18, 18, 13, 10, 14, 15, 15, 15, 15, 13, 6, 13, 14, 14, 14, 14, 13, 7, 12, 13, 12, 12, 12, 12, 17, 17, 17, 18, 19, 19, 13, 15, 15, 16, 16, 17, 17, 11, 11, 14, 15, 14, 14, 13, 10, 7, 12, 11, 10, 10, 10, 9, 5, 9, 8, 8, 7, 7, 6, 6, 7, 6, 6, 6, 6, 3, 7, 4, 5, 5, 5, 5, 3, 7, 9, 9, 10, 11, 11, 13, 2, 7, 8, 9, 9, 8, 11, 2, 6, 6, 5, 6, 6, 6, 2, 3, 3, 2, 2, 2, 3, 1, 2, 2, 2, 2, 0, 2, 2, 5, 4, 3, 2, 1, 2, 3, 6, 6, 4, 3, 2, 1, 3, 4, 5, 7, 8, 9, 11, 3, 4, 5, 6, 6, 7, 8, 3, 6, 4, 4, 4, 4, 5, 3, 5, 4, 3, 2, 1, 2, 3, 6, 6, 5, 3, 2, 1, 5, 7, 9, 7, 4, 2, 0, 6, 7, 9, 8, 5, 3, 1, 6, 7, 6, 5, 7, 8, 9, 6, 8, 7, 5, 6, 6, 6, 6, 8, 9, 4, 3, 3, 3, 6, 8, 9, 6, 4, 2, 0, 6, 8, 10, 8, 4, 3, 2, 7, 9, 11, 10, 6, 3, 2, 7, 9, 11, 10, 7, 4, 2, 33, 38, 42, 45, 45, 42, 39, 33, 37, 41, 45, 45, 43, 37, 30, 35, 39, 42, 43, 41, 38, 30, 33, 36, 40, 43, 39, 36, 27, 30, 34, 38, 41, 40, 36, 26, 30, 33, 36, 40, 39, 35, 23, 27, 32, 36, 39, 38, 36, 31, 36, 39, 42, 41, 38, 35, 29, 33, 38, 41, 41, 37, 33, 28, 32, 36, 40, 39, 37, 32, 27, 30, 34, 36, 36, 36, 31, 25, 28, 32, 34, 35, 34, 30, 22, 27, 29, 33, 34, 33, 31, 20, 24, 28, 33, 32, 33, 31, 28, 32, 35, 34, 36, 34, 28, 27, 30, 32, 35, 35, 32, 28, 24, 29, 32, 33, 31, 32, 27, 21, 28, 28, 30, 29, 29, 25, 17, 25, 27, 28, 28, 28, 25, 14, 24, 26, 26, 26, 27, 26, 14, 21, 24, 25, 24, 25, 24, 24, 26, 27, 28, 29, 26, 17, 20, 25, 26, 28, 28, 25, 17, 17, 23, 25, 24, 24, 23, 18, 13, 20, 21, 21, 21, 19, 18, 13, 18, 20, 19, 19, 18, 14, 14, 15, 17, 18, 18, 18, 10, 14, 12, 15, 16, 17, 16, 9, 12, 18, 19, 20, 19, 14, 17, 9, 16, 17, 18, 17, 12, 17, 8, 13, 15, 15, 15, 10, 14, 9, 8, 12, 12, 12, 8, 10, 8, 5, 10, 10, 9, 7, 8, 9, 7, 7, 8, 8, 5, 10, 10, 8, 7, 6, 6, 3, 8, 4, 8, 9, 9, 9, 12, 14, 4, 6, 7, 8, 9, 10, 13, 4, 2, 5, 5, 6, 8, 10, 4, 2, 1, 1, 4, 6, 8, 4, 2, 2, 2, 2, 3, 8, 5, 4, 6, 4, 3, 2, 6, 7, 7, 6, 5, 3, 2, 5, 2, 4, 4, 5, 8, 10, 12, 2, 4, 5, 4, 7, 8, 10, 2, 4, 5, 3, 4, 6, 7, 2, 4, 5, 2, 1, 4, 7, 0, 4, 5, 3, 3, 2, 5, 3, 4, 6, 6, 4, 3, 4, 5, 6, 6, 6, 4, 3, 2, 41, 45, 50, 51, 52, 50, 46, 40, 43, 48, 51, 53, 48, 44, 37, 41, 46, 50, 51, 48, 43, 36, 39, 43, 46, 50, 46, 41, 33, 36, 41, 44, 47, 45, 41, 32, 35, 39, 42, 46, 45, 42, 28, 34, 37, 41, 45, 45, 41, 37, 41, 47, 49, 48, 44, 41, 35, 41, 44, 49, 48, 44, 40, 33, 39, 43, 47, 44, 42, 38, 33, 37, 40, 44, 42, 41, 36, 29, 34, 37, 40, 41, 39, 36, 25, 33, 36, 39, 40, 38, 36, 22, 30, 35, 38, 39, 38, 36, 34, 39, 42, 42, 42, 39, 34, 32, 37, 40, 41, 42, 38, 32, 29, 36, 37, 38, 39, 37, 31, 25, 33, 35, 35, 35, 34, 29, 20, 31, 33, 33, 34, 32, 30, 16, 29, 31, 31, 32, 31, 29, 16, 26, 30, 30, 31, 30, 27, 28, 33, 34, 34, 34, 32, 23, 24, 31, 32, 34, 33, 29, 23, 20, 29, 31, 30, 30, 27, 23, 17, 24, 27, 27, 27, 24, 23, 15, 20, 25, 26, 25, 21, 19, 16, 18, 23, 23, 24, 20, 15, 16, 14, 21, 22, 22, 20, 11, 16, 24, 25, 26, 23, 18, 24, 12, 21, 23, 24, 22, 16, 23, 12, 17, 21, 21, 19, 13, 19, 12, 11, 18, 17, 15, 10, 14, 11, 8, 16, 15, 13, 9, 11, 12, 9, 13, 13, 12, 8, 10, 12, 10, 11, 12, 11, 8, 9, 7, 13, 15, 14, 14, 16, 20, 7, 9, 14, 13, 12, 14, 16, 7, 4, 11, 11, 9, 11, 13, 7, 4, 7, 7, 6, 8, 10, 6, 4, 4, 4, 3, 8, 9, 7, 5, 4, 3, 2, 5, 9, 8, 7, 5, 4, 2, 4, 8, 4, 3, 5, 9, 12, 14, 16, 4, 3, 4, 8, 11, 12, 14, 4, 3, 4, 5, 7, 9, 11, 4, 2, 3, 1, 4, 7, 8, 4, 0, 4, 3, 2, 4, 8, 3, 3, 4, 5, 3, 3, 7, 5, 5, 5, 5, 3, 2, 5, 47, 50, 55, 58, 58, 55, 52, 45, 50, 53, 58, 57, 54, 50, 43, 48, 52, 54, 56, 52, 48, 42, 45, 49, 51, 55, 51, 45, 39, 42, 45, 49, 52, 50, 45, 36, 40, 43, 47, 50, 49, 45, 32, 38, 43, 46, 49, 51, 45, 42, 47, 51, 55, 54, 50, 47, 42, 45, 51, 55, 54, 49, 44, 40, 44, 48, 53, 51, 47, 43, 36, 43, 47, 49, 48, 46, 40, 32, 39, 42, 46, 46, 44, 39, 28, 36, 41, 45, 43, 44, 40, 24, 35, 40, 44, 43, 41, 40, 38, 43, 47, 47, 48, 45, 38, 36, 43, 46, 48, 47, 43, 37, 32, 40, 44, 44, 44, 43, 35, 28, 38, 40, 40, 40, 38, 34, 22, 34, 37, 38, 37, 36, 33, 19, 32, 37, 36, 36, 35, 33, 18, 28, 34, 35, 35, 33, 31, 32, 39, 39, 42, 40, 36, 30, 28, 36, 38, 39, 38, 34, 28, 24, 33, 37, 36, 35, 29, 28, 21, 28, 33, 33, 33, 27, 27, 18, 23, 31, 30, 29, 23, 23, 19, 19, 28, 28, 28, 23, 20, 18, 15, 25, 27, 27, 22, 15, 18, 28, 31, 31, 27, 23, 29, 16, 24, 30, 30, 26, 20, 28, 16, 20, 27, 26, 23, 17, 23, 16, 14, 23, 23, 19, 13, 19, 14, 10, 20, 20, 16, 11, 15, 14, 10, 16, 18, 15, 9, 12, 13, 11, 13, 17, 14, 9, 11, 11, 15, 21, 18, 17, 20, 25, 10, 10, 19, 18, 16, 17, 21, 11, 6, 16, 15, 13, 14, 17, 10, 6, 12, 12, 9, 11, 12, 9, 5, 7, 7, 7, 9, 11, 9, 7, 5, 4, 4, 7, 11, 10, 8, 5, 3, 3, 8, 9, 6, 5, 10, 13, 15, 18, 20, 6, 5, 9, 12, 14, 16, 17, 5, 5, 7, 9, 10, 12, 14, 5, 4, 3, 5, 7, 8, 10, 5, 4, 0, 2, 4, 7, 9, 5, 3, 3, 4, 3, 6, 8, 6, 4, 4, 4, 3, 4, 7, 44, 47, 51, 55, 56, 53, 48, 43, 46, 50, 54, 55, 52, 45, 40, 44, 49, 51, 54, 48, 45, 40, 42, 46, 50, 52, 48, 42, 35, 39, 42, 45, 48, 45, 41, 32, 37, 39, 42, 46, 45, 41, 29, 34, 39, 42, 45, 46, 41, 42, 45, 49, 53, 51, 47, 44, 40, 44, 48, 51, 50, 46, 42, 36, 41, 45, 47, 47, 45, 40, 33, 39, 43, 46, 46, 43, 37, 28, 35, 39, 42, 41, 40, 36, 25, 34, 37, 40, 40, 40, 37, 21, 32, 36, 39, 39, 38, 36, 36, 42, 43, 44, 46, 42, 37, 33, 39, 42, 44, 43, 41, 33, 29, 38, 40, 40, 41, 40, 33, 26, 35, 37, 37, 38, 36, 29, 20, 31, 34, 34, 34, 32, 31, 16, 28, 31, 33, 33, 30, 30, 15, 24, 31, 31, 31, 30, 27, 30, 35, 36, 37, 37, 35, 29, 25, 33, 34, 36, 36, 31, 26, 22, 30, 34, 34, 32, 28, 26, 17, 25, 30, 29, 29, 24, 25, 16, 19, 26, 26, 24, 21, 21, 15, 16, 25, 25, 25, 20, 17, 15, 12, 22, 23, 23, 20, 13, 16, 26, 28, 29, 25, 22, 28, 13, 22, 26, 28, 25, 19, 27, 13, 17, 25, 24, 22, 15, 21, 13, 12, 21, 21, 18, 11, 17, 12, 7, 17, 17, 14, 8, 13, 11, 8, 14, 15, 13, 7, 10, 11, 9, 10, 13, 12, 7, 9, 9, 14, 18, 18, 17, 19, 24, 9, 9, 17, 17, 16, 16, 19, 9, 6, 15, 14, 12, 13, 15, 8, 5, 10, 10, 9, 10, 10, 7, 4, 5, 6, 5, 7, 8, 6, 5, 3, 3, 4, 6, 8, 7, 6, 3, 2, 3, 6, 7, 5, 5, 10, 13, 15, 18, 20, 5, 5, 9, 12, 14, 15, 16, 5, 5, 8, 10, 11, 11, 13, 5, 4, 3, 6, 7, 8, 8, 3, 3, 2, 0, 3, 5, 7, 3, 2, 4, 5, 2, 5, 6, 4, 4, 6, 6, 2, 4, 6, 37, 42, 45, 48, 48, 46, 42, 36, 40, 43, 47, 48, 44, 40, 34, 37, 42, 46, 46, 42, 38, 32, 36, 41, 43, 44, 41, 34, 29, 33, 36, 39, 40, 37, 35, 27, 29, 33, 35, 39, 37, 33, 24, 27, 30, 35, 37, 39, 34, 34, 38, 41, 46, 45, 42, 37, 34, 37, 40, 45, 44, 40, 35, 31, 35, 39, 42, 41, 38, 34, 29, 33, 36, 39, 38, 36, 29, 25, 30, 32, 35, 35, 33, 29, 20, 27, 29, 32, 32, 32, 29, 15, 26, 29, 32, 31, 31, 29, 31, 34, 37, 39, 40, 37, 30, 28, 34, 36, 37, 37, 35, 29, 25, 32, 35, 35, 34, 34, 27, 21, 30, 31, 31, 31, 29, 25, 16, 25, 28, 28, 27, 25, 24, 12, 23, 25, 25, 25, 24, 24, 11, 19, 25, 23, 24, 24, 21, 25, 29, 30, 31, 31, 30, 24, 21, 28, 29, 30, 30, 27, 21, 18, 25, 27, 27, 27, 23, 20, 15, 22, 24, 23, 23, 20, 19, 12, 15, 21, 21, 19, 15, 16, 11, 12, 19, 18, 18, 15, 12, 11, 8, 17, 16, 16, 15, 9, 13, 21, 23, 23, 22, 19, 24, 9, 18, 21, 22, 21, 15, 22, 10, 14, 19, 18, 17, 12, 17, 10, 8, 16, 15, 14, 8, 11, 8, 4, 12, 11, 10, 5, 8, 7, 4, 9, 8, 8, 4, 6, 6, 5, 6, 7, 7, 4, 5, 5, 11, 13, 14, 14, 16, 20, 5, 8, 12, 13, 13, 14, 16, 5, 4, 11, 10, 10, 11, 11, 5, 3, 7, 6, 7, 7, 6, 3, 2, 2, 1, 3, 4, 5, 3, 2, 3, 3, 2, 3, 5, 4, 3, 4, 4, 1, 3, 4, 5, 5, 9, 11, 13, 15, 16, 5, 5, 8, 10, 12, 12, 13, 5, 5, 7, 8, 8, 9, 10, 5, 4, 3, 4, 5, 6, 4, 3, 2, 4, 3, 0, 3, 4, 2, 3, 5, 5, 2, 2, 3, 2, 5, 6, 6, 3, 1, 3, 32, 35, 39, 42, 42, 40, 37, 30, 34, 38, 42, 43, 39, 35, 29, 31, 37, 40, 41, 37, 33, 28, 29, 33, 38, 39, 35, 28, 25, 27, 30, 33, 36, 33, 29, 22, 23, 26, 30, 34, 32, 29, 20, 22, 25, 29, 32, 32, 28, 29, 33, 36, 40, 39, 36, 32, 28, 31, 35, 38, 39, 34, 30, 26, 30, 34, 36, 35, 32, 28, 26, 26, 30, 33, 33, 30, 24, 21, 23, 27, 30, 29, 28, 23, 17, 22, 24, 27, 27, 26, 24, 14, 20, 23, 26, 26, 26, 24, 27, 30, 31, 32, 35, 31, 27, 25, 29, 31, 32, 31, 29, 24, 22, 27, 29, 28, 29, 28, 22, 19, 26, 26, 25, 25, 25, 19, 13, 22, 22, 22, 22, 20, 18, 9, 20, 20, 20, 19, 20, 19, 8, 17, 19, 18, 18, 19, 17, 22, 25, 25, 25, 27, 26, 19, 18, 23, 24, 24, 25, 23, 17, 14, 22, 22, 22, 21, 19, 16, 11, 18, 18, 18, 18, 16, 14, 9, 13, 15, 14, 14, 12, 11, 9, 10, 13, 13, 12, 12, 8, 8, 6, 12, 11, 11, 11, 5, 10, 17, 17, 18, 18, 15, 19, 7, 15, 15, 16, 16, 12, 17, 7, 12, 13, 13, 13, 9, 12, 7, 6, 10, 9, 9, 5, 8, 5, 2, 6, 5, 5, 3, 5, 4, 2, 4, 3, 3, 3, 4, 4, 3, 2, 2, 2, 2, 3, 3, 9, 9, 10, 11, 13, 16, 3, 7, 8, 9, 10, 11, 12, 3, 4, 7, 7, 7, 8, 8, 3, 3, 4, 4, 4, 4, 3, 2, 1, 4, 3, 1, 2, 3, 1, 3, 5, 4, 2, 2, 3, 2, 4, 5, 5, 3, 0, 2, 4, 5, 6, 8, 10, 12, 13, 4, 5, 6, 8, 9, 10, 10, 4, 5, 6, 5, 6, 6, 7, 4, 4, 5, 3, 2, 3, 3, 2, 4, 7, 5, 3, 0, 3, 3, 5, 7, 6, 3, 2, 2, 4, 6, 7, 7, 4, 2, 2, 26, 30, 34, 38, 38, 34, 31, 24, 29, 32, 36, 37, 33, 29, 23, 26, 31, 35, 35, 32, 28, 22, 25, 28, 31, 33, 29, 24, 19, 21, 24, 28, 30, 28, 24, 17, 19, 22, 25, 29, 28, 25, 16, 17, 20, 24, 27, 28, 24, 23, 27, 31, 35, 33, 31, 27, 22, 25, 30, 33, 33, 30, 26, 21, 24, 28, 30, 31, 28, 24, 20, 21, 25, 27, 28, 26, 20, 17, 19, 21, 24, 24, 23, 20, 15, 17, 20, 22, 22, 22, 20, 12, 16, 19, 21, 21, 21, 20, 22, 24, 27, 27, 29, 26, 22, 20, 23, 25, 26, 26, 25, 20, 18, 22, 23, 23, 24, 23, 18, 16, 20, 20, 20, 20, 20, 15, 11, 16, 17, 17, 17, 16, 15, 7, 16, 15, 15, 15, 15, 14, 7, 14, 14, 14, 14, 14, 14, 18, 18, 19, 20, 22, 21, 14, 15, 18, 18, 19, 19, 19, 13, 12, 17, 17, 16, 16, 15, 11, 8, 15, 13, 12, 13, 12, 10, 6, 10, 10, 9, 9, 9, 7, 6, 8, 8, 8, 7, 8, 4, 7, 4, 7, 6, 6, 6, 3, 7, 11, 11, 12, 13, 12, 14, 4, 9, 10, 10, 11, 10, 12, 4, 8, 8, 7, 7, 7, 8, 4, 5, 4, 4, 4, 4, 4, 2, 1, 1, 1, 1, 2, 3, 2, 3, 4, 3, 2, 0, 3, 3, 4, 5, 3, 3, 2, 2, 3, 5, 6, 8, 9, 11, 12, 3, 4, 6, 7, 7, 8, 9, 3, 4, 4, 5, 5, 5, 6, 3, 3, 4, 3, 2, 2, 2, 1, 5, 6, 4, 3, 2, 2, 3, 7, 8, 6, 4, 2, 2, 5, 7, 9, 8, 4, 3, 0, 5, 7, 6, 6, 8, 9, 10, 5, 7, 7, 6, 7, 7, 7, 5, 7, 8, 4, 3, 4, 5, 5, 6, 8, 5, 3, 1, 2, 5, 8, 10, 8, 4, 3, 0, 7, 9, 10, 9, 5, 3, 1, 8, 9, 10, 10, 6, 4, 2, 36, 41, 47, 48, 47, 47, 42, 36, 39, 44, 48, 49, 45, 41, 34, 38, 42, 45, 47, 44, 39, 32, 35, 39, 42, 45, 41, 36, 29, 33, 35, 39, 41, 39, 37, 26, 29, 32, 37, 41, 39, 36, 23, 27, 32, 34, 38, 39, 35, 33, 38, 42, 45, 44, 42, 39, 31, 37, 41, 45, 44, 40, 38, 31, 35, 40, 42, 42, 40, 35, 29, 33, 36, 39, 38, 38, 31, 25, 28, 32, 36, 35, 35, 32, 22, 27, 30, 32, 34, 34, 31, 18, 24, 28, 32, 33, 32, 31, 31, 36, 37, 38, 39, 37, 32, 29, 33, 35, 37, 38, 36, 31, 26, 32, 36, 35, 35, 35, 30, 22, 29, 31, 31, 31, 31, 26, 17, 26, 27, 28, 27, 27, 26, 13, 24, 26, 26, 26, 27, 26, 12, 21, 23, 25, 24, 25, 24, 27, 29, 30, 31, 32, 31, 23, 21, 27, 29, 30, 29, 28, 22, 19, 25, 27, 26, 27, 25, 22, 14, 21, 24, 23, 23, 22, 20, 13, 17, 20, 19, 20, 18, 16, 12, 13, 17, 18, 18, 17, 12, 12, 10, 15, 16, 17, 17, 10, 13, 20, 22, 22, 22, 19, 23, 10, 18, 20, 20, 21, 16, 21, 10, 15, 18, 18, 18, 13, 17, 10, 9, 14, 14, 14, 10, 12, 8, 4, 10, 10, 10, 8, 9, 7, 5, 7, 7, 8, 6, 9, 8, 7, 5, 5, 6, 6, 8, 5, 11, 12, 13, 15, 17, 20, 5, 8, 10, 11, 13, 14, 16, 5, 5, 8, 8, 10, 12, 13, 5, 4, 4, 4, 6, 8, 8, 4, 3, 2, 1, 2, 6, 8, 4, 2, 4, 3, 1, 5, 8, 5, 5, 4, 3, 2, 4, 6, 4, 6, 6, 9, 13, 16, 17, 4, 6, 7, 7, 11, 13, 14, 5, 6, 7, 4, 8, 9, 11, 4, 5, 6, 3, 3, 5, 7, 3, 3, 5, 3, 2, 3, 7, 0, 4, 5, 5, 2, 1, 5, 3, 5, 5, 5, 3, 1, 4, 42, 48, 52, 54, 55, 52, 49, 41, 46, 50, 54, 53, 50, 46, 40, 44, 48, 52, 53, 50, 45, 38, 41, 46, 50, 52, 47, 41, 35, 39, 41, 46, 47, 46, 42, 31, 35, 37, 42, 46, 44, 41, 28, 33, 38, 41, 44, 44, 41, 39, 45, 48, 53, 51, 47, 44, 39, 43, 47, 50, 50, 47, 42, 36, 43, 46, 49, 48, 44, 40, 34, 39, 44, 45, 46, 42, 36, 29, 35, 38, 41, 41, 40, 37, 24, 33, 36, 39, 39, 39, 36, 20, 31, 34, 38, 38, 37, 37, 36, 40, 43, 43, 46, 43, 37, 34, 39, 42, 43, 43, 41, 36, 30, 39, 40, 41, 41, 39, 33, 25, 35, 37, 37, 37, 35, 30, 20, 31, 33, 33, 33, 32, 31, 15, 28, 31, 31, 31, 31, 30, 15, 25, 29, 30, 30, 30, 27, 30, 35, 37, 37, 38, 36, 28, 25, 33, 34, 36, 35, 32, 27, 21, 30, 34, 32, 32, 29, 26, 18, 26, 30, 29, 30, 26, 25, 16, 19, 26, 25, 25, 21, 21, 15, 16, 23, 24, 24, 21, 17, 15, 12, 21, 22, 22, 20, 13, 17, 25, 27, 29, 27, 23, 29, 14, 22, 26, 27, 25, 20, 27, 13, 18, 23, 23, 22, 17, 21, 13, 12, 20, 20, 18, 12, 16, 12, 7, 16, 16, 14, 9, 13, 11, 7, 13, 13, 13, 8, 10, 10, 8, 10, 12, 11, 8, 9, 9, 15, 18, 19, 18, 21, 24, 9, 10, 17, 17, 17, 18, 20, 9, 6, 14, 14, 14, 15, 16, 9, 5, 10, 10, 10, 11, 11, 7, 4, 5, 5, 5, 8, 10, 6, 4, 2, 2, 4, 6, 10, 7, 5, 3, 2, 3, 7, 8, 6, 6, 9, 14, 16, 19, 21, 6, 6, 8, 13, 15, 16, 18, 6, 6, 6, 10, 12, 13, 14, 6, 5, 5, 5, 8, 9, 9, 4, 3, 3, 2, 3, 5, 9, 4, 0, 3, 4, 1, 6, 7, 3, 3, 4, 4, 2, 4, 6, 49, 54, 58, 61, 61, 58, 53, 48, 51, 57, 60, 60, 57, 53, 46, 50, 54, 57, 59, 54, 51, 44, 47, 51, 55, 56, 51, 46, 40, 44, 47, 51, 53, 49, 46, 36, 41, 44, 46, 50, 50, 46, 32, 38, 42, 46, 49, 48, 47, 45, 49, 54, 58, 56, 54, 48, 44, 48, 52, 58, 56, 52, 47, 41, 47, 51, 55, 54, 50, 44, 38, 44, 48, 52, 50, 48, 41, 33, 42, 44, 48, 46, 46, 41, 27, 37, 41, 44, 45, 43, 40, 23, 34, 39, 43, 42, 42, 41, 41, 46, 50, 50, 51, 49, 41, 38, 45, 48, 50, 49, 46, 40, 33, 44, 46, 47, 46, 44, 37, 30, 40, 43, 43, 43, 41, 34, 24, 34, 39, 39, 39, 35, 34, 19, 30, 36, 36, 36, 35, 35, 17, 26, 34, 35, 34, 34, 32, 34, 42, 41, 43, 42, 41, 34, 29, 38, 41, 41, 40, 36, 33, 25, 34, 39, 39, 36, 33, 31, 21, 29, 36, 35, 33, 28, 29, 19, 23, 31, 32, 29, 24, 26, 18, 18, 28, 29, 27, 23, 22, 17, 14, 25, 26, 26, 23, 17, 20, 29, 33, 34, 30, 28, 33, 17, 25, 32, 32, 29, 24, 31, 17, 21, 29, 30, 26, 20, 26, 17, 15, 25, 26, 22, 15, 21, 15, 10, 20, 22, 17, 11, 17, 13, 9, 16, 19, 15, 10, 14, 13, 9, 11, 17, 15, 9, 11, 12, 17, 24, 23, 22, 24, 30, 12, 12, 22, 22, 20, 21, 25, 12, 9, 19, 19, 17, 18, 20, 12, 8, 14, 16, 13, 13, 14, 10, 6, 7, 11, 7, 10, 12, 9, 5, 4, 6, 5, 8, 10, 8, 6, 4, 5, 5, 7, 10, 8, 7, 16, 18, 20, 23, 24, 8, 8, 13, 17, 19, 20, 20, 8, 7, 11, 14, 16, 16, 17, 8, 6, 5, 11, 11, 12, 10, 6, 4, 3, 4, 5, 7, 10, 5, 3, 0, 1, 3, 6, 9, 5, 3, 2, 2, 3, 5, 8, 48, 52, 55, 59, 59, 57, 52, 47, 50, 55, 59, 59, 56, 50, 44, 48, 52, 56, 58, 53, 49, 43, 46, 50, 53, 54, 51, 44, 38, 44, 46, 49, 52, 49, 44, 34, 40, 43, 45, 50, 48, 43, 30, 37, 41, 44, 48, 47, 43, 45, 51, 53, 56, 56, 51, 47, 44, 47, 53, 55, 56, 50, 45, 40, 47, 51, 54, 52, 48, 44, 36, 43, 48, 50, 49, 44, 40, 32, 39, 45, 47, 44, 43, 39, 26, 36, 40, 43, 42, 42, 39, 21, 33, 38, 42, 42, 41, 40, 40, 45, 47, 48, 50, 48, 40, 37, 44, 48, 46, 49, 46, 38, 32, 42, 46, 45, 46, 43, 37, 28, 40, 42, 43, 41, 40, 33, 23, 35, 37, 38, 36, 34, 33, 17, 29, 35, 35, 35, 34, 34, 16, 24, 33, 33, 33, 32, 31, 32, 39, 40, 43, 42, 40, 34, 28, 38, 40, 41, 40, 36, 32, 24, 33, 38, 38, 37, 33, 30, 20, 28, 34, 34, 33, 28, 28, 19, 21, 31, 30, 28, 24, 25, 17, 17, 27, 27, 26, 22, 21, 16, 13, 23, 26, 26, 21, 17, 19, 29, 33, 34, 30, 27, 33, 16, 24, 32, 32, 29, 24, 31, 16, 21, 29, 29, 26, 20, 26, 16, 15, 24, 25, 22, 14, 20, 14, 10, 19, 21, 17, 10, 17, 12, 8, 14, 17, 15, 9, 13, 12, 8, 10, 16, 14, 9, 11, 11, 17, 23, 23, 22, 24, 29, 12, 12, 21, 22, 21, 21, 24, 12, 9, 19, 19, 17, 18, 20, 11, 7, 14, 15, 13, 12, 13, 10, 5, 7, 10, 7, 9, 11, 8, 5, 4, 6, 5, 7, 10, 7, 5, 4, 4, 4, 7, 9, 8, 8, 16, 18, 21, 23, 24, 8, 8, 14, 18, 20, 20, 20, 8, 8, 11, 16, 15, 15, 16, 8, 7, 6, 11, 11, 11, 10, 6, 5, 4, 5, 5, 6, 9, 4, 4, 1, 0, 3, 6, 8, 4, 3, 2, 2, 2, 5, 7, 41, 45, 48, 52, 51, 50, 45, 39, 42, 46, 52, 51, 47, 43, 37, 41, 45, 49, 49, 46, 41, 36, 39, 41, 46, 47, 44, 36, 33, 36, 38, 42, 43, 40, 37, 29, 32, 35, 39, 42, 41, 37, 25, 30, 34, 37, 40, 41, 37, 37, 42, 45, 49, 48, 44, 40, 36, 41, 44, 47, 47, 42, 37, 33, 38, 43, 45, 44, 42, 36, 31, 37, 39, 41, 41, 38, 32, 26, 33, 35, 38, 38, 35, 32, 21, 30, 33, 35, 34, 34, 31, 16, 28, 31, 34, 34, 33, 32, 34, 39, 40, 43, 42, 40, 33, 31, 37, 40, 41, 40, 37, 33, 26, 35, 38, 39, 37, 36, 30, 24, 32, 33, 34, 34, 32, 26, 17, 27, 31, 30, 30, 27, 26, 13, 24, 29, 28, 27, 26, 27, 12, 20, 27, 27, 27, 26, 24, 27, 33, 32, 34, 34, 33, 27, 22, 30, 33, 32, 32, 29, 24, 20, 27, 31, 31, 30, 26, 23, 17, 23, 27, 27, 26, 21, 22, 13, 17, 24, 23, 21, 18, 18, 12, 12, 21, 20, 19, 17, 15, 12, 9, 19, 19, 19, 17, 11, 15, 23, 26, 26, 24, 21, 26, 11, 20, 24, 25, 23, 18, 24, 11, 15, 22, 22, 20, 15, 19, 11, 10, 19, 18, 16, 10, 13, 9, 5, 14, 14, 12, 6, 10, 8, 4, 10, 11, 10, 5, 8, 8, 5, 7, 9, 8, 5, 6, 7, 13, 16, 17, 16, 19, 23, 7, 9, 15, 15, 15, 16, 18, 7, 5, 13, 12, 13, 13, 13, 7, 4, 10, 9, 9, 9, 8, 5, 2, 4, 4, 4, 5, 6, 3, 2, 2, 1, 2, 4, 6, 4, 3, 2, 2, 2, 4, 5, 6, 6, 11, 13, 15, 17, 18, 6, 6, 11, 13, 14, 15, 15, 6, 6, 8, 10, 11, 11, 11, 5, 5, 4, 6, 7, 7, 6, 3, 3, 3, 2, 2, 3, 5, 2, 1, 3, 3, 0, 3, 4, 2, 3, 4, 4, 2, 3, 4, 33, 38, 42, 46, 45, 43, 37, 32, 36, 40, 45, 44, 41, 37, 31, 34, 39, 42, 43, 39, 34, 30, 32, 36, 39, 40, 37, 31, 27, 29, 31, 36, 37, 35, 31, 23, 26, 29, 33, 36, 34, 31, 22, 25, 28, 30, 34, 34, 31, 31, 34, 38, 42, 42, 37, 34, 30, 33, 38, 41, 40, 36, 32, 29, 32, 36, 38, 38, 36, 28, 27, 29, 32, 36, 35, 32, 27, 22, 26, 30, 32, 31, 30, 26, 18, 23, 26, 29, 29, 29, 26, 15, 23, 25, 28, 28, 28, 26, 28, 31, 35, 34, 37, 34, 28, 26, 31, 31, 34, 34, 32, 26, 23, 30, 31, 31, 31, 30, 23, 19, 28, 28, 28, 28, 26, 21, 14, 24, 24, 24, 23, 23, 21, 10, 21, 23, 21, 22, 22, 21, 10, 19, 21, 20, 21, 21, 18, 24, 26, 27, 27, 29, 27, 21, 19, 25, 26, 27, 27, 24, 18, 16, 23, 24, 24, 24, 21, 18, 12, 19, 21, 20, 21, 18, 17, 10, 14, 17, 17, 16, 13, 13, 10, 10, 15, 15, 14, 13, 10, 9, 7, 14, 13, 13, 12, 6, 11, 18, 19, 20, 20, 16, 21, 8, 16, 18, 18, 18, 13, 19, 8, 12, 15, 15, 15, 11, 14, 8, 7, 12, 12, 11, 6, 9, 6, 2, 8, 8, 7, 4, 6, 5, 3, 6, 5, 5, 3, 5, 5, 3, 4, 4, 3, 3, 4, 4, 10, 10, 11, 13, 14, 18, 4, 8, 10, 10, 12, 12, 13, 4, 4, 9, 8, 9, 9, 9, 4, 3, 5, 5, 5, 5, 4, 2, 2, 2, 2, 2, 3, 4, 2, 1, 5, 4, 2, 2, 4, 3, 3, 5, 4, 2, 2, 3, 5, 5, 8, 10, 11, 13, 14, 5, 5, 7, 9, 10, 11, 11, 5, 5, 6, 7, 7, 8, 8, 5, 4, 5, 3, 3, 4, 3, 3, 3, 7, 5, 2, 2, 3, 1, 5, 6, 6, 3, 0, 3, 4, 6, 6, 6, 4, 2, 2, 27, 31, 35, 38, 39, 36, 33, 25, 30, 34, 39, 38, 35, 30, 25, 29, 32, 36, 37, 34, 29, 24, 26, 29, 32, 36, 31, 26, 21, 24, 26, 29, 33, 30, 26, 18, 20, 23, 27, 30, 30, 25, 17, 19, 22, 25, 29, 29, 26, 25, 28, 33, 35, 35, 33, 29, 24, 28, 32, 35, 35, 32, 27, 23, 26, 30, 32, 32, 30, 25, 22, 24, 27, 29, 29, 26, 21, 19, 20, 23, 26, 26, 25, 21, 16, 18, 21, 24, 23, 24, 21, 13, 17, 20, 22, 23, 22, 21, 22, 26, 28, 29, 31, 28, 23, 22, 24, 26, 28, 28, 27, 22, 20, 23, 25, 25, 25, 25, 19, 17, 22, 22, 22, 22, 21, 16, 11, 18, 19, 18, 18, 17, 16, 8, 17, 17, 17, 17, 16, 16, 8, 16, 16, 15, 15, 16, 14, 20, 21, 20, 22, 24, 22, 16, 16, 20, 20, 21, 21, 20, 14, 13, 18, 18, 18, 17, 17, 13, 9, 16, 15, 14, 14, 14, 12, 7, 12, 11, 11, 10, 10, 8, 7, 9, 10, 9, 9, 9, 5, 8, 5, 8, 8, 8, 8, 3, 8, 13, 13, 14, 15, 13, 15, 5, 11, 12, 12, 13, 10, 14, 5, 10, 10, 9, 9, 8, 9, 5, 5, 6, 6, 5, 4, 5, 3, 1, 2, 2, 2, 2, 3, 3, 2, 3, 2, 1, 2, 3, 4, 3, 4, 3, 2, 0, 2, 3, 6, 7, 8, 9, 11, 13, 3, 5, 7, 8, 8, 9, 10, 3, 4, 5, 5, 6, 6, 6, 3, 3, 3, 2, 2, 3, 3, 1, 4, 5, 4, 3, 0, 2, 1, 5, 7, 5, 3, 1, 2, 3, 6, 7, 6, 4, 2, 2, 4, 6, 6, 7, 9, 10, 11, 4, 6, 6, 6, 8, 8, 8, 4, 6, 7, 4, 4, 4, 6, 4, 6, 7, 4, 2, 1, 2, 3, 7, 8, 6, 3, 2, 1, 5, 7, 9, 8, 4, 3, 0, 6, 7, 9, 9, 5, 3, 2, 38, 44, 48, 51, 51, 48, 46, 38, 42, 46, 50, 51, 48, 44, 37, 41, 45, 47, 49, 44, 41, 34, 38, 41, 45, 47, 43, 36, 32, 34, 38, 42, 42, 38, 37, 28, 30, 33, 36, 41, 38, 37, 23, 26, 32, 35, 39, 40, 36, 37, 39, 45, 49, 49, 44, 41, 36, 39, 43, 47, 48, 44, 39, 34, 37, 42, 45, 44, 42, 36, 31, 36, 38, 41, 42, 38, 32, 27, 31, 35, 38, 36, 36, 31, 22, 28, 31, 33, 34, 35, 32, 18, 25, 29, 32, 33, 33, 32, 34, 36, 40, 41, 43, 41, 37, 31, 34, 39, 40, 40, 39, 34, 28, 35, 37, 37, 37, 37, 32, 23, 33, 34, 34, 34, 32, 27, 18, 28, 29, 30, 29, 28, 27, 13, 24, 26, 26, 27, 27, 27, 11, 21, 24, 24, 25, 25, 25, 28, 32, 33, 34, 36, 35, 27, 23, 30, 31, 34, 33, 31, 25, 20, 28, 29, 30, 30, 28, 24, 16, 23, 26, 26, 26, 24, 23, 14, 17, 22, 22, 21, 19, 18, 12, 13, 17, 19, 18, 18, 15, 11, 9, 16, 16, 17, 17, 11, 15, 23, 25, 26, 27, 23, 27, 12, 20, 23, 25, 25, 21, 25, 12, 16, 21, 21, 21, 17, 20, 12, 11, 17, 17, 17, 12, 14, 10, 5, 13, 12, 11, 8, 11, 7, 4, 8, 8, 9, 7, 10, 7, 5, 5, 6, 7, 7, 9, 7, 14, 16, 17, 19, 22, 24, 8, 11, 15, 16, 18, 19, 20, 8, 7, 13, 13, 15, 15, 16, 7, 6, 9, 9, 11, 10, 9, 5, 4, 4, 4, 4, 7, 9, 5, 3, 3, 2, 3, 5, 8, 4, 2, 3, 3, 1, 5, 7, 8, 7, 9, 14, 18, 20, 21, 7, 7, 9, 12, 16, 17, 18, 7, 7, 9, 9, 12, 14, 14, 8, 6, 8, 5, 7, 9, 7, 5, 5, 6, 4, 2, 4, 8, 3, 3, 5, 4, 2, 4, 6, 0, 4, 5, 5, 3, 3, 5, 45, 50, 54, 59, 58, 56, 50, 44, 48, 52, 57, 58, 51, 48, 42, 46, 51, 55, 54, 52, 46, 41, 44, 46, 51, 53, 48, 41, 36, 41, 44, 47, 48, 45, 41, 32, 37, 40, 42, 45, 46, 42, 28, 33, 37, 42, 45, 46, 42, 42, 47, 50, 54, 54, 50, 46, 39, 44, 50, 53, 53, 49, 45, 39, 43, 48, 51, 50, 46, 41, 35, 41, 45, 47, 46, 43, 36, 30, 37, 41, 43, 41, 40, 37, 24, 33, 38, 38, 40, 40, 37, 19, 31, 35, 38, 39, 38, 36, 38, 43, 46, 46, 48, 45, 41, 34, 41, 46, 46, 47, 44, 38, 31, 41, 42, 44, 43, 40, 36, 27, 38, 39, 40, 38, 37, 32, 21, 33, 35, 35, 34, 32, 31, 16, 26, 32, 31, 32, 30, 32, 15, 24, 29, 31, 31, 30, 29, 31, 38, 40, 39, 40, 39, 32, 27, 35, 37, 39, 38, 35, 30, 24, 31, 37, 36, 35, 32, 29, 19, 27, 31, 32, 32, 27, 27, 17, 21, 28, 27, 26, 22, 22, 16, 15, 24, 23, 23, 21, 19, 15, 12, 21, 22, 22, 21, 15, 18, 28, 30, 31, 30, 27, 31, 15, 24, 29, 30, 29, 24, 30, 15, 19, 26, 27, 25, 19, 24, 15, 14, 22, 23, 21, 14, 19, 13, 8, 18, 18, 15, 10, 15, 11, 6, 12, 14, 13, 8, 12, 10, 7, 9, 12, 11, 8, 10, 11, 16, 21, 22, 22, 24, 29, 11, 12, 20, 20, 21, 22, 24, 11, 8, 17, 17, 18, 18, 18, 10, 7, 13, 13, 13, 12, 12, 8, 5, 7, 8, 6, 9, 10, 6, 5, 2, 3, 4, 7, 10, 5, 4, 2, 1, 4, 7, 9, 8, 8, 14, 18, 21, 23, 24, 8, 8, 12, 17, 20, 21, 21, 8, 8, 10, 14, 16, 16, 16, 9, 7, 6, 9, 12, 11, 9, 6, 5, 4, 4, 5, 6, 9, 4, 3, 3, 3, 3, 5, 8, 4, 0, 3, 3, 2, 5, 7, 49, 54, 57, 61, 61, 57, 54, 47, 52, 57, 60, 62, 56, 53, 46, 50, 55, 58, 58, 55, 50, 45, 49, 52, 55, 57, 52, 46, 40, 45, 49, 52, 53, 50, 46, 35, 41, 44, 47, 50, 50, 46, 31, 38, 43, 45, 50, 51, 45, 47, 49, 55, 59, 57, 54, 50, 44, 50, 55, 58, 57, 52, 46, 41, 47, 53, 55, 54, 51, 44, 39, 46, 50, 51, 50, 48, 40, 32, 41, 45, 47, 46, 45, 40, 27, 37, 41, 43, 44, 44, 41, 22, 34, 40, 44, 42, 41, 41, 41, 49, 50, 52, 52, 49, 43, 37, 46, 50, 50, 50, 47, 41, 33, 42, 47, 47, 47, 44, 38, 29, 41, 43, 44, 42, 41, 35, 23, 35, 39, 40, 37, 36, 35, 19, 29, 37, 36, 37, 34, 36, 18, 26, 35, 35, 34, 33, 32, 33, 40, 43, 45, 43, 41, 35, 30, 38, 41, 42, 42, 38, 34, 25, 35, 40, 40, 39, 33, 32, 22, 30, 36, 35, 35, 30, 30, 20, 23, 31, 32, 30, 24, 26, 18, 18, 28, 29, 28, 23, 23, 18, 14, 24, 27, 26, 23, 18, 21, 29, 34, 36, 33, 29, 34, 17, 26, 33, 34, 31, 25, 33, 17, 21, 30, 30, 28, 21, 27, 17, 16, 25, 27, 23, 15, 21, 15, 10, 20, 23, 18, 11, 17, 13, 9, 15, 19, 16, 10, 14, 13, 9, 11, 18, 15, 10, 12, 12, 17, 25, 24, 23, 26, 31, 12, 13, 23, 23, 22, 22, 26, 12, 9, 20, 20, 19, 19, 21, 12, 8, 14, 16, 14, 14, 14, 11, 6, 8, 11, 7, 9, 12, 9, 5, 4, 6, 5, 8, 11, 7, 5, 4, 5, 4, 7, 10, 9, 8, 17, 19, 22, 24, 26, 9, 8, 15, 19, 20, 21, 21, 9, 8, 11, 16, 16, 17, 17, 9, 7, 7, 13, 12, 12, 11, 6, 5, 4, 6, 6, 7, 10, 5, 4, 2, 2, 3, 7, 9, 4, 3, 0, 0, 3, 5, 8, 49, 53, 57, 61, 62, 59, 55, 48, 53, 57, 60, 61, 57, 52, 45, 51, 53, 58, 59, 56, 51, 44, 47, 52, 55, 57, 52, 46, 42, 45, 48, 51, 54, 49, 45, 35, 41, 45, 47, 50, 49, 45, 31, 38, 41, 46, 49, 50, 46, 46, 52, 55, 59, 57, 54, 50, 46, 50, 54, 57, 55, 53, 48, 41, 48, 52, 56, 53, 50, 44, 38, 46, 50, 52, 50, 47, 42, 31, 41, 46, 48, 45, 45, 40, 27, 37, 41, 43, 43, 43, 40, 22, 35, 40, 42, 43, 41, 41, 41, 48, 50, 51, 51, 49, 42, 36, 46, 48, 50, 49, 46, 41, 33, 43, 47, 48, 46, 45, 38, 30, 41, 44, 44, 44, 40, 35, 24, 34, 39, 40, 38, 36, 35, 19, 30, 36, 36, 36, 35, 35, 17, 24, 34, 35, 35, 33, 32, 33, 41, 43, 44, 44, 41, 35, 29, 38, 42, 43, 40, 38, 33, 26, 34, 40, 40, 39, 33, 31, 22, 30, 36, 36, 34, 29, 30, 20, 23, 31, 32, 30, 24, 26, 19, 18, 28, 29, 27, 23, 22, 17, 14, 24, 27, 27, 22, 18, 21, 31, 34, 35, 32, 29, 35, 17, 26, 33, 33, 30, 25, 33, 17, 21, 30, 30, 28, 21, 27, 17, 16, 25, 27, 24, 15, 22, 15, 11, 20, 22, 17, 11, 17, 14, 9, 15, 18, 16, 10, 14, 13, 9, 10, 17, 15, 9, 12, 13, 17, 25, 24, 23, 25, 31, 13, 13, 22, 23, 22, 23, 26, 13, 9, 20, 20, 18, 19, 21, 12, 8, 14, 16, 14, 13, 14, 10, 6, 8, 12, 7, 10, 12, 9, 5, 4, 7, 5, 8, 10, 7, 6, 4, 5, 5, 8, 10, 9, 8, 17, 19, 21, 24, 25, 9, 8, 15, 18, 20, 21, 22, 9, 8, 11, 17, 17, 17, 17, 9, 7, 6, 12, 12, 12, 11, 6, 5, 4, 6, 6, 7, 10, 5, 4, 2, 2, 4, 6, 9, 5, 3, 0, 0, 3, 5, 8, 43, 47, 51, 55, 55, 53, 49, 40, 45, 50, 53, 53, 50, 45, 39, 44, 47, 51, 52, 48, 43, 39, 42, 46, 47, 49, 46, 39, 35, 38, 41, 45, 46, 43, 39, 30, 34, 37, 40, 44, 43, 38, 27, 32, 36, 39, 42, 43, 40, 40, 43, 48, 51, 51, 47, 43, 39, 42, 47, 50, 50, 47, 41, 36, 41, 45, 47, 48, 44, 39, 33, 38, 42, 44, 44, 40, 34, 27, 36, 38, 42, 39, 38, 35, 22, 32, 35, 37, 36, 37, 34, 18, 29, 34, 37, 37, 35, 34, 36, 40, 43, 44, 45, 42, 37, 32, 38, 42, 44, 42, 41, 33, 28, 38, 40, 40, 40, 38, 33, 25, 35, 36, 36, 36, 34, 29, 19, 30, 33, 33, 32, 30, 29, 14, 26, 30, 29, 30, 28, 29, 13, 21, 29, 28, 29, 28, 26, 28, 36, 36, 37, 37, 35, 29, 24, 32, 35, 36, 35, 31, 27, 20, 30, 33, 33, 32, 28, 25, 17, 24, 29, 28, 28, 24, 24, 15, 18, 25, 26, 24, 19, 20, 14, 14, 23, 22, 22, 19, 17, 13, 10, 20, 21, 21, 18, 12, 16, 25, 28, 29, 26, 23, 28, 13, 21, 26, 27, 25, 19, 27, 13, 17, 24, 24, 22, 16, 21, 13, 12, 20, 19, 18, 11, 16, 11, 7, 16, 16, 13, 7, 12, 10, 5, 12, 13, 12, 6, 9, 9, 6, 8, 11, 10, 6, 8, 8, 14, 19, 19, 18, 20, 24, 8, 10, 17, 18, 17, 17, 20, 8, 6, 14, 14, 14, 14, 15, 8, 5, 11, 11, 10, 10, 10, 6, 3, 5, 6, 4, 6, 8, 4, 3, 2, 2, 3, 5, 7, 4, 3, 2, 1, 3, 4, 6, 6, 6, 13, 15, 17, 19, 20, 6, 6, 12, 14, 16, 16, 17, 6, 6, 9, 12, 12, 12, 13, 6, 5, 5, 8, 8, 8, 7, 4, 3, 3, 2, 3, 4, 6, 3, 2, 3, 2, 2, 4, 5, 3, 2, 3, 3, 0, 4, 5, 36, 40, 45, 47, 47, 44, 40, 34, 38, 42, 46, 46, 43, 38, 32, 36, 41, 44, 45, 42, 36, 31, 34, 38, 40, 43, 39, 33, 29, 32, 33, 37, 39, 36, 32, 25, 27, 31, 33, 37, 36, 33, 23, 26, 29, 33, 36, 37, 33, 33, 36, 41, 45, 43, 40, 35, 31, 35, 39, 44, 43, 39, 35, 30, 33, 38, 41, 39, 36, 32, 29, 31, 34, 37, 37, 35, 29, 24, 29, 31, 34, 32, 32, 29, 19, 26, 28, 31, 30, 32, 28, 15, 24, 27, 30, 30, 29, 28, 31, 34, 36, 37, 37, 36, 30, 28, 32, 34, 36, 36, 35, 28, 25, 31, 34, 34, 34, 31, 25, 20, 29, 29, 29, 30, 28, 23, 15, 24, 26, 26, 25, 24, 23, 11, 21, 23, 23, 24, 23, 23, 10, 19, 24, 23, 22, 23, 20, 25, 29, 28, 30, 30, 29, 23, 20, 27, 28, 29, 29, 26, 21, 17, 24, 27, 26, 26, 22, 19, 14, 20, 23, 22, 22, 19, 18, 11, 15, 19, 19, 18, 14, 15, 11, 11, 17, 16, 16, 14, 11, 10, 7, 16, 15, 15, 14, 8, 12, 20, 21, 22, 21, 18, 22, 9, 17, 20, 20, 20, 15, 21, 9, 14, 18, 17, 17, 12, 15, 9, 8, 15, 14, 13, 7, 10, 7, 3, 10, 10, 9, 5, 7, 6, 3, 8, 7, 7, 4, 5, 6, 4, 5, 6, 5, 4, 5, 5, 11, 12, 13, 14, 16, 19, 5, 8, 11, 12, 13, 13, 15, 5, 5, 10, 9, 10, 10, 10, 5, 3, 7, 6, 6, 6, 5, 3, 2, 1, 1, 2, 4, 4, 2, 2, 4, 3, 0, 3, 5, 3, 2, 4, 4, 2, 2, 4, 5, 5, 9, 11, 13, 15, 15, 5, 5, 8, 10, 12, 12, 12, 5, 5, 7, 8, 8, 9, 9, 5, 4, 4, 4, 4, 5, 4, 3, 2, 4, 4, 1, 2, 4, 1, 4, 5, 5, 3, 2, 3, 2, 5, 5, 5, 3, 0, 3, 29, 34, 38, 41, 41, 39, 34, 28, 31, 36, 40, 40, 37, 33, 27, 31, 34, 38, 39, 36, 30, 26, 28, 31, 34, 37, 32, 27, 23, 25, 27, 31, 33, 31, 27, 20, 22, 25, 28, 33, 31, 27, 19, 21, 23, 27, 30, 30, 28, 27, 30, 34, 38, 38, 34, 31, 26, 29, 32, 37, 36, 34, 29, 25, 27, 32, 35, 33, 31, 26, 23, 25, 28, 31, 30, 28, 23, 20, 23, 25, 28, 27, 26, 22, 17, 20, 23, 25, 25, 25, 23, 14, 19, 22, 24, 24, 24, 24, 25, 28, 29, 31, 32, 30, 26, 23, 27, 28, 29, 30, 27, 23, 22, 25, 28, 27, 27, 26, 21, 18, 23, 24, 23, 23, 23, 17, 12, 20, 20, 19, 20, 18, 17, 8, 19, 19, 18, 18, 18, 17, 8, 16, 18, 17, 17, 18, 15, 21, 23, 23, 23, 25, 24, 17, 18, 21, 22, 22, 22, 22, 15, 14, 20, 20, 19, 20, 18, 14, 10, 17, 17, 16, 16, 15, 13, 8, 13, 13, 12, 12, 11, 10, 8, 9, 12, 11, 10, 10, 7, 8, 6, 10, 9, 9, 9, 4, 9, 15, 15, 16, 17, 14, 17, 6, 13, 13, 14, 14, 11, 15, 6, 11, 11, 11, 11, 8, 10, 6, 6, 8, 8, 7, 5, 6, 4, 2, 4, 4, 3, 3, 4, 3, 2, 2, 2, 2, 3, 4, 4, 2, 3, 2, 1, 2, 3, 3, 7, 8, 9, 10, 12, 14, 3, 6, 8, 9, 9, 10, 10, 3, 4, 6, 6, 6, 7, 7, 3, 3, 3, 3, 3, 4, 3, 1, 3, 5, 3, 2, 2, 3, 1, 4, 6, 4, 3, 0, 3, 2, 5, 6, 5, 3, 2, 2, 4, 6, 6, 8, 9, 11, 12, 4, 6, 6, 7, 8, 9, 9, 4, 6, 6, 5, 5, 5, 6, 4, 4, 6, 3, 2, 2, 3, 2, 5, 7, 6, 3, 2, 2, 4, 6, 8, 7, 4, 3, 2, 5, 7, 8, 8, 5, 3, 0, }; libwebp-1.4.0/extras/extras.h0000644000014400001440000001211014606317060013033 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // #ifndef WEBP_EXTRAS_EXTRAS_H_ #define WEBP_EXTRAS_EXTRAS_H_ #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif #include "sharpyuv/sharpyuv.h" #include "webp/encode.h" #define WEBP_EXTRAS_ABI_VERSION 0x0003 // MAJOR(8b) + MINOR(8b) //------------------------------------------------------------------------------ // Returns the version number of the extras library, packed in hexadecimal using // 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. WEBP_EXTERN int WebPGetExtrasVersion(void); //------------------------------------------------------------------------------ // Ad-hoc colorspace importers. // Import luma sample (gray scale image) into 'picture'. The 'picture' // width and height must be set prior to calling this function. WEBP_EXTERN int WebPImportGray(const uint8_t* gray, WebPPicture* picture); // Import rgb sample in RGB565 packed format into 'picture'. The 'picture' // width and height must be set prior to calling this function. WEBP_EXTERN int WebPImportRGB565(const uint8_t* rgb565, WebPPicture* pic); // Import rgb sample in RGB4444 packed format into 'picture'. The 'picture' // width and height must be set prior to calling this function. WEBP_EXTERN int WebPImportRGB4444(const uint8_t* rgb4444, WebPPicture* pic); // Import a color mapped image. The number of colors is less or equal to // MAX_PALETTE_SIZE. 'pic' must have been initialized. Its content, if any, // will be discarded. Returns 'false' in case of error, or if indexed[] contains // invalid indices. WEBP_EXTERN int WebPImportColorMappedARGB(const uint8_t* indexed, int indexed_stride, const uint32_t palette[], int palette_size, WebPPicture* pic); // Convert the ARGB content of 'pic' from associated to unassociated. // 'pic' can be for instance the result of calling of some WebPPictureImportXXX // functions, with pic->use_argb set to 'true'. It is assumed (and not checked) // that the pre-multiplied r/g/b values as less or equal than the alpha value. // Return false in case of error (invalid parameter, ...). WEBP_EXTERN int WebPUnmultiplyARGB(WebPPicture* pic); //------------------------------------------------------------------------------ // Parse a bitstream, search for VP8 (lossy) header and report a // rough estimation of the quality factor used for compressing the bitstream. // If the bitstream is in lossless format, the special value '101' is returned. // Otherwise (lossy bitstream), the returned value is in the range [0..100]. // Any error (invalid bitstream, animated WebP, incomplete header, etc.) // will return a value of -1. WEBP_EXTERN int VP8EstimateQuality(const uint8_t* const data, size_t size); //------------------------------------------------------------------------------ // Computes a score between 0 and 100 which represents the risk of having visual // quality loss from converting an RGB image to YUV420. // A low score, typically < 40, means there is a low risk of artifacts from // chroma subsampling and a simple averaging algorithm can be used instead of // the more expensive SharpYuvConvert function. // A medium score, typically >= 40 and < 70, means that simple chroma // subsampling will produce artifacts and it may be advisable to use the more // costly SharpYuvConvert for YUV420 conversion. // A high score, typically >= 70, means there is a very high risk of artifacts // from chroma subsampling even with SharpYuvConvert, and best results might be // achieved by using YUV444. // If not using SharpYuvConvert, a threshold of about 50 can be used to decide // between (simple averaging) 420 and 444. // r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point // to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise. // rgb_step: distance in bytes between two horizontally adjacent pixels on the // r, g and b channels. If rgb_bit_depth is > 8, it should be a // multiple of 2. // rgb_stride: distance in bytes between two vertically adjacent pixels on the // r, g, and b channels. If rgb_bit_depth is > 8, it should be a // multiple of 2. // rgb_bit_depth: number of bits for each r/g/b value. Only a value of 8 is // currently supported. // width, height: width and height of the image in pixels // Returns 0 on failure. WEBP_EXTERN int SharpYuvEstimate420Risk( const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, int width, int height, const SharpYuvOptions* options, float* score); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_EXTRAS_EXTRAS_H_ libwebp-1.4.0/extras/extras.c0000644000014400001440000002534414606317060013043 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Additional WebP utilities. // #include "extras/extras.h" #include #include #include #include "extras/sharpyuv_risk_table.h" #include "sharpyuv/sharpyuv.h" #include "src/dsp/dsp.h" #include "src/utils/utils.h" #include "webp/format_constants.h" #include "webp/types.h" #define XTRA_MAJ_VERSION 1 #define XTRA_MIN_VERSION 4 #define XTRA_REV_VERSION 0 //------------------------------------------------------------------------------ int WebPGetExtrasVersion(void) { return (XTRA_MAJ_VERSION << 16) | (XTRA_MIN_VERSION << 8) | XTRA_REV_VERSION; } //------------------------------------------------------------------------------ int WebPImportGray(const uint8_t* gray_data, WebPPicture* pic) { int y, width, uv_width; if (pic == NULL || gray_data == NULL) return 0; pic->colorspace = WEBP_YUV420; if (!WebPPictureAlloc(pic)) return 0; width = pic->width; uv_width = (width + 1) >> 1; for (y = 0; y < pic->height; ++y) { memcpy(pic->y + y * pic->y_stride, gray_data, width); gray_data += width; // <- we could use some 'data_stride' here if needed if ((y & 1) == 0) { memset(pic->u + (y >> 1) * pic->uv_stride, 128, uv_width); memset(pic->v + (y >> 1) * pic->uv_stride, 128, uv_width); } } return 1; } int WebPImportRGB565(const uint8_t* rgb565, WebPPicture* pic) { int x, y; uint32_t* dst; if (pic == NULL || rgb565 == NULL) return 0; pic->colorspace = WEBP_YUV420; pic->use_argb = 1; if (!WebPPictureAlloc(pic)) return 0; dst = pic->argb; for (y = 0; y < pic->height; ++y) { const int width = pic->width; for (x = 0; x < width; ++x) { #if defined(WEBP_SWAP_16BIT_CSP) && (WEBP_SWAP_16BIT_CSP == 1) const uint32_t rg = rgb565[2 * x + 1]; const uint32_t gb = rgb565[2 * x + 0]; #else const uint32_t rg = rgb565[2 * x + 0]; const uint32_t gb = rgb565[2 * x + 1]; #endif uint32_t r = rg & 0xf8; uint32_t g = ((rg << 5) | (gb >> 3)) & 0xfc; uint32_t b = (gb << 5); // dithering r = r | (r >> 5); g = g | (g >> 6); b = b | (b >> 5); dst[x] = (0xffu << 24) | (r << 16) | (g << 8) | b; } rgb565 += 2 * width; dst += pic->argb_stride; } return 1; } int WebPImportRGB4444(const uint8_t* rgb4444, WebPPicture* pic) { int x, y; uint32_t* dst; if (pic == NULL || rgb4444 == NULL) return 0; pic->colorspace = WEBP_YUV420; pic->use_argb = 1; if (!WebPPictureAlloc(pic)) return 0; dst = pic->argb; for (y = 0; y < pic->height; ++y) { const int width = pic->width; for (x = 0; x < width; ++x) { #if defined(WEBP_SWAP_16BIT_CSP) && (WEBP_SWAP_16BIT_CSP == 1) const uint32_t rg = rgb4444[2 * x + 1]; const uint32_t ba = rgb4444[2 * x + 0]; #else const uint32_t rg = rgb4444[2 * x + 0]; const uint32_t ba = rgb4444[2 * x + 1]; #endif uint32_t r = rg & 0xf0; uint32_t g = (rg << 4); uint32_t b = (ba & 0xf0); uint32_t a = (ba << 4); // dithering r = r | (r >> 4); g = g | (g >> 4); b = b | (b >> 4); a = a | (a >> 4); dst[x] = (a << 24) | (r << 16) | (g << 8) | b; } rgb4444 += 2 * width; dst += pic->argb_stride; } return 1; } int WebPImportColorMappedARGB(const uint8_t* indexed, int indexed_stride, const uint32_t palette[], int palette_size, WebPPicture* pic) { int x, y; uint32_t* dst; // 256 as the input buffer is uint8_t. assert(MAX_PALETTE_SIZE <= 256); if (pic == NULL || indexed == NULL || indexed_stride < pic->width || palette == NULL || palette_size > MAX_PALETTE_SIZE || palette_size <= 0) { return 0; } pic->use_argb = 1; if (!WebPPictureAlloc(pic)) return 0; dst = pic->argb; for (y = 0; y < pic->height; ++y) { for (x = 0; x < pic->width; ++x) { // Make sure we are within the palette. if (indexed[x] >= palette_size) { WebPPictureFree(pic); return 0; } dst[x] = palette[indexed[x]]; } indexed += indexed_stride; dst += pic->argb_stride; } return 1; } //------------------------------------------------------------------------------ int WebPUnmultiplyARGB(WebPPicture* pic) { int y; uint32_t* dst; if (pic == NULL || pic->use_argb != 1 || pic->argb == NULL) return 0; WebPInitAlphaProcessing(); dst = pic->argb; for (y = 0; y < pic->height; ++y) { WebPMultARGBRow(dst, pic->width, /*inverse=*/1); dst += pic->argb_stride; } return 1; } //------------------------------------------------------------------------------ // 420 risk metric #define YUV_FIX 16 // fixed-point precision for RGB->YUV static const int kYuvHalf = 1 << (YUV_FIX - 1); // Maps a value in [0, (256 << YUV_FIX) - 1] to [0, // precomputed_scores_table_sampling - 1]. It is important that the extremal // values are preserved and 1:1 mapped: // ConvertValue(0) = 0 // ConvertValue((256 << 16) - 1) = rgb_sampling_size - 1 static int SharpYuvConvertValueToSampledIdx(int v, int rgb_sampling_size) { v = (v + kYuvHalf) >> YUV_FIX; v = (v < 0) ? 0 : (v > 255) ? 255 : v; return (v * (rgb_sampling_size - 1)) / 255; } #undef YUV_FIX // For each pixel, computes the index to look up that color in a precomputed // risk score table where the YUV space is subsampled to a size of // precomputed_scores_table_sampling^3 (see sharpyuv_risk_table.h) static int SharpYuvConvertToYuvSharpnessIndex( int r, int g, int b, const SharpYuvConversionMatrix* matrix, int precomputed_scores_table_sampling) { const int y = SharpYuvConvertValueToSampledIdx( matrix->rgb_to_y[0] * r + matrix->rgb_to_y[1] * g + matrix->rgb_to_y[2] * b + matrix->rgb_to_y[3], precomputed_scores_table_sampling); const int u = SharpYuvConvertValueToSampledIdx( matrix->rgb_to_u[0] * r + matrix->rgb_to_u[1] * g + matrix->rgb_to_u[2] * b + matrix->rgb_to_u[3], precomputed_scores_table_sampling); const int v = SharpYuvConvertValueToSampledIdx( matrix->rgb_to_v[0] * r + matrix->rgb_to_v[1] * g + matrix->rgb_to_v[2] * b + matrix->rgb_to_v[3], precomputed_scores_table_sampling); return y + u * precomputed_scores_table_sampling + v * precomputed_scores_table_sampling * precomputed_scores_table_sampling; } static void SharpYuvRowToYuvSharpnessIndex( const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, int rgb_step, int rgb_bit_depth, int width, uint16_t* dst, const SharpYuvConversionMatrix* matrix, int precomputed_scores_table_sampling) { int i; assert(rgb_bit_depth == 8); (void)rgb_bit_depth; // Unused for now. for (i = 0; i < width; ++i, r_ptr += rgb_step, g_ptr += rgb_step, b_ptr += rgb_step) { dst[i] = SharpYuvConvertToYuvSharpnessIndex(r_ptr[0], g_ptr[0], b_ptr[0], matrix, precomputed_scores_table_sampling); } } #define SAFE_ALLOC(W, H, T) ((T*)WebPSafeMalloc((uint64_t)(W) * (H), sizeof(T))) static int DoEstimateRisk(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, int width, int height, const SharpYuvOptions* options, const uint8_t precomputed_scores_table[], int precomputed_scores_table_sampling, float* score_out) { const int sampling3 = precomputed_scores_table_sampling * precomputed_scores_table_sampling * precomputed_scores_table_sampling; const int kNoiseLevel = 4; double total_score = 0; double count = 0; // Rows of indices in uint16_t* row1 = SAFE_ALLOC(width, 1, uint16_t); uint16_t* row2 = SAFE_ALLOC(width, 1, uint16_t); uint16_t* tmp; int i, j; if (row1 == NULL || row2 == NULL) { WebPFree(row1); WebPFree(row2); return 0; } // Convert the first row ahead. SharpYuvRowToYuvSharpnessIndex(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth, width, row2, options->yuv_matrix, precomputed_scores_table_sampling); for (j = 1; j < height; ++j) { r_ptr += rgb_stride; g_ptr += rgb_stride; b_ptr += rgb_stride; // Swap row 1 and row 2. tmp = row1; row1 = row2; row2 = tmp; // Convert the row below. SharpYuvRowToYuvSharpnessIndex(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth, width, row2, options->yuv_matrix, precomputed_scores_table_sampling); for (i = 0; i < width - 1; ++i) { const int idx0 = row1[i + 0]; const int idx1 = row1[i + 1]; const int idx2 = row2[i + 0]; const int score = precomputed_scores_table[idx0 + sampling3 * idx1] + precomputed_scores_table[idx0 + sampling3 * idx2] + precomputed_scores_table[idx1 + sampling3 * idx2]; if (score > kNoiseLevel) { total_score += score; count += 1.0; } } } if (count > 0.) total_score /= count; // If less than 1% of pixels were evaluated -> below noise level. if (100. * count / (width * height) < 1.) total_score = 0.; // Rescale to [0:100] total_score = (total_score > 25.) ? 100. : total_score * 100. / 25.; WebPFree(row1); WebPFree(row2); *score_out = (float)total_score; return 1; } #undef SAFE_ALLOC int SharpYuvEstimate420Risk(const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, int width, int height, const SharpYuvOptions* options, float* score) { if (width < 1 || height < 1 || width == INT_MAX || height == INT_MAX || r_ptr == NULL || g_ptr == NULL || b_ptr == NULL || options == NULL || score == NULL) { return 0; } if (rgb_bit_depth != 8) { return 0; } if (width <= 4 || height <= 4) { *score = 0.0f; // too small, no real risk. return 1; } return DoEstimateRisk( (const uint8_t*)r_ptr, (const uint8_t*)g_ptr, (const uint8_t*)b_ptr, rgb_step, rgb_stride, rgb_bit_depth, width, height, options, kSharpYuvPrecomputedRisk, kSharpYuvPrecomputedRiskYuvSampling, score); } //------------------------------------------------------------------------------ libwebp-1.4.0/extras/Makefile.in0000644000014400001440000010436114606317243013436 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = webp_quality$(EXEEXT) $(am__EXEEXT_1) \ $(am__EXEEXT_2) @BUILD_DEMUX_TRUE@am__append_1 = get_disto @BUILD_VWEBP_SDL_TRUE@am__append_2 = vwebp_sdl subdir = extras ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @BUILD_DEMUX_TRUE@am__EXEEXT_1 = get_disto$(EXEEXT) @BUILD_VWEBP_SDL_TRUE@am__EXEEXT_2 = vwebp_sdl$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) libwebpextras_la_DEPENDENCIES = ../src/libwebp.la am_libwebpextras_la_OBJECTS = libwebpextras_la-extras.lo \ libwebpextras_la-quality_estimate.lo \ libwebpextras_la-sharpyuv_risk_table.lo libwebpextras_la_OBJECTS = $(am_libwebpextras_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebpextras_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libwebpextras_la_LDFLAGS) $(LDFLAGS) \ -o $@ am_get_disto_OBJECTS = get_disto-get_disto.$(OBJEXT) get_disto_OBJECTS = $(am_get_disto_OBJECTS) am__DEPENDENCIES_1 = get_disto_DEPENDENCIES = ../imageio/libimageio_util.la \ ../imageio/libimagedec.la ../src/libwebp.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_vwebp_sdl_OBJECTS = vwebp_sdl-vwebp_sdl.$(OBJEXT) \ vwebp_sdl-webp_to_sdl.$(OBJEXT) vwebp_sdl_OBJECTS = $(am_vwebp_sdl_OBJECTS) vwebp_sdl_DEPENDENCIES = ../imageio/libimageio_util.la \ ../src/libwebp.la $(am__DEPENDENCIES_1) am_webp_quality_OBJECTS = webp_quality-webp_quality.$(OBJEXT) webp_quality_OBJECTS = $(am_webp_quality_OBJECTS) webp_quality_DEPENDENCIES = ../imageio/libimageio_util.la \ libwebpextras.la ../src/libwebp.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/get_disto-get_disto.Po \ ./$(DEPDIR)/libwebpextras_la-extras.Plo \ ./$(DEPDIR)/libwebpextras_la-quality_estimate.Plo \ ./$(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Plo \ ./$(DEPDIR)/vwebp_sdl-vwebp_sdl.Po \ ./$(DEPDIR)/vwebp_sdl-webp_to_sdl.Po \ ./$(DEPDIR)/webp_quality-webp_quality.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpextras_la_SOURCES) $(get_disto_SOURCES) \ $(vwebp_sdl_SOURCES) $(webp_quality_SOURCES) DIST_SOURCES = $(libwebpextras_la_SOURCES) $(get_disto_SOURCES) \ $(vwebp_sdl_SOURCES) $(webp_quality_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) \ -I$(top_builddir)/src -I$(top_srcdir)/src AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libwebpextras.la noinst_HEADERS = ../src/webp/types.h libwebpextras_la_SOURCES = extras.c extras.h quality_estimate.c \ sharpyuv_risk_table.c sharpyuv_risk_table.h libwebpextras_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpextras_la_LDFLAGS = -lm libwebpextras_la_LIBADD = ../src/libwebp.la get_disto_SOURCES = get_disto.c get_disto_CPPFLAGS = $(AM_CPPFLAGS) get_disto_LDADD = ../imageio/libimageio_util.la \ ../imageio/libimagedec.la ../src/libwebp.la $(PNG_LIBS) \ $(JPEG_LIBS) $(TIFF_LIBS) webp_quality_SOURCES = webp_quality.c webp_quality_CPPFLAGS = $(AM_CPPFLAGS) webp_quality_LDADD = ../imageio/libimageio_util.la libwebpextras.la \ ../src/libwebp.la vwebp_sdl_SOURCES = vwebp_sdl.c webp_to_sdl.c webp_to_sdl.h vwebp_sdl_CPPFLAGS = $(AM_CPPFLAGS) $(SDL_INCLUDES) vwebp_sdl_LDADD = ../imageio/libimageio_util.la ../src/libwebp.la \ $(SDL_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extras/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign extras/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpextras.la: $(libwebpextras_la_OBJECTS) $(libwebpextras_la_DEPENDENCIES) $(EXTRA_libwebpextras_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpextras_la_LINK) $(libwebpextras_la_OBJECTS) $(libwebpextras_la_LIBADD) $(LIBS) get_disto$(EXEEXT): $(get_disto_OBJECTS) $(get_disto_DEPENDENCIES) $(EXTRA_get_disto_DEPENDENCIES) @rm -f get_disto$(EXEEXT) $(AM_V_CCLD)$(LINK) $(get_disto_OBJECTS) $(get_disto_LDADD) $(LIBS) vwebp_sdl$(EXEEXT): $(vwebp_sdl_OBJECTS) $(vwebp_sdl_DEPENDENCIES) $(EXTRA_vwebp_sdl_DEPENDENCIES) @rm -f vwebp_sdl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vwebp_sdl_OBJECTS) $(vwebp_sdl_LDADD) $(LIBS) webp_quality$(EXEEXT): $(webp_quality_OBJECTS) $(webp_quality_DEPENDENCIES) $(EXTRA_webp_quality_DEPENDENCIES) @rm -f webp_quality$(EXEEXT) $(AM_V_CCLD)$(LINK) $(webp_quality_OBJECTS) $(webp_quality_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_disto-get_disto.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpextras_la-extras.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpextras_la-quality_estimate.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vwebp_sdl-vwebp_sdl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vwebp_sdl-webp_to_sdl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webp_quality-webp_quality.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libwebpextras_la-extras.lo: extras.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpextras_la-extras.lo -MD -MP -MF $(DEPDIR)/libwebpextras_la-extras.Tpo -c -o libwebpextras_la-extras.lo `test -f 'extras.c' || echo '$(srcdir)/'`extras.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpextras_la-extras.Tpo $(DEPDIR)/libwebpextras_la-extras.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='extras.c' object='libwebpextras_la-extras.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpextras_la-extras.lo `test -f 'extras.c' || echo '$(srcdir)/'`extras.c libwebpextras_la-quality_estimate.lo: quality_estimate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpextras_la-quality_estimate.lo -MD -MP -MF $(DEPDIR)/libwebpextras_la-quality_estimate.Tpo -c -o libwebpextras_la-quality_estimate.lo `test -f 'quality_estimate.c' || echo '$(srcdir)/'`quality_estimate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpextras_la-quality_estimate.Tpo $(DEPDIR)/libwebpextras_la-quality_estimate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quality_estimate.c' object='libwebpextras_la-quality_estimate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpextras_la-quality_estimate.lo `test -f 'quality_estimate.c' || echo '$(srcdir)/'`quality_estimate.c libwebpextras_la-sharpyuv_risk_table.lo: sharpyuv_risk_table.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpextras_la-sharpyuv_risk_table.lo -MD -MP -MF $(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Tpo -c -o libwebpextras_la-sharpyuv_risk_table.lo `test -f 'sharpyuv_risk_table.c' || echo '$(srcdir)/'`sharpyuv_risk_table.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Tpo $(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_risk_table.c' object='libwebpextras_la-sharpyuv_risk_table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpextras_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpextras_la-sharpyuv_risk_table.lo `test -f 'sharpyuv_risk_table.c' || echo '$(srcdir)/'`sharpyuv_risk_table.c get_disto-get_disto.o: get_disto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(get_disto_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_disto-get_disto.o -MD -MP -MF $(DEPDIR)/get_disto-get_disto.Tpo -c -o get_disto-get_disto.o `test -f 'get_disto.c' || echo '$(srcdir)/'`get_disto.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_disto-get_disto.Tpo $(DEPDIR)/get_disto-get_disto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_disto.c' object='get_disto-get_disto.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(get_disto_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_disto-get_disto.o `test -f 'get_disto.c' || echo '$(srcdir)/'`get_disto.c get_disto-get_disto.obj: get_disto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(get_disto_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_disto-get_disto.obj -MD -MP -MF $(DEPDIR)/get_disto-get_disto.Tpo -c -o get_disto-get_disto.obj `if test -f 'get_disto.c'; then $(CYGPATH_W) 'get_disto.c'; else $(CYGPATH_W) '$(srcdir)/get_disto.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_disto-get_disto.Tpo $(DEPDIR)/get_disto-get_disto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_disto.c' object='get_disto-get_disto.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(get_disto_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_disto-get_disto.obj `if test -f 'get_disto.c'; then $(CYGPATH_W) 'get_disto.c'; else $(CYGPATH_W) '$(srcdir)/get_disto.c'; fi` vwebp_sdl-vwebp_sdl.o: vwebp_sdl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp_sdl-vwebp_sdl.o -MD -MP -MF $(DEPDIR)/vwebp_sdl-vwebp_sdl.Tpo -c -o vwebp_sdl-vwebp_sdl.o `test -f 'vwebp_sdl.c' || echo '$(srcdir)/'`vwebp_sdl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp_sdl-vwebp_sdl.Tpo $(DEPDIR)/vwebp_sdl-vwebp_sdl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vwebp_sdl.c' object='vwebp_sdl-vwebp_sdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp_sdl-vwebp_sdl.o `test -f 'vwebp_sdl.c' || echo '$(srcdir)/'`vwebp_sdl.c vwebp_sdl-vwebp_sdl.obj: vwebp_sdl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp_sdl-vwebp_sdl.obj -MD -MP -MF $(DEPDIR)/vwebp_sdl-vwebp_sdl.Tpo -c -o vwebp_sdl-vwebp_sdl.obj `if test -f 'vwebp_sdl.c'; then $(CYGPATH_W) 'vwebp_sdl.c'; else $(CYGPATH_W) '$(srcdir)/vwebp_sdl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp_sdl-vwebp_sdl.Tpo $(DEPDIR)/vwebp_sdl-vwebp_sdl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vwebp_sdl.c' object='vwebp_sdl-vwebp_sdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp_sdl-vwebp_sdl.obj `if test -f 'vwebp_sdl.c'; then $(CYGPATH_W) 'vwebp_sdl.c'; else $(CYGPATH_W) '$(srcdir)/vwebp_sdl.c'; fi` vwebp_sdl-webp_to_sdl.o: webp_to_sdl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp_sdl-webp_to_sdl.o -MD -MP -MF $(DEPDIR)/vwebp_sdl-webp_to_sdl.Tpo -c -o vwebp_sdl-webp_to_sdl.o `test -f 'webp_to_sdl.c' || echo '$(srcdir)/'`webp_to_sdl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp_sdl-webp_to_sdl.Tpo $(DEPDIR)/vwebp_sdl-webp_to_sdl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_to_sdl.c' object='vwebp_sdl-webp_to_sdl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp_sdl-webp_to_sdl.o `test -f 'webp_to_sdl.c' || echo '$(srcdir)/'`webp_to_sdl.c vwebp_sdl-webp_to_sdl.obj: webp_to_sdl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp_sdl-webp_to_sdl.obj -MD -MP -MF $(DEPDIR)/vwebp_sdl-webp_to_sdl.Tpo -c -o vwebp_sdl-webp_to_sdl.obj `if test -f 'webp_to_sdl.c'; then $(CYGPATH_W) 'webp_to_sdl.c'; else $(CYGPATH_W) '$(srcdir)/webp_to_sdl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp_sdl-webp_to_sdl.Tpo $(DEPDIR)/vwebp_sdl-webp_to_sdl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_to_sdl.c' object='vwebp_sdl-webp_to_sdl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_sdl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp_sdl-webp_to_sdl.obj `if test -f 'webp_to_sdl.c'; then $(CYGPATH_W) 'webp_to_sdl.c'; else $(CYGPATH_W) '$(srcdir)/webp_to_sdl.c'; fi` webp_quality-webp_quality.o: webp_quality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webp_quality_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webp_quality-webp_quality.o -MD -MP -MF $(DEPDIR)/webp_quality-webp_quality.Tpo -c -o webp_quality-webp_quality.o `test -f 'webp_quality.c' || echo '$(srcdir)/'`webp_quality.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webp_quality-webp_quality.Tpo $(DEPDIR)/webp_quality-webp_quality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_quality.c' object='webp_quality-webp_quality.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webp_quality_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webp_quality-webp_quality.o `test -f 'webp_quality.c' || echo '$(srcdir)/'`webp_quality.c webp_quality-webp_quality.obj: webp_quality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webp_quality_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webp_quality-webp_quality.obj -MD -MP -MF $(DEPDIR)/webp_quality-webp_quality.Tpo -c -o webp_quality-webp_quality.obj `if test -f 'webp_quality.c'; then $(CYGPATH_W) 'webp_quality.c'; else $(CYGPATH_W) '$(srcdir)/webp_quality.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webp_quality-webp_quality.Tpo $(DEPDIR)/webp_quality-webp_quality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_quality.c' object='webp_quality-webp_quality.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webp_quality_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webp_quality-webp_quality.obj `if test -f 'webp_quality.c'; then $(CYGPATH_W) 'webp_quality.c'; else $(CYGPATH_W) '$(srcdir)/webp_quality.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/get_disto-get_disto.Po -rm -f ./$(DEPDIR)/libwebpextras_la-extras.Plo -rm -f ./$(DEPDIR)/libwebpextras_la-quality_estimate.Plo -rm -f ./$(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Plo -rm -f ./$(DEPDIR)/vwebp_sdl-vwebp_sdl.Po -rm -f ./$(DEPDIR)/vwebp_sdl-webp_to_sdl.Po -rm -f ./$(DEPDIR)/webp_quality-webp_quality.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/get_disto-get_disto.Po -rm -f ./$(DEPDIR)/libwebpextras_la-extras.Plo -rm -f ./$(DEPDIR)/libwebpextras_la-quality_estimate.Plo -rm -f ./$(DEPDIR)/libwebpextras_la-sharpyuv_risk_table.Plo -rm -f ./$(DEPDIR)/vwebp_sdl-vwebp_sdl.Po -rm -f ./$(DEPDIR)/vwebp_sdl-webp_to_sdl.Po -rm -f ./$(DEPDIR)/webp_quality-webp_quality.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/extras/sharpyuv_risk_table.h0000644000014400001440000000223314606317060015612 0ustar // Copyright 2023 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Precomputed data for 420 risk estimation. #ifndef WEBP_EXTRAS_SHARPYUV_RISK_TABLE_H_ #define WEBP_EXTRAS_SHARPYUV_RISK_TABLE_H_ #include "src/webp/types.h" extern const int kSharpYuvPrecomputedRiskYuvSampling; // Table of precomputed risk scores when chroma subsampling images with two // given colors. // Since precomputing values for all possible YUV colors would create a huge // table, the YUV space (i.e. [0, 255]^3) is reduced to // [0, kSharpYuvPrecomputedRiskYuvSampling-1]^3 // where 255 maps to kSharpYuvPrecomputedRiskYuvSampling-1. // Table size: kSharpYuvPrecomputedRiskYuvSampling^6 bytes or 114 KiB extern const uint8_t kSharpYuvPrecomputedRisk[]; #endif // WEBP_EXTRAS_SHARPYUV_RISK_TABLE_H_ libwebp-1.4.0/extras/vwebp_sdl.c0000644000014400001440000000461414606317060013517 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple SDL-based WebP file viewer. // Does not support animation, just static images. // // Press 'q' to exit. // // Author: James Zern (jzern@google.com) #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #if defined(WEBP_HAVE_SDL) #include "webp_to_sdl.h" #include "webp/decode.h" #include "imageio/imageio_util.h" #include "../examples/unicode.h" #if defined(WEBP_HAVE_JUST_SDL_H) #include #else #include #endif static void ProcessEvents(void) { int done = 0; SDL_Event event; while (!done && SDL_WaitEvent(&event)) { switch (event.type) { case SDL_KEYUP: switch (event.key.keysym.sym) { case SDLK_q: done = 1; break; default: break; } break; default: break; } } } int main(int argc, char* argv[]) { int c; int ok = 0; INIT_WARGV(argc, argv); for (c = 1; c < argc; ++c) { const char* file = NULL; const uint8_t* webp = NULL; size_t webp_size = 0; if (!strcmp(argv[c], "-h")) { printf("Usage: %s [-h] image.webp [more_files.webp...]\n", argv[0]); FREE_WARGV_AND_RETURN(0); } else { file = (const char*)GET_WARGV(argv, c); } if (file == NULL) continue; if (!ImgIoUtilReadFile(file, &webp, &webp_size)) { WFPRINTF(stderr, "Error opening file: %s\n", (const W_CHAR*)file); goto Error; } if (webp_size != (size_t)(int)webp_size) { free((void*)webp); fprintf(stderr, "File too large.\n"); goto Error; } ok = WebPToSDL((const char*)webp, (int)webp_size); free((void*)webp); if (!ok) { WFPRINTF(stderr, "Error decoding file %s\n", (const W_CHAR*)file); goto Error; } ProcessEvents(); } ok = 1; Error: SDL_Quit(); FREE_WARGV_AND_RETURN(ok ? 0 : 1); } #else // !WEBP_HAVE_SDL int main(int argc, const char* argv[]) { fprintf(stderr, "SDL support not enabled in %s.\n", argv[0]); (void)argc; return 0; } #endif libwebp-1.4.0/codereview.settings0000644000014400001440000000025214606317060013770 0ustar # This file is used by git cl to get repository specific information. GERRIT_HOST: True CODE_REVIEW_SERVER: chromium-review.googlesource.com GERRIT_SQUASH_UPLOADS: False libwebp-1.4.0/.cmake-format.py0000644000014400001440000002033514606317060013054 0ustar # ---------------------------------- # Options affecting listfile parsing # ---------------------------------- with section("parse"): # Specify structure for custom cmake functions additional_commands = { 'foo': { 'flags': ['BAR', 'BAZ'], 'kwargs': {'DEPENDS': '*', 'HEADERS': '*', 'SOURCES': '*'}}} # Override configurations per-command where available override_spec = {} # Specify variable tags. vartags = [] # Specify property tags. proptags = [] # ----------------------------- # Options affecting formatting. # ----------------------------- with section("format"): # Disable formatting entirely, making cmake-format a no-op disable = False # How wide to allow formatted cmake files line_width = 80 # How many spaces to tab for indent tab_size = 2 # If true, lines are indented using tab characters (utf-8 0x09) instead of # space characters (utf-8 0x20). In cases where the layout would # require a fractional tab character, the behavior of the fractional # indentation is governed by use_tabchars = False # If is True, then the value of this variable indicates how # fractional indentions are handled during whitespace replacement. If set to # 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set # to `round-up` fractional indentation is replaced with a single tab character # (utf-8 0x09) effectively shifting the column to the next tabstop fractional_tab_policy = 'use-space' # If an argument group contains more than this many sub-groups (parg or kwarg # groups) then force it to a vertical layout. max_subgroups_hwrap = 3 # If a positional argument group contains more than this many arguments, then # force it to a vertical layout. max_pargs_hwrap = 6 # If a cmdline positional group consumes more than this many lines without # nesting, then invalidate the layout (and nest) max_rows_cmdline = 2 # If true, separate flow control names from their parentheses with a space separate_ctrl_name_with_space = False # If true, separate function names from parentheses with a space separate_fn_name_with_space = False # If a statement is wrapped to more than one line, than dangle the closing # parenthesis on its own line. dangle_parens = False # If the trailing parenthesis must be 'dangled' on its on line, then align it # to this reference: `prefix`: the start of the statement, `prefix-indent`: # the start of the statement, plus one indentation level, `child`: align to # the column of the arguments dangle_align = 'prefix' # If the statement spelling length (including space and parenthesis) is # smaller than this amount, then force reject nested layouts. min_prefix_chars = 4 # If the statement spelling length (including space and parenthesis) is larger # than the tab width by more than this amount, then force reject un-nested # layouts. max_prefix_chars = 10 # If a candidate layout is wrapped horizontally but it exceeds this many # lines, then reject the layout. max_lines_hwrap = 2 # What style line endings to use in the output. line_ending = 'unix' # Format command names consistently as 'lower' or 'upper' case command_case = 'canonical' # Format keywords consistently as 'lower' or 'upper' case keyword_case = 'unchanged' # A list of command names which should always be wrapped always_wrap = [] # If true, the argument lists which are known to be sortable will be sorted # lexicographicall enable_sort = True # If true, the parsers may infer whether or not an argument list is sortable # (without annotation). autosort = False # By default, if cmake-format cannot successfully fit everything into the # desired linewidth it will apply the last, most agressive attempt that it # made. If this flag is True, however, cmake-format will print error, exit # with non-zero status code, and write-out nothing require_valid_layout = False # A dictionary mapping layout nodes to a list of wrap decisions. See the # documentation for more information. layout_passes = {} # ------------------------------------------------ # Options affecting comment reflow and formatting. # ------------------------------------------------ with section("markup"): # What character to use for bulleted lists bullet_char = '*' # What character to use as punctuation after numerals in an enumerated list enum_char = '.' # If comment markup is enabled, don't reflow the first comment block in each # listfile. Use this to preserve formatting of your copyright/license # statements. first_comment_is_literal = True # If comment markup is enabled, don't reflow any comment block which matches # this (regex) pattern. Default is `None` (disabled). literal_comment_pattern = None # Regular expression to match preformat fences in comments default= # ``r'^\s*([`~]{3}[`~]*)(.*)$'`` fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$' # Regular expression to match rulers in comments default= # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'`` ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$' # If a comment line matches starts with this pattern then it is explicitly a # trailing comment for the preceeding argument. Default is '#<' explicit_trailing_pattern = '#<' # If a comment line starts with at least this many consecutive hash # characters, then don't lstrip() them off. This allows for lazy hash rulers # where the first hash char is not separated by space hashruler_min_length = 10 # If true, then insert a space between the first hash char and remaining hash # chars in a hash ruler, and normalize its length to fill the column canonicalize_hashrulers = True # enable comment markup parsing and reflow enable_markup = True # ---------------------------- # Options affecting the linter # ---------------------------- with section("lint"): # a list of lint codes to disable disabled_codes = [] # regular expression pattern describing valid function names function_pattern = '[0-9a-z_]+' # regular expression pattern describing valid macro names macro_pattern = '[0-9A-Z_]+' # regular expression pattern describing valid names for variables with global # (cache) scope global_var_pattern = '[A-Z][0-9A-Z_]+' # regular expression pattern describing valid names for variables with global # scope (but internal semantic) internal_var_pattern = '_[A-Z][0-9A-Z_]+' # regular expression pattern describing valid names for variables with local # scope local_var_pattern = '[a-z][a-z0-9_]+' # regular expression pattern describing valid names for privatedirectory # variables private_var_pattern = '_[0-9a-z_]+' # regular expression pattern describing valid names for public directory # variables public_var_pattern = '[A-Z][0-9A-Z_]+' # regular expression pattern describing valid names for function/macro # arguments and loop variables. argument_var_pattern = '[a-z][a-z0-9_]+' # regular expression pattern describing valid names for keywords used in # functions or macros keyword_pattern = '[A-Z][0-9A-Z_]+' # In the heuristic for C0201, how many conditionals to match within a loop in # before considering the loop a parser. max_conditionals_custom_parser = 2 # Require at least this many newlines between statements min_statement_spacing = 1 # Require no more than this many newlines between statements max_statement_spacing = 2 max_returns = 6 max_branches = 12 max_arguments = 5 max_localvars = 15 max_statements = 50 # ------------------------------- # Options affecting file encoding # ------------------------------- with section("encode"): # If true, emit the unicode byte-order mark (BOM) at the start of the file emit_byteorder_mark = False # Specify the encoding of the input file. Defaults to utf-8 input_encoding = 'utf-8' # Specify the encoding of the output file. Defaults to utf-8. Note that cmake # only claims to support utf-8 so be careful when using anything else output_encoding = 'utf-8' # ------------------------------------- # Miscellaneous configurations options. # ------------------------------------- with section("misc"): # A dictionary containing any per-command configuration overrides. Currently # only `command_case` is supported. per_command = {} libwebp-1.4.0/README.md0000644000014400001440000000306214606317060011333 0ustar # WebP Codec ``` __ __ ____ ____ ____ / \\/ \/ _ \/ _ )/ _ \ \ / __/ _ \ __/ \__\__/\____/\_____/__/ ____ ___ / _/ / \ \ / _ \/ _/ / \_/ / / \ \ __/ \__ \____/____/\_____/_____/____/v1.4.0 ``` WebP codec is a library to encode and decode images in WebP format. This package contains the library that can be used in other programs to add WebP support, as well as the command line tools 'cwebp' and 'dwebp' to compress and decompress images respectively. See https://developers.google.com/speed/webp for details on the image format. The latest source tree is available at https://chromium.googlesource.com/webm/libwebp It is released under the same license as the WebM project. See https://www.webmproject.org/license/software/ or the "COPYING" file for details. An additional intellectual property rights grant can be found in the file PATENTS. ## Building See the [building documentation](doc/building.md). ## Encoding and Decoding Tools The examples/ directory contains tools to encode and decode images and animations, view information about WebP images, and more. See the [tools documentation](doc/tools.md). ## APIs See the [APIs documentation](doc/api.md), and API usage examples in the `examples/` directory. ## Bugs Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp Patches welcome! See [how to contribute](CONTRIBUTING.md). ## Discuss Email: webp-discuss@webmproject.org Web: https://groups.google.com/a/webmproject.org/group/webp-discuss libwebp-1.4.0/xcframeworkbuild.sh0000755000014400001440000002303214606317060013762 0ustar #!/bin/bash # # This script generates 'WebP.xcframework', 'WebPDecoder.xcframework', # 'WebPDemux.xcframework' and 'WebPMux.xcframework'. # An iOS, Mac or Mac Catalyst app can decode WebP images by including # 'WebPDecoder.xcframework' and both encode and decode WebP images by including # 'WebP.xcframework'. # # Run ./xcframeworkbuild.sh to generate the frameworks under the current # directory (the previous build will be erased if it exists). # set -e # Set these variables based on the desired minimum deployment target. readonly IOS_MIN_VERSION=6.0 readonly MACOSX_MIN_VERSION=10.15 readonly MACOSX_CATALYST_MIN_VERSION=14.0 # Extract Xcode version. readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2) if [[ -z "${XCODE}" ]] || [[ "${XCODE%%.*}" -lt 11 ]]; then echo "Xcode 11.0 or higher is required!" exit 1 fi # Extract the latest SDK version from the final field of the form: iphoneosX.Y # / macosxX.Y readonly SDK=($( xcodebuild -showsdks \ | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}' xcodebuild -showsdks \ | grep macosx | sort | tail -n 1 | awk '{print substr($NF, 7)}' )) readonly IOS=0 readonly MACOS=1 readonly IOS_SIMULATOR=2 readonly MACOS_CATALYST=3 readonly NUM_PLATFORMS=4 readonly OLDPATH=${PATH} # Names should be of the form '-[-]'. PLATFORMS[$IOS]="iPhoneOS-armv7 iPhoneOS-armv7s iPhoneOS-arm64" PLATFORMS[$IOS_SIMULATOR]="iPhoneSimulator-i386 iPhoneSimulator-x86_64" PLATFORMS[$MACOS]="MacOSX-x86_64" PLATFORMS[$MACOS_CATALYST]="MacOSX-Catalyst-x86_64" if [[ "${XCODE%%.*}" -ge 12 ]]; then PLATFORMS[$MACOS]+=" MacOSX-arm64" PLATFORMS[$MACOS_CATALYST]+=" MacOSX-Catalyst-arm64" PLATFORMS[$IOS_SIMULATOR]+=" iPhoneSimulator-arm64" elif [[ "${XCODE%%.*}" -eq 11 ]]; then cat << EOF WARNING: Xcode 12.0 or higher is required to build targets for WARNING: Apple Silicon (arm64). The XCFrameworks generated with Xcode 11 will WARNING: contain libraries for MacOS & Catalyst supporting x86_64 only. WARNING: The build will continue in 5 seconds... EOF sleep 5 else echo "Xcode 11.0 or higher is required!" exit 1 fi readonly PLATFORMS readonly SRCDIR=$(dirname $0) readonly TOPDIR=$(pwd) readonly BUILDDIR="${TOPDIR}/xcframeworkbuild" readonly TARGETDIR="${TOPDIR}/WebP.xcframework" readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.xcframework" readonly MUXTARGETDIR="${TOPDIR}/WebPMux.xcframework" readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.xcframework" readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.xcframework" readonly DEVELOPER=$(xcode-select --print-path) readonly DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain" readonly PLATFORMSROOT="${DEVELOPER}/Platforms" readonly LIPO=$(xcrun -sdk iphoneos${SDK[$IOS]} -find lipo) if [[ -z "${SDK[$IOS]}" ]] || [[ ${SDK[$IOS]%%.*} -lt 8 ]]; then echo "iOS SDK version 8.0 or higher is required!" exit 1 fi ####################################### # Moves Headers/*.h to Headers// # # Places framework headers in a subdirectory to avoid Xcode errors when using # multiple frameworks: # error: Multiple commands produce # '.../Build/Products/Debug-iphoneos/include/types.h' # Arguments: # $1 - path to framework ####################################### update_headers_path() { local framework_name="$(basename ${1%.xcframework})" local subdir for d in $(find "$1" -path "*/Headers"); do subdir="$d/$framework_name" if [[ -d "$subdir" ]]; then # SharpYuv will have a sharpyuv subdirectory. macOS is case insensitive, # but for consistency with the other frameworks, rename the directory to # match the case of the framework name. mv "$(echo ${subdir} | tr 'A-Z' 'a-z')" "$subdir" else mkdir "$subdir" mv "$d/"*.h "$subdir" fi done } echo "Xcode Version: ${XCODE}" echo "iOS SDK Version: ${SDK[$IOS]}" echo "MacOS SDK Version: ${SDK[$MACOS]}" if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \ || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \ || -e "${SHARPYUVTARGETDIR}" ]]; then cat << EOF WARNING: The following directories will be deleted: WARNING: ${BUILDDIR} WARNING: ${TARGETDIR} WARNING: ${DECTARGETDIR} WARNING: ${MUXTARGETDIR} WARNING: ${DEMUXTARGETDIR} WARNING: ${SHARPYUVTARGETDIR} WARNING: The build will continue in 5 seconds... EOF sleep 5 fi rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \ ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR} if [[ ! -e ${SRCDIR}/configure ]]; then if ! (cd ${SRCDIR} && sh autogen.sh); then cat << EOF Error creating configure script! This script requires the autoconf/automake and libtool to build. MacPorts or Homebrew can be used to obtain these: https://www.macports.org/install.php https://brew.sh/ EOF exit 1 fi fi for (( i = 0; i < $NUM_PLATFORMS; ++i )); do LIBLIST=() DECLIBLIST=() MUXLIBLIST=() DEMUXLIBLIST=() SHARPYUVLIBLIST=() for PLATFORM in ${PLATFORMS[$i]}; do ROOTDIR="${BUILDDIR}/${PLATFORM}" mkdir -p "${ROOTDIR}" ARCH="${PLATFORM##*-}" case "${PLATFORM}" in iPhone*) sdk="${SDK[$IOS]}" ;; MacOS*) sdk="${SDK[$MACOS]}" ;; *) echo "Unrecognized platform: ${PLATFORM}!" exit 1 ;; esac SDKROOT="${PLATFORMSROOT}/${PLATFORM%%-*}.platform/" SDKROOT+="Developer/SDKs/${PLATFORM%%-*}${sdk}.sdk/" CFLAGS="-pipe -isysroot ${SDKROOT} -O3 -DNDEBUG" case "${PLATFORM}" in iPhone*) CFLAGS+=" -fembed-bitcode" CFLAGS+=" -target ${ARCH}-apple-ios${IOS_MIN_VERSION}" [[ "${PLATFORM}" == *Simulator* ]] && CFLAGS+="-simulator" ;; MacOSX-Catalyst*) CFLAGS+=" -target" CFLAGS+=" ${ARCH}-apple-ios${MACOSX_CATALYST_MIN_VERSION}-macabi" ;; MacOSX*) CFLAGS+=" -mmacosx-version-min=${MACOSX_MIN_VERSION}" ;; esac set -x export PATH="${DEVROOT}/usr/bin:${OLDPATH}" ${SRCDIR}/configure --host=${ARCH/arm64/aarch64}-apple-darwin \ --build=$(${SRCDIR}/config.guess) \ --prefix=${ROOTDIR} \ --disable-shared --enable-static \ --enable-libwebpdecoder --enable-swap-16bit-csp \ --enable-libwebpmux \ CC="clang -arch ${ARCH}" \ CFLAGS="${CFLAGS}" set +x # Build only the libraries, skip the examples. make V=0 -C sharpyuv install make V=0 -C src install LIBLIST+=("${ROOTDIR}/lib/libwebp.a") DECLIBLIST+=("${ROOTDIR}/lib/libwebpdecoder.a") MUXLIBLIST+=("${ROOTDIR}/lib/libwebpmux.a") DEMUXLIBLIST+=("${ROOTDIR}/lib/libwebpdemux.a") SHARPYUVLIBLIST+=("${ROOTDIR}/lib/libsharpyuv.a") # xcodebuild requires a directory for the -headers option, these will match # for all builds. make -C src install-data DESTDIR="${ROOTDIR}/lib-headers" make -C src install-commonHEADERS DESTDIR="${ROOTDIR}/dec-headers" make -C src/demux install-data DESTDIR="${ROOTDIR}/demux-headers" make -C src/mux install-data DESTDIR="${ROOTDIR}/mux-headers" make -C sharpyuv install-data DESTDIR="${ROOTDIR}/sharpyuv-headers" LIB_HEADERS="${ROOTDIR}/lib-headers/${ROOTDIR}/include/webp" DEC_HEADERS="${ROOTDIR}/dec-headers/${ROOTDIR}/include/webp" DEMUX_HEADERS="${ROOTDIR}/demux-headers/${ROOTDIR}/include/webp" MUX_HEADERS="${ROOTDIR}/mux-headers/${ROOTDIR}/include/webp" SHARPYUV_HEADERS="${ROOTDIR}/sharpyuv-headers/${ROOTDIR}/include/webp" make distclean export PATH=${OLDPATH} done [[ -z "${LIBLIST[@]}" ]] && continue # Create a temporary target directory for each [-]. target_dir="${BUILDDIR}/${PLATFORMS[$i]}" target_dir="${target_dir%% *}" target_dir="${target_dir%-*}" target_lib="${target_dir}/$(basename ${LIBLIST[0]})" target_declib="${target_dir}/$(basename ${DECLIBLIST[0]})" target_demuxlib="${target_dir}/$(basename ${DEMUXLIBLIST[0]})" target_muxlib="${target_dir}/$(basename ${MUXLIBLIST[0]})" target_sharpyuvlib="${target_dir}/$(basename ${SHARPYUVLIBLIST[0]})" mkdir -p "${target_dir}" ${LIPO} -create ${LIBLIST[@]} -output "${target_lib}" ${LIPO} -create ${DECLIBLIST[@]} -output "${target_declib}" ${LIPO} -create ${DEMUXLIBLIST[@]} -output "${target_demuxlib}" ${LIPO} -create ${MUXLIBLIST[@]} -output "${target_muxlib}" ${LIPO} -create ${SHARPYUVLIBLIST[@]} -output "${target_sharpyuvlib}" FAT_LIBLIST+=(-library "${target_lib}" -headers "${LIB_HEADERS}") FAT_DECLIBLIST+=(-library "${target_declib}" -headers "${DEC_HEADERS}") FAT_DEMUXLIBLIST+=(-library "${target_demuxlib}" -headers "${DEMUX_HEADERS}") FAT_MUXLIBLIST+=(-library "${target_muxlib}" -headers "${MUX_HEADERS}") FAT_SHARPYUVLIBLIST+=(-library "${target_sharpyuvlib}") FAT_SHARPYUVLIBLIST+=(-headers "${SHARPYUV_HEADERS}") done # lipo will not put archives with the same architecture (e.g., x86_64 # iPhoneSimulator & MacOS) in the same fat output file. xcodebuild # -create-xcframework requires universal archives to avoid e.g.: # Both ios-x86_64-maccatalyst and ios-arm64-maccatalyst represent two # equivalent library definitions set -x xcodebuild -create-xcframework "${FAT_LIBLIST[@]}" \ -output ${TARGETDIR} xcodebuild -create-xcframework "${FAT_DECLIBLIST[@]}" \ -output ${DECTARGETDIR} xcodebuild -create-xcframework "${FAT_DEMUXLIBLIST[@]}" \ -output ${DEMUXTARGETDIR} xcodebuild -create-xcframework "${FAT_MUXLIBLIST[@]}" \ -output ${MUXTARGETDIR} xcodebuild -create-xcframework "${FAT_SHARPYUVLIBLIST[@]}" \ -output ${SHARPYUVTARGETDIR} update_headers_path "${TARGETDIR}" update_headers_path "${DECTARGETDIR}" update_headers_path "${DEMUXTARGETDIR}" update_headers_path "${MUXTARGETDIR}" update_headers_path "${SHARPYUVTARGETDIR}" set +x echo "SUCCESS" libwebp-1.4.0/AUTHORS0000644000014400001440000000575014606317060011132 0ustar Contributors: - Aidan O'Loan (aidanol at gmail dot com) - Alan Browning (browning at google dot com) - Alexandru Ardelean (ardeleanalex at gmail dot com) - Anuraag Agrawal (anuraaga at gmail dot com) - Arthur Eubanks (aeubanks at google dot com) - Brian Ledger (brianpl at google dot com) - Charles Munger (clm at google dot com) - Cheng Yi (cyi at google dot com) - Christian Duvivier (cduvivier at google dot com) - Christopher Degawa (ccom at randomderp dot com) - Clement Courbet (courbet at google dot com) - Djordje Pesut (djordje dot pesut at imgtec dot com) - Frank Barchard (fbarchard at google dot com) - Hui Su (huisu at google dot com) - H. Vetinari (h dot vetinari at gmx dot com) - Ilya Kurdyukov (jpegqs at gmail dot com) - Ingvar Stepanyan (rreverser at google dot com) - James Zern (jzern at google dot com) - Jan Engelhardt (jengelh at medozas dot de) - Jehan (jehan at girinstud dot io) - Jeremy Maitin-Shepard (jbms at google dot com) - Johann Koenig (johann dot koenig at duck dot com) - Jonathan Grant (jgrantinfotech at gmail dot com) - Jonliu1993 (13720414433 at 163 dot com) - Jovan Zelincevic (jovan dot zelincevic at imgtec dot com) - Jyrki Alakuijala (jyrki at google dot com) - Konstantin Ivlev (tomskside at gmail dot com) - Lode Vandevenne (lode at google dot com) - Lou Quillio (louquillio at google dot com) - Mans Rullgard (mans at mansr dot com) - Marcin Kowalczyk (qrczak at google dot com) - Martin Olsson (mnemo at minimum dot se) - Maryla Ustarroz-Calonge (maryla at google dot com) - Masahiro Hanada (hanada at atmark-techno dot com) - Mikołaj Zalewski (mikolajz at google dot com) - Mislav Bradac (mislavm at google dot com) - natewood (natewood at fb dot com) - Nico Weber (thakis at chromium dot org) - Noel Chromium (noel at chromium dot org) - Nozomi Isozaki (nontan at pixiv dot co dot jp) - Oliver Wolff (oliver dot wolff at qt dot io) - Owen Rodley (orodley at google dot com) - Ozkan Sezer (sezeroz at gmail dot com) - Parag Salasakar (img dot mips1 at gmail dot com) - Pascal Massimino (pascal dot massimino at gmail dot com) - Paweł Hajdan, Jr (phajdan dot jr at chromium dot org) - Pierre Joye (pierre dot php at gmail dot com) - Roberto Alanis (alanisbaez at google dot com) - Sam Clegg (sbc at chromium dot org) - Scott Hancher (seh at google dot com) - Scott LaVarnway (slavarnway at google dot com) - Scott Talbot (s at chikachow dot org) - Slobodan Prijic (slobodan dot prijic at imgtec dot com) - Somnath Banerjee (somnath dot banerjee at gmail dot com) - Sriraman Tallam (tmsriram at google dot com) - Tamar Levy (tamar dot levy at intel dot com) - Thiago Perrotta (tperrotta at google dot com) - Timothy Gu (timothygu99 at gmail dot com) - Urvang Joshi (urvang at google dot com) - Vikas Arora (vikasa at google dot com) - Vincent Rabaud (vrabaud at google dot com) - Vlad Tsyrklevich (vtsyrklevich at chromium dot org) - Wan-Teh Chang (wtc at google dot com) - Yang Zhang (yang dot zhang at arm dot com) - Yannis Guyon (yguyon at google dot com) - Zhi An Ng (zhin at chromium dot org) libwebp-1.4.0/Android.mk0000644000014400001440000001660514606317060011774 0ustar # Ignore this file during non-NDK builds. ifdef NDK_ROOT LOCAL_PATH := $(call my-dir) WEBP_CFLAGS := -Wall -DANDROID -DHAVE_MALLOC_H -DHAVE_PTHREAD -DWEBP_USE_THREAD WEBP_CFLAGS += -fvisibility=hidden ifeq ($(APP_OPTIM),release) WEBP_CFLAGS += -finline-functions -ffast-math \ -ffunction-sections -fdata-sections ifeq ($(findstring clang,$(NDK_TOOLCHAIN_VERSION)),) WEBP_CFLAGS += -frename-registers -s endif endif # mips32 fails to build with clang from r14b # https://bugs.chromium.org/p/webp/issues/detail?id=343 ifeq ($(findstring clang,$(NDK_TOOLCHAIN_VERSION)),clang) ifeq ($(TARGET_ARCH),mips) clang_version := $(shell $(TARGET_CC) --version) ifneq ($(findstring clang version 3,$(clang_version)),) WEBP_CFLAGS += -no-integrated-as endif endif endif ifneq ($(findstring armeabi-v7a, $(TARGET_ARCH_ABI)),) # Setting LOCAL_ARM_NEON will enable -mfpu=neon which may cause illegal # instructions to be generated for armv7a code. Instead target the neon code # specifically. NEON := c.neon USE_CPUFEATURES := yes WEBP_CFLAGS += -DHAVE_CPU_FEATURES_H else NEON := c endif sharpyuv_srcs := \ sharpyuv/sharpyuv.c \ sharpyuv/sharpyuv_cpu.c \ sharpyuv/sharpyuv_csp.c \ sharpyuv/sharpyuv_dsp.c \ sharpyuv/sharpyuv_gamma.c \ sharpyuv/sharpyuv_neon.$(NEON) \ sharpyuv/sharpyuv_sse2.c \ dec_srcs := \ src/dec/alpha_dec.c \ src/dec/buffer_dec.c \ src/dec/frame_dec.c \ src/dec/idec_dec.c \ src/dec/io_dec.c \ src/dec/quant_dec.c \ src/dec/tree_dec.c \ src/dec/vp8_dec.c \ src/dec/vp8l_dec.c \ src/dec/webp_dec.c \ demux_srcs := \ src/demux/anim_decode.c \ src/demux/demux.c \ dsp_dec_srcs := \ src/dsp/alpha_processing.c \ src/dsp/alpha_processing_mips_dsp_r2.c \ src/dsp/alpha_processing_neon.$(NEON) \ src/dsp/alpha_processing_sse2.c \ src/dsp/alpha_processing_sse41.c \ src/dsp/cpu.c \ src/dsp/dec.c \ src/dsp/dec_clip_tables.c \ src/dsp/dec_mips32.c \ src/dsp/dec_mips_dsp_r2.c \ src/dsp/dec_msa.c \ src/dsp/dec_neon.$(NEON) \ src/dsp/dec_sse2.c \ src/dsp/dec_sse41.c \ src/dsp/filters.c \ src/dsp/filters_mips_dsp_r2.c \ src/dsp/filters_msa.c \ src/dsp/filters_neon.$(NEON) \ src/dsp/filters_sse2.c \ src/dsp/lossless.c \ src/dsp/lossless_mips_dsp_r2.c \ src/dsp/lossless_msa.c \ src/dsp/lossless_neon.$(NEON) \ src/dsp/lossless_sse2.c \ src/dsp/lossless_sse41.c \ src/dsp/rescaler.c \ src/dsp/rescaler_mips32.c \ src/dsp/rescaler_mips_dsp_r2.c \ src/dsp/rescaler_msa.c \ src/dsp/rescaler_neon.$(NEON) \ src/dsp/rescaler_sse2.c \ src/dsp/upsampling.c \ src/dsp/upsampling_mips_dsp_r2.c \ src/dsp/upsampling_msa.c \ src/dsp/upsampling_neon.$(NEON) \ src/dsp/upsampling_sse2.c \ src/dsp/upsampling_sse41.c \ src/dsp/yuv.c \ src/dsp/yuv_mips32.c \ src/dsp/yuv_mips_dsp_r2.c \ src/dsp/yuv_neon.$(NEON) \ src/dsp/yuv_sse2.c \ src/dsp/yuv_sse41.c \ dsp_enc_srcs := \ src/dsp/cost.c \ src/dsp/cost_mips32.c \ src/dsp/cost_mips_dsp_r2.c \ src/dsp/cost_neon.$(NEON) \ src/dsp/cost_sse2.c \ src/dsp/enc.c \ src/dsp/enc_mips32.c \ src/dsp/enc_mips_dsp_r2.c \ src/dsp/enc_msa.c \ src/dsp/enc_neon.$(NEON) \ src/dsp/enc_sse2.c \ src/dsp/enc_sse41.c \ src/dsp/lossless_enc.c \ src/dsp/lossless_enc_mips32.c \ src/dsp/lossless_enc_mips_dsp_r2.c \ src/dsp/lossless_enc_msa.c \ src/dsp/lossless_enc_neon.$(NEON) \ src/dsp/lossless_enc_sse2.c \ src/dsp/lossless_enc_sse41.c \ src/dsp/ssim.c \ src/dsp/ssim_sse2.c \ enc_srcs := \ src/enc/alpha_enc.c \ src/enc/analysis_enc.c \ src/enc/backward_references_cost_enc.c \ src/enc/backward_references_enc.c \ src/enc/config_enc.c \ src/enc/cost_enc.c \ src/enc/filter_enc.c \ src/enc/frame_enc.c \ src/enc/histogram_enc.c \ src/enc/iterator_enc.c \ src/enc/near_lossless_enc.c \ src/enc/picture_enc.c \ src/enc/picture_csp_enc.c \ src/enc/picture_psnr_enc.c \ src/enc/picture_rescale_enc.c \ src/enc/picture_tools_enc.c \ src/enc/predictor_enc.c \ src/enc/quant_enc.c \ src/enc/syntax_enc.c \ src/enc/token_enc.c \ src/enc/tree_enc.c \ src/enc/vp8l_enc.c \ src/enc/webp_enc.c \ mux_srcs := \ src/mux/anim_encode.c \ src/mux/muxedit.c \ src/mux/muxinternal.c \ src/mux/muxread.c \ utils_dec_srcs := \ src/utils/bit_reader_utils.c \ src/utils/color_cache_utils.c \ src/utils/filters_utils.c \ src/utils/huffman_utils.c \ src/utils/palette.c \ src/utils/quant_levels_dec_utils.c \ src/utils/random_utils.c \ src/utils/rescaler_utils.c \ src/utils/thread_utils.c \ src/utils/utils.c \ utils_enc_srcs := \ src/utils/bit_writer_utils.c \ src/utils/huffman_encode_utils.c \ src/utils/quant_levels_utils.c \ ################################################################################ # libwebpdecoder include $(CLEAR_VARS) LOCAL_SRC_FILES := \ $(dec_srcs) \ $(dsp_dec_srcs) \ $(utils_dec_srcs) \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src # prefer arm over thumb mode for performance gains LOCAL_ARM_MODE := arm ifeq ($(USE_CPUFEATURES),yes) LOCAL_STATIC_LIBRARIES := cpufeatures endif LOCAL_MODULE := webpdecoder_static include $(BUILD_STATIC_LIBRARY) ifeq ($(ENABLE_SHARED),1) include $(CLEAR_VARS) LOCAL_WHOLE_STATIC_LIBRARIES := webpdecoder_static LOCAL_MODULE := webpdecoder include $(BUILD_SHARED_LIBRARY) endif # ENABLE_SHARED=1 ################################################################################ # libwebp include $(CLEAR_VARS) LOCAL_SRC_FILES := \ $(sharpyuv_srcs) \ $(dsp_enc_srcs) \ $(enc_srcs) \ $(utils_enc_srcs) \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src $(LOCAL_PATH) # prefer arm over thumb mode for performance gains LOCAL_ARM_MODE := arm LOCAL_WHOLE_STATIC_LIBRARIES := webpdecoder_static LOCAL_MODULE := webp ifeq ($(ENABLE_SHARED),1) include $(BUILD_SHARED_LIBRARY) else include $(BUILD_STATIC_LIBRARY) endif ################################################################################ # libwebpdemux include $(CLEAR_VARS) LOCAL_SRC_FILES := $(demux_srcs) LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src # prefer arm over thumb mode for performance gains LOCAL_ARM_MODE := arm LOCAL_MODULE := webpdemux ifeq ($(ENABLE_SHARED),1) LOCAL_SHARED_LIBRARIES := webp include $(BUILD_SHARED_LIBRARY) else LOCAL_STATIC_LIBRARIES := webp include $(BUILD_STATIC_LIBRARY) endif ################################################################################ # libwebpmux include $(CLEAR_VARS) LOCAL_SRC_FILES := $(mux_srcs) LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH)/src # prefer arm over thumb mode for performance gains LOCAL_ARM_MODE := arm LOCAL_MODULE := webpmux ifeq ($(ENABLE_SHARED),1) LOCAL_SHARED_LIBRARIES := webp include $(BUILD_SHARED_LIBRARY) else LOCAL_STATIC_LIBRARIES := webp include $(BUILD_STATIC_LIBRARY) endif ################################################################################ WEBP_SRC_PATH := $(LOCAL_PATH) include $(WEBP_SRC_PATH)/imageio/Android.mk include $(WEBP_SRC_PATH)/examples/Android.mk ifeq ($(USE_CPUFEATURES),yes) $(call import-module,android/cpufeatures) endif endif # NDK_ROOT libwebp-1.4.0/autogen.sh0000755000014400001440000000004214606317060012050 0ustar #! /bin/sh -e exec autoreconf -fi libwebp-1.4.0/config.guess0000755000014400001440000014051214606317243012401 0ustar #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then LIBCABI=${LIBC}x32 fi fi GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; x86_64:Haiku:*:*) GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libwebp-1.4.0/NEWS0000644000014400001440000003373514606317060010565 0ustar - 4/12/2024: version 1.4.0 This is a binary compatible release. * API changes: - libwebpmux: WebPAnimEncoderSetChunk, WebPAnimEncoderGetChunk, WebPAnimEncoderDeleteChunk - libsharpyuv: SharpYuvOptionsInit, SharpYuvConvertWithOptions - extras: SharpYuvEstimate420Risk * further security related hardening in libwebp & examples * some minor optimizations in the lossless encoder * added WEBP_NODISCARD to report unused result warnings; enable with -DWEBP_ENABLE_NODISCARD=1 * improvements and corrections in webp-container-spec.txt and webp-lossless-bitstream-spec.txt (#611) * miscellaneous warning, bug & build fixes (#615, #619, #632, #635) - 9/13/2023: version 1.3.2 This is a binary compatible release. * security fix for lossless decoder (chromium: #1479274, CVE-2023-4863) - 6/23/2023: version 1.3.1 This is a binary compatible release. * security fixes for lossless encoder (#603, chromium: #1420107, #1455619, CVE-2023-1999) * improve error reporting through WebPPicture error codes * fix upsampling for RGB565 and RGBA4444 in NEON builds * img2webp: add -sharp_yuv & -near_lossless * Windows builds: - fix compatibility with clang-cl (#607) - improve Arm64 performance with cl.exe - add Arm64EC support * fix webp_js with emcc >= 3.1.27 (stack size change, #614) * CMake fixes (#592, #610, #612) * further updates to the container and lossless bitstream docs (#581, #611) - 12/16/2022: version 1.3.0 This is a binary compatible release. * add libsharpyuv, which exposes -sharp_yuv/config.use_sharp_yuv functionality to other libraries; libwebp now depends on this library * major updates to the container and lossless bitstream docs (#448, #546, #551) * miscellaneous warning, bug & build fixes (#576, #583, #584) - 8/4/2022: version 1.2.4 This is a binary compatible release. * restore CMake libwebpmux target name for compatibility with 1.2.2 (#575) * fix lossless crunch mode encoding with WEBP_REDUCE_SIZE (chromium: #1345547, #1345595, #1345772, #1345804) - 6/30/2022: version 1.2.3 This is a binary compatible release. * security fix for lossless encoder (#565, chromium:1313709) * improved progress granularity in WebPReportProgress() when using lossless * improved precision in Sharp YUV (-sharp_yuv) conversion * many corrections to webp-lossless-bitstream-spec.txt (#551) * crash/leak fixes on error/OOM and other bug fixes (#558, #563, #569, #573) - 1/11/2022: version 1.2.2 This is a binary compatible release. * webpmux: add "-set bgcolor A,R,G,B" * add ARM64 NEON support for MSVC builds (#539) * fix duplicate include error in Xcode when using multiple XCFrameworks in a project (#542) * doc updates and bug fixes (#538, #544, #548, #550) - 7/20/2021: version 1.2.1 This is a binary compatible release. * minor lossless encoder improvements and x86 color conversion speed up * add ARM64 simulator support to xcframeworkbuild.sh (#510) * further security related hardening in libwebp & examples (issues: #497, #508, #518) (chromium: #1196480, #1196773, #1196775, #1196777, #1196778, #1196850) (oss-fuzz: #28658, #28978) * toolchain updates and bug fixes (#498, #501, #502, #504, #505, #506, #509, #533) * use more inclusive language within the source (#507) - 12/23/2020: version 1.2.0 * API changes: - libwebp: encode.h: add a qmin / qmax range for quality factor (cwebp adds -qrange) * lossless encoder improvements * SIMD support for Wasm builds * add xcframeworkbuild.sh, supports Mac Catalyst builds * import fuzzers from oss-fuzz & chromium (#409) * webpmux: add an '-set loop ' option (#494) * toolchain updates and bug fixes (#449, #463, #470, #475, #477, #478, #479, #488, #491) - 12/18/2019: version 1.1.0 * API changes: - libwebp: WebPMalloc (issue #442) - extras: WebPUnmultiplyARGB * alpha decode fix (issue #439) * toolchain updates and bug fixes (chromium: #1026858, #1027136, #1027409, #1028620, #1028716, #995200) (oss-fuzz: #19430, #19447) - 7/4/2019: version 1.0.3 This is a binary compatible release. * resize fixes for Nx1 sizes and the addition of non-opaque alpha values for odd sizes (issues #418, #434) * lossless encode/decode performance improvements * lossy compression performance improvement at low quality levels with flat content (issue #432) * python swig files updated to support python 3 Tool updates: vwebp will now preserve the aspect ratio of images that exceed monitor resolution by scaling the image to fit (issue #433) - 1/14/2019: version 1.0.2 This is a binary compatible release. * (Windows) unicode file support in the tools (linux and mac already had support, issue #398) * lossless encoder speedups * lossy encoder speedup on ARM * lossless multi-threaded security fix (chromium:917029) - 11/2/2018: version 1.0.1 This is a binary compatible release. * lossless encoder speedups * big-endian fix for alpha decoding (issue #393) * gif2webp fix for loop count=65535 transcode (issue #382) * further security related hardening in libwebp & libwebpmux (issues #383, #385, #386, #387, #388, #391) (oss-fuzz #9099, #9100, #9105, #9106, #9111, #9112, #9119, #9123, #9170, #9178, #9179, #9183, #9186, #9191, #9364, #9417, #9496, #10349, #10423, #10634, #10700, #10838, #10922, #11021, #11088, #11152) * miscellaneous bug & build fixes (issues #381, #394, #396, #397, #400) - 4/2/2018: version 1.0.0 This is a binary compatible release. * lossy encoder improvements to avoid chroma shifts in various circumstances (issues #308, #340) * big-endian fixes for decode, RGBA import and WebPPictureDistortion Tool updates: gifwebp, anim_diff - default duration behavior (<= 10ms) changed to match web browsers, transcoding tools (issue #379) img2webp, webpmux - allow options to be passed in via a file (issue #355) - 11/24/2017: version 0.6.1 This is a binary compatible release. * lossless performance and compression improvements + a new 'cruncher' mode (-m 6 -q 100) * ARM performance improvements with clang (15-20% w/ndk r15c, issue #339) * webp-js: emscripten/webassembly based javascript decoder * miscellaneous bug & build fixes (issue #329, #332, #343, #353, #360, #361, #363) Tool updates / additions: added webpinfo - prints file format information (issue #330) gif2webp - loop behavior modified to match Chrome M63+ (crbug.com/649264); '-loop_compatibility' can be used for the old behavior - 1/26/2017: version 0.6.0 * lossless performance and compression improvements * miscellaneous performance improvements (SSE2, NEON, MSA) * webpmux gained a -duration option allowing for frame timing modification * new img2webp utility allowing a sequence of images to be converted to animated webp * API changes: - libwebp: WebPPictureSharpARGBToYUVA WebPPlaneDistortion - libwebpmux / gif2webp: WebPAnimEncoderOptions: kmax <= 0 now disables keyframes, kmax == 1 forces all keyframes. See mux.h and the gif2webp manpage for details. - 12/13/2016: version 0.5.2 This is a binary compatible release. This release covers CVE-2016-8888 and CVE-2016-9085. * further security related hardening in the tools; fixes to gif2webp/AnimEncoder (issues #310, #314, #316, #322), cwebp/libwebp (issue #312) * full libwebp (encoder & decoder) iOS framework; libwebpdecoder WebP.framework renamed to WebPDecoder.framework (issue #307) * CMake support for Android Studio (2.2) * miscellaneous build related fixes (issue #306, #313) * miscellaneous documentation improvements (issue #225) * minor lossy encoder fixes and improvements - 6/14/2016: version 0.5.1 This is a binary compatible release. * miscellaneous bug fixes (issues #280, #289) * reverted alpha plane encoding with color cache for compatibility with libwebp 0.4.0->0.4.3 (issues #291, #298) * lossless encoding performance improvements * memory reduction in both lossless encoding and decoding * force mux output to be in the extended format (VP8X) when undefined chunks are present (issue #294) * gradle, cmake build support * workaround for compiler bug causing 64-bit decode failures on android devices using clang-3.8 in the r11c NDK * various WebPAnimEncoder improvements - 12/17/2015: version 0.5.0 * miscellaneous bug & build fixes (issues #234, #258, #274, #275, #278) * encoder & decoder speed-ups on x86/ARM/MIPS for lossy & lossless - note! YUV->RGB conversion was sped-up, but the results will be slightly different from previous releases * various lossless encoder improvements * gif2webp improvements, -min_size option added * tools fully support input from stdin and output to stdout (issue #168) * New WebPAnimEncoder API for creating animations * New WebPAnimDecoder API for decoding animations * other API changes: - libwebp: WebPPictureSmartARGBToYUVA() (-pre 4 in cwebp) WebPConfig::exact (-exact in cwebp; -alpha_cleanup is now the default) WebPConfig::near_lossless (-near_lossless in cwebp) WebPFree() (free'ing webp allocated memory in other languages) WebPConfigLosslessPreset() WebPMemoryWriterClear() - libwebpdemux: removed experimental fragment related fields and functions - libwebpmux: WebPMuxSetCanvasSize() * new libwebpextras library with some uncommon import functions: WebPImportGray/WebPImportRGB565/WebPImportRGB4444 - 10/15/15: version 0.4.4 This is a binary compatible release. * rescaling out-of-bounds read fix (issue #254) * various build fixes and improvements (issues #253, #259, #262, #267, #268) * container documentation update * gif2webp transparency fix (issue #245) - 3/3/15: version 0.4.3 This is a binary compatible release. * Android / gcc / iOS / MSVS build fixes and improvements * lossless decode fix (issue #239 -- since 0.4.0) * documentation / vwebp updates for animation * multi-threading fix (issue #234) - 10/13/14: version 0.4.2 This is a binary compatible release. * Android / gcc build fixes * (Windows) fix reading from stdin and writing to stdout * gif2webp: miscellaneous fixes * fix 'alpha-leak' with lossy compression (issue #220) * the lossless bitstream spec has been amended to reflect the current code - 7/24/14: version 0.4.1 This is a binary compatible release. * AArch64 (arm64) & MIPS support/optimizations * NEON assembly additions: - ~25% faster lossy decode / encode (-m 4) - ~10% faster lossless decode - ~5-10% faster lossless encode (-m 3/4) * dwebp/vwebp can read from stdin * cwebp/gif2webp can write to stdout * cwebp can read webp files; useful if storing sources as webp lossless - 12/19/13: version 0.4.0 * improved gif2webp tool * numerous fixes, compression improvement and speed-up * dither option added to decoder (dwebp -dither 50 ...) * improved multi-threaded modes (-mt option) * improved filtering strength determination * New function: WebPMuxGetCanvasSize * BMP and TIFF format output added to 'dwebp' * Significant memory reduction for decoding lossy images with alpha. * Intertwined decoding of RGB and alpha for a shorter time-to-first-decoded-pixel. * WebPIterator has a new member 'has_alpha' denoting whether the frame contains transparency. * Container spec amended with new 'blending method' for animation. - 6/13/13: version 0.3.1 This is a binary compatible release. * Add incremental decoding support for images containing ALPH and ICCP chunks. * Python bindings via swig for the simple encode/decode interfaces similar to Java. - 3/20/13: version 0.3.0 This is a binary compatible release. * WebPINewRGB/WebPINewYUVA accept being passed a NULL output buffer and will perform auto-allocation. * default filter option is now '-strong -f 60' * encoding speed-up for lossy methods 3 to 6 * alpha encoding can be done in parallel to lossy using 'cwebp -mt ...' * color profile, metadata (XMP/EXIF) and animation support finalized in the container. * various NEON assembly additions Tool updates / additions: * gif2webp added * vwebp given color profile & animation support * cwebp can preserve color profile / metadata with '-metadata' - 10/30/12: version 0.2.1 * Various security related fixes * cwebp.exe: fix import errors on Windows XP * enable DLL builds for mingw targets - 8/3/12: version 0.2.0 * Add support for ARGB -> YUVA conversion for lossless decoder New functions: WebPINewYUVA, WebPIDecGetYUVA * Add stats for lossless and alpha encoding * Security related hardening: allocation and size checks * Add PAM output support to dwebp - 7/19/12: version 0.1.99 * This is a pre-release of 0.2.0, not an rc to allow for further incompatible changes based on user feedback. * Alpha channel encode/decode support. * Lossless encoder/decoder. * Add TIFF input support to cwebp. Incompatible changes: * The encode ABI has been modified to support alpha encoding. * Deprecated function WebPINew() has been removed. * Decode function signatures have changed to consistently use size_t over int/uint32_t. * decode_vp8.h is no longer installed system-wide. * cwebp will encode the alpha channel if present. - 9/19/11: version 0.1.3 * Advanced decoding APIs. * On-the-fly cropping and rescaling of images. * SSE2 instructions for decoding performance optimizations on x86 based platforms. * Support Multi-threaded decoding. * 40% improvement in Decoding performance. * Add support for RGB565, RGBA4444 & ARGB image colorspace. * Better handling of large picture encoding. - 3/25/11: version 0.1.2 * Incremental decoding: picture can be decoded byte-by-byte if needs be. * lot of bug-fixes, consolidation and stabilization - 2/23/11: initial release of version 0.1, with the new encoder - 9/30/10: initial release version with only the lightweight decoder libwebp-1.4.0/webp_js/0000755000014400001440000000000014606317060011504 5ustar libwebp-1.4.0/webp_js/README.md0000644000014400001440000000370014606317060012763 0ustar # WebP JavaScript decoder ``` __ __ ____ ____ ____ __ ____ / \\/ \ _ \ _ \ _ \ (__)/ __\ \ / __/ _ \ __/ _) \_ \ \__\__/_____/____/_/ /____/____/ ``` This file describes the compilation of libwebp into a JavaScript decoder using Emscripten and CMake. - install the Emscripten SDK following the procedure described at: https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended After installation, you should have some global variable positioned to the location of the SDK. In particular, $EMSDK should point to the top-level directory containing Emscripten tools. - configure the project 'WEBP_JS' with CMake using: ```shell cd webp_js && \ emcmake cmake -DWEBP_BUILD_WEBP_JS=ON ../ ``` - compile webp.js using 'emmake make'. - that's it! Upon completion, you should have the 'webp.js', 'webp.js.mem', 'webp_wasm.js' and 'webp_wasm.wasm' files generated. The callable JavaScript function is WebPToSDL(), which decodes a raw WebP bitstream into a canvas. See webp_js/index.html for a simple usage sample (see below for instructions). ## Demo HTML page The HTML page webp_js/index.html requires the built files 'webp.js' and 'webp.js.mem' to be copied to webp_js/. An HTTP server to serve the WebP image example is also needed. With Python, just run: ```shell cd webp_js && python3 -m http.server 8080 ``` and then navigate to http://localhost:8080 in your favorite browser. ## Web-Assembly (WASM) version: CMakeLists.txt is configured to build the WASM version when using the option WEBP_BUILD_WEBP_JS=ON. The compilation step will assemble the files 'webp_wasm.js' and 'webp_wasm.wasm' that you then need to copy to the webp_js/ directory. See webp_js/index_wasm.html for a simple demo page using the WASM version of the library. ## Caveats - First decoding using the library is usually slower, due to just-in-time compilation. libwebp-1.4.0/webp_js/index.html0000644000014400001440000000420514606317060013502 0ustar simple Javascript WebP decoding demo

WebP in JavaScript demo -

WebP decoder in JavaScript, using libwebp compiled with Emscripten.

Timing: N/A

Your browser does not support canvas libwebp-1.4.0/webp_js/index_wasm.html0000644000014400001440000000437114606317060014535 0ustar simple Javascript WebP decoding demo, using Web-Assembly (WASM)

WebP demo using Web-Assembly -

WASM version of the WebP decoder, using libwebp compiled with Emscripten.

Timing: N/A

Your browser does not support canvas libwebp-1.4.0/webp_js/test_webp_js.webp0000644000014400001440000502510614606317060015064 0ustar RIFF>*WEBPVP8L1*/ÿÇbXn$I$ æ;yþ0Uþ ŽÈœÚÃÑÿ hb¾7I8$!ÿ©ä½ À.ç Ÿ  ¼ÿ|¤Ðƒ.nBÛCO^uÁ_.-ý*÷¾£ì®¯þ|ÏhŒ×‹†¡ª´ø:UÝݽ þ¡Šü\‰úhªR®Rw×õÂßì®°ÊÝò¾$™¤þåz)ø½¤êîQ•ý²Wï@GìÛã;Jô‘¿úø<·½ø¨ÒQ^~¹rã¦ÎÌ8¶ÝU`@´³ö_y.*ú¨3£îé6Ù/¨.pAn3Œè¨R€W ½þÆçy^>Î^uÕ$»î€rú¡ã83*€ªÔ) üÁÏÍ·³I6Ë «‹«s8€a€ò*@T ˜Ÿº»>> ênò4Q™4&^QEP@Åáë(zøÎéÏ).«ú·M’H6qñuT”»œÃ ½é…Qn€àOGTW«Ù™¹¨¶É&\vf–( (àðŠrü¾Ô…¸>*t;É&Õ¶‰I²iæTò::jý1^(ž$aÕ™™ÝÝ$$´›6MŠÀÀ€¼k%Q#&»îáÝÇ¡avwÛYwc“¤=NRZœAoj‹hñ^ Mözo¡œI«ÕG­š$`Î9w7LîMs%I’B²† ¾·4{W¡ ¼œ( žÏ“©¶È[fKîm¢I n4rØ6¨‘Äm£®»º1©ðöµîºG[VÚ&ÅÝéÌó<Û¶GŽÍ]Ibv·îÆ$íª¹î®ñØÝ=f€ ’d·ëÓ¶iI›vh;÷±ÿÜR5z˜D“`6“¸ëåyöÔ$îîÚ¤3íL®·gwgw“¶K›;P†™îjÚœkÔ\5Éæ¾jâ™Ó«Fã&»›ÝÙ)$é&ÙÜÕJ–¤ÙKÛÎdšo7›îæ«1q7»««ÙMÒ¦G²÷î¡I$çæÞ?f:d/¦_“ì§¿UÝÝîiÎi›ëîêá™›Ðæk¹edýtnN5f7~Éãnv7Éÿþ¤n’L’=’4IŽlÖÄ4I:ŸšN|+’dÙ¶m[ÊøÿìOcÌK§Q© cȼ~„‡ÓÚ®IÒ¶mØí»Ãá´ §RH§RH¥W÷òÿÿžu/R¡PŽ$É‘$iÖzÝ. Ç?UGF3•nýÏ[ê*:Ôjµx­ô~úÃÿäÿÆ_üå׿üS­^'ªjWÔÔZR«,•Uûô~øá¿öËþðÇ×?¾þáoþðˇ/_Ç/_~øåˇÇã×~íùïÃñMûëo_ð×[¶¬=ž½êÓiO¯»îÛþkG‡w¸rÜá׎LJýÍ㵟ö-×{í--Gå߸YTêÚµô›·|¢W**Ôj[J¥¨«u­½NuW+4¡`@ P”€R! Q[êê:uk+/]{\9¤‡´ôi¾Zk¹ViYû¤Ò<×^yé;¼ö-—.½2ž­Üáxéõ®]i©ßŸöM×oíµO+•j?}쇟޷¼öÚ㓾TÚ묻uµJË'Ÿ§/`éÍ^zçÞ¸ŸîñÂÆ<P€©ÉÀ @ei? Œ¥¥•K<xæÇì Àèa?žÇÆØŸ[ÆŠ¢\¹ríÊ+W®Xj×Ö®ÜîÚkÛ¬u¨­ÕjT©Ô*ü#µ+uè‹ïwwÃΗ{>}<7ûòህJ`ìåùrc Œ1”JŒ ¸ÿƒq  CîÅËÂ^–ù6†<„=Áß@ 5 `¬¬\zm‹¢(¥ØÒ‚•+ÒÒ6c¥²²"¬iš³5ËXÛ‡û°À†cŒ7]Ð À¦ÉÐ¥1¾Œ±aƒ û“„Òø’,Ç=ÁrÏ XXº‡ sÆ8ÆcÎà`6 8€¿yûóø“à›oPZY[Z’J+‹ïx„±ÉÃ6{p5¼H¦ J,½°m⢥¥U •ÆÆÒÒÒv®ÆþvÀ²40ÖÆ1`ÃqiËê;Ëcž‹3äŽ=2ïfÒ^†aüß^88qÄ1€`ðmOžÇ·½xðâûáá'Á4ˆjžj@©$í›R„…B`¼Ã¶:WQZZ526]XÖ6Üßîá^Ž¡1ŽkÀiaaAÆ(AÆŒËÆXm Ó˜mm5 µ{PÆŽ=1 &u¡ p8 ø? °×³—øæ'ßüŸ¥I;¢°‡14 cM±Q" Á Tíi¼Ãt˺NëTÊ*-’ÝÊcÇ@ûÛAMdÆååCfd\q÷º3ñ^ÑMÓlî=[m&“í§½8€$Á‰P(X"L‚ùŒÁÃ6m´`<4( CSÔʲ®c÷š cD)ªE04M1jë,šQ9¹ªÆðeƒ/;ÁóåDÅnìÐL€Ÿ,Â苉ŠÍ§¼¬|«—f-ã³ñ6®œw±i‚ )°AÃHB¡ 9âág ¡ÀMQÉæŒ{mÍ®`#¡ÖE*E„&´kW³VUJ¹r©å‡_ßíeiWc@Ž$8ƒ ySXØ`05˜.cw¶‘‰Œ»WŒŒ6šÇâ‘0Gž,ì (‚ep8D”$˜€ X, ö8c 1Lµ]iš$µvá¯5öÈR¡ðKü”WŽÝ[´a ’0Æ"j®\IK ªÖ+fܺFAed2SMŠAªyòĪUkËh‘‘‘$ÀÝÐÜ(@ 1 H6܃6Ž=νžM¦ZDKMk±èÖРE­V©ùÒaG+•²Èbo„¿¹rËnîÊ•C3Ó,&aÕXZ 6mºp·°dµéŸŠ¤“•Úd$4”„J›ŠE— ###¨ªØ´Ñ¢E‹†0,Á‚ƒ Q*•J{miŒãžnÇã MpΙ¦iµZ Q*JhSQœ(;Hàµb-ó›~Ó÷áØ‡}¸‘È–NS†J$PE€°³mg "IR©¦E^ ­^£Îõ© ɨº¼Ëˆ0mÁbÄÆØ$P€AÉ&+D)RJÇfî\´Ä€s¦ZAƒ-L b2Á&4Ÿ|ºÍ–±o{@JKã7χÇ}´kÛûóî¿Jjm©œq¡r¨óÎaÿ9wwog·ìf'[¶R4ɵ¥½Y´÷œ³—í¦©QƒpÌX=ÆÑž Š æ@@¥ªhy›7¤r€dƒ5MQj&H>¹A ¡R‰Þô¦³¶Æ~š³ÇƒñáñJ|7îj§Ö–PÞ~®IÜŒ½qË)ï„öaÁoö[ Šn†`e ®Ú"‚×eà22Ê­*Um¢Ö;ƒ + Š@œhQdgjª>ò Ikg'¡„ˆZ(’$ÁÁEVE:ª!µ‹iÃHK_^j©¿}‡ãkKΕ•P‹‹[ŸÓî­{³´¯|ñeoœØùâ°ƒW^ÿóÁµØÙȉW$x€q§=£–†hiA¥ÒRUÕ&j}TóÎn£¡ %Œˆ@C´– mrK…ºÒjg%ÍÎUW,I®…ª"¢[¢]ºØ(‹>oÇñI®=.uÔ%]›ú:Û/v·?ìGws?ú^óáM kÎÚ¹è„ñ¶š¾—ÜÝM ó¼bLºz•Fµ6%©TkIehVc«‹nñaË ‹P0JBqšVP*µ`` \ûw¾r¥(ªTסýQ¿èªO}ê¨.œ@©<^z|ùøñç\xqÞÍKWs™½E}^×é:¯Ycms –6…¢¢Îµ§u«Ì'7c¸rcç¢Pî´S–êݶ¶ªÕ¨Ð¨ªR‹ˆò–‚ºp±‹‹³‹ýÈÙ;ÜéHR5Ul…Pœh!A°D­C'„ÑYgŽ* ë´RIëªC¿ð¿i鮊 ÍZ?ÿr|ixåÂíÞ[oX«IH66l‘Ú¥²v‚_ì—üÈY'nü ôIè¤\ñ&)²zÔ©ÔVD¡‡@±çH0‰³C8³xR hŒ-q<†[º (T*-MŠâ¤šP*a/€Vêj…(U¢Ï3Ú0T”¨BR"$pá.ÐÁ§’C¥4Õ¢´D„³È––v¥V«™¥V-µZ'õ`jKñKí¹r·/:GUí¥ÚXÛÎE_ùâ’&´ü$p क$ R©Ø­I*i ­Vs¢%Q‰èqWë°m"Õš•ˆB%j ]'QÓ*µ-›È=Gµ¶¢V+˜z×G}Ôú­ÛÛ/v·{Sç:úÇ®Å"xŸ{{S­—ŠT< 4j&‹E2”< E’ CšZBÛ‡Z-BC Ú €þGÿw‹Šêêt;saQj©E¡Ò¡ þOÓ" iµ†µ:8ª•ZšjÕj…B»*¹×úÚ}µ»]³sÔµºzíî¶ûÜÅóc†bu•R©?µ±i2i&«Ôjmµå Qk'¹°ÓÐRkihƒ†Z¥¥¥¥R«Õu¨Án×íb8²%+uÑVK­=÷|Vi+J¥Zm´b‡@Q*ZÚ îÛ޼“$­V«…WÍìI¾ÚŽÄØVÃV”‡Àá˰гN²-DÄеÖëõZëúu­õ÷ûëõúûøúßu]E0Ÿ@"O"‚*Ïù÷ëuÕD0óyrœs@œ ýnjj€žÁˆîFE„¹=øç²P%ú¦jÉbúéy‚ª»y'n@œ:çDFŒ›þÿû.¢7'tÀƒúèáù ³÷^]nêA’$Õ¶mÛ2óÈÖÇœkï}Su¨LÌT,¬üáì½æ½gx(mÛ€éeUnm;¶M’îy8qéÖã×GdFdV¢Ìvw}˶mÛ¶m|f«º¬¬´3ÃñF¼~ž÷á­K'ŽcŒÕÙË›µm×¶m²®Ûq¿‰Ú%- ÚªIࣴYV@íŒÿ¦Uï½Ï}õ%I’#Ù¶m‰¨ydÕ˜s®uÀø#sqƒî<àö î}½xßî½Öœ£*Ý41’dœ}OÛáv[Ûb¹±ô¡­ë~"bS‚Rb[f»\å:§°™™™™¹û[î—™™ùmæ> Ål™d”,Vò†ˆxžk ï²Ê·$I–$I¶EÄbî‘YÕ·µï—ÿÿºûÞ=]™áf*ìÙ¶mÙ‘$IZkß÷"&QuºüÿŸ·^|EôêRÕX„ˆ¼{v8 m¥m°3«Æ4YfÕôp–$Ûµ%I’ÈÚçÜûž™9*Œ1Ö¬gMýÙ¸g5oŒq'Œ¨föìÝ{Ï^JôöyY¿à[$K’$Éd‹ì¹Ïÿé­3TÈ“$ɲmK’DÄë¼÷U-êùOÒËPÕÿî Xì¶m˜n;‰ àá¡è×ÿ€¦mÛ‘¾¬áé9—±Íc\û¾<ÄI±ËÝUÝŸmû7Ûl£¬8yIžß»¾÷XÛZ^k®é9‡>ø²mÛµm»uJ­­÷1×Úûœ PÞ+úò \Ï*6úó^ “¥!/Ã>¸çì½æ½µê˶mÕ¶mÉ©Ðús®µ÷9ç3Iúf–ÌL'f K.7é‘™ "ÀÌdðî={¯µæ½µ½ð("In,sdF2C1Wuw5ó@ƒ4bY¶l™×o½pû–÷övoñí[3Ë–,–†¹§«‹¹’ƒÞÝ7øɵm¹u""³Æs®µ÷>§»šëå¥'ïHíòº'}—>GOþh”÷Þ{颻ÏÙ{­5çU™á[ÛnÕ¶íÈùÿ¿”R[k½1çZ[RDdší#fJ)¤PÈŒg¾:b¶¯…íÁÖf…œ`æ4;HÒ¦5ç£÷Öj-¥„ ¶‘Žþµà]Õ¶Ûh*†ÅÜsQ’eÇv‡ÓÝß033ã;Ì{Ì_fffž4„L²¤« ‡7..®¦'ð`Û¶lÛvÛ´Öçy´ó¤p®"â²Òå MñîY£ù’$É‘lÛ¶DÔ÷¾÷DDÕ ˜9ŠYc.å÷23g)ËÁ”hnfª*"ïÝ{ÎÞkØVâVtKÓÆ±‚€Kú×ñÙ¶jÛ¶m¥\Jm½1a33æÅOøØáˆpt8’N˜Ï‰;"0lfØZ«µd³ÝkïcLÀ·$I–$I¶E$êÑ÷îÿÿÈ{÷LV¸©oA’,I’$ Õ³çúÿ¿z«4¡pI’!õÛÖxùÞ€6µm’äq­µ¶/Þ~Œ÷ypd(3Ëhm~´g>á»mÏ´»«jÊ™Y©`FÄk=~nß×}éxk <ضíÚ¶Ý8­õ±Ö>÷½ÿRÞ+^ÄHÊeI9³)ÞK$ðÿ{÷ì½æèdÛVmÛ’V[ïc®µ÷9÷>÷ÏÊ F¸eˆ%Ib)àA€0LAîïÝ{ÎÙ{Í1z‹jø¶mÛn#ɶZs u13wôˆµï×ÿÿ¤ûÞy‰ôp3I$0ç½Í×/ø–$É’$ɶˆDÍ£ú²îëÿ¿rfÖª 7ò-I’%I’m±¨ydÿÿ¯Î¥#ÜT8$A’ÛFw÷¼¡ØxûH‘$I¶„TÕÀ) #±°««§q§ιÌÌø|¿àþÑ}>÷i™†gš “3ÐÑ@UEäÂOx’$I’mÛ’ˆXÔÖÚçÞû¢ŽáüêAŒ9zuÄd¢‘ùÞ=g/7ö I’#ɶm©¨ZDV÷Zçœû&tÁ¡÷†õñÿƒzè  ¦ñ1Æ÷î½VWf¸i¨MÛ€yÃNÙ5oû¤H’$Ïë÷U3wÊŒ¬„Êj*fffæÓ23Ão{ãÝ333csO3wgAbDx¸»™©ŠÈóìÇÚ¶UÛ¶$©µ¾ö}†*™³»Vd$› äüßÙk4ß’$Y’$Ù‹šGä­¯3ó=óoó³÷Kß2+ÂÝ„C‘ÛFJo£yÓ‚¼ hÚ¶%É«žÖò^kóøœëg„‘‘®êÎlÛ¶~€>Ú¶;ˆtè½ï½ë{¼ÏöÞËkƒ¾lÛ–mÛm¤Öú˜ûÜ@æqœ I¾÷ ÊýÛ³cn$X¢""¢äqjÌDàݽ×݃$IŽ$Û¶¥ÀÜ#«º×Úûœñ 2Æx³×ê®Ê7ÓŽÛÿ«¶Ý¶݀ɸ˜7Óa–ÎK¶dfÇá6u7í½·Ü^ffHÊ&'³eYLGG‡a3ï½æšk2Œ1žçÚ‰Ù¶eÛv©÷1×¹ï#¡’HJ£”T©ˆ @i™"àIirw’ÿ¿wÎ^sxÉ‘$ÛŽDDÕÌ="³ª»Ï9|7ô'Àºœçìæoø 8_Ïœ¾wOw‘̈p3U Œ$Ú{ÛþÕ1lëq$IÒô}DTÍÌ="³ØÏ†ó™ýo…sN³23ÜÝÌTEøÎI÷êÞ‚oA’,I’$ -f¯ÿÿ³•®B¾%I²$I²-"fõêûÿ?õr.&nIr”ðnÍÍÞ̉‡kÛ–mo[{mßü0½Ìßû1Š%K²eb '…@æ\ÌÌÌ«ŒigÚ4mŽÇ$‹Yú˜ßïe|o¼pŒ•v._¶mÛ¶ÝFRk}Ì}î%e¥x‚ìA¢Ü=Ua”,Y!Td&¾üMâî½æè¾lÛvmÛnZjk}̹Ö>û\˜ç­¼ ‚åð(' #ýz‘÷ åc //ÑÀÜsÎÞkÍÑ{«¡†m#E·âv÷Ì ’$Ûú¾ÂŽŒ´UY6ڞƘ«Y{Ͻ÷ÜwõlóøwϹÇgñì°g¦ªê²3+m†ïƒ/’$I’$é ±˜yDFmßs”žÊ¥·;ÕáÙû™¦–Ì™¹KUo‘î¦"„ž@r$I’%"bQ53ˆÌªê‡Ámû xoû+ƒy݃ßà`Œwïð†áÌvweeD¸»™ª 3…Ú¶m˜'l§—±°oßóuä+S¡}ý÷þÒú}|•j`B¤(qP61$Òƒ¦ ¸Ã¸ ‹ˆF" Bœè#8Ò€(‚ˆ`´¥‘DzÉ´HˆlQ Aš€@€`‹ xçž@¢‚*@ *¨¨¨Ð® *P€€8 ¤ ¬Á²¹T¦` àx|† 8mG Œ2Y³³fgd 63™ ' €Ù €‰dmZn´ ѯ‰Y={õ½œ ìqßïûvûÏ?óûGÿ%Ë{LÀ⌤[í““ôn¼31F˜ÄA @¢’žª Ë E•¥¨ 1DîÈ$Ôâ‚‹êâÖ` zÑ ­ªDA—•h•$Î3½«+z- X,AP† LÐЀ €‚ Œ0âB (šPM'xà ŒyÀB‚ˆaÄÑ2€»Yˈ50Ó »±£` Ð#¼Hˆ. ™à Š))¡2¨“ìÚHcÖïlBB&ƒ1VT`„€€d0z©Ì.%Ä‚x'­2$XeÑ ŽtÈ"AÅ Qذ4¢áAÜÒ€¡f„)0€É˜ Öˆêd(``‹“K€´ ä݉eÀˆ @1”«lÖã€<5R» 5V@²b)„+Tƒ1X°`m@uVFŠÂ–’@S(Ähˆ€¢»@ƒ` TP(x¿?#„‚ÂåÈ@E€s¿ÿ=ЃG-Z<,B+I‚žø Â>Œœ¢¥e<…tþ¶Ÿ»ö| 0cp@ÃÙ~XÆÉÛå¶™ÿÿÔnyVo;…í—±Ûg„¾ <¨Ú©·˜B½¸–åèÁZ`T˜6í¡@bâc‚Þæ[HSTÄÆº)s#» ?ó~ú_/ŸíÀlTù#jïu}‡b–Ëš­»ã·ëÞÏý÷Ÿ(hkõƤj P´!©XOtAp­?¬±zv@ú°B`৯ÿú½~¾â®rPNv±²-œ’@‹T’¬%-ûWÝTQÊû뿾??å  ™2åÄÁ —Ô¹Þ#éÔ[r‰y†$îk}E„­P£j&&ÜE=S“.°0ÿà·s®œCá°•®]¡×îS»‹ã‰gpK.: 8Ù+õضfÊj=ÚÀ£ÛŒ$®-Ö8ùÛiø• RHxóïaý¶Õ—ñuÞþUW…ˆRà³Û'¯ó»“Qž³ƒ–c¬â ×,õ’%‡Ë¸àMê×xŽ_sGµ6 (€B¸ ”0ÚT! `'âÏÿ~?ýõl¼ü¶“oô;qCx´í¨Ä{‰RP5€j…š°RkP°Äª…n~&GN€ƒçc;üóSÿã?—³–èʾ»‡1ïÏüu~øÞËêGëåÿýWþÏ/@bø¼¾@äg~²\ôEÇÌ`:xd´pÍ èBÈúˆÄ …‚ 2@!Z¡¡Pׄ„<ª %B ^XHk! P Bt¶Ï¶Q«'­ ªQ‚ µú(.®,*ŒD„BP(JTQŒd©¥À¡^µb=ñŒ’D -!  Œ`‰ÒX*0ÀµÚ##[ª•kAIáÂRX!E´ 6  uÒð’M¥£(SŽ\%°«‰õœ_'+„J'èR0A'mø"Ì–é Áè„Cp”ºC XÉ4±á`ôfù@©C €å0­{ À½XJ˜°vÞwtžæ˜#ŒbmŒü“_L,鈀NÏ!CLIR”éd‚T k „(¡wR‚‘!#±Ö¥è7ïþ,ímÌ¡1ȃړ/„èÓ‘Ì/”÷B8"E.нº7­ñißÁ»’ZX·1˜Ù³c›èÞ]6 d3³m›C¢'9rp±ë½‡ajï/"™dåრ“iå«™0LŸ4^)VËôä0 ÁÉ âjÆ@š3 mùègSèKß:üçåôÑÈM™&I091Ÿ5kq îØ¯oÈGÍ:ð&Œ©â‚ Dõý „у^ˆa´ G#H4#` 5 * ^¨b¡©$€ÝìFÅ *¨²ƒÈ bM ˆÉ;÷@Y*XŒÐ£„*!€„ 2ï#2ÔµZ~¿'B,¨`P±Œ T0¨40d–XAT„((VÖY£AaE  €„Ñ;@‚ÂÂ@F€tF|³e ­€Ô( @T¬F"e¤ë½‹,Ȳ 5FdFÄŒšÁš„ „jË;°GZ FD‹U@±XP,Z¬Â•xÙh‹@©ˆa™>”eò€ Ô €Ë„ÅBAÀ¢jQEU @ÁÚ¨­jA €?¬&4¨qý&P©bHðT€Ä£¶žXC}ˆ_ê“åçûSËtœÌòõçS¹žv{}õÏæ4œ¹?·¿{üM;ûé‡~÷þWãö6Ï=Öï]Ï3p_ê«7µj… 1Fƒƒ$|±Ægúkîg/QÔÐLÍíÇñrï¶÷éX’Þ´~å•F«a9ĨÔÊÏýòßö¯ÿв•õ]]9ØËI§—¶ãfß÷¿ÆNœñ·õ¶ iÂ…° ߫ՊUj±©‘Vœ«f@‰¨qöÁ "1«Ï!­-³¶86íȶß|Ü%å)tº˜J[ë[}yö¯ÿP^Û6¶ „ïõnU>ä®S.ìkšü#&Ú¹ç¬ù3eT¦Np̽M×Ä]!¼Ÿ=Ÿ<ô6°REJuî¤eìw¦Gë?LèÊT»wm ”ÜäžzR¾Ï!LX•Ò)I;i™ 5ÖŒÄåäoÂ|Q°:àÆLÛ™vsk?ÞïÌýçß1*tqzD0Ì«Ùu _ßh€õÄN]¢8½ÍÛL— Bjfløª€åR±$*`=Š"r@]ô4@µ(P€QVGÏ?ÛÇÍüûß®GTijËrê•+JX@Âð p="Ö¸5 -GNëʶ MFþ‘SäŸÿñø~Øåœsʹ1Mf‰;0ÿóù}0 ; AÀF!& €DÌDÖ¢Lœ0‘  FÀXj&¤…c]ÒÚ¢r 0P@…PSNC¤l G¦¡që*å Q‚5 ÄàEW«‹7µTe-,(q1D¶H46 Ô^M5Æ in-–£Ò‰¨ B!5@!b”¤§’T­( X,ÁöÔ”Åh4 ŒP#A: À¤P)@©)­¢F#aqm¼8à{+ª°Øx­âÔj0Ú˜ØÀ´!l;šÀµƒ‰ŠÕ³-á–Âï%’%p°A„H"rÕÃäL‘# ø —Ÿ¹êÁ ³!AömÍr:пw([BPln¤ azˆGQ¸9k,ÍÜ•ÐàÒ{ P¡b$5„L˜dà ²+Å’ )g 9ß}A˜@!ì`<ðû{ó ·±¡ÄE5>=ô’!®¥AH†ƒ ƒ„°[øJ¸@˜Ô¢¶¼Ý"ãˆ9Drã¶v»áŽg|È)Hä˜#©ÁLSB|{äi‘IðÁ¨GÀü䬿1¢¥ ’¬†#«P“à”¤H'Òœ„3Ô:Øá9{kæ0LŸ£ ÚõfHVrbÒA2#1·ÃørR. ‰F³·X6ÈÆÆûÒ1ûÍ}Ž[Ó­­³ßŽæûÃLú~eãLR5ÆðððLzùC¸„<ÜÈ bdë 0zö{“ñ²3$<½Á€wÅÜ(¾ÓÊ*’L !µ¤@€b2Èô,˜5 s8Ôž 0–1¸Çˆ-*67VI˜šæÂiÎz¡å`ت3cd/èæ¬ éÊÈ1Â] h0Ñ QUR1hTÜBA»  T²²ø6 €… +4Üp­-®( TÄ0Ú1dh4Ñ’ME d$üKïrð¼a~ïØÝýñØ{½£™ÆŸš jl£~Òú9‘ 0x0j’”&ùéÉòI&ôIXÎÀ ŠP¨(E¢DcŒ‰‰4Z`SÖžôµ¬XX\\…,ª#%n)FYDi(i€D$ |C„€¸ˆ )À,€ € *ŒÐ`ÀOpÄ8P±b„†hÂhF¥©wžÇ’ÝÑ(¬PDä®e¢P@€Ñ6# +Ô L€€ „PÆh‘}·í² QÐ"ha " ˆ @ÀŠ„lB@U¾P±€ BÝ„Y\¨pœ¡{@PŒl;¨ ¨!£|¹‹7\¡Ù‰8ì’ú(ªÌ€%ƒ5  ‘ÍZÐŒ @#ˆVŒ€ >¬DHX¡¨ŒDX€€Þe‰ÀŠ *@Ö°‚jdà€ŒP‡pPµ¿,XT0±,V@e%Á•þ¬T `XP€R +éiC\@®cÓKÕ°« ¥€6€|ÐX Àcé*,F±ËOê«©!¤‘´6€`@OÎÑxdvú'u–ï]ðòÓðšŽ9Å›ulÏÚ¹=îg^ªûÓ¿âÙÛoÖ$Ûc[ûôâAèunU sñš4ŒW_K½8Œ5÷2øL̪ÎÉÅúÜF8˜‹ ³bÑ÷?Î;Fµmì›ùÎ}‘ÆÜ6½L”5ô‡8ïë¿oÿÇŸ6UZióu^Õ0BN£÷³·š·j¾3G퉦brîë;d]+¢$«QoKEŒšeÖ£ / Œ.К €jµ°@Âð8O@VÚ¨$¦QÕi ãöBMl°Á"R¥êåó~ùë.Ù«©n„ôÐá°1~¸é4é_êÂÛËW¸å@×Ê «’m9c=ÈU•ïûÍ¿²as;5k±öf@>lÕ%2ºÞÙ}—›BÍ„QÓ® ¬¨Ò?·–%IŽ0•Ïã6¼¯þL:`,7¶؆FÓ·'k÷xænw˜3&½x7·û6_ó=~‡M%×BƒÕÏ´y/(4ÆËx§ × 9Lŵ5†ñª+ª €a €@a@Œ©Šõ#6(T‹›+‰S©(GŒNns¤¢ÖZü¥ˆW/^MLXŒ¦…P 1ÒÑjÔ$fclcõ(a•Å Q@ 976ôq|¶PÀ }¸F@ÀÆøˆ= 6¦$Ô ,N£Õh5°šBQDê*ªŒ'Fp°@+hu–1ºaë‹ÓÆÄx–V!.Ɉ}T—EÊ”?‰õ=ÞËt&QŽÐ'H˜ :I ½€—H.¥ d/3IcÊ$´” cfZ~$j¯¼½ý%OHGñ|"ÂM~¼ê ñ»‚+¿grÖbç5Ö"T&JJrð œ( ÊäØ)S2%7‰Ú!€€ @µ`X⥆»…‰éM{m@f³¼¡‰£™ü¸}BèCÆðõÕ?y’àÀ²h(Ò˜ÐRã“«MÇÆÂ{¿òaVpDÛ‡ÝÇ>_\ŽÇe‘T6EóÏÑ ¡ûIÏ™À-‰øbðHh!g~úàÁ PZ-É‚€w,$h@æ'éâ(!÷B’ŒߥTvš(Ë‘3'hË z,û+é :zeV†³Ïf2²Z"é” iXFèd1²—L2œ¼+rõÑ‘¿ }Æ›½Þ¦ã[·\ ÞYÞ¸çV—N#õd½/GIB"Á øè^2Ìp¦¥ñ$™z%îr83xšœdoFã]’­•E‚áTà@~ä>Í.‡{ *BPó´Ø;ŒâЈ‘#ª†«P $æÒÙj:|¥eBÁépKº‡$jÙypÖ¡ ¢ Õ ¢¢ªTAP, +…B%†•6Ú@аp… Fë F Œ4, ¤Ä´°‰ŒŠz°AP‰ BB @j¬¶÷›ÆkÞ&ÏÇLúWgگȣ7§§ïâfr¶ ሠѤª­óY«S7F%+fÞM=TÖçÝ4q~ÕÐC½÷ûXß)ÅvxvêqíK’ÊG )€C*€Ä2f‘L,P‰„EP@B$€$©"€a¤±¶¡â %@ H¡ ia $!B"„2ï5ѨŠ€Â ™ÎmEël¿ŸÊÀ¢b}ðPm\Y»šKU`‰YVP*ò€€KnEƒAü•0 Î ÞUæàbñôßOŒè)Œ#ê'èçñ<þ6çÍG~Hÿ/Âð/ßâçõåóø^Ïüu¡ôzÚæÊ¾fY"^ðÁŽš1´z„ ’p•ÕàW¥PÊ”T4ViÂ6Ò°©E`q(µ€ªÁBqãJU±¸9Y´ šŠ@(Á(õ*É-I€TŒ@€Ð2M €À….˜ÐNxBà @ h¤0 PÙ%hßË ÕnùG0²@@¬É aE0ª‡3Ê¢F„€UF`!Í€C£   ˆ@ˆ… (£©µ&@ä0@  ª‘ÕD%#³wë?ÐnX=ˆ-tÈldž]hhë]xÄÀ(SÉ`+#Q „á` 02ÀÃ`+Ãhj Yþ² aÅðΚL Ÿ4#ªìn€Œ°C•ÉoTvÑÊÀQ#RŒÁd¸±ä5´1á ÇÁ @Y&Áãj:®ˆh–ý%X²N@ðX|>€ð„Ç¢ŽV-€ñ°(¾K ß@˜œÂúi‘˜]:m„¡¦­ ±hdF×…íÃz|ú‡éu¹V4²#RÀ9@c©õÿa©#ßõRLüƒö\§XŸ›(²²ÅÛfj¢‰Òá_f:û°;×¶1^øçûùÇæ+k››ÝD~k{³\c½ÕýÌ,>YÈí?ÔÙ¿ýÕ!¹gßÎ’›*¾ŽÚÑ ÉÅÄÇàbŒPƒüv:ˆIw[fÔU# °*ó¨%F”Å hCX ÔÌÃdÁZ(ê‰Á[m•¥F‰-ÄÐå‚x›]Ÿ{9ͤÕã¢í6!eLrbm¹:OæÎ½ó÷\»s@c ·æŸ-K:wÈ «gj“WmrÑ$2 \™åQR–j‘qÍí$¹êŽï66™¼ÇV[ˆN›{móÍÅ“u¼[›(0EæÊ7¬Þ©6F%­mŽ^gò%® ê' Ô` 2ò[5€’E…{C—YMbÐ4$@V{Xê’î2®ºlýöÿ|â €8æ€-õ-ºxbT²`Ùµ€V€Õ ¬§=ÒúpåØ  þ àìæÙäXJ­ŒK_ì’Œu]jDøö@Bå¬aäg’ÁD¹4Þ|¹‚³Êì8i®êŽ$+™A`, (¡ç~A@a+´$ "î ýŒDT°1Û‡ö”CØ ¯ °=úmÖY¹1êZÊbp!Í”PQˆ·VTZ‚ 1ˇ>ÛlœÂÆQF#…UA6Pƒ‘°ž†®›ó=Ï”V­,žk XTV¦`, :-ÈŦ,â0ØÎkµŒ*s*,f¥¬)P,Y ¥Pذ¬€7&`úô€ßEcXMõ{<ê‡uÞé’XÈØúhnŸ ¨Ð…ÆZY}åÒ'ywÞ>À¤d$Á›[1ÁIøl$1G"WF2vV5Å × ér€·?Ó'[TôQ¥±>¢[ŠØPDU q5hÚŸeÚgC<²ˆ"RT£@÷ÖN®c!…"B+i4  "LF®¶ÍêŸöCãm– `a-äÃAðÔh T$ˆ°rq’&…6„ÁðP£@bŠZYŒ&¤K©ÃY#Jµª…„P ´BÁ}Ðb„DW`D(à3žH…,#e@´@ (hPZçMãC8‡dº¥-Q*!HÁZ+¨Òðr$|_Žú–à OÓÙ¤ô|Òq’pü4©:©¥™çFsà„DbY¹‚ˆôå\, K[x )ì(©5^F=[-·º x„ X äH A ] €z[:͇ݼÛ^ëÀ³ýÀo#÷>¸!Õb¶mÍÌüezý–F¬Ý @}ñˆ„ÏD"Èå–‚Ž ÅLÀš)$Æ*ÂÀ7PNÍš qˆ^6 2Nê¬ô€oYìrrt&²#](£ œ"'#ƒÒ9è|"'ƒ“k¹ÎÆÊo%ÖŒí<|DnŽd¸ÌŽAàHJp‚z€ü”Åñdºeà†?Q`ºÙr$0&9’ÐÏ~Àô2 ² +px¨ ­-€@Í“òK*O¦û®YaËF挣ßíñÄ™¦²‡îr^fËÔ} Gކ`{Üyùííý¼ô¾À™{üýoß>ýÉ|WêB˜h@ål¡•IL @$ ˆ¬¨0!Ê8Ò „€H‘!C„€€"(HhÕÎdŸe­è]§bæÎ–=bg4¯F*GC_ºa™PQ€Áb¢ˆ* TDe‰¡5Ê Ft%]ïÜŽ-EUu ‡[àöóþ2ý˜>™ÞÇàªG­æ‹Q÷™Ïǽ%^Ól<Ê~½íÖ &Ntîzxa/çŠZÜV$縼Ýçà4kXKÂúÖ§>ÃåÜœy—ÊUäoÆýWo½”Á8IJ8ã­’ r"T ‹ÀM—°zîúû….3ÃŽÁÀºG5uÍMeá\";ÌÇËÙŸÎ빓L£fv7Nà =/ì¡ïÄ̵¢‰8~­ «ÀF+©âÅ2,»&‰Ý™»ùþðUzºÁhª°X L9÷r6Ìau¸ž÷â̿9^}ãX¦Ø:Õé2”Ϳߑ1*ŒPL@R,€€¼»æÎi¬…X&î=…†r2cHW÷p/sB˜#rÀd`±TXÀpf¥%Y‘ s;ÑNC!ª0 €JX…UEUxUƒ'ž(aJ ME£õš”QbA(j¨À…H…hXŸhÚÝuîÅÖïsÇ£ƒÐâ ài ûƒ(,SØ(€Ð 2 …¢5 (QJX P¹º),ã$JÕVZƨ-ÕÄÁ–õ|ÀCªÀ€…€Bð`Ïó¨R@++Äzƒ1 DPØšhb#ëƒ^ë(´‚6¢3$‚ÁðèL0!-cyy“&hbHGÊe"˜TÅ8*¸ƒ…¡d&„Å/@0„ Öƒ ÒÉp· ’w2FÈ“…/Á^ ‡›.Çi@žì dx"4Õ"†‡JD§Ó|2ä S¬“N—À$l! Á)-dð$ŽÉ€AG:! ”¤à€¼³­}}ÃÂäÛ¯·lLf* ­£ É †BcÓæf‚Zš~>úó©vïß?nûv½IŽ$ŽÅ'¥A¢%ÒcP®X@tZ›ëH‘„A¼¯Làò8ì’}&d@ÊÑ™ÇrP⊦3 ß$‘S ØŒlL@‚m†“p–¹%›)âiJ¨ˆˆ ¦-–™8-ØèLÚcNxc¬…’"\6Ä$Ùj£1r$ÜHáæI7H NJªe” žS©ÉZžnB²†p‹³&À!ùö ¡XE&¨)]r„ŽPTJML x-  ’YÙ@£ÌÁ *T¨åFF`H¶@'… &(0 ´ÅƒÆ¡^Ϩ’"Ëhš¢ÂBÀÕ©×­s$`%DƇÈîòÇÍpJãÔctÎÄ*Äô¤¢@ˆfv§–è(Ü'‘—d†co5v/âÌ3ØfÌû°´›¢zŽ=q˜—wê÷å׿ñð~ŽßÿñÍjSëyýc£|‘õÆøƒó\ËùÝC»Ã~ÈRKÓÕjóŒïc.ø‰á÷æ+$ ‚PöH »ù3ZõWß|ðJ²Þ䆨“¬Y&φ*£>Ö~˜6  ðB*ZdD¥¨bTœ°Ä§¥510* N tÇGJ!™q£ÆQ+”¨jJ–R‘´„Âe¦]ÑH.gì‹ÜŒ¢ ³‘ €TFÃxO DDA!x÷H*€lt~¶ÂM€ ôÈA@M5`2¨ (¨ ¸@H2UoR ,dP3(GâÐÊp›lA(Š É.’wpÑE@€4€£ 1„)2z €ˆ € Æ<.(Ô2$Y·? +*TíÎ4€0ɨP¬v)€Ìù ¼2­(A@$ @@6„F!{l1<ÐN€ k  ©/M #¿c 1¬h*d1¡†À¨5*€ )€U¨†åè˜@—gˆ-`b€B¨Õ€R©Š­)£^3ú™xSÚþT¿ÿµ¸Q$y̯à.ƒ»âYÊ5ÜJŒD’"òUýÿmÑÿµ}ôÇŹõçž À(QTZ‡Þ ds÷è„&…UÚîiyÂ9ØYm ^·€ ]@,Ï?÷é__£Å ¦Å¢æM­ËZSÕ3Sæ­ÿ<M-J‹ÇÓaôXNxWïó9·f›³—ÙO²»ÞvØxãçâö9]^ç–÷`ÀN NR×zSÅÍÜ—Ï>}úÜü£®ÇÃ2WÌï˺g¡[oŸÆ‘ÁÛÌ-‹È¡7XzŒ·WR’Ä$_âØ¦Ÿ¼‡þx뻾¾íÔ;‰ó­76²Íežã«•M¼Wiƒ à¹ÕEª±úÓíÓÕ›šÆ[kш‹ȸpVC<Ù,ç& úk—§Ë½W¤9»ë¥ÈæÊ ŽïðK.£è»lÜ€f´ÂS6j9€„n-:ð©ÓÛ,B[¬mÿÌ1ø6Þ0 Ý ¥°![ÄD—@ôÜÐZ±PP"g¤‰ðü VgÆHJ±Ž…Ä-A™cy…ê¯ áVðîÉä TJAxò·‚` (Î6Â)N¹&<±Èåªé¹;=Ë‹‘l&’Äx=ocv<ñÃeïÕý:þ¢O¼¼5A3lLù&+ÖVËйv5’ø`Ë8d>ýúëþç§ó²wÛ~¿þ¶7_Ž4˜¬Å¥Û;¶Ûô ’!0 "ß…Éxà|yVÚò‰v¹aÈdÍ8Ø 4€  –\Ü*Hœ;`Ó\-y. ¸mBÆäx¶DÊ™J9Iá`þeñÕdkñ®MŒ%PYo"ß&e'Ä@r¯¡ÀA˜tA bËêK0à$¤†½[÷] WžaH!œfɦ!! 鬗€ˆ¬y’ÛL€ä;i%*¤¡pE‚d W& £êD €P2BŽWD“QÞ`ÐÒ(“9#½W†Q›<€†¡½áÌ3$ÝÃó”l ¨Œ|y DÚ¬ÃÝŽ¼Çùf³yŠë;}>—=}×4[©ÿdóèé©kž”7dr„ DÊžM4tà>®U]ÔÛœ>×]h÷8*pGydgyp{¯õ…åd%«kÜç«Ø6ûo·Ë«û—ÛsÄ÷5ÿ£ÿÀßìVÕUä¤8܆)(F‘€_.ß#/TÄ0" ˆ%vz´hX¡ MÕ(³‚ £Ó(EÕÕüª˜(Ä¢HMAS(J‰JUŽÝŽg € ²€ªdiŠ `%‹{–<§3VØœ#ƒÉ8ô` „@Ç1æncf=2Y!ÀdfâDGC<ÛÞñˆÏã9³3_YÊ{lç—=CPÞ1T£(»ªã#ž“ „@eCã T¨ ®€¨"á!…ÂAÅ:eúë‹î6Õ3±1V¡'?¢ÕJl`GZ£pDC$ h•L@¨È~…Ó 5Ñ\©ZeêȘH[4hÃR@¦Q6Фç0Ó ƒÖÔPB5/21ˆ£LLT@@g$?#Æ´Ä@Å“ŒÂÄŠeÔ°@hW» T™6É@£( TT´2j$Ã’‰kd”m0 ƒà Nsô1b‹ÊXgÅ €h`Ö&‚0@¨ÑDÂÀ@²Â²ÁP–¶Ì"Ë8˜Æ)Z¬¨bêhȨ•"%H"»\š.pqv²åŒºâ,ÇòcÒ?SUi¥åP>Îþ}äß ­h\¦ÝÅÅÑ‚õŸ×ø_Ö|ʧ…ÔvÑ›ïsqCI­;ˆè 5+Q^WÎáâM÷M^¼a8*M,FV# »6 `5lŸ}ùÇ[2¤Â ɉÞÔcû¹mº–0yÚW\KýéñûÜù—¡¶¼-âêÕ£ ž§5©Ã0š¾pÿäXÇq÷¾×Ÿêf/Þé»’áܨ¢lØÙ¿ëWûÔV?¿üsîÛå·ËÍc,½Dƒ4 ßd™1€g:…‚­66Ø~hY²F¡—Q|åšù“I„¦¦á¶@“ÆYÚ¾÷‚‡–èî”—ŸLDï=t”z 5)„Ì¥œÔ¨÷ÖLÅFRžLxwJ}!E’™èmbiÆaf,YC¾LÚ0é5ŸZ†<¶±›¼õMN§+&Ün‹ŒÛû;ùo°öð‡f—2oAÈ)CI"`¡Ö‡ wƒÑéR[\© ÀÆ'ÁÕ¼Oíü$h,°F™‹“æ´‚*lK7uk-,nN/f­GÊ€ê®QáŠ0Jj@ÜÚå¨OÆ MüR"´RFÆBmlB´jWˆhUÕ®JØ0Z€XA,ÖhQ+PXQ]`°ïRרžÀ£ˆ¶Z”£l Š,¨Ð` §yRX•R#*¡ˆ¡@ X”jQÚr@¬ôi~s®ðJ&å+ð\AöO€x™ádrz’HOB’&wÀ„çq¬ýY ²bÒ˜IL‡O9IOÀ¾ƒ–þ°]ñu¤'Ãåøq.„?Y A J2"B €râΡral’¤@NJki Dk=&O.Î÷îʵKY!ÚðIç“ísïÆÚWpäÌæŸøüÞïc¯Ùë`4%ÃA`¼¥C„- XP@"Á¨7TÏü`AÕÕ×ß÷obÎ×ù[l~¿ì3?ôØáYª-ïÁ€¡»zL/VÝ“Õ5^ÞæãÛ8úè¼’¾k¬n0©¡XŽéG¢ÏC2Ù%a$ It²š‰p¨Š$€DM¦™U(}øÌQ ì @f:%D\@º-Á:ží ˜Œˆ IšÉ9„F!’D„@9 ‰“€ÎÈ,Lb!Ï@Iæy€¦Iä¸JÀ(8+*ÈšUPÔ(OLHg=}pz átN‘\{ #ÀPF !Ä‚ª  @ PZ„J”€0YDzÓFbDÂUbš@„š‘À€Š µr‹ÌnÊÇ F((aØ`o¦¨äç'Qâ…ˆ0’P+e:ŽÖÑ;›å¡òå»ï¨‡¹O*¹V·¿iŸ®ÁªO·R…µJɦáêB¥–æQ·kìa;ÔõÍŒâÊ /·U©ôÊ@‰'·°Âc:OÁ%~õ·[óË_>ø³Ÿ¢•ê%¸6õ}&«1Q§µÎ ÐÅ ‘ìú\>ÿr„rõö ½ü§…o!Šœ€Ý† /SÝf[ÐX¦ !’Q• T²ñƒ Še‰J±+nS¢P)•  g¼£]Á]–Uy¸äühõmd`Ò}‘zÖë·»n¸£{ÚP-‡qÝEÛ¡lÅ›Œ 3€ð¾Ïã{|ö>‡×«Ï<>r”"¿@M" e€HX¤,3Å F­4o¹Õ` hÕÁà‰Ô1vÜhE,n 0ú¨…E@…QH-*€£cTU¡@&¡ÐQÑ¢@ÕJI)ΤSñ@HgñŒ-ü], mÀ{Úô½†Ð£‚"Âj‹€ õ0ÀC€ Ädä#U¨€¨AÊäl…@°, jޏ3“íìEï~=>±—q‚Ðõ6Œçú0[\1-Yd Ú{c$‚t #T²!ƒŠ<0  J5A³BÕ% ‡Åµ®¨,µeò3Î Iƒ¬Zö1%Ò/ÍôÙSÑ‘AèY˜Dy¡H´%-Ú”…!``´»‚Am¦†‘RHÂhT…âZYº&l ,}” @"ä°4€&š)€tFÛõXà ÉÈÐÌ…q&Äo¤U Q» (DF·ÔY£0JÆÓ D@ÅŠ€# *˜J"¢Œô1aB&4‘Ö PhQëû@Y~'ƒPÕjAU´XËE}Qßø©Ô¨@i\‚=MM= (ç•1ÓôgÒŸ¤·lýX>ö·…#þÏj²(‰˜òcÅÖ&ÿÞñG?vûŸ[Fa1ÁTûêûÖíÊLÊ«.lf†U­…nUÔÈ Ú¥¢d…¹jG¶Æ:ˆm3¦IE¶³‹['c’@…ÂöðüÖÏë?G—hûÕ:œÆ›šSK9U¹µúta–ác¨n—>íCbCM®tñkÇäý–¾™f€œ¢TêÜúê‰<­ùýD¾MÖÚ¦çÍAL‘-5ŽÚLcdŽnm=Z„¦·Dá3þÖXc­UXr¬(Hµ Âk™¶ïnÙ´°l7ã@½Ì,T]·V¥eè û4ˆ¶ÆÉ¤FtúÔL‰ºá$»¤®n«7nÇÀÃIÒ®ÇÖc‡nvgr×XHí'²ÐÙNéÐLòU“½µä&oæÆ7y-¯D§§ÖîvgOV’@ÖïíO÷5ÔÀæb€R#”Z „•Áb R¨)È‘sÍGŸËe µ±Ìüd‰5«“I 8-Í8çð`À̪”7À$j1ÇrôHæªoL¸ˆhëb•@c_ò“ˆó3w `0A„jA„>(Àð#©@nÄÉH"jÀäxÚ]öݾáÑŠ 9°àôနïÜ…ç ”µ 0&y8†t4&@ö„òóÝsã}àÄÝöGüÊ'ŸKïÿ´û>“Aö´ŒNf€¾ì4b2c|ûžøv7öÒkBܨßp X èÊ]O|ŒÁ›6ŸÏ/³Þ®–ôFP6;qå=àq48|wãçýúðxú<¶×|l½ñ‘A`i…´(ÙbA"ÈW†èTiÝÒ'Ô‹`¤%"†ˆ’ 9¶rC5fk+ÔJd¶EÊ¡G#øèSÂü™n™n(3a„@: ·(]c k&—]¸™y8’‚‰÷Bœ}5O q˜94à j9´ÄÙ¸-›±óD¿ÊækCr²ÑÜE kI`~jØj²H*GN) ŸmXè€p'žS¨cq€Â•†€ ‘ BŠj2 Æ ˜²ß6O¸ #‚jô~$ D˜&x'=ÖŒFþz(¢©{;|žvë^K Q ©\ƒŠk2÷£¤A(˜Ð@+ lº]&³'Ýì[CÞ8,ï9>ÖÑÏXQTb3hµ= ì×WêÒPŠ{YuLIÏ:¶ãÒ1úµ‰â5 C¤íÕÃöÊ,3e1âÒ¾šù)«$WÙ6e^ÇvA?æ\ã¾ðââÓÁ¡:í-qŒòš¿öG×o¾Q/LbLq}¨ù]3Çÿæ_ÓëwÀ&9 öfÏÕë/ž=_s½ˆÀ …Ú°ˆ›ÛÚš€!ã,€Œš‹Q-  V´è’âÈ „¦+¾*DÕ 8Ž£ÇÇØ$* e9TŒKáÀ:u w;ŽtÎç¡#™éZ¥âX+’\Ô #Ál, QðØ_Ç÷k>Ù#3ôɨ'A#s“6wJ£çÁRiX²¸Î¯$%~øç™ †y?ú¡À’"f)D‹‚@U jµ¨1H´¤`â°8 UcŠÂDVhYK–å¬8¨ D8Ð*åÑê@ €Q³ Œ4¿ÈæQÀˆÊ‡Œ³åžu Æ\H¨8ŒZ ÒÀ XšÑ@Pp‘&•vFNÅáñžî«|ÐhJae›}^–ùíÎ|¬åSºþìù~”xú¥Ç—Ù(¦Ñ;é ˆÛ‡\K&QnCî)åÌ£?m¡Êv@¬.ÂÀ•Vh.W"6 µQE™´Ö\(‚âY ŸçÓö‘,=½ÏuÕVŸ£Žüo¿™>gÙø"]Ü:q,ít§ ò‰éÿÒúèuÎß𲙃jY,OÉ…ˆ±®µ¤‰°)D¨Á8c»å’蔡)3X}Pà(òÖ;U™’Øõ¢\o¬—¶û~æ‰õ²÷ün纟øp[02ô”÷ƒ.‚¥ +@) 5û€Œ¨ 4™rЩØxwaæ¤8‘Aµ-¨µ ‚¨©êyMšÁïÒ°‚pA*P@O"BpâˆÇÁÌõ,H”n½ Ð#£0n)Q@¤-çTà ôz(B¬D’ÄI›[@m×·?žè”Ä åóA 1i¡LÀŒõLžV1Ô9¡ ÈXñŒqŽd ž—??þtýóüq×´ãóþ1ß>ÞXT0º €€ñDà¡qÚÿéòùûéy?=ûœ beû6Žy>vß©=é3tzïãøµþdì‘'HÙþ¼íó.g7Èî"+Íi‘ìÜòã7OƒÕt±ëTÐ\ AàÎ*.¢ò®‡ùÜ<“É~XeÉaáÝæ$ Ðï>­ßFÍÙ3!€\$bÕ®¿4“"b`ï0Œ±aÕ!k~“[Ú˜¹@P‘0ÛRRTZšTÖ0ÌÙ;µ³™Ù½7ƒÃ¢-V£ˆxËS¤ÂÄŒÀ­°sÞVȉޅ€…q…zô èW Ô•Æ PêÁ b¡š@„P]2ˆZLö˜+3¨%ˆ"‹‘ˆ]ŸiÞBÂÓ™‚À|·’qy o¡2 pà–1a._"¼ÉV¹øqÒEŽóß„¡D\!Ë ãpµˆAòà¥uä§O5qƒÑG¹á®+š‘½G¹E;¯é”)z÷Úàý²Ç-žæj¶û|$x lº*¯ã>íž´ã±û›Þ‘ÿŸÙcO>/íØçá…Ç[À¨Ö¶µíŠsäÜ;Ž¿þ¾OÝ/'ÞkºÇ¬ºDgæ12ÆÑ9u@>ãº{ždîöy¾OÇxÌ6yÁsmzú·ÏÅ<ù›·«±n·ë~ÍÏû[G$$Éè•Da±Û,vµÂ,“•[o‰l1úúÕH$E±³7^ `´Z—ãùžíÛ×c‚ f€n žQ·âßüõ¤»?[\ìÃ÷™ÏìóÙý¥Ïc¿}/¾,n`’!,›“€ÓÜÈ\\㸑Ð}`®âsÆ>„ A1Q¡Š«±•U7eºçŽqçöµƒâr¥~TZ!ê»ìŠ2wô§L=hDaš©½èvçgS?é:·Ö–yf|@µë ZC±I•ª¡f,=+ä:¢éÛÜ•íj3O$)hôo_ûùrhÏ‹ç6Ï—?Ï;çËÎúz}¾!A€ÀvnþÍ_ÄWmå¾`ž ¶èŽšW­Áõןzþ…;ªP„‰$óó?XõÖõù»ýïgú_ƒ €fb €P! ˆª`A€®P«D   (pÌÔMåFRÖ%.µR u‰ƒ] º…ï *kÆùVG/NQk8ÈÉé\~"rÉßx~PŠÌÒô=5E˴ȼøñÞ÷Ûäy¿õœK×—Ç}5kâìõéæÅFÖþù¿,>ýöýiÈ]÷òýå7g‰Ìï[os]÷ól†úSG':ÆD°—^þ¼Þƒ~°MW;¥I›j{ŽþöQ.>ºœ _jòº~3=÷0…Jnb\{ŽúÎ ;ûîs‰×PŸ—OÖ®c‘·ÊJÒ­WŸUÙ× ûýë·ŠSO¾Þ„/ÖHöDئkÐô(0lÚ┽I"J6!šÀ€Qw[žÜcͲÓ\·âA×íW¹:¶ÏóÃlÇYu«ÕߺÞÞZËïþ€zÿ{ý©ŸûÊCŸGš,’5ê ó#Bé F lֹͰXha •UæžiÆ@˜&CÂÀ Â5@Ñ.`E4ÈÈeÌŠèwÖs͈ Yé Šˆj@Ò«ËnЙ0 Èîà VD`X±r@t2+R+4JîÒ‘.JDÔ¢U‹_ÕK…Á¥-·íOòBƒ ë$?º¨HBú™æÏæ4§û/ú=$1¨æÂHYDÇÑëá/»­wÅFÇö4Wí2XAŠ‘"ª—^|´Á ¨[­OHkð$?u±QÅŠx¼2Õiÿa››;û ÈZYBXmä^Á§3‹xËjEà•æ)b ¯N áÑ@mjÉ Ç@"ÂVP5Òâ£ÅÔ6/º+DPÛRŒ«C¸tRJÊ2m ")—kµ• cÄu¾æù<µb¶ézÎ&âXÆJä:a1Æe‰Ú'Œ:4XëÞv9é¡%mØvc½ѤíL\ëB…†»ŽqÔYë‚¢ ûØØÓ}æ z7÷[ï(›©HÃGýÞ—‚ÊéHÃ6˜eFd7éÆKjQ£6åÑŠÅ6·Îv¸Dá×q{ŸãóÊB-?(€†&XZ#YÐb€>B ³§ÊpBb‚óß#¬A£D¨h‘FÒQµ!‘³ËxvÌGÀ”`«´œÁ4†| 5 «B(jª îåì:o›ïóñå0]K–yçà|¼õß©†{®É–‚”QØÄÂbek4 "BXQ((­ Uã®g<2¥F žQA Ô“† ¥Áa=§JP €šH5â€Ã‘3g˜rRîDË èZ;À²ÖqoÒO2N™¨Ê… †Ó-AæVŽòûöÌ÷„‹*Ò8ú¢­x1Æ¡´l$¨þÁï.ÿµŸþÑßw*»_óòÇï™==îïè{´N1™/¡Ým¨úá¹Í¸8ÚÇyæ˜äÀ¯¦v X¦©b  ˆ%,âQJ’n´â«)Ó>}f¶ÙÅ÷éd—ƒ|´‰r«ƒFšr ÜZ6`æB4¿ñ¬‘b08œõ®üô–åòȈ׈ÆŠN ÍJÌ3—‡$p† ˆ4ÓN ’Qo$äHØrõÌÐD\"0øy¶!Îë=LA‰# ’ |Çû„™Œ m™’Â'˜0ÜwZ×T4¥ÒØÈì.öDU³ kÒE°Bq’Nò ÍùÈXië†6;¶°ñàÁ`GA^çæçÃøçVÌ?ë}mwýdt/§Wû·ùÈœ(ï°Ð =M‘mâãëS?GOŒ{?GïsdÖÇÞÝÝPoß*˜'j°ÕnÓ΢,›yÄŽ‰‡›ìáVƒcÓå9ôˆMÙšû¤¹ÛÖ³uGÔƒ½ÑïÜÔ†±1 `]gb ³À ¸ƒÍì,,ÏG··§qñ^û>Ú·ïGŸ4‚w^Æ%ÿæñS÷É>Ï?¼ý>¾÷¹o_öŽ-ä«ßå ûûŸíçýýTûÆxzïåî’>èöÝýþß{Óãý Ø’ ¦oDÒäÉè5œiÉš¹.]¶öÉAgëÃ݃‡×{™uÞ Qºt×sÖårûòÞ܇ è¤øIïr€P€@Ê:HédP’:éj_Èž¢D9 8Ù =>HÁY#P'œAc±j@±Ké*P•¨µBO$†" ´($DP™Mök˜¸¹mÙ[ýùêúñɼmÑ€ÂÖ(ÜšŒ‡oÔ-+5¢û7ý~mÛ\ópçÔênåC³c¦­E&'7¿rs<©„ö© N ˆ2¬(ˆŠ1ƒ8b8sIôô{w3"í¶_îÇ!®sœ_¯cŒê© ¤zÊ,:Îx‘Ò1F›!&%ôôºD«ªëÀó}Z½°îMSžÑj‰l«*¶½>Ä2à`N!;ÀòàÇÑö%ª—©.8ê1œT‚ÇáècñõãüzÉsÎ7æ¾_㕺ÝÎaO©]ÆþQlÏ<Ä ÚLÈ­²qýÅß¿sfCs HUY-It>¾˜ñ;þ7Wrû.þ­rÿ+€ÙèÚôzyLÛ€€A*PµBm£> e Àû.ñ® j àJV –ì)ëŠ2bQjiá¢Td¼à9Vñ×h–ŠÔÐÝœLŸ–§¸|õ6J:xuÞ£9Ë·©iÉ4‡­fRP 6)¸Ì¯0Ó-Ébø—XÐðéȰF‡Ãf¢a”:ƃ*` ¨EŒŽÙÄR)²,íÀ‹b¥ €ŠÕV@¨@(….]lJ¥DDˆ(@eT†ÝépaB€ò€>ó!»7C°d$jÆ–—QN @@L |à‘ÙŒŠAgdE‹Ö ‰DÐ*ÐŒáøöçþý‘L©=Ót~cåa÷ÙµrÑ´×½•žàúr?÷ÓKÌ)ßV9Îs,9ë}˵ ›C} 0±ž›ó}{^ãå‰×AO+Ðé'ÉË}µÝĸx¬óþ©ÃêÆjçuªûÇÓ®Þõñgÿñ8óºí|¾tÝæòùï}>YTêÇ?žŸ^}·íñ0¿ú—ÿk]~Îßál]ž~üÁ£ª%”rýÿÕŸZóiöç¾û¯¬Šð:î§*ûª°C^‚q˜^Z­ç1t»Qíµ‰Uùå;/n]˵Ù .·d²^Oñ½ºj±ó¹©½?ŽGznS/­ˆÕC»ö½ž´¿²Þ'Ø3Î? ߃9~ä™qÙV¯=λ^ïqþdˆi[vÏäê¿÷·O÷²×ƒƒ?uß¿{}Ž—k¾©>ƒuÄk®rçôsÿXúæò[Ûo]ÙdUy®ËyÐù±OÆÖúÅntüYõð}ˆØË(×Ýúë‡ó|—l‘æ:Å*£“ýË÷ñG/¶F\a‰†ý¥”ŽlbݱD¡ 81bÅ@m"i¬µ¥PvHξ¯ö¥"åšI÷²Û¿F)cÏÈ 6Ù 0¨@X±&7™,À@8‘Â-… ¦F£W@T´üDÿJ=剟èF›î?”ÅuIa"BÞ“®)PÒ®¾õbt•Öƒ9Ú슰+ÆÎ²)UE•)bB’ˆE–*Úl]LDÐdidn¡ÕÑE@!À–Ö@'DÉAÆE'¨{8E(h%<šÔTˆÕ”4ññ$ûÁ«Âã)s ‚òH]fz2ž“! 0euZt×ðè•yj‹B@ê+1hMµk=#,Ûçêcj#¢m'i§§Ê±ŒÛ_³NFJ„J1¦z¯4t“~ìÃÅ®â«/nÐp‚œÕÎV&ò-‘c,³·*QÅvl lªi‡7˜¦ª%µoI†RœP6¢c™ ¶AI’ÊÛ’­Áª´ô3í‚wL/P`UMœµ7ù›t|©ŠWÃÃ7  ŒbÊ.a TOq.[¡­Ô†šàGÞé[bÅZM1Ú”‰*€àƒÊ UµA€i)õt©ö@„ K`çk2Y}øõߟ¹Çt뮢D¡b0N86Ú×®û}ÚµÓöÉ?«SY“Kˆ†[¹o]?5ûõxQ#„ßéü²Ú£Ü0Ò a‚ÀX«W·¾"¤'‚=WŒ,UÀzb¤Xa «¸V* Ó;ÀÚqÐ’*™–Ó}k'‚ü椽J®U…ÁtÑI. AÎüñïïú™öXŸÿm~ÿŸld  ?!.yÉJ2påÈ?mÿüŒÔÕïm­dV:ö뾇MÝ/ú3,Ô£G`„zÐÓþ³O³/ó·´XÉЯìl_š»iÌïT¬LÏK÷•æô›)¦mŽx1ƒ Ýiš"ƒë6šÈgNé¾k½xf;$Dcðý„—íJ¾¿§6½¯†FÊ$´˜P,ãZ?1ü'ØÓ0)»=„‚HÆÝ •Pã  cm0Ã:°L_ówî…tº0aª&7Sf7dm% ÙÈN¥±¼p7Ö²–ÀÝfo£—’òáÏ ƒšdVVÉ´‰1Æàþt’ݰÍH vðŒWݦAa¯N—¢ÓŒHÛ™„ÿo3ÆZM€Î.Íôm<ø^´[¶/>÷í9Jw›ÏÔ§ºÄë깯eýu>çïöóâÓ â€ItËahš ™„LGÀÕÒäks&ÂíƒB7 8pÆ8ˆÐ™ÃGr È$,dœ €¬E ¹=s‚%MÓ)C8@eRËG =!PMÜiûI·T†D5$ œ °Þï mÛ*´x Ø9Ðe7 8oíÿ`oÓ_º_øè;ÉÖFd&ƒn_;̹•žw>`Ô×|53ܱÍÝí|x?w2Ç»¥•.KÊ ÂÙ …÷<<Ät\ô´6]×´ná´‹í|ðs52.¼ÊÕûv³¯³Ûe|´«ý¡ï½ÕGÀ:YS['Àö49+<KÃëêq<ºy¯6Þéžíãéü{À÷çñèW·ïß÷Ç~ýrï6C2U/çÑ}Á“ÆwßÚ°‘G^ÛÔ•ìhûûûoï¯Ïþ_÷Ó#[Ò•t[ˆ $2 &Å D ²rïþÞ~=íçÿù½[¿Ú÷Ù¾ëϳ?Çöµ=|^ùUׄqi£ï?Ú·î[~ÿ¶O¶X¢Ò‰$¤f Ü|0$Á¹˜, YXÂÀá{k’ÒÞs2o‡P¡Z…Žˆ0 @T2©ŠËBg€¬´ïìg‹²ûnÿÿÿ?ì_}4¿Ùëí”fCÀ q‰/4 "Œ˜&¶ìz6}i‘PD¥ÊEÕ îðbA ÓÍá•ô òÊÁÒÕ´Z<MnÛ·Ôg£‰Øyì=>6ýÚêÆzúÔDGèžF“R;cb²Ë*œÝO"}¤QX¡š”J™˜¹\¶d%é1ì9sQÛÆyèVúIÂ(R†¤*B“}¥¶üâÖŠx²£’nv2‹ÂC:· Ýš`é8îësçû¨/Gf‚LÉí šõYå¥ ·´›u$ºõböwò¥~ÖYk8σHÛêçmž“LÂÇËhÒÿEíûo/=Ì¿[žÿB÷ÚhÞX×óqsÿfÂÿùôüÇ ¹M P‹V9ëKuý˜'DñBSá e»ìϰl'9ÖûR5¨ +2Ó HïlCA…ÙheuOÊ‚DAf=a@!ΧËA POÇ:ìi‰ŽÎ¾Íy(/š[’á&  ²¼xä²e¸ HTv¨@¡,â1nt° ¼è b³"Ù¤˜ºXi) @”" bQYò8ÅŠªàU!€ Ô®  ÷·l/uQztö®ï;suÿ°Àº³þ0›±nm^ª±'ú^7’þ¥õ÷H.CÊ2uÂh_zq–s¨M•®Ó+›ûö\w߯åû²Öð‡í¥[½ž\Ou²¯òå”—×%—ôopüàëºö¬ŸØŸö·“§~ü÷¹Ë—oÌѧç×g~×V§_¿ãþ¾}÷äW‡ç™Œêš°4 8­¥³"TتD;î§qañU•.ðƒ£ pQ½S‘óæòVaû©þÿ—3Ø\b5a!"in±· d³B`xI¦ « # RZDƒ LÓßЛߓïUÖÒÐjåÖh›;qŒT -[«-†.º2A *@‰–@-Ö"@ ]Ë ¸Ä(°5]Αŵêq˜êÁ÷„+®D[ V@­…j‚e¶·Çá#úáÓ‡Zt!|Dâ„ÞÙ@™ôL]„ß%±…ªUÕ«ˆ®ðø'V$£ÂX®‚<"@Ô8Wé1Ò`š,«Ó%Õ[¥'T xFØ@8©¤¯#íåØf5t¬»5TæN‘")èÆŒvî&™Ë‘6VCÐÂ(BÅÆ<á^§5mYùNŠ@Íí8– lI–쥪°aQ‹ªR‹Ô˜Ó/¼KÒçu¥!0áˆô™¯eÆí¾Ö.Ü:€Ѷ)‘H .¼5DËPY 6 ô‡G$ ,9A1ˆðì™°æ¤ß;ó\!ˆGÀÊVDÜþA ”^‹„ƒ%¸«z2c¬R· Â'>«ÅèA#P¼Ñ6dÄ>?öÏïZí]ËɳóÞöµ4¼Ù4GÛ±%à£Üp§ÍsiÞèl¦@(ìmÀ\Ÿ÷cvÔùz{­ý€B£°†à6H@V£l9ØÛu}"¦¥5hõ2Iû&ߌ?å›: V-äégc„"Ô`C˜ÈeˆC;,ã1ãnBnº2ö2ƒãÒ €ƒO†#gZš—ƒ`ð " ‰Àƒ9 ÀðQ}¿û‡Éo¯¶þóá]õ„«îyŒö›c+‚àYÏV†®¤û©öçOò@o¼¹r$CFbí[ôÜÛTâiþ€ý~ÍØâág×ß/ýþ9þý¾ûzöÝ’Óíw\n—w¨rðCßíj/ñÙ·úÍÞ}ïk¿[47€¢#†9è{ic\ZmIñª“{6ÝjR8G&ÀÛ³ 4FZØv†¼¼ê]îIY„âí§åa(¹p:N‚™ *BÀhY© PAE*Äãjm—9Sٙ중dlúí¥ùãg|ÆÎÃþð#y}¤N&–"xh”)X¨ÑBD4‚MMd~5\VæúáLôP¯í©Ö^C!¡Á {åÙqn'Ù//µëCÈ Tˆ°&B‹oé|ì _Õ(^%çûϧ׳^( ë  ä{û¨åœç=Înl¨i€†Þ[OÂÿ lÚ»BnN? Z@(ŽO½ª“!0ê RT˜¨ÃëLz¿ü}Ot~Ü¿ ‰ ËÌâë¹üx¿<[•yêø ò÷‰¡€vHVÈr¿7vy¯ GáSӇ߿7_öŸ.}êÜ÷÷K½ä‡Âõ§¾'Xä¹–^ã¿;ãç§îï œA~VŒûåD_5–ÿ¼›Œûï—ç¿!®¾ÍxAÕ§ªÄ‚Ð¥sù  Ê1á²@T‚ÀUõL°Ê›®Ðª(¸$S+j—¯º¹Và:L0ãD§ÈÉ!A ‘,9Þ9•Ã,Gç;PC§ƒDN‘Ìy´larÆl|é1“‰œN†éæìrˆ’'GzâÄÔÈïñ•¤x1²£ÅÅ•"x‡ h´¡¨`P­v´Hj±PµK‚**„P­Qu„RqD XD `¤F©fÜ ™bP¦)5Y“ÔhûLDjÆÝ0\óâ¬'!]óŸ2ŸÜ÷ß`]8ß~´/~«Sõºçj sÝûÆõ¾Þ›<ªOÕç¨=c÷µ2zbKäPÆkí¿íó»;Ûyòܯíò¶¿™çì­k•*÷§µuŸXóx+êç¤4¼r«¼ëÿÿ—ýua~¬Ý¥óõWÖz߽ΰâ™i·_¹GU2›í¾ú²kxß•_ŠÓöó=XGê}V{®ÿÁ®»>QºWÅ”c™ ôÓ=N?}t뵕É*™¿yÎókæÁ‡BqJEµí›eµ¬t‰«ëA¬:håÍf?ìv[:Æ)èS§>nYìÓK·öè1Nü‡'¯ë;™üÜ_÷½ûÏý.«ÿ<ÿÉn_¥%îðš©Ã‘ýe¹ïKž´gl¡¦BðÜýeÞ“xÕM+ßïÒlkªø†â›×J߸«^îþšþ+O?’©ó©æ|ŒûÏN¯o}°?üúéS»¾âíU*î;õyjýð‡OÏÞÎÇ7{vµÆòðá3c]÷ö±­ûùú‹î£¼þè÷mëçþ6OãÎߦ,JÐÚ½µó»æÖåz¨öÌ+«×ÕôÒ‘»Jyø¤yaZ¯eX\!rc¢þÙÿ­£CÐ=~i ­Â±…]Ä?f9l£ORŒHHA8@˜M&PP«]µøÑQ«Ë’¾Ã¬äïY€}ºT5(VðøÌ¨•X ÈØ€”]êÚY)h×hzÐRVœO¬|C¢œ®ìßic€F€°H­6–¬È©_xð¨ à#ÀðÐÈ|&¾ hªPÀ,x0RÝ€õÏbEX;®X[Z«J°RªÅâ‘`—*ñi;¥5R{4¨éú¤LP[[­³ª ídB2¤qP g»L÷L§’ì³ø*7sí.Ú½1¬fÊaŽÛ5VỖÚî|e¯MÂLïÙOLe¯±Ž¦ÞºE‹(±!cö¢^¸ÅVcÜËp’á2ªsT3ZKK°Ïæi¦Ù£Î…Gí¯c9nü¦fªñt$€þÀ w¢'J…Õ(mh´°gê' ø(@-„± …3 ^añ³×S ŸÌ˜¯lc‘6SC{öß|ûÖ7*BOK5ô¡ CV­Œu×´Ë¢!?hZ™õv¥O"üÀ‰ƒ} û”Ã7ÈTG¥Ëh?å\X˜ÛäÍ)¦ƒÖ…ìÓ5ÌNì/A ‚¤Ù«k#†À>¾B¹oÜ ~r†ÝõÈxß™Ü ¢óm=·ïúé Š¹/€âsã¡QRÎX@·á"œö.Ç: ¢É€Ü AÞûÔïo²ÃÞHïÓ»ñ"ùË|Ìßú>\ü¾u]ο×ãëëñÉ_xæÌ©rÆøpúŽ.'‘cwt?þƒÿðÛÇí[nÅVi"D!“™ŽØ[:*ÉÇçñÞñÈg=³<+é@"Á<²!ó3 ¯ô(@å-¸RÁ×5×+^&ílƒÐ¥\á4f:vXÉÄ)áÜy7ókj4¤yÓÄtœ\Éʯ<62·ë»`CcâÐ'ªþÓÛ×ö±=ç5ŠÖ7ý–_}n~ͪ*¾ò¥¹WwOù|>ï>"ð^ã7´®17òcŽºûܽÏÙcúÛµžÎ—17ˆÇÑ<áTdmnF&Ã\3‡Ìyb“ikö0L ˜‚z€»$\TX€<ÁƧdÃêÈÉB(ÀКÐÇè|`æól„ ³öŠ\*lssP”„‹»œÉ~›ó¾T…Œ6Î}뀬g±¸_Ûº8öºú$ÆØíy^òÆc{±¯õje›ïaÓÈs#´``[;î6ƒ'Ü0¶™“»v¾i>±WGM9çc{_³Æ…œ‰WOiN7YÓÞÂÓ´ð>¢Rz>¶¬ Yûót|ñë¶=m˜£3‘ †íi²ê<§Áìß·Ó¿Žžö‹pdô9EßK<ŸÛNí³Z:ªž¼¶×Çט>ýlm›½»AGúÚ}¿m¨­±õ¶?>ýý÷Ëýúï1ý^Ø ðpªàЕ֡˜6OùÓþ?bî7ž ‘8±¬ UËQºìç{íÁ¼ç+îL/[æ]Ã䀆Vl†ÃY!PÉAê kÄ|Ë¥)Å‚ª¢K%Q! P‹¡Ô4ã”ÝÌ9¾Î!µ|?¿_B k†=gÎsÖÛûò«ó}›œ•*¬© ‚BaD„ˆÕmsõ“ª«·¢-]\ÇWÎÞ&À{ü4xHÕЫø¡ˆ`)^&.KZ* ¨xÌŠá£è[Qãè‰r›´ºæçº²ç³8µÓyŸF{3渿9º¿;žû¬³ÏÎG—[©°áš [9PµK®ÑM¬ ¦@¤8ìH»ŒvoÕY:pQÞoÓ:hJ·Pîün…g ïºK03 áÖ–Í;ÚÄðÉzí3ë ïïVbn&LœŒ­éþi—®±v$ ”Ò`œÛêãñùòð÷·ß­MþÌOÞ¿}è¯ÿ[ôL×ó7׸þúßgÉɾËy°SÈ!¯uÍl¯ÿê¥õïåÖí©þÛ óŸ¾ˆVsü1ïOŸ/±…Lj$@(²4[C£€2A—ƒ4 Ö%Ÿ0+t`=f/@)Ô¥¾QBˆ¥‡c( ü.„ pŠ_È)¦­&õª!€‚5ˆ `tTž(g“¯$ÛŒ>;ò™WÒÑ!d`J,­Ö(O³`úó(I6“‡«›Rܰõ ¬èVUD(ÐjGQ¨"„€3^‚¦ 0¨ $:KÅÚ›ýßÏóŸ7¬€¥ºA€ ˆYvi‚h@`€h@@ÀºðÝËDà쎷c"$Ÿé¾4þ;‹­¼ü+uÔÛ5ö‘óóŸ÷ó¥p¥>Þq¦H*AD2¨ÍÞÓ˜U1y¾j‘¸ç‘öÏÜ?×ñmá«l³Žö=ª—žáäëÆJ¬fÏê[°u•Ÿ.oÿó¥»é#³¿ûüþhFNÞshéxO#2Ë6é'´œµÃëÉõñ×ܧÙc9r›èØyÞ?È×ûkwpíªßæË¾ÏyÛ×ý23óN<Ç¢yÜSëy=à-H]ïï×—ÚslâJh™ÊŒêKGüÖ¹ßïòCœ;N$ bf”«k?¹ó"÷èKÖŽÇ?Ãé­ƒ&e5kéÚ·yœGî™›uLTÚ[?mî>þMð¤kjƒýÚ&]ˆâI·­ƒxPõòîéD Y›Ò]‡…Làrƒ‰úK¶xÅî¥1;úHLOÊ ökËŠ›<‹ª`˜½ëæþê«?Wz®t–¢í3«¢g•‰ŸjBdiU3¶¤±“ni£Ò’6 SN“cX‹‚ƒÈàY¢CÔƒŸL>øýøê¯UyÜ9)UGœÅ¼}Ë›{Eï³ÿ³}Ì1NíÛ¯N‹œ\Ÿñù²Wo¯Ú°{J–c­GO?Ež·;vtÞþü=î¬õÖZbò'¦zø¥†Þ\Û{q!¯j  JìÔÍ8¨#pwõÁƒ<¤må§0íöaƦ„êØ'ÕêÂΖ~z¬Wh×Í[û¨?fUXf?–:æø,”DB  š§ €[:ŽÖ¥]p íÇP,U!`ø «[é2jÇâ¸R&ò:<@APƒÈc ç8í@­–‡@|¤²œ=ðÑ‚üàC˜üÀxˆZNÖ‚"&•í£¶žþŧÉÌpJwµß{ü ìa•gþIÇÙ ¨(B/–3¿²ÊÈà(¨ŽØŠHëTm*r@¡ÅêµËÓ°šï² p€ÉÆ·¹"%+ |;äk^ÃLÍ;‡º5&I‰Ã]Lä]©¤!]`#-¤Ø'Sªº·FÇ]&V:“ SKÕf®£-bôLGqû©¦´QX ÆF¨UÆžý†W/^e„ 8Óú‚Z  Å d¤>ˆ ¨„a +PS!`!˜“GZÕÓËÏèço±Çhì`5¨€0¹U5µN1iL÷"- ÖY±&ìÝaष§ÇËVëX¶Ñnºæ£÷Ê3Ì€—ýÞ8‡#éÄtÜÝLÚÆtÞ›b„ÒÚöè #:5¢ËÚE_8 ¾qZ* bSDDìnMÒ¯ð×>9gîê–mÔ¢´,ò<{ÉG=Ö9éØt²9`ÛØÌ;·L¨´Ð¸Üõš!;²ó>Îü•¥—6G¦M÷é÷óáØî=º{ïõoó1çfóçhÓ…s2ý®/Ì™5ö­øú(À@jeE°¹9úGm•Qíßl/{¼ÛF/™m"-· Aá;¼ùȤx:.¿—ãPË}A2[{<6ûêú­æ±íó;°ÕÓ¨ZC£U(­€a8µÒR¡hÚEkÔ"Ú¤Q¥ ¡õð%×ͦ7/ìJ’ €Ú±º»Ò ††Ê\ß¶‰s BjX¶&n:mP8sJÜ”Iƒ—I/ NNt ÐBÂЧú³]iÁîyWСµè£0B)éÙœ¶íJ,s[a°HWèØ°¡ÙÆB`ÝÚ8§€&v*-¦¨ìOYžÙ#uÕ¤Þ¤p©´(TLjy@¹¯ûûÙ¡;u°Ý˜gç`a>ãÑçÁPY‹eà榩7ïû¾W}éUûÛ™Qqóí¼o_îM¯²*¸ÏÉôZ{ïæûÉfë8 K;÷ö|^01ñÈÑš[{<Ðw½' ·Åq¾Fõ\¬ðÇöŠ„l K;ž÷Ô¯ylvÄ}¿Öc~Ä$ rp7‚ê4s¤£úŽz¶Á¯ýÜþüâÿçiÙðё컾Ÿ‹.kĸŒ²Ô¥z}èµ7·ÖD8ï3·›¿&÷v9óúÚ=ÖÞn{=1÷jŸŸñå]ÞbJ9]Çù~Z—æxho™ÄD{ñ^²zÍcæ°ÙãR?„[޾#À'¿øc5y–__Ú·½fa{="\u]܇9ÎGd^ù¬}–÷¥ýòH¿ÓhelRcß-®kì>ø~ÐЄÔnü5³Í½î Z€”>|p®Å ?j€P85ÀU L…2(€…FE ÆÀàêâEcjöíÉYûñÚ5ÿÓý¿{®Å÷é±óGêEÞN¬¿øWN­Î%¨c˜+® ¨XgD<4Ú½àYI¶¦½óÍõêï笳PÜX×¹ÓÜ.ã°Ù}ÏûŸXÛ0AµF!ÉH>—L)oR 5†ýìöºE¨O¿6gxÎîXÌ¡ŸûV©ö»›Ž“JL£ÀPIeP¹h¾£O‹é¡BÂ3D‹fÛL27bûàåXË¥Í7¸³è/-A+‡¶”õ\@Uû[ˆvTI…4fZâu=éÙ–CuÊ‹Õe£qVÀ 2Í`‡Î)G…BÌy ,ç*oæ26üý‹o¾÷ÿü³òþúê篭ÿçÈüØûpfý¥ï?\ýü£W>?îí'ºô ·—q¾·[láú½5è¹ÿ~±©÷ùOA¢S¹¤0€”¶¨]†STX@„ÚKƒ¤|*¨ZÐ`]y»ÌÄEE)E󜽻…m)<óLÖ„ˆ\m%©•jÖf€$ƒL2€5 pJoqó|ÀôÉûÌÞd'Ÿ<ôut:‚'JZU…¢à0JŠ^’‘#³“OúÔŒB‚U¥Z ª (BF5ˆ €z,¨â¦TJ‘ìš³Np!Ūخ(áÒçeæVók¢X’w %k²€*@¶g< š‚ hPJI𑉋ˆº(T(T¨€@y7QÇÑ•ÜÞf~ØóR_Ïæó#g/̹wº›ûsÙû,BÒs¶Nκ¹XQë¬O}ä”›b!/Ë=41l©1Uh«Í/Ïùƒs,Z¯­ù¡ç7g÷gå³ßáhü<~ñz?ø©s£+W;³2ÖçY©6©xp#3Ògi§*’%FÎ÷$ëøõ×™ùÓSe=Hâñàùéß^Wïý>>ãô}%«ü°¶Žø~°¥•êÎ9‡`ÂxÔ–Zÿ¡~î'¦ãgw5”‰N Mö%gÁ{žØ,)$Z˜Rìböô¼¿¾&/U{Ì=ã®—t!Ý»âLí{ÔMZSr½Zyiìkb½îöà°ÍÝàòŸŽsÔ˦.Ri¡{§0¤Ãn‡œNPªCHCÇ!4Ñ6P³;s1E-a€rØ©­D®o]ÆÄ×á¦/=6°DbowIiJiª*ORÔví–Ô`‰"'PmZDö,ZYC‡7$ *§;­}-ìþź=Ûc¯ðq慎ÿT"ÿã×ÏëëMòß:ã¿æŒ”Ëøxb}~}ŸH­°{‘N;Rƒ´û>Žwæ™á:¿°®÷oÅ©_â Ö±=Âazj¶eŒ J­4¥zO¢8öPpÚ¢´ê§Ë8åáNuW ¬<ºýÖ«oöx{dFê6ýÒsžšQ9rþºŠÛ÷ö¸ÔóÉG•¢b’ÙQYÒ– ˜µATB}upŒØ ÈCØpÐ. ¦Ò¶ãáƒðOºdú ¬É‘Ä`Uxþ´ÇæÁƒ’ÀžƒñÄ(phûÐg!`89˜€V T`…Š PØÇP>8ž€®X-ÈÉÔ`ˆ°‚ À¢XP¡ÃdR+€TCz*WØŠÔ˜˜VÚv*§ÙkD¼C&•2™Qh íà†ô¹?ífw×Àn0$@è)ik[÷8ÌA¦§H/DA°Ò>Ùp¦©S°`B ›…ëd:aFÖ /f¼h"œ'ƈÔÿ»Ø’(|€D¡›Z¼„‰RÆÅI"Iz# X ?ËÜ8×C‚ˆ§ŠXÌæ !ZÂ4èÊì9É…×\êvÙ¡9“®št˜*]»ØÚÖ& ÃÅ ÝÅÈl»ôÅÐ4OÊ4*Yéº7–Ý䌱e§¶ÂÎzßLž®à­r…D¦†´ñ®éFÊ8§1" Ûé …BƒØµ]é"o7“Ò˜Ìågþ oŒd9 ·ÅÛ+ k dGÌÆ^Ç·8Öl4J˜r™Å“Ð@(,‰³›ùüˆ¾Å‹å½ü¹»í*Ü÷²ï¸<²}7YHŽ8 |°››Þl!ºp×uÖÇ#¿â Á+ìÖp¤ùpôÏå,iý܆]Þ} ám>þÝ|Ÿ¾†Òyì®{ó™gŸþécן#¨gí ?÷+II‰Úl„ ÙµíÐëmÆÎ7>‚ÐGz‰”¸–Úc4I"êBC•©TcË`¥ —<¦râf¢ºº =—¢‡M º’ {íH~4ß<{I…j¢ ÛÒtQ,á07\}\á ŽÓ%U“Ã\'[;i&Ñèâ¤,@{© [T¨XïB×P(CZˆŽC $Â{* †cLâRÅê™FWH¶Õ˜Naâp¨A0 @Uñ‚fÙ4ÈÄ` à‚ƒí4ñŽÃq–½Ä…m4Ûtv²’¾ ì7òÈM¹çÓ=»ÞMN¾F` DŸæÐ§ñMÛ^‡[2niw‹wEv «¡Ï žÑÜm¶Ô uÛ—qEˆÊ¾ñh=ŸG͸ìëµ£\GÖÞ—Û¯6 ›6³|x~ண÷Âßø˜ö©4Fmœl×ÜN¯;ùja€;kÿ! h‡˜6)Û5cÊåS‡iÈÅc¬‰€ζÓ}Ÿ½‡ÜçG϶·W}~Î÷;Dd™iLdæ°øUÑ!ûãxß:.¾×V± {™ÀÜð´ÝržJxÔøÚ!ê¼ \p×Õ®Þƒ¯Ê¦ÏæýjÇtæg?yjæ`ýû–?ÞÒæºk#ˆ=¶—žÿ¾äÒáj¤.·}\Zf4¤žö>xÏŒïØäÁoÛÏ9ýª­9£ž>€ 8ƒÈ%êR¦6«€JåX©€j ƒS@”‚¢ j©™&x¢^çuxznä7öƒÏ–¬­¼¥bñuãüÉeØô5ïìûùSûÆ02jŒá¢ñ^rÐ^qß··º?’}9?~|¾Ï?.Œ«d3ÊGróK‰orëÅ_uƒ>YUGbD„w8PõPuäáéÖÞåuÏåuiÒÓ1Î;ã–i«ž±p–[k¬ow[õO?áHèëçv©õGË›¦³%p±$âµežK|j8îgÛØJ¥˜x*·yÃ'7뢆JcžªgMNp>ê UÖ5,Íå!&Ñ3Á©kë*R¼<Ç›ÊÙŽy¢Å£»Ž–űÅÍôaî!½Ñ°^%õ>×If»ßì×¾úóÝu¼Í÷âùüÿâéÏ?îýÛÿùkÕ5ñÑô×<ú¼ ;í‰Í yÙKi¸hÿxüuµÅŸLÇQ™-4\f"7£¡ èëðDŽDW|ˆ*±ª¦ŽT[,¸Ì­-• Šª5Z)ª€( ˆ®ZQR—Dˆ d0˜I€º„™£J ·šù•å$ øpDá ̇I¦ ¤Ш!ð IW¶ ϶DïeãÑÌ`:\¤EpúHŽÎ¤¬Á·0}˜YDz>iꄯԒ’ª‹)¶¼BPñª¥\UÑQ ‹+ÕÑç/gdÑ ¢A!oftæ±í«4- âŒLJ6ÉY2 -×|ñÊk óóÓÏóÄóRLvEiÃqÇuއÜF]F™'ˆ*ª‰ £X/¦o­ØÏãRÉùv|ÖDcôÎ F^¦ §P´‚ Õ#ƒ¨H´uW(ªÇѬƒç'ý4Ë+OVr¼/|­]ÔÎð|Ö¡S›ùŸþjfÞËYWvŸùœò©=­´Ÿ7ÑÞ5^÷8ßï}VÇùBÆynÏtdœ"ƒ®9WŸcز.1L¬ZÓ–Ò‘¨;BR%·ÝËsHb¾æÏ‘€r½Eh¡f¥NÇÂŒîl¯šqlÇ*6g­Ã8ÕskYÍš_óC¼GÀ¼wgȪv¤&¯nt™Óy{gÝs}ë í¶ t§DÞ=oî<ÏÅå γ"ÊÃúé&é\ªb{ÉâU‹§^?—ÿ“ÜO7>¯ò©°.¦]¥^Yµ>v(t¤I½­f‡’ê¡åYºøÊ  ¤#Œ¶­h:G""Âbj‡Ñ!&XÑuž3ƒ7–¹àL‘¡¨q5´,"° Å%qاbeQlÖ„B¤¨\[ˆè°Võ¹u±,¥™ RŠdà6+Q—Ϧ;G?•,z¼–'{:^Ý÷|lœë`¯°ûmÏ*Ì6Û;{T¶b$jQ‹5Á V¯tf2béú•ÕÉÉt*ÆíúäÞ±ýŒà«1d¡ÖôL÷måÖaT/^övh²Wõ†×CépßX¬¬R&Y÷kzçæyӺݟzÌÛK´3š›cßã:ˆFNP`@ AÆ¡XæûµP¬@lÁc¬s @£ã„*(ŒcèêJT¡R@(`³¢º±ÂuqA€b*ð¨eéód•wj# ®È„«¬¨Ú¥t\ô1ß²a! Ø€¢ß›õû׃†A ŒÈŸ)-”Ølò<€ñAe¦g4 xpáCl­\À ‚Сªè÷f=çém«õÁÞ5üI¨Ÿòab¬ !E­„Š±Ð¨„–šU)ÇhÂBe¡!J8‘±•DõÔP­ 1i¼]ÊUsŸcÉÒ1†¤¡-µºL¨ã"µMfx E2•D§]Jb"ê‹J)²Èo´SÑ"ÅdzÃwŠZNU©0”Ó †‚VZ€Õ¡"±ê¢D•Ø ía}Þ6¬|›´™Á.X°ãÀhº“Ëlö5Ic¸9^ÙÀ°µý®x› <–cÔõƒl>J°abÖ*Ph"1¤2>´§a“ÒLS{fã ¥ s¬&Ü…^ø 8Π¹z-•%Wi¬íÅ»öŽR Í à \ôYýÔ¹çÌ›‹èH5EMtÅ@ɉU͆{e_ü¾;GÓ¥Æ&s;›  ¬hjÙ¢åpÞAAk@I¥Üò»?3Žæ(¿¾¶z»û¦ÙöwöÙçl¥Åæ>c„#š0w̸?’ÕŒëª(ùöÀ½fȬ¶À‡ÌÉbä@®ÝÙTváæ¶}å1¿÷úïæ~§—“p•oÈ3ÆÊi=ý~Æï§Øô³Üözé÷ìM(â- Cˆ‰Úi€AÔåà`Ä.`‹©¨U#)T&’!ˆ3#l[†Çlä°d³Wìö˜ ÒTn‘ÖྰÏtÊÞ±ŒJØFŒ¨vØ@PdÀ„ÉÉŽAí6þÄsÃß}e¢ôX5Ù ¤µ‰KÞ‘4ÌÉHoE SâñÒ6R4Ya ÙK™ÃSLeÔÎuX„®PaI’*ˆ´‘‡Š5D›Á:mùá)ºÖ ;ˆPËܰœF a E¦k4@2N44ì¸:k´Öæ`31WÛh_° ñÊ|•¨A‡§ìÓŒŠûqmw|ƒE¯=Q¶´éÄínƒl£Ñ½ôkzµŸrñµmh*¼nG½‰!vmQah ì±O#;ñž0»OyÁ_ãÕŽù´<4[Í«ž÷6=t¸òym¹Ûs =q¦ߘ1ãv–}éóÚ[H©†‹@ˆ!d&Ý4¸þfм; 6J!ÓGÂ-ÜšQî`Ýg8 z†§ ¡!É d#Õ)– <mœü¸®CëöŠo©O² Š‚<úÁþ4ƒ~hÇQ7$hß}¥RãÝ‘,Ê(îiþ:^o™¤tK dº9cnyá8ú:惽¶õš<»ÒlcG€±Fº}<©cÌôëÞn{ýªW±÷+²eSúd—‹_—¾Û]º= åþlOzÓ›·;Ù[¶úÌhH£Ñ¼³ß| ˜§üšA£ëûñ¸\uÒæ÷íIóØ?ë£crFO"¤5vrçhÕv^vû9¶—Çá¯[ =QÊB‘‡³Ãg¶þMÒi¬¤pƒBÔ ª‘L\5Ô€é^u5Ž]z[{ÙnÛF³g¿%+  Fˆ‰Ñ÷ÒÂÃí³çëg¿ûϯ4§@:gWaÔ¸^FNV\ñ/o·}¯>åýÜ~±zh€$êá8Iƒ;1°A6PZ"QJ%#j´²‚¢R#Lmè3½ëR¯¶Ç„>“ËG••×Q<ÇžéNê/ù~ʦóÑæ,Ø÷©ýmÇ-ŠFTÃÐÀ6#AÚØWý‘çÔöT1÷.»Ö>¤Ê£œ-0SÚˆšãq±Á@¯Q?EGk›PPaŽžÐ©ü]]öV:åf¡–C£¶¦¶ü"ìO4Õøkè±sæžeciQ Zþ?l,ÿÓ‡ápnVù­ÛìzYCí¯ï¥ìÅõIeJ…F')ÜÏ‚ƒœ¤J4ÍR4SI//ýÞøŽr¡‰XQ@íjkJn]|6-JhÏmëš=SO ýšÐæ(xÄœ•ïœàf÷jK™™ô1>ZE%nv4\ Ü]Z­·C~îÇÓ?æÛ­î?=Íí#ö=l|6å8tÖÊôÜ>ÓçÞý›çù¿ëÏ;1#,bú{éúÈIÁ° Ö6#rÜûJµ¡€F°’+[~!‘Ã{ɱ\¢aeÍ3 ‹éð$’ ÆL䉘Ý;›‰@xÈZ&´€ÅK²Ë!掵θ˜(­’i™¦—¹eæ3Ä„•ÊÛ'èžÌY€@Ð ¤‡¤ÅWÄP™‹ é¾t(âM‰yWQ6Å3×–Þ¬}½ÂÜmÎd)ÓÃ÷çöTöbçDŒšã‚ýûkžóW^3/csSÆá{ëçY{t3ŠiîŽoÙg¼p½8o¯=Sš?r9Øæžoâ/v}ôò"œíS€©|YY¯ê÷éy¾´Jst9Mcj£åÛŽWØïçÊùfÌ},ïÆlj\†Ä ØN´nåá•é©è6ÌÑB¨ \΋WŽÍ%Úíuü“8?Ö÷‡ûÖsøhò*7»ŸBߘñ‘Ó94Œo‘¥õ}¯IÏ‹SMÂí<5Ý­õÅ}þdŽ_j™}ö>Õæk²ç¾Š×U2ÉwÌì[Ü›{†[ë’Ÿô°.p%ÓD«µ)#Ì0>0Š+Ýhe– „ÓN;ÎH4‘"¤ ½ªÄ#ÛdXª¥Ìv•/Úd3`sLUÅÊJèB«‡í*Ñ)±ª$Ø”B…ªéäºØa°c+nJ\MF*¶²Û’¤l`•9¤qX]ïõÙ²ÏxÿØÉ0{ʹ4éh›3«Pú×ae¨Hœ¶ºã*¿ÍDÎ’Kýe»IðN$Š­<ºÇ¥Íª±or–ñ±Ì ´º=P-ß•:šëH§‰ÎS¹YýÄ'6ã0s»Lýètå…›òÕG©ñkt®Çì{~æšwû§ÎÞû•‹M:~´xë±Ï8ð)«$j1 Ë12¤6‚­N ªT ` (U zÌîI˜ƒØ®]©ãUú¨ý…úKë´]«vðµæ×µ®ÑeQÍ¢ŽÔ‡bѤÚWÔìÊ€¨ˆH‚¥†…PÅ.dIm@eB¡¬(T€=ŽÛ| €³x'q:)`J!ñðcÁ?AixÔ\àO¬"?TtÕjVñàÖ/ ¬¸PZLÏ,N†Y@ò÷Üp_P@¨€Gi,Õ ø` , ¤‹*ê3¨YU(`± ,514 %@‚JKoŒÂ"«çEWŸ,“-–"`dIª[Äa¤ -B)ž–„J uõÄæN¨àTîuÀ*|hCZ_YAÊ(åAÑ —Ï_”#ûx‘]¶hp£e‚lVPNf5Kám–ýæ ÉЃÁ`̓’[áé½áѪ–š ˆX¸¶±R€À2€ØÓå™¶pj™¢ OÄ-TQQ…WÆXdÐpz¨&]¤Aed}bo¬F—Y„AÁ*¥ ] ÷濫Éx-JûÞËlLÝ&×N´¤[G5C›‰%¨B% eŠ6™ƒNRFØ0ÍQC¢¨àèÖì>²|÷^g|öí@Zm¥Š9›š»ÁÁdDò—Þ*†eçf/é£Ñ#’ g0 Ò™#µïòÓm6†â :0Çñ–©‘IwãT=çÖ e‹Ûð'v0ÙeØÄÚv=e‘€Òï«‚J$BƒE™#µ³M Zjt{]úl2_ýx»à‚–Éö¥Që®v„&s)",ÞWû´›3wÜqÒ+,e§»!HŠÉ’N ´ÀØr¥zƒâSp°UË4ÒÉJ5¾Cî¤ÇÔìÁäÆi5D5Ûl@'eqSag’¤*:·aBÀZV#¨Vt€ÑäN­±”ƒ´6c 0&Sà´@EEŒE ÒFC%(€EÅ´ £ PÑÀ¦jB0¥†¢„Ep!ÙÐñp@¬i\Ž2aã0Àl³9=:5­ jiAA&Yr3â‚À‘k3¯@/ ;®MŠwÞ[tOºÿú°®ãÈoö@1¢N*å¹1ØtûÀGN4cfåžßã·ø [õ¦Uk¡pÐÙùÌ˼âEÚÙjî°ÏÓ‹eFÎd(UŒ\Ú7Ê &PÂÅèû]¾v±äêî@’Á$¤Né,’¬|H±€hä×ÅIUÕÉFéY 2ËŠŠ1õ#Q).@‚mÌclS-æ¥%tôvžá¦ñ Ã+!Óe–Xí =Ó«ìôÐN¼©nn #™¹êlfÀéX)éÆÓϹzO¾géâÞKí=$J?Õ§È×#Ý¥Ÿ÷¿Ð_¹ÿÙÿî*ùG%;Î/Ÿ£;´Ì'fý¬G;§@³?ä×o'?J2ë1©5¸$uuÅzÇEÆhPD x€¹ Å4ðÎÍG³ÄúO|‚$öÞûë’ü’ŽÀ-9™è´ÙoÃ…ÌÚ½}W(€ÄÛ¯c0[“Ù2óÁßñÈ_`Ÿ±@ÔŠ%«v¤™ÜY¨0@9ÓÊÏ$gé0[¢[]j¨6Гãqö-íÖÊϽ>¿Ñsãçç¶?N=·'yåéõÍœ×åÔò(S¯½8ðÓ‘~_¨r·½\õ ¢ÕV´ÉËaâ'ÕQ´Ú=Ø{ÞeNóx²/›ÕµÑî /ÕOê7ÚOU_ñ^êõ¾ì_púv5½‡F²:¤óOæ•Ó^Ã9€b®µŒâu+NDÛ`WD é"}Í̆Ê™ »O´V|òÞIüëœG¿¾S>…½ÌŒ“Æ=37锸®"o•m攑5þÙÆye40Æ`Ë °UÇ´W ‰Š-h)Ú• XQ9RRÊäN3•Qt*Âj{ØL0‡ZÓµ9[y)uiÔô{ ¦¨åZðHüˆÞÃÕÃÁõ—Ò¥aº³$ŸíïÜn[‘¨X"X9Å…š©;9îsŸÏ©nÓ¥cJBRÌ!j{'¥s)á* êÆÚûÞÙ_‹³ŽgÝêáêï§ZK^÷ôïÄGâ”þ¶ÿk{‰½&«à®Ösë}.ëî\ÕQ~\lù´]+ ±òU¨¹èÈmâ¶GkFàt!l H°TT$2IZ™H©ôÄ¥’Ø¢˜ÁFºòâÄ–•˜Š¨¼ÙqF¨í’‚¤6iªͤÇ26 ˆ rØÔÙ¬ -‰*lG4ˆ QB'Þr½Œ>Ìþšm€ÒŒr–V3Å]F‘ÍýÚ·¦YQûÞzh'ÑV˜›1Abùe­²3‰ípЖðœ'»vÖ;T+®¼©û®²¼Vûq•!ó<û¯g§Ç¯[ìî$Þª8r¿wã\d]×ö›@_ü_,•ƒãgDÐ<µ¿}¤rî¾âìu~|¿×á5½N? óÍ­`îAÕÖx¬$K'/ÃŽóƒ|ü¾åœŸÊùkóv¦×|_ÿ÷ðtøUM?çr÷ðÛ÷M§5p4Ö[Š UÅPhQß´;ÌKöÏ•ÝõÊZªª” Ð ¬HÜ¡KžŸÔ‰´Ðê¥ A«E+IÐRðñÒ°ÿÕ…Šþà^èü¯ðF2E·5Üɽô ”ÖH¶±Átª)*Ë8 §Ý 5$tXjk1€Ê ÓfDJ'À¤NÀV¹¡D¢0 Áµ&ƒ€&¢Ü×jÔØh\aÊâ{‘õÆyk3kdNƒ-ä8RTC]EW4K•Q I"ÃIŒE V ¢ ÓªÂDajb+#YZm® ¨bh°R‹¤cˆ”ÒÂ1)QJÝU,Ø©° <ðÀÁê¾ü¢[ï°u†öš‹u† ¹Ïr ›Ù è½d töRÅbm”wN¶Ú©m\Th=|0r¬q—]á¡i‡— 'aµ}Ó1ª‡€Ä]æGŸ)MsoOuqÝnÞÁ¸Ÿó1÷vpŒAÛeªmì*{4ì²òÝ핯½fÏÔäà¿ ìQ¹…Ò°À‚`M!w Å"ø°AE`fètŽ·d&Ñ£¬ÕÔ¥eKÖz3²uËä1Ñ=šRIë–¦훊í*”6]ǯ9™cû÷ñ½M&­åyÁ6ÑÌf>Ùê¬M7F¯Ñ}…‚³Q^t´@$Zã»m¬J=¢òÞgαW‹“Æéh&óÑ•ä§+:3GW¾%ÎÖ{yŽé$‚l™€­¹Š¡å ­˜3rW}w}è•}k¯S&÷aÔ;$踲xŒMh¶zúgšFðpÓÃŒD~‘‘a ò3ÇÖ€½$>P°ŠhñähP8;AM’ˆX'"….MÀ|tì°g<2e‘µèR¤DnG`6^²0öè©íÞónÇÑ{9'޽ãu™%ª2§¹k{l3Q>7cè-ÿ§ä&ˆÛ®ë¾Éûmp¬ã“ªÕJ‘ZE«@Ö(@hÔ%´éP{)°‚×óú/Ï{ÜuÖ½­¢‡Y;ªB[ÝŸE?æôqÍ2›Ež­y/å&›E§š>Ĺá}¾×-9j£8ð(Þ±¤ŸîÓñ\KóþYÿ¯çôF­¤zªÛ²J‡…ãþ¬â¼çë­ó<ÐÜíeVgûI¬@¨@nÉqçY«1yÛ­b 3"eÑ¢©L×ÏÒÝíö,sܵ¾¥°øÀdP›õeÇÅ™“O±n8¾@K56òdͱÕ>y>VòYÈ|¿·½maÒwG/¢$j(PÐÅpÀ.*F¹ŽÈæÌêlsWìã¦1aIýÚ“Ô#èé.{”Rt¦ñp&í2ʱ҆m¡Ü¬qw–H ‰XýÛ\ÙtäÞ0®%º]Û¥‡^ÞZ'*vYFã$a²º”öçýë¿ÇÏÛùs|ÿW~p³¯ý3£wÿ{¿×yÛ4»öÒ×KÛG×'Ïï}q®ïîþeùš±ÿuÙòø ¹Û€P¡«HƒP].å-*U€R°|6Nð6 ¨.©”8Õ9 0où–ÏL„9xðãØ€CH ,T«–·´L Ô‹P‘f½W±ƒ Æ.ÐÕ”Z¤g_ÍyŽ}-Ç3<¾ëKù)ž_yÿ¹õ•ô×ÛÇÚ/ÌÛóþóõ®:¿¿@×öÏiûòkΞÛËóþ–kÄùqÏ‘ÏyÝßÛóúhÎÇCž¯šbžÔ¶yofÔû¾™s{fÞ¾ÞÇó£“É>_b¼?eíïÏÃæ—®OÏ[®êU‰‘H}t“|³®êÓŒ>EÁPLÝ»ìw¸ýûK—«eÃRúîP©;¹ÙX<{ìÃôËÓª’x½}zQ}¢u×ÂÝ®$£]èÏL,õœÛûçÙbÇCÝ—„&•Žº²´´ŸØ%VIeÖ}8Ä™x¬2õ‘^[h·®Ž¶!g * àm è‚D‘{Ô"Vu¢R4EeAbtËlMÕþöFÈè®ÍÙIÊUËŸ%1…FhE;’Àö©hM£;iJÔø²aMÆÉJß)gïc‹»GÖq•ÎÑ"±ë!7²ÚÙSŒ©EÀ(<Ç=®}çÃâ—õ5úk¸?ç¾7½ç¢óXÿž¢ÃRãÊì:ÕX™¡ÎQëþ8v¡ö ýó¨ÒÞríòºð–½HóÇèþ¼¦ÑZ:ï^¹fªw0Ž­4ªÐ¹ñNFŒU¯Ò(©Ñ$ÂzÝD‘(nóÄÌ6•]ú`ê$hK§’fHYE¦0VlU `@'HF…Â:,%)J0*»ö,`Ý †±†ØJÃa#Aâ ÁiGØ®¥Å. Øa¹½Ò(×S aŽÍL¹9÷c˜ææ=íoÆ ö㬭%×cÐÎ5–oÅ++ÜNO|¹RåVVâN4†§»§ÇRÃôÉ8Œ_ï>‰Q-Ù§ºÞØIÚŸ?TÐFgSŽ{HÍc­äk ûë—­§Î3%ã9Ú×ÝÚ ‡èt:»Ùífä/%uš–¿©ó‹¨\9yzú±9ýwEçúÞyÞôÐ÷ˇÃÏí‹®ãÏ^ëÚ¬ß=óqc}þÓÜùmíð4宼ºw ”ÍÍ®S˸˜2ß{¯ï¿×•‹§ÎÇ« úTgþ9žÉñ‘äuüúÜ~×Ëä·7ü£yŽ™i?ÏŸã´œÍÞèlC›v¼{Ê^ÛQè®õ½W®õh^O3ïÝGù~^®¯îõëÃŒî*°¬–(jtdYÔ°v 'e\:·ÖV Hu4ˆµÂ €Z°($µ%`,¤…OŽ;ÀŠüb xT@PÁ£BXÈ3YÓI e@™=2œgÅèÐó΀¢£1„GÔãÙûSå±€&€ zRéƒ's‹Ð ¥*m@À UyHªµ5CVèYu# I”Z¡q…ú諪ªÕЂMA¨V-€p¢ B`*WÎÉJÙ²hë# °1ØLUMQ+@jƒ‚ªÕp²¢žÉGÏêL NÍÈSJ%|¦àÕRƒG]}ÊÈQ×J#–ZidS‚ ¡Ô Çhã‹ »ªJžzãµHÁ™:DXPYA…ŠÓg¬â¢«ï0î344wÇáÑ;,,\ÝÛÑë–w‰çíÙ÷Àn´Íî+qÇfÅ(ŽùèóK¿|ìÚÎË<Úëv › @B H¹šY“åhrKA$à{õ÷Üq8ˆ¤s%ˆž…™Ëæ  Œ™YÏŽô †<7p§ú€Ö=€X ÂaãßÇf€”¬ŠZÕŽô½0¡yWzš>ŠZ70¼Çî†ÍÚ|ÎÌÈÁâ10¦¢9÷a寱D§OF2 Dà»d)ˆˆá£Œ<ØH­ƒ®z G“i¦ÚeG Ò²Á2PN0Yndßh|"ɰ§çô œ,À&™d²Ô0DšÇvYÇ‘÷´4Þðõ¡ÇL$Ü8KÈ)HJf. i¬0pºóC^ÒM¬sÑ8='™Á)c¼H)°ÅÓÝÓ~>´îóµ{Ýçu¿Æpæ& ͨé¨E9ìÕ&m †§0AN†tàꊃIÇîgÌ-£›÷Û,3)ªTŒÁ)V j£â´‡ 5V°3ïÐ >Þù†ÑŒ ¼?·ªºvcFÔ—9³6G0/ß×÷ÿË|bx^×ò~vTIÿöÔ…Ô^új{?š¨`3™Eï« ç¹YÕåÛ ÛýùÿJËû©ýð:Æ;¦dµ½G_ Â}ôÛ:ÙÔÇô•î9-•Côç¨éÖÏN¿°´̺Zš‡Ò,ŸÝR>Ù‰Š¸5ÂO˜ÄtŠü²::î«ßmm¯~6Ü€™z‡´÷§‰vÏcÐmNŒFÈAA×m–ÐÁ0Ìt¹9ïòºÁ·ÃÜô«ùë¶ß;ÎëÓùtöâêqYYßç{85ˆooýô ·ÉlÌv¡b¶L,‰JQ:]ÏÕ åûÑïŠ*®. ‘uŠëT—©m9®Ss/÷9Û8©54¨B,RÌíÄÝ|ÑÌ>ü~2}ó_}ÊÛ·ÿ™uï_ûo¯[åtråy½™ãkuûœk¯û¯ÈnîÏ/ðó—|Σ¿z‘nÔmÛP‰aZ:Ö† j¢Ô XHÐ (P5ðZÐÔ`ôdÏÏdàHb Nƒ„ç<'`øXè°ˆµ!lõà$Öƒ@0HÀÏf¾õÆ7 $2’N`Aá„ §@Ž711 i€·Ï^uW™©±5G¬³'³$–h—G±Ã×½^áçOÇå*ýdž¹ws–üãäyüâû_/óó÷yLWw=9ÇZ¸ãã{oN>·É÷y”ÿ÷Î1z}œòí“\?GÏtkÎé¸}Ü©ä§x}*ŸéºƒĮ̀ß_ì׿uûâ®?õåk7üZïó%öiœd½:çpåÃÍX¬º¾ÓÑdœ¯ëêwËÓ¼Ñí1Ýd½ˆù(«rÍ뎶öãk9_;Çlël8'×ÉDI+„jÇ¥žû¹äd Ùz‘Z6ãrix¨Çbc­^¥rKo6·NΘCuè-š-»öÐKÚ ä@¤HRˆ iò‰ô@¥º":ï¡é´m«I$*%C^oIS«œXà°jYÖ)fDµdÄ j›fpÜ 4¦Ý~-¸œ¨0ÛAKë{ *ÓÛT;Æ-q‘VýRÄÝp°ÙÛ)Þ¥· Ȫ“kî|Äv¢Íµ’·ãó”Z4‘‘ÉK•·[s9=ô&À@r°,ôò(‰ë²ª÷q{ª¼ªUÏî€tPrn±sm‰ÓØ93Ö¹Oþøè¬]—ɳ®}Žê'‰èWc!è´Ò1ýôÔz¶kÌÆ²«áxx†{n‹âp}x]…Õ6cíqëVZ)¥Ú„е¶Ù”dN‡4]Ñ¡ A3%)Ýv9‰R&cÖ1ñ Ý¸Ä#v=ˆA’%:GºÖ˜I§#¢H9¤g<„F^c“0;jõSV§ÌQ°P2q í ·âvŽ’}¶ŸQdtœ[ßÉ—«ÿªâ;ö‡¥ÿØLÍ^mç±§í|î×Þ¼Ÿ¼­ýñâËѽßâut—&®1}û,'M÷Élë$„YÝk½±öا¶ÎKß=ÏÇáý˜]ýµ"¿^Ì[==æe/¦ÊêssÆdÚËYv•üÓv%¢W Þ“nÂÆXÌ3ü)ÝìÞŽš»÷8ßçæ¹öã ^ûñ§wÎã<~!üÑ<~û<óKx{‹ãûŸý§zý?>¯¶³ëyMä/'»Fgõ]'îѳöûdù“ér/¾‘¯_“ï ®Û¯ÏrŽÿ‹ËO’&þ¬âݼ¹o¿>×á÷o¯]ÏÝï¯Å»ò^y¢:Ò»;÷=äJg|¾Ï|Íoºž´—Öÿ|׉Ÿ·ošsO¦Ï¼óðëX³¥*gošc³È¨‡£5¶¨[­®€‚d–,-TÇå%؇BŠ*c±<Ä3‚ E~ü»Bœ\}Ü'kÔ”ba!@©ì¹á=€@ÃjJª` ÊŠé™VbxÖ ðàï <#m¿ÿ݇$“ÄC *{Ú"8ž} †³| ÝE¼H ,JsEþŸËm¬áËÎý²š×á¿ «ŒA%°©ÞÖ’ãy]g`âhØÅlÆ–`#À@>0¾ƒJ«A42væ7íØÚ-3 M¤-à†"N¬ XLB€V&ÐlX]LËE@!aP¡4$qˆVb+m#†¥! ÏySX tN/ [UÀxñ£E!5P(çê B;J¨O™E ‰…,Â" 1↋E¥RXe”L¤!T°4iæªHhéXèµ{ûNñ(GpV{3Ô¨Q° ‚È2t }-Œ€\2è¶Þñj'gÝÇ9έúÛ«@cøI2jxK0ÄÌ•˜Ä"r¢2|0ŽÐÒ@(¤ðÅØ3íF¦+‡¤†B0‘œäÍo ò9e'¶¨&a(“È*ŒEL& +9³ jQŠ˜õz+ ‚@¡F\¼m ÛT9iâ,I Bc‘ÚãL…¤@ƒè¦ž8Hù„îVM5Vƒ§`D LKtvMkbÃÂA“iÐP:£²I Á€Îš“U£0*Æh€°H}B ‹!˜@MJØz-lk5‚ÀÀš-K“ ¦ZÈ.› ¨†)U1 ŒF¡‹±ôLæg´XËQеMa¤Q€èù¸¯°q…ÊPQQW‘ÕFqÊf@lF›-¸D»ƒÍPv²Ù˜HÆÜ4Ęm‰ ªAÕ[2FÀó²ÈÚá‡kN‹6w¹ N˜™M •czm-Q(”7÷^n,Tت4fn d,hô$jFÉ"à¶>»»£5 îÜTcön¼1½;.7<òF¶/8î1|¤ÇÈ)¦Æ,HÓd+$ ‘dÔȑÙÀ9@N[ÈX3téÜX²á\5€5˜ŒXfCÌzg‹³ÏS¯¬Ž1ú½žd’aË$@(êÁÙXEãKrß Ülû¸õn}>ù %{¼‰òb™ €|ÏZsa%¼[ÆEÏ)¾:IÒ :ë]öD2Ceò0pÒ?œÓ1YÔ`²@óA* ÖF¹å÷€`2B'›æ Ä PÀÉ Ïb9¤¾Ž>³_¤{|¸¹ èÁ4Ê$Œ ˜”À  éjjç ú>™éA~0òúû @§ƒªß¶˜[Ï ¹¨l8cÌþC¹¸ôwµêeï‹OlP6Â÷œBÒ mCÛðãï××÷ýìðË­ÈrÂ$ªCLH]ü}y fÛ³\­@C*€8¨¬"¸ NÁž\G¡aœÙ®uÝßk²5ûíÿßüÒ$¤½Ûêó]÷åcÏÇ?ÙÏW)¹Íú |„õjqâǰ"ª,ÙõhêÒÀgüæn?îóMvÒ‚^¯×¤çx˜ªÝ—Ërc%I§ºý¼9<ýS[{Ô]Á…4íW,—6ë+ù± ê#ã2ŦÀ¤)~Y¦u†¹YGq² ‡+¯<‘õYꌧþÔ­ÿ/³êhy¾²ÅBa«¿ïW¾k߬»Þþiïnà¾ûm±2\xà„ÞS»K÷׫žÅë…[5GIt~{;³€ke•‡«‹^¦‹‘Qp©qp¸62.4"Çê½S=ôSþÞiFFB¬šsÚãþ¬ú3lF#«9Ó™Ž*ô@V6¤€Í$•ñ Üsx]õê{¼)×<{¬nßÌZëýô{¯_ýžÙ»vßÈ·^ï[ïÇ›Ïý©ÿ|üX¿ÿŸòëW˰—(̜穗6ÏçL½À LÏ™v(«ü\pi˜zLØk\q’{sú Ì€½÷I8Íòé ¤å鄃é´4!‡XrÄ'[fïåÁ–76á"‡I0|õ[6ˆr€'Í@‘0 .Ky»-ëû=9o}ÞÞ³çW‰T ¦ŽpAßò6á|Ôßît¿Ý_“\'Ówùþ1?o¯“}¼2¾–ë…¾öbnfïæÜvÝ›d‚‡éa³îãg› ÓÃòøÌËyY¾`®¸þWúüy=u~]ò¶é#düö˜òCç3×í'ç&Ûíýù~£ÙÛ5ÓazR¡3¨nŸjÕËp:Qi÷yn¬ùBs9{ó+?æVšõíœsÌF:ö‹½SJá³;Oýî‰&nÅ'ÊÚw¢Á:t®ø\KèñúÏÛõôÖ^ºt`%Oˆ«¡*6 !¥!@n¥´h¤:Ä&m±8ZÕ Z5!ÃTÎ$4qÛq(:Š­”<¥ 7&;aµ~A±¨Se6qbO¦²$7RÖ,öi·]KxZ)š;.wÒíª”Ñ¡¥Ž£R—Ǧ_Õ¶ouTñ5þmPÆÖLƒçÒ{U^ÙyÜ‹Ôùá\Öäµ—  @@¼ÐiÞ¢™Ç~|/ýxÄÇ/üÿCýþöÈùµ7sÒóA0 m›­A‡3K{ë2üRÕlÞ|ŒîÒõóPÏ̟˱ñë–t—VÂZå´‡?ÀÓ¹ƒ5êÇ9ªëH¿(^s{ªñ?âÐÑì¯ëØû’3ÖþÍæç­´egÏÑÅ%$Ã]0|vúÙÞˆ~ŒÁrtÚ™s|¼u*íÌqKpÜIЉŠvS‰sP;M¥å›¨Ö$lêÊ-ZªFÍ–²¼Y¹~¤}­™¶ræLóÐÅ´ÒZ³œNéŠæ,Ií“ݦÆç„êbT9S®tU’b¤ÿšáŽþ±ÅŠþÞô‘WçJÓòŠM|F³S?§=‘æØïJöXøW¼Té?ùÎó1ÉcÎqyÕg—ûžÙ¦=°+Vùa*Šö©¨åg·òˆ¢ûnkÛî>Xõ‘Zsp´Yw©ýV’-¿;ï&{L‡ª¶5™]ùóŠNp_×IÓ¦—-ú²‡ù¯o×ýäø.]bïè·=ÜUžŒ~²ß¹—|ê|©êZ_x§ÅO%?kòu_3õ¿^§·u_g¿^·Âž7cÖ3gèóùÖûxœ¯/ö_ÛçܽòÞŸlÍÞÿs6$-ÜGý=Sœ¿Ù]ïžýïÿÜýëÇ›¿Ÿï½%gÙ>Y^¢~WâÆWóëOýñ\ùµÒÿ~™Czô¿16rwŸ÷¯»>¾óçkÍ9Šw_« ûwû‡'~¿ÅùØÛÍî1 ›6™1×°{—\Õ"‚šQKÛ¤À{zÙ\ɲrö5ï´“µ6T”QI> R6DÔ(Î:ÐZ#¨""ðh@ ¤0ZÏšœµ’h-E#–*ËtÿÔAòPYÁ ˜€à X4Àð¨É€úK…‰ª€…B@€@SÐh1À0Ú°Vj‰ µŒ'™2]ÖÔ7÷?ñ+&ÉÙ¤óz¥>•Íó¯gçgޠͼ·í¦¯å UŸïígvvu:^óNߊ4üQ³dO®ÎjïýBÿw{á÷%D@ei$P0a7w2Hé ×¾ÁŒòVŽIiØÖ]qÚËz‡€e[îjTvy 5í€xÑje1œ §“†4 €,i°Z  h¤x`0mi„žDƒ°žé½-¡ `¨ †Öx^µasFPXT,˜3¹˜…8sBB¡("`EE`—pJEuŒûL†±WAT°LÆ ÀJ c\ÐŽ(*.µ7#)q5ˆÇ¨ %^¼hI#¤UW]kðÁJ"LAfŽn­~ò(Éðç8Ð\çÑÍ;;Î 2#­'Ó€EÙˆ éÐ.gø ¬>VeFLŸ€q & Ó@$Xðmµ*(0ˆ¾p§¸z­Pb!°'Áh@ š÷ÅTÛDM‹ÌE%HbÁÄ[gpX’6tÕSÀ "¼$õœF‚²äI«AÇ#ÖDNM$SÆ”¦²ˆ 4 *–*Fª&Ç„v±) Z ÝÀÚX‚ T¦6`Ê%K)4Ä#¢Ú…–I#0Ftn‹` ŸX `¢‰Á Šq–!P ÖDð€¨°I Cƒh¤ÐP`m`ž|> Dt„í`!1¢Î¦ ²$rŽd¿Ç¶)\_f=F.ºÅ À‚ù?rûSUç*FtÕÿra,XF¨”÷? ó™ PÐÖÉ<×b•£J‚t8˜€Æ™p\ '“‘F®@áÉôÁ3Ñ[¦ô0%c."# |%sf2ød.»€$ `v4«Š²Ý½/Äë\Ÿfš|Œë‰ûª¼%­J–YÙƒºÙý¸y¿þÙ>.ͺé3³6“ÓÉÜϞݖÃt×9åšÀ;çóÕì;ùÜîmOÈîÉȯW÷×+=Nºv<½ÎØÃðºlêy»Á*¬ºs™oˆõÆô»ûõ|þïV°Ÿo¼/ú˜¯x;ì·JGnk7L9Õ`u݈ª¥Ð$“ñ©é)»e€SÚ•­l%›”„NU÷óL«úಋ\+¹Û- º2‰:¨ØuoémÖî£=æ›Í¨fÝ‘üÕ‰p–.R)…F¦e´R[!ßTÅÑ©ñ+gâ¹£¨Ït ¸ñ¹#ÃNˆ©t%qÒ–” )-B¦H ¡QAä(w¢34 M€ìºX÷Ø.±d¨Ò±¡’Æ%–4JìĒߊ‹‰ÀIöÌ¿vz¯ÊáÒ|IãÊ­õÖ^/FÏf4ókº['®ÞøËª#]‘;ß©Ä@ˆÑ½oœRwVÕö/ƒ‰³g´?M¯^£ÇÑéjqU!Y¥ì„¶êZÙšòOÐXQ¡Yë*SýÌ"R)ûdç)s™.™UôH*ÔLSvÅË6Å­í»óYůÛͯ{<ÙæÖ5ñ·.H÷ãµ?_©*¼+]½Ææß×ìz·WOñS»ï—~¼±ûÌ{•þÛòÿ¥î_cå¯5¿ïÌÒàtD­\{_ÕÃ++zÈAÄÕ£l;¶3Ø–›ÓªG\‰ŠV™íqÒ›oIªR‡u:ÇYjü5 tÞ‡‘kHÂDb}ªw°ÇI[²ei(BĨ¶›\vJZ&s ?õÝ|ÅﶇbõFd‘¶ò×UZ{3ò¹·«±¥"à ä úd§vs´ïö8yZݶ¢U†27éáŠÎNfïÜ÷ÎðØßçZ”~%±E»È°ü…“‰›nˆ×§÷:ãÎ9æ½en”'Ÿëp>Ýî:ÏÎý†maW"ž‰õpß‚}ÂGygzÎË÷÷¹íévLv¾;¾È×ÇtËžƒwþÖŸ~ߺ_÷º¯ê÷ýùÿg}ëËõ>†£Ïó Çôe¹ÒäQ÷sžUÞGùß9ìóüÿñûÖçm/ï³ÀËöræM´µÁìèaº6¦!G!¹giŸ$c@œµs¹´ú¼˜D?Á¹Ä¥}]¿\Øl (ãh^ &g\hƒIÀ§Ìé‚…Õ«A+´¦ ¢šz8£®IRƒÂBU …Sµ€êiVezÏÊr¦Ù³!,¥Õ ­P hÎ’6\LU<1§²r>XX!À ÀĨÅÔ 1l‹Ô¤´à†¿ãß—;ÙŹ‘i;IrhòŸi¥váRâRj‰ÇËé˜íx¤^®Þm´îžûN¼“£­P4 aàM«jÍè[.#Ð0&ÐFÅýïöýdÇfo,œ(XÒMNŒÎW C2·0Áä"'+³af®F±úf k$‚@¦r²¸e’஀ÉÝÔfŠqe´ oóF]³ƒ§¦Á¤@[™!$«)2ä0­avu“9kôðL9AR®ÕÌ MZ™6jPc±ÓLâj ”S¤Pmte Ea'M‡She¹;»Ç¬+bcSi  N <§SEF\T¦,6   %ˤq±Bµ6±÷²Ó)q´‰H„Ê™|&D€ÐÚŠÁ ‚¦ÚZ5ÁÕUA‚Z ŠVÂë¡ÙE‚ÞI24Þb…644¨™‘!–æ`ƒ%Ž•tÈô‚ÞÜdF‚¦5;›l™é[« 9/Á±[HQÐèlØÆ0ÜPP™Hr…x“€G†izëiut㈥EÎÌ,t72@²,ˆœÝ„DP“¤¤×ÁXYò-0rpJjÜÁ¡mžo¼KŠÜ^À ˜šo‘I4 @Ò"¼FS]²d`,Žùò'#Gò”“I 'j"„lÙlI”dØÀWΙ5l2”rÕ«’€A@¦‹-Æìèt2‘€Anêo'êHLj§˜óh™ó#IÔ0=ƒòN$ÈV"Œx™®JÐÌ„²’1ãP¥ '¼p}‹Dl¹Ÿa­¬FcÖ#(:å*P§ê]zéaµ¤•- ʤ[öB@G¦ù\±|@Zz„p °e€f0ˆÚ :(içCÀ@Ÿ’Œ$) ¥ä;nÉä€Zméá$MP7|÷ëiÛ©cUnãu½î÷æ‚ {NepÖ¾>‰!TÖb*jFPXLU%P€µH*˜<Êwg¿–û¯”‹Î½ØÔ€]«g¼Ám{k™= ­ì¥Y_~lÍ¢ÇdI¼¶5\íóây®ïI^îŸVÿëŒOÖ\Ì'í¬Íïæ]Zšmu-g7¯‘JÔÝ3YuäÈŽ'ÂiÂAò¥æc£ÍwŸ¨ŸZ½1‚0‰¼Òøa²ù0þfÇûñRìͼ¿Ùç*•ýüükÕ~ô·Þ”·ŽOý×ÇivcçÚ䈜G ZÒùªŸC:îåÇêyç[ØJU¯×–ªýòQ¬n%÷æµ—¢+X¼ví»}knŠé ·JvÃ_Þ 6R¼×ýîjlý1&FœèqïØøE\¶¶)GON 3Ä3fØ©{ÅÙ?eÜņNoÌ–­ëLÎP‘ ôW‚û5—K)½Á»Ã܇ÞιE"…¬K>Íó¸÷þñêuìrLžã\ž“¿ö›ý“øzN_»Ö ö!Éî#ö…ò}ñpeî ê¾#ɕݥŽÇ‰Þ_*A€ïÓMŽÄœåSx+ÙnT–«¬@‹P# €,× ÚhP¡²0“ ßFs=¦V›Kå#L“Ò _HzÜ‚@ʧ$$ CÔRÎÕN6 øXÎÈ„ÌøÝL¬ÜËåbCÃFÒ–ðÏ·ŠÛÚcÛûw¿Ï=x²t¹ÆÞaùd¯'X Nå­r­>gÞ(Ñëû™'˜ym9³u³«Ö£´Ê9ëÞ Ø·h_¶rÜ›¹ðmÕîà@DZ5‚Êi`άá8ì˜^jÛ5†’46Ê-Î*¯ ¯™&ïô,Ï;¬ Ëî¸ã¥¢:³p@QÅѬeõÝF5C§µð²×P­¶k!X½ÊDU-m¯J‡(VýRi» 9šSæ¹ …Ö5ÆVt³‰£x•Où¢Q¤凾䤯‘Ç’½È jËYv5p[Ù ê,yq»0'ªÍu(Èãy´i÷Ù¨EE¢ˆ×ઠÆiw²=«Vëî3´ˆFW ˜ÔÀƒS6› “$§íZèT¨R«iH@á1t8%´ƒ*ÛS×h¥»_OïœR³!~ºf/ž¤Õ€"lÚr=Él“‰-õKôTþƒE@b` ä#BEà©íg$ç_™ºœ A½™¶ö:üó&^süb<—M‡mÇ6çÖÍÑ8ô±ÛêFN;4 aüÁð6Wë”<Ù©J3Ri˜™uÕ«8µVügÆÿAsÂJxÖž÷;26îÑþ£ã«’WÙ¸Œïœ=|ÈÁþeý«í{]5ãàý5¬ßi±+\Su÷{®ž¡‰Q=ë¯uø5†Ï>2+Þ=ÜŽUNÿû×ö?#Rí‰;6g—jF±$‹/ßOå¾Óxì<2×›ÈÛ[ìYж?™ÚøP¸Ò­sÏ\±Dã£ñÙŽc«WkªNyŽ™G~î•ßÿþL†ØxèkIE ¥£x’ É4eˆt e»0ÚYC~¯â¡ó:• jªtmowi¡]9Çx+i­XýXŽª}U.vcÙCNS èÄc õ×ká9xÞy·Q¢ef  kóŒÂÊX»»‰ž¸(žÙý8ŠKn¹GrÚ™Œ˜&¶r-9uœ–2¬0š‘íÛr„ç˜NƺÏäí-¦6§ä›ßÇÜs“>æ“ݧAç]ÝRoåmŠãï« êÄÜ›gïëcÑ%„ÂJÌ™žÔ„X.wK[šÊœ¥&ˆe(€ÑÖBD)Dbµ„ EaBÅ`JJA3IðEÚLš îÓÄý<¡îó~'1UZUȱ:nÞŸ}É×u:— ö°aL'TSí—CŸ{%©ï«7™‡%¥ØÚI!d°qwáyk Þ0§Š $àjû Ш‚ªDæ…(AC R àé>„.ûízÝçhrâtz)˜+XÒ4”h4¨XĶ(ê™¶O[®ûÆ.Òͧ9 Å®dMËÈxåüÜi†¹5Tt§Ôy×o}÷½ϓӷ$–ˆ3i? 4ƒZEƒþD¨pH•ˆÒæäU9¹ µ>€®"XTðÀþÀªPJ…VÑ–A„BÀ*,óQH‰Â* Žg'#e J €jP€Š¶jU Àƒ¥†¬Ó¢¤G„¶Ý !Î ®L!sf0åˆRf,°¶±|‘I–OG‘‰±¸ 8œÈçl€“XöÆd4Ãû:ÞÓ+‰rŽ”Ù P:ܠÓi3M_ܽ "9E »ìz˜ÃBÁÆ`ž*^È‘À"5ÚŠ*a)ƒ…¢ç BׂÈKÛ¡³¢L ªÆÙ$ÞЃÊD6Ä5•ɵ0@ÆÄ:k ÐñÎŽj|Þi˜Î £B±È4*ÑŠÒ¤=.À¾êÌ/£é¥ð ÿ¨E>‘f§G8½JgëÐ̇= ›5Š•sà îT™6f öìÍS"Ã2ˆ·ƱwÞÆz @z,œ.š¶aaØZ†ÞÓÐò œ»6•÷ˆæ©ôÅψ§„´$Çj>?O„mu\ºÝŸœ nd6ßòûAr =Ni»§d•KJƪ)éHÖCÁlš €[gZ…#‰%‹g -Œ#bi€‰ ¬=Ñp‹:™DMÛj¯®BÅ¢yô”ƒV%cùôÉHz ìÐÊw/oF`PråÊ‘or” V6ÑNB€B"ƒæ†\>N e¼ÃÿÏ]L½ËòWè0!H"@½V"w˜jv“È$AÍ$ÇÆ‚FˆD-"iÔÓ™#áôѲ"•á¿Î"?$“ÁHÉFÄ ½õÈÔê3B`P,O,0±Ž@r?®V‡£øÛíÈÇøOøaRškÔHưd-¹z^C 7LüV'éå ŸŠ–{¡ ÌSæ’¢ (7jóݯàÞ¶wpR³…Ÿ_+oE¤6»Ín;ﮪp?åGÿo_ê¿óþü4>%OZÎä3,IV‡@ETC A dÚn»óQ™½ž[Ž9Ì\àË×u†ˆ²î²Õ2Ñ~ù^>°¿l®ï’–\ÿfôùÇÆh ]¬4_/WÄ*ï ÷½% ¹ýa øMP­#+dT%ßo-ÇÒ9Dêt¹¯ý?<¢qº‚FÚhD;êUÊÿÛÉXëWøó:^•|ʸЖø8Ý®?¯ÞwfÊË|šŽ‹¾éùÒ~§¿½ã+ƒ´kSÓçõ¯ÿñùô?þühsúæ=ÎI‹Ï¶ö=™Y:t¾åkg÷¯ž£Zzú2·ßÄëÝ^oÍ¿Ïãõú›š§ª@J1b¢¸"ª€Å,£èr®ÑbÐtoÁGhúœž„‚A- eÓL‰ØaH®VŽ˜5|28 j’ cùH€ WÏ<—é˜'ÜBä‹Ñ‘&J›þÓ÷[«!3»¤Ö¿Ý»ºÿÜïóíý×ú¿ý£û¿ÿ]¿/píåÜÜuëü?ÃùÛÍ×qpÖœõV_÷óÉu¢œ¸ó!ÏO-?äŠY·šŽ=Çž{cͱíÓ‚îªh?‹fí´%á¬3ÓÉ¢Ë2—!´#¾o»fteÎQ`Ò´tÀÌZ°Æ£ýêÛLó®˜øZcŠö¬Š‡­h”@`Ê8j"[¯{ÚË­˜#Ev›‰K…+áP®º•SñºbR›÷æz‹˜Љ!DTÌmÑ.âN-›tD˜˜(˜ÌñÑâ%¥dÏBWb¸.Ô™˜D9ˆ±…cÅ<‰¯T*a;ãK<ÔÔN[¦e`nGZkÕ.‘¸ÅJ‚‰2'“%V;HUm)ñÎëž %Y³‰Ý m£ØªìJFc {m¤‰0´6¢–ˆ†&™<ÍÓàÙ[³Ÿ2^;vŸZêœöŸ{Â-¸¦ Ö\ÕW×›M|ù»rë©X%|^ç×·…/ïý5ìÉxœ0ŠS!Ϫ÷ýþç±5ŸùÍioàý­Zß÷²_Kåâ’#¸kc tRÒ½ÖVoÑQL{µ³œ–mU>a‰î¨þ»“—ÃÈ„úŸQ—,¦J<åˆn2‚ÿŸ2Þè‚ö»²êàÓIn›j¸ÎV˜ª¥ŒõÚ'yxï±ò¿ÓcQü-î«*ÿ®­³ãj‹Êa\ûîêZÖÏðÞJaG'÷6§ÚÏifµÜùÙÚ—´¢ðxÔiëÊ_N7ÑV8Ô§ç¨Á^zΉö›o6[FÇ…/n§'÷ecÕ” Þð‚µe}/fuzw0¡y÷žÏÜzý²öŸ”–øªÜ—b²°¶ñ ]„H¶¨iÚ¥Zp[ÏÝ/Îrï»s÷-º€4î›[œœj*Úcú}™¢Ûm•bÐëÖ¸­æœùË¥\ÿcO\ª]xlEF)Iãã{lþtuZxD…qÜF¶[uç´–Œ´Úì͘`°‡­×”'ãÒÞZlKꘗ5Ü'ÛîdÔÈ«šsWò²ÁÕS£9ZoßÙ·çò±ïÍYsŒö«\{t®^'Ÿ ~ßãâ™»g¿Í«ƒ¥ÿÒt²6¿X­[¯×WËGY…fBÕ®A…·vXÎd^‹ÎÑÚ“/ëÿ„C³¯ù×b€´ß;‰nt½¥6Ò8—÷¯çîÿóg•û? (¼p§œxsϘ*K ÉÆ„–Ȩ@¼² * $0Ò“81´KÐ:«]å—\EôÓÜk» ¼e \)éF¤ (‚òj¶¡„ƒ¬Uk“ Ã2PkÕ¡ MM!’¨Ìu.•«Û¬º€mP‚~ðˆˆ³>a2ðFþðùÃÜ´;“7/÷^õ’W \B2(Û–UçV>dÎ$©ž¤OõÒ6XM`áB»ÑÔ†•Ž)IÊI™¦·ÅL™°OgÞŽrž,‹Š˜·áêhòe®óR«M¶ B$®î‹1î7o>6`"l§k½LeÙ õý´‰’ëïƒ'Nc‚˜N+:ó¾Þ8I¼âkÃMVÖlÈ4 \W^ RTkªì¢Qq@è]6Hnã Çdß“X×*g•§“€M" ©f%b¬Ð`»“ÆäJïš—l#46Œ*‚HiÔÞmjkð¢1Gp:v*¦ Úw£>3O*©ÚiHÓµ¬$ªƒ§šª=†FPOùxºež´ž¤Ö‚SÀ(‚Ú êe$@‹V’QB@¬Z!ÊAŒå¯"$¶hD)Abê(Vè(PR¨e0¨‰{å+Ž:N+ˆ@=Öè´hm|ع쉾Õìy²½!ÐÙ#`&.G#)Ø‚ (Vïr ðS´5ôP“#¬."` ’ÏÎaã0}d»Ç|Þm´úEÊ  Šd"H°€0T®$­G¨ÁŠx+X@•ZP¢i™º».Y{šFíEŠˆ@IÒ”A£ln B«06D*SNºb"Êó6Wƒ)St‚£3“þNféyöÜSÃËìÙ¼ÏÍÆ¼Ÿ꼿û•ªgõìSAøÇœZ •F†+)(cU@ Ý0» ocòúfõ|ÿ7Î?¼ÇvÝ1ç7Ü=°‹û«ùÚÖÍŽÓ±³nWjúSúÜ_tƒ.kµÚùmçÿê§à§~ÿ[Ÿñœÿ{×û¼7¹{ÁWûÓÓ¿ ÁR8`ιíüñíWrŸíßâÿ¦/Ãÿ,ml6¢)j ±Þ E£¦L`ÆM|™/êÔt0 0û'gN\¾ãð} rw"µHcK<òå É蟉¤Cò¬Á’I&Ar ÓgŒC$x$$ZÎd_9€«;˜UEè¼+LÉ9ßáÃi0Šá¾Ý4?}öùÍV×™AÈÀÀ[P·v™d@‚å‚Éw17«Zt V­x½„™™x÷JÉØ }pÊ –p¥À©Ú·Q#ÄhÎNO6 ƒ8‚p2•3€ZНŸIGr2ˆœR‹†vÁè2CÞX8˜^+¶ÂˆH ˆd¡Ã0-XD.[ÿ‘9þÓ[–MšPÔD`؉ÖV¬#D¢Ó‘£Cø†’ MúpØ8íL“cy"¶“¢ºí¾W5‡`Ú«Û¼¹Å~¤ÕÀQnÚIJ†;´Ú²vëè|dM—”Òyr…ä¦Êi蓇Pˆ¡˜œˆ4Øf,Kb÷þïÌǯž÷³Ëȃť-uY~Í0*MÖ~^w^ÿü_=Ž>z•yØ#©t>»6Ï`B™‡[¿1«âµI¦¸¿žùÁ9×­qtu¾¶sÎy^r¤Ë©zmÍv}š^_sŒ‘Âr·*:òÛ/7ÞßþýO:™Ÿ½XùóP²â.I´”EÕ{¥+‘…Ͱïùýæõ¼ùýCÑ/“‘"T£äæ[Ì}°î2ž—Ž3o5Ç4œ§üO£˜_Nÿ9“™wßm<¥¡µÝÓ‚]…ëhç cÑ… ¬ç¼‘­ò²òÖJvT¨ý| ôê^ ñÇ@é·ÙÚ⸃éNís1uÓ×þÙ”ã•þ0;Yß­ßÚÔž½Xálúü.H’Ó•ø+?hÐk¿àOâ›ê‚Þ§÷nL§ÁHÙ­ëuÒÌè‘ê*­ˆ«zß²^^)Ùxʇ$÷Y¹àÁòøÏø—½gùãÞŸ7ý.*cS­â*GöJÒYa«)ÉYô{{Ýâ¯Ï´OÛsæƒÿŠ›E){¡½Ûã*蜃ξ›òJO²N´ŸN~t¾kã{fÆ6æ¾jZ³Ú¥™mµš¤Ó¾3L86ÜUçÞ¸™šæÌ½²vÜ»góMýÂϱøöÈIký3³˜íaûË^=üs}õN«³§‡:ØTÏnÞçÎ:’*Tôv–ïYïjîY„<™ÎYö´£®ÿ&hg§ó¹û‡ÉÛ¹<[&W÷¶kNí÷ѯ®•i‹OÄʱ°e¹¨Côµ¯íƈcÂX´é>¨ÇGK ´yKtÈ¡)`iÐXy;]DRõm – ìê•Ê•vö²§¡Ì¼P A…w=ÕC²«IšO¦_¼ÎMh»¸óôÛ“·áþÂr±—¹¯ó7Ì„ |S 9ð÷ƒIOhÏœõ0K߈dAX €’r µ²wqÔ¹C×°'Jˆ 0(-´ÁÄ"µB1ž ­Ê8´j²ÀƶY¨µ2àjeCÚeRÄÈXïU0€m.0Êà8b´86(SÄRC«T·}ŽB i°j‡áÈ“9ɦ.“q9sw´™• ›YÛ¢i¥²D¨å ‹;ÌNMûÌJ&Û1ãP£MâèLRébM-ˆ"©ÐjèFGÕp7»ÍJÉ‚I m˶¤A BÃŒà(S¨ ¶\#Ljs¶¢†kX sK¿è_Æ`uDÃÔúoüáýïýwÑ^¤*RÒ,lx¢IVÔDV0@ h´"€P°*­((€HP¨D„Lƒ ÐÔ HD% Á8éBµ¬€ò!eÖ Ô$OËìw©†"y0 Þ‚XžîL‚¸5x‰TQVãBÉL7& NÍ*GÉddÌh:Egf$¾õyìQ’GÐÃGFŸ n ™=|ÌœÀæè”dEÝڋѱ & 6þæYÐ!5ë$îja´H•k|#EMA)V\-©ÆÈxE,Á}eò”î4óîŠ9jìœ]úÿ ;û4Yž¿ÿn¢A¸|Ûè°êIãѿ߮o«ï¼Ù广>÷úTÛµ,†áQêó _¯¯Û}¿Ï<èÑ%f:{ÑŽÌF’Κ%V›B¶FK¤†åð4,ì»û=ýá|˜~góÛæ~Û›V1\/çû¾½_—{ÞŒö$Nß6î¯'?ÑÎ^Cƒ%h0_o\Ï6çüþö;;Ÿ«ýËÓeî³LVsêâÚf×ÿÛ}òç¯ô·ý…ümž…[ËÔHC”e½.ãœ#ôro· “wÚ7íïQCƒ @€É¤S$‘<õúq~”Q(€Xˆ`EÐ!úbpÕ`ø¹¬zÀÕª·äéàEH-²Ÿ3‚L‚H2Q’Y«§g@€µOL‚‘tr€ó3-a&e ‚šÄÛ€(”D1\ÓéÒA~2Ý3¥iU×ÙtÜ:ùÔù)dlå“뎭Ÿçöã †E‡•€Aƒ€Š¡•jšM%xÌ4謗tÕ‰œ¶JlPK)u¬=ü;ð/ynY…‹éz6¾ôW( %%‘Õ¶;ÆQ9Ï×mö×<}¿qc£Î=8²}òsyÿ¹æ —ñ7ãÉÁc|Ù_ÿÝþyóyz÷÷÷ç¯]OïÛãµ÷µ÷ÕçOÖéÿGç‡þJŸ‡÷[ï?ïæû_ß÷ëÑï¼Kÿ|þ~{÷ÿÜŸKÿúkÝïî~ïÌïïí÷ù|ÿ¸ßÇÛŸ_¯X5™BÖŒ®óÕôUç{ÓϺ“ãܦÒs6mH‡ƒtN’ULK©„kÆ…™Î®¤ksΰtÈBòæ¶·Þ^Þ‘9ÈêR6™8 µô]Hts¯£ü³ö0!Ö]Gl84=6gsÝ}Ìm€¥âR#>ÀؓĩÓ\'ØEêS"S‘IP4‰”-º‡])ã´mèRRdì¼·™*îüIV±—Eú Á(n%ÅaÀfž¤ÌJ‚é¶Ahh:¯Š%ßÀN‘1Å:'q‰ °@Z³ØÛkÒAGëA ÇeàèvtIÚÌ¢†î“¦š,f71-&·ð,]Zfé–`¬©,'vù£aå{ÄÔĹÒ.ñ*α}®Jq.f^ç;—ïÑìr^•_9Þ³Ñræ»tøQnÝÇwU¸mŸkúíˆÎ;õªtš ”\ŸËëgOÍûä?ÙüGÑW»|?ÎófþßYÕ†:u¸£†ËÓ/¥o|ÿñÞýöèO™¯§Ðì×åé2ÅÒ4žÚøZÖäìË‹só¾4©†}g5hé3lñ¹ö­Ü#Ÿ2#Ê :?¢D¸7‰¨¹ÞNÕ}ÄKQ£Zq+VÅ’Ûl“Xûôö¬É:ÉØóÛ&]A^¹‘žÈè®óг”²ÜÛˆ%YP@§Þµ®v—aT¾a-ª„1¸‹j°:\—g­Å[ªZMLGõÔq´šj¦ç“¨²¥Y9ê(Ùij¤E³#ŽÒ¨9¤¨DTˆÇy|Ïí/oHR¼y½';IUIÛæq’Òv>îˆñÒìZŸŒ;†vÛHÊŠ omuÄ[ö•®Œû­•î C\{ïóçªÏÛÎstÎXâ¥sq꬜eÒu˜Q§'-ÒZò©½Þ>_×xÑp\«÷1ßöM»ýNÛc¸·¸æ(µ CLÝѦdÁ’6Éqc¯;_o-Æ £©©oNc¶oè m£Q*YPc—b€Î6 h–ÁXÚ¤×äúÌ¢sì,´s‡iL©sÁÛâkÏ>-3IŒÙ¥›0fBÛšÕ¡­Ü~º€ï¯5¶a{¶lf³Öóõ`j˜P‹LM(= € J£Šò:Ësód–¸.‘xL(…–2z ˆ+CL[4²¨ yŠ(¥ £†[¹iT×iû$†ÄQAAÜ€haBTºxK‹B A+†³;“9È=牥„2 PÀj€ÝÚ§îÅì'&h\Ê.vÕýrt¦©F´­´± €†*†F}d 2¨h“<€¨^keØ=zÕ¾L: K'$L“„âRZ„R‘š7¦º«µŒO<0{á^‡ÎÓmÓV¨Ø¤æ%–vô4¨7µ™™ûTG÷Mm åkQÀ,Õ ÈCº+R+D†mŠhÒeÉÉ–V·¹+ŠA–ö¥ûª×ÚlLUÚ­"†397J ¡Fƒ@¡|t "( °£r^*  åˆBÏL«E‚² ¤(iD@hCP%Ô`ÃÔ¦”P”“ÑHÀÛÏ«3Ÿ‚eb0g" ß1Óæƒ×CSîsd† (£ §3ÁðI^Ar ¢½f”Ê 8rvô`qÔp(Éê @Ðd†!Ì8*ÈY¥K·žÚZk%Ä~å•ÝÊ«ç§Öcy‡vf1SÖußÞÓ›2]O ÞßL·Þ±ÄMßñ`î4ŒIŠiÖh°óý§Î¼>wyÞ–ös¯ífaÞÎ=„}ÆûüÍù«{yþô“ÅIŒÒ¢tÐ;i›·ûumöÍËÎGzæÅÏ×Ûk3å0jVŒˆ‘‘É´O_¢¼Ý­Ãfõ¡–ç_{ëvy|~ºp³sìóÇË(Ù_>ýòPÏmã¼;oï|}O™f?Ÿ¾Œ›s« %«Iv!hE3C ÇÛ'Ïq²×§4“„–ÇQã¶TshAÚÒG¡Üu¦F å°´½Ø Ë©"df$Kü™¸)¿Ç7ŸÄjèøÁÊI.V…t& !aÀZÕŠn ‘ûtH}ÝKˆÕo›·š!Sœzé<…˳¯Lb`ù@œ¢¢ÎÒÞ®ÆS¯™ñܯãõ ÝÞ~.žŽmP)d=HMASˆÓq_Ž9EÖˆx!ùúî.ûªþø´=øêôÑùÈmu5PEB¸“à‚v’Ù¬¢ÿ•­ê_ìÝ}†|¥V£ ²ÚØ`qÏ^þP^ÿ&zýCÿöG‡øÃK£O¬ûÞ¹zÐ6·ñÜŽžwcåÚ܉Ñé0Çt©Ð«pV«“)V?ÆS¼Àx*ymóg[4/Ó > fFqÙh7}«]Í3iÛgŠáETÚžñ¡oú&Ãâºoæó1¼¶Ç|3•W÷·.¤dÏúÿÿÂûÿë¸ÿá2éòéa禗XM¹2ý™õäõs³ë*ý9ÖGà‰îWè 4À5—ªE‚bE¨Z@^g›Ù¾¶§ú~m»dZØ 1OäÃgÿ˜ösû¹í«¯_þ¹ïýñýÞ÷{Íûˆ±šø¿þ×ýßúäÑýŠ$Ž0žýp?_}»ö…Íû÷óéý¯Ó_¿'ï¯ÿ«ÿÁNßÝu|ÃÓ{íÙþÿþ“ýϺŸüóµ÷ý¼ý~ý/ûû©ÿÿÚï?bßýÃþ‹ï¯êßÿÿŸû¶ÿý±~s£ÿãÇ^$M9f]U©ê¹¾ò:þvöºåcñºU5°®½Fq, (—jßV5J•e×2'Mwƒm²˜³§C_5Wç±æŽeϳ¸r;9JT:d÷]ÑžìÕ™Öš_c³ç}Ð9-Ýó6¡Î,Î1ÆÊuw¡›=À“al¶ý™…’š ©`"q]j‡<)*qÁÃè&mÓ}+u[Äk%Æj3êÓÚr¦S­*— Éð38*±eN½ÇTÖXŸi·Iöš­7¦ö€x×Ý¿4ÕÚÊêÓR„1K«fºDYN“:ÓvÜR!_*i;„ gq†1µY Rj3‘ÝÙæßžËây‹P÷VglݺÜlK\º6;‘ÖBW¾ ÷­àyZ]_oU€O(—Î4jT-kv/ù\[ɨ7U}²ïâI©*Z—ë×BeGù¼ççžÌjsîGìÎ{ÏÜÛ{c{ÉÛ/h.ü¤y¾Þ} g&ì)Oï%Ü«‹{Œ³»G7'27櫟uÆ£aÈUó¡öËUCv_¯Sqò«“vç¾JóZ?iˆ…ÔºY®Pu¢CÇ'Èíéy ƒrìýz›øË:Á) ñ‰5ètpí[‹A†ÕÙ2Õ\*ÒXö"H Ë®{ӒΖFi¡6¯VéÖ}·›Z¦­9LQÏ}ù¹¸n± ¸ä$&V*ùÜ Ç›W$’T.„l3b(Ÿ4§‚)ÊÅÕ˜¢Ô®¬Þix\™Xµ¯’jÍ¡”1¨£Óöãx“šó³*@ËÐTy<¡ïÙ03ÍjûÙÇÐìªWÒkKk+áJ~¿[ÈÀ9¶îìgŠ|X*m¥^ΕàiûâÎëÐÚÃN󣓎;â6Îß¼Ù–2\%§ä©­µKÕöÃàŒ&6ÖôföþÚÅ7ü²yEâ¬È‘KÛŽA‘ *¹•’E;e:)î íˆ7(ê!¸»²w~ýœ›ßßà¾o|Ï1Y&RÖvs°(8³6!kfK){ÍÆ'¦;Ÿ÷½}(nó=žé+ôÑ=§çhö™š»·þÊ™NÏήMrÿYÝCy; ¦›ëM’ ™ôÁû;OìÞH¯Â@;=¿Ý:sÃæ¬Óqÿìî¹½6ëò]ãµ/UVbÉÎ`+mO²©bÉ*-¥€ýŽ!AX"³d±÷Ó0mÒÎ^ÝÏôÊ>¼?þû¯=·MÿdHCc­kRÚŒ@¶qmH¼¡5tÐx®—éåìË!¦ÿö­œÅL½HÒA^˜ys¶ÙË"¢#& ÈYÂåP“ 4­° ˜”ÇD\XÀ…†t+aRAe»&~uZ#I–9èƒD¶#’(ˆ›˜Ñ ®R®AÛ`!‚*K -±*‚¢»I¦JØehw½ÙA<D„¦‰™“‰CÊ .•Ž@åØDêÝÒ\&£UiªQÒ£›t'ÉÕ¦eCfƒm6ÈBRBT2æ¨ô0¦¸Z¬ #hd*E¸ìjlŠšBEZóÄZ”®tF¡¨1rJ“B¥ 4²pc¥—e- ºJåÝö/¬qŒ›t«°šŠLêX&S’â¥;Ï}ÆÎ­Ãf6‰&©€V-* ˆbà ë”&q¤Èk”o;³NŸµÓ& ¸ 1l“׎â¹]Üž¿”vºâ2¶èËX“^ÆeˆV 1 N­ ÆQ!F   ¢¢z’3*bÁòÐ3øur@­ RY£«@Ô b8ùž­&§ÈP@è© 2. âégHpÌÆÈ„pÚÌyÄñ<ý[gšrÌ‚^™X¹™D½Ø—6‹üXÙÛëÌÄågÐwŒÓÇX[™™‡&Š×…ÀQ5ÀÄ`÷¾­¹•wG°á¡ÆnGD~ñ};w“c*’ØÙî….ÕÛ ‹Gd?î®ô˜^yÞÃÈî$˜Ò¡–&Äìæ$›ƒÌê¬4`Òk1 ™“{ûkëñï“íÜ¿âD×ãò÷6›¾ÜŸÏO˜¯ô©çX?ºÏ=‡ýâv¹ý4=]9¢Ç,¡ÍÑ›ÖÜ¿z1<1öÜ÷ܽ†oc,-_«s[bY·œ;—oOÿïÿRšI¦ƒAp[÷uær˜À·C2A¦Æ‘Ë7'o'C/. N<·w"œÈy"Ò3κ!“¤½ÕÅp‰w^ŒüÖçj’‡ ’Š@¤{Éä€84ôéq«[J˜–dz‰x®XƒLà RÞNA$Êå¨g@Hqˆé38˜@ÌLH$Ü&¨*&fQ˳î¡lŒ00hg]C¬T_§Ö³˜ œkcܤVΙHZè}D8&“ƒp¢$€)H8?V CI8W°ÌÛËÁjÝÈÁg·ô˜A2}K0‚4ÓNƒé¨Çädù €0‹ à§Óá錢 Œ0 K AÒ*/ D“Ó|œ  voC rb„3rCryFh_`®Rˆò|—8éF&Y€Õ)mÀ…À ¶ #<‹‰m>³V1̼ÛzI‡†d’!Ísc> x–( Ò `„@hO:wsž7|¼Ñ¯¯÷ë1ß?Ác—~üúpê³B¤˜!næd®Öƒyo~åó½Æ?༥ÞÛû5w£2[^Ü$ x?OoÞ­Ž^î­m³’àžg‹‹Ù%H@gÈÝw·¼Or\ûžïzÈÏ/6Ûê~ õc$”ƪÅBÚ(Âp‡‘˜Áú÷­¿¶Þ“ã+ÊîéfImä¶0‡úzÖa¯{½ç~xÕX —ôua ?ëÇÇýù;ï_ßìsxµ]awŒûó1o{[>ýáw×o3éÜ®úm†s¼#mnø‘wË{½ß~ë·D€KXFÂksÕöÒÿÿÿ¿ÿ[ãþqY›ÌÿåíÏüýýõÇw?¾~ðÏ]#fŒö²ï/ëû1ïõÿÞÏïö¿®1úüi¾òÿìçyÿþt¿¿ÙÅýõÞŸ½]ü}Ü÷·¾[Üãâ¶Ž}¾´´#h]RPi j®lÀ©okÏ÷©}ìdÛªB%ŤR<Š“:%¥Ö´·9 ©·{êMÑ´Ñ…öœ-{âc ;Þ™Ü[ow¡6­ M¯¦D0T Y༯ÍI§¹«­ ¢°^ë+áv¢5VŽïÔvæûL2¼–ªLäÃ:LK¯Ê{‰®4Ø*ŠÃÁn eŒºÌê[‡•Ö•Ÿ!¦\&ñÆëuhïZ–±ÙÞ¿¸ž…6þuÕæwÛçÿ¾™ûz&«¤DÇçS¥»¼½øûÿ9&f—L·äŒU"öþwÛΤˆ/~Ô~ìÍêQÖpͦ§TØÙšÚ&QU@ ÛÃ7÷­þ*û¿žó{„úC«’Äú¸•^—K'bEe¾Ú ß{ÿy÷¹·GVÕãþ}`­$¶iÿh™c5ªƒ3©ÝS}g—RÏžµŒÜXÕ¤r’L掖vO%þ5-üпjí³6Öš%úÌIͤ6‘ѵÊkͼ{㛌¿Fá:´ïÔöÈÒ÷™ÿN:µ<ÓSÕEuºº]I3ÏenþÓ{§“4xT&4—ƒ\ÚÏ,©B»»›NYÅz¸DR¼‹ÿdzje%§„”ÙÃÙ‘Õ‘8¬„ÂVBN{S~íÐ 1Òv'äT‹ž]j7ùšê¤qßVN«Mìn;£4c×'Óe‡õÑÜnTºSUå“-Ú S« özJÕZ2ŽƒÑDZühl&¯XëŒ&žɾGG­C °j9Sëö±²ÉcYm¨ãʶYA^§½÷ÝO.‡QS®.ÝYi]æ»ü³ ;ÁFÁj¿Ë(Qt"'ãÍÎk×^isoGžãîÊ…_‹™ÏîcF0¾Ëg—Õ¢„æN“”ëØl{ÏŠ—©SÔ:K‰›¦-ïÉy&¹¥‰1H„ýŒØÞ(PÙ(BôŸXÚ¶¡ƒä$|ÇœZϺÜÞãt;J~`NŒ©tÖsB¶y~êüy?ïÒ{¬Ež‡]ýžˆ¸Ý${×ñÈó¸;¤;9ô^ìj¦ •¬–­Ÿúp'ymö`ŸžÖõNKïO†ít;ÅÎûÈ©hS`Ò>4{Ot ‹‹zÓ™ƒtã v“LŸ=ìç0Óp. #t·&:ØgĬ^‡O¦ßç÷?ç`9Ä®{mì*ëÎ!ìM'j?µ7Ï’Ší`wŸþô³þ&½Œ?ö¶þ óÿu~{ÿ3öTLmm¶[$cl(é$µaŠk51Dh,ÕAܲÝz YµOƒ®ÓúC{ãWMg˜4§œ©5°ÓkWtEÁ†ŒMÙ:@ƒ¢i«¶žjìؙ͆,$ Xߨ×nйVÏáÒ-,S=÷c¬¡eEcº Û…7'êôï¶£}I2Ë-/"*mX©ë,&† ‡ãFØÄ³-½;vІv,+tíf@‘I&âSX7ìZd,©&{±B'Ñk‘RÔVaµKÆ L@jTkdg;h’‡ *³±§À]î®3Û™û´°áú¾KÜ@LÀzÒÍäË(…Âqa'ìÝîÿôûÌ©ÍeŸíææ•¬g.~b§­£Msð.[{ ™`qZK7Ýs@+ Z2æ)"îPÔ´P)'º°UIc)h~jmí:¶&6£“P¦b:©ŽTW£ô$øLªU‹KŽIbÑ4$…é%Kí¶‘ºiÖ¡pà˜```[¯ÐTÐÁáh¸IÝ,K ‹w›—!àJŸé‚—eÉZÚj‘@¤¡Á£@an 9& ÀºL˜ÄÈ©0°µbJ@%¨ÅFFDUHÒ¬™©ZXÑ‚BTJJH¢( ¶½`¶ã÷9Ü5ÝÍ…ùPÉœ ‡°f¬°¥¥\e…ãä'ßåÁoý3êeÔ˜˜}ùÃs|Ù¯¯ï½¬{ôïF<ÏëÜßZä°«Õ`Ä5öV¾5i÷pfN{ô+ý\fŽ^Ißn¯PνhMÅšAFœÌØÛ2àùh+ áÜáóíÂ{cŽIrfI7´WE@H“‰ÇNIŸÐF9ÌLBÅÕÎÅsï;ë¼O”öé´²Ñ(V;f·OÆÝg¼R2oî#ÚȤÐÐöa{ìÁ—ƤMzñJ)Þ¤e»'!s–(×f OvvmcÜ—¾[Ž‘ 4Bd¤³¡ ¦c:7½$fßÌ%TÞçÙ/ÿâ2A’]ÇÑÕ¥'GÙï‘6ºÖ3;/u½8«õl<Ù§-Bä”ö4Ë; ‘ÛušÄ¶F)+®¥¥&E‡ÉæÈ/Y¬á¾Þ’;oäeô¶î®§~¦›hò~ê½§ž_õtƒÞ4N)™QdN“`úI2üœ&Ê\´:' W[á)¹»ù}‹ðç$J2Hàd3i» ,¶’[&ÌLƒ4V@æ 3ZÎߤ#¹Hú&QH"“t®VM}2 85m 2yÖȉr#´˜ !=;€…!©rø\Ye2ÓÉ85B¸û°f!•t¢dÑ#Ȉ$Ét&EIÇi ‰˜L„‚¹Ú» ÝLE2}º5©4“ D&Ý‚“‡HÀ‡BLšxïšp¢Ïs¥ñDaDN°àg[ ÈÁ๲†Ì>™ ÀH0€“S²À$œ9<ɬÕÂR}Öàäg=$Ã0érI ä5[€ ‘[NÀY“LðX<N‚‡Ó±”„“HãHø”¸1!ÉXÍ-L®3d²î”`¤‹•ÀÌžÑÜxtÛï o ®Æ°AwúLÆKÖÀð—Í#Qs8 “À‘t: PíhÂ]XQ[PyÑuÇõ«ýç;} Ù_ò¶=çGòº–¥~¿>ódÏú´Œ ÑqYg¶ÊiøhÎGžÇÝûó;ë¾ã!í ¿Ç}h_¨‚;é0h/öΩ#o¾výAô@PHåŽ;JEТˆ_¾›/rÊÌWšy©ópÒ’§{Ó]©ÖJ#Å0ºŒs’² è|è>Ž‹ØÞ»J6ž².òÁh'G=…Äh‚à?¸óQk)_¦Ï·åõ¢×«QãÙ{×Â$=–‚ÀLX‰ ÀM{ЖúJÁ­]棇÷;ñ»u¹ÉÞŒ L£M#”`C9ŽÓ<š<Èrxÿ±íŸˆÖ·yaFÿ*:ÿµÔö«GnköЧØÔî6ð¨ÂVÃÄ9ãóˆw¼Üœ3îÎçA0ýEòlÔ¤8‚@tͱÂ1¨$[+Ôµñƒá‘Á •Õ¶LeuÁ{î=å·_{_ûT×ùï·Ýç^øœÛ.9¯o€§fj}ÅyëÕùßY{æÌÚ÷í³SÝiþ#n¿D}/wäHÖLÇ’ôY9>›}~­oÏô÷X¢F Èè4§cæÅPíQUVOfçörNœÆTÅuÜb¯> w÷9Û$û¦÷°þúÝû±ïß߯»ÏeŸ>ÿ·ß¿þçþþOþ³/¿ýÞ¶¿Ž^~þ÷ýÿ¿½ÿóÞßé¿>¬‡/øþb?ýþñ§ëþ÷ÿÿ[vxë]Zïûõ}¯«Vúþi}©-Ëã“}k?Çuôëž|XߤŽû¦Ôa`Ô–ãHë°>R1PMzMX³{hÈä\».slt/LUB,‚iε-Å14±ç9:º¶í1½j† sÚ4TiÛÌ9/úçbÕ¬¤‡Â±¢Ó¹d-=FÒ§cÓïÚHg̨N=Ö¸öŒš½ÔÆyâÒªmvEþ!_AíäÅl§À5UveÙMZ.§ 1 áX“8KòhC“Ÿgyžù~ÝÙßê8\‹bª»S¦®½úÃ?¾¯þ+ƒ³VnÏGLÕ‚ÿÝÃÆšˆ£„Êcsªqv>{ß+üÛæR3ôM«Í¥ð%ó¿}3çh>TŸ‡}vÝü–££F s+Áî 9 HF!¸#³ŠÍøºjäö|öXvÆê²õj25»0»y¤ëÂ>ñ79ü{­bkác kgÊËÍÎÜ^Bò§Ó±ÆÚ’NsŸX^ʾÚ~Ჟ b ç¬éEÏÚ8•(]¤˜” ^EM4é¬Z£÷Îì¹*J§ËÅ ÊÑîµm?ô¬>‰—ßÄS·!Á9m¶Ú»|¢Ý¥ÍBïÜ!¹ŽØ2•’P7—®½Ô¹öêþnl¥Ûö²Þzbsõ«Ä‘ë8žNOVíyÚËïqÅ*Íñös[k?9£*8®öué‡fvWWõ Ÿ}t¬x´ÖÝ™û[Ù:1¡°–\~9&ƒ‘}¼•:ÖŒO/oÔ 44TS劭ë}-“í§MðÌEûÓ8ž¡ÍÃ{pË\äq†ÏÛólM>kðíÍáÙ׌·—™ïqÜ×›¾¶®#™O&p’Õ~9Ù÷ô^y§5kz“`8›ô›²©Ó[ã)¦“§La¿nO”˜ì¹-¬¬ÂTSU7˜ErOýœ‰.†ê´ '¡\øš-ÝãšmzŽuŽ5˜kÒ9k­˜í¤Ek½Ë{.z¾{ûæ'{gožtõÖ©Ÿþ$w hÍpŒÞyÒû”ö‹gó œÛgzûp9 9îhó­ ]1¢Iƒz-R­X¼1x” M(åHD6UÂÂíOós¯k]¯ãE¾9_¨"1KI *.0t…­wëݧŸ'_MxnPKËE›4Yôõx5‡ ½ÓW6ÂÅ éÓeidâ03M`7½ã¼3Í+~›ûâñ¾ó-ÉýšÊ‹ÏÜ.+г³È ÛDÍüúž…DÊ)¹s/ë­kíS64)¬„Æ£¡·¦]9aè8Ýeö¯3A¿q÷¯5ÕR¸2ߪöÔK1 OÅÈ°Æædx¢­”£§Í‘ºÁmRnh+ãna8Bh0iuŽšuÉsA§ïÞ¶ï»_í¿ò{­1Äd›ù€Ï3ßÚw:îݾyÝÏÚ|ÌÆÉ+þ›þ…Ô;?ßO9.áÄY˜]¨ 4I0iJµ`•¹ …˜¤øÅÄ£Šlbmƒ§^©ÂÓ²ÂÖ„fŠ)ÒN4w©}>¼[7;,å€b$J•ÒÀcM,ñ2­E‚Z (*t ÏÚvµD"% „XÂ#`*i{Ÿáóæ¥YÐñ»{§¿8¿@Ðÿt?r1@¯°…Sט\Æ”™ë²†¡`Ò xB¨©Ñ`xðŒRUT[S@äärÕ+ê)â$€àJL#nÁÔSÅØãgf"@ž!ÑøDˆ°Î,‡é°‰ô}tùó“ÿòçúóåYÿ¾ú^¯ÏîëŸþÖOÛc|wýãŸêç×íö­ÿþþ寷å‘䱿Çm¼¥ZÇõÄgߎٹkÛìÄ×ÖQcà±=ž1â»T™9mÃï8Ž¥¡E™Å¡•Éш‘¿"G”–´A4šÍØÌ±Vša’¯&ArµhíÔ$¬oÜX€R¥±Û*ãUs›orÒÍñÞˆP‹‡6’I¼Š1ZRÔÐlÙ"£¨ *(“àªeŒÎV§VÎM,=Aצé6 ”q„™á…»žZ%)·O/trØÿÌñ>“^ÍaýÐ1¡7>y¢³÷ŠÇˆ\h–Å”-q©uÒ>†\pO;ÆíN_eh´åZ†ìÅ©êò¶ÙwÜ çm߸ãŽm›Fvº®“yžo×Ïù/·YfÏ1‡í½½WS#Hä§[Nbõ1ͤWÀ|W/“ªÏ÷ø}þ|V u_” “ áC ¿9Óƒ9I3œŒå ãküÆ'Ób&NEœ¼þPvòM>†Òé¸1’fnÞ |>ð  ¨±Ø ˆä¹§ ÊÓ?€'\å ÙØh©“à 8™Lп]=äP¡Jg‚É`‚<2¹<1È €ÜೌÎÉË-ÉÈÁ%™a’13pãƒÁL&:eë]ÀR\ II†„9Ã'È‘D¼A ‘H2|&MÀ˜D`™x3}DN3gä-G=W†ÎúróSR.fÄ:?„`hÄ*"ÂÉ¡93Eiº9eŽ¥ÉÉ0tp‘Ä"|øÌ\0ÛÉx'“µ“m$¨Ý:; ÌI#‰>M‰Œñ,Úeõ rBÂU Ô–Á°@«EU›!àêк,7‰DÁ9]²Ñ%"ûi_?v­¿Ü! IøjŽÆ­¬~_ÿãð—z¿ò·2 ßáxnç=÷­¼Þê×—û¯8sÏC£fSSb®fXi£<óÇ:{ùúS!cf> ó‹Êm‹·0NŒw¶¶¬Ù•¹†‹ÅIÜŠšDDƒ•ØJ2cË9Û"2 e¹ç4¾—ë)L ”Ä$E2LuÛ“èɶӸXö(ª‡@©¸ãɆ.͇Çî¯;éå~Ê˱ÕÞìm&]y:þbås3Ö%öä~LÌÒÝ\szóï¤ó=¢'X£²4S¿'½cEjW°·Ë¯ïÍk¹¯$“b1ʉ±ª­Ôdü÷Þ’Ò禧½>)UÉ XQm´¹”[IWÉ©;’;å 0Û~Óêz‡þÏ}×PÙ^’$3[Ú•ëõÆo˜ë±´?p-ç «ÞüÔò©½(œÊ/M]в]"cupºÔØtG£ëÃÌÁÿÚöóR¹”8 9uì­}õûÕܹ‡±«’î5·‰öðQ é²x”ž.¬ªdÜQ¯È¶¼b(úVôQD±3õs毧••dêˆÎ§ô½ºšŠÊõU´f3Ûz?k3;ÓÅi‹ÃÆ×Qç[¥5·»âÕ㕸«D©Å`¥¹¬?ˈM†ùb˜`u×)Ÿ‘†8$šïíNíYó6j1Z<¾×Õìc•*vÜôQ±MT­´ÖŠï4FêÁætÞ{oÇî<á(1í¥\Ë$e&Qyêv[ÏaYé`µ„Ãi•Ý>cÀf"W·OïHäF; /RÈ [É–õgÜ©=!Gp¥ µ’µ½i뛇-¬2ƒîæ=‚¸Ü®T›àKjòK³‹^—Cç;íG+ßË=#žnÒPDìã¹w÷jí0î­ý¡Âó=ò¾ÚWãO§„ÖJ_Ñ(?ˆêëØôVÿ¹±•œïSê4«Üt*ª¼ÿÝ›ßüü?kö¹¤Q{meþÉüí=ž8Ÿm2ÛÃÔ¦’¡‹Ió“¯?ž©“™'ð¦ó(Þ®'_ßk“¶tOž8órÏy Àéy\߸ªk8¦3å¸{Þçz¦bwü—¹‚œñú”]îó®MR²·Þ€ x”N™ÒaÉk× $5ÛCCëdŸ}*³u¿¦\û ÙÛuèAz­ýíÌánäT›=&šÙfÆ]û‡îÖ³çíÆsÜî’ ò…ý¿®Ï푌òdöy@¬†œ,úœS53Rè“át÷Àe{»^ôj¼Ð\ØŠ,Mx²¿Ãóp×'Ýe;44Ê,X4·ÅL\Ø¢ÚLÙ¤cr€dÂfƒîzEK„L¶¥ ˜í‘µŸ,q°MŸ1œ>ÙÈoô“¸L‘ŽÐn÷T¶ÉÓØÍ§kå…t ¼¤%Ê®îìdʸ]À*¦°gŠ’h„5Lw,%[G cÌäêë¡VKeÀ¸8ƒ®ÌÊLsƒÅnz3;°ššÜôþòsôIßYv¯xi“üÇ×C/3³¶ñ¨W’«Öo¡&î$9¢97²1vÛ’z ¶ÛÃ/re}öiº˜^ïÓç'—q§Q™ìw—1ÞãËæ÷C‹Äïdþ]Lïëÿ±;_¦^èçsÙ¦?ûl´ÿzç›ùËüÞάο¿{¿óÄ´éõ1ƒ¿ßÓÈ?ß¼nÎß_þ¥Ó™îÑžöjHèºûÌúÎ~ÿ{õ 2ŽoÃó—A§|XÜ ®§=/ûDi &ÐD¦m¥% ¨ÁD¤”ÖÔjœqL¸¸=°˜´PÃŽˆRé Vì`<2Én)%~+,¤a B¥S mü©@!P’h(,âð!ðâ6ßš™×ƒDo”2j8Êí´w6]@4,lQÖ¡…’®27&3 &_áWúZCLg¼7xÁOæ§î2Íàê,0BPÐÀ¬£Å)˜Ó„[ÿ¢4ˆðuK€Ìbó@˜#ˆBúL¦¨@ví»×JÖ­éH/޾ô}ªG½üsÿúðßù[ÿkÛøòîøûûËÿýëOþoŸêŸþoïÿ±úúöׯÿº}\ÿ»õþˆ××öqü»Ÿ?Ÿþý|ÛòøìsŒcÌgæÁ6~Šõ«ïxïÓ¼ûÖ8rÌŽ¹÷ÀŽé½F¯¤ÁµÃØÌÕK©‚oyl“å*¬p$†YN ö£ê÷´ßa• ñ2ÊÌÑÇÀ>gAf[(I RÙæÆ1LSå(GS[@Ò†n#bb5T–ÓÐ¥”:r *R ja5 #“¶&5éÀ@ z<áÂîCAä² bŠB7°O:]¤iu[#`&¿Õ5ãÝÆÐ5ê÷é¿Çã1‚ËÏpçÓÜÚÎknð)dNä$깂g_=„ Áù^BHn«m´z„ ÀHãHÌJ¦oìGÎúd¦r ÖÝqkø“§¤è+-|æ 1À}#ÃÇî±MÆj›ƒY”ç%?ù‚9ñýÈ#ïn&’Liá äâ»KBñ„A q¸üdž0:£§£’PÈ·¥†ä``0ÂO 0RO”äÀl~‚€»·!™>—â© 7@˜X6`Ö/ŒS£¾$’ïnîšá€‰œõAŸA &LKê"¼çÃWŽ9Ó™g—&;8Âw•Ì=†äg`ò³>€¬zD}¹@ Ít±Õ&‹aP9Ój0È yÅ>|#º‰HP›Ïäé@1ͧï x$ò3N&Ÿïû°%À‰ZD¢>×)ˆÓÉÈIä /•t[µí…MÖt8%‘ÆO Kî‹9˜õ\v¹åP¬ÞD‰z÷·2+_^ïŸÖʃ¾þþγݓy{–ó:¹üúøÕó¯ìc¶ß?诜×?ÊmÇsÝïÎóFžo…7óÇï=¿¾í¿ß|ÿÕì~O~>»ýtˆ‡vö›Q9Cd5ºŠU?/ÚIÓeÞgý¸é«,d샦%äU³Ù²{:`ÍÙºè(ôFNk"ñƒ¶HIˆŸ}¿öãÔÛÎz!d¨œpQkúºîã¹Çȳû…DA©‰ºBMU”»Áû,ßK?D©{?5w#šé\[Ͼ~Æú i¨l"€â¢…Š NÒ¦]ݺMÓP?¯ ¤‹¹[*PéÄÝJ-³…g»ÀÔRãþúã(Ô(E—ùœ'éÇ·Õ‚ýñSà­ããÿ`‚9»ž¨3æûv ª‡ ¯3E­aõþ|öÏÏ3~ò³¦î½ûžÿñ\7VÈßB€ùkè_ó%¸ÿš¯¿åü5ç¯!0†Ñ8¯ì#÷drX>7<À#¾ÀKÓ{b ªø–ÛEWný1E¿½ÁÍЪÃo0W^ó¸2›VO¶è½E}D-Þsan4ŸÞ¼ñóΞ}þÛ›ÿî¿Gÿî¿£ÿîðÿ#y§ånæÏö%d!7.r¡¿~HNh’-EDï«^±hDÚã^åÖøÆYï»çѦ`áj¹õ”4k7f=åÜ…&N+Þ½^ëCyíçÛéëþÿÍÉvºŸuu›·á·þÑlùîvK¿öÿ¹X(ÀÑ6xìåÑÀAÞ F¸GuE︟2A•Rí;´Çav³”naNu*ÖTUÄ1©1ÇÅöÿŸ&a#ˆ[…A¸@sTpT«îÉñ¬`§•je»…µM±øÏ§ª<¦Q_% ¨„bP@àÀ—(B¨Œtt 9‹ßœÙkÿ_Uþvù/£q;³7v6Ä3&n½Ø7éÿ£ÿCzÿû ¨Ðô'j§?H°‹t1¨žGqE^¯ýñ™©tÜ#X‹Oùßåí¤ïüxíü—öåÉÏ~>,kî‹v’ýÂ3]‚!FÅüƒòŠHµË¯t-ôM²ÖOáTê©IJÎ>ãê7ëõ¯½ßúh?ùð–çæõ|ù¥ÑO¿ìNÒ9wß{<¥4Oé¶’ëÙ]bþk;÷~õzÌù]”^CúÿçñuÉù§³Kæj"̲[1íýÞc÷Gïþx%•ûêðGôM=/ÍïN=H`*‰Æ9ñÎÛ×ÇõuòTcX¯¼6¹Ã×yýbìÙÛû:Ë·FÍœ´0PÛX =¨Æ­bœ£ƒ…´ KHij†(° fö}κ ª*Z4Ÿ  €x–ãVzå>û‹cQZ„D(Ô²¶ûI;þûÒSU;†_Gp¯¿×®¯YGjfwe÷9þÌË©¦³ÿ³ÛÞ'~}ëœáYþy%Kg‹ds²Ð{Ôž³|û›týÒ”M×!Ÿ VGÎ ›°3¾J•ÙfAkn-KËä¯Þ}«m_€_ß1/CÚ"¨!"Fž¤™®ÛNJ•8þGˆ~pb«/Èé™l-‚´Ò!íÀ²Š$Ô„díM奙¬‡Œ/´wU†Ó2¯‰+HÒ?/5Í‘º#—…sÓúkÿ¢Å¿ÐÅßÊúÛ€¿åü_*Ý`\kìC½Ÿu[=ê?þóüg§û_tO çwªVþŽ!B<¢Ï?¬¦ŽˆIî˽›Û÷-цÜÞÉ_-Ïß–ñÑýß½ç÷›½®ÑÐÍ~xöf&å~Vo(G¨¥º)°õÛå¼ø–m7Øê#ÔÙ*¬y%FWùü¦çÞÑ¿6?Å]÷׫ê–æï£ú; Ÿ=¥—†m–€@ùK£&ë¡3Á™VjÛ!Õ´Ýó赉οô?Þ™ó"(× §yÆŸNjöö:ýÇ è£1Ù§^ çþ§·{ ÚÚ0Š1Þ™" 2IÊ=îfª®#>íóìgܱ± 564WÈË›ú$ØœÜfƒTWÇ-Ø®Ó2b8 yúZÎR~E›( zYGy°¸/)5GQ·tQ¦fõަËÌcÕ'•+àHJà&Jä6†=£ ¢@(B=›¦2ÈX$“Œ3¸ Û ¨h4#§É°BP †0­ C¤ Å`¤e=¡¡”Q°4R`H[1D0 „ É'2a¿‡[¤8m!ƒÐ° À`@DE(E   PR¬á$Ø‚8IH ˜ A–G€ÒÁŽH‹¡Q”G¼‘D2Pˆ@ H& Q„i–¥(2:!q@@D86ÂHI ©!â,‹ ±Na A(ÔB„™˜`ŠrÊÒNžžÂÊv2  lhS/Š’!<P `lBPDQ&"⥉b•È’N6„Xm—ßrHF’ˆà6 €†¦Uv€²œ./éPP·ÈrÀ…˜®/æ{kDô'}ª nQGÊüåûkàôq¾Û©»ƒ­ÆŒ¨O’æM6eä¿,‡­úç5Y±íž*Z ûKMËO"¦$Që<”$ƒ\´A´{£1:¦ELÖB³)¤Sfè@SG#fj (’B‚ÿÿs"¤‘0†áahA©TB%%iBœèØÕ>¤¬=QX K2dH ¤0p EHP`#xÄ@ 2 Æ ¢PŒDT—$­F¦BA„T0æ4,ºgsÙ° 6à‚ 6d› `&m  \PL fËAJBhÌÔ’© HÁ `'~wû4" j   À@ €š@ɺ 4­Ê@@ˆ€` # ” ¡25QÈ €Ž€¨MMJv¡(!tªì{placuæ”k¬¥Æ.þëB%ûëålèAÏtV|Ÿ¨U=ŒUeÿ“øSô@ÞŒ‡ITÙ‡h4Œ!ŸªHG…`œN‰¡’P±…e°YÚ¸h‘*7ޤVF¥)D- ´¡$Õ<‚5¬%⪫gôDA5Ô@PJ€J´€DŠäH#8Pµ(‚WŒÇY¨ƒ˜;HA…‚ÙðTÚ-Ùû( (¡QiF"¡4Éc1iD²1DH«±2•Š "±+ܨÍPE 1iî@œáX€im·Lt²IªMH••jzM\R1 PËh%‚5ôesÁ%™¢¥ Åàä]k]jlœ€˜-<V!mQO5ö×W m•L6À$K½bލ_IÛâm‹}û9|+†ŸíÏMÏ\uE˜‹W§µ•, r6¹_.&K®þäNÀñòfËdA£ö²Ø¡h³±1VJ[¢H€.|B@öe+Jò³Ï%& ~UÚ'L?œ€d`hAê@ð!ˆ'Æ‚Á)E‰ù¹„&¤r–㹘K–YNN‘H>ùR‰‚aæÁñ=þúÄþtòˆÅNÁE ðÇé0d%”\`„‚‹ ?©'A€€(` 8?F‘À}$8˜ §W€l˜¤ÎÏ‚@—Ïñšx ʼn›‚O:ás2"'A@(1¿è19ŸÀ'¥lø|(INLÄ—¾ À—y‹È/­k¨¬Y¨€0h@… #ÁhˆP-¬PXÉÌ@U#H¡BE¡ÂBˆ@DÃ"* Ì¸~B=H  @@0¬D·AÁlȪŸpFkºb&èB Bm !ƒ@2!\°n°`²– „˜)X0@Bü~s@Í$…¨`¸„K  @€`.A ®1Q„ @!À°b ¶`‚)XJ¸„ ”,³i$¨P 1U°=‚(f€LB \¢mòµš :l?²®1Ëê;>Úo(®õöEªh”«*Á´$ãX@ÄјÂ~]ƒ±%ar&ÚG†Í‰5MµªWSéyÎ5÷†”¨Èé½^ïdÔÌK]=Žölg™%>ÉK7Ò×IU"Ì7æ34P>`9UI  gî}RJˆ=”Z‘\ÀÙm¯%^Äô²EŸ‡«£î^öH˜‚%æmŸÏï"a«†‚ŒÆ§.¦‚ýZOjžÊz­ò&|™u¾Ÿ÷}/Ó^…O?[XËO6ÿ¤ÕÏŽãÂ_«úâÑe^ûoœý?zõý·qÿx\ÂWÌ_Cÿ Žf÷zg®*ª®r7kxG\1áþ6pÿ¥±‚ŸçùkVWí½=)¯æT_á~œ´Ý¡@6ªú¢úRRìxµˆ'ÌÀ ‡ê+%Z±÷ÒÿœýÇÿ6þÿåòV¿|Ä?‡æo1n¸½½ã¿þ¾bêA£&Y ŠíúóÖç,ï Ýê½~ë['¾ë 4˜Ç9¸A¬€o‹áÀ]+–…å{OÇhL¥™!‹ÁVm£Aóf¥]íΓ†¹Ë³ÀGOªÖ§…δºÜï»é•ûAE‚< OÕ•§WÀi|¼*­S®da*È“1ÈaCžYÑE*B%$8ˆCk0RYKƒ×,j㔆°”£v ½C¸NY$*Z¹Ž*bî..•éÑq a_A¢Œ5!HæÝ4M»Fþ·›9ã‰d…¦§i¥̃*WœéoWö:‹·‘ÿ¯xðÚŒÿûŸäÿ÷UK~ww~¨Ú+êîwý5#â¿»õ:kñ”Zi¢¯Óí¿éx;ûõjþòLu·®Uj¶Hò¾ZßìgìÄMmpJÅ9½Î8ßÿÀ³9±çŒ9üõÏ‹ë0îPzÇ‚ëVë“ë¼ñõvöWþôÃ^gÜóÞEx­—ù.ÏÌ÷ú·á¶o÷uÍs&•îµC~‚ùËC^óü“>½Ô|I^ÓþI{ÿÅsÈ?]ðm7^%Ã`¼»ìô¶ˆ¢ÕÛ»GqHTÿ:ò³CIêwRC¼2HÒu†ïÉ~È}ÝðÎ6%NwË]%Ú—3î×}¬†çál¸ ÙpíoB)Ù™B‚Áq4…B SšùñD«áô ŠÏnjMeXçlçÁ&:­… , ±!¾]>)OÖ¥d+‰Í (ûGÓçMG› çÐjHçsüìûª–;÷äÕ%3îQƽÜ®üç2ÁOøªÈ2”Ä_Ž xbŸøBÍõw ÍE'0äÈÑ0kâ‘[>¶f‘=>h Ð~}Ö®Ž~ðpùfõúU†WJlyÀ™¯ƒÃæWÇÏwJ_ùçßÏç¯ã¾›àpBtEꆢ®6 ȸˆ¼¦²zQç2EhZ–0wã×2¾†ŒbQƒz+7…AGªàÃJ]rÉòš‹•«¡UÒœX•U+ùŽZ@2D{ïþ¦ÿdš= ^(V0r&ˆ ¡A‚¦œ? axAÄDÀ‹AÖŠ=Ð6 šîsCN^Y>ÊGI“A„¢™Z`¡erÓ”©fW"00 !£!€PP IAÀPT–pÁP€„  LH‚'0„e¢Ò”1€ …T¢€‚Æ!@"RRT12ÀEC"Š$¢”=$€.p— z @ <$lÀ zÈphZP0t‡…a²=ƒdh§ÓjsVШG‚6´€   áéXKÀ„p¤å®Ñ5ÓVL¾D„ ‘¢6´)‚A0X € HÑ$0R’²”¨˜QŒh$µt¶¤”[¹˜Å†’F°„EˆD" P(ù³²¶ØÿÄñgé/úýi­:»wùûR–x(IlA™ª‡%ºhJËH¶ª^0Ö %*¤d-aY $T„B‚LˆDf`¡á˜ŽšÑ %U ¡É@UJQdnÛ·þ Û*ƒgôÅôÇgÑ®ë§- ƒmþfn5Š—ÔŶÎÕN„‰¤^eÂ3lÍi‰OüŒŸßް÷çñ5_yq:Úh0ËM™köj!Éu×¶ë &S ´]ÙƒˆF˜‰…_l‚L.$ ä„ ~: &V ÎÏi}Ó&R üq›$zÖaSOy)ræ6‹Æ!ð½âËb&f” ŽTAÉg½dùÔ†"ˆ Q&Š83sT[í¥|ºùÏKyY¾½?ÀEÁBŠ6qÀ°6õ¡ä‚ñÇÉÿ¡ ä¢àD~ÖûÉ/@@€©€(9ùê ?› *$Ɇ$1¯3" Ø?C&êSTÏ—‰"¡}E$þ®à¢û/hK~ÈÈö¥“á§GÁÀ¾ÜÍÑá€0ÊF[R˜ hÉÈW †Ì ãtØ5ž-B&NP°EC04U¤÷/þþ/4À¨¦d!€ø“ a‚…L0 ¼€*H 5€ƒÀAÀ(Y $,‚!P0Ò—?ÅB6°€‚† 3W üÉ´3 0[‚ ² €d-b Ô€f1 ¤\ìv5Ø<',&Bµ¹ *Q¦Y„ƒa 4L{—žÊ•ë±r ƒ0•‘ÚVy¥£ìF‰C׎ÙÃŦŠ=“oì.i‡•5õ™ÝéÛùv¯‹ä¯é(— +å•“¢m6çgjýÒ(ØŒÀ^„A.Mêhu;³Q …ÐâŠô€q ¶B®3¦ÖOÜ!‡½Þ äó:¨Ï«='¾Ïƒûï×꼫Ó"=c23wë’3Y_w÷€#@|ÏÀ? ÀH¶½˜§]Ý·>š‘ŠBdªÑàê†IXPd_ëƒ# ÚŽâä2ö»}øKa IE`ð 2.=t l1c€0<¸•ŠsÑÀ ¨1Î l®ÿõ‡ý†l 5=57‡Hu¤‚Ý LªlCàñçÆ¸’ÝóøðÒÅpä6·ÚŽÎ‘»ëo={ÞL _‹¼fܳ¸”ÿQýk›KbÿÊ}þ&ò×,¸@À˜/à%áüUö…m8ßõ—kŸ/î—à#\Á ¬ø%¸ƒz¦çô³vÎïÇ¿Ã=v0nˆ«­b4¹S¾K )\F­J×âcȶ^)™4{­m¥¡™lò^ù=ÞµÚ^cëÏšÈ.¾ºý¥f~ Š¬ÙCjOoÃ7¥ŽžO?ï ÁÕuº9W™õ[ôÁv î:W¬!| …Î7 AAýäÆm/˜¿÷{ì[s”u©,ðYò¾¸¿Ff&ˆ’ƒá7ÛÅŠrd°£FÕ¨f[DzÐ6õôê}”7)´•wÔbµÊĉjG(d+xÄ’ˆ#—f[iÔª  ¨‚$¨´!y‚UçeL¬™DK÷D Eìa8FXB”¶±ìy•(••(蔩ÑxÐùÇ?HúÂ>¿]³–Fwë ¤Ì¼1 H j@ÇèØô„¸“½…ºM*¦nà{ìý¥ù'’“ïß·åóiÞÛ§†3ÛO»ûsnxB϶¾Ýç.Äá%w¹øëÌ2ã~~ò»Å'“õu|˜98l?­ ;™ã¯ þ×wý{Íñ×ïûæpäNf qwôâÈ1»([m|Þ˜óÖ/ëÓsž¬ÿò÷;÷9|­Û\ºÉ×}ç×¼øCÕ÷Ëãä1Ë#¾ÆE£þ6ç/ÂìÁÙ¯6·2I;#FÝ}k0GÑé+"£fC"ˆJ¡#ü±Ìéìêi³%OÉåŠTqëZŒ<"UŒû+Ùęޒ:EùŸäq€ÇÜ÷ô‹æ UãV¢vE¦²´•ºD7"¥Oc¦"ü‚™ä´¹zš}Þןð¯{þ’ý³îqsÐÖF õ úß‘7~ýâùoNÙôs3„ï°mÜ@T¶†¿uQ­Þ(K2he¿R·Ë¯¿ÛÞº®ý\Ùå„Þ¯ö¶MmG¤¦reƒâ~A+‘e]R ³Ä¥ín¶—£3Ó+wïóöÈû»sþë®ñÿåÖÿ´î+ó/º=³M|Žã^w:ÇöãîUKÿ'~}µÈÿð->÷ÕŸ²äÕ2©zv;?j-ªÁù;…Sf•\BŽÔ}–/¦Øƒ¢üH2‚`Ýì²^ñ2úÝ»÷´pB¯¼¼Ô…ã …hH±MüIºˆGÓ‰˜@5C´!ÇH/.Z؉rBé"Ë*^8»YõnŽ{r¯Øt~€L >>Ò‘§ks^˼K»Jûž,&À "/xæ‹sSÑnjW@\5(‘#¹ED5)NP˜ˆÑA' ó ¨F¹4lÁ}®µš¨k-3¢F·¦Ùš›_Ì[”»1¸Ñ%X³ÂEm]¤oä1Vè…†HÑ1›©òÖâëµYš ™^•‡’5¡Ì®²ƒP)d|Ì›1®åÕaÍ„D£Aq{xŒ;G0†a) Tœ,.n…OùËö5€,&ÞX9X)'6Iˆ[Ë)æd#rl]00V 4{Z‹HðGí>xØ®L-,“n[µ A8D‘ ¤³`s’(ƒ€ˆ!M *’€2 ‡ ¥ƒ8ÀA(@Ñ”!0¤@œ† €©DÂÀ‚N(@èÌ$D5• J1p¤3UV˜BdG!©"Ф%(Ä „Фi¢fr‚KZЇ8d4Àh fÂ*-Ù´C%h € <  „„&ÜDƒè6 lt`ïcã+;®*†Š6*„¡_é*ƒš|øQG«-x~Lcý >ùŠIU€ÛÐE, hLÊ‘P(ËÝ 0½¾PÊ¢<&A °Fm»nC[ÈÐ—ĶƒbºÊÉyMŠ i”´áÕ†«$ï?wëƒCG(Ä€ 0¤%¬Bfb„bê‘ŠÄ {¾ N‘ZÖD(áP èDrfpT@FXKIA ÐÖ†(K[ŠFX8@’AH%Œ’^˜DŽP)Ä)‘(b E`ŒT#A«–Âr‰.ª«2Bp„k¤ærQ ‚Ãt„Be¬Ä¢™YÐ ¸A;A(`w,$AD»,ÓrYh7Ð4\’‚´”&0´¡"qn…€h2Ú2V6‘JÈh±`€”€*ÑD&|ˆ &*B%—’@‰€hå UP@8”’Q"öI«ÍÙ0Ny"#§"ƒÏg”9.Q5‰qoc;oóe¯1O£pp*¹èЬ“OÀ(æËë¬,VÚÖ±–vá„GÏ9óDà¥^u * ø8Z jê¡‘) ’DâB±‘È5÷jŠU9ÎHN²Rͦi¯z&28ùp¨1Éöb9C§±¿&ªmÇõ±ÏÈ(vØä†Ó Øù™ïÁh†ðªãá>qŠò.h  S?tqr€ø*|ÁD`~Z%WŸ¬‘¹ `ŠO Jì84ðËð‚g6þ)© óÓiølêÍ/_ü§†I€ø2'‚Ñ®™vȨM%&™ä85rŒF¤£!ˆ!1¬¨ˆB4UT@!@EÀ €¿ˆ ¼ذ0ÉhŠñuÀB†Y V@€Ù,…°d’ °×LAƒ @õ“E*XÄp ?u½jd a([4QÉS ,á`!f,Ùi Y ,hô°A^¹7÷)™-V<«ˆa` †¦ƒUVß:·Ê–*Ñö÷®1½ÊÎÕ®kÉ^íã<ïÙ-a+ÇÏGûý·ÿqæ·Û~ãô½µúw+7þÅùëS›¯÷ 8…lm^š¯±O”éÞVç2æ9ýù¤=¡×¢Þ,`%~n–ÄrÄ¢”b†Ä•–¹ Xî¹Ûs$*c!–*Ä,D™vªÉ5دþ¼Í×ΙëÒ ]²^zÍqIH$îjï!b†"AàûÃö BEÖ%]0 ‡Ú³l—#ˆQ8‰œ¥` ?’rÌq!3×tOï*a¦h«X|ìyG\éÕëàØý+ ER/CnŠ}@escäôÆèýw;øÚÀLHG™›ŽIÒdiµ¥Â!–Õ #?}ïùÍ‹ü²øqŽ’Óêø|U=¶×c÷ºCü•aæÜ÷mêQw^æKþåpþçá@ïàÿꯀ¿‚[ðü¼þ*¨Nj|/ý×?ÿæñÍ×Ï·øWÜp@ÄŠü<ǘßéó2¿gºk~2@BœPÒXdVÒØŠf›Þ.T#†Ðmwõ‚=f°Â(5©a'ÇE{°}A™1̶œ\Í'røÆoñü~ó¿\?;ûçÑý±IvÏïA®Ñ;loOtæâÎütçªZ´dÜoåªÊûMýi `mYÚ‡²A¯ô‡R0’eŠl蚊lSŸpusZ1g¨fKIV9¤VaêUí©;ÒHE©˜Ta\È¥ÚF.n]å¬p¢ÊT›FÕTP20ƒ *Ò(Œ¢ŽJRÐäQ_u)§XËÂ!–ÎB:¦°Aˆ0+h€ˆ£:b5„Õké¥Úr¶‡Õ¶îJý¶ÄCÞåCÛÐ^UŽÏ s½F›Â¨E•Âd(!+¹  ¸þ„+’KÊHè—ŠÉ;ùxâ{ÿ8Û_~¬Ñ²mØ3›¾4·ñ%({±÷áS{ãÚmpóËëVgô™åûﯷ»® û¡þ<=†Ê¹l ‡fŽ.V‚kñæäû1|o$Ô@Sck»¹|ft?JyîÍÇÝOžúô¿nñøù1ô!Íìþ1"÷?õóöOçßÛûü£Ã°x™‰_ŠžÛh9€­–ºJdÓ®»Ö®Þ˜„ð…Ì·OÅ-F25òN¶E}$Û=Ϻ‚•™ öµûu•ÅlÝ,J‹.“M¯w¸ŽžÈò¤9èz?n·“Õ-ŠÄª*Ø"ž¹é‰X4EžžÅîcL}‘Uó_mä,lyraªrãF2ŒãYð-~Ê«ÈW'‹XŽŸöA”È´]Æ_eÛý¦»H”úAü@2IB0tjó^W½ÎNù)¿“-•~çÓ_¨v„>?ʯ—3‰^„Ó÷{=à°4´F¢ŠÜNÍ ¶*Ñ•Q>€M‘0KGZDUPÖ$eãÈ:ã†ä^gÍ`_A³W…ÕE(öêý_M–k¶„n+»lkXâio{¯^MÚ°-$ýÁùZWè9æ~U½ ¶¥õ4ÿà´A£¦]M#ëìüƒÇÂÙb`Çf‘Àl¢uÉ'žÒ0á¾+d”™uÎîˆØošÈD¾ç41CQaâ×¥ü#ö×xÇy{{ëršÍnÒÅgÉ8*úêÍ¿™MÞòÎ’ú °ïU‹ýñ&ºì{;kñ—#Jê½æªúQæw¤Æ‰*©,Þm?²¯|û¥ Ǧš>}[øo’˜‰Æ´P¤ul¾5** ”PP Ú#[,5–.²ä¨(Bè ×AùÊ‘ôî Þ]Óùr(ª@dHiÈð\…Æð„ḱ$Jéý8Q¾¶„0Á%J¹ÙЈÃRÖšöPŸº"® ,hmŽ™ºe@W!¹Æ£ƒbR{“ó|:kcÂãÅdõž>îèøÜ;50U`(K[#4 EÃô’H1ñ*¼[¥ŽÆ _¦æ%C  šèö©Iñ(§`T•Õt•—$ â‡ÀDEC¯–BÔ–¨³…kÂpÄžCÇ¡kbAHªB³]jhDqgL]X/Õµ«;eŸr4Êçýlêaf„#[ntLåjŒj&E‚Pwä0Z°"«Ã-5¯VìŒ*gÕ@ FÑùj«›áJǺ»A Ybí”!}ûMÚéGÈdbBk„¥z´i/rR²Î_ŸÞù²ÁÈ*ö9‡hÂç<÷¿QkëÃ&/e­µ%f‹ ;²Œ=>çT’­5G¶r±Äü%Ïño 7lüã¢Ïõ¼^ÕmbL¼ñå~Ùzs믶Ìô˼a×á;OmF“3–ùT!Ûâ|ºÊ’.¯ïvs'˜VVWsARò¤É2XHC0‡™Á"«€3hK,2ò”sÅ’)¨øbûÃA?w3·Š,ã+^ê ­ÚháªäÏ¢èû^úª«e¾Ì‹”°2XŸÊÁá„–õ<öÖ~é傉°SHS¢ Á¾§B ÈùDè¢EH{(*öÔ uÓ2ný±=»´¾Í¢6vÀáI N•Bâ<çWB°/Ô a0@À°·ÏžH>u*ù0 & òe´'‘"ÀPpðñyKOtÃ'-r*?¬ üôN€¯ú¾ñà˜ûTi¦ |N½TPa¤#ªFª F-0X¨ @2sÝc‚BEÂÕH- ‚Š5šUT¨ˆPE€ÔY;<°`àŸÐ ‡K`Á40 Ä 0ˆ0 €5@@ l@Áb&ÐhGßìó B` KÂm„ÌIhƒÅO3“´BÑ ƒ°Û)ä$ƒ7¨a‚4 ÷(Šæ!jŠ dÒ@2 0À @ V!ðé¼`zŒ…b˜ÇËxBßk#Â÷ãGŲQ«TÀ0”°Â¡GeCOD_Ûe±6öE,š?š¢ÜQ-׺¡x`—2Šû¦ j€çÅ»¹¶•ÁKÕh– ¯Cþ@½­ñMÖ=œORñÂ"D#J4¦7çË¿a^V/»ß*ÎÊ®0Sµ7›Í“L|r €`‚­ ¡çÍÁáù<ð·jɰs wHduÙg °¥[Tý’páA«Ï¦¶]Š$ìØ%1D ÐWå™=¦ø€v =¼”—«º«Ú|®“;.ÜnßLI“˜ er©!?Xg`Fõ¶±“,cú¡G€€ˆ”¢r) ˆ[ùÝÍša]çà ÿ|ó¸ÏŽ?*j0Û„ò†‚ä›5.Ÿ¼ÿÿu¾¢˜ éâ(gwõ»mV8æ54D˜¶ŠB9^Š?¼¹ædu˜9xÖî3šžë×ûƒ¿>â|¼úç7÷ ãöçß6¿üOåÐüàÝû¯‡ëoÚÿ•ðü ®¿‚û¯ðÇßàü5.jçÐ9ï][GPšfzñåx`1Áˆ—È­;|1qôOòŸÕ,V´6–^‘„»ÔeQ%Ø@ã´Í8tIÑ.O˜™Z›QÎ^“2/ÑÀhûpwã~hõ8˜ýuýÊìÏHþâµÿìºÜ«¿<ü¯ wHƒ0ê7—ï,ÞÁú5ä°º[}¾ù;$ƒú àËÑÊ^—¡=Öä£{TÇý.ºR ³ÆÈÆn›»øhÎëì@)Ò‰-Ug•• @¡v4KEÔktrÜôˆB!LX„bvÔ! „ ޤ”ˆ4ª» âÖA Š!T„É ‰à-³ö‘pv8-«"–ÂÄWT³¡T¨˜`A`„а=Ç‹ä A¶´U__ºö÷|PR3ç~¿ð3š½“ZF«Ï#?G„>·!‚Í4¤HѨ€œêUÎíÏ ýÙáó(=Z‹D?É Õáðåm|k_ç}ÿˆ¯n¾Ýôž*×XF²§:ÁvkæzþÁ³çÔ}ïZY~œdªÏ[ÿqJ.É"¸}O§'oŠòabÕ/ª=ô—î÷p‚Ý1݈‡_Ö×|ôv÷hÏ/m¯m¼¿ýúqె·.vãûàñ×?òýÉïíÿâìó}åÔ…e«B§"‹¢«õÔÊÔ6´US^?4i®DRîŠëñQ@!8-:™´ -¶ØD’zÌ%¡k›8Jg6IÇXp2F¡:F˜·×ί±œ¿yP3{׺,¹ŠA( Q÷­FÃè2Í Úæ#Ì\Ùsü¾toö“5Å”aô1„äué@á™Vzî `³1XPZUs:"Å4›N Fh¡ˆreD5­úpý™[H\{[«ÔP%f['†ñ&÷"teøÌâÑøC\‰Hþ²h±R¸¡%ZCÐ…ïYŒ"MrëÐý[žÍ…9¦7ª[A±ç¤xF¨€ˆ¡&|DÍ’$DK•Mêù˜³\Ô[gõ:¶Õ@|ãèâ.9‘ÕLR_Vh†€C€Þ)R\rp¸GPý©®5f~¡^yH‚"Cu9²FdyEÄ ;Wv¦Ã Ñyà~³0uÓ2´°!†Öߣj!5"y€ê땚¶bÊ_ëh´Î|pÑ Yv®e–q3ÕMF#}Íî×S½ûÒ¹m¶æ4 0uÕO~לI~\Í(™É˜íVwÇÞ©¹C4=ô+dÙˆÐfuwÔ²¾næÓ±J:Éù¾“Ÿ:uÉÂÈI’KYt“…[3S+ÌDžÔ"KõkäI\å†çàÉÒ~Æóòu¼1½yf´氭Ô}çÐ6qn3V}êÐó°„`fZ |Ó«Á™„¼xÙØªÉ‹D†0 "cŒ„d+Šm£_Ç¢ˆM: )Ç(ÒjšÝµ.Ù›yRÓP3}&Ñ*ÚçÁúÄr $Р q¬¤Ë(Ó·6Zç]]`¡¯ÇòˆÈõÒáˆù"h33#HÍ4 ¨ÅÜð«×/[ï͵"¦£„ ±€ ™+Œ1… âX€%¨ (i,%Œ4cNLÑ6]4D%DC¡A‰T¨\ÐB¢IŠÎØ”(tAÑX¡8C‰"¥   BˆC‚€˜Ã1- ‚^Š @9KÈÖ]ã€/#<ˆs9èMO€ãq\Œ¹}Àa¸“a(p&U·Û9Æ€k¹—‹‹CÖÞ(„l(ø=É3fp¤rGÕŒ›h¢£x˜ÌbfŸBòŒªÈC•zhÉU zèù+P‡Õc!8 åÏØ?±R%´L*—v\„va4“ž–‚!ò”äš hD2¬f»l p¨Ä„Æ„Bd´Ü‹[&·³týWÃ_¼–ýÀQrÈSF@´Å´eœ 3‰’Ï3ǘ1?‘µZ¹ë‚Ò*–í Z`2:±JO•³]ä1U“}Á´A› ÛDY¤‡ á^jp± qvÝnÚåN’Û%¡'añ(`°å–Cd(¤Òqˆý@”XÕQ!¦GX®–ë®ê¤PÎላ¤­v›9£ †T1È“Py­Ô¬ ÍZYnæ1ZE…‚Ö£‡ŠømDhîæ³11! €§gþ¸=5ðìËï½ñÊzÈħÀVi|ßõÐmÛ{7[^¥ |­¶<Ç(Û/Ý,~yüþŸµz!™{ÞBF¹››ëqo|Ú´‡÷ß“„±Ü…r9œ[µæ¬©ªâ[ Ò¦[r§v@,Qƾmnj©}ûÑLëš»Ø0 ,Y0Ï|¹K\TÄÄÌt9Î5l4û=V¯0OÂà£@†o7ȇ³âìÕûQ³@fžæk;ÉJn½õ!ÔËaÔ¶À †@6¥2fܘõ幦WÔR«H&uSrAöU†R'^(J]ôÀ Éþ "ã+â$áL }êø+ņîü "ZDîc³mˆÏKá J+>ˆ 5ß  L… É Ã‚|CLB‚x|‚!aÀ©¢A’_ü‚¨ÀlC‡Éç%„_jP$>Gvñs 9ÉJίsý09•Ÿ‰öµ^ñÅÏaDd„F£áhh``x'*\v㌊µ„@8 „B@ —Ä@@…ëÑäF-hPÿd€ÿkª~‚D€¥QÁ†?EMƒIX³€!f˜`Xl_ª­BëÀYn·a3;ÛZíÇ“‹s{€C¶‚kÈjQWÚ¶‰|Ô„E,0p0P™ fÂjSuƒkWœ@øM‹§ŸÜ$”°]"¼)½¬û÷Ç ˜õÈq 5,Sƒj ° \áȨnŠ2&¸Yë ßÛ[­®,gNñx·žÇ«¯R$ Ð@µ»¾ß?Nrž€ß°ßœN¤øÛ¸D\Èy–±ÝÎýl;ó” ¹›*'§\K9ô}u¯5‘År·—Ɉ^dáØ‘OÔ=ˉ2ö¢¢¯}œƒuª~ÎÀA$X‰,ç–;”b¯'–”ìeºÏù®oüðýæsµïñƉ‚ˆbÒÚÎ#½ËÁ<æ_?ªŠÛõÉ˦ˆ ¯’Ïõí¦H3D‘Ãøþ© ¡Ž z¤â¬ŠèL„-CžA«Ž¯h”ÛJBz¡X ï$ËŠîtßnWI–aL*3Vð†•BHù¹ƒ¯Éê­üÛR¿ÒöQâ´¡Ü:‰SŒj~xlÁ··ôÞª§ŽÅ]rMÔè^pûfºÅó¢BØ‘f°kˆ}{ØŸ®ÿêãþpæG½ýüÏ‹(>¼û<©mÜ pˆ_•Þµ×½¼?è¾&ýŸ×ùÇ>@Aÿ F¢2öžo+ÞîìÄ?þý«»è—«¿,÷)ø*P(\èŠòÓòÆ,ªÃÁÿ `ÌJkiÅu±MÛUOZÑH âª@êˆ3\gþT9Œâ £nl[=©—x£‘(znïGô>×çN 7½>þÙËwäþägÈþ¿¶7½¥ºl[ Âĸ;6‚V;]ÿbÓ½4û“²·öHv û¯y_Cù8t<^œ£;”Ô³©à:“’u¥Gdw%˜Û`@ˆ9„,Œí:T@B™c@.JVÈMì˜ bDÙôÈhÐ…ÎÊ(†ÙÂR("„X£–qÚªžÓ..„b¸(Ò€Œ2ЉĄzK`v€x¼Qj“ÊÑèPÈ5tC‰žÛüaæã«‡ÿêß \æŸÿÝ‹ü¦{ù±{ƒÆ©•“Œ½z|[O_ûÁRº®Y½íÅÇy¯ºmn˜ •VŒ†Uº`Û(Þæ¾\=±×Ó!Ÿ3¡Ï~ýéb´77½ñõ6Gâ"âÆÀ)Œ-ë3ã29ýòâî/³|vØÇœ¥î‰ßwµ*W‹jïêìä·í5êÙ™šÅK#QF{Äüè¡¶ªªxXÍ×pÝÏ:·(üÌä- ¯ÇÚYæ– dʳb÷íGë9ôúؽת£e\M•­òõÅ‘…?Ú¼Á9·›/À‰‰Sv,ïåKFqpÍî÷YdëzçÁË`’5ηAÊNËvŽ›êc®ŒïÎö\„›Tí—ù«ÊîÜûÛ}”óu/ðÚ/Ux˜ÚRØ£-È®(C¡¯Gây\·Ö‹ç«¦‡U˜&`I‚'Ç9í4‚e½'ª« Àʆup`frYÄË–Ikf‘¶…<¥G&°‡/å—bF¡;#mAŠ4'‰Óͺ<ñ¼Ê±æQ«SèBãÔýË|ýˆo÷?¾àíÀ0ó@1 (Mª/ÀPU¹¬I‚’Fz7~„™Æ—(æp)‡¨ÝމËU+i¬@þëÞùCb×3„Ã5>ûübâÑ™°Ñ¨#¼¢²IV4 è´+ªÄå , ¶YªàÓ^Ž!¬Ò¶†ˆÊƒftAÊ:¦c8¥#±¹}®J ¡C¢xâN¤CÄJ4Ñú”‚4L#ТõXÆ$ˆL!‘z ¡!H€‹¶ )>6øµÚ+ÌÕš‰Ñ¥à¢0ãÕi‡t ØŠÇDVéÙr™%()FB†T2ǤŠÐ"JŒàœÓE¥cJŽ ¦²8ƒ@ 8 aBP…I G¤eÅ@L¥¤0¨bAPº)H„I ŠˆÄrIŒ„"æ @C-Є3Ñ 5Ô„@H@-ˆCˆ¤…d‘€hÑ€2”#@ Dƒa:À¡ÅöT~¦% @Iu*½ˆ‰ÑhxÓ˜¦ødØó MñËüm-ލ*\Ü+ ¶ìÞM^iÁXÆTΆ†,0, [.¯Sz·cîÇÍDYG)l¾oàSÑmµáœ;`Õ.Kw´å¨™‡ÜSž~=ÏœËdŽJE/er+Xœn Ñé.Ø$wˆ­IÄ”gˆ f3&©BpDHâ€JèÐPD² ‘¤)( B-j¨L5Ñ’!„‰V0ÄJ¨XÀÀ    Œb€ %5¬ID ô^ª¶éÁ@ê-i»©¼Æåç _ìý)C-¸J'¯x…ZVN[¯Ë$ L¬iÓ\Ã1*TàfÊ(° wÛè`›½\/ÐèØ™¶€^ë‘I¢ÌbÖhƒ ݵkŸŸŸÖû·é3¥À·r…fß- Ó®€n˜vúÓ˃>‘€é0:’]n† Ežö4J ¡ ;Ñ´…"2]dÙ ˜B ÕŠZµhÔ«˨h”´Ew¡}_Óel(ŠŠ¤õ¶R MÎÎÅÞUa‘IµàjƬÅß³ø‘ÅT »-˜«pcüÃË(u(ÕkFc«D£$ –i’'md $p!)eÍ dA¡8Q"”€TR%Œ H€,épƳ êÈCØ2B’ÓDãx Te4Á©Ž2‰h¬eœ†vv'oû1M–BÈp‹8Y/u<ÊÒlôÝBúsw¥©ø Kï””¾¨7ÁéÑ8Ry—ÅNóŠKJQ½0Õ@¬HBFö ö…š†—áÐmÍEr¼Ã-úÎ~ EJ¦ŠH™;#ç¬ÙÍ `I±d bNÑéÑ4Ͼ´çQÎYqyôp¬ëºmôçÙ;^²§í–~ÁUVÌrNCŸ{ÙÅãzÂ+Ü>Q>ld[ñ7þö—ôŸ^ÞÆ±$ dl6 )S¶ï…p9ž'¯ÊsMK ’kÑû÷^J„峉$ ”ކBÉaÃvÂ&®úS›t1hë²¶ºhn‘µ¯ÍÊ}_Vèa‹ 0l丮 f>EÖ*4 hÖÀ´®Mämá§_”F¼Ôk@Š˜h àK@$&àHYÑ‘œm4ðÈÛñœþÓ‚¢M ÂKý¦'¡}–ú¹ô“ÔÂU¬üÀDà0IM{q¡`Œ³ ’’DÊ*?=ö¹xÄF6ŠeÉ™‚£O”eŠoû¾×(…A \Øå0ÅŠí‹\ ”ÏE¢A$&ÆWHÀ±Ñà§'A>1˜hH‰ò™˜& ƒò©–Yñ)‰p€ÛÄJN´Ïš¿€ÿ¸L†L:(F(tôΆQ/B R#”XÑÀ ˆ*:†…*(j A•Á–°dàŸ|2 ¬€‹¡‚ à2ÀRÐÕv{¸ »æt³«oÛ‘8ݘ„߯ù>¾ÜÚžãJø}’t‹â¶Z &Fô`ú×ijz‘ßë±’} oПê*s°NF @êÞ•¸ªJµv[½ÙÇìÊöDðšM0q¬ºŸŠÖÛVòÔ3z÷S§…Üã>BúN÷jE~|„“øì1*à}_Ùn±ÏÅÎ׈ßû…$CÄuÏvhŒOXœƒîÕëw#ã.(;HÍ™\^áÚy ÛvÁÐv ”I'vÊ7:@$]ÚíUIFt‡x¶š’SùÖdï‡ØO$š´_+MÙ…öÃâd_[h䑱ëªù¯¯ì9øˆ~'#$B–ãÜÃëDA™âÐø3 ˜^5«Óù:Xw¯½ÚÏŒVbÔk×2UÑ>ÇéCÛ¹¥r5µzþ²™›Ç$T*àCÏŒ[À &1RÝßåfbˆ%É[[€  Ó° ˆ÷Ʋ’Í`d–ÖÞ®‡šþµ(C†-KúiHÓ5ÏÕX³ˆu~Ù÷³3µ×ì׿§Èqþ˜{w;‚«î¢·×U‡Ô¸I3ãã£ë·/ã2Ê«0%d&yà©Ò€’É™ãnéNžzþ¸ ŸóÝ_ò…ÿÒa;šÆâ«T¤Ïä—à“¡û¯~÷_Ô›û§©ºåƒæÓß“ý€Sà×^6KW‰9C×s¬·»¸ºå<ù¯y=¯ÿãþbxœÀ#|™ïÌ„«vŸ„“ˆàB3q„M™)S l|‹ í¸„†PeœåÆVxQ߆é½s‡‘^e«ÜXó¸Õ¾b¯÷ý üü›ÞîÕÓãé,Ÿ^·Z«w ð c¿×‘½#ù ÈNãîy«ÄäàÀw›ùr»ž% 7@… ZuŽbsjš5¶ŠŽ°Ž­Z A{X<‡C Dƒ;y"]…ï"Şɻ+3ša.¬,RŠ ƒS¶‚ŸPP¤\AÅÐCSfu (  DPt0•B…àDÐFE"›,R¥¤ìlfqQ-FiFö&k[ÊÌ÷~9ã_È/N;O÷ÔõÉ<íóEXÈpÁ$4ÂTô@fã™»q¤äÏÍ\*#Í!vf›ÑLÄƪ ábÉj:%|–q³½-EÇ=²ÏÙ}Öþ/¯oÔ-èÄßîêæ–yŒoÂ>ùz’B•½{ ›'ß¾9ohÒ+î¸ýL‚új'n­¾˜¯3O÷»oáP­)9w'ŠäÄ=ÄŸ“+Ž&dÀnÄâ 1Ès­Ã/»Jvdž$GNó-¼¥¸Ú­åûžk… ¶/¬‘ˆ‹x϶câþZ4x«o…GÃÂ]>g± K8´‡vW2ÊMØØ&}¤Œ1‡öF¯¥®Z‰Åо°®xejw‰g¶†â0–Ѓ²2?¥ÍdÉr"1S†”Ê%¥×máx“®?¼ø­gšPÍì€RMa6J%ãŽñP¾¢ ÿBðÊÕDÄ c鵤½©S[*øÎ­9÷.üôúq¾sºí¿Ÿ£¹Ç÷¹Ø‹–pe'{«U„hfmÊÐ,ƒ‘T¡ÜPˆ9°,D­‰‡îL}§´Ê<í#êEƒê бVµ$Gº%Þ³|â€ôÕIT ÐH±õFÜí%yÿPÚ ¹zw^WÉQsûÁ½2˜ 3Æ2Õ”·‹3?žxüÞÍ…>˜~Dj>¬Àæ±Þõ^>²*fP0ÖÁ xV¼ËQjÊ %sàNºÉXQ2—j¢!ê ¼2‡½>ÄÏ /Töäh¼µ:3™Úà'¾>ƒÉõµ —e€v­(æDñeÔùºÒã©*êÈŽ#R2T‡7?“—¿hi)ã’ЕK‹¬“(M*«ÃÑM7mëìôÛÉídçØ¸°"55“_øè3ðJE`ŠÌÀ5c#œJU¯­tí,ƺ#u“,1ia2é¢9ÚéŠ!ëWz®F%]Wgç¶¶ó6E")AQ@ ò¬¯ÄÍæßf¾$‰ˆ …$á'Ô”[:lÉ—°?Ò¡.a PTh¿žýÔÚþ¶{ñÕ{mUuLÍ=M+“'TG»è¡W“V3|ödãPÈiE“b\í cÍX3·¯©>¶k—©+¼¥Û'Å Îf® Î0•Ü+ÖmËÅÜMPº†ªÐIbÑ,q"µ’l„‘„…F Ô:Â1%Œx c”VXd¯j¥JAC y¨€ˆE‘ y`0ºX™hD*K ›^*«R©Ð[Àfi(P²W®(íDÒ‡,òÁ²{|lû›ÇÖé͉PL«ÁTº_ a/bãˆæ ƒ}D§¯PK¨5 )SA•‰xÛC I ˆTCXmˆÇ€FÆ!4WlF „ÀŒ¶ÉUŒ1€‚´‘a IÀ ˆÁ„Å2  €JŠT‚˜ä„@ À¢!—Qy†Š2ÑEHQCÀEÀ  â²OÄ%+à¢=êvÑGÓš)V å`ìÿ~mœ1âC£05›YYi$(9mä<‡›·®æº¥0` (7ÙHè8—¡ÍgïÊ@ÈY«˜”å¡# iÅÌ™·t?½®n ]D˜ ·NÄÙâ¡”R¸¬•ܳ&‰Õ’O,½}a£•VíÏjq´ááA0]÷ÔðÂåèZ ÊA‡Eb4ʳÎþZžÙ¤·a2±â6Ž  PN°NQR1ª@ ´ 5àD3HÖ"„h‚%kQ‹@j(𝅨…BAÈÀ C ˜€C¬D:B ¨Àdöm,okrT+…‚¨Ê.ñ Æ8Ê!0N»¬ÔÈ÷^̼²½æðÜÓ1­Eõd…Pñ~%RÕ¬´U$F V¤Ô䥰¹ñ ,‹ ` Bo8·©`}®ðGÈ㊢Y—*dTŽK²Ì¢h;©ÆƒRjòY*¥Ö‡`[[ÎóyÒê &‹‘9¬£c !y’Ç®ŠTäñÕçÎ8L{se‹<ÊÅ{eM5£0†E’Cå˜l{ÑXDK ߥÊFÕù?LÑÔÈê˽ݤZ(UÕ’’‹+j×ÔßuAؘéöå¼Ô–/ôùâtÖ²éÀl†Û^•¶ùÅA–b³Ó0®T8$Ž+Ð¥¦3bÆœd" )"ÒŒ(a ¦31dW>&¼£ˆ%6ÌRä $å 0ÌD£Qæm¥™ª1ôC%*,Ç"XÉ:‚2` ±Š`Z²¹ÃÙRéËå°ßÏ‚PŠëÍÄŽ±Eej¬›â6¶‡“ «j#L:…bŽ“DH9„•?ÅŸ¤éwjDE†‘&)Þ:Iƒˆ!¢@RÝ_–-]¯Žz!’ÖEm¨x{Oî !j×M¬0àñ).H±…±gyV iJ:DÁþ”èžgÖ;iÓðhiRm\HgÎöÅY‡ÃD½–Çò|ñ‡[´gcnò\R*›U_xʹø:7øZ»æN„"¦™í%’ë©.–FÉÓÚ²–µŒg_}Uɼ$#ZÀÜØûM9SÈÍèBY¾Œ*‰ØvsªœÄ¢ùm³0¼ ëÝó2f‰Q¼[Y`[Ÿ9°êT Y"•¼nû¼·Ñ+²pZÛM™È¹Ú`ÁFµË@$'‹¶Ùh¶LI-™Äe”M-Ïë:ÏY7{hêæ™³XWMÿ|=[ªæ~¹Ÿä“‡+ ¡ Ä>åtp’ÈO$žœHQ'Œ/0l:Uƒn  à¬$|bTHc¸%³RmgCÈ­²Ö .ëS€µ¨T±aßÔœ>º1•mìÓR¬²PËš•jfßgˆ¬¬Ì¦hüšQÀÀä€J‚bã'¨Ü©€†I2¿€üaœpŸ.€À$¾¶ W Y¡‚ b9—˜¾  G­Mâœ,ؼý‚ó¦^@ëN{®¨kP UA°œ½·úPMs×N÷·üoÇ[øö¬wØ7•é-tMïç!?dwRµ <ºîÇA¿O{LØmžáÉfÞ#*…ð>—@/õñÀwëe%dž€ik(4÷ªÌôÉkËÄzH9Ì%ÁleK·§´âjƒEÚòT0!NÞ'“i,ˆX§¢’ sµö ޱDzÛÇwýH¾}ûaFò÷ûÍCË-…‚A.„l†elNÜÞõîeö³ÿóñë?ÖEt´Žm¿Ø|î×küR²æÛß\×”yèJðƒÞíÛª yÌøõ%÷x:úhŠT€€âû^%ðù£ ¹ØFP¥!@†"”9 ‰†Ôú,€ßÓŠJ)1%榢ɗ0j6O”¤Ió™<ÿ¶.y\Ó„±¥ÕÑŽKëü7Ñ¢:ÿõàúc÷ü•‡?̃+¢´Ú…Ë0>i\´ŸM3b—/Y0·t…c†|nãµÛdœö‹ö'{ù‘ÿ¨qÖ!½÷ûùð·‡zä-þéùúûªÝ|Õ»|Üü/f:ýàì÷{©Ïr®çD»÷÷õüÚ>ÿé_ÍèëûÔo7Ë­ø.ówÌ3éu.õ­~ëÿúGø«Wü\/®æ/#¾ˆë0¯:ªÕ#ø "ûš†-®2‘‰‘½ÆÞO“í\Ô -í‡÷­©³Žç&YCÕ¤ÌÓŒnÚU|Á"®íƒ«! û]zyy_¿úÇk cz!UwÛWZ¥šõC˜Êñ´ñ+b¾³>¤ãÁ ÒÇ´­N«gx‹à:I9EL„J$HUÈMœ%'ŠbeÔTqÅPÜuilLÓV©îQ¡ ¥â[ž1¡©`e’Ç(®A¡ÊW¦bË)µm%Ì‘!`8Ÿìì¨iTiƒËÊgN×ýdù|þüyAòqrS·], ¶Öì½ý¹^É^½Ý¸8•6‘…›ÔäE³é¹KžÖ¡]Ç{S€ð”´ÞïݯgúlÖ=cÔÒc¦0ôJ޵¡‘Icº’!¹’%šx5Ü¥€¬:ä{Ì“¦¢‹¾¶vÒÓOdϨˆ<.;ÙÙ­][ª«7>ãQ?—O‹y6Z2˜G÷¬ægêñµÂ:ÿ›ûo×oÂãœ1;’µ‰nç b .Üé”=k±…ÏC=V‡äL8¨§'확Œ®dÚ©P,¡bj{$§lKÒ  J#¤Tß$tV°¥¦Ü:×/ÅùCøN­5fª¹¿ w(ì„g¨SH "’¥”Nq| \ÂĨ$aÒ^ÞäáÎìí½3ª×Û7â»7—òë¶=ò¶*Ó;/šX/Õª2¨*Y?nØ eÈÀ_ÉuSeUÀNd­Œ/s¶9Å= ÒÐpVú³©³çœÆpD!…©áƒD¯õs3•p4\ðД½Ê:þ%_´j§m†‡0„·^}6 õùìÛ ”ÎÓx)¹ž×gÁ{{žrþUó }áîÌ+Z(êÀÉÆx˜ZƒÖÜHERe‹§N}OÌ#<1ÓâájÔ‚R¡9¨ò¤öp¶xôIx_ñQ²)ŸŽÂ'ó>Ây0Íî‘£['pMßäßÉ‹•ZÆ‹¸¾ºÒ¼´1YØÚèll¯èãH4,,‚,qêÆ§^­Þ^o®œzm¶öó”ÍA÷JwüÆ(Ùñ)xÊj}¹«ç{-{t”ÜY/ª |å˜>„°@ö%&bE…•N$#á:ÎOòàž«ª.àâ­TÜX£–_Ø\uk`Ï®PÜÃ5ÛWKÙ fÐ8v¥ „üŠÕ\KQpÎß¾–îé²$X‡Š\›36)‰«JB¡ jIGYÖsý¬C†iƼCÍ mƤÞ4*U³¨:yÌ.B¤1D±»„íË+NôHHŽ_4—Ê2\4êëú2Ô¤L삪˜WYjíx.ÌØ“ù ›ª\7+¤qiU#¬'Í-ƒ6µF°3öYH”@ƒr‚Êd‚5#-ܬ†ÄhÀ V€c0JŒŒ‰’"@Eæ.Fœ.ÑtÖÔáfM26j…rÕé]ÐíBñH^¡šXÛÒ1¶œW§é“FÊ7JŽ%,Ó[+¡$]! ¬Z–R8À2#$ÇYeÒ)Í$g¬úÁ;¶ú*»BºŒFÒaur8!ˆ‰¦ Er‚¡mZ( s H €ù¶Ž hE eIBš€Ï$ˆ„Ë1Û˜´1UŒ& c´ 1&Z15€Pi Ý8&,¨©sC\‚v%ál ”4Á&'0–¢ù À˜6ÄÞÀ Ó$ƒJ!Ø l|›ÎÖ–`²_ޝ9÷{ïwòÛD›]Öl4´•iºÇGí{¾Ëý‘0LÅ„#t‚&©ã%e@Yn¦–ÉRDBdí>&uÙdõ>ADµn.àê¼n÷ê OŠ÷B Š ÚZ1•VÍÞÂ_×…×óíí2«ŸÄ~)ëgo]Ί·~¶q‹éš3ûô°â[ÈIYÚUqÒI¶£QêkZ¶?>¾Ìã><¢7$бÑ 01JGU'›3©Iä*1P! ʖ‚@ ¥DÀC]b€‚)"%Ê 8*ÃÊO§öµ h·‘Û!X–qÅ—aG…ó/ÇdXšÙ˜ÓÚ[_ únùdC S:(Œûë–jR3¨fËŒÐtÔ4xˆF@–<¬ò/º-UŒT@L¨»»kžŽ`œ,dNè8Óv¸‘ïÔØÌ]Î}‘£·ÔÐ)ÎyéÙºÞ˨÷¼Ç»Ky‘£ñ„Nt ÕÒœ&ÞLCB‹Ð‡êÀH˜X«ºœ}W³DÌ3T¥Zá—©ü‚ †V‚y’ (’C11¶jcbÚRì`bVêßö[ -ïÖ¤Èáâlu MQi*ŽV«[eªZ€Š¥RRÃåTš]'yR†(SõÀˆ¸ÔŒkxšY„!¦!€˜‰††X0 0C1Š¥L"HT"™i›Ô*ÂÀV¡ŽøtÙ‰žIË*‚³¦!”³9J*‡2ÑqÅÁ0C„$ÐcŽa »Q#¥ãUÐÚcŨ Š… 4)R$¹3ŠûÈD¼íÕqº$ î¨R9š1àhsä-2˜Õ¨¥[VGDH ¦Â všM¬dñ‚ÅU±FK‘ÚH!ºcªÐáÌ$kÂA¸dÖTâÄM RA`Pa‘A$sD…NW,rl±Ê,3N#óÍO+G I|Ÿs,[÷*©E†ÔëƒØböÕÖ™Ç!+Þǵìíƒf>Á†0ÇŠZù:¬x¹ûnÅJÁ «©ä\ˆ™ëñÞÜum;ê±½Ü-°-+EÉÓ®ì —U§D°Í–Zr×|v÷+Ï—ó²×Ø­m§ÊäQ¸Ðv¼ŒæJJ—‘ç‰á #€åLÛ¢l#l;üLãó“2ð¹7$¤FÙÅÉÁ•E³Ø[pãPr0„MŸøJàüloć“dþìÄ?Î @ `”‰v`€¢‹€ #Fh³ @!D@À@:èH)Vf϶g“S´€ˆÐDPZ½ÙsÛ«FWTÐ1Ö£Må0@°«Ÿ" ¢¨›œƒ¬C^D6v¢¸Ž¿ÿÅñ‹=ü½øJ§7&F6Ç'§¸ö°£´«ñEÊÏÈ]jÑ0á`–ØO.SôVçÖíxrÅ£ûIg×ZòΠs¼% -ðùùîK|VvÜjŒ\¢Ò(”ÛÁÈêÈdÁ‰3Ka dTÌ-’ú²ŠSȱZ[§:PñæqëæÈ±nR²,-ßæn–vl£³|ZÛ:@ž†ñHÿÝ.N4Op¶n]‰‘ÎZo( ÷-ÖB ø×ýÊÍ·¢Å¡¨1¨Ä•ÃÁ´¶—0>iÝðC¡©AlË5O‘"nDX=gŽ£„)Š|Û›úþßøú·Ú}ÿ˜ÿ×󾦅DÄ4f›gCB(î­>Xj—ÒÂ!ö°öÏýjÎuû—ÿýócaß–›NÊШìŠÃjC2uêøÊ¹cÖfŽq®öýÏb4P´»{oÞÜ{½>¿^é܃›°ìÚ$Oîg9G;joÃý¶×tݺ_¾(ù³M¡»ËÖY^Ëǯ޾Çþ—¾Oäåûï–ÿ´à7ñ…ÿCÇ»ÜÎä›ì»bËŸSç__‰‡s t’‘)½‹n:ÔcÐ׊Xœ¡è AÃjÐ¥qR&âj`ª q4|$Vô9ë{U­å’Š~U£N-bÊhÇ jš¡‘®gQÁµŽW·…sÀ‹$*ö-öÚN+]T%’R-¡qd@¹r!Aå¸0§fhg½7V»òÀÀ•AC£šõ>c‡kTˆg T\jdZ Ʊ֣õ~ú}&ã‰Wˆ¸¨¸q„E(Ù†gô®šÁ3 ±°¡3W[åŒoÒë3TMƒ/Í®ºçóŠ|Å1¹–ïÆÇÛÌöýG~îË;g½üO“Ðj>>}~´3Ëé(îâ½ìÅ;ÏËÔS²¸É½6þ:J6ZvUv–.ld=â}Xˆéq)—Ñf)„0,ç1ï»ìñ¶S7Ï+¼¾M¼´ô§VŸÖLmk¼V(m°˜¼Û{°NFćí]WAvv¶²Ú?£@®”#GµÇÄ!$) t&\‰d°„˜z¤TÐ1FZâÓqã_·nl4„̆ŠÝÕÓ3]}œlo¶g»'‘·±M8îldœûêì¼dUøÈ+ÀQ®?Æí<+\Ìy™=YEñ™{4H¤·¯­¬#««Ï¥½TÆ"ˆ•¬%Njf;c-F•(° )^ŸŸ®(w‘(¨²+EzƺQ9ð¼î9/pyë$ Ìí|+nHLú(=Û–¬ÒàŠ'Ö„úÉÖ.Wƒªªmß;Œ½#Øq ‚Õi*ûÌýëõ¾wg=«ÜæÕsF*Q SÖaÓ&ɪ\=¹5ÈK¡’m woŒR±BÙp‡kÿuŸ~wqآǞ’GCNÐ&óåA±Ù{q‹¯Ë›I¯cÓ‹ƒGçÄ“¶_U쀓xLà,÷¼GÔ”_I~ÿKúê»3xrpP€7ß÷tô²t×5°@†ÊÊéýÑœ¾Ì«°”Sr·K¢#W÷^{8MÒïe={öžîc;ëÐÄQjp•<^(0›.D@§A)5¬…£L,$@êÄbþõö‹s_ÿðä(?£µuÉ$‰ÐYgo󘯡]Ë­ÉV‰{+kY,–X¯UZ;ôJÊ`;:.V$ nÖòdª»Ôg"sþ~èò[“¤l½=}ý震wÜXÑÁ£Ï 7V`5ùÖâ[«®Ý?JrDÈ^`P*²frS£Ü”À@°‹ÑŸÅ2m¨pØ+ñum9íbM!½@R7-6Áu’g dõÞ>Ü#-€4Ü À„Ý„t6^Þ©Ìíòá)C ˜àv»@^Ùb´!ó OWÚŸzÞiÏ\OÅ*é0“ì‚.{$Š}Ë£ô®àWK6vY™m£¿6{Fk5yvŽqM„×YÝ^íÕÏ‹¹ •ÁÕ9:3cuËûèø»{·í²ÏvíÇ2™ ³€µØêGÀNÍŽÃâET¡£ØS[ö9T–ÉÆÝT×XÓþü²uÉESÓ®øYä=ª‚¾V(–BlÑËpt\ï욇 ²[¯J÷ba4`¢=´LʽkŽB=(¾èŒ°ä“‘sœ5-B¢[*P­fÍبÃr¢™èõ^  $a*†ˆ,lTæ…môÌ‚|=ùÉÆ>µ}D¯Þ>É·@жáŒÎÆÈðÖÙš@{q@ß•„ˆðUü:(Ó£k•ˆÀ…æÀ}FÓT`ÁÙ”utÙée¤°lö•8ïÛéIX;5}ýq2šÔ/R_,ý^w˜ ‹Q»¤£UBæIú¼phŒ¢ÇrŠâ"1@FçîÆÇ¾mÏö ¶ûJýÁä¨:®~ÆA9Ç¢)ehz/t*Œ2dKªB^ûEÑÂdTŒÔѲQÜ›eHR¦r¢Ð€ËºÆ"•lÄLUÕQ…p@EÅZ0‚¥ŒGJŠEjX…OÔÀ€¹–Ú´d@J^¨ ÀH|¦´+ƒÎÕ‘*ǹɃ|˜Ž4³.„€«TÒN£²Ô*G0©".H¥€Á`˜…\ÖPBˆxC$H ÑH?Ë/q HôÀ¯ã"΄âVp<„–›Èà: rF1–žÄ@”å¼³/6¤ª   Œ2ÖJ6šÀªÅ¡ŽMh@âC€d@Ș ÆB€€þ°¸dk ;Ùiª´ B:@ùfœ¨˜sŒÊdÓ¿Ïüe' Û 1'.[¾&s³?|LY•uj¤ûÓµáη—gÙxñ%›´wÐG¹î_/v€¾ˆ‚æåÖ8çÓ¾ Zœ?‘\ð ¨°¬½ÇË€é6¶Ñ°a9GÄÕËhÛØVÆbÆ²ÎµŽ¶VO=XFëÞ8æ0ó/ëÞ¼Ž.d•šÛ¬ÍÌNãÀ}Yly]öÛzš@R ±dÈüŒT8¶wL!¦R“/ÌÉ„q‘¶²a›ì#ü) g8kF¬šSæ¬ÙšÉüù§DkѱÀÓšb+iªx>ak.:ÚL¬½§ÒKâ.X².°ÝÙ˜y-É,¾ìdì ¥ŸiÀ Ÿ*6mÓ¢•hh›ŸŠ«ãÄ‚ðÌT*k¦‡hÃÖC²g®vœÐ%6»ušéqì) :J¼p³ 5¬˜8ÈÀˆ(ØPØðà]Ò#¿‡.6˜ f&`N9¤ŠMÐ L’§Á`™$ „ÈB¸ãÉÁä“›B °Ì¸D@( ªX¨hÅ @ ¬Xá š1¤ÑLõ9pC4³µæšaÛ¯_Yë÷G§ÚhX $}pAvß²ï&ÝZ¹×e[}, yì™.§>´»î½Å86*t®õK¤Ð%R³ÌÅp> 4ª–^ïx&ù©¼þlýwVsÑÎ¸ó°² *% @AiÁ3ÔÌ=‡k=|ð~"48ÈA¼+G¡d·—h) P€D $ %  ˆÔ6~Ò…m½~9ì Ó:¤q3 ÈàÙò# ýÉá±éës [Ž[iÄÂö–û|n^!à~UQ°svºÅþc°]cïí_«:Uˆâ´ÒÑGƒ…ˆ8Õˆ‡\!Ï÷‹q;oßÜç[ß¿iàˆÕíù‹Þ¡“é<êýð¤(ŒlÕ£ŸÙyõÔoçí {V÷¡'…K÷tDbÉž +^T±>Ϲ×üÚ÷¹‰õüy^þ^¡Я¢Š?°WÃt¯Åב1SŽIpGŸÈÅæåú…6A¯ÅÎflQ:i¥n`mˆZk@¶ÆÆ–@i›ôC<×{š}HÆü€þ™GMwo×8 YŒñ÷cI8cXÒE ¨& ÅmmM‘y±]ÓÀhHÐŬôô}ºvÖªr\Ò[ÖTн‰ýט(v„5A\õ1bO T“V¨4ªZ1a•ZòÐYâƒJÉr»÷JÅ @±¨ô2ßI|Î`<À¼äK„$Ã…i%~¼¼qgÅËóѳIû/¿ÍÇoù%]¿Ås÷=çç¸#A¯Ÿiÿcóp¿ü¸ùÏ|t5Z6c_¾ùe3L¹®ÈœŸ{Ûï^Ïæ{êèä‹ûÚÜpJÓc$Â3&°uÍ)d@(ÇG’'R㦼jѽI~?ï„ók?½ä@¥¸ØHÆþ9m¡*¤.™A™K²1„ƒZ@ÑÇ#Þ]o û–dô3>Õ›.c Q±d‚ÒQ9&t¢AZ†HPÁGY’v{ÐÁQ°©M¨Å\oz,[§Û7~{± y·ß28Óª`4ˆ™Ùãs?Ƀï^>·{Žm·ÛDZ·|ª†l˜ì̲,ýçúHM›éôÓ­|…­ë6jÁ„[½Q lÑm“Ιë™F±àUm1.{’8Ã*ò Vâ`R« ”Â[)9,°“ •þx8»|A¦…5W˜Ùˆg—éªÅÑ‹wkó¢ëé9G©I? IÌ ”ÚÕæÞsNbîr¨yñÔY¦Õ”=,a¼[)æx…ZŸY i¨Ñ„²à³¾¯éuý—T¹s§ï:¿‹öäÓWz^ülÔó~éüSVÝï~8Êl ‹Ü)‹´g÷È…žCì2J2­øÐ÷ûôy{ªY·%÷\º`ú]ŸÞ ðh¦L}þþwìv\¢bljcÙ>£t.qÍîó B€Á–/èõ°‹rÆ©CË”´¥—=ûÜ Qª4Ø%;¡ËYœ``‰…`• àd í2¬£²6ØÂ2ÃQíè¸Ókn½ÖeãTý}ÑsIÑëqkxì¿oÓöÈ–½F㦌/ï<Å/PVýožÙ´žW'££{U~t}Ѽ¿¹L½¯þúùyçþ3gymÓÖó°—‘ûàèòÜzݺ÷äLlÜÏëÅ=J™ñжk™b|W ä0zjDå*¿ÅùëòüU·¨Žµo‡Qãk!P‘öãŽã¿;“ I™¶Y˜k‡KfÀ°uOìƒq3ÃòbƒV£|j!]󃙓:×øÜ`¯¿X_å<ŠFjÙk™WP B,Ö¡rCåWó¡ôO/xÜñãÕü1ˆ¿^5ùùãï–fS?˜ûe”¤º†oŠí’¾nÜúüÂÝ_ó,ƒ÷}¼æs?ë{Õôsêï6†5½–‰GfÌF5ÖèŠJ…qfyjBÓ˜Gîñ``½šœÉÃy8%T #@,l”¯›x"±ya‡^ògvèã’Ö»>Ù,MµÒKcZµ?Ñ™±m¬H ®4“I6ýx&DD¦SMš¤Ùqé\X¡–yV-Žè\û¡WɶIΕIõ»¦BïÕnS$3ûºä=+œ]šg9½Ìœiœ7®q¤ÑÛT›<8Óå!Öî5§¼¿4öen^¾ k&ÓÁys.§cabr±+4D5}ÒFlç8ÖÍ]2Wó€>ÔAb:J°$¨iÞ¤¼¬9‡Œ²Lh:GU%êôEÌôdáÓLÃÖ»@HÂ5~>¼Î•Z¦zÈãàÈK|_ž¿<©ÄŸ{ {;ì¥Ez£µfQ…R’™^% ívÃî±-Ñ….ÖswòXˆ%u6çj ™ ° )ŽötáY‘u.˜Æ­<ÅB}tyuh´ÀxËyìwW/Ú‹hÓ eCÝ!dј-î9ZEúȹÐ8|kÞ3ôØÂu ¤ ¨9h^*?0ÚÀUãm*¤rÓá«é½Ù»î>rñ6Ä[žz>¶V„ŸæísÇžUó#ª­¼ö}ÙFÅcÐ}f¤¥5»3tzDë×ê¦n¡¨âV_– ß[ºìU¢Xµ|jô•éÈsÉR<±LËŒŸé\{Á6Ö ËêÎp©ü°£ÓóÃBІŒU0 Å Vn=k:ÂZ=ÍÉŠHæ\&KWFÕ’À==Ÿv‹Áj–‡CÂKƒ¯VéGûÑŽµ(O0=œˆ¨«Gï3ÍŒ2Ÿ¿.¾m–o¶F‚&*Úa§£<¦'OÚ:F„„€ztÒŒZ÷­ŽJÀ¡²~e(@fVeæ™k +g ðKë®á¶çªYØß̼Nªé:n¦«/Ÿi©t‡&<&©bl/ïTM6α¸Ù”By˜¾)CËecÛÐö+Sc}^»ôrª‹sІ:ñ—Σ+AÆ·š'ã$²VÙ¦ª™5혤¡,Y±ZËúÛÄFçQØ5ÁîÝH±/>è²cJ f:€•#—c «Ð ñl¤‡hF-«*_}C©’¡@šDM 731‹ÙKVÆÖx F",£ÄÐhŒXÉgÊ#d»2zPÁRæ…–±lF‡å€.GDÄYÓqŽUT!>”[•ˆ(! ÎYÎ¥J¬"-0…àÖP‘¦&¡ãZ`jÀ¡&€G*Iñƒ„BزRˆf”Âx ÷a'G™"EȈ‰$ãÀYÃFW4Ī'®‰Èƒ¬5Äi ˆÃ\ˆEV©œbL¡3ijÅ':\+’jH8 “ÑQ,þ°Xk#Ž¿ö’ùpöñ´–Œñ‹,*Xúà|ø'Î$’£EüŸè‚ʵí9q®óÅÞûeªþ‹þõß*ÇGö–XÀüpgIbà˹5©vþ£‰žƒxâfk<ó©éó€‰õÖv%ú ŵ4iúÞðR©‰ì™oMÀ± —߃=ßU¸ørÏ!ÎÓí ý½“wvn©Î¨w¶Øæ3`¶dÍpX ÄÇ1õ#î97næ7Ç›FÁÖXdâ P ‚¢ìÒ9’†Á— §gÐ rRläaÜÌn>w¹ç&GãGKp¡Mf±$!Ê(€½ Ÿ/Z¤– ã‰âÁ@CXN2#2*¥ÙB!(ÊÒ‚-íˆñ€k—ù wVàí‘ûþ”»›‚—çÅíåqr¶ý>¶ÍSžvJRé‹Eß F2k»Ò0?Ê"Ô;KŒ¤@ú¬àÂì#v´V%àĉ˶ÂaYòd¥¯l¶U8ø´ÁฟdÑHI“àfÉá$mHX%(Ðì›…↧*Ê@¨!%€È(j€ .ŒHX*BÑ@ iÝÖb€P¬F=*kЊºâyBâyÉŸn-[¾LŸGR}¯¯÷ûª-â×”ê%›ÉzÎMWµ9òÔA?}ƒs°jñC±qÐÈ›˜3¦ãõ÷¯Ðõñü ð¾r¯RŽN0<ò6Âl°Þäšî•³¨ÓK?L¤b––â…tmËi6Ýx™>±¯VR,#ÐE{ƒ-ñIʪ„‹¸Ufûº•ø°®’³tF‹gÄ·=¶ú¹qÞ³|­í51ìöl?³¾Òî¯Ó3|}±nõæKìÞ±†ƒrpÕËÒ?÷Á~ú7ç¦7"™ã‹ÐLøÜ>½–—2çò¾µ‡Ý»„öxƒ îÎKSÜú•‰3Î(©¶—zõíR½™:{ýµ}½O¾|nŒ]')sTÓk†Öò¢Ë¤å8þ48§uÄ!³êZKj{IhK-º$«“d&só–JT~f+0O4.EÅn|—˜’Rß΀¶ìÑÁ|npôç·ïÔo³žß¯Oé›Ie¯÷Q­åöwüˆõåøÔøâ v¤µžÏÕÖ~)ßeF¤®ÂVž‹Á’™zs²BÅs>âª>×õëùü'ÞH€(IÂ’€ˆ4*G®J“&Ç}ý:®Õé =š£å 3p3Ùs)CBPŠ0„¢ŠD¡)E‚Á<…&>5ðf 74'¼€‚kÎ:½*—y_göÈ{ÏØ )cê@1T:ÃãØ¹^%¥@àþÕàúÃ1þXA ö ã~÷z¼Ü@@ˆ[‹r~Ýì¯cV±_q¿ñÜÆ ÿÑÁ¿Ø ‰C<‡ a°ˆB*âiÃÍŽhÒ­¬ídÃxKz UÛ(0Ó®Q;¢­sdmù¸vïC_ß\ø‹¿üýð ÷‡º)b‡nç=Ýb.B Jê’{ÛÊ' m49¸ƒW²ñK[õÕv˜V-ýXêÒ(lÈ~‚…7Ý1L%@¦KZvÐwˆžÇ¬­7ØßÉûõýÏ3ûÛeWùßè‡ç43‚b«­– ØÅº%u%KÚæŒ]×» \‘ºdQ–ìÎ ­´jVS;\²þÿ_F«öžg¨Øa&Q¼0©."Å&vвô´ÛgÑ?Nþ@œØ窢4Ûÿ1õÛÝ—^|}ÆdËûy†½ÿòß_„w¿~ÜúåÛöz©ÿÎølýßùûöý<þy6ç”×꼋×.^º ÷}è==}ü¶å—ǯÅÏ?}ø]‹Ü÷ûvu¬/.Ä|›õßv©[¼SŸ§Ö½´•Ñï GÉ3ÄÕQÑ‘eçáˆt‰°Ý fŒÁ¡Bš öÐ"¦¢JܱAÛÃyÛXo)ŽÛÏ÷ĽFçÚûx{ÒÁÕWz…Ííö󧤿Ï) ÑŠÍp)TvO1î©ZÏ•®}2ã³ÔÒÕN‹XO«.írqéÖÈKlsnTPt‰Jëµ8à @8xjk5é í„>¢YczçvÌè%8¯A=ˆIˆ^AxZÚ¼‰YÒ¡TJÃå÷yþéØÉ74Wß‚RÀÖuU RtX0èñ t+"{ÝBË‘NœÞC 9–’mu)‚Ñæ V ˆf#jvÝ­ºlx$G–†,FæhSŠõ§=Íåôó[Õ|cWü!wYð;Ôƒ…*}éùv'T Æu´›uò$¹f;ºqùÎ~Rü©gÞ~EÃJJïìQ} = •y|ž¼ùb™P÷L‘BѽöÙpµ»ç>sµ«óÈTÚ¼ÿb|ô/Þ<4IyݽýrÖ's¯"=žÖN•¡YƘ§qs\.»6 «FªÅå´Ï Z_t{ÕR–[ñ·Ð2za9ÚVò{GväSnÏâ°¹+©,Åפ’üTßþ¨¯ëtæMçë Ò¡7 $“¹àNõmáU7ZŽ"58ÖÌ£¢#Ùbe6ÄÔ¡¦4ÚÃöRyè«Eêt¸¾Ti[¦YÕ—?´ûj ÃjK}ùó ¶m•¬†ú)«E­èBÍ7ª"Ê&jó¤JV#Ý^J4H»><µjí c0Ñuò;’?ßFO{аqT¤\q ‹òÕŶJ©ÁÛÝ\/!긪I! ÜÈt†l‰“ØÖ‰Rˆ®ÁÚP¶”†'n¡…`…qõ•\é±6W²söVPZ?G©_¥¯ÓYBÊ•è¨Ô'°n¢( À3DAæ¦;µÑOÜ_=MqÊÝÍNÅÜ^vÖ;&|:W¶Èõntéê7'µ¹[î,¿î›\'»–O1&жÌ–T»G¤‘bCÞ¶-uŠsoÌy´†./Š‘~TU]»®—Ìû2?î¤ÊÖÅ~ý¨¶òõtsu†'­Y[ÜŸ üÁö·!Kƒ3¯$5¸Ër¯å…k­EÆx4õ1k'ËÖ,:@DË8ñS‰(1«*² tüÛ€{Û„ùâÊÉ{´±-Ë0Ñ/¬=׳íž9 —·ÓÂØãb˜4ˆ5ÕcG¸…åø†òø|˜Ÿ‡#OŒ±š'üê3\ݤHx¹;ë¨R|›“6½š+‡0¨€mgœ³n ‚óóö²g`íÐ>ͪ%ä'ªXjj“󃸖6—œ`Ho0óÜ0YFÊæb‚gMÑnzM pëR2¥"\6Ó¶©r¯ÀsûwöN–‚¢²ÈïMÁÿ!ÓG,‰z™ïY­ã"³*‡» —UŽGÂï-ùu`¥ŒMËÜ ±»z´™íÊ8½@þî’\n{£Öf²^Sƒ@Ô#•JCÊzy©*Åô3~3’qo9ŽàÛŸp êFë r.Û[é»ë#°Íéôðc¾¼åÃö5. =Hˆ’uœâ~jqÝ×z¢Ùs½Ç0¾ýÐý“Ý ¼NÅp0JLá>™ÞiÆÅôàÇËËë²jR ë–A(0Y×úè?iÕR´A–ñ"ÏX{Ó~&è[ã®mÍ«{Ö…Wíï}p3Ûsìß(æ³£÷ÃiFl+ÓV,‰ ìb£Î–•~6§Ö}¿ Ïg}poÛYJ;¶¿ç×÷ý‰|<9{®ùå Ý.Ü8ɈeÜi&òû"^€:q±ÙkúÍÝÕÓ3$Ä8b]J¥÷¢W®Ã#ºpÁ-lÇÚ™©¶Š:Yó4À=OΔACv‡uF}Ìø™ÉX—qIr颚´…­-ú¾±Ð«£Ÿ:÷;äÖA¦ý×?]Ÿ\˜O†† ëZجõÇEç…¿tÝhæJ>;P8­—›—-!‹ ÷¹ºÍ:ÔëÂ{{ñÆgóË3ö.Ë3¿øà˜[Ÿ’&•¥`¡)˜pJ9›Y.Üѹ=F®£…íÌàŠrþ|ñú™~ù¼ z©Hx“ªr^3©@]VS0x¶—*X°‘½¬ Së²®¿T”Ù” +Ó£S^³ç-¯¼}Ÿô`Ë®Ö¢Ë }.ƒ›eÎ`Ã׺}í¿ñ}þ@Æ(RÛÿ+ÝÓË’% €ŠP´jI¯Ÿ|Þ?ͯÏË’ë_o üQ>˜¨¿guÎÚd,¹3’~:³UE#JÓÉßɽj*¹FѵgJW„s wd’ZªþØoYßõã—¬zÞÊî²c˜È(Ä&XdÇSAxPs ‡TÒÔû¸÷K\ò{̸9hÁ+`2£|Q+7@ˆDÓ˜Tˆ}¸Ä} ̯ÙÉ]ðQðÜSÞÀ­J»oÚ‡Ò-ºÑ¦× 2˜ÿ9yûøí…¹FÛà?°kÇA‚@õÕå½`SLD»å2[Ĭf¥Š]Ùç*lÉèÔHEP2jÃfܨc¦ªèܵò•QPU+ƒ`Ú̲jøì“4¬DÞ?“IÝâ‘Ñ1ÿ¡Åßòâ_îã³>—ä Íë÷³Þìß×7??ŒºóšMÑçi?^sýäô|¨/Š{6ù~¾s›ŸåŽÅi°÷èÝôKò΃¿ü«ü¾nËöôw/_¯}&Ù¿9~V¯p¤Hg´‘ÖæÓY÷™yÄ@˜gú¥/°·Ÿcû쳑Fš’2ýŤᘖZAÈG6%ä3ÛÙŒüÃEþÝQc×bµó³F[ÇõÍ8[-3üc÷þ;£µ™M53r1öL÷%×È-óÉdŽàè×õåÛðhtíä:ØG#0åqhŒŒéÇP\I@¤Ê5wûrœ8I¼’ï*ÞŽ{åòõ:b ƒß)j}:¡—ƒ¿f'÷–êßIÆWv2ë37dÐȆ‘(ø¡®/«TÉIÒ4Î?Hû‹¨t3Œ€†µ&AIÊ×ø(±Z/óÜÜtÀÎò‘™£7¨ƒIDãKøÊõ·S䥖ѫ‡_tøëœŒ°×X#PÇ,ª‚¥ôtÏ”œ„ºKÀñ¤K4¥Å|©3–‡]w(ß]#Ÿ}9gÊ´¹j¯zóÔã;ǰB•Ö|î½}ýúú2`¦?.Þå•iv[ŠxàÜõ÷Ï9Aª•†ÒÁAÂôs”ª]‘ÒÇnNû¬‚JË5`õû‘ýsðçù·âbíA€³~#Ç+3U6Z0 ÊVRR Ø…3“ìkb…äp®@ÞzýBt,¬åªlËp)á\hÚ‘g\ ÆZÿík¸¬'yÌ¡½ñ£”ëàgœTç·_†£e'%ÊíÏþÆI6©®˜P«ˆÙ`HKðLÑUv§7U΃޾ !´‘n¾¦Y¥ûügyÇ*ãtúÔÇ$/D“¸+ËÕ>z¼b5»ÒVõŠûÎÂWoqÙZœéަâÀêD%iè¼Q,NËv‰¥A@sßÒ˜é?8ªçئ~-[ê7ç•××ï}ôkåô-ß5‰ X3kk®¼SÖÑqxª·÷¼õ­¤·äúQÑsæÔæÕ««‚/ÏÛì~´B½¿vÓ÷i?À‘W5\_×úó{¿yý89x)A£rk"s%+{ЈÁØ4^œjolÿ⦵¼Æ\‹wV—üê¯Uçîù¸â±Á§i”œ‡pŃV(—½þAu–NˆŒ²ô‘™†“­--—RZ`Õˆ‰–ˆÜÉŽ´#8VL%ˆÅ\±ÔF³v¡Ðr"ÓI €×T‘Àn$8[ô ÂeC«ŒÚTÛ“›,`®aÒ>IŠ€f”EšŽõ³¨ykò´©*Œµu[$½Pq@I ¦È& ™pÈe®è~DNhŒ8(®@¦‡€m#„h¬7*+F)CŠå$aæy’-t@¤B,ÄÆ /¶á bj2ê†Z£ì9ÒqOcmÿ²®‘ÞØªõûp?3ŽRt‡—qG€•)åh §eNÕAi)Ù  ¤ùB¡MJfD„ZAƒ½¯e¿ho{ hÇ dóçÏ!5ub‚B¨9õ‘è=ì>€ÒSMD]J—"è.2µF”ÝÆM°h7ȵ†RÂ{ÆK´$² }Ä ãí,þá:1tŸi¶tPT…cixhýe§Âûìæ:X ¤)¨Ì…ÛxV˜îköVu›á}¸üÝf/ 4¹Ÿ5õ’ìàäÌú¨¯"”">º®éGÂ^0ª¥fçºG+ÛÏ4EÀŽ*òYt¨\Ñ•”™~üà¬výöÈŽa))í!d}PÂiA»åð*¤iíJÕû|Ÿoþ½Äù¨ICW¸±Y?6êzöúån}½ºcÞ|ð%û}ЧΌ[Z—WŠ3›RUÐ C‡»:AkÆà¥‹õÜ©ÄÅéþ®û„!úŒñ S ‡OºC¡ý‡4–~M(˜§™{ RX 9ï1åT4a.:€€Š±.)T’9È—!”2툅 Eó´ OÍn¾Çü[[ÖÕ4 À•V{üe–9<¬'±gm¡\^›){äxÎÙ“¦q˜$ö*,¤+]Á)i£8»ªÉ›ø„LÂyj!¹$›«4P Û.¸«òiÑ1‚†G9Øln²ƒBZšÁ" ³S[]/›tL]–!-¦»­ƒÓTj~’k‚ 4'b«°H°SJÀ ±7„uÒ8yã""ÌÙ®‚©(š­´¢ ãû”§q‚dhð½M e.cU&›;î÷G“‡ö£“ÿð¨?†ƒlÆ6`Ep Yˆ xµfp Ö-âŽY¹H*É!A0œ“ð:àÛ,„0&t\)£w[O¹«:b º 2X@db# KŽœÁõ[‹MN4@¤@‘ÏŠ¹0««_ ”Á¼‰(L½’¤B΀Rô&_¬ìË K#‚ ¦ÉzàŽKù>Ë0X0X&0¬K$ÈB"ˆ9?ðM’%OòÒ¬!ì‘Ö3Z³£¤1²9ÛÚoÞóíñ›¨Ç9ñ`¾dÛeÿ¥ÅøÔùäzò#·é»Ä“H_À…UÓå(Z­¹5ßÈdRP©)jNa³1U0ä€M5ÒLÄøâÉ>H«Ô•@7B,PÚ,”F§•‚Ž• -6øFK¢²ÃÍGïè°çžÒ4€–Ä„ÄJ©hÌ-M4} F@Z£0€˜0(P´à|õùy˜y!ŸË,‹î÷ñ¶<îÝŸ5€µ®fµâzÓ+v[t‡”´ò­¯ggï+7f\˜9GÝg-¬¥í-Sh´*ÑGnW oû€+”ñ¼ºçBñçÖ¾R¼û‚Î^ùúüû Ãï·æûZLªBÍwÇÐ&ñ|Ÿ´ûSŠçÆe1ðÇvÜ#ƒÓ¤mÖ=¾É¬!qç¡·’ÂíÝÉžE†IÉѳÖF3¨ØÜr÷ªÓ¦`bÕÙöÐ#äŠ<[´ƒöìšV»ä6//ø™çÖB×O)Ìu %PÕmݺç†Uµ–{º©Ë~`.“ÝjBråÆ1š(¡µ@u¢Â«{›ïñ®´ôù\”R+`h6M,Ãå-ÑØ•™âì…‚ãhJGX9c+\ðtÁʵ¦Mðz?,?Ëñ2¯ÇÔ¸;ÛÜ»úƒQrQÚ—Üîå¶›9ã:ÏG)e5ßΟ¶²ÚÃøüñ@C „lÃÿµó×ï½~6áùåjÜ`9ýÂú„z¥¼Úz|ML«Í^¸wGµmÔt÷Œvë¥ýº*P@È@Уá,84ë™ Ü1ѶݺŽdT”^*ô ùç}¼ÖÝ«·ïˆ" ¶+~c¹‹ÍL°AÀBVºsù‰Ì¶Î}[4„g^­G¶KvõC”cT0/^[YcVëµ7Ù)ˆß¼òe:Ž“ÐæìzÖ«¢Õì_¹úc?`» HE©^M~ÒcL€ðž¶&E’H›Kÿ€áû³[yð±¼ë[™e KòÖU/¾¶DÉt™Ö –­åµ¦FT‹¯/S›qÃ)[».—ɶŸ¸lS³XÁÚš£}¥º±QYî°~{÷þ~Ïf7û6ÞbÄ‘ ‰¤ÞR©Ôö0¬€bðÚC콇lèëÍu´ƒ›ëúò‹Ü¢ŠŠ5¤è‹! ¡°è§º—ûhP‘û z;fJòY—_zŸLvl‰–®¹jÛÿ$Û?_èöšEãê[×ÏîÅîW1x~™ß.¨®óµþ3ï½mßÑ‹ì+*ºµÆÎ]$¨˜uäKÀªà(;äpåcˆ¹ p‹ÕÉËk[+¡0qÜ´¥º’]ÊffÙ×›9Í´ËŸä{ÎÝžìû¦¿mê“d=Óü½íCúÿÂ?pàÍýjîŠgÍ_ßÿÌûõìšã÷[ýó•¥ÍmÉõÕVÉ5úrñu’g½8çs>ѹ͓AãÃ+:gý²~rúùÒœÚ{ÍüûT{¶Ã·Ÿïÿï]ò\ILQQÒÖ£tä¸ ‰Á(2òC#võ¼ÑUòÅ$¯Ô˜M£¡atÔr+ í„„e9¿€Çjëïçç_q6m\Ú¸Åï]žCã›Oå¿{÷ZÃ×ú‡¶‘€xÔ‡ÍKÝHnáÓ9G!Î.<¿Þ£?ÎWÉ{„BK^R ˜dÒ³£B*T*wÔŸ·¿Ï ëæv¼d8YßKoœ×“ù<øõå_K~=hÓø¡Cìµ:Éâ\’’wn k×8·ê©œ;!}ñþÍ™}9™.W×ÜÑ!ÆÂk¨uw fžý<™[.ðÈZ¾ò*Ë+uäJA7"´úq‹¾–X±FJjæ¨àÛ²^ù|8=ôÔ+ob‘P#±ƒx&Ô{ `ˆ9m „ûL¦-]ªêYŒw=ܯTˆ'ÝvûÁÂY¿êê鯼—?XcàÉU°2!’kC¢`d{¤8îr×ù¦¼æùKøµez»Ê%Äõ޵÷™-h«àžëKÑ- ;Iƒ’MÒ§9÷rËçe3+°$'Aw‡‰ tT0AR±Äg£„ðH3ŽØ³^²¿‘É6y¬*S‘ŽšhPj?´ÉXKKáÚìÝ÷O­ßùñz«ûØnˆn6¹¸0žð†€ô¢ù6©k*>*‚6«DBBY8ÌÚˆhbܺ YäØQÈNÅ]sÙWYK¯vŽlêB=cv[$áuô¨ÊÐ(‘ph\|-?ä²5»G›¢ÐÑŽNVsJ9°ž2^ µª+ݧ®GýÄ›€¶ã¦Ê¤!S”0Ï#Ó=Ð fç ŽLÛ#TËâí^Á»WÜd¥\’Ɇµyh+¡º"ÅT…°Æ$蕉£Ñ÷÷*Õ°ÒÉ~ý‡ªÕß‘Ý=Å“øKÕµþlãëîëë>_J”yÁ_ý´sÔ¼²Zý.º~cú‹óÖ1íê­UÈÙ©úýÿ>ÕÿË™wƒ¬»ýE¿={”ñ™ÇývÎ\£NÉ`í÷ý“^Ÿib=Wgx¬£¬.rÏûèy­ñûK00ƒ` Cj_(t©PðĺßÎómE}DðZ>êå"r‚‹¹7õ8d¿¥XÓHçh-fAãÙP,8Æa ÷gU‘x¸ÈÝ,M¯ %eËÀˆeó²-“oâ¸zb1¤"—ES›Äbp66†iK M•°&dÜe‰X¦Í#mO‡xpα®D5NPzQ2ØŽGd>5@EŠ tÅ ÞEe¦%^JÃïÔý±aJÄ>9ìЄ¢%ÖxpñgÓu¼Ë¤a£–%9p†ËÄiµ›ö»“~<{Þ‡?Põø×uç;ؾ×}ÍaC•ªÆ-§ÑGx"É‘ÈJ]ƒ¯ÇÏG×¹ö;š²P”¢ñ¢iNzVá¯â¾V†Uã¸2‘Š1B,UA˜Ïè½ [.Ë“Â.×d»¦ÙQ9^5¶˜™ÖÉ&–Òf˜â9šÎ3AØIâÒÙdË«:t"ÙÝœ5bMúÒÆŸFË…W;`С†·ÏéÎ!¢ªñ‰ïÅ }A$ÞÑíÚ`1Š/þ¤É#¤j¾ÐøH[øò«ùØ Ý«§«þ‡{cíÚÚdy»G}~~ùìýõëÿÏlþü˜Y¡A…E¬"+"¨Xˆxᨃ'{d2öìõs”ïõ©œJqŤӎl“²ÒȵB5Xã–¬€vk.*H$«3PC4{³½¬hQò¡`˜.ù„‹Pj2 Th LF:z•0ÀŽ7ãbe$õÔ2¦‘ÅVˆøÄܦ4ûËV後ì#RX?ñŒÈx—¨’$ç)ËKE$+xÑÎGÔD0)}KF²E½-ð~ÉÙL3%×þ;qXcæ¹uAØ²Þ öË-mžoi&ùeþªÒ¼’ëÇß®ï÷ñ¦¢Ôið1çššX(Jl&ÁÅjû3‹òÒßNÖ÷-³Ïãg­J=8•L˜C°á«‡ ~Å--nî€8àlFs†Yb(œ0CÛg.F¥$^Úÿ þ}±Å[QÁu¼píÏéZÚ T™Ð48à ”%GäÖQ`úRœ¶©§xÎQÀE¯‰É˜-Ú†1³ig™6™¥§0ÓuqP/+“$hGl>:ÏV²ê×GaB01Âà‹ÙuÜ ^ìYSøÆt'“° …#ÇÊ›e T…Ø9¼Æ!¬Ôt‰À(«j\HYØ‘˜4sÛÇ™“amŸ™P’D›²`,òÅÌ`ûÂHCB0²qîæ$Y4Y8—,û“Y€f„ƒ;ߟc)¥ºfê ½àeLðH  #$†ëZTÊb*T‰fEFnk%Ž˜$‘Š69s&e¿5—D^}÷ýõÕ{arÕvmKHòævcÐýälð2—±KÚ£ G¹¾Ó³ë<Òû02Íž´õô«•y¥RWPž˜˜[–Ѓäd^fŸˆÖí<’ Q¸•ŸY½…½;9Ñn;KG2„»¶ýVËÕ^¢þrH=F}ÀÚÔEW^@Êd¿¬zÅBªHÑ݈ÅY>ò.½|‰§‹ûÀ˜3Sºug³'·²/€D W0sЈwqUW¬ù,®ñ"òF¡ +¦¼›{¥uÜua²1ööœë û-ÃÓËíØûñœ«-ÝкúÜÄ}õ‰Œ%ÀˆÃô•vQÉìâ·ÆÄ,´DØÁ¿o¸ ¸v{Áh~¦I‘­~ÄEÐÚGM|wÆÛH¡s@ Ûç)«–wÜ3Jí uß*ýèÖ¸¯î~öj8’_ól‰ZÆñsßxÐ÷âÃ'Ù =Ó×sí‹Ì>ÏúTëåVuk_«5³öÒJª//8¾þ°š§¬4þtýøYÕïÌðL­Ž«ä)#øV°î"b”„ºŠTÖ<ç Ô°(Õ:´½ÓV¢5äð>«·‘Ÿ[“§51ùÒb6½' õVb•F[÷ôˆ! ¢„ öQ»›UľÎË·q|×WÀƒUh´´8’­^9"ÙþåƒãþˆØnDM7 " µ¦¼ 'núkíüõZuóU‡ñÁ˜ÂÃ(œ—ÈwUÉꪇŒGz]¶åŠª­{Qm}n­›ì„Ñ,_s_:özœíù›Ï¼<×W§¯™d%¿vxmE^ÛÇrsæÌУdqY‡Q£ßçšÄG1cbåSF÷©ÕÇkÝÎ ƒÁ¾ù«¨µ5m³>óû ­8bÄ·ð-‰6¯Òï†}ã#L`—ìÅ>Úq]¼›´A“$Ïwòä»é½Ö¸ŒÉézÝ¿)ÿÔgù²XÞÄ«C Z“OÎ…óŒý…f¿¯£wè¤þϸþ°¾¨æÀNÕ¨ žM-M€0!\I+W¨”¢Šo…þÿÇ©6=s5+€ª«än²¹Ñnýþd¾?þG׳F÷îœ.3îvÏìr¾þ„ïÏ4¾cQŠN/¥OL€ “ë{ZݶŸæó@P£ãÎäãâUó_Ž?¿üò|¿‘ç@Ç8ë\ö5q¿n_»cÍÜ¿ô”þì7©íãÍ‹GçQþöX~k²÷åv—žCü·ùUÌ,Rã“´{?ê2³×Ke•©eT¶:§/ŠÊ£²n1¢ZÂEF¶i׋¶´¤ÆÇysß[ݵFî8û¢¾}¸y4œ\^êìµ¹,P4ÍRž¹ÕJŸ—ªý cKv;ð5@’¤;™½µð‚ÜÑ&B=:–R$!%$Ù`Í8´ëŸ O“Ù¯a˜[ŸÏò±»–e>éoî~ÿ’þ\¥Öâ!®]L-1I†RYs…UÖqçMéöµ¹½ùM¾D_; çýÕŸ ^sóžCŽJQ}´p:¸½4 3*{ÖÛøÖÍ*ŒT€¨‹…·˜jÒ¢Quÿ ñJ7‰ÃìQ{`lN©5ðvI·A8Qì–8&‡ÅDdJA-%G¯–ÛhésV ^K׆Yñ¢ž ëøŒf›A±`µW:@sùK1“ïɯM.vzTë DÁ#… ƒÆ«ùÊ*ë Õýœëó:¤uªúõ±ìQ¿éä0ëL®zýü5îUËsïÍG±47ü‡`ÞçÁc`¤=åÂMX¯¦ìaj'Í)a@ÉPKb–Ê\Y¹5¯«¤µWmÊ5!áÎÈžJª?ËÂrŽ|=¾[\§Y“ûŘ-WYŒE¶Ž¹¯É´(q·Š‹Rr¦]x”6xÂóf|}ê¼-öú 69ÒÆð÷'èå'øõªöÔÅZèJ*qîóë;ø<ËgÁ•¸sª:•¶oçjk!—çu•Ó‘ s¶Žñ) 4̧×]-îûñÓAÅ}´6Þèn§<ݦz%EV,%aˆ b‘g"ð¬Ô4­fëà Æ’4«¾O31µ4n,žfGI¨Â°±îS!`Í­–k"–6´t¡«¿Fõw¿Ñß³%×_ÿ‘æç'Ðu¨û¿?Ïç}MRéðKiW»“KεwŽD öïgëêgÀévö6ëqq¬¾)'çç­¡e„5ñB\¬Ï³e±ÞÆÖ·õêóõ;çLõíÊÚ‡<3_Ï‹ÇíäóÇ÷*7¤/­wŽf›‡‰˜»ÞuNç\ô93Ò¨ÿH½aL²…`i+ä1ôY3S`ŸõBG+Ý0Ï2·0Э2Ž$•P-.›(ÍpGμo:.ZI>Y”íÔ›¹˜^± Ô”ØHišù òÓå˜!-rRÙ´6(b“‰ÅÝõ,™{lÅ(¢‹¥ £ÈlrîÖ‘öé’Ò34™ã5æ¸v[ÊÕ\±Sj»²˜óÚz: ð>³”Y5 TxV½÷;¸t‡¶¹5¢ÈÚÆ¬#`‚q³¦´dÚ$WŒ¹‘ñ$ô2_‹¬ùXã§ŽYß/ò®*·# çÂq9¯"«yÖ€‰ZØGOãÀU-®Ði¿CMq;D¦Ù£,†±oJ ^«ÁÔ²Úf§"… óÖòmË[ÙçÞ~7ÞuüÈ-¾>Ô–Fc²×ó )MÁ£Êt ÙÈ1'sä°Gã™æV³LÀTÑѬf–¿HÖÌš¾h®\í¶!™Y‹Ñxâ©L¢};0±pS}š­AvB¦"Žœ¤@Œæ=¸fClçy éEa“»% ¿ù£¸ÁŽ ¯‡½ŽAÓˆ'â}Ì)šÏ¿¬ñ{<Âë¼ÙEs‰ê]Ñõ f—ðKŸ½›¶m¬å•:Úülê5£ÿœÑWK—©ÏUån-\ þ¸5½æ_ÜÝÒCX—@BûQìH=w‡# Ѳ¤aC#ÂLŒÑ!…fzÒ¦fÑÛd3Þ'“SЉ™2n‘[cJ÷ñ×íîç.LÈŠ®¥ŸaXåÔ° ¤Q+5®õƒgs,{±Jsµ!fšžÉYâ %uþµjgi¨¼ËÀlô‹Ñ¢½UûÜí„Ê¡Üb0\þêÓè{¬ˆ^­Å±È›Åkz?À>ÃU–n9v7 iƒéÜÇâÆWÖ¾ps#jœÔÑ­Óu¶çæ~ì0•i«W%¥vŸˆ®h‘¨:·Õæ±íÔòeÉ, Û3O$ê÷Õ ÎḬ̂ÖêʸÝö÷šïâ£ÀnpEk±“!PYYµ¹N>hg® Iù¶[ / ˜l¥1Ñ0Wå"pú@ÀÌhÑ)L‰$Â’u\8ªñD1YÜ®¿×“Vö>½;î÷tÙpÁ Ís©H &G‚è'ÙOµ…ˆ~Yúb½·x|1ËÞM3BÓ*FK6Õjek¸¶‡LÇ«X‘¨x88ÁÎS‘úÍ´Ñy2ßGa¯^w>E—Nnœ;•î.U»j!î$ÁúØÐç† Ò²ç!ƒ²BŸáQ-Œ×–ŠÚÌ!ÎW*unžŸ‰ç–‹d»™ýÂñ†fOH-k@‡²‘oË|xÙSi6Þ&giÕA±0÷qô #›ö|©«v9ý¼Ò´¼×¢‚Χ Ö噯yœðš^­è¬x¨ßúÉŸCŸúä7ú÷2•R¹Ví!Ò!HÇ5b/ð˜ vÊsÐ3’t“ ™!Aï$¸,‡œIa¬´™`¸0µ¨‚5—¤É„甲£*–V¯×Ôµ®´ð&G .¼-×ð¾3~„êà $"°¦F!? AÈš%ƒ¢&¿ž_ÖLGɺÁ\Û|f©EVð§1§`PrQ%DæÏ‚Ï8 FKAÕ ÃH™0B†¦Â–"Òiƒ‚"rbA^@i …bzÇ#—D]¦ŒÞ)ãëú’éC) ÉX€H'³Ñˆ§§½áWb¥§6*õµÏû>º®‹`Û¿ÝÚZõ ;Çãøâ;éK{Üæ¯y]m‹³Ž´œ+’< Î,§-\¢æ†zàÉ¡f¿ˆíaG¼õÍÀ43é^tj(52€Í:êXbæYXÓkQRI‘Â%a‚mÒIÒdVx1js& |e8šÏ¨ ÖBÅèúªÞÃl]oÆBˆ2á“”#ýl¥M~aÚ$  V\’F²¤¬‰"’F²à&›Ãج±K2a€-,éB>³sÛ l0€DÓ\ª‘ƒIÍ\·Ëvy3…)¥–2à@hÀTQmƒƒÃ"|˜]¬Rg¸öCYœ,牄 !Y ¶Ç–6Dr"‰!ACqDÄÂÍqP"•’(²‡—†W’+¦L°Ëìv2že²hÚ˜V"-6tµ¡eCzÊeréÁªV®aàätûáõù•|ô8y“*T3}tÆë²ä{Ç;ÕýÌš°®4)º]v¶»b¥Û.zævNŸ´òÎ׉#6GQ‘¢^㾎ÎYb sõò”›7µXIO€¼_¿p\š%\ã[”¿°…$Õ…£;~•iá^;æ¤Wì FB*ÓvÌ„íÝÔ+JoØgŸ.ÑWW-çóKqÙcé:ãõ­ÎŠçëaõ^—RYB—·Ÿõ/=–kòó]{¾ c˜w}Q"©#ÄKL'p¡£‡eîÃN±<™)¡Í§ ÷g'ƒõ½ãÝ]É‚€tQ¶`eÜž#Þ³½oY^0bFÎkb”¹>ßÚŒ‘dd§È ¼Û?nów¹°”œ:cÅ® öÏñ‡ŸßZ\= u™»ŠUum­ åºc ¿½~{£ÿ\®/•ÀYu0ó§m¸ê:Ç•?zÞÔÛ·½þ ‚A}üœÏDýÃÚdÕyd®×_^ÙP(& b›–ÖÏlãæ6_ÇÄ Yð¯ÕÝ[<ØgÞžñZ´w… Ÿ·5h¸íés*”ŲҳÉâðA( ƒ"P‘&â䘫÷1ñ’ç—ˆÞ³I¡ºKàHµƒµú¥þü¦&¦?Ö™f˜1îå£ËÙâ UK”et\AU‹9Ák+ÿ6ïÂ`Z{ÅL¹Ï¡ÖÙ; ± Àýžú÷=üZo}½‘¿„KÚî {jîˆ&m?çrêzO_UÝåSªÌöúœ¬•Æ‚—¢Ö>O·Î¨`œþ]ëç“É|ƒÏÏ{iwÿ=‹ÓÕÔùNÖKû¦yÉýcHïÌsß||ú³Ãœb¤P`ºNZgAšdÏ”(Ê¥©Ï€fôÆt\unÝ€ÔñÄ"G̓)3’mзs5Fý³WåN`¤©\Æ7¢Íj×<¶xšýæGßïônv¥Ÿ{zœÖl-æCaÓÆ²[ͦ_¢Æ¦ýßÎͽÍÕ‘ƒ¨uþ/ÿM‹úýŸ>sZï>ýâ_Îýrü ÜuÚ¿ë&Ñv Bd‰†Å)w“ŽÝ+ÏâIÿõçúÌœ×îïŽuôü蜞M_O™|èƒÏgàâmÎuwÎá|Ïþ „æåòªý+k«¥Õ΀xÜ·,Wû}$í Ï“_ûñùõÄ;›'µ†O¡•®4WÒÊ?ŸD`ªúuÆÃÇmls~r->Û¨‰HÖÐeEŒÙGQÊ‚’¸íÓˆMz FéÊÉG‚¦(HŒ¼`™·TGÁ@I¨ 9ED×t½ÏìHr ¼y)RË>_éÕd‡šábÛ˜GÚä¸Y…í[¨ âÚ±ŸÓÖ}-ð&”ÝŽk¹îÀ%Z.“N”‚"D(aµ‘:‘ÐÍóóºÅ#o‹¦»N¼C]þÓç—R–Ü¿›ù ž5·¦TÚUº'ËpÔG&oõ’Cƒ!¥ae¥¨nï¯&oîè«<ŬÝ/ötï¦%¢¤Oƒh¬â($à?ãX]-SÀô :1£æŠ:¼,®eOÌŽÉ,/F²º£ù³üyÛøVoõ®¹^å?öt5U=¤=Ùl6çaÎüµBiã¾@¥í½´Žìw <%¬ÃÔáNY÷ äBUía~F|=ü­›4u´|D¤\1hP¬(ŽÏ$wít¿ZÎ2“’|æƒs]û“_ž¯Níþ"3ÅÛ9é-¥&êô}^teyÔNgŠ›|`uÀ@…¥N{–\›¯ÝÖ×6;†œº”n»9ŸƒÒJÀÊLÉ~įo¸æjñu×j€‘RD€²¬$jh,šre²ÜV Öö¶;;Sv©†9cK°Ól|%}3C¯ ní¶ž·r®qöô/M~±ŽÃõ§hHø@ddc¯žuneåÆžp–°§¹^xUkµ÷µý|U¾ÝÕ… Õ^éƒjw6n¨žnAN¥S‹e‰Ž4U+wëDî¹þ:jÃ»í²ª²ZT j:fÕ›(˜80[Põ¸©ërMŽ/Ô²ûÎI^{(æ-†ð$I6ÃÈ8-‡+ÔN¸‚åi[*Je£.¯b]AŒ‘Sß?¬ë˜Šn9Î÷×_j=zÖ´uêÇ•î{Ò¸œ\û\V­ëD^>Ÿœ2÷õº÷Ÿâú|‹nb»1:q–°o;‰¢Ž:Aj 4ÐóîZ°&ž6™tîda¡ ô´ž/Õ:ÎsGRc3=ô/«ü„Óîó ê.ˮ̤ #FªÖÄ{\Í1Õv*¾Jú0¥ƒ G“RŠŽ/8ã|kÅrTYq%Ðüâù“Mɯ®.O~Y%”,à˜q`þË ¬ܱŒDìÐË©F4²C@A <¤Ù–œA¯¥ÊYK“5H‹‚s(9 ï“=ðs.ð.ÍXžªÈƒv“,°Ð¡ :„h03ÜkÔ×À ð›Íò`/à»ö¼É8çýó¾þ?Ûe¼áþt¯Ç‹õÅY’2ý€†Ü¦é ‡Y!)ßêýpÁ4y»QÅöœ(‘‘£”1a Q›þˆD‡D¹ËµoFRÆF<Ò¹pµæ‘¾½£÷e™¡¶#tÿ¹M Åäd¤Ø/G…U&pkL žV·ƒ& I ã±2š´˜ª9B¹¹R©øalë†û’·+Ä4ºyd½}´Y±t«q{7ÎõKô³V¦çÓÕÂY-°-¬‹q2TL%)·»ó5ðÊþfV³Ï,ÝÉ·I‹Ã³GßsühöáÔVúFWÔ™**r5&s°h&é^ä¡O _§qÛ¼Œ[–¬Á6RƒŠ×áìÅýº#G\óvê£éŠÞ ©k‚°öšM2Z‰AÕE5[ðaEÐÒû¦Ñû n KG §u>òòöŽÄ“]‡dŠ›»^r¦?Áu®÷ÍÙÏKï—ÊþaB;üêýìôQyÖ?.»zXF‘HµìôŽNåNŽ«ÁÛó3dD Åä:¥ïž8Ö¬äY¡þ¨v’~øö œ}E Y4êÛɦúûzðïþ†çý'7|^æx¤Z-r€fZÞBvsÄ¿@·â­+ß·b’»\èÜ4/â—Ãꇫ™q}w¦ÞÈ×ê OT(–ôŒî^WU &àFDÊã¥Ä]Ó€„ Ú¹¬x e-ÓšÌjE‹ @wÙ87 "Ë‹Q!Û™-˜¾ùt-C½.‚„CФ:p€àÜbþÓéc%,MÓå’W‚+VÌšý²½T©6ƒvK9\Nµäâë$s”6óßÎó«n¤ Á¬ò“™VL€¸@ˆÍ"DT¢@*5F£¶ac¼âçŽvªKÈSïæ_äÅ º2€fX‰HiWn>Ó9¶{x` 6Ûlkšâ=ú|Ôd®öóàôé¹êbL¯4…’&®Ï¼–žzïs¿´¸½Àóh‘™ØÝB¥ŸÁî)úbj§ìB¼N›a?7€b„jI ÎÖˆý+„u¤£këí¹>üè°#ÂR@ž3Š-+KîÌØLLû¤=äå&»¸]Âb_̳ç™B[ky˜OðÍ]9Š¡d;% ÝtæZJ”ϺéØÛYe×DYD ß묟4㻳¹–}yïs6oó(L,ou·¸×)Ô~›^ÛNGiDK!DÁQgT©‹;u9#kksÙ™Bð(w˜™n…mšÓË»0V Õ «Ãó›Pû”vý‡3mýo¼Cæá© >üø|¶çº|âÊ«'¦nÂøõž«ŸÓºÙ&ΠJQzˆÑŠ€ƒ çÚ¯_s½Ž-æÓú²±@’VNß¼ç/’á\±¿>_÷–ß¾©ç«Çù%?:(®ö\|žÇs¼uÔ@McmR}ñ„ùÆ\¥Y²N\L³½¦:xjr«V¯üèpŠ,®¸¹¶›½ï|öð¤ÓkzPHa¨³–°ÄĸŒš˜‹iåf•˜ŒQ{9vömç3ûg°–qicÎÛksµ÷æ½äÑÛ1S5k¹ù㣊½Ÿ{FÌ}½ δAA›H†º¿¾Ýñ¿+ðGïà´ÜvÁ™%¨Nù1¯ƒC!¡$°!Âl½þ!x>yýöG‹B–T¶Ù)õÊïò²ôªa*um®Õ«ìs· ë¼úÜgR©94{l‡5«¯f È{ýÙõuÒx–¥lÍäùáÛ«K¡µ7'œŠïÅMžJE(¡¢J,ƒCÍ(D¸ÄD›¬Ç¿L_£"ÀÛ€Þ2…É9²Owÿµ)ì’Ñ uÄ…òrãX`›Iúçë¥GLl¶Iãá _v ÛæV‡ÅÓt›|:¸BÆL;ИÛÝÕt–Íe9ÅýLMΩ`ŸØêà¡á¹æc*xh ‡!£;ýüþo÷}¹\\†Wag.Ãê¡~òMY-¿i~5Ô‘žß¾ÈΉ>í“þñiŽïëýùb_iú{ç zλóWæàÎÙ5 œcGøåáüYçôå>¢)*–½á³è9:y}Ö _‡k‘\úù”|0Ö¿èüý2ç™øL^â*Ý4ǶŽô2%nñ{’ØÍôùN@Ã]ò†gʽj?é]Â&¥]D“Ñ à«ê5—@£))ÓL²9Ò7Mˆ¥„AeETcg†e#…øÜÛß÷Î3ýÙÒmr-+#ª'/Í!_ÔÉðºçŸ¤º'žX÷ì¡s©}fL›9ƒ¤D®vfÊG ’dØûJ@ævº›? Ÿ‡<;ý=é…€ÄÄmY«Zî@4mÙ3éjãá)šTüÙ·ÚZU;!•Ó.µ, ·ºÈÃôòø Õ,VœÁ-[ÖºìŸI“’Ä<ªh¿§ÙW¾{mO¢L´åáAíÁˆԨݎŸ&$BŒm[‚vÇØ$g¹«òœØ*>ý¨J¿6 ¹ZWþ¡é%$k‚ž«úËlêäüCÉ&#âxíd2ãŽöX<¢ìâÜì¯ê!¦Â°ã]À2#[oäÈ6[Wú÷—*ÿ›£?ì¶«aEÏ8ä„@\㩃G/URsÞ¨àç?º»¼úràj„žõxMUÒÂ}Øâ=sÓÖhƒBÙ#ˆ6„ÜbÓ†=t¸¶ÂÌjZß“Áí˜Ô¦Ùè Þ¦&ÏvçUÏ^Ô·¯5Pó£~a?Vnñ@GnéèÛlÍKÔ#uÍžµ‰A_ö¾É¡Tí‚Ø0aûQÕŸ¼”[Õ †ëÈJŒ×}W<ŸO®3Ô7s&!*"dëû¬½_û-©Ó"îâq“?ëõEyAw’ÒÁ¤X¨Ù9{:©^6›ÚJÄV/ú0®Þ“L¯•Ò ôž´F…ž“\±ª–ªµ÷=enõ6Ó®ù›(Û¦0Nƒ£j¶Q‡ ÖZN%¡¥N—;••ã#µíjt`q¹lb`Ör5-£¢‰NL\VýƒiÁHÿÿº³îΪ:¸Ô©’gû«÷ºÂó8³/¹„÷^f½ìv¢'X¯dݯŸøOþpþd+wÝŸ†Ý¡¦2p­íæ¤î>zx-ÐöÄY&=NJŽÏƒË t‡ÆV´˜éýhT4LÁœÃÎ8*!÷l/`s*˜ñÉp‰ Íh}±!ªá0ösoÝ Í!t<[ ¡ËݜŰè'dXd€úØl6²NK­5Ì5¼^Ÿô¦£f¾¨å§!‚vŒ¢€Å4)MùÀ»»#©ZË_©—K T€èKUB'0q$Ž`KÀAi“ü|ózAгÝ:–Ršö2[róµq­W¥æé(oKE¾VP*²£"ëiÕtÐcŒÇ0Bë*rfÚ)¤âõwÖw½_¨½ä™Ÿî*ƒPéwóYu@5#Û‹ûõ&qçƒNÜ[«ƒ—ŽE~[×/öVÖöôüùÚ±U·i•-€T»‹D…Öûn°‹ïãQ?Öíä2·ûÇ\x=2õÜɵ‡ë‰U»—tÉ–ù5ŽâøÉPZžÆã jÔ†ˆtK5´ÄˆÆ …Yî7²Ž›ßªòó8ˆ3û¼xŒé~w8âÁL÷JbÀJ©«f³L;1™X*+DÑÄOù«}k½Öõj5ÛÐÞ©deiq´øò÷cíGL©±¾z Í ´„ª¦Þ·1ãq¹.Âàµ;n„A?Ønzã>!÷¦¿·ËOõÔ¾\¸†fp˜&÷¶­¹ÅÕI¸öæø‹ üºÕô¡]¢åŽÃU{=|Âü®2õ÷ÝC—àʶ¼º“f[) ¤™Ëö[ý7h-gsfup ú´¼»UŸ¶ØWU»×¢:ʵúD„Ð:BX¯Žšwhã ƒKnçÔ¾uב[}pœnJŒªly‚1 êAeÆ£S#«¡;ëdF0ŠÒaß=©×µEhjî.yβùÏùŸW³›Ì_ƒ›ærcÔž¬ÄÂÖ–Ø«ùìYcÀ¹0i€ꑤÜà7Oìñ`ã åîŠñ‘ÞÍ"C37#&Ú€Q¹CÚT£Fâ.uª÷cYgÝúwËáõ M0}³þ§Æ!>’pˆ ©¡®v§™tÄ;TË?žÍÈnµÉOEÛ‡éD ‚ÙÕ…R>Â_·†WhklVÈCá,ðp®ÂسÛ^ç÷7_?èÔì`Ùßȳhs£QïõhnW‡EÞÜÞ¹¾Þûþ+]#½ÝÔeÍÏ:GJý¹ÞnxôÜïŒóþåóO ½:Ò•Ö:i[Çi×ùIb<úÅz¾¡E¥?çÅZÞ!’·çG8ðR ˆâ!;r@3{¾¦—›M ‰ª§Ìq3õ äãBjn»èËç¿0 ›ò‡–ËI‚û% Æ<Ò)kÕi '}^µjà°Ò]Ñêª M'©)ÕY5¨XÕT>ª e±qvðô™Þ‘µZ캹 ÒQHî-³º³ªñt¬ÔX{e(E…KiqROEÃaÏ·rÄ+§ËçGweSª˜xLë‚,/†ìVSÝ.íÜ m¿p[ü¯IܳÊ%MaÖ°ãµ~¬êŸ>Öÿ¡N?4ßÛ„:`‰`,YS{ˆ)– µ€éäÍüˆ#vg5Åܲ‹W Xp'D,AÚ*±@00ê½wŠ$¹ ÕørÛngHyFÆf i‡¿˜W¬NôAˆE 0c¯îžÐt .ͬùÞ+&x<©JQ™Åj…  "Ð ¿ Ujâ‚…SoUåÜøqò)3vÎÄ#&¢ ÇѲN›Y0F£ÑaϘöÓY€ ²„È’ðaÎ$…I’°© … "‹óyš˜å¬cO:y0ëZrñY/p<¼øV:vøi ­±B;½±ÅÅ}$D±–¬Å…i¢ÌÐçßè[[7a®?–×ú—¥ ÛR! ¡f‹(t62ø¨EòàQóE/hf´_ 2Âh‰©ÖB»(>ÍÜ`H+¤(2mÀÇÉfUUlbCüã”uÔÍR ñ!‚€/6;}# ÑfQäÊS£n}«ÌDƒ¥FüR(šŠba’‚p.˜´®“fæ°™çt¯äÜØ7Ã0€Ü8ð‘ÑÌg5"ÖMs²žØVØÌ\\u÷Ýö8$*4¦šÍ¥g)A`C³ØQ +sÉ š*KdIÁv4®Ám›Ga0hF ,0¢Ò(D¢°ÐºÔ¶^Ðz´ö:s}K®U¸H× éÂVÄnx›Úij]m4Îã}7ja»skÇW¬Éà8®¿z~4ZOð¡Ù;-{”R›õ÷Î{Ò‹(Ä’ö[)n1Z!A‚²Ð{ÚQJ­2bÕÜt÷Îëò,hqö6k)%¿¯[ÆÆ?fïrtâ¦à-T3 G™]F;%Ã,ãr_,Åâ}þA˳r´ÂÅh„3\öÍyÖãLww„C¿8,a¢ÚÎ;O„4OG92]ÚºŸ›Ì1H‰é©|¯ã°Œâª³òég¹[ëì–Ø¶ n²|.¬Ï¤:œü^ùŽßãô{]¤}Å~k¶T^îxȈ”ò™ 6´¾@ЧA †ä"©!À0ƒCðó$tpÂHT0(ïw\®ùElÕú32ºù@s´Ä+l‹9ÔÝËwy æ}/w"ÿÎxì\3XPüŒ—:Ði¡Œ³aE·ˆ;¿üv×Shú„k0Hh2/HÈÎfrm¿¼zþE¥õO†þ™××ÏýO•WŸc55«©3 Ó†Š|'oÿj޹µ=kk.)ÞµJ1fò‰O¸S‚”´Ê˜«ŒÍ¡myv®¢¦¦|…ë±…œyžàsXŽÅ´¶,+†Ï‹÷ E» d(B"”tCy3©CL9ÃËjÕh´3¾:#ûl7Öë–…˜¤4AÈ 5ßpç,nU|9fxªŠ¢Y|2{:Ô¬ŒHv–GÝímZk'OC¥y¨¥ÚÞâ·“¼N+®øÓÇš(ò ’àÎJ±µJ‘ B%€U¤oúyó›õ…Mç쨇¶×£¦ì‹Tš®çS{u,TS2!²8'bÀâ˜783›+_o£Ù»¡£ƒ&c²0$úiûZ«Wñ~Â2nõq<»™Èi4Ý„u.Ä QŒ°_Ø–]úAéZ+é ¾{lžÿÕõ¿ã€dœ±.% §@‰=x,s að9OÒ‰wÚåé£ktk® oBÛ( pȵÀ-óãŒ+P0;•¥¢ ,Õç èyÀñI½uUN(‡—Q.¾žÇ(|>¿î«C÷”Ïóƒ£/²ÏΧ=3}óÉy~ö|Vòíû³óœËèÄÕ¥¬÷¨gð_Èÿ:æmÑñp6žl79ªµ­ø¾Ÿx–S:ò, ß§i¡c^)Åï“Ï…?Ó5b&$Þ1±LqvÁˆ¶ÕŒùš˜cyÆÆ3-‹ì0jÛÉ1~Ä#èZÙi MãZe"Äi©™ÑêMWÆ3\¥ü¢[0·0³5„èe¦”IÈn Úfºe:Ñ­çB G¼¿¯ÜíG¦²^23èÊé™âª[tV]½Ž |ÊœVW›´FÖB÷–g†d¦±êÁ«”–èðl|wØ'ž¡Žz ì`Ò¼7zlq¯&dÀÝ£q†/IãŽ"\üÏìÆ> ßSå爛¸Ç‹5“Sâž,\²îzUaeŵêì ~,&»¬…±%Òº’ÔaçN³8xˆ,QyZC–µX|OÇŸruš¨a­>ÏëO~­þ”ùh=‰»÷ú$y°÷Êöi{yi¶Vޏ@ÿëÿïHoX«Í_DŠ d3çYv!YÍ=M«c d k)ßZø\ö¥6wèVUº¶K{¾ö­ëU q0 ”ä'¸âx[}•áÌl„3YpÃT½„ôò2U}SU"W)Zõ×c{z<Þ…>egêOMìPš¬JσÏѵ2.©÷·Ä_Æ~Á) D hUÐ6È-¬¨R¥=¥ãa'â¶¿=ÌnïCòæÆÒl©Èƒîdd n‘~ìÝbï‘hqþ¢]WX$3íž ¿fþEþí3½þÚ×k…+±Æö¦€Pïþk_ÖnT¥)eá³·\¬}Ï=Òù‹ómuþº®«0wsí#Ì86æU‚â(ÈAY ŽköL cF‰ »sñîÔ2‰“U£ ¬ƒÄB’*fÑýóD,”Ñ”¹*í6X¨ YÏ«G]¤ e£ëœÝô‘AÏðUsk@ʶ ‘·^›.–{£Y³ÃF™‚UžŠ€jaY+Ø•C€Ö…ª¢:¦¨.¡¦Ô40% ƒHJX(±\ Fñödý¶•ÝJ¹ æ’%48L¹©òªMæ­q´Y‰©ä¦#6Ì…Cˆx¤„hÿ²«n}†òž,Y" e pNù#Çö€1ížœWìÝIV‰ð k¤FïU&Î Ãj5d…ÌÊV„ç3ÏÖhDè~¶{?®¾_ÃëZÿ+E«GºÏNïDƒáð_Òâa>GzëyMâà»_^³êôã„å* žoÌ႟ÈÝW0â«|äµ W–iz:I¿©GÇzu(¹W± º¤NîA¢ bp!ÒYpmnn„Ø×.Khe@£z ‹›A%zÌ{°mζ‡&¢x¦a¢ ÍPK\»§éÀH„†bAì1¢ñ$£ —PÄaª2ýÞÔFY¬¼åݱë»~ííú㱉üa9ßCFÿ1èXéÀ xSÎÛÊúäágÑÔ–=)WÐøA¼EJRŒQw»QÀ˜™Q$ètu'™.? .Î0c[´³èÌq†@ÓÂÈ<ùb?MmðibN9 —¦Uö½"rfÿ(¿òu¼ âóšFµº2Hƒ”µRUK3›ZöݰP,ñnHI:±:MdoË'ϨÛÕáu¥[xž±ÃMßÍÑ‹1ˆ-'1ÙXØ’ÂÔƒ7/ØHìÍ•½Ý›u>OŒÇɾ* ‡¹•›k•Ïê¶r*ià Yèe/À€Ó•«V ƒ1í-õWÞïÐ2¬ ·À÷rçbrt¢r[N}]‰oÈp4ÈÏB­Žcîz}îJíî⛉ocs~£7ê­P¡u &ÐÞ„ôSÏ¿Ø{k™Îs<~zúŠâ2k*>ýó|ß¼‘Ý?vÏ÷ã†ÊŽj0O?ì÷Æý˜?rßrìž¿2ƒÎ1úq¶öØŠèÂÕék‚®çù<´²Òꀀs+ê ßÕú³Mý\ìÚÒ²[9^¡MQvÁ99ù]|ÞaîÉ:ê½À~øây¿™5í P×Ùj­÷!‡S䟸\F¹Öè§½~÷•¯Ó5s·êäŠø¶÷øþþ¾}®;ýrØáÌJô"š·@zÓméù0eV3Êà× [QÆèts…½à¬ÆM‰«¥¹fq⇀ø¶Æqd|ŸãÚFíT´@¥ÛhZîÔ ‘!cØ‚N±¼\€ði³4'VâIÚ´*ϼ˜bÞRz–åZµíµ•BBHÅ9ö[(¬á†WÈ.Ê ÉGtfæ°% c&aEötª«Û»bLÓ;óŠdó?ñäNúãþÑþ?'’ôH⪠…ZTåheÖNМsæ®üQÒs‡¨Ø "±´ˆcÙ(±M¿-Qˆ„iQ»Fb®_·/\¾-štOžÉ"šAÅA7éˆS¢–bj=kæê?:ÞI;RSk`Ø8íOëIÀàû®°¢kÀ Ï8€qº,YòOC›^´;m½ž”Hð Ó¦Œ%–BšIYÅÎå Ș€’o– ­p(Xºj²¾‰C¸sñ­`øBà3yôJœë!p‘^L…‰õû͵ö´ƒïŠöš+GÅRaèÛnl°­õýéFV4>e¨ÓÌ•‘eG¦sç‰arÁœõxV”©%Ír·h…çÃ61ù5?üWý7›>ôÅÈèÓŸT3‹xÿ8ð“Œ¨Š€V8|3f ¦kH$b:šK´ÀÜ£XØŸôÄ8M„ÿâ‡ð¿“Ù‰°'Ÿù‹D«6¦{(z(+„xìÓŠeµ¶Á‘”0À("ý’›‰’‹œ©"%VíÍ6[ˆuâ²RK.†°²ÑÿË 4p¨q¢i#8ÁRÁÒ¥S›||UYRÈð!(å.»îìAfb«©R Š“$ÙxÏI›0Dc V[*9 JŸp=Q”óQb³Únm4PN2 ² VT+H°Ð¢¤$å©"ëH^ÛøuÎüú—jû_nìvpw#»z¿ÚHµØ4»]ÇjÆÜDµ¼ŒNÇõzÖRXiûT_8'ª è!²$#°´/gV×5ÜAp”*–öã…ýRÈa…}0£é;Zûfí0¸.TC×ã}>ëC§êlœÂgûíëŽLãAW :Û30«ëDÂ+ÇK­gº÷®Þ5ê–£³/°/uG`KïÈ€ßxŸE$H°±OÈšÜ3ûäÂy¶·u†Ñ[I‹áh³ï—À€àÄ> ³ÚÝ`>ôLè–»ƒ(ÉJÃ*ÄýÆä’Â…\yÊ;¿èÁvËzä”*·Q’&màõîêª ó‰Õ`ë½^Ÿø6ôgtû:×ã7L_ŽhÑL— Q*yˆ•ØU|zwdzÀ`KµF+òp·’óHä*%qo™> ø¸£DÚh<_.˜ÚÏ5Vtfòzgs~´Ïµ~>i0C ²&iÇ}Ä™{ªÅhí=úë£ò§ÿw2d.ãON X /fÿG,ÿôO¸óï\×ÚÿÁwÖ?®ïÞw½Íÿ8çë÷¯Í×õí±ö¿Žú‚Ÿê{×õvþö3eeÊü\ëêIq¢Ó50s?ÜçgUG¼µ¥nU8 ³pÿ)×ßY¨ÊënÖ9ª•»ô­êóµ(D€GðlˆRÌR»Ì.ªÍ‰[ãÝmî —‘ÿŽaP¯_'Å9g^ÎKûaó>!Æà+YÃDö¼ßûµ%gËÞþmB!A EGkxÞ/ù(ÖGÎ÷N]˜%°ƒeËÕ.Aq¬µ« ¾¯‰šwIÄËoÇ㣽¥'~¼ˆøzÃØˆ¶Ò„npj“èè Êåݺòsâòˆ_x>¼æÆP#ª·Jˆ×ª)Ø>9„s«ðººlØ1e-ˆjw! ÷Wçs¶É9;z¥i6*2T¹[,×®u~âÎðSŸ‹*Àç2ÜP‚G+ ùìòè|0ðÕj ½öÜó_|º­_¥ÅnGwÑûÄsžÏú°Ë÷CÒÍLt]ª‚ñʯín®ßÏbNÎiF—Üûae ¢ÒÉ<¢œ„C…yi(µØÕ=îúI^‡†¯!¨*dzâÚíÜYö"* díV¼hŒ7¥c휄_q?ÄÍî÷…à5Î%±†L2PIÃ-ÐÀb÷|7ÐJd(Åfà"3sú z£›r°¶÷(t#ÎR%0ºVq«Ü[±§…QK;íg±,3æ’ê$Ul…;“¤ýyDßf2¯Ìè»Ì§7®øË=Ú´:F’5þ‹›_±np „ÚQ›Ú§väR¢¡aNçÕ/é ¢¸Ù NÊö&\çè3'.©<-‰”XhÚwGïÄ$ŽL7;òh?f¦‹qgÓåÑN`aÕ%D団-‹—Ö‚‘=‡njˆÝXV< j† z‚Øâv-ZÒòH¯"¶K3ÞLOŸ]{¤ÜÎ…n¦o?[î+N€0…âà ±è¯ü¡¿$Æ C¼ÃÐh”’m ŒtÊ€4 ij.ÄîLÛÐzÄG«ì;ûXZ¡Iâ!TaÅüùK{IBCëüá3fÔ`S`Ë™G³—×Z±’‹{¤‹¯ncY³Â½¢š)ƒ·À o ‚‹Ž¹ÄÖW¦~,n:ÈhÉ S¼V¢4ÒpGË*jíÀYÍíÀ–Å…Þ½–=I³uì¥$j$&¸ÿ§q¾» +‹SÝDìN$6J#æò‰»J—¥ðŠZ–†*¶:xZ\ìi(=iׂ¹J¡½±…ÉÕN$_(›©L+aA$H©A¥ Ü"š¡š®'äIö`m¸\ŸZåɰ®7Ï]j³yRæTÃSnªIõ`µHnr8™Óª¦£ìˆfb˜©p?Ù '9ÃQõ[¹U:‹<ÿ4;›q½ÅÔqÁyá.FDö¶s™µ¡›güZm‹/WgQÿ%äßÀ;}Œaåào•ü—RüoÔü—ÿ†ñš3¿úb5Y-öô>{ã\·›‘<[ŠQ-›Q«0”äŽ÷«óŽççö$/ôqãé¨32%$Ç#"CÎe{¢â‘Ú¨)BÑ%l!oH€Hfq'.©”±A6·±>•ÖÎÔ:z×±èÓCd}^…}¿Á¯¤è2:Ò(ƒ"\30¯·/ù+‰QÁ{µÝ¸ =«r{´páë°Ê 3 ̼'4æ¦e:ɿܠ7 %4XÆÚ’¾wÊð‰%~½–ªôMpä^«ÅˆqÂÈ£FwK/Á <`bÄRZÚ—­„©ÑœÜÖù9ß`^kþ:7l«´¹¦¯Ês<˜Ù}Ê9a²Xv\…_늬4ÕÁÒæE_VkƒLs•b“èµÛ[íÃ3Ûò·o’¬ÜÆu¹rllûìJ– õf$ø£‘ñO¦ñHè‹c½‡ñ'” W ®™)ìg+ó§0›Ì5‚9Ri1h öjSý°ŒÙW”Ç•Û çw,å³¥²Ý.3­ûôÎï+ÚêLÔ‡M a=àRuTÜû¾z‘–lFŽ“¯ÞΰïÇâO#˜CóÛÚŸb/[&yÔ³TÊÈ^U‰±É 2bëföp‘XVMs"Í~y·è´…>Žáw?š Þéã\ªårïY—o¾êA‹ëÅEÅ*~/'h}s˜¼ý$ÚùÜýÌ“q·¥¡?°³fçòÜö˜­¡€ìµ­·Bð’b<¬U‘-Ȉö²»ø(ÔíáEh2¦'Ft £«4÷8a×ý©Ÿ1®«”PF¼z®‰ŠÞéTIQ.G¯B­º+Þkw‹ªÙåÝn&:ïGÿ›ÀÀ­&c¡jŸ:1þ¤€¯»Ù7¢š¼—}¿“ÜBCõçœphγ¼6âêÔq–húÞ‚p÷ïÃåÊUË÷‹]Å]—?ãV+áŶ~­²]iª> ú6ë1›Gì‡Ê©ø¬–g%oÎÛ§ÑÍ|ådzì{k `ͦëpþòÙ/¼-=[¯· —{«ëµõ­'ûlÏÞWð “ï×êKºÃÿUþ"ú~;J-UÁíd/Îý\úi»÷æÔÉì.Am_S^$BÅ“ù;µ!.Ç‡ðˆŸ½3‰Ç®¯³¬¶‰Ò˳âÓ5ðš½òη¯¥Íš²8)àÔd䛞Zª‰ £dT ¨’‰…U õˆ=¨IøžøƒË— Ø ²A©²džQÏP-ëi,ÿ}ÚOÙÁÄ¡° ‰,¥cÂuû5Jócœåh*"8¢3Ó?gü›îÿYüN ߊ¿ùºó{ë¯ûÞïÉûsfu¬!})Åz]íÖ$U'aæggñ‹|ýr;{ú£Ÿ*Þ2Ó¼—}Š£áU#sμр54M‰5Ý?SÃÆq£ÕBŒÇátßð6¢:Óo×¾.| 5%d yJ vÁ "F’Žfdên:{ňþÖ7&=r[ß_·Ö¾ù{HMÉ f>Ë¡ h M…yñHN¥n5MœŒ6ChÎ2 Š_ý©­ ‰˜LBËxYêçe˜/­d JŸBÖ„MFIr|Sº4Ãæ,¬ô…“ËJD[|)<%Ö¨Ó3Yh3ŒÑÒ»Ü,rf†¯%éÃ#°¸ÈB‘Xi@¡ÄX…hfÐÅæ‹Ìr—¿çòÄrú.fî¢{¸ñO>ªà0ØO¾‹7¦ûh˜4ÞâÎGJ¾/vhF^Ç¥“3—õ((† =÷&Ï^ùÕÔÔ&pá¬TåÔi°/H%.¶p㉠œ:L/¢Ma¤&âà¶Ý±ó}øh;54;ù‹Š?I[ZÂànܶ.‡»@O”ynÛ­ÊêÂhË&õü°WÃöŸNÄœQ°©Y‰‹ïój¤rÛbY›‹/ÚSáš›k !g3Q¢E •Z@¾%ˆÊ„&,j’ŠÄpœ†s*M«'pTòýŽÑìÕ:lL²ˆÊ«Di›­W1è"*­…pÿ8ßøí#~±•Ùc¯t”ÕµzOk›–¨Wù9Z–AŸ«4Röb]²rŒ†}çÇR×” õ=«Rûz÷伞_y×aU»ÙÝ”GôR¼ôÁ³JíÚÁLí½³ŽxÖæaÌC¦O$vÂ΄EÁHh…¶¹|鈑9(7ð~DïæîsŽbžIP¢¥°¯%§«ÀóÔ]{÷;6>1»7׿ДB„²¹ Cö½y®„E‰Y'gËfRº=6{ Õ§ï'@ä^BBÈ[Þf&ö»Ÿr;úáRx0‘z¸¨^drã[ÆÝwÍGPáîr˜²`ªR(á'–+¯ny{ÞxÁž­ªbeJæÉèéÄ9X!ÈUT% º±|÷±ƒ3\mPýr™_Öº”‰à.®“Xó-©ù‹ÊLüöÿðüwç—ŽŸÊšNÝš®4åÇ{©žhDcŽäžÅ;ÿâø§jõÖ_ÿ¨õ¯ÿñƒ¿üÓúÿèçþÙïs¯ßoœž9×oÍý)ë ¥ps¹<]«ZWÖWž›bQLW2í¹oöz-œû>N‰Öx 79}˜YІ—± U±ImÂ&–üXÉ1ÑÞòAºÏësåõLz‚tñ>®äLwìën%N»êÊÙÐb~ÿÏðío‡Ï¿#"Ä?eãÄú'íAtsÁÇôF "à 8Íñ:!Õhæ„…P˜S«•# ZœÇkû÷û/-õR¼Š“……Xµ²¥£¯%I QhßëÞ8@Q›7ú•7ø1àvá£âèý(bäÕP†"DwjA-¨@ÍPÝ­Åüëõrc¾+GÎÅlØUÕ‡É"’x"v©¹‘ÑÒ{æÊ¸•ôŒW) ئ'#ææˆ+œMH$v½åÊ2*Éx¯WiR—Y“̼co(BWòHÃ`–^8›W PÑÕp ^P/®$"QH—QI”vOB³²±ùŸ€ÿ ;êÓ`ÖÍÇTð³x.ʶ´þ:«ÙdËVE•„à)²L¼Ï>.¾ŠÎœjÑ9›Øâ3IqÖ¹‹]¬ˆXxæ#)H²·ï+4 I6ÄÊ.Äâ«úP<§»°kÆ&y̯󨌴ŸC.̼ۓ+U8!™F:óš³ÈÝ '€|¥f¥$ÀÁP²*å§äÄ}ÜdÒèäúºžÉ:÷@Fa9½vôbc°ÇA8 Æqõ1¢!¸±k-GÕ—’[øë6«÷žG<§´[” ûB^L! æÁµÒ¼&µÌ-¸”4„åWÐΑ.»œæ"ÕG•Ù¬§šÍô ©i€<<‚QÓ×m6¢phZè<Šìöp9{º£ñÃ:I’42$>#¿ßšHïaZ[ gdÉ£ŽŽ5z8qqy$Õ…:VBh __Œâ“Qb´×'ù‰ 0^‰Œ:ã;ÍÇ-%:ªî$"³å.s=‰’¤™‚‡E+ë.´Yè„ðuÐŽ´*~¢ª[' ¼ÎxÝI7W,Š‘Kõ:FýTÄfâSŠ ƒH™£^e5‘TtðPà)´¼ãs¥ß‚G*ÅeXËÕ(Àùk*44‘îÒêhZt)¡a?Bp ۢ߳T³lö-uŽ%<¦ž,{BJ0fYD‚ Ƙ߉áw2¯¬gðn`HIíã>Ü;÷Ûê$Fh¥¼Ž½³izæÌ ³›bQ0ÃLÉÁÂËFKc‘M1…’v HšEs¾%§y/MåQ®% ¬u;™ ezŸë+:DÁd@Ï<ËÃŒP˜ÛwOØ{ŽÚž4Ø¡nhšØ+¥0>YGA%'…Ù RÅìw´`$ÆCN­1$êÊ#½°R(†\‰*lôeä¥ÕŽ 1å# Å›„¢IÂ>ÉUª¼fPU§”,vÜGtÛÜ8Å-S ÎT+ õÛǼc«¹É}"f-Üoµš{wÌÝ­rûÄsduf í)Õªýñ÷`m%EË«¼[âfëì©wÚ×ÍPù«%ö_ç/ímg᎒H¡FAn‹Íð†ýÿ2¯;íP©«¨Îö£¦=X3ënºÎRsi…nK\–Ó)‰ÍÝV.xH¡†R`F ˜â¥µÖLE-ƒÒI, áè8}øüîÞŵ ։Ĺ 7A2j`Q¬,®” r¡±Ú8’ðÐŽRÁpxÏk.r(¡ò·ëec 5;•Bª½Y Äçgš±ÚÌ­ìÝ|Ã*å!N%wÒÆkè:Òµu·kURj ‹G4 Ñ<0zTÙ¶áY‚@Ó ª Ä›®ešZBÐ5â ¥ àÂr\%1Òš’lä³I9p J‰ÍTÒ²« IœÚ¢4åœq„•-*Jö¦äc@Á4«ùް¡(þKE·u·%s\ˆ}ñ5RÀ0¥{[ãôw‹U>lÔ °‡†¤¦1-¤F\d6T=1Lqa6+†{§ÓÜtŽ*~··ý5Í­<ÑõjuKÕ¥ÔÞî¤.LsK™™XfèÑRÌFpLç¥7±Óì#“­÷/¹ð6= ¶(Ë »‰,©µÉ,T1E°¯àº¦}Ò’A0˜qÒXoÍå}sÜ@¡5ÄXo9C¬ k£oC…sÒ\aÈ [€qPrÀGŠ8.v¤·™?Á'ýa³›¨íHzØÀ2až(C•BêèwCa Îåºü-Î|;ò˜¥¥ÉŽ{•œSë (j@väie^âªÓ¹4=›Ù”bÛÜÛK ívã€Z×o.í:ÎÔj: õ»àíAåRnÍšõp3UŸ:ÌòS‚¿ÚC-¥Ó/¿ŽƒROÊû´ƒc‰U6Áy¤£/Ý~½ÕöeÜ@? 7=Á3ìˆNDd UA`'°H~{<õíì-uâ;¸<ÒÕvÕ D#¤â´j^JßôE€Ã<™ý,í 7›_"—x÷}p¥èŽèþî²s›GÆ— ع_ˆ/þ?¸V;&byé\žì1|U:x‘?78eþâãL+9#„u1«c³SÐZã3æñžuö5soAd£œÊãF"Œœé|®h!*tÊ1Cã‰naYi¼½Ã u©Šˆb7T³”ÅÙ+‡þÑÁ,{ôîÃÌ‹ÏÁ ÷pSSÏúŒGû…Ý~5îòžûwt¥ªvô“i›~?779ݵ¯_/˜Ïíýê¿¶sŸ^om’æcv]o̸´s¦ãÁê=&Ü+êáñWW•®ÅWç¯ÕÎVãW®óñ•ÿ âé¡vï ž_݉Eic"–«~ç¼0j QRj$ÀéÖŸÃ/™W,t&Î`bÈ7ñ.yf0¬8Šžk¡hkôÍñ¦#&¨²…’É1k»nÍŽcíMq…lûëýÅù“û·ºïû—z+‰ R'—ê»þÓÊýùãïå#G$%ÐVcE ÓrÝràg¬|)50µœkÖ"E§6¤hCYcÖ%šš@Á&BTÁƒü\dŸÄg0è¥ ÝÈâ€Ï"ëuùQ6.ŽñÉ¡†ƒ4†…ÛÜðÍò è 0” Ÿ ûj—3YW2î`5,‰AÅõÍK¥qõæÞet»ëú>—¼Hm=jt#¶M%³è›kæ ´uáDr8ëåÔçõ¼jØOYý¢¨É°šÒZóKBT”\d@e$^‹¢ÿ}0„‘DŸ “ &')ÀÐy‰ßlëû ?ýrùqû§nz븠ÙÚ² ›\·mgŸ¿µ‡ýÛ‡ýîŒvâ§|lÂ’_þ€˜xyî&œE"à ȰE';Å6ä¸ù~öº^óº¹ÛåÌØYóýÞ¥Cv~\@<ìv»E.¿/sÆ”Y4Wr¶²¦ÎX9ù÷ý{ÞÏ–mdJ‹Áóåÿ·‹Þà“RÏ“'FŒ+•„){Z¢€B°‘E÷먃ÌÕßwߊrœïñÕ%ïÒšÛòÞ Ÿj‰QÇzCßr‡[ëvŸsŸ®Ýöl¯TK´Lmžû3ø,u^ß4ÕÉÖûóíu=Òç9z¸†1ÆÊ'~h‘²ÓMJo¢0*o§öÜ:°ª$@ ˜Bh5ãAÏ=Ïv3;sÍç^±+ZêÜe´#LØPHa²çfî«ù©¥Ç›Ìž¸é1är,¼ AÚ¨lš½Z-ò¼G[ì?;ºÍÇg3gMUpWoäþG¯We —ü6oð n¡Q$³}âý%âŽIglë.\Õ³‘=›Ò°4PBV•áƒæ­ß»W¨ìs¶:‘LdR»|3 ‹ ‰¨ÂÑØ((L”k¥)mÅ› ¥Í£LpV&»Â­œ½¹Éu½¨ôyÌ{Ti.Õ2Ö'«¡?zéä¥\½>nî |b8èN:²jt‚È›yõ~ôbý¸8Ÿ¹óÌêÎ×ÁøW ç‹ú_Aã(#t.æÇ;R¨÷…tüÔ,ÈBÇùÆâë©Ê§²Eì20^fMrè2åS[:o‰×G†êOêù /‘N‚M¤ bÌ2è¢h°¾X·ÌíÞkФ¡Ü,¾ËÕ']{GØ&œËý¹»c·<Í[é0_K¦«íÏsóŸâ×tÿ;ÆøŒQ`ÉÓbUa> úغ\½ýš`Å)«¨±(꜔`Œ÷ëù|i¨O$0E¼N’G5§ @`#P,óa(C ¦O¬|±p¯S‚ïbj’&²HA’ˆ8.íbzT ,Üàžõœæ+ ýŽRÎÕ˜iÀƋåvú¦Ø² ÝÖÑèÜp ÖäN…„ ·ùÚE]?Ó…äKqNlW>Ûyú6Šáh¥dÔÕ¹ dëoÏ_ûQšn©J¦¹ ;ÉÚ­œ’-jâ$˜ÒJW²Òìet)YÒÆsËBZnÌgÚÎçRùß,ÿ½¤<Ÿø¬çâ­öŒ½{§‰_‘hôhµVëÓ|]ùÕõ+ìÇ9€©“MÆc6•ã>³}tþð½b~û¯¥¦âhR! éûÂlráSõ‚ ù R2ÉŽ>"§jàB ”Ó2ð³­›/M•¬¿Îú×TuYAÖßæÑ¡WÜ“’ ¶FÍ„1®˜têP¯õz~”Rp[RŒK{Û*“á†q?Ç#58%$ƪ¨£ÊžÇ>Ø5¬Zð[t¬#bQ‚yÝ*à…̉w4[ôtçʶ ”w˜–A¢È!Ò|72 x½T„E¯BŽÄ-I™ "‘‡BHN^–`zÊÔ±Ï  Pêl×úqûuÏ É¥J¦£õZý%´£î×lõÿìcx摸L›SYÕé¼ÊGW”F‚dŠ7ý¢Ð0½v¢Ñ=ÉljøHÕn›×¤ÛÞH5ñ޹wd7ÍÃa_YŽ6Éc.ñÆÕqÍ™ÍX­ÔvLÙ ¨˜á|Ùø¶yJ|v¼ïyŠþñˆ;‡ó° F’³ÝVPFº+’z¿2=Ó<_àP"ĘéÎ ;AyºÝË·CÊ ÐIþH»W§3wídë¾R±¦FVòšeZ£ 1÷Ö5jˆ”éÿ9V˜ÿîVþ¢Î=*ѶAj:¦¥¦}Ñè1Ί5ÒCcÁtde/%ë¹ãx¸ØÖЦë×(ÔØí¼_F÷\išÈX§‡ë©ììþAúc_mî7²“—&Ìùt¹¹9F2^@…å˜ËÊpÌó>“¥òÛÑ‘š%zUS"Õ^¸±®¥Ðj<Õ7‚ý×è'þÕa£. Ô5•Ÿ!?|¹“íʶ6Ù½°Òò”~Øs‚& «³·rÏ“Eš b*M’9A#<1:™†h./kkšgì ‘fZ&†º27›f¶ªkéÉæ”šËœ//d‘ޏ–Ü€OÀPÖ»ô/3†BhO ˜¬ÅÔ0É2íVÿñø¶œ²ªa‘×ezþš=ûªéÕñåo‹þ;Éú»þÇß%Gï¿ß1ª‚ÄÆû¯cò7MþCšfbòR½'v¢•ûv5y¡ µÐ˜KØD¥Š @†°þ¶E^Œ¦àvU¨äâXHŠnÁχŽUºIÊW÷êlyúŠoJ*‰m1‘’i¥a)C³~㡲 d(Nˆ¥`iöí©ÁKV­p䇑Úg¼c¦Ê*Óuw¯)§^ÕbkðÌÞ×ÇêžêÁè~„¿¥ÿÁèû!qœˆò¬Ð-U1ÔüÕD2̆iоMk’Ù T¥©ÍʹP4t„Deä °”XŒG"Y,Ìe%”Gó%⪖|:A{žÈ:ÇÝUZ;_ó«qxºû_k|•ô ¥eëõ÷ÈÒWëÜždbbá’í·T÷ëøG¯·ÝUc]-/Doöm¼H¹4®3tjÉ(Âô~ã Âj€”mB¿ûßC÷WX¼ÙbòVºîÆh_OYFÑõ¢[<‚_€z¨ï®ðƒ(àðy¶Dà6ƒº=±½kqnÿ#*®£¿_í>ܸ¼¥ÌfÒ&A8ώꧦ±¦æ/çë|•Ú¤æLN¶=é×Ëæú6yÎn‹å|tÉë»uŇÏ[ߪóì;[¸]‡¹›~>õ%síü9È ø¤ž,Ê©á3ÛìZµ”H{Ú²ŽèÂQIjºÞT¯³°J³SR~#ï]ÌóôpÔ/ˆÏ˜Ê+?+ü1-V¤ïFQf’JÔÁçÎû,¾lƒî¾î–´ûÃ[zlEÑúýåb>‹0ÑðÄHÍî&AP€“®PÁa„ãžÍ êAvúZIÙTC Â_”a4ZÿòK†ãEôñeÖçüã>$Uʵ½ÀÅòÖ¿Á9xðü=ö©» dÍF¡ñt‡ë5|M‘·Ö¿ÌéWñ‹§×í¿ kšë¨ÑŒ~Ú¾I…áZozv›Y˜EWñ¥ &Ç—Z¸Te3ˆUp'÷‘f;žýáu¸lþoþû­ùeâ©ÍAÏê×}sI´èÊœdIêp£×5˜jXuBˆò"Q±ðÍÅǺtÁ ¨ÇÈ"©¯p ‚ïäD¶‚TÍÁœÀD“¥Ê‰ƒdóuÖm;ïw_—ä\dDañ}Ýý»GÅãý³¹•v4*œOmgç?âŠï=¾7÷;_¼>=, {Á6?:ofGoÛfL"…Ù[/)µ”dp]/´Ú”@­UJð((80?u”’œÆ•1Û³¡M+60wHˆ®&¬¨(Ê %©ù"È_‹dƒïÂÁŽ—õ’„Ѱá.`CšY!óÉQc$6¥‚C†Žüе—¬4Þ–‹ÐçÉþsšÞv T÷ß$ùºMlk33®dæuæÉd.ç’ïM?M~fr«‹.ȼˆE߉z‰R F) LXY ÁU(œ[.¤¢ÂÓ†2R`ÁLÂhª_bGŸà›üæ­íÛ[{Gòu¸~úœS¹]®·ûoϺfwáÓx)}>"K—ëËû7ýq[~Gœ° ?6¨QœñëåaV›¹æÕúñeî6æ˜b(òÍæõP»úÌ.œrÖñõ9Š95¹ˆJ$M‡s ÛŸ6ÏqÿýRø c+ÍýÕ¸þ8{Â|`*b¹”o"IWÅÚG¹S—&v«§‚ÒOi‚W]ÙƒWùó¸µß&óûVQ« eÁ>í|ûŒ^GoªÑAs¬º†ÑiºÑí‡IŽÆ™·o¿ÎM¾ŽÇ|yÙíM¦¦n:œ¥)Ún3у]ÒæjÆž3kh_r$Žއi¥“!º˜q4¾;€ ;Ì Ë·å¶Q”Èüp&®…«ÍÔÑS‰×•ú\¦rÆñàÝ<±Ð>õÛÇ®Uz&™4·éO½S¡* 6¶«’>Ñ.¢q.µlîÁÍ.¿aʪ­=o?þè:# Ó JÀ1¬p#…–¿yÍ€Ag‚u_d´|Mx!Bßt Væ$@ Æ‘£”^-ƒkȺ‚!=^ ¬fÅ7&™\J­:PGð êÙ,ìêT %eXÜæpd§¯¡…±+ŠÕ0™¹¯9;íûÉ,Çô¾L¶±{dür<Ñ3Ì…geãÏ=c­dg²ÿtÀ%B¾ë,[—º¹‘q¤T“„µ£œ{Ø‹Núú$Å¿t}†»Êöäƒ*Îe”šj×S'}¥×¹ŠêxgærU-…&K4Zz ù.ç§¡•š5ÖwçñLý»Òœ•S,nÄ2j„R tX±<ùamym#Ê ÓWµÉû@S­Â$êcF=RPJ©YC´1*_°7 †TŠÝSãÏÊuè?s¦ÃXBIw(+;ƒ¼ƒâÌ.®:äÔC ƒñÔŒb/ÄV1mk¨)Ùu@f-(˜—f—R( #0QC ÈÉÔW<_åê<¯ãï‚Hˆß'Åk`ÏN^º•5Z¢g:õ>i«‚Cÿ½®~¬_)Ÿ-X‚^ÕÜ~*ï¤:±–U[–åJûàž¤ÄÏ{Ùé¾6]îÀÇ<“lÄ(Ù·ñ>®ºÃm1Ík‡³X£èƦ}4r­~^š··¿Z~õúsÙÖ+¼„[ê(¹`\ÕâA6ü•ÜÂÕ7~Ý)±T“«3}ÔeëÙ å\lÃ8ÊæüO’ãømF¦þÖôØ>…Žq,ž õàC¥(b Ø Û×{àFùÃ3¤aØ­hU>Ž_PyÙŸt$ýXdLÛ¯ÓÝÌ;ÊUzÛJïC3Ø­ 7;ŒL{?ë–™Ç{ØÙí¤÷,ÌÍ3`ÒÝ® §Ãœ6‰«®J.Ì q®c8}CK~Ñ+ˆÍ`±—ññf ï',Îér÷ûow簾{ïÖ‹ÓøÇÒŒt¡OÛê´,éñàÉ!5Œœ Ñ:#Ž6í~ÞW*I¢DÊ#ÞI ©Ö“رÄÄC;VëÕ~Ï`R‚•ot»‚Sæ¾ú_I¦I†Z¸pÑOø¸H¦;`ÁÄк„–ªM²ü±)…@JVv1Ú[IÄO®?ˆr¢PÍ׋fÆ8YYÛ—'îøN+…M±^L¥ÝöT‚äWÓ¤&väÇiË>’Aáà9¸È"Jp|›ks-‘1üÚlG"lU œíF·a,½üÎxÃ[¾ô„m–îÕÀU?ʼð¸ñíôSq¿;±ŠÕèCÒ>HA‹Þ³9g´ÕÞ­¦\•i ˆ‘К–f 0+*D¹­-=<„ѸŸé—ÛͬM­¢c¥O³ÔïŽô|[ì¯åd»µƒÞ3†ÿ¦Æ¤ÊßÓºµv VB$@“ƒ äA.5Hs"4Q‰¾¤C¶ ¶Æv¦ Ú;ˌѳž—Cv9ý\á¶fQ{ýÞù—Æ¿¤‹@¤9Ï å†½‰Î35rp{ûÂóüõùú—o ÷­ÕŠ6Yc#4ÙT!ÔIM0‘˜÷P.¹fàë#7ܪHtx²@ å՜وëêqþºò eŸrL7XoVUc¹¥<&b_K)±îµmžÖ×Þ"M F±Çsš6 r-€®Ò,U5 pÉ®rRm@rƒÂ×µgaR³úÔHˆ¬Ã BVr [T¡8é©¥üêŸÑÇå8¼*ᨛÕ:œµ3¦«:¤{‚ø–:#TcACj}éO¾Ð™~±ótômõAg‡ZvB…чî©?ÕßkíïßøúíY?sW’ŠºýƒÙÿ:*a ¨p ­þI™¥¤Q¥) [áŒÂ\¥2Fö_›ïÿºXQ:ÄÃrïׇ+†1U~Dʆ0XhfòS^ÈçHècIâÒh™Õž{šÑ2¬~c¤$ör|#¾ôà ¡¡ÇÄdµqÕn| fBÍšfN†«¸MŒ¼ XH}Õ‰cUM +n-Þ|>º.\% S8 d%$*Q—¹Ó¬z©I_Guã\ü¢ùõÕùj|d ]g«àFÍœœ!ýóc”Åσ?‡ÙÇå4n¹ð‡NTœ‡ŸöÅD­ê€üµ>Gl𢕩N7Æ‚‘eÅ:›t‡Éœ {¹|¡‚Þ¸+ž0V¢+{ÍòˆZ•«IÙg]=èÌ“WI9E¿i¾”U…¸ëÇÆùÔnÃåï-ún óVîÂSÌBè{õl=?eŸgí¤±kåÛXË„14Ò¾ê/}ÌÀ=ŸåXUJ=éçÝÄÝûã‚U|©Žý@—+Æòa[G‰‚ºfËžÌV-ë í9/‡ b ”]Yx)?Œg’ëI?_•«c¨–G¢´7pÖ"r$ÎÕÞ÷’ê`yå¡'U]-?ò5_;”‚|n©ÝOOQ¤J£F`OÎ!ã@@qœOôã,(@ˆWz»Fe¶3Ì™®ÊïŸÿ|þ¹óÿ¿V¿£½’É«÷o-•³o§>gÂY°™Õ,ë¢]PŽ4 ÌuÕº×û‰›k­lÚÃËT#ìO&/ZÙûѹš»s^½'ƒ¶(jôÍ’W@—B5xe±fôJ9ºo œ2®Ÿ:ýèt8˜W¯?•Ï¿cã4éDkéøÿÒÞ×ð:š?uùð-ïÓèѾ ¹™_ÍX.ùPÑå0LÃ]Ð`¶•ò þ=f.ÒT·`SHÒ¼›ö‡WJ«p–r¥Úõ˜Évû][û‘ÓÉ{>R„1è÷Šñ ¢Ëv¼åæïn¬T¤† ³µ‡rì—ñ&x6÷,Ù¬ufMáýªtõÒ7v/å%ª}kyÊ2ó^QWßù o߃úz/9˜ÿÊÁAJÉhØV9V½˜O¿¾£2î+’,44tÑ_Žç]ïíˆm˜?­/•Yµöî•’˜e4µ¬²½™¸„ö|€W²ÚÔ—GÃìe`±@éZ~q°ë ßM5Éþÿñ™ýCØûìݯÓ„)¾¶*hWeˆ$ ®9U,«è$G„cØ3êhvÉ<Íq)Æc£Ì»/[­sˆõ,RáûƒJ†WK±‡Å€ÀRŠ—6ž>˜Å&Þ–ºšÆÌÇåÍagišD½T}çµ»qÕ,ô­6Se"¨z§t­ í.g MgÈŠ7Y_{×W寻âº7çò¼|7êÓÇ"³QãíÒ J×ÖdÕ”˜ÝÙ^±hi¸NÕâ—óèžËSˆÇáV¸ èJ¦\1DWCªÄ¤Ç ±ŠÀ"-Ô!zÓ>þYˆW­8O Å‘{¢?|ÚUÙ9P{!¨"µÙØÌŠ>Ì4Rp>8Lˆ]R;µˆ¨Æ›ø®p¤^ ìQÙ Ä^¹OËúÀ…ÎWݙɵvÜ'˜#sx~ëõö‡R´oýñ1pâJü¹ü—Ó©êIa}ÑìiiVϯ]B—bj˜óšúóÆ¬Ž=_©Â£fv{©ŸÕÊÇV³ ñ;“U^Ü&)aWqø_üÓüëÎÎÇ.ïv{]üôè+:µ½Ônl¸mËõ±ýdZꦣøÈ©ÉM¢†j¨k-œºî~G˜ý±PÖΰÓý²ýæéÿü¡¼òu0H°£ žT…ÊDc$¦wVËô0D\{GÎçšFó‘ygw?Ç>¶Rf ÜFŽÃ¶óçß;Îç:žø2ò§½–¿ìßÈ”›DöÆ–3¼ž_Îf%–h­Û¢9äí…­.14Yç2ã$_Ä£Ô2OÖU8ñ6k­ª0E”11ØêÍ&‘ˆÑb•¸ô¹ûœ@€¬XÌeh €[CQ£ø®·sZã´Í#FGAh(ä>Åâx*³` dbÒ%¦1‘TpF´³V| ~œÄòíÇëoþ<Ÿç³ÊÇlx°–˜qy²èõÉJOŒs^g-¿¯õ48‹g©k.üš:‹O¾¨hÉ_±pã´öIñ)‚ž¶)!55H³ …j––ëÍTµ’°!‹3Û®/Ë_ßœëç~¼^îÝó2¼û+^1ÉšúÀÊ  . o¸ó}¶(‹9¥ppû·Í.¡‰°ƒÖãuÛo߬ž¯ oõmSµÏ nJ©ïÏ˯Í7–ñ¢ÎNþÕbùöòñ8¸fØz¿½{{9û¨8–wòs%öšïç-{àGÑ&º] ÖZ©ÐŒ=Ù ±åçéxÙâãÛ×»óÛm³].W˜eþ±Fš³?·Nûxo úH¯‹ÖÑ©„‘Zq4ƒòì+Ì.ZöÞéõ¹…Çá¾¼ÕÝVTÔŽ§‰«U:6§št26î£Xb:o{0`ðx9 #—~X-µ—Ì­™¯I±JfLZêî*!» ë•URäf´)7ktVI.Ÿ>l&ÿW7ý׫ø8ÞØmªøD3n9B#]·w›Ï’”;鑹͸÷ñ°Á½ûáóólò8¿ÒE¡=• l¿;Y“%¿W!ÚÝÒuAŒû²Å¿ˆ8í¨AwßÑ|fæ3zîù£’8óù¬9`eã‡4ßœð¶Ð-v˜ÔÐ!]‡^¥A¦þù=Ïnµ—­ÔNŠ˜ðçÔw+í":ãz’!S´ƒÃ&s9c‘)„Ò ƒSx¤çóáødäQÂpYŽB [´N"÷xã¶íTH¾Š•¨ÄäKÞØ©C†pž+HDèèÀ‚bI™8þà:&ˆuƒâõº÷¨m+¤RGç‘Â0 ¸¡W­G»Žå¡Ü}—1 D÷(s¥Ïe£a4\¢‡ÂÀ! ÖŸ#ÛiÛN:O»¯ý0;zÞ‡SrmÏp”®äÝ`" PÜQµ®pÇtlÛ1­6Ѳ¤Yˆ¹Ö+S”n".7í§àÖŒkÀÓl‚÷ROÚœ†€¶›…“t¿pK¤ &ê$ ’=ËYø%ÔFA陼*€Ö™ÁKûü¤-n¨âÙi;|K mPK—ð<_%&Â̯Õy×â´Åç›a5þvMÎfrƒ}É;‘Yy‚JF^Åšj'§”Ó­–§±»HJt‡(»ž>TÆÑ,˜À,þð@—?“‡ærØûxüèû;M<ì.¹å±C ’Å Yë¤l§ãê9H¹ÏÕ¯”`$ƒÀÓ7xÈ?ƨûJmHK'Dòc—[nÅ!—M‹"ªìpˆÕ[[Ç[bÁºlÛ+U¬È»°U,eZ”&Š(‡¡Cd„ƒ“`øÁ¼ÏI][®Ï26õ–šXÒãè5ãnEùµjêúâQ¢D#ŽÏû.îMlˆu9Y ¬ItzbU,€”¶= yÀ¶G‡Ÿ–?îô5É=ösÙ<…Ê…ˆ4jˆ¡D¤ABÍuÌRú {ò^Mg¼SÃ8åÂÕv8Ó廬¦ÿÙIVÝ. ).'ðäøÅ?ïôîäe!b׃1†¡Š"4T kÀ¤¹" êÕï»{ $kqùƒ;«+ö6Iºx„m8–(çCvKԺƛš¶†ÊÁlŒ#1·PìU*‚H)äEjVE’ÁºyUàv$ÄFdæ‘ëUÐ`c….ËÔÇÔEq]ÇH^•ºÙü^ñJ^Ñ+â•„kåjY'Z–! 3ùÊÌ¢c6ZÕuíï]°š¬B>§C‰–.®Ö׊'­5¹»¡QÞðÕÁ/ ^][™ £ãÕQ¥®k÷¶Ï7 ÍýAÁ>V5Ê%–.o2xŸÀDzÀFÆf”t¯ʯïÀòµSéW&ÒwNNîù¢ ƒU©¡F]üc“©@¨éâ4YÌy‡†æÔÜ .5À§Õ“,°’Í`[ÖÌÆ‡ªRe˜‹È‚&s&Êm«Î·¡qÂTP£88©Ô]Ðu;Æ#kbYb5i\Èö:4 š¼«çøé§ÌÙž¾÷|Êñ«|çüËøüƒùüÚZèê0T2r÷¦÷KMüb(Ž«âÇÍÞ]ÂÆ1J‰RªžWÿ® YpÔÐO"—ÜG"†Ñ¦² -i¥Ò®¯É¦: %KH<ÀhxÅE_¤CÛGÂvª37ʯ|+i¶ÞŠÒjÝÒ|50¬.S¹³ôÔ¢>ÇòH¹b)æ¼|LÒâBœˆ}ÐßÙ¢^¥bçuÌÕÆÒXðÊ1YJHNÖ¡F7³ë® ´Vù¥U,h,$_ï¿e¸x Í8‹Êøu¤zõך²d×TµÁ,kÁÒ?Ðó÷”"QÅìCûaô£=dî Ì…=¨šgoÑM;öPXˆ±Ý³ T5s4ªS­·Rÿú•×ɺû`ZCuZ–¨Ï/ô^§€¶íülKñàÙë–¿&–^ê|›|Xþ ÆŒôÆë¯ùµm?­è6ÐÝûûâ·Óû:ë5&ë¸ß>{á6®|mq‹jÚ*| ^Û¶v± Øï¬+`SÓzüZ“ìAÓ:ýìŠÏa¤¸ÀtÕ±$î¨^Mÿ­cé3.¼†|\—Ëgz¹Zkšg9ÇŽúôgÅ/)v¬¯÷kt1[Mã`Øojœ\íëM”ÙJìÔyÎ"oq)z‰y¾ùºÃÊN¹l’ñÜÃå‚£…6`ƒ9F%ÖPá›>탗`½·”G_HýÎ=öÂZ$izë Ú–¨´Ær7ØÄÝß{*&`“š­h3Õ ¤g€)‹Í½ÔƒÀÕʽ?½öH›¢?O¹‘4‹Ãzh¢ÚJ³s’«¡Í§L1àF¢ê ÞúIbûÛŠ«…?›ªóÔøE+tüÁø³wµØÎW˧…¯&©jÖLë\ã±à0J¡(B†û:å·)³3ÐÞöÍJ4(!òf¾ÝËáþGuþ4Nß›¹y•™Xˆc­ÑV{lO>ì/÷öµµ»Ùë,F-ë¦ÓDs$’µ9ц›Ð 7}²íÓê:6^]i_:^™'~x1}ݬ¤q±ýÂÖÇe½Jøž~ÑQ©EwMË2«fbIÉãL?õHgwT›E\Ÿ:gJïpêÃrú]â[u-{˜ó|H®©)ƒ˜‚¢C†\ÓG*†¿–ê~äˆhC€(hf=Ù7µB,+LDþÖÈn£W ½Â!¦ö>Ráä1+´Ô›@)ä^Óª1)ðšg¯Ëç® 3ØA˜!²–à^» 㹂áaÆá™7>m,V®Ùsõ_ Ÿ:§3Ć 1«Öv­©û+î·žJ꺈UÄÓá6‡WSS’®˜Ì%µB0$€ª¥r¶§°ÉÌÍP%ON‚E&0ì,eXU”—®›çk]ï> Žú×ñ9Œ[³x_‰ØÞ®íÏ .cjÔ®u§\%¸èìèù0s¿w_Z*!L§4¸–Öâ]ê¸Á='hV¢ìèu‘¬6zˆ)ÅãÚ‚Ýóâ‡Ç’»é,Ž Hc[Ý$³ÇÛ¶QÕNn˜n$&Â@«ðrÛ)–HR-ä¡ìe[9¨&?y?áv˜¸Þ _/U•qq@—hfVŒDYÇMê¶kâvóo`!ÊÖ ÅXa7‹ík{ªöB‹¿Øß~é“ãÔ¿óIyYîùÔërÅÄ3/âh̳M;¡l–uØôÍšƒÔŒb‘(Z±EKÅ&3xi\;eO5f0…ÜÒhÙ]I˜‰Å! áÉ™š0 )mð`Áà2ñ´N?"€†I¬™ßA‰¥s†ÿÄ<Ñò>·ÛŸ"†os»ú￵ח]ãoöÓuþÞÛÞÛ_ÏKèù~cÁKÕ:1ùi0‡ù¦L%>1pò‚÷!­pÂ$‹“Ñ›[¾vncžkíb±aîÌ‚CÅÍÉǽ)Ϲæúô|?Ù²)¦çK€¯KgrQš]êq¹Ó}mÎAT6™Ž²gœY}›/v_?ZDÐtßm»á¯ï¾¯ÿ2^÷r¾ÙO‡m·N-ŸQòš—ÿï!»´Íðœ%oÎhe×¥b_„{¬gí­ïÕ³›ÊºmŒÇas/y¾¬•_ žEÓÊâ´.0A-›ŠV’VoÝüX8¬Pß×¾þ2/Ïüþjtß©ú½UÏ=å¿.æ2$FefcvÓ £¼‡'«UIÃimŸÇ|Fy¼3÷{NþûÐÿ>ÿrŒl­qw•¢«-jšözg¤êS‰ ­nGîH¨¾9yÛOKy©s[ zƵƎXÔ5DbÜÃI`¯ŒáT–fŸÅî¤u”{L½àj]÷·“ÒèÛq¥âƒôÙÕÒÁZº‹ó›I} t–ôœròø©aË9_ÄMæð{¯ÞOrÎ ´ Ó’öcVUö•ÍqƒvD¡Ì9xM£ÐécføÈØ­;ôÈzõÈ΂¯5»RŸp&Å6¯°$$í9! 3žHQxoçî%/ç‚W[‡·ànÞPg±kØN©ûhL>ÿY‡Ï#ž ÊzLtžZÔ+û]8s5¿‚"ߪî5òtÃÜÎ)b†âí‘uç7D~bòŠp¸-NJsw<·®÷_}3z¦œÌ„BKh‘B$ÇU/¬p­â–¨ÒÃõ0qfóµ™÷«ó¤”c0E ’qy²ဩlœÓ¦1Ï}UË=ï†Këò¬"Ú™š@K°C"‰£9Vdè)X Ìé$L‘3ã—颹ŠlØo%W L‘P¡JÙÛ´™¾ÂrÚ)²V$VÔL3@qš+Mˆ* "•Mp@Œ¢8K‰ƒÜχõZ%doØšÁQ¶«à {;ÛšŸüÆq¬%”ÇÇí±•‘õòÐà ™ ÓGaÏlí÷1aúÈd~0G”¸Ç'®~p³Q8Må­'×y ½â#yÙÆþEByà‰o%7H¡rØY§%ž=(µZ´x² ?ŸT{4ßk˜3xZ5d«ù¹7+¿oùÅUÙy¶¤†W¢­ð(®©x伩/Ùzh‰«‘e«\™–†N¶až„3EƉ»b:üïÈ„(…¼A= ¾äª ð3é}¶„B©]'à&ªŸð·Ž/Ë‚åR ºwhÉpW‹k0&ôžýÑ¡‡´ö°ÌªV¨˜/ëu¿Ÿ¶W'.jæ}eÜÙçôr?c»÷Åpþ“í}é¦^‡:‡Ó*÷˜Ù;¼ÅOìŽ8bÛ<Í´CXy+=ëC7™é%äl>–¿÷½éÿ¬ñc`f=5ýœ&oîÆØ†­1•ctJ:C,ð LŒ‡/äúµßWO¿ŠÅ%unyŽêe}”Xw!¸û (bêð­ä=2¯²WàMø()Ê`Ÿ>RD+%ÉkÅѤ_]VDÓÚZÆ ¼J…˜’®Én<ýÄ!8IcE´†zó" û«l `êæ±?Å·J‘Éþȳ¶çÍc\”9µÍó¸è×ÖûbBw!*ÑNÞí–x쮿íc·¼J¶`YÃx±s¿àëEûcó¬ðt É õø,èÉ*¯Pü еxÛ¶›Ð4†º±[Xš¶/åŒÉÁ³oyOUÊí:ö]õûFÔÅ‹N·ðs2»wŽÀg½ìÈ&"H  ZÔ—Õz5vQ µåüçY~’†$ àLÌ· Í×X#T¯‹OE´:É:Ôå‰|´‚&b™CS6)å›vœ¯š©Œ¶ébÅò8€Ufê;î™RZ÷@ !(ê¸jêaæ-ç'Ñnú!rD+¦ŠØDšaB«>HŠÚ‹C½ªÝe·«Òµò有ì±ãzTÑŠ éuuº&5kEÖGÜ#JH@3M½ìBjy–fR ž¶4 ¦Yº’@H›•ÐËv®»ã™†N#¾H¥T¯#è¢sô«ñ§ô¸¢‹'íÞ>¢9ŸPN++¬Ç{+0¨ËF‰`D,‹DÅ Ÿhè†ê²̊†ª!Çzrè«wè=窖,–FbÛ´Æeʰ\øÒœWU “"bJ¶ÈÐý§ó’>Š%jØvXÚö¥93¸‰…dzuÅ +7½f;BåW9ª»8sê-U®ûæ)íYfu?ëó}nÍ/§0ùžŽ«ZK¤Uá"K†…mW‡Uÿ¸1t)ÓÆ×Ö#1͈+Ÿ"‰(¢ 2UÉÂ!š^]½l @P9LÌVÇLp5Ôà!Íñ, €o™Ù:[Ù±¨qz®ªs†=«ÍçÖfÖô†Ç¶µ—ÖÜ{T…2eHb…—eŠz“sXè0ÅYˆ@îùøDãÛl•¼„^Oän¸ ÒG‹“º`¿,͈RÁFèD²“Fª´¥;n­OÉðÚ{ï¨>ÖO¬Ïž™Ý3’úöã3ý²_/â+z¬IrN1å(ÂI¤Nó×¼ $Ôu;¼»v×´ÚØ/*4Lîó”£s®n3£S¥˜J ô¥ˆ¤[T‘{´j%ÿã¼~Œë ·éúŸ®¿jæ¯H˜½X5ý”·w¹jnÊÅô9‹ü…ùùÙÊ_忦û¯d“Cæ½¼[ ¿\º¯ÛÁß©r“ö[ïoö6ƒÓØMßçµc»™Ë K ¶¦X3×`½0Ú€·Q£ñª8˜Û˜í5‘ëë]Ls•½”‹wè+ÝeX*š©sÞÆ³4¯ó8“Ù×f/B—oí(i>J|U\9ØÉYÉÈWë8Š%K²Ãªò”ÇWúdõ;kC×Ù›Ë)5È öD™a¦íúí¶ÿleû/ÁÛCôÊþë7ƒ9ü§ CCÑIéäe‘IÆ×óK죿> Wçu„úõêã\ëñ«s’Yó¾ÝèÐZ/&Ë:¹CõxU¯[ ùç ÇÏé·´ŠÅt×Ξ41)ql{©®c6§`çwZ÷V>}âÊÒ|áõM‡›ûÛ͇Þ'K»ã`þØúÇùUXcýÑÂëÇvWðúÓŸ~yæ]ßã—¯âCÑöH»z+ÓœìTGtl9ZS•l&ìö@è:çT…×ÝO+Å4d=V ° ÜÇ~ÂHž)ÿã:=äøXŒ<ÂÅ´7êÞ›‹ÐÊ™/¶zØõ~|îÒ~Ù…A‡Sªg®:yuääT;U "Ž S"Ç8ó< pÚչ¶oµ_Í—vö¤ÎLïóð+Ñ›îŸcïúB ý•W{S™ê Ô¤ØôNSd5 Z¹Ö,€¡¹´¶Üä9_U&’¢zgÕµ¯ÍgF’Îê$ÙìèµK§Š„ji´`¦q7/;ÝæÉ­"œ‰F')=iªôp ¬œxÍw⃩'3GKã6±—ÍL¤pɳ#Ï¢ƒNzÆ,œ}NîâacUL3W2!Í#³çVüèã6.:æõþhñ1º1Ìʇ'­í:V{¿–¹Vj:û: /æ·éyŸ´èÞN§2¯/Ÿ/»‹µ¯™ä-G¶úóË^é¼§Îðì¬Ã½ž‡¿ß»÷—éÙOBåñ]™Êªã1øè™S)ÛÒ({£³Ñ¬Ý†ïUIýúÞŠ¦5~eÛuÆyµ#g…=b25¸$†÷f|_Ká¸Ï‡Ï£}$Ú¨¯ØkgôÍ4ÏÀ¼Þ4†P¬¹ºüXu¯PÑ«Dž±¾ùÊ>?—V®ÔÁbÑt-Ÿ­&Á©nÿ:ìÜŽ«Ï?/sÿ8û•#1W99˜õð3‹FkjÕS­¬,ô&FO‘:n¾~j_X|÷â;ž)wV©Õ™¿R_ãR¢ØuY³¿Ù·A TLɽz¬™©ºç4¸[þK«›…¨õP:àjFaâgëqWÓ¹Ž I²G—\Yuy+ÇÉÔñ|*§ï[žT›#å›V;Ò_,ÏgY^méÖ]õrCU« ¾¨‡º¨â‰p5&×ô_5­–ƒÚ|,[¢7Õ{žÃ9d|?oBMšû8ýó—~‚†”0qÑ”` 6€ÉXÉŒØgšØvË!C U‹sâ·Ûö²ë¤áfÎDuõHorä¾f~`öð£xNQ¢YE‰{»boÕ ³ÔRl²Ý"êçñX/zÁÉg’ÔÀ ¸ÙL[…{dŒHfÖ‚-í‡ç¯/C ë‹ÑÛ¿õûþöû·YsŒÚ×_ßÿü O„%Œ;üKžJB¨xÁx<1œ±]nv›™?xè3µFw…Ú¦D"kû:[8µH–U«¥€à > k¯&f•”B9ÀŸZŽ#ŽNIà`Ó¥°½1zù}š¯>ˆ6Y…ÕÁgrþë9©/•ô>\¨½ãRg.ó-ûý‡7º‚”UÝ.K‘Ëkгnæÿ(ž׿ßSœ};‰ Ay…´Ò†Ã«¹Î“|²½´ÝQF•áÊ̡ӕ÷ŸÙîÚî-ñ¥ë'æ`ÞÿWZêMG7ªvr g7^óvNÀ3\m†­\Ì—¼šj®[(+©8j}Ì›ÏòÍfWhî²B4WUËÙæ{`¶,ѵýzO:fQ¸W»¯Œ¶s¢î5ÈÖ_šqh¥"=D]ºƒñ<Æ>07”é-ޝ‹Ç#ÖB!‡~aãtÊHçôJê)Å€a%€ÓƒRĘ#ÊŠºQq&Åðmn‰A(6deÕ(f0ÐC™¡ˆRT ˜‰ e@6"–€€\ S" Ð÷½€ 8V1¶ŠS̘*¶×˜Å‘ˆýuXFÌEÏ`ÔñaÓ=ŸE<×EÇ0–?¤tdZ+Ï÷z}è™›5'³g>¾!ZQïFã¯TßöŸ™uªÐ´çä…S*1ÄDWc‘ÆëîeÒÅ1Tª°„@B…È[þ,[s •í Ÿ2ý'©·õ™[Ò j—·“~Ÿ¡’ÝÌÕ+2 ¨C¾'À #y‘1 rWc´®»»–7IY9ª@F„Q¤™~ŽŽY Ýÿ½ß:udÂö^xÍiùƇ»ñ§"‚–€´Uuf+YP:¬9ˆ»“ðTÑ$àoÚ»ö>ZSãÅ> œ$Më„*É"JiépçäG2ûL?¢%y—±›9ùέ٦ …(>ú±ìnù6Õ«ž›¸ÞNKwªzd„îâ>£Ü²EeöUßÖ =Ô㸧¹\–×ÔIzšžù¸ˆÂãÍǜȉ@¡0‚ÆNÌÆ`[9 (´úÓíix ·u4EN¢DØ;un:³]ÕŠÅëâj‹fþãwÏß}ôpF/©5°Ì¯ÍŒš¥œ–c‘¥n0}W¯%ËlÁà‘¥?ë"@@Ú3(„Z?*µ³¨fb¡pß&—‚æX¥WŒB œ‰:^Ë–Vá)ÑZÀ»Nj|-¸ˆ ˆÌ¬¢ñB™%òSÙÔiÚ@%é}Ãt…“SÛÖ¡íŽÍ…ß¶OsEóÆäÜÏ›º&Î*תô:zê”)­²¸P 'ëuIÏö¨¤¡ IÝÒEëa%kUºÒоþy92/r …, B K°Ð²+ ‰iP3Õ4.Wkh€z(äã HÉ\  Ò´Õ%´27ƒiÓ|^˜@:k3:¨ç•O«·(ÖE”{ÐkÔj­·Øm0n÷¤ ˉ `3Q…2U ·5' ѪKv³–:Ÿ«bbrm]!)<ظf‹Áá°- _>TV©åÔ„8ÃÎÜ»ƒÙöBíäàB¦Ë#ÔÉÆº§öÌQÿ"ëzëÏ®é: àêÕm|_UÓm7q¿]…Y²Ê-®Un]Ç2Ò9xþ‚‹3¢Ý›¿žË[ã,S½3ír#ûÆ<" ’–Ϻ[y9œƒM{~‘}kÆÊ]/ /Ï_·ç?–¯¿Gõw ¡VùZÁ‡,¥Yß—dÌzp2ó#ú;H^¯¸¼¿O×ÒK>šb YET¨ ¹<û·«;á=%ƒRI-Ïlån6ÝØ‡¨qªt}Rêe Ì(1ÓkÑãô¤©F™y€mhbí¦é+2Ó·’Û}IºÁµNç0¿xçãÖøë³öµÒ¯åFó+±M²aË Ç§ðÌÇYbéöÓ]ñô´œè›’8¥'øÿ—\¯¶¦ªGMìþ¼¿ñ¼O~t_ Q¢v.¶+•šÿ …5¨ÓëÈå?÷?ï¢vpiò°æÙÒ?z ŸÔûwìÏRež™ÿ¦ë¿z:µ¼V}eúyŒöÛóumSï´ÏÔ{£Ö¡"T¹&)É!Êx~9ùéÙš„<Ž­)aˆØÎ\³øé2îyr[É— [é ãr;DdÕJòÜ?’pðÖð§œ÷Sx9ã#ÞÎà:/iÍÙ²N©eC×¢¦‘ÛŸ«–8gj`Ì…Ù¬ÓWZ¬nå)ù—DÍ HbVÃ_öŠ@bYéž{ ÏuÛc:èun¬ë€uƒëNäédv¿ßödsûQÍtzU1£öqÒ¤C0ZSA?„ †±/?³øåÇå'lÚŠ‡ìÙ`¦ûÈúy$=À'_ë¨r½|þ©?}õ/óÊö$š’±CmZÅÒ¤f™U$âÒtÚõ{Ioÿ}&åråúK¯‹®Î¶¦›Á°0\v»N“uÃ/HQ+,sw£þûòõ/o*–ÙºÕ™]­÷žv¥U‡Ü#OãA'Û[j Éó¹åëã×zgNÿÊ"„Çç{ëè.Ÿx}èûè©ñ‰=Q¯kÂ~´¿Îø5ÿ ²Y%KŸ”Ätòz}Ñ.–{ºÒ@Öjê¬1ŸKî\”-LB•”#ÓsÖµ>¸…ËÈxÕMq:ÖÖ]ÚluÝ¢üí%! 35¦eµ¯œ„•oŒÄ½Wb‡Ã&'O2†X#<ÖrŸc½SÖ‹û%ŠbUQ+8 Þáp(ˆ-æk·›¥—|O0’â”êé°'Wß8+KT,Å¢—êñVm|´=µuîr[Ýööóýýùþ¬=x sû÷wyyü½ÿï¿ßãM¥»úöX¨ÛÉÛ£ÖÄ[=5ñÀBâTGÛou[‡ºî£H·6ßéaW^FÓt˜eª6Í Ž~³èÑ+ÖZ‹ŠþˆD·upKÏÜv8“õèçó‡2ürÿö.­7ÙÇØÝ}Æm±—ÛyÉå^–é©7èv¿,?ôÿzÿûõí¶íïZÔ9ß~Þö7DÝò_ˆâcùñüûþ[Ë K’ä¡þLä™ „¸Ý܉øØ;ýÒ²7d‚z m¿|ï¶ /9ËP3²#­ü&[þ6æcDçº8vGøç¹¯v¶Ó:ëãƒôW‰ñôçë{»Üþ­ò~|º>_gß7óï×¾ï_ïiŸïR'yʘx³ã»Û"gfÛºaVR–Þ¹çÖ*Z†Œ2^Ú^|ýeþN,õ©YÅ…EY=5ÈðµQO0 ¿6+¥ßçÂûsÕÍÓqâH:%ßí]XôÃO{³¸8N—æãlð¨_ã2i?ÓMR?öé*–jR½a Ú!ü_÷ó_.Ñipö’ªÜÚ±c¨Z¡º©MÇ-‡é[sÊêÌÑE¶Ñò;UR™ÿfqÿq‘ïÛÀ6Q®&åòbŽˆpÇÍíÝ™ùÎéBô‘ÕôgÒ²¦¼í{{´ß¿:ëè“c5Õ%åFÐØŽÅÉ‘á1›oÉîœa-ìîm ­žS›0Ò‡0f@ʤ€Äd±Iô¤\PØÚD‚¯ÍnHèŠ{q‚"5iµwÈ;‡q–Ù¨ï1Úm›–‡I³>KaDZç¿iõçüòg:Uð{ÇÅÉfÔ ßŸ6eª¸àb0hSŒ(!äJqCiRÉ#®y­D!R!–ìÄdªÂ³·¾Ü=úbjK‘ vK‚¸„F’ûÔ‚–t¬#k˜*š-êL*+‡‘ŽPH2$D*IP$W±–?Œ!e²iEn`Åá!aˆ¾Ì`+UBƒrª„‘éêaºRè‚›R[ƒôB.èDÐ"e±]Z† „‚14)VótõX‘©K›<ÒäÞöeî=9Îx­•UÁ*âÜÒ{ƒÒqî‡=ÎäÈ„ßÁg› Ç5šäœÅbaG¡Æ"O¼§Ç EÖÂ-²7Û–ÎòÌçÚ4}ëvžS¤.}ÖOcºžq…¤¢}Wk»8c$ãhA”ˆVÇFD].ç•ÍFÃÇþûwtß^óh“'aºðc×kèG•×®éž-Ï#®ûçÄWe„Ä]°!ˆ–µÐµmÜ §o€Ðª"´M´AhÌD&È&·°ŒëµGôt?ì:î9j&}žû»¾i[#1v¥ß$W”,oÇ–wû%‚Øëâú2IÀ*þwâåÿöÏûý5J®¹û\ÃfÑi“­ ·ÑJ ×[¹ò³lî„…ï§É‘ÞÏ~ìõY;!ª×¾^½[Ƴ¡ûššL`Á;wÅ;ÖеîòƒÌàùp{½¯íŸóøûPºº+ý™e>ÌŠ~Šoçžî¶IÌZŸiðk² ¤‚‚hf7½»éÅXɘ•›Þùíi˜³«Â±Åý³ÔwHQkm_÷ýækÒ¯Ý'¤ckþyÏ?«òè"#Q ¾SL§Ñ±Pâ5÷óšÓÏ€Ž} «e5!¸ãND6B•Ši¾Úh×&NRÂÑu&H:–KfçIB¥ßõâyèXØ3B8bÖp•ðÈï¤ÚϹ—±9£(£Î#RÍî²DÙˆëŽÀwrÍÍQh¶aWCÜÕ ™ ÈPÆ hy°Mi€Ä &’vdFGš É$ϵ ’°¿ŸdÍÏðôã¯)à®e^—{Ñ6fÙAF0]Œ°€…ºP÷°/²Ö^˜;” BQ8虌Dl+ß–äwÑûÁ¦ŒaöÔ§E³yKÎIäNOźò„Ÿ-nCWã$Ü1*ÜšÉZR>&é¸8/‡N;÷:– ¯ýtVW•_,eat¹4êus–_ š1d‹ŠÊ¦…0»Û™­­¹A sq™ûò–£*$1AàMLÃþN¼þb—Z"žÎ„9Q ¥¡M P‚@Û€&²‹ÛDjCW HD¹ Jåx;~–ÇàÓ¥'‘€K®\1*¶Ci‚MÛ̇K¡¦Ê–Å’2 ™^ùÐDŠ»Â܎ΡCSV¼"j­Ë^‘WƒNås½]š~--L9%’bd!c{zš´ÓLG5~ži3ëk=ø@óÁU£BªYµÙ•€íÉpÞ'g”ªi¸' ”x‚KYÂ<ÿ@æï)ýeªµòžæ·Âi8ë\X×IM.*×(/yÞk£Òß/Pžrš×îDÇ®õ}×;Ü!@Y²Ï_tsy(¤±ËÆF <îÃÓE§j9ý6húr>Ö:'ú›™Îk{ôäE7Ç¢¨˜µ”Ÿ.Ô×…×yòýžˆ<ÎcÍÕ¼$^C¨;œšxb×è%Ú‚!…µ èŽcAbë”ÝMÓÞm…ØÜ)DÒÞ«ƒÑhýgáÂ?'ÈÛ_ÇÃ/³ü ‡‚}o…¿wx×v%KHµ‘ö»õ ̱ô*û7ÏäS½'Ðjœ“Ô©ÔIïöœÐ­ß€YŽì6÷¼>õqyðB)Jð6“VÌUÊŸ<«ÙJM#'¼úãd™aΓ}Mq³Ô-ü+!7Ç¿bøîç?žßªB·¸GWŒù™ù{ꃌüj<\¯ñï™éŸÌ˜ŠÖ',!ÍQV•>ÏXk¼¨é4oe>ZꬊÎbÌ ÈôZ„w}Vÿ<a´åH>?é~†n_Æî‰<ÛòVíε·gäP èfm%¼ùqM.=ØF ¬GŽ„cî>‡‡$Åx1L!’BR€4Z îÃy4*Í÷î-T‰ÈÁìd®&æ¬á/÷¹ —M ª‹2(Aô5.דmäªFíñ¯l>;Ë~ìëXú6¼íÏJ8mV°åÖ¤Yëa»ž¬!†p•T¯’)wéJIÆ,îN,ÇX¬'‰ÎÒeChÀº!‡6(! ‰œaˆ`ïú”ކ¤+dEVáIY„VŒØtN"ö`uðéöÝÎÕB(ú F"ƒtiWåÓåJ½³ž¹"Æ Ë”Q÷ *6$b£à(H‚%i“,a’ƒÝ^§“2rd[%ý<\4c ê'£Ôâu9Dˆq«J(ÁD1CÃûìŠ(®¯ó™TXI»¡=¹;­™è¸Àµg5l·ôÒ°½öjZ{—æ—“ykã Ÿ¬¹‰‹/V´õ„uò£W{òúfjw}·>zõ³¶/BÏ<»0ñ:ðØæ™KaTïñÙ™ÕÉi䀢#|œ{¶çècìeü׃[‹¦œRC9„Òr ,­¬Q»Û†G×5kJÕ{ñ 4Τõö÷«S›ŸQ÷³œU™Û¿Ã>ƒE4UoÕṞؒïÕ…¢B‚lZ|ÿš›ãêN!©ñ&zB;ƃìq”ZW ê[o½Æ5Õ"6mTœpÂÇpCT ¶²j¾†ªa† I n(Ûºåw¡7‘ˆvˆÔ’]Bæ"똊î: ÝÀ:z%ÿÀ6n*¨DJ^+­òe«‡ q_­Ÿšïu¹ÉémuÄݵ‡=·¶•ëYŠÝ·Õ‚·_åý†?åÕ“ÛÏ:ÒÃøò£ÍÚý]›/oö ¬'ü˜=É{~oÎÛá_ùÚòd‚âaöƒßH\µjа*V%jµ2P[®Bgƒ;éÛnTèqsïCÏ I}NÉe‹è±o6L¸Y\<Å:*7é"EÁ"ßxí÷ù¥¿ÔÍ®Ö/p{ÞwÃÇúcOßËc%Õ 9‘FPÖ[æ×Üó½\8e–¹U+)Zõ¨“ Á4èVjn\m#YúG#YÄ¡Â'† ÃÈéå½$ÂÁ +AªlN-h¤Yóíû<¢ûîï{üé;+“²Û4)±÷}÷Æ“D.‰sSÿ©Øøëüé}·Ñ[>ŸßÖ› ^æ\ÍÆ<ðË·ÿ“ëýñ žxæpq ûMG´l©Š¹985` LšQí}^Ã/ËœA1ÙŠ3±ìïóÿþ¶®Eô÷/-öî®Íÿ?¸÷!«¼>§,þË…?6´¡7C«)â6ÇãM–Ãåis„¡Í°J2ÄôH›ƒ0–šÂ„Ro͇Á~]ÖëÁ*YŠx,Öâ%š;N!ÓA’F§X£™LTY–ìUØ>g§ï.ív\ûÙÁ€Š´ vÌ X%Oü|¶&ÄzÛqûr‡ \¶ûn]1…•Éâ€ÁºlWšŽ·­Åò¸†@µôù1·gè¿(9¿üþK—îM>¿{~]½²¸ûK‰þ|i9N%XUZ$A\ ¯ëùnìã»îN!l…yªÍ.&ûá6ÆcÎXõlå¼Õ5ÑÚÿ¬_–7'“<]¥iSŒá¢°þ»ºÿv:ØH–æˆS~yª=)J‚Ã,£,Ž>;¥Goõð˜šÚNkêˆ+1Í9xð Z Õ ÑuÖÝÓFKµ›Í1ZœÖæ‡iwÇàé!¥©§å•3]RGR¡úQ LÂŒè27 v½Ë¡X>_t‡.e™éj\"‘*@—®–w–}·Ÿ w ÏÝ„bŠœIÿ|½ïˆÛK‘Ÿ¼&§=ɱ|è¢ÎðIÅXØ/=×Ç=dSOŸ$òù’½a’wCÆ€¬ì–k ‰:3cnl¹¹ŠkuŽš9Í,efgÝ”^7½KÇ>ºIOã—û7iƒ—zf÷žk^… Ò9g²ØŒç=\»ý˜a§æý òacáHc*µ[Ö—ßÝ?‹YøØb¼2[6%ñþÑ ÝóØý¬j –X#N1ÁºdHh?Î0m…¯øÌ®ë„²ˆ AD³†Z›¤a‚wµºêÒ–ã[‘4±fç¯M Ÿø´)]V|™ÖxÒ•¬x‡$žÕøΉsbe£×ãŸìçßñÕúô^háQÜ“¾*²sŽ»ŽZ›C¬ª?²Âï8•^R·}o$* «‰W8÷4Í´V=TGm)æ933ó6 /EÒûûÀýV™Qµêóø§äµ =>×ðo¼zôíxÈý4'ŸŸºOx”ÏÈH³ßR"Žq½aÖ&mk[ùÓa—ݲ­ …E !©r4º9ö÷ÙX£ y_^ÁÝʮĜˆcô©6žIofÚdZ Æ£¨|︴ÐLÅ©´4–•žF  ˜LJCW–‹ÌƒÕÚ-ÌS˜`¸-(Ñu Õúlže;Ùô»ãu^Õ³@B`ü>L¼÷7£*;cn@o¤Z)}·¹£U°©®tT„R¸]jE‹×''‚BË©•@P H%I$jdréQB¡q3¸¤ÄLÄj‹‘Ä +ßGda±«]õ2Œ Ò!]Æk8¤m Àe°úÚ|¨–¡ŠgŸ×õRïí΄ËPRb7’R!æ’#bÑÒÖ’íè‚]cFç,Mß~½ BéÛMc1d–iö ßpyÉ®×é²SÎC9¦ÓåCï\÷zÇbh4ë㩌JB+5‘©¸ßƒÚ­^YIŽdÄ55ÒÊØãIE0³šÞÊ5ž«? ô§óC´6ɬdTŠ>Sc ‚1ÝÁ*Xå8âÒ휣þK—ÿ”ǽK¿ÈY»·õXÁètŠhñºí)ûÐx¾V@1mJ)˜F÷ê÷9ü+Ý™ÒÂ׃«qå+?ú±œÙ+}¹ L32s–ö§s9%ðT…CËû`ÍO[ëc” QO£/ïä%‹JöS /D¯û˜;؆g˹~y5Ú—}«Ò›–^!‡š = ½Ø²ý½´ŸÕÒÐ+˽ý—OöåGº½ê#8sR}íòÑ­ýϳôuûãÓKq¿^R¿H¿` â”XÍ m3¹&³zô'¯ím3ìGƒZÍp,]žš1ßtØ_.°=ÁÅWË)P=¡·î:sÛih÷æqâ6ËÃ7v"kéb+³¤¹Ò÷ìx«¾üŸÿra¼÷ëú±„â<í·ùYfÿCÃ\ßiVç:Êš@•$2²§Ô}G>†|ÞbÏ>³Æuç¼¶Ýè@ð "äºu–‡OêpÈ!’†¸-'bu/!}DjÝüÿ·³Åø®ÃÙénb…Ç”û:nWÖ;Ûìsw·c¾¾2ZŽËqá -í©êk~X¦TÐz“³2b/z‘¶‚+A`œìq|¨:ÖËðšÿÈíN³0ØÑÛf¸T¯™ ™0šS‘ÚÅÈŠ´°£ ¶ïg¼ÆZ¯Š¦j*+¬ÓhÙƒ‰Lw»›^;;—öá[üºËŒÁT@…nÈ”Pu—|IˆL‹ ü •v‹_ü²ÐŸ÷çü˜ÓÛú»gÚ‘þŠkß÷~é’þñò¥(¾§ù¨iv·ËÛ=½˜–¢hEU u ÊD †½G¡é7.—¹L®qr!bsÛxí¯w·ˆ©S—ù—÷÷{ï¢4u°ee¬'­óÅ`ÈŒýögôûú¾:S×K%Ì;Æùÿ_ÓÿµÚóÏþ™o;ÔdŒ°\Ö̲™owÛA¬÷Ý\›ÿÇ×ãÙ¿kÿ»|dÔ?ÿôåõÿÚöïóÐò\l y‹|­É/–íôà%›£Ïúé'+ñð7M$¶š9í,¼ÛMz¶óÊ0í‚ AÅŒÚ<Þ-ÞzKëë·…³†Ö×½|ûu»ô8ì´öàEŸïö÷ÞÏ0ñ½}µu&yéëGþí&x­ÿ<Êy¼á)…‰ÊM/|O_:øô/,)Óé9p0%{g%Ö³fýÊ©- JkÊ`W+>Õ± eÅ*¾?”h·ÖûýòËîö¾Ÿÿíû}¯Ëi~æw6br6£šõa×§±ýeyÍQÕ¸½ïv«ØüU÷r‡­4îéöl;J¡ãJ¸ :ÇÛŽåZ6*öZæåžW³³òþoäù&ÖŒ-°-¥/ÈQŸžÞ¬×3v¼›3Õq®JÏê—nܾ¶ÔåÑZ÷¡z|°¨;½ÏÎqæÔ^˜¥ôX½¸‰ÁäÊrÂr¶ñ j©¾ãœíµmÍ9N½Ö°yÏöõ¼«2¢;kõ²z=ÃI3eÑò%"ºª‘ýxWÕN RŠ«*ŸWŽ´`Ô|ÅÑID"¸À)éïD§Vîm3à2r‰Š$V÷úîeº³!T0XÖ%†…­-y‹ÇEIt±ODå×sç%ᛉ7>_–‡3§·A÷ÂÇû×z c_ö54Ó¶ ˆƒlêœs49 ¤‚¢5tä.vkç`‡·,=ó"Ùk¯0×Üûà¶rPs¼Ä5:<\š#ËoX‚O'uÊTÄHÅ8fšNÊnnˆËpRº—L`–ò*Üš+ v“=Øò7!ùló"zDºð˜FXÄBK8¦7ªá+rÁ,ŠP%dŒ=°e +ÓZ¬eF4 ¡"ÐT‚‰ÊR`8Ø#c͸hu3¯ @ áHqp–,ލZÚ˜ HÁ†©Ã†$-HŸ´ 1Lf"ÝÅYÔÅg©h»Ãêå“ÖŲp*e$OaJ@¬ÃÎÎŒ"„‘5ÖEƒ=yÎý­¶Blà §tševDª‹*Â]´F˜>¿‹ù%ù¢þâ`dÀ¡–^‰6Î/î,íoçiFÿx{íܧû‘]_7}\;SëÄk‹HgØ/†">!±!Ø^A¬H“öÙñÓPC, \“еW H I…à*­~Ì[ëóß>\Ì‹8â¡Å!-_Ÿâ­!Wð¡|ÃÕù#ÞwÒÆÎÒ±“"âDm×ÒEŠ# ¡Ò²7O¥ôqŸÓ«”+b®ÎBSÚ&W¡¦Ñ@lŸ{ÝO­€­ ¶¦¤)æÉ½´çMù^{<á]‹T<é̪ƒC¥ÛólÔvü$^®´+9žFÌK”vØXˆ…Tß×µæ!r­1Æflj¶çLËäòŠÐXÃfª‘ÆÜxâ·Í CqW¼ö¡!û ×uBù‡öëDÉ7‡OêÜíÓá8ÃKz¸ã(E[ØyÄ„™–ý\È!T'Qô‡Í?ΰgÛ æ½üô¼;Œ ‹²ãHE¾QJëò™`Ñ:Ý“ ›&{jlQ@ "IŠN‰–"±KÜ ”VÙí­ÅÐ[Û.>Jfû€Ï£{?è©ìÚü¥$\ûúÖ~ÛóùOœÅŠ[;•<®W¾RÎ~"Æä””úÆêêA<à(5(º–n“oì’ž2ÅÔÆÊÃ:òU[&¿3‘>i)ÁdþçUÎŒR¯³Ÿî½;^S—z>Wïö­]MøÒÃ^Ãj£Š:«ÂÀEIÛOWKˆ(¢TÅ;l HAPz¨%Ì+}öî¿Ðæz‹­A;Š±åŒ§¨ßÔ-Zí ¸‚U—1.ÐDDº+£,j']a†œ±K.4€$ÀšsǪz#ï°§½«un¤a‰²¢tZíF]MÒô‘3¹q9S·ýq°µ}:Z^û[ÏØatÖž³ÍÌÑTeREi“!Z]jÙ¾¨·¡R ަrXd6¥Jô`Wx¥À¬ê%Z·U¢ &h©‡Ç7”iu[¥‰ £k¸ —AêÕd˜âPWêXBb:3")ˆ`›€ð—¿>±*ÛLo¿§Zç Qè…Hˆ•-§4†âš< ¡jÎS¿óTu‰Ø’Haèb3ƒguïa¯¨"ÅXª²f9áŒì¢* 2°`êÙìQ˜mb]gY å_—¹õ‡q&Ý;ˆTÂl&£—ô[z½y¿Ñw¯¶jš-ßâTU÷Öµ Í]3&U:X×­tÛI!̰ŠÂ¥«\:ð;ê?X6f] _³¾.X™‚ Äe¬DhP.ò€‚Ø´Mî)]I”Uù¡e…°;PUb`Æ´(?Ô¼Öù?0?ÇÊk³«CÑ3Ýö]#W‘ÍËjîÁ^,ã yU¤B8ÐÔs®¶B®žÆ}¤,\B+Ú­ÅH4¥ "žè]sòÚ“=V©ó¬[ko —g )ëENLä^MV<.†è›¯Ü»ÏŠäÃ÷[©¿j~pRÈ à,se¥¸! @¨?WOwH=k(Å”‘RaqßÄ‹Žg\W¯ Jjý×Óz]3¬÷‹ªfÜB!×ãÎÛ‹®Û9¨:œŸ{íH4¢«¥ÈA´ç•»þ„þÎh‚ò)ƒsšìåô¢Áùu8SÉh<Ö* ”.V±tÂÂ…4S©¿ÙÏÏÔj• ËY­©4=7¡œxuŒžæÃU‰r4ÙS­ÎãqÂqòs‹¬æEŒgÿ¶ù{§Åyö̵méªÞ“Ãó[ñ^žÇ©h/E.†Gvk.þ´gÊ×Ò*¯oò±ÁÚ~œøó·­¿쇶7â ÙØ¶fƒÆzx©½vÖ1sÎgj³¸Ö™_ó®ÙÎ[„œU ƒºÊÁ”ÂS³5“`¹Š@0TƼÇþýºyzil¯Q/xóuwáöŠÃyÐÑãk“ô÷îw¬xúþý틽yœéñ²‹¹ö t3ÈæÇÔö ìÊÔ‚=y%¹Ú½5°at–û^†}5mŽØF;k·G˜GáÝ{WûÞùôî‡=Í5¶6ýB-Èzü<Êgž Œm'á¶ÉƒÎâh{_æ—€ÖFR= vQ# ÉÒݶîòôo×8ÙÄ“¿Qq™¬Ñ¼ Õ`”¥_¥-ÓÈhÇ`ŠDN)d2³ ¬Ä%R&#$id„>Vî¶ŒR‡r)Ž¨ÄŽP&u‡ŸƒZdh²¸D`’„uT&0S`DŸÛJl•xX™cm™ †ëMsÖº L|fêAk¡QѬ8qfhoWµR…’Z›ÔÏÆQgka¬E‰7‚*‡'ycÎ+ÃE~LðL}«y¢Éª$:%ÞÎþñkKº¼e!Ý^zap…8Qm:¢d%—¹±¡×zxtmë°ç>L-å?ü`àÚÚ–»Éߤ?¹þ&ûl7®#ßÏÚ³®µnæ«Ø:ö¾¦ã_j¿–Uô6JùU/Ö/n¾¼ç¾õ%(aÝ ö`ÁÇ)ŠÉ+°öLÏXßùqÏmçk½÷ÅpôH½=9t§’qxÒG6ðr/n*Y©#8Å%"c´È£Â”\S[8(4[edÒÒbNô@LjÝ»ï)M‡+ÍЧ…þoÕúYÅçZîT×ÖHAuP€‰ÖÀ/ŽÇW¢wªvòi°´VþŠÒïHpSSÍ)Ôxº×ÒE«JAœm¬±-½\X¢NئÉlK qÆôŒCg¥Šåœ}ó|i·5áx^%¼¾Î¼NÕ-\Φ=1j%TÄ¥\T “Neý<ßEUëã»y$êVÎòô¯ŸïÛ¿ïÛßëêóLfüÑå>Ÿü±é+·ÞÉ»wôÁ~S-×LJ›½Ôøî癹•‹o qª«çGÃÁsÙ—!·ýD_Ïô$9{€j{Às¥rÒd†Ý×ár÷¥³é8+ÎÉkÑ»û5¦¢izSõ@(`3a6tÉ.`Ë]ÜsÂ-Тzâ>üÿl2—e&Û‹ý7“vÄÍcGË nC¦`m]ßË=|‡íجâk»¼üÒÆŠ¬ ·{®ËlCð…ò|}X¥+ýåZk]UŽÄ³\.VböÖ6áåÒ¿«[¶Í.^üï³gWغ^¬ÉÒó5ö£ý` rÙ¿Ü—{FµÙúæ½§_Æëöû]Ëù³]ÄǃóªzÔÛ,嶈äi¸–˜……¬}ÍbÖ×·Ï·¿ßáù¨ ÿÒ²=ú›³îFæ´=˸pÁ·ïßÔ&.—Åqmlð'Ý”ñÉ qn>†Ò&Êâ £ñÇôÅø}ßXÆOœÃŽzy´³.µÛé3?·[Î3 –1ÊöËÃ=ñÎ}}> Œu=e¾´Òü»Ùµüv=÷ËÊÉbÑΫ8 gñþ2¾¾—jÓKÕ–ó^–~>Y×½z1ךýä¡]g[.mù˜—׿ßÝ}+ÂäNëož®ßðÿ|þ)Úùïï磕e]ìËzšÜÛk[¤¬õ‰ ¼wLÞ]üS9ãÅæo½\øö¿;»ïûOÕI «ï·Ù·/ö•é᦭ãûý¿ßÿÇØ>Œí×øy9-5Äü° ßó¿æÿì7þßæ}Û²È%‡:äÙΫ WÖm–_£§…¶F­–½Ú­·ƒD7›PÂF¯—òru Aò¯~Ä?|uÕ j[VÎÐ&ZÂ+ËgZ“-Ä[5£ƒã™»¸¢•Iåv®÷Ñ''S÷%Œî%Ù‹`q-cqV=ŠXq\+àÌêíb£á´wªû‰êßí_ý¹P#ˆà4”²”Û¹OäNá(j¬ñêS/Lœ±:âeBÌŸ^ç¿ÚI¤A³QFdKÔJoF6Ãq‘µ9äÙH¨ÙqÈ€“`U!߉H›Ï§[œzòýÛL 9Ï3Ìû3žo›0¨ÃCrPØHW„Â6Rè(‚b¡Ôq!BˆxŒSTÙäá‹*6ž†×Ä+¥b@ªÒR*–¡Æ’Ð"Š"‹jD‰È Z“)‚£@ö!†p˜;X YE$01µ¬¢ÇÆHXrŒ(HŠã½ÔÔH+ðâHQ˜ÌfrBGFµ²Œ€¢8iCvH@Q kJ:Œ¨Ã\’5!:e‹R$$ i"a†KÆãXø1ŒcŽ“›è ¶èDÈì‚÷Õ…s4nUµ¤¶d9% ž”"€àûR5 ÍuŠÑ¿~¼VWšˆÔkKKÈ EˆëçËøþãÜϯ{e,µ£`^î·=hYö§.òaÒÀÎp3¥ 2º#1 Ž©ƒ Œ‘ŠÈ×½O®=Ä{i†œÜN+}ÂÄ£ú" N=~°Go=™`ÁÅ31p£RÉCýð^ñ ¸âÆ¡ƒŽ«Ú¸¸š²Ø•6lm¹dƒŒ—<[o+U†tN]@%-¸ÆÒd1hÀÜ&/ä2ˆÈ&š¥‹`I#LhG4 Bù*t‹“r©Þ1 ¸ˆHË Rªžz#já™jí•"X­)ÏÅì™DtkKèÉÄŠi›Åª@,šëã®ìh:F]Ü>æ£ËÎk¶%wôÙœ+1”¶ã[làMþÑ<%ßé\e†æ{þ‚¿ršË—ðsånEÎò&èäpûçsþ¼ï<µ9Ó?%Þ×úô0÷}j«/ë;îr¼ ?Ëð[P>N~ìxEÎãöûmz¦¿&Ä‚DZ‘„ ˆÛgŒ «¡ß&W€³‰…[$KP ø0…1Í¡¥$ûŠ©%"OR&:Öî?–eœÓîå˜,áÍÐs2ï?ܽYU¸Ùã´#^ÇÇn5ãTŠƒQ˜#¿XoFJk& a(Ó5†§–p¢-¼%W¬&›÷Jk%2’qÃÉzòéýÙ#-¹P?VÍì¨ýœâ>çþ]ª¯î¬Q\¯J+6Ð3]âö©M*Ń"€B\ó*àK„MÙzp_N¿lníçj!öÑ ŠöÑ`Ÿ–û‡k¨¥„ˆ”ÍK´²õZX3S.´ר?Ô€FÍF. pÀ=³ŒqÚŽfå§¶ö]ZóÑV€!¨Væù9\4Î=ë«EN½áõ‚Ï8÷äÇ4ï·ø)¡}‡QŒ‚Š©Zíb,%¡T÷õÓĺNÂ)gsUJ T²q¥RÐÈD¡PV5 ª ¾Î¾…JÂÈR+ˆN¨f*™¨ ˜ÏXŠ\:µ¡ªÒ·IŒK–gã’cKhPr Q¡.<%ƒi‹&µ—v’„v±H8‚— &²µZZø™ ÑzX˜ÁKVÕ½˜Æ+žÂÎ8D’Qµª¨+¥ŠyTè™Î"G b¬¨«G«t4ž–zˆ½Eì2x§è‹Y!+r+MÄ ý$¨¡ K×µú¶jÓ¬žßªÈ zйyT‡÷µ»_Q¶{ ËDÛ8…àfa+jÑ [0ÿ2¤ÕghKPPE¨±dETâI+•„cD²`,T˜¡„“\æ.a¦ŒS!Fm!ý©hjãú©æ^fAj€-5(3닽âK¤¥xXaåX¢FXa" œ—-hïÇbŒMÛW)Ú€AD  tG¦îš27X”2…¥# P*à’±%C°ÂDhˆ9Ï!X¶v)6ªÜû«•§§¿*¾ŠŸbË8˜À Çêc¯;"èƒÜ_ļ÷z¸"S-Ò]Þ¹0bsõX“c)íu#Æ]ÚUÓ3¯ãäïÐG4„+gvÎñé—Ø»/Wãíÿì8÷ã93½>¨ì%éQÝ]qg§Ï‹ÉÌÔÆ°>gTÖ5t>ãßd»¾vºO\˜aúÞ=~E?ZzSkÊÛtXèþŸ¾µðD*Æ7nüÞR»ê°¸¾–RÒ:JÛòü,Síì€v_GLš† ’[Źڂ¨m–½¬„È×í'.´7u™<é&ò!7p«Œì¨zØÑV%À{¬g}´¢Då²Ü¨±ŒŽÕfñQ ¬ò2ׄÈd³c¯á¶R%µd†½‚ÿ <÷öôÄ^éu$„ ß4ƪ+¦³ìÁŒ›6=*“Q !Zl·:"BS¤¡ƒM昇Æ-jº/Ø0©ˆVá%k™Ç¨5…§š¹LW*ŽÃ…Ž\'4â‘Çs Wåh©£À­¹hF¹H¯Dîóœ0abii{EƒÛ–aªƒšËâ=›s"ˆyªGÜ$«L†Í“§N˜Ö•Y/üM@Cž@¤«/~÷á^ǸjŽnìíÀ¤kwu®ä!ù`ôKK‹‚úˆ<‹qàN,;D'.{²:‘oYP÷n-iñ>Í¿¿ˆ¢ˆ5ê!Ú•¨Z¾úÁ¿òCŸ¢•Ù˜Å~ç¢öÝ7Ÿ„A°6¸þîͯüôãOÛùï|ï?ÈðQÿ÷ÃùùeÏ)oÞøªì¹é_ÕúÒäDn.Ü6cîÛhóhqæ™ÏE O…õ*^©o×@ãJRQ*¤Ðó•ŠÖ:nHÇžŒ) Q«6Äú€)CM˜‰1¬(FL†E´Ã„±eIÂé¨ã„¾ ,wZÄØ9NGL O«ÖÅ¡zU ‡rV3>{µQ3"„%¯˜©ue/Y¨8Sd ÈzZ5ÀÞæ9z ˆiá)J§ÆÛt,]š:,EÓ.!" ŸYÓ^ï ¯êêÔ:Î:H^˜kK µ ¸Ëð* ]ʇێ6lO!›e¥Ñr½.÷1~öÕjD6þ¼¸^{¯,òuûνùhÎÛÇò{¼°öýOó×{üúFr|Q빿ëÌÜr]^§üúCü×.an_u–„¤Ü±PÈèÖ‰)WNž×ù²Û˜ŠC-JÁ¬âŸË½3ýúȼÓ=Ò”)N€à‹€½¤®e–WrCµx î‚Lð©ÉÈ›Ãa–ˆ*cT =‰(Ë•™­ñò“®»—oÏwùø‹•GìeÚáï6÷¬‰|νõ~ÛÛwêÍk}ÿ/‡Ó@ñëå¼]l¾áÂYùÀù|ïÙe™†–Äs‡×ø,ÿÏê·ÛøÈ?kòÚ¦E=òyÆc‰;ž: Î`“†"@ZÂl …ÚŠ³.Çë3Ó¿- v¾d´où[ŽŸû6󳿷ÜG´¹’S(¬áÖèx F‹f5ˆþ¬‡ž`¦žóÛ‘™SF`‡okˆ˜0eÌrm‹é.†)ïg¾Øãù/í׸s&^vîzøÑË9¤qÃä2ËËY¹>1~–G³ÍŽüQs>‹Ë÷ò’GkÒ¿bîŸ C¢Nü§‹]æ¿ïã÷½hýYÏMçÉ_¸üööqïoçu§çcù˜u8ÖN¹ËyÍ:âàóø,ñ*œ\?-ó±–’<9×Ý·X_Þößs¶àî_Úõÿ ÈWfbâ W©-øÀàõRßBÛ%à¯4¯+®³½Ý|o·k‰òDC¬?ìo/ó2¶þ£õãþx]Z}n+ιÝ^æ“ÿïÅÖG¹?·>F\/ǯËÖ·ç~b ÚuÖþË<æòñ·Þ|®•^ûgì¢xÖì?õ¥\í—EŸžì¼œç‡Dô%ãŹë½ráñ¾­x²äÜÒØMÕ—=/±$Mj1e`ÔèEzºÉ±¶§×XþÏÿ:Òë«ÊÃþéú›Ô†µÄýÂäùô’c"U°%rt²Ðz‹³Ö»­–:¦"Ï66U±;DÚ6é$×pÉY°¸siSFaËÜáÆMsÑ‘£Ö•\>ä&¢ZÒ|I"$êÒÎìèO`º®v“pÛ}¾³¨LüõdÛùËÕÞÝ)Ь„ŽÞä&8CV¾ßåb(;Ù%DZìì")¹;n?ÝÝ×\~ÃvÍné3´=RG·Û:u™Ëáñ·N^8Ït˜,Œ“¬À­¥*íÌjH1ß}u ©P Tª„*ÐÇá({Ýéõƒù¾peÀ\b™²ò¢P²a/Üݧ–\C „d@\후M,´`J°‚Ï«³f8²[ÚÌbÚ—2¤t9ô\ [E¶‘V$m!ЀJ%`/³[Tˆ:E2â=]KUfKUÅA+RJ»†M=‡‚³¾®@™¸Û½M£Íñç±gŸúzÉžuñ±·Û„s]MÏrŽ™ˆ| {¬©A¬Îi“RBæYýí»}2@sµ ¢`F½N;Én4¼¿m•áºÅ½â2\®“]ãHhì©ðû?‹ü‡8¤sx.„Úw¾ãØ0¿ËcÚ’éñâ2íÔE¨¿ÜÞ`Ýl¡Ð$Ö‚H«QOÞ ‡H’6"‰HJ®Ìy÷¼Ï\&né8#µrU³àùk8£±Òß‘+ÕºŠZX«Ê…¥ím 4Înçšá ÊêÇ9ÿF³þVí:ܨºîˆ‡fŸ+´”‘G^ Õ{k¢,×4ãX)­ö¬‰à|GQ׬Aí{7&7üê«ü7õ¸‘mÜ.R1¢ÎÎË ÂwŠ+Æ·ê~[õ…cÝÌÉÝù\ ëµûaý§E7%Ëôá3÷çÞì,ÂW9k’yø±&—§Î#õ(ãSâàR´ø¶ý9oU%žî1G—Ô\Ö^'HãÉ·ÎK$ØÑØY«UùÍ™Åo¶ÞYú¤%ÝXíÑû¯ïNWøøaã]¹¿«Þ——õ¿Á Î{Õ³À75?ÂËøÊ¿ÉÙ×5cå‰k/£€ši\ëÐfvnîWc«4¥ ´gTÕÞ¶®éÚZ7Ñk؇5õèʇ3 ‘e²sLêÿã~~õÀ±!¾~}¬~®…ª|°üƒ$?6?ûÒ<Ô»Šh¹¾¶];Ì%÷b‡’˜aŠûà¢8ƒõØHúØ­ˆ˜Íà]óF†nÁÛØ†;eÐ5š!¯åe†Äè埵®qðûž™}ˆÜ/ó+pÍ(mó1ŽÝ|m,¢5ÝH¬j÷ZÏÝÄîp è£(,\ø vј4ÝW°Ü£uhÏF=#åIÛ¢³¯6TÏv¢ž öB!jÒœ¥$¬‚íÅ•ë´"»s E„¤•Ê1˜J×Rãb™ˆØ†v((æ{¡ÅÈj‡Õ kEsìÏe·52³ìçX´ÝuM7é.O¤ér’3%!Wx*ldÚ¶ 3¨§µ¹¾O‘h6Y%  òá&s¯Îm ¢Þgl­Ôì_L?ðθ2k™ÍnD&ôθÌï¯Vôm3¼8Ÿe®IŒgŠºvF™›j·Î`µsI»¡Õè9J˜t? ÷g$[ê ‰Id{̨æ^­£Ô½éA)ÀÈ–kçu«s¾q4]'Ÿ~xößîwZ7ÜoéxôÔño¡Ã÷¿þÛÅý¿‹“…ü·ÎÕŸd°fë¡ìiýÖIÍk?nóÖsWt¦·Ð²pQ´å_—ï±—‹ÓÅéëxs_åÞS¥/˜‚U ’ô+©ÇMkÇô¾Tw²ñ²¶Eε™‚ܰ¾4r^eTþ¼÷…'ßr©0À^Â,ª ×}ùÔÍ›Jœ¿jd 6—ØÃ õŸÕá–î-†¦]ð V))® ¡ºÅ“…U¯(G8µÍ'»aJ\b’”Ô1éKÚy^Ïæ&Ú÷àãi«|>ÉVøCO¥h v× ³…ZroCÂ¥¦=]9SÆɾۀ¡\u‘´˜WµBÅ« ß”%S­†ÜëMÆ}v[—óûž½Žç.¾÷?Úϵì6‚ÝûŸÝEoÇþn>ýùoû?ÿÓ>~ýøòñŸçÿþÏ)£Õ‘·ë¾×cû_ÖÈS¿Î’E?ëH ½,·ïs‹@‰R—4DÑÀ''àÃmÌ’ÅóàXVeq}Ô’ŒEˆ7À—=Ç™—¬p>ö°“×òsýÈv¼¸ÿå^ö{+ÖÏÿ´÷ßîÖ¥þù/~‰¡ÇzéŸç·:ŸçÖm¬‰9/.稷lÉ-07[\Л¿qÖ¬U`êÔæLaåH|aøsÅö·Kžó!GÉ©ÝùGÛ*¢ä™[\ô‹‘ätl†E0_l¾Œ<;'.Œcïw›ÿŒKÜ.ûVŸ—W”$m6òÞ:ƨ¶W›_SÐË·xÞÿrpßÛšQ¯X ø9nÓ^T™ã;øúù|/e/Ž'ü°±Ú%É#mïý?:/÷fFŠ3Û×Ã齑š¿BœÐiK‚DdEt ª%{]h% ~¤jYv ‰6VÛ†H`û©0›§@…9>Ým¯×sª«-dòCßL.»wt¿’AÃ?(KÉì£^n™®'qi8iמ,n~ Ï9¨•­NnÏï³~ZÖä¨ÙéqRž¿%RpÃ5ÉXrÓ©ð'¶Þ¼þÔ´É’³ìü£å«D‹£Nò<«\uô·³Uÿyî^Ƽ-eª3£~l(pà§O3Ùs§åî‰}ý艸3:³­¤í÷»’ÊkÔ§Óæ<áв°/a"U|zÇëOúSEh•Ï­GIä$»¥OÇ’{NÎÐíøGȉ [1Vµ±3N—Ÿ§º\ú¹nšu"b(óY¾¤¯p%-±F×BE^)ÀÂca–8¤¥{¥`¬2JØ–#®J)¤*E StJZÔ€ b‚Ä'² ifØPÍd·ÿ†ößAûn$I @ãN-1¬˜Wj.73þb¹MZ!¹¤`qY”#>]D§MŠD,tCGJù$ñJ+ÆY90f)§øHÆ ,ÖT¢b!%+P…ñôÉÉq5ë_ö€ýYÞª ™¼2URZ°{4m=î¢)(ýc}ŒXýãé¨ €à÷=BÜ„nƆˆš¼ºø2Ön^Å1«‚YªøÞª÷ÁúäÑ7~Àûã²ï*çts(+¥äª•¦{ìZÅ&],|*Š-Ä9ŠÍ (D¢ÅœN‰â_7„Ü#Ü…g؆-[aƒ1y²l×Áë=ÖЙyЬã(ïTÅ–¾ ÑužRI÷£ÜˆÏèù±ÊpïÖj˜@n¿ÛkÌì˜FÈqÄö >¼wT  ›IÙ¤I6£€±CŠ‹Å1%.2‰I§:D¥T>Ó[€Lbh%n•j Š$@´‚¬<îdXEÄBñ·ö‡ª(®2J’J;y™­ô¼ŒKÇtÀÜ¥ðÄŠÜ!•æôÑpH{9ñlÕ9b¦æPúd:Ο3I‰Œ(Ê_ÝÜ/ÆlÉvòWß›6dbÖTþzÞVåyÐ÷:åˆò[ îÚ6Ž+OË€Ÿß㉱ÄH¼^B‹ ®ÇǪ·›®µ†â‚dŸôçä ÙÎ0„9(å ¬' )$àM/€¢*â"ÀÒ¥@-&`Rb0׆zQ˜Ãı-;mdZuÁ¢×­ÚÏ^˜(ê˜l¶úS¡ÅzàTùñºÙB²Ý.á$&œ€jO ]P&@…Lˆd°@à£IoQ˜R¶…8¼MD¶R’éX UVJt†ÉtÏ›Xws]A<·KǨ ]—=Ë~Ú“R7î Zvuïô(I q*FE4õ¹·ò%¢Ú¤]Ük 8# ŽÁHdNY™ØUgr­ý+ÿð{>‹7Ý‘O•Û‘ѵSíj£Ô"~Øš(öÄÏ)’^™OM±Sô.‹®×4‚mqe0 ½ìõÕyÀØ'›Îú¾v2U¯]o†*[gLÛÞummê†këøNúÔhstçÎíµ_w-ÑFMH:0wÁ â!Á¸(®$I`¥¶]T)pbšÒV=É'ØE‡ôž|¤ðbËŠ¡1 PadL$.-S…£-Qâ›P€ @¥Ç;h:8ªZâ!0AÆU¸È:[jNÕ&}`wJw§ªŒ„ZRkj%Eçœ÷½H‘ªRË9TŽô‘ãVu³ZV@ˆ²”A@’Í·"ÿ@` Ì ‘8êõ®ëxÍ„ß5çÇò›Å“ÐåNUõ¤Üù¢WLå!:BŒÄ$"ÒÔb×ö4[`  Z iJçÞI·-/Ã%­åF´ÜS^ÐÃãç÷tL‹jcûûðIæ*p\É TA“†ˆ ’ªBp€x e+PŒÈ-!á£üTaX´ª:°GP2 DЍ¤\±ã¹y©Ú0KÐ@+ÁËHh l¨Æ(GÖ… ÛDPºµ"“œoø‚5 +‚Î,`©’† Bap[\†W¹_CÃA¡\ª•JÆ « bÎ t<Ùr¡h!&Â4¶^1éfá2Ìã˜ý>ëéεlùâ¡ö•™Ù%Ǭ‰_°8—Óµkª‘h™Ú˜=ÿ&ÕE$e…úúD¯jжö…Þ–.,!;è©`läæjp/ììæ´ Ì>ZïcåvîôAÀTiû¤us¸Ñô±Õ‹±˜v)êC²ÓŸ¯«å |c*føAÏs*ª'NõlÎI¾³»:e£X€B-ÜÚ½¤®$ïsi>¿½_Ë¢w ´Ì•ñž¹ÝÕ×§þ gÿî˜|¢Gºóðòú:åÑûõ(ŸÈ>kùâ³v~E†q—zaKòºN-­uêÒ¹±ÔÝmfòkmõKì²òñX½Ook‡FÛ'¯ZõeŒÞCˆ”7Àiòª@%yÄœ6DÜ-›ÑÕM“ßz´Õ‰šÓÈwžÌ¿ô‘ú §.W3÷«‰¤Õz¤uWŸî ß©…ŽËèIfGg~¯b­öuMè•sJ¾g5íÏ)ÖírP–j…Åâ"ÔÉÔR¨½ÆØKÏ÷©T@x_`rÛ>¹¢e‰káImz,ud+.= ¤˜¦±ÆÉ`Þ^ûꢀÂÚmƾË1}¹¸ãv_9M¢ÀRZÍðÄ.ÝG/y™®fµ´¸pï›*qTÔò9z]ó_ÚÞ7£)· ²*Jãr¬Ïñà½æZ‘]æÜ¸ÙH¹¨I͉z” †nãB[ÖÔÀJÕÁµy~T59„gºõU (´ã=]¶uMz¥SSIe‡ vº°¤ñHϘ‚ )„Uxís­pÈò8”ÞiœÃ-½Œ‹ O-ÇlõØpjîÉIg+·4tJH‡É&Í„ ±íÕSŒF6jÐäÎq¥˜Ey¦BÄô5QÎö‘ˆí¨5‘B†"×rÛÇ÷;O]ý üàãüu½y€}ÑþÞ§‚‰ëëä<÷‚MÁ 3úoSÆéÛkp"œà½„Ÿ`ÿvQ¸.? ÛÞÆáöHb›Â~‚íÊîÏbÍ‚»‘¯ËÝß9Çd-úÑ·Ë÷¾¬—Ÿkõ¤V9ü¼>î7Ùx=Î_5ûcïË×µ|½â}ôôƒî^ °¹Î~]G!~qø=þƒMpåÐ{ü¡Îåþ‡¯]x¦+àô8G I#©£3K(±²e·ÂLt‚r¦Žù†ëPÐÕ¦÷äÖY°ªL·DQ-t¤9Ñ„ƒòŠ_£â*lôÛcî9Ztwñò¬,bkö×ëùÚXÎ yül%u ÕÝušg&@Ú׎ž’öY(+à…Oš<ñoí¬_¢Dáå|›O}ª]tü3òæ ¹È¯ñ\¶¸ìZ‡ÕßÿlAC¦ÍŸ»ßðÛÿ;öž¶M·‘¹é¸ùsgQ1Ã>l&l·øö\÷tØpQ.+ëï._YÞø(±çîšæÜöãlo÷>öûxh]ÙwÏ„d?oú¾p·cÿå£\æ2wßû^îÐ2 9oÇú/·ÿ4Ûÿ¯C_{˽©=~þ·víŸÿíùùãï÷Ùò±ÿþÇ_oïÛ¸Ã-oßÄ 0—ó¿]ê—ü/ª;’«µÓ íJ4ÄoŸù‡ßóU}Ú ^˜-üŸ/Q›q½üÊ?Ñ—_yJÁQÖ¾!CvîÛu¼è¥´òÛ7ÆKùÕ¿ýèx˜•öÛ­üÌËû~À×VÏÿo{ü‰÷Öû¹Ö/õŽ<åI›‡%.%f%bæ@¡¡MÁ Ø´ÁŽ8ÄÎbý¢ Aæ‚o˜kY/OÃO¿FÈÝþu–RÜAâ^/ìÒeo?'_çð××Ë¿}?·ˆ½<ˆe4mÝ tDbÚŒ6XVG”’ãx)\É¥mcDgúû®ÿze¯ÚôlÇ+üPXÞñ´ëmˆ‘òöv\§3’J™ÙŽ€í ŠƒGŠº»Õ펱sZ[f2åg²—«öTÆjÒuàƒØ¯à¢’ýpmbþœoª™åÇzõ¯Þð®+xÁúÆñ+íóý?¼Ø ¾Éoà—7µÜýz¦®%ê©ÛëìsgÎ^ýŽ1þ(]<îáŽÏÊÒî^µ¸šƒLµâÇÞÅâ7Oo™E6Þ"7Î8Î8gl¤#×½ÝëÛ ÷u}1ŸÆ.~ç»}ËÅÊF¹+é±Í•ù"»8'_dþÀ×èFèˆ Ò‚ £ ÕOà 4Ê>‡ºÕ§¢ *‘~¼Ç ­ 8Â!.Ñ%Œô×­A7‘cðm"M/)ð ‘6ƒ à «ÔN‚CX°5)€à€²f‚2=QÂDPI`´˜ñLmƒÜ²äPù!R½¬U9B‘“¿‚õ‚+è* ˆ¢´1eX<”BI.È23 ä‘Œc™€"C•%XCÍ]§0¹rà‡õ.I;Çw#}âblº1 ©ÔzÐY^Q?¤5Æ#µ2ÆI4Ô oB X  Ä[ °ŠD)eѲÊA0’…ÀàZo'â©g @YÔ£  ªB\Qª¨–:ê¢';ÕB±5:"‚¶"‡åªªbÅ(ꂊ¦Dþ‰T!($ŒýÝžÏÈ.õóËGŸ·½Ã%¯±ˆt_ZÜçÑvûú-ý7ûØí¾JBb–¶l Hg¥Y‚XKÚ×Xð3{"V ¶0-|ök Çböƒ¬3+bùbB!¸ö4ÑБk•¤­£!ûY˜WéÔž3÷ÔÊóèçÇÃkºØW§ÆÄ!Ù ÂRÌ ¨¨*«á1H=SOŠi N·“Ø‚6úð‡êm*T쥵2(¥ÀfQêA°ˆÖÂc¦C_±4:„®zÙ¼ivìÈmK'–qŽƒ1¿Ot݉ Ð!…¡Z«LaÍ€&èÝê*&àD…‡óÀÏ£&W•*Tz P\²"c`ÞÕ¿fîÑ+–#L -fÉ÷_ k°ÆUdfˆñaø¡¼šóîYÇùwÓý0 :Ìéþ~£=ª;Ä ÐIë€P"P­YÃöòÔH;Ib $Á8ÿ°wÇ/lmÓGô;ýÚ£bšÖß&Yáà›(|~G)Ù¿¸ØAŠ •°âªÚ%:ÁR%Ó‰¤;PF „ÓÒËnV’Í¨è³ ´`X2ÀH!()¦÷Kî¯?¼èo¦– €Åxšó<¸–ær–]ÖþKjTÀ¤µI×Áq¢’7áKY²B“VEj¡J‰H°€IìèˆëÖ¹•F•@†(`4]^·Sv0bÚÖÐc{¸àf×9Y¤R÷»õâlÓÈùôOÝVú×Ö+^ºB³ä,ðKe t¬½¯IV½¬…Åýª0]0M-}äߨîwÜ¡8ŽÉÕŸ|ñðÿð7Î ÑÑ%S©ä¸–ü¹ëÆsòÖó3ï ‰½7æ0“f‹æUˆ1³ Í8nd©äêh zm;׋ˆاB";\ô×IVo}çúçÕ>{Y´4B­5†ŒT²á‡9ÏÈ]º5¶…<øU/ιg:_ï“û8hd™æ9fF­‹¬Lõ²ôõbI>õ>Ž­ÎÖs~Œñ ^Ù­Êsƒ#†×8Þ¯ðÆõ U]™ªµ¬žô•ýnáµ{=&ëöªU†wŽQâ©fJkXeôQÑåÎy-ÛëO2Šˆ.Ùk¥Æ*¡¢;º ƒg·?Ý”ÝHF†}lG]8íþõ7ósCŸhŸ¯Ô}cØ÷Üç7¾ùSþΟ¯çkN0uüÚ¾o“·?;¬×qwßµýyÊ{û`øµª’f:—”NÍ Ò^ýö=—¶a.ÂëÂÊé–Õ@3Ýì®ÒØÚe¯ô™},•µq+-ñR txÁ7G{‹kI!$ÔS O¿z­µsÕ¤ä“ [Ä‚¸Ý‹ßðìã'_ïOOån¶÷7ªÒø ‘ Œ 'Øòjù7ȼ¼Üs3f æïk§ø¥q|­L¨ÑšÅÜ9÷:k|¬Œº_»‘Ld=,¯l¬Äq¡JˆÑ#´]rª#¸–åL;Ê9åè5ì–öÂ:®¬vÍz:œCõ‰–ôÕ›uw ¯üžôJµæ•ÕÕ6Ìw‡9Drº¥æÛé!Ù’‹û0‹V4R’Ì‚ónD@cyDLªxæeU«g4Òm ·¨ Â%ˆ²kj[¦8t#°"XCŽG`«'ôœfLF Ù½9 j:A=&!4×]+;Ó64 ø}ù{¦»ABV»¤µ«òq˜!ah߉^×E‰"m`adà àÃV:£†.™m3Vw¤¤¶±€««Œ>}ª*ª":PŽ4Ī\UÂƺ­D Á4ɳ§£nŒÚÃ3‚"·Ð³4Ïâ8ÚT§U‘bâ‰r RÿN=Þ¯hò%Áä·'>¡ª–ú”õWú»ÖLã…'“ŽŠ;…ÆQ *”M™ ϵ¼ÈL& ¤NÄ&ÞFví Âõy0<õrŽŸûO×4ﯿ57Ÿb’Úè4{e£Ç«;Zgã~ôâ]éÿ_Ãå_/˜…0¯ûâ2­¼ªR¹òiÝw×ÔS5Š~'¿ü xöÏy~°>ž.¾àqÛ=X¾Ì¬— «0ÊS5Õ€^]àÖ–UÅ6”ÕÍ»ºÀ Õ:\ý}pÕp¸êTÛZ3ÍKr÷‘שTôõ±Ø_Þäñj¾ð¹oì|P ˜sº›ì—Y·sÅþÔ¤"y5ýýç#éy¾5óúj¦hR—³OöG²“îÃlû‹gáOÝ’kÉ¢ñºü¨ygç½Ù³ó<£WX8,¶ËùVÏý¿ÿëíïý>o÷wXÿŠ_Z㌼ ìøho|ú>¦½êS¿±,Cl¼­íôK°ÿ çÃÖò|j¾–gTh‚ðKGª}ÅvÜ4õ©Af™œ³›‘KËíŒô†xâÛ¢zÈÇwùyAùæ5 ®úùÛËýÕäÛ»»¶oÈ÷÷~ÙïUæ<^—Ì…|‰½p uU±1°ÿ¯ $âTL6N»:ß—‘ñb/ÛVj$&ô8¿Ž"Á%îÝH4_„Ù)ç~9K`ÎH $€ÂÍ: Ðá¾Í]ïúå¾»/?ø·;·×õ—82fÛ5F¹gJm…#ý¯ùõ8³ÿnêCcüf¿Æ£ì¿‹¾ŸK/U/ï÷ö·5?:*ƒûÇsw‘sÁ}?ýîúóebYó/õuÍ¢ÆÂËþ«ÝŽAÑæ\—·q,ÇÔ‹d1|sBijÚQ’«dÜÎïcÛí7oÊ÷ßþv<Ýõ5ß}ojMÇ£üÞ¿Eù0}Aj@n›-î M3Ôe"EÔF³T)’]Š­’HÔZ,m¤SY—‚q.{˜ÿq–§iŽc«¼’1Ž„A ;é¶±×rÏž¡IA¥$¢KÊÅzºãm>Ÿî͸ΚÌ@´±Ü!/9¦½¿3˜ó¸Õ±ŸS¸Pÿãûµ1æM¦‡½p;ðšðÌî3ÀMâ¥1olú®Ogi¼N.ç:Þ3ûàò둳µÛB{$‰u-ÑŠ¦ÎäïܬªòKL¦ lÞá´T½PHãTâ{÷;Z7ó—½\Õ’9sˆ®>Ï?a$WÜZµŒƒ>îmˉgÚS³™OvS‡TbQkh§{v¹³ªncùÁNÃõyÉãú`ÿމA lÂðêåOg СÚ`‡Ÿêí¦× ˆÅ¶N#š­ÉשF±Ì_†"œ cˆâX¦ãM@D#€)4’>’æ)C¡(-R„¡-„@ªBbgãbÉ *F@¤…3*Dê,cw"V`ʰ è/¨¿ +‚¾ D(L+’d "'` ·ÐšzÒN…ÃMT-")œÀ¦ÒÔÃ&âZÍP ’Ð ¢Ï”M0PÅsBI˜ŽÕhLb’!%¨$*qÇ,ËŒ„Ã:ªÁ}Æ«û÷mV¦„Ò »“øŠƒ÷·þgOV“ÂNßÐälջϟ+crn~~r;þà×j²×F§yÀmç:•Dtò‰Ýxƒ¨¡&Õ&P ðÇØÒÏxn™‹fõ›¡¤é êÙj¹”n÷:f (`Y˜`ùšjÑhkK:‹¨¸UÓ`ñ ¬úY„VßC^®×¸+ªê’ÈËäf Yû^;¬”ª½k’óš<[ óùî¹~tÅÏMÙý1³ÐÏ*]ÎX¦g¨ èø JÄl•£H¢¤Äo@£9ewýÊ• ´ä%*¬õ5ÁUör·°Q«w XbHQBRöÂ(BQ€¦”cOÁe—¢õµUY^[a{¦‘2Ö'®&+sêøãáá|æìRMsYwûª{({=TßàM×r¥ëiS+yPo[3!q KdîÚ݉£Pèçñ±¬Àö—܈ªºŸQ— >‰qD-CÚ,²½â²¹AC-‹;¸«ÁˆhâŠ.±ã%ÚãÓÚÞÒ' 4 „0#Ü0Z 5†ñ¥Áê¹qêIÒ(X¢À ƒ©²E ÄÖ¦ ,pÊOÔÐc=ÚÛÉFev—Kíé’¤—¬TW¬"Fp€€Ê•‘ížwî_Þç‹}»>_—{1ƒh2øýˆû#ä…µïÕs ì<Þ1©ü[ë8+fqGÔÈòW vÆ> ¶b ¥Jñù9gŸs@ …jÊ9˜ÜìKO±˜Y.¸`Îáöp•œÈݦ¿òe„’ Yäz䈓4 £Áûì/óÅ×  e!Fì?ÍüȦ¢„@ (‡FÌwöã|,.ŽŸ7âÙž#’ŽèŠtlÙÖØ(ùå<¾ñ0>‡k@l&».’¬y‚ܦ§RAFiÜ'KÅ2/CT%¨ÆÆ…&ìdÂëüT6BYn•S¸”e( uÇë¼gÞêÏ ›D®o¶3oÌL£rrŽübjÕ”“™uÉ’V XkKWtÓ¤ ` íNruê1*wJ¹S—°*Q#"´T—:7Ð8"2çÕȺ´Órlk¯¯å:«¦[u’}Î[2¡‘Hm‚¢*ðÛ*i‡@6r]7½(&‚p¥Z ÂK,J¸des”#}ˆçpS{PI{líf‰µ€/sâ0Ü͉ÎR×PÌ@-•üo˜ðýͲ?vj2?`Ý…N}6[_K¦XìÞ>Oh­Ä\R,UÀcKؼ9Ý%ÓÜóH5F |ËuÕ_¯ŽÌkîÑdɾ[N¼ìº=ˆy¦UËD'GLL-§œæ­˜Äü ÑD¦ÑU à7¥h4%'H„´ˆ DPXt¢¡`SÀâÐë >…¶Ô¤@$æîµý:Ís-ˆÑ@Ȩ I½èçf:ÐÄ’fó×Öú;”QHšÚ—$.röëÊ b‰'jD Z€-)º'³ R„ì¶ +¥Í9'ïE°@k¹™U]În`W.ñUžÆ2×ÃíÝù¡~fã½ò 1…Ïü®¼½qýå´Üï¿l®­õš¯UãÓGÓû¯²ü§ôŽZ»ÑÇ¿csÓÞVüãMŽ©äÇdõ?ËüÝòóora‰ ºÂµ^¡ëá:@ŽÞoOÍÕ7ª ÀÈëvàLBñþœátÌxµžg®û°fÁŸˆ¥"'™q¢t0 1mw¯1{4ç£[}üÜî?röð§ÇsÇÏÝýÑöæçSürªÞïïͲç)·åê—/=¿þ…¯ßäÔ3Û?ì=®B·Ö‘K‹ËÇ©=Ò>9‡8;r‘}÷9‚GÅ̵çh?„º'!þÁõ¥É£ªýì¼ÞcÆl'WÕ^;ï¬u\RˆƒwG½³ß¾¯Ü8Xl|Nß<íðRWUOâ"û«9ö4ç¬Í×ýUw‘ÚýH®˜¨jbxhÐý2üèÁG\Â}¸\'ó d"åzØ´pÖj7ôûêëmo—ë«se‘Ÿô})¿™¤¶¿6È¿œÜÇÚÃâC]¿O´pÖ)VfŽï«•¯_Œé圤’Hn”tT‚9³ÈñI æýH±@®QuP¥eÑ 4›š×HeØ)l;Ø·d€û.Ÿ"Å*óÊ0E6%6BC¬mÅîäaà(·‹e´w¹þüñõ/%hÒ9V’]r¸BçèГM£É6XéhÙPm(÷•ó8¶¿‡ù­•¶ŸÏ^¾{üâèc‘š'_×qÍ×Ô0 h@Ò°ÂŽ6*¡Ž£æš™4 Þ‘מ…|Žã±{ÞÏÏyƒkšTbojˆ+evS¹±®­Â3ñm.¬Œ³ÎõHæm-ÛüÖ‘vñ`ãFõÌ™Wߦ;¦IZÄÀ‹×&ì1–h—k·ÂMº£G_ºÍÁXêˆÞå*»±øvô]âjƒöÊ~oZî“›½Zìª!ÔÒËà‘üm‰"LX† {Aw$"‚S‹B¡¤ÝWŸdf"`0†×èÞ S Ô(ÀHƒn@rßuÍtø:MÅÈôR¨Ç¾K HÁP,YµÊÑs œl‡ûÅÂÓpû -áHô†=:oüYü´5³åÔ×T×ÑúÓ>ÓGÞíßWkP¶I³Š/^µôqµt'ÛøùoYÖþk¬¸ÖŠ8$@’V¹¬×çž^Ëq;Ç$ü7ŸçI3ðñŽÿÌúý¡{™óµ‘êã§®«°XŽ]kIO=€×u·3/û4å"‚‚[B$¡9ª‡æò¶5(BCÝI”ãA={Nëš?º8-ýt®Õ_Î÷{ÍÍ œv¿îGøz®ß~™ÚÑ#f8úâ­üÎÍ•ñc¼ŸÎ×þz¿ë/ ]¢t×çÅæÖêÏ£×xElž²ßuu~bª9ìýÇtWÀ´Oùþ 6¹o­éÝÙ‚¬«ç5Á<‰´*úÝê ¥ªl2“ÉæJ?ÇeÇQ°iõ}î/ËkW¿«Òçz×Þ{¼Žòz}\¹æÒöÚÜ—‡Y“`.\o¯|I¡Æ_ìó,v_;QSÄåøt‡Xãº~ðßžùryõCw5ê{9íR?ôaK]v¹~Ư¯?×?ák—÷ÇO\ë¹ÇÇG÷¯òãó-K&Þ÷Χ¹‹ü©ºýÞ=ƒ¢ü×ü}®o+ÿǺWêcëß˽·<Ö}ëËþöpyZ‡-1+æ\¯ãýŽ÷{|™sþÞü÷jòâ“ !¢aƒÕ4جå¤~g]‰š¿O·oy¾¡=.“U4Q²ÈŠ4<øÈSQ‚I m}€àÅÌ[Œ†™>á¬# ‰—±»æôðY||§k +žù3ÉuA—*gÑxBÍá Ķ˵ÜbÅXíqNQ•¶ûÿßn‰·?Ù;ùÛÿuØ÷Úâ·ïïúÇñ÷ßÖà“Ô”œ§{?\{‘/Ú^ž-.¾zéÜÌÞ²MI—s–{9xжþý5Ûùï»ð¯—rÇóùåyï|‰‘#' Yo„2J¦>b‘›e;·{£ôÇm³“KîÒü©™§ÅßF,ѶÊå¶/H9ÔÇ|˜êjž@¹H†m÷]þÿÿûßü?÷÷ûöÿþ7ÿ®ä¼ùë—_Y¯…yÙO+uy*ùWh‡‹ä2³ÝóÈMbehKIœÐãCÄppÊfß˰vÉ«ÕÕÿóÂùýjo vs•i¤iÉ;IMA©l1ÄŒX„1^éÒSúJãP/W;çÞ­§¹¼žÜc3W2Ç‹žå"Ý<ìøÃC]©i-µíoÍ·wC%öGܶ+ÝH`IÌ7Æ­ƪ߸*n_Íý­¾ú¡„KoÁ5v;|\íjú8‡¶ö\ú÷x{8ïN=˜.z??ÝχyGd^T³/€lÄ·™òñR0(I ¼v\ä0{Ù*¡¸ØFqïß}²´QóêsÎiòáï=’Z3àãáõ)«¹{nàž†!Ílmf§JšÉn%!ÜÈMyŸ[:´fôã©Ñ}>«\Kû1ät¹! ã :Ö™öFnÏ&·÷§÷ qc®î&r=“¬³æ÷} õLMÄCtÁ *RbdÊ•ã²#Àb%ß!ä"Fš— ¤ÓT(V¼´b™=42´):v¥H CBTÀ%MHgËçÂ%I.jI¶Ì­tŠ!¢,&˵6F(Y84¨$HȤZ¦`Ù­HÏxu&b,8dYéV9¨‘P (°S‰FÀWÊ ëTDà4(´Æ\Ì °Å$HˆAHE‹a&YsÜç±ÌÞ߇ü?—û¯èl¹{W…áµùŸ!œÉ?üSœ?5·b›{•¯_¼s~jßó*¾E€Bà˜tŒ® …2T‹ÐT“’žó( "Á 0ð·ÿpïý×A VZnlõ¡çæÄNî6‚•ÒÐZEˆ@9KçœÏ/`‚‘èÅdzç>¤s¬J¹O…) D)!A$Ië!UTaĵÈÄÎÍ0ˆžƒyÙåÉ×¥¬š.š“ÆÐ€Ï´¶h„<Ã}fåCz˜t]W‡Sã(g5FR0®Éh­@y¯Iíï´JkÚº!•@Ø€–6 ±$ ›jZ“†BMîññ™•Ò¿z7|ª7°˜Vá'Wm7‰ÕëØªýÒâ{ÚN¢y§VòÚŽ\y¸À¡Ýncì´Y-kƒ©í–%¼t,~ óW®6oìÙ¥½ºô:•L–ñoW›Ñ;ÌÜû¾j…Îm†8O‘Ó…‰rOï“ÏÝéõ—öÇè«G ŠB}ØsÌõ7Ñ9¬“›OTû2O‚NqV€˜^§Îù;ªBò®ï¥§4´ˆ…·Õ|ÇöW´Ñ·ªOø~¹»e­÷{ìœGó@­Šu‰z2R¦ñÀ[²%$éUa›šA@DÓÌdÂr!S¸4kc +žŠÙ‚ðHÍßܬÿÈLQÄ3´d’ØL—xÎkk¬UÚÚ#§zÓóÈšÂÀ¾¡Q¤’à+Ôš4û7t? &~`í¿ì©„O½X¹–¹©û ágC*—fƒA{o×è¯ã8οhÈbŽÞÔŽ6pQC{XM JšÈpYOW²@A܇Ew÷QãÊv¹ ºIÄýyð‡Óÿpÿ-øÜtõHõ™©¶Y?/a÷ÐÙdvŠ˜Øe†ñÎì¶çí;…êøf,  \; ª|®j–Î(p„€Àj»øA®VÉ ô^ç<^™4•†G`¦z—½|d†µÂ`//!…ºvÛ¢‹;QÅo o ÔÕ ›Á£1,d˜ˆDReŽ67\Ñ“¢Ùìë´tŠO“òâíÿ{Ü;çžîgë ÌÌ)®r¶î‚3Á­Tb åÛü”rÏÂ6…4½ùÈœá‚Ü0Ñg· 9€Â*y™³û„BÇ\…ƪ+ݶ\Q”…¤ ý3/¨[p¤ÊOd6Vê܇ߊžä,UèˆAí¸3µ4þ´²~¥-Ѱ±ˆug°9dûq·94ìR»£FÞOéí#ü…Á³ŽÒ£\µèÅ|‘ßJúšøý»-üœúܨKöœÆ«äŸàé q?¬?@1ç¿üj÷xïýV3ï¸E«ðæÄ„|-Mï6—Sh`eús{/®}­¼áÈú;8k×?èýPζÄÛ·PYõ´H7(ø‡+j¢ÌÝmYg×=Ì;–÷¯ä­ÁÔae .ºÔ¼*³˜“ÇÜF½ÙMðÛuôëÇád ‹R^töÝ{ÖÂ6U<|[Fù÷Œs¥Ïª‘r‡kÜRFŸøˆa·? ÇmÆS˜\–[T‘P8-úëãšJiì1š†ŽwâlÊ£c±´š!×5~†_žxWŸ?äò÷|ç¬;Nào”S-Gg€#â²ý’‘TûêÜc6“\_ÖàÜjÁ˜v¤hð2[IÛz¥«kd=ã'È Þ¢%0šêIÓ6¢–DÙ£Ñ#O7¬–["dlÆ×耩f¬ôè~yÿj΋aAR5ÍájŒ ŽÄ73q«K"×h WµÃ¬áöuÃ×°Çù\)¤ç­ }woÄ4AÏQx;²Gœ5FŽë¤QL{'íÃóÍqÞhŸWL–V‚‰¬EJmÈ£@Yƒ£EcÜ~š?L¶ÚÚ m:6˜©‡ˆ›×Á´#]¦†óa:i/Szw-Eðp…1¬–”`“ëž¿ªQbi3=ŸžÁzLänl3›ì›“ íÉÍu/XË­:Âêõ°fNûÌ]güŒV¡eª致ù’ˆ†af ``XÂî†@°ŽFy¾6AQ•#‹´Ý?-ÊÇ2cg7c6Ó¡¼Q)\›¤DCZæ'…u…¡‰¥Âc;&Jä•òñPò[Ñr[#“ɬ-º©Hz/˜Ì™1Q¹ßͺ8Œ²vµòÉBñÌW5xy`ß…à|òÉu,,Y²¸ëÖáªwr]~ûUs"^ø­ÒAiÕ¥z(ÙÒñÄxŸ;®Y™¥Yª¤Fû½ãºjÞ&RûÑœ™’´SËý`N{˜es;Õ!g7š’!|!6=Kw†2…H9.r¥Ð•ÓŠêf1ŽdI8è ™•ËMƨq£ KQ»è#•¬\ º—Òo,|ì¹!õ¦ÅøpÆúV¤-îQÒ‰›ºvœNK°Ú¥–@èĆ文ë‚Ð`N·"w7N¤5‘èðÙÖÙÈX{]w>RèÚÍ”¬0-šâ¢lŒxB*'hÊ*9æYW¥ÅÒf dRÌLF:%MCÒ¨U& Ô £ 0¬ P4,°b 5I’¬š<Ã5BHЕŒGÍ!K‡’O¹`€#*àT¢ ƒ%l©Á9„ ”©”!BÚkTµÌ ’ Ɇ5A'éA<‘€Ü®v•%jU˜nŠØ@R#*Á†‰[i[‚A("ÞöÞè`F`ƒKbsdÀ mC"Šœ„À:–(10Ð!6A" +  ˆ  #8žòš8z‹bŠž´G4zEÈ€¬¤4C„€¨b#©E"`!Xª@^"H †,@„°ebcYÈò¤Œ¦¯–„öPºc2zœw?‰askšêÚJÝT>­UÐË*F{EK\fOÆaUŽAåUÊ ƒD:2a×qƒ{À¦1ä iÛÍ1-BP¸'ˆ˜k,à ­! ºbX ¯¸DR¾rA¢BŒ‰Ñc  ‚T¬ØPšRTqž0§² ë)V.¹ O´MjIMƒlè·•¬"Që¢e"òa7«TrÑûÙ8;Ï]ú•GBªÙlÇæZŸ\â¿ZbKm¤‰­¢ÑO¡¶ vß.Ö·I,æ :"ùÌÈ~È™®¯r>¶‘ÃÒ²òÖ¦¢­ŒFÉâÐl¥m´{¥CÕ ¹L¿oÛ¹´ãßkÿŸÎû ×úŽê*ôœùz­q¨\Ÿfýo=Osfê{¦s‘×üþxý–öz¨un¿_oÕ>ËzÎ#ð^UÒø4ÃÄßÐóuY«ê e‰\‘ ½ÅŽ »¾±·Ì³žíçcNí§ ½G¡6X ¯»¬ð~>5ºæÛÖúèeÞÜ̯e7CÁØkçéyim{Å|’´ðB’¾²').Š¡»±“]–ÂNä˜ôB²˜§¹Nà&)ËQQ±8¦)q‚ëJƒ/RÇ$?-ÌÆ³ôŸ ÔÖä3<ŠZfWÿÿƒïÎGk¨0ù3> þP`ÀïU„Ë_j a¯¡.ªP¨©Š¬°À~ôüYBª¨ŠPõ’õOÂÉ’Úi¹œ¥¦¸ Õ¥PBR%«ä’`ÔYâ>s¿ezãS›>{ù¼sÏA~(¯³ÒÒ‡ÀB”pŨFjš¢flá7媺©YDKá í® Ì.óHú.EJ©E—¥ ÎŒOM‚;2j›Ú™˜9¥3Hü$©0yÓ”¼`f9oì»Ø¦›!¦(ñ ‡ "¬fKC¨ÉQ‡^™ze´[ R£€d6l3[0éܬóÌ“^n™NYÑQ-XÑ# AɇRå¤IøYäÜvôlhÊEmTô‰)mBD¹4œË&náWýDÀ€ËùLÔQa¹aŒ±õh¤¸ÊøØ oˆ¹ù$?[PvLÇž¶ó8~púóŽ'áFzr&÷`*T¨³"mÆJ!Ðz:Sw ‚ë:ä©Ü¶Æ.*]\;•ö6m긜„ C‰¸H4±õÕµJÎ^Ï3` '#v2ÛP_¹Á5XØf —\#_x °VE™t ØAÑ‚)a. äådT¤1@2!H³f‰*bÊõÇ]¦/ìÚò!ÿ!áÖ¥­C%qË™ñë¡ÿ6ÞQäzÐX¾áuÿ±ÓŽÙ("¨J•ÔqêJ𰛊ù4!Ï(®°‘²‚ƒž3Α~%ïç¢\¾†)•NŒ•MÙXv8×y~¤MŽøÜöY-%-•è0á¾ÎØïdÎs=ÇÙ›K_½¦Þk-Í ú3kð EXÞWG‹µmûІ¹nrýÐË8[»Œ¶]’…#‡<‰Ø3³ùmö±¼b½‹›˜ØÁ;¥ÁŽÚ0 ¬GïNEl——{óTΓûøaDøYü!J¢uÁŸ-‹ò ª~0ÿÁf¤“fñÛ÷½_ïõtãš0yÐJÌHÑ„õE¾n¿r=Œ*:T &õ0¢ø÷ùúÍìÖ f.‘QíZpA¶N‹"9ÉóT!*®¢v˜@” "D°ãYÔ¶ýKÃ ß îc8U"9„ÓìËÞOÛƒ8 ¸áh`ÔDBÓ*b™öò±h—¼²ãÖMTcn’×tºßîóÔ[P"’’ÉQ[ê3íà#ü(ú/×^§ršx¨ÑfgÀl†ž†Ñ`F>€Ïž¨òZˆ WÐU°—u0ÀÓ.’ã ›#Û*’…Å+y*œ¢Q%¨½!'¸I28åÍ‹ª²µüÉjׯ¹¶’±‡Ëä¼ñŸ²""ò’˜”™Á%0P€¸14n8B¨BB)ÐY)[ÅVeDž1–ŸDÇÙRŒˆIL€F^ÊÛ=Q»ÆwÞ É”œùÍ|º<ê̱†%u Û«¾¸¥iªlÆ>ÉîE¾J*(”ZgÅBu°c¥8ÚÞµÖ´yç©k?ï¯^R@ˆ„D´EE“{ÏWÙZUöã¾UÝõ:\S¶˜vå—W~Ú:﹜mt¾n#€ÎNæZ;lئï›Þ ø 2Ш…`† ^AȨ{€²ÝfMs.›.Éä‚NæbqµØn*Z9d(SéØò`B牄Aê-"Æ…ªÑ½ô %ú‹ôšsïLý(3*¥Üo_|á¬à #óDÇÖõì8Ó+¶`ívŠ«Ã¬PU‡¡>¼Ð‡XbiFX¿ú`“ÖŽ(fl1ZrœmÄ’ÃÍHWaѳÏ45"Ž$¡ûTÍé}ìQœ%;¶mº–XnJa,ˆîZ¯ûù±æ> 37Œ˜Féx-ÎcbÉ(wΑ;\œ”ú]†<\p·K†б÷©M\‚Íä ë«`FS=Ç´(£CÈbU<©N&W3! –VílËâ+°[©ÁŠžT$HuP¨1O£Ÿ›ë‚3ä„à·>hÂOÀ©òبc²”Ù,í"a윯ø^Lß]{3Y U¹[R]²=‘sCµ¬³Ë¥RàøÅ4Œü¸[;W• FÇ?×Ì¿`‰š|êgÙ½‡Ð Ö™Ã:#´ÁìÒRùÒŠ™0-Ùë 5šmªV…b+òÔá,1`•Á«ÉnÖïqlæFv~ÂKã3",¦¡446Ë\IÙÀÕÚg0‚4Ø"SÍš´Œ?É\ñTëU4°%9œådïVÎOüxE?"Eá©…Æ–…«Š›!ÒW×®å\ל“N°”ŠJRÓíhΞ$W@ÄÒ)-öBÌuZz›hº³òI{ÿì×–/ezïúkü«ñÆrt»‹`JÅUH0Š+ɻȋf*©Á–¡«`Jú´%^(SÒzNï [òf¬…DÈ‹´®âšÖ.¶@Šh$oOHߥe]Äg4ÉDSK!К9·¥D(]â!E:‚±vZ"…B±‰ž¬•¤R”„Ô0EÐËP€NTG§@ˆö )¤ÂRTW( +À$4BÈPœÉ:ÄŠ  UaÕfEɸcâJb²#@ˆ®TuX¨Êé@T#½iNŸ­NT:–’ð®|å½ÂCÔÞ'Ö¦R Ò¤2À¸æ- ©bÊéwà!®¤€¢À0Õš¸šä‚C`£"X€P…WÖŠë¸ C˜(>• ž ; ÉŠ ™8âQ$ÜáI°‚-& `‘Œgpš§u%ˆd '=J…!"À( ˆb F=H@;-ëf:EèÑo] /´àûì˜ ó0«©ÚŽu(r.*jÇ›¾ÊÅÐ !j@iG2™#•T)¢;º#D²´F ’ˆ" (’¸ÅQ´á5`We iGTÝ›&$,Ñè)ùÈ#Ž1š¨„xM à@8X€r” µ@¡¬‘\V6D‚bT„«àŸ5z»ëÅþ‘Ýz›Eç>ÞÝÏÏæß'M|ê -1†š@Å‘<¢#k¢U«Dã,ëwbåÅ}4KwÒ²>³Ÿ‡>AQÚ•:à´FÄ„ìò—z¡ BL}p¶/žp÷]ûhTËG§êngÉÖ˜/S¹ |äJ˜Æ}=:ÏÓTsY½=e¸%}ql*íyý°¯¾×^Ž×u/³À–¤^Z~þ©·ùGÔ?~™Ÿ s>ëqN°Tyÿ~ü ±îsý“ÙüR÷qvleÞññ!5tÝ”Ÿ=–§÷Â~ÕC«-‘”D1š:Ñ!&yôU[©J­ëô¿ÐkDÍó>©ïmºÿÆG7ëó¹ÏEšÍæ,Vs?“\}KéœÝ‘W¥Ð{²Ý¥š8†œdÂMkj ˆ³käy­I¯ä‚:ý¹_A=ЮH¯þëÏ2}û Þq¯Qõ›¢áD#Sö¡¢öt©ZdêÑEÂÄ-¿„‘'–âß‘[|‘Ë„ØCù”Ú5]29ž ).òA¶Ç[ ÓâDÇFïˆ@ÔU¶IX"+¢Ð£'ˆçÝ‹%MgâJ/¡2FvúVnÙByZø®ýˆ3’;Ý´@—œÑ~®4­°Ù4h¯ ×kÔƒ's\””‚øq…Ô‚’[r*É@~ š6šn(°HfÇÌæ\Ü_ h»ðO¾r—Ííg6ßÑZŽ«zÕ€ï{DTÐvĵyb|h«¢ PH§ ; ‹Mi xøåÕx}\Ï?ZÌŽt°²Å8bWñZ‚3Ó#Ó p9¥´ä[I¾«)¨@òyЉsuÀ2Gô€¥Å©èy' ±^Mˆ†IƒAr¦&ÕÆiîßÎæªÙB ÅB±!‰Œur¼×mÈ =•–b­F.‹;¾}‚”D'J•ÃqH¼ÈŠ”bG‚§¤gšA*.ºÆU%^S ,T%è8ÔÓk U)¡“%9L¹ã™!ê¹ZÅ*9–j±šØJpíÚ1&PAÊ×½lß‹?DGúRµ†–ãØt« j™Y™åìÎây%Á´kÒIõè#¯A•Z'—ŸûíÆó¥Ï9½á€üyè%•—Ç*A”êùw¸¿íj)äОOø7þ½9Â1*T€b ÏÂoú¿Ñryé¹ojŠL×iðç>ÏœfrÐÇ(=îѬb‡a“øŠWt^‘”D׈ãézd«ðÑZ²k à ‚ÇA{hï×΋<_¡Û;2µºts4‡–:?ëúó6¼»™·p"~+x~oÜJ¯U³‡'õ>¶±~²&5¹›Ž4úäê”3ælxîâ­3æéóyÆÜu!u{íýÌ•.q3©h’u²câ2ªIÅÈâ»ìzJÕ §æBònú8óñ+E$?ØWñUXØ#,@à‘d}3bΆŜ”QàÌîø¶jÁÆpüûònRÏÌ¿=Ÿ¦þ(© cÔfM­5·ÙÔk¿Æ{TKÆ  Hy´”£– vmÿh¯M‘7€Çôé@v¢.ì"_`B¢O¥% (â¡a!I $h¼Tºz‡}?\ç«íŸµéúšŠÐÔ‘aSBŠ•‚Ø!æØÓÄt'{»êX(øK±þ¶¯±G6­4áÆ•S4ÞÈ^E®{ìê¨hPÈ¢MÖ "6;Ì’÷›óQ ’æx5Õ•>æ#R梒Ô„¾ƒ¡7Ç ÞÒ^A5þ¸­ÓÆLèí«NF=ú)?3","¬b`å€e  ÷a”¦(‰ªZ^„Ò¨mé¤ö¶Ö£‰® Z6`FØ#SUÕ ‚ etaQ¿û8¦Z÷L£›âB‰àFb˜uTºUé{ˆÍ(h׬Ms•Õ¼Á•×+ùc–Bo/é~¶®¯[¢¡%ïÓ¤S¤wÞãÞp¾ý°\k× JØnR§¿´ßé½¹Vÿy[?ÓS÷œ›×ÆŽ‹ûÜ’Ë:†ßæÒhçhÞÈÎâþ•k³ç]âmM>ß›nÁ½­Æ®_êãDž)ºW ²u ôEè«©zx-éö5*&¼*oÔá]0‡ÿUÚci½»•ÔJ‹]Ù¬êqÒ-•=”IzÂVᯢ¿u>À¾|Ä>Ùê¥ÐYYDââ7ÈYiKï}]tó kÒ‘`*—©¶=·‘—ã ùh…2ÕAC>%ݯâ5|_8…O]Ãä•…Z‹íˆIœ ®çõÂЀí!ØQâ÷‹Fˆÿ1s2”èÐm%^ ïdüàîYHsé_Ékdz´)lºM¤Éó¨‘ "Yfuœ¡(8ĶÇ1N”Pܰ¬ÛEz“beÃ’3õB€Ýˆ®aögí!*/ù†¦ç·(诱1ŸØ÷Ä7àü œÁ©&7Ù”­fëf3sã²hý«¾ÌxiÒ‹¸f‘‘%aŒÅ³›¿Wr<-Ãö,Å/ï/òÊ7ŒqÃøž®u¬³&ß•þwº¸±«æ»xœje“¹o0M“]–ä–1=»“n“ C‰J” ò€ãPáÎV8O*Í5±ã›d2ÏÊ®9z¯M“Yƒ¨¸¸®Ï­çGã.zG‹Nƒ_uª‰¿­­[î}8únгGÓGNnâÖú¸ƒo`Ÿ÷Ÿ~,ì}€é¡õoüÒ‰kúçåè0£µo÷‹úáhC¶^DFá)¬žaŽ!Ka<•µÕ=•b2Ù‘È ‡K€‘¨š •"d‚h^ª:BP˜k чÀxÏE×½ò°­uß—­§ö,v÷_ãì‘êttJV%~9ç;¸É= ¬­c2m½1Ø»q~²ìd{›ÓbЬK$û½ßA:±eÆÂL¹é(«sdךa³‹eÒÌ—P f{'ºìˆ0)æŠô‚P±ö°B"ât ljwŸŠCÔÑp­[‰Ô7s<¶9ÕiZ—O‚¥ª…•³®¡Ú\¶äjŽ×s&µó‚gÕÎaM0«“ô23¬—xÌéð5XCÛìâµÏlÛûÔŠðMÙ a›K&HK eˆÛ2Í2ÑMî`žP¢!~+×±) '¨Ñ³@zŽ;\3ñÈódÝjî™°[ïø'^|Ó•ÍcœÙ,5®ŸØyôÑÕ±ÊíTuÝ1O¯l®8Ú?¯¾Þ§ññ³nåk±Yù¸ÕwìªI™"z6µu™WýãgÝɳ‰>¹dl"÷³š­© |2Z©6«÷V•$竊ŚyÈœËõm[sUW0Å]uqº’•ÈjÕ´‘¦¨Ž2†eG“•pQ*6"½ÐÁcJ%“µ¹žÄò.F§µQ¶ÖYÚX¥ÃÄìWDÂÝhZP6²7ŒúÙÓš•a¯º©Œäɨ‚ OÂI§ÿkrB¦ˆ*æ;%2ÊgaDQ}¿ßìËhïIõ®²¹Yš/άlt®hÎè…øRž”ÊPS•’qúHÍî ÛrepÁ~Á»ºþ1ðÚí×'¸<*@±*N4Ž÷XWj×ÕæﵪWyŸGzˆß^¯àíZÒ¨°(¢Juµ±T‹~]]5fF’‚+rŽì|/zŪ…±â1˜ ‰ïc}¤\Wñü¶9o<‡J<€ã%@÷QŽ*S-åÄ Î—*96X‘E¨'Óy/ÿáë' ,ÌúeUˆá:(Ö!6žËt¼ÞþõÑïçØÉW–x>NH>ß)}Èü‹þ[!³2µÚª…îh 7}dÞw8&ä!WKH4§gy×gÎåÍ.[Þ8ľê-w UÝÜ &S(0Ä (ìîuv¡Û&£+Ò¯Ü7Μ O‹ñÕL¥}kôPÞ-f¸ÈTÏ&ëZ¼±%N$õC¦†a i>‹±îʰsÔ*†ì)»†b·RÉ®cIk£%NH prWEzKPèssÇ]•l9‘ì'ÖŒÌ.†q\4’±âûô§š×ý ÇxÜÁ$#Ciw+é§ìÎËݤ ^ÚjóÞJÂÔ¶ìº4æ•ÕHdùC4MH¢HT j× e6K™O™‚”ÌÌXÊ­,dz»ŽQU—Òcòãwt^âñ€èëy8.Ïêv*¿ÍÞ½ý´£ A€@e¸WEsv°¶_(ïPwA„º#-,O WñÂ:¿þÛuý¿_<Ô~¦x:øœeRe—CÈÑs}ìõÕotgm¾ÆÒ Oø>1™öz!ó6÷Æ«ÅPRr(û‰zË9€-‹*Âíic¨ÜÎ ê5ämÞßP(m¶“kGžæ˜õ¹„†±~·f†‹5 e šÍd!,bû¥èk¶Ú-ä‹wWÀÖ½¹À)énÔ«†ÝRÕ–ú½V)Ä!6„ÐF­ DCO7Ó$ý«”´ muZ=6¢”‹íB¢Pd‹;bj©‰ Z/ತ$T<Ä”h:j.&ËFšïÝ]àÎ.I}`ÕÁ~îUÕ|°27T„Yª +`-¦ƒ Tº6Ü™X@@ÉC¸;í’ŽJ#íÎiç´}$oÓ•ºâyÁžw òe…àXQLÆ„”MÛ°êœ 'Mþ9˜È?RÞ ¤!?†ÀC²áuÑØŸ&½t(§¦{Lv‚9³‚„ŠìˆwI²žÙæævUrÐ3/¹imx„Z18±´-cËÍÕUìÕ»‹ fDýH²o¥·½¹Î¢¿…t­ý”½Vú6ìr%[Yü–9¤ˆÄéƒøZ½ŸEü@˜É Ì£ö 7¿ó§áù†Ïóô*;:Å4z]|›ß»ü¸àyF~;ò¢Qß§Ÿx \£¤®á=à$§A v¨^®OQ: å™×Ti\ô1|ss} ‡öý`ò9·yâ\m?ϼŠ>z|˜UѯTŸ™º2*A4ÈŠk³ùнÈë~š,•B@m»Óõí½k/`ê ¯¤U)ÌD¬ßf]È…]П+ÑCbñ[V5ñQ ›äêeHÅ‚p‰ˆXDP)b ùìm³Î@.!%Û7x¢6u*à@6¬ˆŠâÖVŠz.ˆ-%Ã5”Òè›#2k®É‹cîMlñ± r”):e‚Ümê2 Ìî±-4¶BG©üMPÛÙƒ~ÜE‰r*aoö,ÓÐâ›7Èdhz;)´ø,ž©…š,GZ„D¸XÎT&i <í ¡x𑘒Á“¬-«¸,#päÈ…!ŽZ(ÕWn€èî§ÍY7}ܧ§™–ãÔƒð* EY.¸Ç½»A³­ÎÊD)„ÒA£ÔQ“ÈÇ$¦s`™‚Aj­éˆO½N}b­zFNÊô:7n‚<ˆÄjpmèaÏѰ•R×8 7öizp³šµàŸoÜ_Írµ,¡9Ë%Û!§O ñTã=Ž^ÖѹíæU×sÚøºæìÍ …§BtÕl´óBïS@èUÅ‹À‰bÚ|Ó®5­ZP(€òS»ø5NÂß&°¼¹7bX +Ö¬¬‰ô¤ˆh»šÑh²ä ÷écS·-Ù2úKsËdi³ÅLŒ,Lq–µ¯ávóÌEùnÍsÔŠÜI¯uRÑê*RÓmF´Še½oþ ì)šÙ@)š0•;‚öÃTÙOâ ïœJ÷k <êÇ 7F& ànÓ†c›}ù“3Ût÷ª_Ùâ`pg|=Uëñ|â} Þt¨ÌÔØ†Ž<^¤ëOA™ˆ©B»sDƒón÷d¡ÏŠ€]VÎ*Z̤‚íýƒk^[#mq²[MT{]9D’C#lÈÚ›Vˆ.v—Ÿä¹c뤂ñ/ø™âàaGíjÀS”g±dkýÆÔ:G›ŽÛ&üAïa-(* €DB¤¸u):­Ñ0.Öè:—T—C¿ë‚Hs©ÁÖä€Oå·#ðˆÝi$¢î£7I‹ŸŽx-rÔn¬qÅ£­Õ¥ÁDÞ0ñ`us(Ìæ…pR›Æd;,V Û.èé3zô¹ 35äB;… ¡;`¬3î±uüÔɳEÓèÇ7Òï&ò¶F—ì<*¸›ÛG…{ñÜ‰ÙØêúôæºûßönÐ`ºÿÜ–ê»;)p9LJSæ×ͺ¼ºÔnaÙÐÜ„•)Mæ·Ü¿ŠŒcœÅ¼Ôøvï)~n ߤ1ºb£{ VèUÌñE|}¡‡÷‰pÊ]Wº7ùIÊä¼–×~îcú$;Q"ÓñqÎeu´ŽOx¾’ϬŽN­‚“RVëö°Ï¶Y÷ÀkìqhQˆå” £Õow}Æl[ÙÔ줾´0½ŒžR—ЋˆØn¬Î0”izE¢Ì êœ`i³Ì“«Lrݨµ™[——Oi$ŽýH®(Ô^{ƒ¥3›`¯Yùk¦¢±´ÆyARþ88;5bL£†¬”òÖÀn+,‚(Lå֘ȴÐvVr<ˆ¦oÅ+òÛÙŒ:C"]ºŽKÞßú¨Äº¢1×5T™èBF›–›BÚ5 [ºS @@r©_Яأ¯O †wE­Å–$'»)mYý¸®|b»F!ò`©(“…i:¤ f†©T¡ )óŒloó˜J·g%õr)Öt–ÓÎ,Ò] ÒÝðÛÊï:ÌQ*÷/ÊJ´eh“ÌîÖž[ ©ýòcäǺ”V[P$—VûžÕå­Pk^>Ôs]I׿%·&«Y¦-K&NXcÊ) „±3 +­ÃJj°Érå­¼àœ?þB¬ÖÔr 5AõÊE¤8ÀðÊ“Ã@NNä…õ¦¸ÛX\¤0Ò³•Ð^Ã9ùù$‰gÐvaÑeÄӉȺä|ßnNýVtŸÖŸtœ…¥S?é+ŠÏœ4x¬g¹a¼5s`VmZ”adèw)÷½úqÁ=ðÒùB»P«[fTÖpE¥ö›ìFã]Ý9ŠËúއšnº 8áyI—Ø…—ˆU*ÛÀdÄÎÈ&8K$77€(JTÔbUÅ'd Õ¦„Â,z±ŸÁÏÌç‹<ÄÍC2Å)¥¥w ‰@™ä)H°ˆB%€ µ‘h‰E C °;±XšªH„Z²¯ñv¼\á><Ú}†îhÏq<¦¬–ª9å’8Q‰ƒJÀSãÂ0¨&‚$VSÇ},‘î0äFDL…à èbwPs  PPsI4ªÃ„@€F@"Åš‡¸rµA‚ -Aƒb+Ò±‰ˆµ/!"‚B¼#úWd…š£6‡vü =á1üŠÌeHÔV¯Û6M@yäÆÉíÐRŸ&î‹»æªSM,j/@6€TZISô8Fƒ)"ñ;HR "‹(XÈÊV1êÑPõ" Wq„; N¸šê¼²T‰"á•7öjP‘xaeê¡@lSÖ0)‰YB‹€±‡RH m–IÄ&T 8›ÌÍí"•Îöm¦ZÒ¹âÉë¥àÎI?®VíàŸsmtÖŸûGóxÐþBNQ6õåš m"T1èÊHBTh‘*á£0¾$­¤âÖÁÇãn¿Ùùü*ÈqÏ@‡7XCKßd‡ì8CÓ­^÷¦Û!Ó,­&låcˆÈä4ìP™-,L± N =Emut?¨ßô}›Æ©R؃He`ïÎ^=Ø·ÏŸ'}%<é›[=·š¬ïyy4=q—³f§À¡ÂŸº·xGÿb=c·}üš^wüzê<-,ù~ÛÞLwĺ=WÒ /½»f“þÌmùÜ陇;G÷uHµ¼O†D|«q¶ÃãáŽe7KË'¹F°kÚØp¼2#QÕÆ-ʇ6/þBŠãÝ;Õr‚_’ÂiQï yµÐÛ˜ù›mP§âZJR3’bvÞOnb޼ݺ7å-ËîBª VW¸8/JáYîg¾JíñE|(¤Bö2¤úDxd‘<ш4éÍq¨ ”þÖ`+»‡Èôáu£³ 3/ÌÉ©Ôé#õ,ó0¬aPjûãspåƒ4´íºmõp»3½´ZÀ$B‘ ÀÊAWfªHöDˆq"¯XTQº‡Ô€>&áv­KJždÝyXñ1xÑäjÊá–侬×qJÛ@* €Àíî“ãÉJ+ê¤)*ËEá -8!§ªY:`4PÀú×ÿÐî+òãÚZ×%Ñ›k²¢Yó¦é𱫬TC²"léÇ¡ñ¼»åÛõ¹ê¯DÑe]¼¦¯»¾OÖ½º¸—ÝËÁ‹(Ï3›eñ÷ÝTQäY÷+7ôUòto¬K¶º‘™SEICiëV/’›ÖY(\sØEV0XE)ƒ:"SlÐÙ&´¢¢ffÔeÃ:#2éPè¸Mv ­&ŠØ¬†%¸Í‚¶E¢;@£'²ž®¹S`™µ9ÜYX{Rd.&ÑKˆJ uã& „jS`;¬åD ÖBÚF,2 QÖF¬á\]‰dZ£¡<‰„²õÁð ]ísuR>6!Eí<ò¬Ösæ¯T#Ѐة¯b,V‚‘J ™€k Æô;¥‹_¸cœºÖ{MLw¦1v-CRН¦Ø…z¼qˆrÔL…;~æø¨x‡ÝåyJÎ0èÅ2‰}j,IÆS¸¯µ€LPB†ë¡ÛT^9 W°Öbl\ÑQ¸*† OCŘmƒÛŒ€x¢Uñ $!uYŸ ˜ÐŒ>*#øÈTªqýaØùpôxRÖ ƒ¸í¶ú —๒0Q´I{ðŠ#Õ¯ýÉÜ;ÿáØïº/ó.¸®{ù;ˆaŒ!Ïà¦ÖaZd.3šZ›ÙQâÓeèµg‘'Ÿk´:Ž<6µ,œ„Ihõd‰:FÏÍ(§×ýS0m2Gýþ>×|{DZÔ%ùaúÅÜ‹)ݺݲ«ç¿Ó.ÛkEFXåSYÚ§Uwÿ|“¯O6¿Ü9+™gô\[ë<Ò6¨ûP¥ã»“Ç\÷ä8ïèéê·™&Ó¨‰LÃóŽvJ[¼ôõŽÌ:DMˆ25¯5ê¬íÆÿ…žæºey¼À…s§>8®×“q¸nä©3{$ÈÄ+ÖxKQq„¸ÑV¿„¿À;¯5û£°XĈÅc%oïÕ®¥_Ì*FSkÕhUhì#°`ã•!ò5ï bÂuÕ… pcûœ0±óþ ïåqëã_E²£’¦p ¦¸Åu®æÌRJfx±Ù—€T3hΑqˆ,ÑóT36«”º[¥ u}6“˜È…KA/ÆéŠvŽqŽÓSnÞÍÔä¡g8N.™£\ Œ¬t¥ÈC~Ç X …Y‰%ßÕÓ®VV•­¤MJùÒjYUq6ùë1¯¥… ±2!‰â1B$êd¡…€Š2„Òt CÅ–ºT·“"®s:zl«~V?ì_§Ç~ߺïhÏ$á©&9û™åï\=©sªíVšÐÙá'¯~o-}hòí‚2#qš8€a[¡‘¸?Ã"Rõfï±(ÐÈ3M0@Ä¿Þs‡Ü'¯ÜZoEõ®dÇEž¤õ­ö«°HŠÈPøT?Œ®ÎÊFÑZdFãpMM\æuêŠHnÌ LC¿¦wÒÑg%¿¾±í¡ÖBü1ºÃ¨E´ÕaÂà0ÏÌ¿ªð©%ÛHrûtëÎëíûä#caF\ÓÏ ÍÒíêçrü<½Î²o@{£Ül:ðCdÛ>„1ÿØÙï~þÝøEäÛ-6ß㯿2v]^c`ç÷ƪSIµyŸ¯Àæ´íØ* é¥ô0vûT÷³þã55ûho06lш±Éˆ—°vïíŸ_Z¹°Ÿ;a5ñxÇ ÚÃªÔÆfõ–/Ó;2£³ÍW£Å¤rë" ÿø>ˆZ_v ®?møPðp~sfLÿ–¢A5À·PæÏìõ{‘ñ§<£Ýl¢—-°mÙ¶!‹ Å[+"à ¹Ž|A·ýÈ×3 Ý%R×f…qÙOÄ\g¾ž ª(€5¼ßUWòof©ºÛœ–QFsY«Ã=ÿÔYýÚˆÇüšÅÐaÐQS ghMىȠ§§¢H©‡öH‚$/éó¢|{¸9Jº¬^ ¾ð,UÀž &]Â$Z1‰(x”›WG#'Á[ô–_Ì€…«£8"×Û][lz¼<ÐH¨(“è­’Ôn¥bqe4ì(UWúˆÁ6'?Ãïu¨A<œìƒÁô^_3þÔxýYhçÔØ¹x›×2_–(Ïz%t-¢ågvd£\¦Âß’Ö"е«–&úïtoM ¢¶öe[Ï‘'”Ðq6±|ª£L „ãÚM)ˆF¸ÅéÜЦ½°Óòï1þmý_Ö!7šB-¸  C]ÂX]ç”k1ê:ž{Ü‚cƒªƒ«I4æ-õO…M)#f½q×Âqp!˜oØ—î£+†‚r]…~~ÕE}—¨€‰zÜëöP4;‹(³Ã‘\e\Y¹Û½ÉÝDçh,Uˆ·4‹ÖÇ: Œm…>nƒƒˆ½´#8a‘,‰0ƒÒéÛNli¯&ææ”Àv§,?žnÓk„÷qð\…A=}pF:¨‘8]‘#K}n_Iȹ! (¤eoêŒÚ>¥$ÏëÎվ޷5Ò¸ǸUê“ïéÊö>&6t˜ MÕ^gJá·Ccä¼'oÀ¼iPȰÂPŸØîͳ€ÊöÌ{MÒ§Üg«QètgŒ ¹ãóêN´ÅNÍÖó0Qí +Š¡ ¶·ó³4ß^¢¦H)Ž]C ¹È^ÁÜûò /›ó/?ÏcmRHÙÚ±õÐÕ†W‡»g!ÿµN”ß<;¹ý@î½z¿4+´4W)º–%öìzaPýþrvzÕÅ+ã™ÕÍJÍר…ÚÎ’öÆg°c¹úˆKWµ‘µY¥c%6É…C|שÔOÓ7¼þ\›+÷yc=^xߎ@‘éê%80“³ £ŸlFwÕÍÅ#l'äLPÑð¢vÕq°£hÁÑBpz¢Öy…¥,d°€IÕIÎäÀ/\ß©IzåZb5;yÍ žrÓ§šW£T– Û„'UUa«¹ˆ–%¦ªG)÷µþÉ’«R0º‹¼Ïì®ý/7O™£†ìN¬ Z?hÑ”5b»?°Ù®ç˜DÍ«ŒÕÎ3îDÀ 4j ýYÝ”ýHû5‘˜ÖL‡=ûv£Š:œ]Æ,-W*o0CJØ2¥\…ûÃJÁùæjɘ‡´ÆR²¥FŠ™œ"U’I¢$"Œ£œ?Ϭ>ž½ùF¯ñqñƒäîh ÖÖy˜5Õiᢠ€( !#(’“j„’œ±$"q$Рē’è‰'ún™ ´©%w5]1¨Ä-; 2w刑–Ð*I'ÅŒ¾Þ¨ü„#-*€BSb$€“ÈDHÈ !R",ÜXS« ºQwP S1>¹‰))LŒñÅ SQ‘ÕDƒÊ‰ p"jX4Å ‘B„ëX¢h„@ã-FУ‘ö(B ‘DÅWÂâŠ\ Å5¯ :"RlYÔg@E• ¥“=²•i“™IÙí‘J÷™V-®žmOTÉ«ì£Æ.Kòiôƒu·¶,LN½´ ÈòF[í¬au¸õ5‘þE»‰¯BÐXɃ,¼MØŒ»LÜ;¡fÏÓmº¨¿Œéô#Ï‚µ?£FšUµïI’&1´ð mÐ$Ž,sb阖'ÅGædûjTlÔ¶­;)'â8Co²6GK–ºÆf3ZQ?àT8•xªÔ|NïÎïB§8–ŸG{MÓx‡ÛÒÐA[$*[Û΃¥ÜEH˜ÀI2MÛÂU@Î(Å% dÚÁÐ6½¦>w0sìƒ%vw´–+ÈîFý^Ú¯9¼ç–¶üå·fü—û§ãã¯îy1²PImTÕ$"`XmPP`NLú#D‡$“Áq‡Ó*J¬E·Òn©r^Öÿ(?k,O `T½W»«¾r›Rä[&us}0εŠWꎤ´Ô×ÞȽÊWÄì¼r=Cf’”vÍ׿ÅÙ¯ÖÿRûækѺ\]þÞÅt1¥8jùy¶ŠŠl¹Åíú§ªY̳|NçúY%Ò§õà © £’'&„Œa!%ºò›>•¬ÜØn¢ó~„Ñ¿ÔÆ“ZpI(’ i 7r+øxF/Û¸IfÉ ëÓ8W‰IÀÆÏfˆ¤ û•nÐJ;–à µLÛX‹ iœTižò\Òx­£qUVgpµñ‡çÔìǧ@YŒ—XÖ©óa ±\w|(¡P ‘ ªWçç°J·.€°† V(‘u¬VÞ j0Dâ. `ÁbzÚ§äØÍéÃáŽÿhñ|w‡*fýÓZ»†·³);…+p0+Ô+tÊrèn¾¯ò×m¿¹øo¾Çï ­ARÒE>^¸e|× „YXHxI,„7a5M1ä+,i­KIæ ׎Ʉf#¿À™U‰ qMøa ¬%fWØ+Qê1ÆÃÝ~´÷ñçæ¹æéž÷I9¯Ÿ¼¼Ïós¿ÿâÜáŒs˜¢ "Êé‹ãýW—篟Ÿ??Ïùã«ý=ßñ½°BŒ@+ÉÕJ(ÕTšb<„jAªSaìèÙ2­GDªQç©ú˜ n‚%Xéî4< ÿpÞï>yÂ_#¯g©k(}²%õ»ÂC„4>âcáu‚$Nª+åâÑ™½>mÜÂ’PN ü­t×9ÏC¦Ø‰A¯œ„ñgÙ;Þ—h‰“÷9F»äµÜ3jVÁ{šúh‚ŸãÜ ¯}›ôñ^Sþöä·æŠc¾Ç¨©­» nqG®½A)?r|ìkbº>+({•\-¤Ê–z´S&%î]NI{t3ÝÇí8Њk¾ºœâÞºƒfZ´$‹×¯)—®n;úö§é…¯“xHǺ,á-\å×§¼˜p €uHpƒÑ®–Î{<µ "r±9]Ãn7+×lBSfœõJ š6óþYï ×:Ö8`¦6JK8—9-רÞ+Ôç.Núð­Ô˜ûªÆs=/Ôå*¡­eγzÒÓÙ$µÖKö°äƒÔÞóó±Ö¨–,ŽÕÀ·§p˜o¥bãG|CÏoñ8Ê4ZäÚ†Bs&Ó¬LABÒp}˜“ä£ JL9ɦ^ÓAGX$=Ê ¸îñ«Oå‰ÎJ: _à¶ðÀhGÓw¤Q^4g¥‡ó{ðB3bŒ¢(äD„ K#'²©uÆ,ãZ-òÞ·Ú£NõïÅ#›`«|­»ü°ø>.\þ:«ˆ Ï£™Aÿy1R©PW—CaÜã,å®V5_+rÆ.°Žx\Ê5s…=Ý‹c°‚ÅZsÖ×¹¡p àuòœ± …«;­£­­¾ˆ¬æŸïrRìói÷ÐÅ’Ä4ôF'F·jî3d§J“+Ô…t@Œ ÂyeWN÷ûæÖ){tt·wëþªký ­™€6'†ìô|ë@á ·gfr´’ÒÇB(}#CzË‘˜²—c‘i¡ªR½Æ£Ý^¶\gO„o2³³þòÉ´°yaûÕÌ~ü¯5¥Ï@ìDA‚ÑmJ¯yÕë½}Ö©T7s¶ô¡zƒÀXçñ•\ ±d¥+<£óÛõ$¶‘—#¾]4ŠÆ±C‘ÂøH.¼Ù?Ë߯¢ÒOc*OUA‹šÍ âŠb7 ‹`1)Ô)W± :¶îf”6é,଑½pë7âêkêô¢sÎ%uÍ%4,±Ù*]ã·û§ ³“ù¸£û…zz\éªÚã^_7y^B)Þî³’íA:À6ÆÂºSœU:Œ°´»éÞµþœ@¡ËµcW…W^ùxšÉ§ŽJ ȸj’ - YÅÃc8q7¡ŠbI”^_ì×m…·ÚZѽ=¹µ­AIš›H\ÈWg;šãÕivq¥p³~××Úytº­¯Èè¤ëó÷£K/:Ÿ+Ð?V’P¹â…97•5)×ÖmAþÒä¢}s×àÎt……8 šz=ï«LG÷RÈúÝ+33˜£>)“æQïp<ø‚¼ÿ,…ûÂcf5HÏñ|\7¯τӉ„lgY»¾¢¬tY‘„‡O^be/SD+.ÒÎHØXC#þ z}ЉîNEÑ2Ët­Öì„>a¶¯­J…ÀH-*dÎx]T,6âíªxÃixÏž˜“ò.ÂßvÍh#¬™aÝpbt– 2/ƒ¢È òôC¨’`J{nŒ£óXâOÍ”’x(Ë(¡ÔòIqÕ*‚¹T §E!¸Š|˜"QÆ*AŠÛ¦͆€ b¸œ&Ïv8š ¢I%0¤DâórK½±ÆªèBnùÛʬ¦F¿÷ó‡òPa'n`b.ê³Q†<ä" *!x•ÙQžº "\&Oµ~bc‘ˆ “‰œA¹ôU†¬J¯%‚±%†±:`É,‰³%¸cƒÍ‚pâ‰?ŠÊ(_ p!w°F`à F€±TXÄ„4׌¢q¨\ĘX)KOì ÔFÙ+ã̾µ!&\yò&ÓW")ºÚo«£„̶u`A Î b¸â-Ž£¶’ìò@plS‚–ªŠGœD·€¥Ôt¼Þ€ =ˆÄ“ &– %PV$õ!K G"‡£øUh"ê,—kHW|ÑÕQIìÂ"·dŽ °…kî!Q)pD•]¼x“MuªRIöÜu5r÷Lýœ](˜§M›âW½»9ŸÞ í¥üÅ<Ÿ»µ¥¿Õ¨W‚“0¥nm1=Ïk¸èüè½ÃºßÞ_ëõ³¥½¿Î}ýf&µj3Á:tð)–_‹£Ý`ŸPPµ>ˆ‹vð•©#‘‹¨<% g9¼÷½^‡ûneÊ“]t0„ d”0vDoÂCª<Ѱ·#XŒ² D5s¶|°{Û[OšóTm+¤·äÆdfÜ®”4Rˆ8äÞÀ7ëɸ m˜Œ{Òö'|ù“»rõê¨q4Üy¶Ÿ…æ×ô%²Ÿ%+5EÎS(J¥ "„ûK¾·{Tg¦Mõ3w–yü,QM›~Q&EN“ÛÿÕ·üÿœM žR÷ ¡ìa®ß/zÖ|\3ŸÐ[¬¿:[Ë“ âweÏüþ^Œë V–0Ls‹Ôpâuçà¹öíØ%ãKFîïGTð¶5§§uàæ®å¹t˜K•¾zó^í§Ïñö!1¹{À¾\º¯w®§…‰çŸåyk¼¿óÜ”Oå~5ù‰àµÔûÝÚ]«|ɯGàjAè8IO‰Ø;âSbVs¼9ç ÈKâRÓ‚ µ§m1“a—^Ö›~IÎàõJÎø—¶ÖÒR•½EÏ8Ý’.Àç„ô55_„al˜>ËIûH éhu\”±å×½Ó+h„Y)ôJ¯Vç3f,vK¼Æ©Ñ"v’OÍŸGWf{);Ÿ.=RN:swÅíÓwÅ3Лz縀 %SWb±&* Ì R dñ(œã_·Ž-¹¯¤|’X8æ‹QNO,y?“üÑëñüù8õþóÆÙQE(‚áx%}Yñq¾cgf†W“f¼ÐÖ1Bþº+ª™3/?ôï75lŠ­ý`Ö€•èp=¦Æ!Fº¨´0J•sdÕÛ& ½0UlHÃqE[k¡è!ŒHk-«¯ »ó*y=ß¿nƒ×¸}>!"ĵá~Žõ܇Åʪ*Fý—,}¹Sþ]q؆ã…x‰¢âƒ)4ãfCš•«ã^ѡˠ³ŠçB¶([$F2šzl nÄŽãK©nö먲åæeζêØ>6qëj /Ïe€c4*Ðå C•ê5@ȥߊÔ$& ¹ÖzÖÐN 4c“#–jì²ÖK»[¾N™}Þ`êž83s“º2"Gd:®œ³¡iq‹1cɰj’WªóòV¨±x…Ú(Ñ ¶*×pí4"B(d‰h@¡€½Ò÷…ï›rÊðuŸ‡¸§"nm M!~™Þæ÷’ƒÌš”XÜÓ) oñO´Z}yû]¡€@<&ðØÄ„ÜëPA;Æù0´}¸=ùâšbGþÁiþv2¡Ô ½©ŽÁÅ ZššBÝ{Ö¬š)¤€ÒÕd1LFQKÚ¶BA»#û¹¶«™=÷çeÁÐÈŽ¹X})úõùýïïw‡ÝÞvý d²‡î‰GF5zçïϳ~ü¢ï=5"2A-î2åfÀ%/Ö0‘d´b—ä’Ás2ð”‰~ã~’0ÍLÑ#y,‡ñ ø}«±Ûîn«}ä×eó[œâ÷VÏZ|¿;¥GR=PC=„Ògš×­œù¬.Š|›ïzµÆÎpá9»'½·Î–ÏYØEÞÜŠu§äˆ*›)G\ËîõÌŃÔiôz?+tcPj>‘Ì^ºN!­•iáÝ—l¼™ðe5)‘S»¾×Ш~BÞòÞ¾ûqý:jÝÆXïÆ@…mœ9ØÞ“ºA«

ýNü DÙyÛë²gyN2Ø4kZ9¯ß¬ûJ bX{W¦Á;°‚ŠYö%èØ;ÛžÍ;¢aÖÜ$×ydh¼"ä`]/˜¸¯•ñ‹{ßõ€U©˜ˆX¹RméÀ¤À KÌtM” KÃs AKRÝYó!º¶ŸY SѰ#‰ƒÌJÖKÁ2m³¥¬Ù'¤Dfbâ‡êц[[¯8 Néñ<¥‰C2-5À"@Rš$4 ÒQž;ð”½ã«á€RaŒ©X‰vÇúÎaq´¬Uþ<=_ª>¥eB@ï°q™]‘ŧƒÔ qJ‰Ö€˜1q­Ò:F1í7zÕcÉ¡`]†/+î°÷ÐxB *RjÓ&¼ b7ây¦gŒß|xËð{£9*ó6Ìzv«UZùïÖÿÊÏìDî"?‡ÿJ ÇÎ:Œ9:Ó ´¼I[ìn˜ëÑ‹PT ¦º*oð-œñ<¾ïÔÊÐ,SÏ`¬RuŒ†º?î¡B´µVöáÎ)Åx*¢1ÿTé_%0¬†î·­éòS‹èÙ ¦ÐhöòÃwL¬E- ¨¡ƒÚ?Uµ¤iéJkö/Æ÷i½ju/WŠoó»M·. €=z®6r‘šáà õÛÁù¤³¡Š8±ÈÍîË 5ÔÓ?J+ÛÛJÈEʆµ{kzdI° øBwQíÁ÷´Åýu’úˆ£.GØVì–ƒìOæìÉn®àŠ5ΓҫeVÍÍôØ(ç©S!îÕØÀrÔ¡Ir¡Ý5žXñæžßr‹ÉÇ)¨‡XG«[©vú)ìq¤áUÏKþÁ2_{<‡-Ó6ø¶‘û—/ÿÁ*ÍVJs¶UŠñI´ŸúÆ–Ò ÃV+³)²¹„‹RJ’PJú…Úe;®ã5Ìzõ‚µ® ¹õãâqa´3x•uWû|ÅKÓ•þb"¯=B÷}ãGWWg¡ ”VúdvjºƒÎHK%óH˜7Oÿå¢ïª¦¸ˆÂ8,š0‚‰e *+Þ¤e„S£‰”ŠAMR" âHF A*@-¨ªGù„3Ú7D¦±ˆYRbb-–`ˆíÁ8X4qÓž 3^ˆé*9Ã@ÊN1” \B¯¼YLN¿h( )£¢nÁ¢€à0Î\PIQ(ô§¥u|Ä:6 k¥m*"‰!™ŒHUX®?“‚CƒÎ Djq„0#¨{R$¤Ù¢(21DŒÈ1b…•W$Õ5”"rµ)c¯|[”¤±8GhC$‘*Jô2DWŽh ªŽ­¶öä ³àG„%ÊM¤é½»²ê½¼_–´Ä5MUÐbê[‹ÌqèÀSR å`ªXÂÖµ¨"A4¤$zœ!ûXf² c¯ŠÞ$8øHu I¨a5V¤¨W$Y-=ZUa=\Ú™="U—$„wÿôuTI“d2p­L§¿üšü•†f"ôqìèXX¥†· ,õ‰[ gÔøùãûÕÔc$½i´¼ÒÅp~ñ:uü¤Ûï~^§&9ÑìÈ·ÈG²í屑WDÇ FxZïÙ|lŸe¹è:à-‡ËÇ\Ø¡œ0Fñ²Ž€O)7Cùsâ æ‚c¦8’À Ü £Py¨Ð«‹[=Ö„yi`È:¢ð}ê–ío°ŠŒ¸ {òÝYtAl^®]É´Ÿi¬»²¶F‘ ö»Þ1Å®d@‚êÖ­?†(«î ‡,§8I°­ÐüÉ´ûŒÇç¾K,,\-ÒÙsj¯©\}äkÚWw»^Mð‘m *«Àά¶,àZQ‰ ’–Ò´†/}ΟþøPβÝzÕ|}/óýÂU—TšCæþb}²POêý*t”Ý÷×?Gÿå9_×Fis1~rÚ`ñB:™m*—uÞï?¶æ’Ûh«SíÈ<‚߯çãçÍÓû×ng{ÆI®ì‡^ZØEsE® {$E2ö¿Zô}_í•Ül/"è *]oŠJ i©ñO¹z2œæX]ÓbˆÈpDÎPµ.õ4€GãÖ‹sí9Éuô%·ÒØ&­“TÇÉ;®e0]±ŽÜr…¹£I€>ʶæí¯«ãHwë†ÅÅì–üØy)¿å.ñ‘xNkÌF¾!žÚÖ{Y;™ŸUR„sçzÇPrÂÉŠ<­Í-&%³c~г3‰²=äçS}26œ3˜Ò9æ\áE°îKsû>{.ù“ftðK>Åm6ë}ÊÉõuþ}~ýÅ—ÿµ?›(¢™*h%>¥ß÷b‚ƒª=¾ÍÃùi<‰{ Ôqg\Ô /éu¦¹ü›]ªêv™ËÒ,s’<‰«Æt“òè5óÏ¡µ±çö‘ªDA-³•l`/…kpìMëH8¯_Ë^Ÿêª5WåÃÔä«IG½¹þî9“¾*—A¥ˆSrɪÀ°yYä ™h9²óæ3dÚ^4FjÇPAá²T‹1 0Ž1‘.*^bJD|!5ÚŠ­ºéð’uÓ8!½ QZzÜŒkF:ÉÓú©®³F†Ñaij ‹h¼f9„À„I¸r Ä„f´ƒWólóGØoOÛQÍDI¸\ÕI‰š 4JÖ «¨‹[˜Æ†W˜xj«=‹•œ×–uDZײ Ö€ºB@m®©¥Š @pÅ‚]AÜœmp|ŠVÞÎÜùǹ‹3¼(W΀îê ªúeV® €ÎÂ[˜mZ¦ªPÕ£jûÄ뺧©Òö¦ƒ™¶uÃL5ßç—‚FBí.\¡F.þÕu\ÔxUÖq¬ecà³(ÐõPu"-VŽô°$„FPlâí“Ë>óÏ$¬Ûí›'ãï€P¥áÑtNöYÞ÷9œ\—N ,‚>ö³°r½3s–óþôy½ûd¯êÅgœjlÌ ‰ÞØ^›ëÆWÈàñPö½kÁÞ;ÑêŽtǶ‹¹"Ámí~ÜöQ¥«º[¡q÷§˜\ûÊÝcŽ~ ¡k?kéËÞØø ®uUµ"¶ŠÑ©áйáÐÀè&]™i'š¢ÜŠ3BHmvïÇtÄk¦,™ñ|P4ÕÀtóà53ŠâíúÝõôY¯_Ñ™¬Éœežö¹"~°&j¹Ó5u*F˜©¬Ó&VdMƒ¾Ð5c«34,Õ—J=,ȤÂÍØ N¾Þ×Ö§!ÆÌ÷å,,ŒÜ“§G©EÌÅW·½fÆûÄjP<¸f8Á˜pŠS‡µÓí¤÷µ’Tzý ójA*eêj)%­9›·{†ð47š'©PÑÌVn‡Š BlaTlL?޽¹LS¹ºæÅ ¦nz×­|‹Œ1Ž=†»¤ÞIœm‰¶X Sf5@¢¦°\‡ïË][©B$:ÒZÎ:Êv‡P* h œPIuÀUx-IÓ@RhÍœhVi(a+lª^‚\väÂÛs´È Õ•q9áÇ2ò/R8¬DÕYË`Ì=l‰CæøÚž…(uO®b[Eå‚dÓs@ÙŸñÏL§ªl“â¤A!Ì,}æöŸœÿ‚¦Z¦—þXc/nðÑ8¯èìê4"ÎØ6{}øhø·߆עK¼ÁFÐä+úªPÇ3 ¢U¬ô…ÀmPÍí³kr>NgEàˆáÏ'·?ur,§´0{Žp„›¤*[2FOºayî7?:G…ì/,{g Dj´‡˜Š»ÀL8Ÿ-Ýs“é³#I5¹ •ºôlXdêZâa"¡Ë™zApûr^"î”´&ƒÕRè¶Ê)°m(pòùËî4Çé.o-*ý`ÔCùE„ãa;´€_ ކtoÕÇ3¾oSÆ3Ú_/†?›‰ßŽÍ³ëc™|¨òÚåæ”6@®šé–x?lîc±ØB³zt'Röƒ&Ÿf¢ˆ sXjW$Èf`_<*4ðp«±ëÉÉœõ¤‹ ÌK®m\Ý>€oû0äO^©r%o^W渚{6¼wlЇÌÄ-îbÇ=Ê0Ø;¤?E9ÓΦ‹ÜT3q›,æîòèi³[è FÛ/ö¸º;_Ä œ¯$ß—ût‰¹¬ð¢F}lôB×:^æHÝÚ¶–ãoPߨУ >üXÌ.™eõ^vC!°Ÿ¨©¬s Þwé+ȳÃý3ÅÄEœ<“ù½»K¬§¤C+r¹@°ee°!5$#4Ÿºee¥£Kªw|±†2íqÍk[£4@½þ{'óæÜ3tÊ,†CM…ãéz ¦ÚµØRr¬8gãu# b‰ÖÉÚÊ;·eœÌAA×mìõY×ЪKןÓ®†Qš ›ù«;]08 ³b `ÚîÔ{(¡Õ šê†hÙQS©1élIÁî:k$ãðZ=LžFb,ð56p 3d*-è+ÙJ!ŠQ@x60-ÇùroH×§-®Ü‡EÉ©£ûÈgëúGc•a\02{þšöc‘㟜ú¿mxW^pVž#ïj¼þ‡ã(|C<=³JÁ0™FÑNs#_8NDs¸b-‹L¸>, ínnˆºV-j@‹€´Ws‹{#1‘<Š3YdÕÍ#‡/ÒÓ~k^Û±8f”Ø«´JÞÎæ±¯ÝãMO§Ðæz¾^›9³Sp©‘ï¤8EÌs`=ÑPK†Sc;kC=ÓàY^B0wqâÑÚkœPÇn÷têÃ׌W5°=ç°‡–«Y>ZoÀ‹Ž,i1Q2ÐÌf³–ïô1ÅJ%à4Ü©ØÀ@R‰¡¨XAÐ1¼*±7•>Ýk?ÿj­Û?Jœ`“‘g±úÜ‚6ЬýâOjOy‘zCß%fƒœþp8’åÊ@K…”$ÌÂJ\Á–ƒ…ÑTVépf\犖u¹+[JFèKé7úhÄŸå–/~k•/ÀÙ¢¬‘‘ªÄšÅ¡ñìjtÕ©óx—z÷ù±v~ßÊ#m/JðÃRt¨g½_KÕVôÂU¦œzګljf/<ö8Sí¯ûÆÍÍãZƒL@ƒ"*q¬¼ô˜pð>ý‡…gÉC†Xvð Ÿ`¤dÅ ÀªÊ!:"DˆP¢u¡¡gUB<$(q TÌ0X¹ WfÝn†k -jQ 8©B›x\{EÅBg©ý®êÀIÃ8©Â9ÔL|¤‡nh#ÝAN`ÁvßX\8‹Av$†qçðȶ½-ô¶Ô) %°Éž/ËÂ&&Ú“L œ.©h\9VP$Eù “FŽFÅ)o8ER&ÜÔúø›ÝדæäO•Ðç÷–ÿ‹«k·5n`Â#|+ÿ—¤Yoõûý¼¶ßׄZEõ]i>weÎÕÏåS$jph*ŽuéíÍ'dl(A *Sev¡$¯ÑWÎÓƒ©*”*«½)º Ö¼ ¥hƒƒaÑÿ¦—ºÉèû¦]þÝ€¤’i*ð›Ù×€ýÈÝH6ª#¹•ë7Fw__‚¼Ím€gS‰­çë~»xb"Ë3åŸÚðïölî·ŠjêfÒÖýÞ_å}­÷ï$õ°5ìêA]«Æö„šôMžK»šÆïÀY8ÝʶÏmí§) Œkƒ9}á{¨~W%û‰9Ë òù†ø6ÜÈOÍñOx—ãÖÅÌ@§ñ_/ù¿‚û7Ô85Ô=oó°žOr…øvjfž™ßjÞùÊ#ðó¨võä©Ã&žjõ²?ÀÛ[©ó½žßïMK[êÎï½Ó5h™nG Y’wÖy&£Y¸ÆÇ‚~¹‹ÛÉ•9>Y4“%¼#5„ÑpkÏùô'’Vµª‡÷{ú±Ðâ2F!u•ª$¡©õÒVZ•‘B óΠ£ÏøóVž¯’{gNÝ$Zºž7yY´g k’LçøSÏË$»dŒ‹Hqo«¹’ËáÕtïì\–N)bò­DŸ=îwœé¸qfÃ2I7鑇Ü̹ Jm!äšt’™„CâÈh}Nñâº4©’4"ÚMEꃵÌÃå=ö‹q<ÿ㽈‚ØÌE=Ò°O¬}æè¢÷ÊüƒŸÛ·.…Å‚¤Ã€ÑÂóÑU}÷øµrH½N<¿4½kî•Íìñ!æôøu¦ªxþ\|ßøçÚ¢zv÷³™FZrÙ\ù,œïOÎ×õŸÀ µ;…™™RÃÕܸ}ìŽv¬&ùÐ)tá ª •èâ‹;›Z‚0:VFžÅ½GüjüRJ7©T5n_† ãf §`*^½s¸Ì–ÞwNø"^„ÞÊHÆ0—q3u3/ò<¼«ìYL¯Ð޼§Êì8ƒ¦J.eÇA¿Ö÷lW‡sS9Q2ìêÀ^½*é1g÷Þ ˜'0ªYŸÝÝo”wö½†~ý½?sî_/¢ßMfÝÒ8­îøðƒæÎFzþYn€4!NÉV”¯s=2Ø*¯Ò ¹²Â½OG1¶k gŒuYÝì{Ë-t¼xÝ( VhÅe”.@»Â£G;ó‡¨k ”¢€5 ›.éÏÑ\~¦¨D½@Ëï׿}µ ê{ä‚þº ¶] è<úéžOõÐî¡/d“’Cç…obEÙÎLC✓qÌ'æÈÄäa»i·oëk–jɰè¶,€ Ds&Ýï¥Î#4‰“æ’¬¼`¶PÍ|6³ß8J„‚ &"(Q …h·x R¥P±…Š ±Qj¡À\& „Í[o9ÍÏ”šY*\ôk'là à%3v®[I€4Sg/¸bØJSh“ýná´7±n-V|«esYâöŽm'E‡Ÿ—´ÛØ0wV8‰*ÛQ¨Ÿg é1*êˆgòÓQâ;p^ؽáô¢¡ZJÕÜD·?_ÿþýaŒêŽg¤ UÜP\F¦Q‘RMÌñòóEÉõgG-V) O¥îɯoCªÿØu‘Q{ãQq Þ-{Ýx^ï=º±5üÂ+½ÅUËö±õõðê§°÷,Œ—|~¨·¯ÝÚqƒ¯7 Ç̸á~Ò>£÷þ%ÆYueÐQ¹Ô¢‡û:s^Ãyàææ»c+ÞOŒšëSŒOÙÏÇ ´]œn‚HÅêÚ&ÉŠJØvk½ëqˆå·2A%ªuܺ¿[Ã2ÄòCWöfжiã lF/™qŠ Õ$k|^ðds óã…þæÉÒpnÌe$r€ ï+Ìǽ:Û½©9ÍÚŸï' ÛµØÖ߀ŸÜ Äß Ø#=%8h÷VBüÄ»}x‚°ªaL0 L PÅy$܈ÄSÓ—gÛku:@>†»Ø ¹ërù'õÑYwL Wn›1Ê~‰º½ƒÖØ5HícÛÞ¦ÖËgµ¼A&ŽÖ€ÀˆhyL5„µðt,©wƒÅûPq½"I°Ã¤$¬Ií°|ïÈ|¾k§¼x¿Ø°ÌV©n‹†ò‘¿ÝJUuïÆ'Ñòh%N>²6ÃK[,µIsãˆHÖ(Þ5z¯\®Žm…a¢ðI)ÝÃâ jCÞV×3·Ó“¯[ÖÃ|Û‚3Òaö ÅÈ¡¥-S ¿[-:ŽÚ¿0=·-·“s÷¶*WúÔôòÃßÁ|’ºïòr½Õ|ZÈÞšìÞjª.!/‡Ï-ò#ŠÝKFvÖw›[ù él÷ç·Á1)¤²Ø&–_‹ŽÔÕ­k'­‘ÉŠSE£äLKCßžò/véæ½ýQX½·\˜Ñ*Ÿ6C¯52üÀŸLyì¯yÊ3ÅSlã“mkØyÕ³mWxXíI¤‹ý wûùKýâY‹Ïƒ^8Ä­*§é‡ë‹„-ÔêîAjþÈ«õ3ÿzmNGÌ!ŽöÇåÄŠ®›ú›„ï&`ðÀÞZGÿ­i¹ÙëæâŒ·O¢Å©ð˜…g–6xêU±u® r5å÷èÀÆë=äT²çý@ÛH°Ø>h›÷‹­NT 'ªÚE`‚'%AN¯ ÔéèOÃþ ãC[P,»Ž|‹Ú-}~q|<˜·õÒ*îýõ¾‰'á\£½^½3÷Öaøõ£¼r¶µwDïv~Yéscmº*Z’¼’̵=h#'Ç/ÁŒâ~£ó„¢ÙèHzuäü‰Í˜)÷ îuÌ`ض­V’1ÿó¼§cóT™×=1=tZ(~=|&ÄÖ´ÕM*WòJUUcTãLÑàK÷+*T’åáƒážä79Ý3i·Žú¢Â›l?Èld®¨2³>ì·—™2wb9œ’Ï6XãÑ*•Woº^M¶Š­×\üHð^Wùm~zãpÜRGS¹ùniÖcëv_“©VÊ;?¡‡8§qÃ8ÇÓÊ»ÜoìîíÏYós~±q,ØÏ«(—­ˆZ§Ua¤š‘ÚT †ÌZW9ºÞò£‘)®[<6ïÜñY˜ü™ŸBÄNP]•[e¦{̆EÖ|=éW'œgÉw~ÚnR“ôŽÈGx;ä§}¹´`¹=Ôð¤ŠèYÀ:„Ó1ÖÜ›‚󿾬õŸs-´Þ] -¾(‘¡ô)aSW³‹£]f…2vßyx#:†/G°Ö P.‚6ˆjQ*‹ ’?‡ïãerµh/š5«ÜqΓú¾äµÂv\\$„­¤~ÛOÔ¦ðÞ¦õík´ý|ýöGË[…Õ3Úo?YA:ëëµWëÀÁF÷ӳò†ÎTåB± Ì6ö£µ«’´PTéË”ŽmŸeØ›Æ ÿ–ù5¸Y?p0Ž AèÆ_9^öZv±sL›G÷S>†gª¯ ª´­Ô2E†:TÀ R‰ dX.Û‚*ÀL‚D”|ËE 5¡nB ÃJ¤ÙN©Sh ,Ón„µæå-+[ž±íPm-dûè\»ëO¾Ï<ŠãVu+<^´ô)sÊÎÔ†G ŠQ9ÄÍÑ&ò@<Ä‹iº†3v¢ÏÖuí®Çħki9òl'×#œh´b\yäÀÊ„\ì»5EU<Ó¢.­¨±^÷¤¨W²RŠ.="Ĉ" JÇ •”$™ª ÜQÕ= V/ˆ r$Ù*FTÅF¯ÒÖ¼,¦6$Áþ K%Ò›Ö+¦ˆÉ›lâM:¡éоòR-+Õø”·«Ÿl FˆÆˆ€‚©£Hpd¢±­¶ôØ8-Ư`WŠaÇ$oZ¯ÈðXPÖÄkPT‘¢M§âãþ¨¥CÚq~åf¾‰{îLÚ‰@Ù[Wër«Ú¦·N—UújÉèÅß72t-à ¤KÝÞ›—½¾ÖËýR<ʧW¯sëÍýªi—‰4·Lû5ÑkwjšW^—“ÅÓÞÓ§ò° ÁRÅÊË!!C"áíÖ˜2OJ£õvöÅ7ùþÉ÷¾½ûæô‹ uFô$l¸ æœÿzfTñ©HÇã½¾ûèèÌ8܉6{þèyXëOó¶|ƒïÖÃ(‡cñÿ,Iƒ´ÚC7&Ö+J 8/T ÂŽ%Q~]Ñø™©ês–lëµAÊL‘:ó-6þ§¿~íþ7êûÿhøjï×ÑIaCAKÔј}i" 6ήá-\Ã’YÆCžñÐ4Žœ@oõÁs|â5 ˜7÷bOŸnÿ#”?Öi>žEhÞî»èûõlóÀÓD{»ŽÐêeU^ô|èÛ§yÖûýeäÈV« ÀlæûàÁë—×¹ÿÓºÞàóûž‡þ>éMúÎå›Ò™g½^Èó³å,8ù•H‚bE:䯠Pö¿¥õÇÃQOŸ}¼›0š9ß×謫g ¿ø£OÆŸYø1»ŸÔãyç÷§N¨§I»Ÿûí]ñ}B:Çþ¬×&¾HVß Þñw_ÿ}´#Ìä+ñŠŸ¬:­58-;±Œµ³Ó>>ø-RqqšW²mÍÄoã_×ö>P.çðyàªõ¨y9µOÈd£ÈÖRßkȉ£îJèL>*\ý8Râ›ìˆ0ŒØWΧ8Û¹áþÒöX1QD®MKÉÓæX©‘QRI-=î9ïv­ Úh¹l3´n©¢ê^)ƒÙ°1‡‚F,p8*N¹ÖDíG)!Ù‡±n„ÅÚ#èK©‚ÓÂU”ÁMŠ™äW‹G޽C3¡¸µ…Ûχ9+ï«pÿ‹ O¹—áãkõÙß~¤» ‰lj¶nZÄÒúÿ}îù#4QˆD˜€:ãËÆÒ¸q£™šDÊH_à<”’ Zx¤îw< OESýÉcWº-6‰ªA¹RßíiãŒFYL¬³£*£ùNºêkCgæ"DNxµÁ*<ÜÄ’¡AHees`“ЃE ž€xU%*ÕÀÇXôÐxœ÷ªMmôÐóJz)MÕ1ãL3)Ìh‹%BžÃ‚)¡–Z޲b’UÂz#>uΈF|H[äÈ:—²Öz®¡ñ&5Z—Ÿ˜I÷…ú­ÝhÙ¬r–ïˆwn8±%µ­Ž©! HQA)Rš)-lå‘)^,XH‹2ŵß_%9¡A«1„‚‹^P諪ÐÔÍ€$ŽX¥±‚‹×€VsìEÍŒ3n1ÖÀºÅ„R]GŒQmÀÀ5V¨©âÊDjYJä:•n.u[§YÍ+öŠ:Zp'«ž=³à´´]ÿ4+VEù“þ û—3}Úÿ³ïÖéþùiO& ¶ïÖ=äúØQ‰´—{½RlÉO£f¿fܼaš#, Laá䢔B“8]°MÅe†¨[k^ÐËbê:U‚’|õ<›‡Âó‹¼;ë7!Ún¹Îõ·ªÌê™~Ž´ù|ü>?Ïg·e¨-úEfRU_ÓÇÓµvf/­ñS˜ ”°L*/%tÇò•k8d‰+êby%JÆ^·U[…ù é|ôL ધˆB*¯ÆíFvê«¿¯AE@äuÏi£Õ*ãT¡½“¤ŒFÐ h‹0"ë]¡}oa&[avåTTÕÞ—}6X£kœwÚ›1ï̪È϶ùÝo¼A¹–Ïî³±w‘2U…B };”YšP‹W{s'ËNì•;¥iãö{6RCÌ»¤ÌVVZïIã¾ô:VC¬¤Al‚r¡‹Â>\3c½fæÌpœ]”–m̨Bƒy@Þ?ÅýÔ‘‚µw`'OƒsÁùÁ°‹¼«yµYÒ?3Î¥?úΈŽhÎ-b.ˆÂ[.§ŸÝÎ}--e"#kZØT=d€pOÈ<È] ¤‡R,>Q)ÚæC Q±  IETG†D6‘S† ‘–[CO G¬ ^M %)Or¬Ð,•YšIµE-™’~†O7æe^®n•Ç)dfI`(KTróòrØ/gçlFÌå¼¥dâ´ÙK(jñ \Ñ¿$F$>êH(“‘íS™5ñ,^)d²¯›×pvÕþ°šþÛË“cÝÞÛWº*Æ“8æh¦sühÅ#7žkÂÓŽê.úùé¹!ÇLoÁ<•¼Ý¿Â}³g’s—WGçØK üî§<\ÜGñ}“®ù~~Óõeµ¸to#šlÔåâž1ƒj˜£2ßœw-ýàkŸ7ôX©Ÿ«‰Ö ÙâávÄ©CÞãá/ØùŒO¾éª `è—±§éuI$Òš»úp>‹¯#@b!ÚYD>|þ)ð˜Z,|(à$¿¹ŽO_7_P8‰s~l»çÏVn­ØÁâu/7}PªÒ&%ÜínVÉÀ8‚kÜhn®ž‰B51l;¢§I F–ƒ>=Ž/çŽOEœ Q –ôð–¢Ái,¤&f‚Ä#Áì„¶„ápkºnGÎæ§®ÚÂp¡3…ÛWĦ£¯îF"¶€³}I->Á´£@ õvÍ ‡)s@Ž *ºÇŠ5ÈEp´<®)6Ã[䑈þ[±æW$¶i jv9¬µÂx^‹å‰Ã|©…ãk~f›VfM5±æ¾Þ­Û7íµ²—WP0äÙÆ9nr>ѶTþ^cÊ‘Ý<º( õ°YS@Ð# †ìa#+˜jÞuEaæ%l¥Eà•]ï•nBÕxøgZÞ¼†Ç–¹rŠ÷¿Àv,‰ø°¯a·(Ä@C"…† Û¾6ým¨í*_®Øzþ`A –u+8_ÝY%|°¹¢¨?5<Ó0]4ȈÞÀ½”TPÿÈé¶Â_Àd²}mn{A‚‰nvQއKkS«Ã…†)_p¤O¹ì ‚>n²1QIC:¥(}½Åž8çA¾§‰°Q—›ìfÔWª‹­^ø5v‹ Sœ²ÝÃÈV=Óäýaŧ>j«n‘i™y}dB %fz¯"BŽ"®¨”$µðÛ ¯¢gÀ£ÕóEC F3=!b!¯¨‚ð 랢É97^QxµGE+‡ª]mb-¤Â=N qDæÃЇØ8Óªl"r<\VQJÇó£Øüö&m¸&Ê[ ¾Ä¥1±¬ûçfmÄ;ëàÔ²ÞÑ¥T%AîNý~¾®>þ‡ª¿×𔢑GÞkvg:sP˜k ³+>plÏêK‚®‚@èˆÕ´¼b(F•”:{’[Y™ÑÈ~–UÉ3’5¢¶.¨bí¤­Š Ã!h¬Áu­ñÇþEÕ;AM,اœ- Î)+†É:žÃz£¼÷Ósÿ+”|åÖÍJ2N¦¯£rÃéO=þ8×`žÁH8Ž”  ¼ÐÞk/úïçÁA£…öÞ*äî@÷ŠæJǾ­Di*Ÿ$&{í Í=W¹ÈÜÖÚú×F†Žyv*¯¾¬uVe‹þªŽwæ‚u.žl»úò9çe•aÃoYª24QçÐH§`çÇ¥çâQm/*5.Ùb’ÃüJû‰lÀŸØêNÝÍ’f†§‹ 3ëSe-Ø>Ã8¿ìãbþ(}€\H¥Å4«|Ä~§©‘F€À@”™…5â!¶‰È‡õQ*Ù´ ôfä’iŠˆla±îŽ^eíñ{æZ'OjEï×\óU1DõDÒÖÒñE×sÍ—Ö Ê%xªÕiM•½Ô9.úð[»¡NìF)DÅ¥±@Û«~‡~è6õ؆,¬§éoî¶äÃÊ]éc»U.Pƒ]GowíЖl˜¶‚ÕÞ[–âÈŠ›'«Âj·HÒZ>ÝP~‡š¨•ã!Ò+OtrÄÉe©ÅI@mŽEŒ&4Üjn‰«Ð` ˆòè«(#´’,Q[és¦ºOR`´ü¬æÂÄòjå¹cLXXÕÒï)Íh]uª·ÇÁHý\Z|_öýòG¸]C½úÈX5"RB£j¥ ÎrÇÆ€ßl u:+ñÁ7@Jì ±³¡Tg›pš­ÄLLä¤Zke þi¨¼Â0žçìÜÓ˜,›nM#ÑlV¨ÛGâ»WgÅÇǼj™ôz¶RgÜB)9ÕDÉ#¾$,3%ù4wŠ×%k›¨û$³‹¬g{¥vçÄwêRëŸÝ}†/×7w¡×ÖÜäSUáI)ì)¦ð)\5`1Œõ\õ…ª M!Ds4Ï=\۷Ί ©±è—ö&œ½ÙßÁŸ€â 8¬ àUÂÇèÇ÷*^~ÙŸ…DìУzgšþ÷píô¨ï[ãEÞ~³þh®Ñ<þ'ßrx ƒUc*$æ’®Ém•‹úRÛÑ›©AU¡J¸Ñ„¹0yÚÊ/)ze÷?®íkSÛIçÓU²â½púdj÷ëÑ~ÖmVi"¨Tg&JœÆ&@‹h p˪òS0Ç8¤h«áû£5PÎ’üZqpÏoÞŽ‘ñáŽíý6=š‹Q•°{t¸=y4¥Û2ðša¦5-]c[Šì[]¶Œúx»Þ¯ùê(=S23QéA4ë˜Ñ¶ÏZÕTó>Ö Dæ² aVôF‰/–¯ÇZö³QS=ïe,&ù8-zñ<’׳ׯkŸüå÷¥Þ5OL¿“«1Z”Ý©9Y †ÿpæÖDþ®+Ÿª­_¯â+,¢‚0T ÊUµT{“"]Òlô´œ"e™ñºîµÜ‘¬—Jn‰ƒ³ÆÏͨ«¿ª'|<.ƒ©•9†jö<¶[JF—‡h8ˆ=%pÅ4?#9ŠŽwóÔ5'Y·Þ cƉ¨) Iød²ìdѨ¶eX“£Iãawä®Ì£êIˆÅðÕQšYvp¾ñ‰ éHwDÑ;`÷:ÑªçŒ ß{ZßF1‡“Ä\;¸ yçNÔdwrQÆÔžzƒãÎk7s>LgÉ?8÷O†;ß}býM\O`äýz>He tÉ­Sa®aìQ‰ðV'¹2û4%–-žE6Üã–Ñó4>úÕ]O¡Í¥†Q™ÐJ™EV=Š‘©fÕFë„WùןÞ"AM(ÛMMa,Aæ±"Ãt¥T#ˆÞÃc…1 ½Œx».& “«J§O¬0Ðzágì5WCR ¶›æ|*•ßkИ¬Þá$Œ%*Oµ`ÖD‘6ÌMM¯;F5º4E­:O’i,¬Ž6†!.}gÂ4oöI¶Õ`t­I¤6ð{6¨è\,Óœ¾ÊÖÃ6Õæ©^4 <`ŽÌ|VÕ0 UÚÒÖE¤X”žšÄ Ø42/ØT…Jàˆ\Üwܲ|å@1²v±4!jÀ oÂÕÁ&rJ‘RÞ ½îˆè€.•Å¡¢`)Z…W‹¾®ÅkÄ&D•+*ËšjÆPh/j‚æJ»“×¥·¬*yê×™¹J¿¼5ä•®NZ—E>y°ÛŠÂ †Åsü¼á÷ÿuæÇí]0’Q;ÈP»žážH©î¹¾ Ä€"ÖôqÁ΃XXÂLmfj8Û5J®´˜NÚËòº¤Âz N'sV5u®™õVVMÌ™ªÂr¾~èíök´Ìêï|ƒÏuýÚ××;È質Þsp5¡0»þ~Gž R¦2o‘ÇVíu@-®Èymw;ˆLP‡˜¡õ̘Z›+"†´†wâÖS|â”kÜ`$ mò)'2CÝŒ5%Uãp‚¬k÷=Bñê*ðnS‚"TÝÔhžRОÑqH®Ç k{eÛöaâ€ÕÒwˆ<Ÿ?7_Ÿi|\üz.kÉÖ°àld³dh7PŸ2G¯Òm±ŠþÎûëoâm& ¨×6Ì>m—ô­#˜°B­:ð]ˆ½ìŠ×xÆr«½äþÌýª½Œ‰ÆRJ8jHkWÒ–°¨í¨S®µ©X¤Ñº€¥Pç§ÔÇaBVK-Ç=Â$®$!qâ ¬ñ¬‚–Š#rK7QtÑŠÙòkáK:Iœm˜º;DÅYñÒò#¼½wwÙ>ï³Ê¢"”+ˆSªE‡éæŽ,ÄáÇÆŒ„#¿/²rW‡­Ô"pÉŠ¦F#‡µ:÷ºª4AIºs³=ª ­ÆsßP—Ç1rq¬ÔýœÏT#(ª1h±!@.y“‰¥;H*ðH=x¡¬,@€%3k%\˜P«ë2DTb)"¼‚@«f–ȱÆÖÌ€kñb’QJKÒŠ›¹¹ÇZ£ütÝ‹«<’’k‘î{¦ÊCÇPˆòë¤RYæ ñŠy¤×UÅÙ啹ÿp÷ë_Ðÿoÿ¸Œ+Ö>pŒÇÁŠRåÉgX¢¤Á êÒ<À—ä´Ÿ.9îÐ|"Ø ˜WÌ÷·/—K&½-»ÏNæ“^Á-ÜdgFhaæ—íj™­ñ‰õ2LÊ«¹®NÖe“ Á£`ð,ºìì9µõùä•"ƒÓ¯Ñ¸f毱:#u<öRßä(Á:Ü•:ÐOs~üxíÊFU v®±l–åÖý©N,öaD—!¢#­[Œ¹ªå®Éî'÷_­¯ï>\ñ·.ö¿ûÚzy?sò÷Öÿã{{Ý>û³ýè„v”Åàëçš¿Áš }ŠoU_VΠîcÏ$L©¥Kéô»ÓÇ4T>–ÈGyÿ˜qÍ Œc F8¼Ó¶Ÿèèð€ Ô ª»)M7®CÆÄE”¬©pm¥4öŒNaõtšPô„öÛúŠÅÖîª)½”Am’;‹âÇš=¢úA~vàϬ~ó AôpÁ~Ï„© à]•DXXq¨îÎý³¡9"¿ét¹†Ë;’ `ý»MÏEm²g‹ÓÇC÷®<àñ'Çð§`|@¹ÕµÚá좼ìYõQ`H‚ø­‚‹Øý| ¨¼»Rr^°ŠÞ5ðXB‹†zá6Yí³g¹W×9¹Dx¤“ ÕK£áÖõÚz8{Ö¢ì‚Ñ‘ Ëõë(¼ÿ™_ã:tf»´®T)Ɖwq¦=?w1fÆEX»‡(,!Õ Ã €Þî`ñI}:Ô², ?&ûwÚjZLý›|î2¦hq”ÎöA4ݬ ŸÍõ…ncø'Þø‹fÚ ŠŸ7 sûëNQ¦2„°M+C€¶ÆL Â轿H`,ŸžÐŸhœ.½‡P£Å½nŽ´—.ë–¥¤ÓBSͳ^J7fÙö]#e8MÛ:-VþùùÔÚb:t,Ý<âá²1<'ì*;,ë.ýïXéZ”Ò3Ñx=€ßçzôçÀ(Kó²öõéI4½ÞçÁL®1ýU8;šS­¥îr²ð"¢9¼XÝ$t•'ŸSü•oÂ/í¼ž{Z±«Aàën>†Æ>±¡&ç¶n&â<§ Ÿ×ÑÚf 6—B ÝРÃÈ[ܰ;Œ»à¥›½J©©ûé:oª$ÆS¿ ¯c>¿_yW¾Ÿƒé-|œ/è2çÇ`|Q¿ü×MYÎNÍ%ñ¡KÍì"`­jºïÀ9¦ºš²:râÐnàGµPú`[‚¬0ÌhcÀM"¢4¿1ÚE¡1´»>zÞ£Tv÷ôvRYžJ É o…¯-?·é4ÎVZ*|˜NšÖ|“÷'}åð2Í_Á¼vôKúŸøù¤†ã®9çkœ†n"ÚÐפB[|ôÈÏ7ë~©&¢-—ÃH&QvVÕdT¾X„q)XÔdk½0Ì\ -c ý Ù¯£t‘S³LÂóF¿^.2ŽÍ‹_!íÖ•6Ÿ>uãrgÍzûÉĈSß½ºnëppAíûˆãÓ™ÅÎôA ]^kŽ<ªé eDìR»žÑµI‚0±š;wËÓ«”e³–ŸX#g:U‹ùâ¿Ñªá"F¹[h)ºTqDÁDbÛPAVvaHPµ˜˜üQ@̃zJ 9g¸¢¡êNk…geË™èß Uh¶M±£æ¸È˜ ’è¯?T=©ývþèìõ(ß¼y3\wÓÒ%nX0›Õš•F b›j]‹ëZý~BO¹Z/Ã6žÂæ³ïnHF´¤sú‡ëŸßÏ?ñ+"Úþq$†9SÉÚ*u74:' Ba=Q¤ñÜýâk=àùW~ñµÞ¢§—ÊžçÇï¶ÀÙñ3Ž#tŒ…¦é)œ‡³¶§žÎ}ƒu"fÖÝ—¢Kò:8P&Ðÿ°.îO%_NÛZee¯lÈGͤ£\ö±3-˜ÈÍBkX –ã,Ù›úÛÜ\¯ÖÇi¾ŒFtîï²ÔqþšZýp$2mXžœG}JâöæS&Z˜<Ÿu„úYß4Z­u<3:ŠA%"Õ>xÿ¨ßûhßU­: äÕ.>¾o§§jJNüœÕ5qjÔ†ÏÕ{<¹Mëò,È!½™ônè’µpÊؤ «Fˆµµ%ݯz†@)¥áÈT ”C¾aZ ~‹`’p·u[ƒ%BÌeždpϳNPºNßuz,ÒÆÑf3®wŽº,uýñò)¨¢J„3b%—½_Ün¶ÏøeÐgƒò-!ü8²r(»è~úsÄL~…L°gUiŸ¡;Œ#çe¯€ZÔ¸s̼·PÔôŒªa]—®«œÓ<5¹Æ‡*ýf^WM»…«D••}kCÃéVé pÆ™:#€[ª êJèÉ˪6ÏõjëâSû§÷2e3ÒÀk\±âÀbaì®qºðõFC¿\Ý£g× ·fÞ·¹>ýò­M3ë¿l·ô¸ Ô?Ýïê,k-ž-‚fs¨yVhj[ ¬Ó9äÕt¡Õ®G%ŒWRÅŒërÞMg¯3îG>øu>ü €m…Ž„Ý©¿Q^ë·v÷¿:n®…QIvŸZì@dØß®ß{noõòéßO«+]=fhù½Û^uÎQ’úë&ÿâ–?¶ªJ=ì‚Å[IêÇq¶›_…štW¨V×€v°«ãt쮋{,ÛGL^†&Š›àÁbµ±ÃÍ`X^CR-ü.3>}/ßîÔÜs”' Ö /ØÖ«üëýSö犵^ýË_ŽRüÏäæÎsð¹÷t祷•Âu}ú{³ÿAÎ5ëzª»åŒÐïžy·üôˆù?.7Ú œ¢€(P9 ЎyF_¸ qíª]цL*K¤EkW6kiê8±û¦·D ÄöÛ±Š4ÕLD%´Œ¹Ã¯0:uŒ‡ÊÔéÚ“Ž! )éŠJÈ´¿8ŽïC"UÆÚ¶~ž=Ì$µj¹ QJ|ã)—ž¶ý­È:¾’¢€*^œÉUÊ„|ó¸4ÎîÜÃ¥]‰D;Ó~=äcµ5ÒN:"? t%“Ã&±:Ó†‹3™Ë6÷LÕÝã*Ü÷ÛGpÕ?»Ûê÷·9ŒÈ¥þŽCë´$Ý>:“9m¶^>Õ~úzO÷F ˜Ò‘6(ý±ËZÁçŠÉ\è¹S-ÔõßDß»ñ¤a)¼²(j5uT2B=Ç Ç:×ÒÇt/Ðën›Îuò- ›G®8c×}ØNÀÕô¶ÆÇÀ ¦LÄ%“êÔsçÜαmÉvfª‰”XÉ[gêZtÁ.ËÇfôóW¾ÛÚ»Nú¸Iq[GÌíú#\I2‹0òé"c¸Ž¦ºUÁ2‡n Ü—)}QC¯˜’óú§ 5' &Næ™ËJeQ–SÑ’K¸ÐŽf S2˜ ƒ‹Á Ìr–Õ^{wrOå8†šyx–=KI}AåŠÑC­Õ800+,._ȼ÷˜^ƒzÅ­!¨°S1˜Š_[WèX$ÀWˆ½K@H6¸×ù"Ý–•Ñ„0BÔj—ˆhbkl@*·T14 ¯' W¾¶¢’bAÕµ 9ä±èu{½ŸÚÄÒNÕ¾÷~kë]>·UáÖö„ñ2ÉýJ0SD)¬Ù°‹Þ]' Ê ÚiÏÜSmQ[Q|Ã#ª)Å bÜãÛŒ¶¾S]\iH Òy¶]6HêȧÉí®5^;€¶[Z7𭦯 ’§MÏÏh>tÿhóE^½ÛÐ\‹~r&‡dó¬¨!½;ÊîÇuW¹÷zØòVÖýr!ébdcD¸ëN¼JfL ‚w¥˜ñèß-á‘Êij–ÅiÑ‚g–½}í(×Â*•cù>¤ñL2#¬mÀ,Ù]c-Ó¤¾®ÑïkÐÔó–ÖÆ.]/±®°ÐÞ´Z§·ÞÔVo¾ ¿~]Òr=¾þuŸâ…EpÃ1ÜæÝå¹Þ^J¯fí×sõ}xt®§ù¶®¤Ç.GðµÅýhûEàvßÀr\šn!G½hö UÞ›þ¸ãå ÷„Ä•)/¾Pc¨R@—èL ,¡ Z’™ú—€8¶*<`*ÊSù‚:Ÿåù½¦lÛDq…i“’9¡‚•`øÄ§é~–”›V*ûàÕûð|ð,{:œ”ûiJeA”éí=·Å×SŸ®‰–n¹ÁGgAÆ­7z®8Cåé(åõI23 AžüQ!œK=-W¡!n/©fô|›F…¡(-ÛcçÀE2´Ó¬‡¡äðÒÆÅ’k鿀‚R^ µ¼Í{eza9Ð 4a­€‘‚$‰)*A0L(í`«<ëM4+±)OIÀ…ˆ†Æ.²TT-Ga’@ˆTbjÙ–ÁMÚãß…6ÚtaPhZÙ׳eó 1N Òš&½½wgxkµ°†35U{"ƒA«mÁãfeM¿¬®hNþÕÅ=}¦?GÞ«Oõ¸QB@D¡ÛGÖÉÃ}o:öDüi›s NÑÄý¯å/Ôªý6¬Æ»f.»fÕ‰m õ…M’ëÒcÞLn€ŽŽgÖÕaf5¬HHô–Ëq§ŒÐÔ#vµBô Ö…ÞhGxâìßcþ匡A/*Ÿ¨çhT Û1‚a-Q°D ïñd“ƒN)Z*ƒ¸¦Õ¡á‡ Ã%\þ6Ù³aÜžØú™yR2Äü½Á~txMØbE$‘éíá6r?ÈFnfoL;·©¼Nÿl/Â|§T$å(©båe=ƒ™b¬áÑ+ÙÕýࢠl±QÌ<ÏtÙÚ¯3ÝjXÓ•å½]?é\guýËÈüibû’'´(pØIøðÛ÷Wäê*íœb\'<ÕÖÀDu¹`K5â:'ïPT/s{ñt_ýœo,GèqIôâU†¾6ÀFãf˜¶ÜxN2 ÿ(ä”hZôb ºµn¸ä‚`e™ž@C1 ®ÁŸ;ñK6矓^ÚB4Vl`Ÿ÷— "ÞÓ;d°1€l‹áehÏ1x»Üxѳ½5¿§q™ùïí‡}½Þë¿é6¨mb„[küf,9Ö€û¶Óowš—0:Uºu·°TË+J/‰/¸c4Ì~?&j8œ׌‘g0”ž(~^C#ûœÍï"ú5+¦·º ì%îŠÇ£\§ð…ÒÏ,}p¤ˆK¾;C2©jÌ,’¾9ccÞvÖðï`ñ˜@Òsœwè’\ð£ß¿ÑžñS[ç_WñDïa—WH•Õx!ܱw~ü2ÍKk¼<ãPÎÃÖ`”y‡ðñ‚¢o0%+Õ‡••‚eÊaÙý¹Ü‡­m’Q¯> ½«£NÚgv”¶Ð¿ã› •†ÃþGí<×'£ÅÑõšR8› DMó›èÄì:žzÿµÀùûaí¯ ¥b9“N~?3fùÔ„š«²ÑpF`íð:Ïêe¯êôJ¿$_Ùý|~›Ç_:ãaN( ]ƒû…É!ááݧ7_~êÌŽe«  _¯Èñâ,*­ÿJÖß'bµåáH%èÈ™5”7HFŠÓΚ5•ºTƒè‡Å‰pW(wJóë~.††ÄŒÚ g3xF92éñ©¿0¿©=u{?#¾4Ñ –pKØXE~šD†Q „çr.ÈpŸËý“wëC½vîœÇéb›¾- ÊåÜa¨f›ÍÑ«âòuÞZÖ‡ñk„eð&÷a Öyr-$¤ œ)âŸÔŸ¿Ñ/£¶b\*÷²$H+œî6®ùK¥Äû52(M½p?¿ô¯ÿù?¸y91Týâ'ªûOßšÚÉOyA|HïæÏ5œƒ2+Eå* 1/ÔÒSpÖq¶à-¤—³å*ÇyêfƉ»Á7܇<¿Õɷܼb¹z¾;/£^gŒŸ"7U“O, KÕbÏÜpÀÇ›y9>yÒï3w_»W/Ð34ƒä$ÌBc‡áá­ßM‘_ '‡!OÛ}§™9ÿ9ŽSíÉ×j.–[§c@Sz>¿kÎwæÏ»üØÂÈ9çf8GW»S_â[–•_/áµùœ°ÜÚ¾Dk5PBÿüøGèòJvk¹ç&ºèÚž¶Ÿ¹µûdê0u®ÅãO>N>}^ÄvX"ƒ`Ÿ’…Ñp"˜&UÊ_8“›×».¾^TÕöÕ0·Mî‰Ñ¾ªîßœý~w[ÛŸW¤ªå›úTY.œ‚^L}D«#Ö«õ‹!wŸ¦^»À òDô‰Ð° PÌáÂÉä©s–~ãÇ}À/\í¸¢Ú²³ÎÎËÿÕW½Û_;Ûÿƒïÿûòb;ýÑúç½[ñæ`?ÞûpÅ\Á> ä yàšïõ17¼6 Œ¼“©h컯 Äïl<ʾ½Àú›X¯+_†hBŒž sh­wü+ºß•ë¾`'Äx¢wx­Qÿ>?àþŸã 9âSYqpO•sŠ9r˜z}«ŽŸªV÷^µÊˆ4 C‘¤~žíß?_çå\çZ¯yÄó¾y•ΩùòW×Iv›ñru!oÿG^MôB DÓœi³\jíx|ËprøŒ¶ê—ïÊóà¨L2ư³H´®åø¶ªíõzðŽRÓðSгŽW¦:‘K…æÏ«èbNö—*ÿ®¢~B‰“ý÷~íµ¯¯CÃ{‰ÑÜÙ=ýX¬ìý_5ÿ/ugiDÒõž,]À¶ÙŠy=ɸ" eI0£€†„:‚…¹õåªXðtu”D|Õ’ÄZ¯‡®°«  qÃ`š&‰6@†yÆêÎíäaW—òo\à)·H¯t˜(`Vµ¬ÃézÞäÜ»ýVõÚ§‹ú>µâ|1[JbÝí˜ë!¨¨{°Ä©Qª¶ð"õ@®Âl×pŸv2aæE¿Ø‡·•¯ƒ|är ÙŠÒýy¢ÎDŒ ot 7SG¬´Ûì –'x-úÖ´oZµ•M¶¥I­_ùüˆ_×ÕH½ÆtÁéÀS8‘6Šm«¨úÃ:ïª5S} íÓþÅå°è%·Ë<#¥îp•”]DÈ#ÊÇj³Ú³' ¯$, cPfíòÖÊšVr‘ÊËÓ]Ö«Ì9̇ÍÂØKÚMØc`>¡`ZÛQa@ë啩ú¹ÏæÞÖ#UNá¦MzB6QÉ)ì/äÕ‡h01»r?7„¥ÉaFÝÂ6¯—£­YêIl7 ìR`7…B ÕëvB¤Ô€{Bce@°Å€ šzG+¥Ð˜„Ä}ê#L½êÆ7ႨRŸÈ!?è`agkZ¶‹ºÒa_…ÆúÀlg°sHž™ºALB’” oÇЊX ô“|€©)Ѷ¬*!‰Ð’¦êÃȤKT.ˆÔò†­™©' Â-ˆ† gkŠ¡a¶56i,6mçP7uÑŽØ•`b1YÖj—¦ñHÄñ(àBK€Êƒ)T˜UW¸š‘8n"4D„/& ÖûI]u3 ã" ­æ–C$µ-1.°Êe}vó›$ÚõX£æE+n½ÛJ¶M0‘bUÊtI§°ëB—QÚJ¶i}\3á^³uïœÿXóÏèÿX§W¨†AīѮªPÅ›¬¡à¯‰xÀ¦‘é¼Û6Á~4œ®¡Þ,m×ÒËè>2ÚŽ¯sQ|°²b Ñ7vÍœISMŒ1ƒ»Ÿ÷üÀÖðªÔ\è äÔSµ% ¹(¸R.ÆHÆí«iÀÖ²%F˜´JômÀ\ÄfÚª5T ÆU¯î´/ÒóÜ2qci­ Z] ÐU`ÛÚ²BöÓ Yg²Ó¢Èrm]Y¥;­Ér'­<60KÑQÍvP÷¤c~âõ=T@$AÚyšô¬g¯¦{/]¬‰âÚÍ£·G?ècªEƒžã–ÓVDÎ=WDpèh[I …ë‡^LâËÄEµHrôK|T[11ÈWò°`9[ªÄìnŽ÷â¥%N}ÖgièŽø9 =uä†YGaÌ–,{˜¶tÀJʘ-óø¹K­5&@y¤³¡tÌO²\¬¢Çš¸‹¹¤ïp_ªîß§Î×¶r0ë<Œ\š3÷u!5&\ª8Œ–±áLÉW¿~‘”qÓ¬N_KŸ$DÏl¡¬UÍ o™a©¨QÆYh6}%jé£ÃØÆE±eŽœ+Åz¢âú;èUäE=0"ü•ž‰Ђ)q¢´MU"#⌮¾@§ˆUŠ=»ô+Ü–¬K ›z¨+C•¤C­'¢Ä ïÛ~†ù†&~M^̦° åÂnBvÍVì\Óãè¶-9~ǵÄtÀvÕÁ­Qˆ/‚]ŠFU÷³p触jìÖÐ"….è±v;D h¨ö¾¶;›ýç}®ìÉq™É,ÕZvgĵ/«É"Å`6ƒT|»õu¶ÕÎSîmÜApƒ!ëK3‘ lÆa÷àeKtH˜ƒæ/¦ž^QÕa–ÙJ[õcÐ yàž*N,ß–F'.#€W ØŽRÁš3&ÂéÔIuÀ“ÐUy,gÁJ«ðvÜk÷¸LÕn”×rÁITQÍÅ#Ô&@èîp+0gݵ!%WòÌ9ÁĺµoµªìWcÔöå‹Ovf£Óò'[˜ã®˜!~|÷Ïùï VŽ÷yï~Çb°G-ÝžÄêÉåû€¹Zša=Çh2(Þ¦»9~Úå_¦{ÚØÃZ r%_uv¸ç}7Èo08î­:Œ&¦KoÑrHH〄0Pƒ^nCb ˆà,Ý"`šÍÅ8"åÞ°²”Æ},Ä$ÀmÖñÉÅö9>¶ÝFx×@#Äaf¬Ö^ lãò#Ù‚£Ä";AãD Ö²!däh‹«®àž„ל¯?Áë?XŽÿhu´'0Q›ß„êûêÕHJ§¦Ÿµøãˆ¬Ç)ÂßÛzLŒ„•QŠaÕø_zô¾·‡·VN^}0}zµÕbl›¨ãù²›ÞvTkÛg¢Âïë"– ìäI!Qˆ‚cξÇÍà‰ù»ðùû{çß Þþnu%U¥’ _Ëì%ÏnÕøè“Zµa®i›^"}Ÿ>Ò¡ø¾3eGØþFÖ »É½%¸¬U[‚£â¥ T3d±ð}݆tj®?<56¬ÆŒƒ" 7H»øK@ DXn§ÛCËUI[KEJÈ’ A6ˆÑL(Ýýé^ v¸¿4§:n;báÀ¸±K‹ÂÛ˜st=62@",.}ÐÐjÉ8sQ\LBÃ6@JÊÑîš´îM’è5ðÄ` ö›Ó¦®CÈsšp=íÊc±vbåBºP8 ïGÒÞu1 Ókë8¦Ñ0E‘Âþ¢% !ûs–‡¿/1ˆ'Ï»¨_Íð"½(ý!â?þòÝ?wûxÐ]ðÁ©lÉa8ÞœÅÓ8G9ìt‘ìí±äÏÂÕ–¯óšÛ.÷òÛ#ÚÍô7tf‚½­.IÒK¢Ôk®ìQ}úìÑo½åv[jê§KþÌõ’‹Ýôx-ˆ_èV¬ÌÕœ+ÇL‡¦ß²éd´pŒ3t«¦‹Ì“6•ÐáF¬â^Ò‹Æy ë‘w–N{Yh.¬LrÚ³÷¬t;Æ›Zì¨`€SÒ.Ìløƒpú馣j¼Ú,e©5åC¹ä`½ÃRl¤¾87]Ià6]`“#‚n(½% iæÁ«·Àì38ßCVlJtBa,J[î1ašCu0ì Í×U5æLXbã/ÿ9§–„¦>_V~-‡3të‹c¿¦%M¢Îü8=%¥~t9¤¥½õõ3£wêuV”§ÔyFASvUf÷rhr|Ýo‹~öéêOoØ'Qw8ž±¿%þù1à9½”ØPî'¬W—ë8¸0º¸u×Õª¯–Tx¦V.ŠPIhsÚ0EÛÈ+ò€e2«@VñxöM*˜Õ¯÷̇cYSØ [™hßúYùtsô@™$Ïió‰rrÓa+xWñD€GžÐ¬ØÞI‹¯Y#Ò|*"U-ðE~©~ª¸1r™Ë±¯¾ýn~äêzc?ùèq—YÕ*0ÈŒªùUœõX7ª„ï~¼ýYíÍÚâÏÈ{‚µ4Ö‰›·WëO×sy¥+mO¢ÚSÓóÇ×öWÌ!ôA|Ò7¤QZ nüqëà5ÊÛÁ™¯³çmÀ/ß¹~×I…ê_Ïå9õím>óúCñg'Vk »ÎÒ Mƒá°“ÆÜ ~޺юó»’\†U…lʵçÙÑ 0’ ÃÒP¿‰¯iõ^[Qëvv§;L¤œ”ñÙØˆ'dÎYªvºÛhNHemåF¾€ÕÍ­¶÷ªdt 4Ó¸´§V²V":w¯ü žŠ* ’"&V‚ŸgU°fîMÎIÂÂ¥ÔöÊÕB€».¹È±‰&Çñƽà]ñaîÛ&AÜvìcö…}vÍ;Hâ+÷=¢—£÷—øÿzö™ü¬åã¤Õ=шD ýâ‹mBq‘ª*¿„âÀ”UF—òkDfOηBßsöÝñlmÖþÒ¨¹lò§šµ_g>:ðX1#T\ÓvÐh(r›RëÒ+m3µ²×É£/½ÊP[%«¡(ÇÕ>ü¦)JL´È³ýɸŽnº°0ôhQ'YÞ»çs0[›š¯& ¼Ìdš1&0Kz¹úH®íPäŒÒU-O‘JTJ„“ºëú4èÆ‘3—0>}ºÔd—H­­iËílÝ¥Õâ¸æÆ‘„8]ؾ®v¾«£%¥°ºhSýX-’=$‰§Ö—¼'?#;øz÷'òõÚýðòIžFýžœ3`…‹@5ä–Ê}J~–ù›ƒ3GWÉ5÷ùÉ2Œ"›še¡ãLbX&éʤÀ}Â?¿_u‰ÈŸ@U'"çÑ}Þ¼æŸ »|ÛfW.QÉŠ´{ø‚#R£p»Ï)Z_8Â?51Â{Ñg©Çjuåä¥~;éçY›ScÁ—Rj@~ø”~žñî-ô9²ÊjÄ„0ÑÙÂ{Zï•uÁ ÷æiÛ´ñrŸ Ö~}8éÇÿþõSÍþ½Ù{Q(“®Ê~Ÿå£üõ÷øÛýeµ¬\c+‹aÆkMh8˜’ f±‹PäÀŽcBêK\;8À\JÄ ^R‡`S$•MdQÏ›Ëñô<»Ë„@º‹0&;’†šìJOØÃêty”©'Љ½ˆA@gÕ¨ï—ÎÌ©„=#OF6W£ºuÖ7¢„¢xÄlšT£E>Ùd®‰IئõR| TÚðl`¬I—‡}/…Ú …&„‚AÈ®‹ Øe-{вlv¶{aAÎBz‹’§= Ç* I¨!RÅ’€£TTÜ‚Ü.¥ßÑ¦Ñ gá”+DB`ÂR08+ø¤=€‘؃îz¿0‡Þï>^²»÷lËVon÷³ 'îmù|P*Ìa£…¦j‘ñØÓånûL‘Qö™}Kµ–߆¨ÓÊ ¤ ÁFªeê/êÜÉjìrUX +)¨ƒB fÀ,}çp‡j1$Lóo.çïzÄ *§RPª¢Øˆ²À"hS,’ Õõj¦9‹…ãç@ms’õî{èÎ`Ù‰~žË.±ç{ª×Dâ1Øišæsý#§{®äYêX,CEg'DÏë²Ý’Q_вT°Ô!"U¶v4£ß'uµ¡mßò©è@≮5m–±¸† ´õаÄã0ôîÿÐä­üôÍ+Ç“£A Cí ÜÆ3>ã[î·ÌuªšnàP1EGª ×uÑ_Œ º3úÂVl!‡ê,D&—[ª«Kkéáryº\6«J¢t—æ›NLNìéã±_·i„[(’h ÄÛ5™Ùj,hEå¡6äQæ.âð•ƒa~¸bPF8ÛuIºV›¦ µ5C Àôº–` MµÈ:ñ,ë0Æg—´¼W¥nþG›ß*öyBCö–ã´bŽâåø[8†æÔ÷2Ç@ä· ÙðÖ“.½´r›‚”­€ìpq¼ÊÈ<ôî"0zV ùì“O» «¦ê]0Íí0™ð¡ê¼9mªÃQÀÔ Æ€?æôçµø©ß›ÜÏ‘6É0ÝG4 ¬F{­ÅnÏ-vØtÕS5÷éÆ&Sî£AAÑ¡9°t8ÆGUêéÖ)Cs<4ÖòemÕBÞ ÈWD¢jŒ«Oz&ÍQŒ³+ÿÌ•P5nݬÿëß%õ;Ðø[|ÿžëß&͋漉 qà€R!¬mBðôb¨[KÊloWf»Îж ß›Þ"hi}$ëd„ƒ^Õ²È@‰K (;ÊUtc«aÎX,ùìgèH[ÿ¼õøƒ·_ð9f fÇ0íÞëUã£À€±v¦ØÜLøÍŽ,wÞw; LÃÁ4M3ðkî,¸cÎÎöxLñmvÕ4ä5¢yòåOLÙ|6JÀ@¡¡[^Ì/ñ¦Š¦-ÁÐUmTì’:Šõ²™\=H‚$ ECEú¯Œ TµÔ ÛqH$² $á “#cT£Ì,Té; ÌÃì9áQR"+tÄœ€:ÜPÚxwWRÞüÔÆí •Ò~¿/,»±¶•Ä6¿¼ÅË 4†]•¬gA±\qR›Jv{v&t'£Ï¥vNì¼g …Ø¢¿0ø>éåoŒ Ĩ—ä“…ÀðDRƒ­ú¬—·LŒTtËLú¡ÝÄ¿`úœæß´ÛÖ¦GÀðæÍN[RbOVÁºl+ëǽp›¥ë{Vš¥ßœŒÃ±‡äëÛ+ïna"xž}ôBx aŒ²6´Î2Ço¿œ\o•38°1h®c¯¶A´2à5Ïë=ÊÐ1öÀKëÁ+9¯‘®úø„d%6-ðŒÂÕ¡µ Û¤¨‘¥’}˜}-9ŒË@eq§$™É¬lÄÆ²@F‰…±ôx Øì|ó7¨Ë–:<ä?«Ñ‹½ˆÛ³±=Ʊ,svßëä «sª×e{ße*cïñïÝ»›rúxqŸŸÝŸ?ýmjáTüpr l\ýäû…ƒŸ÷;Õàyíu«Ý8Ê•';åöª¾Á›Œã–ÔŠ"bà]/e@SeôÜ}¬q!ÕñLJD òP¢ÃÃìhLçäÀTÖÙÝ]Ëcøc>›®&[nÉšË6–År0Jéò‰•ÙN-‡­1Q_±~¯(Ë ª„Úf :þ’C§kaçºç™æ,ø$Õiè\ËþD´d›fáXoJp¸YµQ |ÅBÃŽþ ªÇžQ>LÇz¾`tÿ:-OÑÓ'ÆÓ7{Òþåùý·/‡{[Y/½Ûõ¦mäÅsòyaw½ºÂ¬¿}âó—tk¿ªð¤}ç¹éçIŽóvëOÏ‘¶ï(ÿãôx=KìÄ–{DÉÿÙü™|½èÙ¤ƒŒhŒÇå}þ³æ‚q}Ó) e@†“™Æ,ñ‡ÏŸsÒuѺ×ÔÚ ÐI ”—Æb/î#üIÑþUi)d—QRU•«‰|!.g•Yaúv¢„5Rj’eVÍݨcžˆáƒNWgÖ•ë²,%#{"¦O‰¬pgG­'?!oz8ËvoaŠr¦©ÂzÆ=•ÆYíž,[iýÙ:/.O½ß~\}1~ÙgÛQœˆd*áQHûxõÿüÅžkó<ôû¢Ÿ¾‚TRÅßÞüg5-ލ”*JqóH’©ØÕ =ÆaX¿ZüVã¥=PzG–ÕO¹yÀšHè‘âARŒ'•—²4$Ñ5ŠÅ£H"a •ÐT˜H`¶Ñ  þ®Cbl€ p|PR0—±ÖJä oÕÃ=^Ÿ´ŒpÜyÓmTÏEHîtŸ 30uIcÖ5>ˆœ :8„×etX:âÏ9w 7‡å#¼Øzü¦<>ýª(ü$tJ1éÆô=cÝ¡°ÁVT±V¡ýaƒ&“!Riû”9¯z–¼Ñç‹üH³€mBЇ'* ¯€Î÷¥žûèŒÒÕI .zêÊOï)Å+ÜV>)«xd_¡RE¡ÆuîB›+Ñ àÆp:wIçc·Jk6“#­Öœv¿¤+U#0ÑY?ÜŸÕ˜C`!7Y)jÄhl©‡&5…%È&Û8ÕÈbÚL*\éA›üÕ! VKHqö.¬^ÑäÒ¦¿'º erÝ\›e@{¬c[ !dI/ßåz!+\ÅŽÛT;à ¨Y™p Kò¡¹*Es6kÎ\Eà.¼†&µ#Bå᳡£3KQc¿ Ð5ª+Ä€Q3wIrd€ŠVY¤Á£áSPVÚlƒd%4hvÀm °k|eÍþvïM‰®ðÈµŠ·»+³)Xîh[X¨Bì]ª™ɨ" ”Û„ B^µ¡ï”ýÚö=ÔŽ‰D$•é• Å”íêY‚"T?]ÿ<÷dëYƺ.Y+ ùÏÙÖa!duªQcÁ„¶M[öÉäŒÑâM]2P„€b9ÿn6÷ù¢¾ÏöPâHpëJ4ÔÕ hŠ«ð¢WgºÏ ®[ò¦9Õìý\Û6®¥+,q$YìÑöB¦ž€=/ CU¢žÙ¡Â><¯7'i³+ñ}~yÿä¸v‹ Þ@´‹O4!Š-ñ"‹I¼Ú”z4£!aL´×uË„îtÃöIJã{ Æd,\õ*Zwz/Ý»¨Ž"I²b܃}Ô wšù¢NåÜJ€ÅV«®è•¢q?2àJ$«"OÇ‚"²«½TNbm%b@‚G²šWlBQøð66-:ÊÚßI\âÂîÖéV竇ÙUUÔ&‚»Ô¡[}Ø™î ×¼<³ð±ôoí¯ò~­J<*/Ó5 C39$^Eu¬íþôÄòüwî¯?"ß¶éýñ~yµ÷´“×w!m#Û°‰6=ý¹°Fõ@²9ǎǼA@¦h(Bl\,ÑûªÖ®£ûÚVÕ©yõ¬ðwÏ#nou¹˜¡½cÖ',~ê딕{ÈYf•Iá ¦ZVÅù‡µ•¦wë…‡t/kª&ðut=÷ «(AX×è5™Åì<=ÉGì˜*{Œ«`»käáƒ7TcîñåôS–U˜·ÊØUÅ2Ò"#£ `¨E< ÃH †e*BÊ0®ê¯Õþ äã¡måšø\¦Çzßæ:´ ©® šóÓ±¢sYgZlÉ1œÎnjV—â~mà#ß×Ń>D%½Îž?n³þå?çFßÛVHi¢R¸ðŠ0!pE5=²§"í½ÂÏéŽ|÷±½£éÎBP3Í  E2Ôñø5§KwNüG¶µßŒ šæn£V$êJõ’3=-®OüL˜ V €¤®µ/—¯ …ÝÁ <‡Jë›/ E‚©Ÿ8û·¬òÁ]Ìì'=×WÚHa£÷}["쬅˜×"•¢$™{¶ùÕd#Iù؃×(Ü>ZkÁÇsáöÍÙÏ[Òí4×5…n"—3[ö¥ô4xŒ´CÃ; (úÍcšGëVäꬶaSö;€ «qXïQ„Ò„¢(4ݳȻ֫âfãÈ€Ž!ˆÈõ¤~-7î‰GÞôIÓ7¢è+Ú(¤5Ðèùzªls5€°S›BãaíÉÖbßbÌü óF}ü@¿ïµ{õûж6âN*Wœ_YkçO¿ŒB:ÞqôÝa ¬Vw]œc>·†ÿì|}ñ×Z$%+'Üûô¯Å˜… í]ÌKŽ##‰¨ù"¥Q¼1Õ#Ô{3óŠ$"Ÿ æÉ©Õ×Ì=Ùa+áé2T„ác˜¾Ã«16ÅŽvd?ÆÃœ¿¸¦0.8ŽÁk ßà-#Ø ”r[Þ~Wº¿éI2 Z ²X¨×!H£{…æ­^ôS›ÍÙJé¦0åIoƒ¹1Taµ‘§OÄ¥)Í”xµ\ˆ p½nð2¬Eƒ‡¨„¤ý©©ÿfƒç! ØzKñ0i-’$YJ‹¤!†íS9Ñ: 2µçÂ[VKû¹i¿È†=P14EňË/6^fvtºðq1>ùpH;ÒÞGcXlXÕ0„ÅÞ:ÀVh5„‚ ÖÒÈ_qU¯Ín>ìn\Á`·¶š–æ­Ôd4ƒ2Hb3È¢µ:âä2ê”r†ÿgI,uú'Ggnlxº¢$$ÿE‡g½ivÐ;ƒ Žåӌ͸eÂ.¡N1£ÔvîÛ.M¬ÝF#~úJÿêž@{Ôy[·ÐÄbû©“I¬?ösÙ{(||¨†6 ŽH'רôt§2£ÌÄüάp®>Ý«hЫtýÅúx| wG冽Ù_óÍq¸:N*³3 ¬‡•‰8/ù oÚì,SÉEm’0ß„¾ˆ†Zû5Å݉d–-¯£¾2oCì½*ˆ=‚¨6Ïqjój8ZP¼¯A’Ò„9~mÄàmDÆbÏÇ ÑϦÃùøSâ³â[«U™×<Ãñº~sñ´ ‡*íØ9^ËÌgÁþµ³¿bt,n&°ž±UQ8j>ÅüÜ€ÜZHs !ÑT¶þ]fÿ;V¯À´Õx4«é§#C¦:ëUsÝ '«pT:Ϻ}g¸w«ýÔGô¿QAÖ2+‹={Ia[B ¸ÝÁSW3ÅÝëuƒ:LeðF´?.£7³W¸Ô[Â6»ÒZÝ’Š/n®‚p‚Û;·u†žq^¼ƒr.‚'æRVëž…±GxVT„túyBÿâ¨ÔN¦Z’«$2EÙx¦,%Ü”Ï~ñd£´sD¬ãbiplT877ó„qlûÄÉâÑËÓšñíý§p¶u2»õÆÐ5jki•¨ßit•p&yÎD>ó~§ÚÕQ?<ÆœóܦNJW3™6Ç“~ IúWÕKGÎþÕpÙ‰¿'2€XØ¢-æ­ÝœI†D±•Øà™¼1>çôþù÷ªÌ…o©ã÷†ïÞÜ‹1áæDþi¡ï¯Å4Ö²_ˆ;çXH‰mø­àHò±AdØh–£§zO`væš Gã2L.D¾jf¼uô§µ+½·ô<Å—œêÞ4xffÖÖ#O$t¬ŽKYÑŽŽ&ëT[†M¤õÃlÖê‰Ë5Øsºê;óI¤‹>÷ýkoÏ_Í–æoUx«3ͰIèõÿÚVÈÎ^,$&“ŸÍÝ—IJÆ«F¯?Û«÷.ýœ—TÉ£¢}3eœs¬‘<æÚócÕù0}œ=5¯“í:~ª»ÿÿo·Äú«Å±N)ËU>_2„Êž´K‡c,C ¢¹ÛÓ¯.>60›âáÉQ\ë:_â‹„°!„„!XÜê´@NDXC…:V dÍcæ ÂVtzû®zìTx žIuK xîñ™\ºË®ÏzîÑžGe³9ÚcmÅåY;l®~Ü®lOP…qxc©CZäd =4ä6õÔ$µT‘ÔAË™¢s””BDu©©¤h±ÂG (œ²(eº#À’$È~¼,+X':ŒTDéè¤znK{ßòÎ}˜¢r?ˆ¸Âsü‹Õ¿TÔƒ£R%Lnš÷Fµ=øöÆü.Ù·DÊó§ñ1úéa×£ÕþÛsÎú†ÓA¸ôËbiAîä‘Q®~¼}ú§?õÏoÄ_å¡þO:I>Ä×g7¿ôÖÞãŒÆßÞFßÁŠG ,êIWM©TÇJ£ ’Ó®dC:λ\ÑùÖ—ƒç¼!ÿÂçפó;)é2[¨E‰ÔKî™gµí“h…[˜²¬´Ltס(G îjuµÐGÁJ×Kõ¥ÜLÖÚ”/íGÂã9Ÿºê»®¶ÃG»6oååšÌ奓|+]¢uÒî"ÃP"£0”vG?y¹}I›BÚ‡w^ÿ «õô,ËÆuèÁÛ¡xá\ ¨1‰×¾PÅzoîtfüþDýÙ}uÄpzô,®1¹ì–ÈÝå^É’Ùotñç—ú™Ä Ø2Ð3D6óWǗޫIwºÂqCȆVxOx*—åJ#ËB4RU³Îͽ¹]6Ó’P’~´b=)̬±/CW…Ms®1Í*F¦ˆ9Ö²VÐ1XhA-à­ÿHñÑtILYâ¥5%›5=Kåå5QT.7•ÉÁ‡]>?ÄÏ#:ý+ç5ñ?ŽñäZÖ¼ÁÆÖú’ Iíë¿ç¨>_~ÿ`¾|Þ»¢B0H¢E%Ö}ðLXêÅ.(*U«)Žì£lí˜Æ´j"±d`u*™±*¯>zþ½Ÿ-I M-wf@ʃv»jAŽ,Eðk¨Š H ­g£V#éj$G"!Ó0 (ê9RV €ŽŠjnaÆD±úÕ‚Ug¡V©N‚š¼mÁ|>ø1»æŠÓ5¶:T_óÈP¤¥_’§#uêh‡éÓx|"~³J¤Áˆs†?µ€LñC©OM% hssÉ™…t*p¶ÓaÎN´eÔ6û·/àG=~kÿ æ^äèÌÛÌÆyî'Ò߸ûà©­ ØÃ‘°Tk¸Þ†/¯á.×ORd ŠÚT ƒÈBdcÔÔ"Ê Ì"Ì e¼R·G<;«uÜü)W‚9H÷ÓqXmfÿ>¿þîÖÞMn5ÓÌp™»ä{ôÈT+‚êÒA…,èÝa½}îü4å úÇòÃaPí6kýÝÿöœþ«›<Ë-v¦?UîŸ_=` +‡àÕ®ú0aÄúÑôíŸ×免CŠÃ­*[S#6¶.í=Øzæ5±®|¨AëÉzïKáxhµ&½&?ÒØ2´ÖhßVŽšJ'”™×•|)sK‚Å¢P†È"ônêBXŒPÍtõÁ®ò=6£ZVQt2j¤ÏåmêߥÇOëL84F á ê5䱫1±EªÕ-ã69 ž‰0GwºPÎeTžW4Ã^àaÁvtÁaPô°SíM°p¢»Ö5*Ðû½I6,iµ¬¢ðK”ƃ£XqðËò,Dæ  ·ÞiÖƒKÓpé !‘Ýèc1²vTT• x¤ó ¢¿1“H—Š?QcOtËdmn‚É!»ëưo†éËoAhÌpMÜŠà™[èp›‹¤ÇDÑ^©+K»©S*†@TIqû!ÚÄ\† Oïw_pæ+ÑÂl°©èþ*Éw]þþ*¯*›#š¤ <ƒª¨‹Dˆ ¥vBf֢ĺLZ&ºhúŒqŸpjŠpà`+Z9ÿþgþ+¦Ç¶#cg“"ç¼y«E4DOºÀP ŒìÖØ®¤ˆÇÑœîcÝùº®r>#h`ƒÒ£š2ÅDC˜EÇQê´8§¾ãìTåXC?üœ5ÁïÏòlš‘Ggæ£ÒçÚ·*Eëi“g“‡~4ñ¨ZÑã^kŸ‰w¶=ºìycw Ç™º2±¡‚já¶œ0íŽ1^Â\Pgz¼:ÙH§šë†›6I8‹Gí–ÌЙÖ(„ç¤aõÜ[€%Cí 0}—s/»Ì–6!‰|QœNšžv²ÑO·ul¯óŠäà¾=öÎ=%äØÈì dFóYGCª ^ƒW]ç÷ rÞþìyÔ_Ë߆êšÖ q#¼³¬ øíÖ®£[õ‚ÙÅ‘—tf‚bD‰›ü’ÿøëë7;ï9Üš¿»~¤N)w^öËÞÔITûQ칯¯…N³«í3ÙÖ¶=|•ºuùãèú>û8»´:=¼ß«yïY‹‚’!råblÚ#¤?Ÿî?÷Ûç¿ã¿üwäkï3m¾_ÝŸí¯±ï˜¾Ã_HâœÐ¬»R"Z¸$E`&5ÒøÌü£øµ®·w Pö5êYGO]>óËYúšG‘Þ…ô!ï±Ôûó¥À¼˜VüBAWM8 G¥úÃg1žþÆn##ýÍ3}u:}Ø}Š×{ŽS­ù¡iŸþø}gL8u!ý öLå¹ë{(âZz1Š‚ç=&]{ä嵎O˜N;(¶ÇÀ]`A*Юeì‹ö÷9¬ •ò-ËX 40”Î)Fz¿èÔ˜`$¶z!ú—¿‘ߘî-.ø‚Pà ' ‚Ø…¡!F›Ja†t€`¡RÛJXÕBð!»7îõòÑ þÍÙÏ›Óí›2QÅUкcpg,øxëÐÄq©‰vôoÎþÒÍŽÖ^­ÆÝß0x@ ’^ÙnÁA@ÄB‚!¢ÁACôiÎJ ßn}í_ƒ×ÍÆ¯Ó¢n¹ÇñÝí$ú\®W\u÷[jèSÛóJÎýð¬(“šê…ÓÓž/¿ìLö[®ÔIä4ÚaFs—áÛÛ'‹³ofþžé{M™„ã[Ïj_„¼Õ"Rr¤¬3A£š‡;]“ê‰M±äõÑ ”ÑrÏþ¢ê+ÒåÄVë•\‡tV;­¬!Åm¬äúœ›òQלù]פҦÛS˜>~•×÷‚çÕsâýYvL’!M²nöÏÿA½³HâõÆ*ÚÀoÇÿcÞ¿çËéž_Çz{ˆAüÎùâ`ÿP¿†Ñ~Örs„óžkŠJ·ÙçTXãv}J¤ÜÈ!Î „iUóšò—¤²›˜ïƒ×ºZÛ_öÓK£´7ÖÓº÷ŠÔ$uwƒI'‹ðùü²!•!ÙÑØ(‡á@KNâ—šõÉËÙŠ*ÅU$`0¡ÝåFÈÀ² Pi¡Ù3! "ÊnmgozöQŠ Á"80G×Fƒ¦ÝBéœ$-`]4>®a]ö\U{$¨ Ý<ÔZ¤ÈcÖ’NÏØ„]ñYgL(¾R9 b]Ð7x.M>ÓdUZÛŒ"¶®oíÆ;&رé!$ÖqiPš‰ÂfªqËä52H©iÕ¾ÑF0ϲYM±BWfšŽeð+±¨qU†Èyƒ©<©25âQd©ïÍÙzî».>”1¨§ Y ±hÁ® ²1ŽÉâeáiˆ)Ö©ï­9uM±TT‘C¥ø(ÂŽ™ì"¦®g6¬Þ®'ê:yfße_Z†ŠW(~°iuøNUMÖÇ]äi|¦­¾Úväçwq(QÿÞýçFx>5z¬±ðµ÷Ì€r1εØnÙ7S£ÁZîTÎ>îu­•’â5ï÷UÁÆ󵮇2á!“ß9}òßÚó|ÿ\¬Oˆp:R“—ù½~~’º¨‹áxæHë*ÖæÄpäOâÏä™×wÏÆpÝ=ö”n#Ð[ãÕUuB¨JàÆ`›Ã·< ,¦ÞÚâYÀg·H©¼&ÜQÚ€¥ÐôQÄ @SëÖùu‚OR6pšê`z +·Z·ì16að×,±…hްx]¹‚‹²lP T¦zä&¢Ý>c榲íôÒ§¼ë½$®Œa­†eÊ׉뼯#õ^¨@[Å«S^©q«nC³` Î÷ÜŽ´yˆ}8å¨uˬ©yK’×r½W CޚƳ©ÇÕ6W|v™3Á|Hsö­{˜¸ûù÷»›ëáZzcÝúO2Ûq(ãºzåþx¿éA8¬HÅ*æ…Ío=n÷r˳Õä’_í¹Æºö„ b²ÑÛ„ù # éºÓŒ’f?÷Õ‚ ìáÝz¼uÜŸ«ÙÂ1ÊÀò³ä`ŽY ˆÝ 6!Ó8Xã|éÜ |“k~x<ò|ÝÉWZóÐ1KˆWž¥Ùú§éë|‰ókžÚY?ûÄ%<­ÌÝ;ØXšÖ|Ã÷‰ç¥U©gÿæ™Ü窋F˜WQôJ í—>VÐ4éÇT‹¯`å®V°p˜œ„(刎³ínèÃg7aQ,4·§êí•âÀ\Üp-ñ!*úí™(/5k£F9}êÏÓ›âRèc?ÙV½d–$0Ó’{ÈÃ$˜Km—ò¡;®µá–9˜Ãí°ùb—­Ñ%aqÚ¹g#˜ê[4pF z11G¢šˆ$ŽÀ+ŠS’ŽEQã:€órRsOÊÙPÎc¯ØÔë^r½\³žÉÜæ®¯è¤¯ €9wëhj«gÛqõº&­Ì‡íØ‘¹¿v81úFq­4Œ?\ëK}þUe¬¿XE#îƒÍÊGVՅǸҾ^Ó*uñÖ`‘ZÄmÁa¢bÏC¸+ÃÒïíóÎ÷ÇÿëõÜÔMú¾Èô£¯Ç-£é¨Ò4 rs½f¯ŽwÜžk®‰¬Bû¶Ñ«)Bqþ,šélÌQjßøöƒû2ôö™ñk0cª™(h€”Ä ,»5šéã¹0ØXÜ]¯'9ÂŽ;‘R Šòð±ã†Ã/ÞN! AB°¨œ@–åzê*Œ‹«[—+;Ò„ä* ÊëÐ5Óêôc WÈM(|.4Ò¸cÀ>ávóʬ—CwK½Ç­s'z2ÕHR%A­þªø:Ž™r§¯q¿Šî¤&D v,Áí7»â¼/™˜Ìï,¬WªBu»Ùp­SyÕV´f+¾–wtÑ©^±!.ý^Uy°Ì)mN®<åõ&ÇXñé‹¶8%ÐQ4å|rNÜj±M™T¨@õ¨Ÿ7Ô?û<ö¯l²,nHZ1JSQAãRRGçî£u¹Õ 4FùD€AV!85Ó½ fÚ;¹¬ätmò(zEß“¶KºÄŽI V aÜ4TDr‚÷Y¾%µ~2$•½Kw£¦±#ÜÖ'J×Ïv¬ÍaJÕ;ª š›-2MÔ¢x`âðP¼XªY«Ó½Ã‰Ð´Ð=Êb§âÀ×¥nÁJ®ì \Ãø•¹Ÿ Õ¿¸_ÃsÈ´¾Ü•Õ/ë“¿–¿üÕ‰¨QBàªØœ#ÃÎmËJMîÌÕõa cÒ¸i<ŸÍß «µÉ<Œ@ËIÚv ‰ t[lÎjýÖ/?¬?ª†y½.~ÝëN_W³.ZÄÎÊ߯Im:ììBc4’’" C6ºmcäôÈèŒÃ£‚,õàÅ#'Ð,¥jž©OÆ)"b‘/ñqÈwì›s#á­¦¼^wH«SbEûYn÷y¿Åsì)Íç_ž_²N6Ò™dð›Î¶Øå1ei¢òX@_ Yç 6þ»˜Ônkßæò¼î:Vëm4¼÷J)šÒ–¦¶±)¡½Ý·[}(ñΩÎ5ÏŽ¨,Ñ$¡3R¥‘ ÉÀ$š0€‘D(@@Má I‹ZŒH¡X J ŒÒ‚%¥)S _"ØO-•Y›åîÅ ¥I'jz§ßB—ß¶»ÚEé;؇â¼Û ÞÝ:S`ȃd`Âèf²!¾N”Ó¸p£: Dŵ/#7W Ä#=MÊ4E3kyjj¢UÀÁ‚åe哽ðH*¸ZÝ!¹IàçõRÞÄ•vʽ~Êu¸úƵä~«'µ³âò8ÿ,´'Ý{üÐôSs•,Ð ö…Law[Y–ª•ñªvþàR2N¾w"8Ÿ)€pãËßj}³Î%¹”\YŽ’º;á€(¨uciýÌä}?Þ/äðzËøX =lØü|¯Ì™UcžÌB>8þÕ<ÙþG¥Z%wR×—ú…5nœ9Þ®)\—®ûosøuý¦¾Îgƒq ®w‚ºÎgDl㬌 ˜Rœ\Ø¡klr›§€r§{¸ÿp8®­ß<ßßóaÐ W¯)öÇÅBµ`RúÈÈqcz¶^'Íà½NÖòCD–lèä¼Œá±ØcmA9]8.V˜3G„b*±Äà:[¼xU›Õ¦s J`RÃ5~è4a™:³h—×g|CQk¼ÌÇ\Žø úÛ/«È‰>¹ç|óS,5^'ÊP¦¥IçÕ8óp§¼À6Ù 1<6™Yyk—Ýržg}²q<Ð6,"§”æÔš&âùQ}NçђȘ4/»N½è,Lh:ãú$Wh¼gó ø íjt§£Æì,$ K¸M`È`&Dny³;×¾É%ä^rP[Z£” «@p°ÖÁªEœ’:+ú‘ ùâ¬êŒë¼rP-ªåd3O˜oàÌHtaâ¦.»Îî^óš!jà}ÑÞŃp7¼Øñy„n“„§Ûç¢'99f=Þ¹çwßà>áüüýÒ¿¯>#§b·Ý´fa =Œ颉êü2¿þ×ÛUÿŸ–ÿÛ›fÿ~Í{[Gù´<ŸøÙº8¿w×ox4³çYq+>¶‹Ò'«Ñ†tc¾¤_ϧ&lS¢6;³WZègŠ÷jÕœ'F€fº4S(¨H¡ÑËŒIÄ7Pë[i ºUï¶Âšë¡?÷{èYXFO â9†©÷=:ëÓ°q,¤s­uM‹ Þ¹Bn®SßÞXøÝûÞÎñÄÃÝ}åyœ1˜Å RC…õ¶@ÃV·g/;IIëZoŽÕ>4©ÌH$DàzûE‡Ž%ªÈÊ»ÛênFw»3mÛ¢k/eâŠ,· ߯Ïuºy.Ü™fE!&N z“ëÖ}‚nUW…pÙçàë]~ˆâÙidXP×fœW]ÙQˆìÜ&L“Wy}ܼ»ŸgñÉÃÃ;d“vdFPØ­#˜èSæW7=ë0NñrH<Ë<ã} ›†,÷cܺdòn™;~}±©°‚+º‚¾}Ém½ Un˜¨ýqqá…n¶[ºƒWWpêM×ûöÕ¢Á—|îõ ®­2"Àεꀕ|¿Èîê•Ú5ƺ„1Uù)¨ Ë5¿¢JGªÓ}VÖ>´à³ªÑpÔž:ȾÖDa·#çîÆïûèÜøÃÜK7Óº¨Bª¥‡6h,9ÔOE`>ñ†ÙÀ°È@‡H„¡hÄ¡·i§ªŸ—ÛËâ㙥øØ6ƒÖp¢HSª-£Pšyspá:\G` ÝþÄLÁA6}c¯-S”½ÏÀ{ø©ÑõtÊcLcÈÃ&Á!<Ĉ=Ò¸ë/Ã&ްÈ#ñ²‰ÚNIÉž\'™ê˧ÁÝĘ(šç;}®jt^~Åy €¾4ÄBxÚùëîÓ^NxBm"¬ê}ù_’ç½ü[±à%®¢5IPEë¨>+(jegÞ%Ë{N±…tËëÅVc9¬Œ(º¥" D@˜Òi=1TìHrTÂaÎkDûQÀÇá¼Z?è¹k<&‹‘Ón°:9ñ[5Ønð/îgƒ3üYÝòAº#í‰W7 * Ûöžä ÚÍÙ ÃФ;Ó{–·‹u‰¡ ½RúÅ8üËmâÑ-•3õr a*ÐË’ü[gYù¸œSìÁxÐÄu&*·ÐZŠˆ5Ò{ 'ló¡xMƒr; j`€èá5­wwÂI·êV§º½õ–¥6G5< ü¾ëó§žw§ë÷þ` [&š[QXj˜Ræ>¼Ø³€ K­,~3ý^§?ï§¢ çzy;x „jzt—m? c¦ÇŠÇŒÎßÎ÷ûfïuq¥WmH†+:@îÓÀ‚QpH†´þ‘Q¿/|ú}Ê” oÂTD2ÝŽ¤"¢.f°éM`3¶úÔ &%+A`CåA¸Óc벦¾Uù¨™LBc5ÌßyßÛ™gÈg$DðR¯wN ;ª<³©¿ ÙÕkŽ&¸ËûîÈ€8Óâ¦SôrÄõäyÁèÜ¢W2Ȭ V@a@<é ¨;h¾ÀÙXÞGt–SÛ 2#ÂÛðŽÌÞ‹Åx¼=g6$7ó>+:,¸ MïV©Í[R«ÆÓreÁbàâmCs)3Ä?iò7‚ÿd4ÐT ó—J Øa”ßí¾ Öp Ðò@‹‚ARVm†G0õ×sã§¥ØÆýéÙ°¿s ýÚ‡¿OÔJ¶ÚNþéÍÈîDÂÍkú(g¬&‹‘t=“¤7Bªr:e^·6Ô4­«Aë+‹Ptšô”<»<‰ž¡!-;Êh8ô÷§ …Ó2Ùx,±ÍLût6!µHKÜtWñ3ÚQü-)ûöbO<ëwëÙŒ]üYÎÁàhýØëçëö¡ŸT]¾¢Îrì ™„ïöRNŽXl1Ná2Ý&A‡k¨‘²¬ÓíÕÈÞÖ&ѵ»ØÅ*»3¥VXQ=½äkǼçV—¼ðø…sÁ”¤¢j8™Ë{q>²Ýé0¤‰¢>þ•š‹Îtg:œqÂ×¥»<ÍÉÔ7S¦óycj‡qµ µèÜ$Ò´«…P oÂð ÚûiÚY??Œ»R;ÊkøLäAwen'P´:Ö>·¥–ÆËíÙŒ¢4_cp¤ºz)[l;ûЍß?Ëcuß§#©šQ.¸¦ êJQ£/×Û…YGÜY÷¢ÿl6¾¼ÿ­–czT?Qo>ýúͲϔٶÑ.,Üuì1†«©±DFñ î€D¸inj.5…È&S'ž‹ *¥gšy€…÷^‹CU(ÛãŽ]ª’fq¥|š§û£Š6ãöeÍ^‡ÊN° ~&æVéÜh`S¼Ìl°³¢Ó^zš¡66;vÄä9cìˆ5ëÙ• s*WÐ8¤’°–48dFâˆä”†ZÑ‘ôø«V1ÜHO‘Ÿ8iä+…°î¬~ÏZ[=_0ÏHiëÀbߣR1*g`ˆ&Ç[E›M·Soõõ¨„}0dÏö¬‹ñ‚»æyÉý\øhª¢32ç¼áW¸_7ôuf–+ "³iÎnÎ1ç?È×;:ç3šé®¾Q ë’Õ‘#+°ƒÊpQBû}~cµpøJþ-¿”Ÿ?Þ[ùò"“ßèäÔz~ùŠnØ«”·ðKU¨PÚ¥L'²eRi¹ç|Þ¼^Y¯RßžË\¯Í=Â7z/<¥Îé´ó#Xy.µ2¾,Ä ªÞH¦³‹ölÊÕc© ‰eZ¤¬·Ïý¶ @Z ò0O©õlÒ5%_q—·¥f‡:OŸôíQ9Œˆ—ú ˆ‘#ÑÒhe_ž;UÕHzYlO¾ŒyOýEíËXÅ#¥/ÅMä#!ʼnÑ™»îÙt½<Àµ9bMLJ+ö寓¨¾J©©%dFh˜ª ÅêpKñXÕ;¨²gÚu/_§ó:ÕCh¸vjÚs&o›¹¼‰Hõü0Ú´ne}6½‚«ë‹FÔJÒGÛ›]cÓÈé³¹ÎNŸ¼ßg›n³ªéÄ"W^¥Ò>-*¹ƒ TªoÐiÕ8äªw`“4Yº6W£ ab@ PŒJ Qe¥f˜YN¹L{­¦ۥЊ ßaÇÙJµÅê…¿ø®d¢¦Ab5`–þ¢cD× ¥I·41¶ji[œÝ QOÆ&U£dg@yÌ­©ýÕŽ>•ÑxÙÌÅ Å !œÏfG¹]^«Ž1ŒqÃX2r„´ÄÝ䈪Ñ"àµhHR÷øKÇâªõuà¥áÕŸ¼~˜ë³y&—÷ÙܲñH6C ©PqˆšŠ‡Ò.Í›37<³bY3 Y$(1$ϾDJMQ‘[²ÔvëlàgÒ×<½ã~´Juõl4t žmgtWçR<žS(Ø>Ùµò–NÎSZW¿øU¹Üïvzi©\ E‘éÚß&:éÖ¡EÕT·êYD7à“úþ½NÚAú +}õîepÑôõN©5o|Ì®A µdëA¯{KÓ¾:÷÷mz+—Ko;´Ú‚Ýv[ÇzxCˆºÎ¤ßÂAõøÍõ5Íùõø†^Tᜢ‡ë’m=ßäûPÀFꨶ*Ç1¼°•¼Ízx1±jMÿTbp%Ñô+Ú‚YNmfUP×?7Ž?\?ïÜÚÓˆVñ§o°5ÖíþXä3ÍPšr-{ܳ]§åùùíŸwpNûEY4‘d EØÍÜ î{R$<û¥.^íÚhãÙ¬ED#*û! Ÿ©¾ðób=ÏÖäÛIžß}Ž']\§ ™vQT°¦éõ+V²2ô¤Q;ÌÃúä™îz{ð‚Y6CNFb×L°9¬‡0ͧNÜY’eì Ô³Þ×;­§éƒîØ{êy8Ù+óVh¨";î]o}OtÛÇÙ¸™¬öë†ïQðe/=a5–f’”ºÉÓ|Û‡f‚~ãrË–´'ÉÐXÍRO{sÖ±I}&Lr/~la¡{¬…e e¸ÆXYƒ$Xøj¤ßú™yÝë¯Ù ÄiΛoÙäyòÔŸcvþ¹µÄ{Ä1‚¯¬àÚ¬½‚š6÷˻ǷVaQ%etnÇÏž¶~õª¨¼¸Ûº¶²f|¡_ñÚƧ®Ö9Ï«¿T_çÇçë ²Ï¤sѨš‘zŸîû#Ð5šúœ9QUCÉ4{Ðði=B«­Ùð\y®™¡ùôGŸïÿ·û—¿?Äó¨îæ´ ôtlDmf~¼ó»ÿÙ´Ðn1[³üignG¨´ù^ÄŠ‚9Å.ò¥\ÇÐßœ€1…Q¨Á4ú@– 㜩÷uС??ì5öÏ%¬pS°¾Yc“›‘b@D4P E Q¨°¦rpâ–d8Ú„„2Õä%Þ驹[kéö p^Fƒà>€³çZó™äªµ¯}•c®Æˆ¸ÛºÓr:;@ˆ»-¶ßu&†H˜–ä K° CjG ¤ú)ýæQ¬Z «ms4Ž–(nC½ƒu¸ÒÞóõ§ö6§†qzùëÒŸ=‘7N“ûz.ݲ»’VoÇ#1BZʆu»L€Ø};_æF—9qúXf¹ôÚÊ–Ρâq­ý5ϸi¨ oé•é„m€ª ’µœ>`iô‰®öI;ßìÕ¬µ=½ð™òº_Ëb[P€q õ¨Ëö]óŽa8iÕ‡^‹B|üZ¡¿Š ] † 2ûíMŒ’"!#z`’ÂSBÙëS5îfU…\kŸKÕOÄcÙY³Æ•ây?Ç"‘ÿV˜ÿ|ÌV?3þ!6‡À)UžÊUMujÉéšÉ4TD(,ŒY0Uß5ÁÅ<–aÅ–mÙL%åáýÙÜ)W¨…Z gO‡j„%"(Ú¶ÑÈr‚ Í^¡ë<\“žjõë)£R.J K†”tµ°25¨tµóâ°‚™‰ 9h­9”æãúãËŸ³÷WÕÞ—UÔ?ØŒ¸%î?ôŠk_Ó@× ÷ï¿‹)äwncQ*8¶¦¸tiÚ&P¨W€gš–Ò ¥Á×n Öñ æ4¢vÍjã}nû;4B]ñtÉ®›çOn¯¾K5TÇ)Ó_¸Š…œÈÒ]ÎO†BÜÙ6`Þ¢LT Áô°%¡5»˜BóŒ%%HRmB1kRìa…hHfrqÖ‡DRŽ5v½•”ñèÞlµ’@ Q%Ä‚‰¢’ÑÃ6¾]é>,ÒŽv½_o[ Î0Ìfž÷µw:E>7ø`ò— HÓ275ft$þÄÏzŠåí;‹ÛDÚîï—°¨}Ù7oVµN5œÎsXJ9P0f»õSV®„°Zس5¸»±Ë°À 8a€´Jξ?©ù4äv]Ðü·þ‡mÊ2À6h Ô=‚RÚZLa§Ü%ˆ^ß÷©ž#µòXIúºZ»™j†Ac!·q”WÛ;EŽ ¼â±f¦®©|cǹéCŸñ\ÚÊì>“¤ „îö"¹qæxO§¯3ö³‰CjþÌáoîü@€‚‡kYB¤¼ûC’„e¹ ‚PL¤’ÍÉ1àˆNi™Ù?Ù¼]§ìS¥òq‚ßЫc¯Ïä šXýÔfO¸˜›R%²Gbl»E±“• cØQDy[°„GŸ8·â€Š¡ÃñÌ $ã…(üit'A(½Ìz–RŤ}Âè#§É=ç±´?º½Rcôo“ûIl¹;®´¢1ÒSw:yãøÐ¶‚é1µcO*n¼mwRàG¸7à[‰“V¹eÚÀYìu-Ž"Äf‰®ƒÙgSá åZ´ %ƒû6ϧû[Ñ«¿Whì_Äõ§ˆ335ÓÅbA !Ü“Ùñ<±Ï©½èqöÆ"oÌmµ°S‹ÙI ‡=M(/†4„Ñt4+l XJÑ•^¸¥«i9ìž9ü;ôÿ|é‰tÛùEã_CúŽ@rÉg;”ÉJ¶ —-}¥ewãèKççíÛ½pÞ g×…낺/•«Š»-®öcç±wšÝ0&6Ó—à+ãÑ¢4±àcÐÝ2¼ù:ƾp¤ÕZ³,ö‘ˆ¬íÐu 8IûÁm…³~×GÑóçT‘"ù K̇ÙÚÛ+Ÿãò¬eÚtŽ#‡yܼ£zT»© !ä1òa=1–*Ñ#òXVåìÜÜ1 y$]ɵÉ5oh7·¨^`§„{pºÂFå[' ;f'#‚XÑ ÀV2ÏØK”:bEg;ãcÞsÙØYëM_´|¢(atøéþãMÞå­Õvóû‚5/ea$,÷¢<ÄÁvÍâ¹.ßýY_~WV§Ä³çtàö¼¾œ'wõt6aB§0/ºTV6Њ1ï,âpÒ4Ï|ÍFÃJh ™­`}«/è%fÍÎuª‘vd˜ š’6YñRƒáf¦Ænâ:™ÒÌŠÕ¹=3­õ•¸mWÞ€¹„é×4¡¡Åe[OòÖéGwíêÇÕàÊW¢ö°×ÎI"IœERºÔÀ‹Ž‰åŒº¥˜¦y¤Á~×¹FyZBÍ>«ÑÑ‹‹ÊeËw`q"0+þ¶€½S£k=5‚qá˜ÏÏ ,MnCd33 jzao'¯Ù¯È0§.9ÒAãÜ›s×ÓÛ ñžÐ<×Úôã­zi>ÆëÐ62C5%àgÆõ‘G”÷þê·ÕÃzMuSMþêb ¼Â/WÕ°–Ï?•~îYgýª÷þ {슧ôü&Rõ¾ûk›õó‹µ/å?BP¥á…ÊG&åÌ—¯z$ßV‚³É?C]Î@½A›’ dŸÆ9š§÷rOŒÙD |,6åC4Ö{AÝÉå³-X¨„­–¸$ÑTç6Ÿ¦ðs•‘çR݉yTp”D4°št㙇ÂûzÎfuÍ£Ý`0Ó`ÅâXÙ,¡Š/}±¹P ª) oÂØûÞ^Óº9”67ê8qŒž!hh%aé Ö4Õ5cc=J˜]Ôâ„Z´ÂÓ(ÊÃ7 ßÜt–CSV©Ç¡º†šZ8…‹ž6˜¡r÷µ~: 4¨…k» ŠŽ.qÛìNê‡{p]§zÝy©Þt”Ô8Põ¦E©d\õñÕ±ø,Þ†…b<ÕDEWíÜ«#îœvÏÎz][®Í +¡{!ÝSôð Ñ>††ê¶}ȇÝä ,Ÿƒ´ÚM‹Å”¿’„ @¦´žšÉ¶%Ä)°Öܰ´ÑµÎµÛRôAZ; X%0¢*Ú€,‰‘µ[;ªÙ¹: RgôU1ÝΛ¶´kÛT‹Oâ0°¾`öxk˜öÈRš­&ÂØÞ»âsYtàN`ßÚj•Z¯Ÿ5ºé­g‚/f׬¿Îõ×¼¦½fík¾Ö-Ód«X=脆XA"j¨"*‰‚‹^Xeyœ÷ÿ¡Ï_ä>[4b ‘ n `£|Àä –D$$CŠ&áø6\ŽGz+ˆã´hºkt‹¼F{Â}Ö³‡{੉µ®úyì÷ªh-ũ۱Rh'¶ÆH Fˆ!¡$ÄÔ›½¶Ó¾Z #§Í}Æ•zcç&™ZJ¨5oC;ÔâÉW†õùv±¯Ÿ=íç“j·.1Ä8P±Pȶm'™A ð zì^5ÚãÆÓz×sŽÊ§žTÂòëîãÂVÓ Ë%{ÊòçáPJô‹ÆMZ®^±_î'eïI [0ÑXF@ñBƒ(!Êh\†\DDaÝÊ% b °ˆHX#–˜ò@–#:PÈGhÑ´º#.¤Ðóm_G‹äÜXÁU;ñåûëoïGÍêןÂ×Á‰©Þ† 1aø EÅ(¡i,Ä0DDð…¨4ò5`\ʶ*9Ú‰ *.¸èºXÄ3Y¡Ð`ۢǎ èN—¾žª›ýu’®è¶zw‘î!%¡ì0TºWsÏ;;õ,u¦ œ×W}Ýî<âj|þ+Ü»þ^»ej#M‰:•*% Ô¦¸N'yUxO¶cI%ÅžY–˜Sü¸Cˆ³P!(D;ô~èé¯þ½Û/ DÕJĹD¨ß¾´£w}Q4,…ÈÈŒaæp±BÎvúš’†=°ñfýÍ ê®9àþA×¹¼¯| »<z½ÛÚgkøæ¡ËQt8aøµÕõVæ§c×é _äþ¬]þ)­ÿ·;£tÛzrþ®=ï­ó‰\=:¸í\“q3^Þº>rõ¿?[ý¼8?±BM@%’UyTïZÊJ“É”§÷Çqísc]I±j„0b.¹N}–²£"^}ׯ¸9ÑÑuÂdÒèFKGUØ ©ê§^L*6ÔÕµYµSa'/ «²®†ÇòuøÑO>˱ؽF•MV05=sͫ׳S›X ,Jˆ¬âÃu#`×éš=?È&0ÜÄËí½é¾#?›îˆÄÉ¢)ÆŽaó³ßcÅ9Þ‡¬ +³}ßý ˆÛC¾½ß)»øôÒßß·wåĬÎÍ&½&ÒBÀèD¹ñ(gœ£À‹\zÂùî! nÓWþ-t G€T×””ÒdìòË õ‡ë㑟/éûùèq}ðÝûYöuûš×ÔiXõÒb@4†D ("áµ2u]çÌïãO詌Ê6¿÷·;+ä@Ó|×ïö\+vÁÉáu†6¡˜‡Ö?š~à‡›‰Ÿ[ÔýþÛæ¼ƒz2MYØ >Må«À<È é25lmjðR·ˆà85᪪;™ëßìsE~‘l_S\B`¦Ú0v; >Mo€)ß’w9¥¢8xMòØËÑNõƒû4«)×<MÅ3i­õ.Á-Š@¬?l'G‡Œr HÀ€ÖùNé—äâѼ—ùʽ ¸æÂu4óV’AJøNùNÓ¼X%>PugiB¨"ÀqÍ 'Zj)£²ÑlG |Ùoç>‡œ­S6¦9;±ŒÜkm¹H4»Úëå»rçèºMýºÛ…^ŠÏý¦1AÊ+p­ê UyV>«59=Sc4ºÂFïÍ{¹i·T>´€œHl$\Ú!ÚS‹¡ò„ò*pѳDkäÍÿIö‘fa¨T¬§ÂÍ”Ö7òb²ïó‡¼vÑ}´¿ó)~a,×3ÖôuvJ~ÀÄ„X!¦8 Ój9šã\€ZVçÍ!÷¯ßË÷ðAôd¸›0‹"ŒgðŠ€G„ OjSÇ<\ Å+úùªn ²5z¹»ÓÃèØýY*3;¹Ù||!u &†®Oy=…äAC¡r%TR æ”Eä!GÌXñÃùãªK¼O£¬ÿ+hÊÿÜ_õ¬<÷!â]×SóßHÏ¡êÿ¼±Tê¿âÎ_É|&EC2Qà™øøb=¶gõÁUqz?®¾þìèõ_™@_ÄÒ û}~|OøýÔ©F„íHó¸€Þ! P@C^‚Rnj)Æ{=/4Sáí^*_ç;Ó×úγ²;¥ˆD¦4ˆ¤»‹ µÂQŸ»‘WnTUfY*EƨҺMv­g]ýúþÁõq>ÃÛ]ÿú(ècÔ Hÿ³!Vü…ì:åû{^óŽ ÖBÊÕŒ[d<ó„”[]…"Þe—4ÜÇf²—–Ô2«:R¼íñy¼å@]*Ö)hÑb ‹™á»éªö~ÐÛôfúÕRu\±B rØ‚°µV·¢$Q¼ÚX¢ˆÚ0u–2@æ"^Te ‰Thµx~ÕÏ1LDuÛÖeÅÇ^†­”pê©@ JÁXªÁdNÉ9 q[]çëç÷|§†·86x¦€œ•W4iZªÏ>ÿ~ËÛ¢[#d­…^[·[úÖ£5«•6M ^]=…l¯?Õã#8<Ö‰ž("ò0­Tþu÷ÿEôŸFR/†›æE· êaw ih€ »d$y<“’é˜ä‹«ÓtÍi—_BY=ýMÉmP>a‘¿mß3oÿ±ý“ ñ·øûN í°=äiËí§êK“q¼ahÕZ¡}ëò=Êhyß„êTkØûŠôi¹¼ö™Å5wdõÚï^Ì„¨/¬@$RTÔñ› üP-¥l[)¥Ÿ?3æïÇðã„>Z b·xc®­î%µ‘‹T2æ ÓëqTc¹=Þdèú ¿¯ óÎgà5ú¤(ú‚J…×ÍäÇ@ÝêÛ˜žÍDt'w:h{¤L¡Õ™ÔЖ,ÀOG•Ü^R rjæ‡OGŸ—E3©´ÜÉÊÔÜû‡FÝÑuô…Œž—°Ll÷º]õxŸ5„Iä,l€$Jè ¤i ¦Í, ¤kÝ7rŒ4ø3Ø"N[ÔËzÖ¨s$îê~ƒÄb5Ú-´M¸P û¹l¨ÇNIpÓ€:@ÄAÐ 0 УY¨À€ýúFîÎûhÃ6•_œkýô~cÑ¿ðºtëØ‡ûxÇ_86Oõ!ÒCÃYd&"‘»°œìX@VvSã/Í ½Ä玮ïyV_Eª Œîö5ÞX –Yr‚€]ð/Lý“ó½ñ¯"¯tpò]ÈŸ#“ƒ±@EøEà?¹o¾Z|Éô¥×o^ªÏW´Þê^„¤ÚSºåp:ÿߊL6צªê7Ï몄7À3frËÓÁÔƒ ¦ý“íúÒ¶‘q9Xä“ýµw4x #=Î'ÙšGf;ÁÅv7€Cj×®ÜÖó›vð#ãrÄ…šF±&)îÀ£òì]Î8oDnÁ³ða—.䎟OQçæÛ( Nç,âR†xK:>Õd}ÁX$0̶áPXKŽÔ… áX?g}B‹9Í÷èkît· ¬œY »„ðë‘”¾dOˆ&úµŸæl”ä ±¿Ìk5AßµÖ5"¼Žò£:¬7=Î,«Û§ÍQ’‰=¿êåhuA|ñòXÓ}AßïSF þí·Ê:¢P€<òÅœqT®¢ã$¸€—Zyð<ÿrÖzæ×¢vA+ººzö¤ŽSõÕÏ2&·Çfk[†kGR^zJ3nb@‘qXR;]Ú®\%f‘5,5e…Ÿõ„íºø&’•!¤-xäÈyW®>~n,ÈêÁ‡•€'Ò4ªKPT§”©×ÀoáÕÍä- äòô¥u»öµÃKÏ‹fùê ]•«¤ü¦NMìôÝI^×âéi:ä,üü®ò‹6ù B1ª´ušd1Á’ ³Î¶$”¹’›©Q!±ÝÓD§X€NŇ>ok7¸m?†>%þàóÝVä#¥%' <çµ>¦Š.Ù­cå0.YZ•LÜX‡«€5źWé ){Œ/” :ÖRe›€]”©—„ç’†öÀÌ:T‡£9{}o…¸-¡kU{>á ¬e.na>£²æ>ÛU:YD{ô¤:µ%p`ÝÞÌm9 H±‘åâŒÁÃ)Q &´"ÅËRõ˜’í¬Î/†4±I÷œwF5YÂÜmÌÃk®Òl­7¹ëó‡äO}Ù» Ê.®ÎIñI­ûËÅ£ëUŒ9…5b`—ºöl G*]'5‹Ji«â0ñSÝÝv0½§›Õ`[âLÄ*βǦ›«_E–)É~€F ïu,#ZHòcˆ[cÚ@ƒ°1Ï€€-Äc‡v(¥ÊØ„Kv:Ø sûÖë¥&S}Ïùøóç/þé‚JÝUÞT—"ó«éWÕÚ²àŽ'פ‰ª¦ìRmN/¨ £xèÚºŽëøì{š8»µ½ÂM7É£8óòúŒj ˜©Á•¬cÊT¼ •Q¶uùCî"»D‹K1ƒ,€Ò°ÖÌÕÓÌÜ'cñƒ¦Aìóá,ëy!Q ØN7÷bd ÙÐnh£Zv ¾IåfÇ,Òœå¥SüuðK«±»"®é^f§«‚~zñæåû›ómÒN‘ÎCBª(ªHÐ2Q*úÔtÕ€±È'íö—šm5›ôÉ~]ŸùÜÏó/åõ×òZ‰ŽçUðgOó5·Š­q ­,™lÌøºÆL‹–ÌuØG¬üN&0#ûºMž­2Ý©ïÌÔe캯²ç|-$5ž6- -]œ’™XŠV d»Xª•8H+ÜJ‰$v1B ´€B(( )qÑœ±&Ð4ÚåååÅ‹ÝÓ¥ûk¦R®%­fgŒR§À*ß®šU§?À —¤‘<~žó@<ȺæC[ÞL*#zŽÔH‡˜ˆŸJUvQ‚üäHÀWä6òˆ’!x!>X¥‹DUDz YkÀ­@çàÒ¯{ý±Oò .…ŠÙñC_ÔÔTC½‰—(ƒNéG GIþKFWÔn|÷ÙS­Y—] SÖGÄYÚNa4ôq•¼"O’Ü«¨D° ¥rþ™â–þå©R(=©«6Um„¥Wãª60øbjUÅ€'0ªrÔú–¡’F¯úG”°ÝånÑ~ÿ¾´oxJ*¸J0Ä™|¶–thGy銓ºbW) HQÁ£ (%–ð€ÑJÖkê}êãB̈Ÿùí˜(Nÿ+Ï¥¾²®ÒR‘¢È+ÈmÂÐ4ã ÜNw'=·ñôÉǹeq~¹šQíÃzÜÁá׋ì›—HjÔvQùésC ŽÊt6ÏÑ™±$”c³8Ÿ/‰¥´4kEm^ ½ª½åÕ¼y͆ÛÓ.„…‚g 䱜æÙÔ©K Ó&ûOê¹×p50ŠÆ!dX˜Åýè~#k|ÀÞ_äbþTj`U¼àÚXÏ[q¹S •+鯋ŸCƒŠª¥öîBÖ¨ô`SvÝ•0¥Y”^ʃø)\oÞ6{m5ØêmÜô.+8qv½ü‹ú‘D-gѨy.?¯¦cjM ®'{Ù„^Ç*˜cÝx˜XæÇǦ P?An´›st†:›┞WMòVTT¢7,¯û·8§Àà&YÃr«­1‹UH t M:$¡>é¦ÖÏùVÏ]ٟŧT6ý¢'«7ÃISãöœhɈÊñ{8 ‡åóH>Áµ÷ .Æó¼Ø‹ïiçÔ> {¯û;xE>gº=:¹y/ÏÓ{uê7ÿ<'¾“’2€Açñçu³}Ù™ýýăä,(¹A­PÓî{¹_ƒíÑ}t4ÝùÇ –PÞ™:•(¥ÞáºêÐMS˜æ<±;†´ª´yyW6?:;ô¯ãÞc– í‚C a*²3œÒ^^²¯-;±Ë'Žë2Á?®ûÎaçõ—Ît›ôeÑLrhM 8æKS¸6‚GâºÎKY°¿ï÷â{dÈϬ6e¯¹Î;J†¨ã¼`V¬AÜb^ÈOà‡‰ï:Æ2fÌà÷C»¢.<ç’vwM@Ü.ïLö¨e7ž¥±õ²Çûô<Í&ÔR^0Tf‚b%7V›âšîØ÷ŽîJf"â`P O¢8àH µHÉÂõºç²:Ž«ÂWXxìѦk\¼Ùl{Óý{ÿñþ^Ç{ý×w‹g?/ÁN1¼ÏØhÁ÷8·@÷ñDv±ç®x"ø¯Æ€®Pf#D¤Ê06€‚™š*ÀI_ãÌ_{öf?þ+üÂë“<ÀÜsag™„~0¥8½JÚÕ!Û¶5E ™=rµ¬l›ÊúoÞßSoÊ!eÛ±V®¾Çˆk^× +¢ Vžßn·Yjœ\!:Ñaž˜µ __õ†s]jƒ "únK eÒ3ÇÁ\u;´3òG˜ãe2c%sÄsrÖüptãNîöêÖšBÿé¾þsëÞïÑþ ^UšÖõ_õ_ÌÓýŸ+æ?o濸̽ž£s5ƒ–+D~é jâììãFzÌÿ`Üÿ ®ÿXCÿqè»vU“Væ—2›zý²Ämúdº-U’`QÔÀ04tÌe±¢¹„„“Ïü­ÌAø©êö»ëøôò´³ú ˜ŒÈ6ˆ °I97Ša»á¯l Y‘i*HWõ/IÃ7¯Ôßåú¿¼`¾/ûÏ{ý}~¯Ð8 ­¿Èò—¡ÿõà_Ä@jÈ2L$O»Ú+C¯Ø1Ž8Óhm'#­Â æƒ¹œ«îš×ÕÇsUBBÁ5ÊŒ©ƒ`AöÅZj÷©û÷â#WÙ„·£l…ILñMüZϯ™?>_Ýz:ºh·Ê¼Ž²Ýòð]ËéÏçA,n*Bb)P„I‹O,Þ7u;³Îë°&G(ž'ëeg­bö‰óýþW§,Á¡Pb‘<À'ù&ý¹´”Ã0û;¸qnäŒhèFüü3 ^”þj­LÓ¦1©¨˜´ê`Ï ïðâ §y›êÏqĽYäJU¿©1傲̪cöÈ$¾î>¼¨‘IíÅË«ó¦Ì"ÈáAÊLʆ'@Ð,Ø bAw“!‚“ÛO¹öælôYŠý:1·uz4 Ñúa‡ ô•oO9ÝËîÒ|¯;bök[[r·÷ãA4cïÝ8–ÿ€’i”cBK§K6<Ó*³¹“è‚] ½)¶%3Þg±GÃTÁEJ' ÀÑI{¨…ŒÐ:*çÐÃå™êõ÷>ÿ­Écmíp©ÄôŠÑÆLsGR ‘°¢XbšW(òñrŸ˜œï3Zxþ‰¦¿—˜ñ•3þì§¥×á;7 «b1¼$6úÁù22N¥_!Á€a™iŒy°ÁðmPÐRo‹7&¸9–6ŽE<Âï;?¬1z]ÌÊÌÚú‡„†µ:_÷µá žáÙ‡v°ÉÚ´Ø8œiXcªN—FÍ¢)U¥I÷À®Ø[ãºIqK!Ãå;_©G(ª•Aþ>Þ;ÍÃBáÍ^ÕZ¢6÷¸<¦¢AþÊÔŽ›h²!) °<Òª5 S' 0˜Êÿ·%úG¿»àì…@h{Ð÷çxiãú³Ûòlí¾Ô¯à¬žÇàÃ]Ê€ ƒ‚´’å©]ÒKÐCÝ.‚H¶ÕÅk›WäXÔžüŒHxbØH ”dwâ[­´b\ü0à—a¿D6M}æ{D’ûýP³˜;3”í?Ý ïT~‡k÷¯s gãƒI¹|+ó]ŸŠéS¼†+JW&ŠH'é„ ÈN@ÏžÌ%í—¸kj‹Û¹|ƒ$Ó ëéyõðŠr¸ùYbÿ±|0´®énkô¥Ò‹$/J!Àeö])…VÐRûÉ1/"7/-êL.wºèâ¡ß_µ+‡­…'s¸;45Kúºjª#bŒ¶o³†Eâ$‘͈wåå+ “=ÓÌ” ¬\Áï±Ù*‹†Ò³¢ß½÷¶ýd¿c <ŒAµmï øL#åŽÅeñØ»zƒ|µñÖÎ/Ì…’Ü>—ýÆ è¯vªÅ–bd憔:Ž»­gUpv”*‡Ì5¦‘&B;:],TÌérλ¾¶âÏsxŽé~¤°ëãÃóó›Z“û9?€YSàÙ´ÄèIHZÖìtË-Ï9pÂJ¬RÎŽa©ô¤Ÿªyà½SÖ›®¯åZõzžýdí«*ÈhvÍ”T‰#òd½Û-‹;u‘m<»¦¾õÒ#õ.+‰AïĸåZ†\æ“ofLuVâ§—îòòÚZ‰’žäJ’ˆH ç¼ !!˜Œã4gb (Ÿ¹r»†uH *kbÊ÷Xö­)ÿQógž4¦úüª| Ó W&»âO|,$­ê£et‚1†"™íƒàí¼Æ~Ñ%µhˆ3bÏôΣ¥í¬-k5N¹ËŽVÑ‹ ×ÜÇ󢡽¾„¹íZ)¹ÜŽ"UÛ&3¿=¥•93ZöTÁRb‡*…9¯µ®hCn/ÀÜÍqÙ=œ:W•^ñ0UjT@ð8 ¢ëE)Òi)gî.½† èFåõHˆ…´ª(£´Âºm€`c8{ªÐ ¥ƒf¯sµ¯­×{YçLYWU‰Òϼ³SpýÑôüߌtÒ?÷™tdFA}œêl¡E4¬‚ÆÎ8մ⃠d´j³p "w€fAK"F¨´Ÿýü¸3ýå½’ã R•½å¥\$<:úÖè—3Ž”éåõkwžÄ 5ô²’תpußîSž½žC3lÓÓ®õ¼s”>öZžÇõGnn£ J>“'»—›)]B•“å(&)!"Î2º¦•i’Òˆj‘V-ëÕ´NI{•nDõ­a0oX¥ùªb©¶À —b˜®æ·ÕzPÌVY[C¨”¼ ,(: DHc¶·Ñ¦¬WG_MMoõ*Ù’Ù.hL%á>ñÚÕŒfo?³½vÒ*û晞²"Qªd,H0˜ ‰‰R‚#AC‚4*’œÖu‘‰›qª:›Þå³û…y•Fç¿ö/ä¥3ûa©t–ìlûþ¾×NüÄjÚëêT5$c+÷YD’møŠÖœ˜xwÒW™Ë  ¼š1/à«Ð{†=wïõEvï\wìH'IDÂGY¢ Wظ-ˆiƒbèÀŠd ÇD£hYX"va5ñ‚·4BFAD° dÓQ¹°¬`ºÆNŒ@ @ã0~ŽN«èI‡º”‹ÔLàíæXzUìmcƒ Ü‚IÛ¨„›«îí^™ö8Û¾îpC8›@ˆ*Þn0“O?=qQ®3(Å|‘,pEß¶Å׃‚€o–_‰=:QJn‚ggF²s¤àTG«nC½ì5iö7nÆ02Ü–>b‹Î´”ÄifUlQ£`Fcƒ·›0´©Œ²¸Ö's_eïÎû¦ý%{î• !…J^¹1䓬Y÷ÏÚUTØØ»xk(ý* ^ äÚÔ+JÌ¥3R„’" ;Š+šàLúJúÇò_ÿgäÿ 3ekÈz¹²i¹µyá¼}¨!¬ûVÔî%V­ûb‰G=ƒÁƒ ªc[Ýš Ãz1¢?Éñä9õ¦Áëë*?‚;0”ˆlìfFjñûŽôóÀ?:0bÑçÓÓ‘{ÛLÏž¶%iø:φ|™Îáx´îyÞNžU¶ß£é!ÎFÎ4ÅËM¸¬EÁ°Ý z“³Ò Ü"%;Œ ,ã—<^ñÛAý3»ù²ô“Ù@"¶ù*-·#CAÃ4\é|<ÃÐ!í]YØâ,eÛ4í$&ç.\Lö5KÆþ!&¹’Øo¥U;}fI“5Á ÖdêÓ^Ú9ö–ͱ·¬;UiЩZjR%ßwy>U\~¹úÂqÆ¿r_×LU¦sÎcß?>"l‘—ø|šiœáÑ^6HžÚÌNYdž=“:aá$r(ô‰Í%™Î5Õߘf”Z4ÆŽ-¼HÚXîv33 “N·Op®ü=/¿6üÎÐjžÇÓ5ç& ~¶îjÜÆÑ(]<Âóëìñ>*ø4› KÀ³ÑY™‡sœ‘fjåw3˶Qx1j*ÂtÔGаxùÄë¿þs¾ž2÷%û‹ð|ËÀ\m†÷[óúezòŽcxpÑ]&QF'ÎwÚfí*Ë ]çy/º¾“ÙûýǰÏ­e%fï§·o|«°Š´Õ¡ªm›C˜ð ,X 2¢,‡X$pÍ((³‡Ê!¢Ð]I\Mö$|ŠJÕ&qdü÷ÓÏ“ù®ú‚__ø|Þ/@²¬Ó´HÑE ‡<äºRýMvx„|/glJ@QQ…Â*…hÊâÜp¤Ù^oÝ’A¿jÆæ¹â¿¤œxŽœ§É½’Ò9jQÅ@èɨ¢F- $3M: #ßÙ}^X0(›"Ájb¤¨T¶ÒrRk£""ÐL‡>¼}¡ $ ™w‡Ž±DQ5Hã÷Cßqp“Ž6iCB¬Îž~/ÏOD¿ ˆd À!Ô©XÕË}h6™Œn[wôsÏY«~KØ›!LÅíG[éGûÖõ_CÈ‚öP‡Ñ#õ»˜Ñ --­¹Ç~ã@7™W-P^VþZpkiÙ²½u’Ÿ©½“ÎôüPtB[FÈAáx¡ˆ´ ¢œ¸FéApí¯^½Päu¼þ¤õ“ænhB&8BHÁ€ïvÕ\é”[­}yW§ Q‰ÛC2ºº1bH=Z}R¯ZÿÜ|>ûuÖû*ÉïqþS#ðæ/E~Kû©1*éHãüV\–Ø—þ#.ê&5ÕÔfØf傘ÂrµwbÏR7$¥ÄšWŒ±CìfÞIc¥â»cf^'¥˜AA“q3´¨Ë‰KÂ-ª†„j¬ ö%ZÁa$¢ò¬Wª{g¢«.™§0}¹¦æv×Jè™@â¨ìÅiõArß¼Ðm…Üç18ºûÙ&׉ß* v)D1THÐ\b7Բؚ×.Tï[Æ…ªœpR†YHA/‰>§€–dÂ*ÈIµ¥n.s¹¥4q¤¼Iß`-ÃϸÛàö>´n¹–ô)pîw¸úáýh2 û‘À•lÙ° m͵²èÕ¾ªï¦|'9t9~žMe{( Ù7*Úùpý4¤—-Û£Ìþ»Ü—ïq²×y‚uÞG§»¡µ5«ûm3ú¡-)ÔØŽÒŽIØ1z&5"#’«j‹RGd˜Õ_ÐÎp¢ ~ÑiX}*gñ+¡þx*—Oö#iCwT+ûæÒ0¶XË×ÃÙ¾’Óßתïg<ŸÄ>xöèCþ©BPó| ÀûpО¼‹€\œ8å_NnÂb…6Œk…=;¬èÔ7~·ˆŽ·óóOn8¸ ´]Ýý¼ˆ “¢9à2†•ï­íÅ #š#gTœÐ0Tª¤O² §Ç&:̓M~CîD²UH9ìÖæeõòÝ›wfŸ›.ÙZË}X~«öè'ƒá¨<»rµ®$ÍE«3´Ë@¸–}»–­ùmlÞ}ð¬Y]|$NõmòJ$E™, #9b{ò‹ ËŠh@"0ÇúåíkãÓç·îòžÐиà¨_ø™îTAØž¸ô%‰s7|÷¥í×Ë~O@X”(¸¢×NÒ(n©g Fl€j â¢6jªÑ},±{¹›8Ò`¤Lã°×#£Ãc+-£í?má¶´¿°ôY8Kÿ×¼üŸ#¹UáÖ ×Âm£õŠ È‘7uæNÊ>Ô-¤>E§„¥þJÏS‡WcÙ#ЬÀŽæ6ûÙ훥)ø+ ³DMAà…ƒ%CûšŽÙÈÔóŸÇtÄjåqF7“Ø`»²±ƒw»¿R‡¬ñ\˜UßR½ËŒ³à‡¤vÇå‹'DyÖKJãÀÆâsG·Þdb0cH4b—.¿X«E³†O] ‘)¨q.Eуu»gd~æ)¾íÒðÙÔ²r²ª5 zÄ ÇG÷—‘þKÇwdnP;”Ñý“$›?–þKD‹c™¶×€,šöºÂpjb(Ì(@Çè² ’U·_ Y %Ò"-’²¸Z5"»˜ÎnÕ~W܆¹ñÛýö‘ð¢¨!ð£¨Ý¤FY.Œ BS D@«°¹k„NaŽgQüàë–ƒZâ8ƒ×|‚_Þ\<£÷£øªj¡S£Nº@`ÚE¦¼jVÌn­é=É »œ<˜Ø¯4¤QJƒ0½W šÇ=ï—€ù¼ý#pa³i=ϸ–; 6uä–¨ö·†ØÅ.–|7uå4c}›|A2È>X²Ž¯ík}ãü¾ÌPϳÇ+™ƒÎסÏÐQ?¸/Ÿ£zr²ã$αx{ÝÛˆ`)´ƒA11MÅÖ[Ý»Àj ^"Ý=Á`€@…2²!‚ Ìêywí°ˆATF¨W{çšåê|s&P{.fI_%L*(Ex˜ ®iCЫɅàFÓA0¸£úFí³\­Û׆â\"8áT’S¬«]³&LÂ0жæÈ;FÖ‘ž_i¯+S…€Ì*FÍW—›®vH‡VØŠ3ÙH╤.XíYãY¼H¯·_¼YÛ«bnW@^6ò­n%WùzªwªÒKõm;êèe|tºe3ÀøâÍêóWìr-Ex\âLœIa­Iu—kT§ „f-yάÀB^ƒ2s茘׵Z17£@‚ô‚ÀSè.¼s¨`X«6R%šŠWÎãt™zñs¹ã{Öý´Ò)Rߣk¾ø„(½ÆµuáOëØØ¨ärŒb·öw$ó:²z‡ue¸ú>Ý£dÕQbêØ¹ð㿲ýr=Éž±í¾˜¢v5?2˜7 f,ˆW ‹ ˜0¼u~‰Ç¡†Åcd¦×§x©ŒÝ™XϽƒk€®sýxºµG=*›çÌSwêM{1)ò¨[Lã½ëh¢W-H•n)ehEB6aHžC ÄfÜ.¾Â¬Üèæ/çõ©¯èýÝ"ÕM¯9£ö÷þ8³?þXüÆäšÿ’‰³ƒ\ûi±ç~rkHeÇ—ñùÖ›û噃-༅ÎñË·Æ«×ÏðÌê¥ú®S4VÏêÚï!…³ŸŒ·yq]¥V¼c—æ“ýZÔyM;[¯ ‘a R âÉÒêWåêyÆ.¬ÎÕ%a_ùpÉÛšÜÎGn“ÒÒP²­ˆ‡´" SlÊ¢V¯hã ^©QÔg”„¶)é&q¤"Øåre-y,Ñ«¢$ßÑa›8IÅ7Ø1Wi+W•G §¦2]â* Ht îõ½^ƒ¯>}ò¥Qõ;'&EVD#Zµy»W¿lçU9©D¦øàK†j+Oq^¼3ˆ¨xÿjZÎ¶Šµ+I2¬2T]­ï¹Øïµ|§ŒÌ 3"QŸRA ðéÉØg1@€ †RRDd‚R2ÂÞ€= †‘­”@ P),,AÒ„gøÊgéT†§hR*Ð,……`™fŠ㇨œ””`Ú£Ák©È¹pˆäÃ@H…<KE .=óAz%ùå;¯ûd¿—¬œÀÇHÌš4,p¯„-ü¢¹ ¾a,R%–š`Vú8¦6¾ñâN‰Ÿ±Š¿mDÃVõ£qdÎN¯ä'æ’YÂ_$Þ¬Þ…:*s:Z+ó=×/: •RS‘Uµí?Çts=x2"YÏ™™XO`ŽÍõÅòÂU^Ë ´Ç•SA†;šñΞ¯éCmK]’ ÔB%¡_Ë*©ÜÉ5BÅ‘iF¹Ã5>AF&ck®ù¨]-¢ýY“ùæ?æ,c* ñ<õͲþW~ÖœS^PqU籎žçRÞþß±¿·µ'”9óÝãÁQÄçqÐOeÿ“,ÿ@ŸZÉGª`)Ä)؈wËg|ö-ß=äQÌ‹…®IÝ1â×Uy…qkcü×>‚ÑÃl•9žÕ8¦mÞ†%³Œ}#7ˆsЍdÓ/jKÊ  ±0™äÂNñüDs¾•è,éyV뉿S«q˜»Ïµ¯ûȈ3ûVTë$‘Žô,ÚE Ó²°C«X@ÉíŸÓ7~VqÄKγò´Ȓ:WóªéÒÒŽt$øÉáh=R ÖÇfg0òâäêä%Gï“ÚIZ£YFÏ=S}pü0½µŽ :gEÞ7ï²x‰$k¡Žž‡÷ð›ó{âÞÝÐú¹¡7’&¾">–bQcE§(Be‘³UhÂò5÷ẖVŽ‚+cr³ ¤Çšê{êçÚ&6§ÅC7_îŽÒ qXä ¸2;ÃFdniV¾òsê’ôÝ÷]±·Ê}ã1ô{cƒšÇBæDX3‹*Ôá)¦ÁõQsו2Ö÷ÓÎ9Õ {?¼ª%Í„³­¸ÙB\jT¶Uôiæ‡WuoÁÿù鼦ه]Ø_3‰U—3£'®ë@UŠ’oÈé"O}ÚÍâj’u2û<á=̳SŸøÕ×·?”ø±<)º®>ùú/x~m;üÛûaêœE5F}ÜýÈÖòë"V-n‡èbߢÀw|ü4|,p0"Õ®ì]I½ÍÎùªýÊ«¶‚ŽoÆòƒžŸ®Žø5#¹œ‹pí=ׄpÅÊÑsü„+Âso¥©“‚;ŪQGè˜Ï´–éþ[苉ì–™º¸ÏÈ~Æxè˜sžg½=–9N´}<ˆtßo›Ùƽõ¼w¾«Z?§7cÍ¤ÚÆC€nMç‚»úVÂ.±ª{õ¾§ p 4Æ\…ʆ}®æ‘FÜ}ÌD4ç4Ц5ðþõ½|Àrø¤Fg“{ÿXy™kÓè¶#‰8Ã@È ?D„ör“Ò~w!Ö’f Èy¶Éº…v˜+ÁæÙElœÄ>ç6iÄþì"›Þ½íÏ;®¯z}ÞÅã*J¦^#÷ýs§mè¾A‚F<¢s›á½«x 9é—žßϽ¸ñ„Ä Qã*"oÁèÓÉ0™v£|G¢5(±ÑSl®»;’’ÅÀ1Ðî;çÙKîÄ¡%T ˰Úܵsp¯pÊ€†¦]ö ‘‰N¥±—¯÷ÕõÚõ íl@Û¥%íË•A˜…QW­ðuP] • E0@A®ádK8(8* [;Ä{°n‘’÷½#ÜË~æ%¦ù¸à äKÛNû°îðR'©Ø²åÀÊŒ‰`¤¨$f@bl¦‹Qÿ±VeLªe¸¼4ƒŸSKPµHË4‡L’™ÒÖ¬îv÷çhOc)Û( ÐÀ+ÃW½ø·úrﻊwÿÚg?.ü¶¬í4^ ŠiT§˜JúLímð·È¡_öðXIÞLÞxië,Þ‡úvéŸÁäác\[aÀu „¸vÁSàOÛ]$­+µÒ ï»­ þ&9Tއ =âi¤›ž!U‹=‘S\k›g½dµ_zÈF G'qÂl°Tc=“È/¦1g<ÒÆ‹žÃî‰,³‰ tíˆÉB;fâ‹ht%©páˆ¶ŽÆÍ{$ä)¿|‡³]Ÿ¦³ƒž™;™uþøºVçÏ?l#Ñ…¿N>™·¶ž=†d°F5¦èOz5ãOéÅ­ÏÏç‚Çz 4W~'§—ÁŽ£ÅF½¯¿ž?\—[Ü;ñœÖ¯A_xíí©æ#D'§WµDÖÒn/Õ>iò>Éýä¿n†Qàíw”H®@süŒj•Ïqš©… 3ÒÍýÖšê=$ú–NÃõF(ÁØ~¬…Aoï1>ç¿Í}o}óP'±‚N±¯8lˆ×moõù¿Š|ûsÈŒ–_¯Ä'Kï廦7;:B!p$¶þ}†>^>ÀÖ»ýÈsïûoSñcm{ø¸E¯Htða$ºÎ! Dïy€nkž³G)rÇåÄ!&±½*ì*׳oa&j£ôìè>,f5o“]73|­¬,›ü–jû~ñ5äK!Yx| 1Š¢EK˜t—/â(²Kñ™ÖqHÜd4{ƒ¾ Œ£äP±jùŠÞ :níw™k[]F7úUžs~ªî0ùõKã_Q"ÊF¿](ëá]ØõñœÉZdÜžf¶P„±´ °ev\Ñì6/vcl-‚oKQý­ÑÀ…±ÎÝñV7ÖK¬€Ó- XM>‡ƒÇfîŽn ­–]u†il)X~Ôqò]"ŠôƒâŒ{uhÑåFȼ.þcHu‡ãLìFÜÞÆÖ‰vÀ‡g >—ËÒjLA]ÕRåíOoý¶WÎ^8îø¼˜SâÉ Çùë›Ó† ÞA ÈJ°Ha­ò ®*s¦[Ý/ [ ^á1E"€ à†€¸ †ˆ†&5É¥Ã4rf¨ìõC“W'qbº ý(f,Ð =½ÔäZª,ÒìG‡`ŠÈmÜ·ûs¾4$³KñðR2lzH1c8wK»†:äiøM`ŽCÑ¡*Mit“qLóì×Éñ¹ðN¡ wà–j°KˆU]áÞhdOÒyKÑnré¦ÈJ7v$¬Ònù­Lœû¸–Œ'W°Ø ‡S\ (˜Ñ¤‹tÅ­ aVn ^j6ì¡áˆâ¤%Ÿ9è¡BW~P¨Ø }rÊl+šƒ…5é¸÷n±±tt¬ ér ˆCwGZp¹[\ɱӄôõRi·ø¹­ïÁ„ñwH>˜?ûòª7y±·=8ìï·ÑGµv½°6Ã^üäµÕ¤ZÓ•²rC½YK¨­æš{ ”5˜‚0–7‡`­¸×:Þ¢ˆüMlÑ Ó–bƒa„xÕØ]€•VËÜ÷«p]s9-„Ñð‚ñ™žwu¸*HÅPPânÖp-`³P4`‘Pa|ÄÐTU‰ –x'ž’zY×êÓ2i2 ZW†4ã`+¶öj{+OPÇ4R˜=$*[åeWZb™ ‰(˜V4Ö4$ÞLîA wùG5-".©`%~ß ×ä-U=ër² §©á£ãµv÷A³½Æ9˜[uÔÄ¡¬&òmÏa¥$ü¦ÓÒa/˜eWe­ï/“ 2+—9$¬Ó¥nK¶•7 #7¢ObìeêyYßT¦kL5 IÊÖÅú³Ä ®ÜÌÐÓŠòã<±¥8é`̆tº½÷'ê¢ß™\&áÆz2«Â²qXLësté" ð'þñÞêܹ±¹,­eËTX7nµ?ÜÇ~Ï„ûKýc×ÎòÅjV:éf®]àä¯Á¼?þÎyÖŠ-ÿ„ëx”d‹^ê:!¡§â!`÷¼Ä]ˆ]lžø«À µ*N©Mä,Ao‚‚µÈVÒL&m4€Ä´0‰2w˜¥ |ÚÔ¦âÒID‹/èb¤&5 µOÌvT`:`Ê‚[@•Ѐ§XÓÌeüP[|ÿW÷¿øý×7xŠ¿Ö×ÿÅ j}´l¿õùþíÿÂÇ/¾ßì>}Ë]ׇ‡òxv^t¯¼ÝVË`è£N2£eõyÝþl;ºÇ妇㠮§ßëàè°vvÄëúγ*¸z) >‘fߕ޵âA):+=EŒÝˆZ1@ˆxxÆ›á…uù^jº¥i‰«ƒ”hG_ŸßÞ]}–fU3!h9‘ŒÇ¸ÑRò—ò!X¢ì=r¶T+;Ö6 ¾4Š›!H+ã*ÃŽ½OpúÔ”/É“Ð"¦û(7C’‹ÔÔ"U3˜›\«\ÑP&E‚eb@A!²Š RÍ×~ê¾ôÍ+é#Øü¤X{DYüÅ‚KÍÏõ ¾**§ØQNÚ!{jŒîˆ q|“î'A>eSnÑfËdÃH^¥ƪ[˜!R0…Ròe0Œ´°Œb«C †”T©$21P<6˜ÀT8-3K`à!”D8ÂJa2Œ ¯üÔ˜—P ”"9h¯4Õ!Äe• Ë’´pš¬¦^1öF«LK%”¦èPJÙc&q\_ÌYº|Eüp\dò–ýz _‹Hºmô²Ø‘¢]Œ–sNÒMòð¥¬hÁ°®ÑZ~poÅà§ýsA•£×GžÇ¥ÿ&Ûw Ÿò­¤eŽBo9á“¡¯†c¢R“óÍ¡ ZàÙá‹1GU×·“µÝ‚ êë5^E)‘Žùqßúi.{~ãßÿtô&[G'^g¸–b•eÔ³AÑ¢ywDOÃ..<ݱ¨ µ,6¤Ko  ÂH¢"ŒT.vŽ&ž¡R5GÞ@õão}ï£Ùý?òàþ\>Qgvó…ØË}'ù†õo* ´B°ÞH>ò‰#§aP¯¡nñ_ë]Øgtçó±MÙŒþcs[™À@‘@mÄ *±ã(¸Ií«ÍãÜ«zº6ï÷7§½CAE¤ÑÆ3VÝaÕÆìq UmgGp뎮x¾jkæëaßä)5,/¬2T€Ø:"‘uWèrÖÍìç–7®9{âG.qÉ´úì’5{'„°4Á (Kº0d!¼òÔR–e.+úÚrOÿàک籟EžšÖò:û]öZ’éDa+íÍÔ´pHðäUØ=Õ¤ßÎ_ÿúz~/³4%¡NÞç„ÉáUO/ûCËugw¾¦;¿ø%úì·Ó7{‹æ–ßv?߸ s—ó¹þm›\Ðe6¤KF 0xÕu‘G+债²¡GîxO ëyœ{«'13™®wßQ“G_wñ[k»W_5Ëùyáa–Ÿr£M[÷Ë*"…Få© ÝÚn3­§#´¯rÃÞ4õéÜcs ­ã¶}’›{_ã&~ª>ì<ÆF_•u¾_Ú{ÚÑj"“¦Í´Lvºœ®}?°»ÏÍû^F|q€û}ŒWç"NäŒ]ždùÛxÎùëë­û™÷!ûlµ«¶û÷Âmð¬çÜGã|}qŸ›<î—Ï€'åê!u­Ÿ¶~Çíà8Xž*‹äþ—w»Sþö~/B¾öö¼Êç»äGõ¨H¿ÒPéÞ‹óúõï~îÿW8fÇaÖOII™ÓÖÊ´Z¨÷ c($é•› çÑ.‚›kæ2÷Êå³Î”³iî!,}ÏÓæ¡zð>y éüd¶‘Ó&Ô3nÓE-XiŘR4ºgš•*§ÓÞýEÄä«»àÂq¹ ëú—Uë;÷¹vVIËîúº¶ÈÕ¢£ŒÖ‚§Ê “ }hæÏǃ};Oª9Ê®Ýó¶~Tí³X›‰ÏM„“ê4öËhoíÄ= ìã–ÚôY¼ixsÏñ½–$<,óÐ ÔîhũÙ.§{~­Ž¾ÝÙæz4Ï(˜­>”tUI7â³uª@!(*+gÊõ ²‚ô õÝH‚Ôˆk¡ 3•ÁtŽQÉJÃ@.šKߥN—FA4ìüy¥ë—·ÓûÊsë]<3q“6¥½°—™Õ¯nH×Ká#ߟô³¯ýÚ{·±ªr™-íÛò,qbU¬PüùM÷Ñ=ŒU‰;‚Üà •° ;ï'%(ì›8M™à‚Ïû<+ŸÎß¹þù«þ]Šç)÷G S4‘¦§Ò¤—MVe›Á~ÁÝ`ñ²4UZîÜ£7¤‘–¤„Ý” ÎÃr"ÌDMƒòT«£U[í2ž¥gg¯³ƒäm•ÎM3þçãrú„§®?þÿ½Ò“h}^7}f=Æ¡Â$X3Ã3Åž¸ÃTiÉåÅçÏiù•ÕóŠgP.rËžæŒPbˆÅ60WbSoص·&·­Šn$ˆôÈÙúµ™ÊFŸÖ{·»·³Í‰•kkpG¸ã1ûìÄLÔK¶c¥Ç<Òݮ֨ŽsBïw¥ê*‘,‹ï/}êG翉»H=NÆœä7·?&tÂvèЭã|òiÐ'rû éœíÃXAû“±ÙI.Q<¦³ÔAgòÓR ³så-Ýfn®æ»Ì?âþ-Ø$ã5¡Q'Cê ±(ÿÉ…ãwÿ+¾¾ÜÜbN¿àÞVÉÁ`}¶ÙÍ—ãýà}ƒ7”´Æ]ã€ôø±òüͿ׹ÿG /ʶÒ'%c´{j‹Âœv8 ‚H×CÅ>×舟“šd‰pK ¤n›¿ >²w|œÓÐ ANlÀ]M²‘£'Y[4‚ŠšI¤Ïž5ºùÃÛt5D»Ç’wj›?Þ‚¬£õ º„€o›F–ò±u“s{—÷ÐÏkÄ;=;½f6Ý»Ÿ…½/?íÁVáás?Ó™ŸsKvL™+gQcØ­_‰•Qq]ÉØ»1²ÁaÜ"ÿ)ȵB0&‡¼´S3B¸3‰§9Ýž¸·w ™rÏ€åD/À}T¡þÆÜ«ß¯~ÅÃ:~¶ùÈû6û ÜUŠ´BËìd¬/g{ã{½Yß\pþ„o¯Ç=§mÖÒt=”;M^àèå”ÙíN°e¦¶fäˆW°Ék¸4†Ô!ãÁêÓud^4ባ†b.ÂÌ„èž ®òUá”!au8«ª$vs—J §'s‡LÂsÞ†é¼\YlùbfR%VøGÙ·øªÖÆËº!«ÈRÁ…1-ÊÉ€šŒƒ£ ÉB˜¹uúÎë?´œ÷)­['ìÇàöèn…‡I& Â)5r4Ê”al?ù"‡Ø(˶P…û“öìÍÀÎÓœP ÚÀKº®WÄÏ8ÞL¢i¨ÃSžù¾®HÀGJÓ5ÓŠ%ê8Ožª9úø,”­r\¬½&Fn#àÄJ —¾?!M'Öv¸6ÿ>« í¹¯Þ?ã#œÍ«[ç–¯þYÇZ÷6ÎBF*Za‰‘{)¦c«LÛ‰øÒÄ}U„_kžÔxb‹×-*J‰¡Ú è(] ÆÓaqIÅŸjÙ‡n³._ »x¶€Æ.bÅkœùzN¥09˜'ÙõŒyØh{Ñ{øA­ËÆ0áQ-#:¥Œ<Æ0Œ@ ‡XP™ÆÃ¦”¿TÄC ‘¡lq"âHÑ–§g0 î/Nµ>Äq‰ bEª¸[ºK9¬°¶§•HPñÄhˆÂxœÛ<ý³&È~@Úͬ¤ÿ¦¥?xëÓ~óý÷Ajn£½ÿb=‡2´Ýµiûä뺆ðéœéŽQ¢ywuß,¼XK)dLC@3I‰ò¤-ÑÔç?…¢GoÕk«„[‡’ãQ!ˆøœh=ž,__w½Â¥N´œ’ž® SùÌiy-KŠ¡Ï#tFÞCðLæ€ ¨<³\ˆC‘”÷gÍ’ÆHjNªX¨²IùI±·WUL@÷aTˆ‰À¨1ãh "h€TL[4„¶+'©ÀqAL‡«n.ÚÂ+i¼ïcŒ7‡+ g¸R.É?e1?ö”T6zQµmÔ¤ÈÑÆ-¯ºuùð ›)_5ç‘Qˆð g䬗ÚçZƒª†lÐpsÄ™ÝyÍz ¥¯3hо­ò0h’A¶[´Ý&ýò~ÜûPMúh,›ò\h&M¢ã`M¥¦ÍœBÕf[d$5aSÄ­‰i¢-®ÜI%>Žnt•ÉŸÆú–øú"öáÞÏS';éÀ—9ëóéµ”fS¯ƒ½îç‡s÷xs{XÃæ5׉ßåµGUß”S.“ÍÓ]qºNOÿìéƒÖòz |¿ŸsØ®ÛkX1s,”—”çoýþ~ë‹Öp±UÇÃüñUýåqðW÷Í?ûKÿ´E¯þéðw…Y4±–\Cå§£™¬’xcp±ØÑ Bcëˆ&‘ŠÓþ.×Ð#/R•³ãÙCvùœÎMq~«º )‰Üø*D= ÖÄ6–·mtIFL[C)-0ÞÚ”HE&GÙˆ¯Yý—_ǯWûµ'w¿~½Ù›È²}€ßë?úëÃÝÛßO¾¹åúµ1M¥¦zì«k]Õ¦>´“¹wª"Þ¤Ööûœ>²EWô¬ëv R|âÀ¶¶e®w&?Ÿ‹«ÌôôM»•/$~pó|ñ³f#òQîwP…X€Ð°&ö(Uv´#/¥ r¾^¯ÁêôZau¸qyÙˆ:u Vk™m>/Ø‹bRÄ”Êk{PН  åJTV¬¨”…Þ5g˜¡\¢¹lí5ƒù¡Ñ9«_Æ(Â[Ãìúòæµhýfhä" rá!ÔÐz#vÖu“yçÜγë±ÕÂg ºÐЫáª\ÂÑÄ(ÁiÓÖ:E¸!ØÀ8…ƒE@,•Áp–òh&˜º9µÛyuG!ÅĨ-sÐ"À‚™e‚ iÉú8æ+&y·Žy' “ @¡ÊØ¡1 š0Ða?ÃO¬{'Öš±QÆpˆ•mB)~e6­ ·91níÞCí*%¡¹U" -xÁüHý^UvÉ´¦÷ŠÅ·åx4÷fËh=5ùB¥5\¾¾ ?AVɧ=VQ›ã/›oº ¥f=WÕ!"t0`'ÄGþMó=N°†Ê?ÞûÔ ëá YÏ™Uå@EÔqsLî›ÍÌo_©¬u±ìq-tX†“c²“JÃÞ‘`Îú‚ؘù¤ëúÌsÿ<â!œ‚1®™=Jî5æœUŸÇç·Brk@ 2¯ª©™Zß(+)lÏÙ&£ Ô, ˆH¤ª> x[£¥ T€PfC:Ä*µÖG ³­Í—ýžd¦ºóóÿûß0ùS ìë ÇÞwÜW-ï¯ÿjîŸë<#"y¹\¢KñCÍor¼®÷¿´Ï œ3 üN€$Ìýfô`ÜF;ÏÿÙyôŒA“Ü+7Vèì×z=Õ¾·nø ¶SZ÷óŒnÇ7ÛfIEJcT P¤^uÀ×ççÏg`dºì,óyb³Pp S˜!al  )›ô¹7V¶Tãt ˜+Ÿž;šÈïk‹f •8¤…Ôέ«‹è…é ’Ù¨Ì¬šPnŒW”iÃNò¬}?œefõ a¡"w¿ú€C7QaãJ [*Gò2«%žÉ +û9t{Þ`.<[W>4æö±/kÛØ(7š òëS“ŽAeá~øt4´t+Yͼ:õm³~¸ü½á|<·îdøñpÀ]Ä\CÔ"ÌË7Î’½<ãU[e»3Þ›dв`'Æuÿi kCÞsƒnûT ¦Tµ¶`2KïÍ™ÍÁóÆ2ä;Žm]2¶¯¢?È>Ýû˧kNriç¦×ü“ï°÷n¯‘· ƒ×ðæ¶á/´Ñ b©`Ãw0S–Ý ëm¦¹úðZÎyö¨Ù‹>Ïr¨>§*ð~+æDòéZêã먦hâÿð85¶t·žÆ »iª1Ú¥€í£X´mV×ÏWrEý8þí}_{ÔŒë yxŸÂùÏŸ¿üðë÷Ø_:/£]ß«}@¹yØ+œXM¯†ü¿¸¡¥=× t± mª†Ê4`pòú´,™ó¾êþ¾Š8Ÿ&2½sæN¸éöi ØëÐó³òEçØd²öh‘GV'/›œÒš©eVÜ–ô#ˆÖÑGø¡I°%‚]#¡W§Äò‚¼Y’yËl[‡M–7 3]|%´]O?Û}ç(]¸­m‚²p|,èMî†*ªÓÜÈ’6š]Öï>`GCv08¢Åv’Å&Uù³Ð“k:ÅÉ1¤¡@ ÉÑ(“ov¾¶uiß×ycÑfÈ:Äje‚ô‹]À¢¸°FCÃzaUu1ºòáµìkû§ÿnx$¨JF(?eA}â`—²ë‚ç¾á¢Ÿ.çe¦Q¯®åëj¾ÄêÉ6Èß…™ ¡è:2~t¹ã¥ì…uá䌺î rUªéeáªÝÆ_ºÞP—ЇŒ‰ÏŠ=F)…ux£=ر5?[½¿(î£ÜqÖQ‰â÷”šY˜,œ Fƒ'«ºŠ84C{íoÁt‘9 †y›Ú^‘Ë,œÕ[ÁCÆÑu}ÂY™~ö*¾)áLú(iWÇY|úÕçËÏöÁèÇ—†!qXwb¯â  Ýäÿîrý»{†ñcsù‹®¾ôêöì¯íׯçÔ»ÿ§›£_΋﷟ÿŸ:éýß&™öÉ“?/õîœ:N·È ¬:ÌJ¢€¼’BT®EuâD3LTEjÅ^°Ü~ÛÎcX^V·Õ‹‚Ôc¯Íœ[;¼…xdfÙŠê¨NiÓU¤¤:à&Ì̯öœƒ_æß‘ï[ç÷<_üUé½ÑŸâóë§P<­õñAlj}uJ2O¯?ûI¿Ëºá¾êEÕÍ#.u£ƒÞŠ0i]ÿh€ò¹1fÜ4L L±‰ÊÅ=™•¤öûxÁõÐÄÇ‘Â:¡F)‡^±¶k˜"ôƒ°­Ë ”k¥Tà¶aÕ$Ú˜Rm§9³¶:®‰¶ÉÖÀÚ \ž©oä WWáezˈhP”ÎWÍ&'[¤²jLºÎPâ6É5Æ]¦Îé Oš_´üqÊkêëÇÕ/ S³Çc8ùÒùÍ4<Ó>9×ÕÊwN6L­UrN«.*3tˆ¯Ç…qiõõj׳ é†V±fàÁX…íPT¢t‘•SpcÄ%™@Fj¨'““8YFšV¸³´Wu˜(Õ[©B˜Ú6¥?"cG‰ÑŸûøè<4ç©{ŒÅ JJB@'‡hà,(è•TfàBè+Ñ(‚c C4ì›ýõÈGŸû\Õ8LjïësQðR¼´J¹cýÀ™IÚŒVqªv°Ï…'sîúý©¾3¾¼‘æPËùºgrßœç…M`¦?À®€€4!Åhƒ'¢¾©U‰ôJ¢ð(Åb3 PGH„”o¥åƒ­´…æ†ÙèÇ·ç[P{Õ ®íÇýñM¶ºaý|ÎPî>Üžœ·ÿǬݶ$‚•të­.‘8Øí&»\®œ÷ŸLúã]ý4g~$KaÞêz¾sÚžòlkGcC‚Z5R;•³;ö:Ùc+õú™Æ’ÕGžó †)SQáÁ)D3dÂÁžÅ*!*ˆ‘‡`Ä#ühüÊŸýRÒ?£Ff6_:cLë.X)-xGüH#`˜™ó2ʦ×*·Uç+Ÿg`¢%ÓŠýIœ ©!ø?.²{«ÆõÖµYC zRma­KãnáËÛó;»ŸyÙ½UëþY«K¼Æ‚Ãpóê}çÆ,âÂhaÄG‹Õ¤Ò×ÅœûŠ»¾ÞëºV݃y¯õ; ¨ÀaúP€Ã"]Ml…[¹h`.Òg¢ðÒÈsÚÌÖl/·•@I!;ÐÁˆ‘N»ÆN+À‘"VäÎWµj]…ØxÁú|M˜™qÅŽnX ¡l¨Z¢9¨D,zŠ.µuôáP—Ö›Í7õ×QïxëÐη›ßýù5’‘ýÕ<;tgW ۡˬLë÷›–Ú%gê6® Õ%‰òÉJBý[íÙò×fÒZe`‰,°ºX˜ãMN¦ÁX>dŽÂ³]·2Z†¾Ùè>%6y"ˆÊ¯E6°YP)2 :ëÇŽ™}v^ï|v<óø´ nâ« u/§£¥yh9åtˆ$×v;{\9NSóNŒ\Ýí²~1+Ó?óÎY“ÖÓ}†§ñX(uƒ’ë¬G\ô·s„¡‚5äÀ)2Å`Ôò¹ fAÔ¶[1ŽN·Õ“ñº^ÖFŽÜ«½}OlÚB¢zŠK·¹We›šÈµWZ깯Ü-¦“ÛËŠÇ^˽¶À †Öø¸ÿxíéÛ6j$€ëÊÁÚÌq© VÕèþëú}ÕYôáÞº0ö¨k§!"$vÓ÷3>ó7ýðkðÄ¥†ú oÜŽgš6e€Ú9D0÷'¤â-ßü̦4ý|n7±K \ÐŒ'záyéXì¨|Q$¯™¿Rú¦ç+þ1ßG¿8[9ìäàÁ d!vïCºªG†ä ”Ä Âhúk›™¿ZQj›dú>¦ó¦ì}½Ëó;–ýè͉o …4üÅ­òJéÄ·}À£LT [¨¤—ÖÞÔ/Ìg)MýÊ+g`dâ´Ž$´K®Ñ•ðb¶«ÕFÖI1¼**ÏŒŠ½,2r0F¢’/­"ËëÆìÝž«üÁ?ßö£.›æ2½¶ÝÚ0i0¯Û™·ª/îÕž‘¨ƒ˜Ö@Ñ ¿Ñ.Tîºrï½QžP¼S¼Í`EV…"B ß‹dÛÔ+A  Bøö¹U{k)ެà‹h’÷G…D¬1ŠPT (¦Fëp¹~ó`®ÅM]M«]•wCêC×`i-PZ `CÑÓ©º*šEaD÷°¸ ìù^ž×ôÿEµÍ©ØemÁy~Ô×ôE=$Þx%Ãüñù\íÚòÙóT_Ë(u³ËJL"}2Ñ¿‹ÃMe¥=}ÀÞ/FÿpÄ„rup]­í`0àQôû—ˆŽîv‘¢ë¨0mË‚/ÑÿHå*©²ðZ?úÙ3ÙÆ×É^‹v"IŒ\cùWr ž²µîè=uô¼Fn]F®ö•Xz<ýÈÝwÔ*©Ø˜$”_’Ra›Žä¡&[³ ï=7õ1NÊrù(GU´™íŒ3ŽÚô¯‰†Y#ÄA#éc·6¤ w–ÖvR0ƒ•MÇÂݶ•)+,J7j±lu˜2–Éeˆþ”ªËßÏ/S÷¢:ÛÝ\–;ç3ÊùlÁ5 †d³,TÓ¸H‰Íî9e¤ÅŠ)°w8Ì *94âFÎv2†Û6Êcâ%ˆvíØ,ï7»IÖUý®I‰¼o¸ó8þ!·Z;ùóçaÄãF6ÙãÊ…q‹¯*Ÿõù_þdZÃòOtл›‘0pƒÄ5âÄ¥Nd8“F {!椃M¼”{„¹!qaþòÃ=M¶ê"o7w~p¯öƱbþPÉè o×È}¡šÄr/­*¯£’ëázx°(½;XˆÇÉÇþ“üë#í“ë‹LVOcP«uVˆêy^D‡í»Û ×uƒ1kmŽn3u^oÊ*‰³Œ'Ð>l 2òD9dn{Æîw÷ÄS›éÇ9õ¬PÅ’~ˆ=ÒíÑÞ¼2ŽØ±³ jÀâU挫¯à=G²8`Y5»pVyùÉ ¦&}U¼eÓ¥±’Ú‘ÍèUS y}8®P¤±aá ®”„C X '‘pJq@óñ rÖÖÇ:š›Z ­Ÿ;܆ÍùÏïCš7’šmÛU5 uÙðïz¨üJñÈ·–º‡Ö¡#›3Ð1g×ïöÞÜdݪpxîFtzĦ+¼Øc‡UÔó8gXqØ¿yÆù„º §ö¯î!n‡þsþvì(b­qÑ·8jØd@mpApË¥¢8Nçrd@0͇z­âKžÈ OMÌžœÒzb(¢ Õ'´%=jÃi<%ò@æªÉŠjƒ ÒÈT-\têlfKæFjî¦L …§KxNÞfrZi]©6r”¦(8"58œz·»V ›hœýÙÛ§³'Ž-'½ W‡Ußg‡q§ü‘hÙÙµý¶Vœ‚”‡×í"ØÌ ÖékŠì™<¬îžC%yæ­ëjs“9¿'¦ú´ûÛtb ¸/´H°ô/|æ©ÿÂþØÇËÏîÓOº›g4~™sü'ÿô¼¾ûë§¶Ç¿ß×¹w}º­ü£‹ßÖ«ï>[®/þÕêºÉË¥užâ#fÇwQ™¬;¦r±¿( Zà ¦]l`ëX»ÂòA`m˜i²ªj; Sp™+¦cS6íš’*¤ÊZO‘bCr<@„?ü›™›wo®iS¿¸~vûø÷ßھ.òÕÍ•äZþô6 ÈSv{Þß_¢+ƒ®¢µ(D‰é3â‡~³Å˜‘ŽòéäøDJT]câØäKËoÇûˆç*¡vCÒê&rjg?ÍÕ$nZK¤+šXÒ3µ„$AÇZ½ˆÍˆˆåMøUl:‘1VÎ9>°®›}ôò Ó¤]†ÖŒCYŠ+Ûóé¾íù•”8$Xâu5â–ËWí{¬|ïÕƒ¿†`ùºã Ý•Õ ô?ÜþÀOUOÔöíUùú.¬ñ­y¥« B‹ [ñŒ¶›ÝTG-£i ×åëàýyêQ3sXšPP-í <ËÖ¤ Fh­21(0 –|HH„òЕ½ÖÔöÏô% c”äY ²¹%+ $YiñdVú{à‹ˆ1" ÅÚ‘ QŒ @(²ƒ*"¶˜XWC‰P X¢4u„-´˜Çà<Îã<ÙS°’†J‹##—æo阛W¥×7úB)œÕu”E£Øj(3èB]ÅeÉ•ãO ßð¯q…°H¾#÷kâÍT‚$ÒBÀéÑG¼`(6‚ŸDœÅG$H+ü*–rÙÛڥ̚”w?ÿëïå|þç~ùw?ŸáW¥ÞúõI5×ãéñ©KèÐ翉ï>—VqSò,ô¡“è¯:mTT‘ Œò5ïëðzû2G&§šÓ׎µ«íí’§…!sRï¹|›¾–¥Ô*Ku5ƒ#-mŒ2Z;½ÔÍ`'Ý£ËwKT Vº’UĺÌË)…*>ìÝwwí<;&ÉtF&+Ì>«)*Ÿg¾¨a‰¯DÚ ù̧ƒDSö†¥¯T·çÐCcD†¡# 1jᦲæù3·ûÚçùíý»Ç¾lóýHù=®v ßTøˆª ªÌLø€3÷Ö÷uÆΡƒ¸åë~Xƒêõ ˜,úÖ"“EbS·§®µŸ9ç:Õ)ü5ÈjêÎ@%KÓ± ùåÂô*6 ¢ˆŒ.®¢¶¯>³ŽÖ÷TåZ~îÍÜAo$”A-\ŠS3\ÍÀƒÔNÓ¿ñüfj{ÆÈžD'èpè ¦m*¡±¨ª%¯ä…ËëI5€„É|0.?­á­%¿]¦½iAáÈ»‹ùÌÎMò>œ½¯2§r[?×Ìs‘sPõ§ÜŸóû’c{–=6ìý=fÎfzAU×W×ÞýëêýÛóûƒíO³ÛG~¦|LІ½v‰m_ÒŒ@PgŸÄjæ4ÙÚ€ŒÖ JjËÑ&|ïhþ¬\•ÜggÔ ùÞé¾!¤å=Ó•(¨ÚF¦aZ1…åKttW…ÙùZoµf`a"hr2F1œ¸elŠ‘)Öh|%•ø~:ïÁ~¶MDYF到´i o÷׋æ¥|z œIV¦Z÷Ì"/XïÇx]ËEµŽNy·‡º¯Ó}a§zM7S‹«¢ ~ס&vË\›ÏLª›=÷Ï»Úk¨šØ·>Rîzoî9Å ™Ô§}öðØÜl ª(~ÄP%øÂ]è²ìªÆ*:„‰ƒ‰³CÎó=ƒ'´‡ùBÜÐÚ„zÑ%º“X}Ž_Õ P#¡Øë=jz$|ÈU—‹1#À'L^G}pª~ä:‹MÏòÝœ¨«ñÝÞòA¿îítTZ0"b­£Ø±B%,ãåIš?¾HXÑQêxU#ç. DAÒWûÎÙYÂyýš«œÆÏ8ûTk½g8º(7Ú+EwíÙA«âp`òœ"3ú¡=Í&UŒI4„" •r>ECUV„Ût6\“¼QÏ)c½šÎ¥SW ‘ÍXšÝG1Ô¥Óà@1œ†ZPJ¶g³s ®ÙeO }% ¶A²¯û;–Ë‚‰ÇíÏR4.Œïº‡«s‚Â"ØZ”Ùt—³¾ìûÂý`z"ËÀsþ¼¾‘˸H‘1Ä´BU¥{p3sλ·¯í‹üÐh :Óæ‚ru¾C!h!Ôæö.!Æ¿¨÷÷AÙõkÉrßm64¼v]`>K!HSÔæÀ 2í6©°Zº¹žOª‚ýÅ®ãR÷ü ú>„}VÐÐqrÇp„K Èê<žT‚`ÕíIËdt޹ùÚþ¹š~vÎWY·üÜVÿîédt÷ž#fߥw5«_ æÚâÇÀ©¼è¹ƒìþH´3W~‹h>ýgg“§¯»ÍípU¦22²H‹¦cÐZ²¤@³"2e) aéæƒ®U9‚•DÝ ¤_s«Tã”Ç×ë¸:Ï—0+"Æyö_ÖtGÙ«óuÞ§c@a5½_E'ÎYGíW«—òÛöü¿HòS@ øõ¹{B³Ê#FÍ·»oîßA0Õ2rÝdÉj½Ð‚þÞ%47øV6~b"`>š,<ç¹Âq=+û°!6߀ˆU?@Ñ¡]ð¬à7AjµZiÙèEôíð$ÓƒhZ÷ª>’)¤Ñî”!¨•óF®Ë,±)žXÕ~¤ãmˆm0o*=CÚzêzB!qߪ ŽÝ‰ŽÞY<’ Y°¹H2’ ÐQº'¯¹RzŽ˜´u°q»s«¿TW$¡ºë´µôÜGf6ŠÇG˜¸®z½CðÎP·OCï#†]$¨°î—ÛÝp 0\ BôÒBB*ím˜±„iF9Žúú ÐâºoçÍçs€¦½üÉóûÜ`×HÐ?È÷/\‹ž<ÓùµñôòKo§9zd±LßU»xë¥Þþ<€<ü hjúúÈ{oehÌ è*h‘ŠnÙddNdJ‚šh@ÝÉ16îØ;†!c²‡26Ã_à{à%Ù ´Ç Ñi80X²‹¯ÎÎ ŸÄ¼÷kKÂlÿ}ÛÀ,1Œsk‚Ô‚4)À‰RNäCh§§ÃòÆöyÓ<F?>î—kdâ°2OzÕ)®@†7g ­˜áú  tv}ÄVÆry—¢Cò§$ éV삾¸u‡s¶:ˆ&ÃÖl¯!Ú »Ÿn\÷óÇÛA}Þ. aš1Ù|¡êjiå¹fÁ¢D¯×ŒAl«{ê[h´ âfºl• ƒî -Ò¤†KÞsï_7«¦W׆fjl?åµ~2”¥’Û¹æÛF9¤_›BSà'³_k<×a %ж¦;¶^®â«­LàŒî¥8b‰êèQw°U©}ápH<Ú¢7Åc Åž?‡±ïӋÚ÷’=ŒŠ_ïs| ¹>6øê)ŸåÑv§ârL¹7s¶W>ÈžˆÆFÇrÃvȱ»žü\å}î¾e‡BùôAE¤•œi”WIJqÝžCi@aÕn)ŸO«ƒ˜Ú<%Ý4Çé¢Õ˜0ª³RÖx!h%ÔHBESîQy¶+V*tcQ™ RÄ‘+–nê©‹z’¦NÁ1Š¥hHm[‚€5D¼5hT¢«a:ÀÂß* ¯7©@‡]!‹×1Tݺ }ÆJ[ò„³3‹ØÔx÷RíìF€^G“D…¦H#¡³[<Ôàd–Û+œ¢L>Î Êv³hȰR , ÿª?gùtt»×u>‰žImOò°gyë‹R²”/§É@Ò<%.ÕWteJ0€ÃB¯´ §«Ä :’*ðíR˜tôó%Á^VJg(áJl]ɪ*`šÃäö–f! ')×Ìld&f§œMfÉúTyÒhuÔƒòm¢µCæõó|µêÅ:öºÍ«B¸ ™±‘Ä ¡²àiãîœ:¾ta.ÈÍÐBÔ%Úã ÊÈ=xÎaÎÚo!33!¢ÎMvÉ’õ“Ý`{2EPNáXQ¨-ä!¹]Å5ä®,…L—²X½ªOú¾lµþ ×óÿ=ôz·²ë>JŒªÂ³3 ×ƃ{]öѹnθ‰iÎðÉäõil)/-IDâ8ëä_'k›/òÔ\}xà nhj­O”°íáÖã³ÜÈ*5E0ª AÖ°”ÖxN%øÂI ÍQ°»È`8ŒÒÁá¼+‰°ÏRî .4uyó"ˆö¨“û¯]sÙô:íû|³?,yÎy¸­ì¨Ã0ªi—Z“- ª±8Ev¡tðX°8¬ÜKUʘç/\úªw2©³­BsÅë›á别¡ýß)"ãðàóßíçÃ9ò*;ó…‘òò_t­]ûïüþP?úoÜ¿tƒ=„0@v‘T(´øíÏúSoýþc½ï¿ÉƒW\»wÔw3U£léEîÖ£èI×*àG'lÚn# ¥Úêû!è:‚?šÞ´o3)S¶†¯k$&ôÅ—¼‡0ÔxB h VX”rE3ˆÛwÿ/O÷Ãõ×,Fiudân;?¶wÛC¤DÍòÔµžîËÓØ‹QÂk;K­·†ïªcûSGÓNñŒþ‘¾=ªRÞΖ5äNÇý­š®õÛ>ü¡øÌl]Ø}ÔôÓM´` ‰Ry'$eÝM9‚EiIP¶ 'Ebc'(Îëø¬þü5ýΠÑJ$ˆ’‡¦ Øá%´­A¾Æb4$ ë,{™>gýh8e†é&$"562­®Ÿ“¯_„iVß¼~©n€¹¾£ts%hÈ‘D«/­f¬õ½Ts‘â ÓõèÒ¿U®X±„‰4'yïÑL¥$fµ /Bϲ÷§{ÆC˜ÖíÆ í#]ÈÒ¨BÊ­&˜.ZeŒ±‚DHÛYqÔ¢FµÚ±ö:¯²# =6‘=á±îh%!Æžn÷EöÛ9Ç\R˜­€)·ŒTkDQŒ±fŒDJ‚z°Â;Þ˜ UÄ y(€ó*y:ª_ïjm¦±®¯T~`mm,^8Q8ª~V¬lcž [Ô«##ë¯ÏŠqM×Çz¥”@ò<âe5ý}9?˜bPCÀ0›‰OâÖM zDçd”|>ù þ‹@a‰K.$¤C lbô…Àù«ù_V»Æ”×ñëÐõë÷ý»#·dø®T_<9zR³²…Ü\œ·P×Y—¥¨§Ü„ˆòb›1t®„ÚXÙó”öðÌýiªúÌûOoSm¶@€Ã2¦žW•¸PÉNh|¦ôªb[4½ÙN:ùL?¤¨?I3gñõcs4Z2òXû*€/=##Y’3Ñ4ÑPDGøHÿe= n 7iT×Z÷$ÁÍ’³/‰‡’H„8A´ Èê¾Í’VM ɸ¤àdýÇü=ÿ‡/¼ûÕZûþáçóFýòsXÝqÔk|m벚óÆlÕÑÿÄÕµó}«¼1n¢€$Í‹qËÖai¾°µcv IŒpê…ñG –ÆÃÀªqin¯oi3/N%h­: ºØ–x–4ÀA ùáÇç?ÞÿlêkÅ-]\Ûn á‘dXXØ 9À x”²U5` EÈô;ö0Y¾’‰§ˆy-­uŒÍÐ~+þmÆ­ÙbD!˜û^šl^k6q3„gÐT.»ÓOd6,ý{©»ß£šãc‚e“æÌH¼|ùîÎÆ;?94$³«Ù=¦?¤EXE³ÇpÊ]Íý üÆþá>qü¤Ü_)µ¨Œo¡uAPlNæÐom¹¹:g· _ˆj˜ÛñÉÄ;ö/`ãúžtàì¸ÚÌqhéëàjm84$Ëë:e}ßå÷ïDÍ.3'Žäi·msXS(€2ƒ.€,˜(êrVåv9êÕ(õ”Ö[@Ôq%g`7¤v·J!ˆç^"¹;j"<égõüºù|Ñzu#(éŒøEàÆu'U² ݪaÆJ©ºLªâ^W‰¶òXÿ¦yŸˆ¡ jÃÛû)óۣ݃õÚp‘±]ªŸà5 h…ÐÒãf¿Št~le¢V+Bh„Q¨4ˆàø÷óû§=mõ26`¤ÍÙ^Ï5‡¹~¸×kûÊdV(bÍ4R›:|ÈUWn`4ã*ub=uŸñ.&DªˆfÏ¿&i_ÏÂ^ƒ}Õ6©*Ó ¡'¿ayâ¸P ÕSd9Öø¢@ie9‚#\¨ésñ¹h}I;n¿ä=-a+lW–“;ye·Î0æ =Ïw =N‰î!£/–})Ž da®/0ÌÁãZ•¶QSÔI‡_Ûu.à$*EW§~¥ÛTÍËq pª|]t³6 º¢ðµ%¨Ö÷ý./u–[dA4ãÄé³&ç`’ov¼š#@ ¤UCaBÖ`Ñ™Q@‚sÇVw̾|ÁxÎÓfZ¶É¦OËûÝó#›vCH…¡jØ`¥Ì÷í$k Ïæ_ ž 9]VU¡„¸™åç8èÿ„|Ýöý­zw¿Ç FÀÄíäêq÷‰®£ U… íL €ädî& šµ#T:%neóÓ°öLF ~ŸKjÈ ¢DÙ§˜ŠÚ²`)FriôµÎ¼‚Ô`çÓ£çø?{]ûÚOßZè­§î*pj`¦Ò²ç•õ†Žù‹£O1¤ßdÛ/\‡s·Á&̆ØÏW4„ý·Øß {þ»¿úøõÞ+>?hZ.åÄù2„Xhˆa‹I -!QC0 éñfd_2;]µ¡ Ⱥ<à©"±§Š*#ך#«×û8ó3µŠÖ{ç";»!eÏÌkà [1…Ó±ªfü‰9£ÂwøZtÚ3ÕF礛ß7u=è6 ˜X=¿À^Ôÿ<þMýJ«·ÛÚ†Ó•Yd|nvtSPSº]Ð]é·Ð}wׄW+DSPÌ×;Æ4l¤vSN¡JU ^i$IÀµåc]Óã}¼Œ¯÷•1}õ Ï?¢#G©J±6;Ìà3‹ "lT£á¶ÊL!¬@Jþ1®ÙX”ä.)ѲQyÆd<1¯­5Î/J‹{ÆrdäîäHÝ¢"rž´žl¥ ÓS/ûü½[¯ÛÑ|Ê[ôo:#l¤SÉJe¦mdrz~a‘Q Wqùa6eÉÈñî,J¦›Üvæpkqmr·Ìly!í‰ylúNÓù8Ç T *›`m À„Ï•u…‡š*êÑ×Õ5› ­ Ùëf"UiàdÄ7¦Ûù“#…–Àx@vÓîí)Íx‚>/z‰š·ƒ1.³|‰ºWª‹ò‹ ^5JCY}qpU\Nƒb™ÐQ²7ȈŠÑ:7L§5ÁMùŠã5%¤Ã÷Jä9Š–Åõx’FŠ8{YàE NeE¶:2s¥Å­ÝeÞR]išå\åAÈÎ6‹Óõ$wÛAÛžÏ>®‡Ç…¾fEc1SK–҆Рb:C¡òl3˜†€¬‰–Uª©4"ðBŽXS.Å™V¦Ó{ÝW3ºVfyL Ì¢BGîºí Ãѵ«@fšˆƒeèAÞv<ñØsX´M„È€’¯„"‘h§ô­õ•w}½~äß_x2bðØòÑöûù3/="¢£›gefrMY\¥²ö]¿´9„3F.cõ"J¿(F…Åè×RSóãp‰Ó?®³<9Ú^¢÷JöÔB-*JtläAB*åòBv–Cã¡ ÚæÂÆc$MDŠiÈ£Qd?ÂøD¯;Ù×t^õ4Æü¬2›'\ÆÌЪDÈA#*ª\>›¾–Z*{‚b7(Ó™ºÄ&f“zUÝ E˜…­An®Ø²aFþ!¤ž™Nw Ô!‘-)g4{0µ›€Ñ$‚¶ß’álàG•곕{r7š_‡®ïïy¬¹T*‰ete÷×Y‰¼ãn—¢2&+)/}'²í¥í\ÂÈé„~[–{ýUÔ’^Àé« ‘£¯2@+Ð.Ì€,×ŸÇ ’š¨SôÖŒVE%JkÉxØlK±’S•²áˆ“ëü•äFf@5ÃIr*–³"‘µ4)8É<ëîræü¡RjØ»j•Z)D0©Ž­»°‡hã+Šr$~f«ËÄÃŽ_‹M¼ê™•òM}žu6Î"Qúdšf`¨Æg{­ëw[ø·,M»]Ÿÿ¹yMn0fY2ùj«Oð‚õO÷ª®?ò¯,N]žë[?¦Û½¿ Nœ´Zx-B ªÚûðüIqu¼–üÿß_þóÛ3ýF¸:YÿóN_­ÒËàŸ\?Jzn\n~a—ܬB9ËkÛ·qCý³}çèõÞ2•VƒìpŽÌT‚p-…=ÜaMíŒäZ®ÎY4 ‡üêò¯Ì·x2ø1ÊsÝÜ%>£Zº:×í5r®=…¹Û÷?åí½ýEö>íÛ{è[vÍp¦OÔ•<(uÚZçZqÝèëîùˆ §øaá9¢« G÷tXªdúï?ú~f!¢!qüåîRk4bÑ¥ÁŽÀ2kùœf¥X‰<`®¦¨ØÐ¾¡r¬o¬­.…nHöFò©Q–)ņH Œ:î¡UŠ>)mY»W¬3†³€Š±‚ƒŸ”Ù(+eb†NmâäJ‹‡)FHG^×Í8íéUuÉn|fçapû@é(I¬ØÙã4ôJ“SÑXt`ÝË–/efQ°¢˜6Ⱥ+#ÙÄ‹ˆ:¤Xh‡¸!e`A’LCÕßq¸îð{é2_}ö…¬@aÃR¸Ô òy?ÒìBPqÙÕB¹ÂW¢Œã>Òz¹­(¬A<"TÑÃj¤|©+<Òz‚;ÒšH\ÂU¬MŠÎt†±\\0kû{äz´QX¼HAtö©LëhÕ§[ƒAß™OE Œ9ytÅ,^ Û +OÔ¡H+21€!®êoôzµêoàíWñ¼KQ¡$^xÉ_äoÞÌÚºÿ•ó&³|¾±>åêò˜ÊñdµÍýÛ–Õ¯Öóxbïlï{½aür‡¥ÚÍ4”!CQH ©]d»ïnÝ_Ö—k¶wWÂÄó³° óenõ¤í…SµPœ‹™SlL?€‹›Bå{hЕ»EŸÏPƒKV0T|GÚ’*Ly–s<—(@J¤ÖR¸” ३-³xáþ =x Þfx~ãö9 ‹zèd,ÄX6î$+¼yí þ9qz¢iˆ®©ÈÓóñsÞZÖ‡sc6 ¾Öœ×¦[óF9û|ïXÒó™’.>ºª¿»£OãˆýÚ7ºér.˜Ê~~sXg›ÅWG³ÛÒs ´Yà ‰š¾3Ëb%Hö‹}mIpÖ€‚Úó¬ýÄ÷›Þ§úyüŠîVÇv\EþÔËa¿ëg¤ºª SÃGöîò»£= ³WY0>óþº(c_Gåˆh8pÂP ©äÁQ† +òäô~.ÝÞ7Fî/:×Äz§æ8¢ÝtäÁ2½ãýMäs3g¡º©/ã±ßq6Äw[ßrÿêÈ@–›éçº!…Y£ñ1êukæØî3> îÓ}o§<_監=›õ¯<ÿ½ýºqqã(Tý0ßÇ íŽî§äNÊëZ†)jäYõ.&ÃîaL†+À&´ï««› H¬0Bpõ@Žë§î1QS›ÚqžÒeeè²×y ­s°!.²ÌªGÅëÎ[¶ÏœŒ›¹÷&lwôi?9fÚb˹ò0p|å ùỿj½j±âÇzD¤NkhÊ4 R a,©Î@âGH4ˆG ú†š]˜é=—À(m\*Ý«™^?Œ×¶^þ]€T#×}®”"L_o¬ëÊS£€v9Øé:È‚ê$YæaÂ%Ô L÷|•ß®Ôb߃¾¾wúÜú®ž™M…jX!"GIG¬¶›¥’+%­æŠ‰añší(Ò¨/€~%™÷<›3²3íŽü0¯ •@D± Ô¢{˜XÄæÊïñi3™äoÛù\¼¯êj{wÿòÓ|ýúÜVd±H ž CP‡a·”Ãw¿ž½ËçÞ{‘SHˆA{ÊÏÿdj0ãÕ /Ü»Ã]Ù°–\az@D MùP£Z^RcÎ`„JÈŒ3ãçt±^Í&Ùàâl÷~êÕÆ7´Ê°‘Lˆ³^6†m‰íùŸfšJk%±—¿>'›bß,]tɳƒ™ÞnðuýsÎûÅ0襈#‡ø(Ç$Þ÷ãUÍIæµ~½-DÕwöñ3í±ðù{;ÿQ–7˜¯ö¯á0œçˆÏ½ýkP‰%@‰(e J¹±æ %#Äç0†ÔŠ‹C‰¸2Þ²­.N,»ä4ÅÒÝSÏçù9nîg_#Y]5~ÍÝ|Xzí?“'ã_ëyq¥¶Eݤå½ê+ÇKœªŒ}Ã*Œ9üÜ¥òƒä~°kMyÝtžæÌy @†,y³P u•HB;ðbY%ïZÃT²cšG: ~ÜÍU«ûŸÙ!OÍë½ãë™oPŸçýCZöÞí+›.I*Ì ÿ„È » ¼ÒZ³µó„êùÍÇÅ¿mµd3ŽÃýç9³<ãÛüdÖó‰óØ>³=òåw¼ûñ—ÑùMMËØú8ó6<ÝÕ{@š{*]ãäFZ‡nŽFsí±^9_žþÆó³(÷ïÝæþnÏ®­‹u_¶=FóKÃw—î?Kl?<3¸óÖ¾÷GÈ“Ž²»]‡ã†(PP R"qƱߩØWóc}2>eÐ͛Ȯ/ß>ÀíZd}—ÇÝ÷Ã@”9¬´Ð"–£Vj‹™ F¯‰m'²ƒ×G¿\ÇÑvÑðÐN9S»CD “3+ýP²:©¢aÛžÓ[ä#¾L$]+ûØ"ˆ.²Å2 g—9Æ`'®6Ù`(L¸,ù(9j©ãúÚöûÁýqE’3½5$ø™i‹]Š\q0sÒ‘lïú*…*yd¾?^0¼žq[vï.ÝÙï=á,÷4E$ ÌÍD€4eh³cÀËž9[«xdŸ·Âó7S×õ÷ã¯ÊÙÝÁ+ø.O]‡Ez¥8g$pÛ"Ý(àÊìB¸Í­fKÆáÝ M;Ä’}%Ÿ+ûQƒ(l`ô:Ó2æDÅ ÛŸñô½?ææXЮíp±Ž¼=E9Q4©Ó79·,s^Ç[Û~gk’K¦Úƒ':ÎÙvH?/¤Ÿ ÅÝ´dl”;­šNò™œ[X—`º;þÅ×ê-ÒÅÎÿ¾o‰Øt[ ÓMRVÈD.š¾Ñüe°?6Â/ ‡öùY‰¥õ<1+Ò„û‘:Ç’ ËŒ÷¤ÛªØh±‡‹”K¡¤â@Ï‘p@´â,é¢âB£-6?Þ½•%Ùè#š‰òæírÆK˾($ÙQ@Vd—GÉ·`YÛïMX7ËkMW~¨A<ÝÜõa!ÓdAÐøB öÁ¨ˆë¢ Øí˜†ÃrÒÖ¬¨±kNøt£”–l|gEbU]ßm‡.¡EVVäÈ(Hu<æ>Cõ³º¥øŒPMî… ÃA¸Ì£3Õ||*«Š¹RHðY+ûm€a BÍ6Ÿ>.¼¤ð—£bª¨_ðóÏ E@FkmxœKŒ-•SŽS»°ÇW ´zß›²6n®†±b^SC[ŽñXæ\Fç–#^ûŽÑ8ŠR§…ŠGÅRrü\P w!“)'22LÕ4Ì=í/®nO”¡Ä)ÌBÎHT|ƒÁêۙɘòŠyàœYYžøˆ—ëÚ1h<9™…Pn4ÍØp– u¬m²—YÉXàn%(kde¢K”ía!à…yÓœð…:ššf ž¬(#1§ôø´XQÚm`‰\je²!«`™q£xb>Š"IF*’¯LM)€”É™"“ˆªH«C=P_Wó“Õ¸;ríé™ô‡Jºû|õã5uÌë ù{ÌazUõåªKºIbµÇO°ïêqÁPÉBqÆ£ÖØ=Ž×R…©Z¡WWSÔùHè! Q8G¿\š&G‹j8òR>²â…˜%ÞÈ”æJ^íW,Fë¹Ë!ú‹MÏ#i31ÚG‘¼5cA«DK….ÕB:“… «·C>™;- Ò‰œPií¹ÀÒ»Éz. )f/gß™^a#ëÈ„“ÿÀؼÖéÇz+–îçÅ}Är(Î;C¤t)Ë1¿»¨l¯¨ä G}6+~)÷q9ÁÃÁÀW9Ù¨#Ž[^ÃÆó|yjÃijGr¹ Kûc­<Ò׳óËZNïdÌréCåŒ_ùÃQ÷—è©ì£XÏQöÓžN|Ê\k;—öü¤÷_¹´ûòpe˜úþ¼~ÂÝÿICjÿåáÅñ=ï¥ü’¿œìÏÍ]úVýBûCå‡N#>Ñ~ßâ;4`^g7¨?ÑXôš^Ôwüµtšþ–ôêé,¼Þõ¼ïæÍG_Xh=ÕÝËýøúé/ϱžO¢úò6g¹¼ÕI»?ôýt®ù&Mmµõê›sfш½³ºÖÆV±Ôjº%…/Ì¡h ÄÏZ;ýKn’¼)öqô!=Þ>“Žé*kâ ½Jë‘´'~¶ùদ!ãÈ”`»JBea‹àÒ‹±…-•”;%"à6³ô">¼nBÔZ éÅŸÅ3õnõrZö7ùõwcÙ¬Šm5Tƒ»ÜG˘1Ó DN§Nçüt6ï·ØwºŸB8–ƒýaïs9*«|’~×|ælӴФµmSºš££ý¹)µUÁES0ë":dRaÒ’à¢=T‘9åÂXA¡ •ª‰ÊãG<ú?¨¦uÆ×êxR"¢ØGv/œÇ<¦„b JA¨OÃuf™ÊÁ±É“"!/Ú‡U…ÁHƒ RŒ‘‚j À¹ÊŠhr æu :çi&4Mh¦%<l´ÕkèÇÒÌÙW–Ev3½çÉ¡™7H»Ê…ëªï±U‚èïDæâ^{¢1Ï%†âÁ¥“ϬÕç#?ûåèÕ4Úý-¤Í̯ðòóm¥xÈÑÒz¶~îþé¯×|þÙsýäú·ÿø—¹ËgBq3KÐ+¹ˆ†Œ$ëÑ×+(S}‘ÑwÙow>v1ï/ê®"¤ÊL‚ÚÃÕGßà:æðnñ£B2y>FxXÙ\ÑÑ{6VÆãÏéyÿø6™õßí¿j/®îköˆ:IÌ%9ŽŽÄN×:Tõ³ýUm•Õ‘ºhIB.ÈH•L?’ìbNÄ縡‰ÈV¼ºqé·_œI:„ЄàôOàm¿G¹¦rÐÁ¢ÔJ/Úÿ_9%ÄFEe5ˆ “åÐõoJë4Ã2\ ò׳ßsm|ß}6ù«xýÌ`™¡g³¾Æ\þÈýe¸on9UÑÑã[úü2\™éï ³¡ÙÝ‚Pœ™(Lå ¾žoô}¬#ÎõÜÔM&çlêYZl -¦5åjZX-,@RdLQ5‰â‰·ÃH7[ÜmíPcV™‘•äž¡ÑÖò;†8 ~žs±ÞŸ/‹¼«}å6Jma!Ô2Q¸)64±Ò?¸†Ã‚+__ÕV¦#lU€×¦Å–HgtÉþ›ÁújÜV6TcU/½G8\«¿I6}¦Ätÿ¼Ã~ÑYæ~ö-àlÝ#ŠXuÀhí&”lšÁŠvTVWPÒÔ Ñ|Â6½ÿ´ù5ûfþg}—j—ŸúžnÇ1EN“³¬M†ºCèt@B˜É+O¬ã˜Ý«Ôì+,’Ë‘®a…ëŠ T— ,@”@ˆHѲ|–™{~Ÿ?߆c¼€±]P™”+JÉi“¬"zÄg'}1ú†ƒ ’ŒÌOe R+Æ#pÍ_YõÂìÛl‰\1† ´kWœS6yò8{u°DÞ&ÓÑwý¹çz¶W)Èûæ™Óï/"{ñz!Ö*Ãmøƒéçì~̼£KàsYŒûª#¸Á$V“¬ÍiÙì8R…[ìîR%Sš9ÎöÐù@' å³ìEõ€X­Q–½uä1°ŸÖšßþ/ýú-ßB§áÅN*¹m}øÄKý¾¶1Éu¨ùã&yȽ (ÓJˆë:5h`pÙ­ÅÈ %°P(FÓ1Pp'ëî "ñ1âÉ:*á¦kˆb«9£ÉÑ5.ÛsÌ/Áh'øœÀ•[0I.喇Üäg:‘©ù\´nÀÄo{yFyÙrÀ.J­;qÕ´ÒßVý’]¬Sãí¶_ÀEI–YH™’‚8"²)k$y£µÇÞCX“-ùR‹ªÝÚÚ.L_/#LŸ2_º{¼Ód¸VX`)Ѹi=¾ê°‰§G@¥FFïO6ËÕðÑó˸ºmû<ÏÏ÷ûÔ^ZÉ„9›©Ï‘†ñgoÅvF•ïÑã‹Þ­k‰€cûi™îL˜:…2]r}ý‹óºä×A(ø„Δ¾<ƒÕLÄÙf8ÏÄ2àmÞh PJ]Î'aÚ UÎéYý ìsW»;Gõõ©v¸Äy²Óÿù_¡ò›55tòw·Ö£\»¡Ývï½®åsüèÖ/¯Üöñ}qÛå¿8;ÁoWùŸ¸ê›¤ÝLȧ­ã¹™Z3][›[âça½+céùãæ¬Ï8—³ìž•Kò¹_=?ßúút4V&0JC2ÃæZ¥èDÞÜT *{yWt[ª™`©µÎv5›ž QǰSž ¼çÍ×ðœßpÍS7¸wÁåò®ÖÔÕ33®Ãß'6·$¹ç•ò÷|ž¼ÚÿÄ_™Ë”¹0†xJ¦´¯pê’å/ôÕñþ.÷›\ÏðJ#Bª‚®ï¸·É’"¶ý…¾/þ:ëÏŠ»ÄØðHÜᵓ«ä7uÅÚεڥßN¯-r¡bISdÊs¾jrŸçLkÝA¬É„|Žß%SƒÝëkÁÜWøq*Ö«Ù£ø§î»§·®Ÿ\ÈOþþÚK©¯\±8Þ¢ýTßÏÙ;ùù]ncóßÏ£§h ó¡×Ðqêéø¿Ïöøt}/¸×Ìþ<¨ÊmÍîÕ—0tè»Ü˜?ßÙ}T±K¦É ¬ÐÉý·¹ýŠªè[4ý2®œSà kárŒ C]Û¬' ë³"^ vò(ª…õ»·šš³P~!֯Ǘ­Áî|]èKw¶ 1—ÝÉ(5lé«_óÞܺäÙÏ8—·*ÞT¿Ô^ ñ&²C"·uÂÌIäD¥ˆ×NŽBÅ€sl½5uñòEÿăÌäÊôÂ&ÒMë³{Q@*¸D~Nÿ6~è¸ymߢJñ¶Î1+|Æâ˜n”|Aˆf®E¸ƒÔ傆ÅÑ'‚$LjeN-Œ³ÈYz‘ìжtŠLÒ%5¦ ¹ ËOH{ƶ¿>ýãú2 6wòxóæº¶ ?ŸUö4›AÔ¾][cÍý´â¤k™ašåæâ$Ú|^{‘™ŽÀŒ8,çŒël?†Ñ¯ßÝ‡Š“ËG·rÁç.‰B£E?³ªKHѱàöNp‡0zäáôIªçqÍ\p [e3…¡Ï^xÎWÏ/íOÖîð j…ðCQçitûË·ßÓ£_¨9²ùÊr¥?×=9VØS—.Í–€­(:‚²HêãîÇc¦Ÿ/å¿ò¶oÃ}?þœï[㼤Í+¼¾’ѳa ¢GŠmn#=à£ÞeTGZ2# ‹¬F/p¸½ ef”âó‹5nôeMóÇ'Þ$¦F8½ž=7‡;:SZßA¿¬Ñ¤ ÇÃYKJ’¬ï¹»ÉEñý^ÃÙFcÇn:Ö¸v|9·ºõòì™õ<{“Þ”¼ J^¹â~“Œ{ÐPIÆm™D_]ä-ÝôªŒí¢šÌ|""çQ.òçIöQÍ-œ›²žG&ús$Ð~ÈRd8bOTŸ|àè÷Ä=Vn”#¼ŠI^Îï*}&óóΑP£¡(8f%s<£Ë(Aθ0dÐHÁNíó5‚qì¬ ³ÃÜŸ$}mkïÞHGMÂo—#Ðé0»ë§íK¦šû'¹ø“Q›ÍéÁé#€râ8„D…¤<ív8­)U—+Å{ZÁªÓÁÛБÅ0Å5ÀlhÅ&'˜Å ¸_#Ê1*Öˆ†!³Z›è¶±¨/dÀhA[¡NÊÅL[,&iëæN§zö²Oë´ªƒ °c¯°Ü¢‚Jxxc4¼dƒ™‡¥Å¡RZ\-Âpb‡T”j f¡ëà 9°—™ÚÒ¡ÔÁ- ¼¬Xä #Ii7±‹²"²`pî’Ýú'ûÂq‹§Gò)>; ‚-ÍoWö~ã §úãôŒƒ5ܸܕHžGm…"޵ŒæEyäg{Šž·*Ú+JD¬8k˜~Æu¾ßK`êv’‚;ÈsÔ"dÆAet$nɸÉ1†WF1Z \lŒTRŠ…€k X÷~~å˼âÃIf½‘æˆ$òµŠÀÀ…`sy€rÎÏYÖYpHÕ‹ÊTìË fÓ¡ aMs` 6\©¹ÃØT_.¤|ŸGßn,¸Þ¼6V‚gÀ}¢U¡ºaê‰VÕžŽü¸#ü…/_Í+|±k=܇Øþ]d#ÉŸÝ,ôùÄ28!®y ¬Éà™uC“Þä­'Ï#mÓ5·—xӶ׊˜AÅ<™”ˆ·¯Þq±PÒGM³ ÄÏh½›EšxäËX[m@YG ê®´=ýùÒu÷\Nóg¼­¶ã(´¼=dŒ£ðüI|³jfá°7ùÝ8‡ýâiãôÑ:+Ñ¡ò=LÛ^»A8|ò!{rɾS€¬žMsîÅ{kô|y°}–'c£$‚y,3½© R z_M¢éîQOÇëzžû8y<'Ãtæ64«RYíìWcÝnW;RÜùjçø<ìñ›/þêüéw®úyx÷^ý¥ÅWÝݧzÊUüÿÆÇvê®—7/ßþÕþ£sYͼÕ[]Iºý‚´ŸÕ«$^úÏçÙ£QyÃ~ñsýÉ1­4¯ïÿ¡¶?½øËû“óhgþ}Ï/ï¿jûUážÍäbšÃÍ›Eþýás¶3WNûnÕ/Š9ç©þo/ît¨Ù×ü–ó¹1ÿÇÀÞóß~æ¬h›Å¡¼·ý½‡ùç‡n9­þúíÿõ‡/Ÿ^?=êgÙE:¯1º5ûô)( Ðnvý$>_úóÕ^wûc³}ÚŽ`‚As”u‡-ŒœÛý†~yáÙ«Ö•’qÇ©0î¸å»&Žx„[ø~Äs¼è¾ Ô (éÁ$cQ£:Po®{œ7 ì²xàÁlÆ‹  h©0yó'úó½u›õÊŠeÉj £i%B•aK@£°P±C%Q˜Y<]_7ŠâNªÒ¼Ò×§åkGAÕÄÕ@Ag ?L3Õ•y¹•º¹?nðYëX›ã5¾ÑêÊSkÞÆ»ÃKuhEÕ2b™ÃŒÞ²,½@Š1£¬UA â,1þck]±ý‹@R¬À* *¨/H±bEF!%ؽzk=·öê½-ì /Ç]ˈ`d¥ HMë©r”†Ø†$˜£z¤Œ%8àTùfÉòSMÄP (»B«LsBƒ¨" 4s=ʱÎPÅ"š ‹+C…Î}Qf¯ó.Y 9»pÓ§¼Wy³ï6ÖÖ‰åè[vç,’UéõÚq_­…kÀ(â—žûªZnþ½ß>~´ãÂî™>„ƒÒZGHÆl÷ÙMB/³Àg_|÷6ýíéǶr56\óöTzÏÞéÏïûýTH6–˜¼è£cU§ ÙFÔu¹qäcI]Oÿ´:xr)È0Ö«wŸÇfÖÁOeÎÛ™×Kýòÿìºw×é>Ÿ“½žqçcÖ'º²2ÿQÞ?Ë·8vò¥Wø´èòVj%±e‚5l%‰P2ÒîΑÕ¢pêÙèeC"L鬚)¢¢±dCO"UÑPµ+Jž~)|MÒñ•ª°  ð#¸ÿý¶Kï×¶áèñƒ Ôv2 ª·©ÕW´2X"â63¢±´’ó]p'l޽±þð¡Ç,® Eá¿òµ9.YÆSÛåg¾!ƒ“ÕŠ|8~TBNÌb›ÔígVÿ·7—Úmþv4CèS.±ÉËÌjΕJý‘¡ §,d0—Ö­gDJ¡¯þú%­‘êC¼WÈêзØ`ÊyV©…Ô&‚D…ÁЦkì¦N0(da³È¾xZÖáEØŸû·÷ægss²§Ù1ÎJ¶à¢ÖEK(`^1,$åÓV'è¤ð¦æXœ‹ŒE¯ 2*™9sfAü2qY–8cŽQlW<4gk¡Æ)n1âjDR{¿{•æ¬<ë4µ"â^ •óú¦ÈnwoB^î7ü†ß½çîmÎ`Â9MÄÔId\¶×%Xà,ó¥3ȹۄ/>)‡" zà¼dF±4SåÕÜ?Ú}”’* ±r·v`üx^ÇèB\•¡ZÏå´Oº²C¾/ÆD„ìjÏ'ð¥¹ñº­Lj` 到#ÑPFw޲,éÜÓçÉ#æ}:˜CµP)QfæªïŸKT’®ÏÐãDæ:¸K­lÀü>mçð„-?±{ ø(D[˜ÆÒFçCì³–…Yhº"ŠéP×2.çéryˑƵ¡ÎBÑû!+‘HÒ¸®l¤ŒžÑ$’&*Ãhˆ,“C×Àˆ^{ú¦¾ž!ï|®M…V‹±P[’æî[Têë‘·°QÆÛ¿òo>i ÉMs©…×óŽ´(XÈx ëBÞV¤_×M6‚mÈQÒŠº:µ÷\&®°LÁ>%§´*Œ{ýß%ýퟠٻT8fA@I=gÚüú}®2½©BP4"Î2Ìz3úVí>}´lÕK&%/¨|]44^pN 6tÅ»8ÞM.}Ÿç/›}Ób+˜x›…¾Ã”€ST¡±™Ö÷ߟãç™ôZn!aødÕeKÞkD&Z•SE½šõlF˜L+sH0/ÌrŒoòª•W–•r/óaóè2ûõ9)ÿÅ™ÿ³ñ_ÿÓ™WkþAûÑé_ü‡Ë¹ ´Uõò9OϺq­^0Ñ\‹O–_ dµ ˜ZR²·¤-âHn¿¾¯#u½öœœ}Sëg—h;{»îae­Ñqóýòó)>Ö =jj¥nwX§aFÅe áBXB—!hXC{p6ämœe`ÌHÝ Mà#\Ýh™#}¯V¦SóK_6o£±óÙõzpù÷Óó¬OÏ„r ÚWâ!«‡Qöš[W5ó9±_ðõ_î_üwÔÒdÄ´®£P[ÐQøÂÿT÷{2ÖÓæp,ð&o&ÛXS 5ܰþ3¶WÑK7Vùð5žÐ)óq¿é*¾)3I<˜¡OÔE>~üæÃßÕ…¦åÉ—êÍp±™n S2…!,âÇÌîî=›'æ6íëty©8ê÷ è¢×AÏ2¡Ý»ˆò>w»Á­¹Õ¶‘KŠ:÷z,¯5(Ç2`˜8qïG ’8w µæ“úrÔ·‘1 gNtiÁƒ/ܿà 6Ñe‰Ú.ð º[<;‚¥Q¹.¿ÒèAý˰>uà˜ÀFç‚d+Ýs8«‹å4=‰ è­ƒ1î4-ª¸-ÔÙzÖ‰@çãí¯’'/ý|«¶V­ §ÙN‘´ªJœJÌ÷ø8w!{«Ûsò>K=tÅtùŽÄÀ¤Bñ"Ñi;§_¸-nË ¸«˜ç& ðò™3\ÖÉ–<}yꔽzÚÑ@íH'*”Ìôœ„wWf–ù‘ ˆx—sÁÛÉ4øAÎ ÌB©>…Ã<¯Fl®ÆX“ÄЩð‘$as:‚^C’pÒKXÑìh Wÿ”™¯@Tâñú÷ñlԙǣÕÁÔ“!S¯:ß<9ʃA4ÒmU™ Æ0ã4ÝÒD‡ˆ’ 0 bÓ™Œ´$x£‘|°y¡ÖÄ¿æ/ýh÷_Ë¿÷0}rŰIÑïä¼¢‘‰(‰è.´~fFroê¶¥xk»ëZ“Þ÷¢]_ŽÎøè&ÓÑáMÛ]XqE¤AD¦ “ïïÍö}sÒSÖ­ÜÍ/,v¾AaEÁn tìêU/(‡å¡°®&Èô­¿¾®7¯—ûˆÑk_[µëyA/Ö½&v©»ä„ÎŽ ×ä튥Rš’±/ ,xY}ô~b¶c_€3a̶¥•Qì ü?áøJž ›=± é! 4oå+RTj‰Dœ7ßMjDÅ•_9QH„êÜÎÏÖ~-œkv¿-¬èÞUÖzòS9@R°xÇýÙ“…ÐØ0Ÿ—Î 0p8ˆ vÃaÆÒÁõQâcXâ¯Å@„¸ŸýKÔÿÌ5 —C"!:UTU:ËJ{³Ï¼Ll¤Gxò9gúžY |‹Ú£o]’¦A–œqh‹DÄ òÖAÒùye'(‘‰ò ¶«ËwŒIí2·Ê¯^ú˜@4@‘Q¾lÛ!Ž‘)|¿Š÷ô˜;ÇýºbžDGG1™Ú:Š‹ñs€­÷w”qmªfõ%æøí«¨0ŒŒ¬DI¸Õ—ò¢SÍ+ÙIØ!ƒ_„3".+¦ýÚ‘uýLƒ(ÐQɡҀ¼(,š´×…­)ÊY7:C×XH€ãφ¤¦1'ƒ\PÅÜP†@MÙÊC,*Q¦„PÑ ”XD „ %ÍFa“Š!iR *©àD¦Œ$1ÁL¦&‚ï VA”Y‰‘Ø3kY^EÑn_ô'lÕ5ô`šá¬#y¬tyò´ßûW«N×›g•>ˆ–I"0kI¶iqü7 #NdP’Ô)e iXe,çeÄɈÊT*8!­, N0ß±\‰ulÚ²50!šª±5_R#êæ¸¦á>Qeï=¾-Ù& 1¬©µ•™M&›„9~ïʽхGWßOýÑ/ùÝÕý˜úëÇfûêÍ»ßý']ø—¹}u–×hcý±ž³ž'îüÎûW1ýõ«›Ÿ×ßýÕê×|ÊÏ×Öü³ã¼­> oõÏ©?÷_;ë~©ù÷óÓ½º‹÷øSúšï_—¿õÑýã¸aŪ\ôg…ª2múÖÏ6“rçù©Û§çŸNÿú7Õw4¿ÃùYÞ?N†—íý+öëhe=;ˆÍŸÞñŸõŸ¾› ÿkÿµëÿÇI®Ü(±B$­&•qÐ+B=:­ 4fc:X‚¡SéVïFQœ”¶·Hb ¬C%R áHááâÔY¿Î®ïló^úwù4ÎÅ1x(ã/»Ø—. ×°j3Ñ€gñ‚Hqsh7PKwpI—”U”ò™ü3_jð³@b“áÂ!Nêä (Ua)ZJ´$Uªä2ï’ÿhüu¸ŸÔ[g™à­ž(Kµ«Ýb•‰°|åºáÈK/ŸŠ'¯›sÏßš<~óÌù·òo^ª¦ü 7hc‰´8 M²öÊšî,mÉb"¬$²Ô Ùk‹V=äšÆ<#&L¢J†8J)Âá $}F¼­âÖê]X[™Ñy¸9€Ô•&‘” ‰N¾  ÔRˆVFÑ*P÷‰ƒ A€ýâì aU  Õ¤$‰±X6¥Ò D ¶æ ëÓµžˆÇ¾‹¨S31ÊŠÒTN½ÒaPW9ßÍþƒU³:ÿfͬ²aÿmýÏ=¬bPOl >¡ §¿ˆ§^ûWÎC.Äà×Á!R©äDz +¯æê ˆð¯t™Y5Ï¡|Ønºh»p”.ÔÌoÜ£uŽR«eR•íDg’x¥¿a?7 F¥¦7;zù")M[Q…èÆáí>`}Zãų¼>0 õ µÞñÐvÚdß ÷z&9úºždb³ëã£Æ¸²!۫튫@3á]›Üåi¦MòKf§XÖÈëw”¯,…G+¯,ê°Nª´c±‚`¼Ôh(ÉÝà•&H.#Šxä(¤ãŸ(ócäãÏi*ÇëîªZÊZP¼Ðð=ÓñÙ0EB€aW.Jw,>¯Qb¢ã*Zã‡?+ªzHfV'÷·¸¼,‰ aÛÏS×Uà~9+xù¬åÑ#ºÊ·úµM º§N·î8ÙÝ,h˜|°¯ŒOÏùÅñLÍ3aÈ78îu{0 ]¼hŠÄLlR4åÚª1w+%ÄݘÏd$ºÌRjP"[U®LoÄ®&µœ^ßt\3MWhp_0 ¯Ht<±*&E³ÖÈQ)ÏÕÍ %Í•åd&²Ì2-Ufž¼møK4öý»óWÅöË÷©~ÎOöñ™‚©žÇ3”KV¶îÓKïvÓµè|Á°Ãòö¡^¤gûOÅÏ—ë÷øYŒ“Í–N]I¦íF0|æº »·„üÆnîF–6é&â ‘’0gÓ¡}RŸÜStŠùjÎŒoî½Êa“â>$aèkèÚSåÊ|uýÁn”×eoå>—Ÿ«”ñF· %N¡n0°"•il©mî•æôU`ÆÖöóϕͻϹŽçëU*ÁÞÓJKÍŸ«óù Úòþߟ7{a0Å57¸X ”PrÎ÷?ÿyþ·òã‹uRê†ê™ÈÇí×›c¯"Kû®œ÷({£AÔC…åܺQü†të‰g9-«d¨×ÙzGAE\ÀV†eÈhÕ9p %ø~~:äõîwÞ•aÑh1W€IrÔjCSÔ—Šœ%TD€p…ïãCâ¹B[ %¿,Sφ:™os>rŒý¸ùÎst8vÕ0‡Í®ùùÞÏ-kÄÆ®gcyHÏ=ÄULÙÛs Zdƒ ÌYŒzvˆ• +lÂÆ[]çk{–Aï`mRà€0ìhΆH£zÒçJë5ÕxJ¶T}A÷ngÄX –\F•A‘a„2T…å›LK­‚Ž /x€DVz„]V” zÆÔåm[ ©5ìeMƒk?ãæ¦¶{åõy³gJ¯Xº7ënÁ!(ˆ æ7²1ÑTŠiÀ.ÌUìi™CUÂtý1/t½v%j£l4=Ðd’Èr÷ñ~~^¾ÎÌÚU®\@+ÚFi{öuÍ·QñHXEÙÐ åö>õð÷¼þsùþþôå/?ûSöù×»Æ×D:ª·À©iÁ™¼òQ¹SÞû™QþÍÏÉÅó~ô§§ùýƒD|âeÊ•¶(Š\ʯרØï›}]»"’“)³¢r ©G—çÊÅ)¹ 6à•@ —‚úª…±“óg‘j|×àºè#ñHWÞþðzaëɼéü›q:øÇÿâÎÿIV6º¬q‹Þ|ëíîâ’<ͽe•GÅ~‹«?~ðB±•ªÈ¡-ø‘~êö˜•†9‡:~*%s óÇ÷¿½Èkì¯/ók÷Ùáä?·',>«4[Ëå“uŒ}D1CFh#7¬ “0‘œ‡âŽÜà *wà-¦z1»Hé(^ê³™ uIîÈaµŽ§¼ô›½ª÷ÛÛ磽¦ \²<§;MoÉçTvë.]=ó…Þ©ÙˆkE5‹—f§¨íìííÇg—_¶¨ü…ýèdÌ×°-¯ë÷Ê Ÿ+íp¡« ‰€…à w'9ºÿûºÊ ¯ƒ/ºE•˜Œî}pX¬Ÿ¤µ-JyM:øýéÑšv‚¢PÞ:[0Z‹0+äž‹—ß|U®a±2^êF×ãÄ2lw^¨p$¦iEÌ|ï·ï3 \þiÍÞ~yYÅKÓ¹ÈÇ›Û÷5;Ú¼†¶ºÏfc Bž¦çOÃêñàvým®·e›ýéµkÿ™+ÏåíµŽE_˜Çýwu§cÇ‘¼­'œÓ½‹5'Ö¦ÍUŠ¢ŒÐô‰R9¨/`æ:f• JžÏ@Ÿ%Œ7,§V †,´ ÅÆŽ\QO«ëL²XÎö/ÝñáÇÑÀ”¶×öœÏúgýòÒ±ªÇØ_žðÄ^”\sû<7û›¨ô7¨åMÜÀò±¯}ì¹½mãK”ºvéÅt»4ÞÿB>ùöÉŸ½÷Ý]KgÔþk@ÿP\‹1‹n(A›htª’ìgŒ¾ õs¸‚ Ï@ÿ;) "œ²ßYwP…ùÌBòÌÆï€OÑp”0Ø_ÊÒ€„}<Þl¨â‚ßÖ\§#%»ö+öi&*6ˆ»ér·<çºNR£›ÝÏžªS?òæsÀ7‡3±b5¶±Y£ý›ûžÙÿ¸‚t¤ˆ=½2üç<‰CÕj_?ÊÚÉ"iG°DyH#sŒU§èI4†e(gWÑ0¿ÇÓP¼Fî;Z,%C–5m¸$(3Òà†k0i壎ó3ЊÖ(*jH+0Œ‘@9h äÀ„ȵdÃZ`i"šÍE³J–-G&Åp¥«ˆCìÂ‘ÌØkE2!:$+ƒÄÅõUoÖeŸìßÎP¯·Þý::÷¤Št<ÜX|{žQ5fµãÛX^ÁÏzÉ£³™§r“+(w–¥3Ã#œÅüõ9_Ä+“;ͦx[ÃñlÉDS~ìdZ ½Ä\ Îq´bý© Ä™$N L”J²'%0¤H†¥dðZîp¿!<ŸÐÍèD S,)L%B ³ðmH†ÐPUç1I¹í‰„tÉ„E(DNúÈ-ŽQÜÃn(  —RlÖ–väž!±ˆš¥ÃD^ª.Èå´ËzÞÌÁ%Çh‡½z›aÆ„)˜š»±÷áëpr;\Ñ‚½¹Ø»rë[Þºº¸wìÇÃn2¶¬Îʲ*þò1'õ1oëiË•†‹‹áö,¦¢–…œµªß'G-º{ÁÝççíÆÂ[H™ººç,íϸ™ý$ø¹åƒjJÒÙz b¥,‘3ºiOƒAq€†*ðÓܶ+å´ãÏc)PXN6e¸ŽØ^Óýz$†Aö zýúåõRñâ^𥶛êê©sßâN¶ÈêéÖÍ>ô>ª\Uª×3¸ÃÚ7Éuýœb’l†±¾_í)ä\«­¸íý‡ùxWKØÇ¹*~_ ½Ø·Ï¼ÖèúVÎ/GÐÏW×ÏWMù[õ_¼×÷}¼§Û¿{Ò|ö×ÑÍ]aæÏ•~ý”ùKw3îã´÷7üG_›¿¨Ï·¾~|÷5?ò³Gß;äñÕ·nn==iæw¶¾~%Åî¾Á‚ëü |ùZÏï}Ëoóóé“‚\pæÜ›¾ï¦hÀÞ髎ô)¬ÆgF-ËC4ñ‹ ¨4O2çN¦jÇwm~Kñáçâåè)}bC¿Q¸/eNA4 `–!^‚!%HjVU˜âÀ‰æ ¸픺›P”"Œ Š´R@ÈSL*f´@À0´ÿéûߺ¹?&T*t×r[ŠI$’B¿AîB^ŽÇ〪5ÛPCH^ERÒ9Ýš´I” °¨D[0(„õÕyÃ|¾)”S¯!lD_õKù¹wS·ï‰sÖAµD]T¡?D¿EŠÇ{T×›ªë:f in¦{˸ŒÿŽs'¾¸æ¯©;ÅÆ¨¿CktìiAsÉ£fe©H™-¼Ä`#$wy«aù¿®~eeL ·3Wh]¨(a(±#w|2¡ Qžá[j¢7YIÓñD<”ýIL¤õO‘ÿ£Ÿj€f¼­6ùÍ5i?_ĉŽfƒ‡¼À Œ3yNUü¶¿~—þ —ó•VÝ­S‡× c{Eu£¹&Æ¨Ô Aï”ÍA·\3´pøî­˜c§n"ëlXúÖsÇ2üΉã1ˆÅ‚vEV´CTÍ:ÓûVƒêu’«oG/ßTHÊÍ%"aÛ7sÕªÐH!ÖbÃ,ÍZqg–Ü®¼ù‹*Ùƒ¢$Œ•©È“ìuEÍO¹”|>D­rxÒ¯ <ù\o¹~l5a&U&5–3`C'3 Žc´e!®frFÎÜ /†r>»ÿä÷ëíùÍüÓù"¥Ý9ì9¬EëÎ5¿7ô{Äôºö¯}¶{²µŸ.]Ϊ¶Íׇý·Ú÷GÚOþþp|U÷¹ÙÃ'[©±4¦úËGçÓ/¡‹¥M‘"gð9É>¶E>”Ý„j,í8ˆ†zRæNò5ãò³ “³1Gæ07€>¿ƒÜù;ί-î싳pëËXã»eÕ Z.Jz®Äê|^éÞ.õäøD®4!þž’~Y,¨s#AO­:ð]>›œß<\™S¶ ­pMF)ÅzDœ’-Bx¿ ç”TgV‚¼Êu^Ë[öÌf]ì"tf’« \7ˆ«"YC)ÛRí÷ž^V_¹¤â:ÇÞLÄ%h¨ª¶î>ÉE¬ÐQ!äœ8Á”ðéuhæjBÜ¢EJîÃÏxe“Œ‚¦-óR§jÅ€ÆÝó›¿sd¿ŸŽãÚ¬;ÞÀ(âÅÌûò²þöÈÁÌ W€ìì{ç~ÕW=:±—,¶({sNÑ6_g} XÝ:ýŒ‹‘êÄøóÌ6âvv)ÒTè(Ø/W~¯Ñº<Ö-YC‹¶¤ò±(7]Ù³h•º„"¦˜ºÔEùz£ÕÓxt©pw®& ¬Ù“{¹sÞW\„ª]Þi×AÉg9Wê™ÉZñ½ªz©Új÷JM"ÞF9”xá}ˆi½ÚJi^ˆtç¹SJ"&@åz³Yn&˜Ý*Vbvê˜1Ç£€¦)&ÖR=KßåQ¾#â xÂ&qB1¸ÜŠ{&=g“Í+oßóZ¸˜» ´€$Æ0c‰f@¦Ñ $‚#¥€ôýÁF„ûñÇús~˪op7”™ŠQ§J&ª± |Îjĸò¹§3{ù5>h¾æzò{ПÞ8M¹Áoéx+ Fx°`Œxá ½"íàŽ[÷/¹r^ H–dƒ)•!àËœ3 “o{°~ô÷szwæŸ`tÛÿøpû çZSüR¸. ÂO üâ¯zø?ëÿk?YüÕŸLeÙêÍØÉ¾›¬2o«~ °úâí.o£PÐë–®Ó ×TÐ~˜<½ל +œã®¿É{<1ú«Wó—Þühþ_YøŸò|תýçÓüüÒzXOŽe‘‹ªK$SK4²µ‰]Šv ~ d©z¡|Ñ0Å4†nBâ¢mQþØñß$ñ· þ ‹17Àø˜¿ßwð'À eÉ¢ƒÔ¸³õ!ÏÒ(_ KÂ"4t Z&‘ò 6‰KJÁíŒÜ8ˆNHÅIp)̶!m®.räfô5ZV²´UÔÊ(eÄq½1«Ó :(€FM+—êÅ`Ù!@mdâ&†=H h°ø‡†®1Ú™.[憻Ûhoýì–g/ûfú2Ú2~ƒÎFxuвI9³QÓQ¨´-¼·ê‹ÏV BϸÔZÓé6~ëm Ý‘©qôÿ”Etùh_?±Œš¦_hþÊ9 ›Z&>ÌÝÆüÖP`îõd‘Œ·æßÔþBݶÆÏwþOmù@þ›:u;ë­)‚Ç”e“Úeü¶pór†b“Ý9?Ãy>®­¡öƒª†*õ”—ƒµ·åþ´ ŸÑK-úúè0óß?O~^l\ŒG‹Ä´a¿rhïP Ï*ËO ‚ã1ÌÓ‹6¶‹&aÂ*2iÛÄ»[â[Š[3‹ha4„Ä5–9S-Œ*:%=T‘Ì®ìï|8EE?Îlã-OhKk‚È’¶Q ùኋj3[a%ÇH¾ð-H³­BS8‰Uáèõôd{ðìYc&ýý£’éêÈ—oÊs¼´®9¿×µíøææ ÓÁêFs+ ]¹™ˆ o90ÇîØÞoŒ’±Í sûعêà[ùñÓ[ÿô$¶ŽÌ*9ý†^­c+þÈs¼Ï’º2¶1ÚÝã\½}‘»k/=(^œóî°°2r¾si[M5ŒÎ1¬&ÃåQènÅd89ïØd&¤c@Rêúªø7¯kñ9 äèÞþ´f…‡á"êŒpWe:c|( ø³]°új Ÿç#±¼E§Iç :$°m"18[Ɉ³&hŸÆ¢—5 3Îi½öÔ`úÞ1Ó¶x·ÈÎÂq‚RÀ, p—øiÇ{fžµ¹ÄÆÓ±—ÃzdÀᇌ|û„P‹¤?L´Ô:D¬}H±ØŽzçûåôü`Íé‰ ,®LÕõŽ Jïž‚kLå©§€)m6]Ç}Êkå{ÛsTc{jk¿Ÿr}0HHîØ\Êcç‘æ5?º3Z¡änÅD‡"2Ñr!´ÄKr….lšúZèEŸ—+ ˜³°DعTéܯ±+Ü(#/hémĦ^¥Pl‚ k”^ã Fí9n?úçoÓ« ‘_×_n‹â§Ë`e»~ÑÝ}ýdì×Ï‘O&ÛäçŸû{äµøÅì;Äkþêÿê7ûáÞýò1{úy2y¼ê'õçøëË`#6צ7g[åÚïgã;ÚÓmiB iƒ7qSÎQN x'$i!¼V§Ã{ó«sç|W÷ênF±¿-LÄ‘q=2;bø"BÇÈá/;= éÂ6öï~韟5W¤$ H½fñB¢ ³€ J0‰Ä PJ§b"[$’@, 8 hD‹DV6æ1gù)žÄÛäM°¸C¾sÏËÙq{ˆ‡Û¾qÝú¶ŠÃw)TS.x3±iï¨l Ä}58Z¬¶ ËR£íÇ®„Ä´ÇìîÒðI…¿úØÈ±v¯‰»æ0CA¾¬‚¬‡yJIžÍQ ÄHn“Ÿ]½D=iÈ)à–ŠjÃiϵZ3ÆŽr[„¾®k\lúëz/ƒŽ°ælAMÔUåÌÐ+;âÜ„1d®üJSùÛƒ¢QW3¨"W¤` ÎEX*Mn(ŠÌ–~ CT¬D^`µ51d Á2) (ȈFcøØøäûJ>Ö­õÑȨ@D!@Ñ€@Î?éÂcˆ˜¡÷ÖîŽÐò2”19xkúUº ÔÙ¦­ò«â"|#Àêk9_ç=ö8:N3-9yч_ËXCÞo—bçã6;³œ£ÅϾޕØ*T÷¤>¢´7É©Àfè@Y…‰–¸Ú¦½ƒV•îLO;¶U¬SÇQC§ÔÍe%š[ëߎ÷/…|½¦sÜÄwâí)îÊåà2SÂà¡ Q®Á5mön±ç<”œ÷Wó­Æ—­lI4ŸCòε‹Ú+»N§³µ®[pt¥%ËɩߞöZÍD›Ñ×¹÷Y·Íµ` ¥¢ü<¯˜ˆë?Ç@Öÿβüô³f7o5ø8å7È@²—W9Y­xàÕáë¦Ô!A¾6?||ilð‘“3„~Æ2è$ÎS¨–ï»:š¼‡Ûª(’¿ôïýÙóÊzä½ýÊV]—Ó¦©ÐÆ«¬‹Ðb/BÉiˆ&òÜBkšò^t–Á„³v™Ø¬ì\;ÍOªë¢¿òD’ñ§³!¾Ķ}Ÿcîëë¦ß zžë€†èÜ<QÍÕ@w­QµôÜ6»g;K¤ª-€ŽRQu… F@œò„Uî³w{ÝKÃ,©û0 Æ‘ ù*:¢É”TR›•””’JЉ*B£Ö‹ª•¸,`„‰4½™·A}^\ÿþ¬W{ƒДPï¸å›å” d‡ªžªˆ»,çÁ9À¨8IÍÎe\nuc2Ó`ëx¹‹¦^pŒt‰ øOp²ß£ü¡¾#ùÁ·wo8îÇ®@KÐa ´«ƒ á$*­>ΗœËáÒJZJ”¸µA*ÒZ A¨hbIšèš&ËY޽ŠÊÀ¶k¿ÒDhP!…@¯hrr¢EÇZ$éí~Ù{_°¿ÆÇiRaÆ>ŸÌèÅZ[‹!Jh¤‚&H"A]àZ \ш—LЍ8È`Åh:¾@•a€¶uŠƒVmj>§õü=ßüÛ¿òοï_~ë}w1p£¸ @Vƒ®¯—¼x^ú÷›ÓÅ9k11U®KÕIE{]R·†ì‰ gú_EÆõÇ7Øg§ŸnV½ù0ƒõÈ‘¹Z²R»ÎØ \¥0%3qɲA“õ9þdSÔ{{Ù®fòeA•ÝàH~e@PN X’q¿üÆãÜø_Ç´–Î>»8~÷ùj¡óƯ}P&ôržWðCéçþ…müåïœØW”¼Æzížß±«z’7J}´œ‡Ã>G«á´S-%‡"b+{'[MŒåÌTþzð)¡Ù?ŸÅµ_ñÑ'gÿž7ÿÏëì?Únª£VlOÖ¡`ˆ¤U¦0ЉE˜j(C¬\@ŠÐ\lŠuZ—¤­xŠ*b@0ƒJÌ !¹ÙŠ-T‚­¼}Ï(Ç£ý¸©D…’[Ý#<Êa…À´QL,<ž1ÑÒ’³X T-'áJOô#G ‹Ör*͆I³B0|or“<”ìÉ0Ñ&š šÝŽƒœ%= ‡€»&6 Å¥­Wr³þ–Á–ü,¼Gs{]Çÿg§¿ó†‚imu½ÃŸM™½HXå››’¦Ã"bà§åOá.X[‡©³ˆCô2ã¨,Eÿ—ˆþªßs]"«Eʦ·Øœ75tÜ%oˆFEzW{*ß8ÌX<èg§½]]»L{l\CŸi\Ì]-=ݽH©M ¨«0¿fs®ƒ¬Æ±Ó32bÑe*Lÿ€¬‘Úú&‡B>wüZÞ ófýË|!÷±¿êüŸçÞ¿Áý—=óÏ<ÙoÛȱ$Úc¹Õ1Îå\i´Ã饊ò-õGŒ†kÅÀ1ù€KCw l¹èªß’|u>¹ëŒÙ—ä l§•˜‹{ù˜»M|{òò¾6‰Šðe;ÄØ€`\:±cK¤i­ lœ¨…qËe#³e†’Ð]8ÊEA*XðR|ÙAj†è‘â9ømu™A·²£`4,ðM>Ü&µ‚E Ëd;ÑXªív&‚ 89ºä€D(µÅ)¡›/ÂS÷÷kt÷Øû6_ï¯ ž–"¦Ø hf ³à€ÌÛw™ÉÆí©¢Ø­¶!á8n˲W÷æ%òƒ±tiþ‡Û­?˜ñžÛ3R²>rTw®û–hÌ/ËtÀP´”n}uý O>f;{+¼êçÎý3ê l»×9;³†Ô²µü…SÜ?àN…í 7Ó¤Á¦=×Ù~±¬ÑÙW*vŽdð!D´9îËhb޲<:à”×¶`_MïKãDî+*âŽAãcŽ„}XÓ^ìËóÜNV­E`lXÞ S’ô˜t¤*Ш4ÕMîéÅ’,ïR-³ŠûÅÊ>ʳ÷Ð}Ó0Ô«“LQ¨=V¢éÔØnÉ f=ÆÐAÓè’|ï— ë9Z]{nßö™MGƒ`ßa8QËxã9ݰ½µY‡ùŒ±Í•æ$£8{…³Tò;´Š[_Ƹ1n“¨Q­ÈK¬(iî°•QL®hÌH®àƶàªù=:WºÑRÙÅ‚^&RXfc@"Xœè9;wz*\‰oÌÒ _зïÊJ§jò(· ð 'M<Ú<×Û;Ù¿¼¾áy"§©Tó’[áã¹*"³÷Aºw®…ê:ÁBˆM][½_ÝÕüÍÔûÇ_zöÁ¿øu6—{çµg/ÏïÏÕëQe&;³¶qÃöÖ=¥UiûÞH©˜éЮ>µ$a§t•@fØÙÜNHzq&¤àZ‹û]ÔaÏþfpÅš°çyô9öÜÀD¥¶Ðž·ÓI‘dBU,VØ‹ŒQÐD1²rØ z"YÈx-zDÁ R/ ÅkýNðädÿ@€wОaGLj¸¤(³ÎŽËU®‡eÀÛu<½6yUÁ•¾ ý­g‡fû#'ÿ`<Ããà ;ÇG’U‡Xbí°ÂªM&Ö ÷9gþI°l®{]¤²,jÅ0"Žx'³JV ¼€ÅK¹ óÆ‘Œ*˜¢]㻬p¦ã9)w7òTÁJ¯^XHÓ@ ›ø·ic•µ–Ò­E1A’”yP „¤\# l%&Q'™P`IÃ,$»ü¼ê˜½¡»³GëµÀ˜²DXR‚`[»µ^ùzu_÷Wµ6¡Ê¤!홚€¼>ÍÙ+ÕµÊ)tn*  ¹ì¬Huâ(nmÒs¹×-O$üàœ:Áh0Å}Ž«·=LYYÞjJ>ªóêýÔŸ§ÛsðÞnÖÙ©ŽærFó€<ó߿ؿ»,#¢•F8¨)¢e-j 53Äܲ­Ã´±(6ªZ/9µ•õ ­J÷êì5ÝW×}vû'b¯ó_Å h׌Šk&@ƒ …´$•H{Ãì›ÁÚÏš¹Í0»ª(þ¤¿+¡£Û€¶W+x™ÞGÒ<*`)¯c¥ûáŒÜa IåXn¬J ÷Д-½R^kgJ öBÿëøâgüR±´mª½·jº·4Ü2<ÑŽ ð:À™ã·9W{ú³]áâyÌã}{öõ²Ò¡ìU×Q7…á5µ…ÏTŽM2ó=X ŒÛâ5)÷ñŒÅƒzäë”ÇS0–¸í^dagD5Ôb;Á`W³­‰50 K¡D@@ ¶B”…mm£t®ƒ<÷óœa/ûêú8ôo„Û¬pìºW›kT›Û¡P V! 2 …‰|j£°ÎTJ,°…`¥ ‚ÄU­‘‰£¾‚±n±ÆÙV¶Üïìõyø~Ÿsþ¦ø¼oÿø¥å&f™œLwÈÎNÙ²Ñüu®ó-ò+™/4èlíÒÑ6Ö\b¸ÏÉSp¬è‘EO º†|K4Qp7â¯>X3L êDp&»çÓ˼'÷B¢V$ ¾ úÈ/JÆ@c„â`‘LÂ;Q4ÜU­_ís^Žrz÷ü??ò¿8:mh_Œß¶üàÿŒ…˜~ì§ÿû+ÿÃп¡ñwÓo÷ÝêU#“Õ`¯8Ö¯ãY˜Fõ<ÿ³çèááýsàîmwgÕ~^k_ à%êªÍ”î T‡®Pm„3ä6)AoA/LJJ…¦x"½°£V$=[ ÄͶÏ}h3à‘ YB¨Ítƒ“ëqîévw¥Fc ; Ê *Ú'AmCíóRé}Z}ågÚy£Í‡M Õ+HZ˜é½ÒƒúÚ~H•IÙ‚+Q XqE ÖÌ÷k~ëÍp¥ 55´B/¬,fñ*‚î ,ð26.»'"Ý"ÎpÚfAoú°} ˆ)W|UÐ"Pk:e>F,4GU ´¹ æ‰sóûŒYâ¿È6œ”qßdÊw å¢Ì¶,q‚ªˆÀ”¶ EêÝ…§u+øˆ\8ÿ"âôžïò´9þ èoÄŸì;ïçÝÐ$ïxFŽ»Ÿp¸ŸåhÑy5s‰" ª LelÒN‚õŠbÙèê<÷¨ÉÚ‹¹ª‡´vÍê½h\b…UÊ’jˆ¼Ö5Ô–n“46TS1¤X{‘ 6ÊZ¸ýóY#¸Õ 9ÈW3wNI.»g[*T'“À³ÇG4æ*Ô-OçÂ5о¾_„hsZ-G‹AbŽƒoWdÊGX£EÅäÝj ‚4 m^ßÐ+b<ÿ®•o>Š™n=Ó9vVxW댓ì ôÌÞ";sZŒ–#Ì€R­¤¡Õ×O¾õžièJ]P2ó°È"ˆP„@‰r,C•BSœÿ²¢áKš™§·2ÈZs5®Ç•­£^°­q¯ê®ÖÊG˜¡·]{\Öž¤%MŒQ¢˜€‰ü:‰3ųÅ] x–¡‰û! ¨L½æ8ÓÒ€¨UHDš›¤J%WŠKq¥F¤+S¼ùBñ¯®üøÑßœÿí_¨?ø¹öc==)sMÎŽioôà×¶ ê'¶ÿ ùG—ð?ºBæD—<7¯Õ£,Ž>pà¡Ùtü¼.ŸúˉÜÐÖÝ­š‘nçhß#p1w&ûöîõÚ_ѯçׯ¿ŸöõþëeüùömÍM­÷ÆAD™“e—7LŒ t†VhÂXÔÀŒL`4ŽíZ1Óë±7÷vÂ|³’…H  ëÀõK•ƒDî̓r¿üd½%~4yéZ† 8M)$‚™62d¢@]!®ñ ¨ËôÖIÆ–«R¨Ú>j¸hµPLÙLYuº#²H”Í"m *^H$y½3 ´Kßà]ôO¶®ÁXÎíÝÛ&ÄÝÍÆ!ï“÷•Æ3ËÎ…X`Z¶]íÁô—zÕt6s$†bvݦšO„Ýç†úÑq HF û`RDOãþ¥ö?^FþÅ^çh4­ÈßWôŸRÆhí‘͹¯mËcœWÿÑqÞ¼™–YŠ¡š43µòѽ®oGo‹cÛ|Ûùqo&øðÓChBÖ°z²çL‡A®ƒ¯àóà/hŒ;ûpu$|z»š=…Ae¬Ñ«ñóÄÛŸîkn}s™†æ„žú8N=6GBªIè‡%œK½Yû'.Q¿ƒ h¥‚N›ÓÑòttêƒì..dFK˽%z±ý@dÜÜ[…E7.{ëôX‹ÛsþÖQ\04G{…É=*ÈVɪ†xIî{ÒÅÚT4Ó š›¬ª©hô$Wt“z¢†äd„$€>Ó#@Ñ"CêÚxF=fâ»ó&bÔ¹î®oÁ½ÈÎ2\$€r™ÑwpºÄI‰]f'€éÒ}ñÄe­m<þÎ6nÎ Çç9ó¬ú²aÍ%ù@ö;ëÇ çîSQ,[8LM7BõˆñV~2÷ÍZ©G/ðíö8ú{úõtkCså™§¸Võ;#ކgÃÜÂXŽ{ͧfw •ž9¯¨Úð&z€¼wq»^Ç6!©5¼eŒ¯óGÈ«}?ˆ™ÒÎÑ…›Q3Á›Ç[oákJÞ`›=§Pà.Çi¬»ŒçP–Ù8G—ImíkÈQ—|~ÇF‡bßó¹¤î¹ÞsÖ“í|?m¹q¼Çîz6ãqod¯?ædÝu@¯œŠÞ7-èW!½ŽBQÍè`;Yâz e0Þ òÜ‘Ùe+'ÈmŽ’-íÒeަ …ë ›²u´ M¢ª¨DRm²®çÆuâ.G«öÁ0;í$z¬ 4$Ègôlsc† í#¢%°8Ú.Øý9Ý›µ ^œÅ¤8ËV0ˆ„‡3tZ}G~”Òƒ3ßÇ™%”ƒp‹® ;"Äac€i…{©@µÆÄ ¸ S€ ÎY`F\Ê«- C ¢ö*#zÒXw IÖz†=Ä0¡T¹æ5¶‘*1ÍÜÔW-w•ÀŠž9eÊ%õbÖö™¬+RÙžÊ0Å>%–t=úfó6Îõ÷:ú̱? ëT”kÝòê{›îŽúPØOôp½¿fÿÒï‡_µW¿œ|æé}èÀwZâ; áNl -}ô“¯G¤_Þî«£>ës$ÏS߸¸ÙŠ‹Å›ëø‹Z/”+w—¶ãË”öKz1²ú€zÌ€¥éK3C›`‰y‚š‡UŽÙ[“½³K¶j jó@ËKßP=1BMûUý…-É}qú­õîJÇïÞÿÜüѳùÕOú>£š!:sEqÛlÈ ²‰%˜ê  ˺G†jH€€ Ì$"–aâoÂek=1(Íåê®Éí,5#ç¦+âÿ:Û×É&1Ô¥+¡-š0*ÍÊGA8åI’š: 0#i¨Órˆ2P"llÍÁc»å¿Š¯ÿptÿ'–ìô‚ª;†Ÿ(uKÂÅ™QWrip!O¸#ë㯭.}~Ò4$Qœ°¸¬†2_O<ˆ~îèºüKοÌãÉÚ¹ëèÒPÂàÂéó(ÃÞ»"ä³KK†ÝØb›zåyÁÞŒ.á3ìÎAZvÔE®vu,*¶PÀDWÇ RP sr+= &²‰ŒI#†-„ ‡'±rF?„Þ_nýý}s¹Ü¹pvéµ{y•G òJÍqRš ¬ 5ÒF$qÒ …a¢¹¤ ×L+4B›Öt‡bƒ2e å”A(ŒS/žÊ·Ä§ƒurý±öAç:³·sÛ'·Öcs½ñž¶OçOxÇùI¢ŠŒhQÀÕÔJ‚v”³‡ml!Ԭ̾µ%š €[/€1;…ñ,§¯òÖƒpâqnNYe­â6÷'È⨕Æ~¸žì•v)5&¸ÌK™$&3Íêy~|zÿ­íé-)ÿÊüöø>ö;ÍR¯dÊ9û^Å­åÚ/ÿÏ_Í ÒÒCæu[FØeІ£•™ÎœãW*ªñ7úï ý.Å÷¬ïOƒT¿qˆb0È0ZÅM©¯ïËÕ³]‡¼}tý¹ÔñbÔDX§4~*,H¬¨Â«ÐNiRÙ3¼n\ì-Ù:¥T•4ƒµã:,ã íŸ0W0Òjçìè8Š3¸†Œ MN˜Òªª.û.81Lï·|WÏÔM ËM;vWiÉ—ˆ! 63P0™3¾L4«é’'·Òiâdv‡NPµÙ¼•\5­»‰'U²Íºµ5äÚŠ‡L"àîë~oíÆ2hv÷m´L`9•iÁG@!N4êh;•YÃQg‹IW®Áݵ"+Å5úÑ0AßÓÓêýüÈ3‰Œ›:2`âÝÑù4…wާÃeQXH˜ŠŽ«/tû³RÛ„±Á„^˜$b[KÝî²Gþ&~§0Ä “UˆR?œy•¹sgð™ÃŸÐ›zÏfhÑú¾àyîÄ.Ù1—îš[¨zHm­ æ•9ªVºa Î0œ{•t«®®ñÆbp…ïÁ÷%v ê¾YVËŠl—ß _•ÏC^½íÞ{66*«65=ò¤d;â›BÀ³ˆv\“u¹‘ŒM¢íÍý¨íqêl(x–5¨ß#âc>¼vШÒ8Qɦˆ[6ò)°m©1¼7ÜÓæ™î0(*ã•2³²Euà¯@ñy!þ,d±tëûñ|kvXqgx‚wU³í°·úʼ÷at’Tq8¼ šú›×¹Ëªô««A~Æ×ƒ;=,ãRDRPw¢‘Î*ô–=“½<û–‡æxÿ!”‡U1v ÁBrŸI½@À®Pƒ:ºm(‰·M‹SW]óé^©üºíÌJoO^žÞÛ8Š<¡ý«¾ˆ×(`š×|­æéÒm!@ƒ& ˆÁ°·EBÔQ—ÕAITµ­¥D"uÖÓŽŽÛª6OÅŠ´UÂÑ4^ „[«ÉŽF¼H¡š&R¨”â-â¬1×±¬zzªŠãg\fTÎ4íGÂ¥^Ë&ÛÔ¡=á6XŠòMk)Ž]Y©2nQÖ¥%‡Þ£n"Isz–§{}çÝboË=vFB]i2¶®‘aˆy-KJ¬ŽTÙ亡þÒÓ°™%MÅZ>ð [E;õh„E#cèJZ8ÓŒf€¥~кwWÒ].€·JLK†ì†‡ I¼¤ˆ™†©I¨v‡Ä"Ö€Øh7äµY†šô{s3c´aÑölâx’n$)eeæ41s¸* ¤›®8 @F„Ü=-VÑ"F„Š!) 62oToB%ý$te ]…zXþÚÏ~W « ´ eÄòÉbŠ µœ?ª½Õ¾)¦»„.=¨•Ö¥=3¨op/ØÓúkú>>ÚÏWg£ã‹£€QPj¶È­&à‡^õTs*âùž>i×uJ"g¨B6û¸ó™—,~_íá ºª`y¼¯a¾Tá” HqWV>…² ãÓ€ u·Ð楳M™O˜ê íü2šGaEo£5Â{¸û´-*ù‚ªzÊËtÑr‡€0BVNmÄQ– ka-n­æÎÙùp0üÁä„ÁGXmsliÓÜi,Ÿ’T”mK‚ä±é= 4Fé -‘6´]G‚iNÜív›Z /uó†§çàÁ |ââ¹Ëâ>Û ‘(1€¶ÊÝ£ùvù²åqÄVm&z/Ò¥ÄzøÑñµ \»a”9 ¹µ1½9Ã<ŠÒ$X¦}¦m Ž­Óšä®½þ7Í…LgwåŽï É==béÒAD'|l·­\á‘è#í½ÂÎâèqOÙÉÝäK%BîÛzUÎC’ëö{9¼ÿ=>1mùqüEÐÖ¾;:N»:ñíx+|­—m Z¢¿*}FzQ³¹˜£†'·/ð©Ñë¾Îp.àièÀ×AæÔøüXg`‡•®®mŽ“Nì­mÉHxÉÌ(?'Þ#$÷vÆîbXCU÷p߬øÅHܯ®y¿Ïhq[ð´›|^0¯_†Djhòù©½GR‰*ªªÛSW×kŠ›‘æô`”´WÄôb—fužko~ÚzÁõgÇó‹v3€WÔÛ-öÈn¾ÉÕU‘òŸÄñ 6˜ Õæ»]å Üwv­Ý%[^v õ¹.IÙò"êñ´ö·›X>Vã¡›Ûf:—×»o{šÏÁ¬^ÀâDA¶„x2MiÜ,óa¶¬žíÖíûúmÇ‹þóqüLÿÂàÙm-lÝ’ûÆ´Ä‘® òCH(’ŠŸšŒ£ ®Æ‚BL0 °è´ò;M{¯Úü¸œŸÿxÛõç‹ñù¤í‘»ú%p?#î½úÛ7¥ÂjuŸ×Jt¿¬né^š€›¯~Øçôm?œ4~ÇŽ$m!FµÎìß™õ†\‚Îl 21…´c§4i‹®—Y?ƒ{½!EaÁqL‚=uØ)–(8…[½Ó¾Ï(¯ÞíùÝeDÔh Åû.Ø^ lÌ4P‘_‚‹Hh{Ý~¤­¾~òñ·CúÒ „&eT•³€2•Y9 ŠŸ^ö\ß,ÍÒí>ÎzÚÅ‘4§oÍ9ô|7J ²aŽg3ž‚8\éœËšã°»¹°ûd=ÏõµÂ9’³{u  ßÝÊtVæµ4 Ë¢‡/2ÊsNçš žtiqàb ¹üÖ\ŸèÌÇ DÚB€Ú_Å—4!í,=Ð1ÃuMX#žETG"€5*GYå ¥’íÆc…Or~ås¦ÜfÛ&ŠL¡R‰jT@# 4£bÊRUÖ+æžr;bGƒ`•ª\Òª Ù¤Ãû½LSwDŒ$¢C(‚"/BS&`‰8,åÉfçu¬ ìʲ˜"‹A%R‰×¡LO5ni#o³Hp#Q‹6»AZ ˜‚2¤*WYa—ü5Ž·\Ûõ×vXã°î¶âƒ …NhÌâ æZ%œÎ³\.‰y F&¿WrLb²a‘êoŒÿ)Q·›’ÊðjU«thK2¶Ü—¬Wõ¶ÈBß¼¦à5·Lû"5û<5À£‘šUi§æà^’ººÜ˜– ›áª½{«Kö0i¨$ÐP‰¹Q“QËRŽ,Üc+ ¤º¬õÑÅš[Äˤ$Ü*gÊ"í,Ø1QQsWõX{ef Ž8`Ž,õõàøT<%àÛv¿Bã·ÐsÄguW¾òæ想ÃûF}ò©›S¸hd¾bÎÁŽ „W9íœ/~`vÎ[Ãæ¼§þô,xŽbvóo®sþD3°~íÚ`ã¼ëQÿÛ½U¼Y  «ç{‚A åu«^Ç¥X*ÌÎ ûú@5õz2¥Þñ%‡™ÌÌÏ2«àEZ÷Žªdxí‡kÀŸ}eûe!WZñ~üòüŽñûçZÅ-ôŽÂ­Ûéu=¶‘­‡ÑFAÚbÀ%¬/yŒ‰–ž8fBÁ´G §”,ä£93ê7ìÈ?R ‹3Þh$ÆœÊcŒ0c<qzã* !´*N‘;K ¤)‹(¨ cËhÅÁñùûÓùÙç½üïøø˜3©¸ÖXÒ|KaW"ø—å'G×e»iT¦o|âõ1|öz#zðHHñ=ÎüŸÙ|ÿR6¥Oë€ò-ñjb" BmzuçùmmáÂj>0´!¹»óÚœ?²“¬)÷8Æ’±œÑ´ËO­\ž‹;ÔšRK›"¤ÊH&±h-j º‹*h¨ÐÔ 2J¦©ì¸Kζä±×gö~pqfNçsÉ\Uf 7ðŽKD ­e«É)ñ,aD „!( ¢ŠÔ™°¦p„€Èf  P0 €D¸§„WU·ë×>–—hgæë€`ÌŒs"iD±+<‡,»îדþñl_ ¾›Þ:·vgp`ª3‹p.Ós¢‘y€öÛb -B)Œ‡õ2SÊ2¶«ù’ Š´:0•?«æ¼ênÚ¯+I°>¸Bñ­ÉðÂ^-%ƒ‹ @8xbfdȲzÁÏwnÿ"˜q^ϽyÜÉx£© rÒ&4|Üû‰'ûåÿþ£ýzy³ÕßÊÔ— 92ÓYD®Ùœß»½ÛíþuæNA/}Úã3<ö7Ø„(.»ã©Ówg7h˳죿¼ÛÏÆ{Ž?XX}a²mdŒ¶yñŠ éNÞRŠFÊ€H# RˆP åœôâ.pmL•M ú íØsë@›léÌüãÅIÕ×K´×IÒŸ|¯·^:®ÛÙyù ülÎ,ŪÄá nUèr…:?½·3Ä"ét)’ãRG˜AÁò˜óøe÷ö~.óô¨1 ž%YÊ ¸Ê«¾«•±ë0‘ñµ!ß6þòr…ùÿΓ#Ÿ‹\§2XæFpJ3¬ñzHÏÛ)¶nôÂæhá$FÒï"ô)8ì •3&=á âŸ^þç/²ïs§[ËPÜ$…=k) ptiRXahó9ΧÜ{þ}ÍÎÆSί@¤éÉ>}¿œ¦%Ëð„ª)Ré©8åài¸µz(ÿ’çïyÿ¯˜cû~÷-_0Õ´‘×÷µ;/?Ö9Ë<ÂzqXºëÊbg‡[µ‰Gã°Ècˆ”ö%x ©ÅÁd)šAãV·îÒf”õQð¤k´‡A6¢a :P¡ @@ˆÄ ×H,d“£G=δ7,À{Ù3ç‡íñ,C« q‡ÑEçĻѴD4ƒ7 VeŒõ8€ÍÑÉíòÕ_9Vî"gÛ×>vNÈÑ,ªEUÑÄ  ŽHqhg$g”êsò¨Hº(ÍÐ}»çQjO5ˆ9lè8Ò—‚I4‹ ‘äÎsºïßÛ_§ÌNWlÉŠXsM-°Q•%`ˆ!ˆRFÊ‚X Èñ&ô’ÀÍ>-t­®/•Â5ºL¥[-÷ I@QÖY-|Ù§yA|A MR³¯ü‹ËÍDÉoiÈyß«0ì”35<4(`¥ŠD²æñ!s醳[€e´o¾'ùª\ þté‡Ç?ÿOŸèŸ a¯Ì;¶ýå…o¯Ééö„ìõZ/Záö”¬Vy;ä¶(· „¤—ÆÏüƒFð\3wêÉøIüê¨l%ÐìÀFˆŒ7»Öã% œŸ_Ðä¡ÉÑ~[õ ½K7Øôèì¥xq}b-DkV¤ÏENT/ã0ÉZ]àf*A`[Yá·|ÅÐè0+XÁ¨¾1Þ{ ”¬ Ý»¼wáS“ ¹ËÓ˜p® `É´_´“¡Ø©ÉMV©ÐH^t«‡ê$$rACôeÁH£câ¨éh®õ„§ª—“LΠZo?Ÿ¤„&QºaÎmrQ$d¡MFyÀÑ@—‡B!oQÃF vk|R^rµp™ ®¶ œÔ67ÜŒšQI&j#Øp†˜]dïÄgƒ«‹ÉÊbµÞµ’:•\º £„IhN3о†z¡õ%žå7=cˆJE"‡×}u¹ˆqoÛ@Èb“ãBJÍ3RAЪÑ"}aá5ð6–ÄKýíF²q¥óÛ-›•\cÈ=F¤BâôhZÖI ØŒ¿¢˜Ì‰…‰tçdԟױ×a$ÐqщhRͪ‡Ÿ&9ÈM§¼’€ ±ìs¯o-”Q €¬†Ó/Ê7¯oÄÐØ]À'CìÎøXÞg—[ÑhßÍD·MyT :é9íšÔýÞU¥š8é‚Ì¥é;”= ·p6À„Ñí,½K5]¨m›#|Z Ì@$-éAɽ€Î2iGuOiH”ÙÌ¡k3E‡‚(@tÎ,aÛã,ñ“ïhµš|y>²L}Š—IVÒA‡{ÁQ™ØJ aÜW r/1ûÐÚVªùi™˜8q9 ½ù˨™!»†«MpË$еi¨²õסËmSrYñg6;¯>¿<'ÀÚÓsé¥öJ{Ù.‡j?TßaÞÂÏcïèbÚ›QøÄí®E»AãÈÓÆq¾ sŠÇ%Ø„¥x•L åj Q޶mŽÏOüþ‚mŽ·b­Q;©›j6މf¸äO{T³iH2Ò|&£;ôXº£2Y·qÌ)ih”/»zº{sÃFz<ΧOÛ•kÛpAm‰;³/WM3Xû»Åî³~k³ý<{X«>ïR!Z™g DA» î]íh8Ñ£¨Â5Ú¿RýŒlCSv Oùr[ŧšŒÓG?_Üëtûð1ß#7´›>+¹wsE)°ÅÞ-ô}ÊÄ£ÕÌ¥j¼4¸Ü«i ʸ l£| å¢#Äœ\îàbG¤¦ÜñæÍläå!]¾ÉfX‹éTqÄð›°tÆ$Ð5\d˜Å^}nÖÆÃxëÿ:g­ø§ft™H®éJ¼YÂgš?ååã~òì{¯û¯0qsÉŸ›' µöì=fyå.|¨Ä‰e´–óqàC«§^ô0ËÝZàj°×$¯óú¨Öª¥Ü«l8À”*Ç…3åp ,?Ì@ÕxŒ&1P³æñ87±â9áº,7«Æˆ½¯çjÊpˆ ›G'#»â8w(¦$N¢©öe¦ž 1¦†™± ‘­2H’HK.59ÎÂiB¥ˆ˜@05eq¡\Ð3ŠUA#‘aêš=y;£Ö,ÚÔF>)GšIFUX"Ù®xot¼Ãèbn‰"ÆQ[HXá¥j !Ñ"BÜRHù*}ø\…W“"Þ•Rh`$–È„HÌ;IòËú|¡SjË–B"T+R˜4˜p§.ì¿vóšÎA+:²N|ØåB!Y0·©–^ž=€ñt‰d:oÑY£˜6´…j ÊH`"ª™ Yk“bð¥bÏŽw»´^å•ò-RiðPšQ?~{)Þ¢‡£w¶sà_·2Â\³CL–o 9ÛàÄYá¶­@êˆh,i–ÙrM§ R)0é™Ò‘ˆh†vȵ‡ž·]†ÒU1±teìR¨‰Öpã) FÛõVÑ:øóŽß•?3µ£ µrmGâé{‘Úp¯“Vïeo#½_ì¢ÿ':‰YÏëy52…õ©½<¾þ.Îþ>¾pù°qh×~w kÞñR•P—µ¹,#OõlIoصr¦õÉ×û™àD„žÌŒgjÁHïù!;zñãÓ¸gñy*° ¤êYfÇåY©U+ºÛzéêyÎ^¨®3¤ŽÊBÈ.®íÏã¯/Y‰g/WU£N¼åèÀNÓeÁØUcG1„Ô‡¢q@¨ Ò8 m5-+‰Dɤ€–w±Q‚N}€WFV†Ë¢(]•ÅMq •¤„Å B|æŒÐ€3(‰œR)'P¸{¾>áæ\e}énß7ÝJ|ÚTúÞ0&fPYнæãÚùèÓâˆõØKäë âˆcvòäßwõ=Åç<çä›(ÆéhÀEdÈ)IÆí¤‰øÆ¼¡wêóÿ±‰ó©­Àrùˆkq_ûŠ3#®êw8®„™·Ò5¼« €±F2Æi"9{u«S¢ÀuÄ1 XÕ… Ô™Œ3º˜"ga6:ÀÈY‰ÁF°2›·âᾞIMÄN#„€€l€B5Õ)£3cÔQD|íF¡•)<¬b©”²¶¸•µrPZé1­_ëù‰óÛÌ ="Í"“•wm«®°Yù¡¯bÿ:UÀ'^Íg”&èOT6Ö™†ZEFÐ pÆjÝ¥½{gèƒ:‰@@È4èÞòÉ/3'‡Ä˜ ‰u,ZKGùŒ²´`®SýR#°ê/:e—E$¥C30ÙäúÒë¶+»+¾LÎ<ÎßüåïÈx°}Õê3þ6½¹w÷Õßúó?ü­¿¿Œ6ó9•o¹´H%bJ5b­¹VÂ5À¿HÛ™âðß+.ë½À4‚¶çõ+Ý{B—)ÁØõ´ÞîÕôKÐ^îôÎÍ‘G;5T¬–Y‘$b¢´ÖºYtI8S^J^3CJÙ;T]zÞ<^\ÐŽ,Åûx¾ù{u_­|[ç/šà‡®ÿæÌ»FV WS—.˜óQàGÓÑýöߟ=ß+Ng ’ƒöõÑÆ}h·]ZËɃk4\˜Þù(lÔBX8‚Ì¥ìÁ–©¯ÊlÁ¬rLDLœ'jK0ÃŽ“^ÌôŽØ} Ïc¨kTáV$XÁõòŒŒvɲÑZ7-'“ÒdÎ- ±‹×ýDwSf&tÏݱŽ3[1î•kU*¾^‰ßlÎÖ¸à^¨ß¨æ‹AK!K©”V‚Ž2GÄ=Áîð¥ÀxùѼç¹Íl•,óEIŒ¤æ UÔ5i·F\Ù«¸¼a¦;éÞëï¾øŠ‰Ï.€˜ûÝöIz”X8, ÄàN%¿æëýü!ø"GÏb‹ÕZ©ÎÌ”QÜéZsûx£+Y¡š±ï½Õr;öF6¥P œ.´Ô0 PÀ€¦ éøÆðQ”‚°Ájš:ÃÐBÀ'àyÆåÈLähQW-Þf44 ꃛK3ˬ©L­Xœw ÖÞæ|ûn‡¦edÎx.6;D.á<âŸÏæÿs™? öè)~ºþºß•;‘¢Hªs(ÝóztžM#ÕPb¿—⦵ZÑwx|Íÿã7ø}òû:/|ÃxS6è«}÷ë¿Óüº¼èÍ{.êŒ m¸Æ}Òs–:çÙÉö÷Ñûò=è‰Jê=èÅ-ù¶&Õ ‚ŽU¨úV‰-š»MCiæwmËçãû|±÷¯©Ì5vr¯Âh¤óXÏl¦îJ5Õ܇œ»\+ÂJ@EN`%±+¡B¢PÐi75lÛÓÔö[¤Æ¦Q¯“%URó$‰bÃMÚV BØÄŠ(aW&d@Ñ´ÒEsï}£žÃasƒ•ºîswù€^LOկϹO|óéþP[$'ûUh’(“g9!+È“ r94Ñ]óžzYrÆÓúžÒVÎüìç´t|3=~|N´GFWH 5â™U’R"Ê´uQ6[\”º'Ì´M§ô&GzÄ0×?9úWŸRNÆ”š§bjf_K]j­ØVcj¢-¨@µ’æj&Û%(à€›³OZ¯ï™}ÌÖ%ãŽÉILÐ5ïɰ†È ÃA†ô]\੉ÎNÀM@ëpµ‰˜šmY°¸2@+Ò9f艔pB‹#=lâ2Óî?t–šèÉö2(&tNÝ sæÊܰ¶†Ažˆ¾­’W[uý ;Ïþêsxl«é6ÌóþUᎠ;¯±¨K´J†RdþUž¦²»æí—›û ¿[ïP[ª÷sœú£¡—aÜŽUæÖ¯oíÃ'ù ­©‹ç|ÌÞ\Zþ¢† X©<.¨k½ªÓ™±c Í(*†-T‚º„l’ ®˜¥Çr¤5¶i“\ªp´½*Q†æƒíãXÓ†‹"*Hˆu;ެ™U·bã‹b‹,È‚ §Qž,Ú÷–чµiCÞ@ÒDØ °¡P7*¬à{™t7šF£ñ¬òk1~¹›ÀC#ç¶ñÿïÐ!ó»$HÏa½äYÞ:lzµ§¶Ó!$´•36°‰žtåÚì­½›œ¦ £ÑŒȤl` Ý“fK°L€ ”°Ûåi°C0æÎ󯥿1Û¢Á•XÔšÊ 7U _è[ò¢ž Ré%ÄÆÇ ãâa«©AXÊm#¨–\L޶Érj!ï“£ ðnÏGªµ—u25÷¹Íï.žs³ÒwÚPªr—ºHŒ‰Ê˜öJkçzõÆ…|e(ƒÍ…þ¢UÏdø¬UwN¤ÊYz‡çP“\ –ŸÉž)ð!G… P˜Q0!ïdc†¹ O†•N6"ƒ4B LæqSv#7‚›9[Žmì ÈÜ©Ãë‘°B,£™<Ýíß;I ÅÕd‹Îu8޲IÞèãô ª/ùc@Ud·¿+>Øì¬z[Â9ýEj¤,šà€=¢ '¡§ìq¨<î8â}›©i»€ÝÜ%ü° µ¼&€¤Ñb[v#ã~^Xõ…ƒ‡Õ.4ò媿Ͳ"<¯>¢k4<³PñKwÑ„3Ù¾Gãç²Æ•}CñËmKÅö…µ¨^ú09å¬Óó ² ¾…÷rß~¯±c; t &Y³ ¼Å·àÖycDê¶ãí¥‰ýꃭn3&-ÞÚ®é+âuGÀ;Çë^Y§™ÂÎÈÑ·u'¤÷C.;.\Q§ÑNß²[œO îœxÝÓ±à`¸0žì>êÓÂ] ¹ji@~AøM±}Ñ_•ÝJÉtàÄiú,Íe óPÁt HÕ ýÑ¡§öû‡^ ·W.|3r¼©C(mŸÅ•‰sQ÷îä‚sü¯||Ùw µÏÁ€¹„ä‹F¿ §…­Gþ™í?ë¥\?ЀÑC"RYœ× ·‡àyò!üÉ(jYÃúœO0M,6‹.ºhg¡iXËTó†a$ûÕ;Ï1‰ŽmÜZ°–C±Î÷I÷Üj,2ÆêSÜfQ>›|ò¾•½ã¶¿zƒ*rQ’î%íp?,”mxi¾Ï c?ÉHA*MFL|9‰=X®b[±hìåñs‹¾FvåšÓ¦Gvg醟/ý ¥ãÓ}ÎB«ÿÝ€Ÿ™ûÜä—˜ïs3­aÝ@üñž!úMäm\äµAXKñ{G…ÜYü\%ɺóI˾ìH÷b¶F÷P RøWÂëùyçêyò[½Q+ê-æõ¥¼žœ–-7Ŷ Z+gGWlb«³jv£òªoÚÆvßúí»ùº›ÿ÷Pîê7‹sýª‹â ´uè?ðÊÄôK_b¹,Þ$Q \ÐÚ©ýh÷’a"2 HHÇ4 `ï¯çâ& Œ€uˆn†fÐiWß]sû5oc¾?ȼþ2|{>ž«Tù&{¨Óéõ®hzMYç_7|µ´¾böû½B®Ö‡Éfl¼Q†M•Ð#ö…‚ÆgÓ"ŠM`ûíE&ÙŒí;gæä,4eWC0]ekL™lÔ<Ón¡JBÊ×çŠÒn׆ŒÈêbAÄäÉMKN)Ñ´"GC0Í'*Ä>fÌ|l Cs ´‘„ÁE@ôP„r0Ç8Q8ČЂGö «aê¢JN$‹cô~L²”fÆçúÂÎ’§XsŒ4‰æD}]‡qÔ?¢ %_€°QNC7ÒÒˆ /!EÑ&,ñ²i¥òNÁJÑk)†ØýV4bŠ wêƒÍúzP&:rÉJaX2”ÂJÊH¥B¡ð‹Éõ8"ô´‹ûfgYØç¢/5’+Õ©ÎY„JH7à ù|õ´^´µÅÅÈlÊÁ²ïUÕªyPÁ*×ó±éY-à—ƒª‡sò>˜(ËÐŽeÌúreƒ#½qtâö|æ»»èÇq雚‰. CÍų?Q4H¬/¶0K&Á™¸ƒ‡Rœ ‰Ìs‡DMŽ^Ö¤ÂL£À|+N¤4 K3…YõÐ×"‡ CÜ"®É™åœ®b+Ò¾Œ/’æ žÌ´jÁ~ú²VFºÇË÷Åú`¥š{ß^=g¼¸ýÉ»²3'’JÜöùÐÙ •l-5{ÆÆCò .«ªoz¹W31û‰™™»&•€P–~Ü–OoGÛÉ­ô ó$ïõ0¼æ ÓÞT.’¼§Ûçé<—-6":fÏX¾V®ø³¦9¯f½²Bj+gÃcÕ"¯‘×.œ F G‹Ë#¹¸•1cAC º&›$MØ"5!gϼԟ•oÐJ’+l¦V3)2á;zQ‘Ê$5FŠÁ%½š·Áš[ÊÖ\‘Km—-q$Vb­ÚÓµ»:j2‰r(¨¨¢Õdb% !»M|É×òuœ÷ƒíP3KÃÌ=B+°BˆN²èýB¥ZD‡­ã%ÔµpߎÏIººXͨ*©ÞÊýüÅý~‹Ÿ©y”-0„5bÝ›–D‚ÒRPäa98Ÿ­óo¦û!Qlh$î©îYé;z ¥Æ#EÓuÁ( »²åž£hŠ€N° „†--Çhea„•âÔˆ D­HÁÈT™±EJYÍ”Sž»öú\›S‰#da«c ¶±¢Žî(ÙüȽg:ͳ¶rÖ¸8Á˜ ÄB`‹R `à`L ¡ÎT€DäÍÒL[X¤5N–áõƒ>+p®‡x'c¼Ý·_ð|ž×ŸºWÅqÏû|žó‰ù,“Ó‘MBòhçÆÚ˜g>S¿§œúÁ(&[Ë”«H¹*Œ³Yõré«açÃŒá˜àµW Œ4®&üíg¸Ó*(5¶-{8Ž-¡çíap1T¤ìKrMÆUhÀAÙ[0WD ‘Ÿ¿ØŸozU»ûñˆÿíç¯á¼W†åËêë1’„tðÑþÇÿú5î…*Ë·æÃx¤ RA,CëÙ³YMø7_wþÎ[‹a"¬Oe×OŽ`PºÏõˆ•M€N&‚#DÌäÒþ¸~ÂNŸÖgCx[žàF& ‘£tñ ^eÑWor«+ÐhLv†&M*PgY˜QCœ…åT*/Kç…Ÿ¹ÿ¸Öïùñ†t*>TF5²ªYkНÞl½Øâ+ÔSkUätbÙïªQg´«àkRöy~Ñ #$ò*æX̓]ßõQ­«§Eך¤h‘éÀ>œu.99% ^Ïqp•Âs›ÝK¼:=¢0¶Eäð“Z†Ú».ß_¡N¥R+j^”“zñ–Æ×É‹Ò_ò}û¶Nzׯױ|üJs#„á@¼”j”賤‚±CHš\:³Š|"–dò—Ê×´pB}Mh¡µÖ >^÷ìá¤%—•×Ýfw~š]âwûM›[¼0tCkÏuÌÄRÏBfÏxyƒûø¶õã<:iƒN´/Æ!‚­ÚB·Ë€ê=Ðq tEU›"áÝ/~ö}IT†Q’×Ì'à]2I/H»±¹µÖf[ìµÛ4¬€±ˆAYˆMûÂŒ=±2Ð…ï³æŽÄ±®î߃˜ÊŠ~f“ùzîêT9^q -™F¹ˆõæ“þ¿÷·€†½ÿ¡ôùÿ™û}~þÙŽÙWŸøëËü¹˜3šQOe ?ñoÞßS€3FR—h8œÏSJ.« |ˆnmw¯zÊYïyâ}ó9óOËLòŽCwègÎ<æÇùϲúãæOxù l¨¶½€ïÅ÷zo¶ãßëΜ>ÓTÊ'ãÌ6Îüv§žœHU´âºŸ^w #ÖJ‘úª3sݤ$)Ë`ˆ¥ _9v‘¨pK“å¯À–`¶ñ$¿ÖŸóp§ÜnÂ*k•:¦ø²±€\ó€B4ú@J ·7ˆU†[…³c«Ð霙3¢äZ¢@æ«Ì£æíÚÃpQ?ÆëG~ptÖ)/ƒ bî;.nýBÍqè²Q²¦9Û/Zêìþn€ OÆÚð¶ñëÁyÄ×!>qéJ$Ð)´·¿5žõ‹ShQþ2âì *®dR“ˆN÷\bˆ©ÛX¤S8ê‰ÕSS°…¢ÆV¨!¤jÆ„l’cæU¡»Sg‘ò‚‚ãÉ—àîôÚ¡Zs™a.W³MMYä8†q)Q\A¢‹›‚à«Ý:鍸¶‹h«’SYªNlÜLL< Œ×Û_®Ý‹ÏHòÜÎÈŽ»ÿ$Ý6/ QŽl9K‹ü˜Ÿ,ïˆúøøzù“Ç_)†ÓrªqV Û¸-ù,ËæVb(|\ö^Dšp…òÜ($œ!¡bN™#é@…—ËE SææNª+’€º*·úyÎ9þð<¾},ã«]ÆÄÿÅýQìdðLcü Õœ2õ=H±h<ò™µ-I‘Ö61N$Xq‰±žWÓ¤:ΗIð(ÕÔ¤£Ëí“_ÎSÏeÌÄ­p°€í@Eµ\ÉÃnìÇj™jÃËa%ÜxVVK—gÎZ-$S³ØZª)<–çޯدmoûÜ ¹<=®`¦âM‡ÀøC)Q ;‰Ð —:Ï6NXj`š]æwÙ•öf±ÍYÁiUws D2-¦kùÛîFn<Òå˜ÃצãÕ;‡UB1íàSTI„X]ž¤3ü5Ýg¡ šGS°LÆtSc>Í0[ kd&§Ç}—Ç·§ä´Ÿ†A–[6Xja_Å1£@½¥£0 @Â-”EyóíáÓûkðáÿœˆ~¦]ÒV¯o¶ìsÈâÖ8@-û¨Ýn?WgÉ¥sÈs:‰™£ÃW˜{«óB˜½[þ$5c²naƒ,­#Ç,ó´ r‹¨ÝìGgÕÓ+T‹cñ¬³ôÉèÿ²b&}3sÒÖý¢¤í2Ç¡íÅü¼ó ¾1°;¥ïùïÿÀ‚7¶ärmãt%iI©tfÛw¸¹µõZx+Ä1ç '¨ÊLúªÁ`¡Ñ©{ÞT>Œ@}y¼ºå±Ôõ\FKáÏ ç{…£Œ­Äã2¿j®¤Ý¨iyÛô'.Ãʳ¬!ˆ£ü²C›rú÷AïN|x— øž±˜t_óýÅþ­Îûƒ;¾¶¢:`!^>lmîžÚbgÊÚÇû1z‚ç±û8°ûO8N¿=˜0ßþdéB&6÷ÐD€€¯b— ‰6»¤çZ^ÏÐÕu4÷IƦM‡7ÀÖiæä«MªÞ9ª;9p“]SòÒ@E/Ú¹ÑÚ‹UÙm/63ztwËÇ34|¸Ê\ëžo´'S=œ¢ gËØÐ=Zƒ{Ú;_WÀ•–UW»„* +T6Am~}¸G™“òd[ÞF0'é’5Ô‡nvɉ]ÌcëCÈÛR ¼ÒHñÝÅÈë ·‚"6b¦Œ½ m/Ä(¦{ÀæÇC.{ÿãCh9ûb?.[ðÞ`«wõÙ÷B÷æ¦H*ø÷—QqµêŽÍnæ¹gÃ5Û®¨uëz}ÎÚpˆ5Ñ›jaïz®†Ó`¶oƒÿßlý Ñ,gåŽâ¾|£0€3ÀtfŽäuòÜ‘ý—@ÓŸÌF:Câ„1ÊÊ½Ý·ÞØm*„R‚3& ‚ }14B$†”XõÛÚÂÚLã“t=??}p4£íoN¬L%z̈hîk©/á_ÏÄn‡‹ Æ ŒÖ͇UZG)‘>;ÃÕª0H—äT oJ´¿úZ3[®Æ’-n@¤9zãÕ¢«³Ç¡° “§¦;§!¿ìî+âJz¾ G NJ3žïEv\”Y>1 éæ@‡a9pª¤à>üÆ<Æ7yJ‘‹hšÀ@s`{§SæL¨†ÍÊf‘ 0Ë5Š@•°5ÁÌÏz¾3ï/Ä¿jÈkfåWû h‡Û˜í2÷O–9R‘,“—ª¢ž$³Ì¨ð{ .–ÛÁ ;°lh4Ñ€ˆ@L¤L "ÆEWY»Ï ŽÙ!IÄ Ð’–B%…28·ÐI˜˜jJË\Ê•ÂĉèÈ8¤#Œä" ì ÍëÄòÞ3Å•VJýj®Ubw0–©gõ¤$ "•Ü¢.öM½jþÚø¶ÛëÞµø‹Þ¶] ‰3=ΞR¶Q…%³ýøJ<}UŸï}Ažýpد™í÷ýüñZ¯VÓ‰¥D*€ËÚø4«©Œú8ŠÈG¾YÃCZ¥¤97¤ LcÀïã39Ÿõ“{ÀŠ–ç oÏ'=y81(a­²I<-æÒZ$­“¢Õ³Há\éÖ"±á:?`òŸUÖÏ̹EVå£ó 98ojŸ#{$¯Ú]ƒÍÉï6ihd ›åý¦t¯S­Êxc×§#›eEçº{z½¹] ø˜|ír±<Ì©‹uú£¬ÒX¸X °B/Õîc²øÕ|œ³4QUúÀ–4 cÏÙKô^_‚‰‰Š4B*z®¨Ì‚Œ+BKíÂÔûš‰SJ¬2F4bp2x­*½ SAI  Ql`Hg‰ h‰—@Œ¬`§™Z&wµèí Z{—Îõº«æ×5Å ´bh Ëò&vT|2q¼ˆu<Ô,°}»÷~{çIÊqrbê.ª[íÒ £¡‚&‚°DJL¤#:š­/ûB¨œ#Õi+(ò :1¬•hKø„}6âÔ­ Ô™‚Ó¸eÆé‚FXС…ZnåÅÿ û©šbé„\Á2@YÊj ‚˜Ô4ÎO¦fŒ¯;t5Ké ‰ᆌÛ{ŸGðù¥ŠgéTèähŽ0F ÀÖ™Ö…"f…ƒ2’˜Ñ(Ô35UQ€©[]à>›5÷¦©ãy6oŸü¾í]nÅË럥µù#°ìçÑ õÕ½éî‹ÍϽl=WŽh2ñ²ÈhÖ@*ѦP p\[¶ÛaàÄ“´R0âY‚ì”'Ží ZâH2":òS b®äþàd:b?Hã…²"$ó œ„=yU蛾 \ôƒ(ÿûü¯t¾î^µL-Ò—öEþÕ§¡ý:E]©„í;ÃB‰Š Â[ÑŠ:µ‰r·©¤"´¿¡Žü­™™‹5ͯëöùÌ©œãk¸`òÂdŽÌ[£zµNø¶ìˆ{d'¥˜³î­@±Q¸Ñµ”,ð¨@IT[ k½(#}TS pî±¾ßÞçxAø”± +¦”kåÜ.¤ç ×TܯðTË[Z¸edØ=¿´¾^_oÿBó¥\E7r|Øü4Œío[EI]?¶ÇE ‹Q­¤á¤(ÙƒSæNMÌPuGŽ 9Æ+挔@5õ{¯×XXkË`F7qØdØÔªíLÌ9ç1˜+¿â%´¦T†0 "ƒ´Ñ’è%Û±xRsAÙ­v¤¹"HØ’Œ™¶B×'W`05”W2s7x\×<è¶õvkîgʸ"T7[zÏé¶UIgªA¼:›(å@7̰Ar@&6Á6œ¬3ßæÄIÂ'Orž©—Âcþv#–ÀÒÒhHÓ]3Ifk “pˆÑÁ'mÎ)7p T× ˜Ó !cûÌ`-_€¬™¸‰L¤×’6ѺÉYå¥C˜ƒ!—¨òh§ž-̬Ãyf£ç6 z^T×Û iöld!³Ì+§½4¡ jóóZG—¦lÖuÚíû=¼óWú}Íwz°óW9†Ï–RË¡ÇOgײ²Xv_NäÞ^«6•#”§aö2ú d£ª2ó{éJ±Ž›ÉE÷»ÏNŸKŽoéåÌ"miŠs¼ÌoW?²ýì-™uæ}Ï´A¯¸á¢ 1á91¿r×¾Õ¹é³ì8F8fEâJI­{ܼ5´NÔH L³ÊÒsÕÉål§àÿ×ûrç?çiP+¶á]ôñ:jµ"[fÒj‚{f¼u@ñI¹Öfƒx âªQgÃÞ3¢ÖEË0x HPÂ*`‰r*4A©­x#U6€±PAÀ‚•k z‚het–œo]“Ë \_ëU®´§SÚÆIr=Úûp´›»cvRž™ ´ µP“¸Ì)Æ"Ê Ê÷’Ô¨Cõ2ƒjF½Q¥ÊecÕM|–ÙRyÄ*‚´x„©ð©ÐP-¤7‚ÌtÔ=œåNóÚVÒö$­T@À y§^¥áî&Û\6Þ¤z€Iu—vR§Z%¥‚T)•tСðõ]¯‰&Q–0¢Oëni›ªŒö¶l-¢ñçNmÝcAFæŠk§m -±Š%RH‹ºÓ~EElÃ|šY믪ÓÃ>Ëe{ˆôñUXt"”JÔ€6ÚèGãÍïÑÊû:··óÀc7óqÌ@çh9ѱž*¤h§ò?šªÂ‘t×öKú)Oo * |¤ÛElv²ÁÉ”þ±À¬žyTŸh»5ï¥ßØ~èW°Çy\}>}Ž-q¢r Æ>°Õp¯ù±ÜÎ͘çêu]Õ[ü`›™­X¨#D`hûRQF! !#µ¤r”(AOQLlà e.’.>±a[º²òH·Ðh<¹²X„5€#K˜,ì $t¢T0£‰AÍäâvÄøÓF §yÔdñ<¥“ÚÖã»Û&Y DÀÀu¦éC9h me¡ª^¶¯ÏŠ'þ\ŒmëÿsXtnt;×Qúü[¾7΢þ•áã°{tòÇ€–ßÎ^í¸¤Ô°—Øñ„Ó5³Ïú×Í;Ž(ÂfæÝEÅò""Ć*Ç­è*e&O×xiŸvœÎšà{~.6‚×´ÍLYà4& ƒpÂ î ˆ³=¸§:W!žÎü)zõ>jÔ„ôYp¬Çfâ€WÌj²ÒCs¼4ã‘âë’#UƒtÛ×VY;£]øÔ ñס¸Ç8Ç42iQi¨%;/#Ìu~Ò·‰€~A0zº-§jûóœÅ ŠD?ƒ‡³Õõ}Ÿ@guî¯ (-·˜CaÇ4JLG¦Ò’ä ‰XPtl!`Nê’Aüi“T•Ì;›fãLªVàNEš²OyS–A1 ~ÚþÕ¬k@Q#Ñò8˜)z––´¹ûùÚøçxï„x¹(Ó’)éÖºáÙrîÝ—µZÌcГÉk ê!'Ît¼<ŸÕó(k$ÍšûrƒÈG™X§e`½[·Z&F:ì¡¿ýû#ðºôªð‹®½À·ânª¬ã#kcà¯em -~͉“$Gò–b>¿…sÆm+ô~QäQÞ úðYuº[~È.Φ0ds¤a6dÂ[’)Û8p`|ôa(ÑY9fù*+ ÕÚ-d¤"6ÝÊ!¢TÅp‡[@ëP› P(Ç‚Ëè5ú#öŸ^½þ¤¹…¾T2esðXíj÷H",,â‘UI ²„ÀÝ<üDÔÍ.焞°¸Š”ÀìÁZ®‹2°‚LÀòËúóÛó;œƒ+I†ªl ùGYsR²œ­é’MytÎÖQ¹0½˜Š½nØh ©ŽFÊ* ™-^(Ò>X;n¯f¸é<·)èBM³êW)l2×.¬­Ù¨!Õt¼½šú¢v]Ò 0s!Y~™8÷r™óÞQŸqŽAtû}mÞÏùÅküuúúäµD]óú¾Õ2¤ ˆ †Yènö‰Övp1tEbÍ0ÒJ¡p„ -V@g€(‚y±ÜèÀLTØ2må¼úç›ßצsm¡« ´ifnÎñö>RÏšëô2¢ÛâZÕÞVgçg‹e[ÄóÁÊjì¾êÚK †/ŽÖqiü¾Ã>6¯ã©ø<©Sf;…A].XÁ™q§ CÈdiXÍå©©Tu&‚cbE4B™ÁŠy±Œ)"ŸCIb×”¯nWÕç£9~žq~ë^ã{RËK Й=›Lõ¶QCýzºöáRj†7&4#I=ãÓlšfrÆœ°ŽÎ(ÅËš®&ëþp˜¿ۻ»òÙÄMOÊÙÙÐ*a}Êwu ï–+šà!lz×wï„“§\hêòÂÝIÚ _i FîóØ!|úÆ6v&­̇6ݦöeÉRòi¼TtÐz@NmvKL™¤ ¤ó+òåcêH]ÏËL€Ó´Œ_[ÔPtsNøö}¯üqžÓ¢ËåL;gÕæþ8÷Ez=ÎöçÆ•y“I5¹î~¡? Ÿ^? õt4ñœï:ŠM0wV¼iƒp}[ôgœïfŸ«¯yo–n^ýù8€ÎkY, Âu?·F¹Ó¾Q…ÛºÏý¯Åùôñbwp«?ÀÌz¼Ì?®-ÔA¤xï«óÆnЭ'¦ž¢@¼¿ïG€¿÷ fë.™eÇ`†ØË -uõàe_´¬ó\žkì»ßÌs  ¾^áõ×|¼ÅüÆ‚è µBJ”"F3D\ªª )›ÉT¶e‰þÍÑ_öÑÄ¡6SŒ»Ì)TˆV*óÞ÷Zm]uŠ(jW@5á@D\)5b…u'n ­°GåÚR‚BF¶aO¹G÷Òr'›8™A¬*¥‰:ز‚À-Ø*ÔDÓD'·õ“¬bƆF +i:Ôö©djá€xFƒgCD+7ÐX…€¬ "ÓÒeƒEtê‚Sb¸ÍL$ 1+§÷jÃÎ"´Tïlº·—Ëx^u£˜šÖ'P TÍW<áŒ@ƒ5Q¬=!¡F„üè¨Y€àŒÑ"©Ë†<'W‚%-Å­ø™i¤bE–Ê{¦Ãu/>ÄUÙXÞw®ÍøÙ~º’žmà-lÄùñ3ôt³×îË–¹ËÚ¡X06T’"ˆ B~%^¬OûyÀ¿í«¸ üS‹ý°$“\2iõ$zC B ÓFåK¡1»ãÖíÛwz=®,Üœ;C¾û¬Ñ…Ø­´ûm3+¥ô©¹eëti‚7ŽO|lÓ¡ì*k½z–û}4><ÝÏnt1!è¥ñÇ®ÿ9Çÿ¢‘Ü@=ò<„q’<öã¾KÑç›ñèÖ‡¥?W.wÄ´¹œˆ7ªsæÔè6w~Y‚j2›YZ‰Ôd­gÝ4©´&ë |͈k`5[Q5eW$dí–¢¯I´L.ÖÅn#—;wŸð/%™› ‰‘Áef¢™fµ1÷6‰œ šÉ™&&U­G7Ížåéì‹Ó¥2òF‘…BéæŒZçÆáÉ`žižõ ÈøæÔ’÷£)’—ðÊ÷giùÒý=˜W½>·`™±¢ÆÒgÐΨᛥ7zÂ)¡”XNK¾îr ,Jå‘~j7÷\®Ìqà Ðy+ûUûæ³Êõ@ë|ô¾ò¾ôÆÅ:S\0Ò7F‡á±œ6\ÖQ‡ÃH5ãŠmÀœfšV!Ú®UœçÑx"dÌõûþdÈ8[NÜN°j«"æX[à7‚õk„ÿÙÅæf~¶`B¨…¤ToÙÃSkÄyh˜8$~ßâ¦@#³f³Q©íë…éþõÃÔícŸ#þ‚Ð6}s=>õHbË^.V=Sõõ;e^lS?yCŠÎ0îî sQ ZLr#À{zÚ±ø€7¹\'T%P— Š®g§}Ê{½ÅÃ¥òèºÀ²–~ê-ô«ÎYM›]çG°ÿEä£/¶F›±¸ˆ¡)ó¯‘C¼òæÍ¯ú* ó"cµ?•Ù ÎE•_a1~’ÇEwºg²È˜»ŽJÛC¥‡¡y-~uÎKŠ{¡}çú ËÎ'‡^ˆé4ÐÕN_×:Ñô»AÚ1…±6 ޝðñóÍwc\ËÉ(‡Gl†IÊ L¥£$A‰‰ñ²8ˆ1b5|‹…‘ÄÑcF‘ˆœ wô‚-–;Úñ›½bç´ƒ p‘+Ò¶¸ë}}Þ‰;åÑÕk7¯ê&úZ "‹Zº—L ?ÕHƆØíg»Kc­zÆf” Ë†‰g-ªº-×9>ã*@Òhá›É)5RÌL3 œQƨ²á\ÿëÃ<à£=ÅéJÂÇŽv¶N"j²³iv½%7ˆ"6HÃtXÑ2QèBǰi“ùýà”/6!|+ð6µ@€!klƒKóÒùëÉ¢i©Ð~› Ù) !4• † ›(øZpË ‡·©;OÞ3¤¯÷–¢†Âü¶­|¬sÛDîÓ_¼‡Q©ž:´—]EÄÔâåÑ3¯À¾è8ÑAËe›³CÙ«“*bíÈL H²4¶&["+Åa*P´L¦5³—² âÞ>ô–´¢¥sB®-§Ð<¤šˆBžôȦ¡¸W¡’8”½¬Ë”ñ¡öåõy­¾Î..*{ëLÔó:(‚™¨È^æÑÔ–°òƒ5×ÂIG“”G޵dzÏ` ™JMk,4ü2_mÜým¶oAœh:°¨CÅP#³‰IBÈQ k^þ¤ÛwÕ(% eXu²l¿W÷¦ü¨¤å°¥S»i<Ê:Abn˜=€!X‘–Rá«V¨°µÔÙèkšiß 7â‚-eUYSØ(‘tº PBÎHXbOl¢9ÆSèѹ‹²væ+s/–k«îêü³U®îÄùšÒ¥e I À «ÄˆœHz—‚"!()Q ’&Ú„Jøˆ…ͽ¥‡¢|»Þ+/=p†æ!ækoѵ^_=©‡I'Ò{£Mws¥R¯Ï›«×+:U£}I.cEìl_´´ùën%'_®Í"HsLVŠ‹Ýëß5B³·ÖuÌ N•:2=25Ý”ÜʪÚ‘*cYÛ RÁdvŒÌuvïUÒ,©è€Q©ûA ßÐraUÒi0×øŸq_³sÉøàѵ«‡2B#PÒP,Ï– ¨4µŒÄö#ugsÒz]æ Ô.P»‹²«¯?³DÓi+£N ‘P@ÊJU©‘áç•¾ÞæƒÔ+Pùòø¹Už„‘“€ŠF"#HbÆ(ÂDkX+i•†|‡h) H ÉjS³ü†2ŽP…íf¶ð*"cLƒr˜ºgZrÔÓ—ðs6ó"Køã‘Á\’W¨™FÆ+¿üRx‹¶ÏsÎ>?;³ºÁ9Y¯Š•-C"qC\NAª÷N¼¹BªÂ)3Ãò†°$TŒ×fš¤Š†_779k ’Ù÷Ѷ†èvÞ2Ÿ—»kZ*‰“c;£´ÒÀK9ÀÁÆU‹ €B7©†¢+E0ÀbÙ#"† ‚" |êCí›·±ùXZIÂl¨¥‘×Xc,¬š ±‡;*\{‡Lcãó§¼]»Ç]]»MàHáú³«Á%§”zûKoí\åç#.y­ç/ÛüQ2WE‘ÆeÆH0 c±:¼¸ pÖb]2Ћzì±›#K(R³nr@Ú¢Äté'Uhèr¬\%)€‹¾-€¥p©UW,SD-n¦®C.1Pãù‰•CIû*Ÿ„Níhë}«˜_LO*È)2=‚oB–}›zÝÆjq½jô=±»(—· 3xf0ºÓ°;HÄq»Ó"ËØµ3÷aQSw"Vó‚ Õ:ÎähÑEˆ ÃÉ.X”K¬A!/Ê L§¦fh”°_ñˆNÕ,Ç¥~5NØN ×y%`QÎÜ_õÖóƒäçZòe×7ï5»ëžvS3ci…^€5T`„ PˆX+ùŸsþi’¾…‹d‡›ýOºö0nH% ©HP0[<ÔbSk¶Æ²QnB&»qA¦c34eX…2šÎ0Õæeµ?`¡­ªO{E«i©ÒwY'ªº×bß°¬ èŒî˜—=Û³Oç©ó¢í<ìy’úùP6æŸMK R  t„žö¨óZƃR7E4´æíw=_©¹òÆÇ'£ÇÚx–éQ-JÐU\Ï£¨ >¹(´qê‚ïžÕŠ›ñÌ¿ÿ>ãv²‹dýú‹½|~þžû`¨«CýÀ>öòÛI33r—+òÞíö; N÷Þ{øÍç×bÖ»À wmùê¶WìMˆ‹néÕöòÅ÷4fã³<±6„Ðv^¯=oñïñúç¢{γ狼2”B;6týŠúïóG÷;æä³®¦—m¹ Ó~P%žy4kØj‚Q1H* ÊÀl°âbŽöëßî=~¾ü^CçæÆ‰:õç³WÝJ«Óž“Zß `ThEnc•hçÃK;¤xTö¹6$^¤Y°«¯  "4B"BÙÇY*0݃ìÁˆ U^$"˜hE@[•iƒú ûY³•Œã¥jPcL&d˜LRX¥ýh¬IV®U© óÏÑGÒº)ªbG®e[„i©H2*5|@4árÜŒ  %dE›»¹ ¯ý­S oô³ðYf:Å,Ú–Êä ÆxbŠd6 YNÛpPš¹i%V%<>¼[ÏŠùŒL\–V ~­îË5Æe&`9V¡FÈL!†ææiáC»–k7«´¥?o®Ný忹Îô¬˜Î^ЫÊà’ÃãÌŸZÃöûä*s—«÷K§"ÊHlPÞÚ|@ù«‘_hÉ)ÎÊÏe%ɪj¹PLzÇÀ$ì`:À,%èwîÈõàg)® ´¹:­%hì¾ä»`Ï8EìkŒÑœÊ4;0†ñ §œYʹX”ËÖ?Ê#®ÐïoÚã:=žLoï÷+ós-zµÿä‹+¨Ñƒ‘#ZÊ3ø¸¸Nܾ/wø™ïÏ8¾ü†f ­È8ŸõüKÖßßù/U~Ø(˜E-Yƒu:T ld˜7sc•´¨ã©KÁ‚6)…ÚprަË×3PBЊÆ<]ÙΨÎÊ] ¿»(^™«m¯0ÜB˜M H´í¡ÑÏcô¬ ¶Uë(ÜVHˆe¶öôÉÕ«¨cÈÅÅw9©4@Ù–¥ÀÐè¢%Ú!• "åÁhç!"¹Y¯â3ùÚûsÑ€XQðÖ‘vý…Öñ´då†Ôã “Ï©ùKëö;ÜŠ×k§H´Ë# ñ¢Õð) B{MXiH¼ûÞ §¼.§- ‹aé©ßŸò^B~äƒã£|òˆ·×$/ Ÿ!Jä a¬ñq‰Îþ*F é Z{dQ6ì(I…]+Þ8­Ö¶hØÜcAÛMŒ‹ÑмÀíÞ>imÉ•q“ôŸ¡jjSÀ2N‹Â&` k­¢ÙÑ ç";qȔъv‡ýVê[‚ ? xmÂ7âÆ ;ÏæÖ½¡I.¹ŠÁ·kÞÁµšçØå5·2íP®/ÄûÛÛNŽ<€¬–MÊ&!ípÂéL˜˜ ”E®jÓÛa›:yîT%›‘¢9F¯-qT'  ûhjaŽÇÛ¨©âèavf¢! j^o®2BßѨ`7Ú—â¹m`¯ÜÓ¶~ñܶníßì`æko:öîéx±¹á&:ÈEÄKÕSǰ”Mqû}tOáZBIVÇéZß·rô…¨Î\àÒ,ŒÍM…½‘,Ù@i¼šäBeH·Ulé%5{¤Õ5W´­.•¶ëï’û%ky¯p³Dx9>¿©–ÃÃùJp×+JÇ(GÖí·ó'îÝnRTHìðUâáCú»?ÎܵŸ9Ú<–œtÜ­ç¶ÐÐÇ*kƒA ¡a¥¨„ž¶Áž¹ê{yîÌÊ€”ˆ=¸ËEv(û´$ø´ei–j;:”/ñRóµG(6®wkQDB¨ÿ¤‡/óÞ°½ªÞ­cܪª·^µŽáy¢X×¼}—Îh—ï­³ÊcŸ[2½†Ÿbˆl 0¬øó]ÿs(9júßyãŒSiËùšÆ× ^(˜Ûa]¼w|ôln•»˜I*ÎuÁjwÔBÊ)Ì·Ù‘ç“á O€ସ솫 bJ,‰Í`T2Ä’¼“o‡ \"4W‘h4Ô=ºB§ÊU z5R"ᄬ`lh¤!T°µ´Ñ< ºAé ãqž–8Õ„sí6¡r‹ûM åÕVjË ™ ¨ÐaÜd4H˜|ÄG¥L›¥SBÛîvV_ÜWwWø–“ÑrÔS ¸dðŒ2æ¦@‰‰’@±%ŽIÈÑ4†ÂÌâDà˜Æ—r{ß>~ªÞ î¾ÌßîÝߨv´žÈ™¶#{Ëœ"õE9t€æ5YÊÌ f¥¹ACT#o°‡"„lÍ๗uq#ÿ)­µŒD.޳I·yÜw8 öê®xÕ®½àL{£³ªÉÏ5J޳…5²É6µ7±ƒÀ1Àé†.ÉìiœúY€A;(HU@#Åĸ§:ßTªÁÆjõŠÐ HAØ`DAc„µ.GŸÁ‘oö° ûHžåÞëŸíKåU¥eFЬ†­ i­TjK@) áU&Ö°êj–X%uæåHJq¸z‹<½¸DJÉ^ •‰`7£w‚³È% Ó‘²É¢°\¤å©ý8Ø«ÓÒ"i D¹úø3a(GfS>À›VÀNá!’PÀ`ZiŒý`,©òÄŒîÌl‰êP.ÉJºt&¤y¹¼â|P\Ò ÑÛãÖº®L8’*SSUOU,%V%›:î©òpmËuTøÍ:~[óYu•”NsDšæT–a« ± ™J †Éa¨E(1z„@ ,2µÈ›áU2gž­Š§—©c©ªØ&_L¤±ªdjýÇ£öuEª)Ó²N¼ð#»I†Î«ýVó¹õlGJfƒuR eŒ÷ÕüµZ¿€-¸Pˆ¢Î3ˆáÂUé¹çîòìMÁRÚ–¿š;tmöAyyÙRh²Xœ°_WDí¶³Å˜‘çSJàe½œÉIÔ y@Qañ*£–Ÿž¯µo³±ÛûàÆ7™[d{*nZ’r™©¤äÎN¹”.Óp㵂‘}!êyš¯÷}BÕ×Ñ®ûï»X¯£ns-{¿¶xÛÐ¥zpMŠTň‚®â½óó·[ôôû»¸•6m%k»ýììéi›kºE ©Æã;a…$Ž(qjTH J Vb%À¡¶:08@58¤PÚ(HÜmŽŠ(Y2¨5‚ß›f’8,‘ž’!´9ÏëÔ6¾´_Híýûކ.œEœ ±¾zø~“)8¤æÍ™ÂœðERû×™e$#›fÜÑú•‹+ðdNdîÖE¡4´‡6p§¢eŸ Ðꞯ¬o{Ív_¶2>?;e¥/0ˆd$.¬ÐyÅ)Á«Ä“Àp´F9ÁXQñ «Q ”m1€+ p¯ÃöyÄG’áD„„´P~Íõ &hº@ß]p§ÙÁ ƒ™ò-XDÈÛ¦-¬%ÆÕçzŒÎ4íÔ3®8Þ…¹Öòõ§<"ÈïñW»fÔ‹±û¢{VÏ4ó|20û°ÿhúþ tçßþkû¯‰ïõ“`úZ¨óQ*>@Æ¢Ãò8X{ÜDk•BTÛY ýjÙ‚ŠI~p ªÿ–ƒÌ`èÅ›rêU‚€‚MÒ!Õ ’8͆;4«¯ýe„¤Æƒáì KÝ’6¹×ç ßc²¡n2 ð šÀvì´ñßû“®øYé·*¿ÙÐÒ¨†AÈQ¨  ÒrîÀ•3#ð޵T>K„t§j‘^1¯cq& 4Äþ¡Yê]´¥ ¢§.¹ÂÉ-ö¼Líž&ÇU7Æ_Ã-ö ~ÀW“+Xd•($@’1¸6KáŠ[†}ãze¤ÄÊ™|F&M¤µí+öþôëEôQΠg"bfZHžÁ ‹J`!B›‹H^¬ 6|Ž SËÌ\ЦJ4YšZ%öJpÅ}\Óî sк“±›§Ê<ÁCÂÄFu9 Ò†à+AMíí|…HEÍ!†À i©,»‡Ë/;<·hVáÄ0ñ®¢©‡RÒrû>~¡Gï=W8¬7°0´ž‡¯Ó÷ÔÓŠ¹)¼1yiERð×課W/¨[i‡zß DÔc§ì¦“™O²áòñÉš[_Y †äf¢E&UV±€%g>ìÜž|Æ·4à·ƒ0Pcxzfg&ªuH©‡”­IÕ!!Ö@­DÓ2µqsbN–V`‹‘"kö1˜¹L¿Ë훤¿¿!ßÏ4ÜvP#›ŽW Âq…\†*CK±Ç§ìÝ÷u6¹Q–åq‹Øôl©m¡GcwÌiÒK‰Ù×v_1 ­ÒrÞ ž#Þ=7^ªñÚúÞÞ$;=ËÌ,ÝÚ±óÐtÒòi8ðæ~©t6_³ü„û¸i†ãkI)Þ.”Z÷Kñ3|>ú#®[º\ž7‘ŽåÿÉù·ûzuN‹øM¼-žÜ‹”¦.¾›\ÓüU|{$Çýçøüó³óçèJµ.q¯¡7Ä<#ºž©™nû¡„I¨›¼ösC‹,£ï9üíðåù<˹Â< ÇsÇîÍ|Ïòûý"×mìîPÿxìüv¾¦—•ºòÏU¯·ï^Ï-Zú76VMUŒÂˆ¬Ç€¢N”cÓŠ¸âÞ¿&Ýý-KQZ©Äz?œË+>Ä|~Œ–€¥ÛzËm»'¥²Ðjö*ó„Ä„´æ¥5ã+›µEbï¤D—³4"MV2û?XR·GÏ\Û¢'(h#¦ÑhÊ09a)Áér<äy(C ¼`; ˆY ˆ[P¤¢ºwÄêqM)(ÔMSË<“ X §CQ  1ê)X·†Qc›°äøtO·¿*•@[UÜ]ô^V׺½)F¯ÅJnW3¾âE×z…†HUlj¶ôs‰-B^‹3\#Çýš¨M×u{Õ+¿ý~³Ót=•æÂ¶¼£:PÚ‰Y4ÈZŒ+‰-Úºi8}4÷žÂËö®¶êÒW×^âRª´=ÂÌsˆ¥RÄ>ýŒ¼¹¦ïs]ºz¼£h¨¥ ÈSþEñ¦š‰r’0Ô‚A”Û@‚æ=Cg¸¸*·š0îFkŪ»ó+‚W I?~¼k{«à“ÙÔü9¶Ž"¶I^•ˆßX«øø ¾66s€YµªJ!7»‘ÀRe ›mbêðôvÆ@¼ÇÚÏÙù{•ÐÉ%„Óòd‰fvÌOéž­Q‚½äA=fÔ9Ô ?Æa!°ÖK[áj£Ä!0=ÅUgÓÎ"ÞE“âèBÿ¤#£$ e i’Ý`z§ú^µâêíbÑTò×ÔU¥‡€n¤Bp‹ÂÀ¶:›»Þ¦ë±¼øb¢sˆA›Œ Š–° •éÜ@ °h/ Ȭ(kj‰¢¡P[3,Ö&8j¨Ýå†ÜCd+ó…9.P³ÄúXcuo ~¨‰ÕC$e«šSˆhš8ˆF’*ê2ª÷òx;wl;©5åtî…ÌØƒ8¹ó)ƒº %éF±9ð£h"¢g«£ ©£ÞߪúR—ZÁ×;[uéÃÒZth ÄN´AeìÎå=›G?½œ¸üöøSÞ¿ô”vF[»6ö­K¾î^æe!àøTÛ#iN³ `—T‘%Ùds´#‚\2€ÅÃZ¬ñvN(,Ž®ñ W4g#ã³,³;ëÁ–Òµ!Ò§”Ô˜'Ò…¾4ì’wŸg*ÕÕVx›‡yFrãg{,}¬égl½“.†\T,Ù݇göÖÑ4Œã¨‡ÏûHO µn¬Ö>]Óó|¨—›ö_ij9Z¦ó¬„ûjGILùm1»¬´ÂÒ¨+–N4*Yy'¾]í+jÞbÏÔbNÝKLßuœáù/Ków2‹‘8WX0E?ìyÕ«[/MW‡ËÄBÔ6êÓ6¿­Ø}sŽ“’èÃà ) L’ A26Q¸lÈÆ~Hn«œœ3†¥uÉKUÀ4\5;dÕm»…‚˜4(ßúfŸ¼ÿ rþäØhžc÷ýyb½(óJ}ѸB–U2Ê+#Ê$2Œ"Ÿ`†œ¸tÚ 3Gn¢¹ÔK7o; Ý'a% \±ŒhmKnXÂ#¶‚s¡ÑÌâ£"Eó9Ϩ¼åb`ÜÊëdeÕÉ·@U‘(‹ Bb?¬TdR¢AK$%YX¢+²F¼„‹™¼‰.u<Îc>^‘#Ë'ížGÍ ,• ‚ Ûzϰ~J÷.ÂÛM¾‹*¿×ö™éÁ'Íœ&G!¬zÎÖPÿú¸è¡7Þ 6>„ nxÕµ´l ¦1A0©#d†‚PÀÆŒècY RÑ+ŠJÝŽI#á—Çþjû^ÿëÏÞú÷à«ò¿ïaW'#ÃH5y!jußoh' €^ð÷…q¨‘ÆCgí´ž9Ìd,+”8^׈Z¨Žê¦YEcf"ÖÈE\Š¿ëoÿÍÏyí°‡¯{cžï§×Ø&“)ì ¸xØèº)^³‰gµ§Y(€€¯dW´AÕ ¨|ÖÇ[ùýs Æ`Š­‰¤LŒJ”L÷\ŸQã.ºÖÍkuÖf?_ò°‘½F0iÜĉp¼_—S2E(N²ŽóVåµÖµ'ÜÀë7]2âºu³íEMF3ñsÆ…ó¬sÊ+ØEþxcÿ™æ×Øy#îžûôX[k›'²Óz@ÏaæMØÐ‚Æ—N‘ÊÅóü€×icñ+Þ®]”Q1pº¸Š®8†â?1E6Þ¢¿¿¼]ârûB–qͨŸ œÉ|¾ì¨58ƒ‡e[Y07¥!#qC=>]w{·àåà™úóN`t߸÷^ÿòÃüGëùüüÿþÐû¦µ§¤ÊƒI‰­(±0l Ðai,_ânÅ ¤Ù+ß…Žæ¾&Ò6&†u®x’låØ9ô“dñq^B©ÚdÛÏçJŽÀÕæ”õH¼Î`V&P¢œBUŒ :Y+E$3¨ze£s„Èm*!Æë†£â+ëÕ¬BÈz.Ý] ¤˜8–#¼ ¬0MåR&*¾’]¶‹XUÞ`XTjÊÉìՙΠ¼3÷‡·WwÀy¹;Œ­Ë®ÍwÜ^ þ—îyþ/}uàwȃ°wÂKÁE-ÅBµam#Æ¢D%…d¢·U¬u^†wTÞ]óã Ÿ#™Cé¤ Øíü ÎÙ»ãª]Ý‹}|}ò×ðÿÏþGß?Vo_ÎËX8YŽÚ6g59³ŽÅݯ8îÎc0SÒÄ»±¶²šQä!÷s™|®ÎÍ5/9}$mÈÿZ9“fÖ Tƒ XP¦ h˜Cš[ÀÜØ;4·ü3q°€C‰@ Ø’’T´ˆ¼Ó¯Tœ¥A+ · ½I§­+¦Õ®t…jÕÊÖφ=Èô:^Ÿõç?s~ïÌÕÜüØRìQŠú4{N߈†r­ˆsò¾“ޝáJ©6›uÆkÿ~ n=êGÜ7»c'÷™éC\³Õ™å~òšð}“ ŒÕR¦.ãü°<¸Ë·›“àë›tÉÝÚ2Að} ó¡h“÷Mî øQÏó‰?P߇íÔ1²Ê€=æN§eãûCûëÓÏw÷Â/À÷Ý̹D^®ú^>çË|Ÿë–ÒçkÛ¿e*¡lÉ_»N3x0³ð?:ÿZçÿuô¹|ï¥L=÷ù±½?ÎÖ›º >Žº¥ë*³í¯‘»ó‡eßq y úÕ“C<ž¯òðiNÛ÷lW¹õéG_¼ý¸3šrŸóçÊV3—eö.œUã*x3Shè[‹b›0¶@W\Í(Ò#=5ÖÞ1/YU(A"mhëªjßž¼ 73#×­û on•ËkĦ«•×PÖ¸˜šÖT‡¹ÁZ×yÄ›¶hÇ3éykû$7h Q™8öóµÝoáy?)ÏçKÇ=uô$ËÝAB»e‚E(=¬óaV9 =R B4tgÀÆt€Ø™,¸°v”÷ÍÖ62®BKÆ‘+Ö`KÁ­rI­# rKÖßÛ³@‚Ê~vF£Jàkºž^u¥VB‡ pÖª‹(Rj»µ¶¸ø+š÷¢sµµ= m,° ç²½x—;Ý^´÷É>\u¾c5Ü« ™¡ÏŪ”³è2óÌÈ@§R›j*pMÓ¤“.¸%6ã~çåk¢lmœ--^µ¬—'”À@廲.˘h.i `ãRˆžSm}ŒmúTh™èøn/ð¤ÛêF®á<$äþLøfé›ÝS»p}#,×Ìeí-Ö^e¡(ÇD@g¸ŸË†sSô½—s ¹7=†G`_&Ëá‚<‰Úü(ÕPÜ-Íç÷­ûÕgõüáÇùÃçõ!s@JN~¸sÞBÕ@˃µ&Zú®¢të^Â[ãNçÅ<ó5èüÒ‡ŸçÛüµËÿ542À¥mÜv¥g<]ç]ƨÇÍËßx¦†œÛb0mùYi?áí{UB=¤yØ= ‰¨'y—±&œéœ^áØy½Ük‹1ÒBDÅpª6$¶/CKF ÝIë„sJ~š©NmÿÔÑ×mAá§ð€=ZY?6ú™þ r¯£ïÂs'žêF§ob~p9Ðazotœ0÷êã -ü„ïÙü>×?s:`?CÊOÔ¿½1Kõ×ÛÔŒë\ÒÐ(»skðÆrêôy˜(•i°À|½Ÿ+²‡žkd7©îèíÔyY[[œ¤-ÚN•S¸…0Zrj«øyRg„BcÛ¹ðþr„{³çDÖ“ktj5ä0ûÃyÔÂmU§ÜF¦×hx¹¯ýób=î¦8ÁPmßÁ̲[“âŒøt›ã€*¯oºªî°í´ÄÝ…^)yßÖÏùë||È—“iëÌäQG;ÄG^…§ñœs[‚·! ükÁÝcX¸vYP‰õjÊzã®óׇsùë ~¬bvçÒZývÃó¸;|¯ê÷à‡:ϰÊ>:Þgú«±•¶MF]Ï&äé¥ì†ÅkbîI³‚IÊ ¼aŠjtDûJRî¢ýßZŽ½ÎŸp·+q¬úóeûûß½ÔÏÆÆéŠ`[%` Òt’潃$Z,‹ , ,¾‚ý§å£²›¥×tKëªAEré3ÚE˜ê©"1 h{™·Pšþu¡­q°_Ó)aŠ\ IEWJÞW 3¾Žbi+Èçôú¿0 ŒÁÅ#çHÆD.Ñ#¡Š{õÑÆŽ´×;‰‰TÕá§NÆ&hÙÜËnîê<Êq8TŒæ|É…’\ÄUeîmĦ·ÜøªyþUWÇÊcí©_ Ù~°ëaoÁºWcÌ“jØóÓÒ¥µ®ìÚ½ÕEù³‘¨“§#͉8ÔAVp0¦%—¡ bÀ”ˆ1H-4ÓÌ´3ðU/̺ÐEÆعFŽqU4€P—¸m6´Ë„ÅÌiµC!I¬–ÂS½ea Ä\Ü)Ñ«ƒÈ€¶N”Ô”uìa } ²y!¤55'ÔVx1Qê0•ÌìXȶ®na‡³ñ€cØ*)¡Iˆ-Wu‹(5ÈYfn2™u–ª&ŸÐIy6 %ΛôR5±]Rs’dfPbØœ¬ÜÛÁÖÀ6½rdÏEÉaäH”wì 2;îre6aÒ0: ‰1H‡lù;£'¤:ÛPiDkr?õ=ö|„ß³.T ÔŠžK‚0´±ç—(uân)TEaElqHÓK:ͽtu:ž«ñ)Á6CgÎ~UR ’Á¥ ´ÀéK¥|‰,ÂÅTÈT¡æMèMó ÷D˜Ò b,މ%“%$¸! Y¯×<¨i ¾b{zÕÎzŒ×)gXÕyˆ+…Þ ÄÚXX‹8àZ }+5÷Æù8Іi¾ô€%í5Æ·çê2i-›¸°”)•Y àÀ•‰·…Ú^9Ú0*¾’O˵XI˰(ÐÝ|ºÀª—N±m-ê`yaÙºH¹”}œ<²Ô¶hÅ(RKP’" D!° –ܵ*1ƒ¸,† Ü‘iZXå"ÅO)[GàI+øÓT÷­ƒº›bw?=«ð[³¡5ŵk«âÖë^®Åþöâáqí[ã¥lóLÛR¥à!QÇGI<+KlÀ|¢](Bm D„g€#:ŸÕ>~2þjã:/&¬º¬Í²oˆ5;õuõ2W%3‹>{9ç÷o×oÖ‹]/×US麳=OÖ©¿èwŒÒV TÙv¦,”b¸âÆ$UçÌ‡È 3æöVë嵺eV«&÷Ãï¦øU 0÷¤h‰ÊÊ‚A.BW=~àŽîøôT_1CÊÆbu^åTèusÍ–¦_S/×·½ÍµÍƦéÎö*ª ÄR^ ˆK XÀÀ‚&9MšÞ5ªËÒ b³;¯¸„©EøL!)¤J¹Þgº¼{wɧÌž¢…FÙtáúÃ^ÏùuâéOjÜ4èêÜç‡ß?þ»ö?/37^¶‰úİqi?º·¥z«î®MoêA€X… –KJ‡4£y,ùŽÄ1#¥(€ 1íJX¨ŠˆLH «X(,+1lþÚ¾¾ûëç“þÝáYï`l6ÀâX /Å"–bcØ»\'À¹î@ëã1úb;oö w%Íhmšy¹]ÝG pMµt’²Säá"¾—¯¿¹ÕÎk^Éë"ûYÓ§ñŠW¡ò¥vÔ÷WÃ(—êM¸ {f)&ÊZ M(Ž D#ü$W%_Ž\­¼¹¬ü¾˜#Â+beòöƒ¼ßúûûÃwÇoQd«“sJHªü‚,eÂ0¸×ïGm´™jðQÑ¢Jc¿¿¢†¾oK'KÍ…9[=d«Õ…rY^î>†uÁ"s¸/MEF¯g®ø£Ù;WyÞäî¿@æôXOIýŒ/2Ïûy3%—#&Ï`ÐØÁÐ]SÉ+Š<’ýÈ×°?Ünkò,mÉŠî¬A%%GþX~u_éG^Ò¦‰ÅÝywüÙÃ_Œ/ó>Ô¢ˆÈ[Ô1„\Â'–lmZ‚T¥SÔ©`ÐMýôSôûºùÍ7ð©aO6'ßÿøá{‹ïOýð'ÿ‹7þ¿|Ç·,Ø-ÕLÙš ;ÞÔŠ !jy"½þ¹þ¤¯Ç-}}Óí™FÉ'MpIê\¤@µÐKæû~oæ[>š–ݸ/O>5çhS ¼§5Râ‚ÕÓî|7_–¯±ÃIU+øf"uk¼HŽÇ¤¹Ì A4cŠ%É¢[P‚ʘÄ)%¬X –ÕïX ¹ ªAHP. ˆ,†`uá˜O´`‚)„;Z=½ñ"2 …nùèbâ‰Rtn[JX˜I'>½ÕÿwNÊÌ‹RÌ.DhEíšCƒP@4lC„ua´pµOU_ÝÞ^Y¹­EÜËYNÅ‚†&B+“Ww·Ôéáu½ÿö—~£Þ_þ»žkl|BöFœ¦t.)Ÿ£ì"“žR³Vk¾åzðÂ&]23¡\ç¦eÁáz–‘Ì<¨“ëˆÃʸgxpE-Â2‚•%9i²cþ¤ÜI¬)U/Pl0H¨RC'Z` HБ3@µRÄBY¨ 0TR­*lXmR#Î,ã(ƒs‰ï¬Ÿ£~¾‰½ûzš;þ–¬N;^õÀ(êD+M æ­(Òâa±Y¦j;ÙÇt 5¬ïáâzlD”º‘µ ²åw¶ N‡Ã*0cf7.öлLEgnÛcxqÓ@ƒyž,ˆ‚Ü£µáKægα?‡ö Æ{¿ÿïìSÛ¶Oa.{¢=<«7ñò¦ü¡_ך¿ùŠ¿h݉w}øà³jfþèÏeCBñ‘}s÷oÑü«Õxk†¦Ÿ+Mº±wy$ø“`‰ÃaÞͰ;ýì^’§ƒ-:S¯S ŸÛÿཀKÈà»ÿ»>þf¿_5·çL$°âôêÝ =!—TØÂ>V@I,:Iq l€‰ãáTu¦ë§éi½Éá\ñæº6A¬È$õ´<ë>Dq ¹œ{ßWÚZ`¼WÀfYjj2,½P&ØF­3Ð0U³¼—5(ƒQÛIù}Ÿ—¡ä$` 1qfö.³×ýäz[R`sf”2v¥j“'‰Æ`k £ËqW&ÕWî:v¸Æý*{ÜÌ®ñLOÏËEy*¥((¨iÅÀ¡Š©ƒJ8‘Õ1'˜ ¨¢k¥¹roþ\u§:ÅqÞÆ,š°ºíà: UDHp@X"¢:v¹}Äclõ°þ©Wö(ž4´su”Ôr-w€JªlGxÂëÀT¥j½µ¢D‘6µ¥u™thˆD싱ª"D¢!ˆe/ž#óÚ½U¾Ðyö‡Fk,Ç0–¢vd!EXš÷x«ÁˆÉ<x$UH{¡K b‹ü6‘þ‰Û/‹ FÛ§î¾#ú!Õë¡Û¿¡péѼñ&(DŒÚØÀŠjFt†)±s.|¹ñ¹]]ÁíuÇ/Kõ¤K.Õå˵®­ÇOÿÑ’kEóƒ»N–/?™þ⨬Öî¶ŸÍ_x¶cëu†çìÔ½"nÒæ Ø,xt¢%‹</íÕë"~™Õª„Ç8º.  î ßî¼ ÊáF¹Êä²™ò3eÿÁ³§dµPnMŠ©•ò>º™Ú éø c!ØyØù"mЏ{¦ö“ËcVºÜ£<Ü`ýÊ× >Xë KxvvÏŸÿü_aµzãsÓ€vh¤Õkµù;ö7~ùR©»ó§Y„†š C^ÍPŸW©÷­§ÏÖu6Ìyë±cí3ˆ d6×ShM¬ýõ§ì’ÜÙZíBe;¼kÈ\Y«tSZqËõöx|×ÚO´wòPî)‚º¤×˜SUô>p¯üó¹ð6?ýé]–ÛÜÛl_ZˆM>Úh™UèrØ R™2ød8e؃ҷ–H`_Ç·…¿ÌÃâ ð”-^ñù: ½Úþò·–n€ï[%$®Í¿/ Z.¿=rûµGͶ¥½Nìe–éªüD<3/c·ÆÁ½- ¹¯-Ñ7Nf¿¡mgO}¸ÉK¼1UYA톔-íL1¸€ž¯ï‰\ccA(‚½78Ô­]– Ü :´%ô÷µ³å×?nÕ®ÇE$>‹>ÍÚT¿ ½fÒ™{œ »¤5¥A†‰…ÅEãTWÛ‰î¶Çãå®–VT¶Zl¦9O=퇧ÃóÖÅœ³á@kZï3ò1´µÆoòZ^$+«ò·ŸkS¨zn[¯bÅ×LãYøüØßéÑ2ÐÛ}Þ¢lÁ=¢x ïÎ;Jûï[ë¿™_ã²±ùR|œ˜G×Ñæ9¶=&ûdblNèwŸ¨I{cŸ ±8 H:—"$*a¢eÂ×Yê„YüKÀ&S7©mÏ1cá+Ú`\/ÄØëy€R]$mn»]Z”Ï!«Þ¿‡Ú†æôß\ñ‘òÛ0×E`Hd!$@c â7âΓ~˜‰Q2c)HÊ5œ úµ)58•Bð„½ZqdÆz=£`; è‡þ)ÝQOæ€V³ç°mœûCswÙ ä†x<„ÓHðɬ4÷AµôŸBƒÔfÒã"•C4bMÑÖ9G1YÏ…÷áDÐ9‹²9ª¦°ÐÆ:>03:Ÿ }×#(û,ï-Zôn/ ‹Ý?qÖÔ ò,òI Qå‚XAá*¤”X…ž&Eı"1ˆXÐPTk»œµ b¦Tì4¥ÙÐý"DXÆõ´û`[ˆK›¦ò*·V êȸB6åÑ49ÃR°D h[QlÀíL†•F¢ d,H€èK©b“HŠ©ÞzoL¹¡¨;j­ÃHYÀDçoÈ0SP1úÌwGª&YÁ (^îÓ*) ÀüFi°ÆÀnZdÀ€,`Xö¯¦¶R,¦i¹¯Ì‡I" Î*Ã:yä: ),y!Å¡SmÊqTØ®oZ ¬1¦­’½ì>AìÐd^SZ†žž—¼xŽØ*O@`f¨u²‹<¥qŸ‰×![òíšÎöÔ†Éy`ZxKuÇŒ SÆqA‚Hš4fzüÅ>_.”Ñɳ+NheÂá’»”?*za|îÈ…¤,tÀ›îP?['\Q•UªRÅ—ÓжˆõeÆuöªÿ"ùÑ+«ý ÚʯÊ,¥ãp-EæÆ1ç:_l´<óB&rIÔV¥±^b'.éÆˆoÄqˆ”: Å8œ©ËVœEc点aR@¨ŠÊ–3éhñœÃgÀ¶ûijÛÑUÏ™°\êºnTn±ö®{H¤H[´,"a™Cƒà€„ Df¬JPV’d”C*[cµ¬E È¤aHúøq¡°@ØpìlÔm @2¨÷ˆ¡4íë͵¯ì×góI±ÔXÇ"»ý¸:ëþy¯ $ˆ“·óÏ*Jp¦6z¾º½³I*D „ Å–5¨Ð3â„CgÝšb¢hÛ9=Ý«5§(&XªÂÈ‚JB^~±q}í.Ú| z ‡2!%”¢)rhæö/’ÏÉàix^L$˜À`0æ%Œ²’8Z(ëH‰^g–m®Ú¸§iÞ½\wˆ…²ìÐZ>ûbÿž§GèÙÏu¼B™mv¤§×€¶jJøCÇ·3½û:UCY2SíIE"E¤ÚÂ4(Šsí¤§ùv‘ï+}m£mpæ[±ÊQ'î •vèþò¥®n쟃<ýy^¬9Mµå̶!ò­v3'ùrã^¨WÖÜS(Rïµ®{eÈwºÏZ›)dËX_¤ÊÍC†8žÑ„Ž=L¢ô¹ÊK÷Œ¸_2 ßý¶ÎD¥ ’ôó]žýNç¸RƒH2sE[ºÅ‡b%cr{çÞÞl>ú|¶ÞÓü£,㘧ÅâÀB |bhù;áÏùARèÏÌË^õÌΗç[ܸ:•p$w²;åw'÷õä½ÙU!ÿtðöë;üõ÷ãõ¼rl«Äßùkÿó¥~6ÿ3Ò¯þåÿûÜûtrGN©Æ†Žeš9›H¨„Jȱ fñK¾ÿ½NçŽf kU°.t ™ŠM­ŒÌT¿ë÷vExþ"Ø|ߨgnïùË>>àôêL—…:È*£­Ïóå2ïøih±@ÌP9Šs\5î¡“ñìŠè€-\•†6“Š"nÊDÞVb[‘ir׼˟Ê%`Ad™‰$Æ&PœÃÔÌSªÜ¶8÷­jÛû‚ùˆ7áŸo¬R•Έ -F†Ø¼f-?°ßúÑú—N>þ£0ÿ×k³YëâÕ:@W5Du´À°é êÉØ `X€È\1µÂ³ùYÜé·ï¼šÚr*|a,¨XD“­ šîÍþ€ñdÿ[œû/2õ¯Ï´‡|ÿ^8ìQ¿Ò[NQÎÊÍW7pt¨¨.•ó‘sU]éÓõ™:š‡Çunz¶c‚N"²¤§ÖŸé±¤îY ‡h¿®¼4X 6 @jÍ£L¯Š¶£PQâ@áBU”ÀhÀNsmØXeŒƒO¼^Q8*ƒ#•Xådy|zZ}MoìëY0ËiÇr ³UC%éО°oÿñ¬™kâWPâb÷©±y8ëݸ¡àЫW @*#-80Ç‹'JÙ ðùRÉ_ YŽö>]ÓÍ4Óøù<4^œïÉ™bŸ©iïçsötû³Ìüdd.Ás½}ÛÞhzéIgi&@À}«óÆÖZ;cîrÕ_I“M;Ì!–j°'ϙ׎ 슎÷ÔF* >Ž(T䨍"#îå(öÌRPBmwÇÜp;"°#3îí,Ά¬P{ºO7›óª6qAQ”€±W ĸTj¢ˆ‰VŸE$ºKέúõžKë"&E.É ¨£â|Uwv¬]xÎ U2½ÈÓ¶x§G×µËáÑÙúšL®$bÊ€wǼN½œFm®×ìØ&<ó›ÛìÀŽkäQM€UÚÔ ÃÊ tœ˜sзÉÇ Ó@pM?&‚µàb·¶e:9ŠƒB^¤òðª§Ì•¬¤QÌU×ÈFÀ’X¡±5Z ™U¯à*Y‹ã´ÊR™é3 Ú•ͨaktB8l£Mv¢»"â1ƒˆíLIˆTÌÐhõ§Ò4ø¼Æ$ W`Pe•%#°C¼²T^L׆8R]HaK,†Å¾E¤U{>ùîš*&¥«œïão¬=à‡ç“GêB‰f¤ N%’—|&‰Q8Xo]qìÇ„u׸àÄ‹#&æ6ÕÇ[)0l]¼“{0÷ éø2þŠuš:a{² àmCçKDe”Ë H<è—À7s²-¯ô®™ÛRÞNKó[¡Ì9gáYãiؘ-‘vpìéŵω<ÎýÜЮy• U’½y4³¡»¶õ²‚ ±*3©j¥½ÐˆJiéAk\W.ÔD-VFü"˜£JÚ¥lAV–‹i=jÓ¶)Äe°6"³?¿KüþíåGòêׯ…¹ªHL$,ñKøKû?έ>d‚^0ÃÃ×€lüN˜´qf¥-õÀ`'Z€ÒlÓ]Ì=ŽaNè(ã¬Hh"µ·¼ˆ 4Y2[Ããol_Ê¢æË*òƸ+×èùÁ3 ç: &DY@—-eçþýÏãÉ/ý“úþ1Ù^ëk·.‡ÔN ”Ò*ö"ófšž–w,ÿvöÞžÖ­z¨LS±¤€Ž’*Òp‘¥œÃ(F‡½rU] ®o¼ûv{û'Žä '®–É XùL=/;ìÚþ åàØÆEmn EëDäfØ—Êr¸þL-©AÊŠÐæGð^;­[ŒåÊV* >‡yl@“¸ìqÒôbúdy`Ô`GÑhŒmDÔàEõ¾™[‰XMqW e`Í2;M‚2Ò°Óé+Øb8œ¹²Ê•À‰M´gÉ0ú;u÷?¸ºŠ5˜™Y¹½ET™Î_¶^ãxׇuNÄFV†Ó—\‚^N‘tã&_LøÔÒuÒvRc%V ËŽÑ*ôSe,‹×@ÃñýÁ‘tE/†ùŠÒË ï1ÝÙ\c»–²L[¸öñmšyðÝ"é„„@’óåaâáÖÜh‡, šÿúŒç¹ëD‡ßüɺ|ØŸ{Ñϧ‰E%u™Ì|>¶lá/†ð‚„ÚX°ÊƒKíý^ù1­-îOiåc‹ø“í…Ð,iŸsÛ¦jN8Âë ¶2°UûÕã•W8P2!ß,/Ô:ÐöS«ˆ*$…o{÷V¹@Kû*¶wâg‡—ÇÀ•áVõpŸéN5r,®ÂÑ!˜kßG3n…[³×9,Wh@² Ô³Rë¢a#16@’"Ñ€faa¤ÜÑøÝ¦œ ¾™¹9. ÛO?}{†£° ò.}õò:òhk¼«E%¡Ù!TXK£7©¬Æ½¹î†H±y-Åüt¯A\êÌ=Ë÷Ñà G@bðÝHO¬»©p ¼­m« ªÛ¯Äåcc€¬®å>ªpWƃ‚êAw^Ã&ðšˆG^ýÝàÔ¡ýµ\o28]ñīØы%ëñáC{$O»îv¸•]á_¶L'—ðgƒó]û^b „ãù†Lwà”mgƒ‡Ï¼<ÛQ.B}×.L¸[X™eB‡}¯bÛÿdþ…³|ß½ÛäŸ?W½q»ã3"V &йaf•bCf„zJÁ„˜…Xæi›ä•)D7Psš‘t vI¡f°âV |Õˆb~è‚qW‘µ ÅŠã,@¡ %"Zu¨´DW X$,à8+¶ê$Ê ÉZ7¨ÄvÄoÈTÓ¡;*@×xQ’Ù‚ç‚®Ò=cf£ ½NT’Hû:…î–+¾Ý –x@@ ˆA?•ÍÔ#ÐÌÛj¦ŽK ¤ÙRÚ7R‚PˆÅT" ã^É ghVìá“ Í… ;&IŠGH¡Ê¾E]•q\©Ç$ÉRNµÁ> ¯avØäDsǓˆ>ýÈœ Ò°ŒÛ8¿4奖4#“^êÔØöŒÅÀWòÉc£…XÒ‰‚Isœ‘ª‚“X‡H ‰¨'õÞ/ó›yç™ ¶¾fkÚ&{¶sƒ·ÌJ™EêÓ‘i³²Jtð_2ûÜ á*m[‰qÕýë´E·rYg¯›ã—ÐòМ$âVn6PAíÛ‡N%rU¸lJ$· ´ˆc«çä„õH"á5c­zܺ;H¤^ s3+>_µŒ¦NäkU ¡ŸëY°ü±†JQ€Òt-­hâÌaÿ\µGîiñ½k6­‘b Êh¹=´c–)ÔHUHMœùZ³ñRe3ʲRJ‘©¡2¸ KÉ F Å2Ķ4‘Be! E(ízq^ ,0¬†3ÞOókéÌ.¯No~ûÛ·ôö¸ú5›ŸÅ+ô¤ðÙÍOið²6Úsc«^€¦\—–†ìîO±nÌÙ¦¨mHQy†÷{qf>êñgóö¸ú±¶7ßýmx™)l tJiËKšB£6‘ìä¶ÍpI”^az^ú>­¯§ðv ¦$ˆYÇ­=ApÀ@Ì>Î ª^Õ±›ežø%¶Ó¶ª“I3\ ¹¡uD‹ÈÉúQc¯@-BécY§*…FR¥3¿;Ü_kÓJ 2 é6èŠGfKqtëÙõX¶9ÒC€” \¢JHh¦Ñ¤.aÈ&¦#[ŠËV`§€ DÁ‘ ˆehD#Ì3ROIÐ혊‘€%ZÚJ ÂÑÁFaƒqh@ÅÎûeAöþÆôy?홂îÊ#rª²žGùüÁë3½ö´5nÄÖyãpÏ5êØ øÒ«áA#ਡBh%X䦱½âÚ™YN5d©¦.·h± &pé430-ÃzO›)É–4…ˆºÒgg› ¦6ù0ù “XVú4ló•ÇoS,qÎÒl´Da0SÍ4Žà®™¶ÆÀAÑÒ¬¹ë… 0Á‘µgýÈCx 3&å.N*O8òôIİT\–çBöYv~ÏôîÒ·'ÁU¹V)€¶0l% ÙOÔ¼Ês+flêœ}¿ÃU©@UÂBdJã~|ùõsò*|°{Ÿî(IJè£ ‡ÁJ}–âï µFœypðgÔ¥~¹C ®^Ìó¡klrj5‡{ÈIæ[«GˆÐ±)ªÊ©»jGE&êi4Îg¿¿}ÝtWóØRY†ýœÉp«÷稓7´‰,¨"ˆs~RÛø¦f€v“dÁ÷Ê÷N¦‚–¤5~…"Bbò5v!ä£I²a—Ë矜ßüí²›|d:…,—Á‘ÖÀ/"³8‚~ÄHOYp 7ÏzÚ:¹õÞ¢<Èó»3œâb¬†¿¶þ©ÓßÏö ¯þÿï'ÿû™\”*…Lh¨np‰ž˜;“Z]­^®KÜ]ö )i˜‹gR/Z&9h"½@?×c“Bëºû?ò÷B_#¼~Þ>7¢em…d4v§ÿ¹?œº×â»Ëǰ˜Ê“¬¡*3(h`Å0*eK\:<%šR„8äcÅ‹IB´x9 Kf™ó@©±êCdrK0fDf¥£_µºÎÅÊÞÔïøóC¹X˜µ ‹Ñíµû’ùRÃ×¼ú±úŠNþØc+×_æ«j+ ¤îÉ™Í'3V1Q`ßákgð¡æ€É‚lpoRg’“Óâ­â‘ðB¾.éòmZüþælʘ‹ŽÁ…r×ãyýõüÜ_þµètmæe¯w\̼X¥ ³[Ãù¬¹ëKξ. ON™öºË¥ÎQSz\Ë©9þNJò¹ìyÙh}å}í¶nʈaËúzK)q 'jÚ´aKÚ8ô „kS³ QŠñfÐÙyŵ npGù°I=d®pm5CZm©Ð$ã‹óØùÀ§«ƒœ‹—&ÓLP(d n¦½_÷IÆíË6¾ëï/¸ ÒänWCy»!hᨡÆ!â#]/,èfZ‡÷ópåë˜hx™NÛÀTpÑÜU ^ÄN–"Êïî5/=76vc îwŠËüå©ÌJ^#Vƒ2‰ÙGÝM;ذ^èY%«P»nÄüä½³gÖ\½¹þf\âÛtæWXÿþÏûEÿÕ7ïÏ¿¸þòùÏØ“v1qÄd ¥Ó_°Í¼ØÌcÞ/òæ¼+ZÒ˓ųÇ~ym»öçøû3~wíÓäf/ÀL&Ç|éc`ÇU7wr³šÂ£<ýÅÚqgn.a5äsMWGO4ÍžŽïD!î{=øÂžãÖL ubwYâ”ùú oUˆÙL«„cÏl¥iË»\G"¥I±Zëá¤dP{YÌY?ßÕÜ.O^·xôÚé6î(   Ç"¢ˆ ô8BÌèëtUO²GJdë~þ¸k·û˜ÇEzµšÏÄtúØ9þq’gŽö}Ä÷óþ/7нáxñ¸åäX«Û󪀙1Oê.kSWÄÅ•kC·ýäü¦ùH®"¶Æº¡©;dÊþ€[ªÈbÂB‹âbXùª0ÛËôa¿C7²yXœDÚ…®5ò­/x£ŒJÓ¡·Opôâ9é8Š{€¥W05È´ì5—G¶•ÔY[Y{ª"V +Ô¶¨$(m8¨O g‡L€!Çd®œ1¬´âj ¥MœS å-σ#lb F¦'goR®´qäñê—æ×m†‚]ÒVë<ßZÝú¶ÿRsÀ²®^=#Mbi…ªâÒ> l%,ºhH²ûÁùkvŽ}À_?ÔèÛ„_ß û~|ä9P- &P„¬‘¨Iå¼ÕqñfЧ—ÝÆð˜<£ÑÚD'úr‰Ì ëoiÿqd‹YÃ`|ÿªõ‰kÜèû*?˜±H¡oKyNUÿˆšÜ‚›ñàý…ÛL爿:ßîØWD:Q ç{_ a¡O®ëCÛ I`Ñ(«0WzÏó1sç{†³o”=+:bqÞLJ] QÛAjbQ#?èžÙŸ«f’ƒ­ˆ³ÅÊt"$•kò+ÕŽÉCN“¥áBìô¬R‘³XKsÁ#wô3ÿöXÙYܹá3ÔˆŒ7!”‰´{ÏR_î¿8òÏä:z¿½“óÊ}«Ø¥!Ü¢án›z®ömÆÉ֭õ“´~RÄp¨ë8RçgجŽmÈQŠå©Ç„{GãHõíÜé‡äOžÙ2¶ÖÞÚS!‰­ûÕLJ* OûÅ©?ø~R…ö®k·Eì½O፬ÅdÖ "ÂC€èqüI÷~º\c™7±;[÷-¯ð¯  ÿ¡à{¨6;MlÂeþ.ü»Zûr>)§Ä”©Ýô±:(¼åþi÷QÂݬÆ20åBØÂT ÈçÝ8[¡³w!¸þTÇßFÂÈø,¬¸O]ŽE,*¨ô ^M&DF û€‡æ· ¾\}ñYû{:»%ýûòzvi‰„S–wm †‹9´»Ïa®ÙŸR'Œó¢á{w¾J@ð½¡÷Ñóçß|£V#úDŒ‰F©çGqü=¿}/žlîý»’µéµ¶G†8Lû;KËe‰Ñmw;Â?â„ýɧË `XàɽμuÝñe#áeñx331„¥H4fg˜9ýÌŠuÌñ¡ånX¶·ÃoúæÔÍ­ ¬úð¿#Bx×H‡ç¤¨w÷Õ¾yQîI¶ A4jqº# ;EÎg6+vú¾­Ä˺xGvÏlÔ(+GÝ:m<:³] ñöŠ®"‡>³.kµSQbôrua³·) ð>âÚia‹P†¹¼3÷¡€ž—ïätl¥Íø¸»sJ{üû÷î¦ßfàŠO_oÄW§0™í²EŦ%uçéjvbëôÄGì;¢¯ßºI;rG<‘<•”Y} þ¬È±;õcie±rˆ±‡bUnm©>t°èEÇhé/bKâ‚÷G0~ÎП™Ã+}.¤'ET›”åÄ;÷°r¼Ï©C,PÈ^¸:â1þ ÁTÖ`¡ŽÖæ–Ó [êYÿ…«ÿðNçòÇ¢Àâ`íƒVµÉÌJùBÅÞ]Ûî5<~=Þš¨z¹Q»oì΀f`÷ÅÍt¼¸î /qÙ\ä7äiÏüuÏæ&z}ðÍ/Ã#ñíéˆs:vPžU0õô¼â! LÂPCN’@ !ÀW"»³:èÃ)Çï]tì|ÖnÅ8ŒÆšã4¨XH(Ç©*«Þ²6€tô ,DAI' 2:Û_$ñj§V¡”dF]˜ñS§!ßnÓ䆄˜!¶èµÂk·–ÒãSƒºa+Trpƶ0-dTe¦‡!©6“¨Þ·^ùÏkNhóZÄ"$RiˆØ˜ôuf bŒ<ÊØÜ4íI˜›øÈZb9…à Öo=ºJ©ÃÜq!cú>5W­›•ÇG²†«Us¡p î•Ñ¡>ƒ'‚;@Eƒ¶Ò½×x&·•oðwe'ýTHÎNëÝŽ•§Lς℔@Ä@( `ÂÜËXÎ~#¶&,”YS‡QÐ×WT.cTH$"QäâÆð ÿ”sÊœy=¯ÈëšÞçøë{Ñ ™ÕI•SÞ6ù +¸ÀZšÌ˜mÄv­KÅHLXŠÜXŠÚNfWñ¤Ö(’E£DŠ9ü³ô̺=$DŸÊxµäî‚ÆÂ¼éYF›Ï£ožÓÂT9^ö³ÁOo)q˜µ d$µ‘‡l©ˆq¦W˜®ÍÍxlÍ£0G£pcD2ØAÕ•ÐLt~X?6U¶U0)7´-Ѳ +z `[$䥯’%!A[Dª !2鑎E2¿—šÕi5NÖ¼µ_ÉæâÔÊÎÇÓÕ«¯¦ÏúáA­OT;þ”ý˹õ\û®³A4%YµÂ²ØyÜþ9’´l»‹É2ÀC}Ÿ_=ß¹õZ5Ÿ¬õßîë^º,d…åî5- }M®ÑİJqf7úrSØÌúnj±$m”ËE%)³(Ð¥ – 6nNµ;Òö ‘éÑVº«çpØl,{Óf-¨C!“s‰r$É:‡ÕèwPi‘ЃDVlLÆíÆ €²ˆ 3 3V˜¢¸X/Pƒ9d‹uDª›Q±–²*H É¥±°ÿŒu(H´¤e…1¦Ê2Âl%(®.a]Ô–”´L9('Í‚Y` ܃WU¢jºÃç·W¿¼È·AéVDúM•GÝ«Šü‚Å®N,/€ á¬?šž›D&s%BJÉ*VÅa§¨ …™ÈŽŽn°â:è ¡Bѵ\pÍu§ B%ÚO b‚Ȇªª3lb`Tä¢ L-À’êÙ<Á#‚µ¸6y-ÉZ É —aõÉ+” ¤D!.¸ ÎN¾*ø¼ OÆÅ(àZ÷„S-a«ÜõºùcÓXŸ¸•mt0P|5Z¶’ ÞWÕ¡u¥v ? |kúU.¨%®“g{¡cR¢Jm°µ™Ëȯ’.'OzM\œ[IíÕ¶¡&ž8(÷X–ã;¦Nű?Cù¬BÈ!!úŽ´š¥Î4Xƾâγ}Æâ—)é‡lÂ5.û¥Ñ‚ÞÐÙ¥Üû‘i`ÇëÿâÅ/¦ÀRi³Ò·bžxB·‹|gíÆqO–3¨z‹mÇ’‚ÈÒësó«gù·wþ¿êärü_¢²(Õ¶‚M¡©p$U'JO“»ª>¬ï¿”×$;sA‹™Ó#ùœG//ZJœ~€Fþ„ÅÙpüWwëeúå-è<'Ï ”­–¶ûެÝöîÛBóÿvLâá Œ,)b  RPZå*ДÓÝ2!̲…(Ú¤Q¦pžÏ4˜½÷àÄ”Í‡Õ [l—ZZôY9Àúxg=¦H5ãO¸™M{¥M¾ôí;Ô‚ ã}ä¼:½Çô1}Z±ÆÞùé¿ýåuϢΠNhD96Ç Þ´D»¡ÚŒ¯¨ƒ)-ŽZƃbY†`Ø HÕï«­¸K鮡¢Ä³u2ÇýÃ&nÍm ´€{MÔƒ¢* íhÏq>K›ÌÛñáæ,vÍz¯ñÄ(XKœñ­MÊÝçV#ÿ|í~ÖóºX»×ŸÌÏW³{áS¾gÙ_£ó§²êc‰#Ò³éÆ.=n¦áëDkr3íIˆMT¬yç—å·Ûråk9ÿ€ž–¨Uôˆ†´—¸u`Æ”ŽìIO¶ç[ž³ž<¡£›sž¼[–9÷b¯j§ˆP¨Ïø/«vº_/¹’A˜Tfƒ’Z™™‘j¬¦•j!E-ˆU„*=àDFë?c¤F  R¡K|:ÔjÕ,yÒ| ]ôÎeÙ µó„Ê£€˜RãºÃ  öñO]ô… ¢0®{¹rÝ~O{Ù×Ö³÷ØyÆtͳîǹ®7ó>ýÁ‘ ô¬KÜ®ÓåQî2Èì8¹&Ê”øpvA­m‘»M™×w\›œ®¿ôˆž¢/ß‘}4 1­*B]W7¥5Bd›€µš1¾ðOi¡À¥ÉM\Ü5×'—Ü6c¶fX$n‘²¹×ýƒ¦7¿¦Î>îb­lÍlŒ"ÈærA6ÑDѵ|º/ëäµ(~:€œ™J  ’¾²XXg… ˆl`Òtð•úUá› ¦Ak£¢)è5Ÿø”Ýôt u˜èoÆUÙ ¬ŠÉ ­qä°º*^µ X"á_”ßV¤ý¤¯-ŽÛlNì‡ágJÐ@µ &CÅW›Ë¹Æ8;+陼5—?a‚ ˜©À­M¶ëœþ[¾¢å˜B+Àdj¹mŒkÒYšBö M,pX™gjl¿»vI¾¡\zÚ³{î÷ÒoÚqi¬`zå¬êæ­acÜß|V=9>ö7|vá…3‚Ö)7G‹^cÍz¢6 ðáoÞ“ ¼ÿ©bæ™ò}×`(àdO~ McðÛ&µØ,,âÈѳ$–dEŽö_C~jÂf®pˆ‘èߨÙqèW…ƒÆï‹ýþÙ}c‰ZQO‡dã›Ûô«"wHʬù‰óñéïyì{­¦£N("•“VgkÇKå…æú Âæ£TxlÄæóÏ%þΩ­dœéùt{ê´ÅhÑ]›Y-^à·»s—…`AQ{‰É’ 9¡f¢4®É^xOí’ËmÒCE˜ZâÀE”…§™£v}«øöþ˱ÄùðùNkd§¾uþÃwíöÓšcxÿ¾þ?ov=ŒÕeý£•Íb½á,­£¹ÖÉLAYW¤¯ç+Ÿô_ù%Æ×h7Ž^e¢Š¹kó’ŸŽçåç^»FôïI¹9Ú›r›ÿm“®æò·{i­KÖ¸·‘yX~|_ª:Õ¡Äy‰§„ˆYŒ89xm{˜î>n§5DIkàðaöÍzåŒôñhÞg&ÆV>Ÿœ~N¬f;æ~oùlH¿Ê!©þ´‡¨ËìÌ1>ÝÇÅû&çG¸º5£ñqäËܨü{œøäsêµJž[²c ûú|NôfϵM'Ó©½;œ>î•Î3£Í==™¹óÝ»¸2a7ãSH“Äjwó˜H£ÍÁkÔâsÛ¯… +Šm3'åy)öLÇl¾:qlRÜ u±H”€ª¾¬±¤¯ ¿ýãÜÏ×/tÄÂi¿ªë +¨„¯º@j3ć4r|Ž£wÊù²¤ãF5ê3äËöõ6¿!'5jS”`v+£8ll‡,\®4”²t$rs8ÓK³ÚbEÛfY´hS¸+‘]¦]‹zfÝÜ·º_.U=#{ž«G]Ó´IGNøl? Kºw~Óò_PúËq¤Ž¢EØr\tø©­Y¯qeA†õ:oûÐY‹~6úÅügþýÙ-LÈ‹îÉ^ë¼Â‚ý_ª)„YXÇí¸­øË …a ÐžV'i„c€JÆ66 We‚!8çuÍÀê`zÀ8Æ_ë¯Á{K ùã=ðˆoãêqÎ>ÚðZ8îZðhˆ›@áø™Ô¤%/—‚ÐkVäÖ!KIZËŽmf‰K'´ý¡ÁåÆ÷ø}¤²ò:‚BU5 Ó5Ãn• ´žd}¼ Q(Ä€ û ©è‚(¸®ËPŒF*IРヌæåæ"ÒÙ˜cÐ….è.Ö"’O¯#Qq-É`ˆ'•Yü¼‡¿›îÿö´ÿí8tpeí‚UœÞWvÀƒ>Ö3BE* Ö;Ë} Ç2E>2¾Ð8q" jȃ"‘W@«BÏ‘­I«å`Fş稽ký|OÀàhÁðŒß;´ÿn+è­âzáÍ*¬8Ú0Ø'S¦˜ôÐÐM@õÝ Ñ¾~X˜J ¦KÍÎ{å}ÒkÚ\M­ Ý d<ïøº.PŠuG up¤µ‘Ô$„D14€4äÆeÍÜÒœŠ Xïk ÖlàëZ:GǤ¥.1Ž>}‹¸è'ØUµá@£Ü›¦®þ´ìµÂAÚÉ–ÂÆF÷uÍ1R~?FŽO• äK¶--­0C–™ ”âØ|Ò®ACz #AVÁJéŽó9 OµŽ`o­ìS;÷òÅ­ìžP™ ½õþ-úº¯Cª”šr ±ÇuXrÞ*-$¾Š€J¯ÔC¡É9]³1pš¥¹Z ¤0S&ƒ6ÔQkÊŒÍ1¬IYƒDÜ1 p”)•¹I$C%ÙYU)2Ì `Ù”Š‚ÔI ¬šßô« ¡Ô Y¬©‹Û—’ºB.«O"-µ^ü\²´órM‹È\ MÕEعqã-1áUP‡žhšB*tÈÐ…ô|¼_|ñ’ÍÑ ¦5ÊÒ–å*‹éšË"Y Š6JÊ`PO%èXcú‡V3²B‡Y°Ò”e;(µ~òVk¸ÅÀR´-Ê8ãy‚{ѯÙÊž]Ìz̿ޭK»SŒ:<Œ—ŸÀ]N©Õ„_·5Ïá3Rš "RQÕ¡C-\) ê¬pz& ÖäÐ:ö~SúÂûzi5{âÞºöࢄеJ™Ü, K•‡A ‰¢%Tðr¤2¡Cí£ÄµÓ8Uªb#@”Ì):ÌKn› ”— ìDêr—!cÆ0*cDë:@É׿ûýûÍ_¿ÿÝï?VÓr[Ö¨gÚ°964ÀÊìÛ€(uäÜUbʼn%PQ¥ ¨Æ€LuÑ Lƒ‹(ŒB Cé™ô3x;—Z"¶fuRù8‚<½*SC©Xš†iÌ줮ÖÛ^j'z<÷«¼¿‘ïË9ú<Â0Æud¼’ `mc "‰bJ` G΂¥ºõpŠ×y¥~u,ؾáUÔKå >`⃀”pæãP[(Y¸^º „FìÅø[ýå䙆Wa9¬¤#.E®Õbñ±±˜júSÎÕè"âKQ€~(¯-Ç!ÌdbœKÕ´uζñÝ-\Š>>ž·r¡v…Ù{3§†g1aºÐ/¥ d¤H…‹Ñ)¿$>$¡ø›dÿÃÖÿ W¯ª2mõK™âb­š2×ïõ9»ÏÓ4¯íÖ )ÀÐ8FI:—œ>@9Àh¥¦H1çB ¢C=žë*©…æ[ƒ¯gøãüTþ¾Ù|Ò¾×GN6‚ä: ÖŠD‹’0gœ:X¹/>ê®â[“veâ‘h!-žxn›{«vÒX5¶‘a—À«ûÝ’õtFWxv+nÓfÔ8S8l¾#>Ô§@ÙßK;@^h2œÄµÐ“ì> }È;²Ítd"zBš}Î7~–èH×Û¬¼}zz."(@g–$0i}Ríðâêç¨!ûxǯ#§$â¦êdçpkШ´ît£u ÈOƒ Ë1H …ðÐ 4=ƒê ¢Ëæ®Ò½;±ñ‰eÔи(uœBć¡_¡-5¥mSXñX#´¸hï²Nˆ« •#¬‚zÖ183î‘°À}1]=ž:MÚUêXŸ‘&ã` ·#4ù*ï¯Kþu¼õËzùÌ7«ƒãå@â@rÑzpð®wÎlVO˜Þ–¼e8ý£m)¯Õ°Bô,\%mdB8&‘àŽ@ ½KfÞ<÷O*òñœÑ³§Öì0}ceÔæ|‚kÑ{ŒÞ3îêykß6ãɶ[ýcç.>Ž.e8¬[–)ÊSv(;)ÚíB( yZ >£×¿{ ·¶¤¤Õå’ŠnÿbîÈ–÷<Ú²¼n·êà´¤46>dsúi®G9¡[;mn#¿, a,0ÍŽñ›…æ0~Ýá<@ûJør‹“ÔWI°0\*@œ<ȱAîc´ëÖ¼‡òÕ§²¡þeVG‡Ç#Ü{PŒÉ©üìÈ^ö l‰Ñ̘N%rÝŠ£OÜ´=’êñ÷ ù$}˜ðt±¶Cúº­ôEe‘Ê[ó´ÆáfX,Cå†}<W–öo¤¨ÊËÈô—c§¾Ý{¸Âìºò#€…aù#FÞ¥¯MG½¸oûæò¯„™lûv0Ú7®¥"줺ª ’Ë‹|9‡¿,ë3•ÏüºHï:©‰eT„†¤‹ÆavÒ´ÞŽÜ›;N ^V<[¯-F‘NùêãÆW/b>®Ý^óŠïÙvÑlˆ¹ê.ãví E*H7(—NÁ-"Z7Šê¤ 6„œÞŒö#Ž> ý¿¼Æ­0ã®<½ý8›‡sX´*C±õf«(Áª‡úØFêNÜw÷¸fâˆë‹yñLÂL†²°^ž¯“§ìÝò*“àÙÞêæ …)l´9„‚îˆTôþÛ$ˆ)}‘¬êÏ!ðkMŒO pÅD¬˜»„Ô+žÌFP[‡PÜÄ]0ØÂ)k1Ñ:oë×:›×Ó~*;P뗞ʴ¨ÅúËñå[ÑCð¹žÓvÉ…Íé}‘ â J5ƪ† Œáf*a3q¦^æßµ#ƒ"³§ZQ“¦dTç´£ ¨SPúŒ8Læ3áØjd¥œ”’‚Ö!­þ]¥BIJe- ®„ŲÄÒµâÅöVµZ¤„´OR#Ñ»«˜šÉV‹Ûë`×ÿ¥(ÿ«Û–ÿü²¥Ž8d³ŒÌ¨¥˜)v¤‹ÜšŸIä4J±#&C1žQ$¢Å"V°E3V¨‘ßóž=P\~0åÂ+–äÏ,ºÝøº®Ã‹ŽŸ’1»yìvN²Ž­ùYìè´ÞÙîæÒ°(ø‹'nRÍIOíª)¹èËlшZ÷°›‘ã47ý Û³ZZ]å[›@ÙQ«pJœ×Ðç®)=è‰ãâ¾K±òˆƒ†Ó©ÆöøÂØ_N‹Wª2Fµ'ËÝ:k£‘ÄX|T›5Ì«ƒw»~<­ñ‹Áâðg$‹ peïsïó½=ØkŠ“(aª’‡RÈXò'hO™0ÖVª6|¥‹‹µ,Ô…9dtR,ÈÊféTþ@ï÷®‹¯}FZýËÞõt€kȤ`Î #•ÕN´‰a0Zì[äÌ“Þ7 #4¢,¢©pA, Y×ê/Ÿon +/·Å΋¬Žô}>:•}Eiµ¾i§eˆ? Z˜&3OHÿõl85KÑ!°EñÀ ˆ"?uÖ_ã뤮ƒ3Ý _€›Ù¦QK.” *±È,4d[$÷¤.~3,Þv£3½n’r®1·ãíJ rqPqÎ{ÙsfFE’È‘p³•u¢JÍ’a£ò%Þ§4lÂÕ8½Q“’Xš”sM š*ȵEòÄT|îè®kŠpKlŶfÿÙpí¦RLñþòÍzux­®š^φVª9„‰lÒJ©ìJ2ã]´ $!©*õÖ6}‰E&äbF˜e„”1MŒ¼ˆµXt04XŒGÝ­V¨r‚Ë™9ÁPŒ¸ô_ü·¾þ·½‹bÅÎ:G¤bÀô®Y‡Ry+˜@ŒÃ2ÔjÁ‘~âÅ Œò»£R´h Ü3NB$$;ŽdÀ‘M·Ó‚go¹PYžm¼3(#uQ›‚ô$cg&Uö887S/+Tútf¤>Bp‹œš\²@o ФÉ~$Þ7ôZ,¸µ3ê!¬>¨Ü•5†öëœfÌ¡/ÝîÞç`nîûí B¢É¶UÉ›ï›8ÂJ/ lXŽOóáz§hCu©eí´Š¬*= …ÍÇ^²Ž:¾?lyõ]&E=Nïª>0~jDŽÈ¥¥T¦·q¬³] -y)Å Ûø0A,Pâ zˆ°%Áh¦U¥q»è$}mÙcÌsX’G*ÝÕ÷ú£hqï9çÙŸÚ9'>F]ãæCUj;j“UÍz×÷~¼¦çÃÎAÉ‚³‚?¢¶8ç9ß8Ÿ™71( ¶ñm› kDjÐTêvʉ5,‰¤K Ùª “Þ,-˼…o饮héW~%ç!…  Ý°*€ßò`Â\óc­È)Ù˜é›íÉ̳~¼Ø ¶¹o0„Áü›ÕaWˆÒ Uª- »f̤£+_ÈÉI"­}¡Öç‰W”Ö2»æÒ–]]TõfÉù8ìZ¥•8•’z.êqEJ¾#vbB(:²%;ª­ⱘ Yá¨/òìóW ¿½°ª<©‘ ¶ Ý"8¡é[¾ýÞ~ýüùCا^LÝ{(îÒk»F:V‰˜¸#,­%DÎUa W)”`âÒ4ŒY5K‰hQÒì:G<›  ´¬Åj11¶#,ƒ‰mÓØÊ‡;•bý4¯×b{nó<-§Boýæ›õÃ~°Êçô"~OX¤á`e’ÃaHsº «t»T?™ŸÞkùž’§V6በ‡“OUñ„⦌“c'U¤…¤z¡÷h›pR{9$É…SõØõ¹ÚG ÎÕx¤)ÕOý÷Zì"5péi”o°]ùX‘ ˆ›‡G™°l›´ê56ÂÂHËpeG¡—î‰ ²à r?§jvÛ8p¤T4€[(0ŒÂؼÿjÙï©OEd¸‡ÜD×½›ZáHÛ±\G-CJ#0l—°hUAd1`QàÐÕl8ˆj65×Û°ko±½-Ù{.Ý´£â¶ugE¿¼ïó ÿØçÍï/ìŸþ¼®ÆÆXβC.,c“®ã›Æá@ Riá¥]}ƒMäÀMðŽŽÝ%šƒ¸É¨G ¨AÔJŒQœ¤o/ûy=“•[䉹@M¸;ìQž"¤5[KAœi_“ž Ó ä‚èMŸW>zëøõ Çõ™&{y—Ë8¢š•÷\tùh¶çuœÏªd2< T…´F*ÜÙ¦zNEfC¨«ÜÜ«e>Æwû\3[Q…‡iÍ5P$ u¸1†j ßó³±§¨‰3±Ÿ×O4¥‹›¦Ÿw/´KY¿ßþ~þËýýGûù4oN1f¥BÐÖ*'9#*Z]èé0W¢¶%ºu¡ç€ÿò½ŠµZ*TÛ¶<œŸì ¾û”ôxÆcƒe³4&Ò%ºè â±JŸ8}»uµë¼•)¼Ï …’QOãJí"¸-6ÁÖ4¨Èúô]"©Ê¬Ú«‘nuªÁPy¼µ–

2à†Z¥ 6QFCY^^Ž+)_ÉS Yµ?/®ø>­ä {D j xý ਗPÉ×ë r©dsâ…Hè¹íܺT:¡M„6¿8˜'yya†&2Ša?TùÍð…äSüH„ˆ}Œ‰ÖV¤ÏÁš…Û†UÆËïŒ ’‹ð=K™z¸œ¹CW²ífÍÖ¡3W(¥rvðAâºo`¯J«\ÎB­ÝáÑíÞ#ÎP϶ôŒ=g¿ãíæóºóÿú9ª#ïà­³_¾ִþíXîžÝÖæxgÏ\ÿøtŸœ’{9ÿxŸãªrt÷ᦌ‘:ÏŽKŠª†àuÁ˜¢îÑD@vqÔ?:­3}YëÅ\÷×t÷ã,Xög]™Mª˜éÀ‘Ð1f†!,ôêm欅X[Lá‘[S‘lfpeO‘VÜèòD )LF 7T<µ !¤½Xß²£ô¡'35;)_ï?™¯t½ÁœŒg÷<_vÿQ7÷¯Ñ·@ ¼-äbHiÈÑÂ…wZÃïzZúëÑ ÁÐ3´Ô‡\Fˆ„##Ž0\e!Ñ>BÆò)Œ©žÞOz‡'‘ ¦Æ<ꊥ‘–ÕÝ¥>-ç’žŠç¤ºN×Ùp¯U´fŒñ+yú^Y:=sööÝêœÀJ PDpúûñq¿ÿôxžÙœ¹O£z!4ƒjáèyæhèKè°oFuN)#I}˜NûŸ¸þÁÝGôW;ÌâÚ8ñÐèºy¿\¢OÓ¬5w^¶Ž%½j#†oÁ¢ %©¬äGÿÕþ›©ÿ‡Á.cX#iù‚›<°sÅp1äÉĘJ€ê ð&GìÙ$"@î᠂榦[^×v2®lω­ë$¯´îÐ<¨NhögÏõ¨µ4âïÿ´^øþyù¥}mgŸN:ù ¹Ud÷ĬÒk§ÛO VSÛ)î¾Yá"ëéë3…wY¬õ¼¥ìZ?ÐBÿÃåßøÁç~ö54š4\oÔ|`<Ó#àÓ¼71-«’B3ØŸ{¡évÅ ½FZÏ¥q^s=§Ò¸åñ÷¿üÎ+ë^ߺ}“¤½ûmýóüÏøÙTŽÅµËD²ãþá#ÎCz4Ξ‹ÀƒÞ£}ãIÅrža;®ñpk݈Ò@.F ŽyrÌÞÉ¡>W㉲¯ìwèç$÷U¿]ãðë9Çú®êÍOLew_?Þ‘ð]N±ZCôFpIPk ÝÑZ>!áŠÝÊä<Ÿ«ñHÖ9˜pI¾ž¾ª§-ÉÑÒZñ”Ö?Úüö5-˨Ež}Õù쎱¯»r\y<ÒÖ¹èó¦õÛâ½SæjŸ¶ÅT²øxÞéñÑ‹Ï\°4on-kBI­;Ò 6v«Ns(}QpѶÀ²n' y”ŸË?âR^ÆÊòåÎPnòÒ6è€TFx?¤Ån\öá‡E¯=JÂó±ÿ¤¶Y¶Qƒf4 “HvÓ˜>W¾¹yíú'ëñŸ›àÉTÙ__mo À˜ <Œ+LM´Ö'0’XËk¦¾M_[Þ»ü—ØÃ‹½ÎfWIËÄñB¯;ëayëñè×R“X]Ñ¡ûŒ0²]¨w¸¡¡Ô.(÷0œð³$¤ÀJGcÏ™èÄ¢Éð%ŸE¢C4­Ì‘ûÊš˜wW²ý)ö|ãz¿ÛKUŠ1ÿ±ã *°‰™p¯¬²*¯ÌøÀ]ü,o};ø!wà$÷­ÂÐX9€àGÂNkñ¤()¬:BhI{›ƒrjäÀ²ƒ%sSF–­—ÖØ¬:ÏTUKA†²#µÐC&I!ÊØ4ev¬–À»Œ€Š ` åÄ3^ KG$ÐM×¢c“®í‡ôš=þ²ÂªŠîñU6J’' KfÑ1Ý?í³ÿs»?oünqw` k0)bëµâKqŸ0›é6•qÝ€Ž…â<½dlJ*NS š‰P€`wS– u\±gå£ÊTÑŸ¸W¥o—ºîËÉßîÇîu8ë#ËüÌÞð­Á¡­‹`íW@s¯Û «á{:Y¬%àf\@D¥ïçnåûv§K/ÂþeB'ôÞÊ”ðDZ0Ϫ[áav-‡¢Öý‘ÖÅ8W·M×]¢A)>1[ 8X0gÖÕ“ÌÁ»²†¹Ï}®·1ß^ÈÅ3å:,ÖE1X~òÊÍ"ÎËVÍtO×`¥i‰õðYyUõ³è&㚟&[*¤v7.„Wº×´<;;ræøÜ™¼æ“WÓð Rt¢·{õ™ToóX™ßr9ˆî ¾äÒ×ëq}á‰f­¼GÎ;ºöÔÐá #Þ›ëÐLÏ×ìÚ3qmd=sȼËà,\µ[ø¸êͪ³`q´rêz¬m;}üoú\™z-6£Ã…ÚKÏ%‚Ì)ûYâ9%MLñC}·g¯ì™‰¶L#uKš…“q›’ë±ë΢fºp»ª+ùKÿöèÇãôß|¦Ô!²ÛÕ•)ý<9÷¯‰+¯dNÿR:ÖœqÔbpiIA1Ã8²ƒ3DVî”`ñÁºÞ¾!,$ÃÑ"‘Ó†èCi•Tó€8 cE›®?¢ÍRÌ.i'2ÄZ „# ÐCû½ÂÁO¹K9)fÚJÎ{äòת»IY̶¼¾K *䮥¦ÏtsfV²ƒ+ } ƒ¨ý¬‰ÖìM]üú¬,> H XÊ4ÈÝâu]ïÇÓŸ‚ƒFñ–¹p)˜É¡àHU…¯à©XWB!µˆˆ%8jŠBÔR´×,öK¨.¸Ä m² €¹e ÓêÁÀP(²Ì{‡/‰EêÕòè*FV©1¼ŒN¨*É©©ÐÒžŸ?Nßß3öVÚ(!Xr­l@Öc©&Ž0ŽÑÁ…± k½Ž•èV5‚*Y¥[@™z@Ž $Î@ÊZq±q&Ç5jNž™&oÍmþ-“[ g„C²„–ÓÉÐÄù_ÍñéìdúÜ}ÉSÜ«9Û°!b…QD­&Ó9ÒÐù î¶×‹ŠGcQ'sø‡¹ÞÑ9®gäÿóû¿î°3Æ!NÆ|@m|ÅÂN¤ät³,_”Wº}Óõlìë²ðøê¼ÝžÚ>ëCæ>=¿wÜ_.•Õåiã~*±öSy’õ päÃæyj9-J•7Þ¹³ªQ3§!Û‚Xå-£‰96²‰M£°‘`L€,ëíû=$“=ŸI ^N.‡}3/Ï÷ãv­óõÌþÒÈ|˜¯×¼“[˜l†ãÊÃÃ=#;ƒ+Ò>?Žî¾ö £æjÛ¦ë8‘{) Òk¼EE©?#…îÚ–N„1ÅdJ&ÖztŽµâ´—%~bಡy|s>”½à»b%ÅݨÁ³@ßÍ~¿Å·Ñ˜(&3ôP)z ¯»‡˜ÝGþqÙ°wö;œ=Ÿ‡kÿ^¾«2\Tš=WßÈ£â¡S ×)÷MœûT_’j†;£«&k-;%a;Zûõ}ž÷xHŒ¡ºBl¨oéêïaÖÕ–sì”/RP Ì–jÒr&]ßämêµ¶’ëïKýÝ¿UæŸä:”@!ж$*Rtá_í¯Ÿ? Ïß«þÖtíNR’uöaòH_ñ“+¼”„A$k P̳¸ý½û§î¡ !ùš\ÿéùG¤À æGµY*@HÌÅ*DÄ3¢0­o¨Z9ëúà$õÓÒ€‚½ªÿu ÿö`u[­Ó‘®êO©ëP-[æŽöý‹Å UæÈ=kòC§ùÒ5Ûº7ê–H¤8íÅiÀ/O*±ˆªSDúÎøº8œoÈ’(Ú<™&tÙÐú¿y\ìлžKÕ¯Dý—sç3¯O¢»ä ÒABbeOà—å¾ñè›u^¬rR|^9A—z­\ÍŠy }£±˜£×ËFtÍÈ0Úž;KgÈU¼b¸à*‹ýž—až‘J¯­ªº‰6¨J›v’Y?ÎÀ,,°@ðB®ÁF’eÁŠƒÌ®Ò^g§ÍÃ9öEÖ¬$Vsyp]TBÇÒ„¾.—°þnñ†¦³ûûÛ¼Ïs®Ð@Æ ´DA ¯–!9©ƒZÔ ÅIíÔ<Ž3âÄ;õ4 •³ívU@˜*Ãv¨'öÈ^ …^My2JBlhy¶óŠ~vèù#2çiD”Aë݉/ž(ŠLž-\«,iì~¿ã³ÎëM( ‚‘Ž.Ó0¦xŠ 4T«¼€{bÙc° ðb'à!‹Œ(î’‰U¥¾«—xݽá₺†™#µH¦o*K§xõ~)žËÛièóG]™žîR2‡ý1Ýûÿó§??á¿ù§Oú½ŒÛ8h‹]¬*q`….z6Ъ1Q%D XKƒVçõGȈ.¬JÒ$Ç4 ŸÀQKaµ¬I*ŠK”¥Î€K@Œ£T >3ÿbû|ðxÔ+4=_ã>j_â #ÚÓ±æ”8Šõm®ÒUò⪊Ëñ8ò¶*¢Oð€ †Ž ª€z•Ö–qq ^ÅÌ}@)0 f¬å@ž`aUO(ÙTÇM¬Û—ý9¾÷á½wWKÄ¡+Û>Ö±\¨ÀqR+€;úV%ÿ-Ìb*Á-[›"«z×¶jq`œ¡1»Ãÿé:OãN½ÖýÒÚÚ™%.ôw"”áºbz¶WvD®Í†Ç3í/UÜ‚á…g˲¼ÎTäÕáh¢:£iS~IúÍvàs/¥¬°•î÷´[3kaëIôc£®É/œklÑ ›ã¹e ¡L½<ÚTä×ÞKð†V$7j'Ý0x£°©áîñ¡ˆ\Ξ!Bƒ¸£ÐôG#½ô´'A”Ô\ÙÖGà¤c †Z,øB}»»Øú¨cD…ûøúá.»jþíkDy•ã4Ï„e 䀥qíeoK¨ñF£¶¼Ðuf˜j™ƒÓ?yâõd!oš¯ç‹M,Çfk;ôiçè`œª†ÔaW T߈Ú×óüÇ—üÓÝ«½ûaY‡¥#Ö8r­jªX7Y!Q;˹ƒ}ÏU-f‹+šá&,‚•Y¸Uà ð¤íöˆ‘TCÖÜÓ°t倧Q!-B5gw§»Ry‡õc³~GƒÊòó.zšÇèµüsÿæÕþWÿ2•WÀ/í϶vÏD‰€{on·]/›†p.1ÏÓ¬¤d˜´ž¾A…Ñ\W€{JƒH6 F¯™¤µ0Nën{3Ѐ£Á0°*6[9ÔF[& ³‹íD«k BËÒµ UˆZ?Þ ¼ íBÏ«L½®„Nf"'úQòÂý'ÆQ<ß§yN½’LÂdR1S›ŸùiP|MùÇËÊéS³’NHH´ˆ ŽÁ…‡QçêûÏ™áÒ'â–ÿ~Ÿ)HBBX]Ÿ)”9yBI„¢ eœú¥†ï.ÊÒ£­Ôî͸(ƒ¾ `8N<­LtËð©—8Áp8zhË0‘|4 ÑMK‚D§1,W—‰ut‹Ÿ¾(¹Dƒ ÷t£ÈS˜@m8­õú’>?f“‘Ï~üžïž}ø¾u>çlKkûÙ@’Ô9Ä:—aþå°/ôÍÁU%„už’jÃéK×ÏKÛo2ƒw|Lv¹žn /x†Ï€@ëhÛN·ÐhI”ÃËT©k aÏU¾…Fç(ö¥rÉ n¢¦yIhIyßWÞþìÌõÏfóDY[¥T­è¡=ºÏHƒ ô;!^âg Í¿?4YçcõIXgìsÍ+§Pí8Èj26âb:{Ã8…û…^šm-ñyý0œ¿6;EoJÏWË·;Ç8À£­q¦/éúȸÇгß7`yÓCï+÷uéýyõýRé·Î­SýóRñ ÅzÐÎu !ÊŠÎÉã*ªGÚªm¸ÉЮî+™ŠeEµ¯#†¦m @\!JÙ[,ÜÔâÜŠÓÑ®ƒûòñÆèEb;j<Ñ3ÔÚý¥a€õt¾?çê1¬L­ïÝðÞ¬||­znx=¬ç;ów®öÛá··šµðíõPÍ`¶QL{øÀ)_pѪgL@ ‹ªDyâÀ¨µÆ2éL/S­i7ô*Šmíó¢3M×Þ0(X"0ª ξä S`Ó†dÀŸíFx%@ ùÀ€Ÿ÷ù¸ÏÝÀ]p/þ2½Ë.Q˃ÞóèöÉvq?öÿ¼?ºxwrñyòlÞ¶ùÚ§|ã+l•ÈsÚ"«^W,OÆÞg0Ò‚‚Á°­ÉVÓD&„Á‹Zc5R'¦‡žÈㇸô[® ˜MÍ¿) ýs,b-S‰A»€J‘Ôƒ™†“:ݦ9™ÈMiu0ŸVÐ4·fá K\HÆ_qÉ.ƒ¶‚Ç:梶IËZžXGW^ÖîÆº›£{*XFñLF èšljkÃC+¬®Ä ƒ)vFDrž?{ùì®»l~æ}!®Â(D¨;NÇ´Æ61…ź‰ˆÃÅvŸótº<ßmtãpÜY~ùòáÅÜÁ¡§Å:WÔØÒ­}œ’e—aÃÒ“€*`‰7×aÖ|²}VcHÍÒ{1ßÇYb‡s_Íey>° g^–’s²’*)…†0R š Ô€•æ63ÅÒÌ uO·zb%ëZ³¤eFD"ŒÚµ†DµÏöä YøCk;/ïn8¢+ÚÆwö‰e½ÞÄÉìë¯vÚ;ÙþËÿú÷ËŸÿ×w³½fâ‚"†› +ijmðÑX³Æä{åú#BBHÁ”±zÚ!غ*s‘~WRh2²ãlŠ §irÉ£ý×'àù§«ñÜ%´­úÊÈd=¡>ÛÓá*ãJœ ãЕݘ'gpüûj Ôý¸ûmÙào4nÜú¶Œ»úåÛÎDé·<¼]“—·{“…Ä'¹áyþÑDõ–<Ø+uÑ£w#’Ü'H&.Øš`½w½+i׉ûª@ž™T¬I%Y8Ž7RTùŒŠ õéz0݆£ZBˆƒ:9mõ7ž¦& D©ÖZD•©E–*æÊ}è¶ÉÑy”È® î‹ét÷‰£rz¼°í„>3Ór¨)’-mdÄ®FE¢¢M+Œ¹Å¸yWyR¾T™M¬Ø 9 E"eÂm,7•5t¹#Á~b(hƒX#wAÛa€Yª­ÝqYC7iÂLø0ìpnb{àu<¾'M³O…¿e~¬Þ«À¥·Â‹rEdùºòâ§ž³5‰ÎEd‰ŒA pë<:$±@ ˜ŠV(¼žÄ±£Z}¨ý'‡Ïyf .'2¥_bNQ)÷~Ž·å$ŒžLt .*XñP ­Ðé[QÕQ EPQ’’@“3ƒÙ…£¹ƒª°¡’ònaúXŠP{ó=}w·çh—Ä$]Ú­^k¥½ïþÛ*|û\yÿfn»Owc¿xö¶¹¹{±³§/]= ìΪ#U&ó*<†³´l\cAq©(°‹¥ùÉŠ^´òÚØK°©OwÞüÛÏÙv”»5µ'Z ð-© á¬ÿê|}ïìhËÔmÂļù¥¶­5›[têp«|üíJ»…‰n˜×lúÕzØ:w}özz¸÷¸ÁÉqýçgãìNîoÕ½Q¦Æ:õ2O¯£½¡3¦"šÉ?úd›¯ðß.ZÑhastñyõ²j™*RB\ØûÄQÍ9Îî±{[äØìLQÃvv¦.ì¥â²£®̘Ýc²Ïð†…¢Ø†1Y<8;}Ïôz[[Ê\k|CŸsR½³öÙöEއkþóôl"Èqô,ô‹…Ão^•'Á!®'>ª³PÂmXñ+ëJÖ—ïoÇ™Šub€¸{@ä›Ò…íÿØÇëëù\MÎrÔb_!{ÃGFÖæ{(¡%‰n ]ì©Òv|6½*·*†š•”Ä>žo P’ºü0ê‚KÖVN¤­Ñf™á?ƒžöYüGFÑA!íªU90ÕÍNÀdH®²I§íÉù‡iôrüŽ:þÿß²î»9€¦uʵLÿAèíªg§{-8Ý]Ó ÀÀ2ÞWË…¶—\l‰³ Bgoc-°pѨÔ X r慎Í3ƒê¬^¡L÷­jŽO•8O³Ì´t·¶.]|¨¿® G,*kv}t6õ\Ø~zçbÆýî<»DßU_c/÷ÛÐñnÁÕˆÓ܇5Ø©çb2Í”ÞÕŽc/ûz¼Ë´¤¥¨î|Tú—V×î¯/Ÿ±|È#¬™ æAÁHPSc ©l¶`9L7^hb´ÀX\åóDàE#yçI˜Ã*`)xDXŠìê ù ÍŽÜaÔ—«JÇöµ¶%^˰!Fà1ân!·e»X“ ¹ÁoŸäëÐ:IïÜh7xÑÛfYRV‹‚‡àØåÆ;+²õ”¿ß ²éçdD l§sN&´ß€‘§‚ËЕœJ÷÷’D¤X‚¡ ÉTLÂ÷l8FIs&‹çø®à»lâ˜Xi(ï´|ÃýWnžæ¾w¥5ÊÃ÷¡ËH¶‚ù«õ<ÜX@¶×YËçÇ5Ì:@jWYýM ¤ª ÓLŽöFÈ ÜÃ8ô^»œö±nÅ,·0£”3‹þ_ÒÚ/[“{õB4RHÓñ€Hõ8×ýU9›5¥!Šš’e[f ˜{bÌ$ ¸¸võíu=[&Ï£o TÕÏX?:~o@åL¶ú{¨Ÿ:úAÞºnéZ“XŒðÔ2ŽŸl–”>“>bš°,êÂB 1 Ñ£æOþý“Mwœm}|+œh:ÖöÚ},ýôÌL!ÊóZ}/F¶¼Rí[ij02*÷ 7K¢ب›Ub3¬_¾ ~).uü‰§måMcœT~é©ÚOídIÏÜ‘²…ÄYWâTÓ=Ù?»Ñ‰8®£(^š¼vú‘ÂÅåÈYmTi‘ƒú1h,-MI±¹a¥¢Íei±Ø¾LV]nH\ƒˆ½à6»v©Ù‡6?ûÖZÞq²`é~FlRÓŒÖqâZ/§®’!ûõs}ð;Ÿ¯'ßLê6Êk•³×›…ð‚¬À@Ç¥¾Uë ƒ/m 8UM¡ƒ¶ŠÚòñjZÈx°´"0[\_¶ŸØ_RgÅxŽ< ¤Â#wY#fטd9¬8b·|Rk+M3F± ^VtÕïO›Üﯘõº!²Z¯èéÒ*3R¶ç&×)ïçR ÓØ0âBþ¦æf%ÒÎÄ6ņð;^+ñ ÉÂRÁª^‡Q8VïÊ80„C”%Caà ÀÌd&\æB‰@«›SxŠ«€,QEœÅ°•´#&áÉYÎ"Mìš×g¿7[>|ˆEI¾3O^]Ï3‘fÕfçÄ5¦¢Ì‡@­JT”Ãd¡@ RJ-é qG9H) !Z'öȪ@±Fð±š(¾]ý´{{´I~º|¿ÍÞWqõJ¦‚-d%)JŠB„"€5ëy;yìõãÇ{¾Lžì“&^Ç©N*1 e,dV–‹€H@þ´23S(·…ö¨GJâ 7åO¦péÔÅúôs nNÅ{ngn S 1ïß8I–°®øgtúq÷žH’êÛ¢2„R°ú<òÑk»ün}~ª¥§[ÖͶì[Dk›> |ì‚Tˆzd g‘ˆI`À˜VphË´ŠÖo‰Òø=äþ`¸Ï%­!œAÈB$ˆM–K?¸æT´raÛÞÖ " Y‰·üfÓNoámþ»e(çr­ iPV7Ô~™çßñWXùL7©Û€áBKZn䂼_0ÙP¯Sžáž~Î̶g•RØ„–!T j`IåЊÌC3ÏûéXj=VÍ ­P¡GŒ WŽP1¼)¥qóN®úÃK€uºØOb5WÛílrÎõœÇ†×RqÍ2_÷¿ÛøúÉÙÆO)çy…hˆ èbŠ„Áªš 1¹Ž@Q»M ׵΋õ"‚•ª0&YÌ’á1ÙÔ²Ë6U™/ mÇL×°uC\mü®¿¯ÇÝŒ¼l”¦Ë[ï=ÍÖçõ/ÈcöuâP]€ð’¸äÿÍùà×ê^Ûì¡¥Åòa}ŽÙ¿þp`¶Ô5¯l1Þ”páš´}'48!»öŽÔÕÙÅC°ªX3¦¢_Â'½Fsÿ»©þjic 5ÁY;zжEæa3s‹~ð½—°½;FgVPAßÉýT®ßYûiúþ€î½ÉÚîÃȼýÃç¸çNAºÉ*3ç$\J¬££‘Ëxš ÒpA‹P}"G­ßêíï~í|òìxˆ„V!Hd6"éãv‚¯]zþã÷ßö/b¼÷¾¿r|<úé|òÂ¹ÆæÛŸh<…øöK•|GÊ.5ªÛ¸¡~B(«!š•}o^jœ{Ž··ª>* îùõãkóþkzˆÀç³ÎoÛGZ'öKˆü+TúÚÚ¯lÞ€ŽsÏš[Û§™ÆnMÉOiCä†ÕíÖ1;ÍÞqtƒwixöô7+ØêÞ9󮯰f ”‚ZÃm>Â6±öö¼3Ù?IæžWÏÛ¯áf§#Î$¶os]N+3ò)÷g¿±ìÑÀÌmMžüã·×ã}Æ^xôd`ÀhϦö‰v‹ÌðÆc ì× Æ®•¯s·’>$#ËÿòÔ¨¤óõu¬¿œÂþé>óÜzjc3Ü ‹×ôø×ŸtgâýY?|4‰æ÷,Œ Þ«I–ª†ÿ´þKåƒ[¡fô1†ÃŒø¥µ[Ùèé1'EP5½* ºœ¬\Nô]!Äßa"‹¥—jˆpH€¡$ '‰0² ?ÿ¹ôç7²¾ºky/Ñ úŒ’"6µ&P—Ðô›5Dø(ì/bŸÖDÐ VÒl¯2Ý87-[Ùn§ãÁFwãòý½µ¦­Ô< m_죱aì—qQN‘s¯{蛞˯ ¶w¢'šTÆ  Š}×·~þµéxÌó¹ÒuÐ>ÛQ¡±V€£ÕJ ©¼ÎÖÛ°äJ%Veêç<œ.iSuÍsYÞ°>®¹wòæÇ›Ô¼¯qbæj_V÷‡—GïõöŸÂìM9ÇèXZÒ•:¡9ÚÌÊâz=Fb0m÷8:φÚÞˆ¨ÌOØGÀ¦œZh !BCXh)ЊJ(aS‰[¹ Š3I±X!Cç Ž m*ìt}u-\&[¾ˆ ˜^G{ʼt^ežò}E3ÑÄ$-iÏ«oó‡9«¸â3ùbÌPiRë¸ï±î›uXS—^3Ðg4þç)ì¦Ì|ç§$FÃí Ïßa}ò¶Ï˜¥š7ým(¢N¬´'+EqIÆ¡ÁLƒ»Ï KWÙlY›útz]—¦äÑx>úÏþ\<þˆx `‚Ý:ò ŸžåÐeXÍ*Hù H’X¸CÂdËEeÒûNÜ6}Ï%èp&W§#Õp´ 4ÐlÃŒg×<7Sy­Å[9xc61lF„ÙÆ×IÉõbî”Ó èžHDov¡×†õ -ãutt¾­»ýãÏŸë»{it-þÍ´æL,"ì¡ÈˆÌ/ý…_¿Îž„gU9žžóm³œé§D3z2·M+]|C÷/až¹wë°B1¡Ñ[IÃy~¼¹Çײr²š«Û7IÕº* (!×s,¨xÖj WŠ/ÔãS €¹cšŽœ+HÕÑ*•†Umi ìI?ÝïmOÍ{M;œt¦v¦Nur\&õž ,¡)põ^¥W8ÑhW½”Æzûä‚+Q¼âÈÈ©Ù@YäåÈóa eivÏäÕõjÓm>[¥ÖC¯\0+äEç?’iþÎ7¯¾Ô­—ZµÐ\3ÙD‡ùZ£ç`!7ˆ€Ô»è 7€Õ¾|¦ªý–ÎR*Mõyt×çÄIí`d…XÔcüãú“W<^©ÖÒ·&¬ˆõÙPÖYw™²mÔ75eñDUÍÑÒ©Lû~Sç¬j3ílž™Ï,4V!GÑ.-„¶•ŠT|ºÞé|¶ôy)Ôà÷ë—_óÏ…7X+5:ºû\sL`ÊR›ö2h½ú(õþr¾“ÝRÑ2rB4jÇ— P°‘oÔ´2WnáiˆîÍTaÜ=8‹‘–©”CB’nh‡grb.ˆc‘¢6Õš(]D‡ÔTÎ¥°”V{#`9°XeìK`âäxôv_~@]Žß5ÐlÉË¿gôá½çõêIéu¦D¡ûØèÔŠkýPX|¤hlE¹ N"4Έî¢±K3¸ò'ëxþ,õ[k¸ÓU†Š$3Ý‘;½OëyË¢ö‘ï›sýn½(ù5ûj~ª®n‹Gf`7?žúú6ÐKø$,Q"И+Štà<)½)¸-Q·Æe2€úbýþòå£|+Ôã&¦´幫B¦sª ¹…Úñšq?Êñ¯–&3ºÐu²zÕ4©¶…cÅ!&€–1ZêXRRîú¾†&ÏÖf¬0q 6q$ˆÐ¼àõÎ%>̃ÆÑìûáâ+úÉÉä³' 6ÐÆú_ª¦Û’1îçAìêpp©×;å2’‘'‰œËìP}·{²jj ´¦Øw7éÙÚÓ±¨{Ž;Ïú"ŠÞ17äê 4Ê:*³A˜—!ŽK<¶^PJ0wp^z>±oV8Ï#{–Ú;Ò nÀÇ䯕_æ}ÿru9î¿sé m½Éö ·™E®]¢Ö»Ÿâ«´ýi]›Ñ»½ÿÅý1k[nµ#ÂT+Ö‰ô<}A…NUÝu@¯Ì£÷0²Ÿƒ1õÐÖÖŠJK“+yÅ(—%,A D$l„ ¬H¥HI–є‰+´Ò&ÌЩ€ë2/σ¦‚>Y«XM¯ÉžøÏ[Pç²dŸx¡à§ð,€áY\þÁëŸÜýuþè~¨Cõ¬½Axþ½RR‚w€3Lއ« FÇÝ@ O; †‚U!Ô°ÐXdÀ1²Ë›¼^¶áOô¶Û‡†,Ú8leRþ­Ëv.¿tŒ‹‹ÒE($Ê¡Ÿ)böðt,÷°°¾kæI8¶JOb…}&k¹õhêÜõ²7óå;ÛùÏc£®fÅbìOÖG|Õl‹â¶ž~}ðXïÃKÕnY`Û´’5êm ²¨uúáƒh FÓ^Á¶œŒ½PÝ«žŠ±5Ñ­[;Û%EûcmxjWJÑgãtªj䔇]«'5K~}‹?Œ£ú}šp+î©éŒúj(øÆ8ZiøðM ÀjfVpå#`*gujv«Mˆ"ãJ3–•kåÉNøƒj! DÚ(p 9Ù¯<Æq iMJ•gE›@ …`HÎâïu¿ßê7ƒßGœªI2ê}äñsžëI®§tÛÚÛT›äÕûHnÁ*°Èôjï»åŒCL} :$‘}²NÑh SÈŠiÞ¬þ•§ä+Õ›'‡ø8Ö–^µL}ž«‡SœCŸ½Qõ¤ÆŠz#¨jN"6\éô{¾dðW¡e…®ÕŸ¿Î××àÌ%U»²È­)b%åº0ÚY"1À÷×ãWrå<\òE &¼`wª<Ë=+®tLM_8…aI ̲pT;ÒûO9ÞP=õuK;3æN'Ä’]Š‹çDkY³¥¥éU 庙5…ZiD¸#m4Ä@v1LfʾM—Úס>æxïkgV~>ócIZeeðîq^ÇÂÀb'àáûÖÑÐÃ}ÖÊ9ᚥ£—²ÊÅEZÃ\(£‹†©"3Ø;?=Ÿ÷ûk2ÏÆQh6e*˜R^£Ù¿Z{¨åçÌ6Ë \pF,1nô¸[®ØúÊÛÎv”|ñùZi10‚¢R¤íU;2Ó•ù"Ñã4w_íÃ|ÙÙq'cî)ÓCïf)Šæ»‰ì¼ŸÕ·8ðÉÒ„í®/T»0í(ÇêWÚýj§¶1´@*ɽw@–êĈ…:ÖFdL¨lÇ(¸ O¨ªÑÝj¦µ"11³ò²h;ŽØ† `¼Ìf K¢˜@HHöãë#."E§u¯g»{£0$ˆÉ‡ÕJ'ýxíuÉ;GÚÌ\±»,ÅÛȪNµf-R –ªA­ËËŠ‘®rÕÌô­èI1Ò€-K "¨'ÅõüäÏ?=þs/¿_÷ÞÞ­ÕL•“=݉H PT )hа+\íÂ_soƒþµ©÷¡|ÍÀQ½»ogðêÎN5ºkò*Q[÷¶ÍlœÁ+’OŠ o[|¥‚{È鯤êy•ð»ø"»Ítfï³£™S-˜H!"Ó• £HD烊½z¼ «ò´ÛÎîw~Ùo—º«ñÆ’ò1m|o ƒOCäVº÷¦ëŽe€·çÝ”Ì"Rß×})p½ý`=UAŒ_ÎÆa¹×ïu&©oô­Ÿ×Áôðü°Ï~º.¶#b¬5P·øÎoRB!% ‚Ëv:DT¦‹Å¢sö~ Êcóµ®¹½_Õ®BªÒ“#uò\úr› ­!hƒÔ¥ÅG ¬x¶Íâª7]¾$bq‹IG“Ah\ P€¨’IÒ‘ Øà^À‹+YÂ$I²6 jÇîÓ輄‡“øzPªù²X ʺ×ýdâæaû£õ·RKª*n²‚†ý¸÷☴(~T?šºÏ¸š:ƒ: !6®‚[5—c•5ñ¢ú*”‘9æg±D‰N¯2ùÆ:Á¸Ëê0#$›¶còTÞZÆe\¢¾!46QH… ;`o¤cѲ⨠iðë2ÛÛFx¬‚÷h-‰´5 -Ç6%ç°ºY•HLà "2qñe .pﺃ3¿ÏËëøÒ™ŽO­—ÑÒ,8¶]_Ôæ+1‰&ù±ÈSç^,KÇ|Þq¶Uš‰š œšêQM5òõlÍ‹Žº¨ëN…À•3º&\Ús=¶)Lïs—9ºÞ¯ùbŠ\‡ËWh¬ÆAÜD«"á¢oÀ2–´EEâ¥ù´t¿ r?-8Þµ©H‚$v&¨ä]°¸j <æGLXw&î¨ôéž•’j¸DEÍÎ`½]v6 æ×;¯E<Ÿ(LÆb¼ ëwg?%]<>‹d-I?8³±°?¶üÑãöYš$è;À†!N$¶X`ƃ)Ã.¤¹±ñQ~-å©Þp/£åŸÛóãÜÒ/Ü#k¥òö”š&g®è~)¤lÂ]ëX7„ ˜!¦"—ÜbwCå”<Z,Qd|®3ÕMáéÞÓþ”÷J4¬¸„¸jî5ï½ëŒŽ½Ÿ©¤Ú žÍèõDŸíÇ‹Hd“¦R絹ВtF;¶î>åà‰™!Z¸}9ô«xûÞÓ]Tª(š£¿æÃxÖ ´UCÏŸŽ?ŸŸÏ¿v;³ôzR ÂTŽpq!ql¥àÊ8DRÖ«ÖâŇÃ2…LøÀM¤®²é’g ©)u'Vö„¨*¶h¼¸`sUÍ$TÎ/»’µ¨Êså{Ÿ¢ôÉØå*£·ƒ©¨í+_´6Céžê[õ%#ÛÃØ©ÔªXw7ì¬x¨°ZañÀ¶€ *8ãjF ÝŽÑ %jǧ­AØÐæ(¡JØðPõã¦j(ŽX{ BPc¬q„;Û’XY—ñØŽðU7™¾+ØuG€D   õ£rѽ­ê®úõÒõÍ~†ë_Þ÷¿úåýš®yÓá aWΪlÜ5qŸZamž\ó˜fŠ^y:1`µÂÛù2'*óY¦­ EÏ^Ç?×ÌÛbË~™1¤ÂLg¿©¹FÁT“;éë×Ëü´¶YÊÐ{XXÚ†am/yIŒ–:TË8–̂ڵØJZFê-~Aí%ƒ C3¡ °`¥xCz WÑÛÃgÖV®°@Sd ‰-uÆ~G®<‹D$¹V-–Óåv5E:~ñwüo?‹,å÷lýÁß~²Ú5šs>¶ÌzXx¶ÙÓGÅé¾ùE‚ˆc³Œý´Koêù1xÅÒ¸8ІÌ Õì¨[‹@ÖJ¥ç'ÙïF§­³ýÆë^Ó¾ŽÏZ¨‘r¶ËT¹”JÛu\ Ý©£(ØŸnœé N/`ˆJ¹H!3SK4°i6£x$—«r"[h0!ÁñVÜ0HÊê‡Ô!ÇŽUü5ðßÿ‹1«L;Mó×­?²¨6v¤Þ;÷ÃÄÈ CªˆÔ±øÙä¢F3Óh˜=õ>ká"ÑPèEÇsŒ ûr‚€à±ÖÈW!Bgï>™ …á–‰GvARxÛÍl¬u†Ûh6‘å%Uš(O 4Õ Ó,å.S=À=²›ž€7kÕõ>*湌åòuüôÉï9Zjúõç§+ï{ Ì^:•^&‡3\"K‘ÓʺÊ"G™¥:¦º«˜ã!ó-ò/Öøê#GP!ö¶~W˜Ò~UÈÐæÊçÜ®wó݈´°‘$N‚†Ðk›´I]¬°HJ&KªX!ªTætMñº­Û²50À Èªš0¿ŽSÐ` 1|Üá0QàÅNR„þ@‘¿¥Í—ë𘠸›}ïe5>C½3~hýöyÏ8MhŸÙK4Æš¹ 5ĨÙH’´›‚–µ"Ϥ./DÞL~šÞMUoe˯Å|.ôS™[óU¹K¿øöøË'_ÙÞ‹1ÙȦT‘4ÑQº$@6©4Ø•C^ˆ!}[ÖÅüô´£ó°Soõ¢XµÞïï‰#5ý³ýêŒøìóÈÙ; Ôêt‚L̘`Ž!>1f7ûã¥3·9¶+[RvЖÍ,Åa4c#Ä( $NíŒQáMúØCÖ,|³§Ê+ìÐæÌïi“ói£Ü¼#r晩ö!‡j°¨.lÛßÉ–n1Ì tô“±[6%mtKàöõ܇ëÛú×þ\2ÅÙ/ØááÃ[½bèÐÚôWúÙáÛ÷ÇgÕCž+BÏ›˜;—ô³¬9úâ§ãí¯Ð^<‚Žé;A·âz<¬è®ƒô¶Æ¯ÞñXÌ…Põ,ÀÇìh0&°uþW-&Té_t÷}—Û㥽j{Á†­fÓŠ“SgöVEÀáIyÕåãºý“Sãÿ·i¶Zf nX6_jó¶Ù?¶’ÇâŒx¹h'ò6 'R{{7ø‹Íf²Í¸fIÌlÞæE•êÁ ÕÉH÷x]Mg åH€;t´Ek¡q¼š°°ëè1³\}Š6à\Y2`ƒT‡´£^îs»©Û=ä Ö”«Ÿ=‘4Ýø˜÷wxç¹²Z>Ì(JÅÅ͉Œy‘¶2#i¨!2Ž‹5ЦÝRX.1K°.ÁŒÏ;PÈtž=±Õ\]ñx¨½¶´ÌgLiÅ=x¯r¶A_‚Ö¸}~;t¦¿Ž C*…ß+(gñ,¯Q¥={Ül²Î\XÅBLj&‚AÔ]•ÔˆY#\.l ã2jI%îgÈ2…s»»Ý2©aI?)¤O÷C Üw6Ÿø·Dàx'÷­ù|9ÜÊøRÿUþ“¼•š©v5²è B¬éÝ8È}oá³AçBícÀ‚“ßTc­ËŸ_úq¸÷2AµFj¶LU)ËüðSW‰V&¨gÌ%;seÍù:kAuC‡ÿfîMÑvnbU¤½—É/‡ãkêa³PÎO{²á_å¢$h8“€ Ñl@a"Íœ–耄JM¬:*•á’1šˆ(Çv[[ì Z]{‰oæ£á Ú:}¶G:ß/9ŠYˆC;Béçò;Ž:ü ¯ÆP^ÐÕí#GÔ Zcüw ë4;}ãvÖ¤osŸËÓÍìSµš ãÜö÷C>Ø*i/S«þô[of.¾Ü·¬§ÎÇb¶T¯Vªj¤‘³:ÈlÆç£\£h  Výp=ïŠ_Öã-õRÝÛºõ,uháÝ©¤S’eúÙ¬çíU.v©dfmžLW sá}hWxÛ:ÓÖr1‰‹?já/fö8æÊª®–ªÂ¦jÆ®éHˆJ™5ç‰f5CET›6Ôµu|jØ´f¿•ûؘÙçLJ-ÊF5tÜ£VW!—Ô²RÓiò­m‡õ4æ‚6M¬’TaHÌÐY}ë31<¾Îz¹V^mnôVed˜3øuþdÖA ‚0SŒ—ì–1å¿|4Š‘² D÷L!z€%(v†U©f«ÙÒ(ÁæŸÚßÝI{,8’+ Ç0eRœ1ÇUéJ–B†ÓtÚu£UÆVTeˆyÑŒ^ u—UYiå®É¾wM+’ˆÂ4M#pͳ§A÷ë»÷§]uɰ”gº?Ðk®C b7r_z.4ÄwËÉBi¨ÅR\™²(ûùŽŸÇìÊ®b?§‹œ»' ¦…¬WÛàb/]:Naµ×ò¼±øJÊ|Ù_ÒEß8aVÌÌ0Å‘èa‡22$±ËÐÐäV]ŸŽ6qݮݴê¡#wO:`KGÕ«ÐYr¹Q:¾g‹ñv½%Ö+®|Íà )YÕÉæÌf®ù©àʯ2AhÎBÓ‰0©ìG’"‘D$™œ×ü/ýÒ{CºÜ¬xû½_ÿe»þ£ »k[_w.Éž¤‚½¤‘*2+ê£W©3¥Þ#˜Xâ—œ†ó>ÀŠcR%¶¶¥"€:kDøqÁÝk„÷sÃApMRÌá¼r;§x%|Üë™Î—…`7Y§?ý¤þr\â~n_g••õïkÐÖÚÜR-*´P‘õ¡ËáÔýLNÊ“Åuꬳø Ô©Àg§l³lÌ÷"j¯ŸQUàË'>òýçq’À¬Ï¼\TïœëdÑXÊ“ê‰_% 2VS U3iˆÖ6Z;µ6)»^&ó¤º^6ÚUl£>çtg˜™¿ØÉ»\!=‘" ÙB7èBF‚°"âŒÀz—•¨¢Jˆ’@¬1\±ÁàY¨Vg”æ=COÏúÌ`Ît>Ù *ó¿xãé³E¯Aâm –´+t˜FþÈ~커'P ˜‚ûŒÙ¾±eHõŠÒòØí´’–¨ÈOFsñz0”ûtȵ"¨*:ð:±¨Xz($.0°Ç0ëHÝ”¦ê¥½Ðürè i¸¯B‘ÑâÔm9%¨B…¤@¡éÊ׎}`‹¹è&] U©Ò8´## ¥¢¯ÌŠ´àTq”Y9µ¨Ã—r’,¨ˆÔQë&«£™ š£ÌÞ û“Õ²A2Eí`Ê8†±±i ·áÒÂpQp·t[æ’\ëy}·½-Y+L@®¨]!¶Ë”bêÚôléM†#iQá[´€›¤r kèµá‹1ëxôžì*ÖnŸ~œ¾â÷èÏ ¿¾Ñ×Ê9:?à[:ìýÁ˾Â~½~ïƒ÷s«[ð Ý“S0L}N.Ô 6¤éà]ˆµÆ)Q±†öJÚÖAN7£}²Pì0 ÀÞ×ÒŸPk®Qɼcd£‚"÷ª¢­á ËBô¬3¾^äTŽñk«HÝþZ™ˆîñîsÐŒGJ•Þ¹VÜü$5r;!/] …Æ }ºÛ9³û§æ‹ËXc0nJ=^á# ›@˜p½~#7~’뢢¨ZóXnbfR¶E.g¨×C# цèàw)÷!Wôz´ØªIwdû çpŸüzÆLóLê‘éº& *ÄTo²šë†a0š3b,ÑépþÉîÕª:´¾³ßF&®6¤“eŽJÓ'òš¹ŽNt°#-¥¢-ž”Š+C†©î¶ÒJ®¿¸ÐÅ•À10“ÊËu©dñÛ|üüL^¦cáþ›½?†”þ<ëœd«$—vVûÏ×±ÿpÎ7‰ !ƒŠ°’E„°o™7;ŠÄ-ì›­´ÍNà>öµmGÛP £V½ï¾¹ž™Çײf2®‹*ÇŽÖ†bj 01Šr ¤‘Ý@…¬$Â¥™*ažžk³_oÕÿ÷š?žfù.ëKD,aý<¦»WìÛ@ò/Ow—%pƒ±«)¢Sr¸–]™¨êŸ,¾»Ž÷ªŽK©é‘qî®ûŠ^"nN„t]ÄŠì¾Sz®WSµø8…Ó5Góusí¬²»h¥:ñG­b¬TÚRîa‰­òlot<çp†—aËÇX¦!”Ã-TŠ•°‚à§ ô ômÝÍÒÀ*¡T¤f¯ºûÔV­#‚ o’¸Õmü;ç¡Ç“ëG[áòÄß-Dßù®½û1šÇSN„z¯ë³åYìTl€W |j|0¸æ^Ëø‹3º«†!­ ®-µÞ|‰íáÞxÉ€üéBj¸â¬€üeæ£9ÌùŒóöõü©É&Å_ÇÚìôèÐ× µPG*»A ªÁà'Üß:ÿuÕ›)rƒIú°\Й‰|†( H¨m±‘XbMÙ¶\¿‘÷;Œ.êåÕéç$¡þ €?†k¤—QÙTü{fûüú*1Xåú-céE¯É´ïßˉÊ?*úyÙ|û p¯ÝÜtî3·¸Èeâ%02lMhíR†ÜÕpV£­sÓ}@7󛼉Ã+Í$hŠÚÖ­HDn÷~üÜôÍ8lXS"bÄÁ¾o–k±kìþ üÎg…­º:yþ#>véÎ3G²«>«LÐö¾_þÙ«Aöñ|äÌÕ—·ööÉŠÉüÐ÷¯C ^ø?)±½«gö6îUYŠóçÜú2õþ¼ÐºlѤ;Ûãó1½-#Ðâ=±}Uůdþ¥×TEn6`ýê_ß%?ü®ís¼ÚéÖªÌ3­ž0o`»wõ‡OóyRµ^ý¬ÏÀØö7¤Ã6,Sm–-Žôû?¬˜'}or·æ ,ÇV*üÕ ‹UŒÃœp. ™¶u9#Ðî¶µOÓÇxöÃáÆËÓZjž×,ÕOôÆÚÙútkÒ׫fsÜïeŠ'G7vb„€”ì£Ó.ò)O7§—Œ@ØSýŒwöU~öeøc|ówÿúáóeõ‡/_û£ãsˆ>¹‰ä p;úxLÊø+áM& .8è/ŽgOÿç£oßÐÊç?½µöñA¾ˆ_·ÝêGÁ?6ŽÂm=|KŸÓÍšÝòà`wé*OðÂÔ4?ÿ«#}«´yñÿõ– Ÿ•"3pšåvÉ×±cFôZMÌÜçs*¾J9<ˆ+ï.6 H‹V„úúSV0‡“Ôe:à)‘¡KtrL$»2­îAÛÝ5bט¹]±³*T6yƒ=ø¨æ\ž Wv€ÖeYÄ‘Ûn’]¤<-_Y_¹¾sõ¼´W#g1êó_æñè¹{dl˜XêF“5ýÕ·:^÷ÁvzJ`¤åf¬4Ì'Áê¿ DݯeoÛ±\z…½dʼnÍ*òD(ŒዱQ–Ú%¯Ze v.\æ:ÔæèÇù/BýeÏÇÞŸeÞ²?ºókÓd4Œbí†äùŽÞž1×—·Çéó=ãT¯i‘Õ™• 4·‘Ôû,þøª³Ä‚?Í‹&<0³rÅðî¯!i(t>Ka¯B Ä¼RmuÜx†ív6½ úñ–&qBgÜÀ}¿ù`ÆÈ«zÁñíÉ­žÍ[÷Iûÿ`æ}·ß5wÓž\ŸüðkYøGýÝI‘@ °ƒ;P Å}Ó}¥®¡¹kÀ\ƒ8v`P3霻[ØÝ¥çÿ¯¼½¯™ßƒl‹B{LÞ<¶+ÀUÏæ -Fgóvïšo¼ûô‹/…Ü Ûº/-ø)Ao*ótwÜ»°Ì¯#š¯Éen&3ú|êþ ]!ÎÃfÛ2`¤¡ÃOêJ;%l<)»q³Aÿèx<¶¼× KNó@†8rŒï-OR·Þëéõë†ÜY*¶yß­Ó¡ÙÙ:}°9ÎiŒˆ«’–}aç§}½6»N¦™C¡G”Ô·;L&âvxTvó_–^-<ß{ñ3~Öó³/åÞ‡þúð-ñÕ÷ïúú©Ÿ´‹AmY,4+®RA!ZD¢ëz¢^‰ìQhF6Á]Š,ÇÕõNã¹_õoû¼6ÆŽêlÍD!b«K â£õë”_oöWrp½ý(ßÍšºoµ8õôúëpR_‡gÙ–ÖŒ¡P$`ŽS}{çéºþ|bߟŸåø¹xh¦îú"µ*¼•ä€Om†——NpYðÕ›­áÒ’é~¨³¶–½¯‹ûªQâôëo³ÿ\Ï>ªŠ9”A6ôGWªÊ˜®8·.¾&›®KÍ+|óYpçuZ%)f¤1tVÓKÛ.áó˜Ì•ZˆK•hó Øò*K¨Ÿaç¤mw  y%Õt&³p¹8.ª°nÙUß:+ÅwÚ(ý°‰PÄY[@(]ŠÎ±1NFkSåA ]˜/ðçúmäsO÷kþªHÂ^d\ôˆA§o߻ڟÓZË.Ëî^²— %c—żŒE„ܬ·Ï=]’W¨°‡Æ§Ý½4ÌBc”YMé.ŒX^ªá½Q!ˆlTjirižOî½SrvüpdæúBÌ®WZ+¶í‰Ž9—§ê}8"ªµðµ¸îÓ5\h ™HqR˜TœE¦ÛÕàfˈý(öÐU*G—¢„и*M‡ðWÎ'È*¾¾eòù)úHØ÷¡‹­½¶â÷4ó¾oye %¿N®;›Ÿ‹CÎT5Þ9ƒ«Ý¦#eýØ9–ªuªôu-O—'ñ9Ù£|-(½VƒÇ ¶+ÞࢨÕgf¯«ÛuÏÇ/ßã{Â&yŽŸë•Fè©H¨Íe9‰÷ò“ó™~µ/pö:Ãsn{–Þ”qXÀˆTGÔÈ(Œ´„)h0Lé€ÃƒRhã­í¯i6ZÞ`Î;SD (FŸ.^æ¡«q´Ô3{¹Z鉸d烅eðJÖ’x’ñËïUºqF— yÖÏÙm–[—Ú ¢˜ØØÚŠ=_|9|±Åóx/xƒ ¨X˜Á"÷X uæô]|ÝkõÝË~žæ^´[ng?-ynu&¶_©ÓêÌî§;õoìTSÏu€õûÎYVžÃRœ!Re½åWÍço’!t˜„]JI»’âk\PKKÏLãÒ#™Õ¼THËœêäH¨f©)ë}rP°6 Ôˆ!F\È-«¶‚R´VA´XÂ^øÅLDÜÎÐ÷’Š+M¡A”6¯èã°ºZ¥ æõeQÂÙ\ëïf€Í _ô}áîK\õÓèvKsÉ¿Îf²±}Ót„bV‘ mú¡•/Y‚½z€ÅDl%)¹éw|²Ý ìIhieWf˜3Mz$)ðÊ"É ØðÒ]Á¸¡k{Ø -Ô‘HÓ=®uIÉ*"åýT>3IÖj¦ÇæŒ&AdA)Dpx_x¬YfQk’·½^Ã))ch«XL“U“ŠÖ²°¥Ù>S‰mƒU)•Ïq'àÔà,?SãN`<^ÁÚð öå{GH¦ì8Ÿ4@šgúZaóºÉMÒm4”ÈPh›c8^dbB­®œkJ›;ÝVßж¸š!9På²RAÂÁ`G’\î•ãÇ9pt¢¿­ìI (w×ðÀAp ‚†ñ ½WÖú´ÑÌšÕ3ÎKâ£ÿ|;„ƒË:”i„ClªÁU†4÷#µ£Ç¹õ —¤üå¼?S=¶‡GúGËë8tçÖêJ-èÉ©ÓqƹOY²Z ‘ÿðÔ·W®t¥ºL#˜eŒõd‚ '_ùräPkƒô’^p̱iVpä·ù <ÐB×3c$"‰° ÛÐD„XVM¾ÛhËE‰%QKM n»DN^)·äM€¥ÙÛ¹Õ1õ'…[%—Úáà^ûiôçF¬[<äœo|únU²åºÓ{£[³ >çóV>¥»!+Àña^ï`b„ªD+ÔsìbK`hŽ>ï_‹]îe˜vøBZ²åäyfUJÀ7˜\¼Ã=(0®Úf.ø§¹OF¡n€Ša~i_5ïÝ^œO¥:âÆx¸×@nQ¿x¢h P&Eص*G“MÒ¦ ê­ Åš€ãXqeð6Lã8À"6ÑšT-Ô´ò;Sæ÷{z2rs|G›žP"WÝ„É^G#óHìk­BZuÂ^XWõÝ^»ýÑpVñGÉy¬JmÀƒB¤`×€Aw’ÙÆ6bÚ¡ŒëgšX6=ÿ£~žÝþIúj~ïùGêÎbÕ¿Vù#qV™$(}OäÌ=„¢ÖÆ8C8ªL)ö\y×õ&loK¾YguÖQƒ’Ûžwoÿ…Æ €N—i½—’AöõZ?nùü?òhxgz/7$Ã…ÿúoŽ"‘)²Ô:‚@q@޵ƒ €Å ¬õ¾$OT,w`5í}¬…oMܘ Ãt½˜×Q"®ÒC.]fR‹Œ£ÉªæšjªUlR%ê6DT½±ßÎ{E”ѽ×Tð‹§[Ï\¿Ÿ,¢¬ÇOq:1xf ¢ÉÖ“P¹=iòœlº&’XâIhGFH¥Zn ÖñƒÒ5ª?´?»um嵩‹u\D¤ÿˆ³—õÏØÂªšŒ4+âTË›-þ’ì@ʨR¯vÉ-^óɨÐn|Áª§ð‹¤ˆ°žf/§† Éc ¤"/üH$~d1™FÖ‘÷eümýp¡½Ïî´3t‚’T–ÈÍ=޽«Ž“©#£dûµRœÉÛy»õFå:÷û&-R°Å:Æû  ƒE”äý‰“IJáìʆldôªòõòüw‘|D±ÎüSë1Ìþõøn[p @¢,„°i‚„Ât·¼ß“Þosb–Ò×ÀµŠ®ø'f¿}Y[럫®•MhB AZ%+ÂËy<8¹ÁÇø¯ä ÞI"k!!Ë p¬ sçׂ «aqÛ;éþ˜µŸ§H¨§;‰úaYœµ¿<æHk¢DjO“ÚÕÊ E›²¿ï£B–lÍkÿæã2ˆëD?]õïÔ¹¶ñ0/‘ƒuaK.ɬ S‚ŠÅ¬¨6›÷Â4¯ž`¶P3—8º_í$•xjt7l7ŒàÊÖL_MÞÄÚ²å;û(P‹ãj·¹,Ú’—BT»«Ý³<6UŠ#÷0í…«Î'æÜ7ÔÎpŸ@ÅöSûýýo®½,Äaí–™— £r¼#%[Ç/Ÿ~_µÏâìÒT¦”â0L1b˜2UÐörcI„ýMÚ_¤ä& Õ(Ôé2xbi" H88z§šÀ;rï¶Évn}TsF2rçg§OÂ@Z¿{´®jntºÓ‚9OhNëÑx•êêÉ:LÂß°ÝNÑ+Ä™˘Ě-,3¤ƒ¸¤Ã $ÃÑ6E¢G5Àcµ‡ÊçabÍQ7ÎQ}ËûЇÄìZâQûçø>ß×öËt›=äEÐ\¼— øÐMOp˜Œ›ø<ºe)ôça&ì?YÇzÅ ¸*Òf ö°ä¦(`¦6䇬¯{…9RÜ6>kÈUo‘jÂAa<îfÕbŸ‰ÊT]#}¬Ö±‹ìÙiõZ‘7½Ž÷†åªYøæÚ€‰ì„)QÀ}w-ð´Ô›ŒÙ¶ÞÈDí>ë¦÷oÜ2εötä»ñ`€ª¾Ô;®ýíXŒš¼#vǽ½ÔI› ?#øÍS¶w´„‹OXxÈ £F¨&K­,ÀÂÙ¸žŒzCßžµôé[·?ümœøØo>™ÇHçÅlÓ!G½U1›Ñ3Œ¹Àá°ÌÃB©ÏyÙ÷VŸãÝñ›?N ÀâsëÞg£[—ôUpz1i/÷ÀN÷½Þ¡}ZOIx3›ÿÿå¨6á¿\ñÈI9­ZÊ+½!›lœ¹ÿ±¦§CV” @~ )ÔÙVžt¢ÛîDëÉIîSžÐµ˜‹/Ëp¸˜‡½PÙÒ‰œ1Ä{´õ*ílzN£BAžÇè5Òå$^Ì™ékÐzè°3ÊÕ1 zfÍ*6£nÎÙ>ÎÙm¡J¥C355Fް*%×™ÑE ¢ÏååǪúllÏ–䨙ânQ'c6D˜CÃ|†»ËÐ ¾âæ¸48\{Ä•„ØÊvƈÜH`¥cò3~õhpIáZr‚£Ô€«dáDªü><ڷ߸çgÁì«+E€…ð3U%B‰@šLÊeûhɆ*¦Ê’Ù—øéaC¬»6ÔûÄ!·ºe/ºSU|Dj*_BbDA;÷Å’)CEX Å#¬úq¥k{í+#¤?i&M Ùá¬Ø‚Î{Ì{ïwu î'Ù? ßÔB7+™—M‹WL€QèIKt@QÅf£™ Õ±[ƒ›ÑÇ8I¸±†Z³˜¥šª-ØÌâÿtÿòùºÍ_ÿü0špGð#èu”ækòò\ª܃ùbÎNßStoð9Ò9óp#‰bCÿ6¼Ëéguõ¼øÆ±¶ÎDÖ§}¿÷5%4Ö'^’¸7`^PÓ³` r4;i&ªF-B "©ÌgÍôjû{j£ýr—À‹Îu>ž›Ü é:Ö À2mE}NÙûŠz]ÃOñä‹ññz?¨¢yÛîÇŽ/ §ÔŠ…È‡Àižq§´3ý·³8ŸM&’™Ì‘±^—®ä[+ç_s`ÇCðTõ=(<õ§m|M×ïÚð”Fb7ì§ÂZÀt^‹^5âú¥ùøó·™žnŽìƒz?Ïøöb±0g××Õ^‹õ§Ežÿ5}=›{µK5Kñ0j¿Tî)=“õ§Åèú‰T°YÁÚ¨ؘÈöÜ=îE£z”r¨Mµ\kB¶F22a+SCIcæÍ•¯‹Å­¨".)‘¡çNkŒ]óî2¦7g-‘Vº¢Š`˜Z¦õÒ²"\Ù— o´™:g9*µ¢znwÿ$s3ÐG]ß~XÇK(g• Æ…0ÈD$-19µu*‡YØеGà/òf ­ /TóêëóãàMó­½w¥B¼è…&âË6j©éÄÎÑâ ~w!¸|mkªïsÕ÷ê«<ÃnÏQ=éÌøãÊ *,E÷ZZ–%‡8½H5I)D©h?ôêÕZg+%sØÃ0¥I=5».Ó’”#ôøãõëíú#ÜÛcjŸº@ñsaEÔ@ˆ=¾€pZJ‹T|YxORΡCµPsÞ¤®=7ùÇâ£_À3ãl!)F“@èl‹jéο^ë¹_ðŽšŸùE¡m@p+öM¼ ¨}g•¼¸}îæ­ øˆ¬ãýécö·Cÿå¸GgûȰ@.e:ÞjܵßI˜Óš¶ŠY½]NǾm§Åöã-ÆÇ¯pö Ìc̾¢K^Ì>¡.Á-±ÌšJ¥© Qî† Bu4Ds Liê[‰)!+ xÑÈ®Xè#Ã" $ÀØÆ5¤jHA£EìbN è^û ‘O€N1³óY•"à­¨O†`$HfB)’f'~óK%%pKÞ†Ž5a\ P$OOÑŒ“$¼€ÃÚ_…玕ðÊ0ˆ&t]­Æ-¦—¦NOI¢®AX\ RJå¯qÁªæäuxS&1Ê«B’Ùj/‡WA‡ÒRS†R ¬—W‰7Çp44;Ú&"‚:DV!)i†î²þÈ®ßcmXѵ¨aK¢Yºv‘\÷T¾ò”ÓæP'¶ì¶ƒ!õ¼'#Y£w/‰5kk¶$œZ;UŸR †2´…¯*ÆÔv¶‘ݱ†߃Z86·¢©À2û•À¤˜  QÉdj`âu/.|Î5º™É#íhÍ#;Užm°µÕ—ï;xãcoÝ%Á4 #áæÅhwT•ÁØmÜ…wÊ÷ÜÐ÷AT}Ž%žU–+%( ÅŠ'1r³g£.’«¼¯•¦ži·¦?tØ*bìº? 1ħ`¼Ý ‘8'PJ”϶cr¤áA,Ü¡”29_ÒÛË‘…ËSö:¨0ÊŒJjq]æ² C-QN£@~ÁUK\AÐÅ+A†ædožó(Ÿâ8 ©àqDƒ€38{¾ôÏ”÷Ööòt“Ê4Lç 6ãH âNU‹¶á#¢ f¸76ËÍïêE’¢•Û¦æÚjºåxN­11åI%æ X±®b •–F½Ï2þ¸þpò[þé·üi8’Ðy‚çlYÈb-˜°Â9¨EÍ5b¨H£Ö˜ˆ¬ž:³}üy3[vVÚŽÀdȺá}ë|û`?Ÿ‡_i`È‚Ä*aZö«Q¥¼~ÑÔòZ÷z:ZLrþý†´†ˆ:¦`" H–Ibl‚EvFäDäV¯‘ÛïL{Z\XÏ v„¦Æ¥EtIzg×ýN9 ÌPãŠB&«> j(^e5­CéD£(2qõï$}‰ ²E•ùTx –L}Õ?U#BÔnq¼–£é‡xÑÃ@bëõuÆ Ø¾ÎÚ?žwÛ¾¼Éµ C!“D+«i}Íê~má‹ZPç{ö ÌÝ?Õvꬫ¬~ù=!¥+´º¹­À[¡¸kPÔrqŸ’Éu´âcË#júÀØQ[ ÙXZàO,1¼LÏšÝ##0,¤"'æ&ù_ñ,T Ó; ¾D~ôâÆŒK„µ:i€ ©Ù¯{Òmœ¢uc€m«H;·Ÿ±{_½>Ž%!U¢‡Å^zOýœùëîß1*6ÒV £ƒ*¨ÐYôš°&âìàõ£\\­ÌOµ-©‰ÔsÁU㈠Ã,[ßþ¾> ›[M±å¯%áF<|ôþMß~ëÚW-¬UÌÅ›D“omýt¿Ï š5UBµ1¨º.F¡ç0©ÿs›‘˜1ß>o¡çUçd§V¾–!q3–4økYŸ§Ý2ÿ-ã¿¥&ðoÿ:©i!S+Ð|L÷§½ßÑ€ìúØNXÌ€Àñ]DÛúºÅ‰ZMD¸ˆ5Èe'l ÊîlÖPã]ØHF fž›QFW<½I®Ý»Úžô;Puª•Y ߌ:«Í±rn«l³´µµ v%T"‚ª¦üvð,HÄbGzÀ½‰ÀÊ aê°­ÃNÌŽŒ›WB® v{Oº¸ÌË;øô _ȯø[îÎz§ÿ‚ÉæUAºÿ ži¼Ém(F–gT¥1V„½JT¦Œ¾ôúË^½—}GjØ,É0 „ V e¨€ °¨$¥¿ÈüOÂ÷l½´q—çÒžÇXÄñ”½tNóoJؾ.޺⸴ºaÚ$8®£<-Þ—ÂÊìÐØÖ (6ݰ'Á7@W‰k©ÏpžJ7Ý€ŽŠË[²e,åбZ’Ò©öp-h, ö ,¢´ÛÃ8zë¥mƵmo˜…;Èt¯–´Ûß,?\áûbè-×WåÉcõÏÌUYÅä–x–÷ûõQû¸ýÆßú+©{¬¡ƒô6ª·¨Ž¶ä©ßgàÜ“v>`„!2Ïf—Üoå^•Cù¸¦–^uûÞM]Ç{Œ>•ÖSŽå¶_éz„×,‰†b܇I¹éñ_ûçãÉûj/ý\ݵ¦zè…ßÍ~aG›º,9‡ÌŠKû›fò$#llŸ›ºÝóìÚôܪ#Ûh»ª€¡a9Æû|üÓv{böGÕV¦¥Ú]Ú`†—Ë4XÜ£L^bF*Y#ÛSwT—¥ë}Æk+Óåˆ*›ý`´¯ü½Þ¶Qï›Y. ¬qN®øäíŸ8­!ÜEýÔi@»TûöW•Ig«äæG?²¾âìzù¥þsÈÅÐgïAn_a?µwÎ(ë¿Ý¾¾}çF‘D›áà¦ÀxÿzÁ½Èõ4eeÈ`¢tzu‘*u@&LETXŠšùvX2ý®(Uqw¯-ŽÁ©¡it1 ¶,4dއ¥…‡löšRŒV zÔInάv4£²íÇj‡ÏëëÂ6Ky«ö–Y%†IeÊB‡¼šˆ°ðrh¦õ<‘QÁå„t´L;ww?üÛûÞ„èK‡JZ·ŸYû^ëéëêŠ1X»›] wÃáäHPãN7hÆÒ‚´Úö’Á¸ZŽÄ’VÓ¥A ~fc¦`jÌ4¿èèƒXû…a$¥F(‰ ý^êêÃå„éo¤2¶å¨X1…×­‘àÊL·@Eà˜qÙÁ¡fö÷Ý{3¥¥@2g%%Úi`Ñ% ƒ"ÈETm$š¡DÓŽ½ wНK85¡í²÷Oÿùóx?æ È©$t—ãMW7s)£‡\äÐO=ëoN~Æ| €F“<Óå¨9Ѩ! 2’dúMôxìØlˆ“‘•Öܻ湂iñzä.éÜ2ðXÿO¬þ§þC®þwÌDa:??üY‚°H}š½ÅÈ3¸J…ÂfjçOÊÆo„­‰$€ê¶9 mÒ  ñ=©Ïç©cô 3Žå•ëdÛÐ*b:ŠN©û’6rÔÂ9·µ' &¨,Ñ"c»ë¬äuŒ_ø|!¢yÖqù‡J£|Þ+s]÷8Õdå=ws A‚Ó<ìðH†ð/–tNáÇÙ-Ìmˆ¡]ˆâÌá1S½qÞÆÇ×½æçøJÞtù—ÞÜgÿõÙ÷œ³‰…®ã ?ö˜k¶^ºØY\³0Í¥èEØ@c9t]/>×·/ãws‘¥ãÖÖÉÒ&™Žy\ÖéHÃLPÜW4$qáÒËùpöãÌPÆ”äyk] ër¼zY²ÏÒ‰–%0„PJà%õЧ5K×ç5å¯Ô‹YûLÀë^=ß#VZïwÏQ8]U^LÐu Ëęڦ=û*˜vÍ÷cmMÜ ²u1 ›YAß¡´¹ÐŠ&àd¦ö•@åÀSå¶ÖºªÔ£õìîÏÏ—ëaú¾p-G«ÀûíÓ®°¡#Ý·û‚#gˆ©–ALÞ‘Gëùó~;™¾kNöì¹æ;òXl?¨'Æ6—'f2¬!"E…äÖy€-j)x"íÁrñÕ·”šoJ°PèªiÿwöóýXò(„ÅlG°ðb%µæ®2es9eôI]¡½6B%à¦)o ¯fTP‰ÝÜ~z,¸ u uÔséc4Óe¢I ÃK¯WuÀ´ ôc¢k-Š1wP¥Ô(®‡™ëðSJ59…jµ=kŒG]Ûb—¾¶Œ2•sá„ð\©/óZ‡%´õñ˜Iƒ¡¿lˆSàiˆ‘)q3â#¶ÁHMM3lšÈg†œT•b=XÃ=ÚžŸ S‹¶UQ” ìÑ|†£Æ„—[²ˆCöÛõG·+¨§§I-­kŽ 2ãÜ9?Õç§T&‹UL ´ÄlIÞ~•/`7:bˆHä:àµúƒŸ=9ž¦Å<ÿdè‹ÚõU×?Îó³Í£SDADŒq}ýý­þë<×—oy»^3º…†dßK®ª}ø¢x…@hT 1§ ÓfŒiR¤â±ÕpÏÒâ4±2E;µúÞõ`ãH™sCeìt¶iЬtÝv‡9þ®ÞÎk#‰‘°‚ÕAÿhúêÌ[¨â%c|‹jw LšRq4:¨D{²Ê~߯ÈÎÖ©PþŠ6¦‘® £%ü4SèÞa’ó+ -ÿäð7ÿiV”iåQÒ±õ1k£ –|NÅET‹3” Côý}¦ÿX·¡y¬òýYúOÇótj4ǃº.c½ä0Õ×cg&˜ ! H$¶×9¬ÈP!DZ•Q¡€×ô ÞÀКÎp¡b (Öð•¶]ňN0U™<‰v2ÍZH€ê gY,Áô58ÔQN K¯E©ÀN&™I¦˜r4BÄ-ɬ0ªS~ߺ[ÂÇÜÄ P«P±z£ƒ%L®¼õ)Òη.ÖjnÈ€@$H¦¨¬Z%ÊÞ;ŽÛ°èí#eÈR W;9¿ácÚK€®ºÛ›3¤EÃç=ÆH‰žDä¯Çuù¨&õü¦ØKž! Ä:´ËÍ dØ4⢋Û½û·îGuÆ{ѵ¬1NHLâ*W¬£FJ‡z+X¡µcšdû¨«QYÄ­F©Ùy+™'NÁR†±zÛ c–=bVÇ£Ñö˜øh šÍ"Õ vÅ!éÁu låKÕ©Ç̵•ú#õ™T®bÄvô¨Té =e3 µôdfh˜@.­öQ^ÅÈÉY{tU“SoôÅ%¡Î]¯èUYÓk|/°å#œzõøÑÕ+WC¿ÎŸ| ÍyskõßÉ3Y$Ègœxäöø;Ÿô›ùüI8ÿkoøG-µÓ¯#æï—ߺ¾vúÄ!aùéB=·aWÖèiÏód C”MZ0ÊéËú“üœ¦ÅêÊŽYNT$޲P XEJœ'ë’áVÚvµþˆoüÉ=YÝÓ ñÓ"û¼A9]g“3Z¨¨\ømDØ-^’ý2¹Ðû1‘^ÖÅ¡ PÍ iMüIx¾6ùyÍýº"餯¡¼&úɵ§w¾Îæ¯æ×Kol¼ó¹_•E%Ú°$^M}T?ÿáÞ›w^mÄÎ6]tM]oâ )F@!y™ÖQmpÂ<Æ^áÁýB+í|åÝÉy 1Ø×š¿m0æw40NðÓªšñ\ɬéÕ.Grâ´æÕhúù° ¯M5Õ°^=$à[¡òŽ«~û\S‡Ô$ÃÒ'†0¿Ñ]^¸’NãóÜ€–‚Rr^z®Ìaå«ÞÒ•w¿··‡M–‘¼Á¦NÞïO}_ôÕÁ%³§^2»ógvy>%£óñ˜‡Y•{‹ÿY‡Q‚Áÿ>íŸF«‚ Ø ¢( "+ª¨ò‚†z¹Kš_o¯O7¼3e¸ËeZa¡)HÆ ˆ2 \ 1c1ËÖ…™X²T•RF# Ø}Ÿ¿Ö½ÿsàÜ­`i µ¤žo‡ÝzYýku‹ðøíÔ33™õèó=_÷‘È ?׿èñdÿÞå'^-ã\­¢¾?;ŸœÕCgÂts©€Y%`뺓ü×-ÖG¸ïÌ›ú=÷º+úÄwp­ø£ÊÕ-Mä¨ÎºŽ#r=— ‰‘–3ijÁh8¼T 5µ$бÂi‚ V\“¡³—¨¢+µ¿¤‹¥÷ïÛ!Ù玸ӿrVέÁÖÅñ0Φcþq^™óä~#©»ó£ÂSSDTdgâþâ _ ¨cœcɹݩ½¿ø÷ä&Ç‡ŽŠÔú»g$XŸë…øä¯"ÿÏžý]oýÚ“oî̽âɪ>ÛŸÅ'v4éð†w)¢}[ôÇ™¼k|¾ÅºÕy˜]ÇÊÐnÃ7»…>5S±fYC¾ÜôT$±¹'º¼&Xþ|½øPIcoÛÓëè${cƒßWÅ+šZï9»wiqy£2kãSHäøtÞà¼Ôi1Y©”X¤³$@S¬ÂèYìÑòÇÕ€.ÇóãY{ v$;2šG´y¯~Ë_æïÿÏ»Ÿvuë@œº¦B#díÝÏ~ßÔÎþGˆí*ц˼*AÆ­Á5"Ê+Y»§¥ Í6ó†½ÍÔVŸúz¯L–pN®±Ø´²l.…"2Ñy‘(„?"Zr±ÊÕ>tíOlêór–íûœßÕób<ý>ÈæÏîûd]–Å ®™M¬ê¦!ŽÈ:ù»†M  õkèþ™X/ö Pæ…&ßü†ê³ÖûT—öºÍBx²‘ñ~¯æžä'Ëm%aHŽž¬Æ´¢Q›£²ÿ§ùϪXø=ÞxÙøÄѮӯß(½÷µxYáV!jµ/½,µÞD7ÄÄôpÇ€× ·`ÑÿS[1Úç¾PÅC—åR@Ï“Óõ´ }uoúJKÿ(õ!“ã·hG·£1»¹ŽÖSŽ_ÌŠ)¸×K°å¼í7öÒÕ‘adú6à69Îÿa•MáÚüð±Mž#8"=sì‹›yïôÞ|4MŽòl’-bêfG#»m]×iŽØ8V’c݆.½Y ÂhdžoûÆ–éXÑYZ‡¿ŽF{Î>[üD\Ý9ÏHþ¡b3µÕ W®d:¦¨6>Žë¾[6xúÝãïñú]ç¢F)>èdÄvfm•?ÆÇÔÞç^‘Ëßì~åÁëÀ²Wü¾Çöë©ùv¬?¶•ÓyîmŸr5 Eûÿýü×Ñ>ñ— ‰²Ø`˰q”´êË©…8¸Íºý7¦ú_ø¹—_×T}ó¾h Ñ ÌYíM^ÜçynÄ~ Æu¸«Âax8OŽ´ˆ—´ZêzJã!éÑZÔ¢¡±RrÕ@#Ùñ6 y÷äf€Û> ^PWUÎ=\´ÔºGwÔÔx²7ÍÔS‹FÈz¶ç[|.x/÷šeÖ”‘¶À*šû¡:ªœ#lfƒÏîž÷øáÑ`9¦uLËãrG¾3Ü{Þpœ.L£õí 2ªÔ`ÍXʃ kÝ®±P²»ã7BÕõvÛ虑¦L1²dÌ;ƒ¢Dº¤$DŠqPéï-xDIé!¸¯¨jañtçpã<†ÒaúšwcuüFØØ×ƒƒÑ… p+° Åz—÷Šj óaw²Û>—Çi7ýmÑfÄÌt*ÓKwÁºÚí 6‘+±]ô3èõ»Ð’ïôëµ›?=]t÷ö×è¾»}ä:=dŠÏ×âüÐgêó%çà9ÎÓ!!ƒdò§‰TäñDi¡‚AÌNAE=ÉÓª;‚W¦‰ZPØÌ™š"µ¹w`—›¿w¼Ýü?gþyõõ"÷ ?b“óØ“05ú¢¼¯’”—-iaÑð§·Ë‹{ÛÍI"¹aGnaôbÄî ÷˜…q¹Wáuòb6äŠv7°6,6f·¶,_•ÁμÁUöVY»…¸c;kò¢·ñ‘£˜â2I-“6ëB9½¼d«_,/Uœ'ЕùÚôðçÎëtxõnð¦Ä\®3Õí%÷ún(€H¨ÈYJ~2[îIÅ!cðg;þ3u}*çæ»4"¶ë7Ê™÷Ó [W_$ˆ9©“totšì ™Á×1\s«x°Vu2.™È‰|ÅqTo¯ñÅ‚šl0Ú©N0{–£¬ eªŸû³àK¿7£ûR2›™ ¸¢f¿á}h/¥#Ô.:婎·î¯H7ú À Xz1lˆ{Qž–4(býrùÓ÷W¦ë‡Êz"#Òlzµç\ôã{]+çZ%BUf­ì3QÆœl_ŠeÖËð¢~9¼{ïúÁré¬dÕ9pèdE¤¡ Jl »+JŸóà>ï›/͘‰y…“ã—Íí¹™—EIs H f.¾\"\À5¾‰íJjÀíð"[3Ž—]ylXÕëÆÕaãžµ¸£€btPðÔ'µ0µÊâÈ, ®¢¸ •±9üÝý§¹æþ¾h96 `¥µÆ­Ÿû·#‰J‡;ö’'iÓÏ{ìw°hm âEÔõ¨ŸÕÌæÇÔøPn±£-m`4›¹j]"àÑë*C*D)^Ÿ=ŸÙ;Ä•lýàl{ª%”ùš¥ ÇY sgÚH^ÑJÏ+Ø\hÐfÐ ŽŠ>H?š9¦e³.ÂKqYæ¤ôŪ5Ù+yÚÀXØPwj‘Áø„›BòDK !b±—{ÛîC ¬Ùu šxJr™¡ipeÔj‚ nÔâÐ×Kj±ÛD²;zxžzîÅOm½x¾ö{žÞýáeWYl‰’œFRSŪ¢l똯¿ËoþÙþÆsHIC Z3“‰³ÝQk ±ª©=ºú<^n0œÂ9¨òOÿñy§ï¯ï?üdª[ î'nãõ̹ŸÛ_øo*÷"ÍH]%Œ=’;ø*a9¨¯Œ*´ž…Ã›É JGñ’¶¨^Óg"E3‡Þ-_TwÌîž^CôLЍ/U*]q&¯ ÚÒ2É™—+ ¶¸¾¼ïf⌔ö$‰aïƒ×Z:KÌ„\LÇ…#k!—¤8_ôGr¦¿ÌÆ•¦^ïï¾›wÝ'\ÿs£¬‚çül˜{ØoÔ£+uˆÅ,õõ×ËgÎYÞç˜"Pæx·îX›¸tSé‹~+OáŽ[vã­\ÝOq›ä| ½ÑÛ—³ú@J=b iEJa¢‡Ç—Ý+ÇÎÀYL@# )\ê® ò#GÏ'Ñă‚e“5¥P…§ð–ãuÁþÁ¬Ož+©Ð~‘0ë•Ï: oý©Qÿ Ÿ}¡ ]õÒ^É7³†¹Ÿx= ·‘ŸÈÌÈ2T«ÝTíS_X¦9{2?K™˜‘@²¨¥pí<%êJI°“ãÆÌQ7°Éqù¥Œ*ÜxgòÌÙ{\ŽËP6Òõ2Ó’òÙ°{=ºEÉÈ;šµ.Åž}ç âØZªÅIÈt«¥—Â7¨†‹©’•–?#%Hô:ÚÑLfP”ŽxìxtYx™>Æ”ä}÷@Päˆú¦Æ ½½É õ9­»ëçPzõ€,aï#Um¼¡›ÂL~?ïÆmç‘’CÓBt€S§SfXy÷ÿWÞ®oQïšÎRúÿÉ/jÅßϯ£ö~41‰Onß~s|=]+álåÛ÷"Ù8>ò@.‚$O?Ñ?ówú#3NMiÖ­(’(ª©pE-Næ$ Åœ"ç!æIò]ÏÒ›'{Ëù{nÝ•²NKYh‚6JÇ Þ=üÅÿpí²Ð›Íík#Œ íŽ!º!æS#øÜè¯"aâ‚=]}18,œ¼{Mÿ2ïósíWòó~ëÿÄifíÙ ¥«cè×¼ ÞÐ7Óñ(½Ç޳ˆÌàÂ\÷»ÏÀ÷•õ$µ.V´ñ>mÕÆù~§›æ4¸Û÷7Ÿð·²“ó1×;´ÉŠâXåydÔ½Q[a­ÀaSv˜ã‰Û }aåiRÁ£èXT5¹Ïn_.æ¸ï³ýÆ|&RJYG Cšbi@=6€àÔqÄO‰Ø_ªk H¢EQ²Ø nt’ uØÔ0O}ÚQÂv±—£ÂDô©îK ڧƃŒ!@d}§ê¶çäõ¬íXˆ Æë9ò£`d w¸@zlk Vué9‡½×vŸÊ|œÁ£ÿè·Ž.Q¼¹ÛHħH×Ö©z{ÁªÔW<1@ƒš_C=ÁïÒA=òžbÑÚ®ó†”A…“{ ¿nV‰dn¸^¸V­=T™2e}äÑ_ý[œoÚ[¼>É6ûÿ¹z«³U §b«z…£h¹*–­âÒ »ÍÊÀ+xåcè±j·{þNmŽRé1ÞÓnC‘`1%vm‚eÕÅC cŽ©spø4µÜÐöàÿ:JÞíRé-Ç=åòAúnÓrþåàóõ‘½ßuŽv¿å™ž—%Óö?È[Fcfõú@Où|éž³“Õ4ü Hš¬j‡N gº)3‚%ÅÎ[¿ôñ'°¶W/]wroÎv2öΓíüù:ý®»Wf~5žžLß¡ªt-ÛF6PbOñ ¹·f²N7 t®D%¥¨¸¯‚ƒ¹‚Ým뇈¯OÄsA¶ß½þ¥³¿{£©.°%—ø¥ÍŒ«‰…N Rþ,p—êæÎ*ÿzËÉösè·BNšó©¦K2c|¤ó¥Äš{>7ÿns?ÿÇLþ@ö‡j­¡Â.Ö´¨CäçFÚƒmBøì çOÓ¬„óš™|£o³TA}Á ц:Ú…p7¹­æJ¦4ðÕ>Q9ø,ñ÷,¡ ZÓ|Í0Ïå×÷“×?üîz4©„ª^„žÀj¾̳“¼Q­±p%F~ðäX{4†·¸=šE0í”b»=Ê/í t~Ž3YuÑê·­Nø»—Zä©mh·…à´ë'„Žð¶0@XFœjŒ5ìeÝk£š9”‡.¡dE±ߨjàÙÆ]žm½¡b,< Æ6IOý æºàÙÄÚ (÷ÒJ:ñ7ܾ{yõéK/1‹ØåU)öKSáö«¦Ýò»xF1ÎK˜&†Õxí¡§w]—Õ4$˜ð{Éoæ<ªý˜›x<Ÿ/?ÙÞ’ÞÝ~·`1Dgb+³è·›²®¯ôŒÒh{ŠíUqNM„ù¹´Ü½¯‹žÚžï´=‘[ØûÞ ÞäT .XˆMºÓÞX1ÂvýôÅCíö®ÐD¸Kg¦‘ë7—tùn!½ÆÎà•·nm‡¥Ù½7˜H.Wè°dUï9'Ç=ô¯vÇôhqk]ÇRâþÓ•ýã©=ÚzÌ|€¼ 2LJɵ¢,ÜB§ÌΘè{ΪM‰`¥‡ÌœiÐ_ÓXAjÎ8;íÆ¼Ã.½¯ ¾ŽLF CѼ­Çí;u^)Gcʳù<{¤³PÇçç]ö\‡Ù9äsôœ‰}N¾Ü6Q-›HpõLlmâÜøRc=•”ˆ!JvInéÄ4mÐíV ÂFP#ض×À‰oâÖ‚ÙN•­³0VÊé!p¡Š¯“ÚbÈ’…TE]ËŸ“î¶Q_$y®ô®ô>ŸjaU<ƒdb³ÄÔ¦bx±½vÓQ£È#ñÌW¶çdäõqó}œò’KŠÚ¨–DFTØev*ÌhPul²Lmí—eE$Ìd »$”&œ%3¥‘ ÎÑýÃ#ûÎ\šd:& QŠNñ÷_w¾è´~ÂÆê+·O‘•- ¨Tèr.–6Mæìn;›É0 `‡Í(üJ’æ¶Ia"VA‡Üs|]¨Á@WÐ-ƒÂDa%TVHÃTõCÌõ¼›^m:&‰oûÙ{zÊüpýtÍ<` év-é5âÈOåÙƒoý“×ôÄ4õ%U½`1Ò‚ÚVذWµ£½93 Ö¶‡}Í&^ÂÉÅ!‰(h€l”åH®Œ]Í€Adi}ļrTœÆ±›ž¤4ýhèëÁð6.ã? !OZ’ 6ceÔ-,Q ‰Qð«)N8ÈàºTIi´ (íDÍ…ÛGËd¬Ð¥‰¨f¶q+i qdõ“µLÔh.‘38¥‘ÄàžKÕd&¢.£'9Ü Ë„VÔ‹Í §`õ@)Äv ÊŽ1ê¢ šÂ+°ÊÊÅÏVÌ!Y¤­„Á„¶ØDsJ±f_'dgÏ,p¸¨—“–ÖŒ‰.uÁ†÷N­FíÉH‹ÉÌ¢:1‚úmå1^7Ç€€%LÅÝbËzÏ“Ìú‹ËÓ«ªK2yx==ßðÌ7Òkù/^­ÿú·Ž_e]~zÀ™ã¼Ä…s ²§yx3•œ¤OúšÍkæ¦G»Ï×çõ¼¹¼–°(΄óËúû›  ¤À”H¨ „X@"F–©4̺ÊúªÍ©*<Ïù)~¥óëZ‡a¶{áã⛲’ ­TG9 –0˜.üá?¹ÄþIK§{C¥/¶Ó­lÁ:‹4ðîúùì̶&á³›.N?µoŒÝáõw¾ùÃÏÓ¯íÝZʼnV¸òWHÐwFβe¢£ØÑŒ ]³ïèœß7é¨vœ[;Ó=ÛbóÖÇ×%ù ëÙ–!¦ .ܸ“m;ä÷¨y̨bÅkâÕ”Ø!±à·% J˜„ G÷§[Œéö1oË ÎÄ«FL ±ÝxU=|þ©á‰÷/Ý­3Ó:}R¼ÙCŠÅS œNyj•…’D} @¯²ÂD?É'ñˉ:¤@›#&V­4§¬­mL§§y¢ë ´Îv§Ý8±šc\ÈÚs¼B0¨*MïP|ûSîW¼ÜEl7(ÄTͱÎr +K(08…-bÁ‡hÕ¨mÈÑô<ËaÛ¤Õ_ÏçLö³Ëßéù:zðk£ ¸QnÓ®s±á Yû ®Q(Èõ6#æT…Úm¥µ¬¤XfÜs+þ3ç_¢_p‚RS…ymïÓ¼WVãæA¨±ŸßÛº.?LýÔþ¬Ñ‹úwzãß½V#wÚº8hœ€”¨Â:Ìj‚ï¼bÏY·¢P\Õ‡M®bÚU€qYt&TÕP@c Úš gÑŠñÚÚ|DG«³vDS{Ž¥e¢‡OÞ6éecwößçãýcÌÚvù0ïùÍßw–ðCú²ùÓÌ÷[Ö°üÑè|ÆÍyhd+ù僞¾þ´Ó[tðÈ¥Å&x†I±÷Ö¢µË“f'ùæúê™ïþº¸y¸o[wV|в:!¯Lè~,.ݱN²^‘û)ž(XrP=ëŠè¨E¿_#^»ß32º«š ©²Å¬8FÁ†¶Gi½iªZ†W¢BHõgÏUþ=^øéý˜ð¨Ä[f¸#aLX8N¿1ú’ûEÿ›Ü_ÇäÔ Æ^©ÊÛ˜žÑR‚N ©uÜöÿ8ݧ•†ó¿¯µ?FªkàQè>ëúDI›çÛöÑk¶ÉÃ.¡zÍo×óÕŠ‰Öi ï.xô´{?xítæeÚÍn„vÀȲ»[/Õ>y橎wf=E±^Õ˜l_r?sòúë n~®>¨…™kPlJË_Dd[$0“Ln./LF NÉbó'k_bú.Øé 5úoQiùz¯”ãL«!(Ä¡eá ¯ï\Þ{ åx³XzÑ×­tó³×™·;ÅO?;ÀÔS5|ri¬cd.ô_r«úv–úì‹„ÆÀý—¾N0¶‰¡úsŸÛt„sãìcÍkuÝ×\bÆ}1§·5‘ËÄE$Ç­ä·®0>zõ;ꡉAÝ"‘mÌôÛøÛ(ŽÝokÖd wö¨›Õð0šê3´ÇË߉lÇôJ3k¸è=:?`¢]À› àFâåŒßÖ3ür¹ßãù„î­ÓFSŠTã.MfCa[£ )ó>Ä~jGssöÂù°;cFÇ@Ys—4š9OW­dû‹ƒ­ÌbÏáèœöâ !¼u³Àܾ_†q ï}B jð@޽uTW,Ø@¢ßõ<£+æ@’4×Û‡õu…\׸ß':ª ›M°\+¸d?žg9@Ëð:}nÈn#_éßyÈ2€#ù9ÎÙXÓæØ?{- =ªylÞ‡Ú YPT\sT0C—ÑÓ†ÏC‘€aeT¤PŽ'·T^èËšPáª&ã·Fd<îËÙéå¯úÞþ_áw*Ù±X.E¤°cÕ•hTøàíYß~]AÑe…•õ,üà¬ãû/Ûq°íϱ|ã½ýçjb<t÷ɨAÛ­6X‘§¶:QSW3¦Ö+è!;Ú„=È5è½Dt[}:„yë Ž:ǨY¾ kXC0©²¶ÔEG*£*ïЧ:>=§õ\´eoŒËv.Q­’ XTØQZ$•¦Fššc·„õÁÁšòÍ/ltïSD2Fج¹- yÅ™¶±'þ„M#nµIGÄÖª_ÀnU£ƒ© 7@ #Ÿ8z®ÅjËÛcâYóɰ`A YÕªìgiceÔ¶Iĸ«@¿Ü;QY5ùbä'PŸí¨H(¢Htö੺+B0f±aŒZì$MH6hʶ0 !”BÙžÇV3 §0ˆ¤"ûNš}ã2­å¶—ïQÿ ù¤û¼5îbã6úóíÿígu_Äâs”©!S{˜pW×~©0ë(¥†…§èøN¼N +/³Ÿã 5Îöi±w6k«üHÚ{ÒU¡ÃGz—¥+F SœßÃì]“¦Åt:&èAÞâ% {¢jc9,s8Uç¿£âQGDWw–x‰te©ƒX˜±Ý0;´­ ô¶tw›¢Õ²Ñ½UÎ3ç&S(Èx4KNûŒÏ7…Sq"ÖÉb޽‡~dÜw¥Nû_$¢?šæ Ÿ/™UðT„aü $„?wú«ÈsCgRÁý.å²ßÁƒjK-XÙ¿Òø –›O ±åª|ðR˜Š†û­k.‰¨@?8c°é 4JœRV¹™=Þä-íÌN$_²PIEïê›0É4c‹Y­UŸ£¼6ê*>¹BâGÚ3C;«¯‡´m3žìRÏ¥]OCDÜã¯w÷f÷Õœ1 >Тs\r¨ôA•äZ2B]ÊA¿eE™22r+:âÂÍüQ­ë&/®Š_›\cìj‰'"UH›7n&ÂB8 ~;9p=Ëc ñ”†Ø6›»ý¥xüCx‡ÁN,Hö Ê mÁ”;ïq® „\—§ðŽÖˆ1fÊÂK¿s çþÛ~ùœd׬†ÔD{Áoæ

Pi qBHväYˆv†ª0_÷j¿¼ŒTqØ¢ä2ÌŒ3ˆs™·0géWÃÐr.6Ê‚˜HÂI04»%=›ÓôPpŒýJ×̶ÊE°H…Yó}ö*!µV¦Ò‡ê¨¢¿Yy:í™9?|Šï¸ÇæÓí~ú[ä™L€‘†HÂ0”xQ«”U’ÉGs¯×ïûæ5”‹,h¢–Õ)¥Äàöšq ·Ãïº÷û2{U͈i±nåeÇ~ìóåûó9½TÎ×¢’À´IÑwôìgôhÃGn¯ Ó‘ø ‚%FM²œ_)ÖÂÕðhŒËQó$ TеŽÄ]‚§??•¥§–NŠMoXP‚èl×™ª×†ÈÂL¹òd’ÈmZ-r†ZÂo¨Lg؈•J§bvrês¬ñ&3±jgG+4e)¨„1#¤ÎõžïôûÙdâþ¤s±ý RWÅm¨ ºÏG^vêÉe_+ Ò¢…†4VšŒ©°s‘e3îàôâeÃö„,ÏoÉcü"«ïó]§‚©Î6³–46ˉýNy…¹¼Ù'tSÚñ­x+Óf€.ÞTP&@dA+\“'@HPL[¤X¡P¤^;´1µ+ÜŽCLx„e*“¨n¼Z¡‘$®Û4z Ñ|˜Ë¡õ@&ò”Š&"D£fš¾â*¨1B"Â`0„Q;ØÀˆf5-;˜Ãø%ÁЧåcÑð #;]À{ìSÊàFà©w¼wHTƒ·åÔãpörŽôôúJTzZ‚¥î_ᦌd);‹ÂóÛŽ•Pr3cĨ_–ÄÌËCJ¡!ÂÀKA”²!J$k7NЪ­@o ×…eR&X§ÊÓþŒšÐ!{3ÀhkX™Öj]«ÎWKè¶zŠö¶½:°ì8‘y3^ï›׸ުM†Ã^ä‚N¼á†ZˆÙhC8)ìQ#ǵÄN†€þ¨~ÍÖpïØëx©"Û\>Aò¦Œ7WöýÇ•íC;­ôyÚ·c˜F>¤mQèü³œîpv¥B€¶Eù T1·Â kl´?D­Ì_ ªùZÜV/­]½œã†ÎßMUéE}*áŽÝ=wòÔ=›º C×[¹cÖÆ œqædy^‡7ù´¦‘YÅ ¾07~zæ¥þì{õzÏßé´j£ö“4Ð’W„#[ a<É $Éàg:Žy‹xƒÁp—ßÏÍóýá)‡é|¸Ùä•:]Îξl¿b5á†^Ýk¹<ô³•Û¶G™5îͬHÅl*Õ`¾É–£\Ág;Ç’<Î_ßç»§§{þZNW¿õýkªI¿Á ©ÏØÊM7Z§‹ œÿÖÕ8!¸g‘|Ÿ½Œoufî‘„¼¾z7 ÀÖRèí±l`³Ô¥n%¦o5›ýòôÛÛxËXŒƒÝºHU[çÑŒà8ã÷KíÜ/wCÀzpã|laä 2Íç>ÃÎ’Ïó|Z¾ß»¾¼*zÆÀÁ@Ä0¸D<ÊPHƒm™î BMÀ89}þÕþz È †¤Rii «†F%ÈqEóSm™P•»¤jº†Žz‘å>õ,@€@£€‹¯:2Çî¸ê@j••‚9¦9Ìxy ‚@…‚½ÏªÌ ²²OúøÉ~ýÍ=‘YpÕç.?æ–|¼´±,q@q”õ{|×½ª¹Ê '¯S̵Bz-Ž‘F4#¿ËÞÂTeW´óéÇ•zÖÒP}ú.¯×ù>š/ÇÇ~TºYø¸¤{Wý§óÚÿöû÷©&¥>[¿›ÞfÓI©ˆEÊ•ÐÆ+ò™cC¬QÏ1íãccŒq$€f DYr°`‘¦4`=Å¥…DŸ†_ÓŒI•™6•4 6¼-°ƒ¬&ºCc놥J Ml¡Ø{~Ú÷•œÛWƒÞ€÷:Ï£i ̘4x­ytM/¾â:ÿýŽ`^ó?Ôð{ÛÏl¿túæýM%ùî¬göY4HF¶-[_þ.ïéÛþÁ^4¸#]p Ð7HaCI„Ñ//-K¤‹c#C{ò ¦‚Ñhm›óÔçWòVò•â«uH!+z;÷MŸ‰E»—àS÷¡b¦†¢¿ä7²öt'"ù½ÛùhæÇ{ç¨ÉgGeÝÿ.ò £_Ù®dA0 ¢+æ^€…B€fY¬÷]Ò–†1¶èßÉMÈ—ˆ•é¾O|Ìñø²D[m¾úà›¨×ñ\ÇE4àÖ0×Ù±²ÐB‡‚`ðàUø÷æ¥TÁMb/×j×pÖZÈkÕ@ ƒ»iÉÛŒòJ7¤òçï7Öñp? y)Š9ü»ÿÞþÛÑ?úþò<Ÿ°n¥yuG<Ì¥¥ÔMÊ;èE9P&È@+ç%J†¾ÃŸò ÉBû뼎ù'å¿{tþWÿ¬èßýñr6Ä3)pëPˆØˆ^~r½ZO7²È²\ÔÊ‘ž»¾³«¯˜ÅJÎâJÒý;ß6vj乄[‚ÛÆ<£vmLï¥èÀ´t2üuiÄ9¹Úñ&†ŽèZ¯úˆiosÔ¦y§¢‡7¿¿Ø½ÊžzÆËO?<¹žã2¯ë죔ܶGè Éu­Î0áÖÀç¿ùáò¥èH\XšªSãwììTZî-˜j¥üЧúôôíÚO5Çë ñUÏ·´Ö¶ ²c4ç¼O¹ØÔèh>ÚÖK…¨}^³Ï_>!VOF§Ÿ&úëÛÜÇÁ‚Içͺ&Ê(tè¾ –¡`˜8™œ·ü<~¡ÒùÎï'GÛ¦FÒ"¢ÅD´‡„ àæqUÔ–.ýñ†­¹WÔï!̱Hh4²ÄELÒu{Âóû¾ƒK|Ñœ¡Ý*tSËqšapry ¿á .ƒúÍ÷ϯu 7 ¤NKñö¶#ؘ@g°}š ÉÑÝqÅ ?l@åj{3²wëÎ]àö;Ê:?¶KÊó<Íë~)÷"ëÑ<ªˆ >薹ˆhí§§ÊͧfÃF?’-`Û© T#€–=ÏÓŸOþ˳}¿]ùŽ~ºg]½íùÝ_õÞ¿¨ßýz“aëÎcE±">Zñ¸vëÈÝB/%P”îÐy¤CÚÏŒIqMHô Î}AÉLFwª(•ܶNì7íʞńG^aL^iÜær{›´b@LµT#ÙnÐC)ÇTS‚7Fv)ÒQâ˜!j†D´S®~=‚Š$Ý;lÂOà—˜–¶4;¤` [T+6vŸ#O= ˜Iµe'MÜÏ©qÎzòÒU kj˜†˜êHH¿Ë5O-ãIök>ö8¦a .6scÏú|ÚÚrî¼Úª‡&Cº$Ç+¿|}7Û_HÉ·€Ž‰ð³Õ¯àߤA²-S¤Q@‘AYÄkÃ5^Ù÷d×àŠçz±PR¬´I´ÔÁå’ÐDtG]zwÀW©õ¸d² à@ERûYôluR!<üšù¥ƒUV‡.HåTÀÁ~×`)mõÂ0¢ØX0«ÓÅ‹¯´ÕJ~®˜Ag25--QJ[´$³•Á™µ0DNJ±‚¥³$w,G(V~ÄÙ—õðõkjŸÙÝÜH±Yo3÷¼¯+÷5ðûÖH9«ï S×gŒ%¬¨#ü ½sŒèéžziA‚v5¬¦˜† ½šô85¾uÇT»bܪ ÚpÆë”ûÙ79ÇÎQžr«áºø0ٔ˃ž6;é¾r³‰.ãš4ˆz=£6Ì‚ÅܨÇHà†d}Ñ «Â6Úu¡œî7Âh/37&ãõXg_B:Á‘Wè‚ÃOÑwßÁLš<.C÷4öO.©Ò*#¯û¿œ :ŠÕ AEJZÛ€w7êBè-’5— *ÅF£=^x¶+†2±>ñœ[УAOp“™… 'Ê‘|V·ä×ÛeÖQj;ÏËSVd÷xúz!›àT1¬.-õõ ¿ìv®˜£¥k1BÛÕîáÜóó¯Ü×{ÆÿÍÐj{]znzNOQ !´M\Xˆe=.Í\…ªû|üü«nïÎÙúë3Ÿ©A;Ý|ý¸¯¦Ï›YË»IžÁµ„.§Æ*k££ŒReÆ™4ØPÅÍL“<šè£½Šb$*&r)Ðw6|ïÝgr__âŸ7£~úõ‹¹æŽAil)¶•N‰¢O~ð<ežÝ™ÓæaÏ<1~šEøÌÕµ ºSïàNŸMÎYb—Ù@=7ß)öŸKxqoƒov¬Ü^[çW3÷7÷;ë›–}Ýûèý±CV¶‰ÍC›A¼Ð})ŒÌ X_=˛Ȍtª¡åû‡ÝãÃ÷ç¢ß—y 9†B@ZK†@™Bƒ©5\óPÚ»žaà™i,5"ûÚOg‡.`, 3U0FLÕQ *¬»åÎ ¤IŠ@ ´ FC-È ¥î©ààˆÅÅ@¶l¬ yŒç¢Èm°®Õ%ÌÔ Tóz^&\ª°[u©½ÇŸp¨OÇk>ѧd¿¬ÓuŃ\¡F:Æo¿ãºó±eâkíM¾¾®r“:“5ÂV¨ÁâʇiïÃ~“\NuòSòvíôˆÒO£|¹Ù:Õ&ø·:ÌYg}̹­ÓTÆަÿZâÚo½ŽÞO®;r¯è~”oM0A„‚`+†M?®, RƒÅ¨ÍÇѰ×=­»½ª«ªÝÕ¯ÖSyz> ¸„Lq|PéñzÚ¸ê¶Çº”Q—.àØkÝõ~uvxÚÑ»·¾W˘HP[Ð’~Þ“É?H†y¾a½HÌå‚ñœ]ø2ºÿpÎþ]ŸßJ_ÏÛûœ³çÊh¿=¸o_ÝùcÍ«³[¼Úóf?å¼[/4t< [™5œÿ\>T÷Ùý|­ÔE´†´G:Tœ-V ëpXýáóA½¥Ál¸bªÝÜ™¶ mXƒ†œhØ[’¿z_Ú½Ü'µÖ}©éëŠbãl˜Ý²ßŠUSµÄ,îS¦ö|ñÃi:'œ=£¢KºL¾°ÿWð_’ "„‚«„¥R€Œvnڇ \#†¯fÏ'/ ,]·Æ÷ºm.$ÐúïuøwIçïF‰ÙD|¾/¸õÀ1ŠÈWayó”Yé½=~ªOS›?I*(¥@`cÝ„Âå¡rDƒ-Úmpôj´) Y{…N_ù<_.©²Ö™Xw](,u_µÕS§íÜ*6¶*d„I ÐŠ®½ø´®ÏÅÍÛ:à›)÷r Ô¦v$Œ¨®ûãÖÉãOÆ{7ÂÛY¾¿_¸mØM(á9¾Ç&Rþêð;Ðýž¹[$v«æÛ3ÇZ¢T‹]­¼ïàü¹„oSãC•Ö2PŸ^>Ã=¡ ]ºƒwô¼Ô:´çš[Yèlw-V_¼Ãæ´rÚÏ‚ É%´T_—Îéú®À(çIóe,ÿÇz¿1wX¹ê¡ir˱ OJ6úŽHøý$Ð?Ê3ÕÆ÷¼ÿËÒwç‡Í; ݧ¬·[&^~i…/ˆ  WæÌÙ %Í-­YF'\jWMóíÔ Ü<‡ÏÁŽqÄ?8½Ž·¯ÍÏ«~AûìB¹íõéÁp…j ¨6¥ÜJ¡d_õ̺Áíž_ùëýh^ÿèÓT^r.Œx†vŽA8}ÖÙÆ/h>xn -P_´QWøz¥_âòX£¯öÁññ02Ae“Ó$Ý0“íÓšŽE¹ùDIISµˆÀö¨3u¬'«±mÖí®Ï“ûD²xïk}-!ý©¬ƒxÛÍ u‚A=Žß±v¼j¥ÚOÛ‡ÆFö|¶6¼ù—éÄb$(ÃѾàn‘ZÁ­O¨®Ç~r®·iA ÏCѼ¦¶Â JV0ÃêQ3Æ™6ƇïŸÊS¨Ù?y·rK9þ>ºðQkàSÜJ9c››ÝÅÙçýùúzsa `8þb^&¦,KÍœãǨ(»@3Þ F9ä>Ár[ŽÚëh³PÌùÜ¡âc¬Œs!&Ö)9i”.$uÛ‹ß1œ‰uâ!S$ü/h"мY=Á·ž¡\nÈ$ƒvÍêþ ¡¿ŒýŸß÷ДOí×Sì2°e:D‘Mç— ýÂP¨!“q´Ë:uƽè(2c&hèd–kà}Æ­ïôG>ÛuósEWgûú£¯Ô⯳±N©.”Ïåc;ýðq']M>D»u4Çv\HWIJRC5Ò+k©ƒ,ŠßÑO0£f?ÛÖÇ®<Œ@Q)Ü婞¥“DÉ5S¢˜ÛÝÆùÅš“î[¯‡÷E@~v;&: æ¦ Cܘ›K~?5  %·7ï´åˆðý`Ó‘©‰;‚ñ0E‰V¢…åà*wy W4¨–¶’O1²ˆ&4ñ¬.ucÊA8ðþ=þÖü×KŒ4 _.éÎèLµ~ç½pUE1˜âÞϱŸîó¸_E_¬Ã×û7ÑÔK/g<¹Õ ¶F—xëÝÙ;öŸ¶ûn¤»Üðú“þëiO&U´ Ý7}0‹¾ö¤s Éuë’ŒÚ9ׯ¨C›’¹øW¹ÈÞT€á7 4l½ñYÇ£‡ÄS”òl&ƒiMËq¡œ?p<™<ªG)À±|ÈÛé2HË”\¨üࣕn×\ˆÁx ƒòSdl[°[ø8åÊ€ï*ÜjQU ÏźüŠm?\…)d¢,©·iæ–„l¨®JW¹YïØ2Ïs ЙíkB†ò¹q:TH!"H1é¿©WO¡èƒ6ˆåÆÅ}+!¼°(’ØŒ¼@Z—ÆÍ(—9%½©«u¼àú@7•O£}Z«ºtW}ÊJ…'>þ£ýÏü޹Ÿ ³^×+g­¤ŒŒ—£¢ëóñfí½ÊH56Èæ¼°å]K?û:úÏ£ÖÔ]Œés¹'FRÇË(æÅ¯f›)â¬ÒÀd¤ÄJzÜï·ô»S‹9ËS£QRS*­BY$*·KÀBðb-âP°Šƒ"…B<’?&W!Ð$†Vjå©h> "(w¯E$˜›,ÁPß~çÇŸü•ú[¶žƒúàèsÞ÷ëÈU Óbn4ÄUá⊠„`.žŠ›1Š0à<´ÛJâ!Œ®`KÊëZáŠÏ»ÜàËOZ Wó±‹+È™¸›u&,pI‰Jì‡52•f¼ÊÉè IÚ©%,-z6ô˜f–£Qr_ιǺѪÇq9Gë–›³õòéŸu½¾þz:ÿA½écP_ri¢:ÄÿQ÷À„*£2˜sŽm0'ïÙ†Û”žÆ:§Û§õ ^xññêìE%*•ÇB§c@z 1¨ZtÖ©\‹̶Ösi³k%§œû@ÚHNŠ ¦>XOØË“g¸_Ç£PoÏ3Ý‚YiÕD"¥V©ÍÀ®çˆõy›~…%a,¤f1¾ãô/‡ïGã>±V™:°áÖÛøÎ¬J´œïŸû™ê «"W•ÍRÚ<+¾÷df¡)Tcqç™L :Å“ŽÊq6uÓKEž0AÁOtE2*µ.žëüy??õ¼}‚—g—3i&úu™¾ÃÙåµ]%¥]¡8j]Olk·‚Á!Q˜«:mIšÁœL²1íŃ,D§E•Bqœ/(AÐ<ŸkSì:‹Ç>ê™Öl˜Tårµx21w|‡‡RæQ)FI–­š‡YFFNlÅ ŽŒ¤±€ô¶±;ë•{¶ÖeÉæÀžXçˆn{&¤¢€bÑ(N,‚1]à)º`-B;£ Z™€jbȰFÆ!(Ð ©ÇæWoèCçç7E7\a¬ª‚àå>I‹…еŒµºLÝî3¤J…ÝLÃr“q$dƒ…xÀðÏ¥ Oq[YÑX8I&i Zø>ö’3‚0޾2ÿ*(8…-J½iEÈ»›š$Xé«ë†Q@4“ϰÝ@\ 5„D¥£#)6Š$øó{ÿòû3µÆ´^b–D`g!¸¤›VrqH: ýÊ!zVÿÿúËiÒ”‘xG<’0´F#;î}}üÏWü£_ugtHêÌ@ÓÖRCZ¸À* =)B[ìní¾rùÊ}éÏE”ºÌͳ⊿§ôu슕ðµ®_¥öÁ—Ì+ií¸©-$UÃâv€¨,) Šúó¸“_=ÞG¯ô7ùÏ‚¿wîvPN¤Ö‡™a/T®vJìê[å–rˆ¸ 'uÌùò^öçÑI­oE‹ƒýØ›6«ú1¢žV6Âvá¢Y. ¾Sc8>5K—=“€e-[Hº‹‹ñ–‰ÊŒR¯ £¤û9º?Òâõí…¥ç Yçúß1®ÿ5؈ Æi«oÍl°ïP?ìh8¥D”ÍJÀC†¥* %OµÊD a‡«ÔÑ~^Ifæ,Î'( •2gõÒ‚NOõ¢~YZo¯1OÂ_ÜìBc™,ÓVÞRÜÚñ}£^‡úµÈP÷x;kÆ‹,¿­ž· ?+(žüÊÔÔÝWB°àš ie阞 óÒÖ%“ìêë}½2÷ölËÆ_Ÿß•<÷)UŒ7wý ùì5ÈÖB eÒZ?[l¡©#Ž ü9æ‡yÎ1 Ó;ÅcO@Cè%ëʬ|rP®Û7î4?[”öéÅ$eÀ¸>JÆ#›êçNï«õüe3Õß^]oÿJº×ü\ø(³HÞÖ±³læÚ;JB¯MS91öÆX9FKTÚêÆÞåt…µ”vÝÙ[ë:~Äæ½ú«\‘ìî™UolÕ)Çh«^=®€3÷PáOÔû¼¾ë}ª†ôÓlͲô¿´úðõ]LOÅ-[ø¿ æ?Gø/¤ÿ#wïãì¿]Ñ:Éç'¶*{Zo#Ÿ¥¦Þ¬.s\ïgywi>ž”kØ/˜½’[ªË>¬ í »¡†.f¶™0€né1‹±}Ãt gâ í¨YµÀÑe,AÀxvÈ& ¸…]8•ø]ìü/‘Z·æ†Ò‚à´dÉÕ9êŸÐn c\¬œ\9‘cq¬&Þ¾h2.@D_ü;á?rõ÷œóÐmðp{¡ž#¾ö"æï¹Âfò©@/?>ý¾·¥~Ì{¦7¹üçîóqŽV3Û¹:Ä!§@c´ÙP57#Œxw¯%˜pó¥uÏß¿˜½)´FŽ.®ïoÕ׺­¨qbl|xV6è=(øgÄ ÿsérøJç>²o*v¾²0êLàföÙX—Í‚åÏÿ¬»|Ñç”Y_oöþÞ?#s€·*ié[»çÅI©•Ôf*t×D¾¿š_º(éw’Î?/{gm~u'pRÉS¢‡ €¥&Ä¥+F” É“Ê~a@¯ó¯<ÕÞ¶àð¬©m¢‰·"m)C*´£IRšZú%‹*ÞŒj½b/ú‹ÓB_ýN²vìdªõ, ÔÆñ]Œ~j\s©G{&H9 d¸ƒÙŒÍ¤)ÔÌhù(f+:†¸%ú?“~(û}z³|ЍGÛÙ¸RïDZÒh %áÑ9IÎä™—µOïû†Ø|nÇÇ}?U?üûý„÷¿øÏQ°^^{¼É«gžcú­þúZ_éÏ)ÇÑöOïœ}!îû[íä|¦Ý CÂgñôѱ­vº'âþŽN|}ø7ÞþÛ¿ÎÅw“Þ{nŒd9’åákwkš zyÛ¢Û/“ÖQïG, @MFX¬ÐÛœéýþñ„·É9s›z* ¾–¥| åÈ{í<7 y•OÒûíÈ« x4€¦‰:Ç.¨ÒŽãqbË‚3‰•f:&dëa>Sš÷Ç mµN¿lùs¾o»À%&j¾ÞÖþžZŽì‚K¯!›e‰9 =S"HrÈ( pŒ ½’εµÎr V{l@i ˜Þ^Öi3A3k„Š·&:þïév¯¤ &Ç[§>ÍTvÇýàýåàòõ^TãU~R1¬ÕÆ[ÜEyßкjj¤ ô¢€Ï­u[߀,ïÙGP«Èç=Úÿeƒ1 àÐ6ÓuÔÝ” #Pøã¾´Õ‘Óú‹ÝîVYc1l O˜c†¢( ‰½FºÃüªþß`©O ·t·DahÒ± ˜ñ sè_Ti8öŽi§§ü¬7sNÆ#‹ŽG·ûAë~MþŸ|š-74áÏÇû!ÚUé6¶ÉÀ:ë"QbÈZ«ßPˆuT×;éø¦ ©Ô–´F(\¨ÚY(ºc‘ÔHüteC;ÓGZzŸ'>Fž{š~p1k™Ò" ±Ÿ¿ë?ÙÚóz¾;ßÔäÇ¿WÖ*·òæœønÕëmp=ÎÎÍoÖÛm:{Ÿ ÷Ë®ÂÈOýÜYg-׉pN{«*9—P‘M#˶«xi¥•Žòþ ÿHl27;µN„œµZ<õlÙOÇ^„-Û E«XªŒf8s^©~ƒ™É:£”+¥+šQýOÐÆrÁZrœ¤¦¹*o ÖgýÛÿìý{x=wü{¶>/?ò­óQV½²K“ ¾ œÍKBÈCº(G¬¡cg.ɬO¡Gjb­Õ<ðy€ñJ~ß߯ÕÏ«r‰Jb ©ª"–2«å-¬ÊªÙ¹Ú–”<VPʄџ_ÿÒçþ^ãú6Ÿù¡|Ÿæ×¡‹æ°‹¥¢FP!åjPJA<ªÇr±nV5ßü÷{q¯ËÍkÜÝü|Ô”_ÆW¬t®=Óú™Þ¥âVx¡î/Wå˜ÂüHá¸l «Ôl {”Õ½{ ¡TÆJR*ƒÃ²H evžÙT=¤VÞî¥.£-\Œ† f)Ç”K¯&ÏkDf„8¥!¬ÄÇÅè=Cçcuñ 9àÎ^Ûušïëvç+‚áªÅ>X±bòÒš£A Tͤިxa Ž=²Û_!ø«>ŽÍLj†}6å3±BP€EÉgŽ—+Ϋ{X-B3Í@G¦!ÓÌ)ˬ+¸ƒ1YÇOSJ§dmÁ@3½±[”ÂVµ¢5®Êï¹óçsôù¼½½¯Ÿý>£ÏûUdvùþ»wàè@I¡§¢¥í„ÒÈ£[÷N¬ºþ÷†vA@ õB©ÁOxö¤dî jõÈ$-®É¡÷F·`k[šr-ÃÿÛýÖòw4ó¨_g«÷ôÛý¾õé&Éë°ß²\˜óÒ|ý ÖõâÎ?Ìmà ®Žlé´[`3ýÈ~Q­*»0Y¬â"5|‘Æå¨usʘÃÝû·ž¯Îí9d+8&gÃ4 º YÀ#¡d’—HQŠSV b¨"ÂŽò³T—bU$®0€˜„÷¢÷¥ÉŽ\Kç…)¸Nñ ‹ 2×Y¥¸.\¬*k-!¹K¤¬þ¯ÝhÏ×e؃º}žPùúÖµ¯Ÿ¢»lmÕ6fÛž’ž@7rDZE-Õlû㋊l«úΠ³6€U:º®dô_6ö›S_ %¡Åý õ:ó‹êýâ u-á*%G_膋⺓ká,aùlªú÷J•ö÷ÜxÑò‡…«í_([u*qm½œ¨ö½%ýø€Òn¯Ž-¾ªœãásÚSQß²¯ÓßläÔÈÛŠæãÉOZ¼{vòÚ[^u+‚Ãi1Ü$ƒsͼûD˜&.³Â=YwÚ±ú°Å1Ñl-ÑO†5g¨ÀÂzøÌ^©?–t ÷Ÿ·>›á¬@Ld>\î³Á/Ô;sS·woå¡d`Kö0¯*l®~ÿ¼ÜÙÿ)-+ -?7u ¶¶ÖËU*~Œé]Á-3œåŒ~’å¿S¾ {=ºò勱\ÓwÞèg^„ÿÕE³éÝS( kµ¾¬úÕÇŸ'ö$‹¯àyžÌý»Þ}½¦Æ­½>·Ozr¹ÿÙÑÌþ"€ºÂí²ZÞ²£«?šââ·âŒji†×cênÒ°'×}ÿ®oX·êHo·äîåàβý믧žwqÞÌu&í«¡âäwÝ•º“.ä4òŸÿSÿØåùrâë ƒ÷½fïûûKß>^ºlr¶WªÐ{££Ð]¾1AÏ©»ûqñÁäž7ë‰Ç°>ý²Û±6-æ,ÂjwSgŸ¯Â+ð–L@·ýÉ%9“&M¯¬·:ÎîÕ?½²úDÌÊ–RjÙ—÷ûhÂÇšFßñËñý×÷¿9ž¿:¬Û;Ë·Ñã›mwGé®\Á¤G§ÝsÆï“Œ$)Ã8ûÖ«Ci£+çÔó+¤¸^·G_oóóƒÜ¼5ì‘®d}ù½”r÷ÇF>v‰s<Χ€É片š½ëαÄ`¹Á6§5g\Ùò#×F)RÛ†OdâòÓ~4ïÛp¥í mŠéšc>‰í‰Fj¹ûÈ0Dìúa-ͺLoÌÿHÄbâ‡Þú½ýý§!±Òy.ªÔ0'm‚‘øóhþ¼é_‰(ëÐ!àËæ ˆ‡¾òòRLám`"„p!Qý«Ëxãó¿ù©†úÈ~á?“¨·þ×ЂÁú¥‚S˹ ŸaªÅ›|BK Îc«ê"wû4]ÄÇx¿ŽŸt±ŽwÓÈÌÛ“aìµÂAÜí~2ªï2¼£TŽß>oúãaÚâD×Þlh¾Å ýjpÏà&žèÙì½!|d²åàŽ15ïû½p¢\¿­¸šgOÞ Ÿ|ô‹>œœšãé„/¿•T?¡Ç¹åû9Òƒ,·Úvʼn§¢ÌDGÃBž_ócL׬5;¤ZÞ':kPÞš#8‚ ëÚîÕ¸:Þìx%¨ƒZdK^­L*tW–ÅæÞ†± È 1Né—jö>JÃ{2t"ºpáݳS,ü*èï¯ïým ~ïÁ7 Í·^ŠùäëHó>ÿöõ^>g7ýjOþ+/ý&ºy­ëXаi˜ÒpjD$"ÐH´1r¤_‘0”`*J¸R¢¨1P»ãÑÝ¿å5)©ü‹õ_5-»ä¨7ÿÝÙþÍFƒh­aϬ@O¼Ÿ:@$5|ˆ—rŠ­¹-çgö^J?èT¡ÿàå½Ã¯z™I , 2:—g!!š\4úµJÛª3ª#™\»·<户'k“Ip…U%ÓgÐLrâçÏ-¥B–? 4G3ä°?š~únOœ©…[ŸÝ÷S¶jšMÖQ‘*˜ªjl¸èñ,¡µïÛœ~ùŽh?;ê¸Î77œ[B#I•¢Y»–ïú´½øù ¾j}£®¹z7îw‡1ç‘ÀŸîÑoÐQH{ŒNTOnbº[·g{¾ÁöŠº­½ñnQŸ ( 3#›étƒ ¸ŒLV»BXàœ/LóˆÚ ì/ü?^×Ù•WªSP ¡3óáŒíé÷fú¢K4̨qÌXw—±XÚ/ŠVÔ[ofæL¸d³Ãr–u]æë¡ßV{o÷˜ä÷K×oµçÏè{'àѪµÞÛ¢ÄkÖúóÚÜßhÇïó•ãu®CŒ¬¾}3m𣏒kbÁÙÈV¥K ªrã÷Dïåþ÷ϳ¿Ò ÆPÚ‚‰,A8DÌ 7² gV@bnv˜²ˆöšC/ÒoƃúGíEá3à0ws)÷ÐËU0Í`QÐ$ö @™¡ÔDI“p±D < 7° *ð$!µ¥ñœÆL¾DûØüí°º+,ά´½ÒŽf5{:ÃÙ7ªÞ¿®ÚQ¶$7öëÔ¿¾OsõøÜI<|*êNõô |© ňY7Ž¿úÃ_>ÆÖ—ùxëÇìbõÔ®ÿÉ¿ûó«üá·xÛ^ 2Ës°~¿qúý6½Wü<ëç,‡Jœ#¿ô²ž‡DösvçáM®˜®ÊˆeªZQF1q(îä@qU: ·Æ]yî=ÑÔYïÇ“‰LÞ}‡&r9ÀÞ¾™/÷™RþñTkq«s¼TÚZ’Éך w¼Õß4:Uò«µ’#Ðã³×Ušù1âbi¨²²‰¡ ™‘‚2NĦX-`Äj€îʬ”Ẏ3µª°tgþ1ðO„‚ÅçÊA"ÃÒABUœ'…©ÞÙQ©j,C„ÂæÅÜU”r›Mbz@léZŒ]™œŠ¨Í Ìb·Ì »!Hª˜eøM¹³›gô$sÅ£·÷ãŸÞÞç!ðS>ÞÝ4·šLSˆö·¸–Žê/loÚg¥É5L£C3¨£ ‘P§§Ú¶–t}F3/sªœÜa"¹i¿çMŸïÿ¼_î<â{±×›úÏdIkW¬J%gTRŠnˆMª¬@'“Å–v‹…Sj!úIãœÝ'}Cyÿ~¾–åǯñv²c÷ =jX”Oð ýŠÊ—yØÞ¼‹}ú=n±‹¯ö†AÒlÁÐ*Èœ´9ó†…O‹ùI?Œ€´h8}ƒÿpä_É.ƒå*“ŸPœZR/rN’€O˜B¡8hʺ±÷s>ZèQ=6™÷=‹¼>î¸ûn¿±K@©iöÆõ¼àäq:MR²´ž *€•FzS²8”Ûèuœ¨‰-Na‹¸ƒ˜ ;xâøÃ]KÌg™z⯠‡öž'2P4RØ„YÕšnOÍÇÃ/v»øöýÕ7ÝÅÜ=CÈiÆóx/OºsÛÇäd#FL›µÅºŠŽ!X[@’+ìR:Qbw á<ó)5ä‹ý›uïk/œo}zC·G¡A爗±2»ë>ßû|íÿÃÑòC‹Ÿ0v³ûÔ_Œ™”Ž›+TÐó(š1þê°†f>·Ó€R^ Õ–‡0?1Iþëÿ^å6¬ gjv ·½PAýʯÍï”2”Ü–¥õNNˆìÊÚú9ßÅÜÕçN‘¹@Y…¡áÊJôÞ ÙÙ¶‹v}v–F}}pœ™»¨ÑÊ¿)U·ûß±ÿìõáù¯óò/…K"‡xŽÖ·­'ŒÀ–œ .šÖA³‹ƒþJ—”9©(¦òs1Äc7˪Ùt„\MfA×9YÎŒŽ˜JŠó«®‹N²~¾tv¢Kÿ¸ú/ …®çŠÏ$Îãîãÿîço¿ï?óæ}µŸ‹§þ­çÛ ¯MÏa]RTø…šéqMµ:Ü/6Ú‹ÛaÇô=‚¶Š¬|eg’od:·ñ²ˆ Õ ‡˜ôè…ι>[XYñ±ŒQhÔÆ­²'‡Ï}1îÇwY¸\. ZÕ¸ke_¨®ã÷_öàB!W¾\ÄÑöƒèK?x“Çö¸<F’äú' ÅR.ûÝÆ¸­ã>PùìxÏÄô¬ƒC¶u6ت?¶ã“v-t°Ø1­0Ô‹héÒâc¨§Ãb»Ö©ÖÃVXjO`ÙAÈ ìºÙØõö̺LŒî\(Ø£Ÿµ¤×ªÖÍn'æ •;w‘ÓN¾7æèß9îýápTL³ .x2õñÀÞþæqZ;“@¤=´†Ëîÿul†ž~]Ê+¥+Ô‡Èm_Â?¼ Ûºµp¿Bã|zÈ_Ο.éóQ;~³òò¢ï( I ÛÅ¥XH  ÊMÒK É;YW¯<¦±‰5ݹám·8Ó³Ð6šZ&„°Sx}y½Bîj¦!|u~õ?¡]–Î+úéä¶eE¬›•xÍt×È"‡1ì½³¶;×oN^ß [‚M¼ô‰#÷ç¾ ;¿)¼ÇÛ¹IB9íÅk%ÞëúÏÜÞ¸ð­ù·¶¿)Fõ–ûôëè§"níËN|«½?O,Gðb𓵽v ^ºüÌÆý«/C•DìŽbcäY‘Mjúxø‰?Å-¦½xv,H©Q\ŒxÿŠkG® ù‚þpî-@Nïn›²†X?;Ý7UÝú{ëqjŒÏ€ÏÜ0#³9'o#®vÓ]fÙ/=Ê¥ü”ûŽòŒè‘G®½èfqœÅq¿ñ“u[áöìÖÒS駃©Õ/5žá]yè“Ǿ6?¹€.]ÝzjÕ*¤5#ü1>õîy›»Ut_{NÀÇæU'vK¤P°Š¢iCºn•lñžŒŒâ9¦Äö®ã“‚/qÜzB0\$D9èÎ’YLcºšý½Šù¶z(•{$~–ê‚]ÉaÛs{XÅ„4ÞžW®'ýò)š@ƒüØZÝ.S’™JοJçvëÑßõÏÐ<ñVŸ° <8ê—ˆ$µ¡G±+!!…“”L’-  Ù—ïxÜb¿ÀbÐ[nŸr±8 YtßÏÚ[œ=ÙüO&·.9,/p/%ºä“ÉÎÔ<}¾%^–O¢Ç–ú<§™ìÛ‹V*q6¡‰¶nw:º L¿º²Þ´ÏÏÂêÚDÎÈqyÖ<Ò›“CÚ1g­º)©§Ó Ni —-Ê)šÚÞäçsAkL_DÅËvj[¶­Û¬8Ím¼5”¡>Õàâº; aù@/²Û…l‰´tÂ38B‹¡mÓv:»MM ÌEùÄ¡ÚîÈBþoBWôg³ð ›êæ·@ÿÑUyù޹¿ß­NÝ>ökkóî~}ãßtgk¾8Uc¹„JZƒ›ÆvÂ5©R¡UBè J`£¹†b¦³DÄ ˆ&û]ÇÀäó]ø7‹ç]>ñæ2ÙBy80›ÃR­O ®òûlëw—24àçK2ù5ý<†³ÄÕª¼?-nØmyßZFJoÓ¸êõm/Ù»™sñúìäRyìÕém®-©Õ Žy‰Ø"Ø‘îÕñõ¹8ªÞÛ"­Ñªñ©êØQ—'Еŕ@\1Û”ŸœVØ -›Ó!¡ü8cQø¯_wø˜ÑEmèîþh¬Gë·!z‡€ Ðq¦àeipÉœ¦ zÍ?¾õy<~]Õb›¤à\þm&fá‘× CõÓÏû­ï¹V…àå¹nj12gÆUÈ\ †Z\šd€$ 3Ó©%JÀ—”› WõĨŽ>Tö>VçL]c)Üz.vœÂ\¡à!/…„B“¹MèÀÂô[ *mjh jü(i^ÎãöXçwõý2_q{Ë̳xs÷keËf­7¼w¾\Úå´O<ñ7±3 ß^ÎèξIm=Þð!­\yvI)éHŒø7>ÌÞuy¯¾óïÉÄÑë‹à¿É_öù¾›:=×âør žj×úêý¸ñ§óøàî±?N†ÍvûX'ƒRœˆNLæœìeÁa‰™)2ÑÝUe­Z5­Ÿ•…´àì¥û—ÎÝÿÐþOë'‡`\loË…q-"ÞPàܹ²6yÒ>|øç£õž•€†9¯Ð•ïe_ëúÆ2fn­ I!!A+†Ôy¯‰JtÑ2§‹†DqAh¤DBqê4臠 \lHÓÒij)Ô©3KtÓPTÌÔ¸ ͬ^‡½çgÚJ)q”ÂÈJ‚¡—àØf²*v ,/Žªí ˆy§i!R &ï¡U‰^Â@LHK´˜Ôà¶¥–TôôKW£d÷5ºsX™ð‚öC\zFeVQ¯Õ|uËKV–äøÑùÓeÎ;µmÑ•õLu{èg˜dTðê2Q%h¥íá'•—ɵ¨[hnKЇØÁ týÉâöÜqZ߯´ï¬stN¯YýF¡¬\\ƒ_RcHÄô1Œ†$“5ªhÀÔW¨TkÔN–Ž,Û½Ww:Åæûì ù©õænêQw!QD¢l‡ ¥:{õ‰¬”ÆŒ)zð&«=<•Gú/Œç€Ó‰$ sˆCWø/Ø3ÿ+üß"þMPjÇ+Ï“F¦}ò±w¦¯ÈÄË-rº7ˆRQ$§ûÚðß?‹°Ó"¶‘8TÞ:À4«‰±U´¢ª%ÃHeáH— WtÊR;J‹$N¸A¯„ Ž5±%Áár8ã¢'õ³l’ªE€•þ¿ÌÝǯÜùÑ×ëC§ŒÓ}>ÝS›œô°4ªˆÁ¨H^$Ýxü$=‚G@sŒ·ÀWXÛz/w&d¤ EÉ;ƒ÷ ëÕq¼c¦·o¯±¬øqRÓ㜉úÙy|Ø/Ù»àµÕÚ/¤5/“hÿ87¼4ÕÏØŠšÁ ÙãÄ'ÓdŒá¨žW‹ëK;76—Q³ªƒS%žÈÌ+M×Ëý¾´Íï¹­œ®µÓ¿5é|ýiÁç•l~„ªd_ﬤc³½,åññ:ƒææÑȯ‹°þuãcã·ê°—ÔokÜ3–µ×Ƹ;}¦%J‰µþõ~ÿîñŸþ̉o»Öî,œqŽÞMFEM{|lZÔ¾œÎ… ±5÷tdn(öj*ëĸ¥íË”èrñ`àGÕãÌj¢’"×òõ’ï7òë+õÛµõ놿s}ž×Ïýöîõó­ø þÉû½ôúBú‘žŸReïÀÏ?Ž¿ý¸øä|mV²JNÉ+®×ûº8—W T„K‘JLì$õ:L4EIe9ãL1)ŠÞ¿<Æ®å¤gIáU_õuX¥cÅ>Öl #%;R‰ÙØ;˜Ë‹ÛÍ€ZÖiMC B™~Êxî̼ž|ÞyÝ®7Í]Ë¢¼*³žV”ëôŸS;8ß}çè«lýÑ’C¹j:§TV!ޝjh€gýÚ²Ÿõ·Çí;Ï L=C¶0§^­³tvû×?2IkÌ[>‹ɇw;ôÎÚæPŸØQspÛë‹‹öŒ6Wkqñf~L~E6ŠT ²BŠâ¤âQ¹fxAÐÚ3…º KUãsÎ;Žö,8MˆUð ±Äk:³1 ü²,ˆJlS‚Ög¥¸‚¥ƒ‚t]#Ú-\5•GŒUÔ’ž€aŽ, þ`Û¤9Þ¡’ÈØaZ§w1£:‹yh?ˆ­å5  E:«cØý\“óŸ ìÅåÔ~[ò?CËž[ÝUM…}€F’PÛZ«É5`¡‰òcÞ¤ 0‘ ŸE+:#õL6+‰A@*,`síU-€J;Ä œIÏ,s`ÏÁU;ŸŸš{—Që5¼—…¯w}}ó5äïuxDvEóÉ~û¯µ'¬´’)µ×qKoSJYh|Üc­£šZ®bD:‰+  B;”(XClyä‘ш{°Oä6¬åSžjÂ8*Ѷîb# QÕ¨“ˆ:Líà‘V5¯CÑOÌ«°Ý$ö Ü­Ž›œ¶ Tau8 J-¿(oÂEø¡#C,‚ÅŽ·EòCò¤ƒð“et:rñU&…Ù´ÈbãŠÝÀ,hÇ% Q¨JqFBÐi(©Þ:/~—ñï^5ö™^®‘¦Ä¶B©t!XG> fK½f  õ@(G2™¢-Wš–ã{³RÙhQy¦-v4d§ïT†öc$úÄ݃ Q›Ñé¦}!çáh¡YÄšö •'Èo`¿ѧ$Ǿûàô~€ "bBCN •{Ó€¤pKþ×2O·©•nDçzr£¯ÿVh‹q@I5—–»~sJfŸ§ÑÖm­A=Ѷ›~.Vôfç=èßÞ,x´E×DêrÅÎN¿ü`þj®;éØ3jæJ¬>¸q(À vÔ`d^Or†8±óÉÛß1u}<>*”7•Üñ±(ös|ñ¹mgépÌêI懷©ªmi·N!W|Çøé Ë8‡³ó¶oÅä'Ún’Ù'÷8§ƒg@ÏödFÂ!ù¨­ýDäÍNÛy¼bsµ]v^8º¡]ºtó僢[Yö«‡~ÿ6~û©÷‘Õ. A.,WP¨tÕëãåÇ6[Ÿ3ñ‘_±°'ìØÞÁj—¢¹ôžt0!nµoØvc¦eem|c¡´AÉl&ÒC¼~ ™æñ7Ù—â I5—£È·!úÍoèD@ùà’è6 ÿ侜yùÿüL…ÕÕ kå£?°{¿ADzFC +·ÖˆÐnD¤e£@<k’Ï»s]+5^¶nÐD²`¬ßÏ™}Óv ^xé­÷•­/ @@Àð@è‹ÆQ3n—£¸Ó{›Áß•[}lOmoòüøG>ó›t í¨š?™~Q[Å%n’Ì¢ßùÎ÷±.oyç:HŒÇíùçóc2GkûèÜ:Ðéè#ÞüŒ¯MÏA& í†)ãÚoÕzoºl$¯R‡S7m·Ú®.LÌz@ãs¤­Ìj;0:[EÛ7ûñÍ:£³Rîoà£4ÿìÛ¸Ç7C‚¸X]ôSåõ–•9 c3z– îBYÞ0Ð ûoKö™SÅ»C+ìgÒA©t]àŠxeߤ«í%Œ­>~šq£özQ;”ç}Ðÿ¡ýo’z9Ï'‰©Êå jèóÙÙσ©é*7ëúÞ[çN]Ðõßmþ'àVk!hIm»ÞWcA'†¨Š Þ†t~âuA›µ{ÔÖÝËŸ0’¡>ŽŽ†m‚æ27\ÀþÙü³ÂùS ?9›«:ÇÛk†°ýdpþ‡Í n‚K ‰†Öå{ÿ›Fà`c_¥J¿üáka4 ÕÙ0 :L–ÙyöŒô£×§ãKóôjí–v1Tš¢!«À{w3{è`ësDŸ—æÑ”-e|Õ/]uDÀQ!d5¨|07TJ§‚ ÏSñoçâA~…'iß_ÿð¶KG~Øøüí!Ւݹâ|s)Ò®ßN?Îé)×ÍÜ—þþáåÛ¢S†ß˜~Þ8œ‰™÷Rnî\¹F4’Gok—ÇÂÊÖ±]œZì.u>Š×2áz mÝã±ÏO·6ª–|«}™e“‡q¬ÿÌKç?iýßÂR{ué‚D²ÚVÜ£a5: žî´i§[£š>Wý¬À d7½+ÛJÎòâÛËõU3¾•1­¤¨ ®œ:"R°¿ 0ãéN|/Ç+:„zÓÂAHx5‰îD €¥&QWÀÇš á¯Å¡*éÃgrá Á‘Št€ Ñ ÚÊa &‘‚’°Tº a Ñ2Þ­zlƒ3­È¿Xî⸺ƒâ GÇw˜ Î~£ñÈ·?ÅÆ¬êË· *°ÐŠím>“Årn4×į¨Ò÷û“Þ·²¶²kùc«z*š(…Ó¹c1…¸FŒ¾µß¡ ?xˆÌ¡Èb¥?(2âe6í#/y÷ì}bϳ9~±¸UYZ㘾¡3­¡å4V¥¹îBÅG‘æLµlu¹Æ·‹±¿ äįæ_¦ŸWõ'Ý­j¯³­ ïJu¦»ba_ûÉX°8}<}cvnçë ¹gîè8¹Sí°^Nó 301¨~‹øI²oÀO™l$†r\]‘¢- ¹ C6ÌCŒ%$¹Jr½£¸”ÏÆ–ìžÐZÔSçRËÌÆ$ ‘ wÙ©ÚÀYQ±Gùº6æúnò,:–Fâ .Š@ÓîMÁICÀÑ™¹/Ö·2… ’’³`^zÔĤ‰›*ÌÄôJ®87°_H­fe)£>pf ¦cy7!Ìž‹ ‘ØhC)‹‰éÍØ1ƒ*¤ƒR3º°j¢‘E-‘‰žú¬»'묙í¯Öc¡hÝlÎþ¿~èáb©rõ†¬Y¨‹/ºÒ^iÞÿÜœn_ûêü¼Ú9dØq5¸U®¡b¨ÊQmሎEÂG`yõËõÔ}<_·þG'ˆëþëzûí;ûrðYÖîÁOÿ§ºqÿ*ZË“iíU–Wya´¼k gN!¬-rl$Å>¯€Wº³Ä‘Ö6ŠçÐ4]¹Ê½”Œ|sI"ÆÒ”æ´²Rõ´0/´èF l.iUÇä¡ .&]„+ÏJï£Ì±uûOgÒÚ‘+üÝýϬñºÙ?7çkÁýxÒ,K m‹rI7dÖן¿{]/gãU]¥*ò’”I3¬D,ÈY§œlèå„ -#*M™¹°èzìÕXd‡‹¦O;;Ó¬×üs7lÕrÆÃCbëú!¢ñ3¿)Z² i94û둇rDH1A«ýjÉ ¥ŠéR\J*ht&ûýv7©‰ª“‰iXñ®ÕÍžMp—k9JR”F ý†s[¹!¨çíxêÛèëÔ'Á`¨[%ê£k0 “À¿xe¦ªì šE9²4?WåË: "W#ÉÖc—ÍX>×çMsé–Ž´Œ3 BPE¤Õ™ŠQ{Q'6È‘mxöÀÉV’­„³ØÅª¢@q]âs]ÿüŸCãÝ„Õ(Ö7É–ëi6g«6f:( “ÎKGyFñ2HZPd V½8h¶æ³@³èšž:¯$S'D K- :Fó?"ÿÖüƒž¨²7ÁΠ&à=åZ Q:ºrHªoX®×>™×ýý»ï?8_× )V?Û¤#ÝTÖHˆBÓ¡q‚PdŒR@©¨UÅY¥“t¤P%È‹D@T€‚• T*iSÊe¦‡ö²’,— I€úqÎ}•×»õ3Õ÷_^Uë½8ì) vƒ7e’‚ œèNlÛJ*GÉ)`•Y ‹N(|½ƒ3RUDiÍIp6h]'¢ïzÔéáºXOàl«íàøž½yèú£§ðû‡îÿ]Ÿš"‚ÚŠz&„£MgFÕ‹è<Š B¹ÆS ñGË~nåZ~Îù˜, q™Y5TžLö8–]ÄUå—ù“kE»ñ·ã_ß_þäΡ¹Ù~óªØ kÊâŠ)ºÜëBäÓe4‘}¼c}GoJ‘µ{Ñ_EŸÅ(8”¾V§æÔ3¸îRù7)þã>@º@vJ3÷8œ%Ä`Üä±+:ÿ°{ïVÜtÍîÆþ Êl´é”žÈ§{lÃЄsJŌ䎖ÑÎ`R“õ^.³êÔâX2+Ý’¨BfIÏ—j.ÿæÜ¿·òùNî}¡sMó³ätÎPöúß<ÿäîóÇç©Wþv­(îÔnÌÚÌ×EqˆêK™”ŠÐŒM÷ 51xfÇ8Ñ™éqS4[oópfþèà ­˜èX|ÑYs‚B²n½ 1ÂKO6ñ¢Ò'ÛȪn½¹wˆ—¿eòãQm>‚u®­*fvrÍ.ݳ„WYsX_E@>wR×?‰6õƒæ Ø.¿…½rª7–®uÑ#Œx![Xék/‘¦®gfùáÕÅøN}F>l~KþcáË/|³}’¸DÑæúé§ÇžÚj´«âz3¼sºz¼Ç°/Þ¹/…>þátcpO?I|¤àÒÒ:ó”Aøá@TµRÞìtÛçÄkϬ8÷[¬ºzž–´­\>­)Í y:?J{MdêžxÔ¥$"¦( . @›ÖDŠQubmqUÍí ¡Vä`­`gæº~˜UÀ“Üö5÷Ç ´ÏŽÎ¦O0• 6í^¶""ï œºn¹mÇs×\f×yß9ëÅ;õåõï×é'+®{_™üî¾^ù5\Êû}™ÿääÿ½íÿ§Ws=òšj_a<S÷±_é¬ô0Ôá Àñ„mt"’TŠ; —°ìJ×çã6,Dh€‰¼‰ðœ¢p—`Ç;òÄÚ١Ǽþ¯ª{2{†©mÜ“ƒÂÙ²Ãm…^À5”a÷NôÝÏçÄ\\oåSÜQEÉØG}ÊâÁnÚŽµµw‘ÁF ‘AF¢Ž¶ÚÄÛǶ—óQµz|+ÝòT ü)÷´ˆpÁ­©ˆ T4åDÆJÂZ€ØêOóLp‘¬8à”dÈ6…MÄšpIÚÇn0„ƒÓž¦žÃ½£ò•Öûæ—Å¡Á¶¨øýK/ñ}愳Þy:<¼K²%î—‰·ÍC«Ac1¡[“ƒEJ»6A˜¢z!*wYÙ¥m°±´ø‘.áðVžn©ÕlêÏ8û$š v¤Ô‰RìûÁDé–öiZ‘w ¨§#s¢Œ Ántt0[ÔLûæQbíÒ,Ì4øUÉqÓ‹ç~óÖÇPL£;qžÌZŒO&=T7j…š*ÒŒzAóásh‹Þ Œ½“¯Þã•ÜI3ˆtÔG3|0É3û€ã›°À\èUÿk?v¸8m«šc’_øãìÓ÷SUø$Hý æŒã:‹w¶ïV½—«=Ãû5´_‰z4ÿå%ýˆæk|Þmè}Ã|h5ÖDÛ„áú}ƒºhwÞT¡*_‘þó@\ !ëytTi{~8–·_õô™Ò¥÷Øbã'ÞêšXèÞÉÉÿ‡ëÜÚºGí)3{XMÁŠ ÎÙ=ÒˆzôX=æH–Ñ÷éÄ¥£]á9’Ó’`³½­/±ÙG3—ÃäHK ‹xÖeƒ %”ÛÒ;š{¯Ëï.›i]ì¹Ël<–õôo =”Üì.˜üHêFct»™´@5ÒÅÏ’!u¬B0›­Ÿ²Ó½’õ”+g<7*µN÷šÚúô¦›më4"•ĬÜݲ»· yn÷Íÿ´øƒÕì¥=…テºøÜ[AŸ_o”ø9.æ(ýüahû9v†5™uý&alÚöZ‰€EƒômËAâ3MœÀ>AE' N÷Mü¨h;1‹ü>ƒ¤­1ZuY.O‚ž%ov›6e,Äî ­ùS}ý}¬–Ïnê¡P»Â=_8œêˆñš“×ÞÜJ~ül¯Æ«ß6¦ÚHƒÎˆ›},U×: —^ñ–.?¿uýÛ:ÃÑè…²!±ocl*Uæ‡Ý­lй/~×þüà \hN‚zÓ…´:jÊ· ‚SiÞYâkWŸ·yLøM@áÜ©`·Ö0ŠÖ”&—Ñ8/&ÊÞþôõCx<Ýþ’ž{%£Vóùñuý%ô}òþ³<Å5¤µ¹(¶2Ëõ‡0ˆÙ3žýÔß[u2ò1nÞͼÓhM)Ž¿ ¦ŠujW±1é›VÌ×85ÉŽÓþéä7–+Çgv’AÕSe¤…Þ¬QKœÈÍøØC’ì@Í Ú4@q(_Œä¸ØÙ›BÏÚGè©j óQCËV)îAœMÕ-´Z/ÃÇÎ_5Z“LôÁa-U @f&’6U],ºÂ™  °Iž¡Mc*0Rkª0䦨hIŸ(LulÈç’®[:P,#•‰Ð‹¸Ð·SlæÚÕã <™èáCWËí?ÕûÞìD°c)â=´xŒ›_ÎÄ…Ó›ƒ§IA”FpÓü£Ká¶^ꛂùŠ­6«`¡ÉiQÖî5ù :°¥ÔËæÉòЗ“okqÑêiRÍô6½ YÓïåý¥zqr¶ŽÞ½}²^yÝ¥/©sW+¾¡[yªßž3¶!‹:¤}ü nËÙ0¬¬&¥aRФ¦î†ÞŽíš“baNœµbTÌ¥ˆKB\ÐDÓµfs²Yp°ì‡î z¥±x¹¯ÂãNwWß¾ ÎmNîÛã@¿Ä¸RYZå`óúš¬]0e3QºŠöa¦#«C¢0çs½u´ºCíhPOôìQEæL˜Nr¡ËËYÎÃÎwïãaïq¹¦¼ ó"Ñynó0ŠL­ÔÆlVåÍE^T¤"ä¹™¸ëñ˜ÂtŽÄ¸ y+Ó&BA”("DÐù…Ì“Af7ˆz¡-üÉûa7ÞÄNE¡d®Q—f®>:?ó åêÑ×uXÄ)…Q?WÎæÈû‘ >[@‹l¼ÛkœÔ#Û‰²±\|.‘P4t€Z-®ãìzç¬ý1ƒ=žPC[À Š”Ä4YLc°§ÌA_ÝjʲâK]Îív½êÞI uÖ*P_ÁZ]ïÝùcÓ'݇íK)@IhÕ˜»A§‹ÚâÑ*td„QU›ú24š4¹ÁÍn^aÍD ¡¾dð¸\â]­ÙÍÌ —jzf®]Åd‹@ÓšÊò”ífÙ^®w…€êÁ4Ì\ÖÉ)̆´JW9n}ÈgHµt@.`Ë¡‹U ‰Ô’v„ PØw"p1_< œgq¯ŒÀ(¬(PëB;ƒ˜ z›u(¥¾uB t¢'þÔ†g7èn:[$¨‚×V“ÛÃ$H”6b=‰ƒÀ¶F%÷È»¨-0ý äÿbµitä êìXšU%}„€E¾ej?³´»œ{Øœ3á‘bN×>~ÞÕ^¾ÝÐâ4¶z̨hÁ)÷tï®/TVç.“ŸŒƒm.6íÃtRæÞÖ¹g¦È¼t tÚÙ¡Œ3ΊR7ÉKáŸbd°Í‘®ÎpÊuØ>¾÷¥×·KKŸ^óK»”—ÇŸm¶ÚÝ›“yr“ÀøqÖï¹Ù«>ÿ.Ðÿ¨Ë©5P|ˆ×.&XÔĦº®²ðóo ë¿ö±ÙË<´\Žt¡Dº‰¥!HônÉïp:Ö/GŒè3×ú¾ž÷N=p-rŒÄæªqvNê‹L Ö3 ב[–uÛg¥Ð †aX4WÄùŒafçëøÏ×½éüšù|¡£ÄµWÀúº!¾fãþøæã¸ÎùæÍD}¤:òÙÒº3¸Žˆ¹¢ŠDé &°‘l f.”Æ6/Œ¨@3›Y笗I°¬”Fê7Îñ¨z’ÂHùŦZN¬w„¯Ãd!]ÄFT]ʶÂKùÎ é;?<Æã¤&ªN€Jz`pj”ø™$“#TL âD¢ƒŠáKsª:>ßuü­€#Ю/ûˆ1¯Û¿Èe^ù–øœå¡Ã-^w i¾ÏãhÖ#=×ë½¾…Š>ºŸ•Å@tc~Õ£úéÍ”1°C]Ñ 6é½ÙWí( Ÿ¼ë4qº8˜[Â.çí-¿EOlLCrê» ï.ž±Ð©·ThDl3Ìœ¶:6î NÒ¦xûaÎaN‹¢J£b€OÍ3å_Û¥—€º¡'r„”Yt±Á¢*$ô Æ:™Ž¤•;ÎŒ—¿ñuØ×õÞ§çšçUöè•elóöÍWù›Í¾Ûhîý°÷æŠû Dig_Í– ÖÈUzgç5œHõ—ús5ûãÕ½‡Ÿk÷Û¼¶ 4tgIòNé=îí¹ñ?¾»*òÈÿ~ ×C1‰-Ôû¸ÃeÉÕbV¹Eª€…ˆWTXK+°TYmʧíCÓn$ñUT²'°.J•<ìõõ(C_ð\¨q=úL|¢ëir¯O{P.z+ ÊTÀúÌd4áóªé¸¼_ÙêÖuÊÞÅ …[ƒ ¶  æãaª¼Î̃¢²€æ´jàéÕy³-÷$ýXn‡½–{}±×¨‘ÆïòXi L3‚# ¢ÔG=$!@RB ÷ˆ*‚ÒÏ ®žÅmy‚0u0 ’ ºöΫÊ+Çî†ÌR4'Q[~²lJ»ø"†tl ´†Ç¬`S¾ÖXõãIønFÞe¯’º_QøX…/ËäÇÏUYä\`¨€<ìƒ@ã}Ø#¥ÅªmvQCÐ iBužƒà§ ^¬nη3?Žl¾¶¯†Ãê;…&´ÁXdi€±¸pspbw5­Å3Œn<²¯¡©[ êã‰F@ä§“ÈÄýIÁÑö“D Ñ0€a‹ç̵ÄšÛwe…~$²á«Pšä0ø9Þ ý~{~Q­“šØ*&héíÕFëÙÓÔAˆa(EeÍn¦Ûj‘VŸSµEÑYþæœ"…äþG;ïî À™¬2cÞ›'×ò‹uS—Ç×Jœ.§¡ts;›f@š;ÌÙ˜ËÜÁ9H4F“‹y>Ï«ÆâÍA†8å~ÞIüt|WS-ä‚6ñ›îtg%å4g©òçå5§+‹, ¿|¢®¼j’Zë”;u-1¡fNY3tÉíÔeè ù憶\UÚjH™×÷N[\ª(΄î¾À£²”Ó8ÉÖàIóûPT=j•n«kâ”øU®Éz¦´U!´ÝøÎ¯ƒ*6¬Á©žÂæÑµy´„Ñ:¡ÆÇRó8¦eïî*M¸X.lI³¸ é¾)Brdl_Å+/¼áx~¿®|úZ©oÙÉÓõøYk‹Ygÿ1/û:NŠØÀtc¯Rõú áo^“[诳ä7"D$ÓË`‚”öèBvש)3šôF¥ ‘5u"âp¨âwx~3uuSVIT«t(¦ dPÝc…Ÿ [0ŠÈƒåNÕ¸ÛÒé»V€.ñ >ÊÕböAÚz°û‘ÜÍ 5C(e–1÷"±KÉ“È)ûvDe âTi*„þGWÞßãÇ1àš™€TdV†G2Bp`óøbêÇ[í` 2E1Úë†W¸¹šùâP¾*WŸàP¿F0 bjwÝ\´x'61¡í+ÞÚ_ßßÿtÚÿj%#™anŽ×›3mÞG.«,7^§; u¤­ºyŽKƒ?¾xÎÜ:ÚëÎc»ÌI¸òýUeî*÷>ï»óÃÑÎIªôEiÔ`©ÁS3,ámƒØ¸X˜/+Lô–‰«çU~êЭ˜äB¹Òµç¶U’"–R/WÔ 'IØ(s}¿ÞGõ´½ô\Û.$AUªëê Ya~꺡¡¢çÂSm³byÑÌñ§ynúcu}L0¸Ål)0™¤.Yc¿ùR¤3ab{Û'0„|Q$ Æ%Z”Ü-³U~~|çÿû|Xßk »á’×´(G•ˆö“AãúºåU)keyµ±­‰¬¢LðÝ¡ NÒ‰&)äCFA´`ÄŒø‹±àZPV943ÍîèA+D5¬ÀV cú8ü7ÊÍd1J€aÊ„}|Í|vT V Ei©ˆ¦z )æÌÐh²qßÓ½‚ø,¸3î†öÀA<àÖÁšJgÚ‚©J)¦Ø(›0ΨëyB7}ž3fÂSÞb©¥‘pc¾ˆÙHšq£¶ŸŠSÜÀ3{Ê|ÙÑR/ž‚J Ϲ¿Þ±ó(CjÊ1‹‚gT‚Ï:”Fêl“Àê|B ¢ü^›*P–c´òȔđdTZ%Jo6¤HÉhºv*Dfx'ZXë,ÓØï®rª‚W9"¹-‹2•™¥Ã’PÒµ€KAJh›ÊЫ-цh×â¨`ÂaO,„\„èR4ÂÂ:ªwPdWö¢…€¥#Á`DC«5FÆ5‚Â`äõéä¬3˜ª€ø5«j2†µ›’ÉÄ0J^xIÜ•~jŠÏ;¥CãÇÈÁ9é«WY=ôzëpØTÏÒµ^z¥¤ÍRþ¸Ùú×A!@×yüÇ™ªzQ6}Ì%Î`êÞwó>ÖüÿdŽØol3ÑR©2‹‰¤#øøa„<žšÝoÌíȘ—V»ù¥ž|ùùXgõx”§že:>ésꀩLd›Z7_?2~ò:ó{NbF¥„+òâyžŸ‹"”Zªk^¿~FÝ€}B–¥—Z°Nñ+›õ¥M¯.Áu~˜CÞWLïñy®ûKjÈó½’G/½'/ŠJ • “TSO°ÈJ Ø8¹u“á¥ë@Ës]rÉÊìåc GgèAÿàü£p£Ð(Þ( „gGr*ÍÑH§Ââĸ³·™;ëâaº£K3àm½Ts÷B÷ôǹîØAÆöý}T5ÊlÏVýF±«ùʇF?³ÍrQnÞy{âûùñüéÛó¶·<Üç§›¥Œ€ñ•çYî{é#yCK'à{–ï^ûæÛá’‹4–4;G®èK·SÑ“:.´æôë=9qù;o/§NçˆÎxÆ[r›œ«õ^y¢´¶“ƺJýÉ›Ÿ×ýgî—×k6M®÷Ì»¶?¬îµK0c½Ë_¿:ihG¹ß{xg¼Ünª_÷¼ªsÛâÛ|¯Ý›™Ì‰ìÑy/H¥ 5g@‘‘°»›«£,D,­ ¥R`üOÛµØÌþ±ŽujA¥º¤ ›µÕ£†j‡¹Z¦¼‚*VT,"ð€˜QB/²²ŠÀŒÃC+E¿¼|L,sk—ý'É2¥&ytÏLîzwÔœQõëê†^Éû©ßÌÁÏ-"F½ejÓ«UùG¦Þm #&3#¬ÓSÇkÒJ@å{õ«\WÕ·n¯ÉnUau[tG×ÑfÜNí•"ÇÒÀ^J¤;SÀE$õ€Ï{}Ìݦ2éödPGwäAIC6Mo+¥Ùï{ÏïŒÇ–^³››i­=I‹J–§¡ˆ¡•^Hæpèeñ–ªp@´d׬œžŠ~…Æ›_ŒYB¸]é_{€øäpƒ ì¼¸ó®£Øî郟Ñk-RÒ1´+£Øï$keçn=æ ¯/#íÔC{‡ÌT%çæ¡,.8ÒíLáßgyòÒî Òí 3ji%®6šý…Þ8%§jšu·½þè¸ =Q{s¸È`€B#4ãDuìáòtþÃ[H_ptWé+œ8qU#µfRÚ?”DîÂ/ÑeuwÜ`1Õ¡]#Øó0i(sE"-ËPi"¬CÁtÃtK6®Éþô<ûk~þ\Ü·ÍÝÁðW?ücz ¾ÈômwÏDT¶ªqÔ^§ÃÕ1ŸÚüþä’`P8Îl‰ÀIù¤®ý\õ vU®Ié}ÛéTFs‡®ïµXÐ ZªðÓÛ3Zz=õõTA¨^ŠçˆÐN¿+ôÞ»¯q¯^ƒíxýãV˜«¸Õ:,~wÐÛ{*´U ÉŒ(5@Qì#µ xlC±é½‰ûæb÷ƒ&.<mÄÍŽ]CÚ/eïô¦¢~Ù¦Ãû±œ|–Ñi?" .އ«s=OûÉM…åg„Ó7~Ô³©(Ê›¾ôÄGk3œh .öYâá›;'üh8³UTíØsÙ£xºqkG·U¶ß§®ŸÔÖ¥®›jjx˜¼•©4 ÍÑ™Ëúí‚ÿZÐï%¸Ñ˜|=Õ£¤Ý½a\z‹JÆT…©€•º…¹´©~žße·¯â—Ÿöîòù­ü|îÓÎr¹ûòùHŽÈÀP}H£']óéˆØ(ÎéÚEÇÏü ¶órýËŸVûsDŽ0F_ŠÈ÷ܺˆÕoÏO—ËÎëi[ /zgdÍ=ÿ xá¤,óûßÖ·{;}»ò-à #€m”Ú·ž:¿Ìóî}¥ü¶¦_ÞÁõÁ¿ÁÀ"¶³s;óÑ·¦e‹RåÙcÝsx7€µ¥ÁÉ/’ò¯ß”ÄÌÌ®yr‹ºáɳ¾ì­HpZxؤlºÇä3¡ÊMŸßVὑ‡ï2/…n?ùÃÁü˜ŽßY–¹ þ´/Ðijé`÷*µô¹ûq”í] Ì>³~H¼ Q'Rúб/{uÓô‹_ºµ.ha׿·N}éÞëö—‡ì/ê~G51™!ÇÀ­BßÚñ`¿ÚÒhPDÓ}Kñ8¢W6¼Á?È•E6*Ñ?‰~çòvÛáˆx‹^-âOAJ; -:H$BšÿöÿÌ<Ö‘©t(|ÑÆó·™&&´Ö3þþ{Ø&{d UŽùE;úÑ&û«x—ïmi-^êsÜ6ÞÀñœ]7»‚zQµÒZ 5é/8›ûý,‹I@?¯K)T)%ýé@~@®8Á^PA‚a~lŸ€<ø\×CkiŸûÀ× [eœùаÐxxHâ­›o÷e^Î̃yDõòµ`Zœ²¦¨Ì%M¶:½ƒýñB&G)ì;èQß®¦ªE#]¥¸BÔ‹ÎL²qe0üM/ͪyH £gçe}.~Ïqxh ‚¥§ÉÐMÌÕy(R ³¶¢€0f×›Hå< ñšu· br† ŽsX(dÚÉ °ÓYåqkp(í*D# ´iM¸¯xŸ&Êñ€I™âhÑH“Ð ×LL÷i@)òS—Ç<Ñ·gª—Ÿôµç§V{•ºö8»8v -N¦`*@À0Få+ç´–:+¬:™kð妯 sã܉ £ÈBd"HrLC"VpÞE˰œ„.é4AùXdû2¡"†hiKŽ€±#°ÒòZ°aDÇ(Uº·mw…0œØ¡újôÒ³ÁÅ“üúAÕb9h ËÍÁ„ õ¨ëlì¶ÄLt 3ÊŽ3¹&g¡ë•N*ͦx…çegy@I”À=‹ZÓ‘iU=“ УcF"ƒaK3,"Dí·•ÑóSÉ•F8.¸â¾ÖËby,MŸ ùDÉÊEtø’ev6¬ Îâj¹¹À… ¡'纗`§gÍüiøyàš,ÌMrÊß÷`WÏ7H5±€ ´½2ÈÔ¡ÁÁ,MM ÐCésVíà¯ÞSs#;Cuà²X«@ÍGôf'Æ­&¹6èþèÚôäðƒÒÂâåÈèmœnÞJ8ËÑåÙÂò2UK"6yf ^Þ_õ¦¸õK½]êh¦š°¸îL˜·†O¦à5 @í£¾æzªøX?ÿîê¯×ÓüD^ŽŠÓ%HtxbN¢hšÛ"&ÑqIÌDn¿×:z›’ÿüí§;oúìÓû×kÀ‡ òÍú÷FêЊ> çÜãx²:½8ö6(‚rózè7ŒSò®Y¦Ïƒ Û¡©Öõex–ŒÒ6Z«?"¿¯|!·œ8œ®bA(Š!O d’5Äõˆá½4Òp[ذyLFY`=¸vP=(Zì©ö³¼ÍŽ.4gñÃ0¢3^ÒOv'j B•$I¥X!ÀYTÂÉåx“­\™üoóë[O~V§Dw”«’©ç¨}U3E‚bHL X éhÜöoÓ~¶.TvÌñ§æ×ôƒ(/¾’ÖZO–Œ¸Gë¤ ëà@f’T3þ •!¢¥@ŠDNq²?ÝúÕñŽßø™+N„ƒ´]Lõ‡}ü¥±;¨7\PëîzOÐi=¯¤$’Eöp%L3–@!ƒAj2M“9ŸÍr¯q¹z-ĵ„ja×Í%S˜³ .¦/œn‰ÓcºwÓ Œ9.upMæžEã R¹ÕfšØÛ¡¶NPÉXçu^÷M5úv=ÛÜL.›ÏZùý={2ú³ ¡2‘1Ldªcü¼9Òµ¾àZÃÎÑ“†Öì:áçX&LhG nÏÍ‚§Y„×1ÿÿ•ø6>ÿ“¯ÛsZY‹Ï}œä3¸eäý­Zz>Wt•–Ø#â»ãwÜ_@¢¢èÒb&(PØCŒ1 ˜2YH;qC¼Â+™"ÓãH²! 4YÐ+qG›ä•ÜÇé]!›™A'IX™jÇš®CûÛ<ö¹a­ÈõÉó†AȬ¶ =Iµ¶µzMI«Òª#a¶¹š¸xfGu(AC³ ·UQZÍSó>ç½ë'}šŸ’;¡ën–è7ªYGˆ01¼‚Þr<ºHnm§õŸ>õküá?j@º>¸H#Hܤ`š Eºcpƒ¸Øó±çí7ðŠÖµd G€¬Æhk_cÁ))–UàE Îø¦{þ¼¹×4´n–E.nplñrz`Á´ÒÎß®æ5ý|ïì¢UŸH‡õBµàR§.À*²3©›3qEž'Q®;-Nõ+«³U‰›Èލam]gÊîÉ.œ–½¨íÖpT#9’‚ã~ªweg¯xõ~ ˆ7ˆåÔ-2\Z”Rô²žÎ%83ÃØ‚Õ&EŠX–E5KV5)@¡¨²j9xcT Žƒ言ŠǪËv½rˆÜ µ·MëÞ œJ‡Ãî³RÈõä^ý®" ;­f²þÄ,dz9د!kE5`(\µ0¹­(’œ5Æ „©wžTµt “€_O¦¡×žû›‹qÍͲìÃV:ög\×ûìhO!4T`Ôt®Ž¥~…(¬àA¢V=úôÌ'°ù¶ôŸDÖ;dgAÉèÓø, Ž(´™ d äõ–û<ãÚÖ9›U䟢U}~ ¡§;3Ûš¿Oÿüµh¿}’¯²þW™«oò~ÒòËNÞ¿˜?¹óÕÁ£èeY¥ uµv¾â–y+4eëáô-+ed/ιol—_Ô5S/s"|Þ®ùÕzíèë˜úe5ƒ‘®÷mÚžfîžÎÅ“<,µ\λ´?7òЋ#Íéfµ/V{¤‘-,‹°¨*µBUtDMÍøÒͺȲ©¾Ô^_²T ®/_×2ƒ§J!œFvjæFÒn™Ñjù`â!®œV[»Qdœá»Ú›TlKë8…Ž nüüЉùúþ©•½ì£–·°- ¼‡;:#'t6ãúVµ4m]ÍÐx2^Ùʺˆª%…šõ´íáãsMê†q@e± áHÀЄ™IÇÈ(³² LÚ”(¶K»ÒÜßM\z>±“ý½¿÷ü<3¿¼1ê?ß> ÓÉÑ BûÃÛƒáõÉqñx|8ñ:|¼œk,Š›CÙÞéýѼÀ*I‡ß¿û«þð^Ý’—paÆtÇ%—·\¯Þ÷ž¯ãj\¿íÜž,ð#´úæó²Ÿk“,IÛÜ/Ó‡†4Kcè(L%6xÜ„ue ÛÄ{*áxÇçÎy–Ñ’×Ö¤ûÃëÔ„ÚÙveJp &VØB'õøÂR×±™6æ9ÎÚËý¿^¤'9æL'%N ‚^ø8CËŒ BÉ‚…*ŽHEŠ @)Ù™€«•sÁDèÐë™Èñ@'Ã%‡ûå¢þòÔëTæø@,i=ÙÍ`LJ÷zW<é~ˆ—@nE<´5ÿÓãâß¼fóíVKNk'èWu¬Iëš)(À¤yåb 1…mÿ<ÚïÔˆçêZ\Å3-‹W×Ϻå2Øq[iò4'ŽëŠ3hé ú¬OwDu¢W2˜­ÿÔú]Öú@leàÕ2˜†Kf?ªhår𖆫”éû;ª¯ž.ï Ó9ˆ4©@ѰÛ{/°êöÔå.–®ëê-ÖÈË'vë»Úßï/_ô:<;JB†'Ù*ž~õ>ŽŸõÞí‰|ÉþmT¢çÛZD9Û §›IUišš"TKéP$$ÔØšÌ2£µÌ²±/ÝÊo}SÈe"vÈw÷þ¹¶§Û«7¬  ¤6L²ÝãUFøÎhîÃl™Ýæ( S¥õ2•]nÙ0P[n.5»ÝG|+…mT€Úâ÷á‰Q1éËKVv}p¤ Û¹ù&E`ÛÕ齉EƒSÉ‹‰ç…ëh ·FE w9ø:݃ˆèN¨0Ÿ ¶ þ©×ô·±ý‡ØáÁYË}µkÜÂrÇ0²ÇE}º«?&ô¸„ÀÖ¢0³[7W^Éë8š`?dYpà â¯SýrS^å›uCrïÖ¾>ÎsŠ\!†QaØÝ“Jýв½ÅªççC?âŒ×íágõ}¥1Ý#í¨1`Ú‰õ €…%íªŸ¯f{wV—×'ðléßÝéñ6">ÌQŽg?õ¼†*h%¼VZ¯ëÉ£ñ|²GÓ1‚ªpØ`–1ÿÊÙ÷ä÷áëúà÷xÃÛ‘'N9ê’$8¶§Qr9–Ķ¥¨áAcß’ï¯û‡7¨ß6"nw‹ÏÎ\³üœO´%¢Ÿé6Ó~õ®«lš$#“ 8‰6KÙùìæY!0Ÿ®=v‚ÜÐ&úåxb£“5ÜÍŒ\ ˆ6Ÿàn—ÿÈ[Ëû9jùœWæåÑ×ú-‰yé0£‡ÃG`xys¦9rÀÆö¾|ãƒ^Û°BçSÔ¾+Ò›y$Еß¿{‘·C}{+^‡¼Q×Ú§$8zƒû1¯õ,ð´ŽMáËS]æþÎ6î‡-n %`öškôÅC÷G©b¡=¸6ºéÔ‚ª+¥—Û³ú#¿³ÆßsðÌÊç×ò÷ ø!üµÐúÅ8‚*5ñ9ƒGWó¿ÕðLü­ÐþËüÀÖBûêHÞ°è™-ïäü\Œ´â£qYÁÒhuVtë³£êÛjäÊ5ZjŸ[‚VŠù‹´U¯‚g»Ï¹-Ÿ¨8yxOÖ7ɰsWû®ºâK3hãb뺙P̶¸#r¶ñiÁ®\C0¢ñ{ѳÓ=;ï¼èæ'^J:½ŸÕ|zIÙp”¦)éGDËf&8Ž)`8¡‚ÔXl¿4~¸ÛJ„“pœD*àòn^~Ž8¾€ÄáV5ba^`{ÙϱSQ¡H¼(šCFaCvÌ\Õ¥ºAȨ¡º¦X®N r»ç°2c/º@vQ¥Ö"©0²Ek$¼+)4ÁP ”F¶7ÅŰàZl™•)°‹YV¼äÇh´S÷|^šz…ÙVn*¡GÌ8a‡¶²iÓä—MŠUáNE߃DFr¦ÀÃ8ȈÐÙÇ*Ê _>ï×_Ž…£‚è·‰¿búo‘¤@FÃD†™â&6Ó ŠÀ˜h7×´f)5¦ƒ0hRFíª6ƒ›ªÄW²gTeÛTƒjèÒÝàfÄ_×í¶æ©$a°J g dÍUDL`ä Å“ØO¤‚lØe¯¥×è£ôæ´ª·<0¤ŠSôW¤¼2µ«»Â¬*ª‰<®wcÀü„v²Yåó¥`͸½YF˜¸”§3«¤®”^E-(oàE^’ÎøEžñÂô™lÈH,W<7W€rß_P—'ÔówëXØ$&Î@÷×»_ºµm[Æ× ƒVø–ʱ,J³fÇD&nHúFtÐ žäÕô^©n¨ÈœÉ ÑûÈŽÓ]CRXpí¹{»F5ßWŸ¹§¬^*LzíB³_†ým¾è걉øÙ~&™«GÆ\ fë8Y¸ê«‘ô8±C¾=IL©âPui|Î(‰ŠÄˆÀP9–|÷nŠ6+ì‘*Æ-Ñ.Û*5×Ð5ø±ªœÅ_ŠeÌBMRàS™cˆšj°Õ²FÄpD(UÈbfœ˜Ó?/ÿØ›ZÕg‹½œÇÊ}9:O‹Yf˜ V(œ48žï:\÷ûìSuMc/°6ÓxÂõš´ ·a,ET#[BBß즭0\šÒd—†áê6 „uâ~û1ÿ3ÂÛó]±ròØ9'iÒïµ¹ÃÞJ]÷4¶eÅç$¾ßO!¸$x°(Áá%!"ÓälScÐp|üGׯ×ô9p‡Å´¬Bº€½LÊ¢DÏ;éSA-U0‹ÏSrÓ\ ÇSñã,³ZÉËqŒ=uÎ4Üe`ºê«:‹z$ê×[3j€Ä$‚yóæ!žë¶öÕrñªvi(0‘Ä@÷ &¤C‡wS?ä;»¬[¿MªC I(gryŸŸ>RCÒòµ=ÿ˜Õz³=‡Á,°:AÎl×ÖÊ´J°fz¸¶¤^PEE ¤ˆI÷ŽAâTõ‘z̧X€‡ã”¸ˆ82 ELKÛbFYÌFd[ŸôÇþßç½ÿO~¹ß"å:=¶­yl_ßl“œg-àÑaFð°šjQAì®öõâÚƒkÆÉz¼{?è\¡}®)Œe¼ÂžÒ7,©edEF¨\H è 49ó[,ß?:î©óëuì 3AFóp5Îéi‚‚F}ˆùðÒœùí|ÀwÐMÙ¯ÿž¿´UÚØ9Ÿs©_ìG‡¿<œÇÁ÷6›¼ìy©> O˜Œ+÷+AÉ–Þóó¹=Ó®¾¤æâ~Øxw¿°“Öd,¦R˜XÙŽÔk?P Û­úzÇ­C&CFYÙw~›Gy—‡in ë0¢ËnHQÚÅÍl´•žæß(î¾õþ,´Àà†gCÿ|û©iú±rØ2nÝî:ÉNs|jV~Яa¿ÊñùÜ«ý¥¯ƒŽÝŒÖ0€;6‚‡¦9 ‹¥a6¢­×u7Iwj‘ñ™H]T)¦Ð­¯,ztSLMÆNÅŸ1+ëÎÀ)ÑÚÞBwf@’d$ÔXÜMxÏB(8¥OѺ¾ä›M¡iÃÆ©%m ¨·R´¥«’›®Ï ò}+;ÙÒ¨;q­ñ:]/gÀžwûû(§nÎU¤2 N--2s…oížçìN‡)°žBí~ÖÑU»«Î2†¬vï­Î6fGЍ*ÑœÇÔ‰EÁOðÉXjÇ eµâç5÷³ž…9s_ òý|'Ï”_.°y¡ñ¤c\)ù~ù=ìA[ íU\´j!¡$òÉOðÂk OpBjDuø3uýíOÿÌÇùž…ƒàìTˆ¯uÄÓ~•Ï`ðӎꪬ­‘ýß?îþ~U‡ãÉ“»3U³w¹Ê„#޲Ùð8ó%¼^X~¿þ@æ‡ïˆ}Φ+{I-$x9åÖdäнY»úúÅ܇›ÊÝô.Ý#@»†b½·3kXi„®93(1¾µZ¦ú¡ßjf“¯&¨Ã…fèŽÝX31eEld/ÐsÆÊ¬k˜;¨`CdDá@LmØ!ÅŸ¬µY Šçl—¢NÄœ V-* ©)\®Å«TËR” £‹›_ÝÔ—î­T°C'6ذ}9Á­ÛíœþÏÓÿÃ}¯ú®>J‡ñÀø…E.e‡hk!«£î>W- ?SKBá#Dª[i¦ãÛ±ž8—IÛ~˧á|Ì…Ð5ŒKdWö:VO¤̉…ª[¢+©¡À„ã÷&çûYä6Ëéq¾ºŸ€°!'æ Mˆ­†³$çx"n¯ÐþaX7{×ËÞÁ†(ÕS/¼ ‘ë:챚¹ž•Ýî&X…f¨N™Çw7þ,¡oʦcbg6<•{m÷+öh$ÀC¨s­H&0╳‘ÙØ¤[;Ù ^ŽD§øíÇãUdF–q™7©—BFC¬-Ì­ W5ðWûUIækÖK=ã! #îÞUå¿Dþ;ÿþð/& ‹ã‰±àAâUí *ª ¨bÅ(@¬QQ{BQ  eÏwÃÑ2¨d!¯*Dµ*C)qœ/画€VnCª&ÚAoú¡Úü¦‹_½é®FÜÛ¥çiÿ!ÍýJù|}\¡"‹ÕKº=“ M¥k«¢ˆ”Ç¢p·¨úÇÛõû_Túè^YV±–k¬±5TÁß“wž’GZöÊ0²â*LжP¸’èÅJ`¥r!‡Úè^íÉLoVL—‰½(Xî*Žf†;(óØ;bänº¶g'4 Ÿåþ”òl’ˆ#ôVÖX¢M1°Y„ö%ퟋºwô!ïÒa©Ó'Äã¶·7œ¾"½Z¹$–Û+¶ sì²h[Ž·Ÿ^Œ¨A€·¿{7ÅóFz@zý»¦~B÷?›w‚Krm?ø#ð³Ã0¥3·FbÙÖgÇ)Ö¹(ärñä#6T æ1»É>G ¨eQ:/gÛÃ{„ôÌÊÈŒiØ gX²D.zS7%vX¿¢='éBXlŠˆ”°/7_’ÿÿ|ùÿÉâMÅávÎ,b‡{Aʈæ™^À¶ÇIÒȾãPdJ‚:Ôåà/Ídcñ* Dwnó›Âû8ZÚ=A]ÂÔM–œ¨_Ö—ö´":|8×oVßo¯Ûž×¨b<æ¬ízìͽ£Þ ¥­é÷DÆþÇæ/…X"oQ—EÉMkÁ4[°jl¡ø·VýÖÝÑ­Ç<•¼¿}q|@¸4¦›pZ° t(„2r2~ r]³[¸"E³Î #é£~¬Ó—ó•äðåå€áKX;…!Ý`·rHo¶üzܼ­ä!B™Dœí6&î-1:ËÐ2b["`ÊPæ8ߪ¾á›z)tHpq«G7”òé¼nU x9½¯®'wÓ/Æ~ã–>φ”>c½()Um+B¬ÚÙÍT2 ›i–ÕOí@0öùŸHï—m hé¾”7gêÃü_æº{m:F<ò×° 9I6„¶ àÏARI,á¼²÷ºÏ`tjOy´”¤¦M–mQZïjvÇ—oT’ë9<دz|ÿÍ¿¼“²ÜZW9OÆýÐD1"RnÝ—â¼r]ÔÛ UH?BgÆÎ>úð¥1_À/ñoôÆ_Á:uIE¢ìãl¨º CXÆ®³‡o~[r Ñ‚Ñ.›ÜRmÈn{†Ö&—»È@Ú>Û¢o,— ’¢Ä)fï¡Ø‰ç~üyüxÎÛ¯z²¹ÙüÕ§úi"cžNm0 Œ¼™ýcãç$aØn<2´ÈB]:Á¦žx XÝø-°o û\ó)y£òq×>©5êܘ÷+‰lL¿ã±õStü6·GkàôdätN˼“Ôxr¤ø%Ï4NþäÅ¢+Rm+.®˜û®ó¯zfóô,Ÿê¬b”^¹<ź1èþ˜l@d¢ï7ÖøÓöQ…=ú»U6MÝPá¾Â÷ÿðõ/ºðŸ.z9¬Ì™x‡FîË@a–Öæ‘Ö®@âüŠ™Ó1ñ‡Ñþ¨+¶DwÉŸœ9®|=ž§†{¹ž*Þ‹«M[–}ÿþvn·-D­lÓ¾­Û±@ŒÞ¨ãR+},}sÀÁ•^õ½‹ÃøâµNljè™ãƒÊþÌüè{œ~¬w#:zÛ!ŸmŒ8T×Ä’wÇj™Øq‰ù®ÏÚºú‚—`0Ô¶ñÎúàÓL8áXˆÂýH3F2ü RNCÕŠ¨œzvf2]Ö0*Ç^ëv3áïaŠ’€† ãy¼ ³QÃy’b©oœ|Œ/BA„Á³7Y…°4t ‰Åét †‘Z`àq^-&sMû‚PÔ¥@°eòHáÒâŠ0ÁÀu8¡-iÙ„&À0¢)#Ö`(2ˆ†k!Pž^µ@Û 17ÔK0Ó?â57 pUH˜+ >±ªÛ"|Í?Þ)—ß^×ÈtÆ  }o{0­03`º™EÊð¦€a,±EPªBgEBS=žo<ñåë¥È¢òÁCÏ_Žë?ßwÞWT¯A¹ð›D_YÎðÒ¬"T†tJØ¢¤f¨à±‚ %; hD¤Ä0!M²ð€Œ*fÅ1t@£”Ü’ lcYZJàÂ-‹Že5LÀúææ¶¯ßt>šùçï,ƒ´³“ãTMº«ºË¨RLÈ8Ôú³®š€Fœ¨LÉ#ZLä®Ásé,j¥€ÙàŒž ïÈÓ”Ñ~>õŠõÎ|í«OÂ¥X®¢÷TÁ¸t |#-EÒª ²O³£ilýªaFßäŽDa$Wù’1ˆl( †Ù†PÔþk®ûůß宬ÿÐɘíá4xµUKÜûuåoG"JPQK£zƧm))+jh&öy‘zD&ÑÒŽ#ß©¯úÜPœ¬É9:¥W,We›•øx8áðoù. ²Æ ú+n¯Ì Eá½ï¸ 5_9¶Èvp ùåšàŽõêç®ÃóC%ž ªE¦jX9!#¤ $,p«¾[€Çùäè·{X̧®idÿz^7«äÅ Ä*—óákð•ÚíRæÕÐxêYŒ,o¨Í0xú‰õ5¾ÐµÀ”'CõWŸ‚fÆýë«þh}~9u@+Q ªÒJÆ9{jin¥6|IDŽ^ô+cG¨ã£þ¥‚¯òkd‡¸! £)ó§‘T5¯^|«!ãáà³ö—¤* ‚/@.JaPjXçš]TCÃîµV$l D„²Ò³‚,.)½*žGþvYœ¿`O:Í 2†*•Ö߯oê'­;28‰HÉÖŒ‘dÂCŽÏ;?æn¾ü£¿;ÒÜ—˜µÁ­ÕãÈÌä$l@Çœ;&2ñØõ°FX®Uåq)e?3ß SWw Ù+íFˆÂ Ñ|,ð€Ñ5´[ÉÊTU+CÇÛC¸¼ ×>c1T†ØÃczkŸÎ:TÙ_m¯«ð&ZXXQãœÍæ×›’À‡¦:’>7¹J¡IY/\.³ªT+¾yU0/•=p¬'ɥϙª'BU¢ÃÉçÖh¬ „iÏË›jŒbLŒŠ^h^lá*iÿ½ú³Û|áÔÂkú³% ÅЦÐQ£KMÆ{pa•7Nfšò“@oSN(Òø~×áÌö{ýàýÕOäí *YÄ‘äxìþô°\3ƒwXxGÂB´I²TZ{uR%«žŸ;ÎÍÇe"3ƒggG1¼\~(¹‚B¢“?§yOt'w—ÿ‰££‚Bºèaqýè^›W0qxŽÀ¨¸RÀ‡û|°³oà›Pw­8U·yuÑpÎxRoÏ•þ"£IžÅÉØ«¨EL£>û  ¨TØu¾–㥶-Xp ™+ÛZ®®ñÊÙ¢Ô‚SÙ”Ù tñ¡°£Gòc)võ ^"Ï÷ªqݼfEâ G)"iÍÇÀÅúr} »Î¿¯)ÔÛå­)«T f˜ˆÐÙj¦C Ýh–d£Æ8`ðšS"­„?2¿ÔoõÇá½ Š;xç0&ÜJ3W‡Û³w[3„°ªÇ:Kºh{û²Å.5ž¼§Ý@ßÃ%ãƒü çÖ3]ä]îcS¶ÀL ð :¹3QõOûûNËJÕýß_ðYñIUÖHÇX´2Ž/J& 掦™û|ɸ¾¾ßæ«(lÁ!,R1ÐzU·dJªÆË«t5*¦ÖnC šdJ£P{¡*[UiqLeÔˆ¢Nmí4e2µŒ"EFflaàŠìD<š-Ækf /§­Nêá»ü%/ƒYGy?wu䔺öºŔaúì'‚çJÂS~æ{99õh´B?‡ÉžéêFk=;ǧæ"š Ïô®êk\!¯Œn¾Á¯‘Сy—]ÒÛ⫌@³í>rÉx ÷2CÁ$é­Aíƒ3¥w4ÒÚƒ»E+ ¶/NßÌUŸð)ºO¹F‹©??ŠŸ´òÐ/üøvëZª '»Ì~DèV’4Í Qç9ҋОöŽ}ûøñ_Ôo_¬M/N¹ØØ Îüðüœ^ãùSÂù®$;ô`ŠR]õ¢¼6ð¥¢?á×ï‡jî#õ<âAõJå¢6q4Õbß)Ýß·öj“Wv€×ezåÚ´rÒ¿eŸëázÜç½íWä»Tùúbq9.,Aif ´‘ò4[zHÝ™nyÁmP໨¡¬zueµ¾ ëöºçVdÞvFåBült]h@$“!Œ½P"c`$##”–®„%^º~Íùx&åj3nIV¨<²±¾Ž¾ãÎéèô‚z½b Gñoá…G¤ ‚È® òà?à[Û`›NêgåU1&`êƒO E® ª6öýƒT-õz§J¬{0O£¨x^2s –;ïØ/<8+~(kþ¨St‘P XqÄbª®èŠlåO0™IM«Ù¸™fâLîü}»Yj%س'œŒÞDUµUƒk«²Fg’¶1ÆC6D›5»¬nsÿ0ßóý&GMï27È’nS šQ!À@cFAc”Ø -Gûü¡ñ?½á*Ž[ç.* Q–ªvôH’©ME€ ‘×·";õìµ/™%qÜDZT¡e¢»(*µp¸Ç}süi¾ ÐñÝ?ØÃ>öl7@ Õc%¢2ÚYÂgªìö+èHKq³r­‘ö¼?OŒ{i{¸‹ë_î±K RêXÄ*^‰ÅC͑ޟÉëM§•\²#%Êráïä¥#0‘5 •#X²r 3º´ØÃ1ùv4EiåÜ  =9ÆÞû@Klk<Ôùµ× ãõ¼qÜõ!EhïhÛ`G0 ·Ì×3+šgĉ<¿!=3rV?*ÄU…-É2LBÜh °” ,suñOyœ] ü0€A4°wàw0ß}îÿæõ?-ê·©ö>ïÑøKÈŠJÐc*!€ƒÄvzÿ䀨 Ë#5šßB@u¬P»žé‹nþ°oœPcŽWíž%Öófa›& ZŠúRú:¿æt9Ê®¡Æ|ÆÿÄê²êl‡^¶½7¯ZZyÞ±R…\Ýý£ùìË]žwýÌë0[3W\õ“æË4F–æ2ºQ ‚}xú$Õöòî¹½àCÑã«úØ`̆ dU ¬É&š—ŽÀ%vs—¼kÓaÙ!i `Ý a<‡˜fçKþGd¯ñàÓ.ö/:5AI‚¢ƒ6OË@?eƒa!¶ÛybõÂGºIˆC®ÍëôÝÒX=$]F`CK´\ùãY½«L«p@cÚ"-xœ·îÛ¼² ï)6ó¾=8"Üð˼³/(ˆ]÷ÏŒ ˜wëAÄ”ÛeÄŸÐ/åûœÑŸþzðøå‚6 PýI­6¨Ãr˜1™tò2§iŽÒbåfÇ1HH/©ažnÓZâc×ÖÀ†EUÅnÈh,•BȆæœäênïàØí.YUg umƒXÑI‰ù‹¼Íå²s½Ûróë«ó<~Nß[™åsãÎÑx·ÝÕ†lén³Ò×òÇÚÊ´vc^ÄûoûÈkLܵö!T&~ÇÜeòY}$ÞønÞÞâð}ð¿Íc€ùSæE†}aoëé$¬¥ú½ÑRCº8€©Ëèä™ ¿ôC#gÛÜ&ðaŠAb —bCwZBY8³edkå`å“Óõ1Ĭ@+P€’‰%Ô°L5N©on¬=ýhµú«ƒƒÚk{ŽEßž÷+MâŲtÌ?NãwŸär#Ü6¼äÓŸIÜšiºC0ytCøºžÌÖÇ3¯cöµ×¿¬j`îMÝçØØŽNLwmóªe-Œq£lÏóyyPP`úÝŠ¶ƒõ[lH>O›Ä‚oçê“ûáªByPYDæbc ÍW;ØÎßžñÇu³ÏÁ UU‹Pa¾.âöÑø<ù±Œf®w™úL³—8Ó[hFfŒè|yïÕ6_ר9“£¸ç[Ç5¹¯|Ÿî}³™ú¼¶ÏþM²­JëtÍceŠ˜´2n5m }%PƒXÑO¯7—†o+Ém#çÕÄÉá÷ÓÔÆIS´Ô'ÿèóz][År]Òâ+©·õ0 DÊP« P€aËvwÅP—8qˆÓ"¹K¿ 6k6ýüÉ›¯]¬p ÉÉ‹Emð$R¡1eµ¨Ñ†,ð1´ù‘8.Xc…³¸§.}Â7“Ãl†¨ NN $jž™Š<~Lç§#ÀŽˆ’>ÚŠNU9d¨àÄû>¼°’”.ä€9Q\Ãh 2,Ò[Ó¬v[Cr-Fì€& $Ý“÷MfTi͆A°‘Z‘JÄ5éŒ<•åâì媕‡ßÖá)3½¥ ,dxF7B&8HÌÕ;îM²ýH¤°’ˆ"6áaVd@ŠìÈvžÙûéqü*ómºÃry6CZÊÝZ¹íKGÞ¾Mñ´ý?=¨ÿAx¡/𥩎€‘O‘–2U$«p¢Fk•VÜícL9ØnóˆŽ nLK. Ì‘ƒ1DZÀˆåPG@³"[ÁƒÆhÖãHPMº*YéH‡sc‘Ã7µf‘ N´«¡Š…`†žš+ ªx¬iÍÜG¢!N¤ éÃÑ(‚s¡¥ýÏßNÊÚç|K«àef’4 k¢SœǵffÃæ€[U2›æAZ«¹OTîÓ}éë öªä_#.–þ%ôo{f¾þ˜×cÌGn°©|19¾Œâ¯Q>D¯µ5À¹HDÅ‚Mÿþ†?Å÷³¾WO눷ån~à,ðr~›¨()Q¦¿ŽMfG›žž¦ªêã…¨;ÜÅNfŠ$c°™‰ WüeušI¦;f¶ÉDîyÖ4V£uyA=K ¡¿vÙË[j@‚HbqLžÏ¡øYžIWÀ`YëN b"ÈåæºéDÅ¥l$ZDU)z_0¦ó)Í‹±Ø³@R÷²wÅÖ10O™åéÁ5U ªå„PÙ$wMŒ41ª—¥¿ÍÏô¹¢zà7"6ôbÂb:G[«d(a%oQ"øÎæ»ØpTY6î>´a.V³þà}ïr›ûóƒó<øy,î·ãT{Ñ?<õ~ŒÔ=¨Ý‡^ƒì]z±ñ2Ás|IqöšØ¦=¥v>OÎÞý¼vûQ×rfCÉòSÞŠ "ÝPº *>,[¤î„}­{›ì ç5LËÓöIt–ÆÔÚF¨pß–?¦bo“‰¥"A‘l5éÄ1ؾæøN5[h‹*±$| Ëgã¶)رb ñÔ›aŠ àNƒ¨=ÁÜŸ/ùáÀï ÷:Ø1õ o @#oêz 8½¬»Óæ^Ù†æß¬Í³Ì©æŸ¼î¿8ܹªT•‘NCb€8 ÅD2AÆ—Yî½ÈÞkºé|½¦>”a=­bô™H•ì§¶¯¾ð&XE †|mA l$=£aG-’ÆÊ49Ô+7a¦nɶZ å*T–h±„)áH+…Ã÷qûù!¤g¹óÌÐÜÊÕáx Ä Û }ÿÄ÷åý4”Ú£-s!½tHý>Ï?ø]•=î^ôú:}—ÓE-Îlñy j¦‡O7•J¿žƒ f Bl±ÐLص¹$9Ђf¹/r–ì ÿk±{ðñòÄnèÊIipú•çé aƒGæ²ü0òp['^ÉßRJx–: ¼ëzÿü빞vú@FåV:ðOúúÊ6ÿZãs­EzŽÏ§³«y(`¹¼±È_ÝŸKÿ¹`ù­ºo7é~VÀèjò®*lÆRíŸ]oì)‰XÂfÎ¥áÇÕ"¿ b=KÏ/Ù“¶•!= ¸ߦr¾–û ³õ¬õŸ4܉4=çè$£̓3 ¬gXßMêuÏÐîÕðh÷P¨ +‚Á2^ÊK9Š$)V^UÉ•5G‡cèK°¾ÄÈ-Òué*I+¿ìÌBaÓŒR!U`‘ˆ©Vb"V-Ó+±s¿^vrɺ”Mÿ,Æxå5Ìàž[s” £‹ÐÑÃ&v슋¬Uƒ×&\…z¹ûÍ'>»É[-ÔBÙÄ„€ ¢=C}]Ú^ß}ï#”F–Èí6V/OçÓ±·®J¤®d†}ù{£7wIÀ….  LkP‘«ù…bÅD12v CNUÐýy|—ûpbÕ__ûž}÷GÑàå5=5¨!B…1 £ „#F˜—d§F[ˆQœˆW#>!®úÞ74¸¬4ç}TŸ[‡Ûd{°ý{‹*X6ËÁÎ!Fø.#Eï¶¢Y¶í‰edSÕŽîûÀq­qI ¤]ª[¡ã­¾BÔ‘J¬Ðb=ìµfnû»›×ÚçÓ®©è:" ŠAQ“!ö¦šŽ=JoÀ×¥55¦ hØH Kq4¬<´"ÅÃìô£·®V´Â’¹ä+—5蟞þÑéƒXÅ‘E53¯_ä쀂‡è]|}]µ7(Uÿ(cžå¼+Ôp ²±â`]Å´ZÉ£¯‹¦Ûúj•Tån΃©7"ÊHGð¥/ŠÓ­÷IDiX²{FGÕŸ®¼Ý­Ã­ØË±zí“©ã ÎYK. ççîá1¤xqZž†*9ײàs¬\6ô¾¾þóÇ1×£¢.ÐFÿñ ½ÑQØåÁ©Þ½N±zö°›^b=†F´¡QÒàeËÁáøü Ñë-½ÉI…Žf Ln¼O›ÿ÷³üãâ~Æt¹² ¨C@È>hÆÆøKiKã÷*)ê½ê•c‡\ÍðÔº¢¯asüˆI?:9™èWv+ø¹¾ØUµžæ‹ðº[š4—ÕÃçÙÛ©)~hû~ðyž–Â¥…º_’ùŒ}щxêÃÎõ×-û€J{…í_iä¿o>qi}æ3¿7ßñNÉB¿¼³²Óù8{¼Œ”yósw½Æ¾½; ð‡Ê“{²Õ n1È“ OZ·á» §Ù÷x¿Úgöų±ú±w‡ÚB?=C[ß:ˆè´3/lˆ·ÚØwg7µˆƒÃ†ßÖ*ù@¶ýÞÑG÷ïÔvOÍnŽ» %ÆÖ_»–ˆ9õË_!ت´^o•k3„“MJ¹†—[ËëuÚº5™)\¡í‚?Ï™û3;’MŸ=¢ÛÊf¹U7ŠÃ†æ¼–ršÀ†^fšOÂOÙ«#ùñöòŸ^äu³:wp2›8¸¿v¶I. OÃFt|’YS‰ÓÿyØÁäúf­Aª0Ï`’aÚ:£}ÆûcÎïMŒp/›iáMy~ÊôxŽë ½û.2¯Õƒ!AÝÎ=\4n4¾É|þXþòܼM!¼h/MÝg[×Ê·cãùyìqž;vJ3( éî•dÜ‘Îu >Ø ÞªëGû¥~r'âKøˆ®upmçgÿšV7®‹¹ÿåÛƒŸã7ù«¯EÒ¬­¾{Çž»Å:sÆßö7†K$º‡K™‚Þ°C¯ö½ rsêŽîÑG®}I–\ÚXÛÀ††O '×AõÉèÓ÷þÉå÷ð ¯úBÒ] Üû¯Ž>@¿pé»=8@¿ÔæÅfìDçòi·W#]ÿâ¯×3»MÞÅææ×UÛ¾/¡~ïŸ/Hƒu¹Æò¡ ›šÎúÞë¼úP÷% Gçâ^×~[úe¥ÝjGîF}êJf¸õ ѹ¡&Ïn}gµè Õw§ôõÄŽ[EGm†;$T ëñSçZ’t¾ÙÝljbZòéq ÓoSaáÆVþßïÖžYæ{|gXâsF±Åg$b´ëÑù´mìk™h‡DpŒºæ2{ç0mù=FÈ??êåe•Ä­xž!Ðè£mŽŠøµþ,E¦§ÕmËWâö&ôùÈ çý13æ¦écÔAÇ®\ ‘ÒjáÁ=Ìâ¾ôóéøh^.ºSÃÎAI|7ö¢OU„Ʋû©„¶ùFØÃzí—F¤8ªõý{¨D+c¥¤Ã0°í÷6?]îalE@ _·¾œ»©óQÚÀÕ¡k..ð‡#úÂÖy|æ3¥Å#_˜Üè)¦r’ £XlB@eáÌȨš²Û5ËÉž(9NpUh@E¤¸Ù„t4¹¡ßÉE¢!™l8†R ½äfµ!Tã€!sI¬e7t$¨*Íqíh‡Fã<]_rÊúët™,)‡:¡µ³Â…å—ï?|‚î3É#Sf(BüX½…–ñ ûÒ—´i|_'5Jé¹,`L¢ ‡Ò`‰$F‚êñÕt4Â5* 9ÎCN-/3d´‚2óÖCÉ×´ÿ§I}á÷Aý®ãñuÓiÚNˆ¥|â´á¡“БY‘;î=ìN—ÏÌx@q@…³Ó* j] c%T ä¢](¥éhÚ~Vd[Õí¦~øæ•[½oûpaÐ¥Š–ˆâ‡ä¶zœÕÌ gß#º€e"Áà;ôÒƒ –ÖÜÛò×Y™] Û F‚«ÌÊ2›1¢—÷·ßë£7lS¡›ÌÜ©u¾Ì®e­¢œhr–Ô!q؇ìíu -ø5Í +¯Ìw­Û§éGâ=£(R¬KŸº¼ë÷ÞV‰Ðð†Ù¨$Z$Wgë² é{M¹¯Ç]ñíÉ;šw3in˜bpçÙë:^ RX†º?»Þ¤äÍgM’ Ž¿ Ût.ˆØ™=\s½î[è§Ã=]Ø€!]‘>a½ )ÈñéØÐ6ÃMÒ3$'¶®% Móóhß<$ýe¦Ä,³€AvdÉÁ 8#¯þÊV·.OF2Ü%µ«Î³ó°d2ô¼/f·ªçz>ƒoŸã”*a1άYu=™Ù_dXž/«(›b…t›‘üƒGnž±šï÷µŸß?Þµ_!Ò€"P(¶ù´œLc–ãDÚés‘ŒPÇ“­tã­ crî¿-ÿn¶œU¸ÐJ,UùøèþžÈ³û±>HÎ{ˆ¼PvIb…?õ0ošÇeúö¨Á×ù>в4Và±&büå¡fàS‹‹6ÔXž0Wâªé!È'~“9ûñæõ»ú&¾÷·^þ†~Ôž¯oiª%¾ñÙj«IW>Þ|ø8`ç?Ïá_gø¹ãÓüw§Ûïgõ)Œ6‹ÒÏÍ/~ªžñ:{,ÒÖçQ8‚Žjvjn´ý¦X³×T² ‹0jÂ×ÃoÒˆÌö’™lF48ÃOè»´0ž ìn^üð˜ËÉußù¸=І- ´õ;>Žº%ÇzÜâ[îl, šÔa ÖÐþPþøQ¾²Ï?ÿöþóÎÜ*C­ò¢©±˜Ö1ëP(‰¶{Õ¼•Ç“¼-M~¿%g_ðó.%#a$9ÐC–Qz¤Ü@"+t-Df8m¯bc”u“-®†q…*ál®]Ë …\oï¨ÈHŒÇF‘+\ðÆ&Ak†q%9«¨eNZ|€K ¦JEa'!Í©ýqpŸ¹Þs}!ðÓÑ  ¥ÛõhXÓiÓáòò=›¹N=aÉÁ— _÷o|í¿œs‘ûW8Ï›Ÿd:ùáïP¬»‡R¾µ¥ªÊ¬k—²‹ý€‡ÑÈ j‰Šˆ82ZX ·dÇ% ´›Íë¹ÛüÙ¿'úX&ÈUafØ—õI7»%FÍuX1Ò3шü·Z­Tl`·R·’îñÿ­¼ÿ]Ǩ‘°Dv¨Åöìy$oãëfÏÿÚh”ÐÓV¿[ˈr·Æ Z…—WLDJk̤™<Ï7@^_‡†±85÷L´#µ_–¥Ë4`¨uÅ¢Ùê>šWWWÙ뤈+ëê»—Âd*Uu;ZyHL-}äÊÅë“â["¼×N9ºÏƒPåuÛv§Yš9ï„ʱêG‡ëçÐY6—q½äê¬ÄjnîfŠ* ÈB#ž ¡"®1ŸöC*ÚÈû’C}¡Y¼"^Åâ]y«E4Ñ•¹É , "¨`V k HD €”$YkÿdëýìK’™ 6x•F;­ãØ®Î×ý}º¹Ž5<’ßeßjX™ ü"õRf*(Ð*Øå)-ªø4Ñ2íp½ØÅTsÝl—žÿN|ÍùœÃ]﫦þœï0¥ës®òüÝž‹ë —˜8a:¸8ÕÊí5³¯é¹;Òf@. æ¦òù²^@ŸüÑH²cXÈQËK»àó²)ûõÖçvç8YÔéÕºÞ_æ™±6ß_¿¡VílmGtá´SÈ’3I`qz×:ÆÆraŒ•\Á6á¦êPÅ}#È…T¹Ú¶s3*sF¯‹~…Ù$ÚÐÅD{ :-²`%ì]%èµÝžšEo÷? "…â.D#kÈÐý«q±¤×êŽ[‰Úñ,ËÇ JÔ"3gìy¡¾Œù¶ü¨÷Çñó®Ïh®A((Q €Sà@#5&± 7øÛCQ:;æ{Ö´U{Û YÆÀ;Oº_W·?äzòÌã“#ôEóÇ=äeç ÖN[&¸ÕlÂh-ûý(>œ÷ö׸Ú]ÄÏg¹× JY#¸–¶Jj¦$`î«@zÄ¢¬¹`GÐ#@Õ°0"Ê Lb¤—H‘"RÃ"@—É †j騹å­§ˆ9×;ûËo¼GB˜Þkô‡Ëáh#º- ‚¹kˆâCâ¿¶ú LÓ;K„d p¦¾MN‰/Þß?ÕË*Z¥UQó Ó.¨ „ëÓa¯$× Dž¨ 8tßü‰â¡ÝoeŽzä§Ðk0WmŸÈž¨üªÔ™ ów,|B‚CòÍ7ªä d´n*tfLʧ«Ÿ¾{Ó™óQp­_éwõüý–Ü£§§ûa­£±ÔKH3í>C"­±ä†Åq{eR Cé€Ú5Á®„V„±àd†Y&_¼ùu©_³Ø óßê õ¿z1Î f—u–\½Æ­t¹%C a˜¸¥ö–~–ӹØ0ø\¬Á©Ë²Ñ18_0Žä}"šmOtË„’)Cµ)*u­HžûyG•è'?)îuùOm$½ÄÜË5W5›±ááoèæÿ³ñðX™jˆ#úý¶âͰÖýËvéÓQFûÁÌ×;÷xç_>>áfŽ»·ãÜ©©tÃUÚÊË.MmÝYòl–CuÐLŒ»ïkc·IH …ªÅÝ¡|*k Xì­bhTŽ‚k¤é4Ñ&Þ8šìoÞv$ˤ¶*9¨©AŸÄ ¿¥¸µ¥Ó‘I`®<¶jŒ~ûë˜Ã¹Ú&ö'34¹]‚lÐ Å“hoˆXR"×@UÕF8ÔœÛÔs7‡‹¯œc%Û Ä¢»!]~õ1 ½¾·)P™.ôQ¸ÒÖ¸üùtþöí.ÍE.éÀ›S˜Vr‡´Ò Å©ùBç~ßÔ&³Q—OìÀ+Æ Ï“}Žêc q?~!"Ò„A ©Ò…x}Øøê„ ‰†˜3¾©€ ç?zx÷gÚ=Æï2_Pz•ì ³>ÇøÚ°`¢ZܽºòTôÛ¸|íyF0l>€‡Û&~²A¢üSµSW ´ÐqãsÄwƒEûrã"i˜•}d¸:ü}ýõÓ3ù)u||³!øÇ[—~kû¬í¹zžbж!™¦¬à‡òDý‹¿ÿªìÙü¼9½9ó0þhúÕÚà[§Ã7¿´.¾ó.rзá·OÌOÿ$Ý3R¬Ñ¤½ÎöIÙ9T»ƒ|.éZíR‹`7n~?OVwË2ôIǦêf4ün£zõiae;Q‡c“"œ h3ÖÁmgýg¿âþ}çwm¸““ºì+³Ä`Xç¦Û çA€ nê½Æ0åÏ<Ò¼] ˆø+3Ÿ°Lµ o3›>„¡#[á@8Ù[ãoœ¯Åóá3ÉÓ`ÚN{ëd`Ç*/¢Çƒà˜`@WLJ}œO0Ï>^Þy2ô#~­&Cº±^D~H÷^\chÓwŸ<ͧ!ŠQ©§g c•¡”„ò¾HL®pàPÜËݾw'WƒKá€àt®Æ·-ÊYý€i\(Eði«.pŠø^Z8Sœ|ÆØ‹iÿ¦0t9^á¡ÓݭدpúZ£, 3ë®Jå”¶ÑE*täõt7 ®†L–23Vû1WÂ`Ó‚±@9*k³Tµ Ù„ -}œ™BX N1…‡Õ„$FB]&›mɧ_8Ï.H@E¡ÀYù¡ëldÓ½ …`à2<,9SÑÃi%±2lšu(¬©èn¯Ýj„BpXGýDè´jÌ'd»|ž,ìØü0ÛO í*­1ý¼½Ø~rå9»’¤!Ä  ‡4r”ϳ_f¤n/pAÙ#/}¬*ÀÕp¶Ä[HÆb(‰ D$DÈPÈ,í³ß˜ˆN-~§µÇ¾Î}~¢xÏíƒëâ:ožgÏg?aý9òýò!‹)‘W"ù˜] H¢V­¨•-›¼X–²m#…þ¬¢w”ø8€uŠÏ ¨Vå­fû „e~aOiõw‹oÁ7ÇWëÛÜ!16öæë¡ù­.fça0ńܴƒ0*[€—`SÎ-P3S0”í—‘ïf¥ž„j;” cÊe+%9:Na78ã±m ¢ˆjj™^|{­§}ýØ,ÔØËÓKjaÓ÷Ë}îmi¾ÿÛÔ°ý÷G5 z• ©4«Z¡ÎCMr^ÞËÝ­+¯ÕK¯úÉo³*™öV@ÕʺÓB¤ÓT·E>Mœ¾Ô[¢f …ÎŽd*6qÞ,ZZi0žJ–šz”í… )—HL/yôË܉iñœ¦Ì†âï+çå;ÑžýD\+ŠFPð"á<üÕ>?¼¶!T+–\f:Y…„âŽH—ÖZÛH£°Œ-0 PM׉ôyƇîö…p9vîºæãIw½fÇÅqÏÎì…õ%'0k@–«Å8R—Þ1íÊ¢“Ý,v¦/Íë’Ÿ%¦=[Û-"u{a6tr³˜6pÞ{ð?üc&âý™ÒrÀÑ;IjLº¶5¿–ÿáíü?Þ¯°+øcÊR©$¾z‡ez¬¾fÃᣙŽbv 0e‘)Ë>)€KY&›ƒiFHF¾Òžz´Ï9^¬?}"Ê|úÞëajLý,o .K%ˆb=ÃVåιÜ6-&u[¦2-q à&|ßoúĉ4Ù}a>43ƒW¸ŠtD‰uŠFµC{ìŒ/€W¦,÷ÐÃ#²*)é´Ž5ÕµeÆ‚¹=›™š¹Í>Öy-·³€Fï䮄-o³ƒLáö­n©¡¸œH ÑV7/ÆÒyG~3åG&hhXGšh[åâØìʧ0®–ë]ö[[´¡iXœmk^´=3ÃâÁ:u¶h¸ÈЋ¦WÙŠ?±„I‹eètdsM®UÆ¥ÛŠóþè^Â’!æðϳÞõm{âÜÓL‡2\£’\ È(˜ROû}5~1¶5årBåØö¥¨aZÒ¨G[ok¬+Çãüì6–ˆAáÞ¼bsî41ÈãûþæÏïÞ€G0‡ûÅ×–ì“h{A¼>Ú„¹Oä Õ â‡9'Œ½š°T´±„ŽÌG)î&ŸPu§£h{BRVu£¾Z}ä{b”ÃÁK¥Wê³_<ñfN^qNížJ´Íývö³Î¥>ω=9U¹«lå+X"F³ èãºzm+†Š"·ÒôJŸY Ó¨„^à'&xòúlb½»õræÍ.Ë‹RÿÓû¹€‡R:;LGu*=j»é¯Ÿ¸ßO'2Çc¤7S×ÐEê@1ަр–þam×,“.•î þdøµµg¬ªm*Ò•zÊ›¢BÄÉ\,§n”N²ËÒu™VΔL*)÷ ôiÅ³í Œšãؾàð\©œKty¯î7Ÿ^Ê}ÊŸñ©<ÜMýðÖ}ñ½h)œýÕÈQÍ|äõö¬ÇžÎe¯°…Iz *W1ë¶ž ížuJܦ×d+²ä Ý¥ÆHÞàú‘½v؈¸äu·ã*Çb<=s×sª©W ã¿\#Ü¡mR12ˆ#¶&œ!”ƒ ^»õÌ^¼úÁ)³DJåbÕÝ£7Þúlß~öû—-@ñoÇ5<†Ÿ‚èØŸÖ_G½¦ƒƒU+ö·ÝT5BÝò]úe‰ËOµ&Ýb¾+ì“<>íõ_ïêRÍïg/—†ü̶˜P(X7åòùJ0¼hRp”*Ö:1‡\¶Ú5~cŽ.õ©ý¹µ‚xð*ÔE‚âˆcŒÃ ¥:2D~Ä~¶ú¬¯ ”«Ù?ÊýÏç{Nù[Ì0Â^+#vŠª6 *, fhÅqᄘÈȶ8KÀNX‘Ê"õLö¸Ï목œT û}ñ½å…V Yu¦¨Å *¨G¥ø2W3ø—Àb Õ„C´Q“†û/܇*ˆQ€1Uµør}5Ý‹€ÚvI¨Œ£]¶B\«¨'aäg†&ê.®Ékô—=;ÍØ/§Nûàšªr”@>ãC Ãwü€1àÈÞI’9BÙWÄyPoóÉqÆ]ë&vâ%*'´t~VP²YëÞ¥âý1ý õG¦>ߦ.ü7½W„¶ÅêËYV”^‡Á²ýqv™¶8°N¶ËÁŠ™Ö1ÄÀ ¬xf8«Q{i-¬¼n.‹I`Ä#EÙ8\rILDI¢„@¿(®ÈjIÒu XŽ(È}yr¤Q-Ûßz<÷ûoòx;G]ˆð¹½øUÈ/ÿ®(EP$¦ F ’)KüM$¦Ñv jBÂ'>U_<­©?tOz¯5Dzô»Û ÇÜ“ØàÈ®3B"L‹;"ò®µ¯×Ì´“«–~‡a›hÊ#¶Àþä„A¸ÅÈÜíÝ^±8LÞ¶3Ü›‰zYKc#HžÁ´ôΘjޝNý~`æK­—ë =è1>¡{+¾D¹”2oÆWž¹6¯°wçâ¸ØUl§"’µ4 ÔdÄyeìÝrwï¤ØÍ43j!ºWÿ2”ÿª‚^šB/äädŠ\aÝG¨¨C¬³]MÖ2ÛYY’ÿoß¹õJ߯fî&ÍöÞóöÌlÖý!ö@Kèºõ(:/RÀS~TÚÆþöBÔøÂá×°HÙõð/Ó"¯H«TÚÁÕ‡Ô„fœ _.´`žÙÿÅ%°#Xì¶Ÿ ×zY„‰…’qBcòùvöõ#«öéSìýÈ<¸©œÕû 8ºµ6ŸåU"Îã“;“Ë…äÔê>hLáÁÞƒi·;LX@à[;BɦܯxoÒcC ` áYùˆ¶'é¹Ñ#,·¨Îñxæcj°êQÒNïÜñêU¼náq_ú¶äë“]V_ù­\­d‡&j#¢êf$³Ýyõ¨UiHÌ•ä“õÀku}øÔdÉ[/{b±ž¨_9-¿wóЫt 08û —‡‡¿ïÅDPÌ/áœÈë2Ìm;7ˆ—ªàv LæèWßGô“ßõuÙ­'žFRŸ9‘üô68nh÷?ŸbŸ<±öÓýé㯱þæS¶e´2 àçê´=Ʊ ‹"ó|[¯,CµÙóÊìWú ‘^o'•ã‚¢aC¾;?Ê œ#ϼ۽ÓøÆÁÇ4@צ«ÆdÔÎþûÆ?± O©×µÛi¤ õ“mCT~4ý¢]Ü}³—F·¶œÿYÝøØ~¾cïåü‰Ûjè u´µ†ñÆûˆU¿øàoïfVO VË©°ÏŽ=æ‰yÎÍÓÓ5fÔ߀˜*|º×ÞÑ`IÙ¦GMù¼óQïÝoNßþfé6/9óèm ¶eÓ× Á·žŒªÜZ‰:ø65Øîý|þ0ÿ-oA†/ ì›b+}ˆ0C¦+":Ð(ƒP‰¥Èf-’MšvuÂû˜‚)ÈÐES·¡=…ˆµÚåRºË#@|¿m.-”WX-‹Lƒg‹2øñïÇKÏ·?zµØÅ¤êÎõ{¬[¤Nη«·[CXšB Z&…Mb0caïÂ…™ #´›†0cìŠá8¤ƒx¢¢¾îäÇD¨¹Xi®S©øê*œeÓšzÝèqQî×Ë_'?¨¡Ì,kˆÇƒõKyx*ÜcV’þ°×õ³ª9“y˜}ü­C!£.s§¹±d3‰ÛÆEn´ïÖ÷û~韾_uÄç`:`Oèlܨ…'Äb ÂRTͧM ëÔ‰«DrÐt“ F3U ¹‘uQ±²L ÊRrƾÈYR4ûüZç+ö‡Õ&%šÉt6Ö¦Îöa~bwäê}–ñ;DCè—)™yž•WÞ;­>}:V¨@ÁBcº(ŒILñÕÓYõ1ÇdãŽLȬèˆèD÷TâáÇ#é‘Þ¯…šŸÕÛªÙ>6R#F)‘'Çë<å€RY˜PûÜ!kQÍBË{Õ¸Mp‚]ðÛœWK"ÆZYh§Ñ®¯³dËZ ¤(]kú]Ŷ T¿«ï»¢Ó54'ï‚7AïƒpÚ¢r¸ÝB FCÇÕ?œaT°–‰™³±hô©ús›Å,(-’H‰ëýù®?î€Hß&dž‘ÔþÓv¨Ä±'`P˜3Ñ·8S1½„‚rXÈàAý},ï°-ž•+¸9*ÃA÷¸x§q{²X-·VṴÒ)ò5áôÚɪ87ÍèÒ ZºJÃ0 Q•Z²QÐ:ÌG»)<uŽÂ* ¨dj$ça `ÁöÒ¥(ìˆ%3 ж'n¿ð,T#=ZFm¼j{cïÜKŸž' 74ášëR§ ò»rv3=£k2^i‰ nU–¶F0p|e4ìAc€÷édì&Ã1a@÷™öB": ô\‚²‰ÛvÄaú ͤ牋wKK%–ä¢0é 5° áç õŸËï9*•eC™!,¦ÀGÚznì×di¿áG˵LKˆ†Ÿð€s’“Wµïäj˜0Ëf5/ƒ—pÏ{„7¿M ºã£Ù/ù³ð><Ò4Ÿ- õÿ¬ë‡ì2È´°úœf¦ sxütž§t(èýroYv€J¡ˆÌ€# •¸< »¤W¾ø‡õäž}¼ð#ûs¼»æƒâÙo4ƒ—Rªž™IûüY?ÆÙ5úëLòêšÄ$C¦z®oªÿB’LošÑª¦º¬$âm÷¹²¬É;sÔgLvË‚…¹<ÓvŒHULC!!ÁgÕGUàÞ j¢æ²ÞÄS‘‰Ë{»xÍÜøpØFöÿôáéöþÇöóþûŸþ¯^j®îã¹gl$SýTH[ѽ4$†xóîì\à6PDÓä\Ú²›ðý¼¾,IX-5Úc„]Ü 5Óðº>}5L+#)5°ßd ¿ åïü|~²ü\o¢ÙóqzÎâ¤%v‘àZ1Œ ¼Z¤`œ• zÞ÷÷®Õ;‰n”@V/±:…ÅU¹ùvxäóãq™‚ôû—dqrÑx€pQ)øGrÄr"Î6Ý‚‘JÀ$†4øuprý̵ÐAœ‚°-° Á‡LŠ(%9Ȱmq±¡UsÈÇYóšÌ2[? 23yü£|¹ïvÖ{‹µ$l8_r’8ôQ¥85ªÉ Ū‡Ž$ˆ*“Â7׸Où½€ÇKß:mø8‹¢¬j¸ÜM–8Iò܆ÍÈšYœoÏÎ?8ó9z%‹vðíéÉô¯0gï?ð¶¿Bõ˜›òÊCqè" \jA-E+Œ,DÐÝRª%M1‹Ä :\Ñ/¡+;®Læ5çCó&O §…Wù׿­®˜™ÊÁüaùñÇgçßIéÎÌÒÕ}g}3I@a¨QƸ(d0ÐÁµ@MÖ š•‹˜›å. 7•OrOšÈ*%×`W³G¶ø• ŸÞ£ü‡;þ/I~ Ñz¸J,,Ú‚I±MoG@•ãÒ|¬=ÏTÆ‘íú‘7̤ŽÖÖûë‹o1ªÈà¶êéþ\{Qý'%g»Ç]q-)ƒÓ5뾦ò¡ê ½¿ëŽÉmÏO/X{¤w¹-YÑæAýž@¡/!lâ:•ëP~=œî9y|GÄêÜ]YqÝ̽S™XÙè­™Ÿ낆 ‡ ÄâN]h ´£3€c‘Á_T#¼êg/V?†FëFšÃðª\-‰½9ÏëüÔ|uXâmñ.qEŠ×Ý>|£-Akƒpå) téV!ö?U—¨rêÓ<Ïf?CÐ÷ñ^ýœ^=­ž [*á=T\ïÛ"€ÎØÓjdr¨Xmz($m&ªw©-ÊñíýnRŒäžÞž¸wš/Ýä«j{ç‹ýþ/vÛ¦0‹þêöÑ®ÍWÍ€µ jë¶­`¨•à…Oð. …ºÄ´ÅJÉX!ƒ€e–m‚{*¥-ÚÃëÓT›ý%þg§ î~àÌ—§Vˆ1PɃmÊÒ@Uu.r¯Ã8êyÁ ˆ·¤HslRA.û²Ûi7•šX\ÐÜ6:°ŒõÊmó&¯3rµsD^¯¶›ÂªÆkîq_é¯yøVZGáH¸qeìE¸¯äÙâ%¼7_“f†ª;ògAËñ»©¯OžðB’8UÚñœíÚ¨•–ËúýçùMñËÑùËÝWO>|­YÔ…qß´®*×½–3S=z}YÏãç]¦“ÃÐLÐpu$4£9âq*ϲ¦µFD=qãð(šðÈ^ ÁFQÑ´"Gv8g‹ÊÇëDî‘AEêPG`Àf§>¬·°Ž>ÛþäüŸþ]ü£­wz=o¨Æœ øþ}uGÇì€ P«‰(!HrN´ $h$ņ …ÌËÆ·ÿi¹î±ß-n¿á^)j ·+zÓ¬yöïÇ.hÒ+B˜9H!B^Ëä>Þç!xeÇ=f¢¬÷Ùj.½-v´õI{§ö¥­ï‰þc8T)‘Ó¹ªBßÂtFûΩD‹3rÏ'ÙfîÙ?P/±'Îôqå™ÚÓQ0½æm]›%=ÌTÛ‘ä`Žíæ+¹ŸìÈ‹ rì`ñLg¤»ik=€)sRO¸´œï¯ÇæQÁ=Úæ3j£"Ùú§¡£VŠìEÆ#8Ž'Öå&è•)|Ÿã‚/‡d aº_.RèÆ! ƒ*]TZÑXàXÛ2(­zÕ¿ÿ¿ãÎðÚƒ‡½1K’>¹ïR ¨rˆ½Š<|Æx¤8' s Œ¸­‡ÑPT̼¸m–J¯\€7æ’[îU‘k²Ï¥ŸûpøØOª=xDÙÕmp‚újÕws¨òCì®Â›ÓŸ¼ñùö~k£LI—6åÈô(¥žŽf¼¸¸5% ¿Hãöö:NzÇãÄ8ŵ,³pÀ¹-ÏhС׼ݞN=|ÐÖ¦ÜríñèÁœ‰î/ñü¥q} ýÔƒ?è?úiö^ÁÜ9|i,éÎ,/™K`3¹Âþ±ì›^ë¸SŽTñH÷g¦¿{L4 HE¯`="Þb=ÞÊòu QjÒ?Z{„Ž Ó·¥}Áöý$¹ºmî;Ÿ~äÊÈ3+ýí»ÜbÜõ¥¨­ ÕÞñ›u"Ç uüs/~gúx6Dz˜úñù‘Ž·ÕÑ#W/]úþgöÜã+¹­?¢Î­€ç8±ÞÊ/\ýR»SWôÚ·~w»œ·»3"¿½¹áQh]Tqßׯ{ýø£3ÛG˜?èã!oéä©ùP¢°â û–7xÐ9Xö¬:v®Ÿ«úѳ[ÕFlwç‰Ë¦Wëµú¸påÅûzDÀx…ïFuå¥z×:~D#bzαûùxa ÖyµÂû–RW=›GCyñ#ýÏM 8…W‘ë Ó1ÝúÎÝù!­«nÿŸ÷t@¬[гUfú[tÜà؆fD€žÐG&Ä–b0Í„a 9‘ˆðæ‰vø(ÆxCy8ìù¹ØhéêÔ® ÁH2åZø@8àR†Ä:¹,b‰¡1™ŒÎv_xÉ(m({” XòP‘A¹¨à0nÃ~ßaÆVˆŽKÁ™…Dt5ÀQì" xvšf„°7·$^£ß˦&ìEÍá´E;ìb\Ñ‘gBGã¹pAûÀÞ¤'Òñ…Væ¾ìl®gÎxâÛw7´´'¦FìN@ Å©ÃcN8ŸÅoçŠÕ‰8[éún ë°’¯]܉&t‰”ã%g èHéFÓQÿ9†'\©i‹WÖÌ»UMÉ”™™ j¡üýÃø_¿‘ÿ-LŸÙ·I¸Xž”J²Ú QË®غ š¶©yíÞ6¯áÇäáÃÕ6 Ã4Þ}äNg¼Y6ðf}(Ò$:^œõÇÿÆ{þð ~}ã-Ç^µðZù¡ ÄH°p––³KÔˆTX¸žáÌ/TMc¯ºµæÄ(Ç àÐ̯¸zæ¤éroñ^™WU°Š™q½>þãKŸ|>§Wä[0T —ìò¾Gyð9‡y§+©ï¹¥È÷ŠïÃÿ:_<¹ÖûSAi}DYÝ÷\$Xjv{W¼ÌÀÚÇ÷«ô·Ûüú¼(JG¹u©œ*NE)aÍÑ‘\rëžGr¸ ¤дÝW…¾M4¾¬\@2oSµN «_yTÖFlk¼ñ•[.Îëååü÷§q$ë)w ÀÛsJÔ‚¢a "U1­šW±6IÑëþSP·Û±Xh6Íî9|>óØ(?½Ý_/oÎõUï÷ÞŽw<ñþ€zbþOô§¯ é’0Ðv§Sα<›º5:DWy²¡:HnfBfC‹Æ8±ý êÁψE4„!Èz¡·µçCµj!4ÌËÒ_ã÷ózœs¤s¦Õ÷§¯õ5Ë‘F‘V @·aEŠ Ð ’@J¨$"ØR3wÞÊ=ìJdIýIý§ðf«äˆ?¬s J½ð¸€—Ðnº"öh‚†PDB®è’‘©¤×؉w¢ •3‡–¨åM¬íñ&™ô‚„E©*5«_tïm›Æ¥V]©C‰­+uH«¨hfu§$QaéiŽAÕ¯xÓA(hŠÐõ}ýéñݾ«†>ôRóð¥Ÿhíºàg;ÒÀÓ^Zz¬%m,¬püÁì+Ó ;  ¹|Le½¦öÒÕáNÚÝçÝm-¥ƒÏl6ÐÑc˜å&ÔÓŠý„«¹º‰t]JÊg¶x‰@JeIä¾2¥*²pX³ËªâþdG¦eÎAàŒ3)Ã\ëù¼®ûáÐèÜ?|~=ħÐИðY{#u0œå'ݹ›ÿ–„óùü#„rúëgö-V._BQ<{ãO˜zŽ®M ¶,yy"l?ߚﵜ«&fâ¹z…¨,bHƒU²#zÌ~ë¼ jB$Pž'óÖy"î3z-ñ!«)¤.cÛjQº‹Ãæ)ט±¤¾à3Y«®g!ci”‚(_ÝëõtþC¸»ÔÒ*¥’t}íÊ,z{e0-¾ÅÁæ§æ‹‚Í‘ø;Ô" @Ä”¡ßoâï³vìÏàèÙ†AXõá3,Á¿ÉÝ›}þ[?ùÛïàv¾þó<ÿéWýã]¿÷ÿx½ûGëoÏÓ”o›½:†³&ÓÃìÝÄ÷¾±Ÿ¢Ê‘Í6|^ÚK7qáHZ  7yäמßÏÏ¥'0Ì—tfgy.}Vù±â}Ë@!Ì+tg5AäÕ÷ÚØûçî>ÿøßÓûùó¾>Án÷œíù¹Ç^ûíá…ß,8À“¿Üjk@”Omh+´$6ŽÂJ—›ëiç˜×—ÏÓëí\Ü?›×œÄóæ<ÿÙ<7ÏyÕÏ׸`æX² ‚hº3êàƒ<‰a³G‘•}GjHƪ02øã¼?•gžÛí *£ FÔ– ý`! žÈgØÜª`Š—½¯¡ ¦ddéJò׾׬*F𗇇ºL,Î Ù¬H…•yc­Hc*„QŽæÀ h¾yºãq¬I“¯òX¸5wÄÛC½ÆëRÙ–6zºÝwt8fÅ6éØLÄMXñâ´û¥±$-Q©2˜pëKÂ,|L¯z<«üú½ôŠ¿™,ïûïí³Íϯä¼ç§ûÞ'¿–’›.Ÿ®Š2ç«*¥ãÀnÚ@®Ò… \ £<_¾ËÁ=/ÃÛÚHEïdw†UÔÛèd4+—ë<©Á?¹ª»äš}w­^þ~Sáÿýë5Ï©Qh(9¨ ˜ÈZ ) ¡Ä¨`.Àtp´ÉÍzŸTN1 ,]¹ŽæÿrÕÿ;xþÅÏ¿L]Û½ü~&TFªrs–ªÙEÔÉ\ÌøØíÍûXœë³T&~)B‘¦¨•4Ñ‚)ÙãÞ½ óƒåEFbÎ&ÄwQTö˜äkeºø1›*ÂNø›Ì3Ù n;šÓÁ’ëqôv4÷¼1ƒdÄ3” ÀÈYÌ[4>¯¹!;l;Úz$"ô‡ Û„pÁB‡ÜDc†¨Ü[,32m*&žm߃œá9+yõ–äéæúï1'Z?ˆõýœÝ»çÒz NFAÉjWÂ!‰%C†|®Ó»*˜×7Ò¬vN”¶®÷ñ”ä(÷º=Ÿá!ά1¶X¯ûsÉšoœ·É–k Ó¹¨³PA|ˆÓ ± (B¢xÀv¾Ûíþú,ÿCÃj£‡"뱆²È±@0]Yý G«qö£¸µ“×+ZlŽÄ³º­ÀæTzŠÆžîÈVÂópÛ˜÷Š>kÀyù*'·³ë­¹6x…ãÍAMeª°>n HÒxCTáþ„Ö Ú ù. pÝæª±]>.\‘ò@©»u{ýb0Zjá›s'¶Ï:Y›±4¹µRÐoe»Ä×nú\P ˆÐº'F=Fgô°Çãâ}YÍF|žÃgbÃK‘/Q‡;®o=B»—LNržbªÕÎçÃKâ¸Ü­öì#é¹Ô`Jƒ_}[w·ùŒŽòLû± †’/D9¦3ý;*››Öâûæû-ƒÿ­ß6ùOJ­êùö6o«\ð­6‚ý¦€d "ìn¸`2Zuåâš_|ñß¹†­Ýܮ‰»NÄ€„áÖLZ’Y9_ÁLŠHyÁ@*ÅÐÛCÞÇÃÇ’ž [ùÌ¿›Ü“Yn šEèý‹“¸8¼Ûb>“,$I¼üIÛâÑâ‡,pùb g›¦s…~â {U†‡åÔGõ~·œ ¶‰Gªï°ZlTv± XÏM&w(ƒþ­K‚~šÜ~:ù³7fn~²›øõïÒãwŽ'ìuƒÚþä±îøÒA>Ýâ­ 2,©¹¿eúðN`‹Í¼È•îÖ숵ͤ»bÓÐâ[\KË£p~4oWš7?¥rƒôÛ?{üé?ùEþÊCÕ7ÛÓÎæ.Ï£³þè‹cmîœ(áŠR+äô7²9&~rò§W´§¥¼®ˆKÁã°ÈæÄf_Hà#Ï;Õéd*V‹>%„LYèÄa¬9¨w¸…¶£Jˆv˜øt11ho} ¾ª[˜ªÛé·0¸4õJÈB‹ÐzíãXŠUm³ŠÄ$‡©îG£Œ!)c%Ø=o“€å…$!Çv{¼³Esðù»þ½Ðùv7õÃ$i 3[–2þŠ ;ë¥õ\c«³£Wmo™VœLÜ«µâ0ùÉ(”6ââê†Íí`ÞOÍ:mÉOŠ„]NañUÅqn¦r$ˆ=Íf1SÒn…C4Ðlh‡fWÄPºEvBng*Á¤­Ö‰´½Ç]=‰XãàsAÀ—†¢2¦ò ºqy’ˆC,À ¬u R"“6¦»1ÎÏa„¸Y:*±“~/ŠÌ;f´ñðamÅÃÙуnÖð•4’¶åÓ4É­š…"#ú°¬€Ã¶•–&úù«óüËÜÙGtXyæÏ oôNPldj_œWÿXû_Ì#›êÐMCÓãú)¾-Æçá¦q£…©;÷ÃÕa~d¯4xà |h“Õ&F C£?:Tú²ªvTÁN}ëÈ‘ˆ@ônŒÎºü°¦ó_Œý—ejâ`C) €j'À¦äJ<ƒPgûD*éNqÂÙ?,þq¼Çg2Þ¯Þ…tÙqÕ5°¶ ÒJµ·º0+¥˜Õ±GdŽ%ÖÖùtžþ~¾U«tVò šGrrWº‰œPWáÝô™Ó*Ã$–¼C•^»'Ì£‘™ÄQëÕ°ì.ÁÈCT“,7",Xkdj»Bç›÷•ÓÏwª³º µ1£AÏz|ÿ6Õfщ߷üš/¸ö¾ÏÆ Ó—, 4úÛ³Ýàªr’vbúîŽ#G$«ªŽqò6:?e>æ»­_œ‡zqªqžþ–ï–ÿj½°ö›2 #RoO®*Ýj9ŸIˆ`Ì—î|:Ì^²'ñéfɲ Yb³&0kõÝmeUz_%¬ãŠ"J±"tƒh·[)Z$ôiØeéµ­çãâÊd½IÜ×.–Æi­gÒó>ÞÎRã&šÃßRýT\e¨k¡|¥tì)YLÖÆHbâL T€ÇÝÕIÇ izš=Ÿ§à<Ëõ[Ú`8ÅD•–mƒ©/&…J1A½5Ö%.ˆ¶ í"F5Þ‹ÄjÐ@ÌjµRC³òfm • e£Dª±ؘŽAL’%ÑF60t öȺY8!†$¦LrµõÃnçyÃÞhD.–óH·$¹Ysrü,õëêÓæP&Ɔ"!J…Ä‘%ðW3†$LÂ¥²´¦<Æä3°å—¸¨Ê‡òû³ë øÚÌ[çãÏŒ‰•2Ô=†"¾©—ølí RñövOz{–Ü8ùaNKu»ïÞ£GwqF T’hÅmŠš–Hž6¯4on~4»£G·£f>ÏG9U¸¦[:!ÚŠÏsÆDlˆ9ßùÚÏcØB¿œé–šÈ½Ñóüû+?OΩÕQOKÀ =gÆQáàN'dç—„Tƒ¾…â΂û[‹©hm5D=ãr šà4Ý¡â–Zq\º¹N<5£ˆ(²[áWÝ3y9¼¶½Fõº5 –é% ‘B/è#?6qF`¢qˆƒ!@C2ƒÔBYgfh̬½ºê€d¸¶—zQÛz<<òWÔ¹Ò{ÕL*wrUáf²ÎmµñÈÏwBÏ&§?Íx¶Å¨ƒÑòÔ&„6Sº*ꪢ 1°3/õžf\ NèQãK€ø„[ £Œ¯Žø.Ûõhp&²35î$Ñ€G‘°“G†˜y¯È²çmDH#¨‘Æî]ÀaŽÉáwm ïÿ5h€ @P?’pðÁxŒÌABE¿Ç7:ÆlSøŒ§øq¨±oûÕg%¢k–_å×÷Ã5Z¢Æ‹¶Ï¼OJBc•p“?ºÈ=ÓÜ;8"õcí=Ù3éB°ªàZ³"4°Tã¹,)Î}¾˜ãõ >>ó¦3ŠÞô¶Ý%°ŠÄ0A¶žÕŒ×Å(J$!¸‰Ôˆ¬‰7(à)|Ãa½ÉۃכÃÑjà’ §€ÁÑ»o…âÕ 8€u8¯”¥øâ“/?~±xÅÝi‡'áó‘{qvé³›£;¨Ò­Óô<^n=Ý“î~;>+5 ][NÙ7D“4ie}0ˆ-´ëÆ—°ÇU›Y\ûZñÚ~Ò??Éý y¿û©çqOÍo;yĵÝïOÙž<ÐB‰DÊ#.86ô†2†YÊ1>–NÄXLÓ3ÅÆæ6‘DP¥B´LÊ~ñ~{ŠKž?¿o[x$?ÄiÏaõ Þvˆ¹+ÏÞ¿ØçÈÜéWž×d¼ BÅ‘k, €¸öƒ#$¨U@B—¸¸…´¡[{g“ZÒ( Ý|F«‘} ŸÖÍ“ã–bJ=´½šÈcèº~ÎýG+/iàÖ§áB-‹PM'WgìG‡åÖé‚=U³s8†àа݊4ä¤Xà_tNv~Ø®‹ ÿÐsw®Ük‹„As¦ÓBjqíÙ}«ktì»­°«~Ú?ÌM˜Ž„ö'mƒŽ™õÕ pºPòV èöZ©ÖàŠ«¶Ù²rx˜µÛ]k«0‹CrD¿ZR¬õ&tÞ{³rNq®E*Ou˜;Âýôu<ßîœw‘·ÏVMj‘R‰½¬bB%,s[¼RBZ(5ŒIÁT^.Ï`¡PL—@–8™ûO󟽑EoUHx½ ëaÏ6Ï…^„K¼Š|J“­@®=}mÝ VÃ6êfñ£*wÖ»6}p\u¿éZÐL©Ž€Hà*9fh„#ãR‡”óàôµ çEZ'}-O‡»³f<‘5¹<± Ü-úªU¦UÈo„À9‚:™Èža·#îð[ì(AÁDó­ù„Û…Ú9frœ±jxÁÒsÎ_Szü^I.ê0;.Ò…^ÓÙeQ? Öj,ƒN Ô˜ ŠP¢?!àÈ@†»íì–%ñVK½™^È1œ„°»¿ª^J•£ʇ?´Ngzö®Dp[.‚ 7< ¼ 5»øÍϘ¬Eëßê9]þ©{(Íj<Ñv¢’`­¨`#â>Ò(÷NÀÖ«ù hÜó4»d9‘·Å¿ò‰BX÷)³‡R>Èwa߈YcË1+.ÕÇ1‰^ýHÚëãì#ÖÇwóŽçå³ýï 0‡Û…¡Vãxy*ï@!„ÅšK_o+iÐe„i™ Ÿ³·мõˆ²QÒB"a\r/ ?BƒJ0H„`‘Іà¥/ /¥ÂÔ¨}n;"õoáym¿hEdds§F”3¼½éÍ;Û_ëΗɾ.ã£=²MigˆC¹~DoÍß{›Å&eß­qfÑãz0"òìü‚Kûô³ï„§ºÔçŸÃü'GâJ ÊòÛBZ6øøñ/ô?ÙŠjCÀGm~r!2 ¾é‹oûsoŸ÷¾Ý9íkPƒì;iµf€Éõ{Û›©aö+áÛ¹xèýöŒžIÊÃO]&F»SO>8ÌdVbOß;~e¥£¶Q ‹@ÁŸ0ÜfbÔ“¬…_Ùºå·|(ï±§öãÃÖ)¦…ŽÂê¢Â1BÒêUííÉê¿ãËj:>üZ¨rž€vµ pÇ0¬ò÷°—?oGü]Ÿèër÷òÈL$Öíïcó‚ðUìP,”èÔ(<0\!Wa"„“޾˜l|Añ¦úßqä´%²Ÿy¹urù\æ6¨aPݯÁ£6˜ÊœOR@U ¶ÀD,'›ìZÄYv/åÙ}vƶ³4R£ñðÏE+u‹Ys¿¢ÑPâw3~M…ÊYÚÊN(7ŒL×ô%µ3ò9ÞUÝËŽf˜kFDAc•ñ4•Ž%Nôé*æCuáE;ßÜA,Ì6` k÷”1[H°À‹0„p”–ÚÏÇr÷¨|³òs[š¤Û=˲|P£ŸÖ~E™p__gåA0oÿ³ÃàwJšBߤŨ+räKªé‡E]. ¬á£íæ~J3¼d z=1ntA¡ÒÛŠZÙÄE†Ú(V9¾Ê`ÂÞ‹àŽ§³½'¿ßŒ}¾‡:šPšOI7•ØY¯~­_¿WéÕ^¸¥ùCÔ s©ët>N̸I€}MCý•Ci¬TœéÊÍâ—‡[VrÑÀÍyü(i×ñ7¯·þ/dz/7²ÆÒ4oKévÎÖs[½£É¤·: ™vØsG÷{¿´.– /Ókp¢Òq¨å$QŒ(Mæ.–²ˆ¼Èka ,Hx£NÉr,nÂqªZx¹øs?žÛøøŒ×&x­Àž¯âŸ|}1Ùù!ÉO;4´"cJ%æ©]µïñJÍvx3ó•|ác׆" ö‰ÕäAòý¨¨óîà«és¡êÕHœˆ 柼 ]Üu‡N=È-4•QÀ ²÷Âï×#÷¹LO«Ž\˜av8Âwû›ÎÄ@¼b„YMf¼Â2i˜‰)nìÀR ~·¨ gŽ`Î? +NšØÒ|Ô2áÊÑŠ¹˜h]ˆî{o*Qˆ‚ÌÊ šz’O Ù$!á‡EÅ×UBE&ý‘ûî>W¯çi”êŠpvähAéaí¶ç=»7¶ž9 4ˆ…ƒ§P-稉É ñdݨOµRJv\KùŽ‚ã_èñnŠšPFÖliT,¸ Í ÃÄf"‘Р̓´Y‡µ"n±«Å1ìhxר‘Š—ÜÚÏV;…ëkNiYêÁ‹šJj`R †ŽˆÅäijÂDéB‰” “Ê“8H´51•,‘Ã:¨+)’GƒV¹Äè°ŽWfÑ"-ÓÈyA¯†)"Þ¾”é2 eL®ÜÂÚë …Ilž¢`…è›Ù xiÈ&ªù©:Ü~òy• 4ÃŒ°¦\д5iNð Ìi©šxÝ‹ÂZÎÿÀïëÓëï¿Ëÿ„ûÐ÷¸”’å‘h'7çí·Îq’„ùtGðMëf\ARÆW-Š@pÄ‚p„eò2ó,ƒRØq™ÖÙ+äÏ^ø›Na)ÎZ’°+©ïÊ% | –ç‚3^äÑŠÉЊ gY7OϪŠÞVàÔý7TýGL¾‡¶æµ`öŠN"—…·ëi»g¥@¸%»†Ê‘Lp-49m˜i(ym°–€ŠiD!*d ¨AhFÖ6s‰e™Õ¹Æh?Ü-WÙbVó4rLŸÛIMÃ)/çG(A¦%ùùùñ|¿–Zl(™ † É@)\ø|ÿéãFmÚÍÍEÃl,íU¾øþ¶×·_â·¸“;—bV@dDTü0ýG|ã1ŽD„Ú<ý®÷Ûo}îvïÜûûýñ¥Ëoñõ‹uN>ƒËlzùžH~ò~½˜åñ+òýïÞí|bDZg|Ÿõ=;çóÒon—çJå)ó ’íî~®cW«+m¢æ*pG<ИªÏód>Oi?·Ÿ×Îyyè£ß…&ŧ“XC¾f2E&ß3îsÎw:Ò›ó\½ãK·¶™Yì%÷}¾{ùŽÛó ÷ª÷ ^ S­ñlÁÍ Nu¶»ÃÊÄ M‹à³„ABáí n àÁSÖ÷]Þ=>ç}± ‰JXÕazðsìÉjl¤ä)^þ J2F‹Gp¤ÊxÄ\¬㜓¡C-`Oyw¾…ƒH€¨†!þrš—)(JÁLÔíc²%µRŒ~ä5Ô‚Së.ä9®4²;”ê׈a‚KÁÂ?*| ŠÊFOLà@¶Ä†Ê2TÁŒ-c]°žw]o4²V‹8%8 q:Ktar¦û…|æs2-¯Åãøñdk\ûµ}ñ)Ò¬vf˜çVþî)9S  .»Ú1‚¥°Ÿ t\U8Bj]‹§9r`ñ„ˆf hÛ­TíÛ/yèSž8?çæx£ßèk§¥`îÜþds“'ª´A•#Aˆl,9fØÉ¹t|€Q0€5j>mDê¢î¤:[ä&íƒÅæTîÐП|àEý˜ ëõþ,ÿê©‚%Eh¦@Sçš`í nCÍë‹Ó²×Ïïv™óù¾ÿCÃáag^àxÑ܆N}ô§_gß¿^ýràð`ذ*µ)D=õ0¢'ÉІ„A>Z–Ö#ò±;U<»’ ñY­s€G”’B&tM 2‡DX|]^¬@rÔ¸.H5õ¤@gÔÀÇÏ_t.^½8‰¡‚Xs­Ôœó޽Ðè]–áÆìÉÎryfÞªxü|ß^ž7ö¤~ö®ð1+ˆÂqÀpEÏàÜÚWh%n³<`°¶`%¸Åâ‹ô4®›Ø(ð’í"®|kß~t. '9²±ÄeUÝܧ™91›Ò|˜¶¿³º—À]'¶;DêRç˜èóß^%¼Ô´X!ús×X=G¤£Ú™«Å)"——~4‘&­QsèN-‰uë—ù¬[Ï¢ö¼Ý3­¥‚ e7ÒŸôÕÇYüñ`ÞŽÎ$«-9”Í6rÙN‰°€‹VdOx®ÈB"Ø“R¼Ù±<ÒŸy^:1û •#Ø„&ØÉ«`Î,ôgSóãKMþ ÿIJ*ðÆ<ë8Ýaµ‹Ð.þ'Çi®ÍZ˜}ÚžÝóÕ$`,ª$N‡ïËÏõ?õÇ}ÞrFÍû¿ÏÞ'Cê]b˜ˆãÁ_—Í‘ætz‡új.G-Ô6wU_Æ’ƒ ¿³~£Î!÷û2›'›[p©(.r|D§q×§µïzêùWìÆ!¯­ë[æyŒ\¿ú\¢S£}|jý~öb·´‰0@ÄÇF¤¸Ÿ¹œóÛjÌ:cíFˆWkjOœˆ Š]˜rÔn$- šˆCªOoM¿tƒߘ{мø.±òVŒÜf`§–YM¥¶Œ¨µû‘Ú<[ 9„6xÀE{¸”ã‚"Üð\n\Àþãp6¤p ‡ü­‰ùÝÒz}øB!ÐM¸5lÍ`6>ÒBOgPjÛÙV»!)ävlÅ*ð÷>Gè??¿º_ÖÍe{%¿™{±ER‰3·•ŠãÇ],‹F“oû5Ô¸™¸ãŒùJú¢ŸoIOMØEfÆÛ«ôþŠ m ÓXÖ½¼[óß[ûô+Ë@Õá°_ís‡^:ÊZý^{cívÁðSÌm|vslß'‡«Ñv„Ý«ŒYû}Eu5•âmkŸÆœAs‚~9ïñ¯lÿµ·žÒ‚ Ê”Yuíù{Ý…¹ÔY´×‰Y‚Ý.3‚¦‡ŽåÞ'š¨6¬D pª­v˳!+NÞ¾ÁrÈ@H{õù×Ù¹Ÿž£ì[°‰Ds_ÄÚv6æºÎDíµÏ,Ý&^ûèc»:­9¸—-M¡­ËÙW+«Ú_ñõãŸô¹Ç œÞéù¯|pPH]þÖa58oó¾ÚŸ×&ûªŒ¾™è.›®m˜P®ŸÂõ7¯=ÔI„AøgÇïÿÄþÖ¹6¢içÞ-õmIªƒ,a}'ç¶;ž~I–ãc¤o”˜:`ÝìÚn®óÁ/óòš1ßží_À×ug®™æ¯ú|ûçãG? G®Éw†{¡3·çn¸ÛÿÕo¿Œ»Ù¿¯ò¿¯ëÿðL8uæï®rÁœgÈ1ÜÞhTÃŽ=SS°ˆJ\H¥—,$ë…È‹ÔÉL-äf%@F8ŠGi’±™üPrq¶þs›³æ?,J—«µ¶–u}íWþbŸ|¢¸ªl‡%!+—ß4XWÊ”!ÕޞƥM§G‘¿x|—œá£gÉg(ת=ùÙ ¡B+ئ8 âS4šñùÛü|òê9ÒQ•»pÚ²B°«¼ïû…ò²yÌöTTaª.NæNkUP2'iM¢+¶ÃãѪãó öI¯ª´:3¹+?­[1Ø“ü!M‹¦¼ê·×s~½x¦·¤„1öe²d8•KˆÂ’^B’L×&q ¿ ¤ŠµáRúGî¶õ`§æ®ü(Ý>\KQÕO´wJzí¢×/£•8:÷¾Ìá¨*7'I3×k•›‰è•׌*÷öºµ§ ý…¢Ð¨¬ ‹¡ÑpÿAÜNÖ¹XÂti~‰öVIÎ gêÆöõôJï5!¸U™yÊ—`í‹‚#”¦ hŠ9¾Â¾ŽuN¢rúMI+¼JnX„´t¢D­AÞ2˜=M+ÀÝò£n¥aЬ¸;Å`€ŽÖäãéðgçųøœC¹iÆíY±ß¾Ös$ʹbZêÍnÏq+á&ktÉ<ÍqM.¼¢¢¯NE^CÍD*$ý8Ó@éýlÎnòÔNñvæN®¹Š‹!ïxÌà$ZTÖRGÌ`Ùi¥y&Y—‹ËY ˬœJöVbš"‚È|ÿûý\Ÿ“Ë%)ãœ̳]xÉ^sÃZ³Ì¢¡²í’‘ªòœ¡Æ­ -êl“ãÏ´^1u²-­¹Ì3Yîßœ“Óá²U窗&DÓ˜«ä¾„ÌRWÏ o¼sÖð0é*S«…ÑNùEÛl–fªÊB ,m‹ùt^LªT%$p˜ÁQèuPt¶Ã´]ŽŒSÿüøùðžÔ†+ °è°atF|0bžc¹)ãiv^Gëý£{ NLª9ª#3!”ä¼~ûgõçb4Eë*«RU64¯©ß(ó¥8•=|¼Ë+ÍëtŸ¦)ŒÍø§aE»Me#¹§¯_Ïwø¾[÷õ-óŠ–uKû{&ö‚Ó2áüÎnO㱋%ßó÷¯ð~š ¿KÞîìðÚmખÞK7bÒ)÷¶8Ñ(ÏLFYñ.¥*š Œ'qá~´íc.R™‘ÉÄ!bpU6²*Q€B k’:ŒãcRÎÛC:÷¼Š!>ûlUu—u‘XJi;åsÉ>;» ¦zÈ©ÕÞVæ…¬ÄÇ£¼åòÄUé£éF UQM£w‡Î\V•G{œe3„Ô>½ú׊Ìàh /ð ÊZpŸôKß¿Ùy•×G8jí>ñ§7½<±`¹G¯q=¥Ÿh;-`BÃiPaé4 £·:imÜ;ë­xÄç±þM'Èh˜19Ødl"éBm-ÅÔCžã¥Tí§Ž±:{:èø|ß¿û¼’ü=|óñë‡ç!¨µ8ßP…ãYzþíýúgŒÂª´Ø‘ãõ¯|§ç›Rõ Ÿçƹêfåþ —.ŒÀ´€¨*ÎhdŠRÔãã .5UápgñEXD÷tʵ“"¨…Ðf½èÃU¨!´àÒY Úr&Pέ kw³PIMI«sú‚ô˜L€R“¥Ñ‡…‹®GKå \S‹Ø_'Í åÖ{Ý~Ûà’L¿ÿ¸ìpD>ÞÇ¿áÿûñç»K4Å7îeñ…vÔ‡~¤Œþ$¼ ZNÍ,D ¹RÀ…›’í+Èê{MÛ V`%Gœ®{NÚƒ:dVê<;}O·©€åb †ƒŠìkkÈì¬ý4{‰L>$H8’lV2y Q3-ê"9I‚ÖhSj˜·_Êsýœ¯åøªÂv?ÿ‘yÙmÜÒîaCôÓv÷ÝÇBEâ`£Å·bAت˜†ê@Úå»ÎÉ×¥³àqƒÆ)g´ ÊPO–8Ò¢É&Ɔä®Ú`/g¶í‚–¡ÃLË˽Q÷гv“eì!˜%¬µê ln\·áñ‡B§Ñ“8dFUJ×XaTûÁÕ®“êûºKÿá\ŸúïÛýõf?ãnÒ¹?Š.Ñ•„;ÿûqÎŒ/õAïC8 —ñjË|!‚|fqÙ2Æ£ƒéx÷á9ª,&u4D7Ê &⇃]-"A3qžÊ+ÔíëS`VÆ>‹…«]Û°ì‰ÓLƒ½g0K$JˆHí°` ¯E¾÷>^„  u5 g"L60äŠ ¢åŒnOfRö8`Qò©<²×Ò oxw9l#¤À~É[*"¦Òrµ¡ãò±°÷ºæȲèÁ‡ègn1)?!É`ûdEí¯çðãBþåý=êjG‹Ýn]”jrmŠC²°v±,½Îcóç'ÖGH&Ê,å‹TYÿíÞûíͼ"·=Ïò¤)Í«¸ÿåÞ_ô'‹Ô7†p³ž Ä#w³Zé¿Í ,ohg¾xûg1u÷º5’©ÒKhµmav¥O‡v\ûéâÕ‡b³à*…lÿGÿ;µ?#‡ª±2­!»}¢¼ÁÚÌ÷à‹‡ßöÌ–í]N^^R|þŠ– õÓ:™ÆhB,,@µ™_[ÿV565Ä;H>an7ð¨Ã0èZõÁѬ±Òð­b©3W ^cëº~ôèwœXkP|¢2G`Q`Z÷ ¨™;×ÁÛ[§‡m® I`øðÑeÙ (¦aª±”’XèšRk{öï4v7 üѩѩ7äZ±È3rB®>(¢‡¼Lw+rd8>Îñç¼ü®­>Ì }Úui¢ ²‘G,4ןyûßBGYÓ/ûa\ëÂãS4,Þ¼¡ï"¸7ðÞ¶W½ñq¼÷ÏâhY¬Udí1?ûƒQÜõ!ž1ž¦g±]òìØÓYy'ŠÈ£ÐJÔד¸û‰'xïpdY2c<{ûsøÉ0Ó/¨#‹5&[“j0´¸Íï0õ$ M?Vó\¿üáGÝ@~¯àMÂOZý¬_†¸C‚!–p  n[©0@yfXÅ D¨ƒ%ý ¤9z÷€½\>N­4·B46‘"‘œ8¤RWJ¯®¬ ³›ÿ#‘™)€Æ¶I—.ÝÉbÒ.××êqÑbӲఴ.·X¬*)1ænÝcˆÍ }WÙ slÍ%µ#€3ó\z®^à#Ÿ%Un¥#òQyì½ì·Ö}kþÁ&P‰x_ÒäB0pÄÑ}]l7Ü­N™{*–¨ÒÄź–•ÁdÕ„¢!©”;ï‚MÍ”SÅÂlNy›.Ʀ¿DEêpIZ‘Q½9γñ™T„Z«Z[¿Çe¾šc{ùê¤ôœV½Tçë}uÓ NsÍý|ýù¥üœŠ8>sf?†Uþ>ßÉçÊÅ?GúnU°r“7¤ó ÛG/ô¸‹ªÑœšáËC1õ J~4ûý˜HWq7÷æªÏ3Ö£”Ö¡qØòÌœ Å€¢Âz•›éÊeyNÓBn™²š´ƒ¼þkYS­l=+ÒýY¼‚)·u‰ƒŽ¢¯ãõ¦ð|9åèÌ´4¯\4c_þäû¬neÓ,´÷é1q±bb'âCƒW¼8»"qnÿ1몮NЫŸ}‡‚~uS&‘è&„C~šæ¸ä±çă+±2‰”E$ï Ÿ]·%³£ÂS­\±w&’û9,F“ +Eª×rWዞ´ŽÒŒ¹¤Þög.Ä«µhÛ­¦µ {(G…ÜÕ?KÜ*òAˆ%å•H¬Ã­n‚Ç’&\Œn‡ãé¤P/Ên{xm›©,zRž-‡•3"+˜duHL LýÌ^ˆ4…tzÕQV÷^y¯§ûøªÖGzÝqAçþ×p§ TœVëõöÜß;|]¯Õ+ù2„ä5yØnµK„dÙ€ojáU$‚•­1@Uì¯vM¯®Ö‘Nõ#èä¼ ë`\•“ÕÜÞÖ®Cz¡3ÚJe¢‰ŠÔÚID5E帨­&—žÀ´‘L˜ ¬ƒ‡ë{®´çJÀkCƒ ©§ì«(|0 ºÊ2hå9ÔÎ*^…}0„óJ° —€(¸$VbÒgãAºÌ•JxŽ-ä¡Úy]úîÄ.GžŽ%šÑ°m{GÊRÞ$h YÈ2ýÄ:}4õÂëË÷Ì^¨kýD?ÿ“×q?ùÃäi舥±>7Õ9?ò w­‹7 ÷)•f\‚¼à,s±}eQ§æû°ª$Øz_OÛÜ!¦£‹T7j ÷cö±°³îe[™Nо¯­µ”2¯ãAF—.¶¢¥_Jze{IˆÅÄT<Ÿˆ‰œÎµ×±ï¾ÎªÜ¥ü¹N=¼‘^EÛ¼Ö¼ž"õ™%hôZµÆ¡ž+æç,?_°®Y~!þVõ·æ¶lÔù¥ü†$Aœ¯°E 6öDë:“˜$W0P;~}ûõÈ{9`vNû…¯ézÑܽ”äMò ßX¿:?Ú,%ïp~àÛ²_é½Ô]ÔùuÙ­2³ô˜„{»˜í)Éiï|WòXû;éh‡WÅÍL8íÑœ§Œëœ¼ôë9™ëée«×è´}ú“ðb-ÉçµO‚“¿(Kk_ÀÊ ¼ow†­whCº§,%‰Ý,§•3HÂ;‚ù”}.l¾š¹{\ŒL -º©Áh&*)›‡÷¸ŽiPϘéE¨0ØÛûGçíÀ5‹×ËÑÞ'ÑfÞ¸)‰Œn%Ih‘:ãõ¡§D ª½:U:†8+îxTÕ© ŽZy…ìPÒ}° b„{hHƒ¬·Æ«,`Du\ ›Tÿò7©!öØè\Ešh¥4Ê¢$øT~%-Þ*.‘¢Žµ ŠÈÊ–é¶«WYrZ ‚Õ!ŒÒy6rlåJ+‘ùèB" ™©ôľ§X 8‰îkúHÍ©]2ÓÙbf˜ÏP¥»!º9ãì’‚t¾ðí¯"»‚€Â£!CŽÉ’õ‡YŒ ^/ÿ“ye@’¶Ëp¾üß2·°®`†¿¼ÎÕ&9¯ WÁö •PäÍãêØƒì‚¹:ÂOæR”¨94‚­†wîIñ™9*²³Ð´‹Aÿ³–…œŽÁÏ2›Úòî+ª~PáÁ1õÅ_•Ô2“†ߦ:Øt*óÈÓäû:«ë•‘&”¹èªðú@5«(w¬'·X˜,0 ^Y²h²‰ËÀ:­ ‹ÃRb[»†fQÌ4’­Œ }§wãʕϲÛ&N#oèP¨Ù+³b ÀÕ®»—ˆ1-Î^ÒÌ.I †Ø€öŒ5•š¦”|4¡Ë<äefðžñ†uB潓Ñ~õç?n}ëq‹*à㽇Ÿë!_þ_ý¿Åc·b"~B·ô¸|ÊžI~Ì„ƒFÍ‘[¢„DÈkDåjþЦCžài8ó¼úå‹}¯ÐŸž‹zþïõ%ó^ÿJ©´]iŠ7“€ê€‰÷=‘Š×ÞÜöú¼¸åxƒ½_ÁF·ˆÉ©j¢]6Ÿ¬)´Ûá ßVŠ…ûø¯ÿ®ž_¿oK‘þp%[Ò¯ÙšŸw;nÛù4ÝýÞ<¯þ¯ž7.på˜â°ÆÅÖ˜€DÑ ×Ò­GA®¹î~nè¿HÿyñõOb ˆCÕPDP%‡¸Ã…¤KήîÞƒÂѽk¯ÏB‹Cw¼'yŸuz3ÓIáÞ$Á5(ŠŒ—ˆ”Êtù½ÇÒ\7jŠÉÑÛ>n‘sJlìö}J×­<>;2œåò´WJÞàYʇuŸn;šˆ,öe@n<ë}M7×±b1|ñÙÁ÷òanYîßêoÚ|·n7nóWŸ6þqú£Æ™Y“„Ã"ãZÄÀ,Oÿí~3¹Ñ8ÿfY@ÙdLdZ² 7좕kk”Åë"t½Àj&Ü—ZK½â Ÿåõ9 Lp F]ô ŠÖóy½_‹÷”÷»ãøÞëMÊñ„×ú¢oàG´I¥ðS"LZ.åƒMÞ¯m{~.6g0‹G“ǘí£W :wƒ<")4JÈ,(gçÈÀ>} ¡êšâ6 ”“MPðäHˆJ[DqU0îõëß.X|*²`×": ”lCÕŒwùOöw{6ìÀ3Œô…_›3…¢î¦”`º Ï%çбí<Ïšôüsãòo}åûøèÕÂ?…V©tNGvUêõ  Ä@W¢%bbžTM‚ð‰å‚oÐ¥€¤w†cŒ‰ê@{o*K'«A²cMŠ–Ó0Í ÑïcжÄxásäÓì+ä qŠYØV¨÷溈u.:·&R0T£iª¢ÝÇÂú„d˜ Ž5ôh\N‚qðMÎGG×ÊÀ‚«ñSØN+â Eºøø4@ŠŽÀÄ8.¦r ]Ȩ!¥ˆtÖe2¬@š$JaÚL,gäÄÿ¤¯þáÙt§T_𡧏™jÝGN%ÄF¤ÃUØŠs°Q­Rö…@q‘a#/΢èªèùQ{ƒdôt§¤¯—åJ—GUÅñ­=UÅ/ÈÂ~‘ÎK(°k¼X?‡z-Lé•î}žäC´ÁTÀVà¡ÿt?H½½^?øºÓé˜<<úoœÏóëÇwÃÓ÷úÍÍG"„v] X!AŠzéØû¨Uu7}¾ñHÌ)B ‘YŒf^ËȾ_LÜuXÓ²0Ôn9×× ú…=¸Tº*"oRXrdµ?`'~`W:®ôøÃzûåÙ÷ø:»æ‘|ñÑ©­Õ×|ïg?L&Ò¹ßâ&¹>^¿îã*ýÆþØõáóÁ¹(Å•}9º?â2üø‰‚êýöýøý¼ÒçÔ9PÎâÙŸ&¿¾Ç¾Æ×ÕÄž/„Œ¾6ýd\Îiж¶<ÐIõ”!s!2TƘÈâ\dŽ…—‰3bH!ÎÕIÍØVRŠËØÛCüÛ˜¸cÉ@váeåurˆÞ#¹"ONÔ¦j4>Õ›òÅÉ]'ŒÏCo'T Ž…’Z,ìUO–z7]¤Ó>ÖpÀeºh½9¦qÖ:¯ÁÏ—ï,_1 8‹ ¶ˆ¶:yìÖ@‚û3ƒÉTÖhI¢A*"EßêX¯&¡n¶Ø/_èáêlXÀÖ`ÇóÉåD»ƒŽ Ød1#ÒkS\Å𵥩²ótáxÕçvLÏvÁ9‰Cütûqè×K¤Ø­RTž!ãè”jǃ¤DN‰‘áÂ\ñþ Õ àhéÅâk›žöЋø?Y¦j÷F«ŠOÕ^x"=¶~¡ýWýö×÷ã¿Tx¾?äxჩ@¾]žs‚efëï&?wš«ˆôSÆ_ዼÆÈ{†`ˆc²Em® 9$ r¾2üsøoUÇÂÄ\³|*a&‚ª0˜•¢ííE`ŽéoîýIÖ°Z¨JȲ’‡²-e°6—”\11a¬Nüæ|è ñ(:Qó2Ù1˜`!³ÐS>r[üäZæBÚP #©¸Ê¾ñÊfs6[P­XSwðe±!%KHC4Á¸Þ°Går‡i IIé {(2î2˜ØÇã !ÙnhŠÞ  ^S[dËçÎU¡÷p=0˜ÁL+ŠËNÉ-MWkCòÅBÀ‚«Z½ó–Ê¥r/úy¹+͘ÍÌK®÷d‰ž.õÊÎ㼋ÃërbÆ2@H…€‘hMJ„ý¬ÞÃÜ¿Ò?5:^}áÇS‡MÝë ÷W”raÛ°8½KÝCm³RayöÂï.6uѸS)­ˆLCCœƒi,©•sŸsÜb¬ÍÖ®/ècî·/é̳њÈá\s:=`/1y„ÛD.y»J¸¯áÝɯºØ Zœ:3u^b-GˆªJ)VFDbopz¡Ì"±¤= Áå~?û †›¿žJ÷Qî÷3ƒt°©5qÊ@»ÁyÍg~„S»¢7C#m¥°"¹ýøMí—ÖÈ”b!U W©ñ7pîþ-æ^d"-Öpõ¨3ÓJ?WI=ûŠá¯@Ëy+.âáÑÀWêeVLj á+WQ¯¢Yéª×Ö¶t–ÕÝ]æÑüõ—ýÊ–×ïïpwÝŽiä\8ÛÉ-6âB_'<ËåsÑO˶÷ñæt¹ó;wçcö.?Ùœ }f5ÇÁÉæ'~_ó9v‘f•3¦1=YŽW#£1´Àªu–3öæêFbmÞÄýuô™Ó¹x´ F†|uʵ4Äs>@G‹nò­hmªk}Ü·ž¼Þf0盫·òÃ#Øä:n›_U5ÊWý®µ“uÁö Wá€É+¢Dè˜2Na¨òìuL}N=áÖ—Ø_ì,8„;àäÖ1 FâW…Ø4(ü Ûó¶½S¨œuÕJÿ"#“Q>‘N1d«q!Á h¥œphâùj„Ù&çHdZ<˜•Äc(2mY[ûOžšš'<«]g—qկؗ¹ œ4BÕ`m!+Oµ5Å^Hí“´"+, ¾ ‡+¦ ,uŸ @N8nµ³dñ­g·tWØ̃^I·›AËÉ®€aØ9T©ÎX\ãÅ@„lÕZÑ2ÖyÞøY¾ñ³”ê£.DF™ ÆácL½ýó#”ᇡ§Þ¿k ª jF-g>OQë‚VGÅ“{ícŸE­Gþ¿ýk&ù½“'RÑ|æ³ú¹¨›`¼¶]Û‰†V·¼6ïr8 }[dLv¸ÊrdjÙoÅRX"AÆéêy©//)n–³6ý½¶dž>)°‹þ¨3&G¦Kn…tÔ¶„=øP±G¼(Pº¢ÏÕ`%òXnŒ?R­9+mÿHk07yÁ´€òÚÉE’«ÙÂeU]Ù_ùƒ{&6¯m“mà6¦Íºô…ÛooËåAëïÛŸúoE¥tDá;B@‡†‡xïà…¸·â[bD_…‚5£Z)ök]y-PR5( N›àE®>íSs˜a]VÌ=¥Û²ÛÎ2×( )⣃&+ÎïZ™!Äv±5‡E 5nª·Aà§e¬·s"‚zPf0‰ãWþÛÿèþ÷láîþi¿~ÛçJ%úG~ÞÒßÿë+ÿ/cóšÿ§¯^ô¿1c¾p5X³Ê  °ÚDUT°Þ·ùçŸ|ÿmAíùoÖ(4Žk0/ß(°X 6Ƨè!,¶žaSÖcÎñîj&> ¢ì-pp3ÚsšEð˪Ã-MbèHU‹Ñ•ÙI‡zŠ©í"ÒtŒлœµëõÑÔky|j¿–yë>þú$ϯÎ1ú ½ä¹åÙœr]ñ}‡ž~æ4mQ,…mÛvK$6C„¬Ë °R®¢zÚ‘ BÆ}7?HW”!L"éjGXÇ,7¤Žvýë6Ù#'äö¹-Ëâ©mj–nï¼zÍÒ}x<ëÇžïõÙ1ºŠt¯I·æäh¼7ü)êoæO!k¸¥Û/7¯-&‹[jÈ1bdƒÐtußÏŒ«ƒ‹‚b¥D5ÞMJ¨%º¿µCmvžz-ðÁ&ô̶~íë¯\Ÿç[€n¯uÞ²{“æÔ¾xã]Ÿ½pöõ†¼ûÌ)t¹×ù<›ÀòW6ì[’BaÞ£ùýrw`ëúä´Ç[­¤=ÕÌ`˜‘op̤HÖ®*…Ò=ÑHj1è‹L5ý¤‡5c¿™³FD`è]¥hdß{u•¯ÇõåLßè;ÝéÁBOšÃÍÉŠc(+.P™ %:¹±\-%²³›•#×Z|䌈\![Ïëp~Ï÷ǯ´·k§U߀7°PlÜb\1Å$X0­äB&š‚n­MÆd·Ú=],îZÑÙ«±ª…ç %…¦•í‹ì1à`} Ófzù‹ZxvqCøªÑ¨6ã¾Z~Fê]ÝY}щKŸe’jº@gÞ•Naºø9=¼Ï/!ÇþÐ-}ΗÇC´¹2àMâMsÅv»³¯óeSŽUÝœ $ÆþÞÖÿh-¢ÇýÆ@nÚ_…6„Ž€÷›9,=ëöO0y„ú\~ãÔ¨okÂ\!ë=Žá…G›yß½¶öv­KA"KziîŒüÓþˆE¡£C!cÛÙŽ9ŒO&–ÈIò àRõe¸aHA™åÚ<‡·qåuv¸»½'¹N aò®Øæ¤®Ï {ˆñ™D[Eô9ûw”aï`ų Åc öèÞå¸Í“ÛÓD?®Ðó+qHü¸at=:‡›ÜO]W­{l ¼Í†øt%0‚!ŒÒËö§9žl©Ÿô‹9éú–˜È‰è6ŪÞÑGZÍ¥¹WÏŒ¿2ã/ À |â~Bébàðrà쯜G˜4‡‰iÒ°ÈaÀ®pŽ&†sí;7ã†kŸ¨Vr{h¤tNÞeL|#üagY9½o7£Û{»þò¿ròˆÊéuâÙG[ÝO:É~ÕÝ£U¿0 ‰Ü¬éÓÓ!ƒ© ¹jX^ïa<ýÅ¿ö§~Œ¶}hµ‚GŸêwÖƒ¿q¨GÃn0\K{ùø‡ÄßZï­šaÿxî¼Xs;,°¶2õùðö–ý#ŸzŽÞJcE—ʲõjt¹“\ž7dQ8YBδ Nï,ÍŠì:ÆAt!J>,ò–;µ•6\{Gg^9ÓdâQ®òò@9¯+?`°Îüó¡£g;XíÎríïùÖ箿Жú±)¾ >’dsXfN;¯=_û:o·ö׃]Á7^¯»¥Í.ȶ˨Ž.Pí4ö°8– ÞÇ“Ïc›£S‡¹?Xžj|*•›Hs3?EôÛ \šä°âqÎà¼qhÛÎÌ«òÒºŠe™Ó–f¨C‡Gô^”ÅÕô2MU÷ÚÓººÚôJŠ5)OÁÐÜ١ª^y£¶âh&ç í ó¬¯-Z‚Û lUé”a‹jü‚d‡=OÓÛ  h ã‚õ"<ÍøáÄ®Eßm|$ ‰'ßÍK5ªô¾² 2íXHÇ4µ•k´«FÚ dé6킉!gé@€rÈîšK®Ñ˜„]uUD§:ƒqÁIK/0K&G„’C÷œ}‘Ÿ|x ô?>ýÐ+ÙªÆ>ZÉÎ!¹b<Íä¾6:e­#ÖêH—§ã)h4¢gSë ƒjb¼- riÒŸÌ!Û•±‰jR“ T¼ÆŽ¦—E·<Ƴ.N Gk¦±ûðª" Ù6Ô…0A 46 2›-†H“`ˆ¾ ú®~îŸë€òãK GÔn.(ÏÜú0&‹6é¤"8ÑÎh‡¤ghBkb*Ž1à·1M¶Édh‚ÜßJø¾ÁìvÌM®÷ù ¨Aϯš<9{Z»ÎóêÎþ«ç~Z±ñŠá.~QÔ³õ»íóK—Œôþ€¡*RWÝÊŸÿo/ÿºýì—@Ê%Öœ÷ή{ùÆ…Åö]ô-ÆjC­’@Mx]n…Ã] ß4mø\äõ h&ëïÖS86)ˆ›XшYZ 7 ^ ÕTB¤`”VWÛc\½¶˜QŸugÖQ½Y;ýŒ‚d–É v}R»ïÅâ¿÷^ÿú¡¯7—þ¾pf‘Ö쬚-”5­ý¹99löLV12«w„Ö¯—:ßÌtUÖTÝjý:·=>Çùñ<–Ïç?Õç·7E3b åõŸ]÷û˜Ž>LýGìCñ]ŸîÔÏŸÙÒDe¤½vŽ¢A5–Œ¥2%4xHC(W!I åvÄPZØ}‡JÐk “»ÿéÿµ¾ø?qø»'.§Ì„¿\gq¾úI‚Ÿ7{v’a¿jÖ* •›÷¾Q(¬[éÏÝæá…ÿ³Þ_™7±Å­Y£“5zñ•“ÐÐ¥G÷yBÁ•Ò3 šõféÞÏH¹k8˜ÓŽhKØ‚XùsÞ'û|i®ºýats,a{P“ª  š‘Eœ¼w»×Ž®„e Jg¢±/Ô5|ñDÝÊV“&Á±Î‹Ùï¹<;…[öË\Ô¹æï¶Ê¹âàS¥ïyëüz0&‡¥òa=\YhL9 wG’)7\;ßÈ™ÎøL’KÐ8p?}ygQ‡h—]8¹g"4Q^)å/lW&‡…Ý}ð\hPj’ˆí8ïdzßëŸ,»3,ýþÁÑ<.’}òç¿Ä•¢FUäØ9K?kyb¸˜ˆ,‚‹O5KéàÕRŨ’ë¶uÆhK© ݵmßÇ^XŃRWꊕÉWGVè<Ë9®ý,ç«,áþX—ѰѳàýQÖ¦h.ið)«!—°)IøÁ¹QÜÃZ©Ô)àËaM³ŠŸn%N•¹.!*Wö/öÛ:°ÄÑLÏŠ Ó€L5ë¿×~˜9;`^Õ±í}#¯O²ßËÛ+­Þ¬éƒc#G).ê5Î,ÂDez·ÛÒù°u0º§u• æc-›!P$×ÓĦZ £2ZŒ â ¢¹ñÑÁš”à*wÎCT«ïœÔÅçdÚ§³¯’¥"Ø8Õp Ô†!‘¡­t<-¾ °%ÆÉhËߍо<:¦)¹‚nË#¤o*ýðƒí6«dÚ:Ü΋Õ0ϰŒSø¡jÝ„¬¬:ËÞÓÝ Jç¢j?‹O&žN\UÙzü1FÁlÇK$TPùîïèõÇ}7ëahÝ6k“G{Þ½Lþ}öU„KË£f[ªP0Z ½Z`tÔÛ„ûW¯ëÇ+Ÿ/Û«v%`V%UEKÔ8Ç ¨X Ó¾¹ç™óiëc^óþ”¯Ïó¹Á·ÛÓÃ3šZ{3ê󓵦¦Z4EY²6ÇÎöf;ôÞ_¯J1B´__ü±£ ctVß1‡ ª»Úâô2ÛèIŸ™È4]CD1ÊæeCf‘†Ë­$L–O[ý©íýl¦¦uŠ2¶33FÛKKå¸L“@3úŒŽ£ß“ê¾ÏXèI÷äE¬Òþ´Ït2UaT·QI_Óî'ÈßÉ*²@ÜÌŸ¸y­šYå¸CM×S¬Â[ÈJAXˆ©šÈ'VXsv­š3Á6RÅ\;“¤ì0ªδ6¡£yiE®¡ +T Q€)ħØãàð#²âk ·á­Œ\4”8¡ÕÊ=¯˜ ÙAl‘&4àë")&ÂÚʹ8s$G²w½UÇ®ö÷¤›÷··ƒœ¦×”JýŒÇË|ˆ#§ä¾Û° §Â3ñ3 ä—ô—Ý“H<€‚•ÿÈ*P¡mEÔõTÈ| V¼i¯OèjáÎ>r¬Õ†•øÎ  „+B>Jw­»FžœeÑTy!¥P{QÉ!lMѺÜ'{(2'ˆ£¥ˆÄ©#2Ò·P<‡nÓ#ûÄDd°¬%·ÒÛÿxç¹›Ìß>¾-OLÇ_¿ñª£ÿßùþMDZ³ÞB|  ,M¢(¿:ö_Îæïû©"ˆT4ÂÚ+ÀZl›IÝ;Π$“Ho箫™Ì ¢Å8œÍSÖ*¨¼ºj/½VqŽèÁgq^ãÔâ€EpÑÊãrŽ&ÍxáìÞ¶ £ &&ƒ{?”ñ^×Q˜:ÈéeªÌU×ÎÉÑKüê½W×»Šübž7•¡+Ãfû” µ®båé~[UªJÁ[¼+Àt*åµ,7`ÏÓHËܽª¨êyPBx7Ò©Õz$«`Áxê+çþå4"öý{½ðµåq›;@¡³®bíIÇ>õS·ööc›¯^‡(¡©ò(*­W•ÿÛÿ;ZNþ÷M·Õ°¾8ã.CA©NjU#îÎêPã[ëãTqfXçiÜ€b/Šëáy öÊkåãh½Îó÷rmSÞºÍ7ÇWÜ‹«¿£N²éÈa§YeuÆcÙ ¥Š±š~†{Gj¨Û̳ŽK´…Yq?Ûì>ïÌ„­÷YOß|±õÆë÷>?€á¿þ|w<Ö F! êµ'ƒ›ªAAÁ^Ћ„huC?œµ¤›U¡®84&mŒG=:¿Üý—‹¿ü•r3EfßìÂÖ5Üñ¨ÝÄJè›ÃmÞЬEüð,à-ú¦6Š<+µ–<Ëxj°W!Þ<ÁïnWžŸ/:ƒ~ /ûBTO³žÀ­!&Џã˜Á”¢×Õ»Ð޶ȦRë­‰îXÀ¡¼ ß17÷§×{Ïqí(üiÔ 8ˆ€Á`쉫ìFi4ªN¯Â¡eâö·µF…{Zoé‘¿'ö94µ ©ª-®çŸbUç ‚ƒÛ5L’ÚqOÍ3‹„›’öAÃGym•ê§1»•*C_}“áÚò§»ñ‡½'òKÁÁ÷sûvíw¯}¯XœíRX—U>$X½ŸÏOŸ¬ˆË@¾niÅá¬ÐgaGSÿŸàênÉç¯C¨ª^ò¦ñk¨å,ÔZ\3å Ê6!ztlÉÞÜb|Žn\ÍÌö&ÖÌï‹yyÜXÁƒ¾á®Ë/Ü]øMÎŽk3ö>!pØ%-hæ4926!\},î£}0Š R!ˆÌ\˜Sîe¢Å]yP£ÿ¤cëï¾mç_Ž+<Ñ 6ÕY+Sð7]2\ªˆ¾1ÄK*0ð }sT%²`¼paüÖÒú ˜ËjaTÞ'(ç„"i@Ô¡Ñ¢”è+°¹)›Z/ ,¡ŽC®CÙ„”®gF™Ý¢ÒÕU‡®Àµ>M€‚úÎ:'sFžYžÓƒ5߈«{ßï­níjÐ?Ïë ÊJ <Ÿµ\´‹ö®ôìã>X ¹”—²Q³Í¾ÍƤè)’"²-uŠ¶ÂŒ­ßŸ¾A²Æ n™3%5Ãä%õ=X×ïÕŠ.FÎ æi:JL­q…%ÆŒaÓÑÀŠÇϱ­jÌ] o옩׊§ÍA{ÐÚ®õœËÛæ­è€äYôéwÁÑ]ÿPç¯Ä®)Ë…§œIÕ¿«¹® FÀÑûKÆ{ø–ê•riÕoÒrv}dˆ™iRØP"Т°„ÃÇᵤȥË‘@Û×þü{ßꉓ~'W'e“¼Dúî.]‹+Š—^æ¼<W›·z®¯/’ãy·&ã8C6ÄrØ „Óì£ßŸ¾h¬×ìµ\m+^®±Z^ÕðT ,TËÓ£Æ%­… ˜ ð8æ“Uì s¨‡ÇÍsAk‚Œ»hcyäN L±iø+Ü:xjƒ+ +éºäã XØ‘ßTw«oxšÐA›TV‰ dÔå¦2çÀ7á£5–c>Iéäžæ1½j$J 8’QE ­4«÷rɲ%¡÷^çÓŠJËØ+ªXóJ¾°êJ»¯ÌŠT”âá4Óoq·Nž¹í´™°ôÌh…âV>Ö1b˜)Û®¿ê™öþðã?`Dçfó—ŸõTJ¾û$?Ö³¢VÿYðO§ñC˜Õ†\GÁ­¨%wñs…ï÷2[Y0!²DMŒÈî–s± L±¶ˆT2àE‹RùŽŽâ¬7Ίù§XöÞ°èbV3[¢™p=ça-h¿žÐT•Ž2»_DðvxóB‚HªÛÐq˜üeYÓ#;±_DÍ |¤Œ½º«ž­Ä˜® ¤*\µXøPŽzœ—zúÔ&¶âØzx-¬äRqT9ñR3°‰¼ˆÌäƒ\•G¹k ÌÊ0&‰0±VZh7ÔÒé" ¾ðó7¾tJÒƒª¨‹dá|…7ëÊE…Â20·~¡2úÓzâñ”i]O¤þ'ú‘§ÎàÒ‡%ûÃo¬ÌèÈX‰?¬¾YrÊ‘‚¹ÔuÞ8~9«œ;qr—9)B³HãÂ2ª&”“‘Ïúþ²ú`Šú±´òÉ0b™Ó¢ècòTnFÇb²PUNID†ÜÚìÙ:2㈊ÑßaŒ3ÉÊ'ç!úÝ7Ó°¶²c¬ÈÁ ’"‘0­>¿ñAœCdA~ŸLh–Q4 Ñ’¶•\”ÂG,7.ÂRÛx‚€‚ˆ ÞÖÕsÁ£¥NçX©ë2r*^ÿdçØí9ÑHEÐ liŒÄœ9b’ªMÑâÈœóÚëé~Ç̬BeƒVÇ‚f]#€•$öV#Q®™ÐSß8VAïH ek¨ã @ v$Žlª•˜‘sÉg¿#ÃÐZÐ}8—3ï0ŒóàúMÎb«Áæ·9ÿˆÞù4ð¹c‚Gøèæ®èPŸÚÛÏ «m]©ëô’ÿÈÃ?.9` Rq_ó€-Ì£÷qÅÏ%PJΫ%óô¢4ûÎ"ÞÅ_·;¦€1ÓEÁÒ=`ƒ7Ý‚P­Ê©ž~EÌ@K×õ·ž í “À>_÷ž>­]*lˆÊ—?âªêïT 7uòÔ^©´ FÕ£®û´(¦‰q’GiüM>Êüðb)­6Â¹Ì zÎ÷7ehû´SˆË:PÌ{ ïPKJŠ{†ò™ÒÃsB I6B« z‚¿V þgïþ—Äøsž¯ÏgÞyÁ×kwhÓýË‹ûV¬0¨ífÙ(2 ì —å¢o@ LdL1­ uäÈ@.)ÆçU`g³éG¦£–θ÷ZÏ‘ómÙyºo»ßÙÿuÝ58¯€7èQ8pæŽbÁÊ<É CŽË8~Wúìì"m¯nJ“p´-[&ÀaòV?~?þc¼­_O]÷\ÂãòÓé©$ùAø¢Ý¶ Óy|Põ© Ú(0/çÊTÉ ‚jC$ô¥ºÂ]]pPÌ,EämÊË3[ÝáÓrœRP_ù±Ü½«ÀoÑ‘°˜.Æ-ÜzñåW¿VtÇZÛlÍÃ&òö\ÝnTfTÏl«_ÆâЉîI’8Cvÿ·²ÿn«¿÷ò®=Q_wúë¸ÆŸ3 ©ÔœjˆM…ïJù|Š«m + ÀLÍz3“ôW÷Ÿ•Î+ÞÆ¿Ø×ƒÔ}÷+áTVÞ©~zøÖèòÀUvÝ+l oúïx°[k6éŒhüK *¯‡‡aʾš[ÆÈééû}‰¤®q–ýïýÄ:Ñ5|mVŸ³|lz¡ƒ E’s 1|B2¤ƒ¡ül)†?\:Ûð騽þ°õ¸1Ô»k$5*þxÃ>àþ‹%-j-àä¾ã}û<*4°ÁÇXм¡‘ÎŽ³¸©ðD(EFÊã æUùýœ¿ôà$'·;tG%¥°bæÝY^84}î?y昡ÃÌüÈÙÆÈǾdN:5=PJŽ’òìúC–êúÔн¼~'èNJ¾ìàÇz¤ç‹Ça¿Eh¡\ƒlRUzî·¿÷d®å(§sº.ê»í—ùŸLËð«wÜømT7±kdVÎî Œ©–z”ó>Pv¹-¿°¯TuÇsíhðÚ˜œÃyõ’o3¤Ð¬“b: Æ;ѺËäx’ãS΋ðŒv$dÍÚÃno©H(œDâD÷ÈõYܶ:—‰Î0ˆ‚~$-¯ôY(b³6ŽGõ¼ê³°Ýœzºr5·QLÅ€O#ºÍÕÚ»É|²Ÿ ùªÃF÷$PšÓ ‚ à\P›½ \½ó~ÿñç'×o$8_YXžÛ™·#ëCË–"s¿ŠÞydDw +hû¸Wm©F5™Æ¬¦ûY{\ÎeÞ-Ú©Ö½Ò>ªª\rŽTZÇ8+‹ (©ÎŠEÊÜþVÔÐa´²môPª–Ù8ú8"¼)uŒÕ(Kѽ5Ïc»°VM ‘ é:‚“€8ŠEiyô‚EK²×/ Ñǰ@Ùtñøö=ûyÏyÝÊšaäZ¥í&[c)‚!¨¥Ð¨mFCÁï0×3…áï}u¦€tBJÖ+i2‹&d¤‰"•p²\ÂiŠfÐîŠùÈ;ÆŽÄÉ™oá€^ÚO¸™d1e‰,DÇòò!0KÒ!ÔFjÛž .¾)T¼_<>ý½ëŠG»>c2Ù^z¸‚4ç}–Ó.HZD'òY‹Lú,d“âÕöý¾¢¯üš‡˜îÚ•é)Ôô“ÝÞ«à:–‚$E~@°—;´žôÑwÐ#©K¹$PƧǴ–lHЭë{]2žÐ° /Òu~ÒªJ¡X6Ó°wÃnÀúQ¤GÃÔfdÓ¸&ŽžÒÀ¦8á`©7ƒ]q—ÈŽ] …XÊHdHe£äF}«ÜÕŠýÏ! ¬ì}øâ~Ÿˆg¡Û[ZØüµ¯|‡Þ»±)¿üÜìÇb¯Î»ý‘vÓþN‘Ç…Qyxl}XçÂsjJÝ=K•G»"ó¦ÆÁ Öù2IÁÝ^ؽ!}T.¼¯,9×ÄNÝJÁe¸d)‹M‚-þŠÃL%ubmDgq\Dçñ"NdA´àY\U8¡‘m¨©ø]\þY«òTVw~:”»æI5+ÊÚ u9ñÛp*á¸ÊxD”‹«“Õ¥°9šØ“q)½$k›«‰G?]“Ø¥`±¬Ž'rDœÐ¾¤ˆV£Œ¦¹G"¦Bé㪠†>zäSø·Ô'EeßÅÞ$×u݃¼TJžùʰ^½Œ÷Äç‹íä´ø««†$:H_TVþ³¥Øýëƒ_÷?œ÷iû¯+ŒUô9¶_¼ýž­{ﲇƒo<\·eÚ#ÿD³,¾ü…`õN'#Ç(JX¥)%Ë’Yñ‘ÀK¡ ˜£"ôCü>Ñookï ¦ýKÅ&1— Ê=slZ¡{R$ýn7ípÈ‘9$2)†cÔDÍñKTX´*Ñ/ãÈãL-÷ÔjÜéÝ—ó—‹<ÌGþÀ€…±û¸Û PXXw\¶ë»’Yž Û+gY(É‚Ï?ÿã…ï­ÿ?¡kž·ZZd\¥²ªb”YRœžëÍgOç®d©œªFU^±ò6 ,…ÐJ|8]Öbv±0Úq‚=Þ—^î\š…‹Äª nQqiì4²UV«¨”°IÎûÛpøzÒȬÈákÙʽâãGfRˆâ¼=Õ5[vc^*p±Î’X¼šQeMÀ\ôux×­ä*_»Ì_öó,i^—#ãu†§bž5÷‘ê¤h_®è­NWñ\bÜu-í¹ eü²÷éhwª€Y|ª©¥Št!ðˆ¼Íp†‚RoF«q Ë9íG°;7›k¥ÓP8J®¢ÆùLXΞχ °Z¡÷ý”¹Úõ¾½çó)„¡µ9Î$ãLñõ뺨£zúÒ¸‚ ¥!Uþ3ƺJC‰ ½¹œ¡'Tx[i³ðŠãÚpGÑ5-ç"1lû{>ðBücç0>áÏÕ7zW"È8ˆ""¤°$/#åi¬‡$:Gb¯rÀWý#ÕŸ¥?éÑþ4ý” ¾BÊs(u÷þØ´ys©õ*¯ðæÎÛ{}'|¿K´NÎJúÚͦn: Òåxs®ñ¶§Aï¾hw¿|ã=µüåE¯xÿ¾|©~~Ö°wó¸×²‡ IKî˽jçÞj“~¾WÙ;ÙèV8Ô|äyB´çUtZú Þb®Ù¥"5"O¤ hRsˆ µ õ¹@£ç)ý¶¨ŠÇEö¹ž3lXbµôÚ^×˨Õ-VëhB Æêjî:®EmZ´½Üç'>*Wçf?ÇgŸ[§Õ ¼ù`¦ÌµXÀHVÍ-È8\h³¸¯5üÙ˜$úàÿ yE²¥ä‰¨xq,h‰Jm[4ÀÊØíŠóER˜™ßo¸c­Ø¢6$ õ‚š0ã¦^¤`=n||ˆ¬Ú[-T'ÖnôÅ›éô˜ EúòL¹XL]N¬~\×–@4ƒ¬*AytŒVñ›ñîµûhc­ ´Q(B›ÊíØåR’=[Ò>ª¯†"û³ÔߥG°yiÉg¾kîu¨:ˆ-¹HxÅM¼*W£Ã»(‘:àüƽ›Î;çØ ÃhˆeKÛÜ )˶á1ÍÇûèîš‹‚â€^k¹Æ †;'ë>P'>c±Úðkèˆæ”ŒÚ}/åo}8²£k2«%Ñp¤E}Â¼Þ Å‘ 9¥q ‹f1'RÏQÞj ôeHiP…:”Œ4zÎ4¥#¯™$³ƒ†,ËNl"‰˜ Óð b^ðŠß9 ¿ù^`Õ‘ uæ¦.FÒlèO*X,–[{_`¯ 6Î(Ï~ºüpµöêç¾eôwx“ÍIÕ«†;#™À‰@Là:Í© û˜qewNEh“þžÎ*»)A ^Á$vذ\(×E§AûlV»¡˜¯'y7ûýõäwÞWûý’ëòRùuà·BþS”ê:¢ÀBÁÔ Å—ô9W‹.b›Jvæ’Õ¤ïÇÕDˆÑ©×¨Òõ}¶§á|Ov¼V£øý@§Xå;v§ð.|Og•!Ç¢~²¹§Û‡\žàÙ’Ý]ü„Å—pXFj„_/—QÀý€|¤¾Ð?¡o•CÆÚ¿|<浫›Wº^Í¡~«~’ =¼cG2dF¢iï6€V¢’ÕH…Š~J‡l,e¯Àƒ¾–yb|C(3mn™÷²WV—?‚ÿnß×[&9ïûG“7Nˆ¥kަ!‚> zKcE~tw6ô¨7¾1¥¥˜á ÁÌUøfÇéŽþÒ%ùÀ6-——^—ã?þÔÿÙ]§·%sÕETÖ@œ© ‘éá°¨ŠÐáVtË ¸Þ÷»ô—bn=A®\Š4¥’¥%g1ìÃ~¼¦‹R« ÓPShN6RüÖœºî÷ʯ`¶råÁ2㙎 dá3¯^´êqæöœ±80ª”-ºq?íÐ& ÂJa,†©âï¯âïÊûÆ—þ²÷74{ M ›QŽýŒPTËsX«Û}M9í šçö·]‡£ KGwôªp$¼5]ž·4t ÚÖzí,½Â>Ei{Ë3kÅÿçïN«&{Ÿç¾ ÷†O,CöÁ~&8LXîšNx«O÷‘³x…]½ÇMi ¶[´]•Ÿ'=¥¾¶™”wß\U¨º&‘h4Øgܽu@ÑPOÞY•La¢ÎvŠL®pGúÚCçxìbùÈ>"÷êß)îÆFZØi.o,ëzß1Cy—¨)÷cO{ Ê R»³YxœñyÑOµOC5‡6/¦ÆÆŸr§š¶â³ív‡_~öp™5Vo\Ùª·o«û°Ü@ÍÝ»šÝ\lb+›XC00[n~×,=5ĶŒ†<î ñu91¾sÈ!>Üú¿ï§.y±› ¥ôê"/¨„-Ùp,¡dGÁø*epä©èj/¹úb{{}0¼Il~ÇÛ0‡Õè_^êvŒƒY»y>ÏóíOÿÊŒCzÛžÛÇÛñ¸ûkÿvüÖwðùk¿'ßú8ÊEO×O?©ûj§~Ÿ¿zñÿùöÿáðá.À·ÛÏø›?õoì×=úMÖœn£ÁÍo‘b½tÑÿ ïV¼Ð/ˆ]A7ô˜ÃÅ᯽/®ÿ™Úï~´ßåpÔ&Ù „2Àb¼M¼”r{…¬n4L´ä#c¯üIÛ‚ ffk¹þ:ÕYŸÓm(«îë<[E*(¾Þi³¬{ Hƒ`œocê]ÎÉqßC•vôÖ¾;'°4»¬³öpë5ê WZ6ƒ|tøë³óÚhÏm¤÷±óåüÁçsa§z#0gù fñ×-¸Îõ7]¡:|±n:Î,=±FñyP˜cí4'´Ÿc|¥gû îqÅD;‘µ¡»‡ž)×EÊ¡,Ý”J©§J¨HŽ²ÐØé)Û/‘Jå06bª;˜¤e%j‚èŒTº#çénC@«’ û0x0†yÒ’««qñyö9zÙ·”Yp5z"êÅÍ—™ÛqïújÝïKï$ú.ý÷_MØuT61fúÕlöùð ‘{¡¨kfE÷‚²ÐZûÖ¼«Ïò. ›KyM#˜¸4‡Y(J¡”D(ŽÒÛ´Q4 Íy¡*;ŽÊ¢Ð+¯«š ÓªN°†¨d~¦¾DœãŠRÐumœ^ 7µ“M‹ò8¹gï—w?˜=Ø²Ó ‚jÒš}9PªçýÚÝ _¼^¥Ç¡ré¬k€¬Ú±Ù 0·RÑ['QëÒ„cùçFåXǧ2ê?»®AŠ˜žo/žå‘j©&z<üø5—â̾þp×K¾PX?=In0ŸjÐhc–¼gÌMØXB½–÷ÃéÈjJc uSÑh­< È fÏ™< E(Xfpm®µñƒSË]ÚçæU<08 ʽʑ™X )GS•å傸²4Ò°Žå'~åï w_ýqØ?/õ·sõ¿¼¹¦Q¨çòí×õsKøAÕÙzÞñ¶Ôá®&€>מÝ6[df[¹M›]G›“:ëÑŒü{ÚuÕ£óž&n 33»§a¢º³™‹V]¸‘¢Ó‰ïãÒ£sOru¸þ–)Â0ü[!oþfø:Ámíé,£ç«U‡ºÎ£OøÊ¯ ÿk»ÀÕ›(îxFþÕ íO„VšÒSµëŒ®‘iW޵mª+ƒ%ÜäG3Æëik×­Ë—r?«ˆÎ/B+…ynÿÖš§Ü²Ø§B€ µöç‚­ÍÎW}n’éîÌ–ÍâNM+ýÚäŬ{ó¶5žÔäK€ŸìÍyªzµ*¸|u½v†Eî ¢<ÌõÊƒï ¶4¯ßñoŸ_gãl…¿ð“^¨Ž¥¹š™Jè£6⪗H¬ñõ™b(/ÇTZ* rq6ÙnqþL3 ,ÌSÖ¸/_•WxÇ4ß Ûkþ,9D€éÌUô‘3»ã¼[?]?-wEJÓÐŽáví‚^²*¸âx¬LX£GÞWÒ¦_ôX<ø«ùœ¿FëÐÑôØË@Ëd—ÕǤ ƒì»ƒi'F¨²fæ¡–G…=½(0¼`q“^•¨„TàäÜçgß×Û.t&« ±.’0lMà‘¨<6ã ©gáÉa±ŸyÌ¥4e¡©š &Ö®½Þz;LZxp±pî[g–êYÎ 5Ûq–V[+Éì7pðÞ‰Qœéçm¨e†é 3/³?f+üͱ~ Œ•¼,áñPQTìhQ3Àթγù¾|‚>ÌÀÛÇ[+tñ$E™m'y|YÞB”óä9Z?}õ¢4ûk†}3ù™Ù7üÖ]#4W™yZ•‰”IpA­uUZÈâztü¯>™_3¨X‡Ã¨×Í–5n9NS¯Q1I¬Q@Â…zR_w)”b¤÷r¦öÈ}2k®#ð 8ŒÃ[÷ƒµÿÆõÂÈP€X/õ0}‚¾=áF~¿Ÿ_¹8ÓE ^ BHÅ¿GÿQ’-xφrDXñÐÞ*¦'?›=³â•Ë´ëzù‘Á¾ç'ÌX0nå}–$æšIÕ˜dTHb((hÇ`sG€ÄEèqvYgãÞ§¹ÀKÖå—Ù û›÷‡ôÙ”âYŒ[/ýù<0ü½òÍøû8´¯WH°«59Wðv o2'›sÁ9e0{¶FË3wJÅžQ"…Z L,“ƒÒË4œtàÉztÓ$õ¹€zd ‹ÜÉH¡1F(£ )ªŽ0 ê0“„Êþà]SpK´€bU0>¦ÙÖmˆ|¸}žqŸ'í„…°¦X0H ·¦i^ E;2e»†KÇš_ØÅ)£?;þào’ƒJ„3<± ¤‘&GLMð=ðn±1ÇDÜ",ê£ÓÊÌžê]ÜÁx¼ÊEEÂbŒÄn¯‹Ð]§†ÓʳÆ%Uº%I•)Nt9ò©˜r³nG¨ìœVN€2hHMYq°9“&¤ºÈZ¼{øÙÕ#bˆ’8PdXj)ØaùµSluÍ®ô˜VÜfýžïcûå8V—ïSâ‹:;ˆˆp1+r›rËà ãÑpO07cK£»€ªû­çbYÀ ›f°ÃuQ „Æ´t4(1&jæR$çÒŸ§SyM¢rÏjÀõèÏ@¨ ö¸Ÿùò”ÖÜ8kk® ë@™¸œ•tK$H*ãÙ#É@  +§¾¹ DB§©Û¯W,i­´#΀GÔ2 ŽxÜ"ùÝ…J»® æâDŽ7°GÒ9£Ã5q KELÑ¥¹¯ÚxptxþËâ*sÉ®j!G^êO6Îô+§Ò°R}8nÅ2®Ìæà—3,Æ£åu„ö|«j ¢'ÕPcËÆ²•Ÿþûý¢+ŒÂ;üAÝЂï¡#Lj!õj?//ÒÑÆ\£2E…ëúª¨ð#h¡6"¡¨„ªí³v[tfû“ñ—Õõg/÷r!vÚçsïu?V–¨þödå3Ó›é#¼‡çö%P%m?Ì öd—!콃‹d“GXá’–(½l1—£¶\m³6 :#³ÏÛ“;ͼ’ýw4ô´ûLõ¡ï¿-»õ_÷Öÿ´ÊÝøX*àbøMCçºàβf§v<äQ$¡öÃФ%És÷*hSU³+t¹çŽ»è§ó _Âîòê厌ãóaŽÉÐö*wÒª}‘þ¢·q™€¬\#5lûœùóyøzf#q4F‹BõVº¤_æà|8bnŸïЧ&}Óé?fg©])4­¯*{§½•´âÁQ– Ñà)s‰WäU ¥©0R&$ >ò¤,ÛK‰v¢BÅ ËDÿç¼u¯(,#E14—»ï®Z¥?¶õ§Oa÷Yö {ˆ<î_ù<óyÕz9xƒqj„¯RÓ%Cì]¶+kÕ­¤×ä *ÕÇËés mÃÁLzáF05¸ˆÂÛ-­ž5ºvˆ‡Äkì#}Z7ÖV^zõ‚ë}ï·øõCjòþÕôm¾OÈL?{xG~þ<ŸõW¿}Ø1ÞïZ±OxsÝz@(Š eõ)ËdyVhâxú6u-c®±FÑŽYIkB :ôC7Ñ;¯Ó|løHiÒÄxG,†ËÂÝ÷‡üBµKî¬ÒÑÔæ9ªÇÊÁÜ6yØP:¤3NO8K üú=°ÿBýeÀÿ Ħ¬™–•’·õx¯kÇ-„"mA@Ù‚šù8çÇ>šõ¹°DJ´"tórú˜‘èâžÒ©_Þ:õÚ©‚+ýNl2…ûÀT‰7G#}Ê‹võˆ0· rø(±½1T„ 'Á—>$^è@{8¥†¬[å3£¹¸sAÁÒ¥ÀÛš%謹°þ‡øê_ XÞw0RÅ|‰NÞ&îË©Ú]—{­k+h£:ܱÂ¥ ˆ0‡VÝû$îÒhr`ÊÔ„ÕGµ­ ÷¤56—Žj3rÛdn؉{æ£mÃÁBsðç1÷ÏÝÝ5h*pÒ‡}R) åµ£½ð:í Æ—Ç^Ìj‚™†ÑoÖÜh„µ¢£!Ç€–dÌNµí7\Ó`(Ùxi®äîm{wPG[.#Iº•Fäæ}ЮË1"8î¿Göá!lqÇ!5JñÊeC¾"ei¾°»rÕ}~}üúíKRèûOÄÓ$õè&’ÖVŽk¦Ì…ìJœÙ»o’K€ÇÌOím¦±ôÞÏ€J,aèð-Ñ9 ¹·üuqÉò–Cn”à5ˆ_±Ü: nìÝ×a¶é@õÓõÚºˆ5)á^œt<¹&¶G¸ùé©B`}ÌÔD}Óï½ZÐ#¦šO°f·c|ØÙè;1ûî¤M¿'\ý÷4?êÜVß.|zTF©Ûí€ tÏ™šØRY”ÖfÒ2ºé]t‡¤¹RhŒÀ˜û§¥¼Ýä……†›Ü¸Ò'wñB£ä‡ØCar²5‰ÕŠ¢™w•QYóô#?Õî.†û¼¶fáùŹÌz¹™€z©^Ë·[å©€j¢ïÅ«GsX`š5àÙtÄý&l»¤ñ„‘p³.§Àtƒ´A4×1åU àv›‹˜É}³«â>%™è @Ö¤˜5ùH×S”>ê~ä[»ßs+#PC{HB±b$²}‰ùˆsÌÒ³Ta¢,«>t ¨È{‚9ôŠ(ôž×ôA†Ã!W‹m°•×Ò÷ôŠRQü,åO!ž»ê%YlžÌ [ýêÒp_•?N÷8õ”)^ÀÔTF 4ì9íÉ ;9?uµÍ|lýÖGaÍó‹Ò$$×3LA×§ÄEe`Èa‘˜F92‚ä LZ¢œÐqvÄhðˆ¶À[Õ¹“9yС(|6R©¨œcbj’Ž‘=ém Ï„>pmE†çƆâý¨T7u\ çÏ4Ó¬$#v`Ò~R[’ʯôªÍùQÊÈ[Њîg·*âc/9¶$Åë˜6éŒãgòV?ÒK?8Kþ‘Ï·ú’ê&Jx_ûò{¼®¦-›PÊò@RThKáÂYŸ(Ë‹ªmÌ` Á%¬2+‘qn9JF驸½TüøÅϯmF ®GŽäa4R]N+µãN¯ï5ý¸£‘†ÉÞÌ­/ž?ÉÆ"–ê¼"t¬`ÆeOjsW Ø)Ö••ÇS׳®=‹ à KdÏT¢QTq ØJ%Æ$1”Óä†d‹óõD 9‚žŠ@PóçI¥Dãhc•Ï­•*®ÄÆ32N}ˆ¾3½týà‚÷—,7~Ž¡í}ACÔ_¹Î.Ôš˜°ä+3¡ÃpÅò“ì,^a ,M;¶9ò¯g<šëÀøþ:fZgÊ_èýé=ßo*Ÿ öö뙟"/ÐÛ÷«–ŽǕĕÈòd®bzÚO9OrÊñJð<: —£%Äí,H¯W<1fÚéø¼fsûm× ¾ÿªF®ÇHNº-ü:*§˜›H`Ø4¬*æè\ì®R¼_^²®«)Ñ/†‡Ä t'fðÈ6ÑPVñ%-à·×ÿÿïÅ×'•´¶ôi.€=G-Õƒ?”q&‘ì sr8zwú] áyà§mH@x ¼+¾XOšš…°V\&¬%p†…âéöÓxn"𮑫(ņ3´§© º=«i/H)úâ…ºiÖ5óÕ¶í7…W/•£Í`Ãä‚Ó#O{õ³§Ï§ëøúÞtìÀ3Š9¿¬Î&8ÌÂydŒM<p–Êa\à‰^Ç=.D‹¦¹ib$TÉ6,¨X !EZ5Òóº ŽÂ6u‘Ý¡ aÏIÔs,IÀ'`³¨«y”*÷.›§­¼Àh±½¿²ÊnQ-¦õmªËª4¼'ºˆ?K=Ÿ†áóe¾•¹RÇ8Òz´ÐéÄs㉠%­ži6¦céeÈcq ;²,vÃyX?® ”lž)ÓaÌ(—hS&ÕãPÏN¶éx  è‡Š$n”ÙPÏl+)_鼨#•ÿz`i\Á¦YŒEWó*‡>çÞ™Ï^¯» z2Õ\©û ÈÜup° ÈcO;þZ¼ ,'{›Á9`éñk¯H7ê¼¢UÂ+ê »êÖ%ÞNµ°va§¯sÈÈ´îfÇg‰5Œ4Å='å•À£0ôO¨”g Ú“7Â×7!«²ÿäö ¦%í0òÁµ^×v  G¬ŒFX¥âkH¶S«“RÂN密£ÆLìZ¶BaYG¸9íåꨡ÷ºv±M I¢% ;I›ª†•‘™#;¦ œºA©aH䤡—ñ¬ 4â)°Ç*·…k° WæÜeŒŠQF ¼nr•v/u¿ÜŒŠˆKbPq@âæëªm‰ˆµç³¿¶ÙËú°)›³ÂS[=§ ‰Ž+§È2 @yÆ«2ªêÈD*"Ô8²ÚØOæå2éÙRK+òYää”ÏxqO£ÒsûÑÁ„}›s_³OºÐÏ–A·³KÓ-9”t˜l+B’‚qÑ-{êˆæg²"fA…13Á¦HNŸ%jsv_ÚÙ½žäe.ä±0GÓl»æ·XÊ®ÌKbRu\Òç‘zÏoʹÔÙ ãc8uìGx6/g(DiH19IõX·ðxUûUšÈ…­}ĵ>µ`ShÃI`ÅPæ-(P·îÅßF ŸÐ`oà€*Y46kj3l¨".u¡ÄÆÂ„EZLÅÞ›×åo|M¥ e-Š¢åa²=š±]™xUÛƒápCóÉk.ÞRŠçþ¶º¡}I½Ø¢­ï/—Õeµ'×›8\ɉ.³þµ~Õ Á™¸ÁËÅG¢æGŒT„„©c„P• )-° 惘¯vç€Õ¬ª)Ç^ì*hŒ¼jîgÅ_¿·“Ͻ©~y·½ÏÜÏÊ„&ékèz÷çÐeDï6Ù[ n¢{x¯ƒë'ט|Þ&OŽ—xG‰éy‡R‚¼ c‚S :•h2ºáþœÙÄ+=¹*˜ÄîSt=õ Ï| ‹÷ÓÔ ´ž¯yϰÏËþužä:÷Ÿoù7´‡…ÎK{˜2]Y­ž³÷ú]}îÍ4lv;Øó›GÇ%„ô™ç¸lõFÑ-z¸»ådD¾Ù¹ê9OÞ†ƒÒÔ©þ¨ÛPN¼…wMvz¼†%ˆ8±ÿ:Ê”tŒD…Xœ@*­4°äÚÈ­€†qŒø€iöÙ×yÒAµë¯¿ǰgø¬·1^xáË /Þ}!µ'ýLn8iU…îìÇÑ6è|b見usì먳#N&9Ëv’1'0'Z!‚4’eJØøà',œJ¶Ä™Å£ãG 쥌.å±U>¶óò¾‡”wÒ#ô§ÎýÛKÏgfýtÞXã|=|cX¬çP{”2nGVû®ßìH´öõý`f“hÌ¢áèµÓx‹zÊÊ·/º¿Xô˜¶0çy®;¸Š ©Ì£a_Aj<ü-Žç4§•W"¾¯ò¹óE«óÎñýšŸšûú¸@·&­f n.„î÷©>Ðú8ÿêõ\|y¹øÏ¾4?"lw ÷à›ÖFPwÆ7&=²™Jï<¨åb©ÔÌäPôqäéhXrÞ•ÆÞ—/ÐwKß”®xv×+*¶KJXhýMÏì—oÑ2'csk¾ÆqæX’ÛHR3ð—-Öc«ƒ¼4”£_–÷®S ½ÔErŒH_¹ð¤vpå½ÜsïKáQ½5QŒJ½õ<½Ù ¢¥ßõþ_ò~35y`ú° ”RÚ¹ӋÍ0êì ÛB¸ î‚ÆDÑ ûÅ5ü{ï¾DÈ?' [³Ñ‘éC£Æ=çÎ w1Oáeh­¥§U‡4:Y¥®ôj†áƒÐÜßÒ7*iä.üÄk<µþz7‚("yë,ЧNŽŽvÕŠ¥,×+µÀÂÉÞWönæ96¹’›÷èrŸl"ÌÏ eÎîƒAf‘ì u,…W7ŽŒ8Õ`gˆ¹¿…ÿäù7!ÆÂú°• ¨kd?ï\Æ£µü¹˜ùœi:ÍTˆH¾ûjáØºÃ‰1áy%–Ytqsýô7º[ÅŽ¨ 9-q;Zµ;V3‰òõÜ¿íÚÚÌUã!° çÂrC5Ë ™Ht¹×²^ßp†M³€q¦oGo{ØÛÓÒ-­?Ý ®Å­GÔDDÃ)`?ž7§ ÒL3;ñµÏç»{™8®%ÈÖµ§úþ!ç° ËYR,³{ÑÏì6Ý÷éÿ·ýTÅRíËšÍaL »¦ÔÞMúˆFÞ6®›xFýjâò£Þ~dÆ ØœÞQJ.™5dûTu®·ò“‘!†Ã„¬ß:31}›¬ÛØ/5 5ïVéÉfRH,4 îµ€évã'¹ÜfhDtú‹“k[™œ‹¿{`í{¼œYã'0WêÜÑ<=™Žp;_dÖ©UoŽ‹)|!ÕÊÒ|èß—ŸaD°Ûœ§f6~»Ö—½ž§qõëoJo÷ë ?mm›µ?à×ïBÇüê¿´%ÑKÆî×›ø¾·¯à,¯ÄÐLH3Mâ§ãû÷z¼UèèÆ™+\ºÙŸgÖãLï{Ë­u‡*w¢)×.•âmX=\añãkÃýíi¼AJÏ4‰­ºª …ìý¯xÿ&ÓÓ’ÉÔ³Yó Iz/ͱRqŸ[<…E’¨›öxt…âšÓ½ #ÞúhZVEj9| ɾÁ€gëlSµ‹àà…ÛjH7Üí~o!œßž’‰mWrðŽ¶£_÷ ºÜ…¥l/UY#”Ê' ‚äý@‡æ­W‰¼>>gêÓí\i+T•ÜmÄfÅ?ªJ‘qøËö~WTº,ðSŒ¡ é¢Âƒƒ¬%w4løÐrÕY‘ŒÖ¥] ¢˜Ê@pत·n¯ßj4ҿͼÇêèpþ<,\ì37¿üL½4W‰¦6¶o•ÝêÎ1@‚ü}þv~òýuûfhj8>ö øÆèÚ¦“dvz´åÓ<Ÿý¥V*2¦®ÕT{|=£é=MdP É¢-š/6ÊUb2¯ÍÃðL_·ã²Ð®±Ý2©Í$1GlM"PÆÖbYòè–æÆR®Pƒt…<Ù‰¬$ú•œo3Pæ¶p°ºÓ!­©ì¾õ²w„ÑLÇö‘‡ÄóäãÇVbÕˆê0Ó…‡wÇ=¾¨¸{eë@(è7Nož}<£='VƽüI§µÀ-l‹ÐÅóÌ^½ßë››zYë†($ÇVálƒmÕQTGä2“Žó˜§²vn¿QP-T áh™…'#}.rŸÿ¬•¯?]?ÞB±ÜXË·á¬é,í*℈Ì$¯ß<×_¸òOª¿¾‘IÓ™i𮂬„“›°;á x’2jÆYQ…§dÑ¢Ý*^5¹!‰ªƒiÐçìÎÚS¹òtvg°90oæ÷‚~–¼ÛÉ.> ËDkÕL›¼&R[6\¥I=—1vñšÑzO·hùÚ¯¸û›¯5‡Ï*ÿrÈ…#¨ìÐ|hÇ„ã³ÿ¦Tñ×½jyU¼ŠhbØ…ŽÁƒç&¬Iì¢7ƒ)€1ÛÌø¡êõšÂ Ïc”j„ üçϪTñåÎÿënl~M³+/‹HÞ0f>D‹©V“£Œeó™óPRlï4òqÍìj#Օ涪ÍÍMáhzûe_^‘FIJ"4½¾1ñ‚É”y?{O2·¯ô§[°k¬LE·PÒà´qHqg¤#³í¤&8ç|ìúÉâöæ†0;˜—ઠ.¡0%(ÃÌĘžÒŠ ¤ÎØŽa|‘TKRï*qJ%""fÎûÞCDÒI«¢%ÆJ X·/ý‚t?¸2AV`x¯+¯æH¿û¹^åã|ê>Ö“€ï•¹/öãfT{´9º †2X†sõnº\nn™*r \áP0a= íÀ ¤lQ3¤tžzr7ø`Z…©I) ÌsU™ V&¬ñL-$¢Ñ@ࢽݵx`G—zÿ¦Vûî¹9!E´$]P͵·~Rëo=á¹’xF´Ê¼á‡fL ÐðÒÆ•Ñ ês\É.M qorÎ~‘´ûPäçm~?bHå¥üjPå…ë5À){àÍn-ÃoǪuWÎ`n%¸Ã•^°øcƒ&¤‹¬ŸÇóU?‹´V?*3p­í;Õ˜L… pÒN¿ò:Ú`³€iiq:Í5Õm…æÅÜX ´ÁÅ(]£’=\‰ÿ•³O|\µHŒfk @=’NVêή؀ê¸ð3tæÇ¹À?þ ñÏDUÍMrqñÇ+ûy¦Î¢Eb Á 3IslÙöDcD`‚U¡Å]“èß«  B”U¥ _8÷Ú Xí%gYBˆ« ¬ùÆ}N¯×ð%f‚Žðö÷ùù³qÏ=…\ˆ`¶÷¸{(Ef~—xÞ?†Ô¯o@/„ˆ‡ß/º“N ž±Ö}’¯O}íf)’³™Œ{+ïFJ Û 10Â!;Â@-KÅ¥¨m ê–SE鑊ìkm´ ‰[¡¨Àëç­'Ý´zÕœD8+ÁUÄÁCñp¹S´'s1IÇ«ºøÏ@d¡Äð˜$7ÍHÀã4È&ßÔ3†Tahïq™­}<Ìø,:œÌ»@Z²¢žÓÌ™ý˜41‚€ÑØ6Ö†*‰F›RºÓ§ï¦Na1,ôˆ];mHÅzìþJ+}Žä”+“¨Ž’ ¸ 9A\ù×C4P}ÀˆIOQ4ò]°'#‰ý’Šß5™OeV¸Cï Îï³;Úâ /‰b„ø•qðÙ§ò·ÙsMŸƒ| G4cT(€jÐÊÌ Â$H¶2f\Å¥}Sj2ƒ"Taˆ1R p“°»wîé™ÛšÅ§GÍÛiÌ\ŸçjÆóNvy~œ C7wúB[÷~NþHõØÊ2E(I4TPCÆVXúá…,y®D£ÔÎkã½5h¤Ä  ÉÊ`ˆ$¬HÈÕ±!ÈÁ£_áºè&¹ÙCš$>ò±aÙ.VBÓ˜,fê›K=Ó|XÖø+…hJ˰˗*VÚ¼«ú½W̰sK8´\±AJÍE²{ÂLQä.a­[Å*[ã‰ç¯Rë_õ1Ký,a…3Å p…}MžiÆ"–Ž¥µ!Tl¬ÒU¬æˆG>Ø€WU£P­/5i­Âýô¼ãÐ~›íçÏ«}ÿœ8m+µf¤ ¤ž WN¸¯%æh‡{†þöÿœ¥³ €êõÉ-ɳWå Öî 3%`ejüÂHŽÊ¿ˆe¾þEWM)ˆN¬æ áã‚]kz¼€[ÎWùJq^¯5xµÃÉ xsf4ÇÊ£}¼Ÿ.gú¯_ó¤ä'{óÌaô„S˜wášwbCJ«ÖŒî±OÎÕæç÷×Ë*çŸ ¡ÑS?©ÙmæC×òe÷6÷Ïþ—Îþ kÛÍÿtþü»y…s‡4bÜŒ*†æ4s±ò@8.w«we.Ð}_]u¾î9ߺÑëŽu™kýƒ›wá“~߯\ÃK—þ•øœÿy4€Y)íGTEUˆ8Sw‰%­ÑÒ–áaW gíXwüíúöŽç}>ØÙ¾¼µBÎL¼Ã íµ?´ Ðé$¬¯“ `M\ õ5¯×ê5††X‹´?”-d…áð>û_ñWG*.1òìpµâ}¸4õ.¨£òATÃ&ÜFÉžÆæ×³!ZD›Ùµ¤ß{W—jõýhØ¥ôìM}ÛiµÏêÜÜ÷ õöƵÿo£i>£ Ç7íy¥+üþuŒü]ŽµÑ¡Ê!CÝ}\9êJ\JÔ\‰„hÄ™?ÒyrnNã›ú¾«û6jqB ½æ»Î9ÿ›ì÷t;›9$ã&yÞ}ƒí¾5þ÷øÅÌÜÁŠˆ†ØÈÈ0â£N{rßœ`¥jˆ ÿ®‡Ÿ3ÖiÍtóá>®Ö*ÿÀeÅ\Í3t!›Å®îð®°è*Lecð5úñg!œ(h8‰ ¼YWà%ÏÌ24Æ.ykbhÌ´ œR£<.döãIíæeó·ÉäæÎéõi# ˜´úº<úÊÄÜÑÏ#w÷p‹\´ \ÑpúD,Åa@ÛÏ|-á{¨ßBsƒíù«ÇÁO̧¹'I7LÖš}ЬÐ@~XZ»¾+Ù nF¨Þ´ Nõh÷ À›a½i¹lâ«a*r¬/„ÙÙŸ©¶þîíèÏ=ÿ½Ž¿oÑ0Ì)Ü”w/¿NÄ”á,æYzOÿµ9Œƒ¨Ìk:JSÑ,<®á+¸TÛ¬lýÍm“šÕqc’D áιwÎ O`ÇŨmÁñîõG—@x®·’–²E™ŠÐ»º6œÄfËŒˆs,Ž8ŠV ®{<¬:'RWðÏ’ÙìÑnÍਤ›„v»ïXÂãæ|yôþÊ®ÿ;§aþýÔÚ¿.6°p¬§¼%™¥r7y³Á’Ø3,•9ÌÍ´Sì=ØÙmT<ÇXÕíV¾ö¹®³iqë¬p¦Îã=°íèG/îÛ÷?†qApm sB?Jý˜üLÏ·‡½mpD@3η‡o5] 14ÖÓ£ÏÇw[ùñæ9h¨–dó×ïçd…ú§ÊÃ[ýÎÔõ~¥~dÑ$È|ùlÅȹNÔ¿žøôD_à;ËíVø|Ã×èA©Áîîˆú$÷ƒÜob¦~V×{]àDšbާ¶çø4âÚøA‡)òb6S¦<Í8ut®çÑ®ÃÝÌr£ã öæ2£(6Lå  »4¼­ª(òi'þ~î¯Û‘¯šÄg“Çj_îF˜³Ì{ˆéÚRdaº˜_n†Î½l­Ë6½pí·M¿¤ l}7’¢QËr*u×É6ÚˆUéIér"zë'ׯÿ3Ûßÿg¶Í—éE‘m U×ï|ÊÇŸØ2$ ØA4œ6åPÛÀ,°³Áõ#ý/nó‰Œg;î%¶FxìgÐéF ª-`Œmî6ÒOAò#wFŒ\ÓP‡ÆÓÖ§Ë.L\ÁÜXj2†%Õ,£UåæáÏGu&Ñqo£QõñÈ?ƒøg»øo[~âüA,oÎ™Š»Ý“p#l‹kt.]9:£Ï¶EÝ4G!hÁLJh ,Ó5ðË»Iàœ9g{ 9`z µ¬ ,f'Â>ùô™Rù« ¦áÑg,‹1F@«–üSª"ÚóŠI¹¾RŤÀçœM¾ŸÝ|†P‹? ~á¯ß]蚨•8}j$Öí¶/x$ÖŸ'ˆÔNMè\r2ÐŒ =Pa⦌µl&—&ª5!Œ‡$Ñ€ûÁG›=VÅù†u­* nû÷>yü¥üë6ž žuv~P9ýÛºóébåß¼Mí§‰9w]÷jõÍi¦†¸o»ˆuw¿k9²óÄqdéŠjß—f½¯o >ÀáÞÚèça×KKGc`,( KH‹Z»´¶`‡“©f;”´ƒÉLôþ¼æe¢jJõ5¬Ë«'ã0Ó‚°[öŠÊÒÑ¢¢¼¼éN±‡`CSqêÙ«gÏog3A¦6vwQÓË}WœÑe j@'ü¨§ðó1ú,ù_Ø››$ó3`GíÖñf÷HþH⠞ȯTï?r›ç;zëH¯ÿücð­Ç[¢û»¾TQ?ký¦Œz€«¶±¤WºÎê³àÐkmÚ_"J:Ú ¹8c"„¸2b i#Awfµûxz• 0I¶ÊE2†Ka!éIöñ‡¼þ/ôëûè g}ÙZ^#2(oøMû"ÒþMމ`ŽeNOÂziŽecv‚¾hü¬þG•_,Œ³Ö${¡»Û –9êCD²EI+æ ¬«ºRËîQ’kw`ÂTቒaOÎ3 °þÍßù?ÍoüÙ+©DjýöªYJ·ÚNÇȩތ´ µרäuähv 3{?~>{>ü ÞK?´^9W"*ËašJŠû.ºÆZÏÊáÒƒê—לqüåÄB²¤MAÈ¡3ú£«ƒPäðL/ÛÙNe²î¢_5ŒdÄ¿+wU”È—m÷X|œ¶¨/;²Â²ƒ2iú‘ÖÓ30šb704µ…©g)jr!r0*?,ç²@•(E€†;iG$#O?ÿ•Ž‚“%êÝ E*…eD-ú6döñzû)ñAøÖðûÙíØÝúA1Ѓâ/Ö{¥ÌGeµèkœÂ1FX’ûQ I”;<û±ôþïûÏ¿™þOçU^tTƸ1žÏòÖÌÇRµš¶Kl¿lß÷+ou{*Ç2q ¹˜ªh€[¢žˆ$RÚQ*ƒÈ#,p­“Ø‹;u·Ì/Û~ÎÃãkveïÛ×Tר1¸°„Œ›@®å¬T§Ð@•j€ÀŒK"å€ t°2ÈÑ÷˜ÓÖÑy»ÓëñMvj}òÌå˘ë~ï¯VõÞã+E AQ‘Šbê. Ät²WZŸË4;U¼®ár}Óx¶4:Uªt„P‰ôɘtM ¶´éŒLŠ¦Þ¤4Çž‚ ‰…‘§¶íÓÈÌsÒ›¡)üüÚ“Íh"”¿w6DÊ;°ÜOÖr»fîÄBÈx›±À/V:°P.ÀD4=SsÏÚ)¶ ,ša†&ú¦<Î2Hâ‘x,$0§íõÚisý¶¼gè[¿tÀ[fVmb¾î1ô‹¿½@}»‹üô“å:y˜ŠàJõ(VnWvl–ÕñkZH2ß.Ýv "Pe ­Q!)K4PrE;Uc³ ÷ ß×F*d®Á d‚Ì2Ïœm ‰sµ›oÈq?~æs"fiò®§¼¾5÷“Ú‹++¦Æ©“(ÌñЬ¡7õ ŠRšÖz'«nPRR‰»ž~õ •~`(qð^4ã~‘d°¸Ètb°`k@pp„+Ð~« … W€TàS?Áâ4|#%$œÎšýÛåùÍ×õ'Ü-Ñ4Ó ïØCŒÐ‘H[Åîs¬KôEÆ™j«ÿR [‚‹FRŒ&A¥ÏeÞ ^.[±C‡TwÏá^ô8mîKïŽÏ±U±RaÒÓ«ê?äyĵ)¦³Ï×ûæ 2¬WÐ$3:ô„ZÇH@äÐLÃsòWîÿÔº^|ü.³ z1¬§`Çïköð¥½b#ú®ºQ9|:óãÃåÑg2OóµÍWûjgÓ$ Ã'ñkß«'ƒ6-Kÿ7?>ì{õ·kõçÛ3ôëñ‡7Û§.g1—H+‘Þ߬ëØÜBÂ(dº‹Þ·S'{êÖ§yöÓß +(˵Ì*O"r¨ó'FžðŸ!‘6TYSJ!„s‹q .‰Dþ°¶‘³Ç j-’Ô ˆyÜò]1¯Å_q½×o—ë&êw~X–ÖWè+ ÄoBîé“lÔŽ‡øX“êK4ôìJÑ룴’}¥×Á†˜æÎÇFÅ*&ý5bÖGÄ1k?&bÒAµõéý–8Aª×ÇÞÌçV/ó´ºß£÷vx'S[ßs ßçOßwñ¯Îòï<ûÚTOZ…¿ýÒŸE ›iœŒ~þ7mhnþüT/ºòiPt.×ï{âó?6<ȹ÷Ö_eÎ)îØЪ?Ý»ì9…èB«‹¤“w«/ËŸÍû“ÒwðP¨ØGùÆn\lzö›Ç-Bà5‹0¢8ˆF÷BiOx=ã­«íÜtúÝ™šÆ™Sx8¿Ûµ[rF6„r²¨-­!W¶2Äœ `ªa½rJˆï縄#µÙY* ÌOÞæ¦æ/hC‚E¦¦/ç}R¿¹ÌÏoÛîhŸ=>2–†(͉„é3ÍËJ—‡<ŒЮùr¦MžãeàÄO,þ‰tó®”"j‰êYóP†4°GøšÁŽZÀæ¡z¨‰€ý¢ðÔ¯þ»b+¼Ÿ+}‚ëtǺü•÷Ó=?±ÀŰ3‚5ë5/%˜afÈRSŽã’*ŠëÇ8qŒq¨Í7ÜWÝê2§rGåbiôkw¡ÐìTE@ÅA¦þÖÓ˜¾æFµQiÍ1Ú³ÓêÒÏE=R Ëá艌٧‡íYª5mþ01¨’Y£ÿaÑØ H‡åHå¹÷äVÛCñ¥ !jNÙî}I9Sâ4%^üc™4H …öGÍ Á_6üR²›ƒfÍ7qa¾Uùs]‡ë2ëGýñwì“st~CÍ>åðÇun»Þêq6ãõdãÙM´Cx—©!4+EUhåutr•Š)Xö —0vo® êìånyà(åôÁ¬2ëq¸ƒ:ôu~D½‰` ®ÎÀ3cך¯ÀõsB™–mÒÃsžgôŽàÊpG3!“Öâ>4.ñy“' ãNsHVù•ZeüóŸ~Šô6M¾²Ïê‹nW®íËûæ¿ôãÕÑ-Þÿry¬¯dþÕi¦xbñ"Ð4? Âmdz0G$B[f¶}tÀ˜†ÍÛúcý½§ãüq˜…Ò67žRÞÅóî•®èCOïåÿî£ËÛK 6ƒz…[NôpÊÌgÎ|šE@?¬â}¸,(ζ«Óèá1y89úI?/çñÈþ4l %˜ÚÝym{×[o»A›K¶›íJiÛqÄ~@hZs®~ÕQŠæ…{]Û½*.-¡SÙ›BÇðÂ~¸3øe8‚‚´®øäÚJ«ÜfÒîD¾¡†P1vaj‘tE/)Á+±jf4 åPz„.˜9Zj\¦¶ÇÒ’8¬}õ´ÊØ­+e?Ìc« ¯”©ƒ.-uŒmÿ|˜OløyC®i#ç?½ÃïÎ)XÝÞ\ñÁ]ìx;R­]5ØþÓǟªÅ’ô¢¨·ì<¤]®wdMLf"²p·]e´Ã&x$à»ÜZ†Îå¨aC(‹€b3`Ò%¤c¬q÷öåG³ŸÛ~„‰ŒšÒT$ã6µ88‘nMO´VæZFÕÎæÆÚû éñ_}<ç1½JH\þæ7þ¬BžÔ|¨[2>C€4èâ.`I…PN< €þ°¬äÝ{’ Úê¡-§¬üÊÙ±“=CFKñ.4dC{—AÍ!G¤+òƒRkp ÏäÀÝŸïÿäÓúG?ôðØÑ .þ}½ùŸüîÁ'¢Gu~´÷w‰ú|–†FíHMÊR·àG‚=uu¥éXW6sÒŽD?Ü{¦ÜC^Ÿ1c{¯ŠÎ×Or"#ÃØtƒÇ+èN€.uÞIǰÃW»G!‡Ì0ȬÚ6ÂèÜ6¿¼ÏF¹#Çëûïæ·ºçguRJJª7Ý@÷éêqnP%iN‡ R7ê‰Ã"¯Á(LñIƒÝüó ]©F\¿/¼ú˜<à/ޏDœÔ/ÂŒSþ?a#ÄŸã‰ËuIX4V³ýÈ-©*' ñ©—Žºäï©yôv<~œ™/›cIÏ«©¿¿Š 籨ÖW"a´Òlu€Ý”E ¤³ØÆ«¨p§µZ+W9–2H†³lß°«ñ09 ¢–Nî0‹WÑ$þªß0~¸1Jáḟƙé8‰Á´Îrb2­Ñâ9éÈbè2W#ÓY/•˜Ôå 'ƒ=[+¹2?ñCRµX¹ùKþ‹àqF/œOG=¦”…MÑ0n¯ý!÷?ðq:ŒC¥j‰€ƒUÀÌp8GQX cߎ*Î…ößEýK¾ý¥Uá%±²¸è컣9Ô^ü“œ(™ÅšvÕל9yu0ÆâÌŸ h'™ÁÆêØèµk­š¥š¾w®´ ÿ¼ª4\FAБ°°½n!ñ‹©ó<ÆL ²¢0žª+©‚‚<ˆW4¾)ÎVÅF,_˜y‹®Z÷?—ð]ŠŸc;¬)QÙÒŒ˜æ‹Ýø&u‚>ZTgœÕ³1KÏÿÖŒÑ"ŽQó$];Ù–wÈtůßëóÚÖ,Îë8!¡çãÂPGÂHSw[9b£5qPm1ì96éÂIÕ×ieÄÄíûìqbÍLg§†ŽI2í¢yj|ÈZO\ѳ±42edý”ãMMU*Ì0`{@Lì\D.±”ŠÅÈ=ö ^ÄÀ‚|3˜þ|¹ý:×ûÓ: EÏ b96äË-³7™5×]XfhèÅÙ^ÞÐ:‚,56}Ö´ŽEû•ùrþĬ«æÙµ¶è€ù²Ô’JvS¹2Pæ(FX‡VSô…¡øš1q„Ør"IC†¬¸î’ÜU·5rq eåÃ|-™ª ŸUJIOö¹A‰wa‚fdQ‡MÐÐ"È ¯—×âêxÎúšÜ‡k)3X)‹*­ãUµLƒ-«r%cëB3V6¤ft$~Vô’6ê¢çáãó§ï¬ä߸·?¦TÒX„¾VŨŽ3—åÊŠÐÈ5 ÇžW I§Ý>UW++ãµáèkâb,—Ž]£â¾iýH%¯Úò6»RJ)¢T$Šõ—"ûØÊ¨Ö¹YšAÌÖàîv–zRB@Iâ«~ýÊ:þam‰ Mv±òÎÁBâd®1É{½«rÒ=ØÊ›AÙ…ˆß:Í´7f=Çà?ô3õã«Tzöpó<¹Mée9rS¹ZIŠ©AG޼IÅ9G+³K‚—ça)IÅPái± Î{^-¹$Ä5)q0Á•¨d(,Ii‚¤PŠ¡×ò´“šàަ¥ŽêÄ•2M¶9’ñKé‚ÙGåUU_¨Œ‹³ëAÝŽmë<³ýu˜½›Ó·o[zçæ{½g­öY]is3'Í®Zжm°rv;Ãh,5FÑL†¨VX+¨b¦*‚áL çYŸ©hÂr¬sZϱWÇ·aCš¯ÜОáÑt¡‘X#2ª5Cªõ˜ÊE.±ém¡Ï–I«TL¦”:_êcsÌ)W)Ö˜D"BJFJ¡æµs#çÁB— Á&O z,ÄØqÅÕ)•Ñ7óV n@â ðEäÂúsÜ™¸t*ŸA_é­óã4ö(jŽ7£ÉÕ4ìãà9è‡ðnÛ;›Ýìb+:ÅatMjÍ£û©×œ3ªŠ×€7›Ðu}ÖÕ¬%ו•-Œ¨YwaŠ˜•À¤±,¬R:ª RàH y!—”P•AM\JÕ=nºÀ5È! Ë’mpͲÆ×„’ª„ŠVË9‹zn) ÷‹”LÍï416Ì]Ѓ3»gzÂ%JAMQÓmóÕøÐ+8É–=¹*7‘UkT ¿âAŒžÁ4xʽՉ¾$#ˆü£ØšPaØW^@|Û ç×Lm j½u¡Ê•±Âž6çCS 3gÁa‹néÇ *;lF"àèœFÒ“é†æ F1ÃNq.8÷1²žŽ›^—¬ëB”g Ë%,+™¶ÏðsAt1ÊëøæoÿÎþ:ªÌOÍ%ã¾9¿äzÓ^6ö×_Ú÷þÆù}7='¢À‚&äŸahßÃ{¡;ŽéxÍæÏÙßš<:د© |´Û«æµ,ÔÅ-‡oÎFŸuÑäÏ®×oÎÔsøñqÒÓæøþsùoÚuâÁ¼ºÇñ/` Sý—N÷Hš~éì=ÍJ¾µüuC Õ˜â8KY'¹Ï °äãçæßQ}Ì=ÆúÚI»8>N™yx/µ“;º¥€íõ¿]úo{OIdGFÚ)®EoHPZÁ­!Ô;%XHÏÛ/ºüì9°ÜåÚr&“×ö?oÀ{E°“˜wÒ3+ÞeD‚%çrŽŽZžófr­¸È)CMI W"O,PÇר0 “01²"êˆöMBv½òº½«]ϰ4º ìŸÏòÄ@ôÏm²ˆ=ú%ÙŒ“ÿþgêÿ“ò_÷Ðc\›äépQ´eûYhêߪÿ£òí1ž÷Õcí߬¶èíÜŠÔ½ÇSÖ\ˆ[º6­e³îyùþ€÷/‹{ï×»~ÚŠ!¸/Ô=ðN@B&€Ç—Y­Ðksr7÷"gf¦3{ÀM =%Xwú–ÇgÕÛ` óT“üõÈýÂìòCž<©ö^ØpÏÇÍD¿¥¥©+³­ÊÏ^Q`)39¿›·ƒ½.AÇq ž¾Òk:˜Ðú¶ß®›ï 5ªiàÀý~˜y)ñí}^ N¸è€t)öåäu(Ó6›T¶¤1SœíüصÑ)“ô¦s-Ÿ¶LYÒÑÓ”^4Ìà”‰õ: ۃ̥!æ€@07þò:òßXû!PñuÏ20à‚‡,Œ8²¹Êô!6­xˆ”S¨¡è â ܵ¯à>†ë4Ôžó=§5x^ç,Aí0½î:¦{PßCVv3]}¸T7µÄ31Ÿ¹·ƒ&n1˜æt·v-lRý³h£91îŶ "“ðÆèØMZŸ4ËOAÑ ¡8ÈrÑZpŸroGù ¸è=‘AœÝzó³×Æ?Ój¼ŽŠ)?_×cf<Ø>ÉXžç€t#Tº‹›öºÐJÏÔ rHq‰6aS„ééçwõ+ŸÖ à³*££eúÐ#èLp¡žðȃúß®è?ÁëO"Ãú”NSݦAFÿZ”Ãø'ãßô‹‚k/v”0®êü}ëJø½½ã÷2Ç?ØhŽÛ–s÷Ü_÷§¾ë` ³xe1Ü…ýù%r#îtXî°áš^AÀn )PGC )z¢ ¢‚sŸæôy̾ÒÊÛ7¶÷{|T“Më.Ùï“ÚÏ_ˆ¿è¹D×Cèù O¼;ú)ë‹Ö¹~ežC{|Wyeço²‹$ø0 Ò‡Œ"̇†‡è$²_"5ð7Šb^@Óqº!NËßü¾Šd|Éø Ü÷˜¡!»©µEÎÅX¯â1æCã¢Ä´™^BVôòºzÄøM•Ts:Ó¦þdF?ŒþË&ïx§Þþ·ÿŸŸ¦oý×½¯zï$#õxA§'z¾*K«sO¨ƒð%¤ˆJ²Gùv_Oú×—W:v·ÍoÏ”•j’¢ ið5/í4ý–ïŽã^èsŽ'ØzÃçv}$\×–Ð6õvê°sß?âìè_¿lÿtͼèEé{N«li¡§N_ V-Ó+€IŸòž>‚Ñí$P Ù0-ê´çoâü9óaÛI½¹A³#šf•b„­ôÙÜ…ô ôM´Õüge{Òx Ù ²ó‰3JH‰Â‘¦¥šyúZ-ñÌn2šC›\Šíãûwuïò£r>1ÆwÔN7}Ô#^5„+Í0!ˆË t­Ï…šè»†² -8¤rI-€Âùªš3¯»`X€$Y$eKdˆ"ëHÖÑ-TYÊÿ8·ìO'Ëé–=k¤ôdMTìÀâ×#ØÕ<˜ˆ,)2E°¡)Àr}ÏëNE,aNÌ;ýãHQIŲ}^ÍüÑé×HÐhíÖ0L]¦?¦ïï1 ¤¨6¬"dñ¹iRªªU.²Šôÿ`ó_oÿš‰¿"ÞÍÓí53}5tf°³M<×§ë½\d¡sóŠL ;²Ü%c`/M Bü–Ï9t)¿“Ý*7s‹†©“wQá{a‰dÌšŸ3*]²ýV² "¼·uÔù‡rþÃu~œ DV ׉ŸÁ媪¤EX̆þ#Þ'‹â=µ/xã;ˆê’|¤ø¹”J}ñ{ê@-¹X½”ŸÏ}œ”H´õü Bó;áçÎq=ýÍ»ée¢Mò*çä[¦Å-VÝfƒ\ælCˆ ÅYqXÂrn¶FЦcß‘3O—ú÷ðW£B©æ¯EÑ,fUMuµ7SAaì¡•Aб] 0Î.!‚… Ñ&,øÈüZÇo{¶©Bf%BVwìÞ5 –&4»¡òŠ)£ACUDsÈ’mä×t÷LÖ~Uå¡´¡]â»*»H´`íöË’Zä  aÀæðÚÅ>œçùï|üYg¿,Ý×í0³-uµoùÓBFÕ_oº‡5•ê2•Ò‚J$ôªÈV‚ fK90\±¤QF)p*9ƒ ê` tÉy`}„±.(ÇHsyÕ\PÆ8 iDm²†ªXy:픥£¸© •Áf¹Ø„g¢=Ÿ3½ÿ¢Sµ…:רF>[s·¹žJ·Ã (…ÈœùpŸ’ "/êYóîºñät2¼5ëw~Ç_¿ûùÃÛ×øÛ>¯¦Q‚WþgŸ¯óÆ`¹æH£Œ!í:}˜š#S”¬¡¥ºp”jRkÕx´¾ýq5fúöuüÖ¹K#˜AaêâÅRír±£‰¥«¯Çª›< ¤‚<ÿ©õ¤³±ˆŒô”#oÈÇþ|èúöSúîë¿ñsǺqžÛKr¶¯óÉœÔÛš1Q'œuG€EN %Õ) WÉ#7ãä’~ LqÓiŠ9'Ù—¤÷eU]¯éü9{ÿÜò4i‘­¾}N;@}¯Ž=Á{¾›™û)DŽ™y:?}©ý>Úæéƒõ'xÞ[ŠÇ9ê˜Ô¨‹¡TdcÓ†"J˜œ•‹$ÒH«e*Š'^“¬:ÚõeûZÝy^l×mÿñèa*ìªí£{{ŽžðËêKh05u+n©RˆÆyŠÜ`#£,ÔÆD¡À‘1±p”ŽpÝ·/$+Îù~ÜK¼¼ËZ²sÓT÷†®íBÄ I„ˆÇŒ˜lÙ8¸7zä)`ÿŒã¥ó¸[•9r®`ôiAÀ=1ÊÌÖÆJ+. ²` A5æärõ!ßc7>Òeòh apŸ?*(Ïâò^¡Ê³üM¬ÿ§ñ#˜`6?" oeW‰``à÷©Ñ÷ù·Ý—ßšž5Nô¤PN B¤Ù ÏJ„ B8$®ÇÝ7Ü™$£ ›7Ù´0 4#€©¾o“çÇ1ùï*ý×"k(E@†”œ g•Ùg3örŽ8UŸûž_¿:k³îühuÏ´×WÞfUÓ¨c¬,öè¬HbÒR ¶/0€*ç–´@Ä"ŠBå*4Û `P²4Fê¶:’D%J0 hXv<é*¨@vrïtM±vU’”I”#…Ò4Í¡Å+­=;ÃL!n o«\uA´’0‰‘Üj„•Ð ÉŽ§#OG9u¼K8Ëàir)Òª1saP\}’e¯öÇ¡öJj6ÄàÄ~Åj‰K@°±áâ ¯ÁZ?Âëz­T U|A㺮xDGC­Al"Ñfþs¨x-<º{ ÔØûz‰›ƒD”Þˆ“áè~Ž»Aÿ”y4 l®90­º³ù ½@[ahh½xso¶èK9À“9ð_ÿœ?]ý=/æožï™aÑÄH8—7Ÿ{]÷<Ö×r“+¥¸ÿðQ9ÆGþ¹ fÿ]ZÛbë åþÝX;¢¹àk‘ ¸¨3ç*æ°>½ZÕËuèöB.a)äÃåÀWötʳž]ùÝø>xÎî=ÍÃÇÙ…§âlp•ŽÂT¾Úܯù­Œ9ØŠ%é^‚"Ô„UâÄ7ºÒ/úþ~_ôyüÇœ÷ZO9ý—½þ÷ž Vû"wEJÛc«ql2«TõÑô_[¾£ä QÝK”Á#]V:éPD DP¢:Žd¾p±ÍŒûëºÞØïëwgäÐy¸#o£rªg3iVN¦¶(~ê]Žö!?¾"S¸Ï’§?ž0úvë,[ÕW*T §5œ¥î‰ ֠åî%0!8âPðñ=ö«860†¨| ˆSãGþ3¯(Ž HCŒÀܨÞá³ï«G§y¼"·±ŠagVT?ÿ;‘ëhŸÚ?:~Öéú\?QÖ :ð=Yk±5Y:Á:§X›Ñ©ÈÔg¨WÕƒÕ[oÓÇ#ÞUÅÏd¾ç ˹á<Ôäuã=ÓÔÀ»çSŠ|_3¿O½ä13R¢˜½ß}ª\Í ³YV’ ¦Ây³íÞÊ¿E|èU$Aw&TT‰O¾{£>×B7øìå|Ö¹7r/±«*ç»cÇ™?î_·õkzñbìé׬Ü9]ë9sÙˆ>®7gÖÍ ’`mr¿Ƚ®¥²›O œ¿Ý¦Ÿ2uqX!Éw¦7ÃÿÇú'ô©‘²Ð)ŠZ›’²Û@@s4ZwÚiïì®<âî#=¨ˆ…(ee@qˆžVU8­”†Bm¸® Ëu¾ È´»}"ãò“?ú銼õßL»:çØWY³©¬Öë&Ò°…›ñóɉ^y½ÐÅ5þ”hâ»ÍEᤡ8Π«~ŠyZxt@ºßøøŒ<­Ù9ºžY6cÿ‹/5A‹ÒΨÿuNoýÕÀóà¼wúìf¶­Š1S!+"¢Â4K‚âÁQâc*!‰‰(Û‡ I«¼,¹Q+bÌç<œÆR*×Ôq‘ƒd»TèK!lm:šŽF…bÚ CC¸À”Ǥ›C5+*Ñ(Õ»¡ñ:Cc–2£T´2Úr±^Î täÃãâ[b¯«ÿãúKm©Ô¢þKÀÿJØòFÌ«pìŠDöÎU‹Oz¿@fb +u ½Aml66ZBs)%MJÓ/C´,xºg3šE›^£2kÕÇVpÂ1Ü8ScÍôí\¼Û?‹Oy /mñp!¥¾ ãÇi²ú¹€ÌÁ‘­íÄÕ0(Óžàü›Iø :ކM[Ös\6Àó]3 îàŠZ5†(}é¥ìOϦJW_‘\@5øÎþÛòjmù•Íg´šl8-È ·ÚSos3+ì ËÒ†Ÿ{Î! V7Õ®ºÈŽ~*sL¥Þìo¿=â]$j”M¤ëûJ‘i³ŸpÎSêjÜ_E‘ Ól.x¾™ V ®ËÖ:aUKkùxÁ²÷_<\F<#83HaA/øÙB™º†ÇÆxóàê¼ae»¿ôÍ-ùÕS?Êþ¸¨u×€KF”€L•ųÒ~*‡ý&´%Õæ[7ÿ¤>«œ©m<Üìɧ9óý×o}úr-¾þƒª/ÏFÃ.³fèL±Zî‰vÛðhWR´ã­'à ÀÈ›EL‹LÁf ñÔ¨'¼!(lïǶq¸¾¿º~7°ýǯgaê³}gÅY†¶6Ï󵯴ÿýÛ¿ãYÎÉ­6Ñ? SÆõ»ÙþApþ½Ã³µ´HF°Ëô±ýL¶Â÷‹ŒË^X€uäø7è¢!<fžîÕ@ô²1»»–Åb»5:€Ä\A­³9“_æJÿÃ;ï¦CähgÌ\/ä;òŽÛó÷ûçC¾}̘¼mãÈô»d)8¸—©|õ‡Î¹¹“•ØŽç®ÏúçûÖ>{$•íg»¿¼ÎöÈqDÈÀ,B¥˜9¤TXù¦‹ÝÑ9x¥9^kü2ëf"´Š£ûà„T¯¦ ó8— Ÿ¼¾wZ¬øðìüx®Cm¦j,–ŸE²û¼¨3vf$ùþ¼ÿˆoþ1Ž[•¿±SÛòo1øéè˜÷·rïÐEoÛmÕ”ðg±l)Ü'7ð9Ý‹¿ð~'ë0Gí¸[b¼mЙŸwä}¿tÕ©“åÕ~ÖŸaJÑÁ-ô\¦qvßÃC+}çëR¿<$;e5ÔJÁ‚‘ûd™ï̺ŸÞÞ`S}E- º‹¥®"ôH½ïõèaùóÊÙÂbð nuGëíÈ£›òhI¤EjDü¢ÜR<ý}h<Ò/ŸZjÙ8έVŠÂÛàõQ¬ ÷äÇ´½…#z[ÓÕîó,ÈEÑݽëy°ôÕµžÝÕâÔåݶ¬ÎcT 3r¯£ðw—ƒDàb¥½Þ˜IU„@•Ö’’éTqÅDPN30‘´@‡BYkÛ{úø²¿ó©p•wéí?;ÿÀâñæ¤vîã:Éz‹g1MaLæ®Ói‘$®4Ë.`#ÙI¼ëö,tžWò…7Í­•™š“[ œÙb/ €TGKв`†@CP´“ˆ(»æi›<nçô˵žÏìcCGIlÓ±Ä[[äìÍð‹DØYOñ&¯ëÝ}Å ‡«l:ã+Ô™™)ÇM»p\RŽlj#[Sóçž>ô{>*;Óü/ÏÚ“ž’2QMëÒ§ «¨c,¡ å¾»S¿ÿ¢@~æãd81’rŽ ër-â¬ÝtUЇ°mÜkUyB‡áеBw]õYjâÇ>Ø“û^|…ÔxtÒU0‰à¬æ”+Ï­®±QŠUqÀ†¸HLT¨Î}Ï‘diäµ*¬Yä–|Óù ú‹[GT ù¼¤WuŒ;¹`ôc2=ëÙÆ"S‡ÎÕ 8^I]~öòWŒ_³õLØ^Yåe ­“ë¸åûf¾X®×ñ‚ÓPQ˜zj‘| C5­‰ý¶wO/.k^F&Ã@>]3—äÌš5+”“1ð¥d*5',N pqÂÛpqãÞ4’B zÙH;tr*xåB@¯ùó4O%ˆŠ2+áA!yð¸RYUÔµ=ðB#lÇ•èx¤Zúñ¯æŒ1/ôý¡ÿô~¾6<¡G]¨ÊI•+U@ih]ÊöæÒp `”Íù”ï÷Nnâ/LÎUâL˜h9^ÓŒHW¸Tç³ÞþÛ¹0ñL௣k–qŽ%yú+–)RwA}Tþ)o×{Ñ’Ä:Ò02Šª¿´k‡Z« Y¿QÔ GþPèzÄÇXš¬×ñ[æÏôòòµž×…QSþÌÂ4k¶PÂ80"C@‰€MÓa9C©áLvÑq™©qÊ¥vNµð™ÌÑ©2Ÿ›B›¦5à‘“â xL¶¨\ªk¢ ’@--1“^¯ÝGTª‘{%4ŠWU¬2UT„‚]H7Ò*ƒ4Ó² À6ÓD@´³©­©Ì’3Y±7TF¬ÈkC¢ Š‚¾Ø&ÜtJ¡ 5¥ÁjÛÁ %uСě#DP‚ [Š#b¤¤Éh“áß5/Š›ÓôåÒMí¤gp2àóEî—/oïgìÎøÝgzå+õ€Üêý3þxÈ]ÎXàBŸçŒ˜wÛ1û:¡‘ä|*ÅÜ" øøf´@Í3F;­ÔòðȤʢXµªÝ©à1j%•ÀÔc½F¿Þé{îšõ½JU€™ÝóÍå³\ßçRsݺn×àü…êN'_§kaŠŸIC;rYâR¢€%aŒœÀŸÇ_ò10'M%Ì||Í«³ç1 ų2>ö;*ÒM¬cˆTiDÑhÔ²ÊdÔ‘"t_)LKœ$øƒË‰Ò;e é0¢¼H5ÃäK„æ‘|­ô»òë ß窮âSÇ q’ \¡™æŸ˜ÌÖ.Š¢9+Éȉ!± ¤B4ãT×ñ ÖAð(€ãhƒø7Ž<ù3k S’¤@ fRXω†©ãŠG4srÿø¸v4øm—Ï}ÓÇĪ~±åkBâšH‹€`Ê )2 Æ %VЃN‚*³20 a&šžŠÛ á°t°PJD˜¯òØÑ„5‚œr“£Å… ‹DY*Ž#„JÄ"‘„&u¬f¡Âf8RÃk%•¥²ÈÔD:€Äd« S˜‘‹Á»…‰óïÈ5çöÃø¿g¥¹Ÿ’œÝ;p¡\ý.!· ¹fiز„²R Ÿ‡ÍYïÆº*õ†ZÛêäoóÇ?õÞÍ3íç½½ßA÷ÎçŽçëûíñýxÛ(ÿ‰®ÿ½à‘Ú©«f*m8GŠlápµ½”0”°dRx¦Ž…La²2^<ªßÍÀ\j*q¨„"lÚ×ëóéÀÌÇ×ÁÓú‹¢ey­mæŠy„R7Íñ»]C{¾t~€7öL»¬m‰S®Ž‡~J Õ‹p`«­äSˆ rÇæê Á öSa2þ0{ÊÌ¥(‰FGsÜÔü»¢9»¢×W¹în[ÍÎý­ÿÙó«ÿ½ÿî¥þçm^ÆúÒÓ&Ì(FqÅúT}žSƒßkì ©òÙg»´mO·æ$ué ¡=«¤èèÛ”.¼ïæ°/`:JyOjr…¦8Õñ· .%RxŸª úPÁ*‰F]Àßµ0!Ù`Œ#…CXV–žXoÿÆ Yx|Á÷›œ= ÄÀf¿Åó}`ŸÒ÷q~ÝÙ³8FÚ›~Ûýƒ-ùzóÇô>-±" ÕºÆa4–SË1ñÓöøL¯7QNãÒ•üzཷTû©-ÚÃGÔ½™‘[â;.Ì;¿Éþ GGÄ4ÅukùpìD¼¶’?·¾Qÿ¨š\œ~³Üyd¾ÐuA¢ \OEwÝ…ÃV pÃÛí‡U‰zÓ}{x2æÖ5·á»ÓGþ¹_¡e}~ýôÁý©·h¯7”ÜŒQ`Ž€1O¯­ÔÛ³teØýH]—Xì6ìçóð–ÖÇ !jÁ®ÀšÔ­¨¢dÔ`Š·Ã£—rïw£ÏÀM²ì±¶7ó •Ÿ›74pœëç3î샡ÕÙ–+°>K‡ÀÚ<µfëÖÎþµõüí¤H•ÜêÑú!åB7žÃy¤Ž+áHJ°$4ÞÙÍ¥j‘¨¢3…•½Ô”M`¢b?pé«[Ÿ›‡œÖú­?ŸÁ¼½íТ¼¸ZýE&þ¼åÿdíýêfÿ$ºÑø™ç\Õ›ºº93Òݪ ·–¦é§’KìRxóÀTpFFYk…óväw+¹Ùi åt§•¹.õPÔ‹¬‡ˆlu”Êney´Á£C—Ù.»Ÿ<Ög©:œ€@·õll‡}}=Ì»¿û9I^.^_çøóù—û§×Ý.›5¬Wš÷ãû ä×·Úí{¥f¼?ôuk'¢êÜä5ú"ûx4rŠã‹wYsX2¼ÊðÑ`T«Ú"‚fœÏîGEͱ²GÑÝc羉:ûÄg[QU:„”¾°á±¦a*Ét+¥Ó®Ï«Î© ÏKce’ß ÝHWÁ„p?ÓÌ)>Z ï^[èÍûL±u³N6X:{Þ—´Ð6Œ”Ë=¤®¤7}ô~îÍèf<³#ü÷ãàP¯±|m'óSGýã0/KF¶‡ÓLÜw[Á0Éfo&Úo\ñäbí“Zé0*íÞËsâ%·î«žA ÛBöŠËìuÎk\=íÞj„E± ±Ë‹nµC!°…¬aÔ”3ÚŽ°$ÚÍüˆÄ–É=.n¿›‡0"HøH\=ìcàØCÔes1†X:¨µ¹ ì±ü=÷ãª×SÔg• d8ˆ8õ«îßÉy‘9RË»f„@@ðL`0ŒÍ‹\ ‘Jp|bô …‡w°mÍ^οœ¸Ï>øY—…ZŒ‡”w9 ()÷ú­†ÖŠuáÚ‚;Ý[{–¢¡ ²¦{¢ÞÓ÷·ŸÞ¼o<62Ò¯6?Òuþçp3°†/3HÀœ34­7„çVT£Áì ¥†m™\°žøzò¹EU­!6 ЦÜ/}²¯þ·æÿ2bºXÞÜ了–Žt­ÿ“>Û~ýåù¿­n‡mZeÑû©þæyv@-Þ¢ƒÕÞ‘†sïe|ð€úpûõºtÉNC1 µ#6‚RªÛ–`P{Ö×Ë&°—‡W75·:Ñ ü7îÖ5ÆûQã¬ÐlÝÙÄrw €ÛŸŒÈ"ñL·Q>mcooÞö® _Jý #Væè3g !1UcuzÐ;Fì‰Q¢L»TdYEA6òRúrp|6¹íÛ娶£;\iyp3úÓ9bŠ@kÇd”Äÿ¼ÿ“ßiœ}anPº`%*] ãr×+ÎT÷ÃÕÇígŸ³ «uÜã‹›ZWŸ4ïî‚ñÀÄO¯òº.!­eÒC»[à¤|ÒU¨ÉÞì*þñþ–¨”J!µ@HXI"‹Ñ•晉’2>È4Hb[¡ìfhÛeÖóúÕM©ø,ïe§è+Å$†:ˆfÛÌ%¸-ðXDB5L·ÊÊv+‹i?(í ‹Ìõ2’™ÔjêêÇB}ô¼ˆ.aK(.S<×~C%nbT,jÅ)‘Äf¶á¬nüájÓ7S©qoe^óýIòÞÕ’´Yª^týrð¿ ›žƒÙ?}3~­+/Ìò9',ÍDùÓåît²ØeQ@FŒ\µ4ù¼ðÁùSµ¿–ççüDß@¼ï&D… vÌ~ó+–ÕW_â°[ ÍçE‹ëéñgþÓÈF^â—Ì€¬‰¡“ªûŽì'¶ °Ú¯kë~ÏÌd÷ï^Ýe3º—&yÜ›ƒ6u•†À8$ŽKX\ëHŽïEµéÈáHjM´çv~ ÑL 8-+Ÿ 5v‘¥(°ì”7ŽÞZ¸Tþ/´_¶ƒ#uÇL4®î‚.Ëv·.E1´Œ˜nâ ”†”Æá ãðú„‰ÐIB9•jÆvïìÔCáúÀ=ÖÍaU¥œðÂhu|¥–6›‰ÅÙ/~ñ+O~Ù[ú¯¼ÞF(ˆóaÐ𺬬ÈG¤W¹d*t)>˘çÑb°Ö‘bdD®Ýt¯ÎÏEVe¥ãm•bÁç cOfX2«Ÿ&TE–V]*ˆInDv.X_«ùYâ–f¤`Ê‚+©Š#!VRµÖ­ì`¡©4¯õù±õzþIèû¯õˆ¦ pT†,R2 qÅ *„¬€ÌR¹Q®O÷ó\÷†i` —r»î eîGªÞÖ”öҘµ1Ú ñ˜Êˆ3Ñù@Ï÷æ÷84RXªé<åO{‡vþúP·¿ëØlʧz!…u¿º4g1‰Í@)è¤÷^~ëá‚åå-ÈAш— ÞÄ3Æ"—Ö­Ã@½¾8^#/Ý¢¶ÔæX°ms DTx¢%Wluµ´É²Ö/ί·HÕ”1 9€˜Ëz¼éßOþìñßg ާÄÒäj¶Õa:JW ßLoEcpâ•zŽC±Û=;È{ëZÞ¼Ê;“s³ëÍJe é× xc‹0iˆBv"Rs7uÞ Þ§fö¸òO•þÆKsÿùÿTýö'ö3YŒ21ƒ ²€ä˜¡!@S@¢1Π: ÀD°©…«WÉ3Ͱ¬ƒ+‰0^nòª5S¨´ÙÈrµñ2°¤¦© 2‘QBa´mL²vP³Í»øŒ€4Uëå3Ak*SJPC´ ¤*Xá#æ„G×F1Éu'] +í j›Bjr…F   P€¬"tÑ®D å²3˜RãJ L*å‰ ¨"@õ9Jr( uúñî³}¶þo1·÷aç„5OÍÜtêöÑÑv«AdMoñH¶XÀ!ÏþþB—Œy¾+R– ›ÁpW¥ÃLI Izmõ¢AÃ(ÏjÆÄrA*ª@Е Ã4ÝÚ-•ô¹ôuç§“á©XµHûÁPõu°¹PÿÛy;,^jßó ʤL1ŠSaH¤$AVª²VA¤;®Lp³C 2T³)š4¥—b;OM*Ô‚Ø^[F2¦$ß"/„°5­µÎ rŒËqÚG'(_ï:nòLº´ÚB“-K_šæC¸“I@xLRHÁè5,RÉFD‰êˆÊ2Os­OH¾dIM†ÏbÅ™%Ñæi]„—œ°ƒO4ÏÅ×Éù¢Æ\À©æsgšM0®³»ÃΨё4ÑRq$Ô$I‹h–r Ô (È1LÁÀlÉÞÕ° ônÀ0–©ëkòþ{¡­Ì¢nÅ-(Š„ì, Êd-ŒO¶¦óþOúXÜ{÷˜Õú‹V8M«~Ù.XÅ9SMšˆZI‚ ÈBŒz¤Ÿõi™QåÃRY¹èt¸mÅFJbdàÄe… X£‰VAY»GÝô¼H]¡DÙtˆ’/¥‹¥9òÄkì=g"Ö(%NÇ;Ò• K{¾ïòóx‚4+™v¦ˆˆ4x~ÌkÝoׂO7{挮¤÷†B!¢¸¹:ùg›\ÈÑ'mŽ5뱕tˆ±£dW\píV\ƒŠŒ@B„—5öÛ‚ Ô0Ò!¬½Å¸õ@¢ÔÿV¤=pŒR…*ÃPIêƒÒÖ®µ¯Iåxª ÅÙ&7ÏèÞ¼9ÑòÂ-Ér†qÏqøÜî[çlà ǢJÙ1#ÃXçˆ/ÓŽ”ó¸3ÜÙ©nyYùZ?6×7ð‹Î½Ódj“0I•ì÷Îç÷IÕªÃlÍý§–¿ß·} ¥ªc·Ÿû1§ŸÞ_ct¶ûÑg€‘ÊB‹ï_1—Õóž»ÉÆ0ˉÊU]€­éñ]pZR¶ˆó׺Oìõªºò¦˜&•y5·+íêxò˜Ï©’·3ßëIºìsÈEBÆà°íEmdâÚ¢ÏnÕÉÒ/¼þ°~õ7zoóí¿êøw\Ï™ŸÙ›Ì…„3ºx¹Wß*Lö?ä|Ý@13Ä«%§‚[dœY-@R<¨.‚€íØó)ŨNm'Y|ȳ,^.³ÏBšã§A°o_åzCÕÓþ—wÁ'èOí—$…Š`»Qϼ¨þmg€1:ԯ׷Û7hY$/Û D·†ŸôÔê0êðòw9ãɉVsJ|ÏÙ|?õöXµ÷D KÄBg¸Ê3ÚB쩽̃~~œ.¤r¾£w³?±³<¦z`D¸è|ë®G“_ÿ]uwAR¸ìTGÒX êek›IÔUÉ4Tžk“-¬¬“|ýý7ôéú'Ó—ÞÑÖ56 \`‚ÏÒ(®úúŒïÛë |egƒómæ8LoS+žol”žZÊ[0ãà¡p:ÈP…`ÐUä”ïâÜÐ[bľRN(ÏSñüøkÉ}2ñ“|Kü9*ÿÝëÁ/(üÙù¨Ï´¦×ÇKÃ5_J¥UBÉ µâ­¼=Ò ê¾]®JZš¾äógl~<sþþü'²¿ßš¿I›×-ø.¿˜§²S›»“+{lÞsñî§wÐ ×ÉPàYê[k Xç¸Ñº“+î–§?‘´ú2iØ.¤øŽîb>Ÿò꽯à?6^1óâSCYQŸNq:ÑÞ¦€LE¢¡’²8ɤË4Wcêxé0b~„ßOäÔøÇËç?n;Ph¥Þ N0nw­R-óOÚëRšêo¸³­o¤7w*–ÉIÌó#´m ,Ã&­Ûþªk£jÍÏŸÒ÷ RàMJ{ô¥é!€eÉÑ\Ã9wsãè€M,*´õT•²•Uú$õ{âà§XÓÁ7£ÛÅë¨Wô}WN¯+¢ÎG°<ÕìRš#dAÕ»ãÜým»üC|Ÿš]´à¬`g^ÄãÑvúÊ@ÍxÉÖ9Ž~çKoÂàÙÝ¥©O=RÇ30ûæÜù}ŽE¾À&¯ì>àË™³róT HNÀFËßV¡Öù¤ðsãóãØØ³>èd‹£>XÇT+uNãù7ÿÆo7Ør®¼äëbô¿«¿ßßξhÒéÈ>ön¡¿ò•àÁ޽<ðƒŸäë\y‡l¶‡Ã1ºÐ’/–7š8” ÛA¥ào™ nÃ1XgÆátÌâÀ;oéÖê‘\]A]F)}ËOo½Þi0BÚÆOæ#Sqöœ©hÓé4=Ð<éû>4Ð~55KÆ.öh@aZõDרEä͵I±¢Ö¦6âj›AD´¥Íšî^~Ù۽䪖‰â‚-ú{Þâì¨Ed[ë^#ˆã)ÕOío§ß~õ^£œ9@3tr+º7¢=ÌkY?ŸÅòQ¶„ûǶå–wÚã·—Æhë KZÐ @ÂêðŠö\Þ¦8í‹®}] ¦,"Áª<4Ð Òs‡Œ¶iI²6”uX ØÆ/»?µ}¤2‹Ã4r½YšH…ôÓhP§ŠŠbP§ÊQÅcçk9ÿãŽɵ¯xÿL¼‹KÙŽŠã|”e&£­{ªIú#ñ0(d–œ”;Ô%S+&c"P(µʼn´”ÝÉkÿÞõ ­Dí¸Q 0´ D»ð2…X¼žûêÞT?¯-Ü]uÎ…;’¾i| ÛÇ€}7²ÆÜ‘µEέNõC§Gøltž2úâ1úç0|+(G~©{ž£3¹Bõ#+?VTǧŠsã[¬:ˆ£¶ê샲[«§ÓcSÜ•UÕòù[z£< ¹•‘Ö7Þ?¿XWé†õÞôñUöÖ¯ZøvŸs&f0Á[)hfóꯟÉô[ÕôøìÂoó<÷ïøÑ#¯ïêbœ.OSãü·×™—ïk$ROuì9ûëÆG $Ò @)uc—’ÄBT±?|L~\.ed°5à C÷9Ò{Á÷û§¶ìÞ<$9 ­%Õg§aÈ~rý?ŒÛ?>+Fwõ㫸U«™óÁðÝA78N< l¸ ‡n4ç*8J5H´øË¹ v«ª5fïLÇ‘êke:Ù扇ºf¼J’úÅ,³×ï-¥ QÚMC×{\v7^ªmº¡hö$øv/(Ž®>&:{Æ]é뺮ž›=ÔíHG.ñâi¬ o )8{éš«®}K]±¼"žJÞòùÑÔzFÏFªoå¬TŸ>¦B¿6Eë® ‚ò©ë‹ƒ«×YƒsT˜E»%›ö!«,ЍØrÌy)¹K©ŒôÌØÝ_„Dû+ël“ë¨Ø0¤ñW>ãzÿþh…1íÊÃ…TU‘@ÛÝ^êì6JÀ#q•jR™%ØÁÈf—ßÖ<#b"F–Y¾xšñÈkò:kšR]ÒÒòoÃÖ8W&/J\útë¿?zçQ†Œ„¯)®Ôæb>Ê®±=OŸÇà>ÞÑ’Ú¹‡¨á´²¶ Ãʲ°Ÿv­æQ» Ìû?Ÿµ§/¸wŸÌQÍÀ-@䇆Ïe*sQÚàúG÷G#ÔÓc”‰b+Ü%ŒÒH‡1 3I‹»ÎzèŽoòqßo—ûÉÞ³Ž¬ž[ Ö²“4ÄJ"È ½Ëx €27jž×ûÏÜУÞè윻Ì.e¸Ñº¯)!}á’ð˜8¹2•9h1ÈSIüXo¿Wú«ì ®¾$IΚ¹†z÷àg÷ÿŒÍßÝx‰ÛL÷wúŸöùù~ÿ×Ôîæueí5œŽ8¨@‚‘l.¢í^$~F‚–Š¢ Aw@}…~$öv¾f\,ç·ƒ‘íǪ^ܳ€X „ÙÈG—¦æ2ÏcrÃ%97¾¹”rä~K\ÝC®B {Ô©Yû<›O7ÔÇ<„³ÅÜÜoŒÑ´Y’u Šw¸i2mOžœáÍ­·´gQ1lž‚:ÚCΕ®`GbjÊ'ÙÏ 3šDÕø†'gl»JsŸ7©Þzž22À¥©˜n' ‰ÍÊ dÅ„Q4€¨ÔS´E²$‚Š!5…sˆ[²x°º9jžêO-B²q” % ÀK IZ€²ÀNJÎ:¿ñahÚ5Tгph«#@±PÚ#G‹å•%y óÂs’¬÷‘/µÃïÆ€CF qã-1Ã6´"ã Þ%Ö”)LíIùhìxlÇ–Öi0ÌÔ2ÒŒ  !ÙŠªˆ'Kƒˆ! ôÙ@2¿zyµ¯SBwtžªu xOw yjí!ÜXÄea[Üñ·—h!Í ~Ï~–¹©wºÛ~FÔwezƒÏŸxßùJ­³²ÐÁˆR+·§ŽF“×sÏ(®Œ Ñ:˜õà’Ïjïšâ4„Z쨎`¬¦i<"6aUJß™¤ç);:É8ñ}'SäÆûÜX¨?vD!‚!CÑÈ›@\©*ðÉ„¥¸ëEšVÙ _P·R„Å Yˆ£'êõAÿ³È|¯_EFÄqß%Ì’l7Š'Õ1N–Ú¬¢k‚@¼ª"&ì åÕߨ©+”¾C›‘ò[s£ï¼ï]\±Û‹Àʰ„Å’mh¢¥JŠf5tÎL€™I™<â“ʵ·ô²n8ø;õø¿ëÏâ ©’Í9âN!ȬÍz *€5•×çr é´ †Z‡2 § ‡!B*YU¶ÀR\¯bú³|¾d €H62± Éb±Õ,4²i uY‰í‡Æ) ò¼],')Í=“$ ¨@<Ñ=uöB®!=°ózÅ,¼ûL)}6}kQÎ'[\½Õ}Òϯš[>T$¯þt̼hnuþÝöà‚Ñ¡Š¯bÅ…LT¡!¬¨Ý÷À*ˆèÈN\ù¯°b­Ÿuâ1´¸‹•%~ÀXƦ áÚ+Dò\Ø’) ü RǶ¬ÜKP?35›^MJ-\¹Â;êWø|;ñh‡ˆØªÓÞÓBê1Ï¿ý¼v½‚|Y»?Õ]«Éãðß«è½ä|¨Þàº;בIÅ´Û^ÅéaÔœˆYÙN£ŒHY½Žˆp©¡ÉÒôÀ}ç/p}oáBóòüÅîëðo<[ÏèW­_Õ¾BÏW÷mçˆÜG‡×Ý;ŠUhèÚ‡ƒO?~õ<¦FX_{ÞóíRêËpÝÞG7ÔÁÖ»^G#¹Æh€E³ ¡P»ÓšãøD1"#î%‹Þmþ*¢´µb Z¨i…ÅÔ„`ê¬wy;õFLjI¬‡/†IßýÑ}­ðmý§¼þF´¼€Î` ôæŽEºò®æ èuÖŽø1¸Ð/¾*®p]ï—„÷n®RUøŠ¦dŒ©µ·F…j—WꜯúÛó|k®:~Y€×F‘Nt\$âƒ`¨Ù•²c&Ê”×àÏ @Yh@‘Sz‡ò¤÷¶‚$/Š“ƒøÀÞkˆÓ3Và Ö;³¿ÔÁ5Ý„Ç[ Ràl]«?‹Üé° ! 9€FP=zÄÆÇ_”²sï tmzKèFа¶Åi׃ý‘*?>Õ|Ÿ'ódX•òÊÏEnÌvunˆ#öˆ!ÑT Ü›¸n|•›Êû`âljëiTMméñn¿:øfI˜%3ÞÿË+ª½»Ói•þ_Çäód[îÒÚ„ê†ç_…õû‚þw(Zè½>ùp3É«ÞSKX¼=žŸ- E²-4á‚Ø0Háªkî _küÛb~\ùzéáçÞ”*#h‡Q-c¨PØ01G’Û|dÉ]­1 Ñ…ì šÔôÚl”’š,¡¤á6EPêÇqdÃÀ"Ö˜önkŽo<ÞõëÇõùw mÓùŽkQ[¨ÑK°Lt|è¶æõw ÿN>ÙKü¡Þå”0‚¬¿‰¨€—2I‚a Ï¥/ylCÇ›8ÃñŒA0B¸`xjÀ ¸“°QºÕµ­"!zh¯+¥Ç³ýuµ½°-CîÉ ác‚"Cß§mHTµe š9<ìèõ¸Ø­®À«ºbµ9Û‰÷©QKâ—Õ?¡Íx"ñXwö=Md[®TÐÈìÉBSÍ¡Én6Ê"#eb% Eã¿ù)½ñös(ÔŠ>ñ‹écdñéá¿úž¯ÿ“{ÏòxþwK™to£³Æµº‡Çz•xö'£Ÿ·æ¿w;Wøe&wP?ôêŠ{Ÿø£ô1^S󑯲g`1›B¶åEO×›KÄÏ äÇ[Ç/<éÂnJf@lû,MŒ#ωàQx¿2¬ãhhWø®8Õ6oÍÒWž½Þ?ׯ~ÄÌ;ÿàlx|Zÿ#ðS®>¿Ú?ô¥+~®Òûã ‚5N,jÁ^xéQbwãùõN¼tÆGŽHàå2REÏà-CäÅ‘Aì‚ɩɣNzG°—êFך»hºWÇÐMÞ#M„“ýb²¸øB@áòF¾p2ÙÛ5¼Ç¢xSXåë9­™±ÎÏç縉λ7§” •ë¯Õ0ÎsŽ›;Z‘ôXDEÜ…–.L:þÃß1¢9j J1ò9ó3Y'¬Eãüð¢'Š.Á5ŽÍ¸€‘Vå‡-j™OšY#å=¯ïTúI»ÏžÂéq£òšˆXÌBÐ$¼ ƒ®•éÆðÞ5l¦®ˆa Ó‘¦+•±~12hz³_ï1ãô7¬Ê:.`“ÆA ¯·Á`6?ÞÚ0 Òˆ±¦•:É…mQ+g{ó­©¿ÔüV^]2RÒ%°6žÎ¬È²4-: kíÔieüë‡÷-Óå7õšÅÍ[œLECqì-2÷»k3<¥ð}H¶)P7®^Ü4²µV~û¦NGrÕóò±w“â%Gçæ­9½Üc&õ‡¯¨þÎÓ3|…4áòøµA1 À}ìei.ì™qÓÓ.–ª © IÀ C£9Ã7P}­ÁYŸç;J¦nuAâŠýƒº}Ùà ZV×EU0É™_ãÀ@5<•æF­Â+Îä\H—dÀ±¬ñ’äLªPçÓU¤£È˜×{®¶ïmkȱ9©y8’¹(’&¿å-m,×É+0’Z€t„cKjàKR,"4Ä|PHÀl¦Ö <žy7ôX~Ñ/Û¼€K‹»sÏܱ,ÊÇý¿à¯ž$é*!ÙRý4Yól/_Q¿˜?]LɵÉÄg]ŒRHKÚýQÎõ^î¡+XâãäjÙÊ<ÔãÓú~'_(˜ø˜H׸ÆçÊ™Û|I­L*LW¦A"¿„µÆG3ªLi Egx¦eÊH¤ÏÐ.÷çÚ Êà×øQÝý½ésf±Øh[¸™t‰’” iá½p×µ®?ò,‡Ì’žñ¬J’”F ®¢P1¬3•¯ñVJ©ÑÂŽñ«óOCÖ =sP§1Ä@éóœÑûßõÿäú‹»µy˜i6á—ïï­ýƒ•œšÔÍ M,ÂØÐâÔ$8¥óœrlÅzbJ’ç:=¯¦nÂV:¢ó‹óï³½®ëÇ6 ”† †a1¶T1X  Î+›]èœþün†ý_vY³Û}º¶žÔA®¸š¾ëX{4'Ãwf2ÌêmÊ*møX­°$kBÌVº·‘õÁŒmfƼ)åK Ø ö•XuyŒ¬ÆØŠ™$–gaYÓó‘űvÍV­y aÒªEÁ±5H5#ª9lˆ%T±(æØù©%£¹;È‹ÌÄnŸª@±£QGnhT¯`â‚0ÀÕR.Œ«žKγÍÓh©E™b”Œ2e`pÒ ¨Á¬N„´2Ò=2Á[íu} -?Wh6ÛÁ™¤Á÷™J)í=%³µC¼!¿Æ§r†uÇSƒÙÁ;qñÖi8n̳ç¹KïKÏ…‚Ò¶†fzNñZ©þ$)æ¡Cµ(¥:’´÷U=Ë%G=‰žÁPiËûPñ{¯ê…]ø°Ñ9ýøL;3g«¢aªbÿ~p¸¦Ô÷¢o/5õ¤£OŽ’ÔÖ©rõhq‘…”rIÊp €±ëí,vŒ_ÊWy",Ó­R[ ßXk{hfäÑ1úà¨ëÈÒåÚ.J%ÊUqÜuµ¨º!-5!kìµ%€)¯'{j£^â1…ÊJq*é:^•HRÂÊ6,u£ÕÁÜr4°Ž¥ÀȼDO€¹ú³øâ Ó€˜ Á œ’Wñ>3—ÿ>þ¿7áÊóñ?©å>3GŠ)F"„ºCs0Ív@NF(È'¹;’‘ƒ8bâ[À]‡Åî"j C†#÷íû!t„'¯Ð®(-¤š™ÊÞ8S¼¾N7ž@ØŠ¹_ôÚŸe×”¹ù O{•Œ2šL¼Ud ¤3À®PHj"—F”òak[¼„]Hb ÇÌ ¨™ä*M "Û0ث‰ÝíòÍÔ„TC¸^YL”'Z˜¨PЬ’YD’"›3™)“Sëñw~¿ÒÍ—Z±2-H´œÚ´Y²™ýÞ3¶5¨8.54Lw]Ú ªY7)ý•’L<÷MpE¤OÆZŽyç®ÎþìøS ‚#TtÉŒxìÅUøBQâˆc‹Häm©ìÊ Œü1^Ië+_|Vž€Â•Q°òÅ5 £n ƒ%»T,,úZ|íÆp_²t#Ñ­ –›ÊãOyûaöÔ~ª›ãœJ߇·ÓÿzC-¡¯)ƪjð¿?Çs‘îåŸÛ÷ßXÿI5eÿå4÷ùÜWÿûSß_µû³½°Ë²OÁÝçÞ”µ>‡ 'ñi±Màºb¨´=¶Õ;êfw|Kÿ‰~RÏ-yB sœ_N&zÁüÓ’"7Ð5ÚǬ8}9!P>§ˆÔŒkŠ÷®=íÒU¦ºhÉÅ3í[ÞÜÎô^Ù%ò(¢í$¤­KY±º;íõŒœîçcÒ¹nZÊÅjóï>ΓGòz50–jóœâ:êÝJæ¬ÀÑC‚›U)JGÜ ‚ ­p¢…ÂÄ@bU«ò>lo肋Så$ŸC'NÚ{e$;¸3u –)fœÏÑ~Tp­«.¬øýžïÝ×çõçÏϡ٬͑¹ÊWÉI©¶®œ=„Zun”óN{‰ Ãz&-;üvì ‡ˆäϱhø¥âHˆâöäÏÓ·ú¯²Æ-iàA`©N×éÚb‰\·cz*xÓmUäU_Ι\¹Ô׋:Ñ+~Ü]¥žUÚ}Õ&\NÝ|—ÉÂmѳڅÀ/º·czk©`¿ëýñ·Éôí÷~F¯–ö<5éYDÃ>—žÌ²¨‰Þ9¦Rí_è±gØ}Ï´ßOêu†Þ@↺©)ÜÓ£;•é ˜@¸ázwåÇúŽ{ˆ§„62¾= t9”O„UÏ_77Fê,Hˆ¥Ù]é·ö¿ Ûë⻋>g6A`>é? :¾Ê.?Oá%½âY!–¯k °,d«ø¸÷?týóOsUZ_{#‰Â\éí Â*J¾dØþB;Í…;ðE•ùƒ>Õ#ãk¦¦Í¥Y,ì|qK)ÁSñ5p»Áëν£Âmf–XÀ–5‘Ã#°éœõã¢WéÃúÚÔÔ±çó¹~uP¤óÇMï<ãS&~vªÛâë${A0Ôr›ã¹Ôos>ŸØïŽØyí\7Ã!b¯mÆæ@pºº¡Üc`ÿÎfÖÐË ñ×´pZá™ðT|YÇ–;–ÙÄ)Í›67÷—€âZ¿µÝÏy¸ãøiCÎVôxšoâ|{€4òPxþÍ;k-Ë¡„òÙôdhbq½î ³‰ºIÉiÿ°â߇?"fpëºäÉÔ0 0» –=`©Âp‘òÝ›Ÿ[/m1Ÿ×áÎJwÊJ@,ÑsÛa<#Û„A‡y<­éõùXñ­îœùëö¹žÑžÝ#¤aÚÀæ|A¿î~ßo‡˜!Ãê=\½˜ôíÞ¤3£Ì¬FíÒHî Ó&ÝvE 4c*mdš\Á5¤w (u?ãzñv#çPÞ‡Ë8E¯ÔÌPËùr¥¶ÆøFضZ»;£Æ†KÔ)…‘×å_b~øÝ¿XŸû˜sì@p<ÿ—þݳ³5²À[¼ý¦¾–žóûè‰ë7gN_|úËuG7ófÇU}æUÎôó¡’ÝPFë׉ó W>~[O²gž-c-€=÷£l_JÈn·6yá·’Eœ6| V´eVÈ]sô5s¾LœªP­m§0š¸0êäªrPëe!ÙÑZîpý4jH¢¡mí‰äÑäîªCb#ÑÇ"IÇÖ**ý¹ýÜ·‘†[’aS—=Y!Ë c÷À.åÖ‚¶ -ö¼nÁp.kLWV+Çô¹\Á!/àe&’kYÀÈYòƒ Û«0½l³1®ˆûR9ßE€#´g{[˜†ïJ¦i×@˜£L&Ûh¶Q´DÐtÛ‡6Ž›ëÍ’fHjå†C~<þV“?¹ºTµC®°»Ò—¿%³ ü]ÿ±þ(tüG´~ßé߃Aòüýê•>l= ”€ ‚ÑÔ.÷¤û, í¬x10šR €–h÷†ºí"Ûf T/z·iwã(Ò¨¸.œsoĬJXâKDŸF%WE;.8TÒqÁ‘ÄnæÔp‚m·•xž-ÅÛÞ† W8b1.m±vêÍoýÅïzlZÝþ8‚Œ°Œ,÷æÒûÏŽÏÍÑñZ¬ÇÕÿ¤ ™üçséO÷ÏW½eãYà Wvó!uÄ™”õ˜Nû^}ŸÉ©[ûü³çóRñßrë§?ÁF-.j>­¤8Ü…Úoqïå¿ÑeLU´z¯ô`‡E¡P"9€kA4`íhÌÎá¨^ùŒFYŽ&÷Pœ›ÑK¹'£rFû¾›áìã/½"—rëGÁUƒç¢§wï®ÇÁýìà¯/Ä«ýÐêxô|ã®\¨#æUÏÍ ädWd Z‚bbeÈÇ™S±—°™vçlCÔ Ôɹ”ëøpõJKeÉ™Éî;‹0Ï{ATÐ&‚M²ñ¡xž™›]XªÕCçe .íÕ0fõ¼Ó×­Ïþ¾Õ½„åÜ>ÊþÑÓ_& et§xk[y¼…t‘ÝH¨ÒXÛ–f9]§¹f—6À‘–*Vºä˜’qMÏki>q‡Ú¥¢ÆÒZ •zªÈ:ý‘Áo=:Ý767Îæ‡° W^'Mæ0S¯Æw\ßL ívaëKOY‹´ìW·ËpŸÕÐ*(¥úŒðEF_èÓÊ`7w7¬ù(UyÝŒ:3¹³«²ëÇ8zÅ ÌT¸ÏÌœaÎ ×M%£W6V¦]8O¨ +õ?y:s35’* H,ãC²‹›¼N—eÃ1ÉBÂŽ†à‘6BŽ‚! smˆo¾¯šî~˜Yñ)é·Ú|KyûûñT¶¬‹Ê‘`ˆH%W¯¼J°ô ß!Á$ÊMQÒ¯‹KÂVY­ºz¿2^÷ k¾ûî-0˜ÏøâãЫ| çŽë|ù¿™PÒÒÉÑe4£Ãß’£Ð(ΧâË«gT N‡¬cnä•ÈD‰iÄIGTÙ1(Æ7á‚ÈÄn5'`D*FR$5å9r‰“¯V ¨fœµ;WSç“u„gèµt`Q+&(˜Â«H¥¢R'ÜʧÉÂS³[  “@ƒcRdZ5ªÃ}Ýr}%2 LK¬K ¨6{¬:.­;ÖÊÅŵ0€tBº.mŒøQýæü>Ǯ慄«ö©ŠmG,‹dé‘— »’á,¼ÿJî±çóÞS›ù¸ò·mÏãÏüØÎMk ÙBåC¯öܸú–U¹iˆ,aL‹T²î)BÓKË ßÊHg¹™®³âïðºîŸåh´ê3žj’¨ÝVլЕwI¯PŠé¶•¼ÒEq´¡×ã“v•qhÐŒ¦‰P^WÊdqL”×7^Dº• C»Ü êÿUö·ûËC_fcñL¶„fë0O‘¿®_×Þú'·æó•”Õæg™—_Ê[³îJ ¬ +v¤Xl•oôôfeyŠÀÌ€b¬ó«õd®>¯Wò£÷7~D†è5'¥Þ|_<Û2%… (Øb!bSËÑàÇó[×N÷«g_ׯ‚Ýb65ëº ©¸ùxÀõtH¿1¾Ldj½ºØ³î‘ƒ®º.2 A2PzÙ°Ú\$&!£f0Áˆ²±2–@Y6K{„ÔÝ¿js£ó¯ÎúZŽùhQ$})ŸRce²FÈÑ¢Ã@b‚€lL`!E}¨RÌF8b‹X0ð*š).DÒI¥wFšÄfb5Ð0—, )JŽh•qˆñºViåÖÛa”X5ˆ&è*áFTD¸²Jbæ™E’, ,ð0!æ2ßÝ/k?Ÿ€„3Ä÷I4SùÁà7‚ŽSÝ`cª(>Ö‰²(AJLÕ „úU4ÕUg½óÒ݆uj¢¤ô#ªU£ £á"ê0ÊÞõÖÌ©·ãe²ٗâãÚû7 ï3[l`”ÜÐ)‹œCjØ€@AbaF4[*&ïZZKWÑ1*‰‰D EI²Ä g sÖT¤pÆ„—¯O_ñt½¥µÛÜ+·<¼Ñ^>^cÇ4²G‚¯èÑŠ|›±Ø¡'UÅ^=›xÈŠ)[3€‘c=df+ªu¾‘ ÛÉÛéýã#ÃÑFL‰N>zaXjE%°Cë¥fQEæhÂË ñHÀ £mÕ˜/G@H¦™Gƒú˜3WÎy^Š^oçµKëäwçÒ¹‘]©{ºù•S~  <œ1:¸Ër½çuø½S°“·ñ}ö9—á„Ò%%)³,€f:³«àèôʱýfÓä"Ýò'+ \’0\¸¹*Yþ~ØÕm·ksB” Q)!ùÜ5Aíó˜cÚætöºWtUl=Ì+ô(Ž €pSh7VÐ*¾k|äI[ñv[ÐÞ¨[±›¥/c¤mã1éÝ‡Ž Á‚-*¡»Ñ–ÓF>“_Ý»í®ÏGïß½h\N„ÜÕ9› Siâ'«MhƒÛr;â'ÔÏÎ,‹ÆjKG”ÆDþ ó—j‰ᇠ6w5ô¡Óao–¾6Á¸-§Uÿt€XUóf‚‡/ìÄøbõð1ïž•ÝÁý£O/|ò—x<”6læ¾ùC ‘ÆæžYgi_/^æ ó«ÿÊÏÖ©±€\ï©ñên-ï?ºs\ýOã^Nþâ×1÷lWê ú®-Þ×~xöS}vÕßû;/¼÷ªû‘WW]”D«œÈib¾|ãwÌèÎóoÕL–_2žK«ƒ¼0›sµðZ¾šk~Ì’ÁÁV–2‚m_…Zrg¥€ö_4 ‰vºÙÜûyþÝÖ¾´{` zøHÀ9\åÝÍZòÄ=&ÌàSUkýFDÓ·ñ–ì…ýzm3­` ]oÌLöÛžðsð\Ó\Ùz|ý©D‡qŒ;¬,·ìbËRÈ4îaû ”¡m[ÈÙY4ÛÀtӜؖŸE¸çݯ3ŸÝͺCsçMe|-ž;uýÆ9žÌ—“•9ÒØ¸Á’Onß=z+°çÙØ×‚NÏ„–ɲº#ÅS¹'¶x2 Žér…¥§]:É$ÐÀ‘VœÎp¿§þòÛ֢ܜ'J«GôbðRìg1V ˆß?üµË¡Ì¯¥Î ó>qþiËÑ%áÜ䊂¥Œø‰õåZ¢6põŠõþç«ØoNõ6v^õc›xiêF:°Vj¼ÿ«çÂ(ŸÉG7»¯_ŽûùųF!1â! IllY޾UÓ×%~^“ÙÆdyÌáÉÈ®ÃNøÆ·¨^}iGx•YÏ]ûq¼ÞÞE¯K~ºi…t’•ܹÙçáÜBVß‹ó«E¢ª¨-p.TBhƒðÕ O‘ƒmç°†LsB1¼#§ìЀ[ kTÊÖZmÖP†›.!Mm—êZ§ï¢ˆFs– ¦]É$²îmÌŽÆ©P@µ©ÄYØwµüÁñÚ­v|Ò8¢ù1z_vµ…n~2B¡àz(èçl×n¯~z^Øg3úÖ|ù“ë{d?cx›C€ÏÏïãœk;ÝJ‰‹Íb ±L­”“عžéÛ2ùLË­äËÀÏ 5ÿðÉ¥ŒÂÀyÉGÀN]5¥nuV=–¶ñ ع‹÷$ûj¶¦Ã–·ãY7r\O·=ƒqxP¤§vS~·½Ÿž li}ßäÛïǯrßu“•÷ØÁf¾#´Çbýò—ýáuâA²ˆI³™);ÀЮ«Å  ñ†¹‰ª¾¶ÉÞáð$ºÏ½Av¾[K:±w²Æ~Êïíñ( †p»;¼¦i«B,ÅPJÄŒT%5(M±6AþfbÖBkeæ\âÕši’}à &&”˜sñ´ ¼¤bš%n[A7I©H" Ä´k˜Çq`wD‰‚]*ý°üŠÃjŠ1lÀޤŠí4|–—”¯MŽàëü`Y—é ~ܺÊYìžF.Ÿ¦R'íö%H%hüžVZ½|Ïæ|{õgqÕX|]ÐûL·ðãdR³#z¡j˜ŠL>ñÖ5®*í€Ç0‡”)ª‘òd2œ‡_81w~‹Á»×÷Ê–ër¬H†y~èÕŽ+¼U= uöVUÖ.`b‘jª‹1uÌ®ÊuS›…Ù;×~™ì[ʼY¹‘#„Åaõ(:¸ù9NmÍä3ðXþmwmê^W¦?@«€‡“Ié·•¯Ò³à†*‘ìÒîÂFMêyÕœãÌ]ª?èlÌ®¾ç¡îدYõˇ__ÈÙâ/®ê¯0Ä«øhJSZÎݨ¯Ê§Ä,2¼ÿ"£=÷€¿Ð u©…«:æU]ÆÔ,¡†Ê$KZ€*XB[tËÈ*ª§êš$d!Yf!q]\-©”×ê>í˜zR0!¶´gÎäøÆó¶+9Ãe©òö4®…`^þqÑqÐ%ÑB†ôúÂÖ «XÅA‘ÿ\÷mM?·—§‹OTÛÐB4²gê ð†`&]}úÙ¯ú«o_î÷\¬¤*¿çî‰èŠ‘ãú±^÷ùØ šqÕ¢`ƒ‰˜FâPÕÄ5œÝý-Ùçò÷<À™´ »šež9Oe|ÿë__ØÈ%pX GžW°Õv)Š޽a‚P³éÒH{eÅ€«‚µ‘ÇòÆoeJË5•gâ[ÒŒ®UeºM+C1:ɸJ‚Ô1é¬e*·03±ËTƒ1œV C†Hy2×Ý[ÊŠ92ä+F./`Z)ªOÁYŸŠ›Cm¶ÖÔ Lóxñüù—ÿÚ÷ß{Þçµ¹3ûó]+Zs ë çò¡Ëø‰Ã°‰'-Hh6[=a¡ï?©7I¬éj’I¯Kžøà{ièVëimŠÂòâŠGZÆ@"ZjͤH>Ô^^F`'¢Ð:º.ð1-kRj)T¹j_Ûæ’¶Gãí«Ã:yNôEc0fÝŽ2Ö:W*µë9ºïÉ´P¡3*)dVj R#@¦‡àÜJ9]õ—q’ÔÃóU 5íö NjEV%Ï¿>sürõ.[÷ ÄT¸žú±šß³›³›žÝ!vJ…ìÄ$ŸMŸC×IÕ+3”U¹ - :«$™<² A `" ÁJ(#Pa ¹ ª`¡^cÄI¢èº†"p8Dð°QR¨îjÏF)ØÂ‹¤¤D¼ìû7üÝÚs>ƒ|ž»ð{Ø—:†¦Ñ3Õ)¥8Y ‰Fä¥Xq8¢ ÒS²©¾`¼ž<_6ÕjÙ®’“éˆãÄ©CØÄ$T©õ¬<<¬×™8`LbÔhTí®¯iÜ„·9p*mˆÔx7ãä—=Ñî0æ¤}\Ó(x¯¥FF;IÈ«}ÜðQ=†âˆèKmïzÏÉr—¯°O*ì~ \“øé½Áʬg¯{§oNÍÑrvwH‚?·Âé6¤€<€i’üªEíl<·û¯lã­Oê¶íT²{£¡Øô«XÏê#yŒÖŒ…l  åºÓG³L3 Ûe¢º§VdDZ Ũ¹jŒÒß ¢ oÚ.+íX‡¹LÊ€ÅølÝ`–ÜëÇaùdÿÑÇúëY¿wµÝŽùË ù²oÈe¾éI XÈô;»£f‘Á'nKòÏt6l“À7cKËÝVb"³S²[…"QVгËÌUy)Àš¨…Ù+éÔ}Y̰HŠÐÅP¼ûºç–Rss¹[(F6±7¹ H¤2Xz_tèdr¡ul¨®S€å@’0쳽ʼn´^d]µu׼׫]ïfMãäÚôŒ»U8š»¹ç_Ý?>\/߅Н”T.´HÙWœ̰á/÷ºE©,†² “Ã-QýV·Õ¡ôª¸t·@Ê‹ZNÏ¡£VÄØ›Ë£Ö³ÔøÖruÞ¹Íçi}9Í&ãJ‘6òµ*ÜîÎÏå¸Ðvxqåa\ÇÞqâ¸HÇĜѻÉR5S"RæD¬T=Ò/´?ÐZ™»ãÜ:=±—ú:ë!Áy³o»dÀ£ËcáêO€³ÈŃ¿‡S"âE`e‘^¨´¨k‘¸7oã‡ùi,€-j,2Z½¥X† ˆL@,V‹¿¯Ë¡$Œ¥ãiºÌÓ´§YaÙAW´$Hêí½æí·;¬MZâ šZTüÞæ» Ÿ¯Ì†œ¥ýr É=ØŽ©q÷¬TLÞŸ^º˜YìÁ·nàÙy»ØÏN/â'ù@”Ѐ‹“(U W—Û¯¥ ±Hƒ¬¹B…ˆHwµ:ø…ß kÐTqÕo«[Æ]·‚™{4“ŒŒRa`Ϙ™Åy.Þm<_¯©J[¾´¦%LÖ³ìIc©Ä8(‰I- GQ¤u£Ú·þ…Îç§±·CékÈÒóšÝÏQ'j&ÌyðëbøÌÀ¨ò¬Œ:5{09kL7r¿M¸‹tË #TQ2bl3b*`dØ:I¯ÃÜ¥Ô"hŒ±¥›C)Uf*MD J8̬]ûåÞ‰ŽÎJYȸÚÕWô£­›!Ÿ:ßu+¹È£½?ÈÉù™òŒÔÜ«Ù͘^š={eA¬N˜T‰Hù®¨÷0^OЩ0ÎWâY`/¤ÃI HŠ%§F;ð±K\p©‘.sÅl¡Ì „O©Ž™«©k÷cíðû×ÿ›Hþâ¯ÓŽþ¸Í=N«ÖÓ]Ë÷/oŽWæËËÚ‡9AiCm+…ÊÞyUûw[ût›èޙ˵Ã˱<£¯›Íxº¥²tH„Ÿ+Ö5=å’‰ÙÖ-äÊòççÑÎF¿¡Gä½qbýšOJ¬cÕ¦CGÖPƒÀ|¹\Ì&¼Ø.Ž/º¿mcwAÒä‰]ÎO-7l½cÞ!• Ö§"Gع&ýàïjãSÞ>¶ÈƒZÛ‰[6€‰ÏWí»¶Æÿd]p0©±{Ä´D$Ïy…'zÀ±Ûî£ûØO>ÛX½wϱ´~ÕñÕ„gˆ½ Zeóm>ªéÜ×€b<ûWþð UÃc¹1Õrò•:zR®Ð‡Ä÷ÖxV{ç—d¬‰¯«— سó|²SšýØÇ”|–‘*'ÎĪ1®q<¿O Æ·}„ê&êÌ£ZdÍëþfÿæïËþ/Çëó'åQG¹µróíW·gdÏ)ï›ÇÑB$ïò°»7š?Dp³!:[pÞ;6ìÎÏzðÏcœ|” %ä2ËÉ& }¯{)eNƒE„¥+y[Ϫ_›½ ¡7Üêc­"ð'2!].°Ñ©'YªÅd6å/5?_Oçãíýùÿx”¿L?¿"0üHTkjh÷Ã4‡º/ÑÝžöfÚX êÕL^}â'{Qæäd7(ûÀÈË_üÁV·Ëö;cgtÝ—‚£TÉÄÒñ0ºž>M {óº|-æ²…r5ã~ÁË xŒuØÓrGñöÚËO\ŒÐ»\㛺®H¯B†„¸Ñ(Òó)~¼iܹ};1P91ê}T³·¥®©(@ìHUõ8ñ‹ýß­·Ép´žÐÉà"3ø½ûø¼j¿Ú w~xö7sÝ“gÕ†R&m¤E†±„Œ pZ”K¦/+çí/Ç©§í]XhŒ_펵ñšÅã5{¼Î|Oï¿‚ëkÓG‹Áàë㆞W÷ÝMþj&¸Öäs'¼Ó‘ÿxç¾ùrbó¯VÐ=ß@–h9íq’ß8îða#ÙH´åÅæJ$°/ÇþšÜïÀþ¾o]É+åÅÍ€-Œ|[œ.wÑ­u;ÇpGf¸jÔA€Uäþ÷†ßÚž66^ü­h½ºd"få X™áÆd6§²âÇÏ^r,ÎâØi˜ã?;p_qê¾¶F“ŒÃöÁÌ—R‚¢CÛN9`r")NŽËWé\ø_ÑÞMŸr!HC‹kFlgØoûƒºß9â¤Wj+9A˜ ¢ºPÑA¢q ]fÓˆ Û¹ÆÝo¼ð‚CßFRŽ!ÉÄt:9aÐiGzy $h/A è8„FiÐFÔDÐ@È|r9Õ® Ò°èŠ0rõ¤ç€ÖM!ˆÊÎ7— w¦öÒ7¬ì»¥õB¨AÅ£F#‚˜ª·”~LÁD 8ÌÌ[ÒzÞÄæ¡R¶eØ!g„êÓyÃnË%ä|VÃP¬jWaºGÛïË&ØÖIØøˆzhP©TŠ~³.š}ª|y+ õ %Ñý"è>ååο¼KÈÅJv,{ŸÜþdÒ6Ù—8ðÄ’uÀ²™˜ü»]o­lÅ 6$à"›vGh›ï¶|ðqÛ¤l³=rƒ¶©€d£µl¤p`ô_”ÝߘZ ù|ð°­×wòÜ2œÍ¨{hóöŠ^k.‰L/ƒ\ãÀ‰¨(ò‚g^G‡‡í|ç:I¸°#VhT-ûSã‹ôm5Ãõ÷š;uʱÝÅÆ4×r̾®Ð0ÚÄ^F…FêýWú-Œ)3 U$ˆ EÛtFF«)»¥­B×Y~]îEHÜÈ}7ÍÏz²•³™™£T·.nÕŽXŒŸ–e×î8dLÖ„P¢ „ºŠQd”À\õH?i”M‚B´tS@nŸÂØmSÑfñ7Ö_WÌò:+Ê#U¾™fÀÂS’hÄK±QP‹ áÁØŠ‘'$r¨´lB)KØ£™aXµÖ¡w}»ùÄNXé/ fµ Ñåèxœt¯„ñ:a÷×Þ>´"í0P®×§Èiá‹uG`ÈH¢³e]7¤ÑåIJ Ç}HáUE­ –H{'ƒSPdeõç@î¾ÃÍ*» ò`Sð(É&ÕšYåXÏ »Ï½ ú\ì@ ¨*Ūa ÔÄ ­Ý‹a°ò }Ä®å}£6>›¿è—>Žßš}çG³Ó„gHpIÁâƒ!H§ÀÊ ”̓C2³5ït6 Xv?mó”lÚö~‘¶)PD]ĕ󡮫a8³KY«¯þຢ_E÷}>ûs^ Ÿ =XhŽ‹7œMç(ì\7ü¶“kýêÿå6þãoðóøê-Pêz:ª¢®w~Ù}ž£Ifý¼¢Êº5_܇Ì),áÖ´±¨%Ñ©½±ÓÝtøÒ_"2++¡×–¸‹iEà  »HËÂ0P‹êʤTyV{ºp ÉWæ”ì·Qz=óØ× ©‡ËSøÔ8©i¿®¹2½q3>hQ)Çö¦zæQuݶ£P×9óI,£r)œ¯G I,tæNq{íÈdW–Y}óäµÅKj%·nFC9ð‡žôðƒÃ×lvT$|±‰+|äÙãYÄYñ$7HîHcw*J=LC¾ž5nDR¯¢¼®½ûé}¶qðÕGÝ]™éˆ†™ Ç……SK<ìP‘ìÈu4ɶñmcÓR¸`M„8¿ìgÁ Q4GöOÊ5×+É_O`ÆUh©¥`àÔ#µÇ4°å4„¡uâ÷JèѸÔÒ2£š鵯mgZÁóÊg?òŒa¡z@wœìQPeº"q2WÌÉXèCÝ‚N‡dà8dW>«c7Ÿ+ŒÊãSÔCnâÒ-¸DÀä ·»kÌä^¨Žf†#üѽç|õíË[_„JFÎÙ‚âˆÃFfÔ^è˜p¹3Ëz+$ŸËûìUáΧ×ÏzÜ|"ÿÏç Xð:«¤Ž¤vƒ]A8LḴõlae±¶}m_?Z©²‰Ûå/+ñÆr1€ÂMøØØ%k™¼wn?­dÌ€}zn‚{Ýš —šGK¦r·s?tòæPÚ6óþç(rcïÏÆäª‡ÈvTÙgÃ"–CÐsJ\õѺ™E„‹4;q´a°oÒ¹Ó0sa–bŠn­ö…Ý©¨"ªJÜÀFM£ªù²Çc¨®y¬(Õ:b¿ÁÂzôÇaà©,KpØXsüò+¯ïâˈ¶ãïÅÍt†5{†Æx’6?媓ž*-jƒ:KÔª:Y—“{ÊVÉcL9ÍŠÍvÙìËâ°¯v÷ažöåo#VöÔ…ðöÏtR?ÍîßZñ7®Í×"‚÷O¼ù¾ø¿Îï¼!ñûýF÷ò0€µˆ —?Ì|\U óŠláŒó¢G•ÐÒ@`È|Ž’²5%:ýÍpÛ% à¶þž¼ÿ¨Æ#Ú²6¢®–OðËV@Ùàk‹ˆoŽqÉ]q¤kçƒÙ“žS€4%7Ñy{ýóh¼¾,¾ñ|ÔzåË …­‡ âä$ëó9~ŠB< d-ØŸ°3w['·åײÌm(,¡¸»¼•ŒZ'Ö³8âÛxõa–fºA¥“1‚¾T}5Z½`ÛÓJ V ¢Ùl„J·Ë’Ãgz+->êaíò¤s +娹Öm’5‚¤àètY°é–ÌJÂlÇ£}ÀÅöÛp¿ BFCA˜² „ÇNt)5ñÊ@„[Ó7l'¦Û[ÞŒ.äu>V0@gMŒ½ÍøÎI8ßU=¿¬<#ßô¸‚+ÊgWã±oW0¾§íÔF9RýÈéëX‹u ƒªóëãáéª^ë Ìmgœ“†êÝšS4RÜaÛÒ„ÀŒ0”ç)JÔæû…vþfÓ¡ábtÉ-…«/µê¤vpóºÇÉþ•±Å.¬Uw»«Iõ’9Xo½í‰®ÆÉ1Cœ5Êì²ç“Äà¸{qæý| æ›9]ÑšÐä„õöWƒ|Í(E­Œ”Ï”BºK‰¨‹ù f‘J¤‘.šÕžØó}K?w³z%7˜±ªNëýYwÞ'ÿ´Ž][Û ŸÎëë¿ô?ð1<[GÇJ-Ø­Cá¡bnêmy6'ôÝØîeKf2CÒýÀúÊQ$;qϦC¥`ÙKo\{PìÌ5늲“é B }Y{ÇÈÖíÑ<“Ë¢XĸZæˆäaãçÖ;?u=­Ã—}$p¾*ëÆÕT&š6{D ‰~ïðÖê“…µÕömô²îZDª¯X?ºñ8D`Í1Î’à¢L‘Ñù½wµ`I—ÇÖ*zPŒZj-Æ ªà_µWÕ?Ìvžøpsyö}üúdeÞþ'ý m½sò´'ýKP胼ØTÐfÍó­×OR?²Ï“ðùßÇèž]gfŸVõVg¯Ôu\ˆpf—y¼»$à¢Þ[Á:Ý2±p\ Jé@Mä®væ@ðV*ª€ RÛ©Òt‹ì¢SÿAâ™ß¾¶÷¦WðDéÎ)ÐããóÖÅrR›ô˜k^W4Y¹¾šäˆ³óx¤îISTÕ®TnTš€šk^ËuCÌHÆ1žKsôë÷µï‡w„µïïÏûó9·Ø Ø…TÎÆS,•¤¤oo¤?òîù©î­°ÿG©SÓ65¸£Y0å)‹Œq?xLõLò?p¥ ì³wqªÈçMÕQ©Eùä"ô2ˆ—¾´Ä‘&V®"Zý¹kgg<µ@)S¦ã×ãú7¸ãOÑã&D úê£á>WMxœ,‚€™-Œ~¢¾,ÄÏê^"Îî8^ ju¤c<ˆ¿½”«âÂ+º%`ÔR8ƒ1€£¬p¥" I„•¬ !‚AZrÁ®¨ôuÏçãTM ¼õ_t ¦Dwº#ã:(@zÅ4i#!#‚E4h@QY ½fÝ3{Ra Ùû&ŒD(‚Œîât7ÆH`“ŒÎ, 874Þð0{çx­ÄªØ,IòàGüù©®m@èz\ßâå NK'±ÑH…©™–Æ5W¢h0Uxïížß¡¸S`­Yæ‹yç]l ’æ’V[²$³ž†Ta\«ŽaÐìy~è÷ YöR£*·F%¢vü‚¹Žùë¬E÷ )TEÆ¢›éaÈ\E¥î:äaïùLRï+÷øûñ¾Qìûú+övöõÝT·‡üm‰çñ&QµX<ŒÙ©œœAI‡3É0ØîÄ'°’™!E¤¥¯¬¦²q‹‘¥sµ ¤‘4‹Æ5!нT[ W¥Øè.÷•~º=ëghò4ãÓ‹+•ï¥Ú®Ä¡Õ5pjÔÀ¡Üî»dŸ“‰Ês6ÌÜ:Ãg¨Ÿé©_u¼&XP/ÙPOð„vÊaÎ#ŧ[ŽXA¶{” #q°O¡£Iw]á ~C½±ˆA¢—%¦]YÜÓ»#y#½´¢$bí¢‚q˜"+ ï»å °“r'ÝŠ#+òìá©äüxkÞo~«Z¹öƒ´2ý o¥ÍÖaï·R’ÓpêH¢=¯rÓz©ñÑjn=°iÑB.”~ºq¥>I, l[p­9XKºjhœ_I·ñ("mæXw´’.á œIb1 Ód¦;·?¹W¯ú3ê;³‹ÎÇ.W§D±ÚŒpÙj_ #Çiìc§nÍ“åã÷Ⱦi9H};‡;Ïá×Ô8xÿo‹[É^7»sfû²à܈0¤bL¹•ÜB ÀÀ¡y’uä)wY Q ¦A 8Z'T@…)n*Í$IÌøÆm䡪•Ñ€[¦Öû=½O̽¥‡"j…”jÇ L*­Ši”‘Y‚"À(Ï|ܾ”#˜CƒpvŸúb´?s•Z(zvýó_o©ç}ÇÙÆS”,×L'Ü}¸{Æó÷2þn^ä,ÚÅ¥ˆG„ˆD.Î\Ü*ÖnêaôYÚ»®˜ºqé~ùº$¶-ïDN¢ (‡( *˲òIúíÃsl7[¯* ’¦;ò©ò`=;uìs©É ]š½ãü¬ÚË«C®±ª3 †…é¹ÅEfÑIWfuooó…`¼ø÷ ¿ÿtÞhCù~ëŸÑΓ€$¢„Z`¤w':æàtIK9‰xÒ…{€9õ_Öã 0¾¶‡mž]¼׿¥úý‘ú­üß»°WÒ‘•¥l?Á”öªBZvT—ŒÁ}oÊ>M9³ò^ÚŠä´ÿÕ{z-ÙÉ\Zlœîª; O)vY-uµÕâàz~és’KŽmµ¬í¶fÅV‘ýÎÙëТ5.r[—àé"Ö—õ¹â×²Ìæ¹õ±¦1Ü5/Ç»QY´ˆ2ÕEG p¾Ø RþHÇ>$tðÆáÊû°@EÔ®¾ôÖ÷A˜&¾0h*ÝÊ8›·´ÉÄÒΰeLV¨:¡ˆ‡ž¦ãy‘%êµ —&›k5ÕEÝouàŒÐÏçƒßÐþKóýCŽüÕKàÏ…ÿåäTÑÿ%YÀèÞÇž·ï1°ê¨[ôì·›!™±N±âÓîg\Ó_Üì§îal¢ 蹌gô•·…¿Dû¨;­–ß0gia™áÐ&µt¬Îæ¶‹z€HáõØ ññ ²ÿ*¢ï1ÖúáQÄ:ÑyØŸ\Ä^¾ÕÆKò3Á¼A=Š)|¼{°NÛÕzÁ«PÏ3i¶ b]-o‘‘€lËüÒøø‹¹gÄ£Z{C¢p ]j¬à”{Áº('Æ0a¬ã@6Š3óc¹§±ÁêFV‹ÐUI¿}ÊÞå §ãÃÞƒþîb¡~éu䃒×Å.2Ï9YyDH2›»Õí¾ŸÚûž©[žzhe#H<Ø éÝY"U 0cL ®`Út¼üì4²íNÍ‹£Ñ-HDàÜ7mÙVÐílæÓûdí×WhU©Ù= ñ­prŠíq§e\ÉÚU¯…Õ°-a-À4oJɺ¾8ÁñUë>sYŒÜOÃvnå͚Œõú“z!bÇz¡£aâ<ó{ŸkÒØy’ÛÉ}¯Ý)¸Â|Zx.?ZT¾jØv‘š0üÉV³9+]îßùØ£¥ãd_ÛçÖ†¿3xvwԛ߿‡Fš‰¡ÒÙêÞÈÞ¹¬'ÛÏFNÖæ˜[wxŸÂ–0¨í_÷(5ÒÏše†äI¾«Ä·uÌ^„^ý{Ûä —Bjè^D5‘ÊIÔ4Z ~ˆàzŽf©yIûöǽã;é‡}j¶PcXZ¢ß‹Îù²±l wQv;°¾íV=RKOÓ   xåëÉ+x¹@ 0¤fœë´½V!ªª¦½àzÝšƒŸÛ¿ÄzÉk° ò–¾ëB™,˜+ßy¸Úd¸BVÚIá˜?DÖÛŒošøÃæ.jA&ö'¢§ŠÛŠ;¾'꜖˵rAªK¡=Òˆ¬Ìo—ŒQ`Þk—½TðdÓ( QkeÜFÀÛ€<¸1s/?•3ÖóJÿí¼×ÛVÝZ®3»¶¤ÌŽ EË–Ó"g©â6¿2½a‚­Í‘-?á«S›¤Dɹ…î(lóÒ§‰ôGþ±‘<à»zî¹Ñ2N€*vÜ®†‡` úª€Ø„  °= ’BGk½¾ZjEàMXd•/Ç :ž›2Ý•\‚¶7Ä(ˆÊ¶g 8¦8ŸÙÉ>êŒx»×à\'.{ýë±ÔCFsÒÃcñk1ûÜõͺAšñø(áôrHy*x:͉@%:€ˆÙʳ‰Š«²ÜŽØˆ.3¦¯[¿ëkX /íée-eA}9¹ [Ú?=Œ$D"Ìt{ÓÚ«gŽëÎ3GÑÝZnîRnq½Å˜+™N<<¥¦¦I]t¥T,FLªŠ„¢Ñ2#µºžÕy%=†'®§bÈóÌùF{­BNušÃ$ „ VÏw½ûG4?"ÝÅì­íÕÝgšÃÁxÙbPE%*›€h¿=˜éð©%Ù*ÇkÏ"' v׿ûq+a[¬Â”e¶è\«ËÆ®}ö´ï1Ü«ÑwcÈìÔOg‹3>6ˆÇ¡2³yÑÛª­M›Ã Ø«_/EŒñ3;û¶ûÃPßÂà stãÐÙfËÑ ÑîbO õ×NúÊj~­6†ÅCe4r|Oøñ\s¸%næ˜ÙŸ\^´¤²Á óðëÍœœ ‘«ˆ¶­pÒu!3®1¯ÿ˜Ý0útL-Xÿùµ›Ý>W7$³`#WkjÕÇòA¤[iîÀÃ^áÒ–k깤A¾îÿaañAO‘ñ_ػίÿ 3ß7.0AƒIÅÌk¹-™† ´ŸF»+Ê'–¡EìIWÔ#[f©$ÐvPIDž¬B“š‡ÔUÿ)…ÿ‰{ª‡23«iòQ%I¤óa¼ÞƒŠ—)HÕZ\(ÄŸþH3†Ëbˬ Œ<½5P]a-fA|sì.—î ÙÈ_,×Þô%}Á꺺ùÝÿâý[ã<øqYùº‚&V߯Æ*D \ˆSJ3b{LsˆúÝÖØ“^~Ò~XÿÊ> ïÏa,‡ËΘø«~XêÑ^³ß¶P~☎`«»ÊSc 3]t¤Ô0ìjÛ’XæÏõ=ç“þ~Tçs¯ÿ˜~8ë¥R Ó‹¢™1,¿Á¶²Ù’«ëfrêɪ%®«7æZ)O|.P(ãáç<|c}è¢%Ç¢mÏj£QÌr‰ëÉtW”P!bY¸àÀÛG©Cæx(¾†¥ Ê•Φ™§}ÚøÛæÒó¤Ò·QÆ,B‡š‡XÇ•îum4¹¯ÄQʰ²c1œ ’ÉVÀ¦¨Ž’­cµv©Õh%þRWçz½÷ö¿ÿÿûõêý¿È÷?hßþõû\—Åþ@—¦Äã±Î§`ݵ3·æ'ËþÓüã·ïbKèʨbe‰œGf]ÏØeÍašÝÂ𼤟³¤¸t‹­â¡S–lö˦¸Áeè:âü^ L}iCC¸\Ýçìºü?û¶µ^ì?ò‡ÉoGkÿÉùÃGy-üćëó"¡ ´R6úö¸[7—¥Ør@Ôø®#ïûâ‡J@Õ"­Œàíüu§%?¸?L©d–X;´6 `£˜@¶rVòª³õž?d^Nà Q ÊÄ( tC×£5©@£”VŒ¼éæíZ?[0` âé¾ðW¾2 }ƒ–š”CiÞ¤§A¦œ¢*¥l¡ºÔ×ò.Ù€s©Mk[Mè‹»àA1éîR0kÅ„IpE"4{ÞûY~|Gn;%#ž ;)«ŠE–*g K@™êÊ-À:J©Í$JVÇZÚ®Fß·µ3×$üÓgï=¼ç›û¸ëkN­•|.«XB0 -aò‚ÎÅÚê£ï\^.ÄçÔ[B4Æ ÉŽ%7‚ˤåÕìÊTp=ÑÒú¹¾Èyaÿwgüã¾?)ßàÒk¢ôøçîû}|1ì¹Ñ[')Ë‚–"O|7>‡eú£“y¾­sø¥~ÜufèK-V9DÖE!GµUrŽG@Ï„ñ!ÀP¢*Â\“۸ȴúy¹gÝô1s1ÅQ¼øm¨¥‰9ȪiL% L§TÛÎ:ŠÁ¢µnÎëÂ&ÇhäL2tí#$Cà’(‰’³‚:mÙx°ô ¯‘ÛðZ§3Ÿ+f_æô÷ ï°o=« hž¯X¡ ÏJbð„RԺؠA£©í@Ï%"'‰8¸ ¯TÙaY¥„=u“Š\ÆþãškûKo¨Ð†‚pPa¤g¥cÚjMD" Z ²€0¦=æ[T|™r EÊ1À©Rjø>·m¯;aøÜ\k–rüˆä'Ô—kUåRÎIΦ—CÃd]ëÅ^€ÐÐ5|Ã@˜µähi-}Jﺇn/aN¸NJô„¬DOˆE¸ècÓ²²°Îç¨9B²H%õ’Ä“¨ì¹lçHŒÒkf3JϘ©ÄŒ$^¼¬Ïšè!WHá#´A x Ei14¢CôA¾œk×wâjêÚË”… Ž—¦‹D\_Ö 2·aê5l_ŸcëõToG{\q^½è}2Ѥ@²þeùhãøþ«‡•"°=V@°B’¸.c!+i³L&€L.qx}®TDeÓcÖQÌaeÄCi¨M_ nä¬ÀËö«õøÝ NË_›Tçg Wyzaålçµs|ÂÃ|ÖìFíù%·áÊ'ÂøóÇÿâ_Zÿ…+÷³ßççqB?·)?{ÁD;tBD†8¤¶Cã²§¢äÅÖ€Pô*еŽJ_tPVÖ{`pW™mLkqZáX‹¨œdˆ9³üÉðãç$5Ëv)·´792&fü²–sV ¢©‹PA±°!•B¡ù¡êL1ÒQC(;ù€‘‹—u¼‚š'D!EÓ1œÚk¾bßšW’ÚÑüsNÿ³/⿦ÛÌ‹ÐX<µ²1YÄLÅ©Ã:àHÚD¡äIŸ³C`g,DÁI‡í¾X©HX¬-?Ð'(bªÜ×Ó~ƒW¾òVÜÇ_o¿r -Q\#uçS?‰–yt¦4ÔÕt3ßca–À£|ªjŸß”¬;›Í“Þó‰žDCf•òî‹^¦óŸbÛoKÃRŒW„!! mYF XLBáÚwTá”–Í[g#½0öü2owû Yýeþß§ÿ— ¿Þ‹%õÏ¿â?~â~wy9—Kvmù¬ž†n]æ8Eç3gsÊYI¯$ðg,y¾Ö8:8muk¿`âŽ`ƒºHƒr¹(·%v»[ûÕ"‹ŸÖÝ÷Pì5fŒþꚬÃðǤš^`ßž¦ÚP—•ºuƒ~öÑ©ÎíEL¢ÄaŒ‰çÂÿäÊzðÓª/q9 ®QjÃÒN®¥Y©ØDºoþìKÓ^±Ë)(,!á-™%Ö‰¸ƒ¡æ‚ŒxYÿÙk¬Â¡¿5ðbÓC©¾ÊÛû9‘¡ÓÀ¥ª½:zëHøhFó‚žÏÄ¥«%õo‡ )±©›ŸÒûí…c]«Åâʬµ_›ôZ¬äk8îa‚æå·©a /C[Ä*0vëÜ%Ò{Á;Œç—ïl¼>_ú-}8Bº¸â£ð2)äëóy±µÈKÓ2Fƒ"—Œô½©3°ôÁrÀ¼€P… hIZåÖçvÿÜ—^)ï'„%<‡8Ï`{Yg¢¬ú£îµûxíU¦ÆŒ ØÝ«Íÿº¬}‰¢‹ýLÆÖ”¬ÈKÛ3‰ò?ñn†‡<ÌØPîÑnˆB£Üj/…P x•^e\´e³èΤ(—[á*Í„Á”ÙSÉ××áî¡Oº…ýŽ_˜€ãÂLJr:ÝÞ}é8Ù0cNÃ71r9¼(nÖ«UÓ +ug|Ƙ]ê#-¥õ¬}ÎøcaJtŽrmÑB¨’¥.ÝÁ:ÆPœ9-Þš‚,Þ]FM¶Ë0,¨¡w?ȸL´Ÿî³PÀ}éÀþGJœö“ò_¿ôáWÚ‘WÉœWqz#¬WÏ\¡-~¯–Ç®I-1,‰5JÈàÐÒ•_ºåÉ»~­êg²Þa`0°L úJ®k«…¾-¾¶õ£x÷ݱ O›l0ay]. À‚P: ÀÿÅ <蘌‘¦ †áXlY¸ôzóTK¨.¬y”:ÊÛæ±Ñè4ÇŽ!ÎsQ2.°Ež=s‰+¢ D@ËU{„Mˆ˜]ÃJE[4¿WÞø0?æ[§C¾Ê~ LæÐV¬¦oÑ𞞪™WôHñ¶r~7¶Är˜+~xmxáÙ…žtظžßØ~usüc?úzŸG·³Xƒ^ 3i“ÆOaÑ® h×MÉÕ,HŤo õÖ§¯ôNòu]Õ!Ï}<'×G *TÃ"hªÈ[´ˆYì #‰ÇЊ©ˆÀ¹ãÕèèr‰A\ôál-œh2gÕ$Ê"28Ë`Ô$NÁSjûüj¿çÿã<øW?®³¿Ü¸?.I>8&SPÕÈWµV"rœÝÜ”,› ”`š™-Ø-Úî œ¦Q2Š–ìÔh(TìiIÈÔÀêXá˜*è ‘VO»X÷0šSsÛžÃüÒ¹û$«Ù¹¯¬Hô˜{çˆÆ'7x„jöä"ï&(—Ž¥áŽXìˆ ƒ‰Àîv×~Œ«Ë p5[6†&_ Ãª+†öËš^é€ }ÜÙWï??ÐPa¤i4]l‰0êåj*ŸݞøÃFvR“ÉñõõwÝ;í²Á¦PœËÿ ú¯¶&Ÿ(¦®Ç?‘%|§º–i%æá©‚*1º¦Y9@ê ™çCïâ3“òâÀyà.ß%RJ}CÓ‰Á i [Gîh>efA1%'d¯S; -…Çñòz”¤¥Ëüp)&Åj;•t€l$IX10`i<÷ ¾¾âýç÷ãfB奅–€#ÃZñq]3¨,Õ·"×ÀW¬¤=›D <‚4 S‚BX<§ N]:Ýr÷Ch0#ký~kpcñþv¨ßîÕs„‡†–1ãOJS9£ •„˜~z–‚­#}áòpÕÕ‰{Íä®­óÍ=˼ Ý”'ùg/<ͳ5ÇHÙ¸žEì-b¥bèî˜N/FËÊ0¢ÊL„ÃéU‹Ö]ç?Ì÷š2+¬;JÔÚãhˆÆ©=×àƒüÍè´éDÙ¥Ù#Íþè¯ß­MgÍöºo\÷xjdÂÔ¬à\8ZT‰1¾CÍ–‚• $‰ pSh Í(äR¢­o€LÅ&~›Ö9šÿ©í²Œ*/ËJåIŽxÀöµ}A W¨b¡Z:›3oNU fuε§`“•ef$½H´§÷ûô›Ñýßs^gÿÛˆº”‹ &[‘D!¸Æí }õõa¢m9?s?`³Ø&Ÿñ`·œÉP&1¨™•²L¦j‹Oµ¢£=Ìmao34NCÅD¿hþ S€Úçõ¡ù\UY[@:“ªv¾ˆ^Øÿ3lÿ§¶?ùñþ“q@cLÙY_çÞOîh É©¤«{vu;1!¡|U¬\ÎçÓy‡#çq1}ÿÐAÛìÂS§Þ=`ê­ZË[ K¤Ú«!ñµ[¨†5X)”õ3¿´æë]¾/B¨(Ј*[Ù×™…£‰À À ž'ˆ—×Áˆ@‘FŽ AYw¡–´ é„Ĉø ¦ARc%àBpµÌÌQ –F1B±¨–ÔªB.É8ÿ·½:Üñý²¨ª AK(j‰’ñ\'çý^Ç«jQA¨2ƒ EFÍÀÔ¢A1ŠjDç&'Þ @ –ÆŽ«f\öÍF¯¨hx;ìý~ïÞ5n)ͬ–TêæÞ#§æŒûç ´ö,ƒLM¯ã1-÷xÅ’HN{ê…-r ÇVø·§çüáoìwÎÇEîFw£ûÅR¶·xۢΫ'wr-.8QʯñeôvºÒ7ñ ù§7‹팔—¤’ ·<5 <“•­•ÖQ2ä`,Ç¡”%@º‘wÅà$ÞÕ2kNþ¬ô¡èù%nwÒ%«¢VX™ÚC\M"•‰”-F§¨È$ö¾5ÚŒOΣĸÌÓœc  „éFáZCOz;¸·¬·‡ Æ¯GŽäž„âŽþœÖøžXòÝõË»íÆÚó´yß©¨†²nr©Žуk2ÙÅSÑÂUu¯¨;jL¤wŶŽùVÉ\ÍGl±ž-Ñj‹|å³U2-ƒã¹·µ7œS•‹Ën±+0¢Ew ÖjMì©[m¶mÌÔ#ªrépS¾–¾²kðVxË“îæª·¸ÂÄë™bº§öà"^(îßÏœåqïî1çµKÈK¨Å3&0¨‘œ´SyC¦Zö®é-=Jæi»?oþÄD€íP‹¯QVêø­c¿,`YöDD+²²ñjWnEtHFÏu j (2/å÷©e¤ÉùÀŸ¤!å¶êã©^jÖS~PºoAQ“TdEº‡/â´C7÷ô{§Z²3ÇÕvÂÄz†õù»~@”ý箂~×ó%ÈTÏ4_ÉeQ‰ 9ÒÀŽ+8šÚ[–_òR+yȧ±ð²Â FëZ‰Z<Qq„jµ¶e,:x&ƒ[pu¶3¥ë‹`gPAk‹Q"%3…¶Žã ¦£ÑUDLÚÝÜâ„,%Á»5œÏÓøN9G»úÿ]µ¤¬Ì'ŽÇ퉳—àú¨ ºÅy|Žø=¤s#þ»þ˜Ûù›²%(ZZŠKÄ@†P%ê ï4ú<ع2Û¿_ÕEÎôH¨åFĸQ§CÛœ„ù8(µ¨Ôêf¾˜~¼;käVê+(W;˜î­Ÿ2þ¨êðlOÅÅüÜ7&gë虬2ÐÐïT¥S$ŒeyŠd¦sP Á7R ç2T ‰ÒBŸ¢¢‘„$,°w Dý&R2#Ž­ÖÀ긕²Ù®-t;üCKlãŠg¾~‘Û¸¶7g|ò¾:':±X©ª™‚"Án¶0R/»|Õ#wÅHk ±Z¥Qê«rˆ®”û€~HÙ{.d©ÉB/˜bID±ï€†â¶o²nnéÌ.º/wÙVºµ„“÷à/«~ÀI¤¡Ñãó}ƒ·÷6¢·ÔQê¦ébZ’Ê^™ˆV©5nMô©‰] t#Á«·Œ<3ö&´BIˆ_‰®WÂ_fÊÂ;|,«Bþ\“9@A ›,„»ÈV†Ô¼Ú`óÞïÏùsÊöí7†y™•qo£uÍõ{¨ë‡¸}€@}þ#KýþZ Oº ra”'›!† ß #•®¸më3öŰ%{£2êTn¶?ÝÃ\Tû™ugzS´ ~ºÜ¾O"K¹íÝÅZSëmèÀ{3é5е~Œ×¿LC¡!uPW)[>÷ãËg¹ø{D …DI̲¸# Û0‡8l¨tÑð76É¥„œáÔñÿ®?ÜÝk£xíÍ&²±(Pmì2 ÑL¦1ìWêqÌ ­xøõ€9}ŠØ ”q‡£Çãü7ó-ª¯ßÀ—a_=®Š[Ò×|Üd«‘if’3©L˜ŽšNÖ1>·Óö\í½NÉåÅÈ é¶v÷¹El´T(‹j©¯»œ¾¤Øé^OÌ ¹Hž=´ò0,>Ã1ye`s“h²™·ë7² á&I+P«©–£«M|ýÀ—§ƒ¦Zñ|ŒÐÒñìñ-ØšÿÛ§í`›“ö[Æ/Ig¼¶ a¡£ZjK>!´¸Úžt;N—%³,Øžš‚•ùHÎÏ0úõÍÓ㪎ê(úÝBI8]­êŸ•þâ{ Äæ=x¬®+O•„Y§õiöòX·ŽÒT‘Н\ƒú¨¹:úÖ<ˈ…Oȶ.:ïÛàÍa3"È¡Žwæüy;Áme+Mà–‰ ê¨e뻬¨ú–÷~ª«¥wp¹„E›eØO9Š&“Ù^S©IEò]H»ƒ1- \F”|°† U™´›ãŒðGÒö޾7.ïü¶gRãìâ;ñÉ«@@×ÞÑËkþx1lŽ0‚c°4±NgÁÕ›üÈ…oá"$  nþ ð=¿áìÛ¡ÿŽóÓŠ%~—øÎ8uÿÿ{h«ÍÐaÀ·u段òàî-$‰Ž@)83¶Ãb×!¬\^[/óœN’(§}X¼¼ Ѐ¾x¡Ã•0åVÉš† ” QÑàBí.°°†Óå?ßÚPÀÁJvV-Ö¾ýIÏn•º~~€£Oƒ;^å wNvuW &ªYe~«Sç¨d¼Ã\ >£äÂt˜×Õ`Œ“>à áZ‰°>òYc;¶âôµŒ¼ºBw A¨œeYœÊðnÆ%vRj @<<7høee“‚ n×üÞ©jmŸÇƒ4a܌ƙ+ûžº2ŸÏï|ñØ kN¦kÕn¡æn‚àawæ£MÆãÉ£‚A )lse¹onºÉ±´ÁpKm"·'†Aâæ t–L4±Šaà Áh’§0ô€AWIÝ" J‚$€@a(0ÀôÐ>bB>"^(j‚ º/%¸l€ºAÀÙè"],PŽ á¢kWB*³½Šc›åvþùT®£ÞÇŒ+®‹ÏÑbÜ?¶;ÙC>/çYc–4ÍÀÄ\~ êûد"k±Ñþ±j¬IBt¬Òs±”ãqi°3oài‘¶‚cù¸\ä§\ϹF+6É¡Zr­|›’„4Ôh‡bþ\L?‡f µÄ1éÖ:DƒJ$EXÐ ‡b…#Ñ ›Ž1ôN ·TtÐ17:%eÞuй‚Ðq> ýsåâÊÄ¥µ¨i¸–Ë߉ýøR/ÿÿJùû/çwñXûL6©É=%àá¯:¹ š~ †+wõ™Õ…–QËæœ;1Sj¨D„–ÖÝg.kèÖ·ŽžþÉ£–ô­µŽÞ\áIºœGõÐîžÓû5h†4Ì7Ë’Ëéô’:ï°‰MÎÂZ[½èž½W›«Kw/ï wÙ“N`9 à±ã˜Œe<¾  ¾JÃÎáãbç}æï?øy ú•¹µéˆÒüáç^¾Û®´O ¼û+|½e÷èfÚíöT¸tìlO’P¹~]ׯš?rV ŽƒC4¼×ƒWjŽ› Äœo¤ÅÕò“­Ÿîêã{wÃZ~âº(H‹gn·—HDY•6‰R˜a¨jëœÉGªÊǦ!òr_5.âÒ‘‹bñ܆˜¨^e–B1¤p*.¤ÁßúòÓdE5–Œ   ÂJõí # ç•E‘PÇ‚Þ Ã ’0©Â¦Öœz,“¦)b9p# Rb‰&«áW‘dÆvÏ9/øûn¯›gûãý¸3ÙáÚ¢u*™lf`Ъ‚4`¡Dŧ¡HÃiEK¥€ƒ.¤—ÝpŸûžmñç0Wµf¬èh¤è ¶@‹cMJZYhM쇗rbÕ©zLÒkRT¬VªºES.…ðJ×:ÐÆ©Ò–a¸ |Y,–†…ðE™Më|scVy=µÈcmS&"†=½ øéqèÜìÿq3ÿWêJ™¨t¼Ãq–o j%›¹EP·2 Vý¨fÿZ$—þÓ¯êÛWÌŠÑ Æ’¼ˆI|0ÿáœðMdx¿ÔbçÚ³‡:PàuÌsÅ<¢|Ôç­W¹]Y—;­)˸è1(þ3£Ù;§%V"žð~о^^ïQÎT:´­Xfxªozi4§\Õº+Ük‚¶}:HM-(K]¨ýázý?²×Öøá¬¿©øì1^N·Ñ”®T¿ŸÛ1qm)j™³fýø¹ž¦_ßS¸?§î’§ÓfÜJŸ›®·RíY[žùQàv ɣè±6РWÚy W @1X¡­”(E Mz)í÷\·ŠF(2±´& ˆ…<ÜC+DñÒX‘ DIš•«Ã„ý‚§ªuóP#TÅ …Šjp~°I²^KÚOO "b¬´Ô€©<ݼº‘ǧv/ìDT%DEb0Éy]è!³Å.‹©ö¹LÁGLÑdP5ƒÕÓQ#-—ÆŒAJ'78r|øžãÛ­sƒ7éçÕ¶¢ï;~ð¹H@ 5™=†o.Km¼\à†òÈÏggÁ¬µ^°Ý»èÌ:¹ÉÅ8ˆžØW¼" «A25u8|ƒ×íúϦO¦.#O“ 7DÈU^OBÉ2L¥ßê©£ïú˸Ùeé¨à¦Ó‹üx»¯ èät4iìîŒ0R òë(F,Æ"^cW*ˆƒBƒ’Äœõ|e?EÏÁ!AH¸¥j·²W)$F“H'Lj¨()µ ÜMPgNçIÏ”á H$UŽ' ÁzdV gWö­žÍ:Gèa»éȃ•D~=úyÝKñ™£•3=óؼë¼³ç‘;CïBÓM” bª.Òœ¨nH\T=jÕ%Jjfúrà ‚ ÄmÏý}ŠÁŠŪ‡ÍžK»{¶Æ4VÃF†;D&C! ì¤LFÓAumÍîVX‚~†àv¹T Þ[0ŸB»y»¯ûhK0ÕW°¥Ï5vcA¦KOƒRG¶Þ›eÍžy–¨ªŒªÇfz”ÖúY¸  ŠzTÓª‘3ɵ (Ô®Ó@tI¯F ®±åxo-`aL™T|:ª’íPT¾@"æ›c‹ÉϺ×[beJ(!€Û\L[XŒ¾¶'[:Ï|$ì(À{0hìÃÿ¥ù„¿¼¬_ü‘üù¯Þ–•hD§tÀŒµÍñ*ë¬Ó97ðG\·5ös{ÛüÞ÷ùŸ»SøQ…ªP—-BW ¼ ó5eF«ÕÐç ÃéÔcG_\ *™ÅœRþåºßÖcµŽVzYûòêìXy*EÏ‘ZÖæA"ld»3î1 ¹žŸ~õ)߀[/Ï€‹ ZOãQ­EŸN&D¯e®Š¡N’œEdI£›[žà*ÆX@¡Õ+¡pkQä%ºÆ'ëŸpïð'ñ“XŘ‘P¸q@á(N Éc£bq:a÷E'"}BÄ_ñ¦K‹:izg¯å J˜ã_ã¨ü)¿¢J RÅöÌ[õéÅìQû>eÈ|α]ï¯_®áçàðb-‰ˆ¤_jß©s s<¸¨³ÎV°†x4.8Ï¥ž–h¢Vh~ „hIM.¨_¬W~Ý &Fϸê6ª¼¯I ê˜q‡¹²ïE‹Úh"óKJGáÍ–`‚w‡ÖI©±7}¼×xŸð7¥ÞîB ®–ü:O <˜IÂðÌI¦¯uï+Å\QÀÌ@šâ– #“ŠÜ–„"öÊhÐ$bÂXi˜!NTÁ@AÊ*=ÆE2ŸÕ™[fÅàQkÔIq–­ÀiÉÞ¼Ný÷Ãûßñ…/_l9ÍîÖöÉľM¼Ïõa ‚¼µ;¯Þ^ÙçÀ#x_uCÄž4.D8£œ©vy&Û—XßÞùÁßÖ°pÕpW1 ;2¦e!TÓ1æ[wÓ5Žux|.L}‹»ECž%–X÷aÂ*o÷ç7¶H}¼·è˜tNÝÃèÆ#±³ó*Ú —¡#°ÜÑ1ya`¤Ñ *GºbD¬ÞAV¹èå3½mN“ú)6Vý8И%Äo‡¹?!ò§IøöeêWk}&× mÚ†ro«›œ£9¤qÜn´2àIh˜=+cÃçqÐ× >›æ¶ŽÛ–95³ëy ŽI1–K Çl}|í@=Æßé“îýþ8_¡ÓrÓêµrXù°¡†ë èê>ƒŸ·Ç?þu”ïY4FÌ"ö»Õ~žúü¾¬;BUWbrø• ¨yomÃÚ&ÓpàAùÝ´çCl¢g«é­¯S«È¶÷Ý<]ÅÛ <\Õï ŸVÄÆ“@?"MQüMÔ–Ü…l𯃈*çßC«Âì¦Ûî ¨Û˜zÕô(Bižh‡îŸÅ‚I×GêÙí4>W³+ÏoEˆ^ø ì"E¿»æìË'„ËÃDHTò¡ Õ„—GtHHíÜlwˆ¸šþ²!þóöÿÁ ·qk^ÇÑÖVòÝ¡øh9ú9´êàÊmÒ8Ý…-ïRæG‘kTº–=¬ÑÀ8 së`Ž&Ì~[Œ%þÁ½"žmýå=£ öˆ^BeJ3[Lµæ÷öï«]´.I‡Vf¯ ï”·v5Î)VýýâwAªµ>ò3«k ›>Ó1¬ ºZ|û‰>·Èã€ãÀ¥™®Õ˜‡~™sNßÝ ûÓz™¯ñÛ_ò¨K¡ˆö»ál0'JÖ1œðàu~ó¥'×c‚Ö‡ÿÐÎe'|’ñhÆCV`λûô¦àÚv RŽß·ÃÍr9ît©§+²ûŠ7ïæ1’OF:jBí” JÞâ™SôÂ!f.™¢™­÷îeÓfpØ;aÛ3ÑlÖC÷‹d>¦ÐUW¸ÓŒ¯C( ÷zA®úÑ™ënáB°l§Š#ߨÞ3º!öèÂüu˜tò#é&‰0*‚Ò£øÕxˆATéÒÛ`?yVk7õ±fŒ‹ªÒ½^ÕÜonQz `*!£3~õ?ce÷Oþ™wçýåÇÜÉv¾æñU”íè¹W5ce&Ú´¼óÉáÑí×:¡“)"䏸ÝÈ‹RÝ©Œˆ*Œ._’&yÓ~¯g2JdKÐuÒnã,Ë¡/’ — 0!öðæ\ Ž÷¹„_\Ï—2²f¨½‹+,ñ1œêÊ›ÔvêÓHc*ÔPê6_Ç$Э¯½<¶Ãݤ› 7Ûª…¹žéÓpÆ¿Z™ê~%âq‹÷3”‚ºSÓ"`u-ÑVjOX"+7+%åC˜Ñ—!å6@RƒqéΨ»+‰– áRAYv¡à8û€Ä(dã–Žgû¤ÿj.m´ßwªË_~ãñÅËØ~_[sé%àP.Ÿ¾Ü&щñHG¿Ù·/KÖÕa^®Ü9ƒ¥³îØ”ÿäúa7ìζ8~‚%$ˆD,FùÌ.ÜemˆÒ6‡½ÇО©ƒ£´h[dZ¦D›ÔÐÎÿß½@À@O 4€h æ±=Ä-€Lýÿ½òüåQ€ „ƒ¶ˆ}†ƒU{ñþÆ‹Ýccúö§…²‚Ý–kP°³õ¡?ëO êpsnÌöÁîzùú$žÞ¹ùþv0[ ò…<îwqÿ¾_Ÿ+TŒDðÇKß ºÀT±Ù¤^òûþ5§ìºP<š„ÉÝK/:”9iväR\MÉSÛN¦„­bÂN2’‰ V0Ȧ™Ð+´µ3VeF>R0Yz÷t­r® § "x¼cÆöÙ´kéQ²EºŒÿˆÇOØŸ÷yŸÏþú¤#g›4Ø<{¸¾p2T™ám$™ó÷fèì°ìºGŠÏ¾†Gt[È•Ágw÷Q= BYÄpCÉꟜ޾Sª Ó3­ŽOëSÿÉ ÷¡3ηcBß•ƒáa©ËN‡k+œ ÏÓb¬-Ùm0GÛàã3ËWýLï±Á/Ww-ò:µˆW¼’âA±÷¿B3/9ÖÁ¤wµ~aÔ?/}ÿÞ_eõ°Qz Û•¾®Ç%véöUzùj!ŸV$ˆP`»«ÿƒ¸;ÑSµµ½„»]ªîÖ€µo‘È ŸX•¡œv£pQÄÆ&pè™'xnsÝ{5{—8P¯ûã}/VÇñÏå¹â]/¶«åJ±sµa¿&_VoŸ^x©¶7ÚÕïÔ¹FËI½Í¢¹uî—¹êÚC0vmd‹¥‚8ò)s\kÖ£Ùïü¡Õ˜ãĵü%=WL•Šk6†ž®b00,wrfe ›À²N©ˆÊûÜ(šNâ„B=ÁC1â3~¦È¤C3ñÄ’Ð`ùì\m=WªS6hdÊz¤E­”vb <”ÒÚB1é®ü8Ò[ß9¯E¥ßº¹Öó“­–ÍjÜ¿kV¿ßSJ¥î·‰S¬`»0"£ÐH3*¢RŸš>¬¬i<Ñ£­( Ä\Ðb¯óäVhÁA1LÄMeÙ¸ÒL=†Ø Šåª*zѤ‡U4Þw„'*sgè/iõ¬ågWÊîp{ ‹OÅ ——7( Ï&±°¨¨á…°?Gý9øØ@ŽÐmkÍ4f9侩>7¶x>L-º"õs[OK+‰¯ÀfÅ3ÊFJ3#ßÈ|ë]ãpXÿŒoêíÚõoÞ ÓF åe}_-žœižºý¼ôcæÛIû@—eô·CB÷ÉÆËUäšÆ#¨?—÷wU«ÎuBÛNk+æ.õ®”á tãó}ܲú­ëÌ93 ^áTQbTÖAhëbjùç¦ôü¥° ÅdŽÊ6“r¹>_¶^ÁìÛÛ¾.NÔÒ7’gEïçÁ¶°aÒà,ÕÛÜ{u\øíh}ÂóÇS­£Z1ÐäãÈÝÙª šR^LuAãðÎÜ3û]ºî¯ ަïÖ6{†Õ^åzâ²ÍZb€L ¥2—”ŸÔ{ln„¼R®îqžP3 I†DEíA9$FÒ) T!uƒp¬–Vš„%¨†¤ƒ³1FsZá@™Œ'Nø€£<ƒ£@TÕHÿYîà¶à^ÿæŠ( À@‡-kX˜„q¸‰'À ,’ðŸ¶g•„PB¸LP©²$ÖPfGÓû¡z@“UaŠ’ <ºGžg|”÷Û{Žbê=í^$Q˜ÎTQwæsý3‡ø0æÈ.vÿ½7èJhª{ÜwâE A¼M ŒC+z­ÕÚŒâUÖÙõ‡;.×f¥ž±‡ì()™þïïOŸq$ý­K±t¹Sæ5¼­ëΊÄ÷A™ì#ª‰±§îFAE!‹iC2†rHW‘–(h¨Áð(Fv÷Љ™qŠÖre0­Í*W„¤ÊC¢Œ0ߺ‰ŒŸš·6Àfösª±Qœ#ÏŸ†¡T›v˜ ²rI9£I£–ºA-¾èö«×J£ðcE½…ñ±\ý¢¿¿ö|¨.¾ô'Ä×ìîÒ¯0¬Í Ò‚̦¥,X,…Ë&2K¿Tžz¸«â’ö¤DÄf)˜…M…§ì"Ðä†G¿Â¤8 qF!”{!µYÉA<†½gcÛÂA_©Ë¢ì¨¹§w†–ôK¨²QWà]OÔ$þ£Ì´."½õý†Xý‹uWµ€Ž¾Üöm9g^¡ŸMÔžr®ù`aZ=„R–…4ƒ Moâ‹ éS)Ò P d}³ùÓ¨b…wÎiSëçM´?’ ƒT0’WÇøœ…¼ž¹¯5_Jõ¾’–¼/°ZRf&˜5\õˆ/&[à8VTÙ*•Ö V}ö‹KŠq=Ùú©û9@žÖ³0'H;ÍQ,ï,®ÕÖi×Ù3o|2ºŽìj‹(?¬ VHUFhØT¡RÐ"cߚϕzç}Z긿r^?ùüØuì§ASÉl%åi ¹Ópê•áú×Ǹ°Íý™û™k¾¿‚¥Ç5G:ý`($=G`:ÛѪœ‹cÆ ?Óî¶_h†ß%{ì5ÂÏdËeLðy8~_¢(G’SòH> ’Cʴɹxž¶FAŒP/$r#°2âÊ€&-©êë–r”Ó±a( FÂ`WT°'‘^j2Út;>äÕ*òŒ±ã‘¦“Ý‹¢­dÏvq´Ëƒ;8Ð MX+ïtJ·Å4G™9,ƒb þù†%}cñ ç³çªeÆeÍ‘a8]xVnaiqZD!k³è3ÄX¦2Ó~Eúìdµ›®âÜ™ó´¸nx6ž™MâÙuZ:¦™DÝŒiAWƒ²Ÿ ÊñòÜ~ðn_ܽu=fC¤zé¢7ñ…g÷Ë™>¾¼‘›½åÍZ;óì<ÝÇÁ¤©˜n74^±¹—öÇï¹ó…_>2žˆS0‘ jÊ;%f` ‰Å`Nç"j‰dS<Zï"¤²öÅQ¾O2 n¦½Ïco½Uùs–áÜÂÙ6‡NÕÇÊoþRéPÞòQ£Åë2ȯ/}~ÜzîÏe»æn‘BÏŒ>[‹æÕ9ï§Ç1ðTAןÙüÙÂäbW»Õù×´þá¥b„ R ÕiÜ#`wLì Ö¦·ƒ¯èl¿ÂG"’£Ò@xlHo{~I>Ö€ÌÓiZkô²â}yúLû­`XªT¾r™ FfÌY ½2±`Ü gþÂn<«bË¡¨“G Ž"-À¥¶©x˪€bðXβH¨+‹Ì yDSv 8ž5ï]½\ÆK6>‚ؤ<¥ÚŸ¾ÊŘôa-¼0ÅÏ„†rÌ>?ŽsÒþòÄûSÉÜÑ@8ÊÏAwžÄÔ€÷dÝà"™öðªq—à^_7ÿÏ ñð(7ö¼çÃXü¡Ô;ô3tÏgöÿõao¦oÄŸÞ2ïò­*á™,cÛÂÄûz.mœ&ЇâmwB¦Iq·òüë³ø¸™ÿÂð_ùöÒæÈ/j›óØŒÎ/ÀIYUµ˜NJx8DAõÙ¶ؤE3&ʵ㠷2Ì' Ù¤Á . b¸¬ÅÑOØbÐÁËñvÃ4ªÍjSmÞÙl8L DNÒë[$·þ ë1±Oî? _.UÕWå._”Ɇ¿ÄÓ«7”85ÑQƒ¢z @8¤ÅêÏõøÿ²@ÿË&Lƒø5»H,[)Ê;úýª¼ v¤¿\ôv0½ãBÜãØ³0pÄ'O“5Æ’û¨9=°ËšÙRÉ»·Ó_èp*´O©lÙó×öÙ#¥ŽBTÊä6Þ¶©EßôÂ2ü²Ä½¹÷½;ì1Ì9b\D”¦î°£T˦cA£¨P| jUÞ^Þ R_æ”ùåŽnÑæJmãݸàÃC7³âR<ï;_âH\õÎ0ùÒÂwò“?òFÛÒ~«uŸä§G[™=z-9[  ]÷S®zë¨ÿùš1…1i>½ùâ°õ>Ýks{+þâúwÿå_bàa÷Lд!ªù¹êÿüÚ Ë’Ö¼¸EÀƒ²í$ØfHx[íh]a½[í4¤ RWP…ê)nÂ\D{aáÆ`¢xÐ.ûePfUÚ|[ŽIuëP€.ør•,Ýֹɨð+g‰üpèþcN®82ýU† ×õXí½}ó§×gòñʼnG¯__Þ>‡‡•þ ç†×öÛ> $¬6)šÔoãÓ¿]ëí_¤S#'ÕÚ¾™FÒœˆ*ï¢Ê¹Ø‡ˆ ¹¹ šdHó~]‘ .¼ˆ9ÛO§d` 8 ƒ…@­ƒ8„xÚŒ®ÖLnNÚÜËFŠ{\.r¾„GÉcÃÒÑÚ†š“l2ÌpGMÇVÒó‰°j§\¬AѱJK6|ÜO=H4/4E¤—q<Ëv‚½ã5ÒídÌêØpÑBæîºi·×Ð!­h¡èˆøÿì/ßñªë.Ò0[Ó¤h˜ØéfiQÈ鄌Ni2è.Ú•|„”íÁö6Á;A|4”ª§³÷.Ñ îê$ Œl‡O¾\ÛÚ·ÜÜ|¡[e¿ðõ˜~‹‘‡=ÝÁã·{Y¨ñO|›L»HZqŽÈ~ÖK†â '×hßpk:pX Ç÷E!—S„Fy¼7bcÂUþ>ÔBëH \SlªºŠQ«Éò_4\R:NžB€ÿ ;ÿ¼>У  ÈPèà¡4H€‚`h<$€'€G!РA²@žûxH Ý冻Ïc´ÇQ¡ÚN<—*7 0<ý<ÂÚ½D°4¤c÷æ6¾ÎÎþ>aÊû^y÷ù²œ«×}Á(þÙøÇ¸~œPö ë½9s‚ùV£†‘¿þÚ3ø<ÅÂ1u….èóFP§‡ 8[y7â¾³”­ ߨÙ×qª¤rkë¶z`›1Bn咼젃ý;¥(,<­kË6ÜÇ, [¥Jec6ÿc£ÿ"øG¶ïºëyfíÛª¿¦’Ðï&~N=íÕ/7äºÃÀ° *Êg•h!o‚pµ1*(\ä†ã8²Ø†ªàD†•R·³×QmEö^ìà…nõèk•^;™1Ò\íY>Xѵ©MÓ©Ò@)Ô#îÚšÕ‰½OLËP«í'<hSx4/«xT¬1JÙ¹æÙDM‡LíÚàÕ%M·J°Ù+[žolIŠ ¼âIpA‘ÜHÿ^ƶ¼å›âvXF¥*“ç%€ýÃþé)û ›V³Ñ½ÓÃLN°9ó&­(Í YWÇæýôúºÊ•g×ÔÉN”3™Æ.b£¼R|n ÅÁáü»¾þµ'um®ýÚ¯-ö5ôµ:ÞMV_«WæîÍÝRlU¥Ñ«‹"¬´1j¾ÔÂco¸{§}8Âê# ÔÞÍÆúm;Ø·¤XìXÏH[k;ér1ßPâj+ˆYbÒ˜vfÏËuifG£{ÓP¹0 sOñ s HpÇqX. …2ñá1B‚ˆ24°@”¢É$B„üðsçÜ]€³“³´©â†”W£-ñJë(§Ë^÷¢ƒŸù¾^'×É“×xâ/ÁO,GÞK…½'†.Vf4$nâÍÌ™¥–è}*š°pîXÎcXaØ>…ù n¨ÈÊ8_ <\X.»£:ÒÆåÜ”Ã[ø(³gèíMË÷ÄòLU™²X;õÜʼnØRId©Ô&¥­ƒ§Ì®ª *)ƒ3"0Ù˜eòè²8'uèéL/ES:_L~ªžÕ¹Fk’ÀÄРœ@¨ŠˆÅPM'³›®eÀ¨Ð)%›Ü¤þTÿ¬ÿÈTÓ›v`=õTÚ”³ço^Ÿþ•Ÿp{-æ/Aþ¦ÙÿÅ矡çŸ7Ï oÿ`qÿø—0Ç7ë%ßms ó²öÉ\__cë˜âšœ™»GußMlí HÃíÚô.ËÏt&Œ}]b—À·î´2^d¯#g.”}]þ÷¯k¯ëÎ÷ã—ÜŠ»ÐÓ Fq¢úxZ€AÃÐÜÍõŸHýÿžøÿ}Æ›ßÇÆøþ~Î6yö‚S÷¹¥Ç%õØ-DœÅ‘#S>ÕAªФjkh;µüÞÍ $šÑJ4FñD® 2E© ²åmk¬·L³žªcÑDdc €Nˆš†5¬0ƒ¡š#TwUôd)-ˆ’ÑT% *b‰½ZŒhE!#II[¨$a j™›IFB6ˆ Y‰°&Ê&ãŽg ‚”+hÀ‚DŸN`¢¶RÁ^е ]-—œ:Ÿš§?¿íÿÚô-ÃN#öü½ÑTïµßkçNÃD¨¡Øìq´ÔK¹CN˜íœSÓÍ~cƾH%\É, Æš¡ŽÆÂJ^/Àq¨«Ieœ,vr(ìc ì~À=õ8¯Sõ5oØåµ2_}-’©[ …—"ÈÁŽ–‰¢*bP #y%õ€„)â41C^;åiEî‚ÁDL©8ŠN(²Õ7tí_TFn7¼tJLáŽj"•Éd›*bŒEÊ 6ê¬9–¹}Î<8“ç½jþ ¤óñ›[J·b™.Hh+.£ÝS5yWAƒ ‡X›¡IÛ˜s¸‘©0F«2ÐAÒx©A ĵnϽ_TGÕ¼ù¿¿˜aw¿]Gb7“ç%Ù Ç„à.wÅÓ«¹0cq޼¶S uÊÆÍYýöK`ë,ª aeЕcîWýØÓm‰ûí i‰e|îãñ9×¾[aZâï½ü“*}\¯Ÿ‹G½Þå{(Û3öî$ö]áßL[¶è2f˨zÙ°Çñ–GØìn¬#;#@ F3%÷¦{FjÝ÷.kçU™°ex¨xK ÑD› óÜv—§Í]€ÜàÆ×çöÉxB( šä ¶½ûñ)’¹Û×+ûõ1ÞÃk3 ·Ts"Ó%„ÁÂ=Ã6gQOñ¾°[…×MÞbïÓ%Œ‹p˜0èÞ,=Lhf·‹5õ]R}Ë`e;‚dž G@ˆ²:Ý2µ¶ŒM¤ðßt 2…píþy\üÏšúG#<×Y+ Ý@µö$î­tœ™ÜÿΟŒæjÍ]*›)9¦‰{H¸zaù6>9ØöÙ°§Sñ•G„µ[íæ„1Õq?¥>³Èš8¿…bë^ ؆¤·ý l¸ÎESf8jI =w™‰ 4À4 NL!O„gG÷=‚ð~€h¡M ’Q|éŸh^ßý•~³KÕµw‘)~DXø¨ìé¤V\:¯)æóÛöÌq´ S‡Íâ*áÑÁÆ÷ó¥ë]Û=ì/”¢ôš®Ñ] ÕZt;¨²ÛMó³òÞBW2^UÓ†IVO¤ÈÅùqráô@Ò&Žɽ^걋jn*ÐUìF‡6 ²CmZÓçæ¬þ…Ýoì~{ÝL;!C39¶ ÷¯ÎÎ.Àê\‡¡/HÚÁ!>é…pÂê`ò)ªÝ´ €Ñ(°!(É›ä¶ü‰Á Ԣ؆ÚÔZÚøMÇU"佉 ùòRÝô›ŠaŠBÄPCY¬ŽnʱF@gÀ®ñ™ýùumg¢õE¢(ÆÁ^˜:+ý‘C­@KäXt•SŠ%Nøa”¹ò:Ÿñq óBZë‚?%\›/Ù´À‹ô™ø£ûz1!IGC6I¼(tb‹d&cݲçVHhÐ+§!8UÆX9.ù9V«·ûŒ’™míLð¨`8T&C®h¯UÝJ§#­«ð,¡2´² Bêè1hÝö `× ‘Mš§i‘ÒÕþî?nh;d¨]¨Ý tˆ0 sªEP-Ä( iw*¼ãbÜ ¬n¬3&Ë@€D3ƒî„±˜mm7'ø¹ûµ¦Ÿ/*wSô©(}d¼õÌÒ‡ðl—…/ÈÄIÔ]Sц»±ÇýÕ·>†¤¼Kݬ?Éy÷}ŒyvMKrÚ!–î—´A?šCÓ½ EThRÉo„Ú¨öº”j•éÅaGR†ËÑi$  €ÿ?"Ò0ô(P ’ÿW4€öP @ €x @n€lž‘°•‰<53 +×S¹ú`¯klZµG Ä´÷j@äôƒ§/öÅÕ—zvVØ=}Çþôfm'‹Ô«x…obm;ßàðrÜ=8óeb΃ö$qÌà•¸2 í˜Nû*K÷íI±JZÙ=µ‰’‘ä2B‡Øh˜ì4K–×ïò½ÀOý^©ÄãÑ9Á0VHm «º¥¦['àÝJég3dÒßésMȲmƒq>Öá EÊ xÇ¡œrþ¸üH00”‚qÜL-âLgûä,“-¯Ð–uåu‚ÖwFâi÷¡Ç’î" 4ƒ%2Òh*H+1£•ëæ¼‡‰33 ˆ•¥â2cs®ÈXŸ¯^oTCh&"2Np.R8õy”"aCãAŠ­»"ºÎOÒÚkõ ÕÄïM×"{†4*1î7üå zê-]÷¤CÍwQ}0ž ½ŸÎ)¢b7ÀR¡4RD’¢$¢ä¤²ÈÔ@T$°> Æ¥¨WDN®èÝzß²:©È?A"Fb‰fhCΰЂú¢¾ûµ:³aZ€´r@ ¨dÆjE\ݱôxÈYç’Úæ ¬÷Ùùt]ľÀ)˜Ž+JÖ;¦9 (%øvH©¡Jr,ÂV6Fæ:,p á9˜z2‰Ï<7’ÚìùˆÄ$µ•R¥I³+¤e[€ÃˆØrKr'ðØ9ÓéÁŠ?mŽž}ÊÌ:.UbÁL¦õ£z?Ôs5ÜԄྞZÔ’B­2e6{éa¨ÒÛ¬ÛêZ  UI˜Š3˜É›*Xݱ â•'Íj%f>•lúÒ¦jzQ¯‹û(A€íZÏõ×oòÇÐåg7°' ¸áxY’â zêìCýCáÿ„~¹€€iöÖÇ“«÷¥ÐuLû­5ý‹Ó0#÷Uìèd©Lt/im—¥˜Ñce5w®=tHŽ^Y›ÛÔ—¹ûçé}bôoÒüîr‹ôô+y]Õ?š5ß·æs¯|?«ìÌ Mb: ™6U6Ænþ”ûF°žu6¯½Âû¿W¾ÑZ]ØoU3I9b3Bµ¨Ž™³´\Í.Ó<þƒ›a n‡;‰‰è“²A®ù«3€H‰D$"¡D)¥¨øŠU…Æ3½ÔŸÆT\gf‘¨à”bª)2ÀH c *V±Æ.<úk•,€‚ e êÈX=:Ä ° /]a¥EŽ(€l"OT‚Òjk¦á!2BÇ*¨CÞÉi aS®¤Æ &)ê4šUd5QIaši,R#'MŒ¼yâÇûßëá÷ãt¯É¾¾ç¦X¯~èß1ý¨x¦úÆxAy¦ÀÄŽßøY½öï>|÷iÞ)šþ:÷œÑ›ÛÂ÷á’æäFÇh)oJÅløŸ¤y ÞЬ%i²ÀšhÙáÚG¹•RuÓÍJGËk=îçµ°Ú>{ïÔŽŒ|KÛý>úïàÓž¯Ù?|ŽѬ÷^š0uT ÊnA®2ƒÇy4@k£Zµ¿go|Û¨ö©X­wJÁ´d+lÅ%°N˜*0(¥lÀx«wó6è<ÛÍæÈ‘± Å‘ÖD´S5ZB’DƒÒ0hSkC”=¼CÅ”û€TË^ü oÕHû7¡Kõ½$Ÿ¦Úî÷‰x›×n!47¥+¹:/'%é8N"±ýÍ1M•º&Ên±UÚùð°gÒX_Ë»']Xn#Ä"ó”ÈT1p™JB ¬TóBuˆ1;šÂ:B©;äY£1sL€Æ#åh{k5zôö§ŸúVêm9ƒê4mƒpmrbböº&+Tq Ñ*Ê` ‘ýc„M=H¦Éö/ø´Äê¯[]pK_ÄàõǺð}´³6vš:8Mdƒc?+p·m2C_efçÜêÿ<óבñeù­Ë ¨¨~ˆT‹—þè†ÍºÇ& ÷ءȆHÍó‚& âˆ8YÕ;2e±~û€f zæž j˜6äJ¹(ˆ>[™æ•;ߺW­O¯ÏnfÐIÕï9äìÚ®äÎé<…cB ÝòaœFy¼˜CêËnBÂãÊ@pÒNʼn8 '†“ù¨¢IMp@²å^ϱ»òÕL]w:v$ cÀ"ÒT†'gOø3åsî,Ÿüµ!#9G(”ÓLÅ-ÒÉžþhv~¬~œ‰~`í^ |Â<“ÞÜ$înÄáûTOQWCG¬ Nzò¸Á%e ô€ê5¨j&ÈTò.÷ÿÅp¿úûàïÎо€lùñ$¸Ø½TýSöW.Ö×HÍGA"k.Óˆ jT=Ô( {³úäeúo,ßi8N?ª8;دzí¢™s†±½H)عS~(=ãúßGç…áÏ’»FôP¾òÞ½I1pǹ¯Î(ó”íÇ  ãç¨ßÝù;€X“F—ý^µ£þ(š¹þU>‰~¸Ù|œÖÙ_CÎWžŽ¥˜d$0É$Q.7SîXøÌx8›C™¨°$YÔÚÔq,Œv©Öu!T.?·ÈÇs°omU„rc8ÕH¿ùõ'(^šj£Æ{XÔñÔyöž%BN¸¶tÁé5µó\û¨‡áùžïÆóHþÇßîIßÜrÙ ”At ¡¡;üñÅéʧ՟·»MçÍù¨0ªœ÷…’p‘kX,Ó“£ê·–…Þ[]â,k‹å·ùlû kÇû…KË%B ¡ãp =À[S+`†K‚´ᮘ‰A`ˆućtb‹@½ò€!Ä&fAfà†ÕͨHxþ®Œ¦jŽé3¯öº›g!f ÖÈvbÚ4$Ü*ë­%˜ct)C„F§M| ‹{ùå¶êÙ^˼°l”½KÖ"îô/å“Õ®ýv?óÁ„bߥ]³ûðt»¤ ýûñø§_~ù¯yûß5äÓg[ xΑàjãÖƒ‘å9Ò´À,áÑj3õ 1ØÂævgÊ›‡5Œöâј×kï‡Oû¹ñÌ0âªFlÆ&DBi4,æÕ nÑqÀv¬Ð&}3ƒ=r«ÚUä6îÖW¯<ÜfNeû˜­í¥Ê¿8Š/go*_âÕoúrs± AðšÞ‚ûä©ëÖ¯wúÞ¼?ä=¸ŒFàNOpä1Š,³ _ëçâ/?–ÕôŠ0`x”Mz’kÀMPÒ ß²íý_ð}¬QŠGE-ámêø¸-ð7û7•ùÅýNúºùX<â‹y|†W'ë“zÎgo±UV}É‘$D]ÉßüÃ[e1A{=ØoNbs: ÷÷ºÆPWïŒæŠ®h$S°Í„0xòô©q@UKmÜΖ„lýEÙÇ,¿…Ÿ wênÈ€tÜÃÊú‘àd_=>¶ýõ’JÁ´k„hþèÜzÿ'üfưPèçâ j ©âæþâ׺P½ØÞ¦Ð‡­ÂÀ¼²Q\vìµà¯ºÒÏ·%½…:4ÞÔ7ci¼ö€™lo~cÃðà‡÷.m¦k0ÎqDbã‡~ùÞ«œ@´*M…mL—×Ý_´±Ó±î©OÜ/F –•B}/¶Ðf°aÊvPã'æ,ªü»eOÏT/9—·>*Ûµ'&ÕÂ9ïVæsNùÞ’ŠV†+س³]s©x !ÁB@#¢ bgGN(@a2?ž¹ߣ½QÜS'·d¿² ¹ ¯.ÄHBŒPf?Fó‚(ŒIq¸}–Œ^'4Ô»Ðàª_k}äˆ<#Y L½V¥.¥ý”Ú$M¢!òG×°ü3#ªL`ħÙdtáÌgXïÁÉù+ÕÛÑŽAè"yl6 %ÙPs sÝ v”Zn4 lô[HôWîñëüÇø|2ö×ýö%œwÒêûN{AT¸«‚¯[ñ¤ÑåóJxËe@5hÃ`4J$MÐ%XÓ6­ÁÀ?½ @”qÉÀNœ«³Ùö8?Ûv5üxò”¬ÿäÅgH[ìl›ÕQ*'⿸…þ$¨ò”+è´$ï›éÙW&Ô³-Lº¥òs1ÕüЃµ°ñzPYý£¡ÙÇ—5É~‚Ž©èët±[;P&ìjŽNɨf ¢Y-cê2¯÷aK®ÓQ  x H Gàÿÿ‡! ‚õÿGxh  ÿ/þ™‚JP†Ié J&ix( ͆áA(DµÜ’¿ a4Y.’&Üä+ÃІS§D‰å ¤Œå‘L@ƒBØú‘¹°¢2Vd¼mï÷…çVZ]H‘: H; qì)³õèPïýë¦6Wã?þûî}Ã* šÖ)ôD)Öf§3bOyD¬|öoºݶ,UªXW’ŽË¹Q)Ÿ÷š¤…62 ñĉ*g›v¥k‹Õc7U±v#ƒÎ̧òP|vuïY¡ÐS¼XŠcöZÔ~¯4ª3ÆwTÀŽ\Tvtàˆ8¸‹+ÀqÍ–ÓÆ¦?¶ü‚-÷f“d:CÒç Ú@Œ6%úð¹#\)¾gcÂ[gŽÂØzÐy) 3¯¹yz©’Ó–ó!GZí²Q„4 q®a&ÈXF[Cëªý¡­Ù“6£°n°Åqë|Iy>Ïñ@‹Jî8¤&@¥RN¸ãœÂæÍÚýŽó~íçe~(ȤC¤ÕËÆæy OuØ+ÝËT5ÂLHtÀÚ&Ö"ÓêÙ£>1#¶•‚S„Âñ¦ìO¦€¢ê%»’Ky4 ŒA.$S@ÀF®tB•ô¾ï=K—¦,…ÂItp¯\¾þÕïþ½ì[(›* ŒU€1®þø¸ý,oK¹.ðuÁ÷Ôq>“@ÂYÅßK§°Ð^ÌB&!.ÎÖ*/—}x ÏFfÊHÈbirµ[Q¼îl˪ @¨f5£+D˜¹Èµ3l L\¶Ãµ¹Nc E „…‘‚hé7‹—,TQ¸u7ûЇ]Xíýƒ<ŽË׊Æó ¿ØÌk¸ô4ͬcW}veG¡ »Ò/”kb%8"x¼~ËxÖÆ©ú¬Ö—Ž@JQl/HkÄ#1Ðp˜ó“ù&Üß’@¸V&…GN/ œQŠúÃ%ÔD‘RNB5Õ‰Óž"ÅYÓhé‰íÙó~Ußž®Í%KÛuéYs*OWf®MˆaBQ=Ó`•ùSc\ùûö_9gæ„56*aÚSòZ¡"ùzëîâ7ªS“|-M÷¨ÞlX !ƒN9O|v»c1.tæÈC‚d4së¹È ­£>ƒOz¼´´Î{š(êãïõýcß±ÿÍ2ÿ1ð?£ò·íoŸüöX˹êO‡È ??ƒý ký¹3·¥˜œP6®<ò wîdz‰j“µ¦üìªå1±Œ‹æKÌÿ-œ¸}„íxEŸÔ¯•?ümÛ°l!-Y6Ô¢>J;®çó­SQ—Ž3m¯|1â9ûpî¿7ÛÌúc{¤<=ó'ZßÎñíõÖÑ\­¾žpÆŽß5f»®Ð»Èï[];8ÉUBz"ƬõÛ'ï)ýȳó+Ð-S‘D !"3¨ÊB®Je!qÎIæãÓ_W¸:G%…i&2û.j)„¨É~LkPŒfXNB@ öŠaAÔb¤Länœ¢iUІôŸ4“U3à ª LȪ`QsT#µ´Jj)ª´„uPuŠÉâŠÉA¬ÈP|ìþR|f°lÅ"­U €¢Xd(0+Ò¸×ú?~[·ò¦Ù,vwÎÞÝüqà{ü/gþ·§¹É©Ü+c_Š'MPÿ–^³9¸ìÁ<÷žŸíëöž~9Ònvn$ä7É¡¥4 ᢈúg™©ýd¬Ë …¶h =’5ÑxPYqXE’«ûª¾®ß´"UÁoÓÄ‹WŽÈsä“y/sç·Qãhó0@P¤dšÈ±æÚ0.lýüyéŒïyw©oÝv}€ºÈBfº¤•Q R¤èv†å”RPG1÷2…]t»󒇯 1í‰~ÄË"–Yó¤‡K©JR¡fተÇêÌdŽÅ#áeRÅ—@ð X¥­&J¦šNß±GE Ƹl#$-·Z#[êj·¡‰8£S⺎îÀÂÈ¡2î7ÃÁÆh›sîºOïïá½Ã¥Ëûmò‘h¢#cÇõ«jR‹KQšóv|ÞÒJ}Ýpâ‘©ÀìÞ{çäb)ò $¥+²a}háÈîôÃã¿ôK,þÅdJý\dŸktm^)“*Åi_ƒ$aBB‰Í &¢~†x²ÿ˜ ZQ]ßum}íùGCãØ©]F&…Ül!bG ŠÅ9%Xž }Æ?gñÆV/£~ÇÐãéL(êxsÇjŽá—þò_û¥Îç—ÆüK&çY’‚ŸÛŒÑk¶¸yvcË»,üôZþñ¬¾ÿëþ˦üÉI) I@#Ó“P Ev“YLNÙ  DaÄ«t°ê1NËhg­>v6¬ˆöliÌ„‡ Q†Gïky¯B ²lw´ã3£“îAu´<¢‡Âc™­¶Êüí•vŒËtìjÐCœ­Ê¯@D€&íÁy°sËóë4OYº-܃âLõ&2„ç¦îAWW- öíâg´¹:8—ÓdzJ_ûˉ?KǤ¼²£dzz3½o|Veч ÷<, (²(xa"£7ÖtZÒêN M¬z.8ìžF)j A·Çp—”–Ðú‚8ìdXK=[ŠCí`1zS;A±¥cÕQDùhnÉòâžÕ푾*øø¬Ü>­Ý-´¯ScÞ®š@3)áïvìϧÿª ¯ëØCÍsLx‰˜4puÎ'Q8è“ÈO5ñz­|ÛÉÌ"xÉyvxÀݪshäŸ~¶OÌO»'›lìu'aNÃ',2NÞ϶ iö8æ~Œ•;ÚZ^ró4ÁÛ>£äùNÝc·êt Fk݇ó1À|/ì;`Õ+"SÇºŽ¦ aé¾ëá51MkØüèæÆWv¥²àä¦óváY¶ ˆP5GW/Ì«¥OÝ$¹&FÙn†Z²eÂ|2ËpA§)0m Ï.‚®€¦¤ È35è~ñ€{tY€Æ³ßŒ|ƒ£†öÏÛ]œ¦÷Ë€'ðàl tm–E~ª’vÓèÝ®;zÁÖS·õO?4Âæ¢Î*:µŸ)þ^t×ø³’‰oo2E0úÁc%æðé’’*‡ÝþA,9Ñ1fCçF™KW @ZNÈß5pDy‰€IǘˆÚ¡Yô/ÓQšDQôråŽh³mëOž|fUè}+oñtœí~Ud¡ù1Š$¼Šœôߦ;ú–ÂÝÁã5¬ß‘ÆŸ„¯ ÇiB¾Ï€†ub¡AÈ hù‹”áJ "ˆÉš!äã>«Q†°SØç‚ê¾ôX3%MhkˆÍp-¾L¹èp·…,ªmáhÈxH鲸€DÂI0ˆ.!KµÜE.·†©tGá¨Ó#®b¿ †ò9ẋ]pDãÜàɱé®+ÐÅZÀ P’k¶ˆ€>ö")#6h <Oêu£ú¦7Š„¾fàÞ¾P°òíž,4…ê$H!„CÑ& ˆˆSɱdÜ9ÁõP5y—°ïàê\ÔJÑ :Ü]Ë,/éaÉ#jöäàNhbP÷÷~Ä3WƒÝ\6òÊËãÓFªAæm“¡ë»ç¯ ¤Ù®3·~±Þÿè:cÈJEEà0㈎ ÕÆ†k÷~ÿŸïW{ûÃ~î8篚:Gÿ ±B`Ü“S]$ò¢\mPVºZRÜ>Ýõ•_ç [ZC¼Ûlâcvš^qeŒLAr>zx³î'¤€;ËFBO±Á/`£7>¬qíb·Ï-Y4Sí„2@Ë ¤R i¥Ô¥i„¹ äFMØå³) £Ø©SA çMD~Z0}>N “*²õÞ} Û÷ùé–â…k=(Q®Šþi‘.#à|’6\D”ƒ*:‚³ S»ãt{!0UñèGçÒUƒú¶ŽÝð@÷©ix£«Êì58˜Î³±¯]v–z²ØœmcÐO€èÓ};½¦1&ÎvYŠ`Y10`Ûÿm2Aƒ@í²  @Ð#$€‡ILm£9¶.Ô˜ Ê` @ÒE(Z±"ÃþReuë9mo)÷ÓVb{)·Ý¬öÀ»™!ßhÅ{[¼¾?çr‚ýIìCmÿ?~2Ηã¹Êó8\4Ôå3sü#|~¢•Þ»ôˆä5sS$]hõÀ’Ø¥ÕwC^ßþãåÕÇ:Ùsí8ƒ_?*ðÙߌٿ;âo¤ÎÁ@*ϥЧ+M+ᢑíD ‹R® dg_Ó P°'Z€-À=Ñ|@µàÁF±ôüà>°œTª…¬ÂPö»o*ÝKùcðtßp‡ )¹Î5ŠÔ.õ2 n¨œ‘Üb‹’2o¤y¥‘—*+íÁ¡–‹Ë¿\SDC»ÍnÖ /†Ëõ¸íð˜tÒâ'Óm»ÑrØçÖDl9{ (¼ðÿ$ÿ/î¿úùjõ;®’ôâfí8R[€d #_dþä‹þõ‘ýç«uÚ’^d$ yíê‚BáÉœÐ7$‚˜‡ FfˆÈ¬*yÀE3j‰¦|bœk6 ÑPˆÜdö`PEzðæT ¦Ð1•@‚ˆ×e£ScÞ>h¡õaÞÈvq:m×w÷¬ù×›yWéà29¬”‘Õ™çcÑ—ºÆÖbò¡þu’%?«O™nf›†808q˜&ë =ÇSР˃KÓNÁT„¤ *ÚsRa¢œ^nQýtÈôf†‹JéqЀJ(¥,à³}‚X‚äBeû"a˨ t®š>á$œhZRh1ÍxÊq4ØÅîìw¸mê ‰½eœ7ømóO(A4z8dZʧÅu"zVp¬p5ËÉGï´F§ÎÔ´]†atWûýÄÙsúŸîm½oø® ß5Î&P»P™š$¬L¢©ƒaÚšÂà ­A=ÂÅjRSmXÃx¯:_D¹V¹¤U„»q‚ˆ#tãO×íûURC¢¶àïå~?ÈûZz_?îzÈã‘ûÅÍ €$Ô$h‘à®þ8­Xß²ŽÁ_,öºvV‡ëj5ïÃ#7û†û¹œ‰Ñ‰T‰F Ž€’B $Ú?¨.s~¾:‰’~<å¸Ê#C™&k J§™"Ï”cm7±Ðá¨òAtšiB|^Qûa¾Ñϲ#½GÒ,ë£lû=Ã8µ^µ-J…Åe£_2°IóÀ ¢D$_.ĶF—+*ð4ÝæÙ½²Ÿ3^Ôž·MC8µ<ëXeK%—,é”~Pꯖ¹¬¿×5YÍ4 ´4¡/*RáÒ‹Ø ßÄÿhðpHUŒêÆããoOY}ûX†„O̧Ôj5·ãS¡é æë±7ÞÒÚ†_>ô‡‹ªs‰˜¨Tó.3uˆ†„ÄÅ@º‘|Gu ÏŽ¤ ¦¸*$5ÞÏÀÉfyí·EM=b,ƒŒ ÆØ:è\n#u½ÌúHâk^8† b!‰”ørRœ‚@(q˜ ¡H9Šë×$03 K?¹>õ|¾…E6`ܪ3¨±Ú±ÏÜ1=”2f È-Ö3»öHtšÝ{ÏG9ÿ¦)Ô_¡-E wXT|©,ž1>ô 5Ò„d-ש†ÀæÌfH¯_/ö ÷'ˆ# þPÎS¦’zûߨf¾Ê|Aˆµ löÔ€z{ˆýÉiÆJQ#!Zz®£áþ5nÛínÆ>‡ž™çÄëSaÄêÃQy9S à㛪™±Hï’³¹-ëøØ/ü….EÁcúqÊ=©¨~¹Ç*] ´®E–kˆ$º¯2” ) ÅEýš>G4M ­Å"À£…¤—ÝíÅ\¢ÐImµ…aÏ=,]ð•ëÑ E·ÃjË×Ó_^ýh‰§‰(BùUöÝ„ðP,Ö‘AÓp Ãñô³‘|÷öÕß~eï×kî‚© 3VwجY—üEKÞÈH‚âD‚ñ ,R#½ZÞr(µ·8k¬ «„¢".ÌxüŒk§ïwV`%!¤±8* b,‰PƒÅ{Cx:¨¬uØà™úãb‰ŸÇ_XDv{çûäÖº{»ñ ¦5ÝNØF{î}d¢:Áµá¼þž÷ßý3ƒ—ÿ]›ð éHÀ%…w°€a* b È é8‰ÉHrëé‹§L˜aŸÅѦj aeQ–QÀ»"ÒÉÙ'¿j"”BÙÐ^÷¹v«x¿d"¡Å9É«ó…ð"¹R0JxÔbÙóîH&—¿t,7 ËÅj‹ù!VRhôŶ’43X'üÖ˜ÌÃïj7ßÙs$ºé: ~å†cY¾=ï7žù?¾ºágh;ÂF…2¦ŸÑœŠâ®è¶CMPppú˜ã¢`zìHÆO×r+dj‡Â ì)”Ø rÆÐý>Þéj¯-RÛ.ƒâÂ@;_B{©‹4Mp›aìÎ. =>_Y' SBùÓ1|^¹Uã1;ç/bèÍ|D7–xeåæŠêo÷ƒe_q–@/óvV¹‡=ŒV/r4 ûç‘ÂûûÿO9ÏoÌ?àÞˈ^9ò.’ÿæJ²¬·ÿ-z£O¸?X4åtÃÇ1 j^‹›‡”u9Ðô7”`7Ì26Ýd±kÀ–Ôª?õdôä}þRUlŸ@OÅÄ‚kÎ’¹·r!Ó­m¬ž^¯©Ä^?À Q‡ñhÒW¡µÓ¸ ‘ËÈe­ˆ@ú4û›uÞà^“Hd¨ëü¼^ö¨*Q?Y»"ôî ܾñ#ƒjxAÈ4bý>¥¥Ë8a” 9†"P]Y¨ j[$²>¿Ï½V}ž6TûšÝ«w÷—O— øu[û²¶öÔ^”¥ifN.^þ¦îÒ5RY{ÿš~>½²áƒ@8Û Üû„ù÷‚6­»údªmç†Pksp,uºÍHÞ#šb?€ÂU!DÙn›]_ÎÑè´H­2:=©:œT™&…¶B 4§á3sÝv~xwö$lËÝ¥«Z¡”ªjeè Z5Û%ôœŸ{í_Áw^¿ïí<$5ð›ÔuøZŸ«çOôäùÔ¬øÐZæ#¡á‹buIsÂß~Ÿ°Á¢±c€Û,܆RḬ́ÚïéÛÝIKTöùÅ¥–h†³æEN„›pEîŠ|.WÓb[‚!˜Ä - ºíN auV”½À­Ñ½wm}çÅ¡¯ûDŸ½v¿ mdvùA‹ rƒ‹ß„m¼)ª´Y4Lv‘5ªUºÓÌæD…3+î¾{9ùv-†íòÚræèÍëá—c€ªœŽl b‚™´„9 ÞíÐÇOâ­Wnçç^Ãëxãµ§Št-ûÀx2E=‰vîªLd‚0§ ƒø)t"¡Šâ9„ÇÇÅ÷gõ#bÚu¨|{<ű4Xg,ÂÖ²º©[Ýà *RÍZXËfæè cT+[¡~¢f$¹›dÑžU$;¾fšÇ¸]l[”L1Z1B©vg™_²ûãCƒk](ǺØŸÁuúS\{„ã ŸeàY‡k3pmĘláŒ%üt1Ý"ôA øÙè—pÑR—øh^IÜÇbùQÓMô>%ñ.Ò¤Œúþì§Ë;€>Ùü>ëôwº*ÑÍàTº¶uÀu~ÝÓkÆVDѪößçlô_`©( a€!ÁFC дЖe€ i›š_:þ““^X)ž©p¦Œìêh¡1¶8m÷M./5Še)F¬Q˜áXÆw«N€ÑNtÅOÙïži$ðÂÌ%˜táì4`ÿß> ”,"LÌð …Ð`É#@Â@< 0Ò#€îvYÎ÷Y]p4Í;¢vx. i„ÂÄ5× W,GìޮΧúwÇ\L}1ê(guÿõÃŒÄî›EÁÉó1¹é_kqw÷ yÄ‚WÚù>žÏͱY qíGQ?ñí^Ž7Ö{ú2 l|ʃOsÝYöz ðu«Æ|õN¯Åò™ß(=â¹[?ÇÕ—ÍëZV}zý”ü÷JàëªXS˜ò ÛŽ¨f~gz2eÅ0 ã¹ ‚w3b¿ µ¯‰Ýº (Uåv8­3ˆðîÖÙ ¹Í>‘šÖAÕR+ßÎ5Ävós^x:ràuGG¿hBï›Lù[“Ò6g@éQgÛùÆÑèy¾²‹ÒšjçNg‰r'«æpQéiÅ ØgЇócìhp4 ÁªäöWû1Ë^#ŒvÅÞU$bôëû©~ù0'8”ƒ?ø,Ð6 ÂåÏB´å˜øÍep äðh35»SÉvûl|Ë{ívÎÕðbã>éô ª4Xnü‚•ÈÁ¼¦ B›o«—ÙÅ83•-FmôEôˆµN¦þ‘«þcç‹ô &«ê|…<Äa㟳@¼Ì^A/`?h0öAšä\ð‰*E@¡sÁ_NŠ½Ú£ÚµH¸*ñ•ð!Ž";êOM'dFF¼@¬rö c[K=;‘ìȈÈðWÍñhûxÆ>eíô³>*ä1k!8‹aЦ·µ•ä7'æ@è`”ÇðT¶æ‘¹¨x¡'2K H$@4*aœ*U M°8Ä((æ1f60ŽÀÐàÈ9_¬•ðy]æ`¦ñÂ32]S2C ·SG –P(¡yÉæMÕ"ñ(k®™DT9å´"\Á*"¤L£Î‹÷ú¤ŸK¯}­Y>ËŒuåçë—æ-z}iÇuëQã&2íDa"Ó^ð¸Ë€Xõ—¾.íz5ʽ’kXixù¡ÖLêÕëïûòñ‰¹{kˆñ«Ì0º¦’\jjÌÏs÷í®“iòB•Êƶ ¢Z§µr±,W© >uƒŸkšK]¡SATÇÈÞÀ=Á¦Éåý°¡út QY_ôûä‘D3b¥üTNjÜQ³.¢Ê¤ÒD!ÉAÆf¢ÎÝD ƒPtU,_üÐs­Ä‡JHlÔ@;©¯tŸÑV´žˆ4õ¾[ÓQµQ«‰×9g¬#pš-§{âNቷª|­½;[ o•Ébº‡±æ<§«>VÍGk{ðÛ}ñ®‹j¢Ë>÷q½Ó>̳Í‹¯çk¿¨u¦‚0’t­¢Â°BÒH\v7ÇGùíð¾ƒýZßû¯œ½LT_¬çÕLëÈ: Y ÝX–L"·²»NR¾¾• )бC¡rWËP´Pµ‰Cdáq+äý dhŸk¿:‹QÅ&hãn` ,Fw´'ŒPp6Ü,/»>íÚõÊÓURØÃ¡ æ`^ ׸ ‚U@p•%¢I ý«¸’ôÁ+Pˆök•œt U9Xœ3 _™Ø‘;Ã!$""#ˆ!µ —;?æãéFô>™u‘Ž :3²Úî}óY;›d¦ôR?žï‰Bq1hAP1as—ùF¼ÀO­úœräí=¹¾?fRš'“öÌnö.¿ooy¾Ýþm~›.áÅD‡VQ#\öj WëŽÃ2×Ïgîg•…én=›”Ô}( ¼d*T@r”®7­!Ý„Ëä/ô<Œ'Ca¼%—Ùnc"Bº…<^DM}%Cán JIt©9NóÁ,ÚA—" sVi¬‡îqaimP®´HCdä@™Ë l§£áÀbXh*82ÐGÀظpÕ¥+²r…¸2'oÎý¶÷4Ê3œ3®`KF4Ÿâý¥üÎò³>,£®fû¢5D„)aËêÒÏaü #nþÛnþ©•?Jýy° ©0Ã}[p+Ä3“.ïgõï·SúÓÙß\¿YþÜÃúñ/kgNn£“IäBõXUBcpišZ ™Œ’VJË¢%åNUÒöÓ½ÙŒ(¥Ž8@d1`@…*ŠÊîæ*ñûÚí´ó¾×Ø=]ÅbTdl¯:Š1iÀ^Ñ)R¦@ÇqŒm Õ”°Ï(ì¿ÍÏwyv9ƒ×t8êsú‹ß®ÿ«­7‰¯È½&ôð“¿f‘¼žó6·Q•k/T²¾I÷ùÎYÓ““{µ/Š7n»w¹â¾ä!º,w‘+°<¼Z-ª´zï*Ù1Ç®«WJ'×ã$êäùbö5~ýúí *õýÄogç;ÆTÎxhoeF—\KzxÝ•Y«’+¨A,*[Äûìøå”3!fÆ®›;n9ðqu–ì v¶žyúdÝrñj}r‚ À›!Š@Œmq Æ|,#I"$ùYшjÝytF]òõ²)§ð63¡I¸¿$ùë½ócôK™m‰*¯D%PÑ ¹NzOm÷É0š®-7î‚1P쌒$í§Ç¶)“ÉýŠ_ê~]þç¤Gò¨`¦'™Ú^.µù^Æ+!€),‘€_±üÊ¡MÞ²´ÞÎff׃GE®‹†zÂt€‘–3gšŽ!5ÈlÞ~cÊÊÄÓþøìo‰Øü¸AÏñÃë9¼-¤òÂâ5¤E‚b…TˆþqìüýGøF*Û>~WÊÍiûhÎò¥ S^žM÷bþjÐ÷i.Wê«v|½4hïÞk0C‰¬õ&êdžŽgsÈ›3·¹ÿ•¿y{LßýÕèü ùÄO*SòjÀÊ‹ÊÔÎ E£EÅeU#f m€CC`@Š´’éacÍR¦·¹^Ó”ºrp‚ˉH¢'y 6g:{›K“Ç$ì (|.ù ño†ÿïÆŒ¼ »÷}˹: ˜‚[»óm{ö xê¾ú°ÛP‰h¹Yºê$-|ôІÛ9'PˆXI"Mªnmh[S9O½ëÑY„þptÕ¡™õôXÈ(e<É`>0*Ät†+)SÕlñ‘NRÃÄ„$À¢õPoYã;Gu_¿¾µ´2zªn»ôzB²i< ñg ¥Ò€g¨ ùÃ-±ÄYÎ2‰€ ‰œ4¸ Àæ:ÍÃ:â5Õ‚:$iæ=œÎ/¾îô5ÐëÖ½WëskúÉþ8ü©¶¯@ƒ„67Ézªû+`¥”ûVnõ“wå›êßœx<œÎ¢‡ðÿžàdë~3(O¤ÝúüÌ~ËѲ}ºg¸2¬¸÷ßßò|lšþº«½+ÞZX’+.20[Á ÓQ³Çǧˆù*úª@¸ôÒÇPµƒi€á- ØQgJoæ³U¯£ÔPß^At:‡Ëú½'À1G”×M~nò3Ì ¿Á3 iç¥^,fHmjEðÕüÄÝmÑjÓíÖn6ÝÌQdÈmú(”´ e»·].n…yŸÁD·fÏp(ŽÙÕÎY»ÑkÔ j5§õgØÓ‹¶;àjh—p¶Ö!*\êÐ ÜôÞ€y¹lU.«æþ|:¿œü'Œ¿|·­ç·~»~%Uq¨øâ[¬ÞÛ¬±êømÜpÓ¦wµ u†ª^xâDñHQ£=ìõä'Ï À`Xv&Ö'JrÞp•Îö¦I­ÖÍE|¬þÎÑ»%â‡_t±îïm:ºðxbþªŽnÍãF°™~<½ôÓTèN<®£2Ä‘«üLÆc ~¶?¾[qm†ö­[ƒcqvcD>þ"…/¿ðOÆlv\@?…ùi ït«ôÕN°¿K5ÈnW2/P­"xû-S(¾š¹¤ççÎØÑ¤2tu‰Á9Cxaé±¢<¯qz „ÂHzÑF×Õêy*Se"Ã}_ßí ÏÃ]òMÕÕ*ø=¡) [¢k ë!a»0©Ý@b !CŠàVé¯ú×GÜîÜúØ=k<ãæfáÁvý”ôvnæ0~ènw}æ7ÏEv0tY‚)"p“ï5KŠìĦL ’‚ýÁ劒éËÒhódZG~kŽc{?B‰™ÞSÓð"]`mê¶y+]Ê»€<ÕËwmúêÕÆ(}Ì ¶cóÁÒƒ8XþÔRX(Pé®.:cT+úX´úêø+åá&n»S{ëK{Üy²Æ$-PIз^LLŒ"\ǘ6áÖLž0h4e,’…Ð÷à`õE–A—Ô4×AGÒ¤e{ùxY³jë-}ÂqUæÕ0úôý»¿†Ô6‘¿Ÿ¿üÖøšë;ÜøëoW&ŠÖíüÍ/úÑßþfôz~ôPd~JܯÙµÂûï²)r-:óY½Æßü-åÏwU_l|ÚçßdLJ)䊊–f]T/c%0ðçÔ…]òkóËmjžuß<Ïâ`5-}[;ÍIu°­ ²³è½;ß—æþÙ{µ9å7æ]ˆaäv}Þ×ç÷6wlN²¥1˜S…S&v‹V˜†ERà_ú#çðŒó×ÂþÝOrû®ìœÏ­ ,Ef&«}ö'´¹û˜2å"ì¸B€§‚J p/¯‹sã¼\§#ÃÂ\'x”,"›„J)8€£øO”>Cæpãþ|ˆ[çŠQ‚ü~¶”önGË^Zûçæ¶yèu=:ß=Æ>E+ý*¿ÛóÇý|=wDT_±xvk‹'ìýy²Fø2ÑJžíÑøˆÎ’½ÔvTò4 [cÏÏ{ñãu€·°¤Ðß3cÛ02J|˜ÞbO«¾udó¼~Ûã城ßV´φyu°6u¢°7ú§ž×l¯©m{UO”(åZOçæô‘ÜÇQTd·ïÐ倕Á°•÷]ïô@î –û>™™Æß®¾á©Ù-£|ÕqØ´-0DYÜhªÒš²ìhÿ25ߟº–½QîQe—³p"õ”êv´/è5úöN÷Í¢>•0ÝÇ—‡ýª¬.ä^TúY-ã­á9Öu•±B8´óóÈöfk¡…C>í\„‰+yå"ý$Nûðv¾´òrú»¸ú½‡k.by·Ï±ÀÃΡ™§Rlu“Ó¶Ž#¹/›"˜¡cÏë±å×Âj¥æw̉àŸ4ñWïñ£Av”ÖPåR¥òÀ ¡äo B3ŽÄ cý;â÷X×ÏÐᔵ•z±hÀŽj·Æ9B9äëCñfFÁ‰T!%jáSa%í%+ÙJƒ‡u¿mã–‰úð2lŒ–ã0é" )Ö#–bEf^5¯sUç¨:Dr¢%Yù™‘žo¬\ûBìÔã…†,;ÃTœiZŽ¿8!¥y¹aÐ/3_4—RÓú¹rCœˆ]ø£{»nLñie2X-¦“ÕÑ(¬/ðG‚j”m6 ØõCÙÖ¸Oñˆ®-€9º9§ÀŸs¾Œ‚Ÿšš+÷£yóWà‰Ð\ï™ ¢PŠMXDSýªOš½§ð®RN‹ (Ó¡ÍDPL;)uÇûì>øŽ>êé÷ÿéµë†ÐZ=©¢Þù’F‰¸ ½Š»šYl¤®ú°©Á…l!W´%`.Ö7W×´|o¬­6³GØŠ´!Î[±¸zý³(J%8BG×íà@³ÉLäzy]nèp"œÉ“µò:B %c.^Èh0‰"×F^®Žd0LŠD«{4(eÚZšð™éšM¯ûq}3žâÙuÌGYõéÚ:ÓìbYjce a^}T÷l7Í“ª5Ñ…|Ú¬A(GËæâyuTc PI¸ïû©e0i?1t¯é:^áZþlk^稟=uöhs¨À|¶¥ôèT T”åh{Ö·<\šzÉüœgö{û~IxÆg4ú­{B®eãÈ€]ܺ%m—p$Gþî›ÇÍ?ýh7n}¶^®êöe;Oé MCÃÕ%b#B‡{ï¹Û×»«ëZ§¨ô9_”ö(œáµ*I°©‘OV[RÞ6‡œ ÅU¤¬ÇWîƒ7vQUšÁ"B?õ/}Þß±É:œ%ifÎr7^gÂ¶Û €­±"S†3$ŸäZH_%Ï<™â¬pÃdõÊ/Î% ˜Q†Ä@"„°Ä[€”m\.M[A QãV÷o3{> nbq¢ôß7øFxh€ZÌè!€A…䃄 © ßëõlÇž×bVL»[>k§0¤¼ôù_½ÓW·?ÞýÃížSuS 4‰Œ8Ú"“ÈMf… ŽÔ{ÞÕ¹ìé¿ï\óÌΦrý×hŸ<~¿ý=ïîO?7Ì¢5¸¹| ¸Cšçãñas+ õ=]#´¹áÍÚ8 `*-›^Gx^]kw² ŠùJ¯$˨ƶ`œ™Ÿ^Tó‹_=nˆ¡hÅÃ#dõCßW‰Ã`ƒ¥ÒÐ~¯äõ}íuKЉ˜0²gwXÃjŒfUÕ´+Ÿ™Æ<êËôJ€Éß ±‰â4le(·ÄD(™ª&#ÉÀ )¬îÛ']‡ë¹Ë´˜¹9:“f¦ÎÑ‹Y9*Fˆ5š¸ÁˆÑ;"ä?é –FÑ^YÒÉôP lÍð]Q¿gê°aÌzßÑб§7ÕLXPiš4 ªr„° Ð@4IG„xwµÖ™8fR ÑVW8³¸[εL™n[Ru¨ñÁ?ýÛÛû_Ëñ­®ÿBÊŸŒAÉŒSÖ©º%“0Ém·Ë(‘†fàêbŒºwRÿ3¡[DÒâ™üŸiÎ*ìltHNÏdlC«8èçÉ´'é~¼÷^è½ÿö þìOøSªõw“;ùøÒS\T"4¥ %( , TöF*ØB£Bƒ8»‘"2-Q¢Ž pÉg@Å$`®¿}jùÑÁ¬ãÝ÷ÿeHÔ±+tÇ+3ÄR ŠšÉ•‚H!ßë&×V¼KЛF øÙoÑ ø}øÙcÚÉþ¯þÜüüó/Y.õ,"Þè:[šœ÷óv£t鈨ô]]˜As°·¢ñ¢\'ƒ5pßêe¨ïzÐH2UX\–¶†ÈC½ZŠ)ùj.hßd#ò»Õ&žb ¤Ç³=Õ©+µ_¬‰Ý?£«b&=œ“´&5¯b¯}a—úušù‚„áL<õáSšq<˾׊ѕ¹ÑûÔusƒ[BF Ù#¾æŽ•N”+¹bGÌk¤c¹cÔdÇ÷7œP01Dú#»mþ ýj©U·á)T¼c'ä’•ª¼ uù&c|nÃĆ֪¦U³š<–ÜÃý” ±Rš¬4 "+!‘-¤&ö"77«ã©‘¬:Ô §ÌAExNëŒtC@gÚ™‘©€`„¡˜Ó¥qSJvX*54ßWå+‚Ñ+ík»±YLNz(_#BKØùüõARÎrÓÉè]­ìK-0‘x¿‘«¿ÿü¶’¿úéP/ýv#‘º¤høëôÐ?ÞhóT”ÔÓuÓ­Îk}Æ#aŒûóê³~t{>x7^¾Ç™à)s’Zd—£J¯Gku†·`ºà Š¢„”…`9¤‰’žØÚô*§‹¤d*G(VBr\kŒÊ]MsãpŽ>Üçæ°æ5g,†IÌï"êâfIoè?ÈÂãíS”›Î¢5´ ì‰YmÑìQ¼céfØt¤2òt„‹4<ŽŽ•gõ7ë3^…¤ñcºÿùLxþaó;»ÿóäsÝ[h«Ja_êF'.gJ“ŸÛƒ5m3Z>ï@e7¤Îá' *½ÚI4«ÜdŒðþ˦KÙ—œF;€¾?OÚÑú‹_ ª€c¾ýT:•q æGö¹7ûLciˆØÀȬ—¹ºV|ZºA{-°ä‰L¤ù(ʶöÕìô˜ïwö“‹&»Ó°•î¬Þ¡áÖ˜{oj§™B>ËÑ&Þ–éÑl¯˜…A…83˰à©]Cjø)g/¸`oì“bA‘œ ìÍ`vŠa'B4¡;^W;>¯L~JÞøN7×穹 ±gPHTÀ3æÃ­½YKi›îzêBËãú¢©­Ÿ¡/Ûh[Q'¾E‡æœæ]H/º_{ÊO³Lˆkxmj'¯3/å}¨}n B‚{m†eÛ(cd³tõáF=€vš.Ø7¨Ú{4¿m¾r !b€äãé‡ßö9BŠNñCëúÞ>oSU!<áAô7TDؽ#:ùŇ;Ü“l™çFmXP1 :ˆdÚÆS­êÛª\wùTϦN8¿6‹œýÇùlÏÀW—o½èÓ Ç·!‰“ïôŸâ“…H" ï;TØd¨é±.À÷’÷YËr!¿vâ¶T½ÈíA“/ ¶:jˆ›Ÿ!º+C2I@ $`h«CTk–vVUUŸ ޳;kýnl™ òBa_¥k“+ÊÈáªl)Í3+Ëžà·Õ§Ð™¡…áÖ·#Rj|¿TVrÈ@\þà• ü꫹ß1°wÚÌG~W‘¿žñ·Ø*Ñ@"rÈ“ÕqÄeaŠ5^’Ž1nfc“ÔÂÞÆ`n׉VÝ­uÓ]OÉÎ{ rY4ììØG‡º\çm91Û3þ=¸ ª—µÞ4¥{§,Sʱ÷‰çS[•R…äý{ûVƒ'(€† *@2L T{:r<Ì÷_;Û»þV_Ü|,xÎŒÄ/r‰Õ¤8µò–{çžù~ÉÃÔ±'MI "JІJ!X‘ Âk>uEÐ#9[Ù»²u÷F ¦ƒ_ñDâm^-‘ÀTP¦ -WW$`„™&©†ÙMÒ:1†”ˆdŒf Sœt­GX´ûò·»i޵Op¶2}îwþù¿÷ƒom¬,\ƦîˆÔß\Y›Ö¨ÝQĬ)~$ô-][›Û¥ŠKíb¢¯˜)ÂFQV¥™q’2I@”\sÝæ™c(xXP䳉Üñ¶µ×Æ:T,MöO¶ ýîËÑ©OÝÓž°²Ã;_^´‘‹…èý;í¯wm¿ÿâÿÃüî‹ë¹q»óþæèx?ÿS»Z ×½!Á¹á—SúZX/®ËÉGM¬AôUýäâ!/86¼Õ´WâÍXR¾­µ1ñÆvüÐ9ën†&½[«/3 ÔôCÙ¯qT>e&K;x˜ÉÍW_.ªVü2ÖÀ›ˆûn“RýŠws`ûö¶Mö‰ ¶œ=cÊæÂ™«ŸŸ”XÀKCä©ëÈv}|Î9,LÜžj 3× qñ@é4ÆÿëhÒ“ûIƒ¯ð:{„@Þqjô<Ì&ea¡ÂsYN~Ø6 t©èGâánÆ|˜"ÅSÈK4ya%!¤ß²Ñzí?w‰çؽm‘PëIá÷–Ý–ø„|ls`p¾…XŒŸ7bhùRmôm¤c_Xßù»{Û¶#a ÂöWLZB¤Ý‘¶±¤„–¸î–hÕ¸îïžÛßu X›®æ›©åD%jœ¬¾ñ~ZCz¾3¾07¯æq¥4_n¡Á£âæ©Z×¾ 'UBx÷R2“tY;„iK/BUµh«ógq*;t7%zªfû¼Cj>qA—ðÞ8e„ê8Ê`ÅÔz´ÀŠv¸ºBžµÕ:1¸ù¤§D hiG‘9Ü| óɾâûßü|u«•×9rµq­n:»µ lÁUØ,¡)ÉiÈš+ÚÑÀ<Ë™P¬sèÓÝ«µ|3‹ãÞ§RMÃjƒ¢| -íã&+ZåÀ2ñÆæÆ‚Ê.s©¼Ìê †È‘e‡Ç(!XÚÁFíz¢ƒIòKTÿùÞ­!¢zPlðõq~áo¿oôèÐTé(¹ëÛÙGIBš.¨i$– €„¼TjH@‡q=ìÈ<·˜¹êó[ù°îk‚Æ%G®õ™|f4œ˜±  jáÈüL±ªW’_’ÆÌLJ`§ËUÁ°‹¸­Ò€Ú¼´X­0Aù>ʱû•ÖÀ±ÚFfž 5n¯o7Ä{.¬WÕ…ƒ™H­ÂRþë¾Q\½êË…ÒËm<±Å7®•™ÚTƒÔôöÜtâ39%^éAxG*×Â#è"Š^·b|X¥}álÚŸ¸Û40FÉ­õóÙщ× êïU¾Ï:ÿ8+NàçŠY%¤+ !øÌvnÖ ¨ž"¡ @„È‚9K¦Jeâçøüël}ìòGÁý7o|þØgºWÆ×ÕÚŸÏ Å<ß<µfçv®¤æêxþ õÕûàT¦+¨Ð!Œ+YÑ9˜.w.ÔÖ«½0DάõŸîý®ú(ÙóìóÕ]ýÉTûfB•R—À–Wa)»r/݆(J=´fX2 •p\%!1Õ•R‰gÕÅsÝnÊN9©8‚¢Fá…ÞFþnóµ/ÿAŸîº¬ºž¾Ó½‚ÿÅâÑRÊä•®§?·ÜsW&qA eM¿ÔÔžnühë¢\¼†í«ÇædéEÕåTR,Ô-¤TY¦Å=¯Àbö܃ӑŸÑEÖµgíÜÚD —ÏYQñPCÄLRÃ)LΕÇ,NuVÛ<™­ÐXEã¸"’L¶aÀŒøÒÍç­ßÍýýk¥ÛÿåÞÛE> \“¥KªìÊ©.21S€ÏãXÁ=¿y~ï×ú퇺t]M_Ë£)‚v§y8%y Ñå­™¦ šÇ!eà.GI±Œ#Ñ`!àS/—Öâ¬ÊU½7bÒ°=<µeå1&·É,%Š(­Àj©‚§ÒdÃúÙùÕ¯»Ý•°¯ƒ#† äWz¥ ‘,ÑœÇÑp°U(‰²”e·–‘Õ a•m H‚¬ç±,?6wèiôÙ*ŠÉ>öè.ht‚ %™xÍÊ4€´bKդ΂¹+Ö~¨½òæ[ÌZ9WvgÏݟǾ˜;2ÇÏ6š (¤D­ÁWSÕ&óý¿Â˜È ëæý¾wÈx[ù¨¶dЭ¹3ürT~iÏk>üò-â7ˆXJóBöæýþÍû¾Ïss2}·»vZ¨™‚;¢ƒÑ'æÊÚÄDpˆV.Ðâ`‡Ç ñtªíyT™­* ÇTA É€1Y~Æ€šâwe/¹D,’€“ôH>8ZÁÙÊ P·ODó¦Üñ)kkÙD?/Ø*Õq¤ô©±™D°xb V÷"F±:Ó°(d°AQ+nÝCx¥ä5GMņ0pÚÉ•À ™j ¨ FS êqiô “ÁŠ¡g¼9mæ_*Gë_¤#y~³„cöׯ xÑùå ðbWMqë9Q'_õT*¸Öt£&ŽÀbSrw_t³›§å¤vãiõ2Å”Á…Í KuÙ@âþ›sžì‡èÖìÒqè¶ DR<"­‘½®¾Í@(bðÒ¤k|«s¥5‘?"\xSÕøÅ‚å½\ªwÌ=™;ÄÔ‹â)ºÐ«d˜óÅöôzý,¿m}ò[y÷ù09/ÔÙ%ê(De H0ÄK†‚ Ä„±‹í–™\5jª–÷£¹«ß¤}+ì€YL”[LDDž‰Ïy+ü­ÝŸFþ½Ë¿õ´`Ó2°±aHHÈCitȚͽ_²$ç}~2ô(åHÿü7ZƒývæÒã¯á”øòí ¾;šÿªÛ2ë“ïÓ§ênoÇ{ðt˜CKwÌK÷mÿ×Ǭ·A®êE\Öê¨_pCj%ˆO­RUE/,lÀà!>©&5-i÷"\Ïq;Õãl~ûDWæ–Ù()ÌLR‘쾆×6.²s‡÷á=þ¹¨ÿé¿C‡\Óª<ÔÅþ››úÒ¿úØwRV™ž,©ç,Ç!9ðxƪµA}·¯|¦Õw¾»GþtÑ|‚ÿ%Å7ª+Þª6ä:ÎYqª<î;kFœæò£ï~úímø'4‹hxmR}÷3f’5kᡪ;ÁôÔ˜šˆÛù ’¤–ŽE‚@ìè¼âµÝKí{n¼_YÿV±¢“®d¹áª°-k±…Ú!S¹¡ûŒBF‹´ É•:Ê1bBwšŽLI¢QŒ¨ ‘X†ÀzNs‚ ­}ƒz¬ûŽr,œÂ å¾Áæ²;Å1NÔœ˜Š J‚¨¹95ßGn÷¨HðA¿¼Õî/ÃÐ$¾œz™@\ÂÔläìÚ³Øù1øœüGîovEÉš0%¼õpº©;õÒîñíš×o'IýDwsá×sIÉ¥j5¨ÜDYë”È™¦ØÇõß¾ü®wî´NrŽü®ôéAŠ–’jìC mÀ1ˆÚ)Ô`e5I@¦VÎ÷zqñ~íW_| *ºXù5¼Çì&±ÙF °Îõþ™ãC‡ª¨ƒÅq®è¿ö¾oêó6~r™`­í–£ 6K¹¬kjó ï±DÙÂý·O\ÞÞÎ7à3í:š3J¨VHl@¥Gnƒ²ªíNþºóþã?ÜßÀ?‘6H ±e»Õbái¹aªÖ;Ú{6ÀÁǘJŽjCÒ qÍÛ¹tRæ5=~ÙV­9sðøröÃ=âÑk¶q+Ƈ£oãÇ2:•›ê¨]¤\z¸gÎz§çÙ9ä 1}‚¥®éCÅS«Mê.½½Å@\&£À§|¨áÞj~`ä¹Àöú¦i¼5öïÝ5Ï—ÚU öIm}‚D3gìU”ü“îêú”ƽEÐ Ÿ ·óÜIíZHÒÎ'I–µÖ%V,Riùs€Áýg2ØÁêæ%Å;&tóøRÜk3ï¯1{g·,ûÖÃnlãèø5:(Ì2ñ^‹˜‰á¬Ì4¶ZÞ‡»2@ v«©|Mêh ¬|îîeowï÷ÃA˜e³‹˜áº7T÷™5á ((TlŠ_ÝbÖdd–m ¿Ž‚áú ±Àký!¿©ºŸÆ:÷¥”Z¼Äþž~dUšœÍ"üìfL‚Ó1`7æ‡=´mïï*ù·Vyh@­‡!³ÏKâ ÐoOu»Ñ~nüPÆø‹—*iE,K­TÚ~X¾ºõUÇää¥íM»ox–»-ÿŽÔªõú£«ûñÙ϶nœÉ锓º½üêZÊøzÄ›õûóøW>ö„[d!I (e€VÐ4g8 ½ÿþøyÙ"ñ¹þÚìG á'E¯é«²€Èèb›ô¦Æ·q2 øØvÇ1†Ôú©]¢U¾†+ãOGÂÕ6Ô­æeŠ _£ý×ן)·" zo‡ép¹@¹–Œ6z)†,Òæ »‚I÷¹ú¸dãù¬-Jƒ¼oÉvN„â• 8, Û Ì‚‹/i‹R“*¨j4^!Ó•1‰·:q9iSEÒ|Å îZƒâÃ?šL>X€Ùkö/•xÆÞY¥ÔCLÞ €ŒÚâ']_›Û¥Wò¯â²|ׂ<©ÓÂuôæp/%Å«—¿Ÿ¾kñþYÙq˜4Eˆ(d)S¶)ÀFR­Æ¾Ù ¹jkílõœbíåmKIÛý±´<JRxJóÉÄC³élÈòƒQ[‚†ÀÙx—m$Íé΃ܚ¤_mwƒò\ªÙýÈSf‘ ÃﳞJGöÄÝõWtfL?¶ï–»§[:"ßðüÒ­/ ‚ Tc¬‰ÜÀkußïbM´U.BòQmzO¼AÈH4k715ç"ÕÖ%!&öúx~x·ãåi\?òx ‰7wEnž8»`?Ïçf~’£™e…í÷·õwo ncwvû÷ûôºªÛ.}‰PZh6÷~Ýßëü aûä¶]úþÅ_ó¡ÕlÏX$*Ö»$& ÎcÒAÛ•kôÍûé'[¦¼û®þ¤Ë÷t«ä[b|OãŒ×ž@ú\=”Þ]hE½€#ÅõÉÔ¹­iªæ®DÍlKÛƒ¹X;öL—ŠŸ.Œ à“¡žDŒ¦üô½`è…OŸõùù¬·OÞˆäPóž[“ÀÅìùÓý ±_™=¡øÓ?ÞÝG OýýÇaŠb×ÑZ¹¶…’±ní?¾?FçÆWFk¼öЖÁgÿêý¶ÉŸûâzÇ—K×7,޵¼\?¿¡w}hë[q •Hçoã*mrrhûÉòÓ€‰•¸ì¡"ã^â×h¬Zd.Ü©§…YÎo?¯³×(Žr,mb&BFõfûMØ® MŸ%1 ½ž¥ñcÙ×.¿ðvÌ÷Ó˜À)ÌëGíªÑœ¡›–ÆùtÁab9®tfÿò-þߣ¡HKóÏ:û¦}IFF#Ç”•ñ¯LY& :Òku 2LÿÀôÉYµ2‚}0ðÚªOךaÛ†pH°…ÒD–𛝓(cÝWà‰̰܋©$|©¹e4J¨:Nã”åS½ìøXÕÆ\­ËÏ?{`·¨ÀÀ©šAGZ”š`<aw¤W™MqʳPëöf9g`xKÊ|«_;s¼ŠZ‹(!‹Z[³Ýˆ†Æz߯ šý¦Ð#ØDƒ¤5 v.Ö g~RózïoãúÒK{9›·ÙäP CJI…`=êW/ýYå 6@°i …h$4·¤%-ÈY_ŽÆõøp¾ZMˆÓ£?h.-ø–òŽ Å%o±Qvf7ÌeѤcî\ƒh¡òÄ&,µ¨WØæ÷ôX­ÑQÚÔjÈUáI°a¬Û×K1u-D³m@Á^Óú’ÑZB3†2v®\ w}iCjc€0z;èïÖ[´Fëú´`Ø{àÀ7©ˆ£…RYžÙ”*XåãÏ §…ûFWQ‚(‚4!ÉÀM­wr`±ªzJöYš&ÖûI @BÈe‹E±ßœš™¯V­F‡h7Â2(ÈÙÌ’?·T·Ksœ±xq?˜*>Ì$.:ŠÛáÏb¿ü…øimÿ&mÓÕ- Üé›5…ٟɯxNëÛ å½è8sÇ9,Ñ0µ•Jši,A:ñ[ôhîK0( ±Cž)—Ÿv¶L³6úóó=ìs&þRÝ~mfÏÄÒÇD®<¶“• q¡D7•’:M >j¢Hr@¢ãDudÇ9h¹rr÷ÚÍðzj¦ecgäøºÅ'Ë<þßœ±fW[‹GŽ›„5ÿúÄšqPÉÍPS×Ræ¯7k×_||ZJ¨ìÝImîÝd©ÞQº‚w˜:D`¡ TŠU o$ „ç:Lèz(Ÿ®"ÍR)€Ð R##‰Ãa‰B’`"‚L@OÄB$´D, @*©¡p28ºœ‡-ìœ+µ¿ÌûwÝûÕ¬‚¯µüøÞÑÊbUxTš3u%Ú«—âEýsféýv«|äBFG`í¿1!Ѐ§Ï {„'È#bÉ /z:kR¡³§…§—Ͻ Jdüã¢<›ùŽß÷O8`žƒ›“æ@ ‡™ë wFÙiÜ[ Kò¡¨Í¢]éÁA§&cU¹Þ§fÊnÖœjß Öf T ßþKýæúÿ;Ö³¬;¥ai\-y ¯#bU††ÆÀ,4¬(ô¸ä°çmlæWƒý#( bµÿyXkÐT»’ŸGˆc…s÷˜eµ=zèï7o½–|…Ìõu—±£Gˆ¢&u#…ņd@ª±‘FØ ÆÔ²í[^Ɉ=¶'㻢x DõDÝ7©ïn+¥·Ú_òyçß\ô÷Îþ•Ï`þÞ,È¡9•D£Ø03û$ÜSÊαbì‘ËÖçŠÃú¯#=ÓÒg/ðÝy¢kþvõýãî†Å é3‡ýgÆæzîGÓÔŒ˜÷¼ßÕi;·òœùþ·j‰¯å?EébøÎœ âª~X9°E©*d$Õ/=1?¢@×~ö#¼Å³ó;gËúgþ£l;/)«¦ ¤†ÊE“ks¼ûåO~,¼I$‚Éß!ú;‚­têü‹_¹øõóP°Ps-äkÍÓi]MÊf=ÓÜéZ–  íÖ][žßçO/ðÙïÍ+ýò"{ôwÿm/ÑáÈ8.íÏ[@wä…Ø ÷sýõç§û??»WÜfÑ¥5v-ù,Núh¬,Z;æ¥7þEný‹;™Ñ%CÄa1Á†$,ˆ}*Åò@_Œ¢Ùù¥úã¹g¯¾åD„d¡ç„Á#·áŠ‚Z×’ÇRÙ#µ˜0¬µ­ƒ¬&+è'O¡Új!ŒÀ`r¹ÅgÌ;œ››ì‹)»ù‰£¼û_ßSR'¤÷8¡Ã¼A‘ÂÄ®hרñÕ”%G*ÕòÚ“žÇû ùÙ+ƒBtü[Ç&˜ÄX;ïÇÔ‡4_ º¦ñx$WåzûÈôf“Ég*·øLÕD…ÝhÅÌÑÔöU;«ö§üRv;©n@šnQÒmâ6*Øb“j—âŸM\"ê³Ýãéîî‡`ùsí9ÒVœGý{!*û‚kJW­ÕîæÃœ†ÒÝÕ.¡¢@§¥ÀBË¥Þw.ÇåÕ™ŒÞ¾3hÄËR½Ïe‘S²ô—æ§_Á·‘P `Чxû·qý”Õ×~òü·üLåwè†Anî/›`è°V_FQÿå3?G¢rcs«¾ËLo¬-Ï_Ž—Ü^†šâíÇY£ÍI (Kfè« >€–`P(4²!Á…lÈ¥Ì,õèôßç—üï‚›¨C>úÝÀêñö·ì¡6"øþ‹ð²½~KM£‰pm¸ýñ›ÅÆã9Ǫ¶ðÜDuDØB(æ wm`Éû'5ʬcÖ£g/œéé§ C®rÙ­_¬÷Wuabý’Ùß‹÷o”rûwF­$½P)Ë×ëL=ò]Ñêa¹ã:ž0äëÖûá¦s¯æ¡ðŠRãLÆÇ*Õ÷‹¿žÓÓÇ…%ðÐ-ë:ë§-?lºŽ Š`~VHÈ‹}òy e0Ñrì.Ïh‘¸ÅF5ò`Îð´rÜ»õÐ×uyìõsác«ýq«ù7C—%y."æ«sÜÙ¬p…ܽŸëò7«}ÚJ›ˆ†„“¸àÔZP/_÷2ŸõD ã1Ë/ñµÖbû{óÛt?xü캀sÀSÒ¶rÕ½3,‘Eµ äœéäËùñ/v*Æõæö­‹+çèó\˜N‹zÙ.Ø[+\í¦Š$á…ˆàª#¢w¡yÚIµ ׅ׺¾·ü¸é¿µí7ÓPñÇ£Þû“Ðõèf9’¹{gX{˜pXŒix¥U`…àeVŸ"ÜÞãH™¦º Qh¶å­!úoÒˆÎ×fWÊ!³ÂŒï±íO³šN 8U±ÛøÍpWÖn¯wj FŽÉ á”Bvæ«n=²ñøžê2kîjõXÄ2q[ ž²_rÄöÚv¿ÛûXœ‘ˆQZ¸f{Þûr»¯•o5†.ëïÊ?¾ÀɆØ]ÀÆ·_ëÆÑÿþñصùšú¹QE’&@¡À’X/EMÂPäû&²!è¨a8Û ™,_¾¡>FÑÒàn¯Ž‚(_ä30´ÍÆí›iš$Ù!TÌQ5@°À>;àŠ»eLiØâÓŽUÂ4ÕºÜPO׬÷û@¤>žW½°·zûPx)5þ±¥ÎÂl_†áÖ.žZÛ'£òêúh þôŒ¿ØÕÎ÷¹j…ØU6¡†lG†0\CìDQ¾zK'd§h6è™ÝÙÿÙ/¡5oäØÎm_Õ“êbåo<çì\XžVdþíë\ÝJ0·ì3èW¤â|ÿ9N¬ÛÞHl¥°Õäëvë£óm  ¿öÂÎûäùòŸ~×gRs”/Å)õ­Â„¨ØKݪ‚ÂQÚ‰«ÆäM×¶zžö½¸ÙHªY¼Û9êÎÙWüÖXk™-KåÕ@¥Ì½Hü°$„¤ìÉ«¿D¾yýV§Ì ÙûHu2f';´Q/î–2îíºê|ôq€¶gŸ]µŒ}o_fÀÈœüÕŸ<ü²õsú8ø¾RTÏøã•ˆ™ùÄß6ƒOµ™×H©`šíw†gžº¦–¾™êRú…ªûZþü\ÕzºtKçeæÚA©§ÝcFÜMjØ~–ÿج ÕDÒ­ ´ƒ`ŵê†1Ó¦<°$£Ò³uÜÉ íêòÙ‡Š=qJŠJ‘Ñ€¬™@FJ(„—YÌÆ2‡Š3<!‘®¬#°#vlŸ8ë ڶʆOä›ü9Ïs^kž™oY£¨Qa½éYó“í>çLuˆ£ä¹^×a‡Ÿoíi rÀˆ¢©yÒFUqÀ͘6rR+ôËåÅ-/\bµßóµ>4ŒTÌ PadW)KXôB.\çØ·qÍ•gð_DdZà8ÈDÑ£ÿñÇ pÄ´Ð2óút~ÿž×zi¿Ä®ö±WÙÿ¯0Åþ2Õ¿¼*QÅE®*[.ÿoçûÌ/Ý—ue7YT³&[²xE/y# €”RYÃ.Z‚ù@ øS:¢:¥‚…dc‰5é“NVšQýnÓ-LÅûgáÔÅ;ÿû ½ðÌÀ‚`BÑÔ€›THEQ:xÁ¡KM˜»O7fšU&d³†v=üÎô8Å=ÒK’Còjܱø %íå㺖Oöa7 :²Izü\¹ÉWí«CQ&Š  XÛ ‹?ϱ»Ã™UÌ*«0 *IBFJáÎæVU[î ã-AÂÅÞê?ésÊUíÏv»¼ãÆCeœ´X¢ZpóÖo|J]ÉýØr¦tF‹"²0É©ÑN•hLÜ3‚ŠN¥@ð¿–ĪK)¢P¤Œ*hPPsvåï´aȈP¯J-€ Ê0Ž(I£vŠ´À×p¢ZafºY>ÁæÌ#.QUÅÒµõ^8‘攎^±÷¸9{ÇUáyÅÿe-ŽÛ Dái­VÜ€&¥zSEV´2¦24©¬ ê+]7‹ˆRåÞ³ýòá´ì~üª'faoL•ÿÿkϼÃs‰FË1íÈD/ð¢NUè'1ÆLñB/úñúÐNr«êJŒ«÷!C^$j¥ï¥Øg³*ðEܤ÷¹—WD;ÌØ¥Æßæk~â°­½¬ä>ßû2ôÌÖýhýøÃïïl™„POd`m¢‹y«Ü¹dd!b4ØÁ•ñCõ¶.<ñÛ†ŽxpÒ{ì ·%%›6.桯‘™ú:P“RÍ*‰èïÔƒ ÿVU¼œÃ¬²¿äu· †Eh¶_ÏüxΖ6GÝÇ ùãï×?~êÏû´"ÖÀI”éiêü÷*ÙÏ9íšñO`DD2%Ђ&¤WA¯»,±Þ8«h…ͧ:†í]ÇžØsZg!¬½ˆKíìåOˆ~yF]Þ‰71–ò_ÿÿÆéýyS!µkÀ¨‡º`¤ ZöTÏi]ñ­½Åm>Uäæ~$ó0s¹q7•Œ=QCý¥âRÖÍ'HTh‡Xi)M'A×¥öVTš:¸!"ER»W`”œŠJÆ1øŽ¨ºŽHÁæ÷âíâ— ¶Yk…‰ÊAR!ä‰JŒ00C2Šì€ˆK)»0ýŠŽÆÇ)zK|råÓ¾eã—N#bQ‘=¬¤ä›Ì%¬@"àÂ.pŽãKvÓ| w³5ç ÞÒñÁh²U99w]œi1[šÂ®sWOø¯Ó/j|þŽ|ÿÈÿ>ÓÁq³w*xdr*¸'«œµG¡ÈÐŒN…÷~íe+u‘£å5;{8šVú¶³W9ÉK—>høÍ§–Ìó(üÓÿñƒýÅÜNøáód_¤mæ‡g²£ëb"Ä¡op± W‚Q%%ΠʼˆÌ)yå6£}ZÇ‹q­ë©sníD‰{¯²srú õ.@ÊEÈß1ô×Ît^Yæ×/é4zÿ¿yrž©ÿüãÞùãŠnlB´ý(Jø%ÙÃåæ:Ÿ³#L¯ëù8»?³º{‚l ›¹äf¹(Õþ?¬s惢æÛ);*µ–c÷8yx²+ð¹ ¹a}à­øëT²†ü‘¹‚Kð„’OEG´É3t9@ÂÓ…¡žüM€ÿÓÜí¯á´á´[¿ÿ>±¿æ)ðƒìZ—˜¤MëQu'ûcR›UWÛ“ç"¶£½õ¡{ÕËýí„éÄ[CPæÔe õ’¬gõ«DíàqÔ Õs^Û®$X‚|ó }™4Hpén Z€“ èáh /&qz7²!òïÂû7ËøGBþÊ*·»‹ü}ÖnÖtüÆ>¶ÓÜR7œö?æá,b{™<ݵªzë&¹YHØé'ÖÛîä=̳©×Õ6ÊV•kòѹ îsò[”ã)ùæ€%NÁç–ôk:qŸWûò±}<â½¹e|¼› {§o¸êص&…D¶¬¾ s}bÒ ²\ûÐÁüö«ýˆúËxÿs•ÿ¿³Ž]ó$Bê2n£>.=x‹C‘5CsÓ²ŽG9Y\xí¶ ÑpÜ4=ÕörXß³ðû[-¼G#ïnƒsöX“B¯/ ÛÚÙk§®I¾,9Û/4ª‡< ˜'cÆ©Ži=Y¼u`Zü…7îkØ[Ïê²bwë‘EuN‰o¸½ß¸ÆEs»Iãyz‚KÅ´ã/>|y÷Á°Õ们³Õ‡á1„+øÅ(íhãß<þçÿηw õñѸí*žº¤«5ü6zÅ~Ħ¼ºÛGÕüÄ(võÛ`C£¢ýŒÑì¥âSÙ©3ÿÙÛ÷zâaöfLä~J#`(‚zÁ¦"¦5)HE¹( ` ßJo£(‰’ û…x'ŠïžtÕ!õ´}‚( þ´h˜Á~œ“¸ÕÙ[KëôY%h­@-¯[¡Dn$,ä‘ñœÎ:†—·£/°hJ‘œD’Õ“vb/L'z{GµÑÿ™OÖª~¥Á)ƨ)Âé‚Lp槇Ҹâx4ïí·æúÔï ¶¨úJúŸFÉ×{9¸§%ÚÞ§9"ºÒëâ¯o8:º4Òðò¯«êJKͲöÁIš6–ûêÝ1ž9Íïà1i©—_=uJ3ØÝö¿qxɅ:ÄÕ²9À©ÒǸQTŸpû‚×°Ð!jŒW¦#º¶õ^ÈL\¡›ã5D'lnd3èQL0^öZHÍÁx‘®¾h¾~mØ»r³ƒar(å ßö/Ÿ¦ÀÁ¯_Ã?z¦~ Õ"k ÂáÀÈÇ1ú¾ÙˆŽsNõañ¹ÀQ@1cnõ10!45eé]^‘öWu;†œ©-Šý<Æ€ë±b"üKøàðÜ$'¾»MGÜ^»ïã#:3ŽQ>”Š»Ç‹ºmÒÉ R5]ŒbM%d\£1ÂéP´År‘*l‰} ùh½Éiw r˜FÀ,!ÔÓý¡«ÍÑ÷ßx~ãüSÞøYÍç¦1òjž½uóƒ›þå‘ß_óú`/WÎm–XŸ]'Fˆ´´·ÞžíÊÿyŽá¹ÀôåT¢¡FŽ@ÚˆÖµÐnîWÛ–.ˆWsUð–ùU×oboû>¶”U¡ÊÙ;ìPkKI ¤²¡Ü±Ô¹¨Ó¯ÙóúAþî£ù8Â727˜5N«Ö2eå–‚² µ]j$Øãj¯%- uPÊrZº~G¦5÷…¼ÏOL8n: ñ‰ë>™a(êò[ (cÂn…RñöUÔðê"yίïÚÔQ£„[4MÐ…¨lXFtâíD’ D®k©ÃÆ8X«:Áhé:²Ä;˜‰gΞ¹ÑÜ/›YÓ@Ä€üPŠç®¡Õ&´H˜í†M¥H1ƒô„æãJ²Ûõ9† À²U×£ûãzš9ãYÕ…K2¡ aÌ×\®1inÞ¶Ná)=ËX{«¦?ý˜WY¥§\×%'®[vg e¨Š4a"’ÈÈŒ*ŸnV¯ÚdÖûˆ¤$R‘²§H¢Ì՚Л(,t Õ©6èí±¿ð³| îà×&‹h@ $¢ç¥M‘„t`ü@ùžúëŽ>0|ʼïGíXázÉ^Tô…Æ4ii‘È{<¿ñùXüø}‘Í…ˆZè9ã&² «™ˆI†ÆO¯Ä½’•¤DlIð¸Äö†•C¶–]ÔV=Ä“ÔÆ¬G¥NÈB¨‚ªC%Ú‘†$!S‘ª…gU.qT@¥J¹ÔAš_èmRoJêæ§ŸÏÒ̇¯#ì¼&¨>æR Eq{…¦3¾.Ϙ>’cN‹ÙîwJ¸f=1R‘‹I  -E%h¢€1"3åÉËšLûFzž¼\ïªà8ÅÊyí©Út€‚RŒË‹— °d¢H¹ E]*Æ0`eˆ¯o™ï$Çp^—Yªm{}¸©J@{tÝ©Nì ¤Raµ[µ($æâLgrã.Û *ÅL]æDS½-٤Ŧ¤„X´É”¯“\qî>]¦­ UnKjl¤EéØ&Å XÂ-„ŽYó(îˆ5±–?6‹ƒyˆŠ‘|ZtÉ4²à2ÕÇ߸û]¯{^¿0¿µŸûOVxÖ|u °AT…*«ÆGTømŸ±< ØÚi Ø”@­I…Ђ£TòPÈ Z˜N `*Ê1%Ÿ Ьð0ŠÒšÆa€)"hƒ4½Xɶ6M2£µL²ª»YR“˜4ã¢Âj± (ÀÔ L ÛõŽ[‘Sp49~qER{tî2ƒS9g×£ðó,Ì;VWl~½Â=3/gÖ€7¸®{ì½4XÄHJËTÂcš-952€¦ xƒ6&É&@ 1„C j’j³ Qa…*ú«Â„xQ’Yì_÷uмÂ?]ïßiþõÏWüšl»ãýû7yNîJ|ó>‹|NßgjcvþÛô¶»0Š$ ls=Õ$ωljE%Š{g4ðæ%„²$ˆb–+޵(•DcŃ£¤(%½b?8F ‡¥/ʵX¬b4âœ~Ç\ºŒ|&çÈ<8#1¹D§jÑæ‚òND´Ï?îW`>x \÷CšàÿEC)¸Íš¯ͺ«iœÇÄÉó–Z´TÓÑ1±"û@žŠ(%Ý—žOŒtŒïØ –§ÏU³¢+O¥ïÒø,ÏþÔÙy!•\öê&(†\›îŽª1*ñôÇ&*Õb’JÄŸéýD®ˆJûØV³Ûî.³WËA0¬qr6T‰A„ާt7Æ æK?cÞ­MVm‹|ý`=Ùu€è”&Ò8|a‰ ²µ„DÔ I>ÛTÔyã-Q»:ÔöÐENÖ»Bíi´Ûµ9N³[{ÐǯCƒX ký¯&À|§Ú3C!ò洴™u,A‘-Y³J³ïýô-Ž«çY§lxT—½4­,;ü9\?wæËÞWN–o¬ÇCÝ×éå÷ìyé±>¹²lnê='µ_þÑzZÂEüàO40êRI{¡ªOKaÕ-~úÆ•!Ù$]S R“ëŠÛA+TPymøxöúÚZ÷çGÝY0;¯{nž¬Tt†ÖÙ,ú?¨ 5rzh>ÿ”¢É‡%8€x‘E„¾ASçÌæ–úSˆGÓ\»’$[ÇØ3 ·l‘ °œ­úÔ\Ý ¸Gä|iNP·óã[ɼo)ëù.¶kÇã$d%#f w×Hpâ–z§úÙkpࢂßäë„ ( Él9©U‹â8„¬æ |œƤY„rA$#k‡óApÀòt²–À9 îR);1k¨<ºkʱos]¯—ç+ӓמõ`qÈl§ÃUáb0ÎŽ  = ¤‘H©ƒâ‚"S¡B§Þêð&ÓûÔ¸s¼µ:š=Ö7:¿ütÇÇ`D¤Hnœûó;ü˜Á‰&òhønÆâ“œß¤GúHEÖ OÉ×ÍAa¶x°š9i;¤‘>œz±þÒø—'û*p ·ï¥ß7òeÔÛP&J(ã›iÁ9Ü\zŒPû¾~ó±jM_ÅUdí©*›ÃÓ™Jp¶‡‚)¯ë.GØ¿ÆáÿÙ§ßéöÿú¡þ»<¸/{¶Á C¤§¬b¢ÇÓ XW„Ri¾46 ÉlRˆ“`1tš53¥ÕŠ7?/W®Ç÷æûN»;I¤&>³Å5S|rœÛÑ_‡ül/Ü:oƒv?'ú_Od?é´ÿïB†}EO¡(ò‚ÄQÏÎËÚÕ«œz1ˆØh;:Yk› ø^4#žï9µ¯eÖ«Ù2_Âäë_óû gû¼}ób±£¦:cÔæãÑ#¿Ðp‰l ã²cA%ÈŒÇ%Jâ.Õ)CÃ#Aï]Š¥ë’¬«ÛÅ‘cÿ¯¶ñu~Ãw~IµÿvÿÕà>*í%UKâ¼á¤di?§ètWzaZ¿Ï¶»Tîá:íàì˜Q¨4Èd€TÔy˜@OtX Ë«H.¼¹8Ä^Ô¶©ë—~)ÆW%ëSý•£K𣬉´O/FíU{ ÐDƒÑQ.Ú¬jHôרQžfÄf8ÿO9ÈGNsjçƒçKž^lµËÙW™Òan†qÝî÷L>Ozíº%1^#‹2ÒÈQ ð ×ÕúÍGœŸÒ̽1øáU<^»±òׇÄr € ¤Á?â·rÛ·ûí›zÝ׆­‘'ž^ %lÜ×´íX–¡ºïÛ¯Vãùhé;?ÿ¨Éßú?’ÅïôÛºÑÏšÓ¬O™_”$L‹i0 F!Ú ITº§E=|j @&ÂB°® ¸¤åvvжÙ=Öâ› ŸöO›Ù’Ľ4k—Cl½|n4ÒÎÑ1ˆÅKo|löãåY—üÒÛ{lÃr—¸ÅÚÝ\‰X+NdE!ÄpWƒX†W„bˆÕr¤ÇE m§€¦óK”-ÈèA8,ZäŽç¹ýãÖçÌq/V·>}ƒÈÅéûr)|ˆý;Á+ØÜô(Îþäûóêeð7…0X·ˆ®!fÜe°Ó0ƒ¹uÜÔ·Þž=òmkßÄìðÊèçzrç,¡ÀÁt%<$]ÓBgƒF f!7ïÓõVeÿÖjFÍC¶=–ÐH%à®Gy•M‡gžh^±VŸÞ§ò[7¢AÓ„‡°‘BDÓ‰˜ìD]‰Ñæ@, M@&îx‡þ"ƒpð‹"ÆfíŒ,ê§ã Aé+w»®½yž¦Ê{柩Z ²gþa¶™{4<õÕ#pžÖ°ˆsöJßJjÙ­kçk‘‰(œÀ  Àða×ûìKž™®xµó#ëˆ"¤˜ Îóy4ÌÑïKs°#öа‚¥eØÕÆŒƒn#5hRÖE÷%(oR’DDø2"ß…¿õ«ÿõÏÍü¤úÛ–·,†}r×€@4‡Ê„o Š 0øaf]2KÙ»M:÷à{>Çe”Ù‹>÷™Í_Dé¿Ñ. !=+Z.“ðSd“ͬh‰4Yºg¤fÙö]n;=ù˜ú×`=?ÿ­|wÞûúœ”…õ150J뮊,Õ€9B—ƒÂåðw±¢¤„¢gí5#ooŒ>íY3ð¬8$Í[Wä•ñb_|¾)GöHâ;Ç>bØï¹µ·;UbZã6Žž ~:jù8¦»“0AÓQãÞåΓU¬…þùb [;4©t ¥Ø<[Bzvh79F<—b”ÚNý>^ÚFk¯^4fœ¯êmtRtGáÄ?ïnÕ¯P¢K´÷ïþåö=`?ýzgOð¦²[cCøÙh5øk‡D±xfÑ©ŸpŽoGU0Ç´|3½Gé…F½¡GSÆûB¡ëýÌ5Ÿ[¼p‚{+Í—Ý-lˆ [JôbüÀfŶW/ÛHõÄdÀE#"c¶£«óÅðÏ:ýû—Pƒqކ¢r5ºO›"¶’iW‚þž‹™̱y¦Û?‚íF@À¸ƒü)é¿õRþU;Ÿícst©ÇAˆ*BãìÿÒÿÚ©¯s_1’<¥ë1«ˆšNàóù1³¾ÑÇ‹½êtôK$çx#W°>Îä$@b³:”-ݽÊ¡*·O~Ì>£ŸóŒŠ€ƒ:Зæi­¡k'ØoŠ`¬A#Ú}­JFIS‹ÙF QHüÍ>ÏÝЊ޷¾ørF¯M‰¹«íx¦+›T¹z 3®p…èžÕßʣ䞔L’ÕHôÃ¥BOîQ­ÚrÌŽëõ^+6åz˜­æ~ÈË£Du( ¥¡'š-[jºB@¶¯ð8»Å2ÐO±»Ô|²¾ŠAÄnÔ÷·õ+Uï¸K8¬s£–O˜Üü“#D}rWjÏzÊ×_Öƒ»oÖI+€óô:2ÒvuZs^%§Dá 4îaf9„.;„hªøPDN ‘E¨å˜±jY…Xf`ERy¶âš9}h`g½TYüD}£ørÍnÉ4K¸i9½¸[ìÀ‰ó smûtïèg1Ï*~Ì[g]± Ñ‘ª L1 D2ñk¬ï‹\UŸaÉ¡pµÔÆÄ܉•Ī(îÕ‹ñ Œ‘ï#•ßáSˆ¡¨‡Ïih†•èy$€å6ó‹´h¸Æ»/Ý;iÿëh¯‹%Ç ÍÔ wC °Ñ$ŸªÆ-ñéæå+¥uã9Š`Ә«8‹ë ºSþˆKd rýâzû8Ÿ”±¢bÕЇ E;Z„’ÁXwîþÓÁ¬Œé…êjìµÄŽîævRŠ ´r%ªJîBíñ´Rý^“‹ •¸™WwéD 8ïÖ¨¡u¤ECC„y üþctÜý±¬<¢UßÔœíZŠÀWÍÁ²†ü›“/”¯!8õåYãSƒYiêsÐ*qqÉ´mX‘ŨjL¯d-©v–ÇžVy{6p!‘‘Sfy­…K!†a¡@!fÙE»éª$‘ÚCYêÙˆTB(mâꉢÕÈ,Œ é‰8ôX–©*K‘µ°lHh•Ò4SÀà¡V —=\ó××"$…µ¦(ùž–j% Ç€8Fp@7”KƒdIQ"@PH’Äáã»Ý# ¿›³qäéí1g+Ñ8<¶'Ì+“cŽëmS2,ÃŽ!WUGµ»»B4¾´˜‹6G”ão Q–ÈP‰(LŒƒ°‹ßåã<±ëImZN•éhb?ΛIÕ÷&‘Z×t«½@/6#ƘJ¦PÖ^­#öZ1fMJz«±õ@á‹ÕÅüq¯ó„üÑëÛê¹{÷þ¢{fkGͺ‘WâU 3 IÎô¸J¾aÝ@r‘ɘO$-õ ê–‘FD Ð2ÚXæ&R-sµ)ÙØµ´WæÈ'ø‡P“àŠš2®£k,Á¨µ”W“¡ LÍÝù€š¡¤âD0Ð:vh¬¢(D n¥ÆdwFc"gl=“ŒÊÏ[·§5¿éɇ{¾ïç~Þ-¹N‹sV‹œ“¤÷Øv—;å–Ý#¾uyádp 2¨Cd·Xç¨sÓÓr‚Š*Aš*¤±¢‚T¦`À¢•qÐñ#kT·¬×àA…ýó·è/h„ŒV‡®¾]wÖ÷uÑ#‰DÏÓ¿ç½—WVêSÈ*ÐØaÝ[ñx†ÎmH*EýTPÝcžUš\A°”(…JªTy8†ú$‡vQÇÕÚ®¥ÖØR0‘D*I2¡$UŒÜ@9’WÕà­šb£Ÿ•›‰,ÉPðäB[tæZã-!=uy €¥¾,/ ó#ßeëói¿Œ¿:4½¨Ÿ‹h’¢I0‰ø¾Àª$Ÿ¥-uÝ&™°,)¯;›%ÓrÂs‘?ˆ'ŶJ‰ ŸFKÍŠˆbTœÎOP‘ñ„ߎŽZSùÿ)Í'0i«,ƒUÿ®/¾þ;óŸõ/‚«ÖÒkámcˆ?j”°Siy@w|†wלí«]^ÿù—þüÓï¿#³Wë¶ò÷|:6µt„<Æ tC¾IKXb좔»èGË×Kv8Löøfõû2l•ðh'1f¿aËò´E’z|ÆEŸžûÎôøouõ¿;^ þõä¿x“÷KÊkhfS::”‰ù^ÅÞjú‘äEƒ‘M×3<3[Ï0‹ÊÈϾ¤ÿ¿X÷³ükÃ<ó“Ïó=Øn³¡qŽwóV¼Mº·Î¯_»ó¹²µûCß.¥vžåíï³eI€$ñ&yàà*Ãà©/¹¢âO­Êâ§ü‚# Š*u-J’ÐZ°I9ÛE]z0=Ù9çl_{ãrækë~DOñ¦ùØw™½¦Ð‚Â\/U­ùKð>òÿ¢ß÷Áem%Ïü?¥Ø€"'(ÀÉŒD:ÝÈkiåX>ÑàÆñF~IîaàR U2žÚG{d˜åm¥½ï>Ç(\šm@‡¦X¸û,:çTý\=n%­UGš¼¸íøÊÛÆ½¾sqpiÞª^UôÕB·äÖ|dó&/L¶ºRá°¦‰Ð퀠Ñd@yáƒÁônÈd40ZÌjŸÂïM¸íSáq×ÖÇSq–`ñ\A=:CïÝÙí„]òÔÞ‰®æOÊ☲x ŒÀ²"Ͱ«ã® ‰[Í<{¶ÊWÀ… ìúu=wÞ²ò|ÔóEø¼ŠŸÝžl1]-eÕÝfq©tRÃÖ}½zZšÑ9´…’â|ØÜà6– |èãZ• ³+ܲ_ f|eîáŸþNùRÏÆ!è],˜+ª¹ÝsX$Õ ]P†’  aó°‹.4ÎîlªR¥i·Ï¶2ª³—3ÞÒWþW¡*óq^qÊÿ‡Çá¿ü8o™\lÿ*Ml³·•!c•}G*ÍÒðm «û¸h“#-×i--¡T÷Õ|ÌÔÜ>ÏJßêY’9áí:d®®¼»Å̼Nõ¸¤ihÓ»EZsþ<ë“Òêtý­\eò÷þúW÷Ïî>ÿÑ_Væ(õa’ Ž¥M˜æ¿Îá)ÚìrßöÛ/j>s‚/Á¨‹î”†ʬMmpY_ù¬×|~?ÞÍz½Ý=[kî“òÇz‡›©_±a@%uTÈ^;£š-å"S_ZGž±/yÓÂ){‘]ßt4™œqPÂKÛÛ ÿ–µñËã¿Ð…_zm—BÄ×.’ñ „ˆ- jÑeˆ÷vˆæ$L¿[áâã”Ü s0^X)X§W )÷1å,ðÈûݳT9b|¬ÄÍ·ÝÚÕÒ•ôùÉd0GºV¸cÅÏŒ‚:&vW\Ã,3§^×B†‡±Bî ™X„-HtfÁÈFC2Ïn‡QÛÂQpjäåŽ&6àÍéÛ2öÑ v2[àÍÛ ô)ƒNnqæ¦~×;_·Hõb?õB¹/HdäJ ½߯i†ß#è%>¦°žüøù¯Ÿ{àiÙo0\‚lH(ØAÄ SÐ>Œ«(k÷=„bÑÉ5 ÚýÞ·ÝÛçò{)¼}ˆoó㙞Ïûë„ÖO Ì3§³9¸²˜²,Ò¢r4Ä(A æÒʦ«!‘™½ú)qìú¶µ˜ƒü(À1l‡‡âÛ••Ov±¹ia—}–¡ü÷ TyµHW”ƒˆPt=j¼ ytŠ)Kí:pÖÌ]¹IYA (:|ÒËq‘PJ,S½±CÚÌ­á-u#iúatŠ{ºI·º–±4>n»CÌ;ª(¾J3cyÝäPÆýÕ§ÑÛµØX‰Û|øÏ ân_¥¯`€i•Ö7êÙ57‡Ò»ÑæÓç—ܘ8ÊtçÏ™zÎÛëN|gî aá{ÑCÙÊ Êš+Ö`¼lÖÞq©h9‚hB®Vßͧù …7w0;´­O½ôæÃdÙë³€ ?} ˆec‚ 4˜€Hž¦ŽhY½õž¬Xxʶ”·Û.0ä–b]‹ Uùϵ~û„’F;)pÞáÚIL6³ì |ú%î|y}rZ»ñŠñ9bÇþß!aÀÖ?0åùñ6®§²§ibKó±G<9Ïoj4¹£È6´aQÑ(D€@­HàÝÔ) LE RV’®£V £¡p¯ú‡7´VDz:Ì P±)°#j|ýj™Œ¾h˜èÏ[šñ”FNaÀGðóòÖ£òóF?­ƒ/ÏæçÇ /˜ØÏñ[ÿyÙŸtß´F8d}›]¿§<Í[Z‚<¡GÍ~ ßæˆbÍnŽ(2]¼ÿi@Ngj—‚(€Š(7è¤'Ãú …ðLR¾ê³G$£§·Kê ö5yëqïùÐ\§ç[ïz-kOö•Èž_ÉL 4pD¤¼ÙèT©é-ÆéŽ;üËÈh,zè(t ª†H&ZÎJ–”#Μý³ìc²zÞŠ®åÉ…§|›Þ?Ê|Sþi¬ÈŽg?6Øn•‡ÖÛi?oï,oøòÎÚžž˜ö 4áx.ûqº/©–òêHá¶!7 Ÿþèа®1+T>ío?[d°•éF #»ŸkxîÿÔþi¼é›Æ» Ä/ž¹xŸ{_ÚØªA&ÖX£MĪÿKKþÔáe‘Â-¾Fò’s­ ½½·Çt”gd­|vQ…ý8ØúämDPÉÕÙ‚bTkm‡ÂËÅ­‹i­ŸNø÷Fð_ê늎6Ä ‰ˆ‚°PŒ®§Ã}S®ze6?>«Y95WrVŠG¥ÛºÎ¤Úív!Ù2Bh²5ĆÆÐ)‰!¸'¶¶ö–Ì_#š–äzçŒEãÖ1|±«~ëæ¡Ë6ržŒ" %?¿JÜP,õëîô¾¯†÷¥/ÛŸwú#úœûëzïé¸@ ’ûxêË%[L@x»ƒüõW¸SOÒäÀèa½ùýší0R0¶õ±¯«½vÖ1;°ù¸ÍÆïxÛYOÏXòJšŠ‚Ô©ß{mH¹Xì}_²wûTÓÓ¯8¿±&bGûWݧ6:ò]E1ÍHèð›ŠbetD׺LÕ¶®vÙsac²G.Iþ1„àËëËYúÏào¡{¿[;ÚÏçåÛF¿€b³KqÉÓã<÷2ˆ£`힪¯ñÖíivìBó˜¯gù+/0ñÓR“A}ÂÂçV˜%âa ¼+/-f§u*p…:ªëx³ÎQÝ”¡ñJOàý·¥3h¦&sê²aJkN•ÛEéDG*–¤!MéÈ `ì=ÑÞ™hk1F)@‚„$!XäJU™¹ÊN‹¦¼0zSˆÄY ñ¥èÔÃ&­¼æÀÍj3 žXÔ ®å¹¢ „Z1[1áf3q A‚ˆIJ‘ÖÁôð¤µõ. q?ÓFþäâän×£jÚ˨$-•âZþ×—×£âPÁŠVÊ»NÒÁ-el«+J_­Ì`–cEóÆ÷´–Ì-&ÛÓë›5D+[g!ôFéo„=X2r%3XÆ®+Ó’‘G½¿áà?QxÿÚ9øÕÆtxÿ4#Î/‚òx0½½ÝϯÙüAêu‚cFÛ›Z}ü’´g<„„»“£'9‰Ð/;Š[¨Ey±nw×ëí8#¬7l(‰ty¤¤#ø&Ê a‚%l¿°ob å,ûJwãc‚6´7Ɇ.›(•pÞÞº£Zö ?ݨKz©35±ÏÒ’îR—Ðû7§Õب¢)„Ô¨s¹§šû6,vau%Šâ¢ÝYà©6‚Àìö…gDc·ÑNÍa\†š6¨â0Õ!šǰŸuϯôÎõ§Í»ù|™Ÿüà@Žáóÿ2ùñ FÏê+ä&w¹¹As À “4<ÄrrŽ>–äkê^³bQ7h¢¸†½üéÜUÍ ò­}Éæ7>´—Üçh8›@:ð Rw£ ÍÝ€Œê:(Ÿ‚ ýJŒ€»#ý5³¦ª×60=ÐíìÓ°´@¢,™ì+&°Ê¸…«m @U;ƒFšÞ§¸Î­U˜S Æiã r=»K`"ö ö¸Ùm:µ'¸ÖíPwM¾…ôÆ:Çààí=Т±$HZ´Ù$KÂôØW¯±zT(Ÿsë+ kCó6­Lû×pQõmm`zš·Ëyéô¸ú‹_½ÙôÇÊý‰ûGÛf§<Ói"_ˆ}(>¹Û§€Ä‘-kÕ(t$±—‘¥oÌŽÝN÷ÜþgÆùŸmüv‰^RBA[UÉës(ÎËn×Hœ%q4Ö*5°$N|OãgGÓ½tñÅGy(ÛE¹¿;¿{#ö PÉ  ‚b‹AùÑà•€YÞF™Š=Ë/@„IÁlÈ@Uøj(¬a’l÷šAc«´®4Rú÷§®þ’ëðÔ„ 2ˆÉ\Ãã$àêÑkâQmný¸K-éî~9 ñçn Ù,¯î'%µû¥íõ lâôÀtì’@â°º,Ãvï -F”9k’vÐ3‡ Ãð†À¦KghF®Lž4ËL§ûa°æþ†"iž5¾}Ûi 3Ð’ÆB ƒ†2“d‚œ ª)wa¬HÚ°^æÅ/_ñ¿q®þô|áÎÌ[Vˆ z¹üèV`.e ûw6WŽKN7gL=y¶>}X]œìûÞ}„j£Õ¸ôŸË¿9ý%¡Ôì_eà7¬–™b$]%á SÐ RÉÆ€Ã.ä<ºÏ>³=•½cÛ;ß%ã `k¬œwÌ8y_¹1m˜±ÄqB"ˆ’b1°Žì"mêËÀò®CçîmôqLžvR4 ¶Hè‰VÛ‹›7X“'å!Rµm¢¯ÚÆÌ: ŠÏæž:»L Ǫ)bÞk뇑º(§št™ Íæ›I¶µÇV¡KH³Ï+H4`²ŠéÐ’}7°žÿk» VÞÛ3ÁCô¼»º:-þÏùøÝ\¿3~óÕôØsÒž=U`OêÊÆñí^¶¿ý‚vq‚‘+®ú3!}ìÒRh÷‹ ûq;›b§:çº%#>È7#ÛÆ kåoh F(ÕÖ3›hþ°‡Ñ ´9ÃõI²aÊQŠ#C¸Ï¡tãžFOŽ­·rÃ}þÈ[°Énþ­ ÐX_ú´×s¢¿3ÖbÓÞqÚ4":L\f¢ã6‰©FÊÁ~X[}6cðiUb«ãüáéÃZ{cuר; W}Ž?@•³Ù¯I«ËÑóf‘-Êøt+‡O¯]McQZ\0%)㘀oæçI§&pÑqž ñ¬í¼^õ ú 4qsS³dcísÚwe©Qðm´Ae³Ìj%n_§ÌlNŸî‰J—ªdü&xÓµ)¹¢¹ªán ¸'«o}›ÿÕEê”%pûpæ;iÇ´bK„@O![Äð#ïŸâ‰{Å£ÔvµS€žô†ø ÀJDÅÁ\'‘)¡Íí@ÈF”é¹BõÚ¤KlyÄ^DQⲼͶd<ˆZ¥Z¡Æ´:~@V±&yA8tÙ<,@Ÿ°  HòbÎÜøËÏšZí @7c)ðí)¼œ(ÖN<ï×¾F*WþRûSõJô&jf€‰ -ÌklìK}ó\<¿&nJé2D[SÔ0—P’V¨Æ ‘x7WK²ZG4¢é€;ei±«Ö÷fûG9¨½ aÇ•™—פ¬RÔæ{WÈèÿ¦q1_¥xù`Õ~«5 ò3v2ÂÎ@/Ì ã¤0æÒrh½1j»X OÇo7fxp¶ðá¿¦ÆÆº¡ù•åù‹ÁÆïóU/÷×+&cƨ´RC3þ€DF¸f$Iu߯5F¥ç–6ªU+åÏnŠG×âî)€K®„Tš4°Ã’ñVçãÎpG©„±’)@„ÅK=©vÝúŽ»‘ý‡ó—÷×è<åì­O—äy‡)|áé„"!”)Ƨ¤%J#a,%™rË.çöR\åå°†F= „ãç)lÚ„×çC]Ü(Ú–H$f@¢úñÌ4ÍK÷¤z¼¦ö¿Æ©ˆª3ªòïÊŠ–!Y^@hV¾îÀׯµ+h (ü쫊9ú@‰ËÅ´íÚ*í|5¦m'emIg¤!±'B©eifÚ5©§kJÓ’ÓR¥R"ÈPp¡"vËÙ’[d²™ÔYõ,Cz@° ›,êm5ÙS =™Td,ÌÐ’LÒ±ÁH3».œ=›SI@BERÁ,"Q…’>µÓ¯-ô´ᥲG€-Çé•”i7]Ë¢+„/—VÕµ¸±r²WŠÅFtÃZ„1Ò\ ᄾNuÀ%Š%Yj¤¨[@Œlˆ`@Æx8ïga–I˜ÉŒ ³Ñ,€è TR@´*#…¶5‡€BÃ(‹d$kq8ïäÉ«w”æ|gû:'@N•ÀÂ[Út,—©ÏÖÆ^yïôúöf»óšXªÆéÉGWx. jcíµ0£NrƒsÔ8bE@u›ˆ`@¾ZPPÆÑ`3Ë&}½zšG°A¸d§Á„úzòžß}·Ó+½!Ï0j5†òBžÒ{ÔÀqnñûã–,¸ú·5å%i #'“5…ð3øÒM9¯_ßà¾,'FiGgºEé%Ò  ŠÆ–ÛÒ¨;4̳ÑR]xÌ‘A)HlÀˆ! ¬XE#"X÷á™&L®›iá×€ÄX° ˆ€/ËèAãm –+Ô¢õÁî™Bm†ŒJÎ3ûË’~§×oô6•9ÉÊP8†J¯x¼GÜÊXJ@+9mê’ [œ<ŒŽ{àΊš%áéI… Å@`Š’AðÔÄP•Žœ1ĉ B-M EŠ[ÆÚ¡5V±ZÕ›_™})™‘ÐÍgSšùı(~=!4 ËK@¼ý³˜Û3 D1EžÖˆym±Ž-ª\'cIÕ×.€È -ï²£æh·!ÅH.žD)'.YI°Ì©E[]ˆùdRrW•„hQ¤`­œžGI¥KÓ–Ðñ•0‰–¶O×ûÿ”­½;´cMuîãó+­Ȥ~¦Ó`žbsgsÜ4ôÜð¼Ð ¶qRn,ìì¶ÔE—›š+ѰöôŸ}ìá/¶nmÞ§±¥…8E†9÷Ñ…ü¢½.éi]I‡€SÖö:É ã£8Ù:clDŠDÒRÞ@ùnÍ ¹\i% û§q;ûy¿þ廢Ï;øÞ-ò³+"V®»´Í³ç…q“ ›„@¡`îØ\"¾˜5ܤ®s† ý¾n__ ‹'s¤ï›Ê¼íx»Q û…h³¶«érq-GŸ°¦‰_úXÕá¿ì®§:vŸ¸ý1~µkD5AüÂ?ÑQ·::æ (½èu2__úPåùIû¼ûZ瘳7X·iʬ±é)_óá+9o=S>WöhàÂ% «5‚Q{t†€v9 çMM¹'ï¿OÂlD‚›´\ï_é¥'§S¯NL…c1N‘f€ˆ‹‘¬Z{…}ª—ØîŠ„zŒôj&,Duôv1«Sös„Ì(žaÌBÚ·ò…Vf°Õ~ª¹lº÷㽘s}ÿâžûñˆrÇËfAÜábRõ4ˆƒÀÅj¸$AdŒ"Z!+luŸGÄ=RôÍŽÞ€Ž0XÒ±VÖŽªDµ²º».%¦E)Úû0‚ÙŠW‰H¤S‰VØÒyhO•IÎ{_ž˜@9›‡´äW»öt[ßoÞímýøÛÕç×Ï83΂¾îŠOßEà«Ä9m¬²_bµˆ,ú´±øä,Ajâ(pñøâÍGDÛ‹sÞ;w} úÞ̵ù¾À– ï~Êweî‰G.²Ù¤ÎxýªIåX4Ê«>|¿=Ñ¡dé¹GAšŠÅÁ–šiX}Ìg'iÆoà †««R>ê~þ•c·ùÿ?'˜ï|ö­uQÅÌåŒVýlÞ{´Þѳ5W“ÎЉGjódëD$Ý“ÔÄÖ6`BWy„¹ÕñäÑgO¾¹¡ªÛ¶ÊßÔíóC¯—p‡V*ÃG;:Fž)"€(þíêü§lt©Q5Û&eL?3]Ÿëö,Û˜£Yãçe¹Ñmn5;åçËbûùpúB¸SVUÏÓVð(‚µÊ_öeÒúÚÞͶ±v¡Wfks° 7ÁxÝ;6ˆj¢̓MC‡æxŽbÞñ¶ì7Ô5Eßsh%Ü @qÎ 9@hÇ®ÑjD7îûZ?ò^"nP_œ¥AïÅà)¤¡tS–YPù`H’å¤O‘ÑÂÛ%$ÞÔf«·lM$Úbª$ ³Qûêå¨=]tRšF$o‡cjL‘{¯íDÏÇuú=Œw žIßj~W{MÕ®Ö̯wgn屫Ûë¶ÁùÜk3n„í÷½ë™ÇŽ>4ÀvbX¯|Hï±ÍÚ hú9Úåym'ܽN} pGA ¶yãÐÇ—üZ±³°=ÎÉîÍyü8$¼mD_Î5=Z‹ilË]UæOÁ—ÔV8 “`4ë6Ý‚z3>™l˜ær«´ó­k½W¤õ9ïáþí*9ZQ889ê崮 eˆÝ\k.ŒÜ±#¢·Eq¬f<žmŠ3©ÞvEŒ3À|"Š„¯êß*f‹- ÁJç|d³c¦Îg‘¥xº‚´Æô²0…Vâø7çÇ›?t›ëUÖôÞý=·ùˆyþ“~>ìõª_‡¢g_à½%ußjs}A¾uF¸þL`½ð[½^8ýA?e]é?ý¶ƒoà4üìuÐVÏ*Â’*àhóÖúÌôîB;®Ç˜è©,wïòm Ð×?aŠ2;d¶DcÌÕY èt©ö’]; ©¬’@õâØÖr€„˜}åëBhÈpyËI•žãžó­hõê°ñkÐ3³lŸ0üѦҠ’ =J&!K\Ĩ—Ôë¾F‰;¸\¾D÷b›à“.F[“ͪX«b*‡ÏEíÙ’ö½ëÝ~Ï6fkдPШDEC%¬œ®·?½¾Õap±è;jüfÎfËj‡T«À¬ímg, ƒD@…Zu¤V% ì¯*§BA™x¦*óCÜrŽê]†g–Q³ÀÄ$018Æ¡]Ô6/¿ÚžwáC©ýÍùæ®æìè ]¿úõ\•ó–7o\/FÞBª €ÀB–C6Éœ• o·rè%<‘¾îx÷æ¿•ûÓøp-NÍÑ7õ"!‡Aš +ÆàôªE•uk½ðÍâ|í½b„¸QY¼ MC´™ͳ« ¦×goeyJ]PWæÂ:Z¹'ê R%DQa* ÃI²G²Cƒe€z£ÅHÎü\²pS¢+ϹÚ_Ñ/F¯]xËbÇŽqâKÖÈiU[hPÐZM`(œæô•ž2½ Ÿ;Jo\Ó„›ÉT°ƒ” ™†§¹äîÜ]‡?øøéUŸ‘ìTÄ ørˇIIQ QÕÝÀ†L‘1„x.\vã¶M[¨–l<òТnCNòDŠNR s’û!#ÔìZ]ç8öÙpÈ0ǬTXÝì\½G í@ãØ²°œbŒèÍÂâúå}k–‡Ò¤"'€(Õ nPÐPªìŠT2i´Ž<6^׿Šâ˩ګùàÅÍØ&Bâ¶@iÑü-û_)–J±ª ™ÈSÊäȤï&' \/`®Ê$ÉÝ”cZïÅ©ÌX%"JLl CyTê-h¹“¢â\¤£¬ 8‰ÙÖ+,(–+  VÅè°ö B•è ¹5ˆÙ?;9Þ[Î#Ï1XøI”ÙâÞ¼{\»—6à¾~‹ªYÛœ¢+Ëvõjýz½ûŠQ›xZ@³´û¥¡P 8óuƒ†X§õ¬›ÞA¦¸I¦02%-b &HåàßЖÎ8h$‰1N¤®`ÙÏ›AgÛ‹å'ïã?‘ Ý}^©)?!%Ζi¬§=ª.0XßEiìø#ƒÁ\_ŽNçŒ`û&óœ}ç$hÛf•b¡^‡( B(#ð"Úc-­Í9ÑHñøýf§Ü_×2J­ˆ,h¥D¨r*\EɪÔÎä¹Í3« S7‰2ÉÜÆÅzCÇÜÌ WA•" :~ØÙ×J™ouŸr;ÕGæóeÅWäv'£¬(,\$«1ªNC&ªÆÄ×Åf«ÁH‰JÛ=¯›³‹s‰2Îq„§ü; éi­³¯Ð#SIŠu}]‡DyÔ¢&‚Ìa§&Ö½s$Œ õöΙóó IñóœdéL¥ÊôåPÚÜ›¹ÚDèÔå–Qøûë[ÿoéÿåMÕLµ¬8SÕûØ«4Gí‰GÂ6ò¬D5’%x rW®¦J1”7À$iIf±$…UEY l‚5UªÔr’ùº”„Ù1'@c"[BO]›©d¶üwzÿiìòìþ‘™ÖÍ@Çà³8$ØJi3F¦F9RÛÌ„ƒZMk RÊöæXUxccuìÈ®Ïs¹^ójPæ‘;‡ˆ¡ VŒo¾å¯2ôËâR²§OÉ:zx=€«õ¼IŽ62‚µßö–ÌgÏr¥/±Œî­ýàÃ[ôé‰@éøCÇŸo†Ãӎ˳ÍMl›ãÊj)s0У§™úˆÑô5Z[e2̦›Ïk8Û“úk±›êïÖÛgý<sí\»í^o+´sdíú%ë¶,7Ëoò_õ†RÅø™Þ m:¥F“ÑŸðݬYY\ €¡:ZctäUx†ëñNÞÖ<~þÁç1Ìý¤Š5·Ó^u¸&v\ØÃ0Ç·çüf÷n}?Ö×¼ve EÐ%©s†\"²žNTÅþ)dŠ0(ä~Õlûiëù_ÌÊzºn•Ö"‘ ‰‚@ ®b6­ù«}™ûñ&=Gñ!DбŒmÈ” =U§­×Uïõ¶«¸Û9…";¼¼äpa÷qZ¤év:ôÛßûèöÖ_›áÙ?wY½ŠçÇråÜvŒV4Ìxe²«–6êÚ ±A­ŸŠ Ã>š·á³dðÏ^ò¯éeÔa… ƒG«uŠû'<ÄKÞƒ›Še|¤–¦fŽ``$„âaèd,¤Ùà·ã6ìû=ÀC‹L1'û ¤Ù}>ê/™ëo6Á1Pª_ß•ÏjrwzRÔÆ"'é*•@AßÒšj˜Î•ˆÜ¶×¤©ÃQîh‰ è1_ E‰æ À&7«1gºà %¨PAǬÁ²Àî|(e5Ƶ¿-ÙúùŒÞÈ×–ã·‘»Cz\‰¤s‘N{Ót¨ìÜæÏSúýßßB÷“çK*qû6üÁÅóäûM.Ž{‹rU¨ªŠ%†Q0”ÝïÇòœ.k$¥+îÞÆÊ©m'‹çu†÷Hã™×ìyìÎNïëàÇÿÛçÆßÍæ_Ïñø;RžEEóŒWÿïæWþÿ7ìÛåòŸ_ÚSùÜd9œ²žë¬Ú6¤u÷¹Î€jäÒqî'ÅålÎW7kŒç¯õëÀW¦¿½mI[4#}¡”Èõ–›_‰=&î_„2pòÇ­x .,ü”×^ž˜×XÆí¤a)h%äé°5«˜]Âí‚ლl‡Xã˜áM»#$:UkÊÇÇgðCvå–=ö«Ièü¢MùÛ--§ªÃúo›œÕÕaÛ€æÏõ ³LŒõ¨8|=PÔm¦ß2¬vmÿËîÿÖc.ÿ çKÙŽÔÃYFjÓl;Ðö>C»r3ëýU óõ?ú_­~=³?†¯Uq»÷ÝF°¬dsÜY§!,K`Ç:â²tp*Ñ¿*Ñ{ÌŠ–BýÎ Âe Í7âÀXPB‘ɵy#›_–o5{íRTu\©{ù©‚[¬ß1Ęý(†(ÿBô½EW7Ü@4#BWñÔwß e_³Ý‡ÓÜh|£Ì^·.7êž“‹ï®U^3ÇÆËO÷ùŽ:y\Gž«î‹•¢£3„j{“WÓ&ÛX“ ™Ôqàx@„©Xm¶GkbsJîzñÛ4vbåÂFíí(S„ dà à±=ŽO¿ÀS×f’´³:¶¿½oO®³òv"??j|£þ^ù÷·“>§|®ûÞö® ¿¼L·l$«:­+Vex4–<‹Hº—aÑùÍq*O«Ö}tÆYØŸ›øpDxDŇmF;dÞOìñ¥ƒŸÈ÷…Ô®7\d@nê‰Ýâ/ë‡ß×—×_ÿ/¿ýÿ½{^?ÎB$Çzœ\La iC¦q- üøøKìËÞÄ^Ò‹JWêI48WÖñ\ï»g-ô,í«ÔŸêÔz£ì2o‰ių±t±Ñ™4±Akg‘=2‹¼Û2”}‘ rM)¬äCõÈdŽ8YV}Z %¢÷zß×+ƒ_Ñ«§¡­ÑñÕ& ØõjâéôŠW—¹Xøª2óM¼ÔhAh ñòAU2`'=cßZ(õVg¿5êµEñ mWÝï_Í.’ú„85Ú<Î!ìÝÊ<ùŒ©ûy|*Pª÷‹}"½ÇvÑ~îWy•ŸV¬u\6˜çýü;ó‡Î_‚w×VZqÈEûaV¯7›[Úϼk ‡Iõû—니rb ÓœsœÍÎ,t”œ¯­ñêŒ_L;h |>×Ê”QŠ›6‹=µÁ›ÈEl7ÍX#åVÎ.ˆ… ‹1ƒ½Õ5´ûÎq´ýúox|r°p ùS|.ê6+=Øä[¦“éæS¾æÛâxë%Ð#Ïcd”Fâ5ÓÜönŠÏéQ@öH”°É#¾X½_´úâÿÈÆþ‘í¨?3ýÆÙš&Dåg]–ê¹°`…°®¦Z fìñsŸ<‡¶¸®×àFÔ€`$(pùT†¶-t‹$-°jàÛ§÷šFTÔysßfŽ«2¾·ü(v3ü)ùa¯³Á&FmÌÛY=•9üÈ> §áØ×¼Íxòš-äÄ¢&ª[3}f.oÌ=³O«bêmtË-€—èü•Åò£ÄC.é¶ôyQ¹”$ê5$Žª¨Ã‘GýÀ£v3gè0¤¯I° «¯$ê ÚpÚvÔÜ´L¨GP@i>úÓX¯’é×Éw»Hœ’; Üì~ž*óHóâë“ã'§1ïí 1 F¦–K-ªv¾QéqÄW"íPC5±ÛPÙ­"îežÌ kœ`c¸£/ñ¦4'žÍN«7ðg®ä‡ž-߯RlP³3-ßÃMº³øH„Gšù¨´ —ë—òëk+÷ö²~ÃǸ‘`bÛ¡ŒQQµêÉû†2P2D&1„È0 El}º3Øó8™\ßý¶nüÐúá²8º€ Uq‘*'÷ßNk”@&ÂR~-¹8pj¾9"&m \ÒÁ_¨«´ž)SÍ}û÷<†øpÇNŠ©xiz‚àªÌ‚å‡Tÿe>i©5‚ºÏåOM©Û’=‘a*Ág*e6I+¦Y ì²úSÞãìy6^£fc˜ 84c!R‘Û»ƒ›9rùÅÃRÇ»ëϋַu2Ç%"2d fB(·t„iW’f¤gYbg5†\ÌWl)í°º³£! Ͷ€o¶Ÿ_~†yXy h^T§ü–‰àå†ÒÜ6‚B´ÖUnKH”’TÖ»iWˆ|¶¨S]6ZÒ2—‡ G dL %ÊwÅ_µ<ÿ“ò:ðøÑî<¡*‡åHHÊ58¢@I$.(€X2° ´B ±Xa„€ ‡–,cC!©\žƒ–$ãU3w¯¨Ùn$PîïÏ倰á ëöù)ëéG x[ˆàA€´syÈׯ}?-¨<‡ÎIGW´d€@KŽp˜º"4€Š.Ê[v¿O“×aï£Ó£ï\¯æÂÂ1,.hYŒ:ïg§QY`xwf&‘×ed‰Q ±[j1•iPiý©\H´oJh»^·La·‘ZaÔƒ¾>÷yËëÊ.û~?Çd+£²\³m3áòBFXk‚rJ8LL(… ² & ƒÅ™Þ”Öü<9O®¹Oå¢#JÞBû¡–ŽÜœz+ëk}Ô×Ù ÝåM„AÚ¿-|“w®7r SufûrÊ=8­Ÿö%ê¨I f &Â×(t>C¹Ð°4 m6VîbiÞw“ñ ïIpf/•æ "ãÎ?ÊO×ùÁæìq÷ã×ÿìnoèŽ9{zšÛ´ãV½Ç&È` \cSVˆvËõÄ àÌbzlÁÓ9K½Ú››7Ƕiûù\[=Bs†³ ü˜&U!C©B–@ÀºÑ[Ñs¥©q £º4"‚`Œ¸¸•{tì¢c]t1{Rû…“èŽ_œÕöN*=yVœU®iiƒÆÁ®Òh¹uRÝŠÏF…žS¼š¡UY<#8Ç·KÞøüC˜wUø»ì/Lcs¸°RªÏà'jM»‡ñ¸:.뫬ʭýô7‡«SUž«G[[僀øŒŽÖØ¥(tõ‘40ª£8$¾ª*³\Tf|vÑóˆ†13RYÑÕùð˦á\Ÿy™áX@ïßyT¶h31'ó½*"|R»¾÷ßxßoîóþþ)%"“ëX•bÐIYôèÖ_é\ïZÙZ,®çgë }¡Ö°ªDKC„:ßÓÂha¨9Ê ñdúÚÑU@gÈî†AY×¶¬Ô«½%u‹”uQ°Íô”w`Ù©ù^ÒŸ‰gî£8 )1‡-Š¥*j»b™ÆAÓ(§~£ f¸'ŠQn³0‰f´Ðª}B{›\W–c¿ÎÆÕJŸ¯dÓßW)ÕB]ùã_¾–¯çsj4!öÊxY•P'÷x×`UÈÃX)F) å~ô‘ð@®ÌJC¡¾w#s`.½ãIŠ…Äó-™Ï~qn2ëC¼1[J»§Œ5>ðˆ±~ý-šƒ›µ§#WYšÅ°ãzŽ{å5ç^´Ú:0™^_æÛ;û<àuš•¨A ‰ |1é.ËbÍ›„¥èX `,%!hÒË;’XOíóbæÂ¶óÜdöYϵÎ1"î9ÔÙKæË¤\$£œáV¸9üb=#ßIUH…©ãÈ&æSÃixù°ôˆ&+ZTÿOéHRe® ¼4¶“&¦Œg)uß×…®Ï• Y†kNŒ=7@2LJ¿o°€Žk´±ŸŽñü–ÑçŽÑ¨‚_¨›®Z ìEiÅV×~÷oX>íÙö I£¨^»6£WÓíšD=Ú_“þø»ýùËü|?³ŸsžjÉ8†âš†Ð„nÀh¬Zw¸§¡2‰&h]° [>ŽÌúSö[I‹WmQµ&Œu¢AË3*Š%-n(ö`/Ó$Ù”’¾gw‰–>N±* ˆŸIý• èªðò¡aë“%"¶‰ Á~ÄûlòMŸÇ"Gmf7擽ä¢ÎJ?¢,¦ØŒeœ"褭£{·UŽ…g¢N.QFcï—#ñ)N§–B“÷¤Qª´Bugt@a$隣cKLŽŠ^28ŠmV•ó˜@\ðŽ ŠE+é1˜„¦©uk¾î qrtÝ󗇸b]Š-vÜ1>ñ½øßVí±ë úh¼áèlªpš?åÒ8–O3Eêl£ ¼—ƒP…Çñ‘Ͻ ÖÇ>G˜IÄÇo¸³?7ó˧×]|Ê{ftv4'=‰üM§Õ6ëÎ?<¿½ŸÿÇ*>9ó)Ïl¼ižFŸgPÏêÙpKelgV3PÖŠÐ\gø|'×* «ºæºâÛ^º’Ügø],âî5¡zÁu¡uî~>š’ÕÁ†èí¯;v(Kªmñ¶1}fô9NRÛRv VP Ó2l¤æm8ÁŽò¦ /è“?’(»s±zˆóä|•T$5Œ^ßÊa¸`(ÿ úû³7è!ý–KÖCõ­ŠGÊV…‚ ðû1þ|büÃp~ºË°î`ëŸßõúyè_ÆjŠ?í]$ Ã7Ïô´ 9\Cȵî. Í†îæ™:úãòs…Æz ¿>q>íçQ—œ8À2îm§Ý2i/è¶ã±?ä…%›˜ˆ;+ƒs,ª®ðs`Ý?;ê Ì›=Ú¤0“¬Ǹs^ó‡‚TÏ2)e¶`§Ç•ìžåùfüõ¦}¿;åÎöÜZˆm"¾Çb%¤rà =Uú5‚õ ­µõ`Ïä•¿­‰=q«õœõ€ü8v_¯”µ7êç˹Rñ€ÝWúöÇŒÉÒ|½?NÏÛ"SM±lc0u»†h§5> ?j3{ê 9o2?.^t)Äì÷6l}µdv¾_8°¡´”0è©I…*ÑARôPì¯~V7o9&ú•@¬'ñR•_¢¤ÿôGÓ˜öæûSX`Œ¢ÐPRƒ ™¨…Y<Ý%]\%µšªè~J‚ÿîàø0½8¼w- ¦Ê½€ÛÉ׳0t©=üÑ{›Ôˆ1vÿ¸ú4ƒÝ¿U÷;úú§¶v_tâ;z?á·>ÕõÛÏßüɵþ÷þµ7•mYIƒ’A€–¶Ì§·=¨¹V@®B>ûœ,|êí¸5•LÖë’ûDuÜ sMwïHJ”P£ñœØs6Å>˜Qc…a(Õ ¡ê“ÏÙk#¨½Êà›4írACÄAª¢ŒnŠÈE¬R+È‚9Ù¯ÌXy&©K÷¢TؾmÔ”ÇùñŒeÎZ,­âHu/ÀƒPúøÉÇJ·þÉáë–]±ÝÄØCD‚Ïç.¨_Îø#ÔiÔwÁ• ?ºòðý$QDòàí7Lݞ׎÷x <õàÚ¿5> ­w²,Ê¡ n ²Ô a¸4N_„Ùy°—XtÙÑTúëIq!q7ᚈw¥Ð;ûDMÂŒSn“ÝjÄm^ï¾d‹eŒ¤V—‚` #tªW¾¢Gåâ°ÑÅŽj¡ÔÞÃAAl8„Vhì.’«éØŽ3]Pv#´ŽË•2^î‡N °=tj´ºRRÃöäå´L7-pì ºê@,K§s±r$…}1}ÝgÉ÷ÌK¦&°€¼êçGc^ ã4?È7ƬCªê™µi¨aÀx#P£Ø¸®­]Ô³˜ãú¦ƒjEË‹¢^If7˜"#£+­Ò–̸Ó×…óµbÇ€yyf[kG‹”J™â¸^–2-Co_À•ûõß~oœ‡ß©í\P"´€ b*@DZFâ “‹¹H Êq(;«4»0Ûë\ù´+_v5KO¸å—rÂlXžÛáà+WšŒ,&OR±¯ß„w áRBœd bF“ÂÌ|±è»-wWt÷¶{¬ ¼ €DVF/”¦&\FB*šf,ž÷{4H›ƒf4@f|Œ?˜úÇâ¶Ðˆz÷ŒI*ÀÅîÉ|«ðøa¿¡¾˜¿eíC¡˜fœ¢ç°· Xa .Q›P)¬,dÜóä³™•Z\Gî´Ѭ@e“ž ‘¤u®³Ìx㇠ ö–HÚ¨ì ÞOzMûaž½N//áã›àÖÆòÛÔN`¤Ç(MÜ‚"È Q gîV±*iCËQ"f!* Mô\)ØXúÚO¬MÂÌÓ¦WuÿóÌúrø~‰Ÿ¿=låq½ùâš¼¨šÇ”šÌ@EÊXÆ¥á"ÆbZ,’ÂÈ›-;ªJË)kâ5•*û±Ð/Ë8dMæaòLµ|Zxš¡…Çt¡:çÍþL´ªÄsëíö\3] N¢#F“YòzKšZg›ö~4ôJï+byÅ$$b[UpD6R‘Àq_äk§ÍÁÃCrûúèýv‘(a¡ª)²Äï}Œ¾ì•K[–t¦ƒ<©•ã*¾”}ºG3%5}³ «‘ƒ^—š7`h¥Æq[U¬‰s\÷x’æíüj™ª˜ƒÝÉüªþóÿþ’Ö6:ð€ôúzÈÎ5ß êaf.•…¹×§2”5HÃ0¶ùYn0>oÆ Ò«)ß]nö¼÷u¿ó(Z¬I ßD}bÈ Ëezœ<^«£=|„zqÏÙn4Qk&83|‡;!§¶7eùä•^&® šÇ(~Ù5òÓ“ß‘_ãdšeÏôz…˜ÚzЏûâ&Òô¼¡SöNh¬3luçúRô°ÒÚ¼bÓåªÌ{'Ù®n㮵xK# …1a#p åj!t³$R—„‹&Ó@›Mß`Yã0_s¼Ò]ó5¸[K %#þ½8E…¨liƒœ’ë§p³“M«sv’ýY%”ˆðb1$‰°À !%HÑ(‡ò$_|¥ÑÄX‘Šì¨p}j•*%%ëØ•Æ¶`*©@dY:›Ì©í*ä…Vº‘têìÈÓd–‘7’ÐÝA«~Jêëkœ R1ÇîÚ{E©ŒZ&ÓÝg|þ0g9‡€–‚!#¡ê<Ú¥F¨£ðJõ,F›sÄíT{ÊIE*Ä &qÅ«O-'˜áZ?ÂzŽEinÊÍÆÏ½çÄÿyÑÿñÝ ~ÙÃïüü7÷×ç÷×oû¿bôî¶nxd`œú²k.ç=¨hn”—¢z [8ßü€#Gé*BtFåZ>2Ë-:Ê35U×Ñ“¾òÎlɼ•gýg4Rº^Cå'±l`^èdK­'MfNèDò{ÒL²r´F–D“> ͉ٔø "Wóè >*.bü|O1”}.ÚÓLà–[·šŸ2T~_ÙðôRzQïHÝ=Rºôðûíý¿<äæI°70ãX·Þ_t©ùŒ/7BŒ.M*᤽·Oos­r`£’žçG¯_ʦÂZ¾ >Pøö·Ð=Ü#?¸ÍSÍBÖf¼9õÜpÓ†Ì+c3ÜRC’NB‚{ëö³3ýÁöSŽ¿6ߨ#m‡×]IâáÕî2ë‰ö«!#޹ë]êm¤õO˜Æ/tE#ââEþˆv$ªi½êIyê¢jdA€U Z¡<ÐMoÌ~ùúZOÎ/[ƒ9··ÃíA¸.w¥Ikê®;göœ žÒm3Ü÷»œã|sÌÜR•»æ‹<†ªzeÆÇ•¾Þ]óa”^do}þß}Íí­ñ<ó|.JÙ˜ª)þýg×¾3ßEO0TˆR%Ê6Ü‹L™ßþC·ü` Æ4FWµ¯y€\MP-‹µÈÛx³ü×ÿæØ•]4ñþW‡p™ºGó½×¿(©z3íñùwZÁºY­ºg<º]ççËHÒ¤ V$éÅP´PMÒàI'&Š–[ÃR/2[xx7~ßaµák¡ü¡‹x•Ú$ñ€E­ˆüœp„^xU«Dy»gö9£‡‹$¶,•F¾Ø•Á‰GÁaP·£¡ž”ŸiÀ]ŠU„Ô"šTâ[4ÎïýÏÓ¨VÑïnñÆW(­˜ÒP  €ÐºTšý#lIÚT•ðI“6ÓcÁv}dTŽñì`q #•/§VGÊ…H£XŠNw^7¤Ñ=¬ × ´ŒÜ5 ›«‘n7&U. ¥LA¥Ãµ¬Š¤êH=†SêLg™SˆÁëÊç#d™W;‡ãþm{Úª¤š»¢-—›wÂùºùkî^O“[˜R²ÛáxN’ÓMä8F°.=PüvºãÂR‹³ 6çF8ößJüOroýÇGóo§øÂæ5m^ÔýSnè3;ÂÒÚ}«®ëÖTK¢—‘¦,íJ@q5¸sÎâJ°àö}=bR,×vÈ8œ¯QŸŠ÷²Ûîf¡:ö~£$ûê²DU¨Áz”A3µXÜeZ`޽Æôóz–}] Þ¨U—W&©û<ä °k æg8CJ)btÉ…a8¨Tï¶!%:Naýeª³x™ E P‡œ»òÊ €à ór°]èÈD¯D#AÄ×ù„•Ïþý:™Z_‰åzCë¥Ùê<6òx“Ëøx¢ó³û‡Šº£¨ã¼º0¡¡µA"´Áý3ß¶ýû'iœðXWŠOjXZŒ?‹ŽÀ™à>µ}¸ÈDx<ëJRf…Eeu q :EwÛI©Y[Ë{oÿ4ÜBüYFˆØ‹ûZxaû%щÄ܈?Ýž! Œ%Oê(¢›ÍMkÔÜ&øÔúj€Ãüv Ma:ôšÂl†|Y|}Ü+ç³Þ}Í‘+à ‚Þ0žøÈ{§xNöµÞ‡éÙ¼ë ŠD·4ìÁ–}²ˆ4m¤ÃÒ ´IôÙÈÎLñ@Ô…2hŠéR‘NŸÏ@‡Ù lmÏ/îŒ<±þnÆFã'Àá%c!½:ëê‰} K#Ù<ä³µŒecÒ(iwC™,4_öãri_µø¥†‚ä`½8>¢ŸÝH.£ÊÑÒIx•ÈÌOnzüCÖ^îÃÐ,RõœcìXÓˆ¦ÞoOƒhD)"ÇP5§ËýÉ~Gðz*$—â!x| ´ìc,ÅöÁòÝån~šöÈï'—½íý`}B{LâLÖ$ÀýTô½èxë%<ü¬OAK¦!”Ÿ«šÈ‹ƒrŸ‡nó–¸'rææôEK›áVAÐîÛvHÑׯþ»à>ëh­w‡/á¤è„o>3¦2R=ñ$ÉÒSJk’CÉ´_dÓ‘ÐÕx?¦X‡±WSÆðïÞK8U’Œ+¶1r×úM[â*±† "a§Â‚Ö|œöù§_Èa{ÚÄ>06œg·ƒã]sýnT¢í;¢›>ŠÖÄ0·¸hì ÓO`|€›âw=&.,œ;à[Áñb¦6îÇ_½Ô @ZníÀ <­q±R“È"\ÖXUãm/À Âzaàì¯/ÿôÖ(V1DÚ”×Äy"È ý–‹Å!sžå Þ<ÒþŽíøUÑxKþóeãz³*±­AÔ}\¥…àÎ4µkÕc‹öE³äd/÷1Õ­ÄÚ¯¦%¯.í¤:½èuùo³µO®>Ý6wnþ?ËÇLÒ‡¥f"Ã4¡ºà0^ÜáÆØ°¡gÇõW¸÷pכĮ¥0×QMBªŠ¥Þ‡¼ñ‘É›U‹éìÆmÚÈÎíØÄƒãÕ€Íjî÷–ƒGí?°ŸãÅ@$­²—™4uÉ}ô|X7*d"3èå9As™Ç™»\$¡_´8ssü Ö íNï( tÑ~7¿òC'€ÊÉ8óHAÔeIèv(ÏKúŘ“Ö0ßW4;0A.‚ØÅ‚A›ò¥¤Ô1zÓïéÊÚ0fjÃÕ“”©BÃM§þSÆëö>•Ýc4lÊýY¸Ó΋Øs´:8ƒÆ&ÔÇ6lùáHÝù>´}ß7âo‰á¦¤ŠZhìÀw–*Ü»q&‘-‹©Ó †­A¹$hÞì¹Ð F •» oÁüØü¼0Ëhʉ¶;M䘢@‹2 R:P™rtSƒÈÙVÀÑhÀUñ6¢¼ÛPX0J»îh¯4Ф™†K·˜-!9Wúx˜¼ÿ5Úî6V=ÂYΉí1·­™Àw™‚Õ SSA™³C©""˜”™¢UÄÃÝáÆÅ³ÍѶDá {Ñåvôó³ÿÆÃ¿Ôy±Ö) 2TBN¡‹HJ‰±áJTŒ=Ôµh ¡’éö{eïÙúý½ýuЇYA¢s4vØÕb«4ýD™\ g`cÆ]•F‚ ,%¦!ü‰´§©‰rz¦ùGÑL—ñ»{ºCál¹Ð2ïï7S(ù¦ ¡”pLü*#c`7ŠC‹š}¡`Ú™4ÖÆ¹y-5?Üc!Y JqE#¨Ù5Rוi?êüÎ…,äšW¤‚Â+5[LÎ4UZ¼WóPË6é³áú‚«KÅA E,1ulªûÔÁPEci½"ž¨ X,hlØpiM ıœwâ©4sÝWª?^Õw«¹V |l<4ž¶t‡´…"mÀ¢Ð¬ŒV»Š÷­&IÃC=j¡QŒ/µQ*?a·ð6`ÑR³eœ‹…Ôdù:Î$”û”Ý}/lõcbúŸ—}è9\çš/¤¼£ïhö2´yrø—Òç¥ã%Z˜uÜ$81ôBÏ1 PóT”5OqFÕ}(‹£u¢“cZÉIŸ²¸ ûmò;æ÷,à,¢XiÚ3H qjб­O¢ÅK¦ç¶¥Î"ùS ç÷ÌÌBP_+ÃD„ÀÑ•ˆA†BÌhõ~¾žðG¦±Ø¾Û¿8Ú*X‡~Îèý Ó¬@ÄJ#g\Œrhd¨±Ì¢Š5K (hëB]]h“†ÕÖX[ öÒyÒgn[®ó¸ÆëÿXê…?½ìœÍòz7=Ÿ™ºÆÃteE×AÔ˜ú8»Ör´SŽÌúš©zx0nMxåÓ¦.lN5…ÕRõg ñõWžžÎÝ—]+~•Ù]ä꟒Ôõ4®tXš{žwhÁ) H‰[¬˜V?À§ðªùgîæ¥üÐmÍÄÓHê3¨y½Ðt‡)ÍuX®¹(ƒ”óŒ4÷emdt±a)Ó í'r·VºõüMIY™Ÿ7auĤœ»hiwF±ªˆVc\ŒNÀ¤OÉQñ¸†Ù¼¸ÆÃ:Ï÷|¶×ª¯—Úòg¼>"¿p½4+GI‚ Ìâ b‘Ñ¢£hM]ešKB˜çÍÎÂÏ7(YWôÿüRgx¢­œ±x4¡z÷Üž¹’b¡Ú†‰e¦¼þÙ¼ûØç/ãL#\¶-KÅÌÚ|€áœëþ?}J÷tÉ¿r½Œ˜êyìÁ?}ó`ûò£ìÐîH ¡|q)OÀmz£ë±¢óy!f¥²»ê˜?¼›ïã‚[/È&°áµ´© ždºÂ[õöEa2‚í¢¥ŽÀ­~U“õwÌ\Ga_ëßÇØc{êÉ^Üì–Æ ëŽæóš£¯Ö–2Œ±í¶ç)à…Ž]Ö6ŽëT ÌïáµÊïÉ4,}ày²…ÉÊhå SØËŽ£n"˧Ü´Gç:½ŸC^ÉÔŒ×N¯o6±É´üµÚó…oÒý='ø5«±W[àå6ÐmÀí8wyÊ š;¦ž«Ú5ª1þßÇñ´{¢½Á5‚$¡5ìZãØÔ'WêýZÖØ•œaÎvƒcƒ»;/<'BH…Î=”¤CC ƒ®ŽvMi-èó·ÉJäç%n3ᮎ5ÃÍõjhá4žIüªØÆuv`|œ•Eß~ѽ>%5Ä«±vóÚŽÖíóÇŸj#·‘0!ø6³ Þþªq|OßùèÆb»\„N'­ây~òEsÜ·sÉzÜÍpì0^‹hûl¿ü#ò±¸ìS×øé$\‚=Ô«aYìP6œznå^”ýºÕHCúÀõµk~úr zùæó}ë–ã+nÌüíŸýôßο½ÏöÓÿ™÷×íÇs|¸Q¾¼„^ñšÏ¨g«¤îOëÁ7äß&ë¿³í ¼£àX:óWõÄ”I’ ¨µîÃr[Íx|úþ®÷€¬¿ÄŸBˆ«“•ªÑª.„C ­zŸ´ì-ŒŒ‹Fé5[¤!‡A1Èë´]†[в‹:ÈÑ»*ˆ¯¤ƒ)ÜÀùg„0 #Q½q½¬8Ó–4Ó´i×=^Õ9+žu1éý˜Eéµ^9«‡X¹§§NWŸG» 7T¶¼0°z:8d¬#Ò uèXïRK¨¸‡Óskýgó¿ôþðÁÝ_X[fÝW‚¯¿àã°ÞÆÞ,0zÿåÿÛKÿ¢ÿ¼­@Ú©Éljhß›úÚ^“_°²×üûNUDËÃËÎÌü»ë7ΈÌ?Qo”èq˜H¡. sMŽÑ&©œj9žB%8ÀÁ̕Š`F ÈéZBNǶÚxŸÙñé¯{ÚÉ(j˜L@ óè~:6ž¤V¡·+R@Ŧ¦Šôùü·ýõ¿#ÀgLÍ›.ÇÁñÅvróûQãϽÜ_Ïß*u“GDÑ¥¬åZ(0 m·õâjÁ$fî9Z±±=j;Éó#|Úé]<÷v¾ZÃDüX|3ãF¾’ŠÄ¥xƓҬœiw7Ùz0·›PÃ}¦ Am6dCÞ³Ý`àö»½¸0Ls;¢Û<²uÁ/è!•¹ÄU¾¥ôäŸËæëiç·W¿üë¿åg°wØ‚ Š¨ñ¨ò¶zÒ´¨ND||49 ÷xL4©R · §uîénBtb™øNôk§™úmº Ÿønáàio¿éq]\w†l¥hËb²ºNŸ«¦ôíP‰‘$iàFÜK‹yÓ)oÔ2´eœ.CÎ §N3¼#E±³±jè‘t¹Ù;`K³1—ö¾_žþáù‰nwÂÊܘ½Ä\ðLóù"ôV5sìcÛt=~îÚlÏß=åaXXˆcÄï'éôéæÝþ¨yòŽÄ£}Œ2„%¹H9v;D‘r¹ÁDùÑ „‡(t¡@»á·Œ &ƒEÐ ÛLly"`×r—…Ì‹2[THD”p½}ö~ëí—ïȈtK[¹¯ò†F»€2¹]õöЫ5 —ÏD¬‰-—‡¦BÈá„Y®Û‘¢ÓôÛù Å–ÊÔiVÀ1 Á+éIýÖWƒJµÆ0dÊ¡ã¬L¹þþ¯Z¢—–ÜbUaÔªÅ'Çÿ²[ Ï’n»N^AEá'ÚÊUˆ=K÷t¥à‰ðã|‘½,./^m&+Zó@S"—¡…Õ·ºÁ¥$ŒQ&#ƒ“ïÖ È3£©«‰'ugéZ¢"ÀŒ_¤Ò7¬×ÿþ»:D[_ˆÄ¢9Š ÇZ”I! ŒºÐ@ñb"¿YaÍÅÓµ?¥nùÜŠŠkär0€|±L^Ôæ›3Ú8IF¿«Yµ vo Ð ðZ %)]¹Ï& ’ öï9Zs·wÙ³©ýÕ¹>7¨E–LaN:„Ë$†-á‰ÞÑb%ò }V-‡yö>^­Å¶Mh–V¹ÛJ3 S€ÅéÊH4c!x̳|Ò fYâ/Æá/Áü¿îkVéí†Ü*ƒàÓç6µš>_Û¤ˆ#’fe^W:æZ ØE˜þ-æú´(³Ûè÷Ô3]eGÓ2¼Ê†ÓaÖß©Gv}´&)ADF?ü+ù)v±þZ¸Gk¾¸&ÅnPiœ.Àp=ZŽñçÁ%´ƒ2ÿàn~½«Ù8+´J&YaŒ¦”'–&ñVÕ]¢i2-½XÜÑu“>G8åÔöå¥nÍÛ†×!¿!–>«ÿ#×éO·^šþŸeú8É®^âúY÷k_}ù ]ÚDtµª†CZ °÷Ï Ë òCv5cÕÑÁÓåg~Ú$òöœ}œú¤½-'í<ÇY«ü9_I¯ÍvŸà~•V¤­‡ô¿ô,÷ØÎž]™³rç¦ÌíO»’™79×ñyyAÜ×n™”ù¬7`z„çžïÈŸsþóȧešxB>¾ÅËaÂFw$Dñš,A´0¯ÃÞS¸] ñÌáù™óKì¤Ý뎣êx0¿ÀÕ¥œ‘a©ï¯wWC£y¼‚2H+r¾3’ÝO&^O;ÙG{@î wxÌc»\¼×söå.gí,ÑTb!„Á²2çí…ö|*[œÐo‰€Q|aï/àÓ‚*6Ê@WA¤Dµ¢XJP€’®ãPÎU•ÁÄÎldIyõ†6– BAœÝN­­¨ÅU~zòµiÿ¾?ÚÏgÉצÕ*ÍÅò°‡LìÙ›ãC¡ï¼¸LïônŒÂcõ‹ ÓJùèzŠý§`¾ñq¨[é©dtr4´fë#ûfÖR¦ERõ5ý ýf®Â=³Æ*7ÒËñÈ N[óØvå:×ZweA&y£ÃLú5çšµ¸(-9îó@ÞîVQ ×ðnü ö©Ù¸Œku9Jj°ÝÂHÅÝvtk¨ZÔ¾KÑ:\Y·RaâÞpvæÕ¢Š‘ zvÇpÕçAJbÉyÏÇòÐÈÁH©†Áó¬+×¥Çûñóýû_˜oç³ùº¹Ï[/8¹ŽéÓ9Øi°*™{@sbe«(åG\ذa b¢â„»þ.—Kä[}â¨+ЋÉûùq¿†Ìf®†¯Âû^½l›ëÜ…½3/ì3%ÍíKrÿ|^ì-»nîÞ—ËòYW.ž4,w~2˜¬Ië)Á¡§r Çs0{I>"|ªÝÕà ¯nò³È_æýÉ _äcü|mµ6=­"B¦€ÍîaUE¥ˆ¯ AÔH6lƒ‹Ñb-ùÖ|µ6½½{þM{¢MØ¡仆Z÷ ûºÿ5/Š~÷™»‹k^\÷ñ׳GIé£öû¼Î’MjÁz'uým¿Ÿ{.l1®P«ã èb-jkÐH€Ø¥‹Ýì}ˆœûš•Xý‰«½-ÓÜ ·èAá„Ú´¥/úzò»Üo'ÿ§=:I u^Ýý0V¦¢‡8†Šì}EŒ0žg_H¬ÆüÔXÎÈ_«‰ù»ût]¨0m}娓iMª·òü·½¢ÿ ¶¹ñ®NÞ})%²°6á4Ž—×' tà_£ça%ÅU•2Øsü«úɾâû×-w$ûÃHÙ×­½h¼Æx"Õð"wŽp$` †W:™r R(GV¤‹9 ÆtÖ•ÇÊzØ¢¨f$Õ!p§î¥]©]+óý‚uÈ]3i¸Ó¼Ä~fóÌèû…Ê·Ïšú 3ùbuÜ(²oø9‰^bnH%¾–¿ï|jšCKåÑÊÐH ˆ¶X涚ǡ•~è\‡”§4™ü,½fî¿ìã?š¶O a|\_p”LxÔÔ¤¶åRK/B±´úµÅùõ¹5–~|{ïvwŠúõ ÙÏ‚F_óˆHÊZŸÃâ%¹µâ{£1út™±OŒê„úÚƒ™ŽƒD iŽl—ˆã¼%ŒÖ›“³ 'èpßN?†n]óyÍ6™«ªšÊÁ9kÍ‹\IÇ‹,…˲1Á‹X4 v,2Œb1¤iGg>ý¹ö/»ÏˆSñDàڗ0~@ënÕÍ•€HlÀ¡ž¢•Ÿµ5òT¿>h¤»SÕîg+þzVh,ˆy;ü÷ñį!í{{ÿîX¿ Ü|þ½Óú³ÇüaX`/0ä*°ËMwwœÃáXbXRžÂ<÷j¿¸mÆ¢UÚ¼ qïíIŸÅHÑ¥ °ØA „Ýzrâ_½Ø|K*‰§½\ûxž«Â›Òë°íVúðÈ Žç–¥òø·×ÏøYÖñNYrô2fmëŸ2öO•Ïv¨Ë·yhÚ ²AqËt•6fÙW¯·r_ÊIÈ*<ØÜ¹Nšð‘˵2ð òh6Àu3æ@íA¶±³y®AÐ /¡ð6ο·ù?èë-Û#HU„aRj€´¤1x¶Q 2QŸ#øHôã>Î4AB|•ê»4Êç_XÐð©/E©u³ZFã. }gÞ‹û¹žÁöHoFmuDüÅá¾.uZ×ñÜÙ–ü,ŽÔ\,˜0ó?®Ø4{éªwª_Ž)¹Î¶äQýªâu×ÚÕø`Cˆì±t*ꮺ ^#WO5 W þ Xiõ½XçÎ3þÁ½EÅößý‡Û•óüÙßþøÒ³¾qËö‡¿SZ;¾•S†è…øÐù½Ä×î£rŒCåÉW'›EbëÐÏèç;z¯a£[«›àS‡`õ ñã´§K8ˆX&’ÚŒ `¬/ˆ]w1Ô¶FÒÙÇ ÊP6ií÷MhrNiñôpèÏ·Z²¨J|X•ÒYî®LRß«»+ëtî­y% .ã0®Ãçô‰Æ¢ûhukAHaK“ÒÀŠ;Y¶‚í«wø ƒ==¬mȯWa¡•CRˆQ -É>iÆq6R™µße…%?ây³ÐÕ³TYÉ™‡ ²@YPfTŠ'0hàÙn œí„ÀÃ$W`¢í"&|:‰›Ü4ŽúL7ÐñÅóT{6Ç^¸}LÇž> yWµÞý}~|#qom¿óo…øm‰ßé?~‚·h\¢¾C帀úñ´öÇ8™aF¶ KäMO%úœBŽW®ûsùA*±—¸Nh’Èj¾ˆ«ÌAL*¦Ý÷3sî°IyRÛþ†Þ6µnçç/è¡Ô´føh>:@àÔ]163 Æb1\ºŽ WºÉ¶Š,ÖäËI´^Ë=p ŽUïä¨â’稓.½Àþh;¬ðÑdã´$8ÑÜ“c^8Ð ´ÖýÆŸ‘?ß¾œû÷ó=ÞùOoÿ®¶ð_;û ÝííÂwŒ9SÉn¼£[¶¤é¾Þ}©Œ|<üåÙÿݾ,÷ÝD”‘4×5À…ü¦¿ò¿ÄâOºûÃþð¿ûg>/çÌñfúñ&hDN´‹çò÷Fh»ŠPѹ·!<—Ók¤™‚¶¡]VÝÑ®˜¾ßqïpeõr¯Û?bæ'Þø ÝkÊ"hÀP++cÿ¬/畇(ƒ4•È!Pà]¾î…2©³Aî`À ’ÝBFPQÅ.¨WxP×ê7ãõ&7¢ [îÉUdòè!p™<<ºS -¤Ó y*ÌYªXßÁ‘Z§ÿ\j`!KŠ K/uÃm°MÍâòx¥7-%X¦Ìj´P¸kjH&LB™E%”¦B–¥rÂéÚbV!XÅ,ÌÉõø~®KYeÂaè"[å°S«?xýh°PÁ“"±IÁËàKgu÷4šµD[- óð‹]\¾«é©Ù‹È{L)â¥fuog…@š8¶Æ3¡á,TE¬qL_AšÒÊ”—øšÕÿ%zMS$ÞAí7`’J œû7ýÆŠH„†÷¥£ËRü…åXFñ©êoþˆYB(UÑ ™E¯Ì»p¹êDÕ„ ‰íq=K35?ñ†>Re sT`ˆ ô¨æì(kknâ¹ÇñM{ù¥èòzYëêÅ !®dŠ®ƒÏ—À)Hë±×üþvÖú×ö«]¢Þùs½´ë@T% vHI=„s  N]‹­• •2ÕP0ªrrÐDk)åpmG€p¬5óêK$û„çµΓ§8óÆõågTÙZGQÄmHM™c\Øö¡9Û¼ÖA‡ ÄkÄÏg#èIº)i-•—­t"Í5©€‰Á5ÐèjKÓ MÓJ¼Ä8Y‡Àµ.àLþ›²ëÑùÀxvíºÍ3 QV–Ë]+ù~ÚÆåO‰£ýSÅ^rD]k”ê¶åK/«ˆ²& ’f”¶LŸ£:CIhWñÖãïȹ, hKþ˜œòÆRèÀ™p9u¡ÒÊXØäP miQÂ$y¾Qöõ¨'û)i g¬œy>_÷Uß2Åÿç÷¹×Õ÷o\Ð…czþf½¿{˜u†5I/ï|½ŒùjúQÙÓž—ßÛ Ymœ‚¯ÖX'3;p±Zþ,oájødku½~—{eŒ£Q9–§è1ÇÆ×Ô€ùq½Þn4ïº²ÐØN`ý ûõí ¡_¢?àyàúQ¢÷œ275\çÎ#ú.½ÇóCäšãc€2 Î äœ5§æù gãk©¿Fß”‚Ü‹Íîc*D\ΤtËNÌÓ݃´y%ÍÛ§p¡.§W’º÷ ö{b¿Mƒ8mµ£ˆT¦¹Ô•–²ó\À’2Äõ.\jЧf‘¥žÃMœc*FdºQŠqß/«ÉÌrߨ§€ŠŠ±@£Ø5k²¤=Ó`Pk¾¥Ss‡Gq+¼Ñ“ ˆ•'qm±Ç¸(pŠ…0RÁª¼çô+ã×Mí#ÌØÑ{ëžÌ섄ȱ â@US“1ÆX$ÓVbBeŒ¯šŒ½bp¦=®[ֿ̽ônKyÈ:¬5ä©:{Ò—7/_yÒ«o·U-•¨&%Kô(ϽÜR­Ñ¦eò(ŠõU¸’Ç \9 ‰ûø±º”*RO:uN‘aH›\Ÿ1‹"è·ƒ~ J7NV¶ßùÈà¬9 ½Ð[x¿ÎúÎÇßüVÍa¦1ü¼ç'×?ØÓ™ÃÐí6µ¼\ 2Ù’%)#Á¸T‚»Š—Ƀԓ4· ‚ö€/[.³=Þ‘“Áe—Q–âΰ·c@¢ŒBSkÝmÕúG´·úžßÓ}ü¼á-öEpöá7ˆ¢¾cÏ4^ì{ÉC™Ä&§f5)YÌëÕ#ônS@ Yq¦sÅœÂgùÍ|W푯ËÖO‘׊ºÏfÆ¥[Z(B4Ba,Ba’ÔA@ç¢m EmKÉÎÊmå½ðs:¸Ÿ¹¸ûÐëèS?þ~O>êk™þZéÎÑûõð9Oöýl5H«\­*Da!]¡„mÚÍô;‚Œ&N/ÕÕž'4G<¢èzO•þ˜Ÿf$·RÊæy©|‰Óòuî>í¼Ók¯SÓEXÈ!ÔÍxóºé ¯:…¡ DJ]4¢ü«J `DÕ€'»Õû{Á¯ 9ÚÉåüø¿_½¯K<Ÿõ¾hv8¾ÏuòNÞ³Ïýp¾Oì¹k‹<¹¬±‡s>u¾oi@`H.ˆÕQb2 àâu|‘Ý÷SfŽr-«ôìaè„søjÛî¯[ÝùõËÞtUªKˆ6\Ù"e×+Or@BB•ˆQË Íè°N †Î<Ûn³®ç?€×ƒ’vÿÍ6ÿ*½S;)ë+Ÿ’…½FY›_¯êÒ·ïjwza/ÈðœQ’Nuö‹«z?zîoåîç<éÚÚ<ö@vЏ(D¤‚Ý]’QÌø8Fòì±I½-È}ºG°c¹|Ëä.º/‹@ ukãsº°·û4¾Ÿôoícz-fªÎ­52ƒA.’NS”'†5;©K Ññ³p)qî©e_ïÌxyÕo½úÉëtk¶-†;*oýôî¾xr¢Ø-üñïWëãà—d"ì˜\t…®9ŒÏoã´" € 𤋕X÷ú»­‚E/õzêP];Ók”D15I®4Iñe¹ÀÑиÙñ+ø.À%@˜]ÿ-‘4ñßr5â¤j¼g«º«½ÌA”¼$Ÿo $íªë -ÔE¬:¦m£rù9gîΉ“5á~ÊZ!y‘þ4eC—lÆÝ•qKÉR !b dÄ›{÷ÇëÇþ8芾hìQ7×M¼/ ÊÜÚĸ7^®¿~=_Oúm{¶ÇßOÖ??¢|ÊI;mFOÎÀ4ÛÀì.²o½R;ÍQ EÇ“ŸÑ¨õ뻿Q«{7exöz†£•Ù¶ÝÞdø.X“G° “iGa^#x6[ÑÙ”¬–?õå‰ÍSßÞ¦v¨KnÂpÅPI˜7q}~­? ÊTô‡/½Äˆ®Fø<›ð’¯ÏL*n?úa÷Òļ¥1“þx¯–‰õåk ¶»ªLÓç¼Î‰¡/µ8†Èq·íEww|<ÓSTýhqÞžö¾Ýu¶ÖÇfŽîGëñY×çÒý˜Ã³â|˜›‘>e†±­—Õ7ð{{¼Õ/Ä»¶áùþn)tKƒ*›Xír©°„%%aY®1‘&Ûê VPíg;½<Àfd ×ÖG.ö'þiÖ 75åÀÿÌdþJ€Ý{|K×"XQ2Χ•JovŸ a²&¬þRŒÿ“sôÑ3ÏØ_ß4ëó‡$Ol“Í?£ù{Nžà0ƒ”Ë–¨‡üHÜnáU0¹Ç£Ÿ]8L#ˆ%¬;sÊZÅлV³Õ098«3HIé¤:áÜ©´ƒqJ/°’ª2¾$.‘×íÑXo~®…i¹IÃ*‹Ÿ™òØü¡äº’ótíàftÕÁëªîÌŸÿmCŸHŒ=C]®çX×Ã~Ÿ:>¾=× ·¿úÚ};àîÿ¦¯=cA=çîØ'ÞÂPWœ-C#¬Ô®‹%fƒZÕ}h±Õ†@§MË·]cÇ?éë'þö;ŽÕF ûZëàpˆ{Ñq´~ k>ºõq},sÞ‹‰ÎžÇöeÄ©î-˜hK[)Ð9J(R™'¾aœ ŠbÒ9Þr/”A¹ªçó±pö[OüM®ŽìÔ!½’™Ûí-ò G­RÒ$Z¤ÇY±2^mûB¾ºÁ+˹›¹ îS.'ñ—Ó›‰&8A®.~S8RVçGòe¼T=ûì;´Ä_ëQ\¶Ü¯øòrW{‡3**ïŽƽŒÛü¿úWÜúxïã[çì2žÆ\+©ÐÚðé»=9í¾®=³^4`æ8‡ed{ïäXß.l¿x‹ï/Ç9}‰Çañ{Jbeåè×>îÔ?Ò—H^,îÞØ§²h,_Új!Qñ¸¦í`*Ø7:¹-–v‹¨‰ùL¼_çy@¡;ëôÕc öþqknC=¬è~ÞíÝÍ‘ó:=E$ç{rÖµ½FøzåW,.Ÿw­-OÏÝó±SÖô×Ë6/:°0™ O6õ‰‘è’±Ô ¶Ýg²‚±©ÖLÁk¹¨bS© ž>Ð¥:ÈPÍ Û5À+=hö&^·1Bëê•°÷‘"*±NõóƒÞãá̲ø–7Ïô{hû¹oÜÎ#”!Fr™{bÞcgíŸ9iµøÚÕôÛ5ù±u{{ô³á|÷pâWñù$lû#H+½IÄÆÆIÑí§ ¥ÆP´Âã¹ØÙߎA£Ù6O•7HVÒÓÛ *CˆIáçyÃÄ¥â¤CÏ”pH?¤M%Çô€uV°OÌMëÒ²ü e\­Ù¸0á1T5]²C=ó+lX8‘Ñgpžm3K)¶ÚOõb¢˜<ò¶î£.˜ EÛáÁ5‡ºÉÔ@ ×(CëɽŽ¢Ö@KÖ×z]Hû¾yÔ¶6«»¨ˆu³Œ®Ô™.f_n'Y_7·æ^þ…³ô{ß{ÿìÝúݾqàÉ_§¦>ÞŽ¿Eüûý×ÿ8ýÿï÷þWx˜üÿÓ¯úwÿ-÷÷®ÍND;ó,¬ÝŽƒ2ñƒ°"ßÇó½ÛE j`Ž ¦™Eã·CEÌÔ=óJ›4Dÿ¾#[Íù#!!ø‹ï}m¿¶¡gqF=Q•Ù¢hw¶ß¹z™þö<õuõQrµäA5­PÙ󄻚h#¼ˆ>£}EŸÁDcbu†Ö‘óÝbØÝšDÓp@¯–ûñÐË“ãNj@T·ÂƒüžÄ9  j/æÃõ|]~º5 X]-\~SÍ i²SSü‘‚!ÃiIEÐmK–À‡OW!¯T¨4*‘4£LàЬ*ä ¸Æ¥CÄP쪜_Éìû¿ã;sœ™EhØÍ…Ì¡‚PÔà´{0 .xÕ¼¦£ÎU^$v˜ ¼ü(Êêß6Þ¡·âU€;Û($w¯º­m;T{®¬ ¥dü`v#_eÜÙzSl:J,ž@Õ¬‹³ODSÌJÛøûц¾ŒšŠIP[û¤\¡X¨ø—Ý –ž¡eš`¡Pl3s ¡‰1/I;Oz+9 &=¤?e#€/öLõD7cm¦ÅÍÜ­€×A·^^š½ïŸ5«82ö„U"GÚ@‹Áàb¶Ï?ì¤zžû,ºk³û«2©´ÖäKªh«zµtnÈ€ ‚¨Ó³‚R/©‰´wòöxV4ÏAý%µ5m‹N¦4޽<ÉMëxäˆÔ æÑYxð²öÍ<³y|:÷‡d­÷ɺ/JÏ Á³©¦°pJ·X‹@,@D½N <û8—¥#®CÕãÀ‡æØ i~"hDÑ`Uµ X&–jÆVå’hÆzÞ~8‡½¹ÐÛ#Ø¥“ÛÏ—µÐR•Þee¡è‘9_ÓœØÂ¤º^Š­¦Ð4ås"†x¡ZE §–t )…R1L)–  KjÀ–»ì×Üé·\Ö_~»Â»Èý7ý¼Ÿ-“áä²TŸÄÙ,E˜!›úøs ¥*RúgÊ˜ŠµmP–‘¨\ÃÊTLÞ #"A #ºv ¸ç’˜ßÔž—^ ÉoÔ¸Oñ®B´,**a}ÕTt‰fd‘2Ê]98¥b]²‡i&¹Vt’ކí®ÿÅ͇ý«ÖhÀßèý jåÿù¿YôìŠòê×¾ÏÞý]Žfr SÛL>µÛzÈñk­BøˆGM#®_§Êܯñ-°Aj²Ñ"áuý÷ŸÿÿÃÌ6ÕËuÀeS®‘{ݱ½Øê:;ö Ï2«¼Ð­aù•²rŸ;_õ<«œ2 <±¬/_¶GÕL(BÓAÄëè¼Å¼™wsÁ+IÝÛpçu4V`‚P ȱ™C¹N¿ _¨Ýz‘O×{ê” c†QçôRžÓ{zkíëµÔMÊWAcP–FhidÅõC÷fC„²h–qБÇ"%H—„"2Î9§%8Ñc2J£dɈS_ôÅÑþ^ùÑ™=âKVëX™æû3 6š-²V€16Ã],uÄI¹¤Â€£TñªÐúa{^=÷ƒ3.† d#[uGQ§…-jO¯MWïí30|sO½ÏêƒÜï*(wâ¡aà XT«ð¼\èÎÁ½-#C£¤LSª:6Ç6À ˜±ÆZup0%!;d¡ÆZ@ú¤>WéCûP¸Â+ †p.LHž3ì!r’Ç(蔄Ò1}iï¹½üØë ’kxŸÚDB™ÌùdýK†JNyóûåï |þdwÇù(K^²YÞ-6=ÝëXXAfg^–š-•¯½b½ÛZu“h8¹°&Sœ†‹ª;ôQÀ6ÅçXí«q"¹YÛñ(_ÙX ÊQÅæŽîýöË9×HШ÷l°yý‹oHQ}d˯Ü7½Ÿkçh G}ƒDm¨AÈ~‡öÓš|‰y’E´´P YšN2Ë3šÇ¯z¶`º¡93™¥KÑ€ÔDÝUX[ÔÂåOã ¹0Ö",qÁÿi#m⺞ûyÝúÏ=°ÿ„×2N޾cžýjÊ%¶òŸß_ržsy½÷Ìœ»˜óú¹™<Î:ïùFΫþ¸q ºŽ<ž¦/gÅXh ·kÓ‡¹öD–è S‹®“0ˆØ´[Ñt5F×Öæõë×óoé锳XHd﨟ÃËzûV§Â}Ü/å°8šãU“í‚{÷ÜT ä(ck€Í²˜!@Bð+z-V% ‚5Ÿ¿|¾ÎÏy6-ôÝ~7{œ=§{äýº¼Ó‡ñ¦­ƒëíª·;‡´ž(uz÷¤w­_ëýžxòݳ~9y©ÂÒÌIÑP0(Z%ʨSó<á†wf¿ö«¿Ÿž<”•„R/nR@T¤‘ P¹rŠÏ‚ 㥉Е°³íbÅ©Ë!$¥Åñ¶Ôíp,˜¡­U^–bÈvÝÿoàîþ»í?Ñè3NÛ/ö¿áôaôáîÙâÂ^u«³›{ë¬ï /²ìÃw Õi —µÇø;o=8ûóÌãë ìPJ‚˜ÓK~˜+\<¡K4Ž Ç¾HJ! Âãö³ê.@Pز'¹•Þ8ACFÆÁÇ‘‡2‹'²®ÿVʹ¾›S ú„€085LÚÖà+J0ÂŽ##Ð5\Šðou·|•õ¾ÿÉu}$ƒJyýb3¾ÉÐ/¬«î° Á~®aÇÂÙÁ‚6d¥yÀI¹pÑLž•¬S؃z<*X…ðÈ)&R²»?>ÿl_Ð÷WßñÅ^%¦¨ €âXÊn¦¢©Š{PG “Dá¶OBef²\Hªk-¥X˜öØP½‘BŸ¬ï¬ø0ë+\¡ô÷¦ÙïÃè…d¾6}˜GDüɾ]~Ó—³‡1pz]o¯Í\Å—Ü͇=Ÿ÷\:É2á¸BÂzñ ®‡§ŒÔ2§AE*#2ÅÀ”ëAÍoï$ë÷Óý«ÿ|F…›ÑBR·©¯Œã9|{ÔŸ{‘$`¼s¬Ú¨MHƒF¶gqîÇžÿF»šÞÕҪͳƵ®GI¢|H>[~Tü ÇiÖ{Z‡J$‚|›Ìe°#zØ*$u4@³Ç÷>,Õß×4ºÎ(²1k–¦À/oÄ!=É^ýãÂ%rGŒõK»­ì"Ò´fþW“Èÿº8[ߨÑ( °…rÛ ˜I0 Ãí¸c†ÝéĽtCÊ+ W¨œ¬3*8º5þhCÎÁè…½ÉZËØÚòÓ}9çãŸ0ü†'ðLÓTæQijQ4ŒIÁ¬"ÐðÚ°Õ]íàǾ_œê_~ÉÈ}u=Ú ÅSºÄ™*¡}~OÞ^ âý±¼›\ÃháÛâJ/þ6â¿ÝAѵS*€$<äÌç˜ÀÖÀò¡‹Ÿ©‹ôôBWØ·ý gu¼FVžê:·¾b°Wû+Îñßx´µ)Jsw 6ƒ`²²,„Ÿçª\ÏNÎÚwô^ýZÇæý/ë¨8F¸åÏû^ÅFMÿ¾ü˜9ØËØØm)zj;:ºìxÂI'úŠÇÀ¥b¯="ç ŸöÅuQbˆ†„œJ™8×Ée½Àµ¨<õÀ„ãØÑ-ÈBc½Ý9ðÞŸ<àR8$ÑÌi%ÝÕWù«Bõº?Iü&å'ô¡˜b¯höŒ¹ÃÈi!êíì/Ÿ«ça@]ÿ¹ú•xØèVÿ´®+_—0Í5Ù#¬ìÞIÇÄûµ´Þ¡zté2¼ aYg®'Þ¥”D›€]öS÷©ðqSŸÏT;† !Ñm'Úê&€êþÕ b͵âH)‚]€;Ó[Ì®ïºîBk76 ·ýPvâñ˜Eß9ˆ Ô9âk·5ŽÎÍu_9”=Ö¨|ìúîÆB;Ç4»õK/Ïâ|¶1"7&\Sëã–~ñ÷¾½Õ9¢Û[½Ân­Â½¾ºìvãn“œ¼ož¾a¼± LÒ.Ù’Ó~äB$òÖ{¯ü•í‹úYÀGno}à¤Ð©:³ýà#(íPP‰ÐÞ³8B[xS|ºK” 'ÄKécï!Æ­{®„…¹®}÷c´,\Ù«–iÓ£Ýî§×Únó ÷âB窩oƒ‡Ý¾Mý@*OiêãB Êç´¶‹,cùޏ„n‚ÛƒOß‹ÏQ'îß¶oö‹žByˆÙk}‰uû·×–ûËÿùxá¯D¥ÏêË»º^}…1²pU¶»åH?š1ä¹W¤ ¸®îeÊjôÕùØ]_ýþºu«ÄvµöõÖ-÷u¡,›Ï)¿ð“ï*÷Ná>´“­ÅྉYOÖ¡Ôºvk…#yL}û†|ìÚŠÊíìäŠÙ«&Š‹8¼H‡ ¿`ùåi®ß,ÇÙÍÍgz é`çºØè©{±ëYÙáRÏäÃ.š‹çúÀä-}ÉÞ®n¼n1ç³ùl“ÜÀ g°Ì£™èHt›‰ok6ZB+™¬\ŽÖ€dÝVÍ šÌïòòÀ³=ŠÍ8¶ 6ÌÎ,ÅËbµ"k‰ÈmK+ŽWoiQçs‹ÁæÒµT:  ¦Ã,CsãÇØdÓl­ë¸¢r¨”eÓ•&?Øï·Ÿ¿½Çgvºë(W*繖͵ۓ Ö6GÚx™7‹_fýÛÒ§¿h¿ØÂšŸñ´ÿ:.ÿí4ÿ¡>úïßý?ýÞÿö%ÿ}ÂÕ›Îh{žÿÈ¿ìטù?:ûý'ª¦ \¸ÑÁÜWÿ¤üw¶ž’‰DiÉÒ ö1aD…S'úŒüS0¯M'”t°RðŒÙ6¨ièÔ Zú*I B0„åbcwÔ®´¦ö$d]praNL5*V€ÞõêÄð¼[Òé¶.uÀÒÀڛƌÁ E Û0­áÔ š\SŠ˜0AAQ #ˆ4ƒ …®üí÷§‹7¬[½I“DEÈ¡sH'«Ž¦¸X³˜ ½8Ì y4‡È2¤¤»Íh+è+˲é :3•Š‹¥[šÒUÁ21-ŠŠ@ ÔÂ"Ô‘Q‹Î¬ñ7ÞµrøDŒýðÅö'ª¥CÛúü¼›7§byÎ>êÀ­a5OPÔÝŒUõ šf#ŽÜÙâËkZ"×júji¨ki—†±T¬ØšœÀg;>@Ù=P>Äó̘ÁÊ‹Jßl9ó…T|þg¹OèÊ ƒ‹ž,.–ª’!ÖÂCE0ŸÃÝBd,ìMëÒɵð쇶²›ÍÑÚd6PîJà–l=èÒ±-êbT¹’ØÆ¸¸f%ÖÏ®s¼ëçËýͼæ—û5#UÁ ½ÌÒ–ä lÍP(î-ì>suH­ë`}kgÕéw}ÓÙË“³·k]Z½×}·XÀÒ¢6¶)¹…hOæûë]ë ÿR–rÐ0ôA˜-Ë]êA•‰C/©R X`HaëÀ¯øù5îþP冒Eñ ¾j u5•¨-bòˆ ›s*OZ£PÜæÛ”íºÓì'ÊÿµË?2üùNýñÍï=µ£x5£©Oj{]œ'÷ûùi{iŽͲõÈ=Ü:ïuª*â 2` uï³+-´ÀÄvpÞ²4d¼v„æ«;:¥.vUÐjέmû]Îró¹Ò¬Eœ¸†È ÷«#‘L!ÁuF úR—KÖ­ a$ƒhé~ŒÝëwºûçúˆç+¤ê»ubÜ!•9à/ÖBö¯œ?žçQ£º³f\ª§ œe¹U¢1j$ (¸‘¶ˆÔéUœd¨²Š¡KÖCã¹Éæó$ö|–TÍüjùÔ:Ö‰àˆ'ö•ÈJR€Œ™kÙÑ €/dxçÛ|<ôÙÿµsšõ;®€p¢†Õe$¤#KÓH§zÓ 1d¸7‹ Aˆ±5ºzérH*“T8sq°D48(y”M ë.Ô²§ÒS‰ÛMT£^ÿ7¿ý‚÷ªÜчðJ1b "M´BžÒ]¹ç~¡ç}˜ŒKõˆ¡“™’ARüŸ½1HŒ4¤4²jØsùÎ9ª[ÖÇ/ ¿iÏ^S†Ú¨÷àÕJ-Fï‚SÏuùy vw=ÝGÄ˜ËØÀ¹é;æ×{–æUø#‹ôüâüf†¢¶;îwøKÕùl~ôæÁûËïù³ú§ýßë'—û“cß:6æìWÛît9Ç6ºU}âÎÍ–8}ˆ±¸µ8y«p·YŒÓ}ÆÆ’HÆEïDWý8×·ËŠ2"OS e溫|âûi79dòùiÞÈA»¯{³[lŽZKÐ ¦âÊ8å¼ê­AÈ %áø‚dyÛ—âç¸7£b* ²¶)i%a×IÙ6ŸÉ§‰¹‘mKSddÙSÇÓÕ0Ÿ¶]ƒAfJ#ÿ >œ÷@È>ÌYvŸrŽûšH͹’ôªÉ{ùŸûG?õèÕ©ápøí~^q¾}åæ³/è0ˆÒâ%Œ•¸­y.<Ö{zl°j» “mRTˆ·N9V‰@ Û÷_8ò"}i1êÒ/õkÕW·ýµí=r{3ûCþ q|¢ùÁ2éÛ:Ç»ì ow<HKÙØ{¸Gåý()|m<ßçö£qÅB*ÅÆybWŠg•ÃÀQUÎÜ#Î.½uío}ñ7£ßÿgDV4L‰Xa2,'§q„ b쵚õ|~–‘—-Š™“NK€èþû™Íü<*, .ûúBè|”s(E\ð&¥a%tl«}øç}Ór+/qLñB‘ˆ] #ŒýǃMÙ7 @u^ßôöWÒº8:ž6ÒR¦6 ¾3ƒ ®ç†d{A‚)[ܬaÎ fÿ$‹ß~W:¼ý¥¡'y‹iç©CÄmãaáMoæåjÏ+ÿVÉmºU,P$A>jøòùY»qð2ç×È_à¥1‘È©Å}è†÷þõÛªgÁ'1¤5fC *´Êµäì9õ#PÒ ¢% 3PÑD":¦Ÿr.Õbðˆ'é¢\w$ŽHwi®§:Á”˼:Ý÷ÈæûÓ³_ÛZsØÏÇY_ËÌ"÷&g¨ãÆùzI¶\üºŸZÕß7£’Ž*xe#+Æ€«ºBY[W2('Åo5_[õ§‡û}ú9;³ŽøÃôDзõñïñ ä‹ß§¾vnRË»<ß´øºwþÅ5}µCw|ä‚Õ†€(XáÐо}q›-…"~BÌÖAH´‚ÓÖêpg—$Ô†[ådtOÑ—;ª© MÇ©”ŒZ Z ¤ è]ðš0»ýÀŠŠ<>´„fó8`Bq)XÐè‡Xja-ذ†3^úã2ÿ®ÉFÏ¿DA0FÄm鮊Z}ú¤dÏl`áLj¸@¡ÓOÍĨ å¶KÑG£øG30׊ n*.—Gñ›ûöw {–å-˜âi”‘ã™è¹È´9T;ØÞv¨ ÜÓ ª«ª¤lÔø¡+B)G.YÐ3­> 2dûv\y®iÂÙ*ˆ‰ ™pëVp5ó-ß½m¬ïý:Óî†@ƒ°1Åàúv-¶úÆòcÛÙ2‘Tm¼& Æ“j¬¿¡måµnŸ¸Õ¼¢<…çF¤l¦aM“m@ªn*VÔ¢²=˽ìÓaÇS¿Èã¼wçGÕ_[c²´TÙ ÉÞƒÞ¹qÊnGu´&zÎîª4>‰ÑFíý¯q-­G¤Ç­ØÀó°¿äÂaQ"iyî’/¶ £†§‘Q–PÁÐþäó0Î5Y­Ecµ|s«Á”gb2(ÄêO(ãE£ŽrÑŒ;›Fd UÝmÄ Å­ØœKް9Ó]06ȇtº¤Fû$pÞÀí9JZêùU§¸ÌdñÔŸFΨ+ùÞ§½;n0$8«›ÝÃ+ðR‰_“ÌУáö˜)…J ’[Xšn µÈ~©øIÖ-ØBwGcÄÍÎ7d‹îqÛÛD-ÄšúµÁ´\'«|L@Æv‘óŸlÈBÞ¯®§êÓ'ži½»oJiÊô6ùħÙ?kÕY)C¾VÓÅx±Ö÷¨1b&mlßÁ=)Ú;v ®sé뀟ºÕþ«×æëëÖè’ªIY¯(Àgé*8É'îï;/ëÌW<¨è…—1n£Ç]­¤È<&ÒQȾ֩ìBxXN¤OûZhv˜û—X÷7¼*]õãÌS·2}eîØ7F%2ć"Ø-OxŸË¦£¹UÌÎd¹ƒ¹NŸKh,MN³\…ÈEG¯Â隀{Ä‹ÄÚåƒï’çºJû¹{Jȶ޽ÝNñëaÝ.T­U{îݸ²·ôó}Þ· ˆ„ ë;/ÛÀÅB5©*ЧLEíc;Ün¿º½ y ÜÏ0•ÄÆÑÐÐ÷ªª¤XíÎEwIù’ýµ»{+éºîؘGkêܘ»ðÃkhÝó숣n¾ÛnëcX:ö(üòQ5y”SØÝ® \ EÞÔË®£©º¹»=œaRÔ8EoèéÑôΟA~<ÝQ›}èeÊ~㉯î¿ß7Ù;äá |ÃlÚŽÙ×ç[<*VAÀFW6SìÁ¾QµÞMÀÛ]:Hê”,©¤ ®jG¤oàz¿M¶57KÛåþ•^Õ}›ßì9$G^±±l‰‚.䯵X¢m’Ö­Ú]™¾>¶šC~Ì„ö¯­[{C–z@= Âçÿ«f溄8$Ül27ñ&‰†ûQ£^¦„xí²ÌOeÝ*R¬¾¡*ïÙ.3±N%<ü‹×ç³Ïޝø œ7þªVäÇ®…òJZšãf{fîǨsÇ[KÆ`Î+ÂÛÿAÔ›’öÉ ×Ôn|PÑ`8$‚4Ç­\H–ùbSY4!±u\Žq®Å"[œ ë£Íèõ-‘³®.‚ÏxXþL;)°k&£tú™ìÈ;l*¢MûÄ"dê.‹ ›•Ó˜H ¥¨áV|xd°7ÊÇÞõ<Í3Š4˜‹´ŸKûÕ8ÆÇWOªÙšæÌK%C±{â¢u:? •É84ƒjUPAvûÓÚíñÅå—ÎýÏOÕêúxÆ ¿A»¯>Ã(ì¬÷½~=_gœï~úÎæ¯Ê²Â¢!©õAêWÿ¤&üù_™Iw»s$Þêãø@nö²êfÅ£šã¬jÎ5ú ?ûË;W[S'¸%8°¦O´,tJ’–EqJ{á&$« rMLU›‹|·²ïé•ctuöÑA"µñSkÎî¾W¸‚4†1±ñ…ÄÑ6 ÷Òä€)X]#º‚cxª MËu:çKÑÚ¶î½áN£;îa·!KH¹,Rʔ絸NP¼-96D@×M¬½Çâ`0I¡mGbƒpbÉ"Œ´!A±ªYmD0=NaçàƒSâ0 ‡âq­] æ‹×‘9;:ÿžŽõɉÐC3íÊJ/u™ea°f¬\àâůîlOÓ%»9}±‰Ì@[¼8-`3+…8Ì™i\¡a.1y\žlD‹¸²ŒV3DÝÐΔ©d°œ˜c@Vä¡-p!•„Š`Fw¤,iñ÷«ÍÇiÙ¨äÔØY†ùpãÄjON×MŠaÒèØ|!Þ²H¿p𡪸ì4KêÓÿáëü%½~Ž~M;"ˆdlhƒÏËC{V:ÚÖÌ_·¤$ÛkÉwûƒ+?ö¶ëå^ÓûüE^j¸—5=ÛyD}U(’ÈMÅB;àëóï”kÝ6KRˆ+•íÀvߩ֣9¥œ°Í`bÒ˜¨·ƒÜ¶1Ûç‰ÿ¾Ön›6œjŸø8\ýbÕÊáî’(‘ ‘–$ä,Æ2pÔ+„öuÁ«ut%f’™Ì!q é f[»LÿÕµü±Ôî¦Oœžb‰\™¹ÈŽ CšªÈHÍÊ‘‚a;Ñ$ôFKH¬÷',ýìqv3‚`?j[Pª­@H€­¥š LV¬w…[¥MØ+‰ÊÐÛ@•થ‡KÀU÷ÞƒhåïÂ$ÿ^/9?W^†PQV´P’€áF;X%uàJsÚ°•´¡šF ÜØüª2^®úéJ„zd=ÖoY&œ©¼Kܸ†‹ÈÊñÂAj¦b7·„ Ì[™eo$ÉÙé‘ëo=ÿ‹–ÿbãõ3ü×Q3›‚é-˜®Æ«‡–=×_ÚAì7¨c›S s?/¯R2â uMùðP—œ_£ÚF ±±=ˆ¡†i%‚æ*‰ŠŸ#ßS¹ÖH*ø”KË 7¯^jím¾· 3¦ÑÜÉ]Ï%·ÁíEÈJ*ÛÀ #£N©.Œ©ô#Øñ ÙÌ)³9n0 SõÞ¨%ÓvÎûk~^·ýXܯLÂ1×Õcüd-rÙœ;så‰z5XÓÁS\ ¡û­ËÑ’ÈHyb éÇÄî³1#Úšé<Â|B®k)Ög‚+“ÿ;]KD§¡»¢°½ñlœ¼ ÒªÇ€j“å;ÍÉûmÚSý~ »Ë©ù6dŠ˜HÇéD~AQÇÄùÀðÎØd™«¹…”^°‡(â≣¾•º*/;–C³b„T™(RjtCÑkû®„¾ÀvïgéõƉ»ùœç»4Ùå¼»Lg‡‰ÈRÈA€ëZÖ𶜢û˪Ÿ‡§¼›6©¥ÍUQ?gÌ‘m,s6,EZºM“R-ãÔ­õétsÕC )]Q##Òx5®RèN§Öq§wlaXs…@´ùCçÆºîËßñæÿøó;pþ~™ñåŸ ñeÊÅÆ.q‘ñµp¡t¨bô`sœ¼xa?Ö8ïÌ/®RðMVÝsãbG™ª‡’f0LÏh-V 8ÅA&ðH3¢×c¾Œùjð0ý6'% ísz5Ön¤¡)….o.TúL® B1!:¨‚»gotªfkBJÕX1+(dë’ >cŸq@(+†0±IØP;k@£.-‘©!1¹&ù{%f²?À-‹=Ñè“{žª$LìéÏó½oÝ;þ|^özÑÔóå¢)<·nIã/& t;Àv)™‡wýËÿ¼Ÿj#nTÕÂHľ˜±†½&…Xi×)i*áõM=Á÷é<Ûä˜%]‘JŸ[ãåúy¤ýøp¾óuòé‡9S¢1%©FܹŽ× “ôe}Mfå×ýÔhP¬(@˲R  ­<)ðbÖ)úœ÷MoßÙëº×F×hserþÇ7¾[ÖÓ»™·{\ÞŠÔm#ã}že=›·ùyõ‹Ö\Ï‘5Ã| 846ôÛ/×£Ïg©¯j|#WÿWÿs×@Xô왯¡(5{½} rýã¶þ¤y.9<¨¥å~¢‹Ä.ÐÅ@V©šu%8ÅÍÓwqɨ”üÅ1CšŸa¨Ô’nõÏ5°”(c¢·ïïûymõÆŽ#ž¡_v;šýþ¼µj™O`¸½“¤‡=ÄwOþ„v½‚Œ½Nu5^X'³“´uh¦ÄAqjñ€çq‚n´)Lg—­[HFq’¼GÆÕ¶Ixâ5.šêÞ³çܘÙöño¬ìŸ·ù«ñš‚?JT¥e7Å´,‹8´®N°\ cZßšù`¡>Ú¤£“™dôðեǷ¯ÖFÿŸ•=tå6_¼oÆÁ‡YD‡pD'(8Y•iZÛ€[L«WÛ± keÕYa?[ºÈí ¼ûïr²D;$©eŠWLM3H ”H!†BÐYR‹s@¯¥3YP÷ýõŽf¯Í²­L]¢¹ò:Ç–Iб[ý̺ǛÜV›až¿Íã­¸^»|ý~>Ùóß–rÛ'ޝow{ÿš¿Ýæëc7cÙ»uf¯ÛÃã0“~Ñ+8‘7×p€£žjÌz÷{}‹Ò€ùŠðn_ùbç;?­ÅòÙF¥ÍôŒ¶Ù¶{¯û»éÙwîjÞ¶a×üä`ë®|tÂ=¨š{µÇ*7‹Î†/ÔW]E¸±!L?ý@ £°¶†úÆä]ÎѲ*|¬ñ»iXjÂ+ø¯{êñâs¾ˆIpÓgõ¥YT¥…% 9\}Jc7§ÅHÛ™!±Õ\ÊÃÛÚúÏbùóÍu+ÉöuG.#v 9â÷³åÈÃ^35IUûvp”w°õxÓJ  ˆPFzínÒm¸EÂ"Ú@oØV JkFan#Ë,"8yMÌW—gà}žZ¡Y¯Ãj&åèÜXËáucÅ+Îþß]æ†z]fY¤ÃX5ä«¶L$[ æ2ÖíÕ7ßùR±²Æ2]F„[ MX„ µ›ÄÎäÙîúÑl`/-ï©djbÄ&dîòù·Ø¨ý÷Ço>Ì¥/­· mxû[à½ê]ª]ŽáfÍ”ÅIL ¦z€õiM#]oW}þ‚ëíïðavì¶Œ³AÞ™`ŒÙ®£¦}•úåc~¯ªù¦/4­k¡Ôè•ýgn„íeù=3[ÍñÖ2Ç´¢Š”l„zbtìCÐß®)‚€gŽGj@æ‚RVOUKó€/}þÙ½óMÜ7ô6ã^åáO¦ñóEBWÔ V-Žú£GhÕ¡'à³ô#¶ª¤0:¯ÌïEÒó›÷ö+9|‡ïüÅßËÇÍ ³nÇ5“$IŸFühÔìùÓÅÖ8om Søêþu¹“pѳ€0c2’—rMÅô äîúÍBÝtÕÁÚ3ízb[Xg;¥˜´²MX÷”ŽY® œî.ÂA™* 㯪\«\³Þ©œê¶5øäûøÜD¤ã’ì:vÃ|è²øiÜ#ãôˆ¿•ëÜzÿ•çz0ø“l,ýÿS/ûécþxüYß»wf"Uû¼fÇtÿÚ£ÿ˪Ó'æh^#:¢µO[¸rÝ®?NÅãí…ßÚ‰yÝͨ«‰º­·Úü•Tˆ’i!+);0›ÝCôøàbFÂYòé~“Ýï‹|´pÆÛ_2‹®yp¥üâìn°2F÷.ûÍÕïyg/åG~6K˜òÄÊÒ0¬„ÍŒáý¨P4“®X¾Ïëí2Ì£@ÍBKiù€Ì?ÞQû–ßsɾݫmá‘w¨Iøj|&ä<ߢÐ9yú %Ò´Fû6QÕo]jmÂu×çZwu÷µ’s¿ó¿ño{õõ,oH®ʚ­?ÄLÙÀCÒç±ôéÔ^?6v+«w^ ïÄúi­Ü…Çœ}¿âž3…žÈn¡50ô/œG¹xp?·%?½¶EzÕÓ þ•^ü•¯¯Ì=øý¯H\I;Pfžkn3V*°ØH3­ å’H–­ƒ²”U}̰J šáBæï —cG.$;±âWÿyã¹[õÜx=þ˜ۯÝO»¹Ì¸\ÁϦÇÍøBÇm÷ØNÜVmSh³*ÀSù[‡•Ft¶-¬1°`fäb€5ëQõ£8vAíUÙ¼UwáÝåWÆb±*ÜÕÚ’ U6-çGqʻɢ5¶%óóšÏ ÔØéÍ‹ö¦ÀÓN?Fy•=l}C_xUÕàÏVjwÁ|a«Š>_½êeòGx ¦,¶èMrˆjÖü ŒÞRµ…®üðâ3Ì»«ÛiOžÁŽb·†”˜®O¶$?OÖ—Þe}>ÐÎBÙŒj¸Gm£À#zÓ«·-5ªÙå–ƒñȨÆC¦Ö¡j MÖ¤0d5ȇz‰]9!džúbæ¦ÎmjÇ„\0LÌà°Än6:iÓ+ûž!tæD4N±ØJð÷Û¾ÔË`(CR3\<¾rìÎpH¾$ÉLðU¶¡‹ôgI¢„yÞde‹c›õ8Êà]…а,t’«.Mzð,°‘µÈÂÓyF0ׯ ;ÐVÅÕ‚aë3ºþ»«½aè~õ_D”q£7K¤~ü.ãÛW½)iÒŽ$‚ŒôËV–Pÿà‰'ç¼°¾VîƒüŠÒÔîûÊ<“ ]= žä¶o ÇajÂêb J jÛª´¶‚vz½ŒZN©j¯~„î_NzÂán÷¼VgŸ@ýqtg#ݤ “›2p«, B»(…ƒÂ5¤m†h‰J¥…9öZ» í÷쨅4Í3ôŽžÄrÕ¶åéëßÊØ4™­˜a0Ë5ŒuÛ]¶ÞlSLˆ À –¦íT¡ÙlvñPÊ IC#€a*a¹j®Ï¦2z{¥2¤yÙ‡á ¬a³á ¬ÜeQ Z€DÝœ.ºP]óR¹»ƒBÖ°g›¥ Wö^ÊéWºïjÌ×;ûæÂwüQ¢È•†¶åU?±²ûžaP€Õ[bÇhi‡zUn‹ÙÌ]1¥‘IÉÂáFbjƒbËô‡µžPqÍ“g/L›µŸ”žL r}”ÍÄS*ƒ`éŸéÐ3MáVè³áLÍ7]% °X±$J +š 0¦Ko¤üøÊw翚Ïû݃àŒÓÐs{îq¡hºÏê>¯´«Ã…±òÖ,›¥\T¬‚)ŠýX ûQíÜÆ÷Y|Gû¹7ž˜÷!ç»qÎüõB@ìˆb2T€k9cˆUžÞj`ÐÕê³TõB“K+P¥±ŒI¦`Y”—Z{ýÇ__‘ÿr¬¿5ö8ºÞ~AÞ÷¹âÏ")æJIEVdíJ:^{¶˜¬ Becçìl“]ìëÒ0NEÚø9Xzõ ‡¥Œ£jHÂöxÓÙ(=š¯š ÝRñ9€JAˆ" 6“D&æ†*€„¥"Qf ´P‹\|0w¸¸ØÀ@"74`E:P-QQ@$qP)j Q¶fV¶i{"ŠSf–ì¡¢…ÿB~þmtü¹ª¿ e±þv÷h'a´{h ÒPd I‰¼Àˆq˜´‰é#q'È÷†÷Ž×à½Ô¼ )Î~g°1Cö9VÊ 4€0W-ÇmäIÇž¬ÀR ° ÌôjPFW: L¸]Ɉª†¡À#^Ûuœ8r¿ÿáy×çí~ãìOŠÝéø\®‡•]}õÜŸÝÓÉã9yîþ4«v`íê'í)¿l‘û­)ŸOõ¢W©¤"5î‘)=XX&ŒŽB´%`'][9¢Q^QX,[î°ý?蛵s2>XvÍwÌóø;‹ØjoL¹*d¸Ðâµ^Ûj¬VL$lR©‰!Ǹ×9ÎÇr‹°ç7¸ËÚ{g¹¢ÊCr3§· ¤ÌLÓl¢2@¶rN§°† 8h(‡µ† ä¨p˜^ÓÀÂ4³3»KŸc1dFL—Šõ×Áü¤¾®ãx¸“ªC@idgEJô„«Œ0’ò’¨A‚ $ØÐ›qëÞ‹}]ûÙû|ÏnOú4†u„’ZÉ•f^cÃqG7G[_&¯ÜiáÕdHJQà¶4ñ<:±YïŒQ*\ÁÆAl¸ñC'BèôîFõð\ŸUù>þŒçÁ éÊm{&»„7€SËu¼ƒ0´–7`…aÌ^žlQ”0•Ýd+cc¬5ýárÏyn—ã°grÄ륧FÛI•ðü>}o»(ª-¹Ì2{3êRAÌu–àÐ ëB¬áÄ RÃ/ÇàWPŽ&ßÂÑ4 ðó>=M'­oÏö›h ç÷_›Ïð™•Ë2Âüü›ÿòù ~=çyqËÓýüôó«V˜>/©aÒ(”þêÃøE ¨Ù†¢_•}V{vtßÛMXüVVÓ‚?W50¸Vé­DÏ®»!6 Ù¹ çȼvÈ÷ý(Ÿ¯q^¥“sÖd9—¦v2f5Dº uð)D¾Ážîy‘jØ„–˜Çè`öÄû‰š«s'“*/ÛŒ JñÄè lT´ˆªÔî ‰FI-ÔRW` Çÿ;êÕ rGý¿²ù›¿Ñúotùokb¥qžô£œ2º /;÷,µÝN­â:W#9Ú:VO™ƒÖ߯ø¤íࢂÞü4Ðôüù’€ol®}ZF4¥éJ¾l_~Aî2ódqßóçÈR½Z}uÑòETq¿#Ý8<·û6Αrþ`Þ®ßßkx׳»×…~­ùö}oq޳Å~¼Ñ9º†ÝÈóѾÎz^‹÷á|¿Ÿ±=Ù–`’ν,ßÈ|‚æ5º¨eU|î—ü"Ö¥é6÷a¨õH9‹~3CdK„:Ëb Ew6Ô3+J”‚ßúmù¢œ×£Wìœ[ñ¥“L†‚|€°¥?Rÿ— µGì~®VÍlî]v À°Lê|×Ö·azÏí|.ì_p=pÏÉXáAPÓbäÇâÅbRñžc]rò‡Y¿ÖÎÿ6ÖæÁW¯º¼öêÅýŽ™é~)h+q¡GˆJV…M($ ðŵ4ÙÚÙ%¨Üâ3ðP a%‘‘‡"ˆ,pŠ…üÅÚŸìsÉX³,NØt‘Djã Ic³QJFÖ_-‰GT]þ€†³™Ó1vå `ëe9àƒ2BÜP°5,Z \n Q$Š!,4±á$BŒºš ‘B­¡„­IÕw©nC¯V´ëКm£Xðì@wïWÊþՀΦÖ6Èb Йâíflm~<)€oÃXÃ#ý[ÒV¯ ÷èàfãш²ÝƒúPÖ+3I,’pŽŒªz ±4ìe`¨´ !§l ||Ï÷i"†·i®S£7öé»Í–¸½nwTP˜¨ç°ÿÁL¸Äx›·©:,Œ?4/v¾ªÇ—Óÿ\ˆ ²N±8Ï^ÙíÞDؘÖl£ŽëÉíqöOÿ+¢åßýÜúl¨A<0ŽÛVs†ÌÌÏÄt˜Ø’ü­}qiáØ7_ËçHZ×Áqƒª ÎÚÝ~éÕãlñt\ðþ–@gX 4 (ˆ:Ãö|IºËhé0A5›\F½]«lÖ¸™x™‘FuÎV=DÎq'„±a*ˆ ©Ïß¹ú ÅÓëîÙ˜@ûŒáãÊèä4›ÙÅÊ~¾ αxœmµ«Ó´Avg¨›el%ne¬¢mö˲ýœû¿Òdf6ymÖ¢ _ßøÝW*ÊL$¼†‰\t5NE‡<Ì×ÿ½ßÂ]߃›‚5Ê]ÂÏÕ—Ý{‰ë ÷X;ÖíCò~€1õ­þÃÁ>»;[g; &­¶Æ5vnÛ…x’×RWžNOÝdP81WÈ_hP>só©ÏºŸð׌ÿw{¼ËÖ„mÆ…æ§“ëñ×W»‡¸°´à ·ñ«Ì|®bÍ eIêÙk¾áx¼g‡»Í·ã¾³âËèïïIë}Fïûwõ˜íg<"e^ì­OFá%G¾/çÅp)`N­pH½›­Â;¤MS0F>šŸxPݽ¶Q={ö[/G' ÚÛ^ó—®­}¶»±…šÜckÝ'®Dµ)ó!ÝK®¡­MõðÂyž‘¦Š±Vi€–x.@D[Ž¡7ʧ\ E° v2ap@ b¸¡¡tô{Û }6ÊúÚËCÞvçÝ€þ!ØÍð"¶‰%bá|L„Ý—ña&=Ë{AHªQŠB‚/$lO¥mµk$œ R‚èÙã±)ÏjàUZSì¡åv5ž+ÚÚÌþ±c/×½s¨€$!»”Ý0¿¿áQRØCÙ¶yÁ9Ž^9»æ$X–uê8k§¸ßúgë_;ð²÷:9þòç2Oï_ÿñ¯<æ^ň¶~ãÌÖ<_ºyê{ªÒGºÖ¾FÔÑæîü9ÌýÃò‚’ ´cÎ5rŽK¢±â¾s‚ðMHÒˆ·ì%_µØàWl­Oó£pcR[yJÍ~ŽRŸ™½˜rßsÿ±·N…© a^ïÒóñ²%ÙÛ˜´? B¶HØÍ!Rôuî¬Áܬ!ö 'Ä«unJßÔ£ (<–OÖ„‘JM‹ÑÂ¥€í:JµÏ NX=Áä!õ‘œW²oD”å·ârô@“jJ1Fa’¥ÂRK˜`–ä"]J³½uwóGÍKÓ9ßšZ º=JóÐé^™¤u*CO¦Æ©TÝŠÚL )Êœ?]§ßÞ .˜{ZB.ïjšþä Ÿky ã‹§ÀEMš8˜W:u…Â?¸W»ÿR–îéª÷¦®Êµf´ AýÿY’.4ˆî&6º!ù”[àÇ&Jvqi-K” \ÀL l7Oµ…Ç6e™é~‹ås«A—ÕðSãb¢ØíÞ˜]‰Ç£›7æ¤ØŸOóDd` ³™@$B D&Ù.¼uºhÎTx-ÃkiÅÓ±V&³‰"mH94eÉ<ÑÉ«+¸§¢ÚB½„©o»h„qƒz0¸¬ ™t€ùb•›ne«NTš¯EBsà ó¡BÌõÀU×É Å\R²<ëàÐÂMŸÕÚMÓÆ=Î ¥˜OŠA«î³ÁžWÊ*i¢ `„RæR!~9y[+ŒšÔU!MšÔSåû¿j£ÀÖ|U×m‡:S9êªt‘oæÖÒꔀ]RKVólg&s÷ ÉFÙ69&Îfy]©DBˆ ¯ TëE¨(ìorîötB/B•’H„¤Ð"˜¬KÈLjK»æy»¹T˜‚E’ïÐúM yV‰&²òÓfIshºÅ_þ'¯¥?ÒÊ6çr ¶c×ôþà'yÛËËV(‚Šª\ ®`WØ)^ýì*Æ*$ å­ô}Ž–Þ¿ò®”†Œ_©xK½fz}³>œ)­K8‚‘`ÀMÖç2ÅTl bÄÊ5ŽõÙ®¾z™-]VzêÔ«> ô_Íü—#õ·ë³Qr¶0Õë¯t¾¼Î®v£¿ý_ŽÄ…¯ÖÕϾÐ+£5ƒÚ~nÊLkàå(©|Õ¹Ô‰0ÌD-­qñ’¯ŽÞ8ñfÄæ0ÃSß7©Ò1åf­|>6·Ji…¸â%‰¨1ÀFA ˆ—DwŽš{ȽÇrVK1)è’„(A¦a®c¶ÔWúÑÙ›•ë2xé„p,R:£v Gž¨‘€Wĉ­ É )F;pT;hóöýýjµ‹}¸ãIH½ýþe®ÿÀ7] ÎÚB› V!¥“ÀSæï>ô*5£Á5¬•t‹,9î»k`òªñ—†ÓøÞÇgëËÏÑÎèv‚g§í ¬€r9•¶é¾’‹$é%NÛ7L4ãsϰîz[aõQ9Ñ¢·HeÖ‚½ÆT/Îh)½”‹ìîúÍ·ÿïÕõ½ú2Çj¶Ó{_üºÃ¯Ï[ÿA,‹*¹õQ4‡ÛkÞ¼å|E‰ýTûUrìKé!q  Qéƒz$Rú(wávÿâîøì}žGÅ\S%20"àC|c¯ÄÐCŽÐ’azøÃÕîº|ßgû˜3¥[ÿåš 9öì÷X­3-ä­quŽFöì€ñ2¨CTš¿JŒ¡¢Zóý÷º¼/ü”4•x¥E®X]õŒ{8çîóÍ=ž2Š^{Ã{á6zÅОK3a,·”€x¾†W¿© Z ¦Q¢žº2ÏÎ`Yóº À…]‘Á‹(ƪ) hŒ ƒ¶è°Ê^gW`Þ™0úR)+:œ-=èÌ}‰ácB&SÝ^9O°"²%SN$Øí¥ù8¨ëÕu×qˆÓ‚C ¸&í.Á”MZ˜„)¼ÂˆÕZ„œ*3 B(^´Œb'» n;6 pÛqr¡ý ¯šš F?.ß/£ó+qrÿŸÝëcμSk?Þås!¿Þ‰×DVUým·¶è†_{óiY.‹Ya.¥v´Ô²I£›º•vøTèÑÙV´·ðÒo3n3xÊÚã̆3Ï#F}Ñù/1=`ÚaqL§/ž~KÙqy_gÏjTÜ8µ×a™x¿Íuüœ| Û·íøóuhûž ô¬À¤'‘ÿË9—SLësHuLÏObõ…› Àýö÷ÑÚôÛë‘_§‹™ð§ÿÃÇàqZÎò“t[Å ð˜côÛxY=þtþ¥‡j2¨¶ƒÅ4î)Ô«9 êÝ0×ç0Ÿv(dqN &QºÞjx°Ë¼Tº¤%ºàð.„¤O‡¢é¬[.]¼ùÚKßö‹ÓV2† x%š›Z‡Ï+ášØÜ‹i³¹€²ƒõY£7Çð{ƒlmn_òý%yWp–ìG;U<¨Wu"ådÍÿáÃÿqÿ­Çí;{W¤BóoqGùõV¾ìõ¶öò¤(ž¾:f° wùþð‹Ê;œdå6Ðú‡'`!å‘(j Tö^þb|ÃèGÆe)"­ Ñ¦PR`ÎíÞ½[•àƒ¨ã;mlóü×þúÊoªŽÓe4¾¬ béèO]* 68i·D–Ù nŒ—‚—¿3Ì'A¨ÊþîÇÀõpJªÉ¤S°,$ãr VjÖVï6Ñ› Ãß)@F¸Lªæ°Ü"i˜ËÆÀ¿Hw8”B¢¸FÕ¾äV¬àˆÍ(& lÄòÙÎz1j]ÃÙ‡3M¿­8Ž É‡`S‘¦ná(b.ê“,Ę9ßN½éEÂ*ói‘'A:Ö~*Š~…¢‰¬åRaSâ GªP§CÕõx¥ëJìüXmÕ1Œÿûë'%_ž;—–ûv…ïOWjM빽ё‹4Ö!¹+Q^ÃÕÈõ›ÿ¶gŸâjƒ¬x4™I€hoß͇ƫ&e­@9ˆÑ ÿ.êø-úR Çu…gÜêܑˮ‚à+ŒåVüimd7£báwíú‘úø)õòçtNž„(…óOÆùLp’{~„ÑÉ[¿pìâX¿§®)¬KÅ ™™^{h?ÞÙ-¨ðÃà#™¯cF(–Ý,Õñ˜%çµåú‹L[Ó–e¾7°½©M,*r ÚFõ„bƲ g²r¥t!Ђùg'¼{“°Ò„5‘”?ê5ÛöꨨCÔ½íwî¢þ點™i52Å­ÇC€®Y¤ÑÍ1/º×sŽR1¥ž¢5eúèÛm9Ìë4I {+dÑÜŠ`À ²B„˜b,8¡q-èå}|[xV?_÷šù6r? o¯~¸ÓŸñµ½,°q]à x€"„àè´*æv»/”sLlEà”]¨Œ¥b®±ÎsG ŒØ-·Ÿ<öÕ5R>_»Ì0éæL°ÆÂHJôEbX:TMºº°E;0hC*6Á,ë—âþmÞ—÷7*ÿ°´õý\MônV“Žþ¦ð§õ6ɲx-ï`àAšÜ™éëŠt"ú̹zv®çh¹N …:{av •*d¥C·> ç(I.dº"‚d¶jÍÖ(»©*€AJ¬'IãñèP‰8úal]Ï+ÏñÛ')^ã}j¢ y#Z_‹{Väê‰8J>ÚEÜì~Aãܬ·!G[”’­·^Ÿ õÙ´ÈEä übDî† MP u‚Ͷ!ª˜8ͺ*R¹˜fÁh³Hû$b¬P U$ÕÁ%•ñã@0º[e8,½0zÒKbÂióÖüY*ÈñòÊŒ,³.ÃNÞ˜¨ž\©:nå6 x‚ZtŽÙ¶èÆhdCW4£ ŠëÅq©¹‘*Òª0N–T,ã²TßKIÜô‚˜+i2tÙ%iœÊVp¿3°/Š%¢A-ä„–+#3¹j"˜åØ:®¦.R1¹h+‰Ó©™ŠËâD#…ïFºxvñËc.†WöA-¹woåG.Sóv²,fËêù^ß‹êüC¯7r© S|MiWš¼pd¶Ú6‹4¡ Y‡JÔ²‹-¥…“»ïRPùý¸_[eÇÆo(%_Q€a%C„ˆìq, ‘ *QH8¢MÅ\Ó:¦™²®äN[|ñõPÏ_£-Äß ˜+,íµ@±–¨ŸPçg3ÈÏɪ_†þ´_ÞLÙ ªGÀ€u¯åtö“{Ù†-Í^èY¦Žxƈ€×Sð®¯æÃÀë:%TÁRó*S—kXCWÇ•ÒÆ˜¡‚%3ÙŠŠì¡À"2²R^¤ŒB2‘Ò°C ´P‚¡4¤Ä0† ¬Mˆ*A‰r¬„¢˜Ö ±3ÕÉ@ð8V€’Óž)Ûã«Rðþk´ùs˜nÿ錵+d(ÈT,¸x‘@zt¡´RkÅËÖç6¾ºÓû³·²¦LDæŒlþ?ô'éúuÁ_å²­Ï¡ã+å±×$®w™‚ÉðÂõsÐcZ“¡»Ù[r*–f™ÌZÕÁî-™H„傳C>‡ö庅‘mŸ°KÖÈË ¹É.¶KoQÈFÁ°x}éhH…嘜C’Й8ùÈœ ÐeøòâÝ3û™¬rë~ÜÔóÄÏlç,SÆNïøè&£Š—^¨r«ÅSo8€÷n÷O}²/½<·[½4O|ÈþT/ ˜;2ì¶7±½M`ÞYtÊø,þ_{ùã[w.y­™¡Øáv7Þ– sAþV¼r{~ýM翽<`Þàý ýv Çæ}Ù3 K@!B2û‚ àÓÒ¡3S© À¬q¸eŸÍ»jð4Ã|¯³ŸxÂÏ_q¯õ|Ò›çìºù/;ŸàoÐ3Åq®PN&ªr­Ùq?ö´§+a8˜^¹ªÚvœ°LÇ¢.±¬PAó‚ØÉýÃÙðsåÕz_ù¡éÿïºû×Ó»­5ÐXáºÞb3ƒ(p’1èÀ‘À¨²1T˜ Q„úe` /)պקí]5–“Þï§ðZaú¿²_%ƒ IôCŒi¥§ÔmÊæ¾™5ÎiÄkºQ*j|Ô6Ú ‚¯ð£Xاð§ä°=×ìG°~÷´;íôoÔf8ÄiЈGŠuí7%"©#5†%Ȭ¼¿ÏÛ'ƒg ``0^Î-þ9a"¿¢äÇ7oníßëD¾¡ïå_gžÙ NYöýŸ:ôâžwÙ[b¢õšZa®ÃÀçt)÷¸žî«î/¶Çð+YÅÍ®9;àRŽÛÃ`ôs|¥G¸ñáùãá—Íå“z4`ÆÉÁpÀTs‡ºÄ£ÓpjÍÃVïæsvûsuíad$¹Ÿ¤¿ n$ƒ††¨ !QÍÁ®X;:F¤õ´9/ïô": Z¼ru¥]d`|†>&¹ÐºBHãpÖœUjY¢Ï63ç=QÖ^RÌÅ¤ÇЋÀ:|™;„xh=ÍQn÷\L‡P.ÛÚ,æõB¯)Ì6£ÜB_ËÚ¬ä÷€NͪÐÓ¥c¸‡ÙáÌÐbŒ]*’Јò RETDÒª¦BJAÜ€›””·b¥†":¶ñþôÌåwˆOÍ¿™ÁÑ.Èzïüu!aÖÉýP_îšÃ§c4Õ¥ k9«¬j‘’@´R¡Ç€.mÎŽ›Ûׯ¯Lr§NZV&øj°Û³=QÑSÏ™|}~}m÷ç¿ïÓÛœ/ïãòãoZο~ûᬋ÷jµ®FCÂá§óžÖ&•‘Oóg‚ß\›¨+ ô«(ÍêŒU0×ăìzËûÓürüÈ<÷ÂyGB–wW˜+Bì€:ÔkÎ,†Råš_ùlfµYñD˜àš|qލšH7q!¢"¡ ˜†«ëÓ@êÇë¤]¦ÅpÕ•/!QZecqž8€”öJU~q:ìuåoWd(+\Ž«ŠN[SŸÆì]ÝJ3û•hÏ"Ì€Ò åÆc§ª=VeÊiƒÁ¶òˆð·”w1Wωþâûa©ÉßÉºŠ•3g¹úü£ÕZ¬ù¦{3–ô»Y9ølºømú¹o² ßÌ@Áizö®Ÿ7~ùÅzK¾Î˜e”×f£KŸ¹Îtæ:^`î})4¥-„ú0•(†ˆe‚aN4—§óóÄùõ-ßj¶÷ÆÖ§œ mé†4µF4M­º•öš|(TD¢&Åé©äèî]S݃…;"¬3dÏE*f2j„§1ºÏƒò¬qA£¬ž< <†åF„›_d陚G?~¾8-|öLðt]@Íp9¶HI­lÜ–q'¸…µ"OØRµEž[ï¹C³%Ô+E¦oÃã'YrJücË%k~ÑTÅgIºWyþ¼¯ÒƒÖ÷|4E¤2–zTF³Òõþ€ `NæUNi÷+¥Ü,@F‹ÌNWûž†ã]-ÂÀ—÷ úË‚ƒÕ¶~n}ÄPB×$x­u;~2ÇË!Yg ¢sD3LuÔM+ž‘‡ß¥îš÷ñ”ø3oÝÎBB‡y»#g×O/6â«4-gÂa·Òµ=@|œÑ]yv¿,üË›8^²š‹O¤º0   ™@Åšú NŠcÛæYB\w"¢ÒY¹Z GE,’NŒ…ÄwÔÉ@:Jc³]ë³€Æò¨X<ϯ-¨ø]vøàø†ðÛn0°kVPü<‡ÝLýòÜ2묉´aØØÙ°‡hÆP;qç°ø]`²zU°7XüÞr7vBd»7âH¥û>øÐŠo±Ï4ŠoÒà8zج¿?¼íܰéÄu/âÀ±Gs‡þsÎ)‘Ï¿îò‹î™Þ«·ÎÆùñMb‰î!r¾ô¡÷k¦O Š©D{;—þŠ…Ë®S®þnœ¨ãû6:©KsÝǽ•VîüÚà8ÜI=xÎKÍÄž|¨pN9ZŒÃÇæÐO;ïËN]ëG©‚òÝ>õáç?÷#—ðÂj .žŠîv_3›”³Ú i`¼e»Ôö¢Ïzx;»½[JÇÖ,†ì~{S¥¨ÛÌ×ÇV9p;Ç•rüÞö1:¼¸nã¦}£[ý‘ÁƒÂ" ²ˆB–;]6ÿŒÄ»wï­1?e.à%zŠÜWxviIàé ¸÷ýÏ»>ÆYÌoÄ; ÝÞÖüù×W»·28Ú̃ãÅÕÃÔ·PV[|uóN™‰§ù0û±ðÔ¯¼Î͹†•²”¡ð‡oÍßÚ©”æx6a0ËkFüK˜Ž…¿wܘQ?ã¹³î­HQÖc³µÚìÒìÙæÝß^Ëøòœøó³×ñÔççÃ÷ö»¿ÌWÎwóHuÁ˜Pˆ°omGqÂOèÊŽB•‚·•Ž EC+øîL‹’´Ôjµ!Ï.–¿J¥©¼‘1Ñöy‡ÐqÚXFLÁ0ò '¶À ÈUŒ€ „0@ÍXLðÁ ¬hxŽj°)Qa^ÒT‡`¥ TÚÅó{ܰ˜ã¶-¤Àü”+o³è©z—ÅœÕ# õš¹R¡Ý>ܹz‘*ý£ §ƒ¹Dذ§Z×ÿ>ï„!Ìv™q]@ê-ð-äœ:“] ESöNJÆl*WëR²¾µÁ5¥kÛÞëµX)¡~sbv›>ôè°¬üfSDðå.çC Û[r%:çÖè¶~d?¯™A3Èú³æ·Iì„·ÍÛ~`!Aý\¿ ôï«Î¿d+&[R2æ®>=Ýå–Û[ÍÛ¨ð»t~]ƒ¨^HréRíHUÛG NWŽ*G©’–@Ϻ9¶ #£ÀNòQ‚A7Ý| ðÓ•@JÅsz ºf¢¢xÖqáøn ¿˜Â/§ø•Òµ§(Ž;gëxD6Kµf€=¶¡3%ÑH¸ÀnÚßJÅÒ×Ûq·˜g¤)ô‡Ý£ß¶Ð”˜ƒhÔê‘$”„€  <›Ô¥Í©Wrx ©ÜÛZ×xû˜˜\õì»yÔëèÇ×óvUzB¸®ž`‡¼ü äz Õn›c¥»ÌRhÂÿh’äBþå6‹‡Mé,áØÖNÆUý³†ß:žÝ=–ØÓv>ØW:jMŠ d.väϽŽ£ëÏå²À–³Ÿj°®×ž^Æñ½Åž#Ön÷ï^Í‘w?ï¡k—Ç «Í¤`P‘µh kB ´žåô0Ý€üÐ':,íMœ! i`Opä‘Ð%›;¯BH ð• R¶lwóæÈ3€ûΰ!&›áq(3Ÿ{Šhû+Öæ‰wÅs¡iBâXjkú·$•xâAj3™ö§A™Õ굸`Ä"?ù«kÀJïÎ×ãÐ3’&XšUK‡–h™éÃc¨9OÔùð$†‘0EãTšøƒ(-)_¼È oeEÒï¸Þ¤5êÜCÆŽD¸.ÊÁmã a=#Ì paÌ&)!DÎ%1 ÙÖIƱܵàZ?v×/í/£¶¨’TM¼´Ÿ§x(Yâ²Rûsn2Ñ `å‚êŽBíqáÐÂn7?M3í¹ž½\«ã÷Šß›“FSmb˜ >­“>è0IϽa†é0òö#y6…’Yj/r€a°µ£šSŸú¾Ø™ÌEGÔÒŽ bÉW_eõƒ<ÕÉj=³$Ü‘"´Dh@ rwQC¯»¾8O¡]77÷q²F.”Zef.ƒŒ:ÔÆÏY;s1Ñ+•E·Á Oì,ëâ•) ãB“ X(„L¾7 Dg»d±ëX‚CV,öÐ=È6GN‚¨’ÓÉɺbFNfg1ó–CN†'/Í ~Ì.Ò¨üµû'ð=yJ³~J~½ìý†ü²‡'µó)ÏzÿÅÙ6ãëœjçÜðQÝÑ>â¾÷µ­k®™ÎÓ–^q÷%žÒ¹zWV÷ör1êg£ÎSæ:¬¾D,þ²E•F';·{4áŽë]b}V¿ÍaøîÁó©L~ÂçËîç‹ÿÒòþÉ”ÝÄU 9ûm~Ù> a-ß]_?zñý±÷ƒúhn@Y‘±bg÷kFó㋞'.úÞåK{μft/9w+íä6àúãp£?T³œsL.àæhJnàgk¶Î¢ìÑ—`K<_¹¤˜K[Ä̘LÁ-DX¦&)¹PAÈŠ.ú†¯ Ýä`Ã7áKØ”Þñ1üdùÒdù™Û?uã½Òw»§úV8 =ßûÃß?øëðϢߙh¯²œñhi0Œ"‰Èïŧ'ÏØßßþìùMº™¬ÖëêÁÊäæÕ¤vÛWþ}Ve¿|á:Ìãpþç:kÜq=ÓÉÁ]î0s†ãN–avlš·9Wp®ßãN^G#§5¹ è6ÃÄ#Ø“d3GÓl7¸Îq­öµÍ(mH2CG(R5ja”-4ÊDé¥SÖµ i£*B(Ì@ ¨›çåÝãŽ_“Ÿ¶*–n°”-£2éÌ\ `×r›]ÓGÆ.X1òðš¾®&V çB±¾c—m÷Òw­¹îyõ3Ïëø}§hÝì:Ó>[2ûh våÇgc²ºaÛÝigÜðóø23 ¤ëÒ5Yá6º¨ÿûýÿî7ŒÎñÀ0PE!³Xx"¼òjçZÉvø\Äyßp¹!h£&ØB’ ¥QöÎ_óüzÿ(nþ•¿oÃ÷t¹…/m÷-^âÂRù¡}É!(Äo‡xÇp¦TŒàšÒ2R°r"QF\w FD ‰4¡Y„®¤e(„e4ßÏç}» qï_=wþēә·|~Ð}°B)7v·+H}T¨!¡Ì"à,TO=MiëÂi\ Ÿëó¼åvUU=Y’3üýnô~Ã}Ìn×›BD;^þáˆ4Y|ŠÁ(›aÝ»ø•*†Ã€[¼áM¦@d‘X‡‹™×dXÆ%[Ve—í¶ w~¥O¨~Š„Ô„vT a´Ê»TŸ^’Y­bµŸÔ~‘í„N€‚[a¢0Æa8¥‰•YkÐ8ŠHlÑLiÂìª;á¥PÆw🰖RQ܇‘û"€I)œò¾¯ É| ¤À0+Ñ~±±^Ý~wq)½€pÈÐ'¬Ìo@D^ܾ¿[ïÈiÅ‘TÈe`FQƒåÍ¢ ˆíÁ“´Ûê9i.÷ß³±›*@(µ·n72A „A ëELD Ú¢Æižòx³*Êij±xäIÐ#”…’¡vìxrÇ6iÆûžóÕƒ•1Ö]. :xáà…íÖÃUŽ@§ÜïÂo'íŽ}Õ5Æ£i´x”›Û:]vFR`•¶F›~u ‰Û{èâ³ O¸c²ÀiÄ«ì£ÿ¸Ž­æ?|â×v\öZïµ­6©`º—ÏžëýÛà³-L¹E@"­ÆÕzžóØû üó‡ãý|öîòyÔ£Tª‘ ’ ãú5çòzʵ8÷×~÷ÚµÖ'Ó´,çÏ×…ÞNz¶L°óÛåim¼$,¬#qö(˜é~}µt×|ð~@œ6Çù¨®ÀÖŠ¹ŽŽçÏÞ°<ŸßT…;N ²Ý9ZÊ$ôAIå«lZÃÕ†‰ a,Y+pvÚóÈØê æˆ g‰Á Ÿüdñu %ÃöRÏô`VÖµFX“ëõø¯ßÍþ7¾ãq°=Ò;Úæ>Ûk0"ÿÉÜ*YŒŠïÂ5†\ÂÑek4Å©pÊ@Šˆ¹ QX: œKÀ*©5â´^'›®ÖRš†²F<L¨9ýŠŒÂ-kVÖ*æjèb·Zü¹÷ÃZ#ý§qy¾_®?Iú/wuy¥Ê4v_³\áŒã!ª¨‹/ö‰u~^ö κ¼”}4[·eõÞ{l8Ô—ÏžUâE.r;z-™sß®°kŠ vÃó©ü¤÷æû¥WÚL !7¢¬Ù_ü¿bk™¾æÅ\äà/¸kÿ`±,ÖH6©~¶"Ž5$ÝešJ‚6ÕfÅÆQ‹)b!UƒÊó+-%š½áÙ©»œœ„ÖXßWi ®æÁro……MÀl÷žA¯™·?ìý"žØøú©ÕŸí;ÝsÁ¯qÜ¿¾n‚Q'ŠŽ*H B-©KUR©;ŽØ°71ËUX5"ps/ß‹wz-d]ÊÚµ£G&•Ϩ2Þ½©¬UcŽˆ›²¢œWdÊv{¾<áÒ—¶e:´¾÷>¢€ûàÒÏséײ±–£jšZ€ºTìP½L’9‰_ÇE¸Ü±·§[w[;¤°òTyÞç!RÇ«¹¸]ý“u²;N4ÔÍ¿4¯&É´ ‡TY ‘Q÷rûÐÌ€ôÀ†(2FÅ×Tn#s\ ”[M­­rÝ4•ì•í¶XqámØS'Ú.A0zŒ½ÙÝÓhÞW,Q@¿ Ñè fª@2Ç·ë}Æwû£ó%‹¿¦º&htÝÜ…cÂnÅ`í^u¤ng«ØÆ`LK:J¾°˜¾ø…í"æÛÜ ‘ùÖeÛëæ½Þ}¼÷XóKmã|r0–]—þJø4~W­¼ÜÛwUw5†;@8¸óôTî­Ÿà©Zwîïóˆ‰e—•ÈØšmÙXonµØ¡ L˜¡<3¸zGlm?­ðÜÛpϘÏ©3L=¨~ˆxñ\ûY½'’"fµ]3Âé,ê£aH4åcS'´c:ªÕ,FÆÒ ¡i”ÂXàÌH{‚9ÜñÌ«öhŽõX€A³ ÖÁJ(°'Ìx'Ì ¬€ØÌÎ…n º£ƒCè`É¡,šñN±ÚH`þXRÒ€»ÍÔ¸‚#@>·4ؼ›"l,dz[ˆ!´”êŽ[&b¼Ð&ù j`bL–Ž\{yr}?û£½ý©'n’‹ØU³ix𦦓êÛT÷9½·m‹„ƒÝ†^qš< š/K0ˆD—£R™ìnÎÒ#ùô Žõ+˜{ÚwöíÅ'ÇkòËâ7Û(›c+ó™È]t+ŒMƒSèóŠ]£ymté÷‹˜[Fè\< Y©ø×:½Ž=zHéÓ­Ý ë"Ò-&Š9BÊÄ8»ògçZ‡«qtì¹ÙÕd&0´•‰bŠg×kã3¸£N|YwúÑμ41}W?bòŸ’hž ž|jÏÌ5×^[¡ØÐS½üñ«oìN`©9·f§l=Ãêre»éˆ’¤kМE„Ÿû@xr×y—ù‚I†Þõf醎8Šy‚ï»ß<*)xàŸÜÆ•æí=Öé èë¼f±–UôQ÷ëªo€G…ñ¼Ò¯¥É_Yè ø”ú9¿kÓí÷éycß´åÕÈ$YŸ|Óýn‡ÖÄå†ù¬öÕ›i–üDƒ[¶tù'e§<£¼Dok¼“uêEh×øÀˆÒ¥1!kfí7™wgÞÏê·Ù{þ®µÍŸ¥È G;nlúdhqÛFމǟ÷ØÛËâŒA ZXN¾{A_+YQ¯¥É·¯µRR1±Ã+Џ_/{ŒXB ÕCMÛºÔIv·Ní½§•7-›GrV²²ézØ©òìÃkZ“Ùãçg†H±á¾]æ®Sû@ ”îò©(ëãr ÚÉ¡»0J‘^äLuÓ7ã®P©°–9¶›’é¼(Îݲ1Ëóñ3ÏÌyvDóÞŸ™TŸ¶–/Ö|Qå[f‚¬P´Ã‰žN–££g¸_\vSû;k«Å¡:‡Æn÷Êé~<ç™(75™3°wýÆ¡žÂWÆf¨%¼ªŸ 4R¯‹3˜gšc{fUcÝXX(Öh…Yaê$ü…ÿòë7¯¨ÐÐ Å+´î½§ŽÞ7ºã}ì×stz²#Š…Ó” IªÌö}úzµË­òÄÑÊþ:Mçªö`5Ù,4¦?]ëûCªß #2m½Y­œ~¦*éášÆ¥0L#hYVé± Ú©ÂªàZ:ÜyJšs'WnÅ‘=”¬¦Šf+QIטuoaËõ.p³7{-w;)Í0äI%ALJ–´¹½å÷ ·E@6“«ÃóùUô{S§¬ÒûyþñbçÎN¡¿ƒÒoŸŸ“¸ ZkÑîu5„#ŭ¸Zü³þ ®YRfJx:Yí~.VúàòjLlx°Ëˆ(¹œáX|U,†æp ‹U™”{ ÌÝ=v©-™èýñüñ/ÿöiþéÜC!øú®E¹ÀwyäÐ5#×Óóý4à\-¯RF¶Óa2ä¤a—UúÜçwÌ?ῪyËyÿÜÍÍõ±z¾e—¡Ë¾ìù×­Fç•|R檰:e {ßöªuìñyÎ`1ÜÓº3fP*]"”Þ4±tð£ îáƒP dÀÑ…(¦4Bˆµ1x>æSñ‹ëœ]g²ç­ï}Þ†SpôΜüÇf‰ ¤žÀå$ƒ*;i0$B"Ô¨gó&ûùgcÛ%¿ï}+Ÿ”úÓ~mÔñx>¯xzÖÁëüù„ü믜©æí¯û/ˆ½O±Û¦¡|«mÜ*†q²ª ŒÈÕ¥¶÷ý|yÓôœãv-ÄæÔ^¿Û7½ŸÀÈLÈè4œ²u PæØ¹A˜´J "AÑ¢ÁaÔEf¡mÒýhž@*®TÉYiôìîGìÃùyH£Þ‚Œ$±ŒÎÎfbù 1îØ(6%\FìfŠýe·–ïûx4+ÅÖ–Å8•T°êš˜=Oãë3¿èõ#&íã>ççÛ]´—ÁÍŒ=•<ýUð»>ùJØšÙgúó󓵑–›ŒÛ\¹vPg±!»çq…:±,Ç Céß+§öZ¦™áÔ¯»ò6&¡@¸ÆRµ¢;Çæpç_òY—D“}¾ºiîÄýþú~þA€6+FbƺG"RA¡ÔtËÆžD‘ ~!El¨q¦ à!`k„ÀƒL©Jãm©èý¶vÏS&<ï±ó“~Š3ëÌï)Þœ±0n\èÔ§^$Š:(< ºJ t$H;—±¡´üJzͯ¾”ŸÊð¸ºqÞÃvY‡wñ®Ó¨Ž`Á”8î;[LC ê2=ºXYmeTPPÍe<Öi=ñÇ'h×ð%o,Xûñ¼ë¡÷wymSÝáÇˉ¸Fî&eö¸½—gï@FšlËÁŠØØö0äÔø7X—^ÿøÿÞ}µÿZ?®õ6ßëçÕ52™RGìKeœ·k®y]¬Ÿöst¹Æíg8÷~/*Tºu2]Û­³ÝÜ]1›ëzP QFRº ¿7ë]á–sŸýÔxF#uù·G4œ+ ­†\´á&„Æ<ùrÖùe³Ý½ÈôƒnKjÌWž¬3†>¨X&XABZ©{+}!zp¨9E# ‡PL¨Ùݘ̌|[ñe3BÇä‚;òArú¿Õó»þðoL=Ûk Í B邳*k»f°Š‡€®\ÁÂ>öu‰ªíâáe!—Æ›@6Éè‡E*Uçhoò M‘ÐR‹‰ Ãj5†ˆ’œ„ ͵ŠB˜šÒ˜¼ÕÚTúààÌÉ?{ÿòþ;yWöyû¼غƒÒ T¤AË™ÜÕîÞ}\ÕØ´ž•¯ìJzm°°õõõ~ ˜W#c˜˜]bËŽßýkdº1^{%H‘)C” YŸŸtõ¨ 1Nâ~›è:SÉXþh0ÛH¤`¼ýóŒ^Ñ›vä !È+§0;71<’F¥§2E rB$öL®Ó„Ü›•É>Œ‡¨F樸ø" Áª¿ñîaClìŒõé•«‹ChVÏ5ÜŸú|9¦úèŸqM̎⡈ gŒ¸û¦/÷ãÖÙûõ;îr-X÷Dƒ‰Y*‚ÁsÓ÷t‘œ‘‡‹^Á ýø$üJä¬ÿ’YúãÅl »iY€ŒÂ ×ÂöçV¦ £?DÕ&ϦŠÞa ®^´·Âìö¤P<ÕjäÉø¡e }0KÌü%î MðˆSîŸ¡ÈÆ]¢{!0d³(ÛšÈ8-.'á®%-ac£2ˆj(÷ê€]#Nü0ËÅõeŽ.»Ý²k-œö{ö^õyñ¶…cUô•ˆT,J0f(p¿üqÕÉuü*º!|íPðd8Èacûn£i»¥Õu]­rqê1¥§âB°-h;we|"ù’ÎÖŒj×JOâÃyY›±ò—ì–`g×¾‰ô¾?¼¼Õ‚Y £JÑ¡€\m±EÕA@á( å|Aö¦Àš!=ê·œpÐ^œ7œAßùÖ„¶ÉøD²<<м9,"Ãдò%˜Ó±¿5á…üI]úb/»?Q»Ç­õ­cuö—TÐÇX©h8™k¹ôîÍp;âzl7Ÿ Œu v¯|,ê‹I*nÇtW†C(,„$vÚQRáΗ÷LÿLp³?&'|;U{X^9Ë©ßÀÞ›V·n)ÚÏÃkÆð˜ÊÖl¸=àøÑË›~¡o>Ï·ŒqiFfù2/Q];9‡¿Ùÿú™ÿówgùÝíúŽïwZÒJn7¯Á45¤ÑwÈÚ§À‚g„í"Ò$”$c ôï__§|ÏÖÛÀ“íqŸyÕk³ùëëûªš½µÝ±úúð6´Å‹ÝöòÆÔöìíÊnIJ@í\&ð¹w;Õ}@8±•Åšé\í–†Œ‘XÔ7ˆoÝPµ#OÉMN((‚Eµá«ÒtÖœ|§z¹¦h˜Ë¿5—ð›Ò‚лòGþîÓ|çd¿ßϱŠvÐPÂÐG&XB>+—0>…°þ1prâ\ˆ` ¤õÁduËp·*ÓGNoÁæJ¯ÔVš²€kAz*ul͈qÏpxƒ  ¡è b!ðXf +Š!;hØá´ÛeR`aŒQ !Ýènlžh-BϵâfͲûf®GC±>ÐtpÀZ4FœÙ5ór5/¿S,Ü oLœ2h,±ÔõjâKÞ¸^¿´ÿ³Gœ õüeÓOóõƒ­pSl Ò±&¼WÅZvwÆÑCï“„0ᬼ×¶˜‰€Ôœæzx‹ˆ±7à\ øRÅ‹ßúˆÄµýéäË"gO½™µv9íp¸ðëÝq_»®KÑÛÐèÃ6¨™{F7àù‡CkƒKH1`ªÌ•SÙÌmûö‰8ÓcH„ øqû“^u\Ù+/A{žØnrïZίŸê±ÈA 81]OŠûFìڌƵ•_bMÛÕŃ×ÌPý1d¶êš…W¯ÑÏ*ÀùËØ ·<ÉÈmVR(T„bàÇÒ¼ÅOúùøü8/¿úqmN›‚'q"æãm¿þží®v<÷P^Üjã‚ô «h ¶ùÐNLK… bL2dÙôX”’#?êp× LTË„™ˆe¦ˆqJ;Ž¥ÓöÃv²ŸhâqŒ§æúÝÔŒÕòj‡VyÁþRíì8´ÆçˆçÀ‘ç:Ѥ«Ÿ‡øEG¦LbxMkAîÍ凱OAuÂaú`³@·Ø6çD§Ç1莨UŒÕ”ÚÖ¹ª¶®2ÚdÈ86<·†Bjt$Z@†è‘hÁÏé‹_?ºý¨/|zį”õõ-ÿݽÓfnb7ñÖ¶MÇkà;È‚ >v/È.]3§Ñª”ŒAT:¤‚e·òx68ìTOmq;›ÖÙÎ ÑØ ãXôû‰˜š,$騣·G/V[DZW÷õˆ§?†ÏÎ×;æ1’£ÈN?.eûl‰ Ýiœág=°^ .÷Ì;ôA1GÐ… ?T‡O0òWÛ¹ée o”W3IkñÏQnâzϧ)æ|þž⨓«4Ñh‚µÐÅbê¦YR‡Ö·!~‘ÁvîJÖ)¨^2‡^ô rl„aÂ-Áj3¬;T”M9=Ñê©=¬ÐèÑ[dlÿ ™ñþ<ÏWþÊåÞ·mSЪQ<"ƒmgèÔRfvÌ\/ƒÇI-Kôk½RŸVS¾Ä†ÔDôfŽg„“ÃÉÂű¼\¸®ÇL}~Þ\e”P0f—:&Uâ¤ŸÂÆì­ZsV‰"l&MD4ÅN›·°ê”B†·ël”eɼˆÉ¬°nD?ï˜j7ü¨•ëõõë£õýޝ.«õ·úæSùo{³U."¢­ÏíÍ-æ6¬Z‹aMw­z”g=õ]¯8/œHJz †rÙÕ`IXeqz!\°‡Ö‚2«CG€%Ë´¢¼0^´°ý°sÜÁVæ«ðÉ` P•X10|G€Ø¹©¾Z*¶½¶FNm³R1Ëx÷¹çž™LCTÌ²Š—ö;hÏjØîÕ#ö;™úÞó$ ½{!¢†ºœß#oTZËcû$HЯŒš¶±=ò’(U9¡:Õk?„'¥Öá2½kúØÒ]ËI´Kè}í !Î N¯ûš@Ö´a£8¼(Ú+ %ÞÆu*r~Óý·`ñAþý%§šßE–Ûr?®ÎØÄýÑäA?½§¡a.Ô©zkI(’I;¢ä.yÌ#óçÓÑÛlJšÜ>?ßÍuÅó3wŠt{ý†ù¡VÎóžÓ€nLƒbÛáƒ=ÐÊWN{>ЭiÖ}¢Íø^…±¤KºòÕŸ…CžÜÁszÍŠ¢˜ˆLp X ÅGT‡»¬·ä”ˆ"c5[”¥>õÍîªW¹çõnwËŠ3ûuýøÇ²ô¿}ŸäãGû{ÎóÌgZù;Bòñb׳¯ƒ,oçc`Ô0YJõÖ_^ ös}8n²ÿv5¥½OÌqž^§G^SxÊ»#x"jDåÀd0âȱPÍ5Yì àÑØT–ƒ•!º5^ÁäÐekK A¤N•=Da#@¡i>wópR6¿åÀ°È¨xÀ8AóÔ|° ¢æXcû–©u5Ìí¸gÜ?ßSnßÅmPVšJ+?,ŠÈt™*uùút¦2„ñO{@„îµàxwº“Ý z%u²LsÿÝþRM¯9Ü'k¶r®£áh$<^Ë·$JV©>É £‚ûšmë+ÅI¶•TYLr•iqÉjêÅ“vó·—›ómýÙg¼åÞüù͉ºëãñ¿ö¼þþkxô ý¦ öÖAð°=®pZ!¬CBÀ³Ô 4ÎEDÙÁ€¶„H0º¯\’ ´¨‹ÜWÒ:ÔyØØ·ñ.Sj‹0,ŸçyÍçWË펓¨,'/ÒÈ ´¡(‰–p¡©–ѣƆu@‰€J5ü³ ¾¶Ùï+ªq «¤#Þª ¦¡ ã€-’’/ö|Ö·l‹4h*B £]Žj²!ÞŠXRŒV×hôœ÷yë¼”¤"mÔmZBd-·M=ßV‚°Ô¥+³¶¤^6RŠˆp,ÕÊF/¤Ÿh/½d‰¢c'„×ÕÒ_W`]Ú.‡‘ ûD3¹%AÎaåMÖʬÞY¯£“{åz½Úpiî HTïö®‹Gœv ‚_4‰nö/cP_£ ®í›éñ ´çµôìj‚|¢íZ>°ýù¹ß"!¼E’šWkÔ`êæ“ÒW<¶Šá±ðÌÝ­C›Kê¾=nA&¤ Ì)>Œ`@ Ð%bro„/‚>€°(°b{Bž§?lM£|Æ4©emJ¶pKòàT1ŽÃA0Â4K–Y<Àélf„°ð1òÒsÕŸ‰gü2s(šÐ¶/X“ZGUb=å²³÷51ô½´NüBähqwCSø(¶yÚ‹ÄS—•Ë*‡ªÙ“áK—¡X=N#¸j Ð"aí2»…;ß8•£«¡×¢_ƒ|ÔƒLà0=†e`ÿÊ›gÉüC?>Ro·fêmC¸æñÝ‹“¯Yuöâûàaôc›Ì¹qJˆ¦BakÔÇS×|ȯWî_ö¼ÍïcÌy«Ý´dÐéI!gúúÄYOÏoMÞ7]÷æþÞ\gŸo?ïÿŒܽ·ã.Z†Á8œk°¹ò°â½°‚‹†ºµÚÕóía¹Ø~–MwÏ”¥Ù”š(&QXœSÕÈÍ®§#Ÿ¼ÕÅ5ž·[{/ÒSÛ›he ò©|b]˜ cÚ¡dÈ‹ j 0ÈÉC-¢iÐAÌŸçÄhÞž%|®À¹$*:¼( ]*ÚÅömþ_üÛe®üjgÿñKûÌ¡êÆKÏÓãùåoøÜçÅ|Ÿ Ø.úãUžÕéç|3¡We‚ÅɸÀfõ!H@–BJëßç‰aÓd®ºNèñajüØ©I¿2§ì ²¾Èà6Å6f"1“üfOß6ÐÖœ¹³#sÍ+»çS`hMΕÎ0crìºT¨4ÒçÒPjß'\ø‚¥GÕëàw{Zø*‘<š/|ú#5µ¶NV®€Ó&h¬4 ƒ”ãÆ”E®ž½ãî»S&”=väM­ ³3P­öÇÐhS}Ûû/Q ·`'g9!jv{’ i@!cÖiÓm(êÙ:}á‘ݲܰ “qÆÇ…X,ÛÀ„MçÈŒÃÛê2ò÷Ìdü$YÕ„„kûjíÜîéJ³šeÛ“î85eSDšèóÑãŠÝZÿËhÊçÿôÿá»¶’È164Êx:ÌÐ(îÆæ€zb¯Xw#Þ­µ“Ôš—8‰QVQ±ÉÞMŸ¾\dïœ =gfGï¥!,<%•‚A@Y²7šÛ“­Qb¼£ c#Í#ÎAau PŒöÁe‰ ©xܰ¡ ¸/ ÀoÒûéø€(©BùvLëBKÿU.ªU?e—w'%¢lï˜ÎCå~7÷·o¯Ï§øh¤8CtHð€Ü…Å™b¸/ËF—+˜ õ0u«•ìyžúˆçUÚãõ£/|Æ•'ÿtîïc+ˆó_{î;BP³8V+ ›• ëZX£_C k¦ó`ô©§Ê>=VïÓj5ûn­~>ŒoŠ r¬^™üd‡#„Kþ”Ÿÿ8ìæÿÄoKv??‡×Wêqo íÍb%—FŻ͟ˆ/t¬qê¯y-lF®{7ô–5Jry«ç{=Qå“L"r(ª #^Ê®¯™ÔÜRâÅG9Çö/ȯC ©‚˜e¬ÔR}pŒh¦ýæÖ½¿~ÎàÆkð]*éu¸¹±Úkõ0>ÃÍn«-07I’Ç;×Ò›B•P Jâ™(ˆkÊá¡ ^Û{ÐyˆÀt@Š.—ÆôDo÷7þÑ«ïLw&Ý‚[4c´ÖX<áÓ9¶·Š‚EÙ\ô{8>L>5ßÁs ™>ïÍ!ˆ€T“‚‘\>.µ§Ž.T(Uâ9©#ä´´µô"ÔºÎÛ÷¨Éô Þ–ö÷¯¾¿µSFÎüÊ/ÛzÿÿmåÞ9‰CǤ)!€VDfº¸l==:öàlÀBr|’Ý‚¿¤ ‹Rq`ˆ!‹Ã0©EèŸC×&áAX%)Åà°Œs\- Z4œŽ@ƒu…¨ °X œ¥ŒjÑ ¬Šb05è û¦‰iJ¥²U(ÄI,2ír²‚hDD.Z~µ…±¹ìnG ÍÔ*GÏ„!‹FÛ¦®f{¨k?{þ©ûÔõ½«_×ûÇ„†Ó³™È¹ÖïJS6Ž3¨sî¾þ aý“w$øÖéÐ'M-ߣí%˜Œö|0ÝLO–‹¸v–G;éÉÖ´?¯_fÎm5ïúhä¥ °fµw ¾0Ñ,Ú‡=Æxn÷‡_·óW úBܹ\Ê<°=Fã”é ;F-=ß½iî{^飈o»söWæ ÉãwíÄ5º—ðyëmeÔ,][æZüj'îwÏ 7¡°Ùh‹Ä^¤1‹ˆÌHA$ô)dâŒèHaJ[Nìó‹ôZWfóH7˜Z.43zfÇ~DUN5S¢u÷Þq9Z”Fa@ŠLÚÔT´"y µ`ðOMÿQþÿƺ2ƒ³ñ›©^ÕtŽŒ²Á%Æ7ñQñ5Î9¼ñ”±NX}\#Ý”U#gRa é˜h÷„7‘ïÝïÏM\{“?~Æ4G¿ñùKgk­Ö&‹P ¬IÝžÁ›ë›Îøî-þÓ…µòæñqS*ßgËYÌôžf.)r³—ïGfosñŒM¤.«ËF˜Û¬t˜#ß MÖƒv½·‹»¼~½çï&úÇ-O°eŽZÙêæÂ—é=$kÀT%y¼72Ýßi4WàèçˆL÷gˆ‹E¬µBÙÉ ®CwE²ßx©áñý‹ùrz ®oÔ‘l0Ñjt_¬Â‹('fð¥SQ— æ¾Õs¬[nSÙmRìóÌÇ7­óóÛç1¹‰ßÖŜͽ.WQi¸Ùõg1©—x'Øí¡„ =Œ³ÃíM•Ú A@”ú!J;ÝnÝ«’šµš¯îÏî‚T§A' ®sþ\¯oàT^Ñnè¥T!aÑP§ùÐôð“]Hfs½ùz¼ÿP½îÕîµRêÜBJòcNå•L.9ZŠóL ÕŸ@‘fº¢€¯£¿~·÷ÍÎ=n ìÍ žÛIÝvÎ6 ɇµ3xâ0ÍÐA? ²qiœY…fgo¿’ÓÞò@6ŸYè|¬ðóÃs¬EžÀ#¶uàÖáØv—þò¶®Þä¸Ìç“7Î+=Æeſݼ ˜© ÄÐÆ9>ë<¢y6ÞjÆn»[GÍCò>D$=*É^­€,¢ /Qzfüc¥×¾Ç¨›Û–Óº n£F1êM¶÷©ô‘»ÖôØÓ ¸R_Ý¿÷ìS<g|@}» 6”™¤ˆ]Š–vG—zé¢N-¹v«±*îÎr¦YЫ”š'áWüòŸpÏg[V!â¶Jx±e=K[F PŒ%$uD,&¢ZË¥ãHÅ϶§•Ýù‚³Ñ;ç”PJ_Ûl8]Í,œÒåÎP8K=4aweÅ®¤OHœ°¨n3•Ò¥?Æ]ò:Ì7‡´Ñ Ø—(2u–"QKw­ŽøöàWÖ}ž¦J­qËà^8ƒv×¾}fúéúzF7xµ¹ZŸ7¸‰Å¢ƒ§ƒYÛŒ¸MÁBŠC‘¬#IXqinóúZØGûgþ] çï~µ§ëÛ{ïÜÎçâk_ñ]f‰ÝϹàZÀ¡©‹ññ Ô´Ÿ­c6ßGÏ5Ò§Ø{9;õü§ù}Ÿ¯‡jÉwêÏîͯdRÂ^URF Î6 ¯gN>iUi§:¥ª¦ u¸b–©é0^ˆ2pzڜ‘%‘¤†6Ÿ1Q:ˆ*±ÀZŽ 8Á"˜Åt ¾{•Sbª=ÏíÙ“g?8â§ès·80âzÙ® vn”t lxûî_lÇ'u”{‘0ŧúº²¬áÇ›|Å{¿Ifì7ÎÔÜP:«:é«Á–éY:ÎÚÑG*ßW¥çïú.ÿ†¼ç£»OsJçëe—ŸzÖöð`\]–×ð»i€ÚÌ•" )£[ ¹[H€dÈRÀcj‘²Udx‘bwyaäG˜(0„Ø(‚Š1¤¤“8v¢  ¬@Ī&‘#«ÐçˆA› SS¾^ŸWå‹“VzK7ñ%ýs=~Ñ•¯6Ãçv¬ïl]Û×÷sàœ~?_'¦þ±A9yžÃ=”íÀµÞ¸Æ^ì`ô ìáú2%^D—,Õ£¦„Éâ´DÅŠW›•Ñ0Æ©d`\ ¢ŒPˆuÔL°¥£¹œ9yüÞÕ!"Ì× È >¿ùÃoÚßéd7„ôð?º±Ç#„d¸¡iÃ254aµVH•Öe„4Ï¡íõe\! kˆßË\µ‘4HJòzóÎͧÏ4Iúæ—ãçëK{C¥9hM0Z/w¦Fª 6BŽ;`Ý6䦹™‘žúïÀõ~Ïï†[BOZX0Âų¢hÉ«©ÕĹ"®¸” „ÓÒ§+@Hjsœ!ã” ÚÀ‚½eõŠfó쟓o?ÏÉ2R’j¶ ùÆ”Fjrm¾Y$ûg꾪Ûï°G¦6#Eµ•{e¤ …C™j„2ÄQÐ-öä! ÏÂPûŸ“šEäÎÓ;ûjGu€G³ªý8ƒâ%‹ƒ-Ud=-?:\áúë½^|½ú¥ùw?µ4Ps¯á5º—±õË?V,¿–zoó&îú$R…‚d;tp?@(/\¯iÝZ]]ÑpTÀ†gØm­9s²E 8q|àD?ãöÎû ‚!Ja%€L¨ú'n+ð¯Î¯€UªÊ(¡b$²›b@cÚâÈw•õ‘r/;ÕHˆâl w­€Hm½ò8>BO9³Z±)Ö•‚ä ¼ð¥"<=É¥^½;.lHi°0¢ÅÉz+÷ÃÐ×ê*®Ë>@L-ce*ïbËÔÑb‚\Kƒ5ÚlŒ4W «ZYªt™Y ‚ÙRf—CÜ.·yC Ø“ZïD”É6‰òŽô×#tþ AÇobhárY  «}2ª -o&õ»=ËÕ‹~òšmt­ürö¼•ÛúýªLÛhLg´+×¢¬È HŸzíœÏ‹×ªr¾É¾ñýgåc]®tNp»²ïõ¼}µ¿æ|çòD÷bn§{L{¾·×§ºNz¿úúýç>_U¸x­¼{„Ýî~¿½˜P×8{>'Øé’z•óó‹¬ö\¡<»ˆ42“ÄT•œ¥á@ÞDÈ…Ìb2õÛçšNWcnäp ¦û¨ÀP¶Õh$ Þæ‘ * |ZˆùÆJRÚP,Š0ƒ:Wófx^ÝŸlw/¤!®g¶f†CçÓÔaÌ·ÓçÅÁD¤ö/Zù¿{­ý·.ù³¶¶§ÿªÙ°yÔþ«Ü]ö*?U¢/V*?ƒtvõíkílòiÑa‰§5/D»@¤Ž¦²³É‡´¥ÎÆ´¤"Ú&Þ Ã Ò$ …j"I£³^s©© ²Íá©×GûöbÞY|‡òZ½Ï‡îî Ðñ8I+j]@äxœ”Ð ¶†$ᣥ h×Úíu-ÁºJnfu8¾”ii#ü2¿s¬¤·Î¤ð±º¯j —3›U×ôH"‘TôÇ«:Ý1 3qèè ßCÕ ö¬•G¬‹iP+|¥U.SŒ`aàk xX‘òn@¥6Wmˆ%8Av¡+éÎ`àTȤ»þk)5(¼ Q„úÎeäcÂÛœÖâ‘X×z*¨ØP8ùAŸ¹>ç‡üÉìƒàt$j$ä³UãIõÍã󸼻âbðd¡j}»ì‘Coˆ¼™Ä ¶öwæºáX16Añøä›W2ÖA¼d®Š¢¼A÷`~ð4)iY´ÝµY¾W>`[ãá?IÀp=In Ø6Hûmã¼ó+ÒrÛ¸¤ÿ`΃þ¼Suæu`MžBù¹Ãf0§…%oêSNè2X–ú)˜ÈŸÒ·×ç6nKî/ÿú¿þÝV ±î=†AF@#„'R_35Ô~ÿÛY»çõ€Ëímг —üm>}‡ÞqË#NskrAÖ zDbÃtÓ|–ž1ºÙ›¥^w) ÉšwR›VáÑŽê`ÈU>´¯n¨¡-gŒpt5©)_†¬ ˆ€FÌZSA抳@‚n‰Ï|ä´üðŸIÆ÷(³»‘¨$ðÆ=9'ásÞ;íh×Wg”4 ôýO½Oë-*ÂÐTjóÑ5Œ7" 5ÌmQF€Ö–¹p€“E¶ÿÄ7ã¾(ö&Æ“kñ÷Þ`äO4]ËZyíÓmˆóÊiÑéµ Û Ôx8xÚiŒõmÑ‘­ÆKg¼Ë²Â<¸R]x­åõîk×õ­È!ƒD¬QŸsL¬_ úTñóµ[\ïéˆòìñó éå‘–e<–~àÀ÷ײ³¥G<L2µ·×ó81¨=Έ|±s›3ÓR ãT°%’¨'w­?ß/ç«2>Õ0Q Ë©¿¸ŽÇIV¢ZsMÚÿÅÆ+c¿×ëoõx\Õ¯‰kK†),»Õ16GUËŽnƒ´,J·éêÜéÐ-~!~cŽ¿U›À–_ûû¨Þç¦0ùBÜlëÂÒZZ¬ˆOdª\áa°v®ft×ÍmÂØ2=)1à bJŒ–sè¿7«[ІÂ3Љù#¤£! }:ù\ZÍ' “^x+²™\4Þûö>_Œ†.áE²E'¸1xnù+ÇûªMcÌŒ÷< «{S{\ŒèÄà‡þíÇøè.Ö›Z” A €ÁÆ!Å4¨ÁÕ·$’™œñ/ðé§CÒD¸J–ôBÒCX€[AlJȬàD•v‚IÆKcòV t„Ð}`§±M4…íKh 5¼ Ý$ºUœ8ÂÀ3„vA›AÔíÄ ‹AZÂ-Ë.úR±A°x2‰1ú¶èÔxh4 9©•.Šùƒ“Üï7“½ËÒnö­~¡F|<>½o#k|á}úìÅܺ™ÖÿWæ-;27G˜ÒVm¦ÂŸíö¯1\{;Gºfz%7Ô,š:x\2´­ö…5$9ÙÔ–ïs/õLb‹°ì‘îÕk„ÄÑ£4o†#ÛEçXòXÁÛµçcHÔÇôP·p7ßãumŸ¾Ù(üË¥¿ÞlÃóôMâ¾õTz=g|´¶†\ÔæP­Ò£@Q£¦—AÕXΡë4d ËÔ°!0 ‡.kÁš`úµºf¾jêwö\Ný°“Ì-žÑèùÉ‚ &P[Î%Æ/áòÑ[æ}÷á™’2BÛ d[ÈWÀ`fâ¸âÞ¢ã59^ðMíÏ-ÅS ÈM%·¦õÅ7/·šM*¢KÚ€¯¨Ùªô c7… `#ŽFªXÅÍa#ËgO³Æðç¿›¿”Óÿ•þ’êw½ó¾cò:¦¾A›4²>ÍnoÝŸwh|¿°M4ǹÍsà_NâÕ³•¿ÕÖVýîà<ùlé‚DZºÝŽÇ»·>‚:„ÝaŒ¶f4%±,JòÖ´zàGêsåÙœùüÚ£§0ÅØA^´ìÄ5/-h8H›ªþaû׸SêÃô¶ýeû÷â(Œ=ØÎûVx<çK…$aêëkù~{íq6Ô%›ñ*{t7úÁÜΚz"PG©t- ©“*$Ùá aD¥L0AÉñAßú·ÑÙÆ®ÛÿÑñëám(ÏáÛÅAB™>9j/]_Yëà`¯lC@œ¡ÂÄ\ÀãÖÿp÷ò:”•x]À´Öç]‰¬á…Î:'(œ€%0Ê_´]Øó 2FE\ÜWÎʾk¬!ížSÇnô%(úÜrò½Ÿ-E¦\v¶²ãg¨r+ò Å!ˆ›½Ú±Æ Â(†9cFB‚—ö— ÂÙrïT£áFBåfÄ¢K5HÒ®R &í²Å1x>FW\µ­5U¶ÚÕ$^ãyÙ¾^¸®Ï»i>¯¢—¼”Až6üî9»—Êv³wªrœz}}KÕ9N*ke”0Šf%ÒI.d•Áêä¼cÙZNx[Áþ»v«”–•¾ˆµ«–¯˜HµfÁ¾£ø˜Ñ1B€€ó5{~¼¶iNσdõàç¯Ü§·é·R›»/ÝWÆÆœìÅxheÙÔãÑ%p´0×b|ë—|"níÝË˵X)¢¥ÖiäÄÿ™•â|Lf°–‡} t-´ð‚WÕq«ñ8›\4J¸”ɨˆ›.ˆE!ÜŠð¡ŽÏ£ºtw]AÉiš¿wÿ‰ÏWœv ¯>^ª×ý÷¤û¦ì‚Y+¾ëµ€VàRš64ÆÀÑ>Ïh…IqK€t›‡ÛÛpÞFðý>7ÜØ¬E Ð…@P(#^á'ÖÄ줭GÌ„$ÕIM»»›0~¥—ëæÃ»I¿`,è‘—Ü” DXx$J/†W£¸«5+  5ˆFiÑÄ µü™»þõ.÷£ýÿFþ½xÿzžÆa“3úuSî§ê?¹×ûu7ßÓ¶ß’€ä#óP—qZGÏ%½÷™õCµÖ“¼ ë¸ã Ž•U¿áëv¹È¹§÷ C¤¤j 9¨ŽèÀ.¼¾7O8gUnÓx¢T3Q#›ëåf®zLXÑê¨ ¼|Rƒ6Ó„Õ©àÌ`Ç÷}öGÉåƒ$·ˆY : Q!ýŒ#×3ç¹ó&{î×ϽXÿ /A@ƒ9d|¥zïô\¥ŠHŠP¨'ï*ŸK¤# TÅõ´Ïýܼ\ýéý‘°Ž‘Í­j9oùù™¾ö- ³¡½*à‹öD=èÇ\?¿ƺ¥%ïñ#¾’eÕëcóÅìj?øÔ—½èÙ<{û‚ ×Õ9ëR۬ȊR´‹¤`#j¶H„ôŽUŤGÛ>N™ ò¡ßâ¬isØ3Êj eEaBÑ‘P4š"1 À$ÞK¢H-€ 10¬uB"Cy<›d{$SJ9Ôï7Ë’cFޝ÷Uœ.þ¤Ü?e-Ÿ d´õC›¶›Róì9õ÷Jy¿T„F”J|}6¼FMºŸûìÛ­!ëùN©¯³Ôv?¬²‘Smãk¸ R‚I®…[Ã'¬nì1ëT¡‚]£"3º‚ÊH4 1ˆ[Ž­0õ£Ÿ©^DîóçÚ+.÷z«°Pß^ÄW­£Oåd~ÎÑqý%f[Ø šî"ŠïÚÖða<©c“¢H))KDÁGy«åîJ³“ÉQd(RµNõœò<¥'º …ïö¢_ÒsÚμ8lú}· "ÇŒ²Îúö8·kq"«‘5fÔQ(rj1à„¯³qïkÍá<{Ú_Pœ% #bì“ûNmmìïšàV€íÍ5|*F~Òá×N¼ÁLm$3°ƒƒ% ǹ3G÷LÕe/‚¬±ë¼ØcöÜÏ ÕÃ`^Ÿé¾9?|¾§þèš²L³{¥‹yß¡çY»>êâîQÖpŸ7¢†Ï<#hÍòt²„\EGAÏ®½šýËõþxn¾»Ò¶«™:Üó)y@Ç‘ì'¢y2­Ò×1Bº˜@ŨLlØd„pª€È…Hw±„gJ{”:a”Bb`CEïóË8÷»Ç]ÏáÇúè4Ç r¾4ž]Ú-¸‚¨—©óµØ&UúyòßjÿørPmÌJæY \ý! I¬ôÇ0…sõÑ›½Ç35é ,PyPà¸è¾ߥ¼;º¤Îà‹ä°.ªÝÒ”E4ˆB„ÔW=/bÚkÈh K¿ÇbL­xQýá4Xé{nëÖ™J†ñ~QhGËQ…(–‘•¼ýQcÔ%ÊBYH8ý´Óh2%pØ<)šzÞj¤{ïññÊ2kM¸Ä/>YnÉ\²¸ÜPs—Rl7ûÎ5F¸…WªÏ‹f'3ûêŠø!·:öT½q† Ú ´â€ ¬ÄÙ$™x™Ô¸©Köß ñ¯ãúŸÉüÿð} €jrE,Šû Œ ÷^] ¸õ>{UŒ j1]ËïŽþ.èå§Å^nç~L¶R]rîbM¹òñ¾¶„ôj"&ótοý6›çÁ¶…êÀ_Iyæ[-^R­Î8>6øâ5_ÏK .zA½ó†…Óª ²&ÁHÜ3ÞIï3ÍŒ®p“ï6˶̌GY ÍW$Q™O®¸ž2‰j ºZŒ®÷n;?¹8Ž?Ïíé%MÁ}@…X@¤ @à]4Èê8x¡Œ¾Í+"ý4 G€n7Õ‚ÃÌ®¡ŸÞÜ éK\̓e±Áý\>hµŸ±î­±ù€B¶ùðP7~˜;!‚S¨ý;±æÃ<¼Ös&xrEî0WÒ_º™ú,÷ ¡#ÂöWÚ~×LÓݶ™µ=s|þ‹Céû5íO¥¬”e>ioÆIGáXÆ<¢~°žôõûäçwóKr‡@¯Û»Ž°]>ö'§=Þ¡©hwPLÖGeý#!hl ¥:ÔSÉòÒNLm˾3û%zT«/¯A~ÀÒ„Ld‹Rµ¸Ž=Æ»÷‰ðœ§çú‡âûÛLÿÚä¥{Ä;´CåôÿÜ(n=¡_ýÓP…ª˜–à1,i&‡º¯&h£eÜßã©Ñl:WòJ.%TÀËcn£j^ØÑl‘6âP(…“ðraÙqªr÷¦µj¾¢êíLQ§™yðnZ4•;ÂU쪑¬T¦7ÖÄsL;WXß¼K[¾ä¤(D% õª»÷{¾ýÔ—¤!`…ŠR8Œ«éÇ‚¢*( ŠVÍÃc¿—ÒÇ i–bÂ$"lí’_TBl4ÔT¬’ö@Æš@iØ Móî`GYX\ ’̨jè…:£j0Z&Pz’Ø¥i 0·‚eñ¢(p—wÍLÿ;x±8ìmI)³e«J€á>¨!\g;ÐH3iب†¼Hì«Ó‰~Y&fõÙn𳹕~8H»Ýõ9]\Üþ×bðÙâ‹GRm€„å_BIºduVQAmcçNƒ4‘ðš>0c0 Èj_!”.¹cFhrÑíê¿¿.<¾E3N¯Y¾#xù¤â±a¢± »¹hunSãÿèÂ[ùZÊ:ýῸŽGDê.§Z”Fsüd~œ€Ž6îÝ­kúò]n­f=ܱb…†PL0èM»ôhoLBÏ‘˜^%Ð-¢ðžv©þ¸¡ÙK7Ž}ôèÃ_zzý\Ócû\÷¦u'¾™>3˜=WZ7{-«ñ±­àCè™Ñþ6Ñ0N*jPeB¶8ƹ¶~“Æ'Óùö-t¶‘«ûéרáT;Oèá¹’áÓCk°Nãv&yœ‡¯Ê‹ë”IÛ Žlûm)óMDç·ïS°õ¾D3t$;îïæ³U¶ó zmXÆ~ÏxÚ¸Y?Œ¿Â…&F Ÿ;ÑÌÜ=:=Îíý$é¿ð‘åuÒÄ¥®©ÍkòÆ[²øp•n ‘PÁy+7|‹e˜àqYÏÛ’zM¬'?NŠgGTZ“'U;j¶…‰æa0çýàÞÔˆàøÙg\ÚÇîGN(üª/àl¯Øª(´Nk'üÜdÙ.Rf·[L3GŒlCÝ®‘ékì,iwÃ/.o V'º7vH§k:(ï6‚Ú”§ºU4¡¨ðeÕXDýœ¿¼4Ïy¯´ ?jd‹­¨psvéðÊøP#8·2[‰mÀ|U 5b Ùέ¹Z‡ þz;Ç×½Ä6d± ËÔÍ®úüÊ7ƒC¶r*@$ÔŸ’ªHS€ÝêXX{C¤ÌF1mÀ€ñ•¡2·¿­xîzž jSC›DUfŽ1WI7.£MqÔÆ!¤±H¥ BŒ\L5ú7×Ê òÂØ¡ó>}㌒3ˆv{¹tÎ#,lP¼tsz6 ‚©1†é¯þ+1?žî±êWˆ×i÷u·e €ÄïÉ<£ÆCé˜d9E»œw;'i’ °ã<ô<¬ oTU+„%c…s‰Ú[y n¹8ÁGŽè+Ÿzû(ÿÔåó¥žãñËýð“Ù>Êèí—Ï]Öª_ÝæëwìäÎOðŽøç\~~NäˆMm~„¤®r™Èmè0–¸f½iLÌ–á«+¡…xÀ¦:$R.ãbR¨6/(šãoàåù'eä…¡ô3Î]ôSûÖÊŽÕý*ö(…k¿Ø·®Ìƒ}ÀQŸº2_iürý^ÎØDGà‡Â·rï ùÙZ{y ·¾™­ªí/¶4ø|MïMb‡»ú6 8‰kmPL6À"µmÔN‹cÄ)íÒ1Mbá›þº³9Y³$³½aã) Ü»`>_rôwÐOÈjcŒþï²yôéú §Ø¢”%B'g.Né&î?y‘]²å ®ö²3ßY/úC}$•äÊ-ØÄæ‡iÚ©€b,.€ªfqNüÚö»Gï}¿ÿl/Ÿ³0Â<çÉ©½ójêÖ÷ÈχË&ŸV×£ÖŽ\YTÄKM¦»kz)’FÄ™ÎcàÜêZZµn~Çϯ½@ý^×=@ÅDh*S‰}sÿj<·~;ïê>zzï†K4oQÍÚ}ÛÉÑ7YDƒˆ°V…kÚ1ÕÛt+Rlkª'C•i'|´]‚«i5Gl²Èœ&jªÉûÜdz‘È8ðñ ŒÅ¸eH»ÕñÃáwno­s™u(Å R 61ÔÓãÇ®®÷¶ygWõ¡©T%û(ò "®GÉŽ÷×iã >¾=Ž;Rа§ÇÛY;?5¤ÞŸ¯OC¼¯úMÿð;Ÿòy¾”8n„0 eÚ¬ „JœdI‹k!ʪå´SÊÖ{•§OíVe%9H…¶qBF!®"q¨DìX 0fÖi LÔlí_Q‰ *=3õVõ$*T'JO­rε~¦yÅ.Ãûùj“£Gsk§Dú1—׌ %Šhx¤Î…ݦ¸yåwmÉ;ä©z}µ”{BìÚÁ©fSÒº)¤v¡0½QVZßßýó{wÖóÅŽeÕX:‰Å±Üxš «¼!öÚN73…üú"îþ•5³Î: eƸ!¥û¿‹?åKø’ü#¼ÖÅ©…¡Hz=¯Èblë #•€¥°šVU«Ÿeáìq§.Jˆ+RòÿŽWŽ Ìƒ\ØÐ€ÀT-Ãý‡ÿ£¡‰Ýw|bz"P³›Ó^I39rw äDt¢hü`ê¶ùØy{±ú9{í—I/¹ÄèB\Êw9K×j,t…TëÅù¨ êþ®ß¸½”DQ^Ñ`]nŽÖ|h «’hÊx£›®[UaO¢ˆr)`þJTÆìÃ\{V^*zùÄMÛcw×åB‘þ]K Á·ÒÉN£¶À*P6:öÀ—kbi ÔõpKq`|ÚÒ–0Œ‚XÕo×¾~í¾÷ÿ7óWu ÿ%Ér!^Ä;s®eW™¼‘öÌëm¨KãÈÙî£Õ¬Ã£0U‘ êA– c±6r#£@Zzžr#X–Um¤j襠e>«`ª5³«‘“iÿu†‡tûygxü>S:œ>±_>¥~;uvŸÒ”Ë`»Ê*˜a¬‚‰xÌûk¡_û“9‹ƒîE×/(ípÄ$÷/šëü:ÓlähMÖŶýdàîr”8¹w¿4¯É:…Tlyîâ,Z–cm\ãªBm±uعÀßÞìÕŸÚ*l’xf±Ì².˜{øÜΩ¬;®çzÛevÔg½¶Ý™F“I&¼DaÆäœûŒF!»I°ŽÄ/yeXÖÏ£Ýf8ÿª›Ze½íêœ2NÕT #J Fiج2²Yå0,œ”®o$—ܱ ù"Ã+é‘7tž½©¨ ÎѨcqdÔ‘:Ïs=ÕÚ®ê@Šbú•‘¡–æ¾â¢T±!UÖ³M¯?(ýóB €’Ð$$¥þÿ·wú/öÿùû»¹Ï{wçxª0ž¢@>dzP¶ëµÅQÞZUäžZÏÒ»â- hË+ÂÏH¶jøÿT|‰†Ž"˜ D0R×"$+ÆTv"à9ÇH#î/+>J¹ËùûsÄœú‰ˆ© ¤^.åk bh ¨Â䃕‡˜P!…¥¢f9— ÃŒ¢—B—ŠšÁ…ÎE<ë¿Äñ£ ±ý½íÝb]¢YóÖñ×ú¥kŸÜG®zRj3‰¥¤PUj¨ó5 Þ¨£z£…‘ލ¸7}.µ >ÅÓ —(ˆF9ZÍ  #¾ß­To&»n¢ð2Ý’Æ=2sʾÌì£ÙˆùSB.snÁgù #Õ±o“ýŒ8÷ޜݔÚPlÞþç_µØcRSè`‹Øfz\Æo-oáÛu6î…w´­>w_õŠ^ÄEƒjLå­)‚Ê%¡œ¤=Â=;lP Í êŠÝÙ0ÕHCqÇܧ5µìþ’¨4Cýùºt_VÌᇀá0|gJÐL-c¯Vu_ò\>oã9ÎNœçÙcG½^Ú]=?åìÐÛ€N;Ž·ú\G[2¨ÃMDBôB}ç‡õ–ëóÆÈ”T‹Gˆñ¼Ž÷Õâwç{ÿ¼/î|c¾î-Qy ê°ávMˆ ¡Ý@Yföµ[ûµRÌ—›ÉIÓ¶ª¯"\“Þ0¶ýñ˃Ð%#2PJÛ@î%âLª¼òÿʪÏb aëÂØÍÀÐÆœÅ„ßý/füÓ§ArTž‰ ËB/Y¹¤m .÷qEf©B ÑmŽE›p=ŒÈÞi„öpÔ¤–Æ7º‘ "ÂG·svÁ;=Ú‡P'Gˆ. ”<'«™h?U7{«><ñáYÞ]}8:8øàø\+è]ÁÚ×cöèö0ÓL»ïMÙö|Yt¼ó±ëüjÎ=kŠ–2;"ö'-Û_"öµžú–/…õ±½é$ÑN÷Vg:¹ÍÚØ;!¤Úmñ<ãk:Y±í¯5ד“+yèL…f¹Ç$ÓLÂßóBÒêïÄö¸qËÿ¹} Ý‹êôP|ð¬ƒ^ ™Ÿ¹Û§vz ÛÆÍp"5ØR êaŽ…=ÚÆß,Ýf\‡Ëî*®Ãc‘3ŽT/nAÓZ6ëEI1¢¤ä±«X âõ蛹Gçç¤Ô¯d…ÉãWø¨ØóWKáiõ‹ÉS~ -ˆ²"H’¤Ä T´žÙ(c|žë—ÌÍéýjò¨§°‘¤%Ux|ìk¿´®ðɶ-˜È´žvyÜwK É å«f–Ý5\‘F}[iB DIp²‰ìfg35°;<”s×´iö€°1JÓ-èHÁîT\t 1QMˆîßI\­nÆ€}c‡çx‡ÙYÓ°Co+èæ0„íÈÂ,O´…Œeyð#2°:ë•Nâ*WÐ/éÖ ¬À`ó«3íUêLÒ9Z í—yÑ-™Wó—×:ùW|¡—'¿“ɧýÆ[´4VÆËš7ˆ%Îc²SÞ\Û;SEÅ;O«çä‡ðóõS„øÙ¼´Ò´3n­–Õ×ýϹw8ºøùoGîíõ¯O O‰œéÏöÇk˜}=Z½Ipª‰¸AãÂPfÕküì½¾ÅÎåQ?ãô¹Q+öþžÿé¸Úšn⤅< §g¶ñ½{ùøµÂû/¹»rÁJ ¨> cHš”ù2£]0›pÕ[‰¾Xð@»7jBƒÈjwýt³Å†Æ5Û4ŸI.yöÀ/>fUy™C×KÎ%ïÄÒBKkó-r%üÁ’LÆ´é®–a‚)Dà- ЄòQ¡>×ÅOGh#Ûk«P¥IñÜ]8s€<€ çߎìïwñÃU$…6ÀŸbµ§ëD9 ©ºÌØ>ÎÏ@´X/Äys;«Q'ûøþ诛­ ŠÆuQ°Au››¶c›{Â×5ºL‰± 5ŽëH[Îðö³Z­]nƒæNž,ÔÐu|=e}O€«Mx‘1½=éÐXÑ‹äوѢ˜¶.š{öÔ´Äñ«å¶Go×Aü&(Le±l20÷^lä™»öFÕoÜÝF"סt/éïƒ[á` Χ}åÛËÇÌÂÚñd¶òiꊶ•}K¹ÆfÞßËw(›I;Á0zRÀµÎ±xÏ8q‡×¥¨Ÿ4!ù€÷};³òâ,°k û:·ÁäÂõŽi6Æ™§V‹ ¾fº¦n­M”âeãN=¿j÷è¾~š]*‚D´†ñøÇöM÷jG!~¼°5 ÚnL&{G~…ï½úsê¿+a Ja]ÔÛávÊD‚G÷»_Èýe)„³>X»‰£6`#`ÏÕò#ŸHSY· SÓ jTŒ}eîÕiID;€8¤„˜Qb ‹$R‚%)B!X®e£Ç5dHT¢¬d¥h,E‡­aãÙ“|ž,3üyksÛÊÎN¬aѮƃ¶Åþ8wø&$XV5ØC‚·«=CLE<„ÐQ‡†=„pà÷û©ë³“¡9Ï{™ûí¨©E"ºÛð°…,JBnMŠË‹3âöˆ*©¸Oÿþô?^³ê;?3xaþý²ŽU,ûw¯ßkóÇ.Í+*fÕTçs0\"5hŠ¥ÕÞsƒMª‰®cP(PŒ§|J…VË©‘ñ¡bIÓy¡g˜åã ÿÅñE™våó¥Ï1õnírRֺǭ!CÖ# ¤a‘5éZ™õN¯øo4ã.•±L!|$¿é(ñ¡/}n¦«ÆÝ}]“`>t MÞð;€5 Ð6±I”]"µåÆ,vÞ¥èb¤î&Ø­«;IÏU½v鸜0 ¥¥÷`¾?÷\úR—ô2þ¡òQ³êt‹¨‹ëÔšÇò{uöÊlŸçÛÞÝýN.wnÎHVR$”¸bYSdaéŸVM4>ñU•À̸±@ ˆöF–„|Ù«U€«•ÖL ¸ÖûÍýÜ 7é³^óÇrÎÛ\7=¿Ž—ýêz—Å2ü<˜Ç4]š<>=$k¼¹:°®pÐZ½‡6Oßç.ù²Zòù¾ó•>+îäÛù9:ýEòÒùnn®s,NPAcúwd!P ¹Öšk? ˆÕ© 0SEõ§¥dÚÑ! Pf­`–I'Û¬2QÙÂ|;¸x® íØBw÷ù/̉4ÞöÜN™K÷÷£Såã^¾†—ý}GûWoîŸd—ƒy¯oI±Í~˜ÝcÊõáIF*‹*èŠxŠÙ⡉KؾiÒóÏ­z F+Võ•Q5)!R0r4C hÅjC¥1Â8@J®±[JAMâ¢VÆ'E蕱̀ï^à³ ‚)›Ž+ ÊC¦6nÆ›—¼6S`ËE¿ÃÎŒ¯ŸÜ,Ýþ~u»¯Ëäi”öD:sU)1‚ôn±ì7ð\­k¥î'íѬoVÖ¥oµÃOÝWÊi4ÛÀÂê A½X®áLM’NxoÞü2ü[þ œ¶Z óÌ®ÁÈ^·ýž=øÓœ«/¤ŠAÊØ)=MŽS“¸P-ªïIÛtÑE åA0Œ*y¼Š[¦ƒLs„­1Fxo3i¿Qm¼ßM±ŠT)Ä!4Q•)$‘CÈá¶å½T ÀºPQ'}Ο?ÿöû²}Žö“ãU±fcÐl#·Œ‚!ÙNÑ’ØF¤J˜I¨¶<6Ö{XÎ÷5À=jëB Û2Ì 2pŒåÁÔ8 ™a‰äÀ@i!ý:/Xe +"DFhîðvæ­æØzƒ–5»ËÔü0†ö£ã{q\äDÊ*Ü2ýkf«Ó•ÀR#\mH"P¿ÐáTªpYY<)BjÌð›Å°ª±bê}'ZU˜eáØ?3 A&àd ãèu JÎsœ÷ÿ?özy½N¾õ…F¤:±:l\ò¤`]1PÓ²¥¢ÚpõEMnHÀ­ 5V×àV¦æ‰Œ¶Ì‡wÚߎÞ9¾ÿ«üÆÕ¯®~)‚–uz ì‚ìÈ%¸5É•\ˆïîV¿ƒ€VXcôõ ««HýÞÆz)-h s¼Lâwüã[g~ û_0ò1æË:˜& „1UƒÆÌ‚ùÚ2еÚsÖæzöGÇ̺–ªgÇs/súZ`“¢ƒì¡-Ý}G(XXGí3Äî<È!‹Á¬x*á U \ûÒÁ§k3Þ \oû¨ÂñkÈŠþúð¡þ÷y1GØ¿u†–Ö¼ø÷«êMˆÏƒæÇ}©üÕP,WEt¥ÁòP¿»ÔlŸuaXˆk?ãý6ßoûì“íMàõpZôÜZŽ4Så¢;šê5ZBaYi‰­¡•SÖPS i®å,ëé$ç®ÌŸR5«?c9ݯsÉZÞ7÷r;žóñùc¾·÷óÚá*º{­ß},‹Â2ýMý¼¶Ú1ƒzŒØ;6&:˜ÜEaã赯Ó¸B·’žŒÎŸO®€@" \[å9ÉdJÕ´P¬0 —ÚŠmwBàØÝ‡OñÐSõðŒg‹ .'"/¯qÖûhS3§€èË,Á%`†%Íw"(³ÏÂxÒ:#¤ùûùNü€L h¬(ýÓýüy=\íµ·3þ阪ÑÓ —Izb{A¤s¼öö‹:¢æ©“ F@IAbP`q…'†—\d6R& ä.5¬Rz-³¦ Ïø®§ÞåœRéìuòïIrò~î+ÒƒŠZ‘‚¯Ž§)H5ãfÙM]› 12m¦¤m ,1œb„$ C/kŒðWY}éþô÷„ƒ¾ízÚH·QYªæs\æô¿îµY—UÍõ¹¿=3ÊÈÂXQªUÝâ«­Á­>–çœ{OëEÒÈô";8Ÿ[Õ­z’CñbVÌd|¶Lí1fYÝ@‘zNdG::äbß@êû |~ÌþÑê6w½FdÙ&nQY¡þ3U8L6S…¶k¹÷[‰¾,yœAM¾Êis÷Hƒ¸ì§ß1æýçUoÂ*!'B-rb&laÚ9ö`&{h´èzÛÍð¶ŸÜ·ïµû›è9vm^–á‡ý¼ô/ôõ¿-Œ#ÁÀrÚxÛþP‘™›Ó‡03Ç‘¢¨Ýh†Ó¤8lpùñÉ@Ü¡–1!‚yQ“mèÎ{ÏÓìVÔ: „6-Ò)e³èIŒŒÊŸë~o?Žÿ×çÿ ãß{=VñýôÈq&€„@2&&½™ÉN¼Ïjµ' ­Ê~ÌÔ·x#ÌÞÎ }Ò*oOÖÒ´sHÌi8¢ëDŒØBVÌiœƒ±G¡ ™ËÓèÿï9É»9ÑÞv8庒3Ù37VÊ{?=ôãã»s¹|ÿ¶ú»ç£×û¿}]¹.}^÷}:\=^x¾í^d7 ÖKÙOßïÏN1 B’bâÝûåÔ=ULCkûÍÿÞVjòÔ9luEŒþS¾l}š<@ÛHe²zÿè=ÿüiHˆ/Rv86Ø& „-N1±Èî]qôãð¿êÞÊ[<Æà;CðíÐÞgœUãΔˆ‹µqÓfÄBãpŒç©äÅ·RFĞͻ,ë«òXZ@KÓl`w=pÑ żaCÝ­óVùÕ4—#ùJÅÙÆ>íÄxÞ8ôÏW>Ž£yCI÷Xà`€žhï}v@h s}y ¿OÜt¾±à¨Ú7ÿÞ¼ûÌÿšâ?Ž–—?ûŸíW°õ hUp#íÍ=Æ^.'S ¬Ûí-›~¾áë#tB¯­¾w,Ö1-¥³¡à ˰¶m3}c_3‚åüQÚK´ŽœÏ“ºÎ²êÛýò}üÁÒ’¿Í+2Ü`Ÿžy¶°Ã‘;«½±¬v¤Í®Ög<ÚøswÝõÊ"P7ýù]—ùÞäý؇ûèOòbSdhù N î²‰=ÿ8±á›tX Tl»–ï;a¢$\f5dƒ-°®Œ#Fòƒ˜LoðE%Œê(PŠï–ß8Ò²àªÜKpRtð„ o]óËŸHµ:œÓš„è9+ý(ÿ½ ß­Fâ£Μc§ÏÝ‘âPmb"à¶EøW eYBú4&õ¦‘Ó½ ­³–å’û@ºœMi â  6p‡î02 |@â gûr`HøÑžÃJ)ï(¥ÎBÑ)`5†H schøn¡änÆ`ûBë+p†„ -ÐeÄÉy×Ðè»­æn.°W]„>Ýú4ìãÌ÷[ÒΑÈÈ­Å&ñ>RæÝ2Ÿõ&ð2¨ÌÝÕ{âïŸþ¸3Ë-÷ÊnÇívXöèãï˜BD1·ñmz o¯%3ª+ç¯#ëö¿ÊþÕ¿ëkýù©ÕÍã¡£ù¡pZ§ÊÛ*ϤQ‹×Nf–¸ÔèÞ‡ê8|ýÁß[«xC.8`õ¢ãÅ?mš•XÝòëç°ëïŠ¢Ô Òîòt† ‹ŽLPà‚G€l¦ǧ'!.96÷ °hµ@ÿÐ §[s·ko¯zØZè…ŠpQÃXœý¬ =dÚh¢›r ×·Ùdnã:Ân`Ú¤$W¡ X€©SòËvKþóø÷máØÞÄu ‡%°­àxä1“AËã§6«¥5 €EV¶ŸòTø@ ´,3Žå¸{·áýÛÂêó™oVˆ ¢[$•uoÜ9)ùÙàváom×µƒSrëU²3}ïÚZ‡K\F…´ßîåbs% _ÑËZáÁñ…‹w–nZ…ò('(@.CgÖûS°aPu†syÎßœxêýåë›×áÚe?¬ÂÝQ„ƒp” a=î-;Íåäu{úðŸ ]X#· n ôrˆáÁÏ=ÙW°2ŒÚc?âxžóû ʶÓÐH”Ãˇ’ “ §DZ¦qU2â}o»\™õ$)au•[Wx?¬âš÷Ú·ÀÎÓ»oÄsÙ}NôèK2›7ðéVí(ˈ+¥†Ð¶¨„d–ªÑz4z o#$D´ç;V¸4©]å}eQJâ[ôkݔۨ4ßÌÒù^5aNœšÔz””ûÅkPƒ £„!Á+Ò³ùœ(]ÎZ”ûÕå~ÍzÎç±dÊ)“>™†1²,B€T˜Jœ,B/Œ”4 °[3©à=Y´¡ÒDÆ ¹jÚ¢å8¿žÄiGÑ»×qóÙ½×:ü¼^+öÓШiØqBÁö¤3à·4ù@w¦ €j›]\Y…‚`Dbû¼2‡ (@Tž¿©si¿*Ó˜öô3øV-»Îñ¥E+ä¹–”™ŽiŒqò¡Âú®K—EàzÐÌ0總á\g/Z:NoUÞ¯Oú2‡»pf´,f‚;}8ó-Géc1¼eAäî¬<;¢^1 ¦Q%ÙåMVÕ®y‰±l%S±§ø(Û@/à•™˜ žó¯°Îûkhý~t½­·P~‹—ï9Å:P-V ´oïÝE›¡ —²•¢aPZ‹Â¼æ²¬D2¦‡>þN¶æšØ‚$…B,#!ZE/á_w´K3&ô’«v+é$lµ*Nï>nÏV4m‚;“gJ2‘ 9^m¦†´AÓVƒ äj=`-´o‹œ~¾~Øåf­¶1Á®‘KAMøÙ§³'Þ:Ÿø¼¿{Óì¾3»¯aQ-ŒÔÕ-º@º*(ÚPû ÁABa&° @^ì(†„ãÝâă Žjï‹ø¿o/¼öóù¤þñ¦©`V(u£„¤0¥shž9Œfe°Á²ºèˆ2”RNŒÄHÏÀõìçæVEœ«Ör0ÛSCênýÒü,õè"¤Sƒ÷–«ÎšU(T'YbHE’Ž­¢%¡B™pû WI¦ºÔ@˜” ­ã“¤ƒ “[½Õ €bqV3œN„û-xDtG€ Ñêx8kÞ>mh9,£&ˆéT%¦‰â©Z»mú*WÖ¢ÏêS=eëq?,?ªg}Ê{»Sœ©º ¤›ó´:²¯Ÿ¥w*t |"D?ð5'{®CWV‰’Õü´¨ÿ¥ìooç¹{.Û~®¯¢¡ìL¾kù®J£Mn7©2UZˆ~ TãžÞ»ßh” såâ$›tJ…¡‚DëÔòVPI„ÖEA@âJM1¤œ5ˆ’J [Ø­B#r›q±—Õ#_ØÖŽãâ5ës_pÆûçsŽ>wW¨Ë«7ðçÔ"}Átç‰@Îr‚ÎÔYpñ™5 [Ì]:moWçœ0>V@n¿wÖ ŸßyøK+BW:SdTÉBêÑýe\Àh`LRΗU¹ÿ_›ÿ›$.)%$h¹vŒOwÀÅÕÉ4"ÔOÿ.’t¢èQˆwÀyÇi^öÉpQïaÜeA3¡¹…8B#§=JkNò¼õd/‡›þœÌó‘0µº‰ “€`ZÎGy- €AÖ¸¡C,-fútò¾Þã¼ç´çšû™"„´F--‘«ëœ’Å`ÒÉWR§¹>Þš¦.ôZÝûåð»!ÖqaÚ^Û8‹ÄÊ(©²ºŠb$?T6 áÕ ]  VHÅ^tÇ8`Ûùdõ‹¯¶] 3°åJÕB«+Æ'ï2We…P @¶,ÒlC1Úp1Òþ(*϶žˆ^ЦNN IIä‚iaMË98Od,Ÿ†›‘™¯’ˆâp”/j2¯¤&UQ]B)ÌìÒŒ'ª:ÇOß=ŸJ®+úƒYr§ÚÇ`G0ÑpâÒ¿"#sH×èk&<˜‚C"3l·¶Jâ"çŽwú9ãÏ>ÿ­ýû§ZI4=³asÈYƒÄ†½Æ¬'Ij)%àø¼7d>М¶W‡×U­Â?в‹•Ç•ÕÁ¤º{N°‹i±8Ù²‹fZ&•U™!È,—0ÈžzŽ»¾„@¡5÷²¦Œ¸]*VÀ Š 5€½&0…‰Y&“Ì%ËF›·«9Öq håù'A‡×„u}³þ‚w2U]ÀsLÿ1û~îýæÖ±N”%yƒq.:œá>Â5;ö•ÚÛ¾Pt V/¾©á“Ûj+ï¯=×8gžuêJ[ ¼íÚȑܜ¤5‹ëT¨|L:moힺ*]eßoK H’‚þ–ÈP_iÙbkÍ5 Bè€ë2ûœïSf¿OÐÏÍžævuŸýéAϯdñÚܯº}úô{Š’‚iHŒªÞf¡7/"]QÂz÷¸JÔ•f„¶ëyÚ^èjä!Uönñå%¿ƒ¸5 ±½ s¹ ¡!îiŠ€˜Q¹1¤ú@ÀòP…Ê(ú>%\&z“çZnz˜f"È1iG$SvT€!­¨Á)W“¨wÉQ·cÀÓ­¢·¶2oéaô€?Býè@ôGjÌ‚¶ùëûÜŸÚ½?Ÿø·ø\~p›Z<=‰êX콺ò­§°H Eœ¤!Ø¿GçS‚y¦ÙÒA¥‰Dj.ò>Í™’ßší„›{j[ºæï‚½éÛ2íÂä:¸ÂL«6T€Èa®ƒi%›yx¥²/úudQs@„ÒŠ+"U†"#'ð—N¶ÓErf¯€o£ñ÷X‹B)ðWz4ž,˪¢üÕô’C‰LF™#f#’R¹Ï²LÎâ ^×gZi} ‰Ym¼nùÒÙ ‚P¨ /pLßœXª4qÅŠ–”ò#èîoùù¡åÓ‰ºA$(VrQŒ0¦ªúxaLé(@oΙ/o©§²Û3€“ú@¦8L2L7dú’"°K¶gIˆù³5nÕ·•×ÇÆÇÓЧA®†…ªÐQ@T bäNIØ4„Œ CM;ÓÑß÷ŒdéoÍOVVômýŒw?qüÏgòj¡Æ˜QN@áº"}qJßÐéõ‘µ9ZLü›ýñ‘ñˆ¬Oú—é¥Û~˪Î= Ìͦ5°«Xê)Úç‹!uñ<(eƒ¦–ØzøùjZ¾³É.ÔŽ·Ä®œÚ:w¾ âŒ4âk,(žAå(oüºÐ5äyª:Іs·V;WÛ/sô“Y?˜?†¤ïýŽ ¥>ê‘ôCÔÍ JeÎy„ŽT˜kO]Ñcßoƒc.¿~|{1í¨I« íGþîáodre7Öë1¯™Jät~düÃü!F~y5¿ž´Ûç”h8€øå¿ý!¼šGù%[SÑîu}ÆÑ]µœ]¯9¹V3hOÐOŽœÓH ¦v¹t®ÞsÚ×;›q¢çôëËÕ—ÛoE}cx " @A·„=¡:.ÌÌ8|{—Ñï-´ZjO­ÈSÅÎUˆjþP9Z (™Ë™í2é0¡ð<Ÿ¼v´^´iŠE#a5’Ù¤˄ ó”Jðd6`,Mûè1túÌuF­‚«s<}Û„æ=Îýñ™m&ƾ(N4ÁáÐÁÌ uôð]V;àËT׎b‘©t8¥†­ŒeP¦Øÿ¯lü.öO½ñæõŦ*ƒ«¼ÓB –ž§Y[ûìÒÌ¥/Á|öçÏÜîkRb%‘‘¨íǽÕ)êÅ´ª/ñhM{hªÚ½ò0 à5`]‹ñdÿÐo|ÿe¹ÕRíÞátýwßáž½X>sA×ð…ê³âe^ƒÌèÎ2.Aª=^îÏŸÏrBï)B™/!H½S|Oþk…ßé¿oͲnÿ´o²»X A fùL ¹qÁû‘þG~MîTrZ C [RðŒ¤,A£x fh Ò…ÛšòÛ=ã´âµ*U'Æö«%gQ(DÈI4O“F®¥=ƒd‡híZÅÑP•A¥Oc/¬À Æ‘Nh€k¡ET 0( f3‚$  €–C8KÀlÀ¤¡BÀƒ¸ØeÐAtÆÐFQýÎÑf"lJ¿®»¤’C0`ߢ‹q‰m‚¯¢“-¯&ãcÅØˆËÇ:»e>v#4¯j5NSLM0º(–2I¶ÂNÉÝ¡ºg[%N^öh«üL¶§¬ðJñPdt±Oi®—S;äˆb ŽÑÕÖ‰a¢7Ž„©éò!n<ϺêöÉòÿµï¾çJöË-:´Ó|¹vlVµ®úœhkì0ƒóÍ9h´ÛÌã/©±q!„ÕʈØÂãÓ?JÜ2´À™ûÜ=âIÒEKðfú—‹Ã_êÎ_#á›?Á&8|¤0‚U%' ¤Ç¶Ú°í ø´:ç}’ãD`ulN›Wòú ~äï 7 @~¡n¸û²§ÄÌ›a e„&H @ÌÌö™ÁgüÎèMDÚŠ0`a% =€ŒÀ,ƒ HD*X—æ¿ÌY†».÷×¶ùò¸=»txꚃ+³ÏðŸ^:_nø7wð[ïõöxúCßñ™µC¶(ee-n1¶®dŒò<(›¾-ù{ìiï<¸Å2ž#£Ñ¬ýíŒT†¼ý›m#‡V¢}gÿÖ¤9ãµ™ÙâÆÇk– ïæ^‰Æ­÷™¤½ÚN»h•=áPöØÕµ@1Û»ŒŽ†‚R#DSaAÏ·4©8â*(.­Z˜{vÙq òó]!ÁÛƒú$Ï‘H® èôDŸ<}Å__y龿žŽu†þùçÏuŽD`Ð »'»KVÓŠ `D.’%™>‰ð $&\Â¥$¶æÈ'?‚¸œBtc©X” ià” tFó3«ßy7î×MlÛûš‹ä4bÂÂX—aõÂ|Ä&sEϤ³½|¯_>Ü„E¸ª]r’C5¿ ¶| ã…‰o«v‡"XU}4g4Å©l5ØæßÆ7:å1ÄXh!ø@òÔ¢¦ûð1x' é^ å1@xîHÆTJpƒyŒQ0 tȆÀ(€l6Àáxr"ëê„fEÁp–‹á}«'öWf‹T‰ž.§ÓM…Û=3-® BmÖÏe´£G¸}ŠlT!„gôëHש»™áýÕÛñÚöë)KÀ¬®$ÐF„£¹;÷ßÛþ ¥dcØdfa#ˆG"h:Ÿ$“,a„]Ï9aúõvy~v&.gBœ€;A¬ž_ïü‰›Ÿ<œô¿ÜøÚõ•«˜gâ3‚0ËIÇo”‘ "ðÖM¡ÛÔvâ‡IA²­ÒAóˆ2’P€”è–Jo™cë†}põÊrKÍ[èÃð(³â¬_âüá¼þÔgXßþëµ÷æÓù¯Nê¨^P˜ÐŠT  I•ùܘK¡X³ WE`5䃔0®KCÍ;¹.±Ä ¼BÅ€@‘`C‘ u™¨`;ª)o:2hA’mü«5Ž™´¶óL¦,`̱£oìY, Ê‚VcPœkËh¹‹üÍ™]4»‘ °ÀCpí0Œ§Ö~?[ËÏ÷4×ni´‹ë ^‚ý@×ïǧ2AT,Ūê¬mEe¢’AÅ'¤ZÕ%«Ä C I…ML1á[¼" nƒºÐƒó7ù~вîås›Pûí__Çï»™³à ŽjŠËsh ³e u¯ p#LËD½"×zŸÌöy‚ÊÒQ}Ç‹9g—ǵùVè`-'ýfëÎe9NS% {-“© uhh[7…+´ªª£Š@ÊÏ›PÒõ42,6œaj€%€£½É ÓžåÀ€äŠkl‘ÕŽžš‰ý'sô4€@¹bH”GˆÇßÙzQEôšmJX j€EÏ»õ9Šâ±g‰F6'—ûÙúú~'¿X?¾ý¥yû³.Õå‘'ʱ]”ÍíÙÈÈMx¡žµ UÆÕ†(¤¯ë–7ª¼–]‚žž­ç)ó› €ü Ο|ÃßÌs_ìKçxu§]ðM[çÄæÀ h(ìê6Zª'TµóˆÐÈ­p#×ÓÒ\„¦UvÝS@áÔUÐ`1H!Ž$ÎÄPÆÌ‚â" ¶ ¶+`QnJÅOi½‰ë^EnR"…(çÒ2Óöθ5ùåÍÃýŽ\<— r†]ên‘v›[­›´Ö®·mÉrëd§T߃oû8ÞnÖ¥@þwñ˜¦ä²}Ýû‹ì‡õ>%õ"ß~ãÖäöÛÎü2âÎ5`¸yxæDBˆ©.\Êÿ¹7l÷ÿØóƒ²6$P¼ dÝâJJZˆ:ƒPTqô#!S»ÐíšPN©qAW€Ö6X4L < ¾‡LQÖ¸*ÕÅ +N‰'™Y:µ&¨ÓFÆ\„ÊNצaÕ·¬ù¡Šf#´|ð¡AmfÅ3û8¾Ÿßá¾½ûïÇÁ8«º™j™Ê·¯P›ì8:Rd×ø¾°\¸7¶tf÷¥ùU_œZWqŒ±EEˆ|E6fx™&‡G)ðƒlrxÝ-u…Ã-Œ/„¸*ðòòLr$CQŒ˜¨U‰- TnÈSgïu¿™©ÚŠ@IŠ.ÇÅ’e {)ö„çiŽž…%Ê•ºJ…ê~€í؇>E±8_¹»ò<‹Þb3,° ßf<“¢ðÈ¢GùÚì¯ûç+£`X'©ÓÎ;˜éÔdH‚" ®=tWjÉX:E÷ÉÈAr&Ç ]p¿lå•7óùwOõïó2n=E£p“¥À¤½«ÒÈ¡fr{ÈQÙ]TO›3‚+Ý?ÕËf¨l–»½( â>¯VÂ2fT¡B24ïL#Ëòqa¨˜‘1æS©”2•I¡éé´d=ÃÎa£ÓvF Mj¯oŽ•\ç4¸âˆõˆôP(› vibŲ”¶nïåö! ®|¾öÈjŒ–ZŸÚº€×G§6}&PjaYC•Ÿ]÷ŽÙ,„®œ–˜†ˆg/r÷ݺ½Žõ$6?ZÐÆÑÃaq ù2Õ¿”¼]ïðzvÝðgjû!ÕÛä’?g¸¶ö¯ÔÈÔ[>+C¼wº–|t]:-4¡ã½â®™þ,o÷v:ñÖ›ΟçSçñ+|ŸÍmÒ®×Ýo_™sëz³;qÞ­ûËÄÁÙÚË®ŠwœAæ€L¹‹Y/ëÁzNµSmUóxêýù-¿™QÔæqeËØUØIaY7^Õò–•gXäG@/œ24$À,UTaGÝV|Šp&ÎÜù™Þƒ 0h;+T)p9ºpšä‘T$¥uaëÉêMÝy’BÖÏ>›§×•µà†:±e Ÿ®kê3vJõ7<øöñ8îß‚ž£¨ýúÝÁñ¾÷ú¶X[DM¨SrÁýë÷ÕCduøÜŠ A` »äfº­“øÈ`ˆÄonoÓ«6¢ÃË—+ïµs[ ÕÐf‰Ì[£Bi¸²`­”•ãXÉ•3[ P뱆gQMv5}; PÝfXÌuCè W8lÔo ¨ ¹†õ´Îñê~6Á9û.;¨¨X2fyC|)›`a¤^y`ÁÂÞc¯«†Þt6×úH37öµ Ó÷µðHosÃxí̦!È)“m‹Î:b e§˜XÌ@:§ÝÈmëõfƒ…q-èùt¶®e3D:_a¶o¾|íÕÓ Ù>Œì­¢LÎÙ“éfLê™kóî—?·LÒäL™j+õÈ|˜ë÷^…_ilŽë•*¾ô´Ñ5»dÐ*"‡øo¾”‹‘B6®ÿ¢Êo>:<Óµôó$îýëwßï™ù//­…7?)å2uE9àªYš“Aš m?ØiZ"œAúbÚ œô•ú ¢ÄuÚ‹>ˆZêÿw•­`•ÜSb‚`RJ€zŸéÓ¨«&1‰AZh÷9&0%”F@âý±Rˆ7Ru87r0Rt‚•Saxeé}V¶'›FÒ+åSÇÏéU³Åüø;>çËkÐ×-2§#>µó°i›Ñï¦éáu’Õ­ìô¸`Aa\›JVËaÊFÇJA-Ã!@i =Ãì ¨M³ªÚ—¿’‰ƒ2v µRß .Œœù[ì›&¥¿>·2QºcÃ~p¬ó9 ìv%¦ í³KJXþ“­ŸÚuÝFœÀuEóÖ®áKÆ*'µ]õ@7V(ë¡Y÷±Oü.“¸‚DÔÓŒ–®¼û±o/7^­oÐŽi,%öLÇfgFF7¾sYo ¾[¥ô­=7.k—[,j[¥»÷¸{ìXj˜Üí¡ðs¢j¿’¹³°mñ“™ ‹­g(>ÝÅc&wË,m“w9ƒ'5Ð&)S¥ 1uyYíDûGÖâ³Û¼ý忨¢$&̜ާ|sâ뀋ƒ00…Dƒ#Ë‚lžù×óù¿¿_0VÃW§_.È£Ð$[Dßý¿ž(œk‹ ÊwmNÆWYŒç ôÄåõáŸ%/g/ÓýbåJwm̪«mÏÌ-qmQlánÄíã„È–™Ì»fŠ:PÎ9Hï=wšrß eäã#¿®(íA4®záG"³‰}óޱFdÇ/a‹ns>u›'–•ç€bw‡lZé.³GÕzOûÄY–‡Kñ‘4I2WSCä}eéòõÍ~RsM¶&™p½/ëÇ’^BÖ¼¼FœzÉømõÿj¦¬·¤ºW$Z|a†"BD—v5„ìÌ™:Žãv$š³ ×nçù´Ží8 D Í` Iœ9,R‚rM÷诫þï>Û½ã±Õé®™ÖëÁUÃp‰×¦É]M7Êž® â«|> !&Þˆ•j5hNçUn%$äè£×L˜7'B°ßgrƤHX`ÛD-Ìâ“w/~@xþ¹Þ¯\¯3F—½¢#(õ&çÑÄq“Þr¤I87Ù[ί÷TcBQ2«¥ªÍCσâG±»êLHŒ™ôgü²¾šÞZ 6²¢ 3Í2Wq^S¯ÂDªÛãvyƱ©(ïÌÏ6]/Žöîr­@ª9QEnFL ¥Ÿcšóßöl/gͪ?‘àO÷þ$t•,SFZÈè 5Ê€ÊÚ~iéå¯{Œ5V‘8†Æ"ÌV•ãÍÉîÙ Í­  /·Î!Ž¢âTE¨Í´\½Ò& ^ë&t,+ð ›Þ˨F¸'þ égñׂiÏ()¯—%J…k€¹¦¸ÞÊ‚/Z!È+ „À–ÖB»7ä…Óµvº’Zöäp5\ü)ûûý˜žÎ‰ˆïSÿͤy)…½ÄE–*¨N ø£FRQ4õš4¼AD¥ÏüiÇʼÒ*tuÍ}ÿÀ×dNÆ­Å×ÿž77õ¹äœ¥ñ¬ˆ–‘TmÃxT3ÛÔŽ 4å÷¢=½‰WÔ©ã_ГÔUOßx•˜9bO´Âý¼Qžsitè4²`%ö5FHˆxJ2ŠbNLÇQÀsú¬C ¹"Ea@ЗµXH1€•‰*,Oa‰=¾q(háò“wòâ@æ’HkJ{†”°óOŸü~ìô¢÷_›Wyq˜kÔ1þ;^7Ýš‰“óÖx ÎÜßýžØëþóñj3mý‘km—›Ì$èf :”¡0¬™Añªèã Îügiÿ™ð¯‘C ¬‡HƸ¿ÈT,þSšÿ®å?>Åÿ&ôÓE]TIïáÀ0ÄIÅÔ¹-²Dq­Ûµ½º]¦Éö;Ì£n·Èéæ P ") ãuƒ Kô‘§cÑBT:³¢½¥ d#J0hj 6(‰hì"ˆŽHW=…e¦ì5­Ž%´º¦’É×ùöÒÙÈz²?~ÚØçŸ Afª¾}5Xh+BÈzíìÄõ. X|Æ_ŸJçõ粎I9Ž›ƒ¹pɱK›¯ºˆñ“ïæknÐJ@d@±îùu¸Ï—¿ÿkëª&C“ë# Tá:äØn.;h.T,k,!-5›Þ¤6öê¶*ÔŒ¯Y¥0 k°`aL§RE3©dúvêJ’ûÌ"®Õ;¤ï€ûÙ¨Ï WÓVLºÓdM{×'%`øj;ñK×9Ñ Œ¢¢ 2ÂãëŸØ_÷ØM}5CïÒ+¬† oŠmŸêF7<Ó8Õ¬Ýïú¬µúÔËídf×ÓóýÃ'ð•¥Í$TF€‰jzË©mÍ'¶ódŽEß¹N ܨÕKájV„à¥3—.\˜<>ެÜwð;«§îêâ ÁÆhÇÄ­Å: ;ÍvªH§!}^ÀQ¹‡Ú`Q ˆ1¯,]ú¾ÆÔ;NoúË`Á´Ý\©žsy¿JÕÀ5JÚø®Î‰Ú×H9“O#‡µ'?VƒŸ{ïWÃÔÈwëë€å³{kúœ°Ó5-™vÏTóTðJÉAV‚Þ‡R„¾Z 11êki_º]-«¶k¾Ö<Ïqߨ×ö19ÏÇÊyþö&ýýI[ÃCeÁÔ¦09gý0ènBìèl Úò—7õ— ¸/êxìÎú×5éØaN¯{ðoûò—×…ÂÄçÉ~Œê®lAžíX§szË" ¯CÝÉG®K”˜|T0€½ù°‚9œìÖc–@=1Þ§¿_ûw²ûo±(aså é2ò“3ˆ`"ù* º^•¡@‚Éb6œFUR‰ÅˆÄ$üˆ|Ÿ[ƒFí>©}ö}KkkÔõú]|ókè|„¼ùwéL¶€ Z€‰¢¡bàÐ=zèÎÚ:2RÇvg ÛÙ‹D€©·ªVÙòܬas¯r¯®fë2¹»9T즥0²w9fƒMHƒ¤†™ »ø˜¨ê+°éaFbzÈ„”°@IiÊ¥lÛôTA(USŠ ­¸&~žô{Ú˜1ù²”¶#Öû ˜¥ÉD2êdW:ž MPóZG1ÜÕŒ@#^ ñòÊŽ"c÷4*âS. h,/*Ðéîʤ‚L³ÛáB¡£¹KÔèê®E:ÀX‡6ˆ-èT\¶rYiçÚ\¶[*CK“8Œ<ðÊ×q>€ ‚K¹§‘J¥ñ÷ýƒÃk~¾ç½æ,:&U€5Ò‹%¯a4$†X6ì6n¿õ££L%Tù¹?÷·R¢v=Ç2¥ýs¼¿µ•–-ü­iHq˜Fêb¼>Œ“–¶3åB_ĵÅOù“k©ßPÔN‰ß>DéX­XöpíNFÒ¯W9¢­ëmmo½©ýÌHÒnÉH×6ðvnoïb‰â̼ç[Ž_)däL¢åûwBÕýÂJ¡­%ú 0d•tTïS ‰seEíjg¡<~ýfnO¼ÿv‰ûM÷g¼Ê«ßÛ7†°Â› †ÌI>êŒc‰»$çý|m*YŒ7ó©ãõ̓±%q³wë”&“3b½nÕÙšûé®f+Z „ÀDeµ‘&Þªü{÷ªýΞwâµ>>DìH3©ºöî@»’ÎÞœ ˆÝ`Ÿ&<•'²‡ï¸[7Žéšê´¯ºgìÐ73˜<^Á‚ªk⺫' q®¸¬’œjLA×e“AŸ˜=®h¹¬êf䃤£Ð,€ä»Ð½bYÍNUÒÒÔ6w]³”6 òB»8Œ ì¼—Ÿà‡±tbÒí.Už\í û5ÃbúWç®F™Vu•»oÚ Èßõ›¹Eõõ‰#”ûb/‹ f›F°Í!§‹`Z˜êÊx îKÖïU¯Ÿ¸ïºKâmíoN­ÁÔ8Ú †ˆ Ói×»»)n|QD R{Bb­6xŸ"rè.¢¨cJ¶¤t4æŠÙÿnþBçÏ^‰Çäl‹Ez.ó#ñ÷å,uøí;Õ3eJEÓv)b—-îÒk~@8F¥ÚÒØŸp¦/’6Óµuª†žz?ƒ>"W*GÊŒOª“wl?6ü#àsi^¶€@Òm¢P6µ“Úí+ORÀ` ž4C4äVl*™NåEs0„‡ÕU†Õí+÷’ a¨JB"R&&06ý^ 9É”46¡¢Ô"SS¾¨ cB‘¸©žV E#Eý/$@#6JÌÉq“ihÊX9+%­î²$áÚ·  5K4%ËYúè]_Vº£DÃÂÍ®?Ѫy}è@¸ûÐÔjHRP ‡¼$Ì-T P—¾Á¡WK½o<_ ºh+[EzÀ<¤é3[ìÇ.ÁF2Kô®‘mÇÕñ¶½Údaõ–£}%ªúcû+Œ@ãªîÅY૱|ú±U7ïÉšÉg3Ý„[;p§š!Ò’e™=½TMÝfÆÂèt$Íîž™ö?œ^q奊C“ª=[k¨Ù½|Î ü{ÁCWæDž¹ÛφÞèfù§Aƒd‹Ç ñt:+ÿ¾ÎäqwäÎ1À\ŸÄù7Žëòœ'ޝ¿ÑîãÞjHc'³ýjìú{VKä—ªÞu ÃhÄ­¯°0¤rš£ûÛùí¢°:HŽ*!Å!·ñ·ê€e$µ P—M‹°ò×ÿëÎþ?C{©à‹XîlEH.³ËÃ=õ;£Óhñ½Þ'å«®µè$YȰV€•â0uÀàå#NhìoþGGõ‡šä¾¬¢ëe-–Ò«A:DùTç#¦îÝÊçoòK0ÔQÇšDšÚè%,=I‡¬ÒS …9Ð “~A´ðŠó¨zùq¼ËñÅø{í %,áfCXìž^m,]úñ²ž`ùþ7< R: iº^%G›OgŠ#6ÐŽQXh­ØõÃÅ×½é (ßH>Q¦,/ÀÍR \¬AžÉ 30œµ’Gõ×,wnÓå"[2–êû“à'!ÄG妃)¦q×Ãå3òjl+^ U©*IYÒöñA˜øUSVÃ*+u'Ts7z2À%K_"qök²½Ü?î¯ßž]m®|©£‡¸â£bf¹ÂÊš U.‚Ô °Öpë…@ÞX]7ˆ¯£’B©N™ÈEj„Kä¬ýcÃH¬¯Þœ÷Gíóõ‹íeæ|}¾¿µf\á-…¤ŠDduùZ´aâgà1”¸QYîC w7%\ª·zÆjÈÇUÔ¬ø%åas,X‚ ²GÎ(¨ ¬@H ËÁ2¥šO-Ö¥jÅH®´, 5O€Š¹„x$a0&ÀZá&ÜBGÖ©Ò¬¨M΂*éѹ‚UbÎÑî±!+6ÕÁÉÍãúpŒ<<ñ‚™'Ù‹ès{Ü8[í$2ØÖ¡µ‡5»"¬álÐ>&qoàˆ´°›-´ÑîËj–ò™,Û*Úe´#ý¹ü¿×ßy`^ újd;¶DEÝœÍ0¹ƈau¨ykõ*ž"RSɉœÕ¢¿Ãò½@>Š…‘9ŒvšW?îû½ZáI”«ë¯m‹Ââ€A9…@tÈÌC_«Ùõu ,¶r&’F9¢Sød%nT×Öäî$˜Ë–Øbhv‘[íÍŒÖYÞs¿7ŠKß?Ùm½†°ßœ?½ùõÏêëÍ/:üò¾Û”ísVë–¬6Vð\gÐs<ì ÕbaïlöGR“d(xÅŠ·òòôÛ^c~—AÛph­ ŒÓ`7Ì¡:ûB¨sÖ䂹—ËjK…2´GžÅÊ ¬®è,,Jë&Céò1Ñx–:É¢F &èhíHUŽÖt‰IsÚdªP²ò÷jr„°ÊÂÂ_1þíª®ÄûxlÌØ¤‹Š™ž¾Üø·ÏþW»<½!pJhâÕ¾ôÉŒ%.†aé9FÍá„Ô¼©Æ:{HLJœ ‡\Y´ÔaÜb;±Q!ÿÆþ|°ÿFÇBÀ´‘’ã8Ѷê ¨ó#p‘1ŽAЏ¥ƒ¬BæâarÝ¿vÕ4§‰©þ0ÌÒïwoIùô'õÎbzùKÇWž^~ï<Ñöx¨› PÇJåb"~ƒÃ½píDM5ã&WS´3g~;My©äÚT[  6u¸­ :š •¶Ê²Ó+µ’9ªs¯;}Õ¬¹•†¢ +]ÒFS+‡½:_ùÍ¢7ճЖ ÓyœER›A& ‘ŠH«ÔBYšçóÈÎÙãÒ¹úzíT .-U,²"‹˜1ÐG›Y¤½LJIƒbôáó¶´.áþéê<ĉa‰˜ÜŒs ¤ðW6ô˜;²9‘ ØÐ¡odtL* ½^^åQ|Ê(wU±7¡T'53 ä7[“fîþ:å· ¶ÙñG7åît s¥mLš"Åð?ÄÒ€dèæ“Â-{V)±Ý-ûD5Ø@Ñ9·³M þ!ƆϹHó—.7µ:ê¶ŠŒÿ9¶0¶A£b:Õ7d!RäªDbJÐÓ1Xy¦/§ZQßšá¯^)n­ê/‹£Ó+Zø=^·?þíóð×qëÁ¥¬JwÒeo†>#C6ðYVE§übX)4Í¡JÃFyÝ{€å}Nñ€òîÈðækŠAaö)ÉɹÍ@$•¥/7øö¼×¬k}yÇûšÚTÝ›¿qî#SåXx¶»Vm>ûÛš× œÓF )†sÙ3ŸÕ¬¾ÃlS‰`•ûál}ñГ+‹mwª$OÀ»¹Å¡ÍêØê£z•5Ó+aÑðT£7»ˆ†ØfŸ  ƒZâ5À9 ì¶íÛ^( tÈ1㙘M]H:¾…[ä-ðÕÃ%QÈ þEÏ©LlÄTÞýtöQK¢hY«²h •$—ùIdh+Û¤xÔ8¡Ó3­øOH††{ëW 9nD•%YO‰äZ]k'®ÙåTW·D¥Â)Á0:˜ÀFxPµì8±£ ÀDJ@À(2ÈDX§M )”‰5À&E\JD‚fÕBˆQÛøàt*í­ã÷- 'X\š>’ËÙK"ù&n)vP-ƒÚ?Ñ6xª¢@#‡‡j|¡QàV,‚`1M ORŒRÂ| ÞðaH–’DQ+pe ¶µ¶­Q¤ý̺àVŒšzú/bý·×yö6Ft5bdÃgÿ‚û?Ý|8ºë®’/ –„ ŽÃöÄbŸæøY!-‹|ŒkP žvqóÖ ‡˜_vÈ£Šº,yú¡çdRÛ¶¶)¶9刽ôÂŽ=C$ ˜Ç‚lzÌÅW+­sÃ[¿ý1Ëã°=º±±û”Ÿz[ÿ>¾YŒ¿Jw¾²ýÖך˯Ðó.o/sùXÑB¯ó&¶NÄÍêy»‡èà†KQ¶%8ÆIOž>;â0’ËV}EBÆ´åßí¶:Ȉ- ªÐ€Áy³xg CÌS¯ÉAµ#€`@|‚à2Ú $À!ðy<_DëªïØÚIï‚1DG= ;ŒÝør>µ}—žf¤DÑ7ø™ž£Á­¢ö#ø1Ò»§ìkqì ðî%Ü/LÏOª×ŒÞ,Âüù'Íìsêjtœ*¢ã¾æP6]eÍHÕ`4D'2¦ï¿ííQçÃæ'öž1TÅ+d!Wî=@‘,eŠýÞd'(ΣàôÇ+Þ}ü&üøãÀòøáô©SšGc‹ÒìE1—ä8¤È°“cŸ-H—6·¨VA½]ѽZÌ^>Q›2{ãf]®é¢@§².‘Öô11¨«š·oÛÁ]–³*H‡[¸ÎŪY,RóŸr]¹¯&nî‡L]?œLÍ9gr63µ¿L9B6ÍÊ©_¶)*ÀŒ2å®®ªÖ¨² NÓ˜]®V;;¡¹?œó©a ‡^Vˆ”(c'kõA}1¶Ù[:5Mê?Uê­:[zexsh¤œ³á­Á³~º ç[q%ùåãÅ‹«³ Öæ¬XÏ "<©œrOýµÆ.|¨œQüŠíý‚ƒI è#¯YÿŸÇªÆß"ãÏú,*ŒQbA†€šm9-.{‰é-ÙIfÿ‰/ê8¼ßG°=&Ã&iÊk>ÀŒŠŸË›¸´‡ylþú̈»TÖe#f¶%‡ ÛPXv×¿ä ¶UÓöêù¼¶ÓQNô;« …ÊļÅén8ƒzcÄÑ`޲n”¥ M„Q~ÍG¤a{ád\8¨R ¦Ë 'g«Ê%c;Ÿ µUš^‰Äê.hçu@n3Þ9imÉÃh8=XØéRyÑ„*K Ò­AR§â¿­jµþÝð{^ó“É-sHªk·n›©-ElƒÉe˜ªZ#Ju8¦ZdšFÚ«Gì›m¬w 2Ãý.sH"+ u=ÚAŠI½ãª‘¦°#l^ùU¢³<TíãK¦F–a,‚δQà†Zêfž¬V‹$&ÅÀL2h1*2 E:<ŒÊW¿Yš±HQ¸Â"O¾Þg\A'RÛ¶;™œ¥ZfYmºé«•9÷Õ5ì¬\ÁKœÉSž¶ÓK–ÑêwÛÿ#×>{?™¦GÀ—‰ëm2ÎùÖœøþt¶gÁç¼3ªèÛÀï®ÞiÅÏÂmØs‘-™Dù[Í_Ë6¬QXÔÊKæwì÷Õ½Tl#5lRÓ:a†’ ]Ûä²—:?Â3(„²±GMüyŒPp“Ÿ…U´w%ˆ§ÔZõ•Ž€öd $+ßQœ¢&b#ÇŠ…©3ËBYH£ ØÑbÙý`§ö!R‰:j¦àb4×̇<®šãÉý¡úÒt¿HBú“ûø?îÿãR•AFà \© X 6°ÐÚ `̬‘²¬\b;¹œ\Síë­ŸCK/Ÿ=~s.IŽçðLÞÿ¼øî߆‹}º YŠ@| tÛ»ä>•äaÝ kVF'ÎÂJ! ³R-3à 5Ô ÆÔ\w‰Q€™†¼4Âd„­~©®GàÖsØ£ÿuû9/b¶>Iï@îà2áŒo®h¬¡Ð ¢kÚ(±H-3Ñõþ‹”ЉD‘VHIÔ†5"%âý‡å«k¹Ó™óºO’ÊÓF­,¦TëJ×8&\\øD^#ÃÊ»zÐZ«4’ðxçàŽÕ¤só4~}@ÍÔ”`…7 £Gd¯ñÙ#å ¸A‰çÕ¬ ÅcQ‘ y°¢@¨Ú¢ÜãSvã¹bÏÊ `f<†ÅCõv8¸ò8…4tiÚ£à2h@žuzºxš? Ïfö˜ŽrÝQ”4Å¿n9l…»j€a¼rEŽ™ºÑs§õ;ÏÍ"Ì…,uEMåû5ÿ¿×ßòÌ·ª÷¶ ŽVasq0؈•ÅÝÆŒw"ê•ø›Äš€H°ÄÒr^¢§åeø6œ…ÇÙ’…d?‡¯§=bI7R»Ù2-( N’@ ¶€v¬Ø lº™Ze”8×Úë§žØçH#ËtlLÎùP”I»‚9`æni=HÃ/B]Þ]÷õ•ûBÝì÷)4ælžÚ=noêžþ¹¦¯„€Æ%áÿé‡ÂzfŠsÔ)uh­ËÅ—®Üëç»ç=P7¶sFãCn»í/„šv¯ŸÏמ¿ü_Ïßðþ­þZ ~ƒSva|©•£Ô•U«ÅÒ°¨1 ¡9¶«Bó²mÊ'¬4/Ò¬úoü@€ªbð1N=±FZ…*‹Óõ$e2Ä ð•¶× toM‡OÈÇE…µ¦úæË_xI Í½ d [³ˆžê­îK­z«õ­$v5r{ØT`‘„^û×3ƒ{` sîkÖr ggž¿ÿíóþ¿ˆñoðý׿ žÈ€—OJA€U€á&hP&Çj-¥'1®Ô˜sc:5Çü…þûþ‹ b òNSA6ÕÓô€Ëâgàù.­Vïu8Ÿh.+ +€Æ$~µ5çlqß-ÊFÑFt™+–ꮪ*JßK“Ìk·ÖɲÕÞÙý±ÜSäáØ¦, k=&“^p{až ˜Ü,±-G.‚&‡‹-¹mXöÔëNvF¸XÆH'm ñ–à(v±ŠQ ÛÒW“··EepXÏŽ¦î{U_˜ (¨ Š kiW©MÛp”X*"™b qÞSxlçv¬ß†Àtq‚bú‚_æÇÜEß3=„¹Dr®À D€ Ë¢”ªrîF³#ñ'|S<{> !´@Ÿ\ySÙ‰#ímÉß¡5Ê;¼Ð¡ÕâV˜±~åÜ/[ñ˽ð™–žkŠå±5Xû9¬£Øž™¸@ÕRŸ:1T}0.ÔÃøhlPyAí—)ÿ òÈ›û¥éž{®rô®“¦"ýQj„G‘l¢9ïÚú=dÿF (Bjz©ÙÖzëæü°'<ã?ñ-_¬.°SÎâ-T×óY…ž¹¥7: å£;»¤›¨dØ¿ð<×ÉÒ ž·a•õÿý³½ @&ÆIMñbۨ׉>¸—_ˆ›:%x¾­û³ô'D §U_îð_^¾Ÿqp…t?èŽÔ¡$´Ž6Ê;ùä•1¤¶š™òÙ7™:M-e43úºŒØ&¡¡Ö„: {¦Éof}W …@HÃG~‚´‚A¾H0¸€ÿÀDÇŽ’€ ¹H{€YàkÕGÇá-Ù¡âZý°Ñ9è§ %÷4Ø™Ž¤Ì@w’hT«Æf8N¸?}è[‚kôÝü/ßA+5 qî!l¯üÊ«M•´_]KÀ‰˜Ú>²´rûïõ®÷G§AjñTB,Í"6À¢±Öòã*¼D7܉%st½•†R+“rh€Û0-7Kºjpì4Õƒ¸cŒ ç][ck‘rKjfu>ö=ÝùǺ?¾<=Ú‘®„œOô]¯ö‘¨ä––%޼m‘#“ÛÞ}ö{ËÜs£r¥ZÍhà6Ìw·ãw ~UyzáØJ¤Á!ZËÀ"AòÕ'Ƈ³ìpÝd¬É‘ô)ñÛÝ#4pä,]øpo‚ŒùYl`š5¤\ÍL09ʦƒ²Vì{Ü»Ü-»Ñô:'žS__&ÍDcwBFB67äèØÑxG3ÎL"¼¶K6Ÿ" ¤I®ÅëgwÑ}gB| 95î  P½Â3ÐúÕÀ¶ú T\FŸ¤Av‰Êáè{Î}÷þ/Ô¾´XêY+„MH Ä ‘8š!½|4åN“[¨Hb#Á¹Ãƒ&à â@™B’¡a‚ 0)Âd9"9tHű1˜4à¡i œ@B2–\5-6† #8¸´­û¬¶ÞÔRì±T)¾”±ùÓÙ§A ÷Œ yƒ¥åN¡¯›|á³x-pÚþ³N˜¢M͆CºJ2/UƪnI¿É¢û1öµe âc^eWؽ£>Uþ]hû=õ»Û:«½jŸ 'ôAÞ¶duË9Ú ZY7LV6:d•f­Z„ïÁ²tBÒ—8ª~à@#PòŽˆˆ„øñz´9ÇêkîÛžÛ›ÀÜýö/ø²¾ðy}r}Ôñ⦻õ#ȶۿ·à-”UK9€÷.}êMÉ’]È^ìD0¸6cÛÃüܺŽîøüÞš³õžã¶/Œ>í×·(Ž/¬z–ÙêeÆ­©ÍFdVí3.íS’¸ Å6>ûÙ´S”†tö¶!߯üW ²}!0!úûâ(¦¿Eõúî¶{…Û*ÜöøprßðcñKø‚ VPº©Ç¾ÌÙWÞ.rg ®„ÖŸG÷72’tÛ“dŠaVjÎËÇ©ÄÕÌdÓ;qEÂöi& #.VŠ„Ñ½Q÷rÒÛý¾½¯tEìúÑ>~‡:äÐØ“ƒöi¤ÕQ…Ø[p“€“:&|èºXëfw§bféŒmŸc;l„'È ü ™ ×Ü@ùÌ}7bªZ+ɵNÑ1~ÿ¡OGrö–fëÃ…ô;’¬ŸÛQeyþ DZ2wWÞ·óÿéÇö8~ÓǦt»(·i½ÈÑCU^†vÞ€i`ËÒh‚cõËÝŒlÇÂÆ4l#hêРHJ4»êIj™D¯Rÿ<ºAní¶®ox<Þ¯Œq#öVD«üï<Ö Èßÿ³<›@6a(/Zé’‹ÊÂ"ÖÞy>»†Vw›:Ä4‹u×M3íò&LÀLñIfhû¶ó…Îÿ©€å šµúÓx¬y!Û4Ëy.×Ú–Ï·GÓŸç–ýääŸö §Ò P^ÜÄ’x©¹"Èܧ=Ž­Ö²ó?¢®†E”ÐxecƦJŒ‡Ú¥ï.VV£Ç.ùs¨h°«äaD) †‘’)È™£P1êFi?SÖÓÛÝ| Â° aÈÊ-®-¥ë¥°‡>Z‘ž{¾6 )ì½Xlœ=LŸîÌÂkæ¤Ç·Ô2¨Ë&÷_uí9'?ÁÇ0¹úß=5"C_ œñâ–q”&1A$‚ÑÙ¾« hTi­ôÎkËÞã—ïuzvnÅ ÖÛ†ºèxŽe’6j”¨US3 |WŸ‹ðdæÁDH¶-=øÊøsÅ`ê9dw•]/Œ½á·¢ WN´§ž(¿q=¿ýe¸ìñ¼f¶/kii‚2rœ¢šfK¨ müvÿÆì8[œ»¦ßvqeu»~y±ûtgµøz5ðåU'… =ã-­Ñ0||oVýè,„?±£üîÜþñËÖoϳ1·ÚJTmQ)ZE)Ъ?tîÌžºg65xÃïÓ{‡]à¥ÂÃ[l¦¬aè¯^„ú¨â¥ÊzkQ•;y<ªHdM6;)[³Œíz§ÙU˜eoÒzU6Õúñw6I%ª\LŽ*ibL¯¢­m÷Ug µ—´{íª‘5-yÐJ“:ÆÜx~1_üÙ–ñÇczKÛÛ;qñÔ{Ó6küÙþï,¡—Ëå?é{¨„¥© ”»QUàUÃ>Æt»¬C1'žÖ*ŠUØ#‚ÚQV¹by¸{~瓚švƒEá-«yi,<È8Öª[b¯«"2 8­àš‹ši¦æÝYà /ëÜ[² `]É™évSCHI0 H’ÛAR$.á[¾ë3OµIªÖ19N@a€ˆ‚f8e @€àIûnÇ AspžžnO“= Å*N?Å»å+ëm`T-Hè>þ¡_f©÷ú;¿Â¬²ãS2‚mQEôjåÔ~ôÔ«êý^fïñhónãçkƒ"¢Ÿß‚k` ¥”òO8Â{„1B©¤ñ2F=^1[‘ÍêÊ”21rëò-0%ÀŠªÄ  OYÛ%•a"ÔÛ®E®‡©qÞÎrá!÷Ù8Ÿ)ESÍVC‡Y{ÍõøÓ¼³2½Fe„£Œ•"Èj§ JÖk ­È²Hk Hc bP§ùší{G;ÜÞµ¥ãÌb¢=…WnkmŸ‰x‡‹àÚÚÚ¹ÞOó­hk÷¡ç‚b4PÁFÂ2€ÍZ© ,”sÞ}5³Î!ézisz €~‹@_v›ã*Ë‚þ­Ÿ –Åÿ»žW¾aÝâÒAÕP€’—º‡}ŽÔü¢¹®è)a ZC1ƒèÅJNS³V1™Ô¸«øŽÏ»÷¸ÞTt¥?•g=ýÿæ¿{?ç3Â^3q™™É‰Õ¬Ž %%H@DÔ W ëRëå™ðCm>ñµíîF9@ñTšè¢ÄǪ°xlp#öí_ª³ö™tÜÊÕzàLw™ëÒC”ag‡mji©¢ëÊ–½=,WŠI®TÁL¾È‚#í->Ú<mü2g/¡œØÁòuXZk+½úæÖBd­£ÕÞ…LXC‡–{º{¨'p³â‹$ø½Î uÙô°âU†va쎃zî\^É[á-Œ8í2†ïuaK…¶dÍ=Žh¡,0R‚HK zÊ•Õô׺nCÝ»7Þ\Þ#TV+MH’Ø*¨R0a•uYøâ·¼ËÅ·lÌï@"‚`Ìpþ“þ›Üþéõ#̃)ä4ÚV/ܬ)Š ü%8Ö½°F51/±†ÉÌÉ(^€â¦ a~n¬t)/òt'>]âIN³cNëÜFÇ` £þ‚¬8PJ’˜I‚,ŸcæNÉ`1'9 4ÌòŽ›±‚\,ë,à,ÅÓ,åBö„º¹£é¾nóÚL—1–Åb­ÆYP!$7â UçÌZ— GýžS/sd¯ßEunêl”ÀìĘa{ó|—UãJåÇ”xCϱ•n×ï>U[êÔI‚õ±Ûµ»W¿ûcûãT®j¹úûñ½?ÿ±vïúi~–þ†=õ qQŠ‘iº°ð[6YX ÇH¼†SΡ©"Q}Ê;ŽÚ” €J¼ž«T–¦žËm®;;­ê ÑÖÊ iiÀ1Pð(\ï]“ö¢P2Åf«µÞNþK˜+¨¢žÈÇ„5ÙžÊû¥{L ew¬9[ÓÍKSïy$}0“qéÓâtÛ­sÓŽM´sgq+L‘+jÍoý»[ãO:ŸZä_?Û¼¸ÝúÝb Egˆ`•Ć[ór•+‘ýœScÍo«Àszõlݪ ô¼îc6Çx»TÓËé]Ù”€@ 0D¡£ β Yòÿü·ç?¼pþWG˜­×&Ò8)Ý ‰1žÑ|ïÖ¶£ —HµXó¨–'á%Že}æŒçE8ÔÑU$ª)ΩBÒa ™íDÓÊÎ\nL. ²¸Ìå-œ®×\g¯iW„ &V"%"¤“ëmu„yTsõŒ?\W{ÙBJN©@Ù+^9Sb ½‘1¡ÍÑSö½j¦U©Mê‘FR”àn¤cLØ"%mf§xÆÀÀá¡8“݇€‡ÁD•qˆA¤ yˆÛ÷FËìOþxó”ðØüº¨V'Â(ž*~¾©ç¤9‘NÖ8(ÂJQÍ™mîÜ#>[:|ÎÔṇ%­wY>®ÙŸ;ÿû”OìüÜdCÀXR™„¯Õ±Y4ñol,£7ÐNæpÚÝßSþ׫xHKõ Ã6BTâç.þúƃãöœèµ]F×ÄLHèáßÀ¦ÿ¦Íþ«æ²-Ÿ|5P+?¸²ÂBô©½úimï6ž *éçÉ5V@Þ#ûÓ¯T'ÉåÚ«É4¼‘¬.¬Ï-‡ÇІ!z£¤ 0þ¦x1žˆ¤pìLà¼Áoc1HÖj7Œ¸kìQØbG»6Šx<¹¿øhsÏ%DÁœêÚ[  L 6¹îZÖ<ç?xaæÖˆOÄ(îÞN0]–„¤Ñ¶¢£hÞysnFfñ‰z™,À‘"ÈBGàôj5Æ4».±šÈмÁqÉtb×.¯Ð„¶=ЋÜ›ç÷i¿JÁX¶éîЧU”¶*õ*Ü#5B‡Íº€) ƱŒ‰ìçì÷^ã/ÄžVõÛrn:QŠ Î©}´ñþÇ,Hl:u8õ³1Òåµo  ‡—é¦E*’D…[-b4[xºÜÂðn—‹aôn_’ àXºZaƒ" Ø\KÝ↠,ËçiCe®úD“ lÄÞ|ß·ñK Òƒ¿÷¤ôæš)aຠ—¼-P ÑÂBRhœÀT8­6ñ[áBz°8ê*ôíJJ·AA6“Œ06Ê„çî[†&U†«+Í/.ž#¹ÙáÓ±Ùúõ%Ém ÍÉð·Z@”úµ´õÄÀA]È £:lÓ)z¤Ð…Ùh3üžî?¸ð°sÜÎ €‡BânßY* dÈÙ¸Bv±M&º‰³Û K¢Cx©Âz,­÷ϳ3¿‡y#|(y.|™¶Õ-äÃü“êáè)µD»’Ãüá{ó~\܋ȥ20uU„’Ÿêp-,wd¬&ÇÖ£ˆB˜À¡Ð Ò)L°ÐèM†!q°ƒ)0 e3Ýôi¦•b&A ÊP„`©(&@F `®ªÚ`,& “Ì:á’ŒTª ë°…j“—å·¸›s˹–a¦ L5bµ q’¿R˜³SŒJ¨„$*É= xBÁL„òÂIµƒ=ôG}yìÚÓÏ·«ïî5Æßi@Þ†4?h$¨ÁY:ÉÁ]Ã’•å5œþ𞃱ƌÆi›z¶¿òg¼š[öõíý?ÜâéßíÒˆÝa)eÊ=n¡ým%±¾,ûŒ:Fa£Á~ôÑ2t]7b£¸WGMtt (Ùßœè~êåm?v3nw:Ð7ßa~!çÙ–bþþ´¿ùåmÀ}ß?…&¿¹ú®Ñ*rÚù(AùùC˜¿'çÀÑ oÒçú|ÞŽR7?®é—±·z~žx }ÄöB­k©zÌsf‹âzú³ƒŠ£Ž8WM RrMáK"žžƒÜÅÞ^˜6òAý-—¯#7oì‡üß {uw¨R$˜ü#¢%„½Ëuk$WoóÏ»õ'“Ã`£ÉðÕB1!€€‘iY´ÁÜJcÅ÷„:o·%Á1¼[ý|ni¯ ¬2È@. e'äû™Ñ‘®¼ 4í&Ź"Q§Å3¤ Ä€‡[¶é=âöDï¤1ÅŒVrºá°‰¡§m#nE U[ºN!N:ö{eh_õ~x|ÞqÉ=$Ým2ãı>-ß}Mã±8¡“¢Í‚¼&óñÔf÷û&°?Ñs©ŽØ5®|ÃeyÝ"u? wºÎíÞ=PÄ/{ ý sy(ÚI-þ0£6Æ1½QÙÎ:F{™×ðÄÀ­S,ú “w¢÷ú³;zCÚ°Gt$,À&DH Bƒp€†UÂ=¤»éýÛšëðá;9 ×ËúÍáÿ žyù¸·Ñ iÓ¨vÑ‹º ù“EüEÿTóWÂ0"ÙaB8ˆ˜}K24>)óÚ'î± )¡´÷mþ/;ïs¯Ì.M’Éeå­Öïït7³Übp×\õŒç»ê6õÍi‹,«ÖËáÁ¥£ÊÔNÍêà-~ħý]ÕŠ‹Ž/Ø¡#úÌ1„A È,NÁCOa(|‡` ’%LçïWÆÒ¬Ïòqé”)IÄô É¶ÖBu ·—OOd‘1 çÞ[5¼.ø¸òŸsï¶mˆ/ð@!oß.”ÎÒŠIоӾÀ^ŒÊ xÊàFý”€oˆ°dÒxUê/×ÄZDq iN¤³4ŽÒZZ×Y4ºL-luYµRé-Æj·XL7šB(_”E[PWþi½÷-±Ù ¬­ÑË}áîë7ãÚ®í(Rð·`fŒwZí´‹NñÖµúÉ—ÏÝC2yä¨_¼•ÑPIÅýr Ú®Dë k{?ëÎý\ýõçŶùò:AB 0&”!SÒ`³Úâ‡ÆËæJ¼£õûš¤x=¯Êÿ<û7¨|†Í æ iaÕd‡ð!{¢‚¥M—ç2nN™QhR;ð­ÏÒÇp‚9ºû›OHò,5ÙUSf ä&}1#W½kæ\Î<8}l•v`¡»o}÷BÓô6wG7ÔнV)T”Ó]ƒÔ¦î}¤Mµ±2õMIP£KˆèXª Ið-ù†5øÊ÷Cÿœªä?ÞíÏ÷ÕÏ–?Ç]õ·æ?ŸŸàí×}ˆÙþdùìjÖ„CëŠ9,œT RH,d Å:U€bé¶õˆ‰)ÂŽH¼ )(—€Q (°&RodÃIèÕv˜>º»ò6â µié0î ˜Ø0†à @A³C½ÛöÔNÔ¦EYÿ´ý .p©‹¼—dI‚³€¬Æ9¢Ç­ÚiŠÜzH P R ábÛ-g»x ÃùûÁ”Jucoª.‰y²oÙd9æ‹ìµN›õwËå u´.fÝ.þiIŽZ¨ž…#æÖ‘ªÍÓuyM #„Í{?Ý9¼uÀù­É¯MÿJú¸ebÍoÁSðùP™ØØH!k‰É¯Xo„€ØXE³Âˆ%ňè#ŠO7õXïڻщ>ÆTã=}¬B¾ê.¿ÿ´hç½iîKá®m¸U#sˆ­’-õÖ¿ßuß·|×gY²ÐLla­ ²l+Œ‘@…‰2&¶c]Y§2ä.hi™²flâëx½¶Ô×Ã;X–ÿØgŽGê)«€¾ÅºN¥k\Ô¥­hùoO–š"åcW²¥·À®A‚UÅÉ1OA¶§KI_ì”Ç#DzîHîÊÕZå•ÙL §ã"‰z‚ã¿úÖô𲾘â9ÿ»žµ}Û $Q¹€Ý0¦ùñ¥´ Db¨²!Vžvˆt¨ˆÐk|pQÆ(‚ØeÄ—áÚë6Š|¼buF\Ìÿ$7²¹=Êgæ³b$ÓWd+kíÊîqæÒ3ìÈ ¨œ‚ü8?‚3·¯óÒOšè3ØGЛT è¢T'¯w[WnyqOa…À(,|¶,J–Ñ£òš –5èYmËÒcJaBX—·jc ¥òòÍæp…ñ[˜é ªšÞò[Ô‹Á¹,¼¶É{ä!÷¸NSe¯Ô,7èù¸Ó¼Æ4Îz¶ ÛT“ñæêÕT‡Y%Ëp,7Úi°\›ô8F‡ªÏÛÕ¶A<Š Þb° ý”pA\³TCl6–; ™â=ugŠ!ÈB£äJ/ ’7/ä9ÓËh‡su;>g˼“1¡Ô,VÏ0e“c×tÌÀ¡,'Ô¸‚xeÜ/°ègt™¹;·vi€ª±Ÿ+=oµ½ºïé0¼ÅÊbXáÚwsÕ`Ðl†à&h‹ tß] Q å¶0Ý6¼A}i{æ*›ô¼M1É ãîÒ?]„¤|©[;:S„€G ‘fJ¡2ÌD¤»Dªú!ØÛYAzOƒŸñ¨áL§QÇZÕ`1QlÒHê±#ªþ€CE.ž¦í+s~[?Çý¥ó)ÙM×âÁ¢yÞ kLfË­Ÿéz¶÷o<÷ïf«¹žQõGîoþäHùqýd¥Ö­øW±J|”úìç}¾÷¿¼“Ü|íùøòÇú;Õ µ¿—®Ê¢ê EI¹°áÀ‰ FÀ(-UèÂâ=RÕG+(„Z‚VÔqÀqx¥°!Ôj¨ŠÍØ h,9"ÊÂ1Þ½ J–ŒÆb‡2D!µÒ¤%]´¨Jß‹™´ÏsÏ\ª4؆Ô%ª3h·©ÅU3(Ü5I´x "¢‹|‡ÁCà)ˆx¦ì\´Mhú»Ÿ}'MZz/Ç22p”%4úÒE” `’¹Š#vME‡MêÙÙÃW›93£SGïÌ1k-‘ (ÔY5=V @©õæä ‡Ô@FÒÿ½ñ¿ZƒÕçþµvop¸7åZBÈy)8˜i¨¥5Ve…æ”&*:˜ˆY.«ªÖ“»»nOh§AQ&: ®®Ù'äjtÃvÕÚ"è1¤Ê–ç6‘,TÑu&ÀÑä0ޏ‘û|âu_©Â&ÊÐäÙSoSF–'Þ|åÈ4Ïtèsdñ¹wJUÁÆ=kbi\­ó«ý¨Ñín 0 ÆãZ”-z©òY o"³*B†¬ºUÌ@=G…%Àšö-ˆJ @ "³[þ®ŠDÇÜí± ‡“wŒÂ6NœL¢”êÅM³µ¸÷Tfé•ÈâˆÔâšS®ªyÖu®Ç=;4{îÁäÔQöȃ.â­ìåHÉcá5bu§¸½±U•ÕL!šÓ&› ‹y²° §ölßý9Nü1–m<áµtåÈ1¤íß§à/mAä߉­úIÁeà_†96nõrýÝ~÷xÜ—Tnfd­–žÂ™mt\ãÁ˜FC!wjÍwÞÑñÀ‰¡vû?gå¯ üíyü·—ß¡¨m`¶œñ„’ê8 I¦ÑÎ÷»ÇÎØCØv«Â*zjþó7r”‹\B5s4tl,¦ Sµà<¶Ÿ^?ÎïâËã8¿ÁK»oh¬£Œ‹l#ð€Jè› ‹’ypÍ]A@L àDæ4ËíAc#­€P0æ±(£ŒšÉ*4—ÛH£& CÃ9ä>¬iÁ@…q1C”—c¢–Hk·Ex¸#¢¬€A"]ëRÙ͈{ ô‡Ù‡`c0(ì‘ñ@±÷‚yvⲯ€Q–Ã"Ræ;{ó›ÞOìë"ã0 Óú'ºIÈ·D-{40Ñ º¼NÇbš†k96hÈ^åÐ!8ŒE¹U»ÇBdŽÊîE:Ìùø=f®‘óìUY°¤Ï‹;_j³™›…' â0˜Á¢‚Ä=N AUÈ KD°Ÿ*;¼Ší·:›½sL$«ãÜû¦#“5ðØQ:ëÎÕžÌc›ÙX÷ ò œ(Úl0çu.²}ÿéLêk7w%në.÷¼T›¡/ü2×ý(iDoj% µ]i`@7ù0ˆäIÑžXý5ƒÞûS’ó¬øXû6Ÿc¸Úßý[U…Ëkki”÷€{þ ¼ý.ý*> ¸º= !Þmñ„—õ[{]l{xÞÛc•õ`!·¯‡ª=æôÈq:˜.\Ðzú›Û~/DùEhá…w@±¢ãì£Ôwhý³KÇöÉÕc÷A¿ñ}žk/¯µxrÓ ¡7\-’6¼}DkÒµ—ÞÖ%æk_ãÿý"Nð+|½µ¼"XÎ9¨vœ’‚h0âü£p‹Œ‰[ðÍ"®žàÏ"Ó­¿íŠx ͆ ´*< 0Ô. P$@¢¸¯ ù7gr7[NåñÚvÍÎõëÞ ÕNÀÏFp"}¹%Õ²ñº70^±é\é°#Á(RwÞÝ«—U¶òˆW CU˜W;9ÒxÐ:ûžktLH=ÙùBä~¹"Ø*& Å‘îmäãë ÑþA×Ïèz?ÜáJànglÒZ÷¶/=ÿê£Å²F.ö’¿,ƒƒcn€A‰¯]órdßöLé™ID1¬ó» ù³è?ñäiQÔf‡©7Ïí×Ç\·˜múŒdÆÈ?t¼u´Åy!:Ý %‰ÀS×ýh®fo|Ìôç ¼HBÅÃ(—*t9e*a¶à$+¹žzš© »Ýûi.ŠJ©3èƒZV>ºé÷s¢ôû5"``u`1Ë(6ú5ÁÇ»·þ¯¡÷s8–±Šç1æÉ0zå^¹WHP~I&6‹zºÿiMÆ3¾˜MJò2dªB˽ùùýÙœOr]e¨Zy«TÎËFåh\dCrÚÆ%Býæí?ô첥͓ë¶ëdb#M§ÓµC÷ÉõGÞÎëï^þåþ&ú£½oZcµÏ 5} WFR ”|wûoÁÆ Vmt_¤›‘KIÄ“-õø¡wgæ¯ l°ÔfÀ>ÌÉsÕD.f9y¡¦î^e°Æ…g–;x“;3³ŽÁ0l ²¤ƒœU¯èþÜëµýdsœ˜cmDh„ˆŠ:¤Fî«Q¦Gï¦ûº[&gl׃GåR‰ë"XRd’ºrnWœ¦¯«åÉñ¼§ ʱâ´r:‚²zÕ;§ª¸ÏÅáÓÊ# æEC°]A”¬še„$ûªP3€¹*­”‡ò#0›j/ê ë«o÷òç¥þ•2˜ 00D«@‰¸ˆ×„²β>E(ÞËÔY鑇£ÿ‰=Ê5fÈ/üâS¢Õ½u]¢YªÂ€Uõ´àKŽM¬K ä\¡X †=]Ì>1ï<îûá`礡ŸM`^>1Ÿœ|y±›t’-sïç;Ùn ºÕ/ŠÛvªd‹&1¥d2ió‹ÒOe4Ù]ƒghBˆN]DÀ%êPS\ÈÍVÚÒ6éúýÐ?fü£ÝO«b~²ü‰ãž/æ/Ù|½õô£‡Ú§’ÈÙY6’ØÛͲìÀºÁ]RóDÜlMFŠÛ°ˆ®çòØ-"hIVDcF1a5`´eŒ‚5  3j o¹BÆkbˆHX¥ØbŒl×E'¼ Œ<´+ê¨Ù=6üs‘Bº%T›ñJ'>HÆ7-M‹ÒI¦Á‰ÃlQôdÐ0‘é¯àœö¤Yh‰ T€ ·¨âéöÒM¬+Ú¾µóôätŸ²—’;Í¥OO¶?;Ñ{LXg ʼj¢¾Â|ÌxݧN¤H2`i±Ö[º œ«Pjk‘[½æ®{­ÿì»ü'*Œ(DAÿô7ÈßÈjö7ÊßZ"F €š\i}œ:ô Rë”æU*R2ðTõûa7þ4>Ño×·Ïokÿé#úÏò_¼èaòSþ¬þk••K­YuXE¼¸„ñK+@8z͘büD+@X¨ QH5 ¢^1+× D §^„ŽDFâ¿“)°ŒÜÔRIËшóbÙTJô…¹ª qзý¡>ÔÙï&÷*é~-$Ÿ3 ?}®Ê%R §Î}3ã ´Ë퇆˜9{_«¶ì1ÞˆjOo¹QI)“×ä´‚0†U*ëiñÄ®y):p˜˜…CšGRãÜÂ(Ы“’¼Ls¤ÇI徤ò:~ô.7¢V©HûÛ¿ûùtÊÔ«ìF>¶ =E 7+†ó™B¶LȶlÿŠpôýuuÑ?Ô¸爛!’2`ŒQ…"3Bä©åžõ^­ÍP(†$*öÄ7Õç†&È¡‘  *W(êtÖÃU‰Ãd 0f)‹²¨âN"0T²dº#Àe¤9S6ˆ0²CË4°lÊlèÂ6¯QÁâœZ¤Ì ·^»¶{¥É}Œe‚‚gŽ6òŒ0–—Ï‹Æ6S =IJ ¡’¼¨„ 5*:®¦”¨ÓPƒÙ^81=þRÝ›}*?á-$kg0ä̦™l¾ AQ‚Í4 ¥àDº:ýgîøOOœP;›$¸Ds’ŽÔ\^1ZƒunÍ|õfq7Õ{ÍäËuöC>àMû]ßP}uõNE #ò…¬ßCPNK. Ž­T{BÄŸÌ¢8FQ ¬h2a|ÈYR”Çàýöp»GU8¤2ô|MÝE}î÷b‘èiÖóØ__Óhdq½GñŒDË·S_0ã9ÿ®ÛóéS½²Â#Í  ¶ÄC_àƒƒ¦˜¸†¼*D·ŽïZÿf¡]Sû‡mäïüç¡“µ­ñSí]Æœvæ™Ê/#5Á²H2Œ.i_o#‘æ¾0†{X:j<øe?77ÓDWÐfÖžüÄãýϘ—;jëÓ0ÕÌûÏ3òŒ52A”Í;˜8Œ©j¢0 +–‘Wp\`EÃq!õ8܉-f’Ôâk„Aжðùkjõ§vFF$Ð1M&)ˆŒ©Mš@–D*cíU»¬7+Iž/gk¡J8œmPO˜X Y™ÜM›Ý/>çŸ($2„`Xˆ–…LÀ½Ï¸áîñ1œ:@(.P.ÞÛØ"î{ÂÖA&K~ ¬ß—ûÇ ~L #·2øÌ^«÷UŽÝ¸ÛˆF»˵ú¤a( *×€Ô{98 AªNe^oŸ[¾ñ¸Ý6öHîXw€ÊG‚‡†Hc6²ò›ÉwïÆ\涨p…„ ƒ€@ò‰êÐÞãÚ½·á'´$®ï¡f!.kØk~¾ùÑ-ÞqWrS)ܡ ¦ü{V×–ùüÇ/êÉÍIuØ×2ƒô±KiuŠb4éjà†¡þè2þ¹DëÍïð³Ï3@®Ÿ§ú;f} \ï±ç³{™2hÔk ~4—1#vÓV#C&"·Oê@²nÕÇ—âúË;ÐÔ¾ÏÜßEZ€ãb¹8^¼ö¨Wƒ?a*óÉ?¨}3@R%X@‡á2kÈAR-ÏÊ\ÓŽ“…üYÚU浬«ðeô?+C>ØdW& BÌ~>®f ƒ( -!,Dñ!¡› i5³=ÓqSûpR‰ü=cJ7Œ„€cb^C¹e+º4eX‹ñˆ¼ ŸË;>_bÿSsm^þ²ã#8n·ª?¯}»†s©Ò¢ùÓkŠFw'{I¼  ´¤+è¸o¢Ž£VNˆ‰²Ñc*§LÛŸôB8“kÜí;¡ßüN?`\øñ~mÜîÿrÿ‹ÞX‡·Ô­•••o6 6{AÕ¿PÀ^…q«*}Žo~žÇ=÷~?¬<¨³Ð•¥ý²ùYFNjNâã{ë²:}]ǦÿÆéê»Ý¸å5ð¨ŠÛ•.Þ=ë²cjÿþQ¿¿´–cäÌ^Kc¾L½óK˜¨æ$z|ÿÜñÝŸnžvlp zƒ÷ó0M1môpì;«ÒõÇ¿ó»Çn6·õ}ÚÂh¾kù„£çóëw¿ß^å@µ²x#Gt:‰Ã¹Keü£7µÝóß‘Ã~Ψ_‰ýgúQÂßg¨·Ã¾½ØíðR¦ß?çñq½¤–š×vî[„ªåf Í2Ñ_»çæ(Ã[ˆev)ÒîþëŽÿ/¬þ}}k[ØßÂØÓ·’çŸoÿ³xû5ià<¥tEà‚IßwŽçá°VmŽü³kFy¢Ç´†Ùú®£#ìÂþM€?iÿý÷ïeŸŸ?y«OÞîãÎ)¬ºØlÙÚ%¾÷#ƨvWêFú5Žhöt$†óðG¨Ž|rp{7¸aŒ¡ÁÓÇTAAd¨ŒX äûÊ]×ÙxÓt¿z. ¾Œ+1õÏñ<ކ9¡'J ãƒhVÇͲ‡–u³Ú¦&ŸgÏò*\¬äâ,_·²ÁÈK«‰2PáP8û(‹ÛT¹“pï’Âvõ†×+šç?åö¿ °œåA Ñ‹ñCÀ«x§ö1ì$Y¨Q—ï'˜sbq¬ôÍÏ:BÔä±³O}Ù¡‰Óqû$”°WlFŒ‡z%|îyÓ瓽»7,¾àJ­ç/×Ë;ñá¯Ü%GB-u¥Ç0-ô¹C.õ—ªG½˜›ÈÖAÜ®tKî̦è>ëjGó1¿$¶ §}gãj3×–m tÖ0òçØ¯n.ç“q²å¦á6ëÊ ¨IOŽÎü®ÆÞÊzW”ž[ͽ˜?~Áÿ'Ðéç-™Å¸cTøä}eý&ÿg¿}Ü·-Ϻ¸Pñ“_nð°¿$… M[©‚"`h b5xÍé}/ñRagWwÑ™Wjª!Œöáóè]ÉæÙè̶ۤ àÃ&_c÷ëR¦¡^‘9£±yG޾×·ÖKZ/k¤ªRGêó§Æa~ܤÖÂõ‰ÂŒIX‘òæÅ°œ £¹Ü°ïüÈ‘8^ÊÄcG¦¬›ÑfPÄQÍ)9¸®?|žó¡äù¢£8Ü/>í–„aœ/ŲhØËœ!êÖúºzŽ=¢©ÙÁ‚›p¬Éǃ˜ÂB«êˆM)`(<ÊL(nà§ÒpÍ3°Bš²]b–†FÝámíæZÈë3vÞÞ¾c6åA¶]J,@mä†Î ©)ëù—Cx#ÇÆèR²œî#YÅ.kÍZÙu“&Ö6K`×mD ¿S%ÄJàT—¸(SYçÁ+Ǧ•r°ý¸Ò¦ ßÕD÷+ƒu‹¶ìÔðŽ~µÃú*e¶GŸç›¬×Ú9j©zºZ«§ í¢‰…TÄDàY/ Èýn™ µdëx]þjÏR‰{W†v!BòÔ¼Ö$ý#:樗XãHrHŒ ô„ôP+¥„<™jŽVCkl3â1ûç÷Ú€ÿëÿvš49ã”—ûÞWîåkÞ»Ô ç3òøî[ÎëxȺÞÚÚ3÷̼¦(€½a=ñç­Îw›Ý¥s.Ì]T[/HáK¬`äQ‰ýò|îS%ÔØ%Ól×ñšþû_äöQLgÓŸzú‹KžÛê/³ÚHfEHó¥S¨SgnœjU¸þPGoFÅàE¸´ë#9&oï|}óì«þQ•BP…»í@¦-«GŠãJÃ:J™_ =´¦ð { 1Ì:nàÛòRyCú˜NC ^p }‡#¼ÒþxrùðYß é‘¡‚„]$;ô%¶-øUð)!ŽË[9®îÇ¢‡1½"‚ÞÇcÍîc†×¼ÿþ·üT¼èÖwÆšôùKçò’y…¤,Tj*Bæ‡E÷z­r¥hÏÚ £°í yî®iš6‰Ô~çdƒtˆl”'LÈ•¨È /¬ö8ëklÓKã ä ÉKqmP÷Z!\­Å®…34Æ~ªÄ»ÑÈ\¶¶ÖƲ¢M¦(hÙ„å ¤¸lQÀ¼Àš¹D«7ÜŸÅz‰eÓ»5£9óÈx¦‰Áÿ¯Mù—Åba-Œ@ô:¢c‹=Fè‡á_šóËbÏ•/ŠâT‰–5;bꢓúYžÃ‰Ûþ@(ÏMÑÚÝLÄ‚<Îü±´úêë¿ÿŠþ1v{íßÝ{Î~î!ñãQ¿fq‡Ÿr—£ªŸ”Â….½PØÆ‰3 #ТJʶDª>–UUðed•Àƒ à@ÕJ 8 åýÁñÕjU™D@”Šë:–æâ(È;ó$Ö˜£Eæ8¤C—ø,‹ªcºN*äç+ωë£P(Y­0ã’]îåÁþ|yÌp÷¬ P·€Ìí*2d1šR€)jŽSU¿¯$qN¨ô-íÎ42“På=x ØÌsƒ¾¯íñ«Ïez3Qtž–ºï‰›·+¹cÞŠùroÈ*•ž#5„d{ÜÏ_¯º' ŒWO7¯.­ Â1¶oèlÜþ¶_‡u›ì–ƈÄ@¡pƒGå®ÀÍô³Ø’¶‹ÔhßC ‚ïg̾f\jÄ1e6æê"‰Y¥`ÂŽ”¢,ò'RšIWòˆÄdÛ ¢dfæß Î)O›ËMv¶±˜pmrŸpœAšÀBë¡iŠ-Õð:`aKŸáÇÆËQ¿©£[NÄ8†æŽ^ñgÈ™ª ƒ¢@&’ ¼a* ça ¬Z+”úÌ ©%JpF„nÉÅn–^UèÇYm·±.ƒed1ˆ«û^ê¢Eìfr—æ+õž2‚[³ºÝGç~w\û|Áw2 É ‡³VÈ´Æñz-ë.)º+î{q^4`Ÿ~xúOxþÿ/ʆ¦Â§“¶“â™fÞ’ï,¸cìwÐzȯ§È{áŒ]¢þûjo_rÖœu9mëˆòëÒc‰¥ªï… ¹&AS´'Êo&ë) §‡Ÿ8^¿rèHM²0k4qPc~^_žãö&ÈHˆÚ‘j0. X=«‘áíÄd½Ôsu4ÈC’ hæ €NÂ6픣ƒy÷™¤º®‹·Î×¼°oðm´ìôˆHÎƘ"*{t6«ƒ e¾Ë~ñÔÜ+F^ã‡j§E9 —[Çm/k>˜Æ]Ë@9ïÕk«þ`œ(çÔAç“6ÑÂj0Ö5Ô%—ãH‹QŠ„ º¨ {c«LÀ6‚RñÄæ9lwMØjÀCJH1¢+£ÓŒi]<ñÀ„¾+˜¡‹$ú>¥Û$Ÿ¦s0$õ’Ž%/r–°‘V†u¼ÒŽ*Pk*p€†AÜ‚<¸w"ò~l‹;b´*&xsÐvx8ôyÏžn¶C0¬€Â”ò¶2¡sL]iÕ¾9eó‚ȧôØN qá”n’Õ–éIèQj%Ýp6 ó#P³­aäã÷qH|çŽ$ñ]§<Ç4PI„Nõ}¦§Ç‰üÀ¡6²r:X7Pn!@nqi}7ħӆ®@:I ×6ЦÜï§«áÄ–ïÙB;hÆÖçu ½ør´hnÃ%<'Pð4ØŠæœä±8Ãq:ÍšŽÃEZÞDÙÍz-R¿Yóôtø,fî¦J(„[gPM- Î6¬ANâT`Ê+G-®­©ZÚ—ùØÙàrqÅÕíY(+!MÈéò<}°•håõVä^ïËלÿxßýzKS‘à=HDa è©ÙˆÁÒð¹¥LddR<% †)§™;ûÕßœöjyF,ø1Ö†‡¨žÑ+†Á°s„b`B:Ø“J‘‹ºU9ÁzíÎ. €»Á ³ˆ˜£P_… ,Bê¢ý=D„q¿kÓÆQ—Ÿ¿ÿú*¿¼~ý°§&´=Ì‚uVu1Q¿BÝ5‚Så”8T%E9'§‰n›L-± `¶C2[p8½6Ä–•Še­±Èâ3ž9\´ÝyuG~<Ÿÿâõ%SñÞ9NöÆÉäëo6P ½ suò{,ü…¦oý<%|; É}á¿!ó/úñáãˆ]÷ G¾†êɲ¤Ë~*«vùoÕ¶tqQR€ªG;xæfÝuÈJ…Gfö¹Ç•Tì7ûe9s»3Õ{ Ù;«/Ý£á›oãâå~ÂÞ­¬†c¨¤ÚpKÞÕ@ëk®t˜v{ëØÔåS¶ú!¯– DscÁÏylÍaOpÍ0*‰ô/ÿ¸ýÚ¼õmû¿^™ÖA¢ºÿÀq’ûß©æ9—rs«RP]WÊÝM:­xÔ™Ge×ûíÁzŸ»°×W}Âyì ¦kÇ!,ƒîŽˆšqkLÐ € 9È–…cL¾¡Z Þ¨>9l·Cè*´ ®Eµ$‹Š‚1€DM @@¦š‚ÁVQ[X3:ž;¼½+;©¹ÞŠ!y~£v¸é>Ž5ÿÀLüîXi¥Áƒã ê}é$õag¼cW?YOôUp›14"2×êl8ú'$ ï“Ov>ÆÙGäJÛ›ÄÍ£EH¢E#è˜d•H*Ðìšœ^(s T÷ˆ”0±7´ã~z¼ y¨²}hFk\O÷9•ã{ƒrôiõp³?Þã“X¶ê)?/‹‡z¢#HAqó}h~u/aäò‰›c°犟OòyuàQRÃ‘Ðæ D²ä=ït´zŸãc{0ÿ5ëõjŠ³Û¹é×u_ï,c¦çþÒïÜ}ß3cøÅW^¤)²#å«Î¾·87&‰ˆiï‘ÎÖ¨êG|ÿ/^]NÉÛI¯K,ŽÆpUê%NÉ]›&õL]¥¶’GÉp͘r[.³Ÿ{AÛ§^ïÇi÷xeÊÇtk5Æ@B³]³úËî3ÌÍð+ÑÆ$6$i<)”òùÚý¸FWƒ¥Â¯?9Ê{u’UÐãÔÌnY»ÿú²ëƒos‡u|q~•´®­õ?€ÿƒîÛl„™oEôDâ=Ýuûò£³ŸPZ0O:¿¢BÓíÕ°„(º%äOQ¿„'"ahnžþT=íg./˜H޼<øÌÍÛ<–’ÞÎÁ w;ÒV·J[•+.J,,gXhDмR›ˆÅ$EYÄ}ÍQ·n8ÎÒ#!:ppRÜtǾ ¿\:NV9„eË )ó«'³šä¸„Ó@˜NLÛ)‰2q—3çL© Û]¢cOXRªI.0ýR$ ž<s¥@yôAÄ“Ÿ[¯´¦ð½ÞÝÔÂÀr@'pTŸøÁÕ$šZ:ëêø0p¨†äf+†Kq­§^¯EõÎV>¾øö¼Íâ0 ±øû8{XôX»iÂjÃiùšp*Ž*4XGeÅ÷ÜßÓq˜8Ûf׬qàánŸŽ X³ÚWÃÎAPŠL—iÓõH_vI—ÑL&¹¨OÍበÄj`%K·,Ñ;QÎ’´Ð(¢ÅX6»½-J¤Á, ÀÍÂ--¹YïW%Sv*’ÛèE´˜ÃðdÍÝ|p¢Á¬ìÉfIææRºs¿4&ÑЪk<átD‹ÇsLÙXCy¬Gä±–-*l=0T¨Qe`oÑ8bäˆP`Aê^Ø!˜mF“7ZƒvÊ@h ~®Ãde‘6Ë’^ûõÝü]I™ Ã1gÙ.uîZ`% –Ñò"NÂâ,£CE : ÒÄe€¤Mg€‚@Ü=9ÿ¢~þ3„ñÿZzm+QõôŸsãwïéSœnÆßÉÿn.Ÿ[¥çü( a'h×xÛÜÞ¹sz$5V¸ëÜ~ÿâý%Ö¹n½­çn[ÚS'±’˜h$ @bD4P•F‚(•¶œˆ­«eér/Þïo+½‰)ºêsâð$¬K©o<5/w÷„Ý@QÉÇz®³ÔqÃm¶9´3VØf@ò§ÜéaŠ>Õz¬ÚQìÌÊwNi×PSÑí>¿{?6g}&=uW[6ñ$0d§¼1$˜"B$öueÉtˆrÎÕæEfÖÉOºmÿó~ÜìQ³`ŠñQ¯î‡`-ãL‘í …ˆ<’ÃæœòuÙS¬ à}ÑÉõ^<ÛfÛ7Y[×Õs¹>*gÞªVŠ@ªP¾×ós)l¶Ž(ǰPEãÂÚèÄE¤¨ $¹/«Ž×ȾoªúÂú6º£rN½(vLâÜïÎüÈ307_Û:×€–”d3ýÿo³÷Ž£¢××]ò·‚Ìÿ{Z— ï2f«9`Ftg#Ú¢®›½„Ô7b…gNŸžé±eñ‘÷Ä‚•Ê_ ˆêQ ÁCV(BjZ”Ý9&^>ûÒ¾›= .yës'P!uhÐ ÂMÒË!½]ÂtV©x =@?-Î",[… _„uï“p`áZœ @‡E'ƀʱb!Jr5)¶¢t"¡Ô 7ÍTLO¦ÐU©A(ãÓ]ö*S½ž CŒ•ʤ&ôìŸEþ³ødV<¦?èsNc{‹êèÜ·,ÝݼBí8²q‘ U+’Lµ”@'Uà`žº´@©³ÜüÑag¥~yiÞŸK¤þQwþ•Ñ~?çý_þ¾ÅogÁ’ËÿÿÒ— z,‘ $ªe”r@€"ï@˃ Ȩ[?bð”5ÔÆÑHEâÔV#…EI«©m‘Ív'¯×z™Ï9Û9º:ÏL=™˜ÛÌ*XµÝš`˜¦å©T®+OU»óW±‘÷!êôé¤Þ¥›ä«npϳž/š+{:®ú„OÆD$`b–êv>£Í®µÔ¢i`˜úŽÓí €MalZ•b>š^< YiÃé„3ÃÊo×Ó™¯nõ]sp1Ì]^@2DJq ¥OÎ}8¥ âzçkŸ©!,ÁV\¡ÜeÕw~ÃÖÛ!¿À¹«Œ$)ž4–K=û&_§KuþØØu›·ôòYäz ÂP.epH,XC£4tdJñCìÈ‘-ú¶#¶Å*ìâ:Êr>ËÃês—Še(§4‘Ñyè@°"•À`/*U¥ò–‚]hW×nOž'Q¯Xœ)×â¡067Ûv¾rÙÐÊpÐHÝÈeì`ŠiVªˆ‘pXœ(“d¨ZÈΆ·þñ¯žÞC8–'@#¸<‚¬µ^Ì4eƒôæÒ’:|‡àÆÄ..¨­ Ÿ ’p„]%¸‰¯i;ðjî›óægÛW­[ A“²9¿«ãú6ßk ~\G¶Rð2X¡‹ä¢®÷Qï†ÒÓVéÈsæÐQßêµÍzÔŠ ¡šð–H…¤ipŸœ-“ˆvâ žˆ mîšq‘J’v€ðÜ„nj#t4èÔ“³¥&ýZf;»îµ÷¤ÑÙ^5f9.º\UßöÀ°2 ™®@ÏŽZvé3 2:¬LR¬‘rÌÕJ÷æ 1YÀ:!ôI¡p›nA‚2i*˜gž‹[Åû%h@V9ú{I:Kà•*âàˆ/Ï'Î÷SKõÿ5²Í.8ÕƒŠŠáçâ‘ 3aILœÉq,§ÕGÙ5‚Ý*E(èC÷áÝ].Bnb†M¨£ÐÆ «ñ h™,\—AIÍæKoñ;ó‚l¬CJÏ«òÞ’6¦ šš…DllC} ìM@ê7tÑÇG3ìÎi«`Ë&ºÇõðuš ‚ ô=™¢Ž’Ó#r¾‡B"'†~çå¨8Ýù×þb!¨èž5úÈv¹´}Ö[T ê¼<-4©²!¸"B¦³!Cú²=³|òÔ>EÖW=îþÙð{>ÐUÉ!Ǧ=⪠ÐíÂ>ˆN¬Ã%*†& %Ïÿø<›ÉdyÕ÷¥ çÎXWË<›:B&D”nIË´Ô£‘c£W–r]Å‹­Y€ Ç|wÏQ;uíU14«‡¥xP…Užyr¾™o‡úž$ÓìÛ[æL»/6\›æxËŒ%°Ð0·è±°Œb××G( Ó¥„CþúÚ êYÔÓYo8§«Oãx…̸6 ’Xchø…âÄk•yë™p4 oñ–YSà îö&‘¨i× úc3•…9ÿ xÂT,Î4E.éèί¸ï… {âZ^¥õHÚäñ%ÕÏ[ï^Hý2êX‡U4>þØN“[Öà{~å¾ß^¥?Û?Ž­•_ÃWÖ%¢¶è¯íb²[´Ùrt¥½¦¥2ºÆ„5R‘6{îm/‘ /jÆòV»û„†ŒÝ7·û>Öî ×Ò ™…狦þê^ý€G#D‹ç¥ˆ'œù½ÃÛXÏd¬'\ñ|ù³#®š¾Æº˜ »g²õÍyLüh=Èþûn´Ù²¼~ü¡¿gÅ×p,TZ‹l¤µ´Ív柬ï¦&5L†ÓÆ}b ¦žñÍ;©©S€8>âº#´G‚ÛÐïèwkGM¸wK_"ï…秇¹GÆx*$}Zy|ÞÉç³cŽͶüw‰DÙÍÅ—xT¬*©CÁ_ñù¥‡Ã"ǦòiÊÿÆøu"¾Ûÿq–çoòÇn…iÕ™ ÞŸÖ¯­~yk  4LSÍúÌm—ü|éÔh•ýâø5w>±Ó­û•÷9úØæ¯Ûúؘ»0p·'| Dl­¬ò¦ØÕ³³üÐÿâñ+„|tëpŸWêOÞÆ©ßyÕ£>PFcµ–kó§íÚ¸r^À1t›6Ê\;[^á¨rÀׄÂ0¨ñÜû4ˤ÷ —jÒ“/ĸF.®Rv{LiYwgä“ ìfN´ZtkhyÉS£o¹;l¨[Ú™Ð~Zay:0—Þû§ûhÓ⦖áFï¯ÆòùÁ~c&|Mc_£³ã=]å5šÇ8úâùð÷J¿õßüÖ‰“RZʲ¸¶lÆUèÞþ²ú$õK‚c&7r3³åüœq%ÍÒ~ +Ò‚éWï-o^H‚!'6-%j¼÷ Ov½)Úlˆ†ÖŠoªÔÅYkv©²Ï2‚ÙH"B)˜#vÿ5ýO!…&q[EKDBðWœº.šÖ¢hWMWäÌ(ê;èŸD½ì.èL} îT+ÉjZ4;(²"+ˆ6Š(3´ƒb ¢ …HD‚üÃK©.´Þ”N4vˬㆠ¡‹?—ÜS;è°—=Œ’c?øØÎ…sÕÑvz‰ˆÖv–wª9èæ^„¤†ÜFCvPr?Z.t$à× ®¤Š[Q$Ân”ïý^(\5p. ŒHUéÓ f›$”ö+1KO—‹«ÐÄ 5ˆeP§; \Ä¢«”ã÷ͱi¬1mb3^ÌFƒ6J¥§œ×G›£ù|m¸Ö2n\$)&MŸx$ÄIåH IDm §/ƒ©{¢/ÎZRNØ´áífœÊAîÐv™ci2ޏ(z•:ÎÆz9-œµùær¯Ügz/±IÔ‚[cg³–8”f;e‡±&&:pm(©êL ÁEŒ …„L ó0 T Š  • W´Â[齨‹¯áN³D,é‚€&´ñú›„°eåê1+õÔnh[Ó5 `P¦u;‡W¶øTC®ˆÝÒ8¹Š™ßö"ªTY„p;Æ ì” Hb07^ßÞõóÏÿ›êú‹ó¡7†àƒÿËûE÷÷™kÚPêßxr'çñΩzbJ Æ"ݽ¶oëeÏ# )Œ‚ˆ1ëwÿFuÀLí«¢UI]I(óš3°i5·2Á( LWDYH ¥øÚ28Âèxc'cü8y'ÜKÞÊ §áäãyüéô}Ÿ3ÜSÕÃPìÕÆ»ÔAMeZÛwßµTJeý °ÊÖdÔŽZÉŽ¤ªcºDá.yŸÓ|¸Þàdùmpùiê«}½ÔWÿ/óo?tòM®Ëéc-^Ùl}àc þRÏÚž5Ý'ú¾c…|ö)~È“µGÖjzš7¥¦—”ÇYÂ@4i™\ŠKÓw}h{¡Ç"V…Ä!”›c£¥á´¸)¶qÁÅ‹ºŸ)†QUµ>7óºAIëº3¡áî¹.1$S_øIô_’‹ÌóÛñ‰Í%Y¹ÄE½s^‚Ò‰Œ0â°– EHÅ"ÅÖ‰Š}žð*·dw”‚ 8p´9o ³ý¤¨êKµœ§>H¿í™Ú_gçO8ÿ¨(03ÇékÓÂ3Ça{îÅNOqµÖ«wsòºŠ+n§‘B¨é¦Îyín_è~Êo÷al=­\9di,­^§î&3ÎWs•˜'Üu|²­GÏq•UF4P•£ƒ Ij+"ÈߤEh@;8´£“ꉵT…»)C\ÓÔ[½®6®ÌºI¤]52¬JR&W Ô ÁjÐD‹ò§ãc¤íSãm ä!ëRÝq79ñùƒ½¥”X‚™ñY@ÇEðyü@Û—Ý­Ò¬³ãyÂÒ¨#µ*ªÇF-.¶Úf£•sßô…˜ÿà_Nä»3Èg‹e;MîǬô·M»‰®Ô•åã)}œðl)׆¬V³ÿº5¥X„”+&¦…Õ©ïëÒ„œL=y±x7y‚jêºÃa²–È 5ǫ߆k&÷)È"¸Mtç6 ØLkÌÇoB1™»Ï•øNwº—í‘ÄÈÁSãt,x11À&•´ULs `ºÈ$hVâÊñkÞü¦™Q ¢â_TÁøÑühG‡R±ê+T%:„‘Ý?2/È-¥ÉWì_¶Hx+þ¸TáNÁMP‚ehkÂP‘˜-[äŠ@ÕÚMÃè)Ð ‚×:3mÔ{”Þ/ÿšèë±ý—zê6B£¿u]ÿ¤6O… ¶M8Éé? éjþay£Ç¢(E*E8ÀnÍ”“òI!¼%á胪@]š¼pæ¹ý1õü~úÚ~ÉÕêl m*àP¹í]ãk€7];IÊê4¾zÖüÊûóLlÀiåZõ”^SΗ7_í²YÐfs«Çk_NPt%òëȨƒ@šÌØÃ§ãkì,wíc2l2Ã9Ãïk!’Š ‘ÎÄc¨/.LU!ÅP„¼^Ïi÷Ó†Ôm™ˆ€MÔJݦâWˆÞþYäþ±õ1° m¿ÐS‹ôÄ#å[‰|ú_§¯ö‚»À‰ä½5Sc3a ÐLéøÖ£»NÄ € i• 1Z7ïlÞü³lü ã…æ¨(0ÂÛúòë-0fþ¦~¬Éëýíûþ`kˉÂ#6Y õ¾Ö`N©\t*¹d§¦£hpÇ®œ¸0eCºJ¬fÑØ WÏnwØÌµ´h¥ÆöAU!7¸Xh@,˜‚€±ì‰æ7]˜íæBÈËiä9š7®{hö1¯úÓK·ç^;ˆ‹/¼8n¡¯’bªV_åFa¾Žyi.A&Ú ÞöÛ®No£Ì*dFžÿÆG¾m}q7$‡„ˆK؈ÀÈ€'¢CÀ2{+˜áÖ‰®¦øŒ‘²þzÏDSb„EeEb°_ó¨ÀaÛrï€ 60xÍöóé/¤ãR¯é)èIà¤8¡:Ÿ½ýa;¯2H ÒœuîÙbBâÛÑþØ¡¿$a)F ÅmË@6~ˆÒ^é1Ú³'PÙœl‰ƒ‰ÀÂÉÄe¼Èn)ù¿¦Šª„Ha¥°éýÜ_YµíÖ¼¼rœþI½×ñš^ˆ¹?_˜Næ.‡FGôÄ­^å:HÀ6#ˆí ÷‚ ëTsDT'!mme)^BÈáýsÒJ„Òƒ3Œ:2 X¢…µQWîn¯{p¡I…Å©”ónZLC–£—TÕTڇÖòÙ©îs÷»Ä-À¡jž=Ì18ãÊ$ßg¤I:Øq{S¢Ù®6A7—VIœPS°…ÐCåÇ0W‡<Úìïœ9ªÊ( ÃB¤VŽ”^ÕDaÑ Ø‹ À†œ :ÒFî!†ZknÖTîÍ«BJ§åÔ®4XRÇò8Ú÷<áij¼ J`ó¦=€¶ñ f * ñšŠ÷ø-Ì`øŸÉê½Å„_}Ø;ïûnÁŠ$vA€ýaV9˜¢¹Ü!‹@-€$RCíTÝŒŠÝÆEàš«‹jì\Á(ïÙ˸'Æ™häS¡Ã3^µÇˆ÷©­lcÐgƒI¿¦BÜ”-Þù82«´ÎìŸE‹F)r0m¹3Nx‰ä …1¹mÈ$€E>Ú°M h/ƒ{ŒºÛ½ð M° Ùˆ€kóy5ļ×ÅVšf:BÙîPÉ\ìMsû4W–8ýþ¡¿·÷çNÞ`”í´áÄz¢1Ì€Q›s8ÝF¸Înµ‰C¢è"þÀÜèÎ#t4ÓÚ]gçu¾ëµIRÂùXb(Ò.t}i}è ê Öé:Ë7Ǩ㹭‡ûë›×ù§/±oþoñ\Ôsª3˜×o&q­]ÙÛ5ÈÛÁ‡ìtNy_‘6Ù’¼ÿÌãßÎø§ù°ÃÈR¤º•ô’¥—ŽMnü(ÓºK¹=æã7üb…–êZk/á»YOrî³ù—NJ°ŒÖ‹«svœÑ#ÌBQ2Û,š+á³®};?ºõqÏ‚)”PÄ­ôûúc8FB]¯þЃÀjz¢× tsMfáÛfmÊ9™‰ÚHe;)h(‘€ Ë;aNC^ !‚7·°vÕ?TÏ6ãLß¡m¬ ¥Å}¡"ëf4}iîcsÒì·¨emRÉø óQᅵ̠Hù[Hªj[î£í‚Û¼ðFæN}­Í¿tY?JÆw{˨bøWÚŠþ­ÏÝ+ÕïÓqЏËè¨Fyª‰½`½Ül¦±ö‡Ÿ¢wiP&?ˆõâc ½­èÎó¸üfô·~ÙûO¾iþÒî-}ùÑv D®ßOÏ‚Ý@ÂÍÖ­gT¤7銒AlÖ‘6ÂÏõÑc<ÔËùÏo3œèš¥y ¹«W™ÕÎ,¯ZJeáëãF¾’ûñ Ö¥Äížå­{¡žö÷÷¿à¯‰ž÷©rz^îÚɶökmîëI­låČ웅Oë ¾ÚL÷å ÏÈnúÞ—ë6 9+3ëÿ¨ýé—Å{9ù2½å±¨µ°¯?­ß|梪|fà$š=ßK® å×e*:èx¨H2wEíh¼ßyðŒŸQå—œßpáDðŸïZ·v7¼3ÐVA}2iÎO*wqí)+VÁ Mw²–5)ÛžZ›º¹î5¿©3'+’áǹ&zÌVüÍÛ×çosö˜^ØÚwà³K‹‰=^Nê’—¿qå˿gQÖ'ZüN/¾û½Þ]A E–î-øRK:áƒé|«Sˆ¸Á_-ÿq]þ´¬TG„õ˜gã>EÀ[<ܘ²oßޕӓŽD,¿$Æç—ϯ·Õ<ŠÍ¹iË@(„ÓX%¦GÞ·XK\ù9õ®2P&@i«oLäEAH ,È¡‹#š#ÅŽÙ—„$–Ùuù‹Äâ $DåĆ\1\{N`ºjðxžñŽ3.$B@f‹RÁ!ƒýqÒÙgZ"ŽÇ›f&T'Ë*MVyè¶ÿÀç•W{¡7\×mI¿1-—!é©cSê÷r.õÈlÎ^žBÈš`;+Ží?‘ÿÒÊ}]™)íÔZ*lÆ«˜T’²$’¶ {ÅÄà_jL£LŠ…{QÏ{C罘⛽OFRN•¨!×uh̘“•^ˆÞœë;éU@ÒP,>ŠÆÚ'P<úl8¾1u;KuÔ‘p‰½ò~*ÙJDëè{Á¶e;{ƒJm'„Ú\; TûcÜ+y„ÄYS;¯Á#`œ‘bÆËƒªôö!.×uÔ1ïÖµÇí4»i€ ©C@á8Óœy© D®Å’[‘‚h•jDÑÔ(EEÔ¦(ŽQ¨¢ ÖFyWXCS 8Ü›ÆXÓn ¡ b§¢P—Ú«*Ôï™Ì„t A)*æh¦»¹XÎÙM!Å91g¯îÑš½ÿ`(J“fÓ9ô±”F|q)Á`»É€‘3þ6C+R"bJ`<Ý>™¡7¯ûù?Ãû/·Üoþø!8 ϺÑzïœjg§s¥ØN¹£H„ùɳÎñ1÷½}†ãõù¬4Ø ±j\¯×õû³wÿ6ïaLHQFf‰9^BÅ5Ò È €R„ € ôθ•QŠSR3)"˵—1y+5M§Ñœ@êôé2Álõ³FgŠ ÊSŒñÎR÷’Ë?owÛè§ƶòjAVMcNW–?5ÞÜM /øyf×Wzè—ç»àü}Øäpæ-yír ±Ó/Mö䙼zôÂi«Yƒ‘ -\"ü¢.ªêˆS´Bê÷ÉÙ‹¯jéÂì™XDk‡8 Ÿˆœö‰<)·À'hÅÒÝÉsë$Iuf>"Ø {QIUbUH!ª»­ŠÍ|ÂË•:Ñ,˜xD΢ûíÌ'0c-Ï ¿Ð÷ÑHÈ%),þ˜¶©˜öŠî¥±B0m–KN‰)5Ì$Z7,(!£Ê®eYêA¹#%nÒH¿Ú/YÄ8qåétÄ/*ôs*ú„ðl° ýµŸ˜lžguv—5Ñ«P>äD¯8T›\¡:ÄQ…H¡ µ§Š<¸QaÍ,­J¸Æ#»6ü¾|Ö oy߯=¿ž»>NÎ[gÞé÷ÑæÚ¾ºva©ù´\Q)¥”‡y¤k“2B‚)MIoB.¦›¹ýaˆö"2:ŒÌ¸‘·xlÖ”ÚÞL)ÚùdU¡ù€A>7ò…‰Â~wçžp*x sŽ bûãX´ód@UébAÈvžž®B:Le'†€56W6yrr>Ó ©ưÀ²ÑâàYD·JÑØ—ý|ê—_˜×ëé_š÷8Zº¢çýdzPˆæ ºþ6 §±1´+ϽµRBœÂ`"2\”“9Æc<øâáWïþ¤p's¤èº0ÖÌqù+v¿ÿò‘œ«?»ûÚ¦ìמëD—62Ko#¦€8z5ç´é¬DGšò†]5+0ƦOs:–ÁÔ»úËIà1ëéöSåxÅ€ɨkW^¹h«Ð†M“Š2qÚÖªxLö]C1v®é|<ßV¹QAïÇeœ2L¢ãHéÖj¤¶ô‹‰ˆì¨×ÖÃÔóT,§”1/$Îm»ž<Ò»MŸüË[?}Þxý7#~ž¼o釛šIE¦­( R,¥àÁŠò,šŽe.¨xA)1ø©aOƒ¶IWÝì~)LÛÃûíéîƒÒ©díX  ìû›±”~™×ç©z~>Ó}“e¼ô½C‘ YôÉa¦dÔÞ¸½ô—Wt]Œ`A2~DnƒT\hcáϦŠSãwºõ±ø–f•ïx"ÍìºJÛ!ÚòPø àEÚs&‰~ÙÑá™Ï¾ÀÎQ9,éuddh¼³¥xàÞž4X°à·i/ 3ve6 ,$¾ÝÂÔý9"º•œâ§'4Û>/uÈÖ¨p,“ˆ„¤é<¨?ÛâH¶ãuõ8(—› ˆn¬D·¦Áb>1ääP>#DAÊ3›ÜtˆùnDšƒ©bDŒààPfãÔ™•B¦R:@UZs®pÖ“­¿¶£k¬t£þŠ@‹^™[ëfM*™·ËB‘…úù¾¶ÚºLX7GL:nm ²*é,\^+Û¡×{YlWöÏØ¥ð¾¤TYuœÁϧ7½v ‡æñ4S7€œØ2Å,(ì–HF¿¸†Q („@c¨sIuË{#¿·þ/gbÿÏúeÛç“~¼ûþ‹¿ßWu„®Å"L~hVÖ ní¹¼!›²m.‰ªl LŽùêŒO1Zý>¯ÕéjƧ:H"ôþq;Ç¿¥½$+—œ,ÙÔláõÃ~[iìô"ŒRÅÓ‘bd°$HLÐÀ¦ÈA$¦¡Š dÃ-Òåha(/سà#P`RD¤½¨£vÛ  &Qî¸ Âי²¥šn0ÝBán™ ¯lѵ€ˆ„¬ina“ l:Érª-0OðŒGµè4ˆ‚µlÙ¢+ö£Ø›Ûþt›ÿÑ ÈâàUúy'ÿÊѲù„s™§ ,ØÓ+:àÂç‹xí ÛëwlÒI+¾*»ù_='ü ›Îp»‡¥‰aèjâ—6ddžIÐ@{þ:Ím™ç–ž·O©ôÑpŠzé[öw÷úÑk'ÆKÊ sÙjP£¶׺7ðÝÔ›M?H õpð#˜Ñßrù¥ª€£fEª  åeŽ^>ë·$Âv¶§_‘m<êºÌý:®¼Ì¸}°8™.\S¦(ªj\tŒˆ8äY¤`E#çaûèÓæ®ºuva+Ÿà€?§Õj/>â¥g ³Q#A@Á#Û´ªO‚”[¤ÏÒµEJ¢;”4ZP ˜Ò">S”!PT¼(ˆ€DwˆŽNí5Þ]hT[$ŠDˆ‚Ѿ¢±1n·n½³›eÌÑŒÙV®«b)Äx48ðßý8˽+± ‰ù䮬$oÛõñXÚÝLߌsâ(ö¨ìý$*qSºdPB‡ÜGFðœŒÑ*\aÙ‡ŒÂÜäëv³?_Ήl ¹¸‡ùj÷ ¿_µ' î‘S›­ïI">èÒÁ6Æ?5wb˜?”žÃÏÆ$@ÝÚ©·ÍVð²ú‰î ‡ >äPÏN¿œûãƒOs<^µ5[mÄ…þKsþoÍ綯ý{$ï3¹óªÃ E‰ °ÖZbã„GK$Oñ©€•8„ˆî p•>|ïcæ®ÍHŠŒn24bÞ +5É~ç!2¼°æAy{2Àkô”¦YÈ­™HD–YæJXΤróÞ©µ¨]+B_ﯷr4ÑR$²#%K´@c,1 Na ikWd.*ŒêA¨wŽð(x»þ,ý~V?’æÐ[ÖiͰ֡חö_2ï÷®ývÓ£O­– Ïáoã0TMN·Æ§ëãƒ$<ß~¸ü~8cª ÂJdÆuüí½çïý8룊Ð5›ªÀ¬G|œ#R… ^­•ÐSyõÝ¡s‹~&unè^²ÇªÒk6‰h€U%õ¤LýðÐC’‚Îâ~ŒB89 :jt!K%:#3,PyAMØZ“ ôúîåh¨ÃºÑÅí·ÛŸ¨8fþ ´åÑÇólfÉ`½6ƒ‘¨çÅøÚebï-T Â@<±¡6&À¼\À^@½8S+,ëuiU,¡e¨jiÐkXë.R®†tþ†¦^ù•(´†P¡0ŠHÁªª™1M|\ƒ"®eŒÖ4vN;!PåmUÖi> ŸË?WÁå+4µóäyàœ2-G:äªÇN,‘êÊ[²^^ž¼;7¶F÷a¼ËÆ©)Œ«‰Ëõÿ×=úñŸý§É%ü‚‡ÿ3_úÿwüó^ýô—ôR Ð€Eð"á¥M’2&Œ|aA3H=$ŸùÞ>¥ø§ê~íÞ•üîúÜÙ{pZ´Q½ŠjÇF7i5NŸÅÇ®*ßõâó Úöê¦× wS„ƪ±á;¸dûÑÇ’ztÆ­¤…{¡¬ ³mÁíÿìfU(Õ ð89'UO´ wË7È^ü½ñÑö·'ŽùžûT·¾úœ_Ú»ÕWÄ^D¸Úóô¾^îŠ)MV(QàÔÐ2¦IDA T=NhâcÙÐCQ˜d¨˜)2gŠÎY÷B4˜ö×úÙ=C—e/[æe^ºÒ-" Å›´|çËœGγ,—†Ú8hØ‘RWÐ0®}×ÚAüžó{æs„($„è1’©73¥]åç¾ôµ>9ú—œ®Õ(]6rúžý|¥Ø½Ï+oÀuÔe)Þ¦ráFá‘”aÏu'3®¶MéÔ²VµJñ±1€È NDòtYcJŠ ’•{壀ÃÜ”àfâB»A¨8%F¢±0A hSÏ…ÏꞣõŠn{QøÙ+PJ¥hWÍô€”é# 4R”uý£Þe}«}buK šâŸfô7Á4³®”0ª‡xš¹@†[ޏºÙX¸J]þ|žÌô-vz/¶Á„y[Qwô,DôR¿½2e\ùþyë‹⻄BžÕÞ|îU^ÿºýEîaêùýyÛß") :ݘÝÕnÚ>ð—Ëɦ†7*µšÀˆhˆgýµÑ®ðà™vî)›%b¾ÇÔI¢Fk³9*Ã2ÄáUäer¹)Pohn®7±Q¿ì×&× ©×gûNÄh|A 0‰¤6…ÀoæÏð3Ão7ý°kU¹…¶ñï³K•‚jï]ÅqØ–.\ìnÙ걎ðD˜Üx¥—ÏÂE-I7Òœ´eÈ?"ü#|O›mldÀM3iÁcÚ(+ ÓLÐN÷'`"¢ÆA{5žXìgë°Pï¤}„×ò:¹¥[dC,dí¼¾™¿È½轿è±”3{Û´²ì_âe\›ª¡¡H­¦¤–Eßé¾#Õe7Е˜) P8X‘N©^kêÔšµoÊÖê’ՀƪÇÜŒ2ßÍWÿâTÙä¼0ëåûºÛ‹¥V¢P¦Ü‹fG× ;â@Ôf¦Ñ‚Âõ× ÞoûÚã4H³'ø³—Г<Æ1Œ@Dªšehìý>*Ô Õ¼½U˜X–Oý–ÓkçXÐ}3CΟ?¾ûž)E•úUàx¤+ÛX@É †UhBý 0¢°>ètÈ"8G÷P" Nb‘Ôˆc•ÂvOX‹œŸã9é¿ç„ òÂÀje¨”†É öo=kÈ ˜ (%QŸ&E”œJÀçð¾¾öåkÿ÷¯™í*TvRؾ]Ü_‰ë{‰üðs5ÖÚÉ•}LîËÜ—®¡N$¾‡¯…WQì”`¨·ËŸ¿Šç̪W_åÌ󉔜2/e^N©Öš¯]†Ä`À„¾šÈF"W´0ž2 ñŒÙq¥Å ‘eYSö"PÁ¶4`öqAåb{ð´T‡Óñq”jâWe™5XV­A å ªÏ†êvvüÒóÙÅlùg äÇõ~_}ý¸ùwïË?¾O¢éá@Π†ƒÐ%ÑRD ?®äfDp¤1~Gýúmr*ü¥ÛŸè€r×V$;!ƒ ðÝ’?öígäbWP4Ý—ù™+÷¿¸;¹<ÓP–áÍ!ùÜ÷›‡´Óõò㕺Gá]ojRœ-¡C1. ÃÙJcnFÊkWί¾4ö4 €E Š˜gþ.ð¥–X ÆŒí3è=`›²ÉØñQÿý®¨<ᨺӤ«àÒ½F ´rÐ&jŸØ“ªh”啬Рîì–={zÉ`­Hcq¦®ûW;—™ýİsîé T—Q™å"ÝNVc(dT‹€î)&r¦‡Ø§§ .«Ü-Ä a2%ì#éìõÑMß@'YÏ’‘Šl¨!Öµ)m!¯Ç<.Dè"DŒVâñÒ\ŸÛrŽÊ#F0A ‘Ì™m²4ÈWew·C£‘朘8/éŸÆÎ™Zs ’*T«€ ïÚ6n¾ÅÚ©‰Ä‚ûá,#¼" ‚¢Ž`ß!|q}Rsÿýñ×:•6 `2™æˆtÏAƒ¨%îmªPÙqÿðè]Æ–Öÿ±þOÿ€åí°ö?Ûl²ÖmKÄ1»Ý²ßµÇbÙîKYWÇ»ŒÆ- Ç|¹ðËc?ì3cô?mr`Xæü²¯‘ß²] Jú» Šþ;«qÚ_¾}úh?*LÌNÔ M±Œ…ºˆ%ŠÎhK™_–¤LQÃH³Ê-²¡!ÍVó6ºÑPÁ×h 3U(ª-J(Ī;Nš¶#H@r?‰™Ò$Y‚/kMâ›°žôS¿Á}•>i€¶I;¯5Æþ*ؽZªøÚëõÉï6Ú ó1ÄTáùd¹Ã`ÖVEz®t›óÂ)8Š0…”zS{ncF Gͽ³8GWD[æÕh‰Ò6C&¿iÿ÷+þççì4Ý02\,.iœJJœFLÊ ,-\ß_é’#rD*@c(€W:ö…¹Ži¸mBž6C¨DudLÊÔôº[×0:J¤@ŽA¿²Ö"L_PH5Ëz¦ˆŠPˆ ÔH™bÀaŒLU¹ïŽ­î%[dZÀ1¢ÂØÎ@B*$ÄXXƒàc˜Ÿ{ü§uÏT"žù^(É­@ý,Üv¿Cß{Ç"•#¸/´Zö[íý,rKŒdþ©ÎÝ n]çB¦ÃVú³†ÿû#ôÕüG<ö}sèŠQ`ê^6TmŸ^ý¹};ókÓ»Q÷à/¸û…¬¿Dô—FL.•û½I+ûƒJ!ªíxÈuþÂo”“fFa[ÐNSL¹P{S)å žo½Ó±‘ñk$¼O:åžäRú§¡T  ¿ H`°‘0Ð&<$,2Ëê0:xÍ܈ä—~p³ 7\Òº!pgc<Ûb=ÏDÚRSáIU$¸?:tŸöH}ÀmsgË=5Öæ![Ÿ˜Ë~þX}6kGAìÓû$ÎýèÜÙ;M6Ë6!ƒƒù»#R5£Z©YÕÀ'FÍûŽ_gwIÁG`Z % À dA'¾¬v(ò=Õ TK[ú:ǧäÒõBòâé-Eœñ2ÐÎÓPÞn¥¿ÕÓ»ÊÊE”M°51lOï½@.7ðÕW‘}Šg-øŽÚÈp 'äd¦r—ü`—ºíDñü|¤*}ÅöHóQFÈè%DÈ5‡UDŒêÇ÷€¹¹ü±æaÐêõÍ÷©×ôºR9ÕØ¸øúê>ùHljzÎdt_}öÇöm¯í›ÉÙäXî{Ì~Üa¤z¸–‹¦ŸØ¶Å[ZTl˜&>ÇÅZËËÌÈ÷›5{t=¾Æ[ ­–²Ž¿•½ŸÿÊß©À*êèxÀcËæUõEõÔ3Á=kQÐ'X[Q?W™£äá:½baئÿð]†ó|úzÚ{«>óP9¢ŒŒmöÁŸëî²Ê9ünjýbÖcÛÃ2s﫞4уOúh0ă›´B Õ3¾è5² ¿4Þµä1ø¤ývûk [¡3š3ý<ƒ9ãžî‘Œ°âX~ÚsÝËUð€Å °µyÕJØD*ÓT ÇNhý:- Ñ2ÿÀ…áxîl•˜‰sSJ‹ ‘”ºÂOªþ©çý&Wƒ¹Ø‘²‰.:ñe!bÓ&,¹ˆ/Å2[Bâ4ý_Ö!¬\ó©®ç ¿}W_+,ðF‘HI‘uäd 9™¡ØqpÿÉÈj¬þ|¥¸Á¯‘óÑqç?©ÇÕÈò3JÄ(²Æk-½©‹[oñc‚ô]Ÿ=ÄÙàÉL6êaž—‚2÷ßlGу/?ªa…€Ë?^éY_ÕÙÈìܺU| âzlÔ±È5 +ñHÕFá» 4Î5Žx꾦‚¥ãÐ~v‡Nz*gnEd”©=ñœtÓÞ˜W“&¹$€X¡ÈIsi›VEˆeæ2³­+Ù£]À¦á*¹–‡ ·+‹\èåÅí$ÆdB¤ÅQöèwPǽÀü‚®åàýA.ˆHÓìÆ:1§6&5í N@ŒõÏq^D/GvÊTÙ'bdÛÞÕÆ¡ŠR´¢­9Ÿ"hÏfK0TGŠ$à˜ÄPVEf[RP\H9˜1©ª@žHÀȈX)Ø M¸ëþ=t_Ö®Ïêó ykÖRͲH…==R'pAGšT]u–ÅñsÉͱêpjJ· >nÁ8–ÉÓnèß?o|ó=?>÷·Ôÿ=é?æ•ß3û=»¿Êßzððó±lêï÷íòôt@**`CW u% ‰‹[jT+rÞ«Þ©û_Wô•ïn³›žÏ¦ÞÖkµK–f,„zU²Tf®ÂTâ–"=± Îë;dŠ~ƒÐIIˆ=à Qù¥Ò…k‚#Îÿô~üAGmÿIp@4âÚ€Û¡=‹Ý’jå’v7½ÓWã<ÙS‘Åô­ýh­uùNv‡áê¶‹ºØ…J0¼R»­=/ï>ð~p¾˜ZôÏ ZXg”Ø6?,¶L•ôLÐD‹)trxâL[I>¦¶höZ¿ŽN<ó™_ôj?÷~¿H¾'ÏlË|±Û`­·½¿õþ~æ oa `³† Á²ö°j†}SDX4KI‚ >ë?ÕGz®I[¸ð¢ešgá—š.Ì0‰3še6;{Ÿ'ÃPPì-CÊm »nçýF~Ø¡* 0¤ Ë2ëP5ÝFR¯Šu´Çeí%ÐߎøåsýúzåûÝ´3Z5ì梙2sH ÕµÎë&³ñVi:¦áÄbáX©`'^nÇË»ôTc¹4ÑX¹ œ*ÚL%ÄÈÀT¡ÓT·ü~RÜ`TRcœFaT¸dATþ­Á&/iIª™ð¸áì5­µ’ýE»º‹{ÿ µ—qŸ|~Ë¥‚‚²ÇqA!¹Ä¼ÀD+ÞŻʨ#΀2²HøðŸ«Ä|ám‹âpÝ”¥{e¬ânâÀçã0ZŒJœbc:µ&(, Ãdª(:’X!_ŠöäC]¯÷¨©]2oŸSà¨è$â¹îþeþwáûû=b ÓœU‰Îiþ7M#:žò¹˜©—1„ªƒÕ¦5øjJýwð½ò¬aG¨CŽK¶•+PZWÂV«­Z ›8Û•“EŠ¡I8¬7É÷a®AŸqÄCÊ{ŽwzŠŒRÊ PŸYå8íÒ”>ƒzµ}¢¬;[ljpMm©#$UPW’Æ·E¿MÏପŠh³µDM=›$.4«x…*w*Ë® k°ßåc6ÿ§‰ÿñ†úß¡^€S´‡Ø ôL«@‘ÊHj¯V¶7h²I3lºr,䘆6›<7–<¹ÆµÇoÜùÕõ篫ôoü‘6vßó ûP|ûGÛÎ*G]) '¥êKÓT¸ôAwÜX$.VÖ8TÅFVW¼õ¡ÜºèeÒœ*¤I÷¿È/iŒ¨VVŠc²1ÜxNmú5£tåêEÀB+Ó× 2gaW*Ñ4mà+aÇOœWêð/fH™bñ|L âdãê•c×–­Úû½¬«ƒÐ‰Y´3n![ Ì®–ïg{Âõ@Óq}÷æˆñS±! X1 + @HCöKÉ1{ó#¹Å¨³ëùWbrˉS^Ƌ̅£Ú'³¯®c¢Ÿ£ýèJ×é~! PB€A%Æ…H¼öû|5¡²ãkS€!1‰È˜!=%Ú׳omH~žÎÛ#‡÷þˆµ—L¿çôw¢™/ïogÖÏU£;6Çb%Ktg²Æðé»:It0 ”Cdÿ¼*;³ñ9óÁÐì„6Q€‘î QXôŠƒJË1€Š¢R ªP˜†§ëKFŠj£P[_ýésÞ¶ž5Ñ÷Ü©w•ÈàÒiê´õÐ×q1ÇÁ×úïÇ3YŸBÚVi&âh½Â,ï§–/çsb –ØVÁ\¶ê’®3»Féߌõÿþ³ùãé=G·&wxn™¡ø O µës‰cÇõ½Çé×4ðC)²ž·û!¬eÄ £iÜÚ‡øê7îqyãʵ7.\ýHékÍÝråækûê'¦Å¸¦öß SJ8"Û9¾F#¶¨T0Œˆ/€%Á5ÃÑ5`ódF´<‘†@‘,4™Qcu€TΞ—É÷1[[‘GÞCL‚¢½¡FM=ð›} aî´CôtŠKª$¯^ãþA}"¹ÉÔ(ÂEX]ș־\˜Á%õ7ˆ=U¡t˜ø€Ù¤Â½.ƒF﬑¹J7—Eœ.ÇËÒÎ÷SöÍÄ7©bU+§¾9\+4-{d=ì%Œ[¹{–’œ(%®sZ‰6ýDÚk$„e+ây®:ºbab‚ ±ü0çÓoé6è~”}Èž“¦øþ‚L«@d'äpƒµrË­{ŸÜµ›±{Õ}›ú/Bã&¨Ü¥9s 62Ê“ášýª•ið0d…*‰™]ù-)R P@diaáHm¹TÔšD µ›¸ ÜvìUñøÙÝŽBÍ7úEž*ʼnÔ.¬[‚œ\89 †¸ìNl€}‡VxeÜ}|?ÕÓp¾E5ÇåÑ›E`°L{o¶>áQ}÷Üueã7‡<\-Ï¥nmÍëcÓ˜u.çéi9Ë­e.çpd‚óí?Ç=Ÿ»?V!>™®bÜÒ0¤—ì‰ÐÈ‚’¤/ugÇ `qðQiŒ½ ›6¼„/Rd ¶«N)y0ÀòP …à–8 v  I–‹Ej_ FP-Î*ÓiÅFG¡S…™$$©H›üsà Æ/÷ø aRñuÖNiŒ…m/$ß…ãR&ÒéZ£QHqbr¸ßX»zž:Ah.à¤Õ“‹ˆ€õ »ãæÏÏè½[˜.ýÑÑífbø¤Ôv†uYëÕ¦¹fÊ…(Œ†6l˜s£Ðe!µÀy$ö[k:"@€—rBD>ôåNüc±{÷ÿ˜OSþ…¾7éµß¦ãïqégÒúòw,Ð\èÕÓoý¾»jáóhM@ôN`z÷O¶NVœU)¨§åsÑ£ÛÊo ÞØXµ¿ŒÏ+ðB~ðHxƾ8u<½ðËu(ü#ž:Ä•¿Ç…þ„)øç­ÿœŸ[õÏD±ÉM‘³µ» n ~ÿɱ½VŸÙTÀ›v?fŸL?ñ –î((—zì¿ó“•ؽ>s¡—½å_fnó±Ñ2V-Fk¤¶MkÞÃã­3üT0)£Œ‚:uaÄ7GÿIf«Í#£ÖlÕËšñSo»?_l—Ç“h¹ÑÖ*S¡Ò8 ²w!nEEBðJ$Ž“õ’áŠà^%4|"Rm¶ÕIµÕn†Èoÿ÷ë)ûûÿêø—WWêš!åeþq»=Âc„e©5«±3~Érì8¤çàçBUÑH]¾+Ñ.šÊD¢ãÔÔäÖ/?Ïç×¾/«ˆ‚°Q6˜¾Ÿ¬ce§É$F7Ц:È£q0 ÙÔѼ|éWûUMö×=¸ÍúŒ†úTݯV¦z\‡zãžAe·>ã·ëWÁo¡k%ÄB… ´±[¢–šÆþ6 ì ù»ïôýÙ£Ð)òˆÓ9Õ]%wçK'ðè<ßϘÈsfÉt+}ZU5KLª1r¯×ºš¢W¬6‚û\æƒ~Ê®L2À)p¦rƒ”]gOé§T­”3ãùÒZIJ ·”Ö•*&trÆ-÷ÎÇ9ÅÃÉYä¦n/¬º W o{­÷¬6]I.!>É‚­äC­ ¶Øaj¦û¹r`öʯ¡kägV‡*‹ÍLŠ .‚ˆ¨£2@µæH˳-Ê6ÞËó-)îYD]»Ôje”* JÚÇ›WÄÏž–(¦_Dò!v\ßr7üKí9ó_¹K´ƒÈž@ðVæ *&¥PAP‘r@Þ²Út«± QR}]Zh<Ýv0¶ÞOWùøUú¿šë¸ nA ˜‹ÖÓ$Ýsô2\@K¢´´: &sÙСjC)h f¸“ìi±é8?a!V¢”%ü\–€ÇÈt5tòƈ…-˜ßóZëžm?G›Ò´bP`%4ÄÆL¸’ iá)E†ƒ£r”\\´&x·¹ÚìF ..¤¡7Œø|ã/fÞèç®bæÆ²á¥ØÑ¨¿ügwçí¯è&£V¨ÊÐHÛØ«BªÀ*ºgUÔzÙ^œ4ue³c!¶™f¡ßˆRº¥½1™˜H•¸(·¥IQ–cM÷.н™å©SÖwòò9.´ÝXdždŠûìô“Ÿd½ïÖSÖ«Ôe{û«Û»Rmhæ.YU?é'zö¤²,÷i#óiY£ÝXƒUær$¦}U&+5ݵ½Šü›³ø§6ÿ·Ég€ þfMd{¡…‡j¨·™e€ƒ ôt·ÂT" Ü$m°¤—§g\ŒÛÞxí(¯-ú+¿²ß>Œ­úšÎQòøpÎA¯—¶ësb@jë‹$ý£?áÛòeý¶T¢ê"´òàˆ¬8 hk±åGôT¿kÕKMl©ñ‘Á?I¿S>˜P%D_úÒ¦FŸÌ) àÂD¢ªZ*m‹³ð}Âfª’2ïåp'Ñ4‰°¤j^×Éß«e€ØãœögU…Û·¯ ÈqݹÙÚ#/¯J§¡J7a.Ð,Ì6iç¼·™VÇO¯õV¿0Ä4L+ QL4\»Fz EòüQ¤?~,.eÜÍLƒ±£:d®i?»ÄV9˹Öípɯù´0iq£HE!6€€R$ PŒ"HAÆzÆ«n /R‡$ B@ˆJR6 =ñíB%-çèËó›?Ù—GúK¾£KëéU½Œ>üoôâoGw>æ‰Ô*•ËÑý®x²æÁr=s‘ùÕùèjo”bàjMËÒÃREKh¼&t˜RBeDbkaaÚjvhÄR2+‚®D0Bvj.2–òj+°J½®¡ê³‡MTwLÓt"5¸°7Àd0âXh¯…aÓ 0vŽ [d±:O"Á#Ãs~åy<™¹­ïýù<ûêsákz€^%_ûÆ?†òCIôFc?̳¶ô%ª)‰²®g¾¹Óà¦ÆdÞz,Whv:2€† c© k ‹ûE»Þ=WãfÖG0¡CvÅéq' @ Uo+ÊÀ•ÐÜ5É™¨Ó?.»0÷es7þêÉxªí3±" MÜòO«Þqì&M¦Œjì—ßÌKÿôN•‹UÊœŽ5çœ ñ½`O÷lcžïs®~;ôz…Oï}‘n‚gúÜ1/1ÑŒcCAámÕÔ.á<›cQs½[e…l3ˆg—FiF+)˜4¦`©˜8¾ÇÁ)_11‘úɧb|˜¹G7G±Ÿ´ ’ÅI”QÛ@øÂ€ŠÉ„z|Û.éV«%ôÜÃõp’›u Áj?æ0³83B@ÛhVI’ÏíTs† Ä$Ô„kyÂl¦7^Ú{ÓW»“ëŽÍ„¿®•´-0¨= „Û#dÍA`lµð¾›kÁ xØËûÚIMèÅPf(uÆôPÆš¬I+†rätÅ;Ü gFC†]˜ÆÑ{ÁŠ2öËm ¿›uÿÔóúY< ÆcþÓ—ך_Ë%Xꔾ9Ìôw®6 ÔöB¬°Ý÷κ«öŒ›Òü!'ZŸ›¹Ü0ûûúèö[ëñu¼ä«¯}ò-É=ÎïÕÀf‡s^êë]÷²PÙqs×ebd'ã¨"ö-h¹ÈöúÐX`[7=¾ŽesúÞX”Ibá]¼Ÿ”’ò:·HmbYSƒÍè…Dlø†º}Aª^Õ-Œw¸ŽêGsŽò‹bQ̸-„r€¬¹8‚™ößÔããSìÅóšzÚ(ÏaᱬÎÒ‡:«ÏöjIF´ƒÑ 0†z¦)òñµ‚+û„@Sd½¡\"1q™Ü“ö$D…¡•õ>w*šd橨^»ëÑ‘r ÝXúeYÐ ¼Ôr´£]¬`ªl³T‘KÔàe#©þbk´$H5/åèmÎj|å§Uèÿü›×—†“O6¯è#§âÝOÏË…¹íÀ›’VÍR" S=!S§¨B‰zj© pTÁ€Õ'”¶Çî—­ƒ_þþÏÿX›ùÆŸŸšWüˆzèqÅ¿çó_Ý´ä¼sÍÇ+6Wií (˜d™f?aé±?ÿ|{u¿ó–æu{ŒÑñöŒ…?³?Ê4þ:fƒ7>¿{Þ}b_'Þ{sËŠÌAhÒNUJ¥½n¥% ml3;z‹ì”}e<åC&@x´­÷´wðfëLã _–­{UÕ_óÃ/DE/ðivû—|ùü €r†´¿dnX/ò÷÷Ìtw’NèD©²CŒ”¾XðÑëwÆTràáH)‰F4 èd¸óG&.dïñ!±U_h.°“<å܃d/²¾ùÝ®K§tRKOxLœ=·—¶¯nmõ†‚Ç–*õñÌ íéòAt‰eDÁ!Àsé!õ—Íù¢á­0×nú‡ø`8gAËâö”Ö0Þ»‡Dº¯>Ž\[ú¿üoÍ'Ÿ½t¸é¢Í#dp¤ Ò¶ ÂR"ÀCVñYÜ3¹ñ[l+è¿›z—ôÛå¹jønøë‹¡€.(QQ@Ã"E››žIQ èn<ë zš$φe~9 m2~vîËw›]Æ_õæ5F‘®ãŠvÒÈHJeXØèl\̰!ÛóbUc¸¹ocЮîxŽNăè6 ›¬97ÑMUÓk82B§ê¨Næ;“öñ´gùåuì߯ßXYšæÊëÇ^!@vºïßáÒ`sb&†~Ö ÞÖ£YŽqÿñå·NWÛô}”MF€|·¶ƒ¯J4KK-Ø(AW$ïüÂlÿõ&;ŸçúÁ™õº•z[h½ž§¯®þOõÓVjºa&»?;ú /s8ª¹ûOÇ>ÜPÀù+ûþû¹þdÓôtRÞÃzMòQ{}ÅÃt††Šú#Ís§bßžšÏG+^sõ]ÆyÜ>'ïÆûÛ¹‹q}}²=«©ö.:à¤!‘®6ik }ÍÁ¡ÜÁQK‰ì %é1_·´*™Ù(Ñ#ZrÓ¬>ã?÷Ÿ®÷¼ÔµËTŒÑIZš̼Àv~¾d :-¾]ýÿyƒ^S;yã6¾vðyžž –O<—uµ€fe£@£6šŒå†¼ \!}L2ðŸþŒæo<ºgwåŒ]Í®~šö|K<Ü—ŽÌ j'é¯vÐàžDBö0Èo…€ECÚ«59¼ â2PfQs¬„œÈÆ8^˜ÝäÜÆ—ç!è[µ`¯Á7K?ÉÔѱ®ƒ\á_—žzPŸtó¸p,fòçѤ 7¥SõÆÏÒÏVŽýúú­ëä}N>òÎÏ™>3ÏT  oX{û]´ÏùHˆBÄrM.d“¯ƒçÇÂPÀ—Y†×åuØšsÆq^ˆjKóŠgÓ;vg/Òíy% öá+Ã+äJpŽùßWE‚´*¿Xõ¯õÖîcê7OO¯Z—žqú«£uýŠöžºjÇÑo¸N£J˜!ÁÛÕ¦Q•¥Ôc`75²SÈ WH* :ƒŽ²N_="Ï»×¾Yf‰t¤B€™çEìù)rj½hM4ÖÕ‚J\ß\®‡m !³ô" ¤Ä ;‡TLK}ÚŽ²¾KT˜š˜!Ñ9@YÇ4¤Ž,ä:ïË{üñSì¹ææÝpXà¶§a–:{ÀƒY>Õ'Çß¿ô§Í÷ñtOž­Ypsù„Þ–È^þáñËý_æ¿*Z@;£AÞu±XEIõ¡¢™A³¨pd5Z  pHl¸) y`W*•‚KL_±>Üú§ØcŦÈ' r”×iMªÁrþËüöíù]åYÏeŸBâ«G‚ Ð²?Ù\Žªýs òðx¾ñª‡7†.Ùs3’}_þ“ÿõŲ)ÿ£ÿsÓŸÞ|ÓîÈ•Któ÷Šß¾û³çz5±7ã³?z®a×6oö»/Þúïóëª;꤫\r8¯:½çøÊ^b9{Të\½¨í–}ËY‚š‚ŠtPƒê ·¦—‘£Ô¨Æ†¯¨°Èð [ãòŸO1›Á ÛCg VÑíÌ*•îëKûa^W/Õ"¸SV×&“§Tõs Í#kRd€²àš‹\^£+àñ:×y­úíÖwàå¾¾Üy…ÚèNæøsuÿ\m%­â|ƒ_/²÷RHW`ïÖȘ×Ä_Â`Ô¸ÊÞÆÔ;§µ½òP Uä!Š»|˜»“)ǤwÉ–!p<¢Â(1e©ó,'Á_f÷EÄá/!NH%ªÐNP ®É0М>²”íÌ­‹9S­Í²b¹NŸ5¯þÌÞýç59(@HÑN.Mûu_B¨ó‚/šfÒ˜¸  Y¬pD6ö'‘ÉùÄ<{Ì+I´Â‚ `8²T£ûÜÞ/sŸ/6–Ư´sËY¶RtÀLö½m•ÌÊó³-œ·÷ÇvÎòîÙPó˜ýж"½‚¹’;`dÓ‚÷Z, §Râ ÆTÕ±;± QÕF¼§”Îó*Ïûì½Þè8öâ!sòD±ƒŒ+Ô,Ÿ,Dõ4mÆÛ§„kÜ›eÓ=ÌR¥”Š =k[X«(KA êÊÇ ¡Ø”¢ -’;œìßuŸ€˜òeÀÝêÂψFùÖ2òÏí“™¿Ô«ÙóÙ FsSÙŸ´w>ñè†té†eiT:M\#m²Úë±,"¦ DUU×Úäæ'ô¾îùÎøwÚÿQsBx½í©>ÒüËà·sšwûÌq¹ß‡¤ÝÔFRN*†hRŽ¡¹Äé‰]ÑÆy.OzvL AŠv… ;ê{d¦$ª P†…¹!F.ª K Ѥ3¤C[ìË#&V}Sªå¼Ö»c´ƒ*1ÃÌð>›÷7-¥£+Öj—±È=Î|˜È,vꥪÁŽ’‡÷ä(k¦§ÍŽxoWïÍúŒBEœšù¶)·Ú¥&W)'£Üˆûèý¥’(ê“Ô­…Y§¦Î!i ÂBZ> ^ÎFG E’0J Ú*µáÓÝJ®ûÆ>VôŽ£z½îoÓ¦V}{³É# nÃÆ•~—Ž<ò›ô.|›r ª±_çPÄŸò–?Â3¸A¸¢‹ø(`h.K›»Ü°²²*µíŸƒ€­+`”ª±ˆÚ21e‹¹Éá$¤ÙÞiŠíúξWüø£Q‘¨êÙx4Ô`ª3>WýC›Wq=ϪõgÙ/‚1iGH•³›Åõ…LAÏÅÓª»{Ä-#X vîëÛ¼ù Ê,\Œ‘,»´" ‹gm–bæB?z¼áAÀ?B$ËíEøQ6e`‰Œúžò|¤î5•ÅÎÕ.P¥+AµâîuV÷Oñó»û€¥f™Ä„°¬ý\ýujl)u&”ÎÔˆ ÁÜ‹H¸US¾ü~œß·íîü^ê×Ïž+‹ÙN?ynµÏ/ß?[%Ù¸5B¿ll_-ŽVÌÅ@5úpRµk¦{®ÕKz­k¨ÍǬ”™¹!/ÇÔà=#\4™°‘ò‚ eˆU -Æ-äUEVCFk1ãêyãYZÊ„D@…Â4E‚’1Ú ÃìÌ*˱¯nBY êêﻬ‚õÓCi‘qYå¯ÇO«†ô^bö€\Öº?ø'}ü³õ7|ïïrõã›lqÝe® Í è… ú§MþÓ1ü["ŽøÛë€!i€ÐÈú€:ñÀ+†cZ'ð-x6ÊQ¦¯+’ ‘Ûšl&—8“ˆ˜wÇck‰VvÑ iœ ë?Òêr0Ö”Õ^ÍTÊ0‘òBBiP±Ñ·Û-OûHeA%é¶|¾zû³pî â<9.¸×ÀÃ=Gýèy|Éç1´¦ÊûÀX’Œ:žÒF¸.è;çßÐ{/®>Ô$—†FÏstæ8ÒF\Õ-eDë„áxaˆ‚’áÿ¿4íœË o˜ÜäÌÄa7udÂ^Ê,gïk’z³šÊÞ$=Lƒ•aNf2œ{]¯†z>£ÞÑ@§`·..ÑÇJ_3ì“ÇÃØCCã»Q½d$³¨Q+Ë95D †ËbD@xìÜX¼¡¢Ð„ YU-âóqh¥ê(­j/¬§}¯oÌŒ½šó5w 1M †&Ô]´AÑ…!k H|€ÑT¥¶Ø™fìß§¤©U@ŒpR4Î;ôh⺔¨âW¾ÀWt/GMµë 0NŒ#KÆ}SóX3dC èË<ù‘7ë}ÃMuÌÁ²1&š{…X8Âe²1 iÂd[„®J-š?íçožŒ•Ï~MËÅ"³ ËÈ%g©ÝМ¤7Y„V@‚Hí.Yï¥éÛ=¿:ÁãŽ%P—kX&hè1g’‘ +ŽÀ!«¿ˆ+Ý$Ü¿·},ܧ Œ0Š!]`ÆH]ª„ñ0Ñ0Ì@ã+J ‘—¼«§²m?l0¨a‘Šp‘˜¥Á@‡vÄN†]‘ЭßQ€1T¹#áfK"à‚Ì’‰ƒY J4EœÀ Œ( $ÙCßs¨h„9·Þ7½4ÁÄ îV)0)ze…­.„1Ã$%ÉÃ8)Oé`MØ»g‹?¯íÇK±ÆÔ C®¤¹F¥â´Î Ý~Ú nÿ̧Wý±€d].1•©Û6«ÙQ¦ÔˆáHÌ{Æ6‹!$.çHÉÇ6¨gùþ—{¿¹ ~ÏÐ#*o:®5üQ* l>ßúÆÏ‡Ý=ÿÕ£-dQâˆÃ1¤‹›Bf¸o÷þKÂ3#œØ ^}9è˜Üû,óŸÜ§±ï›Ì¼ÜôºPC\HsІ:@YV8„Ô•zà¶Í©v'nýB¡Öv…^üt}iUò£Ž´Æø‰ôïœÚ$ë¸Ï-ºYÒ²ÖÛBwlÓÂoU¸Ô­Ïz®qûq»ÝÉ^æ²7Žë² „³¡žÇË-—Aá¶)N `8SRûƒæ‘êë-Üý¨@j¤§í6¨!Ì϶­:¼L‡*e|PZU׃æt¡>ÑI‘Y ψ5ª2šÑ<¯>ÿïäþDÉÑH¨q>T‰³¹9–$^Õë×8{íI»¼B8·uÌö5 ÛiËÏ‚šÓPm²ƒŠÓhi]x¦¶ô°:7”qåz:Š`µ}Ò¼V³.eKg´DªDHŸ:ŽŒŸµ/ÍÌ$ µ£ýTŸRÑqÐÝ@pµ+³Äc™Ý/õ)ƒk‰ Àt@Sv¢4JOñßûáÂŽ™ñœJÚLÑñã£ÔOH­þl>*¬êºWÖ(K°a@· ‚`J(IžÂdE¯ò2ž? oìL,ßvõeõ‡A𕏄ôñ‘ÿ‡ ¡=£º‡¿ƒÍqúò•ÁØ$Ò=ö„»63 Ãq¶¢.W6r¸âƒÊ™h¬ã›òm 5WÀ±“ä\h¬XáÞ[p0cGܨ„™9Üø…®èŸ«b=W5•·¬@ï½í +–VF³ñîŸÎþ®¥º¬(Ä 03:/¸ "vGÑŠ.h†1‚È„›ÌÒ:ô~öNöȺYâ¯àžå¥ï|ÇþžÎ›ÇtŠ«PElµr£Â^Ù{—ònpuH€Åv²R^õŒfÌY>IN‹€R˜ªÄÄm'¥ ,¾:`ã ËÁu~O¥îE™HÍkßpàg(s Gr:óˆÜYGv2¯å¤¦O¤éçuSײq&€·¹õòÔ…9±×#I§j¶AÕ TCì&¤)UwÁ0X+(”„-§D”¢eLBöÿŸ0ÂÖ`!õ³Hä>è!«4§ÎzO%srÔ1dŠ’v§¹i$§ŒFìôsôcóïô<ç\` ]XXcíPáÕ½nW¾ ‰‡Þè°å~¼¾ìÛ5ëÆuz^êïÞ¿¿Ï™ú?šÿ˜¶¹y´Îl®3n/ëñOõôФ':Š—Çû:|žuWwü³Ï#¹½ö~Wé.{2­äŸ4üYÍɱ¤PÀkZÅ’2¢‡\Ê^‘ÖÈâ!›ˆ‘ˆ‰×f+›B€E5 %Œ 6 íì9· üg6RÆæV›Üb{D§ZÕù÷Z|/M'¤–®ûø§Ø™iÛ7¨›dq’Š ¦(’(ŽŒŽ¬ 9__Æ!D¿ÌøruÝ?MýŸ‹"* ï[és,e¾¶K8ÉÆâRðƒ}މÔ-Ædº –T–2Ð#öƒy0äyënÐÍ-µ5½J€À+›Cu\˯/ §Ð¹¼¦É ¢jCǫȊìD4‘xÙVjï¢S¥â‘Èž)AÛï—k15H;}üž]ïëßJÚö·Îeƒ ЇWŠ‹âȸ®~>§V´ÄÉ(Nö Öx„ävÿü;}Ëi0„E)ä0C#I•ñJ5SÊÈ´˜²I£¬àI{Z=òÇO}8ÏO_ØÝÈu¤Ž’dÚÎ÷¯ï÷ãÓû£ÀÁ¤víõ°É„Ç$ge>ƒœÝ ´ ê§óG3¯ÿÍìï\¤‡ªc.Îëû&GR8ÖyÿÜ–øeÏ™ž¶­¡ß™ÆÍérO†$ ä<á`ˆ ¥&z©„OΔõ£Ölí¬ºò†,ÆÑSÊûœH8o¡Àë÷%†º Ê„E*v@BÙ8„‚ªR„HpKt‡)ú‡Q.+²Ÿßëúª×ìœx‚þ ÐP?¼¼+¥òj¼ ~8¹¦Ð5þ3ÔÝg—ë<‚ÚZ”n1bÒÀ*C‰júH€XÐXÚN^\¨E/HÞÁgážø‘§Ü¯ ëÚ—ŸA†Ž·ÙŽ{$µ¯½ÅO„Ÿ»sKt¼sßd&MĈîùÆ¢)g‡£ÂÉ”CYï¿^o:Mœ‘ãâNÀjGª£ZMv‚ :0r,\µüFQÃi=V-?Z$ƒî?Õú‚o¾k/-rÿÎæ\'°óþ-…ƒ™e÷i×ÑÔ±vV~~Än‹™ç†©•_dÖÇXDóÍ8Èî{µBñ¼G9@a_¼ú¹,–\#?K@•¦ÓQ³Ž³%®J›ÿıˆa¢Ðª|T°`!p„À!ƒ 1ÒßÂu³2;Ó 7‹e)/è?Ë8uÕŸEŽú&ßkuãlOªØ´ø8}#ra™PÈù„CÝ*f§+5"Ð¥¿5†„%pj]GJË«ü€»þ•À…Fb@© ,V$UNÊÚ”aá0?âYù>Z„"qM5з͛­pj¤b©ôKùº¶~þÖûwW§7¶zO¦wNƒ2øÊHz¾Þä×M÷×#B^x\ ANc’HgN]Ɉ0DbJhVGñ’€fyÂÒ"<Mp x°´XöÕ8"ŠOœ tG¢²Q¤-ÑvÔö6ïùùü«§0žÊÀœtótò8jÞÿÜ%rŽpº;1Ï;Í#áVÒ€ÈDÕMùSÖZ¿Æù³ï¯ÏKúœI*”qÕu™@Ò0ã@MiP:IœÂ T*<â¶z¨Â›¾IÎ/úx¶•ó½'!žÓÇíZUôú,§ä*øúÁø'J¢kD)AûÐ ØX™ù&YÓÈ fb'RòˆTm #˲¨„0m7TKˆŠŸû ý¾ú,× òš;ú'¾&ø…òÒ‡Á¦ç9Æ]¤j¤¸Q ‚éI›~ˆn²žÔ”" fu÷Z–Ò:Jõ8Ä´Tíξ–wÄYlz.ªÁ¹÷Úæë8sæ¯ÙúÚoˆëå/ƒ²ƒÅvº+¬Ì ø]˜?‰ÓÛú´Ç“ꉌ>=c$rËX›ÔiuÜiëV²‚qý{Bµ(-j>Wל>!ýééL=àš àékiƒ¦m°8 !ëß\xcåEᩘ£Œº“>òö®,¶©eQùá±|›ûpä^Ÿ+Ó®Ôššˆ´òêÓ—yþ}^ŸÌ¯ éD'ÔÏ5çú©.½qÍŸ¸oËiYÍ£}p¥d¥O.õ›Ý‹‘G­¨Vï¬E£lvŽ8‰r_Æ€&ÊÀ 2©ÿBÈ! â„W‡ѱV™1‰¼¸bŽï6XT½#”ç´V¬ÚKNR…ɰW½˜Ô–(-Ò²á6éŠÃÃä¾AݯþÓ{ü?÷šσm×”Àd¸qúm+o^Öyaé¿Õç<¾:|eíõ„Wç¾¼»E¯-]”û®=SS$¤%Y lËMtAû,™Æ¡O˜ iìàÎHuMÈpNtCv¯Š•HÃ=´ ^$`kî‘td )p°++)ß.ßþÒçóR<ͧ~¯ÿpü›¿´VÈÂÌæ\÷ ßce|ÄAlí}=üòžþ^÷y#Ý|Wô°w£$1˜\»˜Ü¿€žßûËŸ~ù£Þ¯TFÔLBã½eÏŒ”®¤E;£žÁ'£ H‡ò;úL¶íù §å™×sí}7n~»I˜(wqâF¨f¸«CyŒBM¢Lle¡MrâU>‰<⮆¬áUSF„V#ZêyåñÐ1þyä ¢ÌÏœ „ú‹^”£µôc`á|.¿ñ€×H-œû»Û[I¨­¥/Ëã“ Ê!à :bHõÒch2WϤò¢Tˆù…QùÇ¿Äo~b\H¤#–ÄBÛe,„¬H a$‡VpɦB`Ô‰±Y:3Ò¬¦§9.*T×BDRÒAVŠíåvK4r=vÿxWºwÃðËGz|ÿç~ûõðìï|ß]óKXÄœv{N¨ÕÕ-d£˜ª¥T¾<î•Ø ³Ž°À iGÌÆ ×­E×Ó LŠÂÞ­Ö'p¾}Ç÷|¬71k[µÅgzUH•d¨bÀvûk¿û!Ç+Ï~êî¹wS=‹RɇW7…þœüöìèô‹•¶ÐýG~4gµ"¥T ø„ –‰¯XÏH+3ƺ“ö5oÒ•ÞŸe™?&÷©÷·.´ÎT€ŠwÚ1(Yqa1— nûÎðJtàð!q˜=w8~®gÚîîñƒ?­Þ?¤q¯‰ðg9†Æ©¶cO áŸð7ªéqz ¬²#ƒèÿÆëåÒ(£¢Ä0G¸èuRZÂCxmÞ6‡惗Ž% Ã0#¸w@ ONÊ[A»Â-íÚSÐî×ã ÇÐÜIqìuÔ°h¹-X(1f³j:w8:>ÒDkœ7çpœÿò<ª×–œô›P»e´ºUǹUÌ35”Fq×@™ Z¢‰x=)½v!Îé}¾˜Øãþ×]áÚ}&Q+ÆåM– Kl2J¸šÙ¸oæ §¶•šr dX”,5ÖxžW> ^Ñí_Ћ]ŸŸ{ôÅî3’§y“…UAmú$Ú]Oµ»>N…‘à#‚<ØŠþd-ïÈê5P§.¤½§ÎrFtMÅ­È´6ž`y´¾mÑzößmx4u4´½k)õ(\Ø:¦qÏf(b+}+ãB¤Í%dGM=Ñ¡(¸láj#,C*èÒÝðŽ;ÙÅÎ&ÓÐ .ðBd„ű¹ËОε óœ‚t©œ¼S³ÕÊ¡Onܸþ…—í¡îz0g¥KFjé8g²Sέ–@q¢Ï|7Dvþ÷Ûÿ­ò£êO’ó·#"RÝìhAŒQ+‡+(©v+[ÃÒÏ,í"Ôh0cUP¦Ôz·ËÏæYÚ‹¤A P @Ä8F=3œfìõq?_´ó´Ü¯ÎJ“ÛÌ[©ÌpòLuÝUœ#l”D:œÖÀP‚«Ý@É`f¢K@ã3AçvþBó?“oTJ±Q£=俥œ»w3èqd¤«E‘À5V1@N¢´$vs­Pn>…¨Ü2kTƒ•)PÈ|ɪ€òGéC´m#Äx™¼*2· #óÄAD#$QzñÄ2XdCWtfÑt8±2g±†ëÔq°#/§ÙóW…>&àˆC-”8šiæ.æ÷´5”(CTLd‘jLQŸò™§}~寇O—Û{›@´‘ Y20•bC#Àå‚uÓµû¸OÝõy2ší÷ßv:æííd+gɃSÇG³yáN áqý~ë’…þT!Šª¨¯çet“Ãɶ©wC¢œYÎÆ=Ÿý›Þw,’´XÀ¡¶ÉÏâËwÉ1oO¶,RV¹Ý.*»òŸ{žûÓ™[çW/p§w±© qkŠd4P„!®˜`±ž½z°þ ˜•yž¢ZÑ*ɲ!À¼ ¶xrP·eû [ ŸØ­­Ñwðç ;[Ón!3A­¿¾ù*©+Oí×Ïö¯‡í“t²+Íj Š8W¬‡o·&¶ntqÖµiÓÒª>ƒöOï¹é¬Ã¨»- 1/{ ªe~a Ä:ì‘Ø~>½Âqº0þÂM¬¿îªÂ“?ðǹÌóŒÿ=¿õ±ý~Tt?L5&¢G¼ÂÔRš ðiDÙ£ƒ·í1ˆ“1´¢¡aq¼œ …Áì ³Ô<’|†ÛYµ Ì{&§j>iXmuÙì8ø‚Õo+S݆??3ß³þN}ïX?ÒÆy[íYäﯸ/â_~ >Ò«ÏBËÌ£õsËgc|4ØÈ)D'ä·â#þÇV‰y#Z¹&°ªdf÷eæªã?rÃÆâÕˆ Î`)”D\ s¹AwÃ-æd<Á jQÀ @øÐ<…‚WŸ©ý?+},ië{ÁùMÀJG¿†Ò7m‹n=È«Y­¨ˆ k¨Þè‘myŠf¤Ë7ëûï°zê ¨ÅwÜ/u%€%ð0ÄKޱ3lßñ¨k`QÔE{|Mõ5IˆÚŽ™M‰Õœƒ—§5ÿOƒa0§•^ Üyæçvé†]Ð×Õu‰GJuŽ<2fa¾o1Êyì…å Bx ƒ°eŒ¢EBó€6TB§z6Q­ù|†¯¶ugfaeyP$(ÛÖ€—(8&¸Ü‹€€Ü¦¬Î–õå%B'â¥!:Ì>¥ƒÙˆ<VÏŒ¶:Oñ&eB×€Æ7¸sìÞ?ëìŸÎÒ~]÷êûÑqé4 õ¼®ï^ÿ÷·kÛ\ÿõÓ+UƒTI( ê$%5€IJIEÊZëÖѵ´ÖwcP<@¼€r{òöév¯í/Gþí) %€µS2€àP†ÌšÃƘ(†“™å*¤,오i ±’Õ˜KÜ ÁZTìõÀµm"TüÆËñ87xÙªG“/¸u›ç1‚mÀòp­…ú¸Ú(¤˜i…NÄâ@²Â©1¯LÏQ1# J]p<ŠTC¥:½¨Bü1Òz+c¦¸•>ÔõþçW¾þ|ÔøÃG_óÒo‚™fn_åjël_mP|Fû í¢ðLó{ýúݡ蹴ŽÉ\WÄ“b®/Z›/Ô¨¢Šlƒaº¯¸,£„D¨”î,½®ŸyWü/‡tŸñßnþU-1†«ô°BN%×Z¯tÍÄAipâ`ãÈE¬¸ó¹ž]íÒ•å£tÂñ—÷#U'àÊàÖ ²ÕžjK_=ú²ú­âð…¿yÇ럵Â}TÿcåU6q.‡ÎîE„½¢Ð•ã<¯Q=&Sã|ìÜý}[á&H˜uèÁ”Q4cìbã§âÊ Hê5lÒ€5”fÂ-²žë üZ€“ 'k€Býî8mì†É¾%.Ji?PŽR?nï\HgL31ÝÓ’²x<öá×·òøË'çÊŒ‚D’0¬ÔH Ǥ,¢OnôÔØój/‘»ß;Õ!-­eíu< ½YÝþvi @`Pd¸VŒXI‘l½#镬è !‰(À½S;»z¦ª•ÉÓ!öc’¢Qràò³NEÙ]z7q/­aâQlÁi¢ÃKÇ™Á µô‹ù7þaÝÕž‹ÖHksV9¨2žO5²‘“aßÓXókÌC)dL–_®“nѺ„¹ˆM{çæuM{gá;§n;¸&¥¤TØ¿¶ÓÛe½ï%3£5!ïã;ú=»KR2U„%‚³¥ k˜ÊI©EÄqU’c<.­ÂoyGoõ5ˆtÇ+€.YÞ_#j0/T~­Ö»Ý£¡$Ð"t³$Ž„"A¸ƒkÕ+ƒ gûmú€˜Ì5ᇬowÙc^U…Dp°Y_=¤…©øÓŠ?@±0mG*Ä:êÓøÙN˦ P¬ÉJžØ§`¼hÀò*½Ÿ¼¥$¯ më™oÿÙ/øÚßzÈo°è£Qzì^“õÝà¾{3$DE !¢|IIq)¦b8 (bËRBiŒ–jòRˆŠLT¡YÖÊRôÌþó¿÷ë£ÞÞd­nÇ~¹Ÿ½ý•6ÿÑíg~eI°ö‘=øÙÔÎBí~¯òñÁÖݰ]bYʯº¹† …Šp§Ï‰fŸz©//žCu÷9KÝõ9׫Ï|»ý¹Ãá:^{kU@ãÚ{‹~ËÞ'°Ë4bÀSSò¢F èX” „te¨&]à#´>}/¥ÝyLÿuܼÊû8é× ù%Æ>QW0n–h½éíÏ]Š\½=Û))Ãè/ÝÉç/þÈÆ€9W÷gì¿’û†-jWcÚ¶{eðF^§ þŒ³O›ýµ¦²O×üV ”¾xš¼pbL~3Aµ ÇiÒ¯£ä‰Uw5ûÙáÒ†ôÂE¤)DÝf±1®Ð÷ªÚp!†¾äÊ¥5iºé¶bõÌdDw˜¶1¤¤Üæ@8`ÐA;pRd5d¤w°¼M)vXWJH;Û¶14ô×!JXzÐ4Ü<£w›¡`.w»&oÙ7;ÞR*–E²‹q\é¼ê<ð6uL·ýu|~~o¶G)ÖÆKsɺC¤Øaó¶æßLÖ§;Š˜<O=)ÊÀT,ðÀ>#4K‡ï÷_9•›Am´F¦H•¢C@â°0 ¡àE¼0U‚ÌêP¸M11—¢–-¬HuhŠ–aºA‘Æ7ÄÇeÓ†ˆ±ˆaa$†e¸€cŒßf²8ZêÚª|÷¡Æa¿¿)MÖ¢_×DÍÇŸ}š ît ¶¯¢RMÝ#gB†h.5j¿¶_ò˜.ï‡Ö%¿eû¡ ml7²eÒóæ«2t?ºŽçhp¨µJ¼Œ3Œ»qºHX’Ò°Õ'¢´A'ÚËz›ñÕwtçá˜(tJ§#YèÏ]¯äÔɯKý ²yëu¿c¾b‡hõD“Ó™éª8$£„’¥)³Ó]lÐi…Ë#Lì8‚¯Uây 1 ºa˜!'ÓÑÁz?þ†»…qlÌO§baÇÔ‡ÄpËɹ¹}»ö¼DÑ•YngÚðC†ØVa¡s¬÷¦öUpX>qh€£Ù‘R™£! 2B“º`DTMPîÄ…nbÝÁ”rÚå&tÏPÆJMuª¢V²Ó=FZ0AK·²ÒE+ÂeéÔϤKÒ¿\±rÓ¡PÚÔ^S]óÆcåvt±wÐ\ÕN­k‰³ý72}æŸYŠ%´Â•Ø .œÊàÇ·°§Õ™Û{yÑ,‹ mƒvSÞÀaµy¡Ø¢‘{Ç÷z^o²P…âÎ$’éjHÊ.Ì—èR¸&Rdb@ü±Õ±\Tˤ! ø<óŽ5ÅhÖµñ2ÌrO®=ýžw8ØòsS„‘ñÔc¯ª)}%•4*m$@¥b¦9$A×híªŸƒ|…^6už°G‹¦l@2µ>ÏgWZ&$kò*ÖRo.¿Ó<Ó¥G¸SYµØn`I–°Îdõ¸9‰UG2È$>Ùê#ÏÒt£ C–aã*yöCÛÞ¦ai”Ã5fÚ·‹"¨èçî£zü¹þ?|îß9þãõÿ|î¾7ý^}¨}.çš>•ÙÇ‚î¯+‡~6Vdͨl¥Ó±*Š#8rhpPZ'­€.”ÄÔ9U@ZœdÀ®+ANá„"#ÊÁ®4®¹¶³±tOµ`.9äxÇÜ{¥ªóci® RpB,¨qÆ…#4\û^¯’Gü(Hír ÄPR „@Ä …íýXoÎÇfœpîÓc¸dj1屓4f#_ŸvsíõõÐýø}vÖ×ñ¾Óß ÿ„+œAþ÷âJ¥Ä?àOy0€…)Ã(žQÅ Yp\¹•b ²C` e0*·)oAÔ˜ºÂùx篗7ä'6¼0ĈaµËYg®Õ»è‹õï+um{*&Ïëò{œxÜYäE½P+lX%58dUT\;“L©F gF’Ï¢Ý)ŠåÀ4ZºÊ¨:‡=î;þŒ_ô¶„$V³‰ÏõåÏÇkwˆó÷’Q0ò:û<¤Ÿ†â÷¦ Òª‚Ÿ¯\¸RÔ H"5ÀðT°6(@`@+ð­5°Æ"ÏyïCˆí^H‘…ž(,}mã<‰¢>ª8@I T@>3ÉÄ© „TÆz@¹aÝÛ«¬6îµT­`­…k[¸°$D&A½Ìö$‹Ü ÔýêÁÉNšO@}àBk^¿øöG·—WÞ ¡2Ê vÈØÃÉ€…GGFF*ªQF†y]î¾ZÝ´43¶Þ=P¼îIî²Iðá™ËÇO¿çîýߓ޶>Rª)7¶É6M&R…YÊD15¦†óp<¾±Ÿ SFG§”¹¶zžvÞNxô¸‚ݶ BB–УúWØO—IÎb©Dïg­êù»;³ÌN$~5P–.¶ÚdÜ*­‡4 ‰!‰VVq½™E¥]vÕ\›YñVTÄáäÄ_G%[ï‘Jž*»?|ׯ;ÏöÉîüå«ûý§ ù›…üîž_úñÿclÿéžê¦lÊ#´uá&¢H­¶Úº½ª¹â,ÛÓ‰×ßÚûÁëÔ%F¸eœ?)ñsEñ xp Fc½Ôá¤UvüV}–¬ª91;öÉVtÚÞžÞn>FV¾5©w|Kù3(þNx¹?ÓDÎi0tÀ8vªm©RŸ•‘»Íl`9GÐâgÀ V†Ð!Îo·:ƒM‡¹ÓÚAKï MîɨGçÓ'íœÇª—§«K!0ÇpÁÊÚUW‹;«×C=}wµ¾¾žå^¹•Íoµ¯'éèÙ¬oè±_Å^Œ–|ív%ú…~‰<7,¹Ú•ƒl)W°¼ETê=‡ý’$¦ˆ• «¦òØ+óÊ´=ßî+éòÌNk"§Æ6ž%©& ¹ “ Ò Ø.p”_íÁú a™aZáæz>/ëãL¶&ŸY) sõøÒí;R ž4½&HrÕ@¥J,D*8òqåºäHYvM1"*~áYz€ú…¾õÆ £*Ê ©Eâ&$Ò¶ñ+Õb½BQ±uì›Å}&Ÿ•„L /’€“MvkzV¹—¦¿ë1ä~uÂæ÷§Y¯ç{£Êx‰¹k~ÁÊ-—rᙳR¢8½Iä… h|F¦K‹Ú0ê$fRm]s FÁÓ¹¡Qƹ„Y0ʨ£`Šä‚äöZo‰É ô3§Xç$îüF” AÐÈC” ŒˆAì’ÔԚƟÿº–û·ŠÁ¹‘À"?ý/µù›·¯×~÷'ÿúìlm×·Á…AOÌèåã.¶úõß|úÚ¡'0 ’P¶!LM2@”UÀ€€1/es`È€L(A ék?«\{óþ“?°WÜH £ ±b™õP…‘è—æ'¾ˆ? ìÙÛaÒ9Îv"*B̡Ǣ”‰i_ÉÖvcí4hàD eH¸oàSj?ÓS’–¸3h¶ÑD»{XMóPnóÁ.¹À¶dcBݼÄR:i¶Ðõ±¡¸Væ—á1h|Êz•Z»JG“H>ôÖ+"® µ¹¾0ërhJ\,áŒè½ï7[ ºÑpâQeB°’.ˆOšs~]²}§w±îŽ:× à#þ^Wˆ~„ø­ø"xÞôü6+ÜÎoü*BM~·-‚­„ ÚwÂÓS)­ ›ª}‚ó<"Öõ€”ûÅ&M†¤¡Šé)¡;ØêítÚÈ·zÓê3QLa"è÷"ØІG@~èóóz-"Èä³[\¼íÓ×Çÿx‹ãµù½†µ2±ŸÆS¿Ÿÿå×·ö´¨’bA9£²†‘e©,œË™6¦ÊŠH.rƒ\LGX‰½œbNºÓEÙ0½Š4Ciþ10Õ¿˜¹~ŠÒi6^ž38ÿùWüÂÏÛÓçù›¿àÞµ9Ú")ƒ£ï)OåNÁ–´¶3ŽPÂ`(“œâè¤~ö _ïÞýwÜÊAÔ’ôäîòŽ}ßÍ¢×K:íh–Üø£—¯æ‹î¾ÀdCÕ˜^H‰%•Å!¢ÿÚ­0(€t£Z;­^ÀÑÅ÷›ï¡Û³ÿøøN|jê±J!·ðöhëÕÕà·<œ dDÕ¬þýòy1W*‰mwƒ¼7ühsê>J…òêü^ÌÕ›?RƒêÀ‹»Ý¤£/¦mŽþ$zòª—Vz–ßhdØ?ÿ¤ÊžÓ@Ÿ²×5c]_ø ¸á­‹ÛŠ™.1@Ea ¡»ô˜/ù‰Û‘Á[¨ÆzŠá:’ês„É©q‘ð!BÐL]À¢^~¡‚!›æ‹•Žn£q{W‹óuÆEî&¶™¼h(Î’½TÏÆKø÷~â[7Æ×-ôWŒÝÝuuÈ-‘6Ú06 ¢ OÊÐþNq óY»ÒšÀB»A¾:+‘hºrøf°#ÇpkeA•Úè3ݱºcýHED`Â">NDvSVôÕCÙáQ§tŸ¯!Úv Ò%\ƒÍC¹“Z}ÚÀ1ÇêsqAQÇ,ž¢^ðyûÜïcü2xÓ&Yky,®ý€”\Ò #Ö>2·òâ‡ëÕ½ÞjÔí_[¡Ó×p–&M²¹¦g&‚ˆ0iA@ ÒpH%m ³!€€eQÄ©m»Ñ¨q%5[¥A!¢}‚$Tº5èÄm7—Œ…k&Déö+Éž˜–Wléq:{–_´¼¶ñ¹ j;õXùÌû²Ï6öò6¹÷ŸÙ3$,õ¢­P‹Ã ì$¢t]ÍuÌÞÈ{ú +ë…5·Ä«Àml²G¼ÿä9³Š‘í^+p—׎š€hÕ(Q×§ºc³MtG&2ÜF9îa‘¬Åî (9k ¡•$;![@%-ñ¸‹ü9;O±ËÙÓd_§gŠæph€µØÿЉ–vài4›Råø^½µ–BÄMÅ„N’éä?å-¬d9dzž%¼µ­#½Gév•U”‰§én>ä‹úqÏE1dGÌk&ŸÝF]i³=ÓC! G­‘ šlxèÜ‘¸ 3 Ã%ñ ±ð*ÁÓH ðh–eª$“8 )i‚órVÀb ;òÏ.^\Û]“3H¾¸bæç¼u[gTÏÎÕå V ,8Àš;qþmÞ|¢9a4‹•¾á^=ħïU³^bŒƒø1ô ö<²i¾)ʱZ3ƒ *ª^$ —óD!29ÅÐàŠí”`¥GU?ðQW}”»ÈØR¬u]’ª/„VÐÌ1@Ëp¤Кƒz.=¥Cc¨J¡]<{œôÑPôÛ‰þàéFlÒZŸ1_":öÅzÑ—’SÉ–rZŒ+)¥âàj„í«´¶'ðpR'ÄLÞiôE>q8 i¥L>Ë–ÏyÇHèx”Û¶¥F‰½ 7j/]­4ƒcóÄŽJȹ]a̸"¦ivf“|‹w.T ×á*ýjÈCÔ–Ý5XûJo‘MêØð¨EÐÇ?ÿô¯OüÛCY¾¯7·¹<úa2º5Ø&öHz«ë™· ëÙ¹×þ%ÝÚ Ýå¡j,ÐØP[Ñm ¨ °@M("´`¼JB¸ÆÞÅGŽÚ¦• 2ÖP±¥ZÖ ‚ªÒHË4v ¡¢—NÇöÈ×ùæ]º1ñ¾[¯*T{×M‰×˜¦ìU¡žŽ$Í‚ó?ŸÜ88F)Î HMH(4)#.[¬–ðí/Ž=˜Ž,>gúꦵÓÂú¦¬9çÍ^)ú±ãÛƒD¥¡øW ÒGâïMÿù÷¡ý=áoþ{ãЊ ’PŒ0©1¨D9YC¶à•1v'9`0Ðn§S8®Á…À4ßg8ÕYÿ§Ëo³çùØÜ瘩¼Éu.¯LQùžßÜû¦Ç0óºØ3¶]„iQå™{uc¡:†!]ÛŽ4 I'gm:.þ±û^ÞÖ€¢ Ø’¤mAÑÄ™7÷÷üž± ÊZ˜8–Âú¯^hxã9-žü³ÔÈÌÀ x׉ "È^Œ,´nx@ PP€BÈT°…A 2tæ—û !óhˆËqL…îáÈt¥„ If´¢§HA-Ù=3’ÃêÞ™ó¬z”©ß2Û?T_ºiHÚ&Mz¦'v„‹™{¼çþ‚ÉjUÏ»Zs€©OŠ„üÂü£ëï/HÆÈf"ûÐHdLM­ähdTS…¤™‘a_NÇ.àŽŽ)J‘0ÅèÉ1”it–ó­0]ô.vyë’"x ó@&¨åÙKn‘\íÙÅi·6ä¥íé˜h'Ÿ/ˆuU)€ "·qÕ !\JX'¾éöê=_öóÖÑ(]K÷î/ã>¨WµŸ6Só-èù^æíS¡³ ‰¿ôQ¡$uf,ÿæä2“6)Ø _€B_:b+‰.x»ð얻؈ެähXðê%’烽â%ç G ›-«õ¸9Ûÿ,˜¿6ô†‰Pû¹?@>Z‡ÛŠþÈ݆Ӓ4¬Ð]ˆ;£A3µ¼ËQ ¤u É¨7ž€D¿1mäoÚ é¡1k±%§k Z\Ñ'ÇjÍíóQJ,ËÞêãÿò¸°ïðòYe›î²=Òž†Ž(å™îyàYbx”'€¥9`)jª™âC8ª%,ê;@ o… !1Èz§t(Û•/A,'¦3 1Ñh ¤ªÀ‡YL —ÇÃVÏög¿š¶¨n­Ã=«—»Ï™WY^c³¾ÒoÛÈS¾ÿDÿà¥újÒoì#Ø»þ‘bý°²³Ã|¾©†;L¼š`•ËÉ=«*™*¤,ñ³õó]ó+„í@*fŠG”`0pÁ)fîËŒ’⊵.Ì*‹¯âðGÄÆAì¡6ªÞæ$íˆJJ€³0ð–P[k2&_=5É…Ù«ÛÞÝv Šh·Kø¡ W*ÀJX+W¢+#Ô8ekî*j\)gù@ÊK%¨«?‹°µqÛW ŠU€²«¥¼ JLšJ¦µñ.B#k5ûŽ3#èç6ãßÔº|½½2±àܾs÷îãMWlš¤ò\ 3™Þ#¾®hf~›ü œ©ŒˆØ& £ç´{¤[ TAšót§õŽŒ¥æÆÊ°·£ê±¾!égï:Öü|9èËUCïçðr¤¯ê ”MAp€ª"9ã C%“b‰,ª:Í^ü¾ß—ŸÍÛ‡t+½¿$ým略ÿ|î}ùîfmñ?þ0³ÐrciØTÝïB{úîÖùi1¿0בY`$tÊ``(P€€ˆe*!@bøýǵlŠíÂc/þº™¿a¼>ªÏ\-RÂxTCýrÊè5j&11Öæ2ãxFVUð6«¥Ñ ¾<:@LG-ûE¹Rñâ¹qOºTŒÈ>‘ˆø–ÓÌå ‡±ÜL‡‡2€¯Sàb‚¾ÖT¥¯K;vqè)«­XúùjäD÷²ˆe¥ÑH(¢°ÃÍtW½1{!=4ͧ]lWp¡ÃGÀÁPúWöÿKtÓùß9ÿ͵8ûÚWZÿÉý•ªü«´[­#ëªÐsEùïGå«J÷¢}:âÉ¡þQçÁCBç« ˆ ©3PñÜÔI9Oôimæ\0 ´6m™"Î}1•1P"©οˆÐ_ ô/ºøo÷Ì_LþÓà7øô<‘C6 ÖÓнßÐq_MSÊ?©sBΧù“ÖÅy ÃдçºsRÑ®¶~jÆñ?þúüä/Àg–ªFšÓzQ/cÍF³§·½õP/3\lÎU©DÛœÜß ‰a­GÌ÷Í/fzMqqêîdcìòH¸‘¹#YÒ?Yš³×ÁCiB4gÄišv…#ž–û|ÈÍOâbÇ󰎲Øt&CÕ©Å&'{@7¯$æK¶W^“ýÂ>+bKjLjˆZï¨g?ÿœ®&pO—͉ùíÑÃ;"ÇÆƒwËxIÖ¤:ï Ápçê-Ù¤mw*¸æÈ»?Weî´Û·¨ ¿FT$ x‹äù´xñ~uîféù‹_ºþüñ–t».gxüW?u žwá7Üwë…Ò¾))3_a­ðí9`d%ëîÌåËóªK ¡q£q£mJ¢Ú be7ûË=|ŸÀ&Dìºåñd7?‡ë=óñçuù¹mžSòëÔJ*:4 C”UŸ ó±)ªòoÝY‹g•!Aq“°ÈU#ú®Æ§6¨Á\¼zï;´Ï3BÊn ÜÉwéÀ¤9”Ï"™ßÍ×–Xª’MjqØ …·1BñøJï0î+ªj¤†K&nÔÑø3ªì¿6÷J¤ý\×/HÊïŸÞ…ÿn¯™užgý lWùQµÂ¢8e¨L^ºƒ'ƒ¦z§<Ƕ†ËˆØ‡Í}c”µÎx§*ZH6"‰LÔö¸ªÎÄ T†X.äR0à¡ [¯ŽR‹]¼BT}ƾ¿D ù!‹Æ'Á¶4û/}}Ýëgoá­ñó_ëì­ÿnftÝóú-W2ÛÒ]îµ¾b£ÚMeB "~J³æpâ1Ó]Å, åe*€3@$!¢B‘hZ,‚–æD!V*n-ŠH9 I}æe¤ÿÎïn~¿vàíùÝå㇃û®¯ßÿöÏ¿4÷oû/ùøûõÁQˆÔao ]FÀyA"„( ‚œËëÜøÄß¾ßÝîKg~2Ù\ü¶2åø¹_×ýŸÆÇ«óKÆÆé•¦3ÈáŠk?qq§}!W›ð™ŽÁ[elìñè@¥Ë-xÔ50ÚôŽ´wÌG~6Iš"ËA(Oè"r\ü—慨U]]Ã×ÎJÔ Ü1GãªÒ¦>¶á Lù6÷ž½ŒWE $¾2¨ò¯e~ÞÞÿ>t"ûx¦åÍ; D÷j+ n£ëŒÅ,"ÃÜM!Jü¥Ž`¾q¶¬ÏÞºoOõÄ&¹fë¶fd¦È£Xw_fŸ9=æÏš§2×ûo–ÕV0zÒcÙlIÂê$ɰá.4 “Á»ž00\Z ÓøÂÝ–>åRÂÔÞåKÚ~@ŽèA6ÙÂ;œ%+®皶%IÃ#,ÅNiqŽnÇüz«ÊØÑ€jÉZ’G¥Ù6€±Á ƒB¶² λSǨ;ÐÅ}>ñ{-]áÙËÔKÂO!v–Ÿ^ã–êÅýòÉ/·ût\»ÙPÇâþÜ|öÊcŠo3ù „aQ @@š†‹A5Ûã:­ÁVåoP. )˜Z=Y«Ýžm¼„ ƒZ.Nr¯Áø$^M€ÐkÛ+:ïÈ34&? ³âvò÷¦}öÒÔÕâãŸônz¬ýñú-m½Ü;Û7äÚCée™Å’ƒO‡yQ$-xhÒ,’@“ÌIRq32 D ˆJh‚œ¨Røjíªsq«µU­€¨òX@ÊL` ÊÕ0Jø¯ÍøeíþŠšUÛÈÚ/3ÒÁ ùgu‚é-ƒH-º(¤ÔóÄî¥csÓ* Ùèç F?¢ŸaCÙGÑœC£sY÷`H×$“ð8v–Å4ó˜L›Az­=°¶ýõËøîŸ+ñ/xóÿ7^ç®)]f$AúÇ.D;¸B ¤ÁÙÊëcœ†ÉÇ]†ȇ^öjRz¨K”¡!Ñ1 4dÌ`XueÚdcyzBE ñìßòìªO¦¬¸,d Š dÓµ[õÝf q¸b1!àæ§Lßpõ?°_ãaÕG/o{éw?ÞK׈N°«.`º£nQKšæá/ZFá°øÔÆc7oe÷TH+O´êh4€»ÐNs˜—]™+Ô]LÈðÁv¸+ã`tsˆ4S’€¢0ÂC™€œxôÆy‡ba!²"‡')û¦ªVÊjƒVU»ÄŸ÷ÇúžÓW|íýß—Ö—/ÒE eÝÜ^z‡¸ñÇcô MÞ¿|ï ÜŽÒGÝÚ¢£>M UÆ aÅ8•@bŽNø€&Xgj•îÒ¯s˜I>È)D¸/sÅÌ -Xå—kýÌ®³~ûþ\èRöR,ÐP‡i@§i@Fb†… Àá´ð€r%É! r“È q/œÅë^9v˜b›aa¹&_, é@)[í¤ZÞư¨$!·f-ûá2ìL²@eÛT])ºQŠƒ1ˆ(BÃG0f|§X߃V[àWq{t î(à.NØI;ZMž‚¹0Mºîfðéãô¡Ù¤ëŽE[¼7Ýû Ÿ§¬ÙBêí–i8¡ôƒ=ìÒΪ,Í_Þþyÿ&ïööÿ9þ ¼wýçVTÞL‡áHF@˜´Eïå¥ÿXü¢©&OcSk¬E Ê"FÖu-¶j[µÊ‘¦`ê 脪Õ’®ÉËœ«hÐSÜ¡ÔV³3à€dOÅj%öib¡KêEwÈ”}¿m\ŽáC=?áã™æfßq¦“p©««! BCmFug×ÍŸSÿZ¾H’0óv¡[:¬µO„ZzðwÓßîÓ`ŽÝúëˆ=²ðŽsFj âšVÄ(• ¢$¥ ÿ-’È'‘±†bŒ£.±“ˆ) ›òd¨<‚mV¢‘FØB˜2œ†AZe†tŒ9R Mrt†±¦Œrjh:Ëz?$ÏÿQ>oÖSæY: ÷3çb%UùÎJ«À±8lOZ†Y\ŒnÉIùN²¶ž%H¬uô¥_Òž}Gë òÁËF­­]£u¸*õ>'óUÝ·ãk†tk]‚J¸Ól„*d«Sw‹ TOÄ*Û?j‹(¶Z\_–ÿy›Š‰q†•iÙ! ²i`¨õ%Åmr ÄJÐP†ÚuÄJÍÔ‘B¯‚zHUo¬z ðHã¶lS§ɸYµ¥P>Ÿ­åVc1#šåã‹9+}~žp\Þ¿Å?i`©rßþäŸ vï;qº{敾é,Ž7¹ÏRÝÅ[ëéåbV´»ƒµPýPúhY–^Anâg™…¤lº–Y÷|ËÕ³¹°f»0ª½)÷\{v"èj9»„ü*9\LA†bñ”ƒš^И\ åh;öß­¿&8àu¹-» ô4Q ‚8H,F à +¢…baá®K™Ä(uU¢¦Ë{é—>J^i¾ìÀG7z`1›}d Ä©©“tµîEÑìì”ô鈛҇f´Íˆ”®pûHûÃâ{àš©·Mú¾Nï¿Æ?¥ØOfÝ ígG[Ï·Eñ¼2 åyK%ǰ¨3ã¶›ôåÆö“¦Jº¬¡óP½Ùn«Ó+8­—£&“R;èKÈmú '_/kÐJZQ®fz”ŒA‹­-0&5* sP¤׋ãçùß}‹ïC2ÓÚ‹ç¥üËnðƳûum™ÎP{Ó¯=ÁüÉè܈ö7ôúŠs¯÷…ó¶úœ *T™Jƒ-e¾›^ˆ/BCƒß á}ÙíàLš¸ñ_Îe®fâë£öŠ Ÿ(¿A^TÁ¢ˆÊ Âš†xQJËpÚî›— vƲb'‹œÅL\—ÓŒBÑ‚7€ï)aúYG]½0®e×ú³6c`µ£ÃXx>ù ¦êoå¥9"Ÿ_ëG³Ð ‰ €ˆ´ÙóOa-5N÷‰e6•åÚˆž}æ°êcæ‡CÁ)o‡Rn>?ÎŽqQùÒoß ýÓ¯y·¹ÞèÏö忽VZ 9îá›QÚÑœÂWï·O.ב]T¨S`—qN“7C*–ÍKZ’º4¼^UjE‚x&…ÔÖŒB'C«13££¥Ëp5£ ÔˆEßÈ•¼ÿ±DÔ’É4§ßC7œó¢¸¿[Vc8 L¿7z-¸Ö#.Þ°ä· rþJÖåýís÷úËÓÞ®ý8l]®— î„ßâ—/Ÿ*éhw<Ñ—œ1zðe^ÍÏz>¾ßú|Ej½Êt KÛÇwÈš*Ù÷1¿;š9Èæö¨\M]†béf[¤€o„ÄÈf%Ô¢Ps+è´(ãRÅ£)­9çeîUê¶sÚ0 YÙ%ZF¥I¬ µèæAÚ˜+¯c;»î"´Ùb2(+† R’­TÊ!t£?‡ëŸÎö‰Êòk8, UVÉ×Ú‘V$mƒ×€@I©ìiR£óW7¿î¸žr:wêZ¯ x•˜©ÔòëWï<ÒÇ£~÷Ÿ=ræÙ¢œóN_V÷zþéë¦/<ü¡óztǽ{|åý󇓎vʯ- E€¹ŽÐ¶¦‰\ÜÇnTXÎ|ªðH) ƒõÊ;[mÃÞ¶eð—ÿdwvÇÊYnE8ˆŠý~fZÍÚ mÀZèb ymìÿªÿj×ÿÑ‘:3 ã_X—I×ÿ³ÀÂãÛrÜM“0tš¬.ý…nïsk½¡8Q8¤ ›'§(¥†™”÷›¢g9‘èY0ŽfÁæ8àBwé hçsïßL5EN¾}¼ÿFÏ·’?Œ¥æi°þÎm|2½]½d‰õNüú:_.<ÿÚ} ¬Ö4æ¯ÃkXŸ6 ˜Aú* qÒRŽÚuéÓž]E7‘÷ˆ ‚hÒÆFVží‡@L1 ¯b¡ †ÎÀìeÐTÐ*_ApÀ  À¢ ƒBÐÐêíþûþ+öÓGœ~úâÐÿþöæöÉ>wªàØxþ@>¯¼ãÅ’?ùêʶæIp¡À”%%@×"„ È•8ˆ()É&%pLl¢ê1CcfÄC‚rÑ&1‹ý!xÜÆ÷¿x¬µ0¿!¼Ú7Õ'ÌvŽÏ›{Ôöv%+y±Q2aêV¼ñÔÏxmé½h#¹d§ =s]æ =ĆŸ­™Q,ýÄ£æþ-=ÕC¬ñ¸xျöc] Ú:q{VøG:76ˉ`5¸cˆñÀ¯nßC¾´ÒR¬(ZWHÕ›øLüõ€a8”Ãk‚ùÃ9èáøFK$¿ƒWv"ö¡BAuó|öhsêwÖÛnoí#Í¢x¢g,U¿hõЂ©èmlbÈ=ºT%CÎröúxlm»q±Ÿœž ÐÄÁu¶¿UÛ¸†> QèÄSm-mïùqüƽÁ™Ëç~/´÷¿üÃu8žÖ$Ì3¢Ln‹¹oT`…È£IÀq¨dU· T‡²á´bô[OŒk©ŠÑ°EèÛÀí¯Œ›†ˆ¤Ò¯¥„RFbÔ3´GìArñwû™ßÞŒSþgûV»Ð>”ÿ㦟°P ÑY.$²]Ã=‹*§þlŽr>ˆ+¾þîýÐ>Q8øI:ŽDX -û•=ÜÉ¡Þ~|áöÓ•~%×$ó­þÒngô9÷.Áa „" ©ZžÌ»~ÔY"nµ p,CÕpùÑ%{–¾ža]¡­?™Õl³8`=LJžL·O×c(¦g¾î}-HeÀÂ"bqj8QB!’O֢ʃ•_é ûèÎrþöŸÊú• šÓeDS!t  I—„Hƒ @d m²-4MFé,Uêv ŒR˜Lʺc4¬öd "¤NÈ€rSHX§-üKuÐAÚøo¬ú +´±»Ñm†§âP”èƒ&pÓ ­þƳ Õ…ov˜öýƒ_ºž]zd8Ž¡õ&î­qœoËs¡àÑÀ!ˆŠ}Ú&_àr 2©¬ m¸Rc¹YIyüztÛÍw½¼Žr´6žÝq§9„ʳˆsÜŸîGXð ÐÒª&\ »æ™®:‰H¼L€%ç=Ža×¼Ä#²Ç„ª:@ŸMùÍuŽ“óêµ87ÖÁ ‡ô,XÜu_ÛAÆtefyL¾„íi¯“ì/þèÁÊG·«JþdO?<¼+ˆ“ å{ȺëF¤R¨™žà[¢‚³žáY|sÂYBFláÔ`aÈgÔe Ñ3¢-ÂÐ-÷˜ƒs´E×ÝeyÉÐ=ƒ^uÅ»=S!ˆ‰¦a2†$m¹Ñ"Ѷ–]5€¾¦™¤$`ÕDgav¨”Ç×_ãÕ‹Î?üWëÏ—lM©¸ ¹y”³‹¼ŠgÊHŽ®^ô¯.=ƒ¨-“EB|.Äx‰Ñ5»‹5e°ð)dœfωE -!Wbh"lª,ÍÌÂʲÒña^ ¯|N%T¤îòÔ‡:«CëЄRaÄ€\ b©<åÀv—› Xò2`Á÷e ÛRJ¨¤+ð;—›/o¼_nA#pŸØÉ€)$!é²”É`­'_ °b£PàÕ‰yX€æëÝj ¦Tª€ìˆÆ ŽÚÓ\eÊÔMKJÏjÓì %äUï`à N½úlõUòC£ÀÖ1Ac8n3»/IëVOqë±)EJ)epÙcY>FY¡U}¥¯K÷ÒÍøöÞ‹w·}œ“Æeù pÁˆcÑtTÑÞÜú‚($ uu­³3î¶RŠ´ˆˆ5‹Ö¢¬Û\žS9nX#pQ8†²¨Õñ \{h®Š"„•{ƒKADÛ öã·p99Âb¸õtA6Äš¹›¶gä/õï5%¬]:«‡¯ý ïó>•/8Ћ1lT,­mg"lˆ¥gç1Ÿßó—)jï‰Ü<`Q쀋À.˜•ĸ–€"ñ·êÿ%pM +!N*-ëЗ Êà 0³.ªF5tLBV’£3QKÕC .±ØØ”Lª˜¦8ŒAçø–Ú‚ ¨ìtZ¡’D6‘a;h= °æNÄqµ2þ"ª*Òe`åÞÎ*¡ŸØ—ï\m57›…t²WbrC~ u~Ê|¥ö¹?ê_·×'÷ÕçÒúNÏgŸ5i8À—!—ENf©ÏÁ3&w¸!gÅMôK!VŸËVøŽ:Ö˜¥ê<ñùÌ›ìÛãü LCxbbò&>¾IBË…/ù¿äZ55¿ z:[˜¥tZãk7GeÍ{'§°Ü{œL#ôÔúœk”¹Z É8âo{#…h³SFU$ÃHˆ$£æU¯$G 3r£`þ2µ/„­‰ºq%$³Õ„cÂ,Æ^AÙ7Í®d÷1>qö ?ÆŒýõ?o[¿°ðÍ{yúØ­a¾K ‚éÄò÷”–=ãÏPɘÿx;«£• .3ãÑ\Ÿ þBþ:°oYÛcÓi$k¢-Ö¤Éðð]Ê>=žÉ¸$Nð«fÏ2¨ss»¹/ÃRºjíɾõ”ÐIkoßüø ¾*ÀËÁ@à„]îA ªK•At4:X!‹Aáø³J¼’ÊÂ@=–F@?£¤<øÈ#«’x7_jÂÿW«ÍJ]’žÕÀÆ5”ÊÛÕ@±ês¹õÓ…#q˜Ïpã`refì%ú{°ð‹År®»UÖÚô»ØËG;·v×ù ßYâhÔŒËÃ3økÚ–’¦ ,5jâ¦wäž#*úU-Uˆ ¯¨­yÚ–Dëñ”áЂ¹»ŠIBS†Ò;ÇøÀn°8 ›@’G4&;b¶I !Š ‚´i“??o?ŒG6oWk¿‘u©}Ïìöxê¢û?ϱfš›qmýuÉÙFLzÜk¾½ÿ•ÁÇZÀ«‘ÔÛS”t¯ßìú¹T{/;°Aø²3ŒëðqH €ÂþÙ?¿ù_êà¿È¹þiÎσ?5xcåSò“V^¡c™ #ŠDÑ&3 A'v ÜÔ ¬xÆÂr-V3}¥P„$ í«r1‘õ»±ÖˆÕP¦b+DØÈóej„T÷G®Ï\W ³>¼9RCD^ÌŠ& À¥ÄÈšŽ/´ÄÀ ‘:¿\3Òñ{Dø:y KæoýæÓ`Xݯ|ákßÎX½Îç;›sß^ëÛBÆ*ó|_ª~ÎÞëüŸDûã ˜w× ‡JÚµ¶)üäÄ~ @¤ÂŠØvHBPì„?,yõI÷bdÜ#XÇ×ÇÎ_²¬Ô[så?”¡¿fU›¥†[ÛÆ®s9V´#L×W‰]cªG!ô«Â Àù ¯OS4Æõ@™¢‘ ~<ã¿í“õ_¹öoÿ¦_,ÝNjíÒUuÈÚÜ`4_zêè«ýŒòÙe} Ûߟøùí§?ë˜Åæ³Ä¯8ìÕ™ÓŸgy20ï®!e¥É9û(˾ïã `èAu#ª¨LU¶ZÄWäuzµK-Úuꮿ22€ˆ°lîypÂP-Ô‰è!£ D Œ…Ösу5lÚ­-Óg7[ÀÍÅb$+ˆ2+iµÆÙ«²+Lä5®¬§Q$aìv ¹vUÉãF—¹·Qd)àô¯ƒ†´G»Dõ|‡mv`x^ùǧ´òÌÀÖcnç(Íï~P%зÉLBµ^w;ý‚Ã7OnÍòRÖX××þæ "ªÎ¦gÛ>Lèu`[ˆf8|†ÙÕW®¨S0£!ía!—“ÚÙÅçcôˆðÛç|Ì=Ú:k´u¸XÃô²ÐF73à×Z>/Qçã™§P‹¾ŠÎö× 8â'RWÎÏ·µµ×JÙåægûÚß},¿ðô·j}Äád´Še5/‚Ÿç3ªâç’s5Ž‘„5«˜Jtàƒ;Ðgz­ègÿ+}ûŸívõxz9â=dÕ<׃ôx=»ÜjZWiÇìì/® LÀ!ÏéT‹’öcê,{M{TÌݸ'}‚MˆÖÀsb²ExÌëN—¡=´j?‰@¸èk1 â겦a õ8Ÿþoðÿ©9ó©­v°á‚ÐM} I¢@dëÊþzûeŽèSiW^‹½4ö\üÌ1`žr¼jë}Å{|í44u{þàöñÂ4sMI'R¤°™ ¤t(J†¸•$‰!4Êót‰l£–.*X‚&8ʘ¿ÓÕU›jʼn?›y#í/~êo¼ÕÊTûzfϾõ c»ò¨‚A«»à¢ZF®üæëâ·óËh™¿ ôÀú…¼ÚYýB šÜ­˜žœ­£}?FC¿?å8Ï­|þ8‡¯ ?â…uÔ<Ð,.Í-pv1@ Á£26j,ÈH¶¼øfåOãžßêï¸ó Æ_m¹»›¨ÑaÀ€²ÂKñÅlÓ"ŒRD [0 À±[õ/åÐ:†}8w5ËÌ^šdŽ27éŽòˆ]|Vh>üÖnm]c£vwZˆ¸rœïG1’×mKS‹M%ޤ¬†® Ürð9£í˜ÎGNìG/fìJ^vöÝW¾?Rü¨]naf˜)Ò»ÐlZÐIÔ¶™e zHBØÇ~¨îÊzE÷2mJ¥)~ 7) E³:ô ÓF"öÃzz[T’öF†jù”Hº&#Ä–ª^·Ãè¶¶IÚÄ3°' ˆƒ¹¢ ý˜8a$H¯é (#& ÙÄ  áP‚ù«TVS¤^fþ>[ãeV¿àÝû×—«¾/xyèöˆÓ«Rg‡öíÇzb›Xä 2°?È£éGƒ/¸!(¢Ðú¡ôôû]ýÝn>ü²º2&N1$¡Ixm¡Nè_¶ÇG²}F‡6¡‚ŒÝvPü~ðåå#§šù,Hv„²‡E¡±‡²E.ÄžÁ,E ¶±ßíüZ™ðvö“ÙA5 DdžÝ1$‰‚ õÔ H`4Ú-³çVšLQ`€!¹K¥B4P3²V-ÇÉ0©ï2±öYΈ»ÖÄ/ÈýC‚ÿPݨq)…c ¹Êô°$ß5½à”ñ|´ d ŸÜA½\Ò„SWǃÀ’éõˆïà{L{ÌòÐÁî&Á¤£Ù OÉ$µÿÑ~µè‹Šã¡Í3fèÒ^ Ü%æ/lú×½Npe0xÇõEþSu¥÷gæ“IÝa³¬dtÀ\o_…M1àC+Ï%eÄû“׺ôн¿êôéôçïþø÷ߨ_oÀ¢#’‚Áˆ)†)ú=y«a«ü2¤â“ª¤ŸK…å5 Gˆ«¯˜(+Š`&,…(*ÙâEØ÷Ó{‡‘\xj©Xá¸1è†&FŸ/=rËïŠlô ‹Tk–Ÿ.Ù;®À0›à죮ê±28 OCEw™1e¤Û< II´Ú3œ(X ØÑSŒ‹?ŒÆO÷|íâ­×>ÝÝ„‰$g.czH Z;ûÛRÄ·ÅB];;(„2úêèž|KI EçÖDLSÁ\ñí a Wø ÏÊË :ŒÃ¹€ÅȨÛ¬|«j(=¾Ó×…ŽÆHb‡Õ .uÞ‚4y* ©‘a¦NC¥ 3p—lU@—¼ÀŽô䫯®LÅ,Y5f¯ sE'IH0n•ÀÃX˜ÄAh˜0Ô½± c¨ÙOv“gh^Zª|ˆBD$@ÄÔUwxƪÕÜHNg¯Õ1ĸO+sç²óäK²ú†ÕØi•*Yôƒ?Û=¥§Bè‚« b¢oZÚ>™é_Š·pÄRŒ9Ç8 ¤¬à.ñÐÑ(3Ƀ†xtÄ.–Cí´ëé k™eÊT§m¦7ùd¤y"¥ P¶%éW¡A#aZ•Ömlà–²¤(Ê’ˆk<[H=¼:ÌÎiÁ˜P‘`]¬ª&Dñ,¨Óþ"pRŒ9Ϋ|2qΧ2â©áæ©dÞFžŽFN©=ðKVýqýýóÇÝÿeÊ¿-åîÜk½PE<×:Ÿ““âÀûLY#+¡ùx<ËA’8¦•Q p-Yd•?Í(€‘5*z“Ü ­·RKi¤ô#q:kË÷3¼+*ýÚoŽjS'š¶öñ ÷NŸ³2B}´vÙÐXís4F¾¡›XÞ¡TË©·>ÍËŠ`÷žïgÙÏ›¾¹¿Æ9-O°¬?•èü-oZÆ—ÍæÊ¡X¤³YªÛ§ð"+ˆ±£2™]á…жÓ:D»ÚЬ+¬®°Oò^à³F†Ìî\›sMÝ-ZÚ‚mw%{Z(*œ½¿›Iæ”OjRód¶õùò—‰g4fÏüç4ç˜ãTt‡XE9[Q•VñEòD\ß ÎÎÅo-¥0ÂBhEÐV–å¾Å²Wj³|co¹ßŸÞÜOçßø5®‡û»ãa¡ÅÑ•PIT`ʽ[pÉ•ÜzgZŽB»†0žö±®á<“5§í ‡#*¹T‹‡ê2)ÝJ«ÿ%þmŸÿ\ñ§Ìi{,Ý©Çî‡õgÆx={X4nâBçaÀþÎÒŒø¨±s¥¥A¥T7Çççi âàôÃã§ŠÝž\Ÿ‹±?•n [@-9ypÊsÄÉ h¹-¯»Ë¾$|J\ë¨ào¦WeC>—ÎqÂP,¾¥+­CχC¯rj°a !tÜ&ϧŒlZ´±â¬Züóy¦É›ÏÁûÌŒÛ^Y¡ôåêéç!ŠhޝÕ/¸_eÿßôÛÿæ™þ—çÑoÓñ›&OÁ@ÛàW`ƪš+¯d_ÇéÅh,¬¬Utj*kÈmzب–£ÜOåìKmÈPƒ+­ØvmãRJ™Ì{"à_[¾øæ¯Ð%˳5þ°Î„Ü·tÔ ò 26i`(Üú4S¶?\k—3-G“6Öyb–ãÚ£úúu_ùåËÛ#èÉ_+uÞÎñ sz÷}[oÜï¯Ú¨þ¶¯#‚c\‹þèõýæ÷üã{œ›Ÿ«—åÝ@QdlF×~Üï)èéñ©íˆËÎå­tXžæû+~ñöà›¬–¬Œ>sùÀý^cba&Ú%Å)!à … 8¨£ðQŽÍ61ÈL‘J@°ÉšNt’žI˜ò¾iBFr$úi)Œ\ #ËhKÜòØ( Q±€fB åòÖ¹¾òÏÓòXõˆëŸu^gÂ6ô˜‰ÿÇ]Á†ðçC'®Žô«ÃMGÈUißJbV—óxv÷WÓ¶ƒãS­ã²µ=SË"îÃ["öøÓ>ù„Ii#— Žm¶Ù#›³Óc$¦wm!ÔØ¡…|ß\Ÿ„k“/üêýý§ÉjMpé+NRÞ-òq]é`$¬w÷5×G½Ä“amáQÛ˼<÷Ýí¥~Ÿ$jì¤NmʺNg×BfN£Ú’öN710TÆ,¼ší4^)ÐX4ëŠôhÃå!:? œåUÞw°–góõ¬y‡IÏDÚ!Òô _¸÷[v¾ó›ÁØÂ8í€&ñ~”Þ>n\:§Ï‘ÿ2þ… _±Î,a}UÚt¼mxamö¼Ú©‚MPM‡rŒIu€Å_XÚ1ŸügØêþgêçß¹]^S¡ ÛOZÁúCh©_ýú˜€¸ ŸÜT®ñ€¯„‹ïé~‡@EEÏ äïÂþ½ø|Ú '¸B¶¼–Ë«>_Ý/DaÍŠ<m˜å ~zzÃß­.xF$¥;»kS»âMD&‚v±TyFá…DëA­©ðدLøË‡ßë5õW!Ã(Ê@Û,F &@€Mâo HœÐщ5éø‹fIäWT~Í=7)óÈJw4 ¢A’P••ì–døœU~ȉºt€Q¾ Ù<Îi$ýÄÄÃáàKv—hÈØì1(- Dv Ȩ<†6Íï⤯.ûÛ‰—¹ÒÏË¥¹ÌŽ%ßyÞ‰#;Ñ~7·R—Á}XR¢à¬Ÿ|t|%Ïc• !>»/§#”ºÆæû(à1ªGà’ŸÉšG‚6÷vjouPV”‡9_äv8ª8=?ž·:ë‚ïÿ»þß2ÿï8Äô-¸çb6êë<ÚtÀ¥¹5vð̱écå?ž¸úãñQsú†n/ÑùÌOLÂPPDÖop_°|ÓüØ0’ØÝ¥ÏÔÙ¾ýn}Êš–’Xàh'&§²E0ËΊÑÒä4á{ä?lôz}'rqV±/Ž?eb)é…62§C†é‚‚deR .£@ODÔˆíA>há+$ˆ,ïFŒ²±Ònn´È ^è‹b)\Gúæ"º…U*’™¯²’ôu.||À£Ò°<Ý£*¥Ð²Å¡€`¾"Yüpaºp7⌔C_ädGyòxvÛÂŽ¿¿ç绽±ÐÈhÞÃQZÓnuP‰)…O”¸–ÇõÏ8ÿGçC ½06°5_ÙJØÎÁׄÏ—õne¯ÏÍ<\ IÅ:öTcº ÀÐkÍCjÔbrq~%xl} Zc}\sx`b«m'ÑŒ‡) €d\¸Qsln„7ð€„ÊZ3{Ÿ¿pÎ2b$×£>ÊÉEÕ·îI6uëT¨ªõÍÑÏ5;\Rvì'pL-š7¦ëõÔÒ`b£›ø»DGF‚²J>™|éoö^šc©Á¤E -(àÚ9öHV-Öd¦Å‰„:’lŸ?Š÷»Š£=ÊÍ,¶ëªpvÏ¡µ#‰À$TË_UP £.hZ%¥¹Ì¶55šTË[“–¸"r)rÈ!DÈsœ›°’$“\‰»‹tŽ!æ¨ÓÎ!)±¢e½'sÏÜün…ºÀ~1gu>aKÅqíõûÄþà›vÿì´ùsæËzkEü¥úÛX&ôªÿÝÅ¿W–*ê3W®#d(è¯ÄÂý2mhô|Ÿ`îôöû«›UŠ )1Ž•ÀTcšA5BE#Ï‘hiUX„$X$u€% Rˆ@iäÂI+j1Æb4Q¨\0DI—äµP!T¦¸(C¤’ÛD6lj1¦×ñt€ÊA 1¦€@/`K†iþrA%#X06Ê(\J”‹X.E³ª¸E[õ®!‡âž÷ ZÀ´8ë–¬u'#ʲkÃŒ£Š”iíT¿±i^< ÖÆÎD¨yŒ®Õ§ ü6ë_ïÜ¿$¬Ã«d©‡|µš 1Ñ2½¯Õ¡Ò}¿»]ËÅʃ8ØÂÌ©RÚ ¦‰dÓ ¾¯øYѬc4RÇûÏó”•›~î¿ò+ásR/%xr¬OåÂS` Ûø -„Hå"2Ã/ ·‚{=Þû2 ¨“<¶Ø6jö8öaž­®Ò¶n‘k;Áž—w¥MËÅqºÇáiñfÏåÞ/Ì÷‚ºï©!Õ¶ôDš*ÊH(vu,â= iyÙ’M‡a«$%péߪš—3%s[{8óÞ¬…hdÕ·_ÚŸ7ïÏÿçïÿÕÿÙ^ëŸoïó½;PÂ(.°X/1ò“òøÑ-¼¶žü£ž¹¾ß"aâ2÷O­¿òÑ>wkR‹Ò*zÚ¼u„ :ˆÌœ×}þ#|=‡ÿŸbÄùµý=©ÖEõ—ÛŠñøì0R“@ÊòpM`§JJ1¥8TÁuÓcxO·ä'g]‚BG©tÉëf½ÝÉÇn¯K9G¶ÈËD¡[Ô`³G Ð:j2¨§4Çg8I‘>ðˆ‹Z®®{]~4O{n­±Îâ퉆c®9t#¦yÏ$DÂJ£Ü›ä @µ7©<Ðpä¨UuXy%0ŒŸzÐõAàË\â4”à¯huE#ðcסºèVž£{(Žª6´hÍ|س'÷ùúl_Wç¼½än¹´¦tê!=.Žc$’ˆ™övOµVsǰß5û1äðéÞõkQµL_#¨ ´ÅU÷<gP0WÆ~Õê’ÚwGÈv 2‘[˜gÃo›„`m#SÐ,¢-«ò ð›ëI) H¤ˆkòÙÌy59 ™¯õÔµWí 7 Ô IŒ8Þ|PÅ)À‚0àŠ%íÿ϶«üèlë/Š/òú-JÂáU³Ùù{m¹_Æ`¬‚—÷‹íý:•ÏöÓ?îSyx%'óCfôý `>0bi’tð½%c¡àÿoþ¹µÿšÆUc'z>\ø”…¨¥FcW"FUÈ„†m¢(‘Èâò]Å!¬Çr(´@†Ä@fYR¢j… –•24]_Êi>Êq³Xrõµ/L|^öÓžf&Zoóúj^Wóé†ßŸë¬îZÕŠHÃtÂÉè) ‘*:ƒîÜ9úûûÿÂÆ·&BÒÜ“þ­—»R7ù7uÊ"=—é¬{ŒGûÕ˜{áëß÷üø4ý§ëø×ØOŸžÿ©tœ*ëÊ+Wø^x nxË:ÔbÔ¦ÆúæaËnž( — ¬€Õy:Iíî­gŸúcÒtM°þWóÌêòQ½¶©ã‰¿,âRWÂÛž¡+&ñ^²óöÀ5K\® ŸM'Ò·½\¤U¿85è·ôOƒ¯›Õûð“~ é½qhù*Ã=níœËç›\þ†?"þØ$¾ûNÏåÊþýGá¹|>5ë‹'Ü:ö×âֺϯê‹âÙT_‚ R¾?“îíT'þëìÏûûU¿¯õø_öûF÷½Z|øôòúé T;?mù:ˆú.5“3±Œ0½rB2±åžË˜±÷‰§Jm̽¾ÄÂLú9Ï8QFQz ꄦÊ8X'óœÇÌ ë,ó^ôÛQ:ŸäÙµÞZ{4{ ñ{L˜B)8èC6™Öj(˜]ÚãÒ8†ÂÍzô¼3´VZªñèòÓ¦\9GûwëðÇ*pÒâüžO~;‹}¿ï1ö}~tõüÃçqîãóåŠð¡¬ßˆõMØ&äcÚ¤¹D §ˆ2!6 0-[+ož±³÷FxD>±ôÖÜ r Q 4\³Ö?Ç_û ‡,W’zá͘ Ò–åvQ$"G¿¸ù{ýhE î¾Ehò¬ÞZ~ùt~CñÉ¡úòˆsÛžLƒ«ù<ùgyïNg®qî Š'§Š¸©ÔZØôÊ}ékò‰æápt€+ôÝSýqx›]Z²¡AÜíÄ$úô¯8M¥ ÿ¯Ù΋0æÆ<øó‡ÚgÞY•‚ÉðQΫXÿ›ÝŽqF#š¬Å4d`VsØéÖmZè>¡ŽMÆ‚[LÁš’AX&ÇÐ`aM´¯+qÍo#q*‘¾;û&Ïp­¥‚.ˆcðÓzùû_ïý­ÿ¯¶_ú5?ꕛݨ5u¹£õ±u[ã™ø¨òÈŽŸGt>%ŸÂ«³Z2ýoð³éCÏ“²b !cªËH¸(¨•˜!ÂXÝ$¬ŠéÂ!i6*¬°C‚x€kùƒÝµáÏž!¢ñÂæcë½¾}OÈ?už›ûo^ö¯¿ñß^¿6¹èdr;ëoÎᶵݯg¥Ò”küþÏù0sÀ¿ö3Yèö\Ó}4Õ´QÊ•½4?êíU?ôYí-gù•kåG9A&RŸ[úα7îBGaOoÝ«ÿû[¾¤‡?qèßÈ¡;n›Ið` ¡-”»7½Õ®ãd zJpõJÞà²À5ý‹NAU ,ö–€…ÄOòZÞ¢‰š™ÈËN=Kê ßy™êp޶iÑÃpü*(vìÝÇb5.’å©/yŸˆ†¹’V|‘v¨'†aÃÐ!ò•-’‡Öw½ëb}!ýIðÄ5ÖÊ=]ÞØÞ‡æoìGJƒñûÜ ždÚüËAw˜i \á$Hʟ鳆ŠiËÑæG2Øcp^Úu‹ _쥴չ_å–Ù»Ú:qÏ&*û ø˜ÀŸÈêSþ–\… Û§âÒ:íw1)ßGþ¸ÏüûáŸ/“<£mØh óìã*³ñ=˜)‡£A@CÑh Û3’f'úOlÆÃMvy{Ÿ~ õÌù­Ÿí[x7¬ü$ ùÐÊ,á/¢]þÿOÇ[ìH÷§Þk²À„E€àá÷@Ó¿¤µqæcZG$‚”uQÖÏJŽLý”MðDvAL¢ ÐT€½e TûHÍ aâ¯äûKÒä°£œŒ¦ ÓO5`yÕ J²g.j6uÜi„bÍRg¥ýK\»høÍÛö$­ø‰Õ¬ñz_ƒÁG$‡¾‡Î‹ŽÑŽX-Ëç~Uvd (ýÀ/„§ƒÆÇ\Wñ2 h<g?ž=76þ€£TXÀŠªH†Ïh à“ðI^&ZmÛãÒ:užjíð¨_N±å|ƒ®êÀû $wYîy‚H#~¢$¡ ­áy¼<¿Þé§7u¡Éßù?vß+Ü;ßúÄ_}ê[ÿ÷ï]*´Õ8s=– KA‡"­< cõ'ìÏÝcú¼¨ÁÐo¥=÷=îÑ¥‘cpu†DÕÕ‹f¾ö5±¿½2Ë9»?üñ¯B˵³dÈS¡ jbÔ0ˆ'xAáËn±_£™ÇÁs<ûÑI’?3Ùîv(r3/+¹¹ÃWë8n¼g…‰„lEÈ\[ÏÍŠI5…¦Ç6#ñLÒéаy„.Å:LçÞNÚŠ†¶* ZP…ŽÐS†ó¨ ØDÈ9¢\`êuPÏÓ|î¨í|Nª(•©—´NÝ[d*è1P–r¥¢H§ÃP&@!Ð5Œš°…Ÿ°H$(›[¹[þ•œ堺oßÕ[‚9žºÞ“þVÍC½þCï¦S§tT (Žé¶t®$:ƒ|nh?õ?û»ëO ØÌµ¢6kE~*%qèº ³ÉaŽ'Aé¸fQ)êÕå×30±ÒŒ«b¦'E`\P¾â¨3“4pQ.xÅH,u>Š5w3³f¥9Ù0ñQe)fq9}…Çûì×’! ªrê¹uÝûEÛkê‰üM9D ªëOô¡z6øúø ÌÌp}†Q+‹ÒÄXQ ؎·ë›ÞÌ*¨ã÷= D𬓳k† t†f§K© *k­¡%ò\3 µ\åjzÊX‚–>õZI=¿&ו§f*jó“Ÿ   B¹Í/P䂇Ǡ§*cV8«2#RiÈ¡Fƒ„\?2]üP!…Á +ˆAœ%„ƒ¥)PŸzT~Æë\R—×/?ó<ÒyS0ƒãZá&÷5\ý0÷^ #¬Œ¬n¡ÿåðÿïµó¿<Åï³û²ùüé2Jì=z(tÐŽ‚Y㯱ëŠ$˜i½ÿú¢Fý”iy:)§M‚-NjÑA b\EYš½ª JwqB¡JIœ$!› m‚A‘¸•Ã꣢ï°'‰ <ÍCVÊúã×¶ŽÄ[´ñAW™ò(^+eÖ<ªòDP]i BhK'bË] ¢µ³‚…ý\ßÐS‘˜‚@($Öf 4@Db… 0ÑÈ— ­ŒÔׇžIýQê;¸ÝíÖó0<Ç)m¥Â+×^辺sÇEÌ^-}ÊêdH¥Q "¡!D#P FPåsØz”µ²T«Ö¸ Î6üFõOÀþ‰®$æ5¨0'5gd¿+*²n‹ÇÜÊ—MßD›\ôžø`FóbV°–º¨Á]Úu‡l ÅdÔ6þ 9³º8°X65‚–±!µóƒ#=ø-¶hujv1–, *ß•uÒ#9Ü *ÐA·MžôýínJäg⺙ö `eUS¨¼¦ÔϾ¿· æê†åô9Ã7æïúÎÿËþÍvñ+<ê’g˜NhÖªÕ±+º2h¹ÙÝ-×<ÏxUº´»Ö@кÝõIV=—;ÎV5|uŸÏ oóz²¯¼2ë2þòÿxýgnßþ»ÿø†ßû»¯Ó Íä`ŒË5OL˜Ý‘ïŸu^‡ßýèòoÞíó×Û×¾žÃ’~NUÖ,û™=Îw’«¥NYè¡k”%0,µÙ¼+&ƒâ…6ÿå;Š/ $¸.ª{ºžó Sål• ˜hí.äl°ž9ü+ÇöO½õ;Љo¾Çð]ûnÿ(R—(´F¾³ÖÙÙÊø˜ê»ŒéqÑ!p¢Ú6å*^x‰d&ÞIUD”!:°GÃJ7à8kp™õí{¢T·Ck0ʨ‡¥øõ‘þ°´2ò¶ò=¨=÷ï6Wó=·ˆBfA^=4h‘BH‰®À(JøËîýeY¿úMæ¾ ø5éÅI¹AxîGìGƒÝ((ÀHݤ‡?%éæ +ã%Æs !&ˆž¶˜3uT™¯Ô«J ¾c˜§^YÖ§·½0øˆcaÅ ”ˆ¨jôÅ0ÝrJ¡PŒh™±×Gv]^ÎÇŠóenßèã~’×h´=ÑÇkÿò:øäÓ«P²¾Qïg7z˜`£ƒq£Û£aÓ.Ðò\t©>yÂK×Ä­jT?ʺ(Óv̉a¥Gv{zðói:ÝâêxMh¿t]/›M>¨ОLûµqïø,ôìaœ„J‡¢ÛíL¸8‹‘ËÝ‘“z¿aûòƒÖ¼s}Å¥èájÙAåÍ ý ‰®•6O©9ŽRi|X¤Å=åçOå_nán©»ôƒoü3ßünþ6ãß¾Su×õ«³PèëýßðÎO¿8ÿyÍÿŠça²Šlá•WŸ¯©ë¿ñ½I¾C”ˆtWþì|yFùnëŽÂB-ÝÚ?7ß^”¿/SopP^UˆFÕTÑC+€"1cSª,À FtŒ"×Ò ¨0™@$Ô’ëbçÑˈÓqaDær )$S/(‚·Ií.£þ¢$1êqzJ55—zòËQ‡!$4A„| ðEq8YŠÇp\—ô/ÉÞ‡°œ¤Û°ú]ÄcBÈ…ç }óêvùÞž [=ïö‹Ñß]èú]7¿((æYŠ93ÏÒ:¨¤ä€a3¹ uÍœÀq¼ å øØž8 îMtÕ–A|nùp`Ü,Ó ]Õo”Vÿáxííx\uf2›tp‹m2JÏ›ÿñɽžkfUƒûœç꺰õá#µ¸¥ŸRxF¸}|x^ëa–‘õË{ s?¥Ÿ™þ¦ìí.ZñÚ¿Ÿ]7ªÃ¿r§A?2Ÿ~wå›ç×OÈ3î/IþbËþ É@ªÔFq¸”p[5_·ÛYØsË5þ=Ÿ­ŸÙ7÷ÏuÕõ¨ÒÁ9ø~hþù™–ÿ»q|D5ܘ]颯<¨óýìøÑ«IAˆÕIŒ¥ ²$̈.Æ@E‡ÉÀû+§—™$mÀȃOåaùU'Lý/%þÓ¥ÃyÒí¬¶¹ÿ”é[Ÿô sÿi_Äî{ËsÄdȆ›,7`¡¼iæ5¹ŠÊ õ¸Nçtõ­N™ivÓ§&YwÓ|[n0¿½]8S›S«¸Ï¾µóvûïÄ;Oíx·ðõ}æ÷ÿòƒïGJÜä‚“Ü' ¦ƒPeŒž,Ã(½4ˆCzá“o¯êHú$ç…¤ÔŒ?RThû?ÄT”(¨B2yhP *d†Ò ò°" ?|%wC8uYãÌN†£V+µÄ 8~o«Å]ãno«ôÏcPSïÔß>Vª ð©¤P3ñDèÅ%·ÃÒ¨azu¸ýê× ˆŠóp.;\ÍiǦKXXJÕH‹Ò¢†…t/*¸ˆ?è'¼–¾D/5p`n¹“f0ü>9èµLüFsY,(v‰CU×Ñoc…‰~ÌÕ¯/ô[².Ž„i #{±Ó€˜@z¾…ç‡Y-ØwÍü…º“03@‚¦·`=5)K^|ý+ú­îkØ àéÙ‘­è Ë)¡;¼u9@m·ÇóûÁ\ þÍ‚—}fë°1wÃl#Ì›¨rr—ô¨”;eØð>Ó”óÐ1zWe™®6Oð÷èF„õ—£CSÞÃÿNàûмÚnT±ôõsŸ~Ž»®70³GF¸Û÷oÊ<®´¾õ¶Üôð`7º¶6vÔA)CyPgkyÔ{™'Ìù^³\Ù£Ú±ô >ØW%E-Ÿt )ùd¸y|MßµaíÔe1Ù½½G­¦ÉÄ>(xw,XâsO|0r&ˆSFwùs8X=~œYÇ`)®d÷™ºÿyÕÿÇJÅ•ª°¢'ó¹Ïöÿë߯Üt\7¹+—´òÄœü'üy8XãPÒÙž‡Ÿþ‘Eá^ó`ÅxVäžrn ê¨#¢DŒ4©‡E†ðò{/¨å¹?ïUlÅÿìÎøÑ°¶—{ž…K=ÄgPÁ¾‰‡“Ê?ÕÃãóoŸuiÝ'mÿŠ>â €Nø,4€³ï~®§C}>Ü•-NÁOLÓ½sêÀË,K~Úyíùu¹ûËóýöÂSå¶ç—0ÞÞ·êç¹2´&/ï~¢e¾ù|Éòîù¸'ˆ„kq»ÒßÕWàh.œÜkh/N0@ Ô•ÚPGÔ‰ƒè¨.^®Uœć¡ß{.EMê¦ÇËb*Çëð8ûþYœ9÷#±(r¬ßùÒB+¨Úá¾=Î7?gJ(„»có¨w\§3×{:™É²ENYlÿAø^Œ±¸ÑKhD·×Èïµb ä‡;ì‘D#‹YÇæ=×#VUÌ»®8Ö§–íG:ÍjÿHù‹9\QšM©!aë6°!¨þÍ|{<[£dÝòùú½r(üa™AJRcˆGf¤+ƒíàÎBìzó~^ü/»Ö#/Å\®qÎnp|\è«/®šó¦ Çþ©{{ö©°ø³ÐÔŒ$d©¬1d¬(Îù¿ÌÛ¬Ï÷äkëuq!ªuQž¥€™|·qLáX5ô]C±Ðz–[!èן‡¦qs­sKx¦KW>þü¨ 'U·«ŽÕwJD’Í„O‘á•öšd‹•|éf0«Ð –×®Å\|.­Æõ¬¡&(™X¢)ŠU\ì}çheô6_ežwô<çŽ&·{]ÖgÎ/X ®X1¯Ñ+t¡ÛÍ ×|jàU¿oÁz¤£ ÀGÁ¨=5f/ŽCZxöïÎäürÏéSº/­æ2­Ð X0»Çççûqâã¿åëûŒSÂB JÔGF­|PŸ':RÜé?ÞÍdžøãú³ç~×±µÕæ#B-LC ‡@ZtÏ™ÇÏÕnDâMû˜O†W¸!ôŒuçΈ„V6«¬e+¶oò%»íý}of5Ù‚ á'¿¼ùÖF•ȉæË+ÏA¬M5²P§ÉÑmý‰ÿç¿÷¨Mþõ‘J3·ûz—_(«ºLÜ´KºDB˜ŽR7¨%ÂΤ‹ò£_§»‰^æõíùãF¢h•Ùèîc† a áðŒl0Ãau]Ÿ¦15eUk;#Ðs`å¶ìíNÝ :ŽKÌ ô"úý(%¶´°€ +HbÃ"( àÀ3¬B¥³ Æ ¹{D*&MÌZFâPXSþØN\ˆ$ÅhÁ4Ø …8gé¶#3x†ò¬ô4†UàÒ¾Å9‘wKXBb‰WÙµõ¹ ÂTúUø ýpü=“UaÕ?7\ª«2‡•¹µ±8ăÇzÝE1šCœq]áÎv†2=¾ãFÄÅ!£`KFÅ]Û„2„F<Äà—¼–¥›ã£øÂ [¥"Ĭªq† *e” ІbDÓxUšÝF2öpUv”!á |¤Ž:ˆ8'c# RM R+n%FªˆŠ`VÌJDDxc°1¿Dø·B Z!d°D„QE‹½aÖˆJžPAjáÒiè—â‰}×›]ñ.Ëð‘—ëZ{q•Ž-!KÁ3»?þ}þùüý£ð‰¿À*ú3«×BˆQ0LÖv$ÂWtÒ© Ox(š¡þ),¨úÚ°Û€‰WÚ‡í({¾½{=¿‰þ‰¹÷){×DØÀèÆŠRàºlš"XñÐW³ÕJ2H(~ÇRñ:CóV\éVÂDLŽ¢U†p .Ö‹Vd˜·$ ˜¼ê*ª?##çEýñ\Ÿ3˜®UžLó!¨‡¹ Ñ, —™‹L°LèZõá·{'ÐkÛ×Ä!ü}É?â9êß É.¢Q(m‘ÀÄ€¹p¦z™ˆ¸Ïûróéü±Ìϼû­ÛÏÚïð }TRY毜*yúÚÊ}#NppËÍóÙô¿Ÿï¯ç¾í§?ëk®¼ÿòíï½íåóîj¡¼Ý{.v»Éz_màïÙ ÔÃ@x¦\#9¦ZP%Wí!z՞хªº$€^k ¹ÉJãLÕ‚K믂n4Œ”ÂÚ3÷ÏÛXô7P·ZÂB˜g[ì®& šAk6K‰&[®s5,Åð«}•Éש˜p8޽aaÅ‘L ý Á$½¯`b¶Išú»‘;P™²zÇÊZÐ$”DÞŠ¼È´ò©p¡“Ö®rFsí_ än<"Ÿ°SÒ[ ûãÈîDÃVMïçëÙë W›ÚF¹ZGÙÒTdJmî!Òš"ŽçÁdÆ2&㤷Ä&ÏéØPŒO»¤ªÂßÈLµ’ÿáJ˜üóÞxþÿjÿè‡Ïã׳x µ› öÐ@+\Xð‘õØå'¬˜ŒÀ±ÆFUVÀkù- á…@Gm ƒP,— l½,EÆjU á }žzüeþñå??¿_wö:×¹Ð×äÝÜrÍr•0;3u‹ø¢ÏØý_â-èPE޾,WÃâ‹*³BR¶³¶Éçr¾èuνT`ñuÊM²³ë38ž¯0ƒ—ë,'OdÍëÚþü$Ñt"þ(²³ë„·™û6î0céŒÀ뤦ôs=…œpæq˜ß,®p[àt™\ 8YÂXÀ0J{õ©'BA¨Ì‹ÐVu!â·¥Ú}ç> ôcÿ/þoûôÿÓÿ矗ÿ¾ªã>ÜÇ-¾tð’Öóñö·_þØßpæûÊ,ÓådÏÖù×箾}|·ì-¯ñ2€|fÌpø>táNbUƇ¡n¡òäìù¶þV¹•é' ÕP;¹ˆ×@ 0Xhu€(õªa+l±AТ=Ä÷ÁQÜ40Í!m‡ìBÞ9 ÚC ¡ïVöàö>ô$­lÃäAÞ08³Üò¸Òcë:Oeÿ ìÛ>QNJßµ×AK›ÓgtÕšŠ$°K5ŠlT‚¤óqàÙ™Np25þpó ü3p@#îQÆ’Ôíw\®ßßà+Œë²Ýâû3¿¥ØbÇ—ª; °¢ë”²*ÏtÊjVÀº4`ß·`F‹C×ðÚÑ…cÃÏ_Q{]ºT¬¸šüBæS™¿wÓÏš7Á··—ß¾¥ÖÑ¢]œs…ãš\ ffôðøF­ãÈò³©‚›I¼ËµÒ+Ö?ÏôÉu›é1¯4\‘ø[§¾9“ó>K¾/ý7²šÝ5ÎKUéê}Ñ^—C÷k}äõÜwñz¼µÖ'fÂÒ;i«mþ´Q3•ý¦3L05×­¸Y!^Jþqÿ†GåG¿ï»¿ö?{³úó›ÆtÖ©QÕV°ä_úY‡LÆ,õÆþŽ_CÃò © ÒîaÂ…g;Îd¬q/ÇpŠu!jZmc–«C ÉTå|¨×W¯§=7AÿK¤ÿ®áFmŸG…;ZÚð*§.&¤°eéî(RÌï×uþdÒä1Ì]¸Á w—l\Ÿ§ž†¾Ûøº —š20ÝàÌ+æõ9ùúgÑÿûG³8Ýý½Ù÷¹ŽÜ³Ñ?5ùÖÏý·óÿûì§cã‡|ŸS®·µ/€¦S<—z˜œoºÇ?ã_éØ«Ø‹oëÎŒ±6µº æÑê°ë^ `†ž"baŽÔvíÌr±ÄÓED¯RÃ\Ç`.顼—›Çs@VZZ4  pÁi¨«¨ eí{ŒçêËÛ›Ÿá>µvÜuåü}áºùr²ûù*ð“òþˆ˽+ ÍÌ8Þ›˜ìÍ?ûݱC:³«6»-1éöÂJU!ÌtVçþÄb˜8Ò©:,¼Þ½H â…’Ô$´À½©zHW¿`¢æ—²VÄšFKð8%/gE%4ˆ3M ÷d¸&ùù®%À:tÕ0«òk).  Y2 ˜’ ”÷—?Éÿþ¼‰åLÌ•ÞM¸T.âÿË‘Q7X¿ôá·ZŒÆþGÏñò~îÿõ0áÊìë_?c-}>7UæEh4H¡ãXŒàQ6å野DÓìN ˆíܦϰHãÏþÕ2¨x¨ÔŸ.ìnÔ,v/Q‘Ž­R6¿|µvžýÁÔèE]Õ«ÊCN[|OúÑäžòÞºTkeZ–ZåË4/‹¸@a«J éØl›Mjlãü+4<¶´Þ N›y•‚àïÎåû³þ®l÷;´-5¾FZq°|¼_ŽÒ‡ÞØïàç,½íÆ»¢‡dÀsê#×ô ÞÆfy¸RÚâ€ÓŒVß9˜4šãÄ„úÑk½úc½„údV0¼fñ1._\t²3ŒX;ÝÂS¯ ß*z{3–ÈÞeß‹^µ=-S•SìÓè!VŸ•a?Ê£õῳ´ƒûdìµ½ü\^FŸhº’æÈ2«=¨(ßÚoZ ½uµq´uàx‚_,¯ë?TýÅ{O̲ƒÊçÕZZ.·ÝâÌè×ôÙ™ñ¬TEí\¢¹3}‰2—èò?¹³þÿ²._ä{Â×RÒöd÷Á\ÄÔ>ù1—ÿ oå<~ãƒö¸‡CÙ¬gzŠfÍgøP'ñúm.¬ðBé0ƒ(ï«ÊæççÝì–ÅØtÌÜw{¯×¶¹MÍÆô)ZEðã‡üƒ½ã\ÿ—hªödû^jM+ªX!À‹¹Wp_fŸo-tØ8?®õ›É!b’ÛÉy<¹Q[m«Ü§¾ùžÿôµË«ÒÏoü?W|îÏNÜÈË߆TH«O½JsÞá ?9¹wõ…vN)¥Ô} (ŒJ0 Wè*`)auÜríƒqáÅ&~°õ‡º«Ø0b޽¥uìÔ…9hB„ v=D€º!9æ&|Q³ùc ù8ŸoŸá/ÚçdSæ~t¶7‡îpå<Ä)Úó—ÇÏ[¯? ”&´®‰7羺ּð¤ðO>ÏêŽëŒØýug ÓZ.tg_ª âÈ>3‘SÕTx°BU¦ëÚ“Ï£ÔZŽâ œúýs½}çü #Ò¦²p#SruÕ±ú\h­ºÂÀ3®žy/œh%“ÂND~lþÃbÄZlþòEñÝBC:– æR}n¥^Ÿ5nЪ¹Ó/õ d,)Sz¿­‚…•â;>Ïû—‡`rb/‹·³¡š¾6Õnl× H(Å&N•<_èq3?u·ìØú^çfC}Wn>ë^ÿDÏFy}2Ÿ)¬‡;Ji}(émM6U¥ˆwÂ\%¢Fp·s`©_HÆGe]–·´f¨í]Û$7WÉ&Ÿ5|•áL¶÷ùöÙ¼L6àÇ2û*Ed÷3Zµ ¬„\‘Óû+nóÝïWSÉrãZ< ÏïÚ Ú§Ö:.né-L KuGÆf‰soÛÃ_µM%…^|ÿ¥ìñ²£Ö\† ÕÔZix[%Jʉ#jzËÅFvœivßù2ýbø(ý{'É Üí8„5ÔŠb„D…80ЇZS$ŸXå‡É@Á§Û“¤Urá4MÄd\©… æPŠ™LKI¦%\’ ãUa–S(eÝN]éXk©å@…Ãd…V£„wòô KÐÃL€òž¼4|×çœ3S™'u¼5e‡ÝeÜ¥zœ-ȤÜÒ3Ø <€ÜÊ'v‡qrI,›Ói¤zŒͶŒÀQά»T#-5" €2ÄfœÔÝ*¿äc²´j8BYààà;;d Qª‘ TDÕ¤Àû†»c/ŒÂqMOŒaÙÀLI÷`l < 9’çØX!‰‚§h"YS¬7 Áo!+ø'Y? šTtÊ@¹?…åhG##@$@‚‘ƒìai6´“V¦¬€Da’:1ª7ÛÚ`kŽîç9¼çëµX$ÏcYw×8öå×`g´1óßûðüÿüãø1+ð;D(”6J£'Úè)‚¡‹ @°4ð |±Gø…D)ß…•=Û}|óû˜}Mêó'Ÿ¨íEöÿñ±wÏûúJv%®RäKba„q†T€ªLŠ$ù‚9–S3K ÚfnÑ ¨à…DR¨ˆÉÓº9Ça¥*Çè¼È<6³ÜuOØë¾oÈg/»ˆÕ.‰Mùí©¾ªŽÐM®\÷ÒÐÖèæ7ðõ{Éâ(Jöÿ½Ÿm?Àz®¶¹r•I M=’˜ ¡Áóò‡“üM;¯k¿¿ ßø[y$b@•õM¾íΜ‹é×½ÇÛ_æJ÷Æž‡Î;_Ù=×½z³ï¹›ÈžÛ·ß¸ŒÎßý«3è+&äê'ñ½û4j$xEk5\e³åAÇΘ,½ÇL„` $7ˆÆ¼@p¸ŸäxYN*„1H…¡R±¥ô7ÓÞ«q{fIam"¾Ÿ·T}³éÈ஼¼G¯P^¯:gÙËw™ºÓ>£F8ã^•?o'þGÆÑÅUæï]#r/õó[èÃÝìmùßkºÇRO!§<ªYµ ‡a´1†;LÙ•‹\Üí^Ú·¢rSó¢øPÑ+CBnD@¦­ö‘“¶CÔL¦‡úñU}ªëbŒB”#@®N}ÚÄbÂcû„ÐàuÇ.Ìuz¿µQÑÙFÚ„ìxm(¯Ý®k?WK‘ŸAFÌ3À=”‚0¦g¦>öèØÃ‘Kõ­vN¶½‘P–^èî€#œg1_~ @(ðÀ³¢£©“í•iN÷±Í®¸jÇY’+1dõP!Ç"vj’%”¢°.ßÛj´¢Îf•Ù“ÅŒî+½TžnÏk‘ªm ízÈ’¯å/¯ù(·~Ñ'[é^?çõøœþ÷ ~H7r'»ÆIøøÿ_ ”•€ö dzôˈ°ÞøX6¬XW%¸ÇŠ @A–H¥,;©™ÁuvÝî× ;¿áý÷—¿¾oåù&­&Ò;ž×…zB®s2«9Ï–}fñºØ”[|hÕi¤b5U·ƒ‚­ ®A1RФ¿•‡¼±Ù< E{Æ~jzw:À‚~!fKˆƒ¤wwo¼¸Š% -Ðe´Ü/¤l…âPœQܮԆ;!0œÞú“]7¼Ö¼“âßLÏòɹ|­—Oî…KdÖö‡X¨ò€›ÇGÅïdw’¦}a7­™tØŸgÆïæýß oû*DÎ O'jûñ¯Ão{IÖQj[.Ÿ iÄ —K×ï¾K2ö­çuIt-è±ä“”¼Ygÿ¿ÄFC£VÀ“ˆa¶@DœÎ Hö*MðN³‚!8Ðÿ?oNT?ïÂïâs5A.éüTEפ(9Áïœ#T"Wõ@YôÜÂ$êmäUò ª¾Ð!¦H¤n³BlÅP›bºUÕž†ÚÓír‡r?):ˆþÏ®Þß²g2º•$Ñ)ŠJW½/ŽxÖ¿j½²Êc²%t³t¿ŒmÁ®ÚÛrõV`f~î+hîtj^³âÁ]js¬‚†4À:´ @0:”ÿ"ÑYßh½ê;Ê?‰Ó½#}1>ÊþÐÆï0oÜ81ûèÝžTG¢´ÔTÛh.7_wÚn"Òžéõo{šÇ'À\­'+nlÂp jÆLÀïŽ1pœ&H©Õ9±#ˆwÎ$>«´áo°ó²‡°ÜéS mÌbê÷¦°4`˜^içh­=¤â)^ÄѰ31cüÕûÇ©ëJpo:ï5xx~žúÞ‹¾R{Èþ @7NUã)WfØàS,býHW;± ×`l┲B?€.üŽã>åšÖ¶ _uÚ,ŠcHäz7ÊèZN«‡LG:}þËþ…¤x „OÝ †yß̀ͨpa’3Í祸²ñÀãB1vÂМ,J—B°࡬P"UK¿ñÝøá¥íßw}GëØ’]pP0¡è~_οwbIÜ5hŠýÇ™s.==ÆæŸTíß¹Q›Ó0v5^_í Â)5\d7a$0¶…¢a<5\R‡7¨1A¢Æ°O4‘ë‚C‡þG>½7ïg&ø>* ×F:%¾Ä»Ã£´H7í0'Þ²ñðþ·2ZÆÕc»FPÆ7—Y ð úC>ç‹@wÄÖe…Y”P€1–¢ë¨àĶ:ÒE,ƒÝÔ»êÂ#{p³£?óË÷›Ù¼S7µp´²ÛÜ®é׳ê v^ odëK¤Ý×€Ñ.Á@^Ãêv£¢‰÷®mÁú!ëé(ЉdŽ;znmŽþÝÞ»ëì ÷e®¿¤éÌuø…  £w-F¡,,D©uŸñmø¥_wE,EÂ…è×Ξ}ióæ&1 #»§ÊîWé7_Uα1B™Ä®L¨-ÉK |¢JÊh2=ÑÛ('zA`Èé6C’0ÆZNƒ£Sµ†å ]¢ky /]ÂÇáÒJÃs/LYA-–Õ¹)³YªGÑU­Ýç›FN£ú¶÷ŽóRýH^˜>#P7ŽVE4:´ž[㉕$+y±ý•ý+ Ü¿P¶jZ芛EŸíàMïtRä)êªö‡ÍŸîç¿»~è ¶{žç¶¯fG§ÛŘ@€è#ÚáËñŸ@ÝüýS?{¾neà#Ú¡€(¨Ìc€`KV; ~»ËåµÂ%ÕZ–Ó‚F9i?•¹?/·NÕnÏ3Øý¿éÿAèd%õòEÕ–ËŒ³®ÈllF÷üîöÊ¿ûôøÎþüýRk`‚¡Dr{,bpËûe„ÙœÐv»þZRìí³Ïœï±ÏI^Ú'ÏýıFê„LÍy M}ôMæ0ÿqØLÈrÏW8õÑýª1$X(šÛ&<µš2ÛÎòT÷8-´×ÆÙŸ:¨Ë­¯þºÇ–Îwü ­eßLô0o=ôœNG¢Ú{@¼ÆŸŒŽÏCÖÒ±"5å7[âösܽ§RÒ›Ó´¥-öýW¨—ÌŠ=É 2‡¸¬œ=«Í¹÷Þ)”¢ª4µª…Ò¥¡ï¾­‘rÙ©Muz¹üG…‘(û†U—ã tœâ´¤°~¶¹kÍ|M s´e¬cõÌÏ @ „0u)t®ùëý¶±öåõƒÏ3Ú‘¡fý¼ø šì#Ø¿·s稣’–¢½¹**£9_y•E•ë¶VŽ\JAÿ”ooÔµÌ@IIC° ‚èd(ʪñF«™ÇîšÂNò ±BF(RÃT¥†2Õd¬éæ5ÃÇ~óÏítì€V¡R%på¤Ö…Ï5o ,Ù&SÃÚ󅟯õÚx®W\Š?_ooÕi®Ê°Æºl¨>Ç75kÊ‚Ü`=ÚQ<©Â–J.Ïœ4vâvj¡YÔÄÎc}ýEMßy¥L¬[:R¦fT(rq§ÖD8ª ª€ÏŸéè-û-–Èãé “NDgu­(í2× aŠ—RG‘èÔ¡††1Ñÿ*û=݉kŸ±¯›¬6ô"È™•”Ε†‡Z'6¨rçZawd8âLßÔ)ã¶|µs£÷œæ=²YÃĹÕldÅ‚#€M8bØÎ†svÜùÓßÛßê·U5HG²°ê[a|›#¹¹õ0•`ÓÁ¹žÜ¬¹·F9Q!=ŽùÜkÍ>)f0m: vŽ<]º£Q uò‚ö› ô$Æꫲ}-«™Ù«šG·PA:âõ%d©Ñ¨nÐøÉíÇ?\]”-ð~7’˜DgHÇ–^QL‘‚Ã&¶”%#Æ_‰JG 6ãÉñ¼ÝLÂDŒ}%0ѸB qI‘%IJ\€:²Üé\Á5tå‘v÷ìpXˆK9Š+¡CîzŽ\Pñ¯ítiu•ýÐÉÓùo²Ï,Õû«ÇÈ1ýLÅЉ:µ-ÖL– %C˜ÁgQ»,e„±€ ªšQ±K)ÈaŽŒ¨ÂðýÔ±å‘)`UÆ8ZaŬP£p|“ÅNÔQM3KÝSd½ìDJѨ  PE°‹Ebâb ã¨Æ¨FUÝf”0©#<¶`P€ˆ1‘VÒP-ŽMåig•þ“l¢ÿ6R$‰Ýd+ À”­HdCâZ%(„ aT:1%õ ¸Ä!n¬ë23ÿéûëŸùã!甊¤ –OY9 H5š&]+H×Lþ'þéëþ£¼¾&På*UXN#©e{Ù2RàS!kH ðÀ?âY» ©7é‚?š×mSSw˜Ç—-º ¢çsb_|¿g>êîúÜ-+¦’ÀÁE1>AU+W‰Æ*c/¨.bB1(ŠbAª˜r{æ°°ÆB4¨ål±ÄÐã×L5ÉgÓq¿dù9…ž ‡ñª¬ö³úÈ\wÎÛC©° Zûk`ö“ ‘.ANƒÜbQ¯Fg)Oñ?ü#ÎO>+µhÁ PW>JAqÌÀºÛî%^÷™õñٱɢº?ôǦ¯D"ÈoPþ…ŽFy¯eëúÂnUA ó±oЬŸ÷^‘¹ß/€ ¯S!ñߟSû«_?çÁ·ùîKV;ÿѱ½š/p… Ðê̼ ¶$!« ÑfTE¨ì[\®.· ²Pné #Lƒ"xfáWêì«¡”`ml<èäÅg,>9dÅá·¡·$èIš`€g×=WŸö´À©zãp§Û%ùJ>‰ÿ{Ê/ë Æ(Ô¾Ÿûqj˜ ‘«ŽÏ†­At ´6. /`˜y†©TÔ¸e*Fì3IïsdˆÇ×ý¿Óù`xÆþ*¿žò¹…áñÉÀ¼†ß—PèN’ Qâ‘åøQþÀ£ ÉѨ• •æ{¬ñØnˆAW"‡|ôÇ?ÿxùÌÓçqG~Çñ÷Ì÷Õן÷çë«ýs6f»N³#çíz”:Os_˜½R#­ô005ãtkÓzìhÉ}ÓŠ¾×I5Ûu!¯ÂÚk÷Wodìã…þRª€¡¥[mØ. ÝT§LwBOjEQ–¬À>Ô}Œbf•Çað¤§Èòz÷€â†V .¡0#gļâÂ6«›Aí‰ç6ÓŠb¼€-0j¤¥™BÒ‡x©JãLb¯Ï½?ö!™aȽŸÕýúcøë™Ò‡Sï[#¾…ÏpýÈÇÏèz¶önô6ã'Y *Þö̃2éëÅ`v)ä°½¹ÃfP*­ÖQJ’@€: ×Qq <`! 1À&ÿù ó#m<]{Tó€p÷Ò˜ Ú /w04 à*R 8dÂ.†KH„Cn$mW}<­wû»³_ aG!tD¦5§DŒ”³Có{mÍèϦh:Q_b9Ô›ë;Õ¢FÐÿ 8C84xAláôDºÃcÁõL1ª6¦'•I±P§2Ÿ¨Dñ^ŒD™¨WwÛ^õeî‰è×}ðÿÞÇçUZÄk°‡éËÙóÄÊä€ÃâIMôà(à’ëeb(”4AãÅtž0#:ÜE—æ‘§ÍY•ÑþáW~üUìÛ\TÏǯÌßwæÇR¹’±rç¸Q¸A]ü]ùÉ¿+x3õYD„/\=?çËÓs¼ýÀ==™ˆ¡*¸“VT “Kk%˜âoûå³}€éž© Þ®Ú*5}1º¥š”w¢Ô¿Ôl@¬…E#¶À´v,¶†ß=^ÍU´ø·ù)_Á೸ ãØ Õ†ð?´¼îá -!@33H8*6³è†0òUØ\½pPqtD’N¶÷H5ºÏVšIY†ÂHB„oÓOhÁ%i‡jÉvE¸'úÒ®Cc|_H·]߬Wf{¤À£f‚U<ßõym@µU[6@F;é‡" mpï»[ñû|¯{s`ÐLNBH´J€²‘´?ovS¸U´¶´žWÆñ&ÈHþÕ‡nüEíbfL‡ÈZm]‘bòÍ]-óô¿ÕúãòÕÕ½D"Ð%b¹|è*PÈl«aé H°5fÒ´ )ß Vxx§Ìê­p He˜ìÇ¥‹‰w„¿½¨cfê„M ÷£©]Ò6‹ïr:OÝ<ôØøO?ôB)Ü‘™k@ Àƺ…UðfŸ{_õ_çÞÖzõ$@šŽ7èv›ÂšØZK³@H-”h§{[J§a a P/HL+¢.°x „`̪íX2š\·Oªm¶6ã{’s&l"L‰MŸGÆî¥+A¥³íà0õîK|oÆ3€ˆ¸¢ˆN´h½Ü"Þ!ôpÀ+ÿ\äËÿý‘onì;œ™|÷1Œ¡_•ê÷¯žvgð–¿¿|tt\Xz––~ûÐdFãTn Ì&‘Q3ß‘ýÛvío ò“àP eé -J h‹¦³snžÉÒeÊ’E ¾bŠI©A$Â’ëÃú™ï§µÎ°?MŽŸ,D[™¯Þê&8ŽÊTþxÄàéo!ÿýWYÎÃ}_¹5;޳~L¬ä|N_û€%²ÑeßÀ°ËÂA‹‚4l<ÚQU7ä-ˆé’bܾõÇ”OOàsRþéØõkCQ¥Ý®”ÿ´ÔH§‚¯áæE5­]¡ÏñË›sþ({kµßÙ1Í Â^Nɸì+¶®æSdÌôA:-|5LÝíŒý=QYÈ• º*yfvlJ°Cö£ó±ò‰CÈ/¶Ml°‹¼Ë½kõgCýöðÚ¿ôáó«§FÛU…A8X 6¡(ò}ŠçèÒH"ˆD#ŒTp!6²eA° g§Ý?0¹EÁàX¬±óH¥-.­*k%¶R»êf.ч«Q…îÊ`¢è*] ±\ò¯E­€y<ú#ú_5o/¯Ïª®Ä'ë]Yù‡óÖßkçxÅ/^X¹JRtœ­ÙÓ¸­Ì—¡‹ÃgöúÊÜYûâþ«Q9ôÂH,‹-å*pÌÀ*ùAjškõÔ#­<ì myURŠŽ¯÷ÿ=ð~n¬ªœœXËC‚Óޱ$F,xüú÷ëlß?ô·Ÿ¬ô+T<¢­|4˜Æ²AOÌ»µcL¾C[g}Ýçy;eÈjw± u¡¢o¬ÔpvöµÎâ™ÚçÌü?}`GžPSÊÎ]n¾ÝK#ûMlà ÷%é<í³“þõþ·ÿ²E/ÿ„®ƒ‚ L–øÏÈÁ_-¿3÷Ï—{zäõöÿ)Þ á=SW>Eã[G÷²¯>{ßÖþ3Óv¬mö Ó;L8 .5xæC&µËï¼ Ò††ÖPD˜ˆ`šÁ¦îÌ‘C ÑDˆ#ÍÒ”¯h´EÄS^CXõ¤¬K°5žØÃ%v¶ÔÍœ°ov•7å·¸ÕÉF®vÉô¨oó êI—Üþܯîí•â1ÏñkUdtp,’'?ö5}<õWwH‰‰ݨAfW7`’#„YU©’b™,®`(ê] †a°²¦ü€y.,omÖe¬êWK~QÛúˆï°¥‚•²d.BCÚpÉøqÉg½ô"VÇç`5¯\>—¤_ä°³£E$–K‡ÎרYG¶ŸÏêAùÌPãúôG\ßx÷\‰=×××RÕ`jtæC™‹žëдç# ŸÏZÌaLöÂò ˜îcòJiÖÞC%Óª$¹ŒDÎ8KHwCa²›{V6,.Ì”\àb§K?ªõžðœ~,Ö0¶k¤‹ÂÊ`ã´NånV´µ0ÇÒ_Qöô‡¦^z5sWÜ·2 ó’×*©¦Z(\áÏ}=Û(Vî”§3£@U\?.ž”¹ß×Ûl¾HJ&”âÅjà õ³¥·ñÖS=þcÜÍŽO[^DÃãúT¾âó5Îe‰^rì)Sh¤½Zîà(O÷™Ë7ø=—Yzfœç)³l‹ùºyþ ½ßfÛ=‡–<êµÚg0á2ŠŽY¶¶û ÷Ù»ç1Ûjª ÉÞ;–.˜Ø”¹ØÈxcu;›jgÜÛvý;ò÷FnuÙ¹ˆ­ìlÚÄ  „‘N§EZS,71ܺãÎÁ¸µ,öLÜN+Á’ ˆÞˆɆ¨©†Õ££–]/Ü™ô°¨7=“¥¯³¸kKµFŠ5{ºUÖe£õ› ÍtÕ×õîÑ·5q㋨A&„>„H€ ¤ŠU@Þ\o´• º…§w0¦”\#;èé®ü°H䨂x€ŽcôPp% H%†H9Ed*µÝ‚à·Ç%]§ã~gxƒ]rÓ -ýïGë;ƒpœÏ¼OÍ!Ú® aþ$û¦öÊVˆ\O^ºCeß.£N}µe‘!­®R‘ˆ“"b…×RÜ l pä× ¬Y1âœÄ}ù°ì0تRù*áX6QrVi{¯ ÍQW/ÀLI¾3`@-TŒÔ5ZDá•TZ$ŒQ%Y#˜YÊL‚À(¡7Gð )¨B` èÊ¢l‚+—“¼&þ³¬ß}EƒPa”o|‹k¥Î C&è0€²b€ ¥S  ""†2F£™¢ˆÛòQ:|ù®£#Óo™ª…RPËn²n¶¬xš0kÝ<àùOýü/‚«K¾êø™<파¹­U©}Ì¥e¯|á“ a‚4³üÃdo,˜ü«Ÿ›Úؘ/\×¾zñdg½ÃNz››ïùÚŸ÷ÉÇôçýé¾·oÞäŽZ D0¥Y^«JÂ#ª8-«XM@ ׂ2Á©ј`là`jŒ1HŒ+ކ‰Tà¼mæqÂçìýö2Å'q‰};à5`”Ú±P14˜üM#o8@Î:±o“;#OÌ$´P ›e0ÕÝß4%½ýÔXæ.tÞ3ãÕŒ™`ÍöâµÙœÇLsq„­À)HÇŸ¿þ¿~r?y”vš»K€fÝíj¾xsŠÈvŽ%9Ä=ŸŸôòü·Ê}•zü9"»…Ýùľ%-4¨ÖÑì±4Ë£§+Ä)U^_êÐ*`À·€ž ,M¨áТQ{¿F-,Ü'2»˜Bÿ«ºó/¿†A° ÀÄrä«d3Tà°‘—dÁ#ÔˆŒ§èÈ\¹GÆ¿5êÀ=Â]ù™ñ?ëcqº‘œOð!܆»¤–¬|*y/Ѱá¼"%Ý”•v­’’  ­r¦bµPw‹,EE²Ò8ã!Ç.z]c:SΟøíÿ俸püÕwó'vþ4õ“r´¶Žk.| B°‡ ¬x÷w<W9ƒcÞ.½Œ=X9Dt@M²!¥ `™F)ËérD3-íœÝšî0îv¡eJЉ°ŽPŽ0Ô ™ (åUš³’V³ë€HlÝć”_ ão4òçÔ_Z±lÀñûƒ“¶ðp\³Nsè·ñÝÏM¥ùvíÒšq$‚`¹˜bñz¹g'y>&^SçráëÝÿÛ4¨³µŽvßÛöhmŽÏ1ûÖ@â\ öðÄX£•HÌäp)Øf ¢ÁjÚJl•þ#MŸé¨Þ. þkðR÷ï¶á_xýêèþ…·1½ÏÕ)L_w¯Ágø à*Ï–[‰JÆà¾“ûí«ÌK£zÛOû“ûõzœa»äÇ(÷fMÇh-áÀ÷èç—ÎçVÁËÇàט®´#xoæ¾\>í«ßku¤ÛÌ)gMûé¨úªB «¤”@àY‰ø×ÿïkéžüÍ5—Opt´±Ñ5üÅpèzäZ®¼<䦬xª˜–êÏ'>B6“¹O2/¬ßÔVûn¶×â¢>” Ñ }j.‹»L¸ g=ÂÞ”^}¡¡´û´}ÉçÑâfxtNž—dN¼T‹uõœJºî0¸ÝúñEs†±üÄö“Íi&o.¦¥‹Ôô„1â™i`mMá@«Ñ¬Ê<Ô,l»úWÏÙØü¢7ZŠSUßíµÁb;æÿj |ÃÝÿçƒ[E,»ÇtlìÈt7¶kõ|ÅjH(z>FL¬Ï"6a’ªÚP•õ1r¬¶{ÖiMè J5â [Ó¡bÓÑúï8»ÊŠIìǰ­±ç&)ë9^«-a"Ô9먔××¼»­ÑíðzK‡ûž£UH)"-p£ãð2gÏ_¸¶«NÖlû±›|Ÿ°_Žü ø$çSC¤§ÞpQ,%„aHhêWŽó!>6{üÌj Ò¾Äk Íc¾BUªñZgtüuà¾mMŽ>Ñ<îYà•¸&Z›*û ;0ÆØp¼éhKôÒ€tÓV;´;Wç>ÐÜhíS÷6pAži\4]hv:OqæÌ}îbÌNo%Ãß_96”ºÅÃ'wýºrilôX×>Ÿ½?|–úîûÙdï‹=ž°\€&C[qj¹9azœ6&€ò)f°‰¸Š4nØñ¨݈£G1ÿÆHþ0öú;Ö‡×Ë«´ø©iOéN<—ªfë¸ÔÙî‡ç4cgUšF^ñóú‚jZ°‰‘4²dÊ?=º>›ÒZ±ÑSq­j:ÙRÆÑåtn–“«çäùø\å­´l—}¥ë¥òRôøÎ3ûÜhÚ±", v ×h¨ ó¡_­Gö1â46IþìÜÆêÙšÉw‡ù·³-¥0œ5õ n˜vÀ>× Í^sÔÁ޲…-ë¡I¾—O%{y2LE-¶8Ù¦¨ôó¿ñÃ:1 :Âên¢Ä›Ã(6åN0¡0$*Ì9Ê∽Ðf°z¶/kk,4Ú=å}ËhÝÁ9.ƒŽáÄf÷sÖoþöJšZ½½*'ÎñóÊ­}ª9ª£ÏƒÖ*Õís,LÓ‹ù¾O¯8>Þ«Uî‘~±>ŸQùÿëkop¨ñek~ûiw¹>eÿŒ¿§zöÃ÷z½®ë\¹ê+ŸX{]ð÷]¿T†ðË_LŠÈ!oº§aKéÿ®SùÉÇîQjn5k&ÌÃSŸ^?ük>†ð†o{®wùbû^íÆtBÂAaDtëïqwßÇ÷Aû½öË ¿á#„ŸûùÈ/ÿÆ×Õ~ "ˆÐ#p—È|﾿”o¹~¯ÈšêÄýÖ㩩ʺŒ›³\?n±/ç7óݪô wõêïÏvfc•÷ÓY!.éÓÏ Äq–b>Ca’b*çUêEjqÝ0†Ã¡¿š# —ÿ:ÿ£ †þ\›Ë¼`µEbÆÃ0ÙßÞî»þ?uz½y˜5 AóYÞŽ*„–ö¼¼¸çù÷쟾ƒ¤æ ½4oª‡´"ª —?ÖÑ,â;ú˜”!íèx/ ¼Ð²ÙÝâ#€ªUö`wÙöšû»è·èžca­‚†‹"¿Ø4¶¤™ÝYÒ‰¨µüÌ£ÇØÈá$r‰¶ò‹T\Q\ײQƒµç•àÂ+;Î4Ù%'›ØFˆ.M±üºŒ?™wY£œÄhDîFyL8ÛÖu˜£ÔÈá÷þÔÉÿv×zgiàpY!¿ "ç?ç…žùÖ:¿±®ý£"~u'E/ühã²}õˆëG±ëž¼8êœìf!Ñ›¶…wš ?‚¯Àõ ×Ïæ'v§>¡×õÅŸ„pf¤›<…&n]XûˆÆGIocy~…g,ÓI«âÝ]+â ës@J]FL0å<ŸtzßÃݧd¼Âª‹¥™îMuj8ÛϱÝ'bnŒŒ8n ñø ‰‰rLˆäœUóýë|. ü²UJU><áx=÷ÕË?çµJ K.7åcàUma®è( …²¢n9Íê ¡g…NWƒçË×7^ú QÝ©±ø¿Z1åûsuޝôkî[¤j‰¬Ç¯ƒnö *Ea“\Šs'¯ÇJIlFÏǵuä^r¾^ÿl§Ž¡41_Kû¹#@u˜ëx(µ•L°Zvßõû\~¾ê_àóéýÖ|rg9`©Ùyž/çÇ0gɯ×6A_Nì,}2ãR¬¨Qm"FoLFŒIpt%&ƒî¯[pÚ ø®sÞG½OÖá%};ñz«Ü¨hŠÖovM?›¬;h?¨EÓÀõŠ­Ñ›½[]«3M_…*v½°ÙÍ©G{ŠÞŒÞ/¸K°Ž6 POHj_>o:Q¤_qíQ/=¿‰®G[uSß?Ƹ3ÑS¯æ¾Ž'“ì[î]ž¤ T®ÂŒ·@q‡#¸ÄkYbB (rpJOhË 4©Ž¢Ù 逞’eÞÂ}D·ZPJFH" ™DmGBÈêd3×¶‡Ó¨@™ 3„}©eXÚˆ>´÷l¼<œÍK… t…Wj ?åä6T¦Ö~}%¿ððƒæm·ç kt~š¼ØÜþ‚'2§©‰wŸÁ®šo¸Â—^!cEl µ$A ÒÚTñm]”e!aE[¤‹lU‰¡~9xÚçšÑÛÌ‘•Èç8´®a{§†Æ¨Òú|畵j ºI€'W!Ã[iPkf”6†Miž±õT·°,äe$TÈõøØ ,Œ‚F\†Å~Ñ£®;Æ P£†‰‘ z FÙ`6>£¬)Ö2‚'lÄOôQÿUBVŠH"#ÛPáϸɶ·'ND ›TT‰ˆ = ºÃÁ ±”éHãOó1Z„ˆ 2ÙáG=&ˆAÉžo”ÿýûõD+† ¢€ÅÄÎÔÎÚKõŠÏöƦ)"dÍ TáDXíþÍnfhPƒg¼áºÖõ_zGw—D¿Yú|×_nîMö¨îC±Ö)c9-#íÁ i0HÇJHÁB"éâ‚)(RÛ¤€J4¤€ˆ ¡8†€­_q5à²wjÖÛÃò:õ^êy3žÜý–?ž¿ÿùKçöÜëØ¿Þ„ÌÇÍDq5ãT¸ó5&õ>èìÆ ƒ T^µ`Rnç@™ã.)‡õÌXçL·¨O¥èh_ÑÍ&ûüÂwÖ˜Dë€ÒL’É' âK5 "KY~zÊÏ7.i¿pl·/Q'üÒw¥¦šhRˆ68ºp2‚Ée{`©D‹NàX ÖNH„R |Àß–€¾]_s¥R[Ît3,aĵËå%f*‰7:ÎuXceòtÊ6w–A)¬¦ͱ1·á-:o/±?‚m„»rX›×çþ…ÿŽ~Õ[Òlß/½µôû!Û¬·ýü¼M€;‚Eäá.ážQMè€lªÃ PDüõ|à_\ ’ßÿ3h¬æV5ƒ$Ãüq¯^ä:ÿ”Œ8jhF^a š‚ˆ ”Ê ”U`ÃØÈ2£m¹Î"©!^ÙöìBš^¤¡‡C]îì;NŒ¯ŽkìŽ ¥øj¿7X;Pɯâ Hˆ{~ßï“6E¡ x;²~óÍ‚^l´h»92} ®Àf¬WÂîš¹¡ÏÎtOž¦ù4ûý2öÛ÷e!WcÀ‹Y5jrU§î3iÇ Ê5Yˆ ûÄ‚‚JD]ÍEØ„ÂapÚ‚˜#;ñb·”U³ò¾PQS’­éWûç±ÇLjŸÏÎ$E…zfV:°Ò'}ìÇŸ×@à?(t iõ^ⱄ›`Ø“‹µ’/ˆú€R&‘¤D¡uyŠž–í¯Ås8Óà!ÏjVVµÆñä'.º«þ^k%ê["y’ÀÙÔJM×|Á°Â%ФD GÕß ó¿¥¯jzìÏÎÏ}8®’S H¼žý*õB‘ Xöh»ü;Älx>ð-_¦œjW0RRj_”ÞHÞ8ÓSýàp6µa>¡ïÒÛ¬ŽSbÄ5ßUË*æ4Rd¿fää%UCjêË’&èv<Ôä­J£2‰ªmÜMxh¥tãb_Åâø^%èံÐ3¹bx/ûý\º¢Fá¼ib†CWA¾‰Uà/ŸÐ×öÁè§hVÙõÓh¤‹ŽO†åN6áBÈ_ìÓæ¯o®V~äûÏWz¼€_10ñ¦%ÙQ&çàŒŠò’‹Ï‘ï†J˜(IéÃà>{Ò pOÆi<¢Ä-qØø=JdÒÎGéÜuŒdœßsM@a蘀E#ÌNÊW¨÷oëgÅÐ/jöò#¶; ƒô ±Ôö{Ck4^òæqY>iEÉö‡˜¹äR$ëë ðûð' 9˜fîõî±'ö.UÂkxû«{Fp¤¿ö#~£Ñ@tScp8à1eZ™É­5éCÁ¥F«°‘$ ÓFœ´Ü.Òd¹Ñ.…ÇlY ûⴙ˲¶4 £«é‘^ÙŒOþ'3ôMýÓêU,jáÇ[°®à< fÏn.§-¬x÷Àˆ¬2ã…†:­ué8>œl§}_þŸ}ùød¯qôe¨§øÝûÓ¯çÿÆãoÿs•ûóçBD;ʯgä|œ—­áMª* ÐJ­#êX¢ÄQ£<ù—Cljü~ƒ„¾ ï²(YPȪ†ñ,>¼`ÕÚJTÑ6Ðæ‚>V>úƒyâÖqÚ ¢ q˜¼q4gp{„WŸ®ò£èïT^h8¹øQõkq#œø$rò²èèÛ{ãòí,D¤ÔÕG¯ö|ÊSÓ44Û"FL'½Ü µ:ΰ4;F³XÕ…¥m‡dôBµ55pe\-4Bò†ˆ„€‰ˆ[Ì®¶õ`!ÿ¦à—žF—é¤UDã gI{Õ[’ É,Æg–ü³¥WäÈ¿âÂÿOÏžX¸¤Æÿ‘­¬Yê˜æÀcõûÌÖ“ø‡­WÙWjb¬6þ?~ëßœsöïSNA—°ò!¼!ró\yK<…ŸV…BM˜}MWœ€‡`kR¡Z¹#¾;ýR;çúÖ¡tòiëOø ®Í„GtDxÂáåë壯¯Ç÷wÿç§¥Ø}VξsŽïÊÛ ´¨@Q à$À··>|kö±çÀRúh¬¡>½ß·gþ·ëÜ'÷¿ßw_SÏ)þßúíÝÍú²÷ŸÎìýÈb&©Ùª6à“ Ó_ÃÁ³KÐ9`Vrö˜ÑÄf”¢± Ö—"¤Îÿkö›WåÑþˆ-ä…é±÷žyê–$ò È9‰šÓÀõ‘=êüÚó½„}+´>¤Av±•µ™)òS{yë©’s®Ë[.6l\ë8èžp˃J^AûHµ½"otfØ÷vP„[‹gÞêæß-åHUÔŸxŠ£³ÀI1‘Ê9A¤Ó*ÿìÓEæè•‹_ûéƒÕÙeˆ•ÎãðŠ91ëìæñ1"Y†è$#p P‹ôqé¨ô«{\e—$¼°÷ i¸Í&Íb"O`ÎBáàb,?uú>Þý;ýëCœ5)¶!Éx¬‚ *Ïûæö~oeâŒés·Øéj‘ãPy741Ìîì»}U2Á‘jõ¨Nî­»¡X’ä–R“¾úðíˆÔÍë¼æì;þ‚WŸçsë•×d¯#è‘ú$hòe[ p,GësUÀ™.0d€…ë(äÃúÜ7šü\³Z暟nnKQm6Ttž›¿ëíÅ×+G’‰ð@ÇÝ[=mË6ÊU0$2½®pd6pi‘‚±Û¯&÷³w6w^Œãïû·Œù°è†nÀ®[SÚBˆ/©˜JÛ1523F¥‘u¶”+ÝE ¹omñI­‹ ¸ãÇ£é÷”¯ÿ?ÅùÝÝÝ?ÒÛù›ìfòqûš!/%æBcÕQNcÄÃ>DÎ[Wîú<¾ÇtêßÁ!Lƒ²/aŽ_ÔoÏS×EÕï®¶ùž½ŸuÇù‹VmùŸ÷­Œo§Ý'cì§ïǧ÷ÙüH3C×¾9ˆaæÑôÏÈ6Ü‹ntjÅÛðd\ʪðJ^DÅ>ô§ÌÆÚMgµÿõ︂¨u*‘Ð(8¥í ž0í—›ÐÓ •(µ:£zœ-áˆdo ¹pòïD*sš$‚c©FêõÃ8ìVˆRÔ†öÀäÛ¹w:‚Îãg“µi“ﮟ>ÇÜþjKN®º4Ç›ÛEcÑQ•‰H|ö½õöL+Ǹ ŠòJ¸D7àã3H’ƽX/ªR#ö4$ÊÉ(!N—­â¬‹Lr•T]P¨1ÂKH¬Óˆ¼P´‘S¼løÛ¶C¬JZj:™L ¿­ïÁ}h¿:˜p%|6¼Ç½ê|>‰s4ÿ¡:OÒ^»è Î>;¿üÓtã vû·æa83÷³XuÓós²è±…ìù"ÐS$}Ä1ˆ†á!š‡‘gý`z¾v]2n14jšc†åýû¹ÞAy¦@ÎÀ\#ô:uÓºš×z«ŒÃôÛxH¿Ú×LJ*«Ùë2Ä9e,骵0Ãä²€ƒF6€6Q‘ŒhÈ òÒ×DZ´Ð&^pB±E“†…ð!‰8¹À2“ÜÈdÓé(çžlÁ5«s bP‘²È%'rä¬&ÁïˆÀCª*Z— IÂŒ’—Á° *Ššê%hF ÄÅ‘$žíäµ<7PJYªApiQm™Ÿ2®ñù¾FÏ_ðã1‡R†ªMDœŠ˜3 ¿Ë¬ÜÓ9) 27Hf¤Q€ú3±Ú0iø¿¼­MNúä?z£00§á—þøý¦ùæuõ7]ï}_¿wgÎ(!,Ší±)B ÄZ±Â0™‚%PŠH%£&}\F6RØ4.hD¨4–ÈÆR@¥&.8¹ó9Ëè(3 õîðˆ»(›M‡)L\•Y‚ óÏ—ù_žÉ­RáºQQ…&ÀÖ)¶´"îéÜ]O¥ag6]Íω˜Ià–Kå”Ë žŸ¿tqèÂ>S<­ ‰SðU|}²£ÎÇ\6¢Ú¸·q{~9^ên?îù{º£"L¹‰Ð )ÝŠoåRÁëûißÎê5k×5”t»%u¯c-Ý›m¤-æà¼Ä½D“ °Ðm`ÂD¶HdŠEÕÖå)4Ó ˜ hÑ[aN¤a¾©€F­©¥¢S'¨(µ «¡@I™PƒSV tÖ&>¥hÿQ‘¿‡h+–¯ò!بš®A»À*šŸÂTÎÈŸë¥Ï5\ÓØ%®Ó™iÄÝ×äC¬—€lÅî5 ¼Ð Dž‡”ÐÌí%&EyŽ¡Æ²ª¨4 â”hBÁàUÄjI/~IÎëm!¤ýd]Üñ³Ï`F¤I±˜,ElŠÎÊ«T™É‘‰ m‘+Z>d”ÔgÙ‚ïánt½™yô{3-Gqµä(Y½ìÉ“ãûÚ‘çÚ*ÙŠ„xvjú=·þe ¦!á”ôÕýöZ÷ä˜@¡iI¬_W3I¦ g™^Bb ÅïÅ…L¢Ép×ÙEZkM›GÅ“]ïò•ãaûøjú¢7œç—M_ë#¬ ¶xïð#Žc„+x+£”‡½Gµ–>†îè£Ò§æ×GgÚëÇÑ}ØŸ÷úÿÿ6ÜBk€5 6ž¬¦S‡*LH™s8ˆÂ3¶„°Lz¡×ÃP3|[»NÞoÿòY~Ë囼ZóâSI²WÏŠ:Ù$ÏÓlq’kĨI]µxÏ€³¦[ÚÏ#Îóo|c—þüCbå»>Í±íƒ ¢–¹ d-ˆG8­Ã­¹ìž4ËAóëG©˜ìHqEZ‚JüÖÊ*ª™‰L‰îäeß®À¥ßRÙéÕÍousÙê¶@;Í\½…ro~ëgmÓ¡§|m{k}ÿåÙ9³ß~/Æd*[ùœ™VÄè]ªâžÃ×`sóþü}ý¥þœ¥GV8>šîëðþ››ÖCîØ.]8;, ¾l¶lÖbðh,œø§ò_*ò8ƒRß{ûÃéœÔ“AÕ'¨9i_MaÚ¥H²LV4H.„33ÇYðð•Od(³KŽ«*Ê2¹Â«ŒIá"”¥ÃòU­=õùW~‘áŽèÈ ÒP³¹øù!y·¶2{V¡0'ÁÞjÖeæ« Ým#y.¡¤9ñqó/gs1õ—¯Ô7Ý}—!ºª¥“šŠº¯÷ÃçOL.]ëR®@\y¯#ú'¯­éŒÑ¼Þ) ÕV+9E{‚Ýi…Š2 Y„ÐÓÝ8`ŒìJiÉKÁsêÈ3QñóÇý%÷²‹28îôùìjw퀩¸E‡ŒIÍ¡çèº'”ñ>i“1BAµ“œÛŠ Q|º£zÌ>Š2¶ësâ•¡ãí?PŠ×5²K»=ºÞó>¾¿%?ÿïþøõõû4w¢O´Ãt PqNBhÕ¸¹?‚ÏØ0¬…Š÷ÚÆÊ’ F nY‘*¬…!P2S«Èiù“û•ô¥}-^Ón9ƒÉÿ¿tê–íñ¸\×ËÓtèœ }ê­7"?,ÿ³‘»Œ›;aê•ftiæ{¯ÃîÍ~êŽÀÜ™QS7g?—ùzþæáÝ­–EDm¿bøé‚·d>+ü¹ããZ3“yy|þk'Š6jÓ) lÂÝkX6€fS9¤vâ¿‘ýKÿEïòÀË£tÓgÜ’döÑ:üwö¬2ÚsÓ¾™[kDF€‚çŽ9u¹xŒ×2ÉÕ±â0o÷??¢@*õnª·fýõœõþîäãË]~·]‡²v8|y8•t\~¶qÐȶÚò(vå¬Å«5ÔÚÞËöéù|/Žêh@h–3¢«8îJíÙëûfÞ^ƒ[Ù€™X´,àÈ]D7›\¿¶âõq>U3(ÈZ€ŒÄµÙFM \«d (Ú]ÏŽD™ÉÛ|!Ië<ÿæD7mj†PbÍÍB!0²ù\·÷Ò;Ã= °"•N}S?¥Ex§dJÈ–ÄŽ27ãáò”+PÀdÝümçÏj½’‡Áw¬2¶xÕ:æß{;Þ/S¹†õ©ÿIê¼ÆùÝ«òûÙ8Õú þ–.íyžøá¥Ÿ¼ ²CƵVgíÿ¹„{ïïOPBKŠõ§Ôóy4?>žãÛR™º¢…¼dë[Ý~üü{¨±¾Ø}?§nÙœö?%{v÷›%»ÏUIId&JH¢ÿx€k’i @HTQÐ̉AL§mÞ¿M‰˜I‹¬Ñ¡“âÊµÆØ¡9 2Œ à}PF˜‡4ÓÔýÜ€t”bSP!Nîß,\5¹2P'G$£½% “’:‡hå!CôX¢ã`Š«m~UÆ.Å…äÈCÑØØdÚóháÂÅË•le ÄÑö²ÌdÌVs*ܹÍãþú¦nÏ-‡žÉ^u´¯ÙWÊ=XQ(¿ô|9ñÔ±/"lºâ úDÇŸ‘ººX, #Š©eá{†>yÎýÄiñBEÑôÈÑ´ö¸N˜òUݫߋêùj&ÎÏè&ëŽ.êW-ap`5û'îG†-?Ó:Æë!©ÇÓc›Ë‡«ÁGÁ™¼äp'æºyo~<_¹šš9Ñd8pIY¨^ìÃ^»ùC÷ó½ë*vÆd‘[ËQ™QB”@%TIJu¨'óŒKm|Kײ޸%&¥9† `ù¼ïÛÄ4xo¸A.Íó‹èS ÌxŽkÌ}à{n!PikŠ¢œAÎÁ•VÜÉéRHíYcýdÇm‹xOdä>Ͳõ¾Õù°1 \ºÃs>?ŽI›f0jJn öî¤ÏUåþd>oûJϘr{ë:•™­«%JIy|=_z^»½—^Ÿøë×7LG"ØA…·LÅ7¢R+ºäl“ÉÈÏ´Š•‰H…HÈö©ìx2å1)™€¦’ÆNà3Ž„PåFdTj ¹²qª}Õ|×Ê‹‚`2Bˆ ëÂ]_‚v¦4L‹`›']€KérÿõµØOùçGûsC¦ð+MðxÊÏ­àõù·úý#>l¯áJ{™3ûíçñûüeû±SÿÑõëX:lŸ¸$‹¨â”Õ]¦¶¦ãp/•è¢r¦ŽƒíZ´~0.qíç0&C…ÊŽk8‘fILìzŸrhhlâî~šjëƒÚ|˜«ÐWœ”1[rÙñÆÒà£bQ%bQÑpœbຈ`èI47VOÏb (©]øŒ½n²(€}ô}Pêh‡V¤vW§©H(CMËÇ¡ “9'‰´& ­0&‘ È"RY×h¥…‚"A:Ò˨©f¥D‚É ÊW²ª ®FÀ¦Ln¨P83uŸŽ·ßuN7sVÙÎSùßùÑ'3p1Ü}ÞÈ»5†|…oc›x¹ÛЂ<÷Çÿl¯mùSågœ>P(¼Ú¿¼‹©k"ÑÔ.àò£»×ÃŽ¾?þÚÏßÀ/çé¿ÿi/®|¢Ã>È!u kd @!qkÀ6•(¸`¤Òµçó°åöª¡4&Xˆh€0N' £’j¥u´’Òu—Xq£œh¿[RŸÎ„¬÷UÙ"Çû1N@&Rqû—ÿƒûG?Îß>eÇÝV¡Q zêES’®ÝGmEÖQê%¼/dËà^(–î`¼”:v3•Sæƒ;WüåóöµsãÙR˜®Y‘:Ig%ì)'$¥’Ñþ”ᣨ;yŸH‡÷óòãýàùâ#Áò`ͱŒ\Ç S]jÔ÷ôÆž|¼¸ŸÝCÏ v!“!—È€’ËcÕ˜hêM¼c ÚNxGhJ‰?ýøñÏÞó;œÎø^‚«=€ge:øIJ!Ê E tÏËcë‚j[<„ZÊÚ„.À€þgÅŒG"j5£YÏ\1M³n6 7ñlKþZéc ±ÏV'a±çNS®­L<¾¨ƒîn;×!@ Á³0 tÅžÉÊv< |-³€qŸpï‹sκ¸Œó£$¤EžÞ‘ÉñSMW‹Zs.𰉥á3ííšÐƒfÎ'ÃNM‰šG!°]¡ªb?Š:$JÉzê#¸!Ùio“Ø)ÈëŽ#¸ÑÍiÇLšö¬7vF†Ä5–¸Ø¹¼îG:bøìˆ¶VœJfKEá>®ºXì»vîP&Ö튵 tlV3”‘31AÕ PnÓîІ›ÞF ¼ «Ruâ7eJå‰ÑAˀ莭ï<¦oö×}ôç;vkKEBÍä’CîI¬„&]MûÅø܆U-ƒ‚€(ðöÁš¬ФöâÏï3!Ó£g.-q‡¿~?ÿxo NKÑczÝ—.l¼<¦ã>öæ.×*­Ó³Ü]L¯äm ­¹5ÆiyDÑìÜ,ä1Œî8õ[8¥ÞÏ)èÜN<ça¿ÚK1ZOºŒBÊ9¾²>ÕN²ÓÏÔ¾j@üTÙ-£ð:W6ºhÁaÁ[¡¤KÒ½5Ç;á«8˜„_ƒd4CbB:Ê0ª¥x“6àŽ­ôd8ͪҗ«|ŒV€ÆK?ßûä Òc¹bŽ£­þKþªµoÙ,Ÿ¼ÉÆö­q÷—ÿs×gþô^_‡ëSCQþX&šÇpEZ?':óÃc ÍòEÅá`Ûë×ÅÑ÷³Mt°¯ÛÊ—3¿ðÌËÑ?îëÿËžú»æ±?:$ò[¼ú;§±†o#{u~dð)&j”Ä"LÜuIçŒVÄ”­M±_áöÉú =£0' p¾9Ð1›if´æúÖŠç5F]•¤I'R[{qîw•ÝÃÃñ‰¨s¸–ò/‚MÓUáÞ/È0°ªˆ![¢ZM!êV>ݵùQᕉҜ²o“©Ñ•\7`¥ß{Â_®Ÿoî¯å®Â¤f]zô)ÜQ[Öxt`ì#¯ñÙï8òqvÍnM³â¾½!³5ïsä{ží °þŽsï~qzOÔèw×ÕÖ „L(Iï‰no9õˆ¢}¬we%h7õÝuýÒ¡ûi÷ö÷ƒ7¿7ãŠ`¢b°%¡žQ8€zDÇ@®ïCõ|hîR?.‡þËW—¸à3£ý'T¢3<48c0ûáØ3ÉŽHz‡¼ÄÓÐ}v:¬ÐI¯ˆ鮜‹\SÆDp*[.ÃF) QHÄ ` ðU­¢“~æ“ô+õGDŠn(xF/feDJb ±8À{Ò;Ñ_Ïë<ú3”±tå¬k‹¬bR½Ëœ¡°R"Xò:K. äÒë°$”êæ}7¼µÁX5ˆ¤¡:ɨ˜Úµ+ªôØŠ¦*aWÃ/ºK {¢œßzí nà%xC 9Uº’=¦¤ÝK±õ»^YZ”¦zéŒMj!ªæZ‚‡®=ПànV÷þ7ŸÅ-à¨fŠG!Ñyâù¬øãà¾m¿}7!ïÀà%MŽM'ð†È¶,A ] ÂQY.o´ñ¥ºF ,ƒ !`ÍLÛŠÙ&°¤¸C v¦•ͧŽýI{¿4œç|Z•‹ñã°ak8·žÝ^y°T Â:†Æ‹³i­ÖÛd“¢-3w{ëë¥|©/æ/ßbjØNU¥{$üåásì*zLO¸ðÎxz,ŒsÇßûE~ûr–ÿáóÄÿ$ÿÜOÝmõß·ÌÆ‡ìÚ6®Gø¦¢z_;ûجRþU'öò†YpÏ=¢‰¨‹Yù¶‡r^5 ˜~•îSÃ.4Ä#ÇòíÅý#}Ÿí[—®+kZálCIw‰G_92ªY™“_ÀÞh£°aµ¥[h8¹å1”ì·½ÑßýÈ6úcbP¸ÓU깦3¦V„Á8¼ }Vk9°c!¦CUŬZÇÄ“ˆøcw¸¸fÏOÕM2ZŸ|ú“ôÃaeXMÎQMÚ‚‘ý×B5ü³=.½­vëÎ:Ÿý¾¦_ë¿iu÷þ ¾ÿ÷ ÿñ¿­É¿müf&+‹X4¨Ù'WT#¢ú23Þ¯h†¦Wæâ]µàïÕ<ÿŸ57ß™»‡@Ñ—èC’ººù®õÝkîÖPü—0AÒÀ1nQÑ}õýv~S<“àëôV¼Q¬îÄ•Rº€•¦ò»ÿVsðü@~ïG7ÇÇݯþéÿ”J>þÿïÿþö$y”òÝ*4ÆÑVjc©#<µ £ * S +ÙÒ²h0#¢1",ްDN01 åLv;ïß^÷ó/èGà)×úcІê(®1ï§£•îk J:=š‘"£¨yç8Õe' jÚSéÑÉ‹¹w™·ÍðôEïÝ|’(Þ/6HhÙ@CHÓeiµ*{KIPG¸9úõĶÝr\<ä+ã+ÈE[CÑõðÈf×ß~{$ù| (¢¨j+N 7ë5²Õ­xexêèUæÂ™`Ê($ÑDcÔœG °µ$ýù ^FÔ(2`ºÌ®Á¥ÜSÑB)5»âq@†52ÄËCÕ”,`C©jÕÛƒgÄŸ%`sU®W®zg¸K\Øü_û… ýFy,è ìTËô`¹ÒÄ%³5§sÝ98>ŽÒ¦cª§ý†?¾˜&šzôhëµ+¨¤°¬Á(Ø“™@÷áĵ5ìCïs­—ÙÁéb®O`©fd*w¶W]×O¥“`v 쇣¬Ruùà¸÷SæÞÅ÷Äí{V£˜ëÐYÂRáNÖ€Aò~óOg„ªxÅåÁ`äßñpÐ~hÜ—– e²r@Ô A]¬Ð^‘œH@õZGÙ¦’¦7'rŒsðŠúv§5J¤ËW« Á*ù`âz¹ÞV4Îb™œy>^>_<ùWožóoü9?ýÉýçõ•Äÿ<=9ãh—/¸kÚa™™4ZöÂë>¾Ýåkâ€~[Äë~‰O¿&¹·´­änsEa«o.¤(Ÿ½ëãëÊåûO?ü¯ÎA¼ƒßºé.|o¼Ó&Øô“Ý{ÙíµüW MŽûy­tø:O‡×'éêlv¸»ONBlÇöõø„›SbÕÃsúU&mœ4=-!€`Kk›kgF4ý뺤Ëïi†¢M}ºÓ«]IÍ™«=êSœ #`V ]!.¬År®NîMöçÎÓHt'ãXarA{˜^¹»™¯nœ‰$T \’&·ô5Ó" UÌè±~>χû§×ꆯÛä»->=ï6Lâ*}k±©ühp6‘@Ókb¦ÌPâ•4¸]´&ÐS4Æ Fذ07ÏÙJLdÂ{¢Ôt-G³ äØ7)™uã§E¯¹CÕ6ì‘"ÀCëi€Bë:ô.uÛy—¸=û\gŸoÒý“Ñkî~ÿó/ë¬ý ÷/ ¼²›wí*Ö<»¹ÚûÏ^gŠ­£Ê=C5šRc‡ýæëûjx õé¬Ûž¦ƒ)jUêúìjïCØvSBSÔ®G˜¢tñ27™1ÞÉôü^AAë}Ÿñ¶ºjo”÷šzž{®<ÏÇÛ“•ÞÖ„LJ™£ tÄ„Hà X¨Ñ4 ›µ ÂV†-+— ^;Ëé[ãºpÛK>Ôé©ÀÇR4°Â*C.>„ Áê(+ìžæö^&09ú¼Ø™sUMµ+¬Y©ådp_Ó3)±™‹5ªGލš5 @ ©]=³ àá³NHÆÖäJ-2ãxøt4ñöšÉ?ÛóYkÙ;à̯·?dÚ{ƼX"³ïAÏá1ÿü EÂÏ8yð­s‹?jîÀkøQf€z6úzqï_r?êý÷cöâÛãÅ]N©™P@µV¸D@`…b„5Æ.Êä7ö"‘ר:BÜ’ˆUB+DjR¢uËþt>Ù̘¬öh¹7ïW•Wì†9D:§3¦Ù´ÓcЪu Ê<Ü3ùñåûj²&Ëm¼…µE%(bµTç®Ò³c”°6£ÀV‰Ð€ŽûÕgª¸Qr^7ëÆ×^Ï%òwãÊOµ÷™äæ¼ks1 `,‹E" §‡M^÷oÆ\ñm˜¾˜ùÌ;ï›iäE5³gú † S`÷6HÊkùŒz?gG^7Éö¹5¿„ϮԨã\kcgp/þ{vvÚ-q§³å$n§½ W­0oÓ%\ÇÚ·—ëÿº Òˆ– ñ`HË6AáéË…Ë€Ìîés+°c"Æ@ð Ãb¨%èYáoçâC¦¹çv‡<úàê{ªšIEr¶‚½ÛŸün×׫BR=‘¸‹‰œ¿â‰†3X›¶i"ƒ"öídùÄÔÆsFÉmåOûõhéPv‡ ƒ5Ó¹Ùñ ÉSTãüéa>SVB€W%žFd$çIV͸)14(‰—èR¤ƒ"(…Ÿ—9R;Fƒ8á½ÞÒ% I??õ—Žùá1K“¡ÎêØ•r¶dæèìdx”tvwn4)÷0¯. ûUkÓÒ·³¢) I‚EF:ë@¼Åsþœ ýЊ<ÉWfV†åÜ";*ưó0nní¸1F2Ó—ê³ìCêv±q¤#D>¹¤–•Û2Õ€)A p‚’‘ØiÒ  ‰SŠàƒÛH+ ThXÕG|@O@:hs.=t®¼¾Ÿõ£e_ÜnœnÎßoOÎ e$’—TgÈ'a&’œ-úÙÊ«²þ †.ö@Ñ‚~ú‹ZùŒ”¬ˆyU!Ë|Á]ÅÒ¶ýDoI“ûÜ‹~”5[Uà0O°k•2¾úópÌ€O_“Ÿ‘e‡ìÑš·³f¨˜ØÞÔ„˜\‹žªŒÔ€’D€¿Ù¿gÒñÓW

ˆ£V­<.ª' &FÎL h͉©™>VQ˜:y2»î>ã KhÂYäE Fœ˜rºNW*{fi‹ S¥ƒ1œ&Òf£"v`ñ `ÐÞ0×E+ Ü üóLA͈ QA3†È+m{ázúY£,é6í‘w£Á}ÀxeÆo_gÔ”)ZéZ,h’~¨+:x¢¨ç Ö9’'Íï¯O¿¿ºuÓ”BÙýÜ»r×ä »Â¢R&´um’v55ÅïD éÄToÜXP %ÁÉÁÅLs1/F-Q}~W›x Kø üÈXd³”JÏšú,¿[ðéùÌ}cøA®û"ÅàÝ>»d”D8¥è'˜Žº™½SÞ#ÓmeffÖÐTN~ù`üú#¯@2C8ì› C*Šî£sPÃÛ.¬Ôè{ ÿ]§áõDÀ žnëkÊ*¢¬Æôì‰ÞØY7³w<{:ñ"~’iéYß»ÆúùK@BX¡Òž¶á[Ö„½“ù03˜5ÛÃÜÀЮ-Á¹ŽKoÜÕUÉ"é Š5Õ”„ y¬fœ8ˆIedšÁczö.ÏžôìÇù%«"všRܯ{U †u²z¤y?¯Ï¸5™Wt_aµd¡¾G§Õc M‘ˆÆz£1r’@:<®%`S¯ŒíÅia°Ñ„ÏmëX®q\&Ævrë•¿¸25¹%'Ê¢³bs@¥šŒ´_}  Í#µ²Š w,-"I4{lŽñêiן¿Vû3¾ÚžàwæÑ¥fª'z ºuõ¯·K¿e'×7ýïÞïî :qЖ6>ñ{/M­~ö÷5¶¨ªŸÚý¿¨3o¡vmþ0‘²Ð¸ä%ž’Um¥¤/nDO¼õjé¬ ðKŽ`î8hŽ”£Ñ*lÀ’Rn4*‚É•5ÕáÜè°s¬’#ØJ\NÎ@DŸ3¬³Ä×Ǻ9úg^‹j¬Ð“Ñïk‰mÂ+À™¦ºn=´1–W¤öynuœõÔc¿2dUyÑÇ3aÑÌÃ"ÇÎ#Ž×ËëŠ×6Ùþãø›ùçOPOã·Ïãs™ˆå4m NãëÎ/ÓLÇcuGÙ;;ÿ BýÒ$1V)DȰ|ÌÉa,^ØV²aàµeb1=éû9¯‡ë‚Ëä®Wû1žgÀðOÓÇKÌåÜÿ]ò½ïŸŠ&ü @®SKAñJŸPE?‹¾úÔœ¿Êím˜{ÆZ@ATi¤ä2¾uøãêôÒ#»ƒ=ÏÿX£ëoiO*Ÿ×Õk¥ˆõ”Ž‹a^÷¢a U2ʆ³²+פqа–¸ ‚„J‘ßX ÉQ½Ú EÚ¬*î×vmglWªœJë¬:Ǿ®yýÌzÒ¹Ä9‰Ï™úfÌŠUäŒrÙß¾ç8ºq®wæë{¾íåÿx>_áïÍÛñykœÌ?»“5ÑoŸüv @.0 d:1Ù?lVe±:;×iP ›ý ŠF¹»;;"ÿ®Æßs{²ÿ»HþG§\½³-9¾²yyÇ9—×”LöÄçã‹ܨ¨W4Yãl ÑúÂda²*;^µ¬È‡a1ã`´`Ü´q]‚Šæ‡tÌŽÃ*“w3«BdLqÊÖy³Î‚¯jaCÕ4è¹,€¦©­e­ô°žÎíû±ÂöWáM¡á“Ý.Ða9Ò/®3L¹ˆ5×ãÛÂOµÌ|/LfÍd7Ü_µjƨ©+Ÿ*ÞTK·¾/ÿn¯Þ©Ã3}hVý™c¥eP¼‘“Ø™×4wÖYv8GÖCÎAs€ÁFç[<£-Ãçkª+L(*^¬Œ–z0m¯Þå 52ö17Zˆà\Τ›)"¶‘iÛSRu’2Ž’¶šF?½‚ìË>Š”÷d—*Q:8tà“/©/.³ªOµbçVi-į¼~cpZƒªGBx¯â«»Nu}-~Ø_¦kÿ•©/Î)$m&à¥Ê£Ä‹Ó6úíž—Ìd©¢æ)ËýüºÛ|±4äØ X¢aÞËÙ]0{Y¦ù¯Ï5ûõjVòw.N]b¿b(Oé‰y§ÁDZ&ð;ä=;‡ßÍf¸Í$™_NϬaóe# SñÕQ¯ç¨ù¢9ÍÜÜë¼VÌ-¼oNW9Ÿ1ü8쑱¡ê`PºhFxó(CârŽÀ×ødóy•Ùyª¬>Ëk×å×,¿õ› 3³ƒjM‡Mš.X¿¿fœ¤ï=¿5-Óºç_Î×!¾FžÊÇÂa_K£B”T ”SmGcüáè1s„ß )ïÊ%TÞªWy‰+©$Ö!0RÙ("¢Î¬wÄ¥üa'u…£è%ÿ<E1 H¢ ‚H™¨‚æ™*±Œ¾@°rÁØ–isN’ .¢Ý@ ~D‚³'¡N®µÏ-rÀhô½¥O“ÊVþ§g˜òž/1Ù˜>û)˜¬'­y?Ú®‘_R¾§i}ÅM­ê8-Ý æ·èf ¡¸hò­9}Q5`ö×^§gÌX=5¯/u^ÚǼ^Ýø=jÏÊ×׿ž¯ö­ÇtÌXöÍÑðeSv¸ª»üÜMJ|Œmèä·²+°Œ§b]Çì £ø:)n–PLb•`ãI˜V3¹I<'MNß(S”1Kœž;a;‚©D"óé™Å¨¦hKkHa0À*Yp›rP `U³ \,D1¨ 8!óÍXQ,× qç`țֵհ kMT1¤ û÷`ÅÕ~nð* ¶Z3eˆMx4ÂÏ‹™§V ù3MòÉ °gRnÒKxFv 3fhèb:›x¼|²üÛ™ÿ/ï(ón·ã3¬M°-yáüWÿö¿ë¿iüLY7ƒÍs`é5µªì$Ã`h8_Üß5=æsûóký½K¾¸˜Î™–_§@ B -¤5Ã,ˆ!FÆÄ*/I'P6Bp®p„c€¸²< ì#Û“Ì Jº§ŠÇú®k'ò¤Þ2/ôc§â¶Kæ`dOaËŸ¤¿´3áœOy–@,ÀF$Æ ë «‹ç¼l^“Ô:U )5©3‰md«®¾C‹¨T³üg©?÷‹¾á}:dÅ£h):`#½Â–Ùm@É É•÷c; có@ayÎ(à”B´BIëªÂ¸†ý.ÌE˜Š1æºÛZ””µµm££úU1£6{£­¯–9T èe\K(jª2ä¦Ìp˜J$Ô1 (£‚¨B8‰öö|r±—þ¥8“ÛW¼¯|Ô?еŠÌ(®aDF£h¡à£²¡pÓÊ«—®gcÞþ>û®UõB ºìŽ›ëã•{uªgƒ÷ÑîótÓyúùë·ñ÷o¾ûœ›~øÇc>δÕt=Ê€oÁ&ìáð]Î@zÙeÍ0À‘­Âˤ]­[ψ<Íš =žg¦4¬Î/>s¦ËÕw¡WNSÀ̓”“˜É¤”l±%5X û@mVÙ…)–nŠ #€ÐlÑÊnRD! € A KP¢`å÷8Ïÿy‰ÿãÓûjÛ«ð¨¸Qe=ævþP¨C¼÷òß¼Ï]4K˜!Þ=xÙ±M“ÉÑý…îíÝé"²dŽxýâï¿q„žm;UÂçÒ°£2õht¿^îè¿èÖO ùí"«íÎëä“ A¡Iñ£(à©3æ—Ø|¾¹7s3PP¡ò|ë'kÞgÊ¢¼¸°|úKO)å®þF˜éÙ#¾´ßïΧÈ2]®ÄÑÂ4ÇÉxùûäb±TÙpªÿÀáÉ gÃ9=”¸™Î§µ¼ùxù¿_ÓÏÿ3ª´´ÃNEªo¹<‹ Ç‘ûÝŸRyhBçqžM'؆pC°Ù2À £!Q`s ¼ c-Ï’VÈ¥dk`«ô– 7krvïØÆ¿f³’½>biÝèüÙ¹”ÞËQßô`Üñû}¯úêoìÞÚº²ôï±Ðûº2›ØÀŠ%-ttF˜î_lÍ AÝ€ŽG³’é¦Á›ƒèw®(Ÿl¼ö£‡?|cÄgäYºÊÝØ®Ý¬ÕQJí®Æ D£ÄÙâæ:Âø@öÛÅ«˜»cý«×-P´`AR^)!³È<«ÿ¿æëD²aåµS²Ù°»¶}¯iOð9®ÜXè£Ãm 6Gáª+æÍ½¡Û6“2OEYªöïê×j­Þq´­YÃýI?ü‡_¸ÝGª'K ª"§ñéÂdùïfŒ#ë™v¿¦ù+ñ*‡Ÿüq¶½za#¦!ö"2”Ù` K\JJ¦Æ,Ä[/ûF¶”-õÊÿ<ë{ÆèŠÿ¬õºá1¹PCA¸Âký½W†ý2ÞÂÓ £l|ÂC2õêÓâçoA©?];kî—F~›MábÜ!„¼}cõM÷Çáõ—ˆ}fk<÷…˜á~{-Jô>a¢RJÎG?y4ˆ,Œ,¼&À¦QÑŽTŽD#›’4¡$`2 Q¿$÷ŽÌ~Ǿb©9Xe!ñ$OÆ:_:^QÊñÜôÊÞõ}yNªpÓ$9 iÕ……l1dtëk?ÀE~›åæÿ8íu¿³3Éú*Õ|´6’¥¦)âÄN«ÇB8iQ´J,6þsWJf¨@kåNe–þBÿú_)_ÑÒ¿?~úþ©Šø¡?šø@‡˜#‘µx_àFžÜ}Ó‘?”8JÅD$À‰<1)öÑվëÞ‰òµÍö»Dê`PQð45…9wEšÐl½?–_…³n¥à7}Œ?J^¦ÿ©Œ_U¿W' ºv×rm‚†íçºgLæ¤ÆÀg.“Ü"\•UÒKñÇ”ÉŸÑ ·ƒL{F(œs¿]ó²æ,äÑ‹8ü‚ráïÁÛâ™ðt ®úPZ¹Å÷ÍÁc«.—zÅ뮲–c1¸ë2¤yó2<(îj}L=}b>2›f­œœ7ކ ùð‹_Åj÷VÓ©¹‡ÄL¤TÕ4Mѳߥ̉YÁzÓXL+Ñ”cÚ¾kê™1°´ARâCN¥5•ÃQžçÏaÞëƒó;­¤eˆã¡ý^ã!oÛç”.-£E¾\¾‹=Gç”߮ߑÝàÀ(8ù´•Gúv%ÒÖë{ŸUl_üŒøpÓÒ$lŽG‹Ì tê AµûÛÅ“ÅÏ— …²`ÈÉ䎜ƒÚœÏ†­úé;Z¥eTLjÇ×}téÆ(b´¹ >_³÷ð¿Ëöy¹yNŸþñ¬?ªLyší? æÒ3¼ÈòÖá=wc(2?é¼ëÜaxpw^öüäÜÈœ ]Ä¡tŸ…wE¹µ =Ó׊’ø›ç‡ž¾œÊD¸ V† št;åRði/ÍéÊñY3¶AÉfn¶³/ßC¬Ø¾bV¤'|us>™¿5{Nëû¾Bî}?]\ó|}(ýJÒ‹U|â'y›¦µ¢0Æë T2Ü·nÄqYǦL« ‹âÈé­@üˆ‘Ò¨I£•…ág(¤‚8HÆ*ò} +3ëu1VÊ× ^”G8ÇÀWj÷6R¹½Úö•ÔéHEÉmÔLh•FþÛÚ˜{Eþ¤§àžà}¾×Bs/˜Ì[Ú[Úci.£›Óœ.0v°&ƒ»’}Ä©öÜuÎ×wfsÞN]@ñ† ûùDšÐ‘J2*\3| \ƒË¦@ºz_¥>nú~fOºBÊ(’b](wÒó¸Ücy®òh d}<©À·ï·+ÝoøóÏ^ËlTý O .í­{„,ؒ艳Í:ý?ei>4_iœb˜‘ŽˆÔ®HI'XTG’£ T†» …aƒb§ÁKEV åjÁ8«(ТcM†"€`‰’ÚU¦d|VÛb Ëï{v\ÂÒ£Y EpÇ¥©QC‡1¥—xhÏ:ð*¨©é×é’ëñæ°é…j.pªlOçtÝÿéU޽ž¾”¤/¹k\~šMWÿùûù—}<·K¤Lº]Vò§ÿ~þÅûÓ¸#¨ ª€hgóÔ!]`¶<ô§¤ð ¨}À º³ûžù¾6|ÊÎa“,jƒÞ€3IÀÂÊPåA 0fk±q»\©ì‘3$Å‚ E‹’0öâÏí®*p{É,@™°aâƒÜïàEî½”k?§‘F!S02“L_í:À/õnâé½Jï†u7ÃCâ ,vC[¢Ð;åMHX ¶% (V6fs_’"6`e.’ŽZŒL kAÿZ4Íbg¸—ÆY“tIY(5uÕ㟷’Ϥ#‘{d·ê=Ñhw//Û‘' U\°K¨µøjy½¶>~¹ í_8d ÷1â»kᔤ¶ìxÿPäÁÝÂQ¥• ) †øMæMæ•i·9!Ÿ,|8äYŒþ(ð­ãü‰ˆ+·ï¡2áXZÇ¢ïòWþ›¿Á}¯[ºœAè0"Œë ³AøpDCÑ¥PXEóÖítHøp°%fª;¦7g—k{Í&ß0=¤ØM`.—­ |¬Ø”¾ÜOSBHò¶6Mì³ô}ƒ"¸Aü9 WGß÷ѪF]É@LµGSGP ugá¯Búj} ~_ʵ£3UŽsŸMà´Ù}µó?Ê/ þ*xƒ˜j–Cv¶Þ‹gyã6“ >¹üB=¿¢¹Ÿø±tAÀKjXœW¢V¤rN1;õn}´ðˆZ| ~a*4óéäGo¯°o/6¤´B¶rðèë®gí½ÚÈuqÞ_œß™A ÜΫï»)×ʞꨧê†vHQÅV°Ð̲ÚÊV¼Chª÷j­·3«ñ×Ô›Vk½êºÞª|%fòëxjhÂ1â<êÒî4 "¨(*HÀoŠçóý¹ëóÌëíž·²¢®\¥PUëÃ(ߙǾ?ßxŽò˜´•ÚžžÇ6¹mryt9õpqœ|g·v½)¹,-UB0Ǹ˜Ç7 Rõ¢žgä™ÖÒ@QÐ7Ç`Î¥nÖöÇþÚZÝ’glÌb£Ïþ>(hËœšôý¨á”aé>mèjpd{ï’™©©ôØÍZ‚ u¶•Ö ]€@0ÈB `%7 ²T}¥†S/üj¬¦]_d«ãÖzQ©(ýЊô™SfòXóê{Ùjdq £ –H ©Jᓈ5Ù`ññ5§»WsC{Ãð9¬f[Êï´þ¯ßçÛp5cÝÃyïF ‘wzk­mè½=Ö_n Ç­¢Ù¥B–#»LµVzßøóMþE5Àí–.«©üèë;èk__½ñBP‚ƒNQK,g&r˜fu‚¼ÝêETöß-ýÈi*ñ–qוK_Ê™05ÇŽe|5jA$ÝOv©u¡ë#5ŸX'JB±ùhx\ØS¹\düb´Ä°À•hÁ°ðNwÏT2i(¦PfxÍm1TÈí.EãÆê/®tM lÅ`£XuRÅHš”¸}b£óâÀF8ÓZXÜ/Ñ•ƒ*ë¤O<ðÐÉG%»‚=:íé‹R7do)îbFX¤7¼üKÖrÍü`MG÷ÌݳßR÷ë\‚†Íô`ÿÚ÷}v~×íÝ.ŸiKÙæbõ­7ƒ7Õ“jWkÜyb¸: [ÿ.MeZ„ˆ,IYŠ”|Ô˜­hwH›Îѧ5…ƒô‹Q"¢†Y HjgñØC&âdÇ.Erd» ½«:^aÔô úljžýö@,ž?bÔìý0•j);Ȥ`‚^.†% #J`Ï-7Â-á[<‡PššÓ¨:aK:°§Ò L”:¬9’\²S4ñ{#3-›=§ÇP>h ?mý æ9Ì(ºÙÃkºCŸ+x?d–-ΦÍtë°UOJ\éò¹Õ1'tÎ>úŸðO·Âܽ4Un©Fua0s RK°ÙÛ–wÏÿ©e`¬eë² Ó.»îºâ ¥^Õvú9çXPäÍ{ý «ˆµãAPòbMT´rŽ£A ¨ÁálPÁœðíÅ٥ߜIÉ1°\‰o\{«+²uÊÙrʺ'4úñX¶ãŠ"t®¢Ê6=@aH Áºˆnè²aiè‚ «s~{gÿÕo]ÿ¸Ž-äˆ"t¦‡¢ˆ/Ï­¡úÃW> fãøùõØç@L3Z¢Ì„‡êmÂþHJãÁ‹õuç®â§i\“o‡—âS­5€vå² üñ|Fô³7¾„¾KÎ >ºƒÍ¸„ùÒ õöÒÉéËîÝöžo.æ°Í©g9_øÒ«’5f§ntÜàÅ3-ªâÎí\v;ãöÁû|îm£à»öŸî ülø‘ÿX7RŸÞ«ÜSÛ ½øÑ G?í_ÿé½øû{ÿ(GþµM›Àc(Úÿ1¬‹]XExy©lŒW³ßëÐ"þÖþîRþdÓ~åïQ+7Oëxød³ã|ì–ÏT´¢u£Ä<ˆ†L$êŽ5ºKÅbÐ8Ì[$[¦+Õ„`€ž"¨æH+\Myß ýç¿åp`c¬è->ÍØ‹ 87‘‹)ßûìIf˜»{÷|+ã=ú—0LB%ìDàká—†³ðF’¥> •\ñ“}=¿è·Šƒ½WG ¯JW óy£ /(Ko¾úzn§æ2'Ý}µ’ØhÕø…ðl% ‚c{÷Šùç=o1÷³pf}y³»—Õ~8ýòñ»Feº)ÂŽd¶ç8gÕ×¹UA¡ë„éó9ñD\ê3|ûIïiYPš g³YøðçgO¾\·>‹Ÿ¦V…wñ—óØx ꈳöÍoü]üìç!¼^w:îIC)},9ăCƒ¨‹OÿYy¶FãÆó¾DÂmÎl”I+Ì¥)$$R+Pj]škF\t×þ, ”®@³ó±&rv…*lßlo[§àé>Õ޽ǥíã­oub­I_x›ãñm~Œo³‰sósŽ×-®+qeWå’ÉÊóêu9RYÄ–â?ûÓ,ëÛ+lã>ï?öæ3s(x7¥çÔå‘ôÒ†½x4œÏ–Û"ded õC÷Ö~¸ýËÂsHø±%wׯɆæ¦@D D{eGL O›È—ç—ç°‘÷¶¹O»J}¹˜\'8A`ôBûüý×ÖãØ|†êÝóŠ[ËwŒué™Ån=|5ªmMáÿîìc÷ÏÌ—KÕºìˆ,È;îµ~6©Ç©ƒV«£ÎÖàO]ÔMFÆZûõ±KÏ_|þ±ÞUü\ÁKtüâ‰'À"$DwlÏñÉ%ºW§åÿÀÕggXjŠP ³¥¹ð:¤®S31°Ò¥÷ÎÅ×[&½ ŸBaEˆ£ˆ²nwO¹VcÀr 7+¤Æ°ÞW9ÏCÕ1ÔìÿTå+n?º~Ÿ§gËÏãú¼V«Qv,uâ¯?£w­>ŸC-¼‹L<ùA´ªê^›©÷¢ófÞÖƒýØ]oitëtZ…(zŸÜÆËä]ùQ­ÒE÷Q0 + âLqÊ]‚5ÚŽ\ÿñÊ÷iÿ.ûÿëÑá§ýÿ¿þ—çüùÛ3ƒþœÏó­‘T†DveJÙŽ ý}ÏÝîíj¸7æsßzÛ%蜓 ³·÷¶çÊU¦gf ßj¯Úi–»>¿6¬¿f䇵 ·nÂ]’%§õ“ÄcX—Ïm­QÂ;°ŠM8^ÍnᙜARÄs–û§¾þ¾Ÿû¨?¾ºsŽÃyÌîûæ!â\FGÙfઑü9ªF¯_âk㨠bª´6f ¢ôÔÌ2–eœÁ"CY¯•ˆH±"‚&‚ˆ™4I_5“DÉJR]͈3݉¶‚SJ’Ôæ‹ b €-è1›­w¥2Çúã´·¹A{¢ ÍeΠט¤w»OŽß¦™‰Ù#kÑK|‚k8srÉý"ûÁ†’½Ã¯.ܽ&¾_ÀŸ¶ëÿjÝͤä8+ËLq;÷yî{íž7ƒ‘qeËsžÛ–¨qJ$ÐPO+ÃLu,CÔ$ÇN4âºãTáhÈ,L‰Ð?±—ö[œN™E¢ÙëÕ©2«?8} îÔc²xõ1sÝžMH§HJ†ÆÕvþ`‡þ~^å‚]:ÇžÍ1g/ß¹²ݘk&Šˆ)Ùí@AAÌlÝJ`Ñ€B2Õ‰˜Ê "iŽ1"èb1Š`bG‹€pŒ€,*©` Æˆ»Ð©ú(#B1iM™Óš.ÎÈÑA•@qÄâï/OÜ:v@8Œ+- &Úc€âøï¤½Ï͆_nüRÿVO‡ŽèaK—»óE>Ç^|‡o¬Yé+¶ydûî݆8y¸Þã¼ #;z²óÔ”¿Ïåþ—§}ˆÁ+J£ÛßÁR” ¥Äô ¦#4p÷såô\$ÊCÐxE›£ñ Q¡{:ÿ;r§×÷éûy©ÿc0¦Õjã ÈIá¶œ~)¯1„ü¨,L úö7:Öo.[ò=õ:v-žz[¤77›N”×¾‚}Ë {êqº½=‘ân®ÂÑ~”]EmQ%•x›[Ÿ^¿1~–êäÕD„4ȆÚA~mAÖA’ø—ÍÌ…4Xmƒ?~r4¿jKÖcäðÕEm‚ÿåð”XÃþ«#. ¸–J(a$Mq2ÖŒ(~|]IÌmVÕ×ú·®ÝÏGÅÄ$`Ae*¤“r•{{Goõ6²vàöEK4 dùÔÈG…ëÕô1}‡Ýs%¯‡½"kOûßšþ;¯tzl¡´Gp©2:ÔN"@aJÃ-EK`ntËÙÂÈ(†¡3Ö ýÕ¬…uŠtˆ¹Õ¡ 5^“Q-Á„5«x1T àÄ­°Yñ …Töóüõ›Þ>1?~öZ“¾‰%,JY‘XôƒúQi¾öç^ßGÏ}óÜßí×ûe¥’½‘ëé9ýð¡;'ûvßã‘ÌÛCäê{MØÔ[šÓ§©t(6õx–^Îü°¨,ó"ùBîš<IŠks$÷øûâ¥cŒt«HÆlT4#Kù¨*yJ¡4 =?¤TŒÜGîY»’ܹçÄ/F'[¦‚`m|„Þ–Ñ@Í­æPØŒ c¶MZLTB#‰`‰2Š!_ÉU]4y_9>¿›>f¡”aDy™´Mê8š3SLCZ1X Sàìà|Õzeùñy7Ç÷Çô:›)Ρbz”Y›Äô(²Þ8€8u!¡ÞP_ŸIa"Ë|þvØßß\{ÙˆÖx`¶Û¸!·=ï &]v"E{èBÊ>ëînîQóâîÊßèØ/ÌW°Ñ†rúoÃïk&ñèý§ÄWh³Eο1ûèÆæb,bçI»ðhÿ‘åmþ¸g?{0‡¼*g‘?M‰kooÄÞyßa­¬)la”Љù#Ô5;.­|2«¬-È ©Bs¡KAˆ£‘}XRrÙJìî½ d {ʬI!±Æb’Ù 7Ï} 9P³"ý@A™¥¨˜©JæÄ`²¥ž«ß¥Ô²¤ÕÌ‚„Û\S|(<>'4¬´¨C%Oì9yÒc– ÛàAAÛ¸—4¨(Mü@«¡‰gÈ+Ò>ä 8ˆ²Æ·ç±Èý ¾Þí·Íwîºÿø /7_½æ\‘Wˆ–È]ïqSð Îà‹5?7€ZJq²¹©'Œ…¡G#¦œ¦àCûo JB9¾1•»º1ŒFQ‹âbÄqÃü¹ƒ¿öÇØÿë¸÷;Ôy DSJžE·ãð=¬ :eëðÖÈs!E™š1™ÉÚ Uæ0€Ü×öüöO„÷æÛýOxcëªû2l£È I´k;K2?7„‹k ŠÐ‚¤z`²«FꊇJÀ&^+„l¢„:¶±­Ä—sûsÛoÒЖjh¯=©Ìœ·Û­dVƒËP–'Ÿ0!‰<»ä¸÷I•ÄÓu/håÑÕ’²#X<³1ù—£²$Uù-T›@Ð9žßàzÿÌöÍ‚†Q„T8 FFûVÜË‚ ¼Ð ¶±S–BH,˜dw/ú¢u®Ò§bÝq¶+FpѱÊ|~¬’KѱžÁñèLç*)cãØ­ S±xWKëJo¾(‹ä‡XÓ–€² åǽ™HW€0,ŠIÛifƒ±ÓQq¨+F¸á<³kÁ½ñþU¡â-ˆ—ƒÔn¬Ó|¦îöòçÀ®ûµÞÞÊç•ldˆ vY66».[`Í ±l=ªb!>­G5zò«õ¥ÀºÌšçÐKý€'<6·[á¨h‘yÏÁ×μ±ŒÞÍï{GLv›Æ2{£YÚó:úëµæ#„°R½Oú bÓøÐÁ@ RY´7_\ž±óÒÀ¹›=ÙºÖëøåìÍ_rþ$JÐÆoûÎm_?º¹5DÓ^Ù¼}ï¿ý·¿y:‡6 ù» CÈ2— @½*b€-A²äùÝ3L×XOX’.‰üëÚ¿¤ÕÀàçGÌmý‰§c Éa·oÑ%ý ‘æg9ÁKÛóÙ$D¹|š ÛB)À#!qF8Ý °@Âm„áMÆäÛBOV'Ï…¹W<Ý&ŠL•8òg_øÆ¬Q¸Y¨lðŠÙ”AûKGÌ0´™wŽË:ÉpÐ äLp‹ÞšÜYìݺìPÈó„=Ûtgé›§û4“0áCqÝâE‘’¶é7¬ê¶ÜgsZ’䦢 {‚Y­ÂŒñÍ~@L¼ïÔÔíÌÑÝOÊï {ˆ¤1±£˜+ÁfËnž.,RQÔ]Z曈´³dâá;¨2v?W{—ñ)m‹íc°+–Œ…¹âçgb­M·ŽÒ? ñz畵oó§y÷¡Ö[ÌŽÇió.ÇÎÁ¡uNK¥~)6¦–ê<ëÞô8^ˆÔl²,ç„_HÁÙ蜃 ³4KЗ Wâ‰ãEž½)|ÿ@~;½ª¶3JÏz Üp¼ÿØÞ“7'Æc¹ ``D^Ò ÇhÓ%ŽpAƒ µ!úX>p’lK³ÖJÜÊ…¯Zä@Á‹½aÊn(~ŽÜÏn?&—Ëê4°8ŠgŠä S:T£UC2’W*muäšâqÐÉ è4eÌÀ`6¡ðügǬغáhÒ()x Q#îh“Gn “•Œ¸qÛäÙzÝÚG¤9VÏVQt×%: ³êšìAZ~±Ks5?ú*óÒ[/þ°CÁÍë¿Û+J[Ÿk÷ERSnrÅ}6¥™½XsW»â[;æ °bfTÊ7h_“Ñ“èö«ù˜üžb™»ùo^ËÖ­Íêä=ã:þ]i•ËÚLÞ:|‘å~ÅvF?Ðû™cP$‡@˜ÛHÄ0ÈÁ™-èòŽðSoX|ùbg´?cTK»ÁšHhRS´ÒN$C´–^xz´üçÛérOwCZ,ÐI./zEßH3QS‹4<®ÚVgn›U“(*,ØuïKóÒ•ÂM@\¬f “XÙ‹Öc:ì¡…IDêˆdD}Ò{øŠ\0‡_,ù|.Ή15.ø–­Ü$[M •!€^$Cƒ "`.ÎðDrÉ,w–8p'ÞíyúïÜ0\Ó«­ÉZŠ8çÉd? íIŸüü|ýüÌ·ÿ†Õc»®î§áG,àÜÏñ‚ýxõ&lp°RÈwBgµÙ¨ÕNüÅjvþôYDyr¼… Ÿ'ùëyÿrƒïØÛ‡~ó°¥tïPÒ®qßé;êçY¦WaeÓíøyÀ{g¿Cƒ9×n–AT¶ÂÎ2¯÷æ|þüvµw#;ªð`gó½þzGô.Ÿ§w‚ž…¾ÞYË÷D±sË$:¿ÒçÍÈį’xYij0›`ƒ±²ö´®b1AÉ•W¤8x'ZN!€„XÆ€‚ÞN™ Ez¦[-Œf²€XÕYÔIm²-°¢Då:<ޤËi®‘$@ fÐJ¹Ý <Å-…%*‚fÏ[ô>ú´oO,È[¥÷¯Ü±ÂgÇwÉB0¶?çŠÃ1OkŸ6÷ÚËpŒ$ñO°ñcƒ÷ûÉê>uÐųj§ÔªçI!MOi/B§¢âS¸©Ê&$¹†t"e)t‰ÒõÅ—‡v¼Ñœƒe»§:D{[¦ôŠ:¡vØ03€É^Ê>GÜú>` ‹Á]u?#g^bìÑÐj~I8ÿ´y¼yUýÀsZީ΄9šFŽ0D.ËD­—Tê¢(Žq~¬Ô¦a@+Vdb7bj§YTQ—JYЦ •Á`À¢µÚ šF¤Áš®HE ®Œ".5檈EQÍ º¡hhÊì ùÇæ-('¤ X ½¨cçvjïF½øÃè÷z´ýr»·ûÌŽW¬mý¤–vaYùk¸Ç7[D"F bÓþjsMgtßxçs>áÍË\˜|~·çëwØóÖ]k‹ÞÂ?+ßå#c0™GüT¨zªÍÙîÈ;CüaÞùµú€ t¬ÞvOŽÄb,„ˆ féæy»Æø“œVÚE 0’x‡@!fMèxîÑ|}‚»[]dÏ–g8§Ï4ǶÌ,AÛÒK\ßÙ›ìýg³²ax&d„ÂÛÆÂ·l(J©±aœ Gë“aÚQcw“šA®Œ´I¸¬b9OFø–Þ¢Ž‹šúÈ«Ô` ‰Ûª«y ù¹ÄOnüâ¿ç:ãCô Ü`.4Ä "\í” šN­¤™Ój’z1kŠØj ££ŸÊšèFv²F·Ž_i`Ä?À‚pÒ.ÆÚY>§énlË#¾:ö †²áH4<ÙG:Pò7÷û‰à˜ˆ•gûäo³×µwüÈ+ëŠ —•?ÒØ&Ù’^Ânxxpü2óJ÷ÿhvD*ý`Úq“°JŸºÿ§ž—öÅGŽé#_!yЉ^Š•øå­Á®ð&ºÑ°Š¼¸†Ü} ¼Î\u7YÚUŠGЍ‰’ãâWóªˆ~5Ö¬ã4ðqèOT’+‘Àˆâˆ"|y²/tØ©r¦ãª§–WðµR*ÖkI» ûÞ@ºGÙ÷5~kKÌפÿŠâ_PÐrÄ…ÑPÜl/Ʀj‰ðÙžè5d4s’šœ æ5â„;¡ÈS‘S&O'îKzé~uû™¾½Í0umgÇ>vÆ~±ÇƒÇ¨H”´ý_‰ä3÷š^ÑÓ½Yw¯Õ²31ÉtÝ0¡Á’á4†:ªTe íªQk‰¯û¨ç‘òìt½ufJ»Q§ég%@ž ]‰éÁѵK¬cCAs €§¦GtP7†oZ;ÈîÇ +W€’&œóûBλÒÌ;7÷N3PV]SøÀ¡ÄôìûÙ?Ùb®õç™æ¯¶GÍÙrmuŸðØîõYß_r¯ëóù ‹Ð8,Ó•;ì˃·&ýzÔ¡&€þ1w¨Wë/4ù݆¹\>5HUþÚðó—úð.縮ûJñÏn³ÜêÆh†`úU6Îí#£ n‘¡:>N°ƒ­t5«#ž9ÆYKmYMÀL‡ Ëlõünè³QQ’0>¶×A™± 1«pCA@Èña!+ë˜&cˆÁ!<©Â*-î9ïk…R)H€2_Þ¸¾6øtçkg{;Í6{±‚iò\[ëõ˯®÷”B¢ºY¡-ešöõ‚&¸Ì0í`\à·òEéDÀðHôÅ2ÉmZö·Ò’ñûÔaKÀI!”Óü¥×~]”\ÆMŒÐpÔeCEýy§VÍ'¾–õ†Ç-ê*ûÖõu‡yúÆ¥2{ËL´­^Ý}=韠ß{~t i€Q3(5“ÅG÷bµµÊ׆WÎ{8B ÌÕ¶€ÊðµîÂèr½H6(H qÊ ¤a5ØnÙ¡(.ºWÍ>ÀÓZ¬À†@ØÅQ& ~ä÷«ùÈ€mÈŽï›®©ÔÉ[áäèbÛö=ì;ì”^—5/•PÌjzŸ2@ MCÌÁõ“?´Ècèg`¢¨a¿”“‚„0XLÛ”`F¹ÁK½ÐíöŒoN´½—ß,Û¯ë¢çéqÊÙÐ{w, mPøáVÇܘ(^Gd,MÇwmu+‚!Gü†‡ƒ7%¡ª¨+@Z»g~ßÙßk;¯Þ¬Oýs—ce?»å‚7D‡‰ÿžÆ±ö¹ÿ¥OÉCeÓDîúsÒ«é.IE™€ éI#<)ÉÈ9ײx’Ö;ÄD\JŠÐ….½‹gÑZÌn;¼gQ7¯ˆÖFS9!ú°lwA«LV×Sœ»·>À2ÒWYl™Âì˜Hü§”KzªâÊK‚¨Õ橈.‚w…÷Ÿ•œ-=ÔgØn»„¡)!¥ŽÏΠ»µz¥'„œüŽçáyßÐY/Í$_·‡ºrv*ëÛDV÷-ë3Ð/t¾…/äĬm¸ÚèIÝxêÿüFö…dý7ç!Í786E[–!íä›mN6æ-Ü °2Ø!QAÜ/™#CÑô!“‘èF ¡ßE›Ì0ÇÌ‚j¿î¼Æ=Ó· gCÆ2xËšY!º½r3«ÈK<ÑAԡן£^i‘ìQo>HA£¨¾é8—û¹/ØÈȈ TÈDý¢ß§pVöþýýžÇ8¼ýܾ熩dB õÐ •ãU}§ø‹îüîbÀ±N‘»hº)­(ºß}ø @÷£(@}5fú†w'À-jØ@êl¢e‰ò¡NÝã÷¿Ã{ŸÖ'Õ¼ÖrVá–ÓØŠ]ˆ#µ—å˜Ãj¢WÍtº©þ"0{”ébü’Äm|öqMÍZBÓ£e¹|˜9ñ8ÕË35+ÒC¸ÝoGíl§ümægðw•OÔ£€O—EYF;ñºØnÿ›j¯{Ï€~Qb»¨ W“h˜Ô2a`ì$³kÊQ¦‰F Ù‹¡Â¼=‘_Zí×7÷×›Ÿßgâ—ÓJ1Úam+ƒYP2"îV­UŽøaÓz jbŠ8ä \³õ£²gÍ—ß{s„žE¼°£B”2Å“FSPnZ–Ã*ì×óåŠõ®s<¼þÝ0Cf·å°£m¬=kùžÃ—ó?:ÛZCýxßMÌPºSÏÈ­K¯ðn_4eêÆg/\|Eq‚9KJìSj/7˨[¢í\1Aö^?Rì0QA´\c¸Û ÏhÛ¼f¼Û^rÿÄ%† B ÎP8°õtØ9l8"6ÔªN,bsLEƒ~uy ÔF`á#^^¢¿ºŠÎ9æËÊ\H`h;;•Ûuí|ì°›ˆ'…±Oãâú@>V|~ªºò®IÍg+¯6åɪÐDr`ËP|.uêp-„B.6«€d¨kµé«ì|Zs­ë£I4­ú#3h6qEq7u{ÞËŠ•r¦Ü~¯­ûAÀò3¥ƒE"„ÄFBÌea-T…ÎЇ—œA¾$²3È‘! ] [ZÔ?¦#K%… €f)˜´ò’î±T+æ™{Z–A?X>8­…ñSz7ß7?×t%ÌrcE"²"3lùñÔ›“½fC?R„ZîeJ˜†l€Tµâ¹9þùØù×\;E¯/zýé÷õŠýñ\+Aú¶góu•»?“üôOÌöì‹M Ú=òh»¼„ÁÔkKÎÎAÎñ›ÞooööîÝ7ÝßA>7ôÁßf¦ÒdˆË…ÚÙÿjþ­×ËàW!Á½uW‘ùä Ëé%Æ‘Óx"íÖ^õ§I+¹ñ m˜c9 ²n÷ô…—…‘ÌvyètvOˆäêv˜³ GÚÃæôæ Ò&ƒYŸûÌF;Â<—±‘`ìbQ%hÆ!î9Á±×ZU¤èˆÛÀ‘ЕFw¹‰)ÒcÔý(¢Ä›`w\É<  ®tD 8’&†Î©Ùœ ±«¢RM[ß²Ïøú'¹ÇÁÛùÍk)³(¤¹Ý§ÝUWñYÉ­ô£9XØè§Ï(Õòõ&rç4©N¯p&!Ǽ>Ko+Û¤!ƒLeÕÙ-cW4±°FIdÐXX;é)Y”ËšpDµÐ¸æáÓ1zXÈ¡¬éè½)ÇÚQ›Œ" Dˆ’¦Xå”v™y6¹[Ì–Œéòf­ÜóÛïB.ž)|½¯¿I¿ýò/FåSøÓp Ûy«$àŒ×pq䘬Ènðì¬ì]Ú<»aÖÕq˜ˆ¶&U­ jF4ØJÓoÙ¥nVr@€†U‚M%Ç Å Eö ÒFÅ"LD²D$Ä&kM2"Í3©w;jXK©ƒ®á nœ ì’–Ú„¯ë‡È–7®W;tßôç³AºèšqÆDLMƒL6xYR¯y5kûî\͹¥êÛOÝÃMÉôD>ÄŽ¹yçøŒº’{ó³½½­/ãqJ/ÉÞïÃ=°À@ PAøPÂOu»h.AÑsQ}î¹OŒª‘j|*÷ŸÿΟêÑÿò¼§KÎm±f˜œ)’‘§Øëò¶W‹:× @’)§·2:…QD¸Æz¤-i”ÍÄŽ+nÝ”K±>˜S© !ÂjouúT.tIq˜ØÐ C°”´¤ð¡u¤Á… é+$¥&^hHBŠ Mò“Ø/ÿrV&óaŽîá ]¶öt¤óP…ümÌU ¼‚Ę-("Ög½-\4]j=´÷[|½]FtÚƒvLQÎ×íñníkOÜ<H5ü¬ËYÄšžŸ´ØÀ"âºãrá†3«„½Ï7_ä>µS8mÀØÂ=² pf:ŠºÕº7Eò-&Jž-éáwAtôÄ=%­è›Œ ωY#-+0¹6Š[‹4«e,[Eôå¦h[tÛ½OiX…@bÝó–Ç‚"ähˆþ‘·žæ—+)ÈB}øwUˆõ¾/îssƒÆ•Ic!/°i"ô%eísµ«×žþRÔ¬0…üÆhO·æ£Ôks‹õik~¼ 妹›Bƽš‡0Ÿª§ëgpQK/Êœ[ÚçRn“± ÓÙVšTIer‰Ž]æ…=—£¼?ç`GöfôÉÑ~çöü¾P—~R-“Zf{רbզʘyì)Ó^á¿X­'mÍý`TÝ  JÏÒÎT“ I6îgZ³­®´µT±†UoqW‡ÿþ#ùùÏ›ß>ÉNÝ]ÇµÄ #¸“»Cq˜!,fÎ|NW»‡ˆ›é»+`í¿í<$> )^×S®ñ~M}ݽ¦…]~ÃjcèûCB)t¸¡EÝ$ˆ¬ æž»­¹«”á²ÆësW›¬3{[ïmÌ^óÑqÊ;D®eÿô‘õ€}wŠ’+šÁiG”)5ÜüXÎ×»:÷JµQ^°C÷ƒIçÙ`æXñ`Í9’®“dòüý £Æ”ë­“þ÷ⵎÉ@…oðí#©†Éq÷>¯|m{Š,þú†v&Ú.]ºÒ¤0¼X¿,ï¬ÀKŠ˜B  i©ÐK, CØŽBÓ!Û2ÌŠ,‚T úhˆÎcRÂDyŠˆPˆåS´ŠŠ>Ø•¯ . õ4Æáí#öæ'GÌr˜¤†™¡´Z–­Ã}¨ SÇ¢Y4¢ ´D¶Ðq "à°ìºÀ "Ú_S½§"¢pK^žÿAXîâ/Ã^½¦RM×D½ùt4ÔðªÞo¾ý®õOÏÊ?õ'ëÞ¹1•ÊkIØÄââåàMó†ì–d³C"«L‘„صHݹ ÝËÆ6(Di˜lCÈ6ô-YÿÒÚŠ[ýpÌ'Ρò§…m\|»E oïag¹¦Jy/Ø)ÿ!#“L‚mö’”¦¾¹¾ýìûø1~É)e‡Dënq`îjÎzˆ¹ß'3… ©z-3$ÛL­p-´µýîN˜(Њš¥õÉoëqàíí¡³Ž§\#vÚÑæ#]ð˜Æ Û:Ü‘÷Rª¨ 5ã¤Ï#î§êÃÙ=ßé.Ÿk`Ls=˜ÛugÚN¨¡R€›I­Á«áªÓZÿôüîn¬ «ö£¡5îT”Ê[ÂÎàxD#¤­Pr<}UnšÝƒT÷ZJ-•€JLÙªÎôT8ð·Z׆œ˜ýõqí¯¿ ²´f®_§Ç_Äé©ÏYzu¾Íëéëh¥,E*ŸŸ¼‡îodç²>X:•LUöC[Eè ³/— §öÞ[›!éÍûiØe6 ØJ\ÃÀ,ûWnåyk9ÒÓªq¶µ-Ê.ÿû௠VÌgùzäf&]“ +ž8¼š£„-d‘}öòù±»°v)H&Œ–M‘B*Å 8Kp6Í„×g ò¨ëÞ"nˆŠÛ{}:o ×ðž’ï;aÛÔhŽÊõFM’ko³Z”Y퓦 z­»@K-§Ñj©Ùe+ Wš@j­Æ}ˆGÁn­ ‹[ò2$+ìi:L‚°ä@h@` @v#¶ÕÛûÚñï®ïŽÅvÂ'Æé™LŒ4µždÕ:e¯†Ý¾Ù³/:È?Çm¦ßh“**A²0R£è+Â5íI?å‚bƒù»Ú÷ÚúÖ‹u¹™àzôù×ë?»žþö›“?ì¶ ¡wHy%P[éðô|KÆ ÿˆûAVdŽñ¾~Ôì çÎØDÚ…àóÏÀýto•½ãKä‡&ΦžÌ–ûˆ%M‘ºÃÕºËz6\׆ô®³t7ødeÞ0`«¸{zâ¬ò ;j·Õñ @Ørõážíòí×éÝÐ]OÖµìc;ý1¯É´òð#¬àì¼ûŠ¿}nߺ¾‘îGgû«äñ0oË!¶KS¶`@ I’µèÍd`ÄoÓÿ3ÞÝÔ¯ ¥‰0’`zz$.]eù¹¦á¶Ãl‚rnQ7;†–Ö©Ø¡üƒÅí’ñÿWcxa-ÊYRäK`«žÔ/`ý‹K?Úè÷d1ã%¦RïÂj ¢}Ðr¼<DB¨˜nÉt Óím~¿î­¦Â7Án^8ΊcîÙ­lô0gÍZƒ‹´—“›ÊQ÷WÀßÙOôvº,' ¹ ù‚ÝU–Ã1Ýë/PÿûV¯l Ì2°Ì XxtÂJ( v”–0æyɨ.™ÁªexL¶ P,06t/c·‡6B¼óò7ÁEÞÜnQá29G‡¡ª#qô(™„ü—²WŒÎƒ°U]NÛ€dlܰ(¶á^h]í\ìžî§‰‹À4‰F’ŒÁ½7ýã·Øë÷Ó—Þâ•\ ¯§›X¼È}¼!T$äç_\|í÷Ï¥lþ 3æÇœ_[Þv£"]4$ZÃÎl½ú›ü‹¬þ³}µÐU‘¨!^…ÐE𬍯D‹¿\x€£!Ë`¨å«©¦Žß©’Q+ÓÄV74é.ãGˆ'ô ˜_€`Bˆ+¶Ú2¯÷‰}¥~ÞùÊôçc{Ê¡6©ºã°ÕyöÁGNx*ÚOöÌ‹Ð`Yª‘,ÁÐ&›3…×j„Âd…:Ó¸ S²!õ8_¹= NUÓûÉó–oø£þ…O¯{ùü´ù6×Gf±¯&(y0/Þ0EØc%3Q˜±AešÆZ¬I”Pâ#ÅÕ!I¬>UèqЬ‡(ÏA(Œ$áh&{œÙªz5‚ñûùŸ7¿Nù ßÙ8}§E”š;¯”:Í2Ý2¨Ætz”¿»xÔÁ„`'¢Îÿ:Ϲ“ÿ¥¿ÜÏv´;Ú­3pæ;Z{|ðœuë™EMRä¨ú~2¹¹Oj¨gd²g®ÏŒžË”Ð_€%qXŸù ¯ V… ¦ñP±®ú¶³ q©Ù-fÁ±°â,¢jFšë?ºÃÿ8hÓú#ù}¯mµF ¨À$1»® ãÕÜÛÞž”–c‹ƒ‹Lï.6>-ÀÜe‰€–HɲêBxl®naíS2¿9^HJ×Þj[w _ ¢í×¶ûŽÑwŸD“Ø´)‚«Š-V€…@RæãAÕXãø]Ý·ÄUpF.å=»Ô „J8³…¬¿.O3R&~en :ìÐùÄßè}ÞüÙÞvc…,ÈÍ™'÷¨‚Q‰,Ê2.ˆ’h\“Ì8Ÿa‚i +¢bØšš6SUD¥¥‰M©È¢„%)C1ZMÃF-'ÎI¥ób*¿óÅ£‡ËÌz•wÆ©Tj¤†"«`lƒp6Ûi‡äþ+ÁrÃxdO¨7'¢€.Âú9Åã…V¡¼ïÛyüq®Ö=ç©|\<{'Á)ãûwºé¬˜û­çâ·ÍÝÓóÕJ‚‹Á*›»Cb;…#*4qCjr)v·‡&F”ŠqÉ,ž©ïkôVä³÷fo§¡ÛÈÃu÷oq¿Å},i»)Â.àÌçýóè«nkݨK©°H~Ê×@bTÛð!º†iñ,™1pãžä]³Úeï’›ÊSô0®®ñ¤H‡¥¥×%!HR/M¼ãÙ‘3ý¥f$•^É´”JO3òñ6J†0Škµ6ã­RL Œò b¡j½L`Åd¢qSîô"Êâ:1ûmØ«ö±; !‡è8'^øÌ6Ã*Ö!X‡4Õ>?—Ô/_në×»éhœàùÔRùáÚfúäWËW/žWlIw$] ø¸ˆ/åܸé0³sÛr_¥mÑ ÆíHìÖF¿rUÖÒHy³žLŽÇŽÝexŽ 5J˜I¥t£ù~B2Ðg«ÞʹpÝч0k6’…ìî䑧زð¢ÖzR¥”0ºc:d«´?ø'wSëþt>µ(z#"³„N/5×ÞÝŠmûšÏ×Ý•ý·m€óÿñøeíß\ò}“ñ›çË/ðí‚¡eS6rWù“ß}ãiþðÓù~!_wsÁVHÓM÷Ë@L$Q*β¶òxD9½«ì1°!`ób50…ˆT®BÀäÕ †2PÓL¨©"š¸U `Ú´ªwÜzê5#"ËG†<ŒÍ¬ÎØÔÑÚ9´Âɰ²¤lpü^ùtÌÈBï e§¹Q/ެMÁøÏ!.ßÝy»~màq½ÅT4q9ô0èòÝúÐãžwˆÝîï-¾±Ô±æBû æ³ï…©Ï˜À€ES^Æòra›W¨!¹°÷¶Â$G%Ö@9žPµs­kG!AuŽX²Š«¡5Ô´îþ2Ý_‰ç}ûÿ÷¶ù­Jhćýbzn8s˜}Ÿä=vÛåÛä±i—,£'™~‹©ëÔÖ•BŽ´g‰ƒmÀbI/w t"çÁbnõ29™®îb \i¥à)þB8Ø@gW_œË&}XR®¸’Xrs±ëÖCÍžŽoͧõT+%)lMy|*GŒ§gëVìX2Ò>²¶¾(4XMóg¹n;c7r=œb»‚aàú˜·äûÅÙCæ smÍ©€/eÉ‚u}æ2X¥Ö[ʉötÖ#Î-Ö³-ýƒÊrð?£ç}ÛaéÖRÀXÊjÓ^aš"ln¸u½K(”å f¥aj¾ŒŸíåGûßâsË­ñı¨€¤“ŽöÈ™˜†.¹! *¬¹žî.,šSReÂ…CMÇáŸuž5º­WÏå‡EœÆ<ì03}¾Ðªêþ“ÄÊíß°Ô/™¦óõ?¼ýÛ*ëMá`$壋0çKMœŠŠ’%…(Îw{è-POØ9Ùt ׬¦#˜0š ªëèÛV솃\bºÇÃPV©‚̦b¾²t„Áo¶Qq'“Âé•R&ˆ&$¾rMkÁŽÛ3Å‚õ^üŸZ ™`dçZSŸÆÏy1lðµôQ¹FîÑ«4rS\h«Y¯š|V®öù·Î¯;óäü«}áýdo\À+ó9ù£ŽÈ†öµ£ÞŸ_ÖŸÒgE+¥äZ}™CÝ–×ÑéÚ¾žâÏíYo²z¯jözÖkYG³­+ëH9fˆ>¸t}<º-F+âljÛÆÓ3{ýÞ¯hþþvéÛt†‘2@B¶ôxF}*¬Çùóí‰Ë•õ¶2¯9ù›NsLñK8.”äÛW=É*iú!j™Ž§Ê¨á$¡:F1ådºŸž{-·¶oâÇ™Drp¸“‹5N“3é)ðžý/Xœ \¢¥ËÐbH(“…º±* žïÐÇç+| Â¤LeÚªŠØ~W*‰€–€;á4÷o@‡FÚÎ)'X69âÚÆT –à÷à˜^Ž –dB¡BdB ‰„)ˆmŸ¶Ü°n» ¶’ÂÀD´Œç¹6©ë?#Oot:ПóèþŽî,7nuLrÐØ@nð°¨…Wʘv(/{Kýã™Ý©ÌnBþEü€¿&A ÀH¼H—ÙåiñXÉ `A~ž•ûì·¿×õ¾ðãùäøFç ÔC5ìr[ö?†ì7û=J˜¼£&E…ÀædIŠXRÔöF6¡EŽT²Ë:Œßçã¾ wôNJ5ÎæwpRàÉÖ};Œ›ó¿ç‘V¶€¤Ã /õ%¦ÉûèQªz8‡ñªºÇG/ߎ²¼Ò¹º©þj¾{ïž;k‡ñþìO%>’‹'~Ö¨A2–r%ŒÈ’ÚùÚV<À‹tˇ*§Žô6vvYAÙÁŠväòh¡·ÍÜ à 0eÛŠ ŠãgÛÒ~Éž/Bìðœ)hž¬ÈhAÈD)hBµ°gÜ3<™‚L[®\{ìí᨟5Z«…å 0\˜Þ°$´°›,¶R"q‰5*SIX/IºŠG¦.(…ÿö§èœàد~ÅðË~Æ~®wm~`´ž>XoÓzòتi™YM%²•¾"äAuø¥ð?Íw{ÖÏk8F­F¥Ñ[ø±ö•9^äÀÀ^Zënï‰dÙvHT¨t…Y6.iÏœÞL1` µpåDµ)JG…ý§½]!Åj“,]×o8 $»†rÔȪ¿(gCu‚s—·î3 (ã¡t¯uMg«gHŒ—_wj{¬íã±,”q;½:Y‹Š÷Züú_Œ‹ê-Sþ\qùzA1B ËgØn’/•ŒvíÐÀ pÚ”ˆý~tåø¥GS·OçˆÌ"þH¦Ëû9]ÙÔ—’r%¼ÎvÝÈhyaòÀ˜n(¶^Ä{Z_=Þf¸€. SlÅ(šXÞÐar&ŒEÔ‚­»êü­ÿéÞÁ}󭸆󽬳µNõFZ%cÿ‰ÿF`Õ ú*®½Ñ#³8wÎgGd—4]B)zÇfE£òKöU<ž'··†ÕËp©¾Ê7(FÄLí’xÈ©T³Í!¦Éɦ޳}¤6îd3‘a/H”Xq©8b>Y„RîG,ª9º\û£¡þ±‚jÛ?¿Œ_û…0H’Ùr¹îá,­àPÊÆk–oÀÚrrcX$›'KƒÝW|á”se&P”Ÿ×•/"yCÖò­Tœr¥¾øe­}ÏKG9>©äÄ×wƒ”ÐcÎãlXÔ BCX¿^1¨’ƹž‰V´Z6¤¾¸QÌ•Óøú¸QqÔœ"p¯oÂz|^³ÞÕ|Ê\Ä€ÆPX`¡…+.$¨báˆÞ®rúC4>Ù‡ýùÿmß6X[9Úì„<ñí¿8<¹³åä½szÞCuÒ׋ۇU¿LN;K/ ;jf§Þ8m†Sf*lCY \qÂáǃ—†#dç¿&ÿáåŸ?ó /ñ× ã,EBBö`t6¾”_Å0mÎA‘á”C= ªêMú ^/‰ƒQ¦ÇàÜédùŒ„6ÖHkÒâXîxŒYøtt5%ö?ÿ34§·¸JÉ›cw«otNˆ*Ö5 :XoÑ@­¿Ç'£•ö"öçMÓ.+N+>Ý4Y;° ФäœP4c,¾3jÓ€7ÃUðJ¡QR}DÇÕŒ“Œý m?f¶ÿ÷Gã¾K¾‡V&Ð,4…Æ ˆš¨•~æ‡ö’u\Ǹæ¬Ûˆ×Jãt¼p½°È~îóÜûM"&oÂAüÄO–â ³5ñ‹ˆ½9ºp º©¾*ã C¤sÇØs]ø‘*¢:*3¼fdŠWÜ8’¾±|½ûžÓ·eB·A¢4Õõs¦¾S—f°ÖXp Ùð®@SÅÞætñçí®"ñsnMóíׯ©? ïgöÕžì/åÉÌÝ~:Ò¡@hLç逯’àÓÆ ‰ÍØ8Öu¢ëzS¶%Í0D•lkkd€8*Š[ÑPCì5ÓØŒ˜P‚*@%¨ËEŸ(4SÞòüägÞ{¶bÃŽgBD$|á'W•á eŽ}‰µô þ:ÌgmMÖ•Ï“|ÝárªäV¯l,^øPÍÜÝ>Øõ¼~<áÔë+#b`ŸºØ£OEhø:*ÿ†]Øó€×#Z«•léÊúãÇÐFµìßDŽf꘤3É©íÌyá «‚ÖD*µjœQ'<ÃNéjN•_R½–~°º;g–”«`«FgĪs˜>^7ÕMfF¡(SryS7®ò3Ú\Îãdx¯s›s`dœÄþž‡™qÿô£ý¿žî{¸-Ž÷d弌ÆÀœÕe0MÏm«ßy§[hþØ®ËõéqkD³‚âžQ Eq©8Ïw³FTž4‰Ë– ¥zr˜/4Ä,a\aAŒF:Rp5&áH,u!-®lúŸr·LŒL0¢²æV¡H[#¶q»½0BZšÁƒ‘¤ÁÐoÍÅfÏ;t#ñŽ!ÛÓ"0ktZ•!ûÝÝÇÚjkäIÜ.4 DÃt ȱ¸¦5>éù¹ûøÖlžYOãÍfgܰ½sü”Õ'ŽQ i"±øeúb ø†&4ûNÞy{eÈ«“õ…  ›t[Éy¥÷rÃõ>Ö?Ojíjõ>Ùr¥Ò"Q“¢ÜG¤ÊnyÈGYuh8ëÜù“ã ³ î1ÎØ+cꡳ>q?_YJÅ¡8>–Ô«–ŧQ½°À¹®:N+r»ˆwNþûþÛ_"CW!ÅÑÏ‘úÙï $XÄ)Û™Ï(fëÔýŠS†&òSšæÇÙ±›ï \”×ÁUÂb"Ñ)&ÕŽ™"¥ƒæå_¿ß×eA,'U©9¸8ÀݱӤ…È3ªÖ•ö}À2œËéAQ#–èPù^Ê™ÔN+•°ÎƒÌMæU›«ÅMåݵ÷"|03Æpü¿Æ“âòŸœäŸØšÆW§: -_GÃEGÖÇÌi³c¶`»clÔÅ%ÏŸs)ûõ¶½{a^µë-ñL~Ÿ*Ne{ýž?ïç1íÔûË„5™ÇÇr÷~þú|ëZ "Àòfø“æ¶< ¤Iìzš÷OàWr­-Í^ÓÝ©”øàÓ ëÜI†o'å„ Ò/‚ºýüuMržÜ[æ¸Ÿ× Ÿ DÀBzûT s­å~Ó?õ ¢Ó ½üø¡»QÏÇóO´ Š™!7IÑR˜ ÇNOiøÿGâJfÕWÍ¢Ó6ªl7r<ìÚi ÉØÑœ™´òr?ïÅ]Gå¶zÙ‚Òé"Ǥ„*2KpN<òÇmߨ3ED ¬¢’'ØPÐn /NfÝÀWÀŽbYäÿ$Ñg 5:gœ"&h–ãã Ðßþž€â8‡1¬è«u{µòöãÄ?¹´*£ƒÚ¢ÝsÒì Ö¶ô‹$¤UO„®kê3´m—jJ*™¤\ËÜ8¢uœâaÐU0ª qvu¯´¥Zñq8ij¹;¦FÎtÖ0i[gt[÷T;Ö_€×XÔ¹Ðc~òú¬K0 mf¡n‘4Ôš¾Ñ`HÞœã'#m}ÿô~¼ã)h©jõ˜ag—é¬ù7¯ý÷?ÆpOGž5©ýÐs‹žï—¹.`rÓ`jö¤‡B.‚T ôÞø<ÉeéTMØ„Sáô-24ùósòÍQ|æ>Ë[ï\¾þ…Žßãz¤žZBÔŠc-ëIŒá3ùYRlá=yÿ¯ó§`¯ÏuÌ=3QT´õ±ò„Ð~_òÿü¶ò†¬ùÎþõî ûYÚP –¾æÓß[_4ûôÏÕúA‘‘žš~³Mæÿú§0õ1ž¿¸yèK¿½½¤‡6A ñ…Þ ‘t®›'?¾ŒŸ½]­²ÇAø!0ßv¥ŸväÄ™!à±Æ¦œì27 0ŒEåëÁ¹]›x°÷ÒÓx‚Ÿ¨,è–Ãeu9¿¾‹a4Ú{Ì‘~<Åçñxü§ýuü‰¯ÖÑÞc„6€Ü>íµ‚.M c!¡2óBÔÝc²mˆI“hPì½}ö˜póÔ†D¹FGÿÆiÁz w?ÊÇã×óm2?¼¨­¡ïå‘ÑWu¾3H¿—$4Æx)·1ÌX¶šD¹TÖ&R2! …WX‡Á¿1>éDŸ s™¢Í{^)6Šnü’Þ?Ɖ­ú]´HðòX¯¢·pºî< ¡õ*Ü"àvÐFLË\5¼­<>Mö¡ÖpÕáÏ-îä?ôõ¯¿~ôN«´ÏÆc®Ô¹à% 7°®!3š=y >æö÷›ãºVʧ€ÖÎ-;•S²#°òäðiµÑ³˜Ì¨xÜÜçš ˜Øô€M†p°Å¢²(…Zݨ¥ =ÚŽaõyÍCteS’´=­ðCÃëÚ’-Õ1wôÂ(«“¢aF«?Ï ÿDÕ_êàçÝ]  Y±¼sâÔùWu­tá$ …¡APhÈÜpîl“½ÕÈÁn¥Òèí^ÁÅ¢>B ^só:¥§üW8*Ö¡ŠÛ•Ed=‰Š…LñÁ÷x ½¥×ÝÞïlhîÏ|ÿn£¥Þ¿ß*ÿª/É*}ÑUFp§{í~IDz >~®ùv¼¤¢#f‹‹ÜR£Ãj= )ÍUX›Ç•»¡I># ä} qÁ ° R|„ 5k_…ó‡Á}›>îE³=²¦|<Üã÷¿™  °î²ÎW¶ÂÝyŽâòCÔR3þUvArz4ŠTÕ’ÙBÏÈøÑ]UyÅˉx?‚ö¿äÿŠ{–ÿ#ôqxP]—’Â*uh¨¹‹ö·Í„ÎŒÌüÈ4ØÈx#\u»ñާÏÕ9cñ˜*luslâê‘VÌ!­¯å).ªŠM:ñ^ziËíO9ûQU¹”+%*…¬0®ˆ}g-'ü$83‚­´H~„¾Ç˜çšèAÖîft yñ‡â{ù&ß{ųYg>ýÑÙÏü6SÝÞ?R2Ûû¸Á#7Á¹ïlÿ§øveá!q9µ–ÑÂcÕjîÀ"¦ÄÒAgP¢!› Ü@3x]0a‰ÀÝþ"{FлGþµèVÌ«½ ž…UÈ6îÛßÞ¿ë‰î¡žÁeßßlp~KUù)C]n>³JT–,«õ¶Æ›ì.ÿªf¾ÄÞÑ߬öçØ—ÖŸÊh \‹\âÛï“ðXð€„ì¸Ä88¢[Èï—ä/jÍL—"C;HCÓ¬¿]»1,8ÅMºÚó€÷嬷³$KÜHB5p±[Qr™TInê,(aμ#]¥gäBç'ëϯü~ˆ gþæý:櫾 VŒ-SÁH0Ê@B¨¡@¥½ÜoÖ£Ö‰6ÝnfÁ(±%&84¤žBshI¶8qÃöœÊÅNÉÓù¨Øaduµ®æzû­×Ÿê/ÿ‡ïжüÒø••Õk†U«¥‡I×QZ䥫B$[…D¢P¢ø »YÐ ¡¬i)kRssé,µÁ!™kÇM°6_cOSJ¢Nœ´¶ŽE|‹YJJ¤Å€ á #(2L±‚ÚÕV?笪¾ÂEk4Ȭºñ¾Ðëøf}‹™yˆœ>®Ã|:tm¢^æ'&jà0¼D+MtûßÝ×Û=ƒÍjð7cûý¯ö/??½éï>Ù39~iCdˆS 5¬ZESgI@!”kP{OCÌj0ת¤nÒ›ƒ©$8ãD§±4¸ IÐ!81Q<5Bù ýÀ©òqñ`jl(¥G)Õö:y4Ípz ée9ôª2ݨ£Bމ$8­b„«wîEïh\Ö N>åÞˆ(£‘·»íË.¬IÛ«?Ë!¨Wéíz¢]p¡!Éf[#B£°\$5vš½ÇÖ<2JW2B¥â¯ª¥<Õlj ×=¢”³•6Ú^)gMe”äêÔ$Õe5æØ…²Ao>ù–«w}í"·ÕR=F-U'T¤¶Zó]9×ãÌɤïȰuÂ,.^•!aÖ ž¿F ®˜ù@…þI¾ÙÎÍÐÅ:ÞñäwH•ܾ½í}6Ê™œL=qùHŸ’ªqŒ ©AQ3B°Ka”!‘Çnƒ)EÁ¾®ì}ôŒðú$Þ¾®HÓŽAA$ Gƒ¦ŒÎ7å]Ý$LQ( HÞǸóûW³G«M……ížD)+‡{=Á#¶ GíÔƒÁèùjFGWPas\«‡CÄ¢kRmÞͰxÚÝ ƒ:Hˆ± â‹ Ç[Ø}/YÔÇ«—9ëÝõ©d{þ#ݘª`û““ 4l<5fÓ’ZˆµYyÛ·Cæ‘–eçI¬²‹¢:±»u¸u~°¢g{Ÿác‡LG/áµ=»ÕM«ô\ä>¦v KB²AF¬ë0Û‡Ù³/œ³Œ À \ÛX•0¾Ç~™T•ÞBºø45Tv»çBþ¡ Éx2ä{»,Ê ÅŠÕè*èIç\)"Ö´&×Õ7Ù_eý†𓼔ù«"D¬&ÊiǪۇ nr¡€²ðIâ;ÅÓa›Ä“ÑɶŽG'/™ÐnT¯±á^òñž 7칿a4kb]ŒP_MŸOÝ‹~¤ñRáÿyNOpJ£¤î©ÂŽ MÁ»ëq¿W³ž;ÏëÜÏ2ô6¶®ÄæÙÑû©~òÎçù›ûã_XeúKïmc‡ÒmjÃh°?$ðu/wEM*[g}Q=;à‘¢rxâx{ú#aê(x²äÛ²ð¹ðÏóäýÝéOÈý¹ 2Þ/úˆY‘?²O‡%J¦—ÁØŸÜù ú§¼ú ?–õc;¾YÓä+‹Dö5X‘Vg¹ñ×+ûËgñ·ÏÂ_>‰Z4“×ÀÙ§†\ϱ{ÁàÔ± t†¸LLØv,[‰,Ž=PN§ÈI!Ï‹ö¿ü|íÁXï ¾3"rDÆÌ&ÐÂfI†lG5Ë›Úìܬ\4™Œ5#¡yl6eeæQJåÜcMÓ €<Íq>rÄ:òÔ²^f­ËÍP¤åu²q¤$‡+½|1ïh‚ØBãõ×…´Â¹?z;sý#g™f^ßt¥»>g>C“•5ïYñ³´QX‹Ž0¨ bœ7³¶î×~-¯Óz.¬ƒíQ!^ÝumÇrG]cYwx^™7ãM®Kœ³å£çõ¶ÑBó@Yõ›Ì»\1aŠjKXªè×½îãQ{¿™emg“¼¨Ûs]¬ã¡Ž)ó(Ãm>L.ìëL§™ka>ß–ç¿vè#ÉRÒ¼QŒò}U%RÇ\ñù±7 0àÊ¨Ž¶HãÚîûaµžÞ‘ÁÃØ:ÔØéjг3¯û1“± ¤ ZrŒ,I£6Ô‡3bÈuËwî\2œ­0v°6Ðc±:zòB²”]rû.µ<ØÞO¼µÈॉë2°¬,@PaLÀHòŒƒõûãÎ'šåwL|æ5ÆÕáLœ%‹J‚LwüUŽæ uÓAkEmîšNPOúáSƒæn=vþ@3Z{У‚õž Ü ï¨½àò‡-ÍÚP¼­;š8a‹€5•ž$OØ£…Tâù;Oaeµ(^I»’|&\©ò·Ç¬íÇhÿ0´7-þ4ºŒÃŸe…ËJ¸™køø«éÏÞß;Ÿ|Åõ›V÷þ‘ @«è9ˆÚ4åv#2¤Ñ?lÅzœ||^»hð"ªràÚ—7GÞ®Ò\ !QÖÚuÞ;Å®O[ ,«ƒ+h¬ƒöPq»¬;éV¨¶sG£ ¬ºemMÎÊ “(Í=bdä­û¼p½‹¢‡5{a=*5UÄZMÔá…ØMù¦“õ&Q$WßÚÓ˜¶w×ÁÏB‹½Ëù²Î²™ÊcNßy½uÖ'¤œiB&”€npÞûh5ôfrLç‘bàAÄÑ¡ÌI5 „»RØÂÈìGµo·'ç6õÑ;¶Îwï9̆y èL.ƒnñD€<švÆãR9®5§ŸJï¨tV1–ÈPÁÛËæ…XÛR4ÌŸÛú˜V(õœ)ë¹, è‘ÒÊ’e/wÍã?œq†¸a1q;ñ\þ“ÑN.{öD åÅöSIPÖ91˜åM`ªhYæ¹ü¬ùÞ•ã îIÝ3)þüÒaÊ‹×Pj&ÍØ i¨Õ‘wA¬cnýùÂÜJQ&³z¦Gª¢ŠT )‘0xÛÐÎg[+®¹6ƒAzˆ¼â'«€nVÛÑ""]dʾǣ"4ÕBݨŒ40L•ˆmäç¨W•õRà×ÙÒ @KCÚÒt¹¡Æƒ“$F®€ØÈÂP D¥Æä‘øM©™IïX HÂ=PM ›«h÷tžpà0ƒÄ„ Ñhh.Î-æöðCGÚš­ÙŠÁHÊųºn¨Ê•Eo˜ÿœ3ßáÏN=xúÅŸx¼¾k|®ÖwaŽqÒ?®'P=ºŸ#?-ñŸo§Ço|Ò=¿ qïÎáVÛÝì—ê:Wx|Cöñòçg{žN£ú¤÷ëÏ6»Í”W×Ćÿ.Ñ[1sꢵ„¾Aœ‰µßÅ|È‰Õæ 0C»°­‚åºMŠ!@~Ÿ:…öÀ×:óò‘¿ÿ†xŽ ˆú]:™]°ʸEzfj+˜dî~ÙñŸœ«zY ÝÚø]Ìg¦©5:\ЮÔGÿªúáF¹'Æl±÷‰4O“¶//„>̵rÿx­²â;ÞëdU`¹1ˆôEÅFy  WûÐi¾‡{9œg%v!~ —IÜPøÎZêp5+¶Ø,lœÝ0*|¶†^NÀÍ{pº­AŒš÷©¸Æõ–ˆT®ÿX€©³A´»o?ÿ™‡ÎÌÀø´?\ßK@ˆ  ڈ¬ã®êZwmVy"É€­ö~V€ˆ¸ÍƒÝ&©^]•… oSå 4§Uc®OëQÞqÖ‘žP¡¡ é‚ôX–¨bóc‰áv  ZzÔb±R‹ŒÍi–g<Ř;­±/÷dÏ$\‘‚Ðààz=ÏQ9÷¶–;Ôß4%sÐÃUÔ©Ú‰aŠßãa,Ííά]k×Ñ袯™¬—иYÛÂ9c€ 1 âXãpÒAp¤–ÊúOyYÙSQ'Fp27_Šö¯Uí÷¦¬Ýœt‚‰$üAŒÂ:fð«£°XÌ5_\Cù˜šP¬EwŸ?q·‚sAVÔÁÄ$ cé0Ô8ãžêÍT9ðÃi‰q<˜¼’®±ÜeÊ[–~iî¢ÿ¢EDë!,]2uͯŒ’GJ6ؤÝÅõpáÒ\F04 +«Ÿ¾àä¨ åWð†#|‚"Œhà-Œ A‡#áÊ&§ÿèõžÿ}c´8~ÑüPž·ïÛísÿÃ?þ߈ùÚ÷§þýéoÿðD&0„ ó·Ù©Œ5Ìt_SýG)”Úè+¸"/€‘³bÑ'ÉžÂlQàdÄv@fo½+?Œoh°>,R—x þELý)ÿZ“>䄘—ü®KFbüQî?.#JéžmqB(¶Ùd¸€0%¦qk@ Vê‘§¶êh.üWÇþÛØ¿­9r¬G~šç ~æ¼W@rn0ŸúýÛ½™î—XÙùSô쵦׳uG泌ö/ãTJsð ¶6íXSDöcs«ïê³_øT’P• hÍêÈ30 ­ …´.Ïú˜\+“ÑRP.ª–Dyæë§üéœÜè [Ý ÌQU]R €îèm Až $L“ø(#ü Ïq‡“06Õ_Ç%þËŒÕë¨Û…þÔÈbÔR6…fPìu S2BYzÓïq8D™û‡ýZ™uÛÿ<ßæ›é?ZÈ Ï®é>ý± ô tšE)m²”jΠþ­˜)×'óÀˆî„Ò&WʇÄX™À£&ú|¾<¿P¾Å|[:2 X…Hºš~º¾N8ãòQòò4û˜.îꅽߌ¦¼ ÝîéкY2p5ë&»¦zxãмôZÙÞ|óóÿ /k#†¾z*­ ½M ,Ì@ Å E‘Öç‚TzâZW² +ú_M‘®Tðÿ‚ú‹È_Àꇮ+U¬Êªd¢Ëð1î&!È¡ÿš´1 ©¨an–”MàL9Ž@á¼óÜ4r¦Z)çxD+Ä)^¯T8ÿ{@µéªé>ŠÓ­­¡žü˜¬êÆ"s ű½pݘ™>²s©Ÿ²×öé‰ÏcD»,ÎûÊ3åôÜ §±ÄuÀ}1¯I€ÚnEFt0æ«ÛF¨%XæEÝÛRÑ—d+pOO¤h(’AG«ÒçñU"áŽtQþˆk®}‰Sv|ûã¤xdãÏþÉotUšŽÓN:0Ee 8!—©GHç;²(üÛìàV–»û2=ÓVw-'°˜/`Äz‡ü(Y˜cë;2h€m”“ÏspK—«ªCªÜ¿²jìšGkZ“ÈhßÔýçó÷nÍ—ö¼×ºî5aD .áC5‚¦Â^4©&d$Î*ôE7Ž…iáë;L]ï_yŽ b‹µºõ¡(†¢:­Ý‰áU4 'Þ²Y©?põ€AõÒüøÁýóvD‹„3h‚ «S ÄW~kèÆײíUÊÁWÞ\'ºä²íØRÄ7èÁ¶_ä)É@m!–d„V”É ;` LQ7nwÝ$ žWuþ¶ÿ0sõ;’š­Ñ…ùûs½È·˜‡ʨ¬ñç(ÍÑ5!tƒø[Î@\júW»sÒ;ñµ¼ÊJZOúeË`[ˆªÍöL0(éuMGËSéŠÌõŠ7o‚øTYP@MeçüT²ûxù³˜š“sJƒàI,W»5VSÀY»z…˱<"út³„¹„@E·uà±úé‚ÀˆE $¬?éôâ/1$ÀåF7…IAÚðï§·,ùY}Úêqš«©5%ݘ¢øLûåñ®ÇÇ>Û%³–ŽH¼AÔ['ÆÚBÅUü}’RØYTØ#-c €@ÀéfC¶X³`Æ~Q~ >®Š $ëh¢éŸøÝøå>Lÿ)ù=—‹@!¸ð€þªG_5üó‡ðç™{ÉåO_?t¾ðâZÚ·fãÓ;sôQm'Þë›_F÷'Eý<õ±‚#Üy{e[Pk2oRŸéÚÜW»8­‹y9كøm}üÝ Œ»zY±T¶vF;‰ä¥e·èh×Ëø«‹¬”;’Ò$ÆaÈ)Àm© €  è¦¶Q,Œè`nTCÏÚö]ÈZÕtÏÊ_"ÚÙPĤ¾Úm màPN(§Î­õYßÝBͧN?µ°z#$›-R,­Tz“•}Çð…¯›scÔœ#!ž}ª†ÄÔvÛŒ®£"s ~‘LKd…ÃNUÿ‹ÀÓqÿ7ÿ‡·¿4 oG[yàQ¹QÉ{ßøp­0tª‡mBœYæ‚ø^­÷¨±™`(íå¸9V‡æ9KôuÒcص~T9Eú†ˆð»°4ˆ1ÓþêyßtØâ¥ÃÚêÞ¤¼w}Õ.ª%¶$›Éz.Ãué¦6Ùx‹{ô\ùñÓñ]Þ€Õ¨ŸEµ£U2pZ ¬—ÅnD & yÖ¹AA›æD8a4 yXo¬}Êv·?Çh‰Ý.Ô:êæ¾sF¡lø`cA3‘ljßÇ%æÕ½ÒîÉèx8ý\ø’;ìŠDÛ y!LbtìCF‹½¯ã±ý{µf]hù=¶Š>Í‹XÛd00Ìî›ý#â.ÐІ'×*´\FJ#G¢…n± ‘s©x¡³¯þ3H#IZ«£Þ0Ô×7Èç6¯„)€q*F8'ÆÄ¼tPCÄòÀ± ;)5~Sþ~x†¿=ØMôlÊÑÿBì ß—&wÝÌ0s.žù+cÀK—È+<ª}X2‰.¨öEå¢XÄL ¥Nƒm¸À§Ñ@ A„McÂ5 x ‰ZóAOé6B‘üøYwÆÌªaãÈù\cÊN¯ñï¬dÿøîU«3[{fôGÓŸÔ•Ï™Éyeçáì5§ü®d)>ÒH\ìpÆîs6zrô i(³Ê’Qf8rVmoÒ8þ¬!™gÿØÌºQ±q"ˆ¹" ·'È@Û€§ŸÓ?4MÛØº9-ö CY£¦•â&1äX)’‰A!d‰R*Ô~„3¨ÑçÛcBõ”ÊF‡ïMsXt CKù4p|Z9ŸÉ×G‹–¼¨©´WÂ'}ΰ‰=U{߀ûÇqÓ›¶uãáX!~t  Ìù pf Њu¦_ŽYIŠÂ9$(XɯÖì‘|\Þ¹æÏÍ›W–“éB$¥j©$ µ-Ö˜3ADœÝlÖFð¼ØG¢Ñd€q[Œ}Ú ñ/Nj­ncNmjÎC/þ’·w·È'jGûz´þs¡ü…c ¶©’ŽAaÒáÍŒY¸×7´×àdsF3½oxÝ(´ï³J ôî?÷XgŒÃº$½³¸ñT2æ]¦î’{x§r ›4i‚  J°SZ4F‰°ËÊŸ»îøü­þxÞEYJVhŠÄÖ°È ©Ž¥Û%n·ÞªfR6‹¦û¦A¥Àn„¥Ð±ÒzÆIá…V³:.­Ne¦6àÐ"V©”–¤¾5ÓêÛç…PíŲB +Ó6k„%T„KË‘p»R?YZ(SfžpAjÚ¤M² æC$Öžˆ< ™¼ú7×GÄ¡J©;_ABñ#ÏXy'ÐÞÐP¦&ZÆ̧ªØµ+§(õZ™JÙréØ]+näf,i1°é2¿Æ>´,Ïz[Õð¤ÃÄÅé&lÆgö<õî`µBë©€X<Ë”'Å„rwwu¦3dL$F&=¢¨vâ’{þF#<»¶†S”u{ IX¡úêîvs€°`±òMDLÁ»íŒ鈭Þº›ôd\¥…‚&½dè4ÒoW̬QÈ܈–Ö.. £ÁØ`”¾Ø†b¨*Mƒ—B¨ÂpuÄslUL‡Ï15[¸cF÷ä£ÕBU‡î^…ÅYaE‹ [[ípëÅÑ%µã¹O}D6Q¨0B€ª’„ŒÎ¶í0Æ•/z¨Gñkpïü‹-ƒÄ3%Q#Ÿ€ ¥¤rP@'¤ÕÞ%uÈ:Õ!8ÞJŸ}Ñ-.ç‰ë³JÁñv hdÛ^òÎïÀU+WAU8É‘<ÉØ04[U\8U! Ì8’LL0ñ+ri/çͯçúêÉžCœêyd“–©Á€°Šˆÿ3ö«v(P›ÚUJ…º‰ÁÖ3- _ܲ-^ ~ô/ïãÏŸËJ™JZ”å`œ'3r £Ÿòöî´o‡ä8¸fß‘›ýqfÛós ëÛù“-§€nŠÇVÁŽšÑÆ çñûê×ï—÷=üâ‹3‹¢˜R ÛuØ9ÛNÓ EG2²šÍéò´–Ù®¯"›ô°•AUV$FM¹^!ìMz1n1z'3 ä_òÄÆÍ|ÏL¤Cþçáé¡V $èâÃ÷¹½–®¸ö¯ <¼õ4h•ßñÔ]hÙŸ0±ï Xî´HB@ÜCÁý8®¸¨È-ZYNvu$/ÒHPÉ2Ämï-ÎÝüvo.n«¹Ë´åÎ[¼öîønÐr‚\C 0¡Q‚²ÊÚ‰Ž6º‰ÉK#pPDý›ŒÞþWïü[%9¡giJDhd)¯J¡L_AÅwê£0ûQ2hQH‘¸ßä­Ê-Ô`Ý÷ˆ^44Ë}ÎfÜŒ­WÚ¿×^ý“—ü×ÈÐ-Ã3  &á,[.û9 ¢£m]çŠÔ™¹RI,lÊ ¡$­ßpéɯ}=–¿&ï7þºJ™¸Ž3?væÎæ^A¥:L"‰¥ˆ'u•èrùíK½Ç?þÿ¾s î8‡é­“g,K&ÇÌ y¤'hËqšWJA×½5á8£–ÐÞëËîyœç¤‹@MÏÔǦÒjÀ3­nnQ»> ÄçPÚe.1Ñ1¸‚|”éE—ý7äd U8Á¤ ƒ÷™ˆÖ­wÒéÄ2ãÁšGüÆ‚Ob¹ (,Ó‚Ò¼«jò§“úr†>ä1¤„H×î!ì3?ÛN®›;Ó-VpÌi7ßTÀ×MƒÕ4#;S­T¼Èu½PÓOK¾oNq\`÷¹’ÞÁIãGð¼µàuPO:,̘´_~Á†£Úp0h†’^븿;0x“¾¨l6¸ ñVæ­uZŒ Äc¿ýð›a2Ø[èô’33–g]ˆP£¨n2°8D$ä9(8áˆÒS~»¨f®Ì{°f_Ѹ6Rçû¬Þ?íì7fk8À‡côEŸ@!b!ñ!<¬½u´ìb¶ÿvO©Ç®º­c”z8ÀÕùM~ˆL‚Ä€*Ú=É<¶Žå¶ì²¸¹³4—Ý—±aâr#L÷‘$R"pòlŽ|#œ Ð6Ôð(»´ËªlèN‰€Àm©h¸»Ð6U›[‚PТö©!µ£-Ù.×¶Ä_/5×É'.\hî‚Íf<ŸvUc·Ôð%é„oçªRÆcÙ^„ýðR¹‚é[Û9Æ S \f«&g€BÑbG€€/ ™, ÓF戦I£A2X¡©h[L‹„ÊÖ÷ƒ/üãGù+L­‰B/C4µE Av[þC½ðù⯧‚4±¯ç-ý}Ó?|žÙf¨ÝÒ¾ú•—]À¹óòæUTÿ£–ÿŸÚKªÞ{jŸ¶ëô ¿·¡o$Í¿€-šçí¬Ôã…íýÜfeµV ÷¢4iÑxÈŒÃ&7¯ˆoSë‚a`X£€¤nŠ™áPF¹X|дº[mÊï5W4Øûð4Ø’k°„—'.[Ù­E)©ÊCq´È®ÝŠãljW½­U®q¬ßæïØÂ\+žx1(n–q¬“ã´lÚK£ò-E.•¨ãÇþN!¯—²KiÙî.Ížwðyü™ã8Ü®ó¹kË=ñà9¯›,pfèò2(DÊÆû¡÷3žß|°V¢™rWW[/h{P*pjcIÝRÒ )L ]Lgàšžˆhº"6ïXÏ~qÉýÔ³ðâÃ>m`óÖÁm%º#%‡…âû%Ï•‹~Šc3ØSJ&æq Ô%ƒ )Ny¢¸ 7‘fîüìîji#Þ>ÖØÝv·›äÝ‘]€Þ  èc›R$ È=ã²$—Íýç¯~6˜b–cìƒ]^¤Ã®Q#áx4D@ÙõÚ¡£Õ{Ç_"9–Å®£,½O’Za°»Ø˜ ŽmÝwô½‚uÒbÇ¢oc£2ý*ê•^-ƒoµ€ã€üšûcrÝvyÑß5ºtˆ.«—nü–ò³ïp±{Mú²²…ª«O#¡Ž•><2H(ÿ°‰KòdÓªˆü(|32S›Â|ËOÀ!K¿NUÕÂWJ´!ÀnbÍÌUr'ýÓXX쪙U»˜Ü߀à ðDÇ¢|H·úê&E%~Â"à¦"¤¡‰(i úˆ2X­_ÁAFæ²q‡'ãO>xúùŒVxÂ|ŠÕnrô+;?¬¦NŠß;‡7thœ$ ƒ1§¨®ªÔ4îTn ¦fõÌÛ«MRwb¦hÅêpø^çÅät•POrÝ™œÍ®?Ç.©"zä™N Í¸ŽÖöÕ×Í‹´í^Íd¥ ŸýX¢×Nì€9¤dv`F™—¸—ûB^jçô6#=ån.B5_)#¤J" t.nË“f²^ÉÊv¡¬“°¹³´tÑE³¤|*EH€Íu Ïy<#p¯‰ÏxâÛÍ*ÉÅè*çW|ÿ¨uݬ?sˤ¦ú¹°o51`ýeÇ]²6ÄîçîÕ$¡(:pÁþñQyOk6\IªCÓCT¨Icr¤Ð' 0=V~q:ÎUTI]••qM[=&ågËT;þîñû?ùæí—á;Í|à{³¹$#ß÷Ï+Z+ž{êhZ;‰L[¹uú°jbV¢"±èÍ|Ž”šÕ”Ùóµf®•Kç¯áéì—vÝÇõõk–…Ç(¼û…r:õ¹Ýoq6°g(ï.~Ibæj^ØÝ–ƒg½Z0ý`ŠÖø²Ù8ÑZ ÀUp'`hÀÊÔƒˆï(=õ4ÏÙɯ˜E¶µQ9¦¢ÖxDÆ·¤KÒ6À€À(émö G•º4°@q纛±CIùnYè‰âÒmX[ÅE] ¥¢y"Í0òbÀoµ”ŠÖ£‘¬‡E4æ(*·q[5ÿ†94Ùס‘šªž1j^ÙÆ[þÔ|ÙC§ÑÂsÄ®#kìeÆ´$;»Gu/l¢ö„Åsô»îüoïèÉ`O«`ðÈËØV{‘ ˜œCºP_¬Þ"‚Dl­«_ ¨¹De8°&š…_®°ŽŒÛÝ0’ø±‰ŽÂL·gµÌŒëû÷­—»‡+_³Q« ¡H„ »rc$D ƒ'ŽpNH¾Ò¨[jdURó¸ŠÝ=I@“šcd€„ pâhslé b0æø~r”9:æ=_$·~æAy|}‰–õP?~gcªêû›¤ÌßüåÚs>Zlcø›•>åÛ{¿øœæü¨¨e¯Ûñv2ùh1$ 1ž„Bd!ÀÑôýC9ªª|"´ÈuÒ”Q˜ÁL¹’-H  A¨eÕÒ‹ß0Ð^½ 2aaL¦´Wqw{­Y'D°ª* „".”Úöá¼6™-QÜPÇ»,/è}†° éÆ(‘t+ŽU)²–"­Àj¢h49[äT)ªàÈ|ßaݦìÀ¹/Ý^/<©üLL7PSøÔ_b=rE+]ߌWî¡ÊSrF" ‚ª•¿:®´EÂØ–`«å7æÎ«¿ÿ‡\µâÉò6¶ÌÁ@´ñAš°N'_·#55æÌR‡;¨”‚â"áMÕ6lÎÄÛ÷. ¨zOEvî8[ ¥‰¡Ô6CT®c„ã‚Ø ‹Ñjeãä¨ÐUÜï–²Ÿ ó6Üq·2Â@-²Ð÷¡¦ÉxC)ôt!h”Íõ¨3 çwßs¸„0ž{õc9ÀÑÉAG£ÂÕ¸2ŒÔÌÌä­òºùµ:˜p6$‹L°ÏÔ*vRøyk<âÒ#ÏÞÀDYù ]ë¡|&η(B† £Ž`Eñ‚‰Q\²<’pc·õ¾¨-ªÙZ¾¯}Û—·Öà+Ö®g®o«UæJ¸MHarâñWfTáÕÏ–_F÷}ìZýFÍÍgýÒR…´vôé:\_ÑŽàùsB–sY$czåGYIÿöšÏ8ãWìÅÇ_¾1ö|ÍÎË/æôY¨ï¦æÅë½7¦5öØ£ß2è_-s¼MÕÜŸ˜ÒÝÓJ´E3Ô4À²>ðJͬÃ{¯ŠöS“ŠÌãð7¿q_-¨wë&}I>]Õ"£Z°”á¢Ù*T2`€†¬›Ž‚{5I Š(9^¡"¿Þà|‡j—ëÖì‘ÂÕ!Ïgt< ” ±]XËßÝyùêÔŸ‚¤c‰ô™¶øHîЦ Ü~šÞ6R™"€Á‚é{Í¥²¸PEP›ÙÆ‚–+n“úd~lnêÞó†Ô.ày–ZóO¶•áºR®º_G«®> ¨^«°:·˜ª[Yd°‹W( m·=$˜Kþ„R@BD¨Êr ¾ WZ¹HhÄê4´Ô¬À61 6ã ½OŽ:š(åf6˹-¼ßR†œ–öT¾ô»,òFÙàZ%(i–¬ÊT š!$ CP¢‰CˆÅ,ËÕ©n”hB¯Y]ÀÂF‚¨pÏ0À¶”^N’ÿ³k‡7êð óþõBÍè¨Ès·þêÏ–´pðœ¦mšÿÉ-±Ï6¯òúÞåëmg4N/ã8ÃxôŽË;Ð×j­+÷‹ýÅ vî~=|YK+ß<üâ‰Rwjáê’ãÛæþzt½¢VWóqèËì§ 8¨ø mz‹Í9¦£‹‘:Á9\wQË Ð®¸ûD³ÐƒDbe‘X×6ÒuXm€uº]j+ ÄžGƼµ/º B´ Ëm”„ÿãçi®“ÔÑä?ì˜C^¨ «EÂ1Oëé›è!fˆÍ]WÛác9MzçâÌå?Ë‚µ‹õømõ_“"×Ì+¥Þá½µê /?\ÕÞyß7§)¦Qd‹f޶¸Ë:¡KMÙ3.Ô8uû¬¦G3 æOGë'ÔËÛOÍøÄÅãÏÍ–Ã^ÑöRÎÏÕÒlýƒFüד¶ñt¨qêÕÒ(ˆŠ8f*b¸'ï§Ô>¾èX ÄD0j”÷îÏÖµ.× ÄÀK JÙNMI3Í•‰‚ˆÜX¼ïÞ³'ŸOê¤Êsæßó[m?îÕïñÞ¤˜³¶‘)ÔKpa¬P[!jcQ7¬(J½m€Òž¿ü£ÍÙæÞ{.û48·Ñ|0‹p¥ÿ9Ä€âÔ¡ ʈf"EîH£Òu’c4ß%‹Ä,¬_à K1Ä4LmVb±¨Y(©g½^+êÑ}Žú`À1’*íÔ{áÄT¿PâŠß°ù‡~ôâ/øLÆBâñ„U, 60õOÕçl™mÅ4¨%œ¨ì•VŠ®‘«÷”kÚ5X>­óßßü5ƒ)'J?½úbýðÉêkžtʧ³÷È*I²S>®ú°æ8Õª*Zq^Ý)´€5w­º­B܆HìF¨Žº7`eÚ>£ €8ëç‚i˜0ƒE¶ˆ$a¹·nýÄÓ¨õbPAT;“~Òû­µ ¨*† ø ó³—òNbÇâ’ܒ‘ïÒÔ$`t.¨,ú´Kœš +­Py$•Wƒ¢2vU³%mÖáìe£°NNÔ¸Aù#X©úÄŧøp²cÕ«lcõø(E” ’H7Ýi»ü }0}7÷bâˆJÄÒÝÚ{Ô•þn4\à #ÚþöÞþ=b®I½2^Í¡€Ó@O…[â62TäN¬/Â0Á"åB Q)‹kâürïÜz1È0j-¸Æ^1ZêŒîÿ«ïÏû2î*¯å eÐt€Öu×YpW÷QQäB¬EhbcWˆÙÝÇD^uvšGØB+$Ã6àƒ³˜A&Cµ•&vŠF%+z­E^„OðѼA>ûòÛÌv½QÓÎÉš‰•«ºñÿZ8Ù ”ý[ÎÞp7Ûcôcz”mÚ6v×hSn‘n‚㤉ܦÅŽuSöÚ µ2añØÓ ¥Ì3¸cS~íWnœn³®aøÌ±‹ÂÖ U®Õšç7ù~»[iErfð¨‚U–/q§˜ÎD$EDÐJÇz¶ÔK8ײZ‹¢*ŒýÜ|s2nbn;*s-¥ŽÓ2ØîšVt.VxEÖTPVBAvrGø`äKë(#½Ë>©Mçúgøß{þºyó½¿|<âµÝTA0háABÍü¡™ÓŒ«€îš(Õ {ÿÂýèèƒ\ è5‹µ…1åbWÆ+Gsnrìô«/:nì dpOýnõõ½öï]J5Ϻ˜s¼ŸÎ®V…ë³U ­CiÝ©¢C#óÁFðÖžB1Z‹ãÎíi$CÙñÍÞÁÕÔ>íÆöð=ÉçëA~ncØü`ö+ß¼›çVÁ3RkúÑÔQ…6:º© rV mqLt Ò^îðQx¢ND¦9² å ƒ}Üh " I d¨T ê³è#NÎÏòTᦑ¯€äÄ ±©Œ¢¥P¦ƒ= ¶ÃRà€w€±„âPåæÅE,!Áè¡×JÕܲ!ÕÆ»½W’Úó¾®Dfÿ~êå+ætÕLôyjúóì¥ú"«mÿ<}-ß5®ÌU*loÌLRñ~4¤d½ÌýÙaže”fî˜ÛÑ÷ké]»ÄÌîY9üòàÁîäèðjc5ßá¶|ÑŽcÈ ¶Fo/·ÿ®¦mj”¶iâ)ÊÕ>êØ¨³¬%ÎeËZ¿{}îã4ìXW¬M˜f|HZgµš›oC³IV žÕÎãÚÌåå%GyrÚ³…Äh«¢«ÒÆbèXœ‰bÙ±‘¢„4P³ÿIek†k+©cP&ÅÊñÉðÉ÷Sjs-©#€··˜)ȸ?’¼$±‹¶A‚¤QŒ‡ƒz`è(ˆ±p|Ü‘E"Ú Ë08î`\5C³[}“ûfZHOa¹²=‹ë¸5¡#‘âÈVF'ÊÞî*Ï øŽXfN'Ú½“Z¸G}ÙóˆIÌ` ]Í·*_§Ï~Ìû‘ÏõæiÖ–{@gæjšX=ëe{·ôO¦½ïBPÑ|d}øó A9B”6^ç{Êžºž{'›Ýü¬k«ñzN£hÚ¡€˜ÃbÐfÖõxªeŠ;:Oqõ·sScß_RZMä3î!NŸm 2µ2Gº~úiýœ=ÿÅwö«í9nI“yMx’ûä½<åà:‡1­2 @©ÞÛZÌkœ¦Íñ¶æ‘5¦ ( ‘ž\›J¦R`Žz†•H3ÈJ+j*Ït½ÄáªûˆvojÓÁ˜ Vnú•Gˆ¸ÈÂÉj?UœjKBiÚwʼnXÃɸkŽB«üX—…È%^Ìûžß»cSûÊò 9¡Wþ²Ý(Á9ND½´: ®‰†í`Y&’'µÐA4…-ƒD±´”İÊ4;C×M‘F4 ‡ùg´ëQ ÆŽ[i¦÷2ßÌi+ãŒ\ûqp]´+ˆ KÌ}­5m°`F6=ד¯Úʾ!5-"¾c¥ÊCÚXbµçˆÌfeÅìgxKTðzU}ëÐá4X‘€BÁÆÄÍ"éïh0x T% &ê€ š1pÚÕ%þe–¿5¬¦Ð{I¼Àø3ÀóÖü>?õ]_ú®>øá|ðÃÉÄ~C¢¢?©ô£ÁÕ¾}¿õå-ªC¡–ßL7ÑïùaÚT•±-ãÏŽÉïtŽý³c[½•í?tú<Å÷D\~©›×På×ÎøW¯õ/>¿à¤ÙFÃáåÉAoôQJ¥S`pç͉Û" ZÑ ‚èû‚—_o­ÒÍßÌq»‰uCçOµå@ÃAWÈ¥ÉUi{·lº†31&-R¬upˆÊ­™édœ|¸Ò©YŠ!ïÍžÍÒV,õó9ÌŸ0ÙlÏÁȆ"ê@PFA©€æÔD(hzI¦Ì‰™ðtÄ­„ÖæËhçÚ¿3ó­ÞöH xø‚Z¦·Ãsym Ö¨†¿«ò~Ž;a¨¾EŒt¨J Èà‚#ó…PVÜÕŸ“]¨H„…Ø!¢É&³ÿ¿8°þ1¾á°]ã ü¡#%$|e<ø4PïBE$ꋲ‡Õ×››¶F»Oý,-”Xí;è寧#¶ÊÁ™7å§ïG£›½¯Š,?‹-©ÿh}óô8èm¼B!ÇÕ Í6%4‹rÑ€‰ aë寪D]÷UVúg”ÉŠ«` P¦ DØ‘*—ƒ€Ž Êdù²7pTÜ•ì­Xå'ìBá¸Ç>AH”È$…º4ñmô?h­nÓe±,»Î#¹î‚Þ€3P}Ÿ>‘花MM Z³2~ðÐ] _‘ŒÄÞª8±Êj,ÍÏJ©$¦øB‘™UŠ7!Úé)Su}÷7ø±Æx‡’2¤HÂ(ÜXœš·cg«Ú¡(} _#?üׄŸ [PëÿnS8o ›MÆšá.”áà!„€ð@[P¶ôÔ=ÒoèGÛ#~Е=VF#Õü®ÚJts•3¬E‡‰û Ë~ùÊâeûÑj¬þÐd‡mYdM¿N}¬sú,Jt(²ÕgÚÊg|h¡Þ²N#È\¼áã…+SÞ…ËGœWsZS=Éd“œ9ª)ßÜ©ÔsI/ÿwì<¢ßq¬g ¡èLG~®žY¶Ï‹õÅrgÖ®M…_Jð^ßýƒR„pêPq2ާ¡x‰`Ž‘ÇTS¨G69gDŒitüf¢Ÿ„ßdjž»’ÈÈ¥ñ!²üàãê±GØÿ°§ð+SCçoT}:\ßã+['<“þ¿^ÿüÑÌí:Í)LugèÌ -à8Õsû‡ÙŽô¿Zr~Æ‹ˆ@n(>©½8Òq¸4\°¤f†¥þë_ùüø¾äµ"éÆœŽ„÷Šd¨=¯|i6VãʳU†@¤œq kIDè¨ü´+½qÂÛ¨›-U@#i9bïl¯Ÿ1UôXÁõÕ5æ‰÷•ãÛkê_ú é?ý]ô8¼ Ä'83ÔnWâ°t‚ƒ&ŽÖúg}ÿu7ïµ'9‚`üg÷¹æßö1ög„C…èĈ–°oJS" #9@6cýùõ2P–ž§uZëýÛü¼Çš¼S” f.‹Ê–‡Ù>±k"D\)x~kÏ—úãÈéM0ž*M R‘ ‰ †„`€5 Ô@ ®²E¹ÐõŨÁÄ€’€ñMût*ÔÛøÔYNãØ ½[ ¢ªb€Xc‘‚6‰ä°@'{`ãf¹´æ%λÿû{ó/~âû ö?¯?ÜË€¸Ð O2æ]Üâ@Þèb#M™:E‹h‹Dí×ÅÞ½4„q)Õ}æqÁ’aöÈ%¸›Q{FVßV]íí*Ó‚Zš9õ[‚aäžÌžÔ­§r¾­ôQnj\ÙµWcå0ç=oz²¹„ÖkÈè)uÍùôGd‹-ë·¯wÑ<³ÉmߢÆmÿýßïÿ6nüý¸Öꄊ&H µÁDCÈš‹]z¶²#ï&¶Š- Dj1§p0W¨‘ãñˆ dM¶n¶6Òï±^º¥0yЩ¡T±åQXG±ÖDà:)"»1ÖcA[1MÀ˜ "ç·€ƒ8áÁÅA® üKŒý%»M,ëJ»ŸØ%ÌùÕ{\80óÆQ'BG6íʇf¹åfÜÛQo£=OµY¹ñÕ_÷’»c5²*딳÷=(›äʫࢠÎíñŽãµÛªfD ŽÊåNcDÓúV(° ÃëF‘£2nÍ-ÕwiFW‰¤Zqψ‚îΊ+«gv&-/…ÏôÅS€ÆjLcÀ i†d”p‰¹,VR “È!—3cJ¥p&Šû@ZsOrB·ln°ÊP#U°Ao¶B©HGÞ˜kãø£z“´ÅõAæÆ‘É›îìág¦]ª0á9­Ã.ÛÝë)ºixúi~>7-|[µ§o‡Aů—°”ûvcôfúéö´z¼®Öõ¢"§Ãõ“=ËŸï§®ñàÒãéK~?õ;•¾Õ«´Ï=îW[¯žˆÞ¸ùš<÷í€Ê¼FËï¸hxìéj0Á Žš;’fȨ ÜÓƒºP±eàNô»²ˆf¿þ[“b/¶>’ö‘?|‘µ 4Í n•Zˆ†¶vêL+á £aa°$ˆö‚Ž2ª éìÇ|ûýàÚœN='-E…õéÐtöÞµSYxÏÖY  å`²[ä#yÓ<µÔ¬Õ @¼©1 G…–èMíë·m÷ªØ"„öl[óZbQ÷¥H+Æ Ox³'2G ªÅJ@Ú,v¸ù–Ì;+-ÏÉ%Ø™šÄ› žN[ÛhŠ)‘µ«Ô’=KàtvœS@ò|åu?Z£SMDc1¡~%VÆ+f±G¤ŠÒ3*ƒŒBEšÿÒ·(ýa>Ìž9˜ÈéDÚ¾ÛÂ3ºl °— ›-;¦)&MÊ㸭Õ0@!T)pNÛ¦V7h ˜¢ M€áÊ»ÉÞp 6˜ì%Ö߬r ‹0`)+„•Š ÊEˆÛjo½ÕsZ‰a§@vœŸ¸…-|¦‰æÜÃ]ð¦b1Í|z6Æd§JÇlˆŽÇérZ{TŒé ¨x¹¬á5õ¶+e²¸4n:áA8mÉy!†ÀÆa  á1Ôƒ ÐPàf¥nãÂÂGuÌgK¡/ý¯O¼n~Ô#íð8x·ÿ÷GºqÿD$-üì#Nýäuâóó¾KþÞþVúã/ïþÍìbDËçOæ NC)„\[ŸòeÝǼݸM.#þÈòÁaì²CRµ¯âÂǽý?è]®ý»H§>[®È*…ŠpD4DXÂT…uªÚySÎýéS‘ŸÖ½šcçúO®Q¹ØOÃZœÍi™Vƒç0À$²õ.¼çÊ·_9µ¬ ‹#D0Õ%º$׳ßG\&ƒ9Ötoë­ý8•Ï¿ã'^#˜„ÄÈ@:>¶UX˜†12ÇDI oǺ²•ÏÒ­^pÜ´M4îÉ4 mO& qØ\ ­¨_®³›hN÷ü*UÜ×ý¯~ø?§h–ÒÕªõÓ†PéÐ1Î?q<Ö˜ .ržlX¶†úýžJ‘i?”Á¹] ­|¼ÖQ?«Èr(]¢ÞŠ+G˜Ó2c<Â5:ÖùÁ=_ðšW}{h¶XÃ,©°»ýùF°`ÊÐÝŒb–c‰lâ‰Èe¼Ü0dkÿÁž/PH9Ž¡·)^®Ö Õ/”sBYl7h°Ú '»A6dJ7c]—g ‰A¸ àýþœÂÃ(„Sd …à\´€)ØÕ\¶èÖ)æ%Qn‰Š[j ‘±Ù1Ò¨»„Z@9Ì…]]%Z‡îí”™ Ez¬,dÛúËy‚ r‰Õí>¢®ÛÒiæ¸ü*º <¢8˜Qk×­Á©â&+³˜}ââÐû à"ôˆDÕ# Ÿã&¾#Ú8d¿¯Z?÷Ìÿð§‰D˜—ò’µæ. â¸gÝ[,+@ëo v'[û8È€é‘x¿ðÇb òÌŽ’}@œJ’(Ѳ¦h .Z…j¤€ 0@ 0ä7|aÜM´ð­Ð (É Ò—5½U먞lסÜì‘_®<ó§ÈbáJ´7â–Lµ•uMmvÔÎuÇmIõÈñ2·—ÿ&: =A±µìÀT¤¼U§²‡ú¡Û,IláX¯šÑ‡êLÔŒ‰t_yýùâŒw€Ñ«þyµ¤BfŠg2]Z‚"-ñü\ÚË`ËQ¥ã麞è€ÇJ£*TCãÍJâH%– [ÑMù~4Ø8ÛWË|J=ðJÊ5yBî•kd(m<Õc£ªE¦ùÏMê?ý%_ð9Î<•òqnù=íÔn’ÙÇHRkÐaÇpŸþ¸­…Ò£’¥°ÆqD)ù¸ÒÿN•¿PÕP‰N\ šƒÅÿh­bÍñAK6UAÕç‡3 ×ó£µVÌØ,Rˆ7ˆªbý‚k޲χu~\s«®â€ìžiùµœ‘@B²L»‰ýn¢=&ñˆº’~º~Z ¸Ð{¹(„°IØ" 4K»>Îr®ñÖȯ«ò¯؃g24C¬DöC:aÊÕ ""×÷ïÏúêç¯o±öœ‡o“Á|îá¿øç ·(ŸNµ±ƒAsQ#l®QE.VàÄ}eË=0·‚¹êÇ~[Ñ[7—ßðÏ£ã]éúFl8&c9L}4$ ƃ`àG(lƒØ$Æ™|¯ÜÓèz’ŽÀ[ª)ô—êõ|û߯ߠÆgS :À€ 9ZFÎùûÌŽ§«³Ý‹.k罫ceð @ Uá€c(‚(!0‘ÐRášãéð.¼SL\ûu޽؟ãWé·êSò«õo;| îßþíí£y|õ:WhþwaEGù7 9EÏ@­c‰(1Á É„ªuñŽ-”Ùí)ŠJ€Â¿ðM8€×–ÃÛûÿ/ÅåøV^¹Ô“®ë:AÀj¥¶’²jËbuq­õvØZíÄ ¸Fžàª¼o=¥rìqu7u;^ÒW>G›F%6þY4ÒóuÞtÕ°—«hÍ-Îoݵj{lÚDÎ/õ_ñ>‡/-ë0ªëk.Y g‘¿eû§äý„Ÿ/ÍøxWßa‹Ll7„Ž“ÕQ{™Ó8cçHQ=ÉHU2ÝÃCNqíá6×<7À#VÆJéÇ·õòªÜ\Ãwê(±ê%æsÌì TxòýõÐç³½J˜eâ]’5ÙËèP„@”Á¡Àû„¸¨^RŒÏ<{fÁ ö›ÁIDG¿¢å[OUIYÀjJî+ZPi±Kb’uÛÈ5 áPê!Ñù>ëêðÇ}ö—¼”‡yFOù8íl~üÂ_=-k¸Á bRQP\KÍWzCo£Á«;V‰ÕØ“{v)Xã ’&¯9â—§Ë0{TÝUiuK½ž/ç>é^Í]+·Õì?´'ôs}A6ž¢–uËù€w%t}G)*ÿ¯.~õa>Ús©Ú½ 8†1|ði!vkV9hŠWÞï…?·g{ýÞ ø9óë›ïyN2^™# R‚Œ"qHh8E(#º%w` ÄÑ$ ‘¬Ó‰Ac1³Ì™æ’ú”:½ít:×ãƒÃTR‡=>1(Ôä«ulH‡VlÒP ‚ }p¸9À×ÿ /º¤O¤yþŠÊYn¹ ›JˆÒK6>¸˜;õÃã$³r«Bw.tyÁòT½Ÿ·e5*Æî˜Ô!‰ºe¡Ù×ÚîæHtÁÍ™OjèØU%ï_Ž~iî—ÓÞ1^¢]‡×ñË{lb>ÆÁ_¸3ø¼Í‚_+™`“÷œ³+…%4Ûƒg{ò=^Ø®ú ç5Ñ®©÷?Î_ÃD™!²Îi†fD L$_è_ózoüõs3ñ-í‘–R§Âúù´²¿©&¬û¨^/Rà³u–pç)o®¥ÑšŒúë½§1[µ‚8Jϳ~®(Š^y‡ #@ãÞàè9b¦íQÿjŠ_ùÒü×ð3géÓ€si§Ë¦3!>)>ÉLÁÚB}2.ÚúÉÌÁ?%(`G´™³ÈE1¸&GçÖL#@“‰QU:n­^ÂdF º5–¹ô¶½³/³hç{gúí—¾î1~ó÷ –ïù ÷‹™õm»ïþ]x@Å1Lò(‚ìÈ 5`(‚#× qÔ¢¸R;ãs —#­-‰žcÏó͆yÑëºÙ,‹]½]¬Åú€S Í˲S(•@Ð"‘ã¨*uù4I*ÉÝÛµÓg®§§·äCºkžp)³¡<äšvñóv 3-(xúÒ®fÚ¬eÎmÛ¡™¹Eõg+÷Íý|Î{×nÿ8k÷m Ò-ˆàªPóŠ`€ !@e %¶,çR#”^cc Š)1uvg.›RM§ÂBIg™-ñ¶Øq]c³„öVIÅAAJ6G—}æ{M"¶Ö›f¼Ýí4nÌE [°›"6µú¡E>Ë“Tm)x=Ô“§ ,q(î’ +ËrKÔŒR²ÂS¤ö€)$ Ë6vâ £Q@€l\0nzìò¾wÿ6§LûÓ9°¨ Í`sÂk×÷µ™Ã+Ž¿,ÌæŸqBää<e'‹¼ðDý¼ª~©÷è [öÎDŠšò%j+9ßÚD–öVR'­®Ö¬±Æ£JO‘mnô‹õÐê½—Aâ„ ;˺>Œïçš%£·“êÉÊ6ù;jÝÓP6•Ãáp¿ˆ›žÐåí&cFýÎu+V•]Ò­*'"Íb:‰‚¶û«X˜"‡v*;¨+¬ð@ôiâ‘L`äAi’ÅM 2ÔBN$à¤wÏT}²fy×ɵôÑ>¼†~#Mhˆbз¸ö“@n~Ïì[„(Ùnuîï÷æ¢!£}ãîišDt'+>Ú­t)y¶b!Çã¹°”J×ãNc-Ì’`q»‡‡LŽ„#ƒû-,ìôŠ 5 ü;ë2|¿CÙÏšDú°îÀ†U‡!QJºâ`E©èž¨lEÂÈ$V=zNÅö%í»ÿ±€GF< +ƒçѲ½ªh‰@!ÑuœP_ïû-Øñ×NÖé÷û6_7ç›Ëät*¡s([¡5W_éòdÝ0 J ³…Fuœ¬1-ØeO¦r’ΞOG•SÃ!VIƒ)Y¢d¦ÑA„ÚÙtV+9¢BÑ 4m ¤qÙR6ÓbÌŠW¸àHCz:rÍ´!9<Î>Þ}dÒi.§~Pî³_E½êµË—Í’I¬ïÖßò|–$ÉçðeÔD7•SöÒ£_>sggÍŽb­h8Vp•ÉÒ%Òæ>—±ÈÏ-‰dXø»½lÆà<Q lÂ÷ÍÇ È fè·äÙí9õtdG‰l­D,e‰©Ä¡—#¼}oŸÏX(‡#]€© ðÍØ ˹€÷‚'"ˆTgÐíèk»w¥D½cwH*&Gy´c¨¢‚ºÚ’²À®~n_Ëp¤ŽJ1mÄj,^T’®ƒ¿Ð£¼Ôµ…wç4Ò`ÛÂcë'®Í‚¿ÖË1[Û‰±*÷¥?Sµ!­ɯæ"lèl¬¾ìx¼þú—ë‹¡xy­äiE`d2*š™ Áa^ÒÉÝñð}?¼v(Æ«~`IîblñRá#{>ƒŽæGýÅqM è‰B |ïÖc¯uôËüßļM‰6GØžP-ÇN%{»½M©FC—l©KµÅJ„‰MÁWr?ˆ1Æ[¼€ê+eDÆqܾ|‡c¸ Ö+rE³Vx“î.@ ³¦°Ä1A‰í$Ĩ[¡iGîÊP>Ÿî{é£@ÔúŠªиj·žRD‘BH6P \I âFr0Ò IŽ™é«ù ´[%LñHÇ«ÐÅɨhÎ÷ÉW»Â¹7cÙç‹{ŽéH&Ö±fG)èZqV‚dÔ²d†¦ü/ÈÜ–§þ²Š»ëáÅåL\ù½~Ù øšR´ègMþ3Íþ“?L44@®‰q¥WÍ·ºçEœh ñźkÜsÈ Žðï Vì,Ó!ÓìÔR8Wr=‰ée2Ô \R‘]w²ÐiŠ»”ÔR ·h{?e¡©Õn)Œ°Y]5Sõ#ûó¬Mx®>µ•GÁ¾u|¿%õ»žg[ó°aƒ§#(–óÛvº`Šzßx\/ñß|¾¿.ö<'»û=%÷ß‹ž;ë > “›–ÔvÇw9ö6¾øÞóHZÌõ«“ÐXÌàk¼š©;æX­NmV3-cÀÄæÜV~Œ0à)`̓Q³éOwšÝ¡)¶½ãùJuçÇVÔÌ™û¯gôáûøFûó´¢ð$¨1Î09‚5 DUKúÜQºõÌf÷4¼{¦ÖA(9@¬ÙL3LíokU†|Æls—ƒ*סeAš%¸B»É—åÏ'™„ :JCÀX/ùkZêãK°¿z=žÚ2±ãûþ.S‹% Zde¤ͨ¬fZÌÀ0 Jˆ11º~ìw5.¥ÎT‘AB¤ÓL¥ÃzìÎ-{Ô+­P¿nïÂûf_NÝܘó(-²rrv¿C]}\Å·qKj뺡#ƒ9ÙŽ)Ùè·;oú¡_?:=ÒÊfšèšß6+­~wæçòvı†:9ïç/??ì<ßÉþøëoþåõOý‡ÿöù§?;?¯K³Ã9ŒâáöX”Ûúê ˜•I‰ö:-LMÈ‚)¨já!V^eåN‰6€Ñݦs˜Æy@–³QQÒT'§„z¡(henTåZåEHP´C›ZƒÄŠw¼ÀêDzoKËŽº,Œ¹dcŸik¯št¯:›ßöüCï™·êšò>H8,Ñ ,ÕÃÛ¬ª9\ËÉÑš¾"™GL£ŸÞÌ(}¿ ‚föÏÃötºhÒŸÿî:õÇ ý2ÉĽ¼3¿Äºmpvl¯£6þãä À;m>‚Oƒ‹UÂÜQ¬OÜOx®âUüu&ؤ}áÈbpûÉFJ[íl¹“ŽòäJº£ïY+ÿö ýæï|ý8ÿZ…ué8 lFB5u9)üÄôX=ÓýãÄ…ixÄõ’Ô„–¾6¯ @®¬ì$z¬UB(V\#x¸¼Ç\5x’ûšò×ðXÇóZæÊÅ£Œ²à ó§Gk#ñž/ç*Ì4±¤x¢hS©k9 Y Ä"Ã¥ OšÝ@)Åì®…D ¨gÉ ÚaA[x±¦¸./Çe/5øøÃ¿á[Ýk¼5é•ê‹z}+÷'wŸ÷ÊòÉÃ.€Pq€ üø( FEÅÕ°{­»3k-eï]R`P6z¿êjŽ•Ó9Å+†ª¥¶Êzüb¨ïß‘ %!¨pdRž¥P„¨ª#j°H’{Ä íðê'ÛŠ£ë*.êЙãhöÓÖ¹oõ†¹~£Ì‘ú«UoO™‡O§XåuÙ_¦]"¼¬j3 gWp±g÷Ÿt—b4@€˜JW”!.`ÀÖâÍ¥ÞǶ…ËËÜÓÜ¡]#5¦Í¶TZ!#±Oép ·×™Fa”.ÄshD ÃPˆÀü ²là]<^!´¡‡¡Dé1KBÂl¯DXc+ ™Â›»ŒãšSÆ5L,IWÁy倔 ’Ñ "†X€ L1Æ·õ/-ÿÉãßQÃBã`wç7lØf:­Gd tB!M!Ñ’ºoJLˆ$F=¤÷óÃ[âh¼„iÁ5þZŽV‚kk/cLk{f|ÌôY©{‹IÑ UòÈ“$E€<Â^¯UCBô~¢=ͤ٠H°úùžHyWçR'0ÀaC¤ËM 9÷ïJ¦UwvåIè×ÑiQØOë¾ò F\×(µÆu[hŠ›ƒøšÖМE-þéjÀ^áç7÷Iᢅɬàhð6z €«#Ô§+¸³Ÿ\ÐxkŽo*§ %,Õ ¾Ð}ЦÆZ#éf‚9ð³ëywîWÛø^¼m‚™)ñømM5« ”!´UJ5 í]´&U¢ y¹&2,å /lôžþq¢'ˆ@&ÚB „‹C $”‘l¨1pÐíLv„ä©8qÎAÝÐÁM•Àí6a‚òRjÛ¢Ô# ŒXÐïB¨rÑ[#%§jÝ'd÷Ö;cˆ¢a\kžÓ‰â‰=çDœj}-µós¼® CÓ­‹]Š$äÏ}auLUY+¹tÞDtHi :^ÒéƒÕàÏuÉ;(Ö’—Ò‘SÀM tš;ªä_‹Ð.ü°¨¨Æ~:%‡‰Ž:Ͷ³Ê¥&ê®A…•8lkв 5[ô„³O‰óRïxÈîÖ$ SèiÁPw‹‚y–:©UôÞ«HÇ&åFdªd$˜ ¼#IuûD‚Tób«ÃV¼aHJ´¥d–³µz¹O©X2"Ô(X`–I tH2Éy¹Cª†OzœÖr“h¾Ço;+{¡JÌ)>û‡'¿ÿþÝ?wüù—QåÑÝŠÞ´ûïÜÿÞ÷Ý-M¯ê¾¼‰ŸØ;ã=÷-ëCŽìdí{YÆ·ž/ïí?_ÿ }?¼$ŸÛÃ'^?Ú˜Hñ]Ø `8¶ì•±ûòäÃXF êf’€i[ÛµTú¾(éùÍÝ7÷Ûèx?ëë}Ž}ùº5>Œ5Óu¶mƒ§ŠÅàóÎVã>-…ß­cùWÜQI¤4 Já-“묤yTKÔ^ähoƒQ­ Ê‰}³Ã)kº•ÓÂ’ÕÞQØMʆ|40tu¯Oø©Ø s". •lÙ¿|Xº»¸ØŸëïúµyýñ[6µ±vf Kè –<\·“98‡ï·ï=vuÌŸß Ø¾ŽÇö>ÄØdu Áðñ±ýæí:æ4-öæCmŸïÃV+Z RBµŒ÷ZRÛô²…އî–Ð ( ±·€W\ Q„ºÎ‹ŠP÷n]NÃJBÝÇå/%¿»åº‹½¸«ú§~ª MÞμtÙp³‚“|ðÙZW_î=Øzp467]ï·ùNû—¿ý‹?wDÃÖ£^ÊÎðeÿ4w<=í%Ø@š/(/3°w<Þöö~Œ‹˜\Ù=û¿ë°ä‚¦á¬tô)>m£k È© 4h£´':¢x g8$ƶ-m‰w ¸¸ã‰4z­õ¤ïOÛØÒW¿ššUïÈ€QA£rÏ Ì–É¸ 5$€€…VÛŽGºî ”.ˆfJË®‰Xhëûæ5ñE¾ws²üæÌsüa…@:æWFNø¯ÇA€1±¤±…K5ÃÄr*†Ä3Ø&c'­‰" 9|ªÁFXPÓò=á ¦”tT¿Öª((J1¡X¨LÐ!@C „¬""¨%&Pž¢ý’\OÑ_àSÉ‘¥ßZCWmö_úý «×È-ó¾ò³úv[;&÷»GO[gÉ:úÔøÅz³ÎÔ§òÌ[ɧõô¦ƒ¤G‹KlëÍÁŒN;Ÿ6Lú(oÎŒ\ ¯Äܨ©öÔòØã⚟>û—öA~€]‚Ò¨0ª'“òñŒX¶v)ršgc± ×¹brÐŽ7ræc˜Di…ÅIüÄFV’% óDt̘<Ú'2JØnÃv ¡—ÊažþÄžCÁðX×qpDSÍ«j]ä=QÿjOù‰ãd¾:³1¾A—ý"¶=®¦e ×Ë“T|bÉ>©û“ GXj×®yí(wísŒ]yÙ@J­€º2¥zŸ¹›’/~ºÆÃ|[  k©…°"µ©Z9^hF{(„¤–Yj÷î[ì_»ÇòÁÝ@Õ….À¶sÛmk¤Á„²§é “Ní«ù0”'M\»gƒÜš'”fѹ |¨©Ðvøm>–bÝÖQŠÄ ™YÊ·ý•œ¼ =]bJ`PcsfSYHqé1ÈŽàEl5ïAµ¨¦ÅWWœqÜY‚ºŒòl\3r%-”ÝÂÒ8i¥h#äŒ*a(z QéuØ–Ü #àª_Ìpé~鮾æš<'ÓÝå ˆçÂÂȰ4ŠC¾—®V/ê½€&TÌPKÔ €—P ƒ Z#¢SÜÖ^ÀqWµ=f¡±f¸uê¢&1k†O R¢ 1ÔJIR´fݾ–Z‚6IlIÁR²¶ÐÉèlãã‘\w,%)x?‹Ý¶M’òÚºtþÝúX…ží‡–£–zðVg)åÐ'¥³V£b‡° H Zl—Ç‹PÎLôõåö.ëÏÿC•ãï}é^#Üì˜ÇG¿«›RÜÇ­†Ô|?3rÇÓ³ü%þ‰<­ÕŠd'ŽÂ$Ì’XвÊɆ6Ô*3âú,®•wu€ÖTˆôü¥¯ƒ RQG[9©-éÒX*ÖÐTËr3OK0™W<&šãKù›Z»¸vqhSr¶GmÒú%Ô¯^ÅÍÖCûdK¹L$ÔÅ/V;M¡~­kÐ œoæû¥¼N)~Ï|çÎs;;ÏŸðþWÀ‚½YëùñÜm"–EkÇÞödy>³#þ7¥ßgœ¿0÷Kwß?ïŽÑý‡AÔ•Ù.3`E%Ó8Üpf·ÖôÑ8+Õª#)~•‘©ô-£!ÈQõz/“ªHWYšû©ö‰i7¶.q½•«´Àýß?ÞØÜßýe>þÐ{H#îq"a'»ää К‚KƧ!¯Ê·œa~øˆã÷‘]³šQ: H"’pñNB%jØi.„"þcç¨À-¥±Æ ÿ!ý$(2D.ÕQ‚‘è|j±£MÄ bsÛje4®Aç­Í4BbŠuä‘‘Ñ®”7H”Å¢b/‚ŽšôT®k¾ú ZC1šÆ¨eo2æ»ÛJöâí'^_zîtu6™é½~ñ^Ìòì ­LéŠJ1¿­ùêÉœ† ›vµHë‡ê2ƒÙÓçÞUø:ÜBk]@Ò™ï9©Š}œš_b¸_oÍt9øã²§õiŸ×Ùœó½Q7¼Ço!U‚ó&ëX÷ûWfì⊪i\¤uæûEÏÃõsWîeÇÝBPñr~ü°´=¼O74?£çèꇤýcÿ¶5%5ÑÔ„€–ÀQW{FÚ¢ûm¡âxÔ±-ìmØèH!ï̹OìöD¨DsÈÇ…'© ±@#P ‚åX£¸Ý™0A5Xk¶è·xgÊJdžïG¸›¢mÀ: ÈŒû´¦46çT4·jr§{RëCäuC?:.I~ +eA.î˜0{Ýu©„ÒŠl ÜGõþ`«rç"=q5ø —”{ê(ó,\áž©Fb ÄðS™©ÝS\pÒZôq: [É22¾|OÎË¢“åëjÛ'â3‘ 2¡…iF ¸bX !øt¬-*±Á6, ò#`?G•\£F%›ºC£ ,¹i<ªÁŸg|)bÀ8a÷ì*åÙÛÙœ:/U|an9|"Ü&Õb›h’Bµœ%!uY7g†ÚÕÛ+¼‘œš…|¯tý<_ÿ«þÿ [`^µÏê'*¯Ç™ÙV}˜³z3Õ¯ ~'š¯8{Ä78¢|T¶F,6´Éͼìß4Û¦…ö*Ž-•ꋤÕƒFFÅ–”oM°¨ž[°)®‚›ÍÞޛ͖bwo®nI©6+ç çØ…èÐ ¿ºUv!×aÑz–ÂÅ”ðÜ·NeÌe¨Œ8¨:BŸÀ$8BªV ghæ–'М'®µÁixÅáŸâ¿~>ïO)Û9÷#W4ôpd°døè÷TY‰u›ù‰bãüÚ÷ok?øöo¿år_øt>æÆp Ÿ·ùç‹<Ô³ð7ìØï;;{$(¼ùùñÍT]ŸÝÖÅÞÈ…#`ßBÓ-®aC‡C¡ËOTKnú?ùéç’åßÔ9wq‚&ÜëÆX4ˆ‰{ýšçµ¿}úÃ3«¡@lX¼Ç[í×k±¿ÎÚÅc²–ªýPÆ×s´»¬Š ½év5ÚpÈ`&QÛ7Äè|§Vå³0´Ü¾î€QbZEÔ†@Xy*ˆá#аçM}:D ¹4¦0L„ÑÛnk1àVCý'û?Œ{sè¤1ñÀZõö0 ’ ^à ±¹Œƒ¥÷ïüáüùÿ|Ý*ëHÌôæ:êÄÂcc ¼îÞ@ŒùOò³D†Å»uík\Òþ¹˜€&@€Àü˜Ž?¿üðÏš+24v¾¥6ÊàvŸ:ñvd†˜4ßÊÁ¬0F‡Ê CBgi†¹ë§¹–ëð~ƒÏŽ~º"é«^¿$ÍH (F¦JÎã#H*~J½±2Ä—ýöã”ïï?ãä8«×œØæR¬ÞGDCÚ Ö5ŽØvxÓ@ÿ«Ï„Þ}¿Ø=Ôœ?Z€ ‡F!ƒ¹˜ÿ<ŸÓQ()L ÌÂâQ6I.€Yt›¦«ý0^KËHŸÇn_ó{åØÛv%c|sz°ãʽ›õ+kÜ0ÿ.¯Ùb‡Z« &Kò@¤ëÉ{àaýd¹Uh¤ãJ‡ìA{ÔsVÇüuÁoZÕ-Þ3ÏÛóÿ¤«ãÓÒ­ÏD´Äøj0'° ÃùàÐ,|Ç÷>³û¡‡‰Ž¹Ð½•ñ¿–n "ÈCB¡Ø+âwæ€4 ÂU‹Vš.ƒk_ÂŇȴIÊ‘0ÛŽjR%F·ÊpHR`˜ŠB.ê'€@  €  bó U©òG* Ü^Ú¬¦Ñ‹d>l’;äÇ›©é˜=Ðá¹áG{ רÁÿ9ˆãï;³ê\iEà‚¦7sd‚¢·Ð—@é:ïÍ:|w‘LÑÉ£Ka•°ÑI©U§žµŽû(}ìœõêÇ,êÙIbÓ‘RîAÚbé!œ2€u\ЭôÕîÊ[­Ä+]+匊­Iz’Æè–®aVd¿S­î„©+*i5”H<\1ö­~3ËaœcåÁ[è‹f^Ú¡Q&~1ïŒÌø‰âÚsÝþì'Üþflþ-¶päžèmÃ…ÁBÏ8˜X­Æƒ8vZBÃP¹ôN1¦Su•uU&uK¼Þ¡UKð^­ûØÚ×XÈ¥± i…e«:ïµY•úöŠ¢  2< $†k¦Æì¹9Ût8©Ø÷½½õÖ/×{@ñç£Zã]G'ÓØv?ç%ØÞ„0"sP¹èjÌöCÆWôÝG¿ü^ö¿g Ô5…EGS|yy ¢W×ø“s}D3ÿ0çùÛÊV´{¿ØÑ7Mÿ²FïFcíØâH5šì c&H{5˜è1K[É‘ 7ãáçHú¤®@I7ådòÔ7÷/~Nžìê/}5 +†^´5S‰)U ä²i§7æ¿÷á·Ú¹¤Ù…u¹´ô¹Ä–^AÏÎC8³¥¡ºÍtAǦ3ÃC- €4†Xfp²L†j´!ð°©jæ×ó4S‚ÁH}×Sè(.ãÔ$> saȨ>ðE†;J %«˜j´Û…DiRH$°dh>«ÒÝø°†\œ»L›¨ÀO¯ý~ôœ‹W…Ì¥ ý·M‚ô¦»ç Óïûó ,››öš-f!¸ߨ›²F~#ã!TV´ED‹g ã;žrº¸„ŠžYBB¥3Ö, K*ýxéX"¦†R;LÁÖv ‰Ábsë³ Œ‘¥\×Bc±‹P18”ÀÕZÓí,¦‘íJ§4Äõ¨!©1êÚ©FΙè@Hil¶ãà:A'ÏØXnä9AúýÔÙóK楃ÃÛŸÏzN‚O;échí¬Gº¹ýówÿ|f¿:{¿œdvłǧ¿÷áùqëöp=־ijyÃúÕ_ CHaÞý=&+Ù"hí‹L„A°%b­:¾Ä²j0œÒì¢pnEj‚¢Ö«Ð×}ï€þ²(7`&–ÕâV¦!WÖ°°ÈÍ#mR'ÖXXH1"à…ЮEÚ ƒ5êü•{å.1šZ}éÎ ÏL­–õâ½í~hrP5Z£Ånä9‰=Å›ùV‡hìNQ(ê lèLí²)ÄÀp¾d²·{ƒýþ+Ykb Üõæu~ÿyóç´[v];j,%ŽQ2¯ü b4³ÆdMæºÞêä×Åe¬<ÙrñV“øDÌ5Zsè“R¡çÌRu•©GúGvaËÇ;÷o¼í<îç/ržn¬Í¸…ñþ³ÇÝ8ž^›¾—œHK!÷¹‡žoí—3Ïëß›½³Ë>è¡Õ>¶Xa°Ø$“›æ ¢dÿw'ÿÓÊ«¹B-Ù´ÉD!ѦëFÿì¡ DÕŸl¯XM…C‰<Òb–Ÿ‡Ï)¢ý´NüH*HÅ«Áù+T!"QBÉ[ºöUF¥iž»ëçÙ6«ÓòÂ6ç®ÒT5û±ëÚå+^lï¿TÖöŽWáöú¾³ìÐ4‡yßþ ïq¡ƒ–@¥v×póožyè¿¡ì™ö‹Í¥‡'®-ëÐrÞ¬R>÷A:Ùë¿(™ç]wMÕ9ÉtÛñ{±èEøhhFÆúPvä™_¿1OÖï¶×EàP¡c§,H”"ÚDÈ…솈iÈ&×$.)EǺ/NV—=û€mþ-Ç–Ø?zØ•6^wí}ÆÿCÁÿ=#}ôîVoâ:´…xaìçJ3Œ4.L2;Ÿ$ª6¥Æ€—ãúXY~__4vñϽíˆÌbàq¬Là·é¹kO¶¤ùûÿ=Ûäì9êrúC|5màö»ÛÎ[àßÃú£ëq÷Ozæ!B$BD4Ú°)ߤ`y¨ëˆ³HA¿]!®²ûÎYõï=|Pÿ¦ÓŸ±Â¸Ý@Cç]Ý7_º6‹ºû{»eæ™ÇM÷’ó9Ö¯ƒ¿4ûÛ&ú×qAÌé²ÕÀL¼úÿ³ -üTõ†¦R¤Ü³3OÉ¢$(¤¡¼=Ñvæ ™ ò›½¶>io=Æ¢Ÿ;û! ]¥è© ’M« Wà¢Õªz,© U©©¶IkÆìùVÜŸc9×Ä;µ ]¦¯Û©â¥E%32]Õ¬ÖB‡¾¹|Ü=ÉuÓ¥¢äé¬Rf3ëntÛ²âU ¹aç`¦½æOàm…yP×ʬ¶ò[t?Ô'`+êë{déMuD(<€‚!ê&ÄŠU¤,?Ž+ZBáÅ‚ZãŒkÙ#ßÉ]A#*R6*YÀ"„@Ê (,¨Q«XX¨ÁQÕÑJ­Z3ã¥ê‘êdÝhS#Òö¾Ãô×»}¡ÖÃщ]‹Çëù¼/#wGÓ(' ²±­Ì†Rèà D=H4¢ Ò"A6Á× 2h*TþF*Ÿ)fp¾7Y€yŠ|‰ÏzÃï§v^?þí­7÷§óµLïn$V$ø"p_„B£gxí9`-†Ó:iÓ(b.ŒÇØ”P0: ˆF8*œ l¡ÃÄͳ^ûF!]˜\×1Ow×Ò2Q&WG§ò¬“Ûègl¡FÄ fE&ñ ¥Hd<OñªX:÷鱆¢¸©š0ö8ú(ePZ,¹žaK”€jª8n”˜†"#ºW“2*M‡)î&®¤I8~ÎÎHÃô9  4OS¾-M‡¼ó§z­×Z©°åsSŠ0ÊÖyx<­š÷¿*úxÀ™Q¿Í48u Ëc‹’Œ68÷ëïΧ‡~ìãeŽë¥“zYÀ-8Ó6n'+v¥×‘@p¤ 7f‹†½X±,š¥* î„t‡Å0¬´ŒNú*20*)÷ªÞð³€"qׄf{(2»ã® l}wf,kj©˜€ë=õþ˜å±âܨK¥@a«fZFß»C„êl²Tj:Ù§?tèñÓÀì±sFóŒQ;²Ca×4lÏéÅÌÀ^S $ÔÎ2ªg*êzf> d®k eÁB ¦ØƒsÖ'k¢„Ô4M;Ù8<ƒ½Í¬,·d‡€’÷ƒµª”½<3>#µ›OˆÐˆû~W!aÍ u—‰²LÕU¡”+éæcÌìÊÅTÃÇÌWÏ$Æi¯C‡ßý£@£\@$Ë~"ÙQÈ}Jñ~0ŧÔÿ5õª¯\ 8¾BÊUØb[ðÔôŠ8Mæ°G‘ªyy¥Ïoô±zùáŽüº_9,ܲ˜ŽÀÞ¾è¶ÝC.è’bôàZOÇÌŸ—÷]¸¬(Ö=s¶ÉU4† vÁˆ††L‰ ‹ ªÙæJûb"uzÔ«$AÅ0Hß=†sí æVWàDo)âA僺s¤—û¾zDc¢=ðºÏDµº«yЯ<Ïä¾’Ô&s ÒÝIä:éºP £"eÐåAd¼#ª9ˆ°‡Áå P•\ýéoú?µuãè&èƒN|£¼®æ9&ªtÖ]¬\ø<ë›sò×Itå{= wn·ýÔ~¹Óào/P, p=ßß‚ûÚ¥Í>H‹FüúdùÌGDYµ¸•;\n™ZQ,hi`ì®k«[÷mjwWuä  é˜úÜpÁ=&lµ¥4å¿—/·“olm=2±*j·Š[ʱnàºÍû³ØIL—λ€œêY´ÛŒXŸN £áÙ!龯LR??F&þ|Fâ­'-qÍ ÷q"˜ÝŒ¨6oÌ;k½e4bZ8¸è•á¤;B[]š;¯¿_‘(õ¼†Çù½ïòÙùùàsŽhÙÔrüêÝœsíÏÚñýõó>Y £v¹ÆNæ²bŽí÷ß{À³íÖí@Ê)?µûÜaÖc©guOú,m6öÿ¿b¸0ôxŒç»u5üMè  …´‰ƒÿL1³ÊhªO=?é¶J<Ñ ¼n€ @Á¦å”+mrd6u¢ÇMúõðûþM×{4FŸJwQ& Ú*ćPÎÎ?ªsnʵ&aË+ÖÔ÷E‚ÛZ$:vŠ`ôB'ã:ѪuL$òu\ºž?>ik–vW¿ÀL‡¢ðdz¬o©;#Þü~ÛiM˜m´Œ€!‚ÆávÛò¢£ãýøí=¬±ö9ä6Oa¡©½¶‹?z~©Hto}l Â&ä<ûц©™¶ÍFù=¸“§Å+íaЂ·Z^½üÆq]렻öÄC}^· ©}F¦RÓ6PJÉ7ƒrèn? jê´ÂwRÂ$¾ÜÇ"À!›ˆ=žYgîïôÀq¨•Ï ;¡%¨æ ñžC—FF¥8g…Sç©ÚCW)/âˆym¢!1Õ}FH0€@K`‘7¸ ˆkqÐ'TáEªÅ„–,‘%T¥'u8Tày­ü0ût³Tö· ô,:˾„ƬÔê4ï#×Í|{u{ÝE u• w¤'çäïÈry<þ™Ñ£W«}Þ¬åœ2øÔ“ë~Ïwd\—{`IëáØIuû£|J蔯“]8)ü-²ê„>L ö1þ Ó`© R"zi¼rͨ´xŠ1 GR-Q9qÅ8^MÖYl'õÍÙ ÒÆQeGº$¡aG£eûðpîž@†ÈiÎ2-¡ñÔ|Tê’€âq^½>7r¶^Û¼½üÕÿÉþM¶ ¦@¡(j¨²ß sð¾HJ+£æiWmª.ÈÇìX^2Ï…‚T‡µ3uÍvée£Š²fÊ×Ù“2.äTqUvlyé©Q5P“B®”b³Œ5$¤!¬¤445¢ƒ(së°øˆPÿ3ÿOñõtìúË^ ''\—ꨰ˜Ø¶”s}×//nu}Yý?—˜ÓÖ® ŠRMxR­ÞâÿüR¯j,?ó^Ÿd÷y_Õ1ÑÒ蘕`Ë“úþL^^Ÿ@wLŠ3‚$ÖÑìTIh,Œe #,£[÷š{\ñÝvJ­dF.8;uªtÇÛ–,Ä"ß” @À@©g ,•¯5N'“E£_ž kÏ£œµ>kqÏå­ƒs0N½WgÊ9«éjÉÚªvEÂá¶Î¦{ÁàȂʠ @¤ZbY€Êc;ª„L$ˆ±¶óÆå%¶¸ËÍæ«[ ö cª×¹U?˜†µ!D£ØÈF% HOfŒ˜ËI” ÁÃô^¬L˺[õÌø´¦%Xº{ËCñ¬­ßTÿRô*y 'jßm%ü¯ã_^þ–Þ'wï•Ë ¥Z~Òï‹ß TÏ¢‚îó„sÄ7Q!/ìbÅ žðâ6Ö±† çb/Ž~œš_p·úÅ' —…+Ùºý¹žOe ¿_‚ )¸õœèsÐ #Š8";ˆ!6]çSˆK¦ÖEÁlRE±ºE e85.в‚ÕÃbÄFŠìÐétTo˜©s&+'X¦U¸Ô3Nkd’€|­˜¨±{0³Ü7ù<ïw„wµëâ)÷‡¹÷††l¬/¿Cæx6¥H§N¿]ý9~9þN“V¼)&ó³’nóÇ=7ë²4ŠÑËéçp{_wHPqäz¾]mÊŽíÑ+¤(»Á}ÐÆ½ö± Íbœ„6¡F|´µ×j°Õ’ª:üå¸a‚u,Ò.wŒáÕ¢aeNª¡Rˆò;º²»ÉEXˆÖ @…¶ìÈÖTAlD´r`¯ ¥ŠõLé§?ÁHQ`®‰51ž² ¢ÝÚÔ Êa§ñî1Æž½ûÓ]fˆq$äíÂÎv_õ—¿;íé4ÐnŸõÏk¾‡Ùk-½j4ö䡨Ⲭfñ*%e\ñõÇ}D·ì*s)Û´`AÁÞéGÝ/£/váæÏåЂô€Þ©Üì,ú×¾ÜT‹…'~ü®k]z5>ç;ß7ï8ø|ȽѵÏÕãÅ¥¡°uß<Üçì¼¶4Z˜SÍXã""0Y®µY{žrêfüÊÍv@;û'Ò_“!‡¶J=Ö{Àu™º[€õ³ÑFP(a©fk › D³Ø%ÍH7?ÓÅW; R5''„Ò€H¹”Ä€®þ)/‚uÂ:»5©ò'H´š¿çI<]µ¹wÊ·þ¹¯Û>Zyºé/ì¯ÿ¸]§ÚÎ=NaÊ4ÚÉîŒÙqBêd&W³ŒÑŽŽúHíž´ñØN)¹‹m ,)}B(Ä‚~#9ù*Òp§лľ!ËV}>þÓ=›ü«æ/îþÂò¼é<Šdí-ö¡lp=|Lÿ7¼ôe ó]γþœù—ŽçgiÉÏl~×…Ák£iL« L«Ê€ŠjŒÀªG*R™ŠØšÊÜ q¶6åUËIwª¹•}SiR{x@q¤-Ü“>ÜœÅ|•¤ð´2¥éóÏæŸêeüü±&ë¯ ã ä"ÅÂ]U=ý>ùiãŒCh»I¼ÜÅ5ï˜}??ZÎo÷Ù{MÝgäÑjÇ‰Ž‚Vu¾{T÷ÜÑ×gø@¨ÐVéX•ú`'¥þ snölŒÕù¹µŸÚ/øxöŽ-ÒèyœçÒb»¸ÇòjAS÷ܤ8£\”CéÁ^:Öð’@4ŠžÇ±mKî‰çÉ>ÑÎÒ7»~›Îÿo`©GpØÉ+ª· f™¢Sc¢ª“&WQïÝŸøŽW(fH§Ž©“ЙykÐt®?{Já‡]7?sŸXìŒy{¨¡e… ]”™Ú•ÀLËbÞ1•1•M ±£šåImM2sE±Ö¦8´càìR\òѼR.!?ç‹ykÚ‰öäNCÇ"Ç8Yïé†U¾r„ ¹ع}ÝœÅr\ô|çV»ô\š=¨Qg7'~ûN½šÍ3~V\ Œq =ÉùL¨Aluªi7„â°‚@—X|bdµ°AG€ú@KF ºñ¸ºCb( ºrö¡R ½9’¶Ýè÷/çýµÒ#`N²Öæ8ñôùiæó~ ýi|½2w{R¿L_ŽÆPA¶€6©j`ŠH¦ÓhèïA6À€@€@„*›É7‹Õ©žãUMCa_oç*sR¢N8¹<7ûñ±ï±ëlåÃp PÒ€€Y«¼–ÔÃ÷ô±%\–[¥Ú9ÿÔ:ÀÈû=¢µê•Xt CWߣþñäÌõ¯k¶ÁáçòóçH´¯ˆ`FHĘ’p“g¼…6­‹I§h VY>jŸ‘ ­°KIŒ°ÌHP(š"Q̨h“Ú1ËÊËsóò ÷±8 [QY#àkÌCÆ,ìèVç½?°øs‘r`¾Ï6¿(¨FŸ+.Yv©P³TÇ,woe¢3lNön¬­XV0jwÖZ9u9èUvr½û³-©œCÈ9 ½×)ûkÁ0q´ü¡Wë!ì-HYKé£`„5¿k›tƒ ¢y)qí˜ö)lO¡zõ‡@ÂAgr¿QW¡­NñÜ“z"jX"'‡é¼R@jW,†³ÔÚ2SaT3ãô0ƸLñðNþïã“ÑAòcÐêTˆ±k”G_t:1'L<—À¤.+ëÇtùžÙ8Zp‚ƒ¦ö1Î5+çÁ­*RX@!mTÉtXsÖ”‡TKÊo|Ý\Oá.:ˆìWÍBÂ’â®àÿt(QÑÀè‚üŠÙ#êrO7†XÁTppàbrÇl‘"vf`!^eËïv¾ùù^íž(SBp6_QXÇX´ Ù9Ö„6ÿí?IC”¶[ןNr9š…Þb gøõ^вÒÿC¤‚:÷èÏÕØDŒ‰Åµ‰æ©J³Ñ%*õÊ’ÞkýŠo¶ÖW˜îx••š™Óº¯"˜á»´ô½…}s¸—s{ª\—ïñÄÊ.Üöñq>^TŒ:Ç÷5(Ìè‹ IE°¬…/rú©Õœ;Ó[YÉÛ^KÔ®ô``Œ3Ê*#Ó-^ª Á ¤¡;d"ST§Z˜Ö5lÑT7™0ëÁSa†@‹xùQ,š—@š—nYÚd+†TL7¾m¾Ž¡ýŒE:¦xíùÃU¶{†¹èÙ2V·ê³èÝ>`„F2^íþrttÔ_ Õa"9jÝ0xêË—KR)üÕ“ÛNWBHÕ=3Txn¾3¹›#.&Ô#ÖS>yðD}/uwb.;½<`¯²·j çÒN¡û-¶E‹Íz÷Vt Œ&M³["þ´çLoîäªMç!OEOÃŽ+ éS._µ­§m-Z]G¨À‡ðl$@³%…ÿJâ?T-Ð2v!âðemˆ¦Ž6ØÂàÝ[{ݹ¦•<ü¤ämä@ ssø¶¬º{¢Ÿ°åßÖ 'ÁÀI¶C*’Þb2;à7çŸü= Á(+ͳțŽl†fcÙÉ4\yÅß½®öåQ†d@Õ¨T¦ 'Tš.Šl–͆¥™h¦KÙß9â1üÛe¥–iIM&®[@‘b:ˆ¢mÓìÃÔ°›Jÿo¨Ÿ>ó£>È'{SnV>;®@]rïÁ¹„w*ÛÆÇB«¯‡ÿéJŽ ^CÜ Yˆ+~¡ØTp\xÍü)º2Ï4…K†s¢?BâYZ”gwÔ¶‘Œ Á›Hi íÁï}ãšuíGêx:ŽH9™S1@.Ç'Pf4Ü„"}TŒ‚Ÿ¿4@Q›B“—è!ý8¢Ýô šèO8’Êó˜à5=SÕì\AžêÀTuȬA«9JvÈVº§öWÏ0³¤¨¾¤ßqЍ9,]n";Þ&5ÔõÔ—M©±0®¢‚n˜Dv™ŠSßñ`*Ï—‹k${íYÿpücÏŽHrî’bl­ËÇíPeÿO€¢a#C!2T7FiÁð†ñU–=o·™÷ÓÑõÜW¦VzC-=ZܨC莻òÑLU¡“‘;5Ó‘¡`ëéL H™ƒhb‰m%4^Z¯ tÏ/òü.û\ B,ó^SÕ•2ƒd[Ô’š¦8xªÚœ³®]t¸Ç@ëq’ev]øÓ—úpq°Ä—‡G¾ÐŽöƒÀÛ2ÃK«ÓCÇvÓ©Z2FAÈ«,$‚‚K«‘h#áì§vPTˆh”‚rLh ™ï­Lý«š(5‡†*x rS"DqˆG”à@HªáæÒ´43Bõµû±Ÿ½kå‡fBuÙÜÈ4]Èlä)ÚI;aÇ€ tIW¼E:ØãóXTÆVBÝ ªÒ³µßƒGö6T²uˆªd€C˜ðÇàEG…oL‚ Lß5z)Ð@8¾/ñàáôüϰ¤8xƒÄ04€ ðA3º{úÛ§ø.®”"œJ‹…**.àAg0u®D)ˆF+ÀZ㪔 ‰s“èX)¦í1#G„ò¢©‘h´fâHGFñID¨N0:+®/ªCô¢küy™Ÿ¥¾îðW­_»½nýE‹ŸŒ§è—¹øÃ&ËO}üç·7’¼%Ï7„Ö–ÈœÍÒ‹¬fðKr…Öé¿åüÐY=­Ò˜™¿Æþœ¦*U9GæFÜ hòKÎ*<¤S-B‚ðzLô!–ÓÔøKįD$bN¡æ:¿×†G³Y-AŒñÚ0´¶Ù]ç6†d*Yجu0¨Ê*P¡  ˆÆÙqWøgB¿ S ²"Ñ3H`à ³™ŠaÐ%À’lE66˜5v:áô¤‡ýQ[æÎƒžÓIY²w|ÿªûw}u>ŸÑš¾@¥4õîõÝÉããÜ3ˆF "’0]éõ+£TË´ m$«ÆÉ¤4Ž÷ÃQK¨È#kl”À£¦X³€tc~þÍï5÷ÜŸ“÷ñÔ½ÿÞüÎUîö||{ó¹Ùãä¾>Ü©½`êùmœ¾7ÿt³çÇv»¾ò¥šOAíMZt*0mB&‰îl,£ èŽ=æ;£Tí½{zÂ&,ãH‚šŒ, ˜:`Ê)â “Ò¡ :°5ÆYQABOÜ—ŒÞ>¢CÚ…q„B[ù½4}~žù;ÕçßV­æÖõú/¿ÿÍÉ£þÎó*颌z[^a¡å@†(Ä>¶V¦A- %‰‹ñ:U¶âåUf¶iAê8ªùB}é·¢ p — çy¿>é)Cíïsÿ¸é±&Ï4Fáuï|ïæÏÍYvî’·²-Ç÷„_¤lf ÁÞDI\¤PìÈA‚Í>"«Üš3¤Ç#¦Yª´šûlSå×>5ÎÁóx@Uåß½¬¹HÒ)Ž`£¸(p8süõØ—ç_8†Án Ó¾Ú&§šgÁçç…Wu…[À}@U Vd "Êèhfµ|eÿü<‹püN¼ùÙya“ö²EvOúœ¾óyèÛùõ'/u‰ÎÖ\—ýËÊüRcRf¨¿øÖÏâaX1°Ž%F]€V‚â1ÏÚï t±ªæOã“—ahãìÉc•88€ñP «Go¹4\€W\wŸlÌy¯H©GNïíõ—ߨS×päœ\nÁˆr2ÊŒY*¡™c ‚¢„Èg¦Ã£\;„ Q!ÔkHæ²”Ó9E°„h¤”lSZº· âœLNëþJ ÞPiÍ'¢ð,¦§Ær¼2!s–äN]Šà ñ!:tç˜ò"kL2§ªÉ8ž“µÛÍu)óT}0È<Ç˸ž+ž¤×  <$MöbIdLsôÙ§xª‹U³ÓIè 6à⨭銦«ûQ.A¬d[Û›ÛÚåg‰vÍøî?›å_ÅÃÑ)œŸ”k¹ÿ 7¿Ð(ÂôŸÌ.ô«==¶™ÂÕÈQõB„4OÛ¤Œ{èŠn±+çNåx´wFIŠN'¶ç]ÍSôŠ´ $´¢®R)§WC@ˆ.1 øÜKš­ ïà9¹w·íJe ÷8O)y`^$®¥V3gíãÊ]áXO?¦VÛ‰ÁF§·”Þ°gƒVf6 ȃy/´².ü'•§žþôZ·ßöoëX š4×÷˜¤ïãÁY ߬1gW0£©’9mfÂЀ¬ŠM£.Þ’¬›<°'–䀧ÇvwDÒU [MJ²ØâÂÝ&i`g OÐcðÛ/‡[¶èíeA{F œâ€j¢›9£<‰„: ƺ E9žÁ›«T“]ÏÓØŒsS¥TŠÈÚ˜ßX%H›Y“<Ä a®ãÙ:È—ÖUè” „2\‚ °ôíÊÂÑU$Û7kX70>jeÛç¼ììzçž+¥ÈÏ+Y¡ÚÆ¢us¦6sëCç!CF ÎÒyfcˆWœ²FzVÈ’ÂgBõ§C]Ó˜Ôõ¸?:ý‘ÔZçŽyãçfçrò©±ÞT 1x1ØòÌ[Iî§<d‘¤xm ÚdCq„:ƒæ„Y4k¨òâáÐÀ9Ûº—4ñ¾ÐÒä‡ùPç½x›ð8œ‡2ÿÐx`ÓD(Brc@bÈŒèè«Ý“±'P"¹ÂϲµGí•Oüÿ:ße\¹¼qç†ÔÕ”Mo¹}káVÇøyú‡—ãÞ²YŸÞód0Ô¾è<† ž*hûx/´EXÙ°5'‡¶À2zO}áÛ'º¸ácõXFµ-‚ ‹ÐŽZmhJ –ì·9&ÆÅœ®]ÏÁñéöÛÍ1 ;þ¯*Þ·eÆx—E':e™A–KàX¶ÒÜ®™þPûØá€¹í†Õ¸N¤VËëë¼1ô`Y_+=*y‹æ͈m´Ô,ÇDØ@3[Ñ>æb¬k©Mª$'5Ò…o(Ž#Uå†ì­µ\ŽoöQ¼†V)€<‘ø¡ §bq–‡Ú­J’Â÷#¾êÛßpy¸¨Óe¯þhã%ÈÇÉ<^ÞC¤-:ÖÊL³Ó@Ò”Q†Ð3kÑönóÁäÙS žteQÙ$MBMï ÷pÕ1†X…ºa h mžNÿܰâ†j:•‹•ŽÉ€ßÏ¬ï •e!Öðt~ñ­Š´¸®â+¤†£N5q·ûuõÅ©»i’$‚[Âa½ÎÆÔŽÈ}Dªµé†àѨþ×ï ù·€üÝsú5x~ÙÈ•ôN^Ã×gø„Ç'PôÐ:ЧlÀl¥çøä,†×„ ¢ÑJ‡@ &Á|“jEBbja0Qí*S!šÒà¶(rÂaW}ˆž-þü5øµ!»ƒbÔAÅùSOð°jÁ³ä›óQÑ3gÁýŒá±®0BÆJðoµ¸'c>à†|(† U°Gr‘ÆLJj(t3BDµ—›ó¡7YeE¬h bhÃ9@’2½ÙHºR#ñ¡,ÀŒø!|]&ŸÒ¿€¡·èÛlðúýþV:&m¤å€J¬NjÙ²±Õ•ÇM·ç:Lµ¶ÔF×ù®=r¨õ–cOü|4 =‚æªÊaÝ’³‚þТ»‡»+Ín2¯›>çä꾨S60¨Q9y†Á `±F-k2ˆÄ'Í(£$#&³îCê¶ ŸvšÐq–´hl¹=Q% 5ÎÂÅõ±ò%&)Þ“¡þ?¥ V1†` _µÆYKßÃdæ{«_å´Ìƒ5UÕ_€§ZÞrGÚwÄMÒä‡ÇUã“á—eš¢‚ú¸‡ASÆiFÕ©q™x©¥/^nMovž97«ÊV¶ä²H…)ÕØH”¡MjðŒ´ƒ ™~©¯<1áymb[Éç.,+ñš‰ðÎVåŽSŠJ¤ üêK‹£nžËSW*tÅ ¥¸”ë,ìF °˜Öy×Î… :Šº [+߄뒞٠öŸYy•ï”y9rD(HHDdv´=œÌôhÍûq­9 Å;d­j¹a°`l˜\½öYÙâüë†Sò* ÇNKpßÌö§T‹-‘“ÔÌÌ 3h“x@±t~I•kx1A!B‡U”ºÊI« SJT€B=bl¿š z0‘GÈB ,",@Ä2¬£„d-²œØ˜QÓƒîÍ^Æ–¼È&PñÐÒ ÅB¨gDˆí Ô Ö ª9*šqkaLé¯esë¦Ù6o6÷´]¶D“„¶|5•VÑxÆ×íâS]ð f"„°n Ôµ*ôŽëC÷}ÕlÔ7d‚«è!;ÀƒS­:m„´ú¤öVÏ.Îî}´TE€¤HTÄ©W¢±qˆ@»¹ã(6€êX‡."B H¢$©¡a¤³7lÐÎ|x ½#Š‘ èÝëóó?ýÔàõI_¾þmøû]ý:^ƒ|þç/á»_{ÈÎ~>>ª?mØûþoïüg­žé?~Ž,¶¯÷õŸ5ïçNêææýß—z¹ÃÜmM·34ÚÙæ[‰¡­„Ýòî§‹ŽïYœixË ”‹ô8SöVÙЊ\±ƒ¸¾þB€AÄêYÜï)_-~ú{ósg1݉8éAÉÉä )J†-µ+]²D‘Í´”"05)@€ C¦ R Àµ1ýYB_ TYÚ:›$H À`ºBX!-äCu‘:¸¶n@CöìÍmr_¾m7æN¾ý5OY^”væ÷=Þë›îë Öñ0y”/§“bgG`‰èQU¢D3À¢š§wÞ-€¿€¹N[c·4g‡¯øÈ`Ð]]9-jokÑÁïß•÷OW/|¿ÝöÏ«ùÁœ.cF‚œDó¤–*èä¨ÖìÍù4sQ~òz¿ï»œÈ±¿»ï t$#-qPÇü“?¿ÝÜoûúùg;7÷ºNçU•LS%ŒK&™áâ €*¢ Pj!˯ðcþDlè!Æô,}ì{>ùÞðAG…í­Õ›Æ t _€•PAK°AÑh{²?ÿ»¯ÿÂkÛ³ý‡®½k–ëŠ?b®énùéÊö£íÿwuâr/mk”Yà ­ðZF2h‹TºÒJ"ÒHUQ kwE Õb‹zNà'MâHµT­C½tbL×ÙæÑòR¿ì‚^u„'ha]’ï8 ç¶ùdrº3‚„wë·÷ÂáÅÒ۹ϗsÝwWüàýr=ÄQa¡PÜoƒïØ«Â&·)52¾1´B¢ ,5½½Zìi$ÜÕ[:O&æÉ–ó€ÄŠ~;¥’ž Ý·;ñWþêm/ëü‹*í²,æÞ*H¯t¡ùÁíÏ”5y°áŽéI?¼ †éÖÛuJ¼±âJ~µ§ØXñÎpªjVÑy΃²¹\åÝîm›d''¥M3@$Ô)‡™×l3ŽêÈ xç„ÞŸüKà EQ¸<¥Nëñ…º>SÛC8rOkôÎG¡«fx'¯ï¼4y7nb^yWÂlÕÔwOUÕ9ãm|![#;±B=áû_ðú3ÏAeAeû,1Rëd‰Ñ¥†™Bf ^8=ãó cA?Kt(tœ9Ÿ’®Ii8Y÷µó:rŠ©TšžYÍì›pQãB —¹jOMÆE‰á¦ÕáI R§*U#ëÀæ_`ªB¹5eNé$ž™ITŒ=/2QùFºÄ4›Ò”ŒÊ>ÞS9 ¸çƒ!L¿ Š7Õu[N£¬6+ó´ÀÆkí¨Uìgiê…ù…:_ôÊöïî~ý‘Ì—îb)èg®ÅŸQBAà$KÅa0”Chyܶ¹ 詆Ê 1…{œ‡V…=¤]½á•ÍcƒÄvkkOÃû-“7a¢=„AxQÓp¡kš[wx ‘߆Y\W—9z;È ~RÃaI¡.I° ¿qþ(¸n§ÀˆK|£fEçÕ?Öo‘Tü?>¹Ï:ÒUÎm.x÷÷¾Žè¸Kú1Žg#}^@óyKæPÅ*´¢Wg ÉIw–Ò„ ÝvÁòTЈÏÓ&HGf}—$âS÷M͘'f5¤Ô^í©W¨'0Ä™aÄ]l{~–,68¦ƒS†CS1NYðŒã€aNµ*r¡lè«ï·í{ô“áò"{Ï*`šX^8q*ýâT¬ :ÖÛGE“ÇW ^ö>¿ßàñÜÀT.÷ˆà\){ë½}¿~,6+d#ˆj: ˜Ê¼‡‚¨R UˆÝÁÚ=Ÿ²Y‹tÌÎ5¬·ûùªÛÕ, ìnxVŘ6¨'!áÚ[ ¶¥‚±øzLK/ÆcÍÞ=íT÷?ø€4[¶÷¬îj½°cÝ«5Úç±€Pq* OŒêô-57 I ÑzVA×éÒË…Bê¯ßoíO;)Û)p*É) ¹ßm@…% IÃIòJPPíIs3rH®RoD“­Å­:©‰½.aÝòù+{$åP‡ýxˆâý‚$Y jºÑÑ1–‹cï`¤5Wo®…oäZ¢ó›ô˜qüÜ1EàÛo¿yOýé‹Îî¿€>]òœ{ÔÙ¨uD>8_ß¿ÅYìBiC[~ë 0ÐT-Än ‰UuŒä›•ò`Ó¦5©ö¢»Yc Cà¸vªÙØLŽ˜akš]e(Æ™AÖª»ånq­ß‚‰jº?öåïýʧÈwð1 •ôÇVD ɱoϯ)te%ÿãOíüZ QÞØýö‡ª¬Ê<ÔJÀþ„x_§ËyñüeåScà ×pi¥½žžNº±½Û»¿§&¶ÎÓ4¥§kCŽþ%*ÚŒ¦þãy„O̦y.wÒ3Af;} ª—\ zZðJˆº•[xü–èK;£^íúîø4Ž•&7IRÀÇÔzoéÆR¨/Ï&µ1 I8$%Ãp›vˆV-`´õÕ]3aî  y¸jÐa[š‹éOl¢¯X®dÊ¥LÔrÖSañ; :¼¦Àf´ }X}ïë×FlUMÜì횬}ÅN͸!T8Ö™ÕÉÄP1:¿çÙgŒ‹ß›äkFÒ È[®•ò÷k±ã@I©KÑ6 ›Xm@ƒ¦0‚(h˜6`tIö6´ lW«4ÚHÓ] ß¹·*Ö¯Á^U®ãy<1š*xÄBrr“DS¾aûY¦ëʉ…I/]—4ñI´ðŽìÓûרzçô¿lŒíújùñv65Oš²»aÄ- ¡2Fß²Ã%¯è懣³n²®¹[~s<Ÿß®é8OøY†ÿÎsHzýrœ_‰vBNlÛDK)ÔµÊÆcèÚ1¼S ‰LÇ ̉¸ðpØCvy` †–KE" qÛ‚E¤Q]Ò¡$0n (¡[d‹±½ôh·ê£ÍdÇÎ笑/£Ô™®oŸ úÛkQ6/ÎP¶!(¾§ðÐú@ñT±ta(bYÂŽ€M[ÐÇØt@¿¸<šÐ-\û€)üÅÒªùÒ*'_¨ËX3i‘¥â$cò 6¢T¤L´©M©ˆ[<7†]â7$‚ñ„ÐÐ!´ ŒI ˜ð |LG\؈‘IBÑUwñ·Ðk§¯¯lÇÑev]†H—˜ëã,ª6 Ö¤z%„%wÙ ±Ë&_÷ígº¿¶§{“hþ­z°“7§U³†Â€0RRÔ™œ!;-99Š’(~“ÈÅ/øCE÷ߣ¥ÈÒä`Rin‹ÐÛQ#ä©éh¥Ø GŪU$%æUÛ/¯ HbRy/ž+ £l— ¸ÎCÙK©«ºZ;öù<F”;2«¾°ÚÙnG³&°Úy”x±©sMZ¢Žº€°É–âMÚÙn«ÎÿÀëÚûàçÎïL¸q+z8+Xršvº¾ÑuË©Ú3wtœ'´²îÿÇR¹ªj†¨`óYSE¤)&¬\Eì<¯g2¼8.$:ÚV¶6Ýh8:Ž·µó5b“RX¦¥Þ¬ÙEæK Kós1µû—ÅÍ¿¢3Ç+8ÂQÐGä-õ¿B7|þüõïG¹÷¿üõcóÇi_ë÷/]¸ÇÿôøÆÿýëú§Í÷uûÃn*2§D;Ü£PëÑãÑá~$Ö§y”p]ýþPÈ:ªzuÆÔ:K:p$²a“ý˜6µˆŽâò‚Âï¢Ãz:Ÿ.8or{Œ²ûÊÝËÍAÕO ^ƒo3—×:sã™´Àê]G¶êÙÒh1®6k¶´3ÖáO¤¾½¨¿ÝÏÝö5Vöñc~ÌŽØNj7ˆ|ÀÎIépïcî?¡Ÿ½?ßö?ûpvoî憷=5{bÌ1dCFI4=”RSQD„*ò?€ÿæFKŒPi@b¶†pƒ üe§jàSCQ¿èŸ47;M¾x˨píàP€‚ ÐOÊÙñÿ÷̽û¼žÌPڳ¼E•‹b«­çú‡^»}‹ûžÔi ‘Æ n@Q‘ Ú‚•A†¡ ‚­ ¦WI¤k“²weÔ0£•3w² 7ÄM¶ËtTÙ:&v¡ ÄWûé½ôÄjÀ®çÅ{´Ì8cíÅ s3ógöùj6㓹?&œ/¶÷Ð~²nV 4Ãã ¯]ˆê!@j0†šRÛo-ÔJ@U;õ(.Vž‹§³<²ù’ti‚Q ªMg¡¶uÍzý/Úì<Žé_Ĕָ+QS²"®ÞŒžŠ”Wâi§x»3ù‹æ‹Iíø)ÙNdcìãîºÄç5éˆz6ÕA=+.‡d‰jÙx±¸Œ—½4'JFâå˜o‘bÏKœïŸÙz¢a3t©‘:Õ?ÏгÏ[Œ­&+·îЪz –WfpÆ‹±O<Ç)~û\zþï£þóÜYÍ 7ð,xŒ)bžÐù¥FUÈ»T÷]Ë+òY¯Gyþ•RÿY ïhgüíXP<n"aôç)ÙXs/óy ç[E%W*,ˆPO‡C6‡ ZÌ]fÍ¢³ ð²âÓ´ßùš9šŽ 5åNÝsÀÎÌï/Oì%h7¤$% ³MÀ®*/Èm)õ´T¶§ákÇdγ2$oBk6Îõí² fÌÁ” n‹\QV«Î˜É¹‚é±]¨=óÀþ|K™|Kh‹syÁìò>³Ù§NŸ—ŠI ¨·xÁ•(áh÷hoIÊ+×ùçÅOÁj…Í`B´Áƒ˜”•+UB,‹$‡©s×}#÷;û%»êûâÜ¢ÇôñãÝ5ûÇãÅõ:âÒ¥SyîÓ½‚ü]JMôwኌ! Rl‘„ ›ƒ$´éŽ(Iɬ˜©øTñÎÒ´Éüë\öãñÔn¾øûâ,PEUw5/þóíO€FkŠd ëã†Ô`õŸhP4dô‘ëw'IërðÛå:ÀŸÞØüŒ‰'®pMX†€3§µÆ¨|AÑmùÞ»çÿ'ã´æzi}ÖUVí©­Îj·€t“+ Cb³$Ê»¶ÓˆuÒ¹d`€Á Vu\¡å‚Ôl4#’gsMØ¢nʨá| (‚k@v;á’”Ó–¨ý¡ý~õOoÇþïyåL¯ü§¬\пGxFE"*•gcöÔãü£?¤ßûRZj=>d´ãAÇ=¸‚kÛÚg)BÙ·À·8}ùãvÅÖ~Lɶ6†žìWðmPñvsdg"YkÚ5A} 7=Näí X¤WÄÚ Á{4@Ñ5i0(µ?jr^ÁʼôcÐsÕæ¹¾•’ÂLuèÙ˜¸ÉfÝž&§êÒ9,”ƒ¸Iܦk •T™NZ4  ¡µ6Y­©^Ööi%ÑN÷K/1ç>¬ B#¬¨NØ êôŽ–‡Q–j@ân54,ï¯Åž«üP_CìõÉë…ß^¾uî§¢»s¿°çÁ¼¯NÖF“][ßaâl»ÏnÎ œ³Ç`+‰( ÅÛ»ÍZ qM½éè˜&a=¶J¡ †¢Ý†a6ÀPè{À8âЂ?uòÅ¡i£´©Ü\ä…Î5ó ÓHö%y Úâ kÆŠ'¦fL†l²\µNý„ùÆ™§¾ßH0”ë=IÓâ¯kxÑ{wÆÓßb 6“‚Ûä«éVgÉo/<ýõÊL-gžMT,/œ9ÆY”$“`»!D½Ú‹ƒç8C%Nn&\AlDE‘(á-pÀþC5“D°ALŠhÈuy¦&Ê=-ñŽÖØÂ§ô ÝO$`€@wLÜ ¢ íöˆìhºKž™˜X®Òß qi ªó|vå…§j ul‹¨Ý;1Õ¨…Z,Øu(àçΫcWÅX¢Š]9sAfF°+$ÖÇ´Z"Â<Þ\8go…W ÎzÈ”ŽKe¡xX €ZG$cus­RT,aSYhB‹å;hªp³, <€0Ô&ýâOÓ‘¾.H E£¸ URÝTè\±jèF3uÕ:ûË›žV>jáYI쵑wáOæ¢`ý¨¥9Î/mõ+XÏ­by­ñ#[5A`¥*Ê4ºJÕØQˆÈtªþÍ H¦ (ì÷ø¸´ê1¾ŠÖ'ÔîëÂ!?ø.…ìƒ|@¬aÌ:ED Ž”T ÈŽ²UФêëïLoh™û ×I‘4Ö3UîÉÔ=§±Ž™Ù×äÃmú œGsh—dÓ*J"lUG®^|Rwë†2ó¿uö\-£ˆëÄø÷¬k0U”lûi{LPÍ gpø0p‚¦(øÜVß’Yð§ä×0V „·)Ú‘FFaÜ·:YŠBäKªª¨•W ™‰Žãv~ïʬ•^ͦæÉiäq á÷㛨ãy4ƺÊ"–s¾÷ÎÙÇ;O[õŽqá‚ õ£ýb9Ö<õcµ_˜è³øSþ_Q'™ð³(õãÙƒ,;9ÉãûãŠÏ[©½ù­¶Et°„ôe~Û£ÊÝulaÙ7#¦rlé¡›7ǰ­KK›#{)&ÉÛ•-C¤]±0™ö(s·Ý7ÃÉBH å á§7ꢛˆ2´ˆ ÖÞùê¢æÒýÚZkà4ÚwÅ–$«KuS:;µ™Ç5—ÞT 7ÁÈ{`‘ˆÊ:.{æh0ÿÈòÓù`:HŒi°`©u"ˆt¶Ô«N/ƒ&K*R @}0+þ‡ª[«ívð``%õ"bìÜÀ G€í ,”;Pr¡u¢Zë\¤2 ذZ„¢¨#¯š:öê3¦Pq¬›Qƒæ°â €KžÕ—˜‰ŠÀ¤ø‰ fl¿ì¢;@ R/8"-8}# ¤ZžæQ¿?ëüÝOLðN¾‚Á¬J„(65j*D”—F.xíí QŽÏЉ^Í]KêÅ(‘f%QI(:%hvǽûVµ5écÚ•¯8æHÄ’ϼx««îþ£!¾Ü«ÿ³îrÊúÆýËöU¢Ësü,}ôdÎÞ|¹ñSmõÞÒ¾Ózÿ–]Ÿ·Ûïý“=-ùôZ«éù9A?=‹½‚S0Ùê=(¢ê*üÞÀyÏ/ÐKi7×õAX“Ý—Í@òÆ=Ù×UI”gÚÑY»Ô´f¼ ôûñÌîíÜÈcÉò>ÀŸ4ƒ YÍœ7ßþ¼Ïux?O1s›Z¯#.A’ªìF¤ôz…â.;’Ée BHªAaëq:ñºAUëA*PI À FÊ‚B "TbF%•!Ô ¬áb ¡p¬U€PJãX`­©W-"Æ)›qAZ,NîE‚SœÏŠ%ÊAIÓ¨9%)ÍéP!0Qba,J ¼¢5Í­6â/gú_»ÀyÓgF4вÇ˃yöçˆûxf[Ñ66ðøOdýâ½_3;¼Néóžf3£-¶žo¶Þëã—Îwï~F?Çû/Ó3?õý2 %¡¹<4‹û㺧›ýbˆâ‚Œå çZýÅï+Ýôèùý\¯«…Š\<þÞüñ^Ñ© Ùºµ’…h>X‚–1X«&=À Àq‚1…šK[,;͵Øgv‚ \ˆhFŒ1 ¼Qd*.H  ,&Tò‚ mŸíç~}ä—7¨_ð–=Ðk|«¿"Þº½úÙÒb  ¶Ñ A$5 ¢ŒR¢5R+ RwÌ7å8QŸÐØUœ¢~cj,•W«z³bÇæK)ÓÍH|âõfß¿ß?­°– »rÏùÚ‹çaÕgÈ£2ë}’{‘ãšcøhK$Ì:iVÞV>ÉCØäÀÂÊDOaññq ^3W¶©»K`Vg[Ìáçþ8ž·p=¾>àwãØø$¦`„$1˜po<SA’U,±ï+œ·ë>Ôù,´ƒ¶'m–CM2Gaè?Bp(^#qUõƈ¸,ê&ï ´™Mï‘E%„¹¯Í^ZÒÏPņÉçqÚŸ_ëï·ô_j[½õÏ:—Ö›;š)§ˆ<-C? 'Ä)… c°ÁÙco5×S¨½ÀqÅmŒ SRÇÌæ¼§”Æ@B…*Yq1èÏóË @€ R À ”*Õ©’mÇDÞvŠÕaO6aœ8uð·Å©ºr×gßyn¿ðLe+3ÊÅ×—x9]—©ŒAΨ^Ræ`(ªÍ4uSŠTz†»ì=åR¤Á€ceP>ËÓ©¸ðàP½>ƒ’Ç><ñÆA7–>yä5›7—:fÄR-rØ1»µcd–ßLæñÚ왾µÃÄ%¹; käl¨û\ÿ˜Â=7ǯšçñµ¥4`¢È·W÷î¦P–îK!ôôËš«î×ãí¹@ø½ðŽ¡f’)Pz*s¡ ;³jô–îcÁ˲Ô{iz‰Ðî8“,* #ÂÑ9¼" íóçm6?Q~" ׌删âr£õº(ÅÎŒD!ã™õ‘VÆ­Š!‚‚uÍš‚ q2" P‰ø*ÕJH·X¢é4œÖ­ÃÐBA?¯Ä@Ø8(§½ö.\ š÷ÜsŒq­ÛêtðíáP%|ÁÀÔšXÐLyPòiö“³&‰ ‘-P!‘¤æx)_±œû_è~¡ºUš×b͘’J–’Ìd%NF€‹Âg$?> 9$)\ustw Ö'N:|‘a¯} z«/!ÒKíå߯n‡<ðÖ—Šë=ë%±XqV¹´bµàã´žÙ÷©Î¶}`HbM&¹h!\gÄ ÓUñ)ûPµp.E8>Ölá“ò/'ÿJÇ™Ïì×çúIO݉:‘,툇fœÛ¯tªO^', Ô,Fð Òè©;&­vdã#ORRÖøhv^Ž}ÎHÑî,͆Ç\ik…f”& + Õ5<=$d‘àTOdOÎâÍç†ù:†®ÒˆŽ§ü™–޹vÜÛ{ÚÀY«tF*'¤%–ò¼ïÏ»^-›îôhçÏ5óýpQ{ß>ØMļk»Ÿ(£ðz'ô7jjЗÍ3_•NH|œÚÙà5 „ŸvLç¿ûû™éúŸKøÐÿ×v®¸=¥{ùvVúgÿlïÂo[jnÓmûÃÁ±iÏìMC&Ä ­cªâÜïÕrömp™ÅEm.Ú#¾¼ñÓGºõâ -´¶pWev¹?œ'j•q”dÑû‚sAgÖÕNxX &!Ð)h ÀlÿZ£ÏëIní3±2vMñ-äT”> ôDtUòÎQSÅñšB ´1;h› =]-Dh Ã0!·Í1`Б–XYÏÒ·<)ȵÃ0ÇTÕ>hˆº]¹ëíR÷2ŸN ¢i-³ßËâîw2س 8«¾<ëxªÝÀ*°–û1¾s+§ª]Çóîÿå3¿½Ž<±ÿ³šz¸rïfµ\lÝ)pˆ€ ¾û•vJÀæA¯3w‹:sñ‚aY¢K¸’KºAK2 å¶A´“j¤9 k‹ _¾Ò;X ’½jÃØAÖdÃ…Aè ÁÐéðc9v¨R„>Ín¿úp§–œmáïm—©’@ð¡åÖÔÁN`÷á¶¼ŒMâ÷³#=nŸGŽ8Z9ûÖS°““‹/\SG– èÒÂɵ‡ŒO#»5±Ê£ì,ôhåÁ:Œ}œË§½ÖfôÁxÙ8ã^„›h»‹ö”;!ÁD„ˆ-ÐÈ#1OrB²÷³»c Ëÿ–`gÙm(šS;% ¥A a»ªð?Þï’1ÞÈ«G«f QÔœñl0Hi¿7:ÇQ¶Û}¥É—ØdeÖ§ÒȹÞ|ü½Æ+øž ƒíØÕATRj=íqž—„À3ZãÞ°exUI¨‚$®ë2õ´þecXŠÉ 4ÈZTdt$ W &ƒút)‘-h‚-ÝÄ[ÊoÁm&ú%ªU¿Ñ ®!€ ³$tÃê#’šFã±c}#uUŸËæäRTå ïož^ýуh„ã$²Z¿ªnXÇ®¥ëΫs2£ŠiÎ –©M&îžÙsÙî×D B×™ìzóõs׿¥_îþ:û¯ {¬~ÀÜ(¼Ì¨aD<™[â‹8¦¿ÜýXO`B ÝŒ[±¹@r=k¡ ê„ ‰ SÚ³gb2)›»”SŸWÕ㥳ñþö õ*.=fÚlZ9œaé‚ÝÌìˆâ+ŠÎÙ¿¡ƒQí=›ÑìÁð$©…L›öò#zcÂVDQmI¦5ăýé´NDÀCaK(¨_Q|𱕻fÍ™:¬¥r2°£ÅáŠàºÞ{íï%4ÊŠ|;-¤vZ1Yë#ÿîßùz¿G·#ÁÊžÄ_úA9+šÅ0¿Õ©k |Ëêb b/½á¶—¥ý°ŽÐÉK#+î¹ØVÒ¤N|Tâc6B†04k‚EÞ–xâîFB‚ Ç„x3[”-SKØ‹ÿŽžÌJ|K™S¡j«A3èÌw1§æyZíÑÓs´ ]¼z*+ @ÌÑr¤Ô‘—fBÝ[ˆ¸Ù2A¦dçД×Þßšs‚óe¦‹s¥‰™t;©ÈD‰–[ª(•*1hXÀe¼¦ª×DMcÚÈÍ-®À‚¨ q—ëî~/Ö§$!pΚ‹î&6 œèN)!3ü1Ò6‹IdÃ¥;à¢Ð¸ÄìíÓßÖT4v2(Ž@ЖE˜`€T‚‚:5aõ:›i»ìk|%)¼¾1A"“O`{Ð "Ñ7è„{À¤0³@Ƙ6ÍÐ,&@gÏšj mdŽtñ" ú¨³H ؋ӷ£ÕTaiõénd‡«M¤2+‡­º¢…N§Ð Ùø Þõc›ãtu®œ?ï-9Fð½<“é¿×yµ¹³yÔs©Ê‚ð‰ÕÀg2bî×7zê0Ä6µ°X½(/4ÀE2£b Ça(ÍÏìü~üjqoŽ ~çÑ&k Ä Pãk*óü²tWÀsÌs?Ïm>”CVË:Û AFF>j»]¹‰¨æ3&a…Ôd-]3%Ãwíë—W e!XðBl4‚(H œ EÆÒtkžÑ~V÷Èl\Å¢L0¢ÈÐÁ01h 4Æ0AŒ„0…+@ ½Ý%i-*@•IòÉè ª X E(`XRî*Oñ:®[>žîÇ)Rñú×íPtmV`e:q>öX722U½à}aÄÝ¿¥ïo°¿y§«ôeiéMæ§3à‚N/oÿέî]çó9½¯¯Æn¯k¾~o¯w¿_7WßfÆñþÜh_ïÞÏ™³Ü ÀÄKƒŽ&ÖuguÒÖß[nW½opï¼ûö»¬ûXÒÆ ˆ0W©§0u¶t]l³1ˆ¦2€1Š8[cDϾÞýåûJd ÍŽ5ÝÏ/ÕÜݾ¹çßóý•ØÉ˜H þ:*@Ù™þÂùÁÛ… F¹ÛÏnóÏOÿ8Ϩ?ò:ëÒ¯dQY¢Ö¦‘ 3HkˆA1ppm”FPÃØD¸€H#d‹Ä/¸á@0Jt ‡¸ÊÅû= @ßø©ËZÓZKU±óó|«ÿZï?›­dck ¯ÈÈ·ñ’ô|òŠC8¦_ãªïÜc$óÃde&?)žÓ¬w¨†Ï Ž°$δ,D„#»Ú“•x2¬™B%R»QWe§HK·Ñüá¤-+ß6‚Ž¿D Ií‘…À<ÄØŽ`šQƵð‡’?Ö¸é!Å5)R(—ìéñõ5^üÃâ|>|ñ®ãGzEóó6Ih÷š­ú5yŸ–»”ŽëZkð¶øÌÇ~:îïD?õ§-îáãŸkó=·K‹V@Б7çÃy4óéT Ú£ÿËËÕüâÙºñ\“T2]{Ÿæ;ùOÚé_¿I_¿íþÓù᯻õþÝÇÝN»»\5Öåm¿y9“?|”¸ks¦fäÇñWÁŽ2s“ãÙ®#1NÙ‰Í{‹õU©ËÁI¿ )F€C¡!ãH0QК©F´ÈXТ\2w1Û㩞99CVàEsJOúWdQ!áä˜ZÅ¥Ñtò€>=T‹žª2²¼È $¤`îèŠQh1y¶KÕõ(žO›ÎÙ˜sâ9NªZëËs—R†–c笄ÒNgg—hyèå0ÂP_ÀŸŽæ7y}žõíü{Ѝ½¶ô'»ÝWþr%ÌOøÞbˆW ¡;æ%ÊFˆÛá‘ÚìÀ#&óq‚olÜy‡Üö¨q°n·Óž73Ë-œ’}β§Ø`ý®÷£ËŠ^ © @'fØã»ÝÇØÐÚ•Þ5(Ô ý<ñÀh%Ï×ÛÙö(ç6c\£SÓ!¢Ë¤HÅ´¹ K¤ÉÁ0 !&‚$ P€!XÉÁœ #;“Ïô`ì-z‡t0åNW¢e4, 6ƒ¤høóÞ#B@ƒ’J&‚ÏB¥Zi3“Ǩ‡C¦¤€Š½Nåc>[ÿ–®ßîf“KÃÇ¶× ä¨ÊÃGÌÇC}7›mƒŒÔƒwƒÓ“„,ZV IJ6Ès 3ÔPa“%ÝàQài«¼òK3†#°tþ›=•Á­„¾›œ‹³¾[×…oPÂò&à ƒ‹z­¯ø—‚h¹W±>[§ t5;a =½_ÖÃã £«Šr{¯èß~K_>ãstoWï¥Àqø¤òË‚ß:2ûÝ‘˜öz§oCo±³ÀžS¼ òèЃÅÙWié{Q¯á©8DMjNïÊÍ¥]ó`ײCÙ=_¯LwúiBWïv|Ø~|89øNÝ+ ˈFXaë´,ØÀòëÙ•:ÕJ ˜%p!µT^¤–b.qy%MˆÊ +.b±nÖ ¡§—„¦áj›î¾™¼R À6RAÇ “éë1v(Z‹.UÇû .!Kœ³·Q²2‰ËÙ…ÛcéV?èmÁî hB[ˆ¡°ìGQÊ7!h Æ»Û~äëS3ß캂m;àœ5­xFiž—‘·q}=&–•®>=bq_¼î)BT¹ÚH¶„ǵO®^ºõ†h‘p]¡ë§‰+Ìo›«³Ù‘lUÚÓ:îéÊ­‹^#ê¬hêû³œãË2Cdo>¯* z;y÷|¯A¥ 2ð)}ö½JÝ”Þl#4@K-"-†û”r§öA=šRŠÕ)e4¨  «²óÔ¼gIƒð饇À”–h |cçµ*.¦)0¶cú}ó¾or’ŸuBk°*jj ìÁ4ƒãB8}ŸÃ*âïi˜¢X¦5+<~U[A7áNŸsDkÐäªwϺ/Ìö¶qy07„EÂ!`9—°B£¬†Óè&ç‡0ëwÿìúxéýî®ß€“Tb.˜!+p”Õv‡ÜÛàŸ/~4ìúÏ[ܨh†?=\¯‰üþé<۽ścT_z ì¿í¾M¬0Duc×YÝC¦åµc]äÒSö£Œ)o@z6Â6Ï¥¶ ´ <á<¼¥×ðRÞFdjêóJømóÓøF‰Ï@¸€>‡ 1¾¼¢•veÓ3˜BÓ]°,ä êðÃï ¢ä'@ŠÔ2MÐn‘=X8@b>!ƒäÖEØLŽnÓXvÑ:Ù±‹+Ï+™ÞŽžŠØ-÷ïÍn×È}àýN¬÷ôjý}3‘v{?ÑÑn¶·Gsu®s¤ñ26Ÿ…Ÿ¸ö<–kðZìý¾zÂ¥ö6U[äk@Ì•|6¿láç|m†M§E›6Ûf{‚ÁvĬ€¸ƒpÏéÊVj‰ÁÖÐDv†rå¢+›m¥/vªJk¤£tž[±Ò-®®S„­Ó|É¢àØÝÍÃCåU- ÎÉ‘!ké›–,î}éL¼+°!TßÑæsZ®äœ0•‡O‡ ^GXŽv hºŒY›¯w€2s©J[é‘$½,u+c37ÉÀrƒ J¡ ¼£;Ý1ÃH˜ [`Ã$ÜMD $@(‚’ €”B ÔRÛcÑ}•¿ÿ†yÀÿlÃl€~ A3Nð[68X#Ö}œ›ðÇëYT>u@LôwÈõ°ØWpa} eO×ÄÏ$VZ ^Owñ p ÇM.~/h„° D@›ª‹Ï³Šv—/< –$>.DA Z]BÂÃBn …8kbih& ¨PÄ.H, † -êlH5&ü\aÃrAÔHCª"¨ ¹ò–ñH„ ã¬- zpÖ 8oo4Ó™k©ëô'!A†l„ã¯<ÝkµÉéÕî8“=ÓYdL€’=žè—6ÑÒ݋ը¢5„$#®ã3æÛ/B/o³‰8좧¥Â à%YÁI%Â$óüÓ[°…À…Zl©M¤‘¨*ZgÚ•º‘¼ *‚¦äI¦ág)ŸKn‡¯¢û(nMçŒ_·ž»úÄ÷¬Cñ\Vv*ǺëUdþ¶ãf½NOÌÀœOÈyó}MRê\”ä'ÚFÎ_ƒsþ̦‘óê~·ºº¢E¶{Øœ‘S½ÙJ7E´-kÞG‚æ¨xïTLÒ×"Ϊ&UÃéÊ¿3^¿œÐ‹µ„²3El”ƨ[~ÅïëñåË_ýù§ëÑ|]Ú»ÑSÉùsoNëHÈñm*¬œßci‡‘Øy†„c÷9û øTÂõö–‰˜‚2¹0í2èX;‘cø²Ÿ wñç/Pý@ )îYÖ¿Êû5–C­xæýÚù@àT»}z··¡Þô³%Ž~Áïüó¤~‰ø‹š螎úËÏy} µíÕ‹‹'ç2Κt ¡“Ë·‚TªòFñ 0 I¸€‹ð”•µûFºxqµ(âUóÕƒmšø}ùÚßeoÑ@KÌ k²¦†#!ÛÒ€e¹v«ºz×ÌÅü¦‹¡ÝÑJ.À$ëi¶™D¥Ý%§ŒqAœŠÑê±Á‡0*û‘4gÕ˜ ¡Æ#5B¹ô\–2”Á3S©9#myà‚éøCœ`ÇPF"ÝI£vD"•HàuÂRÿQ1œ §•ö`åJc‹¦”HåÀ—xC²ëÙâ†Z!¯Ð˜t_ð ª#¶>ó>pýC‘8oæbm“N'\mæ@kdÀÕÛEØ&è¼HâpœÈÐæIó^Ó˜}s·$ÖÉ6t z"™ &ŽHpVu†,Pœ± „¶2jO‘õ€QmCY'n-ú4üî²g Å:‘â[q%Ô=ïãÇÏ~–½‡2þ™äóÞl ìîšmjñ6lŸ÷yô“[?åžÔWãÇÇÇ;Åžzºãö{ÿšÉYÓ\ÉóùÜ›÷:ÈuÐâ´y¯ùjúZo©tµPi5rfÖÛͼçO¬/0â·š‹¦WTÒÎÉ™QªÔ²>娕 üSíX²‘çɉ‘¦ÙŸ:AÛ„G—@)#¡öÙ_;Ös>ÒQ‘\ëî¶l"5@JV23€°í¾û¹õÍ”i95ÈhÄ*i•ªn˜o#‹»ÊÎuŸ™É\¤„\£‚”¢WvjÈ„*¦5‹cÒª0‚F‹"€ Ä0¡ÇTkS‹À1BÈÑH !4š™æA@ŒsKÔCjSÖE³ E32r1 ©* PÙŠ'a €^Íb„´y­ÙPÅìSÜ_÷ÜÞÕíî³5&âJ]mú.å,¸Ñ-ëŒ1ȼxÿöI_?Ç]À‡ûü6îo÷êhI ´|"_ùç÷£¿ü1#ãe¯ÃÒdÊiŒ:„˜Guè¢5˜/Õ¦¶í/™u…=~>ž|¾Y™AÈ´¦‘VTÛ‘Ö¼T‡¶P‹ #ªEc:¸}æÂ:,q {íb®´Ã5öe¶ç?ã÷KþO_âïîíç¥÷—ï/ï|ÿS¹;Ö,Õ(ñ_çk‘|¾ü×òÿ|ïõw¯¢^¯âs~áó»{½ÿßüYß²®db³2È ¤Öš €1&­ D4°6ƒA:…R)-¨–zB<#¨­]d¤Q6è2dÓØ7€O懸(Õƒ«®¿ÿø«Ó£#UÄ!Ú³O޲hnêüù»õ­óIƒÆ5:4ÍÀdF&ù§óor›yè·aWNkP-CŒ WÜ•‹T±’Ô£YSÓ‹…÷ãƒôQÚàã`çyÅç©GÛÄÕøª¸\ÌA!ªò˜RT…ê´ãt7å~î{<±ýÙ<‚‹ši9o÷ôOÑØì'óVqªTø ec2+#£¸anr({“Á:C·*LüÜý×]aûž¼‘LιíMe›gqŠ?r’“VCS¨ ´9‚Uß·ŸÁn®ãb¾èIPõVì§)ÐlËgË?ü­ÕÛö›‡ëšÂÀÝz˼¯|úZúˆÅ‡× tu»§{¼´ˆ­èñõTspDRœôÏ\õä éæ²Íb¨9Ê\õ/„a•ª\ŒEGrÂì (B®¸J Ô_4m(9cyΗ¾š¹4Ú2‹HhÓL*ø÷,‘<{èË‹—Èl¦V$ë$äm&Tº™›Æ+ÿ=îmL±PØû${½³_QÂÞ:Fñª¯ð0 R…»Ø||e¾'p<Ÿ2)ûËbo¿¾ÎÃénUŒ#B†ƒ±ñZò÷°2=âŠ[øjÐÐ1½“ocmºË¾«‰ö6û°©€ÞÞcg¯·ûú8GiSëh™îLr\äöÅœßÚƒ§l’<4'í…EÆ(ÊÊjµj­ÙøÝWv†ñùÉ#{~˜£q¼»?_ÃÒaïqŸ'òÇ?ûÏ/Ÿ ! ¢¤0yl¸×¹3j´'ÙÌš²©šŒ-äló¥î?kûÊØ÷±×cû\æÜnwÒªªäÄV_»âŸ1Iw¡C,k:$„@IÐÀ ,TüiÇDŠÐb•H™–¬€%g”rûùe¡?I:NRv~™îm²>Ñãg>_´¦![f˜ [“×ìM[/œ$4,t…£0Ò Âl«±öâ«õá =öÒG £¼STÀ¡—K‚ ö.p ™—¿¿lö5=v/FñÝùñWý«Rß4 2B Ð˜Æ€í×x?D9/ „."ÒÅuY“Þ}¹ë);¡¬è—çsbÁܧ¿àžÑÈEWÉh(&Gc]Þ7IÀwßí 5ÄÚØ­[‚WU%CGÈ‹©Ø†‹¸×ªkà:Â`9Ê×£B•» l\Ô%šóx.ïÅ2d€lÚž3é)ÔïnB…›HÍWwT2 Î0û–8¾ž1:cAwë¬ÞFWoôrÊÖ³fþÞ¹O?* v¼ÛdÞçï67]ÇEPtj•ZtkÍ£|ä ¦ L6ÇiŒ'øå÷Kï[Sœj'ðṏ¢Ü7²&Ξ=‹¬Uf9šòn) éÕ‹ ✩/ÑÃG»´?RŒù½  é{VŽÃáí}B9{­”}<írï`íýFt““\å;¶f ¢³UC¼Ë=œ:‚T€Þ º #z¦“ƒÉ«°W¬ÿì4õ‘ì©Ì]3i7›Gi)C2åô±1ãìÈ1óòŸ^¶öù[_"ÔÃP[dލé¹'/êlLÏpPîL²($¾Œ–ý™8HLNá…¸¤Ž˜!­(ÁßPËöyÆ=†á5Û`Þ€Þ(`ƒ„ÍÙÒ}½™/a¦ÌæVhSbû'ã‰ÀY_!¶ž±Ò^”7Ÿigx*Ev&cÈÆŠTb5£\˜é¨)GbÕ„oÅ“¿ ’Œ§>üäê”Hye¼N _$öö¤^°l¦Ü“œ¾»Vµ†Èpn®¸sì¥onÉ%„˜X˜£æý„¯õu¶z\y³Ò­TbìÁý×j÷ƒr€`ïß= ¶º%u«^oŸÀ\{„¥rXJãz@:MÈ”@¢Ì@B 0`!5@¤–²o7ï FáIÈ_ÚiÝ"¯®ë`GZæUQpgØ7•ÕHÂo4¾p×ÇkÒ[­Î¡w¦þð£¯ûFÍŒ7’b^0 s ÈðÍhû±k­Õ\âÊ_Ïg¿ÚÛÊZ¶ÑõÑV8¹ еÁ$Û+ÝëXb'þ21xãj‚D•Ö ò¥õ!ž¯š¯=¯ñÜœèD:|IlÅDNz!±ÂJFX†þiÆžðÔõËr~áwt…1 âí³B¸– {Tuu_1%^·þºŠÎû—gýëÕëçó;;€ZʘN쯣_Q·U/ã¬X! Qåú•êhü°TtÈPrºüÄ|K~-¦ÓjI6æh.PjÍ‚[ÁÜ! ¨[5ðŠnØ„Š£)´`*í˜Ò/Ñào`Ç €Ââ¾ P€LË\"‘Šlðײd "8ÎGÝø=ò´úaysB|ót÷©ž2S”nŽvØÏ÷¤Z­Õ§YË[¦"ó²_oÆ¢DÀÅØ‚Ö£õn¹¬ÇR懦üì²éŵtR[˜vš"œJ–06['L4©ÔRÕ° “WnÓC •e{É[Ï’1ŒAdE= @|F‹Â"ãm+Ý„f¼Ö9ç'Ã!”"Ž™DM6 !§ìW»?0ºã¾çÏç’GòúÕý5›×s¬ùŒ;Õ·Xjˆm«Â¼BÅ›ú‡.ý§}<‹>Z²Y=û+ÝJ/º6!†l6uUEW!<5ÍÙ-Á ô¶T)§#-,pcÏÍ£­¤xm‹CT©ˆ:dŒ’ 1 jÇÇï—¬®×g±:(MÕâ q¯ˆ©DÈóKÉR޶Ë"YÒvi»»¡¨£¨üX¦!7>ç9§Vqž7_ÛîàGŽË¬\†å{x3]rŽïŸÊëÕ³eÔ5ExZL#æ5ž.É=þ6UTú¸ï?þ\žØ¬ Q6“’Yh ½M©ÖNf)´ÜL °âfžS‘˜ˆJ‡ÀE‡©FšÊ›d2TCK.¤b í'‘ã—E/ŽãÊʾ[ñö¡ €0-;ḭ̂ë=BÀ_ƒQÍA¤Áh‰P•9±´­5¨{`¾ØX ¹ÖlÖñÃ:¬0ÓÐ[ÀÏBM«éÆrÕï ‹\Gš3ê,,²N`¡(¥NöqI¢Á2Hp4ÝZ0i,6ãL®Ã_¤þ*Zp§ö9–eÞæ ¬:SoÔrƒlB:Ùa=Îq§f&yƒ a]÷„Î'm7*E„‘b°;ƒšä÷ïž.Ç,ƒKe§0›Õ¢éY“5 •+£ø>Ö&Œ´C놞HF)@ö¥/6og6ÉÌ»žUë¡VPçº|Çi Ö¢-)´€ˆÀ"éNùø=©©`!è5•P§!X]  ŠŠc0 ª«‰t›‡œÃP"ý‚ÖZ’ó)!ÞØ¸ŽÜ§ô)]/ª éxø*Øp½©ùC_-xðp\ú¯ëónÝÝ9çøÒæÌÜÈ(Þš1Ò§"µo¡zÜö@ f¢†êÀcN`GI™_$ é=بˆEÎüD÷yZŒ·å_óÒ[4ˆ7€Â£”û­9ÒAê„#ÐÝàeL¦¿ëÄÏ!Ÿ;Ù6J'/Úçg‘Žïò¬Hú¿MÿûÿþÍå=ÏQ.II VÆšgüË¿u÷µFQ]-°¡MIH­ÌëÍ©5X8ÝâC‘‹!æÓ:ZÁJdQ²DIŤ?ò3Ht’¾s0P…N&9_¾eìž,Áª €;ꊴQfl Èy¸… zl˜`z ZQ´jYÄ8&ŽìèN’„LBµh@‘D•ÃóÂN´_”Çdƒ›yÿ2¾Ü¼ê«±/™{Î[WòõÝÎÅ:~!ÿvôŸ˜þ-ã¿1íýš'òsOïs_æóïí ­}z"ï»>,?”Ç$è;<ÏÓ^Ô=Ò#¦‚€zª§ ÞsDFÏj¦¬3„˜àºgÞŠ ÔÔÜæô‹îÚb¥¦%¥ ,ú]iyäéŠWåé Õ„0Wÿ¶³Báô„;Y65…ï@ ùuI_`ÉIµØ¥DÈòÌídê=ÕŸÂ÷¯œ}ŸþwL’«I¾…xÒ%—Ž'ìÑ*©‚ýÝ | ,L/`÷”Fãõäî ×®6/$_P¨ã¬aj3Þ‚2ðQOŒA):#d½øý W¯È'¤è\™“kve<ÀR(|Ãèdùšå:zF‰Z``xñb¯UÝ¢?²€!4ÙYÏÌe̹#«noòÈù¤Op0åx”ÝS&ú<î)•º@9`bŒÈ“|%N"4Kïä1,9p¬£m†"1,281T¬XúæÙz晥ËVyï|—GÛº=·b˜ ’ ith£ í(9.a74ùG/Gõz†$ëðȃÙ?|ó®ÜiNÀ9.†‚úaÀúè‰à}Їâzö&Z¤x9}±ü ]ZÉפÝìV¢|Û­8aº 8⋱‹U10£ý0Œ/ &éœ02 %Z,¯PðÕ 2”‘LD$øâGßÿ‡ îÊ­k½€˜˜Â­¹-`yˆ –OÝ<Ï?ã-}:¿€&Ø¿Ù̘—¾ÈpÑ­°R,þf…œ ’MЖڛÔÓ`«uvÓÛºn¿Š÷o§N¯ÝŽ«QL™µ} pÃ}ùógÕqï6ï´ðå Í×&fHA% @`¢…¥ «„‹ É,9¼gZÀØ»±2¨.Lkçµôý¨SŸÏkÔ»¬¥d›åK˜®>·t ,{ˆÇ°—±B°Šߨ:Ÿ$™šÁ2[ÿâ9Ÿï¾s ©Ñ]ªòCÙŽCãi^;\·ÏÁ-Y ä'”&å$FZ£ˆj@ÔV1wÕóóËÏ3¿œ+¸?ý„KÚ„<Á¤`Œ qMˆ m¤QG}BÈß¡÷¬Æ ¶”¸¶Òíyi¥“ 6:zÇp‘G4Öc¾À/¶ºî<[fÒ.Õœsr“yQ|ê]êKw4#Û€TgW—P µÞv^‡ßëUù“Tm­÷\ò€)Biºr¼DCj]/¶ƒ+wà°õVK½…<+, àâ‹0‚ÁáT5¯ 1B"¤˜"Kÿâfkttµ«æËk –KÌASÿ0}ôÖqØIúúíjLÛ #Õ½=$ÍÅø2Þ\–—q>¾Ž†&Ýó™6ŸM” ¤Ã@ì!ãK³RnoH Ç+GY¸l},¶aÚÆZ2˜„.®Ž W ·“®Šsd ?èùs{Œè¬ã]Àbí°Õ·i"0‡&T)•ßðý…9  %¹i g‡YÏ…Zê^TÙÔÌK„îí×Úç|ŸèOûÓðìhÓkN9‚·ˆJP²`®âq”ÈözNŒuö^ÂOy¦ÑÎÒö@/Eä–úfZܾ渷 6òŒ†@sNl¦YWžæ‰î5ó-Ô¨$‚*±õ´ÖôÀCxºáÀKìC«:bnC ICÄö ›fµžÛ~€Ù|ˆ€1g¼Cè9ƒžï5­äôkÒÐdhírŸËÃdqúœá’[ìÝ{ÁÛ³+T×±ñì¡o ²É¯;Tœ§Cb\xo5/¥”x6Ÿ­ît1ݯ}ݺŸÑþ¦­³%êÒ‘ð¥ö¢–ï|¿ù^´0s ô¥0çºÑHi¦õí”d;ñz vâ¤æY~ËdZQHY1´*âžJJ%é@iq"ÿÊÛ >¦¬±Rf3“N ùrÏýOš, MâH±Ø, Á{  а‚›ªÇ’˜öãéý¾œ¾¯}U¦$uñ|NÉ3úµìQrýñá@upmªZªLw¢-2ÇõÌô-X%‰h5#69å@F`ƒ3lª%C34Ó¡ 'KÒIôÓ?´{Îá#1 ÚéEªþlîÄÈvR»H SØe$¡"`ÌŽ»S;Kï¬É9Àï*ØØN+À+Ø=Ö8ˆ/é@†N“ Ì3ì+ÜKL"ŒR½5óÎe¤Uÿæ»è?[o¤=Xsç³ö®Ž¶XÃÉ,(…{*Q—ÑFæMíÂûšÑ³Ù”,‰$t IÈtÍUƒUÿ—ž‹3­¬Q…¥àñ*¦9.>ïÆÛ»Ïç•αWUï*ìmóÙÍׄ½ˆç&&‡pÑXAžUö|Í3¶þ»ÌŽ|”‹èßøÕ·ýw÷M–@-苨BñœQK9ìƤÏqA=p‘ˆ ¾hæi¹# ³¨±SDT€¢ª.I«µ·à§8íç@üÖ‡"m@ÖjA´ta7.lÓ­ n ”™œ¨Ó&<‡2wæK·ò ¦(‰ =â„òÈ Ú50TX—¨ 0Ø)I6d´Ý7¯ù\›¹i©]ÄÎÉ©;5˜Ü,œGòoô+ÔéO?_r z›½Î¾›÷úÐ>*ñë²ï_&_Š~óAóâ{íýîKì½ïûΜ!°ŒP°ØDì€DÀ× Vª žê@Rléž~¾vñ¹{J+ãP („&)lánaÌŽ“¯®' • Ã6U®‡ouñ†÷Z÷¸åüõÜÖÍîû¹í[ä».^h>¶Û·,P~ë¤~ÎBje¸Ä®ÿxÄýzs÷Dûux¡¢Âç0?obG v†")aX!@W   ÃP0( fƒºöLÖÇŽÝkÙ)¨ѲÁbD×þ<³[Èt³äú‘ô“R‰^ÿs H§ÙÛ?øWþùscéD:M]ÀMH*Î`ªÔÃü„%ˆŒ:ƒÏôN'Èg$©†á"d”ÇÚâ½£ÒM~=F5Ôꘜ3žòè‡zö¬9z¨a]ȺßZf.5ÛUus‹)J+죃„©S§¦"TûO•ª8žç q†x[{Ì(rÅø8† ižo–›Ït?j×g}F½þxßùÁÄ7úíuÛk|¦=·´e:Ï ¹Š ocfó„àRETÖ}Sþ…´âÝh6°=çMÂ#fwv]óÝ×*ÝôKÝâ9ûsfsÝ‘ÿá:LÄQÅÍ3ûAP){å‘墎œà`–È–_ÝÈÅ{Yl¾¬¶AÁš"47FïÙ¸géZû›ý¿y~ó?þinŽe/'­E°§Uw3CH÷´a‚*‘pÜ:S¾L/Û¡¢3•©h+U‰o4ò*²!n:/2–…k8–qh<àr¢}lP䊧‰3È+ÞYî³ÿ¯1LœÜÜEZv¹›íi l)}ÌaûÝñÇÖ®¹ù³™«LÆ!O@§Ý'ð»ÓWO¤GW>– D/JÕß„¾=Sè†å¥Þ$¿’ûþ}úúó³óîÏûÆþ²°ÞªŒ"Çž¿ÖoÎqi×^z/žë73ÿ%g®´@UŠê”1e…»ñ\<Ì—’ ÝGð¿^Ä›Î~i%‹éÚ¬™<ËÏ,°ü2u··¼»‡ ¨”`U M¢tÅŠ`ôÔ?%Ù!‚Û<@+pmAÿ’|¦–ë‰Æ ±M£4ÎT4´‚ÂЦ %ª5þÎù5ïý;âçÓ‘„Q895+ 0•4~ì·Í\RØBt¸Zõb–Ag}%ÐÚÆó­põ¸ —k#tñ)£}®¤ö/ï’ç}¯S£&6w„‰~L ÕWɧœ¾€œM=¼‘µ ½á3ÌÒ;×GåÒ’(1ÖD;;…-È\u?a¼7Л©GãÊèzcˆÂdÕ ¿¸¼K©ÀèØ}°/zÎ^‰ØóìÖr?›“fBÀ´¤OÅÑØãåN»C³àµåˆùæÏcfš=š†]¢<µE}R?1ŒFwå*RýéOØÛ1Ù™èªFüâÏt‚~B¹b¾ìAŠ„aE@hÝÊùÐ,Áf%oc`V¡’‹kÍË“ñÚ¥Yà iµì{:Ž,»°Ëf/êì7bkÙ’ˆË9x”ØS·Ç+ÏpES–Z[Èp¤÷»ÿüÁŽÏë1ö\ŸMgmÍœÏñú™%ôì17NªŒrÔ]²~)ì7PÑÑH®q±ÉÚÙ}L4š áts,óoâïkev·5½‡·s/E<óK—õ´0ù¨pã†&\œ×iôT2O©vƒèËÙ|]Û”â `W !Y ©&€€Â˜xT2!ØÈ2-L1”­=Þwå£õvûGêFíÆÎ«>¯ˆ³iWö3ýç¨þˆÆrdœ­¼rº—®ËÞ p(‡”NW _: VQŠ ¹ºÙ¼ï~˜¹Cýü3³»7yï×zÞ´_Õy•#¤ú¨‘0D¡©Ž=DÃ\µrj„0 µÌ®¾_—½9rK&“ÃY_U;Ìhò~NåcÑC‘V¨€0bFY$qcØšlN+¦*X¶É}+“ÚY2„0QÐ8ØxÁNs;²U'è`Ò È$Ô» kY$7þ-htê¦IÑ!¾gý2`”žr;–F hˆPUÑ^|«™åxèÀ¾Ÿ¾Èñ ¡y ö8D"ŸÍ½m4û °`.øb¹èÕ A þÒg0ÈÞƒ‘=¢§öÔVp«Aô .à ?VPÁ•¹’ôUeå\{ðΫ;ÍM«~ѵh|W_¬ßÌìùºx÷ó$ë¸PÕí ÷à5Mr]žy~ §ïÖ¨³¾=ï¯fÁçvdŠÈäà’˜ÄmÚ…­ßÖ†?gIûY ª™ñv `Ææ¥Ú,~pI­÷‚Ükç™Ô–Z3*Ö÷Ãö3âÕhÐ"j¬¶\9Ýu19aOb*ZZaô,·‡õŒ=Œ 4÷øú8Þæ|½µzÚú;ùœ˜Oh ”ÌÑð4‚ºGý9‰ÆÆ·³ÈðBh0dÃáÓ…}oêñ] Œézu‹…Å­>gÚ2kú€Ú5ÈC|l&Ê “  \àÙ1{±÷1¶•®,ËDC’ ¶4Y;]‹ a~KÅÏÛ ÌžPL’š†xk²k1W}LFÅnOvܧŸ·×#8‰¶¢h† QYCcŸÿÁÆT§eÎÔ]ƒ©̵Kì¥ÆÉb†Bzíu7ªÃ›™¯”›ùD¹5ài@T B „À‰0µ lÁÿ}ñ@$»0"#œK}?ÿd=Û³¯Íi…2ìÃß³ý¢ïŒó"-äJLÍX3ñFúÌûy¬(u ‹‰D¥'Ò¾‘¦Úô,j”ůª¶®^Â[RÁZb H4™êŒ{ºÔqž·Ë˜®ˆ¾³¹õX ¾b÷‰ª’ðnýõº÷eô:ŠZI¥ ©«\"à[Þ=ܸ¦NW_¢Dªšð8¨Ìƒt•¶)š’Ñ-ÙšS8+æKƒ¸[Ýt¨êKUwÆèXí&ñÉ*'UªDÚføj!ÂF”Lð“ovwqVΊ,NŃ'š ¿ÎAéPù”’p°Û;è "å2ZcÄCJM¥É•rEV€]ˆB2Ð(Ø{¨µáåqþ'ŠËžçKßçÛ+1ZÈŠ„¡ éHõ`î‚–…Ÿ›‘‹ÙÂžÄæ±HK†Y¾éýCÛßçî'Ô-mVá×YüuG}¥¬ ßa|§øŠb”—cïë:©,ÀGçÕ¸Qòñ«hTSݺ¦7ñ›°cþQ[E{ñ¶ækaÔ€7¨W·Á^æß4rž&šÞÜ’\×ê×ê(<%ë² AX“¡G¼]âgÁœÛîŸ}ÆW:šogþ\ø©´̲…»ÆoJX »<ÿÕó¸×¯Ü×=î)ÏY“{³\rhoÚj?žs?Ésvz!E >F ¨átÁ…#]ÊVèþ·ªäû5°#ýL·ÎQA!AͤA‡ ™hÓÁnàæ*K°D*¬ˆôàŽh,…#Kyèl÷&EÓDÄæˆÆa±8Õ@¬DÆÒC ÂV  qB×ïœ_ ÑEÿéH¬4Q´f# š@“a:?á–xÅ#Îà UcÉAYH…GÝÞÏÆÝP/™Âܯ¨OÊ—Ùœvé¨-I+¯ÌZUk–…%îO4ħ·»nNšïä g$GqÈZéà´C##î!"aÍ*i !€@H &‚‚¥#9`€K ÔÙ´3]°l\º&WÁzI=3r=¬B½I5D<‹*6Õâ'âläôøâe^²ñÚ·Œ¨J̲Ñç4@)ªÏÉǪ̂IC©aˆ.cG™ÚRØcFíkyí¡ q9ÂDœÒ©w}ÚÑŸ+MkWpßú‡òåª_§W‹…¼­ü|ê©íƱËeoŠ'n]ö5h«Qt¶_R fˆ^°–€mQ òÎáHâ@ì$îW¨ð\0*ÇNËv<›+xXö9¼…C@HÞ›C" À¬×”-×=@â¯,çµ¹ªY$ª)k*™<öñ…‰sð@ßä\¢¥˜¯ÛóKVÍô_ýZ×/þ˜OI/øÚãã-Ý´Íõ{5†¡E€$PºïÄlIM+÷'(èL,Þ—±R03 4Sl dŠ‘c®èçìqô²gLãÔ tæÛ‚Zv z@n Ìy ðèÆT“Xh,€ zÑn%^9º¨ ÂêG5÷Íñ[~êõŸbk‹+–¹Mq¶éÕ!"pÒÉÎ×F÷¾wO­Í­î@Lšáî{=ß×ÖBîÜ Mz´2Ê+X[þh ÊýYu’`Sa´¥zØ6˜BÀLm'î‹ísge¼¦ëñ‡Vl†+çS£,Åš£T>à±Óʳ’ºŽ¹P¯(j™¤ÜXÑl™"c…Y(ØZ²¦ ZUYFÃÀã~INý”èxGM F[Ô+&Å„q1Ø"ßppˆ.%×’¬|G3uw, NÐÞž&t™#z„“š‘¨ª„ÂØŒÃci#9JÊàûve§Ž™¸Zª1T:´¨JÛh;4þ?vð¼¨HY*x®°N^+ßNÍÃ8}v¶&­o8´¨Úª¶:žª­HJzîú¡{ìÙ½š`t.$ìVη& èÍÍ“÷ dã@“}-rlmãÉí§¥t1ÿ,q}B J¡GGF(doŠS@SaH¶S' ;¡O;±ÜQ`>ÃzŠÊWç×GH;zƒEÓL{v%éýhV‡[]ƒ#¸Ú@t#‚üq™¨H>@à™^$“à¬qŽª«•/öT‡rŽüÖwxàç7:êò¿fä#³c˜MÎ&š&ž;è÷]\./^CÝ Ëɬ¶`½ŽÝ± ¹ id&§= %ü³ oøªíy¨2‚ÁK;jª´kGËÌŒ­£So¨ŸòÚçJ§bDzGÊïÁ§Ô€"D¡u1y¤.š‰4‘Š|ö‚ ˆ¢›·ÃÕsä?³š 8Q¤H —„.>•x›¨Ø:û<›çlÙj`,9#ºWæPnò¨ºGõÚzJ8DõÜQߨñõBã°Ž¶ÛåçþìâØþ•qÎ`aòÕù}¢ûè–%ˆ(„Jú$‘Û–®Êò˜01Jiññ+€–¤P¨C¹,f—^èþªÊÛz¬gUÉÚ [ø›ÉËõõü¯÷ðŸrujúßȱóÖk«Y³Þ_)?^“W3€cÜeY)+Äa3[I”ìào­~‡ÏÓWÖmW^wMV9L«í@âaµuržó>Ú O’ØóþÂ};†qÛ%ŸUñBžøzg-Ÿ÷dN—×ø¾#s—/ÿˆ'ä±òþ-g”úàJP@aVdPÚCƒLZ}¾tû>þ¹Ïg£†@LN—Ãuí§¦¹®žU!Bô¤þÜ*iYàDÜUöô‹Þ}yço®'ÿÖLeó§ É1ý]«Ñ™'–”’”™¬‰+G•Õ* ·úZù¸Ó*ŽðÀ )‘dtðä -,küê~t:âì+,à#Ћn4òA!§4Øà•xu%^ ¨pGPð © oôú¬ M‚q]ñÙèuFdŒ¢]ovÍ•ëa]qJ“Ú4¦ÞÄžxWp¯®ñ¥Æ"x5Ȱc@¹,¦^ëï"ºÆª{™8KÕ’\2K“<Í,£G (—µ`—­‡é²^›™Ñup\×ћɸÖ6õ¦WãüÞa¬ôrðâQoXÑ0%L4ë»áÊ7që,—Ùà˕Ȥ;ëcoÅy>«‚’&©ƒ0Nê3U3ý*òƒ‹²qTñ"»f†–FbÏåôf꘽ƒÓø³ ?ÊH2£›jEÐjOÚÏ£ÎC 7ÝÃn¡hÞcœë¾âû~¼±»:€¢t„2Ð<#¹)ïä´‘H¤EX  V‘1’–ˆ€A=+ > ‚Îv2Ï®’pR<6ué­–p;…«R̬é©ßJ07ÙD–^Ì ûþ•…ŒÌ-T¢‰s~—2XPD6‹ÙPXZ ÈV-%‘#$KI¸°ÚʉN†· fØ0É‘¬Þd‚¥™Q™¹»e™Íu¦™jlVḉüòìÍgh’¦Økø$"Z~´œt/Ùs7¦ž¤'9ñ>èèÄ`·ð·Ç¤:Ü:ÜvwT³ ýŽù‚›!9ö`ÚV¢ÒΡ[T" Q’p…œ ÷CÀIØ9Ð?Xtª‚&p óÈ3 89Ï£¯ýŠíY[ FÄÃ$îÁ­<.;ÇÜGt)x Ü&´A—U³ãìÀ<<ï)¾f¼)Äg!¼úrŽ ó‡òŸsÆ×Š/Ãït'[asR +)¥d³ÏîÜ*±Ü먉2éizÒ¦ T‚Ƭ{#i‚±“ð:ìk€f¥¶nʶšh®íLÓ¢¼I[^^vÝoì „[YI£tPMl;hS+žîw€5íÓ&ëQ?ÚÛ”Þ¢AL¡uYÝÆÊxŽrE\MŠQÍB~bPÃ@ ¨èÞix¾/þT¿¿€¹ÇHÅÛ@mÐë§æ¢3ª¸Æ Á1 G`¡c€1m’ôPœ«œ¶7þ]£’³ˆôñá}íÛQÎGæ¼ç¾çln ·éÞ¦9î?{÷I×#›Ü¯¦ç+æíÔ[¡ä!)X˜" 41Ÿâ9ÿùý(ì}¾‚<ÝãìßVŸÏWßóú3ó]¸ÍÌÝÝì»{?8¦’»Žs(¢¸›ÎªÚlŠR´²äþµ÷ü·ßµþýÚcÜtw†ðN~2˜9Í}–iN k²W’Û’‹ÃlæÑ(…ƒ ”IX$4W&1Æ)›pÅ&]ÉX+5Ö“èœMmß5žª3À4³¥D'Ûd”½¡=æïý@›?øì |·\›Ç¨zŒØ»xðBÉÉZªÝ~$'œ=ßä‡7@]rÜTÂ2'}W¸é§]üšµ)Wu|Ef𣞷 WÀMÍÍ­Ûû*§ 4 ‚ èÀe08¦%O¯§ï´K1N·"Œ@H¸£¤ª¤ó çÎ/¾0ks]âlç!Ž3í”[Óª™¦`z_‰Ù¨U7âØGâËšNhycèÈ[Ó(*-*¨ôˆÔ|kãS§ç=Ñ8ˆ¬j§{Âï‚Ô!2R§vn7A«ƒ›ÅNÅ}ÓX¼)3™®"ÙL4îÖb2¤ ¡¡Rö $B†Z(RýKHâ‰uÏ–Un°°€Y ONÑ’?\€5`€þÆšG h¹-ÓA_x± €£G45ÚJ¾©ÝIõDpNÓ¬  H²¡XÃy‰4£Uƒf…-°Lù"ÎIQbL ; ××vs'ðÉA Ž:Õ`Þª vÛ‚ºØ’È œö¸ÊGòtCÚÍNi÷)ªƒÆûLTÖ(Üìv¤piÙâ›Êèv‘öƒ"¡j ×É¥—aÊÚY?/f-¯ŸMµ+û"¯œRí„BB¥?ÀxŠê ®2G²ßýE xížv€PŽ¢ó-„@ì“`’™@®úƒ¹ãr~v8{4‘ã ÝÜõwtä>ÛPÚžô`ýGÌï¥ãD7x€ÞsÔ«Œ9½JÇgÃVYqÀ\—¡€ÕÖØ µW²ÔðºZ+:õîç.Où3X@T4à¯Í×ÁŒ3½TNœ¶CÇ»WRk”Ð2‚Ý+I ûU™fæ*ïÕév\_O#É‚­þMX*ÜÓÃã$lƒzè$~e{|°¾[ÖèçîÛu\s«žŠè&Ç9ôõÌð Ð߸ÿ ø÷­zS#AÝ×…'­;–6ЛI¹™Ø(˜…‘ )º ýŽãFþg”Ú£Vþþ~nŽcc"Ë—Ûkã‰eîWÖRð]!¶ø,~9õŽÎ¹©;`‚‹½EkÏj w€›Ü°ásè+ÙFãžÒ=Ë©–á>úšS5K9Üׄaˆ?²y”§#V6|dÍm~Ò>U£ÐÆNIIÓA\vʰ‘ò³S"ÖH\’}çxݨÅàÝ÷˜]GšÁ2oʦ“CúÍåîdǰd +{˜¸4ØvG¬³ãèÇ.Ï+›êõéüÒ ôøÕç9tA¯»y-£‘»ï¼D"}†°ó:‹±fÁO|û×i½ì~ß>j÷¦Þmµ= ¯_oõR‘HR0æVcÖöðþ\OmëªG,¿We‰gÉIR $Q€™ V?mt?®N¿Ye±ëÁ,žO>*¯‹w–ß^ð^øêߟÁ/9‹Ï¤Þ§¿øË_ò—:ÍDfd‚{y÷iµINÔ#ÝEï.o/¯c´oݹ|Ö|'œFÍÕ–Ýż-KÖ*ß꟟~ëÛú•Ñ}>K=rÕÝ7ëÍöÓý÷ÓŸÇçóþ.UQÉàAY×Ïpby$)ìOÓzô*ZdJ5ϲh‡@ ŠPrÕ)ƒijHÔŒ>JÎZÏúùyÿò_öÍÞç¥öщ¤¬2èY ¾i$Ä[åfUwÖ¤a>Ò’p—÷®Ÿ/î}çÎbSe¾W®J9Î,ZRéÞóùç¦^«&Ñ@m£y³Ý^ZÔªÁ¼/O!¶ÔV„U‰ãuÒ)›­ܶ7àVó HÁâXš€{!)RZp õøêPW õà6@@Ä¢?˜¢®í«ÿ>¯0üä.¶u–pú¨éNŠM ›`ÏWVÕÁ«ŽK©õªETÂ*yÑe*¢^5ÕÛw"–ÒÆr¦ä¿jþ.X¤Ê¨ˆ¹ÝD<\…y6òR—tÉ"—Lzìmj)¦Úb×  ’7±|µ®4؈OêÁ{{€>øCGÛ›µ)]‚R@ š˜³š3¸Ò¦Ö¼I*¥,?Ÿ} _Üj4È8΀C¤¸A€×ú”l¥ÑxßOçɬ7¯,_~Ҳ׉„Þ-ü Àö¢ÌEå×Û©¢›D¸›ä¢E¶zqbKQÿpá·9ttè¦jüB8C<²Z×|†³i3ÚÙF b@IwhA¦¦´.õDïF±"×µÓßfý™*+pw§}j&Z9J±P[›5áW&öêÒ¼TH¸¡†€sÂøIAZ3ñ´jHœ,-qĬ¾–A([úy:Þ÷êò` êkì_žZThšÈi®Ò´Ž¦€n5íðœ³Åç£Ö[¼ŒËý2±ÝôűK%eo@ž[ÅøÖ$õÅU¾ÕªH°9µ$ k£4K‹§' \Š¡4ybõ‡× X䀢<™ˆašÝÊŸg|íˆjÖ‰=‘Ld\am÷†˜ïÍ–ŒBl€E)˜é1ß”¥‚‘¸Š 8¡¢RzžÍºžß3}~™~­áï ÉÖ÷ž\ʓ촢 ¯-‡ÿ''ñOñ«MÆô²±Iµ²TK¬®ã9xG^²åþëÓ#{¶÷®ß½?X5¾ßõúù7U¦·gÛu# äè  ­Ãboó²Mütp—>¯Á“ó¯Ç“—/’"iO8xú]ú&RŸfëîý’p=íwç§ö6±ýás›÷QFÆßé}+µU‚JXJ9œ©Ð$N³‘OëKP¼@FhV)9úôG±<þÒ …~¾ïÂ:þˆf¶‘-R4ÇEd%R$²›àI†{x›Š¡­KaÉJ©` x…>ŸÛî÷ü—Ýzø¾&¥ÈŠáVQ #1D®iQj’NºdHJU©Vœ ¶ÆòrØ@@UØÀ3æCè٩߯rßâ§2hÅuÔ @814T½¸ä†}¬ð‚¹À¤ù¶).Wá¾7›ˆ“,•ʦC"±€iÉRMZ@HU¨`hg˜GMø.„„Šj,Yƒ1ÅEQ$:L Qtì[¼ úÁ~yÜý6?=ô<û8lº˜4ÝÚ$˜@:¯ú¾ÞddU“x FÀ(""¡A™œj„„†§0@H¨Ÿ…ü¼µ¨/3ºÇ`ÙH"Óã J$c4±…VhCl¤>Y\Å©^=…|\®üUÖ¹wÿÜåŽÓÏqeçõ|lz†»­é¼é޳¼•öÉÑ2ñ2·uîî)š0bÊ5>‘:Þ‡g"¯Q¼ZëL°b !bШ‚+Z¦ BL j ‚I®TSPB²A6ªD¤d@HئO¶¡•ŒÂ‚9‡`ÈYÎeÿR³È<Û+ €à´?Ô,Ñ̳ºž³o?»â£a+7ª8ëhç #ÂD(¤OµYh…]XH4DÕ.ýÚ.AqJW;i –†º‹OÐ23"Úxf¤4um×{©OÔºWýv?§ë»V¤Áu„Zí»qf'¯:Ò ò9†k„ÄŽ­i?Êw€²:ãéÑÈOGùÌ3¼ŒVÂƵÎ(Ö ïÁŠGÙínª×dSvÞðK2~*u)Ùº9(@f¹K…°<þïÈÝ=¢ ý“Ì­ÅÆÔÆÈ(<¹•ïœ÷ôá™öÛLQ±BX¶½ÍBŠ`"‰ñÆ-ϳ. 9Ï § x6ë@ÕŽ/T ·W‰\˵¦_Æ?Pú@ʈ*Oü^·Ì1ÞÍ[.ÊððíŽÏoÌ/ÆœS}YÝ‘vÄb•$J÷ÄX ƒËPvÇ4‚d· »‰âžÁï…’*!¡®Õç5xþÐ÷¸!3„Xàæ´¾àÃäS8°-­·.Ÿ¥°×1žM@ž…µ·˜‚¦§*Æ…±K›†¶ºÖ`\)Œ±‚(y”_±2pÐ 0rWîëÌËq")Gô:SŽÂS~þ)o¯V^Ó|¦õÉÉqn‰½V•Ï_Æ Ž ˆÐà€Ä +´DÛµŽþI:»¼œß¶¬9Û¯µ›Ïözv¹¶|žÎ9!}›>¬ïíàz›WšÒ?¾Þ¯«~Ïšâý\@–BÕ¨‹ê`Š Öc‚ʪKB¡ª5Ð,àv#ûj®gÜNž9Ù~¶Ç)ÃÌ·¯Õêîy=~âs•ëä0G·Ku/uŠ®”H,®€l¨Œ›¢¥Äb4Þÿ{µÿ¯Ï­oúOÔq:)ªÓ{ÄÕëû²<÷\Ël׿ùXÓ&õ”ɺ «Þº'Ê®µ„0 @B@„1ƵP¢tá¤Q‚ÒFVC}¤RY¡ÆîÊÜRÕmã̃Ø>¸ŠJ4)ÍãÆdø¥ùœ§ÿÓíT»\°¼ðH%õqâÇ>ÞÕ“Eö²ã ¶ï4Ÿ¤šŒ † ©Ã‚Qƒír ¼ýŸ?Á¡{`9ÓgÿâÌ[á‰æŒà†à ÒŒòÍ dÂdfH€R éÌÒ¶z³ƒTÚ«oê¾yéè"É©ùÉ;š§Û¾¾;•ò[ŽÌ5Ƶ2ïúœ1O–­Ï&?8Ù“8Ê¿xd¿yôš—½Ñ5™æÄÉ‹+I’è’Å‚·ÖűæÇ>ßîêõ±ÓÌ£Ÿ«3ËP“°ÙS~Nܵ-&cp:Övk ÷Î~C¨±Rãò@CÖ‰j3SÝM1*'ªyˆVQUD =¨áJzØ;$\•˜–ï•­ÐË5%/@ì¡á‘àåC]²åՉʹ´ ®r™èuÔÞ öמ"TÂdž¶u‹±‚Ø“ûõ_Cÿú¼¼¹j†¤†Ñ2 ð²í¤4‡Øâ âAP"¡LЦRC”Ä 4a*d!² ‘à l´@¬šWŒ•X@† Ù8ì˜Q³…8Db0fˈ÷eÎÜmš—8WÓtn*b”š³õL6­[$d±uøAèôN×™±¯³êÌA¢zî¡’SòÀ!ÐFý³³ Ès*¹¼›Ñõ °­‡ A æ§|7BÇ.×b²|L^ÁÛÒ=@%ºC! Co ß jon@ ´½.rþyëúj0Þ¶ !gQH¨pê[Y Œ˜ûrs{CKcMÁÊ@ Š(ÐÀ,f¥‘Š…rŽAÉQôè®B‰ü çèÚ2Ð[LS¦s­Ý#R8Ÿ7î?7åÕçOéªR "\ô¸hpŒÜ凚2M>ǹO9_ŒSø4h}øO]Ž·‘ûµ¨J= ÖQ§A·Cµõ²X©ó ëéÌFI4N¦ÑÉÛ:؈K^z$ÄPBB¡´Uoæó`4X²è ' o¾ÖæVÎÝI"çþY\ÿÈ£,}‘©àØÇÂQ[M¨—P‹ª ”%‚6ôqˆÓã§3š»\x¬=O,&íÜÝK{ÎøÊ¢ o£QÞ¶ÛIkÒ!ª”yãÄ4o‡é²Õé°ˆPjª#Ršb‘¢°¸,KŠ–r.¹ÜwUýH „dóùdÔûÖ`½°ŒN”Û½7TÞ-%4o¡»Gû“ƒ ˆ¥+Ûá™$yZ8.!º‡=Î à¹1Ú€–F^Οuqèí.UÇÎh~÷o÷ÛøÚ×ÜŠóh…7ÒÁ;ÞÜÑ]¥UÕ¸Û€h€Rˆõ?j.üŒ2¾¾ªJÄÆ½'W/d‹/ëGåºôL®ò˜$—à‹»ŽÎyåUSuÕ•†8}ÈéXÛZº^×ø×Tu§g¿Êã=ÖßýÉ‘vtlò<ÆO4÷ŸwKSì«|íóâüqT"%ÒûÉí·Â‡9dã¿„£¬åXn¿Z¦VÈ¿OfæñêµéÓµ«ÏÛ«'õýÇ;wMZQ˰ÓëžGâSgªÙ?ûãçí/¿ôØÞNMóöwŽßç$ÀÄ#„h¡UØ=w;.5 !$)>ðëxÞÙ¯6œú‰¢˜ÝŽK>Âë 7^8ÕQOVß\M5¾ÎLjh…W÷˜™!B½67H·Ûx%‘›$³²³®™œpÅ‘®…º ‰ÖOÛ”¹• į$€Ö |ä²–ºvÔfÉg’Î2àx¥ýDflh„UŠ«!”>—ýö‰Ï'äãòc¹X%°œN¶ž:ô¤M¬F` –#*²Ö©£µ”ZÕO4·4gÀFžÓ–ß?Ù~¿U¯dŽçÁè±qFY¼‘ÇŸ¡%®ÀJJÆDP0åíþö$µôÌÞq©!T©D(ð9P énÆ×-ðµ·^¹÷Cˆ4­ß±‰$/v„$d:Z`®‘:FÃuÄP^V—ê\øš¯›°Ôƒ24‚â8cŽ%ÕÅè`¼:–ËðÌ„y[Gt0L²íåÔ ¶ÏÞ¥€ dìɇ‡~òã ¶þÀæ0j2„L·Ž‚¦¶Wb*~šÖÄô®¼üÒ3"ºÜòpÓQ«hÂO”|Ú±„Ú8 ̶w¯[Ÿo?ímáÅølq›+¬¤ŽU¾¼sÌ4ÍqýzOéÁ¹‹B‡Ã­×qOk,ç9JqŒ@I°‡åèZE¶!¤é.:2^e‚õÌô£ ¹ÚñÄrK9I 2Á °c3’¬àðœÄe77zKpfZª6˜uC‰{dx«KÌÎnìDÁ@ÐM?„1å.ïûý}(MêCÚâzeÌ =Ó 5Ï­Ni1.~Ƹ¹å·y!a b²Z¢¥tü=ú5±ÆŠ”Ü)É€o&Êz”9˜˜ÈÚz—^§X­87÷ΫÄÏšRWQøÂîÍŽc4\­ú:öù•¼²ìÁ\T¯°øD}ez/\ïü˜×'-”´ýÓ¾…²üX)Æí pÃý…¿–T!Ý+øÓеNË…Tª5Ôï5ÕÜœvjík‡r³Œ|x´y¨»1¼¿N´Q“ÔIÉ¡\ ÒØª Ö\Z5±0‚;‘hj(˜Dk,¿›Ö-0°©2.| ʃĺ& œ ·¥’´ ½Ô@0LÜó§„)PB·òžGƒWºNÇ ¬9Æ¡”#pÚtTì•®FdU 8á°¬!±7“Ü¢yvJ± _æGRÖþk8… G ¾)7‡Reô4 ªI+¸r,¹dU —’ BaJ§æË¤‚ˆI¹ƒC¼¡8lÊ\• íˆI°3ïŹ…e˜Û ]6;ec™¥–£Qk‰¤Öð“¡ó À"ERiÚFrJdRZXikuøé$¤bÔšEÈØ9¨%‹0]È„´3*¹Þ–ů%ý µ.^*^Ÿ·‰07çâØP±,èÀ‡X#—I1ű'yÖQ[ö–ðä°mhG»¯ ›SòÕ9,ò†õ°IÜ–¿¬¹vH `Änל!çVÁ‚ñùÞ]S4­ç©I~Dïp¶¼X®+Ø(ãiÁЧÍ×A€Fò ݳvë@Ø(c•g+=.Þ%` îî‡Ù5•D ý1p›VÆw¦f¤ªÉmÖ­ZOŸÍcÉ3\7©ùî]¤„^Ö$eAèuQ§7CÂ+«~P™Nm©È-¥ºÞleG“HK©Z ðÍ£Ó{µgVŽ‚1¤„P˜rë3ήщ{Jïì¸!_ÜÃïÖ$©*Ž®Fª’¶nZ,4Å]–Ú bªlQÀìJB¬ O„jSþ»ÿJ×ïÿÛ™.L‚k#BÍ%†`S XY«FÐBÄk"…÷¹8F[IDx\‡;E¢ÈQ°-l4 \ª¹ËKÄÅ`<,ž#ŸÇ&™I5ä¦TU¡1‚qjWüJ6^?Z¹pBef´‹À`‡ë²./PŠ4uAûþú(!Nˆ5y®ú°¨nºETçEqÏôPó¹¸ÎC¿K‡¦$B4A{Á| ÁŠP¼ni¡‰ývf¡öõ~óxúÙFýs¹ 4½á1R¹ˆmZ¸è© ,[×Ë$•‘Y&T*LÔÃHØ.¨Ã ßÉ)8:K7kΓ´‘ÎNû^È9CgJ/‚àÒë•>´¦ÅÊMÌX½WQ¶`º´ë~m6 (FwUmF°tq2(ë ˘-Aªñ@ä¶)ɯÏZNº`ówô‡ŸÌº‘hmúðsͶÅ,é]v…!rd1$Ô“[¨p^øÌæù«™uGð×á˽Ó=1Ödž½R}Ý Ð ÝRþJDÔ»íu¾ðp¢\$䯭#IàvíÂãþ>ŠòÌÓÉóþÆahVûôi%¨= EÒ®‰~(hD²e©‰ÓÙÙ«øù8œ/™²±àq`¨sì\Õn½öB½ú\£7¥›ÎêÂóÃÝØÎ[š#v™“¤[x,.[Tά¦Ë¥ÆOËD‚'#èÒEœy(áÇÄoÍÇwjPa¼VAb®Wvý¾ó—l.óÍ÷'oxºÛk*_‡Ãµ.[;ç­üh®¾¬i‹,F½ŽvÚµÚþí oÌݾ>È£U’wõ7㟧úÙ³¿E¨ ¬Æu¤žõËö©qé® !ðYxÿøûY=Yžï1Ý…yEI¡²jf¼”µgIg·œèS¨¶=ˆ&Ïü¹çkØyù·Rcðoý~yöO¥¯Oþ™Úò´Ë9<ùÌz½«;êŞŠwæåÿ±ó—†ÍHDGt¹J&¥•"p±€|IrüR¡ ¶1•Ÿ¢3nŸ:„Lâ ´¨xÔVÄAµjWG¡ ¸ )D°ÂÆúÎ7>çמó°î¥ê(CŽé@¥ú9E&®ìþò§ ØcéâÜzy³¼×&î=Ýj©"GEo©·_Ææ)ÙÍTÚ].ðˆ‹»qŽ·7 ¤ -ž%‡t¼p‰ X4 Š [2Ñ&¸q«ý‘¤š:t!L“ö©#eI7¢DÌ„S`@-£Zų/Ú(ô4@z‘j3ˆËùôNšˆ¡$„6<ƒ À Ñˆ¥Êª,[/>õ¯9‡ðí™%\úcÂé·½ˇ·ì|¡é1ÔW"*B˜0E€)rê+~žšQ.À«eã‘ %1”O»­{Wœ§ž¡œÎ½Cû”R$ l0®T»H hКH¤å’Ø ¸ÚjNŸEW\Ì´Ä K‰8*¦E.sGnÓVZÐÑ¥TCY§BÞ%˜c]ª uÐ6F-’fzá}‚B€Ø€Ro&_-3ªÝ·-c[)‰ž3Ð×ZoÎFa…|wy–p|Q¬g M“„`fŒ”ä* VÔ«C®Áw6~Ìs?Ç^fU¨ç{§…}º>É6ÖLý…¼ÿ¢'w4ž†#RA{,\»*vUÜY…Œ3!.ôd'ذʱñ`¥Süz…¬›24ŽV,èi˜@^ÎTËÍȈ£PÊË/XVok‰=vÞf³ð2.å篬KH÷ÊÁ¹Op¤UFˆ=vlÖÝÐ÷œ¾}š .•™u2¤"…‚‰ÒЬÝl‡¤F¬Àê®Û šwžý¬w-ŽèéU¹!MŠŽÂh>¸á²ØéTIžÃ4Äfoªô«ÞW“¨9ÚBM®eïZù Ü¡­¼ëã7ž`‹6z|xʸ-º¤oŸƒw8ÂhñoÏÿ¦¢ì©‘ŠüGð 9Ã9‘ÝóðÇëÌÇK?ÁíÅÅ´¤M,~âùó¶È1n‹ó×ãš [àœò¬gù“Kû ½ÀÂ>÷c·ËlAh†—‡;ÏÒHÉ]–w0 üêÈÔ4¶ "ÁG¢Š?×kôT6ã4¸³» §!*ïg•ìÈ/vrö¶ÛR¨lûð†ç÷ë7 Jx‰n‰L¹Éü)8Œlø1ÓæÂ" J.<_ĿԺ˜’Ì\i'Žq%áF8ÇÁ1çžt“ã²êJªˆT÷´ØÌ¹J4Û² „$ÚV(Ï™†cypM¾p"ŠtdF ËP‹cl9ÒX¢ @V\G‘¥ÇàlÊwH'¢Ö¬¶º€‚Û¸@„‰&BˆššóŒ{? žŽ yQðƒØ¤Ä ŽÆ A6’–êplüéøÇ•ŸHœÑƒ@‘ÌúáÉ8.Eê”éD o{x™þMn¾o]ˆZ@ÐAtd qcE”3£»€17¹86S˵TU8# M&Q0 D#Ui$‡cD"Í@…tr±Ö†0£MXÆfCf¨!4 =·záu¼Ùp ‚$J‘IH OŒN®èãåúœØ9ï—³ÏîHµäN¨Ö01Q.7.„€Éd$Ææ”ª€ÐƒIÅX6§¶ehl€2(R:¦ˆy”Ÿ›IR¿Ò_oñò)ŠŠi‰¨! +§5ÑBHm4·ÁÊ’h&“@¼ À†ºFGlÌunÛöâèâg[Rûƒý4vW}Ý?ùÜëï¿P+BŽçÎr+m°$v$Î:u»›Š(!¡ 4 Jö8ŒÙà ë;oÛ½¾Ð*Ž€Ab1’AgVeä²Ð=ÖÅcІYËLhÆâ’S°bÚéyï±î°£»ÊWLã57Âý×ûó»Ÿíƒ,öŽ}ψyÌW<ÖJV/¬i®‡}2†;>FãUnk®Ž1ku±ñ¶Nq©9]âf™X’Nþá9å™®Zìb»¾Öâf¼iYfÂS —w¥²*ø¤IܘÂa—à>ßÏbÎÎe Îkw~Ñó¸d±ê”䯹Îýí××Ý×úå'ÿj¥ùj‰œ‰éŸ/Û+zµ‹œ¹Ôóža¥w=µüòxí¿Ègý;ˆðá&P¬”ºg;>ç³ ¿—_Å Øñ®å­â®p>ñv 1®š¼AÝ¿»¹m–Ì´¨àb¸74:¸8Hâ¦É¼àÓ’30Œ\"„qÆÂêßÌM‰n?ßÇÎ)#kßèZ7lf³B¢+‰Ö|#ÏV¹ú&ôMº‘C î¦ép)%À¢tàŒæ`xã(žÍI\w{Xï rñ¡ØI{æ&ƒ &ýÁ& `… ´·)@¶“†çÃJÙßàö8wÈ-kk^à½ù(™ixÚ|þ©¯b.z '‚ö™XøÂ¢2bç +=PjS¿Ü]^{»àªü9fOE©–9n}O˜`mÿuð’\hÅŸd>e Ö€(.P!ÀÕçÝá¯Ã¼^h'¯ß.\èºy‡´©Ÿ­I^,ýo†aÊëc}ûúëíÍä~f?“Ä?–:Âzs°“ßêÖW¤SIH)H©ÞQÊN×ð`•¢^T¬‚Üd|,ù…n›Ïú±kÞqÓY¸«—×~·~È=SWÓc~È5W5•étÑ¡5&;0&bšQ®gööŒo_M%ƒE}¤ã3fÛ] :Yüü~ûVÎç$}ˆ1g+í¥×\½Q¤Œ†Z%"j&ŒÒÂ5 0€0Ö¨‚ˆ^VxM’LÒù¶Iz‡b®c‚U“êZD¨-B]L“&P2TD¡”õÔ5ý¶ùÜÈWý6Dã]J’81’Ÿ_àÉ]`s^^¿¢fRõÐC÷x6Þ rzÏrôK"#íå–ÙØÂ38qșѼX 5FÀ,YIÿI*áEʈ9Æ5Xâ?¶©ÿw}úhpxßù»*Eåa5Ý('15^VèUºÿôs%G¡Rb ÄŽBœ êO¿1ØQ†á¢fq£ndü&®ßÚ‹¢'ñ‹_,ɬ_= ÁöOÍ~œ=òi·Šª¯'pQ:bÍî¸FwõovV…8€b‹Z5v.ƛ箬7^*3~A;ØÜV~»¨ DÔçÒØÈFQÉäZNÂÿ3k’·!Ë'~ºß‰oX ›ÜÈB±,ŒgîN ‡H´\çð5}å¬?ewúN ª9­3@Êd7²sLOy–ð_’ŽL©£žÏ>­)&RN(Ä‚då¼/Ð@¨~ÞÚëPh›‹N«(/‘:‰µtQ‹£_¢,C·áv]°t‡ QTv%¼Eº‘.WíåÑiòŸsâ.ãÅË:ûŸÞäh‹*.=ª·D{k*ÅrÇiÝÃãËïD-î>bMïQ•WQG¾è1º+Æb?u¬uæ]b5ìŽ1µà>~Ã4«\–\ã•u¤·ö,Eƒ—yÇ ·õÕœÁÄd¡ñ¤ÍÕa¡º$ •Y^fj£‡…‚{p ãC/œ8à]Q¬«¶0™‡\çx•ç]|Çv$T„ê°àMT϶J¤O³\±+TXB},á Ê–Ì@—R(·‰êrýÚúzþ+’ ÊóÕ|´T'-3z\êüþø?¾ÃöÖõW°>OÂQ’ arêc€@©w’ðB8J» TŒ|î£S]šŠaG+ì¶Ú 5{˜¯•_vS¤,«÷"+Õ\lyž­MßüˆgYËb… +½­5æô*+C<{@Š0àÊÙü¹éî¯,ÎØ¥ÏΑ}a}Ôº±êÙUÈÂÄT hÇ6ªƒm § 3#•¡\pKÚ±³æzßÈ+Ý/X?«¬byFvR‘m/¯Þϯÿ‚Ôèߘ³OŒALænErÎ÷.& |y¿*G¸å€vU‡Ï™ÞyÈs½ÎvÔ”G™ôú²ý⨦Q;á Þ›ü‘ìµþ7ÎWÏ[þQ—¸ò¢°)s¾§ž[OÝ.—‡¨do)ØÌî¡K?MŽxE @øâ™̧Õí|^Q4ƘÅÚÀsááÅÑ]ö"3xQ°¬…pø^ÀÕU@%W€æê~á*3?•Ùí¾ú¼–vŽ99_+܆T…MášÔ7†U2JÞ!ßè6›Êu‰Ýœ )»$+´PL€¡\o 8&=I«·É#l<½›Ï‹!­Ycë%›qFÚ_³o°¦™BñOÝÜ}ã×Eˇ~ ÷²1A'yÀ§MÊs5A³àJ&¯Ò¯FeZÕCp®ŸÂ G­^°”’Èø¥QËø®õq{§—­i­JEJwy›Ð`ÿݤ7 kn AW¬ñ¦Ýðs*Ë7²Yòœ°{oÎ#ž¿‘–¹ƒJ_µ®À¤e,—bY $r¿D^뇿»n|öÈ÷º¼tX°Û¨…˜.QS?˜ÛNýåOŸeë|,UZãé=Ñ;‡ú—UÄêM@HoDà‰NãB…Û :h«È§Î&Ú£Û»}ÉËëe–E¸ÓJŠA*s:'|h\Ä+ÎCG¨Kq6†Ö^Ί¬k¿tãzª^iös?õh‹jÆÆrŸHCâ BFùs¸dZÔ†v·¹Ìãn­5Ì~tÞúPOS9,jEßFLµéW‚OÆÈ½‚Z@Ù Ó©§Ê¿MHꉴ­~•8Z·5-Ð{WÓt9·•1¯¹=SÒ LA¡²22dùDýléS÷ÆâÍ3LJŸ¤°ç°©\¯Nøä$ºq/Ùš…­hé ÚÅ‹åÔt.D—ùžÚ}Ë^ä­‹v%Ö³ÀÑó½ìu)ÝLgº§¬#¸oÛ¥BçëxºßÁþFö ùÇ«}HžÂ/OÏ+ôŽº¤ÑÈ B´õÖ¡µ‚+;†¯lø˜ï±ú]øÓbtºÝjßþèhŸ:Ÿ½ËêÅ*)¢ò¶•X…•D µ hâqVz¯W©·WþL§d([¯_}àUÌ;žÝ÷6?Ý0ËZ½šõš)¢VŠ]ñÚî½àØñœ»œ¼Gu”r‡yË Ž-ú©óÌvÎ×ËÄJëJŒà!¸ßíóôû|v!N_ÌÛOþôÏ7ßÏ>wþá‘‚8â¢ßϘÃîûɃñÇ—ªB?ì‰ñ+·{ÄáéXR9ùÑðåÖµ‡³KGí¼~ÉÜË]—ï2èö;v(a†óÄ Þ«ÏG¶¶éEøøª$19ŽBr!KûÉwÐI­/Iäø7ÕE¸¬ô‰ËÔÖÑ>~Û;N‡Ö= lñp‚·ÆøJ϶TM¯sêB"¹“|ÖÀªßVËò%Eሑa e±Zš¬Â¸2©ÇÈ1øY5Ž%኶?1&@R¡#|µ¥Î†8„L‚¸RbGw2Q±ö(ô¸@£Z×xE‚½’0OÛ,ÆUw1|_½Ÿ¼3rÏ×õLƒZÌ$…1iÂ_,FÍF·Ä—uѵ¦1ÃI5åZŸ[™Ÿˆ†K]òGMZŠ€ J1€(d´Žü+, |A¦3:»µê†¦ÁH…° %; ÁŽR]Ó$ãä’;ˆ¦¦*V$C'³¯Ž74•d}RPÙ¬œA#޲(ˆXÌ€žS+šeB!£žÙš³œìY­;Q}ïƒ<÷ôˆ!Á^6‡ûßÕ oD0™XЄÌ@˜ÒœŒ¬ò›µÈ(0 /èPy‚Q©Úäâ˼5ïßnšE˲6«>§T€Ò °6…‚DŽÃBˆn{ ³ÁE# Aˆø+…‹ÿ«ë#ÝòÔ÷e,ä;†·X‹e‡¯ùô¼=–Óp쇨©( B%Û hN§-O£Õ¤ ºäÇœï7>opë;:7©:J—ý^ÇÈáW{E)0„fÀH6$„n¥0i:ŒÀWÈ%ê¤éÙ eœÀ0"ÄgnŽ©F0@»»ØêmÆNõ"CùùõòçýÞ½vÆfkR÷é.V³e{ “×$:É4cÄóçdÀ UþÖ7M(ß[s–&LÇ…ÕŒ+Ú1ü&¯éxGíá/Ö‰ÚN¾{ŽÕ\{:¿®ìú€ª [ÙÎRîßá÷Õr딯ö)„(¶©­ÅÅã»)GÆÀç°÷˜ýüýãÞ¯ëeù¦Ø™gh`¬‡²$Íî[9¦K&ðXkJ•a H ÙžÔ5(MZáÂÚÏ¥êW®ýïãµ³¦åO§YôÜYc+ŽXžóŒº+|8ö 2Z[ñÅäÝ~§è×–Ã¥=ñ¤C9ƒ_ã Þº|l>p/ÞLÌ_UÙð˜ˆv- ƒUíó ™FfϹ¾2e×i×Þõêçk–pÕÕñóâWUÙýúñùù§sþûÿø‚/é¿Ì®°D¡ðÀH º(¢´ðâôk?³y[OiÉï+}ÿâüL÷wÞó»\Ÿòõ¥Þ~ßèD«q|e k/÷C\¦§ùC!€é·ù[@ PÅÈPºMYõ²bWÇÖ• ‹°T¨›^åûùÊkûñWr®ç½ÊñÓ~ß×CŽÎòôhV’}-ŸªIЩ0Gi}ÅÔ-Òdéj©!À Àzz¿·ÎþÓCkú Ëçc\Wò«—ÙâÙ…PZû{¾wìô³½}{›kÿæígF¥Z 4h Á;Ë2L\ E*DbYœ©uª?»PŠl*ÂittŠcs›©•Ð\" j7 r±-  6´,0ùDê#nQs²M ”À<ü€alÎouiœ/Sš)´’Îlœ®6阼`ÇØ[@ÕHD{ˆxGHˆ4Cǘ­ùNì1u.~ ©%Õ¢ü69ç+ºÚßö´_¡•XÑÛÄ»`ê0nÄ‹KzÆ_ß±#Ò2ýkÜ£ýZ»ÊÚoÅŒI´‹ÓÒ±ÉÚ ¢ÛDÜá/üüîÞSPƒ¦y`µ?¹ÿ/ G³5TÝõu,<}ß!kZ ôÍÔc¨oh}ƒ»7%†Bw(`(˜¡Ï „ ;ᆠM¦œ¢R"h™¯õlNÞ¦ âp¯¢)àGoMß´i;ô ×Ã9èLoj5ešÅ¨€‚mÍX7ËœñÕ(†RçäDçÆ#„‰ðeØ;õ¾^³í FÜÄAø˜ðC*(FBž¥E­š˜Ùû˜ö}`ÅWùËÖS»Rm 댡÷¡íGìI¶ÈcԲÀcb°Aš:Ú1²Û§3XiKï×Â1±×žãÔR'‚ØäʺԜà(TÄ#Aµ@ûc¾°ò’¦)„–‡(èQ§ÎØ‚vNög+4|…áaú<µ|‰N7Ò¤œó, 뮪JsûZ î‚oR@Àì  ŽË !f4ʵUÉ£g§ÞÕ;>oäRdLÛ`„n,Àóŵ¼‚ж×–¥1``­íàÇ"Ûö ¡Š§a ¢‚†$p,7ߦ¦Ÿ¾Z?rÞòÈ¡_©¼æžž(í™–„¥¶0ì]b¨Û£GÁÄp¦©"SGgלaRÛCÖR ®5L‹–é—L¶ü†ƒÞÞ™ûƒ×œÅÒùÐa,ìä tÜ'“˜‡ÙÛÃtX*])È[¬øìm™šWì"ºnµÇýk³s€Í´„Bd¯T}1ÎtüžP7¢ùŠóƒI† wVî’+51消Ž4¨L+—ó.¾6)€HŒC¹v1¦¥ Šô„9I}â)A@Ú!:TêDc¡/½" ŽÂ-ÏöÛàu1mQÑû™¯v“GµˆZ–€GXLQÏiUÁ&ݪ@ÂÊЄ–³Ã<»:`7WÅWÁvªc¤b,VWMW=ª|ý¹Nê*nÎô¢9iO\xÓmh¶”»×[¿ t»eZŽ(ûaœS£ Ýl6¶áã²BZ3jƒ¥‘K_ï€õüº¶|ˆëý€¬o^‘º^+ñ'ÇÝþ’×ßãºï O¬Y¤Þpï±ÅRºÎ´'K‚0âl\¬ê-­0[ÏȬ ޏéZZµ)ªK%‚D€`HQn ΚaülͰ²!UÅÀSÆtäêÀJƒ€ ž8ÈΓÝóæý¹Ó¶œâà GâŠðÀ¾ðýª|Ê|ùz$Ä!°®ÊÕ{x/~<AŽ¢P°Œ%_oÆCǕϛèÊõE„S–z¾L’ëQáÌÂrdKr óÞÏ«{ÝýqÀ·òâ4ïc=½ÿ#ì<k"¡ºE4U³¼×¢ñ7äó‚1*eDÁìŲ­½Îæ&†½sö3¿oûß3÷—³%K¦Æ[£¥Ñ}†8Õ¿³‹¬MÕ<º…ŸUÌgätªš+б x“‚ÚbÏRsLeŸÈ•D¸ˆb[÷oý£«T4¶¬ÕYZ(u­&Rq)L F„hUïøWÿ˽æ¯ïX¾Å»ù»Í¦Š× ¦È:C…ž)ÎÇøAuFä ¬.?q/8sgT9ZƒS±†¶jåãE5u¿¤æ×‹½œ'‡y~UÒ\,ºxº;‘JŸ;d7¿-¯Ìóqzú¹Ÿ²Ë'¿oÏ{øé™H‰¤ `Ú ,ÀA ãˆF0Àg›jƒ»ƒýºþü[ÔiÕ÷#Ä‚¥ÐmÙŠvi(]³mûkµTâDuLÚí’í€ÙòÉšhw3ÐÀbE“N£ÛˆÙtS4¯}¾‚=¦ÛÉÆX5Kì X‰”©K¨†žæö<ñË_·\Ž"ËÄXÝØù›û$¾k{Ü;krVJ³%ÁС‘QH`|8½V©3Ý‹ÙJ¬]­ÞÁ}¶î2_9ɲ0`7í; ¬AL»¶mМp˜%ûåžÙÍr]À*° R‚”sj‹=´JIOܸrhÓýZà±oóÞ/ŽÏâ?ÒGÀç÷Œòàã1õ¶_ûn¯O„ª#µébƒ0&\yhʳJ7ä­ -WB긭²v;4\Mê\s‹:mŽõXçéN¾ õ¸ÐV÷-y®§êc±xÆð’Ø U=ÄžÚû/@þp}C0›çÍü]ô*î½¬Ñ .:ð®¤ãé<*•’VFªÃ„þBw «N,jÏÏÖo^\šÝH¯†³•ÿï„îô .d‹—,Ï"š\–6Êu…‘1¯»«9ɸëE+gz¼ÿ.ðƒ ·(c0PDUä弆&J^âqñ·K;zÝ]3¾N<“Ÿïœ8•{ü\aF´C-8Ëñ¤Þ\{–‚…C׸ 2ƒPªK÷äýv˜é1õf†4–í"Ÿìdßjš;h¶#é1€«X&R˜èZ@oé‡;G”ê®¶1? ­"<:|,övã©êÙͺ»Ý>ÖâóËü–³òÐàÀPkY •â3oN÷]gè“/nþtëôQÿìpûÙþò§ŒÞ‹:Wø¹Ê>tÒˆž.~ø©Ž2$*uÔ>‡1àê}ë½ðQÅ®„ihf¿ìeþŸî|»­ì´œLÅ÷á½oµ’½÷R:™Ð·qz#9›x~KA9_|÷Œö`×-À2Ïííßê÷W¾ÄÝ'*¬±OŸwœ ËâVk›ùÂàÄFD'xd6U­Éô®µ1ùß‹;¥ ° ×ÃÇ¡­*ÉzÈÍx.î(:ø§Òu)ñá&Œ«Æõºž¹s gäãcz=·/Ž]vq•×HËÆÈ64æÜDäÖØî°u÷ý³zÉžg>ïÉ{õ#ëܘAM¤`ÇÌ™~©wF’ÂÖέxcE[êÝË)çµü - z XìŠ((˜ª-ÝD{¤4÷6æ g€…3à{Æ7aâg«ì0"Ä&˜ÎŒ2Ÿþý”fE7X)í,æ„Õ¡4ÓÄŠb#Lv Œ  DT!-PÑcx‚IK–Y{ÙBS`SFM Å ¡¢$‚bÂ|’ùOæcñ°×€‚²(PLT0]™ Éè°I&kg§%"Æ(=`„v¤$L¢@1¤qbdEGHtŽérͺ¹f:—ª.ÒÂ$‹„PÈy pô÷Ãbˆ¨;‘ÁfY“0Pä%²U술1@A¡¤Rµá½<*:䣇¢¬žg•l5 /I ©M-Ji0 )A ’´T!6ÛЀ ø}¶÷Ó¹ŸÆ¿~¼÷Ñk±+6Zz®Jž)lI–0(½Æò×Û2·œo¨áÅ·ˆÛ³àä¿ìñÄi‰üJãŠH2zµG.g®×rwÿó—+¯÷°~z׿ïÛÛ}TéDÀ„@ Ûo¥ÁÎQ™‚NA¤À¢>Zd]Е'¦eG4N-GDÉÔÌN3çU»@Ø$àE¬è.®÷þx.K»Œˆ­e„FP,ŸjÇ%a%ÅÃ<^èÎQȤ'•Ê£’zö9Ó £”ÕS–g½µý¬‹3©ç5V=z´ÝMÝŸT‘¾ºkqùuõ;z¶ž/†ÏçûþNsGê#ç3±1]Üm[·&œÐIãLÚ<Ò¿/ß~xöÙôcTåz¢ÿìÝñítb7ÞÛµ~¾Òª0xEJ{Ç•Ñúµ'<½Šù¨ÁšÞãWrØ,·X«S» ÎTš8q¿÷äÍ×ï2 +œ;‹•ÞQse3Öòç¤ÆÉ¡DDØ´7©ÚÚ žMø…°8 )Ñù>al( ´¾°^³I[¸Rè5ЧD?2ÚŠ9-³ƒCÑ¿ˆœ_þ¬b¡ÒöLJ\sçþT•5¤­æ‡. _øa$fêLœ3Mr)¥ çû”»FQ¾ +ÙÑ”q @S-œÊ™ü"¼Bž+µ@­©40@‹‘V91=g•§Z2€ šæ˜'¸¿sž‚rÊDõ›‘ˆUˆO±¼EŽˆÚVüqô\½qÞBù^ÛQ}ÕµŠYWá»îôÖ¸ãØÆE'ÙÉNÚ¹ Íwòq<·)æ«®*o¿ÝÏG»J<»ó ‚Š‘ â—¡xBœð à´Ö Z_sñêé}=ÓÛnžýòuÎËã¼ÿó²uçºçZöѹýàs©T˜8Ôiù²€*ŸƒF;øØÞCÒN$hš&ÝPnË$™²p ðMy`¥šI³‡××Úëqïeó½^Ê9î:-mY W×U”e-'ÑÖN!:¢Âд¢í †öLÚô]­ ­V*‡›ædŸgûZ™?LéqGÁÏþs®wl78®ö›äv-·“¦´çW3Ïw•ô€÷Ó½Þº*"º…a@Qe!†”0b *0Jò`Šâm©+ÛªdtÙ\f$SÂqãÝJ!œ„G”:„‡I™5æÔ±KBœ² QË2õÑ•+á1àA9‡/ZØÕíPé‰^±~,]¥ZÜjžÄ  iû_ ߺj¨™¥‰8{HH7 Øœ> ÎT^ ^nL_!½Eê’\à¤x|i+N`о+Š)ÈGµûýç?ó¹ÞÞàE\šº¾}q{¤%q{XÃí–lã5AÜNék†¾žÉ•¯©µ ¢!Äù(ûÕŸü¦=”’ Âà3„çêÞhÙá´¢éiF†VRS‘; &4ÖYÖÁ Ú/ îÍõQÊol|3/¿`VZY¸á ÍdÊ Cã†SšËØ}ç¥j‘õ†÷û Löí›c|á‚Ý7 ^[F¨ÕÕ1²=‹»7çlÙu…f¡†Q•h€ö˜½_€ÞœÙÚóÛ‚Atp•ᛎǵ`“€'‹É…Êb‘E÷б ª†šìé«0æ«Vo]bN–¤c†cÖÐñ’Bf~¨1µg6åD|Zø5H±1º$³yËÈ𕱧ÀÎç«D€`XgâLıF„sp¥â¬‚ö`h.×Ð’<1;Ô‘j@;!¼ôŠj„†ñ„@ }BVªn@V›m°^Ê”XMnl÷aÏf?•|z£¾†Ù¼–îïàì í½ Í;¬ÌSnEKÓå¾$F§†6йòãŒårßP» ¼äÑ¢(Žº@8ùÊx\az¸ƒé‚ÄÅæ-7iIŠw›¯åØ·#I$äYiÑ‘Já±ÂÛ’cb¬ËyгåÙ§{ösèš„’PúF¿Q«ÖBø,W”ÖÚÑsý§ÉA¤ £yA.&?;^ƒjÆÂ¢¿Y£ €G4Œ.‘6TG€¯nßÖNüò5âWƒ¥­w–ÐË4™Œ’#ü?ÃÿhÁ¾›µ"ǰ¶¢àèxm~þy›!hã\±C,‘ã®™5$!@"†@³¥©‰„š3ãÄ$£QêD|wä úqÚ'4Aˆ¦\»|©Ðj™CÍ <ÔžÈu¸'+õU8?›+#CíLQI´’ª‡IÑbˆ#KdŠLA«³°ºÆûë±XÒwU¤ÏI¿`7Ñ|+ÿðäÓþLþƼj×~¹ïÒ^÷ÚìÀŒ+4I%¨‡¡“ÚŠ‰V{°ZHÂÁþŭÛ‚Á5—¶IHÔX”Ðèö·Ãó¨?˜ó¿¯w>­½´c{Ý8è ÕçkΨjý‚ßb RÖ¢†Êª„–,M؇ôý+ ï“gÐm?ýr7¨Ö} ³1¾ón^ñüƒÅA=¡PV¶æ.œ|“›@Di(L%Aƒ&WøšÎÍ©fMª-œ ¸øS*0 nÜ!¼äî{ÕÏzšç£üúý×·m³8«Ÿ•ƒŒA0Õ*¬…²#6E-*©t;AS<7ey•¤ªP° %ÐÔzg®4ˆh”{ãîýj(˜³*Éî·ãgúêzáõÀ}ßò°+ê÷N¶RµµÝtî=D¾½{jòæö/¿øËá»_™=øP]QJ(/¹f„æ®À ` ‹¼¡ëÙnzó›?Æéã7wêxìrÖ?g0ÓM•¾Ý¡·žQÝîÓhKo­œ3½úðLó<•·q+Ðq‹”0@e1Éš¬P¡°E¡~«§€v °  ¯’j¾ÚÆ£'‚G~UŠ(ùª*>¨ Û’5–è‚R•«bslêúê«Ì pÚü¡'[Õ /ÇG"©IŠ2‘ÃŽ_ëÏÕiôKdB ¨Eäå#'=ÆØµõÂnÿË6~ nÿ¾½]þgõ0pj†Ås—¿_ñÔ<rþ{z»Nº•…ƒŽbHF,TƒLÖMõÐÛ w¼`.ñÀ~¹@\º8׊eS6‰Š‰n”dыȴ 0è¸tPÇB1G0ºg´ßt˜2(é2:()ïØ ÏïϞʳ]Ç0Õu{cŒº4(Z r2 êÈúÓ?•ݲÚ3%†5†e»¦o3ú‰ûÓ™K4KÎ Ó1)H û®ÅŽ­)@éáÍû´k)2S¤–o‰˜e»| Ôa˜øA¿aÀ¤«@(uP€(IbL3çu§{LµÂÄã ¿,H3?¬1x¤Ò)S$§ÃL|j¹÷”½òÁ8Þ<üƒ3Ç¶àŒ¬«ãô/í­é÷·vÁ{C‘`öæC4Ô²yk¥Ä±¸c#J@¼!Jª1XœH÷KÀÔÅ~©. ›-Ó®tu€›6²½@æK­ö]wgSÊÙëÇmAoàDŸÖÓŽ:347}âÖd^‰3pSŒÖ,Sður Y.K5Oƒ"Ö/åR ˆ£tÉBx%‰ž¥tK¾¬;ËÎ:Ä9ò(c²2¶*5&öÛpØÌsoÜz<¿›ÜʶßqUl-‡‹ïÿ–`4Ïær¼³Þnc `—Å zïÝÍ7g¤ðÞdðî‹Ú/Ç  V¢98CˈXbTGœêÊÈ^QNþJŒ{gš–fí׫{…#ýS×¥E³—§·™é‚_Uh"N9Ç"”.ÏÏòþêyý—Ÿýx–7J›ŸÚù¹Ü³~J_û¡JåƒôWã¶ýëç<Ú'ý|žÀ«ãäh&†D#.Ü·ÆxTr<Çg>­Í:|¯íAç¹;¿ãÙ¹nx Š£u+F¶jG®hʽÒG榾¾,:>ùÁ%k¥í³Ãæ«k>Û¼‰ì리ÇYŽÝçšý÷„°ú€>œ[ËBýà¬ví`àƒ,ñÌ6±œ”±×î=8r×5Zà Àz“ºè‰MV÷AÃ33(Rp‚¬ Ó·Ô¥OÒi‡cüJt„N8Gã¨Ns6Ïuœc[+s*Ù³Áµ*×ñúF¯Íó£¯{XË«ç:õDÙp‰aC»þ0ïá)¤ù¶>vùÆCã÷²÷7º›ÆŒUÎdT“ˆ,4\SÏP ªt¤’ÃÌc²®¥”Ÿ=+{@Ë,Érqy™i‘@4Õ Á@Šuíe~í}#Ö=~®ö¡Á o8,›1ããíqŽOÌæ\‘§ãnP‚8Ëb`^Cz HݸvÕ_Š•žIOc3Õ*TÕ€ª‚¢¤ É$¢Cº=.õf[ÔUÀäÑòqRå^TX¨Ûê@“¡y#ÞÈm¹wV“™ A¥Nìu÷‰q(Y\‚Ñi­s…èYÂR¯“ šSô1mÈk†P.c{!J‡ƒ›t{À.6-TFifŠ’1à$YýCçÿ–ÂÄ¡ÁÄ3ŒÕC¢^[@\ÊÉ1¡%…A†à †q(bP¹*„w,4_æBý4o:Þˆ,9]+¦`Hä›ÉÄÔж®›2TÓF$¤/c!ŽäÍTb(tý¨Oaßî<¤ˆË½º/‰B¦|W2W÷ùµ¼fZÎÅÒg&/q¾¯øYIÚWÍWEéoGó¢º@}û夾;ª‡íßÜÛ•s>}¯ëo›{'´!ºõÞ~ôÝÙô&)Œ¥ "Šð ¬ßZI‡oHÌ!BÚèí¢‘r†’¤„¥(Éö:Œ‡à}Í"çõ5Ç®ÊVÙ¤0Ïê/ö<³[á=ÉJzÚq‚Câh©+¬°'Ÿ]?j^CV΄ÆcO…ëÚ0§8›×KÌfÔŒ=ŒàÈžÀÉŽ¤íV/Çg3|¨K7…MÄ@gQÞlOíÕÔó{ŸH‘BîÙ×çå_¹·tµðU°´?:§$®*Ýkè~v«BD>ÛµŸpxb%<2Òö×j·Î,'vê¾Xy¸žsh>‚84qxÀÛ-6µä‘{Õºi±5J+}{-^àÃ$yJðm„F3HÕÏ'íä¨{è!ÊÉ–0PóÒ¦ÀDô‹|å9óB½¥ÆÖA/£P´ ÒÈuQ;¬}wV1s‚SÝYmâ‰C+QëT„¦–Ç8¦O¸ša6î–ˆ<Þi¦ ²Ê-¶—7-í²© œ;W;ÞE²2!Ï› ¸›{ ÞP‘s@tÑž²¡¦F¹òK#—_œz»Â2¥p6{ ƒù@Û4DØÅ§žË>ËÔ¾8‡¨=—ñŸÃ”·¢^ŸXÎçØÒŠ”ˆx…F|@ƒ#(F¡ªtJÁ6ö„óaÿšç\sØuÓõX_=|‰¿·Íãñ@®ÿt,Û^J*Ûì>òôõÔ8AFN\ö¦´¢+´Ý1#émÛ3~’ ì‘{ÒÇ8_‘x’?·}ß¿êCMggõµï*]UÛ?Dà‹—´Ô¼©ÒÀz7g×md;°Æ´]”5Zã©gm3v^ºV;¯ßÔ> ¸?Çg#œjëºIN A燹oî ×êô£¯=•Œ1 ÊüÙÅ5H*¨$(D!À ‚LAZ'rQ¡W¡¦€Š¦…$,”aÑâú:,{ÜeHRçx^œÂZ6ˆ¨©SÇÉ<µÅOÑn0ôjn;ºÄDÓmÒö¥ Î’m,ÿ½éÝÓÛ‚VŸ/8 X™«».˜‰²Ý»Z.o?Ìe_àžûÅÕÐ)®H"RkÜâA:ÑÂËÛöx•(;p÷Ö ô$ÈÅ’D„ìßÝJ¬ë™"SÂhÂäÃ¥s÷¬“˜_T:ÀÖVÒˆfàÓ5Nw› Rh¸KAšZàÂÄG®_kTÌòÙªŽˆbQ¹ÞTß³ ÷åz¿Ø)ä.}.õgœÃVoApÐ0“¦ÁÊÉmMXpþŽCSK§Îµt^­ã‹ýÅæÇ\}»~~™?z¿–ðN[ëˆ&Ý [$JcEµ]s×ÍÐVï¯Â]ÐÀM‘YX¨âÚÒ¸{tL£¦p¾¬§Å½:]ŽÏHíežˆ(ø9Äu‘JI;à UL‘v7DwÚ0XÅrcß½É#²&¼æBß²}[+Ú+ ;Hï”JÖš*VJ³©½d2耬Jl„VΛk¡Ô –«tP¼æFuh~ÆH’&$Ã;‚‹ `—îSÚ©!ï^„ùນ¼bÑÉEWÀ:0ñ´¨Ã¯tŠ`˃•:bäiz^Myj¹ „,Û$Æã3>‘3ãé½/o»=²üNE» Rˆi Aµ¥f1‘ªè¬®áœØÑx;±7çïkl™a\èõ¨ïÈQtF"›¾N (ǃÐý:í ÂZ‚à„ E_1~­Î¥—–Å¢·lWGó Ÿ`ç5Ô±—'Ç“b¾Ø-ä%‘å¶ìßC%*¾«p¦Ý9µÞ‹=F[7ÆZ9L[mùÌ(óŽÅšèžt¡z|q±æGã²!0c®EÄsäÛëÈsW¼U¡F8uurã”ì-di'’ûY S#ÈL¼µãfjcs.I:32™5‚¸8J7¼©Èb7Ö¶B0AmŒàËq–XNVí/¡ÐsIXÑï…I) Q]Ÿ “âÊð÷5ïíÀ8ŽÔg‰R†#$#A¦—7®6~$/ŠÔîùBöŠö"Én†ØÖËÂbµq, { h”À©(¢¡LcÌ•¬ƒy‰rrõu…×í«š0|Ž#êY_þ¬œO®Õyô—gs­Òl›ß"4ô\ r½fËQ @v)—/¶aËA>UèÆŸ­–«Óáá<„€ûx䓾§â3¯ÄñOkÝÑ$ò¼“ø¦é¹ð„Û.ŽÖ›¿>¡lax™ë)¯Åé^ª,+lãꆅ®uó±=3)¶ªnê|{´Yt·±›Zþ(zù1ŽÆä£+UMåFØÆP$BZ+Êä€çSHú«ÖÞ?ëäÏ,ßvGÉ?ðáeç±±. à“óv½ë­ÖM_ƒúö´n}aæTZ3FœLE+4Üje÷l*8(jsÄ]QÖ±$è^<×`­®ÕŒ­r—évék×µü¼-'×Ñz½>:<;j®c­®ý§»^ø~Ò|pþøÍó±Ý ƒ¾’_q=I]”-Y=b\àõ„I@ت+ëhU‘z\:o€X ®º {_ï`OýõùžþÖe^οßåÜ¥®›x•y0z´•C3'gr@æƒ:kØõb÷‹FwH×rY4ÒÅ.| S2Ê*º®â/D£bà&‹W;§{î"Ž¢«³®Š.rSGTÈè©iÜGÀe*¤voþäÏÞ½ÄÒ û^¡qR5_Ã&Zm2(‘ç¬Ru·ìËÝÇ\‹ájôÒN %ÒRI“•ÕâW9cBcGÁ6»×²ó O³owS.6Ãhì"¡uïîɳ|H¶j»k®1%Ý.Þj6Ê•4 ü$:õ.HK°ª;H›H9ÒÝÒ ³ÖëhÀ@%-Ùµ|€&µe ±ØABE‚ß*´"åadÉ|ú1¿¨ÅŠÊŠí¹62—’à5è4;3×άÓyrÒpÛ\ž°=n“./M±/KÕ±·6{½¤¥ž[‹B¤QB·x³7mBL ×úˆûë3dgë(ý*í]MÕ‡U!Îí¨„¸Nú¼}$t¤«‡¸Ìo¤t¡´¨ò!ÆMÆ`ȧ]ä67J)1e‹Y^ÌŒnBKУØw7z ẫ) ngÊ) Té?9Ÿžxhæ¨G+é9o[!@ùÔR¿™‚Ú#…Ÿ™=ôÀ4â~Ÿí½¢úû÷ãOñïnJü…Ç¥ºÇå´ãÇ:ÙnͱdÁvÚæX¢½ä»{ Ï¥¹ XA* {±û¼VVÜsþ Ë]úí’î>ôl¾ÚÑö4àebÈXÒ@†‰‡¤aЂ´N Q¬(nf˜b €e*òñ¦]ÑL ¨'ôÇ~\«ü¶¿Þò]fíÏ&Jö:ík*·…‘ä ŠlP‹þ®òqÞ®ÝtŸ#¿S,fŸœ­vjn‰0l“8lôYkÛ'©%…ƒ.ÄSB /_›ñýñW'bÚoM½bT?¶sÚë#å¢qɲuÈ€ˆøè)à¾ëwÕºÓW]U«tÊ~Žöz|–àaÅç5ºFQ°„Å®¯VY l.gY×Õl_ÿ¹óñ¼ãÒ?úâçã­cõh»z·4P ¼b\¬£;|C ÆÔx¯t‹¬Àm*“9œ‘IK|Šÿ„qOå5÷¿W0b /Íݧ¹V|½&ÁBRcûȈ2ËÂwŒlÜQyx1º«ùPDKW*ª3êL~b›sð‰;Ópñd1ù~Žú¼¡þX½m™ñ$KØ«\÷¤¾eË­§Rc ñ2ÈIÛèƒ.Ún}6ÉÙÅ!Çォ\Þ² ŠÈ^‰âzvºŽÅ5ì’;ôCš@Ê1“8xSü¶æsæÅŒTØ\k0þ=ñ ^šhV>ù¢õî7q<šw×`Ußzùƒ“]ÁyyùèTnY››Û"‚]BBÚç¿™C„Mò¾³]—\פò/ϰ³?¾L®¢#Øeªžñx1.x™Dg÷9÷îI÷qÄšû„¾Û~wFe¸‚žªu¨£0‚ "@ŠˆÓ¸Ã>¾‚§%×Þèuoo Z ÉŽxfË¥ø]ư'ä–Ü»}å»î8¶ˆ,r ″S(*iÚ³2.÷1Y泬(TM› ÂÈ5€FSÓ&€ $y £h pÕ<'æI½Ê{äøq‘­}ºÓÍ©|þµt.n&õ­ÆÕb­uh\I…IÎxѳjƒž¿¹b6Ì©i{º_½ã@àê:~ìr@È ’Éy©Éo#ÂÇ®»ÿïjSg/H*F?VH³BGöÉyøÍ A¬ïÝbе€ žšŠºâ ù“蟫Áq²T1Kÿ X>†ÌX/¹æ›ÿWðG8*š‘N>œ¬ßýeò|ïœo…Ž5«&÷§xß,ÑCi–l꩚•Q4ú© CIîØ-¬ ¦†ód›ÒG¼;é2:ÕΨYîíå4eÂëÉž^Uí?Otõž{õI¾ñ¦)˜–òê=Ó/÷å± lŠüÕRùE·?'ï—ê'<>21§3y\êKoùÃàÚ¬žØé¹ìøÎ[ $¯@A ¡¥†t”¨¤¼ZŒÌ»Tj-Ä‹ûÜ/Ø„ ¥Ð1ÚœÈ>PHŒ|P£ûóùTÝ îIhe”ü¢îë<Ë"¬ ZÞÜŽ x­^¢Ô‚$‹Œ4[:…êòrh࢛¶Vn'{|OElÙûBâš®¿zß–ç­X+™¥»‡]1ÆìÅŽ¼–ÂÖÈDÏœà®Á^¶°3diÐ¥ÏøCH#¶ivYÄOò}(L‘¨£ Ä‹Rj¯h|zÛáÃLŸò’”¾…E¶ vÕA ì q%óu߸»_¾ cÀ{4ŠH§æ‚œÍ ÓÜ©Ûa¡ô¬¸¿¬ ²š³kU,$šŽäpÈj5Õ=ÍIìø]’w=#q†›Áõˆ„*o¡åA‰CZR©½ ¨HXTXHH3âmœ–4”«Õ9ÙÄ€ šE¥Ð#sò*²£BÄÛ š6'ªQL©h±2Ѥq¬éÔSô)-½³ÞÏóÛ׋›•×hHtÌa%PL<™¥ÂܦlŒ! ê…C°’Ù*‰¢ìêÕ›]ÎîÌšŠ)ÃʦRÜ\lÇÀ3µß³g”®Ëïçßù$é'£\òHÜ47ôÐG]ÿ‹|ŸzeŠ÷3A—¸p8’0fÜ U.:ö«N² 9F£œ>,åk–gê‘?ïYòÜ2¹“\M¹ýEVBKJìÓ(!A‹zRQÚ“=9yÄsÙ4Ël»Tԧʇ©á=c*¥1Ç!6‘•°¤ï/µñ©×È} a?fŒ€* ñ•‹’rmÝj ô’^ÌÎ<|Í˜Ø ˜®œá^ðM(‡P„jŽ'[a\ÖXÐøe¼: þ½™‹¸#4¸¤…¼’qij „«[’(@†ÚÊR]©çÔ’ÜÚß*æÖg%XŠT>F•.ð, Ï}Ý¿“ 2§ö–2rÌ<]µ/Úˆ \A´ IJ]2[fJI¥–5ŽvbÐ8hÁŸ\¼.ªëàI2O¥Žré3ëL(…7„ÅpÙ2ní^Ê=ôï¼øÊÜË<\uœ¦Éøþ.%¹Ÿ-&é#²p¼ÇE>*bux{Ü^ê«X,ó[e2ûlßdü¿ó‹ó:e±*»·È3Œçº¯× µÅxÅ`½ úyîÙÆO£¾‡wÅx)â  6Àé)ôÊaØ žXƒ­ 4¸Ž¥¬Õvz9ŸjA9Õj±µh«‚ÐÆŒ¦uY`¼þòÕ–t}ùnû­é?F™jþH<¥eec+ôUxåœÈ]Õ5-±Èã÷²*±½‚kÛ¾¨+Ëcª}1í’ŠQ¬|͵je,rkóUçëQzËŽ9ÖJ7YK”EæÙ? ŠTšuìåâ<7!‚I›ßG—•3-;Îíç°%jךÖ)ÞŸ»ãÙoqàVšàÀA̰ÊÅ)J¡ÅùÍÚ‚'˜øès˸>=›†m3;9ü¯ë©°†ÕN?ò0#Ÿ!Aõ›Ï÷¿ÜÛ‚ ñ< =o2vœC1þ/w S¢øGb£@˜Ñ‰¹Š÷‚M÷uÙ[úSApS¼Ü4uýõ}笈 ¼"p4Öš¨ÜëË^Ô”0Ye«wÃ/UöŠ c4«? Ý#-„/’+-݉gIÔ1ÅEyQ3¬ÓÜJAÛò'û‰ÃÅλkÌ•Ýèé·Sè~Y/î{Ç~&„“YgÜ-¦©ÛdÃ,ËÚ qj¨37†ë§NôÀbxP1† KÐ&¬QõFfrèÝnm¢¡= %ظBXZÄh¥( º¬¤u˜¡a‰óNYG{‡=CfÜh‘Vºöi´Šñ¨?zýÇÁæ¹Ïë]F­¸Iž„Œœæˆø4¦kþG|ˆ"ÜË/ÐýôÐA¬BTmxû¢S©;?õ}é×?òçê "@Œ·ÍMOWóüús»S¶·\b0pD¶Ü!k{Ðz1ü"‹ÿ(  TwŠ(H3¡c¾DÛåÅ13Ø|ñ=ù±k4 ƒÁjm}˜-è›RÜ$T ,îuwxÒíÖÝY@QQûd¬¼© ^¯<”‡˜Ó f1ð˜BÆØónº=µêÔ 7D± EjÊNx·Ö$[ŠP\ï€:™tÙ-¨”#|RùÛ=nCúªµ)·Á€ƒ\Õ¸"ºóòìE}´U•Á3Ž*“Ïûé|ùžõ ~_ŽšS`+`3±'" ,3 è‚lÛÈ· _Duàx k$ÿPaΞ¶qéH«‚;NÈd…°Qn K 6:‰u¾íúÉgßJ^82ÂJÊåVŒŒ‚¸¥ " YAÅ?ÀgÅ©ÿ®zDLÐ$$ˆøx66’ñ,|ò|½Â×úýÂEå-ÈšìZ0ÁÕ©Ú¡Ÿhwp÷!4êâYË* äT£NZ}ѾZôö©~Y_zÍÒ|ò׿统ýlÞÿ5{º¯Ýw‰·&ŸQÿ6GMˆ™´Ý]›œ/º†H©8à-cö*E <$Ìjǵ[Ì÷ˆ›oÈIqÆÎª²4ÐGž>4õùq5ÈhÍ´úÂA÷ 94þbŽw}k†VIÐŒ/L2M­KÛµãŸO×CJt¤éŠDö-ŒÓµ^n7¶ðRT¢f­±ä4”½*RÉæ»P¬?M¡:Þ°—àÓÙï´C'Fi‰rWè!)cå!·wk¢‘$~´“@{ƒë3æ¹´¹­<ÖÖÔ•ïŽþiç²™Ùv6¨(oœ8óCP>ÌÛ`šÍ—çÕÊ×’µ>¿#®rÃÜÝQ×aÅ üU?¾¢öõõÚú¤kÄ ‡Ë/v›5Ã[À‚€VD–Àh†SÇÑHF'b´óŽý‘x?~··5ne‚â D¦2 aA FxE Ï(#ª›LFát_í>–ÛÜuÆH4…UhA.š©YÒU™öÜ8Jê«PÔ¬ P-(ÊZgu#¤$6ŒÍyW²+\f䪴”Bð'PG1ÃE¢ Rá¦Ö ¥Pw1>ºóv°—>•¤«³—2Þæ¬”J;r¯!F7²ÌKLUbLGœL1¡ #ç§?€Ø˜ô½@¿$"˜°È’‰€:’NŸìõxƒA«$b“Ùý/¸íŒéÑ9!¦ä\. }„P)ÿƒŒ ¹lÀFDFAg*e € aŸ ³<!â AMa½ý“Xã†+BÍDÕ*ÎñS 0žz“W…C§Ðû–Ûž(¡©0SŠ%$òÓäÄ&ÿú²Ïpò6š>ÙOgÎóƒƒa]ÝY,‡´Ûý:Ïñ­øÞ}“Ïí³ç¬žò§¤×Y»ÅÝÐë»úŸ3­/SÈäËsì<ûxmtMÛ!«ùø!Óî1$«ðJw¬6`k«~µºãÃ<þïOr' O—¾¿$î¿Îëõ½/^¢U€“¥ p6å¹¶ú G¦H¤1 Rİ9ÙÜÀ5¯?®¿²c¸[K"B&`ÉÊé7õÛ …Z’pv{øãó¹?Âþˆ;åÚ®ÊvÐ9¶Rî>ÄQ3LÅsÀ,Çwt”á=Cj¨jbqÄ+Fü¥¸ã•c<_Ϫ^_Øç‰ûñ¦v‚û‚Îm™ð¼®b‹j•*Bï†Ü±ò¹FâÞ ðÊ¡_öù­EÛOìgãû¯yèbÆÖe&HÈnYpÌ­—³Ÿiw¦ëj!Ú¾iqé©5@A»ÔˆZdÁÝê°ÂeàsàÀ$¥K+¨Ù|å¥åÛöflö~y¢cvüv¨jÑ!ã2„/Fò’DÀÄß_#ƒ$i. ›@“N¸†wC¢:öË;ã›»ÃSß@]È!)çl«¶cÆ[RÂâLÁvè`«‰J™úGv)kßÔùKØ'ˆ[ÁÔa„åõUGÒ¾B•!Ø×ÎÁ©“fÖ.•Y‡4MCT'BdÜÕnðÀ_VÊaJ­X ¹ÏY{~xM¾åDRÅâEr •“=|û(zÈÖ>²4¯lúáþn]¹p÷ HJéá:lGôàÛ›×ÛuOs¿,{½™NÚÅéOžÇ±]ßÈo'fý)q Ì!~fã·8"Ä€æÀ@E B-c™ ëuÒã½»Öéprz½v®1ë¨ÍUE«ÒïÄj°cw "ª’ª%ÇR¬±è•¬>è)b PL?6“XxH0;G9‹nŠÐ€Ô§Á:ŠI~ߊÔLÅÁUX³Z11TkµöÄd¾”feFQ•+åP_^ÊAí?rNq}h4“O›Kß@—ss§Œ¸ÔÛé>Îxk¼ç›mû&Õ¬1µb$DHi@!¼$5…ýS,ꮢÊáVœÓív¤AÊQÊ¦Ø ¢V5 ¯zûˆ‡|"͘’L“u?  ï‘(5­f–=œ0=~Ü0Áµ9LFo»a;ò”6ž%6ÚÒª¯/¾ºüHwÐ-ÊR4_Ü}Î Í"59¤PEa¦mñnpÚX§KÁ>á;éïK!WXdœ›ˆºÅŠ‹2v,P0ÆLL½FCão禔¢ƒ«&æ:äñ3%¶“ô`Ea €-/4‹ ”‰…KAÍÈA•"‘²ó™nü!ŸUîÍz}½ö{Î]ö>¦=#Ar† ݰHår[Ðͅ䔫>l³–¤Û¤³'é8\Tx°Nð54ÃÆNAhP²½O@Ÿ§Û·R©@³ãä*äŒT¸&ìÐ3Ì3oe×Q›Xtйª ÿ)üDÇþ1VÈÁ‘ýòÚóuûÙõxmÆ€]^×O毿nsåCUT.Ò 5ï6 b7„ ¡° »7|(Nã4%ðù¼¼”«ûÛ$Ó„APíQ3Q«U´tU&+ í03ÿÖDßÑÜïÒ¸o–¿µ1û둈m î¡ÜA¤ BÃÄø""+“’äØ:×"h\c˜—‘M‡à 0ÝóÏÅU:Ù[fU[T1ŸâW±/G8Ì b…Z¡#´k^X.¶7Ó•¬pºë HÄ0¦)Á°œðRRmÅÞ²‘°ÃtRzg/¼núØÍþ„ÑK/F[[!/.6fÛHQIK F¥°É‘cf¨d,ÇFßÁëÐCèòÔ±‚¡–÷eñS¬¦“kõ~ôƒð’Zùä}Öm)Êx·±±{Þ/ý½6OÏÑ-\¤†f¸È³´ÝH—+,n¶IxµÊkëñÆr£"˜â|ƒ~çxœª5ï-±4Ø`0¡मLb/ÞÆ‰}ÜX{ãý5ÎwÐ}êпûÿŸUšD²‚€ˆ¥®uxIkîo““÷êDú§¿Þ/‹ÌÒ‹ˆ ßã™á`·=SR+¦¦µ‚l• ¡T”·6° ÀÊU(4,›÷cYÐküMÅÿ» ÿ9ò­*Ù¼8_ÇŸÇÇ›hã-öd_„ažÏ9ßæ¢š‘EN~amté¼NÀZÖÅÇQwq§CKèä8)ÅzsÁ“*ñÿ×JË,ŽJ˜#n?M:Õq”·¹¢™–ÆËðHœ×-t³´AL@µxAe¨å–Ä'q½ èERLLД‰.>Çp”[k<°`ÑKƒ3ü4wSx¹}‘þÔOîÎýu.WEßh}„*òü*"–:wÑ«¿Äùi,°gEãË{?·g²î’¼óòáFæ=³¿ñµ°\x¬ÿ“>úzÆ÷æ½1}›’·í»æN}Üœ³ô„¬2YcáîY¶Îv`vQßñ7á÷Þáe4‡~ :ÈdUëÊF |Ë|Éyt& jÂv¤á_“kÚ… ¤M¿)ë$(ƒ7ˆé«FÉ Œ,5NŽÀlb]¦×ø²÷O·Ç6 Ìåõýç_žs–%‡¤ºgUnœÅЄ(–ѦAZP|wü®H¶D)Àn Yb54¨`ú:}Å'³S˜2ÓòF€ ªºmwº¢š7wA%J˜b;ècöŠ,¥ÐÐM¿Ë’MJKá" ’Ó€w9Ôˆüܸï¢Ï’méÍ0_™•Ç7àÃtcºd°|îÔ\¸åiÓ†è;Û6°¬ è Qr;ö•.°rzò)á ÝÆäqwBõ®D ¿áü1 QsSv7ïÌÊaÓGèÅxjÝýnþ7s}Ò½ÏÄ+wMdSå GPiZùX°[¼AìïÜß«)µ¡#*4‘³6N\u(‰¨g$ãÖ6C¢‡¸‹¤l£üÏKs-ûê/œ¾^õ÷½Eùé"kãV7·%1ÖQiZ£ór¨·ƒŸFd?‹]@ˆ-KYW*[G)yÐAa±ç§ð›„èjH¬LÆ–`˜[§Ç+EíÞtÜøA£×ÜrA$KR·<…JØÄ‰Äˆž©³j0"#€QO$Ã0“u®è\ü8),>-½”×KÍ‘(Ѷ «HiãòÙ…oÄ¿W‘õ23ìõÚŠ!NÌ^ËÁd1ˆ¸&JFmˆ•£ €ŠžCœÓÝRå“V‰U\SÍëõÞ/ôˆÓÒÔ\1vKýLžš§t›íÔgTòôêYùéëç)ΈœËu|iM΄“|óÁò¦yÓäÝ»“«\âø;ÝK×ÅÉN§ù;‡$Ì_±«Ì‡Í{„¸!Wmì—"q©ûZ?Ë9 µnUT@ôíÝ…Wšçe8 oãm;qÑ{úœ‡…˓߉Þ,çpR4r‹"–BÆÄ˜ŒNL)š9“+ŽŸ ×Oö>ÃE« ZT!.äÂÇ\• Ï§Sp{@ËTŠ»ýêuŽO¢àÙýñ}yHÌÖZ˜S¢ŒA¡”:SDÜ%±æÕ*©†¶ îB+ÈýéÀ7 ÿtuÞM `œ¸…BÌçê%;"÷u}3ó¢þ¹4‡î+ðΓZ…z6Ò0ciߤÝ]w­À}YÏÌÏù²•å´Ù—¶üUÔlƒ…Êd‘ñ¨82¢[ÜPºBñ*EcÓd¦‹5Ùõ臶ÿO¡]r~XÔA3l„êhGiM ˆ Á€j U4! {梽9ÛVˆ;D­ æ°0‰2è&{FOÂåê"ºçÒƒ¨•õBÓ µH¼D`úžÞFË Šd‹”… 5`퇢XC´ˆ1¡­Jœˆ† Õ"ê*«À”ª³ÐLÌñõŒÝ)Œ@" ô™|„ׇÜNQŒ2i„„î¨ ˜\T”dF“tž#tª¤‹Òv$¤îÝ;ÿƒ®„'¡‹sÒP3ŒÍxA.iÁ„EÀ“D$va&7߃8˜uTs®clÿ~öÿùGþQÁ$˜s ˆ’‡ÒR¯"D, FM @Ì2Í<Ügnr O@béJêŠN¹Af+F=§êûÉYÏïœüÄç“qÓë©Ò`r(Ö´Ëé«”* Hó A0|wžSåî¿›Í?ÿʹ~{ôu—ó*vqžâ¹rçò—`×oDoø¦|SssïžqætB‹31Í£(¥îœQ0ìÛ»½¾å/ÿp0ßÒñd1É1y¼ìa¡ˆ¨Ý¯%Q@t¡£?Yü«}›ûqÉ\—¡ùÒü²ûM9Ÿ`göMõEüòîçÇ–tÛ@ŠfÁŒDN–ë Ÿ£ÉDW1RâdßZ?=mÞb^òý—ÜGv»MÏ•zó”y§ØÇë>ó‹ÜŒœãÍ_èkåŽ/×ëï÷ßÞø3ÄØ&3|Í"nD˜èZ'¯–•nȦ¼‡ëè PÞúÇyÐÖä*mÀæêÆwÎsnžEºôÝ¿øâ=Þ„üœÐ<öCò™í ¢Ì ³¦– ¿8ŽÎÔ7ž îçt‡p5´ÏùgÏÎ>½¾úˆJƒ+]FY@gwÌ6+º¯}ý¹“1µì^™RSv¨¿âQ•!yÔÊ• }îŸëÇ}·CzÆÁÜ1Šìîpóeœ ÒÐØÓ/xrG‚wµØ8˜ô'½+¹¥cóx<çx}β"ƒl(E„Dy-öX(çB…2Ȧø·ÿá$Ë[æ"ß™ù}ø4˜›B nì7™é„ÐàÙÆËtÌ"M':'A"¤Ñ&£ß#o¸B+9¾Ñ6ãÒiiÜ®aƒ:‹ÝÊnÉ%¬¿Àe, âšÁ<#7ÿ†ýIËpyøKÈ£h³%fþA|^ù»íò[â&Bჵ}©hѾVÊKögȰfŠ”PÔŒ f¹Cækõòz>¶¼m½©.åõ¿þíoØê‡<ÿiÿÏßüë@€ #Vh2ýH¥‡„½R„ËTÊK@‰ã8ðúÏïqïŽóã´Ce$ʉµ/©U5¯Å®Y¸â·ÜÃÝ¢@Ĥe¤ÐÄ^JÚàUF Ma~àÁD•¢b©B=£LÝ|–K)‰¥— ¼tÕuÒ«¶. ˜7…´ ŠT’Áö3¼/öùþçëø%|íùõö±ù¬sÏxeÖÏ‘¬e>ïóùµß¬æ—WOüç®N’@ˆŠV@T‚8 ´ %…´H#„zEpº[á2L‚:ri™i}>%¥>â,ŸØ‘^†š +6iL,Þ_ÇŽ:ñ‡¥ÆiÇ «ôpߌrd¯3` xønsNî‚7ïÛ>p¦«Œµ¾y/Õñ/ŽƒG~hòw°Ð´bM;£Ù`Œa§€m.n  ÷qþ²‰íµ˜{`d‚¸pR¨6" àáøA_Í%­‹›ªW9ÓJ|¼³ìãÄnðr“™®Vê—Ÿù¼ÜÃß|(š…ÀÒ~«ÃÌ`ß]r•JGï›ÙoÍ}ðU0¿‡F÷íS;÷Š.¿è¹ç j(Å ²÷Cïåy…”¢à•1¦h¾­²=rþâëëúÛc…Úà]LOv‚6ƒ[gI†O¡˜ ÐOËÖуb¡ìð¨ÁÚU8Tœ¿ùëú㪢° -ü TWûáüÿå–óHtý˜9tȳ)ÌÍ8Ya…)´ P¨õ. 9•äšP[Ö6XfdR¬‚4`m1㉂`±‰0˜ðueç@îº95'…Hƒç†'²`Š–³ÇzGqÕIàAw"Ÿ¤/¦„pÐh<¨Ú"R,’S”'à¶½WÇ,ü>ý²²F$BœÕ f"Ôu2*€_¨_rª šåÇAÏoª¢¬˜ë¤íè JÁõ”F=nP^ç>¿çµƒ¾—@^Ñ v¾x§”DËìa8œCÐ4B +¦v±ÉfÉáûDßqE‚r®ð€ZŽ(ô‰÷¥^æ;öñ“•®ü}$ /6×ÎáŽñyHžõÍä&ï§:G¾\^.GÅäòIÔFÕzoP#ðr,ðÙw°é Ãô  q§¥qxÛ§]€à´¢& µjmˆ€jpl¸"DE£góY G< í0`=¾|=¯lû÷¨~ÊVÓl „Hf‡ìä²M¯oHÓl¹Œ¡…<@Nw“.Š4AX঄Oå9§ù!XÉc^Ç 8ÓX+ÅÄÀ›¨¿wü£o=¾ôÙ¬Ä1|¼2o1{ ~Žg§î'G¨-smRŽä3Žƒ EÚöaðºéÉ %mÎ;ûݤs-Î~á¬9¯@oЉ»9O·s³«8œ6ÐÚ#¼ †ÈY¡‰E?­XØ#šà&¸µ6Sêw0B†R‰–ùi)8š˜FË*b7^Þ×ò›À[öÞ\ùP(Ô o»APj´씌.PkÒ$²>ý³GŸ'“a­«ç5`¹LB2PæRtSŽ4Xpöƒ ›ÜÒý0ÑÿåzaíqÞ~,ë2dH+¥ÊÂe)Ç„ÒFã³\G“¶Ø‘-VH}?––ª@,€smŸ._TlM´<h†Z£èTŠa*ë\¨žÁ©«¯õ g|+uîg§D‹a•ï×p}¸«ɸgšjXîN˜s”¹˜3Ü~ؾÖ–û{Gûž ZnͲö†0R€z •.¤ÈŠT;IIH2ì­è5^ÏOsí‹{‚Êñîs¿Ç-®7; Æ'^íýœÿ8ßopþ̧dä] €ë ¶QŒ¶u´µFWYŒ-Ah*¥¹t<™ƒ¤uq²ÈKS¤5e\Üw[yö{5ÍŒ]¥ÇA0páXˆ³ÚGg˜ÿF?læÞò)ÌX ¿’ÎL”¸’(†Fž§æ\rž¹3Ý o¼K|<ø‡_àkÌ©šÏ2á÷ƒ.Ø ¦–üäv“¬ÏÒÈσçþoçå€ÂŸG¾š;ý¹/ü ÃíÃ×Ëý||8ÇoõµReH’VÔU'ÈT7ѹ&Ob½ƒàϨì_¨r‚²“ DpèUÓd(¨KúsÂÑ(dp«&ðKæW›Í—÷Wê:" Mî–wC´ŠY+ë2š|Ò¹n]×î&´IG=7#×ÂjàÖìÿ"ʯ@¤¢4MóqþÅå”L’¼Ë¢²TóŠJ ;iÔ€AS5öþâˆ1 y‹·Ž›s[»H h•Nm[«ü8›Qœ/´ÍîôߟŴ¢ŽˆÉ$8b6ž°®æ„b5y›ƒ¤Y¹Ê^7œ V£ƒv;]ã$lA6×J3W'7~øÍÚ1bBK°Õ¼F@ NóªÃ¦võ0t°ÄnïÂu³rx…&z퀚ŒQFrµ. ‚N¸¢[žž˜o¿ÿú'óD<³6]Ú¸ÙÕ}\?u&whiâ¸=šmQ)Nz^™ilÝâU:øßäÜ¿$îÝz®ÇÝ•?úùÂ=âî¸È<‰ºH{!dÞGAë;½’iUÍÔëŽcÀÓC‡Cïªý)•tË€€HFeÂc…8}¥Y,©µ©v”þϨo#ÛM¡D§<Ÿ8XvÜsÞ‚´_!%‡èqÎ/=}I¡º/†úµbcT¥@E×d«­EoE‚hÉ•Ì9Ê«]•^!_OÔLµ˜[|ã]æ"ðò䚬ü#1•ï9·Øý…'%æ`°‰¾P6¤Æ ê¸xX¸3ƒØa(V¶”øEν‰åB‘éIg*¸={Ã?‰ÎÞ‹”°ª{]Ÿ"VŸÆ)ŸPÐCùUå¥Õoûíïj›_ö¤ˆ_~mè¹p»Zng­ëÇv+g|"zàÑ«c·Õ£ñÑNûérF‹Š–c- Õ+iÙmKëöÂfh÷ѽvJˆ+-Ȧ‡Hûªg¸3ôrª&”˜Z؈ˆ÷;^ßÊÛóKTÁQŠüxÌq˜¾èÃb•“FòÞ¤F‘+åJÉàH„Çà=ÖfæQ÷ñ£·u´v%é x’–”‹¦ßL¡ª•`”Â~k¦Ž!±’fç!,êûÜÐÐFI¶/Eb\1§cƒ´‹ Õv1Ðè ûÄ©ÊÓRìyQs«|°ÇÅXŸ·ìÅ­§{D&ŽzúzMì{îλ¾ÈátàŠ‘¯ÁúSA6ú§LiÙa¡ ºKåZÁzÜ®17Õ Eåd€VlÂåR„\i%x˜£œÃˆlaE7v}óý²ÔSª0yÒ»e¯Kñh&àÈ–€tÇp(@khA1JªaÛ §ë›ÂGŽòóhÎFö°3À¶&3%£ÓpY]¾¯;wó¶yk,H¦g°€íÇ\HDT ÁùÜ_Ž+¶A¥(Ä"‹p -*©S•(\@üvK—Å€„ÓÄp¹`žoiŒ|Šûÿíí¤_ŸÃvÍ'B:4%ÞäTÏM²U…0[vD(%‹!I3z6h‹Þ\2g&ænþÃÌè¨Xd¨ sn/žéåꈗxè´Ä‘²©Óþþv€O"HFR)&}ògöoK©ÿeûw~`~¥ïHѳ…i°Á,?E3(ËÁ²±âÐ F§†¤u¬‘€×YÔˆ[Pd†q¦{_[-Sœ‡/6¿îÚöpéÌÕõK×÷Óó×µçÅú‚—§ûMΗ¢çEi…F-¾¢øõçw_ç|O÷¯Ç­ÿîo´?ÏJ®Öá\ò2Êíœ{Òå^ÖïÞº{ß"'†(¥çº”üåX%X0 ‚¤´‰wå '$ßpœ×•šƒiiåÈ6.xP&wº—é˜Â Í“y4\½ªNyoþÏ{<{þð×óïǃw߯{¯n¢}sûVéùöÍã7I‚&Žè¼¤ÐÊ’Cðð’ ¬J[urƒm~ïÄÛ:ùã/úhßùuþ¨oÍ,W?iqî½N™ûh=·fîdû¦·ÝžpÙ7ߦ³lÅ™¡‰®¿xŠãÌz¤nÚCz\Žqýi¯MO£Ròê½MèÀ3$&|¿ä¯ZÍÅ›º3>ù˜”9®¹5µâea„·6ïhÕW†_ôÛH_ó£¶t€{¼fßG ‚Ë|ÝB‹¨dˆgµåú™¬‹ÏÛ›Þ7ÒþöÕ§[DfREïÅOMKË$ˆ]¨ ØÛÙÈ^}¾à±%ZY(à§Sû 8±ÿç4ë>§nnBÑsZ|Âëm“3ž ¥{!éfì s]ñvú°e6½»K*Jt×¥U×Héß}çj„—]ëUËJ·ŒN:UXT•Tùf—ÉÿGr„3¿È”clý¡©â(ÈYÂVÑ´P å4ÖÌöò‘8ó*ç÷5rtç‹á&v¢Ð7¬ÄRŒ(îvÚõ`ײ»~ý”¹ÚP“ÝzÍS N¥VÈZζ]!Ò`;XŠ 2FXÖfD´ÚßæQ–’Ç'Ä£›>k Y¹/·«¨ @¶5@¯rÆÁ°k°B°®âõ4wl¬´,=©8žç…Ë-ä¬ó &+û­•ÀêiôãÐu‘Ñ5F¤TŽv $¢êj E¡ˆ¾¢O¹k% „C¦>ö]ÚÕvZ0j‰qÙ«4‹^‰V›žºB"©kײµzP ;¾ÿŽ(Ã(“%uR¦þ2An³Vµë1Ý•‰°š©ç*¶”š+™éÞT›SÎaìQ'VÀ®üµx°.¿¢¿¿“ï5{¶Ïzä®-}ÖㆿšùúãÝçÝ~róüî½ÖÖz½§ÿËͼ¥ŸA F#  !­;iR$ ‚’_ž²´än§ P°!‡1†ˆ„ÆNÕz¬%Sc7_ö‚1òªœayõhøm„c~Íæƒ#z ¥ûî¿oæÍ-†å7÷áär}89‘#º—?uô,ïê<_fWÛÖć×¶y"ñô[™Ë{ΊùÍš–Ñ'Ù ýöSóˆçî—…Wàž•Ö#Ïmv»¥Òú×<š¯3EÎ"èb¡ë„O“áN¢Íjsè¦ÔÁµ#s}ÀÁ}TIªÖ&ôª¸KÍWmÑGÖWà–™k†»5ÔíCá`–N"‡¦_®—Áñw'˜ùþ‹•Ÿr²žÆ¯v…—­£üÖ§åcßË¥o(!ñíº(ïç¡=½’Ÿ ëù°»ÅÑÈuK’¾@Ëtl[5ŸßUÖ4Ñ+ °À$¨bŒµ3šŽÜW¾‰ jiÿp|»þLûzÁöA/õ1-“ ëýà÷üí·t…S¡ŒwrVR×#“ÌÜ+!¨û`V´ß°Š Çnš]SD`‚ ª¨ ÜCjqfÖÂ;Pgšw>BÜ ¨‹sòˆtØå£P7 H#o¨ÙÏÃR°û˜ž=~˜^?àÇ%â¢óÖMPæôQ6Ž«^=Àe  hæÆi,²£µ¸7`YÒ†„ØaP1ÿPÓ úX¨#fZ&|g\‘ø1þÇ D(ÑÓæ¤‚FŠ351•óÁR 8= VŒá¢áCðÚâ{¨CPÐAÅ´æ“ÊÕÒ£GOwí1íDÌÑWîø¾Ä+Xfð…v1ˆp‘¬uG0 ´®*ƒM ’õ„¤î Ó4­°"Áa$bPQ¤xmêœ{à(0 ³µìÞEi½ýß—úý’¯Sï0ðbãÆóu›uI ?¡óÛØ#ÚÍ\z÷ÒÝtˆ…’4ÈŠëb!E§©UÝÀnz p¤&ôÃ:à×O9÷Gv… G++aíx…Vû:_ö¯Ÿ]mçV‹À‹ÈWP³M™cºdÔ;nòÑQ‘…vK[7üÙÈ0ÓM„„”¦VƒP %P<±iRëËø”³pz£¦¯‘†2‰_P³¹Þ… .Aë3þr}\ïg½^·1~'eYfÖ¿hïc‡·aZäs»áŸ‘›a„úyjþtÕ/F,!~Ò)Ñ„Uê~¶á*X– ý¦oÖÜ'’Ò=X³šÎ £=vÒüÓ(ûÊõEÇfEä¼P(B0 Å#‡±GKs—èÈÎ%½ù(·m¬ uتÃ@!fRSÁÒR[xÙÄ…‘¢¯±o]uwyñ£td4¨:Ñ ‡g¢%Ô(„t)X˜N½g´¯òºþ“ÿß§ÕȺ:í@Ø€@(ˆ -’§üáïó‡ÿ‹W´÷”id‰j2°ò¤ g¡Ž>IÓ3­@ÆMCYhE€E T¼0"£µ±o”R1ü©äGã¹Ø-3Û­¯þ·®¾Ã«}ÇÈwqˆ&¹F&ÞÓp¥½Íˆ ,ãó¨ürþÔ Þ_uõùñЭ"YsÀš @Äd‰!¨Ä¸ºÀš(¥]GÕff¥U–?v^’L]i/.Íè|~û÷óãW]yàaH¯Ó¨r„+5‡²DM€/B  ¢Ä‹¾!†ìõê2Æ@êÓèJ,pá¨/º'ø~§V÷pseLR³¤EÅ Á+91õ—v?ð¼éõz¸oK@â Jä1Ý ¡²G ·úEÉ¿m„¯›ÁþP¾F­EV¦EØ4+^ñ¹÷ô) cãÎ/“[iïê?Ó¼l^£çûéW§8¹6Ûùê~ÝëàŽ³RÒ&wÊšÔаlŠº_ ·Ãtç±zZkDƒ£1Z(½Êá› …aô}o1e9Е¼ oýðS÷¨ñÇßo(›&XÆ‰Š­ íðîI·0Zn=©uA³d®0LRÙ:íûÎüI÷„5–I´æ'*aktÙ©›cýpw½XTîCÿ× 6 ÆùÈkx‘Î' 4E~²é ›'Íãâû–_«£f8aX ªÁ•`çu8%VkZb”§U @µ9çNvŒ³Û§¶«ûyÞùõûmð•¡nåšÀ‹ŽRÑÅì°J/¹¶Qc+2‡E[#TaD1^Ú¯UðüüÄßJ?˜Îæ| ü®û‹ÌW–b¤;¯[™©ôþǺõí/£ò©áKÍ0‚[ hŠÄÚ–¶•[iÔ”A”3Î#›#þéîÁ:1ë%·tv?%Ï^–g:ANjI™Jçd#‰ƒDYp×ZCEaÆŠTBE¥ßÅyóüñ9uÃä91ì‰ç[þ(}•¬eK˜šþ«|𽟼÷?·µ†L»Ñ°ø½. )¢ÄÃéß›w›/a®›&À¦‡nãn¨ùl.îŠÁô£(вIÀ’r‰ª"0‚.9?ð·¼ù‚ßóÒ_œOü‡yí?¾Uÿñôê:„a#dšãÎ'ØË^£¢N¢1]D *#ç ›lB  %½±d»ô Ý£ìtLZ =" •–H.ÍÇ`UÒYŸ¯ß½³cÈ&;ò<´f’”^Û´Ôü½ò¯ 1WsÀ¨ D$±4¢¢!¹Vâ h,­<šg¹íZÜs”äÔV…ö¡±‘(ç»”±™«”+¿yåuxtÛÖûÏ~“?Ž ïaÓ®ø˜¯óJ@Nt=¬¨ßlårØMìaÿu.ÚÉyš^³×¿¶÷æ§ÿ˜ñ¦7t©}Ä­Ù~m)=›üŒy6†)N‚2¡+O¥+*B¬]¬NÁ#óìæ}osÞ¿ºûð‘ óÐÂq{›qà]%¾‘}üûoÿ†¯ÿåùöé›ÛßÐ,Ò4@±A§´ bÒ†C.’0¤ž1çâ—ã»DjF+#£¥Úª@ß3âOy~{_·ÖKbq¦çV,s™Ø‘µ¯;s¬©®*Ý ;ÌšºÎø“ ¿Èö ù&i“ =Rž:&­Ô´4yŒ{Ã'“ëkº%Ó?m WãêkW/šÏgæ=«Ì eü}}?ØŽ{ŸÊpuÄ î+==ºä¹Φ|iY Â~E qp6½æ­;ÒæðÍõŒ—úcìûqý8KÜÃU.¸!¸ì!»“°áíÑ+›#ÂÝiîayOœÏu{^·Ò¢/•<üæ˜luéñ *dá©û>IçsoéåÀÚs6Ö>¡uÀÞ16<š72¹m^U7çëéÜû%{Ê{Ý!d7ŒåœÒ¥’%Ÿ´žÌ2¿ãô¯z8¾zZSÊYWЃt–°8îæ<Œé4»íþ•p¦ÚˆZ^©aï^½íøf²!Ö®]ÄVì 8Òñ5â7Ã#&«­£påšE´«ªœú`Qa!(d#¬Èšr§ >P¢“‘{©ò7 “;qaTèw䜱p¶u·Uu{.\ARç‹þÂ8@²­îÊÌ;Žå®<@S@ BÝ8ÁŸfªÖãáöúÖb³3µ0kÖŸxÝ>/»ù…@²g*V*ª+ÛyÎOuà.%ÐA2˜äÒÝ‚¢ ÅTªÚG ­€…—iúE©‘Qâ`µX.’º-ɨ3Þ=yí9ï#A)Ìw•‘B¢«¤ÐÌ-oæÏéJË"X¹ÒÔ ¥’ªôP `à«a Ú#n¼bÿìÓîõ›nß¾~+Ù85éõ¾&]¾c{ê±yÍÅí¯¡;„Ö’ýî!ýÔˆ°ÔÇŸªÊ%ßÐÂÀ:Ìvë´á—»Ž£%@ù½Îv/‡ì•ZÄHÁ´ôö<ê^­¦‹zÛZûi?‚böʽûj¼ ^L:ôªmS }îVxÝ~fLúvÖõ!°{6;ð숔kõ7·>w1šëx1ëºgfÕá² –Ð!¨ãùiB><þöþl¶ÖOþ†µU›Ö´whP•ƒÉþé{<)ÊPÆ=dÙÁBs‹de®È¯ôwÛzå¨ÅòRÔxçqì˯?ûþüåµê,~uàSÀ_N‚ÌùÆñU’•‚sˆ9Q_PDÇF8LÑn©P !VŒˑР‚U7YãñJÀ45‹U3fÔÅœæÅpêq)áy:$7²X‰ ‡ ãä>Kçhî3õ׌X4…‰á‹ª‹wkB$íñæ8 ©‚X•P¯¤‘æl冲.÷ߦ•ÓÝ™2Imúхɉþi&áïÿS„„L T•+Ê;Q·Ï¬6ÚÛ·ukP:ZaéHìÒkCa*%Rty15(ve|j5æ¶<;<.–/–˜ºùÐè,'”?§Ô¬|ØHÑ.˜´z©5ãÆ~ÄÎ÷oß—ýyõZKyÒ÷ù¿}çÊ|qº¸ÈŸ‡Ôp.¦ï­‡ëý‚©aCØ‘> E8VBÀ—‡(zcR‰}ºîµñüq´½ÛjÕáô&(fI’»ÔNBO9DÍ.;; ]öP©öÅ袣¤ŽQMP¤9‰š;´)mkØM³W4Öîh°›Ï´@Là0#¥VŽók?¿F퀗½j—âç×Ç·7vø8x—h?¯¥Q¹øß/žT¤ë•I åÐ~¤xc}ûŒVhÚ#L^¤j•â*i&R7±gM†í‘kOçæµzñvfš˜Ø¶“šk4"ÊöÏu‡øSÜŒcf0FÚ‰3t¤ˆl¶þ¦¹»šÝõ  ­@à@¥’€ ‰ÐlÌÑšE^šÈ óêV¬ðÆ!žKjªwý·j¤à, öæB0F"¼^O+×'ûD$6{µ³Ê„9®z “ ”&/@¤:h8~Eà¡ókk}r´{'èŠBAŒÐ’³:ç‰lÎtüœ×—ï¶ór1¾ Y’_sјAˆˆcR˜ÚÅËSÉbC%¡ZèÔÃj¹ÀÑ4àc1MÔj V/N¬†~vøó?A3ܪœÉúƦß$:(‚ë:ú|tÁÄpMsÉ ÈX-e"Öh˜ô岯<¢ÈÞÉ©}e%´âÚGÙh ¯øR§sèc ûJR…¤·ò/NÿrþÄ›¹ƒ5,áâšO¶ §u‹fܧ»7>ô¢fë ­Nt\ï!¯ÔÑi}¤Fhg¤††u´)R$¯>3Ëߨ„+ÀyLH|_&‚ÈWö<ƒ.G.Øé»áËù“ü«#Ä»Ô5¦»³åTÏ6TFßn§õ@ÆÞ„ ÆÈ©ø(Ûán¹ôY ­xfl0>+Z¢š½wå\˜jdÌòže_š„$kÃuÆNvø°ùî?צ×à#¦ÆíÀž¦íŒRÕ¤*õ!2ë.DD í€X‹´ŒÞã9 4Á•½H~7¿c‡*¨0ksÀtãcÄŒùJöÛ M²´yÚÑ!dö_î}WsUÑ œ=̉¨ÊSÖ¨ã1ÄÏþ¹[s iÚ 5´Â£Sü©¾Ô üûÕûCKóáRª )˜<ÐSPËÓGò¿;¼ûÞFê_üþù7Ùºÿ!T}{€U)ÞcÝž´QZ\¸\ywêqóW9J›ÏAýœä˜,Äp@EÛZ,ò»ëTJăô€#¤n.ìN÷HGd–À‰§æÕ{uòÚ?Guǯ;èé‘õF{$w‰@ùÊ| wතȉbz©S]oDæ#~]Úw_ú¸·Gÿl=‘,9‹’¦ªž?H†¢þ ôoAö¯¤QVbC ÉNQMG@‘ Ø´žcñŒ¢ºæô/ a9ø ë @ÌÕ¤@ÍL Š­±Cµ›‹"0-×åŠA&VT ‰yqᮯúFÝ׬°bXquYA¤ž„P1C•VJð¶)aE(ŠÞ–™R‡·0zÄØ q`ê“øÑF <×›Üzu©þ:ú:åë¼ùòÏ^ܾµj}~²»í‘¬ÐÞ>ùÝ—?Õ2?žÇÊÉ «nÊçªQw“ðJ]ÂâP®µ½ÛÓðØ¸¥,ƒkÔJÉuQÖÅ*íÉËd¦„«hhãCKœâ†#x{Öó /ÆW»°½škÿ$;â!AÁ–tÁ¤ÒUùܨ¤» 1©‚,»²»ÎÂPŒ'ÎpØ`mâ„ZyÂUI/w;“¹ê¹#jA[à=?um`¸_.·€uû£f¦Œú€në6D<ÔËE´Oo\!5i+Fëºæµ©— {­­jJc¼/6芮(}…Ÿ¸6ÌÝù™sœè[3_;ýg”UrÉ€ƒ²ï}¿;¿Üö÷‚K¼Dš8( .Ä™DJtbm)y(yIåYùyTü¬(¶fv”UE7ÝwÆïc%A‚T9L*51gX„ˆ1FA@:†‚)]’ÇRw© nåñÕõ=¿¿r/xr³µþb=±{×WÍ|Úý!Þo÷sÄýÍ ¯î]¾3qGEì͹6Œã;“ÈHà°Õãuw8Ã{L™ÈúuÊ·°ˆHÌpŸà ÕªZCE¨ ª”¬¤¡@³öä]ŸGžõØýÇŸò¯÷Í¿çèW_º,Ía*+ºlˆA•IéøH.7wQ±Çt–‘:K K%Q„®…$-Ó)ƒ9ÄëèRdcJc iUƒãºÁÈî‡×D+»sïÛ×}¨Ñì³%BÝÇþ?Žˆ`Bt,¢ùÇhEUözU"c ŒEfaŒP45Btxuò¦²(rBªÚ!ø^®ËÕŒ9˜{ù¥¹2ÚL_å yÜŽºÒþóIÿk§"Võ;3G°5 Cus”δŠÝmÁ‰úëV%˜¨Êg4\z¶IUê#.Ú¹Á×`_úÇÞû&Òì,cöÉèWzÏC ¨à$’HöñÉjŒ‚¥Ä©cE‹P&nÑÑçÍßÇwçíg6»?™ b5]¼Ûõ'ó¥ûówÍ÷ü×=^ëûk>úa¯šø$I*D¡ÐMI—Ñ̵™‚Ô (†AÃ4é—êVŒ³äͨ¿áïa ¯ñ6õ 90w%…˜™’6q…+säXHNÄzù˜ù·ó6 ÿ…¨Åb”Á“óG~yØKî–µK.Àt0žJN¶ž¤âÔdíTO•íÛuçXcד²âö–cÐÍÜìGMZMÉ}žIêèOÛé]âÈ…é­ì=¤î†Kâ£D¦>é;øù±íËGÕç·[Þöø’=ñè <Þ`Ø_ßA݃ýÃSfØîä=_]ê†YQ6±‰“ c¯“‘ÁúîŽÔéJ…zzÇSºŒÚ@5µš1vÛ¤x@äoÖSB~ûøxsݾ'Ò»‚˜ÓCóˆ{í0Y@á‚2‘P^ÌÒò2‰¾O¡€˜œó(Œ(I©øé©Ò×õ¡õö>îíïÿæÎŽ'´Äl”˜&jæÏ;Î›Ì¡Ü Ÿ—êÕ°C"¥É ¡@‚ÍG>ÐMû°ÚvŠàޏMnl}®+—uíTw (·ÁÌ€mwfkz&jzo±·p;)‡P^θÊOÓÁ”›Ë…ì>+£†Ex©° £Ô ‚^ J½ð×,'èŒÌ°2Oþx>¢½?îq6„AÑ/¦ÏT”<])ܱø’­ö ÖaB„HûNáAÃBÐXaÀЬlI¨À/uÔ£bN/ÐúÙïû»;E*ZŒ%A€*b4 08"õC>äU¢%W,•Rdå¢ÓrÚ&@qõ¥ V( ºTjÔL…@h@°#½ZÓ7!“¡’ëÄÚÓa Ÿ3Z®jûOßâé=ª«:\æˆÕ”“VŸ`¼üi¼xñ:M< PY¯~ùëÁg üÞ%¹­Ù:÷çÁLFrk¹×µœ|âA>kœ÷x…W«…Ú˜!ðš&•0TT¨~gŽÉš?USÍVõ“ÙÏÜäþ>4æt|0ŸÎ›‹½Q6uÞ_—¼åÏæÃ³9°´ŒÚŽ]Ämî H‚(l6jÙUšVöóõ+MAkÄ!žßp¶Ú]U-ž™cHšjxLSØÏȈÙ@N8…„*çó+{Ì €¯ðÐݪpÙOî×~·ŽÔº²ëöœwu<Û.‹6H»ƒ5s5æDŒT ©Þ°UšÆ[:|BŸ­¤í®ÞpÙå¬ô!3¾Kó“Øü]u(ï˜-Ó Õˆf`Mö×Rýíô#£7ìÜTû„CU¦£ŸùP㪽,è1`´È4¢êœ``¨PþX†#ÌaëÝGí¦nÃí÷vi–mý"À#ÈWRMìÜdJÔŠÒn}6A´À“Í­$vü}@Ñöí-¹èg+ÂNu £û½ø±gÛþœF«‚d†Ä;Á‹(}e~“ˆ´oéÅS¥”=ÛÏ>šaå‰ÁñÈ£šO’Îí?O£2fÆ}¹WE„9ž»UW»èÍÔXP5´mq£Y§¦ cnÌH;„;ï¤Pm¬aw?¸ç/ óì_âý»-?:Ýgö»¤ûHçìxþ±pÜš)¨µÃz§œ}×ÕѰ¡í—¡ jCÙ^88fçögÉŸ—2Œõ6TÏ•d—zÕ›û+©7ÃÐIQ·AKº ÇdW TrÀ2ðÃPOL—®AË>»¯•ÙÑsôÝ êe­‰Y‡ øÅ€`™P9l¯cû0ï(ºÒ¼Ÿ÷äb¤±ò*Žê›Ákžš@›Ú"„íªæªÜ>z[­òS¥^»oœùÐp·ÇF )°òQÃò¹‹hš‘"0ȤÒ5<ñúgO¿Žã›A|…0S׈ïfsñohä縯ÄwûäÌYD2¥JN.uÄ÷cÜNçN*píÚ3N C ÛZ9¦…ƒéÁKÉÅõßò|õ©gÌÎi-ãäŸé/‹q†uý®ÇªÛœ3I” žKŒh;™§„˜‘®ªéXl߈ yñÊÆJÓíS7”ç`¼½Ï%̃SÆò‘ƒ¢×¦!!CÒÍ£ˆ½¶jà.ý©ÖXÏMC§Ûµ<aç÷žqµÐ…1Ó‡ÓŽzX0˜žh`T‰„0„x˜š”‘%¿y À„¹µ ás‰3+ߺ^X•šDFÍd¤X Ôèw^ýɧ‰ª’¢È%"6äTQ†*:èǧb»ªç[ª©àÕÝ}õíÓ—E 8¯v›é†Vž‚‰ ˆÄJþ²G'ÇÅÓ¨š.}¶§øqÊûÛï]à+Š0JAˆ¡Å&šNµ‰½¥ã¼íÅcšB‘ÊhãÕÔó>E-‘µ³ŒŽî?Ü\ª»VS}5VÒTƒc5ˆ@>ˆwíÖáaoÅ×O$S½¨#@hrGX¬¤íšp%U#³³ªà˜áláXÌêF>=o…ê©é P„Íjú¶<¿ùÞ“ýÀ<¡fo|¹9!îgP‚ã˜^OIOÔ¥mÂÀ5®ÍÖ«P膑Ţëñ¥9ÝnP ®§<˜f‰†¼C¸òëo÷÷W>»˜Ï‚Ï)o|3¾ýü%}å•=âÖvÊ[C³ØIðÕÊÒK„J‡½ä@PIIkuÐÔä t”LB§ó…="l“…¸¥×:ÿó›ºÙD .Ë`8?Åã ”Òƒ¦›¶#ñϽz>ö Rª;ÛãÛú….2ï¼}¸­½ÕS—mB+–O´eÕPÀr •v æÞÉ!\£m· C÷U®]Oõ“òFlÂÙS,r©¶V©óªhsawz³Y6¯h®lá iGë@”Ê)’9/ª,´ š¦$]ÆhÞç©úIŽv2^ÎöäQŒ *m¹L›¤v1jÌ{3löcÁkÛØ¢¯ÉŬžSò>éÿ6Àÿ4Á=–¼X¿ ãŠ˜Çð|U”ºÓì/ø$íÓéâÂÎCF¼ uÎÖÙ5o̹¬n 3Ù¿kaÞ9ÿ=¢æÛ/ÏHC×n>¿ëï+g¾ßÀ¯ó}[>vj„Vš´žýÜ™˜«xîSÂni–ÁVŠÚB…$”2Fµã‰S )$¶ “ï`Må+!în£õmûN.çÊÒ15Ápò =߀íÅÈÛ*vñ GÃ*)®V3ØÏÞ)ïl žJÕÏà>sª^üämp}úϧtßqÄü˜Ù]¼arãCl ljD4x8²ã °5ê^í?Ùø4mà%(>š,Y²Ò5†{à Fd Y†t¾DJ.ôÁì1€ бÕÊ=X|VK¾ÍîÀËÃ^(©ÐV–CóXF¦”ˆvCxˆc®˜2›½¬Iš©Øn9 ãE­Fĵ 41HEG¡ŸÊ²¯ò™áÊ6¦Ñ_¹ü"s8kãì¼L/î_cùLyÿû?›Þ;Ý„¿ ýs5C«%U÷¬ùwäšMÛT{)Lø‡ÍëÑr¯Ü¸È\¡ÀMöA¶:SBë‚Jlna||øš½‘šûSۉ땻‘!¢Æ›¿¬IxI¬8¯ÿîé“–¯ÛsJÙVu ßj”eÑ-° ÎOÍ'/²Ó¹Z³uÌ]û«úV]õ|–ܽé"Ä…1Æ{×;:> ¤>›Ã§2²bS†Îc4®5ƒ»ºVŸ©n±Ÿð|ƒöeµR±çª?sÿZCjhmP7“¥Î& ‚'ü­ ÕR–Œ7„£ñ™ŸO¯Ù´X™Žƒ=¥"Í€žãŠqþ?Ù¤f…>­¹±–ØGñqÔ×ü&û?öÇ çògè èPS1ƒå¨m‰‘3¢@GÆ„ ‚¡|g9UÍãêëWý#Ы¼ö ®ð¨~TôKÆ£ßòÅÎ('` PŠl!M)]IÑ@Šv/)s!¸Dvİ>q¿B¬õ_ô£*39{¯¾ïÛ†å°Ýé©9—0Rkhi\k¤’¢Â±\z¿\é5Pìñ(ëe æýÇÍ'ýl…Ñ›ºáFP˜ò&quWn;Çù h¾E ­ GD†¤;È|}¥¯óÏõÄ­ëM©x@¦£Ã"Zè‹yŸ©@Ð@14B Š!3CÇРvªÆMp.cŸÓæüôÒ€:kj`®ˆ¯ó‚ñÇ9(¡ê=ïî–f¤Òëˆ L³h& 4dD@G¡õ@!B#€[E@L*@K”¶©j‰öL+uTF'Ó–¤ØyÝåáïo\Ó‹¯q‡zÒYªöLʽÕóÑ·¾¹Wã¹@ÝõóNΔ¯OÜÏ‘ýÍÜÇwp¦m‚Î`qú†¿Ýý|”Þàü³ÓT¨n甚—ûúÿM>)~ÑýÇÓåô?íç]ÿ`þÁÿÙé}v.Éœ-…  •êUÅ PÀ3G¦à`q楀FêÍûÎpÍ€¤_¿éã~¾ñs÷†Æn¶ÃÜýs6ïùh}‰S•Mn€Œ—•‡OI‰ÖMq9.LoI*åb›wθsŸb‹}Ï¿zÿUÞ¾É?˜Ê6y±ìךw‰U¶KbL@d€ñ‘RõBa*²\s)Ð*˜¥{¤Ø¿˜·ž®$Pj«¯ŸÞ/OéZ?{ÿt¤P\}ž~ÔâËsÊ%ç?熭!+ŒÂºÁÍ èŽ»ÖeÖÄ£`-x^ÚöÙ÷¤¬KñMë©3ÛO‡bɪ’¦t³n/Ô¼iL|hÎ÷ö­“[Ÿžrÿânˆ¦L=ýxÆô½aZ×Äî4¿Î‚êýÓ/üÄä3áOÂOCŠƒ ‡¼cºä²™~¸½hÐ4cǵuYÕ2Þ‘{¾üùëØ›û^¿ÝÈ+r.w±Qô6nMD,RÂÙ46œfDv.9Æ~i†=’Æ'òÌ”n»H‘(³¶z§ØÖ-Û¶îê@‹@ÊÉF‚`3ì·4ûà¤cùžõ‘H7TNAhK_ÙÀr¾+êÌ]¬Àp;ÁÐ>j©l\ÈSâºÆ÷]-”k ­!{Az€Édãµ1ö>ÓÆÚà –¡]›q*±=Aõ§ºWâ¡ZœÏ<@Pe šÌz’c”ˆV¿"ÕS€éøµ¹ò®íç8Ùõí°¸¥è°$1EQ¤69ešHÐ`²Kmõ¬Ù‰’pÂVÑ3õÝ4+¯ó²hÊI)ФºV¶l ¡]Ê/´P¨N°n «Gª(­$õè—‰«¹x!?oÉyO'ߪµ×öVOW[û²·;§ ›ÍYÎGGÚÓýó|êÆTïús ÅékÄ…r!0æ#øŽù‡{ÉïøÄ7µOÿ"|«à½×‚uëŒÛ§DUå¶Ó«»!î ,rÖIy•ìHQ{µ®£»õùû€ùù×s±*‰&àžò¿½ц뾥¢¯ž<žŸLï+n ÇK÷um_Ÿ<û£Ž–,¨hÏØãÐj’–¼'½?-œD¬rKqÌöó r‡Àk‚•žmEØàÉ~©‚‚Ô'‘ UjŸé=0Árt·‰R§·ÕÅèXÿüáÌÁS|C;᯾”ûùÇû¥?û‹ÉëןÚ÷@N¨C9l\F‡ «…qâ\ëÁcuLÈ>£)Xo£÷÷¾dÒ“ØLÏRÑ›RÙ,Å>qØÜýK-f%"ê¡aQ²R¯Jhï=²,£êßw“¾LSÓdàì¥À f³46SQ}ïÖA8a7ç­ûC^Õ†E]/ìâö‡|ÿ» FA\Qœ2B sƒ+ËÌJ×Þ¯½¹ÿíû´’ﱉ/Žl¥¡3ó­EIùs[bm#TH3hqˆ HªÂþ4_F6™—ųû§Ö ÌOü<ª²aêqafœ_*p…8;¤Å³¸HÆÁ!ñª”MÏ0D»(6¥S- ¥0ƒ À Èþ†V¶3®\¢ÝÔ<>pÉ<™çF¹X¬ë Sj/ ºL `€iÜs±Á ×ùVÌW”¹Ãá—ú‹œôG¹Þ· Bšžà`@èÂ{Êá>iNQ›­Ùö@”mhhEð³§ÝÊŽ„²x^[U w¨¿âñvÞ !ÚåÞOJ/ÂMä˜Ðe†¶ä˵ ‡"òÝ^*¯Ç‰F¡ÈeR‡ÃxAqLç¨iÑл?Ù½º·Rýi*ûq¬ÇÇÌWø[Λ)½o÷FrŒµB­@ãØc–òÒ9o.¡å|RP'¯éCb!äÉsþÍsNÞèê2Y4ê1<òx…5ÝÁnAn÷Áü}Ö´ ²«s#Û¢¹¤LÍ‚â¹:¸yþU«ÆÈªÅTŒ.-ħ¾DÚ+êN±ë•º¼Ãªn™©ÞGGꌵ²‰#Ü¥¦LC)UÇmí˜Õ²!mã%’‰mÊA¼üÁû§~¿Ïfâ››oâ _>Þ,—?iHs]Õ®}ñ„ØÕQ,×¾ô˜.ò†ƒx?‚Œ1½póÕl"¦nÆ:ÙœFÍv,§º•¾ÈçÜ#·š¸š†¹ý¢b˜âà§Õ7ë§ðY> "kÕ.ZVŃ>¾·Õ4%ÂoU–´X¬‹sf Xh0 jź¨iõeý…w£+âÔ÷è7oÐ9Ι9®t‚ù–]šJ(ÔÊ ÑB”Òb$ü¦œš&½… Û(@ ûz‚Šîùµ¢F 5|h+j0g3 l>F Œ&…´Ê€”‹œ‰ Fí@µ›] ÙíJ"ñ½ySµzrñ®³÷¿=®Oãün;œšñ+{©ûyûÛ¿81ÿª…Yøúš{Fµ등´­ÌÏûþ³g:]C¤í«ŸxÕÔ»[Æõ®?åÛþåî›zŽÝÔ×®lê”ÜÜåö[_†}ï—÷‡‘ K°ÚOµUÝN(M¹ûÚΫë2.]^ÝYÇüY³ ¹ (èVP¬`n\]°Wf—KQ<\ÎäØób2ƒÞZ¤çðà !n‹ ²EoU{ºaº3›Ì†³²E·ØÕÉÝ|Ïþ…Ýj‡P„´›Tò:뵡+Ý>VºUx?Õö‰Þû㚔Π…EÄ#ÂÕäI¯ÜJãt2+x>¸…¶Wµ,a3)C‹¥œ¬LiHsTD.KaÁvãœäÈ’"vPaaÕ—Ïbˆö™Á`’Z‹Ë™U³wš;ü†V·Aw@C9-OÛÙ÷„ÞJö66€UÆte‹yÔ£‹:6 ¡ ÈÆƒ'AØMµ(°㕇_îï]çúªòk½ümŽÿÌ Çð÷6ð u¿4¿ØO·Zþí‰ÿ–w¬'n?9ìN:ãÛ—Û§îŒÜHÈEÒ.Ê^È€p¥qb¡á“W¥ú晇j?È~°G¸q–ªWßÝ*?=Äüiß1GϼJ…lwKS:! Â^žóû h˜-T´ðqù ¯DžcÔ”¡&׊G«câØœ+?ʲí±w´3¶œ*ÚѹÆbñ| Àç=^e›;aÁl?˜?×qÏ6¡R½ßÞ$íDß4J–`MñÏ®þßd¾‹\húm !–æcõœÜai.‚.ÄÙg>êer÷\ñ3YZúàßs׿÷t=Ñwôt"€Á¤”T …*'3h`‰Ñ(86›ØïcGDõâ>gYÅO÷éÒÙTM:e&©¼ž"tÁûu‘U² ‚`_=ÜôP u´¦bŽ16ÝYVB/¢'–À!› •éÖS‘Âóžka…·Œ¡³ëöÙ†'*yéµ—H œo¶zmBÔ‹[¾ã.™\5úïçÞ—Ä>þ¡^Œšíš§o„û\j¯xØ»u^ jØ‘ˆÚ:Þ´MS S°ihJ”¡KLri>¬k©¢$rΊ‹hÄÁ²‡®¥W'*á@²utæÁàÕ#+P¡¨d€8=ƒT)DÍåêÕ]5´À(¢ ö;.fÇûoªXÕuÁ £¯"4,›0h@‡¥ôl[›ÒĤ12Ž&)—ƒ´ͯ?@:Ý _¤ ÷,~Ô›)éþ‰êåLrW¼®ãüóñü+ü¯Oôêøå»‘Í{‚ ºÝéø~‰«°…N˜FÁɧ5Ðè¾²[ÝZdõ§ßÏ´f.~áÏϺUv6…¤\(RЦPEI6…W™/ým*„0Yíãs'º[ ½œxþËÏïäOWÆWLŽ@—õ@f>=kfÎuð HP<P‚†˜¹PMæ()â!@u;QùÀwÌDÔ·ºÀAáb??‘}N¥‡_„f/Î^›ßIˇÛ;NºÆÐ¡$Ì´‰¾Ûëüq)¦˜FõÑz¿r3sóê8ñ>–ëÝkŠ3¬TÊLdíP•iÜÙ[/$*“©–k¬Ç ·åМe˜¢,眚|7å#¼ºm±äV¦ÊDb“QGªÚb­uéÄ{ž~Öu®\}AçúЛ"#J$nw•0 ŠAŽÅä._Xµte<ºÇ`„ ÏgnßøÉξúp‰KÿªW}â~9ÅÜË4–Õ¤ø‘•5ÿcÞ‡öÛÁLòOqcðúœ'Ç|€Pú.ûs{wèÉpÉ‹öˆ‚õUyޱ”sGçf…#=ì2N{,wyÉx—ÚÖöÔºÕNû†¹n~2¹ï}û?~|8}süɼ?zýÖÌh98ÓZcº!S êxÅ6;Ì=¤Ï‘>Éß9~¾ÓÚ9Ø„%hSÈW äX½ !gÙhì*©9Õ³bÄ•wyÑÆ·—±lOs²WPòä¥dOjb£ÉäéPú..¢ûppŤ_6²ñÈÂm÷„ûyÝxQŠÉÔ¡ ‹M’ÀÍ‚[ôl=±£åPö°©=¸r˜ž©þWþ¢jsEð®ÿ O<ÀATBªCÙ4ÎÉ÷³}uݤßç­C»+?A¶°ÆAÚÓ¶”©¦ƒ÷.=1-k:ÌOæK5®Ë”ÑÛêEÍä-µöœk÷¡„‹AÒMÓ“žz}TÓš)`—kJ  *¨ae»Ä… „¹‰%éI÷æh®7™·NÒíÇãC5uƒuEw¼¨5ù¸·5ð6ñ5C^~/e=ׇ¶ ó.?À0?Ž>š[§Ð]Jtò“‘C;e$yëµÞûîÁÁxlÖo]^š¯_²1R[>ß+Ó¥¸Tl£mbvܦœ‚«â~ÖÇŸ÷½h@¤ÄwïºsõR ¶Cæ§®õÙ¶‰–ªüýãû™øª±‰§çÀ/½§9s´ÜŒÁ•TQR _œ&Åx¤ùöÄH$»$€eÖ"»4ZAä¦,@ãYÂiÙÍ;mºè߈º¬w•ÃÍ®Ëe;?]}N¡"+®Õ-±>ÜÁ”ÀÞëõeá™áç/N~=jÇ—»..Ý/44YjµÉòW­•)Ò) M­èç;iûóUkG1ÄS±b#lÁ·Çoædu¡:@nÜzF„ÏÜð{Ÿϯ¶Î_þ§Éÿûõ‡_ùqíÞw`'ÔÝêªIgT^V‹> > o ^¬B@1Þv95V©÷{ÉΆd}öô·<à‘çðGK² }ã$~G ŸÏnhëõg»¸7þäuißÈö{Gké|F唡ÆU—ýI £l"+¼†¡Š[ãî&VBȼŠsnLÉ® ^)o¬\uzJo/’¦²0œ™i¦òd:€(½¤U ¥ ñÜjÁ0¸ô«ø¬ù ¡(Û‡´68g` ø;䨎a¾•ò…­{°7õ€mŸp·ããqäÔ£#K¦ƒíhçW~>õYgþƒã@òT$Ò2¼rý±;ð`æWÐ`®ãw4V|G’9gøn>z䌦æ­°ï3Á"gîÏ[§qVºlSû€Ge˲‰b ì"H™Ã¶»Ï‚ã^°Š³È›o×kó+€4+…µ°Q^¸sˆ1*ˆLˆ» ‘@ 1Òé2àäʾ*r~dftÓéú,aßòubœ/Z5´ŽŸ:üéQ¹›¼©7Àʇ:Fù+”Èò׺)‡¬çõtèðœ?|Î_¯t4`¤! šz”2X.Ë‚i¹4Ç—å — —ÉöÃåjJ Äd¶ Üá¶{@¤Ð¶9àeG•TÕ¶ lÒ¼¥à¨ôMæóM«®Û0»JE d*R"gwH(ô*úÙ‰‚ö¯MÿãÿM¾?zÿB{Ü‘.òmÃ4ð¤,©EPj Q œñÑ)FÒ­ÄQTõ5k!\÷r¼ÄîBŽtUŽ@ÍQ4íÏ"{ ¯_^ØCað4Ýv']– ¢}T#ͪ(dÏ’‹höAìêöº+ô¤‘GIæu}nqéoåqæ9Ô†Û{.¿ÏIÍü<Ä©tuéÓ3àyU¶ZÞâk֪Οp¹ÏÃ_l” g –ôl  Ms§à´U@¬»Y¤µZ IC(©§@tG™K§`¿Žmåg‘1êþ‡÷/W›%K ˆÑÀ¦†màímPì/Àhâkq˜3HB@H ¢u3ÑTC !´Ð«çíë¯o _È_ׯuŠ› ”P&"(A¦ ƒ¨‡´§ª :ËŽ§}ëµä>ÏóÉ%š’š©ÎÑ"bì‘Ek¥ƒ5 ¤02©Ó+ÐMô#ΤŸÊ»@c®JªD”yâQËD0q £XNµÁêùâZ‹[Ç/¿:7Ù[DZ ¸ª¹—9ó¸Îઆ«=)-›…¢,m×Y)]œè`ô[˲S:zѾî÷šï¼ùÃKßûwh‡oâ…Ö´þ%Z·àÊ­ZcAåd2ù&„€™€°š03é3e#å(•È…;ýÎq(WÑD›ùæ~ø`â„®ë\¿ŸNØàQ fÓÙ˜¥º§ ‹R3`M¹Q‹úa­aÓ»jo8ÚOâ€ï#sé Ûè·L 8u¦ŸUi”T‡ èºFÿ4>‹ØègYg¶‘¤3ÌÞÜ_Ô÷DXÀ·°ÖÑ=t†ã5ÁS:ÕÙfT}§ïT± v$›ðüÑ–D1 â’±¢,›l“«·ÎCbèäŠ; .†F$»%Ôêh ñÄ ˜={(ø§qáô©úßf®ûaþ××òšƒRË-ÚVÑš`têžFùŒ‚Þ’ü÷óÌT›ÀåÖ™gLéÛ\kbÕ]1…v tS2vÜ}Ÿ¬dª»µÒÓosÓ—Ð}C=!»ÏZÐñ¹k+¾÷™|úø•~+ º‡:¨Ö7¸%uóxqÔŸ Ã§ÙÅË“.ý4–&ŒE;{…–òSÒ%³Ó +hE„ù˜‘b8ÒõppîÄêµJΨ. e¶R)¬ªÖe‡òZ ñ ÒÓ¢M%¨ÔäÐs=û½ léËÁÕáÖ^½ªù¡uÚvõ•˜ÇÔ³íA¸Vß^™·&Ç\•–€Ù•¬r íy¼çØœ,¨äs ¥²œ{vܲ˜F¥RI ^m+ã¥Wö. F(EipîŸh÷¤{í$(#f-¬ÊB¼€øÞ+“ÆJ5Ô‚&œ${v>ü9ºŽUmƒ³AÆ©ÂM3ѱÆèWJ´˜±õÖŸ¨ÑEõ+Æ@¤`ÚI#F›Ô&Bb…†u3õü›ýß¹9Kz’[_Íמ6ÛñOkPí67¢, (cÃ*[+ô ÿ"Þ¸)GѬ3dya_í®XNÜ¡}/oþAF0z¡Ww¿m]ø›~caîÛŽÍðyeR}+i^t¾ªzRt[J×0 •²¬LFcÇˈKjdö+÷ºUùu×3åc dS¹Ãl;&$à-zucÊ©KÁŸriËϘ¶qàH‡ë4$ž­Ÿè¶QT'ˆ¢òLÕ¢üRHô`6WãùídwSw¨¥pÎ"ziGÿíˆênÁ»Çµ9–B´|Yg¥g¥FJKûÜ9Щqyÿ°Ú³ú¥¡–®áÿ;Ñÿ3¯ÿG¦lþâýg‹ظùú§†MhB‘a@‰M ˆ¬Ôí*ký–ßf­ œV¥øÙ±-¦.»fÀ¨- ŒòJwÄÖAü¶Ððj¡µÒþgûøµù¬o·Û¸ lAÒF*”…+uCX²4£«‹]ïºß¸‘©Éq#Ù¡aR³qHâ¿ÿüþɯ_÷=šec>–­§&ùyÐŽcæã®­×%]UJ$€@P0HÀ!0pÌŒ£Ž=h΢Prˆc©<2Dmñ+.ðÈ?>Z—‹çîÌšéw ±Ì·ð‡Î«—ß¾p㊰Ûí±^0¡<ï<æÚtiŸ\g•Ù˜J•§TEîôl‘JÆ6M\¯Ý«*P £Í4Ìê[¨ù›{f4=YTþVTÃá›QÂÖš­MeLãQíÏð0Ee”¡¢Y—ý&ÆyR6„ϳI†ÍË­Âå—«®÷ƒ¸Ó5™ñ1-ÎS™†N³Ý²¶@jˆ4&\ þP@áLýÚ&$kn£ï>‹#¿Øgsã÷íß(|o¡DTŒ`aTƒ ¹ãç=ï&oG–€ :ExE{KŠy95'R©R”“aEÚÜÝæ³ýjvµ®J]ß3¬ˆ-€4`ñû3UÖí,åÞo;}ÌsE&õå;Ï4ó~\ëªÍûßK³²$Õ%IJ S +å+‰aã•øÜV>#üh÷ùòÖþ¥{ßüý{K[©Ya Ê Ý\±›X/ô– tì¶\w‘u¨ÆGŽ’Ü2__ÄÒ*÷Cµ<ÐÉ´$xrfæ’’ÝåÊ ½A ìâÝɶsm†Çm¨â¶ÃÉ)=Yô°«À,*ƒÁ¡‡<ÝÉþ*|‘×g┈;»c³vS•=äxvfë¦Õ)~4pĈÃ{ŸVˆ L^9ý~^ε~ÿí'žg&åQI´ B‘ MkìÂÈtÓÁ{/>+û¢¦/TZµÄ¸HÒÕ2pÖô4X±)¦4]YHuVG]ƒjUU1P"kZ*ThD¢Uo‡{Ûë®Ó WžëùWNs:mwUÁãþzZ¶Ãxѹ?G›ûÝ?WK|ŠI,›oxÄò` êã·ÿjf8ÛnKÆ6—°9O'…'äíŸòo0€ö‰O÷QþºmDám5)v?×í¯üº–s«ðаéKkÅ»=ù¹çi—Øo @è¤ýˆ‰¢_ã;×%ö ª†VȧÿÈñ½ºxêÔhn!Ýö^ŽÍ¥GÝ£¥Vê;N5$ ïµ47#кãW²£Ý®·.s5Œö†|¢÷Ós"IÿéOxiSD —€óñ#ü¶a £WçöÏçf¯0 í^Ÿ>ýÆë=viŸ¨4ä:Rkéàê!ôNÎgÿ•á"¶Àê{aæLë˜RPYà5;@,iÏÇ`¦ÙÓ–ØÉ∠Rñ“ó)sNtÀ0Ū{&NñîV-j¯É¯ç¿ùöÿÿ¾ÿ^oMåùv£Žú§!|~>£?þåßr{¿ü ?À¹ÛêEsä%ãËaË9ÝœZH †¶Á_<É'¡Ñùa]:Ÿ"Z}ô"ÃÒµ÷Á†¤ã5GOøüeÕ…«¾p_;¾Ÿ‘ðªÞå ÷vÛÏ‘N>ZØÝ€(h;¿¾á²’añ0çÎ];™Â]U³ÀƒâÖ9Ùo^b‹FÖÖ¬KY7iÌ¡A_vP鮕œ‡/&† ‰”‹¨¤Ýoè„-ЩÛ2ZqSRl‘G-q<õ ¶)êj¸½¦·TÆCbê#/ÅšNTæþÊ‹‚’åFý… M §¢hÓq›=‘‡IÂëuiÿ«‘”Ïš^#S˜x'>]J©žþ€³ÞôéZòax»ÁZj£ª3#ý3¾aÈ%„X ¶iG†dÇd pJý•QÖǶÚ5hÚ ÂÊóäÏæ¾®±Â1ºE´\YÛ¬ðV¼äû­%å”$¡%;æòÅò #l¢õÅö{˜/‹ì®¾~n¹à9³!ˆé¨1?¾~?õ™ÎX90hQÑñ×Rò«ûC;QÌ™êumWùù£ƒnbŽ Îgæò×r5„–uy! å.’ÎêÄž¡Wú1C jÉ FÐnª<Ízº[0¶‰ ¡–ÝtÙ€år,Ki¨ ¤y®:²cü ?WûxX[©ôTœÊbæJ¿·‘l¨Ø¡CCÍŸDËigâ>ÛV1«²~pÑb7ƒÜ ^Cޏ!+hÕ̱:àÊF4ñØ×1óIÂå>/ýné1ŒüÃý£/j»¼Õƒ\—u4)$ÉtØ. õñXk͈ ƒRf¡BƒˆMé)>WH::³ ¼'N%½Qź«UÜzEáâÈÆêå¢y¢á6²Å“H°¯¾î)€\5äWþŠ{G|9Þ˜h©×x}²»íl- >ÒÛÈ"~àòJ~›Ôèu »älË÷Vœ X&§Í(Œ¦˜R¥TFZ$FU¸‘ð=޶)@ Ó¿ïXÜàÌCT€@HmÉ›oøø.”`S¹"$*J„m&B  Èmj#Œ„Ö’ûúëóV}î]SSGBDÐQ›€alGm½¦êÚªÄL”HE¤ÔìhÍ'w;·ä$(2IJæÕœaÏê’Å=~‘¿S¨Ìd¼P!M¨ÛO×Kýâc›³ðÎðË·÷aÇÆeZt~T/_øœyežv³û"n)¼oà°ÎuyéáyšA¦’‰fI³b,PáQ¨$;šòÁëD}¼\Ï®ïÛ5iªdιһoĹ˜l|S/g±âb[  …•v‚|Þ¾i8½~èØà6{MÔ7å‚‹ºµ%¡ ZÕÍ(QHZÌ2å#šêYkÖ¾’¶g“§å™[>ÔŸÏ]L©…G¢˜lH¬<©p—mG;u"³µ+Qzh?9ï/ßãÞ6R¤åÚ‹„5L<îWY#S¡³ýÙ€µ”´CB%åòÑPÆòtGKè9Ü õ LdÓV“ùï ëý[c#¨ªÚ5RŠ&¬ÁÍì ÿC{ý¿qÍí'l«æÑÅ ¿*—Ùø |š?,ÅÄH¹íè«véIn˜€) , äéÅZжtª~yRßÊÍOsõ7ÖžO_ß/ü-ÂL¿¦x¥Ž®*€¶V»W¤cN^qE KÔ(u† #IóçÂyÏZŒ<Þêý tæ{ E‡Ñ–~.ˆ8Ñü¬„;ŽÂh|²ôîJÒ¦ig÷ ý&ØÁ´øšÚü0ÿu©´~[xGïRó…߸Ò5ï§Ù5Yt50¢¹7ìs=dÛÅ)RL¥aÆNP‘ëðl|ÔùÆé³Cok×ÃO±Å-3©i×Ã:µ3m[àk9.­U¶`ËTæCSÌ’ 1‹]ø‹Ão+) & á P«’5ŠþÀò@q±VÓÕÃícƒŽù»kÚ©‰è$NkFPS6î ¾{èÎíê“îmóÔÝA]&àԥر°0ÖbÈ"*MÒ,î6ºì^IòŽöÙ¨éÈ, `¯JæEÏ™U=“{|X$`å(¥°Ä2-œæNÆ}+CXÂpÙHËŽ|Ûi•“ìTiT O£uŒvú]ŒWÀNP—t¦ìqë‹þ÷ŽÂNh,¦J¦‚7pôT;,[‹éȃž§‹|Õ%UAEˆl¶T·GƒHâ­Íp‘Ïî>¹7ãàƒ«î{t9 Ã# ¸@½‡…T…sõðµþô³Ïx|é:›×Û¼~ö÷çsïΓ‚Åb­ÊàkµC}â¶} R+¢Sk´ZmœC-L"ØÊä™Ê6:¿Ì¤,Z…âÊÿÖ {€¢´HU­Ö¨‰°^W1¢윛>è5oaÏ¥;Ë ò—ÿÎço$a‚ À@õ.wfÿç?*ÿS‚oî*-Æsâ½8w˜•¼üºçë?¿Ò¨¦3fÏzáU.—8ãÔë˜<ÝšhÝQ¸Ño¹pÇB%˜Œ±¼×ØóŽý0qE»ÚÌub0s+´±õú3N&…ý”ý}½ç§giÓ¾žõ¤ÿ %_ƒËŸôãÅ»œ>0-_˜,÷`lçLOÐ(.a„=‘¦Å²³4‘Æ@vèíæ»ˆS+¨'ú€ÀÔhƹ.ö§ˆo&¢v(ïÕ\Ÿ]'ý‘ÿ<ýéë¹(¥ªŒWÅüŠ2ToŽüؘÁ š—¿ëÒõüåéìHXÖË@b$Ø‚1‡ÎÅKðÆ(Op1ðL£¥)Ôb Û[Ð%jŠ^O9ÚEš—“¹_š¿S]Ÿè¡ì¼|ë|ö¿}žar¿¦™û×gúçÇ^Õóã[1,×Äí…l¾SAP„ˆG%qþxÔoF=µ÷´¥tq•É£ŽíJß%Áh÷vgäðbZv×9´òèíÜËD%†ê)ƒ­ˆËŽÅ©¥³×ÅåMþÊ=Þ3,¨%àò&`!â¨ÔØšÝɪ0€?\£¤˜H½#‚–†Q^4&ƒ¼É…·{%ŸÕóÈ¢ÖPÚÅ%ÌõJ@[)cx¿1D]‹®dIN©…Œ[Ý›!®RFiCУ¨>œ"u|369¤µ¹€rR,Ub*w7b^½‡ê+ÏßtvW¹'yw…ïòÊౕ»¾g“^’::Cö.{Sý¦½¡6Ô­‡ÜKÆ€_›Ÿ4Œj„jÞ§5¨™9Ù6† ìSãFNŸÚ·™×ûǪZ&MX}NdsH£ÖðqÌ{ÌN¦V46ûÉ­ñ¼2Ø(;Üf8GLKyÓ#,; sÜU$L~·?³žoqIíe´aÖa(,ÛÛÑÂ}µˆI”Ð"ÂEþ  `•£® ,ûÝ´§…ùXªÐèr/ö½5 k8±H¯´"8¤"Ÿ¸¾ö_ò£ SsœŸ}¦ôq\© •õ¸ô™³—é{eðÇ&ÖêPiJ%¦Æ‚¥ŠÄpÝ|¼ßOæEôHåÄg‘”²“<¼J÷(GÒÔmô–x—DïF¹R&¸bW%í l¥l$^樀«SÄ6Ž @Qõ¨#óª¹4H§HwqõmóA^¼ûꫯîrܾ ãmÊumëÕ{PDÂ=hŠ"þaîƒ_ÿ¸Öw©ƒk½^XŒû¹’CÌüÎç£}§“?½­¢A‘–§Zry[å=ŒÌ»ÏܫвVûøêHóƺökôShœ\'ˆ”’R&-1P½Él(cñ͈l7û³!~aÂúdªxýºÐrÃý¹ÚÂç9›3‡7Ü•¸š] Ç ¬X¾×Ü1¦Ñ²sKl³d´kg„`#}ޏ1˜T©_5W•ïõyÍTí?|®üŸWþ¿[õ¿ãêŸ)y­±˜Iá•p %©g¯p1麯£ý2ö\[_ Õ>ÏÞgš×åì ¾†ã| Ke_{ÕMÐFs ·µÈY¬ ¥ºŒ5hàœ±øÏÃá¹ÿéšOtNQÞá™°¶ÍîZ)Ä,…h´…5¤TøÞd=k-µŠƒÄZܪty ;Êô,б7 ¨…«Yl2Ðtïüéå‡îç t­Ê3?ËvX+é«RÁq];$é$L$Œsbœbh¿h–rÇ|ï–Ôâfp‰b  ìsØgȾóôvþ½ÁÞú·»µNxÓPÝÂÃ*‚3+L-Ê$ãævu”HC8Õƒž,ÇË^gt¤¡Â˜ Læ)¹È½1f"Á &jg&¨¥¶ÂKÚ ED) ¶/‰^§xd09`> 1Ó€Ò\=k,²¦âVƒÁI—^-ŠŒQ´Z‰]¶ƒ¤ ÏVfoFVD+h1²†ª %Sðê²>büþ‚þÕ ÚÊYõ\õ9Ÿ[¹¦ç‡Û³^{¯¿û|?·ÿÛñë—6”ÏÍø¼'Sy5Ùp—9¢Hë0,ÔÇñââÛ}ßÜÿöý<ÐÔÿÜ—Úæ ¦ã¶R©ªøã\Ì-*rx@é°P@v¼q¬ÄüRYj’,{B4'¡‘¶Òõ*¶‘`Ü€„$Å£.itNÎLmev²€Vgyúÿð/»÷Úß&¸iO”WwèÅ @)r, ºdÍ’®fp@ÓÆìµá ÈÏ8% …U |$>5‡xºç*-ëÎOßîçoÞÖÌÿ³”ß3eÎç󗾃¼¤/ò¡j¤˜ØFf‘†LeF±1ª1,sNÞ( U¢º÷P¹ôä‚gO¿|íæãüp¿µO±j Ãêz™è.}šËñí°Ó v$U A &€Y¹øÄ¤ TÐu—Kµ›ðêF«³Æ€NQöNX¾]™Ú\I|qòjMÿ¡ó»bÿ¼àgžS!3OŒ o9XÎúªå²^ü|DÕYÉ]#QsCO×âõëà™†jÚ ¤ªMkôà§…Ïjš,ݲÑ-dEŽnãV¿¹@ó ï%Ü™“¾)JĪJšò¶^›²êÚ‘VÔïKë¹ÅV$x,ì´Ò®u/#l”ïx|§½Í.ÝËa( ‡n†G0¶6w®°íؽâ<¥~j}’µØ +QSάØ@š ­ ÔzšFÎCæísöñjuŒcÔ„u©’íº(±Y6踴ï;½‡÷?|½>í&M¦igL¡wª²‡|%>,CV$[ý]R0Ûvô€™¼/§·Ç²kàAÊðÙ•ˆ¬Û•fvçÙ•1k–Èõñšo4!­ ðÞÏh’IŸ{{F_Ð…¤u»÷Ÿãö}zIØÅ€÷@Uhµ8UÌ‘OA+Œ4BÖÊÖ­@Y½h+lcJzÒ•&4eŠ™P…b¬F„È)…véÒ j£Êè:¢L»{ƒV˜ÅIÐN¬Û5ÆI¦Üƒ¼{šb~õ?÷oŸfÁ@xweGá‹?®¯¾8ü«§w>‘ß…z´'ÇO/™¿]Ùüõ’sñ›IºŸŸB–G<"¾«¼ã“-Þ{Ž q?Ÿ€©ê—³óû´NXÿÂ'ëy«=³¡jͬm®Ð&–A®œºrq6ö>½Îi½Ö½¦¨´QóÍlÉI1²DV«—ަÌÌ÷â«Ãå»"°[¤VˆÆ_IâQûvGzÐ6{jµ¸bFrfèðî³ïã$ç¾Õºv~ô|~8çtÀFƒØWT¢º%G}7ç¨í¸5YvšÔõ¸¢;÷Ûé¹ê=¬lw• Ac=r0WŸ'zc–º0áÒÑy£öb÷¬;o#E´P ba? +òóˆfl唎œ®ü¼GCô‡cîÖüþÝzû‡óןü–Þ˜£`i>'¹îÄ”ÖÃu™üÊ«x& ñ’O¯æÞuŒsæt‰Áô 04gÙnÉ]ë—*rqʃy¡3} )»ÈÒ/Jß|;Ç=iµÊÄK„œQnAßÌê²øÃ·Å[ê†ڂϱ´*à½_ÕLàb T rìLÑH¨!Æq‰À*hš´°É5•’®R ¹Õã¢+q…JTæ¼.<8UâäíÄVò´Xå—)W?U#BY÷„kš÷‹¹r=R£ºÎ²[§çþÑ5÷µ)(X±P¡Š{½^p=9ÿÞi×€vâ ÿø(s‚; Gxƒ ×:jUDr=UzùÕÁWÇÝMPг¤Ø¡„°¦Ó€ER«‘rÙiÅUå(V¤ªAâDÑÍ4»Zk_H^Ù>­–‹ºœ 8v³*9ÞΉ^ÙL²S)ª Q$_ŠÅ,Ç©2öW^JEÍoöáÕ+F†N>—¾O?ŠäøÃÝ–¾6¼ “Äj¸E‹cfýúÙ~ºý8 hµ3WWýf ª1ÞC;Ù&?5È0ª£™U$ÉÑçcó°ZÕTÚ¤‰,Ý-Àä³$ HpY £ÌÛ!ÿ³©–àJôH'êc­aµ%þ± Ð1‡å½˜ÏíFxHÛx’ênuk ís8§\’~ý¯±3{ò^yœ& Maj»wÊ@M¨/{ ¦b)9d®æ½Ok<™^ð ,>Ú²ùåCN3œ3š;MN $æR•’ùC#Êþ Á\®ÉqPMÀÂÑ4%“œ1ZÉ€°£)ÇZҽ؅5®5ÇöHÍŠYZÄ&—J¨Þál=îÍ¡SÔ€&‹J[l9Ñ ’ÀÄDh<jç.Œ DÂÉ*÷nëùk½®ù)VwsI„íKOó¦Oè×ǪáT€OJÃê…Þ‹ëq¤æRHÈSâÄ…À7bÔñ'«Õ ´wMQ»Lëçö\Òœ¶ Ê’´X7B-N¤Äµ’¡!ƒêÜ8íŠ,ÐÖsyœ *Å(ñŸ‰ &°‡Üð•×Ì*÷zúê·SÈÑ.£ÄFÚ&MÔØ¥L í:Œ0–0  Œ¶bÇbÕ|«8þàòó_îöúÄxzðT½uǯõh%©Uv±F!y“a|îÚGôúû½ÔVæyœÉkïÇÖn\×2'¹EaŠOà/‘ Ó úÕ¨\ï.ýënéÌÜ;¹Ï×~r¾¾è׬s~u¹Üù)¡„[u´]€DIl{Žƒð-ò^¾rù‡`¨Ê¤»RÝߪÞß“ƒ|ˆä™Å%bšžnU+ "±Ñtî ׭­—:0üg®¤4ÕiÆÑH ÔB#ŠrwÜý…µÑ‰_1¡·f½>šë¾\•¤H@-*áå²FS@%CfÜêÛÓ< c\eˆS£òÍ×9Ä[_3ñ M!&’¹~§2€þY"&Û±{LÅ0èJT«^Ìül_//gO¹(Z eÄ`¼“¡¹]Ýß?•l5oAˆÍÌ œPáòí¸QËö¦ŠĬêùÛ½Îù¸ÖSzãz„;ŒT&¢\yg ŽÅzëëÄ<È›o”¹ÞèûÄþx•^wBÝvto¢Î•SȳÁÜ|ä Îãûºù?lñ¯úÿ¢yc6ëg*ĨfUÕg€£ @œ¦56àØ Hƒ55g)+Ô'f–rÎ9a\Å¢ÇP=WåFS–×?‹ +,µ’ˆ,K@’ŪÐ2TÎsjAL¼,ënÕ-+hf‰ë¨©Â–\Çæ@äð€@Q¤#^õP|0dˆX‰ P(Øò¬š ’qUngÈ÷…Ñ–nL ö¬üGÅð¥õòs¦x~ñÇìÿüþBóÍ LËeeåîÇV&äR9Á´ë¯Xvì®üx ®çãw<ïù±ç²ò÷[¥%@2ÒÎbæ‡2 =0DiSE[…‘DE,AÁ㡊䥲_šb¦•ˆÒ¿uß^ ûó·y¥Žká+`†ûr4 &¾îÎöö©ª<åÝÑHGUËpÑ«C"ŠÙ&D.Ðd—aj†àF©RF0¼IŽ<𛌢òMd A+¬3ï+õ¥ú„#=ÏŠN™é’ÆøÉß(ª•`@•é ¡È! S4È©jgzõ!.nMà(Íy®ÚØêVÎâø¬¿°Ct=X´nBiEäidrxÕõíÝÝ¥ :*”Fé5IÂn„y-ê³(•WUŠ*lâ‰bD&SõûrîðKÑ{_¿m«P+Cûiýµþç!u¹<ƒØðôDR”ûå¤4lWdß\Ôñ´Æ:cDÛÉÿÎ5Ò]?~1Ÿ‹=¬ÃSÆÝ ºÂWP.{_Q…JìON÷)[R%õð>©8&ÑMX`ºÛ¾$ &e†¢D’=¤£.Ÿ5îyñgÀ–ÜCÝuÎnÀ‹æ@áÑàCå’\6ÁÐξ¼pmÎB¦’ ö™qˆGÎ ·]îoèšýhwé줴ÄsÄÎ:³¨LƒÐ`Tä´›òè$¡Ó=ÿ0Š-hÔÓ{Çû[u .XªJ(ôŽfêta4Âv$9\¶Ÿy½]ìvK² `'óÆÔùUµèD(€{Ñ&9ÂÓ„²ÔºÄö½"¸Ù9è8YÙs9V~sͯ÷û|ÑÚü>–€XËi×n;?¥+‚m Ðõ²¶¹¾xŠY±NDJ” Pkªöåœ}¨³{M$u&¥OÊÍÍ{ξJSny°81Q Qkµ¯¦”Dd:mÂL!EiQ!z‰åC!H­½:d Ö˜qÏIL•ê;¬JáóÊOôð^@ {Þàçu>;ø«—×ÜÞ#½£ºÆu¢Ôºðz6Ò|‰N·_ãqòrìö^=8°½g¿.&¸3>»Žî¼>®~ÙñŠþiÅóª‰ìÛÉ8a*ÍutÄßâ5‚5Úíôìƒr5ö€ÉÇÔÖ2or¬wŸ™i nàLèsv6,Ô:Ø4KÔR‘HN£“PêòpÎܨfQöe"#Ó”U©p5W8ŸXȪaÓ«¹Ï Ž¡’i¾½ÁßùéT/ûï\æ …«kG‹ú„]i9 Ö=p‰d†¥ob¹Jûß,*84,äZeЩÐ%¬„%v²$}b¤zZƒ]h ‚=ëáú¸Þ?¼QJ%¥ÏQ2k-ì(Þµ­;šÆÊ—ÇïÅs»ñuõø±Œñ íeŸ"`Æ×å['ùLãí6MÓì  œ»e·‰B¼?<¾­ ðkGN)ÛrK`0 fXÉ%©5˜€\`©Æœ/šCo<»BÝ}àB¼Ü+®Lò˜<#Ú–Š£U|Ùà´u«G¸EŠø]æQé›søŠ÷Oÿšâò,EiеŸ—ÍzašVì'WbAà‘â—N8܉´E‚3«ˆ.ZÔ”žû}EÝÎlà4@óº¯øô¼é)ù²†C6vY)«„³ˆ,Éëž×yš§®õFþåc=Ïo‡§ûŽö¹4?"Õ¶Pr¾#_@ƒ^h‹Ø¦è;ÐO¦J`MJ¡gW«ëÍ„Rvæå%Ã.úk—ɻݳ×0©Ê -Œ4Iée€ˆX’Ñsû³q®Z¦e¡pYÆtóϽñëqÄ—¤“­[æ%±/)bWèÒÕ)ûìý¿JŸß¹ë˜/sÓª‰ë-‹ÒÙÔÕÜŠÐ §L\DvµíŽðŒGìµ …q]CÞ%Šªºh—:5qÇýD„¸GçJëêIGfÕc?avJyøNÎÀ46'¯c å;µT¡Æaóîˆ]\Iåaã«Jc;`d:Ÿ•ž÷·ßxfFÕEйN†9 Ê÷M¼M­ÃnAßLæxUIqî™±ŽPφ%øžoªLæYö‘s¼Ú sH |Y×mL9&·GQ¶A\àE2ÇJ”(XipÚ”#Ã4ÍÄ©{­ÄÒ$š" -²[f”a–ngËĨ@T –Nb1.L ™¹¦Ð˜?dwêR>`ÿ Ç~µ‚r‘¿dF~³OŠfÿKýÕ¯u—ê ?Ú“H¨„0ÁÀì|/‚]ÉÀè­j“=À G\¸rPZI@¹Ü¤Âè…0Åšöð7??¼£@û•b"jV@¬PRáfêÕ¥%͆¬ M#ÁU¤‰B2³¤À Ú¬c )IÚ“ƒl; ^ZÖ•R=#ÔlJY§3‘³ÿ‘Ö M=Fo¿Ò§:"„!"/¨(xA¬+f†Œ#±õ‚/Wß?öõ“ü©ûµ~«_˪4`„P‘ -ƒƒÕÔw½ ì‰(£“UA§VSB@ƒMaÊÒÀ ܦzs$Hèç®1•Pˆ«iÐþQ_¦õòN¸ '÷‹ŒSê§Þï öÙ=3‰ŒÝRð$õ!Daþ‡F»vü1ïý,ŸìÐ0çvÀ£'¯–ËnOÙ*8²áð´Ÿ¿’ˆg¾Âå/Ä\W3ñ~Ýá÷ö¾ŽäÐÂìþݹ]a#gpyüú‡Óã}*€1íÎNãªNä ç>œC,Ã9[u±¥ ˆÜпq:Wþm°™j03G"„QÛSô¤#+ÒʼnòrÚ:½:k€vÜlk÷ÂÕÛpÔ]çՀɭ™»Êw4ÓNŒ UUÅ: ÀA번¦«X'I¦®Ðèb>à!å2¯Iµð”ÚºK7*Akñmku SãB?< ƒfN÷c¨†öゲfàrŽ„@ ¡*PÆ2 lh³—H,kqX •ihlC•&…4JØ|†ý?ÃýQ0„CЂ$£±Áú hšÇ³¥YÊøNÚ€“»äçú`ć•Ô`„”XñTײþ·EßwÛî®ü`XóÄ ß­®,ÐôÝô=ÚFòí´*WÕ û0!à_“ßhöùylß—År×òŒÃEË÷v®,è ~äÝq<º„ H¦•iF&HU7kز ÙôAР*€ëðRÙ(A-€ËqU!!IÑb5­|¦ ‡ qÖ!S‚Â)šìk½ vz˜”«7Õ§ýãË÷—tKШw¥L…!4ï¾)Ò˜Þ– …(5¢ÕÙ Ú\\UÐ ­¥H¢ -cP訴%c…á\ݬò¬.]?»»ŽÙ¬Q;éFW:ÑZ^Ö›yC‹H).Z Z‹ "H¤€ÑªbUà‚ rdAfšWj¢Õ’SfÉq{:ÝCfò51âðÞ‚´„¤³€+ž&ñã¨ø“ ‹Ùlu.3+NíïÒ‘š`<èß%'<7¨ÁcÅWbóÛ=^nΧ~¸®`¸f5ÏNgS׫«6å}VZ¨eXl¯ÝW*öt=xÒ1ŽÍ„²ôÞSáyù:>v¼%‹Ñ Ò¢ä˜2#&ÚÖjNF¨†RÉ4GóF¥)^¥0Û| YäŽV(3s+©“d  g¸ÓáC»©ðýh€È‚~¾™·ËQA2l€L¥ÂÞˆƒ0ZCkpî!Kðä~q/Ÿ•! O…浯¬ y íœýšª!h¤:T•“gs“bAЇJ²žÅâ3šé¦zl$›µ»×Ä~>øhÃ…¾rñØïTäUŒÂô󾃣XÌ-À)$ÞkèS·pg<z#ŠH5Ó…7kUx–y…™ý|b»½m^^ ¶`|“%ȇK‰P†—•‚‚„Kz¬Ÿ$:?^4u?ä›yzt ^Ô݉øXšÌŽûµöW~»BQr_¥‡l oÉùØ6£+ý‘JeMZÌithÐnÔ¯F’ÛªdÂ"K&»ù7üÞ÷GP°‡0^,#ÊšØÆt@Wr„¸Ø‘ì¹8GªKN¸åKcäHh¶äÃ' çQÑŸÞ5ÿµÞ'wÖå…Ïí²Üx÷)o:’Ò*ù{¿[1óOfÑhä?!Uö “‰â'õ¦"8éÔº”@:É’tš´M ”Œø7:—Nù–$Ú…1hSn‘ŸÈ•ãZ~iµMÔG˯¶OA¶”¥iŠ)ëÊlðm]¿øæòè6TŸ-–ëU_U´Ô9ì³ãwö›Â„µÙ>´gá$Q‚…­Ý÷÷õë£Éó¸öyí¼~À4»N3sskøÝŠ ½Ú܇:?“^Ïì,Äãæ®iìöl7R#çnÊd×b»¯_ö˜Q}Ÿ?ŸŠÉL_u»ÖŠÇ!ã®»°<z¤Üg=×}Ê¿Ð6QÁÿÆÅP]<ÝÀ…‘áÁañE\vŠþªóSh#6€À¥€…±Ì`›g²Gö+zÂH,¨‚j@ F’¦sqBH*5êpæ-‡-ÅflËDÉv%Ë.J( ÔÐb¶S„D¤ $1CiaäB¼ "Ó™gE×o/oTäh¢ 2­qº › °Í×F7KÖq„õŒŒH€Qƒ¯Š Õ£ù«f‹K[u^î@cªŠ‡(M@)(+1‘i˜Â)&–´‹5Peƒ¤ ×¢Pc;0cý¡kꇚ†ÔÝF\+l13Oƒ8!¾Nçwâš__yTWÇPÔëqwp¥Ò‘ÍQÙ÷ìõÕd!{¼F…+É÷­Á•æÅ2I’\.fÌáfIgü¤ZoLöÓ_Jb×·ü,­¥ÜH4­cIÊoŸ•s|Aõ~m£€ßµÝ¥wa⩨"ð•D´Î?"M81É ¶kõŒ›¤b3«=Õÿ~Ì_ŽFÅH+OCÕÌd3îÈ ƒH»,#åOï»LH—F4Û|©gÌî€Ý(´l\KSD «s‹§ØÅM„–*fY°X[rÆ«O4²ãv”n×wíÖê§Æksñ´ÓÀ倕(ÐNÂæøWéI›Œ/í ¡TÑ¥‰‘ÑâÚîköëËæ÷}7bb‰7úf³D|ÆØ41a±d%Uuêk;hïé¿<¡J)p(°Ð€¦ b¢æ†ÒíØ·œE¥´ ¨¤±ðí…„yQRXRçD}Föü±WFC”Ô?ª h‚yYr=÷ÿ¼8_¯óÁSÚ]Åú}»v>åìÜ®iZ”[:4Õ×¶—ê¬Â¬ÐÚ”šá ë a —Ûã€öõ}ÅK`wŸŽ~¶öõ ªCß«ëx’ÊqUKŠ®æ¹²8 æÞd €‚ÆG[ËÛQÀ€F0Ô d«°oÒììœq¿‚ BÊËùâ$#&×Ö6ê¸a HÍ^w<Ósi'$ïÝ?3¨ÁÀ9ÔÃI‘o!„l˜v¶ç?ûv—g¶ûëÇÔG®ô€¬õÊÒ'£ú =ñd*?AN¯òI‹/Âa‡+l€¾*‡×`‘Öì§œ¿Ý³Ý­€ |ãíam`£*6q+H„B0‹ÈˆŒé¥ž°§‰7cèÆy¢‘;çâ<í¬Í|îÓ¿Šä×Û†åô˜Ïn¸f n è,µ'”Ã(ëîïÉ£óZ`£ƒ »$?0$Z„Ûußàö°/?•%½Ÿ·¯™ÝÇ_gI-㨖ô›åÍü/ÎGèÓÍÕîUðý¶l^X;I÷…˜CrëyQû)}màóÊ ”î>¸½ÙzÁMÍÓ©÷»Û÷ï}ÝÅÓŠÒ`±~‘‚éy“¹m‰ôAF oÊ/©tEÌ`#Þ²©Ž3ë}(Œ¥‰ŸÖìÜøõw#³Îâx[B ‰á {Æ«¯îÓh3PEÞʼn]Ó«A`Ã@Ñei6³)oýy•^Ï'ÿï¼Ú-ö›€®±H; Ìņ»¨…hÆ‚b € ©Â-l Ä¥‚Mf‡¦ QHÚ‚Ëž)ÂRlOˆ&4F’{¶îäa«¶ÃW€ è0žP@, /I@™ÇɆù-!MI Â+PC* ÇpD–ƒt"/Q¯&ççÚá ˜ñDyíÉ+ &Ö1ŒDÑ•éMËyÙ¿½Ù÷±·á²tx&k€ÌNrôE„ÈÑÇ †f§<ß-Åž{æ>z/·3‰×ÍïmßÀ{ãÇ;a±_®©ñù‘¯%k7#iÞ/Ý?úÊûþëÿ÷×GñÙ,¢ÙÆ¥¡ašsÁ¼f+“°Â×å.Ø+z†#ó‘ãø\½áæ Š7Œ‰‚¢Bó¼¾ëœ†8Õxç ¼¥™*á¾¢fU0ª–lÉCF… Ô–W†ø8ùÉ'ï#‰±úЕ†Âàše*”–6ùñ%,[ŒhMC€õÕPF¨ª)ÓéÙ&ÒꚇIʈ+m€¥.ˆé$»sÉžžm·<6ÉëßyoçXdш§ûÙe)ø0ø6}ôìïsŸv'¡\=É\!izvXìCµUì@ Ôð~Tß¼3ü(žýxZ8‚ TäJ¨úX(&טHÄŽcòÌ—evŸ^`éK‚¾å9œ„_UZ5_h8ÛUÌz“÷¼ADd°t&\–ë9_ídAAÑW-Eën<ÑV‚fö!”š¶©ã:hE–HÈ=éu\ycwL£VBQPçø@0GMŒd0@™‰ 4ù§ø¸‚Æ :tÖd)Þ,£|â*?g§Dbmª—>¨Ñsåt'D ³‚RD¿Úlfl_ E­¹®c¹ÚÝšŠlOÊg»ý9ÑÿlÓñIópÏìõ5ßÏ×&`Ç/Œf/_KÉ[…G¯ûâ=æuïáå’|ïç Š*EÉ€è¸-Ɖp‚Ìñ¤óŸÕe;„4h0‡<2|É/$ñ‘œ—/µÊ&m9žl©N:Ùò-®Ñëí·³UŽk¯aӶ∪=t"€Ç‡<ŠM7Ê62 ×úÏŸè‰S~êýB~®‰/ÈÂÓBÖïZS´îˆ¨Ëµ1OÆVÀéu“Ì +ëªúäçÔò727VÖ莭Øítž —øQoWÚùÈMŽÒÇVÔ¥Î=Ÿ¬DšöÑLÎÅ$Ö†öÂÔÐ ˜Ò¬ß ˆ`‡¥wg#aeeSÕ\2î³æF‘1ç­my™àfñ†-Û#«j;*CªûÊe¼¤êL~aïû%ÞQOâ±'+ÙßR—Zz²¯ìE}Ǧ4ì¤ë¬gÜhŽ%'Ã<³Õc|ž§yl2ü5Lq‹κ—ckGï" @ ©€~¨ÐBëñ Ši¥.0h åÅâÄ Ð¢ªÐ q‰UC§qO¯%ŒÇ!»kÒEsÙiWÊ&¯q4×dS4–,9+oLY-4m õ¥:å û€q¢„Óñ85ù Ü1Ò=¨ u˜»ÅÝ∣wÿ)ͼ(XæùÔW?AåSþìÞ<ð /è°µ´i2„‰Jà;{K~¾žûiø_œçñ•þøåçe:Gô>k4Ýùêø°¦¬bù*HB™{Ãø‹¼‘÷Ç Ýhš]ÇF{{ŽÎî\\¨ÒYñ7×AMysНªæE`1´@Ÿl~dW¬ZË ˆ-å<éFºNÔáÈÅ8ÿÈǶE!Äéåˆv¿‰pGÉ3«s ª€Wè?Šú‘¬ßaäî~X› ØSåìº>GM}÷w9:£V£wJ"V:ï­8ŒÄ<¤ÉÅ?ÝáGŠ—&«Èû†‘`Þ³Ä$=LY²ƒ²”[ƒªH‚AL‰¬„RÇL$S¢[‘© ußdš]LdJ,“Üû’hºÒÎNûååX;Ʋ ¸ÀŽ 5qBÜ«’LqÒÃ>Î¥ÕEâã¡t(c>»¶K.œ$‹=@~Kwè04‘ d% Åná;–gžèØ`; ÕýX^¼WScfçâ=ïðw¹üãL´»`æ0w·í ;Ú*VaRý(Ið8i4l꡼›.ïú௨þ+ð:Ÿ®Ì0–þ&´$¢ç½?àç~eÙ_·¶”ÊaCDÎ0Á¬g$¨«uþÎ:SG¯?VíƇ”#OšoÚ=J”L }ﱿ-ø Šÿ í‘̽«-ÁgT­Ö­„C>zëã*—LÑ(ƹ÷°W)«áb"¥;áIù÷x…ÜS8j•““D)؆àÞøÆðu&oÉá8ïhȆYö0Ç]ˆ-1ƒQŸº^ž×zÖÆìrxtp\Ú.©µ‚!ˆYëÁ«›Íç[¨ÉÅù)ÓI\x Pszµ9 ”Wçܲ^NаÇà|%Ò‹"ºË§.bQÕû³Úw;ØYGÝ™!mÃŽ‡wk6˜vds6u™g·e¿‡ÂnŸ’ýÂDZN: «á§…  ¡–ä<Õäxê¶Öñ¢R ã»÷¸ÞšQ «ãU7Pk¥Æ”êÑÓFÚ–d<±ÄèVµ¯ÀÅŽ’û‰©ËR¹ÊçÊ–¹e£Û×VMqÐ܉Ï>¤cõs:‡ÊÄÆdIŽ.[¨ËÓºDæ`XAý:o v•`lrœ']Ö  :˜EIwì‘÷t Wu^7u¢X_APµ³ J-vãõÔ©5ÿŒ»„/dl/l×ÝÞa'Y!ÇÝWaŽ×ëîŒCÆ£l̤o5(ç‘k!zW‘£¬8ä¥@'t"Nv`ˆM0p£†,J:ÁYç,ÐŽ»ñÆ^‡ŽS AëR Ýøårÿb”¶°Âjõ±eÓó1;*& Sö°WÚõø#7ØÂˆC”4¤${%£´²L@b¼a$½ Õ*ön¸”Ž‹r`…14=òb­=z^x=t€DKS­P–¥¢iP¥Ü•- ”´E±E#ÖÒ!–¨TZ§¥Ì„Aù·ÆEÅîvŸZ\}}™œ¬*µT™x]›‰sta¥ÚIj)¨jZb-RAA, ƒ½Æ( i]ºï_ŸÅŵ+<ùŽç¬ÝZÛy»i€fiŽ'¬ Ni©J÷Ç/P°AHG¶ƒV ÐjÖ&¶F©ñ`Çï÷ ¾Œ­‹E•9Ìn˜;“ÏÞ_jf±ÍÃçÇR[-ý%w¹¤Ç¡'_™;úb-o&Û/Q 1|ïEÔÚ;Ú7ęە¾Ne&T톋„ÇÑ í—>]·"¨}²:ÀÅ­ôIU?Ï=å2Z¡%&ž„£ðàoÜÑã›k"Q d¯”p.éðˆcC]-WrW½â"M˜É†DCí|¶ ‰:Õ1Ýä/GÄ•F¬Ô!N\såGöD0<½ìü!Øœý^6pÕÊÅ·ýè«i­Ëbœ*7ÁùMsAHfÛ´M8•àÁQ‡#q»ñµO¼°Ä—®¸M²'åT?¦—ê©däà@]Aô3N£ª1ºÉ¿c¦®ëGW8X”ê6vqÚ;FœŒ8eŸðÍ(WŽÎHâAœ«Îµ¦¸cfÇ:W‚˜×†¹¼ö#äBÎK_á.$å¡Ïd>Q™flS„E]4Eª¼L´Øg ]¨€  ˆŠ–ëÜr´þøY¨B•ÂmmnÍ4™îºÜÀ‚±Ns ̰,ï¶–5¤ÖÿnXÿ¥†ëbéˆå˜Ù‚T!Ø;rÏ HYÜš¿SçRDø òÂ=tçñÎ#Í×r4¨c±'u¾{ú·4÷¡¤™¼#»3Z³6SÛØ{VüÏüãQµ’Â&?j^ζp .è¢ocÒ¾üÝzZª‚ˆB Ôg£Ñ(h€XÄ¡$Ö'žoE^È”/NëȘ”#OîÊÙ§Š{if&(SÑ‹†_à%hM^kßœÿ íïûüÓŠ+~éU‡ÚGØb&Ò˦ÈG¢À B¨6ÉÉE51 ZAk+S°³KÜÀTRв4/nêຓº[Óòâùâ™fÓ&;ã4¤ºý‡¬ÚàÚ\:­P.îª?M|K›f °9®j+‚@Vs‚ IÄËî{8Uªáß¿Àa±&.,eH±^QiRªC ‹ê7Ýr\îϾ®Õëeê™.x'€jÉáñµûÌy7£ŽsJC”"à7q©b[?÷Þ,^žp‹á^jzñóùÜÜûfÂ[á#ýh¯×ò¯ö÷ïðºÚó—ßÇCµ©S…bz¡hÆ*©À¹ö̦’N ÙÀ¬¨£yæüÔÇóÿbþñë¤1ÑIó†~ö8*ƒÑÒpÄæ9&|hõ@×P U“¢*@ aP±DHQŽ$õç€<(ö½õ§??†÷zdÕ¶(#! Â\*¹ &P ‡ˆ<ÏÎÞŸ!9‘ `o"@‘Z6c¶¨»>ؼ7Û—;^ä%'¤uµ½ø³åÏ'ÄŒ1£¬&>)¡Ë:ë“úy-5!?/¡÷µ—å‚Më¸Uí`?îïˆï/ÂÞ2)'êƒ xðß+1Á·¤­Œv¬ S$Åkøg>VÊTP1è d¾o. Àª-öÀnÞ5×®±RõZéEW>ФÍ\31*3æDy"ŸW«92üæt‰È0±yi‰õÙÞ<äåP< …‘ËbÃÄn.Æ>g瘗šCš¶cÑö†8J¨ã0KF" 2°èHB‚ àÆ5æQ•Ó)oJŠÈ˜Q?8ó€ò2‰WÚ’ÈP‘`+·¢2¢eûŠ¡ÊK§P©:hÒ‡3ZŸúH…“†ç%v« »Æ„?¥Ëš*”ÓðCÉÅFoÎp¼N¨®Û{¢×°(* ¾b×BX»îZV–xŠç~æ¨Ï¼µ¾}k¬'Rƒô¦X²Sýþ„ò¿zG ŠÖ¸N™a‰?œ‘v|¹©‚9ë2¹O4ÝL&K‘‘~Ð¥7©Œ!”Z]éGNÿ#•:«À¡nCôxrËóî²j¯»¦îî}z*€ÝÂ'ð~x]|yÚŸD¸ºÅ i{z2§8>ÐyÁ¶^Ç5vËêæKÎììÃË›´S¸kw•efˆŒô h§«Á©`bÊ/…:Q -öÙ-1V|¯éý^xvä@©›æfñ¯)!PH\z ãe{6™¸ŒA]¶{yü “­ÍwºRUÖ”°Îb©P"Zî1þLv€ai¿ýý7Šÿ¡¡e½Æ¢³`Hy ÙãÞÚ GJw¤Kys:?Z½p7稖êJ¢ÖNÿé÷OŸ]_Âëpl¹óÎ…–(ADJnœ†ªáx õ`I’ «J²ñîòÐÅ2Qd …¹¥åE@…]­v™jÒ¹KV-%M›Åš @M³iºqe]ÏL[\ÞKš»æ( $wÿç篕Ÿ㘎ÃÙ¼jØì±¹2ߎòÎå{|þyâÇáO÷Þ«zÏE†ïž²è#¶WtZüN»±gD#l•0!%ê¨Ö£/´¸¸'±SižÌø@â¬Èzz3³Z œëDÖéL“òDGù;åï±éÍ\ÝaÜH»‹Ç“JÐû´rÜé¹|hq5DU¢-jýé$Ð(еÀ¤‚x:ÔÄ_8ûâþy7Q~2"atx°1 '¶»Ÿ‡£]¯;Ê+t+$ÃjØ3H!² À!}´…ðÉA•—.vg±KL‘×·«"H\$°A“‚ ä8ÐiéÄiÈY„Šî¶ Û£Ã,„ QëgžtÄZëMAõ9&ld4P“<ŠBŠ©^#¸ÀV$A¤`¸œ²—·û“«Ÿ+îU4§‰R™Y胹ùìÙ¬ú,Ô §°HÍÌ*@ƒyllW÷ºC‚h](2•$20…º¨ ^¿?îÞ)£{<–­V±±ˆµ •-Ï¡Š{O}ôô­½õd骪x\ü9´¥­?ûÁ¿¸(Æ,*þ_æÛí×Ýþ5€¿Æ\Àh_SY`9óÑÝ>Ýp)­r¬EűÍÍxIP QåLe/^­|_“.~ öò0`t•’ÛâÁNS‰u•­°3=”x‘òwÃS6óTøÄBíW\mŒ,ÑB-#¹IÞRNk9ƒ°øÐ7ÿ^ ‚nììŽÜŽp/¼ÅéÖÉh×f0”ã^¯°N|¨N‚΀ Z†/8Õœ¥:} ê4HÅÌd8òóà4ÚqÙ i>랢zî„KÑâÛéô:Ʋ:á¢ñÿS7öóÓõJGTÔÁ€lÁÝr5¦+ÌòõïFg !ÎޡѾë.ä=<3×fêýHK‘±4UÅIŽ,bÅgØe°u†d7¬2€Ñl-—Ç´€ ¯·sÙ4×–:¦oÿ­}¾7zn׺EG°.öRé3¹#±ã·qNa½s ÕL3mnf¥Y~²aãºËv7ÂC;üP®è„ØGI(£½¥<&‰=¥Î6,†E^Jvá1xÚi!˜é•(¢v”á‘”½… ?I46Ç3¥ë-£c®ðDb„#"Ìø+uI—˜¾ÂsÊå’ l.d[‘ BÔ‰jÊ ®â>†žO¹gsç§¿µ'Ç{Ó°ñçýÕà5Õh8qf#/ÒœÙåF¹µº6¦5eÙE­8Jm®ç²=›ƒö¹]CÎ`g5qΧ5´½@rR»¼Å/òQÞRÑst^¾„ڸͿþÛö4Uµtl¡Ë¢°B9špÒ•Ù­õèg¨ó&6{MÞâIÜ ( b ù²9Ê'$æ9_¬3Ñ#f…^ ß\ŽjAî‰ü=Æ?-¿£½¯…`(# ÇZ”Ū8Ø.æ0$È YkD²/wV{u5ºua²g”hKk®—`s¶6IÅÃ(êbÆ™ÖJb,)Z †(½HPC 0Âã0Lºçìtlí¨í8õ»Ù˜®ÇyKü(™"×Ü\_N?:¾3óÉÙü¨NÛJ¬j¥k‡®Ç¹.z0 ªtÚtùÛËKí8CqìÝR—ñov÷‰nn¬ñ=¯íØ7Y¶Ö±B‡ƒ¬rÃÆ{¬j£žiÍ>­Üãž!zdÆR%“½/µú¿¾<öúÿ§n»‡xº Ø7ï}s\ÓýöaÛWÚ`2v×i'mÓÞF5ÒöÜs2 er»=­¶÷º¨»$jÁ1þäDVç¥Qå7mØ4¯’?Ÿ¸+0³øuºSVDÝç*$Xaë0(á=M˜ '@a¡íòÉÅqÄŽ³MÚ¬êÚ=vÇ(Q±u!—^äû6Ò.0(«QñÀ@boé^÷VÔâkW(†Kÿ-{/É ÎÔHC“"5‘GY‡kt&7Ùêj"õïÚ¬Ëm¸ñ%¯ÛKZÐð’Ü੬]žÏàüãèùøTR% ܾ*Ï«$qò²×÷ÝKn§ýRù‘O6½º½aßèÀMéFƒšPÜ”dUˆŒp–ýeq}†ó|Ö<‰Ñš ¸Ÿåô|*"Ø ñ¸&¶Z±;IÄ}LÍ‰Þ Ø¡ 4°"šÉÿJâw Æbå1ÃêS×ï¿ÅL=¯ƒ–æ6ۊ£ ¬T³ó÷Éʂ٠ÇwØm¸ý¤žÁ¾G%+ Í{%ÑÀµtÕNÇÍ¡T“;LˆÚ ¡SˆÊ)¹Ãä©TòilkFVÀVzKÑ¡ ¼=+óhŸ:|ÏQ^äUË! ÆS|7¯Ÿ?îß·{ˆi†1£ð Õ Û:ÒIbŠ ¼f|ì ¦—è†$25¤Ô<3Ùôν¾º¥9NµÇír½fŸ¨JÞÕ~¼ÌØ÷ÖFÄe¨+þâ+ê§G~µñ›ÚE.èÔÄú,kv$ïr-öS6Vb`L×(ƒÖ¯ˆWC·š* ± ŠÔòX"»:Ú7_·®°ÓôX΄÷‰]Úƒ]í5[œœ=Rõ.°æœÚÞ™ M¤4íŠ-6[ìƒÔhÈŒ¬bí¡<ˆ"K‚Òstësß+úQ-ž£ñ§™×º”MÖsÌ F2G0òv*áªKhÛ ‹+”¤ŠšJ%I„P+.É7á y9¥ÿ#~üöÓ7kÚÙOdŸ(ˆ¯v½pµîS÷S“Ó³ ÌíÏþÞ÷Ïé«Ã¥¶øð øOüU³­”Ù¹jTnÀVéÄŒÜFBÎ$·j¨ÍÈ(/z¢‡reù†Tù_^„9ïlÆ´kéá|rUA´ÌxåÙâf¦ÌCoöç66.¼~º¯5÷ÛøðŽýoê­(‹K,‡:Kw©S«…a0N®àÍ_n½Yr¼¬Ê S›õ[ ˆ&2Ž`€E¡T“åW¸–×êH/,kK€&g¢ ô`Ö‡ú/íób¾Á½ `(ä%Gt–*Ã6çùøùÙÏóü_X· æÁaÁH+tì§ÚdùV1r3X&ÅÃ_4÷Ó;G½$NT~ù¡ÙÏ2_z|†³ÇÝ&BŽ5l^kÃÞÏ0³UÊ2ƒát3÷v’ôœ1ÏÍ#ë§j¤ `Ã^K7Øí”ÀË+Ê5.].² b  áŽãŶÊ:j´Õub*/N‰s0‰ûèž,ºÌR„ƒÆÈSmV[j\ðbÆçØ£ÙÑɨ-Ý…ŽâSx)Lgç]ùñŒ6Yyêëb žQ†‘ëE‘ÇG?ÚìŸÚçeu!3H‚H±o‘°$PÃ(6PZ„bE`Ì èÍ/õdóƒ·“hif-у ze£b#ƒ€‚5®±ª …È.gn äá©Cå—óJùêI]x¬òÉjoƱš˜Q ^DzØs¼yMÛ;êïv&ß:‡%Ä·Ùþ ¾:±£–š{Do'´Òr%´4:Ä|*ŽóßRg¤£ïÌ‡Ä ÷bÝáwÑ ÒÊ¡¶%Ò÷O{~™K‰P3;Ph† _âüTœFå±÷‚µ´ÄõŒé` ¨K—Ïk÷þ‘²¬Š³¨A4 Àæò ô%¯ÏUº—ÅŒšÏÃWüÊ]ïà *_0°ôcà@FËÔpÎAS·{9=à©é²ÒÛtµÈ¦‹tSI6e"ƃr"ògð3Ò™Óg–§`vÚ¦ëý[6è"_n,ƽW–k·!Ò+vã„”t7ÚzAÒÇ‹Æ÷.Ƭ®T‡ð߸5RÆ BÑIÊÓHkàØÂ[On†xU¤8bq†ÛìÚ™O olÀ‘ ~WÜü­‡ø¿Nû÷ÿ ùò^ÉHdο8yJ,s„àlÓcбÆÓ=Ó‰ ÑE%ª¨ËõØë¼ãÿYX¿õybN`qÅ] 潾®Pèb[•4¶Ûº)ÚkUzj@ëÑQw3Vé–XJÑX]¯K³Ò¬î¾ôLr5{L3u!F×B8€Ù‹:eÙ’Bkª¹XCÓLþ†å ’®rª;€£CÅ(Æzü^ˆ#\A®Õrç,—ÚqÅ U #£…ççÏÿæ÷É·ìîéŽAÒ`öÒI­”êîü*Ì×õ}ÃÍֽ̌t+l‰›tGûæøÛßó£4ÉçvÞú‘:Ûû"Ü’]Ê!ør·OÞE. ðFLCA ˜ƒz‰RHÃgÒ”ÐvX.¿ìtïmÈ.¬©@°WE÷—×¼ÃoðÎó–x_Zö(s´0g_8Ú¹ kÂûù¡¾ôïM]xmªiún¥™~‘¤%m:ÓÞ @Jˆ5àúrúÖ )™“‘AZên~£¢ëɼy§·e„É0oDLp k\ì˜ã–Ab¬zˆ˜EΖ•©Àd:îËaç°Ô,ŠOätø8¹¹ÙW€†HƒØhŠ…²àÚ,@ kܺeÀŒˆ]H_Ÿlr€.«Ç%e‚m“ƒÚœFb9µœ5è– áPb¢´cu#{ø²’#qBÇÂOŠNòßj;ê‹"™© ä>Ÿ>c*ö›ZÝR&2® ð»Q3ì›çBͨZ ùwÛn—ã²ç‹/ì®u³ìÝ™¾zÀøÚnÍþÂáŽ5­5‘÷ƾ0üeÿr,h»yÕŽƒ÷ ?HƒæÿB?p–cnŽõñÑP¹ny¤„ÐBç=åÖ'ÿßÏðú‰ñ-§î´6Õ­T=Zp/$ŠƒË©¬si­ùýkñ7kdÄ?šzNG*¨È¼’0ÊFQ”Žn_«ÊMÇOöZ~ñZµe=­hÖB©j¶ Ic¶»ßJÓGPÀ .“ùµž@ã´î'Ó¹pj@ÞqÞº|;¡j TÿjŒ¢„«Ýv” Õ ÊApœ­i-e¤™_¾pVè›6Ñ3•€‚€,7) *Ua^_ȹ4 £S €3tºõ¾W åØ=NÝ:×ø½!•¨Npã×\ šÑt>À³ŒÚ‡>úþÇÜo¿ý;Ïê‰Cœá»Ïó#ÂæŠ4„ U2æ1lë±4–Ȧ•i¨Ó}‘ÒÁ"Ù¦M.îëõ-7ߟ#ã.õׂ«/S ÛŽ)~äÈúóxµQ}¶êE«þ}ÔýŒ^ v¿»ˆ„s/2ïðÐËÈz q@Ÿ(jÏ0Q°<óp¾\k$'LTcZYhÕH÷f*ÒÛå†%JÄÞœC·áâšüùñ·¤ÒÞlã…¶j 3$Æ=åã¥>®æh(~Zø#•  M@*‚P0é›Gü§Ç÷ÕÛI?S£a«áœšª¹Ý$«¿ðZ6‹~s”׆ݠL=îö3ˆL/)&  œ…éÜý¸óº·¯ëÎñÜcŸ§ëM À D-Jqá;ñ:Å„D=¶gûòøÌjù°&ûÃD«¢Êñ}ûì8{ÙÆÚvˆ û’|$´¬ŒÒ4Í2õ@`Ú0Lj”¤°0 :ˆL$"€Äà€%K¦õ'ìKžWg½ÄgâÀ_oûîû«ál¥·¢€Yë ¯šcqKER5±2óä…å–ÔG6äÆRhAÜrE¯Z$/êä“Ge2âÌC""¾^6«ÑEUM'y2ÔV: ’µ`‰2Mi‰("e„rØ¡ 1x¤Å¤½ š‚ÂW:õH¥B˜ÞHkR§pr^Å\±¸v'º>7O0Ý-ï„¢'`¤7PL‹4¦¶àò.cÄL Äcv[â 3$ÞL" ððEÜÇ¢ö„y}Mü1wÕ®Td(äÜ À}ʪÖ²I>$z÷ŽË^Ôó¸x¹o]œz_oåIé›ÊîA]Õ³rfçö:Í{é|Áþ2°mÑswr9tTš·»íÞön@©'xGæÙžöê¦AôNæýyÑ7§È@> ¯«íñÁ9g˜ì -õ#}B£µ FýLë„&—oyfœ¸At¥‹CʳÝ7£)ïj–¸¬¥Pk8mÎEÖM¸kƒ3yƒð_ÍÇ*ÅoKtMj.–„ÕT†s¥°~²5Î4»Vj!Oå ˜zj!‹uS²ÖÉÐBÚJ7¨WOAQkRò•xØNµ’¤c}àdƒžæÓYgLG©/êÀÒ>—Îïxˆƒp±¶Õ0×§‡\< ZÌcIV=)–IGM4 i§žiáš h©j%¸ExèÈ1°“béËÓ75†¤izº!¦ ˆ°É¢Æ’›±Á´œ'0!ÝcÙ¤èb˜ “ãïu7üúãÓÓµUunå䊞͗±/`ÍÃP¹õ²F7j¦…Ÿ4Wy`ÚöÛ}qˆ.— Ö™=ÁC¼íeMˆÄ»ï®}‚¢éêÃ%|ªïšN댩CÑTÁ3_èŒ Î¾´4Ð&üÇ'Ûôæm¶8]#y Æ¡ž¢ÊâjÅJw‡y0÷HÝ˽a2l,ÇT®ÆÀ\¾ðæÜî?m­óárȸl‡Ëq|q\{Swee[gtEÐO?}~ùu±o˜O-—ø*{„'RëÌÜ}¶n̨‡™É•Øø>ýËþ*]ÎÃ,`¢T·ózµ!¢Ä3™Q¢>ïÂY¾{k¨XX:D)ÚóÈSs_ãxÙº)ÕNa`¿ålzç!Ÿ oû«ÈKô­\èšIŠ\«Mñ›ŠõË2h±D¢³º®ÿÀóq޲݆9”ÅAˆ¸¢1N@‘‘Ù%J—™ý1gR¨d©ä‡{3Áô”b@ ¸‰šPq#’ï8üå,@>öÂîw>öý¸5hª¼ÆîCGcßg&›kþ“/üúÀ®¬\ü^×þ[‡Ï~¹êúô¿½ŸµAYÂÙ`-Á“6® JtzI5sÔV~Ùµ¨²±ˆéð˜|9’TyÄx©·ÅK¢¦OXK®™›UŸ¾Z\nÁ±zê[¿~nÉè~åÌ߆¢û*@‰Ce”á*$©ûVÞxÁ"õªwLWÊ•µÕ6{>à€eþñôäl^J}Žs[/¯é(*ÍMÑID…%»xÒ+`#ûø >H(Ó«©@!(B)  ²#˘ž8†E=pU5ÔE~S€ú¸\AÐ’pRî‹õõ‹û9ÓÚî1šªo;S/¢°Ezô¤Ê‡ÝÄŠY’¥Fn‰‰àõ|ŽxI œu]PHD£º¸; T⇩Ö&°GÜ…x%Qȉ˜Q nºyA0O`63pg ’/Ÿæè“Q… 9 LĉÄïìý9Ó]›Äý7ô³¹ 6KÛ=î@1îêy4i¥Ì¹z4°èu.’‘FȤ+ê†F‰ý lD1f{Éý?Ó•¸?šÔ?“›;êîò³Ç.# TÈ7qþªN‘^”rn”Ý‹T¡ÊŰSt«\˜®1'I:ÌÖS๬×>jŠEî·˜½Çærû÷Ü‹oôX®xEj@{DX«p]U4z¯•<·çAgA—ï"-% (qCà“鯾Åÿ Ñß…ÆJïÞ“Ú8JÒ¼Üø¨9Ì"_š ¸ÝILmx͸G²ÊU¹ËTi[§_q_èCÏ·ß~>ãL=F`Å#|wp¢o$"z/ PbQ 1@…€aP{éCÖ‚qëD­4ªÈd-ͼrÎn3E›Y”: &Ѩô…­£ÊŠ06ÐP‘^bI¦·•"UÓÓ®uHëÑ%/¥‹ ¡0ù!w鈲B‚òŽ_„pÝë»÷ûÄ:8µ×ûFÎMÖ¾Ÿsó9sÀ®¯>—÷›ÏÖ€Þï™䎼ñÝÊÞ¥ûzÜ çÁøÚaãäþ|›3pçYú`çWÏ#Fôé¡!àÞÜ{€o•©ÕÉc kg%–fá2§Û`LÒ£CvQIî¦gŽ‚ ‡¢ýüDvÃîÒa¥×Ø´ôºnôym¼ÝO~;°õ\{14“*XyHªtç ^ƒÙ'ŸìbñͪçäþòÔwf7")Ͼa-¦‚ ­÷Kã!­}xza±‚ ·÷r\˜&Æwè&¢Øè‰kÅ„8À šÐB|%BM~AÓAœ•© P{ÉŠ+û Ü6bbÎXŒcÀ´°¸©ÖÄHøL½éœî’æÎ’Ùk ª·‡Û“5¡8ÛÉ]¬BÐQ¨ Œ€ZHË)±‡Õ@,PCO™ ³Ì¦¨>)8 6¨]]„jõÂ-Âí¨Te3€@Åy]8,¬ÞrZ*ìWåì–ábE–š-èt™dä‚C½áüH[t¢JxL´>ÁA"àØ‘Öd-Èú}{¬O×ÀÇ ¢å~ŠÊa>õ{n°›qhÑv £µÜfþ}/ʵû£¯Åt°&dAXv‹†ai¬ÇÑï˜ q#GÆ*Ocó쎓[¹®î^üoßþOäyZ÷q÷³ä[Á‘3pxM§Š>5o×WYQʸݻÔ"Çæ´4þªG×Výd=ØPݨTî”c¯|ÿ›ís°=ÓãÄÌJ„5òŒÏðäž í£ô4(3¾Ž-áf<_A@*œë€ŸO{¯I‹@e…Utp¢ø[æìÐ+œÎç $—ƒo1Ñ·âlR3y@6jîµÖ Z[õ¤Kèš-qQ™–îëääÞ‹Éôë÷íù«Ó¶:Ô£*seT°c`=]¤ÈN~ñúêºï'õ¨„Õ¥ ó\ñ¨õÙé5‡ ö”¹ÒM"-”ÉKnŒè«•†_ðB]5‹ˆO®Çx°¯qÈ¥<u|†ã(§Þ*úùÛÂE¾Ü¨èg <ÞfÒ|•ôXL€ÕFµxæ¡8dTÙŽSHMøy€sž]SFuÿÑþïãðOMÿ<«÷‚‹(e ÛV=ÝóR¢HEãȨ—¢þð²RïÞ~J)È‘§’#u•Fc?çŠ\FÎ.Hÿø‰: u8ba*6Í<ØóëÛ…ÿJ½5$Š=†e¬¬ªXÌtÅATá•/×zìÙu\‡£è`\ÇúÂ'0â,5TߡկÏz/»ß­¬ Ù”cèyøIʰX(kRægaü`¸Ú¤šû(›óÊΙŠÎ C Í´W1$C“Uû|¬o“é³Qdß¼ïõàyǾjHK6 QŠ@P‘Di¤ÕcÅC¸šª®ª®\çë¯ÖeÔyÝðµ¦[‘úÖs¬£ót(D$aüJœ˜¶XúMO$b TƒÞÀÄeTya£^ݾ£7ÅJè_iâQz9~=ÄRçEÖ4E*×a„‘ÄQ"R¥ `„1Ž=àØœ(…£`&jcqÕW« ¾Ýòªjuv1îV­ r„ûÒ¢ÍDÕQ‚«í¸e) 󼀉E`<ƒZp*D#Ì Nà{p_™@åó³ÉÃþ#æÎ´]ÖÕ‘Y‚: ÜpCkcKm=”Xq5IYWöÇäèX†àT÷ÐQüšé“ŸÏ÷UÇæ´_O´±ôu¼k|×pŠ;Á°•ƒ5ȧñ´¢¯Qo˜hrcO Z0¡QG%Aó!Œ’Ëa3W‘ÍlŒO«JÄç„*¿Q•‹Ú*­J=öÆíL’›£éH9_I6üF¨@±M†ôI4mÎj×JK£ßÛ߯þôNl¦9S¹8«”mE2µ­Ä`-¸•‚‘ MÓvst©m§Î øô‰¿ÓÓ8œ»Œjð£~¡–°ÊñááÖ#KšË P$-Ö•·ôùüáó÷§îŒ½‰õ¨e…c¯´ÒÔ¢!&""Zñ{p]‰ ƒ$¼¡ì/HaªÙ!ÕÌf@XÀ5+™bÆðÓî~×¹‹Æ;?ÞøãôáÞk»qß½³(•iGlÓƒþÀÏÿãM×mÄ¡<ÒšÕNô=µÿw^ûA)Y½=UD{ˆÒ!uJO`C['U…ZûÑÏ×öz‘müá9¨_&ìt8­†žó×Z[íyY¾¤rïUµCiáÎÍy,ý,â€?Ÿ£§¦?‹|Y|¡ºàKZ;Ž62­ À‹`š$à› u eÜ@«”©xP¶L$$‚ƒêñz¸Q©TÁ`þØÉ}ÑfÖŸIö;uý\3—I7Bá'L|ÿl›w÷T1âŠøŠ©áPÌh`±°s…Ë'ßwk4»ujNƒbV}õ“ç»ÿÉIß>›¯¹n²<Ù¥<œf=0!³´ _±•[÷ ˜˜/†¼>~å¼>Ó­FNJ"‰(@aì•=-×/Ä>º~ÍïC¹¾¾óóÎs·ü­{þ¿÷î¯ÄÜ,O›~}Ê^¼×“Î=û!œA~¾÷k]^’ùuŽŠ?M!#SM2 ¤:jÑB %^§¤3'â’bØ€9‚iÒy˜ZVf×µíñºWÈj¦’0$I3IN0 ¨€ «¥&,Ê¿%ý³2fà•Á²âTt“ÒØ,þ»ñ˜µ ` Äö’a & `6S¦+Ø8;dÄæxõ{Ó®nÝ-Lª ’Õ1`¬(5k9ƦÙW ×õLNÒÝu¨0‹âÑ©VZv•Z ëŒä8ÞsOï)pliþX±Ž(lv_Ýåâ¬)C%#¼ðÉw_¯‹{hK}ñHÁ q¾”a$m¸à%‚ Œ &òS­b½ºlNÓùöíP·M+¿Ê¶¾¼;Ê9šÛwûëîÖrÏbãÙiIušùž®”êz çh7ŠÂ“סì1‰BKæL °C©'‹…C›)2â7àÑF“·yúb60[U$JµÀÀ…— D”¢+U$Œèøø-íà©ifñ™P{Nò¡ýákIÄÁ€‚¨cŒÀJd †œè%õ°Ñy&i ð0娆cí÷ÿ}g)°Žuš•C^U9bèã®j 9-¢í}AÕ”‚nÒÎ3³Ý‰œ³¼úì‘è÷;»Ç~|>çΚ¦sZ<*3fäSíñfË’3ÿÀIéñ-¼Ê‹¦jDOS°]°áw6#ä0TI¦†èë¿ÐލÈá†øµ`‹ø½?8æ˜~¶d;ï{T—ɱo)çdΩ¶Íðxë£C^fÖ1W½«ö‹0Õo4T¶K±lM²æ{÷‚Yɉ»š;Ëî†{Ü›QˆåXôÛ¡ÿʼnóãÔ|_ã9ɘ•™‘™ÈgÁ¡•™0Nž‘¤â´¡q6WœÎ >q^Üäqf&Ñø¹œe»â Ð¿Éšˆ>OCU ^O5Z3`+O‘ŒWÔ o ÓrJ`[Ø\!0ËpW9a'Hºo®þºÿz&Y;äTŽÐãA,öæJ­F׫CWOB¬¸ù&‹í%)¶~ªÌ( i.««ž6£fS˜õG¿ÿÅN~ýü@BBÀŠDÑ€&«j&:ÂÖJî…|³‘¶ð¯Xx}WbáLí$KàãP$¨B3Ùr*Ý¥Äj¨iÇW€nˆ@fVóÑ]ý£?¦ƒ‘íñ¢i{žÆ·ŒzÛUcXÐ÷B•´âáN€À&Ô1aQî^`ìk’TKxg;S©c§Ç\3¿Rxqb÷X†’î‡,ª0 †è nÄ„ 4n0 !hMÞ[ Ž0!6¢@<@‡4!¬h”Lhs&#–ire2CÂì‚9M@çž"`QèQ˜ì'ø‚«A9 ñŠG˜8(5Ø!«É¨€p\ g8+ÔÇd2·º!¸ˆÕG‡ Ђ۴i ™HDèDHHVŒëaË¡•ØŽçéô-ºãÈ!Áõ„¡3©€4+ê&VIÍ+¹ìˆÍ!¼\N¸2` æÂ:³$n<°±bøZº^)à4fkÛ¡!a«–’”âA4õ¦[j5bSðH¯|‘3զ….£¯0©qOó=Á•œ’B1MWŽ?=Ù8Æùº¿?åØ5ir/s&ÞàžiqIØ„ì8‹úDC¿Îêü¤ló¡œw]§7ÿ+§×ýF ·þ6ý±y;5¶/EŸUüuñ…tâg *B‚TC?ݦ½"YbˈBޏ9Î?ê¼ ùýügM½Ç½™¦Ë³¥_qlØ)hÚ‹äPžÔkG ŽÚ£URïr†v½ˆZ55RN<<ñBF,NíÄ«>ps #Yö4•ÅU…yùVN,9J`€‹š„¡‰¢î¾(IDoHviTü~ìõþqRù×Ãý©)6gù’ÃÜ4²¨+賦ÜéÇl¿W5{Ú›¢}/ÖIý 0àÁaù9ôE¡YºvÂj-ÔÈGe2ˆÖy¡8¦53VRý\CÇãó)xÄ wºÖ‘U cØÐ"ìÀ±Ÿlµó9—rtrÜå9§$i$›éºSjñÜ—×Rúh  e~"ÑÀ8DqÈIÝDæÒ. ü±åççT½Fl‹”çjÏáïÎÚŸ!Ô]<"FDÆŽ fÄÈÒ».†Ÿ \ñæSõ!HíX]Ìà Œ¢¾ÆÈŽö÷z9§FÅ,ε‹YP“ƒgÅQbH•H$Îg/äå(µ8¤3çt1ª!8k†^qÜ)¯5êàs‡¥(§–ÝtyëÆ¹µb~ݶúæ¢#ú.¯iHÕ¾G(E>*»èb|åq\§»ªïšÄFAÜA˜Ê‚€òñl}øóèóŠýªE\mæ1²ªàÏh”8ZZM°Š¥! )0*¤e ‚Ò•±Uæ,{a™ðúÛ;s¾"y5‹?aÖ+,ÌÝ:Ì +[pà,=+ŠkW‚YÄ HÐH vZŒ “JT˜|¢^ •ò% %åh HK"É1 øX )TÁ ÓAy % ËuÐbLåL¢BºŒ†Î&;Ñ%õªÖ +¥û«`522Lõz+Wµ„E´‘dþ6´ZA¨Z zŽ® 2ZÏ€+kã%É„HsXŽñ^_2¿“wµ¿^ÝmÍUDòbD¬ 1˜­§ÍîIjg±[ì,i޽[£†[£að„Ïss~„÷ óì²Ego!¬ÚcMoøãÇ—`<'ñ9W<õægæ×‹¬Ž–AA”§ÓÏ<Ïž|€çÒ~ƒþi„@Ñg™pLÏ,/¦#1’l™%­È6I†:ŠŒ]¾ç¤ƒ›K×^垌¾bb‚7™1œ©ÊœôÏiG’…S D¶w]êƒ2l{øaþ•ÑÝñ¢Öå¢;ʸ@žƒ70=C.×6±°DŽõ#ó)sDoÚd}uy%€;݇øñÁ%WR/žÈÍ`m¢M4R+´ÛþÔ¡R¦¤G£°¬#$ô@:t»"QåÉï/ß|%ŽO“sy# úš>^¬ƒèKöBUe«‰Á9ï†nï5N‰ê& 5-DÇÝ‹ªPby¶C…MVáʲf(YWÖ­*ØŠ€°_ìÔ UŠ)]¥ëµ`dýƹú—k÷œ-ú 衟m$W§POÔ¢SŽ¡Ùǃ `à¸<0l†€ZpȦÄ4º›¨œÆÄ";¯Š˜t¾?Ýõµxd®ýFöü$‚U½„mÇ“+¦ÏÃP];‹¤¥í ^ßöI£¾þð|YIcæþã$¦uG-)"­‚ÛTÒ"°éÂUÁ— …-Ù¡Vb¯Õ ¸ÏÒÀ¶pÌoûÍm1IÆ> gµsP†"ù“l€.œ1;Ks=óÎ_ò¹>|Ó¸9ˆ~ÀŠvW§¤¥5kÉG9•WÅQ^1±”^²ž|{âŒ2Îeu²=ŽÁ¢À K qÒ a0,ÑjrAT§uJ±|M—鈒Öb!”pø”P»É.àVÀÝß¶oæ+·¦—»ÓÃî¡8Š/ÿQ.þc_dÁ‚™Y ènTŽðO}üÿÌ4õs¡ŸE³ŠÖãüü+î3–N‡×ßñµ¼ñÑ£ÎõçùÑ{üg‘d8O ´ ÜÊyÎ6ç.ÐfÖUIO³©ûä˜ûÕöJûœÁ¤N¶êD—³óK’Ï€ãXnÓ¶ý($¤l™n^@T CLa6„Ö¹«ƒ/Ì9M³L6VD‹$D#X(¹禫†kˆ{¯Íe´Y8Ó²s8Y°¤‡öŸ¹ÚÏ­â{«°WÖr"¦¸ê˜KÝ ÊhH‰…P…TÈÞÔµF²d ­cgÖ´?¯›?öÑ~µ¦Ç,¯§²;ç-X=0ó”C³VŸ­ÛeÁ„‘“wæäæ¡«žÉ£·š%cЦA4€‚hÿìýéŸÝŸ?Øÿ}·¼ÑN¹Ç¼û¿ÿšzëË-u·×ãùªßÛ:_\þÕÕ1D¯ÊýLÃ0ýUêùþØœxxŸ÷ˆ ;GÎ’ŽdÑ,¯ûLk.á΂•,5„çôùòhWZ-@.ŽBŠ“<{Çnn5}ìÌÖ¹Çj^ÃêdôQÍ3æ™:š ¯F4S"ƒd£–ÖÉ–Ü@³©K„,OFg^©þ¾ímíhYA5| lK˜RO“)šss1âíýßö×úLƒpT”³ùéO6;x=‡ÏDžq<? dRBBqëÕâÈëÓÕ>ÏŠí¨ZYß–>ß_™/`÷h'°WõôÒ“[q@Á:fË%P„“Û”-×× ‚Ø,Hƒ}PÁ½›µjBgiP¸µõ‘þîç¸þˆ;žÌ³Âδ/ï‹é ÓßñHêŽ-Þ>$Â'æ›''`'™MlV €ÀFbN cÅÀâuI Ól2qnòÅ…› À4BíÝˆŽ¢”eÚû¢Ó6š&g&Ã- ¸ªRà0„‚[Ú¤žd„½!|ãÛŸ~rždñ7 ¯o¾¶šHNµv6ÉÅ"ؘ 8˜°ª}ÔQF–P½ ªŠÊýŽa>×™åVù&3™ß >.}œº¡(Š–Cc?]ò ¢âÑ@ÛªÔ®ÇS=-cÙÌÛÙ|Ô±‹h:iÜ0Å´†-­X¾Â8Fñ`d0k#ʲ6µqfò’ :¤[+:´33mªüB •£SFk¡+U…_×rndOR FHþ’Ë@½1—åpâØàÁ¬ù’[SLÝWxóÀá¹£'¤³ U8¥‰N[Ï#º«1¡´*ñ¤ŽFÕɱÜÎG¿¾ïÇПx{+Öë±{!Q1±Qõ2ý4Ÿ}³3%úüzɯÖùçûÙérÀ¢a³Ò°OMN…3Ó6ƒ( Pá_ȈO#/1§š1O<¦ÞØYŽÇ9î *lâH×U¶—ËáΚÀª€ôƹÑóò·ßȈ ÷yŠêÒA2 MnøŽ.i:ÔY8æý`›õ”Î~L”÷oÕþ=ñß "käÆ}™ò,ë ^.^l£©x {©íx#kæÊmuùskÆg QeVɲiÖb¾¬SÈO¸Â‚—H°„H׊ ùTÃR¡ˆ¤2â˜2P °Ð”0 ÄE ‚S³þHÈ›îÞ¯ŠÝÙÍ÷š9|?¢•rTPýu4uç£Öû8ÊxxûÌý ž1óðÉ×u9çÖ×ïâÒhÜ›ƒ_÷îK†÷|o¢aSÇ€¾P܉Ã+Ú„a,ùWÓŸ`û–5•³vHb%l.#ìXš=ª0é„['PŠã \&Ù³üÊ÷ïf^úÞ¼ÃbW|pøé:½ÑŒ€ÉTåžY7Þ9Ýö`qSùáþKú§)+ŒƒsJEtâ°¥Ú—ð[³ªT3M¤ç®Í%ÓÃgÓè‚•0TLIe°5ÖÌí ¯¥€O@ú,lÅ”ðê i+(RæzXô.ÔŒ 2ÀÒ {Ђ›û•t'ë1×Ååˆ-P –T6Â6‹(i½ÇÍ]Î(:JL]šÕ€©PLhLÓ³’ÞËÇô´¢n3Öu˜”TݬP{äõ¢ÈÈ~|I7¯6D­û[tM‘Üj¼¬bíuåÈ4jÓ)òhÐZ\%µ-̈š¹_âÕÇv¥vàåÐ}ü&R2:ïÉýÁ>L|ÃVä¼õ¢i¥u‹úÖŸ4Dû‹Zyd—rÿ"ŽþpX@˜I§Á>ˆÚ¾Œ57 ÛÛ&ÿyðGñœÑ¢Í)¼£úouX'IOJÉú¾ú9ú“°Œ6„Ióm¾~‘°ƒIÛÙ–¶aÝ ³†7w /’f7À†Š RC/;§„)×?ǽ 8K8rð%ª& Ù°ÅyIY±”D¡ˆ.fвyÅ(Ir ‘.ÒÚaî#”‹ {nÍLÃvl " v"ã’ –÷Ûü¼t‘lTȱƒ,yfl0Œ^DÝ ‘Ô ØMŽŠÇìOòò ðŠÑh‹a£´rD%— ÆZÍʩ̧„„˜[ÖQ2À…”tY X½h¬o‹s8lŸû?­=Ÿ‹ëèŸCIJXcb¤Á¬BÓ§–v¢h¡M¢#1`dÓPVZ©k W[@Ëè8ƒmá”néoõ[¬4vK:‘8ÁŽ©$Xj 8D⥠îªí¨K…ÆÄdbŒ”FPÄÈ/rµ—zaåH!8t4D¡à¿ä‘ÕáÔ5W[F=I»ÆVŒÒv7¹³çá™­X½O¶½Ûmv þò_ã^‡JCˆN‹þø’y£ïâþé–•aLq„Ý¡ŠU¬¯(bÛå.k…5цPÈձѯ}ãÛÒw5 §Šn–y†ÙÇY{î.w>^XÍX1`ŠÃAb>[‰îd=S÷zîGa`86vf>?l‡ÝôͬÀßjµA[«ä£1Uˬ4‡dÄ<–3úTËTCϨŒq|¥‘«½ ¬é&é‰9‘³34ÛÄ‘ñÍÉw&¯ UJè-yW܆%G Ã-jg‘O`ÛÉÂéùŒòñÙaišx…ÑSˆh4»ƒ¤®z1ÊQ{feò°åŸæYçGîE5„ A®VM´”èÆ5é^cóéw¬)±OGi(‡dx~ìNd¥¥CK¤nÒëØ~'ìùì´;[ØóV'ÙÑk:1Bw©ZÔ ôSæzº»>WôÅŒö|½Æ$*J2„sØÝÏÄ Žd‘ÿݳ†‰ÉÝ»•Ýßh³ê£Ér[¯¬Œ[Êv¿(_‚O@‡A*0T—Ñmâ…0>Ø1¹Ìåp——Í:„Må«6³u;%È«ÊæGkå ².‰(À½°¡)fhd7†¨Cª/v:Õs‚’Û´(lI5·StÂj´Ã  ä8Ká¨nnÍÇŠÿ,_š2ÜžåjÀ‡(el1´¢šiìY³ §,·÷h·‚ ã½`žû½‘ôÂà féN.¨nI ÐTpìM€’²•4¦qQ`¬åë•ÿæ¨ÿdÿŽÔ½””¢Äçq-*žºQëiöíÝ«„u…ŒFWÓ«tÍn¬4L¡q×pC˜z;Îzw&%9Ñ K¨‹k¤o,BΙ°3„7„îË9Š0Qq××û …ÒÍø„InâIWP¢±Fš@Fwòy~’ó[»Ù¯såø„°Ñ_ž~}a57ÉÆ_bmBÛH*¬Rу‹<¢ ¨BˆW¡,ªÍF"D,ЬX(ƒ "Xc .Ü’«Ä+PJ³-´½]HpŠ$H¼”ÃA a;…DBÄ É=äwÑŽtnngpQKbC' @:f{1G¤õòÏAþßxSXPƒ@(³‰ðæ¿*xóEس¬‹Ø¬ýrTXXSüCÏélÜzƱ7؟˳ø¥m­x=po¸Ä("={[Œ+p&[èW° ˆ2¬ãRz¤=B{˜†•$±Œ ¯BåˆEDX`ite‚¡= L¾9ÏåUý4¿Ãªh Mìq’ÑAw³WVSiNÉHZ—…•‘)ÞÕGfýÒîBÌ–¿‘^öõ[fÛäS¬m"«z¡, €Ì dÍèR  5Ò[­[~`Ø»>SÍV—·þÏ3Q§ö»ï//ÒÉßOÃÉ)µLzzÜ)*:0Œ·ÇI2}ñ/¤[ï‚Ý^ÝÒ9£.<£1à $Šø;{üþopÿÆyóOúã2¾ôýÏ;ì;?½ÿãðÒ•žé;|GÈÛó|“_®eÝ4ùÖuÝûƒqÊLÞ'¿çSïcŠ›•x$s¥ªúJ ÆÍ¥ ÔHÈjÑ3jHD!˜ê¨ÄÐL#OË©G6$Ÿ]ÍÞ6Ûs«Ý@‰ª[Ñiózõµaõ€FM€OÁR¶A-TCâò#hA"®DùÞý£~ÅÕ²Ž F¸--d diçÕk5N?pªàgù¥@\ƒYBÿ|¢¼×Ö×ä°= §|¦Ç)iÇèŽA:à).N1Ïq¹ÏUôk‹”0VªÓ ÐT¬ã¯uôÕmæLV(·ÑâÆ]kE p±ÔHÔFŠ«->@UÂ%=ÃܤéC®Q€ ž-=·ä %Èmý4x7lÏípùìnk€§@´Ì—#hÀßÊûz9}µ\Tc'Í .à¤GÝH°¨­G,;.q£Šv‚cxÓr.¤4%=IÆ dÍÅÂ)¢Ï|ŠGyžt1)ø¶#+ª–A$QIÔ0z $F®ø…P_ Q*Uá×#~þ…uŒ¡ ‘ŒÆD"RUaÏ* áxœ¢g:9DË»Dãòl™GV ŸèiÔR3Õ9G¾6Q¼¤;E)MLoøùœï ¤sÊÜËGæ#Ù­ýÍqí† ]ò)GŸV%™îªêz—[…¡Ðg—…mmÏÉÉñÃgU àæØfÛö(` Æbwv#·M7Å'Ýô¢âÈý›õнñ3AôîšÞ+Âæü%ІŽÍÙˆH×9wXº4’£ Ž‘ošs3%‡ÿj?¼úø3 ݯaÀ€Â ãPÈÏíM%^u?^q40ï vç)פ’ÅûuxOMå ,[äèÔ·òÎ'ÜÏu›?|ýŠü Î.¿xP?L'©®ÆÌJäUOë';^hLo/±ÇÉh”ëÞ¹—x#ï–a$9GD~Цmt‹†0­ìuîos—Ù…±T‰i[ZrÊŠ˜LYý;çŒT¶¤XE1¸)Ó§­EŒí‹ÉrÊú·%ŠØ‰™€S¥.³û»¶—G†4ö²]l ¿ÝÐÒ™b§X¢‚ PºµŸQ:µ4”òížó¿ôïÒ1%(¸@€¢Ê*´«ÚXi(T+Õ PÔ0øí$;Ÿ,ÎáSÑ&½vÞ•>“¢iÔÎ4D8£Fˆv ƒËŤûn_Œ`.*ì/Që&e§6›òó¡Ûˆ¨P N’$ÈšUèbT©X½ïŠ"ÐT€‚£ ‚Ç:#AbP-@+ÉÃå ¯gæcÞÕWÉíê~»Ì9û|3“~1½¢¾í°WïêðöóIN9Q™_þ8úeŸº_k£och'^#+."N6çÔg~|<µåÀÕ3ëÍ×{.t{mÑ­ŒiýUË®Ç~¾ÄÁŒð±‘Gif”3]} û EbL[PQ©¹*Áéx ¶Â¡òü^öý¶"/€È/[Å™Ð=<¡»í¤ûO‚MLXo,‘Gîß߯lרzVA¨ R1Û y€¨¾–…š[¸ÝUÒ0j£H"Õ®])”œ7Úh³"ôBÔ°6†jXT¦Ô…87ãN£SŒ[ƒdp ëí°ÏtHÙ3Ñ €P áqõ8h9íð,la '6¦lXGÂÊ(£#dO¸…â6$íDw­ˆ­-ƒÒE÷À²º–@“ÄW ð ‹pºA2£[غ„ïTÏÅk2º.šZ”ƒ‚:„`°ÅP1» K!`ƒ2àŠè¨‹%$¸q‡B¡F^Nztð6‚‰£˜Ynâ`¦P. h2 nÉ‚’£ò³£©e«‹rÔÝ^|¨gDý<°CB nyÍJ—¨n¥Ö ÈPt5Ò…„A Xqi,²%k®JغóÎãHÙèÎNԹɼÁ;ºþÉj2 MluY};XsdÒñFó7©…Ö…Äüxû-ºûׯöcœ'§vØí.d‰ªÇ3cqi ŠùŸd0€Ÿaÿ¬Oÿn4÷¿å»¯ÔÓß~¦Å:Rüà_ïë¥ÿËæ>R¹GÈ,’¦[€Dºæ¾Uí®GÔL*ˆÄ‘›‹fÐÌ”žÑ” ;XM;@GŸ-•…9 ˆ¨ƒ˜Ms—°E,ב–PY)êÖYÅM«œ0Ô å»uÛˆA0¶ù@`.ÀìjÝTèÑÒ_fò}þÄM"¬14×—Ÿ™QÍ©ž|”AdÀøŸÏœ@Ìøön?³ýËûñí2†,x@Юòkø¢:«ùí6`^ 6ÆyEÕ%÷qÀ#ÊÚm~Jù°=·Ë %ðmÚ÷:[-›ÈÅ* Rï+VÕîFøj…ƒ~ÿ“q…äJ¥àv‰•²ÕøÝêOðPY×*5“ù5²Åæ~§C—ºê;5J š30Á"“D܆h#iÖc4½ÖÙ­iÛµ§‹Æ(‡?ŽJ`>…a’s†).4¥t,1"/­épÓk艩áE©ãTY;²Ž"UTSxÝ9°ZõFIÏ1ÚêM3-n ÝŸ_ïZ0ž•õ¹vbÆ÷ˆ,»½,:2ññ¡pÒ‹V[|(Lš ü}™Ô°7ÖòÚ¡–Ò’•hÄã!ÞNH1nŸô•*Å=E‰ˆJBäÀ±Ê.ýãR‹ž­Æ‡ÁB£,D@UfðþS×çÞ ^w.¬œÕ˜Å¥T³¨m,‘â\QR>ƈ¡ÊÆ0‡&$!sɆ´µ°¤Ô’ ©Š@`K­A¸¤åÓö!xéŠÒ"®È˜rJ)Š}ÑQZ1ÄFg³'@%Œr¢J)›°ªÖÍQ’€Ž7–­RÆ)–*µ^›1ÖË­E®ä5e#ê¼¶»îÙzLü‚=!GÔxkþ6ñ×?å§wÿõ‹þxǯ¯vvoQNe“»òù½ëñ§ÙÓqhR Ä‘B6BHU°‚ÅhZÈŠ $€¨ dŒÊEÑäÑyù÷«þ™-XB>y•°=Zû5=e¶ªJ`xµ’;RŒ«KÈá ÙɲœvÊaYŒán1YŽAý)vM#t]dN:XzQ /µÚIDœŽÛLrHâ!j8cgØL|füJö-`ÄC?â&ÙDM4Cn&7;ŸÓõ%L‹ ‰¬u‘õLÌÙŒ”»…K¸ÕÖ¹Ìm’R-6R~¢8`šI31Ïø·þÝûÛQ¼–?ƒwJ ÓÔeA·¦„Z 9ñbv½€„¡6)dEkwu˨Š(¿™ß8ŸÄ5àÕ/e††ÌEþººš–µL¹Híò0ÿ~ÛMs“îÜÊQyÇFvïÇÜc§ Ù2Û …ýœyðЛ¦ñmàdzùI÷ ô4³ÊêvQ醰[ ˆãM-üŽà‡öÒéx3ö{;ô±ñZÃóvA —»ª*š­)¬-÷˜‰Øv(ë ÷(Í29…DÓæ[­ßò3q'ò£·§Ò§ |¤ÒupH)¬J-ÀC‘y+¬ÚýÓÓxMÄW– ÷4¡r zyíû¼Òfe…TbDqÜ£läD~ïà9ð7i°[[& êžÿŽS!ÿ.»AʬóB¸§>מʧù$Ϙ!×àüGÇ=5 b÷.øZ k µb݈TnȨéÉ®èÅ¢n¦¿óL­žûGÄívío2o"ƒ¦rŠ\ä®ÛÓþÙõ3YßÍ¡D¬É‘ÐîÛ=8óù®_»BÖpáÊõ îêm5ÍzE¦µ¦òZعËcT1CAˆªó(‹ Œ$lÚKÐZ*ýã”aeÐÕVN‚Œ´RpÖˆ"JïnorŸçf¡³?§šÝð¹é¯É¼G°4k% ·–§•8²d'DX0Ñ,h‰¥Ø&8’È«ˆP Á‚-PP¢%_óUÿGÒ•õ^ ‹ØéÉ;ñ•3¹(E $…š­!# áC® ?àn¡Éô¤{Ä„ª(G‰ ²!û?+›óɯùŸ}Y5†°T„˜…6`!¦¼–÷;ý7¬ß·1>l–½N:öÌÖ¯í~ Aè9~®¡NÚxÎËŒ9}ȯ b"µMBΈ•OàÊ܆¢<'#@os:Éxß·«÷&Y‡\0[¦Èï1Ki-s¸Ylï5ÌAD¢2€3 ï?é_Ú?nö•ò/Úü÷21&¢Ê>e?•×M=OÑæ SŸg>^ç6káÝ“  zð º …CSX|BH+Cº2(%µsÃ8@d!Ø43h’µmÝ5ìõ©ïo=–÷½d#:"òö¤ïg—úSíÙ:=:?èn«‡×„NÉOÕ¼xbÑþ¶Ë¬BkR¡£¤‡ -)ŠŠmdtpާ;ê¿ ü“Çß¾ò½ëûcuñòÒÿ#Ϙ§5%^+;ÍW“‡UÓð¹ƒ÷ñ†ýJ\8fN°ÞsÏ×â~_KÕþh`ߺŸó»«ŸÇ”hc­‰]Cw†&BL“@JÓêÔÙ)/ËU99îÂÛè»ÒQi.¡â3’@t m(©WB”NJvÖ¿Öb‚ L° 7X©eÖ°ƒ(”A`Á\ª/xÙ‹K°‚RèÃñ¾1MƒÐä#%"í¥š0Ñ{•˜\\ôT€É1FmŒ`C*H$2b…?~uò<ÍÅX–ÂÁŠVá#•£îBmï•õ’Ýf—n­ÂƒPÁEÇy\ì˜Zã­¡LZ< h6\áÑÒ@_) ++%.bYF`ÔW¢!£.lƒà–:Ïš ÞÞq³ñI°©ôA²Œ>~†}ò§œú°¤Ï—Üy ŠÎË¡PnB”\äL.ë:–<«gÇq“`§i@¢Þ„&2ì‡zOR|Á;Êâ Æª¢™™vÕpè´#W8U9© * ÂPèÙÏó&þm¶DDÅd¡h3èÀ @0B‘Fpƒ )Z*žA×]«¶+#Ó$sb³È¼èišÝåõfz©WLwïIâÁPÙ‚º”w쎄3qðTgÕð|¢R­«Ðyrœ.•23mXµ»'n,›$Ž‹!h}”Ï£ËfÙ„€Ôµ‘Ȱ*ÞM íêvËÕF†!R j2¾ø}Ú6ɸG·=ö± ½*äúòAç´? ;bȤRG:î¹ñÈEgrÔõr­ß÷¸ Wf„Æ3Æ?yûý£õ¥ôüGvô36 <|a’>ÄÜŒéGHIо`ÿ-Á‰ÿÛq½:û˜¦ºh]ïÛbŒø9KDêNò¥—¯*Ó4fÏK‘\¾¸œvÏQ?vx:yWÍQåö7Ø»º‹«íu>ÞØ­ é$„JI¶×UŠ&ÏDUo=¢‚Õ Ù8·yû¥³ùrmw‰KwIÖÜøqñ‚ìa¹Z˜·¢Øs‡"ïa|L6ŽïM\oÚ9¤²p$œÍªO=0òÎD ÷,g¹®ns£ïn¯0ªwó´œ$ë »Ñ.B‰hwÄ9N/ƒØ£/…5o*Q„¸ˆ)ª2?Yz¢’²y™ïp§ˆv €Ž¼¤†P2” ÏU½®î^åv„†–µ¡-Œ]GmÁ Ð…º´!€B²i©ë\j­qÚºTœ:tO³X@Ç"*€c´FººCƒ’%/@@*ƒôuXZñjUÁœ°¬ˮΆETâñƒ|?Ô·ÄÛÆVÓÝ·–?%ë¼6ξcÅ–^H±ÚÀùìž«@¬ñ¾´½ù3gAÏ¥rêî"ƒbÚ»A\ß°~[C‰ú9âé©üëõÞl=A²°ŒÑÑ‘ ]õ¯Êë:«óáœok¸EcCüôa†:ã²Â$¸Fʶ ‚¤\ÍZ±ã=šRS¯µ ±ll«4½q˜µeÆ‘á^—O`Ëïv쟷³ìpÁQŽC5oë ¬ì?Çð¿ßrPœµlþl¿mÿËêü‹ëö¿aòïoҕ‹°³ÝåççþÜ«”=wÐ^îG;g’`ˆ‡EøBóëZ ³´Üê%ölÒ3?}pŸ¢ÀK„Iq’=Fµ¤k#%’SŒ ®|¾â¡PUpI|áy]_þdö%º€8‘¯Ï~D†lní–¿‹Ìë!¶”>ûøúz„ãHxªgâZ m½OÏu¬àü4”³’Ý0ÐS/,B ÓNžÞ×ðq vÅ“p;ƒ‚Юù"Ò¿œ4*>R?ƒµ”!AJÇ*%Rû3W^%¯Üg¾öéö÷¢½0êB÷ jp ¯œYau§!)Ëð‚b*$‚ŒúY‰³p“Øíj¬ÇT,Õg}j f1Q0BäbŽ¡–(€–¡¥×¡UÓf¯J>' Ë%ž¡‘h0’F&„ °ÆýÍæÝ%´cQ(«3JAѵvrã•PåǸwd@‚¢j«mPšÙª‰DÃPI7ƨ*i+Ò0qf5‰ç‡Ø·p=3¡ëªóO»ûÏ?˜W ÚþA÷?Ö¸·»öýû,=Æz»–m~ÿé·ga¾¾Å?æÿâûÊWêˆÄ´IÏ,1B€0¸Eй1ĤÂAcDU"²Fid¨×þîùg%œnØfµú¦ó±NÝþæ^ors”y‡ÏÐO €]7Ÿ×… ÑÂ" Ÿö–šA `I,}[õr㨡p Ä Â¦÷½ z5’œc£qí¡m6†u…Ÿã6N0¡‡ä ¢&½‰bªMa?!OÜ&ÉA µ }¢‚ùΜä»å ɰ¬ƒÑÒÎ.y®œóðn‚ ä©Ù^×dmH.Šl/¬žíÜmªØë€*CL&œï¤”â'Ÿ§ ´»Ð,? Ãó³EgÖL'q¥W¦O2¼í”4•K$#R³‘@À”yÚ1‚/=Ëó\'§“¸Õ×/ V‚.o–SE†z¤“vßµ-í5õ(“a32CYz̾@~o1ƒñV öð&êalkú4O¥ž#» ‹¸W¡:QTQ¹ÚE#ÑçÙø”?Ê#ù;¿Ó&—Ç•›æzޝ ¡HÀ,*±·„À ¸$!hkS@q[=êqºc)ŸºÁ½}Øõ^WÉlÝs'„ õãœå¾õ=—˜ÏŽÒfíÍ'?=°eYâ‘axˆ‰ŸûÌÜvÖ¥yØÚÔ2åˆÜ9VAÃäBõ%z6žÕŸ¬ÓzœÑcPåÚj]À0‰iÉ"RRø1 â±Ð*—&Ÿc‘°N¬ã^ú£s?›Rn¸Q&„Š™øÂë)Ç ª;‹‚ fšbÜ„1 'uUv¯otæjwRAÆ[Ì•H0ÆžäRÍâ9¿6_E_»Ï'ãÎF®f&WaRë¹Ú«ã»}L¶OsÖ÷,nÛ‹*j›p<’dÑ¿*¸¼XçS)ÒØÃKH&-€ `#:dÇ™8†€[ Ûñ÷xø¿ß;ø\§ÎGõ ð%’ ‘Ÿ† }Ñ@R€¨`¬ù%w…ŸFkð¿Åä0”å¢TaGì!l]^ÇÕ7i.[IèÞʒYŒñÞìŽqSð°*˜a5ÝlhÈI iÔÀ ü–¨A ±aTJcŠt"©èÓÂcY%U±fv—·éüÒúM/2è/&ûãÓe5ŸŒ† W3|X~¶­ÍTehÌ„¢1p¢U£“ývÜ¿é¿(utºõ¨†ŽL*ø©ånÿ|’Ï™_|0ÖÃÅhÿF^“uøåÓ™æ@y)aºÒOí(-±i2] ¶U@› V‚NÏÛi ŸÇöukŸoú¾ÿ”¸• @ 4ûþ>ßñ0áÙäK¾'´¾k¨q Ö]Kô¦¤•VùâŠÉ,€‡Í¨ÛM23mtžd0È$§GÅ~zùüýþÌÿÛ°{žò7Í?ü<ú×½¾ùð'/­žÚbŒÁkóFž-ã›xRÝÑ‚ìéçrñÝÚ¯ï×LÿJïÀûÉ~ýÊ·çc‚£V ¢²e%péħ<2†”n,b9Ò4”7ù1V†Fó"gzf¿¬fëœd(€(h) H¢n!+ þß‹ÿtá¿aþBK…:IÒa¥”H™k¸86Y‹¤‚PÎ|ºß˜/!§i ŽIŒòøñÊPÉ5<ÝGD{b A‰¸õ¹DoÎf@È¥ ‹2Á©] B¿u•¯_þýú£ì¸ŠSÐÐ0rxlçzºö’»gWŒusêA7^ñbωu’"«]ÃÝA¹W\ChHd‰WzGƒ²¾ GKJÒ.³01æpTJŪ:'…]T§Eú@¡¼ ‡¯‰ßý|~‚ÏßñyDþ–þ Ÿ—ó_7þœû˜³Í$n«€À–Èà3fmGCBG@¬#:á­A¡KÖXsú(¨Ôù‰~ ¤?Þh‘ÁÙ8 &;âŠ5O,@éBIi&,ª äº ¹×ßæ»Ç‚€Ð*žˆ{ @ž”TíF×QÉôˆ8„Å#ÊÖãªNšø9+¯p÷·î§í,Zc+³ê»H(Þmªh/ÉW´vsºÙ¶ë£šŽ 9¦%ºô¯Iâ‰zthJ5à jÀ-$g›T>ý*j>DºÕ÷fO©ié÷fÇmv™?j#BPÝ1Ÿ_4cGð üqþèñ¾z¼¬ý·<>v¸±på8Jo¼yX¨0µ4Œ’(¼Iq•ª×¥í/ciÃ×kwmðA?r;9×Ñ·f½Î𲟖²V˜¥»©þžèú’IRŠÖSò ¼fD²Qz'˜¼èc¹¼{ë’Á#‰îæ?6æCök@4_RFè–k–ƒû#5 5çz5ÌÝT‰/ÔÞôW¢FGºJ±1cJ-QŒ'þXö˜8´â‰#Q’†ލ,Zy"‚Ö¡ ¤”aP±D× uÇ•íJÙD+°CÀˆ›ºD.³¿‡àÃ0*JÏJ”8©Ê­½KŽê5­Ìµz/ Ñ£›Õ8Ú [ÐM}å^ʇ±{€ƒU&„^cLŒFÉm$¸Ø®”¾^™%Wb"¤"¡HˆXHÇñû[÷é†Ì‰ŠiÉÀé /\Ÿ¶Ã²ã\Ìë÷‹]³Ñä9;»„棊…¦]b;ñ ¬v¨-žˆÊtQm›Š$EYFA²ÐK­Ñt5m|ë¯Æ x2¸àÞ‡! igý¾sß2è£k¾ÏÕõp¢VÇóúcóŽP‰ ° û‡õp¦[åÈØ%O›«ˆ°.4†Æf¶C‡FgÅ\4  &#¥4!Vh”´”ãÈ@÷+cË¿î—Ïx}ý£í¯èóYΞ¿þ°˜—ó‘&ô±eÔÛÝõ äƒøÑÇ߯‡ßõèür¿Íüh•ݱªtQ”%XÀ® QYvª§[ÖHÑH€¼ŠY;ê ïGø|‚­ÍñŸŸ¹Ý'Ù§ÇŒ­—tÜÊ\lÌÎùd9—÷²Í]ïdÙe£nö~[Œuëòfº½ûÔnß;ôÖ†`Ìéæyë¾oû)X¬‰+U Â×…pªZ·šÐÕ}*ìKÓM§qÐ#J¨Ñ´ŠŠ[#UÐùèùuÕëêö÷vz²yi:]&°—›¡Å´'HÞ,)Š¿ÜÁ\¤è‚™Xû”sš£_ÙE(ä¯v:ouçâî¸Ñšã÷ûPÛF_ûivžïwYÏQzµ(''pDÂq‰·O‘57¡(€n4–*õÏD¨ƒå ](eMZ±Ü%’«ñþ{˜Wå­rÕdP÷ÜÕ™í4ëÖB()=³ÅL5ÜÒ`?‹þËÞq•9=§x~\ózyîž7ýã—éΟaÞWÝÏT{z#Þ¨oü1ðȉéO©ßÿy=ø[þ>ÿâ;¥4=‡ê¦óó^_“•=k‰HMP ÁÉ÷SÿWüðæÄå\Oo¬ä®zžžÇô-ÿÿ(–=÷iydÛ‰BÂ8&žºˆ¥µÃ‘/kR¥¾ÖËZ\zîª[_pü}IëEmB53Eènªƒ@a(¤‘Q¯[¶*s!ÖÆa³Ög\‰†dN¨fPî>¨¹_„‡DR8òs$ÿB„4_uÛV³ôúD¢”VÂJA=&DëU…qZŽ6¼èÝóúZГ râ—uUt¯òû†¾îµ ØÍ­©yE[­Av;xç¿ñ— '¯¶½6Ä%^ebQ¿£2ôê¢ýõWòû}zÏ×Àœ{m:¢ú Èl#°À¯>x:¢€7L ´·æÊ8£ h¹m@4\±u"8¡ŒÊûï4tFÒ{ãeÇŸÚÄ_ÿ;ì©…¥cÛ1,¬R›@F¨åÿºúùeèSÚ&¤:§[üæ–‰NH;V§“ÿÎvƒÇŸF‘|â ÙÕ""iÃ×:;Ûò±ÛÁ KÑP&)HW–Q€IºŸÂ‹1o· ÃÝ^¸ãx(™GŒñ†¸KÛ × H#å;}è~¿~ZÏÄSøÃ"hÿz?WíÃ÷!ÊŽ g ž8ß0ZO§aº[¸Œï; ‰?¬kØ›»m¶vSÝî‚{h Vnn…ÃDBEŠÊÊþʬjgõàL»×½çOHoWõ5r•Ô¼Á ؈4ÈˆŠ˜GJÖ¡“4E¬ ‚2<¾Š7Ò²k°•ëffÐF`i_‘» lÃpK–B¬V–S#p wòŽæpJTà@Œ1F:ð”KY0€ì™1(E¡¡@É 7àÒ–& 0T“&ÑC½$X¢ã„÷ŒU%®•-æÊŠ•Ò¥•2°+ìØÀ»Qv‰ÎiŸ‰šîóoÛüˆHàûYÄyþ@ÿv{û/²çÖ9å~vù‰ÅŒÍs=Ÿýþ­¹ßf?Ì6‘Èp¶aœ¦ ]=ã©]Œ(˜h„ê5ØsôjË=‹9³§Mê;M×%‚0ÖГÈgí‡÷a(?ø N)·(0Ü×w«× xj RAô¹K&K…%1‘2³J„y1áé©_{y|ª†›ÞVÖ²I ¥|”IжGÑ ÎcÌtHÚ…Uè U-a 8;ö*væy\xgÕb„²ðÿ±ú›Ý¿|þ±½2$/~·ú¯nÿÿ,ŠÑ,ò<ññm]ý?Œÿ‡ÊMú³N»*ÍçÝÅ{ð;¥ÒÌV0¡8çê&ˆi3ÇÜÍ/iÿ‘í%_QDÞ³?å-&b²&2XÊȸ™hÙ•¹.O=LÛ6«Â±äT8ÛlŒ8«Ù>1pBjp„̾ÕV·@YõÒÍ£J"‡´#ω¸öÀ‘fGöPªEÈŠUQvÈ!­ÆØXøÂÏOˆûh©o s†ÄÏ|xå¬ï3ªÙžiˆ^·3쿾“—îíí{Ëæ.ܘ¾ë |ÿØÉ ׃~ÿ~[pçÌßËÌDû}0ÿbÄÄ‹‹c·«׺ â®Åñå·n&Æ^ÿ˜xr¤‰›6ÎKg®Šàt󨚋Õ"ZÆ@Y‹£(¢‘³’±å8ØÑ–çÞôÏkñÖNûÚ|»6ËxSlÚ;7™7ã­·ü×%ÿ³þ_Òàr÷÷>´±­ÿ2èØÙ Be±—/ÍAº¥Î@5X·P»µµê/ IB42È ØÂ!dA«ÄwÁ¥²Èž(Ûc6tãf<ó«‹1Â`„Vº‚1Æ*¸‰ãí±=Ž¡°h/÷z*ÿ9ísyŸçü<öcý—ÿºÛ¼Õ¬È9c'ÚøBz¤½#Ä ³ÙØ4fgçóõàîès_7þü÷L¯òÝmVN±–ï¹ÖXl6€ŽÉvc¥bF22‰ùé·U–¦tÀsjÎG9 Âq‘nµTB§nɇܴØSTº¯kMºgÓrá?œøÿ:G»®ÙJ+ÛÑ¡`§@ÊV,Æ5CÐUV}…]Ñ4óxe^»Õ[¬Ð±Ä&á›z6]@ØlzÒ@ÏÍÚBh ‹y{uï‰Òs6å§sN¥º×ØÇ^OøóãðïÞÕ;ïšçáe©Øò”>ÙýÎ>ÿ½ÿÒ›ÏkìG¼®ç!Ô^¾Z4BÝI*ÖPM0\ÈnYÅiƱ`ˆBû$åá|Ô sœ®”ö pÈï~]“æéæ¬ùĸÊÏÊ‹Ìs>Qþ{¿~âþéÿúå󹯛Ïìüù]_þ¿á‡á6oÛâ/Rèà%S[ ×zþ‚U¹Í‘ß ØÁ¯|Ë’<‰Yk£ ¬Ï”âÏeX:9V \nÑŸT$ŒºmO]M† l^¶?㟿å÷J…å§Ò½ùK„¥Í×/§c#ˆAdÃÇå"›ôý,Þç)}p}ã{÷/™ß¿ó9çoÏl³îéMÇþ¶b’õtÖÓ¼ýht“$ E¶Çq_t.ãÒôÇÂý¨"/oAÞô e¦ÛÁa={Oo'ÛýwîÇ\ÎôL¹NèÛ‹‘)@rŸJ‰®f¾¨Š9µ(`µiL«Z˜­ mcXðµñ·>—ôìý’ìó7‰¸¾ÏþälzëüZþ£“ÕGïø«WîówNÝÓÏ©ÝhSaÁOk÷µô|ÏÏå‘“0C5kaä èøu~Ý~áð8è}¡>]Eã )¹q¬, ZÏ»½È“ÌÅd¬ãX<^–ø|X¡:¹µôÏ/Åû^Îf²qØ#U#ëQv¹ïÕÏt½q]Ñ-\geBl†]ñtÆ`§©°<¢Q6à== lÈÈ‹ï_\ßI’©Ä ¦’‹pBb€DP&,Û@,¿Ò€Ùòœ6ÝÆdY˜’¤£Î®¦63[èÕ÷Â=ÝþiüI6Y!puÞân?ßRÝÛ+sôÛvŒ2³"Q`Фªø Ä,ÞpTm~ÎH A­ÛËOž<áD ¢ûŽ 5@ˆ%øòØëíùa_ôhÓ¬ÝÑúŽ_»>ûÅ¿R±hg]žï+ÛÜ7X^Æúˆ1j¼Uí~À=¶»dÛz“´’-€¨LeÀàä  “µ©ª¿†ËÔ“ñy°]•FÇ¥úrßW}ê»Íâ;'WLÁÞƒ¸~é>ËöÏ@¾†HÇÑ%ÝÊF¹r± 6[Ý… Y9[U°nÑAYÙR k´=R…Q¥ë刉òäz–åNèåeOÜ»b@éÉLëë„×òBè'5Ư¶;Ÿ:ðQÖ”źù¦¯{ëÑóÈ=/zQ•B%”öÄór¯kÙÙáîò®Ãkì(ÒÄЖÁÖðW­ÞúH]K±9wN߀NÃìçC°·2ô¶˜ƒšù(Bj{®"7„6F‚’†º, óCÆe~d¼˜C¬*ú‘С©¬h£‡Y90BAš®)‘Ü äÜ$$"ØTù}+ü¤ßo’b!¯£1lþ “(JI›˜3¸™3¢RQæ…UK#ïoL…` ˆ¸k6Ù‘ªô­ "réøÆÜÏž§ô|S™çüB§s}XöF¸àú­,ø mÓù² çm.[êªãfZíœRžš.É4su,+$Šü0½#Ñtq`{«Ç[K»kž $*ª²Ì„ë¦cvPªôp6JNÙıÆÂ»WóöÕ<î¹ç͛Ӧ.@ŒX¼x˜7ßp@jÂo1RèL5“v:¡Ö_»y?W?T$u~¥5! ¿•R¹Dˡ鮀ÜS@Dyx ÅâòWé·g¼jÁ0»T+ œ üé{ãæì´¢•|?àŠÛÁ$ TPóÜ“oƵ_ÆÕ?ûvò‹í|fИG¼ÈtÙJé¦ÿd‡ÅTõÕüüé½Ëò•dñÜúú—=­pÝÏ7¶òË ØzìšQ.©×°^|%ÝŒ¿’S,y1ï „>œ1(}ëÓ;;¾>O®æn÷¨ßüÃ?’iD®°ÒÐĽåÖaÏTGÒ( %‘ÔƒCnt¡`¯À™‘'õÊV¦ ?¯e"…|¬deÙköA½sðÊE^¥6àš¤ˆ ëðª^Mv'%?è#°AW϶ãžS¼ïäh{¬P¬PAÅH|ðêÞý¹0oào‘-ë:¸–e7ÐF)‘ p[ô ˆ¨†Q­ixÕB[1¥‰2j!‹"ÚÑV(g÷/üõGý•ñ×ߟõp–-©_;ý+?†ócÑâ;ãS:Ä$ßíÞ4Cú÷kÏ!-"$«¥’RCÞè B¨ˆ( Bðàb‰´¸.ö˜Ož'Ñ·¯†—Ã7ú°ÛNÒ Ñ+\åó ÆÅ:ÅZÆ­G©Uš„‰!öõ*Es ¨"EÆyUº) „,d€V3î¨uC—ª0°.¬én—¶7ʪT2¤umqÛ¿æ{3ã.ƕ鷃mÝfÉz”cÓh·eáê(¼ï YL=Nv\Îñî'úQA¿š‘-Ÿ¥u_¥ôÕ ’h$€ý_'~3Lþ½h¸ägøb-cÕKnÄQóáÔ?//‰Nl9,ˆ¸²:ÒOÕ? IsAEÊM¤b4ŽW“’S=‡qÜñCl稌¢ f®ÍGrÐ Zd©éÓ†”“œ¼©Œ4fÜ¡T9W‹„’ëP¤h’h<©! è¼rº£Ý‚ÒÌq#Pµ‰œÅftø®Þ0»'Ñö·£¶çY&C^r;•ø?t;mùbï‡å¥ºÿõoüÃyiJý¿¼ÿõ0{•ÙáߥJ˜)ù~Òs¿ÃÞ§Ú½%õ/ôÚ#c» ]75w*O2*ƒ!–:àØÝ ™,ÒŠHw6C›î1Šª5ü«©×nË0‡lÉú¸DEàžÁ0Jî ¨ÀœÊÚ®%]D™òFÊÓêìêdžlàÆþâ]\žŸóûwÿ§FjnïA÷•`¨¦òÏcÜ«zC_ç2ÏØ’ Ý þ–8‚¾»œD5¨ÔÊ›ìowͦVeÿheL~ çPý4âmÐLçPÌ ¯£õ ðYøÓ쵞BƒÕ}»•UyC‚V³'gê׃1D:š…ͦ$ÐH)ZX†B±è!JöHiœ»qÁ…\r†Ô±NpJ‡Ïî,¸ï)[vV(T`IÀ‰»HYc%«Î’šŠä°A‘Ë¢øé¯ÿÙë÷G{u÷¯jþË~üEùÏH‚]Ä Is……"ª© 8P•jÀî§)—;„¨.Á+mÆrÆ•®ãB[ĸ„R‘"¬k)THb*WXÊ1¬Ø€p!Mˆ1 Œ‚j‘DÌ‚Qs+"¹¤òrGÆuÙ“q­~ÚÀß®ž«&.¯§p|vù÷üÛáûyü’Ë}x_ÐÏ:w–eŽûÁÙ6¨ý¾ñ¥>a ¨ØÉÍßß’ó6´ŸO«\Ùý~Õߨ/û/Ÿûÿ“c*)ù_ȳxô¯‘ÿ³ðˆÝÜmÇáJBmÚp ÿ%Qª£fqÊ©g·6 ˆqïƒ`¸6ó-º ×d(€ €zhžõ^¥-ÚÝÀâ´šåÞ› ­Ñ¹—Ï%JÍ”‘2ØêÆm¡W`h¯%FL¸yĨWÉOCðoÍûœ[q ÖÝ>ÊõeûŽçÇs\i7÷6ãužn¬‚ç~éžWÈŽM|ê£ü~o=s5»8¿ÔpÏ.y ´Gs$TíY…VúKä¿ÿ_„ÇieÝcª¦VGjÖƒv f‹zžU|0ÕÚê±1°J£dG¦ Ã.ðXRà…À çº7?ξ»ŸºBk½Ó¸ü®ã÷Ž<ïgŒúd_ÕN¬õR_ÍÑî†>–8@»³o`$B R¥– ¦¦F1æ¾~µP> ™K¢?ÚÕ®¯qníµŒ­PÍ–Û)*­¹t;b é3Èœ`9¿èɾá+¹ Ö¢.C„SGÀ¯)/¯ê’Äü((zwÂûF/¯éË o-Û^íŠ}ªa¤(‘BL™.ór®â=~êÔýl{ÑîW\GƒKòX½þùm³¯»»‡ž¾¿³ U )M-zÈ4u†Á Lù€‡Ê¥ ¹B¼ ÒµÒq«Ô°kp•…É‹.±B<¥(e@˜ÀCP»ÄÃ|F0€!-jǾâÓ6ùmêQ˜`À˜'%3¬Qz˜ÔmÆëÄbëŸ ‘¨n_¦“¤"Ìô”¡€ÌUìtReyºNâ Ó?Q<3fiã Ìk@bPŠH(A¢îW²ÍO ÷ç‚~¶x*õÝ5Hû2üH-1Ôð­Ú·Ö~ØsÞï+›öÔj¸Dª ‘ÃPF‚úæ²r*@’ˆP ð„IAÍ+ô¦hv£‰cÕÍÚ;ç}¬^Žm?X¾þh髉þ+oL>²ÿLpã®{§ÞdñüëÇâ\©~ÿ¹“"lâ`izÂWyâ²+Yu­l}€ä ùq|qÉcD8ä«ÏšG»G]5 åIöjÛi¶ímƒ CÚ°ê¸À…[aÏZYðú½ëc¯ˆÚ€èNP~vÏ+|ðiñúÁ¸70§tCÞñ¼¸}Ük•Ø/¶û Ì‚°T$0Hé¼Ã&ƈPçôÅÉ3‹¹¦Y/Ïó¯ã¯ßâlðK_>íq ñ]…VMéšà‡{3-Cq­£2–“åÀ3ÝaûÊ jê?ß“óºîø”ˆ6)>uÊýEþô@Ðäš¡óù¯—ÂkÀÂôŠÆªR”"Hõ®,ÔªÜ,˜)ŒƒžŠ‹cýцSí”ÀË"¤ƒC„`ÇP;ÏãéÝ?ÞSz2&.°Ž…3^çB;¡óšÞ³™÷êûSüé;Ô«ä=‡oé¶9ð^}Þä½°?Ò=ÀZ2«{п>üš²+£©¦9Ç„¾Š‚ÝÎsò7‡Ý àjm¾¹·Å—G“v"8ç¤×wÖëÕ¬‹ûö\¿ê5îî´' h6f·ñ)æ|šî‹´{‚<ߘ&¬^WNÕ¯G‘”5˜¨¶oƒM/ŇäU#TÇ\!´íhA Ë0XÏpîx~ze +m/ RÚU^?9Ò:¤¼sóR!ÑC3ª UGÈ94äˆFQÙöö¯É XtJë/8Oã$2ãˆbŸÈq飬îóA4"m’‘Ù‘Nxuª·†Û[Ëûbx…퓽ªË&w7âçmþõ–ÍÓ£‚Ô; ˆÄ(üyÆno÷ô‡èþଠ®DŸè3gDh? ¢£Ÿ÷ì·[ñlPN¥£T*±jÚ´í(¸-Ö=?1 »³ç^yy§¶ïÕ=^×;BjÆ4f%%bTSœÍ‰ ”3¹ñÇLáÂÄÒ­u—j½ˆ¶zŠ©iϤ²¤Њ&žD€=SÝÏíÿz•¿ýïÖˆ”™]vž÷=Åo¸KÖŒkƒä©&¿5R Œ V)Ž2u2ûØ—óç‹ùõö=ëª<ÇÄúžv¨ ¢˜Nð{!µ{Zº·ã+º`ã$Ì!$XI?®ñ–÷}JÒ:.Âg%óœ“ÂìM˜•¢gï¦rúæûúñm.#çwø4óPRŸÇ›{™¶›:­f2Òë÷×.ï¿ÿ>ùÙîLekZŸLn×ßí•ûækó!Û¦ÜÈí(þý[mÿœFâ²£Y@ è¶ ¿„¾~+¡hòÊ_tPMHج¹TL9S¨W¿×7ÃxÕ3ŸèEŒ+hÁ8’ºÒ|'¬ˆ¯ÌžD£ÉVp¢‚lÉOf8̳gÜM=qרœHùˆOäÁ(U«:ŸâFœŒßkò~K÷ºÈ‰v Å.~¤š¸‹y7Ãn-n™KìÏ”·äµÑh䯽¿Aª4OîÆ HCAg÷®Ó_¯öóNÓÛÏ–ÏÎ×þißßw÷¹ò#ßù¸ï_œçõyÚÝ`Ÿ½þºÈ‡íCvn˜3åƒRàŠÙuÝ*2}H¨A¶oÀ‹qjvMõâ PâÕ¬ÃæÇOÏ&Úç÷ñÎÝå|2ó%¨÷7è$CnOK¨ºÖ©NunÝî„‘e#ÈÖ“ ÀâG_^¸BãÁ5ã<Ó#äxÅóÐÏ'¼A”‚V~^_xÕ^Ué]•kEQ`Êñä˜ß FPÑʯ¢â ,ut2?t>ÖžÐV×iù„Ü;R§Ø¤·ëk–¬ ”¡ ‘öž@þnœê×ÐÛ‡Ýdhç ,ç(_El®™sL÷ѵ¶2­t®5 ÒŽ&Èô1…È¢åÙhëqØœ-àr&e¡¿8øJ ¥}T&Âîìˬ¯F{A¤€iàˆM@ÙÜÇl{Ã(q,#SBÍ „dê¡Ë=Á°QÙ-‡ÕWÉëJ~vV¤@ªÇ#zê;î¥õ¤šõ|tãdï!VŒ˜§bUð_/…;ý‡…=Ãÿ®ùêæüöm½èçÊG+i`ä j*Xa¡,d bŒ #ŒmMrâ0"ÊÈõ’™ªé­ßŠP…±Š#D„¢žÄ-bB¤€ ؃À‚‰Š1×qc‘;x)*E¢‰šRÑøÛáHTT…F7±ñòü-—o7ßá2yo׳ëjzCV5)ÿþí´÷ô÷=¿?z½ùÛk>µÉf3q"q™QZ¿,»NzXóéóO²¿üäÞÁrtçIÆürwg?ŸÿW?×íMÊüOWÿ7°ãü4iUE$@º%ÿÚN±¢ù—„Ùj4)1uÅëÍ`«G'¥·Áí=®½>nÌj]6P 2È ,õ}YwSРÒþý–ïw“‚ÀR”¨°à>þë^øÅh:KÆR¦¨BŠF+Z¡äy$n^uNÑÅ«Ö~®~ä™#{äÜÞ—(ÄcU¼©… ƒ’Q3c‘ª‚•‰bY+N-f(˜ÝîËß»éëcö¥=ì|Îç{ö:y×e •0&£),Y£[šj’Ç€Þ8ÇØç5×Ywö,t÷rá$:Çç9+RH➆º ë‰V;`’Œl “¬Â@Q 4ñÁ¤dB!REVÉ2]脨d§¦ðYšËÃ=õ혆V)V`5@׺)‹°4½’ÏxâéL¬D°/•A¡çïùýº¯_úk,–wå6’4g›x hka¬°w,£—ËWæë_'o¦Ï?åíäQyU\,a"ˆ$Àâ ý˧„j\U‚O\{ç± &×[0‹$®2D£Ét~?oŸJÈxlàaüWýªßžÉü»=þù¦‡·ðk|›Ý÷º6ûÇŒô©a½ŽãŸÊ£O™ýóý¬“ÇçÍÉÓá#p©]ì<¿—y‚ÖSË¥ëâík+=rŸ_…²U€Û4Šé€P8MzÝòUó?Ûoßx>‹Ý5m`aÈ@xfÅ Ì˜é ³§"2Y¸˜ÅÔŸ`Z’DŠ@¡"‰Hš¶@Ö%¦¯\ÛcÐ…èBõT’ùLáqPËT6Pµ¾í§×}Œ.ä7Ž€ž)óñ‹½ô?á~™S\…ºH¬ELj÷øx¿]1 )A›5ƒZ™R‘««Ò]F÷Xà´3a kyØ^’RnРûô’E0:¤9^oD Qظ:àµÒ TXÅ¢i:àC[HS¡D ÂÕU„Ó^êòìMðÉîõG‚žбµ±†àMRÞ{‹ßlbÕGp†ž ®—&"MêäPVïñ‹O·òÖ‡ëOÓäuG§Ѿ³¼z‘ŸßÛUÝ¿ó»Üu´6™ÝÒÛE ‘óâ +Wë† ÇˆÀyµ0×À pÜz ‰6)FÁü8ÊJ¸U †®b,Ì~×ÿ í?@óèˆm¦Â[ù‚mŠŒ-†JŸbª ñÕ pä›éaHv¬dð“¤cs®rØ,dæ¡O6‘'&ÓæôåLR‰¨¿¾¯&ƒ*¡gõûÆ è€Ø¿E\ñyæùYΊnש__¿›Ÿ[žÇŸ'ìGÝš0Žà¼’Y@Ð_…ßUÿ»Q9üQúÏîÖÔÖ~&gôŸÊÔ¾’%¨["YA€¨~µ÷a]Ž;åˆõbŸ±£åÀùóÑùeÔ„ 7úK»» /S øq/#äy«xë銻µâW­ãÁ>&âÔŸ4’®•´t–©]3~o. >Î//Ýßÿ<†¾ýZÖUbàÚxýr3ï¤ÓA$’rTš×­ìþô^ñÂå³0E›Ò‹=›cf\§A¿©×Øüìø#¼ÜÜ„CÜšêr?o”k_ÙŒ¾Š‹‚*u"m ¡)Lh¢R4L²‘3ã›/žÚª<îîŇÜ_-T\ÙÅ“’ªÎ™pi_g?Ÿl‚4b˜`£G•¯®#úîÚçr}¤zääÉw¾°W:5·…÷ì´¯…FŸl‰x–¬Ì(‹Ë2»>{«ŠâbÛߟ½ãÃãiì«ûYìo=]¥Ö’ì’áhÇèÀòù•-Ò eRŽP‡òÇ'3oÅQ@ö7pøÒÃ<Ã'“×o“A Õ«xLj¯…Tµ,'S¥$ª‰Hÿ…ÅeVo ·á@ôdP–v3G¤±ZÏCgd=êŠÐf• `1„%ˆ‹ÄLˆ=Š<Œ h¹:†¨˜Â½úóþ[µïpúêÕ}M»ž§ P‘(تRY»Î×Ã_jÿÙ~Wֲذ›®_Q^^ŽõfýæÆO¹ßùxðçoûã­£L•‰>_õ>wâïü¿¿¤Mø”ÉÝò3û;—oܼ¾ð9Y½åû Pþéëý×Ó•Q"òóJoõ_Å顼èIœô¾AäÏB„‡–õêX$¨4´=Ð §ðøy~eæ[\o?trçk-⻥ƒ°Õ ÛÑSÎ:2›¨òHî­+„‹_|½¾Õã•W}\×hXœb©òÀjà&‡6†H~ÔR2¬{ ÈD\Üm‹Ï &ŒààSXÖa>eOèéa˜Ü ¬‹:æ7ÜäÔ¨r£$5vªq¨8ÈÈÐk”‚Ú" =äŸÔÀÅáåðc÷W¥‹*“G;Ô:¶˜ÆX…¤ÀôºÌiÊiíHÊßþžî‚”r”ïW«Ãqyy‚úNðÍÔ¤ª8äãBÇ3Y E4”…¥a„ÆZT)l¼1‡­£b“ù5Ð3Þ¦^cŸØbvK¥cª F˜WcÅÍK¢¦iašÂÜ®£¾ C-ävÀfR¹ó-›ö×ù·´Ž^ÊÉêȯϬ²7óJs3ȉp¸¸Àä¡6ÑÏìôÞMû39¨¶_÷îìÏð½üý®õuÏÜ[oüïÿJñ×;}„€XxP¨Ç"ˆ2Uû§·ÒXöo2÷ªi%N9ÂIý"_zd²1Üèt!Ãá‰M3‹Z µØ)k‰©ŒÎ}™¨¸$¦:¡²çµ+¦(¥zˆOÝG·üáÞÝ-2Ç©»Zõ{Ø|~9;Û´ÿÙcÍxﺰÒëM+É–lO¦Ó«!;º+Y®Â'T™¬Ýn,Ù"`Nåä´=ñu6Þßïù¶9o“Í$0]0¿Áƒ>î~,Y—µyM¤üK;3cVÇ–??ÈkEwLâ”Âbf”1¥µð0 M1¬L-b+ü8"%™\-ÁÜ ó ¶çÒJUë+÷¯ðj¤Çn‹w)På¦])ª@/W†ìÍP¼Ç,iE[cNmvB=s¥„¡¸öP,Q¯gqüíçkžÑ{gwàÆÞ=ýMðQ#½—š¯¶{÷ɼ³oa%YŽ寻«¾ÿOÿ-õc÷?ûÁöo^~ºÿüz™{ë~òuŸ3A€" @Cc‹,²œÁ5¹¦"ÖÆü[~œmÞõÙm{ÕÄ¢ºP…„t¡rL€µêªkœ¦ Ah­€VD¢ö!Œ,"ª0Då#Ÿq’,iq•>&äk?"ñMsBúôôtó¯ß_þ×äï=êçŒOúþ_¯øëø_žÝWµ½ÓýiœÕ‘¨”’Q+µ¤cÕ⟧ø§^øe5o«XSé:óüAþåÏ;÷ÿ©¯Uû¹nç–Iyr¶µ52Ý&Pý¯*U"@AßÍ3ˆ iRä0õé¨NÅçý½,˜íöíÆs@H!@` iIfŸopÞÃÚÙ²ì©q.ùó½ðj û¥©ôU<61´ «¢*”a0ÄXPV$ª=ÌãjÕ)­õúÂ>¿¾×ÒòæÌ½Þ¢§¬edHç‹ñH"¯J‹,! s¨M¬ï—™?Ã[Íâüú::?…WH&¢ÝÌì$LaÕ4Ê<Ÿ¯¶óLTäÀ-AûÏjÎU™'‡IJÃ:ZB!ÂÌ8´a²]ì:î¿YýR´QF!@uJ-ÉBt8L0&›ÂŽ µ†˜¥F“'‡WÜ6ìnËÌ/áïs…‹Ó¦íêj4¹½7ð€mÂ3Y\>ÀÈÛâ™O«E¶¤œÿê}¤<‡ÝfÝÊöÁ½/“/BXÝç@›\‹÷æÍßïwyßg¯ÔÖŠ–eG€¡+ÄÁ‚MI J$RâèT–h͈Óõd 4åÁ€Á£>µÏ™Ÿu{kw½FîÜùêøgæ›îóòúä×ïŸí/ ŸåîÁ³Üèɯú=3DuZêõ¨¬yNK=üÜbõùÃ+h¥ŒåŒóÊ®XÍ{ôv:Ôývo À؃ƒÀ0;}.¨è¨B²…Ì Pf¨}Îßò=k|wÇû!¯Ógøþýâ_³â?r‘_¢j*U܇ ]\n¢¡ŸM«÷.,I$Ì0NÿÔóz{ö‡súã_¿^~¾Þyå±Üò)Jsðä¯î4s²”ÓÏ=sí+‡Öïzº>˜úñÝ™ÝÉrÈ>vàau߼ƉBwXóZ²7§FÓ³øRí"ße’n¥ºêe\ ?Þ•³fUrôÅŒ>~˜5Õq÷ÏãP—¡Ü•ÒÚJ*²îè®e]_ì{¤,Yî±`è›øÃ^¦°wÒïd6C5Œc\«á®]~Bä ?Ð8©c+€~õâŠB”§ÆºH¯Äîwœ]Kù@ Çóy_ívŠœ¶2$¨Ð’büT×9¢T‘*îæàÏ«U;Ð5Éî3à< ÞV1ï&£í%âˆÐI^\z¾ Ú ¨¾«î“¡vEj)«Êéûš^«®ÈA•K’B¹T¥_Õ‰ê G£ÕŸs˜xä$9ó$ÐcAçÎ]V1á÷Ò¾œô¤ì²­FÃ7ÚÚb·CÔö6õ/!GšÀYÊâþZ¾9¯Ü³]eŸÁ°«L£@U)h&Êï IK±Ž®#U+ìÄ,*&g¦ŒC¾ À"ú´• l8Í­ûõßò΋ÑFœÆ>=_OÍ]*<Í;¼–œž}7(K«»Š'¸€gUT ¿à áâÌŸ?¦*@ˆ)*Ó½â1żþ‘¿M$/’£yí)SÅ¿¡Í|øØ·ÝîûH¢Ë穯ñ(³†‚F:00Ãtó<&y/ný–ÞÒ]±†&U@2Bàiˆ×ê{U+ÖÌdeB¢Ä /˜_5¨€€ %áã¯õ“-ÀŠõÆ™°§Ë{ìrê£çó½G9¿ŸÏ†P@J«Â1…Ô”p€e`¿d…íÐêŠ/‰æ6Ѱó°ë4Ù?³òÝ6ó½€Ñ!“õŒéw}NBÚ¥í B¯e˜„Qga×’àf£`R€­óÚS͇jóOª×?k+³½Òn1]˜ð‚y‹]ºÁ®Ÿ\Ù;.£Æa‰CÂ]FgÈÃÊZª`ŧì­úM\^´‘7»»éí3]“>ð›ÎãÏgyûúÞ ñÅIN5]–ˆ ê¼bœù|= ¨`h'¶ƒX ô*Ë‚îYÞ³>·HÐTØNs 㣋ÿí©÷yh²1/Ef›ý'Û ÅDq¶ökçaŠ+§\),gQˆ69÷“qµ‚ sÜ•aÉ€ñöÔ7Ãü‰ó±åWÈ÷Å$ÊBÀo°Ë›ÔO:XSÖœ3‰­\nï‘£Ã^Ìå¸óyy~§üˆ'вr¡Z™Ô°æ£Rñ<{Tš»W¸±ªPtf×Ǽôx×Â?›Ù=<†òMMáÞÏD’º~éÅ_‹øë¤üº,žùMÛþÞ ]V_HuùÞŠnN£.×™s(ró¿^ò[ ᤻o<©üè>@G“Ö3W¿pÎqI“Ÿy³‰7ŒÍ)÷ä6ox;~]½­m”ÕnLcZUƒ:¹¶¡`FÐ0îË#í™Ë§íטÏäõŒ|ÿ¸¾©žE÷ÜPŽM{x{ûŠŠF¡B¤„ó×ÑèT u”ߨ©W\/açt¶«ÎŒˆ{f\L¸‡>]LÕI5Ä=ý{Nf5ìjÞs˜«dkNUÀá,X/Ù\–õ£Ö}r…uoÛŒ7;è²P’œ gõö°â·SÈK¢0ŒqÎCÍ„¦2ÊLâùÒuíÿ?€ú|¡@;^kv ÙŽW£‡]‚¢×3vCqjÏˇ"Diè›C1ÖÈ}sL2o1¹|zœ8u‘”aÚéÊîqÆŠuÜ]óÚØa`ªÕôÖUb^@ †ÍOr¬û?3…yqÓî<ÿQ!Ýâ5W‰¢Ø£eåVäèp('µ<2Ä¿ž­ŸÞÏ(+qG*†5’郌xÿìÒ[ýôùð_ße?k1XŠõ-ÛtYx|õúT²_N½ÐÐFbØ¢…<‚À!QÖŸcÍüòë=|½ãB…*’C˜áQ¢4 /Å Iâ#zåˆX²‡Ë£b•Þö+¶°ƒ…?:±¿$3G³6Š Çùµ ƒ«ÍS¨¦¶¤÷ÇzµÅø*º"·ìÕ‹MÖUÍǃ2ë‹g…ä??í_‘þ˽å¼pnGÙú±HwƒPu>›QÛÁçair›ø@t@Ùo½z£»ß¸ð}Qê¨ š2OŒÀÒ¬WóãÔ @FÑ<ʉ]Q˜49ͳvl¡V“?g††™è²ïE\2]Av7kNÀJ;dÛ‘Ø"ÑÒ¯Y J ŽäòŠsvâg•²`ËkŽÌÓU*D d_åÊÆÏªVÛºKïj‡[¾šQ5D¬®8z¯BѽÐuÓ~:”Ö]À¨Õ¥¼í¢wãÝöQýU®iBù‹ …Þ¸ã«ß3ž¨xÅ@Op¿=>Ä‹ÿÉ8k˜ g­/Ü4?=à 宧œ6\ÞâÈŒRD1»=_þ×t'hM§ÿØÝqü—x'+t¢„羄ðëÙ<,æV˜ªLʬˆÍ¸.‡0²ìx];0‰7ïŠaèHS*(Ü)צ{¯2£§²Í¶´CÉ$,=šSá0Bf8 xÐ$t•Np•§|3ŽÔ»K÷ɽÕý7–×X‡_(3kë*zrÙãS% ¥øÒTJŠê:’¾ÅÆ„?ûû¹Sáóñ°¼šß'ÆtMÓý_ò§ù7½ ?.Dò-¤Ã1Û¤ÕÓZ]âþa@R¢†]a3½]b•¶G ƒÐ«bá-½ ›œ0b¤ÈiM¶ÓÉÿúËî9$ϧ£é€šÜ¢FÓçÙËÛo¹º±ûyRç>Ä 9ÒeN¨µ=ÎhGŽO˜ âxÞŽ”!^°dV¿¥µÌŠo$å$üéW&œ…\;þÕo†ó†§Soa|l‡Œïñ ÷‚‡öõbkC/a'EÌ vóIwIúc?Œ¹‚뾪ç_¿Ü¹ÒÈÀ7¹È‹‚6út&² …€ E'NP!ûÄÏŠUx'¯Zd« ‹/ÿûž6ö\ßìn̶O¸=ÒÎ mˤŽBè`RΙÂ:_2#Žlp“ê°=Æ‘nòŽ-:•/„9Haú™áwÝüöï»ùÑ—ÉH<3ý§3ÌGü¹«»¿¹ŸÉQHjˆQa“ ¨<ýŒ× _õ^ßÁüŸãy}x%=ĽÛ/_o“ÍW)@ˆ ÁíüËpÀkZCï¯Ú÷èË|•¹´7ô<¦o+k/¾4?Â(Gˆ©k¯PÛ¨¦•4]ÕmÂk»à2(±ÓÄ ¾‡ˆ§lbs\ÒÈÀµdõàd•X| 2§©ÕçkµÏ¢2Ñâo¯êßwÑ3Ù;þ»ÿ)7}O¿¬_?ÆñìxN¾2³ò†Xû¦t$Ÿ7û»¶šyBÚ½ÝÁØ5MÅñyÊû“¿ÛR('J³ÿ5chŽ—m :Ja ôª)=‹ØÅB3(”vG® #%½&?¯>'FÆh1 €4Óè¬~.a°Åòvœ·(‹ÁxÞÉá—ÿúóþOS£×"ÊëI4¦ê¬ .E°­DM˳ØÁõ¼š ‹N¹‡gÜ·yÝ`Gé1” iÔ,r\‘Êêp¤F-‰I®œàÂzXZR9Ã)p ·€r ‰ª(‚G§>¯s‡ýH¯[λÎÍ㬷ۼv°0ûn¹âú|ÿþ:{àÈëu:3çªÒn4µ+kv/«r쑾ժ¤¢† GNt;ß}#cn£†mŒ7Ì“M@E •J ¨† 3½n_cÈ~²û›~^zò^ÐkîÃ|¯ø}¾Ìç>9ßî=Ä+´u_&ä|^»¨ô‡ùõÐ~zn/@Kw‘°“|üq÷u9ޱú3­<É2îÿåçKË1…)šRþõg½§­tu…ót÷ÃùúG˜¶Åä3¿ÿæê ¹²Óðµ?ï;©¶4ÕŽ+£'é?Kíúñ‚gÁ~Ëõ㬷!G*ò ¥­Õ<R6(/ðÃé”ìíöTOÁùÅÏoüº£k±s¿yâ¨%ßËÑ:ñyJþÒ§j-­m¨æÓ~–”½¯aªãÅ~ù†Aè{ÐצcFÚQR>ÄÞ€(mÔΰ‰²Óuq;æ$mßmõ²´#®1^žOÿÌ49(µ; @‹ ä2ÂÓáÔM*È Í©óép0¦‡àõÉ?ƒŸæKDö††ÅnP(ÊŠ1! ºq;’Øp´…ùÉœßÇ‘ëŠK°ˆ±"jK^†i>Jj\.ÚT>ü‹Å6š†3Ò p27s&%¢"åä]J‰ç'^¸HKfQùƒW+úgôþ:wÿŠ3Uñõ¶þñåìôõ£ýÌÓWÀ4 9¨—âÆØ+OÔ–ÛW €MŒƒ‘4»X»X¿X„ÂI‹^G7fü{þõ~wT0·ª YG@J”'Ô"9%¼V:çåWÛå§à5;XžÛ—žoŸyš€Ð @pÈ~4±º>µÏ»ÛîçJI…€ªyo² &P°“©Ú?W¿™vH@B¨˜(ñY F4û‡_Zÿù2Œl÷”Ùþƒo½±Ë´7ÀöŠÈŽ8?Næ1¥·ýò¾ß–Òà1列¢.Œ.ÏÚ†»ˆRä¶%ºÓ܆yÀKÆç¦€Â‰Ý?±Í¼‡gÈ›E˜Ã@ì༰Æ$¥….ó>ÓΠÇs59GŒ(À‰ ó›á»Rhçñòäå¾Ç³»rVí2r) ’ù¡•¡ } ©)ÿš’œs¡ ·½¶Ö¤¬•°÷íªW r•¥£² 9àÜME>€_Ù·æ sÉ—&r½ˆ^k—KòA!i‹Lx°Ürƒ¨È–¼ú vÜÞf Ç 0¿À\9Ÿý©hœ­ÌÙõk3Ôvg}A¾8˜)¹up4ÚÉ–_<÷ÇóÅwÍÏoÓˆSŽƒ™*Oäjʃ[îHwãÏå7VÔwI&ƒ©IêE: úêëáû9Ítûö“Š)CûŽÝcàâp˜j* Å » ¡kLÛ¹Î"T*ïÆÞ…Ñzx;…7Œ&w?üêQVîV4fkŸÉö[ur¬È..»³žÙgßq²þŸ”S}GŸOî2j1-÷«õÍl’&ßÂêF?½r̯´uy‹.ûl–Wºœˆqö)Ï¿z®>ÿËó>‹ãêµn÷?ÿMزÒvÒöûâ­Ú¡¹!ÀbR%IÎ$¼þð ë:=xõõWÜžwî9›ÛÎ%Ë3wm’Ko+ñÀg»œk/Ø#ÆJ×K|ïïŽW+"Fú̵¯)—p梣ã4™¨­Ä†Åî9_Ñrd ÝœŒ>ñ½Níº‡žŠ¬y#ãYÏaV8½æbšK¯j]yk¢$ –“ê(kÕ ï׉Ԩ×nc®a(‡ Š-š<+ÎEZÈ`µƒ‚ém6XNoÜ|{P.!G†¬ôLøª"×µç£_NE¸ˆB¼ˆ•7tP`À@ÉE.›*M¿ÓÅÏ|ñ—¼þÛÆNðâžÂ­tfxÄòì}OÕÌ¡‘2“Ê[7V܇×ou=¾¼.}K?J?’B‘™€ ºý‚uˆ5ˆH/¡2õúÖüx`, v¤ò‚Ì163W× Vþ›|ìîÏO†z³Qá!4&(HéKJçVÔ!Œ‘´að4q$Á¶”"‹ÊÃætT‚š—xÕª€µÍm¤AÑ{øHî¤ ^Òq×#À[~×ä»~Õ=ýzÍŸ;šOOºíg©ÎÚ˜KÁ¯./u—Ÿ‚®¦›õ¾p[_ïÕј²a! 0k~_às~&¾ÞûíÒÿø­<_|UùOËúݼàü¾™±Ç ±tKMJúÄæâ,ñV.7@ÕÉvÓh[à:¿(øM×E9ر«penOF²wØêâ¨L¼J¦)Ú"—ÚµÖvëšAÇ&&9qÝ$YèË­Žg·nÆÞ¼Ÿ|}Á`a«tãIìh¯>©É5-,õcóˆþkÎ)^óœqS$ÕªV? à(@ WõŸ¢~Sy ÇWpŽÅþ«E§ºP ƒ´pk9Ün¾SOuJ:eÜŠXZÊMXœ‘ŠCûLôÙÞç©×í°a‰a§fäå½9è«|O½±&f£•¡3;—þYvhM[£ë$­%kFáj·e{ÿðo±¦€H EÇ"V/ºqÏÙ­Ã3ö'~·ö®gfwÞ›èLÉCQüÎçÜI#LÑ'"»£ÞtÉÊÌ`¬Ã,¯X—H»MI¡D”‡+SåJ=Ô§ƒ®¥M\óBCÀ>—BÁE6»ÔhÕL‡ÒM4J„°.yà ~•çØ$”éPfîüûíýùLi½º÷×÷÷’ü\±f¸.¿÷ÛOABgƺÃmxXà&§ÓCt÷Õò}À†žäÎíàãÙkø£‘_cù×o©Í˺.þø»pª’Ug žÑO[Ÿª’å˜gscg8ð¼Äáiš$Æè¦k…™¡@M†FIŒ)ì¬øÐÿ,>6³2Cz¢„û¨†¼59ÝGvãš̶uU]{ošï;¾ùzõç}.´“µÂå^mÝ}-o‹^ä\zªøê‹þnj³ˆ& ¯G•bæNCÔ-ŸàÓÖÙ0”<'8/ü¾{óÛû掕 ·Ÿ 9¿†ß;¨Ò©Ë"èØóšf^T#„P@ ެU˜A´rªÒÜÁOœûW?ä<üüú󿮋ׇ̤߮{HáU³18íìßûðÉù:PÈDázVÁ"”E¢cà¢+Âm'–À©¹²cõ ž!d µC¯g‹¹Âåô“ö\ö_ýnÁJûÂnüǺcšó ½Oùõ³„Èb€:XYGmHRןZüó×Ï×Úy­–Á÷køWœÿë÷ÚªòáõCöoÏâÿ?¯ý/ýOÿ׃žp‚ÐÄHË ! X½bÛa5¡3º—»B)kôÂ$l’-éQ ÏTî¹ÖÞë¿ýy¿Õý׳¯?}ck8ez?†6pD.%tGè’ ìTåúï5ø‰G|ûõ¿-_eʈÀx^*€Ž]R% ­4«›‹*Xc¸ÂS,°hÁÁc^7àÎ܈9…ƒ–A‚@* ª²EÁ‰€ €ˆ†“PØÒ¢gǼ†k¨JŸÝÍÑýxÄœÎ#ï·šÁ4ÆÙ^–ìoSŸÌœEh=ؼ(ÏØFÝiƒšPgíL§´Fôs¾óî|»þŸçžwê æÎ ÎmÆñÐQ iôßZ^dÂ,„5¶¨…‚¨zÐA5¨–.pfòM¾5£Íº7œ¡MGÑáÎ4>;ëé!’ôPZ;íP}Â#4»úÓŸ÷?.{ïówþÓëW½¶5÷¢ß§àøÇïÜ÷óê+|™ßì›șœËGE=ï‹îÿ›×¿¦#üÈ:±Þ·eTijŒb¸kÝÓuÌÝäÁžÞ£`OI "õÁDSzã1Ú¾ßt%b€‰(@(ROÜ®úSXñ#ƒ e©h”ëøÆ¸ô}7•§r‹²îæLe0Å"Foì_ïÇ)ߟšU"ï1cƒZè£ÌD`©tmtƒ‚£@ˆLBQ, &,HB çëü<-…çÚc³v'Q%{h€«¶­Ý6ÈEÇ0'%c9ÔiÄŸ°jþòÓá¶x¦¥e¦möóûœŸá^gÉ EeuŠk0}¬m @FÁ\Ø PHCíÃW(¸…Û%ÚÄ´lJ·¤PlTSwJ,¼7ü庵¾B„49…UZ5:«·íUR2@<îz#-?1 û,sMÔ “3gtO:‰(9„²¢/*_ûEwaG48A§Û/RœvP‹<å>.ºpÓXd"¾™þ¦T^®—÷‰ôNNËvôÜMÄLÐÇ üÒÿ ½ì²°Ò[í€G±ª¸Ñy¦`íÔ o ŽV@ßôÒO모¼Žôe¦ a+ÇÌʦZ—k8_œõÇæxÔs"”ø¹'«è±5éɾ&±4Ò𚜉'eª;%k_êúÔ¶MÙdJÅ M"š^ëý]h…­ô6xãn.%½ÂîÎ*ÍðëæÖ=ÍlbnžÇO³¾ ×âGðpá _ìÌ6‡á(>?¾µ?ìüVs±ŸÚEåä“–µþ<‰oòëߦÈìkûó%S§Õ'-u °[&Úw™¼Èû0‡¬/”ë‚>È4#YpN«žpûÀGþ=̧àÔþîg*+llò ù›ds¶âGR ¨3)1»ÐkqÕQ+SÉÒ¾N9Õ…ºã¹‰ÞÝÆ¯| á9ϱ8W.ÐÜáìÔô트£>$ŒÔõÍÔýr¥XªÒvZ»jŸ¥´·bëýÃÓ¼r^rs8+ GK¨ÛÕpügW;ž,»5ÇŒ±HÖ*dFÉ‹šŽ é‹çðù{ò9‘³º>õY&ù`¢ú|=—’£Pjþ´|vu9…剺]ÓeŸŸ¶E”Í“@åõMÎ`åäµ ‡–§²?Ójjœ¸"qï–©Dw jêeäžÁW¤ú IYYÐIj——+± ¡[2ÕqÕöŨ5Þ³‰+MnM:º¼{\g ßž ”ï" “Æf8[«î b:tYgƒ‚-ymè†Ç¬ÔÀÈ+0‘—Ñ©Ž‡´j5@ûqözsAY™:ÌÃY¥wôú­Úóaãs@I+8 Ú¡‡s°®˜ýx-ºÌxü:ËŽX¼Z* ¹î¹4NüÁD¥w(ëîT©9É/ õŽ;è lo,\‘Û¢žðiÕ"Ö˜Qn!18ÈC¡œbwµL@§,‹çô Ý ¤:*}°íÚûs™ÕáêŸnøØ·¢:HI(ì% a ’¤Nô´À;¨4 •Pš@ãÞqHEIQ$Z›­Rו ´’G$`SÁ†$ ÓK}åÆ"Øš7²w߸¸¼õæs¾:Z¤­~N-]‹%5ñ%é<7h‡®`gïrÞ¼û…j( ŽIIiÚ2¹u)¯“¿yËÌë?Í5Ä;vC):ËG¥>_v'”‰9Ôߨû™¹a®8@ƒ·J¡ÑŒšKªÛ]Ð)¨ä×Ùqˆ/f´­@ Pða?a¾uK)úlURyœföÙß”“‰Š~sÆh{ëko²~ß#ÑHSµ`Ñ: ª¸(èÂtý~Öñt…ÆIu7XŒTºÊÚÌ¢ÉÏ™ýÕ7C>v’Mr:ˉHÝuªË¢ê8h¥††Þç¡ ’/Ï‹O Íý ÿ‡›ûµX”޾y¯‘.Ëgv½«Qûç½}NfrOôHwÙJ´i‚zãŸWbúñÓ>3a+ªºuø³ ž™EvNVn@æ°û3¹ÿÜ€ XÂÞ ˜B5ÑQ?p”ÏýrôŸßüѺ"Ýß)÷íËöî°&1§6G­SeÝwŽVië|m¦ò"Òà+¬÷ÇC}Kuö±Œìl¥}ýîU‚'ï >ž}]‹¹\ýu9ìUØ-õ¥³I5ÔéC&•-àö…"–ŽDš&rã-ï·æúRw?SâDK:YÌ Ád?Õ÷ãÑù:™Ðc€U¡²Ì¢ÜÔ‰ahÝJp E±žÿïõ뉵šþÏ÷L8÷“Z¤´üÙk\{µs[× K•~VBjå,VÈ\H`7¬['nKjCÉ0P«š&;=Ö Ñhf›4wü£x꽇NúW‰ä×Uü.¼,ŽT'’Tõ\õä:ÌOãóÊ·Ëß|~Óß»ªì˜Æ[Û'é«OÙ•<Î^©ûJ0"@@ Œf ÄVc·¬!·T=Ÿ¬—PYæ¾ýk¿ÿ=ØëñÛxwÑí“Ç ¯½BQŸù««y¯‡÷¾Üç "•¡hÅŒGèáÀ&ê€Öd ƨ@Uºôˆ9$󑌇9æÄïÜ·‡/o?Ÿÿgãï¿u‹Ãôïçäó£üùtóXÝ¿>œgè”×D‡f à§4-ñÙ‡²bEMNÚ¿9}>ßþÇ«–ý¬‰­]PÞNÙú真¥[ÌcbˆÙVŒ Å  Eæ:SxÊ}B÷ØoW–óõæµY`cCI×ÃÛµ÷—d“4ɬÿþ׿½ÙK Ÿ™}>ÆMÔ>ÒÒm©Í}’s¼º:»É3Ê×›3i¨ƒq¢X¢>âÚ;@vz¶ÝÿÞý¼ò†ïcÜìÿ±ÿ•vq¾Ê«sþ§¿þ™¿}þÒüþœ~jí^;ˆkÆÓçú' ·ú¶¤ßqø}b^«’¸êú8ì©™À†_^>–¿7aïpá÷­ÞLvJz ŸtP¿ï­783¶ÁQ‘<Ú›_ú=Å›Ísmž‡ßÏÕÔ—oãõ{ÙO5\ßM-V³(驳/1_Þ»¶[gYzzõŠºã>BVú𷙣ñ6Ы4]¶ÅJ I£ æ†þS,+ŸO_S³o)‡C̳lJ2’ôÍþÈËmùY?~ñÿšl§˜n‡Á>Á"Ôa‰—TóéVÌ"̵ «OÄdòvÈŠÕýú›µ!o69`Þ>¾,ôÙ`En¦°BŸ½0Ý­"l ]faF&žUÍ[Êt«Þì°ëvÂø.ýÊzÒuq0/¡¬¤µ| žVJ8{ï,Ïív~^Íl§,.S麜À¶˜Á=1·îf}‹«™ü¦PôHÛËÛœG½ÚJ½ù”lX­éî5afÒb8òV ëÂÉ­XYVw ë—?À#—ûW¬˜·ß²ùÒèî|¾c'ïQ}çkŸ&{¹d2ºÀ‚Õã2Ô¢{`x˜¢± 4^†k’/ç4ê!‡Á­Äý¯oÿä—F£\ª$\‡Ôaµ2°¨Ý–Þß6WÿžéÌé |BL‚‰Õ>¬öÆe3f¢"Ý MÙ1Ë‘e÷€¦.'28„b0¨)A!˜J¬D"1• ¤¸ >Á Ppp(É‹^‹ýó…yb§p¤Ñ.øcÒ/¿WM_??Ùl_ÞÄÇd¹p¬m­ºÎšö:Å|M¹™¡\ÙU¹É.ËQXŽY¶- q/m)¹{¨5xß…è ˆúSùykƇEªŒE¤è2¸Î C²²™#°¦}+¬ €ŒH±ÆA8ŠŽö»!i.j`Þ¤3íÚ°ø©Ëû­8˜÷™»Hu¡¸½¦42†![¼•°èÃh­œ²À7{Þ«^û”„BßÚj Ä…Fº4¼êvm)]ÈÛÂ%XÕª^6®4=J÷b;—a¿ë×!á¯ÕtÆsÜ䬒A»t¿s6kàœïþiyç=ó~ÞX¸¥B$ºÉ¯)‡¬žß»ÜòÀX¿þ]ÜwpO”’¥Nò[”äOŽ‹7ýh8%‹5@Uϼu¼TYãVjUÅW¦ð¤!ÒØúÂwß[çÁÜã܈ÓÕ|êŠlãæxÞr"¼ÖwÞÅNŠ“±êíØÌF9ìËVÓú+ö%î•pg홾„¾æÂI]äåCЉ¼Àå¿ÿ]{`3é}ö$A2Ÿð%ù¡?㛄*Òr¨êMÚ¹Ò¯±˜~Øül Õ»WwÇìu~5£ :ªJ_KR |êNN†ƒë\εW] (S0ºàðGîs¦êý=1¯æŠŠö^”oà°îœÃ$ßý¼»ó¢ÖïÍ+bsü`»Ž4¡)µ£CÁÛkJWäèU¾ÛÞßÛ5àÏuïå+nìñü†‰€Èë`¾Õæ«¡F&th­()ãCaÇmGì¬X0¡Á¢£,A®‹Ÿ¨Ý¶çóaf…½ÔÔ8«ZçÃIî}yÇÈÍîÓòqbKS2§OP(}ßÇÃÈ7IFz>þ䨰–ó‹BPsÊÛy+s*ôÝŒOß? ºÜ-% ¡’×í½9ÎÎ!cju*IŸÙÔŠq]çŽ{UΨÎ+õ—Ϲ×&VK#ª” íê'6ãaAÊ‹WÐqN6Aöhº'£ñg“æ€ô ÷réÎ/@ÛÎkV S'Dë´'ÙðŒ‰fªF¼RÈ|Ú2¹ºï°2ú 2éVýF Kdg“YFi˳mDîãÔûy77Ù¤0N¾ ! .ãyMöÚ„DD"O¶N0$Ñç>}° ¨Fk䉰*t’‘LyUß¶4óO´¢ããûAa|½q’>‘¸GþðÇÄyðŽ€Ö'}M…þ|Ù›ä¼g¹Lð,´¶në]z÷ú –¶n¾Ü¯Ý_x6ÈúîOìíOxú¶Ž:÷ÒÔÖ®±›A»8}|ùñ"v–¶„º©8•ò¯4œ4\Ïí\djHÂÕÏgûaurÈÕË8WØ¢Ó߯Ó×Çß§š«&Êø©O*² V2…LE•Ö8Ìu !!¶5C§¿ü÷ý¼?µR"¬u³BÙK_Ó˜¢-–o¸ë”&ÃÆ©Pè"­Ù©Á· <§HÈ­ê9}æ¿FqÐW—ð|ÿGΩŒ^÷¢ƒÿÓ÷ o¦5/š’éœ.QºÒ®ç(¶‘Ûà°Y7§Î:ª±•»ª+j3‰¹»Ä¹á´Ñ’Jd%ztt¾—kZ¹qþžØáfQ|È$ß_œÇ¯îaÒÇM“ëà}§l (6!щé4¥Sq‚>”þùôß;ò¯f9…`'(¨ \ 7Ð| ûíÚÅrŸ‡š :fýùkünóWû‹Ž8Rò<ßíÅŸ_è%’³|]c4Ø}ªùé~¶µ9‚ÁðþÄFCóàôì{ÞHUîâò¼w÷À2~n«½éÔKW¶C¾€Ô=æùÁð´§!}’ û1 uëéN1|ãÏë\è<÷yãû³3ûõ:˜ R¸¤M VzyÝ›ç^·gr&Ô²a¦%•&7ÎÁ´R­_þ¶>îçÕË-³µ óBL¥¢7&ƒ4ë¢Ð~Á“BºÌ-m±X°Ù)ÔÒ06\$Œ&æ€4JË—O©ýoOZœæÐγtnEᚇž.³ÖcKfÌL;Ò_;uÑu"ï¡ÀTDÍ«†D×yµßä™Y϶±ÏÕ~ö·+~žˆ"ÏÒ±UFY;H‹À"J BܶÙñd†“Ž˜ºD¡á×e U?}þ­ý'o~^ÃÉ6§=Ÿ5”Ç0y™¹ùèÓNHåîÉåÉ1”¯DD°QÂ¥’Ïž›_È*abªZ¥Y-2¼D*Yv°ÈB–c[râU¢ÖOZ—íý#åÍŠ›Áëú? üïÔÎ…îþ{ŸO sÑõzgAˆŒÞ!ÂYH–0Æߣ‡½_GϽ_ó_>ás^þÛ×ä~Š/Þ£þ~ÿMàsDœÐ†;ñ|ääì[¸¬zUJÁœv²6åýšõG-¾w÷ Ì3ìO?sƒ!‚˜ÝÜÉ??º’oMû­oÛŒ”±á²‰B QR­Í (6€dn`2c©³‡ôHKT8£õ…šÆs—|Õ—Ï}Ÿë>ªB 0 P |M޽N‰±IC^_x\Ü „8‚æ`ÚAõ±Þ2“çi;ÝsPfÔï•ûãW'7¯¿“b÷µŽámzÁC"¾éÐ%îâœùûÙûuüÛŸÚ&0ŸþùùÜ?ýú÷õÃ?üÿ—ÏŸâÅÆí g!‰Ž?… ÃäÕ|žÿ1S\ü~µïOÿ½£ïÙ½zTM'8çݤŠè 63 !¥J¦mדÓõ2XUv–þë)þœDI@"C®&RGê8zéu;>×Çùyç<<}÷Â÷.˜Ì̵}[:VOp6ĤŽÃY0døJ Ø^&{ñ3Ãc­ÇöÇ~WôrJB8,TP¿•ö²/m;ûP„˜AÄŠQÁµ¬ !çÉD¨ØYϧx‰oÚ‡ÆïNê¾Uÿ\ƒ,@T<=孵͇r3×øÂÞ2ghçç®­³õU·øÞbVºF/·€Ãñ|yÄ=ÐUêèÔû+¿5>èŽóxâõ­’¯UCwªŽ­£}?,\g÷Þñí ß:¥ŸÞ¥ü=Iž»{–sàóïÀaŸÓü¸Öº`O)ÁF!$ HæÅ-aRz9<‹Å>ÑÓ(žo»<¿ôõ9™ot‡æ{«Ÿ.-Åž¾¿ú/póòBØK¹æVúÕu›«10#ÞsÒ÷‚JÀÚc`ËVd®ÚL¡•¬IÒ•i©n$²=#8k\99ËÊž†´JÏíèãäì±£x#Òò˜6‹WÒÃ#Óäw M ×/!`"U™V˜<±Ø.ÄDX™€‚pÖ¹õuÖ¡ÝæD"Gþ:¿ÂÌ_ù¤W‡ç½ÂonÆã^2ÄãóœZ÷·‡jWòsˆ‰êusBÓÁŇky<•vG›¡¼ïB>zX#îÃl‚™¼_¦ŸÁÇ)¸3ÌXÊ 5ÀÆC6¬AÞÂ_t=e©1 ®®qÏ(ål8˜³Ÿañ)r$Ó¥¿üJoš?‰¶(\Û•õ4¡´¥ƒÍâ–ó,Á,Ò†Þ Õ …e Gœ¶åJÜW»UÞô:BØr)2xÝyR_ûʶ nézaÇnÓâZH›5n?¹oàhh³ÒiI$»Ü)»Ú‡‹•Þô±)2ÇM7DP7 H¬ûÙs¸dë½â¦Þp¥ûOõzogîµ7Z/wâ¦?G2ÉÜ* ™®šñ¢G±I­o6ç€õµÊ¾tëõ¬À0'Ù¢‘SÛxÈpxTÆÆåxíÈTV§«\x¥žs£†¹ÜÚ‹9-èó*² òy³A8;©µNùAß>œ’F›éå°l'›ÂCƒV¹*ŸæË‚ø=«Í]f¼]˜`Óß‚[” ôoÛ¾;¶d„ϺOy!w^ÊíºXd%JÍÎXà•©Xï(¦/ k eÒüùde3 ‚rñyáÕîx‹ÖsýîhM;‘›Ð͸tÿüÎû­Ç,79œ¿?fù ”ÜpÕWUèdtôù'1x²˜ošéÎ-ƒîÛãðéçÍA#ŸÃúÛ¦7*(t†7ìU¥•Æe9#¶µÆ Ç¢GUš‰Æ¬ä1ÍŠí ¯PÛËï0k#Ÿ¿žýãúÏ3žŸæªI’éôg±àºäÈeRðÄ,'&Nß­em14}Ï®é†f¨—ÕÇ ú“…à»I¢…ýåoö_àZ¬cZ§Mî‘é·Ö™a­ÌDÕµ¯Ö¬È$|Ö`¢T›|{WHþ‘÷M3!¬rù•Þ§«[~ ΗyÜú±mqsˆ_þüÛèƒðˆïSˆÕ@£FÿÙUK=KRÆ»ÆÛš v®Â%Û“.J‹DOwÏ NÓŠ– ~:\H8$,äÎR"˜çP‡h4©Lãv\î8oÄ7äuQör½3K÷®exº*ErD‘XÆ(Ç$œ¯±„¬db›ŒÄÈIÀ%Lˆ’ ‘ÖwD'Ñ4ºÂØ¥âGq?¦ÃaˆÜÆüB u¢µ­³E*©‡´‹"%–x)•†Ži1p¨„¬Ð¤SüWqÒ?ÎYDCGhrÆa¥8j±r©c=Öq¢‹å=ƒš2·L¦:bf0ñ`º¼8ò#96ÒMFT˜\$EÆ!YI"ݦÀvU¾œPñx0”ùÝß Õß0}Tƒþ”þƒj°6 ñù™§¥{gü ëŒs艊T2 Â¡Sº¤”‰4…†µ’.¤qÛ£Ÿè‘æ¬HÓšh¡88d¸<^|P–Â"’…$ª Û¢ÕZÎÝb¥®¥ÒÞÐÏ?¡]{jRo§­Ä¢ßþæFóÏ÷î½ÙóæõÓïoMöxœþëíÖ«Œûcš…å¯Sí¼þ}ï·ÞÌ×§©$×ϵ»ìÕüýbÏ}±3Ø|^ò Áq |5¥½ hã…XHMEàÀ_u|ÞËHX¿â:6ž(Ѓb“”BÐuîGö‹™íе^kg“~r 3™óÚõ²÷»S>i‡ëž¦Ç\óX&V4^ÁÝ&-cZ/iëõÅVuõS·HQ  D a2Ó­»¯Põ+gEQˆl3¬&ѱ¸ÊD„/,;M&ç¸~Dèi/ýxÄÌí~àöâ­d¢tõuO~Ûî|/Rê$ÁœÈ¤ÛOW´÷Êóñ'Çí+;ÐÚ¶ÏÇ¿HZ_c.oîðby¬>ÃB•²"ñ7¾Ù]§Á,T*µ×r÷ÊtÛ£8ˆ•‚ö>S LƒBª¬¡¸Ö\ «ÄIm*©à$õˆ\œ…¡xòåMRµï´¼Â …—ÕxF!Π6K€ÀÞçxܸ˜ú¬ÓüK?®ð6ÏyÖC$ˆ–´.\ <äºëÜô¹,­¶ˆÁÇnª1wàsô¥4ó^ó:9×ààÌW'ÓjóÛï(ýÒçSÃe©ž × ԕ箆Æš!Ô = òÙoÁߎȞ}-0q‡žÈSç]_þ>¯Ÿ=R>v*2Eƶ>¡ï2…­?‰\»U³‹â<÷mýŸ|ímóÿ¼ýÏøòׯ”«¿k|ûp?Á;?–¸qP_Ý×ò!Í.¿,ëüH·./»QQõWrõÍLþwÑ}Û?”)u7¿)eþr=*_à„,cçÝȱ€“Ñ‹ÐóÉ>ߙݽn?€Ýù áW¾¥ѽUâbg3ÄÀªO¹Dm`ä£ú¼rÏGd™ŠÞÀqŽ­}JÞ;¿È¶æpöò¬ R\€…vLE„2ÅðäI$èÒiíXc:0D-èÆ¤ª`Pp± $@Õ ™€ç¹ç0Hƒ‘ˆ‚ˆ††%wëÉýÜ5%qGÓ`š€ðiF­·Ž'­^šÖTVœ Æ”Ä;„Lv˜Wòn{»Û6ºŠ±íÿ@(ÌžVL Bãð÷§ QjHêü°I¼»ÀP‚‚êÆ[i ¶e­kRùÌø!}šŽª»vÈÝtc~*úFrðÞ­í•Á^[­ðt1â,°! j¾cµÒ"¿ùó—ôNïî&§ýõôÿÍ¡üwÿ#ÙÕ÷2>-± XdêŠ ¿5ÿáúMóÓ’?†Û%¼&í ;h&¯O±:©ŠMf, P¡t×ûÔjüÿµÌØ;þä_üêÿg‚¤Gò:ENG œôHcTgž¶îLò¶×‡ö£Ÿ´ÎxJކo Ù¯ñ@®£ÊEM  ÄQiû‚ÇGF”£Ò°Ë;õF¤Ãìvt·ÃΣФq:º€Z±è²/v2$Ä¡DŸÈk›˜ò§|¡ÿ;~4÷?ìmº¾}>Zné*îÒ‡ð1lh¥_˜a|*Oð»ö¾ÛÔsÏÐS|3îç>·9õóÄ$ÙùNýCGs¤láñî÷·ÏÃÎÒ'ª%ÃpÒʹšÇ½.ÙºÕÇIk{yÒUäý¦ôÕÄÙïìÜlÜ:¸«¹¯SÏ×þÖ)ôË,ƒÔîÏs#«ç4ëœò|@”Þ⌶²NOK×h˜»¸Ý3T—DÒëšÛG)%㩜¾€µ©C:WVI[[}ªJ³ÙJOõé ,WZ«w¹¿Ì¦¹Ó{ ˆÖÝø(Q°KÁ€ô²3¹íçî¾D4‰B1D€[GT+ÂZ¦·˜¯ÈÜò‚ Êà ˜2 pÈlˆ0/¯àM*ÄûUÛÅ=eç–IvÏCa˜§Y™Ëãþ®-A†ÈBуö`œI>¡B¢N) G¡cv~`¥äcfUªÃ¥Þßux塇ð.ZÉc!g¬DŸ" ×Õëgñ]›ì¨k¸¿-µøŽüIg±$O­h‡,ã‹k$¯É“r%0¬Í¨éV³ ØFJŽ/ó…ŒCRÅâÛ¢wçŒÎo7è9Å€­´r„Æ&·Œ‡(ÌeHãKfõ¹ ³E¥ÒÛ[íwîõË›¾ÑS=¼Ñœn17žXO¨j01ôȽbÇŒµ‘™W3ý`í0$E/(Ô1è »ý®·'ý™›Mö¶†¢·ö¼7fÒbwºõw¾ãi:Mss;£çN¹ºGz¡³p*1Õ+…•…DdÈHiè1)ÕCñçÏäËЪäE`TóÍs{j7ü§â/-b?óÌUUó=ök°dÖ2Œ½tZtPãY;ãgýo×<_ç×ý9èÎ;.ÊËý½´ÿöGúÑžÏm["s#'8d5¥X¶{ª1CJah¡QL+Y•},‚çc.òP 7”$kû¹ ¸]Êùû6`ÿ<3µp|–eC…YcªÏÑLù•$FkÚ¯`‡¾^…y}k(°9iªy>ÿçq;Öç¾}¬H»ƒÍ#ñJNÐѶ§@´{UÇwMÈ:¼/8¯Á«ƒ­Þ¨h‚gàÓߣ‚¨+cçÆ~ží˜Eùqì?¼³³sÌéh6QÃR8*@éPȯ³¬&¾°% i€5.d¨`:¶Q;"[<@±&6$®ï"6ÊðÐæŒ!ž*bºi3ô5®AHÙ/r>éëVt ](mÄ¡ö8K5±“ϸŸ©éV¼mrWx#ÐÈ%„D? Ð /ÏeôêT¦ØìѲÑò¸r?ë—[lFÏnV!pöIAVÁAIÙªn–¾X’æ’!dT§á8ÇG€aü†@õa#2´c d!ŸÕÀIÎ4ÔX›®DGˆæ¬—Å+‚ñ—ŽQ[˜Ey¡ JiœlF)ÉÃtL ±J´@Œ38sÔÆ±lÒV„ ÓÄã±$Šj ÿÈ&‡Ç§?äh¯6›o†_Ê`œb¡Èì$këÓ’¾¬‰scÕ­’˜ÒVAÖ´#Cƒ;Ý5QœHv4¾¤í;ûËU_B< Ó+odlK1Tu{tk¼àüz­¡ä±Áªèêd°|¹Ü~ŠÎ÷7ù¶Pò]ïŸèËû¶òó½Ñ†Ã€*ò½˜õ%“ضämÎèö¶ü­½›|ø×û|ÞŠý¿þA1ûæ®æR*šñ€[`¡øP @ôÆ¡“E†à7,Ç6Ôa."¥ (²ÅÜàì3í¨»Ñ¤6$÷Ï>93È ÄÆÜeFQ¿S¯ 1ÒigzZÔ%!øˆõןâ}õQG†2W'#mÇê”!‡Ì³²êy‚J%wãýiá±—ifL?õx |cajË,v¼s«1ŠQ%I Zt£„Àb^X_Ù.o Ñ@‘’0âÁV!LJ3¹±ç+ÝKî'Îâ•&Qr§„¢b:Æ›ÐÕj»Ú•rŨI™“}MF©´ª$©F‚J¨¯tð¬B^/“‡4‚Ya[ ÓI½&>¥6´à*IH8 Ñ_eCD†)œ¼¶AÆÍ¦ ²gMÅø=[çNÚ#÷·>ëBÙÐý͸Â1ÜjÒ>ì3 8•àáÞF6Å ZÀx±ãoÓØCúúÉž›Í=9[¦7Ùv¾œçÇJê€G=o©èÊåŸ>…~O@vJ«ÌyåY“ è)2}ohâR¨ÚžZÁtYhczŠHù*šüŽÿñóz-ã@[Ðù¢ïìÄ;=Ìâ7æ¾âóᬩ_¯œv^°Kì>iŒ£õ;·_(®3Š ¢?öX+ù•ãã«yà”áC'‡ënË©*’482ÊÜÊD Q9/Ðpw–5œYÁ€B$2°LA!Å*ÛÊ9 ‡¿Ñëˆ=ÖÖ¦zVT%µnG!²!Ù"I"h#!W‡rÐ*ê ªAÒE3œb3ÒÏ.Û˵0:gMèÌÞåP2îLÌ2Kc«ïìéXEs$€Z‡65r¢&±GÈsÖcÏò´uöÒX")C=€¢‚èCúÚÛ/Ï:®4âLF¾p@  °ÓüÔÖL–ŽëÑÕèõ>«x÷ëï~Ýó ýÁW<«W¤C…˜/Ž3kçÄ °,àV J˵~ŽéÑì®GèÝ·ºµ{xºûÝ /øFŒìd@Dtùò•ìíÇ1¾ù\9pS¶÷è¶“6o½ôìoêú×ßÖ?>ß^ÏGš¸a‹˜ºGí¨jø¤¯’û¡Xòç‡)_LÉ¡T¶ùRz>¹®æqÐï_¾Óï"oòzŸ&[<ÚÜÇŽ´]Ë ê [¼:%® `ìt W¾^÷ýEYÞ×ã˯óþwäŸðÏf㺪ømð@1™Øóñ|^ñ¬û°âçÔ÷ñöòJçZÞÞ°n¿~•ç{#Œíq\H¦~#šÓ8MQ 8# ’tPÒи·$ÉEâéÅvDâ …iÄ1$ ÁBð@%Å#K&ui:çVžÝÜœT&C¦„LÊKq¹uµFJ™å™Ì@k´#¶b‚9ƒž‡+mÌBžányµQg”<“ÇFL‰(”Õücâ¯R̤…¬IBœ$ krŠ( b8PzH*í°WUjZ†ñŠlœSfîB&uoÉ=ˤ“=Ì £p®ëÅÆÄšÂÀS[T‰H¥~æøõë÷çâoŸÒ¡;¹‡¥ˆŽ^…nŸ"¸˜‡Y¨Õ[´€ÝbÚsÀ›DêDLôë«ý~ª³~w]ðl“Ÿ©”®×ê™ú üï¹'xè¡ON•0;8$1ÆÉ¬C9Az•£>Ýö}Õ¬;ˆ¶€6’‡Ù¥ÇX5†L’KP>6T¶_Ù€‹¹­M[ÐXµ?Z§Ü3‡ÁJ·+ØF†9îvq@ßÕmt,™ /òTèÈ~Á÷öCvã÷ã»ì Ð ’o‘L©"û«õ5ûÆúÃ9*‹4ÌXKyÐ×îdÌÏâ±®Ò#̓۽Û]ߣލñŒƒã-UóuÊ­€P³–ûÏræjoÖ|û~|PçÛØÚ“¨j§¹ÚÂÖ ð›ö®½þêÇGTÁ~ÛÈ+$ØÚÿÆî»ŸNFqF tE5/Î2ÿv¶õþ\(LÚo¥ÑPéøwY)²ÎÔ5ÝŠÅaY½A²È‘éÇq§’MqP;ŽU D•ó²sÆ…´”5.k"Xï›Uº8Úö”ùU·W]Ç%.¯¯×‚C5¼¿°nÈ9÷Ãl­¹o-¡,:înòyÀ-ó×ç´‚&pª÷]zØ °Ø2ܪO‰%Ôñ=ì[6Ï>)Í6’öŠûîåfõ«ÃŸC$í7ãù³ùîJ‰ô}@M «ùÄq´zˆ™0³¼5$6EÛÕŒkŠöWá~1y~u©F¢ÈVPBÆ/xIöŒJD£ñ…¯Èú×ÀßpU¶å/èJ4(ÐÏ,yMªØíR˜p™TÐëW·6âmtMbaùÜ^‚:Ž*úVpbßÍ·Ýí´˜ïò²¿Î}`„®( àƒÊG†jüxIÄdAÖÚ¡aGö?œ/Û:DÌH†GUÒVT[Ÿ¹Ìl:÷ƒ¼íùÛžëZ÷ çiºì?Õ¼ÀÌ\g)€…ÊJÉ1L‰µ¥×Ö1<©M]õºEºéÀÂÞb³¾‚â/ËþØP‹™xgâoó®}`¤Â‹n½äõüÒkÓMXnšŠñÓ(Ü6í ûò®‚Pó9ŽƒRÜ»'m˜*бE Ÿgç»é3š¶`[ý<ó¾'S4%¯?Ah§»œsHhòà|;¸–V·6P™ðxÙáLýîZWö^µ¢™òËpìwJgÊlÕxdr v¥ Ä^Lrì|ç_è†fQƒ@ñYçÙØÐ.hçÖÓzK[[ë‡âVëêF¼ gÉ64F{Þáwò{hºP9Ü «Jð5ÅÒÓ5Rež†PmŠ —.ÓíF8o÷zׇÁ Ûíµ­]ƒ%°ÎJɯ;&ô´¼û©G9‹JÁjPEDF]!ŸëL³–Ñè:„X… ý’Ašßg^„ÊúÅEÒŽI9å Kk^ʾ{½·øéûþÞ-¦ÜÌ•C-œ8Ê×tK­þ“®^¿Fï¯ÙƒtqàD¯êý‘Ušk–Ø'õ¼ˆkEßWD‡ ø.ø×ò?¼÷èíŽúÀE‚Ó/ƒ³Ÿ×&K×§Ä —.VÑá°8®yÜÏ0ï ûz»P0€yÑ3‡O›µ mïÚ}î}Ñb’ú²8’²zxd¾ÜZ ZŽOCe¢=._gr «ÑÐD'©dN, åtlc®½Àg7‡ƒÚ'WâÓÝÅáU–÷ÒÃ\Ƙ&]´Jh+ˆ×Ò1ÓT>‹ºê½?ãäìTmeÈž~`ý·K-+æZ†;ìÙÉuÚåzî³Ë"¸qq!ñt¤BRE‚i<Ô$É1\5K<Ýõ8{ÄÂÎŒ!¹°«²HÛü¹yS‹°èHl£`Ô:ô!PI€Œ©|Ó!z‚Ã:ruü~ƒí§Ï’hAZ4”Èc³é~ä­óIp.÷Žh̹vãGà ¨Ô·.‡Ž¢(æÆi¨—Coœhжì@’¤b·¦ [c HR0ôZ^Xs;G¸åZ9ÿçgXIjkg©ß=üUÐ28 Q§ØÒâ¸|ùm0Üô/”mgX­C=4G‹éá°šLGÞ38¶£Vùqнå !²ñ­äDï–ŽÓ3cÒ5m*‰$Š!ìtöåÏ_š=øAÖW™[gpÔ0°-½Hßéá!zÕ}úúã‘|÷¼±¯Ü¿åqŽÆ­a4&ÜŠY·úçe7NûŒ{¦ç ®g©0søã²×vá\l!àê©%®z¶@A+\@З/Ž’¦Jßç¾_ùz+ qk ½k6öåL{§±˜Û¿œ,Ïc&=_Õ§•¢Øi«^:ÑŽÚ •.–¸;_ZßÚ£~ˆ%ÌRcÒxЬZjšÆ&m<¦ú_ù[å$T#h¢²z;(÷㩳˴¢“.Ül"°€¶6 Ú‡álRe^ùO OY¥Ö°ÑõÒÜjš„ùŽí€‚kúºþ3»óÃÛÌ}eÁmñëq¯ÈKZ-îöVwG9¸¥_v7*)Å•±’%êKJ¹ÙÔv¹ÆŸ[nåT»èy°²z.%øåª¨ÞÆ ?ª#ã¾_tÛÙ&ý¼u‹+UÁ°|ÑO(5…Æ]©×åTLÃvk³WÖÅ0A"¨"†r§¶R.:T©¾ ˆ€´QßažøF®²ýYõ¨k«*™ DŠ7!6‘F IŽ6[ÃSÐ4†Fœ0&&x"a}‰zl]¶o·û˜¬Z²«¤bQªj gIEqôë£À$a†Q[,´ˆgtigÚ=š’h‡'ÑTêâZ]ô_÷îuÖÕ2(•¶ÊR,Éçh Dð·#³Nç£â$…:ÀÚØLªÃRÇß–üöéQdde툑ÐÇÂ{ý{Vô¹-2%¿BÍ臽6þÿU%;àØàîrºþT_F^¸.H!–`§Ð/Q:½eGøiÚ©R­ß½Ïz û¥f¹gz›í>^r&º,0ºÃ‡‰§ß±+¯Î–0^몾*ü¬4…ËÂÛ'o3šŒvsÈZ#±J‰Æ*WkÅwî)ƒÃ{¶©ˆ›f^„K%°‘®~B ŽsðBîRH×Ê}>Ôó6¹ùdõè²!³Çj½ºr#Y±)ßãUÓŽ8¬\¾T B#6 j’&Y&½úLÏ9HísûëÞ÷CÃìô(¦ß„´Ú ZiUµ Ÿvþ¦ÓMLP Ç(CZzÊ£Þ²©< 'vÍÝGÐ!h© ž„:½¡R3¹aç·™Ýð»~7¹š††Š²U5QÄq…Ï8bÛeK4—=C¶Úô˯çÙߨ_š?kD0AÜ Pë¶©bdDZE ƒì‘ù•ò—zÙ¦ç%>uùù©Në~$»glý£ÀD¢V²EmfßîqÏãê½ÇXÊxÎDH÷ÌýuçûεwçlsÀ3gßé|ÄE<óA {°~ý—oÉ|íþá½éúòQÙ„äZêÜ·“NÜÓۿ䫟LwèO»ø×ëÆ¼'{Ø~zÒ—g”aPLD‚¢ÏØ~0m‘À‹r/ºl¾Wç6Ïmæ7úæþ7ë“<©Óþî¾rò ›÷þøÓ ÎLΉÑäé?lÿñ~f†—»gœK-,ô_ï>óýní½KˆÓm½Þ()e©ßyŠDǸ@Œ O{DT™)A%yvi`S ³†-Ïèqq$Ù¢“ÊšjP<—Œ¢ ƒ¨9 ˆä¼ÒgœÌKþ¢ç™³zgêwe•%1&;úÁŸp¶tPƒu}×ôZÿãÓòu€jÄ´¥Ý¬Ñ³õ”Î`j6°©>´&«°G`¨²žbõÊ0`Å (&T"޽]_øwP€„5Ý@ÀCrÈLË ]@©ÕБC™g”ç¢Ù¾ï¤»¹F8 ŽïÁ,~ֹغ‰,`õÈ8|§¿¬^¿éùüíæƒû­ýßà¿'b0݈qžV&–¡àö3#P³IA€_mQÈRÙœ=sEwl5IªlÓ­ïÓ}¯::Î.¹Ë|½]æt(jnÒã\F¿Z.ß­r†(®R¦¼$u6ðƒ|½{×csåûš×X‡±=b±§¤C!'Å@dB¢á¢Afö´í®ÂõØÃmƒ5—¶ëaµj[·r›uÖyöž]cŽ@ûµ½"ÐÒ$@¬ÌZöF{5û^àßø÷cܵß7'Q"„Læ")ÀuöMø„þ‹æ|&!ÅÏâ¬?ñ–7†*éñüo »Ó«³y è€è{ÜÝí+h†ÕÐÊ,&¢Sæšô9ô·zÿ©BÕ¾eªCü³+Vçí#8P^.¯¢—²Û8%ÊY%,×mM¯à‡ÉÝ»¯·‹’xAÛ“õ`g …d@Ù'>r×gEkÜgï'دXž%ôãr½çÛGAìÕu:ÙteЈ´Œv?‰ï$ÏäâÅ~!S2±(JŸ™c@l­Kð\07”tÀÓò´DºÎõ¾’G6ÛnòÀq‘Å.\QàÆ ÙNiµT¡§lÁm”ˆ§(‘²ÈÎãpV Ã<† ë‡ÏîVy kròr@bà9°UürSûh*¡‹Ú«¸ ãÀo©~žÎŸ$‹â@Ù¨çªÓtö|: ÇóR Ld‘-0çNh }Î&b©åÂÚž;‹ƒufœ’ëþìŽ8›û-ÜÞÛ¹:yNs"É×sGIÒ»ËkHöY N6ýµUÒìQ‰N³§“Ø€SB†F´b2õáð«ãø£)0±©H€±­øˆä I2ôÊSÞ—#ïW÷ÖWù(‚|bX⩯ºé®ü’˜KÇò2ÄbϺyQѳ1aì˜b#ZÙB¢GMÙ-ŒiŽQŒ°°šÆbó˜â±Á `FpN™ŒŠ›êâ&€ˆ˜žó{¹.ëŸz½þ^ûp~?füòÖ-LÏÖã Îdp>Ôš}+d„©¥ÿVôÜÃ3˜;îšwreòÒØ]åÂïÑTŽ»µ›î±„W]ï=¾=5·ÝÄ­œ{½úv}q~ÿÆó=Xè‘@“s%—ÝFi!Ú9bÃvÓFAêþ>¯ ©â¾Â6E.{ÝŸ#æëß{ºÿõÛcþøo¿®çJ6Y@è̌Θ½18j)×5-½}Ô°e’$ÃÛñN3ùütÿ~¦ˆ^pûóù•aÇI;ƒºo:^sw&~?ïØ¼}¼ôlUO•FzXžËw?@Èzãg.ëö+Þû½îiû×Ïíø^ÿgÊïåälÚüœ>5u|ÜßÐØ<±µ’¿ãÑ×)ÐÊËÁ%ûßg^ˆ‡³U®¨6vw‹Ò£~(“vOF#$˜î p$=1Cêž­ww÷4(µT[Ÿ¦Ö1±T cýfž–š8µœÇNºÌl³ÞÇ)«DÆ­ @W!È€Gª@yª¨¦Œ‹è=¦œúÃ|éÌø8‡¬?¨¬ŽJúR`n ˜{ZªcˆÔiç°÷ÒàDU”^¶"ÄzYJÁ*N¨*w~J²ÛóòçS÷Û‘ŽcŽ'×< ña;5Àã,m¤zвBZJíU&SèÊh£·ghGö¼,žDjëÝé4ä`jø¢ D ôˆ/ItÅ{‚ËBcZ.”Jн”þëÿÀößkþ/pqâ>ý½7>©n¹ÑC踣-Ìw«ýÂÛ31ZèNÓH AY%&Ö§ü£ÉFtJhŒf©µˆNÔº‰È€ “Â-38– **Þ""% ‹5nýupH½ifžÆ9ÊÞKNŸŸ÷ó̳¢ó¾Î%jcð®=°Þ{wG0 GbPצ›ä³d¿ÏÜÛýªgwò­üjm# Á¤ÇíBê Š˜ø=P@Š*\0q_½b+‰¥WÝ~u7 Œñæó©N»ÓFºÁn­»<¤œl·e»Y™ä¡ë}ôpY.?¹f:§‹c7Qƒoò »cn%ìk"wME›2ì3źÅ 0YÐ$«´ö@-õJø Þ¯à‘Æ•ÏB¡¹¨žÄylãñd+_À 4wå£<õ,mèìÇ2Úäô\˜Öâè—Ì¢Ð:Ë{òà "R¿•ÿ­ìg»øköz|4ÿèþ/Èý”0ÒnNÀ0îêgElÔvtÀÁYÆõÓ,F kùÓn¯ÝzW“ .œX±&‰•£ÓhW¢^–&ò^ޏ~ÒuÝþ éÔôœK‡hR©en š Æ{0?s.œØ·RæSŠÅP‘ŠÑ•ÖMjF¶’™{ósU¶ÊÅ¡³/'Ætn×9“4BôTÙâÊ ÏhB3m$©ò\Ç´¹a™ÀVc]=D)_¹UìÖ„øaaO¹å­¥I±—·tŭɾ»ÌeLY¾™eÇHí*g•;ê¯/ŒÈq _ Ø™Îbƒwo*Zb>C©°mZm‰h¦Ôµ?2w‰ð·.Gß“9–™A.€ü"L„*ªB4)A#þKülËŸ 9ÿÊÿ"ôHOgà$h‘*;%õíàçÊv 0Nô…´aÄå¶K`m2pQ¹/ ÍC÷;W·b“Π‡)hlËA᩼ptB?89ÍÖN;‚¯¸lUÀG»º¤¡A„ê² ¹lh|ÝØB­“Ÿ¼üÒʇK•ì‡lª:‡Š\‘Š•” R¯žvË:Ü—ŸxýPホ{³ÿòüLo-¦2£ f fèúÎ÷²Óiÿt«Ì^´"¢8@N¤ØÄ%êÜd³®ú¦õÔ¼ûÒÈ× )Ktú¡›N+¶(ž®¯?†ÃO쯜à$=È„t`X±€FâªަÊ#@çE„ ÖŒf±à÷=¥×øÞï|xe~žýÙÄXçñô{®ñn„ECxg÷™—ü|s^}}‡Ù6vŒý4áCº.tŒcAq -±/T» i ´dª®KWâÉmÉs¤Š=«©§×Ó|¾á÷«ê>šÌŽ?­;‚¨Z¶³m)¶¿ºüüˬƒ3û#‰˜p²àt?3qtãuNeÅk¶j¶©'SC®Ï¶«žùöÅ>çAWb>º±$Çœ5x5ç­þIú7{¸ß¿û ·2Ïzª>ã®—5û°¨²Ñ`°Š­8‘IƒKû¹Ü 5ÙüO[|ýn¿é¾¿šÇîžZ²À®/ûË7’â÷;mÌ×_ÓúÒû6:o´3÷층Ûœ¦Uþî"¥}6ÒÇÄäÊ2yãÙ<½ûۧ묮 --¸6¢Ø‰#P€Ä•"`Ð$!ÐI™DÁ’Ѥt‚FÔÙBH(B&¢Œ>éÈJ È’6èÎ¥ŸÐÉ_ÖZöýßû´OòþI¼š+þ•¤–´/þq>ZßasðbÍèéqÔàS¹~$HÆP¶ fÁT[3`0Ià€Hd ' À¨ôùØç¿ü×Ì;ãJ’@hPÃAB%€iYŽYY ÅUâ@=x@ÈðsÐÀ*$læjŠš!X«X¾ºË¯ÑšS|r-»^Ç`Xæ7‘«þøO¿ök÷œ÷)>ùûìÿöêÂK›1Zœ(msÕ­­yÕW-þÃD|ÑXÓ&,! 8ÉX̨}»4'Ç܇§ïLª Õl•»âÜtU+:cšà)MÆD&›ÊeŒÒ Ýôàísûò4ž'Qù¨ÒV91™mâ,Í %½M =:ÅÀRèHçõç™Õ¶ù¶þÌ6lh§ÕÏ‚©gïÙˆ½à´L¢Æ@u´®\ÅþÀû?÷¿ü HÄi¡ J(Â6#É1ü¾` §I-¶”'Alx¦hjÄ9´ýØA ¨gþRýqe¤;˜ë¤ 'EœxnÖ¿ùc¡¾ÓNï”,N5YÆJ`ÉÒÈ+ÉM2P;éÒ¹6¸29%«¹v0¯ÿ½?öý¯ç¡¿ÅWßÛèŽûÂMùSj—>U|«’²¬›º·~î YmÍþ„ÕoJ77r€µ¥ÇbÅ ¡MJ³,÷[Ð]GÜ7y¸É¢«öo¯ôï]€¯Î} ”ÜY “±ž*W*Ï}[T?Ž—Î·ÿ=~+û·RÕ‰“~°kËdƒ[@dé†Y©e UÔ\Éþ¼2š`˜é¾nÖmÒ466(®Û!(„“zI'0ÐnÒ2­Xe¨ï©Ã+6ª‡hâ3õ`TxAZ@僚 F¨“ò[^Gì-V¬2v0+î‰'ï*ß’Å ,ŽÀr‚’â’„f›BÄé Ý`µfB*V°­£Q©Å J~M*“õÕõc­’k¨¾y ébmh½T*¯H܈_À¡†GÄfi¨0X¯ýà}7;€œ–Šø’:ŒÉÐ9+P‡šnlZé_7^ã}±ã×Ïâ$?¥âª_5¿·šï±–ý\‘İîB|!6wu¬P’AãÚØ¦£Kæ¶­]C¯äµ~8þ,.D¿*Ÿvól™VtèaG5õ‚pÝ,—ẛ §h¢ÊP|¾ór„¯ø ßm™ˆC:² !Îä²À+u\$pÔ;øçæAKëº|מ°ˆ3ÌJž§Ø›=¥j審gü h¶ |&Ùwàm¬À‡ø'‡? –ÙoI›IÏØ•&Xð¶ZL!ÊÞ_Eƒì¾‡ñØŽ¸Ðćš@ÔÈ5ÔÊA4Ú\Ókðdfœ¶õͳüˆYú­7ŒŠ@^¢‘vBÆ€:$§â²{Òl°$Ýv) ‚×q œÑ¤¾ª7d gÅà½,LhÁeúáJÚYÏ€wð›  Þv¯$nŸÜÂ9mKfDÉ5B”ÖQ<æw8ôŒwÀ^íÉ©[7].”.ˆc(p7[h·I?Ô—µ+F‹nÜEެÁîæ·Åg»ÅW‘žöóç ¦!£º(éÑÓúÂ.‰*O4§_oB„úc;,ä¤P©­J›û—…Xz˜Ú–#>´d†BFV…óLÓx>nD0¬;qƒ¸x%V‹p b’uË’À˜—^Y‹ ö×ûw;õÔü‡Çʉ¡ä¼I´GL..­ öZ[ §"B ·™¹9¯V8u¾šòÖðMëãQ"8³:¢¿™Ûƒƒ©,WìóE:I2» zÒT·DÞi€Xâ­vòt ?•>u¾âµ‚)1žó°°¸Ö#™wíþ¢­,è‰X»;ú|û ôæ“og6ì9sÑÇ¢K} €ÑA®òüâŽÛ<ø%F¡@–UjשÔI .Z› @ÁÊ3¶òTúgŒ`A2`rþ4º˜*™\f[ºÖ5aèÖ©´“t!ÇábQi]ay~н,;Ž´™×›†@Z»ä:ý‹Ðfo²m—Yý8þU!fЧÁJŒ#î˜Ð ø«{õlba_¸­y¥ù.›É9Kîܸµ[ö k`™ciÒ’&(0Z¯Æ‰‚ƒ×AÙOŽõú´Ïõ;wög"ìbçÙ¦ Ѫ©ÜãË+Ï”L`D*0ÈÂv#±¾ý™~™í·¯ÖÑœïo­3-¨…Ø£ ©Û¶WÚ"–Û/U‰áàľ™í^tz8íšzؽŒ ÈÁÎc"1 †;D \",ÚRHñÆM9ÓÙ^XôŠ¡ÉM0Ä0ÒÅæK‡»ã wŠç¸r¢¯ÅÌæªk -£âc¢:Ö^ñ ™á­¶™™8è­vŽƒ C¯(ð>[¡ô†¦—uÑ5]²5|Ñ0ô‰Àþ£Žm7ëòð'|0¦°€Œ±dà9‚.ÚiþòÚç<†tÿ›NP9gæív6@†Äÿ¿c¶ÁGW\º%ž>7©ï5H4MP#lFøj%çÕˆÞ¦§5½@D@ÝN®ˆBÍV3¹ŠcwR7ž›ò¹ß ÙIíºl­n[”Sd± ++£PwÜ}øÌò®³ÇÝ·ÆÔÕ¬w?NrTœ›c©#RD ™X (êf¹Cc •VòÆ\noæ)¥Q‰¹¸”¯J6'â!¯¡…@ »Æ:ˆï|ÖtðÆØO$¬ ÐD…X …d2‘Àq½ÉÏЄGóÙ­W×¥+#±ÌX,¼òøPÆ«+Ž*˜ „zhd@Ð0ıˆ'µ„*@œªEFL†3 Г±û+¯û;Û¥ù¤\ýÀ@~…3¬]n_ïÿíõUÛ5O¼mæOß+ü>¿ˆæ_GgÉ‚xŒ`¦®`E:(ª¨aŒ1× ¨;€()ûVˆ#DÇ÷€=kÎâIGN¢I4GÆnt†oPÁ!BJwrÄ‘aªf^]kqx/ut­æÙé~‚题‘†‡ˆb%[ +å~ÕGò¯ùà—¾R6$žUëŽ –‚bdW%Rˆ•¤ÕQ°ël~ºúN9w÷yw£õÀ¨(¼Äk€b5‹ÝmúZó J¾5³Z„>ÙS³ïŸ&vþ¹«ªÖŸúôdÚãÃÕáÜ&¢óˆ±ÊY•ñ«oA W@Ö—F5MªÂ˜• ¨"Õ„$s ݉f[TEÍ@ˆaÍ"B¤0Wä¹gsæ¦h–Më¸n3vMÍ:'%dŸ‘NÁCþµNF ßœj£wUÚžúÅ2Á04ΖP1÷ïçøo3X@4D%Hg/+Æ:ŒD´ÃD¢¡˜=÷Ÿ39/ÖÒ"%E €¡A•—_Z1`F £KõDÖáÍmÐ’TYZ„­lL ~¡„´NÛ”0öSj…йWÇ?ÃO÷kÁ®Ïø='lä›lB£Ÿ+)Hõ¬æÃè'v¡CN‹øQUàÄPHfÍ×N4@ÈWQGj¢Á¹sÍfëGçqôía3´ùþaUž,þ— ~™#9,e±‹9cM¥FVÚëõù¾ßìoÆñ÷‡<Ë_[|w©mÝOÏ\p\˜y,*º‰dºZ™€ìàÔo™ƒwËóìe=ÞÁ6W< Øž¹pA¬Ü©—&/b ö1DIF7SrDW–‡Ù ´°F± vÉ–ö$öÙ5²{ðwY+~† |èçÓòÊ[p˜FƒYI%´pl'´Á-ð#N:CuJPäŠd*M锑J:3ÊG8ˆACª¹‰•ù¯Öùëùô,±¤ÍQä±l®7eر¤%ûÊnì"bE[µóR´ÛÎ:åÞu>—îd‘ÍÝ“"aCž/ h\w(ã–¡&wÏþ1^I3÷OǦŔ!ëi,´P/[EúŽs®¾NIÁˆ3TJÞŠ¼"3(¦"JwÆåu”ËaM™ZaÀ*‹’#€á9:¼<£ÆÜK¿Çêâ5:è½g0Á/­Í\¤–UÃJ‹$e^khYVüÙ‡Ì@Ðè/êR3d¥ NЉH&Dþ«Ûÿô&C™<Ä€¤°¡žP'%1§I ç÷ôPW ’gæ‹!Wä9ž±óÄRå hô4â$n\.Ø¥‡‘öÔcŠ(rÁùÀùu åoä¼ã"‰HËó3÷¾õ/Õ»£Ü˹Fý>•}XÕL4[¦kï †ì—8k¼ÝÆÓGQL ëž®¯³…=>Þß8¶y_¾´]y?8©1Q×/ÏGãÚöÊ J(Y¾¯¶¡‚ÄIAXR@yÄ“·yþ<ñ8*hRÐcÎù=±X6¾ œýPeîxì`¯k[ÔqW›ó³p–ø6r¢)®ºîs'èZe˜Ä!íŽlQoÜ”™ì@ S3Ô¾k}ã??zþN|,Q[HàyLÁZ`\Á"Ý /­ÕF¾©öõÑ^'íyò×Teu©i—¶J‡µh9e]ögï Sx3lIÖ†í_KQW¹Úɺٯ|!vLà E'ÊM—Š'ëŸ0µt—­£úŒÈ^e[áÐm‹§}˜r|‘ÃxX3ærT7bÏ©ú÷›½C_PYÐû– ýfŽÉO¿ÈM²47kŸoÍ¢'¤vtá‘qE”i˜dò$(„¬@Jƒ BMwŸ~ÁMpOŒÕè%WöäÚ½œgÙù†šð5¢X¯]u\}X£’ä HÊİ•ÔÎJ󲻸‰À ž†/Ò¡÷c3©•×ÞæQf}ƒ>‰ªwÕ‰(½È¸“D[âJ]ââ°-8ýÈ6³UrªeÂÃí«O^=ÚŸ¡àAÖOá­J¥2Wb¹²v»lÙ.U‡‡öp'f´á‘âZùÇŸØ8sÊžgÍÓ·ú Ý„K’I:¤Ã ‘K»‹œ¤žñí’Æs\§(Äje> "]ç¥L̺RNŠ43Ø’ðFMš*×ɕיˆ™r ÎÀUs–!.ÇÂýâÐìA¨¥„Æ»ATèw«8%•0A¶tâ†øðš/И¯qG¥4š§–Ô¥®*tëðw‚÷܇e={ÔtCèJŒºecâdï°[©¿ËìIký™bZt†\Gæz/¸ó™'ú!TEì}n üö~÷Ü»?Ò¥‘ŸŸÈ}Ѓ‚ ;›¢‹¶ýÅu*H#Ž;·/¿ú÷ì‡~¼8¿±u—V¶™iAá“‚]›ä³÷ »ƒ êúŒ¦µñ‰cpXGÖÞüÃŒŒ*ç³Óî)ªõH­Ê¨Šûq J’Þ3Û’ç OÔ‰Ì]v–Iä+Ñág8R•©@‹þžä£HŸÜ'ݼ¹ååV^›ôˆR Eå Ôdyí± ýÈæÇc±DN<‹‰2¤‘#åÏ75*Ytê9åú8HÊMá 6žèõÍœõ\a__öéäŒæô>=°,TðzwêÒé篇%cgàxcù)·XÐNLá@-œ4lÅâÒÅGõ¹÷¿ÔÏ›¢7í´1Εç¡mþÄQCîÚ‚8KÂÚs½#t2²¿Tƒ¬Ï©!:ä”žŽ‘‡ê(ïk½¾OG(KY¿,ôœxÂE2fä QŒl‚2L=FEH#FÏVódä¥ÞÁ R¸)™$‰ n³ãè_ªŸÄÐp!—(Gß&NÞ_¸Î¦ƒngÑ1¾S»‘Øú;ÎÕShÙíM/¡}ŽIóh&"%¿Í~Vêæ‰r|‰[!ÐË]Ž0Ců͒:P= ö1_7ýÆIG´ûAîÝ|‚ÜZ•e[“Õ{ÜÚ‚„{ f¥˜Ó%Ÿõl¦pUv)>Š‡Ï¾áýÕûcý·~²ž‚%*ÁC×Ãí)ÌÞp„ jâfà¤Äµf(feSjŠbKÒ=w „´–”r`d 6&±nI¢ JR•ÚÒ§â-{î3+Ë¥Ž§Sýxß<Îçx¦×¾§S PÂÝ0‡dЀ8ëôQ4ßžÚÓyÍØá5—Wù;y)·¬½e²ÒÏpU;1%Y»>ËcÝ®ànf­í¨â'Ë~ݩڞFP7kÀœ€B!Œå„^ýXû¥Ëðî÷¯GoÇóøzy÷Ééþ–ûê8g_Ïñмױç}ÿxþåpâ±%®CÅ$). „Kå -©’†‰jPJ‹˜EA šËÖcèdsó„/$â<ŸìŸ=}ÿùßþŸø¯œü-é¿ð…Ø!á#ÖR µË:ÙÏ׸ÎyEB”=±:O)ÆŠ• ¤†¤“¤µ[vv[FVÀ“ D÷±¤Å1,gÜóá΋ۮ¾™4M×<ïèi¶apãE_pÛyÑÔµC.°mv™U =AÏ/;åÁMôGÛhÁ[ ðO_üýGýR4Ã’NqŒË]ÙƒXÈÖ¼y~.ô—ݯuž‚ÒkY_Ì奦ºWÓø7YYJ nN`QE{SJS¿+Qd]:Ž„&c$Pâ«P(€ àOC™ÊPdñ¨liŒ¯+~(ÏË2é½·½K °¸Ì–oÚþV«€3y0A‡ ÒP«Ë`t›uÝõ\ÀM‚°ýL¸YÌ¿Mü«Áž¹3¶¢ ôæÜ<{çÜÏ% % N”1¤£xb¾ì¨ß§ÿ0¡€B‚‚D€@@h€Bàˆ3ÕbÀ¨‹Yˆ ½mŠºŒ%¥£D«°ÐÕizÛ‘ÝïžÌù~|4.ò¨Ÿ?ÚþèzôfÌDù ˆöØKŠ©› ˹â>ºm#0ó%2ª¹§‘÷¾¾Ÿßsg ä~mW{kh0bGw& §¢ÐÎw6òúhkrÏ'úÚf¾|¤wWÞ0W+Þ{røÛà"÷ ¯‡j½è›ÓÇõãí8ÆÇM?¿£¡;Í8ìð2’q܌ˆ¶LÑH0#ö'ÒiÛ«KµŒŒ¹CÝáOvù4ºÒ€¾ýi)¢gZÉ&̲yìí…•Ó:#~oëw©Þ@àû£Vï1ƒË zçÝGs³%ä* b–² €¾Õ¼’#SÝ´¢spV(Ú¶Ú{kSÖQ-2œÃÁ]ª§‘ÚPº$…J¯FñøSyL}dlG_Œ¹èŒÛÎFª‘P©'ÉC /—\H‘³ †8‚ka(ÒiÔ6@LšhÁ¢s)—¦&£@ñûßiFÀb$ñ&B]!°c§ÅðïO0¸¸ þ xPZžÆÒgÀ¦4fûD4à9ô& =å|è#6¡DZ´ y„ÍxGz6ÿÎg»U¶u|åí×I÷’zæ¸ZÚÌÀ¹ˆJ4y!oÇAž3H¡þziܯàÁý<ã9çw…ôuû¬?†9»Ž5çvGD* +€ø@Î20C–¢>+`ØHÑ˨ãoä?óæ7cÕ!ŸE\é~Šçe·å‡þ¸Ù ™­ì<è"'UÛãŽÇÙÒÒZNb!/´u -¸í©Áò(ºäR”må®YØÂRI8'Ai`+9½Dj^ee Ö!‚>s`3t· ðz€£äYÝÚ*vtœ.ýOg©~4*hÄs'Ëj\­ƒûÁnfÕËÓ³‚©j€¯ØÇ^Ê9¹îØU"æZwž©+Ÿ)A0[– †T¨ØW;—vų«¡ë ¤e•¹xŒÞª¢r‘/t¤Ý¬Ó= )Õ£úÕŸz§È\¨Ø¯Rààp-;Ÿçcz*ˆP¸Éjb$ׯ)ÖN spRk‘•|‘F)ŸƒymPJ÷Ĭòë"cÙ²tÖßd/¬‡é~)pÁ­Í<t¼òU²'ƒ"J¹ÍMUƒ-éU&«“ÍeÈþ²Íkè@2áòÜ5³{"í–ö¥{ã¶¥ d®Y¤¡ÖŽÏ¤ +Õ.7þoáMÜ€0Nb{Ù¡Ž߀GöDžpú†¾_QÉÜÙw/ªúÔ]”vD%]ÜÈÈî0ÉxŽvõº>á¼Tƒds9ýÐ,.|í՜㛔:JÅWV²À—AŒå‰$›U†iO£’*W¼V 'áŽ4†ki/x§ž>ù^ ÷©i*fwí¶Šº`H,®Þ¨F5—XåxA4‹¬â,îh0ƨSâm'`Hѽ¯Å6ÍðM‹CãÌ*¤ ³áI´hpüOûÛÙJ=‚Øt¶ö4û$Ä6`ukЖñ.ÕBNÃe^¡ •{»¦·Ü±q‡Ƭú4ÙѤèpúy›£³¾2òþ½MÁ£âÜ ­€ŒÄ Äêó¾õC…ºÜ÷›_G^,®ÕÅ®6©¦X·?²êúˆ²»‡ û!K¨+DºBà_Á¹ç³•G:È£âF&F˜T¨‡ä¢¾îyµ|mcÚEµ¯Áö^“ó5Ð$éGØ’®!¡eqší§NŠeNÙ˜ò`âaÞÜä<ÇÐ4[f[­Ž÷® ”æ¨U¢Jõuˆ~ø€¨Fõ“$>"ϧ>Ÿø´ëíÍW‰.èèåѬbdf˜Kõ¸Äý{šâ1ßyP1;q­^œ?D~e¥ùêxhž ΡÙà•ôê6º¥pÜçVgÑÔ åêêp|6wt}ß•ÿÖü,ïòÌ'q¯\\dåG©ƒô_ðÝ'H´‰41íF*ü'gœŸ½?Û0sƯyEâØ™ñ]ÌxÛ.¹5½§‹ÒÐæþŠ'íTž]Ö !"•¬ê,6H¡( ^D!XB-#sp³føV{œ³®£Œ†¢‘+~N8‚äüèàÖ~°ÿé 5u`&;K<¹Þo“¯Å×ÏÃ%hícòÚÛÓB •%!n²Yàq[{<èï·ýnÏÝ»‘Éóƒ±âV$žè>Ä•T€òyP¿Œ§"C XÝ]S‡0½öž 3’™)ßÄÚ|>ʇ©Aî«Ú!®GJä6ÐPŸ¡í•UMzëo#rî@;IYœúãÓ™ú¾ü<¶µÕˆïZ"Ãè52OwY+»b©Š€°oBL¨ªÞqï†÷x©p´’Aˆ‹J èPgÚ鸻Ñp™ÃŸw8ßÔ_|÷ó>;ºYó§ÛN«VþyÎ:G2)­LPfÍœùþ!ïlVªâøÏØ6l—c×ÀgwGü÷çf|¡ïÅ»0îâ¾ GË=Ï„C€]‹l|f£ ¥h¤Ó [ L¤ßMO+Ž›ñ•|Á+U!d#ÚSŸ]iºtú©4`]FÜPsfȯù—õŸˆ?ž°Ë"ŦXšbA¤4Å\ðMl#” ùVøÚéø±iÍÂØ’ÏâB"v°úx<ÑÖ•8¶ )÷Œé‚³G§e<š’ÓuØ”=k›–è’cò{í³4‡Y nÈž(¡MhnˆkÉ][‰‘U·€ÄØw£ýBS…ey–ÇŠ<×€ Kr”Zýœ®‹líC¯åó4™~ç#ws¾o¹ƒ€íij ]¨( ˆEÑOõ™]Wâþ}‹9kH{ìƒìàÀ5º%²ã¿¶ð¯ûãyoÚZÐÐaTÀv`KX²í­›àÜ%cw53=,k®3<ÝyïξÑwþÿÕyr¶Ó^+¼}ZË:'æ=%µÔ»Ú~¹c;u—n·%Àyï–%¶‘ljê¥N¢EK8©ž ©>—˜øÉ‡7Âw³:úƒÑ§Õƒš©¿»Ÿ:ÿ)—¶Ð@ç–sósþrv÷Ê/ýáaQ?zèí¥Æ:ú!fo*Ú±ÂR¸ð\"0‘%’[d,± À% rP¡×â¬d˜dâ[rME·cGÔÅ·]:³pTb(BRÉ$5ŒðOG‡×w݈ÊeôÔø³Ûúø¼ÅI‹UNC H(ˆ„ª†²²/~ûúìý›µÏ«é÷ócÌgQÝŸ×õ.¯ž⚊c2„™ÐLR¾Žrñ9tÿªô]“'å*ZÔ³¢ØO<GP¸’¶ßêýË$ƒŽ‰¹Ç©¬§2þGvЦ½ÿñ(&D ѰõÛlAaCWC ôŽi“_½°³W©¡]”âÐpò|J÷ŸX¢B²CUCwŬ)5ìù{:Û¢¥mßxuÀ¢–‘Öƒ¼¼ã§¥Ý×ã©î}Ç"Û>–ñǦÙóÓj•[”ÞüÄêz-ë„ObI³yx¿ÞÒæ)ò¢È °` Àä$Ëê¾³¦ÀÌšVD³oæÞkúã÷¼Î–>˜£·[2™HjJŒníá1e¹†^Îå…çNzQ.›–è£9)8#KÄ-Ž‘× ÇÚxi¹ÆSQª1­ÙÔ  áÝ(ÈC5#ö>1òöåH”«©z3ûÃò§AŽ«ß,‰­r šq -€ËÜÁÍ™PÎÃ@Fa•ŠzÕýÊ‚Ìq¼S,„VØI(""3ª(ÛKÂ-ÐQ´ËÄMŽ%\pµßWý§ZÚ1"¹ˆCd¢ËÉÑ -œ•1SL\ CŠ'h^ó× šJ'<}xƒÅerÒ 6  K–‘H  µÿÃ7ä8~ÿ1üýÝúöÜ¿ó7è!F%{þj˜XWiÎ cØO·±¹X ÚÞ(Нérj= [ /û¨,”T€"¾caÊLûlžî¨ÉÂ#µ=ÿ$åwõ1–²ßר·Ä~ô¬Œ©fê2ÜF&;背—€YFÖUC`–Š\†0¨rfî!]ôQû¥‘(À •Ý0Á·šT¤Ý¤/šÇ˽ىqfY‹îaö0"4RC }z€Šf³'R0Þ¸C¼hà;àf¿Ú¢V£Ø’9޳"¡Ûg”jÇ#œm#°>(µˆ0ƒ” ·4—qý‹æ­'{é{¦áG •Xra–¨j K-›J¡±ïNê`1rÌ£§Ö ¹³”óXÍÁ=íõ-*wÀUñïÇûñ€…Ü(…SMÁ Áî ÅôÍ´›|n= Øp¯ L@0©7A^k•/î‚&ßì׫Αj ²hà7;žå2¬)y:77›Gu[^„î"nY­ÖjŠÆž,’T+mb³xæl˜õI”ý<”Ñ9@^rD§asÔ )r7y9{± \ڢГ’ HlƒügB™kF4±ˆ&0p%…¼“IL‰`ÜuˆLŠ•Ç´* ¢’/±Ä¢’D*oˆLÓô"S.B¸¶…DÐfBBžÜ}må¶B ˜CB‹Â–2€¡Û¢ž´ÔHÔÅ,:d%" @‹Ä£2ÌZàP3Ü!Òà¸æySO¾794ö}›ùö$æTuåe«i2ÕY·`Ǻ½N|@GYÅU„CˆgÊF†’"µT·—ÿ»>ŒÎý>C¾ì†žKý¾‰-;Žd´l\°ÕeI´Ï0+pØMæ@háýŒ²—Ù<Âïþ¿ØOå‹ÂyÇf‘ç¢lh°o7}«ÇóÏ—ÇÃpw÷ §è†â]ò"Û®€BQ)<úuho烆zE†¾ÓËÓO( }ôÓázQ¿‚ÊpÝ85¡^1W&*¦~ŠTçrÒ’¥y;ÈIQª²LæêÆq.@ ¢ Ãf¼ *MvALNúØB)eŠW^Èï AQ’d>÷V¯&ßíÿÒ©ût!|Ø2ñ ªë(ÎëÌûx=Õ¨›F#òîJÔ¼¤k‰òÊn¤Ã=Ã+D&§·áw+¸Ä~^NªY]MhfØ'@¢U*¾Ó?±½³µ„J ÆÚ±±Ñ8œœ’:ñH¦.µ7Ü þp1zf=€iËì27“ý´yv]«ì|jÅÜÔ_Ý(…uÅ8éI¥T¢ Â n¬¤¤tÎÆb¢’HÂP*”™ò±PÉ÷ìõ±=ÑóW̉$d"–f»÷Ìõ˜Ì‹ñV@×Gô¦×wKÕˆHb(.âÆËQ{{~hVýËß–uþ€‰ŸùŠî‰n©µÆªTˆÂá9×gÑ×jòÀxîLü~ ƒ±n©UÞ!DÐ`¾‡îŠ sëvU ˆMKõ;]&o„c1HuËÅ–tÛu󜻠b£n°X$09êkg|FÂQè×Q}‰^@{»ýÔèùC‚2Æž B`Ü„«(¤ê¼!Ý$Á'NÖ­y¦i=“›Ÿ.ìß÷¾·øO„ü¾Þï¥7ðC§v^Ù">/È«´+Ès.x (r>"pu‘ rÇ%Ô)<¡é ·ÐËÞ†ŸÅ­ß¥È;䣷¸X0OË Æd3 _˜ê`2SJCB þÕ®h.a¡àž£"€#ÿ¶è²©&XØâ-…žf)çHM Ï P©IØékgÂ5TL‹â“B#Ç( !ŒAëpïË~rܯ¡ê¹»¹ªNÒN¸ïXß$t¹ëÙ‘ÙR¦} U-túwê É0_øšWA¹Ã^™ «‹ÅNÖ®>%c:1PEÕ¢œ'ÚpÙqÍÞt+dS,|·£©¿Ýúgöï¹pÍHŒÀAWFUÑ#šÄžÑÙOôþTÓªÄ(í¡­Ðgšª²£¤ß§ÕªnÈßrA;@@8H»Éhuó7Wc¦$” »«½{ ÇŠûuLÊë¿DpMÝ3Ø1Tµ@[ˆ!…§ÒBñż›Ï½þ¶¹·òìô¸[Xíìãç>¯{k{ˆXªßИ Nl.îÃAGTœã’©:mŠ»*¬Ï³üÙ_åV}sÍ“ñTd+@%‰€ÄùýQóWµEÏõ®2³Š¬|7Qiôåʯ€;!ŽÈozÅ›S‰z#°„§ÖYï]ü–îÁª=¯kº§=õí×Ê ái:¤¯­Ü.åÒ@å,/(aZ ™"ÓÄ+ #!“H˜Â‚‘†  QÁj9ç«^Õf ôÔݯ;¤[ …^ÙR^)¾ˆÛB’°ÒÂ.d&­¸W1] û—C£V´-(Š$óþf׈„5H âB(¡×Å)ññæ×¦™'H¸êûö‚7‚›´¥Ú°%†ïÐ]™Ì&ÅÂ9+‰Q)ßÿu¶ÿ<õ[g“ÇÉíõ÷Ór–Ï…¡ë>þ£E½¾ù‹ÿ÷µþÒÕ÷Ц\XC¨`ÁÜÑ17‚c¥ìŒT¼­è.F€m½Fø85éø½Ê¥^u+ùk¢9Å™ ñSŶ “]-@ŠÐ1VÅ‘ÇF}$pq!Pbš¸™õû"'ué.[I¡*©Ú»ºË=&lðµ×„{<íî²wqŠ–Ó'yV{{T+å#x7Ü_ÞûyñZ{ë¼ß;7jüü<‰½Œ¾Æn"mOÞiwî-øÅc¸¥£[µOèê“ÌTžûy¥ä¾5oÍ·ž9u®½Õ;Éüò«§ñR ë~Ž3CýFxÎȨ<üÅF5¯üá[…êZÅ0'‰‚µbêH!é``6ÁP1ÁµY % 3q!Q…DÉè°gʬÎnH|“mÆî. ’µwßóœŽ}3ŸÇ›_hw|ä=ùM{ÍÎF‹V¶ÚÒKÙq0$9Ëd4¦…ìnÐ"h7Ï×ËÁ i¡•–á[ŽÌˆcN'‰F «¬‚IA2ù™\hR5S Ô—&-s¥(0TÁbˆiKº=ÖA[û[ØúâRÍX·ÿ1|´?4ûlü™Çæ¦{µ(ª®º;¼G1 ^hA T"_Ú3a ˜ 0ø– '@†„ *Ì“x ÝÜHä9´›ô<#Í:º½‰ïX?ßü›]Ûüp7ýZO“I1$‚ƒ©>B¿Ø4î¯5d‰240¥€ ¦Š´2s2Qé¡§J“Ì)Í`t±×¸f‚¶í±ÂÛk5¡f‡3|ÌÔLÏFôÑe2¥, N™îµ-fèð$2DGÚÕÄgÈ'±È¢ŠÀÁéЗq&;RU».Ö¸l?è“¡›¿_àW¤ ª:Ñ¢ûKï—z (¥ê3Lñü%¢ÌCö2¹ù-ÏŸDü <Ž 5ˆYíùyÖ"åRÏJqjÿ‘9GDI bG2D› ³T–`Ú6²C#!ÓÅ.Oð,3ä•2Ú·b×2¤’-Rˆd{RýGDu…äâÜìû‡Õ¤at¥§F³+rÁ& )0"Û[yÑÑÈ›cxÒ²Kªpô3Õ>ÑÚâhiŸµ×¼Gÿ¼PɯËÛÝ%/žž5ø’·1yçV3‘‘†¨ cùÖ mЧY“=Wº­Îvi–œ÷AŒßã0cö€ðľÀj2>¢¶²ÌŽG“‰UýÚúq¤êëñëîTš"ƵgÖöY¢Y!{u G_¥C[*Ï:ÖÜÆµ2äŸ#i@ jÊ>l·!ŠmÝt*èòÀ‚4¬¸Kä!Êþõ|ëëô‰R”@ñ׿ÑG:ðóqIF¹ê ©kW‡¾æÿà!£6¿ù•öŠ~n¨·¿ȦEMX]a& `ç7suAb†tS|,·RuÊ Fä>¿\D´+>‘„á 8 új“,-¤¡¨üZ>P°Ð‚T•»h›<™rVÔå‚t[6+ê`‚¤Š¥’grf@_Œlæ+’hÅULBÄÄ“zPÆçC‘xÛ@‘Ö§?/8—3íÍõµ_ÍL$¾:€3Õ~®¤†˜=Bm+^“K﫤ì!Ê Ûˆ–È’úòæücëußúq;úü+'µ£,ñ7ìF”€{îìl0k:?,|€)‚=ÁÎUE“¡×eQ_›®„1ÅÒL5€-ÙõVµN[\+‘–TP‚!ìÁ3ú?’ÀÌØ nÝ´lÿ©¾º·øïhl2ÉÓa; %ïi¾vÏ]ù]Ó¹}|ñi÷éWè;_nüëêxêÙÖsÕSWÝ£dcs8³O.ZƒN†âì3ñ|ús¢ïŸõï·úv&ãµé2ÉßÚª#]§W“ýDšœqÀŽýÐÏþž¥Q™±3†=?lôSlJÚn½L4WºG¹;^j%Åáw©ÿìi¬Þg&¶®f£_.ù÷k‹ÓÂå4Bf z• '~‹¥#t3Mº$P¿õoÝv <¡È2Rèhõ*™,u˜!ŽØÐ/¸Dew€J ¥Pg}ò|¹QÝ0²6ˆi5]cS>9þŸ|ü‹_í_æþÞÑë[BâÍ© XX¦ÕŸ¨,ácnHâ ?Ô"~E0‚JÇVjA{´_j.ù²&ƒ"ÖО(}ò©)f~£oßg艗fîÖ ðÊAÉDj$ é¦r@ÂÕ³\ÁNzÙjª®¢Cˆì„˜6kdÝb~ç>ÏrmªˆhïÎ&K˜B1ÀBS´k¹H>°ï×@"-ÿ8cw®Ç§j#Ò#l0äL¢%ÄA0àýUÈ?æ/ÜNÛ »Ô’B̨C’à²ù¤Ïþ<÷¿ñׯæÂ'¾$÷}jnæ§<óœþÿÙ0î.×þ@Úô}ÕR­*š^v?~òUö©b¨•$]æ)ªµöÝt°±4“€ *šÚQS…ž¼ «XÐÙϾ3æ?Ã¥hßœž”ô9l¿ L)n$nlFQÚA†/))˜ø…íÉÏ‚V½9´`U²‘s€ʤGí¾ü4U*!Ü>¯Yë¡=Q3+ƒj``–7!Ñ’B2 (YYê0î×t‘Ë>¯Õ-ìIºzó"O-Fq:×ÚÐJ+1„K‘*…ÐFysž‚SþäïÏã(× îi_ `ÄFP²µo„Žpd€Í¸_þp×µ_ßë/Ó/ÌË﾿œÓ\‚Ž^ùÏ×y‰JGø•CÆ.E¤pAæ>NŦ®TÒ’žoÊT/O×r–Íù|Î&´¹ÍSÏ!Oïõø1™ñB5׈)”E! &†d‘k@aË”WS]\dM)B:¥ª¢E,!9ÀŠê(A³zC)îÕÉóÿô9rDV÷Ÿÿ?š¸Û«»~'ÉŠ~&ˆT–Ǫ$%EK‰Ð€…bP—í¬òydóÐsÚžæK‚úZI zÀhA­Š(ŸøLó1ñƒF’p%²hª¼?’·ƒÞl[z¯ÿ੘wžÖ? M98!3µ.U’´Õ6ìzô>ýŸ›~>Øì–ü”û|œhBCŠâöŽ—ì‰ýíè´­¡3$¸IVÌC‘j58g†ñb¦j`+€´$Æ*”1ÏÅÅíñ‹€O‡€”TС›$a1þx‚Ã,¦ u„œ¨@éB>Å|.ÿ|<'#°¸?79¡sÙCkÙ*y¤×aÑì¶NÏvì&¾gu_·ü’—l„"%Áfæ· [#Ë*²NÜšEÊì4o–—¸Œ¬¬ˆ2Ôld[›2¤°¤%xw7ÝqÒ*PÀÃTÄ@€9›€Lˆª@ÕAÁp»1L5‹#cQ¸6,xu--ô‡î?)˜Q½ßÍ\.2„¿üÿ:DâùGöré6ÖDç¡m8ÖÊ?æxÿü”—þYýŽdNÂ,#»ŠDl’òiˆjD¯8Ì2Dd”Üɽ³‘ÆV€Àí÷î….~‰úðxPw?_ågõ_ý¯VÂl祎!™*oàqÀßÏ“m±KÁZkQ6$ “q•@&ôá(§aÍ8$M–+±ÑLjR`ÒÔÀìP'„ú6x×óï2¿½ïùöðcE‰²0Á0ƒ(+a¬4` +lئ0‰öR]’UJÁ¸ë–æPlµ"ûŽ?ßá¾`ù‡‘à˜ ±qNK÷¯ÎNÙ|fó‹u>üGÍçJ.à Ù F¸C²û™žSãß_ÜÚcsÄÊ–OŽÀ~*ÿŒ ôÈH/ ¶ˆÌFò•úm—õkr2mŽyáÕscÎgˆv1Ø[«¨ÈzžyàD'["Ư̻̂YÏÈùl–÷ãè]™}I}’JÆÄì“,=µkjà?®²à[²¥ÇÎrÇ%]ïÌ8â¹"Ü‹ÕUO›M5Š¨ÆŠÚkãÎØñ隈BBÄ‚pSÅy­³s•|¯k7_–ÐFuxºÆèB'Ϋ£ ‡×0†úœ)aV/°‘芌1’{Ö0*(^É×eýÚœ´VâýŒ-E×(xŒQ"6Ô Èl8="Å”;j6"èâMu¶aµHùÝé§ÎBì±”Ä1 4¾¬@ DØ)ðœ(÷zP hÜÉT( Ò” À˜#9Íðˆ6™(x‡k"rHhb¸ßæ•w¢¼!å'ÉÐæl¿ÿ™¯?Õ¥)@_š +XÀ –Øô–€À¥2„2b SΦ)Œ ŠOšt©Ò+|€ æú™½¦qìæÓ¹×}ùÇKñ=2û,§Z?.w˜l÷ò¾Œ×5œžx^_¯ÕÇ#¾¶-ÞÓC EsB› mòpäwÞ®‘@ Íö#Ó¹'±ÀH°J¥!Æä–Ú¤ÈEØ!™î,^8§Ðk|zÙ€Áì·¼*?l[5/Ž9{õ¹i‘ù>ðq¸@"°Ú…é',#[b¸¬9§7wîñ`‰…½¸½nï–+Sú»Êº•ñˆ ÅîÊmFÆÿ<>w|¨¾æš¡;wûWqÓ½â¶-rç‡YxŸCïj†9øÎ!'¸#ó¡[oår§ü-oíÝy¾pòÙµyDú޳œ?ïod*h1E¶ÅE×à—ìÌ!DÏ{øBü­‡ÉUs1ˆ*‚@Ƹ$¸X xÃ)ÊÑõ/<ªWV¦ÔÀe¬´Ó†•t,¿„« Z^ „Îå8‚»Ž¤¨qC2@Ÿçã ÕöÝ5ƒ=N¶¡G“vÅɆ”à1SºžÁ¦Nú¾Â::€``´æêº­(õ^Îju!9MðÖå˲~(¸ó„vàMY†Í(Æw*E®_µ:߇*ˆ iuA7O ”ûáóyÂÜòöX³ÅÁ«¾Ë¯GÎÉhãse~v²åˆ“‡£V£Ð[p¬µBfĆ–T©L’£’)@ÅíèÖ;®Æ‚‘ÄBXЧ0“ó‚L°¢+†T²—qõ³ýã'¥ïOÿ=unu½·‹¯Õ±f¸“.€#‹Bu©¸œ mLÏnXm#^”wú&WuµŒämº—åš/ò@UY1,Ç“S×”™Ñ¬Ô€ ý€!N…šØd’¼†lE` ÈáVò?·>·Oüõ‡à͘ï!‚7˜×sí+>ÃP>¨<8|\߯e¼ïø§µÇ=÷vT6üHÜ9rµñ}w"¡Tà[g|XQÐ;ƒ3?öÒ®«äÉÖ™h A æ“’†|'\Ï“YåÙ§¨*¢LsQ0œ…ZdôQ7íÁ©öŽCopÁçWÃOâýŽ@þõ©fê-{ÆÆI¥uâ¾\ò8§8 Hå­_Ø+hŠN •S½²ê@G@oUhÇQáÚÕ‚¯×Ý»DÝá3Jw‡e1;×e1zvSh¬9˜×‘Öô€¯!Ð#Ï?+(|úW9ÝP~™‹!*þ ñÌbç~óâ2õާû‡«ÙXŠ]¦È£nÑ7!o¢PRŠY©iþ¸Xg‹ÒXª$=yà£õÙ2¼íCaÅL€´„q~6s“¼©îë.6Ä6*¨ÂÀÑÏä÷J«S%4z{çûhmu"¥‡ËyðuƒFª!Q øAi8çÂûòÌ^õæ+°Ãâ+gâd¿Šª[|T) …e#?]Wšê“«;nŽ¿P²½¦‰­‡ð½íbãhÆWOpêÁƒsÂ+]K¤¶ Å©®•T6ÒÉIú7wš>u§e‹ gpä:lÁ e­‹Êþ Xª3ñ쑆U™Iƒ[«œ[k}_»´r_­7²¶.¾[Â3äÊ%LhÛFôÙÛûëœ;÷§ãØ»ïäŸNah‚ú÷Ýüã¶Å—Y5[PK–óÚqóz6áÚ’÷uà–²›ÉÁ<®OYp‹Ýœ¿T8Þٌܻ½¢\ý]Öxw'#^¯èûkÿuGÙÓíÚŸñÆÁÁ@ÄË$r* ŠI@ˆFÓ„‚GÂЀj•a!L x!D#„†NDI„q‘x =‰Ìib7×íÏ\­x«‹b`T"ÀöÀOõíëÛ?ÞöAæïøë7òõÇ¢Öd’ çÄGûsþ¢ƒÊKÏ^5"¡*º¨üüæÌRQŽâ¢@=Ä9ÉJ-©í „Òèªö¤Ó Ÿ}»…nkŸ¢“r‡«°  {n‚Ë>m{³a¨…eRܳӬ3œÐh7Uƒ¹è=êm¹êhsÎ^Ÿ5…ä´'¡C1>À´[ H`¬ E‰=*£!H q¸ê‹h@ŒþQŒý!KˆHBAYÎ(ªV\rhú;ºüˆ ÎvŇ™2½Ø!ÿLd¢0onçÿÏQ×`M Ín3/¾åûgR÷ÓðÆ›É_Š›pp$4÷uYá’3F†qgKã•gEªà† ¬Â¸eÍ4Œž¡}/>®ê=FÖñÉÔiÞo]!å üC±:¯ ÖHÇ“ôÆ2鎇,FT8VÁyöésÿ5z¨ˆ€@ ŠDB (/[Çßï=¥g¿ï“{üÔ°-[C‹ñòh‹K”£—q¡vÊTØžY%„3b1ê*°‹_úè‹p½Œˆ"ðÐSÅZ†0gužÚ×èà"B Ä(\ +^,B({ýŽ9]äÛóP¥É.‘(Bªp؄Ң”JÈ"kHnýÝÙþ"þÙùoœæšÃ=S/zP[D•7}tg â¡E%j©]âÐöùùæ0‚ÑËT;f‰MÑJˆmÇS_žš¿–‰Ž£Æ»[ˬSÌj­ ÏOõÿ<ÑßÜɆÒ4`c›Dõ™µí¾K¦i$·™V¾ WàRV@’œÐÅkt4QfI¨'W¼b«¨šÒ(Ž*‹PW  ¹¥¡œšckO¢c¿âŒŽ qª¬²” õ¨5i¦,!Eºtš(S3µßV0P0"¸5…-hŽPT&ÁóõËÎïS0O½ÎS¾ÌwÌ&¾y¡3˜0zC0‡I=Diœ¸ÝãWyÒžÞ1×3¢Œ%õ6üCoºè`ÏÀ"‚FD ¨" ˜ŒB:ì#ïïq½3|š. ‰i€% ŽAZNYÁ @Bƒ‘0è²Xø¡|…ðûþâó;oîrƒZÙÙ&— Ìkš·Àþ-Ü….`U\ðA? „}æþK?Ïïýþ)0d@" 4ÙQ²Ac€>cÍÊj4‡=”’ɯŒÂ2Z:ܤܯÓb™Ü‡xUnò§÷A“§öÎ;Ú™dÕåž Ü+f†ïõ~Þ´öü*°†Y…Š ð$@ö:„¨@I%j5tø/ô7òu‰$ êZìtÑŸÛÑ®æÖËäª:zñú÷å×ûÅçoì÷\h‰¢¡Èr•E)&33«dL$9f@&ü­<3b±iææ%UeUà5¬iUÓÿF´Mç¥_ô‰H`"ÒËx}þd¢#?Ï¡'zb-ÃSÅk:B‚½Å0ÂZ€ºá¢)ô¾m^ækPÆ¥ LôÅ®µY!·æÓv首Í  ƒ7àk?AKÛø ÓÖºí‚Éÿös™(Y”N ¥œhÁaQ¹ƒøqúL]$L ›[Э®"4¹Âðˆà¨çøì˜¨^^×ÜÜ'Yè ª1{ˆPý#…óyoÞà}¤¹ÝÃKZ¡´VD€ÅÑ`$+€g€Æ$Q@‹^ÍAÁH÷‘UÓµd™@U–ßÖÖ7eEGážw£î^Ü]£fP•²ÝjO]`5ôÅô5KëJ9ê`óÖ­N‰£|ï,èq¡F"•´Wn@;çÎÚšì ÓÌdCy¨³bŠl2ºÄhY¡@çTÌÂ8¯LÐ}Îu€Bl9Ñî‰\ì!¸ø-@ŠÇy¶F~˜'C, [Œ7eP”3Œ~Y ÙB'tƘ8ë6æÒí#bÕ3fð¾ÁWî†$ÉDÁD€ û¯ëÿHšec) L#gä‚w±IòË•ÖÍ·A€vFë¡A8½ø}š€`ÉMxCÍs¤Óû ü§_–~ŒÒq©Õ§I·¤BB}•@¥’’¨ñˆ›c®óÜ|è1Ö[ó:Ž•‰´S ÀgI7Yàï¨{COdžÍcÞ‚ÔH_Î0V¥´¬R‚Ũu)Y[îÚ-<åj·^¡ì®ÃèxD±«úaQ7-¤TP`Q“Cu^•¸o*kJ’QTŠ-Ò}æªäLZLÚвôb‡ëÖ¥˜¡b+8}Yø-wQ‚¤šk¶ŽË×ʼne/ëo[®Å6NãÚ6,€%Ô@ÔÔ…ÅŒ›;fŸàd3lWä®öÖMa·4&”¬eWðš6Å ÉLÓöš¹]Ù(CpK±AïB«Û²ðMÀ£åL8Ç–ŒáZ}è×­A½<)˜³cÔÀRZ¢T´Ã;5(˜©)Ó•ù9ýìÝ{vwàe¸:Ç:„§j8“-ÓÈzB%~ÕâðI%J©¯cé›FõKƒÊ@&ô4F+jÇëQWKËRV¦Ñ‘ð·ó&cµ1#|'ËìóÜ‘i÷ju´Æc§-¡tûq‰ïÁjÚÑ>-gÓw˜@hnƒ"6V¨Ü¨MU6µæ¦.içžV7:“)%Åê=²Q'~Øßi­Xgx‰c7áa|—ßßûq5ê÷Ø9ð°|Ù$œÉ&Ýpºñ°>Yœ\ùؽŸÜÞ{¯¨À’Ìò±Ëš_.µ[÷nyè:¾,Ö•žá0ÑíJÂm*Â$ˆQ™p]57ÌÈ“R°JS…ÕQ=V,¥ifëù {zõ ŸKd^ßyî½ùíCÛ­y)A^XxÇÌ>¸ÀŒ :…¤H2g—î|zC\¢ŸÉUDÕ<=:ã ãÙ¼.ï °ë1ÑÑmAM’VÄ‚À†#J;…ý¡¿›=± ²G JSÅ5!Sj«ájŠ»FY~ÿÕøñìÏW~bxümRû×ÈàV>,äñщ9ÄãæÌ9Û(χç¿jï_þצoчLÂ2 v9Ü””ïtèÅàŽ½C/[2ä=åÙÑH·É¨òtµ¯ç‘1³-ªOd›{ÖÆÔÄ)˜ Õ:J)²^+÷ɤ²rKær£">î¡h •Yˆ"zÜ1*Úre{ÅIY2Þ1‡£ÙS/ö—ÁʃÂVÝ•sU‡tIh8·øŸ¹Jž…D®–YU ¦³•à”~+äîdì±'Üyb‚,j¨œªlý˜±Œ« ò:eÿ•$AO¥•Äÿd^ûã¼::×îÍÕY«å1ЊžÊcYë NÊÌžñ!¸ûª¼vÉáI3"74Ä=ëöP–ß?Õ-å­Ñôó.ð9!“©%|°Ù6BÕha„ @sÑì$P¢mŽÚƱÕ8 w&²Ûíë­ö©XWúiú ó×<ÚýÔóz4¦äÙ‰Û£’*’ªr0îE¶FòÌ5)£Äú7%™?‰…¸‡‘÷AZU Äb¬¯h¡ˆ­0Gã›;~Y3væ–ÏM?JÿÀ̯8½6l‰M˜8¦}¸UXÄLRÈ$ß“R…¾™ÉLØu5dºñ!®*}¢ ªW´›mX° Ñ…â‹5K7PAÝ&¥k£šoõ½àþª¯Åó—¯ÿ®ûˇF”&ÿîôæpQ½]ôIXb‚3¿ˆŸL(iTc燥xäWiUŒG•y““9½@Ž^M¯Æa^†ÄÇwa2b×¹KñÓôšZ!’º!ºQ¸PE#ðÞ¶.攞WäLzÀ瀃úo¼Ìþn(°y¢hØ€šìq4 -6š™1¡Å›irW33L¹]ónþ‘ØOÆNNÜCà Q Â@F€ 3â 6@@”™2&@%ä¿ÄÉ4¡5Áx„©:¼Á)W&xSäÀ”Ê$4_¿êq>ÖQªìBº˜?ùþàK9CÊU7¹ï(¿)©N/ËxØÑ’ò‘S©>í³˜\ŠÜ+»Þ¸Ù顦Âd€:y'Ø›Ç:0‘®,œ¨ÉIŸ Nk€ay2¢AÚl)fŽ º@$•˜Ê—¤þN¶yC”"Eåø ô8|^!õ>ÌýVÿý§Þž DXÙWíΈ‘Ÿ¶¯T€ˆ€ˆ ÆC QÛ²Øg«§süz‡6L 7>ú𘇢}Ä£'äÌ;¹,‚îae©ÉÑž§rnœoÅŒ>,–Q 97ÕÓš/ëæ…ã³” d¸•>ü øªâ`¡Gãïɬ}ó Ë=„ÙWî÷,T|$tÉVá$qãèç­Óá ³¹¼¿2ÒõJèá±[‚žþÚ™ׄOºMÊUr5Ù?KôO7^Ûror^Ž5>LfUÜkB™´ÂF@µ’9/G‡ƒ=j°^}éÀµ[ f–;0ûô{ä+ã€Õ²fFè8 ˜¤V¼š§vî3w¶yZ“Q«?„z‰Ç·cC^ƒ-mJªT@™€â U”Pœ!a_ŒÂÑØÅj(Åပ%®¤bÃí2á¥{…˜jR® eÍ«°"T#-ˆöÞï2ëþ’©[gU¯ð„¬òÚ«n¤5« "::þÕõõ }gRô#kÄVÒŽ]©8B-¬:=µ;—T¢1U‚¶Q“ ¨l ûÿÆô—¿Éú±©u°Fµw8d5yû:ã­[¹GƒDtup¾\O¶zR*kÅE5¡A}’ûB}žËŸ.Û˜7À]Üw(ÜRuA§ì ¥N°mÈÚ g°p€-$„ÈZ€Â¼ÊV⩚CcT“I‘Vq)·>CE$%©žY•=R¸Ê 2!Óèžnc¥×SFÇ D XÚ¶€MÁÔ¨ÔS5TSb¹bö»v\ÉS÷ÆÕ–ÑäæwåN|î;õìßú¹Gwß*W³¿~ÿñ­ï/¾WmrwߥsúΧæßBEáºüvÇÓ#"2%™cû_R´²p1£ª€!` AI­h01j ”5è§—ûÃiOžgмŽä\òu™ë[¤ÎžÀ”‘Q×SÞÿÝ=þö¿\í‰%+¢c„¬ùi ±)ÊHÌ„9:~pÕ0uò~¤mS› (º†(RM­´èRÇ·%÷ÆtÖü­æßèŸãuÄÙÊWgm{û`#C\xÊ¡QRçB pªâЪ(£MH<Ú£òML  #ØU(®hå><ÿj×î®ú·¹Þ=±²K DIÄfl¶k.lIM–©`fè`nð ¬­8tàP5ÕÙýíÔúZCYºHdøAUE2%ÙÅÏûüÇ~F Õ€½yÏê*ΦK¡ŠïL3¾¥¿€yV,‚)´ «¼=R4í¥È×~¬^iý@ËŸ‹ó%fš¡]ÁáPhÃfÕå3éH1Q.:¬”5Œjlß¿ÓOœQsdY¸8 JA‚(kf]¸d*@‘E¸¥*dµó£qKµè>j hdÀfÛÏØ6weû„ô-μ *Nƒž›"#òé[ûûöú<ÙýÈ“ª#QcãpGÕ­LOàD›^­N+ÈÙó*Y¢?° ÆïâÒ" Ó÷ȶ[LnbuF&¸Éè(@ç©d^ù=Au{~m»Ýzë{®¨Î©•ºçç¾Èä><ì¶ôd¸æ–ìû:{gŽ»æÄÝ+Ì1©æÀ“«:bÍš#“u° ±‰XVa¥Ñ:M·£]¬†G|ç…Ó™_No«™Wj´‘×¹Ôqfz8hJ†7‡(Ÿ1ÁK€È+Ú£ŽÆRG i€²âr£NÔý.ûɹ%=¦dã‰Ä‘PPMµ¨ˆ.ß !O 8ç6¼“Œ6ÅÚ˹Ä=çïü{â@B(ªU{Êâ³ÏËøyrà·ñuÉ”eFƒ¦Àã¾’òÛ^weŸ÷²Ñë[Ö/ÿC†(P @‘ë;å;Pãk £â;uM%)T],PáA«ŠÕ! ±Õú‹¬›W*’gyÅZP– B‡±« ±ÆehW–ˆ mr` ÊŠ‚‡¾{AIÒ!Ü_žÏuʺˆm¼3¶‰A}ðØ.Jƒô×T›0tï–BºVi«¿/uýv^¥35Î=hìâÐJÎ< ¶h}À”¹áWzªœX ¶ÝaMÄUW­Ã)^ÁPw’‹äª¹Hê226žî&4iC³ 4Çîª[©•šò‡’a¹¤‰Â/ƒoãm‚ \hÝÕª`ž™)™‰r"ÂÊÚ‚¯¼þ6ßu¿™’BɃg²…™«#íÛ¯?&·¨F(êñ™]Z¡T‚‰jØô ÀKxtNTº=§Þ‹”í]TÂ*Q½­2 áN—xµúàòmIVòvÔ„悈Á6•p °(Q’W…Éð‚¦hi<ô[¹—{6›ôN`t‹ (aS&ÆÄMh*»fXIµâjtmB`× —õ8¯ûïs΃(z"à³h>“ÄÞ+·ì¡Á P†3€ÔRU x¤ (¨d´ Ãoœ[ot’z!{!vrº•Îä ¢CGݺI^jµhëlÏkgÎxå e7Ã/ŽŽ2À¹åõs–­ïã€D§xhn¿’ßNÎD§ÔHzÁ­ù{¹Zÿø˜ý`ß‘÷¤gÁéÒÈ…W²QÁ˜ µnZD²§$!fÄZ’Ázüv±{"Yt’¦ãö—ÏÈ#Ø­yƒ¶Æv“¨nwÃVÁ…f8²„åfPx^xbÏOõ_?ÛÏÊ¿|âW¿ÿüÌ%¡öóƒ9gyÝÚÏæY„®1dåöúý—“aï9Ðm,-È,žÈÐ$ˆd§³‡s¬ÌæÕÀ¹£F“Óh ?l6êRíµQÛ_2dÑÉ ²˜dôÎÙv+·aïzï ÿ‚¸€ñp,;|;Þ£ùãÚŸ§OJÒ¹ MOŸ3¦¢zƒ¦ž¡Ò®3[ÁuÌòȕҕ­Üá•_ÇÔ±ò7~Pp4jšôÃ@rÃAõaƒÈ€ê¨Z)ë¿2k·ŽÅ’]cÍ[ª«V¢æF¸äÎüǶ’Kù˜sGsH_©šËÀ èTexx‘FJ(!–‚Ÿ=7`×zÛãdúIi=¿§OKÃ=14ÎG j/ƒé¸.„—OÒkq2E”E1»¤·k*°Ã%šÁ”QiÖ÷6§45(’BFÉù¡™ýèùq-’Ulm-á%zÆ@GìKIe!!‡Cé4ݯn¡Î®j¥#UBª¶-*¡(àÉúpÐ]kÀrúîÓRb<£Dpùú Ëþüþ%[zbBÔKeG„ ˜ Þº{ŽõÈï²q‡H€>VÛutáØö—€7œ­}„A}³ÿ÷}§o½8˜‚ ˆb ç(„²ÂœÿO ×÷?þö/wwSÞQ~+¿SË/`¾ØóåŒÞ»YRê^r[ÖЏ±˜çJ¼¥›+ƒz…}÷Vwö?{ïeÈÕná¦çF©:qàŒíMFDÊøQªq}”$ËÜÃZ5 0Ïœ_ ‡p=xüµ…çí¯ZEñZõ]ÝŸ ߣd¿!‘%rÆ+H1νi¦¶t§¯^SÖ„Ÿ³öu¿).üéù<©y+éñ<íõµM ¹ŒUÓÆáäN$æù@ïiÌ„}[fN7TÊkÅùæ³uó¡„ÚãZ¤®eïå»/­äýͫˋͳ ×n1u=¨H€e°·é€B,YQ®*RŠcGŽ1D ‘·\i‹Œ-6åÚ•”P ­•# HÕª\õ×@¸Ó*R…V°‘àǨ³´S`îÊŽ)x%nçôû%ß>¥¬| UIŠ´çŠ¯%B$é( ¶ëÙ>¾ùþû–wÇÁÂRk]g÷ÛÑð­W.J\’c¹DÈsï–¶=–Æ-ôʺüÿG’ü¢ÿZ.7Ž01HNÄ–y2ó€Ý¯–a¤b›jí¯ž@%ÐP¦¶MÞBÐ`£p4D>KHÊ ,’Ø(r•5®‚‰•³Â…‰Šp„ )d;Y”©$Å«Ê*ˆ›·©U 9!¨ÔÀãl ¸-JyÈkgK÷·å»oy™[Э¿|‹çƒß?þ ·k±0èéûŠ?œüPŸYþøž_üóïªÿñ·â PjÃõ*Žf³ðtçn€çGóÑlâÈPeá˜svSvžm¯5VµŠ%âÄA€ˆ„–FRL,*ÆI…-Ykgüò›lÚOˆ (c~B:=*”›P"Yi›Q´È¥£L‡mº'w«ž'z?›)ó"Nö¹ã~ûRЖsÑ9wšx^cúoÙ^Ûï„ (T@9ÇÝ6?áò?ðwÿ›g¿¿ô÷[29¨`A„´R @Ðd"% Qú;ÉfU3*ù®ÃÛúS`¤5@Á@õÀŽ"Ôß©kü©,:Hÿ}{Eï“ÙRÁylUhª 8%‡ƒ’ŠÐ ñäAÑ0A‚œöEÎL>¨”˜¡ƒB+JÖÈØØnø[Lç ëD=}hl±_B#¢ S©!*oЪ¦‚y–üÛiXp®!€+{ð”'M9àk‘S4fÆN{Ø+êh¤ ¸Õ8?ÏARàt[Û«#|oªcÛÓÁú$ÊjÐd 8R D8à˜(1Íö@ØàB°V‰cbôíuÏûçoÞÉ3aÁHüÃÀG¢S“ᆠ…qÄ»¸‹‹Î{ºÙAÝ/ O¹Ù”ò1yUŒ08ÃÙV˜:âbM"‡Àá¦s"©p ︥ä0xúÉ値ØnÁF»nŽèÖ¬ê,ÊÍý…]iyÑ;ô3³ìPFg‹]SwB[Ó1+bE P‡fBÇÓ„&õ dŠØ‰Æ2Iúóƒk5 «ž¨ÃK§¿VÇ ˜^ã £wv`à’\Þ[»bKJä³sô«ì’‹øýSCÑrtr´±îH5Z¨aY’-òKêʲ,J†01Ô¥LH {Ø ³ñ|”êTpYZ0šÜ9¾…ر)rܨUt8]ëó#ΟewI…Ê1"Ü\ ˆ‚FZ =ª&Ä@¨«4&cä° É½,YÉõð•j\¹èÛý2ö  ž@Ü¥IŠÀzèÑ€Ø4Ä'`ƒ 3z7º'@€Ì`'èüŽßå7…aã¿VïPB>c6Å_¯D:ñöžúõóèã2›^Çýz‹ ´w0­öl9®Ûwü<×A.븬GÊVàûm}çkà¤ÌÀÙ­æqbÍ”kjÍÝÖ¤_s\/D°Bv€2 ÙL›}¦Ž]»ã>¼i =N€]WˆÀ0Ì™ µ`úF÷ HëÐ5ÓWE6}¾—ÞíG¾TJûöáÒÝ‹(ɸĶNJ” ´”*´Ë^†Ð7ïiÉeU€j­Zg×ñ³Ì¤žŽf6i‚W«{l¹ª®¬ÞÓÑ=NëfÖ/Ýï] PÙÂ*F¢.&A-\60¨‚*ÕC±ì`ÈÄÖ \š§y£+§Êq‹*H7³Nñ°äºj?k,ºK/ô¦Z“H7¶ã‡UºÍ3YÏ ¢¾ÕÔJ)ä }û¨išº£æ.ºeÈžXÿÃêÃÝvKQvÇ«aö™áÈ=Qù]w0ãrÝfJ ®6ì=¨‹õBÕý këL_áJÃrµý2V Xq$«(CE”꣋N§LÝrLÖk G÷Ï0}ÅíõgTj¶j’±GÅÎñ V‚!€Þ-µµkkiB (Äi™ãûĤ]`|} Ÿn][mÑk”[…1БrfÀ×Äc|k…ÉZ¸DUÑ­jÆ”)$ȇÙ:”BM„’àq UÕª^ÚÒ36W«´²^»ãµ{-îR¿¾QÓÀ ÊPœ¬ðÎçûHE4/¨ò@KoÌì^R”æ}Œ§aÑùRÙ뫇¦CÒãT¤÷hbBê¡åäm‡•¥:‡«B;'‹]kÒcW[i_þní5œ{,à³Ë„Ç& t¨„Ë2¬§×‰•_gÁ ay»÷©\[ÛFp“êo[¨©–Ö:òÂÔHϱ¬HZž¯)³¤ð5)E,ÆE$Þ`Ý.a JYLVM¢¨ã\RxÔÙFj[.°¶D{íWÌ_€‡š<r7rO½æ±mYâÕ9TÌ»'eGMÊ™:„s),L†ÅÖÕ«¥ÅßÛÐÇ@½Zø•\Gƒ[IܲÖINl£‘Áyl' =MÒ"P4憾?K–šÎ= q«‚²SÿêÕ—?´ÚØúFç¢ûuVa'&f’¼J~h+S<º>ž­cÇ©§è®ÈÎè$YfkŠ¡ö§fI­ÛæiçQÀvŒwS¥ù¨‚á"lËGe}ååòrr¾dJ™L‚N(*B^£°ôS…j…aú›v³¹ã 5ÊS&ëÏ}com‰IV©©¶¿«ädN_T/ím!„­hkzo"‰¡D½õ”»Q¿?œÂÄREZ>µ?~Š/—UÉ»x»ý_s+Ï(}û²/gÓÛÝ ‡1;ûa¬'£oúåÏú^ìø W’!Ad•` ®·ÂGê’Y, 5•<¢ eqq<;85³•1[¾ùÜrÚ]æµ[ýÞ©öüô¸}g•¯%OÐHÆKzÍœT>Á1L'vÞO?q!´#@"í*²™LÙÒn‰“ âY5- 5M;!¤ILºÆcÑ¥P N¸É3 GDz6¢H-¤Ñ&(ÄãÏÑÝÆ2Üs®sÉü½ëü3U‰uó–¨M~bíÀXR³[¬à¡1#´h³jRÔ¬…ÿÛK+üDBHF*Ö‹a&Dœ´ßóçÛCÎñacÊ\ç~`µ”FvU¬rÊbY©n0B¤Â2â žAɺJåï4²élÒ…\ă¿EÃ>²FÇ(P°Š‘+½=L—A5¿iè&»fUP%U4ßûÑä`k»§ Ƥ¦¤$S‚·ÆÙˆ\® ˵ ·RøXj"f‚Œ3Ó dœÅœ$ rÁ©ºrˆÚ¶{-­Nýí„üª­\Úc aD0øíŠˆ%ÐâmçKZãhKjÁ›Ÿþ?Êý_ˆ ¯=Ÿ€Ea-†rúe>I& =—ÚxKù徦x…FˆAo;‘p§¹# ¢LÚ—É¢“‡Æ•Þ+Eµ^6’¡¦iɬiJš#}õ{™m„°úöÙ¯§ÿ•C×SceúÒ°ÈQ5³Í9ùÍó£˜ë@¹Äèxœ÷_<ß_;r¾˜W‹X‹o/…ä1úñ¸)Â¥z ÛÆ |ˆ•·õ ŽËæõÓ:tbÇXÞ|³ýõKqï`¯ë^g§#Ï•>q ËYœ›‰ïV¥pb8yÏù{ˆ™›Ü ¬ïq~ OM•T Sƒê'Ïù¸³â=Æ‚#„>С;ç>¾é5â38> [BK¤çºîžÖφqzq›]sLbjsõ·jÂ;A@) °ÆìŠê*@1ñBÔDX™T@HÊ”*h)Ââ1× †‰Ö¸ÆzÌ«PA‹ˆ*"Š1JHÙ®ïÝż¸¹VYYv&_gÎ cA´Hñ)ƒU+dÉça¾«;bnÂAÆÀˆ d·Tªºp´J‰Íöªn÷ºèÛ½þŠ6ŠÄBGí$£}fÜ;p¢²§g²F2ªn®§¨®—8L¿×îçZöÐÞ›7ðŠþFØÍ4È BÛµím P·²JƒIS]a3†mDéR¬[è H¢l„‘DøÅV¸)‹øð56îÈ¢¢ãñÂW6‰G%ƒ*»(PHñjÅH“Œ“¦ ,&…¬€Ì˜QŬ € šŠ$;½‰Ïכ̀ž\nþEùæçÛßïOËKûŒÞ¢?ÿåüï·U¾`¿I¯~þLÿõ/·–èX±`üx¾sÎ5†ìä¾'ÆDŽ|Óg&Å+µe×H›{?‹•¯qs e¨¨‚€¢„  ÐjYPŒÐœK“Y%i×€B”­lCЄFIÅJ5è@xЂˆJVÃD<}ô%ɘ2ïv^'=·ZD”YîYû5çÐLhR pyà©q q¬j Ï»ðk%M>zõs¾Óüz¾?)“‘¾À§‚ Q@ä«EU¢Âwä»Bz¡‘Ù’D‡møéß1^ý¹±3@@˜±Vsîž7òoÉ<&¨¶çh®0«qr›0€u‚°dõ@©8P †hL„@J9\RBeÊ©o:±z’:tqPh`Ë(ëäÈðnù§Í®fƒísÜœçÄÑÕLRɨ À–¤ ‘aÛl7E6¸pŽÇÆo„&À‚jÁBΫ:co»swjͺç=‘/ÍÓËsîàO } ìÑžUÐ;ÊNlÇ;ŽtŒÅ¦#Ú¼Ê h@ÖN!kÙÍÓY¥×hù¤cºkÂÐ#þÄ<Ÿ8ª#­Ë-;»4É šÙ<&uA¼\Y—gS½Bú¸1±ÿúò?jr‰ôÚ-kà”EÂSŤ>rÐUqKØÁ»Œ‡C#@keâK’²¾lº(,¸½ÅÛ•eù©gg×R' ª›§_=Çñäw«!œK«,­c×5*/h@ +FA kˆinBð’š’{:q(ë˜&Ëí® Fæ4b„ùß…)ò×_ŸJWKÈv¥^/¸–dHÏ`œ@nÍͲÕÔ\ú|Ôv#K*íPºfp êÅLJ3ˆ,óÈ´"cÉ´m ±;4°‡Î¢—Fƒ D séV|{ØÇ-6xOAŸûÆ,n‘±R+œkX¦÷F`k´ HØ9›mÔÍáÍ'«ŒðèÀh=l ¶¨_-õj»Ç—o×-Ÿ‘?Ú¸o ” ŸsñEUdCJT&¥¦À„gPjŽ2©¾3\(z â¤0ßéˆN|eÑôÃMM¢¶~Àý/§ês4?÷¾=ßúéËÌÛ¿|—×wo0"ªKÖ1„190@6CˆÚ½Éàÿ]nH@€|hË…ñ“% *fRlM´TK3T2¬ aˆÇL"(Ž¢6ò•»ÎØ>&Ã3‡ÄÏiçÑQЬb¸Õ¡ L‹þ²§u¦gn–bn©Öª`-¦ëh + Ïœ“j vD!Žz?a(r]LŠîdcÎHpÃì“¥ÕØíL9P³Û}öG}6þqŒðø~ë7LÔ1ûtª q YPšísébh‡l€vËãzR0fZLJý"öø²U³M1aŠÄؤ/[Ðçƒ0²ÛB iÔ'`i/ÓÄùÀCPÍK8<Rl kœ§²­:Xëh5Ô ¢6#;2@1¢ ‡$N0RuŠXÖ\!–¶Ò:3µ/ú0ç~s¼E±åÓ ÝSºëÑz¸Hóêùè›ê}íµîï<«œ£ }¦Aâ^cB ­ f\2hôwŠÞZ¦hoù=±sÌ”èÐ,OæT\dˆ§ìE 7‡˜q$zi'ˆ<ñ%LÔrŠ2ð!  )1ø‹ÑSź8VŸÕ¡ês« ÜÕx4¿q‘íël9êÔ? ¨h€^67ƒ–‚¤w3}°°³í?Ó(ÅZ£–”ƒz„ûPÚeðýº¶˜¨^q1wÇ{g^mì†ÛñÄuÆç¼Uì Ù™iÏÚÏ¢Äò`ö\·Èõ"Ï‘*Aí9¤q·7™Ac,Œ ¬¹¼msÃ}êl›+KýŠ·!¼ eaÑ™x"fÊÂ¥+G€/±Žöúö¥ªiâV{ƒªˆfˆ2ØiÙÆS»½ý<æ°êç‡8¯LødÙt0‡S´Ð0tA³UµLsÁ@*n®n1ÇIe{ÜEÝtºŽëø÷ñUí©`­~²jaÙdÇéüý<×á×g\âJÏœJIw!ïq|$XFbR€ XˆYðZÓ=’…Ä¡FjÁœ°ch‚(*7vš ò2)#‰Mpl5¸Ýr¦½§äÒ]afµ¥@îVÊ|çöñÅx>°ÒX~_¶£öJÂösʤÖÞZ>ÀŠ 9öº‚U0)ãwt¨ßq­wͽ•plŽ$ f4V%»PK×ô‡Wßë]Tó¢OG@„€ˆ ¨Ë ÂTS‡•™¼›\l ’-Ô‹y€9ºëz}é@‰U9Û´D•ŸB)–@¨¥À‚2„§Á¤(Ç! )Ua¡9°X™±â¸N\Få!dEÆLŸ{®+˜Cà3¤o÷ŽknúÞ$Nëv{áó‚“vfÝ“Þ;}\ãYëÄ$H1U£]F+3À[Å6n}V‰V㪲ؤÒj+È0lúª %×…t%K[Pc5&ú­c|p^â¢sZ“÷Å=°h쩲“’¸K´&qÓpNÁ–H•qb$›ªÂ›ÓU&|JƼq9^ò+;Œ(™—Ýp ͨ˜¸p´„hˆN aæÉœ¡9Þaßq¿±9Áséa¸G·©­F&‰Ñ‚K*ÈY Üd`µûppÈJçØÂŠC£’0¾¼óºné³p³b$â\ì” 1 ~˜¬€-Xé‹ßz24Þ˜Êx`Ï¢âê@Œ³õÔH´H”Qt… ô>.g ìÓÒ2|!ñ½Úˆî¸ñ4R1¥PC >Òˆ DÜoM@P”PàmáÎ;é7õ!ri"ç [Ak(î>°’qF™ÁÒ^‘oÎ2_yVôTÇÆþ†LÄšZ€[+ÜHÕ†®'æ[­Rô“T$£2£xO8Ȱeø ©°ä²ÂZ<€Vðö‘¾sìh—Úª÷5nÿã¹ßUç¼ô:[žj18§íÍW™ÒzTé/zíÇšuïîŽi³nû`?¦C7-Yn JÛ‚(ñ®:œ6O°Ly!OÁÜ~³~hήêæN>xgÒdOMÇýúËQºüª,gÔhú á—¨]o]´ÊëãùÂàûñÙsÁ/”’~ˆ\—+«¸°ž‚¢‡Jy½ Ôýø¬ó~î•„0œŽØ™) \‡5ë(í§^_ß’õ-Wª"7á ãÕ§&àêNȤÂméúºk¼"õ´ŽjÑÄMU‰4¸S>‚õ!“¨Z ¦DÑ%”“RÐ¿í¹“Þƒz[ˆ°D½ø~¿øüü|Ÿ-¾óã¥gTÒtÌÔÞêr)4#GL‘±˜´¥ú¦½4 ¨ B ]ÂÕTF*Ž䊕ˆ(BÒR oìçö{AÎzT±'é¥û,Œ\ã•àFÄHjU† Í“霤*]ЙwqnZŲÆW±6[f‰½½]J…ììá&¦°FP–&—pt&S^Qð«€e(U.|¢?Ʋ‰ 0á˜bk3Š:-¦VëÑ™Ð:~÷O¿W¿óBÉKHŽãÖõqws¢½žmýI÷ÐP „c$[B\¹q”X”–’?ã”ãû™@Þ¹‚5 ‡á—ü*V 9EGz„˜¨Ø(­ ã SlܾªˆíH5" ăŠ)0ÒatÙë¬ vôG`+`:U±Ð(¡Iã*ZZ2Š*™ZÍJܘâ?ºs¿_ŸLeÙN¨Œ :®t—³rìÆ¥¡”ÄÄ…ò“ïøÑíÙ2ÙŸg¼ß"(È*˜4¨€Q-Q+fË6©£M!’í¡Ñ%Ç,¢YlmigÝÅ)äÄCÚk¸ [P€ ¨¼±4Hmøß(Á»û;ëó,sP@=Ÿ'm”ã1.wÎ5±ÎPŽëaÛË’Y¯±e:ÆÒË$¶'ìy¾ó¹íùS}°ßà ý-¤IÁ¥”Tʃ=eÊÅ«}ÕD´—t `m’Öšå?ùUDý9X²VcÖìlب’U1b‹)9ˆƒ«dÊ^Ó*k$M¥R „P‹ž’„ª ¡öyuõЭÈBÕSeÀ5 `îöÇí§õsUÀ xOͱ§áŒt‡cÔÎðÐ5ˆÕ0°qò*Õ©›œMÅíY øaž$Ä–ìí¸FÙš¦W:/ãú@—D`—–öä– #Žå‹´rw ŸtJPfÆO‰‹üùXÑOx¬kTLÑ ACT‡‹?µd2=¹£RàùÎb=›1tJ§€mª"· èÔUÊ0¼$Óá¹3üédïŸîí·Õö%‹;Ý:ã°n¼Å¿ùÛ\që\qozÛ™XXQ•Nmœ kyÙµÆÍëãÁ€’Có<w8 (lÖeÝK¿Är™¹QjîÕÒ1cu¢éÞ=W·^åÎØ€Ý²„ÒËXK$ªÌù‚Ë>‰˜VßwÚ…M<<-«e÷$M®ö¤ßã¼Ü¨oÌÜ:B3TìUM8Ç ¾nTÈßêc]š@çY9lè2 ±Z ask~°9ƒˆ\!3dÓ˜t¨ƒjIáÌÅ”àt1!;c¬¥U[Ðäus_ïöÃøCíõî1½%¾ õ¸#j«i+³K]B´}ÌmÌnåCéõß :ýù":yýhnSÑ+Ô<ú!ị1j’CÊ‚“üQjIñ‘ «AuŸ¬g0Þ!úÃóÄny6~ŸÞWÆþ>™ô_ž4ø>¾Ó…Z0øè—áõÓí{ųÌÙƒé7Éú²úoýÕ—9öYVDuɤ h€‰#<†þ߀A#ôAI ?0ø;o ¸øÈɘ·eÇàÊ#Ã153µÑò@VTÕ«åEÒ®Š)4¨E¶MD Ä39ñÞ£ͨ\R%>.æâ˜aÆ…0Äh"¡¬dŒ:èÈL#z(M00¶áû”µ¬,x5ë3·,L™°èUL•šCÚÀÛ,´û¬RRAY¦+øfºNºF}1áoÅ›¦CpY©ÐJî„¥§rì”   jè%جtœšÕ(”Ý´2dÑ#¬’Hƒ:3Y€Îå×Ågl‡~tµ™/£j ´• :Ф¶ •f’Ï "F{;ˆÚ ð"LܰâÚR²ã ¾¬.goÃ|˜½jdyxè P}@kQé…¬Ê^ /¿…Ãe‡Tö£Ò¥£öVî͆-%ËTm;mO9ëØ:U#™X‚N?÷=ñ—zÄŽ\ÝËvÅœ†D<й C_½wV\ ¸Iv@êØ0iDÞè™ÀâR¢˜2.Â'ÉA3Dx¢"4Fš¿q~y(K¼cyt8OyÒ¤Çmß4Am‰EØ©¬ˆ½Ü@-‰ 5,-m Á €QóÔE¯öíe„´Eø äŒÏ@Nà Žj˜ýЦiÒ‹€Âê Ã$RA;ÓG•ÅvÚÝ)åŒÝ5²5Þ;Ïä~úºm³´´Q¾@$üƦ@À€€ËÀ)˜rêH“9'WÚ(m‡ÔfyæÚýÙ¥WÔ¢™¸ŠÖf¦Fð·÷ö-L¦8Øq ÃPû¯G[5p…&J@P8–‰£"û¢¤öÐ(=ÚðÃM.Eô(Hž¢u °×³yB±k¹IÜ´!\Í””˜ Í‘ñcDs¸J …„¹4±§q_‘Ë£ÏGêÒ5‰ì©1'‘ÁO‡ßoçÁ亀‰Þv#ÀŠH:Þ8˜0ŒÊÕÚãéÙ0™ñ3À”yjŸ³ô€S.yƯ4l=ꀾDÇ"‰8yûÀžWÏ׈³'^FמN{}¦W‘2­×UQÐk ½Än"eÏ-"è3…•Ž"ã]!ÂcHsüŽl¿=™×¯PN(9¾9¯w’§3¬DLf–Yì0âë¦ Ký™Š”?ÔìŠZ=Ž?\™u§ ŽÚ¬FG/­}ŸV ò2 s濺¶nöÓ'Ý3­ßø9£W åél@P+“áÚ£/>®á å5о Dõ¥  -å#¼t+U’¨+øB¨î”V´°w(mˆ',IKsû÷/f•‘­”Ò’m16T xeߌKe›ò“ŒÊιG=> ×Ñ8ý6>°éêò`šå0±gÉ+Ÿ,ÑÚΤŸÿ‡þÇÿ|úó"q ›|mnEP VáVt£IàËö¹±„o”,z†®tJva#d «@k(wŒE³hݨ ¨Ë®IÑ9¾çøÝ6x‚©„Rš¡Å]§r`¬ÔfíWƒå­‚ ‡`ÀT ²Zj F/ Cá¾›¦äpp^Ò®\AœÕtBG”¶r‘݈=óiî+uõmi»+³§EŽj+’V’™Š ¹Ȩg}yWÎ<:Á™JùÞÈ2Ø¡Y¡øš÷#˜süà¼vÅ6Ëby`O`']zgIL³Òkw_U;ÍëyÙúš†aÛp­¡¤‰ÙÎì›ú›î<–‰”ÌòÅ©œÿôî7–㜨s8ªÁk²B†a†@±Z:˜*&4‘þ*05ë 1}Ñ¿ ñ3ÜŠS(ÜzoX<4ªÖyÓM¾üåò‚\„³kDɂܑâóXEZƒ5£(ÅÑíÉQÈdͨh¸ô[[+7Åï´Ìî 0EwÃQÒÊ #´q )JOøR>¦7c#lZÎ\ÐMâéTwÎÿæõKäÜBkË¿s޼ñ@—“kQ;dE"Ë×*ÖÆ@Iˆ— 0ðQ4S ‰ñdðýÂRΉE߯äaLQ–X—jI‹Ñ„ò¨y8f ßï¹îðíƒã\¼¤¹±fô̦Zp6=P-Z T5m¯ä¬†1 [ç0ÅJ ¢ø…P\ïïå| üs? ÿŸðþ EËø Žöíîñ9mø05¼¦ËÙÏ£¢¦RñzìiW”.?\Ú§zà< O\š¸Ö—€OÑÚÖàloÒQ@³²ªU]„â´•¡ zåßR­î민9Á^š'Òn{x¢Î¶C‰é¾ÐSŠØ’„§¾ÕIævâ¤ØYÈ©Ål·îçv+2´<ô)YÆø|Bfg=òõf˜ ÁEŠ!æ²?7N¿›¾—A‚ 0Up7æk¨c,ôá“Bb-v¾û]ÎÅL;¹0ô#ŽÆ“ò°«gòŒ¯þ½ïíº®ÒÑÛtX”"TëúBùùþsÎÏž`ª‘XùíÎ 2+÷–Úõ1V—®fê‹÷ÂO#¸.ïÑ|De®KW^òÂkÖÔ:ª1 DÞþyÉw.b±0¢ˆî?úêÏ}Ƥïáïr ij±—ê"ïïïþÿ?·>Wßo;µ˜ÒH¥âÖFXh ÖP!õ€rõÐëZfŠ ´BÀ¹âäe£AûNôDeXw+9èEúåÏÇúhÚHCc´©nZåÖ …¼Žß&ß |¼¹û)‰?qœå ¢ñ#tõWRiÉŠ—1™¡UXŠWÍLV઴2)”“U–h ‘Le*F+«¶² ]´`0 »Š¥Åm­zÕ‚“Ú a€BÙè! #ÚŒ4 v&“Ÿ2¿ÑWXQù<üóµw¦‚ܾÿõ÷û[;—ïŸ=Ü×}ëÞá?wöÿÕô?ZÎ@ Í’É+f6ô·Ã?ŠNo¿Ížù*öbÓ9[ÎÙÜ9¸d`)% ¡ÒQAl¥ŠWW l¡4J‘:D$ì©íN™ qK[XðÞËKÈ„'Zãú‡ß ö¥~I­=: ‰¹"â"#õIËÙÉL$eàÕ o<ÚkÀ#% ˆX#`éžï½Ïïðüƒ~‘›‘I¡ 0¢ÇÈ& ›ÉÌká5íp §¾DÛ@àÆÈ]ê5@f-|]<™ŒˆZÕ%Å­td÷–ÓFá 3kY J 4ZLj½ê´[pS¨RÔ¢ä€"\[d‰PÀ0÷–ì²¢`O¬’‚%4´‹»|?ûŠB ¬Éè¢5~-²Î6&ÔPˆÊp@*ŒCdž%×ú§…·¶^³­:êÁ™“B rëyrnTB&£¾ ¦–#×b8)µÐ»Í-°Á–e‰+v\i¢ÄiGah¥'Ð$;YmVY€ª@D² Ç× -`8ÝkXúcsom=·&cþìÿÙ÷oR°îÛ™maMùa®øÞaÝMº$ÿ=_\ØaÑŸq¯YþÙy ÈO„Ê™žÖ’w‡QËGfÝQZ`úl„´u¬‘©*syº«§b-Ï]÷v¬5Wk­ùä:·N¦c•7Ä“ñ|xîB>ÆDm{¦„4‚þéÕ3Ökm¿•j×in-Ó=ìî -Ò£J» ¯ o€¸{u¢82×,MÂÂ9!;<ÜŸZç‡Lª¤ —î`–|q"#õ*}1Ò³ðy3Å+}og÷– ƒEÍÒa!ËP>(%Ðî´ŒÌÉT©ëˆ/ ê\«ùX¸8ëh_ÐU€Žòt…,ËV7ûú\v™óU^›µ‹Ú¯æÚ`ŸðÛ׬ê€áÄl9s@ŸRÜεÿೡ&,?±á‰º¿‰Ä† `N ¢P¸™Aðé=XžèLúýÅà;9V_ ˆüà.þï7^ŸðŸó7ò}ˆßÛ?^üò}ç§Ûâvø¿”ÿÓ3Ô6b‚’q¡Dp¥°PÀŠøŽ£7ÄàL<$GÕTyµü,F _0G^W iÄc»®ÖÊöUÂrcÔ${°„ &Ò"ªÎ~‡w.Ga¯‚Ja› S]ÌÜ€~.̲‡°\51”R©²…jV4‘ƒæ²‡JÀâTÐé¬WcV`L)0Wâ‚§íiÃ骧îeçôRùz1ëw9eÏήçÍèVÁU“›'óÀwQ*íÓB8¸îØèb>tcõù°72BÒ¢ÑT2X­ ®­œ  äDÖA'„¨»·ÏV8C ‡ÎÄ tà™öîÞq,ðÒMb'8¬‚Eزµ0•@dÃRˆP*%Ó4s« m‰OAALÅv™PÓsÏy_7æà̲ ßG&?ÐøÜZn­ÉPCHËüD|4âåvÁ¾Tš8>Ô}-À¶gu.ÔìzÇ®c^¶.O1/.ŽÈwZTsb°ýX ÎÐE ÷–³@ðmšæ5À’W²ˆA¶hÎa ´&Ðí Ýž¥².d+ë²EØÿpÒ¼½Y#ÚÊÞä€p©‹âBbñœ” 'VÎ\hÖî3õ­T1¡>n+<Š0´MlI§f* 8@59‘n’ÐÊí‡]`€(ãh]/´: ÁPódJIõõjÚ£ü ºœî˜W¸ò;åšTšÙígžÏy]Lh·§99Ì)Ù§Œ…`x±\FQ»Åö‘côN,<°ë¦sáæù½v³­ŒÑ"c<¢P¯›|`?ÆTÏÿVî^h?a!EÜ~•ú>ò â§¡%9>?B/[&&eûnC‹?®9µ©íãýóÒM®*›Âtî¥y ëìT>9"|™; ],T¹À¬‹úz1ý ‡Soe&–°bëTŸwZ—²̃ Ûo!ÅÅÄ *$”)WҮ̚l™-“1H Ç͸ 6è‘Xeq%8RŠSv¢[Ø¡vVû9wòÜCÌ‹”¶v~¯§«CeŽ’ ˆšL`~ÃóµK 4WØ#¼v´÷ÐÃX9<=9høäbØ3K°WX L¢…9  º€¡VNØ‘ÈÂ’–J—­BÑÒ)mBÄDÄécSâf­hPqŠî,6ÚâîÐÝ1³ 1¯ÄrU.K7‰ïfkÝáRÝÚiS,LaЊ$pñô4nÑò!Ú¢¥Š5ÉÀ,X‡õ&¹¦'iœˆ’Ñe€XiL.¥vD‚­ Dû[Ç–îNW÷ntÆýD=>êÈ4vê{é\E`ˆZóx˜&íò9§$i`T/Êý°p” ‹ÙÁw¶×æ%g²¢¬õ»‡½ûk«o–„Îö9Θkµ)ß°ÂwzÕÓî úbÆnxÌŸ’S‚ùñ›Ù­§‰„Üq`«Ü¸4#--­šÎ\‰4áVîïÅ(ëѨ˜&ÙLôÅÿbÍ÷£KuÄhOaf&^ƒoöNëÿk¯Ù^ØÅÜ`U•­½‡'|ø¨îHZ‚•.æ-.~áêkÂ+{Éb)¨Ä"Z·©õ~˜{Û–ÉŒ&z,xÅk»wÉ\Œ)P°LyyûÿßýG·æü;0—IÀuÜ|ø¹27â…orÿêçΫů]ÚàJ˜w/$I1Š=T;†ê°DÅ¥D¤„Vq•UhIY°.Ñ(€  jÐAXVeÇ)½ÞnûH~Éîý©O|— “µBŒãŒ`z " €PS+,RZ}S3é2}p©hl5Rºf"uíÛV«‹oߤ·ë"Vf£¯ŸëA¼ï7«7ø¿‡ð´ÍÛP-8›c”IGxçì¬ë4%ì‚+ßon]†ø£äªür'a˜‚Çï u”3¤Ð–b¤C=’²\âªßL,Cå’ BØe<31h$R°‚Ê£Òj­¢®B ­ë@DJF†AŠH‡NÉŽ!„„†´ëNhP¬“Õ8“h@d3¹«¡¾Ëñ›¾Oö¹â?}ðrçágŸÿ_ƒÿ—)W`“U‰e& £•m^ýùßNk.ŽóaåeK‹Ó¥°|…XŠ"Bd™–’f6¸›™¥6 1gtõd,RÀWé:¡£·N‚£‘I5Wjt– ÒÒ}„RÖÀ—üpxÜbO=º†›÷ªÄV|ÊÐ,-u‹H¡XȨ…Ð|µˆ„€ I·é¡0aL4ŽQãÁgÇÏÿÔûߟ~ÿkýïFz%ª*Ñò Í]yÈÿü“EŒp¥Ñÿfô¸æÄkÊD”1ò?Œ•V<.ŸO‹ï©2hUôÒJ¦A¤Å„€¤•%8´™—¥†6Û‡@Fh‚)‹€nÁ°ms6•¢`,à-‰¥sÀÆÐyÑöF‡ƒ†²W¨,È%Èb“‹ @±e'‘¢‰%— 9M2Å×fl^ÇæÆ‘¥ÄæfËÖ{Ÿÿ Ÿ˜:8¯syî%ºÂî{ñŸqƒLhÃø>D}O9ØÀ|MµGýUÁšÑR$p ÝH­¾_GÇ0–ˆáèAWæ¦Q<¦C &î“€ '—àá‚uYÖØ§JßB­ÀTènôõÿá„~ÿI½è¡HlìÛ‹þð}õMèdÚòŸ¤‘´@‘Üvº·/_{è‡Hvû’{¿tnFçgtM˜¾zÖ€§…šÛž‡ÖåŽwB?Ä<¯·GÔn›Y~˜Þ+aAQ–Ã}Ø›¬¬€kLGZ¤îHƒ(|€”èÍz2Bf ÷EzÓH4½Èè™ìq¨dªhœ„2#Sl¶'?Õ_5ûw9ü¡ /ê•!Ü0^È:SçÈr‘Så(¤E gÉŠ‘Y†êº˜)[WÍB™ó™YK·A/à¦n’øÃVêu¡öD:Õ@Ùu‹/Ý—¯?ÿõ|¸gÿd~ ³Á·¯Fƒ·éõµ_pûý†Ÿ«±¾´R™–1AéuÜÇË`uñ¹»'ä 2T2 \F&yúxß÷MÉÓ{²À¤kËóøÃßýëÕ«øðgöûðû·>w÷ïOÛËþÛ÷¿ÿO5щvÜø«¿¾úå‰iÿBÿbt¥øõÛ•6< 1y`g‰@…l‡M¢P‰¨¡€ïlk æ|Ö^šûã¬ÊÖ3RáÚ$·t˦ãÖhm-ä£+‘Ém šö$XeE.hí¨þ´ÛÞcIëV ¨%ÔU2‚Aâøó¸³C²5u¶G½ú6_îUÖfÕÕ9µssí“úÎ л6"ÜêS¸ÄÂf•”Ä«³‡ª`À"U;á Vp ‚¥QÉx¦’N-†Kfº´o¯ôPuZ¸Ð~µ‡¡A“2mO‡9”QtP½©N[Wo}¼3ÑéŸ8ÇîoïÓ69=åõ¥4ŽÊ* p‹ëÂa™½kSÍötœU!炲6ÜA¥ÇPö!Þ §*Á.rÕhö‡8?ªüI&°¥ÕVê”3ÄöÙ‰¬N†=ÃõÇ}wý {n1‹ÒG~= ·:µom2²ÙVH«ÅRKÚ,rÓä ѶVGãH ‚‚Â.­Pp†LÛ—öå¦ÔÀ4éå±&6ã†wáTn&ëN0†\`±‘<㢶jIá “ €×’ Æ'nÈjì3¶g½PNÔR›­íî¤@|?ãq ü5Ö\•¶'rSIåÒ«=ÒT£³ad@[œ.<1Ç.D%£ÔðŠU D#HJ¯¼Þr.*åõþRõ§?JUsƒ–0¨Â`@oL¬i¤Ë_?Ú¿—o' õެ5¤:¤9+êš×)SÓ亦…Ê,[ÜÆ‡Þ«¬LÞXMݹm‚EB7MhëÉ.Ô+EÑS Pƒe [WëtÈÊhà·ÇÚ¶­¯Çuü¡>-] U‘Œ@‡‘Ô£œørŸíàxÉeaêïr¨ëf‰ `Õ!‚HÂv„d‚tÁ‚DÂtÀb´Ý ”P@:ãèÞ¢†FÙ‘‘6joE¢4С`4lÏIuÌó<£çz÷ Þ(sªï,—&š™2]49»$x:Å"¸al_¬´%<¢‰Ž¤X…ÌGQ ‰­)‡Õ.Zùå"s¡W{÷ruÇöÆ»6hœr^ðÜ3B"]søÉ37—×-æ13øš’SeÅ\Vk©ŽF)w*|EèÇ@ŸØüßïj4R>¾žó­«o\¿öz ]4ú1 …:_©’®¹öX X A¯Ö…Ãyc…ž U1T”­ƒÊžyK¥3:M TK– # ¬Nà]ޤbX¹Œ›Pˆ’ex«{*9‰íª-`……Ýx3¯»þjÝ~M´Ç&'¸îü¥BfþC6ÉU’;¿¤¿79›Žp¯SŸIe&±ñ8K®GŸ¯Ž ý"u@KPfI" 8Š Ki@UHR©†„(P"$€bö„t í@¥¾wÀr(Åzãº*ç;=Qx»î`%YáûÄŽ•sÝFöÕçÖØ9 ýlõ¦ˆa¥ÉèFÇ2KÓà-R9j UѼ²L@ºµ[wH>Ð! ` ˆ6¥U|{ò—šb(¶[4¯Oc¯°:Ã¥¦ã<tb?W¢jäp3ÓR°B‚eœ1ƒ 1È€‘‰‚Ô8„ {ë•z¥¦_ÉJ¢<†yô’‹m}újeaáöWhŸ?}}Û/`ªR˜bã"ŠzrKüÎ=$¦1Ø$?ÇûžøC¸ÐAƒåa]Â0m¡cIgÀ:Õ¼™ƒÁc³!'ðÒDˆ  z/òæüÊO¹ ë¯+AdÁÔ« hû/ü¯ž©NVLêãbA Õ«ZJ¶hªÕÐ&X3ÚÕq $aÉ+á…©â‚,`@JºÁhxåðàЭ‹ñqVê~Ì'¬^îwL{iuߊæ°Á4­h:ÏDŽtŒì±ÒÑ ë+<Ų‚ïÔ°ŽfËoè² ¬]«£Ú.ù`áMï›—7!¾¦»î.<Â~[ü¶Í(£Ž´–›O½Ðs™TKÖ„…Æd9BJÏX8Zá¾=¿+÷ò âA[mV¸ÔxÜv€’€¸­/¨Éº îgU³v&õ˜“m!@o¦]¯B…§>6„ë œµ(+x—ÌØO‚»á[ ˜;á£J?‘¾ÙÄÓ4¹]'v͆›à¯û“Ó@A0t•9œlî] 3’õ~C@Ñÿa?®¥_Ÿ hÙÌ©q5¨¦g¤!Meö¿¥õ×LëlKÚå3´%h+×Ì΂§½ õ#›”'q«©âtPE1Ì·Ó¹N¼J:¹[ÚhgOrºøÍŸ=ç§F{öÐ×Õóz‰Gq% j-@³$×ÊV§3ëùý1ÜÛ7÷¹ÃOî?¼¹&ûùt’£*”€uÍ*Ýt PA˜1ð@¢¨4é Biø @žÏlt¼÷ö(N'DôÛ²î&½ó‚ŸÕöµû»Ììd¾Cç´"d*aR.ÄA‡‰…fýð¿˜ß³ô{ˆ×U׸‚5ß?ß½'C¬FRPc¬YšOð1ˆ=ûÁ@ €¢¢.Œ,¡˜ÃpòÙÍ÷ü|¾á.ÑœOâ›QÂA(¢Ö„`]ßgólGjg/uc­¸ãþšõ-¾¸0k¦f€â€>E³ƒH©ô8Š¢U_]±TSÛ%q(¢a™+¤°%2vÑ.iäýü¿<ÿÄûuýßÍßÄK\äZ4ö¥ÙûéûÚñëµò§ß´~ ãEJ™ ˆŒü×D}¨{%§ ñGY•kMjF^îݶ‘£M]ãV󵜖`P|‚ äˆ u“,ÙĤDBÌ®‹.H0À H`ªî6謫üM„tL0–C¢‹’Ùr&*È£'+£p¸Ò`û-¤…og–Ñ%£’fT é°¥Ÿ"$ÁËr®QÁôX^–mýô#|è‚tfðr©ÊŽÚ@yn5}"ÅGÌ `”âÓíëUßþ¿÷2¾Ì”©ÀŠƒh]Nf~ì{LnÛ >ê¡ À¦+¹Û=ú!ò~B]K~ÌåÉüÅì[ Ô2VêØÛ³žÏƦFÓæ]={°2ÕQž¥mÝzjÚ àlgû†ZTpW7wí]d¥?¬&xBzDC'nd#80*·zݛלI_<éÿÁ?ßœe¬Ýý`îLùkåÑKëÀí3ÝÝåSŸæ¯nCçpkã8™ýÜVÓÏüà܇ý}ío^ÿQü½_üßÿ¾î¿}wþÏ7ý­÷6üpðŸ´õÿ¨éRr„zC°|É,c”<· ȈƒÈ@%(Á±$ù§xŽKËñÞ yŽë]Ì¡mŽ8¶® 5\u=¹´ö~HŒ0¦€™K01ÄÐÅHÜÐ,Vóxžä|âÍöô®ëüЭË+½¬!ê›Ã#TM^É=¸mºF‹»fÒ¢1ÒKh-Áv/œŒÎ­ŠeÛÒ ™Ô?kä2¥™÷@3OÒ!¿äÐ)Sâ4¨fŠ~®Ÿ[cý£žÌ“% ÑGË[<(våü£É®o´xĨÝÙ‹R=æª]¡+¢Bbg5ZÄ>õv=RHFMÙBИm—AHŒ¿XMÔ0¾S'ÙÀ¡'v0Oà˜FmK²„ÞVð®nwN0ÐTÉhp'ȤÓ;Ž›öÉÍòÏ)ÿhêô=ovB¡/qï‰9°ÄÖ˜”ªã4Go´J©Mz :ÙÀ»¾†ûJÔ€`¦ò.ø¸:½ã®‚¢ô¨ô¨,~L÷Ç ¸úáZü^àG¦I˜Öö^5d Ç@õx;fÏæùè1hÀ™ ²‘`­hˆ8­s­$I·ÀØx¤êAÑÀ5Á ØI:Æ`Ú ›l†ýBeîÎx¡µ¨¼ d@ ÌTX3긑‹…Út´ “ÐÈfÃ:IŸ]!R|Þ¡;³±­2ê‡ÎÑéj”R£J࣒xÞà•^iØ£%É”«ì¨Zá…PRˆ]ÂØ¨^eÍ[锕UHm%R{%&\)2>Cé ¿ý\‡—”©ËqMÉó쀼¡ùkU‰dVóVPAÇ€É2^;À )©‚%:Ó{Zµ¸øË:ý¡ŒåÆáí¡ÐÊ Ù†  ú*@Ǫ@î(zªœ(€ãÑGríMÇ Ôѳլ²z?×—rSöü‘©q¦ûq¥æéûý¬ ®Ù,Ô·à®Da ÷1¨Ç¡*Ðe•RcÓ¼·2¨"i±0©bVd]CüŽ®!U I§0Ú#‘™â‡‚F¢d¼2×r eat¢B¸Ÿ ,[¦v¸ä=Ú>´ã/[Öjã"ZzŒs™&p(ÁQë˜dÒ¿"µK•ƒíUJcî~kS}SæÌç\’¦Žœ2ãóÝñþlÆM‘V•D6ʼ-(ÉŸb홯eí šs«º^¯»ú-Keê“"Ò¡˜úaß'³û¥¬_»ù*ÆóÔgÜÞ¦?Ð[xþå­én>*h8æÑDI×@!$(ÑXÀêhê­6‘«"PS³¶hƒŠ£cÝX»*`eTè.¬„b£ÛÇ¿ñÆ'~泂}S6×w%p°¶¥\µ±LõcuÓ1=¸/{áK`‘½Mϯê0ýäé•ůë5JþY£ÇYHšŽÙ$æv&g9Ç3\§þòOŠ`¶Qy1Øê4D‰*±etT&?Å¿"G/ý‚B-.ÇKäK Êaç$„OÔ¾ƒqPUà°‡m·æjw ]QNÈÛÒ®©B/'wï™vüÔú¡ºUëåaP|iVÇð¢šæaeŸmÿ1(Œe5âÑY6À ´]ÉQ…PÑÓ)›4Ý2ëzm=IwnÊE&bÉÀ« ýk¥[ïB´;¬›ë+¼5„I®úš •I;ˆ4E4*Q–ŽÔ#ÔÏSÂ#¾2ÑÔùÜzçªZý Z$‹A¶Ÿ2oJ"ÍØ‘–NðWÜoÐçúÇ•w|¡YüKúŸº9 0Ÿt_ÿ¾®òèKiN=‰*$ñt2G›ñ´ö@_I  ëæ`u- ö5Urwq±«[Â(Ã{e"#¦ŽNš|V<À—¥^šv°>~ññK-³™W¤€I ˆBW]MívíCúwüF•¶¶ÐX¦jxöOñ=ù8}˜ùzžhNi}4(…¼›éI :FØxœ0ÖíÚêû$JxTs¼ÇHŽt.¸’Åwµ·#ðSD£EÓYsôåN“mœÄÅ %‡¢ë7øø c ydº­É^²7Qê€v¨‘©@ê ÈS}5TÛÝîÈ“I n%-2 Û‡HÑØ„¶T…;î ¡]*©ãº»>üáä1Î͸#Ð7-JAµ¢d” íøhÐìóüù B&HÄ@ÙºfîÜ}>º¯{Ý̧ãñ)W˜oñ óž@“§´<È ä}R.Ô.—J­Ê‡³]6È#±Ãì³­jƒ²iä±$]qV¾•ê°¯ ŠhÞ6–òeÏN¬£6w‚ÖDüã¬É@–¾ºZ߸”ùiÕ «@ЊFI‹¹Çpç•ñŸÏàk-#x΢ž°š±ÁñÂkL£-„R“á’hm‡ñ'­·EWŸ–‡|ô×ö Läz÷´ºâGâE@+c‘BlúÄåì_dçïêÞßîŧ~êG^*¬Ï:´«ÖJ«³ÃŒTz·¿\¼ü^•7ß½‰Î§öždë´:Ö¯“qrÔW“l¯¦¢žìÊtÕ|´½{ô­j¼åW÷ ñ>õ³šNCH‰µ[ày‘ýANÃÖOÚ¯òÛÔ¬–å×ß¹°ð¾ï÷9‡ê«Íò´'ÜÐ7{7jztþ#9ñ#¶ ú{Lýìn‘’ªXP#vê Z³Bp]´ `‘ºJÊí¨$bEPÂN1Zê@…Ñ/SäȧĻp!äçpÒ" 6* *²–5T," ­¨˜k‹´Ðã=Å.¶H÷FàBZ©i'xb'(p\ƽì_šý5o–;ã_!«i‘µ@i6Âä{½.u+c‹² LÖ,qßÒn[ÃÈ4»{Oyc)« ­A—ÑS$‘A ÂÕœAÑHf H±0Òª H©FÁvZhm‡V%•Uoë 2Ä¡BhP¯PC¦1@*IÀI6ÙÜ_þååŸþýúW|7oŠá¨UËEݾíˆc.š“ï÷#ÃwÏí¡ŠPL¿„Owñ©&Àîú|>s*ÇÊmXObÞ\îaf3‰#Š ‰Ž˜¹sˆÓ›{ÇŒÕU–Ñl a’ÚÜëxx¯7äÄÏ÷onþMØë§GÜÛjX °”§p K%ÔO¾Ï¿üá¿~þéÞ;¿öýßçx0~ÿ¸ÿ¼í®í÷ßï#5¾ö a½TXPC^B4•a­/JÊA·Ä•Ô""çfŸÆywF §G‹©—JÏÞ¼÷Çùýó÷ûù#º¤_xkþB¹üçéæþÇßãþh“ýÞöލ‚ Òä¿æÀ["© ÊËM¬‰˜_ƒJ- á "¯Ô_ú‹y#—9ÂŒH‘êÂ’Ä@…€ggŠ`É ‘;ÒÊ*—í R0€0а·$}áaCÎnÂ`»¿ ¼áÁëüŠ À¦<$‚™Á¢$º6‡S¦¸ˆ 1Ê0ÑBb-7`w/a+J’¯ 0U‰®2—&…Ömü ×v’!GáNáúB¿üë6¿#'öÁ1I­Aq0J€¯À T’8`áw¢tp¬©¥‹9ǸÛüJ% Æ"vQ'¹àº_ô!¤!U;:Æfs‚BWb"‰íÕ¦Zû¾|¿»àÆáî‡÷HI<²Ì'v@‰­Â¿%ØÁHèáà»`bECÇàã¸y¼oéžç·ïýéÝ+4Žç.õg§Qsò°ÇËéUÙ´Äî‘£Ž]ñž0I0ë¸üx×^O£[ÛQÃ`Ï´b¯˜^Ó:‘óªéêút*îŽ4$Û"ÿêa3çáöÞ„e«ô£Ž»ño¹^¯¨š©;v¤1Üôjõj ÆÄ8ûR¶@Ö³x¢ÖP‹Ãóû€ýå÷;Ê¢YÚ ƒ›„qÕ ˜z‡î‹$ê_u/;²a¢…>ÛyýÕ3}¿÷÷?1/Ë| å9å½uôðç'®Ô*NÕ¿VæØj|íw‹5ûÂå×M­…zÞxÈ­xâ÷Ë SÅ*ðuý#L6äé½Y1^íïp¶Ýï®ìé®ÎÉ>âŽï~4>¾ÑßøÏÁ«­60­qfÚ¡@zR0¦É²Ó}vn*E€ˆ@@¡ ²"ZøÀ  ¡TY26˜àyÖk‹Ï’wd˜ìÕ¡džvЮÃUö¾Ñ•>WÈ%ËHÖMjÏ óAºÈY™ŠFžJ(;ìxvœ}réü‚¶=Ït*÷%½Œi=DqÊi}͹VþŠÅJ®ìŸÖ½º|¹ c£PåÞòK¹p™~±d¦¸„´ó°dÌU£#+B”è2aÞ¢mÞÔ×T¿ÌpáTÒ¶*´»•+ß­Þøç躽˜/÷¬öáñ>.ïû´ŸÁ%©fšBPÑ‚˜˜3 h¤á» l8h—D¡ö€'[F(Q9ØâØÉÎ~Ãó}^úáîvÍ(!–›xköýz9u‰¼ËÑ6NF‡“½I5cy!Ú‘‘ÓÌ;è̃ëü£çº ]2̘êNðd|YOìxž6NS1¯ó#âͼ5̇¹+÷²jÄr³–oÐj6Dþ:ͬ/Õ`+À 6©é™¯Nw$é&$K5ÙÀ:¥‹0ã½¾’”¤åÒNèÌ¢ìV~ Š€p5Êĉ¯ÆÕ‹j¢R}Ð0Þ /ìÐ+9c\X¥"ªJ£6 • €°òS.ÚV¦ã FwŽ b€OšVÙGô D$0»ÆÙ ä²ò¢mù}ØRV' Ûá`.­–€eˆ l¤Xu¥†PtàC!†ˆ¦ÒY,Ë/£ A@bŸ[°<ÁŒqí©ß.µÎfö~ýÂóÙkúº ½èÆZ#¡h®Gm5€Ší´ñ æu%#{TQ×”ÚF¶£R¿éÉYà]Š8»C/^ÏmcCè)çåB„TÅÇpSÑ1Ýk Išë¢ha „¬B³”.‹‚ºTµ—Yј¶ó¡Ö[hM7uîwÈ÷{3»óÕé†FFSÓ^ñ.(ÄTÌBYüÅ#æ=—<JDMÐ ø,/Æ‹˜ÇàKC?És(î§´GÕ[£©¡‰˜!¥)¥fÁ!KPèYç”Y)÷`“…D§Q‹Šµ_yÑè—y­s>djtÀóN 8c |* ÅœÓü°çh@+ñ³HãyLmËЫ<`}(ûè“[€Ë‹Š8-Ã#é½)÷‘žK•ïþ+ëG´ñS„µmÒM«or,ô¤ì4 å¼=F1Ut fA}¦º#¦ÚŠ‹dAs:€×ú•)PçB¬újÂGåÂaªÃÒ½hïÔ›°E‡ù"Ï×7¢É»=d0¢ ÷¹«f×åÄEjäÊT‚DÜ]±PaúÆÍI¶øÏÝ [oŸ”ú^•·o ÀgìmøÞ«¸©+ju£Þç½ëZ•üš‰øžuê–pRnöÞ\ÿ¡·ëè3úÏZ}ü@EnRO®ˆ×<«ê‹˜ö2>úýïÀãsG^(”*GÈZÚ"Ìé¤uJÀZ hQùÅ%BaT©¼"F²Ürf´%•ë5AEâ¬-ëZîv@@é’°Y£HLSýîyþx9û§ö.¶]Þa’vÖFtð’ðéå`â:Aîò¬ZÛ˜Pjв= § ÕŲLH°Å1oÆ6¢+º‹›¯œÆ‹»Ÿ8È% Á2-Va–tÉüO2[¢iÊ箞Ð’¥™ XΉÄ@]`NÁhL19ÓZ…tUj X{×ð¶ÎHǬ BD5v‚®¦öªé"ÊCi¢üJç»ãÆA¤ÐÇøèÞâ@¿´ßß„OlmUoîvü77_t(5føà¨IÀ-¶H1©$®.Ì \©ø+ÕÉÔØ#DO–Ÿ8¥R‚R†º ê z]Äì|)·‘nÓ0uRŽ¥.O$ʈ®³e¦¢âð…ñtÜ)OÅXŠÍs¡·ÿ¤¿ø¬Œµ,«gýš|®`ˆ­šQ~Ïo—÷ì:uƒo"]*ÒAyzójûÅ–u î M!"±™R×jݸ³&õ]Þ&Ïô×q?­ÍP,BNºÈƒ2Y¥Âç\]rKOÜ>ë¾ÖenH”%H¦€‘MV:ƒ\A/U™Pš}MK»êZ#&˜ >.82d°ÛoÑ=“EÕXª’úÖ­Ï1Ý 7•’ÌÀª8S>þ³óõ21+y¢ ´<É™Ãú:Љv]Ïj†eÚKé ÖÆ0Àý1µúj~8ÞJþD}½Ÿ§ÀÞvP¹Ž"šm¸[Q.l‰=éT٧άËÇÑÈœÔÅüÂÈÀöçœS›#ÍeYõp?,.*•füX? õrrš~dð6‡x•<OõÌìè}3×ÛtƒÇÝL¿êS¬²[²%‚µUõJvÃ>1Ï ÿhŸçðK›G—§ábŸlÞ`/-Nú/™afÅ®òÌè9:=TL!%Ö‘…ÛÔƒÑ\¹ !ä1 ¥^!¯cîßäüº´‹Ê•·®X…à”.º¦JXÆbÌ ¤taŒÄzÄÈŽ<‘;!Èj¨¨6[ öÕ„D­j I­Fù5®­\œ% ÄhɶÔ1bDCU8X†oÑ…þÙr»#÷ä—ùñækõnÓ;±š.¤¨§’r(p7v÷‚É–:³Ê܃°ù¶~O-EâPk £BvÈ J´¶ ꤎ[‘Ö°·a¤­‹äò»`”ùe$0Hb‚¤  —Y*mDP&ª²ëßæ_ªÔ1 wHœ;QP(Qt¿Ù›ç²öù ~6þýöçGý¾v¾wtÆ5ˆ˜SÎÉ‚ì‘]Xô^Ð2½‚ Øöfúu…7yrû/nf2”ß3¼s'—, ŒWïÎ{—Ü=nÞ)H¦ÀØ -¸ï‚ÈŠ ÈÀªš—]Ï£§ã›·üþ8z›B¤9þ9iSæx) Pî¾]zþ­=ÿà¯ïŸùüÀ~ü²ã‡¾ÿ?ލáJZ‚düГũµŽ•‰ ÌH$Ä ˜0[ÚXBÍÙ!,ÍuóhH—jþ¥?æöûË #=éûÁÿN ²³õ¯;K~¾Ýéîfiá.¨e0P¦@ ‹ ÿ¼’ XtEWè¥æ‘GºYt ¨ÆÄ« ?–0Ä)—~RAañ)"L*@®¼DÎͨ¢Ô<œÍR+lŽQ6¾ÇÎ8àÌŽ­wEøE`Á–Ï‹>æbb±ð¡1@yæ·Ú ³£À( 5$Ì#J—×R¢´–âŠ5#ÀL5ËŠW*›fÚ˜KùQýV`…ÅÓQ $Õ”ÐÃk;Df’hÁCàDnº©Ÿ1Ö€J*bMJ\lÉ@ ^ å%(á:¾Í E$…oÄ`F&€„b÷=QVOß2ÉmÅâgŽ™Émdydxs¤î²uïC…Xá„8ÀE°D\àR½`œöåÑ™¶†¨øÉ´ødó‹°À˜85ÑhdãQª¦Æý}G9”ùdÏ6bjª#¤Ëše˜X`ËòÚ¡·k7maq¯R¤ÎóÎó±UŠóËÖ±0—¨Hjµ?ÆÀøÆ“¹)7™Åy¬÷¹8öŽ¬í¸›—\Þ_ÊpV²cnÁ!ŰíÆÙµ%Ž|Qq®Ðv;NþqNvÅ+G6M7ÜkšnË}d_qdçz³|¨Ú[2%çìw52S1Œ…¹€ ”Rµô@éöe0ƒƒÇQkEj×Ìa¹W¨¶Cë0{3{qäPƳÞñû[I3×?ëÏ„ë19_$†($_®vûRžæx Ç]ÔÝKšÀ³™ëÓÜ/Ø¿Õ±ß ÈPŠcD×5¸¹üþ~<(ÊÇ‘ÿbS²Te{oÖЕÙë÷±ŠÖÆ7^ÿý§ïÿÿ‹ù¹ÛïØL 6´€Pð:¸G1HiA&‹â¢€ @‰€@dبžVM ð}@¦ôÈàEŽNL–¢ªãˆS %=Ám0N«l­'«Ocìö¥õëlÂK†9ÒN ’B2…¨J5CgN%iÈ™J#­8ÑÉN½Ÿú»v^&"ÏÇ|ó+.üÚ¬sÛ¾-ò|‚©RñO¬-þÇÝ)°šHA¶)wtc PQCKK*™XóN,Ú E‰îÀºD7 -¥ú­L¯ûxtܺ2a“ò ±(p¢ûª¾©(˜ÅúÞõ‚Ï Jö÷G´b® Éõÿë?âË÷•á>¾3VYÑ+ª  Fì˽YîZ•öƒº¸²”žoÜýv¢²+å°cªt›>™çÕÿê£týêó5yÃÞôXï‚9“_ùþgíf8V0™h¾nwÀ¼- 5(”¹ñ裈_ä׫ˆ+éøIŽØi… ù‚3ÛL”½>º¶}n}:VÃ’¤BV3Wz»¡Jdb¦[nœW„zà\üï6Ñiœ^†ÓS&†">«¶~ƒsXn÷»SÚÕûÓã^ó,£-h Ue#Öó`š}J®¨6ì©Á"ô…0.ž¢*æ0aÚ X€Ó&É£Š\L†›7Vî(¿Z423”xKÍžÏ=}C»©¦Ýª,Ë>@oº†nÏ$,ªû˜ç®½ db`wäüõå/»–uzQî>¾ë¨Z3$¸ôjWø¨ÿ6¿xT=ìýúÇ¿_ü¼ŸWÚÉ"{ªFyœuÖfÖ³4kù+þˆþØÎ¥~{ëjDÖ¾šÑÏ_R_ÀÕ.¶Þ]=|öp&´…ÃÙê–¢ð@b CpÑ–¶lzXHcµF\”„BùPŠz¤wÕÀ& µV–ØSöYŠIÓíCÚ¾qo1Ò\9!þq®Ü’]+qXiÖ­%W×бÕqàËihdLÐ4èôÔp Hlq%î)DbOëƒê.Ü+L=€oD2ˆ¥åÃi¥ÚSÛ{ä3Ĉ‚TL9(²¹¡øSŽd„®•Tôz„žÒšˆ {ª5 ²4 I4uTIlP­Ò®£pâ”÷Nï—²¶F¶¥‰ñ9Ûfãéxêa»¦sb_ò¦üõÌFü^rúGÿM^,‹Hâ•1V }Ak3˜ …‘L°,ÈŠÜRB¼za‚ <‚J/³â©c[É&Õ ’R”å«]&ž½" ¾à &go'‡(òÍ¡X3*‡Rˆaܾ9H“F‚¨Ô÷z_Ë`f©G¬VÎ[¸D ’ Æøß™çJ½w­P êž:í+š œÔ`R µe·O´’»gm„>Ç—7᣹ëP¨$Å)«(ÀÝn4lY3òÄ躒j>Ð/k‰<¾·]}N 9¢ZȱÊ:¯+:&f6€Î¨ó¥yÇ ‘¯e{ªDèa;~:¨‚i´qÉM8=ðöÚÂU†îp'ψœ)KIE.†ûAAŸ¤•îM÷üüH=Éó+‚ì„°Â&Ôöêq™QGh°Ðžk»°?Þà ¨m@ìRÒ>¹Ï È2Ú»p|–-Wr-iþ—öÿÊÿï•ñŒþ ó·ŠÉÀ_f»<é¹\‹B60ÒP‰:K —m–5@–cÁ¤oºúf°zÁHàšée7{þj÷2 VKÎÒ&Ìkme –6b˜2Ï;å¼®BgBw—ò®pÚš­hLæ^Å/gußõ›éX“Õ æûàdð¶|/ÞoÛ ¤QR·X_`n|L™Xfí³Î_‹°Ò¼ÏžØ–â¿*õo}õ<ù’NüK’ÓØ¹çp¡‡ÎrGò Gd|‹ªÊêí»£èÜzëÙVéJ´é–òâ«Ý×±ëäµ–seäÍ~'\vEÖX„3A°éëÇÀ¢Ê”[Æ£²\ð¤{®²dƒ4|Ç£¼Î#ù„!$>ãx®H7E Ö¬\¼Åšk—ª02yçµb¾Sƒ}Ìó¨ä]ZÓ¨h§„c-,DP k¨4V ±ÆŠR5S'XåT #ѹz¦}f¦ K#°F…mq•*µ¶šñiFD‡@¸GŸRoõÇ+ 1ÒÚU©‹Á*»Óůøyºøíñûé•Ôžá ÁÐ@ð˜EƒÊ.Hß7C¸/A*+`Ý·£Ê‹Dï ¾ÂˆŠbbåP¼m’ fl,BQU_2E„+¤U ª€†ÈR@ TèHgî›í¤ÒTAÔµ\ œ3²üoÈ_Ùp©7Ùk©Ð’HwÈ)¦5­!A˵“9 þu¿vNè€Üûþûãû³ùYøáÎá}Ö²t‘ ú¼À­‘H€c@´@4€@CbA F;½±ñ{…¨N0 µA°‘  á¸ðšLBX<…ÈKh.LfÞ,%©>æéò‹c)•Úa(AëÅ€ *ÎO%5ß‘m5úKsÁ®Ëœ­-óˆ‚jŸƒl›Ïd¸ÀYn`ØVbÌ˯ŸuÕ+¨î•ú<ƒ ¸‰¤C÷pBþl!íŒ:î¾:Ì¡›*Á±aÚ¹µP˜6.‚.")\ÔXÒùÓÞ¾Iûót|„?AûœRJéð¶£SP´'äIÚ†XõºÎïÎÞóÎÚn}ïrÕ¢ÕAûŠ0 cYC—ÎuÝ9_bz”yÿüü£>U¯ñÀ£àÄYÛ–hjHPRU Ô¢)ÖñÿôC[Çïpæ™sÇàÄì°´pÓuY»ƒ$¶ò.ŽU6Ç«iQQèÙˆà*Ö*ÏJ~•s>wN îγigꤰ܉JX‚/ÅöFe‚~shzù€("ˆ²Éùgw=BMåY¿ØÏgû½åöj¶Úé_q{ºú ϸ–'÷íz“µPŒÄ·*¿@‰E°èöZù…ŒÐ€…÷–2$Áê6ËÚ¾u._¼W LMEÀ玕þ>>¿8¿kÛX²8²/û‚æH¢Á)!ZÇ0¨8ý½~ €†‘É <,–PCB@ÒåOn5cn£R5ÄŘ„ Ÿ«,*ÃØäé@ˆ2sAÏÊX^b­yÝ"avP ”¬$|°1M)Å‚ï †ö‘§Ïÿx‚€-¹ QP«‰[1Ûò”êrí¹ùü8¹ë¯ŒËï}ý$YßÙz¾ºï§ËõîÎÃÏÀ ‰HDê¥. ¥2b( ’²n[ U‹¹¦¾Ï |¹!-d‡mÐ/Dζ êY¼êf‹H\b0Ð"ƒ1ÀÍ)ÈšÑB¼¢°P|Çé×ûFÒ@5{–ªŽm†ØmøUW¸ãÕDÈ›*D+4‹© °ÄN BÒ"¥¬›÷ïy»êù®èÍëEž©ÛMhËhŒ3íc²aˆN1Ä€¸íáý3]Hÿ 4¥ˆ†l_”_÷D¶jMµ¢jã„0¡ã²ˆÑnÑ̆lˆpµ,=ຑCnÂ_t‹kx®VÁ¹úcö¿sÔûj ×°ÂŽkü{Ë+ê“Ð3É­¹O7¨Ï^¦Í´‡¾P’VJ–Qh…ÃA>x£Éï\ŒàF˜çÀã ðh9a"ˆA€„û µ¼°—R/Á{1™;a€[ùû™ 2º@¾ÄIÍ\B°(î€+ÔV œž…ÜÞ¾õ8H$-cÉ“(rŽ{s|rê㜬[sþÁ,¼Ž/¥ïÖhÐQ‡PvË5D³ê lœfëþ= ò&]*GE$¸(gºXÑUd‡K<èprò=óÙ‚%rº~¹€5—¶ ]ï¿­Ïg»-høRŠJúÞä x€jW{X’!:9•¼”QêO­×‡ýQ5P™ ùuj>M½ö_ç‘ÎA,‚B n¨_J½3X£{ OºdYïf‹Œ»î\\ß(Šq-[v“RÙäÀz@UMÃa1Q,ÚÔÑY5qít°ÆÊ(úÓ^âWúô)ÀÏ+yÍצÆ1-/̹snÂ-(½H ¶b«Iåô€ÅR¢…µÕ±Žµ,R4ƒ$ŠÕÒI¥5º4cZ¡HÓÞvÌ\Ö0@Ðæ¾ïßÙ>ÑŸó{ðÞ |þý?ö×ü~ßýùÇ•þýÌÊîŽÞw€êEr÷‹oŒ,¢¨¥K3)R¨Á¸²9w‚Œ÷ØÔδ­Ã‹%ËAžŠÛÓ\Ð#” $ð4€AÝ:4ŽD@ñ¿˜¤åßÙûÌ?ìzð~÷ÕKë×ÿ~¼àOò{Q…-´[`K:&€€F@+²2b‚ f…*°2‘ŠxL}îj2v@­ ZC%ªGgéVê$# ”Ûœö’“(ghÿŒ¥ ßt³LpGé –£¼˜‰âŠAm0¦“*ØRÁ,§l!a/XÞ¹o¯ ëꈇÆn#f0š~Ÿã&T$—*‚ EXRßâ-pXKîÈÛ°@£ö¤k6¼¬XÊ_T¨¦!ZÌþ^–ÐÑÖò¸šÿ¬X%ƤFÚÖ“J¾"0Œ áx¯À$.ë+ر¿ÔÄÅAZgkŽÔ³Z]Å‹gàHjÚï„Ôîá ÛƒÞ©{PE‰êkQ€mœüÞúo»?zßäOݺ•ocþå‚â„ïLÎøzÝÏÅÙiurß*:ÓZR9.´Pb!1²©PÕhœWbÔ%ºlh9®‹ßèò?#ÕÑì@-…Ϻ;©§Å3ÒOƒ÷tðžhø8–îèþéÑ÷À¼¯ÆãGn™5wuavq(ÞS¸#yDuaÿ±>èäŠe MÙJ"FãȪʆç%˜(ËoULݦ: WõÑñø÷ùFñ)¾'=&láÛÕ7„mÂ=T]¢râ<+S©žÈO@‘ÆX6{¬¨TtÓy9|ÊHwÒ2ÀÓM/Ï0`¾Û *Ü–ä”çàà–íRìâC=HÜïñwØíü<™ëw€cÉW©Ï×~Ça!9ÉÔùßÅãÜ^ÆQEn¥H~%Bþ$ýRŽ ‚¢"01?Ò˜ùõ "Ôï@ܤádÉ>´ïæœO8=Å­NÒÌä+¾DM˜;UšìÚK‚‰̲&*R‘‹%[D†B£\95ýƒât}ÄUe+ëz¸'R« WCà,öO‹R2"ÇpÛ‘y'8ÆhÉQ§b&L†ÀtÌ…5eWðB08‘žö·¸q—·¯v)z¿ì3XKK ñAÏ}ºï©^Ð_XÓrýîüãö'MÏoûÇoyìEÍ@f‚ñÌëb¶•u#ã¦öÕÇà€´. 5ŽqT¬BÀóÐ\Þ]ÙÇaÑ MÒüéÑ †ƒª ª[Ú]ߤ¼¶D{uFÊÕª~AÊëeëûþ¢ynÕ£}]-0Ì»fbV–DÂF…«뉫ê.Ÿzõy¸ê[ýhÔ>¿nØë 9$R'Ñ—ÿóÅ“T¤õ(ļ¿0Fƒ?šü¹¦¿ýÝÑ¥w‰iì¬å-2‚߆N»<Îâ•émP°»Ö·†]4; Êñ†oŸH€lmZiêÕƒò]ÞþÄGþרdµ£R¼yf Va3þ˜Êeµ)+ Îl_Ê¿-­ÎÏÀE–ta7ðto<ØÆž»rnîÏÂ)Ør土myû‹+žà&í(b÷6ëØÓ¾˜—–››’PÂ!‘*ð ‹®p±†30þ}ÇĈá¡„Ú©*Ç41p¥,O™!=âÁ¾‰«h­ï™j”ra a›46±7¡!¿ ¬W´n×Ö¢NÐè…¿B/Õ*€6yÊ3vP ¸±‰Ñwˆ'$’Á¶FPÊZêû…Þ.#2ðÅÔ!‚ìRŒ%⌎4ä‚ÔÞÖêøë½}ï_ן8å|ݡᑋhK¨‰¶‘e‘ä#¥ð$£Õg¢7C±ÖÑäA­`Ù=qku™;ÜÍ¿ê¦ô˜\Ú›–,zÔ'(Z†°¿Pfm·Ú%Z,(×"Õ] TH5*w}ºG¬˜´²§Ð1b˜ßRÂ×ȣ‚'¶JáƒÁ⺯è.‹›vvû¡«Ì®ˆƒh‹ ¬îˆ¸C:hF‰2V6z#¢H°6­A "\²'*RK*cöªâÞ½ýˆçí햊ÜšÒ—RE[êQê>ß>Ã6{ÒÀ ¤69 eŽ„ÖaZ´›ñjõ7·“$FtTZF™TÀÄlñ:^"Ãz58eå™å°ÖÝšÇÓ•ãÈËëó‹6ÜhèÓÑùµÏ]Šes‡DØF&´AèÐÓeiÈVx`ª–ÄNÃU¼sºgj:-Îç9Kv©Í8®1“Ü:‡<\&aËG…‡§~»×7®WØ?d|äãÀ<˜ÔfÕx @¥yD™ÕsÝ™VˆW è:]wÌ1ósçž—M i»&75X’kÛÿ[Ò’úшþäㇼӈ ŒEÑóÒŠÛù~Ë·#¤ž‰‡¨o0Ùó}]ýúGÿîÙ©DŸßkÏÏ%-RNyäUT<P… ë<”›Ü&—â±eN·Q r1 ì wÐ-ü%‹ÖPÈ]*q "Zu “š@…SRû²a­ *‹v£Pa7¤×î÷vÒÒN0 ¡QNzõwªWh@-Ä”ÖJqÐB(µ†jTCBv‚KMp—r°³ŒÖMBÒ º–%*IÐS#u„DÙPNã«æ ªåÅq%©Ì×ø84¦1ZDÞÛ=¸¡Žè.eÁ †«h¼ÂÍD #Kà#°\ª¡š9ƒjÄ—h‹, l nŒ}÷ŸómíŒïcáÖͺŸøB&"»Ü"G£-˰ÏN[ËgSìuyýº~½L& ŒÒ¶Ú %ÒX¡Ö*½Óà`)U‰“ ¹“Mútµ¨û Q! (°˜À!¡7ŸhVû|ŠÏ†P î¼²<Λ?dœõBÈ.)6œüÁà•ge£Õýøûþ“sÿ¹¨.ž1Ι?[Ýùü¸B¯æôçhׇ«=xÚòáÞ;jÀšÐ‹‰Ê™±Ã9lØq»Û¹ w;+Ë“T0¶ly¹Ïk‡ßù$ÏÐýôv³÷{þ }B½Á…" ^a¤Ö¨F¥¤B+d ^£5ªpÝÒÕ/q†™òSi1  iÐæŠ[´™P²9]ñÅDÀ4Ú£çA:iI—EP 03¯T®Ï'²©¢a m(kI‰Ì*¸¬@y} Ö®«[ÆðJkLbóé` fâ!&Ĥµ” ^qV‰¢@ ­¨›i õ™GÒá°”NXŒ›Óº¸ w¡û.¹Ú;½ï8„Ê ÕÝ„ÏÀi*!è«ô7›? GnØùÇ€2nq¬Dc è¹õ’*£éA. n€¡³ Q¶x€Ÿ*ÀðMR¶z&sö×JSóDOò ùYÉè¾nïœü¹^GûºÛøžÆŠò¦è¯¿md'ï Ò !£×P4*_4H Å19 á ––ÈÀ }¸:bw²Z”ÑbRÊKwàfG¤gX"Ë6]ñPçžÌ¦|¦’äœÓ—õþÝãqH0¸ßvj.V¡li£ [h¬ÏÈ„Z%G…qA:$‹·E%XÀðêÌZ‰ú„þ…7éXoÑ]Ç鎄oØ«júsþNÿô­ç|±»$GB ræÐ~¢¨FkÏ«J¿,KI)üŽì3œTʶ™Ðérà :çz¦]#*ëzZá¦äõág;ï[Ka¥ BGáàC” •UFèu(_/`k'ª›µŠc•Ÿ®$]¬ÍàI_#óã•È{¯Ã…Õà®ñu!S÷I@€iFaË]§Ðß</A`z×’3+Ø&i2{L´ïû–y/t÷Ðu^²ôµsp½Ë0¿˜¿ñS2‰I @a(Å ,@I3î@²¢„=ðy­àËp›™ôÙ>¨r@ÐlÝqyÀ9á}c==.Ë1›6•ækŇ;gád8ˆ„™xEC°‘Ó–ø(2œìT_¥U¼¶5ƒš4•ÃÓXÊn¬r"P‘tÒžÑ×ð³¢phø»ß{žI@x>æýÏ»ŸÏ?¯D™a xz JW™ Þ"‚k¦a¢‡pDFð@´tpƒh3ìÊ£Ž©‚¸fpð@”Hér)£rX8mzVo1kyj´l—.»ù&sÞrÞXÞϪ ˆ¿*ȦñéKô[@8„k2¡#2볆Ë| 3RôGLIÁÜvM`·gcÎ 5ÅM’bTSÔbØÀÄc°¹y‰vÛ¶ ¶_•'ÁBUÙ….hI·qn{7X‚lŠCÕ‚éAc€âÎuDV¤ß±5…%èPS’h à •… ½ÊæƒøºðZ·âN{˘–4ø‚—³ºT<å§ÞæÑycÑÞbñòjnÍ+œ²(Á8-ACf—{ZׄÕÅ"š€!‚‘£0Pc[©ÎØ®‰–^*Ç™M¾üë_}쯽÷ë‹zTEÉÜ¢W‰ß[ÔUpZ"/Lj"2Üh6#-TsFli"S(×mL(¾ï~à>,M{t1<½ë–IqDzŽ}kÊa(CÑ']7|k`ËŠíçx‹ƒ ê5SUoØ»“è0bp–—h*æË»Ì6Ù À-âbQº ¬êYwœ F‚øø‚(£ròÞƒ¦ ¤5œ Ipsgƒµ!ÂI"‚µ)a€¬ã9d›&S“‚9žúí¿kþý¤*é’PÀÖð˜Ã±—ÖËðwÝ0Æ–ª‰Qž°+;fmå0\*wÈ7ñÄÖ‘5n¹/®?Øõ„æ âicª´äÚ+)Ì,Î;)åÕ“ÔM–|`䑸}ëÔžÚª;ÒŒ88%m×/Š>ÔùFÇ¥À å±&‘¬yÔ‘_u€‘‹‘bŒ1S ðPÊ% J­XˆÁ‚[¼hm” €RÊøá*ÚŠ0hU]9ÛqDE™… '„ÌÁQ†U×@c(øÈ”$.\â­…ˆïê. ÄBpÅÆDuØ>hú’pì¨FGAÑ×âÐA U«tP¨™Q¬ÎØÒïÊÓÝxJ†žJ·ã˜»¦-ØÌµYx*+»ÇVÚ­-Ü·MPtìÿâŸAJ!Q4Á1®‰†J #–V4ÔªTt”C!¾ÒŸ1û¬Þ´²@Iq•Lj𢱦®U]œc?Ïög–+û"5¦v½z†ÚŽö©ó’èÐăÜñ=÷6OòoÕ·"Ð2\½ç¨OÒp¦øƒþÿõø÷„ßßêÏçéW cGd‘Àf5£(ײØ-}qßêû1´R…´Îš›ëg|o é£(£›¾„sܱ4š™‰dú`!ƒ° •Âh½ðÅŤ„ˆ$„Ñ}jiþcbúø‹õJù:/ΩŸ§—a…Æ¢WTêÚŠ3ñ´Ÿûô’ˆ Ú€*ÉÙ '5á­“e–¬6#†;8ÕÈà &ÐÑQç&åÀ=اƒÝ;WG YÛ ˆ,WëŸS^%\€Ø2ª[ê#GR§R*OŽâ™ ¢×Ž.™ii¥­Ã±s™ÓB÷Ôï)Ç;<€ Ž£…2ÈANò@”X‹w[ *ꊄ`…aA„ZØm·:ÛJý/ýd|Ô©µ»=#û=½ßÝ9¦˜¤Ø7qŒ¸ž‹às”I@ˆîϲ½8U@uÏØv¸°€$z›jÂÛô¡‰j«t1J©.™>õD— ÜàÃj ɆœaätaÙ{¯ÔGþ^+C3Û´A£[U“sLöûcÿ+fÖ~Ÿû]0—¯ü@ÿœÎ棦Ùg4¸"…ЖÏ[ÚûK;(¯¨?Ê…:qëÓ‡gëlüù×ëŸxux­q¹÷{³íÃrŽÈÇò:ãªô難ÌÃþñ¿ðÏßõ·8™@KÞ[dÄ1yüo'ùëA6©Ís§cõï_ï+ÏóMj2Ý­¯Ïk¯ãë‰jnKभ\Mð d“zÔ—Î,]—A³••Ä„¢ *š0Äk!F+¥`ŠT°@g&`ÆT¹„½À0«^²vå‚êdŇ@;ÅË#ÄØ’¢ dB1võéûÇÖg„%Š fk·bŠ %tÕˆ}º³È "% ma%Ö‘µl¾à^7kÐ3´cSÀ½^{ªTi" yô,å#´u€£W¤0Ä% Ã8ZÉB0¶X*»ÁH“QTD™èÂ' {Ä ÙŒŒR¦£â›nРA&ÂA`¡U(¨f±D25Õ“&Ùâ¤Xœšyýë÷×*-ÄÒ n†Þ™" •„V‚(2‚'# yjgfÓîC %"ãÀÓB# 8ªED T „D %DH¨äÌÀD§¡BMD!)&¥îLÃÔÁ€õÀNÞ¯Ù¿êûàŸ¶?—¼éKo…{ßÑoÞ¯ç¹øã—ö_=ý`uôxpËïˆ÷–“ zHˆA_8 ¢ö¯°OæuC¿B…a ¦ÂvSíp,sé|Op /H„ŽÞADÆzä)\"„7zþW÷ÿÿß¼óÍ¥°Ž;—9žù€ƒ{à‚”F€)Á¤àJ),0D $`¥teD¢yÆb,”¢¾qSh]¯®|Õð«@€€Ï%Ö0%Áѯ,’$i*0@Óxõý±8—Î} ªR`$CEÚÒ­õ²™´«m±a,*³ â‰yŽIÐÔ,x‰ò°ÃÜÚ2E‚‡Ÿ‹9A˲´±NM†ëË`ñ‡ÎƒGú=›oâÅüžµ?Ò3µôbØ/šhºÇh$¬È•AüÃà=L[*+p‚ 5Ô€ Ó)7¹M²Â ^YH¿¨Å"˜j© ¶…Ô„±ŽÓ\˜ØKQ1,tE/q,žºI¶/ª-k@íœx }Cuó8?ZÛ»=;ÿÿ-°ø%ùA‚IÆ!M“óâûßÜãcÝ¿à%ï0·ËÛýžM¯³ÔÃÂTÀI€Pä{S…pBС Dk´¤d€LeЉÿs[Çú÷Qí÷gܧ»<"«\õ4aàœm[Ž8Ì aH”Q†;‘è7ŒC $ÉHwc2˜ör²ú\YIõÈ«,Yú° mÝöYÉý`£gâ]1¨Z¦š¢ßT¼ü/¯ÿ>ó yÃÁx8]øš²„ûJÛº# `j0ÚJ× a†© ¤mÛ Å+¢6Œ(€›mÝ [Â1"ƒE6alm"©ìÕxG>ÃY/rQ<Ëî¶,º >Jõ+ÐoÇžov¿ ³¤Ÿ“»ÏP î‡õƒcÇÎ'N«µwm„EVÔ›¨õÏïÏÇß|&íq•BbÙáŒá)­ ¬D{äçÀÉ„óûÍÐ’U‹»ÕË2f¡¾Ú]ìúÀ;‘0&\]¸ÎxˆÏd—½VQ$Îp§½'xN¶ãUöØâ´ š8}¶sW[ÉUü(þ7аsúÑ«Z=.utúrà…×á@‰*ÆÇ›eï6išyåÔ]DÀÃ`ÀÜ1e˜‘÷Ä™W7„9ËiIÿ½ù¾nµ¾ÌØCo 3/DާæM±†EîÚÞýv­ð¤› ‹¿êoãªPÑ,Ð /€°A D¥e”QO¬Ðå’¥ÏÑÁµò‚ýŠÒ²Z^|ë¢PrœŽý#«¿ü­œ¿&GRZ‡Yä;¦w±±K:Ü¡)N´ì6¬Ð ‰òœxz•Ô*œ([þB: Ý(%*9†[\3v|­W‚T¦}ÈT  ©„”ãItÓxX¡f}ßtFÅöÆjm\RŠsx¨ sŠQEèNÄmÖÊa{A+ŸlE«r® laÒçqÀQ²zUÖ’vvg÷[†kjÉ—Q0í!z/¹Õ°xlmŒ¼Ç¸îø˜Æ‘ã!‹,° вU‰ ¹ÖÞ2X§®è0@OÅŽ†º×#ŽôìD!\Ñmp’• ‹ÙÔº^'.RpMgöH« •®ᢰȻ=}Ó2ªhw°= %—ØÃfDì2aâfù¯TûÓ¯ý}ØHÖ ŽhZÎê²^§ªh¥¿TqBÙÚMÜjij͜Æ^ƒØçÇ©>çk³ÂFlcÓ&šZawAmlvö {¥¬s _BjzÈ×mÄÂÆ¢Óè‹´½ÃäÑý-sÙ—Ÿw-ߥ;œÿp¢1ë—þŠeÐê &.åi÷½x)e˜¢œÎ¨LÊvU~zÅψA4‘Œ é3õ…ß _4Þð/ößÚ¿ù—çÇt=ñ·fG´W-M Åúx?¶†žïûxe>›dDÁJ¯þð2ò'J.)§bø™Ý©Îr›œ$¢•Éí²ï¯üÈç¿û_É××ÜZÏ– T°Wæ?qÍøÎ9ˆŽÓœ²÷¸JæÑ/vÈô|üïæÏÞÞ®Ÿo7ëLþRï*º°ÛÕæò¹ýÁaçÌÄ; „°Q³Aª%²Ô©ÐíKÏõš=lÑ‚Øf,aš¡j”“a Øðe[îä(X©Ïت'w°rtÁB@0|‚¯¦ê.†¹î•ˆ‹Ú,¹ª¬å]L5\07‰5y;$øuO5›jëb„!ˆÕX¸'V HÍ ¦•zuÕ¼ò¶ÉHé'Ì€I{_•#Ú„”éœO=Ês¿ãìÏͼC/ÞÀu¦íT×joÁþ™áÏ$ª‘ÀD´(PŠÆ@SÈF† C43íAXٟ¸©:殿ñ‘ó'åä†Eä~Ù‚%QA=;1„lÝ·Ø#:e-R~åý”™Ü4x €Í "ÄS´" Ž^ÏIɳºÄKBBÌ$šÀhN ŸÞ‡±2Bd²¹"àtD Ä ªXÄ^g±Wðú뢂 ˜#ÙN^z°1ó4$ܹ„p•Îdr¼˜²S–£æa§³>H1¡’:ÖÊ!ñ8vãóæWçzÿ{¾ >Ò’QÚY:‰ãœ¶øFñ¬^ÁBµMœËëóyŸ./ÀÓiŒEŠS `\d.1äC‚½i¦BQ )Š´à$°c¬¥&“!3TØ€ÒÃ($Þ°c”RâWè²S‚“械DÛ ä Ž9±QÐ[–hú5‰£âÇ’õ†Ù¦àMÉø~Þµ°Æ\úÒ!÷i÷A‘Ѳá#?Ž„ DD„ÈרeDÖÄ_#fB½4·ê@®Ùsåb3†µ¬¦ˆÊŠ™é÷o‡?Û}~.ηøÝïƒw -µœ´,@#´¢5⦊) Sœõ@¦±´ÃDSÔ‘e6(hI kwtL3%gbî´dÓ/é¡ìêžÇæO·ŸùÖ?¦w¸‡ÔRÈÚG¤…kbOd™å‘¥=©3Clhãy±÷¸£ h«ó&+ëãY•5ž-pð²“òõú?Ü?ð>ü¥ÛâÕÎÐ ¶u’5b³º*šÊ³ºëh²¤sÁ(aWll %ý „Ä“z¢ÚAÒ öDL,søŠ$F”ñJ‚€5³Œð*AâŠÚ¤‹§ÑD¾.@Y$ê<½Öwñ?8 ‰ Uâ˜G'H€,€©»[bœ ¥þÒŸ_‘ªãì‡,„3Ø“¾àËn#/|Æð„WM%’U Ç…l4@3 ¼©µèÀ"´Œ©0Ú+'ªjF¯Œ ÉH*FÕ‹a €y!v€@q ¶¶x¶/±Õßýûþ)¿ùÆ¡‰o—gÖÛáç«û\ÿ|{û{~þþû%àŽ?ŠÆ2/ÊãÖ‚d™¥ ŽÓUO[ÍF:Aöläý€Ïù8Í4B¬H‰2MÚ¯;¢§1T ad2€C$a‘@ˆ!»ß#ïü?ÞßýÉ™¿nbüuøÔ›æ7âhÐÈ ,¤B(E!ÁJ#-J"Á d_ƒ±Ô°#àqw§£ƒ¼'©ö â™×@Au¾u&t0Eùj ”“Æ¢¢³É½0#Y!žÊû až2­7:(4Žò(] )âRØmqþ9©®&Ä¥°ˆ&&É“íáXï/ps«ÝLQ­Ô\y4ï賜ãÛ­iR,údêh—c"ɬûÚºðw/ûûm_E# úNR“­¸ Œ6XƒÂëÄ$¨5Zy„^ƒÛ|ƒ;y2Í˪2””‘meƒ­Ò‹Ò€LKp @p†q€VL=ÒÕ®<û Ÿ16?ûüo?Ÿûñ|ê=Ñ{Só‡b÷ ?Ç1•m°mµË%Y i„¥ÄÀGÇ5´V\`׈!1ô÷ŠëFQ:`ƒ¢’,F‚ Ôh Ï+¿¨~`E àÁ1V¤ ‘QŸ·9|e’M5˽‡"' ­7Yo¸_ËôšégZ¶ ~±ÒÇH䜜»Òge0¼¥ž’ø¦ú°îXWðΨ µlwGÙœ &<"ŸRÏså¹`\±` ‡€ŠØ«Ð÷ì+cÍîQv" MÄ–Ô ¦Ä¤ÖöŒ0¬”Ui0Rfº'áÙ4o˜ï~m BR ó8L%8k5ÏðîLl tZzéž[D¨ï ìÆØ®gl_£•çX>ü¨Që¼… ?׺µ÷­ÿ`xëñ‹·Øôõ‡ì<è—ñìÆd–æë°QR–Æ<Šnr#(*PˆÐ»F …*qÌÎæHýYyí!œÅ/zÅ"äô) áÁÔ»Ìá˳œÞÞ”3Þx—6pZÎ]»­âÇR@ÈLéþ©²?9ø}ì™:ãûífŒ£\PuÛÅvµ×ÕÊ É ÌF2´šu]ä ïÊZ‚‚TÈ X7ÜAIõ|­@Cƒ=G‹­UÐzæiGËÖ„oeP†4W|K*8¹<Ý fŒ—¶  !i9ƒÛ“<Á‚óG¢ß!ÿ=‚ßÊ /N5«1j«jäC¬™ÿÉíŸØâÂWª§•(køªRû­þ„POÄb”ÿ$îj[©BIéKù'cêÅ_í i†bH«›¾¹mYÉ 3¡%ݾ2µ!RÛË%j¸ë^êöBHWšÚÖb>0E¹p1ùÚëGd:(ï%œ:ôÅe $,µmD›жZÊ HÅ4àF9”¡Y„¯­ GÁR*sâ¿|µ°°.£j°EµU¹:ƒëv»…ÂÅ› qÅá£ûhz ‡ª«¤Ô¬ÜoçÏÝÈ4hõÝýÂóíˆ-8´aß={8|. co©1ïsý™Ÿ;*m¸ßû®£…«´„&£À>ä®L=Wl{•WòôJh@±…°Ë}Î2èg‘ë·È/îÃá¼6kúé•x}Ö_ß§¾¿ÿóÏû}ïõ½†6œåÙÛékÎþsEºo]ƺ}ôøïg¹ua:w ]H¥›#Õl)¹ú‘t¢VÛ`ñ4Ð>2ň¼¥ÑÀ€Vò@/d¾ti_®­Gô_æÊ-Y\TަXv/Ü©Y‰)|&¿DpÙ§…ã«TjûØó>Ëh1*ß$ÝÉ,çmn?ÿLkå–04žmPE¹:(ûK,¤ͪ½+r>$ªØ…1CÕƒŸ?üß~æ³ þÙoó§¯Ï™?ÿco ÏÊûæpîkJFdþ,ù÷ösâë_œ;ï÷úU‘Ñjb÷xÜÌÒ% |¦Hê#¯×¸²Õ è9mÿ]¯Þë¿óŸÜÿê†ÿÈχ§„IäÙÏÙ¸xY# _àgÛÜ¥ó¥-…Ö2ù~ïÝùwÿÉïÿ²µ?Ýôz赺÷¯Ñ¦0@‡mù˜î…Û¯÷w6¯í’‰*¡ýI™rþ9EMeàp w @ &Á`bC¢è 4Ðh´…™Fÿ4 /³Dc¦Œæ<€^9›O"Ö2º“Vy7R!Á=lרGÞô#Î~'C±¡F-£ ¦g”0W`Ám ”> ¸ÌN©­¸{¶G2;‹&Ë÷ š±˜´«$Î&« ÑV-‡µv´"0˜ƒªöô°·û+Ç·¶Ó²Es.Ï„%“ÉÜÜï:Ž“£|¢cT?^ü|ìë›Ö®ß)Ì›¸bø„ÌV·×ß[l—¨Ê7öÑVâáD-ÒèÜEáçèüLá—n¼5ðô¼aq·á§ùU—+(Þ+ÖÐÿ}þ’_­'~±æ¼þ§Õ5¡£ín¿ÊO.M%ù‹éZÙ²‚h9¼Hfr=uˆ6uÿÙo¯ sÒËdûù½ë7î1]qߘd­5U°èfoÜFo~ð`‘¦ÔEeŒšêpñ•S Y\u¨W46³ïO¹žVžçÌ·TTÍ}ýùŸÿÕþ¯ßß{÷»ýÙæé@o V@=(ŒŒæ(Ò:Et n­Ò€)“¦¬CAÑ–¯dMG¼ÐáXd1EdM%*ݽ·þ_ö­ÿ üëiöÈÚ#´ð€HÆ.(<¦uCPÇMœô tŒW™{½—Ìh.‡¬V ºR<_s'(¡aÀ_ÆÙ?ºö‹-h.ð@›y 긖ò8¥×ç°ü™x‹£†8óœàì k’-`N|MK49æß"ä[W¡Ífל\b†í2L‰A,¹*«ÃB@‚ˆŠ ³l@¨«‚%hc;+AYBŸm²Ò™Ì ‰¾ ÂàÕ£I¾Â?…,"BÆ8V¥Ï 0` ˜„´a2*‡E ˆ£nACÑÀ>²2‹¬_@L&´&ÄhkXÂyû2á‚H‚9`r€ôЩ/J@#Rƒj„ „@!¨â+“sÈÇãð‰ºy¿ðÕÞ'Ûʼn²¨œ*~vÓ©+ì°¾þçËô~\×ì¨pÈâWa:زå& ¤ã_Ëÿ\ù—ä¿: Y¾Ø—»ï}êµÔ¹ZôêŽc}üä¤ò¸,6¦8™yÌ’˜P°ƒÐhQ$†,¦é]ÿØç\pÚqÕ ‹€*²ÀIϤA3!,J‘ЪCY$­Ší­óª.•h§ë€ °ÕmMÅEbˆ¯®8D)xðD@Ý‚£·>Â/=8@.«PÕƒWH @ÅH,‡PH4Ò),ÁBÄH”¨†„y‰ETÿi°*$@™b"“@ˆ•±ØÂ`RȈ¬ØP„1Z*‘Ä#¬#àŽôlîcrÀ’á J A8>ÉÒ {ÞiÆ¥tô’±îKâUM[•Űf3ôÍxÖ¢9Ï:;çÞe_Õý¤%ºf0W=Y4ÓT@K,²ûë µ„…¡:cí×Çoþúöƒ—~äRjuŸ¤ÂwçÈW཯dn/ùbøS;Äû½$­P«Sj&b¦÷£h©8´OêøQae{ŠŽé„Í·hÆ™œIÒ½®ÂbQ®a¥|ŠóÍ®/GNÕ³ n“dÏxé|÷Ñ‚gõ[L^Ê™³ŒùXÖËD}Œ¥,߸Øòž§¨åýnÏŒQ¦™õ o'“Ð",€m5]<‚ *uÙBJ˜ 5\­ò0d´ÔZR¸~ƒoéḸãb&µµVä$>F‚^ ?@}ÑAnÝ}H{LÐØb 4rC³í:ÆÆ€0ÊêѶȲÉÚæ8V]eø¬˜:L^^?æ|Æs%EÆ÷η/óXþ¼lÿÇØÃnü"Ågo‚΢١›ˆî=ÁOh€åî2‹|Šõ®^:ý+u··+fpq½&K%]ؾ˜Ï;«€$€Ø„@mMOÖà ØZ2/»îø\zõ> a¾ïºÔAôp Ø,À%+ €#(™ÂxX<׋û·p? åMf:":[9R]3ÃKúRNõf/ƒ‹³.xÅ.ÆË»¯tö“ØÑ6ñûÊ7EƆnceæ^s•~Δ,'Ú­,À$¾['] Ý£„;¹†› jR Æ×ír¼n…#`™Ô›N(<¸ aºÇSIŸÇñ±°gQýR —y•Ež™5c¡}èJX&…#@Ù"¡[CÄ Žë›Þz~ì [sêEII¯Õ´â^È÷$Én`£ÊÝäüÕÓœ5³‰ÛòC²9t`j/Õ2WÓøk¯¼d›ÎŒ‰¥ÎÆàSÛ®¤¸Ùyp+뢧°CŸM?²ë4r Ѳrý‘'ðüí…½§¼Èjk/ò7¥~Ç®¬‡Õ îw?=·‰¥É}ýÕ Œi/fëmu3µJõ´·ÍHéÔ„Áfé=‹îÞlE]É,J^4#FÚ)Lå6|¶æ|[-òAÑl‘T€C2G™ªe² Á4x'£Ð>˜Ò-Éô¤å@¦‡|µ¢nP®ÍOiþ(4Â)×TŽ[H€RAh%€”Z²%—LT¸à$×á’¾Z—ü¡¸LÈj6r== !Þ0Ít |&ÕèM,ŽL%Ó:!Å4®[¶¤D”{ÇO19y;®°aÊ|䯬7/^ø+%mdšê5ûv9„€2á]ùA= 7qã\ôÂíN#މ%n¥„ð …]C™¤©ÓìRÔyxb]C2éΉ®$ÞTÓW’pJR4v‘Ü@—ø˜‚læK¼½CÁ"aC47Ô³¸¸ ëΊ«©­Ec_•ý¼Ø]›ð^Þ,üGó|غ_âx……_{;Á½|žåósÚÝÇË1¬t昃â¬y—rîùÝ€ — 0„9¹mL]²‘Rü#Ý×µ4׿†^{ðùöøõûð¢÷]½—ªå"Q4ÌÕâO¤¯?÷ñvîù½úïœú†?¹íFœ92®*¢ n÷z¯Ò=)Ä_sA* š(‚U ÇÿŒLžÑ˜i‚ýÀªõÛ|•áÎ!œ£ -ÞèÓÝ™V”".+³ã­XW"TP¦ ÔE»(ITЗø‰ï,´’c£ƒsŽuóøf7HüÉ~nšG3˜’¸2Æ,”—p˜Žâ%--y #"OÒ‰%tù󮟜K–-R”¨¤ âî'e3ª­ÔëÇŸwüÜŸûÅÔŸ|YÈÅÈ ZþÖ܇wî—þöï»®ýÇÏÂ8ŸþµŽö þB$žç̃|„ü‹ñ§óù3_ÿ±¾öÖý^ÎÀ-ŸÉáè·ö¿ü©Éó£s½O;€Yÿ˜L6`y*óè{Pr 2ÉA±_w<÷¹.öZüܱ÷l¯.­Ö¿çç¯Q NÙI]#Ú<Ýi2·©'­ìz% 6$+öÿâ:¾Ò3hè„SW[7é<ÜfZWb"„d jsL…¥A‚Ũ¬""T®„6l@©pµ@»ŽêÝ›Å0³‘ÄÍ@9 ž Ùif¢‹x¢­ PÈoM€ Ñ @à0¨]À´RRdpnB´Øä)ã7ß_ué¬(#y¾7+”u¸ã˜Äÿ©Îª®´™""†v'$4œnVà> ÇróH@ç´Çd3Zº4-s˜«Jïâ÷:.AÚÇì 6ÂÙËäC°‚.'ÓUÍ-“¸ÓæäÖ_ã)Þ¸ÿuIH·Ö0lõÈÞ¥»×î à‡d‘ñ Šÿ-Ð*:AJPDʹvÒ#9Ÿí›w³¿j?ªPWGeÃCꥵ¸(ÿNþù9ú~ÿ¾_AV6äWá7Dµ8 xúÅT±ëÿèJ»÷zì›>ç/ýåGw¹3»Ê\›ÑM¡¨ 0E9ä+¿¤ VàŽÎ“ÕU ÓQŽ‘ÛCý t9ùwLˆ·{ÿÄ3^Ùh[“Y ã£Tt1/‚FªšøÖöiߌB)‚Ð;È5 VÇ£ø*1%Lˆo­ÈÂ+(u'uŽkA ÷JÞ¶K'u¾??¦ûpLù%Ë‘>WætDzä`˜Nc®O³•Û¾UŠ)oè«Çp)H]¡"ƒîöä1$Öè#|KXa“µÏe½?*ŸÃ{Cê—mîí¢Ž©F¥S ¶ð`#fZ“t·(^0 ¨ÑC(Ó`‡ªa­×H³EèÞÙèkêAsI8éÍã¢vú1úôîj˜4ˆ$±Q­¯î3· f”œ 7¥Kïî}ú”™Á¡‡Hd‚ÍÕôŒ\ZL.÷«¹«™Š— G–ŒÂt]ËÄþFûýo.D_Ÿïüäà…n'||»Ûû¼ÿï¯Ù~ê;ø'ÕeeÊ/Uô—½‚¶5£àèQÓÀ„=a¼“[®¨ó=˜äÔ$³—± Vm]˱}lìÌÞ|þg_Ùß“ŒoKê¢Ä•6½ª›U)Bñ)‘(ŒBÁ*›{t¡&…(l-­ƒC¯WÎGQÊ©™oþü»›Ÿœâûÿò|“‘*÷þúýÍßçþ_¾óÚß„7òä1$†˜‚@Ê„ZµÊ›38Œ¦¿Í_MÀ@B‹=8–EPaLµhUßþ'ßz?¢©¢¥8N…ª¨Ðˆ!ÂCœ$™M!Ô@'€NZ:ÊHøÊ*)J‰± Ôà-ìjaÔÌYÆÅT5”RÖÿ7zßÌöƒ #ãTº;ë5žï|ìƒ}Õ1‹Ak\pûyí¡w½E˜ëù6Þ/‰ZÚ ë s²è¨Ø5Ô–6$‚Tk1’a††”&l¸NKØQºäFñÓŽDܧ+ 3:袤ŽU»¦#-!kS ½T+‘nCÍ’8.k E3ÔðW,G¨q-uP˜- Dˆàƒ‘S.¬NL( Œ˜`0xðŠ@è)³L9 Z ,’„I±€Q€d¼¤¬û€ÉhHT%§tAz#ÙAƒˆ ÍD -X£.$h¤+„"ÏîKüÕ†½u½ÛǽÏÕ|ÿ[¢!)XÛ#R#TÚjoy\âûyÿÏÿñÅϯ‰MÐÑ 8Ñ9õ°Î (@®$ FAÍ^·°AðT'°ÂJz]aÿÏM¼­—4rC÷ ™Ïå§#îÆá©±CB®éz½¹s›‡,Qì=¿áÛ¿¶ßýß½sz.¯ýM*Jš™*Ú!ÀÓ ˜¢\r[²ƒR\BÔŠå8¹Œç%Añâ6F¥Ybm¡ÚUˆÖéŒGB±Xð€‚§@X°ê¨,@!€zðÁ+´¼z@âT‘IX€€©5…„"(P8`*êAVIôŸPae" šÀ‘91"‡pPk* Q£G™*Š’T§Z·#ÝÆY5ª25?6o'#P‚5¦ßž!=JJµ"Jȃ¸™À^cï›{»žLîÏ,šµÚkû@õH­$ãZ[½3ø¹ž8ë—¿»û;™lÒyŽÚç቞¤îcú9›PÓ3(ZÑUU½c Ú×üÀ¸5H¥‚§…W‰­¸+ê 'ÁÚôÈ-ÆEΞwïŽOÜ ’B0sJšÊ‹Éí!ñ&ÌhìÔfëYGC§t¶n`Ëã¡6 9ØÄãl–Ȩ‚Éëhÿd%ß·"×wÚ—/÷å_Þ1JwTßïûOÎZÿ2Ðç±>6OÏþo+±kãå«sõSý¼N?jæQWز%îe¬õXìtú±vöêþ{_Û£ÑëlÎÝ¿¾q Íúô¯WåoåýïÖð­ŽÌÃw{e·u·`SAwQ#¡æì†XCœguØ™=С}"LbâDG¤(Û¶âcNÆÅê<ôŽÀþfB‚ ³ýH Ô£ˆ9#j¡É°WÐQ£ÇÛìÍ…èóÂD?'øq5Ú{¿\½÷ëÓBÍUígþ¯ïWŠ?áíCûšÉþï¾~÷žñUGg«™6§ó­õ–vewO¼ü¾=‹Oþàà ŸÜþõþçÖì|¼„Ð(3 ¶ƒQÅFÿò¿\T T°2ˆ-TB!‹„VÁ¨uÛlõý2\+©”À¨ Àw@(€%•€–<ækR¤PèñÏ÷»ÉNÛãJ®*DR%.GˆÛêàÅ­h$Ð:IJL"08æÙ¿ÿö—ßïÃF4_]äg² "°o°&È:TJ°Ej´.µ€+ÂÈ“‚@}!î{ÐÜSvPŠœ>}ë"­nµD£…Y0ÒlÅ`È}XeÒDE}Ø)!;žòN·p |/L‡Q(·÷Û‚T*Åe'ü‹>%ãñV'ª }ò\5¬âbzgaÏ…ÅÚkå7ÂØA®n÷u¸˜•;¿5”ÅwØYs¯TÈžA™2º¤Ñ¦ñVÜ:c’ŒRpZ¦pq Kß] øäÎYÇÝMêE;§¾é…æ8º ‰q¦†ã¦÷@»û’0øðßÃþ÷l=Êçˆtææ´m“1Vå4^Ù2Á…¦Ã‹˜ºoGíò‹KSX û¹k×ÅδŠ?“HÕ«²í)yuѺܚÑe0¶M(JÒêÆ³‡xHjîÒ(5¯ºü©RôŠ `…¼"‹N×h¦/Q—2¸Á€ÛŠ|ØÈõ2nå?¨*l¥¯|0$𫌡r¾©º`ª™í¸Qù™¯æ¢ß„ßE#N@0·¼Ub³d%ìK0f™©àÅCBjó Ôƒ:-¸%Š’,Ô\2M&`R·Ï›”U ¦Cºº§‘î^ÎWÀ.ž¥s›x0ÈvxB3ºu PÆ$ÛÕÎÚ-ÃO k»Â9%‡¾ÓÜ£eàmûÃéªh"@XgÛ5\—Á®jΟi.-ë 4h^¤¶oH¥Is:„D\J* ­D5¯À_¼¤òHŸ·b~z.ÛîG­xçöMЧêGî9cû^;Èçµÿ žÏ7þ¿þoö’là fH@C !°I¸áŒ™ *ؽ·¯®û—y0È?,!µó„_ Úâú»®âúß½oW‚}gw²¡­‰«i’=ƒwvk1âz^‘û×v^þ„1®‹må;#Ë4XV.YÎ?ïÅóìó}› …½à3"Á¯¢AÀVìÔéÞñ¤[þ6¹æ¸@slKlé›­kån®´5¨JÓ¡­uÎ/UÞû^g~:#ü¥¯SÛ¡“•<Þ2ÍÀS"«ô`Îf†Ÿn=—£«Ù°`7×—HoÁ (àG{£EZε¶èÉ…Ì¥N#WªÄ¯æ¦ –†ºìbRjÐ|üsÝÏ]|sxÓ[?ÌÕƒ_ÀÅ)ñª:n.{Q»è}×d?«[L—;Îõ€Fn+Â?7ï7h|A•ÿ‘ž_ r¿uÉl¡,`®i¹¥ô§Ø1{_†®×¯ˆN£\ìu” Ѽ³ aŠ’ÎVÙµ»Mys¸@RkñÖVîµÒç¹÷U¼'*ã,CëŸpäéÁÏ“Ëûº›£> ˆQ¢FÖ²#D–yžðEOè%]«{˜tFO{vâ^Ä2ñ¡P=ÀJ4 •POD€Mv @˜ež„\/’¢Ã“Ñ© À2+|vIYÏ%°”j((¨wAÔ¸—5%9+Ô(&€á 0 –<ŽeÎZfŠ=­ÛÙqˆ¯¥µ>12 <”Ïc<3s}ßóD`»œÏâ¿ÿϾfl·È¼úÝökzÞÅfl²«¯í÷ùe©×j;ð“é5¹jNãÔ^ñ ¨ÿ¨;õônt,-Êæ,œlQ@©µ”U\Ëã:ÒP¦;ÀN»3Ðúðì ÊfíhçÓÚ-è3|)k´çŸ8ÙPøÕ‘ô†ÎÈå‚E»5ö&P¸¢m¹j“¯ÐõW¸ 9ÄFÅ’£r€Z„âÎæ[ßé³Yá+X§ëÙDðQ}t–¡›š}t[’oç­<}.kk8ö(çö¥ü+g9HÎ#ºjwÆ[7 €ÿ)êçÅà;Läû¿sþGó”Ñ*.­Ó¥^ÊËÃx{Ê«yâdC¼Ê¬ªwÔîqftørwðÑÏÐ7­ îŠÑÀƒW<Èüê*Y/:¾6o—RAF­®/®|rª“ßQ㌄ú_ïß9å¸U¤SB§]¹“¦¡hX@Ñ a©¶äÏrÅó.«ÐXjúÓ =zÎÙUt–Ívc Ô—Ú€zØý`Z¢”-׋ÿ·pV:¯Mïˆ#¡„ÒáÏK:Pü'ÂVOM;€6ï~ú‚¶§i‘¨*}½æwtw?Î(ßñÅgÏ~&‰jøaÞKÍEËp›é’ºWz.¥ G8ãí¯f?ÒQE)k·{¡/iÑs”Þ>k-c›°Cú!bÑÛCŸ¢Á-Žb¸á*±íÏ7â ½aõœhl£O’ðò|_Ÿ+^C­ÞoóÖv[Ç3á‰DxÅÜSß5ÿ!û\U™†„¼KmõásüþûëÚÏ÷µ_†,鄊¾üÓ«Ÿgÿ~~…=æ±j›O~W7üÛÜô²&{¥$ôpî[»áŒ9°»õ™T¡ ÂKº‚y^bÒC(c#ñî¤.³<Úüó?{ïçÞô¾ä[Tó0½UtM†QöªjfM\Â]ů°&KëèÃêMu_œðä~ïÓŸžÇWT=k”¢)êtÇuxÃKXT ü…¿…•*ȬÐ7YVDa² :‡€è¸Â(\€"Üœçê¼ÿ™oß…ô|SGñ,££}™Òµa@@­¢=~l‘Rça¨²PÓë,ÈVE$ :à‰FˆënXIWù¨ò`4DåXÇ'ÆÀ™§Än÷¬L"Z…ªŽè.ÔA¨vW­ÿó·ýßüåÞŸoûÝIW3v­ŸŒA&¨à‚Qˆ.ÇÝ—{_õí¹au[t•*–*$Ђ.I^>¥¯\/o7˜ Ëcü…ÿ©îJ¾H]ר´À%œåEs£6z®áÜÒuP‚L53€±Ç%â9FÁÐ24SE£ ˆ­VQÒ‘ËAÐçD‚½ÃpÒÀZáp5 €€ÀÊÀÔvÉ` "dˆè0*2 ·tŽžXBäSŒ8«±UC) &Ê"+ƒ$Â;°`7\âF*ÎÏ÷üþ`~upÏáÓ£¾Ov)L32›~» V|Ky )Þ˜¨œ·F_¸§hoüíï-œ/ýò›?ý¹Ç½©ã‹¬±¹ì5W¥‚ †Õ.ËÜ® p–p:íu'ãUÚ¿T9Õ=E¹–gκìºÞpWìž~N{"W¦q¿~û¿éÏðvE×X9n¾î~½c÷ëY߀ #4£Ñ4Y´DÉ€ ’3Ÿ–KЧ,Õ ¸IÌJ{cÀ+¬áòÑ5~UvZÅŠ0èÀ  8EÔ€A(p€" = ) ÁÀ FG½"+l, X$>x€ÑQƒX(Å\Q%V@É£hÅÑb%­€Gš˜6ðKF®€‚\TÙ=ŠhIº¥jº’¢R`5l ü+å§ç¦Ï  fØÃíôP¹åÀ‘¨ àW4'R~&½í§^ÃY™d{šìiŠyMèÁqs}¥Ç‰ãoýæÍôÿö;ï4fÿxph²lã×µ¯™, õÎbAC¾«ðq©lA*„í¤à`zËTT‚k— 0P"€í“ÒÝyä?ÛÛ¿Kè§éyMÏ ÊìŽEŒQ$²Æé-DïïÔz‚íTY´= ˜Óß±îÉ/dÞ®QWŸ5‰´‰¥ë]¿Ÿð:­ùY‹x§¿Ù÷œÖ÷[Œav§t—k=æŸÿÍh}œ%;°kL‡Žhº— j”æÐ^_·¦»¯î"±$ Ö±ÒÛÑ_ë*wFܵö·œ§˜ïV/ÝT½ë)UÑoÔÌé©’Xe¯6$mnAÊ5¤ÂQ@à«C¬`S‚ƺ‹?ÝWÁz]ý¾QŸ/Òn> äH9âí@ÀÜ{Tž=½9p¤,§C-–ô’"ÙêØ£¸áó/ôÜîéxäêÏPþŸÂw—V=òã–ä[séÃdépy TgÞõ°kWiEebz²^œ¦íÞUºfôü†É†_ÿq¨}» û.å{ša7ÇcþþoúåPqùúòÙ¬Šö®ò¥ÚÖí¶)@D†06˜C*òƒ†¤@ð—h6B&A 1"ÈP¹ŸêL¿÷p‰4( @xàV±ý‘S0©´¦‚±}d¾¿Í|ïúœæw²›ýÿê+W_uRÍH¬Ž{úbz;.Q…–ÔÑ•’p *&# Üg¨–ïoÝfzÔ_>7ÜG+Çë ½Œl·ßíÚÓ¡Hêk¼I+\n'^¬úaT¢0Ó5d‹>¸]@2SJoa¯¹ð} ·™™“ûD…“½Öçm¨®Dî][K' Ŷ³Óg¯ø”>ÑWÔ<„£®3´ôZ₞¼®„RÎ /›2Lí ,›¾u!zwvToã†E LÅï3<•GÆ0†ê‚>Œ‰¿’VÜú¢\^‡³h`“´ äDÀ†[nÎH%ñ€ Ë—í[é\戲;…-Ð"-äÐV¥¤Öú§² Žz­€¼3¤=Ó1Õ€A !D¨ Õ?nµ¯ÿ *QÝ™Ò TK,¥UªÙÓZ¼Â—˜þŒ™ ÷l,Ù΢H?Ó ÇâÚu- ÚÀ0¤¦æ42+pJTYÏåæ-øÃ®§dC—æÙúOæê¾"Òçª$žƒ » Z¤ÂD(p[ÕÔ’+÷¡]]§ˆÊQÓ¥Í+õ7Y£(¤£ºÜ^š={‰;äaky£CÞóOÿªœKzý ßðâÕ—Êu0NŽ¥›æŠzÒOì ›GÃK Å4tOàhÃaó8˜Œå^Ù^€~fV.’>ö+Õtí ìø×¿÷>~jAù?†þoæó|äü_ƦíPȸ´Ñ6 A© â«¿õøê®VZ)¸Z }²Ô¿ÕÏÏ7_õÚï|«¿î÷FÙ?ñ²U=*d«v•´Ÿ%²thoÌöŸvJS á!¿Ü6>užçõW䳿¿Î¹Ë¬6zzQÈõÆ?Üéߘ¶ã)r~‘T1;޵º–_áñàŸ“ìTNÆì3_µ®ý(Zj%›¶ðjsÖV+"ÊzúOúòÛþ÷÷£:Ý·_ÿ\õ“‹n­ÝÀO"&w¶Ã*‰uh v 5v4ƒtABJÙßpÿã¯x矿ÿ™‹êݪ~|‹—#Û4´]„2­få\8A[K­Dªd¡j£†zíçÒJ †–û›‹iæ¯îÌõúå—Ñ_û|àÒ’d¤3µÓ:fºœ=Üï åy‚[ç^zg{G{²ÔDÙd]`«Ær :ôBí‹4Ò³‰¹GÚãý‚{T§lX¤rï´bÖŒ ׯ|vÎr6/¯³ÿ0Í¿ó÷þñ»øþÃÆÙa¾Ì_¬‹²ãaÎ{†Ý\4(¤™è—¿ÞÅ è:»’ÀÃÏ1/n\é§Iu¤ÓhMŽ ¨ ’Ît(œ]ÙYkŠ¡·AHœ)¤kØÙã@+§ŠY9íhNïa63-ª=Mq02¥è`­•䬈Vv"@ÏË4á®VEK ÄaÇ"[ølÚÄv^l˜¿ßClÉDf¸³4íNÅ[øœœÞÃþùøÉäæ?üy˜»ù‚­Xá®\‰‹Ò GWÎf¾ OpŸïX…­¯éZJ¬2d$d AˆA0¼5ê@`¸ +”17”– %øOR:ÀT隉ˆŽV’LJŽåx¼à‡Å¬Ðé<’–ÆupzJÓ„EJÐ82)ÊìõÓÉôVÀúæ~[¹HK ¤/ë`-µÎ¿f<©:›Ù§ö¸Þcÿœy˜¼öè²|×´Ýxäl±—H¬¨×jX aŒ‘”d Éš~ˆ¯Á3 pCÚÌí˜îÔ‘,oòñ¥éÛ¿Rô Ã(ƽ=Û{R^v„IŒèŽ·HeÜlÓ+ ÒÈË@dU²– ‡œ•âñãt«aë®ø:Yâönßýª‚Lå9¶~¾ýýóÀ¢Ì\Û¸{9´Ïï–ÒKláÌù4WkÆtóÓ|{÷ó^º‚S«Œ¼uÚå·6z¾oÍÝoqäØXëèµÌf|¹¶¯hGµœÿÿ$ö_}ÔÿûÈŸ?$Àɾz¹âg³ÐjÓjm”œ— sϵú(£¬ä¾4}x8€[s£½­ŠÛ8ІŽsæ¨ò€²·€~Åxˆ‘ÛWjúxÐq‚VUl€S¥ ù\2âÖ룅äçVUc¾×¨<ÀI«Àx;·–ºË­sõÁ‹/Ü];¾}çÊ™…¥D÷¯ã¡ßžãti÷üÖ‰7Ë—úÇù¥þ ØÓòH2¼>œî%“Èò°_í†SeÄ6¶¹ÌL»mfILb´”·C¨B_1^ê!lü/ø @Áš©ŸÖr (­Ïž~=—Z<í¤2ä¡E Ayt])Z€)ÿѯü9Å}æßæ6¬Ù§¯xηûìßß9ï›ù·òò×ñÜÜæù›‡¨ËPh£sÇŽ)B¹T+‚»eŽFð³‡Ä™ÍúðN\®$TÆêv¡+tV[‰¥ CÕK?zÄk©[«l±õ“û,Rµ¯¶ŸO[/7÷=w¶#Öh ñlJz˜’Zƒ­¾§k²-^âºá¢Þ(YÞ¼Y“V²ª.¢2ÈH·,º‡ýñ'†¡¤ 3Ö ‚mÔž†k»j>´¤¶$#ù~Q‚,ã ±ôÿ0ÍjŒé4¦+Án¬<!Œ«„œ©/òªRÃnÖVûGìÑw½M_«ùÈÛfV„{G†L˜¤…Q©êð«W…åš$Іû›%1%¯­­ ª*Ê݆„¦ÏAÅñ¼ËŸ3;%t2®\E:"–Xt×åÍ—+ª A)ÊŠ[J&6l(5àû )›03†'nâŠÕ‚A!ˆ‹9JjŠ`#ZÔçYq0 WtµÁJ©ßêJ ,š¢d p6X¦£¼ÉœÓJïjxÜáØ’6,SN“„zWÔdô=.ð&-Ùª3ÓRHË †¥ƒ³7|éVó‚–9 ÓN¢ ”à+ì…Hneo§]4Þ³tÛÍ‘5ß‹÷¾Ìs>hr<3Ñë9÷Ø^bt”J ‡­ƒl‡Ù3FÇ4w7gOäT˜ÛaGwi¬ÝL3*¸Ö]·ö¸#VÅ ÕŽËÎ~¿¥ã\Ûž<±÷ßšÿÏyæk3ÿ§ÿ—a£‹Rø2kQb¿Ѫ#o¾$B&ƒÎ#§ú÷öîï¬ [ÿ·ùø0”¹_œüPM»ºM·˜›zòu™š0RhŸÎ·`>jVè±÷Ä&}±¯ùN»ìÛIòP¢lt@ÓË2.¸Ûå£úzåÿ“”}ðÌSÌùºygã_}+#ÿ™[/ã0Ѐ¯Öõüuz¹ÛÂrÙþï})-›'µ Ç‚äÝQ¤?têÒ&ö Hð* æ&Ô¶»ÊK-(¯%lž>‰ŠDÝFâ@ÚÖÀ×_[?üþŸõ*ûNàýÒ1™Î@Q‚¬¬.æLá-2×2ÆÊ ÔUçª)I> ßÔP‹\cä=YÁúkŒ¡Øwüg>×§§ïD<¼ž°ñ£[sS….ˆú%Lå÷Ì[gKÿ>‡¯ l¯{òvÈ–Å`i*0(Cy]AÉŠå¹ €ÔªïŸøc”¿ÂÌ9T¦aš·áýòsÏO ›fyRH·«5‹1ºÏk|~žŸwóüöó°Þ·ºa[ÁÑ›ÑíS¿]á=¼#DNB‰Tkƒr?Ëi©Q¢šb!ÎRåg„3Š€ C™A ØÏ/­4@ÑÓ¶Ràl¤—t`qe”ü4Û.µÔ ˜4s´‡1QÛhƒ@"”j:=œéà:¡X1ê• a¡ ˆZÓ6swˆ^¹ª Ulg¹ðùÕþºðá©vίœ×î /nZü>õöŠ;äOÂzÿûÔ‘ÿüžV; ß?ñß[¥ìªÞ;„ÜÔB úU.Å»iy>Ì··‰77¥fI qj.Þf•7ýL“Ü—ƒëÑ%:!Fb”¹qº—‘6·ÇQ¯¬ò7 ýG¼7†ãïtžKpºàj(Y- L|ŒTãLŠ¢Œú©É¨³êmXÕÑ`ïí*ºÞäz—DA=qÅE改Éë+„5Џ ®ˆÈ£K—¶[3ÆËlÂùFèÚæ¥gÛi.™€]}væûÉúZ€çÍùKáSÇÿA/Ÿx}úSN … Ü¿ûÅ}ã–ä6?Épö¹É øËè÷˜A2Ë HCzë äÛØJbôÊ4à š+îã?“Þý¨P`NNÐô¹baMÛ{Þ¿(½~©ßëÑ*‡¤“Šð„¼¥½«d7¤û¾†è§ÇóÙuU¸y}•+£˜$Ï2³®ä‡ÂE ²Ôávè/æ|1Î[Ñw3µ— Ïucn@—jS8]f»Gå²úq¿¶Êñ²-Ìvü10»*Ì 8œt‡áuR¡F ׋„"0qȱE{zSC£—›;m«Ÿ5ÇÀîìÊ´®ñèùÓ+÷ÏQŽÓ½5÷Ýï(DÛ¹ûf„/urñùƒ’âVQЭÁXbɪ`5ú0Y-Üj¹±Ù8Íuòýåq‡ïóšþúýM;ƒÌ7*ë†8" ÍôÇų˜e˜¾[ãÇé²^¦GŒ#,"ھΡ}ÉJ6Ããç®â¥‰«*4LzO‡ öküÞå§®ñ?¡ ßTÿû­ùéæ?Ýè:©7ÃùxAšÏ›Y@@ )(©N£Ê©Må¡ X18ŒB,*ód>£Ú«;”ÂÕPRTxÁ­‚B¶H@nuÎ Ab€,™¡³ÃýÉöCº¾÷bÔ{ØÏûÏç‚’\ú¼ßú¬²ÏW÷#;k‡tWÑ0×Ìt­ÑÚ˜Î;Ÿ/ã‘o1ÆvL«X²>ªú¢£“rÊ¥$ Y¹Lt3ü)¿™ûã!†M´å Í‚±· Ð¢Ÿè´ü¦¹CÈcï©+¬õZ[KQ>š×bŠAYŠVKãfä JžG¶›?²|õ5BÀ-¤j(ƒÓ$É6m:<¬ê Ks|0PŒVAKÖ é¥sî“c9C„250S‡ :SI3ê5©ˆ¼ª0õb¡4 ³DeEÅbÄBÖí¬OË”LÒV× RY¥–ŠXªG¦ªÊ,€f"`fe®)Q,³…R\§½Ã¶ :8ˆë@!œÓfˆZ{%À›<Ò\ëÐ1~×ù}D‰}:,Öv šajMÿƒÿªí·_Ì*¾äîÏ>ƒš!°!ÌTÆ¿ôèýíÿþû˿ÿ–í@¹Œ´Apœ¢T,XX¢ÀØà„õeÃc[rÃLŠw?’/( ÍÇ£c_hvyùš3ñ„½y^í>’¯À×ùxýö©œ{ZR÷´Ð3îËe;.WžP-D)¥³6-À *M $ ˆEÎ:IWÖºL "Sì(§Ç®HèÀ[ÄÒÒ5«Æ".L°xõEVW`P«@êçº2ØÅ~LÆ €0 ›…¤¬i&>vóF÷}ËôN~Ôg{ELIA—š"\Èc ¯þj·žµ£O³"ëTÆ Ð@d" ŒB˜eb °ˆiÁëWH WJÏù\ñ¶iÅXß“8àÒè0(•Uk™Gâ±%ÓA±tе Cˆ”DëòÑÕp¯Õ2ùÐ]E:“¶ªÈƒŠãdÒ^Ð.HÔ)I2Nj]¬ƒ:«G¶Y'ÒœùqõõГv‘m¦û¶¡Ã¿ÜÉ¡×JbM—)„ôÌâ~‚§!D€B¨’"\)ë(Œ+rCzŽÇ÷ü$sÍtŒ6`t:úÊëøÁi*ñ\ö®à•}6Bº•ÕŠ¤*OTEw ±Ò2¨2UF¥ë)R>UÑE\,Çã.¸6Ûf{ÓUf×™=¾å>×öA¡äVC¬×5FOÄnr‘è™é¼ßÕvO=%Þ‹ðšw;³Ý^t;êŸerå/èØLw?>¬Á®9Þ^TE|%´IqæožÇì?îÅÎ?5ò±¯6ë£ó`”¬‘ÚÅByT@f%š{KÒ $éhWKMˆª%Šl.”Õé ôŒ»H«:ik×Rm™‹I¯²ÛS.ð{â¸av•Ù£i6ÑtÚÀµÂV tç„ Öôe‚¥Ê"]éè§^ëzÝ×ùVéè‡^óöÙwããæXý?ïVÌŸ}MôÒ³Ã=ÆþþËÉ÷:°25uç³êÊä à‹"£Ì]Ï­Ž%Ä*J™ZØÕÏ[óÚ(j†ÏSx®â´Æ/ÑÇ\ÄX6" 0‚ØäË¿Ÿ^=>Ð2ß !‚E?…”VPÒÖlÄ qŸbëÓ)íZ,s›‡§íZ*&X§ bÉ­ž\“|ô§/ÅTÞz¿Zšz¶O¯çÕ¼>Õߺ7[}~5«ï“î ;…ÃJeƱD7wÆ[Ÿ×Š K¯¯ 5±Fñ©èQ¡…ûÀ[½BÖu½dÖ²‰ù`16Г¸4ô¼‡êÒ’Ý$/*«-½Àc y`éúJ‰\˹B+)_>º\‡C³ÒWŸë£ÖR·;)cK+wòÆ®‚+š¯=¬WV®\x˜)ê{,15Ï?ín¿“= ”$šR‹(”>#Üð&jƒAƒLçf×1„qQ¶-k¥õ<ú“õ¯ ù 9l>óÊO‚çÑUÕó°X±¡œ’Tf\“{ÏŠs ¾@‘Óô%IÝá“p„”[6…s-—º–pél|â÷ ñp†INv4î,–Q J`d¡¨´ ªYz#ÁPÍ:šä`ÈÝ@©áŠÊ-¹|¥¦±i’´‰˜¾6¤ò6)ÕèP=7Ñ €çÀ‡¤mb°hb•;¬ƦÂB‰h¼\Àfü‹…ÍÛüQ¦BZ ,«H”:|¦6c’â¡Iîf]i}ýžÎ=±ÙC•­¤7ë®Å°XIºœ-`a?9oéó /³¥[°O€#…::ÎÐÙHŒdL‹Ø³vËî!v K'à¶[AË œƒ‡c …gPݾ&Á´Îj3(7! ‚–J8$ØÈiÁÓÎD—ru-D#Ç@A ÛY b¨tˆœ¹A/ÙßúÏWü âOì‹Þªµ¼Ãu[›¾äçé;;?|þëø¹ô'·ï–·suۺˌ0['ƒ}æBºÚ´Úz*?‰ÏòÉ_îÎ"7þšE7=Ïü ½3·»Ú0’6ö~ƒ†‡‘0IÙÏ(KÑ@Æßâ ³t%4ë Ρ¨ß·[ú Üì.?æôŸsÍV³V¯kÅç±Cô‰5 ±þU‹áG§q--ü¹loÚ+9ÒwÆ{Æ{ü¬_*Ý(~µyþB elcÎÄ …ŸôÓ>ÿNwVyß®5œTâí°ŽKwyxå/\ADÿajP=ÖIY ‰ßÁ™@„áyŽcýs}¶6ÛN—j 2*qù‘öY®7uÅH6º0r$a£x=øúÄú(0«çÖl¡|y1 `Íä;¯ñÿþ|ë×àŒ%²j{Ú §âãÔA<¼÷£‰3è—¯—ËQWžžü!õìúC’“Šl¿¿ú+xŠ~Ê!´ñ›³´ó1úÛßÏ6AþÂÛØmd\ÀO‹n°7b{XÍR#DÚîÒÔ=GY‡ß]Ä ^ˆ|5ÿioUQœh¶[sŠàU¹µÙkâ°zžs¬+» ßZÍ…üw9ÖÓ£“v9fÏðA$D³wvMú1±…|ýmWªßÓ£V;|;44ÞeÅ`¡C© N‰ [ŠC[ î€kp/h¾I—¤hK”f×z—z!¤ÑÝ`Kq¶æŽ¶±ù&5j=ÚŸ›Ç rgy“›L€v~·+`¼a<4O3…EÀ`G"œ¡c›ißní A ±§[ïÀŸCEOüô>oß?Øà¯ï>[Çïý«W6ÝË£Õ‘ˆÐÔlÏYƒ£ÿ#$bï&h5ƒÄ41û #Ëø|üÃí9~Hlª=ïËcäa˜ö¬å_¿Ø|ßÅD4‰MÜåú54އ¯ <ÊÈU@ŒOº«ö¬MmPå¬"¨˜2‚dJ@Z‡:3ü \¹ª(:p·¸Ð‰€ ¡ ØRA0 àJWnRtdÅüó37ö±Lx7˜4Z_ £_§hܱç1ïä;4UG)Ž‚ê6,}œ¢‹œÝž8»3< ‡‚ZÑý‘…甜/;yz°C$hP¼öPÿØý¡ëœ)©\Ó¸»Ê+²$×j“ùÇáývÐaͨR ÁRKeÌIYç¡<ÐRs*–”À«@½[tmÛS¡†VHV˜¥¥ªîÜÇ,Çvã„IªE2‹àK.Rƒ³ËŒ\wŽá2·°‚+h)ÀÌ׷̢쒿W`€,çkåÆ5Þµ­Ó+cÑa€MXñ@© €JB` /Èލ€xLžÀ›Ý ·V¦ñ1¡ÈÍ@†šÑéè¬&q% %¡h TÔå„`¢f<g˜€8ê0·ŽX¢)¬ãTÓÎÀòéÄ·ŸÀ6ù$ﺫ±oNKVƱ3ÖßaŸ[lù[¡®¿yòÅ×÷ýЇb˜bVš›«Güú7ÿì¿‚?öï+píD60â*í¡qͼÑ=ÅÙTôbÒ ±àçÝîè-nËZH‰OØgºÕ-¾¹¼ŽGo^:vÇòÙêóùžÇå?óþ•9±Rö´e‡ànÜ{½ËÎGö¶ïäÔ""Zb¨Š AUHèJ—:Ñp„§L_| ˜ïm‹˜·£¬¦¸*7eñˆ#†@pØ•P EXâã/¼ ’‹>¿‹LJúõd‘!.Zl®dƒ6H3Ü_Ÿã_ýuáü2s²Žß½>?/§sòm£1º}mÿñªÕùAP*â}7ï§<ç rEg À¾&“ëСCÊCfpòŽ1?ƒÀ?çø|)áLÔJY³ê·1ãÜÏæ¢¨q Ê@w·×_z®½• €Dà% ~*eIôVpÀàT€“| ñØÏRvd“>Ë»:™¤…Š Âa#Ž€YªÇsôúMUà‘Þ;ædÓ©ÿí¼þjx»ÌFàø¹U¥FÀ#¯„R'~Ü«î¶GxyUË’2ha@WöW˜!’" ø°¯ó•Mß©vºñ¶Ã#Çñ¸kKqëÄH‡ý^x•.µ¦1yc@YûÅBµ ¿:„ d` Šv,ˆžˆ¯¢Ç`×ÌÉI?–ëäa]™”8ÒÃÊOR稳r­:˜bLœ;lÞ­û2³ëv7u"ÄS6FÈFN(dÈéѶs匆 .tÀH{Ñ;ª,¹~ºëW}w¹þjÈS2Ø<ÜÇQL¯¯îE¬ùlVœ~ê6ô«—™;LÀ\j9ï œªëbW`'ÝDØC¨hmX”j±=fDK´bYC$CBXHå s˜…˜ÊŽ¢âÀêlåº=çd¶I7ÙØ 4I%Ò‹}޳ÜR¸pA‡@x3Dâ:GC±/XS9#°#ŠóN +#ùN§Dc[׋¶f%ü¸¢TŠÀ^Œ›Ê±o‰@÷" RŠÖøéµ™Z¬ÁQÜö')³”AÙ“@aK@º„0« ج¢¨¨–Œqn|nಀÑïÝ­U!hÖ³„œä˜~¸jÆþy¿î¨õªýô²z_¤r‰ýpišµwm«!ÚÏPÌÖhýnÑ=ÙÍO èlâgšŒžüáyÚ…õæÜ¿ûÊó«¿¶8ÊÛd8“kƋݹeÙËCo~u³Ð nä—t_³Ï·gTÏ{n¨ïI#”G0AÛh™.ÓØ_-Ô>Ç…¾'´†˜ öý[ûÏÏŸÅ¿œ?\þ›£¬rh–h¿û=}?V©Ô虤Ȋ\QdEu~7„fPÎx‰YvïU_‹n Ÿäù[ö&Y_žôŠWõH…Ÿ“ÆXžÆÎ»w^ßÉzù·—ý'ÄùþmÞÒlÂᨠgŒàD^&?Õsð5üÄä—Ñ ”þáóĵ›{ü—ÞÅwíÃóI0óÄÀ †¶ñ%%Mà†Uæz¨Ý]×zÒµðX€©ñ•-êŒtò4¶"‰å«#Û÷(°#Ñd#…J]zàM©õB;cÜÈ…6²*É%RdŠŒª—Í/©ùÍü¬|ý>òÉ·ä¿3.Yýaš¹˜ìé‘Ñ“.´R·©ñ‚„wbýÆ¢>|;¼ªzú-2B‹2¾Ó¾[—á ~ Ëu"ǸhKQ¯p¨Nu G·e®V7yý€ØtÒó…¼/:‡ÊÎÔ“·@®Ëf˜;7 –ºn¶ëŸ»¬Òå“Ä=“GøúSú=©“$•¨UЍ÷!K‚o¾úì&ÇJ¥#"ÏaÁ  W­½ ñÒÓ°2[û§[ÿ[?ÿÞ æûYÎã¶eÙõr 4",D½ÌìQg3 )P±¢1¨ÚDÝA’Äi0“qé°Æ#©«Z‘Áè$3I‡·ÆÍ¨S/Œ $·':™i‡è0g%ëð9)·—b„AE/ï_Š7•0g]qU,À –Ö.ôºú™çÍú'~}ÿUüœÊ ;ñE›7§Ïke¯¡0¡Þ.—³5æJÚõ ÿÒ³‹žçÀ4߸›¿ªð?™þ5áß\þ³à¸?—Ã1ÁÊû(/ÁÜÈ×äBtw$û¨?:¶NèÃÉ=Rd'‚.p-¶h’BN¯x!6ÐáB?aêóBYíÆ5ÉEb˜Þd!¶Q¢KØñÇ9–ãE•ã—#1ÀáçÉyuƬæYójéæ1…«0ZUËÖe͉b:Ñȸ˜Ýy=Õ>­¶`Š“!ͨ•xÍü/÷á{»¾}ù×Ù·‚HzÈ.í«V#Ø8³ƒË˜uSïg̱|¾W|{擼EkÁ’«Ý•ïµÑç­Bª|§?æ}Æv!uÏ7Äj‚÷aû“Ka(_\g®|ãΩJɔЬܔ$Ks¥Õª\ª…s>xÕÀµðcH%" B W^GɳùŒßl´`Á–åÞ™¼pì…ïä#¡ãÂ?Æ¢XÂxD Ì"}ÌØ˜ßR38™"ƒiMZ ¢üxdlM^p޾Êvíu•ÇÜVoBÔÛôðþ¸aSãÞä¸S«B¢&0&rða*Ð@¨Â¤†(¦ö›møQ4¦€Âm¯–ðãT’?ìU5fXFNælé:›k/Í‘ªÑá´ÈÄÛÔÅG·OÇq:Ѫ–ñ+m[R´‰ $¡þ 0'Å„¤fìsMt#WªÚÈm´û#øI7e[Ú~+á:Û]QšLQ P#i4˜zŒ6°ä…#©ñfê]ž…ÈɇMÿÚ=—_ Êê¸-ÃÏ u!7гhôjÚ˹ë"KTÛz~  ÒµîKrŠÏÉC_(3 zxÌNƒˆnþÚ¿¥ýõ©ßxÈ ÍQõ¨¥ )SÅ6S':ªq«"‹~•Ó*U®è@b% €)W`4"C §`çFJhöIWçª*‡ìîÆ1†¼û5žç•{bgÌŽ=Ë›úZç`f6*GØ"u-vR³Y …ѱGŸ†]S‚­¹®VG,‚ÕÉ‚ˆÚƒÓ‹K£³O$ÇÏph± €1%ÂDÐX^.Íœ­Yùªx;"­(@»îAÖp€’B´@D  HQ ÖäñR¬n—ßÙ™ë>?íl7¤‰½0£rûLæÈAMK„:®cbL ¡Rô%0+½’9m6¶–}òØÈŒ´$esâ¶t€ÝY÷ýžŸî½:Yžá&^™ m°Œgò‰ñ¤ž©ï5À.õÌ5ŸÑÑ*“WIcœ³ÎUÜü~wÜŸŒ×ÇiUÙ([E&£¡Ÿ™}hÑD¼j¥úœlþš[.uÙdË5Úm¹Îd÷D¾<ð>÷iÝ}rÿð>·œïðÑìQ4Ʀ̲‘#L“9b0ˆ˜ÜtÌd™JS ! M r°i²‡è¥¢¸*û¢K>fãÜûÆô«y¿¶ ¶€êŽÜøb) 8EQ5 õ®7¼íùÙ gtP,©¶AP¾‡þË ·}=ÿòNú+äÜß“ÞÍ>Ljœç¿ÍÓ»ÿü{ö÷IÎv–¸öÉM~ßS]wÌ·£¿ÿ¨û:œ?œsÚü=>éðzØç»]»k–ùÖˆ¬„—ã§žIîe6æ¤9¦·KÏcºÄe•û¿Ü¿Ëî/¼\lvšò¾ž÷ÊΗ¿öúqŸÊv1 cÎ-%\È•@Ø ¸¦´XÇ1Œh‡¹ôe‹.b7ƒÂÊi£æ†.ðmÀ+yC^in‡h:;Újen»:–Ì]©FÉÊxgÝ>˜¤Í Òðš’É mŠ®Q ¦²^ݰq¯@€·d84ØU¦`_¾ß?ZýL4q ùàÚ¸ùfùÛá4B3ƒn …`zH˜a—ÇÄpŸŠ :žÁÈÎœÊ JÙðEk"<î%{nË=-tØM}ÙøhÆ­«ÿ£8óü£}‰t†/Ú?D5:ÈûãÜ'¼<²“O…D“¬¶ u¬ˆÔ~>ÇëǧÔú“iÂc®=äA»1 ѦöT¦"(áÖ§3ózD'–öï—!ãûêyœ¥»À'ZßÝoƒëÓˆ’ñrMÚ€¡avœ:¡àˆHA•'dd–@5Ÿi‰-küpO<ÔÍÔÃcÚ²öànÆW°Øòs¼c•5ýSÓQ@‹8åÓîºÍ;-w?ß§÷ã‡ò¼ð¬…¼>MýÞú.¼ô—ö™uÌy¿sø%ÖØÃ ¢l‡hT¦~…üö½ €o Œ NѤNǹ9Œõ¨¯/AmGìDVóLîy’œ®K¿ÜÉ"ž³®$+ÏF*óìëCŠæ}ê¸Üȵ3®_5<û(‚‡4øKS€PÝ„aÓãùY_èëïÿ½'çóàN„ˆ6lÃy²  Zãj «)ð¢XŒ7Xï3jR«¬r°¡2TßÏ éC2-R¯Ñ½Êm˜ÏEGQ’=©Ôæ%½œ/w (ÿMZ!º‡·¬Y«û¸»+¹èn;鬊¬Ú14ÑŽ ìL€‘·ë…Ç“è> Ð)^„&Ń¥©¬Õ£ë-äîh«y6µæw#®”°[ªªnú—õ6:r_Œóº|7ÓPK®%ÚZTD,P)SÊŠª‡éʉp?nU¾H*åXŽ2í8¡ìMLfe> §™§@ûΚÇð€ †$!HÖ>“TW*ÑoÛE[Ì R\ vuˆG²3³ï%ŸÆ«&€Ni)%0¨B?W ãÞäÐþž±L³`·êu÷X=G.¨”ÉŒ–¶˜Ö›‡å]íáh€J‰²mìBÊüà#Ù™¨5¯óVn3ì§áëS÷Ûy2/%BÍJŠä:¹Ïâ—N~~*‹ˆÜ_Á¸¹³ù©³¼–¯ÿÆ{ÙJ"G€`°µæù÷‚–¸­xÏ‘– ñÛó±é_˜û·zì|–#I³8¸4*mÙ´2ucv»ciãZ"|é„å ¡nWÝÇöZTu¤¦þʾý]çœñNC>ଂ/ÏrB"fc^µ–8?>‰JÿÎï£s«%«õ½äªdö3UpgÉDë!g:£Ÿ’š-‡Þrî^xðÊ•Cœ=¤Ÿµ;‹N®ïâýÁ.)Œ{ÚÇ!CÐêÕp$BeV‹W`Ø–ËäÉσM4ÉsÈ™9 z°õð6¸žÎ…²!¬Añ‹Ôbr`Mã7Ñ"0M’é.¯:[„å "ÚZ¹ÚÈÝ"gùøûtÚÞØ>?âä̪ý4øëÉõÜÐ9A˪ö$b­Ì$ö UŠp­£¿…ßš/@Üõëõ|7 qYñÒ~‘åöuÖ_G³…)!ùh”NaKÂóDŽ|Âû¯wyµùœoñEøºôÎ|}hÞʲ}l˜¸þ;`»&M`Œ¦°µ.|tP\KJ ±U™+ŒP†Þ.Wt¥|÷‹D-_ž~nÕ´¥§kÊ?Wæ¬"ªXÓr*D‚zÀ-ãû®ÿú¹ïqÔ3Jõ¬„*ÕDcEÐA£J¨p¹Jfîi0óÁt‰G'w bÏÊÓc€ )ñF#ÃU  Ñ,Ô]µ#5ØZd +’¤&PT cBIj &vb!ì ‡Œ>sÃu§j€†7/Í ÿ|Ù¿s¿ÐçÄ-ñ̽x'Ñ\G6CâÀÑí²Íÿ•{c†Í5¾çsì×Ç—¯neFvÅŒ¯ GZý[†ÿGÙÿs³µù‹Ó.«¯Ý­<óŸOG-o`|<_©2—¾Ä… iÉH¿Ñ[‚”Ìf&$}3‹éÑìëÕ݈f\ýúR¦óµ³îÅ=¹HvéOþW°LÆæ-⛳gv’[S3{"B®Žæ8~4†LŽ8&¤½¢±ÖFÉz!ªå•Xú’„¤ËÄ‹µ~·à°^Ö¼Ÿøýã%±²¢RL…¨x?ÚÔ7ñnZœr,ŽD[ñ96Å*¡ßí™k®ŸjŒ©÷w¯«/¨ü¾Fõ^nk¡ÄŒ³`žu~_Þ®%ã¶ýå°ÃJ¹ãœÐY>s½ùÅ'Öã¾Á_pRíóO†¿¸Hor¢pîʃkŧ6ìh}8Î^zXj8êih膅;–I–’WloZ¡» –$ëiëÜDÅðôu·æx`;â°B:“QŽÐÎuz»îli7öúå°{¦Ö(—j±5ZC¢×“aø$ÎéèrÛãe¼XYŽwSzc0Û”§îš1 4#WSc¤…À«Zù:›E1¥h˜£x¨—£lî»NR™ƒ"Yì+¦•]Üø´òDH> –ê[[çËó>ú³9“eÂä<(ë«\ŸéZ¢*íg¨¥Z®!>Z¸²ØôIÒ‰TžÜxxv¢æW˜(¨ùHšÔãöSO¯q?ھܞìÇ—éû×vw„ŒiF¥NHèÔbý¸`KÖ£!=$“‰å2Ñ1_K,åju?f€pÒ·Ue©;Kw¹:åßnÞ¾öQ~ »ê%“]²JG~Ë]ÿ:6EZªªÉ7üÝ{~ØýË'þê¦t,ƒ[CFóØ)±ÐBRŸÉ“:¶A\r¾ß4_ꆉœtROúŠ*+2ˆT€ G<$úL É9èm{æÏ¾÷[sáE÷£ñÃì}~“ŸIšë9«A©ãT$JkB ±A–p¢&õ…RÁ˜¨´mo¹!’™$ŸÖWLÈ'ѱEV´Œ €„Räôp¹—¸d­…š×ïvŸ0˜*ùfÏÕ2Ýtâäаz:ŽÙÒζžG©ª Œ[+ŠèÁ ¹}¥ð u*d5¢:91’P)$†µY d½P¾ª ô2˜¨î0I@E2U0RLZfE×&w¾3m<Ž´D·\üüø©ßæûëöë¢fأǵD»R¥ÎòC@a¥…dðâR¥# (¬˜d*=’wÇ»Et*3BE/t¢? ß¡½%®37 f¨B „‘€.­ã°8ó,u%žœvß¼I™f²€þFÒDdO7ç‰×¿«ÇK²JШ£ÞF¢‹$:€œBÏmiœåßϘùá<‹}«¼Äå$Š*'ºÎû ø‘{ße•Z(ÅÀ “-# ”0“)n´¸Ò¿pî úòóìmbAœÌruT|ù]öºö5î–Ë'ÌÏÒ/êÔzÔÞ ‹.t;OIyuÜ.Ĉ‡äÕ;ó ^;$$tíX’À£µ‚F€Êktà rxÈö€:Ë“9#ÊÈÛ[ÔDÝ—ë@@ÚvÜÆu,E–¤Î"!Õªè¼5czïMŸúrË2ˆãFûùûùs~~}9nï€ÃWï|jæûþ]ùTžÓÔ¯o%¿h¿á2ºnSÝ"Æ^÷2¹È<,ýø7þ÷¦ýr%ŒÔÓ˜Eò4}\×9Α:Í÷©äqs‰ÐÞDdÇoÍó=Þ¦ºþÚ@½3„ñ µÎ$GÌªßØzý†ÿæ¿:¿’óˆ’\Ãy ïN€—ÉYáZ·ºF5È@¹à1®ÚR°¦ ™.…ÂÀ:Æ&%’|å㨨Q= S—Ú™f ÌýÉPËqÁ°·šÍfÂ:oCSÆvÚL³fœÓ¾§NS¦u£­ÈP§P*ÖL”Ã5Œ  á4€¸×lÄGr¯ˆÀVy£ Áùð×а]YÆ“¿}$¢´‘׺€2¦‡Šîg~uÉùð¼}ÙGM± ŽkOü-Û°«Ë£e”ŸÛ?ŸíYF?Ñ’·ÒݦŠÍFìp©¼:([ï¡Ûïè*Â%"9X¨é™ ’è„FÚŠ²›å1«Þž±K¾ÁñC¹§Ô4¼€êöôEñøwùçˆ2+Ñ…]ýÐy÷ý¸²3–1uòÐúÆóöëÎmÖîÖ®þÉžý ŸúÊqòÄ›ör¬M¡¦š**ÈüsIŒ·¾J%Fa 4­jRÛEˆ#‡!¿ZÔ]‚âþT&8÷L‰Ã-?þ¤¥sߟGZ§¦ÍMÞÆyuz±f™c÷·ë>¯×P ²‡LüÅ&Ò•Vê^˜ºú²3Ÿçæµ98ÀÍH‘ÕŽå›Ü´P(EZleªƒeŒŠ\FÕÞf݉7ùšwÓ Ýx”†*…ܧ„JÞZHªdÊ[N‡Sä,÷‹oRM®=@@vᭊ­Bø¶xråþ4Ct»ˆoø#¶…ëN®íÍ‚ÙMC؉ŒVé è°éŠËdxòn!†Ø„5yp§¸Èk/Vkõ!XçKöרèU¹Bh-pKtE–nGÇoG!76TA}ÞãÉ:ílákôÔö -`Ë-#;äƒHí¶(`{±°Zm#™Àî¢~ÈÊÐÁ>„§ÜLwž|:˜c;I@ŠÀYûÜÉr.$B1%ý¸ÆYæµ^¥á|ÈO]0bwSMY3y³÷ð`!Fó YTð<þ&ððý-´¨n:ha=A¥ ÐŒØ;Žúl:„²z;µ‡§sêQ?‡ "÷ƒ«Ma6º®ë¤Ð-šCO|7d?\|Ðçß Î2ïAv‹•#ÐŽ®Ä•¾obŽíÓÁQkZߢ»™«öQ( ³&õE¼GÀ:êD’faWáÕÃå/௟§{g>{͇§?æä`Ùû¸ýBT6­=:lƒ7&3L¬ŽK#¦1ÀeÞuÕ××w¯]ÅLûNR$逯M/|¾Æ¥«°štÍJ¢>cÑ”»Ö„Jƒ^$ð,Õá°c‰4ïØ@}¥¶aM¬M]t¯¨Oà>ø¼ õ·5f6B¹¿EË®ÃvB›`ge•e —Œ±Ó´$ŠŽp‹éª²úfeßE$;Iîx†Å‘}KnÊGŒ4Šž#™ÜvÚ)V;·„"…Ç šÇûŒCêºZ2•/ªÌ^[á$ª¢áw`’5c«¾}+ÍØÏzI°gÛ¹„…»"BXÆ6ùŒ*®YÛ‘”€¬$  jAX¢Kéuv_"¤V…™ÖL6]àˆ)D,MK}"šc¸¶Ô§ùä4Q£R %¬`8EVP­b•i,£YËlCˆflä½é«#J4󌘴H@>ú뢛G¯SêA¤Cõ>;U×Äü»v% c Ÿ&H`n:7Ù×T;™Ê“}š'ïû§gºw_˜…³zŒ‹:úà[ߌ~¦OÀ¥ÜD Ò‘í™’ùRÞ¾–·Zûo÷ü¦»–F»¯Íê!yWÔMNÐ7½oU…„éq¬™‡Úo2¿œ h·»ÖTØ3/š“¶ DÔÄ2î  îÒ£AÛ£¶ïÀ¾2eNjõ ß“ï,5]ŽR¾,sK@‡]•®²X}c½]\aŠW3ÝoÚ;òìrFkaqñ»ê›¹·GÞ~L-<¢ƒör·¼//B‚d‰k4v´6vãLWýV{îÞV](J–ÐVo.¢£O4ŸgúÑáôá:¶ ñQÅÀJNÈ¡†Mú>ÂíÓM¶WŽ’š £cmvµ|=·ZáP1S˜3Wƒ$ÛàÅÂ/mÞ÷û²÷¯þüö…ëä£Þ"mŠ8&DÙfÌZ–žÂ𢆾z퀍 AŸ,ů"€A_'AÚoÖfJlEwå­Ž„7 ·­óÒoûЈ ÁßnîßO!õ“êSµŽ"gËׇüìúiø`Rg!2TÎxU8\Bª<cÖ®M™˜ŠÁoîÝ"$Ud‘«EZT¬*4e:Ò¡UN>\"i°¨!*.² Rª¤Š…l®ÅwÓ]ø«(½ú£=šÀIjªQËz”ö²‚WœAZP\¶`¢0fAÃs‹Ïi+;¿¦/ëÛ†›i¬uà‡4×ÏÛý+Qbt¡þ«þbþkµ†¿šä@Ä@'ƒXpJ…4S¤ˆ .ì¼Ýá[+:™¬á:ƒ°ÅÿƒÞ‡¿T?À ÉxÿN|À?±ÏhÂѤÁ fÌZƒÆÑ®в›3 á‰'ïÏý—3:Ã3íä!³ÓTG7Y¥µ‚B°ÈöáíÂïŸM¿òü"î n.æQâ~cxqßóÙh2˜$5Nöékôöz[¡– ,2C€( v˜ &épñ¯cåÔæýíýñP ¥ P€PñzÆý9—w3÷×õî)vÜ瞯g*ìðc}~ˆl5`å\Ó³“«Ë'åcÎÛýýÇÞÇö›~oä>4 Šø!‡h f¤Ø ›5ŸâQ|²P¥Jtvé9lmÅŒìiˆ«¾‚ÀBYŸà 9¤ÞE÷W_ú¨ïf2²cnÆ÷—æ_ýLþñÔg´A ŠPâfƒE_{©§zÒ*¶z“NžJé="3æ†JMë~޵òÔi-¡9$igÁCQÆT²O"©ÒKiâÖ6tG¾¶ôxã]9LáÁ¹‚…ˆv¸•‡MìÜlðcÆs‰—Þ…ê÷^?ÿodnât—JNÙ;‹Àëî:&é͵Œ&åOFWÁ‡`œ”¬ÐmÕ£D¡ŸJßÜZ«¬4Ýn¥eÖ¬4v’Öû:ïñn×½ËußTe°ìc{<*Þ+?äeºi—ú8höCZô@u5Þ‚@Ím G~[,êWùâû8@¨NGX~X>8nÏ9Z_'?,céÝHV<àhé†èˆËì 6 ;…(¥âFèëòyÝï¾éË«¡KJ£ˆEÔ‚]”ZB€S ŸZAgØ.aÅÏl³46Òßeª”ë;Ú$¬é[vR9õù|9ŸlÏþóŒûóy¼%ºH>|ÔJ™‰Ó?nŽYäîl L2œÉö!]ë {é;hh<1#YÜD‚Dd(EBòA)Ò Ú’£gMS7Ë=¤­Ù)•Ò>ô\bêë(,ºÚ„TVBqMdhî‰Àî+nÃ/U‚"%TÛú¤h*\BÜcŽÐdnF½ð>×Ò=Ó¥B¥ì KµànF,Ó^\bw'H/Á g+rîQ_ ¡aê‘„û»tGØ kÇ›ì“ml92TäÔr«çÊŽ~ýÀß·Èn¼uc‡äWíäj˜*½.ºw}¦ºp/˜Âº€të`EtàÝ×ÕøôÕ{N¸éÉ×¹§j¡Ô÷*mÄXBI0'oÒe•Îv$Mx¤,X"¬m—òP™‘ÛÓIb$á€÷ZIc#d<@–üuÑžÙ!?Þ¸³¡†¥lÃPôÄFapo÷WF’â ­ú¨IzNÙ®L"mE‡LÔ|¥¨"¢1e(E›Ïì~È%¬p©.!°_­¿Ç3ó ßrÃ|_­1A„qÁi‘f!NTáNÙ©y^Vw,†FÏ­ŒÏ“§ÿrÇ2ÿ8ç5ë;ì}¯Ò«Œ9L¾L¿g´“5ˆòÐeT"G¡ämÚnu^Àò'õ$ËV÷xsxUÕÉ®/367ãðaËiY²¸Òd°;Gímx3¢•3‡öøzHâE±©H7çõÊ+ëŠÈ0 ò†æ¼ ­$-B´§^™.nœ)¹f&â%jr?&Óg(wêß•L¿7µôªpõ‘à|+[·!ÜEz`êFœòFëÚ/`PvÃ6äj.wtzÍIûŠZOªhœè}ìþz’LUw‰·l~õœó!aíç•,»»uWàÜ¢½!}?˜ûáŠ?çîm°#¡–׬µ{A;v­IGs€•HjÝqTfªuSÝZ¥næEÈ_‘~zß™Nñoî©3$”ö³*Ó™„?ÐTZ„!ƒêâj­â =(*µûhdÚv[ꀚ’Õ¦ æiݾ0-†Irv-²2qÎ$âhoøþýÍS«E&Õ(&vGÛgJ˜¤_ϾMZü…7·íí}<—ò(XbQëyYdgÝϸ Žˆ(ø\Ó©’¤›dµºÉDª¤P³vÑFHØnê§?ÊXÂðÊ–m W—’è‘éìáÖÚÕÈá<óHy—8€=É´ô&å¬eK$ØÆVù :Ue1L*RQÕ‚rhfÉH8"SiUÉ;‰¤Ì!‡$eqr©»žTmÀ Îjcx~ÐÇt×ò´ø9Äzßü¼;‘ aí$(müÐ8±2‚ÁI«Ôå‹1om£xVyq@Õ L5ÛÞЖ5²ƒÓî5-ò±¸œ; ?pl%,+ÊŒ<‘#1]ÍŒûñ^«EíVö†SFÁ¬#ÝjŽÈŽvïë…ú™!£ÒÈeÊh®¶þ+ù¯›¶٠ʚěëk}Ð?‘p‹E<Fg§q¹ L±WR1$ 5“>¿ÉÏíš|6$Ú œÜD?¿ékÆ\uú¾ü×ts 2p†¿Š“ÿš~I Ö­xÈÒA™,DÁ"àÁ‡NK,=£ htÄSR"b©þ÷ hoÒå| -cKÀ•“Q@ROFÛ:AƱʵ`È1–ôè7P&äÓûßÌÜX’Ñíù<²ßÇ}hâ~nT-+H©•©#&’­ª~Ûîùž¡$ä‘Ë1«ãã<Ÿ€3‰fÊ€ÝÙ® ™ÑxÂÀ`0ŽÖx3@€¶ht‡lDd”VgA¦JuDÐL÷Ø<ë;ŸÚêà·{†ë xz«ÍfçýËk¹m6Ç=RP#ÏnÞpÞë|зWïËÜiGZÌ v„h*Èp%%É*–,Ü ¦<úœF+ÛU6aY¸É«èª6B^LìÄsÁ ÿ}£)œdÌæpÀïlÞgÉOr÷kg™ÿ©ó…ýóoœß07ZеoªÙž=-´3p [<ïnšÞ‹wy®édºFª‡gŸa |îò\˜œû|ý}RÜäjÞgBJÀÑĉ c3s ‰‹Õ­,G“U‰€6Š¢Iá“ù jéÜõ^JéÖ°—D^'©Šs»úz½ÙΙ¾‚<†ZB\tTP£2t-¨Ö{Mîë?Í3×™B¶r¨Ð1Šüfº†–NïìŽ]568'CìZÊèzÒmÖãÍÏ÷ü>tÃ^íÈ‹æ¢Bé·í: u(êÂt« Ëý>àIá7!é ÝmW¬ i@ °1ˆÃ~)S¯ ™š?¸Œ!º¯3»=ÔÛ #<ÈÊû’Í®sw¦’ã´ø.i&(,Öb“ 5(ˆO,ábvDá8F\%Æ æiß>—sùèÈï~3‡k^µZ=¾y¾þ¿‡\×ûÿf¬›X |ó±ŽÜÖ·òÏÎà8‘µßX/‡ö€4xHiyúp†ÚA(Üè†ü…^åYZŒha nJ£’2’Ð*5ñ€ÆÇÊøŽi+¯)ݪ¢Aˆ¢dCÚ'æe1#J"Ã#A a¨Kmr—œëºØW­3‘ˆ íJÙ1=ÊêQï˜À~Ot$êó¾ÿ`yÌ3}»+õ•¹%ôxê{¿½ÑïÃðµçÛKÜ׎QÎ-íysE†.!B…’¤àäïÓçù9v>½¥ª’(E¦ŒR5þ+qá ?<‡C{±ÿÎî%ÒJ.ïñ ®ïÔ²_œkP¿Ýòâ}N4ˆ˜ÇY–Ø·Ëöëïè§s×&V’ífÂg`jt¶h5Eüorr7ùúe!¿\èOßoùûwÌ>—’³î£¾ôF7Aιù)§QlÔÂäaãNJKà…ÌB$*}ÓU¡¾JÄÚ­¸’´e Âv⪯(‘t¯ôLŸƒH ¶–ãTÜ»Wf©FRcÙ8›q=±}úò‹û«?̧åZƒ ù˜=²Rc-/Œ3Î8vÃthífk±±Ûjà)¿õý’’L‹ÓÐ{Te ýTª‘âªù›?]Íï„ÿ ÖKý×Ð?1¯zðT/įƒ$y§ÓŸŽ/1o@§(êK´»»‹ VˆÛpÉ…M¶û Z­ !GnÂ'é1t­Dö¼ÞBú(\y𨢋¢‘"Åë±8Ý¢y€ 4. Íôt­M-UÑIâY­³áŽMÁÐvV•‚ÊñË«„ã>šŸÈ­n™Åމhm7 =$³gÔÕ'Ó ¤T€§y•P‡;ï~¯ðY‹N:®B?]›mV˜…Qä…Ê”¦ h˜ ªˆÝÞ¸\èæê¦€{£Äv)•2ª¨[<.Fðèáîkú>“†±ÏŒ–žÐ#ŒT"dròq÷›¬¨êòš:¨PœWÓƒr›QîV6Ð@=E˜îóy'JB‘ä2¿X*¬l(3Rb«¹ðÅŠž:î8§›© ÝEÓƒ›}K¹Ž›NV “² iälÍ‹úðVþ#Àžä¿t÷ãeÖòÖ/·D÷2ò@ŒvñfmpÓµclcPFŽ—CQÊßU­Þá—Í4ªÂ/Ø1ä·û*•ÂõŽ;»‰ý)1¤%–hU#D¤V?³8Ží}S- +ZëÅbóÈ,ô¨Â½û÷$NL«F_nÄFçµÏÖk½r?éŒ,·¶‘Ø7îØI)ÐT†‹°'Û·“”,tö»fa°ä¥w»—í” j—þ™îðþ×soþ^ºÅdÀdÁ˜Q‡NJ&m‰Ä<¹¢¢}}¹:ãDê¸9çöï3x¾ŠTþ9å¼së£ç`×dCÆ&ÅmØÏí:QÍÔ&:4±†mÓ.´ººw‹±GjnÛYÕu·ZqúŽà4±B¥Ò”VÈÁP–#Â8äPº£e)F‘™:µ`Å ÀO€÷£~úÝóî{,ÓRg©ZêÎÊ]{¤w¸'$\!‰°ž—ºÂb—¤2jLÃÔXª³Ðª@s¢RÄ©AY«H-a¼z×(1Sñ’­Ü²lDë2Åè÷dµ37#Òƒ®Úëõó|æñ´âº£Í8 ² F×Ò,+CPé§üLô=F ‹Y?Ò3j;×Sæ¸gÏÕÛî·\ÆÈ=˜ u®6Ý‘­Ê¢z¢ t0ȱ4˜$Pc<­òæÝŽ×ÙêÛ/½Æ’·óÊV@z| r:fTl3.S¨äR4'L¯…@›XÃ&“@ÐËVŠ„Jj©‚Ò¨´@¨iºLŸYB˜ú˜%NÃ&^Ú•¢¦ZãŠW;¤fù€+ó¶¶X9+`¡£m(‚oÉ ‡pö‹®gã£;½a>K(Í5¿Ïû¾ŽOlN m\Àµ·ÁêÍ’Ù“áõÒ!bžô·¤‚œ~a¤óKÚ.›ñÇÙà{sç,;Ë9P‘÷ º î¹çœ<‹Ò~KdCˆOº¯ý:ñØÅ•1€‚z´Çc®ªf+¥ F§d޶ F¨Â<È ®áò"Lÿ °pKWj'©ù¶~ôwà^ûþLøÆù ‘Ñ Kýa„…š©Í&Ôo# †B5m¦qåëAa~K.\NGaY/g—¢UÕhX„jh •=2ùø£ÒS,cå÷É·dÇûö±À9€kéYŒ®Ú:#¢{Ÿ®»½‡û X¦š@u 䈽æ…ð$ (Vån) ’˜s|¨EQXäã1¥oÓB_Ó¼DjL$†+ô† æÈ‡¾5a£íçŒ2>Á½›.ÒoyjÇkXCìIí=9Ò› ¡3þíÑ—n¼7¬²ûÒ1 uÉe”Z˜TÕ,+Æ ””=é1ø5¡·Û¾µt}’¹í·46,#}~ŽL®0oqæν—ïÚ”ºEft£ð»aî•Ý¡[‡çü^'}Ö3æÓG”=LïD6ç“g¿f»ÄCLB !»ë‡§ƒÙîéêR­ëßócaÒ{ —År;qʇU¬Evôë€*(òè4„ÔaÁè?&#Õ­=&Óo«KŒÃ‘u0—G±?¬~£ûS U\Õ*G—k]ºJC†ñóõÎó€<yn¯9ŒüLìÀ­É왥|´üåÿþŠù{dðúL¿ú„Ž– N™ˆ¨•®ReYi¤@É!™¹OÿÜÕêû\¹ølô¶Ó;E:8“C]1PT¹>[*Ž ŠRDÁC¢Bç&æ(k0ÑJ€r1´‘®® H–c!.èmhOy]k4nêöî½>Î<Ü¥\ÎäUiä n”èå;»ì\óÈ#Â:sv0´ I(`Ù@! ¤fJ°Å²„b‘Š…U©@ P$¦¯ Ùm¥#| ´#¡ºŠËvhäݽÿ€ýOOq£ì>wÏ7ÏÞä}ÔûYøý¯xI'?žŒç»áõ|NÝþ¶»{t‘f”jKÓÁðÙU>x¿£……ëžØàD—'kZ’óì‹Tae rŸÁ´¥IY¢$Ù`€N"á¨m§×ëæÙÄ”·51N¢ Š"DÁIâ|4”eW-CøPÊi#–O÷‰Ý[{ƒn¾”‘]‚•ZÄÊ ÇB„^L§¹x¿ù«\SèF*¢AU âÒ©H#o 6¢ºÖZlG˜qÿÉ„>’ç'Ï~Âóyüýš›&Ç=f¨sLq핽ßMK\©žÎkÙ6¦-í EÂb`!ÄP Ï®d»uj0GXÃ,Á‡X”Vös¦³£ûÔi(ëZ!4Yg->ˆJZûzY ´.Rm(Õ£JH€\ ¸šLä•{YxqI—•ÞJ@ˆahl@nøÆ+·}|ú|æà µ;Þï‡Ð½©é4òÉíƒó0m:#Õ,¢ €]¢·ìlj'u$Ùþص?„ûC$˜¡Y¢pgr¸:ÌO<|&Ï[“›z]ãIÊËŒ@a¨] 0î¢Fï5ãÊtÆ®¨cßÅ Snî6jk¹c›à‡U¡Ï–®ê`Eq¤ÐüC`ׇv½Õ:pïW·rµßº>¸yº·…ïY;~jªRß••Źí ã— €Ý«QQ|ð ÓÌ7á ¿nV6*T`V‹ÐAT@pÆ¿KB‘cM\GgÏÖ‰š•q|[úKüöÞºöË+ÇíÌÕXé)µöø…ZûÕ;Rá‚DÕlÃÏP üŽ«BÙ®yM½þžÙ¿3Óß×üOVùt<(iç†SÇmßœCæ.NÙqÚ•2aG^º„“qi”V#ð‚•oew]ÇÁŠ~Q:a‚D(Ìmݾ£Òr&«Œ«öUé ¥4•Eâî™Û ²{ÿHÉ©j}ÂöWÙl>…¨­MÖn<ì grá,÷À¸·³¼À§©E.zÏ »ö&pιi <“lbÔ¾ï»Þ$\ØÓ´Ò´äáO!§’šüMùÄÏ@¥$#qe½‰*õžÂéM}3+zTVã…Ñ ¡6ëØ–^!ŸÇŽê”–ïž3zP¨Ih'!²àny+f’mŸÀ³%¾tpФ<ì´2+‚Ê®è螈‚X-–eEŸÐ4öah/ÒwW®3,Œr¯úà4 N‰ lGL'«Óäpòùï?çä\r>M•¨nåmUãÖi<“fGOoëÝ|,ça¼37f`ø˜q£iS>–êr¬[i;FM¢À°ón6b³ÊTḬŠÂ§¹T™$qi«¨<ÞŽoŒŒU(TÛÉ`úýžˆ ’¥¶(@ú™9$"f"}5dà‰[; (}4ýõt™íÜ3ï:$Û¦sújÓü½m]ü <"{HÛP'¹hà È3“èRAÇ| ŠGøÝÌè7ø ¬¨‚0TSX ØÊQˆ°ê'° ÇÎÙÞ@´©[å2¤ˆ,I¼»YvÛhžåfUU.Úp%]ó?’üµ`s¦1õ•_îë*B@=Ñ_jcŠ¡X„DÜëÁ¦Œˆ–íÀ9äÁŽ£“Wôe‡¬‡¦ÔÒÑ7³ý0?ìO²ÐH%–ÇE†éóþ®÷Zñ§`WúíiœäÍ·Çn¨AñAW ²é4»6Åíu¾]5O>¹Û ŠSfËQr6ñ…¾ u»ך‚k?¨‚>êJ]³­¾B nNÍ3~í~¾¦ –¶‘¤8³ûui®T©žzíF,â™&›fD,UHA/)D .`GI´áe+C7·T2L€U«ƒX/k%ÕTBIy=Zè XÀ¯ð¼ÿÈù[Ápâ&tíPRs®G$Ð%»Ç­ÉJêàØR/§-û5Ƭ¾  UCvŠ™ÏŽdßÔå&£œ[kôÒJ0¡‡T@ÔÚ–Ù Ï ¬b1µ3BµsÌeïL±sæÃàl+úŽçWòË{_ðH4óu®ºé%ÑÀ—Dѱ´.¿ñáߟ’꜀¢Mš©™Ìa/S¸Wø‰bÂBMùcxš)1ÄM þ¤&,€WºÂ)zL89 iË@4Œ¬èˆ¥8P⬅ 5\ ÆåÝŒæëü ù$’­ÁhX‹Õ_Áíp1“-T¤XðfœŒ™´@9é¼>³~HIo^ÙÿÜúf®¶>Ùõ©kÆËr vsû¶0›_«ac“Ñt¦ò‘[ ßOn0¦ ¡F«Ì8èÖðú’JÀº­ãiG zZsD°LºX ×Ç[S{=?™‚t´Ã¾‘_íž¼ÿš—`íÉZ»²–ZCÚ02#ƒPú{sfÈy{;û1•êÒ EÖEïšÜDvJ§ (6ƒ-Ë"Ò]»Ð\1}ùéŒó_ç°›Ÿ4|-öЇŸxþUŸsùÆçÝwoôVwtªfrhÒ{aß.‹ôÄkÏõü|DæEŽp§=X˜ù¤x>²…'ºC@q¤²÷‚ªk»ä.={Ÿ—ON°štõS¯ìæ&ª¢§*·R‚k„4¨ºL ݲçÔÚ“…½.X)LRÈÙÆ[ ‰@À6ZŸÊÙz.qvä>êN»IÖCö~w¬AOI pèðÜ>—l‰š˜ÁA{@±åÕ'·´ëÌâ<ŸŸfo1OþrRàÕY„Åé]Ãè¢"ù¨$NQÒ]~¨Ê…ÀOžŒ©¤(õѳ嚘ò"’ìt¢#6²¨á#j§§Ï7ï]^{L¤SV¸«UÙé¹$U¦ð¾º¢q$Ññ§œ’¦àQì:­Š+ó@Œñ¨4”Á‡AIP6H£ÄÈɇùÕüâ>ó¯9¸òÍ·~ÝüíJvéŒõá!U¸F·b CӜր¢O$hÜ-ï‰ãÅUÛaïÈÏL«zã“Þ—%G¡õ™J]{î[÷tÒf +¥êt霠¨T'}¯Ê/§•|D>êìRy\¹<½ é•"`–+–r]Õ³šs·¹ÙÙ §äûîuäX«ñpÕ›Þ§¾¾ëçz¯Ñ1 À°aGC]D[M:5Qop‰[ÔKZª#E FE`˜Þ$0 lµ"y1ÓÐð‚È ¢‚!¡Èsˆp1âê-*Èbí^å‹úl÷Ù8çÝõ&V…kŒŸpn}wr¿7žoŽøšøêÿ…8†˜æŸ!`nb÷YŽ**˜™—¥&7S«—áˆKPœh@‰r2ÚĨñJ*0´ÀÖÙ?ˆËûyƒû!;8ÝqÄô{6õ"–`AºØÏÒc·t ,N#«1ƒ+˜v"ævÜ1¼Ò¯C|üøÁ8}¯s¸—¼/H0뀀V°Ñ9&Àñç¸ßÅÙÕKôs`þ«³OÕ/ÒߨÂNç$OÛ-„„2«ÜH{3€a n4Äa›ÙìÑ0¢`„ À ÖbApB9Öã2:ÓñÑ{ž–óÀÛÆåDëqàqa/ž·™«¿³Î£X²R 5åÌtÈsʶH:éâijQf‚C…qDyF ‘q0!?—„ "'C“ (SŒÕÃgÛ B¤¾§·ð.ÌúÞêxÿÜðô?òußßçÝßÝýƒŸ}Òb¼Y_•“áöìí± )Ÿ°îl©+GV[Âr¡ž…µPc§g–ò™`Û!ÒÂrÔÀ3vïd±N¥¹"Ù‘ÎÅž–¹pÃ"x8P1Uº<ß”:Ÿ<)`»–DQ·È’6Ô‹Œ 0 ù!¦º®h{­ÇP=Ž]VQËœí)§ŽâB)©oû‚‹äC®8_ŸY JŸ ®¥ˆ˜qË£~…]¿õÑ‘.üGƒ¡~+¦•ÅÓÇõöWõRnÿ™³nùqyQ¸Û*W®Gw£¨ä±UCçJU¬(‹\>€‚U,ȶH£iÄ®¸°²W„æ"·(×''þ}}B¤Ÿê?q×oÌÜlón²måŠ BíˆñT¯ðó¾3ï.ÇYWçÖríÜø añ”ˆ^î·9C4¢òÎ4´ê¿‡–ñØŒ8oÝÖ©x†ŸîÔÛ‡nxYÌ£ÕUxéœ[_J[ÊýÇ:ÿƊϵ7Z&Gºb`ÆŒñ¢†?s2½§fÁ>XgÊÐC¦W/‹Û;}Ê¡ê0©fŸZ?÷O¾ð-ÿ8˜6I-6™ÈˆH'´@'4ìPìðÁF\nÜÏú’Ï ÿüOìï°=K†Ã‚в'>„CzØbp\uL»¯†QžãwäêèIØ–.&·&ûb•qÒÎ7Ñ—dÔ$‡cÔGÃèô®‚¢«Þ[lÆ+¾=å¬ðZ*—tÒ”.º‚}Ñ5ت¹”  EÈ L;† |mµ•Ç(n¿ïœZ©â5]ßè)•ÕSy%: Ä-²B ¤W@Ïc|2VZI=/ÕÒ­L¹°+ß ¿U\Â'²cf˜ˆÚi@Üø¬,¬ Hتn$·lÙ+r€ Æ”˜¯š«ô®rPC¯æ*^­aÇ"osyÒFEËÁh™YÛ¢~G’³HhO¿Âˆq„ÁT'Œè«tÌ¢Dð­ºÉ6nƒGvN®§Ý4[}ayEUa ÖJPh1;„#²ÄyT0é3h6ÑȦ\ýÚ?Õ³3=µë„º…Í"gî ’Ìf´î» zAÏBrW˜iW!õl=¹@1–ÿÑ?þû?ã¿Ð:êd ze)ìvzÃ’¯¤BŠ‘À$‘kÖiHÛÒãXRÌÇ Ásäu#IO<­è‘]åñR^8 L;Ûrƒ¬’‰È°Šsè×sÿØþç€b˜E¤7)[n £Û¾„ÓD *‚MWG {ycuŽëÔâvEØO'Hb&Ÿÿò.[ãíÛYxë³ýâx{t|¸ûû›ùml*<+"’¬ú"Ï}ªüîT]²¿}Ë]'Í ›üxy—F—MS•X]°Ínqæ>±ü0í'pÕ‰¢ðñ¡¡ ª"Äô"Ò‰ÕéáŒáO:#; i¾kQŒVÞ2‘“,цGèÕÆ®”Ww@-+ý¬ß?²ÿmäÏ R«ìcº¯öÕ#ªUYÖÆ ð‡Žbø+¾Œ‘K‰õ"‘eœÑ"›‹»q,ÓKQ«é#²pÜ&cÔÏ€[§º8É‘GA·/ð0¯PU£B+¨\¡ÿÅáW«ÝeE†€çåk´M–w†ªÏaÀµÎOÖ/Ø{ü€Ž»ôøµ‚ò–¤õ%«ó)áª>¬V‹Éö{3‹œÝ—§©?ø±:–(ÅVï>ÛÔWS<ŽçÃñû*¨&~‰*dð«ckëÝü¦þïð/Ju¥q.¾óÿýØûÝ™·’–àÁÓ¸ã̶lû1òyµ0»ß¿Ç׳;³[ç ©fú.ÞÜ>ÚEb"T?‡¯ós³~÷4úÒѸ Û=lëE¿T”¢'Ùµ1ŽÞ]f0£~Ÿg}«7%¦ô"“ ^\ˆ¢¬¹Ï‡A›]?uäÐ(c§´í–WÒaÚ©A+1zî(L» êÑH(Ö¸´: ŠC…e[R##É0¦5®Ûé‘>Dò‚bÕ¢“C˜ÊîCg¿ô›‘D©ŽšÏ~^îùô'Ãf6Ü>ÒÏ‚8þKXË”P!“ˆVÔKœ‘>Ç»&@” ¤@Òé BŒV®q†Ù`¹¨Ÿ|9ë^«/“¯pÞhˆ±{(z¨Š°ÀaÝ^°š†›rw‹ÿ}|ƹq£¥íØN¯—{úe˜t¶?B>Rí¬H¤ÄT@A!Ô ´2¬A =¼½³ÌãÏì¢y¦Ó§>]yøvî d>ιÀãÌ^¤´ÂÊ0¯dn†É5ë*‰-bÍv`Š*1 ñ°KS÷”’僩A»1r¤MßÀ9{g¼M8¡qsUÍ]ÈFª3gF, ŽÉäê¹å‡Ãçƒ:ÖBÔ °NìPĦ7AÓf=yEØ놫äG<לÊVùD‹V>9ÝTËÔNaw:ˆR$‰B#èIŠ­L’¯*Î*w‰"ýEçÅ îu¼Éqöúþ³ó¾ ì.b¶Ç±h$לD d$† Ь•÷³ÎLÏ|ƒ3õeP­nÆ£2 zw~­˜ï§‰ÀÂRÊP9}ÔµKß>>åú*Ô—á&=Ü•hÅ¢DcH]uÖâ4­K¥Ìk¬m"ÛYÀ¸èú¶&Æ JÀ@ŽÜOR¶t¤ücö+•zПÂÑÆüŒˆ‘ÓÌpf3m£Ù° L@Âfdég\Õ¥½+®}­Ÿ™>9-Ö¹†Q'€‰6&ÑQ+oj PQ[4<Æö¶ê×r”ËÃÍÅÛ÷\6iI¨­ræ9”²J—ý· åáRõ¯Ñ\¨_[ÙuŒ¿»ßûç% ïIã…îøîĆDTæEÚcÊá ߪhïh°”üÂöi‚~ƒ€VHÑ'éÂÀvr|jüp˜Ã üLáQçÛyz®œ®*˜SÞáaé+’¡%“?}ö¿öàÑY‡ü´¹<Þ!]€0©Útu·qyèùÁLg¶”‡)—P§ éô¼üÀ@äÓÔ[m×ñ[¯OoCý(Ï1žÝuOŸÏwoOÂSæáôã‡;.ÙwuâAû…)Ežø:Oìü1×ä\‡àìæxP $¨éBB‹?éð   µ"ˆVªÐR)4%Ek(õ²¶ˆfÍsH>ØWÿ§'ãœaÓø5ÄKÓZ>:6$F J8ÓÐËîviÝýtD (D0RHîdÉA¢€ÒãSç{>yr~?¸çe> ‰øÛû˜½ð®gQ£;2z걟ÅDtÈg GÜt2ЪèꥪgÐF¤EÄŒ:+t•rt.¾ÒbÊnåîNnÐÒ×ER¢àNþ:ü4úèíì8;™Ï-éEè©·iÇ1'\¹ØÈ¾ŸsM}öyÓ‡j‚8À¶eöœŒÏ;Ê•jä¢;Q…éñlõFcùÔ 7ÖžWÙ2á*jÂ5:0 ÃeÐÛ\ÇiËÑ@ðM`„ÏŸ^“/Љ×Vë–§ÛLáqïïéót~(y#ñR {Çîë‹ý¡¯ú«&À3„žÖ÷ÖjM\…Œ;pª¢‚eo%!hµÌÊz ¾XK ‡—*Á![pB‡•í24C‡ÝR—¥ð<Q{‰@Ìf—ìëê©8Ä”%™2ïÑ£ü·Sÿ,[º'ð{D¶ª=¥‚ºíߨ@_A@‹ S¼."jâÃË•7p°…)Ç•œÚh¦¬ Í–Ek¦š8U'õör¸×í â:ÇUõžÎ¨L¥·åÁ2½ŽlP{?%×ÎIG´ÚÁ¨3à+ðtR;P0b+ =3&ÍLL¬à°÷˜ ‡Q*ðü‹(‡|ª ¼ÏéÏ8iF.YkAÉ”Ôe E‡&ã H“éoæçIÞ–6eŠ! gçÞm†0f v™éÖœZ¨QN¶Â@MÃSÒõå:†”8™j¥¶PHD†{ZyïgÁ?Fªbè•úo+**²“ïÔú°Ã2ƒ†Zoõ™u¦Ó›sL»¤9¶Bíá à ÇRó põ¡(6qˆy¨mŒÊ: 7î]Få©£üëøƒWlçs÷Säi¼’Agd·rÍ<¨“°QR(1aä”%ºdàyG¨j1ÑdÍR—MIü#®­‘¢` Ò‹ñhÇt #²¢¬‚°‚®VÛgÔáúÄC¾0ãÖ·RhKˆ«ÕiFUçÁçƒî –‘÷%Ð:„47Æbì¥S8*=^d}«ý`Sǧƚ^‹PÔ¥‡IàähË`»tø;¨ƒ%g®~dRv]ˆz¿m:\¯’u-ã¶ ™¶ %°JwÅs­PMºbO\ ?J¢Š‰¡‚TE2‡R4}bˆ¡]£œTd¼Éʼ*[ÀÝ5u…Sè‚siÃg¨+©ôÔF *B´¨@ÝT`!Ëëv•_ËkáFÀ,äk7ûtþ{߯:2™›ï`S0CÐ+Kºdñ`§¢H½.2ˆ‰XcQ·+†"ˆ!‘„´zŽ« "c’ƶÓSŸ©ïñýNH¿Eos<ŒÆN*¥º«‚Jsü%tå'õS™]RC¿aѽØÝm0ã–ñ6·H&×¢Ÿ7Ë~ö×i±ò×Áä`X­@ë{5Bp” A1õ‹ž¥Â c#[³œe”iå0Ë4 °¹½vÕÜI;=¸lî–ëù1l1ÅÒòçõo!R›*Q§–6î%[õŠÞÖfJQš@²ò"_€Ð\—í&Þ¡5§(Ž‹LgÌ`kQ¼öîD7ÄÍ%ºÇh_r¾ó. ´‹ 0)PLŸu¦¾]~f÷‰[nfMœØâwqSke"'‹ÍhíTT›Ž·?ß/ÿ—ü³³ žyöÏÞ–ž™ÚΠŽB´Ä aV½ìL‰žfAWf¾¾Aþ™ùW?ß7¼Úí…"!ÇÜŠ¢Ë®¡B« ôDF‹±‚RË6l¾e–¹NÆ]š“ºÞg¼²ŸÂžÍý„µ]º‹ î‹[®›Ul/q¾FEþ¥3?µõꈰóŠú? íwOÏŽ1¹³ v<|/>Pµº{ŽmíÌëCÞˆÝà>MœŒÜ8\ËD£§AqçáïìÙ»5Œÿ–·í-å³²Or~½Š÷¶˜/{>lOE£fLa©uQ4€9;§¥+¸ô)šÅk^“øÓß±‰« ãvJ« J·þ>×Ë䛼­ïœ,sE¨™–¥uo½ÇKl¹ÅwÏ´ø ƒÓšx†Œ:ð—Y1×at ’ð˜×:}Ù‚£).H“Ž`möA–¾©]UôIÓ0|ƯöD<“É*4; ㄵt —=“ç`sÔ:9Ô®ö iUÖ¡#%³ËmÅ‚Hñm9é?*¢æìZ¯bTÒaî¾ôðë§ÑŠ£7¿Ñ­/e8ÿëþåÿóóâ¯ß–÷:Û¯ßýwý‡ÿòž?÷8üçc~‡, ò–ú™\“«¼k¦÷µÇÏ©×n¥w¢ƒ>ÒØï»âóìÒ¿_¥/ò® pà¼ÎÛŸðó½®ïò’ýq~ážjXÞ9¿ªû-øíø¯îúoeÿŽ[œûÍUq%;[‘QÍý¸›ØÆŒÛú¤ýìýe¯-2ÝL6PìdýÇÜò¾Eº¤¢dŒe}ÎyßìŠÌ<«º&ó|Ǧ°¹N¸–ºØõçOîÙ4ª¯|«· È*e¿8`èã<} âe|ʰ!%ãÝ-F‚²2o6ÎYA‡³ä&ud11ÈØ-Ƕf‘FhÙ¥ô³›«ÓÐv2¢võ|8Vù”>–aÀÄ« †D"m­]Nœù?üç($0©—–NVGѪ:D@¼Ô–˜„«5h2á“2¢R QKÙ&æøÞ÷íþéü3G{nöò'ÿðŽ²ªEV0A R õ;eqžüœO~Ÿo~sé§ø¤ ßô>ô“Û ê:Ú3‰UµV´&š HÒŽ X¬7 c*û‘7!»EÞo§Ïú!³žnøø¤¬÷Z±“ãZ4ýlØgíÂÍINfQp63šBŒ²ÙÆšÀªhÒ ”p©á’ðÄö9ÚhOÖZú8œ41ƒ˜I-Ü$"åégŸŠ’ ŒšyM@‚IÜ]×PÕj§ M3 U§¥Cæ!9ÏÍó6³è#½þQ¯{7yÖÏ곿–Ìð`‰â­å¿~§?4½Gg@<‚qÚ½÷ƒ-[š%‚£ ?]Þή1j¬ÈY²!=í¸hÈg¡54&Hœ®«„t›ðm·ìóá<ç$Oçégh³UåBBê÷\nfÑÑM®3Õ"­Hã£áȈÊPÄq ùŒÓår~I¿n½q/ãÚ·î¥÷÷ñ«O]Ì|É­éßÉ—ßÙéôFÔÈ*‘H¨ê¹"{$¯~>ßÝcÙcÐü"W«»îñoæÈU#ÝìókݲÝÌqè¨x¿Å.‡Ä>·×€ÛÖ¼ýGUøèj|¬G%YcfˆÝ6ƒ£Èúe>WF7‹„¡ãÚ ~ʉ>ã‘a7ãzaÙ1Rš/–šoÆ=MßúôÞþ|ñª3Ö%@] ¥1úÖüI’.¼E¨$ÄLåÎÜ”íOwÖ—­»¦ž“ÅûÑúh\Å=ƒˆfL)€Qm"?·âqZE®#ìõí§Ç¸}.O,èÓˆ÷Û{C.‡ï†÷/ ôFêOHúiß°âû¥²ÑcíKĪ߬Qò2&ꢒs¾ðV0GÄBM™ÌŽ[¯hxÉ™<ï¸/kÜ’˜Ã-í¤§|µ=Š>WÇ}\÷èÝÖ™“¥ëì#g‹xÌ2¸F!r] ¢/3—¶úû¿—îîÿì“·îlÜÑ/¦~UqÔTÿ<Ä"9+;ã³3MU€i. ²v]¨[§JWFI€ÈæL]ìnî=s}ZZ{íéÚ—Npµ˜?Ùa<ãõY¿‹G° ïñy~ç="C‚ÊsùU¡.fD4“%8§¯EÁ˜%˜ŽPÇܱP€jÕÁ ÂM e@_pé?m·¾y÷\ÆsÅ7á €¨-Ñ_ІÑêÆÂ !E„dY B®ëx¥¥Op.uB káGjÞ~Åïcw};©Î –ó–ZJ­ábØ!Ê0r0­ ðÈG `[bΞ[ò`‘ôäÜìO¡E`USÏŒÝé`hS¶¨l–ÃsgÙš8æÅ# µÄL{.*4y…õ¥Aô`Iû؃R+òÞþÄÃ(ñˆ<¯\ÌtÓ©tIW4l ˆªféÂ|F&—”دº]ò“(NYöÔ<†'dÌ ¼˜û]·S;5\ۇˎÉ;âJD¡Êw¨g7_J·ß²³™ÂG¦DZƒ!bEA#°ÚÛª¬Ì ïj–æ0lÚM.1:pùÕ®RÕ8äØ;~A´¦ƒN@bø.~ßWíéúX  ì.×)‚md´iýË~{­øÑìÊsD]WÖ£Äå-¢=f˻欑2i(£û׃ç¹Ò´þ…ú``LVLe'Ë[öÁêÈJ%ýòé‹z¬›:•' +a¨T[…Ø>h=hÓ‹2«Ê?Ș\\0â 6 kæbÆaBT Û4@’U– ¬ª“]ÄÑ-ñ–ùJSÉVQÅA L°©sƒ wjçÒë»Ú^B±¾xÙ«¬õB¢€ƒe•˰Ü/¥ÉäÎ5à7™»è›¸Ü`¡›b»Ó«Hð^$3Iúÿ—Èÿªk¯[É^™¹#ÏÔmÙ(%'øåxÉ‹†mámt™Æòºê’ªk_è%)rÉ6•Ð;Ð `´Ã~æ#æRÊÚÅvÖ£-ÞÚLÖdâ*X•cœ‚ÊN|­B¨%†h>'#”C Œ’)öV—Ê$ß ´GýÆÙïûßûùgï4¼Ÿ¼é݈2ºS®À–~½‰¯‘Óë•&…aI©uš„L(»áfÝ%W°,Ð>nzÍV!ÌelG;(U Báfô¿ý¯íŸ?¿ Ôí»7“ß?¸×%œÂf«ÐZ$6fb¤#vHñaS¯h´¦¸tŒôiU½@ÁA4a$''Ѓ­Yú`è¶j]ìüpïºùl¶ôÌ•¤pv4G‹ Œy¢7qÁÀÉGÞÌÙ»_ó˜öÏ\e,óÀžÉœ¹ì“øÄùõö‚†µ·r,–% ÿ¥þ2v4gT+œŒÊî™~ÿzv4ü)ŸØÝ–Y B¤—– \"~@·Ðî{ažÀ£¾_Óݸ¯0&Dïh(–ÈË…¥Ù):q “äb¯›Gc#mŸ joêî›#íñŒžpFóFÏc?ñ/Õ¯ðhKk?/¾Ád±^ÞZ³QÊÅã\ áˆfÉ ‚ƒô$L©ÑTPv~³×š]&_PëûäÎüwöãøƒ;fT«­à*KÕÀÈ2¶Ê­åöxÓ'ÖÅi#Òݳìùû`]C(7GwYmž£s½Ê<^–pLC'Ô3 LPy{kЋ¸Y'(‘dv‹cÎÀHañ9ýJãÉ(¼ËQüÈ‹v0ñkÅ;:F KutX¯:-j‚ãÆÄÈ·% Ü£4”´7pÓíÝz cÔÍíYÑÄ‚#ŽçE.D‹6ܼê¯S…ºAö©¬Þÿ7ú‡ÿÃ^Ÿ¿Öíõ/ýäÿí_É¥ÚÝððüùèžêÏtÿîp¯¶Xû„·KVœ²|x¹ö~ŽòÅ9óÁ?>+oþ¾¶žDÊáÒãÆBÞ;³fÜO >¤£¼™¯Fý4¹‹$îØ-™ÐuFŒm/'u¼AœÙc‡^mó ¹÷Û«Z梗É7ͱ8››ZEEº~ÙÎ`†¼Þ|v­¾îøÏl!S\ÀœS‰Ðü3ÀæYB!‚'r-¤½BÒV?‘v`Ûõxñ̯)‰hÂÓ4ž˜ÏÌZ—üžö«»UÁÛæÞåÙ|…ÙgýOÈ?€S\™Dö¢b#ñhADmDÂ9 )ÔD¨@Ѹ‰(µ¸žÏ,h <ªò_÷V¿×­Ž–¥þçlœZ,Àe`륋d-q¬^¯¸wzNI0ß4ß‹:ÁôÍ@â»Ã»nÞR=?û¥S¬f(ƒ hƒÌ `Ð6`Å4°ËV¾^Ñ´…æÙ{ý˜ô{°„V ÎÙôÇñ ü+úK:²qûZ0„¦^‘3â`#XYC€"œ0=Crh&ð2˜`†²9ÇÓ|ÞŒúxE÷f>¡Ãµc@GdˆjJB“v-Gh`dÉ„½¬ æ"„n ¨›ÐÓ¬eDˆÐ¤þ Hƒ9RHNnî°g²æõƒýünù‹^A#~6#û{~Óó¿9$üýµÿá“ßy†¯­Ç7¡XÚzInaG ß)ƒI!ã¼ÚÙÝ!GÆÅ®G‹• 3ó=ý´¢Át»¸…ô“M×s‰A  " Xz:™²´1žœ¯l 3ÄÔØ®"òÈ®wÎ9S(1Åî`0š(K’(m·‰U ¹-ÖÏþ÷ 7¢®Ö`ŸT{}ŸïÒÖv>_ÔÝÞ]!{ \xu§¯KOyûŸõ.>ÿßß?H67¯ÒÕeÖü ÎÏ8‡£ð~ÿõûׯåÿù™›÷Ì<¿w­çœ»çµí/îy¸m X$ÀÐ`WÀ¤ÝéÑ¡TÕùQ"´kõýiéÆÀ…¨vGBñ7ïÃÉíµãKÅÄMà5ýèÛì\àBð¶0g4´éUŒ£ô¬é–æž iÃä%º÷þœb]ßÓÎ;çGsÏL§kŽòhÇJ¤¥FåRþ\cS­ÙóåÐzk¯V}sŒ>æÇÖ¶½®'P¿¼—ó=[sË‘{†¯EIÛ89X›íÖP{³}ÓnæA—\¶{¥Ûm‘` ­ «‚v¤†uB¤ƒœ¸úÜã+x†+Å¥ë:ô~™*Ú„3,\j‡«\T“³¦„ÁrB3=ÑД4î*!µ«Ë…Ûvýö¶®}ú¾4ft;Á}‰GÊ›2»[ §¨d?À…Óõå`jôq$÷ÎÜp¨Ãý3uÖç9Ïë›Þ/í1•Ѽ§ÿoŸùîë][ëE<÷§?W£æ LhUª4ÔDã‡?ÆìéFdÉ5¿V½3͉e¥Z’Lâá<S¿wÓ6™)«„½Ò_*Ž Õ éÞ½€ú{F,Z$¸媄8Æ„– ŒO79Ü®QÝ„—‡·üA— üÖöxÀÓã}§¡ÀV,š¨=–êR™èvD—šª®†í©z¯”Û;ŒÇÓµÚ‘á±;AH:’™šžfŽò[§ŸÃÓc˜æeYv ßjoÁÊséßkþ“áJc$ì}9KéY#‘Ñ ˬ½Š áêJ|utNГ©'~]tŠ:6õŽÅ²Ûýj:óÒ}©oæD+ÝR“›9‘UDÇr–$™”šƒ³¼ %HI¦˜Áõ"7[ÅèõH FU9lp»F—I«Z1ºC£1.Ù[6qßh(2ü?û‰vf2¼©Ì%5€äIQ1gFb ÔuP½˜œoø›†ÃpgϬÆRE§M»¦£ñaœ¦à€—P™ /=Do7ÔRÑí‘>¡4ÌòÔÑé¶]­£9ìîŸo\j¢$Ø@]Ü8p|¥šƒk{_á•C–†¯G/áÓ5,ÓõS$e4+ƒ+²ô.ž¾ú4ó„ìöpª‰ûû³¾'Ÿq7 À›°ß~a+(Á:²ÈÚÈ=–í´¾q¼nYËW/m¬byP‰é§0’ÐVj™]õ­êjz}|9‰΃z|Y]ûì ®€\r©ãb34ªh…³c]ª©«N»hªks4(gØ±ŽÆ…Ï<U|}N;oâ&GÞ"kÑ1hï°ÊBb¡£åE¡w%OÝ¿Ôdû%/Â’l\qWw©­ûöÙ)W¹j¦ê(q‹¢Éòp¹)q»! ¬…*Ò±%nD0—'º.44g"Ö#n.ª€&–]zHóç^V÷íz¹¯5Y,÷¼þ>§™ ²‚ù€²Uªß‘ êZW¯ÉKUZ@m£—Ñ:DTCËP’£«µWúZ¨@µj…="ù ¬.Sž¹ëg8j L•ô ã WëIÍפºíÛU^! I‘‘p‡Æ«ãC·óïÜ¿›÷'ß^È@9ÙZd‡ÆÔ]vÍþ Ÿy”°lILŒôP­(r3 4ÅJ<ÞÈBêוUYaîöø™k}lKF¹ZûŽÅ£Ó¨ó’ôÁ>‰æ<9iÏ ™xô’½x”?2ÍcQl¢Hm¨¥KZ| <ŸfçàóÞs{£˜Ã¢ÓYâÐ 2\õÖetpަ²X Ã,ÏreJãum€E%Nö+8ïù–ÎïøL¬ÂÕ}>ã^;Ý@lzï» ÆôȘm*C‰ÿ…aÎŽ&ns¶Š#¿ }fȶåZI˜5ØCyifõï}ô ‹Fý=}ÿúôCb„L¬¢ºÕÁ …™ŽÆ¶Q ŽÂ—x·ð o0ÈÎE!dBˆçÚŽþÉž×rÿ7§o>˜ý_Ãè åçºóôxEPªh©ñŒ °õË­=$ƒJ>†¿¶†J$óÜTÒ"gB£­·ìc_VK·ü?w¶ßú}Íù»¹mà @fÛ¾ô‹˜cã4ò ¡qnO>Íà¨ó­–1>j†ß`ÊrÕíyª¨Äq¬ì½0b~{Û9·ë‹ŽÕþüepZuy={“ÍŒJn‡Ì€À+Á2^‰Q3ÜÜÿGoJ¿ÿ~þêùóÿñùO‚ùÚfe“È@sº¤@lAè`H†»'4Å®ÿPM®’ æåïx«ŒZž!84Z[™;B^ðy„ÅBØõ¯%fcÒDО¦¦Ê¦CšÊÌ  ÝýAWW]pTNS’Gªš†Yz(©ìº5Oȩg#jÕ!u·¶[£!n¤M¥Y3òVr8Ù Œ~øñx‰í‹n]éòð œÞÍ fujs5Ç{µ›ÓÖÒaê\¶LŸ¦ÂÔ}#¾†5'`ÌÙ£,C/%ÎÛ¾}p”Odä±ê-†u‡ŽÀ˜2é–©dÔÑsvW&ÒwɸOcÜ)‚RDèÅp ˆÔÍ µ¸s¬œä.~«^$å—p”@ÚÑå-³#rkh¼,0ͤ­8K±‘òÄ®¹µ¤gªcžC¦\ÅZ ·¦ j ´¢m-Ú ZÇjZ¥6zÍ'o¿ÿÒæÄÕýÕ¥xý™¦•Oô;ù½×Ÿ?®:ã÷Ïjnæ¼@.²As3ùí÷rÌq<þ½z¾R<(Ÿì3b»ÞÛíœ÷Ÿ¾Çúq@'¾Á~×þþXÍ}5oÞ.—ü¨…_ ¿Ï£êKUÍÌî¿»Ú<Oa(õ&´‘:»ŒE âã­ëÏÚìé [ +"¦Tr›ÏÃRÖ,»«¼Åg¥ÏS­çž2ò:É$…q[EKÞK\Ð(Y“W×¥èr×ÝCÛëcŸ—ŒL'°"ä!Ç 8AçRh–nèŠÝƒ¥Æ1SªˆÕu¬IÁ"¦¨pÛÁ4¡a*TÝD5<¶2de7Úš­Y«( Š ¢„–”æ^–¥ø’ËÐ *°\Ìâmõ,° £ô/ŽÏnàˆõ3sSdK²¥Ë‘v3aÔ¤^ 1‚Õ°0 ‚PB¡4jj ½ª4?þ'¦ÿõá¯Öÿ”»N½ðÅU‘™a8pv3í²¿ÛGÏüñžoö =ÝwÆt3Âoñý•îO~²ÙœÃó‹\(3DB±"hÄT)A@ nTšXVº•j1Á98¨×òýoæwÿÔ·øT§Æê>xÀ£SÏnïÈ›BŒg¶ž©Ó8s´¦)iÁ@‹…‰hHƒN ]ÇËru™i_†çÞ`Ûîç‘‘t,ähA( ƵÕ8ÊNÌx"GÔÔK˜A‘:*•7™È®´©]•FfB¨!™Ànfì,X5w˽zôô–ý}|öþr?ãöÏýß|où Üv~<\šwúA 'òÅut½H•Û§•OŠÚ«v°_AÑ4ÔÕ T XÐ5“ÚPˆ O"nËt•Z$ ¤/"„YËgAޤëª$ʘà*k[ÀQ•Ï éÀ:/ŠLº Ë †Õƒˆd¨ Ôì@C ˆX¯ßïp8x[”÷ˆ;‹>…‘þ8xóh¯œc8Ñé:½,½*½Í}¾}uñgç/™ðºÐ¬pðóŸúªV»ßúzÿ›ƒÒþ¨ß›ž¹Úúó½nÄW÷Öw*×Û½ÖÌ;ˆÒ’8Z!*PaY´Ì7\ 9D„ëË»| ‹Ð;ë‚MàÓ§Váh‡¸0–¿ò:¿Õ‹{-Þ‘•õ¯lx=>Ÿÿà5èù CÉg$w¸ŠD`ËX™ ¢ðh5-ôÃÎ9~ɧL§›µ!“)Ñp„b Lb€T‚2€ 0@(=,ZäJ"B|>ò»~l‹¼ò=qv y÷Í[C·%ï·Ï>⑚Xÿfý³?ÑùÔö¹–ýåsõ¸šŠïH¨³¯|£?X|‚3Èj>cC—æÈ¹=åÌh@ÚŸõ6B»%ääôLëóéŸ}hFU©X¨q~ÁVr„Õr‘&°gªBë³"ºêTDŸóÇ“~‡„¨3¡ªö¼£øª™–Œ']€@Ìu½àÕI6²“ò9±Ñ¸;ö%¤F9îs‹¸›òYû/¬Ï/ÝÕú}àDDzÀ#h*Fs4z«ìŠÜåK°"œñè7î|rã‰xÂ0µEeWpÒëlñµY;ó¬(7Zuc—«Ð¢*¨[X]µC 5MÝ«'QRkRàS½"»ó›kY?¤?ûÂ1Gï ¾Vï—Xûþ}XM¡â#ø’2°)AL!è)”«ˆòs Í|ÃÜ•DÛÚdˆ.Aö 3ò…d¢Âו\ JJü²¦ÀSsÀï-9íäUQéí‡KÖ8"hIïö$Ú¾Ç÷îP¿–CöÒ×'}}z^~­¼BF©@Ý ÅÍò¸¼8˜8ï€dp³îä`í¶î>T«6.“U_Ú±ƒO‹3ûäU>ælÖ½¿×“!n‹Ó4eªzñ).’bœi³¸ÜIgw'Fk‘7Ù릕õýÙ¾àÎT}+ÝïT‘lÐfÿ´¾+?þ4µï|?‹>±—«ºi û9ÑL ¿Yäû­}h`ÁaêÛôéÐHª a¡X™“jX% àQrœÉ’ÃáØ3Åi~—ý2þÒ3Ôé·“C° Æ5¥'– â‘Ê®¨;W‰Û›†Š @±RSÞ¥­ 61°d E§”Åuô}ÀžËK|•íÚmrúÉú½ºËÉ4ùÒy9噂)ë.3s4¬\ßâ« ~Êa7XŒMlò‹ÀSéWÈy¿ÿ•_ÒÜ~žC^`ƒøÁp-\ðˆÔ¾Àe\Š2JJPEDü>Äûú…T·†ñ„Jú WŽÚg|ÈZ¹á#z‚,ÐÊ,iÅÄïÙ“¿’M?¹}‰–i HåÁêc;®›T1”@˜LQÚl<¬|¢öIt³ÓÖ% ø€P6tRèQ‘VŠ}ˆäN&‚5øëŒ'Ü>£Á œ¹ÊߣidHmOÏÒD;U)Ãßÿ3üþ™L˜'Êï÷ˆÿTýÛôÿµ)Í«ü§€Pò™Aè+âBOTXxì[™áøöžßÍ ¼“~K\«ÆíÖu£%ûÜñzlƒÔ°—Ç™"l 2$…lŒsQ„ùíÑóBéÑò¦aUÌꈄ0ØŽØGPѯ|Z+ N̈ú"(ª½j=qÁk¹{þ½‹ê f§qíðQ‚þìóÊ£Üe¹>ò=xM$cg_CZš’’²õ’Jemᤢ«A÷ÚÃe¸ëˆë§í#çdS®p?ÄU^…^7Âk€\Öi‚9ŒÅÁRPÛægŠ•ñ(`Y~†ˆD{Š,Ó*gp%$@õ>60óÙ(#¢%-l;&ºBlU%Ã^$ ÕE«Ô_3»5õ+.†þZ©£kCÛŽ kƒ"–CÝŠ>…#\¥f,îbNQB] ÓX!Ï)ÚO7œsøÃ5Ãuú¸¹¶ÐÖÉeç›Ïü4Ýýû¾Æ»²Ôw~>~§û>‹_jÉ=<'-ìÝ%éïYß|áú¹þî?w|ÛwýõÆ¿¿ÓýQ|@ÆÔJëZ?àdÃéõ^‹ËsÒÆ]ÕOŸý{ççt±›õY*‰ðzsÄ Éuó|¾œù˜?ŸË32ïøjµ³ŒèÒÃûþfþHûÚôa÷§êóv½k‚Ç~{ç×}í ” ~VPô‘èÅURÎûpû›ñÑeôν?öˆí„Ec%e'ã¬À˜ÊÅÂÕËÚð—„Ø²û¬Þ€& š@SšSk±3Ÿ½®kY#¶tˆÏ¬_¹Bôæeg)=0ãLk‡ÑË´˜¦ F!æ x×÷“ D¤†Â2.Ñé©©Hê6¼’l¥< ųŸûùFËV #ÐR¶‘!׌;¿‚%V5Œ#2µ‚˜…“³›çzíL×óå4¿¢G¼×Ý~{aÂRÒÍåzQf|UÚ|™šèévÉ6Üä¹,õÜ×èûúòÁ}¿à1•™”3Î…€E¥˜¹4Z0„ H±,ÂèW𮂤Áæ  wPB²A…æ§Ld9Ó ØÓJXèøésî—ÉžÕ?ö‹»M¿1+Â?wæ ¬ìN†á„ºc/Ì'“ö(ï}vw@OÒ8Äi›%wsi@ÝfXìK(t5¥X¼AC¥ÃÄÈ^Þ…†@‰–fèÁBKÒ ¤ä#€h‹`H½Ù/Ä~¬,t¯±Žu 83D¥¥i¥}I—ÍÑÝ4áDÆç)ÁN m³–ð#’±—ˆ7܃j>VæŠriiq¿_sÿ“ûíÖãä·?ÇßöN_º;óOƋߟŸ¾ÁáÃñŸuñƒùê->Œ\/ÞÚ7ËàÐ8ðþ2>¿þþþ˜ã¼fTVO¨«HÚPJ±ö¢¡ ®A­XN—^W|ö)áO0Þ` À¡šÖyã  ÊdñÙœxíc¹xâó‘ý|Û[îR¸Ø?ù¸þª ’Oä÷$GM1(¨‚@Z;ÚUÈ!ûmefœR¯/›%UqÆU^€D±ýçÙñéZðëÏ/•?z ®_é3¹Ó´ñòðDÉ“ëãã,÷îC¹m'zïjtöŠóˆhýã»VãËãkÃçk2‹&s63F–VgßȈˆf‹ ý¬yBGq¯FN°~ô:•×h2Öé<²Jý¹¥á¬>زâ 0šL¯æûŸèþDÛÌ /}žÏ}žTÍAKj)IÕ#•sÖĹê–FPFp¯¹åp[šW“>Ñç̳Þî>ÚM½¶tH>Xzm““©Æ:NE¹V¸÷ýeÐîg…l;ÊÝÞ>µƒñBûæ(V©ÆFcºxÚ!MsGÀ†ªÒ¦ d¨wÜù¤ËæA¬ xIÞœ‘á' לRÖØ¶WŽ*F)`U…V´媰¥:(„­h„µªó‚\Þ×g9_{Íøžs(d ~>RÛûþz €Üëð¤èo.Ã÷$"JHFÓfŒþ§ùÛó[éÕèþˆðóLC€¹á2JÅmŠZÔo 6ECk&+°,8b‡œ1C†ÓÛÝ`,&­íõ8ïKwù5,r4œ,¬ëà]¢ e]¤•»3R¤@ÊÚ" ˆÂL´óË{=ËϨ#o˃åNª€…b5ÄQ©ÜÆ>¢L¥vr›ôð ÀÑTJ "FÖä1j:J„ÒmtÇ+ÆWµ˜-XðRïoâ}¬Ž l뇛óg¬)æìݧ …l}ªøá¡õvKÃ>´Š>*A%yùdùBY׃«/cÞc^?9^ØÕ—ëƒH¼¨Fý=—jQQ¹pQ”b'9§v¨+¨ÔƒrñÕ°ªžÒ(@2]«¯ëÉ*®ä/ðµ¬Av¸æ!†t"tÈd-`Œ_qË8ü2_êË|µÝcXãÎj#êÅÈžé¦ÁÀ8BF;ƒŽKߦC':‡F¦¥¤+oEVÝ#`@CÒ9“>åmÔbPO¶uk^/².¡—•}÷š•,©ÙhëB]ÂÔbz´«ß}âW¾n·¦2¤¨õ•¦u¯u}ÊKî©ÖÅŸ/é]Dút*šµÏ#ÿž®è =n¶íŽ›F3ÅÉrHà¬ä=1<Ý0Z` &ºP½–0‰¼¶Žæ“ÁÍíïhFµ´fŸsŸ†qçóÇiç%ùöV~sêóÌ£öà[wuÔÒÄ™æàiâ^äx[@—¸ Ê¡É]û~XVsÕéè|ü)¢¹:+é4®Ší‹¼§}ÿØìS`¥9CºýµþnšY䆟}‘¤3¡Ó‚7³õÁ÷+!ëÏÊ-‹ßÄ=Ç…ºÌ®Ñ,Þa,O­t‚oÿ…Ý/:y`e؆D‚z  Œkå~‡ƒsæmœg]þ>®7N±Ä êÔÜMٚǰp­ÝŒ™2(Œvä&¿‚I¥*–HÌr[þ좰}!<·!s¯ã@Ê©%T´\ÀuÌ•× (L¡ ÁNUèÎUæþQÎM¾?ÿ²æß¢Î6kHv·eaLp0E -׺ø¨g5eó ÁºoÇÜÌÐfd޵pd.J©6/}Àƒ ŽÂKä œ-ÓH|ÇÚ¼”ÇŠI4^ßAióc.ƒØyGþâé¡õƒ –¤0ƒ’:˜Ô_¬†U÷Õ«j¾õÉ÷êîgc•BrTJÅ™´Èxg¼ÔÍú ¹)Úˆ1´§ªlD¤µ$ §¹o,²È„‹AŸYÏg^{Ë l¯<\n8.…d€TúîN”C C A ¢zvS%i¹Zj”Rœ" ?ñ‰3>É¢š{,ûÅŸçgj….ýM:ȧښ,&›šñ;U¸9칋B¨ m˜ƒ‡¨Â+¸ÄÛ› ¼ÅTøèíî&.#‰Óå»0eõ®ÜI EÓ(ëÆ#wXnOåDûuÖlÀàhR6¸L@ÝrèWWd§Ý­qbÎ?ö÷üB<–ší¹%.#ÌlÌNGg+¤¢.ƒ™‰Ô4ízð n¶PAÐ΃ɉž«—‹S€Ñ»tYkEš,ƒ( ÑÆ84LZÒ—m¶qê5×[²­îw–7BáIQèhK/?€Çy¼Öé›D4gp]HÙJö’ ÙÂøcŠI…1N·Te¦g²0•̼¬äªýj<_ƒ)„¤ Ûrª(ÂÏžD‡Þ|ïÌ·×òæŠlÇ oÕ¿ÿýá/«éL¨,KÍ‘)öÇÛG1ô}+IîktØõY¬âm¹ m=b)ºÔ܌̌ç â ^È7ꢄ̆¼“ s9NÅE‡ +€V2E…*ç4,B1åPVµ=·íŽ|Wþ|nüË _Ò,$Ýâ ù#ÆøJ¯^s®ÏuIʉ§òYØ0]OO ´]Æ._”«­µû.kƒ¸ÙÑ(\ò÷è`ãÔùê €VË®AÝà3.c¨þáßÿŽg¿[~„6»ˆ.µR ËaF׋9tz÷Ü5£9<©­½R¸qŽ" ¹¿™þ(W+uÔ›s]¼J:¢F º‡c]-oJZ)ö£#× s‹îözŸ9†}5Y¢ qÑí¬M<„eà¡›ÆÝ¡.®pS7öX` 5z½›VD±ÿ=[÷½:“¡¢ŽŒ:”µ‹žŽž=& G;s?4£>‚7©ÏJylM¦ÔG@P¥,½âû¸ÞÔ ñ#|ZFÛq±qAè×1¬Ð<,ÚTTfl|Ì+Ÿ¯¾ª%‡•ø.gr«¡¾Û¼-¤ŽúÎ=À|t-Æ:‡Ë8d¶›IÞj  8‰t_¹[®lÏ8îKÄñþh“µ”D_2C(ç9†”*Ñ2_µÂ*¬(ˆU¨7HQþrñ9@]fÊ\ F2”ÊÒmöÊàz¥0C"¶•ÊÂ0”iÁ+°¿:vX LwuuÙD¼Y*ذÕÑÐ|uZâ:¤B;3(‹!ÙMÞQX‚Óåü…„‘—ÆnÙÅÕk8†gh‡Oœi”GavÓ"(ºÆ&Ä[ÝÍUL«–ú_QãËVs³º¬ãv­m|¤¡jîåzîüÏÿÙÃÈüÿ“ñ²™üÇdË3s Cw€•:þÃVšúÅqö¼îìѨ#õšXÀ¤Ðí÷U2û«Z÷ñ¹úÒyO‘ã¬VòÂü¢Ý£ÂùߊÉeõd¿ØóFOÝ^äë¦ÉkçÇoßq–§Í¬ð±d­‡iµêú¢_óîÖ_¸ïä¼Vσ(p­Ð²ê’L=’”ª˜å *™,ßþ9·þ,gZú®CÂhÁŠ Ñ "8™IŸÁÀº§$«#ÚÆ À§;óÿ8íºe4Û<[Øaâj/%IJ0d>¶›+·z·n¹[JVKq»Ù‰”†ÃM]'h{0ša癀D³„^ô‰Pi¢Œ`‚ª™€X ¢SzL†›÷¿ýJßéן|ÿà½=–¼ /Ç3á j{òæñy7†«’)ƒNGžùtdù½þ¿¼Öf;/V°•ÅÇÈdÀ:Püˆ‚&€BF02H#°–#T¥Å0¨bUŒBO‹m“¹ø|°×a÷ܾÎôÛ|?{þjwÞ !}\‹[„MâícPi‰áˆ30›²ò¬ Ó‚‰0¡90Ãæ>¸¹¢Ï˜W™’ŸíǃýˆÔˆÃa9 ªØÆrª@ð-#ư$È™ 4Y`Ÿ"Éj \µ‡ÍÖ>^yhÛ‡>¿Þ~_×ɽî|öƒÏ~%<}÷Ÿüfïý§Þ¶k½÷Å^:ÜEãy’ð&nX{4£QÖ¥œ$¡kZ?*Õ_ìÁJÿÆ™ª°H$€Nk¥”JHj-0”0pê.Úe„Íx‘t•SF¶"ËÀöHŠ‹w)vwá>ÇláÎ!DŽ-»U+¦}qz2n£!X•Ž»¸€(à ”ØÅdG2¨¢·# d"¥í~þò§õ¼ïÉÿoüÆw\y•Lêï»|î_Ÿûô'~~ÿž }þ³øŠ×ÍÇî´‚7•ø¼^ûEä¨7næý6qÌ'[gu§{2ÚU‘¶Û4’%¿~$YZZª–‚ ïùç~Áç£é¦¸£?•L ƒ!º[ @nMY¼¹§ŸäËI¾¯%îc(@•H&ˆ/^/<~õw»Kw¸¦leW"“Q¢½U”%~6ÃsýÄDû6~||vÆýn…þ`BçÊr ì~¸Ë N«W^QGÁ•BzûYîAßrƉ‰VV²:-\v8‡xBœ–¶¸Õ°äªÖ¾0B<•ÏE[¿p¼ï‘t/Pºì”{ðXa KHgæ;g™uZ$¥ÊOm¸ðèS„ùðÓñò·«]lz]þ;EÃH6$ÜðßiÜ÷œ<¾1}w}Ù—oü9÷ƹ­v¨§¸Ö1N›êÙW,”èdv{X9µñ(AÚÀ bôàÃcö.ß1±L\Ì•€ŒVÅÒ B5‰ØWK.ZA‰•Zs –âxÑúK UJ­É!éh©‰¸¦v‹:»N¨`%Mx9Æ•ƒeÔè…£#äÉp!•Ö±8D¢„€ÅÕà'ô>2;©#ïoQ@éÇzeNŸUê¦é)mº7T4,8ÇÎr+a »Ç*¨ Ù€ÃB{¯ s—YmÀ“¸4פ¦@<2D4w±Ñ0¸É6eZ5Ùy…hº¬^vÉ­'•MÚj`í¹"pMïŽ"0ÐE5 ·“RJ_¶„.ݯ÷¥+sMAOŸII¢Ëà*9 )~ôJ paï˜ —¡n¶¢Êÿêµýdïƒø:4ÙÌ oU“š†i©Qf¯g0¯ÊºgŠ‚’Mkäj·ªk µ‘„ðݽåF,t}¸k3ÏŽ;~÷¹R!Ÿi¶ÓôØhÔˆá2kø°Ö•A~CMùSRþÑUïI^¾.Þ¿ ­ éÝâ„UäÖ¾ÓÂÀ‹š€^Ûwº=¶[ìºØ¥ŸÕQû>ô\_µ“+1ÕEž®HˆH²žt˜Ùëœ߆QdUA)AÙ ºd38¦úꥡ&4Йi±©Ù9É5AyœŽá53´×/ôNˆ ÓMiT ~ìÔ´\pÙ˜?Ù`vôq;½)ÎsÈã0r8)Ä®”?­Çß_¿…j¼ú—×ýëþý2ÃôÔØ)¶RVOûmð!\U¼Ûs÷N‚™E‘Êš+iL ´ Ñ[ñ’ì[&g|ÅÊÎ/ÌÆ,wË™§àÏÌ¢<8|ÇôÝ6ÿò²ãûõWý¿Ïõݬ.kì^ÀLEâ‚%DÒ–:© L×uµK熹.ïtŠGÆ¥$‡[ËÕý|òµpâNíÊ&½³³³†•ÚlÆce¿ËóWüî¾V—«R½Áö.;èž´o÷¡ €M-5º‘p‰‘åaƒÓõã³×ú/ )ÐÖD„já *>î±Æ•’Úésf×›Ë ò겎€rha5ñëë»@Æšù\u@‰Dh€%ì\í :å¦(Š×ÍÊ)KF.Ê—–ÓÐE/ç’o`pV¯Ê&ò,EÜH „DËîÒ(WöÏ4a‘éãà;ý¡hHÂgÆàãÑ%ÆemØñêºV©¾P¢)¹cÓâ’3@£}¹^ÁÅ‚lŠû׳­\s$W€1yZì$‰ë—‹Ãùoã}u4 æ8}m–à„TÞ¢„´‚%ØT¥P••E!¨Ì®èE£6@Âàa H1€p . u±ÃíF°ˆ)¼Œ›åLU0‚U³¼¬ÝUQp\]•{Ëï¹¼ßσ¡Æ§á°_x‰PÚ˜rƒ–˜< 7DiBËUYúTõZ € =2Qc!¨¸¿sª-)T(5ˆ6 ˆPz1_ÈB<” •bØSA¼÷Â.èêvyw§…ÑÚ\2ü¤ãÐ1;Ákãî ÉØ™JA&ÈíXbpd'ë+öØË„8- „eƒ³1m©„Qhf;B•©®°%•ts¹’ñåç?l?3º’iÒ¬£5!9ôæŒ5ÙÂgú&~xDÌAF‰·Ÿ[ÿÙd‚n „R8«™Ù±Ñ] Óè“£¦.ÇH€UÑŒa@äA„`èèˆyÈ©VYœ!•,gdßcX⥿9cêA§à„ô›˜Ù§ß„5'…O_Ÿ›N#7Báië +ÝÂe¦.C¼\ãŽr†ŸmmÀRPg&©/„`¬Äe¥+3­å–KéWŽN7{ÎOèD°ë¶mž3ï ½qÐk¢Ö^°²)(4Á¤R”ÄÒ5Á™ßÙÿBÉ.á—‘8“ X¸Löâšé6LûÌG'±%ˆ•´ñqÉ^mWn¡ð•X §iõÂtöÒï¼anµ2ôùûâ¿÷q{NÍ<Ò÷sñ¸^ýryµÛÀ*Í’r÷b6s4,Ó8é"´Rc,¤]e#Ï$÷Âñ2©£%¼<@!Œðs¸=ùàuË€l¯• ø0ßþr??w>»ëñfIÉBV2ÞµýÀ‘ƒ°C)`½Ü(u‰ƆS%16‚.Y†]Ç4š·ó ÉÜ%Ýþâ§?}M:@Þà'¡‰!1âªày»5М½õÏú»‰11% lHÅí£Œ´W(˜q@p¨ü1·~¹µ»ZA݃Š+¦Å…Õ'`q¼N…ÍÜeX—udX’ÝYsÊÎ ¦'Éž›yd ®) ÍbWZÈÃ.[ `4usW ‹ÅB–”Õ9™½ŸÍîýYÆÎçZ¸Ÿãß¾D•Í÷¾í ËE´sóßeÇzM¾Ö„AoèyY5Þ´ô±´€,׸APR›bÙX‹Í5—„QfêUǾ9#Kkì_LË5E–TfJNh ®q¢áˆYŽ lpýÂ0®Liµ= Jðt˜o,ƒÜ‰ï¡ö‹B[½TTík‚¹n¬*|Øš†d¢˜¯Ûu/yuÍ>sÕ©‡}7n½&КAu#yN#G÷©4…®×œÌ”n*£Y`QÔHfëvC¢0Úã‡^±Ëè~ŠÙÎMÊh0BilÙ¨“®ë©!ÎDèu’re¤‹|5šÑþŽÿ”é‡;/=À™g“m¼9•µôc¿è·H ¼z~ýÇçh+¥k‘Wç×jœmÌc=¾±{Í^³–ƒghÛ¤NžÎ»ïÝ!>Ÿu]û çoóã Ò­†ŸËÏÕmÎT:¯[÷7üíó—ŸšÎõNÞ6õ*‹’ݠΜQ‘ÞûÞw7«««>Þ¯§dÞ…ã@Mª¸ŸÇïœnZRi«µÜ«%lÍaí?‚$ ^gD›1Õ¤Ý,Œ•m!³¯ÒÂfÝÊû䈵vû&¼$©±$ø?>°°ÂÏû…Vâsc”²§HGâë€Î0Yúº’æAmhçÔCÔN8l­W+hàš`:û´æ5³Fòëä·RáMa @]ÉbxÉG„6A£‘ÅTËjdœ‘šf}¼ñ‘}ú·1äËž·ßpùýTówJ˜ð—ñe$eã~»Z§%‘ ŽžÞMÇù_yžÏåD@•gºIÔzZ £¢  ª)(bУT2Á X €He’•sË&°gîç öxv΃ùÝÝ“®I/î™û®è”+bMaÂÞ”(u ™²Á¤Ö¡EÒ #4DÙaÄ£V¾&/ÝÓ—ïðíÃ|¹¸÷Þ%pP…|UBU*À„lG€$F( !@@¨(€™Bq`’8!MˆÁú<Ï»G²×¿^_ðñ×ùyÊoûg×»KI®‹jåãóþ?ó)ç³ÝbŒñ5´xwã<†N+Mou'F弜y¥áú0ä’²X·M¶ˆƒ›xУX˜McaCÍjALÚ /­‚Ü‹û÷šŽÇ¨¡ ¤Í•ìT¾’ã*7Á Ä¡ú]ùܘ£DhBÒ­|6e­œCPLcS}Ë6ÆÁ5ÚÖ*€{h„HÚP8‘HÝ–!°×ù¼”c¹õ5ñ¥‚JaB]Êþ󥸟eÏþ̽T¯{j×_½/Þüß_·ö¤@|ëõËsÏ3¼VpõÆõfnÛ›9Ëz´Ì7€6¶Çùô”# –ÍûM$‰ìÉêÜ}ü UèMÞ‘ d‹ZÆ÷])«Ú®Kß~3¿ý¶6ÉbÔÓwRK›jÞ­˜ˆ¸‚‰{†$ÙÛkÔ™»ZÝÊŠÓæ[»×„ôѤC©hefLÆÌ H€"¡ÁÈÕõùœôÈGTN±S"*îÉîè‘òUF¦t×i”>¶÷UáÐü gÛ¾œÐ¶Ÿo¯®ªóó1"ÜÇU-@}÷Xß_ñÉNº ;ym­jnÎôzÛêZ&¦­ãžQ›´%»é®ê3³?ÝЗFBBihN{C'ÜÛT ¹Iƒ¶›§&˃ʭÍõfsa¶ŸS×N¦[ùxª.§“þ;‡µu”£²ýàÉ´U,éõ³uÉûù9ŒÁ½».žü‚ǃ7”MQä€À#qÄE4b @û÷1Í@Â`,£*€]SŽØ© [ë%+$K“•ÛÐR¥Ö†tbë·"º-7©ä" ¡TFí†]„g{{Ý}ë™NE=ÍyCpצ÷ÇÖ›±oG ‡U:Zò­ÄÉ-„Ú(Ïò½4”¾};—w ßò…(2Qõ<ĸµqÔ²"0e`Κ(™bFNËÙÞı ¶ÝNjE¶ÄÏ-éQ®2Ï-4ÕnØP_Vd'nÀ‰4êsîæ-Z“À(Þ1_·©ƒv¾¼í2¼öºM©&l‘ mS(WU+\ò@gq¸¢Âå5—Â^3*Ì Ðéy@Û¥—p@:¨Šô3pã(j‘ ¯G8ô—XÝý¬z=xûõã¸Î]D~¡÷ÁÏb+ºË,Äßyqª`<º]Pjû¨M·îÖ]æóqËr®[âx;>´—añvŰ˻UÚX¹ß ¤kÚ^Â!_ÙÒ„±R¯I‹ËÉ6pYÞ1of»Ú3þ¼»{f#Æ#SOe2²M»2”ýñÖL(Õ½nîOûH8Ÿ÷åoºw1ìÚó劬TK 4aS8'ò>‡i†(Ò«ã½ «m”%íÒ#öº#i—ñ3¡Ù»ð BÂ¥ VÎC& OÄ{аä%H¿†.•o³#D¤rÄ·³Í×v_¯ç=“àBy>û›õ+_ßÿ¶®záÈ]×Ëæ³r؉¤V²ò®Ãw}³õµ{B9ãÓþùBò¢óž’\)˜èšÔpVY $ºö}$…¨îàËâq“|Jˆ]Ô»¶çAo»û‹\vüƒñÌË-?—æýºQ]ÜïØ?gù=Cý¢¡æ¶|ÅÍòä4J§*fƒFLˆ\Q ê2Ð.•%lߤß6»3¿Ä¼Á&”³¸i®Ì&®¢À¤Yö‡Úój»Ñº–ŵ;“Ì©&!uêÍ\ox­Š{Îû>]G÷ñaŸ'å/Ó:­¨5Žhùõ=þÙipžÁÉmóöp[¾–v€Ž&Ìl‚Oën˼£KK@ b³Gu[¥‚Þ¸>Y®§¸]wð¥}U»GÐÛ/EyŠu‹õ²aÕR]œ¯E¥*ÅÂËìQö#áÙp ¥²ºê°R»ÄµAydÊ,°%“ýA)Æbe:ç©ì¥¼ÌºƒO“~\sÝë>bµ+ÆoAœ£fxWEÁ´Bu$39œ†· Sñ+ÚߪÍGA‘y¶É{5ºâ?à+n'Ó˜m@iz`/q~P÷+Þ? }pŽæîíÀ¨ÎªbU*E×7¸-"UˆTue¼lKë²½€¢ TÕ¿ÜT—¡’x@ù|5€l}&jCrÙ“_‡f\ , ªZ¦Õ`¹ŠZÙ0I¡–±Ø“+z¥|õíÌÀ¯¸ß{̬.A¢ Vzõ,h.ª›1“aít¥\µDa?,6vͨ+;…ä+¶jºÂ=DÕXÝ1­b…7ä¡9=þփ̣&bû"¿Ù>ןIÜJ©þÅÉ¢·ìÕea:Pšpmbª 2ÙÙmŸÉs@ín짘FˆwëLFbÂQdÓƒœ •NDP†7àn¥Fe¹¼ÏÊ#î)¦36=ºöeÛ÷³Ì\4pq:„ææxÁ Áð]eZq!ášì÷?ù"Òà%•ÚœÞÄŸßea¼¶sp½’ì 9+%Q‚É Ô K.ê^ÚÜÒ<ÅÔâJ˜•99+éÏè ý û$‚8”C†ÐÉ€T‡úÕ£8Ъ,=™Þ¤º-‹;ˆyºý½ ø¢0#ßï¼"]’Nç̾3WÒãQÞcyf$¦ølTŽÝv¤ D XðNÐ7±…§ibR-²º|¶Ö‹uغöÅO¶¸ç9R„D_uë‘_ø,æ#¦{â!¿I7ð†>d­½¯ßûb›bÀñ¤ê— ½¼4€´sËléš­v5»úõÊ;¸”M˜Ì,(Ñi{V½äow»ÿ?ð>ºOÿÎ3¶ñ^óeüÌ |W¶WøZW¹ra¯³;M·3Xž¨ÔßíÁÌm!Z–"a€½3q( º,™vRýªvßâ¡©âÔ›âñÕzÇù[„Tž¤H\ª«Ÿ¶¿:âp85U¶Pí/'ÄÅ:’Èž‹{mwꉡGèªÇ~ÚÅ%¿z®—¼î9”ž\â1Ý¤ÌÆ‰kíÿ|©¯göۯƽ¹í×wíT 1¥&퀈P ÓV›” I—I,ÐlÁÒϰþèìiþñ“ÊŠ`2uÈåÇS¶ò¨•C’…H=X-ùfœx¤løÖ•µœéV•tr¨° §n£µ¬`Ñg¹žÉÑÏAÖ—´œ…6vÃ)A!ë©íÛDT¢B)ý†Fݽ u¬ßîœ/Ô½ôÏÀïö3þ {#µ~…ëqϱ}õávз£®-×ólêí3'슸DlÔj.ÍC¯b÷Cù3ôoÎYVÖÙÖ®½âÜó®÷’úªGÒÞHÙÇÖº’S6}T?^¥Hbˆ@*VŽÄ±%†WÓQv\ËúCΠö…5F×äòõf”ª•.qN©,Ž,îH‡œá`pÄíþá§¼Äú|éæáÁRKá"d§®¥æ%« †ƒ¨Š”±5îh!êt®FÄ´/¶”ø6w#vjhÆvM“RLZaU†©m#_BŒÈQâB²fKﺈƒà !µHQ—Uù¶\Ôƒ0)Iˆ&`66qÆ Doê: 5~·eyqþøó³ÁuËS‹×›ÅÁäp²ß,^ŠhZÏX'2bæÕѾn™ÒãszOèÒÚÉçêñ“>îöËqz&ÌÌ}÷ÚÿìûÇý. ØÌ}ü3ÜwîÏw’ö¼æ½Š—uc !QÿÌÏ/_¸k Ñ7Èò¾V7ç¦[ÈRú˜Ü£Í×ÜoÝ/yq ±¶µÂ€ÁÈ€€Ë0‡5Œ0Ó©œNóÄEj £ *A¨WgªÅ( &Xƒ s>¸V¾é½â6ÜZ8 O2¦y¹:Á[„5fEA.>ÇÕúm˜œ±uJ|”¿­yÙ„ X³:UÀ‹J&(ÄU‚ŸÎp©7Ùn9nfß„,yx_ïý&Þç¿¶ñsQ*ºÚ×ÕÓ:Å-T£‘´¸}çkûåQd‰ñW!qƧ@èÀÕGº2 æE)¤¬ˆ"ˆ2 Lt„Ah-L­AÑà Ç-d3ólÿj<_ûpÖšO! Gý|Ó6´ dD2‚Ѭ¹×o8é~(o¶Od¢ÛÛÙv:ºpžÞ½(+?ßÇ— ¾È)¥IK¦A‘$è"‘q8$(8íвˆd ÉàYçñzBOi¼¿žåÿºz~ûøç×ýÇSî¤üÌ%3~ÿ|ýŽÞ¿ð'±}ÈsÞ=öæ × ¶DºDå …ix÷X‹p¦wÛ»e®5³‚‘Ëx®Ü1Æ@uCŒFIÕ€´uàµè¼ÜygŸ!Çóç2dÅøiƒ¥ÃÖØ Ó1o@çq¯!+ÛY5ØÀê(eÐ-ªq9€HL¡¶2[Qr¨Š­  Ò¨lI’p€êyÍmÁ>þ¼øuäDÈë´¯­}èçëÍg~ŸZÞÓ²[Lžð™óñ^rŠ›p3vÐ,Œô'{M¸}ãŽà¹ÖÛ彿f£[»µ¢;z8–¡ 1¤Mg>`w€!$dMnÊ2°RŠ ø£¢ÔÁœ1ÆáDrdJ+vlÀŽ2£|”šG5{ø+ŸúÅܶ~…õŸÑÄ90€@Á‘"˜f敊B` Ë3«n.æç WŒ>­Œ»n/¢ÈZ"€ €`æ7óZÙïÉ»”^ýµ«´×ŸNª¬% FG bÁÔZ|dYж ô”ïÔá5Ô&ÞØÇ:¬ªË™NW4ÖìvêY꘻“M||ÖéßÎ…?Òø³ä™åª ž †tê=0%¦¸ìx]‡æî ð9Ði•ôJñâð7ñ&Ì‹¦Ò­mèLNê‹.—Ä0Ѹ#'g§öù]}vóÑôÝ>Â+}®t¼½Rè/[kßÈ.½î…L_šÓ£mwÕá±þyÈ?­à,¦-è ~¦úvû¿4 “„NP@€ÞûPBL©XRlºˆ'´Á³ˆ`JÀhà©c U鱺Ž.­’B‹x‰C4eÍ5•T“-R“¦ó„ŶìÊÀ×ã,¦vF(=ç L:ö{‚GཞD¨! @äÿz¦èŽ©ibªú!Ô€Ãñ=ýç Þèbå2´¥¨ö^šú ëÜÀÂvÍ”»Ä7ûåR­BàEJôÕ^ä…uІ%h#¤OÊÝJB›½,N˜øZùrT!ÁN>X`-±”¥Xï•u¡›¥ñuN¤Ÿç;åÎBžÒfìÛ-ÙM&ô·Ï÷ü“?ïÇ;~è¥ï¬îŠ!¸ kÕ׌;®oŠHÛ‡ó}žP2üf–™•Ýk»ñV_|Ø¢¡ôÒòkö^yòb>3p‚¾·}HQö†TxõòžÁç#¼æ¡·êÖËkºÌÀƒba÷²waÛïa‚™¨yµ;îZ'÷1¬)xÁÖY·Œ•öp óÐÏú,dR FÐOJí2rR4Ÿ[óÚ™EªÌ{q{ÆÍj¢d—£R¼ÄŒDÏÙÌŠOã•­À€—¡ œß,oÒ¼º± 'Pˆ@ÐºÖ €i‚Å*sV ;íÓs WÑÖhd´€Ì•Šð8”¬à"¾E;0À±€Í ™Ïš8Bîi?@«Û™Ð„O¬ûg‘Šé@Èž=©sß\쑘x],É=éÙ4gIX§l:¼HU¬q_òßhØ]ʳ¼îxجXifb¿”P{Í(ÀUJváAǶ¡÷ªaw'ÕL1Ft¦ÿ²‡k,\ÑKû¡—Oûotº?ß«¯Þœ )J ®„ƒšdµ$6î›®ØE¾ ¶ h=ï¾{©WÇ’…Ïz0åÃíZ×P;W„i÷ «[鈖 9-”tªJí(¨âéYåSn~L¿É±©N““Sõ†îSOê3oÖ¾A¿`%Ú×¢ÌË c‰Ü4 µB¾ì) oš^’f˜¸C,*ë]j­™©›Wâ³$wm_Úƒç¸ù”ÔŰ_)O äìlo°Õð2aÛY­ì‘Ý…yÕ}LVÞ…×ÕhËÛÅ’“•qŠaUCûô,‘e8CZV×0îÞÍß=W77e²¼³T4@õnú‡ávÆõy6¼þàÛ¼«~õ^'â=¿ê*Hš¢§i¼MÇ`¢ ݧKþ§þØPš ‰#ê@;V—&oþômï[Ög(d7dê€EsØ<Ö÷¾+gØ÷µ‰…ážÖB!ûÖ””æE¡š’òÎNT'ZsG`­»Ü”LaäEUU§Ù‘êÚ¸uº!<ý•<­šY‰^ù8ö¹1ëgöìÜ5gtÝ(EU™úDw«1œ“<¸ø9¸l:•ã Jfº[ q‹,KÏ›êMÅûÈÁ‡à fåá•[›¸£þ¼]5gŒl=*ØG–K ÒæK>€¥Wôj4FƒÀ.àµxÿ@6­ô ¢»ùƒ‹¿œë_ìoëèÏLÅÍ«œ*J Ïs™i¸u¤Šl j'“Ÿ´:ÀèpÿØÙVE<› “€;Ø™-ØV{ÍY^-íÆ¬åaãÚaÏž·ñ.ôŸ³À‘˜ò¢ î· ®D•š®5ªT(]¡ÒR¤$“kjqªdLÌŒX6ò[RäMÔÓ XaÑLÐñ1ü4¬&4££i 5FIB-¤e‰SbíiÅëéî }&Óèú^Sv¢ÞÄ„e‚P$ÛûØ@ÏxÝÅŸNëø)ö¡eÃÔwÝÞ©Tò>IØ@,cD<þíÙYwYÉo¦ë:U±ø0<þ©Ï5ñÌG{^ߺåœjÚÛETrÓžÄäêa¼ô/„‰2·64*qÑ)À(M‰2Òadp>åM+VQI¶c³¸”^‡¡¤ÐœYÝZRÃz¬Ÿ0Oò·ú;úù”¶fv"DÍ¥ÁÁƒZ®…ú›‚ï–r2Öf±ÃH÷—Á¹‰Å·ÆòAb££x ‚‚l„`Yªº„Ÿ<úòÕßø¯ß×·ÿ¡Íœ¸íàKçžOo@XÖíÉÛaúå‚ê÷€ïŸ³ý…ª^@2zN+§@ˆQ™«I4K’q`®t··PX&ª%}MfÐê|×ÙôËÜ\uü‚h Q’€ZËÖJ FI%íá) ™Â$˜"‘ÈB\ H’ 0‚Dîi†Ò‘žÖøõüÉ/p;ŸO÷ºõñä·K:g—‡>?î¾Óü¡ßß¶ô]~¼iU¹FY@ GO`õˆ&ô]'Å8Ë¡@ìæEï½yP ë( ªc!;¤8° ¢tM ¾-¡5PfcJzs) ¡ H©( ŽòUC$ D;rZج¢Åt‚žXä2ȤVÀ™hJ1!ä Fh+ŽÕ–®vÅéÀî´Ñ4H?ͬ”æ}°5&Hêl^´OÁq—ÅŠçoœxó•ÁÏ'‘Ê€–É¥Ó„¹OæVfŸIŽ^QŽ^Ñg£­îÝê2’=ßÅeº&‹nÔùmùͼ‰Zr£‚¡X)DÔBÃ)é!ÃP™Ûqßc—ðŠìÆ,:(,”B:.Ê)ѯÉ‘‹?ŸüÇçñáöÉ_ ½Ñ>µïïÕ_W"\ ÈŒÔH#`sѾ±…òigj¹àu@^ìz7«?ç1©ÙM2­t—  >ÕùV @˜@(“[ߟµ÷Ï蕃GfðÝK‚žBƒöÝé›…£| /ÍãljfˆÝ÷õ™=/<®áŽ­Äƒö_¼¼ÊÕ^ðçÇåPs~ÏùŒ–~žÏoý›Ÿu7ñ?m™³ÿ›Ù1­¶ÊqÐb˜ÏŠï¸´[W&7zõ•Úß÷ï¶ûË…Î*X@˜º0GGº/v§ÖÕYØãǨ\“²Î›òË@ÜX3*gNiÚãâ+Ká}ÁÂn CNjÕ»}/·Ú}ÓIè†mÛÒ€#æ`\ƒ¥“—FƒÐ(™Ù¡õ #þ%`8 !„ùdˆ”¤ >³I7aˆk×m÷y–­¢EKLü·•wXÇXùUo¨hªk¸ =ªtÈ´®´­%8ïû= £w¹ˆ—Ñ“–Õ1ôpù¯ÅÏ_Ê: ‡ùbòžAÏ›ñÅ×k!ö”ÀsëòüiñúŽºcªÌƒ;Yµš’®ßújøÉÛw%6_ 'ùÒº¤¯©×â®Þ›õ¬-jãb©Åǫ̈¨›o?ó®ÉŒÊ²£TÏwÆ}@‰¡U¶dxñù•-0EFÛÇ®d] ƒÄׇ"Mç>*ÙÎ÷Edm…¿F¯™©Z~Îüh\1PUŦ=¨‡³³Î£õ)W‘}-?hÀâOÇŸf~ðüÞÏõS/xß¿ïcÑêƒ-Ìj´»¬V.FÿäðŽóûRÚ6*aÏ$)$˜¢OÆ\„LØ z< Ï6f$‘¸€Q@¤p‹°ÀÀWâÁéÃ*Ø™gܔ˵*Á-óJè½ãI„ÇñØŽÝpª[í- 3íü~7Zž/É͇y‹`Á{0zšUyçI)°ËAKJ ^ïèfÂ%--¦Ï¸E©ã–ÙxÞW0þn¸í_¼JÿÑÝî¨kTûºÞ:šA†ßc)/à›‰øé¡íô%§‚mêgÜÅ}˜ÇÖ‚5–ÞI?¿£³Ìœˆ#Wƒ‚7¾7õ“°€²t=¤”º”m² w6ïwâ5¸§7Úã €C4±ÂµY†ìÍ6û¶PK`j«õC±nZ¡"XÖUºPôýÈœŽÑ«Õ1úRº «±!K§‰ðQñF—f ‚´Rš2A]i¯í8Ba™_ˆ°>–B©¬¢†TzLn‘n.å¥4×aäfš«p ˜dY+ˆº«Š¼TU°Ñ@Ò”¢ÔVˆÊ;ÔG÷®@ÙPÐÈ'¤‚¤@øŠ±•Wöwžƒ£DÙ–F¶ÛâL~ruPsçÍä 10c¾ ž5Á@6œXv¬Â-–_È+·à:W„ÅõCµ(N„3pZWÝR¡º…_XIÊ9ÔMÈvU‚4ºŸºRÀcËS¼ƒGÖ‹s™ŠIbn„tç®–]AÉË@v–Ó ›¦º’-Ï/ÊUPvDüSiÏŒ¨YilæN7xÚwTŽíûŧÿUÿ}É?"Ÿÿ€¿¸-ÀsùOÇ¿–Þ[ìxŠN]ùjуo\xÁ•É™þ—Oï™ ÏsÿxðËóØÐèÓ'È rŸ—¼YAÞ°ET>K•üÓt™å£c¯o`]’˜Ž`--Ùš¾ ØWmÚ•y`[+Ø2­ÎCzC9#›ýi=²g„vP¡ ¤:ät’€tÀšgMe&9:ä;sÞ>8eVÙµ'…2–ìX'ý6@b `¡sB l¬ÔðÛ.yH èž)L7]à|v̼&Ók%¼T–½,Yv‰GJN´m—[z²&‚Áve›9i'[µzÞ(dE'zÙØÎPÐH™V—d‡Ø|ddã/QYúì~ NW}(fÆð=ßH+Ä:IµoEƘÆ<²ëoNˆIÃÀó9Ál@™¬x ݤô›ü ü!é\‘#$úâ•jÄeÉ0AOÜžÑa`‘Z5QY$a™@©}9e?ƒ”5ð0<\Yü=CŸÊ1P4Aü`Žü]f†¨È Ô“¤*J¬{.ˆ,õ0 ÓDPl‰%³b{»´àäÏ¿÷üÌíåå4±ùæ;ý%©;òÈž^¥pdU›õmë+0¯#€ £CÞwV††{Ã3ì„Ä‚Šrs}¨Â6c\ƒ÷ê¼ãêªÐZ®Wà,‘ɲVA¯ˆ‰de°ÁoPXŽ@#ynçeXOBVRåDûB†¢ Γ A€YRqç…oœö~/ñâ=}B"Ú0C8Îo½°>}{˜¼j=ñ³]¨íh×Óm:ŽõÐmaªh«±ÊøYMÔ&Ðí¢ã,[ªÙý¥ÃBìõ§÷§ /SêoÑÕ áü³õa»c²ž)Ò±ÞP (ifÌ hÑX‚´ˆyle÷pE@¦Äƒ(ê¸OŸ3é Zû(êrh~ð%ÛáÊp|[Wà)ß·,$úGÓ;rÃ]9 ‚ý•#÷© {†øÊ¸#dÂIÛš z?r¾{«£ºu9«-òÄUé Õ§A‘³¸ò¼‡ùà,Þ·¹Ë:ð”øüô}Ý3ùäN³F ìt7ëeŒåº_}ÄN¶ø 8²†ú„ñ%(iŒíŠÛev?ý$ÛLëTÃ,äØÈY~¬hga”ko‹K{{`©4ÍLuäÜÓM#£ÞXŸÃÒRVì-ÞAxo"#Yn愎†ô8Pä¬up ‚âF0ªTa]wpG£ jV3©ËªÍÐu«Ú ªLQ˜QÐTψâ…R5…ë [õØUyӚݩ%TжĢ`ÉÀ)‚ÅŽŒËQt(mZ`ÓÔшRö•ÉuZ†Ú• [z jŠ(ÑÕE\¡ ÃÂ7 5ëÒ”GBúÄ2­uóÝøhá†Dfdï ̪¾Ú°ÄVB"“‰¬²µByf–™Ûj¢¾¼\}\¥ê}ÔÄÉ3b¡6õ¤és!PCæA}½„¿·ùW±ÊÒâé2ÊõM$ì­E× UQ11c®ÐE°ÝÝÄ1Šnkã«°T=ÚjÄÈ\ô’æˆyfõ-ÀÚ(Oÿ¼ÚßãûÕc¾­ñÓËþ½)ÍFM"…4«*9AÀÛ?øÝàäÊ–á¬ßT¤Ûì>RXˆbÀ\‡¤ÄñGUÔàFÖABÛݼܗïæOÿœkÎíïG?ùê{J¦ÎêîõßoïÜØÙÊú5°¾öã¡ùÐsÖ34½lf~ŽdãYΞK˜ÍˆAÄ“ÒvQ`¢bƒ€1F¬`"Ž@EÆP‹JGCM*„4ÖmøˆÔN?átñþœï/c¾†ó,Hû~Ù˜_ò)3°J&„” 0!Ô öX³¾Èù¶ïS4àE̸tîò8ö£÷OûçüN”T‰õH˜") ‘. ’=…B¹âd¤¤ÌXÀDA’Ø„©rKïV¥¦‡_Ÿ/þöùƒ°Þ}µO}>ÿ÷Ÿ½­~¼t¾@«¸âÎõ±ëÕG§(nAÉK*bö%wää±?îXšAŽÓ¾wFO·q'€E½RI#—ôÒ«Z¼ËÙ2Óƒ’ÍRNš6àÛ³‚Q ƒ¶}lïÕgr·£‹e76â¯Y\øQ²eíôxÄ=ÐÖö5Ð(’Ù:±ì¨ @ôóhËvé)b ¿Ÿ,­T–a[Ú!}!ÑÄ´‰_ÀNEb¾ç Á2õ.)Ði‹­-áÓùWqÆ`9ÃÞ d…ÿð7ûee<‚–l‰ˆÁu°l`r©)M€L¯TŠPõXš @ Æ›BpD¦Š×þ-Ê«2ùð¢{¥Þ´'Üt¤G•SKÄŒ’^ñÇßnØ>[ýþãïüø;Ù ¿C ú€–L…ó*ªI[8¢²Q´j&®ÃêÙ‚_¿÷÷ïSµã¡ÊÍúF(cm‘¤ü›TðUù‚žx$Ôz ûÓŒŸë‘y÷ š3eL_d=Ú×ò 7¯ih§oIÙç³ýìØë5ÔíälëÂ1Æý±ëIæèô·{ß©/Ï ++™ÉŸ! ]Ï^<ûn=)¢sòbíù-’`A¢H/æÆŠ·%þJ+¢¢Ï*µ;"@‘¬ Ï>Ý¦ÆØ ¨1âT‹†­Êµô&t¾â㇃þ:Åb ø°íïÐà—ÁIWÞ§},âéO¤~̉ö·ðÑ&tÂÁ¶ I&É=¯0ïÅ-¢Ô 5Àh¸¨’™kðž?aˆ„ÅÄ㢠X´÷(|š„‹x¤4I·S¿ì_É—*õQ7ÝÖe‚ÑÂ$lÉ€N˜W;·š3`7×m>&F‘Xœá;U@Á+ІÆ*ð˜VUOÎõ!}ñ3ª„Qpa¿¼HîbõØÌÌi|Î($5í2ìˤ6Záv‚' ƒë\ºÞÇ{’ %±” ‚Rª`¹ÿúÕ››²ß¥®eÍ•¯‡'«]ÙM²ž<,³öiñ€…E6Ì}Ñk÷`3ï[ÂJ±¡{zkà©"p-näûÏí˜ñ/†+)ŸÖ ½uìjÁù /ÿøÕ™?<¨áES.ŠãlH¿šB0,…Ýï_o +z*EBüPlaK‡ˆ¶s¶“úêø†ÎA«"Jûü®{íz½ë:¸–†Š» Ò“r€¥ygpA> åe1 º3ЃÝyß³U‡R;AÒ&³rõwÕÞa[K‚ƒª‰¯ÐZ¢:tvrw'DÈ«Mç ¸ l˜)(ÂL|B0X °º—} S %7¸˜@ú $VËŸ¿ÿíÏP²}¾ÏÑà„'èDÌÎÛ†»;#“?ʳ˜ð—èoåûþò¾=²ßtöwuaíu£ãàGÜá½£8`¨PÐÙq( Öb ›ª@Ê)\ç] Öê0±'’Síws 19Ñ”»@úÐ ÖÉ¤ßøÏ©Ð g$6¥!&KAá ¢„ àÒ©‘õ©æüîçî %‘Uß;žwͽ¢Œ4˜8>Ž«³ƒ)Ûq¾>G|k±±êö˸=Ƹƒá€`q@à~¬yð„22°Úz±ØsÑ5¼ÞµCTct¯G_•£¸:Ö³QdG!Ž|CÑun à Œ$½y|ct1ÿ´qßšã8Ω›6š0FÉR\ŠÊ²çég¥àHÍëëå´Ø™Ø3v˜‘‹;}Õ«Mu- t«ÓÖʽ˜w¢¦*ËYË«¶«¶@Ú0s oª×T_Ö`®¬²"l{ò ÓUMÓ8\Ù°‰ûœÁmF6ëX¨žWìô.¦ãV·€u:;䵌ñ¥Èãèljž6à{X.ePXÞi/4  „j%Ûaœ¹Ù =”’kF›&\^HžakTz~N0ñ-°êøºzµ´ç¶c¶ÔïRè%b¬Õª\É(šUº,b A[VD“°šÂÞÿŠ`åöŸ£ÞS¯™fæ[P¨ØlÔSnH\n½]¼ä/>Í€ƒU$l—OÍåm@’ŽÍqRR4Úù…&€.|2 ê¯GòÜFÍ…zƒº *Ò9R}Þ]Gˆ¨14€Šò‚JóÁÖmUT…¼ÎhŠeÐÑÛÂ©ÎÆÎŒVQ•‘þ^ûÃcv_žîœ÷ù á@V´ÐæTW…8âXƒ¥ÆÙò9ººù.ûfË¿|àìÛ'ªEPÝáè!˜V)†kT 0 AÀB·ªH«ãÂw@¾˜¨;1ŠQ¡l3º‹;7 •×1-AºôËþtµLzÅÃÝvmÊFFZÉ–öšfî>lçÎäÜ‘%w-ÞMoéæRv®¦^ ü;Ì÷>.?|Óܨ§;MBIœbg šñdЙ[Ù÷ù=O÷yÙçIÕ©Ua=á‚Þdž–t£´j»&Ng˜ªN¼Pƒà,舠[–‚)±–JDV¨eÀQ‚iÃ5,‹V€P¢Éj(±ƒÅÔìÔ°“"[BJX°‘PAVéJídÉatÛé–;†.Ù%vå§nÚ”«{çë›»bz÷lD¢PßIµ·ÓòX­i%…T™Û=¿Š\+S·{:ô™cJ’Ê-¤ÿO¨†÷™Þü{aŒC”e @YQP‰iÁHŠ$‰äÞ©·TKÊêÀǤÖ¾»%¸¤à¬AUi&Y[ OIM… «4YÞü¿ß¼´4¾op Ÿ¾W¼£ýé™­&µ,Ö`ŠRAKºå4^S³!iž¤Iý‘ÓR–\•‹*@•ÔŒa*à _‚h„(Õ¼ï8Ý'›æ;ßkyß÷r'ü8ê1{(Ÿã~O9xµžë|¼üý=ŸùŒ÷lDÇ’ŸÒ»‹Áè8Q4ñ€€d…På Æƒ 0ÆhÀc¤¬À ‘B™„äíQÏܾpƒîµwÿÝ}Þ©ßOó÷ݼx˜uØÿH—ï”ÇõçxìbadŸ¹$çà³§+÷åN&=+5‰Á$éZ®Îµømç{5”=+x&’蹂CB@(q€ 4gO%JšWE`ªkJD¨E‘¢ˆETúsǯçÚ—û™ÏÇsîÅç#¹N÷v`æ<š1}\uÓgµåe£…­ú9r×çl'ÝöÊörôíê)O†›¯FظŒ¯†lPÛaÛ µÆRº1@P  7¬‰Ái'­KöÛw燳ÒI7aØ‚cJáÝò°þÜ w +H¸«A@ã…ôT´AÖÚ%l$¡¢5z‚(m¹öÚËéÞWò'Oœ1Žb” ’‚$Jd„êá(ÅÔË™.$&ëj¢w±vƒz`¾ð|Ì/öÆíAz¶’Ö#Îâ¢Ĭ/Çy}m?®ó?Ê^©Ø-\¨éÑÒã%°â¡‚Ä~]šù¬æý`÷ºžýöu¨"¤šÍc£&DêŽxü4ˆ·óñ÷‹Wúw”tZ䳤ÿ-k'Á¡Eõþdð¹¿[ôã t ô„ѳþÓ^)t^9Ñû¬¼'~Q Š“ ÏÖ2GñA«a‹ãôüx­’’Бõ^:<——§krÕ(4Üêx†7#óÖ+s@:«@lV3ƒîkÖŸwÏཛN’^Oòœ³7_:ŸÔGzÄ+­h@˜€ܧ0 û|Š`eŽB<°Ðq= `b" „Té`í:LòCåøJ÷Z®e‡¨>µ)”‚Œ;°™ kð\+Ãb;n“™Ïê_’ I3E€b E"*Kˆv™)%ǪñÜ­5ukŸÔ—.Ÿd¼\ Ò×q•ÁäÂX5»æCÅ¢ó`|§Ì!{3ðÍ·VMY-ÙMóžïI¾OiÏ#§éWmÀ&’C™UÄŒ!  ñ9‡$ܰ ì’‘i;­%ŒÍd1m$n¯F‡×Þ›Yÿ(?G^õW\D- ÓÀ—u!€Žd² õ‰8Ä(íâgœï)ÝéˆWà¢"ÿ­IõCêúèa‘ÚûEø²~üˈõóà:”–Ìn•µßõà“ñÅWÀ£ô”~ñgÜ÷4Ê%9$Y{’?6vÿû_VæzÑ ¬ CÛ4&Ãd§)Rqx°~ÎŽ™ §¿ó²•ÔÞ1;_nß"ÑÔ[ãÒ“†yÕø–@â0Dßê{×QY<Ód2 »$o„–ýÆ/#}×Û…×øÍšù€ªM/úâ̱S‰{WÑU«ÿ| m£¨1b…åÐ N×[düdŸGϯüßÏ¿_åyKv–šÌj~x=üå™wòßÊ:öåÙhàê ¿°*¨rMÀrxÙôâGËp”ôÌ+׳´åŠôH ¡t5GÁ›zÊ}0;œ6a{©‹×#P 4¡IG/z—R­D®x{|ßð(úôLa±¸(A‹Gè^¿õÒOm¦-\Ë»À@ÞØªfLÝ  ´`±Öt_ˆÊz…M邏deªÃŒ’°ÚÜ{Xã±34ßt7±™LjhNÜ«ê!?‰hå§g´jÀ€“€Êùø¾c>,Jìœ Æ9Õºïx@€ÝbÞ 6¾—QÌ«œ7îÉÙá:4+¿Ú€ÄÊÏ|;'ÊøÃ"Â> ´Ú¦²VŠ^ (Ðeëõ§>î°¹À cót¼íMg^,—žOTGZF·2-ã#sÒx"¼#(»ÞßæhŸØgôY9æ…À2D2,£X¤2 .ÙU”7ÎÖ¬ª~Œ Ñy–¥¶" ž·‚®ë‘³ J]æÀâi†ÙØÀÛ\Ë,»R¼dê«ã»ÓCç‰YÊØI-ÁM‚À/Z± ú sÙ+Ò¢v©l hhe—ƒ‚“f!:ŒNÀ¥Ý´±%,» ”a˼(U˜ƒ…Åæ~ˆ]¤Êªp¨ÚÊÍ^¨uðÐKiÛ¦‚ì-oÄH6j¿R²\Uefmg8A#03:X8¿O|–âÚJ;|Š_tg˜ðx¢‰DÂ2E³<-–ÏÅÅ¢Wî¿!°ïŸ««ÿ¶÷ƃàd_âò&AÜa÷ Ëº¨ü".¼]'1L.€= ÆÄ˜ˆ^ÔíÎ/ò=KÔtñ°§%¾›y„`áTÈC-4X©ìKú@uôWÄv^È ~P¶kÇ\J…´°Dˆ8ZE ¿ÂˆÅ„S¬d÷`h†±ô{x²²ìãé@«Ö³àâ/û‡½“›ãv„ŸÞ6ZÆ1:UÎ#I‚KãDÈ õ*ïÜfN5"¹`n…ÝÎß³û}ì=ùŽG‰x¦+¹n€Ài2'‚ÁÑœA§Á­”O»%\KÔŽ6HëÌÄQ u&Ú+7ƒÆk H°Àê…‹¿¶¡± zA«• ¥ttâMøeŒ~&pôkwÛtñذ×üdž(Ð J»x·!×ËLz™Q\@sa_¥QœSâðÔjTÀÒΤ°²7÷ã³^~pÖèE[¸h„rÁFx#^©£‘šìÎQÖ­!8kÜd‡j,v¿Óýø¯þù/™:,&cÓ ÎùÁ†Ëb¡}àT»U€Ì/²Âß$)ýBL„&Wiú DA HÿÐÉàçR0ðhúB!êÚ -¤²c³x^VÅrz VÐK¿Œ¬àë/ôõâ¤rr=›˜¯}ý¥•óY|S¢æÒÊ´Þ¬ ±´(BT FÆB¦SðDa—íQú׋ÏÐÆ$ɱ‹‘ˆÒ(b|Ô#Ÿur®<¶âOï;Úç4Ç-ù`m9âu>´>ãÓÊi¡ŠÐ’z ½®¿zÆ´Å_o«z ç¡B`äüîåùé½z<÷CI­)V™ÀF¦<˜ ͸:ûþ€8çÌ §Ý®};i!¡:T™gÞw1'©Û>p åQÚBÖ½'W±%-zá¬H——ëHŠsq3úZàœ†ÑÌÀAo¼¾%âe§_áãÂW”b·38hÉ~CYÌ)¿ÍÚšuhÙ~}tÍo¥¿¹ŽÎ_CßF!$P‚€(»ÿ?T{ÀÇJ2¨ó`iÂÜ `ƒj=˃R -дb)]ľ꣫A¬ÚFU›À1´-h]ÖBö9"‡œ³Úãê_ÿR"ÀŸ½×´ö“d»¾.CŠr¶øä¤ˆgñâóP©³]ƒRP6Õ©ÎÔ ®jέѭÌ-u‚ÛRœIð¡¦Oð¦yE©ò¿ý·ÐÜx«XdDPû˜èQ“ Ô|_¹Ý˜TN²½d?sÐÅØÈvq^G|­É 1\¾t¾]úÑ}â¢s¥ J´€+XÌ’M ¾ÉS€:¬!,9¯’¿`¨µÜzÐýãï½ ƒ€Vœ ÏdX8_O0€ªA™˜rl`ZèjðÝàíJ}^6ß0¾ ËU†À)ŠÉÞ¢“cŠ/~0ü¾¢ÏÃS²¤8pÆ,6у-<‚–%zpç’×!õ<õ ooXM20êPÁ¡k¥¬±ºÃ² 7áêÞ]ÂÃu<ª7²º3òÑIÆÐ¹Z6²gÒÚ‰3Ðg/ä“8üÐgủòë¾ØnCµ„1"ž&pB¬ÔeI¥N¯‹UygõªWþRÿËñW¬8x ž•´ÞÞ !Š‘’H¡wéI¡ÈæM ªŠìÑ'>Sy£¸p–|‘°QÒ`·” õ(eÊ g7rV<‹÷³ñæ ] óéhÛ•ZR½X‡U8š¬xbMc`g¤G FBîíoÐI4>{ P'÷ÛÖVÅ~cµgï £ê°&cƒ"7Fب»3«ƒ²qöa»l™Ñü™ÿq0YsÆù µŒu2³ë :›Ír„B °úJJf{ÐAŽ™š§Ç$fÕsøÍƒÓk€œœ‡yXHÝ ¼ääÜQd.ß4à}_îÍôöÍù{z¸ô¹Ññúâ·Þæd7Œ¦Ž‹ ‚@BÔG’z¥4žØQ`tV±[L+‡…ÁÊå{‚sþ­×ˆ9–Õ|PÄ@ªš¥Çhvmõ€ŽË‘˜$%*qdÑ@‡/Áu)1È †¬HWK/“ˆ}µ#¨Në!i¦gEŠ,Œ›³w€‰@C`0Îâ ý½ÿ¸†fÞþÖ_N'ü•ÙÔ.!€6Ö6€0% ‡Ø-«|JÓsט¿º«ê\…»¥xé¡5±Áf±Gµ½xK §H#”ê q˜ )ä ËRñpõ49Œ…IH–d[¨å"6¸ÌØáËñóe¿øT?±¹OÌ:wˆ×QAg;fX+½ü½­>Çi¯yÜžûÿ•£ÇêÊÎì•^y­ù×»/âh:2”›T`\”=Ú–XT!ÑÑYÌûÏ<¡ÐQA\œµÆ ÃdñT½°0ÇŸ¹om9=ÁìWÚ/ÒæKíè@&ëŒ:Hø˜–[ibÜIQkzY¿jCÁTØÍÂ% %ªî"[}6{õÊ~Ò'š`¯˜lÜÑÄØ3ïåwx½k ÚôƤ©ºSe!œl©bŒõ®ò¦{RrkÐ:Iপoe/8¢@ÐËæµ,ÚM=ùl²ðì̸(Ì]2Ö ­þ± ‹¦anònÃyQÐ@¥«fÝ[k㕨l\DKn< ìšöRÀêu\o| a#G€8`qW¦2ÐN†¡A¦†ëæá‹6L]­{é¯¿Ž¤§¬Æö˜EíÀÍ4©ý—…¿ºü—±à¡Â(,D­Ð>ê`^¯élK–ÞðM®è]*(JYÉv ‚O¹¾£Ëœ®Ûl´’(Õ-`Lw0 ¤Êð@H@˜o8‰êkkóõêZV,D2*!`@tµ$&¤S«Øü´ý£:ç¸TØ b<@$„ˆcËé.šXaMÙ @ KÅà@…µÀ¤±ƒ"`\#R}\»èجlúÒ* ¡&ÍY|Ý>,QúJõlt¸Ôy|U-Dh´™Ê#XRp)H! )¤gD TÁ‚ ±nx1Ô$¹ä5°l“ñ8ä8:‰Ò€ABd“Œ8¢H›D¦¤¢¢îµÛk³[~7ç'ì¿Å¿|nÏ¿°×µ4¹ Rmb>MÉÕ¢I“JëÇ´è8 ­x·t5½Íž|ä‘'NU‚QðñÔ¶ð>ûÙ«×õß9þ€á?÷È’êwÚ{¿ÆûÆ{ÚõÑ—d.ê.‰éizNÙŲ¶?R£ß7{¶x÷ËÕÒÁPм Á¢<>fï°¾J® ñ€ !‚ ²’ˆŒ"¿RH˜BQ„`ƒÕ,£‰©g×þúœïÇþÝ¿ëÿ]î÷®Ï¿?ïy¾gþ)±ønw=ù—­?g £!ö6^ìÏ¿ÇÇî•Ýgvxœ&@p¨!HZp8è–\’MSò±óýQ2øL×OÉ © e”&‚.H`„’fmÂ,@!„€‚QTFŠ7Qä0°Á@º@’-¹­5—§ß;¾¹¿ÿÓ?é;?_þøÿüÏË~æN4wrõñ±÷óH‹I¼‰Vx"_ò;ÒJÓ³Ôˤó¢çÆ>?8þŽîi¼Éé¿¢øQ¢é¶ÞM«mÒÛapÅŒ ´mäÀ«q©“/íY•H6©ÊŒwæ\Q›Z‘nC!]b×sÛ Ôö×#»Þ&îÄzC k t7bceµÄZŠ[@J"T$UR—¬I·ïÅùPk%™î°=Ú„ÓØ´ù-Tò&hÓ èZ êñ€ /¥Žî¥z €Ì±8 ‚܆Gĉ‘KùÓù cá–“JEó ™DZ+,Ò™ÿ–ýÇ6wßÿm§°;àÁ©ðv`–\, ³†± ΀ûh`RÓT¶0N`ÅÔÅûcê>µË”´çè~;£¯Õ?/˜ßAZ Ëò(ŒËc²bØÄ Iˆ =ªd‡µ@ƒº+“Ÿ{Õ¿ÙNBûuýã¯÷.»ÐŸžã36dlœµãC'Wò-h(VJÖúùÕ»û §úÏÄ’Òе_åv?ë¡»ërJT Ô(×¶#³IuEM#^H¼ãîWž”#¶ÍÜ“#~ÝЈfdq’l$h=F3‹ô®„]Ïý o㌱îìfç²òáÎ ®oøèæ|]K*Cƒáã.òåîÖÖn„½<¨QÏǸ~V¾•ùÒݯ¯#Åàš%Júæ\ò†pOÃÛ9¯kÇì*ìŠvzê×çtcøÔfo¿ã\ x”ÞâZ!F„1‚PÑ --ˆ(bd»Ts0*0 à&Fð€š †y‚ºÀˆª-]¹–U¥2]Œ^GëŽócÚ¦ñNfqV-g†Ù«Ý3ýY}Îv1¬î†X1ùTÿð Íáü›ÿÚDúö ~ÞΛ‡¹ª5¡é eåqœ†BuÙ b V™"“¢ˆaàz;Ý{•UŸ‚™îúõ^¶t<…£ôDr/ÚÓÇ㽃WðúG[wž¼K(Ev¢òØRÓP:Ùj ÛÅ)Íêùþ1¥Ú°¨Ê~>ªªæAùµˆÇVº'ŒhN¾q‘\³ž!h>£Ï¢€ë <_‘5P}ñáxÓ w\ù™ë]¨‘ !’bð¼È^o{Ÿˆ¡`‹·ð>è-¦eÝ ¸_”õ=ì3½³Qå|×ÝÊ}àÔ5pU™èŠh}°âÀô)É ã “_h}×­J†UX0„IÜoÖáð.×À|Õ ñ \ ¹³w»©Ô͸MÃT­³ØeÂG^U¡‡¨º9b:(Z*ؕ䔶à3u#éô~q~ æì^!ƒä°úZïÄñä áÛÁ¥ÝÕ[ÛmöºëC5® —j¶:p¶t‰p¸$¼çhÏç$uÏýü¹K¸mD]Ô‡X ½ûÇÑÞ“ÉÓØ— ár² BÑ擄'óbÂ̽[*Ål–DLjè¸:”¼ÞÍg£hÚþ:¿¨Ã™ 5=x…vÐù¼ÇHð¤ˆJt—¼HNÇßÏäVòäîFlÒz<ŸáükD~mâ?wzM-¬ –]OžÏŸ´€“(ir4gÖNèÌ™ðf›):eu™oLÊ"8óo)¯ÝL[ìëÂÍqH3E€}Näì^àRüÚ©§äv¼2Mk)ºÀiM,2ê tíÑŠk­0ž©PçHNJj>y¯ÂqKE¢ø*íUÔ&~¬ÓM4êš?‚…'öR2Ì·s,¿¦=Âêct ãAH­!u»ñªÅꪕ,ư\ts5Ùã6w™nŽñFN­Ÿd; è‚.ãK F†h´rú»tUYÅV ÜÓávÙ5ë*Fêˆû´­9<è™UןÄ#‡ÑÑ  —Àóá½MÞqz7€ä+ LÅ*¦!UQ ü%Rr#ÏþŠ®u[¯çsŽ®^õë~õ¦žÀóXMQ’(Lc \´ÎR†¥Ô+¹b€AJ «q™ð¨¢é ÜÃ>.C¡ \ðÇr¥fõÚì( nÒº·™‹ÀP†Ç¯”Šò&AÈ¢öJ½l¦€¬D(2Ï ­|t ¶éIš:HbÚ¡Û$*¯¤Ò `,‡#ñþžgç‡Yþ/«ÿŸ4VòBÓiÂÒár6«û…}9n+l–Go1 XÀXà€‚âfØ'^ÝAiœÑ˜É.&N3€}yÂpçí&y™_zUÂ,íÃ6àê!O0¢ÉZŒÄr fŒòÑ:=ÚQ ]•åhA ¤5ÇæŽ¾LFªU!¤º(ë>JðñÇð-fÔp™EÎý¾g6Õ mÆ_æ#äv—‡ß¡¿Òuþ{%xM$¤3bº%ß Î8ªws WÖ³7ð–›Èq]¬úÕDvÕxW×½H¨¼S‘qÌ+y™V1äA†B‘´E´–‹ní"ÛXAq\‹ r26cVÕxd¬r –íÝxµVtåsýÈƦoǹ]éž§ŠëWr| èŽ_ý¥Ê­½„zŽmãß9ÄÀñž *ÿÊÝù6±uRA{-EÊB HØ„¸šê¥JDàÞZEtG3•&[X/üg” L¶»ô&ëv¢§åöÓ·^ãÓ'Ó³ YÜðØ&í‰?±õç ^R½ÑJHEš3Úòjö0Xöä±ÂblWR•ꄀ̰ïãCÅi0™uÈÈzØ¢ÓEaÝêè5ÍÎm ÐÏšÜnåG-ï\yš¹ÊbO!v›&Õ0eND§s||sœÝ+‰ÊB}¹.¶5`Z…Ñ”Qs;ɶ+™T úeõq®Yøl……Òv»õ‹˜§åºmBB-´™kÑ!©ÉßÖi¡©  29ŒèðjêH#Ô› h_'kõ»Ó_*|'Àr>¯à¦x(º–d„ñj®=ðiOÄÂ=ûO̸Ýíü3aûcí&`ðÖL×I@£|4ƃŽ‚ªJêßâ¸Zy‘¤Ïß5<™‹ËÉZª‘U«Og]„aÎîP³öíª‚'Ç’Ù)…ÕˆFb™  pjäõŒì˜Š-–dc‹)R1P IÃ|5È™.K£¡7L'ˆ8•FÐÓ΄±8P£k@$Vb%bV‚ d*„$–+@xöÄQå|¤¦¸Ó\2%!qîë¯zùÛ—÷³·$T#uTBõUd­=ê&w@·A±â+ë›@‚«»;.õ§­5!¡e,‰èx EDêÛ‰X'ÃàÆÍ¨¡ÊWŬ¼&%Kp€BCÜÄÆf½)6;,(‘Ä[açNýÓþûqÉûfüÕl–Þ–Ÿ÷uµ‘0ºÁI= û`½Ô•¡úvÂcýÖð¢Ë’ [ç~öÚz7êJô¥æÀíæŸ½æ×Â=ÿÇ,gæï8þ;ª®ý]5Žžûø.ïÉ9svòµbËÒ| m|—÷[~¿â7½·Ÿk!@v+ì‰ (AÖžzTÐ*ýt®i¹ÛÞ$’гéZ;T²ƒ-ÜDâL¥Î1:íâÖ¦!ÄfÓ¡²PÐÚ礼æz~ÁëO|ðþ.ã$^c/eC.›€~LøçßNø¡LöI|DþÓ{½«ƒ<æõn¾úûU8¤5u$GDsM¶˜o&¹Ã÷”Ð+ˆ@G q1„ @Ra#!Lá¤%C F¾d 0qx@›*¤Æ˜Ö‹AÓ>9ûð¼Ÿgã£ù½¼’Ï÷üM»Ö×§¿Ýûgåc®+¡–[»#áÖñ½Ñ-;tm;i%K¤Û?4™ø“¾%ÙÐmQ¨‚й'Ìad¯ S–:TF"»ÔF„Ñ{ŠNE·ì ФpæÓ/³¶µ é6ÞN¦äBÆl˜)¹PG¨´Ò=–t'ªw‘’ñÒ%ØB D²j#¢/ÕØV ö9ËÛTK‡™{øÒÛ¯¢`C³Ì¯Vχ›?ÄŠ¢Âólú‹ãZ§Ã !Ô$xIG0…˜ˆ—¬æÒ"mxšÇKúlɃ J1ÚNJÉÿ ?qÿycÞ¯ÇwÎW -ÂH8—$gdLœ9wø;L€4Oã å×]‚„J}êýqýmðþöô°ûOÆ_q²}ÉdãºüäAÙÁ†w§½h4šn{FBü|Šc:PyæÙ™Øb ÜÏÙ.¹+wߦÍtåÊi}¼¯ßx~÷ÌyÔæŽVÛùé× ÜiS‰ ?Ï&÷o Ýõ—•¹ß=®ÝÏ_*몑ÕqW›wá­CÚ]fÔ·Ðw·ÃšÀÑ5MgP3ïsUI?|ÜK­‰}ÏcMé’ª|ö8ð!=ã)íë½Õ½³éžCZoÖà|9©ÝlDl} ¨Ê™@5Ñ”Ëâsª ¤u¨ sˆôõ ßFnDÞ~ê|R²:¿íÒŠBG3¢MVäÄTIY»Šú™ÚéÚT³#ä߇WóÚËîæA∢Š*…¸¢˜‹Y ¢0+- ¨£"•@„/ -,b(“BÁœPFaj0!¬ š{ÅN!‘äI®±ªÁ[Žªñrp1;,f  q»Î6ýG@«ÖP1SAUÉnYÔ×In«Çü±e¿­—%i‚sT1?ö”O“+Т acÅ]Ú²@ ìfÞÎêźÚñi ;Ö…Zždê…yXüªþév—òvÇ!꜇SÀ„&±%T‘TÊ´©ûƒ?nûßî£mg»cœ»£á°¹_#a˜µ‹CÚ"öÞÿ¿ùó«ùè÷Ô÷Ð:ù ÖÁ¯n”`œæ7ZFï*€}ñÊZeí³·-¹†{¥\¾ë2yb ±”íê"|TNÕÛR¡¹rÓ«}jøl÷A5äwËqu¥ÖêHØ€ *{’ ”@¼|†‚Öcð'Z±§•é2DLìµÇçXàÂUÂN›' myWØÛöŽØ×güsàRÞ@¬†lsOû¸ ¯H™tÞÁ<8ã¬w'B!\_>4ØÁ w;€y;'wg‚Ù[Ûp@ 'e~Yw.–­+z[7í9ÉŒ›3+YCKækÐHéF 0ÀË5VÚ÷Éýu?7³ÿ¢Ë_¸ñìå®õÅ{—³EÂÜ+жhf;MûåĬI(¯ÖùH8Ìì÷´¥ž¤³ÂdŸuuN1¨Š¹SWtõíIä£y½k]ÂùÁ-Ÿ©²Ì2n5҆ס¥¹QõqœdÂešä©ÓùÜ’8œ$'ÿý ‡ v…Ó7ßûËšß}=2yT]ͬ ••rÔŸ‹ƒö¹óƒÏ²_øKwãK÷‡Ï6È\Dµ,8£ó‰u¿=ÀúºD`kkˆþV{òôžyyõI¡¨¤•Ô‰¬P0dUFlj5 ÷FZ»°Àô@= dcmÆCW»gî|ºÛn©XçßâÁý®áVÓÈ'åúðh ñàý<0£nzZË·AP·½xƒÀùƒ®â¨Z†§ØØZ °]­>˜ûÙýyØÉug/èU\óÄ ´*ÌÁÅéDç#U@©[¸.Š¡ öB”ì¬ûìôÅŒóÊ6œ-ü–‘à9r1I¼Ð l²/Põ¦ ¨¥@è9õ Ž 6BC¸NÖº Šd ªjãw£ßâïî0!‰O–îWò€T­A6š®^s”³iæ:ȲAB6(ˆ¶Õ÷¾çÁw¦U0r3Xñ[7ÏkÏÞÍ9ô½»Í¤ƒì¬jt#ˆn!&†°x€Z²4e&=lOõÞy¢ê-go97ÑF–m«Ô¢ŒÞhYê/ìÞܵ/èø:,æy6º_·÷qŒ¼  Ë œ–é¥{•>èz~Óº9ଂš=Ú2qÍŸœs,“*¼XQû¨Î<2zÔ<ÏMê{ŽÓK÷Ñé5efóI<úá¸l™âvz¸>Ë7¹ÿë×?·xñ¦þÊ¿ÈBybãñÞ(Îg2&’a Y¬N×AòÄ—ô9ÀOó׿ª¿¼\Ô"_2 •¢çܼ%>zwŠr2æÜT dâ##ñ"ÁQ Ñœ‰£±Lx9Ÿòܬã™_ûWÁŒ•#Û9sÐÄn¹Ôv¢õóßßÕç“ÚÿvöØ£³…ûÇ{Ç}éËÙð5ÝŽõs^ž 53Ï¥ÿó×ÁöEöJÒÒÒ°÷@øL®;ÍÇ îÊ8‹ '%àê(åfŠ)}Å; üµ[àd&V]·ÝÂ]s½$SF¢ “ŠÝi“` F‹2ˆÃ›ðEù2&vF®x!„Y L-ÀWƒJ eÒÇÍ陬EF°Û)$ÕIrúPÕ‰ÜU>‘G9ð‚wœm~´~¤/r‡8à™Ú,ÎI/ð2’ ®ÞÖ;Ôr0¤=ã–ˇ¯w^Qà˜£…¼ò" ¨9VŸ)§îÀÚÛjU¿ Ú–L ¹Š” R¦Å†ÖÀÒ @€5f•mžpèɃ(·(, U¥¸6ѵÁ<°Z9e¦š’MnßäüÅ÷uöª7„"üöÖL’GXî%ã_Ú"d*™ÁÛ@<˜ÖÂ޲mb¦H*†F쇅Ñöüéêü|º~>\+¾$$Å KQA‘Sý³Fæã]½×Î?Ö¦BŒ¶UÔ/ká€Uà—|ø4àý4åu3 Ül¦w 2ëOzÛðÛ­ÞЦU ,Ü?V¬zC ºâÂúâät7…*p4 0Ïé@Íc0Û™*‰öU(EF™¡RD«™zx2\¶9ï§ÍI·…5¢bÔ10ìžq®ö–¸ñÀ®632ƒ3¸ÕîêÙ;ªrŽ ÷u\­#S}ÔŽy±ö¤–/#›ÅX¹(iÈ€Òæzå3£;Ÿ¤²Ìn;Ù‚n#yy^ëg~Çž½}¸N·õçì‚,é1 Vs`íZt«¥û ð_óïÆç¹EnH²éÁ¦b®î£aÀ§>‰›á½&„!ˆÒ 1I$ðʼ6 ÄB,ô¦²­ž\µö`Í jDôêB_ê³ú”Þ¥~¹n+µs,«Cwo®ª`L0ÂXj^2Öâ4hÔkD(çÄ)€ÿ툤 =0xP5-1E{ãI€a+JŠ|'6bÄÀ¢ŠÄ²êy9CYJC%W)  "€"Š S):Åh“r^º)Î.hu:4õSÛÏ’7‰›ÕÙ*4¤öð+PŽ©bQZgK40 *V„ Ñõ¿,páÞb=‚Ħ&Æ\.¨fbN¥yÇ^ X¥~Z»£ØÙ‹äÏ(¨ððÕPŠR˜žÊrö½ÒÞ·ã€{½ï‘—óµõiºc`et-"¡sŒXááý*Þm?ì±üƒå›«¿$Ðaˆkwègü£G»^É•Bcõìž›>C½ãnv‡?¾­à&:öe¹-{ü=îúzoÃÏG÷~Ãø0ŸQSîêĪ·ã÷ÓeýsvDˆ…î‚¢ñi„GŽ‚&AYÍ•èÖæË¼Q˜°©*ÇIõ™„‰3ëóž<òÞÿô{ôú7 oÔ}Í·óõ.û©/ìLº¿}óá÷Ÿç_Oþ:##áΧpsN) 2æÞÆdA²6¹l–ˆù—ŠLšò1#Ð~„ø!°©LCª©é  PiÊÐt)ÑiÑU HQeÁ™â#ƒ H*C$D"äÊ>Õòñh¹÷´>»;ïѯõù¢ŸUä·ëÞ×z¯2é³'_¼iŒ£z½s'÷™d‚µXˆ\¡ci`«–†¼b«h&s¸jl˜œÍ}/¢@ëåî ¾Cµ½€}i»éŒNT/dM!Q&Û’u- ëUoj­jZOñ ð$µâŒ!fàldZ%.ÉíG±slÀ ø–CBÑ0;Bƒ8Ù^”èÂA¯u Ø|ož‚Ó(¢¤É  äyëwþñõ÷þoü ‡3.0@Ä  v ޹Q Õ±~ Éä±WÐKWG€µ:qª¡®6ÅcÜëSûç$ÇOñû,;+µ{s!׫u†@Ô­t‚ÇŽ›È6¤ñœ{zöó¯žùbr"0¥^Áг>*¿‚üOŽðuL½f÷ÕBD*&;¤}=Ù2ó¹½Ù;‚&Êp&pà*qé”Ò1&¯ˆdiÔÂ~ÁRÏ>þ[}›Ì¯®lù½‰?0?Ï87æËåøƒ×ûó?¾ÁÑw‡^3b•†ôáYO““Ô[2²ºæóŽÞ¿sÜÈc‚+ ¯ü©µTýmwvk/o5xMt+…Œ‚(fÁ¸H5ƒ€Ûº£>÷3ý2DZAäëSüÓYÞÛ:‘³yû…µøÜÎf¯_‡A 9GÑŠ3Ç Rlˆ\“jŒKnqFEˆ1Ed¹9-œµn¾è{¡g_`f6ÛcºDú˜A>ÛÜðPŠñubD ]ã~ûTÂŒéfK&šBí9†ô €U_ä·¿µÿBÿú¢Ž¢)`]¡Q˜"GŠHñ•AŒµ"¤1 UDDaiA p'1ÊIçu M‰©.l´HDS×Q÷¨Ó“ÎÕ*ÔU« I´«[¾ŒÀ7%)¸F£ë>ð qÔB)³õaÿðoÜÚqÖP­ª|Lë3»¬“Ù² ‡‘ˉ뱭­àKDL ÃTŠDÖpUWëVAâT²¥e×ÜN‰G!G.‰k›2¨›¡r„$´Ñâ`Ÿ]*8D9*¹§u¤] „¦`T%E}¼üwàfåuåùÇg«#|—gO¢zRÛ{½‡'AX’¶ë6úûõc.É/ò¥,’„m2¦\”3WUÝÛÄK³È£}4Öo…Ýç“=ÓßvûîntþI»¶¡„YÆ  ÒÈm€pÝSó†V(rÅ<2·£™…{åÝ*¤iÇ0Ô¢|?AM{±.0•gB¯Ýïe‘¦9t›ÁÓÞ<§67‡=n‹38È!(»>sæ~!ïõ3~<¨zMN¡Êâáå×ïïëg@+ôøýWú¯ýYbôjl ²ƒo> ˆlù[ŒÊÙ«un¨³y©:ùv3w|{ŒóºùüÌúS0ÃÖªu̹ƒyÞ@TIdë®l½‰,½.>cTG$+Ù3ºç¼uÿrs¸|p×é®üJåRKJå¬4ÒõdÏqÑABr‘3U,5ª0q[i]ÊÇϽ=êÚ)‹gÙ+J&&Ã%h¹"˜!­GµÜ©Dï¾×0ÃÞ“—Ó冶nw%8έC–‹AWè3IXgo˾·ãB­oïëÿ•ÛyþÒþE4ošª¸eöÊËAPY…ÊNÆÜñiËþϘ{#åÌéE€­1Ì~À5^—²¯î|† Ð9’@ðèi¢«±Äêi ]LQ‰/p§«9¬Ç#(¡f…2{6{ÇñÚ´|4ÌNû†íµ$c0±Ré»ÕÚê:ßþѽ®šéã&(óû£™½¹š ¯*:”q$­itƒå&PM —v}ŠÞ”N4ý%¨„uÍEk ±£½Û ÊT ÍÜÑx`©)U$ ”÷Æe-JDX)ÐÅ ;Èò»ã<-£æBÑJ=±$ÆlZ –$ (—Ú ·A#mžû›|8B(jÒtdë»Ñbh%¹,ú"˜ G?”ÓNÁŒ>iwœÁ]…c3„pÆMí$.,Ò.Z!ìÄÐXÀEÔ»ÂðÍKG>$%¤%¬2=¾¸ ,Gä«74Ç.~oñDl“wÄ!šXÖëùdäúžIëÀpìä&©Æ`xI@ÕØ³ç=ÒD¿Ña[Ú0/¯¬ Ö²ƒè3éV_»f½þCÏù`î¶¢× )„£Ag p`N<Òäµ]¾ˆÀÝ^5—öDHº;t:ºÆ5ï´Ë]uuF25Ó¡A„IÐÑÝ—i°§Û (¼#8JµKp…]Þ¥X¢VþÏD»ïéÁòŒŸzì÷)¼ÐD8ȇîÀ,õ b Ë«ö²,vw¬ºùðA¯J}6g…0Þ{Ç@’3ÓëÚë™}¢3 2K£Ç¼®gS2T6rªíaIïõÊå×Kçå„g©ïúñöy^ÂÞ~ŽÄ8¼ó§SyÉ¿ÉÿÃo³ß€"^‰ƒû=ï9ê™ÞDKŸf™§Ö{óí Oxl»ï]®v RB¿Å_pL®.C) Ut‡zŒá H€GÁ'…$׌ìÈq“¤3³å†Qñ1ΞüëõþûÏüüËù9ÓšûÕ.1³s¯öŠ ÂâÄ ¤ü7›§V¦ô~±w²ï‰ä'¤»g`î6º±{ž… y{ù¿Ò4‰7K†@Õ&íAâb2•I«\&=:5`ÀÀ v ò¡7P®S’´…ºÍSñR×¶¸Ÿ_ñ Y±ˆÏˆmlȳ…¸ºÌÄ4Š2±DÚ@lKq”ÑÛ꙳ÕH†§¸R-%Æe±è‰)·DʵésÑp2ѯbGJ•2Af-%ˆõÍtgÄð úÕwäm5æóTò—ÁÀv¾`ÐÐ÷¢¤°\î‚x¸uFm1 rŠ~‡)Nu††Ú P+üe¨__\\ÕWT‚!G‹ è/ÛÆpØ=–¸œ&ÜR(y$U5h'µ¶¹è”e+•Sùˆ­QHF'bZÍ¡÷2·›¼ˆc*þÏç?k@P…ÍäÆÃ}â™&Wª×©þ; nû¢HIœŠµFøB€)©tÄ+i€”8ò@F0¤¢ŒNQIü%À?'òsH$vŒöÐ7š1 û‚pš¼^'ˆÔ‡ûáÕ­™ÿÿýÕs2rúý“°V¾%Ö(ÓmO*Ç7÷ÈåzÖ²E3½ ±±Ôñræ‰À¢Å´SàT¥²¸)^&ªP§• Š‚ŒŒrK@ê6 MšbÀ“óŠãd0àqÔÊÓ#ñ0ý l:uÏQ]².j„ÜZ¾›þ8gh4A÷¤¯Õã³ÄÒÜa!·ÍšÒ+|Z[‚f2N¥$@ aLoØ›%A§ÅME,8ÙLa0U&@î&Èz€kpEw1A´-A§UÀœ‘»¾­ßè/Ï^ýp¾óZ•Ðp§fJŠÈ„ª@è ·w»Z*èŒRˆ£¬F2´(Ã1yßQ]Z]u­T“òòBUÔmïóœEÚÛÉìõåªw½2QÔ­â¤T™6t]'¦Ù …´2©£ö…Y›EFá’± ÎAbX‚‚*KÜÜ7­LÅu˜Ã*€ëõ>nµ8‘±`ÚXŒ–Ð"XeVRú†€4+V$¨"ÞQƒ£¯²=Àè*A’þèóþÛ¾ÿ•ûï¹[6“k`/[©­j*Ó´è «ÖPÖF&ÉÔ¹ÊÔ‰Ç`XÍZAJ‡´¸I£—Äâ݆1œ¦n^W?l—•Y/vuV(WSR.g÷v+Eî1ó0”óA,vß:li}ìg}7̈`«6«CxIFÁx«Üç¹óûcçËKÿÁ°ÍÎøæÙû\û2ð-‘Ƙ& ÐÇçxgú_uþ`^·û}"=»pz ÛÒ½Gàì짶ð¼7³á< 7nT*ƒMLUëA° ]%00Ô‘ñ´¥ŽÄ­2NYUK×ÚVÓYlʳ4!n ’b1ˆ<¢ê(‡öøXö)¾²42»p›Ýƒ b¨f 15à)Ü×·¾ôë¹¹½Ê×ð`2„ÚØ¿’ RÅu:M >–·uá®Ðˆ\#Y@dM`^ó"Ú7IóêFt-×Spf9hÿæ|ý\ßþ«˜@¥®ÆSqFÝ(²léQ³(P^u”šDRò…¼þúóÿÿ­ïÿúßÿÝÿúaãÛ@äXf”AãÀë×׿–ùú²Y›¿”¶…$@Y5ñtA6ì/‡eŽ0%VIFlò™ pÊ”º‘Dˆ¨¸UÁ‹½G‘(ÇßÿOïß^K—^_~Ós9$ó÷gr’¹¹×dÃZo[c×Sÿ`¥y•ÇŸ'Z¯/®M}4ÿÿo>áGNPBU­ö™ÊÛ¯~«KjkÄIWÔC ÆÓ];ðémùµÃŠ3!¸5ð<ú„òõŸ§p\G›GÅÑÙ8¢U=a‹Ÿ‹N…ÓûmÁÓÔ°‚ÐÔWâ±¢›Ü×mÀ’®°\<3ýôÒèªD.ôWUø&´ç=¥ÏöçnŒ;'Ì‚Ršyð—ç=·a©…;K¼³þ:–bu¯Ø.¬Î+Kú̼´Dþ¸ÿx 2‡NSöì•øêEzR^ô߉Ÿ|M-y¹Wìz;—ÁºŽêÉwû^pÍñ”jñ÷ZïÅEo¼ ôM×3õ‰ù>ºçÐŽìhUÏZ ”ÂBÔ‹…Y£¢>üÔþnˆš¬ èùÒEr3zFÆP %.té0hIÉ6RPfÌZc{­…À(!C/R˜›ÚÎè¡h7v&Y»—Ùö¶à×D—âHNPàm,Y7eÑš~t|<Ø5¿”ãv0Û8^Úï—ÁÒ,+´¸UUnÌÕôØ*3±˜ÚøЬ©Oð¸¾@Õ´€Ù _YkVŸ½ÇZ[ª?è€m”é–>Û½f!"0Ö&&UÜ…Pîg6œŽ1vŠ8BÒ§n¡eñõ¿‘ÿ÷ݸ˜ã9®û°ü³üîO­¦k:Á—ü޹t÷k×ìé9ÎãȤ“L]áÝ®#’P=“?—×n)ïsK´N×kÇXïãŠÍá ŸaÍhbÀ!bÚ‹9S!ÉÌÑŽWV)td6£rÊp‰ (‰Nboñ‚ö×­Ï¿°ݵWv§KG ýšé‰è„›Ý½‹öÀEÍL–J1êm´_šìk8ö¦tE³d_zÑ­ùa@ÿÛ£ÿŸYyNíÐRMˆ¤ð錭*aüM9ެ¨R jžõN²ÄöVûoÙqòȨWBèuo0N™Ô¼Ñ7äÔòZ0=&:ˆEàhb ¤œú»þ“$ÄDVBØM÷šC½oX»çôæKÜ^ÕH‘bŽ“0—fy÷0JîÍD÷këCX Ÿµ!I êM¼/Yq¿›1}q§èpæP{J܆]I+š_Ë vO•Þ•÷»žÐ†7ŸÊz4mÂI13ºYÔÐ`€bà™`*†ßjE‡¾*9Ê@A˜ FA 2Yx$_kGë಺¡"[®ã:‘7D¸éY}%[af¨†¾׿òbbŽOyö½Ð¿ühƒg²iå9CŸ;_øág ¹4R>‘j{¹¤?ö°*ÅÒz­º~aþ­ã£ŽÖ|Gµ=Ÿß­"Õ»$.ŸÑµÓf&é.‘FZ˜È‹+4&šòƈãé£ñn­ÆO IU‚L»(¸Ý†ªÑ,§Å>l:ù5sWû¯ZÅ';ÁJ˶>~æ\˜ìZÎ ­ IJ hNÞ^àIH¥RK`¢Ò ™à‡:W n”HË–R´ó:€€ n$4õ2ª%m¶\…ôeK|1b©ÈÈÖ`p‚AÇ×ϯç1¡€Vz­¯&TˆMìæ1üè Ta©µÔ(C‡B œ„Èι¾§]ù%!ÎF÷ ‘òªª®Ú„køv’±ìùrÔ„@Íåz¡·=k 8yŒiqõ5ê…sUÈLZåz:*«¥7ƒ”té*‚b‚®¡Q‚ui´8}Üýºë[Ó#Ë!tM ªpáB&D´B Á%l„¥RX ñ(€ $À˜€€œQK#[ ê²5ÆÉn×ϹkÉÎ?¿U§†ÈO9Ï}ê³Üfbšˆ”ÚÖâ[Rgà¨N—F,®b¯¨g€ KÊ’D•4Ã(öÌuÑTLQ‹,ÑVzÕw]wÑ{æ¢c¬"eÐ wZ&x·‘D4Eø³Ù‹ä‚ ´Ý×=PôÚw¼ý›VQ@Gt`‘®EÉYüCÙ÷ŽwõôMyô‘X\iÚ¦º<üO5Ê& 7{Z´æÚܶifÙ£¹–àrç›ÏzÞ÷Ù-þ÷Y|sðå×öWøy?óaÏ¢þã÷šòâÏÊ« ý·ÿ¼ÎLYüÇvÄëôãë¶ý‚Õ—Ð1¿zé£^¯¶ùÏPì ɇ½¶£˜¬ïá.¾ ¯:ÇBtÜu«V•Ô„Jà]|M­f+Ãìtû5ãä£ìã¾j”][@d⣟_%^¯‘Ïö{qsÿ¯¯§~;£#™ŒFNií?]ù«-Ï~ߥ°'; kЈ#Ð!M²d@áB˜ñç%ŸGÀÎJ‘1˜B™É\’H(5U$S";B–„¦D ±5zòM®‹Šfˆ¸Ýa/çÛbîÈ`o>üÞË_øí×òsg\»oÖeiÒ%î0WU.XR4­À%´rEìJ‡žF&7Ž ´,ød³;ÔâƦ+t¯MÎëë]u?R_0w"®ù¼½ƒí<Æ+ÂyÛ[ŽàáýUrw:ŠBÖP °¥ë‰Hq›YʧÝÍ÷é±7ÜHÊl º €F±S±D–'î%OÄ-¨X‚-¯ ·™—„áÍ`!H)eT”„MiGúºÉZŸúyûµ~j§á°ˆ+x1*R\ z M­.•Çk‚ÉC†‚¤Ú‰´²”œ¦guu˜%º ?9‡ºÆÝMöï쯷ööâ¼Û€›¶§Ó6eR§t!–BÑ1z›ßÏÏúÃÈï±Øûúúʯ4ýþëÏÝCòn•)TKýò!쉫ôûõÉ÷ªl£“|Çóy}_7®à&A«Ž­A@X©£I&¨š&ÈQ úsoÂæùúo@íù0ïoÝ¿ýïÿþ/þ‡÷ýÿùúƒ¯úíó¯¯ùÞ•ïŸÿÛ«/§ö§Å5fççó;UR>ôÓµ·å@ÝÞã¾¶¾Ë—ôÔc8¹­~ËTç´¿Y‚wÒ·È0ˆÙ󕜆{f|4òîmKÂFEûêÄ’¿Q&Ä×?£ÿøw™ÿù®“·‰žËó*âŽïtjüýZyŒÊ1C ?œšm·öYBܘ&/0"Ÿâãø"2i*qZ“tž¢³BÄEý,\ðã]VÓ/eýÌ|eú^ÈŪ3^.aD{ωh~ÓSµ“˜æ§NnfÌ¿é·oø#­—Öc9#§©¥ªµÌÀ¢iãlDX‚À !¬4× LèˆCˆµF¦‹• /ïX+£á¤—¨ªBGŠTŽº:µ¦b¨ ÕžM5­+ÈèLÅ^npñõ[xn¾>;£® ¬¤š¢"€À‘G&žG-Î}ÏïËÆ<77ŒÆã©óÈLßöê¹öVm"G0¬6ê‹Ü²Ô£l,È¢:@^ ÃI•éù™{^Z˜<¯·úŽ®ïœ¯‰7ÐÚÀ¬'J,i©Â(Yä1ÕG̼ÔiÞ룀ó\¹^GŽŠº˜q]SÚe±†[×ä¬ð²?œÏ?÷/;×úMðÄÝf©cCÿ »ɉZÇyÕ,Ù mù¦!ÇöN umJY%Þöð}vÒÊgíÇ/ë7s½›Ïîô„P×›»{1mԈ܌ŒOê 3Ó°'`¥=HC½Ù{ž4A‹ò‚P”Ýõ¸¸; ,ÇûL#»£ÛV;ì©áç+!È…,ã7ɯ*O¯OÿÒ‚?‚Ç´™¹­7©e4Xœ\zÖFvqÁOª’_! :‘!T«bZðP'QG=ñ–·\ç¹,R$“GÅ]Ý×YÞÇñ8S‹#Ú6}«¹ãÕõC¶5ßÍCWïªCâäF·õ½†s:“ùÔ÷5ÃH²&ñ€áJt – £ šö>|0Ñâg°R ¤å„vzhŸ"¬j¥Ìä©×q¡lL¶ï¹°•v×$˜Â"c¿€ëõЙը1 ;'š^ W‚Oæ¥9ÚA”ySÏÉBŠ"À’,X#Û\z¦£`¦÷Jc}&~=˜Æ'ïû Ïƒ®ùäì^ ž\T­0iãÃæØ_‡}ëë—¶³b쀎‰”‡kÓîF§ÿèÿlÿýåöOd3Q};ãÙÓ7Kò7M–›¶(æäöº’e™Kå¼§mÔt¼„eŽS攳‰—#`@A…ÓXVÁsí¹ÛB6J£àÎ&üÒY#>ÐVR.¥M”ó|,—AMPQè…‡LØxl»¯uà]h"…So®ëk\Ž›¸‡^&+tkþŠœ@øÌeVÇ:j(·¦²¼/“ 6Ä< PÍÈ à•¡ Š>6€+†4©™("3-½àÄ{ nÄ74…VÌ.3'«ò³YßÊ8¹×áЉe ó{ú‘ðW/jý¡ù¨¡Íö‹)h (ô">«×·J6QeL7T¦0µL˜gÙßË]½€t—œ£‹wGœË Ÿ~~=˜yn`=Á[ê¸Íÿq§¸ãÀu³çf«Ü†UÈ á×yä õ´õËh«`30a6yzý¶T¶¨‚ö„‘ýÁÖE(3AÄc/'0Ï;£™»™¼"°ÐÛúØÿB~ ÊøŸAçºÕO¦ ’k©[Ôû±§HîaŸµÔ þ®Ø·Þ"À[wÍ>ÔarêB¼5Vª ~šc(¹õ8rNM$£*ON MÊὃT.Žî›ç¯òt§¿áñø¶Ù="èýZ¿.ø¾YÓ–Ÿò£®¿ÝÔÞÖ‚­Æã™.¾A™ì€'ÃC“âÔØPÉ.¶´P+u$Ûš¦hØ+äR[²‚›àáîSÇ·ÑEZ¹å‘@ SjÑÀNi¤mqˆæƒWr³ÜÁPÀU¹á«\:Móqg»±*Tsf¨‡­úU²É’;h¾£ƒ‰=J¢òPÄ´ \ žß@2 Â#dÉMM0C!mB"/ È!Ú•$iØ-ÍÌFΣַînw7~x>£z#zõõÎûÅùɸâ"0ñ³àŸ5ù§éþ·‚þÝÿS=ÌœT®ë„]Ô0èP*Ñ_çÿ|¿6úάS>ðYȘ…%ñ¡GW)ÆqŠ¥ úÌÖÙDËÑÊhU´¡Úa´Œ6© ÕO×]躌´“/8ç=d8åt<ÕܲäåÌ„ ¼ ×^E ¦ß[nMAk±}…Œ[ú?"tš•òA¶]ËΘ&Zjœ :T¬Ž*/Ù(Ž,òº¯®™¦XYTÖBcñÈ+D ÙXjH‡2£“’u¸ó²z­ðîãîO§íë$Òô«øQÞŸíõ“³ëÎ*–* }E.ó&’ÉB€J%*¼×σ"ªqÄÑq—¸@£àÜ‚ZšXK¸5]Ïwì*: œÄ) ¨&ÚE¾ïÅí‚®÷6ã) ¶Œ½± :êÛªÃ블±Ÿås d˜õ&M6EÍÐ\ÇJ&ü+%7çã_¯/äwóiŸøÚõlw9ì3_ö¦§¥”D_ÄïLŽ«§5Ï*?‹/¿üÍüOŸçÅ*\C×°So•§åÔ½èëÚíŽÏ ×?—Nõ=³7?÷>Ï÷šáäK§ïêú¼Ví÷~˜ô˜o›Ù[nñJ·˜­ñÔ\mv‚@c`cˆÒOêEÄN]¬NûÕê`-¾š"]à•©H<=Žæ³ê\ipûœ©}§É¼‹­Åî9ô'‰¤ŸÏ¬ü²¯w͹tHð/àŸÿsúkA¸âû·àRÖþ²Û2µèµ‚P42äÂLf2 €üœ[ˆvt2ø#H©€taÛƒ˜"ÐL°lPK‡f´Š«"l@@;û]EN>9ævô<ïž¶óÃúíÙÝ_ /zÑ}__D &é-«w>*àI¿ 3µÔŹދ¤|[n·aÜè*í5¾‚’vmÑaUÇõ;œû$öî]òâQbøcÀÁ¹ÿÊã¡UwÛhLÈjºKÐQM]‹cÀu~Âî®/Ü^hE+‚€I\SÓš“h¦é;‡ ­L&áØŠ"»['U.g!Êà4Ãx\B,ƒÃôõ¾ì×34®æçÿÏïïù[{ Sm`Ók#Y@È—ÌÍ•ƒk åª{¶B ¡ÑU$W[ŠfÍÈñ`Ñ>ëîŸÿó_ÿþï_ÿÙ÷ØûX¨`$k¸‹¦@圑£2wúÞß×u3òë‰÷mïŸß¾Óçù÷gBBrå伸ž!‘ÆÞÙi (M—®âHGFMAŒBE &œ¼¾lŒÉÍ(?|:?¾ÙûÁûÿóÞÿ¿÷^?þøßþþ_üãÛçß"Ô]yÇ^ݾÀ\…¹ðâ\Ýz•zsÙFcõÁa2‡+Ç=*šDšGFz¼¦¹Ï£±Ö/÷Wmz¶Ùȉúm¼ËkÆ'òñãýåNþ½?|çnü³6çc½ö¼ ÛÝöú||¾=÷ü·~µÿ0.ø$Kí‘Å27+ç9éÕò ›¸@*¿©ë‰¤"u‰§Aabˆ’Y^Të"RÐLt;#‡ÞE{Ùôa‚‘"Ü<—M›òx¶Å,Gõ…£Qd×ùš´GDÌ@…Wó¿³L´éH%Ùéc%ÍEÕh÷U“_êÙ›Y»„gÈ×ç,­ܼç«fY¤0‘¢mêtá ‹±zTÕk•õ’ûéY¥½…uY뻥èÜÓÍÎÈÕ]Ÿß½ê¿‘õ$ùäù«ã.ì ÜÀ»ûÿ¬]Ê»‡b-!öA¬Ã ñ–aa˜°#ÿ9Þsê©¡õò‘b[ÄèÓ˜Àü iкI<™n½½uû½ün+e•Cfм×çÞóvû|t“—×/ôà9¸Ðà¤æˆÓײ·Óï …¥Mæëº—e§Wà$•û7ÀLºs¼¹T!UP}zÔ\Yô^Ÿ^Z[AåA9ùæ…ßâ-¦ÝhKLé·ê-ù?¬gG((—>Ô± ç É–a«bª9ªð’WOºÏ[NUÃ*278†ilÇé‚ZBËMçhÇö ™Ü’ÈE¸ÎeUÉ4'²Uw yȘ”ܨ6}’PfN‚ƘŠÖ`ÖÂ,ÔØµysMÙ”-Šš)'Eä°æ y­ëÓýÁÞiðZŠ'úÔïÇÄëyÍlÃîJÿ¢îÄA“î‹–Á è<ýƒJŽf,Y0¶°Í‚[žéó¿Çó+ÏZW ÏP³ò‰X?«æÐÄã ×Õ$ø0)`bîÊ—0 ¸Î©ÆxB6aœz»^KÓ¹òi »à!BÉ\òœ/U•K¯Y{ÈߜïÍ ‡!Â…íÚÅù½Li]tW”ø2 Œ‰€Ü=ç1*¡//­½Õ1­Ç®nΰÀÉÓõv!r•®´Ü^Á9à¹Éð”9á|¯ñ(®éä“þµLØ#Í•uÉÁ@¦íqWŽÂ)ÿ˜OHDLZ&I<Ù7/Ç:Cl­®¾C™.âòœ–òÐu ªÝë~Ö9#"*¬ÆUeD£6˜¼dFXš¸VŠB¥u$ö2-ÝE-229ˆÒÿ‰ÄªÜJtˆÂIã ÊGALJ{!¹ ¶lë².õ@Üã c–O( =õU!˜Ê´jw°vV²_e[˜Ý¹8 ›Û[ÖxÓ5D¯g (¼ !€°‚QZ&$…¬p §ñWú-§¦!^³‹Ýˆ$”R/j1*’R*!ÐN'š!Tu€`&0­&éq¡Æ !gò!ŽÃªn ¬!Ö¸Æ_-ž}wóÔ;®ý|ƒ!¾·Uâ²(v"ˆ$ƒP´ž@ãÒÆÒz}#ªü 5²,2 †•y°Zv`JÁ| ƒ'®”'=íd¬ ƒ¢:_8J-¬ .›Â¬è³ÒB3}ËM8ÖRøj®'«N5ÀÓA9%ú„j²ScK!°eYº!5F‰œªßc²mæž3ækg¿¸6¯ln£ºõ/ø×+Ùt“× êÈb\Л h1¡Îp©ŠÀ!‘“ÐÛE²èÁ &!0²hèK;s9š’Ø 1½@+ç‘[a0ÏQ“q\F]$Úƒ¯à º^Ô¨JÀ”Á?óÿu£Þï·üëå~&Â&ßþÈø¦^¾±æTÛ•j¥‡™õ¾rßáÞÂ!sêkíË30}vÅ’«£ØŒìOSo˜&†IÆœŠú‘xC\ƒÕ´fëD!;9º¯ ÞË“‘› ,[ã\’Z/d™ÄN™H\ô@FsÊX3hÛÜ^Ó³÷‰û0ŸÔ¤+„hÓö–?ÅL¸€ÀÝjžÇrYËw”ÙÜ»×ç\aÊ_¹“H¦k m úðyhÒ7'?f¿¾”ƒÕéÐÒ.Âa“_âoÆ;ÃÉôKüii{¥~,×§dPèJUŠm ÈÔÖµB°8qÅS§9=Í@Z¢”´V¥šÃ¯Ôrµu¥#lC ˜À›É V…CjƒŽx¡B/†Ò¨)¬+È.†³Ój˜7 äcÎd9b'}²+µ¹¢VÙPÀhe4n˜så~ò4 “ã"õ¾°ôã"ŽEZßÉmÆ2Ö‰””%zVvˆ 21V ,ž«e9´†\J[x ·ÆCeµ\ÌÔ’ÇWÔ[—þ̳½aÜåíço„ Í:€Ÿ?Ã?oè7®­þO8+ÓâÒì⤗Á\R­~š•1zJýeõ¿¾æëµ¾^¥ŸÚW Ÿ°n¨niÍk <9­6SYå1y²´»6iqÒ'¹ÓÓï³"e9íÈÆ[#™žÀ~š„¡”æ$An›yP˜ÌötJà”ÜlyJ¼¬k¿ÝQêm3·Ì·' 0Z­”Œ7‹E‰f5ûm ° %„ôh¢‰@æ`ˆàØÅÌ´$¹éj!k(«cB3b6©":V©ÛŠÕ«?@éR,íÃû­ö’FR|Ðo /Ã÷y_èGÁXÜ2‰¶Z|õ¢#k„Ñqjþjšy±jÕQKÁ­­jèìzÈÍÚÙÊÊ`]±¿P3a”YƒÝЪmã¬ñ¡êóò­W*çè™8ÄvºÇ”“06ÝÊW’¬bêoòá´´Ä:üi`èÙ$U¾#›Caœú2¬Ÿm'H6²^YÊ€‘4µ@I©Ø8"„¦EƒXX ÍVV‚€Ø!A1 ¨‰¸h@VJXº$$+ôÌ㪫ŒLÉ?nî¦wGÕ·çîèZ÷‰¬t±ZÚp` ‚U8õÀHDûÒiù”É!EY¿ù)@d ‘žä;ðn·iX\óì$R­ë %§²ß=¯çøº²óÇÆÄMÍYCÓ–z;ÐôÇ5¾núáß¹øíBò;Oâ=§I-p8'g qå¿—Åüf”ììYý`A)ÓúçÝwÐÛ.Qq.ïb5 ¸y”˜¿0Ï?Ûk¼ýeÛäNž2/k<·§½[ÏÐésßÈXqgËÊq×u¬~÷ëøÇ/‚›Ïœý©¿õèÜ1Æßâ]¸‹-õÎH8ˆ2€&ÈÝXrŠ!š®‘×M¹×LS#¯[;²¯m;µxan¤Q[¨N–vÎ’Ïh콰άiL‰½Ÿ5ëŽÚgJ·^ìm¼“¾ŽvÎ „"ð/Ó$ÿùÏЀæ÷ø~Ç9‰÷!¬$CÛ8ð¡ ÈÑ ‚‘„ ˜M¥‰ 9ôÈB+  ]  E@ƒš¶Çj&mu™Öj9¬EB*¨Jћ͚w„ÕæÜžñ‚«ïÇK¿ºøÞ÷Ü?wôyçJ>hn•àmô÷›ý»lSGØVd!™Äé(h½€–­r4£KÖ¨úAŒ[!”¶[Â7 SËÈIjÃW×p[Ø úc£‚ ûÁì¶K9¬“B—¬%¨‚ [JHŠX+µ<3éÜýÖ4•ÔdˆÝKܪÝôÛããOÃg­¡MÊÕÑ1XTh¤vqàw›«š ééi›u éìÃ'¥ÈdÛØç+C^a»áÈ<-\s\ Z(䥨ÄKqÂȪJJW†Å²aö·}å%ÄP*BqQz=o?Áí’×_ì¯2·õüº•Û[óGîž2Á•½ÏzuGazòx¿ÞäKöâµóË_ýòÞçÏÿìW÷Ê÷¿ûIÞrçn”v°~ÞîÎ×rïO™ÒpÆñ4CÞ±¿ç>ÛžUè1’G) @ - é¬2 ‚‚ «>²UŒþ¼c_¤)õŒ›©&¿ áëë›çígýôcq?¦ïçÿÖ'ß~ï?ÓT©º{$LÕªÕª.ùúkÛÔGrŽœÐã)DaÇW@l2ÀwÜ8ôg-.Lfù~öz*ßqº‘ž}ë½søSà¾W7]üý2õï~ŸhõäÊßOöÅÇâá1ñ`bbß¿ÿ™ä¿<8ÿôÏòOªîdËûsïÌÞžuYÒòÙR#Ú#›æ“oõ‹?tâ`n͹J°@¿6ÝϯýVõwþÕwÇØÅ´dV4‘ K¾5½êª+p—7;¡ÐI›r›´7¥!íë;ß·Ÿý_ÿÿ½õÜ)KS Ž^nmj1ŸýŽäÙzªÇˆö´Ö–Vi¥j9°!¬Dv%ÆQ媕6€)nXÄ&B´ "¦È+ÐDSËAc*³ ¢ºrà‚ B )«U†6:‰9)=<žsî5Îlsv1åÜJ*¾Nåš™¢ÐÄ>0…žˆ=4ó §ͺ\Ù¢0®Ob=³*…Õ@%*&ËP …hEpÛ¶¼/¢Kú(8•ÌÕ¬¯d¶×S\Œ­ÂrfÇbgHœ™Hïr`_î“Ó«Âö²þZŠ.\ŽþMi¿k1Ù8LÃTõ:×d)zºN8)FÀÕíú‹wîÖ0Ýø#çŸ^ ´Çš/D/­Ò *!t¼ß«À{}ì¦g•à ÷·>å>-~¦×•Ý»–Öï%³d ¢hä‹Ó7ÿ7Ö¿ž‰œOרŒfÞ¡%í°b_-ÚHÊŠ° 6%,›ºvœ… Ùè#À;莎ËytmÜt§Xî—ÁUÞ2]›¼Çγ—÷*z7Åröòí»¼X)g".Ð*€…w dÐ~ô¾šsÒןxåfÑ€¬Ug]pö™¥tÅ„h ‹éeÖ/êJ7HÄNÃÇdV,p³V³A°1$Ä Œ¨Ä¢ ‘;2gÎqêÈqhÅÕˆNôx!x4d0ªasÉVÞW±øJ4o|HU¥Ù‡|UÌgl™.²Ro ÇßáwŒBÁxPZZs r¡¿?ñë‡ ! ÌoÚí®÷g¹oâÖA¢YêaÑY¥AM2­Æez ìÿÖ_ÿÛ÷?ýÝþ¹¥‚ÛcNcKcTˆX#€Jô¯œ?qµ"ÁÕLÿ‡ã\ôþËù×Ý~åžÎ]ú}„¯ê ¾[ãÖ1ŽÀ.¼t|ò–B¤A_sħÙ–!ƒfžSA·Sø‰·ãçòž'ê¦èÍŒÏQ£–MÜHÔ¨ÁÁ®–7“¹fxy3®ÝÝìW¯ÆÅ6Ï” {p&ô£OøcZ¦%¦¯Ç k Òº"¦b–ÎÆŸ=¿>ñùú{Bž·„•Sºœ­EX†WÈ6Ï séˆ8ÖʳàȘk.qê7(ÄÚ• ’Íà¥ì3˜À7óßõó•mëx“Sà•5xÍq“ý~Äÿ˜ã¯âЇbhÎ3LD‡Áƒ ¯›ÈjY]4Ö5Û;s+nÃ~˜P,¥–p¾›“\ ð!<Ž“%ìÄ ÔÚEb:‡G#gJvîméoZºF Z ÐÑÎ`œ²²õber£ÊXKñƒ¹g7^B%Ë:ëü~Žo”:¥ˆZÌ=ó©}fw ÂO _¯Ùn±~šÑÑ:”´Yp`iË‘Yà·ðY¥ÙeQ>à¬<¯T/ì?ù…<xk·\§RMÊâ‹{šûØå|»%t)ûÓ•þNÅÒC¾QœŽ>RÙüyÈ?Ÿ‘¿÷P«—²-ÄTF°£ü£;×Úß?Üm±î9ìíEö³¨V2ïgóƒÚ0æ&€dÛjíô•4_q%×´FM[ÐÖ…’êSYÒüt8þi7qÚ[].Á¡:,`Û:¢#Ù; E×þ…ð`íb¹Ð fœ¾ŸèS^ŽÌŒ=%omˆ‘Ù# |µÏЉ-Â@€†tÊH% ³À$ô,Aekw´XšK*H1ñ<¿ÃÑ@dÆ.ÔÅ-õ{–±iné×À®8ö—¦i–˜W#=éÎÝ´séÃÀ¢ ^B‡½$kCÂ$ƒŒÚ@þ¦m˜ùsâÍãºrÚW/ØûÔõ9á]È¡ÊÊ6,V¾„ª‰f:,{®ÐAÍ( m[ U©–è& F¬võ´'õ…ÁíÒqœ(nLýJ]bMËC±9åÀ#‡«­EeU±>·÷ýp‰Wab–@a ܉H– ÌŠ”TTX<’€‘„X5â4a]s‚ˆAúHžêú5òÇÔÚþö' ÂfíøAš%³ôžYÑ¢"&E0°F·œÞû& W~2+t”°wö]Ø2q²¥]uF5éMZ¬FM´Uek¿P+hŽÅõç„ÞÚm½^²ÁWÏÔé•)P¢Lò`î´Õ4l)à :×X•ˆ;'Ò„3ÂßcgºâÉ9þÌü5Ê‚›¹f*°ñ[þɰ‚(kÙ§¿ïÓË̯™—âàúqÐ4oZd§çJ¼sdFÙ˜i)g.ØïÓ¶1Ïü°øýÖ^ù<˜Jvü·K̸ï9×Åó6÷Ýí_Ú}‰{ï ç9¥¬)-ºlù†pM<¥eR§&Ç 1e—¨”dg­Àb5 e×N;š B„¤D@ñ’‘Å[á|š¥¹cU ƒ–“€¨ bDEëRû¬´æö c&M„±Ö± Éèu•=Ÿ›ö2•‚Ñ:œë÷Ÿ˜¯¿÷|}ùáû÷c¶»æº´ß—ÿöσ᥿ÿñ‰ÿíïœûÇO釜Þîðõwú+þûDÖ½þ·_þKýëïó=Åëú§2Eè9kçç8: Þg=¼Õ—i+‡±T@@Ôb}\Å*€ Š‹¬"ÊS=P€Æïùåýþ+Ö©þÃoqæÑ¼ŽöùßÙ‡Åö?Ï£½qšÞ`ÿE¨Àå26ÛvÁýëñçžû½òõÿ÷†xV|wýüÒ3½ H›äˆeŒÎ2Ë<;/¿}ü 1HGšäg‡<÷›ö¸ú$2^Hë­mETß·Øœ¬á7þQ¾=|ÆÎË <Ó7M'42s4çtáîøO ÛãÒHD" –Å{‹uI`˜Ž¾©&V¾ §z ½‘ˆeNhj¥UbÓ:RÓ zÓJ(–£†«n¶Ã$nIÉ(ÃjÕ×5õšHÈ¥Õåçôyô»8´¶&^LÐMÚân@Îç8>ϰߌÑxÍ0‰B?iÓwœdÉôÝhõmIòÜÞK(v½Ö0-í½rÔî`YºÏ¬X{£Z†ÝÙà"Yçºø ™QF:ŽÚ,P9ØKVÄ^#*}xÊ ÖB„´`ËÍŒ«¥ÔzWH*«¢X6x¨U»‡³ Tñ¼¤ ÅËèjVzÊ}ÕÞT2ÅG„u¡yŽN~ó[½xm¹Sg Rd?Ü[ºfS@"âˆÊ-t*‰tŒt2°k_øñøÍÇr ØKûT…ĪȜ¥±ÍRwì“©J±ÂÖXÇ)#LᄈµgÚo= £´koõnE,'¢=rñYÁT^ËY ¶ûîÚíŪº¥6~4Šü¹œ—Ã’×áEJ6©UexüR+o™©U*ªáƒ@9$g˜{€)XKÓŠeUÄ¥¹)ËKñ±ËˆeÚÓWSÎ¥~g{êÀC\Ƥ{Ò¦–eŠa˜n¦•¾/\Ëdì›àØØÉpÄÙÍ× †ŸNôÅ×&ðê¹Ü+¸¢?Ü-ö¯l~Þ?×þt6îfldnÍUbŒ‚­@O%Ó5¾ 6It, ¾F*­zÜlµÔ€K訛„Gxé”›áÝËŸ½ð2¡?ëü.<”OŸÀ£vn[VŸÜ ÜôŸ=ý þ¥,?±?ó¶îæì' áÝ-ï ðþ)ÿ†k#úÂáÈuôˆ[Uhã0IòíŒþš;ûÊûšõÁŒä¸qzk¹NÐwéuéÜ!æ)oîJ¤[^¯ƒ,hìà~vÌêm¨¸yÌ-GÊOù–o,åT4¶]¦3}ÿ0)ùnþ¸/²S…ûÁ>ù/ÃßN?–K2 ÐßN"1›q‹âÐQv G,àµyEñÞ\›ßݽ„M<Ñ»uÓÒ|…»â‡` fÄè|ÁGÁù÷{T/£";àç½–mFŠ2S¡aÐï¨ó|óì/ðÛ Ø’xŸ“ÍŸøÿØaþ3,1 mÉ«¹ ãªt&°‰Ó”¸¸ÎØé9m–²ü3 x8}D”ÙKQŵ5!­@Öfe>à‘¢’5B·à]˜³ë¾oý»¾¿ïü‡Üùyû/æžxCß_TÒÏiÇp@eW1Úªq¾ø®b2ÌpÏØÏ)Ží©õÔUJò–„–eÐ=<ŽOS½œ8X¢$UyNdç¨ÉeÔî÷½cW/Ó_óUóê¿þE®”çL+$0>“Ðdm !æ2;¿åj B }oÌË—ó‡ü7õ_¿„ÆÎ½_É{?k´ž;&ÚÌà ï¨$`¸AVN9#• ¢K¶à]õJÞiŸcyõûWÿûOûûçN›ÆŸÔ!†BüeO>1 @$È( CQ+Ýò)_å[âÍýV[ã’±ÚÆ^È b©£ƒPÓ`M‘åO´fí?ÔWî+¶çl¸Ïîæé†òăSàÓîQ§‡+þ¯Au‚‚yBA:‘àˆ2üH$¹œ°­Ù2ˆ^6ç\ð"4øŽ‡1 $ÍÓÀj±Rs«FÇ®úSûsÕ6ÓØI^=¿ýð,„&ÓY•oõ×7ÿ·ÇøÎ`ä¾5÷³vœn¢ÑÒy±rã‹ÍÝA€ÂÀ^ƒŒÁ3@2 $‰`k6Ù9`B³tZ ±Þå¤ 1Emœ [¡)gF;Œù+f=¦ôõ› ¾ìù׈]sèÂeÖ¤%ZĦ—÷ñdæä §Ù¯×¹s77Ù hJ¡”JVR×<æã:˜¹¾ÌÃ×|··”Îմȼ´Nª« Y_Ãþ<Úê®ÏQη™ù¡µz %ÅGÕ³ƒÑÄšP‡ë]PÝ¢† W×l™Zyfki­i¥¥Ö£§³›^ )Í!PÁ®Q:»ôbrÖÙ@>Õý7äË4Þ<ýÕ)Ý-}žomÜìñ ÷ùÁþ~<3Pþý4¬$¨.°ÍÓGö†áÎB]§ùvj=/’OË È/µ7¨é çœÜTô²Ø#74ãј@((AaÝ`Т-ÆájQxú]¿Äý©ùöû}y[#Úï7¤'Ísç‡Áj?®‹˜÷® øtó‚m×í'$ŒtšÎJ‚§a¼Û]0]NÚßµÉ,~ñЉa„ qTYÕ.µùצ9m;N5j\:gÐÜ·lõÕC¦t+a•®vYC!-¼ŒˆÀµ:XMß\d¹sÉ ½–8–oL}š’ʬç‚Ð,¤·aA{ øŸ¾9Åþ~¿qo 儞éäa¡$L€tïô}áDÈZ°:Ô'>öÄ÷²ìÒ®k½Jë K¡‰­±—Ib8Õ£õè€ágyK5,ÔÕ|HD$>jÅB¢BÅ 4° ­F@½8TÖQ$G¶F ATM¬O€Üв„RŠªùõS7ükïœá¯’¯—Rà CO€:N@FYtR0äIɦgjÞ2Z!sFwFG¬JÕRa/muý†!lˆ$(°,²µ—¾»|,}ä=ã·ÕWØ“v’ˆÞ¬P-Äp7ÞÅ‹j¢4T¬UÒ ‹f€,Ë¢’?ËüÚR¡ø¯“ R Ž~‹Ùâ~DE:v)+ß»ùïøË—÷ëg䝸þ&Ódºx5ébÛüMÕ²#·òbV`Ú¯èÎ/ßE«Þž»×ü¬öuF‚þ±~þë’Á@]Òí¬`O˜ÉüøÞšÑômñKŸõÐ@C‰À‚‚‰õUعÒ) EÖÓѨxÞólG1ï›íòMbþ·p˜Ç¼2ùàŽð”¾ìýáæxËMõóÅüµ¸õ»õ5¸5ç²×Ãóå¿|ûáûú1ÏeÉ(ïÔw”šûø®ç·ó‡Í‡™¾}ÄûæÎ¾35žq Í%¡ƒ˜ ETÆ ‰(:ˆâDX”¤*mt#±±¦EG§ÍÚfšcB%Õ©æ*…mW#ˆÃ8"9A8™oV@š¶eê xÒíµÿÄãü A Á_½÷B½]ÿbšÇìg9ì$E_’΄A:¥ótmµÇx‘fm¦—:Î¥xƒæh4ã¤ê‘6ì”}±ÿ†ôŠ{Í+ÙšùùyóK<×  v~ëš~ýÅxê—'oê6&Ð…Õ† ñ!¸zºçªÌa¤Þd~ îc¢R>º›Oöüü¶¼OCÊ¿==¬Ýì{ób½  ˆ´p:CF#„¹ŽQµó2%ÓÕshk7²ÓÒVÖ¿ÞÿžÅN¿ >ÙÑåž/úÜ?ˆôŽþÎÿûÚ“G0R“C` ’šÁª€ÊŸáû®wùr#*#”’ @–"ÏíPÛµl?ý–}ÿúƒ×ø!mŸy¾ÿ~kæë‰K´pKKó¾2ïE|‰¸ šœ·Òýõ«´©s颸åí„zôõ"­dYå…ŠC„ýŠ5¶ T!z$,(2€@+`ƒ´\€M@Úˆ`=œ´ Vt 3;ëô3ÿðÞÇWïõm+x¬zÞçcùñÉE(ÙYi8¿´> Î*íéðkûç¢ûËÛÍ푪G@¿t]hÛ{úýÛ‹…HoO‡¤«qÝïÚðKË.ò©{}îÙß.ÞÍ›7¯pкú!Ô|ö¼^—y—æÈ-ž›´1IÊU*YRÑ07¨ ÜIQ5Óc¾°ÇæSÛSï%õë´ þ-?W'©»sæ ¯2¼áß9¡(ùÝ~Vù"†‘.#Ò9ëMëg+ç#̬6áÜ`ŒµC±_¡Òm)Û8ÓF?ñ-Ÿëû¨•öåuÞoô8úñeì{Ç#•šˆe()À‚¬’@ CI—%´1!¢"(TU¨d´ªp* ‚Hâ…’5 Pƒà•i@A$EA¥&¥ÙxU5K­53ã¯÷ö÷tYvÂFE˜³³Ø÷´ý*§åÜÓ¨à¬P+ÐÕ *µé!E& $u÷¥m%Ýͯ™ }ã¨qy×p{œ¹¡V˜3d¡Qz^SÁiá³×LøùjqÅÄ@Y)8 Ê®#Uò‹W=!ÎÎÑnãœBW¢B1’{®ÛÒÏ™{*XÆ•Á«Õi}{þèo_ó¼rÅøþ°ßýí+o¶9tƒã™$„á<8í=åëÅ«7f{EéÐJ®Ñ]׫X¼„š?õ~é 6VÆÎóuf3¸øÕÏîóáóô\›V @§2èƒA%ÁPÌ{*,ºxñB‡ÛŒfázÄSþ“Z—@iZºªYQqs—™$ö½êq"‚ 5èHŽ˜vª;¯l÷:'Õ†oGš/jŸÐgïMªªÔŠˆ u4Qèž®o䯛­TêYk†ÃUf”‰ E;DX¥®9uFE§sÊ€F¦$am×Qw]6j‰>ôËB§ x%:cˆ=”ÐZ™Ñ™'œ‘¶%ÍʺáÒúª”™.s! E6àñuec¢"1„¼±‘…á[úX­œº /ß…CòfÐcO¨.¶, yÒˆºcÖ–É¡³ðâEi=(HqL—6œGw÷Mèá‘l5Õfí,ClDÀ­±qàŽüáæTp8œæcD3»lM裴íÛl{ZLàБ8$M»t»'Êèa²"Ž–ÙnxÝP‘Ñ®²å¦°Sht¢³ºSýºŽ®9ìsÖÑGó%F£6®lífz³Tuº¤K ­JÊñq›è$S¨`ÅùÞç¾7¨œá»ÒYˆÔzq}=¹DÒ »“™\mã!†Ñ£êÑv±¹„[—¤ýÅ;¹'üa¢FÀdo<œÌ˜+ÏQ6Üצ;έÄ4è‹Ú$Pvfƽ¨+ëÈ«ÔG n`ZØpéŸ6ýl¹ý¬mù‹¨woºì:!bºw B9Àš )B{å+·uù8}Gü]'W4nýóm»ó†vQ GÉ#÷bB>ø…£”YƒÉTXáI(aiº g /OÀB½è~I¤Åööåõò‹në !¢¦ <('Ô d ÷ b¨!K aÛayÐC¿£)å¾€]<~ÿòøh¼’ÂÛÐû¸/>Ô¾Þ½ D8З$,ü)½O´HBŽÈ'îb,rO¿„,¦¼î–ô¹ûûìCSE:hI‹{Ò¯è ÙD„÷»@Ñ*Pâ@?xY7ófša›†ß6î4òOüë¸Ix~s«›á×)%ôS¬píB*§?Ì´vx»(ŽæGúÊk ÉoÓ¤ŒùsöM,°3Õcm „ÈŠÌŸþ#3ñ<,¶p1%ßp//eb;{`Ñ9aߘ–Làå…ïÂŒ‰ :S¤eNÅ:(%zÝvÉn]N³ì³yÒ¶¦Þ 6@1[TígÀ<8â__ÃÏ?÷ݳqžÕ¬20¥F!!’…2þ9¾cõ¤$Õ½Ò•‘Ë…’’{©vNálg>A¦F =¥ìxŽ9?õøÙOçó*.áÛõô󉦸•ø|îø=mG^®¿ÒŸþs÷ÿy æ_¿ô¯|H_Cc8?k¼´{ÑþoöùGþ¿tfó³ÌìY,ôâ\f#Ù¹­^ÈÂ|Líæ‰3ªEN!e@(–El…Ó˜J±n¢Hr3ìóë=ß’Ëb¨ä]ûVì¥ãh_  _¸/ü3úÓ¾ÿxðwŸWWB3^j!†{WÛ­Wm S9ØÈYOñp´_£¥½QäJ¦\Ãyuna]kXBÒáæ“­xEM´®UoEª}¾d@™6`ÇJàŒ›'3™‰v,i58K)㎠R¾ŒÔorOoÇ:Iv* ՞̅+‡\ë÷æû /mÁÝΠâÐUнÐ7Q‡i¥âpq:áÇÑ_— •Ør]1®²o`£J\h_0ö–{ù3Íé–rœ…Rò…L©—„ã"Ed+qè>KgÐQaN$Ö&ä;L·²6!]ˆ¿‚ç1ÖŒeM¬xå UBÊ#IZnD ìŸYaös¯€'¨ˆÁQ`¶$%Wb‘Ø‚˜’SD©Âå; ÷ÖiøùqÐâ¨ùO$w¦[n¢ nRÛÑÊ Ófµ –äP•BÑFåQ'(¹" ]Зÿ‘Ê\k€I@F^©Rô¦¥PÝ-Úc=( ·Ztb•[Çj“CƼkL¢’e³”ÅÐÒ A-ÜEÅY“¢ #²Bå ¬!qÖ°·&QI¨m&®vñHŠo½Ð.ÆÐ9PB©ßâBs!X@ˆ[’0p±Q²aÞýn¸5ÚœjM„¯tõcò¬ªã¸â˼ÑM]éV°55o“JE€4Lf#µ´nS•«b›b!ÄzÆܸ´M1™ëØÕ0u˵æ{´^+ßNî+¿DãïßA ˜¼Œ!?ö®U*iT(˜DçZ ¤¬L”Çcœ!%H{?!~ƒŠ”ܯ$ H&AžšÄ;“"•ObãË‚¼þU|s¿>w“èû4 U$µ…Qª ò›í )qq.l¢þñ_¿¼z7”ÝLÀîèW•W?9;Ù%Y±£tkÚ‰›µrríÞô“y暑55HHH)j©†ƒŠ•´¢"Õ@°SZ½›'OÀ…œÑ»ÜÌûܯÄ}»=›óÿCò=—?Wc7ç׋¥ör~ÌŸ÷ÉmÙ»ã]³Ñ²ÊwŸO;«'óòìÞ_¿|¬>ðÚß° Q Ø—uü4ŸpÿuWvÚ°d!!L¢$T H¢AT$Ô1$L&Ýεjþ ÷ãÃsd u§WÉ×­µspe#‰D§@($Ò1Ä@.X±”Ô É Œfq½+—î¶|`"2î¾Ü³C)k!0¡q±ØŽæC“ÿþoúœ¹/äãæ²B§’•Pa«Â0œ ÛöJÞ§ø¥KãPEIo{"Ñÿ–%y¦-3ß:{´·j~ï÷¾ø}‹­µø‰E^æ®ÅºØ7Ü7?¹›pâ¿y›† ¼ÛÖÜЩK ŠH°¨Ø>‚‰ññT¯G © æ£qß<±YþÞž?ï~¯å—F[n@ã!Â%¤¢éE"#”wË(Âê1zš9ÍõQ^Ž„›úz¬¡PÍáBƒ`çuý^'¿þ±ûm ®þãçÙS§ÀÌ8P`‚ФZÔ $I…B}߉߭Wñ<``HBE†zYG9eôbnçõo\y}‰4¯æQ¬ßþÇ·û?ÌÞy¬M›—ÍI Ø,ãÓêö—¡Ï¼~UÇ] G¡#¶òn×ǧzØL @¦P”BŽn`¶îÉ4P,tK B¨‚}¢ €•YĘåYk.e]£¯Rº>½}aoŸÞð*nNé‰P?Èñ¼{ýü‚Ì,¸4n|úJõþÿ¶ïmï®çwËßé_Ô“G’@ÿ ˜™÷Wj[+C˜ÏìÆ+]RBÍg™>™ðéØ[¯›ipwm¹íî#Nꪉ©hº+ÒAÃÉÑÞß÷Þ~Zò˜SôA²€•\¼Æl¢Ç9è•Ð}~™¶’0-"Õ“vóÎÜŠ.U HzÓ&„çäN™¶«×M‡öá9Ï£‰Œô—.úß*¦›=ÅM<Š ètE¢®3^Ñv¨6‘‹ 6…E ÀÂ-`­¡Æ±3„žt…9!Ì\ìaÓ•²ñl§ãH–E´0oëÙ• $£ßxØ¿¸M³¢—™ËL+$²la@TÆ Í :ÿ§ ÿÓµöŸþ×¹òÚ'_¼à5Ïžî2ØKÊÅDÔDL”´Šˆ”&Äz­¦öýÄó@uѼ N"lé´£¨CØY†£–ÿàÓjˆƒŠmÝ]É·"ć›}‹ÅäL› H}Ut¹Ï*¶²"jmV~œâ‰xƒƒ~å¼]/’¯ýá¿BÜÓÊ‚ë_U,¸rÄ~8aŸhL1¬qi–·Ý®öËáâNâŸ6 ðbõ_ìà°ƒÕÂ0ÈG¬ô;ÑGvq'¡Á‚Oê9áÆT¸åÞvp‰ ¸]¹ÓåtƒG³zõüùSü\å»á­¡{©u¤Êà}žI„½ Ê`®¾ )6èò`û½?ÿ²wênß&JºsÍhs†Kî¡[x>üNëb% ÄÁ¯Á&j B$—¼ÌŸè³>|ù@žïgUÞXã½µkøNPpã|!Õõà”*Ã8XMŒ8Ñ‹ö*ÎËœ(òÍ‹"O(ñv©WéŠ{ Õe^–Ò<]ç² +Q´ š&¨õ;¹~Ñ|÷%8£‰ËÍWö¢¾’<"ý†›=Ì|Ãþžð ÙwtCÃo„gùpbr¸¤Ýâͨ‰-ÃFŽ!‹ÄÄO¸)(Ål徃$~qÏ|é@8¨ót¬ÊD[w)Zh¡zÉ'\Lïøv¡q¤:Q™| ©Zj>ðÔ¿s÷w¦w6ï™ne*£²_[ÊÉÍM÷ËØ0Ãm2¦ñ­¾[r Ô-d¹ÙûKqà©Ìü¦›µŠ’3ÐÿóÆ6æ×ø ºÀI’›µéË"´]±Dr{º±fl¹p^ÉËg3Lе¢”[8Ïå¸L?ya.c¸Ê9éæ“BÝÔUE=Xwó¶ÐYìí°Öy˜‡Ûä»±"#è&éò[qghŠös^š¾WC@ùÁ~ܽ'üì¿_Û>ÿ¡ïû¾Këe\7ݳíëÿü_ÿÿáþÕÒÞ¾²dàlŒOþ~ÐúúGø;G=V¾ëŽì<á_óüËûûü&ˆŒR²sÆ%å‘W¤¹ÎÜm›\L×-aœÉ &Y†™Dôþ;/zþð—üR”\æ:Ó‰Îí,ìÍÒô@ì†Ëû×?ÿÈÊŠ¹üê¸ØÕ“:Ú¬Þ \HÃŒ#Ð2:}…±tAjÈF7nèä®)”£æR}Á±ÅLh[p/ÌåÛ´Sé¼éË4ðD?¡ADºy{žâ=P®»ð›ñ{lèÛr·‡xê{qÓúKŽtÑé úDt„‘Ó+˜½ƒÜt«EÿïážÇþ27S˜Qæá†„GŒ¨eíi¸ô:F«©jH@¬Cκ%=À`êÙ–”ƒ+M;p" І; AÿØþ-‡á+,d2Î’‰‰Ã®h*Û8<ñCÌfô›Ð¿LáË~å+7 !rB³QÔ™bª ³ïî²XgbÊ=wÇ–Ï(fCí¦=DtÄÑyv)bWìù(Ži ™IÁöϳ~¶ 3:Öe™t‹z¦2IØ:¯áiñöä#4kàS–G¤´QWh~`Žsqìì¤â‹WZâÀx¢ä'M_lGN)Ë4áó…^ÛÝ!ÁZ·Ë‡Óþ€òhüc/³÷ÀÙ ÈV¾ftBôš«×S ³ì&×°„¶˜\ì7º=®B÷ÜHrV/ó(“4à3[]{Mš1ôiÙ§Úùy<Öã2ÄEZ`@Õy&!Ôi>oɸXç¾hßÓUþhú\î}JÓæˆ«üùíùù~ÿû/_ì¿®öùmy–i=eP;´j`£)!Úƒ»ZÉäÔ"Jâ†nÜX ¿hÃ7H¸Œ,¨‰¦rrû¿÷þÜ7V¨Ì£}z\ÂÜúX¶0’ÌýäV¼Ä’æN¡ 82ÁÜý×v¿ûã7ëGÀ›Œ¬}D e6œ˜}G›ÿ—~÷¸j_g âõþlú^± »%Ù€f›X g°`(œ˜`´u_ ±.¶2ÍÌ%ÁcHŒ@A¬ç]û û6ÆÖy}¶ ¬u,* b´çƒòñ|CÛ™N@]ÂÖÀÔR)Š.dõ“6¢‘$€ _£Zâš®H¹uâP!D"ºˆSdä@ïâ¨FˆDÈU.lï÷n§5׿e5‰eêt¡ØÚòn¨W€èQÒ•$Ê-PEâ¦Gþ \G±  Gq¸`ð¶‡òW#ÆRK¬kÉA*YÏNY…qÈKV й·±6,%Á5ÛT 7q€!­Ú”sJÀª•Кá !¦(¤£œ?Á"ôW[Ða¼h¨ìhvª£LÜÇøñÃæ>oðcI~›¿~3¿Þúä7óÒ(h IÛ–;vÆÜn´’Ö*ß߇»yf`pi²ýÞæƒ¿Tfñü¥õgXÒ L²ß,á7cM% ÈRi†òFªåªvJZÄèY[ˆö l´ëJaº1µ´8ɆBÛÂQwÁÞ徯ö|ÿ‚?÷wW†z^ðêÏ+ ;ãíÎ&ú\Oð¥zIsCrÆêŸ¼¼¿98uYwÅmrÞ˹¨SÑ"hÌÊHAöìÐ!fP@`J9t$„‚Y ´¸¢Ø+’+’>WÿüQµ±ô N±bµ£èÿ¿>}ÿæü\¼jÄõ¬ÐºäVÒýµ¾ÔdÔ¸ÏÜþñî•KØ‹,) ÏKNŠæ{ùó_ŒàÊJÝd}îo>Ùé_M;¥©Êjò̬îX«[Ì«TqoÔ¨’4Ýèè‘}ioLJ´XñOì :¹oYY®·{Sþ À£ ÆB@»ÐŠ· ³­u;žÍI‰'*ö¦:Æ8ñ¿xr"­Ÿ+ó%å÷xç £Y¥F‚XK *a¶ˆb€¥.ˆ¼Ù6]§%‹÷º"Ϧ‡·ü÷[RÓ”>ÅÒ(‚Ü–øƒœ¨Ô»À‚¥vzú¥ÐVSÌãòbî’Íüeø¨êo3~äÌÊ!Ëð‹F8É7á‡!ç(§[‚½^CfG'À ÂI U1cfâ­RË1žî5gKJ‘ä÷mFfviMôFb³ôx96DÈq¥è'gó®KSðŸ'\”¢Fø™ú5;%lsEgŸ—ËLõwÚ/Ò`ÝmtqÝ›ºGÌòÁù0b#@ÝS¾ˆªŠªº: ?öï¨s?Ž9Êóz³;ó½6 ã§§£,®Å:>ÊÛ¾®šÊ9ÒÛ-y]JxZ³TÃõô¢IÜ¥[X]­7>Ánæ‘s*î-ËD0„(ÒÅÖXr‹#¨=ÏûŸ²Î8ç(¢Æ”5Lß2™«ò…7“üÜòÅ~Þu#Ü¡ðsº>èýõÊŸj9ØÖÙ9FYëy!j"zâŸcw#Ìñê¯_÷ÚÿÇûÿO-¢Gf\ä!i ¬@†€VlN¥©‘r)+Y<̘£4Q½05€0g$ϯy¯=•jDÛÙr  Ö‰ x¯4çý¥ÿÍs©¿ïkPc½™á¥EÜŠ+~$Ú½°™TF§0…(R™øF 3D§é¬¡¶Õ  ’D‰Ó`±Œ»ù:ΧM«³;ó¾¥…°M Å"¾6_¥Sº’¿“l/¬£;æ÷Û¿×Ì (\&¢p,€9ÿBnôŽÃ{ÒQhnôl)å $æãnÝ_ºâÔOô£› € 0*`> d*Îe‰FŠý¼¸ì _=«ŽÅh5ª “å`aQªµd2çšñPVqN ´YW÷Âxvø a”ª3AÖ@b3¾dÿ†Iœ£¿dj±`M vx6Ú‹¬©R€¡3VðL CÁ Ýé¡Ã{ò ¦*?‡~û¿óvW7`MMÊ –Ñ'MUh1Éí,Ž?/ÿ¾'gy¦Ž Ìy‰sÕ›cà¼Y–åÛN)rÃg@›eðÃØhxuà ‡áéðÖgG£‰^ÃêÎÌþX/ŽÂöh µí´¬QÊ0O„ž¯£C{U#ãï—SÞÈrŸêýù}yý8N†ÁŰÁ>ë‡Eü«¹?»öv‘çcC_ÈE ¼ÂÊm0#ªq9úÒ‘~97f­W{”ñ^ ìMª¿¸ŠPØnî„#ÿþ ÷è7x8ó @;ãÎ-î ï›׺:»nŒ²ïó+y}S~õïëý<ز±JwÁ‰G ðê3ŒX…œ©Ô*ÄéÐðáJŽà“ ÖD#µssŠÆOïoüú’¥Ëd(×ðg(O¨hP«m¼åš¯ÛшS½tB–ÈìBÖõ—쿜Ȫ•'q˜×ƒ¥½J¿ôÞQà6.µ´,x¢1 }:7ÞßÔ–4D[¹5È_ñßÅÿáQ“L4´µƒí±Æ¼Ù0õ¶u¹"Õ Á˜Àš”ð I‡b¿•× ÌBñFPPªîFì*¬ó\äB¡&tº¤ ¢“‚Bì‹£Á–š_ÏôGÎoËöÝe·³R)—X Ü° Ú@Üõ*‚.U^\`AÅ R$2ð“ ÆÁŸºyÚµ:ëEÖ`W%£ (ÀDcWg¢ðl6%ŒÖˆ<Iu10Ô8jŒ ÃË1‹?ôV\’H Á2\AeDÁÊ5ùô÷.(’è“ÁGñKÝ’ Á8 dB.‘øÊ§”h¢c\ @Š˜L+!bY1ȨT¡6ûÕêWd¬Š-£q!ÒcÞý¦ ùr‡úõ>Å3 ó=Ï{|ÿ=þPxæ{§y‘Ue˜C ¤A¨/®ïaç/îëŒ<åGowÜï“<=àý-zã‚ß Ž«çoÂ×^¥o÷ú|©q¢ªXÖ¦aYbà£GR4`°¾ÅÆ79íWR¡Áø“¾/¹¿ƒgóNM´ nÁqS°#&ê¥Ü˜‰rý¨ògÔ¸äµwìû®ÉèyÀsJN›ËkÄ'^ËÍ£zàÑL–CVμ<çè†(h˜ 4 C&U‚ ±Hy˜„€@ UZ¨B2Ä€œU­ëÝEΊ|êÌcÏÊ öªí,Ä”×·vþs>önïZ™»<î2ŒÞ@†ÀUX3Íaí†RB HnjÆÉ(®üñÿüÁpTHßmÎØïPÓ!KÃ:=Lº¦—íxeÛäzpºÁ~ÒóTkè]š@QGäa•æý|°f§ŸÅ0Oç†v5»nÂð¤/ž;­œ®ìÄïò}÷e}ɲc—¨hÃÀd:âgøG²_À[Áƒ¬âybV´¤ÙlWÙ¥î \íϵ6{Ï.Ëå|¾ësÚ¾__|¤ožÿ:Ù n?øRDiÚØB¹Æ0šÑd¦œ“d%¨Rw#;8¨aFÀëQvlÒôáCg ƒ^o’ÅÍ“Ÿ+“/(@T€,cPCc B* @phK¿øhßš±Ãž;c>ŠkpSa¾g}P ›ß=~ÛÞ¾×å›ù”ÔÇÏœŸ"¼¨“gûú~üáö™AzYlÍz)ÍûS2ï£8ؼ¸íµ)´CLR^ *—ÃV¿ÿÞÚÕóü‹z·t7öÐ (œ¡aáqàq;&…‚¨bH,É*¢ÿmàrœðf.xòؼg`õPæŽÞ÷!õ¸=~”—Ë/D°øÏCߟ*|~øçëË‹ówúªIÇ‹÷¡ÀŸùéæqX«ö¯Çú½r®y/ص‚ºË­Èø {.°ùÖäpú›Uï« o?¨°Aí@F ¥Pa‘`ÅC¢¯Þã­çoþÿª¿bX¾yxçñÔU‹;÷ÛžÔ]z©Œ«µ2|*å´_ ]uDSd²Ÿ²*êQJæï”°ó×âXÞÏ–îQ<Ùßõû=£ìè-5·CyÔ8ƒb[‚D« Äظ€]Zl' Q‡ƒî+2•ÁlÍ|r ùJú@(ÚıÕ×È•µö~Åwö<¼gï¾ ö®^{ß € ‡¯I$bƒÊ²é!ŸÍX»U”1‡·ál+€NYð ‚r³æ†N,TThꡨS\š„À˜A“‚J7¬÷G÷ë;Ùñ¼„Iy*3SÒ‹{ƒ]n%ð–ÖNT­[W/5\mäÂu–ñ©2Û^·?×T¨¤»_雯îlÿüy¶¢:˜ker9Ø6î!Ìpuk­¹pÍœqaSœcѧV’ÚM¿@ïi;ér„Ð)2©B´“tqºÔÕ´{2žg³ UL„ŠP´ è0ÏÐçf¤]{«"#é›'W£WGþTïÁ{Ïê±X³{òøS¹£š’ö˪„Ü1ôp|%7pRpÐ(4Ô%…²›Š®®½áÌ¿ˆyLzo;š¨:Á"Ë’L{V,Î’áFE×ñÁùé΄ËF+祪Ժ‹±¯t½/FƒÑ_çly~e~ñMa¿9zè·¤Ú“âY´ÞNø\­úå¯9_óøH·Å j‹’«›jF™­Ø×ÍZî=­·s$òžNdÀ( w¤ӧ;JJ n^ÙP"¨¼jK«f#¼êÙÕâQþx‹qK¶¨RäåIôêÃIìm{anáŠLY €©Ç~¥bAìfoOyF ó€Ðš‰£­ãˆZ"x®¥áqEîU6p‡Uz»3Ä;óÝÒYwr¥0®M¦ê°PCe›õ'xX|Æ0+ ‡É`F¢T$#ÓìߨØÈ;»›7‚²æ\ÂC·AõÚ™mAHáà€âI_óü<,( JQ`˜¨…”†ŸÌŒ°¢ÂÒi¡ Ênwt€ÑÉÍ—.FØ{“]‰^¼óžŒ“¿Ã9àÙÃN›ájn¦¬¿Xïß½¹t¨r 1Ê>Î4Ç#9W¬ ›^’ ‰X9»ª®7.c-=ûFNó&NÜÑó*d 2ø3ׯµÃÛoegýÎêš{aï[¾zÝÄË%ʺڲùl¼•Êü+#ÈG§æ4»#2Ó3Îp€5ñÈŒ2žl £âUmaG«:¦ ×MopëX?Ý ÐW"ÁGwCÁ¯ùO,Íýáïï2®‚°xŠä\v0üP¯x›në{LŸ5_6Â0oeÞt>1F¡\sntù|ÉÞé÷0N¦ÓðãÅ­%Çu6KŒ]áhQzÓ|áùPå­{½°Â7ø¥ö‘[üÌ•A‹ŠwÒYjX±Š ¾yüΔ¼C~,ù¾ý)ø[¾šŸOÿÓZãF2ÒâÏ KÒ;t6 °œbo¯ihu šH…C¥ìååx.pú.&wúÐ ùMñ-ÊHf‡!ÐÒíððµœ)fI\B…£ ò‚¹ü">•‰&}’ŒR”„â0fDpE^m¬³~sÙ%÷“G ¦Þ/î3sÑz ä Ô’àÔüÀÖ¸.„¹˜]êÛãÑwÄï“ip2Ÿ“RÂEYš.ñUúdRvÃÅòÙ3†éU²WÝ2QÆ1ŽòX 6‹.p†ï¥Åût_pyˆ/˜ Ž’/ >ø<„?ØÛ SfÉ¿œl²“é´æù3§XÓÞ¾y{F†EqÒ¬!–„ŽMqQ\ò • )XV›ÔQÖ7ä6µe‰<8©¬ãÈÓ¾%žŽ»]èóÄ™ŒbK¯‰†ñ³Jô8¾žÊõMoyHôÊÒ*rTÚ3¿|ïë_ä\2jؘà)çwñõ¿ËlãïÓýžèOù×Kî7ÌìÒgg‘š2(3ó)S®Yieþ *Ц„€ÒøåAf!$CŒ“ùÆùµnìmñ¼EÀ’Í©šü‘÷'”Ò“¿þKüþ#òêûw"Á~ÏÍwÚ\òÒ«èMó4dªG¸@†ˆH€#š2 ’A"´²½^èäÙxq52mlnupfàˆ,iµ×tˆà® ö&÷”|I¯¹IÆÌmÚ¥TÉötà“¦*4#uÔã¯GÇ› ŸY²f46Ù”9ž23ËÅÐd6öÝcx®í‚¦êDcB¢³Ì?”¦¬´­-ݽ¢0Õ\ÛEXèÊ0Œ Ê ´2†œ¯XjnpÇ{xñqL¬¼byZ†Ë¼ìŠ›öLŠg§”™±ç‰(,c.•$E œ^ÌþË&²[”àÊPöäÔ(‚¼T+ÓdÐaŒ±cdtGQ™)!:–x8†à ׯå§ËÀÂ2}»xt”™I\[z‘穪_¾¼ÝR ¨úbR}uí5†Ó!id³É  ~†¨(HÁ^S•tÀQ›ŽbŒAÁ]æ®@?3m´²'±ÚÌÂKá`øm3-]ûŽEOòЛãÈé7®q –í^N_¹99ç7íþñ_æ/ÿâõ[_þÚó{öóß ·ºŸz‚úô™Èk9/©ÔÖî»vѰc‘k ¢•CxœÇL÷¹£… I €%ßJG}Tôહ«×ø7_:¤4±¹[sµ¯°‰X±Ÿê~¾±¿Ÿ>NG€¡ B;‰6톘ŽCÜ  qÕÒÁM$’É Z+mìbÑTÎóxe`‘ÝŽ«…Êô¦üOùE¹ó–Yg¥ÆJ,ñÀ¿ø4Ÿ~(&2&ÑÁ> *ÖDñ.9“¥­M°Î¶·’tŽsŒñar“S0ƒM“¾Úêtžˆ—í]y×lãmêù¿·ýO8 †¼bÁ¨¤Ák•ñ ­`Dbù(‹, ^V%L©W(43h0Ç•h QGŸöÙØå–w[:pEav™dëØ!Æ…éKgWû³„…:-ýÄP'σH²Øb(n1 ¤N0øJZ&>m#¢¡õÖ³º‚àÜ:Ÿz :ha¬K¤lµ‹¬ŒLCetÊ&’ TD +)aGD"l— ÎÖI±Š µgjlæ:¥…?Î^÷åª+™!Me¯ÒÌÒSžN¬¶ P­Ì cJt‘"”O!ÑÂ5$……ëD ’Œµxq ‚Ô¬÷NÝž'H­ÊpÏ­§ÿöcäœOý™|^ïç­ûùOçoß9¯ígU÷ý‹c¨ 8³“2€†JØ1Ó›¿£‰Q÷‰×ã~cç…¢^Êê-¿°…çûÁùœ¿“>W°Ì"°†ìÅlHmt°­}Á:Ž‹ìøJ ®Šâ»[ØÒªw±÷uã÷ô³šñpz<ƒ©Tã<2Ä,³ÙE—Ä/Ñ=†—Ó\¾ÊæY Ò)Sϼ·]§×&‡ ZãX1ÉtvtqˆAÒ’í`¢€Â@2|(ŠèÁƒY1„ˆŠBäv—¤ØT'Õyºõüþ›/Ôs@ ž_K ”¬aÖQþñªßºÿæígR‹Ç¯ëï6ÊêÕ¹Æò¹8g^ô‘YC]±K˜]ú.¹Ád£FD !ÅìQ'Ëb‹²ôLYø{ú^Ñ5ÿúAä?¢yŽãæµÆ_“‹à ¯/×ÃUŒÀw·yý¦î»Ç`6Cå+Ó7z¼Ï;u,]¥ÁÛ*Ûu‚§w‹ðf*û\“Ô™·Aµ \"*—ÇtMÔŠš®ˆYõ¦˜2#Éêiš”\5‚€ÖÈ.·«ÝN^Ü4Uª«¾4wúÚ‚…ëœ7~¾÷ènÚ„Q£Å™2$ÁzìuN/ÛÃî$Í` b4¸ÐevW™ò/ˆò€Dá/t‚ðÔ’'†¦ ‹`ÉC%¡„,!Ú÷ö¯ß5$/5—F½~¸G£Œ D7$¤ ½hKZÄËûu®ö!kšá&NnMSªhNq™ûlÎÄ£¿™ÕA,ÚA0Ž ,¼:mø+xÇÄ7:Ù˯\Ý…qx¦Zûcü`ìÇ2i¬+šž ¦1c™˜¡ÐÒT Eš¥3Xg½êæyVή‚;D¾«Ú+c²ü«ù¶?âýpƒ¿+`¤Mäv’íñÉ>?wåL×`RSÕɬsowƒ;y§ìŒe;¶V>Ô_l˜5ð•b":[½ô õ]ðØIâSï»í¢ÈÕ<³Á_ìúÖ’Ç ghtNŠˆÎr³"”kˆ&Ü­. OÃhŒÇCQëøÊÇÅkOö†XËj¾oþT»³¨ÝÖλ9Vh=80—¶ZŽzÕkܲ[oz_AµèW?“žŽ¦ |hþ>N[õñ’˜iÉäaã¶o9À¦ØnJé®î8ˆ ÈÞ^º—ëMÑjºtjŒUžÑ~à H ËM;À°2TI!€ÈKPÁ­Í#ίÈÉ(´W»óUäüéK·CvMZcÝgÔ>uß·ƒ.dÙVEÌjózifŽê£ º~ŒÛéeD·íyÒF+Žfc g«í¸*2eˆ›ƒÍæcȹ[€#ÏIOð ÔŽ½Ïä0«oáÛîÜÂL)L¦§Æ³»'6¢SRJÜN|í¶,4X¥ät«»Å8˜#µÄ®ðY“‰ÜŒ^"µet°y¸“.¼j £D 8ŒhÐM˜Àw²‚k5b¯wÏU/ô²bÇ̘¥¯Ë„=¡ýÄ×h‚líÔ:÷ãŒÏÑÒ}¤ µiÇ›Ù~:qÂÔÐ †ÖŒ³S¢{i¼³¤­?Ÿ5 HŸ ]ÂõgûùEwéƒj€ªø ™Ž\ËôÙS¨ÔLw©‚s¼£|’›ÇóÅ%(AK3| ˜.š^0ذäÎÜtû½•{±éwè¤a¨ ~€hO²´xÆŸW?½þ©ã¦µ] ¢¦wà5 sRZ,E'þ¹âk±%+ü`ƒ@œÌ‰‡.”FÔeÆÃ»/ý>ûtíТÇ47Lð¦¨|¦¿èb±žt›^«§odŸ}%…i$a©J" Òd²2ÃMt„9)ñø—¬?¡mŠù;&ŒüG¸]@ s;^ Yj¦s¿ª#[Ý{ϯp¡_­ãr')€žE¸rSØñÛãÍ– »c~g]ŽOá%¹Ý^a‘õ:±býŠ?«?ÙCÎÕoÂNC„ý9HIår,ëV»ž®ºœoËï†4è÷XžHÍ‹•wÖ÷»{ïœhæÀ÷Tï›øƒ®‹ÜÂN2,S_SÙ™±#h Žú"úh÷(Ééש Á£wBðÏ1³щDˆÀJº@–?jæQ'[[ôD¢›gÏ´Oï^Y®ñYj@¥•+™åIW¬oÙß/:ÿ¾Ë®×¯žÍ´Üëí+M¾ØwáBd0:ù†òÒ„ÄàOdQ**Ö:)(‚(¬ â^ã lÛëI(S:Õ—€r­!“ÕÞµpºrÕ®7èA£ À—ý°a›pe¸!1-øgX=Ý®¿œçs"­‚ÁH‹ä•èKφ+f‹ŠYÂ;C9æ¬\J0€lC{ï–Ma]Ey«io:ó +YÜóÑÑÝÝ7x´žLKÞûûŸúÏwýùçñ^BØ­±À¥2JYÏ8™Œ½ï¹'çÑ_¿'¿×~¤å…Do~¸Í µ#Úö(‚…TùÁ¿*t¡S=í lOnÅ>¹yb2â(^+Íìâ:q¥ x󑱞Ҽ„‹4 êB"]Ò7r¯Ði¶\ÉdwŽ‹/óå·_Á&©t‚sʼÓ1 #¿–ëÑ_Å;ʽ”bxÖ6à^t¹ñù@_E.šÝr»÷»üëMïÍ)ýL_Gt†T$©jÀÀÕ¥k;êU'wÀ•С—5„†®¢¨P+ŒÃyiB÷ JçÈR²6Ì6™ “T0g8»ÒlA…»2>BÕ^šN…•ä2;⬉ñÿ W³³‚¼ºf Þ]oÁ…lÓ.×ãFD‹A¡QDB0IAH>Äy§” h‘= Pq²Á§«¶g¾ÚGí½¼ìúšEwó´Ý™C£|ðí-øø@|ŽÌ}Hk-±Ç2æø,ÿÖÑH$ ‚;.,z•ã–‚ S e{å0tº—°C«W­v÷eM,“…„ꥪŸSÿ¨¸}P%‚šu¨—a׸õ!YŸ™.÷z´Ý²Bzc¾>_ïcXëxÐÝ4Ë›ª¨-YÍ=Ì µxø÷VY?ë^Ñrz?rËã)î«gjÜû ¤ô’4F¡½]q ¾óv«¬=ˆ.hŒ{ìû>ºïY:O¸‹ãñZþå¹i÷ú€f»nµ›ŽÒiB7)òÁŸØýÄ[ i´Ð+7ÁÃ-v¡¦£Ÿøº©­*‚¾ñ¥$¹AKËw.&£¾çú˜x›mÚâT~ ‰RyN”^ÝoO:¯`æ,‚ü’ý“^uËZ/Ê$ ?´Ç륆 ÌQêý¨7Á«%ZÑkô‡g¯ MZ„ŽÆ êòÞp) IŠÆ„‚‚Ä@ žE,Õ˜$Ì•/¶FXøÆ"–HŸ¹ï}óêOÂñ‘ýdö£óußËö®¢u¸©ë*­Éd[ÌbKHDBÒƒ ‚ï(ŽAH0E€*¨° +HüÔYhƒuaðôýãïx¾·A“8X/žZ° 68@P˜"Í0ª+K‚@ P¦R5™fš,ÛjXq¨6@@±… 8`@T®ÖµŠWk+<çÝò}øçhrÍ7¨†zLòvË肨^, t­ãdŠPÜVî©3„µ¡„i¡5TÙÁÄ-ôxÁ=¯¦WÓxü?}N¡?5Oý½ñ­<Ó—Ïõ¼gÿÙ™<›÷nx:´•´£«/ûµmÙá%µóo+Aµî–¤ï jõ%e}—ÁU{oP£àdQж¡,Y™85…)È@ç_IqU¯=Úƒ·tëÝçoù®Û}ûï[½ÝBÀ!0>æ°‚ 7Á¡‡E‹ã•cýö܉ùÏÏéÿºÏÿ£;¿vŸBè¨8ƽ~NˆDÀ"HÁD)‰A" @ÕÔä[Áþ$ ØTŠT±ˆŠ€æ#YYà¡bºÌ.Ð'Ï÷Oš®Nñl™TÙ}¸›|&g`ý°¯ŸëÇó¶K¥c:e*)d"B¤A¿æË4ƒÌ|2çÓŸŸoíÚN¶ÙÔ¼¸tûÏ— ¿«ôÊ%ÿÏØUÂ@ƒ–Õ&òaD0ãSiÖ—‰™VßïûoŒž^·5–m ¼GPïí5ÏUsöæ5ÎÛÓµœ7ê¿tž-òßþþ¶?ërÞ_¼{¸õj?&~9•ŽúµúCñIîÇýõÃÿñkò!¼¶ëA¤P&2ì)ˆô¦½-ýžã—ïWó¾ø‡ÿ&oå}üÎJÂj÷ÓÓM^^Ì?ýãc}¯þoŸç7ï6­¤K8œ®ïN‘±€5ˆ”£Œáˆ6‡E Gi¢>Eö‚bt0èfFÂÑQÏíI`™ã€b†t«§S~Ê' B$€ LI€Bœ`ñJ+¶Ú3çq[-f KöŠ|Xr€Z@µxû­^qW2ÓE¡¥ôø¡ž¦ç¹o§ý+äg3@‘GX`IoìíÁï£÷ýtîzíËÓÍçõ¶ø–;vÔq)ì„*¡=ôÇzïññšzk?¦AÁ°»Oš&|BdÉ‚xZuÉÚ´!ÙÖd*Ÿ¿Ç=m¯ë»~Ÿ–=àÈù¨ü°6?ñ?À•×ûWƒiý24ñQì…¼ºéoÔ9,ž-FpwŹbí'ïFh¯Ù‡Ú‚ÊÃóÁþö›WØwï÷¥8÷÷͹úyB߾߯oëë§ ¢&·tT†C]6:qšURd'ˆ*›ÈB桱GíÖîÜçææ¯´ãÝk¼VÛ‰—^ýmn83˧ŸþÍuµ˜Pz—èš à«»—Ô›ŸhBh‚£¡¾‹à$-Cjb.ƒgÃ>hL6Q"•°˜.ØÒOUÄ|t…U™2Û€€môC¸r@Ü(骸2sÅ,è®AaŸÈN–4îϘkË ù9‘©ayR!ºUv¢9,TºÆ„¨TùÚRïúK³c‡³õú2}¯Uóè‹èÑUY“Îô‘O„hôäH F ¢‚ZPML@:À""²'¦A0fX©uyˆY û ø×ßjÚY¾L‡ûÛ÷§YF÷ñF; ¢T¢´äiè ZžÆ:Š{u‰^ÞdÛäê3s·8ÂMU“ìã׃äkuG–Ú­R^‰öüð©ï †Åï•-"ë5×LSW™¨Á,´ž~•-玩 K³*¢£ZL»øPìÊÕ¼ZЂñLÌä’‹³þìëÄ÷¿xÙõ{q,Aë>^FïX3Ùè)¯Þ/ë_ñõ­/4ª}øý7¯›ÜgêhOÀ]ŸIëôª*åãв†Aô–1 ­ hÇÅn½T¶²-¬IhÜÑ„+}[_:ýpäZ•ÆvWÇ—tÝ´€O~]yP¸ÊÒZR¸a £Ð(Ogéb§É…fÃÅbIåïæ¢žOK^Í j5H£, áÇ(›úµ#"W+Õb·FõEÞjpb¼iÂ&K‘r4/ª¥ŽÑÐm»ÆA×O­®)tC†r»øÞ‡oœkeã¢E¥µüÀú"Ï OxÆØy«¶èÆßÙÛl.µheXHtZË碭Ý —å¡öí8#g7õgÛv¹2qñdßc‹.‡¸zjÝôM¿,&¬âëñ“²! „9gAh\V܃íꔘ$£³ø”Têm3JÊô²:óUF;wGñž{žÿœŸSíð·¾>Ø\Ýʶ^·Í3ù¨/mXBÝš\Xí£ªÃ)7ÍÛä%UZq´Aï0Ëããèî%Å­Q‘t¤­–˜H¤pïÀ£&ac@¾˜â«µa9ÏjWùpuzÅ÷ã8 ü>÷ÞƒŽÂ­ëÅlqU–~XùgXÔÂ540}hæÀ!ôÙd¾m‡ÕÖOsŽï\ {^WD\à-]ز$„,Ú©ö¡Õà?[<ºtÃr¹ý–ÆÊÞ˜¿ëüÅûh¸gÛ¾80³pCæÍ;çåßs‚p‰ ‘zè³ZXI¼”ûvfã¸w~ÁXŠÇƒž×É:¿NïJþþ♼µíD >jZþNG–ý¾ÿl'}Ü \ªiømÍ’aw‘_{—-ié)‹g™n6Ùäˆx)@Qs{ÁV:⫼ÁÏ*moÍþÇݱbæ³øcX”ï £çÙ ßýùÑV¸CyæFn}ûP# FÞtžE)ᳬ„ [B]2 F±²ñ‹v¦“ñ:o‰aŠØêÖ£ò!ÄrËûÚ~>ã#¾¥4|ä=°§u”I!>19x_ûZ㘧°¶½ú<±hº"/À°dHT3ã4½,·Ž+(ç*df¦— £w¸‚"Îq¾Å¤Y0yü¸x‹çn©Ü—ðÓ¹EŒ63Ù2O!_ÔÀôíÆiëy¦*# €úDfa„*·‚Å€T©‚W  hË:`¨ÊAHA[ãb‘¢ñyõGò¥:-’ÙkƒÄP öe¯Ûtͨ9;C¼|)§q²Amè3XUòWÁäBÚMWËQ'ö°†£Íß¿,–V\Ù«Q×%èfe¡;‘laŠ`:xÖÇ›j>p Çs¹êÚ¤6×™ô£ò÷_}´S~f,Üx¾bºbq¤vûºßþù›íOו­`óÉÞ;\KQúkÖO‡Ä0hâ@!…Ï‘^̦^´‚ ¬3Ní7Ù¦¸KŽBÝl3BN%¼¶ûÕIqgæüAôZ`\©¦¾G{)B·ªU:‘czwÓ*CíÓ† ¦×àÃøkx2£&ómñv|‰n*7üÅûDuü@ÌaÎ.ú{Í7¬“ÙŸp†7û»Eë®sÕþx‹](Û¾Ïùù|$IAU¢C©X6™|4Wþ®CÛ€Ð0¼Rï¶hsšülæé¾?”Ýz"FNfÿžú«™oå'ð¯ÍþµÖá›wÒºâDX™EöšT žbrÞø}!@›Æ=èB}ð:»öEHÜÝ´ÜGþ?õ˧YìhæïŠŒe1ùX®KãÌ¥“,åæÅ]fúôh_‹¯ÀrdÖ ]g}=Ôü‡~!M¸—4ô½ä X±=…WLͬd©Ù-Õ´±ê©\yø_öYbøNoÄÇ<À»¬/„’ c`Ðz ¬ínqãt€ ¢H™B"L³ãx*OÄ…vÓ^ä^%ï‘,IcÕOéLåFóÎÓ}˜^Þ®g9à*2¸Ùyßý½#.Ëël~Üj ã+G4œÀI$ª£·¸k‰W\AÕ¦ @ÑY$ÄxpÀÄôó¢üì÷”¤òGÆ·Å-cwxµio[X—P?­¬a?¶¬§D®bM ʇ  ‚RU‡†BÍà•–‘ˆE7Îa¬$A~›}ça›éÙ³w¢HÒD¹Ô a*.üì—snã­$>F(À’Uk®…ÙÇ%NGKIb\¹A ƒ‰D–,NË'  ‘NÕ(E6>*TA|X6W….A½KÿÔ•¹®ƒ§»yþ×™¿[¯g¡!”é¶7{®]½WÑÌ6&»&½ÎGæß‡ýeºõÙp·ìŒE2lˆ{Å 8 N`+`Æ!V;ãÚ¬ïÁ=n‰ü àtßúh6£û/žÿÛ¤üg¤w+!‚ªæï^-DƒŽÑSŒôvJ¾sõòƒ¿ÍáÇá늭°tZš„ÄD ˜˜”ðsþj€4ŠH©Z: ž©0TMQ@¨p̉E;‘­‹t¡¡žœ™0"àÙb©›¤  ™m¾ÖÕOÊOZKáå›^“&ÏvN{×±À?¢ãhMnæ8éé?Jý/û­ñý'óú¼|þE¥¹ã°l̦ºñœ oëq1²t9Ôö= 4uÙN8.·ÕÚ4Ö†ø^}ôsÙCWiñ4ÖÞ_¶À.ÙË·óíðÇ?œ¢ÿ ¬ûÚ7ðÜüÈ$÷†÷oó×Ç¿‡†`OÛi]JúâËè>:³œg¡ÏΡ·íSñq›roà½\â-±Ñà ¤"õãþÁÅ—öSÎ #6—s•—æ»s•ÏDÈ+%ýøÏTDªÆŽ‘XG¸•»2Ï%õÈóè¼~|4rÅu`)‹J®¿€…¤ €.À´Ðˆ0¨#ÒpQ0·µ 59^~õË_µFϬ0 Ÿè]À&ày®¿ùÝëës3kª¾QdW üÖ|ú?¦•ûSíô[Cæpx ä¡sÜúv†^çÈ-û“éÿüòO™qÙ½ °È¡‡`@ëß%ü±ì9€=PÚàçx¦¿¬Ë{Ω¸(^ã\×ë3³±òÀ¡ªÏ¯ßcvŽù¬JŽò%¸l­:MFÚ‘ì¯ÿùýõw.<æåúùöµð“òPgHv8ì½Ó‘¯+µ½zȽ<Ôá—®–â/õLmlî1t|òêÇßzþýí§œªA{wäÍ ‘Þs‚Fhÿ|«Ÿx)HäH ¡û~fŸÖ[¯wedáÑ,…ÁØŽ”&uLìº/¤BïÑW!æ$IhÁýž¦ˆ¿ïâ ô¬ßÔ'˜C•@aÆÇãO nŠ@S/"„ßU÷‚ÔUƒ´%ÄXûÑ@’Ãa¡ùùÔø;W‹ó—`ƒn5ÅŒ~\¤û‡Ì%ùc$‘jì°Íè T-TÊA ¡è¼æw¾ýå÷¿Ïç¿Õæ8•cÂ<Æ‹ŠD{  P*)@¢”‘8šx”KcXÞB•4è4=í¯2³¬kͬޒðŽïéÍ!=€n‰#l!KŠV‘òߺ‡™QÈÊ×v=¸@K¹eûùÇy›+A7„I2B2ã²ÚÇINjJçÖ¦¸ï2Ùr:ñljÊ/zª^¾ 3‰ÓÈóì“ìÇ”?¿¶šö¢È×ѯӛ2X´È`3È€!êôss櫸µ ¯“3÷,ó|¿®«Ó´ãxã§ðo<¿ðë#Ré£Ò~'-¸ Χ«—¥î­ñÙ'›%êÇÖ‚eBÎÂ^uЩþ¨÷н̤õÀHG¸2P9ÔbMßÈ5k‰Õðj\`Ã*ñ^ÕÈ•ÿ9Ü7rÙCc?†î À¦›}„>,b FqVúŠ4j@ÄãZ uí} áÒWÛà¸:EÎY<±.j±&FBV§ÛÍü6ÝX7ŠTÚ+~Ë]ªdœdË`žì8Ç¡4RBtq úÞ5®õ°u£.)y§cACÕ¸;Ýf5%J)³ålÅÅ`Ä^$ñuÓ§ÀÔô7®ÜÖÊA¶²­›Ïrº:Ìe{¨DÇù…¾õqOPãNCo߆¼dÁ<ñðb ÊuðYŒ)§Ù€•h‰:SNDµÂ]¾aH*óÄ8”~<§EÔ@š‚9ÕÊhç TÆ(-MqØ÷Ñûí;ûqíÍÇÿª¦Ø'ݨOÜ«¢=,-º‘s8÷ŽÃôàÁ’¾­5 P5~Ff)lGwe†ììÞi=­¦­"Ô=ÕëÌ–iLíµmG‡g_:›ýÕm…Ö‹¨í+ ]ù–Ø I¾›áynLRÂqX-z §VU®.zwUpš½ÃÚ4œØne?¸@Òî©,ìe7íãÕÚÇ%ª‚À¸Ÿ÷’Ï:÷`ùïóN¾ï— mDsÿa~ß­:qŽF˜®o[:3¹ÃP$ëh ¦[68d<Htè KªÞ—¹ÆäÊ…åЃ¼àŒÄ§f¸‹üf»ì%šxÍùIËée“ÆxNû5Œõ¶áœNxg|ƒ·«×Lbîl\ðÖn/E²›'ãF쯑$®5!ÉŒÍÌŽÿ=gŒ…Žê§½ êýZ ÁYµÎŒ«h!K±©¨£=-Á 8>¯«óÖD@ÆžnæÒgýÞÕ®„‚Ô"- éïº/cƒ¿XŽH‹'–Ø‹v‡í'  )¯f2’î¨ßŒ5½K ÿà¿t18%6¾L¬ô_ˆÏ×÷>>˜Óo¦*áïŠ]g@Ú€_û -ßüØã.È©—ÃÛz»8ùWü‰ßs®ø HÕ†}“—Õ ã–P¥ÊI@¤›AkÀÇ´°‚¯¨Uvíx€§OLô`të>¥ÁSmµ­Br Ü0Á¿ì‰».­w`hSæ—E úmnÏé3+FÃ&Ò :ÿÈæum¸ÊÉÌXDUÑƨÀSN-ƒ>ÝÐÏô¸+n\Óûœ(49vÄ33³5}¥qEŽl­³õRد­isÈÖlqk‚1$«H̬}¢H¾.ƒ¦¸î—Ha\G”ýrïOòxgÖóûUð"/?þ°¯³ÿxùóv¦üðÑŸÐÏÌ«$‹ "±@¼;~Ìùî7ñ—Î,-"g#ÛÐ@x¼‚–K‡$¬Ed·IfKÇ…£T§PrÅ&èIŒ(BªFoˤvXõ¨Áƒq:\™éÝΟ¹çD—wדèX$5/Ó¯È ÷rj*–㈑xÜǘ}’“&›™#Ö0-ÃÚ Âø€“ßhÎe£ïLx.Ü™YÑ]u"GÀTÛPœÀ3/l§hÓ«ÀVeÓÊ«‘nT9ß{ÞÆ6ÅT‘··ËÏèÎVj–/<ÿ'î+×Í eäݰA°Ž¤6KîgÈÕÀ2 íŽ ‡Â¦Ì€%äóYOò6d¡†ÙcÊÜC×áU…O €6*©©v#;+ʸhˆ“ZŨ&c¨/òjg/0Îa“´ÀxUÝŒ«¹ÕÀ 5].˜­È¢D¤Žýš¹Üâ,ßž™¨2 ꀓUR^™éHdI˜Q'›Š±ÚÝ·ÿQƒÏÝüöÿÿtv}Í~ù Ýå´ÿ4×Åùw'¦çY:åÔ·|;< ~~]´ã|Ý÷²T&Û_½:[)fZÄL5 %HÔ€†¼a^M´,°!Ó˜a€&—Vç‡y¿àæÂy÷{àù²1#^œ‰nà6¤¯n¥ë×ó¹†õÆÅý ë?n‹ùí‡C§Ð!òÇ=‚WÙÊ‹zöFÖ{ø¨SîÑé$7…+=únÿã_‡/ç'nÖü„_?¼)ª¢ÕÕóΛú²—sÑ›N4¢µŸï]zN(>䛯³4(%ÅFRw¦Ý^}}3s¯óTŽÓ¿¿Nêp6™FÀùaÞ§È%ù¨²¿§Þèt%jáLƒÌ»×lM³6Ô^Œ† iì>ä ÑÙ4Ѐ 蕽þ:ü:néêga!;òSn.þ¬=ª9šì壽á +”í•g…Ü陚­õp'£ªGxÃ*¿-Ò\ÇŸÀqmoa¯å«¯áºÖœæ‹tF²…Ë(€élöÈpl•±2dŒ2=Ì´²éXdõ¡~”ÏŠ~ oÂǰ”BÖ³@9=Õ5ݦk®šìë-æí@°Ä÷cÏ/ñ©‰:¨áE–Ac˜ýæ*=õkè­ý1åýÌÒ³xƒ¸G^¨`#@œ €@)j0µÂ*HiD¤C õSú©ç|.\H??`Wyz»*㯗èM'ë>u=hÜãGæ“7]«°i•(³ÐWjœÈŠÂ\Gëj£Ñ áAÖe…æxWw²/:€ÎY+Z -(ÏðÃ.;Е˜¥7[$Ý6* ŒÒ x›ÊÅÇ!C…0tZQ‹ÂãT#l§‡P€I£pŸë1÷X/t¡ŽY4˜ÖUAâÿù[þ~ž«ýþàrôsnœ\?4z¸“‰‹@œÐDîèz°Ãñ2/oåƒ*û äa÷YîQ°ÕlÓív§Ë«p‰aÏß¾0Ä/„ubÛÅ©íÛ±™ï4Ïnòáµ»áû{²ß¾B¾ÿ¯§Ûqœ+Ùe geËîÓ B¹#)ëÙÙA¹|§d_ï}Õ9gævÆ´ÜB(Sú@$4'5 ”ø n* NÜ;yp$TPÅ  1±@9ÚlBˆ-§¡q¸’$ \™•7öÏGá¯Z§eê)³}‰Ë–§Ýl!5’€¥XÉ6„×ׯ}¿}/3!œ¯’ÿ{¨ : åtÅp…”—t|<æ_–'Ð $AR#¡¢Ä)ávvS_å¡® ¸kšÖÇiVÖlùݶ5½¹o¾¼¨£= †›âìÿ—yóüÁïý~WüåÁýþ8ùËÈþ¿Â!ïöü ~¹ßùyÕûþz) 9Fð÷Ùß |þ`~•¿0Ÿé£¿?Þ£îÓDÀZ<lvUts, –MIÎø&sæßn#+=‚‰WD'˜˜ }†~¤`EHDq v‡òf€c-°½^¯+3‚_ÏÞ ãÑ#mÐ1ú?˜›éhˆÄ+¦…P ÀÈF "©0@1×Ïÿs¼¿Úãi\~ù¥å>¼Ö5¦Mb˜Üîî×oï~ÿå4O‡b¤$î™q8Ž ºÌ n~Ôá£úžÛ3×)é,•ÇÔÔƒ=VᘰKå¾<¸7šÓ2Õ ” ,Nk^d½ž‰+0]Ș Ls\ Ι-”vÎÄî÷릡¯HF² A}òBòûq#ï8 Hż¹–®[á(EÃ{}¯êìý«×³C¶  èü›+Øþ[—×íN_ª[¸Iš¢ö¸ÿÃèè–bšÜƒÜøîùitMgçULGعãXZ(º~jÇ%Þ1Ãê,¥.½šO`Kwmƒ¨`â‡÷°kdãþ¡‚ü~fF0£ÞÒùŽzÙ½Ïʯúî];ãßÝW0nZRÏ`pž'XoÎîy6k½”1Aƒ,]«8ŸêÑp4qüHC—¦Å|LÔ¡|˜qk,†.4h%ãÁUR ˆ¿#ç{ìn¥ò²ÉVÁÔ.†%ôQ«n‘yÞãu§‹Âº¨a»j˜±‚(òä¤,Çž<˜ùçÌ3²¼[îWùÎOÞŸÎû©8 rÂ% %dfz…ƒQiΈ€¹§`C TSR…¡š¶Å÷_2³ú†h=·vsÆô øÀž ê¦nÃÕ·:Åy’‚Æ@´UX … ¢]1÷¬³ £Ž"ÄB.ÜgšqÛMKgÊÏî=)BI¥–/ÝܳtDï"¸ ßQdtq{Ú¬¹ªqWbÉÇE­ [ ­°9÷ç9ÏýízŽ÷ó:ÎÏb½­Ô#ÿ : psfY±‹€4 5ô¨9¡ŸTœbñ:ä­t[ß¹+ékrç>lî$-aݲ˽^Ü—öË3¿z‰\žÛû^Ùgã‡èÕ(Âb3gáéŠÈBzö”¿Œˆ¨p‡€,!^y3<-Ãmüh±Y^«YYQ;ª›1ƒ›û¸f¨¹¦åTÉÚëagþ¯ªë½XR³jÜÊíÒ©Uc åÑÓΤ] ÄsŽlŽEsUÖ  ¦ZÞT¡TþVöRÝ’Èv¥“ÀN×h»î?{v‹VVIþAv˜ròbÆ¢\6eÈxÕ[¿]²-U-Hw<¹õU·îŒÒRqÁŒÓ™l´§îF tíÚI&R8ˮ̅ýGR‰–ÎZéÅ …ÈPƒ+çÙâSë•ÝuIªÆÑê•ÑýŒï½{PPéÄpHÁƒ[ äìëh $H:B¡RøPö ª(M"QuA2³L¸‹éc²–Öº„Ê#ùò  “ºRשÃ]™„×Ŧåø&n@‰–£¢ SžÐˆ2ИπÅc•Wù­o®ÐYPAœ‡x0å÷›`ÿrº z/¬*N±%cx½A-wí× ”5=dú)œ“Q“˱ ·w~´½BßMõõµwÅ %½î“W›Q·)IÅ×ϰs8x§ûŠkâ™A´ÒºIˆ Å@C1 âO 9z¸§’DS#¨ŽW´D R4IfÏõªFtØ´dgx:]ËÈà ‰›ï¦·áA|`%)Ó|x÷z•bËÍ—käkàô'·üCŠïïñ˜shÆNhÜY2¡éHl|@¥Ö•ªC¿™¿ƒ¾ñ_ïVln “#f€dq¢}‘Õt1ʆXzZ šC©_øU[ ºÜÌzScNŸOxÌŒö ý¬ÄÎì%dd·,±†ŠIÃ+I/ŽJ앺p@wqcøËw÷ô ÖîáL¹F4ö;Ÿo¬‡,”Al%fšŠ;áâ¶8EŠ[º˜‚Uˆ CÉÀ´rëßÏÛ’q·ŒÇ2 ›NȤKQ%ƒiñ]Ãëz‚çÛñ‚€˜šGúš¸ô6ö1?i'Ccý:Á»3a' {tš¦ìÀÏOÂw×Ô@ËÔ8¢e×ÀÉ™" ˆ!Sš%lèPÑÈFºÎD<",@xAwä jZÅ·Ö“¼ýþ®ú†§7€ˆQF%L8ùÍ·WNB”RS£-r"a‚ €.ðLý‡#Ñ„‹É¡Ø†õ÷ä,ŠÞœ`4 c–ýK–2M‹$š\ªVÝ1~â_`NZik)?â·zƒ7ƒKˆÅNÀ8ÛUS‹ÍEï™z,ùŠÖ&Ò#‚±Ó'²Y¤W+…ÁÎÙ*¥ÞË-|l ´X¢M]Ã!(ÓLDcâwóF#tæÈ‹l˪a)Η“-Æ6™Tq¢† ¨ÃR À¢¤·Ð€¿jþ„—30⣢eÅö3«ÄXȋ݂¥Ð† 6ÄžÔW.ó¢¥eÁȤDƒ>^½ZØÐŽÂUpD³ Ë4š. 8ëŸâü^ûñÍâmyßøiu¾í~¬e}ï§Xx]Õ\üáúïòZëJ[ ]¶z5+µùξ§0(JErk¢³ o $¡Ã¨ Ó  A!±m­ãœT˜&`‰z`¶´»â_ÆkŸ…ØM5ÕÁá_-©O'U¼Œn÷Ÿžxí#ƒX ÷m×3ÇtFèîQªJò·î|vR*P°ç‚Ï–£M>:‰`ë{ø#ÞO·G-—k£ ¬îÀ»ò6õÿáúÏð&ûPó„=çÚ›Œ}O^w•,°m{Å1ær'ÌKÜ%ÄÓûÝÆ[R¦£7ç/p¬ãZ<ŽvQk糩ACð̤ePPhb/³Ëøïm&nl¸¶œŒÇí ARc+ö(]]ÊÓÃèÌ%Gìîv‹ó}ÿ0_¾¨WGfõJ,nó0òíh·ÙÚÈÉ‚‹ýPB–g¥Äá³—õjLì¢2“óuf£ 5@ei=ŒÀÐI×/†I–Ö¼Ú"I\@ÈLÃÄÂ.1\–%8æÆAÔ¤„å]¬‹ºŠ YÔ¢ÊL¸’šwé*¦s^‚w¾‹{èÚ5x}x}ý$ü‡[{‰+¹gI +“Oo‰°V.–¸ž·}Î]òõ`¿ÌîOr\ï©áÀË!7ž®ó0 ®8[ÔU-HÐb!(Ê4Æ#$@¬@ŠŒ#„ûûż¢gú¼ƒnÍ/‚¤uñvø7Ÿ\,梣཯l?côT©›£öcd= 4XÔäÄ)z©2‰D=ÔÛм'‘ue¶P'õ@;Va«×õkû¶ Ã0û>  –æ,Ë&.ò›k¦Ãímù½ç'ù¥ðÔ×ú¯ú8µçõdÞ¾äÑX0Ñ~E섲!÷CÅÅÑyæÛÔ ³‹¨.ëTâÐÃ×Ö²ÇjÚ[÷á,ŸçÜÛ-f¦µ v˜5—twõH2ƒõ_¨žMöÚÛgM pPÅv4§Ù™3 îæÖl ]Ú’âÕ'Ò˜ ÜSl2’›&ó~´“ï¹î²;üýíˆ÷Þðòü¹ž*´KC£&H…H2¸¯~ž/½îs‡8%º ì­E»Íõ+žA”í_͉g×dlØ1Âè&4?ï·mûs ë …ŠkRЀDPE@B$(¸B  ͵ 5¸XâÀXbcJ¥ÆßQ~Ï[õ§ÖÇgâ2„Vá7‚JZ*TÈÖ$L+á…òÉã÷޹=‘s¾ÿÛË ãï°±~’` ¤Šý”¶Ë[š˜Ö6²ŽRÓiÝã‚2ŒJ5·J´Ìi QÔ«¶W âÌÿÛ×¥÷í—N"3\è·ÿÕ~õ}×̼]pÿ·ô÷WïóG÷Ãî ¯è·‘ sð\æý-4W»º||=m÷¯?þÐï÷Íáž;ÿùÍ}Šr‡¡fZŠšØ>úªÄb*„a;‚E§b;Äñ )#‚ý¥Éýˆ3Áä°2‚º`×¶ÌöÆÈÜHÐK ©2ää'Bš`²Ô¯ó…Ä ¼N=Ö¸¯ýÈ¢Ø' U05þ¢×'"Œ€²Q°(e‰vlÆ€„9â^òõãív;§¸ ]tqN˜` Ø'fo÷Îymýø¬Ã?yÁþó 0ÇíýïgøÚMêZ~|¼x.j $Q4Õ­·½”ŽÃZµ@}äûÏÄ B%gÑÛ c†Œz¹ÅÖÊÛ¶[Ï_’3F=úlìrÇæ[N&çÀëó+»çïpŽ˜ ۻțóˆÇé7GŽî®}ïùõȱ̋žšê,Öã±ý‡ý”—Ó}ï ¥0€€ï' zUý¾,tØâ˜òMˆ”a˜ZgÀ¤–ëÉn?õÒ|¼Q2ͦæùp¼X«QŸ÷«ÃÇË¡\V¼ý×~‡·YKô|ÚûÔ™Øéê¡Ã•š„èc#yÚÆOkîÝÛU÷oÍå(TÊlBå×ȰÿsaÎûj-yÄ/ã¿¢¿3úJVúy\±x tŠÕÓ>±³zVÜ»ÙC¥täß•[RRì4tѬQ2f<Нñèèb~w÷ÿ!ægxÏêý“Ô_’ŽÅS-ÃÈq:§è ö"¾¯Üïh.* ‡<•ÛGN”¤€Å €U/„»•È;Xî5,ïéŽâ|j>|?Ö|ž÷*¾Í˜A=™É%EL› ƒaÌF+*.DM â\³ØÊs?ñÍåuz¤·{W¡“Ô<õdç+/À¥]D~´ö,É;qIC<”-­Ö”Ò´²r:ýÂt¸R…_â^ZeG*¹-<=¼““4-‡µ´_t¥ŽC;!ô`3$D*} ILA×]Õ^:]x¿ö\s„].Ça¿~/ý°«7Ã[çåFW`NÚÏj/©v,£ ³t€È¬%*¥‘]2 xÇj;Ì/“ª¥»Ð^ýKwï£Øbf[Öûb­­ŽÅ{ƒ¼÷®Gz}òÙÎ[ (£°2ƒ—ÎÆ#²¦.ïC÷‡åu{xFØÀyI·zµ‰åÈIÍ»DW,¦­š&åêŸ^¶$ÎÃfëýöjXŸW¢ÒÉ}MW¹7—Ð"8A‰æz”#5XiNxÔS¥2¤ðyÎý¹íÜÖ`]Fª±6AǶ«Þ×Ý#úY´Û,ø¿ÑüßÍd`™Z Ñ‚µð¨àN®b鸡ÐôVÛ„7Hå8°ÚYÓt@z0€h HC [î`‡›Çµ·MT#ò†¯sKÉ=aGó•ÝÒ¿0ù¬Îš×× w“A¦tÀÎ齿p+ß^n m‹·ø"“9ì)^.­{¾<Ž$h³ WjÓ4 ¨t_$z/O5ÆMbÊÜ|~}íó7ÏÞ\ðí±|†h ¯ÁìŠÕ|jwQQ×JIW«èT!ß`•z+k¦Õx› iAq2γó _mœ"Í<†·P×RaÑ ØÂÜ)›c˜•÷wµ­ç#¢×E7É#ˮRÌ N ØŽY4r#të»ÅÞ²$4ÛŽX…Áx´½wQî°Ž êÄЫh_çšoáÇ4•ÃÇï¾öŠé7ñ—±Øƒ|&cɵvz ÙÁ‚O¨ž $ ÑALŒGµõ‚®hH ï+¤Æ8ƒÉb$\±Ç8vÝîÏ·9ƒ”H;ÖJh‚B¾d{aÈÎüG¢Ù} øéâ9} yͽö…‡óˆÎîN¡Ù‘S}憞æ öÓ1ΰ"ª„€ÓvÊ‘Í`O•Jµ„Ñ,`…zÑÌài%ØÞ†?ƒ 7Xg‰Zƒ8ÆdʼçcÁÖi3šX¦˜ ÅÈ"ƒu!¼­´èsþýëüijndD7P'ùSn-ßbU0Â)«çBãJ¼yf(ÊZZÜÙ1EcÌéçÂwþXÜD¸ÏUÐçðëï›5½9­Ô„5‚#œOvCÒužF“™¼™?æñtq9!ÇMz8Íwmzô¡…eœfÐŽš!›qÙ´š3ƒû¥™ëáNä3Ë÷òžñ¾ø¶ Ìóõ&¼=ûÚ÷sÁOê·cöé­zsánïFô|1Kð|(ÍßÉR5—]9ŽŸœ~¸RäÙŸ'*5°å!±Ý[/@3<º[YŸƒV#.1KnL¢ÍÛ™ì}òoMoÖR£6ÈÑ&+©cù…üeE´âàì$5å7œ€Ú¤%ÓÎÚ_ÀW4„8S–Æ”¤ á@Π‡e?ÝÕW0nq–p Š” Ž£«‡xˆŽ«*ȉ/Ñ0^õeÝI\Y“sŒ…½v8p_ ´&Ìp­‹a$±Ìh_C'4Íá =PÄ;ˆI( kèÔÔË« (khP$+´‰†f4Ð9cQ%“ ãÑÒ®êÆo3"9'£1/ô“/Ïúø³.%q7Ÿ…úúµU ¶¢pEK˜Paã ›†/ã<²+@–¶’Nꌦ Fõ>ÑôÆY™ü¬Rik„Æ¡š5F¾H˫˘ӈ~vïcAl½÷°§’žl.YÊ·%ËÍhxц‹ ò¥6J(͇‰4GÉZ/`¤+nZf,þçÝNŸ/lŠ’ á=¥ÒËÊœWÂn•RhFzsa„àîˆ7Y!ê6]¸„&†(òÚGˆ?qï±H¤My`¤Ðá †ƒe3© UÒ­®>â‰bŒƒ\x=}Än±CÑC*È@^ Gò–SHŹˆYÏ$¬Avþ2ÆÏ²¿ÞªçÑü‡÷æëW8o8~þŸzI®Ÿ½S‚sÚëmÝ—Ý)cm•.YéTg…@¤0í`J•ñ«À5ª%¹™žÛj.‰´µ}À×%ŽÒóéð:^Êo:ûwÐúy|o0_ù%¶äÜ3'eÝG0SØtî”8`²ÞgL‚îxÅÕeäN¤=ÒR°+Ûh<;¸$f¥‰Û"’à`³>?ÔåÐzJTò£~u¶§im.wäÓö®ŠâÈmÿÝ^ß÷ã`ÉÓ~ÕMºF#ŽŠÔº»i9Oïñ=váNšx?9âÆt\i÷9îfÙ6´@s°È[Ý&âªpãVh ¸&V2C]~ßäo'ʵ(û,ãÌΣ U}ÐbR!:ivéˆ0#ulÆ{.wýÇÍçסv;ÛÂzï7Ï(Í/„ú•ê“è³þf 6§˜¹M(u¤‹èT„WD‘PM"ƒ@f f(• œN¶Èg€Öu±MVS”Ò!7Ž‚jªŽÌ!&-’$YÐZ€@àP ÞËïaï³ú§/“ÉABãhh¶¥?z\‰Ã±åEܶï6³³Úïd‹ï‰èLE`_=ë´Óž°fÍ× ïz¿¯Ë$+WɽÞãþê@4Ó{·é·ŸÙžÈëíÕ F¥ PTêŠ/JìŸÖ;ģƗGâìt•Ýg«™ýŒbb'Æ|à™®Z)û˜3ƒ3)HVvÜåòrP÷Y¹—}{€ë©M÷çs_üꉃn4”Èa…y\äcdz¨bH߇í~þoþý’~?»û55ÛÏÿ“ç'øgwÿûQ|… Öó–­¼Ûyæ¾}NC`我J ÂÕ¬ ‰§U4+L³M§ÿ–k¿ÑG ÛB'mƒP ¢©@g³km/J’‚èHkŠ\‡²œgp Ó\®Ä¹Öc¨³-J¸ÇäîùÌ. cA8®®*ûýÕ¦IÒ„g*,IÂ¥f.—·y 2ôásçø>gê»ô‰B‹(lçÆu£,üÅsæûU³4Öº¼d+ï¡jýþã¹uäî"ÀÀ«ƒ¶Yy/Õ%lDÚÓŠ–#¾€+âp"ÀMWs†1B€Á±áSAlÅ¢pËöÜ#õô7J÷ç}¨Y.¢6„D{ÊŽuX÷§öCsÏmàxXŸGud×d&‘IºÔQ˜6ÅÍ÷ÙpÝ‘®n®ï~)ú_ç~ã»3íWx²—` ©<¼?ýg͉V të–ê$xê‹"bQ¬#¤Ô—àFºÉGÌówOÜû5…çq °b‚Nйµª´߇*›ºº—ôð.Ùs÷­±kUbÍ|$9«û­ÚgtvV¨9УÄXa«hÿu­DÚ[׃–ƒ{$ ˜´ODTR?jŠgfJOÙúü‘iß×u>WÀ§E4x t•OïºGõwó÷ÿœ•?ÿáý5½¢L“±zâ%F¡b¾Fº×g9ûwõ¼3$à*—¢³˜c‹@ÇÂ]à; Cιië›éÈa³m¿1öëÿ§'ù9\ÔIˆ7,ŒA/JeɬԌ˜†À d-Ø‚è~Þ?æÛ³YÌj¢»ºwkvXæ¸ûŸO·U%ˆÚe» O‚¥†`˜SowS`þÂ1œ‚”8X‡W2Ú.ÝiL:59Û£~kcAµ\Š©ˆî‰vZ@sFÛ:}7¡&bM'CÚíí-øù»›a½!ÍÝÿälh–&×kÁq³ã „£¢µ<|’GŸ7ÛÈÍ"!¸›‡¹$Rmº3 ‰á_*ÚUÁ©¯$©Çk⌓w Ûa©Ze¸ñÜ 9ï4$ºÒó%´Ì¨-}EÉ.xc—:@à£Þ"TuQ¡À£& t®b‰¶ox­0%§ ÈxÅr•´'ž6Ckñ|efAø•ŽC?6ÄoÍG—sÆNêiœW]Ù0³Ÿ\’·}.⤵rËÄ?P2΄@½÷êÐŽ•÷1ZmóØCM'…®Õr®Oƒ¬ô.¦•óïž=lâ.²P¤°R溑ÏVSEbzÊ–Áp¢E[2šŽíI 1kN_ iK×]h¸’eíÁ½Åë;8tÂHtë«m)QÑi|®Û¥{ÿ0mÚM'H`2ø‹lÎ(ïðþ|F=‚©"fQOIa/{°dü’2®Ù€h¬â0¨Â×”Fh°(rÀÁB9’Åè®H\øH8ŒÉŠrJ‚€ïåo1 b(‚‡¼ÿËÖ`ßçÌÂÿcDÃjSUë½y/x¹ÖR!ã’ÑGÕ&1\d¶©ÄH;óYŠášâ…!ü”féJí­2ÑÍ0€]ƒõråo(ÁÂ9B[S2±ˆÐïRSÕ£ßuÜ¥·À…á@€Y“‡Zo–ߪÈkY¡ˆJ‡VäE•p ÿŒuã$J ‚m3Þ*ê«l•[“…Â,ò˜ý5š…€ýȉ0ãg2F‹[ê€kœ³áæÎ¢%ád‚œdä^ DaÆj¤€(„¼U¥‡Ó^dyì¼Å»ÌV3䜬ôDÎÃ5 Ñæ" N«Ëã¡í¶/CèUß 5ÿèbÌ´ ©È†exâ.ˆé½jo¨bÍ2.DÚ†ÔåÜWf¶ªü5&õsæQŽ‚:‘z¸Q–=ŒŠ­¸ù"M¥Á(¡–Ù'5‘%ø8gu€Ì8 é¦5!k¦®±PŠ¿_ôqæ?]"Æ97ƹ‹C}¦鈰~6²  ¶rl6‡cI\sûzª >l9|ÝJOÛr*¹Yö?@þ#ï‰Í‘{­Ú›Ý¸sLa>š…Óœà¼Þ·Ô­gÀ‚IöLœ§~2w—­¡î\á¼Äb!ŸR‡v@<¥_6°lШ 0ÒÍén÷ ±Ð”ÖŽqŒ ƒ¬V$'2‚#eRqjƒcิÐM¿ä´Š0ƒ” QD *Gªô£°­×šeÝræÛ‰šeȬ¢(ºš÷4CøÆcÕ B“ yBzA„Q1Òž^ýÙSò¤ä™}j%ƒ×#6H€´@D›få„ßÙLêZZ(,’#þ‚ =²#6êBDÒ@JQP”•°5O 2§"ÛÀœ<˜Œ¸¸¿†ùœhžŒèÕô&yóIã5Úà!W P¥(ä=™Î ¢¤Ìmƒ¬X‘4 ¦YÀl¸U\²à°z\sÛ²7?Ö3š#ê‹;mjýµœ©õ`Ú{ûDìác°nÉÚ{6`r˜kù²9ŸQ²2çõ;qÞxÇÔÜì:—0Ÿ‹Ð«a98Ï2Î QBIŒ¤‘«®{ØÄyñ´‰ü&4…¶æã÷ÍG÷{É×ëò¦`]vô`®Ió§ý^ìT-ó6ÌÇüîÑ­ºßÞw6g2‰^€;#¡×u=íÖ²%5»JR0Õé'FÌ»î–cðý’;v\Âì6K'nq«ù4Ô"a!4Î2.ËêáÜ;ãÍ¥ø›øê·Ó¶J jê‚ X²»Hç¹Î ÓL©°ÂQ˪ üsõ‡ÍIvïaÕ¬ÒjE¿(z‚…V“>M3&XÀ:²¤,Ä€§#]"»¸Ô `꣠sõÂ…è! %§Ê2Þ%å&í/Kæ*3PŠ9V‡©i$–ö ÅJ@A;pØ'ˆ¡íã€È–¬;÷k—" *5ÿÿïðÿÔ8»çÆû}B‘v3#Òï<³'Nâ·®çÔûÉjè3’žÑ~‹˜ÆÛvÉ®{¸Ðk²"ÉU U' À€ P‚b£t)åàQìe­Tyº?ÛÌ6EÄ„d ®2¨ŠÝº©„qî^ÂìæÔDò—0wpA-*%Š’1 ‹Q‚šY“ÁôÙÌ›X‘Qƒ;Ù!etqÆ:a‚õ›åxˆJFˆÇ”޼Ü9adàfg@¤mwÿAþ¿súÿä‡ÿOÿð??™Ï–…Ô&[MQ(‹»zœÛjÚÊàIxéz ÊÙ£ÿ£×e¤áÀ°‡º2FrHa¤y' ×aw^¹l‡õEÊÎ̸©JÒ(·Úè;8‚à)Þn»™…8H2¯hÀêIIŽ×ùÕËÀjǂԀÁW¯¢\FšM’Ùn†>³¦®ª{ qí¢¥5{ƒ}Ó²Õˆ&(Ðýëìò¾ƒÖÛ†L¤“Hì3^o8éåS¾ >C¨%b¨Â0Aò¸¦RˆiÔ¨ †ˆ ¤&4 ’JEÓ"*ª¸"H(¥‘ A4PË”¸˜ª¤KP0Ã^W)™¬<ê¾êu°÷VGwÅ`\‰«IVC­õê*6ó ÷OôãÛMŒ²ž}å© Ö—#éóÒÆ‚Û ·ˆz¦ŠÖ"Ë,š’6'v$:nßÇû“=êŒÏÒ§ÉS–z<›Æ§RšzÐsöáþ敾ÿ‚ ý6÷3÷—Knžožï|ó׌ðúä³}'êýƒîŸòïewÃöîâ;»~ý“~øTfÊùðSàˆ¥]ʘžÍ°5A²0íHEeH+fq{V‘Àµ‹†º4å(a@Þ$4lªS»•$¹;)Ãb"†qøyBvl¢PÇŽé•°uãD pªÌ TIªb¶||Ç´jã¦g( P‡?²p„ý«ÓŠžóâò‡^õè׿îsqû–£íŽ"ŸõÙϵórDÒŠ€%ƒ“—£b…Á0¦‰Ÿµ“J¨goxºtÝK ¥îÓaÊØëÀ †éÌ< ]¤‡³p×ýÁˆÉ§ïŽõêõÄ‚RùÔ²®…ªF(÷ÐÏÔ›k Kh ?Äïº Ò¦îéÀý= æ¶±'ià(¶ ±ÀKþ®„ú¬vŰžaä+Å%·w‰NË‘[Þ‰ñ­>QP]³uË3@ÓÇ>ÌF)-ÈŒÚȈ’.›]=¢`^‡øêàr|E È™éƒù¤?|$Ag ­ÕåË™ úE¿…VSΣûÎ wp”ïn1äÝGÀ˵ÍaXPËÏ»›ó'¼vz ieô…#…g¶³ÆŸ.r–sV=ꉷ1ÜuíÛÚñ–t!<¢ÑAƒf[8´à“Ðϯë“ÍÜÝ›';BÐ2ZŠò¨!›R²'@ÊôþæîÑRĆmâlíò0 »í¨Lø²ûƒþÎã?nw÷&§f¶ðˆ~äopçi³áÉyõ—L+’iöC!œr°ÉwU¢#Ñ$hð‚A54 4ÝÛ¯÷'‹>Úåº/@T·}™“Ä£iCI-=½(8³I —TÝvÿÿ/ÿvOU§Ó)=zòwó>ÿ•K|/Ç;v ï{¬¨r_#ÆV)Ó ~A  ¨9Lu?PºÅQA×™lùÍp`õâz5VŽsÖN~0ÜHm6ÑSAF¥ÐœÄ!ÇáIÌo›|oåÃ`½ŠQ(º!4ý`Ä©8@¨¤£=»3¾þÇHÿãý¼o3ÜØÆ‡Ì­ð<ªkÏ­)=‹E}o%mŒ®šLÁÙ¯2¸´F,rì¯ý¶DIÂR.rÉ ,Ðu %¯¦[-ÌFÒqr¸Á¡ñtÎ0~s'h”ÚähP[ßyºÃb+¹ †àž²›õ¶õ¤XÐYï*]Š Uæ¨*Ûd´ŠNO‡SèC|õvÖ Õ!úYPÄŠ áÅI~`ÄÆÏpÀ›‰„…͹]PM‰†ÇJ³2z>g./½z\À.-:ZàÞÐ2©;VÑI¯g1påwéz¡Š~?š¢C¡C8M‰Ii~k¶O¼³ê]|&Êž½ÕKšÀ'ˆ©ƒ†¼`¼£D—œ ­•´9ÉŠúü$ÈñäÓ{ø.{-4Ê÷®˜KDXœ5e¬e;¿ÂDlMùÖ¡ÈZ)7•]ž¯K¨DŸ /l†cIÕœ‡v2]Р¿뎱(ÊZñ7[„p,ëVgop£6-Ãñ Øí­¨$Ž]“?Ïl %Ý¢KÝa3ÌKÏhŽQTdòNp`½éß¾œ”§CA= éºÜÓ%J.¢1wœ™!žõm<ô§îc±¡ ³‹¶g^)©Å '{£–•1Â’qäüM¿SvÂgüà9­µlÔ°+¶…TTÑl!Q@? ªW.@Bâox&8Ô§Ý,ä‰,8ºŸíŠí¥9}£¸LΈQÐÙ6FHòkÎðBÛš¸þñbêt,òlœ)Ÿ_›àíÚÌ@²¦áë:Ów´ä‰Å!¢MéT®²6VãxœÔ0ëɈAõ AyvÑÚÍûuòÕK„F$>¶!¡=ËŠ¥ü•(@¿ÌhèÕˆê Jb†çšôÝ™68AÁ Dªø;¨1$âoÖÝ\²/¹ï¸Ý• 0]ä&Ôj•©Z€°_Ðýô`‚ð™ʬJgb~Ç0Ö™Vü˜ ý}úÆk ¡ÔÎ{µ´ä5½0Ð&èCɘ]F|ÓœêB#ND|Nza ãÎö»¹-•$¦;‹#Grˆ†Kº•¯!I d˜CÁœèh6ëâÞQŸpx»E'"9Cxø`€?ÄïNÿîÃlÁÙ›´TKæ»x ÜI‚5(ÕsatÞœÜPðüÉ.îÄ™nwhtŠÀ‰ó"fîú Êé :ƈ’mÞ{ÉMÔf‰¥`·r±\²ÄiÇ;ÆÇrÛÚ‹BÙµ@†+“Ȧ1õ€=S©®Xö e@ ˆx@… J-CLÃDªº#9ekÂL$ ØpZPªÂÔÄ+fR8’Úp¡Å [q‰ÔÀ ]ZÒ¡Sy' E'¶µÂÓùõ£x½®¾}ø}Xo·FV ÅY«*Ò}—8ƒ€ÄT†H‹®zú„×÷³þ ý¥¼Û4ßî<üäŒM‹"j¬p™4gxÎ w±õ‡»6üñÚúÉÕ@z‰¼MvEÚíaK~ ¾B“J·Ù{á[Ä@'òèÄ\ÒÅ"ÑÀ)Y!ƒØÄÖ.°ˆ€YS¯4‹¡ŠYÍס–«ùa»p‡BF…øô8V¸B­âð˜”Ò/J94:í1üD'4!‚´ç"ʤM2bœÓ“DÏP(ˆëà”žz½{ÛÄ–„Ä€ Ìf=º|×ç$g†œ<º[¹ý ³ÿë1~ÂÇgôðª·ÑèlùGXߟÍßûæoÚŸþv’”} ûž´C™‰7´¸‡Öçk5ýÙüúµqZS¬îãm»+¢^ˆÔØÃ QL:¦ô‡ ¨ËÂu”C0w Õ„Ú54D"Aè5è¨ºÌ„Ž •ɈÞ]Ó­ä|ð/Ö)>@"ºFºI­î6Ÿ&ZcñÕ«@‡Q::=6æÛ`¢(ÿÖ\sýnebÞº=àëÇhž¨*Ç<ªÜVܾCReï…êÒ†g»ÅB£f…û•Òçt;f¸pŸAe qßXNx2·Øj&ê Q€)"^]„w;Õ¡¥C!bƒŽ1ÖTè gÍÓÞ,Ž|¹%ü°þù¦•±K™9ÛœÜùÚ}¯î<ö—–×ÀäïäKˆºÓ•¼“Ýœ™R…FÚ’ÉT7 Û@Ìð™Äïû×:ïe/NDio‰l_Æ~Ò¿Ó‚AŠ判ç^,w;GÈaÎòù³=õ>[ÊÑ’Q+‡Ú£s"NäZ™ ©Êqm•·¸Ÿ™Ôî‹å^ܵFfÌ>ÃÇUÕÇ‚ Ë€VC†Â£ÁRCÄu‹úÀ{’˜S}ïi†J®h†3ba"YÐPhÊɉõ^_ƒƒ<Ýyë÷çþÜsÎò°Fe«lùÓNÓ0¾XE$m¨@–°åuY×­i›A#ü¨®@Þp¾¨\¸kÑŒ D½°yh¶ØmѽXšÃÎÝÅr¹®#™,@‰C_¸Å|³ÎQ¯õí„ÙÛôî×_­Äw=þ.Eyð.ØHÇ$ܾ„² .¼ì)w]ªFgl¨! òä©<)­c¿5Õ‰g§%³UnŠ•{éml½˜óZÒu÷æë,­]X/ª qïÅ DŸenœ‚)!ìðìœíàûLUÒ›¤t“Ó]MüGékç}Ð)ãL€<ÀÝ`Åo(¤&ê¨Ûˆ/œ‚,)ܬ÷WÉCQ¬Ï4/ —…„Úl,ðt_ÒôÖÖó!Zµ‰ªX¯@EÚG 4 ›Û .´´/ø£º¥¿¢¥ ¢†‚âìmV¹ŠÚ·ªŽp¬Ò'žc·êˆZûp”ÎFe3mÆ Éâ¤ñ~¢³m/\ÃïÌÝšô-7ìÛ³,+ÍNI3²—l¾Ï|ó‡;¾›uÎî¹ô¹ê—2ßJb8IK:r\ê*­ü‚[wF -ˆK°!j.±ô®q)šCº&J‚À|óÞ f,3A@«u»z¾ôâÉK6wæ„rá=]€E0^Âå'×ç2iµïÔ-¬œ}õ¥°ît·ÛaÛ UÞã×ܪÃ0t9¡¸Ã)ÓI3Η:Ëæ¢Å@;MÈ ¹Hòëô+¼1?ã…Œ‹ƒÇîÐC’”h±¦þMæãïͼyá –‰^x:B‰7séP_–hew^FÏ yNk»bñve ýÁûPµÿ\‰uQjÄ9cr¢âb@  Œ– ùˆj Óæ–X´`·òNÓW¬êÁ‘,ŒX>tgp.=“­HAºˆÁ%BºâU·bØ+<ñþy•-1m ÐEL0oy”Z{®Ú-™œ§»3™ÚA¨EÕÃ7PË¢…šÄ¿xR³Š]|(à3®q€Cy iˆRZxc†¯rH:s¥ö”S,LÑÜ2Œx@‰…AØÒz‚Ä¿,›3mLFŽT?ÅR\ñ°,94H!àã¨wÈ80 «XZ†hªh5ë!ïÈ|sÇvÒÌ—Ý>ö¬‰>µ7èÈ !™Û¥Â<èi«ÇP¬Æ¹4¾bˆXƒjªÆdZµ_P@e ÂIr@]dXåèá”[„F¦^VÄÈ ¥Íâ&p$èáD–Nþ%ë¨YZ²¨`x¦1- ædc WZlt¦`–ÈØEØ£'ñ›ž§7ö:Ø&›¹±yÞ‰Õ™ÎK/P$b,+àfnÉ—ð–Þ<"37Ž1 ËÜh]9GGs¢Óq\Ä<û´ü”IÇ™ 9´pëXäŸ9,`¦#5ÿ ïî Þ×L§•6ó¹§ìÃ8sgþ8ö´ïAdÊô§‰;nÖ {îâç†øê5y_D¯+w}%laeäÜùV)wÊ…Zä¢/Ê‹º E\d)¿ãûö/}^ÅÝù'SZW4ÙËãÔyïÏŽw”³•þpßîìÃòʺX»SB]³®bªk7ÜO–ojÞX•2Mš˜µIì°Û#f*¤Æý•ÞˆRγ!±sÞĕݾ4VÑÆv¡Â•ƒ¯FãÒ ·ãH?ÈÄ «Hs²“€­Ý ¦|-2‹‚䘵„B_¬Mg£›ç~š<Å1¦ŸxRÄkÉ@Zíçì>ϺÓÙº“”);“Û†¡ØÀ˜vº”Ͳ»f"ÎÚÒn¬“ÉzÉš eõ'\”­z­£i»Ö>·Uà\ÝßWO6‹^“fÛj×mÇ?¦[ÀŠË™_޾ùÞO¿Þ}PÖ÷±å—þ÷ØKn3±(šS ò˜E+u ÏÉý:œ2‡Kþ~ÚãrÁ|Ԛʩ•G·i[8|++¤£ 5¸ Ûð|{ôás¦W Õè>³v9»6€ïØðý ƒ”¿&¾Ø%2¾fxd×”9„û@¡û m3’ºDËX ‹4N€WáQW¥Uìj ÿ^d•<‹Né‰ò-£ $^úÑV¥ž+vT„Ę…ñü‚²¶†Î oŽÕÚö*Oßê.•ȃU©9¹ÈÜ–ïc5­áõ¢QCêRh53œï}éì°± ¬‰²Þ«D§Ï,Ø•5÷žX‹è]h»íTE K¹°àLF÷¸K¿–¦óç r9=×ån UÜD…æA0¥ÐœM4²J±9U…àFj+(f§žœ±B·óxV|Ž%ËÀSùÂEÅk½è–žhˆ¼9þ2˜Ã<þ°ÈÉ%³½xÀºÃOxÆ”¿§Sñ'‡ÿêŃÁÌ{y³ÿéo_„›$%"¦Æå'¥MJØS­´ð‚ÁŤf=Z‘OíÂ¥úF8CHãíßÒWP’M×Y/É*|Š+k´ý þRq¦$!q…P©ÚÛ^b‹lm¶Èª@5Õ‘œá0ô9bïh‘’v…«0i×èºÖâÞýo…¬·Ô›©IèJj0ý”¹nÇ2Oôu …ØËÔÚ68;h[|àÐ`¾â‚¢à{*UUNÇ£ž³]ƒÜf›^˜šGlÀcн¦û­ÑŸÿò`?à~ÔŸ{ü¾eþæÒE•5a3ŒÂ‚{ƒë|"yz”ˆ`²C‹6OÇhÚ˜¬I'ʈ6^ƒ×('€hÇ–9LiÐ ‰z²o3P~ƒ_éï9[F-"‚°]‹å,2` ûÒAE€v’P…€1±,íª ÔÌÀÅÔ#‡CÙ±V˜Á3%[!5Ñ¿±ÍS†ï¾`¸3nvçÔý€:kû(÷Y¿”Õš¾’‚q-—MC‚rF‘ÛŒ×â^(Rz0 &ñ“H'N+Y_1\¹rÌŸ··fÉ‘6ó˜åJŒ²`²káö•‚ b[Æ»\™^ã‹—Kô£B°½c îOîû‰W²AÀæwö0³ÎhPsÂ=‚URUS̹nöìäBàµàW˜è±#Nn’J0¬ä”g³ª®l8Ì}H›ÓûC˜•ÀÌI£+‰Ç=1Ï¢ërYãuPƒxfù·W·njnÑ3óʺӫþ]«‡èð –Á+ý³Ý븈oÆeÊ0Ð ]E€õH•‚ô&(ŽŒð/íY‘Oˆlž íÐ_‹³wÀÓ^ùg_ª7p²ŸPzþÖ‡~èå≹›^À '5‡k8L#:à(J íÍéœ9å âíÁãÒ¨·å®Ù®šÑãîœ+ô.ÉÞg4©–²î»‚æoËW.¬ŒŸ!Äj¥VxÌÁ‰œU\ pǃy4ö†ÙÚ5¸¹7S‰vÑ À‡”ê˜Ìˆ¼À”ŒdhÌ}ANˆ³kPy£Àhã¢@wPÔ=h¨¸•…Æè±` ²ð\¶†Ux}žç÷¸cžtÿ¤þ<³¼ yÞ¶þmßmù¾@AJ‘bdiŽ4BE&tæŠ@S—êÒ•(q%œy*/‹ËIZÇý|¡]“Oƒh”SìÌ0¥€†ÂÃDu‰Å^/·;2ºÒ`î$gZ`¢ ãóä_¿žÌòÌPSÆíT¤h!¨É’ç)óøn äuÁŽÝ/±ÒÃÂØYÙN”»¼+`¡Òƒœˆ9±ÀLŽË3Ò,m*áŒÖ¹hN]V)‚,ÉâMö3Å 2UKöØy€n³²@'ƒÛ™û /‹M.wE`JT¢Ù/x+¿YX±6°ûù„=‘= “Ú÷z˶èJڛܥ¸–°&Z ¡ñø¡ÄÜR Æ@@$K˦ƃ2 †>‚Óšw“®€D-Ø™ªq>‘aù2ŽL-"Ñ •X‡ P¸Œ U"ºŽÒfSA(<.f¥gÆfxcng‡ %.—¢% ù¥¤Y§ÞÔ`b±šìhÃA°ʰŒì‡²3R‰^©zVWCÒmûdüì¼ßÏ1b–EäŒAK‡¾_½ý>Î9xÄVi¸ª$W5B–v»8_Y>^Ëp§¿S2Ü+‚¦Qs™…Ÿ©7 ˜»2pú|àúY”ú1CóK:>×VlO™ÒQºÍ4_ñtäðÑlKª‰äD4 i·è«#™¬àdkÙ!C^~鸘¢6¦£Ä4¢Éh …½´–—·¯úùɫР\7ó„YÓ]ã¥ïél45¨ü¥L`—-ÊPB€Ä×6gà‚šAÝÒÐÔhM hõ—›M¼cùA7x‹¸ªZŸ˜hš°­-t·oîµÒ1¤ŒÆ}ìOöT;€C fÃÖ<ì…}T®õkG,(µã0QÀK ¿ƒ±eàî‹= ¢±„»ˆFÎ&C9Ì1¯4Åïr¡Ø´ò-$š6 ÊÀ.©ÉšèÑŒiXÅ$©ˆ˜àd¸0;)‰¢q‘Ò Œ" $=F…aTbìÆ›6¡Jˆ˜2q,î-Ø9Ʊp’M6œE1@Àös9O؉5Þ†B'¿4é?“Þì~ìN“ÞÀ˵sDž'6l¸VRå@€XËBêX‘\¢Ae@‘HÑ&•.gE©™'Z<5À€`½ˆ‚Ó4ùù¶4›íèZ®¬è…4Q¢TeƒôÀ–»pä<_^ÆkñªiÏÃ"›Ã鬯£DšƒL©lœnöT¿úŠ„¯“Šxó"kšI×:`‘4ÌE¯¿ð—?éOô·¯ßþåWÓj$1'#( †88îŽú¿}9ÿËoûž;çâ/sk¯ÿ Ûï¯Ãò™ŸgõxIO=µ¹uÞ¾úo¾jèe]/ŸÏµCi‚”!‚€È#ñ‹ƒ1l•Œ¢P”§Á»¢ªÍ¯Ç ºŒƒ€ÇtÞp”V¬«¹ý­6:˜³pD½F]aÎüý™×o:0åB%4[ðöÓk„j÷L"„rU·m”¯TI/_P¬4ýwÔ™±„lyù·«p=ysA ä „‘Òk”€Ôôu¹··ÿ©IòìL¸A&¤5ŸúGÂôëïþóqD 0p°ÙÚ//ÓPM~à$oo¥'œ@áÊ<6ú[çç1ùÃ>~’ Pò:Àž‚V§9Vyê¬ÕãË¥¢DµLy~pæÆÝ;uXpGߌGdcç°¦EÓ7?1ÅÌò%áÑ»TACÒ>¯¾ÂŸ-=f<=Š>U jŒ£ÐEîuÎ>] `u,±,ªŠQÆý@š?7õ øpÍŠùÄ¿e,¼ÆS[Òý¶¦8«Èãs7Ëë»G…ÛI4#R4ÒÊ¢R>û<¿Ýspq¤È%ï*¦wõÅ@ËÚí1ßà<ëõß|ú=ðç1$›Î@“œh¸3`P¦ÎkùôûßÞ99æaÍߪ×Ï€Ï—ç©æžÅoœü .ž:õТ‡ž¯øÃô$ÞbýØŒ>îªêt3M4ôv¡nl‡îaZÉJš‚RJ^´Õ£ß$ƒÒè_*~Â2sŒÜG8 ÇCZ”°Á_¡Ø7xY^©1áx¶›ˆÎjëµ´”{WÂPv-’ç¥Ö\Ô-üZë˜ 5°1ï÷8(ܘćóñijº7ìõ1<)¾ï§BÉ7¹ 9Œpo¹g}#Kô^yÃùý°SZ_#B¸5:›ñ}òœö"n©Íb3€,RC|Ås²P¥Uéªî€ÖÄ/+¿Î™Eþ˜(e¦n¶OàþÉ04üF¹Óq Œ/««%âé$Ž”Å*Ç 8Ç«Ë }{Z&mL9~<:®xÌú( ¾³‚šªD[B¬fqÎAìl(&>-ÖÿÔ}àóªõþž¶ñ™×ù=wìF2R4*袩‚ºA¹º–ôÁø ø ÷¼šg“wo ñ[†üÐÉk›Î-Ö¸ÿF‰Ûe¯‡¢yÕ¿¥6Ãò‹Ökì`ü=Ød¤x—|H+ÁZ²àÄ´“—çÆ„iʇâqYº`íšVNJ]°ßíìg7¿u3Ú×¢2)*Ñ/+8Ð:ëFe‹,á‹Ã81fÅQªK"S¨ÖcFêáÂd§Yœ±ÿæç¸"רŒr:îmYiŸ¦)FÙ¯Q:Ÿ/u—õï˯û¦ÿþ¸ÜÛÒ=Ø3ÈÍ„î¬'À\M8ŒGÉ{¥#dò«áJþ€†rÊñ^±”#CÇ¥»™*ÏdP ¡½z:õ†ñUSX0Æ ¶Íö^•%ß»v¯¶¯ñK‰!Ü’º2pÕSÂ%;A;º¹)xч-ÑÀ»ðZÙT~$Èãï,@ÚÄÏFÜ0qAJƒ(éÈwÁ ú­)¦9ÄdYq÷W¸3TŽ‚êÜ %dГ3¥D‰  ÆêœÀE›Ó  "ZÏ^W/SC›[…ÑÍ[üïb–¬y>ÒbÖÙ»ÞÄÎàÄ‚¡›KPpà ¼c’XÐÊU¸2=I"äÙ- |hïz)0‡‚šÍÚ_èsI]¸rÔ/aÃH¢T„h H ÌH„Nº £Ž’EΊvI?<¯—NRÚ‹»à;à  6º‹2|ÍÇä𧸸û:Q¯lðކÙ^›îÓ Îk3žé–RyfÝËÒf1\—;p€•¸¾ô5_[E·ÞæAÈL p(Q ý@RÓ˜„°ß ¿<Ï{æK,äb  ‰Â=ÈPF´ßÍ6VšsŸtgª< “¥rY‘|tyïD}B5:Þp>š0œ¢óH+&×é7ÃI&óÏ¢m¼ä<äN6-i¨‹fW¹§æ.BeV¸ÈÜ™—s·æªi‹XV±) ‚é‘j`­LÛRGT޵L§À%¤§Ñpc9„ ¾PmH âLŠ.þ‡³}é`Úv8#a³%(`M9Ûò¶—cæUè3ÉÃ\Üʹš’ àÅ>\£á™þz´Õû P5Wr°Pl,¼Úõ}…³¦÷^zÞë{tn¬Íj›#Kñv"d°3Å"NJæ¹ébxu£õWbKz`£´S¡@àE (ßv²"ŠÆDšR1¸ƒM9ÝIm B¥wíxñY:ÌDNÔ’Ý– Q»¯'yÓ¯&OÉH‡†™Óx`Ÿ»p3p6 nmÛ X5q®TîžñÅ~¥ý)Þ%-\*«(QK1-Ò&Œ»c\¸7¤Pä0÷ïêgÑŽuìIm“­¯8 Î~³G:'t ³¸êžlÞ/V’‰çFè)J¢˜ep’Á¶ºúBÍ:.ƒþÈëõíƒú×nH$ʲ¤f–À bÁ€Ä7)íÚœKW$‰FËg $¸xQ6Ž"òJƒ¡Wè¡¢y($6‚:b'èm +iØ¥4¤F[Æóûûª?ùz½=Ù£ý} êûÖî“yE¹”t»HGÛ´ÎIIo~Äa'·ù}íë!*X>½Å…½ «L@Yk¡tД]IÁ¤rWy­EjЂޔrHº¨Àph‡k<çóœŒCov¦mÜ? ]¤{Pð ™Ï*'½@2õç©“ÆKyÞœÌ»× wÛ;pû6²ž«K*9{tQ§=ð,ÒZ,‹ëðR&Õ—$Øóõßçáå— Ù£»¯pèå{ÍÝÞê5̺-è´<ûɧ?Ÿiض½³fÆ‹^)Dň€%R‚l]•—¢''ämšotª@NZ;}¼ÃÅh{ÿIÐqjòßJ(9ÖIx«Ýó ŠÌ(¼8oø/ßð»øwµ§¼ú]K@_zðÖnû * h ºJkh¢Ý µ•× (hí¦…t²ãs9LþC~þñû÷ÆÌSÇú>ñpsk»£~ú w‚®J5Á‘¦‰áWº¢¯Ö8™¶b}ýþåÃÏá»{ÿƒù{‘gÔÌPƱø«ò"J<1+§5ދĉ»("%QR¢¢šuŽx͉kÔ)rñ™à¤›”áý̦Ïf) TMa do×Û KŸ‚ЊHÈ‹\°š«D—³s‘‹J‡Cóþu`ÝÞÈNö“CU¿]alæù¹]*7µ_ŒöÞ¼õ ö›\³Ooß±ÿKâ€*¸«yíåÇ~0û:_ç§>/!+åúŠ9W\Δû:4—§.¸y¯vñÉ<‹÷ǰäíçxý½­`þào~ã p´¼Gß>–Ï6Üÿ²Ý>×ZQ×þ>Ú6¦A›×N+t†ë­y-½.K5)B‰-­J ªEd0gU_0’䊧§ hÅ(–I4ã"WgmF“ÁBYtzš43d@éG!Câ1ƒ bNÌVRè–£-þñдÐg:¾FØX„p¥ô Tå‹¿°ÜÎuÚ=y§µh% …„€ètŽ3¿Ž°#y^$4eˆâ®c# ¥Ùº®GÜúæÛÄϵ|­­l-áÑç õ¶0ª{mî WKàæÃÓ†%{c5üèá"»¦¦œ•ÃôÞ º¨$%ħ5†Îr«Ö«Å|¡)„Ù wµfz̦Î,pïÇ,W4›GïQx+åfâ2îx°£ä¨¦ÛóÝå}KF~ÚòÙ_Ù¹w¥õ3÷VØ6y÷g~?ýpÿÁúë:tÛ“â_ü`NUÄ® ÈÙ1‘Ë¿æ7¯ôD²E2ñº’o,Y{FÝñF p,ƒçwÒÓÚþ×µ².ƒ`w®}üüûõ÷õ{}ù$_6gýZ"«·Téîœ?ÔDhƒ¨ ˆm]ëQkºG&×´ÏWª·[·‡ü)ýe!¯w^¼¤gC‡û[Íþ¶–ý±£ÍÝzÄÊ5a‰¦Ó`Üšû¼W€—^Öœ!ç=®§ÏœØƒ•ñûÙ`GÌàsòâ‚Ù+˜ÑílÏÌÌŶÝ$b+*5=êë¾y2[ N}ƒBUl¶Anwg¿õ-?óË~¦½®4ÄYqÖ-^³r;[¬)Ða¯taQj Gþöô~z¶ß©øØs³îg²¾¢AºkOÑtúÑŸ]ÿªoÆŸó`\þÎx:Ò^FNšÀ&aw¯ßïôò#{½Tèð ºÛª×8Þ0‡uÜ´ú»uÙÕ­ꢓ")]²t ¸« RâpúŸ=…qk²'™.g…•‡ÄJšðÑ=ln5X¼ôVné´ŽÊæ‰wt\ÈNA,u¸Ó-ËúËu.™W"LÃùä²+ºœ”#Rå.ÛÒKìÔŠ9w¶¶½ö_U@Å<\Àx$[ygÀíššlå)Êùþ Ê–Ä;«e/Û=®à!iòV9|âPá‚Õ% zÐNÉGª;úzjš’ª³Ô‡b;wáòÚb<©õdü.fŸ<ô [Ø@rÝ­E8²«`ǽõí + ~lÌ7ð,û⟟³T2¿jg¨õf °$Yhm#ÅTHÄé©õ¹×Ôê•ò¼œå»þ)0{onÐþ 5â*d?R2x[ÚÊžbõz7,ij¶w^º‚4ÀO; ßÉÛmh&A˜#ŵ†¯D.À“U†Nõ5xJÞMú3Ý¿6w¬w„Ù&ñÆvéf-Ýx©Ú*¤ÕQT³ÑvPxâ¹Ê!LÔð•ž*Xfmp…[ÛëW7A÷}&îH:x…A©`ò˜\7¨u(DNJS“Œbý’8=Áûpð€eC^¢ …_ûC¹¡($š ª6‘$L¶µ=Ê]tôÁYnc÷³z¯¦9ad"lqChCë{V(F¨E[Ú+ðùDO¾ãWýï¯zc¾÷^N§Ýç³zû%L¸š¬ H ˆâj¨4©á}hé°Ò0(úÒ0ÀƒÄaîj¢spú29 Ŧ‰Y2RMêÙë0¦ Š%Y/ÖÜr°‘?A…5òB¹ÔŸ”:Å^Û€zÄãV(²ë_îºÞþ6¾›†A;²Á.g(jì ÄM\\€ åXO mu×à¡~*Ë.æ#OݺD„)>4]i´9Zç±Ór­µ³jf'9ýò›µÒZuÍÕ-Aè _&ÆCÌk˜õPù•ãTg*`štVzSÎ?Ô»¡H2H0/ÝK÷;ñ{!ÁÙêwã.µýgjø|¡-Bä9©ž)ÌÅ ëâÁêËB#+03LŠEI‡ÔÛTjèd46çBhV¹øXBŽÄ2÷&¶óÂ%¾ãIºOû;ºO„ôéH”¾&" ”˜˜ñb@'š¡ü:N¾ St‹ƒö<]ëmr&¡hÎi?È )·“«&±+úêÚâû7ïJäJÿ^ü\øS‡9˜6³(̘@Ç4¬Ï_§:¿&SS}Ñ\Œ®çà$3Âe²|¦ìà`ÁAØÒ2Å2…<Æ*ʤ[‹Mb…›÷åßйžñ„ˆÛ«…X&‡Ê^—'›9éæüèu9Þó^J«™}ÿø;7ÛŒç9 @Mø¢Îé¿À¾rÓ¿ô@ Xý•£t¬Z6 4Ö;ÏKhM0’ÆÕì’7‘È ÌL8N´¨“{ÑYä¾%gî£[r2Ïib‡8‘cT˜QH¤¨\‚‘Q ÉV]¶nëSÅaÖ˾}jöƒœë®f—V_¸¹?’‚±AYˆšÝö_¿¿áÎÙº’È2Ì4 dè*V›L™± jñÐÉÜÂ/ôt†3 W˜}rmÁÔÕ·¢À;¿wïÖË—>e¼_pVì™S7»_ùk«H˜L®09joM˜Ñ¼ž ô­4 Bq‚1,T)Œc©Ñ0fVøæ8Ü8“ÊA›yXXl‚û¥]%{]‰(+Ÿ,^ur|ßM¾v£Δf'=ÆMØ?ÐiÛ±%"¬“í~´&€ Å…CG†¨ìKí÷ýL›_¾·áD¢z1[Tíéóô¨±k[Œ¦Ÿ‚ŒŒ%y¿|=g"“ãBÒÙ®a&*ù^fa @ÃâÆ[v¨ 0éÇõ(U’âîà<6«xÙ"Ö„{4‡¼¹»øJàþõj…U9H›XEÛ°ƒA‚g¸Ò¬‘ y˜5ÒÆù°” ´’%¬«öYhA€é5 &9ÐEÌL5˜¤B1bPWeDu`€g ”Yn»îA¿‹Ü¹ϱùl–€]%~“áãÄÜßÊ®ÆÖ0÷Ûçóí]•Ÿ©ÉkÒéùçåü®òóµN«¥ô©êv4GoV’[k—™s=¦1µÒªÐX¬^¬Çd t¥c"ô im?a ÁñqD™!šBp«måòÏ·s‘³¡OÆ›MЗë2S!J~ˆÃ á±÷Ï öÚO÷4»û·P›Ë´”4­BŒjEÓAMJ56»§3O‹0ÎÀ–ý¦j^˜ŸçΘïŸ_ô{fƒŠÙá KzÙ¾´vmŸþï>Ÿ¾ó«¡g¿A+c4i“¦0&Œ` /K”tÝ_fÉtõ9ïÜŠmºcókãaKýÒ©Žê±äÐSø*Þ¼;¯ŒoåE‰ ðNÐ@p ozï6FëôU¶vê¢Qz5”Ѱäp oÊ QÖ ê܆نòµè9Kk“1¿týf¯gž3^dÅ\:Ê„uÎ.wú=WÜ›íÍìk!–9šû™ð<Õ~fØÁu¹úh9Âé/›¦cV¾¶|‡½ÊwxyÝ4ŸÙnl€Á@2ÅcrιNHQ°Uß9Ï)KEÏÙìM»âð¹¨CS7Þ B1 ’7ÀÕ²´Ú«BÂÅPÁŽëÊé5ÖíÙHt¾}|Öú~ÝòQíþ‘yýÒ^O÷Ÿ½r í©ÿçú…öïÀÐ@¹ãæNëC©rœå¶t?ÚÆstÒg+þL¯Ðk™ïo”í™ôürrÿ7Ñ>Js{ý ó,é‹ÃÑûsÞn›}k¥éóæ£ÃyæÌK¼>pFœ xûFT?ùcúW)oîÃì¡oíûèÜí»Äñš£¨%Z]ÑlBÁÛN"6Šn´¤†%jÈ,ˆm€¤ð ~¢Ë,€¦ÓJ’"*¤ Å¢–å`Ua$Z¨¡dÅÝÅQT+µºØÑWŽ8‘Z@ê¡’cšEN:m„ õ‡\yàk=ïËn<–)jÅk’krRvÒÝYô°/ò¾öÒ Gd¢Ð(I( âÇY,v<¿ïã·ËÇCQ_’DNÈÂÛhQ7Úa´ª !3·l*>\º×6?½¹ñåKçóϘ.ºgß½hp„Ûõëñ…ó8yëj«Ã@ÔŠAgÍs@åÓÍm*î9I,´€sí× ÃûºB;£ã‚æ,E ¹Þˆ]Ç  bÛ–€;fŒä´ƒ2ÚFlØYB¯çïèšÏËGü5¸& ¦.ë±OW‚Üs¶2¤‰_Iô÷}¿™m*›X¼«Ù@+ÀóFíßö.–lmƒ“SÑÞ ×ïíGnýÑ7;ö7NOù­Wu1}yŸ\°©æníü¹<××{ýèÃ×û—ýˆžü‚Ï5?3ýŸÍg'Ð9Ë´l~ÕÕi+o7žãsGèoÿÑ?_\ß3.ß(ä5EîJ1›XkwOÎ/ôü"ž%Žåg[ÐÜÖyãì4Ås3[¼Æ¦ÞäªûÎ{&fµ{wŒÙnýŒ©k« WkÙ|ž3zmX®%Ë@S:ÕŠê*j%úÐhUÁšÓsý$é­›9â9Àž”äƒá?žtßÈy8˜µ•ÊhÄÀ*•¶‰•Ö%MÀÓ稩6ݯhs—ðtÙñpé¶¥Õ²ýMqfæÜç£ÍÉßhð{ñ=ì† Û{˰FÙò• Z‰± íŸÃ&c³"yY“XIE×››ºj 80É®HYN®ÄÕðE&È0-×.9ÕôVQy;d÷6ÓcT@µfUÙž|OwJbWœÐb,|:ƒRÜaÑa㌢«ÃUZÉ4ónã8¡½Ã™³*¤•&TåÕ3¨¤5»¬yÃüÐòB”CØñP‰‰êSOƒMJY?{Þ•E½GÙ1fi’ I˜qʺóR_'èÓçÈ»ªüxê;÷„›–Ѥý(|€BôDŒî k3çÕîÞ»6U® •ýa³©þŒIvtšnÅxb<±;…üCk¹Æi¡ÄZ|;-¯ÑïÍq„êýƞÈ- Á2¾¾/Éõ3WÜ‘Æ-`¥>žX nT4^=z7p¤…ÞAwã~ÐÞ'_‰G­[­+Ͻ綘hŸ‰ïòDz¼ŽS–MÞ”Úýø®êò—½ýföáq¼R;Œ»ô…Úv” ŒÝÉI;(ß)œåBÎ’R ¨·Cc2.ígŠÑ\ùÍ(ËêÈÂv†>OÕcGeTfõ¿[þ…éN°!•B°ª®•P¤É]­œ8 CNì¡gÇMW3šé“) ¨Û²Bcjµ55£ÖámQ “î"E!ÃÊö™i ’“‹¦ã–Üm¸:Çé¹Í#¨gôä 1®„|kÏÔV1$ªÐÒ*\ÞµÒÇ´W|¾Yùf=ÃôÈ·£}í@»òj#Â2¨õ•Ýó¦øŽþ]–”„VnðŽjbÍÁ 4p g`x•wŠˆc{ñ1‹]Ê—9!'¨Éú/:g•?Ó=k®¨ñOù{Ò¦­ÕµÿÇ0ï’—Zõ2,ioÆë;‚³——{>ý±ü~zZNJŸ`³ò¦Ù²å6ÔÌèXñé2±åŠl:&£å5†]g6îÄït7wŸäw W‡¬3ÞE‹ð KT’g(¼Š*dw…Þ6O5©s&ÙEgtÍŠg†–²/©hàWü¶˜n·å¤Ð'œ(Í­|oñóýòU¿‰#ãŠ+äéj°çМK°I7gæ„õ|—m£¡ìT•Ò€à§[â æXÃÉ­ `åRº €›SÏø¥¸1Ö‰ÀPÄ`b5U©<`Ó8tZº„WrÏF|ž>«‹¿Nw³…ÿˆäp1þšîâ¡&Z4\ÙM ¤¿[»˜ÚÄïe#¸-hz˜l)@ÂubfXpc×PF4а¨¯Ú-: Û Æ¯v •¨ 2£‘$˜ŒE)8Â5›š±¦í;¨“B˜’ºç'¶Ç1U/_·’#”"ÔA9 eó™÷kw@Iµú„K Έ"!{ŸO~žPP–ì ~qr¡ $Â-žõÔ3š58‘P “R±@Ô@Lò.ç­$¤À1˜*bªs¥ÌD[Ž'C}¾msŒùÕ2Š(£ÃáÃu‡–ŒPsbW†ïÇoÎj 8N'”ÇÒlñŒã‹7L.à «¸·Úé8(ó–«S/Ø|Ñ6ÐÅå"¨`‹A1JGàÆÎèg]0¡Á@†9ê=Ñ#7Ù ùKÍ6|$/….æ™Ð åÁvì(Ç Œ ‘u½ò~®xþšù–¾Æf/`Ëw—¾/¼/[ñ(ž³€c/H_o`´šÎŠSuâÊGóôF^2åÍì/镈ŸÅ>¨c9.ÏÑ ¥XS‰ð @4)—½  Èe &DUÀEfbA÷Žakš ® šÙš±-p Às%j:ÛË{ÁÚÚ©¾áÙ^µñÃG5=Òñ¢ªÊ6P‚¡G¨Ò™&“ 5HDZ*— ¯<Šk¹–¹zì –Š)úu__ϯ§ÚÊ2¬ {KK€•š8ãЊ£Õ9æÎÀ‚9hÚ :¢Äïïê笚ýí;¿1í†V„vLÕå¥ð©ÉŠ¡n Ëê.k±ð*ºÅôšZ] hÞ—Îs’3½?šO8;O0´›þŽã²³â7K ’JØ©£tˆQ¦°Üi4ŽØvªu`½#ªÆ¬˜²v—ŸLæwðÕ>ã︸1Η¯Â@$mmØÎàyyeº§¢Û0,'v0H*ˆäÓ^±¾ï5€4ñ¤Ev«‘ñïà¶¶z\ ªÃnôA mm¤¥_J›\yoo àøò·ÎÏmÙveŸráú ¨=oà%riÍ Ik8Àãwl3erʉ’'S>¢DÐÿ}Ç’þCš'ØD ½ž µ£2ÝðÏNÿLøç/åHôÃu=F µò0Ïš‡ù+ò‰Ÿ`~;¯X‡ ÑÄ 2˜‘­0}(2ÁåâäÉÞõfB‘ŽFÙ¦qXꂈTS½¯°-Ó“/oÞÇÕ¦%ûAè:‹X7´†ƒ÷M—ãœtùd¯ý¢¦M6öÐÛ;{Öšý,ûmæ·ù"ûžíQ&‚&´¤AúF–¤,j(ŸÕ}mK,ECD_µÃæŒN>™¬,N×C9?r¡LÙ¿•fMòræ`[SãáUu×”ñŽ>Y³÷dÏËîé-–‚iH ‚C¨ÖÀ@ÃCÂ@HŠDI¶û—nRT·F/éÜLzâ(8|üe¾k3 ÞÊÎY]9a®_.ßy¼¹òÅ!g½3HXÃC—t¦EF€ÄW` Wb•ÖúRúŠƒúz·º“7^`…ð§CJA&:¾J­]ýçtgš•žI”ÿÒžo“Ó¨@[MùÒR… €`Á°Ú&aíJKd" (òVÈl35¶:F¶eèã•À%}MZH147À´¹éœï‹¬²Y¼ &CÑK‡ž)´õöý{[RŸñã÷Œ%íùèãè|@†o;ìy8Þe_ìÆÍ«ËE-è®Ìî‘ ½iÊ$XÑàIðUÞÿ òpoï¿·çª%#”ºàB¨²ç}Ó1,@ƒàS&¸ ;B7 ã lPEÒÊï&m"g¬ 6(’ëÖÝÂC…d¾7å<ÁSgMG ûÜÚ±†ÑíûX²ÍñÅ<ëuÜ ‹bØ©âÔrí“Ï_—žÿÖ~ýIØ¿}'çc‘¯yïæï­æõ û›_ïŸ:_?õþö;7ˆés÷Ÿ×Î<ÁáNr#3áËá3%Î;©™¼åþ| GV+ËîçdÓî&ì^áÍÁ‚\¾•¢øj D‰Æn«ö(ÚHŠ6HÑjPú5PùB¶F¢wã½c˜ƒˆ»ÐF Çx°-( ¤0&0¡Å±$´´]jH+®*,Yæç ò oàwá‹{q.³í› è¢ XBq ØpŽÂ5@§5^Ï^(Lý1#7‡ íÛi·C–L†ÐP¼1™’€Š&X  ™±âŸÔUÅØÍñß¶¿ákýwâØ gœÒ)I¿Œõø©|ù¾Ú?ö›Ï{Ÿ«ÂŸGÆy믬Œ{ú§cF¼¹s¡õ%ï­]}´¶Â®JÚ÷F\L  iHB9阹S/ø§¾ã¸T-ÅO„´H˜/uR%þ‰o¤ka9©¶3ÁÙõMâ&ÕëUC ½ú­ðÑy÷p¥Ô:ƒ“?:N1uÝcf«O7|}…)yϽùƒÀÂZ$+`‹ »ÃŸÉÜ›ó|?&¤}’ŽëоóêÁ•¶ÏG·í—ÕÎË®w·Ü9Ç œ¿{S¿þÂüÙçßKï½F¾µá¯GâýýðËü»y’•ÄÛ§±o—®{ÿ¯b©äpQÍ™f˜ÃA¢[hÇ+Ú[z\í~7ô,1‘OÔÉë[¦Ók ðG/ÉSÓNÚ^SJøxÿ¬­ùÞû¶‰[AÜ;™È§¨êëŠìˆ'Y{~޽Âð‚2;_›ŒŸg@•RÑävƒSdäB—[–Ô¬@…vŒÔ)†d(d\US]–…\¯dÁáÈ•&÷³Ü¼`$Zµã20j$hTÜ€½é>Ë¡prž|{øû~¦ÕÔ©¥èÀ÷ €Nš›7Ëùßfs†M÷þ‹zç¾§×õ%Üëö|ˆ“äì‘Pö¢ÀšFÉÚ¸ W­vnUe@xC€‘Ù0CÊ®ýehʸuÖP§Þ.£¢Û‰^#cAÍéÃé>äOƒbݵ3(JEQŠ*À¼ŠÚi…ÙD©ËpKŽã‰iÙ ¤²`c±4BxµÍ=Ïf#¾Ý­N=¨˜e$âú6^:© ‡^È™•è"ð¶ z0k“Ü~ÍYx‹Éº}”ùã†û:u=¸½Øëi¿¶®Ëœ¬fgË]³Çt“q‘† ÇëyÎFÿŒ·ÕÈDSã=sKÝÇ7ƒ,öybßÚÆAŸ„"m§Z("£°¨·ª¯¬–V‰¸±•’µ^“˜›T¨Ì]PíT\4ìÎ\-ƒ}†/¤uògø/iÛ ³0`ÂDcÂî¼x0»ëbq¢¯•vÕe¦·º‡íÎÈ;šãóHÃc°ã?b××­AwõL±ñ‹DoN] 7Ì(o˜d¿Æ?»¦ˆ!¨X4¡k«[¬>ÚŽÊ\~kHÂŽèš¹¼Bˆ" ÃÕDP6X•Tùèú£wŸ=Qï 5TöÂ(£mŠéM"LÚñ…Å4Ãȸ.¬n=79=9ŒÅvÓ`Œí2Wž¨¦i§µ¿Åk™Vô=ýa¶˜È[“’s¾Ûe`ëX +ÍÈb}w¶—ÈRu•:`ÞØ³±ªö5ÝŠÆBœ^ ’¡A¦w’+ jdÞyú †aÓ ;íÚl†xÝ¢$NŽm€[!›½¸W=g*á–T ßA …õÀgW<ðUtýÅÌ‘”ÎŒˆR—™Üb«yá'Oÿê>º‹”óôÞx½, ¨Î©´ ûHUëLÎd†{¬Ë|sæà&¢È™ØÂo«Ü‰êúëËß½˜ï6AŒÅ/Ñ ŸFðÝÒV&Lój>*æÜ¹½ŒDAa?Vßô I"ÎFºÚG9N0ŠÎ–_K$p…¿ÎN IÇBd¹‚ÅM†dÉÞb5wñ¤ñŒ-ãu%¬Ùƒ[?êwÅ_,d”âIˆÅ/.ãp‚$nؾ 3¯¡ {ƒ½¶¦VÓw°b# ¹ØÜ¼xWô²öÄuH÷;Ç__äÍS/Ì¢ð‡èœH±tkü8¦uF\Ý–·—`Ñe~o€à DnŒó¬Óg"N* þja—Ÿçƒ5ñ†$ûqrß‘ŸØq&%ýäÙŠ´Ú7{»ükksfëºø*òý¤yшÍGîe¼a~å”<鎹Œ¿Í2ƒ8ø¿/=¯6ÆtT~xç^­Á†637»–Æsëˆo ºÆ:þ‚$»u§" aÎŽ’¤Ì£E™‘›%i õèN4KÝqXû.M­(Î0À•Mó|UÀ‡ûðÈ2Ð$Ç!oò"÷žùC=,"‹å€ä`ìï-,³]¼oÅku 0“ 2XP K“£Z_™âðiD6ÔLáG:&ÒfÙØTÒ3Ú6X%Åq$•b'ºimäÁiŮ☳@ jè„j.µïÎŽ²2n ®AÝñþßçì?Áe­Ì#RJƒ(C (­ñª7}·ŽJÌ: ¦‡‘¥€uÖÀq–ɶZ˜Ju†XÁ8+O^Ö¦3G} óbÁ@3@ð€MŽ §çùìlˆ’x3C¯iô`0¨ÀhÛØ"g¾Sµ†=Ž×—eyËèˆÇð•?M°%ëß’8K )iÞ sfôêþï±>³ªÍ¹gLHâ vâþˆZ¤›L vÊ¢•N@(äÚmô¯Û\l¡@íPOÏ›-ñßê­{G°ÕÝ¡Ç5ag 6•(Õð†|†e¹<ú^O²Lc¢‘úQüWq¢Ñ)-º ¦‘öоþ3Ø ™¬DÂå_ÁËÂ8ÔqЇ‘‚¶Ø4•¤¤¦28»Ö - :–v©‚±Úõ¦Å6iÜ»˜ÌG¿9k±å·=]¢Ž›bZ(S?r.̳‘¯,ŸßO_,ºtWü\ÜLþígK#Ý#2gµ¡š…¶kOÆòìH¾pd6ÑýBäbÖS­z~hMÍçg9ún¤[T8òúÑ© ¡Õ¢§ˆ d 3æŽ鯏'‹ 4œÝG§ å.K­²d3’´ÀK¨´eæxÑÕP4ùvÌák&îEã(x—§ãiÕÞ®ûøãàê_õáþXš“âÉw|÷ÇìðaÑç6\é[‡ª#M$îcí~FçMÀYyïµNo€ÖXÇÑÀHÂF(TÁ BcÌ]|Ø*!µ¶{a¶rñ ñ¨ùá¼ÿ›~Ö¶zZáëÝ‚Õæä¢ê8ši ‹=’cŒ·ŠJW€e‹;YAÊeb_ˆ‘J÷†æy»sûo¬irìk‡aÕ²¢‹Ø`³î”)W³µí x·ã·ä:a|F5àøÁA8›°èt-2ÔœãæŸÄ6§Îu¡1–x¢é°ëÒŽÿQóvTÃÄAƒ—lÖ;Œ·º üs+·Òî×P¯j«8¢X‹Ï¦pB ø[{RǽdÖ–' ÐADIjjèÀ–A´’£…»ðµ³°ø`‚DSíÞ™k¨•(ÃÜŠ5Ö€Œû8;¶ŸÀPέ-*h¸¦W„+»a/}¥ýŠù®6ý»+#tÛž÷³y¿žÏS~ù9Gï#VöÛû¼Ž)·iQh¿›îçùôõôd(G^4E4à.„j¢-¥J®´2&-ªHúáÇÃ$fl)eÂl ­&ŠlûÖÄ" ³B?LLKsÌ•“¡XJLsI_¯o6Q)“QW Vّv’Ð2ˆªbƒ7n·› Øe¦ÎâÂFõÎ…}ůóŽò‹ìç½²}¬tý|¶öNðl==äY;e2!UÒEù&—4ájˆY‘$®aEëx‹\ÿu]ñ3v©?à2…VÉšQ¢Êáù~Ós¥©öÃ{¶{WçkÖß…Ÿ|ñOãB ZL+a»X8Z”U‰ eÓÝñ6u20@]½HoL F´ÉC¸,·qQ&Éä%YBºæ¦lÀgCy>êÃ÷Áë XÕ¡bcURЋËKî<=¶mª B#¦E”Q)"µÍÝ-VŽŽßîÀâ0¼aEÃGyKËýD.=Wûýÿ»××Úwö­Ý­¹bÎŽ5©…‘si3Œ‹G !g¸ñPê¡{$£Z¦5m8fÐtT6A¯ØSšv4{öN=»ßî‘ì÷\·Œpœ·3ç§nöÝšU™Vk*Ä*-Ç›ƒNîÎ ö…ûÕý¾o¸FSÕQ,ü ¿þbòÇÑëñþ·૟7Q‹97üÁšÛ™lʹª‚¾¦«ÔâÕž«{%*ýÚ£Çý˜Üò!½Ä[î¢{D"…âÅEÈæ©¶$–9QÉ!W÷…ÿщ²(z¡5ï”0Êc ^8ª™™)q´°€Ã”B:^‘ ëhpPâ‡C9è6²Œã“4„ÖqÉ^¼5?Ã$ˆ¼‘`Þà(ðÑ<×FN…„ÀB 9¬TÆeÑÚ߬òTLŸÆx³6æ>ùôj·`d¯„DBR2ùJV$¥ Ĉ,ƒŒ‰ øøóÿïsû_ùË/¿øò)y& @QÚª úÒ°V&ß~¹¿˜÷ïèm‡Çcâeø‘Á/½ï£xc ä{|Øé'§Þ^ÞÚäILøÔœwVeSÎÊX;€¨·ýÕË}¶ç5´¸\´¶Ñ™ÆX–¸_ ¼A`¤ µ†zµ§ż-[MÑàµïŸüˆ·ÉÕõ"[ßëÑUÇÑ;c;N¿öãÌö£_x¿ß¨¯g×÷c¾rþ˜ÿÞÓÊ^A!D‚Ã×vöÛ$ïö'ÿêÝ··NW­¼†î£”:¿ßs—Ñ`óÀô.Ú‡Ë1g _Èv'_^Ø?ÿcŇζ.›ë»qýÙеvòÓ{p©šÈD“%§EóºÛŒ(¤Ã“;–o£)àšLÖAvL¶{”ª Ôk–qÓ—Dlo-ÛnñzöGÄÏ6~.çÏyÛààŽÃÙ¦û 1ÁªyŠçKÚ_<Ö.¥Ž®ÆÐgXîîœ E Ѐ ZA6¬VTåUê¸ L5´hl¤eªñTÑa_ÙP¶Õñ7“xƒ+•´‘ˆØ«éƒæò¥ÒBLîçÈ`°mï^ÙóÐçæe·çÒ ×õ÷žÞ»ïœù˜Þ†æÎhzmeçµi®²ø6Ð/ÌÁçÌ‚äÕÿóCýa«T”ñ|l#ör#ÙÍDÝ$C©6V´ áºíµ#á¥ðQƒdEo᥵w>µégSË). “¤)vNžl6s±&šL¹ .¶GÇ骽hNÖ›;2 ¤5•¤ è-ˆ¹âTJ:a­igAù:óBh¤L0Ù jW’Õõû-•Ôõ¡Ò+WSj€èÍF+ԔĠšZÇVÜ)%Ñ„Z‘4ŠG,pföz°§ ¼´è\ïI²°ë®$=TÞ‹àÈñÒ7+ëºqzt[‘:z¥>½&ŠÕ{Ã<È­{Lî.V-®û’‰ÚÂÛv‘ú»Ç+’ª½ê+º.‚hìj¬úkL]ÖЊ;ª¹12¶‡„÷œ}l¿E$,£"@…Ç9T<%ê–ÓÚ<ñ[.’ d0„›‰¡ %kC„hÞ øf.AsÚ€ŒÙraúy¾âÏ¿€ÿ”ûÿÔíO®¼ËnÒŸÃÓÖ´ÜH‚5N&«ÃÎy¡&(˜B?^Cë–ª/¡ˆŽ Ïqü÷G‹… -ü௓˜Ò•z)(¤Ž· u{k—ƒìŒ3pEPâz™Ë«•ŽóBt ¼S g)mõŠwÎâûö¦‡o¯Ñ%›ÁÜFþ¨ VÆ'EmñþÛùŸBe¿þë¿öŠä)u˕DžJ¹vs«åÕdéìïw­‹q§¨¦›e W«þxÞ®ï?r¥Í1×:¸Ï°^È¿d0º±^˜ìÊjCPi! y*yÃ5 m  x"I ÌnW¤³!q¬IÀ¶97ÖÂ\KfÓœzgëF=‹Û÷÷ËÊ_nÙhgkÃ×ojÖÈõ¨9ÚÀ—^‡òÙÊ·o˾›ÏÄäsÝ÷õª¥æ©:N;_Ükx¶÷ØDRYÞFqHk’ †¢y:óo8wŠàHu›7 ëºFzõf–óÅ`úÛírÍñtJ®nГÛM)ÄØÏú4»=\Ò;Ž$F*ßʸI¨/®ˆÄ•\ïÚy»)Ãð1n±]ZcÖ¦HàóÂàú6|\ä˜5Aº ú¶ /zqó8%‚Ž\­+‡>ǃc†‡6Y™Yv>œÓ‡c(sQö4Ð9)fÕöLß ¬”4× RƦéh­/Ôz馓X£4×÷Oøsr*9¤“âD$fo2&ø‘ìù2›˜¸Âïʷœysc݆2°t4#”P‚²™$Áoa°Ô·kÅJ PÎusølåûÃÃ!’íbR 1î™Ü¬JA{šC°ßg¼¸Cé Ïu¹{Æ3gÊy÷Yõ‰\p~½L׃²¾«‘\0:A¥Å«œ¶°PÛŒˆÝQe8&Rj;ª Lp1Çu{ÐhòÄü:ÜÇ·÷û™ŸÑ𓱤†›$úI®Y (W„'×év£1ºK ÝPãzhÔ•Ž¤aQ˜ôsë‚+k±âŽ$háμÚ}ôãåŸ=,‡{NŒºë-ùԶéÈ 1Þ‚ê)S채´ßåUtɦ…Ö '¸pûÕûÀ¦ú:Ë$í½ùÔè¥ûgÚ?½T‡0äO¥FÔ·|q>:ç°·*Gû=í³Î‚Ï=¦Ïu@Lt–T\™ÖVòŽŠ­FFH C*'Ä8•ÊŠ¤±íT΀3˰ÊF [‰m‰P8ΠÚà<@—GK#+qâëÚ¯÷:þÅ Žx4­'ˆu,è⊜±çôØ´CÉFUˆ*&@¶é<)Íj'" :mº-x¾Éwa_dß¹ßñþÿõó»°?\}ïÕ«—•€hê±Î¤ ‹8™4QÞú¬hÔ ìµÌgn6GÝšˆ«A-•B);o™5Ò&¸ÕéãÔ<+ùqÙSßnÌãÏU—Þ7á*èS³¯Fç{o÷yÎýž;6ò2нV“dÏQ¿1&gZ›u®ýfn\âR#n«¾}ñY»ûþ˜S}æÒïq溕/Ї¼G¶Âpˆ¢±v®&¢6­¸Ê`‘û–Ïý¤ÙCi«ï‡TÁÆY(Åö‚9©°RhÍW1á)Œ&* AÂØŒZüoÑŠ¥GZØ›3{Í]|:’‘c{ÊãD‘h În:‹ÓŸÜ‘ ºÆ®Ïñ œxú_:Õˆ—0Er²‘j­Ì0í3רÞ\DÀ…àƒg }2 .”H¤ÄÎR·uóJ™æ"y®/#¬äâ)Ük¤’{ÄÐh ñd ‚… )Ú‚@ŠI @ AÑ š^?}\׿úòýÿX¡®À§*…\G“Ñ'A3O_èÿ%êÚþ‹ÿŒl^1üöHHÌà~ (ý9vWßõb¹;ñ…´<[“¢ŠS>(Ìû6!û˯Լ9Hm¨¶$Ý}vÚqï12PfÑ)Ü+_õ0W#hC‡— ŠêþxPvúÑÊ?¢u^zÎæsðë÷ã~¿]oþ‡ŸþøÚù­ñVBÅŸ›þ[î?ô(&ÄòºÞ_õÛ¹e._KÏ™`»½Æ:ªï¬˜ÜÌ@…¬.¬³GÆK´îqÊ $³ÜJ_×Gzåï÷ŽÁ?oƒâDCôxÉ}9çª*'ÝÅŒ?Ëþy¶ÿ‡}SˆhM¿éè~¶wb$AÎeKVŽ94Ö±oÏ5[‘(`ÓËòËZZ—/!µ9(“€²G3zDfìA [ÈãH÷D¡ÁmΊ¹v/%¹æÐ·Ò:‹˜ƒÆ»¶Ùã|’t iÉ©^&,ÄÕçãèzšG=JVtsof¯µÆI>KÆ¡êPù+/‹wžõžåõgi.‡å–Ëù²{áçðY2¡ •°¤´;O¿m—2ÂÊ4›Æ¨M×Àx( ¤«]Šé¼ ;AŸ´»Ú?ÔÂIaº²m;oÕÇÊtŸÑ\:c†¯å#Šy ðB©€ûE.G,Zi¬ÄgR–¡íHeà!í1,V­úRm¦xpƒ}šä}T”½|dñSŒVó­šr': ÔÕô‚ÃÅ´·û¬ËpÜJ F+®#šLæŒÀŠø¢"xê{ð¬O;‚¬éRßïù¼´[ÂÝ¢y»Ãœ.íËVçLV Ã«Ë£ …!¾§7¦æ¸Ó9Cºk£`ÚýÿÌ¿ÍèIï¿êì: ,ÊyCLWõ×îÕlr.*_ÜTÜä°(A«Y£” ~,Ú¹N*¡Å’š1ë¢Ñ™4–2™…ÚÁFàÒ)mh@BÔùX‚âr±Ã"µl0š& ã%±Öì.ýÝd×¢*@ˆ€kjêK+ô;°§ÛŒ_®½–È]•&®RöùòâpçÂÐ&"®>&:++†XSW\ä@ž²ó9¶N/Ûªjøùüúù‡Z';Ü©á•iF _Õ}*W|¿9³ @ŽÚÒK% o”¶³rK%îÄréü•DNd y# ãîü$" $ÉÚî-³íÃã6ºt05C+Þ™xgæ6¦šk_è%¶êF¤0)cÒp‰ˆ}™©ú|ÆÞc÷ "W&Ihš, ˜@P*6Ì9@§¦´Fðb~c#/4´OŠL¢;r¢Ž1(b ¡ ›öÓ2¬Ë 2¡Ю:=&ÖPEÙÕ ßq?‹à õ•5Áb•W´D ˜Lš ò»ÄýŒè¸š»*+Â.jÐxÒçâÂΧNlŒ‰Phlq&ƒìŒ!Pæ> (VZR»kUóIIe%èE+8¦ 2+ØÌˆÀTb `A,h‰Lຂ˜Pœ©qþâp>¼É6þmð­.Šå%«eáEµa#ö…ZG0,°ÁÂw’JˆÑBÔY~ªšÚQâ¥~¬ù1m|©8Ž,¹Ò#û‚@“Ù™eûý ã‚|B“Ï%¶rÒJ-ÍÐÏ>(¸"lòÄaEÒ¢P_ÒQºÝO˜çøA-€^ûï~‰osñw»!ÝŒ­F;‹‹B‚á@%*Z¦¸ŒãØÊ?•~ù½àê=„©±p{ê}èw†)¤ªÉ˜´­NÀˆ½àgs¾6'ÁIbê_ãÅíœÀÂ…‹äb6e¼_†xyäveí“LNB]úNªî·à žH‚ž,–"uÑ'¾Ñ%4ÜqBœ§"<ü¾‘­u \ŒìäíÈ×ï$Ãu hðW¦ñ¾ìéÂOwÂGÃ7;|é›Ó…~CŽ“2 +é¥áI\˜ nwБ×(x)¨…S<¹$~„Å2¸Âà‰XŸ¯ô$F6Gä[z‹^Ôc~lvƒˆÊå¼°äާAÞ©å„IЮeÒ\øÄ:N×pÁ<Ô5ŽÛS=mDó(èTf€ò("Q½Y ^f÷Å0.¢Å€ ÙDôWõÕ²DkDl“vbø8–õ¬^vt…†F™ƒ š#KŽ×ÒÀŽVt® <¤€šbøµ(£3[¢„šñá0#XÄ(`2'‡L‚5jÔщ$ÉÑdIèoXù‰Ø (-C  òè+ú6ÿdA’âZGª87ÚwؘI~Ò„ìºûœcxZ ¦•Ð)Èèúx™–[{éz 4QØ$.Õ¼z Å) ±¡•%7̱iî£ÑŸîšûþóøqçi¸nÙýüº{œÞ?îïƒï7î{â;‹VÚTåù†œs*LËÆÓÆ=m˜B*:âà°"3nž8;´¿èëTr Ž3ZÞF¥ƒŽcêv ÉsO ?V¥²Î²k2 xÓ¸/ÂQj„wŸŸ\ÅÜÉËßoË’6‹):®_ë'q]hÚWõºì~Ï]ÄKÐež¯©–:Í韙$6:ÈÁ\®‚eª|qÑ1 QÚÃì#í¬ö–L)Ûzþ{úæì½õ¼n´NÂJa‰Lõ Q ´–å~Žíèpkd¢J4¨Ä¤{„ÈûpKŠî²øFÈ–+gùAŽ1Ô†{7cç\p?d9í¤ÆÒ”\×£.訧º=Ýû6>I\qÿ|7qoB"zT\×+à‡§™oÙŽ½VçýÌùË,•ãç8çIÔ$«x(ßd¾8QÜ‹“’:ßNwo´^¼>íüœ–“ÍÉN^¬ÉlÀ(Õ›jIXÀ…fÀ&/!Ôtã±[ƒË¤ôJ’ÑÁîðbµLh”s wHqÞf´Žþ)$]±4'•ú…Wd‹QÅ`±azál?sïB+ì¶1»ÌnÚòb™}ëZÈÊY-Ba[$°R7;ï€à‚þãý&›¡—¾ÆaÕFµVrt88 ºå*áŽhÄaT¢ö&"³Á)ò ê À®…°š¾Èï¼Ëy/åõ1a¯ÆQÉŠŠÈ(´-mÐxHWÊżAÇQMJE4ø’oš TØj…±dž{ŸégF:Ôg]( ƒ9Œ¡àw<Ï»Nž¹ª íg–×3àï[Éyy>ì½hÓøÈ ƒ¨l÷­Ö™ð0î2ÎW£åÖ6(i —°mU¨#q‘=Ûq•ô¢(­œ7`õK½Ó9Pû³ÃØdÔ?¿s?¸l|b_·¦*‚6sÙĽ¸Aj®4-Ïáî¥3×þî§ÿË{rßÏn_0ÈÔhÝ8&£[Ê nÕm÷ÓøÇ[|ßE7?;¢vÞ"Xmåñczô·\ß³îÄ·©"_w=Bâû|×ûù¥÷zm_Þxþô¯î|öèÅQ’Â@³Dí, `à—±'ù)ö²/¼ì=su±u‚ñ:ˆDD!ÂÀ&mæåEÎO>yf¿¼ì»ÿa£öëK'øVqà²áÙœ}ÑÇíõ6ðKˆ»‡–·b'ü zR{xï2`ÚT£å£íÜ ˜r\úüÜg†ëµÎ—Æ+69æçË™Ûþ³,àÂÌJ›cEìµ§QRQ[µlG@@.¼'®‚€QŒ‹­æÌzK\7j †ÁŒë±f¬ŽE,eŠ…XØ1Ÿi“ÉT›‚"7OþXÂd1›ž0ŠÍ èÕgpBÉõt3ò@ä/áÔ­`iɤÜxØ{®¥•ü¢GÌ F¬ôâW3zÈÈ7B! +䥜.Ûk¼¤@lª=³Þ˜A¨­ÐÓÉÀf]LRJS"ŠÀÄ $$$ˆÐ†HŠšËýoõ_àÛz»üŸ;&¾_Ó§Z@ ˆf— 5­Kùò·°þñþ·~Ñ~5v[ŽTÔ :-ï«èi¸ íÞ…y<s*nss‰hÃÔÚÞœ~÷yšoÖÚ f¤ÑäPWż¥-‚²‡åÈî‰Á£ ¯M<(VÜH¶#BÏeº;I³ö”ìÒ`ìêÿÓ¿ºœK‚ÌùôÁQ†¾^Ô{VhV𒤂V8è°/à|,'Ï˃Üé¾/Òîj.{!üጵ­¦¯xªÔóàúáßò粃vóêQ©®~K—«Ï–ýTãiFë7ó›Â¹^+ ú<6ßÓ•â}#Ç^ãMkñàø±ΪA[Éñ᪴ºâ‚­„;Ñç=Q–+yÓ` ÒÁ“¢Ÿ©’⟠³=`÷&ÄO¤ÈŸ)&¹wîv—iÑ/‹ç,ž?<2ç3!h[]ý\òuœßvæLÓ Óc?ªÇ¼Ê¦ÏZD†%WìMÐtZºîÝ›’©põHÎ[…"1,ƒûÀø´cw¥/{‹ÁÓÑ“œzçjZ” 'ffϬjé†\*dZª…‡·ÐñL9ýhä¤[ÉÔ+÷OßõàÑÇq/é3趆uu8i·j(IL&±”-´HÎ n6¦:ZçbC€î$“‰{qž~®Tæ–ÄÂ0AS…¥4 :lNܸîbð†9©­•\uDIqvS¯ â“æé“È à]Á­õgÙï—W㺂@åwÚ íSû¡4‹ÎZ'Æq3•Ç ×EA –~a=fYZØ;]Kª2ÑÌ=«t,s=²+-uÕV-D+ |k\bV‘GLŠ•Ýú&å`)·jû€kz²[ º|–_ãjð~‹j¥ò×+GLgý¿¨ÍÑ'lTA+t Õq6 ÜAmPrRã½´QñD¨´\=P˜Ùh.íè°c¤$Œ1VB¬”ZòÅgå’ZtFz2Ö|˜€r=¶;ÛæI…ܼ{ÙÙH¹Ïb¡+•…JŒèv©¨W-1°‰qrÞîð;°Â±O’@š®cÄv¦'š‚Žæbp{øPüªž¶¬´£8ðH:ÄÃ@[’¦:Cì>rMD¤`&Û[µîÕLW€µœÔî™nÛÖ.ëV…DÔ•Îï 礱lN67sgaþž^Ù¦ì5žÀæëC|*s/E¤+è²¶üŠ,r‹§Ä=w@Š%Τ ‘ÕÀKM$s àâ h8J´Þœ@L¬·ú•ì¸/è;{Ò“j®ë‚9P2nÊñ<rÎP+c1½)%ž}¹i©F~:ËÐϲßkrº•\6Úµ6—ØÇJ¯ÑWº‡±åu=]9©•Ôn­h3h—þWpKQlÞåìl¹–²Ôh•„Dª!Öœ5 üÎð{ݵØÈ7Ó€œýt ’±Œ2”&Ý¿ ½SÝt>7ê§EÒ“¢|JérÚŸÕŠ˜}aÕãµÕ·Ã塳݃0禧)òo½k~ßH>@oX%…FО_<^Rø{‘ÜÅNzE– €dÑ3;à»›ÛÑž¹D?ñ¯ Ù¿ˆ~—ž‘QN”^‰›ûžØçHüoÌ’{û]‰ì`?iî¿çÜ¡=Ç“ÞÃ/‰¶a½ºÎ7Äq–x!ØÜ;¬¥‘’¬íE¶n1 [WŸ›f¢t…Ü ¸ÂŽò+Ôþ§9wEsL?¥1¤›JDj ŒæM#ɤ !šî\C…úPVqìÕw1ÜŠZî.Â\™Ç¢Žð<Ë©z¡…;'ñHYl_4(°¬¦8èú(©K(Çrɳi_²n)…¤RhÐø' “B €$Ðfþ €(ÃRªI¥öµ€Á†ÖšŽ<;¬ˆ°@.ø:]‹6ŸÒLåétQIÔÓ3 Ï ÐnY]ÀÌ6Ñr êØ›uƒ«`G2)ébŠJμŽJLÆmÂçbyúIÅf­È`n š#Fs„‚»N@£úam¢#ý'v…€ŽÉØf˜‡éA“!Ö7)sz’#ƒ}®œËð.h%@cÐ9'oÂ+v¿c–÷×'<Þˆþ[ø=æ÷×Ã÷9÷Ñùíï÷-3¿Ì_Žç‹;Ó×Ϩà­'¹×ÁŒJËÄæI^mà$™Qo,÷’íïÿ™ÿ]ùGk/lÎ6=» ¥ÐÊëU8RÎz¢¨±°‹®ºVPÄ”ÌFn’mIVÇþÈo¢'<‚Zë·^$º…#ÅŸ¾ZÏçt‹ŒÂ8g³†°–ð,È>bmµ/›2Åb¹Ï™Ÿ—Tï¾;¶KU)Ð-õqÌ\ì6„l?#Þ®ùO²öêf¦8œŸâ$šß3”Ø5Ï—Ö– ^ÃH†5Óe§R¸ âÔ>3FáÓtÝ‹ kî¨_P|²`#IëÅJ’ô¤âd¹ºZœ?=‹Óöém!ÅãÐPýu7(¸#½bˆÖô)ýF'›ÿ<&ÏåÖ.œã|p—»;Ê”ð#X%2ÕrŸº˜S( Ë-1¸cr?º×ùsœÏðly"×'TÁ;R­£"ñ¸q} 3² >£nì–åZÖGÌ´F1æ‚]Õ¥qõBIwÅ^ÐO­Þøk…e*P ÄÓZ¢—3 è‹–xÃrÚM‰öXGnÎ˶ÁiU~J“.à‰¸˜ ½á'c4̻şÕ/â8>JD_P‚ç5óœ„DØ¿×þ³'›S~^Âï&Q0 VW%µJ Šåoýgq?Ý;áÁžæ™Ð¯ÄNL•Õ¼žÅo„VælPÈERm­ð×AŠ„q2¥xȰÚQk%`YØÎ®«ò;íG‡4_Ù6³tÿ¼ÌÙ:M_tß!>OlgÝåòÎ=h·œg'gæþ˜ûz›÷ëçƒ~nãÙe¢þù= ¦îÔ>£Æk6оà—}ŽöÜÿ|ÂKñ¶ÙDÜ9½Ð1!ZÇ:Oè6擌NJVÞ<“Tèí’|@*s±†=EôÜèò Š%ìÉ ˜Ûhö°÷xV3må qøíùûñø/göû»ýœš}f—û–ëÜ+¬È°jkØö^ËÒnqÖßS>£}ñht9g Ðô­t.Wï…ß¼qš½þöæWî MÍs%i9ë^û¢§BZxùÌ*º“AŒjÃÒc$PKhP¶dIëx% 20ÃZqÅ\J#  ^­þj_Cý-ô|v9wh⣘aPP(É2ñÿØ1›r• +“î@ÌÇ4™“Þ­kl‹ž¶Ùd?%ê©é H•àœ5“a¹„Kÿ5ø ù¥ùûQ[M¯f¡Wìb×°3»FÙ HЍ‘tûb'zÿéÂó߸CnɈ%`qÔ[ YAÁéé %ãKÿÿ?Gá ˆ†a‹Ê!}µó_üãÿb^o~ÿrìûÛ÷ö~¿_^3òÌKMÚb45¸UÃ(Úu§dý a½Ö*@k3_š1(QŒ´f«ÚZE$,N-3Ë }Ð~ú%¾ý\•÷÷ÿ³¾gy byf¥Žõ4é0„·‡:#ýL¾ß¢¯‘üÒÍR#l9eC × ¤åjqÀjæú¿ç=sÃß+º4‰+ v!@WB†ôãâ8Ò‰húkSËÆdÏ(Ñb#¼Î6CÉeäc‰5Á™ è¥v-!ÆA«§–ƒÙÄq’Ù¦ïØƒœ-Jg'*‘iDü‡¶y^rä¨PB8M(Á B.z6@œUÁ³¸ŽHNsÄ+}(0âa Ít£Ÿ-ñ ï;< ú;åbò‚m¶@–¸FdÊ— ÖD:ô•´Îò8K§ ñ‚GjnÍ,©BF¶’ €Ð,Ÿßïoo°€RK¡4$ðúù¯ ïoí5 áE™FùÊ„áN'üø3ýû¿0¾û¹o¯¹õä ©¶WŒ7ÔúV‹~»·(Ôn޳ æE%Óz`Ÿ,‰hv¦¹D¢åmt›šG¯ž<ÑZÂ#:S~ÐT¡Ê½”)àc€z+W:F6&½¿§áBíZzaøt 3ó—®ù¹É!ØDd¥T¸üþ˜|gøºy¯„.ïýÞ÷S~Ô›RIaBY(ŠyTÖçÿóüÏOåðäëš=ÓëA=éßpø±yÒí5“5EóªñZ±Â¼/¸-?®ÔâM_ÎÛÙó‘é ›Ãð<ãž4sÛ××¢~irî7tVp.LÐlìLt%-L?_íLÙ:üÊ^áûÓÌö¯xüÔ_}ÏÛ)Ûž6k5×j‚2À_yäéÏš¿T >ú³h«}?»î”¾\@‰<Çš'ïîßÞ?óÏksÜ6ýeüµÕsž»Ï+Yƒv2Ah3)ÇeŠr‰C‘”ÆVDíÛ冒(øÖëÚÚžBÅ6áŠ1#qFÂÏÛçÍÙñYjt„í+¡ÎZ¬Ibã-Ýu*³-£n#:'{}ù{OëÇ–uÏqÔV¼=½÷®ó‰d‡Ã{dYz¯µó}ü8\šÛ—äÌ50Ð)X;Q(€ lDzì»z®óP—޵׋ciÙûjÜ[‘Þ¬‹2XqÀ¤ ªùLÞY}Σž7¯c–”Ùå‘…I'‘†v°% ƒÀE0*Cƒ!f[¾Š P[˜@[)Þ!eÑB´¤T±òUð`:l†i&Þ}íŸGÑb–Ñ äØ@jÝœƒTIŒ²Ê—Œ$ïÌ#Ê;Ø0:Øï¬`Ì(q†ŸQ0_³@í8CíxÆ=·/ëƒï#àîVo-DØu³Å˜fÑ……tîì´HŒEªO$Z"»jðLùyNgŠƒÝäžH<1g ìá6eÿyÑ·¯¿d 'f|;¼se-SFÅ4ª)(íHnƧà¡1q½,D\A’s/< ,&S]naj(X·BHÒ1Æa êP£aÃ$þ¾[cÒÊ^v¥"‚÷u =4õ»ÌÓzv®Úª*o%Ïçð}áR@ ti á÷Q÷pÒœŽÌQo=AÆeT–üÊi\X¬ÑT]ŰYTuÒòb܆^ Cv±bwÃ=@kÙƒ¬ÃDƒo‹ATûf>ü>x×írËZ¯£H9:ukRßp³ûdχúÔùo~¦h]×»†>ž9\õoÜ{”§B8»t¦Ü¿\8bU„uœhÜJÓ{Й/ƒHv~_#Ÿ?úúµË¹þMÞxço4¥ª[¿³ÚF<²Úq"™à¥Œ¸jÐ]iÿþëÏ]§K V Õ$pÏøòwÇ ²rKÙš Ð%¯kÛ᳜"œ%‰üÆZ ÛA‡G¨I×vR“æå³®)˜sëœAFz:+k5Wa¯¬V÷9Ö8L¨ƒ2^ ˜Ñ‹$PÔBX0qÖvݺÕs¢m«&wÏ/Ué4@ÔʵZjÂJtN7Ç\5mq2Ø“[g’s|õKøT¦^ŽT®Åµk=¥ˆÆQ4TÛ7 Àc…”“îªh.ã&€Íò”›iÓ±¬6|7«ùoB”ÇäꋽŽzR—Ÿpàsüеx–WÚDpʺz¦—´4ý’/´!÷1Û[Á:Þ8–$‰l¡Èû´­rßàÅlñ˜"-ÝAÑÂ*Ú"[w®NrÕ?y2éwsÀj¤^2 Ÿ€FМ[$PÇNüù žVöãðwLÃÿNkV²ä}'9#–:¾Ó“Ä»4^0¡µrŒ\‹Ø‰|K6z@*(P#|-ïâÊ€åÙ½¨ÁxNÿw0ÓÒð•¨×ávÑmA; ¢a²}ÅBeùÛÈb ºUh“T«0ÀÖmÄCqçõ§l‡$'½&‰¶æb­{ÙÎVˆM¸`O¶7rÙ[¯Ê”‹×¢À¦ª fUj=fFÂ[Rhia8Äiëtä¶2¼3ö«Rßm> õ‡£ÇRd€¶ÁªdW´™­n€xL;æ¹Z¬s€efÈÜ‚c2[!Ë 9hü\6Ÿy‚¡pO3`s|¦%?$a8*50jÑB´C‰ÓU=Ò“nôL1ì4±$jsLhc!vÆâg$¥Â{îµu¦-Ä$b¥0hg&6ïϧc¼LŸü°_óRœÅ¹MÅç4 ¢°ƒ9`>¿i¨ü"ÑÇ:$×Aì<˜eL)"÷%eh¦D™z¯åé F?]I0Æ!&µ)ðq>G 0“:2!bT•zÒ>)v¬ ÊÔg/íÓ¿ð21ÊúÛô‚ŽKøudîðÀÒ—Y#Ø9©Ñí`8r7|3-Ë_ðƒ¯*¹èÆÙýGçÿ€—2¡/ålÔeCÁ%¡Y¸½Ù¹f)V‚ÀÆð( Û¶@ ¡Ñ0”¹· œ§…|_•ÅŒ††÷Ãbó ëƒ~œ)‚ªó‡<§±†;º0§ñ4Z7h5‘¡Š‡Œ§ƒ‘.’ Óâ²àU7«—JìLV–EÈ8?–îß>¯Ú¹>ÝÙm¾ÁãxLÛL W‡5fÔo^ÔD‘C ýAF“. „yEÔFaÂu†Ï¬UjH߀uùDLòI†±çLH1哚*ü¬ØZ+—[Уfh&o§¸ñ›¤ðª 0§{–E§…ÁùŒÇS`ù®îy›í&‚¤ذcH@³îÇ‘sJÀ¶¨Öƒ=Z¨¼’›T™ äÈþ÷ï÷ECÜÚžfJBêpÁ§mG…’Ñ÷±JKÓ.YD+R\‚#‰Øg&Vû Ì:;ÿ>Â_‚{­ð½ˆw;G76·Ug¹ ‹˺ټÁh6ɧˆkJWßA¦ .Â:Ëåî+¸á=a£Õqƒ·úf‰Þâ ¼º8Cê:¯+Iô)–dÖ¼ÐóÝcIJßðOÿTáN±î`”\VU« œ4$´>e3 ¹tMT䌆=ý&!#Å#A0Òæ:R ”&: ÅŒBÜ‹àæZèGÀ²]G¦Õ4T¢"l¨ˆ¡œCÁäŒBJéö±/GÆ^9Æ;5³î÷Kn=pÏZÌs‡ð®äz¦nýù¥ý>™–{tÃqÌÛ@àuÞ'Ã<"§ß›u·ö¼Ñó1™€£ÒGäÔÚA¨A²ŽmhN¦\¤û Ê­™ j[@\ïÅnô.)'ý¡œëÙö>ï8?˜SSšä&C·ÜªUÃõ)}GNN^Áý¿½gîñ;ÃËìûvßÄ}¤=ï ¾wÇͽK·ÒD•”a =\™|t¸y!Z®'K¦çÚ6i^ª/Æ‘‘bd/È‘›@w*#[iª‰iÈE™0Α0fTYdhâ-¹d”Zi€ˆŒ\È@ë¬DÐýßJe}å=w¬Kfß#ç`¨v-»xz¸®‚¾»,h-¡úQy“³Í=C‚.v7ìZåxÌŠö&aËÌ6/cjÅ;¢GÔõ>tƒè"Àb: ! îêk&Ò‰²)A¤wÏרç&?^z~±Ï‡›`ãÔµhÅ«U)2k¸ä_ãaD1?ó³ò³O[Aá ®-?Û¶_íó±ùP÷-ÿw_îBâUŽ¢‰`«iszŸÎRv ä“eqWƒÔŽ¡hÆÛ"Q¶L#IÀ›.SšôR iÌÒŸöFUÜZ¯Ïöæã§=ooŠ©á|ß§îõ5µ?F|±{´ºU¹u¸Ñ>ØÃ–#a «bb‹UùÒÂtûº÷quäÉoªÂR@îtÊ"Ž(I¯ö$Á æ½:)PÃI4.þ"Q¦]MI©#]©=1€„)‚M‹>ÉÝÀ^«XV‡l€,ÆéT2¼‡s¾{glÂMßÌŒAœ x€@±5dfíÐ8°z P ËNæ+×úZ#Á™.bùµêè§û-Ú¼–dÀ©@ꉛ'–=C»/~Žâß#Ëê¡IÊ®&Øë|.ÊâB(0ÀbÝÒAbáÚ´ŽHjÒL 3„ÀFmE!ø‰íëï¯×újàždG×ú¹`~{ýw›f5®Wÿ}KѾŠÔ,úýoOêåáºÝêx &ç0oX[¦]“38h"@ÊJJkžo† ë’‘˜˜ÒYq~)Ím¨á„2t‡e+Ym5APä¦ë¦ó‰°öGìÀ!ÒÄ‘lÃ6Ö•ì *™5H%ÿu=ÿ )smñûõØÆž®TæÎZHÀt& ­  tYR§ï;ï__Ùç[ZžÒ>3ggÝ.ÖØXj“¬!böL\Ü­8¬9¬øü¦öþñ7ׯ¢Ïè/æÛÌÞ¼i"(x´=¦€°—ç\¥h³"#´ñò ?ýÁm­©Ž&©î—²õœ¥ïz»µáÂþä;–~µúÎúÅIìã£sKéeÏÝóü÷Úʺ?ïû0ä¤>kÞ·9á{«þvÂ!¾Æ{ÿólü½áVpÒ1Õ¡a%ýzñùt¹e¶Ô—¤ƒâ&ÄAÖCNðeŽöÙ‘í kR›wBy÷Õ»¼ ¸,dH±:°Q„hpxäé£mŸ]ÌFèÁ óá]ÍÝÇÇŒ÷î“ýèÝnrY;#ì­Ïžïäéß Ó¶PÕ\:ìÇè½á## X«8±’\ºmf6¸Õ±F«â¦Œ[xßò8¬iòYöPÍôˆEPØ)™îÛ¿Ç<]“y—‡89Åp©6éhزë@ƒ¡t±) 0G%…8 ¬: &%Ø_9U2iK ,h‰vIÍÇYÎZ­-]95O:™è9îFã£QGÅ¥VØNÄÐ Žûà\Z£Ž98*›…¡£@ɃÍþ"uÿÚQn«Ò8îüšEDJXê¬tE—GŽq«ú,{1û°­t C¸„ŒzàvÊÒ`Èkey)Ø8å©-Ü‹¦ç‰&‹#`vœ…KQ—† †¿xö9w¯Y¿–¯/ëé­EX€ãªq¤ˆ ‰Î¦×ᩱ\õsõ›5ÙNÁhkÑÕF±˜ŽÓûÚNZjˆeÈÄ@@Ê R‹À Ù¢6Œ5¥¡eYèr²v¯t™o]?ŽRÙQ¿÷óô]70” à—eøü(>{€P±5 4 T7D?¿Ã.²O9¡=‰fº¯×W›–ªTã]ø{ñ-2Lpˆ‚3B¾BÑ­ñ 2ãòŒÑ i0L íÒBÝuZNIJ“’ß .·à\€!ÌXƒ®oìQ“$_çgø4€¹nmÉr–ôÑîÞ\É®DŠŸfCîd5W†0KÚŒU‡ ¾¤ýv)Ó’àk3Iúê>N°N®üÓ\{ÍÂì]+½ã {º È7öØc¢Nt<¯ìeò€3“@øX(ëÅuN› QX¶«Û?ƒCF˜_(וF¸èR^.£½'ÍÜ î/‘ŸNg¶à`ín¼fa¬PË2q^ h·¯9›tÍíòÄEN  É@€¨ Ø YyMlìdÁIð% ´-º¨,`UcZá.^ ÂjižÒaÝi¢$~rbí™U‡Ðoa„ŸÁ r€NGÄy¼Ê2—Å7qÓjlDF·‹œ,Úl `¹`S€`'#·ÐÃÛDz‹t`V0“ùÖ¾ñ °kÖ÷%6×Àã›îs”bpÛ } Ÿ=YðÛGpæ—8…6Éõ̹¤ózt»|˶†è~“ÝHr²Ô„NŽÊ¦8¥X®ÝÖ®ƒˆ¸à" ¢Àº‰~þ2Ó¢>VC/8†à'y@⵸:½iˆôݲÛÐC9sÓ²ê)–æT ™¼éˆcì " ØoµÎTÒŸàoÆIK ï]<ë~«ß)иf!ï»Ö²qÙãÑÖ!3bh°e.׿çôC¼ ‹: á¾ë0>ˆâZG÷fÖÜ͵æ|ÂËN^1Þ¤/³#œÔî»ØL‹ëFÿV³õ—Xçˆ#a Öt=º˜\òÌ0Bgž5S%ô]!%=R <”ö ídP Jg¾ùîÒó¡O¢ÛÞ5Jηpu :øG3æÐ ì#ö:ÀJ…YÃÖ@ëÇ|wšj%![Z¡5àeíú-n|sKkv0ðàÀ¥u¨õs§ûJæÇnE£±¥,+º‡M t±Õ ”zœt­7Ò%¸„ª®}ÒЂ\v9Yb«@îÀ2uÓ>lǪCŶí¥ÒºÙoŸX2Nrµ=jɾ*ÕzFAµÊh¢Ž}„™bˆ¸’¬l!¥œX5”`pÔh¤ÜŸ DPÈà1p ŽçùŽ,hB†-°US©FB=9¹7ÈÆþ|÷þcv@Í·’7”8/üiø©zKp;óUT ýeŠîÂ.bˆC€êè ëþñ÷åôF‚jÅLï–ÿ²—ÿ¨ë±2œȨJk*ní1ËJñDÏ©kTH:*0 ²¡)f&W÷,Tº3;ógÊ`cêâè{´µ¸Ç:¿Þ‹—ŸÏ,Ïj^Ÿ£ùk¹¦à±î@³¹[HÝ1¨Œì!Ӯ܎N…´Á7ƒW¬áêc¹#[=üÃUÈÍG”³]`ž¯<ݯtž÷Ÿúèÿò‰ærîg³+ „3 ¬·£„ŸcP¹Eåf6J+ZqY;@®{`éÁ¡¡Tœ–£y­Ù¾ÕJÀN9bK´…’ó#GIV8]….Èç-·PÑ ‚rx12–H_ûÆyzsN‡öÏñ†k¯•3Nòr¬£é·Ã·¿Î2öé#E„Õ9¨á1±¨>Ëì?Ï3üèá£×.-D[Y÷ݸ—î©weFTQv’Úft iÇe(1XòJvÁªh5!p»3^Þó¯ÃÈ"Úê®Ê­îâl0І,~O»O´¸âY`Ãv0îZF¡§žõ£¤í‡Còb¸‘ZøvùQtÜ ¨¹þküd¸×Òϸ­] ¡kê+êbšùüáÔy^<ÁÍ?Ëþƒ ¸e3.ï t WhМN—jš„¤# Õ‡7Ö YÀÛð£©Á®¹dÎ J1.~Y…]V –å½ Èì¶FÈ‚àlOö†"pÄ0:à@R 0:tD7e£xÖþåU~d|g½kx©AE~º)yW)ys}¯Ÿæ¥æ{6ÅIë3ã}ªG¼& 1O;]~¬ì ò÷Ìz3Ÿ‚'ãElU`¾®ócW‰v€M,c‘Y££º\cˆç0Së€L9³Ñ™m2Éñå”J ®‘>O÷ þ–íÎ÷aÔR-Z/1L6°ß,›Ûho—cØ,ÎõÞ=À{øÛLjklj©(}LJH¦þ’/=Í3‚¥¦šñ"w9àd"áÏÏ'?´rRN`N N]DæZ8kÜÀb3r.À±Ù`kFŒÊLb2G81Ñ¢jQIE©Š"5À’¨Vº"rÂ+—„œ'ääT¦Ü2ÖýúôRôÊU.ƒÂ˜´“Ò´½yûŸEwn:¾LÎ÷À;áµÕmZÊ^3l6õKß“l·0×0V+kVèö_*Sˆ@õ` M|¤EÈR>œ+@voš™ŠO,þ`ýÙ~É&ä¯ÿMùuñoÞÅÄÑ XÚc°€93ˆ$›Œ ÿ¡P$fRå[b®p‚ü3ÝÏ÷ó‡àßï÷ÿ›Û©;( ,B§^…æšt Ù4pQ%å´¬/«S±°ÐÅ{º³ëˆ–¦#*&Ð"^Q”;â$©EÛ©*£xu¯ï“ó~¢óâûxöª«çããß(ï·¯¯ÛÖ}8G‹³ïyT¹î«ë,ɸ%¯¦6†ú’âÞM™”«úM³­;€H¸4VH0I»¨¤"„š ÒP… Ã%@œ•ÙíIˆPd•T‹0LœËÙJ» ÛÆS(ìðq¹'â.¦zsf|glŒÉ>ùaíA¤8ÀXQÔ$ ‡ùˆIÔ “\V ²gíÙú“@Ád;¨Ç•š™Oó‘Ù¸ò^ " ª‚$×üÔþô;™Ð6°ñoâÄ"cÐJ•η‡7rz:&VÝÐ:® ò¶tö TÎF'¶›@¦SÎLåþBmE¿ÌØ\”Kp¹ì»šñÂ6ª_9wÕ¡¨É¼Ï®ë‡y~²Ö:öŸßwÏ“C ‘™±R¬ ˜½Ív;ˆUÀ>¸{U¯ª\À(6×­àBZFˆó êaÁ­ˆÅ¨¡Ñ@¶'«t*oEW4¶ãhaS¸—£ ”ê Ž­ËÕ%æ 6‰÷)–ŒKU1.ê]Э¤Âµß­ÜU‡Ûᤴ8¯wk¡&îÝ4¨¢ ïׄª0 ©°,0¶¢ŽÜwÄ9šÔ³F<ïÐd 2VÅJNÒ¶×%îÆ\Ó'®ûŸ÷ÛÛ_üØö×¹j7‹ÍÃIÙp…óò7¯_7¼ !Oy»‚ÍÔ¿ÀS#±Õ/?«“fÿW÷¯Îªîl_…2ËÙw˜:ÿŒ>¹÷€©CfÙÔ|t´êÆóÇ}¾ÆË9¬[K=ùX‹p6ï?ðD2/Þ1/+ ñ MÁ’[‰ÅðjîYfBœ¦•B²°o½ø½ÑÏn,掠9¡Ý Ád˜¶c+Žï0.ÑôÑD<šx†½ ¼" DŠf{¾ŸŽgð\‰b¦ÚªÍQì,b }ÔiÉ „?YpV ±jëå±ÓîµðuÉWãm4„¤”…‡Ò€5Ù»–N"G »ê±A£yÇ&ûК4 ÃË˲BÙ!kºÛ¿ßbð¯ÂâËÇGégäŸ÷Å[蓇+'R3Ërã&á”ÓM.cè`Ôíwà(°£G‡%¾ƒìhÏaèllˆ3›Á@k’¹]­Ô ÙP›ð mö&—ƒJǶUe &j&`rw,“µºfÀˆ$gæ2åpQƒN5rHm«ß·ëò]ô–ز)4`éžfpW ]µôíŸç­×í››–x«¿Ò‡î .©šð2Ý´´bxMW,ËÄdi÷d"œ¹ªd=ÃØ<1÷q¡Fÿ¤•¦ÍC7Ÿy.޳‘¸‚¦ûó8Þk p.tö‡qÄŒ"ä–l#·jÇ0š&x ÐZHà\sÛ–… <›6‹ Í(|"*œ±&ê`TJ†¨p™{„Ÿq”{õbŊú¤ m%ApM"†¹D=,ÅÜhƽë 5šB÷wmWÅ­þg: ²,d1ôŸ,$ð¦k`³TáÈNÄ„hàÒc·YÓT+u]=N:$iSJö'‚žµªE|‚Ž9ã”|•U8tR@rœÕÃNÙaˆÅÞÝWTd©=z6ˆ4Ì®Ñ]LKšÏ1(c<°yŸ¯ÿTáÁÁ$e"#ûº2ؘ. HTR6 Ó½%•'ÔÑ‹¬J¤,Ý~å……’%ÔᔓÉMKdŸ£)JÏҡ߄Ȧy[º;Z_òËþ²æÔ‚ËÙ´X![wðñøòËKz·¾cvìjï̆û(ºÖY|óD¤’¨…·Ï¶˜i?ÆcqP%BÁ\Ò˜îRž_Að÷á ÿ‰]àÅ]ï²;¿#” ˆ­¼Š~˜· ÊfË]‘xöîX‚Œà׉Îô¥5ts‰íåN˽7\34Ñ®Á¹ "Û`°Ñ4šº62»'|s:£kŸPù¯ì˜N¢ ÞfRiÂÉtxåÁ A€¡ß’nÀ7'Ó~£p\‹I/óùtڳ˞œŒäÙ€›7ω –‘wdÚ“¡³g›±µ:†0@è8‹pÐ ` oÖõ›‹}þ¶ûŽŸÖóçÌóæã÷Ÿ JÏóíëßtÎ*ß:âvè<3|ó’Ú¶ÃÌŸÍ.¡,êÓš_2à\†ßè%‘Ø,H¸¬-?ïx!wÝ%OŠ£)#tYeÊ%"€A¤Ð·ÔZ/€;IÊÑ—”‘É’1ñÓKÛ¦^6Ù§Þ1Ë\ÍéÙͳ’Üx®Ï-s}=ç‘×c.¸)žÿCJ1„·VçS~»¿ò?-½¢+‰õÊÊëIàå$”X`uÁ½²Ä bÔ¨Ge ‡C Œµ Võñ2°lÄpôh€PÌ.©‚žÌ”¢Q=9›šyf8"fÉ%Ô[„X(ŽÁQ¢ÃÀišð¼$ À£ëgݾsÄâØ Pxžs1Í.ÆËü;{vÏqþäð‡¯E_F!sjŸ<È+¿œq„Þ PÚèR–™Èè…Š{ÌcÃ}5›Øx›åáƒ\°N£WaZÖ#Ã’P˜©eÏïùêö¡¿Çý7뻩ŸÂ•K¹‘¤RW<Ìšw]/ÅÐÂöïþ=þ˜/è¶êgx¿sã€gÎÁ|Þú /ÊY]ÜÝ`ds^zÔ ÍÍX© [ƈ’†žŽ55¬3Ð,€K¬Œ¨€(­a_¦g¹š¼®Éjä¹ô>¢ úæâ´A|¤X(çA˜ù7ñü“wþ.˜Ýòë—,°È骢›]À>>’ôaÖeö:}”%»Âüp}Ÿ‚ϘLõ9_sü‰7þµk 'f6\ýÝó[^ÊWýÈØsç'-X9GúUTkÙü¼ÙÃRˆ ØôÄú8g2ßóèÛ2ÙFt>„ ß+nzC&H§I.Ä R؉´ƒ%%\¤õÑ€³"ïÙWEi" 1cÚ,N”怖xÀ« 3 4–­A»b>Ùc!'éÀLAT3Št“nþú ~›]•æbfNˆd©M©ž3Ö„¤âÜõ¸“¤0•J ÂŽÕ“D{+u†[ˆäEƒ(C˜6ig…~·Ž÷T#4…ü½gí`ßæw|_düqѲ–*Ä !üFòÛ]±ï:RšŠE4"¢ö½tG¯ÓíT .×Á:á^CLŸïý;AE1H¢Í‘•ܪ›Ÿ% ÄDüò0ñZþÙ³ºE°#wãz°àddI°tà(±[ 4"Ìéó0 'CdK˜À˜@†É7Xm?¬0cÙ^΃'Ñ:s=¡NóNå1hØæžÏËý¡É×hýÇ@2>9çºÏ˜'ggö÷—ëþËÓó·'¾zý\ç'KædNʪàac,—ãÚ$ûmWôþܹš~~97{Íkdz`[JziyE"¬ÅHE²joýÕâ´ËLm°þâdͶ{̶p:NcPc®,Óñ}@‰ ŸN~võ‰Î³ã€¸T°Ÿã~¼»ÂjOËó`ç=Ú¬p=®‚+‚<>ô°§Ã5•îd¦ü./ýÌÄPw@^:Ü»3Üìœm̦C¬CŒ;Ø%Åã5¹K]CÓ kÂkðßr56u—|'¹ÅNgÏØSc|b%l ©b"/HDkÕôC\$ Q· QïJ­Ù uúñÝþžc^ø>5®(ïóYžÿ-v8Á Z$i9*Š“stvˆú Fó`K½›Ñaï¼üøw/ÿèùÓ¿†}¥Ô‹¢³Í"D˜« ‘A‰K+!‘ ¢2‹èk97zZaÐçÎ\•„RO¥ ¢+UÙ´ÙÓ}f¸·­*ÚóÀyžòx1ëà$ÿT÷_õ7Gó\›tÈ­I:ŽŸ1®#˜(wÚ¥rD¤Õ½QºòìJ[Êš¸Ó½ÙO¥Š!–f5 ˜ˆ…²d m°‘Ï(Kª”ªoÔŽ!2 b#+àXzMu§F:nO:ÆM¾ã·TÇM£Èo—ô úä”Eø¦€Â=KêXŒ 1$ñ*s¦ÊT¢Ó}눴&‘ç •³‰x–•s´QXu da/ú®ŸA‚é‹ BB'T áV+íêÌwœÍE®ÄGi„ƒMÚà”`EŒE{ÈOãAö—ÿ‡éããoÿÝÿÉÒäljÇýÆÙu>¹(ói ðæz”?üå<ëÛ÷íö²vP«$ÒjiÉ8Ý‘£f™“6 à çpD¹å$ŒÄÚ t°i`žf3Òã>×Îî3R¯/?+¸ª òxÄ%shR¶ƒëÓI ßèx;€dw%šÈLÒ#(©ˆá‹;‰¬Áiž—œ[KèÞ©ïÅ3Dïw¬E¸‘5$•¼°ÏÇßß©Ê!êñ~ã° `H”“&¬H'@¡íèY1tð =Óô†ÒS5 ÐN€Ëã_ë(­'Ç$a|ÞinÇîŽ6þÆñ<ÿ=VÿÎÊÛOϨòضe×¶z¹!=LÀy CI4ˆÆ) ‰ý5ƶú%º‹+¡V4xœÅiénWÅO=ä!»dgû¬f´Ë-tk{…ËåíÜìãÞu®)¡Á34fš!<çÍŒ&ù)ßÖasÆÐ¼Üx4'¢‰¾ÂÇ‹£@ÏãÛM1ÒÊ Ûí¹]zïëús»³_>¥OÓýêNÓtqŸ¦uƒŠ‚ûäéma=*ñÞí_ŒÅ²¨€J²Yk¾ ¸¸^R÷¸=9¯¦iK«Ë˜ðëW2oZC?·™v°Ü §€jNÀBáðŽ™b©Tª©aè7—†B“zóÐ ®Š#¤7GÐ3¥/Ù—ß7XL6ïö§5¬|d*îý|~¯þU|òÿø›xPüD«c’»ËS6`^BÈJB›"R7í°3ö–Þ=Ù“ç~¢‡6Ͳ“lE µ§v¹s°d¦]m­eÆQ¼JÕ=>n!•ÀЀ3+óÒóšeé¨àñ°)×h³kÚËÌPË*9N]-Ø…ð ëtWæ)ÿÙü–®ëI8‘E %žËYrTÏFí-¢ëùz H4H,./ʺ\f&¯½Už-[v ÷È:¥³ô ÌÑ3Ö´=«yÉêEí„kÇo«~‘#2N¯¹ÐG@5oÔ$E- ç®E¶Ls©µ@ÊÜeÝÖ¾‘o—LÇI—îSŸ²c_;Ñmh®(ÜQªÐ˜ÌºsPg´èV*Ma-½¸¥Üçºétïš’Põû¶Ëu`‡Îð!E—rµÞ-m¤iÔ3‰@wmÕ˜Eî€Æ:"*Ûʨ¼Ä+ïãždkqXÍq¼3-€áÓÂÇ®-<àH‰‘€&ô¥Úl0´""¼"þÒ·ÐèÃuá´püyÐm@:¯Ñu.²wzev쇨\—zÎ4ðé>z<ÅÌ>1'Ã!íbF~À×qqÁ³¹g\|½PI·ãp¤‹2ÂGư•o}«çœ®ýg­/uÉ´.e­ZÙ‡~éŠo:;RY,öƒ„ng¤èläèmtG;W]ÄÛaHM{¢¬;C_X×þuËœ˜ÍL ^•[`ÎS÷È‚Æm¶ôl }žVÎ r*Î3ÚÁŠÿªùïù5ÿÝÝlî¯ã=/ÝhËT7 ŸšÛû®_Ð^Ñ·k“ÁCÔ… `™H«Êl$°¯ôVï3íšßhr?NLõ¥ÐÎ',Ðל἟×÷ï#ÿLñ6îý=«Dv¦/”<5ù޲„‘r¤—uXú`°Ÿ¯rº}­mùzn˜ì„@ðL"‘ ¬!BÝÁ~9ÍF ƒZä i¸ä'š>;ˆšSÔ$ã-§郘XG†!oïׯßýê§µß^7Lù¡‰Œ†×xÀøE²Œ "ƒaâ ñ¢÷&UÐø{âg@ŽÁs'IDJGÒ ²PHŽˆåÓ—Ñ4®ßÈ_‚z|b³µ^À(Úâ xƱÉUÒHoÅ@M8 Î4XªÏدéå%ÐB•F(µÓ :‘Öq¤ô â 4YäaÉà0œñ\KÅâ  `PÉDpõ0âà@ ˆ€+ääd•´¬™;ÊIk¢lƒ—ÏLèx§?ÔÔbZÊTó8 Ñ.qƒ?¿#÷ë„ð’øMä<ß~þýï?í—SŽx„ DÔ}oÎüNëÌ8 cÖ•’êêícYì!Ä Bâð,~÷Õ^ÆŸË„Ü7´ê81ƒài&¨ß̯VèGHAjåf<ß;{’ÓLư=€ÍjxCv>®§Áì,ûŽ 2üÇéÿs쾩hîîÞ?‚‡/íÙ¦Iê߬ÿü95Éfá"{9KM¦¦K© µ<ÉW¸qin¸´h€Š-鮩4¶‰¦QR‰å«âï‡â# ÚóSçÅ~{Eþó•tUW1§ööqöÎcþL<”×× ï¯Ôr¬û@ÿÖÖ.}¾‰ç‰Ø´Vä`oùúo‰³«Î4_ƒü†+uð1÷YfŸ®e½V×óšô–»_ýä?åÛÇ¿ï2ísx³Ó))Šœ¨¯"£='W½ÐIl™F2f)‘×m¸ÁFŠë=ÀD¢(ªÐšEGX 3—mn!¥!±z²,#i£Ë)e…«É¼ClUNÆ-F…d½ÆBì,A2„yû;uÄŽðÌ“E„ßç9®f„¾sBi` Í¾Ò0jG1¨ðxýi§+îÜ5V¨ÉP£±—ßmÐs+À‰J¾t¨tˆ‹C¬”·6}D„¶MH‹ÌÛ¨•ÐØoHbÞ · ÔöØ\`ù8ÞAÕ5·†a£Lû‰¢¡ E•Ž~6Ïm×ÞYêLT°å€QP”–Ó¶ å(-S€båùâÖüö|îôUuY׳2ZäÆkCŸfÍV9QVOŽëß‘Ãþ¾i˜ 7ÒX O†¤1ˆÐ¥³Â1&ª4Í €Á3Í{U¦°%´¦êš·Ñ dò=gG|"%ƒ“GõZƒÉÈf²ð’©Q 0AOr£°Vbm,Õ A¹1˜J͉‰âfä•Þg¬£H »fÿrì×ÚsD®–u¿Èù èh'¯SsÕ~…gîÕㆀ}]òµ¼§z{ƒ½ÜOМ–º×Y i4Åf#;¦"j$3šìo{tfd&Ê„íÑýÜOÈk%"hØ3+sÙ£_'¦á˜ï-ÇžÝ7?xçâ>¯ S>¡7¹Ãì«°„#çÆåSøª}°ÓΚeé(¨Q- F! †"`†¼(”„D »$‘UíF3l²Óë{<×Ý–ûžÇÎ%WúöLKN͆yÿ}<ŽË1¥+ÁN>™ÉD08Ò$”‰(°‚Dcø T€aÆÁ™”MüT~þÇž’ !ĹłB$;¬Ãð—ÜŽfвF¤NéÄgå[³ÓöhˆøÔ»sødU¢&0Qª€ JÅãiÝÏ׿ïìSŸ¿à·ßåû™¬Hç K µWÉáh¿ÙÄ3“4*J#QÞRVJ©d´rŸÍŠIúÌ©V¤iµ=.Q96zãá%óÐo{[pT˜biÃ~â,£lÚ¥S'çx‚»ÿxçªÉ©;M®c„bÂRbaÐA ŠfihH ZŒh© ¤Ë4E4ÿÔ0ä@dÀ-³¢Œ$‰‰U,:,R%„#ˆ$ÈHZi€ÅR)¨“cdAQU‰sü”À¡ó¿ ø"¼^‚“dM*á]väôÈTP¬h:â>ô¨h& 5@ |5’­QǨFÂ¹Ñ ôÝ :E‚e¡Wúílnˆ§ Z:½YN© Y‘–ÇŽƒÇ X!Q!î4QLZÀéd³à‹è8iN€„ çÏ¿è“õú’—÷ü?9¯ãßÝþÖ~¹°¼z>>v­ }ÿ–.¡íq¦p<‚ãGÓŽë/Ï핳";Î$¶Õ‘ÝʉŒƒÐˆÂ'q".¡-ÀÝ#n;]Ü’Ù€Üm àò`þVµR(È”2ž9ãÖ€xÊ’s½_Ç÷Ö3:åÔ]¡«ýæÚþ†ýŸÆõøÛô‘=•‘.xL+„0(‚‘׳Oj0Û’kXêäh€•¶ Tqìþ¿ÏëOKÇ/MØB™€…H‚!䀙·d¥Wïn,@Œ —›@šõ±mž’Ÿt9S[‰§„qúþéÖõ7~‡9(útp'?ß<ùë\±¿ª÷ÃJÖF/c—Q”À)ÊfrdEÇ]sØbVc j¤SµÙU+¥!ôñ© ÷&ÏÃÕýÄÄÈìk ÞŒŠÏ†U›âOê÷Y)5Ýó¸Ï”BàÊùšžÞàJwêÉx²á [A(µ¶'h+ýT&¼¾£ê.ñ 1ŸPÄx)ëi¬XY,ZosýÁOZ>çãï=ÇS{kƒÚýyr?ýÝɼi+3Ûýɳáa}^\Ôu¼¤ X8ËÜÄÁu'cÙ=¯N4Ãã°Åyö4ß,ÿdÞäL² ·7¿ÝèÙfòÂÐöÑþ™5>Òj /E¦ÄÑ1%”/9“/µ|£Iˆ,’rïŠ=w—Á0?íûâ^Çé>±]ꞀIÏvÐ`vÿå½ßÜÎß>;*1Ò>\/†{€Þµˆ¹E,´^ÐÀ¤cú™]B'É©ñ·Oº!.c›KòËWçñÓÓ]™jXz¢ÜYÝ4[°ê…½@Åt0‡íP ZÜÊjºtúL'AC:£‡å‰™ÓÅB1T‚eŸ½¦eÂfí\“äUJ DËbGñDå:< ƒÔvôñ¶¯WEN-¢Ùó¨ŸUĦ¯\%fYHDd&ï!PÊ5 )€¢q5±gÜL¾·ß¶£<ë-Šn•ñ/*z9Uá®i ‡t5`QÔ=!—ð`j‡ÜÙÝÇ‹›–¡½È„()‚1ÞÆYcz{µ¨õ~%;ÊýZÈ7/E׺!^·B•Á>µ¦•°È„p „¡ %4c[O‹ËÕjÜMV DÈ‹:¡=‚;¦s¡©Z^¶ýž®iŸßÀ;æêÔkÚt_UËãéVÊg`£Jí25&g`OiÇÒÛd¯LèÆ<ìX ¾WüÁ û¯ë|ö\F& Eµ+mÉŒØ\`«‡VŠ©±ã4ÃŒ~Ȯٲ*9×WuÕîJŠqB?3x¶œé®E£†á~ï&»’¥R°r/!Õ͘]%ðv1XúË+L­ f`ÖAïŽ'² qjÇzI Uyùeºq˜ˆ©î!Ue±±R+åA8½Ï4c¯1‹à1UÀZc Š,[jU— Ô¥õ<µ`¼ÄØÓ¹cÞgØß_ñ_'§ïÙÍ̧gäÖ§ß,Îçž’wü]šóó±8$&ùx$6ÃjFÔ€SPTõ¡øÌ{r‚Y+É(Ã/`À¼!­µq ŸBN¿—aTý<’¥CØ›Ñîyø^d<ÍÌêÙ&!ZAˆý©w83Â'nƒ¯0ï 0`)?|M(‰Ê„^…Å‘>¼?,hK^ÉUsì²l> `e]›3õÁAËôäJÓ…õÛbø;3Ô¼Êm8 $òL¶S3:jüŽGœ'‚€SP$ˆ·OF‡¤æËpÇ3 ‰Äw$Q¬™¾ë—)[×ñMNb9…D ãšU†ñˆêJÑ61S`ð%¨£‚$Š!ºnÈOð7i™žòµŽÊ_ ØÎî嚢>ö÷¹¯üY¸;æïG¨‘’œ_óó†¦ÓœEÉa†&YAh-ÑC í.¼¬j"ËP€Ô›îÙõ]Äe+xÌ÷˜žYŒÞC±€œwie¸KB„_€¢%BÂRqA¾›ªŽßß_öÙqKräe•qÛ° ¯ÿjE;f!i…õÌÔSƒ*2È«¸—RŒ!µU†Hòx‰G­œXcõ„ô ƒOì«,"‰Q(¨êN­õC,ûsÜ9ßUÿÛ¯ïóþ_»9·;Q'}ƒ‡æ_ÒŸ‡ óQÖÔÒ Tr§‚f*ÍD,©æ‰!ÔYÎÒ˜OñGè'X=¯EC^ë•kÖ=ÊÑs¢wB[.ØU·x¿ÜžU¦E™5¼èÝæ//ÇïöÎ~ÊÏîËô×t7”_ö~ïø}ɯǯêýÕöq;9yRêx r9V¶Q?vUmØ ¾œtD!L£Ò[¼}ûÃâz{ã«_}røYp,þþåÿý¶æGðéèåîs“S4WÊ»ö6˳}3ö;w{¤ÇÓ|çðæU[çÁs”›R,ëv,ö§£ÔKIjAÌÐ#Ì€†/ ìÒûçÌö?ä°ïj«ûý¥'8Â+a½‹äðä©@=Ï2Ð#Áz/Xùð[¹äI>5q©òmõˉ£aŸÞî€m>žO¯÷ÃYí1ˆ‚IÕ^‹T 3šïľŒdKƒö´œ˜ÛiP&¡|Re`@Œ^ds -Kh,dgˆçþŸ¥=?:•C§D‚}­Y9b²RˆØN©÷Œ¡”=¿ 1ŒM4ñ72²x¿ëT}—.3íÙÿNØðÅ*¼dð/¢G³ÝB½­k´ZÑÆ>îN0Æ :þžrg-X¤eèl×4ëéeÛvÒ&­†ž¿*å÷˜Í·¾˜ á ú¹hxOÉö•&ï)«ºKIpÓÊ-7!8g,Ð6v["ù†Ì„Ñê» 5*À”5®YëIÝšúî¤_N®„j)¦í¸Î4 {!í ðÇÀæ:1¸¬ã$3nu#:ÛÉ Ò@kK4ÞE,aœž©OŽPLR‰.qѬ…¬˜v OäÁÅÉšæ¤H‚—í‚ШL$Jq³Êûw™×ý»Û_¿îÓålL)ë»ì¾ ùöüå`/$a'…Ê{sÈùظøÎ~Ÿ{ó>ëËæàÅììëö¿§°­Ô÷v_ñú2y$¨º~…œ±¡¢½¶­Þ<—´>v^fžá8}IézÚãxÕèëiO¹_Ì9ã'ÑËùщùÚ6~:Y?Úsîϯl[øLn¸_”ÇJµ oæ7óËì ¿®ó~'øêuŒò¹?ݹÉ–ÞÈÐ €ŠÊÈ( (&òX]Æ­v”Î4„Ôæ™Ľ¿Ïÿ³ÞÐÎÒé í¹xó#î šKrôäMÅ´d£lTBRÌbVºAIà`A&yÄõóç¹³yl§‡V6LÔœÝUUÈkžˆ ¦Lr¶lîlÊ‹Pi×— Q“¶W¶R7Ùia»Š­Öæ"F’‹ÿ¡™Ngwý…üÄaÛx™¾úwŒt6¶€n£”AZ“ÏýgÏ7ëÖÝéåü`fÿ¾ãò²÷V²(MW¾Ãùúƒ}üãÂÛ`É!©© $àŒ¤'#(RfÍ òÀ÷×/òýÉþûÛûxæyÞ¬ E  0ÄÕ“‰h€DFAFcu› fˆ”51:ôtn:#VJ †ËéX†ì´ØÁµü€SÚû€1âq“}¬í„ÞpróìæQŒ5n£ìÒ°:#HŠÒ´²i’4¼‰hp:¦© Sü` ˆ`® 2E'Vã ¡}]d2¦F4²±BæŽ@Z¥!A¢H‚@C… B‰óÄY±ÕIo ‹£° @ÒÃxæY‡–BØÃœ¡¸¢lè Ñ»Ä?”9S*›ÃËÕP ·Æ¶kIOñÓcìøH”h’˜ÀZK?u+ŽáÇô#aV Eæ™'?µ<ä™êDQm×[·UÍ~ÉÿuʋŽ|ñ$@ T!j ˜Ð°F·ž_¿ý¥~{ÓHÇk‹SsZoßÿý×̬J‰gN7Γ¥âÉ›¿Î8\Í_h™EÂx^;±xzƒA9o×ÐDËÐCF¢0 tÝ‚‰Zqñm{d¥«3@JÁ®ÎØ'†c"81ë¼nïP0ÿˆYoØž!§"DÜ-Ü«ôsR¿ƒ”ß/¼?4~«žþtl.ø†õƒ²2ÍA|ÄøHÍ!Ý;z¶…AÞó›Ú¾´ÿög ™‚Ú"° €€@<¨Æ‹o:Câüä€äaf°>„¶ÀwRn:5Çw±µ°N­ÀhQzÓhœ·Hòý—ú"æ¦ÖdHHÌ0S ¡m†—º•ŽKcûíÙnï“Õ”ÓQY½x(‹„hÄåœç‡¾ÕéQþèþñ|®!WùË+¾ö@ªrý2Ÿ_êÓK½–µI9){®G <\Yô\‡)‚Šè" ’©fåXƒ’Q3»Ê##¨À%V^‹í»¯Ÿ¿ëõÒèð™6¹Ë1ƒO¹Þ,çvª[sû«|(»úbL¶d‰e¤gqS'Ü4ç¸x¬¿NÜÉÚn µBº%ðù’q­½ëi³Uïv¬޼#žð͆DH e”£l¹!]·‡$Uã)B„-ÛeÐ¶Îø´Ü³Ï—“û|ŒÏõ„¡ÛJ”ù÷5xXzº=ky#*'"Ö^Ì)‰ «qc|'çg0šQ“v†¤0b2Ó=r'±xÀfke¸Ä`%ÚªÌÕnYÇ“f7µêÌ4dÚjFço¿¨ï_vTóÞ8&¸0V %_×ø¹JÚb_]½Uoís=JÛ+y;5øéí»j^cúÁIÝ1O©[×Õ ¬tÕn¶{%hnŸèUY2HP›òNM,€ ”Öº°ŽÞ6M‡Â1Y 1ñû̃APo§èHMzoœ`ÁÚöVá^I_[{îç˜,ù„‚²,*FáÄ›yfÚ´øÖù¹Ež._”huٵݜi„PDÎ9œö†Ig "ååËC–[í8áLùêÊ~˜"$åeéÎßêVWÕþlçvŸo¹ô+^ôÏÚ¥iaU¦6ìÚ‰ÓÒBy˜åÔÄ8C&’¨¨n#ü©®H4ìÄe†u‰³Uà„{[óvà¿G±G‘e£õjsrýzr¤ ¹mc‹Ô¶ñµ Éçý¿ÒàRÜ™îÞ{¯ùq9—‰‡•³ïxbIF¨¥‰CqFg­>ò13Åt‹®¬üMµ?5¾•@›¶gLm¾”f©ù8ÌUýLpcÑÇ“|žÃ{ñõ m—ý5-Š‹Üº_¯<‰ Iä4u‘ÔF±Z$¥,?Š?¬Ì°N©³ ‘smÞ«XHû{Ôs²GW«Ä«f¢Oü%9Õe8H?d¡”ØÀŒ"½BÀŽÐF] ³Vš²¬.©ª ÄÌ ÐG\Ñq&X§|Uf,V´2IéAk4„W`G–¼ÒKÅŠ>ER÷œ—÷6îgÉÞeE]ÌwJÀ šf>}ÿL×Xæ…ïø·l:&ÝtÆC“0]¡”Á¤v‘P@º÷Yä³àÙvº¸µÕ€HDÔæ®è,hÉ£4ãG)áq¾´Q¥ ¢À˺=çɧ= €0k’Øs`Z}v7Ž`¨lA´‹ 9›åNSI¡e sRM$RPõ%}Ê/éÅÀRš{Ô]ó;ÈpŠE§¡õ@~çˆt+1Ê4ÒÁ;ˆ0m5<„E³x™÷;$AX¥±⛆U¥D.úcÈD‰á€9ÝÏhž³4pàÁ!J@ Æ: ¼WP‡‚PpÐ,þaZ® È2A´´åˆ"à™Ž( oºN±h°Å´nêAÍ‘uB^¤ ßs¼ÏÝ ï¡å³÷ [ s|ùy†´hTÑ騬ÙK2˜2RÁ´;²ØMú-¹òptÁdg—oºoz©Ÿÿ‹ŸœÌñE¾äJÈ‹·Dunz4Öhoä"éA·Ò¢³)ÚƒæO7G”ŽfRYdcÏ4{Î&}Y©îÌzý®UbÁmC½´×Ï·—x½¶YAß7#Ôndßǽ=¯ôü‹yÿÉž¯ø…Òe bá Ø £Ò +4}›Ó7ìK"q ¹Àf^‚cœD’!%߯z3* NÑ&dc˜Èè¢?Ã'0ÄSÂKa63…’µ•¬!@[ dÐFW~f ³æ¢™zñŸmîWç©¶ÜûIÞñqxZÑ€IÅ“û—½x`3=‹Ö·½ŸÑпY³Ñ­ˆ¾f°1pþîýú¸sóû·qøBa ŽÄ¸OÃÄö—érpÎŽ1ØY|’›ͬÅxóþçÅ_ÿ~z>‘#H&gœðœßô~^ùP|Ó_îÊÎcþz~tßA#ÝR¼7¹¿ÉWÆØ•ej–ÞŃüþr_ôo@õ \ÌpödÏüñŸ¿ÿ×ÏOüå9gî´änR¹”;*NôltG ÌÂR?œ™f:îçÏ~ù§ôóÏÁC> Õ¨v99´çZzþl«¿¤@™òÇÁš)l"E&}Žc•òÇ`M¤¡ö5óЏÿ”Ôƒ~œ…§2)!Z•î°˜‚D9Á‘`Z4ŒQXüSÚ¸¯°¤%Ó²E¯£ycsொxÒLµ.ƒ¦0sµ_=Ì}Üj†«;L)ámb» âYXï,V ·:Ë­:‚v?@JP\©ü2š«]¬£§Á–%©|ÌÄÂaÇ舴m‰µW`›d—7 2æ“bÏE?ßZå#«Ä[Í=?g6÷3öŸo{Œîœõƒ ¯áðÙ¤ÑNº¡#òD–;CM~¯ÑŠ%$ÇöËÌÉBåÝu=;»&ÌÜ«è®[”ŽuâîЋ²—ýæ(+ת¶·»=Üψ] ±ß’}rþû/_æÍêM&o 8iÜð[Á½ÃúFÔ*k\’éõ ªè¬è¤¥Î'ò%cû¿øñË—æ’oÙõ©õf‰Ò@CT¡¼Gp°†²œS`¾;÷Ú¥Þ̆¥—T¹EF˜ñçìîZ! ç™ì%±.ç<ëé–Amž5‘LäÑ•vN¢Ïtñ•¯X¦,!Y*Vâ¡©—¼ì–ÎB µÃQ„ˆÙºMæj.¡¶Šu[8Ô`)æ´v‚¿ÁBÿzÓ1¡{KüDÎ}=ß…^¿[‘Õ˜L¯v/³<ù|Ï#ºiîîi3ßKÎæÙæÙöçˆÝûb}-ö÷çóWÔ£s.ùE“Ù÷gûìo[`ÌÞYº²Çò>5‘3Ç;¡3P¯A“ÞŒ_¿Wõ•¿–ÙÇÏÎðéÎÑûÕ‡|JÎ6¢Ò‡~ ,u¤5®âæÓ¸Ûf;¼g1ÂøÊGÿ[w|÷|ýßJ-P*à ‚TÕG…Öt¨Bˆ‡¦NªcR.bÉ <ŽßÏ×åŸæ—§ã.$°¸Þ Χå½r·˜•/QEبdM#ƬÙÁoˆAWHsŠ\©¢Ä©Öäa¤UaçwþB>ÅIr5ÕêlêTŸ ðÀø+ ©˜j¬ØµõÆ Í¹Í\WR(è~ ê¬D ©›¬±¡©x¢ad†‹1U†—m6HF!l ·Ç'ê‚lÝÒvZ¼IYÌÚqyÚ<¶ýžEå¯}O~¼Îß‹ê:ŒâZEǯf wÈç§dçå{þò§·Ë£fàH©'c"Á°u2 ‚¦V¿˜b1ˆÞšrßÏê}üß—¢yð9R (V­€`f„C)¦ h$µ Q‹ íFDëЌΕÆsc5Ò$u{9Q¦S‰Ï–,¾ÝåUIkHp@Síà|ªtÜ(>è…&UTóa‘ˆÌ 16±Y .&€P@­¿ „ÍÿB¾h’Kd9ÞÆ­hä`PWŸ­«n色‘‚»ˆp ÈF¶#—ÊÚý4夌óó{WÁwo~ èlƒ‰¾©^ýÓÕÛzí7‰Ô' `™D‰v•¯ÁªÑ/Þ†·ËŸ X4áV[ÿf=ò•CµóÛž•§þŒ`R*0ÄêßxÜ\'qˆêlCî²[/¸ É¥)&gçn!À³>åãêç>¼‡&-2   Šú}þ]Ÿ†~ù¥ã˜yÿêB.ãó* 6…‡Z”ß,  ðé?å¸ÜÙPüÒØ¯0ɹ&—·cBp3/‡D£§Û•ƒáC¯˜F P6 ËÖföF©42Ž÷bÏÝ™/ Ú„{|¤’4Lz;ÄtEB`&HÉ“ýó«cõ¼Ù®ÅÈÏãCSu°fçºÜ¬› Qc„¼i¨¸­zÜÑjÇ>qýs!Öñùýò\W”ËߎçËçs¢Tš U¨1!=^Ðs¼Í ª•BeÃ5Ê®nM@Œ ˆA‡}ß°Õ5#£ÍËðÏ©.êzóÐän©Í‹À}•1˜?»¹Ö㦀^‘]£Å'ï¬ÐZÍ “¯n!íëìÓí"ü„§Æ-aºËöÞ¾ÔøGÏ·ÐúM´v~%¾ÿá6`œü®—ua‚åÕæÝ.èm2/C4lmE«²]ô4ͳKÈ£A‡墘ªTˆ½t0°9-ã<,†N’*‹íÅKL¢–4gYŒ}Ž·Ÿ»Û­ô±ˆá¼=þ4n7t¹cUòâ—xÉ©nì òhý®»õˆÙ½ð‰½´—vf6Ö»3îÝóß+ýœgÛét l©a¡(’ÉŒj?E¨¦Idge-ßVR Šníøósüü«™7óˆž;@Eß¼þßâµüþWcÂÓÙQ¶/l!¯Ï$ 1<@D¨ù´<{j–³Ñ™ËkÜHKPØYÜÔ¡«`Ó0¥tOdtÀUª ö‚Ѱ¸UGõˆW q€í! ³¼lmYÏRª ÆÌLŠ[e´“ßËÚf]nù¨•…³Ï´»”3UÛñöòS[0y½|²÷ÌöÁm7¾ˆ¨§³øE~Íê_4åH 3ðHKÊb«d~Pl“"<´÷ø=>¬W!cŠ¼Ì¢AŽ:ÌIø=y줇•'Üs» RÕ(µöµ\ºe¿c ”%¸ –FÆÝÏORÉ•UdªI±´@RæÌJZ†:E˜ªÐÌî´ OÃF4ƒ˧˜ŽŽÒ¤Ÿ§ž'°iÀ–V<2Žûâw±'øuõ<üäù¬ÛÃý!¢ë'Ãî¶‹³s1ç1"RÍ<}ß ˜ÆÙ8Qà»j³ØÛÊÐŒãöô²ik5«©&kÜ™kB ØÊ€6¨ƒ°Ç.nAºšçÛ\ÏB—Èaa QÑç“Ýæó®ÞS¨äV§ô*P‚§ŒU@\јâ5tY¯»*H‡Ë\ypÜ®šQ_‚¢º#q¬³v3¥XNWæ¥i¾i,€#q;Y¹Âæ ode-+ á8ç€ÎHñ7BêÑå}é3 jðíû=ƒŽäöå•ÕêÛ¹Ò„% bˆäçü áò{d‡žíeÒE%|P/Ç*5Uê¶pv˜˜ »J¥–K¦€¨¶HŠ…m§ñ „©ZËŠÁ>dMWjÌ¢íéጠ»§¶°`ZU«>åï-ÊH‰ˆÅuEÙ‘E²ÜÁ:(T4ભ9³_#È7ãS²Ð—ð‡°Et$¿iy:¿Çóë¾ö¬ÏG0îçÁ¡¹<Õ‡\Z뫊ð" z¬‚ÁÌÓMü Õ‚•lcÊ "3ˆÌlâ5ŽDáI@Õ7î%£ÙÊŒó‰u˪T$öD&£ÂÌH§û„i”Ü@'IÔã«+¶Û¡jŽ˜øM_±PJ€¥ ]ÁG ¥úàø}·¡$Î; 㟠§ì«ïå?‡*~i$[þêHd8§åÞPÓ*åd¤Z{RÿÖŠœu!i $ò–~j’­.‡«8=Á>à<#9DC*˜aНSJi9ƒ‘¶!jYXœƒP=PÔlp¥1B ôiåwÁé/‡Ÿƒ–쨇yP] 2WpŠïרóá—Ïö/ïxO5„¤ì è’wîö!&š0¦¨LcüI&Y–¸äÒc€‰ßŠãø˜ØŸØŽat4\¶›—GÊhá‹¢¤w—[ù1O¡OËÍI2Œ\Öùû½òö Šon¾ãid ;ƒ¹,è4ˆkÑE´1†2h–3^Wþ`æûeç8é¼ WÉùÉe|\&:L—I“«ïcÁ*ŲŸ4å§Ô¾™^[¿|¯?ÌëÛf¶Ÿ½‘ŠQ  CWµÝ¯xÍ›oy8rHÞUoYÏù–|†?‚h€A“¡!´QÊØœÍ)œå棹¿ÙÉaa4Ú m”NIê™!­¶HÒñ›é´qÌ©$ã±×>Xxñ@0†€ 8MmŽâŽl‚Ƭ4"3+[tãq§ïX>vÿœç~‡cë3L®·¸˜™´µÇqfÔ³$“Ø6gº%7¨ªùØÇ«O¤½¹óiìIÆû­Œµ–R„:?ª‘cÎ(`&M§l¸Ê˜VO¦HR̼?ÿsy'ùÙ~ŠOJPGp€j5¥)8©"Yx^ÒÐÞ”[™ŒIº8º>i¼žƒ·Z:¹*¿ÞüËî{2'~sÒ\ÂÔ(ªyº¥Ë¿ü¾ïû¯™¿Ö·ÿ ï³”0SºDC(—hÎD“HƒJ$¡šW\ÛfŒçKÿA}üˆ×oOýo»ñûÿÏ=ÿ\ÿžþlðkNê›]æÇ¿*>+ÚK#yì¯D™3ËÎì˜]ÿqVËGLN^ïJ?¯ïË6´Î{3ꥄЛn«4Õd  …“§Íç^Ì´ÅöâPp ©Y™-Ë”XÃ:û©ž­ý~¬O®+‰ƒHªu0¬â»&-ó7Í·ÖŠ%­ÞV†JWM7å@ ZSG‚ÑnÚ=Å4[ 3]§Ä(mÑf•zÅu/QûܧdxFŸ1%¦í‹ò2ÚEÑp¤{½óù=Ȭ^®|~@Œ¦¦ß½{˜½ÊÞÈ2Vä%ÏÑ~›y>®žjG}üÁù¢žã¥ç³â)ûUh!¢‘2SpiWB6¥Èg}*ö²†‚ÒŠ”èºÎ®¢PTîʇj¸#-$–ýöa–exÏà’\ vϾŸÏŸðs¯ß÷ýç€Ò%e¶’CX(µî[ÓÒ„=àÒ (ІvÀ¶v•yä©¿\ŸØ×~wB:IÅ¡ÂѼˆ +ЮRz…gÈBZ@µ|_¯lÅjœŠA8Ãs‡§Í´Y%¿•K¾ ;£­d«QßM‚©Æ ‚»’g¬¥…‘?Ê6CÜì:k©yee¸©ÞDqmˆ¢ggù@ACÉò(é 6ÊÈÖÖÆcCŒ©ÉÌ^å¯7û}¿Ÿ _wkÎñ7q^;OçYüòÅ¿{6I¢«ºa\¬Ü"X­üñÇìSî|š^ÌSÕÚüÝf=¾³ÞöjÜö㜗SæœñùÄO™OíǽnFk•sfúËdÙl¬³Íùsà—ôë=¼ª-v›hsÖlЬÎ:‚³k`•»§æJ¡TfT‡YfÛ:O^À¾PffËìú7ïÛ'X˜k_\ÄÒÀäÝ‘®’ˆÅÅ GZº¢àgF¦F%Fº}ê0¥ã¾ öõ;ÆÅ>ž”v»c‚‘Yÿœé†ñ FJ]ÚÅ€"‹Ù¿Uÿ)ìŸ d7z#°SÐÑßÌóV_‡ `ƒçU93Õ@mNÉ+š\Œ Hv"ƒÈhRM©fííÐ ³ô.hƒ Ø” É™émÉJì@7•èÊ„  3‹iõà³õdÚi¥uMØ÷FûîÒVdì%`ÂÃÜB»vAD³¥ÍVË7;i6ß«a®«ô§$þí°³©iäBg|ŸÿÇ뻆N¼È™œà´¤¿I&t!QÈ@0ªö?Ï?ÎÏbàw€Âø…ûc!]Â-¡¤@*‡‚W‰T®š)ÔDÃMgY¡X•!’ñGþrΨPÚ2QÔ7NËÀ 9¾â£že1#æ&Q ª 6Ú4 H1(f P0p@ Pþt¢ù§£Ì&¨ 0PfЀ>™BPvGµBP,kȽUm…‰£%ESd†\„‘42(±zºÇ‚_ÿàþÖ2š[G©9)½[ 6=z:…m+IÉ”R cš¯~˜ª©—DðsCÛ§ù¡&èLýMÔýI`Ø‹o¹Ü›~’¨B4I•¬^5vl麦1wQpkñÌnÜ;Û ©I³{ߤæG[×ÝÛ?\y!@‘`dÃgëø•î™sãǽßlVìnììÈi}|aªçTV½Ñˆ5’gº4‘U¬À?J ‹R, "jöÑÙ‡Rùòü`mˆÏ9ßÃgù'ß}÷Sººê#±ßM ñùiØþùž3æÄÎÃN¬^Ͱv"¬›S¥Šbi1·Ý{1+á…w@Ù™jmŠÉTÜÝM„bŽŸ¨|IÖ ·„ŽcšÙ´“!0ߪ«=” Ù¼š~¬5Ò¸¬}n­guéé³åû•óñ%e©)t˜BôÍpTÚé)í“J7]smºŠÚ&|øó}€jrü ·':¿†g#ý5¨¯‰]½ÊüáùîIzÀ™¥Æ7hªM5í4$Û÷ÒáÐ#sfÆ$Ý„MqNˆ ÁEe“@ “Dñ¶E›úLÒ|aÅ70ëXèÂ¥Û|;&ÂÕ1#ö›ïi¾RÖr¹úa\³?ýwcÎÈ AÂØoöî¼Pƒ¹ò¶ÜÝñ&ìvN7ƒ#K›ž®$PÓKd ³Ýq™Ï?r­¬£>£}Hçêñ•} þå¿ç|ÿñdßPÊÑ'*¼«áͯÿü‡÷co`¡‘Xëu·–™›µ ‡–½ŠÚ…ž‘TY¨åsï|]jÀ½ÒxGòzn¼(¼Æ"Nú¨4Â¥?à†Zã6d)h *=5êÞ"V]WìÅ­‰Â(WKWT†Ï%C²Ä×~¾LEêkâ¾Xe©jô*è²…X\›~ÐsØsŠöóùÇŒ5lø3Û‹ÕÂÙ5ÎöY`Wòx‘;ÖÙÞÙm–EœÂ#Ã:ž¾Ígœ’eNð Êúx'[Wˆï"+°r;°9Ûlì“WµRÞ€Ýá·Ï+»q(y (¥Ä–˜±;®•ÒJº¾–õªéÚÕE¥g"óPlxÒÜ”qc°53Ò ²*Ã0:‡…¨§j)ª0èÝͳú–8Þ éµ}:TÖø^_ìší$¨\þË…å8œ™i?h?J³•ëfÔƒ8¾Î|ݟㄉ; ‡e]²½­î9#ˆÊ«,NÓ$7ÑÓ¬eI6¾¢:4R®ª½t‹} ji¡C’9­ÊqjK@‡X )ù&¯£Úº÷7÷·„Ÿ²ÿn-š‹p¶וèÇèNdb±Ü¨ÊBbí>>5’½8kS÷|tÏ.Å:ªµEQ¸,daB FäB}Ù3 ¢€‚aõ–Ü¥´ÍÖÍ6vW ·Å=­«ì†l†Æ n–þö {¨"=Õ’¡Ã Û˜,ÌUoÌŠ@RŒö£û7Û££H¬ôÖ®„s‘­tÙ¬™%Ç÷Q!B0îâ«E[¼…}Öø²õô]§U»èVvSÊÜÑJíÌA I¹ ‹pš’ùÁ¿C/ñYà>%Ä© ¥[šâs«<Á6Rç匲ü3‡·fïů©]¸o\±p6‡9P Žî<:/åÊ–6áwÈÛ‰û˜Xþkþý:I¦W¸>™u¦ßŠ„jÖ9§ýÐé23Oq„0 gª«¤àíe"`2~Â3?/œó[þÆ9ÄiZÜ=£GÝ ÙÚÒÌ<ýÂêeÛ½®«ªÀ‹‘ ½fñ+‘ó¼©C®•;H&9Ä:"ÎâÄh{iÙê`äÌ6Ž4žö\8 Å4‰Û)É,ý¤¤½àKžàkŸ%9u7¼ÞÇ/]Âì›NüvÄàT8\)¢RЭ8¹AöcèZ e !o !w¨Ó@)¨øðºÎ(ŒŸžb:ö,n°9 ŽÌ™ŒóX‹»9±#PÀR2cD' %2¨A³æK±AKt! K.=Ý|Ðk+ú½»|ß²ë[cÇ–·­©_Ætû}dDf÷*±û䃜û/˜fž Ç|`)ÆöTÐGÎ’Í`ž~´An>~¬¬ô¶g­ ·QQÿ)ûo”þ¾Sab¢Û¦!¸©8í?ÄŒxž~æÜHmlÛŽ‹-¥Tf`Ñb?q_°‡û6ùrÞ+ß™G÷T/³8kÃ;e‡v{mÊleôµ3xÉ€‚ „…`t"„H,)¨ÒÚ AC”õ1)ÏrÕºû–ŽD—GI¨<Û¯Ù‘ûš½ï6ÁLO<”@àçÑß×8H7 „û§âÍÈ‘alªE¸%`Ció‘S:-Å®Œ¡ñΰaO(Ô´Rô’ŽΕ¬çÞg¼§å÷©N E‰Ëä+i|‡(Ù~¾›­r–yëi,•2.âL÷ŒùwGÖ½œ6ûÔŽ"-Óñlý2=ç«ýç o—ã™ÆWÑÇp~¶»Ù =&X½~\(´¬Û.ý÷½?‚û„ë²™sÎîðý ÷ër?:=žë>×ðX=Nœƒm½ÐkZ:LèÜiÇ‹¬çNÝýV¨¿íΧ÷õ›¾t$i *_Œ4.ñ”Üâc<ï›]z0·Û×¾~숩çk°ÎÂÇè`!*¢5¬YAÕꀉX\ÚÍÖ±…`Zö{:ÎßÖýŸïÑÞ¡;çGeÉÐ{]ùú##z4ò‘P‰I(‘  "¤u”¿å B|A"c¸ª·ªõcŽ @,ôŠk6Sç>pLAeee‹WH 8®4*¥D§€=ØÐíà¶Ú‰¹|—·„âÏ¢Ã{&à>,ôbÖš­%3FÆ'òPcÛVB%›Ñ4g`l-Uiã`ÈÇVôÔ¥”v.T< ¬n“â²Ò­ñÐs­~¯¯º½ék1¤ºñ·†@É!%ò€cöë«æŒ¢6ñÒ’pö&PDù;Œ&j4šHø“BŸ €?&”+i¥Zº6AsB¨¨H(P !ÇÇ1 FªÑ*É¥%ÔªLõí ÑíJG„}:AÖØÕ=îê ]Be:—o€j¹8Œf€ à 2°`6L³”P1ð€ò§]¯5TbFW´ò@ƒ]Õ˜Æ3Ti#IRIÌ ƒC˜d&"ŽDad!Š|DP`¶K{ZÒŸ \™ÏÏù0YQØËZìâ 0½£ÔbsàÅR3 @dõ!ìôíø‘>†àIM:áØŠü€ÿ ý³È8¶ÜŽ .¹‰Åù–О ­Éô[³ *w yèÝ"JÓ2X=Ò+¨sMÇIvËËž\³|¶ý ~ÌD&*ÉßÏîëÇ…ß¹ÿÕÙLœqùrYg·p7×=zŠ´]n¢0KÑSÁY³G¼ ¹þW﫬}N ô÷;Ⱥ&Þ±5f1¢¢‰®󧚯ܪ©¢ gJX§+ÒT¿=)Ḣ@ìmë[±À0…¬A ~;ì[X‘­Ž $±•òGõøDo4~³–w*oFà¤è~•ÑSVýFÝÅgþsoG_¿{xúÔâ\ñÇ!™Q-™÷í7üåòüÙ±cÁ/­ÿÏßö»²¾?\ã}²IÜ–÷°%¤ Lˆ2`<T!S˯ˆéŠbÛ0ÁqXn;öptØ9 º«×‹lO#^>Þ¿ûëúé§Ë¡âDQ4P¿F¸êú«{\N}U]€#áÇ€”Má¬CÅÐC™ÒMç=Å粆çô}ÔÏõˆ¤ža—ŸÓå×_òüH¨( hgdûv¾MxxTØD/ÐS£~™jÔÝîÏvÂ×c@wFbº–Z\`%‰“)K†«EZYsÙ÷}ÈÁ ¾ káöåå^Á\ƒ7 Hi<:З{Íx=N/;wÒ6õЇ¡°0Þs¿ð{WY ¼{ö¸|ú&ב‹Z 'ßÊ‚³y3èÊyfs¢ ¤€½5…Q a¹çƒèmë'¿xõë¯óÑÎÿü?ðß_Ïû‰]ÿž×n^ßcí›ænðù×ßÿöçýo?¯]ûûsŸV×VŸY1`¥âÔu_¼7iÈõÃDªšû§žïÏeýúËÂ{òÙ/£â6kÛífv”}m³È6Q A49vNän7™Ã~¬u-{kÒÉÇ¢z°--c£Ú†ïúê;ý·O!XÔe]ŽF†å9ç‘Iè@Ø"{ !®6…ýaõïÆ¬ÆÅ×Ãâ<´Ù¶Ó3GÎÇã2f$/rëЃ~eéÒ—tGAŽÈT7õåaUW²¤r z·8èlaÓã¥ô/L‰èÉš)ôöq‹ŽÀÅÈU ciLÖöýýsµFÒWQ½--‚ °„DB“,V)¢H@uΦ‚tc,B#3âôìÕ+ YU½[3›ŽÇ K´?ÜþäU%Ýæ_ðí Ü:pBdñç}ÍóZv" íÏ÷ÃÏ/¯ŽýpÚU·PO]ÎÖè X·ûS»¨}²¥}˺h7Öî`ÆÝº¬TÅÖݲù‚'sí ÝâRû@5Üq·Úrn†™üP/VRÊLN«Ë¦“Ò¾ÛÍË4}ÒSòƒzݬÛOs'À°R¹ž½­V{틤QŽ´J“â„`„¢¶ŠÃaK¦Jh[ÖQíÝ ù·$$aD7óêF¼ò—ãRØ >?‘¿Ì¯²þÒ9äNŽÑõÖÞëã,a‚Ô¡S´Š²‰M † ,¶ÏÁŠÃ>ñ-cHkdå×Ö’%ZÂq³#:¶Y&ñú¶Üû1\Ço^*ð›ôÙB‚ÅGìnÇ£ëWûÄÐ1ºN3*AcëÆŸ n>7jJ*AdÐ À^Ð<òREéŠVT"2wTù©À»õKXÇ ´™H‘sÒw>9âîvÕÒœýŸãûœnÒfZo úÆôt(p+õt=­ûß):–+&"Úya =—ïüõˆ<fè>ÒÊH¡@Û‚¹[×E‘ž±>ÎŽ·mμ‡ Ýb¯åSŽÜKC ü•1qcY¾HTC/«<#”lÍ“þÁFÁB¶Æž@ª€Ci‹qÆS m foÂG´æp|¨¥JD©úü)ÂÀÑ,úðMú:f ü+éõ3ýÌÞøQ>Ë~²ûN}vM‘©›ô±Çù'¥.Û™-OŒíötÅwƒ3:¨ +ìo‚‘C@ @,D\]Ep±ù ð²¸›<çÝ ‰Ã‰0µÃˆCNP”÷ƒ}f“`¢ (rAX:$V£à©'´Bö<£þ&^›§½<|{i—«²§?Rè|OoºÝ6ÑÃ%P¯Ì¦(Ÿc9¤ï%Ÿ›zÚÖQ,”@PÔ–a‡‘mBÙ­.r,æãÞ(ë"u. ËK!Ð~wŽøœ¼ÑG¨©Öpz™§»^XüÈYFsÐXØÊ) 4O›Ÿ€";£ÏîpÊd4¥ÇzÌí”]@.ßZmBÎé*»4º.΂U)ac]Ã[ û,ïPÙ[^¯!yìY Q³¾kiïçU³|­kË.ÈJ>é sœ1Ç3Pððš@” 6¹”L]î@ÜB^Ç]·–öDÏ{ôš$8f€ö¤3ŠÒ^œž< ”4 KD½ªs¸ôߌÝ„«;Ñ‹=Å3%ö{»¢¼ìa¦9pÀÍŒ&–¥£ž7ó7ß^cRš‘ÈŠú²‚WòÅ3Ñ_šd¼Ìµ%a –»AV‘kÞèX†XüÇYù&ÝçÜÑ!ýBŸ«sÎ÷ùtƒ2ª`´C<–òRšŒb¶e‘±~²ðww¾ûžÚ¸Áæ„ÝÙøX­ÑoþÑÓÏÔü!kªy±'f<å sü&¿&5Ëê}¶÷¯gÏŠS¾üõ_.í‘›#ljq_Qÿ¨«Æ›°µÞ×0ñÓ¡ééXNmqö¢Yå¤qûɦO‘6¢Ýx¼&üó#×Ëð«:¯õÞ‘ Ì-ž—¼¿{yôæÿwøú»ÀמÎ÷±ÿùå«7ø $DI,ŠfH|û1|ùNGœŸä»GæЄ•ŸsüfkÚK®6`Õºж: å8y)êœÎ51õ;þ7XÁµ‚oª²­·£ j®×±ðyG¿‰þÞ²CÇ]RONÝydéˆlâ^gÿÁÔÄY‘¥¹^gІv,yDcdO­Go.‹V(=D WFeG¿¶A‘p_]Œä4e€Í lSÕÒIã 8G‹Wç<½¯{ûá\Üå 2$)©°ðdæá1ï‚§VNó|ŒÏ)È–ØXÑ!€‚j×9 _û5]û´‚C#‹O¾©lFþ~q°m~ÿºP~K­2|öoùúÞý¯:¶(Ûy£ç&(œ8)’né’$ 7·¢@|¢í¶Ä[–hgÛ‰®€)ýüR~.æßÏ¿†ý^u̲Ö$i$F5™Ïa?ÿxíxóàÔëQ:HÜ… ˜Kz4‘ò. !tˆ+¾'ìÉÕÚ°ü{ÓøDLèÂe w"Ï_û¼áö.Ã"Ýa†‡ØS¥í×™\[æNÛI!ó³msÒ·rXR\]ió[#kc™Éø†ÿX â,ZRÉó¬“('ùëÙ<‰úòDº{Zžá¯SúÓ–ã8mgÝ—é“íá<<¹—ïU¿ççôÂ[í [Ïí=z·ô¼J–9õUväŽiê¦}NÖýK¹)|š<¶6צy9ÓœOß3C¸¾³ó¡™Wcû:¥—1|š[óÉÊ0SU•È’%ß ¬p^¼30øI{Ä ïmÖg;z7÷ƒù¸÷óä7ßäù³\Ç´÷D¡$“1'¥,Šb‘@æ¦4“Lïoúïß6%iA)D•­4‚«¼¼–e¢£9b=™æd[WÒ]¤„·÷²`µ,]Æ —z·õî{»Š¸¸Ë(X:òžßÞ_p‰k\;Jm)œ&9¦·qu ØP©Ó™nåâ~JYà„è©׳n?&Ù3(ê[Þém±S(›vV³|«ãt 4éØCš1Ãçð%/æÙýüƒÿÎo]ƒM ¹3èð1’næd d°Ø¢Âú3Õ§M•W× ¤À Ò Š·qõC>$JQÔƒ:ÎÛª¾+IîØ2QÑ¡§*<$J…£êàY+&¢®w®žaÓu%ï©ëtJ"eÓu?ÌJƒœ“@€@€*dòÙÁ㮟`üIJ hdvEªHUyHf'Z¤ç@Všˆ"7ÀØÝÛb“\`¤çÀ:à i$E „Pq•/ƒy*˜fmFVÐ?ôê>¥HÏ+BŽÓÒ¥L• B-þl7¤‘e a#¥È2BD¥áð‹®égóå \J݃DB¸n¦~#ÏÚÛ_ j£ÀîjC\s´ÉÊÒQÌŒÚÊ™F3a}¸LŠíÜ–W5|HÖú†$…x Zòü~\iX¿r{ûµ=Ÿ(¨=›VQolèmëòãŽü‰x‹l‹î”{°GgàÈý„ѹº3ë¡xÇÃM{|Aó¼°Vätá ÀÖ¬p·c[$:Õ,;q5\=à”߯Ú~Ln1O”ž1î¹zë¹|åøÕ×XÿëÓûÀù‡3ßÇn^¶ïtJï5HЉLAÞ^tï³Þ½S!…W¡cDP­éØ:×'ƒPˆ+òÐ%ÃAÁ$…èàDÅGty».öI•ãºù®¾çÍX\[›¿ŽÎã¬åã’ž‰Ÿ_ž¹/ðZbKý¾švH?ÏÍ•Ç_ 6î ë×ìÌ&Y€˜®ª@ž_^ÿò6›oßÌù{õtûX矴8šc;ÌL µË1Ž]¥­‰Y¦kÝ]¦–häÓ ó¥?LàÜ7ltæ%<ñà:ÿ¸ºU,’v1‹†ñ´œ½-oÔOµ{øÎ¡,Ð[Ë3lN[µõX‘nv=›¥¦wyôoÉöé7‡ÇA‡¯déµ£;-jiíDÖŒñ(°uSÓSZä$„CÊ^­PîÄœ£íAá^äîÆkÏZÑŸ=dûç$_7ŒdÁ×}cbg=þBûèß_/çú‹óßÿΗ?¿ôò+>+Œt¹‰ZêàB}ñ *iÃG:¢ €ƒ°Á°–á•úpk[ܤDP… ±™spHÞ`ÝÈm"Œˆ‰¤C$’Cüb®ÝêâF¨œôªhCH„+L¶qÛer.2Ýȼ`2 z•×ê|Nÿ$)ñr‡ß,Áµ€±”Åp‘ˆ<‰%:>JÕ„¸=|-„8cÚïu£Î‡[“}¥é”¢ sœc¯(· hU;ÔÀ.cÒÒ¸ƒØÈw™±ª/Z„HÅrgøf¼KñtTµtfåTÅC¸ŠKÛBóC[}ƒù¥zŽóÝ‘F(²¢p˜‰{I)ß$¾1=¬9o„:IQÆòƒÌ3@r…gú‹_gHØD>%_ŽŒb(Àz;9ôh99‡Óžª$Þ\qá¶PwÈâ¤g¹Ãœ#/©=<ùføEñdh·Û5 ÁuÜ5é @œ$ÁDˆ9ÃÀô¿Î)oK}kæŸs‡Ķì]¾¦Ïì¹þÍo¿!Àˆ*æ(»|~|ÖO¿V}Ñõ‘bËÓ9© a°ZžÁ_’^ð‡¹gçø™Xp+=!À¦pŽK*èE(¹-¾s\ €÷ÅüÂ×–&ˆéK“Á›”ÝU óy”׎ªK‰{ô²y9ݵ(Ï祎Î÷žO—›__4ýó¯ûù9¼€Ñ»Ægº±×N !ï o6}ƒMåˆ®É °r Ìåªít¨BfŸ‘W°KÑQÐ zOìæ§ÇŒNž˜K(FbY¿Yà}sþ`URO'[Ù`°ÐQpÊ|¾|ïE½¬'|<Õ@ A¬©MÑfýyv P/Àì®BZgyÖ‡gõÜ­õò}ÏÓíǶ†äçJ„N_½¡Š®žr,+Þó‰O—¨NÐ/›hœºCöº—&epÑÛ1ç77ä[”˜ 4 _xZ-uÆYý|# Ä@rÖ_jš תÚüð>GØêÁ¸*kŸ>ó0¤?gD|‚ˆ¨-¬&D8à 28sÌ H‹ŽFêM2½£Ú%Î8o|f+ÜL(gFÛx(éÇ{P’æïüEï¿hÝó `X;¹Ö‹eá K‡‚Ë\Òv9’.ð$A4úëi ÌLx!C)PÆb;ˆ |4u–Ñ‹„”ž‰ä¢±U³¤ª¨f T†˜3äcÅOCÌO85›Uµâ7ƒkÇbWë4»ìé"Öò€ÆQCWšêÌdÕ±çßþƒ6_õç©;zæUòF›9ˆwyÛÞ7ŸôÏÊÿÌÿŒA/©’ÜrÃ*¡Ö¡4np MßÈš£>´\~~…ûwïóâû¥G¯Ïéëiô?Iv§çוû7ëÇuS9wù]Fþ!Í™} 9ïÏhÑ‹Ù~l&ýê­ýÑRéŠþ¦”ÑöäÖ¯Ôµ5ôˆ47¥"éâ<ŸÕL¼¦«‹ •j³xŪ½;þ½ ®oÓ]Ä?PÆXç /Ø4×cÍÏéuñƒšqe&Å(Gñ¨/¾ íë9Å¥âq•ë(ËÊÒ†,$'èô°Ðá'‹(ê"ð&È ˆD 8Ó§ƒÆ°±»37¦ZÏï ®ð{Àk€VJÁætQè”çmtoßêÂu-¹ÞdãÉ]^ÿ×_îµ!:ø-]!ÛAb5¦3IæAFš9±;Ž–.d²Åòá]SÁ¾âl!0ý6Ïõœ¯ïŸ¬ÛÖõèïíÛ¼§å$º›·ÒÁnÿvóñÙÆ°)7€dÎLlæìžfŽªEªSU#=‘†dܭ܊׀D Qò¦|Üñ”üYÈN_'¼…ÿ¬ ÔÜ’‚ Ì”£ôÆÞpi…N´3mtî½n£0¤te-ÝPèAH®K ê¡G¿ŒOÛ<’–ÏÙ9;§›Ž™y\ÑÆå”N®hÓî62#u½§h6óå<|ÿÕ'@òsŒý³¿÷ _w¡p×AÖµ½š¦6<±,Ý*WÃAÌȓߪY(i]6”Ó4í $bà§·ÞKoPÎs?ä¾dÛÓíwËïOû¥ü¬v(Ô86W÷ìüéýƒvz¶ý°¾md ê¼<"]%œÏ ‹äùµÞýÛØ¯ç¨ÖÚ³Ì=Ÿ¦Ýôá$g¾‚½bê\—‰ÂÈ:º[—§~N™ü€d%Øèl ¬³ä7WtŒõΙö¥Òvllÿº]ŽÅ^pOÞŸ¿qóƒïo_ò¿)¹õÞ³¹u)Lš*0LdeLœLyt˜ú[Þ¿m!``”ÙxbW£JÃéñh¤‘‡URë¡åoƒ d)lOtêkXÇ•£t3Ž:àn×Q!ýBý |únµÃG0PÐõ&.ŒÕSéŠ5¨B›9 ޱ%jË (ë]"6 f:ñhº¡z)¥CÆZšvj!9¸ÃtÑÑCM¸± ªùfŸç˜æÓÝŒ¤ÿÿ»𣿠|‘ÈTP çˆÁUîDL4¡¢z`ƒ§<@à„WQ#'!(˜.€,!@‚úÀ °£\ÏØœá.{†îÑ=*×câŒX«Z#…%]CѪžàI€€ó ‹t[bÊXRÝJ—¹åçF KZÓ €+€ .ßi^ÀûÏç+9 ¡Š@‰Â´Á ªÜU¦x¥I Aàk½¤Ì‰¨€Ð›[èÖ¶Î7vÑÁV¬Š@#A)dV¾ÑS) %à´îƵþíüÅÿŒ¬Þ‚Al4¤?†ë¤9¹),Äa3Ñ“«ÕƒO|>'ŽÕÔIb$“MÖù ?¥˜ únXÍOD,Ñ\±–@‰šgÐúeБ׼õUéÏå&¹sUÔëœIEž¾ÝC{Ìõ´my «YÃÎÃqñZ'›6YÌ çÆóéòõ]¿W<µÖO¸®ƒ¿‹~·FC9.ª'>@òEéÌMÚ“"t9 9”¬L75®ù0<ˆN¹î{¤ï¨È7Í»”j¸ÁÞÈ&èƒå*{‹‡Èíº {¾«åG;îF°‡8"¤ 0ÓÁ«šõ­l)Ô‡á]ãî‚ûuÓðÓó[çNË@äLà P‹œ/Ö•ßùäøxLéJŠ@z¡ÒÉí'Y›ëòÄ] ð_~ùÊÌ‚Ï2]Óq°·ùÀˆ”°–£¹]!»ÊÛÄüæT2 š€wkØŽnŸÓú€:`¿àÔ Ñ„P™‡Tû߬ëþÍåcþêàz›Mܾ0ëf=ŸÕ/Où÷õ|kù-ÿÓoƒÕ[ôWIO&æÓEá'hj¶Ëõ±Ûϰ‰1ž}?oþûÍÔ–ªý9ÂÔóëÿ¡ñ§ðný†&lh/ë×€ÂâÓçp@‹“¹ê¢ ±œ–måÁôt"n±ö±>¶6Í™kÙW¾ÄÏšcE*÷ íóZ¢UQ1 àP®6}®/ót²ZtvK¯Lku[7Vt$ØŸ™×À·Œ¸Æuá|—ÇxOzÏnä÷ãLï÷¾áö#-s63.´xŒ‘Yo8¨`¤L‘CÂÒ]—ÓÛ½­¿ùm”N³ÆjêÝ5vl@Äž¿Ó~ýúD¤žWï>;ÿñÑþ7ï·óß•Ÿÿáù‰¤ ©çÌ ¡êR€²Ô¨é&ÚÏø¨§.~ìqµÆÁsÝÿéâ_dzﯕ̹½»_ Vó÷Ö¥} Ã4VY„±#ï9;EÔ.®ÇÌË9~ÎÑýâL$¹K} ©m ·SYõ 5çk}œk¡ÏX„Y5©Ô9‹¶ù>8î§Hvþpp5«|e Ðv.Þö¢nk÷þýF·××À"нSª"N@QÚÅê²-‡2±»‡»ÕàÔ,„²jPï:îrrSÊV¾ LÁ…-ìGµ«»‹¤¥/8!E pI—Ï‘~rZ"†Pi‚UÐC4³dÄ…ÇÆv)ô6<&Î¥¼>-Cö\“1âÛEô‡öF§’ÄI´YŒ¦¬1Í™À{{œÅÛäṫÝ.·á0ƒõÑõi'‚ 0K.;mÓ(sÓãXÍÁÚ8ˆqA[¤²•G¢ßÑL鮺k!’ÒEG"½&kæà..¢ ÉwZE€vCá t7:cƒ,14©ò­¦J¶|<¢ Kaî˜c°bt¦Kxz0#âµ~ïÉóV?^g¤DíV35ÃÖSËküT|e(÷4˜Oüêþ”2(ÄwÜ!ÏTò>6pW[ãâÐOS´vŸ¡u5út¶7®É¯‚BTPu7½Fã†ZÉZo8‡QZª)w«°n¡P5(‚ItšÐU²¤Ko+Ry%kGØŠY6‡mc¢|´ƒa½ê¼Î:mO†g:âíDËá®îR4*ðŠ!GkÉJCÛpO ¿ž?9läýGÇ÷?wÜôÛPÎŒWÅ`]D8²`s§c:µ 9í‡ØˆÈB¸@cw(~#–¤SøZººŒ÷º3›P&bºŒñ@ßN{{9p9ê³lÆô›ÈI]èÒñýàÞ}!œ)1›ƒ±‘7½7Ÿÿ™f3)ã•\_2ò9úYÿùŽ@N=挅i˜L„Zç*¡(¿].‹ä|+o.ŽÌ ¥ðu+¸KTpɯ,èè$ƒ{²¸¡\'Ø3_\"ǤÀÂ\±©þý&,!?gž‘2L4ïuðY &÷“‘_É% ¦ÝÜØ]cËü†<É;ßuxûçï«û9ûÛ å&ÞKæ´H·.aÍé/G4È7ùgDÓ˜µŠpÍhò„ræšlÖæW/¤$ƒ³Hj¢~á§—Ê 7ŽÄZtOœ„¥j PÒ± ‰zæ"9Žœ´›7¸ažëX1q…:‡#– Y ÷R #öå#j¹É¾îoO/?Ó•‹®=4¤çìô#¼(Õ[úæ-wª·BÉ ¦W¾;ñM2ÅuKÁ‚}1bÞ.ÙÏwvû”œ~˨FNIIc?ž‚—+ÎÄ–BIOÒTÇÀoÄo·6Ù’k2¾5^_ÖIÅj»ì«´û¸”­8“!z~-rÉêá:ÿ¯$PÊÑ(%YtöÖ\Gâ¶pT)rcUÖ¶÷GÑVMSK9ÔBõ°äx¨·¹áD!‚LÉ PÄŒTLXÿì|v~;P:\Ê·Ò3:é(Ã3´”±#-è?О+±_Ô î[/!ƒ VvNss‰ x’<Ç‚I ’MBhR˜3gôh?½G¿v?Oâyr€ÇDà'FrÁΉ¨…I³·Ê£‡#AâÙC $±ïûÖèý"‡µïZVœÅ„P…¥Þ›¶q„í1ü™î¬I­?ä ÙZp«ÛŒ NÔ#u,³æ@›Ø¸ç\³#–Ëî˜ôøÏÿuµßà͹Ȋ(IŽk‚‰áè

¿Ï› ·Ð¡ï µªsë¶b›ÜÜ»-øÃÝ˾)¾‡Ý)9ÀÍø zÿ]er¦#䦿ˆßþóºþþ«f˜Ÿßl/-³¬¼ëûÚÿzSø­þÿçGÿg÷ÿûÐo§ËËß¹`ó’%;" õà¥çè­sºí}ñ¬}þíF¿ÒQý+å™`}{õ=ò²õõ f„ dñŸÞìï‹Ç~W»»¤™…2BÁR0bÜ`¨ ×óâ1R‚lF`k0±Œ›?г ,™…âv§*"ÈEÌÜEîH»³be O Mš?°¦çõŠ›­s5»:ÈÖ¹é£t#×¢±ÃíÇ¢¹Ä!o“å1ë$r÷Vå¹öQ´l@S!n)xÑ]ó=œ¢ÙdL»"n«ó.ø9‹ Z£ÍX³*ÐYìoMƒIC#îH ¢dzþî8‚žQ ž|ܹ%3†\EçË5'bMµAÚ¤e¦šœm¬¡—;ƒŒH-l¬l˜?oZ¨9Òhé¶o÷¹E‹ùoýØþ㛞®æùôóùßÍüëâ²YÀ•(»Ê)J¬iá2¢©ˆ^ÄYì/|!‚+«‚"ï‚54ÙM‘ûixhO°eî T `CjGPÔïÁòйÁÓN(·ä–ØÎÞ®"‚ËŒEà ÍY&„!ÜLrèBþ™óQ_O}Ö6y7ç;\—YÒJ>aT,(~Doe˜×š‚ü³Ð–,€ä ;RéjIJÅÎSF|¥ 3a¨±lÕ–= ÎÍ´ß?ø‹q‹J¢„K¯˜u«ÇÃkÿ²ûóû}¦AýUÆ—©_Ž' °€¸/×xŠÅƒ¯L%°èy?ÙÇhïé{~z½ÙýNÔ_ª÷9¯IÏö×+ñ>º¶Æ£ƒ jè¶m½ÒO³ÿnÕ·áÿPñï>Çó[³q†¢ ¡Œc°2.¯w:ýzÞ²ýëëÞ/ónÇx?ÉÙùÇŸÏþé—ïîÒ›ªa¥}Œ’»úŒÀ׋Ôo_£îøûÍ÷cüîÛ’O,Ol–s9Öô纟‡€òuh¶ |õ¤¬ú\=3W. 9©¦—näÑC\³•5´L7˜¢ä±ô¯+:úÊ~|ÌÇG÷ü [狻闷OšóS@ŒRKl Äá.ŒeŽ¿¥ý+£0€0ZG¾z¢`_EÁÇøN¦44u™âñ1¶öì¹RÀð*`m‹F‹ûÒt[Ķlßëæb×7Iƒ›9Œ€Á¬°ÑP·v'pé+.ëÊ‘ò)Sk 5.³   {~Ì®ÀtQ§VHe-5ªqJ°€·†­½=í¢AÞ‹ r ÁMWSÇrâÿ÷ûíÇžpºÿÈxÉɈ¢#>*é/ÉR“2#]ôן±„¨A‰ÌHä@P€¸S§ ÊuÈ5{+Šö"¤WÒÊFBzAe¸GnË=•ŠˆãÚxäÔb;€Dî\‡ µ¤çˆ #÷OÍõ™lj”R40 À€ ˜\"²}Ý)ˆ %²~—?õüø°ë¦'ªÊ¦ ^F€k IZ5)¢£ŠR%P‚êMÛ ¥œbòzîõ ~m@u¬ ýùHç­€y©ìŒ+¸“Ö.YD‹¥µ«Ÿ‰„ ¤öë“¢Fw„ÖhŽX;&ä_Ö&À‰’0¬áê9,ÑÌ?£´ÏîÙâH=%`„+B$æ T*´´¦4iqÕX£&Xs®Ž‚;³¸¬BÕµ§Ò™uóAU¦ÄBW‘û’Óµä þì𔟀/Ì)äëú§ã{ݱ¢#?¿ýüÇ_^w-ÜZõÿôºþËýúí­çŸ\X=Ä–uw<[šÀ’£º`·ŠÁä¥Nv'ݪêÁ¸Ó¶Åæ+´w~Ÿð‡‚f@)mÎp¶x|º¹üÈå'ÝUÔJ)Ìøé%¥‹ÓƒÞ¥´r^÷*šºœ’&oƦ ópÊ·æ‚õ|EC »~ªnÖE}ø¾¦?P~ÖéS‚—>ÜûmÝÜëå!N~*(ëtëµ¼rÅrËÚ.ÎË$C¥ÐÎ'ßöÃjÃùU…OaáQ·vÉknÞ *èÊ4p.^Md‚šjÍÍ0-W†Ýj‚ùóu}B¤áˆ9Â>1ãsÀK_Ƽ§«sç i"Rž{n輟9î|âÇÖ/¸ùú;aýlû5ý³ãÅ<Ïþÿÿ8²Áb‘§¥B? ýtºæác ¯vjºRít޳èxöFûÜñ8×ô ;•º¤Å§ü8}bopD=ò¨±°pPEnéôRÍ 3æ0l!?ÛÓò\çæïüíàxë|{â·yßBXÛŠÞu!ŸÑb³ö (Æ Õ€¹$£è9µPÆ<÷í|åDÀ‘+OCGn´üæ¦VÕY•‹/©ukRÈGx£óÀ‘mI¢M® †ôÜ bbš;&1YzaÅÃcµ€T΀ÉIÁ(fkHR •(‰yŸdÍÑ:ðVöË…¶Ÿ'b’ïµ9~2žóT –Þc÷}ê¸ ~ÿÁMh6 î‚0\ à•ý%ƒeÔÓºkG„±,£¹K³7ÚzšöÍÃ:˜lnöA¹r¨@•fÌžCÈÖîÝ ¥ØrÉFN| j8saw¹"Ód¯a7îãÒš¢%¹2mðæV'ÞôDn<¨Ö« ´")MHÊ;ZÁ~§ÑRï…mçu1צö_ȧɥÂm¸Ùë«þÛÞþý°¨„nd‰d(ô!¾¡‹[ÙuPdõL&ÓCQ¹ j±…ݪA¢J@'«ƒ©÷)°–ôæe-»ÆMÁfJ7‘q$p¸2r£×ÄÇ|ß%Ö`1ù³ &¨Åæ´G7îvÖ-ï¦ Ü/§QÙAÖµ´6>ú à=$ í^óZç|=ÏÞöÀ¼s"-½(z᥿¾…€ÁÌaR„•<®ÎC<Øñªª¾†÷~l0šºýû´Í…–¦UögÉ9³Ïüvº5#:ê÷Ðûpž£oÉ—8TwlίØ` ݲY!ìm¹XX~«]†Τi=žÞ枌E1zc'êÔøú¦[.½xé³rʻ˼ײòGíépÆûz¶çï¾ W"XT·ä‰ DvJNJ ½žgÌÓŒ?Ų«®œÍnÇ“µ°Pñ}?W”‡Æu’cm¾˜ž€Óð.Û[cR!Û±C#~'8é/éa¯ä—àقʪ4?iÏδPÌØÿùÎ}>=?ñq¦`l%ýôsšÉŸ’ßrö£Êmê÷sÖOáI͉¾„jº§_fnÎØn^ìs‹H²·-ѽ‹Ð¹ç*¡)ºŽ-vÜm+¤H¦ËdÄZ äBVç¯÷®¹úÒ9úƒŒq³~4ßó–-€\ÜDË +›s§¹A’ÙW÷­½ñ=vOEz#MyÅ™a牬!¶‹çÌö¡ ½×L"{¡4oýžH©3Ë·ˆY$ÀYÓ`†ð ¡æs(=Ѽïqé¤â€_†Š^ꌌÃ@O[?!ƒ‰%[@!XŸ½K Åk ÊŠ t.ÿ,y¦NµgÇ¢šÝ|Ã^‘Ms!ÏÚ/sSÍâAÍU”ã›ûû­NÀÿ©žn6z{gz™UÇþ~°+ …Ì5–ÂeîtϨoê’ƒÜ&è¹Ð&Ý’‰­#Á¨¤@.s“5Ò Úƒ(IÏIHËBŸÀ_ç/ÇC„Øä*°µ`Ùð¡‚ÅØŸóÑÜ}ÁôWyæäz†%ïÍnmOó'ߢÛöJ=£)Üì_Â~÷WümlT Kgg/JŸ=çêËã ?ÈàlfÜ,¨ '&@‚}—_t~Fï©!™@-ÁRº:k¯xÇ¡ü6«çF7”ë¹g Hàú Û(¯ÙnwX³ìBƒd…ö3 ‹ºn¥Hc7Û[Ûtí,”‰+ùt¡~Æ,Q'—‚žT/÷–„vht%Vç2åÉ ¦÷£{€ólû†^püYñbMûì ¨ô$v¡Ÿõi|Ì´åCgDùò¸lðšYÀ+Àñ–s²Ê–uˆMë˜Ç\dÙ dŽ>Ó'q 58‘åbˆÃ"­¹V •(¡ ×þ*Ïd—ÞÚ—¶Øâ!Ш”Z}fˆ‡ís|‡ó/RZ>M+t†‚DÝœ½Šç}â}_þóüõÿþüŒÿŸ§Å R;Ô΀›*I¡âçyNwÊ”5L$÷°òb+‹{Uödc޶ #‡{H Ôù¨ì<>ûœt[ÅUBÒAï°¢&CWW ¬1/F[l"ÛuP¿œÄËÁAú4p„[ù=»žÞ³š›ø¾/aõ.éÎ ¼†EOEä¾ÖꊒC`ƒÝÑJV,HeÎY ƒa›V¢‚ˆDð7Ì­8£i_[eŽâ˜Ó—ž%Óúñôµœx(U#<ë“¿šàüÿ·ø?î¾ÊýÓŸƒó‹•Ýã×øG;oäûç½þ¥àÝ8Œ}ì ÷l‘—&¨Ytl0 .c9•Œ$BAsM¨K°· ˜¡J£1NÜ:óÕù\qþhÿÅ€Ew6vjKV&ä±´À(Á¶‚'ùB«–Ùù]ž37ÒÈ|¾ÖL2N™¨±ùtŠÂµÑ(Baâqh²räÍ,}]eš3"Ç´°DÕ|y%Ýß«§Ááéí =çzº>3›jïX¼ ôL(BA µ3ÎpÐÔí¼ƒ“ªè¶ý†æò÷õQðÓÛƒæ}>)¿ã ò‰hFÛu³€øh˜²v?™ÝɃÖÑeLt2 Æ?òÛê¿æŒaHçƒÀšW_€QÌ} ®«X¸3èJâ¹ÍT"(B ãrÄ¥B'ev/¢m})nàU <øœ~ÄÞÒ ØÓÃMqòó1 ˜HªQœ>ÚAØœâÙY1ì ºˆ›ylc-Kè*Î85ôÄÒhÊnE|­qF#A€Û µbCFñöSoy`ä=5S0©¤€ÈÉñGø¥ªïg؈­aK˜SÎ+̓ì‹KE}ÇÅï·ÏÙkbö*(ý„ôÃ&Ý[=ÞPF}>¥ède¹·&hñ—l[Ð$bžÊ†¸(Mr÷\ýBÜ𕺲 ÕtÀb´ë…ÕÉ Æ\º/¢OV͇ýГ$8W²íLÃUIËBìàzqkŽò°," r™QU©•Xs"P–[F2o¿Dy¸œyï³#Aꮈ…±‹ aů>úîwͼĉ!(PI°ã©)•#4ÿ)H#· ½Zoc EŽÕÒ þÏo#™ì9A®ê¹#fp9¿æ8ÇŒ¦f‚*b×'»û]‡=TL•µÅ ¤ž²ÀKˆ×©I“ÁPÛƒw1±ôMskÈnXƒù.°6 Lš/yŠ¡¾‹R܉ÛÁZ ÑR†q¤ú³ÁPC)·¨{ä±Õ[Óó?Ïo_âV=¯êcYr­’`ÒXcÒðh“ÊU·‚šH(=ƺúk²ªEýò×5E_ a­7ÎâB.˜.^Œ>¾o~ϯ½Ô[4ÙÆ.„Æ:˜i´….Pˆ^Re„2¢ÁÕŽ¦ÙÒsr+¹ï+ç=~Ç 7æÈ Ú „" ‰ôøòiæoî?ÑqIbŠBS€üùäg+éF  Zà6QB\ˆ AŸàâ8€õŠ JQ#ËÃ!ÅÆäÅì^™Úá ÓeÂäÞðvutɼÆòêg=ÿÙË·û·ÁêÛþ  Õwi<œ/ªb(zAKÀÜìšVfrGKz³lŒV:/Œ$æRɆF¥dÊ-1'ñ$ ”à.ı£‡‚«XÕH#Ua[A€o+B“DÓš*maÅúâbµFÙöúvÕq*W€6ª/ H‘#uÈLº _ â8tÀ#!Yå« u¤Þã5\–7y }òúIrh"<*Þ8|[tUÚ€ Çgº¾üì¶ÿþƓڃãEŽŒËn­D'àÅ!— µ$9£°Xª[3ÆšÅG˜æ¡/ׇ»¯¸‚é~Ç …7S±\±™8-«š;Š·¸€Ú©aTäŸ@Œ ÿ|ügÏîϰrzŒä­yÞjuô»ܦ¼^©µ“÷?8 y.ï³;>ÝïVÒåÅÌC?œ5íú<¾´ŽS,|–BX&—5ŽËÏÍu·ªî9ûæ¬[zÖaÑüà!ß«ß\«çó´F!ƒ&ÈÄX,qTÌ4EM?'k زÿ¨Æ%väÉ‚ïètÑx蔣KuíáG_+°ßœ‚Ì…‚ !ãÿ×?<áúÆiº%|q*¸}§b^™´ãÍ™“™HìÑÚÒ¬2¼bõK‚xù06w|Æfü×À¦.½¦Oλ¦ôa%ÜÒ‹£7ó (!¡V¨*å|ºld+su\t/’µ{íÚóæ÷×óþÿïè j9òÞØnç56¸ç刊Uc°U¢\y-£ÁØuLÛŸæZ€eBÎ.ÌÝc˜å«FCç«Eh'™X9œñÉ$ˆ{£D•çŽÇU€ MF„4™ënÙÊ‚Ì" IAÂÎB½Œ4‚ˆai7#"Öà×ãð¨QA[¨„àôÆ€$-šˆBE£íL[säZR½RöôÀi§˜—l­F¿+×)³&¦­äÔ´#`ÌÆ"¥À×·Ô_òWåË5]±åÞžç¦]p«>×#îÃÐùª‹Á¤ÅÅ”Ú<è·‰_ÜN?´ãò®ÆNF»~6o¯a‚¦÷¸n|ôåy|Éy:ûOýÅö9]#l=˜0‡‡g5»€”A°à™ÄóUâöl€™YGB¡àÊYíûµýþºñ˜ ÞI~ͬK¡=§¦+YûìUm¨–ø.Uôm J€Â1励*Ùâí´4êF~øá m2ˆæ^HYN!‡Ð<á ³ÕZñ2°ÃURjÕm#3Bëê5PF§Í ÝCC;b ÏD?n3€þ¼Fœ[ó`_|=ƒ‘×Eù<€ÒÆ5–h1nI ô×ýòýC÷ŸÜ×ѧ>ú·Ú|e©p†c€Kij©›(]àM;¥…»óMmµ˜ôJëajΣ,cŒ\tô²?,›—x„J©>D3bK 7§¨ûâëÃÿý¿ÿàÿÿÏv÷ Ýã7Ç6ºñF68Di\A…gõO°ÒF¦I%©|„"N%Å(ãqÕ0PLÁÎìÄ›jv=Nt®ûr™6U•1e(€u¤ƒHÆÕ¯6Š[‹ðCü‰™juJ\­ÉõdßóöU÷^—ñ›Ì…E|•Ì •!b¸š`%†¤Ær3’Ô ŒàÁÌÚ4K´+vDëI¦È qªnBš§g”gdŽÉþÆúj÷>NŽÅ2ˆÛ•"àñO•æóÖ¿ù—­Å¥×»ÉOø|:·å<ê<å÷¯#ÞÍ2êKÒª ÍÖ€hÃ&øh4ή¥î^§Mðt ëwvnIÁöÉpð5ö@EÎ{^ìó^Ÿþþ«ä'“Ý37g†¢--‡Ô {ɿ逯æÂ²º±™8Li (ð€Ú93N'4 VˆºÝî=øH£eÒQBëÇiŽœ™ïUõ¢½où%Õ`KÑÒc4ßÙq¬l†Û‰U X’¤]BIpQá&Ø ÑeöØòr®ºèbYP4nV^”f©XÝFVš?w=ÿ\¿»C袻:¯¥¤míP ¤,NpÃù¸7ý"ìö äÂq´D§hÉÖý¿çÜ¦0-]†ÉC£IOz@¨çQ7^…BÅ7NƒûÀ¯˜ƒôv_`xÖ˜ÙïËW2ìÿìÞVìó’LüÍøM^r{j}蛬1TŠhE&2œ2.ç>o$*WZÙQ~”ó2KÄÛ÷¹É›2Ô´ÝMóÀ¾‰:áÏ>±¯Ä|}l{È©|ã]:ƒ¡i˜Gê¾Ö¿w<é¥x•æk`ƒ;“ûãYHh=dy+¬fmžõ}–ÌeS§sŒÚlÀœî›pÁ ‰ö.ìâ]‹C_8”uažG¾ç,#@YÙUfeU«-hH(”x@ VÄ9ëÅ1ÌÖT<ì%EI)vF¹V¶S S8”nƒz\Þ-­ªe$ÉÇcöÊzj,uy±òj9r‚á«+÷cÄQ¶î¤É:9ΗÃk‰‹-A öš˜7{²(fÕ-ÕìÍÚ Ï 6žIËÓÏ3©ä¼Ð[*™¯«r*WÉs$ŽôÙP«^ÈÒcy?6,Çs¸²@R&ÌÊpe-¥D)¥\^Š¡Ìa&qAÅb[U-ïÄÔ³óúOžO¼Í{Æ´R0êb4(D-œ=Ëuóq)„‚U(VæµÞš¸† ó?°4€ãb6.–b©`”á„Ó};G4Ȳ[ëa¸©;óÓÅ™­ŒP|zm´1Üí´™³#¥ë Y\ …VÆŒÓÓö•²w9féL–{ÞùH¥÷ʽ”ã†õÚï'–:ëh´(GïvYÒ²Ø k—Z/û°Vq”Œ&é7„WÇ ºí†Ð2ë +í noÒ;ûÛÿøyiš¡:I ¤I‘°]%k ó¥GÁ ­ŠYÿÉñÌnûà?9÷02¸ñʾ‡ÝsØ»v±ÅÆr{‹’ˆÂ°Å´\±`@— ¶‹R¼(D„fð ¶VUåyk´m?´úmëÚV€Ãl‡l¢ ÿ€ŸþÊÇQ"ÚöŒÚ˨Ip[fûÍ~?tfoä 3„C˜Ù+b¡KH¹p¸­‰(ÀH³UÔÛŽar¢ êX9d!F1*ÛÍ‘CðåÑuí{Ô×)zŸ:/['ׂ·Õ§ÎEVÑ©õ¯,›CÓ•·&v'žœµ Ln¸A£Å‘2Y*‚ G3šÉ›)c½|V9Ój*JhÄqÚî××YTUÍmÙ üÊ–v«ñD“ôØëÈ(UtH6øµhIPL"™£f\šC†ŸÀ¢±s²EŠÑMšÒÚ!Åz÷£egÑØ,[Цù Àڜ霖fðªüs£­m—_ê¶»–²Ç*<«¸OĪbF yIòè WŒìÝ>Øšç¼å¥êøÿúúÛ€˜îÏE©} )àšcÏ̺†|LÍÂNM÷žÕ S’´@ œ¶ž T^½.ªžMíÙ¢•¯ìíÉ¥ì˜ÏÇ=Fuùðññ'¼w|k˜^‡?lòJŽ™oÃè¢.A}©ã~¯%UÓyŸ“÷ÖGº¾ú+fÂó@c%[ǧrlò—7£€¨ûÎØ€•ëx5g€¦®³¸Ü£òöëÒ=OÏyñ½Å߻֧GS¤–¦eUµ‚Éë²"SÞ§-z¾5ôàH#·§Úbµ<ƒÊ.ÚÔraðñkªÊw«ò§DS“†t[Þ9é iSþ½4ò:Î?KÚÛ0ÓÖ±×ï‚/GwGrªdu>a…X ¼ÛÈ °¬cˆÎÑm[zîïêöëOö5P4öþ@ß/Ð}Ž©•xÆ‚{Z–AƒÓ»kûy™º}1b4׸ ô"È!&à"×€þâqÑ(Úñ"÷N`E$Ë tX#¯f A€ÛÈ=Ðçäê‰Äé$&jß‘bB†¶ \$½k. ÔH¿8n`ùËJ}Ã5»Ž@Ÿ#zâX‹µö‡@c¼¶×½€þ÷Þä_|Mµ‰òôìóDNh¯²ÚI<øÞ§LßwùëÛůž£ÊTÁÖ´„Ö_ÄàÑ}xNIknk:QSªæ4œ€\A9^t]QSSŒI.«Þ .º¶¢F›éå-âô,Iâ[ ±yIçNíKì¦aÀôç ~áœâ¦Ù6¹P¨Ôí‹û’O ZtXu®«Çj·"€mX€„VÝé¬Äª„Þ‡~Y¨±©B'pL³è–íÒݬDSz©C™ñ”†Ã÷Ô¡PVGúAT|©üÊðvÑ‘ô¸·çP†‘Õö,B9×xùy’1Ó{úÅzÓ¢8*P e%˜°îhäŒ'B*àˆuÒÑl Þí¶´—ªÎ©ú.ß<>ç'F¨[ ØŽÔkò@/= ïD…Å”fÛg–¤Æu* L¤ÝgÁyþeÁ­ØA3óê{wº}hwO&zâtËeFé(]ޛИžñuyÝj! î¸gŽ+åÀ†Êw›ZTZNóVy[ÛÔ—uVØu¾®¢ËæEe¾ö(·u±l–w‰{Ú¢ ɰ>í½ÞnÞ»YëÐï÷ §84&,ÊÇoâêø]§%UÈ‘ ¢ì8¦lÌáß}ö;ØiÏ3Y’«ûaLíØ™yq¹øþýëíñg¹1gS#ý“ʶ¿ÁÕ<Ç5j7ò’®µV¬öAA¤fh &yÍ_—Í:³Ç|†Ÿ’oŽËsd}Ù^n¿änÙ ‚j2kÞØ¯XhÚݳ8]žQëç…ü"vÅ×íBÔíà€DÅ Z+aN⑪ì`,ÆKõgu\3.aíÕÔAÐ.ýæèóDW€e|¿ç¬Té ºª¥ÅäŒÉŒH!£êâò’@ Æ@©³ nZ[—³ä[,Ý£\Ç6KM…?¯à§?ýÃèG5ŽZ°ZÄ@hKnûGöçÃïŸ~€°¸V¼jd6Cÿ&ÕŸ^ö‚pžá ’“XÞJ´4"&Ähž=;2^“R4 xsâyr†åRÀaÝž1L’èüo§ö§Ìÿiü41Ó’ÇèngY©tI¾+Êð(ÈÛZh³ fæÄñ71­nùB,þ ”ѺKC²ðÙG®S™‰$,¢˜"—­órü(J¸pà- àfÂî~”O䘑A4ÏP‰Ù—ËJæÆÝ£ÙŒŠi,“ãgê3;µ±p (~Æâïªf»?ô¡åݶ‘»}¹ýe'üVßøÏÃe>Ö}:?µ¼~<”_-K7ȉGe ¹ˆ@#9Ó‰%sYîD–ÚBlƒÖ#ÒücÈ4_ð¯ÏßøhòÙì"œ›É!PTñ&Âù%ailòÒ*š–[$íFQ±F Í¢"ùJnÚ ¶ÁÔOÁ|ȹÚö>EŒ1kÝÀ= rK=+Ø9t­iÓ0~pY–í7˜ ôö ‰2säpˆqo#àœÌà P[pk4rq@©)(öËú¢N¸a&¸¦Åhï3ñkܧ%Ô2sãì~´ÿíòm|T&n¸ÃýKú°go0©Ÿ ÂÇ=,y''yF3@Ýë´Õ\ ƒ3…` ‚ØŒZaˆŒè´L |ñ…—Jš±kV úÞ¯ï×ÿìÿ_õÿÎ &3`lB"B®Šì$A$²‹,8;‘ÕxØ«_ZF¯J´CÊUKòjPÎ>ò ¨7ÑŒ}…ŒI-—Õ^™ ™Ó¡©\B ”tª`SxRm9šKh5°“c5à׫¼JþéÞYmï–èQõtŽ¢æË­÷íëXo­ˆn[êR§q#i&aœo¬G ­¦”á&pRÇM;í not!ˆ¡ ʃÀîȸ4";µÏuÀ#=ç¨mí·.±ùòŽºº×D—-Ë©ÑÆœÞýýôóM³J·£25xHÕL(È%°`†ýŠté, jõ™%¹, ;u#ÜÈŸN>4“Ÿü–{OŠæYyR¸l󤿮¶·â3Ê7<1Á\ñ$lã€*{A%ΗÆb„PSQª NPókHPìÐÂÖ‹È%4ŒbƇ:´R/Qšª”5®%íã6cgéyºv©AÔñå°=ÃÔ~OJ=)d®”–Iˆ´Á¬CÛé²i™vªäB” !‰xly³……„d)«XV‹Þ–^X;ÀDC7ÓfWÚ!*Ê·øVSj¥^­­ÝnT+qÃPw° Ïê±ä¦uØL¸DȰ7_Á½6÷1œÔvÛˆ)ÃÅŠTùÍPn/\ö²ƒ^Ðp,æ¹Ã›TŠÏ¾“CÆË­=ÜÇïnÖw&§šQD 5³LnÃ>"0ž–nAaа· m3±[Ä2˜‰&ÙöE7uÑEòD³Ì®/,Yv;ÜócfÄ0@ãT}=-ûý3n ƆOØÎà+[<‘¼„ç,ù0?PQ޼ÁÈé¹KpŠìée]÷h;†1ÞÓxfΛ‰rì±f¬»OœÝN{ôD$›¾Z)`Ù!Ë(ñ°l¨î#œ<¶ Ç|øŒ/sé¤ê I(Y“¤¨Œ!•ÇÇ€©(¸Oôráyy´[m—pÙ4O†¯’éÕÜó²Ä¸5l] ø¶¶F£µ»º%™ØÈ1Á&–Ããv#£OdJÑäá‹®j¡¯²eeU„skÚ®Ç~ÐVü$ÌÄ”EÙJE#RLNp} õ‡”;µº„C.Í&]‹K’‘*a*% ¨D©dD3xfƒ_úúÕé 篻L-Æ +¡¶ÈÚ³®~ï‡÷ÿ¼à•×#ÚüV’t6¨ ¹µÊ¼±º~Ê” %QWä*G{]gÔ‰Z•cSÄQ2‚²k©$Œ°´C1)Þ£¹Zj4 ½FL@U²ÕÛz¢‡ÝÚ¶+]ŠRf­ãJHª¥ŸÏ<çÎgdÚ±d= 6ý”Í7ßÛþ†oiiCe*;°°µ1¢)®eÿ~æRšL[&›kŽrÅT/©ã}< †vç0Îuãó~?~žüdnî“‚q, ›L $éÀ¢ª  €ŠUË?ó?Dý_ø/%œn®2jZÑù¸²SòwZò¸kîªJýØ>Ãxçø÷üËì±÷מޞñ-ªšfÌ$s\»9+×+»ŸÿðOÿÿó¾Ïfn£7²ÜÆpQb àˆèI[üu}üóûKHèö)ägkpÿýéŒë+CÊmù£Ž…óÚ•…8ì´Û}?"®ØXõeZó¾>1Ï®>?Ô[£¤’ìm‰·pºæÏrðpsND–]¡Æ…á}¿Iih‘‚}øˆ«z~íœÜ|­â‡z:ýÑÅ­’Gy+rb]|Ê.è¨c€;ä…T8p—|i:'•ÊéÀ_ý«-Nê‘¶·@o$²ô¢ç‡¨JHBLaË`ŸK.eˆŠAÙ'ÛÐ *0®¥i½9h”&;à;_œÛ»3¸È¾®™ƒÍ$)ë¤I^š†¦ëŠÐšÌ–lší M¿¹LÎ8ÈT]ôGmZä&-¼L|*.jrr?† Zb¾Ô…IßÛêéùµÞÇQjwá¥<¾'=îÏÆWv®îõ)çZÜRÈã-׌Ý=—d¯â(ž:Ëàq¨Ç ÄÅÝ«»j{4»­ª-ŸóÂ_›:e¹$—„ÑR¶ã¢D¦’õ@ô7\ZȺTÿu§ÞH¹tÔS‚ès½Y#û/§‰_-N?ªqªÂ™Ìþijœn˜›AbàjGµ5G2ÉsÈóÝtr>!ÊcESöB¸zS¡M¤Cz@؉:£Åº(‰ôƒ”4½µ»Ë¢„é¾Á~–ͯ|D{²' $ ø|þîØ¢ô*ZZ´Ig¡Z4'|üÉ>âó]Çí±në~i¯R yâ5 2ªqé€OÍ%  q[ Û—LXÊE.÷˜åóîÑÉ¥ùZK?Ƭ=t€ý"Ò¥S/°N.žÊNœªÄ¶!/ÑáP*±8iÃΓwMàùü¸úùÝßV{Ôצžýåúž?ï½7KÓ ýLþF Ùï6ÿØþT›8sOÊU’ÕC²ì̻›9Ó©£Ét´7Ý iQ3ÔSÅgøF¥]ñZÞ/³Å±¼¼†*"&DÃ’N—9NfÀ;w«³üÓÛ%‘ùƒ„ëï—aj»VBÉ).{¹¬Aº‘søZ¤ÀµÉ[?÷VäÖ¨¿ØR(kçgW´²Yw-w<Å÷ËàËÑ4çò`öe%ŽÍ‹Š=[D“ì^§Á ú3`¶„BSc ­ó‰/"Ì ¡ỴϜˆ[ïÒ[ª]þ}йh)}FËi6‹0è0œh 261ŒN¿N žÖŽXmÒ®€²—è&¾ £8­äLO%5ÁR}T¥ÔíénUíÅí:îâfÂ÷÷)!ÉcùtÌêRq¦þ·ßòŸ¿ÇÂÁBà ÃS½œ»xÝØóЙѱæ"Þ f»[ ”ŸÙXÂÕ ©q™T‹’ôKž‰Y¯«®tŸ³É®I*ÄržA( o§æ5÷U¸©Æ^Bp%tZX+Ú·Ú§½O~au=¨È}8ÃøœÎO\ò4ÚÞ1›ê†É 02²ÄÞ®Æwí ˆ”M³óÚJÍP}À¡=|¹+áùp(š½j™äsƒøHoou@éoéX±7µ¤W}•›¨,ª½²ZÙäêe/Û»^²S ácïëkQÀ œ)±T| ¹ag h)HBiºtŒ(LCÛeÇp茫¶"MÜjŽü,ýgNµMn UËã§ß{õõõM¾WÝ{­· Kƒúà£ø&=I&Šea2GB3Ny¢'ÀU¥5×IU5‡ êæù r3^¼lmœ;ôÖÄSÄ @³2{*†K|$ Ooñl\ˆWßUì{eYó6Aˆc˜£¡v) ;¥ct+#“"È(%"1³(L¸¡6¦$'%‚i)Áäs×O°pû(!Û-/¥P Ô)=ÛC97ÄðL )?À·6NMoÉ[šI§ëLGøè¡¡æÂWä–6;ÏbÐ%áÀ%ÚYÉð«Å  û–Ž_ÄÇ(Æé7ê ÿn¸¶­~39FK,é;½4Íéoúú/Ø[Ù>>~ª>5´‡~‰ ÔBݘ†@¨‡cETƒ8Bb9)=êGlœÍ à‡ºõ_²æí/˽%ÃMâºõÕ&Ð!>c(ŸxNé˾.Ý‘¿‰Î{vIÕ…ä±{¾Žk* &›l.R…z ¯3b÷! 3© -fÆ\ÁB‡ô°¹õôv³7·;¹ïì}Qs§Ð ‹bbYU „*Êc C%¸"!Ã"KP­ÞD:N¿ázo¼*òºÚ„: gÉžG"ÎtåÚë&…É'm|k‹GϽ.;WÝË ÛøÇ÷~Š(‰§ò|%F–ìPÍ`%f°ztjdï ÁÉŠ QÆÛç_îîWKá• ò<áC CÅS\(\Vö‰ƒž”óô[`Nˆ4¢ ˜Ne°§â;ˆGÁmAÎgŬG©C#TRjrÌUÎÃ,âV†Ì%A2PÀ–²ÀèƒDûXNñì·‡™gÎ_ó#æúî¶:4ö[q:ùÓŸâ»Í·ž=ïž–KaQbI(ÄMH‡€T¶a Òç‹ÛjÖ ÊÂÉAÁS«£ÊÐñ“ lÕªÄ@_5ÈÝ&ÞÖ’³Î×ÞÌòƒ21¹NrÏyîãÙO˜s8m’2À$°]ÄTCk’«¢0!NÌÄndFn©âL¥¨5T¹ÚÀ‚Þ´¸®Rc¤ìâ o»z¿òN?>¥8…Xe-µè¢æ ×ÔA©“ä™`±ËfÀ¡•0¦P”»Ð­²M"Ý™nÝÿ.qê´Z]×=ar ³"C®Zquòmœm–8]>§Ép<<°ªþ Û÷[|Ç?h\œÁ˜È‚Ê•5g{;”Æ[Yøúx<ßFç Í«8Þfë5FþO­Á3Ðñàx—RöúJ—¹_75º¶Ârd¡’WÇï¯ø¡07hOK{<6­ ö*ÁÅ‚¡SôQWïXùÒ\MåþvoÙ¿ç5?Ÿ}n*Ž2ÏIÓ¾´ÚœæÄ…3€ÓþxV§?3rËOiW‹¯ÕüµY%zC‡£f9_ëUd’×3Z›Énµ˜`sØVÞWîó‡})“·¯&>ðó5pA+€—ÌúsÛyû“n뛫Gn¥É…ÓÚ÷4ªw”Ñ*ûA"r¤¯ýÄè-kþ?W:Æ~±þ–®¶žG‡vÛ%ä"–]b ¶Éu¹Œ€;êéOØ}ýmë¬Áñ /¯û¥þÁÚOþš&ÓûçM¬sûˆœ>”®&T³"òš½nîq)M »úG8¯­Œ#Ùéº,aXÅglñ¥1_B}_Ê3Ñ' xZ>—Š PÌ2í–GT$X§ ÙM«î欒@f·R‡áºí—LWš¶H‹nœ @*ˆ\TÖ"Ô]é.p •¤lFÈ‘©@2åN Gû¹"’SýÓäa^w¦”Ùk •Ø5JqÈÓþÄv7U.ì¦×[…Q ©ÂÓ*C#‹¸1s„â¾EØ™LzÊU:lcqµdx• Á#z_ù‹ºL^„ é`mu¥¡Ý¸„ÁRùžÀ?œ+9Ík3/*p»¤S÷%Kû¾[;¡áT]W­+`Ÿw$A+—G¯ó v;‡Š8U_›: x6óÙ#òÕ86ššÅë›iÖœ1 $50Üb‘³Žc^—IÜà#ó¼ä#ÿL`c`Š  Fáœ}&oj*ã³óL2/ ä\¥û³Ú¬9B&öy¼çnJAÛw϶ùC'”áJ&£ïû«Ý¯+¯-Ë{³W\6µ`iEÍ\%)0Ê:ÞAèô¦­—ûγÏ,3a›¦^æÅðYI•=`ÂkB˜5‘»cÈhVÌ‹¨ÐùA¦£Ð`gÏwö>ªP_xE·¥6Šv*ÕU£”]H B.H¡ÖR‡h`†L8“ÂçЉŸ(øÛ奊Kkrštôä~H%˜pÞ‡˜©Ëo’§j¯è1Õ›g…’ûõ5»ùÆ[ýä)ã-2€e¿%¤÷ ¢]*¡èŠVS´¿coÏ›Uj¬×ªæùñxŸÞG‹‹;–rÖ9ÉÃýÊF)ž·ë«zR*Z|¦ŽgÆ3NÚé½õöʹXê¤E—î#¶ÔÈ}êðª¥,Wìš0ï1^å?• jCåBJ0Š T{rl›éä ¸5ü’¿#ù˜} żˆ} 3.ìŽ"ì´ð!6vpÛñ!²mÕ•÷K!L׃Ë÷(3ïý–³züúN︔B¯Ý¤Ø÷{^PâNŸ¦ût(ܸ¤leŠ|u_m¢«™=»+fUqô"¨©V–$A(é$oÖš:‰–È›&„1[¦€Éì=Ýþ›ý{îïoØç¬ç'zæá b§¹ò€—µ}×{A?†fçqŸè‡bªÉú¹Ä3a0_* ½A›:&š¸´€x¥y³»ÑÐ:hÌݞ\^‚;œ¾ä_J §¹8hé æÙöÌ¿PftØÊš¬€BQ!™ÞÙi‘Ït€…ó 7{Ùn~%.ð—^¡d'V–0®R+qó¯Û?Åéñ:{NC— /ž&ЬkÎ%Ôx­ÔŸuƲ_?ì.&…•« ¼AMÚè™2älÐäAO}?½å‰=£(…P2⃆&:9‚GûÀ,¾ä§2Y "¤Ž¥øR´ÜÍšñNôçä×/+~˜ß8s;àÏØÇâo >½HDßôtÆ7kµ¿æ3Y'J$5œ7‡ü’Ô ¤WÝ{$ŒbGpÄ(šÎ¨ÆýZ~«Za´çì, gY$3–-K;€ònðÖ»a—WÿÙ;‹gÍoÅ×Ñ_À˜Ñ½y ÝÝâö ¹™Ô~%/š^{±)Õ¾D°"° BœÝœÛ$Hlq3›ÂÉùx³à†\Ñ6àNr/v¬G%hµE]Ì5½‰NGF#ͱZI>(˜çù€ÙJ6 ·Äb§dÑŒ`C @ÚkÂI¹£ð¯Þ “$úu«ÅP à¨"}ÉoFÉFïHÝz¹jìô’ž!Bwa¿¿ÆûLœKŸ'ÿW~3=R¢u/Ðßíýjü¾†ý÷ÐïSïÉNb‰Ô!ïÌoLO¼)¯±¾I†i=M…=ÎÀ?‰ÉIè8ÜZÆ_(3pÀ±º7AÃùÍÌl¡@‚9&x ÜñcÿW•]FÖ¼•쪄UZŸ³çh¯§¶c1ý<¼Në×ËÇæª¥g`fÞû‰qº™ÄÕŸ >oÒO00e ‘@àG¹I¨B ¿ .Ú +tWs ‘,Ú ßXXç3Qâ&ó¦œÁþ^ñ½éšty ºk „Tð Q)tBŒ•…H)À×ÀŠ9‡9REFP ³Ð‹ü ‰*ÃÈ%1‘ )äø–WÃßwt—ÍÃ4LX‰}·MßAk\˜KÍ ̆2pŒ§n·LÒÃÙg£à¨­Á¨·ì?‘À„÷Ë,³~¥¦Â^ôÛʆãR¡¸b»wšA5®ÝÔ¿Ã?F²­Ü›q©Ú3ïÍÃïkìc³¼N.~rÄŸæPeÇÁ ƒ&ø’Åü{|C/Š}d·„‚øÑ^Q'$?f2Ðzñ©9ó’`¢2¦Å£[á¾¶ÓGy(sh[móh›zµ´M3”ÜÓ±G÷EÞ>õðç=å÷¦O¼§BM€³…­ É͉Ⱦc#¥¬e !;öÊ“;x]Oâ˜^·›s?Üuçñ½³fœó®b(4-‡R YYÅŽc‡]À¢ Àn`Y$ðBpÓ4ªK%­—3¶,WXÑqKkc Ø{jêÝ–†ãqyT‚5z£Þ[.É—Îã]7oœlš­Ü¾Þÿådù¢j®àduBÜ"x€`O}t[¡÷,×DÊB`@3d~³óK¯8`äf{”2\Wû?ÒÁ~ÿoúé~õ;lã×lÛÝ×ù®j]6¤!Éa|Ø"ÂCåS=2© ¡ŠU¥—ÈJÜváZÿD‚Í)‡ô`a2U4XÄ9x–ûó™³ËI’élZvt—ˆì©BPU»„p[j¨0ÆU½øÑeu„šÀ…`kß^UÚ@Ò¨ò¬[šŒGLÃ#‡‰àPb–üAIª¸‚•ªŒJ‘xBÇó¬n±O|ÜÍ^Ï‘‰ŽÔ$/APŽèlse%{è°Ú°ìÊšé²Ö\müâ¨ã“ÿ‚û—:ÝX¤(gÖu¬smàUKÏoûÁðòKÚ1P³[KûüßDëX5Lµ0%Ï"õ~"G\÷UßÄ&èh(Ç­#t×—Þ_ÿâÛcOߌ½j½UîF^1Ð]D*…©3>ï'ížG¾éù¦´ëÏãáÚTC^`%íw¼ìÞý‘¡ß½Ób‘])–ÖWš³ñCýØŸžýþ÷>¥W©ä‡ž‚wñþþÕ±í}²p?iŸüýž"Ø÷éþecݸãÎ\UøJð:PŸ„a¤ëùíš÷ZÞ†‰½{J¿ëŸ§­xy¿.YŸõ?ìsA²ÄAG½ÿÄùË×´Ù–òu3¨d:¸(8ïì§ãWòÝ`³½ïÿÈ×özûídÛ ·wÙ¿PKm^Köï*•DÑø{R¥³>©´iú>º!ÞdÞúý ‡ÒÌE´ÑÚ¿oýlç…Œ¶˜Ö‡¬Ø ›ZÕÕi-”³?Ü7R›8ë4'K~÷Û¿ëØ©ó¿~𻩋ÉÏÜp€ÖdÆ>1Pb"j-ÏœèºÐ•ká}úd“–ÂQ6jZ§.BHEW“–þ}¿åþö½¹>¸Ù1JÆÐ.…³ÙÈÝ®ÁŽcN²¡K C’HÔñZì)4J;c>_Ï%Q²¥´¦ V…Ãù¡½­Z ×¼ % ‡ƒ(‡H·„R˜‘3Á™0i]Øô:¡,€\h9Þ×üà|4h·½8,þÿà/ ‹Œiì”pï!ô1G ˆÛ^úöŠö yNìACÒH[DÂéšfjÀóþÖs§¡“¶zÓÇæ£&ÄÇYS;%ŽÀ1˜cQ£:ÑMWŠûÙSé:?àéñ#¨ÁXAíÑîÀÕžIq±f°,MÍ™R<8ºz8)sS†ÝYåšðv¼`„‰]„T¿(‰X‘ ¦+çl˜ÏøÓDövnßýöþyºÿ&X¢¬µVOôÜvåQߤ ïa¤È2Yö'à¹æ­þË­u-‹M³ÞvJ`TXˆ’(Ÿ [1§4ê·Û„~£šqðÍ \ÕÁ-y%wv ç’­òlöžÎe›²XÁ¾Ø¾('Ø„ãH^µ…)𷏫îA€Pt¹%ïHlè@#3) Ýbpš!œ„ó|ر½{¡¼/â}<½3s@§üV^æ΀°J—íøwG'ª²ˆ{©¢å€+>·Ýr·”¾¿@â«â_xƳTØ ‡Äó™uÚZge°@(Âk¨ÐÉ]áý^&Zg…·óqÒçõƒª/ A6”ƃJ\ŲW˃åÖóªJãBŒÑÈf3'*ÑÉtL<ì™~Ë—Ê¥Yx M¬©šò0X@j¹ŠÀAÓ0èï6×ó“-]ÙuvΜZV“ ‘)o %-$¤ñ§:ßë-¸3š‰¾«þ6¥öh²Q÷º8ªA8–ÃÅ"ÒXnÁ›?ºÿëÙ“™¯}…Cðës']D%•w1†ë4Ú;…vÏ':¼°HãÒ±Yz½ižLZ´¹(Àý¡ÌËk¡…ƒµ‡”Òº†;QI¶ŠW„´ðÔ–,Ù)o~hƒ³g'›gᤳ$0ü‚ufÄiá%Ò`gãAùµdíÄýœ¸ªÁ1ß8KEð$…NÈÍôb…Êò;ÉOÿs8‘¼—¼d9/# ].ÝÊý9¬+Þ¡žã:pa~Õ)?Ô½žŽÓþg<zŸÍ=Üî^³W1PÎZ–@tÔsfÊ RÀ^š±œmS8ìˆ6#ôšÊ8‹¶³ Lòó쉦¼ï]ïóó‰èb(H’Ä$®²‹ËöxéPœ‰D®I©ÒºD» ‹}ÚóÅ9‡2 M,&ÒŒÀŠÅ‘xµÅwø|«(&“3!ë ñγd”rϨ<Ï&^5cˤe¯icƒ±„TvÚ XáºuMúÒJ¶Íøj®±àû´<¦ƒz_±{¸u 2“à’³© ÊèѺœðÕv)ΗyõZºêrwèÍY4ÔÌغKö‘šÅŠøÐbe}ÕÆ'`ÃÈ¢ÔÒ­áH‹vSk¹aS6؇Û÷sý¾/HÁL—\½S®vJ’£~¬§¹íÌr“f?ð·”\|r±vÉbÞ+Þ·\A'C’¿g"°`0J ¯³éÀ<‘Ì^ͯü°Ð‹Wa8 !4RvIÍdòEã7XÎ X²Ó¦Á‰~‚Ë_ñ=¾_¿¸Ïa1»ƒŽXÑ—ø b“:ñþ^ì’W¿¨ð )žúø,)ËMM|Ñ:8p‘n³«w¨Z‘ŠXÉB¨ƒˆÞÄpðììöÎÏà™` Žõmn ËÀÒ¯™ËàÁ¶Îú4;Téí¾ÊØL¹ªôy°~t¢kCC¯ë¨æ5Ÿ½ï­°v¹: ¡Oc`¹’*4„¦mJ ÒVKjÚ;ÚD•l…;@Lû¬As°_×ÿ•þƒÐüTÎHž;aÏg´µ0œ½Þ»6ãâDº5±³ ÑRº•ÙT™È·Ù›Š÷Õñ1鋻טÖ+6¾˜…ŸgL¨MsirÁ˜(¥qz£÷ã¼Yi¯‹}Í\j1Yy_j4 :êo²#¥3øœK¶`$V[¨˜9©Ó‰‚P,Jp©e"X¶ø›P>(+AJªÌ¥]ÏÎÒQ«ýÁnoÝ\ÝGwðýäß»7ªÛn@_‰æË–ÒkWΟ>Ö ™65Y ¥µ¼UÈ_öZs™§ ”,Drñl¹<ŸÕëB—{4'¾ØØ|DJœ.ùG‚`Ú$›¢4’®kÏD×¢é)}µ¼«ãPZDçŸ-<˾®Ê×êû”w<ÎŽÒ Í¨Y‰1_HEZB"‰ ªH#`X¿¼·ð>`}^N.í?cÆÑ­Ÿ¿®©<&Ô(uŒ0=Žä‘x:ùx˜zvgÃÑóúæèþÖv’–M]»ÕÃwðüèðk¡>ƒâ` *ÀBKÝå=ø¿yô¿^¹Æ…ÛfÇxMüjˆÑçÂ3T°é;¿¸½aAd$uM5Ÿ±ìÉTyz]’ ߨ±Ôx¡S‡¢‘~#e,]›1±1¿šs³éQÞïD> ?gŸß3wŒúØ­kÉø pfjËݳEýØ 'ìf•Ͷíœð•p(jrq<ÈßÛVﱎaíÜíÉúLω;PçQÖ]ÃP-¹û`*W½éÊß›cŸäõﻬn£Õ"ºòß‘ú5°!€e"S< $©‰æ-ì¶é½¯Ÿ2ª‚ Yâˆ&5VZgÕš Áñ÷ŸïعÛüÙWrž¨òlímÌððÀ°«“}Ýi^ªv&X+²r ¿®‹i>ês¸¯Á&¤¯XEûÂsX$ÂÁÀœÈÂë÷µÀ ·>åÐá1¨W‡ª+¼HÖ6k…rpKÃɨ.ÅfóÉ`”£«z2³¥•ÀÒŒ—*b0P„ Ž0.a"T%m1<´8놬E«39\+ÍúÏþªVø¯ð÷Z‚TŒ£%õ³|ö¹ïÖ(/î^«^v¦´@‰4®ÄN tUvyåu0‚b’ÕA®RÅ*ùÜ!îCÃø_Äþ3»N‰Á„†0†u[ÉNfNÈ{dc7§gn`&HZH rz½“áÒã>µ®Ü¥Óˆ¼;ý‚Üóôúºp𕜜¦lWܱ+—H{pïÒÀÃe€c<Ù˜¶O]MA9×cLÚöwÏǦ$̲Ï3„æÐ÷´¯¦kžS9“»ÛÆ]oúÇÿ¸7³£S?TIep4”ÒIjizWE‹ë±#× ‚ÿŒµÅ/Ž«õXã”…Û/8î™ÑnhÂÀfµ ¬Š(t *¸U –Bˆ{„É–CO}ë‹Jÿù9ÜœÈãùÏÇýA9?úq]ÌU.÷¨üö.?>ÃWÏ¥þ´žß_ú\>ó[ûB(†ˆe ¤€5IYä-ô Í€P“…–¹¶`S‰h "-]¬îëßɤ?ÿ?ÿjþ<ï•t×ɤÆa=?]/Q’àQÔš j×Ú V2˼AÒ0,¸Ä–©³Ôä ”éZ›žt3gg^¥õyiQÃÃgÍ8O4Ö‡ÖQ-ŒE F5K­š:-#ë8‰ªTí4EIå—úÉï­ ÝÚ"ã€GF«®VeÁRµDk;Ðù:PÌèÒ¿Ôkÿ>Š'ˆŠ]àæÃ€Çª’f¬>:tŸuÖ¾þ%kîál¢$¿%¸ ÚXJ³}Èm»b¤Â† `€Á/”«jŸ(¶¡ÿalÓ&†®èí‘ÔSÃüÅsi\þÒ×Oõº6A´¶Ïg¾ŽŸû"Ïí‡$gkÊàçÞO~ûú@{{jG 0­Ög€+oóú:†”йiWð;”>¢wס©ë`}â+IéÞŠT^ÔewW\ÂCzôÚZ’Ù¬TË@û§óÁXßgö«Ñc£*ÛÚS“[i½õVáo­ëšÝw\ÓÀ•ÛÕ†´{o¨À›ôw÷@ŽÛïßs£rz?¯ŸûžÏѯZzò÷Û@ª‘m›÷çŽÈiõuŻãš§Éb§îóšß¿ßÖÖÇÿ—‡âé`*?Çk¾"0 ËJQÍÒ~´§?×xᅫݣr=<Ç>zçóÈ=®O­¬ÉS9gùŒäؼÝÈËE\ðòIÏv׺HV.àŠ,jèÄ@¥ƒÁ¥ tÐáØ‘È)s;>Sª  3 â: bµ.ï’RNJ.hA½Ž9½.?`DÎaøéS_ßPÁ‘M`— BšVõLbb¡JghžíI5Y\Ïo¯AIv%V¨ ¸&n„(»LÎ4|Kßÿß¿ÑÛ.|×þ8 û gˆ6g“ÚÈŽ%¬Ø" aG ¡$" c›©ŒXt<{¼ßæÀ9±!ò/9:Þh¢“ì½m7ß9[ó!%À£÷D¶û:+÷uB›ÂÜL *„=~'³žØGö(T'í{àÌž<ÉŒL3–ê&f‰b TR,ܧYÿ’ð§¸V\qæ<´}bdñLó 9*ä^¥nŸ¼x\gß—‡?6WËÈvè/|½ðü|pè¯Ññu‚$2Ñêlˆûê¥5ósHƒã)E?0‡Æ?ÒÜoL½IuÕõ…–ÓÉs,ÓH ‰ŒâI0‚«N=b1ž²!¾ñ (j³…È­[ã QR8±È¢ÏŸ|i•ÙÎe°þþ]0jE—í xP¸PׯÿåËoȰvS¶5{wæ ÆF]Å70ØXLÚléézÖ>ìÍ8_Á9 [Òpueðð¦ÔtBb Šv¥×a›vÛW/eÛãIXÍ­EYW÷Áådv¢¦5_¾.ö첬ªü±©³å`å…µr µ,Û°]b¼®DÜB«f±,sÂù-湇\Ñ—b,^+æŽ|ëG݉_—9Be²1/Œ¿¿Þ6û¹=9bCv—uŽY-UØ?ê'°Ëþ ~>Ï¥^dÊMØ0ÌØŸæ!×ìÚ¾j72h ºïztª¯»O¤å‘åU??Øæ9ð£¡*Vjã3©X¢iú«ÒÍȇ4D /\f›n›Mßð塤í‘ìðÞ_• íÉJ¹Šb„»KŒ_Ò7à².çUÿDzQ5¬+”¼ŽRÌ9I*ämAÉÍÙQ¥n8…‰Æô¦ÜUˆÛx-kÔ&[sVd‹Þ‚~¸"’>8½;ƒ.m…«ß>¿”ôãÍôÖçr9}zÎöMãòÙi8’MOÛf×£Âeª+=ó0úû«G§&iítXc–UhÒB°:µ;I¢åªVH¨Ø¹¥Â0ÇŠ¢ÏGÖYûybÂs©’yŠ<òf4ƒ8¹š•Ý;ÊÄ”ð u2Ëy‹Û‰±t&Ö´r8¡¦¶(5ÁPæSà„eìæžê¬gc UL†ç¿p?ÏÞ ^²†$ÞÇ3ûúf®?¿Ó‚ýø÷ïàïܲ7ï|‘ÖÐeáxÒG§äùeìÒiéb Ø\«ì—q3R` ܦ¶õëVdf´äeˆ_õçßÑMÎQ^$€a’G¾ôvÙãrŽC c½zRg4í©Kc‡œ$’°²òªÝB !2î$€Ê¬(¡—øÇV{¢°¦ØÍlâì)iý÷Mûº¸Íª/.ˆ¬¼þ“aDúü„bú–%Ä^BÎÂ_s·€.uå^Ü„fî8`Wž€M`/k¼©¿]ÏR `øE±ÀêùšKýuº¿í¿Â]ðƒŸkÓ~[^â]ˆ$t…~Çò8ÐsdðaƒÁ^€¯OÔ€¹E3ØH¢½ßOBXJ TR¦t<¡áwS–€ò£{½&Іº½åQ« s„²o€6¥Ï*0ÁƒRJ=;Ze£™¨ÍSú¬r’·¾PMý¸¬óogÝ¡.O •+„Bó‰Ls¿ÞœÇø=ú"CRˆíÍváBª1ד#ð¯YÞÉw}µoÙ³ ãOËZŠ«[„’ýÊ>±ó ?æJ+ˆîº^ö³]Wø9¿ìS¿þ½Ø3ª ÛÕŒeºt­k x ä#îÁ;-mC\ÛQ“TZÉ4N &}Û÷×µ:ÿ·›Ç×/º>H¤âÁÞïr‹g¥X¿ÏJ®Ñ6x¶]ˆgÐч¶Oh$ ³W,Ð’ñÕ#Îá­™J’Ä@€0 ´…å˜ÿ‚ö+ãY¥2êršœM¯ofPT rŒWó o>ìÞw¬LVÆÈ„r"f$9Q ÉgÐBEÓ t!@ÐQ´+­õ¬JÛYÖN(G òˆ™^'?¹ú$oú/v?8aöæû¹Cø¯ 'áÂÂs öš>·žñIrv <ࣵ×zwJÁl:5’ˆ„›®Ø e“Ðìkvu>aÖ‡]9“óÃÉ(ïy>âj¯qâù "l, Bœ£rD=ym±.¨+âöŽöÜMU%îÔNm®,–i!‰,“U“(tR0R¡sÞ†3$¯ø˜]òó÷|ÿÀ2•p¬¤Ew‰ŠÌ–GaCÁz „å.Q»VµD?äéí›ô÷r¬Øº™æB8M6ó˜F”&(uWÒ”íßÞÿ;n³‰5AÖ$Á9›;·Neæ?ðÊ 1±·gÒ^­€ÉF:R:c †‘=?ÞÁ9óÀ+ÛËbBÉÜ.×ó57¯Þ¶w‰9DÂóŽÃÑ£Þ£û‡½¬¾NRŽß™9àD!cÁ»d˜E_A \â\ý\*Ñ]u]-¶Ï¥?½ ÁSÙˆü\ ¸ ܳmîùÆÎ€aH&V_p‡ËØH,Iµ¹m‡±PÎLÛ[s¿×£åèŽÅ€Z ¤Ö‡<0+8ª¡ 8ÈÔÌk1}âʤ˗Ñãy¡™€áM©Áô0[„%ÂÏFÃô4þ€q¾´}½‚1 «1 õ"¶D\¶ºWÎVUz]WÄn•¬t,Zo^úòNاÅ(A'•ð@tw²´¬Q'X™ÁG¡šÝM¬I¸iNmÎ)“:®'̹ͮ“„”‡tª®Ë)£ÌC¢Œ´ «\¦’’0à‰$ 41P<™…(l%_H7TáÀ°mÅþ®þ%0‚¨Á}Šh\í¯àì/¯7ÏÓ2êž £ŠL+uE¥B]á ‹YŒb´„0{éÞXÆßÂ×@,¦»tƒý³`ÁKt»n£o9²\þÌf†ö8ÖN!¼p …äÓTÏh¦0iÝ%^™I÷xKZmn'Ÿ)X¢Ü;´üÐÑqc“*Þ8Ê&~i¢sä` YË6‹ç`Û°­fÖ5_Mƒß¯û¥’1ŸÍ3¦×O‘Þ<íÙa…{à\صฑcèij½SLŸßþŸ=ß2³2|,ÒšŠ¶Z–…«ÇRû%  ,«Ç®ã öågý„ä¸,q¶¦lóȹãÆrá,¿UL¾À 3ÆÊ½†aØ%lÉlÃÄÆ4€§«3ïò©¾~Z×ôóV¢wò’¹¦í#¿­ßÒC>ž|9ò/å¬Ö_"S-—4Mû›ŸüæÃÎíãÃùùóO§[j@ÐKñÖÒkPd™1M+ðW S€‰¨ EBz¨h°D ŽÔ´™Ç÷ó¯ÿ×G‹yÕ]({ÿ; N”­2uV/˜NIÅ¿d[©°Y¦ŠÙÈ&Üp$m!TÌ ¸’P¾—;ªëy=yYh™êZåÚs¬Ìn;JjY錤ç^íNÆåÎú¾L¤ÆCîžÎ47Híð‘»2à”ªƒ„È©½\Á)œÎÀ…¿N˜D$K¸2%¯ý\?.®þèø²íëEg±$Ϩͻ³VG s}ÓŽ|7|nqÀ+< "¦ƒªÃZò)¿"BRı`1*!#(‹,*›'ع“唘#EèÔœPW\©VäÃÚŽD@ô8}¼Ÿ#ë¿|3ߨ˼k²ÏÈ<xËÊD T“Psè¶—†RWìvÀŒxWíÏlº6@¡ëÂú<ºÞ=}ù¸½¹æ=IòG¸ìŠÔ Šòø\Íÿ¾®à<üúÅO=ámlC9‚˜8Lj{ûÒ)ï·Ê…_ŸK×t<âG.Ÿ$í:5=™PDà{ýÓ?î =çëÇxL˜·úƒK“C¸»+ž/|Ôúâ-"hxœýýy¨Åœ)»LËî×ÍûͲÔ- a›Èò]‹‚ƒÇS"à9FPŸúS@ÿNy C‡0°ÞKÉžQ/Ð*¨J‘õáÄÔ~››z­žhüž¢¤å}ø$:žÇMõá˜FøÕ¶,x 4\c ‹Ü¼'o=k5ñšV„,ãb“¨`™ñêç¾ô[o.­d –ŒkчúqªºS¢,ѪOЂôºÆA’>Ð:ø¿ýkLÇP>_×°Qi„k¨pdTPD’¦ z¦±&_úŸÍ¡ºJøöÜÿ)½Àšº£s  ¶¹«Ð•K™œá° F•JCEÏÏý¾½ßY×ÙZzú]ªÆ@:´ìFÂÎNÀ sU,/êeX«r(jæôÂx=Í4¹ºas¦»¾3©°ÖDMfËï®Çmß]z\Xe¿ÅÈœqCE펵¶®2Ly{öÛYsZÿ÷Áb5µ3ÒY\ L¢²ÃÓ UÆ´–qصdýðì£äþÀKŸc}¡qùøª­/ÞãÕ·Ÿçe0áW”á¾#Ç„„õ&G÷·tÔ/tù[³™ìÊËë;¯×&ì™úüøåbKy¶ }yKÆwPÕDµÌ’¼Š×ÉTÊ•.­°æØ¼,¿Y—8Ò—t‡ÇOP߯¾æË/à±pÕaUv|¸äÂeÐÕ~Ð3±ÇvŠ üi´ @—w£>\…Ô 8œÎ#RÑ"í¬ Þ„zFL‚ÛÔƒ B»`À)Z¹ß†™·$+½“û'Z©>‡a™a'|½÷ørÙÞÜ·Î3{_,“>Fí®Û»ÔèõAëjö@ Œ E¢»Û‹µ¼ÔP¤j3˜F9OUHcÐ’?ê=d9'.“0Úb-Á0,á.Y¹×]¤ º p9ÀÕÞ3åš Ð…w¹«[â¡ÂW»)+߀¯&<‚0¹–g£~¹¿¢åBÊÀ¨»ž_&œyÎP,š1ŒP‡š­Û·F’Ç>ÿ“¹æP×Ȍ߬>8õVê¼ÐVçú²¼`ykL–›ePPp4 Ô'ÿl¼t•”R¾–Ý”˸-úÀÚgÜÏÉ>ÒÍø¹ï…GòS6X^ÀkY1{†,¦ñ™;y£—Hì:ûÑ¿¨]y$ãM "NÝ‘ÙN¾´ŽçÔ<|.³£¾¦H2¾r*€^ ßë¶;ÛY0 ®õhtÎR>ð|yÓâܼé2^Mަ<§H4x£ËžærA§ä7ŸÕžÈéK³¨=XB$€Ã­'³8ÚÂ4’ûqž€Á–"M—uòAíV€|ÞÞš"©:Qç"ŠM«‰ƒÑõV”6Ç5sv2;ábDë‰píׇsÒÔ§-7ø›©ßl0[W;\Ú±Ð(³O,6Ô P¥Â7’쳈p4‰Sn9Èc©˜ · Ú›;¤æyqkî‚Ñö59%¯-±D\L»á²=¿õÁþXv~;? *†(ˆÂÄx[vv ©`éO‹™¶g–³‹kSàd£Š†T®0³PnÞ’õ&ƒÅA‹ä$3عî ΉxìU†º}ºG½IQl£Å!0J"©¤ð3«ãº[ÃV ùVNÉø:¯¯?àõìy=ççÔìÝäÍR^@Þs²}·±8Ø0]Ù0Bqˆ«¶báE¡’žˆïâߨþ·/8«‰&î]ŸwsÚ| Ç÷Eû€ÔQZëê˜R“OÇÞõ­œ ‡ÀP ºÁi6øø;ƒHàHdI Å2æ6._ÃþB¤nOŸ•adÍ/ÞÕ€aWnáȶä”5ö¨µ`šìL¬p Œ7Æä‘‘@¥©É)òÔ¤ñ¬Ë2iúà“‹¤cˆ† m;hoöü¥{Âw~º¿Jbí«gØ÷é£{Ý .Ýúbt´±öðQΑô‰/ëíYŽ¥ýz#ÝD±øl¶—®ì,N* c"³¸·Xv¨Y3Ÿ}ÒÛݬè8?Ĺn:NõF‘ÛK訑°04ãò£»—67#Ù“ñÓt¬ƒr6Hº‹©™DLl4’!ò„Œw ‰68éªÛgµ&®'%¾¹uMŽ‡Ì³˜Až¶à@Ä"4]¶ùö¾Y¬|‹ï–'ÈÇ3þªúö GÜ2½q·ª,º”ù²1;P”8«@õdþß¶žÞÈk”:¤ê—Ó7ÐÉdÕjÀ±37qP|·B4A¦<›v³¶Šña¬!ÿóJ›¿µïMYÞÒ»šB;Î’7Ÿ–F¾þ¤£Ïw=>ù´Ì´³ßsº_èëÚ]_­8lyæ;„QZ¸¢è¢I[!ÅÔ ~íV$µiIr.¤Ð)ßärTCšr2]æŒzh d”ôµ*謗yWK YÉ@C¡BpâºCŽ)@°~‚ï ‰¼`hºí´•D$‹%g€È¨ÎÇ.M $!Ëzjo»Ð°[à[ðWR*e9U沎»—\-¡ é(S{×+øÖÒ*²Põé9Ò/J²¨UQâÌl¼s¸¾Ñ•Sòãé\ U¬L%DkÍ$íð3Ë””§(xií°µû9´4kÅ_È©œCÌUJQ˜BªT(†”€i$@,ó¸P¥ «U¢ÓÌfÃxçÊžIÜi‹`ßK:ø-Ž; ò,§¶çòÚQ—Ïf^÷J09”+PªL¹QRÑh:Ûz&{ö²UGQã‘ÊX¦GE½(:–u.C¤¯`R´&’\¹m™.û òDmd¤£0ƒv¦M‘€XxzU6ÈîHÏ“åÑ;Jÿº~ÄÏWÆó°¿×-(.oÓ&Éüêáu?Öät>ÑZÜø>]&‚à‚ÈêMz½xR–GäÅ™“¹/²WgHòh~díÃfÖëÜÎÖ¾ŠdŽØãžoÿ=–*:+è¥]Ý¥RT’•”€9¤N,&Àv½ÝB¹Ô¾¨ÁYÊÇà ©±¹®±™QLw0úpR ŒHlLO \H$L°Íé¦N¤ìˆRË0Hm™Aº’HdŽIÃx¦E¡ùõÿé·Ÿ¿eÝnsJYCu|w¸´œ6q…hA’öÂD=ùN+3êÚP˜Ä€ûB‡=þtÞ„Çó?ah^Mñ£Êð>s:¦Ä§F!úÇÊ®­•3|ßö®ßb›X‘ŽÌáÌdtËPêʯ§0Š"Â(|áèõ›;µ¶½2ÇúÉs¦v1xÿn&`e×ñýÇûå?fx[4½ý­§:Ì‘XË'œ^ÌOÁ ¶D§½cü ï­<2Ý÷úHgr×½¦3ÓëÅÃu&š¼í¡Aø û!z@²)@t¤6f¶udc‘–wVý?›ÍÏÆþm‚'jÓhmúa îŒÏºœÖ¡³PàöÐÙô¾ö9<“>òÛ„%ÍŠR{…W…å’$t Ói8Œ‰[üûůjtϯöþ €c+jXi½Ù«çu9-€ŒbdJadZfîy³‚ç묾þÝ?û—¨ºÍ¼ ~o¥ÓÂÌø>Rçnn{¿=If=4w·ù|°^WëmC= ƒFë$öàÏ(Âó&̉´çþú|æcâç½xž­ãhT(…å´Í’âcáµµÕ–í™õ<ç㯗ðµíNÖÿ¸HäüW[N }4¹UNq<ˆg®ê,‰{äæ~;ß¿¬]‘Qµ¸ú×ç§ëëàöSóvü7®õ—6y`~žnLÝ;’LPÃi[R(zê©–¿åêE«%AYMÿó–•eÃ.pËøÑ+— `RuüINÑVñE RÈB×4 }Ñ»y®_@' ¡“‰·æ­nY€»KZE—°À>²ÐzN±‚«ójQ… ‚™^ppù¤;,X¾H†dH1¨¶÷$§Rå“òmÑJLÊÊshκm{Ù¥ÎØîsš÷)]îk79‡ú麭ŽXf®Ýž¹uzЬÑ@; ëAøTF ,•%Úàª#1ú”½’‰>áP9ùQ^š«%é9uFŸ(8-_v 17ŸOçÅ}¡6 # »-ýéåÛ?ÅHj°q´ñ'^¸;UðNj- ؀…,ì!‹íQq•­i­¸¦ÜiÀxN§GIj¿yT˜}6;¸uíJwõžê¤w~xn;ùöû…JÓñ4ËÊ*G^åÔç%£‡ÛÞIð<ψ”hPà%¿ + u© †4@èØâ¯ñS5i—úX~^\Ï3QÃ:_;{]€-ÕYfä‚$‚_ÏÉ‹ù†£k¶¨q¾¬‹m?EEµT éµ :Aù-h¼ãö´úɰ»é­l %%n1FiϺ[ ÅáY.ÄžáVñ±«ë.”5­høeÏ3dÖ7Ñcºž?hZúm倞ˆiÙ¬³BD€(G{´à-s=iAÆ‘ïçÇrI Ýå—¼£yÆŒÚ_°g¸®N–§IÎZeÙ—÷·N½ÏÁ_ŸT‹`;öÇåƒvõ’jsÝ^ØÎò å”L-Ûî¹×?.oxïÀ0Ô_G™™eîЊù§ðÞVlÕ´7ãWÎr†¿Ç:”ÐôíÕih¬5Æ«ƒŽ2:ËòU?+é6XL$^q©† †Å-¤†‘@¡ È.5zÊÛs¢ŒÀF56¸ù‹&=A̰}FÏ£m4saé|q1N¼½”@-ED€’bj32Ȱª˜DØç# ¸ùÊ …ï顉.õ5uó¯xÙí¡ÂË*9‘㈠$}:ã17éZËlBŒ?ägfõÜ`°s"á C´ÐEkDä8À­Š€$ˆP8²N\…24Gl›·h&ňûaVÛ£_×[³ðK½ßNsr¨>Ø43ÃC˜xî¼÷»§¼µW`‹…¹ÍÚE)§*¦#‹æžr<|ÖŒt’¥Ÿö°Ï=³Ê»ãÈçÏöµÜ럯¶Zò¾®y"XÄ”$¼ªµ‹p (OfN€Q?ŽR Б±È- ýçãõrî)yz||W­W½a â€ÎVX M+ÏTé+-¦šãŽÙÎmU03úKmt¥H¤úg8HÐâµ€Hs¨YÐTÀA²èuV X3ð¢À]ÁñÄ8ÇŽP‘…\‚˜· D½}*5YS"®w)ØÜ1À€ èáÐ’)Ë/|ù,T¶ˆ1§˜mXl–ªyœA^â¢àtX) «¨V½Ô6"•"2›gÖÖKXEöV[dν˜VCbІ•Äk¥º;–èu^ò7Çš¬Š†8 Ù.cR®Ì^ ¡jç|% L¿Õͳ»­+Ö¢•Èe5ýû\Ñ[» µcEL1—}×H@f÷lb›§ŠöŽ©î·ùå[ÿšÃ=_sÇ#y´‡Ð*Tļ7Å_wpHÜâðìUH§jW×Vüp9t%4ìp¶VfƒD2„"P_h4|ç××ƃ¤§a•Ƽp‚Qo´‹<}<³^òKŠY ¿ªå¡1X‘,K2åPÔPˆPê*×ÀxtžÃ&˜kü’Ý Þ;(:Ñš²è±Áb^¯ßÑ=Ï~Î;Ö'G{>-|ÙçNvñ¢Õo>ª™øi!]U„ :–Rꊛ›ç¢ÁtŸàH¨i[ðè_¯æÀï4OàúøƒI= °€4€DBûµCõ쇣¾%[3qÊ~wb¥Ÿ¹n‹½ÌÍ$±l7Ü⮌Mi?íÜ犩TLøLžFFTfimÊ7Ð2=®‹wOðàR¼fQp§Ä*D5ŽL+ƒfî¹Þô–íÇ,4ã/è³a,sÐÁ(b<ñ7þK‚6ÎLëã~g,Ó*µ…4cb=ê@‚ $Ac'Àu +¦ZÀ#PŸâ–Tf¤êâ"DP‰âjв=2,ÓèÓ™•{ò¦¬¾ñUŠÕFÅz *€’ÕÞ~¨îNwåîíôÿÖYÙ«QFãnev ×Ö0iD P (!¤1HÑ•:ì<‹#Wå0½åC²¬ƒ,l¢Åvþ.¾/`÷‚Ão©žœ·ÚÌ®K׸-äÀ-UÔŸ,•<.6=p“Ö|‚íÀ-_Ú©¸Èœ*†ŒÛ’'„D~ÿµnÛåî·Ç’ªš@ Á"Xt-@Ò i! ×yÉ+ÇI•Håíg©ð¾Ðçr¿íüÿÂ^¿~}2ð|rWÉë鬿v×ÈŽKs™­{,"ŠLu>¯åºçÞyú}þR9ÆX5,”oMÚE!_“sØ —c³ìz¨’ E•9ÔŒiL›RîÇÛöóú?õïžû“é£ßiÊ.J¢&cðºŠ0Ô­àT’"ëõ*z’)eQ À² en,ìÉ<¨f œÙH`2‘îÛça×)ó´RøigzXEÚeC  xzÒ/Ÿþ˜3ôÙíç'mf~_ÇÛ;ùÞ™+Ôn§váU†ƒ®¡%òèqOÓÇÂÈX¶z€aÁ‹7.Þ¼k‘:™z¹Ó?'é©ññÞ†Ðy†œ½ovÞûåÒ®’:7pnÏË^lÇw2sO›öçèï_ o‹óÆœØ$QBŽ#ZÈ–h„A8VµdÌ*æ[p²ñüF½ì­[ÐAûAÜxœÑW0ú˜ô›òåj…?iîùw2ö5wvj‹ñ$2cÀU‚U‰¶ÝŸ× w@f>17œØƒ‰Íá BÏ5&ÖÅúŠ riÙAsL˜_Aɉv"hªgª‡1UWÞŒí”ø°ö­©ô½ìlHEº÷¢Zq‹×§×Ðݽ+Ð8–C¯ˆñà´ï­öêÛõ³7Ïý»'æwo鶸þaæ^ܼä_ý?.¼wÞ¾¸~Ó¥“^pFqΑ¬±mPœŸÒÓøž£a]PÖüÝ=ëòƒ¥ß›vÁ¯Jµ‘[^k( dGÌfcyï üqWÏÐ#bÖhà­'óûì«qðl[u\íu óã¼.ìøã…»LÌ-Ä#\íÀj(ˆŒÉ9ùzW¹S½ªËFÇç‘ݹT‰É¤ß.{›,ŠéÌO" æ.8z\¨â6Ò4tY»Ï°c°þÊZþéàçÇk:ló‘SWÍÌ绺iå×WÑ.±—¬ð{èdW[´¡î'îÒ >A-DaìÌ5©ÒduôBf_¨ïq3™qâU¿œ—œýÁÈÒ‘ø@‹d!÷óh¦–ßwÛ¥ÖCãã 0ÐÌÒT)¨ï7»ei}üâõtkF éÃJ9¯!üÞ]‚ÞbpöÀQõcøŽtˆÏÞ¹ÿzòø}™¿Ê;~ïX彌ÉsT˜¿XÙkª{@G«Ûµd˜ ƒýÓ³úh_[Õ-»25E›žÂ(¥¦ Y+ð$з`”3w|&Qljð0ùNT,l×°e”%uR D¼¤M‘>Ï9ãWáUp—=ê=j½ªHÕ‘’p@G>¶Sh]›íb¹P˼<È¡Ž·ëýE^*áÚ½WꓺížÔÑúj®ß šòbÑŒÔ(XvŒÇ£;mÙ\5+'àöó4ø³×ÐZtˆ•2EÏ«8˜åùÒ +Rõw:XYû[f×py;S‡]*Ÿ}Ûå7zÄàÁåÙtwf€?~–}—Y\¥W|à¿6ƒóWw¦› ·e:äLˆÑ–½¯¹® ´¿¨ È@ LåhÝ‚±DóêA\ÒBYÖÅ®ð%WŽì~Ô^gü8(w ×Nót¸÷^%á–"•ÝÜ^—W½ñò|<å7æv}p´¤žn·×¯=j%Ì«9·…WûYÉ«Âfù~_;÷J·¾×ï§ü@«ª 2ÌÆ:Ev*…GñƒÍ>}êv‡]~ñí®ûþÍ%mjìÛ=ï¦:žáGJùñm”™öaظùNÿ…$ìÆÚ>J‚:]&ŠüÐì[h¾ÕÈÂÏçúb6CK¨§3Ü:—&YÅ—¹íHÍÛ%~åO·9ýt9ü\ßx|¼ Iñ‚e.D°mDŠcpЬu:îz[ÄÐO ¶Ô®°ÊXÚ#W†JEÙ¦[¹+©a—Â`è'ŸÍkˆÊ÷žÄ¯Å-7kúñÁÆåUùh°½bƒäº›[}ÊîÈtE}-!\£¦¡%âY3Ùª²Ê Îçe]¾QjŒ(#5™Ry/¹‹ÿ3µaê±fv^ ®åŽò•¬8øjVV¼s€™RBDi¤pˆã÷ÌàqÍd^ÒQì  `™Ì¦"HéðQ&ˆ@±$~røÇ¼xy¤ÕàÒm× GÑè{wÇcxgNÍÔ îi/Ó}ëBžÕjÈP:”—²+ù‘ 0•“‘­iÄ.@º¢ž¤¯ŠŸ(_Ëœ´÷²;¨êuz)nžÞ1×îÓ·çš÷'DZû7˜ kήŸÔ–°{>LsàVVöj´%i`»–\)aå£Ðž_F 2 Ó$ІY–”ß¶¢‡9jÓ“Åvwþ’ ‹‚ï*ÙŸkš‰Kó™÷•(÷5Ž\ü2s³ªï*– Ƙ)$È‚¤††gXÕ1jÏŽóâÁžOÒé϶ÊÍõ¨Òñ¹˜âiI‚˜6"D^ÚS³]O7&NU”\#J¤ÝJ…ËÒr.ÉêÓ«¡äì ·ÐƒL6ë#6p9²à{e’š0HR©Pß…²c ›É·à`S*þëý_§`áoÕ&}Ÿ£Pß,°0÷€ ”ÕâœóWyÉÛ´?¾Ï˜ã÷Yþþ²œHs$3‰Ä“ôIÁC“AÁ/ " @ &¬ €5ÁÿSPßsó­Î¶sÔS,¢ÕŒ ô¯ \W8¡BräiQ§|MT« Zö›PâÕÇXRn¥7­î?ˆ¢€"$¦wýÿrê=J®åö;ã6ØEMÍVú‚eìMÈvÅkVfMÜÜez¹yú²ûÕ÷{\xiñ™½ÍuY¦Ö Mâõ*Hϲ?Î÷dW\u»V»«ºž#tÉ?·ßf¯1•qtЭ÷Ûþ]ã×eo»™YÃhžÌ—Éö<û4÷ŸÊÏŸÛÑJpR©+?2“¬Ùfר ˜Ö£¥½áݼßüýŸ-Â÷û¾¿&‹±æý à ®BÀZd¥€ ¬@lI@áÁB°ÆGxïì_K_¹?wøeÿÔÒs|°ù‡[üp&ëÔÝåÒ?Y8º~ñ= Ú1\$ôúÓÜÿ[—"Á;V¦gy~ü£Ï-Ü_»rr^õOTy ¯ˆ‘`m aH^ 6@Sèê è뇶.A3TÇ•i}|û\ÿÙßÿÕïáúʧ:¤ÕæÒ„(9A$ºJk™ªÇÉ•GݲDÆŒ!&Nåć•]inòóØg€‡.#¶{¤ÈR˦­$@{§?ni®¼¦ÇWÀ:Bí22@ý¡$"+`B¼>ú#ýåóg™¿~§ÿãG߿׸£_ËÅ1؈¤F9ms,3 œÁsB>Àe¶d2(\à™ÓKléF4;'ëÕ÷/Ú¿é¬~ÈMBƒ¨`ŽÐéeÉx&^Þ9>üþ¤>ºý’´ ÚõŠ#€Ói* +JÄX²–s`Þqò“=FFÇýôqŽýíóoŽ—#khƒÏ%àiµ×‘‰ÒÞŸ#V¸éVš #4Q˜ÜvƒcÔebk´òVÁвï|¯@/•.îæ4…À©Q|ÚYNŽyÜ*3Ø¥TÇ{³ãŠÄºÜ謆@8Çh!zNˆYßJ. ‚4áÀ,ïì乯˜KPZ¨ã©½u´þøî'…YC§h"÷Â~K•m{ìú×÷úŸ½äOú–ëϘùplý]§$P±u÷Ûÿ»_¶7¶ÎòîüÅ'f#zû;ãÿ¬ëuFÛ®§þáãßóCcƪË룷yà‰×€UJ# ÑÉ/Û*q}:©Â°÷VûXOÂ;°\;nÕãÍs¶ä"ç÷_w§ ³e@5‰Ô  '‹«„"8ÝÁ‡FŽy#X9—I:0}ÇdøZþþìþ-é±,öÌ9¢ÖÔpª±î{I_}Ý‚ßágüø„Jì#ÛO]zû¼‡Pb !É}F;Ôž£h?<-¥óê¡¡/”4¬’o”E°hȺÔ@û…fÄšðèð±£KÕŠh©+ÁFIkrm+¦©= ϺhÀhCŸ0K¤r1Ïœ:ã}ÜwúŸr¼ÝeŸµë,{ÌôÌ1ƒ@ÒAÒ$TSí:R¸a#¡­]öÜ»æ®ëËMl­®`-½ç|À¾_»¦Þ–I¯Ÿ,U6´o¿¡K#à{q¥QÜûð%Vé/RžÿâDmac'ׂØÏŽfü|pU3$^9f‰1¦ôÓ£Èäùê¼û~tê£p¦¬Ž7м-1á<7x“§‹¹ÝÐË‘ ¥àTÓ0o…]©Ú_ é̦ëLz¡{쉲k}Jùñ‘ݶEѪ乻ÿ\6g+î/‹VT»Z‘t3^˜IS’˜ÀF×MÒØ¥=}áÿžŒrˆoµÖÑ’¡¹M”ŠCØÎi"=Üd;B®BãljèÁ;dÃä¦cxG|!ža‹Né„§ yЇõ¨ÊÚuy‘ 6‹šðÍàÚ\æ¡ÕØ" ¨‹MaªÓSÁ Q&(ª\àAy¿ƒ9`ˆVkk½ÂN—Trk±Ë¡XkDÐ^”žžöŒŸÜÅÁî¬ ?̈;î”& ö<Þ ¹º|Ä–S_XÛ˜ ’Z·X… TG+Oq$cÎy­fFþ*5ªïx6r­j»Âå–TÕTJhÇÖ#´Â³sj|³›àyØ™1§^VÕ¶ƒùÁj×$˜ƒ½Nôûµ #ÂøDÒܧæüthñoÿ±û^ç€ÊËø(Þnßû¤Ø0ÌXn¹©FAŽðEñÿÞ•ÍÒ@w¢.ò%2÷RƒFÝêA l<èø¡?îÈűsVÚúFhê5ßg©G,ÛKß©rßA°á:÷{Þ¾ˆðÅ[ Ï}…äÞ}§åê¤w÷…Þeˆf[Lï ¡Ù8Ä¡K‘ d¤bÛ[}úípº2\–ÞÈÏýÑçg/‹¦  ?AEwÒÖ3ÖÙ# Ʋ  HA {ÔU²™€1üÊÉY-…¬[™£ ÐÙ:5¥d$Ãý'ãÇï”Ëyž–ÙLÝÅêžf  -vsÍïÅ÷vò>†‹®©":¼¼é;t±É1’¶r!¨À¶ãþqn¹°Y( :x—·S¹P Ê{!üJeJO²Më]òe“Ã|lš¹yÏÓ8–(-~/Ù•Ò|¿jJ•DÍžx`]*@W`ÈÑ"^&yÅÆDµ^ Œ`h[¹ ²~ Ñ¼ã 7–å)d¡ˆ2ŠMƒ)Q5žTŠ9ÐáÞ)Aªe´Í%,4¶†ã O/%_‚GP`´ÌáW{á$‘¤• ŠüMΫÒŠ­VÄ|h]lk`Ñ‚=€ÐtJÖRØÙ k¸©¢{ ‰qU‡^;éTù¬‹ëÚn¶Ÿ¼Nû§±•ïU?šlgæ\þ~ýÖdô+$F±Fkn#b¦K+vîÕ{ ®/§_»oÒ6ÌnÙ'×8KvËÁ°AÇ·æîØ|Ufùrÿºæ¢#;š¦-þ±aBtuBa\ðžÕ•† º²„¬;Ê*-Uª¶„à‰1 õ}ôɉ9¢«È ÂѤAéJGúKY–ÓDË× ¤ÔkÀtѺ]÷||ÇO?_ä£Y~ ÏJp ä ÿ \„š ¡&ª¡O#j؈£o.½-Ëؚ̱ üa&A–)qf§vΚ9.SãêÉ ³GWð3ùOs¦y[.øÀ—öe.ÃÑ'±TÙp¢qÖgPEm"Pº°•kí3[¢F)N·pŽFÒZ°ifƒˆa>o˜NîB#K-]ÔKA˜llÚ )ÝÓ[)‡„U‹ÝTj÷GËgnáù”H·:¢%<+¢Ó;ëÞ¿û4ÏÇw½üÃýÆë×ïþÇ;ýÿÔûÓy^ÕñL{êVÍ*UwÍEžà¿󶘔ñn^4oºŽ~wF1 ªfûØz"2Ê)ŽŽî$ê ÿ­6cïyˆW»IÃÖ\'8r¨˜;Èzl±Ÿ}uþô­w rc½‹ýñ+²­\ïÐâhÉbfÁ•Ɖ`~Í?Y¯JïÎþ5[OÃ2ŸË„Öäá™?zÕ¯¼*õaˆŽ22ì‡ÕÐ*Nb!y*¤wa4BCÑÐh•ØZºØ:ä 0€1OÌ·ç,’aß¾ ÓÊÊ GQ/ñû7_ÿ…÷˜<„¿Hur®›~„oÝq¢ÎX\3æ¿­q°ô4s+==^ u«®dù´ÂeŒDÍ 4ÑŸt¯ctài¸Gö"6Î1}žÚ,s Q6Ù-åCy0†á ¹`6ÍÆdüâBqÅ›™Èl´OÍFdy¯÷‘žW·¢a2Lþ’€¿1¬ÎVþå_kë#Ñx;+*õA®T›Þ‚wÿŸ† é`áç”_—WTW[àU LTŸ`Û ¹µÑ¯ç¿ÿþ¯ú÷>û§¯¿›Ù߯ÜËæ‘c ý~½ YêcÈì’¶9Î<ó±Ñ`?ÖK0(ìãÖº>ñõϯãñµÅýp¦%%b›žÑ(D„¨ê¶L( J¢ÒãÎP/‘N[ T Ñ]ûßû~™þò÷~yÌúpK§RNÅhÌ «Ò*ÒIèÊI¥—ÙŠ˜‹I%¯¦ˆ(Wü«­ôáþÛÿÉúç …ÞËP¸eÅiX è G\0:-Eж¦ß ¦f’û |À;Í®æ›âmÝ‚ BÇNbö#ÏÿÐÏ/ùëÛ¾ÿQç?}~/¯Í`—€Q¢¡ë4NõàЈqÀ“!½ÔŒÝâ«I‰P˜ Œ<ÜüÝyýëã\4:ÏX6w+ÆãP¹]9CB€‹yú¬BZ`y°K£@)UòEŒ¤…ZxHÙrÙmÀmˆaN”ñxÄÉ÷ü7ˆûá4>~k­¾ÿƒE|z5 t `=P±$ùØ}Ÿ2æ¢+6ê9¾o?¤ÙþhÿûCÇ÷ÏßðT‚U1Ý(aO™Xó¨gëã7Íɇ8ïõE–±î#×èèò¸]ò“p¿¥e×<Ý<~`uùØõ› ûòzþ |OàÓ‚«xL£ï˾{¯ v ^爖±‚xJ_s ÌÑ:wâݾê³ÿÁ_UÐhv‡ô§3†•¹‡+e¶¿Œ(‡ywüÎéb÷bøëéo³Ï:•/Ì;(`·r-m¾¼7ÿ 5RF´Þùûó,\sÊþ¹?^VýÐïÄÜv%ð̲{sÆmšA¾°ôÝÈ%M?p|©G(w~ìã•ÅÅË¥Ñz7 sŒ³ñvœW©Aƒ¹NÞ(Öd·GjŒèÑÍ™„(Ü”/ ¾Hè#Ì×9µw=-OCœà«mgƒ‚|ý°mKn®ÜóÄ®swÕÞ®Q8€^,m"'…žËàM8FK¢{8ä`µh݉ÚÄxËô-£¯]êÖz›÷7µv“‹þxj´äùJ÷6läC<˜ªÓaÔëÇïâÊý¸úÜ­?¤î@Bð"È,n¸À:ÁõòÜç/?ñ=* iÌìJ¨h©|O‘Gwôªƒ7ƒv}¹ù¡Vdd½&ß™¬a˜@Z no}HÁòŒmª^dØ:ï†é’ŸðѲ sm_IÔîÍ|:zÐV®`$rgEœÅÛ/ª›¡*s¤TïzÏJ& ÿ+šÞ;ðÕèÏ©g®Ÿ±1áâÝ¡Ëx«¼ÝŠ6YórÇnïÀX³èÀs=¢hpžj,¹ÙV1É]e>ü|¦" ™1sŠ¢ê£;Ù ¡´Ew¨QùÖýªüjôùŽ>Ð.yvm½-üËÑ»«åGÈþS¸ØÍöAYÒZ\PN,êL,±à^<–†˜jÚŸs^“ÿu-ðýó6–åxíUk µépq;nS¦Â xÏŸ(?’}Ÿ»>¿.†ÂqûŒHQŒØ†øŽÉÛHqÓI@»ý±ÊE¬©"½üòí·¯[f}Dâ+#¥:\»o=Ù-·îPX\þÛ÷æµÜûOúÿ _ù7ˆúŒ†øä*v0XÑ×^óp?î'lóààX¶œ?‹ÈIø3ª‡fäGë‚yáŸCó°³$7Ÿ=EI­¹ãÏ>p²°¸Ý¤9'ì|õýÇÿzþáwÿå*4Ï€ïúÝÂ=é:7à½ÕY;²p…êŠ }žs8Τbo³nzð¯~½ý‹÷/¼G©Øþ€òãW ½]Á{oDÉöd‚ª¤E–ÕVTåÇeÁùӳƔZXmØÙ=P–=t—ŽïëŽ)ùAžh¯^ øÕ~OÛæû¹¢pðµñçC½Ö±a…~^Ó^ð^Ê¿h­zØñ¨A`wáRýÞIE³úLoè€/áG¿÷çn±pñú ]´PŒï½é%Þ—âdÆôúýûòæ÷?ñšÞ€ÑœÏ¼|éÎú2·ŒkÏóº‰ßñ%±`7'k«¸pq„!C>•ÚR @b‘`Ø4øÖL*®‘ ¶Ö³¸¿¤O? þ q“7þ•sðK(Ó„¤;š ‚Ta•¡V I<¬Cèd¼f]$㜾¸ß]E2èq?…—³‰dô‚\buz¼Ùs‚C.Mð'ìLR «Uã¬êŠ/ðâ×ê'ªÂÿükyÌ=Þ'»ôZH ‘Ús Cà„ÌÞTþ›¸±FS\¬c˜ ±©Kë|Ê¥æ[ôãü’ìö$ê­¸[dzsâ|yV} —ö^¬lá‹£`»Ô‡$GÙWQ8–:1³Éþôù+ý:=Á&±†/ŸÐŒ=èr½½&‰\í…«¤–Ö{«Ÿ»á½ÿ=C½ŽVço-+Õ~a‹lmDÏðdÛ¤•Ü]Nøˆ¯ýFWï*oÆí )éˆtPz´Ñ]º·~cÛËs!uq̱æb¶ÏÙpù9¥Pq±-cÝêwãúQ…ûÖ«Ç:¶êwægoÊ×y86®¢û‚Ð=°ÀÁéŽr`„EÊ)BÍíýØ(4í¼'ßê‹.êÉ¡ÎeF0«¡=]àoÿ[¿‘ê”SÚç³çkþEöq¿M߯‘<À™Š ûÔ›ƒ!–³7#¡ªÔÏ7Ç4pÜd½jo¥†x¢É 2.Ãd›µÉÇ#a)TæQÒJªhKzÏ ùyu¾]ûií¸. ;ëwOs0ݯ4н™ÙéÌ“œ?÷ùf,ho»xµ)éÄõéÙí±ýÀËŽoÖá§÷RV_Ø P\Ï¿P^ïïxTã±ÂÐ}a1«N–'â¸X®iHsc©¬ÑMíV­5Ï_ß21Ô…Ú~Ç3¯áYC‰!ˆJXµhäGÖhx»ãZí—=¯_J Kze€Bå {B¸Ü{EIR†D•ƒÿçlö-³ó=žïÃþ~}_ðA8áÝ=«ˆà´ÜÐ&Ø9ŒAwT¾GÐbS\PÑ<'ÛÝòA–¯yE=ßœ1±f·Ú¢‘±úk§•shè;¼oµ{ô‡üþã›þ›t$<¤ùÿüs•ÿ9§àü„ÿoøÿÿؘòÿ?[Q€L ˆv†7'ùÚöø™'Ã÷²×á¸iv~Üçõ¸÷91¯œ½ $þ?ø¥^°…¾¨z‡øl+ý|¸ûÙ9÷Ð#OÍž: „E³ö:û¼ýó®8>˜Ç,èïYâðMÎ1’‡¢GÍòáÙWVÄ€´IÒÁÕö)Ó Rø­ËOõ!ZB탦ÝÓŸ&^sYkóµz2‰m?ÌÌdäb¥û*ÕlvÒ+¹ôþö/àÙW<®}ìvÆ›<9fͧ!Wz_«ôCöâÉÍ¿ªe„º¬àØUêGëy( Ž¢‘ÿ%Ò…øm½P´¸·y+ ­ñ0ʨjcð@T!P WÔl%…~ÌDýçà?0dŽ•Ža¬¶p(jœr ­JW ÐMâAtæ=ÞW¾âþßËþ_ªÿç°XDˆ0| £Œ6Ü.7J¦t²ï€ÛgwV[%¥¦s½sÕl=—æÅ @Ïõ=„ÎðLÊÝ—v’ ùµãz_Ѩt­„táW7=ðônÿPxþ€Î×±´G»©½(ÞÏ×…¬rµU½libwebp-1.4.0/webp_js/test_webp_wasm.webp0000644000014400001440000502510614606317060015417 0ustar RIFF>*WEBPVP8L1*/ÿÇbXn$I$ æ;yþ0Uþ ŽÈœÚÃÑÿ hb¾7I8$!ÿ©ä½ À.ç Ÿ  ¼ÿ|¤Ðƒ.nBÛCO^uÁ_.-ý*÷¾£ì®¯þ|ÏhŒ×‹†¡ª´ø:UÝݽ þ¡Šü\‰úhªR®Rw×õÂßì®°ÊÝò¾$™¤þåz)ø½¤êîQ•ý²Wï@GìÛã;Jô‘¿úø<·½ø¨ÒQ^~¹rã¦ÎÌ8¶ÝU`@´³ö_y.*ú¨3£îé6Ù/¨.pAn3Œè¨R€W ½þÆçy^>Î^uÕ$»î€rú¡ã83*€ªÔ) üÁÏÍ·³I6Ë «‹«s8€a€ò*@T ˜Ÿº»>> ênò4Q™4&^QEP@Åáë(zøÎéÏ).«ú·M’H6qñuT”»œÃ ½é…Qn€àOGTW«Ù™¹¨¶É&\vf–( (àðŠrü¾Ô…¸>*t;É&Õ¶‰I²iæTò::jý1^(ž$aÕ™™ÝÝ$$´›6MŠÀÀ€¼k%Q#&»îáÝÇ¡avwÛYwc“¤=NRZœAoj‹hñ^ Mözo¡œI«ÕG­š$`Î9w7LîMs%I’B²† ¾·4{W¡ ¼œ( žÏ“©¶È[fKîm¢I n4rØ6¨‘Äm£®»º1©ðöµîºG[VÚ&ÅÝéÌó<Û¶GŽÍ]Ibv·îÆ$íª¹î®ñØÝ=f€ ’d·ëÓ¶iI›vh;÷±ÿÜR5z˜D“`6“¸ëåyöÔ$îîÚ¤3íL®·gwgw“¶K›;P†™îjÚœkÔ\5Éæ¾jâ™Ó«Fã&»›ÝÙ)$é&ÙÜÕJ–¤ÙKÛÎdšo7›îæ«1q7»««ÙMÒ¦G²÷î¡I$çæÞ?f:d/¦_“ì§¿UÝÝîiÎi›ëîêá™›Ðæk¹edýtnN5f7~Éãnv7Éÿþ¤n’L’=’4IŽlÖÄ4I:ŸšN|+’dÙ¶m[ÊøÿìOcÌK§Q© cȼ~„‡ÓÚ®IÒ¶mØí»Ãá´ §RH§RH¥W÷òÿÿžu/R¡PŽ$É‘$iÖzÝ. Ç?UGF3•nýÏ[ê*:Ôjµx­ô~úÃÿäÿÆ_üå׿üS­^'ªjWÔÔZR«,•Uûô~øá¿öËþðÇ×?¾þáoþðˇ/_Ç/_~øåˇÇã×~íùïÃñMûëo_ð×[¶¬=ž½êÓiO¯»îÛþkG‡w¸rÜá׎LJýÍ㵟ö-×{í--Gå߸YTêÚµô›·|¢W**Ôj[J¥¨«u­½NuW+4¡`@ P”€R! Q[êê:uk+/]{\9¤‡´ôi¾Zk¹ViYû¤Ò<×^yé;¼ö-—.½2ž­Üáxéõ®]i©ßŸöM×oíµO+•j?}쇟޷¼öÚ㓾TÚ묻uµJË'Ÿ§/`éÍ^zçÞ¸ŸîñÂÆ<P€©ÉÀ @ei? Œ¥¥•K<xæÇì Àèa?žÇÆØŸ[ÆŠ¢\¹ríÊ+W®Xj×Ö®ÜîÚkÛ¬u¨­ÕjT©Ô*ü#µ+uè‹ïwwÃΗ{>}<7ûòህJ`ìåùrc Œ1”JŒ ¸ÿƒq  CîÅËÂ^–ù6†<„=Áß@ 5 `¬¬\zm‹¢(¥ØÒ‚•+ÒÒ6c¥²²"¬iš³5ËXÛ‡û°À†cŒ7]Ð À¦ÉÐ¥1¾Œ±aƒ û“„Òø’,Ç=ÁrÏ XXº‡ sÆ8ÆcÎà`6 8€¿yûóø“à›oPZY[Z’J+‹ïx„±ÉÃ6{p5¼H¦ J,½°m⢥¥U •ÆÆÒÒÒv®ÆþvÀ²40ÖÆ1`ÃqiËê;Ëcž‹3äŽ=2ïfÒ^†aüß^88qÄ1€`ðmOžÇ·½xðâûáá'Á4ˆjžj@©$í›R„…B`¼Ã¶:WQZZ526]XÖ6Üßîá^Ž¡1ŽkÀiaaAÆ(AÆŒËÆXm Ó˜mm5 µ{PÆŽ=1 &u¡ p8 ø? °×³—øæ'ßüŸ¥I;¢°‡14 cM±Q" Á Tíi¼Ãt˺NëTÊ*-’ÝÊcÇ@ûÛAMdÆååCfd\q÷º3ñ^ÑMÓlî=[m&“í§½8€$Á‰P(X"L‚ùŒÁÃ6m´`<4( CSÔʲ®c÷š cD)ªE04M1jë,šQ9¹ªÆðeƒ/;ÁóåDÅnìÐL€Ÿ,Â苉ŠÍ§¼¬|«—f-ã³ñ6®œw±i‚ )°AÃHB¡ 9âág ¡ÀMQÉæŒ{mÍ®`#¡ÖE*E„&´kW³VUJ¹r©å‡_ßíeiWc@Ž$8ƒ ySXØ`05˜.cw¶‘‰Œ»WŒŒ6šÇâ‘0Gž,ì (‚ep8D”$˜€ X, ö8c 1Lµ]iš$µvá¯5öÈR¡ðKü”WŽÝ[´a ’0Æ"j®\IK ªÖ+fܺFAed2SMŠAªyòĪUkËh‘‘‘$ÀÝÐÜ(@ 1 H6܃6Ž=νžM¦ZDKMk±èÖРE­V©ùÒaG+•²Èbo„¿¹rËnîÊ•C3Ó,&aÕXZ 6mºp·°dµéŸŠ¤“•Úd$4”„J›ŠE— ###¨ªØ´Ñ¢E‹†0,Á‚ƒ Q*•J{miŒãžnÇã MpΙ¦iµZ Q*JhSQœ(;Hàµb-ó›~Ó÷áØ‡}¸‘È–NS†J$PE€°³mg "IR©¦E^ ­^£Îõ© ɨº¼Ëˆ0mÁbÄÆØ$P€AÉ&+D)RJÇfî\´Ä€s¦ZAƒ-L b2Á&4Ÿ|ºÍ–±o{@JKã7χÇ}´kÛûóî¿Jjm©œq¡r¨óÎaÿ9wwog·ìf'[¶R4ɵ¥½Y´÷œ³—í¦©QƒpÌX=ÆÑž Š æ@@¥ªhy›7¤r€dƒ5MQj&H>¹A ¡R‰Þô¦³¶Æ~š³ÇƒñáñJ|7îj§Ö–PÞ~®IÜŒ½qË)ï„öaÁoö[ Šn†`e ®Ú"‚×eà22Ê­*Um¢Ö;ƒ + Š@œhQdgjª>ò Ikg'¡„ˆZ(’$ÁÁEVE:ª!µ‹iÃHK_^j©¿}‡ãkKΕ•P‹‹[ŸÓî­{³´¯|ñeoœØùâ°ƒW^ÿóÁµØÙȉW$x€q§=£–†hiA¥ÒRUÕ&j}TóÎn£¡ %Œˆ@C´– mrK…ºÒjg%ÍÎUW,I®…ª"¢[¢]ºØ(‹>oÇñI®=.uÔ%]›ú:Û/v·?ìGws?ú^óáM kÎÚ¹è„ñ¶š¾—ÜÝM ó¼bLºz•Fµ6%©TkIehVc«‹nñaË ‹P0JBqšVP*µ`` \ûw¾r¥(ªTסýQ¿èªO}ê¨.œ@©<^z|ùøñç\xqÞÍKWs™½E}^×é:¯Ycms –6…¢¢Îµ§u«Ì'7c¸rcç¢Pî´S–êݶ¶ªÕ¨Ð¨ªR‹ˆò–‚ºp±‹‹³‹ýÈÙ;ÜéHR5Ul…Pœh!A°D­C'„ÑYgŽ* ë´RIëªC¿ð¿i鮊 ÍZ?ÿr|ixåÂíÞ[oX«IH66l‘Ú¥²v‚_ì—üÈY'nü ôIè¤\ñ&)²zÔ©ÔVD¡‡@±çH0‰³C8³xR hŒ-q<†[º (T*-MŠâ¤šP*a/€Vêj…(U¢Ï3Ú0T”¨BR"$pá.ÐÁ§’C¥4Õ¢´D„³È––v¥V«™¥V-µZ'õ`jKñKí¹r·/:GUí¥ÚXÛÎE_ùâ’&´ü$p क$ R©Ø­I*i ­Vs¢%Q‰èqWë°m"Õš•ˆB%j ]'QÓ*µ-›È=Gµ¶¢V+˜z×G}Ôú­ÛÛ/v·{Sç:úÇ®Å"xŸ{{S­—ŠT< 4j&‹E2”< E’ CšZBÛ‡Z-BC Ú €þGÿw‹Šêêt;saQj©E¡Ò¡ þOÓ" iµ†µ:8ª•ZšjÕj…B»*¹×úÚ}µ»]³sÔµºzíî¶ûÜÅóc†bu•R©?µ±i2i&«Ôjmµå Qk'¹°ÓÐRkihƒ†Z¥¥¥¥R«Õu¨Án×íb8²%+uÑVK­=÷|Vi+J¥Zm´b‡@Q*ZÚ îÛ޼“$­V«…WÍìI¾ÚŽÄØVÃV”‡Àá˰гN²-DÄеÖëõZëúu­õ÷ûëõúûøúßu]E0Ÿ@"O"‚*Ïù÷ëuÕD0óyrœs@œ ýnjj€žÁˆîFE„¹=øç²P%ú¦jÉbúéy‚ª»y'n@œ:çDFŒ›þÿû.¢7'tÀƒúèáù ³÷^]nêA’$Õ¶mÛ2óÈÖÇœkï}Su¨LÌT,¬üáì½æ½gx(mÛ€éeUnm;¶M’îy8qéÖã×GdFdV¢Ìvw}˶mÛ¶m|f«º¬¬´3ÃñF¼~ž÷á­K'ŽcŒÕÙË›µm×¶m²®Ûq¿‰Ú%- ÚªIࣴYV@íŒÿ¦Uï½Ï}õ%I’#Ù¶m‰¨ydÕ˜s®uÀø#sqƒî<àö î}½xßî½Öœ£*Ý41’dœ}OÛáv[Ûb¹±ô¡­ë~"bS‚Rb[f»\å:§°™™™™¹û[î—™™ùmæ> Ål™d”,Vò†ˆxžk ï²Ê·$I–$I¶EÄbî‘YÕ·µï—ÿÿºûÞ=]™áf*ìÙ¶mÙ‘$IZkß÷"&QuºüÿŸ·^|EôêRÕX„ˆ¼{v8 m¥m°3«Æ4YfÕôp–$Ûµ%I’ÈÚçÜûž™9*Œ1Ö¬gMýÙ¸g5oŒq'Œ¨föìÝ{Ï^JôöyY¿à[$K’$Éd‹ì¹Ïÿé­3TÈ“$ɲmK’DÄë¼÷U-êùOÒËPÕÿî Xì¶m˜n;‰ àá¡è×ÿ€¦mÛ‘¾¬áé9—±Íc\û¾<ÄI±ËÝUÝŸmû7Ûl£¬8yIžß»¾÷XÛZ^k®é9‡>ø²mÛµm»uJ­­÷1×Úûœ PÞ+úò \Ï*6úó^ “¥!/Ã>¸çì½æ½µê˶mÕ¶mÉ©Ðús®µ÷9ç3Iúf–ÌL'f K.7é‘™ "ÀÌdðî={¯µæ½µ½ð("In,sdF2C1Wuw5ó@ƒ4bY¶l™×o½pû–÷övoñí[3Ë–,–†¹§«‹¹’ƒÞÝ7øɵm¹u""³Æs®µ÷>§»šëå¥'ïHíòº'}—>GOþh”÷Þ{颻ÏÙ{­5çU™á[ÛnÕ¶íÈùÿ¿”R[k½1çZ[RDdší#fJ)¤PÈŒg¾:b¶¯…íÁÖf…œ`æ4;HÒ¦5ç£÷Öj-¥„ ¶‘Žþµà]Õ¶Ûh*†ÅÜsQ’eÇv‡ÓÝß033ã;Ì{Ì_fffž4„L²¤« ‡7..®¦'ð`Û¶lÛvÛ´Öçy´ó¤p®"â²Òå MñîY£ù’$É‘lÛ¶DÔ÷¾÷DDÕ ˜9ŠYc.å÷23g)ËÁ”hnfª*"ïÝ{ÎÞkØVâVtKÓÆ±‚€Kú×ñÙ¶jÛ¶m¥\Jm½1a33æÅOøØáˆpt8’N˜Ï‰;"0lfØZ«µd³ÝkïcLÀ·$I–$I¶E$êÑ÷îÿÿÈ{÷LV¸©oA’,I’$ Õ³çúÿ¿z«4¡pI’!õÛÖxùÞ€6µm’äq­µ¶/Þ~Œ÷ypd(3Ëhm~´g>á»mÏ´»«jÊ™Y©`FÄk=~nß×}éxk <ضíÚ¶Ý8­õ±Ö>÷½ÿRÞ+^ÄHÊeI9³)ÞK$ðÿ{÷ì½æèdÛVmÛ’V[ïc®µ÷9÷>÷ÏÊ F¸eˆ%Ib)àA€0LAîïÝ{ÎÙ{Í1z‹jø¶mÛn#ɶZs u13wôˆµï×ÿÿ¤ûÞy‰ôp3I$0ç½Í×/ø–$É’$ɶˆDÍ£ú²îëÿ¿rfÖª 7ò-I’%I’m±¨ydÿÿ¯Î¥#ÜT8$A’ÛFw÷¼¡ØxûH‘$I¶„TÕÀ) #±°««§q§ιÌÌø|¿àþÑ}>÷i™†gš “3ÐÑ@UEäÂOx’$I’mÛ’ˆXÔÖÚçÞû¢ŽáüêAŒ9zuÄd¢‘ùÞ=g/7ö I’#ɶm©¨ZDV÷Zçœû&tÁ¡÷†õñÿƒzè  ¦ñ1Æ÷î½VWf¸i¨MÛ€yÃNÙ5oû¤H’$Ïë÷U3wÊŒ¬„Êj*fffæÓ23Ão{ãÝ333csO3wgAbDx¸»™©ŠÈóìÇÚ¶UÛ¶$©µ¾ö}†*™³»Vd$› äüßÙk4ß’$Y’$Ù‹šGä­¯3ó=óoó³÷Kß2+ÂÝ„C‘ÛFJo£yÓ‚¼ hÚ¶%É«žÖò^kóøœëg„‘‘®êÎlÛ¶~€>Ú¶;ˆtè½ï½ë{¼ÏöÞËkƒ¾lÛ–mÛm¤Öú˜ûÜ@æqœ I¾÷ ÊýÛ³cn$X¢""¢äqjÌDàݽ×݃$IŽ$Û¶¥ÀÜ#«º×Úûœñ 2Æx³×ê®Ê7ÓŽÛÿ«¶Ý¶݀ɸ˜7Óa–ÎK¶dfÇá6u7í½·Ü^ffHÊ&'³eYLGG‡a3ï½æšk2Œ1žçÚ‰Ù¶eÛv©÷1×¹ï#¡’HJ£”T©ˆ @i™"àIirw’ÿ¿wÎ^sxÉ‘$ÛŽDDÕÌ="³ª»Ï9|7ô'Àºœçìæoø 8_Ïœ¾wOw‘̈p3U Œ$Ú{ÛþÕ1lëq$IÒô}DTÍÌ="³ØÏ†ó™ýo…sN³23ÜÝÌTEøÎI÷êÞ‚oA’,I’$ -f¯ÿÿ³•®B¾%I²$I²-"fõêûÿ?õr.&nIr”ðnÍÍÞ̉‡kÛ–mo[{mßü0½Ìßû1Š%K²eb '…@æ\ÌÌÌ«ŒigÚ4mŽÇ$‹Yú˜ßïe|o¼pŒ•v._¶mÛ¶ÝFRk}Ì}î%e¥x‚ìA¢Ü=Ua”,Y!Td&¾üMâî½æè¾lÛvmÛnZjk}̹Ö>û\˜ç­¼ ‚åð(' #ýz‘÷ åc //ÑÀÜsÎÞkÍÑ{«¡†m#E·âv÷Ì ’$Ûú¾ÂŽŒ´UY6ڞƘ«Y{Ͻ÷ÜwõlóøwϹÇgñì°g¦ªê²3+m†ïƒ/’$I’$é ±˜yDFmßs”žÊ¥·;ÕáÙû™¦–Ì™¹KUo‘î¦"„ž@r$I’%"bQ53ˆÌªê‡Ámû xoû+ƒy݃ßà`Œwïð†áÌvweeD¸»™ª 3…Ú¶m˜'l§—±°oßóuä+S¡}ý÷þÒú}|•j`B¤(qP61$Òƒ¦ ¸Ã¸ ‹ˆF" Bœè#8Ò€(‚ˆ`´¥‘DzÉ´HˆlQ Aš€@€`‹ xçž@¢‚*@ *¨¨¨Ð® *P€€8 ¤ ¬Á²¹T¦` àx|† 8mG Œ2Y³³fgd 63™ ' €Ù €‰dmZn´ ѯ‰Y={õ½œ ìqßïûvûÏ?óûGÿ%Ë{LÀ⌤[í““ôn¼31F˜ÄA @¢’žª Ë E•¥¨ 1DîÈ$Ôâ‚‹êâÖ` zÑ ­ªDA—•h•$Î3½«+z- X,AP† LÐЀ €‚ Œ0âB (šPM'xà ŒyÀB‚ˆaÄÑ2€»Yˈ50Ó »±£` Ð#¼Hˆ. ™à Š))¡2¨“ìÚHcÖïlBB&ƒ1VT`„€€d0z©Ì.%Ä‚x'­2$XeÑ ŽtÈ"AÅ Qذ4¢áAÜÒ€¡f„)0€É˜ Öˆêd(``‹“K€´ ä݉eÀˆ @1”«lÖã€<5R» 5V@²b)„+Tƒ1X°`m@uVFŠÂ–’@S(Ähˆ€¢»@ƒ` TP(x¿?#„‚ÂåÈ@E€s¿ÿ=ЃG-Z<,B+I‚žø Â>Œœ¢¥e<…tþ¶Ÿ»ö| 0cp@ÃÙ~XÆÉÛå¶™ÿÿÔnyVo;…í—±Ûg„¾ <¨Ú©·˜B½¸–åèÁZ`T˜6í¡@bâc‚Þæ[HSTÄÆº)s#» ?ó~ú_/ŸíÀlTù#jïu}‡b–Ëš­»ã·ëÞÏý÷Ÿ(hkõƤj P´!©XOtAp­?¬±zv@ú°B`৯ÿú½~¾â®rPNv±²-œ’@‹T’¬%-ûWÝTQÊû뿾??å  ™2åÄÁ —Ô¹Þ#éÔ[r‰y†$îk}E„­P£j&&ÜE=S“.°0ÿà·s®œCá°•®]¡×îS»‹ã‰gpK.: 8Ù+õضfÊj=ÚÀ£ÛŒ$®-Ö8ùÛiø• RHxóïaý¶Õ—ñuÞþUW…ˆRà³Û'¯ó»“Qž³ƒ–c¬â ×,õ’%‡Ë¸àMê×xŽ_sGµ6 (€B¸ ”0ÚT! `'âÏÿ~?ýõl¼ü¶“oô;qCx´í¨Ä{‰RP5€j…š°RkP°Äª…n~&GN€ƒçc;üóSÿã?—³–èʾ»‡1ïÏüu~øÞËêGëåÿýWþÏ/@bø¼¾@äg~²\ôEÇÌ`:xd´pÍ èBÈúˆÄ …‚ 2@!Z¡¡Pׄ„<ª %B ^XHk! P Bt¶Ï¶Q«'­ ªQ‚ µú(.®,*ŒD„BP(JTQŒd©¥À¡^µb=ñŒ’D -!  Œ`‰ÒX*0ÀµÚ##[ª•kAIáÂRX!E´ 6  uÒð’M¥£(SŽ\%°«‰õœ_'+„J'èR0A'mø"Ì–é Áè„Cp”ºC XÉ4±á`ôfù@©C €å0­{ À½XJ˜°vÞwtžæ˜#ŒbmŒü“_L,鈀NÏ!CLIR”éd‚T k „(¡wR‚‘!#±Ö¥è7ïþ,ímÌ¡1ȃړ/„èÓ‘Ì/”÷B8"E.нº7­ñißÁ»’ZX·1˜Ù³c›èÞ]6 d3³m›C¢'9rp±ë½‡ajï/"™dåრ“iå«™0LŸ4^)VËôä0 ÁÉ âjÆ@š3 mùègSèKß:üçåôÑÈM™&I091Ÿ5kq îØ¯oÈGÍ:ð&Œ©â‚ Dõý „у^ˆa´ G#H4#` 5 * ^¨b¡©$€ÝìFÅ *¨²ƒÈ bM ˆÉ;÷@Y*XŒÐ£„*!€„ 2ï#2ÔµZ~¿'B,¨`P±Œ T0¨40d–XAT„((VÖY£AaE  €„Ñ;@‚ÂÂ@F€tF|³e ­€Ô( @T¬F"e¤ë½‹,Ȳ 5FdFÄŒšÁš„ „jË;°GZ FD‹U@±XP,Z¬Â•xÙh‹@©ˆa™>”eò€ Ô €Ë„ÅBAÀ¢jQEU @ÁÚ¨­jA €?¬&4¨qý&P©bHðT€Ä£¶žXC}ˆ_ê“åçûSËtœÌòõçS¹žv{}õÏæ4œ¹?·¿{üM;ûé‡~÷þWãö6Ï=Öï]Ï3p_ê«7µj… 1Fƒƒ$|±Ægúkîg/QÔÐLÍíÇñrï¶÷éX’Þ´~å•F«a9ĨÔÊÏýòßö¯ÿв•õ]]9ØËI§—¶ãfß÷¿ÆNœñ·õ¶ iÂ…° ߫ՊUj±©‘Vœ«f@‰¨qöÁ "1«Ï!­-³¶86íȶß|Ü%å)tº˜J[ë[}yö¯ÿP^Û6¶ „ïõnU>ä®S.ìkšü#&Ú¹ç¬ù3eT¦Np̽M×Ä]!¼Ÿ=Ÿ<ô6°REJuî¤eìw¦Gë?LèÊT»wm ”ÜäžzR¾Ï!LX•Ò)I;i™ 5ÖŒÄåäoÂ|Q°:àÆLÛ™vsk?ÞïÌýçß1*tqzD0Ì«Ùu _ßh€õÄN]¢8½ÍÛL— Bjfløª€åR±$*`=Š"r@]ô4@µ(P€QVGÏ?ÛÇÍüûß®GTijËrê•+JX@Âð p="Ö¸5 -GNëʶ MFþ‘SäŸÿñø~Øåœsʹ1Mf‰;0ÿóù}0 ; AÀF!& €DÌDÖ¢Lœ0‘  FÀXj&¤…c]ÒÚ¢r 0P@…PSNC¤l G¦¡që*å Q‚5 ÄàEW«‹7µTe-,(q1D¶H46 Ô^M5Æ in-–£Ò‰¨ B!5@!b”¤§’T­( X,ÁöÔ”Åh4 ŒP#A: À¤P)@©)­¢F#aqm¼8à{+ª°Øx­âÔj0Ú˜ØÀ´!l;šÀµƒ‰ŠÕ³-á–Âï%’%p°A„H"rÕÃäL‘# ø —Ÿ¹êÁ ³!AömÍr:пw([BPln¤ azˆGQ¸9k,ÍÜ•ÐàÒ{ P¡b$5„L˜dà ²+Å’ )g 9ß}A˜@!ì`<ðû{ó ·±¡ÄE5>=ô’!®¥AH†ƒ ƒ„°[øJ¸@˜Ô¢¶¼Ý"ãˆ9Drã¶v»áŽg|È)Hä˜#©ÁLSB|{äi‘IðÁ¨GÀü䬿1¢¥ ’¬†#«P“à”¤H'Òœ„3Ô:Øá9{kæ0LŸ£ ÚõfHVrbÒA2#1·ÃørR. ‰F³·X6ÈÆÆûÒ1ûÍ}Ž[Ó­­³ßŽæûÃLú~eãLR5ÆðððLzùC¸„<ÜÈ bdë 0zö{“ñ²3$<½Á€wÅÜ(¾ÓÊ*’L !µ¤@€b2Èô,˜5 s8Ôž 0–1¸Çˆ-*67VI˜šæÂiÎz¡å`ت3cd/èæ¬ éÊÈ1Â] h0Ñ QUR1hTÜBA»  T²²ø6 €… +4Üp­-®( TÄ0Ú1dh4Ñ’ME d$üKïrð¼a~ïØÝýñØ{½£™ÆŸš jl£~Òú9‘ 0x0j’”&ùéÉòI&ôIXÎÀ ŠP¨(E¢DcŒ‰‰4Z`SÖžôµ¬XX\\…,ª#%n)FYDi(i€D$ |C„€¸ˆ )À,€ € *ŒÐ`ÀOpÄ8P±b„†hÂhF¥©wžÇ’ÝÑ(¬PDä®e¢P@€Ñ6# +Ô L€€ „PÆh‘}·í² QÐ"ha " ˆ @ÀŠ„lB@U¾P±€ BÝ„Y\¨pœ¡{@PŒl;¨ ¨!£|¹‹7\¡Ù‰8ì’ú(ªÌ€%ƒ5  ‘ÍZÐŒ @#ˆVŒ€ >¬DHX¡¨ŒDX€€Þe‰ÀŠ *@Ö°‚jdà€ŒP‡pPµ¿,XT0±,V@e%Á•þ¬T `XP€R +éiC\@®cÓKÕ°« ¥€6€|ÐX Àcé*,F±ËOê«©!¤‘´6€`@OÎÑxdvú'u–ï]ðòÓðšŽ9Å›ulÏÚ¹=îg^ªûÓ¿âÙÛoÖ$Ûc[ûôâAèunU sñš4ŒW_K½8Œ5÷2øL̪ÎÉÅúÜF8˜‹ ³bÑ÷?Î;Fµmì›ùÎ}‘ÆÜ6½L”5ô‡8ïë¿oÿÇŸ6UZióu^Õ0BN£÷³·š·j¾3G퉦brîë;d]+¢$«QoKEŒšeÖ£ / Œ.К €jµ°@Âð8O@VÚ¨$¦QÕi ãöBMl°Á"R¥êåó~ùë.Ù«©n„ôÐá°1~¸é4é_êÂÛËW¸å@×Ê «’m9c=ÈU•ïûÍ¿²as;5k±öf@>lÕ%2ºÞÙ}—›BÍ„QÓ® ¬¨Ò?·–%IŽ0•Ïã6¼¯þL:`,7¶؆FÓ·'k÷xænw˜3&½x7·û6_ó=~‡M%×BƒÕÏ´y/(4ÆËx§ × 9Lŵ5†ñª+ª €a €@a@Œ©Šõ#6(T‹›+‰S©(GŒNns¤¢ÖZü¥ˆW/^MLXŒ¦…P 1ÒÑjÔ$fclcõ(a•Å Q@ 976ôq|¶PÀ }¸F@ÀÆøˆ= 6¦$Ô ,N£Õh5°šBQDê*ªŒ'Fp°@+hu–1ºaë‹ÓÆÄx–V!.Ɉ}T—EÊ”?‰õ=ÞËt&QŽÐ'H˜ :I ½€—H.¥ d/3IcÊ$´” cfZ~$j¯¼½ý%OHGñ|"ÂM~¼ê ñ»‚+¿grÖbç5Ö"T&JJrð œ( ÊäØ)S2%7‰Ú!€€ @µ`X⥆»…‰éM{m@f³¼¡‰£™ü¸}BèCÆðõÕ?y’àÀ²h(Ò˜ÐRã“«MÇÆÂ{¿òaVpDÛ‡ÝÇ>_\ŽÇe‘T6EóÏÑ ¡ûIÏ™À-‰øbðHh!g~úàÁ PZ-É‚€w,$h@æ'éâ(!÷B’ŒߥTvš(Ë‘3'hË z,û+é :zeV†³Ïf2²Z"é” iXFèd1²—L2œ¼+rõÑ‘¿ }Æ›½Þ¦ã[·\ ÞYÞ¸çV—N#õd½/GIB"Á øè^2Ìp¦¥ñ$™z%îr83xšœdoFã]’­•E‚áTà@~ä>Í.‡{ *BPó´Ø;ŒâЈ‘#ª†«P $æÒÙj:|¥eBÁépKº‡$jÙypÖ¡ ¢ Õ ¢¢ªTAP, +…B%†•6Ú@аp… Fë F Œ4, ¤Ä´°‰ŒŠz°AP‰ BB @j¬¶÷›ÆkÞ&ÏÇLúWgگȣ7§§ïâfr¶ ሠѤª­óY«S7F%+fÞM=TÖçÝ4q~ÕÐC½÷ûXß)ÅvxvêqíK’ÊG )€C*€Ä2f‘L,P‰„EP@B$€$©"€a¤±¶¡â %@ H¡ ia $!B"„2ï5ѨŠ€Â ™ÎmEël¿ŸÊÀ¢b}ðPm\Y»šKU`‰YVP*ò€€KnEƒAü•0 Î ÞUæàbñôßOŒè)Œ#ê'èçñ<þ6çÍG~Hÿ/Âð/ßâçõåóø^Ïüu¡ôzÚæÊ¾fY"^ðÁŽš1´z„ ’p•ÕàW¥PÊ”T4ViÂ6Ò°©E`q(µ€ªÁBqãJU±¸9Y´ šŠ@(Á(õ*É-I€TŒ@€Ð2M €À….˜ÐNxBà @ h¤0 PÙ%hßË ÕnùG0²@@¬É aE0ª‡3Ê¢F„€UF`!Í€C£   ˆ@ˆ… (£©µ&@ä0@  ª‘ÕD%#³wë?ÐnX=ˆ-tÈldž]hhë]xÄÀ(SÉ`+#Q „á` 02ÀÃ`+Ãhj Yþ² aÅðΚL Ÿ4#ªìn€Œ°C•ÉoTvÑÊÀQ#RŒÁd¸±ä5´1á ÇÁ @Y&Áãj:®ˆh–ý%X²N@ðX|>€ð„Ç¢ŽV-€ñ°(¾K ß@˜œÂúi‘˜]:m„¡¦­ ±hdF×…íÃz|ú‡éu¹V4²#RÀ9@c©õÿa©#ßõRLüƒö\§XŸ›(²²ÅÛfj¢‰Òá_f:û°;×¶1^øçûùÇæ+k››ÝD~k{³\c½ÕýÌ,>YÈí?ÔÙ¿ýÕ!¹gßÎ’›*¾ŽÚÑ ÉÅÄÇàbŒPƒüv:ˆIw[fÔU# °*ó¨%F”Å hCX ÔÌÃdÁZ(ê‰Á[m•¥F‰-ÄÐå‚x›]Ÿ{9ͤÕã¢í6!eLrbm¹:OæÎ½ó÷\»s@c ·æŸ-K:wÈ «gj“WmrÑ$2 \™åQR–j‘qÍí$¹êŽï66™¼ÇV[ˆN›{móÍÅ“u¼[›(0EæÊ7¬Þ©6F%­mŽ^gò%® ê' Ô` 2ò[5€’E…{C—YMbÐ4$@V{Xê’î2®ºlýöÿ|â €8æ€-õ-ºxbT²`Ùµ€V€Õ ¬§=ÒúpåØ  þ àìæÙäXJ­ŒK_ì’Œu]jDøö@Bå¬aäg’ÁD¹4Þ|¹‚³Êì8i®êŽ$+™A`, (¡ç~A@a+´$ "î ýŒDT°1Û‡ö”CØ ¯ °=úmÖY¹1êZÊbp!Í”PQˆ·VTZ‚ 1ˇ>ÛlœÂÆQF#…UA6Pƒ‘°ž†®›ó=Ï”V­,žk XTV¦`, :-ÈŦ,â0ØÎkµŒ*s*,f¥¬)P,Y ¥Pذ¬€7&`úô€ßEcXMõ{<ê‡uÞé’XÈØúhnŸ ¨Ð…ÆZY}åÒ'ywÞ>À¤d$Á›[1ÁIøl$1G"WF2vV5Å × ér€·?Ó'[TôQ¥±>¢[ŠØPDU q5hÚŸeÚgC<²ˆ"RT£@÷ÖN®c!…"B+i4  "LF®¶ÍêŸöCãm– `a-äÃAðÔh T$ˆ°rq’&…6„ÁðP£@bŠZYŒ&¤K©ÃY#Jµª…„P ´BÁ}Ðb„DW`D(à3žH…,#e@´@ (hPZçMãC8‡dº¥-Q*!HÁZ+¨Òðr$|_Žú–à OÓÙ¤ô|Òq’pü4©:©¥™çFsà„DbY¹‚ˆôå\, K[x )ì(©5^F=[-·º x„ X äH A ] €z[:͇ݼÛ^ëÀ³ýÀo#÷>¸!Õb¶mÍÌüezý–F¬Ý @}ñˆ„ÏD"Èå–‚Ž ÅLÀš)$Æ*ÂÀ7PNÍš qˆ^6 2Nê¬ô€oYìrrt&²#](£ œ"'#ƒÒ9è|"'ƒ“k¹ÎÆÊo%ÖŒí<|DnŽd¸ÌŽAàHJp‚z€ü”Åñdºeà†?Q`ºÙr$0&9’ÐÏ~Àô2 ² +px¨ ­-€@Í“òK*O¦û®YaËF挣ßíñÄ™¦²‡îr^fËÔ} Gކ`{Üyùííý¼ô¾À™{üýoß>ýÉ|WêB˜h@ål¡•IL @$ ˆ¬¨0!Ê8Ò „€H‘!C„€€"(HhÕÎdŸe­è]§bæÎ–=bg4¯F*GC_ºa™PQ€Áb¢ˆ* TDe‰¡5Ê Ft%]ïÜŽ-EUu ‡[àöóþ2ý˜>™ÞÇàªG­æ‹Q÷™Ïǽ%^Ól<Ê~½íÖ &Ntîzxa/çŠZÜV$縼Ýçà4kXKÂúÖ§>ÃåÜœy—ÊUäoÆýWo½”Á8IJ8ã­’ r"T ‹ÀM—°zîúû….3ÃŽÁÀºG5uÍMeá\";ÌÇËÙŸÎ빓L£fv7Nà =/ì¡ïÄ̵¢‰8~­ «ÀF+©âÅ2,»&‰Ý™»ùþðUzºÁhª°X L9÷r6Ìau¸ž÷â̿9^}ãX¦Ø:Õé2”Ϳߑ1*ŒPL@R,€€¼»æÎi¬…X&î=…†r2cHW÷p/sB˜#rÀd`±TXÀpf¥%Y‘ s;ÑNC!ª0 €JX…UEUxUƒ'ž(aJ ME£õš”QbA(j¨À…H…hXŸhÚÝuîÅÖïsÇ£ƒÐâ ài ûƒ(,SØ(€Ð 2 …¢5 (QJX P¹º),ã$JÕVZƨ-ÕÄÁ–õ|ÀCªÀ€…€Bð`Ïó¨R@++Äzƒ1 DPØšhb#ëƒ^ë(´‚6¢3$‚ÁðèL0!-cyy“&hbHGÊe"˜TÅ8*¸ƒ…¡d&„Å/@0„ Öƒ ÒÉp· ’w2FÈ“…/Á^ ‡›.Çi@žì dx"4Õ"†‡JD§Ó|2ä S¬“N—À$l! Á)-dð$ŽÉ€AG:! ”¤à€¼³­}}ÃÂäÛ¯·lLf* ­£ É †BcÓæf‚Zš~>úó©vïß?nûv½IŽ$ŽÅ'¥A¢%ÒcP®X@tZ›ëH‘„A¼¯Làò8ì’}&d@ÊÑ™ÇrP⊦3 ß$‘S ØŒlL@‚m†“p–¹%›)âiJ¨ˆˆ ¦-–™8-ØèLÚcNxc¬…’"\6Ä$Ùj£1r$ÜHáæI7H NJªe” žS©ÉZžnB²†p‹³&À!ùö ¡XE&¨)]r„ŽPTJML x-  ’YÙ@£ÌÁ *T¨åFF`H¶@'… &(0 ´ÅƒÆ¡^Ϩ’"Ëhš¢ÂBÀÕ©×­s$`%DƇÈîòÇÍpJãÔctÎÄ*Äô¤¢@ˆfv§–è(Ü'‘—d†co5v/âÌ3ØfÌû°´›¢zŽ=q˜—wê÷å׿ñð~ŽßÿñÍjSëyýc£|‘õÆøƒó\ËùÝC»Ã~ÈRKÓÕjóŒïc.ø‰á÷æ+$ ‚PöH »ù3ZõWß|ðJ²Þ䆨“¬Y&φ*£>Ö~˜6  ðB*ZdD¥¨bTœ°Ä§¥510* N tÇGJ!™q£ÆQ+”¨jJ–R‘´„Âe¦]ÑH.gì‹ÜŒ¢ ³‘ €TFÃxO DDA!x÷H*€lt~¶ÂM€ ôÈA@M5`2¨ (¨ ¸@H2UoR ,dP3(GâÐÊp›lA(Š É.’wpÑE@€4€£ 1„)2z €ˆ € Æ<.(Ô2$Y·? +*TíÎ4€0ɨP¬v)€Ìù ¼2­(A@$ @@6„F!{l1<ÐN€ k  ©/M #¿c 1¬h*d1¡†À¨5*€ )€U¨†åè˜@—gˆ-`b€B¨Õ€R©Š­)£^3ú™xSÚþT¿ÿµ¸Q$y̯à.ƒ»âYÊ5ÜJŒD’"òUýÿmÑÿµ}ôÇŹõçž À(QTZ‡Þ ds÷è„&…UÚîiyÂ9ØYm ^·€ ]@,Ï?÷é__£Å ¦Å¢æM­ËZSÕ3Sæ­ÿ<M-J‹ÇÓaôXNxWïó9·f›³—ÙO²»ÞvØxãçâö9]^ç–÷`ÀN NR×zSÅÍÜ—Ï>}úÜü£®ÇÃ2WÌï˺g¡[oŸÆ‘ÁÛÌ-‹È¡7XzŒ·WR’Ä$_âØ¦Ÿ¼‡þx뻾¾íÔ;‰ó­76²Íežã«•M¼Wiƒ à¹ÕEª±úÓíÓÕ›šÆ[kш‹ȸpVC<Ù,ç& úk—§Ë½W¤9»ë¥ÈæÊ ŽïðK.£è»lÜ€f´ÂS6j9€„n-:ð©ÓÛ,B[¬mÿÌ1ø6Þ0 Ý ¥°![ÄD—@ôÜÐZ±PP"g¤‰ðü VgÆHJ±Ž…Ä-A™cy…ê¯ áVðîÉä TJAxò·‚` (Î6Â)N¹&<±Èåªé¹;=Ë‹‘l&’Äx=ocv<ñÃeïÕý:þ¢O¼¼5A3lLù&+ÖVËйv5’ø`Ë8d>ýúëþç§ó²wÛ~¿þ¶7_Ž4˜¬Å¥Û;¶Ûô ’!0 "ß…Éxà|yVÚò‰v¹aÈdÍ8Ø 4€  –\Ü*Hœ;`Ó\-y. ¸mBÆäx¶DÊ™J9Iá`þeñÕdkñ®MŒ%PYo"ß&e'Ä@r¯¡ÀA˜tA bËêK0à$¤†½[÷] WžaH!œfɦ!! 鬗€ˆ¬y’ÛL€ä;i%*¤¡pE‚d W& £êD €P2BŽWD“QÞ`ÐÒ(“9#½W†Q›<€†¡½áÌ3$ÝÃó”l ¨Œ|y DÚ¬ÃÝŽ¼Çùf³yŠë;}>—=}×4[©ÿdóèé©kž”7dr„ DÊžM4tà>®U]ÔÛœ>×]h÷8*pGydgyp{¯õ…åd%«kÜç«Ø6ûo·Ë«û—ÛsÄ÷5ÿ£ÿÀßìVÕUä¤8܆)(F‘€_.ß#/TÄ0" ˆ%vz´hX¡ MÕ(³‚ £Ó(EÕÕüª˜(Ä¢HMAS(J‰JUŽÝŽg € ²€ªdiŠ `%‹{–<§3VØœ#ƒÉ8ô` „@Ç1æncf=2Y!ÀdfâDGC<ÛÞñˆÏã9³3_YÊ{lç—=CPÞ1T£(»ªã#ž“ „@eCã T¨ ®€¨"á!…ÂAÅ:eúë‹î6Õ3±1V¡'?¢ÕJl`GZ£pDC$ h•L@¨È~…Ó 5Ñ\©ZeêȘH[4hÃR@¦Q6Фç0Ó ƒÖÔPB5/21ˆ£LLT@@g$?#Æ´Ä@Å“ŒÂÄŠeÔ°@hW» T™6É@£( TT´2j$Ã’‰kd”m0 ƒà Nsô1b‹ÊXgÅ €h`Ö&‚0@¨ÑDÂÀ@²Â²ÁP–¶Ì"Ë8˜Æ)Z¬¨bêhȨ•"%H"»\š.pqv²åŒºâ,ÇòcÒ?SUi¥åP>Îþ}äß ­h\¦ÝÅÅÑ‚õŸ×ø_Ö|ʧ…ÔvÑ›ïsqCI­;ˆè 5+Q^WÎáâM÷M^¼a8*M,FV# »6 `5lŸ}ùÇ[2¤Â ɉÞÔcû¹mº–0yÚW\KýéñûÜù—¡¶¼-âêÕ£ ž§5©Ã0š¾pÿäXÇq÷¾×Ÿêf/Þé»’áܨ¢lØÙ¿ëWûÔV?¿üsîÛå·ËÍc,½Dƒ4 ßd™1€g:…‚­66Ø~hY²F¡—Q|åšù“I„¦¦á¶@“ÆYÚ¾÷‚‡–èî”—ŸLDï=t”z 5)„Ì¥œÔ¨÷ÖLÅFRžLxwJ}!E’™èmbiÆaf,YC¾LÚ0é5ŸZ†<¶±›¼õMN§+&Ün‹ŒÛû;ùo°öð‡f—2oAÈ)CI"`¡Ö‡ wƒÑéR[\© ÀÆ'ÁÕ¼Oíü$h,°F™‹“æ´‚*lK7uk-,nN/f­GÊ€ê®QáŠ0Jj@ÜÚå¨OÆ MüR"´RFÆBmlB´jWˆhUÕ®JØ0Z€XA,ÖhQ+PXQ]`°ïRרžÀ£ˆ¶Z”£l Š,¨Ð` §yRX•R#*¡ˆ¡@ X”jQÚr@¬ôi~s®ðJ&å+ð\AöO€x™ádrz’HOB’&wÀ„çq¬ýY ²bÒ˜IL‡O9IOÀ¾ƒ–þ°]ñu¤'Ãåøq.„?Y A J2"B €râΡral’¤@NJki Dk=&O.Î÷îʵKY!ÚðIç“ísïÆÚWpäÌæŸøüÞïc¯Ùë`4%ÃA`¼¥C„- XP@"Á¨7TÏü`AÕÕ×ß÷obÎ×ù[l~¿ì3?ôØáYª-ïÁ€¡»zL/VÝ“Õ5^ÞæãÛ8úè¼’¾k¬n0©¡XŽéG¢ÏC2Ù%a$ It²š‰p¨Š$€DM¦™U(}øÌQ ì @f:%D\@º-Á:ží ˜Œˆ IšÉ9„F!’D„@9 ‰“€ÎÈ,Lb!Ï@Iæy€¦Iä¸JÀ(8+*ÈšUPÔ(OLHg=}pz átN‘\{ #ÀPF !Ä‚ª  @ PZ„J”€0YDzÓFbDÂUbš@„š‘À€Š µr‹ÌnÊÇ F((aØ`o¦¨äç'Qâ…ˆ0’P+e:ŽÖÑ;›å¡òå»ï¨‡¹O*¹V·¿iŸ®ÁªO·R…µJɦáêB¥–æQ·kìa;ÔõÍŒâÊ /·U©ôÊ@‰'·°Âc:OÁ%~õ·[óË_>ø³Ÿ¢•ê%¸6õ}&«1Q§µÎ ÐÅ ‘ìú\>ÿr„rõö ½ü§…o!Šœ€Ý† /SÝf[ÐX¦ !’Q• T²ñƒ Še‰J±+nS¢P)•  g¼£]Á]–Uy¸äühõmd`Ò}‘zÖë·»n¸£{ÚP-‡qÝEÛ¡lÅ›Œ 3€ð¾Ïã{|ö>‡×«Ï<>r”"¿@M" e€HX¤,3Å F­4o¹Õ` hÕÁà‰Ô1vÜhE,n 0ú¨…E@…QH-*€£cTU¡@&¡ÐQÑ¢@ÕJI)ΤSñ@HgñŒ-ü], mÀ{Úô½†Ð£‚"Âj‹€ õ0ÀC€ Ädä#U¨€¨AÊäl…@°, jޏ3“íìEï~=>±—q‚Ðõ6Œçú0[\1-Yd Ú{c$‚t #T²!ƒŠ<0  J5A³BÕ% ‡Åµ®¨,µeò3Î Iƒ¬Zö1%Ò/ÍôÙSÑ‘AèY˜Dy¡H´%-Ú”…!``´»‚Am¦†‘RHÂhT…âZYº&l ,}” @"ä°4€&š)€tFÛõXà ÉÈÐÌ…q&Äo¤U Q» (DF·ÔY£0JÆÓ D@ÅŠ€# *˜J"¢Œô1aB&4‘Ö PhQëû@Y~'ƒPÕjAU´XËE}Qßø©Ô¨@i\‚=MM= (ç•1ÓôgÒŸ¤·lýX>ö·…#þÏj²(‰˜òcÅÖ&ÿÞñG?vûŸ[Fa1ÁTûêûÖíÊLÊ«.lf†U­…nUÔÈ Ú¥¢d…¹jG¶Æ:ˆm3¦IE¶³‹['c’@…ÂöðüÖÏë?G—hûÕ:œÆ›šSK9U¹µúta–ác¨n—>íCbCM®tñkÇäý–¾™f€œ¢TêÜúê‰<­ùýD¾MÖÚ¦çÍAL‘-5ŽÚLcdŽnm=Z„¦·Dá3þÖXc­UXr¬(Hµ Âk™¶ïnÙ´°l7ã@½Ì,T]·V¥eè û4ˆ¶ÆÉ¤FtúÔL‰ºá$»¤®n«7nÇÀÃIÒ®ÇÖc‡nvgr×XHí'²ÐÙNéÐLòU“½µä&oæÆ7y-¯D§§ÖîvgOV’@ÖïíO÷5ÔÀæb€R#”Z „•Áb R¨)È‘sÍGŸËe µ±Ìüd‰5«“I 8-Í8çð`À̪”7À$j1ÇrôHæªoL¸ˆhëb•@c_ò“ˆó3w `0A„jA„>(Àð#©@nÄÉH"jÀäxÚ]öݾáÑŠ 9°àôနïÜ…ç ”µ 0&y8†t4&@ö„òóÝsã}àÄÝöGüÊ'ŸKïÿ´û>“Aö´ŒNf€¾ì4b2c|ûžøv7öÒkBܨßp X èÊ]O|ŒÁ›6ŸÏ/³Þ®–ôFP6;qå=àq48|wãçýúðxú<¶×|l½ñ‘A`i…´(ÙbA"ÈW†èTiÝÒ'Ô‹`¤%"†ˆ’ 9¶rC5fk+ÔJd¶EÊ¡G#øèSÂü™n™n(3a„@: ·(]c k&—]¸™y8’‚‰÷Bœ}5O q˜94à j9´ÄÙ¸-›±óD¿ÊækCr²ÑÜE kI`~jØj²H*GN) ŸmXè€p'žS¨cq€Â•†€ ‘ BŠj2 Æ ˜²ß6O¸ #‚jô~$ D˜&x'=ÖŒFþz(¢©{;|žvë^K Q ©\ƒŠk2÷£¤A(˜Ð@+ lº]&³'Ýì[CÞ8,ï9>ÖÑÏXQTb3hµ= ì×WêÒPŠ{YuLIÏ:¶ãÒ1úµ‰â5 C¤íÕÃöÊ,3e1âÒ¾šù)«$WÙ6e^ÇvA?æ\ã¾ðââÓÁ¡:í-qŒòš¿öG×o¾Q/LbLq}¨ù]3Çÿæ_ÓëwÀ&9 öfÏÕë/ž=_s½ˆÀ …Ú°ˆ›ÛÚš€!ã,€Œš‹Q-  V´è’âÈ „¦+¾*DÕ 8Ž£ÇÇØ$* e9TŒKáÀ:u w;ŽtÎç¡#™éZ¥âX+’\Ô #Ál, QðØ_Ç÷k>Ù#3ôɨ'A#s“6wJ£çÁRiX²¸Î¯$%~øç™ †y?ú¡À’"f)D‹‚@U jµ¨1H´¤`â°8 UcŠÂDVhYK–å¬8¨ D8Ð*åÑê@ €Q³ Œ4¿ÈæQÀˆÊ‡Œ³åžu Æ\H¨8ŒZ ÒÀ XšÑ@Pp‘&•vFNÅáñžî«|ÐhJae›}^–ùíÎ|¬åSºþìù~”xú¥Ç—Ù(¦Ñ;é ˆÛ‡\K&QnCî)åÌ£?m¡Êv@¬.ÂÀ•Vh.W"6 µQE™´Ö\(‚âY ŸçÓö‘,=½ÏuÕVŸ£Žüo¿™>gÙø"]Ü:q,ít§ ò‰éÿÒúèuÎß𲙃jY,OÉ…ˆ±®µ¤‰°)D¨Á8c»å’蔡)3X}Pà(òÖ;U™’Øõ¢\o¬—¶û~æ‰õ²÷ün纟øp[02ô”÷ƒ.‚¥ +@) 5û€Œ¨ 4™rЩØxwaæ¤8‘Aµ-¨µ ‚¨©êyMšÁïÒ°‚pA*P@O"BpâˆÇÁÌõ,H”n½ Ð#£0n)Q@¤-çTà ôz(B¬D’ÄI›[@m×·?žè”Ä åóA 1i¡LÀŒõLžV1Ô9¡ ÈXñŒqŽd ž—??þtýóüq×´ãóþ1ß>ÞXT0º €€ñDà¡qÚÿéòùûéy?=ûœ beû6Žy>vß©=é3tzïãøµþdì‘'HÙþ¼íó.g7Èî"+Íi‘ìÜòã7OƒÕt±ëTÐ\ AàÎ*.¢ò®‡ùÜ<“É~XeÉaáÝæ$ Ðï>­ßFÍÙ3!€\$bÕ®¿4“"b`ï0Œ±aÕ!k~“[Ú˜¹@P‘0ÛRRTZšTÖ0ÌÙ;µ³™Ù½7ƒÃ¢-V£ˆxËS¤ÂÄŒÀ­°sÞVȉޅ€…q…zô èW Ô•Æ PêÁ b¡š@„P]2ˆZLö˜+3¨%ˆ"‹‘ˆ]ŸiÞBÂÓ™‚À|·’qy o¡2 pà–1a._"¼ÉV¹øqÒEŽóß„¡D\!Ë ãpµˆAòà¥uä§O5qƒÑG¹á®+š‘½G¹E;¯é”)z÷Úàý²Ç-žæj¶û|$x lº*¯ã>íž´ã±û›Þ‘ÿŸÙcO>/íØçá…Ç[À¨Ö¶µíŠsäÜ;Ž¿þ¾OÝ/'ÞkºÇ¬ºDgæ12ÆÑ9u@>ãº{ždîöy¾OÇxÌ6yÁsmzú·ÏÅ<ù›·«±n·ë~ÍÏû[G$$Éè•Da±Û,vµÂ,“•[o‰l1úúÕH$E±³7^ `´Z—ãùžíÛ×c‚ f€n žQ·âßüõ¤»?[\ìÃ÷™ÏìóÙý¥Ïc¿}/¾,n`’!,›“€ÓÜÈ\\㸑Ð}`®âsÆ>„ A1Q¡Š«±•U7eºçŽqçöµƒâr¥~TZ!ê»ìŠ2wô§L=hDaš©½èvçgS?é:·Ö–yf|@µë ZC±I•ª¡f,=+ä:¢éÛÜ•íj3O$)hôo_ûùrhÏ‹ç6Ï—?Ï;çËÎúz}¾!A€ÀvnþÍ_ÄWmå¾`ž ¶èŽšW­Áõןzþ…;ªP„‰$óó?XõÖõù»ýïgú_ƒ €fb €P! ˆª`A€®P«D   (pÌÔMåFRÖ%.µR u‰ƒ] º…ï *kÆùVG/NQk8ÈÉé\~"rÉßx~PŠÌÒô=5E˴ȼøñÞ÷Ûäy¿õœK×—Ç}5kâìõéæÅFÖþù¿,>ýöýiÈ]÷òýå7g‰Ìï[os]÷ól†úSG':ÆD°—^þ¼Þƒ~°MW;¥I›j{ŽþöQ.>ºœ _jòº~3=÷0…Jnb\{ŽúÎ ;ûîs‰×PŸ—OÖ®c‘·ÊJÒ­WŸUÙ× ûýë·ŠSO¾Þ„/ÖHöDئkÐô(0lÚ┽I"J6!šÀ€Qw[žÜcͲÓ\·âA×íW¹:¶ÏóÃlÇYu«ÕߺÞÞZËïþ€zÿ{ý©ŸûÊCŸGš,’5ê ó#Bé F lֹͰXha •UæžiÆ@˜&CÂÀ Â5@Ñ.`E4ÈÈeÌŠèwÖs͈ Yé Šˆj@Ò«ËnЙ0 Èîà VD`X±r@t2+R+4JîÒ‘.JDÔ¢U‹_ÕK…Á¥-·íOòBƒ ë$?º¨HBú™æÏæ4§û/ú=$1¨æÂHYDÇÑëá/»­wÅFÇö4Wí2XAŠ‘"ª—^|´Á ¨[­OHkð$?u±QÅŠx¼2Õiÿa››;û ÈZYBXmä^Á§3‹xËjEà•æ)b ¯N áÑ@mjÉ Ç@"ÂVP5Òâ£ÅÔ6/º+DPÛRŒ«C¸tRJÊ2m ")—kµ• cÄu¾æù<µb¶ézÎ&âXÆJä:a1Æe‰Ú'Œ:4XëÞv9é¡%mØvc½ѤíL\ëB…†»ŽqÔYë‚¢ ûØØÓ}æ z7÷[ï(›©HÃGýÞ—‚ÊéHÃ6˜eFd7éÆKjQ£6åÑŠÅ6·Îv¸Dá×q{ŸãóÊB-?(€†&XZ#YÐb€>B ³§ÊpBb‚óß#¬A£D¨h‘FÒQµ!‘³ËxvÌGÀ”`«´œÁ4†| 5 «B(jª îåì:o›ïóñå0]K–yçà|¼õß©†{®É–‚”QØÄÂbek4 "BXQ((­ Uã®g<2¥F žQA Ô“† ¥Áa=§JP €šH5â€Ã‘3g˜rRîDË èZ;À²ÖqoÒO2N™¨Ê… †Ó-AæVŽòûöÌ÷„‹*Ò8ú¢­x1Æ¡´l$¨þÁï.ÿµŸþÑßw*»_óòÇï™==îïè{´N1™/¡Ým¨úá¹Í¸8ÚÇyæ˜äÀ¯¦v X¦©b  ˆ%,âQJ’n´â«)Ó>}f¶ÙÅ÷éd—ƒ|´‰r«ƒFšr ÜZ6`æB4¿ñ¬‘b08œõ®üô–åòȈ׈ÆŠN ÍJÌ3—‡$p† ˆ4ÓN ’Qo$äHØrõÌÐD\"0øy¶!Îë=LA‰# ’ |Çû„™Œ m™’Â'˜0ÜwZ×T4¥ÒØÈì.öDU³ kÒE°Bq’Nò ÍùÈXië†6;¶°ñàÁ`GA^çæçÃøçVÌ?ë}mwýdt/§Wû·ùÈœ(ï°Ð =M‘mâãëS?GOŒ{?GïsdÖÇÞÝÝPoß*˜'j°ÕnÓ΢,›yÄŽ‰‡›ìáVƒcÓå9ôˆMÙšû¤¹ÛÖ³uGÔƒ½ÑïÜÔ†±1 `]gb ³À ¸ƒÍì,,ÏG··§qñ^û>Ú·ïGŸ4‚w^Æ%ÿæñS÷É>Ï?¼ý>¾÷¹o_öŽ-ä«ßå ûûŸíçýýTûÆxzïåî’>èöÝýþß{Óãý Ø’ ¦oDÒäÉè5œiÉš¹.]¶öÉAgëÃ݃‡×{™uÞ Qºt×sÖårûòÞ܇ è¤øIïr€P€@Ê:HédP’:éj_Èž¢D9 8Ù =>HÁY#P'œAc±j@±Ké*P•¨µBO$†" ´($DP™Mök˜¸¹mÙ[ýùêúñɼmÑ€ÂÖ(ÜšŒ‡oÔ-+5¢û7ý~mÛ\ópçÔênåC³c¦­E&'7¿rs<©„ö© N ˆ2¬(ˆŠ1ƒ8b8sIôô{w3"í¶_îÇ!®sœ_¯cŒê© ¤zÊ,:Îx‘Ò1F›!&%ôôºD«ªëÀó}Z½°îMSžÑj‰l«*¶½>Ä2à`N!;ÀòàÇÑö%ª—©.8ê1œT‚ÇáècñõãüzÉsÎ7æ¾_㕺ÝÎaO©]ÆþQlÏ<Ä ÚLÈ­²qýÅß¿sfCs HUY-It>¾˜ñ;þ7Wrû.þ­rÿ+€ÙèÚôzyLÛ€€A*PµBm£> e Àû.ñ® j àJV –ì)ëŠ2bQjiá¢Td¼à9Vñ×h–ŠÔÐÝœLŸ–§¸|õ6J:xuÞ£9Ë·©iÉ4‡­fRP 6)¸Ì¯0Ó-Ébø—XÐðéȰF‡Ãf¢a”:ƃ*` ¨EŒŽÙÄR)²,íÀ‹b¥ €ŠÕV@¨@(….]lJ¥DDˆ(@eT†ÝépaB€ò€>ó!»7C°d$jÆ–—QN @@L |à‘ÙŒŠAgdE‹Ö ‰DÐ*ÐŒáøöçþý‘L©=Ót~cåa÷ÙµrÑ´×½•žàúr?÷ÓKÌ)ßV9Îs,9ë}˵ ›C} 0±ž›ó}{^ãå‰×AO+Ðé'ÉË}µÝĸx¬óþ©ÃêÆjçuªûÇÓ®Þõñgÿñ8óºí|¾tÝæòùï}>YTêÇ?žŸ^}·íñ0¿ú—ÿk]~Îßál]ž~üÁ£ª%”rýÿÕŸZóiöç¾û¯¬Šð:î§*ûª°C^‚q˜^Z­ç1t»Qíµ‰Uùå;/n]˵Ù .·d²^Oñ½ºj±ó¹©½?ŽGznS/­ˆÕC»ö½ž´¿²Þ'Ø3Î? ߃9~ä™qÙV¯=λ^ïqþdˆi[vÏäê¿÷·O÷²×ƒƒ?uß¿{}Ž—k¾©>ƒuÄk®rçôsÿXúæò[Ûo]ÙdUy®ËyÐù±OÆÖúÅntüYõð}ˆØË(×Ýúë‡ó|—l‘æ:Å*£“ýË÷ñG/¶F\a‰†ý¥”ŽlbݱD¡ 81bÅ@m"i¬µ¥PvHξ¯ö¥"åšI÷²Û¿F)cÏÈ 6Ù 0¨@X±&7™,À@8‘Â-… ¦F£W@T´üDÿJ=剟èF›î?”ÅuIa"BÞ“®)PÒ®¾õbt•Öƒ9Ú슰+ÆÎ²)UE•)bB’ˆE–*Úl]LDÐdidn¡ÕÑE@!À–Ö@'DÉAÆE'¨{8E(h%<šÔTˆÕ”4ññ$ûÁ«Âã)s ‚òH]fz2ž“! 0euZt×ðè•yj‹B@ê+1hMµk=#,Ûçêcj#¢m'i§§Ê±ŒÛ_³NFJ„J1¦z¯4t“~ìÃÅ®â«/nÐp‚œÕÎV&ò-‘c,³·*QÅvl lªi‡7˜¦ª%µoI†RœP6¢c™ ¶AI’ÊÛ’­Áª´ô3í‚wL/P`UMœµ7ù›t|©ŠWÃÃ7  ŒbÊ.a TOq.[¡­Ô†šàGÞé[bÅZM1Ú”‰*€àƒÊ UµA€i)õt©ö@„ K`çk2Y}øõߟ¹Çt뮢D¡b0N86Ú×®û}ÚµÓöÉ?«SY“Kˆ†[¹o]?5ûõxQ#„ßéü²Ú£Ü0Ò a‚ÀX«W·¾"¤'‚=WŒ,UÀzb¤Xa «¸V* Ó;ÀÚqÐ’*™–Ó}k'‚ü椽J®U…ÁtÑI. AÎüñïïú™öXŸÿm~ÿŸld  ?!.yÉJ2påÈ?mÿüŒÔÕïm­dV:ö뾇MÝ/ú3,Ô£G`„zÐÓþ³O³/ó·´XÉЯìl_š»iÌïT¬LÏK÷•æô›)¦mŽx1ƒ Ýiš"ƒë6šÈgNé¾k½xf;$Dcðý„—íJ¾¿§6½¯†FÊ$´˜P,ãZ?1ü'ØÓ0)»=„‚HÆÝ •Pã  cm0Ã:°L_ówî…tº0aª&7Sf7dm% ÙÈN¥±¼p7Ö²–ÀÝfo£—’òáÏ ƒšdVVÉ´‰1Æàþt’ݰÍH vðŒWݦAa¯N—¢ÓŒHÛ™„ÿo3ÆZM€Î.Íôm<ø^´[¶/>÷í9Jw›ÏÔ§ºÄë깯eýu>çïöóâÓ â€ItËahš ™„LGÀÕÒäks&ÂíƒB7 8pÆ8ˆÐ™ÃGr È$,dœ €¬E ¹=s‚%MÓ)C8@eRËG =!PMÜiûI·T†D5$ œ °Þï mÛ*´x Ø9Ðe7 8oíÿ`oÓ_º_øè;ÉÖFd&ƒn_;̹•žw>`Ô×|53ܱÍÝí|x?w2Ç»¥•.KÊ ÂÙ …÷<<Ät\ô´6]×´ná´‹í|ðs52.¼ÊÕûv³¯³Ûe|´«ý¡ï½ÕGÀ:YS['Àö49+<KÃëêq<ºy¯6Þéžíãéü{À÷çñèW·ïß÷Ç~ýrï6C2U/çÑ}Á“ÆwßÚ°‘G^ÛÔ•ìhûûûoï¯Ïþ_÷Ó#[Ò•t[ˆ $2 &Å D ²rïþÞ~=íçÿù½[¿Ú÷Ù¾ëϳ?Çöµ=|^ùUׄqi£ï?Ú·î[~ÿ¶O¶X¢Ò‰$¤f Ü|0$Á¹˜, YXÂÀá{k’ÒÞs2o‡P¡Z…Žˆ0 @T2©ŠËBg€¬´ïìg‹²ûnÿÿÿ?ì_}4¿Ùëí”fCÀ q‰/4 "Œ˜&¶ìz6}i‘PD¥ÊEÕ îðbA ÓÍá•ô òÊÁÒÕ´Z<MnÛ·Ôg£‰Øyì=>6ýÚêÆzúÔDGèžF“R;cb²Ë*œÝO"}¤QX¡š”J™˜¹\¶d%é1ì9sQÛÆyèVúIÂ(R†¤*B“}¥¶üâÖŠx²£’nv2‹ÂC:· Ýš`é8îësçû¨/Gf‚LÉí šõYå¥ ·´›u$ºõböwò¥~ÖYk8σHÛêçmž“LÂÇËhÒÿEíûo/=Ì¿[žÿB÷ÚhÞX×óqsÿfÂÿùôüÇ ¹M P‹V9ëKuý˜'DñBSá e»ìϰl'9ÖûR5¨ +2Ó HïlCA…ÙheuOÊ‚DAf=a@!ΧËA POÇ:ìi‰ŽÎ¾Íy(/š[’á&  ²¼xä²e¸ HTv¨@¡,â1nt° ¼è b³"Ù¤˜ºXi) @”" bQYò8ÅŠªàU!€ Ô®  ÷·l/uQztö®ï;suÿ°Àº³þ0›±nm^ª±'ú^7’þ¥õ÷H.CÊ2uÂh_zq–s¨M•®Ó+›ûö\w߯åû²Öð‡í¥[½ž\Ou²¯òå”—×%—ôopüàëºö¬ŸØŸö·“§~ü÷¹Ë—oÌѧç×g~×V§_¿ãþ¾}÷äW‡ç™Œêš°4 8­¥³"TتD;î§qañU•.ðƒ£ pQ½S‘óæòVaû©þÿ—3Ø\b5a!"in±· d³B`xI¦ « # RZDƒ LÓßЛߓïUÖÒÐjåÖh›;qŒT -[«-†.º2A *@‰–@-Ö"@ ]Ë ¸Ä(°5]Αŵêq˜êÁ÷„+®D[ V@­…j‚e¶·Çá#úáÓ‡Zt!|Dâ„ÞÙ@™ôL]„ß%±…ªUÕ«ˆ®ðø'V$£ÂX®‚<"@Ô8Wé1Ò`š,«Ó%Õ[¥'T xFØ@8©¤¯#íåØf5t¬»5TæN‘")èÆŒvî&™Ë‘6VCÐÂ(BÅÆ<á^§5mYùNŠ@Íí8– lI–쥪°aQ‹ªR‹Ô˜Ó/¼KÒçu¥!0áˆô™¯eÆí¾Ö.Ü:€Ѷ)‘H .¼5DËPY 6 ô‡G$ ,9A1ˆðì™°æ¤ß;ó\!ˆGÀÊVDÜþA ”^‹„ƒ%¸«z2c¬R· Â'>«ÅèA#P¼Ñ6dÄ>?öÏïZí]ËɳóÞöµ4¼Ù4GÛ±%à£Üp§ÍsiÞèl¦@(ìmÀ\Ÿ÷cvÔùz{­ý€B£°†à6H@V£l9ØÛu}"¦¥5hõ2Iû&ߌ?å›: V-äégc„"Ô`C˜ÈeˆC;,ã1ãnBnº2ö2ƒãÒ €ƒO†#gZš—ƒ`ð " ‰Àƒ9 ÀðQ}¿û‡Éo¯¶þóá]õ„«îyŒö›c+‚àYÏV†®¤û©öçOò@o¼¹r$CFbí[ôÜÛTâiþ€ý~ÍØâág×ß/ýþ9þý¾ûzöÝ’Óíw\n—w¨rðCßíj/ñÙ·úÍÞ}ïk¿[47€¢#†9è{ic\ZmIñª“{6ÝjR8G&ÀÛ³ 4FZØv†¼¼ê]îIY„âí§åa(¹p:N‚™ *BÀhY© PAE*Äãjm—9Sٙ중dlúí¥ùãg|ÆÎÃþð#y}¤N&–"xh”)X¨ÑBD4‚MMd~5\VæúáLôP¯í©Ö^C!¡Á {åÙqn'Ù//µëCÈ Tˆ°&B‹oé|ì _Õ(^%çûϧ׳^( ë  ä{û¨åœç=Înl¨i€†Þ[OÂÿ lÚ»BnN? Z@(ŽO½ª“!0ê RT˜¨ÃëLz¿ü}Ot~Ü¿ ‰ ËÌâë¹üx¿<[•yêø ò÷‰¡€vHVÈr¿7vy¯ GáSӇ߿7_öŸ.}êÜ÷÷K½ä‡Âõ§¾'Xä¹–^ã¿;ãç§îï œA~VŒûåD_5–ÿ¼›Œûï—ç¿!®¾ÍxAÕ§ªÄ‚Ð¥sù  Ê1á²@T‚ÀUõL°Ê›®Ðª(¸$S+j—¯º¹Và:L0ãD§ÈÉ!A ‘,9Þ9•Ã,Gç;PC§ƒDN‘Ìy´larÆl|é1“‰œN†éæìrˆ’'GzâÄÔÈïñ•¤x1²£ÅÅ•"x‡ h´¡¨`P­v´Hj±PµK‚**„P­Qu„RqD XD `¤F©fÜ ™bP¦)5Y“ÔhûLDjÆÝ0\óâ¬'!]óŸ2ŸÜ÷ß`]8ß~´/~«Sõºçj sÝûÆõ¾Þ›<ªOÕç¨=c÷µ2zbKäPÆkí¿íó»;Ûyòܯíò¶¿™çì­k•*÷§µuŸXóx+êç¤4¼r«¼ëÿÿ—ýua~¬Ý¥óõWÖz߽ΰâ™i·_¹GU2›í¾ú²kxß•_ŠÓöó=XGê}V{®ÿÁ®»>QºWÅ”c™ ôÓ=N?}t뵕É*™¿yÎókæÁ‡BqJEµí›eµ¬t‰«ëA¬:håÍf?ìv[:Æ)èS§>nYìÓK·öè1Nü‡'¯ë;™üÜ_÷½ûÏý.«ÿ<ÿÉn_¥%îðš©Ã‘ýe¹ïKž´gl¡¦BðÜýeÞ“xÕM+ßïÒlkªø†â›×J߸«^îþšþ+O?’©ó©æ|ŒûÏN¯o}°?üúéS»¾âíU*î;õyjýð‡OÏÞÎÇ7{vµÆòðá3c]÷ö±­ûùú‹î£¼þè÷mëçþ6OãÎߦ,JÐÚ½µó»æÖåz¨öÌ+«×ÕôÒ‘»Jyø¤yaZ¯eX\!rc¢þÙÿ­£CÐ=~i ­Â±…]Ä?f9l£ORŒHHA8@˜M&PP«]µøÑQ«Ë’¾Ã¬äïY€}ºT5(VðøÌ¨•X ÈØ€”]êÚY)h×hzÐRVœO¬|C¢œ®ìßic€F€°H­6–¬È©_xð¨ à#ÀðÐÈ|&¾ hªPÀ,x0RÝ€õÏbEX;®X[Z«J°RªÅâ‘`—*ñi;¥5R{4¨éú¤LP[[­³ª ídB2¤qP g»L÷L§’ì³ø*7sí.Ú½1¬fÊaŽÛ5VỖÚî|e¯MÂLïÙOLe¯±Ž¦ÞºE‹(±!cö¢^¸ÅVcÜËp’á2ªsT3ZKK°Ïæi¦Ù£Î…Gí¯c9nü¦fªñt$€þÀ w¢'J…Õ(mh´°gê' ø(@-„± …3 ^añ³×S ŸÌ˜¯lc‘6SC{öß|ûÖ7*BOK5ô¡ CV­Œu×´Ë¢!?hZ™õv¥O"üÀ‰ƒ} û”Ã7ÈTG¥Ëh?å\X˜ÛäÍ)¦ƒÖ…ìÓ5ÌNì/A ‚¤Ù«k#†À>¾B¹oÜ ~r†ÝõÈxß™Ü ¢óm=·ïúé Š¹/€âsã¡QRÎX@·á"œö.Ç: ¢É€Ü AÞûÔïo²ÃÞHïÓ»ñ"ùË|Ìßú>\ü¾u]ο×ãëëñÉ_xæÌ©rÆøpúŽ.'‘cwt?þƒÿðÛÇí[nÅVi"D!“™ŽØ[:*ÉÇçñÞñÈg=³<+é@"Á<²!ó3 ¯ô(@å-¸RÁ×5×+^&ílƒÐ¥\á4f:vXÉÄ)áÜy7ókj4¤yÓÄtœ\Éʯ<62·ë»`CcâÐ'ªþÓÛ×ö±=ç5ŠÖ7ý–_}n~ͪ*¾ò¥¹WwOù|>ï>"ð^ã7´®17òcŽºûܽÏÙcúÛµžÎ—17ˆÇÑ<áTdmnF&Ã\3‡Ìyb“ikö0L ˜‚z€»$\TX€<ÁƧdÃêÈÉB(ÀКÐÇè|`æól„ ³öŠ\*lssP”„‹»œÉ~›ó¾T…Œ6Î}뀬g±¸_Ûº8öºú$ÆØíy^òÆc{±¯õje›ïaÓÈs#´``[;î6ƒ'Ü0¶™“»v¾i>±WGM9çc{_³Æ…œ‰WOiN7YÓÞÂÓ´ð>¢Rz>¶¬ Yûót|ñë¶=m˜£3‘ †íi²ê<§Áìß·Ó¿Žžö‹pdô9EßK<ŸÛNí³Z:ªž¼¶×Çט>ýlm›½»AGúÚ}¿m¨­±õ¶?>ýý÷Ëýúï1ý^Ø ðpªàЕ֡˜6OùÓþ?bî7ž ‘8±¬ UËQºìç{íÁ¼ç+îL/[æ]Ã䀆Vl†ÃY!PÉAê kÄ|Ë¥)Å‚ª¢K%Q! P‹¡Ô4ã”ÝÌ9¾Î!µ|?¿_B k†=gÎsÖÛûò«ó}›œ•*¬© ‚BaD„ˆÕmsõ“ª«·¢-]\ÇWÎÞ&À{ü4xHÕЫø¡ˆ`)^&.KZ* ¨xÌŠá£è[Qãè‰r›´ºæçº²ç³8µÓyŸF{3渿9º¿;žû¬³ÏÎG—[©°áš [9PµK®ÑM¬ ¦@¤8ìH»ŒvoÕY:pQÞoÓ:hJ·Pîün…g ïºK03 áÖ–Í;ÚÄðÉzí3ë ïïVbn&LœŒ­éþi—®±v$ ”Ò`œÛêãñùòð÷·ß­MþÌOÞ¿}è¯ÿ[ôL×ó7׸þúßgÉɾËy°SÈ!¯uÍl¯ÿê¥õïåÖí©þÛ óŸ¾ˆVsü1ïOŸ/±…Lj$@(²4[C£€2A—ƒ4 Ö%Ÿ0+t`=f/@)Ô¥¾QBˆ¥‡c( ü.„ pŠ_È)¦­&õª!€‚5ˆ `tTž(g“¯$ÛŒ>;ò™WÒÑ!d`J,­Ö(O³`úó(I6“‡«›Rܰõ ¬èVUD(ÐjGQ¨"„€3^‚¦ 0¨ $:KÅÚ›ýßÏóŸ7¬€¥ºA€ ˆYvi‚h@`€h@@ÀºðÝËDà쎷c"$Ÿé¾4þ;‹­¼ü+uÔÛ5ö‘óóŸ÷ó¥p¥>Þq¦H*AD2¨ÍÞÓ˜U1y¾j‘¸ç‘öÏÜ?×ñmá«l³Žö=ª—žáäëÆJ¬fÏê[°u•Ÿ.oÿó¥»é#³¿ûüþhFNÞshéxO#2Ë6é'´œµÃëÉõñ×ܧÙc9r›èØyÞ?È×ûkwpíªßæË¾ÏyÛ×ý23óN<Ç¢yÜSëy=à-H]ïï×—ÚslâJh™ÊŒêKGüÖ¹ßïòCœ;N$ bf”«k?¹ó"÷èKÖŽÇ?Ãé­ƒ&e5kéÚ·yœGî™›uLTÚ[?mî>þMð¤kjƒýÚ&]ˆâI·­ƒxPõòîéD Y›Ò]‡…Làrƒ‰úK¶xÅî¥1;úHLOÊ ökËŠ›<‹ª`˜½ëæþê«?Wz®t–¢í3«¢g•‰ŸjBdiU3¶¤±“ni£Ò’6 SN“cX‹‚ƒÈàY¢CÔƒŸL>øýøê¯UyÜ9)UGœÅ¼}Ë›{Eï³ÿ³}Ì1NíÛ¯N‹œ\Ÿñù²Wo¯Ú°{J–c­GO?Ež·;vtÞþü=î¬õÖZbò'¦zø¥†Þ\Û{q!¯j  JìÔÍ8¨#pwõÁƒ<¤må§0íöaƦ„êØ'ÕêÂΖ~z¬Wh×Í[û¨?fUXf?–:æø,”DB  š§ €[:ŽÖ¥]p íÇP,U!`ø «[é2jÇâ¸R&ò:<@APƒÈc ç8í@­–‡@|¤²œ=ðÑ‚üàC˜üÀxˆZNÖ‚"&•í£¶žþŧÉÌpJwµß{ü ìa•gþIÇÙ ¨(B/–3¿²ÊÈà(¨ŽØŠHëTm*r@¡ÅêµËÓ°šï² p€ÉÆ·¹"%+ |;äk^ÃLÍ;‡º5&I‰Ã]Lä]©¤!]`#-¤Ø'Sªº·FÇ]&V:“ SKÕf®£-bôLGqû©¦´QX ÆF¨UÆžý†W/^e„ 8Óú‚Z  Å d¤>ˆ ¨„a +PS!`!˜“GZÕÓËÏèço±Çhì`5¨€0¹U5µN1iL÷"- ÖY±&ìÝaष§ÇËVëX¶Ñnºæ£÷Ê3Ì€—ýÞ8‡#éÄtÜÝLÚÆtÞ›b„ÒÚöè #:5¢ËÚE_8 ¾qZ* bSDDìnMÒ¯ð×>9gîê–mÔ¢´,ò<{ÉG=Ö9éØt²9`ÛØÌ;·L¨´Ð¸Üõš!;²ó>Îü•¥—6G¦M÷é÷óáØî=º{ïõoó1çfóçhÓ…s2ý®/Ì™5ö­øú(À@jeE°¹9úGm•Qíßl/{¼ÛF/™m"-· Aá;¼ùȤx:.¿—ãPË}A2[{<6ûêú­æ±íó;°ÕÓ¨ZC£U(­€a8µÒR¡hÚEkÔ"Ú¤Q¥ ¡õð%×ͦ7/ìJ’ €Ú±º»Ò ††Ê\ß¶‰s BjX¶&n:mP8sJÜ”Iƒ—I/ NNt ÐBÂЧú³]iÁîyWСµè£0B)éÙœ¶íJ,s[a°HWèØ°¡ÙÆB`ÝÚ8§€&v*-¦¨ìOYžÙ#uÕ¤Þ¤p©´(TLjy@¹¯ûûÙ¡;u°Ý˜gç`a>ãÑçÁPY‹eà榩7ïû¾W}éUûÛ™Qqóí¼o_îM¯²*¸ÏÉôZ{ïæûÉfë8 K;÷ö|^01ñÈÑš[{<Ðw½' ·Åq¾Fõ\¬ðÇöŠ„l K;ž÷Ô¯ylvÄ}¿Öc~Ä$ rp7‚ê4s¤£úŽz¶Á¯ýÜþüâÿçiÙðё컾Ÿ‹.kĸŒ²Ô¥z}èµ7·ÖD8ï3·›¿&÷v9óúÚ=ÖÞn{=1÷jŸŸñå]ÞbJ9]Çù~Z—æxho™ÄD{ñ^²zÍcæ°ÙãR?„[޾#À'¿øc5y–__Ú·½fa{="\u]܇9ÎGd^ù¬}–÷¥ýòH¿ÓhelRcß-®kì>ø~ÐЄÔnü5³Í½î Z€”>|p®Å ?j€P85ÀU L…2(€…FE ÆÀàêâEcjöíÉYûñÚ5ÿÓý¿{®Å÷é±óGêEÞN¬¿øWN­Î%¨c˜+® ¨XgD<4Ú½àYI¶¦½óÍõêï笳PÜX×¹ÓÜ.ã°Ù}ÏûŸXÛ0AµF!ÉH>—L)oR 5†ýìöºE¨O¿6gxÎîXÌ¡ŸûV©ö»›Ž“JL£ÀPIeP¹h¾£O‹é¡BÂ3D‹fÛL27bûàåXË¥Í7¸³è/-A+‡¶”õ\@Uû[ˆvTI…4fZâu=éÙ–CuÊ‹Õe£qVÀ 2Í`‡Î)G…BÌy ,ç*oæ26üý‹o¾÷ÿü³òþúê篭ÿçÈüØûpfý¥ï?\ýü£W>?îí'ºô ·—q¾·[láú½5è¹ÿ~±©÷ùOA¢S¹¤0€”¶¨]†STX@„ÚKƒ¤|*¨ZÐ`]y»ÌÄEE)E󜽻…m)<óLÖ„ˆ\m%©•jÖf€$ƒL2€5 pJoqó|ÀôÉûÌÞd'Ÿ<ôut:‚'JZU…¢à0JŠ^’‘#³“OúÔŒB‚U¥Z ª (BF5ˆ €z,¨â¦TJ‘ìš³Np!Ūخ(áÒçeæVók¢X’w %k²€*@¶g< š‚ hPJI𑉋ˆº(T(T¨€@y7QÇÑ•ÜÞf~ØóR_Ïæó#g/̹wº›ûsÙû,BÒs¶Nκ¹XQë¬O}ä”›b!/Ë=41l©1Uh«Í/Ïùƒs,Z¯­ù¡ç7g÷gå³ßáhü<~ñz?ø©s£+W;³2ÖçY©6©xp#3Ògi§*’%FÎ÷$ëøõ×™ùÓSe=Hâñàùéß^Wïý>>ãô}%«ü°¶Žø~°¥•êÎ9‡`ÂxÔ–Zÿ¡~î'¦ãgw5”‰N Mö%gÁ{žØ,)$Z˜Rìböô¼¿¾&/U{Ì=ã®—t!Ý»âLí{ÔMZSr½Zyiìkb½îöà°ÍÝàòŸŽsÔ˦.Ri¡{§0¤Ãn‡œNPªCHCÇ!4Ñ6P³;s1E-a€rØ©­D®o]ÆÄ×á¦/=6°DbowIiJiª*ORÔví–Ô`‰"'PmZDö,ZYC‡7$ *§;­}-ìþź=Ûc¯ðq慎ÿT"ÿã×ÏëëMòß:ã¿æŒ”Ëøxb}~}ŸH­°{‘N;Rƒ´û>Žwæ™á:¿°®÷oÅ©_â Ö±=Âazj¶eŒ J­4¥zO¢8öPpÚ¢´ê§Ë8åáNuW ¬<ºýÖ«oöx{dFê6ýÒsžšQ9rþºŠÛ÷ö¸ÔóÉG•¢b’ÙQYÒ– ˜µATB}upŒØ ÈCØpÐ. ¦Ò¶ãáƒðOºdú ¬É‘Ä`Uxþ´ÇæÁƒ’ÀžƒñÄ(phûÐg!`89˜€V T`…Š PØÇP>8ž€®X-ÈÉÔ`ˆ°‚ À¢XP¡ÃdR+€TCz*WØŠÔ˜˜VÚv*§ÙkD¼C&•2™Qh íà†ô¹?ífw×Àn0$@è)ik[÷8ÌA¦§H/DA°Ò>Ùp¦©S°`B ›…ëd:aFÖ /f¼h"œ'ƈÔÿ»Ø’(|€D¡›Z¼„‰RÆÅI"Iz# X ?ËÜ8×C‚ˆ§ŠXÌæ !ZÂ4èÊì9É…×\êvÙ¡9“®št˜*]»ØÚÖ& ÃÅ ÝÅÈl»ôÅÐ4OÊ4*Yéº7–Ý䌱e§¶ÂÎzßLž®à­r…D¦†´ñ®éFÊ8§1" Ûé …BƒØµ]é"o7“Ò˜Ìågþ oŒd9 ·ÅÛ+ k dGÌÆ^Ç·8Öl4J˜r™Å“Ð@(,‰³›ùüˆ¾Å‹å½ü¹»í*Ü÷²ï¸<²}7YHŽ8 |°››Þl!ºp×uÖÇ#¿â Á+ìÖp¤ùpôÏå,iý܆]Þ} ám>þÝ|Ÿ¾†Òyì®{ó™gŸþécן#¨gí ?÷+II‰Úl„ ÙµíÐëmÆÎ7>‚ÐGz‰”¸–Úc4I"êBC•©TcË`¥ —<¦râf¢ºº =—¢‡M º’ {íH~4ß<{I…j¢ ÛÒtQ,á07\}\á ŽÓ%U“Ã\'[;i&Ñèâ¤,@{© [T¨XïB×P(CZˆŽC $Â{* †cLâRÅê™FWH¶Õ˜Naâp¨A0 @Uñ‚fÙ4ÈÄ` à‚ƒí4ñŽÃq–½Ä…m4Ûtv²’¾ ì7òÈM¹çÓ=»ÞMN¾F` DŸæÐ§ñMÛ^‡[2niw‹wEv «¡Ï žÑÜm¶Ô uÛ—qEˆÊ¾ñh=ŸG͸ìëµ£\GÖÞ—Û¯6 ›6³|x~ண÷Âßø˜ö©4Fmœl×ÜN¯;ùja€;kÿ! h‡˜6)Û5cÊåS‡iÈÅc¬‰€ζÓ}Ÿ½‡ÜçG϶·W}~Î÷;Dd™iLdæ°øUÑ!ûãxß:.¾×V± {™ÀÜð´ÝržJxÔøÚ!ê¼ \p×Õ®Þƒ¯Ê¦ÏæýjÇtæg?yjæ`ýû–?ÞÒæºk#ˆ=¶—žÿ¾äÒáj¤.·}\Zf4¤žö>xÏŒïØäÁoÛÏ9ýª­9£ž>€ 8ƒÈ%êR¦6«€JåX©€j ƒS@”‚¢ j©™&x¢^çuxznä7öƒÏ–¬­¼¥bñuãüÉeØô5ïìûùSûÆ02jŒá¢ñ^rÐ^qß··º?’}9?~|¾Ï?.Œ«d3ÊGróK‰orëÅ_uƒ>YUGbD„w8PõPuäáéÖÞåuÏåuiÒÓ1Î;ã–i«ž±p–[k¬ow[õO?áHèëçv©õGË›¦³%p±$âµežK|j8îgÛØJ¥˜x*·yÃ'7뢆JcžªgMNp>ê UÖ5,Íå!&Ñ3Á©kë*R¼<Ç›ÊÙŽy¢Å£»Ž–űÅÍôaî!½Ñ°^%õ>×If»ßì×¾úóÝu¼Í÷âùüÿâéÏ?îýÛÿùkÕ5ñÑô×<ú¼ ;í‰Í yÙKi¸hÿxüuµÅŸLÇQ™-4\f"7£¡ èëðDŽDW|ˆ*±ª¦ŽT[,¸Ì­-• Šª5Z)ª€( ˆ®ZQR—Dˆ d0˜I€º„™£J ·šù•å$ øpDá ̇I¦ ¤Ш!ð IW¶ ϶DïeãÑÌ`:\¤EpúHŽÎ¤¬Á·0}˜YDz>iꄯԒ’ª‹)¶¼BPñª¥\UÑQ ‹+ÕÑç/gdÑ ¢A!oftæ±í«4- âŒLJ6ÉY2 -×|ñÊk óóÓÏóÄóRLvEiÃqÇuއÜF]F™'ˆ*ª‰ £X/¦o­ØÏãRÉùv|ÖDcôÎ F^¦ §P´‚ Õ#ƒ¨H´uW(ªÇѬƒç'ý4Ë+OVr¼/|­]ÔÎð|Ö¡S›ùŸþjfÞËYWvŸùœò©=­´Ÿ7ÑÞ5^÷8ßï}VÇùBÆynÏtdœ"ƒ®9WŸcز.1L¬ZÓ–Ò‘¨;BR%·ÝËsHb¾æÏ‘€r½Eh¡f¥NÇÂŒîl¯šqlÇ*6g­Ã8ÕskYÍš_óC¼GÀ¼wgȪv¤&¯nt™Óy{gÝs}ë í¶ t§DÞ=oî<ÏÅå γ"ÊÃúé&é\ªb{ÉâU‹§^?—ÿ“ÜO7>¯ò©°.¦]¥^Yµ>v(t¤I½­f‡’ê¡åYºøÊ  ¤#Œ¶­h:G""Âbj‡Ñ!&XÑuž3ƒ7–¹àL‘¡¨q5´,"° Å%qاbeQlÖ„B¤¨\[ˆè°Võ¹u±,¥™ RŠdà6+Q—Ϧ;G?•,z¼–'{:^Ý÷|lœë`¯°ûmÏ*Ì6Û;{T¶b$jQ‹5Á V¯tf2béú•ÕÉÉt*ÆíúäÞ±ýŒà«1d¡ÖôL÷måÖaT/^övh²Wõ†×CépßX¬¬R&Y÷kzçæyӺݟzÌÛK´3š›cßã:ˆFNP`@ AÆ¡XæûµP¬@lÁc¬s @£ã„*(ŒcèêJT¡R@(`³¢º±ÂuqA€b*ð¨eéód•wj# ®È„«¬¨Ú¥t\ô1ß²a! Ø€¢ß›õû׃†A ŒÈŸ)-”Ølò<€ñAe¦g4 xpáCl­\À ‚Сªè÷f=çém«õÁÞ5üI¨Ÿòab¬ !E­„Š±Ð¨„–šU)ÇhÂBe¡!J8‘±•DõÔP­ 1i¼]ÊUsŸcÉÒ1†¤¡-µºL¨ã"µMfx E2•D§]Jb"ê‹J)²Èo´SÑ"ÅdzÃwŠZNU©0”Ó †‚VZ€Õ¡"±ê¢D•Ø ía}Þ6¬|›´™Á.X°ãÀhº“Ëlö5Ic¸9^ÙÀ°µý®x› <–cÔõƒl>J°abÖ*Ph"1¤2>´§a“ÒLS{fã ¥ s¬&Ü…^ø 8Π¹z-•%Wi¬íÅ»öŽR Í à \ôYýÔ¹çÌ›‹èH5EMtÅ@ɉU͆{e_ü¾;GÓ¥Æ&s;›  ¬hjÙ¢åpÞAAk@I¥Üò»?3Žæ(¿¾¶z»û¦ÙöwöÙçl¥Åæ>c„#š0w̸?’ÕŒëª(ùöÀ½fȬ¶À‡ÌÉbä@®ÝÙTváæ¶}å1¿÷úïæ~§—“p•oÈ3ÆÊi=ý~Æï§Øô³Üözé÷ìM(â- Cˆ‰Úi€AÔåà`Ä.`‹©¨U#)T&’!ˆ3#l[†Çlä°d³Wìö˜ ÒTn‘ÖྰÏtÊÞ±ŒJØFŒ¨vØ@PdÀ„ÉÉŽAí6þÄsÃß}e¢ôX5Ù ¤µ‰KÞ‘4ÌÉHoE SâñÒ6R4Ya ÙK™ÃSLeÔÎuX„®PaI’*ˆ´‘‡Š5D›Á:mùá)ºÖ ;ˆPËܰœF a E¦k4@2N44ì¸:k´Öæ`31WÛh_° ñÊ|•¨A‡§ìÓŒŠûqmw|ƒE¯=Q¶´éÄínƒl£Ñ½ôkzµŸrñµmh*¼nG½‰!vmQah ì±O#;ñž0»OyÁ_ãÕŽù´<4[Í«ž÷6=t¸òym¹Ûs =q¦ߘ1ãv–}éóÚ[H©†‹@ˆ!d&Ý4¸þfм; 6J!ÓGÂ-ÜšQî`Ýg8 z†§ ¡!É d#Õ)– <mœü¸®CëöŠo©O² Š‚<úÁþ4ƒ~hÇQ7$hß}¥RãÝ‘,Ê(îiþ:^o™¤tK dº9cnyá8ú:惽¶õš<»ÒlcG€±Fº}<©cÌôëÞn{ýªW±÷+²eSúd—‹_—¾Û]º= åþlOzÓ›·;Ù[¶úÌhH£Ñ¼³ß| ˜§üšA£ëûñ¸\uÒæ÷íIóØ?ë£crFO"¤5vrçhÕv^vû9¶—Çá¯[ =QÊB‘‡³Ãg¶þMÒi¬¤pƒBÔ ª‘L\5Ô€é^u5Ž]z[{ÙnÛF³g¿%+  Fˆ‰Ñ÷ÒÂÃí³çëg¿ûϯ4§@:gWaÔ¸^FNV\ñ/o·}¯>åýÜ~±zh€$êá8Iƒ;1°A6PZ"QJ%#j´²‚¢R#Lmè3½ëR¯¶Ç„>“ËG••×Q<ÇžéNê/ù~ʦóÑæ,Ø÷©ýmÇ-ŠFTÃÐÀ6#AÚØWý‘çÔöT1÷.»Ö>¤Ê£œ-0SÚˆšãq±Á@¯Q?EGk›PPaŽžÐ©ü]]öV:åf¡–C£¶¦¶ü"ìO4Õøkè±sæžeciQ Zþ?l,ÿÓ‡ápnVù­ÛìzYCí¯ï¥ìÅõIeJ…F')ÜÏ‚ƒœ¤J4ÍR4SI//ýÞøŽr¡‰XQ@íjkJn]|6-JhÏmëš=SO ýšÐæ(xÄœ•ïœàf÷jK™™ô1>ZE%nv4\ Ü]Z­·C~îÇÓ?æÛ­î?=Íí#ö=l|6å8tÖÊôÜ>ÓçÞý›çù¿ëÏ;1#,bú{éúÈIÁ° Ö6#rÜûJµ¡€F°’+[~!‘Ã{ɱ\¢aeÍ3 ‹éð$’ ÆL䉘Ý;›‰@xÈZ&´€ÅK²Ë!掵θ˜(­’i™¦—¹eæ3Ä„•ÊÛ'èžÌY€@Ð ¤‡¤ÅWÄP™‹ é¾t(âM‰yWQ6Å3×–Þ¬}½ÂÜmÎd)ÓÃ÷çöTöbçDŒšã‚ýûkžóW^3/csSÆá{ëçY{t3ŠiîŽoÙg¼p½8o¯=Sš?r9Øæžoâ/v}ôò"œíS€©|YY¯ê÷éy¾´Jst9Mcj£åÛŽWØïçÊùfÌ},ïÆlj\†Ä ØN´nåá•é©è6ÌÑB¨ \΋WŽÍ%Úíuü“8?Ö÷‡ûÖsøhò*7»ŸBߘñ‘Ó94Œo‘¥õ}¯IÏ‹SMÂí<5Ý­õÅ}þdŽ_j™}ö>Õæk²ç¾Š×U2ÉwÌì[Ü›{†[ë’Ÿô°.p%ÓD«µ)#Ì0>0Š+Ýhe– „ÓN;ÎH4‘"¤ ½ªÄ#ÛdXª¥Ìv•/Úd3`sLUÅÊJèB«‡í*Ñ)±ª$Ø”B…ªéäºØa°c+nJ\MF*¶²Û’¤l`•9¤qX]ïõÙ²ÏxÿØÉ0{ʹ4éh›3«Pú×ae¨Hœ¶ºã*¿ÍDÎ’Kýe»IðN$Š­<ºÇ¥Íª±or–ñ±Ì ´º=P-ß•:šëH§‰ÎS¹YýÄ'6ã0s»Lýètå…›òÕG©ñkt®Çì{~æšwû§ÎÞû•‹M:~´xë±Ï8ð)«$j1 Ë12¤6‚­N ªT ` (U zÌîI˜ƒØ®]©ãUú¨ý…úKë´]«vðµæ×µ®ÑeQÍ¢ŽÔ‡bѤÚWÔìÊ€¨ˆH‚¥†…PÅ.dIm@eB¡¬(T€=ŽÛ| €³x'q:)`J!ñðcÁ?AixÔ\àO¬"?TtÕjVñàÖ/ ¬¸PZLÏ,N†Y@ò÷Üp_P@¨€Gi,Õ ø` , ¤‹*ê3¨YU(`± ,514 %@‚JKoŒÂ"«çEWŸ,“-–"`dIª[Äa¤ -B)ž–„J uõÄæN¨àTîuÀ*|hCZ_YAÊ(åAÑ —Ï_”#ûx‘]¶hp£e‚lVPNf5Kám–ýæ ÉЃÁ`̓’[áé½áѪ–š ˆX¸¶±R€À2€ØÓå™¶pj™¢ OÄ-TQQ…WÆXdÐpz¨&]¤Aed}bo¬F—Y„AÁ*¥ ] ÷濫Éx-JûÞËlLÝ&×N´¤[G5C›‰%¨B% eŠ6™ƒNRFØ0ÍQC¢¨àèÖì>²|÷^g|öí@Zm¥Š9›š»ÁÁdDò—Þ*†eçf/é£Ñ#’ g0 Ò™#µïòÓm6†â :0Çñ–©‘IwãT=çÖ e‹Ûð'v0ÙeØÄÚv=e‘€Òï«‚J$BƒE™#µ³M Zjt{]úl2_ýx»à‚–Éö¥Që®v„&s)",ÞWû´›3wÜqÒ+,e§»!HŠÉ’N ´ÀØr¥zƒâSp°UË4ÒÉJ5¾Cî¤ÇÔìÁäÆi5D5Ûl@'eqSag’¤*:·aBÀZV#¨Vt€ÑäN­±”ƒ´6c 0&Sà´@EEŒE ÒFC%(€EÅ´ £ PÑÀ¦jB0¥†¢„Ep!ÙÐñp@¬i\Ž2aã0Àl³9=:5­ jiAA&Yr3â‚À‘k3¯@/ ;®MŠwÞ[tOºÿú°®ãÈoö@1¢N*å¹1ØtûÀGN4cfåžßã·ø [õ¦Uk¡pÐÙùÌ˼âEÚÙjî°ÏÓ‹eFÎd(UŒ\Ú7Ê &PÂÅèû]¾v±äêî@’Á$¤Né,’¬|H±€hä×ÅIUÕÉFéY 2ËŠŠ1õ#Q).@‚mÌclS-æ¥%tôvžá¦ñ Ã+!Óe–Xí =Ó«ìôÐN¼©nn #™¹êlfÀéX)éÆÓϹzO¾géâÞKí=$J?Õ§È×#Ý¥Ÿ÷¿Ð_¹ÿÙÿî*ùG%;Î/Ÿ£;´Ì'fý¬G;§@³?ä×o'?J2ë1©5¸$uuÅzÇEÆhPD x€¹ Å4ðÎÍG³ÄúO|‚$öÞûë’ü’ŽÀ-9™è´ÙoÃ…ÌÚ½}W(€ÄÛ¯c0[“Ù2óÁßñÈ_`Ÿ±@ÔŠ%«v¤™ÜY¨0@9ÓÊÏ$gé0[¢[]j¨6Гãqö-íÖÊϽ>¿Ñsãçç¶?N=·'yåéõÍœ×åÔò(S¯½8ðÓ‘~_¨r·½\õ ¢ÕV´ÉËaâ'ÕQ´Ú=Ø{ÞeNóx²/›ÕµÑî /ÕOê7ÚOU_ñ^êõ¾ì_púv5½‡F²:¤óOæ•Ó^Ã9€b®µŒâu+NDÛ`WD é"}Í̆Ê™ »O´V|òÞIüëœG¿¾S>…½ÌŒ“Æ=37锸®"o•m攑5þÙÆye40Æ`Ë °UÇ´W ‰Š-h)Ú• XQ9RRÊäN3•Qt*Âj{ØL0‡ZÓµ9[y)uiÔô{ ¦¨åZðHüˆÞÃÕÃÁõ—Ò¥aº³$ŸíïÜn[‘¨X"X9Å…š©;9îsŸÏ©nÓ¥cJBRÌ!j{'¥s)á* êÆÚûÞÙ_‹³ŽgÝêáêï§ZK^÷ôïÄGâ”þ¶ÿk{‰½&«à®Ösë}.ëî\ÕQ~\lù´]+ ±òU¨¹èÈmâ¶GkFàt!l H°TT$2IZ™H©ôÄ¥’Ø¢˜ÁFºòâÄ–•˜Š¨¼ÙqF¨í’‚¤6iªͤÇ26 ˆ rØÔÙ¬ -‰*lG4ˆ QB'Þr½Œ>Ìþšm€ÒŒr–V3Å]F‘ÍýÚ·¦YQûÞzh'ÑV˜›1Abùe­²3‰ípЖðœ'»vÖ;T+®¼©û®²¼Vûq•!ó<û¯g§Ç¯[ìî$Þª8r¿wã\d]×ö›@_ü_,•ƒãgDÐ<µ¿}¤rî¾âìu~|¿×á5½N? óÍ­`îAÕÖx¬$K'/ÃŽóƒ|ü¾åœŸÊùkóv¦×|_ÿ÷ðtøUM?çr÷ðÛ÷M§5p4Ö[Š UÅPhQß´;ÌKöÏ•ÝõÊZªª” Ð ¬HÜ¡KžŸÔ‰´Ðê¥ A«E+IÐRðñÒ°ÿÕ…Šþà^èü¯ðF2E·5Üɽô ”ÖH¶±Átª)*Ë8 §Ý 5$tXjk1€Ê ÓfDJ'À¤NÀV¹¡D¢0 Áµ&ƒ€&¢Ü×jÔØh\aÊâ{‘õÆyk3kdNƒ-ä8RTC]EW4K•Q I"ÃIŒE V ¢ ÓªÂDajb+#YZm® ¨bh°R‹¤cˆ”ÒÂ1)QJÝU,Ø©° <ðÀÁê¾ü¢[ï°u†öš‹u† ¹Ïr ›Ù è½d töRÅbm”wN¶Ú©m\Th=|0r¬q—]á¡i‡— 'aµ}Ó1ª‡€Ä]æGŸ)MsoOuqÝnÞÁ¸Ÿó1÷vpŒAÛeªmì*{4ì²òÝ핯½fÏÔäà¿ ìQ¹…Ò°À‚`M!w Å"ø°AE`fètŽ·d&Ñ£¬ÕÔ¥eKÖz3²uËä1Ñ=šRIë–¦훊í*”6]ǯ9™cû÷ñ½M&­åyÁ6ÑÌf>Ùê¬M7F¯Ñ}…‚³Q^t´@$Zã»m¬J=¢òÞgαW‹“Æéh&óÑ•ä§+:3GW¾%ÎÖ{yŽé$‚l™€­¹Š¡å ­˜3rW}w}è•}k¯S&÷aÔ;$踲xŒMh¶zúgšFðpÓÃŒD~‘‘a ò3ÇÖ€½$>P°ŠhñähP8;AM’ˆX'"….MÀ|tì°g<2e‘µèR¤DnG`6^²0öè©íÞónÇÑ{9'޽ãu™%ª2§¹k{l3Q>7cè-ÿ§ä&ˆÛ®ë¾Éûmp¬ã“ªÕJ‘ZE«@Ö(@hÔ%´éP{)°‚×óú/Ï{ÜuÖ½­¢‡Y;ªB[ÝŸE?æôqÍ2›Ež­y/å&›E§š>Ĺá}¾×-9j£8ð(Þ±¤ŸîÓñ\KóþYÿ¯çôF­¤zªÛ²J‡…ãþ¬â¼çë­ó<ÐÜíeVgûI¬@¨@nÉqçY«1yÛ­b 3"eÑ¢©L×ÏÒÝíö,sܵ¾¥°øÀdP›õeÇÅ™“O±n8¾@K56òdͱÕ>y>VòYÈ|¿·½maÒwG/¢$j(PÐÅpÀ.*F¹ŽÈæÌêlsWìã¦1aIýÚ“Ô#èé.{”Rt¦ñp&í2ʱ҆m¡Ü¬qw–H ‰XýÛ\ÙtäÞ0®%º]Û¥‡^ÞZ'*vYFã$a²º”öçýë¿ÇÏÛùs|ÿW~p³¯ý3£wÿ{¿×yÛ4»öÒ×KÛG×'Ïï}q®ïîþeùš±ÿuÙòø ¹Û€P¡«HƒP].å-*U€R°|6Nð6 ¨.©”8Õ9 0où–ÏL„9xðãØ€CH ,T«–·´L Ô‹P‘f½W±ƒ Æ.ÐÕ”Z¤g_ÍyŽ}-Ç3<¾ëKù)ž_yÿ¹õ•ô×ÛÇÚ/ÌÛóþóõ®:¿¿@×öÏiûòkΞÛËóþ–kÄùqÏ‘ÏyÝßÛóúhÎÇCž¯šbžÔ¶yofÔû¾™s{fÞ¾ÞÇó£“É>_b¼?eíïÏÃæ—®OÏ[®êU‰‘H}t“|³®êÓŒ>EÁPLÝ»ìw¸ýûK—«eÃRúîP©;¹ÙX<{ìÃôËÓª’x½}zQ}¢u×ÂÝ®$£]èÏL,õœÛûçÙbÇCÝ—„&•Žº²´´ŸØ%VIeÖ}8Ä™x¬2õ‘^[h·®Ž¶!g * àm è‚D‘{Ô"Vu¢R4EeAbtËlMÕþöFÈè®ÍÙIÊUËŸ%1…FhE;’Àö©hM£;iJÔø²aMÆÉJß)gïc‹»GÖq•ÎÑ"±ë!7²ÚÙSŒ©EÀ(<Ç=®}çÃâ—õ5úk¸?ç¾7½ç¢óXÿž¢ÃRãÊì:ÕX™¡ÎQëþ8v¡ö ýó¨ÒÞríòºð–½HóÇèþ¼¦ÑZ:ï^¹fªw0Ž­4ªÐ¹ñNFŒU¯Ò(©Ñ$ÂzÝD‘(nóÄÌ6•]ú`ê$hK§’fHYE¦0VlU `@'HF…Â:,%)J0*»ö,`Ý †±†ØJÃa#Aâ ÁiGØ®¥Å. Øa¹½Ò(×S aŽÍL¹9÷c˜ææ=íoÆ ö㬭%×cÐÎ5–oÅ++ÜNO|¹RåVVâN4†§»§ÇRÃôÉ8Œ_ï>‰Q-Ù§ºÞØIÚŸ?TÐFgSŽ{HÍc­äk ûë—­§Î3%ã9Ú×ÝÚ ‡èt:»Ùífä/%uš–¿©ó‹¨\9yzú±9ýwEçúÞyÞôÐ÷ˇÃÏí‹®ãÏ^ëÚ¬ß=óqc}þÓÜùmíð4宼ºw ”ÍÍ®S˸˜2ß{¯ï¿×•‹§ÎÇ« úTgþ9žÉñ‘äuüúÜ~×Ëä·7ü£yŽ™i?ÏŸã´œÍÞèlC›v¼{Ê^ÛQè®õ½W®õh^O3ïÝGù~^®¯îõëÃŒî*°¬–(jtdYÔ°v 'e\:·ÖV Hu4ˆµÂ €Z°($µ%`,¤…OŽ;ÀŠüb xT@PÁ£BXÈ3YÓI e@™=2œgÅèÐó΀¢£1„GÔãÙûSå±€&€ zRéƒ's‹Ð ¥*m@À UyHªµ5CVèYu# I”Z¡q…ú諪ªÕЂMA¨V-€p¢ B`*WÎÉJÙ²hë# °1ØLUMQ+@jƒ‚ªÕp²¢žÉGÏêL NÍÈSJ%|¦àÕRƒG]}ÊÈQ×J#–ZidS‚ ¡Ô Çhã‹ »ªJžzãµHÁ™:DXPYA…ŠÓg¬â¢«ï0î344wÇáÑ;,,\ÝÛÑë–w‰çíÙ÷Àn´Íî+qÇfÅ(ŽùèóK¿|ìÚÎË<Úëv › @B H¹šY“åhrKA$à{õ÷Üq8ˆ¤s%ˆž…™Ëæ  Œ™YÏŽô †<7p§ú€Ö=€X ÂaãßÇf€”¬ŠZÕŽô½0¡yWzš>ŠZ70¼Çî†ÍÚ|ÎÌÈÁâ10¦¢9÷a寱D§OF2 Dà»d)ˆˆá£Œ<ØH­ƒ®z G“i¦ÚeG Ò²Á2PN0Yndßh|"ɰ§çô œ,À&™d²Ô0DšÇvYÇ‘÷´4Þðõ¡ÇL$Ü8KÈ)HJf. i¬0pºóC^ÒM¬sÑ8='™Á)c¼H)°ÅÓÝÓ~>´îóµ{Ýçu¿Æpæ& ͨé¨E9ìÕ&m †§0AN†tàꊃIÇîgÌ-£›÷Û,3)ªTŒÁ)V j£â´‡ 5V°3ïÐ >Þù†ÑŒ ¼?·ªºvcFÔ—9³6G0/ß×÷ÿË|bx^×ò~vTIÿöÔ…Ô^új{?š¨`3™Eï« ç¹YÕåÛ ÛýùÿJËû©ýð:Æ;¦dµ½G_ Â}ôÛ:ÙÔÇô•î9-•Côç¨éÖÏN¿°´̺Zš‡Ò,ŸÝR>Ù‰Š¸5ÂO˜ÄtŠü²::î«ßmm¯~6Ü€™z‡´÷§‰vÏcÐmNŒFÈAA×m–ÐÁ0Ìt¹9ïòºÁ·ÃÜô«ùë¶ß;ÎëÓùtöâêqYYßç{85ˆooýô ·ÉlÌv¡b¶L,‰JQ:]ÏÕ åûÑïŠ*®. ‘uŠëT—©m9®Ss/÷9Û8©54¨B,RÌíÄÝ|ÑÌ>ü~2}ó_}ÊÛ·ÿ™uï_ûo¯[åtråy½™ãkuûœk¯û¯ÈnîÏ/ðó—|Σ¿z‘nÔmÛP‰aZ:Ö† j¢Ô XHÐ (P5ðZÐÔ`ôdÏÏdàHb Nƒ„ç<'`øXè°ˆµ!lõà$Öƒ@0HÀÏf¾õÆ7 $2’N`Aá„ §@Ž711 i€·Ï^uW™©±5G¬³'³$–h—G±Ã×½^áçOÇå*ýdž¹ws–üãäyüâû_/óó÷yLWw=9ÇZ¸ãã{oN>·É÷y”ÿ÷Î1z}œòí“\?GÏtkÎé¸}Ü©ä§x}*ŸéºƒĮ̀ß_ì׿uûâ®?õåk7üZïó%öiœd½:çpåÃÍX¬º¾ÓÑdœ¯ëêwËÓ¼Ñí1Ýd½ˆù(«rÍ뎶öãk9_;Çlël8'×ÉDI+„jÇ¥žû¹äd Ùz‘Z6ãrix¨Çbc­^¥rKo6·NΘCuè-š-»öÐKÚ ä@¤HRˆ iò‰ô@¥º":ï¡é´m«I$*%C^oIS«œXà°jYÖ)fDµdÄ j›fpÜ 4¦Ý~-¸œ¨0ÛAKë{ *ÓÛT;Æ-q‘VýRÄÝp°ÙÛ)Þ¥· Ȫ“kî|Äv¢Íµ’·ãó”Z4‘‘ÉK•·[s9=ô&À@r°,ôò(‰ë²ª÷q{ª¼ªUÏî€tPrn±sm‰ÓØ93Ö¹Oþøè¬]—ɳ®}Žê'‰èWc!è´Ò1ýôÔz¶kÌÆ²«áxx†{n‹âp}x]…Õ6cíqëVZ)¥Ú„е¶Ù”dN‡4]Ñ¡ A3%)Ýv9‰R&cÖ1ñ Ý¸Ä#v=ˆA’%:GºÖ˜I§#¢H9¤g<„F^c“0;jõSV§ÌQ°P2q í ·âvŽ’}¶ŸQdtœ[ßÉ—«ÿªâ;ö‡¥ÿØLÍ^mç±§í|î×Þ¼Ÿ¼­ýñâËѽßâut—&®1}û,'M÷Élë$„YÝk½±öا¶ÎKß=ÏÇáý˜]ýµ"¿^Ì[==æe/¦ÊêssÆdÚËYv•üÓv%¢W Þ“nÂÆXÌ3ü)ÝìÞŽš»÷8ßçæ¹öã ^ûñ§wÎã<~!üÑ<~û<óKx{‹ãûŸý§zý?>¯¶³ëyMä/'»Fgõ]'îѳöûdù“ér/¾‘¯_“ï ®Û¯ÏrŽÿ‹ËO’&þ¬âݼ¹o¿>×á÷o¯]ÏÝï¯Å»ò^y¢:Ò»;÷=äJg|¾Ï|Íoºž´—Öÿ|׉Ÿ·ošsO¦Ï¼óðëX³¥*gošc³È¨‡£5¶¨[­®€‚d–,-TÇå%؇BŠ*c±<Ä3‚ E~ü»Bœ\}Ü'kÔ”ba!@©ì¹á=€@ÃjJª` ÊŠé™VbxÖ ðàï <#m¿ÿ݇$“ÄC *{Ú"8ž} †³| ÝE¼H ,JsEþŸËm¬áËÎý²š×á¿ «ŒA%°©ÞÖ’ãy]g`âhØÅlÆ–`#À@>0¾ƒJ«A42væ7íØÚ-3 M¤-à†"N¬ XLB€V&ÐlX]LËE@!aP¡4$qˆVb+m#†¥! ÏySX tN/ [UÀxñ£E!5P(çê B;J¨O™E ‰…,Â" 1↋E¥RXe”L¤!T°4iæªHhéXèµ{ûNñ(GpV{3Ô¨Q° ‚È2t }-Œ€\2è¶Þñj'gÝÇ9έúÛ«@cøI2jxK0ÄÌ•˜Ä"r¢2|0ŽÐÒ@(¤ðÅØ3íF¦+‡¤†B0‘œäÍo ò9e'¶¨&a(“È*ŒEL& +9³ jQŠ˜õz+ ‚@¡F\¼m ÛT9iâ,I Bc‘ÚãL…¤@ƒè¦ž8Hù„îVM5Vƒ§`D LKtvMkbÃÂA“iÐP:£²I Á€Îš“U£0*Æh€°H}B ‹!˜@MJØz-lk5‚ÀÀš-K“ ¦ZÈ.› ¨†)U1 ŒF¡‹±ôLæg´XËQеMa¤Q€èù¸¯°q…ÊPQQW‘ÕFqÊf@lF›-¸D»ƒÍPv²Ù˜HÆÜ4Ęm‰ ªAÕ[2FÀó²ÈÚá‡kN‹6w¹ N˜™M •czm-Q(”7÷^n,Tت4fn d,hô$jFÉ"à¶>»»£5 îÜTcön¼1½;.7<òF¶/8î1|¤ÇÈ)¦Æ,HÓd+$ ‘dÔȑÙÀ9@N[ÈX3téÜX²á\5€5˜ŒXfCÌzg‹³ÏS¯¬Ž1ú½žd’aË$@(êÁÙXEãKrß Ülû¸õn}>ù %{¼‰òb™ €|ÏZsa%¼[ÆEÏ)¾:IÒ :ë]öD2Ceò0pÒ?œÓ1YÔ`²@óA* ÖF¹å÷€`2B'›æ Ä PÀÉ Ïb9¤¾Ž>³_¤{|¸¹ èÁ4Ê$Œ ˜”À  éjjç ú>™éA~0òúû @§ƒªß¶˜[Ï ¹¨l8cÌþC¹¸ôwµêeï‹OlP6Â÷œBÒ mCÛðãï××÷ýìðË­ÈrÂ$ªCLH]ü}y fÛ³\­@C*€8¨¬"¸ NÁž\G¡aœÙ®uÝßk²5ûíÿßüÒ$¤½Ûêó]÷åcÏÇ?ÙÏW)¹Íú |„õjqâǰ"ª,ÙõhêÒÀgüæn?îóMvÒ‚^¯×¤çx˜ªÝ—Ërc%I§ºý¼9<ýS[{Ô]Á…4íW,—6ë+ù± ê#ã2ŦÀ¤)~Y¦u†¹YGq² ‡+¯<‘õYꌧþÔ­ÿ/³êhy¾²ÅBa«¿ïW¾k߬»Þþiïnà¾ûm±2\xà„ÞS»K÷׫žÅë…[5GIt~{;³€ke•‡«‹^¦‹‘Qp©qp¸62.4"Çê½S=ôSþÞiFFB¬šsÚãþ¬ú3lF#«9Ó™Ž*ô@V6¤€Í$•ñ Üsx]õê{¼)×<{¬nßÌZëýô{¯_ýžÙ»vßÈ·^ï[ïÇ›Ïý©ÿ|üX¿ÿŸòëW˰—(̜穗6ÏçL½À LÏ™v(«ü\pi˜zLØk\q’{sú Ì€½÷I8Íòé ¤å鄃é´4!‡XrÄ'[fïåÁ–76á"‡I0|õ[6ˆr€'Í@‘0 .Ky»-ëû=9o}ÞÞ³çW‰T ¦ŽpAßò6á|Ôßît¿Ý_“\'Ówùþ1?o¯“}¼2¾–ë…¾öbnfïæÜvÝ›d‚‡éa³îãg› ÓÃòøÌËyY¾`®¸þWúüy=u~]ò¶é#düö˜òCç3×í'ç&Ûíýù~£ÙÛ5ÓazR¡3¨nŸjÕËp:Qi÷yn¬ùBs9{ó+?æVšõíœsÌF:ö‹½SJá³;Oýî‰&nÅ'ÊÚw¢Á:t®ø\KèñúÏÛõôÖ^ºt`%Oˆ«¡*6 !¥!@n¥´h¤:Ä&m±8ZÕ Z5!ÃTÎ$4qÛq(:Š­”<¥ 7&;aµ~A±¨Se6qbO¦²$7RÖ,öi·]KxZ)š;.wÒíª”Ñ¡¥Ž£R—Ǧ_Õ¶ouTñ5þmPÆÖLƒçÒ{U^ÙyÜ‹Ôùá\Öäµ—  @@¼ÐiÞ¢™Ç~|/ýxÄÇ/üÿCýþöÈùµ7sÒóA0 m›­A‡3K{ë2üRÕlÞ|ŒîÒõóPÏ̟˱ñë–t—VÂZå´‡?ÀÓ¹ƒ5êÇ9ªëH¿(^s{ªñ?âÐÑì¯ëØû’3ÖþÍæç­´egÏÑÅ%$Ã]0|vúÙÞˆ~ŒÁrtÚ™s|¼u*íÌqKpÜIЉŠvS‰sP;M¥å›¨Ö$lêÊ-ZªFÍ–²¼Y¹~¤}­™¶ræLóÐÅ´ÒZ³œNéŠæ,Ií“ݦÆç„êbT9S®tU’b¤ÿšáŽþ±ÅŠþÞô‘WçJÓòŠM|F³S?§=‘æØïJöXøW¼Té?ùÎó1ÉcÎqyÕg—ûžÙ¦=°+Vùa*Šö©¨åg·òˆ¢ûnkÛî>Xõ‘Zsp´Yw©ýV’-¿;ï&{L‡ª¶5™]ùóŠNp_×IÓ¦—-ú²‡ù¯o×ýäø.]bïè·=ÜUžŒ~²ß¹—|ê|©êZ_x§ÅO%?kòu_3õ¿^§·u_g¿^·Âž7cÖ3gèóùÖûxœ¯/ö_ÛçܽòÞŸlÍÞÿs6$-ÜGý=Sœ¿Ù]ïžýïÿÜýëÇ›¿Ÿï½%gÙ>Y^¢~WâÆWóëOýñ\ùµÒÿ~™Czô¿16rwŸ÷¯»>¾óçkÍ9Šw_« ûwû‡'~¿ÅùØÛÍî1 ›6™1×°{—\Õ"‚šQKÛ¤À{zÙ\ɲrö5ï´“µ6T”QI> R6DÔ(Î:ÐZ#¨""ðh@ ¤0ZÏšœµ’h-E#–*ËtÿÔAòPYÁ ˜€à X4Àð¨É€úK…‰ª€…B@€@SÐh1À0Ú°Vj‰ µŒ'™2]ÖÔ7÷?ñ+&ÉÙ¤óz¥>•Íó¯gçgޠͼ·í¦¯å UŸïígvvu:^óNߊ4üQ³dO®ÎjïýBÿw{á÷%D@ei$P0a7w2Hé ×¾ÁŒòVŽIiØÖ]qÚËz‡€e[îjTvy 5í€xÑje1œ §“†4 €,i°Z  h¤x`0mi„žDƒ°žé½-¡ `¨ †Öx^µasFPXT,˜3¹˜…8sBB¡("`EE`—pJEuŒûL†±WAT°LÆ ÀJ c\ÐŽ(*.µ7#)q5ˆÇ¨ %^¼hI#¤UW]kðÁJ"LAfŽn­~ò(Éðç8Ð\çÑÍ;;Î 2#­'Ó€EÙˆ éÐ.gø ¬>VeFLŸ€q & Ó@$Xðmµ*(0ˆ¾p§¸z­Pb!°'Áh@ š÷ÅTÛDM‹ÌE%HbÁÄ[gpX’6tÕSÀ "¼$õœF‚²äI«AÇ#ÖDNM$SÆ”¦²ˆ 4 *–*Fª&Ç„v±) Z ÝÀÚX‚ T¦6`Ê%K)4Ä#¢Ú…–I#0Ftn‹` ŸX `¢‰Á Šq–!P ÖDð€¨°I Cƒh¤ÐP`m`ž|> Dt„í`!1¢Î¦ ²$rŽd¿Ç¶)\_f=F.ºÅ À‚ù?rûSUç*FtÕÿra,XF¨”÷? ó™ PÐÖÉ<×b•£J‚t8˜€Æ™p\ '“‘F®@áÉôÁ3Ñ[¦ô0%c."# |%sf2ød.»€$ `v4«Š²Ý½/Äë\Ÿfš|Œë‰ûª¼%­J–YÙƒºÙý¸y¿þÙ>.ͺé3³6“ÓÉÜϞݖÃt×9åšÀ;çóÕì;ùÜîmOÈîÉȯW÷×+=Nºv<½ÎØÃðºlêy»Á*¬ºs™oˆõÆô»ûõ|þïV°Ÿo¼/ú˜¯x;ì·JGnk7L9Õ`u݈ª¥Ð$“ñ©é)»e€SÚ•­l%›”„NU÷óL«úಋ\+¹Û- º2‰:¨ØuoémÖî£=æ›Í¨fÝ‘üÕ‰p–.R)…F¦e´R[!ßTÅÑ©ñ+gâ¹£¨Ït ¸ñ¹#ÃNˆ©t%qÒ–” )-B¦H ¡QAä(w¢34 M€ìºX÷Ø.±d¨Ò±¡’Æ%–4JìĒߊ‹‰ÀIöÌ¿vz¯ÊáÒ|IãÊ­õÖ^/FÏf4ókº['®ÞøËª#]‘;ß©Ä@ˆÑ½oœRwVÕö/ƒ‰³g´?M¯^£ÇÑéjqU!Y¥ì„¶êZÙšòOÐXQ¡Yë*SýÌ"R)ûdç)s™.™UôH*ÔLSvÅË6Å­í»óYůÛͯ{<ÙæÖ5ñ·.H÷ãµ?_©*¼+]½Ææß×ìz·WOñS»ï—~¼±ûÌ{•þÛòÿ¥î_cå¯5¿ïÌÒàtD­\{_ÕÃ++zÈAÄÕ£l;¶3Ø–›ÓªG\‰ŠV™íqÒ›oIªR‡u:ÇYjü5 tÞ‡‘kHÂDb}ªw°ÇI[²ei(BĨ¶›\vJZ&s ?õÝ|ÅﶇbõFd‘¶ò×UZ{3ò¹·«±¥"à ä úd§vs´ïö8yZݶ¢U†27éáŠÎNfïÜ÷ÎðØßçZ”~%±E»È°ü…“‰›nˆ×§÷:ãÎ9æ½en”'Ÿëp>Ýî:ÏÎý†maW"ž‰õpß‚}ÂGygzÎË÷÷¹íévLv¾;¾È×ÇtËžƒwþÖŸ~ߺ_÷º¯ê÷ýùÿg}ëËõ>†£Ïó Çôe¹ÒäQ÷sžUÞGùß9ìóüÿñûÖçm/ï³ÀËöræM´µÁìèaº6¦!G!¹giŸ$c@œµs¹´ú¼˜D?Á¹Ä¥}]¿\Øl (ãh^ &g\hƒIÀ§Ìé‚…Õ«A+´¦ ¢šz8£®IRƒÂBU …Sµ€êiVezÏÊr¦Ù³!,¥Õ ­P hÎ’6\LU<1§²r>XX!À ÀĨÅÔ 1l‹Ô¤´à†¿ãß—;ÙŹ‘i;IrhòŸi¥váRâRj‰ÇËé˜íx¤^®Þm´îžûN¼“£­P4 aàM«jÍè[.#Ð0&ÐFÅýïöýdÇfo,œ(XÒMNŒÎW C2·0Áä"'+³af®F±úf k$‚@¦r²¸e’஀ÉÝÔfŠqe´ oóF]³ƒ§¦Á¤@[™!$«)2ä0­avu“9kôðL9AR®ÕÌ MZ™6jPc±ÓLâj ”S¤Pmte Ea'M‡She¹;»Ç¬+bcSi  N <§SEF\T¦,6   %ˤq±Bµ6±÷²Ó)q´‰H„Ê™|&D€ÐÚŠÁ ‚¦ÚZ5ÁÕUA‚Z ŠVÂë¡ÙE‚ÞI24Þb…644¨™‘!–æ`ƒ%Ž•tÈô‚ÞÜdF‚¦5;›l™é[« 9/Á±[HQÐèlØÆ0ÜPP™Hr…x“€G†izëiut㈥EÎÌ,t72@²,ˆœÝ„DP“¤¤×ÁXYò-0rpJjÜÁ¡mžo¼KŠÜ^À ˜šo‘I4 @Ò"¼FS]²d`,Žùò'#Gò”“I 'j"„lÙlI”dØÀWΙ5l2”rÕ«’€A@¦‹-Æìèt2‘€Anêo'êHLj§˜óh™ó#IÔ0=ƒòN$ÈV"Œx™®JÐÌ„²’1ãP¥ '¼p}‹Dl¹Ÿa­¬FcÖ#(:å*P§ê]zéaµ¤•- ʤ[öB@G¦ù\±|@Zz„p °e€f0ˆÚ :(içCÀ@Ÿ’Œ$) ¥ä;nÉä€Zméá$MP7|÷ëiÛ©cUnãu½î÷æ‚ {NepÖ¾>‰!TÖb*jFPXLU%P€µH*˜<Êwg¿–û¯”‹Î½ØÔ€]«g¼Ám{k™= ­ì¥Y_~lÍ¢ÇdI¼¶5\íóây®ïI^îŸVÿëŒOÖ\Ì'í¬Íïæ]Zšmu-g7¯‘JÔÝ3YuäÈŽ'ÂiÂAò¥æc£ÍwŸ¨ŸZ½1‚0‰¼Òøa²ù0þfÇûñRìͼ¿Ùç*•ýüükÕ~ô·Þ”·ŽOý×ÇivcçÚ䈜G ZÒùªŸC:îåÇêyç[ØJU¯×–ªýòQ¬n%÷æµ—¢+X¼ví»}knŠé ·JvÃ_Þ 6R¼×ýîjlý1&FœèqïØøE\¶¶)GON 3Ä3fØ©{ÅÙ?eÜņNoÌ–­ëLÎP‘ ôW‚û5—K)½Á»Ã܇ÞιE"…¬K>Íó¸÷þñêuìrLžã\ž“¿ö›ý“øzN_»Ö ö!Éî#ö…ò}ñpeî ê¾#ɕݥŽÇ‰Þ_*A€ïÓMŽÄœåSx+ÙnT–«¬@‹P# €,× ÚhP¡²0“ ßFs=¦V›Kå#L“Ò _HzÜ‚@ʧ$$ CÔRÎÕN6 øXÎÈ„ÌøÝL¬ÜËåbCÃFÒ–ðÏ·ŠÛÚcÛûw¿Ï=x²t¹ÆÞaùd¯'X Nå­r­>gÞ(Ñëû™'˜ym9³u³«Ö£´Ê9ëÞ Ø·h_¶rÜ›¹ðmÕîà@DZ5‚Êi`άá8ì˜^jÛ5†’46Ê-Î*¯ ¯™&ïô,Ï;¬ Ëî¸ã¥¢:³p@QÅѬeõÝF5C§µð²×P­¶k!X½ÊDU-m¯J‡(VýRi» 9šSæ¹ …Ö5ÆVt³‰£x•Où¢Q¤凾䤯‘Ç’½È jËYv5p[Ù ê,yq»0'ªÍu(Èãy´i÷Ù¨EE¢ˆ×ઠÆiw²=«Vëî3´ˆFW ˜ÔÀƒS6› “$§íZèT¨R«iH@á1t8%´ƒ*ÛS×h¥»_OïœR³!~ºf/ž¤Õ€"lÚr=Él“‰-õKôTþƒE@b` ä#BEà©íg$ç_™ºœ A½™¶ö:üó&^süb<—M‡mÇ6çÖÍÑ8ô±ÛêFN;4 aüÁð6Wë”<Ù©J3Ri˜™uÕ«8µVügÆÿAsÂJxÖž÷;26îÑþ£ã«’WÙ¸Œïœ=|ÈÁþeý«í{]5ãàý5¬ßi±+\Su÷{®ž¡‰Q=ë¯uø5†Ï>2+Þ=ÜŽUNÿû×ö?#Rí‰;6g—jF±$‹/ßOå¾Óxì<2×›ÈÛ[ìYж?™ÚøP¸Ò­sÏ\±Dã£ñÙŽc«WkªNyŽ™G~î•ßÿþL†ØxèkIE ¥£x’ É4eˆt e»0ÚYC~¯â¡ó:• jªtmowi¡]9Çx+i­XýXŽª}U.vcÙCNS èÄc õ×ká9xÞy·Q¢ef  kóŒÂÊX»»‰ž¸(žÙý8ŠKn¹GrÚ™Œ˜&¶r-9uœ–2¬0š‘íÛr„ç˜NƺÏäí-¦6§ä›ßÇÜs“>æ“ݧAç]ÝRoåmŠãï« êÄÜ›gïëcÑ%„ÂJÌ™žÔ„X.wK[šÊœ¥&ˆe(€ÑÖBD)Dbµ„ EaBÅ`JJA3IðEÚLš îÓÄý<¡îó~'1UZUȱ:nÞŸ}É×u:— ö°aL'TSí—CŸ{%©ï«7™‡%¥ØÚI!d°qwáyk Þ0§Š $àjû Ш‚ªDæ…(AC R àé>„.ûízÝçhrâtz)˜+XÒ4”h4¨XĶ(ê™¶O[®ûÆ.Òͧ9 Å®dMËÈxåüÜi†¹5Tt§Ôy×o}÷½ϓӷ$–ˆ3i? 4ƒZEƒþD¨pH•ˆÒæäU9¹ µ>€®"XTðÀþÀªPJ…VÑ–A„BÀ*,óQH‰Â* Žg'#e J €jP€Š¶jU Àƒ¥†¬Ó¢¤G„¶Ý !Î ®L!sf0åˆRf,°¶±|‘I–OG‘‰±¸ 8œÈçl€“XöÆd4Ãû:ÞÓ+‰rŽ”Ù P:ܠÓi3M_ܽ "9E »ìz˜ÃBÁÆ`ž*^È‘À"5ÚŠ*a)ƒ…¢ç BׂÈKÛ¡³¢L ªÆÙ$ÞЃÊD6Ä5•ɵ0@ÆÄ:k ÐñÎŽj|Þi˜Î £B±È4*ÑŠÒ¤=.À¾êÌ/£é¥ð ÿ¨E>‘f§G8½JgëÐ̇= ›5Š•sà îT™6f öìÍS"Ã2ˆ·ƱwÞÆz @z,œ.š¶aaØZ†ÞÓÐò œ»6•÷ˆæ©ôÅψ§„´$Çj>?O„mu\ºÝŸœ nd6ßòûAr =Ni»§d•KJƪ)éHÖCÁlš €[gZ…#‰%‹g -Œ#bi€‰ ¬=Ñp‹:™DMÛj¯®BÅ¢yô”ƒV%cùôÉHz ìÐÊw/oF`PråÊ‘or” V6ÑNB€B"ƒæ†\>N e¼ÃÿÏ]L½ËòWè0!H"@½V"w˜jv“È$AÍ$ÇÆ‚FˆD-"iÔÓ™#áôѲ"•á¿Î"?$“ÁHÉFÄ ½õÈÔê3B`P,O,0±Ž@r?®V‡£øÛíÈÇøOøaRškÔHưd-¹z^C 7LüV'éå ŸŠ–{¡ ÌSæ’¢ (7jóݯàÞ¶wpR³…Ÿ_+oE¤6»Ín;ﮪp?åGÿo_ê¿óþü4>%OZÎä3,IV‡@ETC A dÚn»óQ™½ž[Ž9Ì\àË×u†ˆ²î²Õ2Ñ~ù^>°¿l®ï’–\ÿfôùÇÆh ]¬4_/WÄ*ï ÷½% ¹ýa øMP­#+dT%ßo-ÇÒ9Dêt¹¯ý?<¢qº‚FÚhD;êUÊÿÛÉXëWøó:^•|ʸЖø8Ý®?¯ÞwfÊË|šŽ‹¾éùÒ~§¿½ã+ƒ´kSÓçõ¯ÿñùô?þühsúæ=ÎI‹Ï¶ö=™Y:t¾åkg÷¯ž£Zzú2·ßÄëÝ^oÍ¿Ïãõú›š§ª@J1b¢¸"ª€Å,£èr®ÑbÐtoÁGhúœž„‚A- eÓL‰ØaH®VŽ˜5|28 j’ cùH€ WÏ<—é˜'ÜBä‹Ñ‘&J›þÓ÷[«!3»¤Ö¿Ý»ºÿÜïóíý×ú¿ý£û¿ÿ]¿/píåÜÜuëü?ÃùÛÍ×qpÖœõV_÷óÉu¢œ¸ó!ÏO-?äŠY·šŽ=Çž{cͱíÓ‚îªh?‹fí´%á¬3ÓÉ¢Ë2—!´#¾o»fteÎQ`Ò´tÀÌZ°Æ£ýêÛLó®˜øZcŠö¬Š‡­h”@`Ê8j"[¯{ÚË­˜#Ev›‰K…+áP®º•SñºbR›÷æz‹˜Љ!DTÌmÑ.âN-›tD˜˜(˜ÌñÑâ%¥dÏBWb¸.Ô™˜D9ˆ±…cÅ<‰¯T*a;ãK<ÔÔN[¦e`nGZkÕ.‘¸ÅJ‚‰2'“%V;HUm)ñÎëž %Y³‰Ý m£ØªìJFc {m¤‰0´6¢–ˆ†&™<ÍÓàÙ[³Ÿ2^;vŸZêœöŸ{Â-¸¦ Ö\ÕW×›M|ù»rë©X%|^ç×·…/ïý5ìÉxœ0ŠS!Ϫ÷ýþç±5ŸùÍioàý­Zß÷²_Kåâ’#¸kc tRÒ½ÖVoÑQL{µ³œ–mU>a‰î¨þ»“—ÃÈ„úŸQ—,¦J<åˆn2‚ÿŸ2Þè‚ö»²êàÓIn›j¸ÎV˜ª¥ŒõÚ'yxï±ò¿ÓcQü-î«*ÿ®­³ãj‹Êa\ûîêZÖÏðÞJaG'÷6§ÚÏifµÜùÙÚ—´¢ðxÔiëÊ_N7ÑV8Ô§ç¨Á^zΉö›o6[FÇ…/n§'÷ecÕ” Þð‚µe}/fuzw0¡y÷žÏÜzý²öŸ”–øªÜ—b²°¶ñ ]„H¶¨iÚ¥Zp[ÏÝ/Îrï»s÷-º€4î›[œœj*Úcú}™¢Ûm•bÐëÖ¸­æœùË¥\ÿcO\ª]xlEF)Iãã{lþtuZxD…qÜF¶[uç´–Œ´Úì͘`°‡­×”'ãÒÞZlKꘗ5Ü'ÛîdÔÈ«šsWò²ÁÕS£9ZoßÙ·çò±ïÍYsŒö«\{t®^'Ÿ ~ßãâ™»g¿Í«ƒ¥ÿÒt²6¿X­[¯×WËGY…fBÕ®A…·vXÎd^‹ÎÑÚ“/ëÿ„C³¯ù×b€´ß;‰nt½¥6Ò8—÷¯çîÿóg•û? (¼p§œxsϘ*K ÉÆ„–Ȩ@¼² * $0Ò“81´KÐ:«]å—\EôÓÜk» ¼e \)éF¤ (‚òj¶¡„ƒ¬Uk“ Ã2PkÕ¡ MM!’¨Ìu.•«Û¬º€mP‚~ðˆˆ³>a2ðFþðùÃÜ´;“7/÷^õ’W \B2(Û–UçV>dÎ$©ž¤OõÒ6XM`áB»ÑÔ†•Ž)IÊI™¦·ÅL™°OgÞŽrž,‹Š˜·áêhòe®óR«M¶ B$®î‹1î7o>6`"l§k½LeÙ õý´‰’ëïƒ'Nc‚˜N+:ó¾Þ8I¼âkÃMVÖlÈ4 \W^ RTkªì¢Qq@è]6Hnã Çdß“X×*g•§“€M" ©f%b¬Ð`»“ÆäJïš—l#46Œ*‚HiÔÞmjkð¢1Gp:v*¦ Úw£>3O*©ÚiHÓµ¬$ªƒ§šª=†FPOùxºež´ž¤Ö‚SÀ(‚Ú êe$@‹V’QB@¬Z!ÊAŒå¯"$¶hD)Abê(Vè(PR¨e0¨‰{å+Ž:N+ˆ@=Öè´hm|ع쉾Õìy²½!ÐÙ#`&.G#)Ø‚ (Vïr ðS´5ôP“#¬."` ’ÏÎaã0}d»Ç|Þm´úEÊ  Šd"H°€0T®$­G¨ÁŠx+X@•ZP¢i™º».Y{šFíEŠˆ@IÒ”A£ln B«06D*SNºb"Êó6Wƒ)St‚£3“þNféyöÜSÃËìÙ¼ÏÍÆ¼Ÿ꼿û•ªgõìSAøÇœZ •F†+)(cU@ Ý0» ocòúfõ|ÿ7Î?¼ÇvÝ1ç7Ü=°‹û«ùÚÖÍŽÓ±³nWjúSúÜ_tƒ.kµÚùmçÿê§à§~ÿ[Ÿñœÿ{×û¼7¹{ÁWûÓÓ¿ ÁR8`ιíüñíWrŸíßâÿ¦/Ãÿ,ml6¢)j ±Þ E£¦L`ÆM|™/êÔt0 0û'gN\¾ãð} rw"µHcK<òå É蟉¤Cò¬Á’I&Ar ÓgŒC$x$$ZÎd_9€«;˜UEè¼+LÉ9ßáÃi0Šá¾Ý4?}öùÍV×™AÈÀÀ[P·v™d@‚å‚Éw17«Zt V­x½„™™x÷JÉØ }pÊ –p¥À©Ú·Q#ÄhÎNO6 ƒ8‚p2•3€ZНŸIGr2ˆœR‹†vÁè2CÞX8˜^+¶ÂˆH ˆd¡Ã0-XD.[ÿ‘9þÓ[–MšPÔD`؉ÖV¬#D¢Ó‘£Cø†’ MúpØ8íL“cy"¶“¢ºí¾W5‡`Ú«Û¼¹Å~¤ÕÀQnÚIJ†;´Ú²vëè|dM—”Òyr…ä¦Êi蓇Pˆ¡˜œˆ4Øf,Kb÷þïÌǯž÷³Ëȃť-uY~Í0*MÖ~^w^ÿü_=Ž>z•yØ#©t>»6Ï`B™‡[¿1«âµI¦¸¿žùÁ9×­qtu¾¶sÎy^r¤Ë©zmÍv}š^_sŒ‘Âr·*:òÛ/7ÞßþýO:™Ÿ½XùóP²â.I´”EÕ{¥+‘…Ͱïùýæõ¼ùýCÑ/“‘"T£äæ[Ì}°î2ž—Ž3o5Ç4œ§üO£˜_Nÿ9“™wßm<¥¡µÝÓ‚]…ëhç cÑ… ¬ç¼‘­ò²òÖJvT¨ý| ôê^ ñÇ@é·ÙÚ⸃éNís1uÓ×þÙ”ã•þ0;Yß­ßÚÔž½Xálúü.H’Ó•ø+?hÐk¿àOâ›ê‚Þ§÷nL§ÁHÙ­ëuÒÌè‘ê*­ˆ«zß²^^)Ùxʇ$÷Y¹àÁòøÏø—½gùãÞŸ7ý.*cS­â*GöJÒYa«)ÉYô{{Ýâ¯Ï´OÛsæƒÿŠ›E){¡½Ûã*蜃ξ›òJO²N´ŸN~t¾kã{fÆ6æ¾jZ³Ú¥™mµš¤Ó¾3L86ÜUçÞ¸™šæÌ½²vÜ»góMýÂϱøöÈIký3³˜íaûË^=üs}õN«³§‡:ØTÏnÞçÎ:’*Tôv–ïYïjîY„<™ÎYö´£®ÿ&hg§ó¹û‡ÉÛ¹<[&W÷¶kNí÷ѯ®•i‹OÄʱ°e¹¨Côµ¯íƈcÂX´é>¨ÇGK ´yKtÈ¡)`iÐXy;]DRõm – ìê•Ê•vö²§¡Ì¼P A…w=ÕC²«IšO¦_¼ÎMh»¸óôÛ“·áþÂr±—¹¯ó7Ì„ |S 9ð÷ƒIOhÏœõ0K߈dAX €’r µ²wqÔ¹C×°'Jˆ 0(-´ÁÄ"µB1ž ­Ê8´j²ÀƶY¨µ2àjeCÚeRÄÈXïU0€m.0Êà8b´86(SÄRC«T·}ŽB i°j‡áÈ“9ɦ.“q9sw´™• ›YÛ¢i¥²D¨å ‹;ÌNMûÌJ&Û1ãP£MâèLRébM-ˆ"©ÐjèFGÕp7»ÍJÉ‚I m˶¤A BÃŒà(S¨ ¶\#Ljs¶¢†kX sK¿è_Æ`uDÃÔúoüáýïýwÑ^¤*RÒ,lx¢IVÔDV0@ h´"€P°*­((€HP¨D„Lƒ ÐÔ HD% Á8éBµ¬€ò!eÖ Ô$OËìw©†"y0 Þ‚XžîL‚¸5x‰TQVãBÉL7& NÍ*GÉddÌh:Egf$¾õyìQ’GÐÃGFŸ n ™=|ÌœÀæè”dEÝڋѱ & 6þæYÐ!5ë$îja´H•k|#EMA)V\-©ÆÈxE,Á}eò”î4óîŠ9jìœ]úÿ ;û4Yž¿ÿn¢A¸|Ûè°êIãѿ߮o«ï¼Ù广>÷úTÛµ,†áQêó _¯¯Û}¿Ï<èÑ%f:{ÑŽÌF’Κ%V›B¶FK¤†åð4,ì»û=ýá|˜~góÛæ~Û›V1\/çû¾½_—{ÞŒö$Nß6î¯'?ÑÎ^Cƒ%h0_o\Ï6çüþö;;Ÿ«ýËÓeî³LVsêâÚf×ÿÛ}òç¯ô·ý…ümž…[ËÔHC”e½.ãœ#ôro· “wÚ7íïQCƒ @€É¤S$‘<õúq~”Q(€Xˆ`EÐ!úbpÕ`ø¹¬zÀÕª·äéàEH-²Ÿ3‚L‚H2Q’Y«§g@€µOL‚‘tr€ó3-a&e ‚šÄÛ€(”D1\ÓéÒA~2Ý3¥iU×ÙtÜ:ùÔù)dlå“뎭Ÿçöã †E‡•€Aƒ€Š¡•jšM%xÌ4謗tÕ‰œ¶JlPK)u¬=ü;ð/ynY…‹éz6¾ôW( %%‘Õ¶;ÆQ9Ï×mö×<}¿qc£Î=8²}òsyÿ¹æ —ñ7ãÉÁc|Ù_ÿÝþyóyz÷÷÷ç¯]OïÛãµ÷µ÷ÕçOÖéÿGç‡þJŸ‡÷[ï?ïæû_ß÷ëÑï¼Kÿ|þ~{÷ÿÜŸKÿúkÝïî~ïÌïïí÷ù|ÿ¸ßÇÛŸ_¯X5™BÖŒ®óÕôUç{ÓϺ“ãܦÒs6mH‡ƒtN’ULK©„kÆ…™Î®¤ksΰtÈBòæ¶·Þ^Þ‘9ÈêR6™8 µô]Hts¯£ü³ö0!Ö]Gl84=6gsÝ}Ìm€¥âR#>ÀؓĩÓ\'ØEêS"S‘IP4‰”-º‡])ã´mèRRdì¼·™*îüIV±—Eú Á(n%ÅaÀfž¤ÌJ‚é¶Ahh:¯Š%ßÀN‘1Å:'q‰ °@Z³ØÛkÒAGëA ÇeàèvtIÚÌ¢†î“¦š,f71-&·ð,]Zfé–`¬©,'vù£aå{ÄÔĹÒ.ñ*α}®Jq.f^ç;—ïÑìr^•_9Þ³Ñræ»tøQnÝÇwU¸mŸkúíˆÎ;õªtš ”\ŸËëgOÍûä?ÙüGÑW»|?ÎófþßYÕ†:u¸£†ËÓ/¥o|ÿñÞýöèO™¯§Ðì×åé2ÅÒ4žÚøZÖäìË‹só¾4©†}g5hé3lñ¹ö­Ü#Ÿ2#Ê :?¢D¸7‰¨¹ÞNÕ}ÄKQ£Zq+VÅ’Ûl“Xûôö¬É:ÉØóÛ&]A^¹‘žÈè®óг”²ÜÛˆ%YP@§Þµ®v—aT¾a-ª„1¸‹j°:\—g­Å[ªZMLGõÔq´šj¦ç“¨²¥Y9ê(Ùij¤E³#ŽÒ¨9¤¨DTˆÇy|Ïí/oHR¼y½';IUIÛæq’Òv>îˆñÒìZŸŒ;†vÛHÊŠ omuÄ[ö•®Œû­•î C\{ïóçªÏÛÎstÎXâ¥sq꬜eÒu˜Q§'-ÒZò©½Þ>_×xÑp\«÷1ßöM»ýNÛc¸·¸æ(µ CLÝѦdÁ’6Éqc¯;_o-Æ £©©oNc¶oè m£Q*YPc—b€Î6 h–ÁXÚ¤×äúÌ¢sì,´s‡iL©sÁÛâkÏ>-3IŒÙ¥›0fBÛšÕ¡­Ü~º€ï¯5¶a{¶lf³Öóõ`j˜P‹LM(= € J£Šò:Ësód–¸.‘xL(…–2z ˆ+CL[4²¨ yŠ(¥ £†[¹iT×iû$†ÄQAAÜ€haBTºxK‹B A+†³;“9È=牥„2 PÀj€ÝÚ§îÅì'&h\Ê.vÕýrt¦©F´­´± €†*†F}d 2¨h“<€¨^keØ=zÕ¾L: K'$L“„âRZ„R‘š7¦º«µŒO<0{á^‡ÎÓmÓV¨Ø¤æ%–vô4¨7µ™™ûTG÷Mm åkQÀ,Õ ÈCº+R+D†mŠhÒeÉÉ–V·¹+ŠA–ö¥ûª×ÚlLUÚ­"†397J ¡Fƒ@¡|t "( °£r^*  åˆBÏL«E‚² ¤(iD@hCP%Ô`ÃÔ¦”P”“ÑHÀÛÏ«3Ÿ‚eb0g" ß1Óæƒ×CSîsd† (£ §3ÁðI^Ar ¢½f”Ê 8rvô`qÔp(Éê @Ðd†!Ì8*ÈY¥K·žÚZk%Ä~å•ÝÊ«ç§Öcy‡vf1SÖußÞÓ›2]O ÞßL·Þ±ÄMßñ`î4ŒIŠiÖh°óý§Î¼>wyÞ–ös¯ífaÞÎ=„}ÆûüÍù«{yþô“ÅIŒÒ¢tÐ;i›·ûumöÍËÎGzæÅÏ×Ûk3å0jVŒˆ‘‘É´O_¢¼Ý­Ãfõ¡–ç_{ëvy|~ºp³sìóÇË(Ù_>ýòPÏmã¼;oï|}O™f?Ÿ¾Œ›s« %«Iv!hE3C ÇÛ'Ïq²×§4“„–ÇQã¶TshAÚÒG¡Üu¦F å°´½Ø Ë©"df$Kü™¸)¿Ç7ŸÄjèøÁÊI.V…t& !aÀZÕŠn ‘ûtH}ÝKˆÕo›·š!Sœzé<…˳¯Lb`ù@œ¢¢ÎÒÞ®ÆS¯™ñܯãõ ÝÞ~.žŽmP)d=HMASˆÓq_Ž9EÖˆx!ùúî.ûªþø´=øêôÑùÈmu5PEB¸“à‚v’Ù¬¢ÿ•­ê_ìÝ}†|¥V£ ²ÚØ`qÏ^þP^ÿ&zýCÿöG‡øÃK£O¬ûÞ¹zÐ6·ñÜŽžwcåÚ܉Ñé0Çt©Ð«pV«“)V?ÆS¼Àx*ymóg[4/Ó > fFqÙh7}«]Í3iÛgŠáETÚžñ¡oú&Ãâºoæó1¼¶Ç|3•W÷·.¤dÏúÿÿÂûÿë¸ÿá2éòéa禗XM¹2ý™õäõs³ë*ý9ÖGà‰îWè 4À5—ªE‚bE¨Z@^g›Ù¾¶§ú~m»dZØ 1OäÃgÿ˜ösû¹í«¯_þ¹ïýñýÞ÷{Íûˆ±šø¿þ×ýßúäÑýŠ$Ž0žýp?_}»ö…Íû÷óéý¯Ó_¿'ï¯ÿ«ÿÁNßÝu|ÃÓ{íÙþÿþ“ýϺŸüóµ÷ý¼ý~ý/ûû©ÿÿÚï?bßýÃþ‹ï¯êßÿÿŸû¶ÿý±~s£ÿãÇ^$M9f]U©ê¹¾ò:þvöºåcñºU5°®½Fq, (—jßV5J•e×2'Mwƒm²˜³§C_5Wç±æŽeϳ¸r;9JT:d÷]ÑžìÕ™Öš_c³ç}Ð9-Ýó6¡Î,Î1ÆÊuw¡›=À“al¶ý™…’š ©`"q]j‡<)*qÁÃè&mÓ}+u[Äk%Æj3êÓÚr¦S­*— Éð38*±eN½ÇTÖXŸi·Iöš­7¦ö€x×Ý¿4ÕÚÊêÓR„1K«fºDYN“:ÓvÜR!_*i;„ gq†1µY Rj3‘ÝÙæßžËây‹P÷VglݺÜlK\º6;‘ÖBW¾ ÷­àyZ]_oU€O(—Î4jT-kv/ù\[ɨ7U}²ïâI©*Z—ë×BeGù¼ççžÌjsîGìÎ{ÏÜÛ{c{ÉÛ/h.ü¤y¾Þ} g&ì)Oï%Ü«‹{Œ³»G7'27櫟uÆ£aÈUó¡öËUCv_¯Sqò«“vç¾JóZ?iˆ…ÔºY®Pu¢CÇ'Èíéy ƒrìýz›øË:Á) ñ‰5ètpí[‹A†ÕÙ2Õ\*ÒXö"H Ë®{ӒΖFi¡6¯VéÖ}·›Z¦­9LQÏ}ù¹¸n± ¸ä$&V*ùÜ Ç›W$’T.„l3b(Ÿ4§‚)ÊÅÕ˜¢Ô®¬Þix\™Xµ¯’jÍ¡”1¨£Óöãx“šó³*@ËÐTy<¡ïÙ03ÍjûÙÇÐìªWÒkKk+áJ~¿[ÈÀ9¶îìgŠ|X*m¥^ΕàiûâÎëÐÚÃN󣓎;â6Îß¼Ù–2\%§ä©­µKÕöÃàŒ&6ÖôföþÚÅ7ü²yEâ¬È‘KÛŽA‘ *¹•’E;e:)î íˆ7(ê!¸»²w~ýœ›ßßà¾o|Ï1Y&RÖvs°(8³6!kfK){ÍÆ'¦;Ÿ÷½}(nó=žé+ôÑ=§çhö™š»·þÊ™NÏήMrÿYÝCy; ¦›ëM’ ™ôÁû;OìÞH¯Â@;=¿Ý:sÃæ¬Óqÿìî¹½6ëò]ãµ/UVbÉÎ`+mO²©bÉ*-¥€ýŽ!AX"³d±÷Ó0mÒÎ^ÝÏôÊ>¼?þû¯=·MÿdHCc­kRÚŒ@¶qmH¼¡5tÐx®—éåìË!¦ÿö­œÅL½HÒA^˜ys¶ÙË"¢#& ÈYÂåP“ 4­° ˜”ÇD\XÀ…†t+aRAe»&~uZ#I–9èƒD¶#’(ˆ›˜Ñ ®R®AÛ`!‚*K -±*‚¢»I¦JØehw½ÙA<D„¦‰™“‰CÊ .•Ž@åØDêÝÒ\&£UiªQÒ£›t'ÉÕ¦eCfƒm6ÈBRBT2æ¨ô0¦¸Z¬ #hd*E¸ìjlŠšBEZóÄZ”®tF¡¨1rJ“B¥ 4²pc¥—e- ºJåÝö/¬qŒ›t«°šŠLêX&S’â¥;Ï}ÆÎ­Ãf6‰&©€V-* ˆbà ë”&q¤Èk”o;³NŸµÓ& ¸ 1l“׎â¹]Üž¿”vºâ2¶èËX“^ÆeˆV 1 N­ ÆQ!F   ¢¢z’3*bÁòÐ3øur@­ RY£«@Ô b8ùž­&§ÈP@è© 2. âégHpÌÆÈ„pÚÌyÄñ<ý[gšrÌ‚^™X¹™D½Ø—6‹üXÙÛëÌÄågÐwŒÓÇX[™™‡&Š×…ÀQ5ÀÄ`÷¾­¹•wG°á¡ÆnGD~ñ};w“c*’ØÙî….ÕÛ ‹Gd?î®ô˜^yÞÃÈî$˜Ò¡–&Äìæ$›ƒÌê¬4`Òk1 ™“{ûkëñï“íÜ¿âD×ãò÷6›¾ÜŸÏO˜¯ô©çX?ºÏ=‡ýâv¹ý4=]9¢Ç,¡ÍÑ›ÖÜ¿z1<1öÜ÷ܽ†oc,-_«s[bY·œ;—oOÿïÿRšI¦ƒAp[÷uær˜À·C2A¦Æ‘Ë7'o'C/. N<·w"œÈy"Ò3κ!“¤½ÕÅp‰w^ŒüÖçj’‡ ’Š@¤{Éä€84ôéq«[J˜–dz‰x®XƒLà RÞNA$Êå¨g@Hqˆé38˜@ÌLH$Ü&¨*&fQ˳î¡lŒ00hg]C¬T_§Ö³˜ œkcܤVΙHZè}D8&“ƒp¢$€)H8?V CI8W°ÌÛËÁjÝÈÁg·ô˜A2}K0‚4ÓNƒé¨Çädù €0‹ à§Óá錢 Œ0 K AÒ*/ D“Ó|œ  voC rb„3rCryFh_`®Rˆò|—8éF&Y€Õ)mÀ…À ¶ #<‹‰m>³V1̼ÛzI‡†d’!Ísc> x–( Ò `„@hO:wsž7|¼Ñ¯¯÷ë1ß?Ác—~üúpê³B¤˜!næd®Öƒyo~åó½Æ?༥ÞÛû5w£2[^Ü$ x?OoÞ­Ž^î­m³’àžg‹‹Ù%H@gÈÝw·¼Or\ûžïzÈÏ/6Ûê~ õc$”ƪÅBÚ(Âp‡‘˜Áú÷­¿¶Þ“ã+ÊîéfImä¶0‡úzÖa¯{½ç~xÕX —ôua ?ëÇÇýù;ï_ßìsxµ]awŒûó1o{[>ýáw×o3éÜ®úm†s¼#mnø‘wË{½ß~ë·D€KXFÂksÕöÒÿÿÿ¿ÿ[ãþqY›ÌÿåíÏüýýõÇw?¾~ðÏ]#fŒö²ï/ëû1ïõÿÞÏïö¿®1úüi¾òÿìçyÿþt¿¿ÙÅýõÞŸ½]ü}Ü÷·¾[Üãâ¶Ž}¾´´#h]RPi j®lÀ©okÏ÷©}ìdÛªB%ŤR<Š“:%¥Ö´·9 ©·{êMÑ´Ñ…öœ-{âc ;Þ™Ü[ow¡6­ M¯¦D0T Y༯ÍI§¹«­ ¢°^ë+áv¢5VŽïÔvæûL2¼–ªLäÃ:LK¯Ê{‰®4Ø*ŠÃÁn eŒºÌê[‡•Ö•Ÿ!¦\&ñÆëuhïZ–±ÙÞ¿¸ž…6þuÕæwÛçÿ¾™ûz&«¤DÇçS¥»¼½øûÿ9&f—L·äŒU"öþwÛΤˆ/~Ô~ìÍêQÖpͦ§TØÙšÚ&QU@ ÛÃ7÷­þ*û¿žó{„úC«’Äú¸•^—K'bEe¾Ú ß{ÿy÷¹·GVÕãþ}`­$¶iÿh™c5ªƒ3©ÝS}g—RÏžµŒÜXÕ¤r’L掖vO%þ5-üпjí³6Öš%úÌIͤ6‘ѵÊkͼ{㛌¿Fá:´ïÔöÈÒ÷™ÿN:µ<ÓSÕEuºº]I3ÏenþÓ{§“4xT&4—ƒ\ÚÏ,©B»»›NYÅz¸DR¼‹ÿdzje%§„”ÙÃÙ‘Õ‘8¬„ÂVBN{S~íÐ 1Òv'äT‹ž]j7ùšê¤qßVN«Mìn;£4c×'Óe‡õÑÜnTºSUå“-Ú S« özJÕZ2ŽƒÑDZühl&¯XëŒ&žɾGG­C °j9Sëö±²ÉcYm¨ãʶYA^§½÷ÝO.‡QS®.ÝYi]æ»ü³ ;ÁFÁj¿Ë(Qt"'ãÍÎk×^isoGžãîÊ…_‹™ÏîcF0¾Ëg—Õ¢„æN“”ëØl{ÏŠ—©SÔ:K‰›¦-ïÉy&¹¥‰1H„ýŒØÞ(PÙ(BôŸXÚ¶¡ƒä$|ÇœZϺÜÞãt;J~`NŒ©tÖsB¶y~êüy?ïÒ{¬Ež‡]ýžˆ¸Ý${×ñÈó¸;¤;9ô^ìj¦ •¬–­Ÿúp'ymö`ŸžÖõNKïO†ít;ÅÎûÈ©hS`Ò>4{Ot ‹‹zÓ™ƒtã v“LŸ=ìç0Óp. #t·&:ØgĬ^‡O¦ßç÷?ç`9Ä®{mì*ëÎ!ìM'j?µ7Ï’Ší`wŸþô³þ&½Œ?ö¶þ óÿu~{ÿ3öTLmm¶[$cl(é$µaŠk51Dh,ÕAܲÝz YµOƒ®ÓúC{ãWMg˜4§œ©5°ÓkWtEÁ†ŒMÙ:@ƒ¢i«¶žjìؙ͆,$ Xߨ×nйVÏáÒ-,S=÷c¬¡eEcº Û…7'êôï¶£}I2Ë-/"*mX©ë,&† ‡ãFØÄ³-½;vІv,+tíf@‘I&âSX7ìZd,©&{±B'Ñk‘RÔVaµKÆ L@jTkdg;h’‡ *³±§À]î®3Û™û´°áú¾KÜ@LÀzÒÍäË(…Âqa'ìÝîÿôûÌ©ÍeŸíææ•¬g.~b§­£Msð.[{ ™`qZK7Ýs@+ Z2æ)"îPÔ´P)'º°UIc)h~jmí:¶&6£“P¦b:©ŽTW£ô$øLªU‹KŽIbÑ4$…é%Kí¶‘ºiÖ¡pà˜```[¯ÐTÐÁáh¸IÝ,K ‹w›—!àJŸé‚—eÉZÚj‘@¤¡Á£@an 9& ÀºL˜ÄÈ©0°µbJ@%¨ÅFFDUHÒ¬™©ZXÑ‚BTJJH¢( ¶½`¶ã÷9Ü5ÝÍ…ùPÉœ ‡°f¬°¥¥\e…ãä'ßåÁoý3êeÔ˜˜}ùÃs|Ù¯¯ï½¬{ôïF<ÏëÜßZä°«Õ`Ä5öV¾5i÷pfN{ô+ý\fŽ^Ißn¯PνhMÅšAFœÌØÛ2àùh+ áÜáóíÂ{cŽIrfI7´WE@H“‰ÇNIŸÐF9ÌLBÅÕÎÅsï;ë¼O”öé´²Ñ(V;f·OÆÝg¼R2oî#ÚȤÐÐöa{ìÁ—ƤMzñJ)Þ¤e»'!s–(×f OvvmcÜ—¾[Ž‘ 4Bd¤³¡ ¦c:7½$fßÌ%TÞçÙ/ÿâ2A’]ÇÑÕ¥'GÙï‘6ºÖ3;/u½8«õl<Ù§-Bä”ö4Ë; ‘ÛušÄ¶F)+®¥¥&E‡ÉæÈ/Y¬á¾Þ’;oäeô¶î®§~¦›hò~ê½§ž_õtƒÞ4N)™QdN“`úI2üœ&Ê\´:' W[á)¹»ù}‹ðç$J2Hàd3i» ,¶’[&ÌLƒ4V@æ 3ZÎߤ#¹Hú&QH"“t®VM}2 85m 2yÖȉr#´˜ !=;€…!©rø\Ye2ÓÉ85B¸û°f!•t¢dÑ#Ȉ$Ét&EIÇi ‰˜L„‚¹Ú» ÝLE2}º5©4“ D&Ý‚“‡HÀ‡BLšxïšp¢Ïs¥ñDaDN°àg[ ÈÁ๲†Ì>™ ÀH0€“S²À$œ9<ɬÕÂR}Öàäg=$Ã0érI ä5[€ ‘[NÀY“LðX<N‚‡Ó±”„“HãHø”¸1!ÉXÍ-L®3d²î”`¤‹•ÀÌžÑÜxtÛï o ®Æ°AwúLÆKÖÀð—Í#Qs8 “À‘t: PíhÂ]XQ[PyÑuÇõ«ýç;} Ù_ò¶=çGòº–¥~¿>ódÏú´Œ ÑqYg¶ÊiøhÎGžÇÝûó;ë¾ã!í ¿Ç}h_¨‚;é0h/öΩ#o¾výAô@PHåŽ;JEТˆ_¾›/rÊÌWšy©ópÒ’§{Ó]©ÖJ#Å0ºŒs’² è|è>Ž‹ØÞ»J6ž².òÁh'G=…Äh‚à?¸óQk)_¦Ï·åõ¢×«QãÙ{×Â$=–‚ÀLX‰ ÀM{ЖúJÁ­]棇÷;ñ»u¹ÉÞŒ L£M#”`C9ŽÓ<š<Èrxÿ±íŸˆÖ·yaFÿ*:ÿµÔö«GnköЧØÔî6ð¨ÂVÃÄ9ãóˆw¼Üœ3îÎçA0ýEòlÔ¤8‚@tͱÂ1¨$[+Ôµñƒá‘Á •Õ¶LeuÁ{î=å·_{_ûT×ùï·Ýç^øœÛ.9¯o€§fj}ÅyëÕùßY{æÌÚ÷í³SÝiþ#n¿D}/wäHÖLÇ’ôY9>›}~­oÏô÷X¢F Èè4§cæÅPíQUVOfçörNœÆTÅuÜb¯> w÷9Û$û¦÷°þúÝû±ïß߯»ÏeŸ>ÿ·ß¿þçþþOþ³/¿ýÞ¶¿Ž^~þ÷ýÿ¿½ÿóÞßé¿>¬‡/øþb?ýþñ§ëþ÷ÿÿ[vxë]Zïûõ}¯«Vúþi}©-Ëã“}k?Çuôëž|XߤŽû¦Ôa`Ô–ãHë°>R1PMzMX³{hÈä\».slt/LUB,‚iε-Å14±ç9:º¶í1½j† sÚ4TiÛÌ9/úçbÕ¬¤‡Â±¢Ó¹d-=FÒ§cÓïÚHg̨N=Ö¸öŒš½ÔÆyâÒªmvEþ!_AíäÅl§À5UveÙMZ.§ 1 áX“8KòhC“Ÿgyžù~ÝÙßê8\‹bª»S¦®½úÃ?¾¯þ+ƒ³VnÏGLÕ‚ÿÝÃÆšˆ£„Êcsªqv>{ß+üÛæR3ôM«Í¥ð%ó¿}3çh>TŸ‡}vÝü–££F s+Áî 9 HF!¸#³ŠÍøºjäö|öXvÆê²õj25»0»y¤ëÂ>ñ79ü{­bkác kgÊËÍÎÜ^Bò§Ó±ÆÚ’NsŸX^ʾÚ~Ჟ b ç¬éEÏÚ8•(]¤˜” ^EM4é¬Z£÷Îì¹*J§ËÅ ÊÑîµm?ô¬>‰—ßÄS·!Á9m¶Ú»|¢Ý¥ÍBïÜ!¹ŽØ2•’P7—®½Ô¹öêþnl¥Ûö²Þzbsõ«Ä‘ë8žNOVíyÚËïqÅ*Íñös[k?9£*8®öué‡fvWWõ Ÿ}t¬x´ÖÝ™û[Ù:1¡°–\~9&ƒ‘}¼•:ÖŒO/oÔ 44TS劭ë}-“í§MðÌEûÓ8ž¡ÍÃ{pË\äq†ÏÛólM>kðíÍáÙ׌·—™ïqÜ×›¾¶®#™O&p’Õ~9Ù÷ô^y§5kz“`8›ô›²©Ó[ã)¦“§La¿nO”˜ì¹-¬¬ÂTSU7˜ErOýœ‰.†ê´ '¡\øš-ÝãšmzŽuŽ5˜kÒ9k­˜í¤Ek½Ë{.z¾{ûæ'{gožtõÖ©Ÿþ$w hÍpŒÞyÒû”ö‹gó œÛgzûp9 9îhó­ ]1¢Iƒz-R­X¼1x” M(åHD6UÂÂíOós¯k]¯ãE¾9_¨"1KI *.0t…­wëݧŸ'_MxnPKËE›4Yôõx5‡ ½ÓW6ÂÅ éÓeidâ03M`7½ã¼3Í+~›ûâñ¾ó-ÉýšÊ‹ÏÜ.+г³È ÛDÍüúž…DÊ)¹s/ë­kíS64)¬„Æ£¡·¦]9aè8Ýeö¯3A¿q÷¯5ÕR¸2ߪöÔK1 OÅÈ°Æædx¢­”£§Í‘ºÁmRnh+ãna8Bh0iuŽšuÉsA§ïÞ¶ï»_í¿ò{­1Äd›ù€Ï3ßÚw:îݾyÝÏÚ|ÌÆÉ+þ›þ…Ô;?ßO9.áÄY˜]¨ 4I0iJµ`•¹ …˜¤øÅÄ£Šlbmƒ§^©ÂÓ²ÂÖ„fŠ)ÒN4w©}>¼[7;,å€b$J•ÒÀcM,ñ2­E‚Z (*t ÏÚvµD"% „XÂ#`*i{Ÿáóæ¥YÐñ»{§¿8¿@Ðÿt?r1@¯°…Sט\Æ”™ë²†¡`Ò xB¨©Ñ`xðŒRUT[S@äärÕ+ê)â$€àJL#nÁÔSÅØãgf"@ž!ÑøDˆ°Î,‡é°‰ô}tùó“ÿòçúóåYÿ¾ú^¯ÏîëŸþÖOÛc|wýãŸêç×íö­ÿþþ寷å‘䱿Çm¼¥ZÇõÄgߎٹkÛìÄ×ÖQcà±=ž1â»T™9mÃï8Ž¥¡E™Å¡•Éш‘¿"G”–´A4šÍØÌ±Vša’¯&ArµhíÔ$¬oÜX€R¥±Û*ãUs›orÒÍñÞˆP‹‡6’I¼Š1ZRÔÐlÙ"£¨ *(“àªeŒÎV§VÎM,=Aצé6 ”q„™á…»žZ%)·O/trØÿÌñ>“^ÍaýÐ1¡7>y¢³÷ŠÇˆ\h–Å”-q©uÒ>†\pO;ÆíN_eh´åZ†ìÅ©êò¶ÙwÜ çm߸ãŽm›Fvº®“yžo×Ïù/·YfÏ1‡í½½WS#Hä§[Nbõ1ͤWÀ|W/“ªÏ÷ø}þ|V u_” “ áC ¿9Óƒ9I3œŒå ãküÆ'Ób&NEœ¼þPvòM>†Òé¸1’fnÞ |>ð  ¨±Ø ˆä¹§ ÊÓ?€'\å ÙØh©“à 8™Lп]=äP¡Jg‚É`‚<2¹<1È €ÜೌÎÉË-ÉÈÁ%™a’13pãƒÁL&:eë]ÀR\ II†„9Ã'È‘D¼A ‘H2|&MÀ˜D`™x3}DN3gä-G=W†ÎúróSR.fÄ:?„`hÄ*"ÂÉ¡93Eiº9eŽ¥ÉÉ0tp‘Ä"|øÌ\0ÛÉx'“µ“m$¨Ý:; ÌI#‰>M‰Œñ,Úeõ rBÂU Ô–Á°@«EU›!àêк,7‰DÁ9]²Ñ%"ûi_?v­¿Ü! IøjŽÆ­¬~_ÿãð—z¿ò·2 ßáxnç=÷­¼Þê×—û¯8sÏC£fSSb®fXi£<óÇ:{ùúS!cf> ó‹Êm‹·0NŒw¶¶¬Ù•¹†‹ÅIÜŠšDDƒ•ØJ2cË9Û"2 e¹ç4¾—ë)L ”Ä$E2LuÛ“èɶӸXö(ª‡@©¸ãɆ.͇Çî¯;éå~Ê˱ÕÞìm&]y:þbås3Ö%öä~LÌÒÝ\szóï¤ó=¢'X£²4S¿'½cEjW°·Ë¯ïÍk¹¯$“b1ʉ±ª­Ôdü÷Þ’Ò禧½>)UÉ XQm´¹”[IWÉ©;’;å 0Û~Óêz‡þÏ}×PÙ^’$3[Ú•ëõÆo˜ë±´?p-ç «ÞüÔò©½(œÊ/M]в]"cupºÔØtG£ëÃÌÁÿÚöóR¹”8 9uì­}õûÕܹ‡±«’î5·‰öðQ é²x”ž.¬ªdÜQ¯È¶¼b(úVôQD±3õs毧••dêˆÎ§ô½ºšŠÊõU´f3Ûz?k3;ÓÅi‹ÃÆ×Qç[¥5·»âÕ㕸«D©Å`¥¹¬?ˈM†ùb˜`u×)Ÿ‘†8$šïíNíYó6j1Z<¾×Õìc•*vÜôQ±MT­´ÖŠï4FêÁætÞ{oÇî<á(1í¥\Ë$e&Qyêv[ÏaYé`µ„Ãi•Ý>cÀf"W·OïHäF; /RÈ [É–õgÜ©=!Gp¥ µ’µ½i뛇-¬2ƒîæ=‚¸Ü®T›àKjòK³‹^—Cç;íG+ßË=#žnÒPDìã¹w÷jí0î­ý¡Âó=ò¾ÚWãO§„ÖJ_Ñ(?ˆêëØôVÿ¹±•œïSê4«Üt*ª¼ÿÝ›ßüü?kö¹¤Q{meþÉüí=ž8Ÿm2ÛÃÔ¦’¡‹Ió“¯?ž©“™'ð¦ó(Þ®'_ßk“¶tOž8órÏy Àéy\߸ªk8¦3å¸{Þçz¦bwü—¹‚œñú”]îó®MR²·Þ€ x”N™ÒaÉk× $5ÛCCëdŸ}*³u¿¦\û ÙÛuèAz­ýíÌánäT›=&šÙfÆ]û‡îÖ³çíÆsÜî’ ò…ý¿®Ï푌òdöy@¬†œ,úœS53Rè“át÷Àe{»^ôj¼Ð\ØŠ,Mx²¿Ãóp×'Ýe;44Ê,X4·ÅL\Ø¢ÚLÙ¤cr€dÂfƒîzEK„L¶¥ ˜í‘µŸ,q°MŸ1œ>ÙÈoô“¸L‘ŽÐn÷T¶ÉÓØÍ§kå…t ¼¤%Ê®îìdʸ]À*¦°gŠ’h„5Lw,%[G cÌäêë¡VKeÀ¸8ƒ®ÌÊLsƒÅnz3;°ššÜôþòsôIßYv¯xi“üÇ×C/3³¶ñ¨W’«Öo¡&î$9¢97²1vÛ’z ¶ÛÃ/re}öiº˜^ïÓç'—q§Q™ìw—1ÞãËæ÷C‹Äïdþ]Lïëÿ±;_¦^èçsÙ¦?ûl´ÿzç›ùËüÞάο¿{¿óÄ´éõ1ƒ¿ßÓÈ?ß¼nÎß_þ¥Ó™îÑžöjHèºûÌúÎ~ÿ{õ 2ŽoÃó—A§|XÜ ®§=/ûDi &ÐD¦m¥% ¨ÁD¤”ÖÔjœqL¸¸=°˜´PÃŽˆRé Vì`<2Én)%~+,¤a B¥S mü©@!P’h(,âð!ðâ6ßš™×ƒDo”2j8Êí´w6]@4,lQÖ¡…’®27&3 &_áWúZCLg¼7xÁOæ§î2Íàê,0BPÐÀ¬£Å)˜Ó„[ÿ¢4ˆðuK€Ìbó@˜#ˆBúL¦¨@ví»×JÖ­éH/޾ô}ªG½üsÿúðßù[ÿkÛøòîøûûËÿýëOþoŸêŸþoïÿ±úúöׯÿº}\ÿ»õþˆ××öqü»Ÿ?Ÿþý|ÛòøìsŒcÌgæÁ6~Šõ«ïxïÓ¼ûÖ8rÌŽ¹÷ÀŽé½F¯¤ÁµÃØÌÕK©‚oyl“å*¬p$†YN ö£ê÷´ßa• ñ2ÊÌÑÇÀ>gAf[(I RÙæÆ1LSå(GS[@Ò†n#bb5T–ÓÐ¥”:r *R ja5 #“¶&5éÀ@ z<áÂîCAä² bŠB7°O:]¤iu[#`&¿Õ5ãÝÆÐ5ê÷é¿Çã1‚ËÏpçÓÜÚÎknð)dNä$깂g_=„ Áù^BHn«m´z„ ÀHãHÌJ¦oìGÎúd¦r ÖÝqkø“§¤è+-|æ 1À}#ÃÇî±MÆj›ƒY”ç%?ù‚9ñýÈ#ïn&’Liá äâ»KBñ„A q¸üdž0:£§£’PÈ·¥†ä``0ÂO 0RO”äÀl~‚€»·!™>—â© 7@˜X6`Ö/ŒS£¾$’ïnîšá€‰œõAŸA &LKê"¼çÃWŽ9Ó™g—&;8Âw•Ì=†äg`ò³>€¬zD}¹@ Ít±Õ&‹aP9Ój0È yÅ>|#º‰HP›Ïäé@1ͧï x$ò3N&Ÿïû°%À‰ZD¢>×)ˆÓÉÈIä /•t[µí…MÖt8%‘ÆO Kî‹9˜õ\v¹åP¬ÞD‰z÷·2+_^ïŸÖʃ¾þþγݓy{–ó:¹üúøÕó¯ìc¶ß?诜×?ÊmÇsÝïÎóFžo…7óÇï=¿¾í¿ß|ÿÕì~O~>»ýtˆ‡vö›Q9Cd5ºŠU?/ÚIÓeÞgý¸é«,d샦%äU³Ù²{:`ÍÙºè(ôFNk"ñƒ¶HIˆŸ}¿öãÔÛÎz!d¨œpQkúºîã¹Çȳû…DA©‰ºBMU”»Áû,ßK?D©{?5w#šé\[Ͼ~Æú i¨l"€â¢…Š NÒ¦]ݺMÓP?¯ ¤‹¹[*PéÄÝJ-³…g»ÀÔRãþúã(Ô(E—ùœ'éÇ·Õ‚ýñSà­ããÿ`‚9»ž¨3æûv ª‡ ¯3E­aõþ|öÏÏ3~ò³¦î½ûžÿñ\7VÈßB€ùkè_ó%¸ÿš¯¿åü5ç¯!0†Ñ8¯ì#÷drX>7<À#¾ÀKÓ{b ªø–ÛEWný1E¿½ÁÍЪÃo0W^ó¸2›VO¶è½E}D-Þsan4ŸÞ¼ñóΞ}þÛ›ÿî¿Gÿî¿£ÿîðÿ#y§ånæÏö%d!7.r¡¿~HNh’-EDï«^±hDÚã^åÖøÆYï»çѦ`áj¹õ”4k7f=åÜ…&N+Þ½^ëCyíçÛéëþÿÍÉvºŸuu›·á·þÑlùîvK¿öÿ¹X(ÀÑ6xìåÑÀAÞ F¸GuE︟2A•Rí;´Çav³”naNu*ÖTUÄ1©1ÇÅöÿŸ&a#ˆ[…A¸@sTpT«îÉñ¬`§•je»…µM±øÏ§ª<¦Q_% ¨„bP@àÀ—(B¨Œtt 9‹ßœÙkÿ_Uþvù/£q;³7v6Ä3&n½Ø7éÿ£ÿCzÿû ¨Ðô'j§?H°‹t1¨žGqE^¯ýñ™©tÜ#X‹Oùßåí¤ïüxíü—öåÉÏ~>,kî‹v’ýÂ3]‚!FÅüƒòŠHµË¯t-ôM²ÖOáTê©IJÎ>ãê7ëõ¯½ßúh?ùð–çæõ|ù¥ÑO¿ìNÒ9wß{<¥4Oé¶’ëÙ]bþk;÷~õzÌù]”^CúÿçñuÉù§³Kæj"̲[1íýÞc÷Gïþx%•ûêðGôM=/ÍïN=H`*‰Æ9ñÎÛ×ÇõuòTcX¯¼6¹Ã×yýbìÙÛû:Ë·FÍœ´0PÛX =¨Æ­bœ£ƒ…´ KHij†(° fö}κ ª*Z4Ÿ  €x–ãVzå>û‹cQZ„D(Ô²¶ûI;þûÒSU;†_Gp¯¿×®¯YGjfwe÷9þÌË©¦³ÿ³ÛÞ'~}ëœáYþy%Kg‹ds²Ð{Ôž³|û›týÒ”M×!Ÿ VGÎ ›°3¾J•ÙfAkn-KËä¯Þ}«m_€_ß1/CÚ"¨!"Fž¤™®ÛNJ•8þGˆ~pb«/Èé™l-‚´Ò!íÀ²Š$Ô„díM奙¬‡Œ/´wU†Ó2¯‰+HÒ?/5Í‘º#—…sÓúkÿ¢Å¿ÐÅßÊúÛ€¿åü_*Ý`\kìC½Ÿu[=ê?þóüg§û_tO çwªVþŽ!B<¢Ï?¬¦ŽˆIî˽›Û÷-цÜÞÉ_-Ïß–ñÑýß½ç÷›½®ÑÐÍ~xöf&å~Vo(G¨¥º)°õÛå¼ø–m7Øê#ÔÙ*¬y%FWùü¦çÞÑ¿6?Å]÷׫ê–æï£ú; Ÿ=¥—†m–€@ùK£&ë¡3Á™VjÛ!Õ´Ýó赉οô?Þ™ó"(× §yÆŸNjöö:ýÇ è£1Ù§^ çþ§·{ ÚÚ0Š1Þ™" 2IÊ=îfª®#>íóìgܱ± 564WÈË›ú$ØœÜfƒTWÇ-Ø®Ó2b8 yúZÎR~E›( zYGy°¸/)5GQ·tQ¦fõަËÌcÕ'•+àHJà&Jä6†=£ ¢@(B=›¦2ÈX$“Œ3¸ Û ¨h4#§É°BP †0­ C¤ Å`¤e=¡¡”Q°4R`H[1D0 „ É'2a¿‡[¤8m!ƒÐ° À`@DE(E   PR¬á$Ø‚8IH ˜ A–G€ÒÁŽH‹¡Q”G¼‘D2Pˆ@ H& Q„i–¥(2:!q@@D86ÂHI ©!â,‹ ±Na A(ÔB„™˜`ŠrÊÒNžžÂÊv2  lhS/Š’!<P `lBPDQ&"⥉b•È’N6„Xm—ßrHF’ˆà6 €†¦Uv€²œ./éPP·ÈrÀ…˜®/æ{kDô'}ª nQGÊüåûkàôq¾Û©»ƒ­ÆŒ¨O’æM6eä¿,‡­úç5Y±íž*Z ûKMËO"¦$Që<”$ƒ\´A´{£1:¦ELÖB³)¤Sfè@SG#fj (’B‚ÿÿs"¤‘0†áahA©TB%%iBœèØÕ>¤¬=QX K2dH ¤0p EHP`#xÄ@ 2 Æ ¢PŒDT—$­F¦BA„T0æ4,ºgsÙ° 6à‚ 6d› `&m  \PL fËAJBhÌÔ’© HÁ `'~wû4" j   À@ €š@ɺ 4­Ê@@ˆ€` # ” ¡25QÈ €Ž€¨MMJv¡(!tªì{placuæ”k¬¥Æ.þëB%ûëålèAÏtV|Ÿ¨U=ŒUeÿ“øSô@ÞŒ‡ITÙ‡h4Œ!ŸªHG…`œN‰¡’P±…e°YÚ¸h‘*7ޤVF¥)D- ´¡$Õ<‚5¬%⪫gôDA5Ô@PJ€J´€DŠäH#8Pµ(‚WŒÇY¨ƒ˜;HA…‚ÙðTÚ-Ùû( (¡QiF"¡4Éc1iD²1DH«±2•Š "±+ܨÍPE 1iî@œáX€im·Lt²IªMH••jzM\R1 PËh%‚5ôesÁ%™¢¥ Åàä]k]jlœ€˜-<V!mQO5ö×W m•L6À$K½bލ_IÛâm‹}û9|+†ŸíÏMÏ\uE˜‹W§µ•, r6¹_.&K®þäNÀñòfËdA£ö²Ø¡h³±1VJ[¢H€.|B@öe+Jò³Ï%& ~UÚ'L?œ€d`hAê@ð!ˆ'Æ‚Á)E‰ù¹„&¤r–㹘K–YNN‘H>ùR‰‚aæÁñ=þúÄþtòˆÅNÁE ðÇé0d%”\`„‚‹ ?©'A€€(` 8?F‘À}$8˜ §W€l˜¤ÎÏ‚@—Ïñšx ʼn›‚O:ás2"'A@(1¿è19ŸÀ'¥lø|(INLÄ—¾ À—y‹È/­k¨¬Y¨€0h@… #ÁhˆP-¬PXÉÌ@U#H¡BE¡ÂBˆ@DÃ"* Ì¸~B=H  @@0¬D·AÁlȪŸpFkºb&èB Bm !ƒ@2!\°n°`²– „˜)X0@Bü~s@Í$…¨`¸„K  @€`.A ®1Q„ @!À°b ¶`‚)XJ¸„ ”,³i$¨P 1U°=‚(f€LB \¢mòµš :l?²®1Ëê;>Úo(®õöEªh”«*Á´$ãX@ÄјÂ~]ƒ±%ar&ÚG†Í‰5MµªWSéyÎ5÷†”¨Èé½^ïdÔÌK]=Žölg™%>ÉK7Ò×IU"Ì7æ34P>`9UI  gî}RJˆ=”Z‘\ÀÙm¯%^Äô²EŸ‡«£î^öH˜‚%æmŸÏï"a«†‚ŒÆ§.¦‚ýZOjžÊz­ò&|™u¾Ÿ÷}/Ó^…O?[XËO6ÿ¤ÕÏŽãÂ_«úâÑe^ûoœý?zõý·qÿx\ÂWÌ_Cÿ Žf÷zg®*ª®r7kxG\1áþ6pÿ¥±‚ŸçùkVWí½=)¯æT_á~œ´Ý¡@6ªú¢úRRìxµˆ'ÌÀ ‡ê+%Z±÷ÒÿœýÇÿ6þÿåòV¿|Ä?‡æo1n¸½½ã¿þ¾bêA£&Y ŠíúóÖç,ï Ýê½~ë['¾ë 4˜Ç9¸A¬€o‹áÀ]+–…å{OÇhL¥™!‹ÁVm£Aóf¥]íΓ†¹Ë³ÀGOªÖ§…δºÜï»é•ûAE‚< OÕ•§WÀi|¼*­S®da*È“1ÈaCžYÑE*B%$8ˆCk0RYKƒ×,j㔆°”£v ½C¸NY$*Z¹Ž*bî..•éÑq a_A¢Œ5!HæÝ4M»Fþ·›9ã‰d…¦§i¥̃*WœéoWö:‹·‘ÿ¯xðÚŒÿûŸäÿ÷UK~ww~¨Ú+êîwý5#â¿»õ:kñ”Zi¢¯Óí¿éx;ûõjþòLu·®Uj¶Hò¾ZßìgìÄMmpJÅ9½Î8ßÿÀ³9±çŒ9üõÏ‹ë0îPzÇ‚ëVë“ë¼ñõvöWþôÃ^gÜóÞEx­—ù.ÏÌ÷ú·á¶o÷uÍs&•îµC~‚ùËC^óü“>½Ô|I^ÓþI{ÿÅsÈ?]ðm7^%Ã`¼»ìô¶ˆ¢ÕÛ»GqHTÿ:ò³CIêwRC¼2HÒu†ïÉ~È}ÝðÎ6%NwË]%Ú—3î×}¬†çál¸ ÙpíoB)Ù™B‚Áq4…B SšùñD«áô ŠÏnjMeXçlçÁ&:­… , ±!¾]>)OÖ¥d+‰Í (ûGÓçMG› çÐjHçsüìûª–;÷äÕ%3îQƽÜ®üç2ÁOøªÈ2”Ä_Ž xbŸøBÍõw ÍE'0äÈÑ0kâ‘[>¶f‘=>h Ð~}Ö®Ž~ðpùfõúU†WJlyÀ™¯ƒÃæWÇÏwJ_ùçßÏç¯ã¾›àpBtEꆢ®6 ȸˆ¼¦²zQç2EhZ–0wã×2¾†ŒbQƒz+7…AGªàÃJ]rÉòš‹•«¡UÒœX•U+ùŽZ@2D{ïþ¦ÿdš= ^(V0r&ˆ ¡A‚¦œ? axAÄDÀ‹AÖŠ=Ð6 šîsCN^Y>ÊGI“A„¢™Z`¡erÓ”©fW"00 !£!€PP IAÀPT–pÁP€„  LH‚'0„e¢Ò”1€ …T¢€‚Æ!@"RRT12ÀEC"Š$¢”=$€.p— z @ <$lÀ zÈphZP0t‡…a²=ƒdh§ÓjsVШG‚6´€   áéXKÀ„p¤å®Ñ5ÓVL¾D„ ‘¢6´)‚A0X € HÑ$0R’²”¨˜QŒh$µt¶¤”[¹˜Å†’F°„EˆD" P(ù³²¶ØÿÄñgé/úýi­:»wùûR–x(IlA™ª‡%ºhJËH¶ª^0Ö %*¤d-aY $T„B‚LˆDf`¡á˜ŽšÑ %U ¡É@UJQdnÛ·þ Û*ƒgôÅôÇgÑ®ë§- ƒmþfn5Š—ÔŶÎÕN„‰¤^eÂ3lÍi‰OüŒŸßް÷çñ5_yq:Úh0ËM™köj!Éu×¶ë &S ´]ÙƒˆF˜‰…_l‚L.$ ä„ ~: &V ÎÏi}Ó&R üq›$zÖaSOy)ræ6‹Æ!ð½âËb&f” ŽTAÉg½dùÔ†"ˆ Q&Š83sT[í¥|ºùÏKyY¾½?ÀEÁBŠ6qÀ°6õ¡ä‚ñÇÉÿ¡ ä¢àD~ÖûÉ/@@€©€(9ùê ?› *$Ɇ$1¯3" Ø?C&êSTÏ—‰"¡}E$þ®à¢û/hK~ÈÈö¥“á§GÁÀ¾ÜÍÑá€0ÊF[R˜ hÉÈW †Ì ãtØ5ž-B&NP°EC04U¤÷/þþ/4À¨¦d!€ø“ a‚…L0 ¼€*H 5€ƒÀAÀ(Y $,‚!P0Ò—?ÅB6°€‚† 3W üÉ´3 0[‚ ² €d-b Ô€f1 ¤\ìv5Ø<',&Bµ¹ *Q¦Y„ƒa 4L{—žÊ•ë±r ƒ0•‘ÚVy¥£ìF‰C׎ÙÃŦŠ=“oì.i‡•5õ™ÝéÛùv¯‹ä¯é(— +å•“¢m6çgjýÒ(ØŒÀ^„A.Mêhu;³Q …ÐâŠô€q ¶B®3¦ÖOÜ!‡½Þ äó:¨Ï«='¾Ïƒûï×꼫Ó"=c23wë’3Y_w÷€#@|ÏÀ? ÀH¶½˜§]Ý·>š‘ŠBdªÑàê†IXPd_ëƒ# ÚŽâä2ö»}øKa IE`ð 2.=t l1c€0<¸•ŠsÑÀ ¨1Î l®ÿõ‡ý†l 5=57‡Hu¤‚Ý LªlCàñçÆ¸’ÝóøðÒÅpä6·ÚŽÎ‘»ëo={ÞL _‹¼fܳ¸”ÿQýk›KbÿÊ}þ&ò×,¸@À˜/à%áüUö…m8ßõ—kŸ/î—à#\Á ¬ø%¸ƒz¦çô³vÎïÇ¿Ã=v0nˆ«­b4¹S¾K )\F­J×âcȶ^)™4{­m¥¡™lò^ù=ÞµÚ^cëÏšÈ.¾ºý¥f~ Š¬ÙCjOoÃ7¥ŽžO?ï ÁÕuº9W™õ[ôÁv î:W¬!| …Î7 AAýäÆm/˜¿÷{ì[s”u©,ðYò¾¸¿Ff&ˆ’ƒá7ÛÅŠrd°£FÕ¨f[DzÐ6õôê}”7)´•wÔbµÊĉjG(d+xÄ’ˆ#—f[iÔª  ¨‚$¨´!y‚UçeL¬™DK÷D Eìa8FXB”¶±ìy•(••(蔩ÑxÐùÇ?HúÂ>¿]³–Fwë ¤Ì¼1 H j@ÇèØô„¸“½…ºM*¦nà{ìý¥ù'’“ïß·åóiÞÛ§†3ÛO»ûsnxB϶¾Ýç.Äá%w¹øëÌ2ã~~ò»Å'“õu|˜98l?­ ;™ã¯ þ×wý{Íñ×ïûæpäNf qwôâÈ1»([m|Þ˜óÖ/ëÓsž¬ÿò÷;÷9|­Û\ºÉ×}ç×¼øCÕ÷Ëãä1Ë#¾ÆE£þ6ç/ÂìÁÙ¯6·2I;#FÝ}k0GÑé+"£fC"ˆJ¡#ü±Ìéìêi³%OÉåŠTqëZŒ<"UŒû+Ùęޒ:EùŸäq€ÇÜ÷ô‹æ UãV¢vE¦²´•ºD7"¥Oc¦"ü‚™ä´¹zš}Þןð¯{þ’ý³îqsÐÖF õ úß‘7~ýâùoNÙôs3„ï°mÜ@T¶†¿uQ­Þ(K2he¿R·Ë¯¿ÛÞº®ý\Ùå„Þ¯ö¶MmG¤¦reƒâ~A+‘e]R ³Ä¥ín¶—£3Ó+wïóöÈû»sþë®ñÿåÖÿ´î+ó/º=³M|Žã^w:ÇöãîUKÿ'~}µÈÿð->÷ÕŸ²äÕ2©zv;?j-ªÁù;…Sf•\BŽÔ}–/¦Øƒ¢üH2‚`Ýì²^ñ2úÝ»÷´pB¯¼¼Ô…ã …hH±MüIºˆGÓ‰˜@5C´!ÇH/.Z؉rBé"Ë*^8»YõnŽ{r¯Øt~€L >>Ò‘§ks^˼K»Jûž,&À "/xæ‹sSÑnjW@\5(‘#¹ED5)NP˜ˆÑA' ó ¨F¹4lÁ}®µš¨k-3¢F·¦Ùš›_Ì[”»1¸Ñ%X³ÂEm]¤oä1Vè…†HÑ1›©òÖâëµYš ™^•‡’5¡Ì®²ƒP)d|Ì›1®åÕaÍ„D£Aq{xŒ;G0†a) Tœ,.n…OùËö5€,&ÞX9X)'6Iˆ[Ë)æd#rl]00V 4{Z‹HðGí>xØ®L-,“n[µ A8D‘ ¤³`s’(ƒ€ˆ!M *’€2 ‡ ¥ƒ8ÀA(@Ñ”!0¤@œ† €©DÂÀ‚N(@èÌ$D5• J1p¤3UV˜BdG!©"Ф%(Ä „Фi¢fr‚KZЇ8d4Àh fÂ*-Ù´C%h € <  „„&ÜDƒè6 lt`ïcã+;®*†Š6*„¡_é*ƒš|øQG«-x~Lcý >ùŠIU€ÛÐE, hLÊ‘P(ËÝ 0½¾PÊ¢<&A °Fm»nC[ÈÐ—ĶƒbºÊÉyMŠ i”´áÕ†«$ï?wëƒCG(Ä€ 0¤%¬Bfb„bê‘ŠÄ {¾ N‘ZÖD(áP èDrfpT@FXKIA ÐÖ†(K[ŠFX8@’AH%Œ’^˜DŽP)Ä)‘(b E`ŒT#A«–Âr‰.ª«2Bp„k¤ærQ ‚Ãt„Be¬Ä¢™YÐ ¸A;A(`w,$AD»,ÓrYh7Ð4\’‚´”&0´¡"qn…€h2Ú2V6‘JÈh±`€”€*ÑD&|ˆ &*B%—’@‰€hå UP@8”’Q"öI«ÍÙ0Ny"#§"ƒÏg”9.Q5‰qoc;oóe¯1O£pp*¹èЬ“OÀ(æËë¬,VÚÖ±–vá„GÏ9óDà¥^u * ø8Z jê¡‘) ’DâB±‘È5÷jŠU9ÎHN²Rͦi¯z&28ùp¨1Éöb9C§±¿&ªmÇõ±ÏÈ(vØä†Ó Øù™ïÁh†ðªãá>qŠò.h  S?tqr€ø*|ÁD`~Z%WŸ¬‘¹ `ŠO Jì84ðËð‚g6þ)© óÓiølêÍ/_ü§†I€ø2'‚Ñ®™vȨM%&™ä85rŒF¤£!ˆ!1¬¨ˆB4UT@!@EÀ €¿ˆ ¼ذ0ÉhŠñuÀB†Y V@€Ù,…°d’ °×LAƒ @õ“E*XÄp ?u½jd a([4QÉS ,á`!f,Ùi Y ,hô°A^¹7÷)™-V<«ˆa` †¦ƒUVß:·Ê–*Ñö÷®1½ÊÎÕ®kÉ^íã<ïÙ-a+ÇÏGûý·ÿqæ·Û~ãô½µúw+7þÅùëS›¯÷ 8…lm^š¯±O”éÞVç2æ9ýù¤=¡×¢Þ,`%~n–ÄrÄ¢”b†Ä•–¹ Xî¹Ûs$*c!–*Ä,D™vªÉ5دþ¼Í×ΙëÒ ]²^zÍqIH$îjï!b†"AàûÃö BEÖ%]0 ‡Ú³l—#ˆQ8‰œ¥` ?’rÌq!3×tOï*a¦h«X|ìyG\éÕëàØý+ ER/CnŠ}@escäôÆèýw;øÚÀLHG™›ŽIÒdiµ¥Â!–Õ #?}ïùÍ‹ü²øqŽ’Óêø|U=¶×c÷ºCü•aæÜ÷mêQw^æKþåpþçá@ïàÿꯀ¿‚[ðü¼þ*¨Nj|/ý×?ÿæñÍ×Ï·øWÜp@ÄŠü<ǘßéó2¿gºk~2@BœPÒXdVÒØŠf›Þ.T#†Ðmwõ‚=f°Â(5©a'ÇE{°}A™1̶œ\Í'røÆoñü~ó¿\?;ûçÑý±IvÏïA®Ñ;loOtæâÎütçªZ´dÜoåªÊûMýi `mYÚ‡²A¯ô‡R0’eŠl蚊lSŸpusZ1g¨fKIV9¤VaêUí©;ÒHE©˜Ta\È¥ÚF.n]å¬p¢ÊT›FÕTP20ƒ *Ò(Œ¢ŽJRÐäQ_u)§XËÂ!–ÎB:¦°Aˆ0+h€ˆ£:b5„Õké¥Úr¶‡Õ¶îJý¶ÄCÞåCÛÐ^UŽÏ s½F›Â¨E•Âd(!+¹  ¸þ„+’KÊHè—ŠÉ;ùxâ{ÿ8Û_~¬Ñ²mØ3›¾4·ñ%({±÷áS{ãÚmpóËëVgô™åûﯷ»® û¡þ<=†Ê¹l ‡fŽ.V‚kñæäû1|o$Ô@Sck»¹|ft?JyîÍÇÝOžúô¿nñøù1ô!Íìþ1"÷?õóöOçßÛûü£Ã°x™‰_ŠžÛh9€­–ºJdÓ®»Ö®Þ˜„ð…Ì·OÅ-F25òN¶E}$Û=Ϻ‚•™ öµûu•ÅlÝ,J‹.“M¯w¸ŽžÈò¤9èz?n·“Õ-ŠÄª*Ø"ž¹é‰X4EžžÅîcL}‘Uó_mä,lyraªrãF2ŒãYð-~Ê«ÈW'‹XŽŸöA”È´]Æ_eÛý¦»H”úAü@2IB0tjó^W½ÎNù)¿“-•~çÓ_¨v„>?ʯ—3‰^„Ó÷{=à°4´F¢ŠÜNÍ ¶*Ñ•Q>€M‘0KGZDUPÖ$eãÈ:ã†ä^gÍ`_A³W…ÕE(öêý_M–k¶„n+»lkXâio{¯^MÚ°-$ýÁùZWè9æ~U½ ¶¥õ4ÿà´A£¦]M#ëìüƒÇÂÙb`Çf‘Àl¢uÉ'žÒ0á¾+d”™uÎîˆØošÈD¾ç41CQaâ×¥ü#ö×xÇy{{ëršÍnÒÅgÉ8*úêÍ¿™MÞòÎ’ú °ïU‹ýñ&ºì{;kñ—#Jê½æªúQæw¤Æ‰*©,Þm?²¯|û¥ Ǧš>}[øo’˜‰Æ´P¤ul¾5** ”PP Ú#[,5–.²ä¨(Bè ×AùÊ‘ôî Þ]Óùr(ª@dHiÈð\…Æð„ḱ$Jéý8Q¾¶„0Á%J¹ÙЈÃRÖšöPŸº"® ,hmŽ™ºe@W!¹Æ£ƒbR{“ó|:kcÂãÅdõž>îèøÜ;50U`(K[#4 EÃô’H1ñ*¼[¥ŽÆ _¦æ%C  šèö©Iñ(§`T•Õt•—$ â‡ÀDEC¯–BÔ–¨³…kÂpÄžCÇ¡kbAHªB³]jhDqgL]X/Õµ«;eŸr4Êçýlêaf„#[ntLåjŒj&E‚Pwä0Z°"«Ã-5¯VìŒ*gÕ@ FÑùj«›áJǺ»A Ybí”!}ûMÚéGÈdbBk„¥z´i/rR²Î_ŸÞù²ÁÈ*ö9‡hÂç<÷¿QkëÃ&/e­µ%f‹ ;²Œ=>çT’­5G¶r±Äü%Ïño 7lüã¢Ïõ¼^ÕmbL¼ñå~Ùzs믶Ìô˼a×á;OmF“3–ùT!Ûâ|ºÊ’.¯ïvs'˜VVWsARò¤É2XHC0‡™Á"«€3hK,2ò”sÅ’)¨øbûÃA?w3·Š,ã+^ê ­ÚháªäÏ¢èû^úª«e¾Ì‹”°2XŸÊÁá„–õ<öÖ~é傉°SHS¢ Á¾§B ÈùDè¢EH{(*öÔ uÓ2ný±=»´¾Í¢6vÀáI N•Bâ<çWB°/Ô a0@À°·ÏžH>u*ù0 & òe´'‘"ÀPpðñyKOtÃ'-r*?¬ üôN€¯ú¾ñà˜ûTi¦ |N½TPa¤#ªFª F-0X¨ @2sÝc‚BEÂÕH- ‚Š5šUT¨ˆPE€ÔY;<°`àŸÐ ‡K`Á40 Ä 0ˆ0 €5@@ l@Áb&ÐhGßìó B` KÂm„ÌIhƒÅO3“´BÑ ƒ°Û)ä$ƒ7¨a‚4 ÷(Šæ!jŠ dÒ@2 0À @ V!ðé¼`zŒ…b˜ÇËxBßk#Â÷ãGŲQ«TÀ0”°Â¡GeCOD_Ûe±6öE,š?š¢ÜQ-׺¡x`—2Šû¦ j€çÅ»¹¶•ÁKÕh– ¯Cþ@½­ñMÖ=œORñÂ"D#J4¦7çË¿a^V/»ß*ÎÊ®0Sµ7›Í“L|r €`‚­ ¡çÍÁáù<ð·jɰs wHduÙg °¥[Tý’páA«Ï¦¶]Š$ìØ%1D ÐWå™=¦ø€v =¼”—«º«Ú|®“;.ÜnßLI“˜ er©!?Xg`Fõ¶±“,cú¡G€€ˆ”¢r) ˆ[ùÝÍša]çà ÿ|ó¸ÏŽ?*j0Û„ò†‚ä›5.Ÿ¼ÿÿu¾¢˜ éâ(gwõ»mV8æ54D˜¶ŠB9^Š?¼¹ædu˜9xÖî3šžë×ûƒ¿>â|¼úç7÷ ãöçß6¿üOåÐüàÝû¯‡ëoÚÿ•ðü ®¿‚û¯ðÇßàü5.jçÐ9ï][GPšfzñåx`1Áˆ—È­;|1qôOòŸÕ,V´6–^‘„»ÔeQ%Ø@ã´Í8tIÑ.O˜™Z›QÎ^“2/ÑÀhûpwã~hõ8˜ýuýÊìÏHþâµÿìºÜ«¿<ü¯ wHƒ0ê7—ï,ÞÁú5ä°º[}¾ù;$ƒú àËÑÊ^—¡=Öä£{TÇý.ºR ³ÆÈÆn›»øhÎëì@)Ò‰-Ug•• @¡v4KEÔktrÜôˆB!LX„bvÔ! „ ޤ”ˆ4ª» âÖA Š!T„É ‰à-³ö‘pv8-«"–ÂÄWT³¡T¨˜`A`„а=Ç‹ä A¶´U__ºö÷|PR3ç~¿ð3š½“ZF«Ï#?G„>·!‚Í4¤HѨ€œêUÎíÏ ýÙáó(=Z‹D?É Õáðåm|k_ç}ÿˆ¯n¾Ýôž*×XF²§:ÁvkæzþÁ³çÔ}ïZY~œdªÏ[ÿqJ.É"¸}O§'oŠòabÕ/ª=ô—î÷p‚Ý1݈‡_Ö×|ôv÷hÏ/m¯m¼¿ýúqె·.vãûàñ×?òýÉïíÿâìó}åÔ…e«B§"‹¢«õÔÊÔ6´US^?4i®DRîŠëñQ@!8-:™´ -¶ØD’zÌ%¡k›8Jg6IÇXp2F¡:F˜·×ί±œ¿yP3{׺,¹ŠA( Q÷­FÃè2Í Úæ#Ì\Ùsü¾toö“5Å”aô1„äué@á™Vzî `³1XPZUs:"Å4›N Fh¡ˆreD5­úpý™[H\{[«ÔP%f['†ñ&÷"teøÌâÑøC\‰Hþ²h±R¸¡%ZCÐ…ïYŒ"MrëÐý[žÍ…9¦7ª[A±ç¤xF¨€ˆ¡&|DÍ’$DK•Mêù˜³\Ô[gõ:¶Õ@|ãèâ.9‘ÕLR_Vh†€C€Þ)R\rp¸GPý©®5f~¡^yH‚"Cu9²FdyEÄ ;Wv¦Ã Ñyà~³0uÓ2´°!†Öߣj!5"y€ê땚¶bÊ_ëh´Î|pÑ Yv®e–q3ÕMF#}Íî×S½ûÒ¹m¶æ4 0uÕO~לI~\Í(™É˜íVwÇÞ©¹C4=ô+dÙˆÐfuwÔ²¾næÓ±J:Éù¾“Ÿ:uÉÂÈI’KYt“…[3S+ÌDžÔ"KõkäI\å†çàÉÒ~Æóòu¼1½yf´氭Ô}çÐ6qn3V}êÐó°„`fZ |Ó«Á™„¼xÙØªÉ‹D†0 "cŒ„d+Šm£_Ç¢ˆM: )Ç(ÒjšÝµ.Ù›yRÓP3}&Ñ*ÚçÁúÄr $Р q¬¤Ë(Ó·6Zç]]`¡¯ÇòˆÈõÒáˆù"h33#HÍ4 ¨ÅÜð«×/[ï͵"¦£„ ±€ ™+Œ1… âX€%¨ (i,%Œ4cNLÑ6]4D%DC¡A‰T¨\ÐB¢IŠÎØ”(tAÑX¡8C‰"¥   BˆC‚€˜Ã1- ‚^Š @9KÈÖ]ã€/#<ˆs9èMO€ãq\Œ¹}Àa¸“a(p&U·Û9Æ€k¹—‹‹CÖÞ(„l(ø=É3fp¤rGÕŒ›h¢£x˜ÌbfŸBòŒªÈC•zhÉU zèù+P‡Õc!8 åÏØ?±R%´L*—v\„va4“ž–‚!ò”äš hD2¬f»l p¨Ä„Æ„Bd´Ü‹[&·³týWÃ_¼–ýÀQrÈSF@´Å´eœ 3‰’Ï3ǘ1?‘µZ¹ë‚Ò*–í Z`2:±JO•³]ä1U“}Á´A› ÛDY¤‡ á^jp± qvÝnÚåN’Û%¡'añ(`°å–Cd(¤Òqˆý@”XÕQ!¦GX®–ë®ê¤PÎላ¤­v›9£ †T1È“Py­Ô¬ ÍZYnæ1ZE…‚Ö£‡ŠømDhîæ³11! €§gþ¸=5ðìËï½ñÊzÈħÀVi|ßõÐmÛ{7[^¥ |­¶<Ç(Û/Ý,~yüþŸµz!™{ÞBF¹››ëqo|Ú´‡÷ß“„±Ü…r9œ[µæ¬©ªâ[ Ò¦[r§v@,Qƾmnj©}ûÑLëš»Ø0 ,Y0Ï|¹K\TÄÄÌt9Î5l4û=V¯0OÂà£@†o7ȇ³âìÕûQ³@fžæk;ÉJn½õ!ÔËaÔ¶À †@6¥2fܘõ幦WÔR«H&uSrAöU†R'^(J]ôÀ Éþ "ã+â$áL }êø+ņîü "ZDîc³mˆÏKá J+>ˆ 5ß  L… É Ã‚|CLB‚x|‚!aÀ©¢A’_ü‚¨ÀlC‡Éç%„_jP$>Gvñs 9ÉJίsý09•Ÿ‰öµ^ñÅÏaDd„F£áhh``x'*\v㌊µ„@8 „B@ —Ä@@…ëÑäF-hPÿd€ÿkª~‚D€¥QÁ†?EMƒIX³€!f˜`Xl_ª­BëÀYn·a3;ÛZíÇ“‹s{€C¶‚kÈjQWÚ¶‰|Ô„E,0p0P™ fÂjSuƒkWœ@øM‹§ŸÜ$”°]"¼)½¬û÷Ç ˜õÈq 5,Sƒj ° \áȨnŠ2&¸Yë ßÛ[­®,gNñx·žÇ«¯R$ Ð@µ»¾ß?Nrž€ß°ßœN¤øÛ¸D\Èy–±ÝÎýl;ó” ¹›*'§\K9ô}u¯5‘År·—Ɉ^dáØ‘OÔ=ˉ2ö¢¢¯}œƒuª~ÎÀA$X‰,ç–;”b¯'–”ìeºÏù®oüðýæsµïñƉ‚ˆbÒÚÎ#½ËÁ<æ_?ªŠÛõÉ˦ˆ ¯’Ïõí¦H3D‘Ãøþ© ¡Ž z¤â¬ŠèL„-CžA«Ž¯h”ÛJBz¡X ï$ËŠîtßnWI–aL*3Vð†•BHù¹ƒ¯Éê­üÛR¿ÒöQâ´¡Ü:‰SŒj~xlÁ··ôÞª§ŽÅ]rMÔè^pûfºÅó¢BØ‘f°kˆ}{ØŸ®ÿêãþpæG½ýüÏ‹(>¼û<©mÜ pˆ_•Þµ×½¼?è¾&ýŸ×ùÇ>@Aÿ F¢2öžo+ÞîìÄ?þý«»è—«¿,÷)ø*P(\èŠòÓòÆ,ªÃÁÿ `ÌJkiÅu±MÛUOZÑH âª@êˆ3\gþT9Œâ £nl[=©—x£‘(znïGô>×çN 7½>þÙËwäþägÈþ¿¶7½¥ºl[ Âĸ;6‚V;]ÿbÓ½4û“²·öHv û¯y_Cù8t<^œ£;”Ô³©à:“’u¥Gdw%˜Û`@ˆ9„,Œí:T@B™c@.JVÈMì˜ bDÙôÈhÐ…ÎÊ(†ÙÂR("„X£–qÚªžÓ..„b¸(Ò€Œ2ЉĄzK`v€x¼Qj“ÊÑèPÈ5tC‰žÛüaæã«‡ÿêß \æŸÿÝ‹ü¦{ù±{ƒÆ©•“Œ½z|[O_ûÁRº®Y½íÅÇy¯ºmn˜ •VŒ†Uº`Û(Þæ¾\=±×Ó!Ÿ3¡Ï~ýéb´77½ñõ6Gâ"âÆÀ)Œ-ë3ã29ýòâî/³|vØÇœ¥î‰ßwµ*W‹jïêìä·í5êÙ™šÅK#QF{Äüè¡¶ªªxXÍ×pÝÏ:·(üÌä- ¯ÇÚYæ– dʳb÷íGë9ôúؽת£e\M•­òõÅ‘…?Ú¼Á9·›/À‰‰Sv,ïåKFqpÍî÷YdëzçÁË`’5ηAÊNËvŽ›êc®ŒïÎö\„›Tí—ù«ÊîÜûÛ}”óu/ðÚ/Ux˜ÚRØ£-È®(C¡¯Gây\·Ö‹ç«¦‡U˜&`I‚'Ç9í4‚e½'ª« Àʆup`frYÄË–Ikf‘¶…<¥G&°‡/å—bF¡;#mAŠ4'‰Óͺ<ñ¼Ê±æQ«SèBãÔýË|ýˆo÷?¾àíÀ0ó@1 (Mª/ÀPU¹¬I‚’Fz7~„™Æ—(æp)‡¨ÝމËU+i¬@þëÞùCb×3„Ã5>ûübâÑ™°Ñ¨#¼¢²IV4 è´+ªÄå , ¶YªàÓ^Ž!¬Ò¶†ˆÊƒftAÊ:¦c8¥#±¹}®J ¡C¢xâN¤CÄJ4Ñú”‚4L#ТõXÆ$ˆL!‘z ¡!H€‹¶ )>6øµÚ+ÌÕš‰Ñ¥à¢0ãÕi‡t ØŠÇDVéÙr™%()FB†T2ǤŠÐ"JŒàœÓE¥cJŽ ¦²8ƒ@ 8 aBP…I G¤eÅ@L¥¤0¨bAPº)H„I ŠˆÄrIŒ„"æ @C-Є3Ñ 5Ô„@H@-ˆCˆ¤…d‘€hÑ€2”#@ Dƒa:À¡ÅöT~¦% @Iu*½ˆ‰ÑhxÓ˜¦ødØó MñËüm-ލ*\Ü+ ¶ìÞM^iÁXÆTΆ†,0, [.¯Sz·cîÇÍDYG)l¾oàSÑmµáœ;`Õ.Kw´å¨™‡ÜSž~=ÏœËdŽJE/er+Xœn Ñé.Ø$wˆ­IÄ”gˆ f3&©BpDHâ€JèÐPD² ‘¤)( B-j¨L5Ñ’!„‰V0ÄJ¨XÀÀ    Œb€ %5¬ID ô^ª¶éÁ@ê-i»©¼Æåç _ìý)C-¸J'¯x…ZVN[¯Ë$ L¬iÓ\Ã1*TàfÊ(° wÛè`›½\/ÐèØ™¶€^ë‘I¢ÌbÖhƒ ݵkŸŸŸÖû·é3¥À·r…fß- Ó®€n˜vúÓ˃>‘€é0:’]n† Ežö4J ¡ ;Ñ´…"2]dÙ ˜B ÕŠZµhÔ«˨h”´Ew¡}_Óel(ŠŠ¤õ¶R MÎÎÅÞUa‘IµàjƬÅß³ø‘ÅT »-˜«pcüÃË(u(ÕkFc«D£$ –i’'md $p!)eÍ dA¡8Q"”€TR%Œ H€,épƳ êÈCØ2B’ÓDãx Te4Á©Ž2‰h¬eœ†vv'oû1M–BÈp‹8Y/u<ÊÒlôÝBúsw¥©ø Kï””¾¨7ÁéÑ8Ry—ÅNóŠKJQ½0Õ@¬HBFö ö…š†—áÐmÍEr¼Ã-úÎ~ EJ¦ŠH™;#ç¬ÙÍ `I±d bNÑéÑ4Ͼ´çQÎYqyôp¬ëºmôçÙ;^²§í–~ÁUVÌrNCŸ{ÙÅãzÂ+Ü>Q>ld[ñ7þö—ôŸ^ÞÆ±$ dl6 )S¶ï…p9ž'¯ÊsMK ’kÑû÷^J„峉$ ”ކBÉaÃvÂ&®úS›t1hë²¶ºhn‘µ¯ÍÊ}_Vèa‹ 0l丮 f>EÖ*4 hÖÀ´®Mämá§_”F¼Ôk@Š˜h àK@$&àHYÑ‘œm4ðÈÛñœþÓ‚¢M ÂKý¦'¡}–ú¹ô“ÔÂU¬üÀDà0IM{q¡`Œ³ ’’DÊ*?=ö¹xÄF6ŠeÉ™‚£O”eŠoû¾×(…A \Øå0ÅŠí‹\ ”ÏE¢A$&ÆWHÀ±Ñà§'A>1˜hH‰ò™˜& ƒò©–Yñ)‰p€ÛÄJN´Ïš¿€ÿ¸L†L:(F(tôΆQ/B R#”XÑÀ ˆ*:†…*(j A•Á–°dàŸ|2 ¬€‹¡‚ à2ÀRÐÕv{¸ »æt³«oÛ‘8ݘ„߯ù>¾ÜÚžãJø}’t‹â¶Z &Fô`ú×ijz‘ßë±’} oПê*s°NF @êÞ•¸ªJµv[½ÙÇìÊöDðšM0q¬ºŸŠÖÛVòÔ3z÷S§…Üã>BúN÷jE~|„“øì1*à}_Ùn±ÏÅÎ׈ßû…$CÄuÏvhŒOXœƒîÕëw#ã.(;HÍ™\^áÚy ÛvÁÐv ”I'vÊ7:@$]ÚíUIFt‡x¶š’SùÖdï‡ØO$š´_+MÙ…öÃâd_[h䑱ëªù¯¯ì9øˆ~'#$B–ãÜÃëDA™âÐø3 ˜^5«Óù:Xw¯½ÚÏŒVbÔk×2UÑ>ÇéCÛ¹¥r5µzþ²™›Ç$T*àCÏŒ[À &1RÝßåfbˆ%É[[€  Ó° ˆ÷Ʋ’Í`d–ÖÞ®‡šþµ(C†-KúiHÓ5ÏÕX³ˆu~Ù÷³3µ×ì׿§Èqþ˜{w;‚«î¢·×U‡Ô¸I3ãã£ë·/ã2Ê«0%d&yà©Ò€’É™ãnéNžzþ¸ ŸóÝ_ò…ÿÒa;šÆâ«T¤Ïä—à“¡û¯~÷_Ô›û§©ºåƒæÓß“ý€Sà×^6KW‰9C×s¬·»¸ºå<ù¯y=¯ÿãþbxœÀ#|™ïÌ„«vŸ„“ˆàB3q„M™)S l|‹ í¸„†PeœåÆVxQ߆é½s‡‘^e«ÜXó¸Õ¾b¯÷ý üü›ÞîÕÓãé,Ÿ^·Z«w ð c¿×‘½#ù ÈNãîy«ÄäàÀw›ùr»ž% 7@… ZuŽbsjš5¶ŠŽ°Ž­Z A{X<‡C Dƒ;y"]…ï"Şɻ+3ša.¬,RŠ ƒS¶‚ŸPP¤\AÅÐCSfu (  DPt0•B…àDÐFE"›,R¥¤ìlfqQ-FiFö&k[ÊÌ÷~9ã_È/N;O÷ÔõÉ<íóEXÈpÁ$4ÂTô@fã™»q¤äÏÍ\*#Í!vf›ÑLÄƪ ábÉj:%|–q³½-EÇ=²ÏÙ}Öþ/¯oÔ-èÄßîêæ–yŒoÂ>ùz’B•½{ ›'ß¾9ohÒ+î¸ýL‚új'n­¾˜¯3O÷»oáP­)9w'ŠäÄ=ÄŸ“+Ž&dÀnÄâ 1Ès­Ã/»Jvdž$GNó-¼¥¸Ú­åûžk… ¶/¬‘ˆ‹x϶câþZ4x«o…GÃÂ]>g± K8´‡vW2ÊMØØ&}¤Œ1‡öF¯¥®Z‰Åо°®xejw‰g¶†â0–Ѓ²2?¥ÍdÉr"1S†”Ê%¥×máx“®?¼ø­gšPÍì€RMa6J%ãŽñP¾¢ ÿBðÊÕDÄ c鵤½©S[*øÎ­9÷.üôúq¾sºí¿Ÿ£¹Ç÷¹Ø‹–pe'{«U„hfmÊÐ,ƒ‘T¡ÜPˆ9°,D­‰‡îL}§´Ê<í#êEƒê бVµ$Gº%Þ³|â€ôÕIT ÐH±õFÜí%yÿPÚ ¹zw^WÉQsûÁ½2˜ 3Æ2Õ”·‹3?žxüÞÍ…>˜~Dj>¬Àæ±Þõ^>²*fP0ÖÁ xV¼ËQjÊ %sàNºÉXQ2—j¢!ê ¼2‡½>ÄÏ /Töäh¼µ:3™Úà'¾>ƒÉõµ —e€v­(æDñeÔùºÒã©*êÈŽ#R2T‡7?“—¿hi)ã’ЕK‹¬“(M*«ÃÑM7mëìôÛÉídçØ¸°"55“_øè3ðJE`ŠÌÀ5c#œJU¯­tí,ƺ#u“,1ia2é¢9ÚéŠ!ëWz®F%]Wgç¶¶ó6E")AQ@ ò¬¯ÄÍæßf¾$‰ˆ …$á'Ô”[:lÉ—°?Ò¡.a PTh¿žýÔÚþ¶{ñÕ{mUuLÍ=M+“'TG»è¡W“V3|ödãPÈiE“b\í cÍX3·¯©>¶k—©+¼¥Û'Å Îf® Î0•Ü+ÖmËÅÜMPº†ªÐIbÑ,q"µ’l„‘„…F Ô:Â1%Œx c”VXd¯j¥JAC y¨€ˆE‘ y`0ºX™hD*K ›^*«R©Ð[Àfi(P²W®(íDÒ‡,òÁ²{|lû›ÇÖé͉PL«ÁTº_ a/bãˆæ ƒ}D§¯PK¨5 )SA•‰xÛC I ˆTCXmˆÇ€FÆ!4WlF „ÀŒ¶ÉUŒ1€‚´‘a IÀ ˆÁ„Å2  €JŠT‚˜ä„@ À¢!—Qy†Š2ÑEHQCÀEÀ  â²OÄ%+à¢=êvÑGÓš)V å`ìÿ~mœ1âC£05›YYi$(9mä<‡›·®æº¥0` (7ÙHè8—¡ÍgïÊ@ÈY«˜”å¡# iÅÌ™·t?½®n ]D˜ ·NÄÙâ¡”R¸¬•ܳ&‰Õ’O,½}a£•VíÏjq´ááA0]÷ÔðÂåèZ ÊA‡Eb4ʳÎþZžÙ¤·a2±â6Ž  PN°NQR1ª@ ´ 5àD3HÖ"„h‚%kQ‹@j(𝅨…BAÈÀ C ˜€C¬D:B ¨Àdöm,okrT+…‚¨Ê.ñ Æ8Ê!0N»¬ÔÈ÷^̼²½æðÜÓ1­Eõd…Pñ~%RÕ¬´U$F V¤Ô䥰¹ñ ,‹ ` Bo8·©`}®ðGÈ㊢Y—*dTŽK²Ì¢h;©ÆƒRjòY*¥Ö‡`[[ÎóyÒê &‹‘9¬£c !y’Ç®ŠTäñÕçÎ8L{se‹<ÊÅ{eM5£0†E’Cå˜l{ÑXDK ߥÊFÕù?LÑÔÈê˽ݤZ(UÕ’’‹+j×ÔßuAؘéöå¼Ô–/ôùâtÖ²éÀl†Û^•¶ùÅA–b³Ó0®T8$Ž+Ð¥¦3bÆœd" )"ÒŒ(a ¦31dW>&¼£ˆ%6ÌRä $å 0ÌD£Qæm¥™ª1ôC%*,Ç"XÉ:‚2` ±Š`Z²¹ÃÙRéËå°ßÏ‚PŠëÍÄŽ±Eej¬›â6¶‡“ «j#L:…bŽ“DH9„•?ÅŸ¤éwjDE†‘&)Þ:Iƒˆ!¢@RÝ_–-]¯Žz!’ÖEm¨x{Oî !j×M¬0àñ).H±…±gyV iJ:DÁþ”èžgÖ;iÓðhiRm\HgÎöÅY‡ÃD½–Çò|ñ‡[´gcnò\R*›U_xʹø:7øZ»æN„"¦™í%’ë©.–FÉÓÚ²–µŒg_}Uɼ$#ZÀÜØûM9SÈÍèBY¾Œ*‰ØvsªœÄ¢ùm³0¼ ëÝó2f‰Q¼[Y`[Ÿ9°êT Y"•¼nû¼·Ñ+²pZÛM™È¹Ú`ÁFµË@$'‹¶Ùh¶LI-™Äe”M-Ïë:ÏY7{hêæ™³XWMÿ|=[ªæ~¹Ÿä“‡+ ¡ Ä>åtp’ÈO$žœHQ'Œ/0l:Uƒn  à¬$|bTHc¸%³RmgCÈ­²Ö .ëS€µ¨T±aßÔœ>º1•mìÓR¬²PËš•jfßgˆ¬¬Ì¦hüšQÀÀä€J‚bã'¨Ü©€†I2¿€üaœpŸ.€À$¾¶ W Y¡‚ b9—˜¾  G­Mâœ,ؼý‚ó¦^@ëN{®¨kP UA°œ½·úPMs×N÷·üoÇ[øö¬wØ7•é-tMïç!?dwRµ <ºîÇA¿O{LØmžáÉfÞ#*…ð>—@/õñÀwëe%dž€ik(4÷ªÌôÉkËÄzH9Ì%ÁleK·§´âjƒEÚòT0!NÞ'“i,ˆX§¢’ sµö ޱDzÛÇwýH¾}ûaFò÷ûÍCË-…‚A.„l†elNÜÞõîeö³ÿóñë?ÖEt´Žm¿Ø|î×küR²æÛß\×”yèJðƒÞíÛª yÌøõ%÷x:úhŠT€€âû^%ðù£ ¹ØFP¥!@†"”9 ‰†Ôú,€ßÓŠJ)1%榢ɗ0j6O”¤Ió™<ÿ¶.y\Ó„±¥ÕÑŽKëü7Ñ¢:ÿõàúc÷ü•‡?̃+¢´Ú…Ë0>i\´ŸM3b—/Y0·t…c†|nãµÛdœö‹ö'{ù‘ÿ¨qÖ!½÷ûùð·‡zä-þéùúûªÝ|Õ»|Üü/f:ýàì÷{©Ïr®çD»÷÷õüÚ>ÿé_ÍèëûÔo7Ë­ø.ówÌ3éu.õ­~ëÿúGø«Wü\/®æ/#¾ˆë0¯:ªÕ#ø "ûš†-®2‘‰‘½ÆÞO“í\Ô -í‡÷­©³Žç&YCÕ¤ÌÓŒnÚU|Á"®íƒ«! û]zyy_¿úÇk cz!UwÛWZ¥šõC˜Êñ´ñ+b¾³>¤ãÁ ÒÇ´­N«gx‹à:I9EL„J$HUÈMœ%'ŠbeÔTqÅPÜuilLÓV©îQ¡ ¥â[ž1¡©`e’Ç(®A¡ÊW¦bË)µm%Ì‘!`8Ÿìì¨iTiƒËÊgN×ýdù|þüyAòqrS·], ¶Öì½ý¹^É^½Ý¸8•6‘…›ÔäE³é¹KžÖ¡]Ç{S€ð”´ÞïݯgúlÖ=cÔÒc¦0ôJ޵¡‘Icº’!¹’%šx5Ü¥€¬:ä{Ì“¦¢‹¾¶vÒÓOdϨˆ<.;ÙÙ­][ª«7>ãQ?—O‹y6Z2˜G÷¬ægêñµÂ:ÿ›ûo×oÂãœ1;’µ‰nç b .Üé”=k±…ÏC=V‡äL8¨§'확Œ®dÚ©P,¡bj{$§lKÒ  J#¤Tß$tV°¥¦Ü:×/ÅùCøN­5fª¹¿ w(ì„g¨SH "’¥”Nq| \ÂĨ$aÒ^ÞäáÎìí½3ª×Û7â»7—òë¶=ò¶*Ó;/šX/Õª2¨*Y?nØ eÈÀ_ÉuSeUÀNd­Œ/s¶9Å= ÒÐpVú³©³çœÆpD!…©áƒD¯õs3•p4\ðД½Ê:þ%_´j§m†‡0„·^}6 õùìÛ ”ÎÓx)¹ž×gÁ{{žrþUó }áîÌ+Z(êÀÉÆx˜ZƒÖÜHERe‹§N}OÌ#<1ÓâájÔ‚R¡9¨ò¤öp¶xôIx_ñQ²)ŸŽÂ'ó>Ây0Íî‘£['pMßäßÉ‹•ZÆ‹¸¾ºÒ¼´1YØÚèll¯èãH4,,‚,qêÆ§^­Þ^o®œzm¶öó”ÍA÷JwüÆ(Ùñ)xÊj}¹«ç{-{t”ÜY/ª |å˜>„°@ö%&bE…•N$#á:ÎOòàž«ª.àâ­TÜX£–_Ø\uk`Ï®PÜÃ5ÛWKÙ fÐ8v¥ „üŠÕ\KQpÎß¾–îé²$X‡Š\›36)‰«JB¡ jIGYÖsý¬C†iƼCÍ mƤÞ4*U³¨:yÌ.B¤1D±»„íË+NôHHŽ_4—Ê2\4êëú2Ô¤L삪˜WYjíx.ÌØ“ù ›ª\7+¤qiU#¬'Í-ƒ6µF°3öYH”@ƒr‚Êd‚5#-ܬ†ÄhÀ V€c0JŒŒ‰’"@Eæ.Fœ.ÑtÖÔáfM26j…rÕé]ÐíBñH^¡šXÛÒ1¶œW§é“FÊ7JŽ%,Ó[+¡$]! ¬Z–R8À2#$ÇYeÒ)Í$g¬úÁ;¶ú*»BºŒFÒaur8!ˆ‰¦ Er‚¡mZ( s H €ù¶Ž hE eIBš€Ï$ˆ„Ë1Û˜´1UŒ& c´ 1&Z15€Pi Ý8&,¨©sC\‚v%ál ”4Á&'0–¢ù À˜6ÄÞÀ Ó$ƒJ!Ø l|›ÎÖ–`²_ޝ9÷{ïwòÛD›]Öl4´•iºÇGí{¾Ëý‘0LÅ„#t‚&©ã%e@Yn¦–ÉRDBdí>&uÙdõ>ADµn.àê¼n÷ê OŠ÷B Š ÚZ1•VÍÞÂ_×…×óíí2«ŸÄ~)ëgo]Ί·~¶q‹éš3ûô°â[ÈIYÚUqÒI¶£QêkZ¶?>¾Ìã><¢7$бÑ 01JGU'›3©Iä*1P! ʖ‚@ ¥DÀC]b€‚)"%Ê 8*ÃÊO§öµ h·‘Û!X–qÅ—aG…ó/ÇdXšÙ˜ÓÚ[_ únùdC S:(Œûë–jR3¨fËŒÐtÔ4xˆF@–<¬ò/º-UŒT@L¨»»kžŽ`œ,dNè8Óv¸‘ïÔØÌ]Î}‘£·ÔÐ)ÎyéÙºÞ˨÷¼Ç»Ky‘£ñ„Nt ÕÒœ&ÞLCB‹Ð‡êÀH˜X«ºœ}W³DÌ3T¥Zá—©ü‚ †V‚y’ (’C11¶jcbÚRì`bVêßö[ -ïÖ¤Èáâlu MQi*ŽV«[eªZ€Š¥RRÃåTš]'yR†(SõÀˆ¸ÔŒkxšY„!¦!€˜‰††X0 0C1Š¥L"HT"™i›Ô*ÂÀV¡ŽøtÙ‰žIË*‚³¦!”³9J*‡2ÑqÅÁ0C„$ÐcŽa »Q#¥ãUÐÚcŨ Š… 4)R$¹3ŠûÈD¼íÕqº$ î¨R9š1àhsä-2˜Õ¨¥[VGDH ¦Â všM¬dñ‚ÅU±FK‘ÚH!ºcªÐáÌ$kÂA¸dÖTâÄM RA`Pa‘A$sD…NW,rl±Ê,3N#óÍO+G I|Ÿs,[÷*©E†ÔëƒØböÕÖ™Ç!+Þǵìíƒf>Á†0ÇŠZù:¬x¹ûnÅJÁ «©ä\ˆ™ëñÞÜum;ê±½Ü-°-+EÉÓ®ì —U§D°Í–Zr×|v÷+Ï—ó²×Ø­m§ÊäQ¸Ðv¼ŒæJJ—‘ç‰á #€åLÛ¢l#l;üLãó“2ð¹7$¤FÙÅÉÁ•E³Ø[pãPr0„MŸøJàüloć“dþìÄ?Î @ `”‰v`€¢‹€ #Fh³ @!D@À@:èH)Vf϶g“S´€ˆÐDPZ½ÙsÛ«FWTÐ1Ö£Må0@°«Ÿ" ¢¨›œƒ¬C^D6v¢¸Ž¿ÿÅñ‹=ü½øJ§7&F6Ç'§¸ö°£´«ñEÊÏÈ]jÑ0á`–ØO.SôVçÖíxrÅ£ûIg×ZòΠs¼% -ðùùîK|VvÜjŒ\¢Ò(”ÛÁÈêÈdÁ‰3Ka dTÌ-’ú²ŠSȱZ[§:PñæqëæÈ±nR²,-ßæn–vl£³|ZÛ:@ž†ñHÿÝ.N4Op¶n]‰‘ÎZo( ÷-ÖB ø×ýÊÍ·¢Å¡¨1¨Ä•ÃÁ´¶—0>iÝðC¡©AlË5O‘"nDX=gŽ£„)Š|Û›úþßøú·Ú}ÿ˜ÿ×󾦅DÄ4f›gCB(î­>Xj—ÒÂ!ö°öÏýjÎuû—ÿýócaß–›NÊШìŠÃjC2uêøÊ¹cÖfŽq®öýÏb4P´»{oÞÜ{½>¿^é܃›°ìÚ$Oîg9G;joÃý¶×tݺ_¾(ù³M¡»ËÖY^Ëǯ޾Çþ—¾Oäåûï–ÿ´à7ñ…ÿCÇ»ÜÎä›ì»bËŸSç__‰‡s t’‘)½‹n:ÔcÐ׊Xœ¡è AÃjÐ¥qR&âj`ª q4|$Vô9ë{U­å’Š~U£N-bÊhÇ jš¡‘®gQÁµŽW·…sÀ‹$*ö-öÚN+]T%’R-¡qd@¹r!Aå¸0§fhg½7V»òÀÀ•AC£šõ>c‡kTˆg T\jdZ Ʊ֣õ~ú}&ã‰Wˆ¸¨¸q„E(Ù†gô®šÁ3 ±°¡3W[åŒoÒë3TMƒ/Í®ºçóŠ|Å1¹–ïÆÇÛÌöýG~îË;g½üO“Ðj>>}~´3Ëé(îâ½ìÅ;ÏËÔS²¸É½6þ:J6ZvUv–.ld=â}Xˆéq)—Ñf)„0,ç1ï»ìñ¶S7Ï+¼¾M¼´ô§VŸÖLmk¼V(m°˜¼Û{°NFćí]WAvv¶²Ú?£@®”#GµÇÄ!$) t&\‰d°„˜z¤TÐ1FZâÓqã_·nl4„̆ŠÝÕÓ3]}œlo¶g»'‘·±M8îldœûêì¼dUøÈ+ÀQ®?Æí<+\Ìy™=YEñ™{4H¤·¯­¬#««Ï¥½TÆ"ˆ•¬%Njf;c-F•(° )^ŸŸ®(w‘(¨²+EzƺQ9ð¼î9/pyë$ Ìí|+nHLú(=Û–¬ÒàŠ'Ö„úÉÖ.Wƒªªmß;Œ½#Øq ‚Õi*ûÌýëõ¾wg=«ÜæÕsF*Q SÖaÓ&ɪ\=¹5ÈK¡’m woŒR±BÙp‡kÿuŸ~wqآǞ’GCNÐ&óåA±Ù{q‹¯Ë›I¯cÓ‹ƒGçÄ“¶_U쀓xLà,÷¼GÔ”_I~ÿKúê»3xrpP€7ß÷tô²t×5°@†ÊÊéýÑœ¾Ì«°”Sr·K¢#W÷^{8MÒïe={öžîc;ëÐÄQjp•<^(0›.D@§A)5¬…£L,$@êÄbþõö‹s_ÿðä(?£µuÉ$‰ÐYgo󘯡]Ë­ÉV‰{+kY,–X¯UZ;ôJÊ`;:.V$ nÖòdª»Ôg"sþ~èò[“¤l½=}ý震wÜXÑÁ£Ï 7V`5ùÖâ[«®Ý?JrDÈ^`P*²frS£Ü”À@°‹ÑŸÅ2m¨pØ+ñum9íbM!½@R7-6Áu’g dõÞ>Ü#-€4Ü À„Ý„t6^Þ©Ìíòá)C ˜àv»@^Ùb´!ó OWÚŸzÞiÏ\OÅ*é0“ì‚.{$Š}Ë£ô®àWK6vY™m£¿6{Fk5yvŽqM„×YÝ^íÕÏ‹¹ •ÁÕ9:3cuËûèø»{·í²ÏvíÇ2™ ³€µØêGÀNÍŽÃâET¡£ØS[ö9T–ÉÆÝT×XÓþü²uÉESÓ®øYä=ª‚¾V(–BlÑËpt\ï욇 ²[¯J÷ba4`¢=´LʽkŽB=(¾èŒ°ä“‘sœ5-B¢[*P­fÍبÃr¢™èõ^  $a*†ˆ,lTæ…môÌ‚|=ùÉÆ>µ}D¯Þ>É·@жáŒÎÆÈðÖÙš@{q@ß•„ˆðUü:(Ó£k•ˆÀ…æÀ}FÓT`ÁÙ”utÙée¤°lö•8ïÛéIX;5}ýq2šÔ/R_,ý^w˜ ‹Q»¤£UBæIú¼phŒ¢ÇrŠâ"1@FçîÆÇ¾mÏö ¶ûJýÁä¨:®~ÆA9Ç¢)ehz/t*Œ2dKªB^ûEÑÂdTŒÔѲQÜ›eHR¦r¢Ð€ËºÆ"•lÄLUÕQ…p@EÅZ0‚¥ŒGJŠEjX…OÔÀ€¹–Ú´d@J^¨ ÀH|¦´+ƒÎÕ‘*ǹɃ|˜Ž4³.„€«TÒN£²Ô*G0©".H¥€Á`˜…\ÖPBˆxC$H ÑH?Ë/q HôÀ¯ã"΄âVp<„–›Èà: rF1–žÄ@”å¼³/6¤ª   Œ2ÖJ6šÀªÅ¡ŽMh@âC€d@Ș ÆB€€þ°¸dk ;Ùiª´ B:@ùfœ¨˜sŒÊdÓ¿Ïüe' Û 1'.[¾&s³?|LY•uj¤ûÓµáη—gÙxñ%›´wÐG¹î_/v€¾ˆ‚æåÖ8çÓ¾ Zœ?‘\ð ¨°¬½ÇË€é6¶Ñ°a9GÄÕËhÛØVÆbÆ²ÎµŽ¶VO=XFëÞ8æ0ó/ëÞ¼Ž.d•šÛ¬ÍÌNãÀ}Yly]öÛzš@R ±dÈüŒT8¶wL!¦R“/ÌÉ„q‘¶²a›ì#ü) g8kF¬šSæ¬ÙšÉüù§DkѱÀÓšb+iªx>ak.:ÚL¬½§ÒKâ.X².°ÝÙ˜y-É,¾ìdì ¥ŸiÀ Ÿ*6mÓ¢•hh›ŸŠ«ãÄ‚ðÌT*k¦‡hÃÖC²g®vœÐ%6»ušéqì) :J¼p³ 5¬˜8ÈÀˆ(ØPØðà]Ò#¿‡.6˜ f&`N9¤ŠMÐ L’§Á`™$ „ÈB¸ãÉÁä“›B °Ì¸D@( ªX¨hÅ @ ¬Xá š1¤ÑLõ9pC4³µæšaÛ¯_Yë÷G§ÚhX $}pAvß²ï&ÝZ¹×e[}, yì™.§>´»î½Å86*t®õK¤Ð%R³ÌÅp> 4ª–^ïx&ù©¼þlýwVsÑÎ¸ó°² *% @AiÁ3ÔÌ=‡k=|ð~"48ÈA¼+G¡d·—h) P€D $ %  ˆÔ6~Ò…m½~9ì Ó:¤q3 ÈàÙò# ýÉá±éës [Ž[iÄÂö–û|n^!à~UQ°svºÅþc°]cïí_«:Uˆâ´ÒÑGƒ…ˆ8Õˆ‡\!Ï÷‹q;oßÜç[ß¿iàˆÕíù‹Þ¡“é<êýð¤(ŒlÕ£ŸÙyõÔoçí {V÷¡'…K÷tDbÉž +^T±>Ϲ×üÚ÷¹‰õüy^þ^¡Я¢Š?°WÃt¯Åב1SŽIpGŸÈÅæåú…6A¯ÅÎflQ:i¥n`mˆZk@¶ÆÆ–@i›ôC<×{š}HÆü€þ™GMwo×8 YŒñ÷cI8cXÒE ¨& ÅmmM‘y±]ÓÀhHÐŬôô}ºvÖªr\Ò[ÖTн‰ýט(v„5A\õ1bO T“V¨4ªZ1a•ZòÐYâƒJÉr»÷JÅ @±¨ô2ßI|Î`<À¼äK„$Ã…i%~¼¼qgÅËóѳIû/¿ÍÇoù%]¿Ås÷=çç¸#A¯Ÿiÿcóp¿ü¸ùÏ|t5Z6c_¾ùe3L¹®ÈœŸ{Ûï^Ïæ{êèä‹ûÚÜpJÓc$Â3&°uÍ)d@(ÇG’'R㦼jѽI~?ï„ók?½ä@¥¸ØHÆþ9m¡*¤.™A™K²1„ƒZ@ÑÇ#Þ]o û–dô3>Õ›.c Q±d‚ÒQ9&t¢AZ†HPÁGY’v{ÐÁQ°©M¨Å\oz,[§Û7~{± y·ß28Óª`4ˆ™Ùãs?Ƀï^>·{Žm·ÛDZ·|ª†l˜ì̲,ýçúHM›éôÓ­|…­ë6jÁ„[½Q lÑm“Ιë™F±àUm1.{’8Ã*ò Vâ`R« ”Â[)9,°“ •þx8»|A¦…5W˜Ùˆg—éªÅÑ‹wkó¢ëé9G©I? IÌ ”ÚÕæÞsNbîr¨yñÔY¦Õ”=,a¼[)æx…ZŸY i¨Ñ„²à³¾¯éuý—T¹s§ï:¿‹öäÓWz^ülÔó~éüSVÝï~8Êl ‹Ü)‹´g÷È…žCì2J2­øÐ÷ûôy{ªY·%÷\º`ú]ŸÞ ðh¦L}þþwìv\¢bljcÙ>£t.qÍîó B€Á–/èõ°‹rÆ©CË”´¥—=ûÜ Qª4Ø%;¡ËYœ``‰…`• àd í2¬£²6ØÂ2ÃQíè¸Ókn½ÖeãTý}ÑsIÑëqkxì¿oÓöÈ–½F㦌/ï<Å/PVýožÙ´žW'££{U~t}Ѽ¿¹L½¯þúùyçþ3gymÓÖó°—‘ûàèòÜzݺ÷äLlÜÏëÅ=J™ñжk™b|W ä0zjDå*¿ÅùëòüU·¨Žµo‡Qãk!P‘öãŽã¿;“ I™¶Y˜k‡KfÀ°uOìƒq3ÃòbƒV£|j!]󃙓:×øÜ`¯¿X_å<ŠFjÙk™WP B,Ö¡rCåWó¡ôO/xÜñãÕü1ˆ¿^5ùùãï–fS?˜ûe”¤º†oŠí’¾nÜúüÂÝ_ó,ƒ÷}¼æs?ë{Õôsêï6†5½–‰GfÌF5ÖèŠJ…qfyjBÓ˜Gîñ``½šœÉÃy8%T #@,l”¯›x"±ya‡^ògvèã’Ö»>Ù,MµÒKcZµ?Ñ™±m¬H ®4“I6ýx&DD¦SMš¤Ùqé\X¡–yV-Žè\û¡WɶIΕIõ»¦BïÕnS$3ûºä=+œ]šg9½Ìœiœ7®q¤ÑÛT›<8Óå!Öî5§¼¿4öen^¾ k&ÓÁys.§cabr±+4D5}ÒFlç8ÖÍ]2Wó€>ÔAb:J°$¨iÞ¤¼¬9‡Œ²Lh:GU%êôEÌôdáÓLÃÖ»@HÂ5~>¼Î•Z¦zÈãàÈK|_ž¿<©ÄŸ{ {;ì¥Ez£µfQ…R’™^% ívÃî±-Ñ….ÖswòXˆ%u6çj ™ ° )ŽötáY‘u.˜Æ­<ÅB}tyuh´ÀxËyìwW/Ú‹hÓ eCÝ!dј-î9ZEúȹÐ8|kÞ3ôØÂu ¤ ¨9h^*?0ÚÀUãm*¤rÓá«é½Ù»î>rñ6Ä[žz>¶V„ŸæísÇžUó#ª­¼ö}ÙFÅcÐ}f¤¥5»3tzDë×ê¦n¡¨âV_– ß[ºìU¢Xµ|jô•éÈsÉR<±LËŒŸé\{Á6Ö ËêÎp©ü°£ÓóÃBІŒU0 Å Vn=k:ÂZ=ÍÉŠHæ\&KWFÕ’À==Ÿv‹Áj–‡CÂKƒ¯VéGûÑŽµ(O0=œˆ¨«Gï3ÍŒ2Ÿ¿.¾m–o¶F‚&*Úa§£<¦'OÚ:F„„€ztÒŒZ÷­ŽJÀ¡²~e(@fVeæ™k +g ðKë®á¶çªYØß̼Nªé:n¦«/Ÿi©t‡&<&©bl/ïTM6α¸Ù”By˜¾)CËecÛÐö+Sc}^»ôrª‹sІ:ñ—Σ+AÆ·š'ã$²VÙ¦ª™5혤¡,Y±ZËúÛÄFçQØ5ÁîÝH±/>è²cJ f:€•#—c «Ð ñl¤‡hF-«*_}C©’¡@šDM 731‹ÙKVÆÖx F",£ÄÐhŒXÉgÊ#d»2zPÁRæ…–±lF‡å€.GDÄYÓqŽUT!>”[•ˆ(! ÎYÎ¥J¬"-0…àÖP‘¦&¡ãZ`jÀ¡&€G*Iñƒ„BزRˆf”Âx ÷a'G™"EȈ‰$ãÀYÃFW4Ī'®‰Èƒ¬5Äi ˆÃ\ˆEV©œbL¡3ijÅ':\+’jH8 “ÑQ,þ°Xk#Ž¿ö’ùpöñ´–Œñ‹,*Xúà|ø'Î$’£EüŸè‚ʵí9q®óÅÞûeªþ‹þõß*ÇGö–XÀüpgIbà˹5©vþ£‰žƒxâfk<ó©éó€‰õÖv%ú ŵ4iúÞðR©‰ì™oMÀ± —߃=ßU¸ørÏ!ÎÓí ý½“wvn©Î¨w¶Øæ3`¶dÍpX ÄÇ1õ#î97næ7Ç›FÁÖXdâ P ‚¢ìÒ9’†Á— §gÐ rRläaÜÌn>w¹ç&GãGKp¡Mf±$!Ê(€½ Ÿ/Z¤– ã‰âÁ@CXN2#2*¥ÙB!(ÊÒ‚-íˆñ€k—ù wVàí‘ûþ”»›‚—çÅíåqr¶ý>¶ÍSžvJRé‹Eß F2k»Ò0?Ê"Ô;KŒ¤@ú¬àÂì#v´V%àĉ˶ÂaYòd¥¯l¶U8ø´ÁฟdÑHI“àfÉá$mHX%(Ðì›…↧*Ê@¨!%€È(j€ .ŒHX*BÑ@ iÝÖb€P¬F=*kЊºâyBâyÉŸn-[¾LŸGR}¯¯÷ûª-â×”ê%›ÉzÎMWµ9òÔA?}ƒs°jñC±qÐÈ›˜3¦ãõ÷¯Ðõñü ð¾r¯RŽN0<ò6Âl°Þäšî•³¨ÓK?L¤b––â…tmËi6Ýx™>±¯VR,#ÐE{ƒ-ñIʪ„‹¸Ufûº•ø°®’³tF‹gÄ·=¶ú¹qÞ³|­í51ìöl?³¾Òî¯Ó3|}±nõæKìÞ±†ƒrpÕËÒ?÷Á~ú7ç¦7"™ã‹ÐLøÜ>½–—2çò¾µ‡Ý»„öxƒ îÎKSÜú•‰3Î(©¶—zõíR½™:{ýµ}½O¾|nŒ]')sTÓk†Öò¢Ë¤å8þ48§uÄ!³êZKj{IhK-º$«“d&só–JT~f+0O4.EÅn|—˜’Rß΀¶ìÑÁ|npôç·ïÔo³žß¯Oé›Ie¯÷Q­åöwüˆõåøÔøâ v¤µžÏÕÖ~)ßeF¤®ÂVž‹Á’™zs²BÅs>âª>×õëùü'ÞH€(IÂ’€ˆ4*G®J“&Ç}ý:®Õé =š£å 3p3Ùs)CBPŠ0„¢ŠD¡)E‚Á<…&>5ðf 74'¼€‚kÎ:½*—y_göÈ{ÏØ )cê@1T:ÃãØ¹^%¥@àþÕàúÃ1þXA ö ã~÷z¼Ü@@ˆ[‹r~Ýì¯cV±_q¿ñÜÆ ÿÑÁ¿Ø ‰C<‡ a°ˆB*âiÃÍŽhÒ­¬ídÃxKz UÛ(0Ó®Q;¢­sdmù¸vïC_ß\ø‹¿üýð ÷‡º)b‡nç=Ýb.B Jê’{ÛÊ' m49¸ƒW²ñK[õÕv˜V-ýXêÒ(lÈ~‚…7Ý1L%@¦KZvÐwˆžÇ¬­7ØßÉûõýÏ3ûÛeWùßè‡ç43‚b«­– ØÅº%u%KÚæŒ]×» \‘ºdQ–ìÎ ­´jVS;\²þÿ_F«öžg¨Øa&Q¼0©."Å&vвô´ÛgÑ?Nþ@œØ窢4Ûÿ1õÛÝ—^|}ÆdËûy†½ÿòß_„w¿~ÜúåÛöz©ÿÎølýßùûöý<þy6ç”×꼋×.^º ÷}è==}ü¶å—ǯÅÏ?}ø]‹Ü÷ûvu¬/.Ä|›õßv©[¼SŸ§Ö½´•Ñï GÉ3ÄÕQÑ‘eçáˆt‰°Ý fŒÁ¡Bš öÐ"¦¢JܱAÛÃyÛXo)ŽÛÏ÷ĽFçÚûx{ÒÁÕWz…Ííö󧤿Ï) ÑŠÍp)TvO1î©ZÏ•®}2ã³ÔÒÕN‹XO«.írqéÖÈKlsnTPt‰Jëµ8à @8xjk5é í„>¢YczçvÌè%8¯A=ˆIˆ^AxZÚ¼‰YÒ¡TJÃå÷yþéØÉ74Wß‚RÀÖuU RtX0èñ t+"{ÝBË‘NœÞC 9–’mu)‚Ñæ V ˆf#jvÝ­ºlx$G–†,FæhSŠõ§=Íåôó[Õ|cWü!wYð;Ôƒ…*}éùv'T Æu´›uò$¹f;ºqùÎ~Rü©gÞ~EÃJJïìQ} = •y|ž¼ùb™P÷L‘BѽöÙpµ»ç>sµ«óÈTÚ¼ÿb|ô/Þ<4IyݽýrÖ's¯"=žÖN•¡YƘ§qs\.»6 «FªÅå´Ï Z_t{ÕR–[ñ·Ð2za9ÚVò{GväSnÏâ°¹+©,Åפ’üTßþ¨¯ëtæMçë Ò¡7 $“¹àNõmáU7ZŽ"58ÖÌ£¢#Ùbe6ÄÔ¡¦4ÚÃöRyè«Eêt¸¾Ti[¦YÕ—?´ûj ÃjK}ùó ¶m•¬†ú)«E­èBÍ7ª"Ê&jó¤JV#Ý^J4H»><µjí c0Ñuò;’?ßFO{аqT¤\q ‹òÕŶJ©ÁÛÝ\/!긪I! ÜÈt†l‰“ØÖ‰Rˆ®ÁÚP¶”†'n¡…`…qõ•\é±6W²söVPZ?G©_¥¯ÓYBÊ•è¨Ô'°n¢( À3DAæ¦;µÑOÜ_=MqÊÝÍNÅÜ^vÖ;&|:W¶Èõntéê7'µ¹[î,¿î›\'»–O1&жÌ–T»G¤‘bCÞ¶-uŠsoÌy´†./Š‘~TU]»®—Ìû2?î¤ÊÖÅ~ý¨¶òõtsu†'­Y[ÜŸ üÁö·!Kƒ3¯$5¸Ër¯å…k­EÆx4õ1k'ËÖ,:@DË8ñS‰(1«*² tüÛ€{Û„ùâÊÉ{´±-Ë0Ñ/¬=׳íž9 —·ÓÂØãb˜4ˆ5ÕcG¸…åø†òø|˜Ÿ‡#OŒ±š'üê3\ݤHx¹;ë¨R|›“6½š+‡0¨€mgœ³n ‚óóö²g`íÐ>ͪ%ä'ªXjj“󃸖6—œ`Ho0óÜ0YFÊæb‚gMÑnzM pëR2¥"\6Ó¶©r¯ÀsûwöN–‚¢²ÈïMÁÿ!ÓG,‰z™ïY­ã"³*‡» —UŽGÂï-ùu`¥ŒMËÜ ±»z´™íÊ8½@þî’\n{£Öf²^Sƒ@Ô#•JCÊzy©*Åô3~3’qo9ŽàÛŸp êFë r.Û[é»ë#°Íéôðc¾¼åÃö5. =Hˆ’uœâ~jqÝ×z¢Ùs½Ç0¾ýÐý“Ý ¼NÅp0JLá>™ÞiÆÅôàÇËËë²jR ë–A(0Y×úè?iÕR´A–ñ"ÏX{Ó~&è[ã®mÍ«{Ö…Wíï}p3Ûsìß(æ³£÷ÃiFl+ÓV,‰ ìb£Î–•~6§Ö}¿ Ïg}poÛYJ;¶¿ç×÷ý‰|<9{®ùå Ý.Ü8ɈeÜi&òû"^€:q±ÙkúÍÝÕÓ3$Ä8b]J¥÷¢W®Ã#ºpÁ-lÇÚ™©¶Š:Yó4À=OΔACv‡uF}Ìø™ÉX—qIr颚´…­-ú¾±Ð«£Ÿ:÷;äÖA¦ý×?]Ÿ\˜O†† ëZجõÇEç…¿tÝhæJ>;P8­—›—-!‹ ÷¹ºÍ:ÔëÂ{{ñÆgóË3ö.Ë3¿øà˜[Ÿ’&•¥`¡)˜pJ9›Y.Üѹ=F®£…íÌàŠrþ|ñú™~ù¼ z©Hx“ªr^3©@]VS0x¶—*X°‘½¬ Së²®¿T”Ù” +Ó£S^³ç-¯¼}Ÿô`Ë®Ö¢Ë }.ƒ›eÎ`Ã׺}í¿ñ}þ@Æ(RÛÿ+ÝÓË’% €ŠP´jI¯Ÿ|Þ?ͯÏË’ë_o üQ>˜¨¿guÎÚd,¹3’~:³UE#JÓÉßɽj*¹FѵgJW„s wd’ZªþØoYßõã—¬zÞÊî²c˜È(Ä&XdÇSAxPs ‡TÒÔû¸÷K\ò{̸9hÁ+`2£|Q+7@ˆDÓ˜Tˆ}¸Ä} ̯ÙÉ]ðQðÜSÞÀ­J»oÚ‡Ò-ºÑ¦× 2˜ÿ9yûøí…¹FÛà?°kÇA‚@õÕå½`SLD»å2[Ĭf¥Š]Ùç*lÉèÔHEP2jÃfܨc¦ªèܵò•QPU+ƒ`Ú̲jøì“4¬DÞ?“IÝâ‘Ñ1ÿ¡Åßòâ_îã³>—ä Íë÷³Þìß×7??ŒºóšMÑçi?^sýäô|¨/Š{6ù~¾s›ŸåŽÅi°÷èÝôKò΃¿ü«ü¾nËöôw/_¯}&Ù¿9~V¯p¤Hg´‘ÖæÓY÷™yÄ@˜gú¥/°·Ÿcû쳑Fš’2ýŤᘖZAÈG6%ä3ÛÙŒüÃEþÝQc×bµó³F[ÇõÍ8[-3üc÷þ;£µ™M53r1öL÷%×È-óÉdŽàè×õåÛðhtíä:ØG#0åqhŒŒéÇP\I@¤Ê5wûrœ8I¼’ï*ÞŽ{åòõ:b ƒß)j}:¡—ƒ¿f'÷–êßIÆWv2ë37dÐȆ‘(ø¡®/«TÉIÒ4Î?Hû‹¨t3Œ€†µ&AIÊ×ø(±Z/óÜÜtÀÎò‘™£7¨ƒIDãKøÊõ·S䥖ѫ‡_tøëœŒ°×X#PÇ,ª‚¥ôtÏ”œ„ºKÀñ¤K4¥Å|©3–‡]w(ß]#Ÿ}9gÊ´¹j¯zóÔã;ǰB•Ö|î½}ýúú2`¦?.Þå•iv[ŠxàÜõ÷Ï9Aª•†ÒÁAÂôs”ª]‘ÒÇnNû¬‚JË5`õû‘ýsðçù·âbíA€³~#Ç+3U6Z0 ÊVRR Ø…3“ìkb…äp®@ÞzýBt,¬åªlËp)á\hÚ‘g\ ÆZÿík¸¬'yÌ¡½ñ£”ëàgœTç·_†£e'%ÊíÏþÆI6©®˜P«ˆÙ`HKðLÑUv§7U΃޾ !´‘n¾¦Y¥ûügyÇ*ãtúÔÇ$/D“¸+ËÕ>z¼b5»ÒVõŠûÎÂWoqÙZœéަâÀêD%iè¼Q,NËv‰¥A@sßÒ˜é?8ªçئ~-[ê7ç•××ï}ôkåô-ß5‰ X3kk®¼SÖÑqxª·÷¼õ­¤·äúQÑsæÔæÕ««‚/ÏÛì~´B½¿vÓ÷i?À‘W5\_×úó{¿yý89x)A£rk"s%+{ЈÁØ4^œjolÿ⦵¼Æ\‹wV—üê¯Uçîù¸â±Á§i”œ‡pŃV(—½þAu–NˆŒ²ô‘™†“­--—RZ`Õˆ‰–ˆÜÉŽ´#8VL%ˆÅ\±ÔF³v¡Ðr"ÓI €×T‘Àn$8[ô ÂeC«ŒÚTÛ“›,`®aÒ>IŠ€f”EšŽõ³¨ykò´©*Œµu[$½Pq@I ¦È& ™pÈe®è~DNhŒ8(®@¦‡€m#„h¬7*+F)CŠå$aæy’-t@¤B,ÄÆ /¶á bj2ê†Z£ì9ÒqOcmÿ²®‘ÞØªõûp?3ŽRt‡—qG€•)åh §eNÕAi)Ù  ¤ùB¡MJfD„ZAƒ½¯e¿ho{ hÇ dóçÏ!5ub‚B¨9õ‘è=ì>€ÒSMD]J—"è.2µF”ÝÆM°h7ȵ†RÂ{ÆK´$² }Ä ãí,þá:1tŸi¶tPT…cixhýe§Âûìæ:X ¤)¨Ì…ÛxV˜îköVu›á}¸üÝf/ 4¹Ÿ5õ’ìàäÌú¨¯"”">º®éGÂ^0ª¥fçºG+ÛÏ4EÀŽ*òYt¨\Ñ•”™~üà¬výöÈŽa))í!d}PÂiA»åð*¤iíJÕû|Ÿoþ½Äù¨ICW¸±Y?6êzöúån}½ºcÞ|ð%û}ЧΌ[Z—WŠ3›RUÐ C‡»:AkÆà¥‹õÜ©ÄÅéþ®û„!úŒñ S ‡OºC¡ý‡4–~M(˜§™{ RX 9ï1åT4a.:€€Š±.)T’9È—!”2툅 Eó´ OÍn¾Çü[[ÖÕ4 À•V{üe–9<¬'±gm¡\^›){äxÎÙ“¦q˜$ö*,¤+]Á)i£8»ªÉ›ø„LÂyj!¹$›«4P Û.¸«òiÑ1‚†G9Øln²ƒBZšÁ" ³S[]/›tL]–!-¦»­ƒÓTj~’k‚ 4'b«°H°SJÀ ±7„uÒ8yã""ÌÙ®‚©(š­´¢ ãû”§q‚dhð½M e.cU&›;î÷G“‡ö£“ÿð¨?†ƒlÆ6`Ep Yˆ xµfp Ö-âŽY¹H*É!A0œ“ð:àÛ,„0&t\)£w[O¹«:b º 2X@db# KŽœÁõ[‹MN4@¤@‘ÏŠ¹0««_ ”Á¼‰(L½’¤B΀Rô&_¬ìË K#‚ ¦ÉzàŽKù>Ë0X0X&0¬K$ÈB"ˆ9?ðM’%OòÒ¬!ì‘Ö3Z³£¤1²9ÛÚoÞóíñ›¨Ç9ñ`¾dÛeÿ¥ÅøÔùäzò#·é»Ä“H_À…UÓå(Z­¹5ßÈdRP©)jNa³1U0ä€M5ÒLÄøâÉ>H«Ô•@7B,PÚ,”F§•‚Ž• -6øFK¢²ÃÍGïè°çžÒ4€–Ä„ÄJ©hÌ-M4} F@Z£0€˜0(P´à|õùy˜y!ŸË,‹î÷ñ¶<îÝŸ5€µ®fµâzÓ+v[t‡”´ò­¯ggï+7f\˜9GÝg-¬¥í-Sh´*ÑGnW oû€+”ñ¼ºçBñçÖ¾R¼û‚Î^ùúüû Ãï·æûZLªBÍwÇÐ&ñ|Ÿ´ûSŠçÆe1ðÇvÜ#ƒÓ¤mÖ=¾É¬!qç¡·’ÂíÝÉžE†IÉѳÖF3¨ØÜr÷ªÓ¦`bÕÙöÐ#äŠ<[´ƒöìšV»ä6//ø™çÖB×O)Ìu %PÕmݺç†Uµ–{º©Ë~`.“ÝjBråÆ1š(¡µ@u¢Â«{›ïñ®´ôù\”R+`h6M,Ãå-ÑØ•™âì…‚ãhJGX9c+\ðtÁʵ¦Mðz?,?Ëñ2¯ÇÔ¸;ÛÜ»úƒQrQÚ—Üîå¶›9ã:ÏG)e5ßΟ¶²ÚÃøüñ@C „lÃÿµó×ï½~6áùåjÜ`9ýÂú„z¥¼Úz|ML«Í^¸wGµmÔt÷Œvë¥ýº*P@È@Уá,84ë™ Ü1ѶݺŽdT”^*ô ùç}¼ÖÝ«·ïˆ" ¶+~c¹‹ÍL°AÀBVºsù‰Ì¶Î}[4„g^­G¶KvõC”cT0/^[YcVëµ7Ù)ˆß¼òe:Ž“ÐæìzÖ«¢Õì_¹úc?`» HE©^M~ÒcL€ðž¶&E’H›Kÿ€áû³[yð±¼ë[™e KòÖU/¾¶DÉt™Ö –­åµ¦FT‹¯/S›qÃ)[».—ɶŸ¸lS³XÁÚš£}¥º±QYî°~{÷þ~Ïf7û6ÞbÄ‘ ‰¤ÞR©Ôö0¬€bðÚC콇lèëÍu´ƒ›ëúò‹Ü¢ŠŠ5¤è‹! ¡°è§º—ûhP‘û z;fJòY—_zŸLvl‰–®¹jÛÿ$Û?_èöšEãê[×ÏîÅîW1x~™ß.¨®óµþ3ï½mßÑ‹ì+*ºµÆÎ]$¨˜uäKÀªà(;äpåcˆ¹ p‹ÕÉËk[+¡0qÜ´¥º’]ÊffÙ×›9Í´ËŸä{ÎÝžìû¦¿mê“d=Óü½íCúÿÂ?pàÍýjîŠgÍ_ßÿÌûõìšã÷[ýó•¥ÍmÉõÕVÉ5úrñu’g½8çs>ѹ͓AãÃ+:gý²~rúùÒœÚ{ÍüûT{¶Ã·Ÿïÿï]ò\ILQQÒÖ£tä¸ ‰Á(2òC#võ¼ÑUòÅ$¯Ô˜M£¡atÔr+ í„„e9¿€Çjëïçç_q6m\Ú¸Åï]žCã›Oå¿{÷ZÃ×ú‡¶‘€xÔ‡ÍKÝHnáÓ9G!Î.<¿Þ£?ÎWÉ{„BK^R ˜dÒ³£B*T*wÔŸ·¿Ï ëæv¼d8YßKoœ×“ù<øõå_K~=hÓø¡Cìµ:Éâ\’’wn k×8·ê©œ;!}ñþÍ™}9™.W×ÜÑ!ÆÂk¨uw fžý<™[.ðÈZ¾ò*Ë+uäJA7"´úq‹¾–X±FJjæ¨àÛ²^ù|8=ôÔ+ob‘P#±ƒx&Ô{ `ˆ9m „ûL¦-]ªêYŒw=ܯTˆ'ÝvûÁÂY¿êê鯼—?XcàÉU°2!’kC¢`d{¤8îr×ù¦¼æùKøµez»Ê%Äõ޵÷™-h«àžëKÑ- ;Iƒ’MÒ§9÷rËçe3+°$'Aw‡‰ tT0AR±Äg£„ðH3ŽØ³^²¿‘É6y¬*S‘ŽšhPj?´ÉXKKáÚìÝ÷O­ßùñz«ûØnˆn6¹¸0žð†€ô¢ù6©k*>*‚6«DBBY8ÌÚˆhbܺ YäØQÈNÅ]sÙWYK¯vŽlêB=cv[$áuô¨ÊÐ(‘ph\|-?ä²5»G›¢ÐÑŽNVsJ9°ž2^ µª+ݧ®GýÄ›€¶ã¦Ê¤!S”0Ï#Ó=Ð fç ŽLÛ#TËâí^Á»WÜd¥\’Ɇµyh+¡º"ÅT…°Æ$蕉£Ñ÷÷*Õ°ÒÉ~ý‡ªÕß‘Ý=Å“øKÕµþlãëîëë>_J”yÁ_ý´sÔ¼²Zý.º~cú‹óÖ1íê­UÈÙ©úýÿ>ÕÿË™wƒ¬»ýE¿={”ñ™ÇývÎ\£NÉ`í÷ý“^Ÿib=Wgx¬£¬.rÏûèy­ñûK00ƒ` Cj_(t©PðĺßÎómE}DðZ>êå"r‚‹¹7õ8d¿¥XÓHçh-fAãÙP,8Æa ÷gU‘x¸ÈÝ,M¯ %eËÀˆeó²-“oâ¸zb1¤"—ES›Äbp66†iK M•°&dÜe‰X¦Í#mO‡xpα®D5NPzQ2ØŽGd>5@EŠ tÅ ÞEe¦%^JÃïÔý±aJÄ>9ìЄ¢%ÖxpñgÓu¼Ë¤a£–%9p†ËÄiµ›ö»“~<{Þ‡?Põø×uç;ؾ×}ÍaC•ªÆ-§ÑGx"É‘ÈJ]ƒ¯ÇÏG×¹ö;š²P”¢ñ¢iNzVá¯â¾V†Uã¸2‘Š1B,UA˜Ïè½ [.Ë“Â.×d»¦ÙQ9^5¶˜™ÖÉ&–Òf˜â9šÎ3AØIâÒÙdË«:t"ÙÝœ5bMúÒÆŸFË…W;`С†·ÏéÎ!¢ªñ‰ïÅ }A$ÞÑíÚ`1Š/þ¤É#¤j¾ÐøH[øò«ùØ Ý«§«þ‡{cíÚÚdy»G}~~ùìýõëÿÏlþü˜Y¡A…E¬"+"¨Xˆxᨃ'{d2öìõs”ïõ©œJqŤӎl“²ÒȵB5Xã–¬€vk.*H$«3PC4{³½¬hQò¡`˜.ù„‹Pj2 Th LF:z•0ÀŽ7ãbe$õÔ2¦‘ÅVˆøÄܦ4ûËV後ì#RX?ñŒÈx—¨’$ç)ËKE$+xÑÎGÔD0)}KF²E½-ð~ÉÙL3%×þ;qXcæ¹uAØ²Þ öË-mžoi&ùeþªÒ¼’ëÇß®ï÷ñ¦¢Ôið1çššX(Jl&ÁÅjû3‹òÒßNÖ÷-³Ïãg­J=8•L˜C°á«‡ ~Å--nî€8àlFs†Yb(œ0CÛg.F¥$^Úÿ þ}±Å[QÁu¼píÏéZÚ T™Ð48à ”%GäÖQ`úRœ¶©§xÎQÀE¯‰É˜-Ú†1³ig™6™¥§0ÓuqP/+“$hGl>:ÏV²ê×GaB01Âà‹ÙuÜ ^ìYSøÆt'“° …#ÇÊ›e T…Ø9¼Æ!¬Ôt‰À(«j\HYØ‘˜4sÛÇ™“amŸ™P’D›²`,òÅÌ`ûÂHCB0²qîæ$Y4Y8—,û“Y€f„ƒ;ߟc)¥ºfê ½àeLðH  #$†ëZTÊb*T‰fEFnk%Ž˜$‘Š69s&e¿5—D^}÷ýõÕ{arÕvmKHòævcÐýälð2—±KÚ£ G¹¾Ó³ë<Òû02Íž´õô«•y¥RWPž˜˜[–Ѓäd^fŸˆÖí<’ Q¸•ŸY½…½;9Ñn;KG2„»¶ýVËÕ^¢þrH=F}ÀÚÔEW^@Êd¿¬zÅBªHÑ݈ÅY>ò.½|‰§‹ûÀ˜3Sºug³'·²/€D W0sЈwqUW¬ù,®ñ"òF¡ +¦¼›{¥uÜua²1ööœë û-ÃÓËíØûñœ«-ÝкúÜÄ}õ‰Œ%ÀˆÃô•vQÉìâ·ÆÄ,´DØÁ¿o¸ ¸v{Áh~¦I‘­~ÄEÐÚGM|wÆÛH¡s@ Ûç)«–wÜ3Jí uß*ýèÖ¸¯î~öj8’_ól‰ZÆñsßxÐ÷âÃ'Ù =Ó×sí‹Ì>ÏúTëåVuk_«5³öÒJª//8¾þ°š§¬4þtýøYÕïÌðL­Ž«ä)#øV°î"b”„ºŠTÖ<ç Ô°(Õ:´½ÓV¢5äð>«·‘Ÿ[“§51ùÒb6½' õVb•F[÷ôˆ! ¢„ öQ»›UľÎË·q|×WÀƒUh´´8’­^9"ÙþåƒãþˆØnDM7 " µ¦¼ 'núkíüõZuóU‡ñÁ˜ÂÃ(œ—ÈwUÉꪇŒGz]¶åŠª­{Qm}n­›ì„Ñ,_s_:özœíù›Ï¼<×W§¯™d%¿vxmE^ÛÇrsæÌУdqY‡Q£ßçšÄG1cbåSF÷©ÕÇkÝÎ ƒÁ¾ù«¨µ5m³>óû ­8bÄ·ð-‰6¯Òï†}ã#L`—ìÅ>Úq]¼›´A“$Ïwòä»é½Ö¸ŒÉézÝ¿)ÿÔgù²XÞÄ«C Z“OÎ…óŒý…f¿¯£wè¤þϸþ°¾¨æÀNÕ¨ žM-M€0!\I+W¨”¢Šo…þÿÇ©6=s5+€ª«än²¹Ñnýþd¾?þG׳F÷îœ.3îvÏìr¾þ„ïÏ4¾cQŠN/¥OL€ “ë{ZݶŸæó@P£ãÎäãâUó_Ž?¿üò|¿‘ç@Ç8ë\ö5q¿n_»cÍÜ¿ô”þì7©íãÍ‹GçQþöX~k²÷åv—žCü·ùUÌ,Rã“´{?ê2³×Ke•©eT¶:§/ŠÊ£²n1¢ZÂEF¶i׋¶´¤ÆÇysß[ݵFî8û¢¾}¸y4œ\^êìµ¹,P4ÍRž¹ÕJŸ—ªý cKv;ð5@’¤;™½µð‚ÜÑ&B=:–R$!%$Ù`Í8´ëŸ O“Ù¯a˜[ŸÏò±»–e>éoî~ÿ’þ\¥Öâ!®]L-1I†RYs…UÖqçMéöµ¹½ùM¾D_; çýÕŸ ^sóžCŽJQ}´p:¸½4 3*{ÖÛøÖÍ*ŒT€¨‹…·˜jÒ¢Quÿ ñJ7‰ÃìQ{`lN©5ðvI·A8Qì–8&‡ÅDdJA-%G¯–ÛhésV ^K׆Yñ¢ž ëøŒf›A±`µW:@sùK1“ïɯM.vzTë DÁ#… ƒÆ«ùÊ*ë Õýœëó:¤uªúõ±ìQ¿éä0ëL®zýü5îUËsïÍG±47ü‡`ÞçÁc`¤=åÂMX¯¦ìaj'Í)a@ÉPKb–Ê\Y¹5¯«¤µWmÊ5!áÎÈžJª?ËÂrŽ|=¾[\§Y“ûŘ-WYŒE¶Ž¹¯É´(q·Š‹Rr¦]x”6xÂóf|}ê¼-öú 69ÒÆð÷'èå'øõªöÔÅZèJ*qîóë;ø<ËgÁ•¸sª:•¶oçjk!—çu•Ó‘ s¶Žñ) 4̧×]-îûñÓAÅ}´6Þèn§<ݦz%EV,%aˆ b‘g"ð¬Ô4­fëà Æ’4«¾O31µ4n,žfGI¨Â°±îS!`Í­–k"–6´t¡«¿Fõw¿Ñß³%×_ÿ‘æç'Ðu¨û¿?Ïç}MRéðKiW»“KεwŽD öïgëêgÀévö6ëqq¬¾)'çç­¡e„5ñB\¬Ï³e±ÞÆÖ·õêóõ;çLõíÊÚ‡<3_Ï‹ÇíäóÇ÷*7¤/­wŽf›‡‰˜»ÞuNç\ô93Ò¨ÿH½aL²…`i+ä1ôY3S`ŸõBG+Ý0Ï2·0Э2Ž$•P-.›(ÍpGμo:.ZI>Y”íÔ›¹˜^± Ô”ØHišù òÓå˜!-rRÙ´6(b“‰ÅÝõ,™{lÅ(¢‹¥ £ÈlrîÖ‘öé’Ò34™ã5æ¸v[ÊÕ\±Sj»²˜óÚz: ð>³”Y5 TxV½÷;¸t‡¶¹5¢ÈÚÆ¬#`‚q³¦´dÚ$WŒ¹‘ñ$ô2_‹¬ùXã§ŽYß/ò®*·# çÂq9¯"«yÖ€‰ZØGOãÀU-®Ði¿CMq;D¦Ù£,†±oJ ^«ÁÔ²Úf§"… óÖòmË[ÙçÞ~7ÞuüÈ-¾>Ô–Fc²×ó )MÁ£Êt ÙÈ1'sä°Gã™æV³LÀTÑѬf–¿HÖÌš¾h®\í¶!™Y‹Ñxâ©L¢};0±pS}š­AvB¦"Žœ¤@Œæ=¸fClçy éEa“»% ¿ù£¸ÁŽ ¯‡½ŽAÓˆ'â}Ì)šÏ¿¬ñ{<Âë¼ÙEs‰ê]Ñõ f—ðKŸ½›¶m¬å•:Úülê5£ÿœÑWK—©ÏUån-\ þ¸5½æ_ÜÝÒCX—@BûQìH=w‡# Ѳ¤aC#ÂLŒÑ!…fzÒ¦fÑÛd3Þ'“SЉ™2n‘[cJ÷ñ×íîç.LÈŠ®¥ŸaXåÔ° ¤Q+5®õƒgs,{±Jsµ!fšžÉYâ %uþµjgi¨¼ËÀlô‹Ñ¢½UûÜí„Ê¡Üb0\þêÓè{¬ˆ^­Å±È›Åkz?À>ÃU–n9v7 iƒéÜÇâÆWÖ¾ps#jœÔÑ­Óu¶çæ~ì0•i«W%¥vŸˆ®h‘¨:·Õæ±íÔòeÉ, Û3O$ê÷Õ ÎḬ̂ÖêʸÝö÷šïâ£ÀnpEk±“!PYYµ¹N>hg® Iù¶[ / ˜l¥1Ñ0Wå"pú@ÀÌhÑ)L‰$Â’u\8ªñD1YÜ®¿×“Vö>½;î÷tÙpÁ Ís©H &G‚è'ÙOµ…ˆ~Yúb½·x|1ËÞM3BÓ*FK6Õjek¸¶‡LÇ«X‘¨x88ÁÎS‘úÍ´Ñy2ßGa¯^w>E—Nnœ;•î.U»j!î$ÁúØÐç† Ò²ç!ƒ²BŸáQ-Œ×–ŠÚÌ!ÎW*unžŸ‰ç–‹d»™ýÂñ†fOH-k@‡²‘oË|xÙSi6Þ&giÕA±0÷qô #›ö|©«v9ý¼Ò´¼×¢‚Χ Ö噯yœðš^­è¬x¨ßúÉŸCŸúä7ú÷2•R¹Ví!Ò!HÇ5b/ð˜ vÊsÐ3’t“ ™!Aï$¸,‡œIa¬´™`¸0µ¨‚5—¤É„甲£*–V¯×Ôµ®´ð&G .¼-×ð¾3~„êà $"°¦F!? AÈš%ƒ¢&¿ž_ÖLGɺÁ\Û|f©EVð§1§`PrQ%DæÏ‚Ï8 FKAÕ ÃH™0B†¦Â–"Òiƒ‚"rbA^@i …bzÇ#—D]¦ŒÞ)ãëú’éC) ÉX€H'³Ñˆ§§½áWb¥§6*õµÏû>º®‹`Û¿ÝÚZõ ;Çãøâ;éK{Üæ¯y]m‹³Ž´œ+’< Î,§-\¢æ†zàÉ¡f¿ˆíaG¼õÍÀ43é^tj(52€Í:êXbæYXÓkQRI‘Â%a‚mÒIÒdVx1js& |e8šÏ¨ ÖBÅèúªÞÃl]oÆBˆ2á“”#ýl¥M~aÚ$  V\’F²¤¬‰"’F²à&›Ãج±K2a€-,éB>³sÛ l0€DÓ\ª‘ƒIÍ\·Ëvy3…)¥–2à@hÀTQmƒƒÃ"|˜]¬Rg¸öCYœ,牄 !Y ¶Ç–6Dr"‰!ACqDÄÂÍqP"•’(²‡—†W’+¦L°Ëìv2že²hÚ˜V"-6tµ¡eCzÊeréÁªV®aàätûáõù•|ô8y“*T3}tÆë²ä{Ç;ÕýÌš°®4)º]v¶»b¥Û.zævNŸ´òÎ׉#6GQ‘¢^㾎ÎYb sõò”›7µXIO€¼_¿p\š%\ã[”¿°…$Õ…£;~•iá^;æ¤Wì FB*ÓvÌ„íÝÔ+JoØgŸ.ÑWW-çóKqÙcé:ãõ­ÎŠçëaõ^—RYB—·Ÿõ/=–kòó]{¾ c˜w}Q"©#ÄKL'p¡£‡eîÃN±<™)¡Í§ ÷g'ƒõ½ãÝ]É‚€tQ¶`eÜž#Þ³½oY^0bFÎkb”¹>ßÚŒ‘dd§È ¼Û?nów¹°”œ:cÅ® öÏñ‡ŸßZ\= u™»ŠUum­ åºc ¿½~{£ÿ\®/•ÀYu0ó§m¸ê:Ç•?zÞÔÛ·½þ ‚A}üœÏDýÃÚdÕyd®×_^ÙP(& b›–ÖÏlãæ6_ÇÄ Yð¯ÕÝ[<ØgÞžñZ´w… Ÿ·5h¸íés*”ŲҳÉâðA( ƒ"P‘&â䘫÷1ñ’ç—ˆÞ³I¡ºKàHµƒµú¥þü¦&¦?Ö™f˜1îå£ËÙâ UK”et\AU‹9Ák+ÿ6ïÂ`Z{ÅL¹Ï¡ÖÙ; ± Àýžú÷=üZo}½‘¿„KÚî {jîˆ&m?çrêzO_UÝåSªÌöúœ¬•Æ‚—¢Ö>O·Î¨`œþ]ëç“É|ƒÏÏ{iwÿ=‹ÓÕÔùNÖKû¦yÉýcHïÌsß||ú³Ãœb¤P`ºNZgAšdÏ”(Ê¥©Ï€fôÆt\unÝ€ÔñÄ"G̓)3’mзs5Fý³WåN`¤©\Æ7¢Íj×<¶xšýæGßïônv¥Ÿ{zœÖl-æCaÓÆ²[ͦ_¢Æ¦ýßÎͽÍÕ‘ƒ¨uþ/ÿM‹úýŸ>sZï>ýâ_Îýrü ÜuÚ¿ë&Ñv Bd‰†Å)w“ŽÝ+ÏâIÿõçúÌœ×îïŽuôü蜞M_O™|èƒÏgàâmÎuwÎá|Ïþ „æåòªý+k«¥Õ΀xÜ·,Wû}$í Ï“_ûñùõÄ;›'µ†O¡•®4WÒÊ?ŸD`ªúuÆÃÇmls~r->Û¨‰HÖÐeEŒÙGQÊ‚’¸íÓˆMz FéÊÉG‚¦(HŒ¼`™·TGÁ@I¨ 9ED×t½ÏìHr ¼y)RË>_éÕd‡šábÛ˜GÚä¸Y…í[¨ âÚ±ŸÓÖ}-ð&”ÝŽk¹îÀ%Z.“N”‚"D(aµ‘:‘ÐÍóóºÅ#o‹¦»N¼C]þÓç—R–Ü¿›ù ž5·¦TÚUº'ËpÔG&oõ’Cƒ!¥ae¥¨nï¯&oîè«<ŬÝ/ötï¦%¢¤Oƒh¬â($à?ãX]-SÀô :1£æŠ:¼,®eOÌŽÉ,/F²º£ù³üyÛøVoõ®¹^å?öt5U=¤=Ùl6çaÎüµBiã¾@¥í½´Žìw <%¬ÃÔáNY÷ äBUía~F|=ü­›4u´|D¤\1hP¬(ŽÏ$wít¿ZÎ2“’|æƒs]û“_ž¯Níþ"3ÅÛ9é-¥&êô}^teyÔNgŠ›|`uÀ@…¥N{–\›¯ÝÖ×6;†œº”n»9ŸƒÒJÀÊLÉ~įo¸æjñu×j€‘RD€²¬$jh,šre²ÜV Öö¶;;Sv©†9cK°Ól|%}3C¯ ní¶ž·r®qöô/M~±ŽÃõ§hHø@ddc¯žuneåÆžp–°§¹^xUkµ÷µý|U¾ÝÕ… Õ^éƒjw6n¨žnAN¥S‹e‰Ž4U+wëDî¹þ:jÃ»í²ª²ZT j:fÕ›(˜80[Põ¸©ërMŽ/Ô²ûÎI^{(æ-†ð$I6ÃÈ8-‡+ÔN¸‚åi[*Je£.¯b]AŒ‘Sß?¬ë˜Šn9Î÷×_j=zÖ´uêÇ•î{Ò¸œ\û\V­ëD^>Ÿœ2÷õº÷Ÿâú|‹nb»1:q–°o;‰¢Ž:Aj 4ÐóîZ°&ž6™tîda¡ ô´ž/Õ:ÎsGRc3=ô/«ü„Óîó ê.ˮ̤ #FªÖÄ{\Í1Õv*¾Jú0¥ƒ G“RŠŽ/8ã|kÅrTYq%Ðüâù“Mɯ®.O~Y%”,à˜q`þË ¬ܱŒDìÐË©F4²C@A <¤Ù–œA¯¥ÊYK“5H‹‚s(9 ï“=ðs.ð.ÍXžªÈƒv“,°Ð¡ :„h03ÜkÔ×À ð›Íò`/à»ö¼É8çýó¾þ?Ûe¼áþt¯Ç‹õÅY’2ý€†Ü¦é ‡Y!)ßêýpÁ4y»QÅöœ(‘‘£”1a Q›þˆD‡D¹ËµoFRÆF<Ò¹pµæ‘¾½£÷e™¡¶#tÿ¹M Åäd¤Ø/G…U&pkL žV·ƒ& I ã±2š´˜ª9B¹¹R©øalë†û’·+Ä4ºyd½}´Y±t«q{7ÎõKô³V¦çÓÕÂY-°-¬‹q2TL%)·»ó5ðÊþfV³Ï,ÝÉ·I‹Ã³GßsühöáÔVúFWÔ™**r5&s°h&é^ä¡O _§qÛ¼Œ[–¬Á6RƒŠ×áìÅýº#G\óvê£éŠÞ ©k‚°öšM2Z‰AÕE5[ðaEÐÒû¦Ñû n KG §u>òòöŽÄ“]‡dŠ›»^r¦?Áu®÷ÍÙÏKï—ÊþaB;üêýìôQyÖ?.»zXF‘HµìôŽNåNŽ«ÁÛó3dD Åä:¥ïž8Ö¬äY¡þ¨v’~øö œ}E Y4êÛɦúûzðïþ†çý'7|^æx¤Z-r€fZÞBvsÄ¿@·â­+ß·b’»\èÜ4/â—Ãꇫ™q}w¦ÞÈ×ê OT(–ôŒî^WU &àFDÊã¥Ä]Ó€„ Ú¹¬x e-ÓšÌjE‹ @wÙ87 "Ë‹Q!Û™-˜¾ùt-C½.‚„CФ:p€àÜbþÓéc%,MÓå’W‚+VÌšý²½T©6ƒvK9\Nµäâë$s”6óßÎó«n¤ Á¬ò“™VL€¸@ˆÍ"DT¢@*5F£¶ac¼âçŽvªKÈSïæ_äÅ º2€fX‰HiWn>Ó9¶{x` 6Ûlkšâ=ú|Ôd®öóàôé¹êbL¯4…’&®Ï¼–žzïs¿´¸½Àóh‘™ØÝB¥ŸÁî)úbj§ìB¼N›a?7€b„jI ÎÖˆý+„u¤£këí¹>üè°#ÂR@ž3Š-+KîÌØLLû¤=äå&»¸]Âb_̳ç™B[ky˜OðÍ]9Š¡d;% ÝtæZJ”ϺéØÛYe×DYD ß묟4㻳¹–}yïs6oó(L,ou·¸×)Ô~›^ÛNGiDK!DÁQgT©‹;u9#kksÙ™Bð(w˜™n…mšÓË»0V Õ «Ãó›Pû”vý‡3mýo¼Cæá© >üø|¶çº|âÊ«'¦nÂøõž«ŸÓºÙ&ΠJQzˆÑŠ€ƒ çÚ¯_s½Ž-æÓú²±@’VNß¼ç/’á\±¿>_÷–ß¾©ç«Çù%?:(®ö\|žÇs¼uÔ@McmR}ñ„ùÆ\¥Y²N\L³½¦:xjr«V¯üèpŠ,®¸¹¶›½ï|öð¤ÓkzPHa¨³–°ÄĸŒš˜‹iåf•˜ŒQ{9vömç3ûg°–qicÎÛksµ÷æ½äÑÛ1S5k¹ù㣊½Ÿ{FÌ}½ δAA›H†º¿¾Ýñ¿+ðGïà´ÜvÁ™%¨Nù1¯ƒC!¡$°!Âl½þ!x>yýöG‹B–T¶Ù)õÊïò²ôªa*um®Õ«ìs· ë¼úÜgR©94{l‡5«¯f È{ýÙõuÒx–¥lÍäùáÛ«K¡µ7'œŠïÅMžJE(¡¢J,ƒCÍ(D¸ÄD›¬Ç¿L_£"ÀÛ€Þ2…É9²Owÿµ)ì’Ñ uÄ…òrãX`›Iúçë¥GLl¶Iãá _v ÛæV‡ÅÓt›|:¸BÆL;ИÛÝÕt–Íe9ÅýLMΩ`ŸØêà¡á¹æc*xh ‡!£;ýüþo÷}¹\\†Wag.Ãê¡~òMY-¿i~5Ô‘žß¾ÈΉ>í“þñiŽïëýùb_iú{ç zλóWæàÎÙ5 œcGøåáüYçôå>¢)*–½á³è9:y}Ö _‡k‘\úù”|0Ö¿èüý2ç™øL^â*Ý4ǶŽô2%nñ{’ØÍôùN@Ã]ò†gʽj?é]Â&¥]D“Ñ à«ê5—@£))ÓL²9Ò7Mˆ¥„AeETcg†e#…øÜÛß÷Î3ýÙÒmr-+#ª'/Í!_ÔÉðºçŸ¤º'žX÷ì¡s©}fL›9ƒ¤D®vfÊG ’dØûJ@ævº›? Ÿ‡<;ý=é…€ÄÄmY«Zî@4mÙ3éjãá)šTüÙ·ÚZU;!•Ó.µ, ·ºÈÃôòø Õ,VœÁ-[ÖºìŸI“’Ä<ªh¿§ÙW¾{mO¢L´åáAíÁˆԨݎŸ&$BŒm[‚vÇØ$g¹«òœØ*>ý¨J¿6 ¹ZWþ¡é%$k‚ž«úËlêäüCÉ&#âxíd2ãŽöX<¢ìâÜì¯ê!¦Â°ã]À2#[oäÈ6[Wú÷—*ÿ›£?ì¶«aEÏ8ä„@\㩃G/URsÞ¨àç?º»¼úràj„žõxMUÒÂ}Øâ=sÓÖhƒBÙ#ˆ6„ÜbÓ†=t¸¶ÂÌjZß“Áí˜Ô¦Ùè Þ¦&ÏvçUÏ^Ô·¯5Pó£~a?Vnñ@GnéèÛlÍKÔ#uÍžµ‰A_ö¾É¡Tí‚Ø0aûQÕŸ¼”[Õ †ëÈJŒ×}W<ŸO®3Ô7s&!*"dëû¬½_û-©Ó"îâq“?ëõEyAw’ÒÁ¤X¨Ù9{:©^6›ÚJÄV/ú0®Þ“L¯•Ò ôž´F…ž“\±ª–ªµ÷=enõ6Ó®ù›(Û¦0Nƒ£j¶Q‡ ÖZN%¡¥N—;••ã#µíjt`q¹lb`Ör5-£¢‰NL\VýƒiÁHÿÿº³îΪ:¸Ô©’gû«÷ºÂó8³/¹„÷^f½ìv¢'X¯dݯŸøOþpþd+wÝŸ†Ý¡¦2p­íæ¤î>zx-ÐöÄY&=NJŽÏƒË t‡ÆV´˜éýhT4LÁœÃÎ8*!÷l/`s*˜ñÉp‰ Íh}±!ªá0ösoÝ Í!t<[ ¡ËݜŰè'dXd€úØl6²NK­5Ì5¼^Ÿô¦£f¾¨å§!‚vŒ¢€Å4)MùÀ»»#©ZË_©—K T€èKUB'0q$Ž`KÀAi“ü|ózAгÝ:–Ršö2[róµq­W¥æé(oKE¾VP*²£"ëiÕtÐcŒÇ0Bë*rfÚ)¤âõwÖw½_¨½ä™Ÿî*ƒPéwóYu@5#Û‹ûõ&qçƒNÜ[«ƒ—ŽE~[×/öVÖöôüùÚ±U·i•-€T»‹D…Öûn°‹ïãQ?Öíä2·ûÇ\x=2õÜɵ‡ë‰U»—tÉ–ù5ŽâøÉPZžÆã jÔ†ˆtK5´ÄˆÆ …Yî7²Ž›ßªòó8ˆ3û¼xŒé~w8âÁL÷JbÀJ©«f³L;1™X*+DÑÄOù«}k½Öõj5ÛÐÞ©deiq´øò÷cíGL©±¾z Í ´„ª¦Þ·1ãq¹.Âàµ;n„A?Ønzã>!÷¦¿·ËOõÔ¾\¸†fp˜&÷¶­¹ÅÕI¸öæø‹ üºÕô¡]¢åŽÃU{=|Âü®2õ÷ÝC—àʶ¼º“f[) ¤™Ëö[ý7h-gsfup ú´¼»UŸ¶ØWU»×¢:ʵúD„Ð:BX¯Žšwhã ƒKnçÔ¾uב[}pœnJŒªly‚1 êAeÆ£S#«¡;ëdF0ŠÒaß=©×µEhjî.yβùÏùŸW³›Ì_ƒ›ærcÔž¬ÄÂÖ–Ø«ùìYcÀ¹0i€ꑤÜà7Oìñ`ã åîŠñ‘ÞÍ"C37#&Ú€Q¹CÚT£Fâ.uª÷cYgÝúwËáõ M0}³þ§Æ!>’pˆ ©¡®v§™tÄ;TË?žÍÈnµÉOEÛ‡éD ‚ÙÕ…R>Â_·†WhklVÈCá,ðp®ÂسÛ^ç÷7_?èÔì`Ùßȳhs£QïõhnW‡EÞÜÞ¹¾Þûþ+]#½ÝÔeÍÏ:GJý¹ÞnxôÜïŒóþåóO ½:Ò•Ö:i[Çi×ùIb<úÅz¾¡E¥?çÅZÞ!’·çG8ðR ˆâ!;r@3{¾¦—›M ‰ª§Ìq3õ äãBjn»èËç¿0 ›ò‡–ËI‚û% Æ<Ò)kÕi '}^µjà°Ò]Ñêª M'©)ÕY5¨XÕT>ª e±qvðô™Þ‘µZ캹 ÒQHî-³º³ªñt¬ÔX{e(E…KiqROEÃaÏ·rÄ+§ËçGweSª˜xLë‚,/†ìVSÝ.íÜ m¿p[ü¯IܳÊ%MaÖ°ãµ~¬êŸ>Öÿ¡N?4ßÛ„:`‰`,YS{ˆ)– µ€éäÍüˆ#vg5Åܲ‹W Xp'D,AÚ*±@00ê½wŠ$¹ ÕørÛngHyFÆf i‡¿˜W¬NôAˆE 0c¯îžÐt .ͬùÞ+&x<©JQ™Åj…  "Ð ¿ Ujâ‚…SoUåÜøqò)3vÎÄ#&¢ ÇѲN›Y0F£ÑaϘöÓY€ ²„È’ðaÎ$…I’°© … "‹óyš˜å¬cO:y0ëZrñY/p<¼øV:vøi ­±B;½±ÅÅ}$D±–¬Å…i¢ÌÐçßè[[7a®?–×ú—¥ ÛR! ¡f‹(t62ø¨EòàQóE/hf´_ 2Âh‰©ÖB»(>ÍÜ`H+¤(2mÀÇÉfUUlbCüã”uÔÍR ñ!‚€/6;}# ÑfQäÊS£n}«ÌDƒ¥FüR(šŠba’‚p.˜´®“fæ°™çt¯äÜØ7Ã0€Ü8ð‘ÑÌg5"ÖMs²žØVØÌ\\u÷Ýö8$*4¦šÍ¥g)A`C³ØQ +sÉ š*KdIÁv4®Ám›Ga0hF ,0¢Ò(D¢°ÐºÔ¶^Ðz´ö:s}K®U¸H× éÂVÄnx›Úij]m4Îã}7ja»skÇW¬Éà8®¿z~4ZOð¡Ù;-{”R›õ÷Î{Ò‹(Ä’ö[)n1Z!A‚²Ð{ÚQJ­2bÕÜt÷Îëò,hqö6k)%¿¯[ÆÆ?fïrtâ¦à-T3 G™]F;%Ã,ãr_,Åâ}þA˳r´ÂÅh„3\öÍyÖãLww„C¿8,a¢ÚÎ;O„4OG92]ÚºŸ›Ì1H‰é©|¯ã°Œâª³òég¹[ëì–Ø¶ n²|.¬Ï¤:œü^ùŽßãô{]¤}Å~k¶T^îxȈ”ò™ 6´¾@ЧA †ä"©!À0ƒCðó$tpÂHT0(ïw\®ùElÕú32ºù@s´Ä+l‹9ÔÝËwy æ}/w"ÿÎxì\3XPüŒ—:Ði¡Œ³aE·ˆ;¿üv×Shú„k0Hh2/HÈÎfrm¿¼zþE¥õO†þ™××ÏýO•WŸc55«©3 Ó†Š|'oÿj޹µ=kk.)ÞµJ1fò‰O¸S‚”´Ê˜«ŒÍ¡myv®¢¦¦|…ë±…œyžàsXŽÅ´¶,+†Ï‹÷ E» d(B"”tCy3©CL9ÃËjÕh´3¾:#ûl7Öë–…˜¤4AÈ 5ßpç,nU|9fxªŠ¢Y|2{:Ô¬ŒHv–GÝímZk'OC¥y¨¥ÚÞâ·“¼N+®øÓÇš(ò ’àÎJ±µJ‘ B%€U¤oúyó›õ…Mç쨇¶×£¦ì‹Tš®çS{u,TS2!²8'bÀâ˜783›+_o£Ù»¡£ƒ&c²0$úiûZ«Wñ~Â2nõq<»™Èi4Ý„u.Ä QŒ°_Ø–]úAéZ+é ¾{lžÿÕõ¿ã€dœ±.% §@‰=x,s að9OÒ‰wÚåé£ktk® oBÛ( pȵÀ-óãŒ+P0;•¥¢ ,Õç èyÀñI½uUN(‡—Q.¾žÇ(|>¿î«C÷”Ïóƒ£/²ÏΧ=3}óÉy~ö|Vòíû³óœËèÄÕ¥¬÷¨gð_Èÿ:æmÑñp6žl79ªµ­ø¾Ÿx–S:ò, ß§i¡c^)Åï“Ï…?Ó5b&$Þ1±LqvÁˆ¶ÕŒùš˜cyÆÆ3-‹ì0jÛÉ1~Ä#èZÙi MãZe"Äi©™ÑêMWÆ3\¥ü¢[0·0³5„èe¦”IÈn Úfºe:Ñ­çB G¼¿¯ÜíG¦²^23èÊé™âª[tV]½Ž |ÊœVW›´FÖB÷–g†d¦±êÁ«”–èðl|wØ'ž¡Žz ì`Ò¼7zlq¯&dÀÝ£q†/IãŽ"\üÏìÆ> ßSå爛¸Ç‹5“Sâž,\²îzUaeŵêì ~,&»¬…±%Òº’ÔaçN³8xˆ,QyZC–µX|OÇŸruš¨a­>ÏëO~­þ”ùh=‰»÷ú$y°÷Êöi{yi¶Vޏ@ÿëÿïHoX«Í_DŠ d3çYv!YÍ=M«c d k)ßZø\ö¥6wèVUº¶K{¾ö­ëU q0 ”ä'¸âx[}•áÌl„3YpÃT½„ôò2U}SU"W)Zõ×c{z<Þ…>egêOMìPš¬JσÏѵ2.©÷·Ä_Æ~Á) D hUÐ6È-¬¨R¥=¥ãa'â¶¿=ÌnïCòæÆÒl©Èƒîdd n‘~ìÝbï‘hqþ¢]WX$3íž ¿fþEþí3½þÚ×k…+±Æö¦€Pïþk_ÖnT¥)eá³·\¬}Ï=Òù‹ómuþº®«0wsí#Ì86æU‚â(ÈAY ŽköL cF‰ »sñîÔ2‰“U£ ¬ƒÄB’*fÑýóD,”Ñ”¹*í6X¨ YÏ«G]¤ e£ëœÝô‘AÏðUsk@ʶ ‘·^›.–{£Y³ÃF™‚UžŠ€jaY+Ø•C€Ö…ª¢:¦¨.¡¦Ô40% ƒHJX(±\ Fñödý¶•ÝJ¹ æ’%48L¹©òªMæ­q´Y‰©ä¦#6Ì…Cˆx¤„hÿ²«n}†òž,Y" e pNù#Çö€1ížœWìÝIV‰ð k¤FïU&Î Ãj5d…ÌÊV„ç3ÏÖhDè~¶{?®¾_ÃëZÿ+E«GºÏNïDƒáð_Òâa>GzëyMâà»_^³êôã„å* žoÌ႟ÈÝW0â«|äµ W–iz:I¿©GÇzu(¹W± º¤NîA¢ bp!ÒYpmnn„Ø×.Khe@£z ‹›A%zÌ{°mζ‡&¢x¦a¢ ÍPK\»§éÀH„†bAì1¢ñ$£ —PÄaª2ýÞÔFY¬¼åݱë»~ííú㱉üa9ßCFÿ1èXéÀ xSÎÛÊúäágÑÔ–=)WÐøA¼EJRŒQw»QÀ˜™Q$ètu'™.? .Î0c[´³èÌq†@ÓÂÈ<ùb?MmðibN9 —¦Uö½"rfÿ(¿òu¼ âóšFµº2Hƒ”µRUK3›ZöݰP,ñnHI:±:MdoË'ϨÛÕáu¥[xž±ÃMßÍÑ‹1ˆ-'1ÙXØ’ÂÔƒ7/ØHìÍ•½Ý›u>OŒÇɾ* ‡¹•›k•Ïê¶r*ià Yèe/À€Ó•«V ƒ1í-õWÞïÐ2¬ ·À÷rçbrt¢r[N}]‰oÈp4ÈÏB­Žcîz}îJíî⛉ocs~£7ê­P¡u &ÐÞ„ôSÏ¿Ø{k™Îs<~zúŠâ2k*>ýó|ß¼‘Ý?vÏ÷ã†ÊŽj0O?ì÷Æý˜?rßrìž¿2ƒÎ1úq¶öØŠèÂÕék‚®çù<´²Òꀀs+ê ßÕú³Mý\ìÚÒ²[9^¡MQvÁ99ù]|ÞaîÉ:ê½À~øây¿™5í P×Ùj­÷!‡S䟸\F¹Öè§½~÷•¯Ó5s·êäŠø¶÷øþþ¾}®;ýrØáÌJô"š·@zÓméù0eV3Êà× [QÆèts…½à¬ÆM‰«¥¹fq⇀ø¶Æqd|ŸãÚFíT´@¥ÛhZîÔ ‘!cØ‚N±¼\€ði³4'VâIÚ´*ϼ˜bÞRz–åZµíµ•BBHÅ9ö[(¬á†WÈ.Ê ÉGtfæ°% c&aEötª«Û»bLÓ;óŠdó?ñäNúãþÑþ?'’ôH⪠…ZTåheÖNМsæ®üQÒs‡¨Ø "±´ˆcÙ(±M¿-Qˆ„iQ»Fb®_·/\¾-štOžÉ"šAÅA7éˆS¢–bj=kæê?:ÞI;RSk`Ø8íOëIÀàû®°¢kÀ Ï8€qº,YòOC›^´;m½ž”Hð Ó¦Œ%–BšIYÅÎå Ș€’o– ­p(Xºj²¾‰C¸sñ­`øBà3yôJœë!p‘^L…‰õû͵ö´ƒïŠöš+GÅRaèÛnl°­õýéFV4>e¨ÓÌ•‘eG¦sç‰arÁœõxV”©%Ír·h…çÃ61ù5?üWý7›>ôÅÈèÓŸT3‹xÿ8ð“Œ¨Š€V8|3f ¦kH$b:šK´ÀÜ£XØŸôÄ8M„ÿâ‡ð¿“Ù‰°'Ÿù‹D«6¦{(z(+„xìÓŠeµ¶Á‘”0À("ý’›‰’‹œ©"%VíÍ6[ˆuâ²RK.†°²ÑÿË 4p¨q¢i#8ÁRÁÒ¥S›||UYRÈð!(å.»îìAfb«©R Š“$ÙxÏI›0Dc V[*9 JŸp=Q”óQb³Únm4PN2 ² VT+H°Ð¢¤$å©"ëH^ÛøuÎüú—jû_nìvpw#»z¿ÚHµØ4»]ÇjÆÜDµ¼ŒNÇõzÖRXiûT_8'ª è!²$#°´/gV×5ÜAp”*–öã…ýRÈa…}0£é;Zûfí0¸.TC×ã}>ëC§êlœÂgûíëŽLãAW :Û30«ëDÂ+ÇK­gº÷®Þ5ê–£³/°/uG`KïÈ€ßxŸE$H°±OÈšÜ3ûäÂy¶·u†Ñ[I‹áh³ï—À€àÄ> ³ÚÝ`>ôLè–»ƒ(ÉJÃ*ÄýÆä’Â…\yÊ;¿èÁvËzä”*·Q’&màõîêª ó‰Õ`ë½^Ÿø6ôgtû:×ã7L_ŽhÑL— Q*yˆ•ØU|zwdzÀ`KµF+òp·’óHä*%qo™> ø¸£DÚh<_.˜ÚÏ5Vtfòzgs~´Ïµ~>i0C ²&iÇ}Ä™{ªÅhí=úë£ò§ÿw2d.ãON X /fÿG,ÿôO¸óï\×ÚÿÁwÖ?®ïÞw½Íÿ8çë÷¯Í×õí±ö¿Žú‚Ÿê{×õvþö3eeÊü\ëêIq¢Ó50s?ÜçgUG¼µ¥nU8 ³pÿ)×ßY¨ÊënÖ9ª•»ô­êóµ(D€GðlˆRÌR»Ì.ªÍ‰[ãÝmî —‘ÿŽaP¯_'Å9g^ÎKûaó>!Æà+YÃDö¼ßûµ%gËÞþmB!A EGkxÞ/ù(ÖGÎ÷N]˜%°ƒeËÕ.Aq¬µ« ¾¯‰šwIÄËoÇ㣽¥'~¼ˆøzÃØˆ¶Ò„npj“èè Êåݺòsâòˆ_x>¼æÆP#ª·Jˆ×ª)Ø>9„s«ðººlØ1e-ˆjw! ÷Wçs¶É9;z¥i6*2T¹[,×®u~âÎðSŸ‹*Àç2ÜP‚G+ ùìòè|0ðÕj ½öÜó_|º­_¥ÅnGwÑûÄsžÏú°Ë÷CÒÍLt]ª‚ñʯín®ßÏbNÎiF—Üûae ¢ÒÉ<¢œ„C…yi(µØÕ=îúI^‡†¯!¨*dzâÚíÜYö"* díV¼hŒ7¥c휄_q?ÄÍî÷…à5Î%±†L2PIÃ-ÐÀb÷|7ÐJd(Åfà"3sú z£›r°¶÷(t#ÎR%0ºVq«Ü[±§…QK;íg±,3æ’ê$Ul…;“¤ýyDßf2¯Ìè»Ì§7®øË=Ú´:F’5þ‹›_±np „ÚQ›Ú§väR¢¡aNçÕ/é ¢¸Ù NÊö&\çè3'.©<-‰”XhÚwGïÄ$ŽL7;òh?f¦‹qgÓåÑN`aÕ%D団-‹—Ö‚‘=‡njˆÝXV< j† z‚Øâv-ZÒòH¯"¶K3ÞLOŸ]{¤ÜÎ…n¦o?[î+N€0…âà ±è¯ü¡¿$Æ C¼ÃÐh”’m ŒtÊ€4 ij.ÄîLÛÐzÄG«ì;ûXZ¡Iâ!TaÅüùK{IBCëüá3fÔ`S`Ë™G³—×Z±’‹{¤‹¯ncY³Â½¢š)ƒ·À o ‚‹Ž¹ÄÖW¦~,n:ÈhÉ S¼V¢4ÒpGË*jíÀYÍíÀ–Å…Þ½–=I³uì¥$j$&¸ÿ§q¾» +‹SÝDìN$6J#æò‰»J—¥ðŠZ–†*¶:xZ\ìi(=iׂ¹J¡½±…ÉÕN$_(›©L+aA$H©A¥ Ü"š¡š®'äIö`m¸\ŸZåɰ®7Ï]j³yRæTÃSnªIõ`µHnr8™Óª¦£ìˆfb˜©p?Ù '9ÃQõ[¹U:‹<ÿ4;›q½ÅÔqÁyá.FDö¶s™µ¡›güZm‹/WgQÿ%äßÀ;}Œaåào•ü—RüoÔü—ÿ†ñš3¿úb5Y-öô>{ã\·›‘<[ŠQ-›Q«0”äŽ÷«óŽççö$/ôqãé¨32%$Ç#"CÎe{¢â‘Ú¨)BÑ%l!oH€Hfq'.©”±A6·±>•ÖÎÔ:z×±èÓCd}^…}¿Á¯¤è2:Ò(ƒ"\30¯·/ù+‰QÁ{µÝ¸ =«r{´páë°Ê 3 ̼'4æ¦e:ɿܠ7 %4XÆÚ’¾wÊð‰%~½–ªôMpä^«ÅˆqÂÈ£FwK/Á <`bÄRZÚ—­„©ÑœÜÖù9ß`^kþ:7l«´¹¦¯Ês<˜Ù}Ê9a²Xv\…_늬4ÕÁÒæE_VkƒLs•b“èµÛ[íÃ3Ûò·o’¬ÜÆu¹rllûìJ– õf$ø£‘ñO¦ñHè‹c½‡ñ'” W ®™)ìg+ó§0›Ì5‚9Ri1h öjSý°ŒÙW”Ç•Û çw,å³¥²Ý.3­ûôÎï+ÚêLÔ‡M a=àRuTÜû¾z‘–lFŽ“¯ÞΰïÇâO#˜CóÛÚŸb/[&yÔ³TÊÈ^U‰±É 2bëföp‘XVMs"Í~y·è´…>Žáw?š Þéã\ªårïY—o¾êA‹ëÅEÅ*~/'h}s˜¼ý$ÚùÜýÌ“q·¥¡?°³fçòÜö˜­¡€ìµ­·Bð’b<¬U‘-Ȉö²»ø(ÔíáEh2¦'Ft £«4÷8a×ý©Ÿ1®«”PF¼z®‰ŠÞéTIQ.G¯B­º+Þkw‹ªÙåÝn&:ïGÿ›ÀÀ­&c¡jŸ:1þ¤€¯»Ù7¢š¼—}¿“ÜBCõçœphγ¼6âêÔq–húÞ‚p÷ïÃåÊUË÷‹]Å]—?ãV+áŶ~­²]iª> ú6ë1›Gì‡Ê©ø¬–g%oÎÛ§ÑÍ|ådzì{k `ͦëpþòÙ/¼-=[¯· —{«ëµõ­'ûlÏÞWð “ï×êKºÃÿUþ"ú~;J-UÁíd/Îý\úi»÷æÔÉì.Am_S^$BÅ“ù;µ!.Ç‡ðˆŸ½3‰Ç®¯³¬¶‰Ò˳âÓ5ðš½òη¯¥Íš²8)àÔd䛞Zª‰ £dT ¨’‰…U õˆ=¨IøžøƒË— Ø ²A©²džQÏP-ëi,ÿ}ÚOÙÁÄ¡° ‰,¥cÂuû5Jócœåh*"8¢3Ó?gü›îÿYüN ߊ¿ùºó{ë¯ûÞïÉûsfu¬!})Åz]íÖ$U'aæggñ‹|ýr;{ú£Ÿ*Þ2Ó¼—}Š£áU#sμр54M‰5Ý?SÃÆq£ÕBŒÇátßð6¢:Óo×¾.| 5%d yJ vÁ "F’Žfdên:{ňþÖ7&=r[ß_·Ö¾ù{HMÉ f>Ë¡ h M…yñHN¥n5MœŒ6ChÎ2 Š_ý©­ ‰˜LBËxYêçe˜/­d JŸBÖ„MFIr|Sº4Ãæ,¬ô…“ËJD[|)<%Ö¨Ó3Yh3ŒÑÒ»Ü,rf†¯%éÃ#°¸ÈB‘Xi@¡ÄX…hfÐÅæ‹Ìr—¿çòÄrú.fî¢{¸ñO>ªà0ØO¾‹7¦ûh˜4ÞâÎGJ¾/vhF^Ç¥“3—õ((† =÷&Ï^ùÕÔÔ&pá¬TåÔi°/H%.¶p㉠œ:L/¢Ma¤&âà¶Ý±ó}øh;54;ù‹Š?I[ZÂànܶ.‡»@O”ynÛ­ÊêÂhË&õü°WÃöŸNÄœQ°©Y‰‹ïój¤rÛbY›‹/ÚSáš›k !g3Q¢E •Z@¾%ˆÊ„&,j’ŠÄpœ†s*M«'pTòýŽÑìÕ:lL²ˆÊ«Di›­W1è"*­…pÿ8ßøí#~±•Ùc¯t”ÕµzOk›–¨Wù9Z–AŸ«4Röb]²rŒ†}çÇR×” õ=«Rûz÷伞_y×aU»ÙÝ”GôR¼ôÁ³JíÚÁLí½³ŽxÖæaÌC¦O$vÂ΄EÁHh…¶¹|鈑9(7ð~DïæîsŽbžIP¢¥°¯%§«ÀóÔ]{÷;6>1»7׿ДB„²¹ Cö½y®„E‰Y'gËfRº=6{ Õ§ï'@ä^BBÈ[Þf&ö»Ÿr;úáRx0‘z¸¨^drã[ÆÝwÍGPáîr˜²`ªR(á'–+¯ny{ÞxÁž­ªbeJæÉèéÄ9X!ÈUT% º±|÷±ƒ3\mPýr™_Öº”‰à.®“Xó-©ù‹ÊLüöÿðüwç—ŽŸÊšNÝš®4åÇ{©žhDcŽäžÅ;ÿâø§jõÖ_ÿ¨õ¯ÿñƒ¿üÓúÿèçþÙïs¯ßoœž9×oÍý)ë ¥ps¹<]«ZWÖWž›bQLW2í¹oöz-œû>N‰Öx 79}˜YІ—± U±ImÂ&–üXÉ1ÑÞòAºÏësåõLz‚tñ>®äLwìën%N»êÊÙÐb~ÿÏðío‡Ï¿#"Ä?eãÄú'íAtsÁÇôF "à 8Íñ:!Õhæ„…P˜S«•# ZœÇkû÷û/-õR¼Š“……Xµ²¥£¯%I QhßëÞ8@Q›7ú•7ø1àvá£âèý(bäÕP†"DwjA-¨@ÍPÝ­Åüëõrc¾+GÎÅlØUÕ‡É"’x"v©¹‘ÑÒ{æÊ¸•ôŒW) ئ'#ææˆ+œMH$v½åÊ2*Éx¯WiR—Y“̼co(BWòHÃ`–^8›W PÑÕp ^P/®$"QH—QI”vOB³²±ùŸ€ÿ ;êÓ`ÖÍÇTð³x.ʶ´þ:«ÙdËVE•„à)²L¼Ï>.¾ŠÎœjÑ9›Øâ3IqÖ¹‹]¬ˆXxæ#)H²·ï+4 I6ÄÊ.Äâ«úP<§»°kÆ&y̯󨌴ŸC.̼ۓ+U8!™F:óš³ÈÝ '€|¥f¥$ÀÁP²*å§äÄ}ÜdÒèäúºžÉ:÷@Fa9½vôbc°ÇA8 Æqõ1¢!¸±k-GÕ—’[øë6«÷žG<§´[” ûB^L! æÁµÒ¼&µÌ-¸”4„åWÐΑ.»œæ"ÕG•Ù¬§šÍô ©i€<<‚QÓ×m6¢phZè<Šìöp9{º£ñÃ:I’42$>#¿ßšHïaZ[ gdÉ£ŽŽ5z8qqy$Õ…:VBh __Œâ“Qb´×'ù‰ 0^‰Œ:ã;ÍÇ-%:ªî$"³å.s=‰’¤™‚‡E+ë.´Yè„ðuÐŽ´*~¢ª[' ¼ÎxÝI7W,Š‘Kõ:FýTÄfâSŠ ƒH™£^e5‘TtðPà)´¼ãs¥ß‚G*ÅeXËÕ(Àùk*44‘îÒêhZt)¡a?Bp ۢ߳T³lö-uŽ%<¦ž,{BJ0fYD‚ Ƙ߉áw2¯¬gðn`HIíã>Ü;÷Ûê$Fh¥¼Ž½³izæÌ ³›bQ0ÃLÉÁÂËFKc‘M1…’v HšEs¾%§y/MåQ®% ¬u;™ ezŸë+:DÁd@Ï<ËÃŒP˜ÛwOØ{ŽÚž4Ø¡nhšØ+¥0>YGA%'…Ù RÅìw´`$ÆCN­1$êÊ#½°R(†\‰*lôeä¥ÕŽ 1å# Å›„¢IÂ>ÉUª¼fPU§”,vÜGtÛÜ8Å-S ÎT+ õÛǼc«¹É}"f-Üoµš{wÌÝ­rûÄsduf í)Õªýñ÷`m%EË«¼[âfëì©wÚ×ÍPù«%ö_ç/ímg᎒H¡FAn‹Íð†ýÿ2¯;íP©«¨Îö£¦=X3ënºÎRsi…nK\–Ó)‰ÍÝV.xH¡†R`F ˜â¥µÖLE-ƒÒI, áè8}øüîÞŵ ։Ĺ 7A2j`Q¬,®” r¡±Ú8’ðÐŽRÁpxÏk.r(¡ò·ëec 5;•Bª½Y Äçgš±ÚÌ­ìÝ|Ã*å!N%wÒÆkè:Òµu·kURj ‹G4 Ñ<0zTÙ¶áY‚@Ó ª Ä›®ešZBÐ5â ¥ àÂr\%1Òš’lä³I9p J‰ÍTÒ²« IœÚ¢4åœq„•-*Jö¦äc@Á4«ùް¡(þKE·u·%s\ˆ}ñ5RÀ0¥{[ãôw‹U>lÔ °‡†¤¦1-¤F\d6T=1Lqa6+†{§ÓÜtŽ*~··ý5Í­<ÑõjuKÕ¥ÔÞî¤.LsK™™XfèÑRÌFpLç¥7±Óì#“­÷/¹ð6= ¶(Ë »‰,©µÉ,T1E°¯àº¦}Ò’A0˜qÒXoÍå}sÜ@¡5ÄXo9C¬ k£oC…sÒ\aÈ [€qPrÀGŠ8.v¤·™?Á'ýa³›¨íHzØÀ2až(C•BêèwCa Îåºü-Î|;ò˜¥¥ÉŽ{•œSë (j@väie^âªÓ¹4=›Ù”bÛÜÛK ívã€Z×o.í:ÎÔj: õ»àíAåRnÍšõp3UŸ:ÌòS‚¿ÚC-¥Ó/¿ŽƒROÊû´ƒc‰U6Áy¤£/Ý~½ÕöeÜ@? 7=Á3ìˆNDd UA`'°H~{<õíì-uâ;¸<ÒÕvÕ D#¤â´j^JßôE€Ã<™ý,í 7›_"—x÷}p¥èŽèþî²s›GÆ— ع_ˆ/þ?¸V;&byé\žì1|U:x‘?78eþâãL+9#„u1«c³SÐZã3æñžuö5soAd£œÊãF"Œœé|®h!*tÊ1Cã‰naYi¼½Ã u©Šˆb7T³”ÅÙ+‡þÑÁ,{ôîÃÌ‹ÏÁ ÷pSSÏúŒGû…Ý~5îòžûwt¥ªvô“i›~?779ݵ¯_/˜Ïíýê¿¶sŸ^om’æcv]o̸´s¦ãÁê=&Ü+êáñWW•®ÅWç¯ÕÎVãW®óñ•ÿ âé¡vï ž_݉Eic"–«~ç¼0j QRj$ÀéÖŸÃ/™W,t&Î`bÈ7ñ.yf0¬8Šžk¡hkôÍñ¦#&¨²…’É1k»nÍŽcíMq…lûëýÅù“û·ºïû—z+‰ R'—ê»þÓÊýùãïå#G$%ÐVcE ÓrÝràg¬|)50µœkÖ"E§6¤hCYcÖ%šš@Á&BTÁƒü\dŸÄg0è¥ ÝÈâ€Ï"ëuùQ6.ŽñÉ¡†ƒ4†…ÛÜðÍò è 0” Ÿ ûj—3YW2î`5,‰AÅõÍK¥qõæÞet»ëú>—¼Hm=jt#¶M%³è›kæ ´uáDr8ëåÔçõ¼jØOYý¢¨É°šÒZóKBT”\d@e$^‹¢ÿ}0„‘DŸ “ &')ÀÐy‰ßlëû ?ýrùqû§nz븠ÙÚ² ›\·mgŸ¿µ‡ýÛ‡ýîŒvâ§|lÂ’_þ€˜xyî&œE"à ȰE';Å6ä¸ù~öº^óº¹ÛåÌØYóýÞ¥Cv~\@<ìv»E.¿/sÆ”Y4Wr¶²¦ÎX9ù÷ý{ÞÏ–mdJ‹Áóåÿ·‹Þà“RÏ“'FŒ+•„){Z¢€B°‘E÷먃ÌÕßwߊrœïñÕ%ïÒšÛòÞ Ÿj‰QÇzCßr‡[ëvŸsŸ®Ýöl¯TK´Lmžû3ø,u^ß4ÕÉÖûóíu=Òç9z¸†1ÆÊ'~h‘²ÓMJo¢0*o§öÜ:°ª$@ ˜Bh5ãAÏ=Ïv3;sÍç^±+ZêÜe´#LØPHa²çfî«ù©¥Ç›Ìž¸é1är,¼ AÚ¨lš½Z-ò¼G[ì?;ºÍÇg3gMUpWoäþG¯We —ü6oð n¡Q$³}âý%âŽIglë.\Õ³‘=›Ò°4PBV•áƒæ­ß»W¨ìs¶:‘LdR»|3 ‹ ‰¨ÂÑØ((L”k¥)mÅ› ¥Í£LpV&»Â­œ½¹Éu½¨ôyÌ{Ti.Õ2Ö'«¡?zéä¥\½>nî |b8èN:²jt‚È›yõ~ôbý¸8Ÿ¹óÌêÎ×ÁøW ç‹ú_Aã(#t.æÇ;R¨÷…tüÔ,ÈBÇùÆâë©Ê§²Eì20^fMrè2åS[:o‰×G†êOêù /‘N‚M¤ bÌ2è¢h°¾X·ÌíÞkФ¡Ü,¾ËÕ']{GØ&œËý¹»c·<Í[é0_K¦«íÏsóŸâ×tÿ;ÆøŒQ`ÉÓbUa> úغ\½ýš`Å)«¨±(꜔`Œ÷ëù|i¨O$0E¼N’G5§ @`#P,óa(C ¦O¬|±p¯S‚ïbj’&²HA’ˆ8.íbzT ,Üàžõœæ+ ýŽRÎÕ˜iÀƋåvú¦Ø² ÝÖÑèÜp ÖäN…„ ·ùÚE]?Ó…äKqNlW>Ûyú6Šáh¥dÔÕ¹ dëoÏ_ûQšn©J¦¹ ;ÉÚ­œ’-jâ$˜ÒJW²Òìet)YÒÆsËBZnÌgÚÎçRùß,ÿ½¤<Ÿø¬çâ­öŒ½{§‰_‘hôhµVëÓ|]ùÕõ+ìÇ9€©“MÆc6•ã>³}tþð½b~û¯¥¦âhR! éûÂlráSõ‚ ù R2ÉŽ>"§jàB ”Ó2ð³­›/M•¬¿Îú×TuYAÖßæÑ¡WÜ“’ ¶FÍ„1®˜têP¯õz~”Rp[RŒK{Û*“á†q?Ç#58%$ƪ¨£ÊžÇ>Ø5¬Zð[t¬#bQ‚yÝ*à…̉w4[ôtçʶ ”w˜–A¢È!Ò|72 x½T„E¯BŽÄ-I™ "‘‡BHN^–`zÊÔ±Ï  Pêl×úqûuÏ É¥J¦£õZý%´£î×lõÿìcx摸L›SYÕé¼ÊGW”F‚dŠ7ý¢Ð0½v¢Ñ=ÉljøHÕn›×¤ÛÞH5ñ޹wd7ÍÃa_YŽ6Éc.ñÆÕqÍ™ÍX­ÔvLÙ ¨˜á|Ùø¶yJ|v¼ïyŠþñˆ;‡ó° F’³ÝVPFº+’z¿2=Ó<_àP"ĘéÎ ;AyºÝË·CÊ ÐIþH»W§3wídë¾R±¦FVòšeZ£ 1÷Ö5jˆ”éÿ9V˜ÿîVþ¢Î=*ѶAj:¦¥¦}Ñè1Ί5ÒCcÁtde/%ë¹ãx¸ØÖЦë×(ÔØí¼_F÷\išÈX§‡ë©ììþAúc_mî7²“—&Ìùt¹¹9F2^@…å˜ËÊpÌó>“¥òÛÑ‘š%zUS"Õ^¸±®¥Ðj<Õ7‚ý×è'þÕa£. Ô5•Ÿ!?|¹“íʶ6Ù½°Òò”~Øs‚& «³·rÏ“Eš b*M’9A#<1:™†h./kkšgì ‘fZ&†º27›f¶ªkéÉæ”šËœ//d‘ޏ–Ü€OÀPÖ»ô/3†BhO ˜¬ÅÔ0É2íVÿñø¶œ²ªa‘×ezþš=ûªéÕñåo‹þ;Éú»þÇß%Gï¿ß1ª‚ÄÆû¯cò7MþCšfbòR½'v¢•ûv5y¡ µÐ˜KØD¥Š @†°þ¶E^Œ¦àvU¨äâXHŠnÁχŽUºIÊW÷êlyúŠoJ*‰m1‘’i¥a)C³~㡲 d(Nˆ¥`iöí©ÁKV­p䇑Úg¼c¦Ê*Óuw¯)§^ÕbkðÌÞ×ÇêžêÁè~„¿¥ÿÁèû!qœˆò¬Ð-U1ÔüÕD2̆iоMk’Ù T¥©ÍʹP4t„Deä °”XŒG"Y,Ìe%”Gó%⪖|:A{žÈ:ÇÝUZ;_ó«qxºû_k|•ô ¥eëõ÷ÈÒWëÜždbbá’í·T÷ëøG¯·ÝUc]-/Doöm¼H¹4®3tjÉ(Âô~ã Âj€”mB¿ûßC÷WX¼ÙbòVºîÆh_OYFÑõ¢[<‚_€z¨ï®ðƒ(àðy¶Dà6ƒº=±½kqnÿ#*®£¿_í>ܸ¼¥ÌfÒ&A8ώꧦ±¦æ/çë|•Ú¤æLN¶=é×Ëæú6yÎn‹å|tÉë»uŇÏ[ߪóì;[¸]‡¹›~>õ%síü9È ø¤ž,Ê©á3ÛìZµ”H{Ú²ŽèÂQIjºÞT¯³°J³SR~#ï]ÌóôpÔ/ˆÏ˜Ê+?+ü1-V¤ïFQf’JÔÁçÎû,¾lƒî¾î–´ûÃ[zlEÑúýåb>‹0ÑðÄHÍî&AP€“®PÁa„ãžÍ êAvúZIÙTC Â_”a4ZÿòK†ãEôñeÖçüã>$Uʵ½ÀÅòÖ¿Á9xðü=ö©» dÍF¡ñt‡ë5|M‘·Ö¿ÌéWñ‹§×í¿ kšë¨ÑŒ~Ú¾I…áZozv›Y˜EWñ¥ &Ç—Z¸Te3ˆUp'÷‘f;žýáu¸lþoþû­ùeâ©ÍAÏê×}sI´èÊœdIêp£×5˜jXuBˆò"Q±ðÍÅǺtÁ ¨ÇÈ"©¯p ‚ïäD¶‚TÍÁœÀD“¥Ê‰ƒdóuÖm;ïw_—ä\dDañ}Ýý»GÅãý³¹•v4*œOmgç?âŠï=¾7÷;_¼>=, {Á6?:ofGoÛfL"…Ù[/)µ”dp]/´Ú”@­UJð((80?u”’œÆ•1Û³¡M+60wHˆ®&¬¨(Ê %©ù"È_‹dƒïÂÁŽ—õ’„Ѱá.`CšY!óÉQc$6¥‚C†Žüе—¬4Þ–‹ÐçÉþsšÞv T÷ß$ùºMlk33®dæuæÉd.ç’ïM?M~fr«‹.ȼˆE߉z‰R F) LXY ÁU(œ[.¤¢ÂÓ†2R`ÁLÂhª_bGŸà›üæ­íÛ[{Gòu¸~úœS¹]®·ûoϺfwáÓx)}>"K—ëËû7ýq[~Gœ° ?6¨QœñëåaV›¹æÕúñeî6æ˜b(òÍæõP»úÌ.œrÖñõ9Š95¹ˆJ$M‡s ÛŸ6ÏqÿýRø c+ÍýÕ¸þ8{Â|`*b¹”o"IWÅÚG¹S—&v«§‚ÒOi‚W]ÙƒWùó¸µß&óûVQ« eÁ>í|ûŒ^GoªÑAs¬º†ÑiºÑí‡IŽÆ™·o¿ÎM¾ŽÇ|yÙíM¦¦n:œ¥)Ún3у]ÒæjÆž3kh_r$Žއi¥“!º˜q4¾;€ ;Ì Ë·å¶Q”Èüp&®…«ÍÔÑS‰×•ú\¦rÆñàÝ<±Ð>õÛÇ®Uz&™4·éO½S¡* 6¶«’>Ñ.¢q.µlîÁÍ.¿aʪ­=o?þè:# Ó JÀ1¬p#…–¿yÍ€Ag‚u_d´|Mx!Bßt Væ$@ Æ‘£”^-ƒkȺ‚!=^ ¬fÅ7&™\J­:PGð êÙ,ìêT %eXÜæpd§¯¡…±+ŠÕ0™¹¯9;íûÉ,Çô¾L¶±{dür<Ñ3Ì…geãÏ=c­dg²ÿtÀ%B¾ë,[—º¹‘q¤T“„µ£œ{Ø‹Núú$Å¿t}†»Êöäƒ*Îe”šj×S'}¥×¹ŠêxgærU-…&K4Zz ù.ç§¡•š5ÖwçñLý»Òœ•S,nÄ2j„R tX±<ùamym#Ê ÓWµÉû@S­Â$êcF=RPJ©YC´1*_°7 †TŠÝSãÏÊuè?s¦ÃXBIw(+;ƒ¼ƒâÌ.®:äÔC ƒñÔŒb/ÄV1mk¨)Ùu@f-(˜—f—R( #0QC ÈÉÔW<_åê<¯ãï‚Hˆß'Åk`ÏN^º•5Z¢g:õ>i«‚Cÿ½®~¬_)Ÿ-X‚^ÕÜ~*ï¤:±–U[–åJûàž¤ÄÏ{Ùé¾6]îÀÇ<“lÄ(Ù·ñ>®ºÃm1Ík‡³X£èƦ}4r­~^š··¿Z~õúsÙÖ+¼„[ê(¹`\ÕâA6ü•ÜÂÕ7~Ý)±T“«3}ÔeëÙ å\lÃ8ÊæüO’ãømF¦þÖôØ>…Žq,ž õàC¥(b Ø Û×{àFùÃ3¤aØ­hU>Ž_PyÙŸt$ýXdLÛ¯ÓÝÌ;ÊUzÛJïC3Ø­ 7;ŒL{?ë–™Ç{ØÙí¤÷,ÌÍ3`ÒÝ® §Ãœ6‰«®J.Ì q®c8}CK~Ñ+ˆÍ`±—ññf ï',Îér÷ûow簾{ïÖ‹ÓøÇÒŒt¡OÛê´,éñàÉ!5Œœ Ñ:#Ž6í~ÞW*I¢DÊ#ÞI ©Ö“رÄÄC;VëÕ~Ï`R‚•ot»‚Sæ¾ú_I¦I†Z¸pÑOø¸H¦;`ÁÄк„–ªM²ü±)…@JVv1Ú[IÄO®?ˆr¢PÍ׋fÆ8YYÛ—'îøN+…M±^L¥ÝöT‚äWÓ¤&väÇiË>’Aáà9¸È"Jp|›ks-‘1üÚlG"lU œíF·a,½üÎxÃ[¾ô„m–îÕÀU?ʼð¸ñíôSq¿;±ŠÕèCÒ>HA‹Þ³9g´ÕÞ­¦\•i ˆ‘К–f 0+*D¹­-=<„ѸŸé—ÛͬM­¢c¥O³ÔïŽô|[ì¯åd»µƒÞ3†ÿ¦Æ¤ÊßÓºµv VB$@“ƒ äA.5Hs"4Q‰¾¤C¶ ¶Æv¦ Ú;ˌѳž—Cv9ý\á¶fQ{ýÞù—Æ¿¤‹@¤9Ï å†½‰Î35rp{ûÂóüõùú—o ÷­ÕŠ6Yc#4ÙT!ÔIM0‘˜÷P.¹fàë#7ܪHtx²@ å՜وëêqþºò eŸrL7XoVUc¹¥<&b_K)±îµmžÖ×Þ"M F±Çsš6 r-€®Ò,U5 pÉ®rRm@rƒÂ×µgaR³úÔHˆ¬Ã BVr [T¡8é©¥üêŸÑÇå8¼*ᨛÕ:œµ3¦«:¤{‚ø–:#TcACj}éO¾Ð™~±ótômõAg‡ZvB…чî©?ÕßkíïßøúíY?sW’ŠºýƒÙÿ:*a ¨p ­þI™¥¤Q¥) [áŒÂ\¥2Fö_›ïÿºXQ:ÄÃrïׇ+†1U~Dʆ0XhfòS^ÈçHècIâÒh™Õž{šÑ2¬~c¤$ör|#¾ôà ¡¡ÇÄdµqÕn| fBÍšfN†«¸MŒ¼ XH}Õ‰cUM +n-Þ|>º.\% S8 d%$*Q—¹Ó¬z©I_Guã\ü¢ùõÕùj|d ]g«àFÍœœ!ýóc”Åσ?‡ÙÇå4n¹ð‡NTœ‡ŸöÅD­ê€üµ>Gl𢕩N7Æ‚‘eÅ:›t‡Éœ {¹|¡‚Þ¸+ž0V¢+{ÍòˆZ•«IÙg]=èÌ“WI9E¿i¾”U…¸ëÇÆùÔnÃåï-ún óVîÂSÌBè{õl=?eŸgí¤±kåÛXË„14Ò¾ê/}ÌÀ=ŸåXUJ=éçÝÄÝûã‚U|©Žý@—+Æòa[G‰‚ºfËžÌV-ë í9/‡ b ”]Yx)?Œg’ëI?_•«c¨–G¢´7pÖ"r$ÎÕÞ÷’ê`yå¡'U]-?ò5_;”‚|n©ÝOOQ¤J£F`OÎ!ã@@qœOôã,(@ˆWz»Fe¶3Ì™®ÊïŸÿ|þ¹óÿ¿V¿£½’É«÷o-•³o§>gÂY°™Õ,ë¢]PŽ4 ÌuÕº×û‰›k­lÚÃËT#ìO&/ZÙûѹš»s^½'ƒ¶(jôÍ’W@—B5xe±fôJ9ºo œ2®Ÿ:ýèt8˜W¯?•Ï¿cã4éDkéøÿÒÞ×ð:š?uùð-ïÓèѾ ¹™_ÍX.ùPÑå0LÃ]Ð`¶•ò þ=f.ÒT·`SHÒ¼›ö‡WJ«p–r¥Úõ˜Évû][û‘ÓÉ{>R„1è÷Šñ ¢Ëv¼åæïn¬T¤† ³µ‡rì—ñ&x6÷,Ù¬ufMáýªtõÒ7v/å%ª}kyÊ2ó^QWßù o߃úz/9˜ÿÊÁAJÉhØV9V½˜O¿¾£2î+’,44tÑ_Žç]ïíˆm˜?­/•Yµöî•’˜e4µ¬²½™¸„ö|€W²ÚÔ—GÃìe`±@éZ~q°ë ßM5Éþÿñ™ýCØûìݯÓ„)¾¶*hWeˆ$ ®9U,«è$G„cØ3êhvÉ<Íq)Æc£Ì»/[­sˆõ,RáûƒJ†WK±‡Å€ÀRŠ—6ž>˜Å&Þ–ºšÆÌÇåÍagišD½T}çµ»qÕ,ô­6Se"¨z§t­ í.g MgÈŠ7Y_{×W寻âº7çò¼|7êÓÇ"³QãíÒ J×ÖdÕ”˜ÝÙ^±hi¸NÕâ—óèžËSˆÇáV¸ èJ¦\1DWCªÄ¤Ç ±ŠÀ"-Ô!zÓ>þYˆW­8O Å‘{¢?|ÚUÙ9P{!¨"µÙØÌŠ>Ì4Rp>8Lˆ]R;µˆ¨Æ›ø®p¤^ ìQÙ Ä^¹OËúÀ…ÎWݙɵvÜ'˜#sx~ëõö‡R´oýñ1pâJü¹ü—Ó©êIa}ÑìiiVϯ]B—bj˜óšúóÆ¬Ž=_©Â£fv{©ŸÕÊÇV³ ñ;“U^Ü&)aWqø_üÓüëÎÎÇ.ïv{]üôè+:µ½Ônl¸mËõ±ýdZꦣøÈ©ÉM¢†j¨k-œºî~G˜ý±PÖΰÓý²ýæéÿü¡¼òu0H°£ žT…ÊDc$¦wVËô0D\{GÎçšFó‘ygw?Ç>¶Rf ÜFŽÃ¶óçß;Îç:žø2ò§½–¿ìßÈ”›DöÆ–3¼ž_Îf%–h­Û¢9äí…­.14Yç2ã$_Ä£Ô2OÖU8ñ6k­ª0E”11ØêÍ&‘ˆÑb•¸ô¹ûœ@€¬XÌeh €[CQ£ø®·sZã´Í#FGAh(ä>Åâx*³` dbÒ%¦1‘TpF´³V| ~œÄòíÇëoþ<Ÿç³ÊÇlx°–˜qy²èõÉJOŒs^g-¿¯õ48‹g©k.üš:‹O¾¨hÉ_±pã´öIñ)‚ž¶)!55H³ …j––ëÍTµ’°!‹3Û®/Ë_ßœëç~¼^îÝó2¼û+^1ÉšúÀÊ  . o¸ó}¶(‹9¥ppû·Í.¡‰°ƒÖãuÛo߬ž¯ oõmSµÏ nJ©ïÏ˯Í7–ñ¢ÎNþÕbùöòñ8¸fØz¿½{{9û¨8–wòs%öšïç-{àGÑ&º] ÖZ©ÐŒ=Ù ±åçéxÙâãÛ×»óÛm³].W˜eþ±Fš³?·Nûxo úH¯‹ÖÑ©„‘Zq4ƒòì+Ì.ZöÞéõ¹…Çá¾¼ÕÝVTÔŽ§‰«U:6§št26î£Xb:o{0`ðx9 #—~X-µ—Ì­™¯I±JfLZêî*!» ë•URäf´)7ktVI.Ÿ>l&ÿW7ý׫ø8ÞØmªøD3n9B#]·w›Ï’”;鑹͸÷ñ°Á½ûáóólò8¿ÒE¡=• l¿;Y“%¿W!ÚÝÒuAŒû²Å¿ˆ8í¨AwßÑ|fæ3zîù£’8óù¬9`eã‡4ßœð¶Ð-v˜ÔÐ!]‡^¥A¦þù=Ïnµ—­ÔNŠ˜ðçÔw+í":ãz’!S´ƒÃ&s9c‘)„Ò ƒSx¤çóáødäQÂpYŽB [´N"÷xã¶íTH¾Š•¨ÄäKÞØ©C†pž+HDèèÀ‚bI™8þà:&ˆuƒâõº÷¨m+¤RGç‘Â0 ¸¡W­G»Žå¡Ü}—1 D÷(s¥Ïe£a4\¢‡ÂÀ! ÖŸ#ÛiÛN:O»¯ý0;zÞ‡SrmÏp”®äÝ`" PÜQµ®pÇtlÛ1­6Ѳ¤Yˆ¹Ö+S”n".7í§àÖŒkÀÓl‚÷ROÚœ†€¶›…“t¿pK¤ &ê$ ’=ËYø%ÔFA陼*€Ö™ÁKûü¤-n¨âÙi;|K mPK—ð<_%&Â̯Õy×â´Åç›a5þvMÎfrƒ}É;‘Yy‚JF^Åšj'§”Ó­–§±»HJt‡(»ž>TÆÑ,˜À,þð@—?“‡ærØûxüèû;M<ì.¹å±C ’Å Yë¤l§ãê9H¹ÏÕ¯”`$ƒÀÓ7xÈ?ƨûJmHK'Dòc—[nÅ!—M‹"ªìpˆÕ[[Ç[bÁºlÛ+U¬È»°U,eZ”&Š(‡¡Cd„ƒ“`øÁ¼ÏI][®Ï26õ–šXÒãè5ãnEùµjêúâQ¢D#ŽÏû.îMlˆu9Y ¬ItzbU,€”¶= yÀ¶G‡Ÿ–?îô5É=ösÙ<…Ê…ˆ4jˆ¡D¤ABÍuÌRú {ò^Mg¼SÃ8åÂÕv8Ó廬¦ÿÙIVÝ. ).'ðäøÅ?ïôîäe!b׃1†¡Š"4T kÀ¤¹" êÕï»{ $kqùƒ;«+ö6Iºx„m8–(çCvKԺƛš¶†ÊÁlŒ#1·PìU*‚H)äEjVE’ÁºyUàv$ÄFdæ‘ëUÐ`c….ËÔÇÔEq]ÇH^•ºÙü^ñJ^Ñ+â•„kåjY'Z–! 3ùÊÌ¢c6ZÕuíï]°š¬B>§C‰–.®Ö׊'­5¹»¡QÞðÕÁ/ ^][™ £ãÕQ¥®k÷¶Ï7 ÍýAÁ>V5Ê%–.o2xŸÀDzÀFÆf”t¯ʯïÀòµSéW&ÒwNNîù¢ ƒU©¡F]üc“©@¨éâ4YÌy‡†æÔÜ .5À§Õ“,°’Í`[ÖÌÆ‡ªRe˜‹È‚&s&Êm«Î·¡qÂTP£88©Ô]Ðu;Æ#kbYb5i\Èö:4 š¼«çøé§ÌÙž¾÷|Êñ«|çüËøüƒùüÚZèê0T2r÷¦÷KMüb(Ž«âÇÍÞ]ÂÆ1J‰RªžWÿ® YpÔÐO"—ÜG"†Ñ¦² -i¥Ò®¯É¦: %KH<ÀhxÅE_¤CÛGÂvª37ʯ|+i¶ÞŠÒjÝÒ|50¬.S¹³ôÔ¢>ÇòH¹b)æ¼|LÒâBœˆ}ÐßÙ¢^¥bçuÌÕÆÒXðÊ1YJHNÖ¡F7³ë® ´Vù¥U,h,$_ï¿e¸x Í8‹Êøu¤zõך²d×TµÁ,kÁÒ?Ðó÷”"QÅìCûaô£=dî Ì…=¨šgoÑM;öPXˆ±Ý³ T5s4ªS­·Rÿú•×ɺû`ZCuZ–¨Ï/ô^§€¶íülKñàÙë–¿&–^ê|›|Xþ ÆŒôÆë¯ùµm?­è6ÐÝûûâ·Óû:ë5&ë¸ß>{á6®|mq‹jÚ*| ^Û¶v± Øï¬+`SÓzüZ“ìAÓ:ýìŠÏa¤¸ÀtÕ±$î¨^Mÿ­cé3.¼†|\—Ëgz¹Zkšg9ÇŽúôgÅ/)v¬¯÷kt1[Mã`Øojœ\íëM”ÙJìÔyÎ"oq)z‰y¾ùºÃÊN¹l’ñÜÃå‚£…6`ƒ9F%ÖPá›>탗`½·”G_HýÎ=öÂZ$izë Ú–¨´Ær7ØÄÝß{*&`“š­h3Õ ¤g€)‹Í½ÔƒÀÕʽ?½öH›¢?O¹‘4‹Ãzh¢ÚJ³s’«¡Í§L1àF¢ê ÞúIbûÛŠ«…?›ªóÔøE+tüÁø³wµØÎW˧…¯&©jÖLë\ã±à0J¡(B†û:å·)³3ÐÞöÍJ4(!òf¾ÝËáþGuþ4Nß›¹y•™Xˆc­ÑV{lO>ì/÷öµµ»Ùë,F-ë¦ÓDs$’µ9ц›Ð 7}²íÓê:6^]i_:^™'~x1}ݬ¤q±ýÂÖÇe½Jøž~ÑQ©EwMË2«fbIÉãL?õHgwT›E\Ÿ:gJïpêÃrú]â[u-{˜ó|H®©)ƒ˜‚¢C†\ÓG*†¿–ê~äˆhC€(hf=Ù7µB,+LDþÖÈn£W ½Â!¦ö>Ráä1+´Ô›@)ä^Óª1)ðšg¯Ëç® 3ØA˜!²–à^» 㹂áaÆá™7>m,V®Ùsõ_ Ÿ:§3Ć 1«Öv­©û+î·žJ꺈UÄÓá6‡WSS’®˜Ì%µB0$€ª¥r¶§°ÉÌÍP%ON‚E&0ì,eXU”—®›çk]ï> Žú×ñ9Œ[³x_‰ØÞ®íÏ .cjÔ®u§\%¸èìèù0s¿w_Z*!L§4¸–Öâ]ê¸Á='hV¢ìèu‘¬6zˆ)ÅãÚ‚Ýóâ‡Ç’»é,Ž Hc[Ý$³ÇÛ¶QÕNn˜n$&Â@«ðrÛ)–HR-ä¡ìe[9¨&?y?áv˜¸Þ _/U•qq@—hfVŒDYÇMê¶kâvóo`!ÊÖ ÅXa7‹ík{ªöB‹¿Øß~é“ãÔ¿óIyYîùÔërÅÄ3/âh̳M;¡l–uØôÍšƒÔŒb‘(Z±EKÅ&3xi\;eO5f0…ÜÒhÙ]I˜‰Å! áÉ™š0 )mð`Áà2ñ´N?"€†I¬™ßA‰¥s†ÿÄ<Ñò>·ÛŸ"†os»ú￵ח]ãoöÓuþÞÛÞÛ_ÏKèù~cÁKÕ:1ùi0‡ù¦L%>1pò‚÷!­pÂ$‹“Ñ›[¾vncžkíb±aîÌ‚CÅÍÉǽ)Ϲæúô|?Ù²)¦çK€¯KgrQš]êq¹Ó}mÎAT6™Ž²gœY}›/v_?ZDÐtßm»á¯ï¾¯ÿ2^÷r¾ÙO‡m·N-ŸQòš—ÿï!»´Íðœ%oÎhe×¥b_„{¬gí­ïÕ³›ÊºmŒÇas/y¾¬•_ žEÓÊâ´.0A-›ŠV’VoÝüX8¬Pß×¾þ2/Ïüþjtß©ú½UÏ=å¿.æ2$FefcvÓ £¼‡'«UIÃimŸÇ|Fy¼3÷{NþûÐÿ>ÿrŒl­qw•¢«-jšözg¤êS‰ ­nGîH¨¾9yÛOKy©s[ zƵƎXÔ5DbÜÃI`¯ŒáT–fŸÅî¤u”{L½àj]÷·“ÒèÛq¥âƒôÙÕÒÁZº‹ó›I} t–ôœròø©aË9_ÄMæð{¯ÞOrÎ ´ Ó’öcVUö•ÍqƒvD¡Ì9xM£ÐécføÈØ­;ôÈzõÈ΂¯5»RŸp&Å6¯°$$í9! 3žHQxoçî%/ç‚W[‡·ànÞPg±kØN©ûhL>ÿY‡Ï#ž ÊzLtžZÔ+û]8s5¿‚"ߪî5òtÃÜÎ)b†âí‘uç7D~bòŠp¸-NJsw<·®÷_}3z¦œÌ„BKh‘B$ÇU/¬p­â–¨ÒÃõ0qfóµ™÷«ó¤”c0E ’qy²ဩlœÓ¦1Ï}UË=ï†Këò¬"Ú™š@K°C"‰£9Vdè)X Ìé$L‘3ã—颹ŠlØo%W L‘P¡JÙÛ´™¾ÂrÚ)²V$VÔL3@qš+Mˆ* "•Mp@Œ¢8K‰ƒÜχõZ%doØšÁQ¶«à {;ÛšŸüÆq¬%”ÇÇí±•‘õòÐà ™ ÓGaÏlí÷1aúÈd~0G”¸Ç'®~p³Q8Må­'×y ½â#yÙÆþEByà‰o%7H¡rØY§%ž=(µZ´x² ?ŸT{4ßk˜3xZ5d«ù¹7+¿oùÅUÙy¶¤†W¢­ð(®©x伩/Ùzh‰«‘e«\™–†N¶až„3EƉ»b:üïÈ„(…¼A= ¾äª ð3é}¶„B©]'à&ªŸð·Ž/Ë‚åR ºwhÉpW‹k0&ôžýÑ¡‡´ö°ÌªV¨˜/ëu¿Ÿ¶W'.jæ}eÜÙçôr?c»÷Åpþ“í}é¦^‡:‡Ó*÷˜Ù;¼ÅOìŽ8bÛ<Í´CXy+=ëC7™é%äl>–¿÷½éÿ¬ñc`f=5ýœ&oîÆØ†­1•ctJ:C,ð LŒ‡/äúµßWO¿ŠÅ%unyŽêe}”Xw!¸û (bêð­ä=2¯²WàMø()Ê`Ÿ>RD+%ÉkÅѤ_]VDÓÚZÆ ¼J…˜’®Én<ýÄ!8IcE´†zó" û«l `êæ±?Å·J‘Éþȳ¶çÍc\”9µÍó¸è×ÖûbBw!*ÑNÞí–x쮿íc·¼J¶`YÃx±s¿àëEûcó¬ðt É õø,èÉ*¯Pü еxÛ¶›Ð4†º±[Xš¶/åŒÉÁ³oyOUÊí:ö]õûFÔÅ‹N·ðs2»wŽÀg½ìÈ&"H  ZÔ—Õz5vQ µåüçY~’†$ àLÌ· Í×X#T¯‹OE´:É:Ôå‰|´‚&b™CS6)å›vœ¯š©Œ¶ébÅò8€Ufê;î™RZ÷@ !(ê¸jêaæ-ç'Ñnú!rD+¦ŠØDšaB«>HŠÚ‹C½ªÝe·«Òµò有ì±ãzTÑŠ éuuº&5kEÖGÜ#JH@3M½ìBjy–fR ž¶4 ¦Yº’@H›•ÐËv®»ã™†N#¾H¥T¯#è¢sô«ñ§ô¸¢‹'íÞ>¢9ŸPN++¬Ç{+0¨ËF‰`D,‹DÅ Ÿhè†ê²̊†ª!Çzrè«wè=窖,–FbÛ´Æeʰ\øÒœWU “"bJ¶ÈÐý§ó’>Š%jØvXÚö¥93¸‰…dzuÅ +7½f;BåW9ª»8sê-U®ûæ)íYfu?ëó}nÍ/§0ùžŽ«ZK¤Uá"K†…mW‡Uÿ¸1t)ÓÆ×Ö#1͈+Ÿ"‰(¢ 2UÉÂ!š^]½l @P9LÌVÇLp5Ôà!Íñ, €o™Ù:[Ù±¨qz®ªs†=«ÍçÖfÖô†Ç¶µ—ÖÜ{T…2eHb…—eŠz“sXè0ÅYˆ@îùøDãÛl•¼„^Oän¸ ÒG‹“º`¿,͈RÁFèD²“Fª´¥;n­OÉðÚ{ï¨>ÖO¬Ïž™Ý3’úöã3ý²_/â+z¬IrN1å(ÂI¤Nó×¼ $Ôu;¼»v×´ÚØ/*4Lîó”£s®n3£S¥˜J ô¥ˆ¤[T‘{´j%ÿã¼~Œë ·éúŸ®¿jæ¯H˜½X5ý”·w¹jnÊÅô9‹ü…ùùÙÊ_忦û¯d“Cæ½¼[ ¿\º¯ÛÁß©r“ö[ïoö6ƒÓØMßçµc»™Ë K ¶¦X3×`½0Ú€·Q£ñª8˜Û˜í5‘ëë]Ls•½”‹wè+ÝeX*š©sÞÆ³4¯ó8“Ù×f/B—oí(i>J|U\9ØÉYÉÈWë8Š%K²Ãªò”ÇWúdõ;kC×Ù›Ë)5È öD™a¦íúí¶ÿleû/ÁÛCôÊþë7ƒ9ü§ CCÑIéäe‘IÆ×óK죿> Wçu„úõêã\ëñ«s’Yó¾ÝèÐZ/&Ë:¹CõxU¯[ ùç ÇÏé·´ŠÅt×Ξ41)ql{©®c6§`çwZ÷V>}âÊÒ|áõM‡›ûÛ͇Þ'K»ã`þØúÇùUXcýÑÂëÇvWðúÓŸ~yæ]ßã—¯âCÑöH»z+ÓœìTGtl9ZS•l&ìö@è:çT…×ÝO+Å4d=V ° ÜÇ~ÂHž)ÿã:=äøXŒ<ÂÅ´7êÞ›‹ÐÊ™/¶zØõ~|îÒ~Ù…A‡Sªg®:yuääT;U "Ž S"Ç8ó< pÚչ¶oµ_Í—vö¤ÎLïóð+Ñ›îŸcïúB ý•W{S™ê Ô¤ØôNSd5 Z¹Ö,€¡¹´¶Üä9_U&’¢zgÕµ¯ÍgF’Îê$ÙìèµK§Š„ji´`¦q7/;ÝæÉ­"œ‰F')=iªôp ¬œxÍw⃩'3GKã6±—ÍL¤pɳ#Ï¢ƒNzÆ,œ}NîâacUL3W2!Í#³çVüèã6.:æõþhñ1º1Ìʇ'­í:V{¿–¹Vj:û: /æ·éyŸ´èÞN§2¯/Ÿ/»‹µ¯™ä-G¶úóË^é¼§Îðì¬Ã½ž‡¿ß»÷—éÙOBåñ]™Êªã1øè™S)ÛÒ({£³Ñ¬Ý†ïUIýúÞŠ¦5~eÛuÆyµ#g…=b25¸$†÷f|_Ká¸Ï‡Ï£}$Ú¨¯ØkgôÍ4ÏÀ¼Þ4†P¬¹ºüXu¯PÑ«Dž±¾ùÊ>?—V®ÔÁbÑt-Ÿ­&Á©nÿ:ìÜŽ«Ï?/sÿ8û•#1W99˜õð3‹FkjÕS­¬,ô&FO‘:n¾~j_X|÷â;ž)wV©Õ™¿R_ãR¢ØuY³¿Ù·A TLɽz¬™©ºç4¸[þK«›…¨õP:àjFaâgëqWÓ¹Ž I²G—\Yuy+ÇÉÔñ|*§ï[žT›#å›V;Ò_,ÏgY^méÖ]õrCU« ¾¨‡º¨â‰p5&×ô_5­–ƒÚ|,[¢7Õ{žÃ9d|?oBMšû8ýó—~‚†”0qÑ”` 6€ÉXÉŒØgšØvË!C U‹sâ·Ûö²ë¤áfÎDuõHorä¾f~`öð£xNQ¢YE‰{»boÕ ³ÔRl²Ý"êçñX/zÁÉg’ÔÀ ¸ÙL[…{dŒHfÖ‚-í‡ç¯/C ë‹ÑÛ¿õûþöû·YsŒÚ×_ßÿü O„%Œ;üKžJB¨xÁx<1œ±]nv›™?xè3µFw…Ú¦D"kû:[8µH–U«¥€à > k¯&f•”B9ÀŸZŽ#ŽNIà`Ó¥°½1zù}š¯>ˆ6Y…ÕÁgrþë9©/•ô>\¨½ãRg.ó-ûý‡7º‚”UÝ.K‘Ëkгnæÿ(ž׿ßSœ};‰ Ay…´Ò†Ã«¹Î“|²½´ÝQF•áÊ̡ӕ÷ŸÙîÚî-ñ¥ë'æ`ÞÿWZêMG7ªvr g7^óvNÀ3\m†­\Ì—¼šj®[(+©8j}Ì›ÏòÍfWhî²B4WUËÙæ{`¶,ѵýzO:fQ¸W»¯Œ¶s¢î5ÈÖ_šqh¥"=D]ºƒñ<Æ>07”é-ޝ‹Ç#ÖB!‡~aãtÊHçôJê)Å€a%€ÓƒRĘ#ÊŠºQq&Åðmn‰A(6deÕ(f0ÐC™¡ˆRT ˜‰ e@6"–€€\ S" Ð÷½€ 8V1¶ŠS̘*¶×˜Å‘ˆýuXFÌEÏ`ÔñaÓ=ŸE<×EÇ0–?¤tdZ+Ï÷z}è™›5'³g>¾!ZQïFã¯TßöŸ™uªÐ´çä…S*1ÄDWc‘ÆëîeÒÅ1Tª°„@B…È[þ,[s •í Ÿ2ý'©·õ™[Ò j—·“~Ÿ¡’ÝÌÕ+2 ¨C¾'À #y‘1 rWc´®»»–7IY9ª@F„Q¤™~ŽŽY Ýÿ½ß:udÂö^xÍiùƇ»ñ§"‚–€´Uuf+YP:¬9ˆ»“ðTÑ$àoÚ»ö>ZSãÅ> œ$Më„*É"JiépçäG2ûL?¢%y—±›9ùέ٦ …(>ú±ìnù6Õ«ž›¸ÞNKwªzd„îâ>£Ü²EeöUßÖ =Ô㸧¹\–×ÔIzšžù¸ˆÂãÍǜȉ@¡0‚ÆNÌÆ`[9 (´úÓíix ·u4EN¢DØ;un:³]ÕŠÅëâj‹fþãwÏß}ôpF/©5°Ì¯ÍŒš¥œ–c‘¥n0}W¯%ËlÁà‘¥?ë"@@Ú3(„Z?*µ³¨fb¡pß&—‚æX¥WŒB œ‰:^Ë–Vá)ÑZÀ»Nj|-¸ˆ ˆÌ¬¢ñB™%òSÙÔiÚ@%é}Ãt…“SÛÖ¡íŽÍ…ß¶OsEóÆäÜÏ›º&Î*תô:zê”)­²¸P 'ëuIÏö¨¤¡ IÝÒEëa%kUºÒоþy92/r …, B K°Ð²+ ‰iP3Õ4.Wkh€z(äã HÉ\  Ò´Õ%´27ƒiÓ|^˜@:k3:¨ç•O«·(ÖE”{ÐkÔj­·Øm0n÷¤ ˉ `3Q…2U ·5' ѪKv³–:Ÿ«bbrm]!)<ظf‹Áá°- _>TV©åÔ„8ÃÎÜ»ƒÙöBíäàB¦Ë#ÔÉÆº§öÌQÿ"ëzëÏ®é: àêÕm|_UÓm7q¿]…Y²Ê-®Un]Ç2Ò9xþ‚‹3¢Ý›¿žË[ã,S½3ír#ûÆ<" ’–Ϻ[y9œƒM{~‘}kÆÊ]/ /Ï_·ç?–¯¿Gõw ¡VùZÁ‡,¥Yß—dÌzp2ó#ú;H^¯¸¼¿O×ÒK>šb YET¨ ¹<û·«;á=%ƒRI-Ïlån6ÝØ‡¨qªt}Rêe Ì(1ÓkÑãô¤©F™y€mhbí¦é+2Ó·’Û}IºÁµNç0¿xçãÖøë³öµÒ¯åFó+±M²aË Ç§ðÌÇYbéöÓ]ñô´œè›’8¥'øÿ—\¯¶¦ªGMìþ¼¿ñ¼O~t_ Q¢v.¶+•šÿ …5¨ÓëÈå?÷?ï¢vpiò°æÙÒ?z ŸÔûwìÏRež™ÿ¦ë¿z:µ¼V}eúyŒöÛóumSï´ÏÔ{£Ö¡"T¹&)É!Êx~9ùéÙš„<Ž­)aˆØÎ\³øé2îyr[É— [é ãr;DdÕJòÜ?’pðÖð§œ÷Sx9ã#ÞÎà:/iÍÙ²N©eC×¢¦‘ÛŸ«–8gj`Ì…Ù¬ÓWZ¬nå)ù—DÍ HbVÃ_öŠ@bYéž{ ÏuÛc:èun¬ë€uƒëNäédv¿ßödsûQÍtzU1£öqÒ¤C0ZSA?„ †±/?³øåÇå'lÚŠ‡ìÙ`¦ûÈúy$=À'_ë¨r½|þ©?}õ/óÊö$š’±CmZÅÒ¤f™U$âÒtÚõ{Ioÿ}&åråúK¯‹®Î¶¦›Á°0\v»N“uÃ/HQ+,sw£þûòõ/o*–ÙºÕ™]­÷žv¥U‡Ü#OãA'Û[j Éó¹åëã×zgNÿÊ"„Çç{ëè.Ÿx}èûè©ñ‰=Q¯kÂ~´¿Îø5ÿ ²Y%KŸ”Ätòz}Ñ.–{ºÒ@Öjê¬1ŸKî\”-LB•”#ÓsÖµ>¸…ËÈxÕMq:ÖÖ]ÚluÝ¢üí%! 35¦eµ¯œ„•oŒÄ½Wb‡Ã&'O2†X#<ÖrŸc½SÖ‹û%ŠbUQ+8 Þáp(ˆ-æk·›¥—|O0’â”êé°'Wß8+KT,Å¢—êñVm|´=µuîr[Ýööóýýùþ¬=x sû÷wyyü½ÿï¿ßãM¥»úöX¨ÛÉÛ£ÖÄ[=5ñÀBâTGÛou[‡ºî£H·6ßéaW^FÓt˜eª6Í Ž~³èÑ+ÖZ‹ŠþˆD·upKÏÜv8“õèçó‡2ürÿö.­7ÙÇØÝ}Æm±—ÛyÉå^–é©7èv¿,?ôÿzÿûõí¶íïZÔ9ß~Þö7DÝò_ˆâcùñüûþ[Ë K’ä¡þLä™ „¸Ý܉øØ;ýÒ²7d‚z m¿|ï¶ /9ËP3²#­ü&[þ6æcDçº8vGøç¹¯v¶Ó:ëãƒôW‰ñôçë{»Üþ­ò~|º>_gß7óï×¾ï_ïiŸïR'yʘx³ã»Û"gfÛºaVR–Þ¹çÖ*Z†Œ2^Ú^|ýeþN,õ©YÅ…EY=5ÈðµQO0 ¿6+¥ßçÂûsÕÍÓqâH:%ßí]XôÃO{³¸8N—æãlð¨_ã2i?ÓMR?öé*–jR½a Ú!ü_÷ó_.Ñipö’ªÜÚ±c¨Z¡º©MÇ-‡é[sÊêÌÑE¶Ñò;UR™ÿfqÿq‘ïÛÀ6Q®&åòbŽˆpÇÍíÝ™ùÎéBô‘ÕôgÒ²¦¼í{{´ß¿:ëè“c5Õ%åFÐØŽÅÉ‘á1›oÉîœa-ìîm ­žS›0Ò‡0f@ʤ€Äd±Iô¤\PØÚD‚¯ÍnHèŠ{q‚"5iµwÈ;‡q–Ù¨ï1Úm›–‡I³>KaDZç¿iõçüòg:Uð{ÇÅÉfÔ ßŸ6eª¸àb0hSŒ(!äJqCiRÉ#®y­D!R!–ìÄdªÂ³·¾Ü=úbjK‘ vK‚¸„F’ûÔ‚–t¬#k˜*š-êL*+‡‘ŽPH2$D*IP$W±–?Œ!e²iEn`Åá!aˆ¾Ì`+UBƒrª„‘éêaºRè‚›R[ƒôB.èDÐ"e±]Z† „‚14)VótõX‘©K›<ÒäÞöeî=9Îx­•UÁ*âÜÒ{ƒÒqî‡=ÎäÈ„ßÁg› Ç5šäœÅbaG¡Æ"O¼§Ç EÖÂ-²7Û–ÎòÌçÚ4}ëvžS¤.}ÖOcºžq…¤¢}Wk»8c$ãhA”ˆVÇFD].ç•ÍFÃÇþûwtß^óh“'aºðc×kèG•×®éž-Ï#®ûçÄWe„Ä]°!ˆ–µÐµmÜ §o€Ðª"´M´AhÌD&È&·°ŒëµGôt?ì:î9j&}žû»¾i[#1v¥ß$W”,oÇ–wû%‚Øëâú2IÀ*þwâåÿöÏûý5J®¹û\ÃfÑi“­ ·ÑJ ×[¹ò³lî„…ï§É‘ÞÏ~ìõY;!ª×¾^½[Ƴ¡ûššL`Á;wÅ;ÖеîòƒÌàùp{½¯íŸóøûPºº+ý™e>ÌŠ~Šoçžî¶IÌZŸiðk² ¤‚‚hf7½»éÅXɘ•›Þùíi˜³«Â±Åý³ÔwHQkm_÷ýækÒ¯Ý'¤ckþyÏ?«òè"#Q ¾SL§Ñ±Pâ5÷óšÓÏ€Ž} «e5!¸ãND6B•Ši¾Úh×&NRÂÑu&H:–KfçIB¥ßõâyèXØ3B8bÖp•ðÈï¤ÚϹ—±9£(£Î#RÍî²DÙˆëŽÀwrÍÍQh¶aWCÜÕ ™ ÈPÆ hy°Mi€Ä &’vdFGš É$ϵ ’°¿ŸdÍÏðôã¯)à®e^—{Ñ6fÙAF0]Œ°€…ºP÷°/²Ö^˜;” BQ8虌Dl+ß–äwÑûÁ¦ŒaöÔ§E³yKÎIäNOźò„Ÿ-nCWã$Ü1*ÜšÉZR>&é¸8/‡N;÷:– ¯ýtVW•_,eat¹4êus–_ š1d‹ŠÊ¦…0»Û™­­¹A sq™ûò–£*$1AàMLÃþN¼þb—Z"žÎ„9Q ¥¡M P‚@Û€&²‹ÛDjCW HD¹ Jåx;~–ÇàÓ¥'‘€K®\1*¶Ci‚MÛ̇K¡¦Ê–Å’2 ™^ùÐDŠ»Â܎ΡCSV¼"j­Ë^‘WƒNås½]š~--L9%’bd!c{zš´ÓLG5~ži3ëk=ø@óÁU£BªYµÙ•€íÉpÞ'g”ªi¸' ”x‚KYÂ<ÿ@æï)ýeªµòžæ·Âi8ë\X×IM.*×(/yÞk£Òß/Pžrš×îDÇ®õ}×;Ü!@Y²Ï_tsy(¤±ËÆF <îÃÓE§j9ý6húr>Ö:'ú›™Îk{ôäE7Ç¢¨˜µ”Ÿ.Ô×…×yòýžˆ<ÎcÍÕ¼$^C¨;œšxb×è%Ú‚!…µ èŽcAbë”ÝMÓÞm…ØÜ)DÒÞ«ƒÑhýgáÂ?'ÈÛ_ÇÃ/³ü ‡‚}o…¿wx×v%KHµ‘ö»õ ̱ô*û7ÏäS½'Ðjœ“Ô©ÔIïöœÐ­ß€YŽì6÷¼>õqyðB)Jð6“VÌUÊŸ<«ÙJM#'¼úãd™aΓ}Mq³Ô-ü+!7Ç¿bøîç?žßªB·¸GWŒù™ù{ꃌüj<\¯ñï™éŸÌ˜ŠÖ',!ÍQV•>ÏXk¼¨é4oe>ZꬊÎbÌ ÈôZ„w}Vÿ<a´åH>?é~†n_Æî‰<ÛòVíε·gäP èfm%¼ùqM.=ØF ¬GŽ„cî>‡‡$Åx1L!’BR€4Z îÃy4*Í÷î-T‰ÈÁìd®&æ¬á/÷¹ —M ª‹2(Aô5.דmäªFíñ¯l>;Ë~ìëXú6¼íÏJ8mV°åÖ¤Yëa»ž¬!†p•T¯’)wéJIÆ,îN,ÇX¬'‰ÎÒeChÀº!‡6(! ‰œaˆ`ïú”ކ¤+dEVáIY„VŒØtN"ö`uðéöÝÎÕB(ú F"ƒtiWåÓåJ½³ž¹"Æ Ë”Q÷ *6$b£à(H‚%i“,a’ƒÝ^§“2rd[%ý<\4c ê'£Ôâu9Dˆq«J(ÁD1CÃûìŠ(®¯ó™TXI»¡=¹;­™è¸Àµg5l·ôÒ°½öjZ{—æ—“ykã Ÿ¬¹‰‹/V´õ„uò£W{òúfjw}·>zõ³¶/BÏ<»0ñ:ðØæ™KaTïñÙ™ÕÉi䀢#|œ{¶çècìeü׃[‹¦œRC9„Òr ,­¬Q»Û†G×5kJÕ{ñ 4Τõö÷«S›ŸQ÷³œU™Û¿Ã>ƒE4UoÕṞؒïÕ…¢B‚lZ|ÿš›ãêN!©ñ&zB;ƃìq”ZW ê[o½Æ5Õ"6mTœpÂÇpCT ¶²j¾†ªa† I n(Ûºåw¡7‘ˆvˆÔ’]Bæ"똊î: ÝÀ:z%ÿÀ6n*¨DJ^+­òe«‡ q_­Ÿšïu¹ÉémuÄݵ‡=·¶•ëYŠÝ·Õ‚·_åý†?åÕ“ÛÏ:ÒÃøò£ÍÚý]›/oö ¬'ü˜=É{~oÎÛá_ùÚòd‚âaöƒßH\µjа*V%jµ2P[®Bgƒ;éÛnTèqsïCÏ I}NÉe‹è±o6L¸Y\<Å:*7é"EÁ"ßxí÷ù¥¿ÔÍ®Ö/p{ÞwÃÇúcOßËc%Õ 9‘FPÖ[æ×Üó½\8e–¹U+)Zõ¨“ Á4èVjn\m#YúG#YÄ¡Â'† ÃÈéå½$ÂÁ +AªlN-h¤Yóíû<¢ûîï{üé;+“²Û4)±÷}÷Æ“D.‰sSÿ©Øøëüé}·Ñ[>ŸßÖ› ^æ\ÍÆ<ðË·ÿ“ëýñ žxæpq ûMG´l©Š¹985` LšQí}^Ã/ËœA1ÙŠ3±ìïóÿþ¶®Eô÷/-öî®Íÿ?¸÷!«¼>§,þË…?6´¡7C«)â6ÇãM–Ãåis„¡Í°J2ÄôH›ƒ0–šÂ„Ro͇Á~]ÖëÁ*YŠx,Öâ%š;N!ÓA’F§X£™LTY–ìUØ>g§ï.ív\ûÙÁ€Š´ vÌ X%Oü|¶&ÄzÛqûr‡ \¶ûn]1…•Éâ€ÁºlWšŽ·­Åò¸†@µôù1·gè¿(9¿üþK—îM>¿{~]½²¸ûK‰þ|i9N%XUZ$A\ ¯ëùnìã»îN!l…yªÍ.&ûá6ÆcÎXõlå¼Õ5ÑÚÿ¬_–7'“<]¥iSŒá¢°þ»ºÿv:ØH–æˆS~yª=)J‚Ã,£,Ž>;¥Goõð˜šÚNkêˆ+1Í9xð Z Õ ÑuÖÝÓFKµ›Í1ZœÖæ‡iwÇàé!¥©§å•3]RGR¡úQ LÂŒè27 v½Ë¡X>_t‡.e™éj\"‘*@—®–w–}·Ÿ w ÏÝ„bŠœIÿ|½ïˆÛK‘Ÿ¼&§=ɱ|è¢ÎðIÅXØ/=×Ç=dSOŸ$òù’½a’wCÆ€¬ì–k ‰:3cnl¹¹ŠkuŽš9Í,efgÝ”^7½KÇ>ºIOã—û7iƒ—zf÷žk^… Ò9g²ØŒç=\»ý˜a§æý òacáHc*µ[Ö—ßÝ?‹YøØb¼2[6%ñþÑ ÝóØý¬j –X#N1ÁºdHh?Î0m…¯øÌ®ë„²ˆ AD³†Z›¤a‚wµºêÒ–ã[‘4±fç¯M Ÿø´)]V|™ÖxÒ•¬x‡$žÕøΉsbe£×ãŸìçßñÕúô^háQÜ“¾*²sŽ»ŽZ›C¬ª?²Âï8•^R·}o$* «‰W8÷4Í´V=TGm)æ933ó6 /EÒûûÀýV™Qµêóø§äµ =>×ðo¼zôíxÈý4'ŸŸºOx”ÏÈH³ßR"Žq½aÖ&mk[ùÓa—ݲ­ …E !©r4º9ö÷ÙX£ y_^ÁÝʮĜˆcô©6žIofÚdZ Æ£¨|︴ÐLÅ©´4–•žF  ˜LJCW–‹ÌƒÕÚ-ÌS˜`¸-(Ñu Õúlže;Ùô»ãu^Õ³@B`ü>L¼÷7£*;cn@o¤Z)}·¹£U°©®tT„R¸]jE‹×''‚BË©•@P H%I$jdréQB¡q3¸¤ÄLÄj‹‘Ä +ßGda±«]õ2Œ Ò!]Æk8¤m Àe°úÚ|¨–¡ŠgŸ×õRïí΄ËPRb7’R!æ’#bÑÒÖ’íè‚]cFç,Mß~½ BéÛMc1d–iö ßpyÉ®×é²SÎC9¦ÓåCï\÷zÇbh4ë㩌JB+5‘©¸ßƒÚ­^YIŽdÄ55ÒÊØãIE0³šÞÊ5ž«? ô§óC´6ɬdTŠ>Sc ‚1ÝÁ*Xå8âÒ휣þK—ÿ”ǽK¿ÈY»·õXÁètŠhñºí)ûÐx¾V@1mJ)˜F÷ê÷9ü+Ý™ÒÂ׃«qå+?ú±œÙ+}¹ L32s–ö§s9%ðT…CËû`ÍO[ëc” QO£/ïä%‹JöS /D¯û˜;؆g˹~y5Ú—}«Ò›–^!‡š = ½Ø²ý½´ŸÕÒÐ+˽ý—OöåGº½ê#8sR}íòÑ­ýϳôuûãÓKq¿^R¿H¿` â”XÍ m3¹&³zô'¯ím3ìGƒZÍp,]žš1ßtØ_.°=ÁÅWË)P=¡·î:sÛih÷æqâ6ËÃ7v"kéb+³¤¹Ò÷ìx«¾üŸÿra¼÷ëú±„â<í·ùYfÿCÃ\ßiVç:Êš@•$2²§Ô}G>†|ÞbÏ>³Æuç¼¶Ýè@ð "äºu–‡OêpÈ!’†¸-'bu/!}DjÝüÿ·³Åø®ÃÙénb…Ç”û:nWÖ;Ûìsw·c¾¾2ZŽËqá -í©êk~X¦TÐz“³2b/z‘¶‚+A`œìq|¨:ÖËðšÿÈíN³0ØÑÛf¸T¯™ ™0šS‘ÚÅÈŠ´°£ ¶ïg¼ÆZ¯Š¦j*+¬ÓhÙƒ‰Lw»›^;;—öá[üºËŒÁT@…nÈ”Pu—|IˆL‹ ü •v‹_ü²ÐŸ÷çü˜ÓÛú»gÚ‘þŠkß÷~é’þñò¥(¾§ù¨iv·ËÛ=½˜–¢hEU u ÊD †½G¡é7.—¹L®qr!bsÛxí¯w·ˆ©S—ù—÷÷{ï¢4u°ee¬'­óÅ`ÈŒýögôûú¾:S×K%Ì;Æùÿ_ÓÿµÚóÏþ™o;ÔdŒ°\Ö̲™owÛA¬÷Ý\›ÿÇ×ãÙ¿kÿ»|dÔ?ÿôåõÿÚöïóÐò\l y‹|­É/–íôà%›£Ïúé'+ñð7M$¶š9í,¼ÛMz¶óÊ0í‚ AÅŒÚ<Þ-ÞzKëë·…³†Ö×½|ûu»ô8ì´öàEŸïö÷ÞÏ0ñ½}µu&yéëGþí&x­ÿ<Êy¼á)…‰ÊM/|O_:øô/,)Óé9p0%{g%Ö³fýÊ©- JkÊ`W+>Õ± eÅ*¾?”h·ÖûýòËîö¾Ÿÿíû}¯Ëi~æw6br6£šõa×§±ýeyÍQÕ¸½ïv«ØüU÷r‡­4îéöl;J¡ãJ¸ :ÇÛŽåZ6*öZæåžW³³òþoäù&ÖŒ-°-¥/ÈQŸžÞ¬×3v¼›3Õq®JÏê—nܾ¶ÔåÑZ÷¡z|°¨;½ÏÎqæÔ^˜¥ôX½¸‰ÁäÊrÂr¶ñ j©¾ãœíµmÍ9N½Ö°yÏöõ¼«2¢;kõ²z=ÃI3eÑò%"ºª‘ýxWÕN RŠ«*ŸWŽ´`Ô|ÅÑID"¸À)éïD§Vîm3à2r‰Š$V÷úîeº³!T0XÖ%†…­-y‹ÇEIt±ODå×sç%ᛉ7>_–‡3§·A÷ÂÇû×z c_ö54Ó¶ ˆƒlêœs49 ¤‚¢5tä.vkç`‡·,=ó"Ùk¯0×Üûà¶rPs¼Ä5:<\š#ËoX‚O'uÊTÄHÅ8fšNÊnnˆËpRº—L`–ò*Üš+ v“=Øò7!ùló"zDºð˜FXÄBK8¦7ªá+rÁ,ŠP%dŒ=°e +ÓZ¬eF4 ¡"ÐT‚‰ÊR`8Ø#c͸hu3¯ @ áHqp–,ލZÚ˜ HÁ†©Ã†$-HŸ´ 1Lf"ÝÅYÔÅg©h»Ãêå“ÖŲp*e$OaJ@¬ÃÎÎŒ"„‘5ÖEƒ=yÎý­¶Blà §tševDª‹*Â]´F˜>¿‹ù%ù¢þâ`dÀ¡–^‰6Î/î,íoçiFÿx{íܧû‘]_7}\;SëÄk‹HgØ/†">!±!Ø^A¬H“öÙñÓPC, \“еW H I…à*­~Ì[ëóß>\Ì‹8â¡Å!-_Ÿâ­!Wð¡|ÃÕù#ÞwÒÆÎÒ±“"âDm×ÒEŠ# ¡Ò²7O¥ôqŸÓ«”+b®ÎBSÚ&W¡¦Ñ@lŸ{ÝO­€­ ¶¦¤)æÉ½´çMù^{<á]‹T<é̪ƒC¥ÛólÔvü$^®´+9žFÌK”vØXˆ…Tß×µæ!r­1Æflj¶çLËäòŠÐXÃfª‘ÆÜxâ·Í CqW¼ö¡!û ×uBù‡öëDÉ7‡OêÜíÓá8ÃKz¸ã(E[ØyÄ„™–ý\È!T'Qô‡Í?ΰgÛ æ½üô¼;Œ ‹²ãHE¾QJëò™`Ñ:Ý“ ›&{jlQ@ "IŠN‰–"±KÜ ”VÙí­ÅÐ[Û.>Jfû€Ï£{?è©ìÚü¥$\ûúÖ~ÛóùOœÅŠ[;•<®W¾RÎ~"Æä””úÆêêA<à(5(º–n“oì’ž2ÅÔÆÊÃ:òU[&¿3‘>i)ÁdþçUÎŒR¯³Ÿî½;^S—z>Wïö­]MøÒÃ^Ãj£Š:«ÂÀEIÛOWKˆ(¢TÅ;l HAPz¨%Ì+}öî¿Ðæz‹­A;Š±åŒ§¨ßÔ-Zí ¸‚U—1.ÐDDº+£,j']a†œ±K.4€$ÀšsǪz#ï°§½«un¤a‰²¢tZíF]MÒô‘3¹q9S·ýq°µ}:Z^û[ÏØatÖž³ÍÌÑTeREi“!Z]jÙ¾¨·¡R ަrXd6¥Jô`Wx¥À¬ê%Z·U¢ &h©‡Ç7”iu[¥‰ £k¸ —AêÕd˜âPWêXBb:3")ˆ`›€ð—¿>±*ÛLo¿§Zç Qè…Hˆ•-§4†âš< ¡jÎS¿óTu‰Ø’Haèb3ƒguïa¯¨"ÅXª²f9áŒì¢* 2°`êÙìQ˜mb]gY å_—¹õ‡q&Ý;ˆTÂl&£—ô[z½y¿Ñw¯¶jš-ßâTU÷Öµ Í]3&U:X×­tÛI!̰ŠÂ¥«\:ð;ê?X6f] _³¾.X™‚ Äe¬DhP.ò€‚Ø´Mî)]I”Uù¡e…°;PUb`Æ´(?Ô¼Öù?0?ÇÊk³«CÑ3Ýö]#W‘ÍËjîÁ^,ã yU¤B8ÐÔs®¶B®žÆ}¤,\B+Ú­ÅH4¥ "žè]sòÚ“=V©ó¬[ko —g )ëENLä^MV<.†è›¯Ü»ÏŠäÃ÷[©¿j~pRÈ à,se¥¸! @¨?WOwH=k(Å”‘RaqßÄ‹Žg\W¯ Jjý×Óz]3¬÷‹ªfÜB!×ãÎÛ‹®Û9¨:œŸ{íH4¢«¥ÈA´ç•»þ„þÎh‚ò)ƒsšìåô¢Áùu8SÉh<Ö* ”.V±tÂÂ…4S©¿ÙÏÏÔj• ËY­©4=7¡œxuŒžæÃU‰r4ÙS­ÎãqÂqòs‹¬æEŒgÿ¶ù{§Åyö̵méªÞ“Ãó[ñ^žÇ©h/E.†Gvk.þ´gÊ×Ò*¯oò±ÁÚ~œøó·­¿쇶7â ÙØ¶fƒÆzx©½vÖ1sÎgj³¸Ö™_ó®ÙÎ[„œU ƒºÊÁ”ÂS³5“`¹Š@0TƼÇþýºyzil¯Q/xóuwáöŠÃyÐÑãk“ô÷îw¬xúþý틽yœéñ²‹¹ö t3ÈæÇÔö ìÊÔ‚=y%¹Ú½5°at–û^†}5mŽØF;k·G˜GáÝ{WûÞùôî‡=Í5¶6ýB-Èzü<Êgž Œm'á¶ÉƒÎâh{_æ—€ÖFR= vQ# ÉÒݶîòôo×8ÙÄ“¿Qq™¬Ñ¼ Õ`”¥_¥-ÓÈhÇ`ŠDN)d2³ ¬Ä%R&#$id„>Vî¶ŒR‡r)Ž¨ÄŽP&u‡ŸƒZdh²¸D`’„uT&0S`DŸÛJl•xX™cm™ †ëMsÖº L|fêAk¡QѬ8qfhoWµR…’Z›ÔÏÆQgka¬E‰7‚*‡'ycÎ+ÃE~LðL}«y¢Éª$:%ÞÎþñkKº¼e!Ý^zap…8Qm:¢d%—¹±¡×zxtmë°ç>L-å?ü`àÚÚ–»Éߤ?¹þ&ûl7®#ßÏÚ³®µnæ«Ø:ö¾¦ã_j¿–Uô6JùU/Ö/n¾¼ç¾õ%(aÝ ö`ÁÇ)ŠÉ+°öLÏXßùqÏmçk½÷ÅpôH½=9t§’qxÒG6ðr/n*Y©#8Å%"c´È£Â”\S[8(4[edÒÒbNô@LjÝ»ï)M‡+ÍЧ…þoÕúYÅçZîT×ÖHAuP€‰ÖÀ/ŽÇW¢wªvòi°´VþŠÒïHpSSÍ)Ôxº×ÒE«JAœm¬±-½\X¢NئÉlK qÆôŒCg¥Šåœ}ó|i·5áx^%¼¾Î¼NÕ-\Φ=1j%TÄ¥\T “Neý<ßEUëã»y$êVÎòô¯ŸïÛ¿ïÛßëêóLfüÑå>Ÿü±é+·ÞÉ»wôÁ~S-×LJ›½Ôøî癹•‹o qª«çGÃÁsÙ—!·ýD_Ïô$9{€j{Às¥rÒd†Ý×ár÷¥³é8+ÎÉkÑ»û5¦¢izSõ@(`3a6tÉ.`Ë]ÜsÂ-Тzâ>üÿl2—e&Û‹ý7“vÄÍcGË nC¦`m]ßË=|‡íجâk»¼üÒÆŠ¬ ·{®ËlCð…ò|}X¥+ýåZk]UŽÄ³\.VböÖ6áåÒ¿«[¶Í.^üï³gWغ^¬ÉÒó5ö£ý` rÙ¿Ü—{FµÙúæ½§_Æëöû]Ëù³]ÄǃóªzÔÛ,嶈äi¸–˜……¬}ÍbÖ×·Ï·¿ßáù¨ ÿÒ²=ú›³îFæ´=˸pÁ·ïßÔ&.—Åqmlð'Ý”ñÉ qn>†Ò&Êâ £ñÇôÅø}ßXÆOœÃŽzy´³.µÛé3?·[Î3 –1ÊöËÃ=ñÎ}}> Œu=e¾´Òü»Ùµüv=÷ËÊÉbÑΫ8 gñþ2¾¾—jÓKÕ–ó^–~>Y×½z1ךýä¡]g[.mù˜—׿ßÝ}+ÂäNëož®ßðÿ|þ)Úùïï磕e]ìËzšÜÛk[¤¬õ‰ ¼wLÞ]üS9ãÅæo½\øö¿;»ïûOÕI «ï·Ù·/ö•é᦭ãûý¿ßÿÇØ>Œí×øy9-5Äü° ßó¿æÿì7þßæ}Û²È%‡:äÙΫ WÖm–_£§…¶F­–½Ú­·ƒD7›PÂF¯—òru Aò¯~Ä?|uÕ j[VÎÐ&ZÂ+ËgZ“-Ä[5£ƒã™»¸¢•Iåv®÷Ñ''S÷%Œî%Ù‹`q-cqV=ŠXq\+àÌêíb£á´wªû‰êßí_ý¹P#ˆà4”²”Û¹OäNá(j¬ñêS/Lœ±:âeBÌŸ^ç¿ÚI¤A³QFdKÔJoF6Ãq‘µ9äÙH¨ÙqÈ€“`U!߉H›Ï§[œzòýÛL 9Ï3Ìû3žo›0¨ÃCrPØHW„Â6Rè(‚b¡Ôq!BˆxŒSTÙäá‹*6ž†×Ä+¥b@ªÒR*–¡Æ’Ð"Š"‹jD‰È Z“)‚£@ö!†p˜;X YE$01µ¬¢ÇÆHXrŒ(HŠã½ÔÔH+ðâHQ˜ÌfrBGFµ²Œ€¢8iCvH@Q kJ:Œ¨Ã\’5!:e‹R$$ i"a†KÆãXø1ŒcŽ“›è ¶èDÈì‚÷Õ…s4nUµ¤¶d9% ž”"€àûR5 ÍuŠÑ¿~¼VWšˆÔkKKÈ EˆëçËøþãÜϯ{e,µ£`^î·=hYö§.òaÒÀÎp3¥ 2º#1 Ž©ƒ Œ‘ŠÈ×½O®=Ä{i†œÜN+}ÂÄ£ú" N=~°Go=™`ÁÅ31p£RÉCýð^ñ ¸âÆ¡ƒŽ«Ú¸¸š²Ø•6lm¹dƒŒ—<[o+U†tN]@%-¸ÆÒd1hÀÜ&/ä2ˆÈ&š¥‹`I#LhG4 Bù*t‹“r©Þ1 ¸ˆHË Rªžz#já™jí•"X­)ÏÅì™DtkKèÉÄŠi›Åª@,šëã®ìh:F]Ü>æ£ËÎk¶%wôÙœ+1”¶ã[làMþÑ<%ßé\e†æ{þ‚¿ršË—ðsånEÎò&èäpûçsþ¼ï<µ9Ó?%Þ×úô0÷}j«/ë;îr¼ ?Ëð[P>N~ìxEÎãöûmz¦¿&Ä‚DZ‘„ ˆÛgŒ «¡ß&W€³‰…[$KP ø0…1Í¡¥$ûŠ©%"OR&:Öî?–eœÓîå˜,áÍÐs2ï?ܽYU¸Ùã´#^ÇÇn5ãTŠƒQ˜#¿XoFJk& a(Ó5†§–p¢-¼%W¬&›÷Jk%2’qÃÉzòéýÙ#-¹P?VÍì¨ýœâ>çþ]ª¯î¬Q\¯J+6Ð3]âö©M*Ń"€B\ó*àK„MÙzp_N¿lníçj!öÑ ŠöÑ`Ÿ–û‡k¨¥„ˆ”ÍK´²õZX3S.´ר?Ô€FÍF. pÀ=³ŒqÚŽfå§¶ö]ZóÑV€!¨Væù9\4Î=ë«EN½áõ‚Ï8÷äÇ4ï·ø)¡}‡QŒ‚Š©Zíb,%¡T÷õÓĺNÂ)gsUJ T²q¥RÐÈD¡PV5 ª ¾Î¾…JÂÈR+ˆN¨f*™¨ ˜ÏXŠ\:µ¡ªÒ·IŒK–gã’cKhPr Q¡.<%ƒi‹&µ—v’„v±H8‚— &²µZZø™ ÑzX˜ÁKVÕ½˜Æ+žÂÎ8D’Qµª¨+¥ŠyTè™Î"G b¬¨«G«t4ž–zˆ½Eì2x§è‹Y!+r+MÄ ý$¨¡ K×µú¶jÓ¬žßªÈ zйyT‡÷µ»_Q¶{ ËDÛ8…àfa+jÑ [0ÿ2¤ÕghKPPE¨±dETâI+•„cD²`,T˜¡„“\æ.a¦ŒS!Fm!ý©hjãú©æ^fAj€-5(3닽âK¤¥xXaåX¢FXa" œ—-hïÇbŒMÛW)Ú€AD  tG¦îš27X”2…¥# P*à’±%C°ÂDhˆ9Ï!X¶v)6ªÜû«•§§¿*¾ŠŸbË8˜À Çêc¯;"èƒÜ_ļ÷z¸"S-Ò]Þ¹0bsõX“c)íu#Æ]ÚUÓ3¯ãäïÐG4„+gvÎñé—Ø»/Wãíÿì8÷ã93½>¨ì%éQÝ]qg§Ï‹ÉÌÔÆ°>gTÖ5t>ãßd»¾vºO\˜aúÞ=~E?ZzSkÊÛtXèþŸ¾µðD*Æ7nüÞR»ê°¸¾–RÒ:JÛòü,Síì€v_GLš† ’[Źڂ¨m–½¬„È×í'.´7u™<é&ò!7p«Œì¨zØÑV%À{¬g}´¢Då²Ü¨±ŒŽÕfñQ ¬ò2ׄÈd³c¯á¶R%µd†½‚ÿ <÷öôÄ^éu$„ ß4ƪ+¦³ìÁŒ›6=*“Q !Zl·:"BS¤¡ƒM昇Æ-jº/Ø0©ˆVá%k™Ç¨5…§š¹LW*ŽÃ…Ž\'4â‘Çs Wåh©£À­¹hF¹H¯Dîóœ0abii{EƒÛ–aªƒšËâ=›s"ˆyªGÜ$«L†Í“§N˜Ö•Y/üM@Cž@¤«/~÷á^ǸjŽnìíÀ¤kwu®ä!ù`ôKK‹‚úˆ<‹qàN,;D'.{²:‘oYP÷n-iñ>Í¿¿ˆ¢ˆ5ê!Ú•¨Z¾úÁ¿òCŸ¢•Ù˜Å~ç¢öÝ7Ÿ„A°6¸þîͯüôãOÛùï|ï?ÈðQÿ÷ÃùùeÏ)oÞøªì¹é_ÕúÒäDn.Ü6cîÛhóhqæ™ÏE O…õ*^©o×@ãJRQ*¤Ðó•ŠÖ:nHÇžŒ) Q«6Äú€)CM˜‰1¬(FL†E´Ã„±eIÂé¨ã„¾ ,wZÄØ9NGL O«ÖÅ¡zU ‡rV3>{µQ3"„%¯˜©ue/Y¨8Sd ÈzZ5ÀÞæ9z ˆiá)J§ÆÛt,]š:,EÓ.!" ŸYÓ^ï ¯êêÔ:Î:H^˜kK µ ¸Ëð* ]ʇێ6lO!›e¥Ñr½.÷1~öÕjD6þ¼¸^{¯,òuûνùhÎÛÇò{¼°öýOó×{üúFr|Q빿ëÌÜr]^§üúCü×.an_u–„¤Ü±PÈèÖ‰)WNž×ù²Û˜ŠC-JÁ¬âŸË½3ýúȼÓ=Ò”)N€à‹€½¤®e–WrCµx î‚Lð©ÉÈ›Ãa–ˆ*cT =‰(Ë•™­ñò“®»—oÏwùø‹•GìeÚáï6÷¬‰|νõ~ÛÛwêÍk}ÿ/‡Ó@ñëå¼]l¾áÂYùÀù|ïÙe™†–Äs‡×ø,ÿÏê·ÛøÈ?kòÚ¦E=òyÆc‰;ž: Î`“†"@ZÂl …ÚŠ³.Çë3Ó¿- v¾d´où[ŽŸû6󳿷ÜG´¹’S(¬áÖèx F‹f5ˆþ¬‡ž`¦žóÛ‘™SF`‡okˆ˜0eÌrm‹é.†)ïg¾Øãù/í׸s&^vîzøÑË9¤qÃä2ËËY¹>1~–G³ÍŽüQs>‹Ë÷ò’GkÒ¿bîŸ C¢Nü§‹]æ¿ïã÷½hýYÏMçÉ_¸üööqïoçu§çcù˜u8ÖN¹ËyÍ:âàóø,ñ*œ\?-ó±–’<9×Ý·X_Þößs¶àî_Úõÿ ÈWfbâ W©-øÀàõRßBÛ%à¯4¯+®³½Ý|o·k‰òDC¬?ìo/ó2¶þ£õãþx]Z}n+ιÝ^æ“ÿïÅÖG¹?·>F\/ǯËÖ·ç~b ÚuÖþË<æòñ·Þ|®•^ûgì¢xÖì?õ¥\í—EŸžì¼œç‡Dô%ãŹë½ráñ¾­x²äÜÒØMÕ—=/±$Mj1e`ÔèEzºÉ±¶§×XþÏÿ:Òë«ÊÃþéú›Ô†µÄýÂäùô’c"U°%rt²Ðz‹³Ö»­–:¦"Ï66U±;DÚ6é$×pÉY°¸siSFaËÜáÆMsÑ‘£Ö•\>ä&¢ZÒ|I"$êÒÎìèO`º®v“pÛ}¾³¨LüõdÛùËÕÞÝ)Ь„ŽÞä&8CV¾ßåb(;Ù%DZìì")¹;n?ÝÝ×\~ÃvÍné3´=RG·Û:u™Ëáñ·N^8Ït˜,Œ“¬À­¥*íÌjH1ß}u ©P Tª„*ÐÇá({Ýéõƒù¾peÀ\b™²ò¢P²a/Üݧ–\C „d@\후M,´`J°‚Ï«³f8²[ÚÌbÚ—2¤t9ô\ [E¶‘V$m!ЀJ%`/³[Tˆ:E2â=]KUfKUÅA+RJ»†M=‡‚³¾®@™¸Û½M£Íñç±gŸúzÉžuñ±·Û„s]MÏrŽ™ˆ| {¬©A¬Îi“RBæYýí»}2@sµ ¢`F½N;Én4¼¿m•áºÅ½â2\®“]ãHhì©ðû?‹ü‡8¤sx.„Úw¾ãØ0¿ËcÚ’éñâ2íÔE¨¿ÜÞ`Ýl¡Ð$Ö‚H«QOÞ ‡H’6"‰HJ®Ìy÷¼Ï\&né8#µrU³àùk8£±Òß‘+ÕºŠZX«Ê…¥ím 4Înçšá ÊêÇ9ÿF³þVí:ܨºîˆ‡fŸ+´”‘G^ Õ{k¢,×4ãX)­ö¬‰à|GQ׬Aí{7&7üê«ü7õ¸‘mÜ.R1¢ÎÎË ÂwŠ+Æ·ê~[õ…cÝÌÉÝù\ ëµûaý§E7%Ëôá3÷çÞì,ÂW9k’yø±&—§Î#õ(ãSâàR´ø¶ý9oU%žî1G—Ô\Ö^'HãÉ·ÎK$ØÑØY«UùÍ™Åo¶ÞYú¤%ÝXíÑû¯ïNWøøaã]¹¿«Þ——õ¿Á Î{Õ³À75?ÂËøÊ¿ÉÙ×5cå‰k/£€ši\ëÐfvnîWc«4¥ ´gTÕÞ¶®éÚZ7Ñk؇5õèʇ3 ‘e²sLêÿã~~õÀ±!¾~}¬~®…ª|°üƒ$?6?ûÒ<Ô»Šh¹¾¶];Ì%÷b‡’˜aŠûà¢8ƒõØHúØ­ˆ˜Íà]óF†nÁÛØ†;eÐ5š!¯åe†Äè埵®qðûž™}ˆÜ/ó+pÍ(mó1ŽÝ|m,¢5ÝH¬j÷ZÏÝÄîp è£(,\ø vј4ÝW°Ü£uhÏF=#åIÛ¢³¯6TÏv¢ž öB!jÒœ¥$¬‚íÅ•ë´"»s E„¤•Ê1˜J×Rãb™ˆØ†v((æ{¡ÅÈj‡Õ kEsìÏe·52³ìçX´ÝuM7é.O¤ér’3%!Wx*ldÚ¶ 3¨§µ¹¾O‘h6Y%  òá&s¯Îm ¢Þgl­Ôì_L?ðθ2k™ÍnD&ôθÌï¯Vôm3¼8Ÿe®IŒgŠºvF™›j·Î`µsI»¡Õè9J˜t? ÷g$[ê ‰Id{̨æ^­£Ô½éA)ÀÈ–kçu«s¾q4]'Ÿ~xößîwZ7ÜoéxôÔño¡Ã÷¿þÛÅý¿‹“…ü·ÎÕŸd°fë¡ìiýÖIÍk?nóÖsWt¦·Ð²pQ´å_—ï±—‹ÓÅéëxs_åÞS¥/˜‚U ’ô+©ÇMkÇô¾Tw²ñ²¶Eε™‚ܰ¾4r^eTþ¼÷…'ßr©0À^Â,ª ×}ùÔÍ›Jœ¿jd 6—ØÃ õŸÕá–î-†¦]ð V))® ¡ºÅ“…U¯(G8µÍ'»aJ\b’”Ô1éKÚy^Ïæ&Ú÷àãi«|>ÉVøCO¥h v× ³…ZroCÂ¥¦=]9SÆɾۀ¡\u‘´˜WµBÅ« ß”%S­†ÜëMÆ}v[—óûž½Žç.¾÷?Úϵì6‚ÝûŸÝEoÇþn>ýùoû?ÿÓ>~ýøòñŸçÿþÏ)£Õ‘·ë¾×cû_ÖÈS¿Î’E?ëH ½,·ïs‹@‰R—4DÑÀ''àÃmÌ’ÅóàXVeq}Ô’ŒEˆ7À—=Ç™—¬p>ö°“×òsýÈv¼¸ÿå^ö{+ÖÏÿ´÷ßîÖ¥þù/~‰¡ÇzéŸç·:ŸçÖm¬‰9/.稷lÉ-07[\Л¿qÖ¬U`êÔæLaåH|aøsÅö·Kžó!GÉ©ÝùGÛ*¢ä™[\ô‹‘ätl†E0_l¾Œ<;'.Œcïw›ÿŒKÜ.ûVŸ—W”$m6òÞ:ƨ¶W›_SÐË·xÞÿrpßÛšQ¯X ø9nÓ^T™ã;øúù|/e/Ž'ü°±Ú%É#mïý?:/÷fFŠ3Û×Ã齑š¿BœÐiK‚DdEt ª%{]h% ~¤jYv ‰6VÛ†H`û©0›§@…9>Ým¯×sª«-dòCßL.»wt¿’AÃ?(KÉì£^n™®'qi8iמ,n~ Ï9¨•­NnÏï³~ZÖä¨ÙéqRž¿%RpÃ5ÉXrÓ©ð'¶Þ¼þÔ´É’³ìü£å«D‹£Nò<«\uô·³Uÿyî^Ƽ-eª3£~l(pà§O3Ùs§åî‰}ý艸3:³­¤í÷»’ÊkÔ§Óæ<áв°/a"U|zÇëOúSEh•Ï­GIä$»¥OÇ’{NÎÐíøGȉ [1Vµ±3N—Ÿ§º\ú¹nšu"b(óY¾¤¯p%-±F×BE^)ÀÂca–8¤¥{¥`¬2JØ–#®J)¤*E StJZÔ€ b‚Ä'² ifØPÍd·ÿ†ößAûn$I @ãN-1¬˜Wj.73þb¹MZ!¹¤`qY”#>]D§MŠD,tCGJù$ñJ+ÆY90f)§øHÆ ,ÖT¢b!%+P…ñôÉÉq5ë_ö€ýYÞª ™¼2URZ°{4m=î¢)(ýc}ŒXýãé¨ €à÷=BÜ„nƆˆš¼ºø2Ön^Å1«‚YªøÞª÷ÁúäÑ7~Àûã²ï*çts(+¥äª•¦{ìZÅ&],|*Š-Ä9ŠÍ (D¢ÅœN‰â_7„Ü#Ü…g؆-[aƒ1y²l×Áë=ÖЙyЬã(ïTÅ–¾ ÑužRI÷£ÜˆÏèù±ÊpïÖj˜@n¿ÛkÌì˜FÈqÄö >¼wT  ›IÙ¤I6£€±CŠ‹Å1%.2‰I§:D¥T>Ó[€Lbh%n•j Š$@´‚¬<îdXEÄBñ·ö‡ª(®2J’J;y™­ô¼ŒKÇtÀÜ¥ðÄŠÜ!•æôÑpH{9ñlÕ9b¦æPúd:Ο3I‰Œ(Ê_ÝÜ/ÆlÉvòWß›6dbÖTþzÞVåyÐ÷:åˆò[ îÚ6Ž+OË€Ÿß㉱ÄH¼^B‹ ®ÇǪ·›®µ†â‚dŸôçä ÙÎ0„9(å ¬' )$àM/€¢*â"ÀÒ¥@-&`Rb0׆zQ˜Ãı-;mdZuÁ¢×­ÚÏ^˜(ê˜l¶úS¡ÅzàTùñºÙB²Ý.á$&œ€jO ]P&@…Lˆd°@à£IoQ˜R¶…8¼MD¶R’éX UVJt†ÉtÏ›Xws]A<·KǨ ]—=Ë~Ú“R7î Zvuïô(I q*FE4õ¹·ò%¢Ú¤]Ük 8# ŽÁHdNY™ØUgr­ý+ÿð{>‹7Ý‘O•Û‘ѵSíj£Ô"~Øš(öÄÏ)’^™OM±Sô.‹®×4‚mqe0 ½ìõÕyÀØ'›Îú¾v2U¯]o†*[gLÛÞummê†këøNúÔhstçÎíµ_w-ÑFMH:0wÁ â!Á¸(®$I`¥¶]T)pbšÒV=É'ØE‡ôž|¤ðbËŠ¡1 PadL$.-S…£-Qâ›P€ @¥Ç;h:8ªZâ!0AÆU¸È:[jNÕ&}`wJw§ªŒ„ZRkj%Eçœ÷½H‘ªRË9TŽô‘ãVu³ZV@ˆ²”A@’Í·"ÿ@` Ì ‘8êõ®ëxÍ„ß5çÇò›Å“ÐåNUõ¤Üù¢WLå!:BŒÄ$"ÒÔb×ö4[`  Z iJçÞI·-/Ã%­åF´ÜS^ÐÃãç÷tL‹jcûûðIæ*p\É TA“†ˆ ’ªBp€x e+PŒÈ-!á£üTaX´ª:°GP2 DЍ¤\±ã¹y©Ú0KÐ@+ÁËHh l¨Æ(GÖ… ÛDPºµ"“œoø‚5 +‚Î,`©’† Bap[\†W¹_CÃA¡\ª•JÆ « bÎ t<Ùr¡h!&Â4¶^1éfá2Ìã˜ý>ëéεlùâ¡ö•™Ù%Ǭ‰_°8—Óµkª‘h™Ú˜=ÿ&ÕE$e…úúD¯jжö…Þ–.,!;è©`läæjp/ììæ´ Ì>ZïcåvîôAÀTiû¤us¸Ñô±Õ‹±˜v)êC²ÓŸ¯«å |c*føAÏs*ª'NõlÎI¾³»:e£X€B-ÜÚ½¤®$ïsi>¿½_Ë¢w ´Ì•ñž¹ÝÕ×§þ gÿî˜|¢Gºóðòú:åÑûõ(ŸÈ>kùâ³v~E†q—zaKòºN-­uêÒ¹±ÔÝmfòkmõKì²òñX½Ook‡FÛ'¯ZõeŒÞCˆ”7Àiòª@%yÄœ6DÜ-›ÑÕM“ßz´Õ‰šÓÈwžÌ¿ô‘ú §.W3÷«‰¤Õz¤uWŸî ß©…ŽËèIfGg~¯b­öuMè•sJ¾g5íÏ)ÖírP–j…Åâ"ÔÉÔR¨½ÆØKÏ÷©T@x_`rÛ>¹¢e‰káImz,ud+.= ¤˜¦±ÆÉ`Þ^ûꢀÂÚmƾË1}¹¸ãv_9M¢ÀRZÍðÄ.ÝG/y™®fµ´¸pï›*qTÔò9z]ó_ÚÞ7£)· ²*Jãr¬Ïñà½æZ‘]æÜ¸ÙH¹¨I͉z” †nãB[ÖÔÀJÕÁµy~T59„gºõU (´ã=]¶uMz¥SSIe‡ vº°¤ñHϘ‚ )„Uxís­pÈò8”ÞiœÃ-½Œ‹ O-ÇlõØpjîÉIg+·4tJH‡É&Í„ ±íÕSŒF6jÐäÎq¥˜Ey¦BÄô5QÎö‘ˆí¨5‘B†"×rÛÇ÷;O]ý üàãüu½y€}ÑþÞ§‚‰ëëä<÷‚MÁ 3úoSÆéÛkp"œà½„Ÿ`ÿvQ¸.? ÛÞÆáöHb›Â~‚íÊîÏbÍ‚»‘¯ËÝß9Çd-úÑ·Ë÷¾¬—Ÿkõ¤V9ü¼>î7Ùx=Î_5ûcïË×µ|½â}ôôƒî^ °¹Î~]G!~qø=þƒMpåÐ{ü¡Îåþ‡¯]x¦+àô8G I#©£3K(±²e·ÂLt‚r¦Žù†ëPÐÕ¦÷äÖY°ªL·DQ-t¤9Ñ„ƒòŠ_£â*lôÛcî9Ztwñò¬,bkö×ëùÚXÎ yül%u ÕÝušg&@Ú׎ž’öY(+à…Oš<ñoí¬_¢Dáå|›O}ª]tü3òæ ¹È¯ñ\¶¸ìZ‡ÕßÿlAC¦ÍŸ»ßðÛÿ;öž¶M·‘¹é¸ùsgQ1Ã>l&l·øö\÷tØpQ.+ëï._YÞø(±çîšæÜöãlo÷>öûxh]ÙwÏ„d?oú¾p·cÿå£\æ2wßû^îÐ2 9oÇú/·ÿ4Ûÿ¯C_{˽©=~þ·víŸÿíùùãï÷Ùò±ÿþÇ_oïÛ¸Ã-oßÄ 0—ó¿]ê—ü/ª;’«µÓ íJ4ÄoŸù‡ßóU}Ú ^˜-üŸ/Q›q½üÊ?Ñ—_yJÁQÖ¾!CvîÛu¼è¥´òÛ7ÆKùÕ¿ýèx˜•öÛ­üÌËû~À×VÏÿo{ü‰÷Öû¹Ö/õŽ<åI›‡%.%f%bæ@¡¡MÁ Ø´ÁŽ8ÄÎbý¢ Aæ‚o˜kY/OÃO¿FÈÝþu–RÜAâ^/ìÒeo?'_çð××Ë¿}?·ˆ½<ˆe4mÝ tDbÚŒ6XVG”’ãx)\É¥mcDgúû®ÿze¯ÚôlÇ+üPXÞñ´ëmˆ‘òöv\§3’J™ÙŽ€í ŠƒGŠº»Õ펱sZ[f2åg²—«öTÆjÒuàƒØ¯à¢’ýpmbþœoª™åÇzõ¯Þð®+xÁúÆñ+íóý?¼Ø ¾Éoà—7µÜýz¦®%ê©ÛëìsgÎ^ýŽ1þ(]<îáŽÏÊÒî^µ¸šƒLµâÇÞÅâ7Oo™E6Þ"7Î8Î8gl¤#×½ÝëÛ ÷u}1ŸÆ.~ç»}ËÅÊF¹+é±Í•ù"»8'_dþÀ×èFèˆ Ò‚ £ ÕOà 4Ê>‡ºÕ§¢ *‘~¼Ç ­ 8Â!.Ñ%Œô×­A7‘cðm"M/)ð ‘6ƒ à «ÔN‚CX°5)€à€²f‚2=QÂDPI`´˜ñLmƒÜ²äPù!R½¬U9B‘“¿‚õ‚+è* ˆ¢´1eX<”BI.È23 ä‘Œc™€"C•%XCÍ]§0¹rà‡õ.I;Çw#}âblº1 ©ÔzÐY^Q?¤5Æ#µ2ÆI4Ô oB X  Ä[ °ŠD)eѲÊA0’…ÀàZo'â©g @YÔ£  ªB\Qª¨–:ê¢';ÕB±5:"‚¶"‡åªªbÅ(ꂊ¦Dþ‰T!($ŒýÝžÏÈ.õóËGŸ·½Ã%¯±ˆt_ZÜçÑvûú-ý7ûØí¾JBb–¶l Hg¥Y‚XKÚ×Xð3{"V ¶0-|ök Çböƒ¬3+bùbB!¸ö4ÑБk•¤­£!ûY˜WéÔž3÷ÔÊóèçÇÃkºØW§ÆÄ!Ù ÂRÌ ¨¨*«á1H=SOŠi N·“Ø‚6úð‡êm*T쥵2(¥ÀfQêA°ˆÖÂc¦C_±4:„®zÙ¼ivìÈmK'–qŽƒ1¿Ot݉ Ð!…¡Z«LaÍ€&èÝê*&àD…‡óÀÏ£&W•*Tz P\²"c`ÞÕ¿fîÑ+–#L -fÉ÷_ k°ÆUdfˆñaø¡¼šóîYÇùwÓý0 :Ìéþ~£=ª;Ä ÐIë€P"P­YÃöòÔH;Ib $Á8ÿ°wÇ/lmÓGô;ýÚ£bšÖß&Yáà›(|~G)Ù¿¸ØAŠ •°âªÚ%:ÁR%Ó‰¤;PF „ÓÒËnV’Í¨è³ ´`X2ÀH!()¦÷Kî¯?¼èo¦– €Åxšó<¸–ær–]ÖþKjTÀ¤µI×Áq¢’7áKY²B“VEj¡J‰H°€IìèˆëÖ¹•F•@†(`4]^·Sv0bÚÖÐc{¸àf×9Y¤R÷»õâlÓÈùôOÝVú×Ö+^ºB³ä,ðKe t¬½¯IV½¬…Åýª0]0M-}äߨîwÜ¡8ŽÉÕŸ|ñðÿð7Î ÑÑ%S©ä¸–ü¹ëÆsòÖó3ï ‰½7æ0“f‹æUˆ1³ Í8nd©äêh zm;׋ˆاB";\ô×IVo}çúçÕ>{Y´4B­5†ŒT²á‡9ÏÈ]º5¶…<øU/ιg:_ï“û8hd™æ9fF­‹¬Lõ²ôõbI>õ>Ž­ÎÖs~Œñ ^Ù­Êsƒ#†×8Þ¯ðÆõ U]™ªµ¬žô•ýnáµ{=&ëöªU†wŽQâ©fJkXeôQÑåÎy-ÛëO2Šˆ.Ùk¥Æ*¡¢;º ƒg·?Ý”ÝHF†}lG]8íþõ7ósCŸhŸ¯Ô}cØ÷Üç7¾ùSþΟ¯çkN0uüÚ¾o“·?;¬×qwßµýyÊ{û`øµª’f:—”NÍ Ò^ýö=—¶a.ÂëÂÊé–Õ@3Ýì®ÒØÚe¯ô™},•µq+-ñR txÁ7G{‹kI!$ÔS O¿z­µsÕ¤ä“ [Ä‚¸Ý‹ßðìã'_ïOOån¶÷7ªÒø ‘ Œ 'Øòjù7ȼ¼Üs3f æïk§ø¥q|­L¨ÑšÅÜ9÷:k|¬Œº_»‘Ld=,¯l¬Äq¡JˆÑ#´]rª#¸–åL;Ê9åè5ì–öÂ:®¬vÍz:œCõ‰–ôÕ›uw ¯üžôJµæ•ÕÕ6Ìw‡9Drº¥æÛé!Ù’‹û0‹V4R’Ì‚ónD@cyDLªxæeU«g4Òm ·¨ Â%ˆ²kj[¦8t#°"XCŽG`«'ôœfLF Ù½9 j:A=&!4×]+;Ó64 ø}ù{¦»ABV»¤µ«òq˜!ah߉^×E‰"m`adà àÃV:£†.™m3Vw¤¤¶±€««Œ>}ª*ª":PŽ4Ī\UÂƺ­D Á4ɳ§£nŒÚÃ3‚"·Ð³4Ïâ8ÚT§U‘bâ‰r RÿN=Þ¯hò%Áä·'>¡ª–ú”õWú»ÖLã…'“ŽŠ;…ÆQ *”M™ ϵ¼ÈL& ¤NÄ&ÞFví Âõy0<õrŽŸûO×4ﯿ57Ÿb’Úè4{e£Ç«;Zgã~ôâ]éÿ_Ãå_/˜…0¯ûâ2­¼ªR¹òiÝw×ÔS5Š~'¿ü xöÏy~°>ž.¾àqÛ=X¾Ì¬— «0ÊS5Õ€^]àÖ–UÅ6”ÕÍ»ºÀ Õ:\ý}pÕp¸êTÛZ3ÍKr÷‘שTôõ±Ø_Þäñj¾ð¹oì|P ˜sº›ì—Y·sÅþÔ¤"y5ýýç#éy¾5óúj¦hR—³OöG²“îÃlû‹gáOÝ’kÉ¢ñºü¨ygç½Ù³ó<£WX8,¶ËùVÏý¿ÿëíïý>o÷wXÿŠ_Z㌼ ìøho|ú>¦½êS¿±,Cl¼­íôK°ÿ çÃÖò|j¾–gTh‚ðKGª}ÅvÜ4õ©Af™œ³›‘KËíŒô†xâÛ¢zÈÇwùyAùæ5 ®úùÛËýÕäÛ»»¶oÈ÷÷~ÙïUæ<^—Ì…|‰½p uU±1°ÿ¯ $âTL6N»:ß—‘ñb/ÛVj$&ô8¿Ž"Á%îÝH4_„Ù)ç~9K`ÎH $€ÂÍ: Ðá¾Í]ïúå¾»/?ø·;·×õ—82fÛ5F¹gJm…#ý¯ùõ8³ÿnêCcüf¿Æ£ì¿‹¾ŸK/U/ï÷ö·5?:*ƒûÇsw‘sÁ}?ýîúóebYó/õuÍ¢ÆÂËþ«ÝŽAÑæ\—·q,ÇÔ‹d1|sBijÚQ’«dÜÎïcÛí7oÊ÷ßþv<Ýõ5ß}ojMÇ£üÞ¿Eù0}Aj@n›-î M3Ôe"EÔF³T)’]Š­’HÔZ,m¤SY—‚q.{˜ÿq–§iŽc«¼’1Ž„A ;é¶±×rÏž¡IA¥$¢KÊÅzºãm>Ÿî͸ΚÌ@´±Ü!/9¦½¿3˜ó¸Õ±ŸS¸Pÿãûµ1æM¦‡½p;ðšðÌî3ÀMâ¥1olú®Ogi¼N.ç:Þ3ûàò둳µÛB{$‰u-ÑŠ¦ÎäïܬªòKL¦ lÞá´T½PHãTâ{÷;Z7ó—½\Õ’9sˆ®>Ï?a$WÜZµŒƒ>îmˉgÚS³™OvS‡TbQkh§{v¹³ªncùÁNÃõyÉãú`ÿމA lÂðêåOg СÚ`‡Ÿêí¦× ˆÅ¶N#š­ÉשF±Ì_†"œ cˆâX¦ãM@D#€)4’>’æ)C¡(-R„¡-„@ªBbgãbÉ *F@¤…3*Dê,cw"V`ʰ è/¨¿ +‚¾ D(L+’d "'` ·ÐšzÒN…ÃMT-")œÀ¦ÒÔÃ&âZÍP ’Ð ¢Ï”M0PÅsBI˜ŽÕhLb’!%¨$*qÇ,ËŒ„Ã:ªÁ}Æ«û÷mV¦„Ò »“øŠƒ÷·þgOV“ÂNßÐälջϟ+crn~~r;þà×j²×F§yÀmç:•Dtò‰Ýxƒ¨¡&Õ&P ðÇØÒÏxn™‹fõ›¡¤é êÙj¹”n÷:f (`Y˜`ùšjÑhkK:‹¨¸UÓ`ñ ¬úY„VßC^®×¸+ªê’ÈËäf Yû^;¬”ª½k’óš<[ óùî¹~tÅÏMÙý1³ÐÏ*]ÎX¦g¨ èø JÄl•£H¢¤Äo@£9ewýÊ• ´ä%*¬õ5ÁUör·°Q«w XbHQBRöÂ(BQ€¦”cOÁe—¢õµUY^[a{¦‘2Ö'®&+sêøãáá|æìRMsYwûª{({=TßàM×r¥ëiS+yPo[3!q KdîÚ݉£Pèçñ±¬Àö—܈ªºŸQ— >‰qD-CÚ,²½â²¹AC-‹;¸«ÁˆhâŠ.±ã%ÚãÓÚÞÒ' 4 „0#Ü0Z 5†ñ¥Áê¹qêIÒ(X¢À ƒ©²E ÄÖ¦ ,pÊOÔÐc=ÚÛÉFev—Kíé’¤—¬TW¬"Fp€€Ê•‘ížwî_Þç‹}»>_—{1ƒh2øýˆû#ä…µïÕs ì<Þ1©ü[ë8+fqGÔÈòW vÆ> ¶b ¥Jñù9gŸs@ …jÊ9˜ÜìKO±˜Y.¸`Îáöp•œÈݦ¿òe„’ Yäz䈓4 £Áûì/óÅ×  e!Fì?ÍüȦ¢„@ (‡FÌwöã|,.ŽŸ7âÙž#’ŽèŠtlÙÖØ(ùå<¾ñ0>‡k@l&».’¬y‚ܦ§RAFiÜ'KÅ2/CT%¨ÆÆ…&ìdÂëüT6BYn•S¸”e( uÇë¼gÞêÏ ›D®o¶3oÌL£rrŽübjÕ”“™uÉ’V XkKWtÓ¤ ` íNruê1*wJ¹S—°*Q#"´T—:7Ð8"2çÕȺ´Órlk¯¯å:«¦[u’}Î[2¡‘Hm‚¢*ðÛ*i‡@6r]7½(&‚p¥Z ÂK,J¸des”#}ˆçpS{PI{líf‰µ€/sâ0Ü͉ÎR×PÌ@-•üo˜ðýͲ?vj2?`Ý…N}6[_K¦XìÞ>Oh­Ä\R,UÀcKؼ9Ý%ÓÜóH5F |ËuÕ_¯ŽÌkîÑdɾ[N¼ìº=ˆy¦UËD'GLL-§œæ­˜Äü ÑD¦ÑU à7¥h4%'H„´ˆ DPXt¢¡`SÀâÐë >…¶Ô¤@$æîµý:Ís-ˆÑ@Ȩ I½èçf:ÐÄ’fó×Öú;”QHšÚ—$.röëÊ b‰'jD Z€-)º'³ R„ì¶ +¥Í9'ïE°@k¹™U]În`W.ñUžÆ2×ÃíÝù¡~fã½ò 1…Ïü®¼½qýå´Üï¿l®­õš¯UãÓGÓû¯²ü§ôŽZ»ÑÇ¿csÓÞVüãMŽ©äÇdõ?ËüÝòóora‰ ºÂµ^¡ëá:@ŽÞoOÍÕ7ª ÀÈëvàLBñþœátÌxµžg®û°fÁŸˆ¥"'™q¢t0 1mw¯1{4ç£[}üÜî?röð§ÇsÇÏÝýÑöæçSürªÞïïͲç)·åê—/=¿þ…¯ßäÔ3Û?ì=®B·Ö‘K‹ËÇ©=Ò>9‡8;r‘}÷9‚GÅ̵çh?„º'!þÁõ¥É£ªýì¼ÞcÆl'WÕ^;ï¬u\RˆƒwG½³ß¾¯Ü8Xl|Nß<íðRWUOâ"û«9ö4ç¬Í×ýUw‘ÚýH®˜¨jbxhÐý2üèÁG\Â}¸\'ó d"åzØ´pÖj7ôûêëmo—ë«se‘Ÿô})¿™¤¶¿6È¿œÜÇÚÃâC]¿O´pÖ)VfŽï«•¯_Œé圤’Hn”tT‚9³ÈñI æýH±@®QuP¥eÑ 4›š×HeØ)l;Ø·d€û.Ÿ"Å*óÊ0E6%6BC¬mÅîäaà(·‹e´w¹þüñõ/%hÒ9V’]r¸BçèГM£É6XéhÙPm(÷•ó8¶¿‡ù­•¶ŸÏ^¾{üâèc‘š'_×qÍ×Ô0 h@Ò°ÂŽ6*¡Ž£æš™4 Þ‘מ…|Žã±{ÞÏÏyƒkšTbojˆ+evS¹±®­Â3ñm.¬Œ³ÎõHæm-ÛüÖ‘vñ`ãFõÌ™Wߦ;¦IZÄÀ‹×&ì1–h—k·ÂMº£G_ºÍÁXêˆÞå*»±øvô]âjƒöÊ~oZî“›½Zìª!ÔÒËà‘üm‰"LX† {Aw$"‚S‹B¡¤ÝWŸdf"`0†×èÞ S Ô(ÀHƒn@rßuÍtø:MÅÈôR¨Ç¾K HÁP,YµÊÑs œl‡ûÅÂÓpû -áHô†=:oüYü´5³åÔ×T×ÑúÓ>ÓGÞíßWkP¶I³Š/^µôqµt'ÛøùoYÖþk¬¸ÖŠ8$@’V¹¬×çž^Ëq;Ç$ü7ŸçI3ðñŽÿÌúý¡{™óµ‘êã§®«°XŽ]kIO=€×u·3/û4å"‚‚[B$¡9ª‡æò¶5(BCÝI”ãA={Nëš?º8-ýt®Õ_Î÷{ÍÍ œv¿îGøz®ß~™ÚÑ#f8úâ­üÎÍ•ñc¼ŸÎ×þz¿ë/ ]¢t×çÅæÖêÏ£×xElž²ßuu~bª9ìýÇtWÀ´Oùþ 6¹o­éÝÙ‚¬«ç5Á<‰´*úÝê ¥ªl2“ÉæJ?ÇeÇQ°iõ}î/ËkW¿«Òçz×Þ{¼Žòz}\¹æÒöÚÜ—‡Y“`.\o¯|I¡Æ_ìó,v_;QSÄåøt‡Xãº~ðßžùryõCw5ê{9íR?ôaK]v¹~Ư¯?×?ák—÷ÇO\ë¹ÇÇG÷¯òãó-K&Þ÷Χ¹‹ü©ºýÞ=ƒ¢ü×ü}®o+ÿǺWêcëß˽·<Ö}ëËþöpyZ‡-1+æ\¯ãýŽ÷{|™sþÞü÷jòâ“ !¢aƒÕ4جå¤~g]‰š¿O·oy¾¡=.“U4Q²ÈŠ4<øÈSQ‚I m}€àÅÌ[Œ†™>á¬# ‰—±»æôðY||§k +žù3ÉuA—*gÑxBÍá Ķ˵ÜbÅXíqNQ•¶ûÿßn‰·?Ù;ùÛÿuØ÷Úâ·ïïúÇñ÷ßÖà“Ô”œ§{?\{‘/Ú^ž-.¾zéÜÌÞ²MI—s–{9xжþý5Ûùï»ð¯—rÇóùåyï|‰‘#' Yo„2J¦>b‘›e;·{£ôÇm³“KîÒü©™§ÅßF,ѶÊå¶/H9ÔÇ|˜êjž@¹H†m÷]þÿÿûßü?÷÷ûöÿþ7ÿ®ä¼ùë—_Y¯…yÙO+uy*ùWh‡‹ä2³ÝóÈMbehKIœÐãCÄppÊfß˰vÉ«ÕÕÿóÂùýjo vs•i¤iÉ;IMA©l1ÄŒX„1^éÒSúJãP/W;çÞ­§¹¼žÜc3W2Ç‹žå"Ý<ìøÃC]©i-µíoÍ·wC%öGܶ+ÝH`IÌ7Æ­ƪ߸*n_Íý­¾ú¡„KoÁ5v;|\íjú8‡¶ö\ú÷x{8ïN=˜.z??ÝχyGd^T³/€lÄ·™òñR0(I ¼v\ä0{Ù*¡¸ØFqïß}²´QóêsÎiòáï=’Z3àãáõ)«¹{nàž†!Ílmf§JšÉn%!ÜÈMyŸ[:´fôã©Ñ}>«\Kû1ät¹! ã :Ö™öFnÏ&·÷§÷ qc®î&r=“¬³æ÷} õLMÄCtÁ *RbdÊ•ã²#Àb%ß!ä"Fš— ¤ÓT(V¼´b™=42´):v¥H CBTÀ%MHgËçÂ%I.jI¶Ì­tŠ!¢,&˵6F(Y84¨$HȤZ¦`Ù­HÏxu&b,8dYéV9¨‘P (°S‰FÀWÊ ëTDà4(´Æ\Ì °Å$HˆAHE‹a&YsÜç±ÌÞ߇ü?—û¯èl¹{W…áµùŸ!œÉ?üSœ?5·b›{•¯_¼s~jßó*¾E€Bà˜tŒ® …2T‹ÐT“’žó( "Á 0ð·ÿpïý×A VZnlõ¡çæÄNî6‚•ÒÐZEˆ@9KçœÏ/`‚‘èÅdzç>¤s¬J¹O…) D)!A$Ië!UTaĵÈÄÎÍ0ˆžƒyÙåÉ×¥¬š.š“ÆÐ€Ï´¶h„<Ã}fåCz˜t]W‡Sã(g5FR0®Éh­@y¯Iíï´JkÚº!•@Ø€–6 ±$ ›jZ“†BMîññ™•Ò¿z7|ª7°˜Vá'Wm7‰ÕëØªýÒâ{ÚN¢y§VòÚŽ\y¸À¡Ýncì´Y-kƒ©í–%¼t,~ óW®6oìÙ¥½ºô:•L–ñoW›Ñ;ÌÜû¾j…Îm†8O‘Ó…‰rOï“ÏÝéõ—öÇè«G ŠB}ØsÌõ7Ñ9¬“›OTû2O‚NqV€˜^§Îù;ªBò®ï¥§4´ˆ…·Õ|ÇöW´Ñ·ªOø~¹»e­÷{ìœGó@­Šu‰z2R¦ñÀ[²%$éUa›šA@DÓÌdÂr!S¸4kc +žŠÙ‚ðHÍßܬÿÈLQÄ3´d’ØL—xÎkk¬UÚÚ#§zÓóÈšÂÀ¾¡Q¤’à+Ôš4û7t? &~`í¿ì©„O½X¹–¹©û ágC*—fƒA{o×è¯ã8οhÈbŽÞÔŽ6pQC{XM JšÈpYOW²@A܇Ew÷QãÊv¹ ºIÄýyð‡Óÿpÿ-øÜtõHõ™©¶Y?/a÷ÐÙdvŠ˜Øe†ñÎì¶çí;…êøf,  \; ª|®j–Î(p„€Àj»øA®VÉ ô^ç<^™4•†G`¦z—½|d†µÂ`//!…ºvÛ¢‹;QÅo o ÔÕ ›Á£1,d˜ˆDReŽ67\Ñ“¢Ùìë´tŠO“òâíÿ{Ü;çžîgë ÌÌ)®r¶î‚3Á­Tb åÛü”rÏÂ6…4½ùÈœá‚Ü0Ñg· 9€Â*y™³û„BÇ\…ƪ+ݶ\Q”…¤ ý3/¨[p¤ÊOd6Vê܇ߊžä,UèˆAí¸3µ4þ´²~¥-Ѱ±ˆug°9dûq·94ìR»£FÞOéí#ü…Á³ŽÒ£\µèÅ|‘ßJúšøý»-üœúܨKöœÆ«äŸàé q?¬?@1ç¿üj÷xïýV3ï¸E«ðæÄ„|-Mï6—Sh`eús{/®}­¼áÈú;8k×?èýPζÄÛ·PYõ´H7(ø‡+j¢ÌÝmYg×=Ì;–÷¯ä­ÁÔae .ºÔ¼*³˜“ÇÜF½ÙMðÛuôëÇád ‹R^töÝ{ÖÂ6U<|[Fù÷Œs¥Ïª‘r‡kÜRFŸøˆa·? ÇmÆS˜\–[T‘P8-úëãšJiì1š†ŽwâlÊ£c±´š!×5~†_žxWŸ?äò÷|ç¬;Nào”S-Gg€#â²ý’‘TûêÜc6“\_ÖàÜjÁ˜v¤hð2[IÛz¥«kd=ã'È Þ¢%0šêIÓ6¢–DÙ£Ñ#O7¬–["dlÆ×耩f¬ôè~yÿj΋aAR5ÍájŒ ŽÄ73q«K"×h WµÃ¬áöuÃ×°Çù\)¤ç­ }woÄ4AÏQx;²Gœ5FŽë¤QL{'íÃóÍqÞhŸWL–V‚‰¬EJmÈ£@Yƒ£EcÜ~š?L¶ÚÚ m:6˜©‡ˆ›×Á´#]¦†óa:i/Szw-Eðp…1¬–”`“ëž¿ªQbi3=ŸžÁzLänl3›ì›“ íÉÍu/XË­:Âêõ°fNûÌ]güŒV¡eª致ù’ˆ†af ``XÂî†@°ŽFy¾6AQ•#‹´Ý?-ÊÇ2cg7c6Ó¡¼Q)\›¤DCZæ'…u…¡‰¥Âc;&Jä•òñPò[Ñr[#“ɬ-º©Hz/˜Ì™1Q¹ßͺ8Œ²vµòÉBñÌW5xy`ß…à|òÉu,,Y²¸ëÖáªwr]~ûUs"^ø­ÒAiÕ¥z(ÙÒñÄxŸ;®Y™¥Yª¤Fû½ãºjÞ&RûÑœ™’´SËý`N{˜es;Õ!g7š’!|!6=Kw†2…H9.r¥Ð•ÓŠêf1ŽdI8è ™•ËMƨq£ KQ»è#•¬\ º—Òo,|ì¹!õ¦ÅøpÆúV¤-îQÒ‰›ºvœNK°Ú¥–@èĆ文ë‚Ð`N·"w7N¤5‘èðÙÖÙÈX{]w>RèÚÍ”¬0-šâ¢lŒxB*'hÊ*9æYW¥ÅÒf dRÌLF:%MCÒ¨U& Ô £ 0¬ P4,°b 5I’¬š<Ã5BHЕŒGÍ!K‡’O¹`€#*àT¢ ƒ%l©Á9„ ”©”!BÚkTµÌ ’ Ɇ5A'éA<‘€Ü®v•%jU˜nŠØ@R#*Á†‰[i[‚A("ÞöÞè`F`ƒKbsdÀ mC"Šœ„À:–(10Ð!6A" +  ˆ  #8žòš8z‹bŠž´G4zEÈ€¬¤4C„€¨b#©E"`!Xª@^"H †,@„°ebcYÈò¤Œ¦¯–„öPºc2zœw?‰askšêÚJÝT>­UÐË*F{EK\fOÆaUŽAåUÊ ƒD:2a×qƒ{À¦1ä iÛÍ1-BP¸'ˆ˜k,à ­! ºbX ¯¸DR¾rA¢BŒ‰Ñc  ‚T¬ØPšRTqž0§² ë)V.¹ O´MjIMƒlè·•¬"Që¢e"òa7«TrÑûÙ8;Ï]ú•GBªÙlÇæZŸ\â¿ZbKm¤‰­¢ÑO¡¶ vß.Ö·I,æ :"ùÌÈ~È™®¯r>¶‘ÃÒ²òÖ¦¢­ŒFÉâÐl¥m´{¥CÕ ¹L¿oÛ¹´ãßkÿŸÎû ×úŽê*ôœùz­q¨\Ÿfýo=Osfê{¦s‘×üþxý–öz¨un¿_oÕ>ËzÎ#ð^UÒø4ÃÄßÐóuY«ê e‰\‘ ½ÅŽ »¾±·Ì³žíçcNí§ ½G¡6X ¯»¬ð~>5ºæÛÖúèeÞÜ̯e7CÁØkçéyim{Å|’´ðB’¾²').Š¡»±“]–ÂNä˜ôB²˜§¹Nà&)ËQQ±8¦)q‚ëJƒ/RÇ$?-ÌÆ³ôŸ ÔÖä3<ŠZfWÿÿƒïÎGk¨0ù3> þP`ÀïU„Ë_j a¯¡.ªP¨©Š¬°À~ôüYBª¨ŠPõ’õOÂÉ’Úi¹œ¥¦¸ Õ¥PBR%«ä’`ÔYâ>s¿ezãS›>{ù¼sÏA~(¯³ÒÒ‡ÀB”pŨFjš¢flá7媺©YDKá í® Ì.óHú.EJ©E—¥ ÎŒOM‚;2j›Ú™˜9¥3Hü$©0yÓ”¼`f9oì»Ø¦›!¦(ñ ‡ "¬fKC¨ÉQ‡^™ze´[ R£€d6l3[0éܬóÌ“^n™NYÑQ-XÑ# AɇRå¤IøYäÜvôlhÊEmTô‰)mBD¹4œË&náWýDÀ€ËùLÔQa¹aŒ±õh¤¸ÊøØ oˆ¹ù$?[PvLÇž¶ó8~púóŽ'áFzr&÷`*T¨³"mÆJ!Ðz:Sw ‚ë:ä©Ü¶Æ.*]\;•ö6m긜„ C‰¸H4±õÕµJÎ^Ï3` '#v2ÛP_¹Á5XØf —\#_x °VE™t ØAÑ‚)a. äådT¤1@2!H³f‰*bÊõÇ]¦/ìÚò!ÿ!áÖ¥­C%qË™ñë¡ÿ6ÞQäzÐX¾áuÿ±ÓŽÙ("¨J•ÔqêJ𰛊ù4!Ï(®°‘²‚ƒž3Α~%ïç¢\¾†)•NŒ•MÙXv8×y~¤MŽøÜöY-%-•è0á¾ÎØïdÎs=ÇÙ›K_½¦Þk-Í ú3kð EXÞWG‹µmûІ¹nrýÐË8[»Œ¶]’…#‡<‰Ø3³ùmö±¼b½‹›˜ØÁ;¥ÁŽÚ0 ¬GïNEl——{óTΓûøaDøYü!J¢uÁŸ-‹ò ª~0ÿÁf¤“fñÛ÷½_ïõtãš0yÐJÌHÑ„õE¾n¿r=Œ*:T &õ0¢ø÷ùúÍìÖ f.‘QíZpA¶N‹"9ÉóT!*®¢v˜@” "D°ãYÔ¶ýKÃ ß îc8U"9„ÓìËÞOÛƒ8 ¸áh`ÔDBÓ*b™öò±h—¼²ãÖMTcn’×tºßîóÔ[P"’’ÉQ[ê3íà#ü(ú/×^§ršx¨ÑfgÀl†ž†Ñ`F>€Ïž¨òZˆ WÐU°—u0ÀÓ.’ã ›#Û*’…Å+y*œ¢Q%¨½!'¸I28åÍ‹ª²µüÉjׯ¹¶’±‡Ëä¼ñŸ²""ò’˜”™Á%0P€¸14n8B¨BB)ÐY)[ÅVeDž1–ŸDÇÙRŒˆIL€F^ÊÛ=Q»ÆwÞ É”œùÍ|º<ê̱†%u Û«¾¸¥iªlÆ>ÉîE¾J*(”ZgÅBu°c¥8ÚÞµÖ´yç©k?ï¯^R@ˆ„D´EE“{ÏWÙZUöã¾UÝõ:\S¶˜vå—W~Ú:﹜mt¾n#€ÎNæZ;lئï›Þ ø 2Ш…`† ^AȨ{€²ÝfMs.›.Éä‚NæbqµØn*Z9d(SéØò`B牄Aê-"Æ…ªÑ½ô %ú‹ôšsïLý(3*¥Üo_|á¬à #óDÇÖõì8Ó+¶`ívŠ«Ã¬PU‡¡>¼Ð‡XbiFX¿ú`“ÖŽ(fl1ZrœmÄ’ÃÍHWaѳÏ45"Ž$¡ûTÍé}ìQœ%;¶mº–XnJa,ˆîZ¯ûù±æ> 37Œ˜Féx-ÎcbÉ(wΑ;\œ”ú]†<\p·K†б÷©M\‚Íä ë«`FS=Ç´(£CÈbU<©N&W3! –VílËâ+°[©ÁŠžT$HuP¨1O£Ÿ›ë‚3ä„à·>hÂOÀ©òبc²”Ù,í"a윯ø^Lß]{3Y U¹[R]²=‘sCµ¬³Ë¥RàøÅ4Œü¸[;W• FÇ?×Ì¿`‰š|êgÙ½‡Ð Ö™Ã:#´ÁìÒRùÒŠ™0-Ùë 5šmªV…b+òÔá,1`•Á«ÉnÖïqlæFv~ÂKã3",¦¡446Ë\IÙÀÕÚg0‚4Ø"SÍš´Œ?É\ñTëU4°%9œådïVÎOüxE?"Eá©…Æ–…«Š›!ÒW×®å\ל“N°”ŠJRÓíhΞ$W@ÄÒ)-öBÌuZz›hº³òI{ÿì×–/ezïúkü«ñÆrt»‹`JÅUH0Š+ɻȋf*©Á–¡«`Jú´%^(SÒzNï [òf¬…DÈ‹´®âšÖ.¶@Šh$oOHߥe]Äg4ÉDSK!К9·¥D(]â!E:‚±vZ"…B±‰ž¬•¤R”„Ô0EÐËP€NTG§@ˆö )¤ÂRTW( +À$4BÈPœÉ:ÄŠ  UaÕfEɸcâJb²#@ˆ®TuX¨Êé@T#½iNŸ­NT:–’ð®|å½ÂCÔÞ'Ö¦R Ò¤2À¸æ- ©bÊéwà!®¤€¢À0Õš¸šä‚C`£"X€P…WÖŠë¸ C˜(>• ž ; ÉŠ ™8âQ$ÜáI°‚-& `‘Œgpš§u%ˆd '=J…!"À( ˆb F=H@;-ëf:EèÑo] /´àûì˜ ó0«©ÚŽu(r.*jÇ›¾ÊÅÐ !j@iG2™#•T)¢;º#D²´F ’ˆ" (’¸ÅQ´á5`We iGTÝ›&$,Ñè)ùÈ#Ž1š¨„xM à@8X€r” µ@¡¬‘\V6D‚bT„«àŸ5z»ëÅþ‘Ýz›Eç>ÞÝÏÏæß'M|ê -1†š@Å‘<¢#k¢U«Dã,ëwbåÅ}4KwÒ²>³Ÿ‡>AQÚ•:à´FÄ„ìò—z¡ BL}p¶/žp÷]ûhTËG§êngÉÖ˜/S¹ |äJ˜Æ}=:ÏÓTsY½=e¸%}ql*íyý°¯¾×^Ž×u/³À–¤^Z~þ©·ùGÔ?~™Ÿ s>ëqN°Tyÿ~ü ±îsý“ÙüR÷qvleÞññ!5tÝ”Ÿ=–§÷Â~ÕC«-‘”D1š:Ñ!&yôU[©J­ëô¿ÐkDÍó>©ïmºÿÆG7ëó¹ÏEšÍæ,Vs?“\}KéœÝ‘W¥Ð{²Ý¥š8†œdÂMkj ˆ³käy­I¯ä‚:ý¹_A=ЮH¯þëÏ2}û Þq¯Qõ›¢áD#Sö¡¢öt©ZdêÑEÂÄ-¿„‘'–âß‘[|‘Ë„ØCù”Ú5]29ž ).òA¶Ç[ ÓâDÇFïˆ@ÔU¶IX"+¢Ð£'ˆçÝ‹%MgâJ/¡2FvúVnÙByZø®ýˆ3’;Ý´@—œÑ~®4­°Ù4h¯ ×kÔƒ's\””‚øq…Ô‚’[r*É@~ š6šn(°HfÇÌæ\Ü_ h»ðO¾r—Ííg6ßÑZŽ«zÕ€ï{DTÐvĵyb|h«¢ PH§ ; ‹Mi xøåÕx}\Ï?ZÌŽt°²Å8bWñZ‚3Ó#Ó p9¥´ä[I¾«)¨@òyЉsuÀ2Gô€¥Å©èy' ±^Mˆ†IƒAr¦&ÕÆiîßÎæªÙB ÅB±!‰Œur¼×mÈ =•–b­F.‹;¾}‚”D'J•ÃqH¼ÈŠ”bG‚§¤gšA*.ºÆU%^S ,T%è8ÔÓk U)¡“%9L¹ã™!ê¹ZÅ*9–j±šØJpíÚ1&PAÊ×½lß‹?DGúRµ†–ãØt« j™Y™åìÎây%Á´kÒIõè#¯A•Z'—ŸûíÆó¥Ï9½á€üyè%•—Ç*A”êùw¸¿íj)äОOø7þ½9Â1*T€b ÏÂoú¿Ñryé¹ojŠL×iðç>ÏœfrÐÇ(=îѬb‡a“øŠWt^‘”D׈ãézd«ðÑZ²k à ‚ÇA{hï×΋<_¡Û;2µºts4‡–:?ëúó6¼»™·p"~+x~oÜJ¯U³‡'õ>¶±~²&5¹›Ž4úäê”3ælxîâ­3æéóyÆÜu!u{íýÌ•.q3©h’u²câ2ªIÅÈâ»ìzJÕ §æBònú8óñ+E$?ØWñUXØ#,@à‘d}3bΆŜ”QàÌîø¶jÁÆpüûònRÏÌ¿=Ÿ¦þ(© cÔfM­5·ÙÔk¿Æ{TKÆ  Hy´”£– vmÿh¯M‘7€Çôé@v¢.ì"_`B¢O¥% (â¡a!I $h¼Tºz‡}?\ç«íŸµéúšŠÐÔ‘aSBŠ•‚Ø!æØÓÄt'{»êX(øK±þ¶¯±G6­4áÆ•S4ÞÈ^E®{ìê¨hPÈ¢MÖ "6;Ì’÷›óQ ’æx5Õ•>æ#R梒Ô„¾ƒ¡7Ç ÞÒ^A5þ¸­ÓÆLèí«NF=ú)?3","¬b`å€e  ÷a”¦(‰ªZ^„Ò¨mé¤ö¶Ö£‰® Z6`FØ#SUÕ ‚ etaQ¿û8¦Z÷L£›âB‰àFb˜uTºUé{ˆÍ(h׬Ms•Õ¼Á•×+ùc–Bo/é~¶®¯[¢¡%ïÓ¤S¤wÞãÞp¾ý°\k× JØnR§¿´ßé½¹Vÿy[?ÓS÷œ›×ÆŽ‹ûÜ’Ë:†ßæÒhçhÞÈÎâþ•k³ç]âmM>ß›nÁ½­Æ®_êãDž)ºW ²u ôEè«©zx-éö5*&¼*oÔá]0‡ÿUÚci½»•ÔJ‹]Ù¬êqÒ-•=”IzÂVᯢ¿u>À¾|Ä>Ùê¥ÐYYDââ7ÈYiKï}]tó kÒ‘`*—©¶=·‘—ã ùh…2ÕAC>%ݯâ5|_8…O]Ãä•…Z‹íˆIœ ®çõÂЀí!ØQâ÷‹Fˆÿ1s2”èÐm%^ ïdüàîYHsé_Ékdz´)lºM¤Éó¨‘ "Yfuœ¡(8ĶÇ1N”Pܰ¬ÛEz“beÃ’3õB€Ýˆ®aögí!*/ù†¦ç·(诱1ŸØ÷Ä7àü œÁ©&7Ù”­fëf3sã²hý«¾ÌxiÒ‹¸f‘‘%aŒÅ³›¿Wr<-Ãö,Å/ï/òÊ7ŒqÃøž®u¬³&ß•þwº¸±«æ»xœje“¹o0M“]–ä–1=»“n“ C‰J” ò€ãPáÎV8O*Í5±ã›d2ÏÊ®9z¯M“Yƒ¨¸¸®Ï­çGã.zG‹Nƒ_uª‰¿­­[î}8únгGÓGNnâÖú¸ƒo`Ÿ÷Ÿ~,ì}€é¡õoüÒ‰kúçåè0£µo÷‹úáhC¶^DFá)¬žaŽ!Ka<•µÕ=•b2Ù‘È ‡K€‘¨š •"d‚h^ª:BP˜k чÀxÏE×½ò°­uß—­§ö,v÷_ãì‘êttJV%~9ç;¸É= ¬­c2m½1Ø»q~²ìd{›ÓbЬK$û½ßA:±eÆÂL¹é(«sdךa³‹eÒÌ—P f{'ºìˆ0)æŠô‚P±ö°B"ât ljwŸŠCÔÑp­[‰Ô7s<¶9ÕiZ—O‚¥ª…•³®¡Ú\¶äjŽ×s&µó‚gÕÎaM0«“ô23¬—xÌéð5XCÛìâµÏlÛûÔŠðMÙ a›K&HK eˆÛ2Í2ÑMî`žP¢!~+×±) '¨Ñ³@zŽ;\3ñÈódÝjî™°[ïø'^|Ó•ÍcœÙ,5®ŸØyôÑÕ±ÊíTuÝ1O¯l®8Ú?¯¾Þ§ññ³nåk±Yù¸ÕwìªI™"z6µu™WýãgÝɳ‰>¹dl"÷³š­© |2Z©6«÷V•$竊ŚyÈœËõm[sUW0Å]uqº’•ÈjÕ´‘¦¨Ž2†eG“•pQ*6"½ÐÁcJ%“µ¹žÄò.F§µQ¶ÖYÚX¥ÃÄìWDÂÝhZP6²7ŒúÙÓš•a¯º©Œäɨ‚ OÂI§ÿkrB¦ˆ*æ;%2ÊgaDQ}¿ßìËhïIõ®²¹Yš/άlt®hÎè…øRž”ÊPS•’qúHÍî ÛrepÁ~Á»ºþ1ðÚí×'¸<*@±*N4Ž÷XWj×ÕæﵪWyŸGzˆß^¯àíZÒ¨°(¢Juµ±T‹~]]5fF’‚+rŽì|/zŪ…±â1˜ ‰ïc}¤\Wñü¶9o<‡J<€ã%@÷QŽ*S-åÄ Î—*96X‘E¨'Óy/ÿáë' ,ÌúeUˆá:(Ö!6žËt¼ÞþõÑïçØÉW–x>NH>ß)}Èü‹þ[!³2µÚª…îh 7}dÞw8&ä!WKH4§gy×gÎåÍ.[Þ8ľê-w UÝÜ &S(0Ä (ìîuv¡Û&£+Ò¯Ü7Μ O‹ñÕL¥}kôPÞ-f¸ÈTÏ&ëZ¼±%N$õC¦†a i>‹±îʰsÔ*†ì)»†b·RÉ®cIk£%NH prWEzKPèssÇ]•l9‘ì'ÖŒÌ.†q\4’±âûô§š×ý ÇxÜÁ$#Ciw+é§ìÎËݤ ^ÚjóÞJÂÔ¶ìº4æ•ÕHdùC4MH¢HT j× e6K™O™‚”ÌÌXÊ­,dz»ŽQU—Òcòãwt^âñ€èëy8.Ïêv*¿ÍÞ½ý´£ A€@e¸WEsv°¶_(ïPwA„º#-,O WñÂ:¿þÛuý¿_<Ô~¦x:øœeRe—CÈÑs}ìõÕotgm¾ÆÒ Oø>1™öz!ó6÷Æ«ÅPRr(û‰zË9€-‹*Âíic¨ÜÎ ê5ämÞßP(m¶“kGžæ˜õ¹„†±~·f†‹5 e šÍd!,bû¥èk¶Ú-ä‹wWÀÖ½¹À)énÔ«†ÝRÕ–ú½V)Ä!6„ÐF­ DCO7Ó$ý«”´ muZ=6¢”‹íB¢Pd‹;bj©‰ Z/ತ$T<Ä”h:j.&ËFšïÝ]àÎ.I}`ÕÁ~îUÕ|°27T„Yª +`-¦ƒ Tº6Ü™X@@ÉC¸;í’ŽJ#íÎiç´}$oÓ•ºâyÁžw òe…àXQLÆ„”MÛ°êœ 'Mþ9˜È?RÞ ¤!?†ÀC²áuÑØŸ&½t(§¦{Lv‚9³‚„ŠìˆwI²žÙæævUrÐ3/¹imx„Z18±´-cËÍÕUìÕ»‹ fDýH²o¥·½¹Î¢¿…t­ý”½Vú6ìr%[Yü–9¤ˆÄéƒøZ½ŸEü@˜É Ì£ö 7¿ó§áù†Ïóô*;:Å4z]|›ß»ü¸àyF~;ò¢Qß§Ÿx \£¤®á=à$§A v¨^®OQ: å™×Ti\ô1|ss} ‡öý`ò9·yâ\m?ϼŠ>z|˜UѯTŸ™º2*A4ÈŠk³ùнÈë~š,•B@m»Óõí½k/`ê ¯¤U)ÌD¬ßf]È…]П+ÑCbñ[V5ñQ ›äêeHÅ‚p‰ˆXDP)b ùìm³Î@.!%Û7x¢6u*à@6¬ˆŠâÖVŠz.ˆ-%Ã5”Òè›#2k®É‹cîMlñ± r”):e‚Ümê2 Ìî±-4¶BG©üMPÛÙƒ~ÜE‰r*aoö,ÓÐâ›7Èdhz;)´ø,ž©…š,GZ„D¸XÎT&i <í ¡x𑘒Á“¬-«¸,#päÈ…!ŽZ(ÕWn€èî§ÍY7}ܧ§™–ãÔƒð* EY.¸Ç½»A³­ÎÊD)„ÒA£ÔQ“ÈÇ$¦s`™‚Aj­éˆO½N}b­zFNÊô:7n‚<ˆÄjpmèaÏѰ•R×8 7öizp³šµàŸoÜ_Írµ,¡9Ë%Û!§O ñTã=Ž^ÖѹíæU×sÚøºæìÍ …§BtÕl´óBïS@èUÅ‹À‰bÚ|Ó®5­ZP(€òS»ø5NÂß&°¼¹7bX +Ö¬¬‰ô¤ˆh»šÑh²ä ÷écS·-Ù2úKsËdi³ÅLŒ,Lq–µ¯ávóÌEùnÍsÔŠÜI¯uRÑê*RÓmF´Še½oþ ì)šÙ@)š0•;‚öÃTÙOâ ïœJ÷k <êÇ 7F& ànÓ†c›}ù“3Ût÷ª_Ùâ`pg|=Uëñ|â} Þt¨ÌÔØ†Ž<^¤ëOA™ˆ©B»sDƒón÷d¡ÏŠ€]VÎ*Z̤‚íýƒk^[#mq²[MT{]9D’C#lÈÚ›Vˆ.v—Ÿä¹c뤂ñ/ø™âàaGíjÀS”g±dkýÆÔ:G›ŽÛ&üAïa-(* €DB¤¸u):­Ñ0.Öè:—T—C¿ë‚Hs©ÁÖä€Oå·#ðˆÝi$¢î£7I‹ŸŽx-rÔn¬qÅ£­Õ¥ÁDÞ0ñ`us(Ìæ…pR›Æd;,V Û.èé3zô¹ 35äB;… ¡;`¬3î±uüÔɳEÓèÇ7Òï&ò¶F—ì<*¸›ÛG…{ñÜ‰ÙØêúôæºûßönÐ`ºÿÜ–ê»;)p9LJSæ×ͺ¼ºÔnaÙÐÜ„•)Mæ·Ü¿ŠŒcœÅ¼Ôøvï)~n ߤ1ºb£{ VèUÌñE|}¡‡÷‰pÊ]Wº7ùIÊä¼–×~îcú$;Q"ÓñqÎeu´ŽOx¾’ϬŽN­‚“RVëö°Ï¶Y÷ÀkìqhQˆå” £Õow}Æl[ÙÔ줾´0½ŒžR—ЋˆØn¬Î0”izE¢Ì êœ`i³Ì“«Lrݨµ™[——Oi$ŽýH®(Ô^{ƒ¥3›`¯Yùk¦¢±´ÆyARþ88;5bL£†¬”òÖÀn+,‚(Lå֘ȴÐvVr<ˆ¦oÅ+òÛÙŒ:C"]ºŽKÞßú¨Äº¢1×5T™èBF›–›BÚ5 [ºS @@r©_Яأ¯O †wE­Å–$'»)mYý¸®|b»F!ò`©(“…i:¤ f†©T¡ )óŒloó˜J·g%õr)Öt–ÓÎ,Ò] ÒÝðÛÊï:ÌQ*÷/ÊJ´eh“ÌîÖž[ ©ýòcäǺ”V[P$—VûžÕå­Pk^>Ôs]I׿%·&«Y¦-K&NXcÊ) „±3 +­ÃJj°Érå­¼àœ?þB¬ÖÔr 5AõÊE¤8ÀðÊ“Ã@NNä…õ¦¸ÛX\¤0Ò³•Ð^Ã9ùù$‰gÐvaÑeÄӉȺä|ßnNýVtŸÖŸtœ…¥S?é+ŠÏœ4x¬g¹a¼5s`VmZ”adèw)÷½úqÁ=ðÒùB»P«[fTÖpE¥ö›ìFã]Ý9ŠËúއšnº 8áyI—Ø…—ˆU*ÛÀdÄÎÈ&8K$77€(JTÔbUÅ'd Õ¦„Â,z±ŸÁÏÌç‹<ÄÍC2Å)¥¥w ‰@™ä)H°ˆB%€ µ‘h‰E C °;±XšªH„Z²¯ñv¼\á><Ú}†îhÏq<¦¬–ª9å’8Q‰ƒJÀSãÂ0¨&‚$VSÇ},‘î0äFDL…à èbwPs  PPsI4ªÃ„@€F@"Åš‡¸rµA‚ -Aƒb+Ò±‰ˆµ/!"‚B¼#úWd…š£6‡vü =á1üŠÌeHÔV¯Û6M@yäÆÉíÐRŸ&î‹»æªSM,j/@6€TZISô8Fƒ)"ñ;HR "‹(XÈÊV1êÑPõ" Wq„; N¸šê¼²T‰"á•7öjP‘xaeê¡@lSÖ0)‰YB‹€±‡RH m–IÄ&T 8›ÌÍí"•Îöm¦ZÒ¹âÉë¥àÎI?®VíàŸsmtÖŸûGóxÐþBNQ6õåš m"T1èÊHBTh‘*á£0¾$­¤âÖÁÇãn¿Ùùü*ÈqÏ@‡7XCKßd‡ì8CÓ­^÷¦Û!Ó,­&låcˆÈä4ìP™-,L± N =Emut?¨ßô}›Æ©R؃He`ïÎ^=Ø·ÏŸ'}%<é›[=·š¬ïyy4=q—³f§À¡ÂŸº·xGÿb=c·}üš^wüzê<-,ù~ÛÞLwĺ=WÒ /½»f“þÌmùÜ陇;G÷uHµ¼O†D|«q¶ÃãáŽe7KË'¹F°kÚØp¼2#QÕÆ-ʇ6/þBŠãÝ;Õr‚_’ÂiQï yµÐÛ˜ù›mP§âZJR3’bvÞOnb޼ݺ7å-ËîBª VW¸8/JáYîg¾JíñE|(¤Bö2¤úDxd‘<ш4éÍq¨ ”þÖ`+»‡Èôáu£³ 3/ÌÉ©Ôé#õ,ó0¬aPjûãspåƒ4´íºmõp»3½´ZÀ$B‘ ÀÊAWfªHöDˆq"¯XTQº‡Ô€>&áv­KJždÝyXñ1xÑäjÊá–侬×qJÛ@* €Àíî“ãÉJ+ê¤)*ËEá -8!§ªY:`4PÀú×ÿÐî+òãÚZ×%Ñ›k²¢Yó¦é𱫬TC²"léÇ¡ñ¼»åÛõ¹ê¯DÑe]¼¦¯»¾OÖ½º¸—ÝËÁ‹(Ï3›eñ÷ÝTQäY÷+7ôUòto¬K¶º‘™SEICiëV/’›ÖY(\sØEV0XE)ƒ:"SlÐÙ&´¢¢ffÔeÃ:#2éPè¸Mv ­&ŠØ¬†%¸Í‚¶E¢;@£'²ž®¹S`™µ9ÜYX{Rd.&ÑKˆJ uã& „jS`;¬åD ÖBÚF,2 QÖF¬á\]‰dZ£¡<‰„²õÁð ]ísuR>6!Eí<ò¬Ösæ¯T#Ѐة¯b,V‚‘J ™€k Æô;¥‹_¸cœºÖ{MLw¦1v-CRН¦Ø…z¼qˆrÔL…;~æø¨x‡ÝåyJÎ0èÅ2‰}j,IÆS¸¯µ€LPB†ë¡ÛT^9 W°Öbl\ÑQ¸*† OCŘmƒÛŒ€x¢Uñ $!uYŸ ˜ÐŒ>*#øÈTªqýaØùpôxRÖ ƒ¸í¶ú —๒0Q´I{ðŠ#Õ¯ýÉÜ;ÿáØïº/ó.¸®{ù;ˆaŒ!Ïà¦ÖaZd.3šZ›ÙQâÓeèµg‘'Ÿk´:Ž<6µ,œ„Ihõd‰:FÏÍ(§×ýS0m2Gýþ>×|{DZÔ%ùaúÅÜ‹)ݺݲ«ç¿Ó.ÛkEFXåSYÚ§Uwÿ|“¯O6¿Ü9+™gô\[ë<Ò6¨ûP¥ã»“Ç\÷ä8ïèéê·™&Ó¨‰LÃóŽvJ[¼ôõŽÌ:DMˆ25¯5ê¬íÆÿ…žæºey¼À…s§>8®×“q¸nä©3{$ÈÄ+ÖxKQq„¸ÑV¿„¿À;¯5û£°XĈÅc%oïÕ®¥_Ì*FSkÕhUhì#°`ã•!ò5ï bÂuÕ… pcûœ0±óþ ïåqëã_E²£’¦p ¦¸Åu®æÌRJfx±Ù—€T3hΑqˆ,ÑóT36«”º[¥ u}6“˜È…KA/ÆéŠvŽqŽÓSnÞÍÔä¡g8N.™£\ Œ¬t¥ÈC~Ç X …Y‰%ßÕÓ®VV•­¤MJùÒjYUq6ùë1¯¥… ±2!‰â1B$êd¡…€Š2„Òt CÅ–ºT·“"®s:zl«~V?ì_§Ç~ߺïhÏ$á©&9û™åï\=©sªíVšÐÙá'¯~o-}hòí‚2#qš8€a[¡‘¸?Ã"Rõfï±(ÐÈ3M0@Ä¿Þs‡Ü'¯ÜZoEõ®dÇEž¤õ­ö«°HŠÈPøT?Œ®ÎÊFÑZdFãpMM\æuêŠHnÌ LC¿¦wÒÑg%¿¾±í¡ÖBü1ºÃ¨E´ÕaÂà0ÏÌ¿ªð©%ÛHrûtëÎëíûä#caF\ÓÏ ÍÒíêçrü<½Î²o@{£Ül:ðCdÛ>„1ÿØÙï~þÝøEäÛ-6ß㯿2v]^c`ç÷ƪSIµyŸ¯Àæ´íØ* é¥ô0vûT÷³þã55ûho06lш±Éˆ—°vïíŸ_Z¹°Ÿ;a5ñxÇ ÚÃªÔÆfõ–/Ó;2£³ÍW£Å¤rë" ÿø>ˆZ_v ®?møPðp~sfLÿ–¢A5À·PæÏìõ{‘ñ§<£Ýl¢—-°mÙ¶!‹ Å[+"à ¹Ž|A·ýÈ×3 Ý%R×f…qÙOÄ\g¾ž ª(€5¼ßUWòof©ºÛœ–QFsY«Ã=ÿÔYýÚˆÇüšÅÐaÐQS ghMىȠ§§¢H©‡öH‚$/éó¢|{¸9Jº¬^ ¾ð,UÀž &]Â$Z1‰(x”›WG#'Á[ô–_Ì€…«£8"×Û][lz¼<ÐH¨(“è­’Ôn¥bqe4ì(UWúˆÁ6'?Ãïu¨A<œìƒÁô^_3þÔxýYhçÔØ¹x›×2_–(Ïz%t-¢ågvd£\¦Âß’Ö"е«–&úïtoM ¢¶öe[Ï‘'”Ðq6±|ª£L „ãÚM)ˆF¸ÅéÜЦ½°Óòï1þmý_Ö!7šB-¸  C]ÂX]ç”k1ê:ž{Ü‚cƒªƒ«I4æ-õO…M)#f½q×Âqp!˜oØ—î£+†‚r]…~~ÕE}—¨€‰zÜëöP4;‹(³Ã‘\e\Y¹Û½ÉÝDçh,Uˆ·4‹ÖÇ: Œm…>nƒƒˆ½´#8a‘,‰0ƒÒéÛNli¯&ææ”Àv§,?žnÓk„÷qð\…A=}pF:¨‘8]‘#K}n_Iȹ! (¤eoêŒÚ>¥$ÏëÎվ޷5Ò¸ǸUê“ïéÊö>&6t˜ MÕ^gJá·Ccä¼'oÀ¼iPȰÂPŸØîͳ€ÊöÌ{MÒ§Üg«QètgŒ ¹ãóêN´ÅNÍÖó0Qí +Š¡ ¶·ó³4ß^¢¦H)Ž]C ¹È^ÁÜûò /›ó/?ÏcmRHÙÚ±õÐÕ†W‡»g!ÿµN”ß<;¹ý@î½z¿4+´4W)º–%öìzaPýþrvzÕÅ+ã™ÕÍJÍר…ÚÎ’öÆg°c¹úˆKWµ‘µY¥c%6É…C|שÔOÓ7¼þ\›+÷yc=^xߎ@‘éê%80“³ £ŸlFwÕÍÅ#l'äLPÑð¢vÕq°£hÁÑBpz¢Öy…¥,d°€IÕIÎäÀ/\ß©IzåZb5;yÍ žrÓ§šW£T– Û„'UUa«¹ˆ–%¦ªG)÷µþÉ’«R0º‹¼Ïì®ý/7O™£†ìN¬ Z?hÑ”5b»?°Ù®ç˜DÍ«ŒÕÎ3îDÀ 4j ýYÝ”ýHû5‘˜ÖL‡=ûv£Š:œ]Æ,-W*o0CJØ2¥\…ûÃJÁùæjɘ‡´ÆR²¥FŠ™œ"U’I¢$"Œ£œ?Ϭ>ž½ùF¯ñqñƒäîh ÖÖy˜5Õiᢠ€( !#(’“j„’œ±$"q$Рē’è‰'ún™ ´©%w5]1¨Ä-; 2w刑–Ð*I'ÅŒ¾Þ¨ü„#-*€BSb$€“ÈDHÈ !R",ÜXS« ºQwP S1>¹‰))LŒñÅ SQ‘ÕDƒÊ‰ p"jX4Å ‘B„ëX¢h„@ã-FУ‘ö(B ‘DÅWÂâŠ\ Å5¯ :"RlYÔg@E• ¥“=²•i“™IÙí‘J÷™V-®žmOTÉ«ì£Æ.Kòiôƒu·¶,LN½´ ÈòF[í¬au¸õ5‘þE»‰¯BÐXɃ,¼MØŒ»LÜ;¡fÏÓmº¨¿Œéô#Ï‚µ?£FšUµïI’&1´ð mÐ$Ž,sb阖'ÅGædûjTlÔ¶­;)'â8Co²6GK–ºÆf3ZQ?àT8•xªÔ|NïÎïB§8–ŸG{MÓx‡ÛÒÐA[$*[Û΃¥ÜEH˜ÀI2MÛÂU@Î(Å% dÚÁÐ6½¦>w0sìƒ%vw´–+ÈîFý^Ú¯9¼ç–¶üå·fü—û§ãã¯îy1²PImTÕ$"`XmPP`NLú#D‡$“Áq‡Ó*J¬E·Òn©r^Öÿ(?k,O `T½W»«¾r›Rä[&us}0εŠWꎤ´Ô×ÞȽÊWÄì¼r=Cf’”vÍ׿ÅÙ¯ÖÿRûækѺ\]þÞÅt1¥8jùy¶ŠŠl¹Åíú§ªY̳|NçúY%Ò§õà © £’'&„Œa!%ºò›>•¬ÜØn¢ó~„Ñ¿ÔÆ“ZpI(’ i 7r+øxF/Û¸IfÉ ëÓ8W‰IÀÆÏfˆ¤ û•nÐJ;–à µLÛX‹ iœTižò\Òx­£qUVgpµñ‡çÔìǧ@YŒ—XÖ©óa ±\w|(¡P ‘ ªWçç°J·.€°† V(‘u¬VÞ j0Dâ. `ÁbzÚ§äØÍéÃáŽÿhñ|w‡*fýÓZ»†·³);…+p0+Ô+tÊrèn¾¯ò×m¿¹øo¾Çï ­ARÒE>^¸e|× „YXHxI,„7a5M1ä+,i­KIæ ׎Ʉf#¿À™U‰ qMøa ¬%fWØ+Qê1ÆÃÝ~´÷ñçæ¹æéž÷I9¯Ÿ¼¼Ïós¿ÿâÜáŒs˜¢ "Êé‹ãýW—篟Ÿ??Ïùã«ý=ßñ½°BŒ@+ÉÕJ(ÕTšb<„jAªSaìèÙ2­GDªQç©ú˜ n‚%Xéî4< ÿpÞï>yÂ_#¯g©k(}²%õ»ÂC„4>âcáu‚$Nª+åâÑ™½>mÜÂ’PN ü­t×9ÏC¦Ø‰A¯œ„ñgÙ;Þ—h‰“÷9F»äµÜ3jVÁ{šúh‚ŸãÜ ¯}›ôñ^Sþöä·æŠc¾Ç¨©­» nqG®½A)?r|ìkbº>+({•\-¤Ê–z´S&%î]NI{t3ÝÇí8Њk¾ºœâÞºƒfZ´$‹×¯)—®n;úö§é…¯“xHǺ,á-\å×§¼˜p €uHpƒÑ®–Î{<µ "r±9]Ãn7+×lBSfœõJ š6óþYï ×:Ö8`¦6JK8—9-רÞ+Ôç.Núð­Ô˜ûªÆs=/Ôå*¡­eγzÒÓÙ$µÖKö°äƒÔÞóó±Ö¨–,ŽÕÀ·§p˜o¥bãG|CÏoñ8Ê4ZäÚ†Bs&Ó¬LABÒp}˜“ä£ JL9ɦ^ÓAGX$=Ê ¸îñ«Oå‰ÎJ: _à¶ðÀhGÓw¤Q^4g¥‡ó{ðB3bŒ¢(äD„ K#'²©uÆ,ãZ-òÞ·Ú£NõïÅ#›`«|­»ü°ø>.\þ:«ˆ Ï£™Aÿy1R©PW—CaÜã,å®V5_+rÆ.°Žx\Ê5s…=Ý‹c°‚ÅZsÖ×¹¡p àuòœ± …«;­£­­¾ˆ¬æŸïrRìói÷ÐÅ’Ä4ôF'F·jî3d§J“+Ô…t@Œ ÂyeWN÷ûæÖ){tt·wëþªký ­™€6'†ìô|ë@á ·gfr´’ÒÇB(}#CzË‘˜²—c‘i¡ªR½Æ£Ý^¶\gO„o2³³þòÉ´°yaûÕÌ~ü¯5¥Ï@ìDA‚ÑmJ¯yÕë½}Ö©T7s¶ô¡zƒÀXçñ•\ ±d¥+<£óÛõ$¶‘—#¾]4ŠÆ±C‘ÂøH.¼Ù?Ë߯¢ÒOc*OUA‹šÍ âŠb7 ‹`1)Ô)W± :¶îf”6é,଑½pë7âêkêô¢sÎ%uÍ%4,±Ù*]ã·û§ ³“ù¸£û…zz\éªÚã^_7y^B)Þî³’íA:À6ÆÂºSœU:Œ°´»éÞµþœ@¡ËµcW…W^ùxšÉ§ŽJ ȸj’ - YÅÃc8q7¡ŠbI”^_ì×m…·ÚZѽ=¹µ­AIš›H\ÈWg;šãÕivq¥p³~××Úytº­¯Èè¤ëó÷£K/:Ÿ+Ð?V’P¹â…97•5)×ÖmAþÒä¢}s×àÎt……8 šz=ï«LG÷RÈúÝ+33˜£>)“æQïp<ø‚¼ÿ,…ûÂcf5HÏñ|\7¯τӉ„lgY»¾¢¬tY‘„‡O^be/SD+.ÒÎHØXC#þ z}ЉîNEÑ2Ët­Öì„>a¶¯­J…ÀH-*dÎx]T,6âíªxÃixÏž˜“ò.ÂßvÍh#¬™aÝpbt– 2/ƒ¢È òôC¨’`J{nŒ£óXâOÍ”’x(Ë(¡ÔòIqÕ*‚¹T §E!¸Š|˜"QÆ*AŠÛ¦͆€ b¸œ&Ïv8š ¢I%0¤DâórK½±ÆªèBnùÛʬ¦F¿÷ó‡òPa'n`b.ê³Q†<ä" *!x•ÙQžº "\&Oµ~bc‘ˆ “‰œA¹ôU†¬J¯%‚±%†±:`É,‰³%¸cƒÍ‚pâ‰?ŠÊ(_ p!w°F`à F€±TXÄ„4׌¢q¨\ĘX)KOì ÔFÙ+ã̾µ!&\yò&ÓW")ºÚo«£„̶u`A Î b¸â-Ž£¶’ìò@plS‚–ªŠGœD·€¥Ôt¼Þ€ =ˆÄ“ &– %PV$õ!K G"‡£øUh"ê,—kHW|ÑÕQIìÂ"·dŽ °…kî!Q)pD•]¼x“MuªRIöÜu5r÷Lýœ](˜§M›âW½»9ŸÞ í¥üÅ<Ÿ»µ¥¿Õ¨W‚“0¥nm1=Ïk¸èüè½ÃºßÞ_ëõ³¥½¿Î}ýf&µj3Á:tð)–_‹£Ý`ŸPPµ>ˆ‹vð•©#‘‹¨<% g9¼÷½^‡ûneÊ“]t0„ d”0vDoÂCª<Ѱ·#XŒ² D5s¶|°{Û[OšóTm+¤·äÆdfÜ®”4Rˆ8äÞÀ7ëɸ m˜Œ{Òö'|ù“»rõê¨q4Üy¶Ÿ…æ×ô%²Ÿ%+5EÎS(J¥ "„ûK¾·{Tg¦Mõ3w–yü,QM›~Q&EN“ÛÿÕ·üÿœM žR÷ ¡ìa®ß/zÖ|\3ŸÐ[¬¿:[Ë“ âweÏüþ^Œë V–0Ls‹Ôpâuçà¹öíØ%ãKFîïGTð¶5§§uàæ®å¹t˜K•¾zó^í§Ïñö!1¹{À¾\º¯w®§…‰çŸåyk¼¿óÜ”Oå~5ù‰àµÔûÝÚ]«|ɯGàjAè8IO‰Ø;âSbVs¼9ç ÈKâRÓ‚ µ§m1“a—^Ö›~IÎàõJÎø—¶ÖÒR•½EÏ8Ý’.Àç„ô55_„al˜>ËIûH éhu\”±å×½Ó+h„Y)ôJ¯Vç3f,vK¼Æ©Ñ"v’OÍŸGWf{);Ÿ.=RN:swÅíÓwÅ3Лz縀 %SWb±&* Ì R dñ(œã_·Ž-¹¯¤|’X8æ‹QNO,y?“üÑëñüù8õþóÆÙQE(‚áx%}Yñq¾cgf†W“f¼ÐÖ1Bþº+ª™3/?ôï75lŠ­ý`Ö€•èp=¦Æ!Fº¨´0J•sdÕÛ& ½0UlHÃqE[k¡è!ŒHk-«¯ »ó*y=ß¿nƒ×¸}>!"ĵá~Žõ܇Åʪ*Fý—,}¹Sþ]q؆ã…x‰¢âƒ)4ãfCš•«ã^ѡˠ³ŠçB¶([$F2šzl nÄŽãK©nö먲åæeζêØ>6qëj /Ïe€c4*Ðå C•ê5@ȥߊÔ$& ¹ÖzÖÐN 4c“#–jì²ÖK»[¾N™}Þ`êž83s“º2"Gd:®œ³¡iq‹1cɰj’WªóòV¨±x…Ú(Ñ ¶*×pí4"B(d‰h@¡€½Ò÷…ï›rÊðuŸ‡¸§"nm M!~™Þæ÷’ƒÌš”XÜÓ) oñO´Z}yû]¡€@<&ðØÄ„ÜëPA;Æù0´}¸=ùâšbGþÁiþv2¡Ô ½©ŽÁÅ ZššBÝ{Ö¬š)¤€ÒÕd1LFQKÚ¶BA»#û¹¶«™=÷çeÁÐÈŽ¹X})úõùýïïw‡ÝÞvý d²‡î‰GF5zçïϳ~ü¢ï=5"2A-î2åfÀ%/Ö0‘d´b—ä’Ás2ð”‰~ã~’0ÍLÑ#y,‡ñ ø}«±Ûîn«}ä×eó[œâ÷VÏZ|¿;¥GR=PC=„Ògš×­œù¬.Š|›ïzµÆÎpá9»'½·Î–ÏYØEÞÜŠu§äˆ*›)G\ËîõÌŃÔiôz?+tcPj>‘Ì^ºN!­•iáÝ—l¼™ðe5)‘S»¾×Ш~BÞòÞ¾ûqý:jÝÆXïÆ@…mœ9ØÞ“ºA«

ýNü DÙyÛë²gyN2Ø4kZ9¯ß¬ûJ bX{W¦Á;°‚ŠYö%èØ;ÛžÍ;¢aÖÜ$×ydh¼"ä`]/˜¸¯•ñ‹{ßõ€U©˜ˆX¹RméÀ¤À KÌtM” KÃs AKRÝYó!º¶ŸY SѰ#‰ƒÌJÖKÁ2m³¥¬Ù'¤Dfbâ‡êц[[¯8 Néñ<¥‰C2-5À"@Rš$4 ÒQž;ð”½ã«á€RaŒ©X‰vÇúÎaq´¬Uþ<=_ª>¥eB@ï°q™]‘ŧƒÔ qJ‰Ö€˜1q­Ò:F1í7zÕcÉ¡`]†/+î°÷ÐxB *RjÓ&¼ b7ây¦gŒß|xËð{£9*ó6Ìzv«UZùïÖÿÊÏìDî"?‡ÿJ ÇÎ:Œ9:Ó ´¼I[ìn˜ëÑ‹PT ¦º*oð-œñ<¾ïÔÊÐ,SÏ`¬RuŒ†º?î¡B´µVöáÎ)Åx*¢1ÿTé_%0¬†î·­éòS‹èÙ ¦ÐhöòÃwL¬E- ¨¡ƒÚ?Uµ¤iéJkö/Æ÷i½ju/WŠoó»M·. €=z®6r‘šáà õÛÁù¤³¡Š8±ÈÍîË 5ÔÓ?J+ÛÛJÈEʆµ{kzdI° øBwQíÁ÷´Åýu’úˆ£.GØVì–ƒìOæìÉn®àŠ5ΓҫeVÍÍôØ(ç©S!îÕØÀrÔ¡Ir¡Ý5žXñæžßr‹ÉÇ)¨‡XG«[©vú)ìq¤áUÏKþÁ2_{<‡-Ó6ø¶‘û—/ÿÁ*ÍVJs¶UŠñI´ŸúÆ–Ò ÃV+³)²¹„‹RJ’PJú…Úe;®ã5Ìzõ‚µ® ¹õãâqa´3x•uWû|ÅKÓ•þb"¯=B÷}ãGWWg¡ ”VúdvjºƒÎHK%óH˜7Oÿå¢ïª¦¸ˆÂ8,š0‚‰e *+Þ¤e„S£‰”ŠAMR" âHF A*@-¨ªGù„3Ú7D¦±ˆYRbb-–`ˆíÁ8X4qÓž 3^ˆé*9Ã@ÊN1” \B¯¼YLN¿h( )£¢nÁ¢€à0Î\PIQ(ô§¥u|Ä:6 k¥m*"‰!™ŒHUX®?“‚CƒÎ Djq„0#¨{R$¤Ù¢(21DŒÈ1b…•W$Õ5”"rµ)c¯|[”¤±8GhC$‘*Jô2DWŽh ªŽ­¶öä ³àG„%ÊM¤é½»²ê½¼_–´Ä5MUÐbê[‹ÌqèÀSR å`ªXÂÖµ¨"A4¤$zœ!ûXf² c¯ŠÞ$8øHu I¨a5V¤¨W$Y-=ZUa=\Ú™="U—$„wÿôuTI“d2p­L§¿üšü•†f"ôqìèXX¥†· ,õ‰[ gÔøùãûÕÔc$½i´¼ÒÅp~ñ:uü¤Ûï~^§&9ÑìÈ·ÈG²í屑WDÇ FxZïÙ|lŸe¹è:à-‡ËÇ\Ø¡œ0Fñ²Ž€O)7Cùsâ æ‚c¦8’À Ü £Py¨Ð«‹[=Ö„yi`È:¢ð}ê–ío°ŠŒ¸ {òÝYtAl^®]É´Ÿi¬»²¶F‘ ö»Þ1Å®d@‚êÖ­?†(«î ‡,§8I°­ÐüÉ´ûŒÇç¾K,,\-ÒÙsj¯©\}äkÚWw»^Mð‘m *«Àά¶,àZQ‰ ’–Ò´†/}ΟþøPβÝzÕ|}/óýÂU—TšCæþb}²POêý*t”Ý÷×?Gÿå9_×Fis1~rÚ`ñB:™m*—uÞï?¶æ’Ûh«SíÈ<‚߯çãçÍÓû×ng{ÆI®ì‡^ZØEsE® {$E2ö¿Zô}_í•Ül/"è *]oŠJ i©ñO¹z2œæX]ÓbˆÈpDÎPµ.õ4€GãÖ‹sí9Éuô%·ÒØ&­“TÇÉ;®e0]±ŽÜr…¹£I€>ʶæí¯«ãHwë†ÅÅì–üØy)¿å.ñ‘xNkÌF¾!žÚÖ{Y;™ŸUR„sçzÇPrÂÉŠ<­Í-&%³c~г3‰²=äçS}26œ3˜Ò9æ\áE°îKsû>{.ù“ftðK>Åm6ë}ÊÉõuþ}~ýÅ—ÿµ?›(¢™*h%>¥ß÷b‚ƒª=¾ÍÃùi<‰{ Ôqg\Ô /éu¦¹ü›]ªêv™ËÒ,s’<‰«Æt“òè5óÏ¡µ±çö‘ªDA-³•l`/…kpìMëH8¯_Ë^Ÿêª5WåÃÔä«IG½¹þî9“¾*—A¥ˆSrɪÀ°yYä ™h9²óæ3dÚ^4FjÇPAá²T‹1 0Ž1‘.*^bJD|!5ÚŠ­ºéð’uÓ8!½ QZzÜŒkF:ÉÓú©®³F†Ñaij ‹h¼f9„À„I¸r Ä„f´ƒWólóGØoOÛQÍDI¸\ÕI‰š 4JÖ «¨‹[˜Æ†W˜xj«=‹•œ×–uDZײ Ö€ºB@m®©¥Š @pÅ‚]AÜœmp|ŠVÞÎÜùǹ‹3¼(W΀îê ªúeV® €ÎÂ[˜mZ¦ªPÕ£jûÄ뺧©Òö¦ƒ™¶uÃL5ßç—‚FBí.\¡F.þÕu\ÔxUÖq¬ecà³(ÐõPu"-VŽô°$„FPlâí“Ë>óÏ$¬Ûí›'ãï€P¥áÑtNöYÞ÷9œ\—N ,‚>ö³°r½3s–óþôy½ûd¯êÅgœjlÌ ‰ÞØ^›ëÆWÈàñPö½kÁÞ;ÑêŽtǶ‹¹"Ámí~ÜöQ¥«º[¡q÷§˜\ûÊÝcŽ~ ¡k?kéËÞØø ®uUµ"¶ŠÑ©áйáÐÀè&]™i'š¢ÜŠ3BHmvïÇtÄk¦,™ñ|P4ÕÀtóà53ŠâíúÝõôY¯_Ñ™¬Éœežö¹"~°&j¹Ó5u*F˜©¬Ó&VdMƒ¾Ð5c«34,Õ—J=,ȤÂÍØ N¾Þ×Ö§!ÆÌ÷å,,ŒÜ“§G©EÌÅW·½fÆûÄjP<¸f8Á˜pŠS‡µÓí¤÷µ’Tzý ójA*eêj)%­9›·{†ð47š'©PÑÌVn‡Š BlaTlL?޽¹LS¹ºæÅ ¦nz×­|‹Œ1Ž=†»¤ÞIœm‰¶X Sf5@¢¦°\‡ïË][©B$:ÒZÎ:Êv‡P* h œPIuÀUx-IÓ@RhÍœhVi(a+lª^‚\väÂÛs´È Õ•q9áÇ2ò/R8¬DÕYË`Ì=l‰CæøÚž…(uO®b[Eå‚dÓs@ÙŸñÏL§ªl“â¤A!Ì,}æöŸœÿ‚¦Z¦—þXc/nðÑ8¯èìê4"ÎØ6{}øhø·߆עK¼ÁFÐä+úªPÇ3 ¢U¬ô…ÀmPÍí³kr>NgEàˆáÏ'·?ur,§´0{Žp„›¤*[2FOºayî7?:G…ì/,{g Dj´‡˜Š»ÀL8Ÿ-Ýs“é³#I5¹ •ºôlXdêZâa"¡Ë™zApûr^"î”´&ƒÕRè¶Ê)°m(pòùËî4Çé.o-*ý`ÔCùE„ãa;´€_ ކtoÕÇ3¾oSÆ3Ú_/†?›‰ßŽÍ³ëc™|¨òÚåæ”6@®šé–x?lîc±ØB³zt'Röƒ&Ÿf¢ˆ sXjW$Èf`_<*4ðp«±ëÉÉœõ¤‹ ÌK®m\Ý>€oû0äO^©r%o^W渚{6¼wlЇÌÄ-îbÇ=Ê0Ø;¤?E9ÓΦ‹ÜT3q›,æîòèi³[è FÛ/ö¸º;_Ä œ¯$ß—ût‰¹¬ð¢F}lôB×:^æHÝÚ¶–ãoPߨУ >üXÌ.™eõ^vC!°Ÿ¨©¬s Þwé+ȳÃý3ÅÄEœ<“ù½»K¬§¤C+r¹@°ee°!5$#4Ÿºee¥£Kªw|±†2íqÍk[£4@½þ{'óæÜ3tÊ,†CM…ãéz ¦ÚµØRr¬8gãu# b‰ÖÉÚÊ;·eœÌAA×mìõY×ЪKןÓ®†Qš ›ù«;]08 ³b `ÚîÔ{(¡Õ šê†hÙQS©1élIÁî:k$ãðZ=LžFb,ð56p 3d*-è+ÙJ!ŠQ@x60-ÇùroH×§-®Ü‡EÉ©£ûÈgëúGc•a\02{þšöc‘㟜ú¿mxW^pVž#ïj¼þ‡ã(|C<=³JÁ0™FÑNs#_8NDs¸b-‹L¸>, ínnˆºV-j@‹€´Ws‹{#1‘<Š3YdÕÍ#‡/ÒÓ~k^Û±8f”Ø«´JÞÎæ±¯ÝãMO§Ðæz¾^›9³Sp©‘ï¤8EÌs`=ÑPK†Sc;kC=ÓàY^B0wqâÑÚkœPÇn÷têÃ׌W5°=ç°‡–«Y>ZoÀ‹Ž,i1Q2ÐÌf³–ïô1ÅJ%à4Ü©ØÀ@R‰¡¨XAÐ1¼*±7•>Ýk?ÿj­Û?Jœ`“‘g±úÜ‚6ЬýâOjOy‘zCß%fƒœþp8’åÊ@K…”$ÌÂJ\Á–ƒ…ÑTVépf\犖u¹+[JFèKé7úhÄŸå–/~k•/ÀÙ¢¬‘‘ªÄšÅ¡ñìjtÕ©óx—z÷ù±v~ßÊ#m/JðÃRt¨g½_KÕVôÂU¦œzګljf/<ö8Sí¯ûÆÍÍãZƒL@ƒ"*q¬¼ô˜pð>ý‡…gÉC†Xvð Ÿ`¤dÅ ÀªÊ!:"DˆP¢u¡¡gUB<$(q TÌ0X¹ WfÝn†k -jQ 8©B›x\{EÅBg©ý®êÀIÃ8©Â9ÔL|¤‡nh#ÝAN`ÁvßX\8‹Av$†qçðȶ½-ô¶Ô) %°Éž/ËÂ&&Ú“L œ.©h\9VP$Eù “FŽFÅ)o8ER&ÜÔúø›ÝדæäO•Ðç÷–ÿ‹«k·5n`Â#|+ÿ—¤Yoõûý¼¶ßׄZEõ]i>weÎÕÏåS$jph*ŽuéíÍ'dl(A *Sev¡$¯ÑWÎÓƒ©*”*«½)º Ö¼ ¥hƒƒaÑÿ¦—ºÉèû¦]þÝ€¤’i*ð›Ù×€ýÈÝH6ª#¹•ë7Fw__‚¼Ím€gS‰­çë~»xb"Ë3åŸÚðïölî·ŠjêfÒÖýÞ_å}­÷ï$õ°5ìêA]«Æö„šôMžK»šÆïÀY8ÝʶÏmí§) Œkƒ9}á{¨~W%û‰9Ë òù†ø6ÜÈOÍñOx—ãÖÅÌ@§ñ_/ù¿‚û7Ô85Ô=oó°žOr…øvjfž™ßjÞùÊ#ðó¨võä©Ã&žjõ²?ÀÛ[©ó½žßïMK[êÎï½Ó5h™nG Y’wÖy&£Y¸ÆÇ‚~¹‹ÛÉ•9>Y4“%¼#5„ÑpkÏùô'’Vµª‡÷{ú±Ðâ2F!u•ª$¡©õÒVZ•‘B óΠ£ÏøóVž¯’{gNÝ$Zºž7yY´g k’LçøSÏË$»dŒ‹Hqo«¹’ËáÕtïì\–N)bò­DŸ=îwœé¸qfÃ2I7鑇Ü̹ Jm!äšt’™„CâÈh}Nñâº4©’4"ÚMEꃵÌÃå=ö‹q<ÿ㽈‚ØÌE=Ò°O¬}æè¢÷ÊüƒŸÛ·.…Å‚¤Ã€ÑÂóÑU}÷øµrH½N<¿4½kî•Íìñ!æôøu¦ªxþ\|ßøçÚ¢zv÷³™FZrÙ\ù,œïOÎ×õŸÀ µ;…™™RÃÕܸ}ìŽv¬&ùÐ)tá ª •èâ‹;›Z‚0:VFžÅ½GüjüRJ7©T5n_† ãf §`*^½s¸Ì–ÞwNø"^„ÞÊHÆ0—q3u3/ò<¼«ìYL¯Ð޼§Êì8ƒ¦J.eÇA¿Ö÷lW‡sS9Q2ìêÀ^½*é1g÷Þ ˜'0ªYŸÝÝo”wö½†~ý½?sî_/¢ßMfÝÒ8­îøðƒæÎFzþYn€4!NÉV”¯s=2Ø*¯Ò ¹²Â½OG1¶k gŒuYÝì{Ë-t¼xÝ( VhÅe”.@»Â£G;ó‡¨k ”¢€5 ›.éÏÑ\~¦¨D½@Ëï׿}µ ê{ä‚þº ¶] è<úéžOõÐî¡/d“’Cç…obEÙÎLC✓qÌ'æÈÄäa»i·oëk–jɰè¶,€ Ds&Ýï¥Î#4‰“æ’¬¼`¶PÍ|6³ß8J„‚ &"(Q …h·x R¥P±…Š ±Qj¡À\& „Í[o9ÍÏ”šY*\ôk'là à%3v®[I€4Sg/¸bØJSh“ýná´7±n-V|«esYâöŽm'E‡Ÿ—´ÛØ0wV8‰*ÛQ¨Ÿg é1*êˆgòÓQâ;p^ؽáô¢¡ZJÕÜD·?_ÿþýaŒêŽg¤ UÜP\F¦Q‘RMÌñòóEÉõgG-V) O¥îɯoCªÿØu‘Q{ãQq Þ-{Ýx^ï=º±5üÂ+½ÅUËö±õõðê§°÷,Œ—|~¨·¯ÝÚqƒ¯7 Ç̸á~Ò>£÷þ%ÆYueÐQ¹Ô¢‡û:s^Ãyàææ»c+ÞOŒšëSŒOÙÏÇ ´]œn‚HÅêÚ&ÉŠJØvk½ëqˆå·2A%ªuܺ¿[Ã2ÄòCWöfжiã lF/™qŠ Õ$k|^ðds óã…þæÉÒpnÌe$r€ ï+Ìǽ:Û½©9ÍÚŸï' ÛµØÖ߀ŸÜ Äß Ø#=%8h÷VBüÄ»}x‚°ªaL0 L PÅy$܈ÄSÓ—gÛku:@>†»Ø ¹ërù'õÑYwL Wn›1Ê~‰º½ƒÖØ5HícÛÞ¦ÖËgµ¼A&ŽÖ€ÀˆhyL5„µðt,©wƒÅûPq½"I°Ã¤$¬Ií°|ïÈ|¾k§¼x¿Ø°ÌV©n‹†ò‘¿ÝJUuïÆ'Ñòh%N>²6ÃK[,µIsãˆHÖ(Þ5z¯\®Žm…a¢ðI)ÝÃâ jCÞV×3·Ó“¯[ÖÃ|Û‚3Òaö ÅÈ¡¥-S ¿[-:ŽÚ¿0=·-·“s÷¶*WúÔôòÃßÁ|’ºïòr½Õ|ZÈÞšìÞjª.!/‡Ï-ò#ŠÝKFvÖw›[ù él÷ç·Á1)¤²Ø&–_‹ŽÔÕ­k'­‘ÉŠSE£äLKCßžò/véæ½ýQX½·\˜Ñ*Ÿ6C¯52üÀŸLyì¯yÊ3ÅSlã“mkØyÕ³mWxXíI¤‹ý wûùKýâY‹Ïƒ^8Ä­*§é‡ë‹„-ÔêîAjþÈ«õ3ÿzmNGÌ!ŽöÇåÄŠ®›ú›„ï&`ðÀÞZGÿ­i¹ÙëæâŒ·O¢Å©ð˜…g–6xêU±u® r5å÷èÀÆë=äT²çý@ÛH°Ø>h›÷‹­NT 'ªÚE`‚'%AN¯ ÔéèOÃþ ãC[P,»Ž|‹Ú-}~q|<˜·õÒ*îýõ¾‰'á\£½^½3÷Öaøõ£¼r¶µwDïv~Yéscmº*Z’¼’̵=h#'Ç/ÁŒâ~£ó„¢ÙèHzuäü‰Í˜)÷ îuÌ`ض­V’1ÿó¼§cóT™×=1=tZ(~=|&ÄÖ´ÕM*WòJUUcTãLÑàK÷+*T’åáƒážä79Ý3i·Žú¢Â›l?Èld®¨2³>ì·—™2wb9œ’Ï6XãÑ*•Woº^M¶Š­×\üHð^Wùm~zãpÜRGS¹ùniÖcëv_“©VÊ;?¡‡8§qÃ8ÇÓÊ»ÜoìîíÏYós~±q,ØÏ«(—­ˆZ§Ua¤š‘ÚT †ÌZW9ºÞò£‘)®[<6ïÜñY˜ü™ŸBÄNP]•[e¦{̆EÖ|=éW'œgÉw~ÚnR“ôŽÈGx;ä§}¹´`¹=Ôð¤ŠèYÀ:„Ó1ÖÜ›‚󿾬õŸs-´Þ] -¾(‘¡ô)aSW³‹£]f…2vßyx#:†/G°Ö P.‚6ˆjQ*‹ ’?‡ïãerµh/š5«ÜqΓú¾äµÂv\\$„­¤~ÛOÔ¦ðÞ¦õík´ý|ýöGË[…Õ3Úo?YA:ëëµWëÀÁF÷ӳò†ÎTåB± Ì6ö£µ«’´PTéË”ŽmŸeØ›Æ ÿ–ù5¸Y?p0Ž AèÆ_9^öZv±sL›G÷S>†gª¯ ª´­Ô2E†:TÀ R‰ dX.Û‚*ÀL‚D”|ËE 5¡nB ÃJ¤ÙN©Sh ,Ón„µæå-+[ž±íPm-dûè\»ëO¾Ï<ŠãVu+<^´ô)sÊÎÔ†G ŠQ9ÄÍÑ&ò@<Ä‹iº†3v¢ÏÖuí®Çħki9òl'×#œh´b\yäÀÊ„\ì»5EU<Ó¢.­¨±^÷¤¨W²RŠ.="Ĉ" JÇ •”$™ª ÜQÕ= V/ˆ r$Ù*FTÅF¯ÒÖ¼,¦6$Áþ K%Ò›Ö+¦ˆÉ›lâM:¡éоòR-+Õø”·«Ÿl FˆÆˆ€‚©£Hpd¢±­¶ôØ8-Ư`WŠaÇ$oZ¯ÈðXPÖÄkPT‘¢M§âãþ¨¥CÚq~åf¾‰{îLÚ‰@Ù[Wër«Ú¦·N—UújÉèÅß72t-à ¤KÝÞ›—½¾ÖËýR<ʧW¯sëÍýªi—‰4·Lû5ÑkwjšW^—“ÅÓÞÓ§ò° ÁRÅÊË!!C"áíÖ˜2OJ£õvöÅ7ùþÉ÷¾½ûæô‹ uFô$l¸ æœÿzfTñ©HÇã½¾ûèèÌ8܉6{þèyXëOó¶|ƒïÖÃ(‡cñÿ,Iƒ´ÚC7&Ö+J 8/T ÂŽ%Q~]Ñø™©ês–lëµAÊL‘:ó-6þ§¿~íþ7êûÿhøjï×ÑIaCAKÔј}i" 6ήá-\Ã’YÆCžñÐ4Žœ@oõÁs|â5 ˜7÷bOŸnÿ#”?Öi>žEhÞî»èûõlóÀÓD{»ŽÐêeU^ô|èÛ§yÖûýeäÈV« ÀlæûàÁë—×¹ÿÓºÞàóûž‡þ>éMúÎå›Ò™g½^Èó³å,8ù•H‚bE:䯠Pö¿¥õÇÃQOŸ}¼›0š9ß×謫g ¿ø£OÆŸYø1»ŸÔãyç÷§N¨§I»Ÿûí]ñ}B:Çþ¬×&¾HVß Þñw_ÿ}´#Ìä+ñŠŸ¬:­58-;±Œµ³Ó>>ø-RqqšW²mÍÄoã_×ö>P.çðyàªõ¨y9µOÈd£ÈÖRßkȉ£îJèL>*\ý8Râ›ìˆ0ŒØWΧ8Û¹áþÒöX1QD®MKÉÓæX©‘QRI-=î9ïv­ Úh¹l3´n©¢ê^)ƒÙ°1‡‚F,p8*N¹ÖDíG)!Ù‡±n„ÅÚ#èK©‚ÓÂU”ÁMŠ™äW‹G޽C3¡¸µ…Ûχ9+ï«pÿ‹ O¹—áãkõÙß~¤» ‰lj¶nZÄÒúÿ}îù#4QˆD˜€:ãËÆÒ¸q£™šDÊH_à<”’ Zx¤îw< OESýÉcWº-6‰ªA¹RßíiãŒFYL¬³£*£ùNºêkCgæ"DNxµÁ*<ÜÄ’¡AHees`“ЃE ž€xU%*ÕÀÇXôÐxœ÷ªMmôÐóJz)MÕ1ãL3)Ìh‹%BžÃ‚)¡–Z޲b’UÂz#>uΈF|H[äÈ:—²Öz®¡ñ&5Z—Ÿ˜I÷…ú­ÝhÙ¬r–ïˆwn8±%µ­Ž©! HQA)Rš)-lå‘)^,XH‹2ŵß_%9¡A«1„‚‹^P諪ÐÔÍ€$ŽX¥±‚‹×€VsìEÍŒ3n1ÖÀºÅ„R]GŒQmÀÀ5V¨©âÊDjYJä:•n.u[§YÍ+öŠ:Zp'«ž=³à´´]ÿ4+VEù“þ û—3}Úÿ³ïÖéþùiO& ¶ïÖ=äúØQ‰´—{½RlÉO£f¿fܼaš#, Laá䢔B“8]°MÅe†¨[k^ÐËbê:U‚’|õ<›‡Âó‹¼;ë7!Ún¹Îõ·ªÌê™~Ž´ù|ü>?Ïg·e¨-úEfRU_ÓÇÓµvf/­ñS˜ ”°L*/%tÇò•k8d‰+êby%JÆ^·U[…ù é|ôL ધˆB*¯ÆíFvê«¿¯AE@äuÏi£Õ*ãT¡½“¤ŒFÐ h‹0"ë]¡}oa&[avåTTÕÞ—}6X£kœwÚ›1ï̪È϶ùÝo¼A¹–Ïî³±w‘2U…B };”YšP‹W{s'ËNì•;¥iãö{6RCÌ»¤ÌVVZïIã¾ô:VC¬¤Al‚r¡‹Â>\3c½fæÌpœ]”–m̨Bƒy@Þ?ÅýÔ‘‚µw`'OƒsÁùÁ°‹¼«yµYÒ?3Î¥?úΈŽhÎ-b.ˆÂ[.§ŸÝÎ}--e"#kZØT=d€pOÈ<È] ¤‡R,>Q)ÚæC Q±  IETG†D6‘S† ‘–[CO G¬ ^M %)Or¬Ð,•YšIµE-™’~†O7æe^®n•Ç)dfI`(KTróòrØ/gçlFÌå¼¥dâ´ÙK(jñ \Ñ¿$F$>êH(“‘íS™5ñ,^)d²¯›×pvÕþ°šþÛË“cÝÞÛWº*Æ“8æh¦sühÅ#7žkÂÓŽê.úùé¹!ÇLoÁ<•¼Ý¿Â}³g’s—WGçØK üî§<\ÜGñ}“®ù~~Óõeµ¸to#šlÔåâž1ƒj˜£2ßœw-ýàkŸ7ôX©Ÿ«‰Ö ÙâávÄ©CÞãá/ØùŒO¾éª `è—±§éuI$Òš»úp>‹¯#@b!ÚYD>|þ)ð˜Z,|(à$¿¹ŽO_7_P8‰s~l»çÏVn­ØÁâu/7}PªÒ&%ÜínVÉÀ8‚kÜhn®ž‰B51l;¢§I F–ƒ>=Ž/çŽOEœ Q –ôð–¢Ái,¤&f‚Ä#Áì„¶„ápkºnGÎæ§®ÚÂp¡3…ÛWĦ£¯îF"¶€³}I->Á´£@ õvÍ ‡)s@Ž *ºÇŠ5ÈEp´<®)6Ã[䑈þ[±æW$¶i jv9¬µÂx^‹å‰Ã|©…ãk~f›VfM5±æ¾Þ­Û7íµ²—WP0äÙÆ9nr>ѶTþ^cÊ‘Ý<º( õ°YS@Ð# †ìa#+˜jÞuEaæ%l¥Eà•]ï•nBÕxøgZÞ¼†Ç–¹rŠ÷¿Àv,‰ø°¯a·(Ä@C"…† Û¾6ým¨í*_®Øzþ`A –u+8_ÝY%|°¹¢¨?5<Ó0]4ȈÞÀ½”TPÿÈé¶Â_Àd²}mn{A‚‰nvQއKkS«Ã…†)_p¤O¹ì ‚>n²1QIC:¥(}½Åž8çA¾§‰°Q—›ìfÔWª‹­^ø5v‹ Sœ²ÝÃÈV=Óäýaŧ>j«n‘i™y}dB %fz¯"BŽ"®¨”$µðÛ ¯¢gÀ£ÕóEC F3=!b!¯¨‚ð 랢É97^QxµGE+‡ª]mb-¤Â=N qDæÃЇØ8Óªl"r<\VQJÇó£Øüö&m¸&Ê[ ¾Ä¥1±¬ûçfmÄ;ëàÔ²ÞÑ¥T%AîNý~¾®>þ‡ª¿×𔢑GÞkvg:sP˜k ³+>plÏêK‚®‚@èˆÕ´¼b(F•”:{’[Y™ÑÈ~–UÉ3’5¢¶.¨bí¤­Š Ã!h¬Áu­ñÇþEÕ;AM,اœ- Î)+†É:žÃz£¼÷Ósÿ+”|åÖÍJ2N¦¯£rÃéO=þ8×`žÁH8Ž”  ¼ÐÞk/úïçÁA£…öÞ*äî@÷ŠæJǾ­Di*Ÿ$&{í Í=W¹ÈÜÖÚú×F†Žyv*¯¾¬uVe‹þªŽwæ‚u.žl»úò9çe•aÃoYª24QçÐH§`çÇ¥çâQm/*5.Ùb’ÃüJû‰lÀŸØêNÝÍ’f†§‹ 3ëSe-Ø>Ã8¿ìãbþ(}€\H¥Å4«|Ä~§©‘F€À@”™…5â!¶‰È‡õQ*Ù´ ôfä’iŠˆla±îŽ^eíñ{æZ'OjEï×\óU1DõDÒÖÒñE×sÍ—Ö Ê%xªÕiM•½Ô9.úð[»¡NìF)DÅ¥±@Û«~‡~è6õ؆,¬§éoî¶äÃÊ]éc»U.Pƒ]GowíЖl˜¶‚ÕÞ[–âÈŠ›'«Âj·HÒZ>ÝP~‡š¨•ã!Ò+OtrÄÉe©ÅI@mŽEŒ&4Üjn‰«Ð` ˆòè«(#´’,Q[és¦ºOR`´ü¬æÂÄòjå¹cLXXÕÒï)Íh]uª·ÇÁHý\Z|_öýòG¸]C½úÈX5"RB£j¥ ÎrÇÆ€ßl u:+ñÁ7@Jì ±³¡Tg›pš­ÄLLä¤Zke þi¨¼Â0žçìÜÓ˜,›nM#ÑlV¨ÛGâ»WgÅÇǼj™ôz¶RgÜB)9ÕDÉ#¾$,3%ù4wŠ×%k›¨û$³‹¬g{¥vçÄwêRëŸÝ}†/×7w¡×ÖÜäSUáI)ì)¦ð)\5`1Œõ\õ…ª M!Ds4Ï=\۷Ί ©±è—ö&œ½ÙßÁŸ€â 8¬ àUÂÇèÇ÷*^~ÙŸ…DìУzgšþ÷píô¨ï[ãEÞ~³þh®Ñ<þ'ßrx ƒUc*$æ’®Ém•‹úRÛÑ›©AU¡J¸Ñ„¹0yÚÊ/)ze÷?®íkSÛIçÓU²â½púdj÷ëÑ~ÖmVi"¨Tg&JœÆ&@‹h p˪òS0Ç8¤h«áû£5PÎ’üZqpÏoÞŽ‘ñáŽíý6=š‹Q•°{t¸=y4¥Û2ðša¦5-]c[Šì[]¶Œúx»Þ¯ùê(=S23QéA4ë˜Ñ¶ÏZÕTó>Ö Dæ² aVôF‰/–¯ÇZö³QS=ïe,&ù8-zñ<’׳ׯkŸüå÷¥Þ5OL¿“«1Z”Ý©9Y †ÿpæÖDþ®+Ÿª­_¯â+,¢‚0T ÊUµT{“"]Òlô´œ"e™ñºîµÜ‘¬—Jn‰ƒ³ÆÏͨ«¿ª'|<.ƒ©•9†jö<¶[JF—‡h8ˆ=%pÅ4?#9ŠŽwóÔ5'Y·Þ cƉ¨) Iød²ìdѨ¶eX“£Iãawä®Ì£êIˆÅðÕQšYvp¾ñ‰ éHwDÑ;`÷:ÑªçŒ ß{ZßF1‡“Ä\;¸ yçNÔdwrQÆÔžzƒãÎk7s>LgÉ?8÷O†;ß}býM\O`äýz>He tÉ­Sa®aìQ‰ðV'¹2û4%–-žE6Üã–Ñó4>úÕ]O¡Í¥†Q™ÐJ™EV=Š‘©fÕFë„WùןÞ"AM(ÛMMa,Aæ±"Ãt¥T#ˆÞÃc…1 ½Œx».& “«J§O¬0Ðzágì5WCR ¶›æ|*•ßkИ¬Þá$Œ%*Oµ`ÖD‘6ÌMM¯;F5º4E­:O’i,¬Ž6†!.}gÂ4oöI¶Õ`t­I¤6ð{6¨è\,Óœ¾ÊÖÃ6Õæ©^4 <`ŽÌ|VÕ0 UÚÒÖE¤X”žšÄ Ø42/ØT…Jàˆ\Üwܲ|å@1²v±4!jÀ oÂÕÁ&rJ‘RÞ ½îˆè€.•Å¡¢`)Z…W‹¾®ÅkÄ&D•+*ËšjÆPh/j‚æJ»“×¥·¬*yê×™¹J¿¼5ä•®NZ—E>y°ÛŠÂ †Åsü¼á÷ÿuæÇí]0’Q;ÈP»žážH©î¹¾ Ä€"ÖôqÁ΃XXÂLmfj8Û5J®´˜NÚËòº¤Âz N'sV5u®™õVVMÌ™ªÂr¾~èíök´Ìêï|ƒÏuýÚ××;È質Þsp5¡0»þ~Gž R¦2o‘ÇVíu@-®Èymw;ˆLP‡˜¡õ̘Z›+"†´†wâÖS|â”kÜ`$ mò)'2CÝŒ5%Uãp‚¬k÷=Bñê*ðnS‚"TÝÔhžRОÑqH®Ç k{eÛöaâ€ÕÒwˆ<Ÿ?7_Ÿi|\üz.kÉÖ°àld³dh7PŸ2G¯Òm±ŠþÎûëoâm& ¨×6Ì>m—ô­#˜°B­:ð]ˆ½ìŠ×xÆr«½äþÌýª½Œ‰ÆRJ8jHkWÒ–°¨í¨S®µ©X¤Ñº€¥Pç§ÔÇaBVK-Ç=Â$®$!qâ ¬ñ¬‚–Š#rK7QtÑŠÙòkáK:Iœm˜º;DÅYñÒò#¼½wwÙ>ï³Ê¢"”+ˆSªE‡éæŽ,ÄáÇÆŒ„#¿/²rW‡­Ô"pÉŠ¦F#‡µ:÷ºª4AIºs³=ª ­ÆsßP—Ç1rq¬ÔýœÏT#(ª1h±!@.y“‰¥;H*ðH=x¡¬,@€%3k%\˜P«ë2DTb)"¼‚@«f–ȱÆÖÌ€kñb’QJKÒŠ›¹¹ÇZ£ütÝ‹«<’’k‘î{¦ÊCÇPˆòë¤RYæ ñŠy¤×UÅÙ啹ÿp÷ë_Ðÿoÿ¸Œ+Ö>pŒÇÁŠRåÉgX¢¤Á êÒ<À—ä´Ÿ.9îÐ|"Ø ˜WÌ÷·/—K&½-»ÏNæ“^Á-ÜdgFhaæ—íj™­ñ‰õ2LÊ«¹®NÖe“ Á£`ð,ºìì9µõùä•"ƒÓ¯Ñ¸f毱:#u<öRßä(Á:Ü•:ÐOs~üxíÊFU v®±l–åÖý©N,öaD—!¢#­[Œ¹ªå®Éî'÷_­¯ï>\ñ·.ö¿ûÚzy?sò÷Öÿã{{Ý>û³ýè„v”Åàëçš¿Áš }ŠoU_VΠîcÏ$L©¥Kéô»ÓÇ4T>–ÈGyÿ˜qÍ Œc F8¼Ó¶Ÿèèð€ Ô ª»)M7®CÆÄE”¬©pm¥4öŒNaõtšPô„öÛúŠÅÖîª)½”Am’;‹âÇš=¢úA~vàϬ~ó AôpÁ~Ï„© à]•DXXq¨îÎý³¡9"¿ét¹†Ë;’ `ý»MÏEm²g‹ÓÇC÷®<àñ'Çð§`|@¹ÕµÚá좼ìYõQ`H‚ø­‚‹Øý| ¨¼»Rr^°ŠÞ5ðXB‹†zá6Yí³g¹W×9¹Dx¤“ ÕK£áÖõÚz8{Ö¢ì‚Ñ‘ Ëõë(¼ÿ™_ã:tf»´®T)Ɖwq¦=?w1fÆEX»‡(,!Õ Ã €Þî`ñI}:Ô², ?&ûwÚjZLý›|î2¦hq”ÎöA4ݬ ŸÍõ…ncø'Þø‹fÚ ŠŸ7 sûëNQ¦2„°M+C€¶ÆL Â轿H`,ŸžÐŸhœ.½‡P£Å½nŽ´—.ë–¥¤ÓBSͳ^J7fÙö]#e8MÛ:-VþùùÔÚb:t,Ý<âá²1<'ì*;,ë.ýïXéZ”Ò3Ñx=€ßçzôçÀ(Kó²öõéI4½ÞçÁL®1ýU8;šS­¥îr²ð"¢9¼XÝ$t•'ŸSü•oÂ/í¼ž{Z±«Aàën>†Æ>±¡&ç¶n&â<§ Ÿ×ÑÚf 6—B ÝРÃÈ[ܰ;Œ»à¥›½J©©ûé:oª$ÆS¿ ¯c>¿_yW¾Ÿƒé-|œ/è2çÇ`|Q¿ü×MYÎNÍ%ñ¡KÍì"`­jºïÀ9¦ºš²:râÐnàGµPú`[‚¬0ÌhcÀM"¢4¿1ÚE¡1´»>zÞ£Tv÷ôvRYžJ É o…¯-?·é4ÎVZ*|˜NšÖ|“÷'}åð2Í_Á¼vôKúŸøù¤†ã®9çkœ†n"ÚÐפB[|ôÈÏ7ë~©&¢-—ÃH&QvVÕdT¾X„q)XÔdk½0Ì\ -c ý Ù¯£t‘S³LÂóF¿^.2ŽÍ‹_!íÖ•6Ÿ>uãrgÍzûÉĈSß½ºnëppAíûˆãÓ™ÅÎôA ]^kŽ<ªé eDìR»žÑµI‚0±š;wËÓ«”e³–ŸX#g:U‹ùâ¿Ñªá"F¹[h)ºTqDÁDbÛPAVvaHPµ˜˜üQ@̃zJ 9g¸¢¡êNk…geË™èß Uh¶M±£æ¸È˜ ’è¯?T=©ývþèìõ(ß¼y3\wÓÒ%nX0›Õš•F b›j]‹ëZý~BO¹Z/Ã6žÂæ³ïnHF´¤sú‡ëŸßÏ?ñ+"Úþq$†9SÉÚ*u74:' Ba=Q¤ñÜýâk=àùW~ñµÞ¢§—ÊžçÇï¶ÀÙñ3Ž#tŒ…¦é)œ‡³¶§žÎ}ƒu"fÖÝ—¢Kò:8P&Ðÿ°.îO%_NÛZee¯lÈGͤ£\ö±3-˜ÈÍBkX –ã,Ù›úÛÜ\¯ÖÇi¾ŒFtîï²ÔqþšZýp$2mXžœG}JâöæS&Z˜<Ÿu„úYß4Z­u<3:ŠA%"Õ>xÿ¨ßûhßU­: äÕ.>¾o§§jJNüœÕ5qjÔ†ÏÕ{<¹Mëò,È!½™ônè’µpÊؤ «Fˆµµ%ݯz†@)¥áÈT ”C¾aZ ~‹`’p·u[ƒ%BÌeždpϳNPºNßuz,ÒÆÑf3®wŽº,uýñò)¨¢J„3b%—½_Ün¶ÏøeÐgƒò-!ü8²r(»è~úsÄL~…L°gUiŸ¡;Œ#çe¯€ZÔ¸s̼·PÔôŒªa]—®«œÓ<5¹Æ‡*ýf^WM»…«D••}kCÃéVé pÆ™:#€[ª êJèÉ˪6ÏõjëâSû§÷2e3ÒÀk\±âÀbaì®qºðõFC¿\Ý£g× ·fÞ·¹>ýò­M3ë¿l·ô¸ Ô?Ýïê,k-ž-‚fs¨yVhj[ ¬Ó9äÕt¡Õ®G%ŒWRÅŒërÞMg¯3îG>øu>ü €m…Ž„Ý©¿Q^ë·v÷¿:n®…QIvŸZì@dØß®ß{noõòéßO«+]=fhù½Û^uÎQ’úë&ÿâ–?¶ªJ=ì‚Å[IêÇq¶›_…štW¨V×€v°«ãt쮋{,ÛGL^†&Š›àÁbµ±ÃÍ`X^CR-ü.3>}/ßîÔÜs”' Ö /ØÖ«üëýSö犵^ýË_ŽRüÏäæÎsð¹÷t祷•Âu}ú{³ÿAÎ5ëzª»åŒÐïžy·üôˆù?.7Ú œ¢€(P9 ЎyF_¸ qíª]цL*K¤EkW6kiê8±û¦·D ÄöÛ±Š4ÕLD%´Œ¹Ã¯0:uŒ‡ÊÔéÚ“Ž! )éŠJÈ´¿8ŽïC"UÆÚ¶~ž=Ì$µj¹ QJ|ã)—ž¶ý­È:¾’¢€*^œÉUÊ„|ó¸4ÎîÜÃ¥]‰D;Ó~=äcµ5ÒN:"? t%“Ã&±:Ó†‹3™Ë6÷LÕÝã*Ü÷ÛGpÕ?»Ûê÷·9ŒÈ¥þŽCë´$Ý>:“9m¶^>Õ~úzO÷F ˜Ò‘6(ý±ËZÁçŠÉ\è¹S-ÔõßDß»ñ¤a)¼²(j5uT2B=Ç Ç:×ÒÇt/Ðën›Îuò- ›G®8c×}ØNÀÕô¶ÆÇÀ ¦LÄ%“êÔsçÜαmÉvfª‰”XÉ[gêZtÁ.ËÇfôóW¾ÛÚ»Nú¸Iq[GÌíú#\I2‹0òé"c¸Ž¦ºUÁ2‡n Ü—)}QC¯˜’óú§ 5' &Næ™ËJeQ–SÑ’K¸ÐŽf S2˜ ƒ‹Á Ìr–Õ^{wrOå8†šyx–=KI}AåŠÑC­Õ800+,._ȼ÷˜^ƒzÅ­!¨°S1˜Š_[WèX$ÀWˆ½K@H6¸×ù"Ý–•Ñ„0BÔj—ˆhbkl@*·T14 ¯' W¾¶¢’bAÕµ 9ä±èu{½ŸÚÄÒNÕ¾÷~kë]>·UáÖö„ñ2ÉýJ0SD)¬Ù°‹Þ]' Ê ÚiÏÜSmQ[Q|Ã#ª)Å bÜãÛŒ¶¾S]\iH Òy¶]6HêȧÉí®5^;€¶[Z7𭦯 ’§MÏÏh>tÿhóE^½ÛÐ\‹~r&‡dó¬¨!½;ÊîÇuW¹÷zØòVÖýr!ébdcD¸ëN¼JfL ‚w¥˜ñèß-á‘Êij–ÅiÑ‚g–½}í(×Â*•cù>¤ñL2#¬mÀ,Ù]c-Ó¤¾®ÑïkÐÔó–ÖÆ.]/±®°ÐÞ´Z§·ÞÔVo¾ ¿~]Òr=¾þuŸâ…EpÃ1ÜæÝå¹Þ^J¯fí×sõ}xt®§ù¶®¤Ç.GðµÅýhûEàvßÀr\šn!G½hö UÞ›þ¸ãå ÷„Ä•)/¾Pc¨R@—èL ,¡ Z’™ú—€8¶*<`*ÊSù‚:Ÿåù½¦lÛDq…i“’9¡‚•`øÄ§é~–”›V*ûàÕûð|ð,{:œ”ûiJeA”éí=·Å×SŸ®‰–n¹ÁGgAÆ­7z®8Cåé(åõI23 AžüQ!œK=-W¡!n/©fô|›F…¡(-ÛcçÀE2´Ó¬‡¡äðÒÆÅ’k鿀‚R^ µ¼Í{eza9Ð 4a­€‘‚$‰)*A0L(í`«<ëM4+±)OIÀ…ˆ†Æ.²TT-Ga’@ˆTbjÙ–ÁMÚãß…6ÚtaPhZÙ׳eó 1N Òš&½½wgxkµ°†35U{"ƒA«mÁãfeM¿¬®hNþÕÅ=}¦?GÞ«Oõ¸QB@D¡ÛGÖÉÃ}o:öDüi›s NÑÄý¯å/Ôªý6¬Æ»f.»fÕ‰m õ…M’ëÒcÞLn€ŽŽgÖÕaf5¬HHô–Ëq§ŒÐÔ#vµBô Ö…ÞhGxâìßcþ匡A/*Ÿ¨çhT Û1‚a-Q°D ïñd“ƒN)Z*ƒ¸¦Õ¡á‡ Ã%\þ6Ù³aÜžØú™yR2Äü½Á~txMØbE$‘éíá6r?ÈFnfoL;·©¼Nÿl/Â|§T$å(©båe=ƒ™b¬áÑ+ÙÕýࢠl±QÌ<ÏtÙÚ¯3ÝjXÓ•å½]?é\guýËÈüibû’'´(pØIøðÛ÷Wäê*íœb\'<ÕÖÀDu¹`K5â:'ïPT/s{ñt_ýœo,GèqIôâU†¾6ÀFãf˜¶ÜxN2 ÿ(ä”hZôb ºµn¸ä‚`e™ž@C1 ®ÁŸ;ñK6矓^ÚB4Vl`Ÿ÷— "ÞÓ;d°1€l‹áehÏ1x»Üxѳ½5¿§q™ùïí‡}½Þë¿é6¨mb„[küf,9Ö€û¶Óowš—0:Uºu·°TË+J/‰/¸c4Ì~?&j8œ׌‘g0”ž(~^C#ûœÍï"ú5+¦·º ì%îŠÇ£\§ð…ÒÏ,}p¤ˆK¾;C2©jÌ,’¾9ccÞvÖðï`ñ˜@Òsœwè’\ð£ß¿ÑžñS[ç_WñDïa—WH•Õx!ܱw~ü2ÍKk¼<ãPÎÃÖ`”y‡ðñ‚¢o0%+Õ‡••‚eÊaÙý¹Ü‡­m’Q¯> ½«£NÚgv”¶Ð¿ã› •†ÃþGí<×'£ÅÑõšR8› DMó›èÄì:žzÿµÀùûaí¯ ¥b9“N~?3fùÔ„š«²ÑpF`íð:Ïêe¯êôJ¿$_Ùý|~›Ç_:ãaN( ]ƒû…É!ááݧ7_~êÌŽe«  _¯Èñâ,*­ÿJÖß'bµåáH%èÈ™5”7HFŠÓΚ5•ºTƒè‡Å‰pW(wJóë~.††ÄŒÚ g3xF92éñ©¿0¿©=u{?#¾4Ñ –pKØXE~šD†Q „çr.ÈpŸËý“wëC½vîœÇéb›¾- ÊåÜa¨f›ÍÑ«âòuÞZÖ‡ñk„eð&÷a Öyr-$¤ œ)âŸÔŸ¿Ñ/£¶b\*÷²$H+œî6®ùK¥Äû52(M½p?¿ô¯ÿù?¸y91Týâ'ªûOßšÚÉOyA|HïæÏ5œƒ2+Eå* 1/ÔÒSpÖq¶à-¤—³å*ÇyêfƉ»Á7܇<¿Õɷܼb¹z¾;/£^gŒŸ"7U“O, KÕbÏÜpÀÇ›y9>yÒï3w_»W/Ð34ƒä$ÌBc‡áá­ßM‘_ '‡!OÛ}§™9ÿ9ŽSíÉ×j.–[§c@Sz>¿kÎwæÏ»üØÂÈ9çf8GW»S_â[–•_/áµùœ°ÜÚ¾Dk5PBÿüøGèòJvk¹ç&ºèÚž¶Ÿ¹µûdê0u®ÅãO>N>}^ÄvX"ƒ`Ÿ’…Ñp"˜&UÊ_8“›×».¾^TÕöÕ0·Mî‰Ñ¾ªîßœý~w[ÛŸW¤ªå›úTY.œ‚^L}D«#Ö«õ‹!wŸ¦^»À òDô‰Ð° PÌáÂÉä©s–~ãÇ}À/\í¸¢Ú²³ÎÎËÿÕW½Û_;Ûÿƒïÿûòb;ýÑúç½[ñæ`?ÞûpÅ\Á> ä yàšïõ17¼6 Œ¼“©h컯 Äïl<ʾ½Àú›X¯+_†hBŒž sh­wü+ºß•ë¾`'Äx¢wx­Qÿ>?àþŸã 9âSYqpO•sŠ9r˜z}«ŽŸªV÷^µÊˆ4 C‘¤~žíß?_çå\çZ¯yÄó¾y•ΩùòW×Iv›ñru!oÿG^MôB DÓœi³\jíx|ËprøŒ¶ê—ïÊóà¨L2ư³H´®åø¶ªíõzðŽRÓðSгŽW¦:‘K…æÏ«èbNö—*ÿ®¢~B‰“ý÷~íµ¯¯CÃ{‰ÑÜÙ=ýX¬ìý_5ÿ/ugiDÒõž,]À¶ÙŠy=ɸ" eI0£€†„:‚…¹õåªXðtu”D|Õ’ÄZ¯‡®°«  qÃ`š&‰6@†yÆêÎíäaW—òo\à)·H¯t˜(`Vµ¬ÃézÞäÜ»ýVõÚ§‹ú>µâ|1[JbÝí˜ë!¨¨{°Ä©Qª¶ð"õ@®Âl×pŸv2aæE¿Ø‡·•¯ƒ|är ÙŠÒýy¢ÎDŒ ot 7SG¬´Ûì –'x-úÖ´oZµ•M¶¥I­_ùüˆ_×ÕH½ÆtÁéÀS8‘6Šm«¨úÃ:ïª5S} íÓþÅå°è%·Ë<#¥îp•”]DÈ#ÊÇj³Ú³' ¯$, cPfíòÖÊšVr‘ÊËÓ]Ö«Ì9̇ÍÂØKÚMØc`>¡`ZÛQa@ë啩ú¹ÏæÞÖ#UNá¦MzB6QÉ)ì/äÕ‡h01»r?7„¥ÉaFÝÂ6¯—£­YêIl7 ìR`7…B ÕëvB¤Ô€{Bce@°Å€ šzG+¥Ð˜„Ä}ê#L½êÆ7ႨRŸÈ!?è`agkZ¶‹ºÒa_…ÆúÀlg°sHž™ºALB’” oÇЊX ô“|€©)Ѷ¬*!‰Ð’¦êÃȤKT.ˆÔò†­™©' Â-ˆ† gkŠ¡a¶56i,6mçP7uÑŽØ•`b1YÖj—¦ñHÄñ(àBK€Êƒ)T˜UW¸š‘8n"4D„/& ÖûI]u3 ã" ­æ–C$µ-1.°Êe}vó›$ÚõX£æE+n½ÛJ¶M0‘bUÊtI§°ëB—QÚJ¶i}\3á^³uïœÿXóÏèÿX§W¨†AīѮªPÅ›¬¡à¯‰xÀ¦‘é¼Û6Á~4œ®¡Þ,m×ÒËè>2ÚŽ¯sQ|°²b Ñ7vÍœISMŒ1ƒ»Ÿ÷üÀÖðªÔ\è äÔSµ% ¹(¸R.ÆHÆí«iÀÖ²%F˜´JômÀ\ÄfÚª5T ÆU¯î´/ÒóÜ2qci­ Z] ÐU`ÛÚ²BöÓ Yg²Ó¢Èrm]Y¥;­Ér'­<60KÑQÍvP÷¤c~âõ=T@$AÚyšô¬g¯¦{/]¬‰âÚÍ£·G?ècªEƒžã–ÓVDÎ=WDpèh[I …ë‡^LâËÄEµHrôK|T[11ÈWò°`9[ªÄìnŽ÷â¥%N}ÖgièŽø9 =uä†YGaÌ–,{˜¶tÀJʘ-óø¹K­5&@y¤³¡tÌO²\¬¢Çš¸‹¹¤ïp_ªîß§Î×¶r0ë<Œ\š3÷u!5&\ª8Œ–±áLÉW¿~‘”qÓ¬N_KŸ$DÏl¡¬UÍ o™a©¨QÆYh6}%jé£ÃØÆE±eŽœ+Åz¢âú;èUäE=0"ü•ž‰Ђ)q¢´MU"#⌮¾@§ˆUŠ=»ô+Ü–¬K ›z¨+C•¤C­'¢Ä ïÛ~†ù†&~M^̦° åÂnBvÍVì\Óãè¶-9~ǵÄtÀvÕÁ­Qˆ/‚]ŠFU÷³p触jìÖÐ"….è±v;D h¨ö¾¶;›ýç}®ìÉq™É,ÕZvgĵ/«É"Å`6ƒT|»õu¶ÕÎSîmÜApƒ!ëK3‘ lÆa÷àeKtH˜ƒæ/¦ž^QÕa–ÙJ[õcÐ yàž*N,ß–F'.#€W ØŽRÁš3&ÂéÔIuÀ“ÐUy,gÁJ«ðvÜk÷¸LÕn”×rÁITQÍÅ#Ô&@èîp+0gݵ!%WòÌ9ÁĺµoµªìWcÔöå‹Ovf£Óò'[˜ã®˜!~|÷Ïùï VŽ÷yï~Çb°G-ÝžÄêÉåû€¹Zša=Çh2(Þ¦»9~Úå_¦{ÚØÃZ r%_uv¸ç}7Èo08î­:Œ&¦KoÑrHH〄0Pƒ^nCb ˆà,Ý"`šÍÅ8"åÞ°²”Æ},Ä$ÀmÖñÉÅö9>¶ÝFx×@#Äaf¬Ö^ lãò#Ù‚£Ä";AãD Ö²!däh‹«®àž„ל¯?Áë?XŽÿhu´'0Q›ß„êûêÕHJ§¦Ÿµøãˆ¬Ç)ÂßÛzLŒ„•QŠaÕø_zô¾·‡·VN^}0}zµÕbl›¨ãù²›ÞvTkÛg¢Âïë"– ìäI!Qˆ‚cξÇÍà‰ù»ðùû{çß Þþnu%U¥’ _Ëì%ÏnÕøè“Zµa®i›^"}Ÿ>Ò¡ø¾3eGØþFÖ »É½%¸¬U[‚£â¥ T3d±ð}݆tj®?<56¬ÆŒƒ" 7H»øK@ DXn§ÛCËUI[KEJÈ’ A6ˆÑL(Ýýé^ v¸¿4§:n;báÀ¸±K‹ÂÛ˜st=62@",.}ÐÐjÉ8sQ\LBÃ6@JÊÑîš´îM’è5ðÄ` ö›Ó¦®CÈsšp=íÊc±vbåBºP8 ïGÒÞu1 Ókë8¦Ñ0E‘Âþ¢% !ûs–‡¿/1ˆ'Ï»¨_Íð"½(ý!â?þòÝ?wûxÐ]ðÁ©lÉa8ÞœÅÓ8G9ìt‘ìí±äÏÂÕ–¯óšÛ.÷òÛ#ÚÍô7tf‚½­.IÒK¢Ôk®ìQ}úìÑo½åv[jê§KþÌõ’‹Ýôx-ˆ_èV¬ÌÕœ+ÇL‡¦ß²éd´pŒ3t«¦‹Ì“6•ÐáF¬â^Ò‹Æy ë‘w–N{Yh.¬LrÚ³÷¬t;Æ›Zì¨`€SÒ.Ìløƒpú馣j¼Ú,e©5åC¹ä`½ÃRl¤¾87]Ià6]`“#‚n(½% iæÁ«·Àì38ßCVlJtBa,J[î1ašCu0ì Í×U5æLXbã/ÿ9§–„¦>_V~-‡3të‹c¿¦%M¢Îü8=%¥~t9¤¥½õõ3£wêuV”§ÔyFASvUf÷rhr|Ýo‹~öéêOoØ'Qw8ž±¿%þù1à9½”ØPî'¬W—ë8¸0º¸u×Õª¯–Tx¦V.ŠPIhsÚ0EÛÈ+ò€e2«@VñxöM*˜Õ¯÷̇cYSØ [™hßúYùtsô@™$Ïió‰rrÓa+xWñD€GžÐ¬ØÞI‹¯Y#Ò|*"U-ðE~©~ª¸1r™Ë±¯¾ýn~äêzc?ùèq—YÕ*0ÈŒªùUœõX7ª„ï~¼ýYíÍÚâÏÈ{‚µ4Ö‰›·WëO×sy¥+mO¢ÚSÓóÇ×öWÌ!ôA|Ò7¤QZ nüqëà5ÊÛÁ™¯³çmÀ/ß¹~×I…ê_Ïå9õím>óúCñg'Vk »ÎÒ Mƒá°“ÆÜ ~޺юó»’\†U…lʵçÙÑ 0’ ÃÒP¿‰¯iõ^[Qëvv§;L¤œ”ñÙØˆ'dÎYªvºÛhNHemåF¾€ÕÍ­¶÷ªdt 4Ó¸´§V²V":w¯ü žŠ* ’"&V‚ŸgU°fîMÎIÂÂ¥ÔöÊÕB€».¹È±‰&Çñƽà]ñaîÛ&AÜvìcö…}vÍ;Hâ+÷=¢—£÷—øÿzö™ü¬åã¤Õ=шD ýâ‹mBq‘ª*¿„âÀ”UF—òkDfOηBßsöÝñlmÖþÒ¨¹lò§šµ_g>:ðX1#T\ÓvÐh(r›RëÒ+m3µ²×É£/½ÊP[%«¡(ÇÕ>ü¦)JL´È³ýɸŽnº°0ôhQ'YÞ»çs0[›š¯& ¼Ìdš1&0Kz¹úH®íPäŒÒU-O‘JTJ„“ºëú4èÆ‘3—0>}ºÔd—H­­iËílÝ¥Õâ¸æÆ‘„8]ؾ®v¾«£%¥°ºhSýX-’=$‰§Ö—¼'?#;øz÷'òõÚýðòIžFýžœ3`…‹@5ä–Ê}J~–ù›ƒ3GWÉ5÷ùÉ2Œ"›še¡ãLbX&éʤÀ}Â?¿_u‰ÈŸ@U'"çÑ}Þ¼æŸ »|ÛfW.QÉŠ´{ø‚#R£p»Ï)Z_8Â?51Â{Ñg©Çjuåä¥~;éçY›ScÁ—Rj@~ø”~žñî-ô9²ÊjÄ„0ÑÙÂ{Zï•uÁ ÷æiÛ´ñrŸ Ö~}8éÇÿþõSÍþ½Ù{Q(“®Ê~Ÿå£üõ÷øÛýeµ¬\c+‹aÆkMh8˜’ f±‹PäÀŽcBêK\;8À\JÄ ^R‡`S$•MdQÏ›Ëñô<»Ë„@º‹0&;’†šìJOØÃêty”©'Љ½ˆA@gÕ¨ï—ÎÌ©„=#OF6W£ºuÖ7¢„¢xÄlšT£E>Ùd®‰IئõR| TÚðl`¬I—‡}/…Ú …&„‚AÈ®‹ Øe-{вlv¶{aAÎBz‹’§= Ç* I¨!RÅ’€£TTÜ‚Ü.¥ßÑ¦Ñ gá”+DB`ÂR08+ø¤=€‘؃îz¿0‡Þï>^²»÷lËVon÷³ 'îmù|P*Ìa£…¦j‘ñØÓånûL‘Qö™}Kµ–߆¨ÓÊ ¤ ÁFªeê/êÜÉjìrUX +)¨ƒB fÀ,}çp‡j1$Lóo.çïzÄ *§RPª¢Øˆ²À"hS,’ Õõj¦9‹…ãç@ms’õî{èÎ`Ù‰~žË.±ç{ª×Dâ1Øišæsý#§{®äYêX,CEg'DÏë²Ý’Q_вT°Ô!"U¶v4£ß'uµ¡mßò©è@≮5m–±¸† ´õаÄã0ôîÿÐä­üôÍ+Ç“£A Cí ÜÆ3>ã[î·ÌuªšnàP1EGª ×uÑ_Œ º3úÂVl!‡ê,D&—[ª«Kkéáryº\6«J¢t—æ›NLNìéã±_·i„[(’h ÄÛ5™Ùj,hEå¡6äQæ.âð•ƒa~¸bPF8ÛuIºV›¦ µ5C Àôº–` MµÈ:ñ,ë0Æg—´¼W¥nþG›ß*öyBCö–ã´bŽâåø[8†æÔ÷2Ç@ä· ÙðÖ“.½´r›‚”­€ìpq¼ÊÈ<ôî"0zV ùì“O» «¦ê]0Íí0™ð¡ê¼9mªÃQÀÔ Æ€?æôçµø©ß›ÜÏ‘6É0ÝG4 ¬F{­ÅnÏ-vØtÕS5÷éÆ&Sî£AAÑ¡9°t8ÆGUêéÖ)Cs<4ÖòemÕBÞ ÈWD¢jŒ«Oz&ÍQŒ³+ÿÌ•P5nݬÿëß%õ;Ðø[|ÿžëß&͋漉 qà€R!¬mBðôb¨[KÊloWf»Îж ß›Þ"hi}$ëd„ƒ^Õ²È@‰K (;ÊUtc«aÎX,ùìgèH[ÿ¼õøƒ·_ð9f fÇ0íÞëUã£À€±v¦ØÜLøÍŽ,wÞw; LÃÁ4M3ðkî,¸cÎÎöxLñmvÕ4ä5¢yòåOLÙ|6JÀ@¡¡[^Ì/ñ¦Š¦-ÁÐUmTì’:Šõ²™\=H‚$ ECEú¯Œ TµÔ ÛqH$² $á “#cT£Ì,Té; ÌÃì9áQR"+tÄœ€:ÜPÚxwWRÞüÔÆí •Ò~¿/,»±¶•Ä6¿¼ÅË 4†]•¬gA±\qR›Jv{v&t'£Ï¥vNì¼g …Ø¢¿0ø>éåoŒ Ĩ—ä“…ÀðDRƒ­ú¬—·LŒTtËLú¡ÝÄ¿`úœæß´ÛÖ¦GÀðæÍN[RbOVÁºl+ëǽp›¥ë{Vš¥ßœŒÃ±‡äëÛ+ïna"xž}ôBx aŒ²6´Î2Ço¿œ\o•38°1h®c¯¶A´2à5Ïë=ÊÐ1öÀKëÁ+9¯‘®úø„d%6-ðŒÂÕ¡µ Û¤¨‘¥’}˜}-9ŒË@eq§$™É¬lÄÆ²@F‰…±ôx Øì|ó7¨Ë–:<ä?«Ñ‹½ˆÛ³±=Ʊ,svßëä «sª×e{ße*cïñïÝ»›rúxqŸŸÝŸ?ýmjáTüpr l\ýäû…ƒŸ÷;Õàyíu«Ý8Ê•';åöª¾Á›Œã–ÔŠ"bà]/e@SeôÜ}¬q!ÕñLJD òP¢ÃÃìhLçäÀTÖÙÝ]Ëcøc>›®&[nÉšË6–År0Jéò‰•ÙN-‡­1Q_±~¯(Ë ª„Úf :þ’C§kaçºç™æ,ø$Õiè\ËþD´d›fáXoJp¸YµQ |ÅBÃŽþ ªÇžQ>LÇz¾`tÿ:-OÑÓ'ÆÓ7{Òþåùý·/‡{[Y/½Ûõ¦mäÅsòyaw½ºÂ¬¿}âó—tk¿ªð¤}ç¹éçIŽóvëOÏ‘¶ï(ÿãôx=KìÄ–{DÉÿÙü™|½èÙ¤ƒŒhŒÇå}þ³æ‚q}Ó) e@†“™Æ,ñ‡ÏŸsÒuѺ×ÔÚ ÐI ”—Æb/î#üIÑþUi)d—QRU•«‰|!.g•Yaúv¢„5Rj’eVÍݨcžˆáƒNWgÖ•ë²,%#{"¦O‰¬pgG­'?!oz8ËvoaŠr¦©ÂzÆ=•ÆYíž,[iýÙ:/.O½ß~\}1~ÙgÛQœˆd*áQHûxõÿüÅžkó<ôû¢Ÿ¾‚TRÅßÞüg5-ލ”*JqóH’©ØÕ =ÆaX¿ZüVã¥=PzG–ÕO¹yÀšHè‘âARŒ'•—²4$Ñ5ŠÅ£H"a •ÐT˜H`¶Ñ  þ®Cbl€ p|PR0—±ÖJä oÕÃ=^Ÿ´ŒpÜyÓmTÏEHîtŸ 30uIcÖ5>ˆœ :8„×etX:âÏ9w 7‡å#¼Øzü¦<>ýª(ü$tJ1éÆô=cÝ¡°ÁVT±V¡ýaƒ&“!Riû”9¯z–¼Ñç‹üH³€mBЇ'* ¯€Î÷¥žûèŒÒÕI .zêÊOï)Å+ÜV>)«xd_¡RE¡ÆuîB›+Ñ àÆp:wIçc·Jk6“#­Öœv¿¤+U#0ÑY?ÜŸÕ˜C`!7Y)jÄhl©‡&5…%È&Û8ÕÈbÚL*\éA›üÕ! VKHqö.¬^ÑäÒ¦¿'º erÝ\›e@{¬c[ !dI/ßåz!+\ÅŽÛT;à ¨Y™p Kò¡¹*Es6kÎ\Eà.¼†&µ#Bå᳡£3KQc¿ Ð5ª+Ä€Q3wIrd€ŠVY¤Á£áSPVÚlƒd%4hvÀm °k|eÍþvïM‰®ðÈµŠ·»+³)Xîh[X¨Bì]ª™ɨ" ”Û„ B^µ¡ï”ýÚö=ÔŽ‰D$•é• Å”íêY‚"T?]ÿ<÷dëYƺ.Y+ ùÏÙÖa!duªQcÁ„¶M[öÉäŒÑâM]2P„€b9ÿn6÷ù¢¾ÏöPâHpëJ4ÔÕ hŠ«ð¢WgºÏ ®[ò¦9Õìý\Û6®¥+,q$YìÑöB¦ž€=/ CU¢žÙ¡Â><¯7'i³+ñ}~yÿä¸v‹ Þ@´‹O4!Š-ñ"‹I¼Ú”z4£!aL´×uË„îtÃöIJã{ Æd,\õ*Zwz/Ý»¨Ž"I²b܃}Ô wšù¢NåÜJ€ÅV«®è•¢q?2àJ$«"OÇ‚"²«½TNbm%b@‚G²šWlBQøð66-:ÊÚßI\âÂîÖéV竇ÙUUÔ&‚»Ô¡[}Ø™î ×¼<³ð±ôoí¯ò~­J<*/Ó5 C39$^Eu¬íþôÄòüwî¯?"ß¶éýñ~yµ÷´“×w!m#Û°‰6=ý¹°Fõ@²9ǎǼA@¦h(Bl\,ÑûªÖ®£ûÚVÕ©yõ¬ðwÏ#nou¹˜¡½cÖ',~ê딕{ÈYf•Iá ¦ZVÅù‡µ•¦wë…‡t/kª&ðut=÷ «(AX×è5™Åì<=ÉGì˜*{Œ«`»käáƒ7TcîñåôS–U˜·ÊØUÅ2Ò"#£ `¨E< ÃH †e*BÊ0®ê¯Õþ äã¡måšø\¦Çzßæ:´ ©® šóÓ±¢sYgZlÉ1œÎnjV—â~mà#ß×Ń>D%½Îž?n³þå?çFßÛVHi¢R¸ðŠ0!pE5=²§"í½ÂÏéŽ|÷±½£éÎBP3Í  E2Ôñø5§KwNüG¶µßŒ šæn£V$êJõ’3=-®OüL˜ V €¤®µ/—¯ …ÝÁ <‡Jë›/ E‚©Ÿ8û·¬òÁ]Ìì'=×WÚHa£÷}["쬅˜×"•¢$™{¶ùÕd#Iù؃×(Ü>ZkÁÇsáöÍÙÏ[Òí4×5…n"—3[ö¥ô4xŒ´CÃ; (úÍcšGëVäꬶaSö;€ «qXïQ„Ò„¢(4ݳȻ֫âfãÈ€Ž!ˆÈõ¤~-7î‰GÞôIÓ7¢è+Ú(¤5Ðèùzªls5€°S›BãaíÉÖbßbÌü óF}ü@¿ïµ{õûж6âN*Wœ_YkçO¿ŒB:ÞqôÝa ¬Vw]œc>·†ÿì|}ñ×Z$%+'Üûô¯Å˜… í]ÌKŽ##‰¨ù"¥Q¼1Õ#Ô{3óŠ$"Ÿ æÉ©Õ×Ì=Ùa+áé2T„ác˜¾Ã«16ÅŽvd?ÆÃœ¿¸¦0.8ŽÁk ßà-#Ø ”r[Þ~Wº¿éI2 Z ²X¨×!H£{…æ­^ôS›ÍÙJé¦0åIoƒ¹1Taµ‘§OÄ¥)Í”xµ\ˆ p½nð2¬Eƒ‡¨„¤ý©©ÿfƒç! ØzKñ0i-’$YJ‹¤!†íS9Ñ: 2µçÂ[VKû¹i¿È†=P14EňË/6^fvtºðq1>ùpH;ÒÞGcXlXÕ0„ÅÞ:ÀVh5„‚ ÖÒÈ_qU¯Ín>ìn\Á`·¶š–æ­Ôd4ƒ2Hb3È¢µ:âä2ê”r†ÿgI,uú'Ggnlxº¢$$ÿE‡g½ivÐ;ƒ Žåӌ͸eÂ.¡N1£ÔvîÛ.M¬ÝF#~úJÿêž@{Ôy[·ÐÄbû©“I¬?ösÙ{(||¨†6 ŽH'רôt§2£ÌÄüάp®>Ý«hЫtýÅúx| wG冽Ù_óÍq¸:N*³3 ¬‡•‰8/ù oÚì,SÉEm’0ß„¾ˆ†Zû5Å݉d–-¯£¾2oCì½*ˆ=‚¨6Ïqjój8ZP¼¯A’Ò„9~mÄàmDÆbÏÇ ÑϦÃùøSâ³â[«U™×<Ãñº~sñ´ ‡*íØ9^ËÌgÁþµ³¿bt,n&°ž±UQ8j>ÅüÜ€ÜZHs !ÑT¶þ]fÿ;V¯À´Õx4«é§#C¦:ëUsÝ '«pT:Ϻ}g¸w«ýÔGô¿QAÖ2+‹={Ia[B ¸ÝÁSW3ÅÝëuƒ:LeðF´?.£7³W¸Ô[Â6»ÒZÝ’Š/n®‚p‚Û;·u†žq^¼ƒr.‚'æRVëž…±GxVT„túyBÿâ¨ÔN¦Z’«$2EÙx¦,%Ü”Ï~ñd£´sD¬ãbiplT877ó„qlûÄÉâÑËÓšñíý§p¶u2»õÆÐ5jki•¨ßit•p&yÎD>ó~§ÚÕQ?<ÆœóܦNJW3™6Ç“~ IúWÕKGÎþÕpÙ‰¿'2€XØ¢-æ­ÝœI†D±•Øà™¼1>çôþù÷ªÌ…o©ã÷†ïÞÜ‹1áæDþi¡ï¯Å4Ö²_ˆ;çXH‰mø­àHò±AdØh–£§zO`væš Gã2L.D¾jf¼uô§µ+½·ô<Å—œêÞ4xffÖÖ#O$t¬ŽKYÑŽŽ&ëT[†M¤õÃlÖê‰Ë5Øsºê;óI¤‹>÷ýkoÏ_Í–æoUx«3ͰIèõÿÚVÈÎ^,$&“ŸÍÝ—IJÆ«F¯?Û«÷.ýœ—TÉ£¢}3eœs¬‘<æÚócÕù0}œ=5¯“í:~ª»ÿÿo·Äú«Å±N)ËU>_2„Êž´K‡c,C ¢¹ÛÓ¯.>60›âáÉQ\ë:_â‹„°!„„!XÜê´@NDXC…:V dÍcæ ÂVtzû®zìTx žIuK xîñ™\ºË®ÏzîÑžGe³9ÚcmÅåY;l®~Ü®lOP…qxc©CZäd =4ä6õÔ$µT‘ÔAË™¢s””BDu©©¤h±ÂG (œ²(eº#À’$È~¼,+X':ŒTDéè¤znK{ßòÎ}˜¢r?ˆ¸Âsü‹Õ¿TÔƒ£R%Lnš÷Fµ=øöÆü.Ù·DÊó§ñ1úéa×£ÕþÛsÎú†ÓA¸ôËbiAîä‘Q®~¼}ú§?õÏoÄ_å¡þO:I>Ä×g7¿ôÖÞãŒÆßÞFßÁŠG ,êIWM©TÇJ£ ’Ó®dC:λ\ÑùÖ—ƒç¼!ÿÂçפó;)é2[¨E‰ÔKî™gµí“h…[˜²¬´Ltס(G îjuµÐGÁJ×Kõ¥ÜLÖÚ”/íGÂã9Ÿºê»®¶ÃG»6oååšÌ奓|+]¢uÒî"ÃP"£0”vG?y¹}I›BÚ‡w^ÿ «õô,ËÆuèÁÛ¡xá\ ¨1‰×¾PÅzoîtfüþDýÙ}uÄpzô,®1¹ì–ÈÝå^É’Ùotñç—ú™Ä Ø2Ð3D6óWǗޫIwºÂqCȆVxOx*—åJ#ËB4RU³Îͽ¹]6Ó’P’~´b=)̬±/CW…Ms®1Í*F¦ˆ9Ö²VÐ1XhA-à­ÿHñÑtILYâ¥5%›5=Kåå5QT.7•ÉÁ‡]>?ÄÏ#:ý+ç5ñ?ŽñäZÖ¼ÁÆÖú’ Iíë¿ç¨>_~ÿ`¾|Þ»¢B0H¢E%Ö}ðLXêÅ.(*U«)Žì£lí˜Æ´j"±d`u*™±*¯>zþ½Ÿ-I M-wf@ʃv»jAŽ,Eðk¨Š H ­g£V#éj$G"!Ó0 (ê9RV €ŽŠjnaÆD±úÕ‚Ug¡V©N‚š¼mÁ|>ø1»æŠÓ5¶:T_óÈP¤¥_’§#uêh‡éÓx|"~³J¤Áˆs†?µ€LñC©OM% hssÉ™…t*p¶ÓaÎN´eÔ6û·/àG=~kÿ æ^äèÌÛÌÆyî'Ò߸ûà©­ ØÃ‘°Tk¸Þ†/¯á.×ORd ŠÚT ƒÈBdcÔÔ"Ê Ì"Ì e¼R·G<;«uÜü)W‚9H÷ÓqXmfÿ>¿þîÖÞMn5ÓÌp™»ä{ôÈT+‚êÒA…,èÝa½}îü4å úÇòÃaPí6kýÝÿöœþ«›<Ë-v¦?UîŸ_=` +‡àÕ®ú0aÄúÑôíŸ×免CŠÃ­*[S#6¶.í=Øzæ5±®|¨AëÉzïKáxhµ&½&?ÒØ2´ÖhßVŽšJ'”™×•|)sK‚Å¢P†È"ônêBXŒPÍtõÁ®ò=6£ZVQt2j¤ÏåmêߥÇOëL84F á ê5䱫1±EªÕ-ã69 ž‰0GwºPÎeTžW4Ã^àaÁvtÁaPô°SíM°p¢»Ö5*Ðû½I6,iµ¬¢ðK”ƃ£XqðËò,Dæ  ·ÞiÖƒKÓpé !‘Ýèc1²vTT• x¤ó ¢¿1“H—Š?QcOtËdmn‚É!»ëưo†éËoAhÌpMÜŠà™[èp›‹¤ÇDÑ^©+K»©S*†@TIqû!ÚÄ\† Oïw_pæ+ÑÂl°©èþ*Éw]þþ*¯*›#š¤ <ƒª¨‹Dˆ ¥vBf֢ĺLZ&ºhúŒqŸpjŠpà`+Z9ÿþgþ+¦Ç¶#cg“"ç¼y«E4DOºÀP ŒìÖØ®¤ˆÇÑœîcÝùº®r>#h`ƒÒ£š2ÅDC˜EÇQê´8§¾ãìTåXC?üœ5ÁïÏòlš‘Ggæ£ÒçÚ·*Eëi“g“‡~4ñ¨ZÑã^kŸ‰w¶=ºìycw Ç™º2±¡‚já¶œ0íŽ1^Â\Pgz¼:ÙH§šë†›6I8‹Gí–ÌЙÖ(„ç¤aõÜ[€%Cí 0}—s/»Ì–6!‰|QœNšžv²ÑO·ul¯óŠäà¾=öÎ=%äØÈì dFóYGCª ^ƒW]ç÷ rÞþìyÔ_Ë߆êšÖ q#¼³¬ øíÖ®£[õ‚ÙÅ‘—tf‚bD‰›ü’ÿøëë7;ï9Üš¿»~¤N)w^öËÞÔITûQ칯¯…N³«í3ÙÖ¶=|•ºuùãèú>û8»´:=¼ß«yïY‹‚’!råblÚ#¤?Ÿî?÷Ûç¿ã¿üwäkï3m¾_ÝŸí¯±ï˜¾Ã_HâœÐ¬»R"Z¸$E`&5ÒøÌü£øµ®·w Pö5êYGO]>óËYúšG‘Þ…ô!ï±Ôûó¥À¼˜VüBAWM8 G¥úÃg1žþÆn##ýÍ3}u:}Ø}Š×{ŽS­ù¡iŸþø}gL8u!ý öLå¹ë{(âZz1Š‚ç=&]{ä嵎O˜N;(¶ÇÀ]`A*Юeì‹ö÷9¬ •ò-ËX 40”Î)Fz¿èÔ˜`$¶z!ú—¿‘ߘî-.ø‚Pà ' ‚Ø…¡!F›Ja†t€`¡RÛJXÕBð!»7îõòÑ þÍÙÏ›Óí›2QÅUкcpg,øxëÐÄq©‰vôoÎþÒÍŽÖ^­ÆÝß0x@ ’^ÙnÁA@ÄB‚!¢ÁACôiÎJ ßn}í_ƒ×ÍÆ¯Ó¢n¹ÇñÝí$ú\®W\u÷[jèSÛóJÎýð¬(“šê…ÓÓž/¿ìLö[®ÔIä4ÚaFs—áÛÛ'‹³ofþžé{M™„ã[Ïj_„¼Õ"Rr¤¬3A£š‡;]“ê‰M±äõÑ ”ÑrÏþ¢ê+ÒåÄVë•\‡tV;­¬!Åm¬äúœ›òQלù]פҦÛS˜>~•×÷‚çÕsâýYvL’!M²nöÏÿA½³HâõÆ*ÚÀoÇÿcÞ¿çËéž_Çz{ˆAüÎùâ`ÿP¿†Ñ~Örs„óžkŠJ·ÙçTXãv}J¤ÜÈ!Î „iUóšò—¤²›˜ïƒ×ºZÛ_öÓK£´7ÖÓº÷ŠÔ$uwƒI'‹ðùü²!•!ÙÑØ(‡á@KNâ—šõÉËÙŠ*ÅU$`0¡ÝåFÈÀ² Pi¡Ù3! "ÊnmgozöQŠ Á"80G×Fƒ¦ÝBéœ$-`]4>®a]ö\U{$¨ Ý<ÔZ¤ÈcÖ’NÏØ„]ñYgL(¾R9 b]Ð7x.M>ÓdUZÛŒ"¶®oíÆ;&رé!$ÖqiPš‰ÂfªqËä52H©iÕ¾ÑF0ϲYM±BWfšŽeð+±¨qU†Èyƒ©<©25âQd©ïÍÙzî».>”1¨§ Y ±hÁ® ²1ŽÉâeáiˆ)Ö©ï­9uM±TT‘C¥ø(ÂŽ™ì"¦®g6¬Þ®'ê:yfße_Z†ŠW(~°iuøNUMÖÇ]äi|¦­¾Úväçwq(QÿÞýçFx>5z¬±ðµ÷Ì€r1εØnÙ7S£ÁZîTÎ>îu­•’â5ï÷UÁÆ󵮇2á!“ß9}òßÚó|ÿ\¬Oˆp:R“—ù½~~’º¨‹áxæHë*ÖæÄpäOâÏä™×wÏÆpÝ=ö”n#Ð[ãÕUuB¨JàÆ`›Ã·< ,¦ÞÚâYÀg·H©¼&ÜQÚ€¥ÐôQÄ @SëÖùu‚OR6pšê`z +·Z·ì16að×,±…hްx]¹‚‹²lP T¦zä&¢Ý>c榲íôÒ§¼ë½$®Œa­†eÊ׉뼯#õ^¨@[Å«S^©q«nC³` Î÷ÜŽ´yˆ}8å¨uˬ©yK’×r½W CޚƳ©ÇÕ6W|v™3Á|Hsö­{˜¸ûù÷»›ëáZzcÝúO2Ûq(ãºzåþx¿éA8¬HÅ*æ…Ío=n÷r˳Õä’_í¹Æºö„ b²ÑÛ„ù # éºÓŒ’f?÷Õ‚ ìáÝz¼uÜŸ«ÙÂ1ÊÀò³ä`ŽY ˆÝ 6!Ó8Xã|éÜ |“k~x<ò|ÝÉWZóÐ1KˆWž¥Ùú§éë|‰ókžÚY?ûÄ%<­ÌÝ;ØXšÖ|Ã÷‰ç¥U©gÿæ™Ü窋F˜WQôJ í—>VÐ4éÇT‹¯`å®V°p˜œ„(刎³ínèÃg7aQ,4·§êí•âÀ\Üp-ñ!*úí™(/5k£F9}êÏÓ›âRèc?ÙV½d–$0Ó’{ÈÃ$˜Km—ò¡;®µá–9˜Ãí°ùb—­Ñ%aqÚ¹g#˜ê[4pF z11G¢šˆ$ŽÀ+ŠS’ŽEQã:€órRsOÊÙPÎc¯ØÔë^r½\³žÉÜæ®¯è¤¯ €9wëhj«gÛqõº&­Ì‡íØ‘¹¿v81úFq­4Œ?\ëK}þUe¬¿XE#îƒÍÊGVՅǸҾ^Ó*uñÖ`‘ZÄmÁa¢bÏC¸+ÃÒïíóÎ÷ÇÿëõÜÔMú¾Èô£¯Ç-£é¨Ò4 rs½f¯ŽwÜžk®‰¬Bû¶Ñ«)Bqþ,šélÌQjßøöƒû2ôö™ñk0cª™(h€”Ä ,»5šéã¹0ØXÜ]¯'9ÂŽ;‘R Šòð±ã†Ã/ÞN! AB°¨œ@–åzê*Œ‹«[—+;Ò„ä* ÊëÐ5Óêôc WÈM(|.4Ò¸cÀ>ávóʬ—CwK½Ç­s'z2ÕHR%A­þªø:Ž™r§¯q¿Šî¤&D v,Áí7»â¼/™˜Ìï,¬WªBu»Ùp­SyÕV´f+¾–wtÑ©^±!.ý^Uy°Ì)mN®<åõ&ÇXñé‹¶8%ÐQ4å|rNÜj±M™T¨@õ¨Ÿ7Ô?û<ö¯l²,nHZ1JSQAãRRGçî£u¹Õ 4FùD€AV!85Ó½ fÚ;¹¬ätmò(zEß“¶KºÄŽI V aÜ4TDr‚÷Y¾%µ~2$•½Kw£¦±#ÜÖ'J×Ïv¬ÍaJÕ;ª š›-2MÔ¢x`âðP¼XªY«Ó½Ã‰Ð´Ð=Êb§âÀ×¥nÁJ®ì \Ãø•¹Ÿ Õ¿¸_ÃsÈ´¾Ü•Õ/ë“¿–¿üÕ‰¨QBàªØœ#ÃÎmËJMîÌÕõa cÒ¸i<ŸÍß «µÉ<Œ@ËIÚv ‰ t[lÎjýÖ/?¬?ª†y½.~ÝëN_W³.ZÄÎÊ߯Im:ììBc4’’" C6ºmcäôÈèŒÃ£‚,õàÅ#'Ð,¥jž©OÆ)"b‘/ñqÈwì›s#á­¦¼^wH«SbEûYn÷y¿Åsì)Íç_ž_²N6Ò™dð›Î¶Øå1ei¢òX@_ Yç 6þ»˜Ônkßæò¼î:Vëm4¼÷J)šÒ–¦¶±)¡½Ý·[}(ñΩÎ5ÏŽ¨,Ñ$¡3R¥‘ ÉÀ$š0€‘D(@@Má I‹ZŒH¡X J ŒÒ‚%¥)S _"ØO-•Y›åîÅ ¥I'jz§ßB—ß¶»ÚEé;؇â¼Û ÞÝ:S`ȃd`Âèf²!¾N”Ó¸p£: Dŵ/#7W Ä#=MÊ4E3kyjj¢UÀÁ‚åe哽ðH*¸ZÝ!¹IàçõRÞÄ•vʽ~Êu¸úƵä~«'µ³âò8ÿ,´'Ý{üÐôSs•,Ð ö…Law[Y–ª•ñªvþàR2N¾w"8Ÿ)€pãËßj}³Î%¹”\YŽ’º;á€(¨uciýÌä}?Þ/äðzËøX =lØü|¯Ì™UcžÌB>8þÕ<ÙþG¥Z%wR×—ú…5nœ9Þ®)\—®ûosøuý¦¾Îgƒq ®w‚ºÎgDl㬌 ˜Rœ\Ø¡klr›§€r§{¸ÿp8®­ß<ßßóaÐ W¯)öÇÅBµ`RúÈÈqcz¶^'Íà½NÖòCD–lèä¼Œá±ØcmA9]8.V˜3G„b*±Äà:[¼xU›Õ¦s J`RÃ5~è4a™:³h—×g|CQk¼ÌÇ\Žø úÛ/«È‰>¹ç|óS,5^'ÊP¦¥IçÕ8óp§¼À6Ù 1<6™Yyk—Ýržg}²q<Ð6,"§”æÔš&âùQ}NçђȘ4/»N½è,Lh:ãú$Wh¼gó ø íjt§£Æì,$ K¸M`È`&Dny³;×¾É%ä^rP[Z£” «@p°ÖÁªEœ’:+ú‘ ùâ¬êŒë¼rP-ªåd3O˜oàÌHtaâ¦.»Îî^óš!jà}ÑÞŃp7¼Øñy„n“„§Ûç¢'99f=Þ¹çwßà>áüüýÒ¿¯>#§b·Ý´fa =Œ颉êü2¿þ×ÛUÿŸ–ÿÛ›fÿ~Í{[Gù´<ŸøÙº8¿w×ox4³çYq+>¶‹Ò'«Ñ†tc¾¤_ϧ&lS¢6;³WZègŠ÷jÕœ'F€fº4S(¨H¡ÑËŒIÄ7Pë[i ºUï¶Âšë¡?÷{èYXFO â9†©÷=:ëÓ°q,¤s­uM‹ Þ¹Bn®SßÞXøÝûÞÎñÄÃÝ}åyœ1˜Å RC…õ¶@ÃV·g/;IIëZoŽÕ>4©ÌH$DàzûE‡Ž%ªÈÊ»ÛênFw»3mÛ¢k/eâŠ,· ߯Ïuºy.Ü™fE!&N z“ëÖ}‚nUW…pÙçàë]~ˆâÙidXP×fœW]ÙQˆìÜ&L“Wy}ܼ»ŸgñÉÃÃ;d“vdFPØ­#˜èSæW7=ë0NñrH<Ë<ã} ›†,÷cܺdòn™;~}±©°‚+º‚¾}Ém½ Un˜¨ýqqá…n¶[ºƒWWpêM×ûöÕ¢Á—|îõ ®­2"Àεꀕ|¿Èîê•Ú5ƺ„1Uù)¨ Ë5¿¢JGªÓ}VÖ>´à³ªÑpÔž:ȾÖDa·#çîÆïûèÜøÃÜK7Óº¨Bª¥‡6h,9ÔOE`>ñ†ÙÀ°È@‡H„¡hÄ¡·i§ªŸ—ÛËâ㙥øØ6ƒÖp¢HSª-£Pšyspá:\G` ÝþÄLÁA6}c¯-S”½ÏÀ{ø©ÑõtÊcLcÈÃ&Á!<Ĉ=Ò¸ë/Ã&ްÈ#ñ²‰ÚNIÉž\'™ê˧ÁÝĘ(šç;}®jt^~Åy €¾4ÄBxÚùëîÓ^NxBm"¬ê}ù_’ç½ü[±à%®¢5IPEë¨>+(jegÞ%Ë{N±…tËëÅVc9¬Œ(º¥" D@˜Òi=1TìHrTÂaÎkDûQÀÇá¼Z?è¹k<&‹‘Ón°:9ñ[5Ønð/îgƒ3üYÝòAº#í‰W7 * Ûöžä ÚÍÙ ÃФ;Ó{–·‹u‰¡ ½RúÅ8üËmâÑ-•3õr a*ÐË’ü[gYù¸œSìÁxÐÄu&*·ÐZŠˆ5Ò{ 'ló¡xMƒr; j`€èá5­wwÂI·êV§º½õ–¥6G5< ü¾ëó§žw§ë÷þ` [&š[QXj˜Ræ>¼Ø³€ K­,~3ý^§?ï§¢ çzy;x „jzt—m? c¦ÇŠÇŒÎßÎ÷ûfïuq¥WmH†+:@îÓÀ‚QpH†´þ‘Q¿/|ú}Ê” oÂTD2ÝŽ¤"¢.f°éM`3¶úÔ &%+A`CåA¸Óc벦¾Uù¨™LBc5ÌßyßÛ™gÈg$DðR¯wN ;ª<³©¿ ÙÕkŽ&¸ËûîÈ€8Óâ¦SôrÄõäyÁèÜ¢W2Ȭ V@a@<é ¨;h¾ÀÙXÞGt–SÛ 2#ÂÛðŽÌÞ‹Åx¼=g6$7ó>+:,¸ MïV©Í[R«ÆÓreÁbàâmCs)3Ä?iò7‚ÿd4ÐT ó—J Øa”ßí¾ Öp Ðò@‹‚ARVm†G0õ×sã§¥ØÆýéÙ°¿s ýÚ‡¿OÔJ¶ÚNþéÍÈîDÂÍkú(g¬&‹‘t=“¤7Bªr:e^·6Ô4­«Aë+‹Ptšô”<»<‰ž¡!-;Êh8ô÷§ …Ó2Ùx,±ÍLût6!µHKÜtWñ3ÚQü-)ûöbO<ëwëÙŒ]üYÎÁàhýØëçëö¡ŸT]¾¢Îrì ™„ïöRNŽXl1Ná2Ý&A‡k¨‘²¬ÓíÕÈÞÖ&ѵ»ØÅ*»3¥VXQ=½äkǼçV—¼ðø…sÁ”¤¢j8™Ë{q>²Ýé0¤‰¢>þ•š‹Îtg:œqÂ×¥»<ÍÉÔ7S¦óycj‡qµ µèÜ$Ò´«…P oÂð ÚûiÚY??Œ»R;ÊkøLäAwen'P´:Ö>·¥–ÆËíÙŒ¢4_cp¤ºz)[l;ûЍß?Ëcuß§#©šQ.¸¦ êJQ£/×Û…YGÜY÷¢ÿl6¾¼ÿ­–czT?Qo>ýúͲϔٶÑ.,Üuì1†«©±DFñ î€D¸inj.5…È&S'ž‹ *¥gšy€…÷^‹CU(ÛãŽ]ª’fq¥|š§û£Š6ãöeÍ^‡ÊN° ~&æVéÜh`S¼Ìl°³¢Ó^zš¡66;vÄä9cìˆ5ëÙ• s*WÐ8¤’°–48dFâˆä”†ZÑ‘ôø«V1ÜHO‘Ÿ8iä+…°î¬~ÏZ[=_0ÏHiëÀbߣR1*g`ˆ&Ç[E›M·Soõõ¨„}0dÏö¬‹ñ‚»æyÉý\øhª¢32ç¼áW¸_7ôuf–+ "³iÎnÎ1ç?È×;:ç3šé®¾Q ë’Õ‘#+°ƒÊpQBû}~cµpøJþ-¿”Ÿ?Þ[ùò"“ßèäÔz~ùŠnØ«”·ðKU¨PÚ¥L'²eRi¹ç|Þ¼^Y¯RßžË\¯Í=Â7z/<¥Îé´ó#Xy.µ2¾,Ä ªÞH¦³‹ölÊÕc© ‰eZ¤¬·Ïý¶ @Z ò0O©õlÒ5%_q—·¥f‡:OŸôíQ9Œˆ—ú ˆ‘#ÑÒhe_ž;UÕHzYlO¾ŒyOýEíËXÅ#¥/ÅMä#!ʼnÑ™»îÙt½<Àµ9bMLJ+ö寓¨¾J©©%dFh˜ª ÅêpKñXÕ;¨²gÚu/_§ó:ÕCh¸vjÚs&o›¹¼‰Hõü0Ú´ne}6½‚«ë‹FÔJÒGÛ›]cÓÈé³¹ÎNŸ¼ßg›n³ªéÄ"W^¥Ò>-*¹ƒ TªoÐiÕ8äªw`“4Yº6W£ ab@ PŒJ Qe¥f˜YN¹L{­¦ۥЊ ßaÇÙJµÅê…¿ø®d¢¦Ab5`–þ¢cD× ¥I·41¶ji[œÝ QOÆ&U£dg@yÌ­©ýÕŽ>•ÑxÙÌÅ Å !œÏfG¹]^«Ž1ŒqÃX2r„´ÄÝ䈪Ñ"àµhHR÷øKÇâªõuà¥áÕŸ¼~˜ë³y&—÷ÙܲñH6C ©PqˆšŠ‡Ò.Í›37<³bY3 Y$(1$ϾDJMQ‘[²ÔvëlàgÒ×<½ã~´Juõl4t žmgtWçR<žS(Ø>Ùµò–NÎSZW¿øU¹Üïvzi©\ E‘éÚß&:éÖ¡EÕT·êYD7à“úþ½NÚAú +}õîepÑôõN©5o|Ì®A µdëA¯{KÓ¾:÷÷mz+—Ko;´Ú‚Ýv[ÇzxCˆºÎ¤ßÂAõøÍõ5Íùõø†^Tᜢ‡ë’m=ßäûPÀFꨶ*Ç1¼°•¼Ízx1±jMÿTbp%Ñô+Ú‚YNmfUP×?7Ž?\?ïÜÚÓˆVñ§o°5ÖíþXä3ÍPšr-{ܳ]§åùùíŸwpNûEY4‘d EØÍÜ î{R$<û¥.^íÚhãÙ¬ED#*û! Ÿ©¾ðób=ÏÖäÛIžß}Ž']\§ ™vQT°¦éõ+V²2ô¤Q;ÌÃúä™îz{ð‚Y6CNFb×L°9¬‡0ͧNÜY’eì Ô³Þ×;­§éƒîØ{êy8Ù+óVh¨";î]o}OtÛÇÙ¸™¬öë†ïQðe/=a5–f’”ºÉÓ|Û‡f‚~ãrË–´'ÉÐXÍRO{sÖ±I}&Lr/~la¡{¬…e e¸ÆXYƒ$Xøj¤ßú™yÝë¯Ù ÄiΛoÙäyòÔŸcvþ¹µÄ{Ä1‚¯¬àÚ¬½‚š6÷˻ǷVaQ%etnÇÏž¶~õª¨¼¸Ûº¶²f|¡_ñÚƧ®Ö9Ï«¿T_çÇçë ²Ï¤sѨš‘zŸîû#Ð5šúœ9QUCÉ4{Ðði=B«­Ùð\y®™¡ùôGŸïÿ·û—¿?Äó¨îæ´ ôtlDmf~¼ó»ÿÙ´Ðn1[³üignG¨´ù^ÄŠ‚9Å.ò¥\ÇÐßœ€1…Q¨Á4ú@– 㜩÷uС??ì5öÏ%¬pS°¾Yc“›‘b@D4P E Q¨°¦rpâ–d8Ú„„2Õä%Þ驹[kéö p^Fƒà>€³çZó™äªµ¯}•c®Æˆ¸ÛºÓr:;@ˆ»-¶ßu&†H˜–ä K° CjG ¤ú)ýæQ¬Z «ms4Ž–(nC½ƒu¸ÒÞóõ§ö6§†qzùëÒŸ=‘7N“ûz.ݲ»’VoÇ#1BZʆu»L€Ø};_æF—9qúXf¹ôÚÊ–Ρâq­ý5ϸi¨ oé•é„m€ª ’µœ>`iô‰®öI;ßìÕ¬µ=½ð™òº_Ëb[P€q õ¨Ëö]óŽa8iÕ‡^‹B|üZ¡¿Š ] † 2ûíMŒ’"!#z`’ÂSBÙëS5îfU…\kŸKÕOÄcÙY³Æ•ây?Ç"‘ÿV˜ÿ|ÌV?3þ!6‡À)UžÊUMujÉéšÉ4TD(,ŒY0Uß5ÁÅ<–aÅ–mÙL%åáýÙÜ)W¨…Z gO‡j„%"(Ú¶ÑÈr‚ Í^¡ë<\“žjõë)£R.J K†”tµ°25¨tµóâ°‚™‰ 9h­9”æãúãËŸ³÷WÕÞ—UÔ?ØŒ¸%î?ôŠk_Ó@× ÷ï¿‹)äwncQ*8¶¦¸tiÚ&P¨W€gš–Ò ¥Á×n Öñ æ4¢vÍjã}nû;4B]ñtÉ®›çOn¯¾K5TÇ)Ó_¸Š…œÈÒ]ÎO†BÜÙ6`Þ¢LT Áô°%¡5»˜BóŒ%%HRmB1kRìa…hHfrqÖ‡DRŽ5v½•”ñèÞlµ’@ Q%Ä‚‰¢’ÑÃ6¾]é>,ÒŽv½_o[ Î0Ìfž÷µw:E>7ø`ò— HÓ275ft$þÄÏzŠåí;‹ÛDÚîï—°¨}Ù7oVµN5œÎsXJ9P0f»õSV®„°Zس5¸»±Ë°À 8a€´Jξ?©ù4äv]Ðü·þ‡mÊ2À6h Ô=‚RÚZLa§Ü%ˆ^ß÷©ž#µòXIúºZ»™j†Ac!·q”WÛ;EŽ ¼â±f¦®©|cǹéCŸñ\ÚÊì>“¤ „îö"¹qæxO§¯3ö³‰CjþÌáoîü@€‚‡kYB¤¼ûC’„e¹ ‚PL¤’ÍÉ1àˆNi™Ù?Ù¼]§ìS¥òq‚ßЫc¯Ïä šXýÔfO¸˜›R%²Gbl»E±“• cØQDy[°„GŸ8·â€Š¡ÃñÌ $ã…(üit'A(½Ìz–RŤ}Âè#§É=ç±´?º½Rcôo“ûIl¹;®´¢1ÒSw:yãøÐ¶‚é1µcO*n¼mwRàG¸7à[‰“V¹eÚÀYìu-Ž"Äf‰®ƒÙgSá åZ´ %ƒû6ϧû[Ñ«¿Whì_Äõ§ˆ335ÓÅbA !Ü“Ùñ<±Ï©½èqöÆ"oÌmµ°S‹ÙI ‡=M(/†4„Ñt4+l XJÑ•^¸¥«i9ìž9ü;ôÿ|é‰tÛùEã_CúŽ@rÉg;”ÉJ¶ —-}¥ewãèKççíÛ½pÞ g×…낺/•«Š»-®öcç±wšÝ0&6Ó—à+ãÑ¢4±àcÐÝ2¼ù:ƾp¤ÕZ³,ö‘ˆ¬íÐu 8IûÁm…³~×GÑóçT‘"ù K̇ÙÚÛ+Ÿãò¬eÚtŽ#‡yܼ£zT»© !ä1òa=1–*Ñ#òXVåìÜÜ1 y$]ɵÉ5oh7·¨^`§„{pºÂFå[' ;f'#‚XÑ ÀV2ÏØK”:bEg;ãcÞsÙØYëM_´|¢(atøéþãMÞå­Õvóû‚5/ea$,÷¢<ÄÁvÍâ¹.ßýY_~WV§Ä³çtàö¼¾œ'wõt6aB§0/ºTV6Њ1ï,âpÒ4Ï|ÍFÃJh ™­`}«/è%fÍÎuª‘vd˜ š’6YñRƒáf¦Ænâ:™ÒÌŠÕ¹=3­õ•¸mWÞ€¹„é×4¡¡Åe[OòÖéGwíêÇÕàÊW¢ö°×ÎI"IœERºÔÀ‹Ž‰åŒº¥˜¦y¤Á~×¹FyZBÍ>«ÑÑ‹‹ÊeËw`q"0+þ¶€½S£k=5‚qá˜ÏÏ ,MnCd33 jzao'¯Ù¯È0§.9ÒAãÜ›s×ÓÛ ñžÐ<×Úôã­zi>ÆëÐ62C5%àgÆõ‘G”÷þê·ÕÃzMuSMþêb ¼Â/WÕ°–Ï?•~îYgýª÷þ {슧ôü&Rõ¾ûk›õó‹µ/å?BP¥á…ÊG&åÌ—¯z$ßV‚³É?C]Î@½A›’ dŸÆ9š§÷rOŒÙD |,6åC4Ö{AÝÉå³-X¨„­–¸$ÑTç6Ÿ¦ðs•‘çR݉yTp”D4°št㙇ÂûzÎfuÍ£Ý`0Ó`ÅâXÙ,¡Š/}±¹P ª) oÂØûÞ^Óº9”67ê8qŒž!hh%aé Ö4Õ5cc=J˜]Ôâ„Z´ÂÓ(ÊÃ7 ßÜt–CSV©Ç¡º†šZ8…‹ž6˜¡r÷µ~: 4¨…k» ŠŽ.qÛìNê‡{p]§zÝy©Þt”Ô8Põ¦E©d\õñÕ±ø,Þ†…b<ÕDEWíÜ«#îœvÏÎz][®Í +¡{!ÝSôð Ñ>††ê¶}ȇÝä ,Ÿƒ´ÚM‹Å”¿’„ @¦´žšÉ¶%Ä)°Öܰ´ÑµÎµÛRôAZ; X%0¢*Ú€,‰‘µ[;ªÙ¹: RgôU1ÝΛ¶´kÛT‹Oâ0°¾`öxk˜öÈRš­&ÂØÞ»âsYtàN`ßÚj•Z¯Ÿ5ºé­g‚/f׬¿Îõ×¼¦½fík¾Ö-Ód«X=脆XA"j¨"*‰‚‹^Xeyœ÷ÿ¡Ï_ä>[4b ‘ n `£|Àä –D$$CŠ&áø6\ŽGz+ˆã´hºkt‹¼F{Â}Ö³‡{੉µ®úyì÷ªh-ũ۱Rh'¶ÆH Fˆ!¡$ÄÔ›½¶Ó¾Z #§Í}Æ•zcç&™ZJ¨5oC;ÔâÉW†õùv±¯Ÿ=íç“j·.1Ä8P±Pȶm'™A ð zì^5ÚãÆÓz×sŽÊ§žTÂòëîãÂVÓ Ë%{ÊòçáPJô‹ÆMZ®^±_î'eïI [0ÑXF@ñBƒ(!Êh\†\DDaÝÊ% b °ˆHX#–˜ò@–#:PÈGhÑ´º#.¤Ðóm_G‹äÜXÁU;ñåûëoïGÍêןÂ×Á‰©Þ† 1aø EÅ(¡i,Ä0DDð…¨4ò5`\ʶ*9Ú‰ *.¸èºXÄ3Y¡Ð`ۢǎ èN—¾žª›ýu’®è¶zw‘î!%¡ì0TºWsÏ;;õ,u¦ œ×W}Ýî<âj|þ+Ü»þ^»ej#M‰:•*% Ô¦¸N'yUxO¶cI%ÅžY–˜Sü¸Cˆ³P!(D;ô~èé¯þ½Û/ DÕJĹD¨ß¾´£w}Q4,…ÈÈŒaæp±BÎvúš’†=°ñfýÍ ê®9àþA×¹¼¯| »<z½ÛÚgkøæ¡ËQt8aøµÕõVæ§c×é _äþ¬]þ)­ÿ·;£tÛzrþ®=ï­ó‰\=:¸í\“q3^Þº>rõ¿?[ý¼8?±BM@%’UyTïZÊJ“É”§÷Çqísc]I±j„0b.¹N}–²£"^}ׯ¸9ÑÑuÂdÒèFKGUØ ©ê§^L*6ÔÕµYµSa'/ «²®†ÇòuøÑO>˱ؽF•MV05=sͫ׳S›X ,Jˆ¬âÃu#`×éš=?È&0ÜÄËí½é¾#?›îˆÄÉ¢)ÆŽaó³ßcÅ9Þ‡¬ +³}ßý ˆÛC¾½ß)»øôÒßß·wåĬÎÍ&½&ÒBÀèD¹ñ(gœ£À‹\zÂùî! nÓWþ-t G€T×””ÒdìòË õ‡ë㑟/éûùèq}ðÝûYöuûš×ÔiXõÒb@4†D ("áµ2u]çÌïãO詌Ê6¿÷·;+ä@Ó|×ïö\+vÁÉáu†6¡˜‡Ö?š~à‡›‰Ÿ[ÔýþÛæ¼ƒz2MYØ >Må«À<È é25lmjðR·ˆà85᪪;™ëßìsE~‘l_S\B`¦Ú0v; >Mo€)ß’w9¥¢8xMòØËÑNõƒû4«)×<MÅ3i­õ.Á-Š@¬?l'G‡Œr HÀ€ÖùNé—äâѼ—ùʽ ¸æÂu4óV’AJøNùNÓ¼X%>PugiB¨"ÀqÍ 'Zj)£²ÑlG |Ùoç>‡œ­S6¦9;±ŒÜkm¹H4»Úëå»rçèºMýºÛ…^ŠÏý¦1AÊ+p­ê UyV>«59=Sc4ºÂFïÍ{¹i·T>´€œHl$\Ú!ÚS‹¡ò„ò*pѳDkäÍÿIö‘fa¨T¬§ÂÍ”Ö7òb²ïó‡¼vÑ}´¿ó)~a,×3ÖôuvJ~ÀÄ„X!¦8 Ój9šã\€ZVçÍ!÷¯ßË÷ðAôd¸›0‹"ŒgðŠ€G„ OjSÇ<\ Å+úùªn ²5z¹»ÓÃèØýY*3;¹Ù||!u &†®Oy=…äAC¡r%TR æ”Eä!GÌXñÃùãªK¼O£¬ÿ+hÊÿÜ_õ¬<÷!â]×SóßHÏ¡êÿ¼±Tê¿âÎ_É|&EC2Qà™øøb=¶gõÁUqz?®¾þìèõ_™@_ÄÒ û}~|OøýÔ©F„íHó¸€Þ! P@C^‚Rnj)Æ{=/4Sáí^*_ç;Ó×úγ²;¥ˆD¦4ˆ¤»‹ µÂQŸ»‘WnTUfY*EƨҺMv­g]ýúþÁõq>ÃÛ]ÿú(ècÔ Hÿ³!Vü…ì:åû{^óŽ ÖBÊÕŒ[d<ó„”[]…"Þe—4ÜÇf²—–Ô2«:R¼íñy¼å@]*Ö)hÑb ‹™á»éªö~ÐÛôfúÕRu\±B rØ‚°µV·¢$Q¼ÚX¢ˆÚ0u–2@æ"^Te ‰Thµx~ÕÏ1LDuÛÖeÅÇ^†­”pê©@ JÁXªÁdNÉ9 q[]çëç÷|§†·86x¦€œ•W4iZªÏ>ÿ~ËÛ¢[#d­…^[·[úÖ£5«•6M ^]=…l¯?Õã#8<Ö‰ž("ò0­Tþu÷ÿEôŸFR/†›æE· êaw ih€ »d$y<“’é˜ä‹«ÓtÍi—_BY=ýMÉmP>a‘¿mß3oÿ±ý“ ñ·øûN í°=äiËí§êK“q¼ahÕZ¡}ëò=Êhyß„êTkØûŠôi¹¼ö™Å5wdõÚï^Ì„¨/¬@$RTÔñ› üP-¥l[)¥Ÿ?3æïÇðã„>Z b·xc®­î%µ‘‹T2æ ÓëqTc¹=Þdèú ¿¯ óÎgà5ú¤(ú‚J…×ÍäÇ@ÝêÛ˜žÍDt'w:h{¤L¡Õ™ÔЖ,ÀOG•Ü^R rjæ‡OGŸ—E3©´ÜÉÊÔÜû‡FÝÑuô…Œž—°Ll÷º]õxŸ5„Iä,l€$Jè ¤i ¦Í, ¤kÝ7rŒ4ø3Ø"N[ÔËzÖ¨s$îê~ƒÄb5Ú-´M¸P û¹l¨ÇNIpÓ€:@ÄAÐ 0 УY¨À€ýúFîÎûhÃ6•_œkýô~cÑ¿ðºtëØ‡ûxÇ_86Oõ!ÒCÃYd&"‘»°œìX@VvSã/Í ½Ä玮ïyV_Eª Œîö5ÞX –Yr‚€]ð/Lý“ó½ñ¯"¯tpò]ÈŸ#“ƒ±@EøEà?¹o¾Z|Éô¥×o^ªÏW´Þê^„¤ÚSºåp:ÿߊL6צªê7Ï몄7À3frËÓÁÔƒ ¦ý“íúÒ¶‘q9Xä“ýµw4x #=Î'ÙšGf;ÁÅv7€Cj×®ÜÖó›vð#ãrÄ…šF±&)îÀ£òì]Î8oDnÁ³ða—.䎟OQçæÛ( Nç,âR†xK:>Õd}ÁX$0̶áPXKŽÔ… áX?g}B‹9Í÷èkît· ¬œY »„ðë‘”¾dOˆ&úµŸæl”ä ±¿Ìk5AßµÖ5"¼Žò£:¬7=Î,«Û§ÍQ’‰=¿êåhuA|ñòXÓ}AßïSF þí·Ê:¢P€<òÅœqT®¢ã$¸€—Zyð<ÿrÖzæ×¢vA+ººzö¤ŽSõÕÏ2&·Çfk[†kGR^zJ3nb@‘qXR;]Ú®\%f‘5,5e…Ÿõ„íºø&’•!¤-xäÈyW®>~n,ÈêÁ‡•€'Ò4ªKPT§”©×ÀoáÕÍä- äòô¥u»öµÃKÏ‹fùê ]•«¤ü¦NMìôÝI^×âéi:ä,üü®ò‹6ù B1ª´ušd1Á’ ³Î¶$”¹’›©Q!±ÝÓD§X€NŇ>ok7¸m?†>%þàóÝVä#¥%' <çµ>¦Š.Ù­cå0.YZ•LÜX‡«€5źWé ){Œ/” :ÖRe›€]”©—„ç’†öÀÌ:T‡£9{}o…¸-¡kU{>á ¬e.na>£²æ>ÛU:YD{ô¤:µ%p`ÝÞÌm9 H±‘åâŒÁÃ)Q &´"ÅËRõ˜’í¬Î/†4±I÷œwF5YÂÜmÌÃk®Òl­7¹ëó‡äO}Ù» Ê.®ÎIñI­ûËÅ£ëUŒ9…5b`—ºöl G*]'5‹Ji«â0ñSÝÝv0½§›Õ`[âLÄ*βǦ›«_E–)É~€F ïu,#ZHòcˆ[cÚ@ƒ°1Ï€€-Äc‡v(¥ÊØ„Kv:Ø sûÖë¥&S}Ïùøóç/þé‚JÝUÞT—"ó«éWÕÚ²àŽ'פ‰ª¦ìRmN/¨ £xèÚºŽëøì{š8»µ½ÂM7É£8óòúŒj ˜©Á•¬cÊT¼ •Q¶uùCî"»D‹K1ƒ,€Ò°ÖÌÕÓÌÜ'cñƒ¦Aìóá,ëy!Q ØN7÷bd ÙÐnh£Zv ¾IåfÇ,Òœå¥SüuðK«±»"®é^f§«‚~zñæåû›ómÒN‘ÎCBª(ªHÐ2Q*úÔtÕ€±È'íö—šm5›ôÉ~]ŸùÜÏó/åõ×òZ‰ŽçUðgOó5·Š­q ­,™lÌøºÆL‹–ÌuØG¬üN&0#ûºMž­2Ý©ïÌÔe캯²ç|-$5ž6- -]œ’™XŠV d»Xª•8H+ÜJ‰$v1B ´€B(( )qÑœ±&Ð4ÚåååÅ‹ÝÓ¥ûk¦R®%­fgŒR§À*ß®šU§?À —¤‘<~žó@<ȺæC[ÞL*#zŽÔH‡˜ˆŸJUvQ‚üäHÀWä6òˆ’!x!>X¥‹DUDz YkÀ­@çàÒ¯{ý±Oò .…ŠÙñC_ÔÔTC½‰—(ƒNéG GIþKFWÔn|÷ÙS­Y—] SÖGÄYÚNa4ôq•¼"O’Ü«¨D° ¥rþ™â–þå©R(=©«6Um„¥Wãª60øbjUÅ€'0ªrÔú–¡’F¯úG”°ÝånÑ~ÿ¾´oxJ*¸J0Ä™|¶–thGy銓ºbW) HQÁ£ (%–ð€ÑJÖkê}êãB̈Ÿùí˜(Nÿ+Ï¥¾²®ÒR‘¢È+ÈmÂÐ4ã ÜNw'=·ñôÉǹeq~¹šQíÃzÜÁá׋ì›—HjÔvQùésC ŽÊt6ÏÑ™±$”c³8Ÿ/‰¥´4kEm^ ½ª½åÕ¼y͆ÛÓ.„…‚g 䱜æÙÔ©K Ó&ûOê¹×p50ŠÆ!dX˜Åýè~#k|ÀÞ_äbþTj`U¼àÚXÏ[q¹S •+鯋ŸCƒŠª¥öîBÖ¨ô`SvÝ•0¥Y”^ʃø)\oÞ6{m5ØêmÜô.+8qv½ü‹ú‘D-gѨy.?¯¦cjM ®'{Ù„^Ç*˜cÝx˜XæÇǦ P?An´›st†:›┞WMòVTT¢7,¯û·8§Àà&YÃr«­1‹UH t M:$¡>é¦ÖÏùVÏ]ٟŧT6ý¢'«7ÃISãöœhɈÊñ{8 ‡åóH>Áµ÷ .Æó¼Ø‹ïiçÔ> {¯û;xE>gº=:¹y/ÏÓ{uê7ÿ<'¾“’2€Açñçu³}Ù™ýýăä,(¹A­PÓî{¹_ƒíÑ}t4ÝùÇ –PÞ™:•(¥ÞáºêÐMS˜æ<±;†´ª´yyW6?:;ô¯ãÞc– í‚C a*²3œÒ^^²¯-;±Ë'Žë2Á?®ûÎaçõ—Ît›ôeÑLrhM 8æKS¸6‚GâºÎKY°¿ï÷â{dÈϬ6e¯¹Î;J†¨ã¼`V¬AÜb^ÈOà‡‰ï:Æ2fÌà÷C»¢.<ç’vwM@Ü.ïLö¨e7ž¥±õ²Çûô<Í&ÔR^0Tf‚b%7V›âšîØ÷ŽîJf"â`P O¢8àH µHÉÂõºç²:Ž«ÂWXxìѦk\¼Ùl{Óý{ÿñþ^Ç{ý×w‹g?/ÁN1¼ÏØhÁ÷8·@÷ñDv±ç®x"ø¯Æ€®Pf#D¤Ê06€‚™š*ÀI_ãÌ_{öf?þ+üÂë“<ÀÜsag™„~0¥8½JÚÕ!Û¶5E ™=rµ¬l›ÊúoÞßSoÊ!eÛ±V®¾Çˆk^× +¢ Vžßn·Yjœ\!:Ñaž˜µ __õ†s]jƒ "únK eÒ3ÇÁ\u;´3òG˜ãe2c%sÄsrÖüptãNîöêÖšBÿé¾þsëÞïÑþ ^UšÖõ_õ_ÌÓýŸ+æ?o濸̽ž£s5ƒ–+D~é jâììãFzÌÿ`Üÿ ®ÿXCÿqè»vU“Væ—2›zý²Ämúdº-U’`QÔÀ04tÌe±¢¹„„“Ïü­ÌAø©êö»ëøôò´³ú ˜ŒÈ6ˆ °I97Ša»á¯l Y‘i*HWõ/IÃ7¯Ôßåú¿¼`¾/ûÏ{ý}~¯Ð8 ­¿Èò—¡ÿõà_Ä@jÈ2L$O»Ú+C¯Ø1Ž8Óhm'#­Â æƒ¹œ«îš×ÕÇsUBBÁ5ÊŒ©ƒ`AöÅZj÷©û÷â#WÙ„·£l…ILñMüZϯ™?>_Ýz:ºh·Ê¼Ž²Ýòð]ËéÏçA,n*Bb)P„I‹O,Þ7u;³Îë°&G(ž'ëeg­bö‰óýþW§,Á¡Pb‘<À'ù&ý¹´”Ã0û;¸qnäŒhèFüü3 ^”þj­LÓ¦1©¨˜´ê`Ï ïðâ §y›êÏqĽYäJU¿©1傲̪cöÈ$¾î>¼¨‘IíÅË«ó¦Ì"ÈáAÊLʆ'@Ð,Ø bAw“!‚“ÛO¹öælôYŠý:1·uz4 Ñúa‡ ô•oO9ÝËîÒ|¯;bök[[r·÷ãA4cïÝ8–ÿ€’i”cBK§K6<Ó*³¹“è‚] ½)¶%3Þg±GÃTÁEJ' ÀÑI{¨…ŒÐ:*çÐÃå™êõ÷>ÿ­Écmíp©ÄôŠÑÆLsGR ‘°¢XbšW(òñrŸ˜œï3Zxþ‰¦¿—˜ñ•3þì§¥×á;7 «b1¼$6úÁù22N¥_!Á€a™iŒy°ÁðmPÐRo‹7&¸9–6ŽE<Âï;?¬1z]ÌÊÌÚú‡„†µ:_÷µá žáÙ‡v°ÉÚ´Ø8œiXcªN—FÍ¢)U¥I÷À®Ø[ãºIqK!Ãå;_©G(ª•Aþ>Þ;ÍÃBáÍ^ÕZ¢6÷¸<¦¢AþÊÔŽ›h²!) °<Òª5 S' 0˜Êÿ·%úG¿»àì…@h{Ð÷çxiãú³Ûòlí¾Ô¯à¬žÇàÃ]Ê€ ƒ‚´’å©]ÒKÐCÝ.‚H¶ÕÅk›WäXÔžüŒHxbØH ”dwâ[­´b\ü0à—a¿D6M}æ{D’ûýP³˜;3”í?Ý ïT~‡k÷¯s gãƒI¹|+ó]ŸŠéS¼†+JW&ŠH'é„ ÈN@ÏžÌ%í—¸kj‹Û¹|ƒ$Ó ëéyõðŠr¸ùYbÿ±|0´®énkô¥Ò‹$/J!Àeö])…VÐRûÉ1/"7/-êL.wºèâ¡ß_µ+‡­…'s¸;45Kúºjª#bŒ¶o³†Eâ$‘͈wåå+ “=ÓÌ” ¬\Áï±Ù*‹†Ò³¢ß½÷¶ýd¿c <ŒAµmï øL#åŽÅeñØ»zƒ|µñÖÎ/Ì…’Ü>—ýÆ è¯vªÅ–bd憔:Ž»­gUpv”*‡Ì5¦‘&B;:],TÌérλ¾¶âÏsxŽé~¤°ëãÃóó›Z“û9?€YSàÙ´ÄèIHZÖìtË-Ï9pÂJ¬RÎŽa©ô¤Ÿªyà½SÖ›®¯åZõzžýdí«*ÈhvÍ”T‰#òd½Û-‹;u‘m<»¦¾õÒ#õ.+‰AïĸåZ†\æ“ofLuVâ§—îòòÚZ‰’žäJ’ˆH ç¼ !!˜Œã4gb (Ÿ¹r»†uH *kbÊ÷Xö­)ÿQógž4¦úüª| Ó W&»âO|,$­ê£et‚1†"™íƒàí¼Æ~Ñ%µhˆ3bÏôΣ¥í¬-k5N¹ËŽVÑ‹ ×ÜÇ󢡽¾„¹íZ)¹ÜŽ"UÛ&3¿=¥•93ZöTÁRb‡*…9¯µ®hCn/ÀÜÍqÙ=œ:W•^ñ0UjT@ð8 ¢ëE)Òi)gî.½† èFåõHˆ…´ª(£´Âºm€`c8{ªÐ ¥ƒf¯sµ¯­×{YçLYWU‰Òϼ³SpýÑôüߌtÒ?÷™tdFA}œêl¡E4¬‚ÆÎ8մ⃠d´j³p "w€fAK"F¨´Ÿýü¸3ýå½’ã R•½å¥\$<:úÖè—3Ž”éåõkwžÄ 5ô²’תpußîSž½žC3lÓÓ®õ¼s”>öZžÇõGnn£ J>“'»—›)]B•“å(&)!"Î2º¦•i’Òˆj‘V-ëÕ´NI{•nDõ­a0oX¥ùªb©¶À —b˜®æ·ÕzPÌVY[C¨”¼ ,(: DHc¶·Ñ¦¬WG_MMoõ*Ù’Ù.hL%á>ñÚÕŒfo?³½vÒ*û晞²"Qªd,H0˜ ‰‰R‚#AC‚4*’œÖu‘‰›qª:›Þå³û…y•Fç¿ö/ä¥3ûa©t–ìlûþ¾×NüÄjÚëêT5$c+÷YD’møŠÖœ˜xwÒW™Ë  ¼š1/à«Ð{†=wïõEvï\wìH'IDÂGY¢ Wظ-ˆiƒbèÀŠd ÇD£hYX"va5ñ‚·4BFAD° dÓQ¹°¬`ºÆNŒ@ @ã0~ŽN«èI‡º”‹ÔLàíæXzUìmcƒ Ü‚IÛ¨„›«îí^™ö8Û¾îpC8›@ˆ*Þn0“O?=qQ®3(Å|‘,pEß¶Å׃‚€o–_‰=:QJn‚ggF²s¤àTG«nC½ì5iö7nÆ02Ü–>b‹Î´”ÄifUlQ£`Fcƒ·›0´©Œ²¸Ö's_eïÎû¦ý%{î• !…J^¹1䓬Y÷ÏÚUTØØ»xk(ý* ^ äÚÔ+JÌ¥3R„’" ;Š+šàLúJúÇò_ÿgäÿ 3ekÈz¹²i¹µyá¼}¨!¬ûVÔî%V­ûb‰G=ƒÁƒ ªc[Ýš Ãz1¢?Éñä9õ¦Áëë*?‚;0”ˆlìfFjñûŽôóÀ?:0bÑçÓÓ‘{ÛLÏž¶%iø:φ|™Îáx´îyÞNžU¶ß£é!ÎFÎ4ÅËM¸¬EÁ°Ý z“³Ò Ü"%;Œ ,ã—<^ñÛAý3»ù²ô“Ù@"¶ù*-·#CAÃ4\é|<ÃÐ!í]YØâ,eÛ4í$&ç.\Lö5KÆþ!&¹’Øo¥U;}fI“5Á ÖdêÓ^Ú9ö–ͱ·¬;UiЩZjR%ßwy>U\~¹úÂqÆ¿r_×LU¦sÎcß?>"l‘—ø|šiœáÑ^6HžÚÌNYdž=“:aá$r(ô‰Í%™Î5Õߘf”Z4ÆŽ-¼HÚXîv33 “N·Op®ü=/¿6üÎÐjžÇÓ5ç& ~¶îjÜÆÑ(]<Âóëìñ>*ø4› KÀ³ÑY™‡sœ‘fjåw3˶Qx1j*ÂtÔGаxùÄë¿þs¾ž2÷%û‹ð|ËÀ\m†÷[óúezòŽcxpÑ]&QF'ÎwÚfí*Ë ]çy/º¾“ÙûýǰÏ­e%fï§·o|«°Š´Õ¡ªm›C˜ð ,X 2¢,‡X$pÍ((³‡Ê!¢Ð]I\Mö$|ŠJÕ&qdü÷ÓÏ“ù®ú‚__ø|Þ/@²¬Ó´HÑE ‡<äºRýMvx„|/glJ@QQ…Â*…hÊâÜp¤Ù^oÝ’A¿jÆæ¹â¿¤œxŽœ§É½’Ò9jQÅ@èɨ¢F- $3M: #ßÙ}^X0(›"Ájb¤¨T¶ÒrRk£""ÐL‡>¼}¡ $ ™w‡Ž±DQ5Hã÷Cßqp“Ž6iCB¬Îž~/ÏOD¿ ˆd À!Ô©XÕË}h6™Œn[wôsÏY«~KØ›!LÅíG[éGûÖõ_CÈ‚öP‡Ñ#õ»˜Ñ --­¹Ç~ã@7™W-P^VþZpkiÙ²½u’Ÿ©½“ÎôüPtB[FÈAáx¡ˆ´ ¢œ¸FéApí¯^½Päu¼þ¤õ“ænhB&8BHÁ€ïvÕ\é”[­}yW§ Q‰ÛC2ºº1bH=Z}R¯ZÿÜ|>ûuÖû*ÉïqþS#ðæ/E~Kû©1*éHãüV\–Ø—þ#.ê&5ÕÔfØf傘ÂrµwbÏR7$¥ÄšWŒ±CìfÞIc¥â»cf^'¥˜AA“q3´¨Ë‰KÂ-ª†„j¬ ö%ZÁa$¢ò¬Wª{g¢«.™§0}¹¦æv×Jè™@â¨ìÅiõArß¼Ðm…Üç18ºûÙ&׉ß* v)D1THÐ\b7Բؚ×.Tï[Æ…ªœpR†YHA/‰>§€–dÂ*ÈIµ¥n.s¹¥4q¤¼Iß`-ÃϸÛàö>´n¹–ô)pîw¸úáýh2 û‘À•lÙ° m͵²èÕ¾ªï¦|'9t9~žMe{( Ù7*Úùpý4¤—-Û£Ìþ»Ü—ïq²×y‚uÞG§»¡µ5«ûm3ú¡-)ÔØŽÒŽIØ1z&5"#’«j‹RGd˜Õ_ÐÎp¢ ~ÑiX}*gñ+¡þx*—Oö#iCwT+ûæÒ0¶XË×ÃÙ¾’Óßתïg<ŸÄ>xöèCþ©BPó| ÀûpО¼‹€\œ8å_NnÂb…6Œk…=;¬èÔ7~·ˆŽ·óóOn8¸ ´]Ýý¼ˆ “¢9à2†•ï­íÅ #š#gTœÐ0Tª¤O² §Ç&:̓M~CîD²UH9ìÖæeõòÝ›wfŸ›.ÙZË}X~«öè'ƒá¨<»rµ®$ÍE«3´Ë@¸–}»–­ùmlÞ}ð¬Y]|$NõmòJ$E™, #9b{ò‹ ËŠh@"0ÇúåíkãÓç·îòžÐиà¨_ø™îTAØž¸ô%‰s7|÷¥í×Ë~O@X”(¸¢×NÒ(n©g Fl€j â¢6jªÑ},±{¹›8Ò`¤Lã°×#£Ãc+-£í?má¶´¿°ôY8Kÿ×¼üŸ#¹UáÖ ×Âm£õŠ È‘7uæNÊ>Ô-¤>E§„¥þJÏS‡WcÙ#ЬÀŽæ6ûÙ훥)ø+ ³DMAà…ƒ%CûšŽÙÈÔóŸÇtÄjåqF7“Ø`»²±ƒw»¿R‡¬ñ\˜UßR½ËŒ³à‡¤vÇå‹'DyÖKJãÀÆâsG·Þdb0cH4b—.¿X«E³†O] ‘)¨q.Eуu»gd~æ)¾íÒðÙÔ²r²ª5 zÄ ÇG÷—‘þKÇwdnP;”Ñý“$›?–þKD‹c™¶×€,šöºÂpjb(Ì(@Çè² ’U·_ Y %Ò"-’²¸Z5"»˜ÎnÕ~W܆¹ñÛýö‘ð¢¨!ð£¨Ý¤FY.Œ BS D@«°¹k„NaŽgQüàë–ƒZâ8ƒ×|‚_Þ\<£÷£øªj¡S£Nº@`ÚE¦¼jVÌn­é=É »œ<˜Ø¯4¤QJƒ0½W šÇ=ï—€ù¼ý#pa³i=ϸ–; 6uä–¨ö·†ØÅ.–|7uå4c}›|A2È>X²Ž¯ík}ãü¾ÌPϳÇ+™ƒÎסÏÐQ?¸/Ÿ£zr²ã$αx{ÝÛˆ`)´ƒA11MÅÖ[Ý»Àj ^"Ý=Á`€@…2²!‚ Ìêywí°ˆATF¨W{çšåê|s&P{.fI_%L*(Ex˜ ®iCЫɅàFÓA0¸£úFí³\­Û׆â\"8áT’S¬«]³&LÂ0жæÈ;FÖ‘ž_i¯+S…€Ì*FÍW—›®vH‡VØŠ3ÙH╤.XíYãY¼H¯·_¼YÛ«bnW@^6ò­n%WùzªwªÒKõm;êèe|tºe3ÀøâÍêóWìr-Ex\âLœIa­Iu—kT§ „f-yάÀB^ƒ2s茘׵Z17£@‚ô‚ÀSè.¼s¨`X«6R%šŠWÎãt™zñs¹ã{Öý´Ò)Rߣk¾ø„(½ÆµuáOëØØ¨ärŒb·öw$ó:²z‡ue¸ú>Ý£dÕQbêØ¹ð㿲ýr=Éž±í¾˜¢v5?2˜7 f,ˆW ‹ ˜0¼u~‰Ç¡†Åcd¦×§x©ŒÝ™XϽƒk€®sýxºµG=*›çÌSwêM{1)ò¨[Lã½ëh¢W-H•n)ehEB6aHžC ÄfÜ.¾Â¬Üèæ/çõ©¯èýÝ"ÕM¯9£ö÷þ8³?þXüÆäšÿ’‰³ƒ\ûi±ç~rkHeÇ—ñùÖ›û噃-༅ÎñË·Æ«×ÏðÌê¥ú®S4VÏêÚï!…³ŸŒ·yq]¥V¼c—æ“ýZÔyM;[¯ ‘a R âÉÒêWåêyÆ.¬ÎÕ%a_ùpÉÛšÜÎGn“ÒÒP²­ˆ‡´" SlÊ¢V¯hã ^©QÔg”„¶)é&q¤"Øåre-y,Ñ«¢$ßÑa›8IÅ7Ø1Wi+W•G §¦2]â* Ht îõ½^ƒ¯>}ò¥Qõ;'&EVD#Zµy»W¿lçU9©D¦øàK†j+Oq^¼3ˆ¨xÿjZÎ¶Šµ+I2¬2T]­ï¹Øïµ|§ŒÌ 3"QŸRA ðéÉØg1@€ †RRDd‚R2ÂÞ€= †‘­”@ P),,AÒ„gøÊgéT†§hR*Ð,……`™fŠ㇨œ””`Ú£Ák©È¹pˆäÃ@H…<KE .=óAz%ùå;¯ûd¿—¬œÀÇHÌš4,p¯„-ü¢¹ ¾a,R%–š`Vú8¦6¾ñâN‰Ÿ±Š¿mDÃVõ£qdÎN¯ä'æ’YÂ_$Þ¬Þ…:*s:Z+ó=×/: •RS‘Uµí?Çts=x2"YÏ™™XO`ŽÍõÅòÂU^Ë ´Ç•SA†;šñΞ¯éCmK]’ ÔB%¡_Ë*©ÜÉ5BÅ‘iF¹Ã5>AF&ck®ù¨]-¢ýY“ùæ?æ,c* ñ<õͲþW~ÖœS^PqU籎žçRÞþß±¿·µ'”9óÝãÁQÄçqÐOeÿ“,ÿ@ŸZÉGª`)Ä)؈wËg|ö-ß=äQÌ‹…®IÝ1â×Uy…qkcü×>‚ÑÃl•9žÕ8¦mÞ†%³Œ}#7ˆsЍdÓ/jKÊ  ±0™äÂNñüDs¾•è,éyV뉿S«q˜»Ïµ¯ûȈ3ûVTë$‘Žô,ÚE Ó²°C«X@ÉíŸÓ7~VqÄKγò´Ȓ:WóªéÒÒŽt$øÉáh=R ÖÇfg0òâäêä%Gï“ÚIZ£YFÏ=S}pü0½µŽ :gEÞ7ï²x‰$k¡Žž‡÷ð›ó{âÞÝÐú¹¡7’&¾">–bQcE§(Be‘³UhÂò5÷ẖVŽ‚+cr³ ¤Çšê{êçÚ&6§ÅC7_îŽÒ qXä ¸2;ÃFdniV¾òsê’ôÝ÷]±·Ê}ã1ô{cƒšÇBæDX3‹*Ôá)¦ÁõQsו2Ö÷ÓÎ9Õ {?¼ª%Í„³­¸ÙB\jT¶Uôiæ‡WuoÁÿù鼦ه]Ø_3‰U—3£'®ë@UŠ’oÈé"O}ÚÍâj’u2û<á=̳SŸøÕ×·?”ø±<)º®>ùú/x~m;üÛûaêœE5F}ÜýÈÖòë"V-n‡èbߢÀw|ü4|,p0"Õ®ì]I½ÍÎùªýÊ«¶‚ŽoÆòƒžŸ®Žø5#¹œ‹pí=ׄpÅÊÑsü„+Âso¥©“‚;ŪQGè˜Ï´–éþ[苉ì–™º¸ÏÈ~Æxè˜sžg½=–9N´}<ˆtßo›Ùƽõ¼w¾«Z?§7cÍ¤ÚÆC€nMç‚»úVÂ.±ª{õ¾§ p 4Æ\…ʆ}®æ‘FÜ}ÌD4ç4Ц5ðþõ½|Àrø¤Fg“{ÿXy™kÓè¶#‰8Ã@È ?D„ör“Ò~w!Ö’f Èy¶Éº…v˜+ÁæÙElœÄ>ç6iÄþì"›Þ½íÏ;®¯z}ÞÅã*J¦^#÷ýs§mè¾A‚F<¢s›á½«x 9é—žßϽ¸ñ„Ä Qã*"oÁèÓÉ0™v£|G¢5(±ÑSl®»;’’ÅÀ1Ðî;çÙKîÄ¡%T ˰Úܵsp¯pÊ€†¦]ö ‘‰N¥±—¯÷ÕõÚõ íl@Û¥%íË•A˜…QW­ðuP] • E0@A®ádK8(8* [;Ä{°n‘’÷½#ÜË~æ%¦ù¸à äKÛNû°îðR'©Ø²åÀÊŒ‰`¤¨$f@bl¦‹Qÿ±VeLªe¸¼4ƒŸSKPµHË4‡L’™ÒÖ¬îv÷çhOc)Û( ÐÀ+ÃW½ø·úrﻊwÿÚg?.ü¶¬í4^ ŠiT§˜JúLímð·È¡_öðXIÞLÞxië,Þ‡úvéŸÁäác\[aÀu „¸vÁSàOÛ]$­+µÒ ï»­ þ&9Tއ =âi¤›ž!U‹=‘S\k›g½dµ_zÈF G'qÂl°Tc=“È/¦1g<ÒÆ‹žÃî‰,³‰ tíˆÉB;fâ‹ht%©páˆ¶ŽÆÍ{$ä)¿|‡³]Ÿ¦³ƒž™;™uþøºVçÏ?l#Ñ…¿N>™·¶ž=†d°F5¦èOz5ãOéÅ­ÏÏç‚Çz 4W~'§—ÁŽ£ÅF½¯¿ž?\—[Ü;ñœÖ¯A_xíí©æ#D'§WµDÖÒn/Õ>iò>Éýä¿n†Qàíw”H®@süŒj•Ïqš©… 3ÒÍýÖšê=$ú–NÃõF(ÁØ~¬…Aoï1>ç¿Í}o}óP'±‚N±¯8lˆ×moõù¿Š|ûsÈŒ–_¯Ä'Kï廦7;:B!p$¶þ}†>^>ÀÖ»ýÈsïûoSñcm{ø¸E¯Htða$ºÎ! Dïy€nkž³G)rÇåÄ!&±½*ì*׳oa&j£ôìè>,f5o“]73|­¬,›ü–jû~ñ5äK!Yx| 1Š¢EK˜t—/â(²Kñ™ÖqHÜd4{ƒ¾ Œ£äP±jùŠÞ :níw™k[]F7úUžs~ªî0ùõKã_Q"ÊF¿](ëá]ØõñœÉZdÜžf¶P„±´ °ev\Ñì6/vcl-‚oKQý­ÑÀ…±ÎÝñV7ÖK¬€Ó- XM>‡ƒÇfîŽn ­–]u†il)X~Ôqò]"ŠôƒâŒ{uhÑåFȼ.þcHu‡ãLìFÜÞÆÖ‰vÀ‡g >—ËÒjLA]ÕRåíOoý¶WÎ^8îø¼˜SâÉ Çùë›Ó† ÞA ÈJ°Ha­ò ®*s¦[Ý/ [ ^á1E"€ à†€¸ †ˆ†&5É¥Ã4rf¨ìõC“W'qbº ý(f,Ð =½ÔäZª,ÒìG‡`ŠÈmÜ·ûs¾4$³KñðR2lzH1c8wK»†:äiøM`ŽCÑ¡*Mit“qLóì×Éñ¹ðN¡ wà–j°KˆU]áÞhdOÒyKÑnré¦ÈJ7v$¬Ònù­Lœû¸–Œ'W°Ø ‡S\ (˜Ñ¤‹tÅ­ aVn ^j6ì¡áˆâ¤%Ÿ9è¡BW~P¨Ø }rÊl+šƒ…5é¸÷n±±tt¬ ér ˆCwGZp¹[\ɱӄôõRi·ø¹­ïÁ„ñwH>˜?ûòª7y±·=8ìï·ÑGµv½°6Ã^üäµÕ¤ZÓ•²rC½YK¨­æš{ ”5˜‚0–7‡`­¸×:Þ¢ˆüMlÑ Ó–bƒa„xÕØ]€•VËÜ÷«p]s9-„Ñð‚ñ™žwu¸*HÅPPânÖp-`³P4`‘Pa|ÄÐTU‰ –x'ž’zY×êÓ2i2 ZW†4ã`+¶öj{+OPÇ4R˜=$*[åeWZb™ ‰(˜V4Ö4$ÞLîA wùG5-".©`%~ß ×ä-U=ër² §©á£ãµv÷A³½Æ9˜[uÔÄ¡¬&òmÏa¥$ü¦ÓÒa/˜eWe­ï/“ 2+—9$¬Ó¥nK¶•7 #7¢ObìeêyYßT¦kL5 IÊÖÅú³Ä ®ÜÌÐÓŠòã<±¥8é`̆tº½÷'ê¢ß™\&áÆz2«Â²qXLësté" ð'þñÞêܹ±¹,­eËTX7nµ?ÜÇ~Ï„ûKýc×ÎòÅjV:éf®]àä¯Á¼?þÎyÖŠ-ÿ„ëx”d‹^ê:!¡§â!`÷¼Ä]ˆ]lžø«À µ*N©Mä,Ao‚‚µÈVÒL&m4€Ä´0‰2w˜¥ |ÚÔ¦âÒID‹/èb¤&5 µOÌvT`:`Ê‚[@•Ѐ§XÓÌeüP[|ÿW÷¿øý×7xŠ¿Ö×ÿÅ j}´l¿õùþíÿÂÇ/¾ßì>}Ë]ׇ‡òxv^t¯¼ÝVË`è£N2£eõyÝþl;ºÇ妇㠮§ßëàè°vvÄëúγ*¸z) >‘fߕ޵âA):+=EŒÝˆZ1@ˆxxÆ›á…uù^jº¥i‰«ƒ”hG_ŸßÞ]}–fU3!h9‘ŒÇ¸ÑRò—ò!X¢ì=r¶T+;Ö6 ¾4Š›!H+ã*ÃŽ½OpúÔ”/É“Ð"¦û(7C’‹ÔÔ"U3˜›\«\ÑP&E‚eb@A!²Š RÍ×~ê¾ôÍ+é#Øü¤X{DYüÅ‚KÍÏõ ¾**§ØQNÚ!{jŒîˆ q|“î'A>eSnÑfËdÃH^¥ƪ[˜!R0…Ròe0Œ´°Œb«C †”T©$21P<6˜ÀT8-3K`à!”D8ÂJa2Œ ¯üÔ˜—P ”"9h¯4Õ!Äe• Ë’´pš¬¦^1öF«LK%”¦èPJÙc&q\_ÌYº|Eüp\dò–ýz _‹Hºmô²Ø‘¢]Œ–sNÒMòð¥¬hÁ°®ÑZ~poÅà§ýsA•£×GžÇ¥ÿ&Ûw Ÿò­¤eŽBo9á“¡¯†c¢R“óÍ¡ ZàÙá‹1GU×·“µÝ‚ êë5^E)‘Žùqßúi.{~ãßÿtô&[G'^g¸–b•eÔ³AÑ¢ywDOÃ..<ݱ¨ µ,6¤Ko  ÂH¢"ŒT.vŽ&ž¡R5GÞ@õão}ï£Ùý?òàþ\>Qgvó…ØË}'ù†õo* ´B°ÞH>ò‰#§aP¯¡nñ_ë]Øgtçó±MÙŒþcs[™À@‘@mÄ *±ã(¸Ií«ÍãÜ«zº6ï÷7§½CAE¤ÑÆ3VÝaÕÆìq UmgGp뎮x¾jkæëaßä)5,/¬2T€Ø:"‘uWèrÖÍìç–7®9{âG.qÉ´úì’5{'„°4Á (Kº0d!¼òÔR–e.+úÚrOÿàک籟EžšÖò:û]öZ’éDa+íÍÔ´pHðäUØ=Õ¤ßÎ_ÿúz~/³4%¡NÞç„ÉáUO/ûCËugw¾¦;¿ø%úì·Ó7{‹æ–ßv?߸ s—ó¹þm›\Ðe6¤KF 0xÕu‘G+债²¡GîxO ëyœ{«'13™®wßQ“G_wñ[k»W_5Ëùyáa–Ÿr£M[÷Ë*"…Få© ÝÚn3­§#´¯rÃÞ4õéÜcs ­ã¶}’›{_ã&~ª>ì<ÆF_•u¾_Ú{ÚÑj"“¦Í´Lvºœ®}?°»ÏÍû^F|q€û}ŒWç"NäŒ]ždùÛxÎùëë­û™÷!ûlµ«¶û÷Âmð¬çÜGã|}qŸ›<î—Ï€'åê!u­Ÿ¶~Çíà8Xž*‹äþ—w»Sþö~/B¾öö¼Êç»äGõ¨H¿ÒPéÞ‹óúõï~îÿW8fÇaÖOII™ÓÖÊ´Z¨÷ c($é•› çÑ.‚›kæ2÷Êå³Î”³iî!,}ÏÓæ¡zð>y éüd¶‘Ó&Ô3nÓE-XiŘR4ºgš•*§ÓÞýEÄä«»àÂq¹ ëú—Uë;÷¹vVIËîúº¶ÈÕ¢£ŒÖ‚§Ê “ }hæÏǃ};Oª9Ê®Ýó¶~Tí³X›‰ÏM„“ê4öËhoíÄ= ìã–ÚôY¼ixsÏñ½–$<,óÐ ÔîhũÙ.§{~­Ž¾ÝÙæz4Ï(˜­>”tUI7â³uª@!(*+gÊõ ²‚ô õÝH‚Ôˆk¡ 3•ÁtŽQÉJÃ@.šKߥN—FA4ìüy¥ë—·ÓûÊsë]<3q“6¥½°—™Õ¯nH×Ká#ߟô³¯ýÚ{·±ªr™-íÛò,qbU¬PüùM÷Ñ=ŒU‰;‚Üà •° ;ï'%(ì›8M™à‚Ïû<+ŸÎß¹þù«þ]Šç)÷G S4‘¦§Ò¤—MVe›Á~ÁÝ`ñ²4UZîÜ£7¤‘–¤„Ý” ÎÃr"ÌDMƒòT«£U[í2ž¥gg¯³ƒäm•ÎM3þçãrú„§®?þÿ½Ò“h}^7}f=Æ¡Â$X3Ã3Åž¸ÃTiÉåÅçÏiù•ÕóŠgP.rËžæŒPbˆÅ60WbSoص·&·­Šn$ˆôÈÙúµ™ÊFŸÖ{·»·³Í‰•kkpG¸ã1ûìÄLÔK¶c¥Ç<Òݮ֨ŽsBïw¥ê*‘,‹ï/}êG翉»H=NÆœä7·?&tÂvèЭã|òiÐ'rû éœíÃXAû“±ÙI.Q<¦³ÔAgòÓR ³så-Ýfn®æ»Ì?âþ-Ø$ã5¡Q'Cê ±(ÿÉ…ãwÿ+¾¾ÜÜbN¿àÞVÉÁ`}¶ÙÍ—ãýà}ƒ7”´Æ]ã€ôø±òüͿ׹ÿG /ʶÒ'%c´{j‹Âœv8 ‚H×CÅ>×舟“šd‰pK ¤n›¿ >²w|œÓÐ ANlÀ]M²‘£'Y[4‚ŠšI¤Ïž5ºùÃÛt5D»Ç’wj›?Þ‚¬£õ º„€o›F–ò±u“s{—÷ÐÏkÄ;=;½f6Ý»Ÿ…½/?íÁVáás?Ó™ŸsKvL™+gQcØ­_‰•Qq]ÉØ»1²ÁaÜ"ÿ)ȵB0&‡¼´S3B¸3‰§9Ýž¸·w ™rÏ€åD/À}T¡þÆÜ«ß¯~ÅÃ:~¶ùÈû6û ÜUŠ´BËìd¬/g{ã{½Yß\pþ„o¯Ç=§mÖÒt=”;M^àèå”ÙíN°e¦¶fäˆW°Ék¸4†Ô!ãÁêÓud^4ባ†b.ÂÌ„èž ®òUá”!au8«ª$vs—J §'s‡LÂsÞ†é¼\YlùbfR%VøGÙ·øªÖÆËº!«ÈRÁ…1-ÊÉ€šŒƒ£ ÉB˜¹uúÎë?´œ÷)­['ìÇàöèn…‡I& Â)5r4Ê”al?ù"‡Ø(˶P…û“öìÍÀÎÓœP ÚÀKº®WÄÏ8ÞL¢i¨ÃSžù¾®HÀGJÓ5ÓŠ%ê8Ožª9úø,”­r\¬½&Fn#àÄJ —¾?!M'Öv¸6ÿ>« í¹¯Þ?ã#œÍ«[ç–¯þYÇZ÷6ÎBF*Za‰‘{)¦c«LÛ‰øÒÄ}U„_kžÔxb‹×-*J‰¡Ú è(] ÆÓaqIÅŸjÙ‡n³._ »x¶€Æ.bÅkœùzN¥09˜'ÙõŒyØh{Ñ{øA­ËÆ0áQ-#:¥Œ<Æ0Œ@ ‡XP™ÆÃ¦”¿TÄC ‘¡lq"âHÑ–§g0 î/Nµ>Äq‰ bEª¸[ºK9¬°¶§•HPñÄhˆÂxœÛ<ý³&È~@Úͬ¤ÿ¦¥?xëÓ~óý÷Ajn£½ÿb=‡2´Ýµiûä뺆ðéœéŽQ¢ywuß,¼XK)dLC@3I‰ò¤-ÑÔç?…¢GoÕk«„[‡’ãQ!ˆøœh=ž,__w½Â¥N´œ’ž® SùÌiy-KŠ¡Ï#tFÞCðLæ€ ¨<³\ˆC‘”÷gÍ’ÆHjNªX¨²IùI±·WUL@÷aTˆ‰À¨1ãh "h€TL[4„¶+'©ÀqAL‡«n.ÚÂ+i¼ïcŒ7‡+ g¸R.É?e1?ö”T6zQµmÔ¤ÈÑÆ-¯ºuùð ›)_5ç‘Qˆð g䬗ÚçZƒª†lÐpsÄ™ÝyÍz ¥¯3hо­ò0h’A¶[´Ý&ýò~ÜûPMúh,›ò\h&M¢ã`M¥¦ÍœBÕf[d$5aSÄ­‰i¢-®ÜI%>Žnt•ÉŸÆú–øú"öáÞÏS';éÀ—9ëóéµ”fS¯ƒ½îç‡s÷xs{XÃæ5׉ßåµGUß”S.“ÍÓ]qºNOÿìéƒÖòz |¿ŸsØ®ÛkX1s,”—”çoýþ~ë‹Öp±UÇÃüñUýåqðW÷Í?ûKÿ´E¯þéðw…Y4±–\Cå§£™¬’xcp±ØÑ Bcëˆ&‘ŠÓþ.×Ð#/R•³ãÙCvùœÎMq~«º )‰Üø*D= ÖÄ6–·mtIFL[C)-0ÞÚ”HE&GÙˆ¯Yý—_ǯWûµ'w¿~½Ù›È²}€ßë?úëÃÝÛßO¾¹åúµ1M¥¦zì«k]Õ¦>´“¹wª"Þ¤Ööûœ>²EWô¬ëv R|âÀ¶¶e®w&?Ÿ‹«ÌôôM»•/$~pó|ñ³f#òQîwP…X€Ð°&ö(Uv´#/¥ r¾^¯ÁêôZau¸qyÙˆ:u Vk™m>/Ø‹bRÄ”Êk{PН  åJTV¬¨”…Þ5g˜¡\¢¹lí5ƒù¡Ñ9«_Æ(Â[Ãìúòæµhýfhä" rá!ÔÐz#vÖu“yçÜγë±ÕÂg ºÐЫáª\ÂÑÄ(ÁiÓÖ:E¸!ØÀ8…ƒE@,•Áp–òh&˜º9µÛyuG!ÅĨ-sÐ"À‚™e‚ iÉú8æ+&y·Žy' “ @¡ÊØ¡1 š0Ða?ÃO¬{'Öš±QÆpˆ•mB)~e6­ ·91níÞCí*%¡¹U" -xÁüHý^UvÉ´¦÷ŠÅ·åx4÷fËh=5ùB¥5\¾¾ ?AVɧ=VQ›ã/›oº ¥f=WÕ!"t0`'ÄGþMó=N°†Ê?ÞûÔ ëá YÏ™Uå@EÔqsLî›ÍÌo_©¬u±ìq-tX†“c²“JÃÞ‘`Îú‚ؘù¤ëúÌsÿ<â!œ‚1®™=Jî5æœUŸÇç·Brk@ 2¯ª©™Zß(+)lÏÙ&£ Ô, ˆH¤ª> x[£¥ T€PfC:Ä*µÖG ³­Í—ýžd¦ºóóÿûß0ùS ìë ÇÞwÜW-ï¯ÿjîŸë<#"y¹\¢KñCÍor¼®÷¿´Ï œ3 üN€$Ìýfô`ÜF;ÏÿÙyôŒA“Ü+7Vèì×z=Õ¾·nø ¶SZ÷óŒnÇ7ÛfIEJcT P¤^uÀ×ççÏg`dºì,óyb³Pp S˜!al  )›ô¹7V¶Tãt ˜+Ÿž;šÈïk‹f •8¤…Ôέ«‹è…é ’Ù¨Ì¬šPnŒW”iÃNò¬}?œefõ a¡"w¿ú€C7QaãJ [*Gò2«%žÉ +û9t{Þ`.<[W>4æö±/kÛØ(7š òëS“ŽAeá~øt4´t+Yͼ:õm³~¸ü½á|<·îdøñpÀ]Ä\CÔ"ÌË7Î’½<ãU[e»3Þ›dв`'Æuÿi kCÞsƒnûT ¦Tµ¶`2KïÍ™ÍÁóÆ2ä;Žm]2¶¯¢?È>Ýû˧kNriç¦×ü“ï°÷n¯‘· ƒ×ðæ¶á/´Ñ b©`Ãw0S–Ý ëm¦¹úðZÎyö¨Ù‹>Ïr¨>§*ð~+æDòéZêã먦hâÿð85¶t·žÆ »iª1Ú¥€í£X´mV×ÏWrEý8þí}_{ÔŒë yxŸÂùÏŸ¿üðë÷Ø_:/£]ß«}@¹yØ+œXM¯†ü¿¸¡¥=× t± mª†Ê4`pòú´,™ó¾êþ¾Š8Ÿ&2½sæN¸éöi ØëÐó³òEçØd²öh‘GV'/›œÒš©eVÜ–ô#ˆÖÑGø¡I°%‚]#¡W§Äò‚¼Y’yËl[‡M–7 3]|%´]O?Û}ç(]¸­m‚²p|,èMî†*ªÓÜÈ’6š]Öï>`GCv08¢Åv’Å&Uù³Ð“k:ÅÉ1¤¡@ ÉÑ(“ov¾¶uiß×ycÑfÈ:Äje‚ô‹]À¢¸°FCÃzaUu1ºòáµìkû§ÿnx$¨JF(?eA}â`—²ë‚ç¾á¢Ÿ.çe¦Q¯®åëj¾ÄêÉ6Èß…™ ¡è:2~t¹ã¥ì…uá䌺î rUªéeáªÝÆ_ºÞP—ЇŒ‰ÏŠ=F)…ux£=ر5?[½¿(î£ÜqÖQ‰â÷”šY˜,œ Fƒ'«ºŠ84C{íoÁt‘9 †y›Ú^‘Ë,œÕ[ÁCÆÑu}ÂY™~ö*¾)áLú(iWÇY|úÕçËÏöÁèÇ—†!qXwb¯â  Ýäÿîrý»{†ñcsù‹®¾ôêöì¯íׯçÔ»ÿ§›£_΋﷟ÿŸ:éýß&™öÉ“?/õîœ:N·È ¬:ÌJ¢€¼’BT®EuâD3LTEjÅ^°Ü~ÛÎcX^V·Õ‹‚Ôc¯Íœ[;¼…xdfÙŠê¨NiÓU¤¤:à&Ì̯öœƒ_æß‘ï[ç÷<_üUé½ÑŸâóë§P<­õñAlj}uJ2O¯?ûI¿Ëºá¾êEÕÍ#.u£ƒÞŠ0i]ÿh€ò¹1fÜ4L L±‰ÊÅ=™•¤öûxÁõÐÄÇ‘Â:¡F)‡^±¶k˜"ôƒ°­Ë ”k¥Tà¶aÕ$Ú˜Rm§9³¶:®‰¶ÉÖÀÚ \ž©oä WWáezˈhP”ÎWÍ&'[¤²jLºÎPâ6É5Æ]¦Îé Oš_´üqÊkêëÇÕ/ S³Çc8ùÒùÍ4<Ó>9×ÕÊwN6L­UrN«.*3tˆ¯Ç…qiõõj׳ é†V±fàÁX…íPT¢t‘•SpcÄ%™@Fj¨'““8YFšV¸³´Wu˜(Õ[©B˜Ú6¥?"cG‰ÑŸûøè<4ç©{ŒÅ JJB@'‡hà,(è•TfàBè+Ñ(‚c C4ì›ýõÈGŸû\Õ8LjïësQðR¼´J¹cýÀ™IÚŒVqªv°Ï…'sîúý©¾3¾¼‘æPËùºgrßœç…M`¦?À®€€4!Åhƒ'¢¾©U‰ôJ¢ð(Åb3 PGH„”o¥åƒ­´…æ†ÙèÇ·ç[P{Õ ®íÇýñM¶ºaý|ÎPî>Üžœ·ÿǬݶ$‚•të­.‘8Øí&»\®œ÷ŸLúã]ý4g~$KaÞêz¾sÚžòlkGcC‚Z5R;•³;ö:Ùc+õú™Æ’ÕGžó †)SQáÁ)D3dÂÁžÅ*!*ˆ‘‡`Ä#ühüÊŸýRÒ?£Ff6_:cLë.X)-xGüH#`˜™ó2ʦ×*·Uç+Ÿg`¢%ÓŠýIœ ©!ø?.²{«ÆõÖµYC zRma­KãnáËÛó;»ŸyÙ½UëþY«K¼Æ‚Ãpóê}çÆ,âÂhaÄG‹Õ¤Ò×ÅœûŠ»¾ÞëºV݃y¯õ; ¨ÀaúP€Ã"]Ml…[¹h`.Òg¢ðÒÈsÚÌÖl/·•@I!;ÐÁˆ‘N»ÆN+À‘"VäÎWµj]…ØxÁú|M˜™qÅŽnX ¡l¨Z¢9¨D,zŠ.µuôáP—Ö›Í7õ×QïxëÐη›ßýù5’‘ýÕ<;tgW ۡˬLë÷›–Ú%gê6® Õ%‰òÉJBý[íÙò×fÒZe`‰,°ºX˜ãMN¦ÁX>dŽÂ³]·2Z†¾Ùè>%6y"ˆÊ¯E6°YP)2 :ëÇŽ™}v^ï|v<óø´ nâ« u/§£¥yh9åtˆ$×v;{\9NSóNŒ\Ýí²~1+Ó?óÎY“ÖÓ}†§ñX(uƒ’ë¬G\ô·s„¡‚5äÀ)2Å`Ôò¹ fAÔ¶[1ŽN·Õ“ñº^ÖFŽÜ«½}OlÚB¢zŠK·¹We›šÈµWZ깯Ü-¦“ÛËŠÇ^˽¶À †Öø¸ÿxíéÛ6j$€ëÊÁÚÌq© VÕèþëú}ÕYôáÞº0ö¨k§!"$vÓ÷3>ó7ýðkðÄ¥†ú oÜŽgš6e€Ú9D0÷'¤â-ßü̦4ý|n7±K \ÐŒ'záyéXì¨|Q$¯™¿Rú¦ç+þ1ßG¿8[9ìäàÁ d!vïCºªG†ä ”Ä Âhúk›™¿ZQj›dú>¦ó¦ì}½Ëó;–ýè͉o …4üÅ­òJéÄ·}À£LT [¨¤—ÖÞÔ/Ìg)MýÊ+g`dâ´Ž$´K®Ñ•ðb¶«ÕFÖI1¼**ÏŒŠ½,2r0F¢’/­"ËëÆìÝž«üÁ?ßö£.›æ2½¶ÝÚ0i0¯Û™·ª/îÕž‘¨ƒ˜Ö@Ñ ¿Ñ.Tîºrï½QžP¼S¼Í`EV…"B ß‹dÛÔ+A  Bøö¹U{k)ެà‹h’÷G…D¬1ŠPT (¦Fëp¹~ó`®ÅM]M«]•wCêC×`i-PZ `CÑÓ©º*šEaD÷°¸ ìù^ž×ôÿEµÍ©ØemÁy~Ô×ôE=$Þx%Ãüñù\íÚòÙóT_Ë(u³ËJL"}2Ñ¿‹ÃMe¥=}ÀÞ/FÿpÄ„rup]­í`0àQôû—ˆŽîv‘¢ë¨0mË‚/ÑÿHå*©²ðZ?úÙ3ÙÆ×É^‹v"IŒ\cùWr ž²µîè=uô¼Fn]F®ö•Xz<ýÈÝwÔ*©Ø˜$”_’Ra›Žä¡&[³ ï=7õ1NÊrù(GU´™íŒ3ŽÚô¯‰†Y#ÄA#éc·6¤ w–ÖvR0ƒ•MÇÂݶ•)+,J7j±lu˜2–Éeˆþ”ªËßÏ/S÷¢:ÛÝ\–;ç3ÊùlÁ5 †d³,TÓ¸H‰Íî9e¤ÅŠ)°w8Ì *94âFÎv2†Û6Êcâ%ˆvíØ,ï7»IÖUý®I‰¼o¸ó8þ!·Z;ùóçaÄãF6ÙãÊ…q‹¯*Ÿõù_þdZÃòOtл›‘0pƒÄ5âÄ¥Nd8“F {!椃M¼”{„¹!qaþòÃ=M¶ê"o7w~p¯öƱbþPÉè o×È}¡šÄr/­*¯£’ëázx°(½;XˆÇÉÇþ“üë#í“ë‹LVOcP«uVˆêy^D‡í»Û ×uƒ1kmŽn3u^oÊ*‰³Œ'Ð>l 2òD9dn{Æîw÷ÄS›éÇ9õ¬PÅ’~ˆ=ÒíÑÞ¼2ŽØ±³ jÀâU挫¯à=G²8`Y5»pVyùÉ ¦&}U¼eÓ¥±’Ú‘ÍèUS y}8®P¤±aá ®”„C X '‘pJq@óñ rÖÖÇ:š›Z ­Ÿ;܆ÍùÏïCš7’šmÛU5 uÙðïz¨üJñÈ·–º‡Ö¡#›3Ð1g×ïöÞÜdݪpxîFtzĦ+¼Øc‡UÔó8gXqØ¿yÆù„º §ö¯î!n‡þsþvì(b­qÑ·8jØd@mpApË¥¢8Nçrd@0͇z­âKžÈ OMÌžœÒzb(¢ Õ'´%=jÃi<%ò@æªÉŠjƒ ÒÈT-\têlfKæFjî¦L …§KxNÞfrZi]©6r”¦(8"58œz·»V ›hœýÙÛ§³'Ž-'½ W‡Ußg‡q§ü‘hÙÙµý¶Vœ‚”‡×í"ØÌ ÖékŠì™<¬îžC%yæ­ëjs“9¿'¦ú´ûÛtb ¸/´H°ô/|æ©ÿÂþØÇËÏîÓOº›g4~™sü'ÿô¼¾ûë§¶Ç¿ß×¹w}º­ü£‹ßÖ«ï>[®/þÕêºÉË¥užâ#fÇwQ™¬;¦r±¿( Zà ¦]l`ëX»ÂòA`m˜i²ªj; Sp™+¦cS6íš’*¤ÊZO‘bCr<@„?ü›™›wo®iS¿¸~vûø÷ßھ.òÕÍ•äZþô6 ÈSv{Þß_¢+ƒ®¢µ(D‰é3â‡~³Å˜‘ŽòéäøDJT]câØäKËoÇûˆç*¡vCÒê&rjg?ÍÕ$nZK¤+šXÒ3µ„$AÇZ½ˆÍˆˆåMøUl:‘1VÎ9>°®›}ôò Ó¤]†ÖŒCYŠ+Ûóé¾íù•”8$Xâu5â–ËWí{¬|ïÕƒ¿†`ùºã Ý•Õ ô?ÜþÀOUOÔöíUùú.¬ñ­y¥« B‹ [ñŒ¶›ÝTG-£i ×åëàýyêQ3sXšPP-í <ËÖ¤ Fh­21(0 –|HH„òЕ½ÖÔöÏô% c”äY ²¹%+ $YiñdVú{à‹ˆ1" ÅÚ‘ QŒ @(²ƒ*"¶˜XWC‰P X¢4u„-´˜Çà<Îã<ÙS°’†J‹##—æo阛W¥×7úB)œÕu”E£Øj(3èB]ÅeÉ•ãO ßð¯q…°H¾#÷kâÍT‚$ÒBÀéÑG¼`(6‚ŸDœÅG$H+ü*–rÙÛڥ̚”w?ÿëïå|þç~ùw?ŸáW¥ÞúõI5×ãéñ©KèÐ翉ï>—VqSò,ô¡“è¯:mTT‘ Œò5ïëðzû2G&§šÓ׎µ«íí’§…!sRï¹|›¾–¥Ô*Ku5ƒ#-mŒ2Z;½ÔÍ`'Ý£ËwKT Vº’UĺÌË)…*>ìÝwwí<;&ÉtF&+Ì>«)*Ÿg¾¨a‰¯DÚ ù̧ƒDSö†¥¯T·çÐCcD†¡# 1jᦲæù3·ûÚçùíý»Ç¾lóýHù=®v ßTøˆª ªÌLø€3÷Ö÷uÆΡƒ¸åë~Xƒêõ ˜,úÖ"“EbS·§®µŸ9ç:Õ)ü5ÈjêÎ@%KÓ± ùåÂô*6 ¢ˆŒ.®¢¶¯>³ŽÖ÷TåZ~îÍÜAo$”A-\ŠS3\ÍÀƒÔNÓ¿ñüfj{ÆÈžD'èpè ¦m*¡±¨ª%¯ä…ËëI5€„É|0.?­á­%¿]¦½iAáÈ»‹ùÌÎMò>œ½¯2§r[?×Ìs‘sPõ§ÜŸóû’c{–=6ìý=fÎfzAU×W×ÞýëêýÛóûƒíO³ÛG~¦|LІ½v‰m_ÒŒ@PgŸÄjæ4ÙÚ€ŒÖ JjËÑ&|ïhþ¬\•ÜggÔ ùÞé¾!¤å=Ó•(¨ÚF¦aZ1…åKttW…ÙùZoµf`a"hr2F1œ¸elŠ‘)Öh|%•ø~:ïÁ~¶MDYF到´i o÷׋æ¥|z œIV¦Z÷Ì"/XïÇx]ËEµŽNy·‡º¯Ó}a§zM7S‹«¢ ~ס&vË\›ÏLª›=÷Ï»Úk¨šØ·>Rîzoî9Å ™Ô§}öðØÜl ª(~ÄP%øÂ]è²ìªÆ*:„‰ƒ‰³CÎó=ƒ'´‡ùBÜÐÚ„zÑ%º“X}Ž_Õ P#¡Øë=jz$|ÈU—‹1#À'L^G}pª~ä:‹MÏòÝœ¨«ñÝÞòA¿îítTZ0"b­£Ø±B%,ãåIš?¾HXÑQêxU#ç. DAÒWûÎÙYÂyýš«œÆÏ8ûTk½g8º(7Ú+EwíÙA«âp`òœ"3ú¡=Í&UŒI4„" •r>ECUV„Ût6\“¼QÏ)c½šÎ¥SW ‘ÍXšÝG1Ô¥Óà@1œ†ZPJ¶g³s ®ÙeO }% ¶A²¯û;–Ë‚‰ÇíÏR4.Œïº‡«s‚Â"ØZ”Ùt—³¾ìûÂý`z"ËÀsþ¼¾‘˸H‘1Ä´BU¥{p3sλ·¯í‹üÐh :Óæ‚ru¾C!h!Ôæö.!Æ¿¨÷÷AÙõkÉrßm64¼v]`>K!HSÔæÀ 2í6©°Zº¹žOª‚ýÅ®ãR÷ü ú>„}VÐÐqrÇp„K Èê<žT‚`ÕíIËdt޹ùÚþ¹š~vÎWY·üÜVÿîédt÷ž#fߥw5«_ æÚâÇÀ©¼è¹ƒìþH´3W~‹h>ýgg“§¯»ÍípU¦22²H‹¦cÐZ²¤@³"2e) aéæƒ®U9‚•DÝ ¤_s«Tã”Ç×ë¸:Ï—0+"Æyö_ÖtGÙ«óuÞ§c@a5½_E'ÎYGíW«—òÛöü¿HòS@ øõ¹{B³Ê#FÍ·»oîßA0Õ2rÝdÉj½Ð‚þÞ%47øV6~b"`>š,<ç¹Âq=+û°!6߀ˆU?@Ñ¡]ð¬à7AjµZiÙèEôíð$ÓƒhZ÷ª>’)¤Ñî”!¨•óF®Ë,±)žXÕ~¤ãmˆm0o*=CÚzêzB!qߪ ŽÝ‰ŽÞY<’ Y°¹H2’ ÐQº'¯¹RzŽ˜´u°q»s«¿TW$¡ºë´µôÜGf6ŠÇG˜¸®z½CðÎP·OCï#†]$¨°î—ÛÝp 0\ BôÒBB*ím˜±„iF9Žúú ÐâºoçÍçs€¦½üÉóûÜ`×HÐ?È÷/\‹ž<ÓùµñôòKo§9zd±LßU»xë¥Þþ<€<ü hjúúÈ{oehÌ è*h‘ŠnÙddNdJ‚šh@ÝÉ16îØ;†!c²‡26Ã_à{à%Ù ´Ç Ñi80X²‹¯ÎÎ ŸÄ¼÷kKÂlÿ}ÛÀ,1Œsk‚Ô‚4)À‰RNäCh§§ÃòÆöyÓ<F?>î—kdâ°2OzÕ)®@†7g ­˜áú  tv}ÄVÆry—¢Cò§$ éV삾¸u‡s¶:ˆ&ÃÖl¯!Ú »Ÿn\÷óÇÛA}Þ. aš1Ù|¡êjiå¹fÁ¢D¯×ŒAl«{ê[h´ âfºl• ƒî -Ò¤†KÞsï_7«¦W׆fjl?åµ~2”¥’Û¹æÛF9¤_›BSà'³_k<×a %ж¦;¶^®â«­LàŒî¥8b‰êèQw°U©}ápH<Ú¢7Åc Åž?‡±ïӋÚ÷’=ŒŠ_ïs| ¹>6øê)ŸåÑv§ârL¹7s¶W>ÈžˆÆFÇrÃvȱ»žü\å}î¾e‡BùôAE¤•œi”WIJqÝžCi@aÕn)ŸO«ƒ˜Ú<%Ý4Çé¢Õ˜0ª³RÖx!h%ÔHBESîQy¶+V*tcQ™ RÄ‘+–nê©‹z’¦NÁ1Š¥hHm[‚€5D¼5hT¢«a:ÀÂß* ¯7©@‡]!‹×1Tݺ }ÆJ[ò„³3‹ØÔx÷RíìF€^G“D…¦H#¡³[<Ôàd–Û+œ¢L>Î Êv³hȰR , ÿª?gùtt»×u>‰žImOò°gyë‹R²”/§É@Ò<%.ÕWteJ0€ÃB¯´ §«Ä :’*ðíR˜tôó%Á^VJg(áJl]ɪ*`šÃäö–f! ')×Ìld&f§œMfÉúTyÒhuÔƒòm¢µCæõó|µêÅ:öºÍ«B¸ ™±‘Ä ¡²àiãîœ:¾ta.ÈÍÐBÔ%Úã ÊÈ=xÎaÎÚo!33!¢ÎMvÉ’õ“Ý`{2EPNáXQ¨-ä!¹]Å5ä®,…L—²X½ªOú¾lµþ ×óÿ=ôz·²ë>JŒªÂ³3 ×ƃ{]öѹnθ‰iÎðÉäõil)/-IDâ8ëä_'k›/òÔ\}xà nhj­O”°íáÖã³ÜÈ*5E0ª AÖ°”ÖxN%øÂI ÍQ°»È`8ŒÒÁá¼+‰°ÏRî .4uyó"ˆö¨“û¯]sÙô:íû|³?,yÎy¸­ì¨Ã0ªi—Z“- ª±8Ev¡tðX°8¬ÜKUʘç/\úªw2©³­BsÅë›á别¡ýß)"ãðàóßíçÃ9ò*;ó…‘òò_t­]ûïüþP?úoÜ¿tƒ=„0@v‘T(´øíÏúSoýþc½ï¿ÉƒW\»wÔw3U£léEîÖ£èI×*àG'lÚn# ¥Úêû!è:‚?šÞ´o3)S¶†¯k$&ôÅ—¼‡0ÔxB h VX”rE3ˆÛwÿ/O÷Ãõ×,Fiudân;?¶wÛC¤DÍòÔµžîËÓØ‹QÂk;K­·†ïªcûSGÓNñŒþ‘¾=ªRÞΖ5äNÇý­š®õÛ>ü¡øÌl]Ø}ÔôÓM´` ‰Ry'$eÝM9‚EiIP¶ 'Ebc'(Îëø¬þü5ýΠÑJ$ˆ’‡¦ Øá%´­A¾Æb4$ ë,{™>gýh8e†é&$"562­®Ÿ“¯_„iVß¼~©n€¹¾£ts%hÈ‘D«/­f¬õ½Ts‘â ÓõèÒ¿U®X±„‰4'yïÑL¥$fµ /Bϲ÷§{ÆC˜ÖíÆ í#]ÈÒ¨BÊ­&˜.ZeŒ±‚DHÛYqÔ¢FµÚ±ö:¯²# =6‘=á±îh%!Æžn÷EöÛ9Ç\R˜­€)·ŒTkDQŒ±fŒDJ‚z°Â;Þ˜ UÄ y(€ó*y:ª_ïjm¦±®¯T~`mm,^8Q8ª~V¬lcž [Ô«##ë¯ÏŠqM×Çz¥”@ò<âe5ý}9?˜bPCÀ0›‰OâÖM zDçd”|>ù þ‹@a‰K.$¤C lbô…Àù«ù_V»Æ”×ñëÐõë÷ý»#·dø®T_<9zR³²…Ü\œ·P×Y—¥¨§Ü„ˆòb›1t®„ÚXÙó”öðÌýiªúÌûOoSm¶@€Ã2¦žW•¸PÉNh|¦ôªb[4½ÙN:ùL?¤¨?I3gñõcs4Z2òXû*€/=##Y’3Ñ4ÑPDGøHÿe= n 7iT×Z÷$ÁÍ’³/‰‡’H„8A´ Èê¾Í’VM ɸ¤àdýÇü=ÿ‡/¼ûÕZûþáçóFýòsXÝqÔk|m벚óÆlÕÑÿÄÕµó}«¼1n¢€$Í‹qËÖai¾°µcv IŒpê…ñG –ÆÃÀªqin¯oi3/N%h­: ºØ–x–4ÀA ùáÇç?ÞÿlêkÅ-]\Ûn á‘dXXØ 9À x”²U5` EÈô;ö0Y¾’‰§ˆy-­uŒÍÐ~+þmÆ­ÙbD!˜û^šl^k6q3„gÐT.»ÓOd6,ý{©»ß£šãc‚e“æÌH¼|ùîÎÆ;?94$³«Ù=¦?¤EXE³ÇpÊ]Íý üÆþá>qü¤Ü_)µ¨Œo¡uAPlNæÐom¹¹:g· _ˆj˜ÛñÉÄ;ö/`ãúžtàì¸ÚÌqhéëàjm84$Ëë:e}ßå÷ïDÍ.3'Žäi·msXS(€2ƒ.€,˜(êrVåv9êÕ(õ”Ö[@Ôq%g`7¤v·J!ˆç^"¹;j"<égõüºù|Ñzu#(éŒøEàÆu'U² ݪaÆJ©ºLªâ^W‰¶òXÿ¦yŸˆ¡ jÃÛû)óۣ݃õÚp‘±]ªŸà5 h…ÐÒãf¿Št~le¢V+Bh„Q¨4ˆàø÷óû§=mõ26`¤ÍÙ^Ï5‡¹~¸×kûÊdV(bÍ4R›:|ÈUWn`4ã*ub=uŸñ.&DªˆfÏ¿&i_ÏÂ^ƒ}Õ6©*Ó ¡'¿ayâ¸P ÕSd9Öø¢@ie9‚#\¨ésñ¹h}I;n¿ä=-a+lW–“;ye·Î0æ =Ïw =N‰î!£/–})Ž da®/0ÌÁãZ•¶QSÔI‡_Ûu.à$*EW§~¥ÛTÍËq pª|]t³6 º¢ðµ%¨Ö÷ý./u–[dA4ãÄé³&ç`’ov¼š#@ ¤UCaBÖ`Ñ™Q@‚sÇVw̾|ÁxÎÓfZ¶É¦OËûÝó#›vCH…¡jØ`¥Ì÷í$k Ïæ_ ž 9]VU¡„¸™åç8èÿ„|Ýöý­zw¿Ç FÀÄíäêq÷‰®£ U… íL €ädî& šµ#T:%neóÓ°öLF ~ŸKjÈ ¢DÙ§˜ŠÚ²`)FriôµÎ¼‚Ô`çÓ£çø?{]ûÚOßZè­§î*pj`¦Ò²ç•õ†Žù‹£O1¤ßdÛ/\‡s·Á&̆ØÏW4„ý·Øß {þ»¿úøõÞ+>?hZ.åÄù2„Xhˆa‹I -!QC0 éñfd_2;]µ¡ Ⱥ<à©"±§Š*#ך#«×û8ó3µŠÖ{ç";»!eÏÌkà [1…Ó±ªfü‰9£ÂwøZtÚ3ÕF礛ß7u=è6 ˜X=¿À^Ôÿ<þMýJ«·ÛÚ†Ó•Yd|nvtSPSº]Ð]é·Ð}wׄW+DSPÌ×;Æ4l¤vSN¡JU ^i$IÀµåc]Óã}¼Œ¯÷•1}õ Ï?¢#G©J±6;Ìà3‹ "lT£á¶ÊL!¬@Jþ1®ÙX”ä.)ѲQyÆd<1¯­5Î/J‹{ÆrdäîäHÝ¢"rž´žl¥ ÓS/ûü½[¯ÛÑ|Ê[ôo:#l¤SÉJe¦mdrz~a‘Q Wqùa6eÉÈñî,J¦›Üvæpkqmr·Ìly!í‰ylúNÓù8Ç T *›`m À„Ï•u…‡š*êÑ×Õ5› ­ Ùëf"UiàdÄ7¦Ûù“#…–Àx@vÓîí)Íx‚>/z‰š·ƒ1.³|‰ºWª‹ò‹ ^5JCY}qpU\Nƒb™ÐQ²7ȈŠÑ:7L§5ÁMùŠã5%¤Ã÷Jä9Š–Åõx’FŠ8{YàE NeE¶:2s¥Å­ÝeÞR]išå\åAÈÎ6‹Óõ$wÛAÛžÏ>®‡Ç…¾fEc1SK–҆Рb:C¡òl3˜†€¬‰–Uª©4"ðBŽXS.Å™V¦Ó{ÝW3ºVfyL Ì¢BGîºí Ãѵ«@fšˆƒeèAÞv<ñØsX´M„È€’¯„"‘h§ô­õ•w}½~äß_x2bðØòÑöûù3/="¢£›gefrMY\¥²ö]¿´9„3F.cõ"J¿(F…Åè×RSóãp‰Ó?®³<9Ú^¢÷JöÔB-*JtläAB*åòBv–Cã¡ ÚæÂÆc$MDŠiÈ£Qd?ÂøD¯;Ù×t^õ4Æü¬2›'\ÆÌЪDÈA#*ª\>›¾–Z*{‚b7(Ó™ºÄ&f“zUÝ E˜…­An®Ø²aFþ!¤ž™Nw Ô!‘-)g4{0µ›€Ñ$‚¶ß’álàG•곕{r7š_‡®ïïy¬¹T*‰ete÷×Y‰¼ãn—¢2&+)/}'²í¥í\ÂÈé„~[–{ýUÔ’^Àé« ‘£¯2@+Ð.Ì€,×ŸÇ ’š¨SôÖŒVE%JkÉxØlK±’S•²áˆ“ëü•äFf@5ÃIr*–³"‘µ4)8É<ëîræü¡RjØ»j•Z)D0©Ž­»°‡hã+Šr$~f«ËÄÃŽ_‹M¼ê™•òM}žu6Î"Qúdšf`¨Æg{­ëw[ø·,M»]Ÿÿ¹yMn0fY2ùj«Oð‚õO÷ª®?ò¯,N]žë[?¦Û½¿ Nœ´Zx-B ªÚûðüIqu¼–üÿß_þóÛ3ýF¸:YÿóN_­ÒËàŸ\?Jzn\n~a—ܬB9ËkÛ·qCý³}çèõÞ2•VƒìpŽÌT‚p-…=ÜaMíŒäZ®ÎY4 ‡üêò¯Ì·x2ø1ÊsÝÜ%>£Zº:×í5r®=…¹Û÷?åí½ýEö>íÛ{è[vÍp¦OÔ•<(uÚZçZqÝèëîùˆ §øaá9¢« G÷tXªdúï?ú~f!¢!qüåîRk4bÑ¥ÁŽÀ2kùœf¥X‰<`®¦¨ØÐ¾¡r¬o¬­.…nHöFò©Q–)ņH Œ:î¡UŠ>)mY»W¬3†³€Š±‚ƒŸ”Ù(+eb†NmâäJ‹‡)FHG^×Í8íéUuÉn|fçapû@é(I¬ØÙã4ôJ“SÑXt`ÝË–/efQ°¢˜6Ⱥ+#ÙÄ‹ˆ:¤Xh‡¸!e`A’LCÕßq¸îð{é2_}ö…¬@aÃR¸Ô òy?ÒìBPqÙÕB¹ÂW¢Œã>Òz¹­(¬A<"TÑÃj¤|©+<Òz‚;ÒšH\ÂU¬MŠÎt†±\\0kû{äz´QX¼HAtö©LëhÕ§[ƒAß™OE Œ9ytÅ,^ Û +OÔ¡H+21€!®êoôzµêoàíWñ¼KQ¡$^xÉ_äoÞÌÚºÿ•ó&³|¾±>åêò˜ÊñdµÍýÛ–Õ¯Öóxbïlï{½aür‡¥ÚÍ4”!CQH ©]d»ïnÝ_Ö—k¶wWÂÄó³° óenõ¤í…SµPœ‹™SlL?€‹›Bå{hЕ»EŸÏPƒKV0T|GÚ’*Ly–s<—(@J¤ÖR¸” ३-³xáþ =x Þfx~ãö9 ‹zèd,ÄX6î$+¼yí þ9qz¢iˆ®©ÈÓóñsÞZÖ‡sc6 ¾Öœ×¦[óF9û|ïXÒó™’.>ºª¿»£OãˆýÚ7ºér.˜Ê~~sXg›ÅWG³ÛÒs ´Yà ‰š¾3Ëb%Hö‹}mIpÖ€‚Úó¬ýÄ÷›Þ§úyüŠîVÇv\EþÔËa¿ëg¤ºª SÃGöîò»£= ³WY0>óþº(c_Gåˆh8pÂP ©äÁQ† +òäô~.ÝÞ7Fî/:×Äz§æ8¢ÝtäÁ2½ãýMäs3g¡º©/ã±ßq6Äw[ßrÿêÈ@–›éçº!…Y£ñ1êukæØî3> îÓ}o§<_監=›õ¯<ÿ½ýºqqã(Tý0ßÇ íŽî§äNÊëZ†)jäYõ.&ÃîaL†+À&´ï««› H¬0Bpõ@Žë§î1QS›ÚqžÒeeè²×y ­s°!.²ÌªGÅëÎ[¶ÏœŒ›¹÷&lwôi?9fÚb˹ò0p|å ùỿj½j±âÇzD¤NkhÊ4 R a,©Î@âGH4ˆG ú†š]˜é=—À(m\*Ý«™^?Œ×¶^þ]€T#×}®”"L_o¬ëÊS£€v9Øé:È‚ê$YæaÂ%Ô L÷|•ß®Ôb߃¾¾wúÜú®ž™M…jX!"GIG¬¶›¥’+%­æŠ‰añší(Ò¨/€~%™÷<›3²3íŽü0¯ •@D± Ô¢{˜XÄæÊïñi3™äoÛù\¼¯êj{wÿòÓ|ýúÜVd±H ž CP‡a·”Ãw¿ž½ËçÞ{‘SHˆA{ÊÏÿdj0ãÕ /Ü»Ã]Ù°–\az@D MùP£Z^RcÎ`„JÈŒ3ãçt±^Í&Ùàâl÷~êÕÆ7´Ê°‘Lˆ³^6†m‰íùŸfšJk%±—¿>'›bß,]tɳƒ™ÞnðuýsÎûÅ0襈#‡ø(Ç$Þ÷ãUÍIæµ~½-DÕwöñ3í±ðù{;ÿQ–7˜¯ö¯á0œçˆÏ½ýkP‰%@‰(e J¹±æ %#Äç0†ÔŠ‹C‰¸2Þ²­.N,»ä4ÅÒÝSÏçù9nîg_#Y]5~ÍÝ|Xzí?“'ã_ëyq¥¶Eݤå½ê+ÇKœªŒ}Ã*Œ9üÜ¥òƒä~°kMyÝtžæÌy @†,y³P u•HB;ðbY%ïZÃT²cšG: ~ÜÍU«ûŸÙ!OÍë½ãë™oPŸçýCZöÞí+›.I*Ì ÿ„È » ¼ÒZ³µó„êùÍÇÅ¿mµd3ŽÃýç9³<ãÛüdÖó‰óØ>³=òåw¼ûñ—ÑùMMËØú8ó6<ÝÕ{@š{*]ãäFZ‡nŽFsí±^9_žþÆó³(÷ïÝæþnÏ®­‹u_¶=FóKÃw—î?Kl?<3¸óÖ¾÷GÈ“Ž²»]‡ã†(PP R"qƱߩØWóc}2>eÐ͛Ȯ/ß>ÀíZd}—ÇÝ÷Ã@”9¬´Ð"–£Vj‹™ F¯‰m'²ƒ×G¿\ÇÑvÑðÐN9S»CD “3+ýP²:©¢aÛžÓ[ä#¾L$]+ûØ"ˆ.²Å2 g—9Æ`'®6Ù`(L¸,ù(9j©ãúÚöûÁýqE’3½5$ø™i‹]Š\q0sÒ‘lïú*…*yd¾?^0¼žq[vï.ÝÙï=á,÷4E$ ÌÍD€4eh³cÀËž9[«xdŸ·Âó7S×õ÷ã¯ÊÙÝÁ+ø.O]‡Ez¥8g$pÛ"Ý(àÊìB¸Í­fKÆáÝ M;Ä’}%Ÿ+ûQƒ(l`ô:Ó2æDÅ ÛŸñô½?ææXЮíp±Ž¼=E9Q4©Ó79·,s^Ç[Û~gk’K¦Úƒ':ÎÙvH?/¤Ÿ ÅÝ´dl”;­šNò™œ[X—`º;þÅ×ê-ÒÅÎÿ¾o‰Øt[ ÓMRVÈD.š¾Ñüe°?6Â/ ‡öùY‰¥õ<1+Ò„û‘:Ç’ ËŒ÷¤ÛªØh±‡‹”K¡¤â@Ï‘p@´â,é¢âB£-6?Þ½•%Ùè#š‰òæírÆK˾($ÙQ@Vd—GÉ·`YÛïMX7ËkMW~¨A<ÝÜõa!ÓdAÐøB öÁ¨ˆë¢ Øí˜†ÃrÒÖ¬¨±kNøt£”–l|gEbU]ßm‡.¡EVVäÈ(Hu<æ>Cõ³º¥øŒPMî… ÃA¸Ì£3Õ||*«Š¹RHðY+ûm€a BÍ6Ÿ>.¼¤ð—£bª¨_ðóÏ E@FkmxœKŒ-•SŽS»°ÇW ´zß›²6n®†±b^SC[ŽñXæ\Fç–#^ûŽÑ8ŠR§…ŠGÅRrü\P w!“)'22LÕ4Ì=í/®nO”¡Ä)ÌBÎHT|ƒÁêۙɘòŠyàœYYžøˆ—ëÚ1h<9™…Pn4ÍØp– u¬m²—YÉXàn%(kde¢K”ía!à…yÓœð…:ššf ž¬(#1§ôø´XQÚm`‰\je²!«`™q£xb>Š"IF*’¯LM)€”É™"“ˆªH«C=P_Wó“Õ¸;ríé™ô‡Jºû|õã5uÌë ù{ÌazUõåªKºIbµÇO°ïêqÁPÉBqÆ£ÖØ=Ž×R…©Z¡WWSÔùHè! Q8G¿\š&G‹j8òR>²â…˜%ÞÈ”æJ^íW,Fë¹Ë!ú‹MÏ#i31ÚG‘¼5cA«DK….ÕB:“… «·C>™;- Ò‰œPií¹ÀÒ»Éz. )f/gß™^a#ëÈ„“ÿÀؼÖéÇz+–îçÅ}Är(Î;C¤t)Ë1¿»¨l¯¨ä G}6+~)÷q9ÁÃÁÀW9Ù¨#Ž[^ÃÆó|yjÃijGr¹ Kûc­<Ò׳óËZNïdÌréCåŒ_ùÃQ÷—è©ì£XÏQöÓžN|Ê\k;—öü¤÷_¹´ûòpe˜úþ¼~ÂÝÿICjÿåáÅñ=ï¥ü’¿œìÏÍ]úVýBûCå‡N#>Ñ~ßâ;4`^g7¨?ÑXôš^Ôwüµtšþ–ôêé,¼Þõ¼ïæÍG_Xh=ÕÝËýøúé/ϱžO¢úò6g¹¼ÕI»?ôýt®ù&Mmµõê›sfш½³ºÖÆV±Ôjº%…/Ì¡h ÄÏZ;ýKn’¼)öqô!=Þ>“Žé*kâ ½Jë‘´'~¶ùদ!ãÈ”`»JBea‹àÒ‹±…-•”;%"à6³ô">¼nBÔZ éÅŸÅ3õnõrZö7ùõwcÙ¬Šm5Tƒ»ÜG˘1Ó DN§Nçüt6ï·ØwºŸB8–ƒýaïs9*«|’~×|ælӴФµmSºš££ý¹)µUÁES0ë":dRaÒ’à¢=T‘9åÂXA¡ •ª‰ÊãG<ú?¨¦uÆ×êxR"¢ØGv/œÇ<¦„b JA¨OÃuf™ÊÁ±É“"!/Ú‡U…ÁHƒ RŒ‘‚j À¹ÊŠhr æu :çi&4Mh¦%<l´ÕkèÇÒÌÙW–Ev3½çÉ¡™7H»Ê…ëªï±U‚èïDæâ^{¢1Ï%†âÁ¥“ϬÕç#?ûåèÕ4Úý-¤Í̯ðòóm¥xÈÑÒz¶~îþé¯×|þÙsýäú·ÿø—¹ËgBq3KÐ+¹ˆ†Œ$ëÑ×+(S}‘ÑwÙow>v1ï/ê®"¤ÊL‚ÚÃÕGßà:æðnñ£B2y>FxXÙ\ÑÑ{6VÆãÏéyÿø6™õßí¿j/®îköˆ:IÌ%9ŽŽÄN×:Tõ³ýUm•Õ‘ºhIB.ÈH•L?’ìbNÄ縡‰ÈV¼ºqé·_œI:„ЄàôOàm¿G¹¦rÐÁ¢ÔJ/Úÿ_9%ÄFEe5ˆ “åÐõoJë4Ã2\ ò׳ßsm|ß}6ù«xýÌ`™¡g³¾Æ\þÈýe¸on9UÑÑã[úü2\™éï ³¡ÙÝ‚Pœ™(Lå ¾žoô}¬#ÎõÜÔM&çlêYZl -¦5åjZX-,@RdLQ5‰â‰·ÃH7[ÜmíPcV™‘•äž¡ÑÖò;†8 ~žs±ÞŸ/‹¼«}å6Jma!Ô2Q¸)64±Ò?¸†Ã‚+__ÕV¦#lU€×¦Å–HgtÉþ›ÁújÜV6TcU/½G8\«¿I6}¦Ätÿ¼Ã~ÑYæ~ö-àlÝ#ŠXuÀhí&”lšÁŠvTVWPÒÔ Ñ|Â6½ÿ´ù5ûfþg}—j—ŸúžnÇ1EN“³¬M†ºCèt@B˜É+O¬ã˜Ý«Ôì+,’Ë‘®a…ëŠ T— ,@”@ˆHѲ|–™{~Ÿ?߆c¼€±]P™”+JÉi“¬"zÄg'}1ú†ƒ ’ŒÌOe R+Æ#pÍ_YõÂìÛl‰\1† ´kWœS6yò8{u°DÞ&ÓÑwý¹çz¶W)Èûæ™Óï/"{ñz!Ö*Ãmøƒéçì~̼£KàsYŒûª#¸Á$V“¬ÍiÙì8R…[ìîR%Sš9ÎöÐù@' å³ìEõ€X­Q–½uä1°ŸÖšßþ/ýú-ßB§áÅN*¹m}øÄKý¾¶1Éu¨ùã&yȽ (ÓJˆë:5h`pÙ­ÅÈ %°P(FÓ1Pp'ëî "ñ1âÉ:*á¦kˆb«9£ÉÑ5.ÛsÌ/Áh'øœÀ•[0I.喇Üäg:‘©ù\´nÀÄo{yFyÙrÀ.J­;qÕ´ÒßVý’]¬Sãí¶_ÀEI–YH™’‚8"²)k$y£µÇÞCX“-ùR‹ªÝÚÚ.L_/#LŸ2_º{¼Ód¸VX`)Ѹi=¾ê°‰§G@¥FFïO6ËÕðÑó˸ºmû<ÏÏ÷ûÔ^ZÉ„9›©Ï‘†ñgoÅvF•ïÑã‹Þ­k‰€cûi™îL˜:…2]r}ý‹óºä×A(ø„Δ¾<ƒÕLÄÙf8ÏÄ2àmÞh PJ]Î'aÚ UÎéYý ìsW»;Gõõ©v¸Äy²Óÿù_¡ò›55tòw·Ö£\»¡Ývï½®åsüèÖ/¯Üöñ}qÛå¿8;ÁoWùŸ¸ê›¤ÝLȧ­ã¹™Z3][›[âça½+céùãæ¬Ï8—³ìž•Kò¹_=?ßúút4V&0JC2ÃæZ¥èDÞÜT *{yWt[ª™`©µÎv5›ž QǰSž ¼çÍ×ðœßpÍS7¸wÁåò®ÖÔÕ33®Ãß'6·$¹ç•ò÷|ž¼ÚÿÄ_™Ë”¹0†xJ¦´¯pê’å/ôÕñþ.÷›\ÏðJ#Bª‚®ï¸·É’"¶ý…¾/þ:ëÏŠ»ÄØðHÜᵓ«ä7uÅÚεڥßN¯-r¡bISdÊs¾jrŸçLkÝA¬É„|Žß%SƒÝëkÁÜWøq*Ö«Ù£ø§î»§·®Ÿ\ÈOþþÚK©¯\±8Þ¢ýTßÏÙ;ùù]ncóßÏ£§h ó¡×Ðqêéø¿Ïöøt}/¸×Ìþ<¨ÊmÍîÕ—0tè»Ü˜?ßÙ}T±K¦É ¬ÐÉý·¹ýŠªè[4ý2®œSà kárŒ C]Û¬' ë³"^ vò(ª…õ»·šš³P~!֯Ǘ­Áî|]èKw¶ 1—ÝÉ(5lé«_óÞܺäÙÏ8—·*ÞT¿Ô^ ñ&²C"·uÂÌIäD¥ˆ×NŽBÅ€sl½5uñòEÿăÌäÊôÂ&ÒMë³{Q@*¸D~Nÿ6~è¸ymߢJñ¶Î1+|Æâ˜n”|Aˆf®E¸ƒÔ傆ÅÑ'‚$LjeN-Œ³ÈYz‘ìжtŠLÒ%5¦ ¹ ËOH{ƶ¿>ýãú2 6wòxóæº¶ ?ŸUö4›AÔ¾][cÍý´â¤k™ašåæâ$Ú|^{‘™ŽÀŒ8,çŒël?†Ñ¯ßÝ‡Š“ËG·rÁç.‰B£E?³ªKHѱàöNp‡0zäáôIªçqÍ\p [e3…¡Ï^xÎWÏ/íOÖîð j…ðCQçitûË·ßÓ£_¨9²ùÊr¥?×=9VØS—.Í–€­(:‚²HêãîÇc¦Ÿ/å¿ò¶oÃ}?þœï[㼤Í+¼¾’ѳa ¢GŠmn#=à£ÞeTGZ2# ‹¬F/p¸½ ef”âó‹5nôeMóÇ'Þ$¦F8½ž=7‡;:SZßA¿¬Ñ¤ ÇÃYKJ’¬ï¹»ÉEñý^ÃÙFcÇn:Ö¸v|9·ºõòì™õ<{“Þ”¼ J^¹â~“Œ{ÐPIÆm™D_]ä-ÝôªŒí¢šÌ|""çQ.òçIöQÍ-œ›²žG&ús$Ð~ÈRd8bOTŸ|àè÷Ä=Vn”#¼ŠI^Îï*}&óóΑP£¡(8f%s<£Ë(Aθ0dÐHÁNíó5‚qì¬ ³ÃÜŸ$}mkïÞHGMÂo—#Ðé0»ë§íK¦šû'¹ø“Q›ÍéÁé#€râ8„D…¤<ív8­)U—+Å{ZÁªÓÁÛБÅ0Å5ÀlhÅ&'˜Å ¸_#Ê1*Öˆ†!³Z›è¶±¨/dÀhA[¡NÊÅL[,&iëæN§zö²Oë´ªƒ °c¯°Ü¢‚Jxxc4¼dƒ™‡¥Å¡RZ\-Âpb‡T”j f¡ëà 9°—™ÚÒ¡ÔÁ- ¼¬Xä #Ii7±‹²"²`pî’Ýú'ûÂq‹§Gò)>; ‚-ÍoWö~ã §úãôŒƒ5ܸܕHžGm…"޵ŒæEyäg{Šž·*Ú+JD¬8k˜~Æu¾ßK`êv’‚;ÈsÔ"dÆAet$nɸÉ1†WF1Z \lŒTRŠ…€k X÷~~å˼âÃIf½‘æˆ$òµŠÀÀ…`sy€rÎÏYÖYpHÕ‹ÊTìË fÓ¡ aMs` 6\©¹ÃØT_.¤|ŸGßn,¸Þ¼6V‚gÀ}¢U¡ºaê‰VÕžŽü¸#ü…/_Í+|±k=܇Øþ]d#ÉŸÝ,ôùÄ28!®y ¬Éà™uC“Þä­'Ï#mÓ5·—xӶ׊˜AÅ<™”ˆ·¯Þq±PÒGM³ ÄÏh½›EšxäËX[m@YG ê®´=ýùÒu÷\Nóg¼­¶ã(´¼=dŒ£ðüI|³jfá°7ùÝ8‡ýâiãôÑ:+Ñ¡ò=LÛ^»A8|ò!{rɾS€¬žMsîÅ{kô|y°}–'c£$‚y,3½© R z_M¢éîQOÇëzžû8y<'Ãtæ64«RYíìWcÝnW;RÜùjçø<ìñ›/þêüéw®úyx÷^ý¥ÅWÝݧzÊUüÿÆÇvê®—7/ßþÕþ£sYͼÕ[]Iºý‚´ŸÕ«$^úÏçÙ£QyÃ~ñsýÉ1­4¯ïÿ¡¶?½øËû“óhgþ}Ï/ï¿jûUážÍäbšÃÍ›Eþýás¶3WNûnÕ/Š9ç©þo/ît¨Ù×ü–ó¹1ÿÇÀÞóß~æ¬h›Å¡¼·ý½‡ùç‡n9­þúíÿõ‡/Ÿ^?=êgÙE:¯1º5ûô)( Ðnvý$>_úóÕ^wûc³}ÚŽ`‚As”u‡-ŒœÛý†~yáÙ«Ö•’qÇ©0î¸å»&Žx„[ø~Äs¼è¾ Ô (éÁ$cQ£:Po®{œ7 ì²xàÁlÆ‹  h©0yó'úó½u›õÊŠeÉj £i%B•aK@£°P±C%Q˜Y<]_7ŠâNªÒ¼Ò×§åkGAÕÄÕ@Ag ?L3Õ•y¹•º¹?nðYëX›ã5¾ÑêÊSkÞÆ»ÃKuhEÕ2b™ÃŒÞ²,½@Š1£¬UA â,1þck]±ý‹@R¬À* *¨/H±bEF!%ؽzk=·öê½-ì /Ç]ˈ`d¥ HMë©r”†Ø†$˜£z¤Œ%8àTùfÉòSMÄP (»B«LsBƒ¨" 4s=ʱÎPÅ"š ‹+C…Î}Qf¯ó.Y 9»pÓ§¼Wy³ï6ÖÖ‰åè[vç,’UéõÚq_­…kÀ(â—žûªZnþ½ß>~´ãÂî™>„ƒÒZGHÆl÷ÙMB/³Àg_|÷6ýíéǶr56\óöTzÏÞéÏïûýTH6–˜¼è£cU§ ÙFÔu¹qäcI]Oÿ´:xr)È0Ö«wŸÇfÖÁOeÎÛ™×Kýòÿìºw×é>Ÿ“½žqçcÖ'º²2ÿQÞ?Ë·8vò¥Wø´èòVj%±e‚5l%‰P2ÒîΑÕ¢pêÙèeC"L鬚)¢¢±dCO"UÑPµ+Jž~)|MÒñ•ª°  ð#¸ÿý¶Kï×¶áèñƒ Ôv2 ª·©ÕW´2X"â63¢±´’ó]p'l޽±þð¡Ç,® Eá¿òµ9.YÆSÛåg¾!ƒ“ÕŠ|8~TBNÌb›ÔígVÿ·7—Úmþv4CèS.±ÉËÌjΕJý‘¡ §,d0—Ö­gDJ¡¯þú%­‘êC¼WÈêзØ`ÊyV©…Ô&‚D…ÁЦkì¦N0(da³È¾xZÖáEØŸû·÷ægss²§Ù1ÎJ¶à¢ÖEK(`^1,$åÓV'è¤ð¦æXœ‹ŒE¯ 2*™9sfAü2qY–8cŽQlW<4gk¡Æ)n1âjDR{¿{•æ¬<ë4µ"â^ •óú¦ÈnwoB^î7ü†ß½çîmÎ`Â9MÄÔId\¶×%Xà,ó¥3ȹۄ/>)‡" zà¼dF±4SåÕÜ?Ú}”’* ±r·v`üx^ÇèB\•¡ZÏå´Oº²C¾/ÆD„ìjÏ'ð¥¹ñº­Lj` 到#ÑPFw޲,éÜÓçÉ#æ}:˜CµP)QfæªïŸKT’®ÏÐãDæ:¸K­lÀü>mçð„-?±{ ø(D[˜ÆÒFçCì³–…Yhº"ŠéP×2.çéryˑƵ¡ÎBÑû!+‘HÒ¸®l¤ŒžÑ$’&*Ãhˆ,“C×Àˆ^{ú¦¾ž!ï|®M…V‹±P[’æî[Têë‘·°QÆÛ¿òo>i ÉMs©…×óŽ´(XÈx ëBÞV¤_×M6‚mÈQÒŠº:µ÷\&®°LÁ>%§´*Œ{ýß%ýퟠٻT8fA@I=gÚüú}®2½©BP4"Î2Ìz3úVí>}´lÕK&%/¨|]44^pN 6tÅ»8ÞM.}Ÿç/›}Ób+˜x›…¾Ã”€ST¡±™Ö÷ߟãç™ôZn!aødÕeKÞkD&Z•SE½šõlF˜L+sH0/ÌrŒoòª•W–•r/óaóè2ûõ9)ÿÅ™ÿ³ñ_ÿÓ™WkþAûÑé_ü‡Ë¹ ´Uõò9OϺq­^0Ñ\‹O–_ dµ ˜ZR²·¤-âHn¿¾¯#u½öœœ}Sëg—h;{»îae­Ñqóýòó)>Ö =jj¥nwX§aFÅe áBXB—!hXC{p6ämœe`ÌHÝ Mà#\Ýh™#}¯V¦SóK_6o£±óÙõzpù÷Óó¬OÏ„r ÚWâ!«‡Qöš[W5ó9±_ðõ_î_üwÔÒdÄ´®£P[ÐQøÂÿT÷{2ÖÓæp,ð&o&ÛXS 5ܰþ3¶WÑK7Vùð5žÐ)óq¿é*¾)3I<˜¡OÔE>~üæÃßÕ…¦åÉ—êÍp±™n S2…!,âÇÌîî=›'æ6íëty©8ê÷ è¢×AÏ2¡Ý»ˆò>w»Á­¹Õ¶‘KŠ:÷z,¯5(Ç2`˜8qïG ’8w µæ“úrÔ·‘1 gNtiÁƒ/ܿà 6Ñe‰Ú.ð º[<;‚¥Q¹.¿ÒèAý˰>uà˜ÀFç‚d+Ýs8«‹å4=‰ è­ƒ1î4-ª¸-ÔÙzÖ‰@çãí¯’'/ý|«¶V­ §ÙN‘´ªJœJÌ÷ø8w!{«Ûsò>K=tÅtùŽÄÀ¤Bñ"Ñi;§_¸-nË ¸«˜ç& ðò™3\ÖÉ–<}yꔽzÚÑ@íH'*”Ìôœ„wWf–ù‘ ˆx—sÁÛÉ4øAÎ ÌB©>…Ã<¯Fl®ÆX“ÄЩð‘$as:‚^C’pÒKXÑìh Wÿ”™¯@Tâñú÷ñlԙǣÕÁÔ“!S¯:ß<9ʃA4ÒmU™ Æ0ã4ÝÒD‡ˆ’ 0 bÓ™Œ´$x£‘|°y¡ÖÄ¿æ/ýh÷_Ë¿÷0}rŰIÑïä¼¢‘‰(‰è.´~fFroê¶¥xk»ëZ“Þ÷¢]_ŽÎøè&ÓÑáMÛ]XqE¤AD¦ “ïïÍö}sÒSÖ­ÜÍ/,v¾AaEÁn tìêU/(‡å¡°®&Èô­¿¾®7¯—ûˆÑk_[µëyA/Ö½&v©»ä„ÎŽ ×ä튥Rš’±/ ,xY}ô~b¶c_€3a̶¥•Qì ü?áøJž ›=± é! 4oå+RTj‰Dœ7ßMjDÅ•_9QH„êÜÎÏÖ~-œkv¿-¬èÞUÖzòS9@R°xÇýÙ“…ÐØ0Ÿ—Î 0p8ˆ vÃaÆÒÁõQâcXâ¯Å@„¸ŸýKÔÿÌ5 —C"!:UTU:ËJ{³Ï¼Ll¤Gxò9gúžY |‹Ú£o]’¦A–œqh‹DÄ òÖAÒùye'(‘‰ò ¶«ËwŒIí2·Ê¯^ú˜@4@‘Q¾lÛ!Ž‘)|¿Š÷ô˜;ÇýºbžDGG1™Ú:Š‹ñs€­÷w”qmªfõ%æøí«¨0ŒŒ¬DI¸Õ—ò¢SÍ+ÙIØ!ƒ_„3".+¦ýÚ‘uýLƒ(ÐQɡҀ¼(,š´×…­)ÊY7:C×XH€ãφ¤¦1'ƒ\PÅÜP†@MÙÊC,*Q¦„PÑ ”XD „ %ÍFa“Š!iR *©àD¦Œ$1ÁL¦&‚ï VA”Y‰‘Ø3kY^EÑn_ô'lÕ5ô`šá¬#y¬tyò´ßûW«N×›g•>ˆ–I"0kI¶iqü7 #NdP’Ô)e iXe,çeÄɈÊT*8!­, N0ß±\‰ulÚ²50!šª±5_R#êæ¸¦á>Qeï=¾-Ù& 1¬©µ•™M&›„9~ïʽхGWßOýÑ/ùÝÕý˜úëÇfûêÍ»ßý']ø—¹}u–×hcý±ž³ž'îüÎûW1ýõ«›Ÿ×ßýÕê×|ÊÏ×Öü³ã¼­> oõÏ©?÷_;ë~©ù÷óÓ½º‹÷øSúšï_—¿õÑýã¸aŪ\ôg…ª2múÖÏ6“rçù©Û§çŸNÿú7Õw4¿ÃùYÞ?N†—íý+öëhe=;ˆÍŸÞñŸõŸ¾› ÿkÿµëÿÇI®Ü(±B$­&•qÐ+B=:­ 4fc:X‚¡SéVïFQœ”¶·Hb ¬C%R áHááâÔY¿Î®ïló^úwù4ÎÅ1x(ã/»Ø—. ×°j3Ñ€gñ‚Hqsh7PKwpI—”U”ò™ü3_jð³@b“áÂ!Nêä (Ua)ZJ´$Uªä2ï’ÿhüu¸ŸÔ[g™à­ž(Kµ«Ýb•‰°|åºáÈK/ŸŠ'¯›sÏßš<~óÌù·òo^ª¦ü 7hc‰´8 M²öÊšî,mÉb"¬$²Ô Ùk‹V=äšÆ<#&L¢J†8J)Âá $}F¼­âÖê]X[™Ñy¸9€Ô•&‘” ‰N¾  ÔRˆVFÑ*P÷‰ƒ A€ýâì aU  Õ¤$‰±X6¥Ò D ¶æ ëÓµžˆÇ¾‹¨S31ÊŠÒTN½ÒaPW9ßÍþƒU³:ÿfͬ²aÿmýÏ=¬bPOl >¡ §¿ˆ§^ûWÎC.Äà×Á!R©äDz +¯æê ˆð¯t™Y5Ï¡|Ønºh»p”.ÔÌoÜ£uŽR«eR•íDg’x¥¿a?7 F¥¦7;zù")M[Q…èÆáí>`}Zãų¼>0 õ µÞñÐvÚdß ÷z&9úºždb³ëã£Æ¸²!۫튫@3á]›Üåi¦MòKf§XÖÈëw”¯,…G+¯,ê°Nª´c±‚`¼Ôh(ÉÝà•&H.#Šxä(¤ãŸ(ócäãÏi*ÇëîªZÊZP¼Ðð=ÓñÙ0EB€aW.Jw,>¯Qb¢ã*Zã‡?+ªzHfV'÷·¸¼,‰ aÛÏS×Uà~9+xù¬åÑ#ºÊ·úµM º§N·î8ÙÝ,h˜|°¯ŒOÏùÅñLÍ3aÈ78îu{0 ]¼hŠÄLlR4åÚª1w+%ÄݘÏd$ºÌRjP"[U®LoÄ®&µœ^ßt\3MWhp_0 ¯Ht<±*&E³ÖÈQ)ÏÕÍ %Í•åd&²Ì2-Ufž¼møK4öý»óWÅöË÷©~ÎOöñ™‚©žÇ3”KV¶îÓKïvÓµè|Á°Ãòö¡^¤gûOÅÏ—ë÷øYŒ“Í–N]I¦íF0|æº »·„üÆnîF–6é&â ‘’0gÓ¡}RŸÜStŠùjÎŒoî½Êa“â>$aèkèÚSåÊ|uýÁn”×eoå>—Ÿ«”ñF· %N¡n0°"•il©mî•æôU`ÆÖöóϕͻϹŽçëU*ÁÞÓJKÍŸ«óù Úòþߟ7{a0Å57¸X ”PrÎ÷?ÿyþ·òã‹uRê†ê™ÈÇí×›c¯"Kû®œ÷({£AÔC…åܺQü†të‰g9-«d¨×ÙzGAE\ÀV†eÈhÕ9p %ø~~:äõîwÞ•aÑh1W€IrÔjCSÔ—Šœ%TD€p…ïãCâ¹B[ %¿,Sφ:™os>rŒý¸ùÎst8vÕ0‡Í®ùùÞÏ-kÄÆ®gcyHÏ=ÄULÙÛs Zdƒ ÌYŒzvˆ• +lÂÆ[]çk{–Aï`mRà€0ìhΆH£zÒçJë5ÕxJ¶T}A÷ngÄX –\F•A‘a„2T…å›LK­‚Ž /x€DVz„]V” zÆÔåm[ ©5ìeMƒk?ãæ¦¶{åõy³gJ¯Xº7ënÁ!(ˆ æ7²1ÑTŠiÀ.ÌUìi™CUÂtý1/t½v%j£l4=Ðd’Èr÷ñ~~^¾ÎÌÚU®\@+ÚFi{öuÍ·QñHXEÙÐ åö>õð÷¼þsùþþôå/?ûSöù×»Æ×D:ª·À©iÁ™¼òQ¹SÞû™QþÍÏÉÅó~ô§§ùýƒD|âeÊ•¶(Š\ʯרØï›}]»"’“)³¢r ©G—çÊÅ)¹ 6à•@ —‚úª…±“óg‘j|×àºè#ñHWÞþðzaëɼéü›q:øÇÿâÎÿIV6º¬q‹Þ|ëíîâ’<ͽe•GÅ~‹«?~ðB±•ªÈ¡-ø‘~êö˜•†9‡:~*%s óÇ÷¿½Èkì¯/ók÷Ùáä?·',>«4[Ëå“uŒ}D1CFh#7¬ “0‘œ‡âŽÜà *wà-¦z1»Hé(^ê³™ uIîÈaµŽ§¼ô›½ª÷ÛÛ磽¦ \²<§;MoÉçTvë.]=ó…Þ©ÙˆkE5‹—f§¨íìííÇg—_¶¨ü…ýèdÌ×°-¯ë÷Ê Ÿ+íp¡« ‰€…à w'9ºÿûºÊ ¯ƒ/ºE•˜Œî}pX¬Ÿ¤µ-JyM:øýéÑšv‚¢PÞ:[0Z‹0+äž‹—ß|U®a±2^êF×ãÄ2lw^¨p$¦iEÌ|ï·ï3 \þiÍÞ~yYÅKÓ¹ÈÇ›Û÷5;Ú¼†¶ºÏfc Bž¦çOÃêñàvým®·e›ýéµkÿ™+ÏåíµŽE_˜Çýwu§cÇ‘¼­'œÓ½‹5'Ö¦ÍUŠ¢ŒÐô‰R9¨/`æ:f• JžÏ@Ÿ%Œ7,§V †,´ ÅÆŽ\QO«ëL²XÎö/ÝñáÇÑÀ”¶×öœÏúgýòÒ±ªÇØ_žðÄ^”\sû<7û›¨ô7¨åMÜÀò±¯}ì¹½mãK”ºvéÅt»4ÞÿB>ùöÉŸ½÷Ý]KgÔþk@ÿP\‹1‹n(A›htª’ìgŒ¾ õs¸‚ Ï@ÿ;) "œ²ßYwP…ùÌBòÌÆï€OÑp”0Ø_ÊÒ€„}<Þl¨â‚ßÖ\§#%»ö+öi&*6ˆ»ér·<çºNR£›ÝÏžªS?òæsÀ7‡3±b5¶±Y£ý›ûžÙÿ¸‚t¤ˆ=½2üç<‰CÕj_?ÊÚÉ"iG°DyH#sŒU§èI4†e(gWÑ0¿ÇÓP¼Fî;Z,%C–5m¸$(3Òà†k0i壎ó3ЊÖ(*jH+0Œ‘@9h äÀ„ȵdÃZ`i"šÍE³J–-G&Åp¥«ˆCìÂ‘ÌØkE2!:$+ƒÄÅõUoÖeŸìßÎP¯·Þý::÷¤Št<ÜX|{žQ5fµãÛX^ÁÏzÉ£³™§r“+(w–¥3Ã#œÅüõ9_Ä+“;ͦx[ÃñlÉDS~ìdZ ½Ä\ Îq´bý© Ä™$N L”J²'%0¤H†¥dðZîp¿!<ŸÐÍèD S,)L%B ³ðmH†ÐPUç1I¹í‰„tÉ„E(DNúÈ-ŽQÜÃn(  —RlÖ–väž!±ˆš¥ÃD^ª.Èå´ËzÞÌÁ%Çh‡½z›aÆ„)˜š»±÷áëpr;\Ñ‚½¹Ø»rë[Þºº¸wìÇÃn2¶¬Îʲ*þò1'õ1oëiË•†‹‹áö,¦¢–…œµªß'G-º{ÁÝççíÆÂ[H™ººç,íϸ™ý$ø¹åƒjJÒÙz b¥,‘3ºiOƒAq€†*ðÓܶ+å´ãÏc)PXN6e¸ŽØ^Óýz$†Aö zýúåõRñâ^𥶛êê©sßâN¶ÈêéÖÍ>ô>ª\Uª×3¸ÃÚ7Éuýœb’l†±¾_í)ä\«­¸íý‡ùxWKØÇ¹*~_ ½Ø·Ï¼ÖèúVÎ/GÐÏW×ÏWMù[õ_¼×÷}¼§Û¿{Ò|ö×ÑÍ]aæÏ•~ý”ùKw3îã´÷7üG_›¿¨Ï·¾~|÷5?ò³Gß;äñÕ·nn==iæw¶¾~%Åî¾Á‚ëü |ùZÏï}Ëoóóé“‚\pæÜ›¾ï¦hÀÞ髎ô)¬ÆgF-ËC4ñ‹ ¨4O2çN¦jÇwm~Kñáçâåè)}bC¿Q¸/eNA4 `–!^‚!%HjVU˜âÀ‰æ ¸픺›P”"Œ Š´R@ÈSL*f´@À0´ÿéûߺ¹?&T*t×r[ŠI$’B¿AîB^ŽÇ〪5ÛPCH^ERÒ9Ýš´I” °¨D[0(„õÕyÃ|¾)”S¯!lD_õKù¹wS·ï‰sÖAµD]T¡?D¿EŠÇ{T×›ªë:f in¦{˸ŒÿŽs'¾¸æ¯©;ÅÆ¨¿CktìiAsÉ£fe©H™-¼Ä`#$wy«aù¿®~eeL ·3Wh]¨(a(±#w|2¡ Qžá[j¢7YIÓñD<”ýIL¤õO‘ÿ£Ÿj€f¼­6ùÍ5i?_ĉŽfƒ‡¼À Œ3yNUü¶¿~—þ —ó•VÝ­S‡× c{Eu£¹&Æ¨Ô Aï”ÍA·\3´pøî­˜c§n"ëlXúÖsÇ2üΉã1ˆÅ‚vEV´CTÍ:ÓûVƒêu’«oG/ßTHÊÍ%"aÛ7sÕªÐH!ÖbÃ,ÍZqg–Ü®¼ù‹*Ùƒ¢$Œ•©È“ìuEÍO¹”|>D­rxÒ¯ <ù\o¹~l5a&U&5–3`C'3 Žc´e!®frFÎÜ /†r>»ÿä÷ëíùÍüÓù"¥Ý9ì9¬EëÎ5¿7ô{Äôºö¯}¶{²µŸ.]Ϊ¶Íׇý·Ú÷GÚOþþp|U÷¹ÙÃ'[©±4¦úËGçÓ/¡‹¥M‘"gð9É>¶E>”Ý„j,í8ˆ†zRæNò5ãò³ “³1Gæ07€>¿ƒÜù;ί-î싳pëËXã»eÕ Z.Jz®Äê|^éÞ.õäøD®4!þž’~Y,¨s#AO­:ð]>›œß<\™S¶ ­pMF)ÅzDœ’-Bx¿ ç”TgV‚¼Êu^Ë[öÌf]ì"tf’« \7ˆ«"YC)ÛRí÷ž^V_¹¤â:ÇÞLÄ%h¨ª¶î>ÉE¬ÐQ!äœ8Á”ðéuhæjBÜ¢EJîÃÏxe“Œ‚¦-óR§jÅ€ÆÝó›¿sd¿ŸŽãÚ¬;ÞÀ(âÅÌûò²þöÈÁÌ W€ìì{ç~ÕW=:±—,¶({sNÑ6_g} XÝ:ýŒ‹‘êÄøóÌ6âvv)ÒTè(Ø/W~¯Ñº<Ö-YC‹¶¤ò±(7]Ù³h•º„"¦˜ºÔEùz£ÕÓxt©pw®& ¬Ù“{¹sÞW\„ª]Þi×AÉg9Wê™ÉZñ½ªz©Új÷JM"ÞF9”xá}ˆi½ÚJi^ˆtç¹SJ"&@åz³Yn&˜Ý*Vbvê˜1Ç£€¦)&ÖR=KßåQ¾#â xÂ&qB1¸ÜŠ{&=g“Í+oßóZ¸˜» ´€$Æ0c‰f@¦Ñ $‚#¥€ôýÁF„ûñÇús~˪op7”™ŠQ§J&ª± |Îjĸò¹§3{ù5>h¾æzò{ПÞ8M¹Áoéx+ Fx°`Œxá ½"íàŽ[÷/¹r^ H–dƒ)•!àËœ3 “o{°~ô÷szwæŸ`tÛÿøpû çZSüR¸. ÂO üâ¯zø?ëÿk?YüÕŸLeÙêÍØÉ¾›¬2o«~ °úâí.o£PÐë–®Ó ×TÐ~˜<½ל +œã®¿É{<1ú«Wó—Þühþ_YøŸò|תýçÓüüÒzXOŽe‘‹ªK$SK4²µ‰]Šv ~ d©z¡|Ñ0Å4†nBâ¢mQþØñß$ñ· þ ‹17Àø˜¿ßwð'À eÉ¢ƒÔ¸³õ!ÏÒ(_ KÂ"4t Z&‘ò 6‰KJÁíŒÜ8ˆNHÅIp)̶!m®.räfô5ZV²´UÔÊ(eÄq½1«Ó :(€FM+—êÅ`Ù!@mdâ&†=H h°ø‡†®1Ú™.[憻Ûhoýì–g/ûfú2Ú2~ƒÎFxuвI9³QÓQ¨´-¼·ê‹ÏV BϸÔZÓé6~ëm Ý‘©qôÿ”Etùh_?±Œš¦_hþÊ9 ›Z&>ÌÝÆüÖP`îõd‘Œ·æßÔþBݶÆÏwþOmù@þ›:u;ë­)‚Ç”e“Úeü¶pór†b“Ý9?Ãy>®­¡öƒª†*õ”—ƒµ·åþ´ ŸÑK-úúè0óß?O~^l\ŒG‹Ä´a¿rhïP Ï*ËO ‚ã1ÌÓ‹6¶‹&aÂ*2iÛÄ»[â[Š[3‹ha4„Ä5–9S-Œ*:%=T‘Ì®ìï|8EE?Îlã-OhKk‚È’¶Q ùኋj3[a%ÇH¾ð-H³­BS8‰Uáèõôd{ðìYc&ýý£’éêÈ—oÊs¼´®9¿×µíøææ ÓÁêFs+ ]¹™ˆ o90ÇîØÞoŒ’±Í sûعêà[ùñÓ[ÿô$¶ŽÌ*9ý†^­c+þÈs¼Ï’º2¶1ÚÝã\½}‘»k/=(^œóî°°2r¾si[M5ŒÎ1¬&ÃåQènÅd89ïØd&¤c@Rêúªø7¯kñ9 äèÞþ´f…‡á"êŒpWe:c|( ø³]°új Ÿç#±¼E§Iç :$°m"18[Ɉ³&hŸÆ¢—5 3Îi½öÔ`úÞ1Ó¶x·ÈÎÂq‚RÀ, p—øiÇ{fžµ¹ÄÆÓ±—ÃzdÀᇌ|û„P‹¤?L´Ô:D¬}H±ØŽzçûåôü`Íé‰ ,®LÕõŽ Jïž‚kLå©§€)m6]Ç}Êkå{ÛsTc{jk¿Ÿr}0HHîØ\Êcç‘æ5?º3Z¡änÅD‡"2Ñr!´ÄKr….lšúZèEŸ—+ ˜³°DعTéܯ±+Ü(#/hémĦ^¥Pl‚ k”^ã Fí9n?úçoÓ« ‘_×_n‹â§Ë`e»~ÑÝ}ýdì×Ï‘O&ÛäçŸû{äµøÅì;Äkþêÿê7ûáÞýò1{úy2y¼ê'õçøëË`#6צ7g[åÚïgã;ÚÓmiB iƒ7qSÎQN x'$i!¼V§Ã{ó«sç|W÷ênF±¿-LÄ‘q=2;bø"BÇÈá/;= éÂ6öï~韟5W¤$ H½fñB¢ ³€ J0‰Ä PJ§b"[$’@, 8 hD‹DV6æ1gù)žÄÛäM°¸C¾sÏËÙq{ˆ‡Û¾qÝú¶ŠÃw)TS.x3±iï¨l Ä}58Z¬¶ ËR£íÇ®„Ä´ÇìîÒðI…¿úØÈ±v¯‰»æ0CA¾¬‚¬‡yJIžÍQ ÄHn“Ÿ]½D=iÈ)à–ŠjÃiϵZ3ÆŽr[„¾®k\lúëz/ƒŽ°ælAMÔUåÌÐ+;âÜ„1d®üJSùÛƒ¢QW3¨"W¤` ÎEX*Mn(ŠÌ–~ CT¬D^`µ51d Á2) (ȈFcøØøäûJ>Ö­õÑȨ@D!@Ñ€@Î?éÂcˆ˜¡÷ÖîŽÐò2”19xkúUº ÔÙ¦­ò«â"|#Àêk9_ç=ö8:N3-9yч_ËXCÞo—bçã6;³œ£ÅϾޕØ*T÷¤>¢´7É©Àfè@Y…‰–¸Ú¦½ƒV•îLO;¶U¬SÇQC§ÔÍe%š[ëߎ÷/…|½¦sÜÄwâí)îÊåà2SÂà¡ Q®Á5mön±ç<”œ÷Wó­Æ—­lI4ŸCòε‹Ú+»N§³µ®[pt¥%ËɩߞöZÍD›Ñ×¹÷Y·Íµ` ¥¢ü<¯˜ˆë?Ç@Öÿβüô³f7o5ø8å7È@²—W9Y­xàÕáë¦Ô!A¾6?||ilð‘“3„~Æ2è$ÎS¨–ï»:š¼‡Ûª(’¿ôïýÙóÊzä½ýÊV]—Ó¦©ÐÆ«¬‹Ðb/BÉiˆ&òÜBkšò^t–Á„³v™Ø¬ì\;ÍOªë¢¿òD’ñ§³!¾Ķ}Ÿcîëë¦ß zžë€†èÜ<QÍÕ@w­QµôÜ6»g;K¤ª-€ŽRQu… F@œò„Uî³w{ÝKÃ,©û0 Æ‘ ù*:¢É”TR›•””’JЉ*B£Ö‹ª•¸,`„‰4½™·A}^\ÿþ¬W{ƒДPï¸å›å” d‡ªžªˆ»,çÁ9À¨8IÍÎe\nuc2Ó`ëx¹‹¦^pŒt‰ øOp²ß£ü¡¾#ùÁ·wo8îÇ®@KÐa ´«ƒ á$*­>ΗœËáÒJZJ”¸µA*ÒZ A¨hbIšèš&ËY޽ŠÊÀ¶k¿ÒDhP!…@¯hrr¢EÇZ$éí~Ù{_°¿ÆÇiRaÆ>ŸÌèÅZ[‹!Jh¤‚&H"A]àZ \ш—LЍ8È`Åh:¾@•a€¶uŠƒVmj>§õü=ßüÛ¿òοï_~ë}w1p£¸ @Vƒ®¯—¼x^ú÷›ÓÅ9k11U®KÕIE{]R·†ì‰ gú_EÆõÇ7Øg§ŸnV½ù0ƒõÈ‘¹Z²R»ÎØ \¥0%3qɲA“õ9þdSÔ{{Ù®fòeA•ÝàH~e@PN X’q¿üÆãÜø_Ç´–Î>»8~÷ùj¡óƯ}P&ôržWðCéçþ…müåïœØW”¼Æzížß±«z’7J}´œ‡Ã>G«á´S-%‡"b+{'[MŒåÌTþzð)¡Ù?ŸÅµ_ñÑ'gÿž7ÿÏëì?Únª£VlOÖ¡`ˆ¤U¦0ЉE˜j(C¬\@ŠÐ\lŠuZ—¤­xŠ*b@0ƒJÌ !¹ÙŠ-T‚­¼}Ï(Ç£ý¸©D…’[Ý#<Êa…À´QL,<ž1ÑÒ’³X T-'áJOô#G ‹Ör*͆I³B0|or“<”ìÉ0Ñ&š šÝŽƒœ%= ‡€»&6 Å¥­Wr³þ–Á–ü,¼Gs{]Çÿg§¿ó†‚imu½ÃŸM™½HXå››’¦Ã"bà§åOá.X[‡©³ˆCô2ã¨,Eÿ—ˆþªßs]"«Eʦ·Øœ75tÜ%oˆFEzW{*ß8ÌX<èg§½]]»L{l\CŸi\Ì]-=ݽH©M ¨«0¿fs®ƒ¬Æ±Ó32bÑe*Lÿ€¬‘Úú&‡B>wüZÞ ófýË|!÷±¿êüŸçÞ¿Áý—=óÏ<ÙoÛȱ$Úc¹Õ1Îå\i´Ã饊ò-õGŒ†kÅÀ1ù€KCw l¹èªß’|u>¹ëŒÙ—ä l§•˜‹{ù˜»M|{òò¾6‰Šðe;ÄØ€`\:±cK¤i­ lœ¨…qËe#³e†’Ð]8ÊEA*XðR|ÙAj†è‘â9ømu™A·²£`4,ðM>Ü&µ‚E Ëd;ÑXªív&‚ 89ºä€D(µÅ)¡›/ÂS÷÷kt÷Øû6_ï¯ ž–"¦Ø hf ³à€ÌÛw™ÉÆí©¢Ø­¶!á8n˲W÷æ%òƒ±tiþ‡Û­?˜ñžÛ3R²>rTw®û–hÌ/ËtÀP´”n}uý O>f;{+¼êçÎý3ê l»×9;³†Ô²µü…SÜ?àN…í 7Ó¤Á¦=×Ù~±¬ÑÙW*vŽdð!D´9îËhb޲<:à”×¶`_MïKãDî+*âŽAãcŽ„}XÓ^ìËóÜNV­E`lXÞ S’ô˜t¤*Ш4ÕMîéÅ’,ïR-³ŠûÅÊ>ʳ÷Ð}Ó0Ô«“LQ¨=V¢éÔØnÉ f=ÆÐAÓè’|ï— ë9Z]{nßö™MGƒ`ßa8QËxã9ݰ½µY‡ùŒ±Í•æ$£8{…³Tò;´Š[_Ƹ1n“¨Q­ÈK¬(iî°•QL®hÌH®àƶàªù=:WºÑRÙÅ‚^&RXfc@"Xœè9;wz*\‰oÌÒ _зïÊJ§jò(· ð 'M<Ú<×Û;Ù¿¼¾áy"§©Tó’[áã¹*"³÷Aºw®…ê:ÁBˆM][½_ÝÕüÍÔûÇ_zöÁ¿øu6—{çµg/ÏïÏÕëQe&;³¶qÃöÖ=¥UiûÞH©˜éЮ>µ$a§t•@fØÙÜNHzq&¤àZ‹û]ÔaÏþfpÅš°çyô9öÜÀD¥¶Ðž·ÓI‘dBU,VØ‹ŒQÐD1²rØ z"YÈx-zDÁ R/ ÅkýNðädÿ@€wОaGLj¸¤(³ÎŽËU®‡eÀÛu<½6yUÁ•¾ ý­g‡fû#'ÿ`<Ããà ;ÇG’U‡Xbí°ÂªM&Ö ÷9gþI°l®{]¤²,jÅ0"Žx'³JV ¼€ÅK¹ óÆ‘Œ*˜¢]㻬p¦ã9)w7òTÁJ¯^XHÓ@ ›ø·ic•µ–Ò­E1A’”yP „¤\# l%&Q'™P`IÃ,$»ü¼ê˜½¡»³GëµÀ˜²DXR‚`[»µ^ùzu_÷Wµ6¡Ê¤!홚€¼>ÍÙ+ÕµÊ)tn*  ¹ì¬Huâ(nmÒs¹×-O$üàœ:Áh0Å}Ž«·=LYYÞjJ>ªóêýÔŸ§ÛsðÞnÖÙ©ŽærFó€<ó߿ؿ»,#¢•F8¨)¢e-j 53Äܲ­Ã´±(6ªZ/9µ•õ ­J÷êì5ÝW×}vû'b¯ó_Å h׌Šk&@ƒ …´$•H{Ãì›ÁÚÏš¹Í0»ª(þ¤¿+¡£Û€¶W+x™ÞGÒ<*`)¯c¥ûáŒÜa IåXn¬J ÷Д-½R^kgJ öBÿëøâgüR±´mª½·jº·4Ü2<ÑŽ ð:À™ã·9W{ú³]áâyÌã}{öõ²Ò¡ìU×Q7…á5µ…ÏTŽM2ó=X ŒÛâ5)÷ñŒÅƒzäë”ÇS0–¸í^dagD5Ôb;Á`W³­‰50 K¡D@@ ¶B”…mm£t®ƒ<÷óœa/ûêú8ôo„Û¬pìºW›kT›Û¡P V! 2 …‰|j£°ÎTJ,°…`¥ ‚ÄU­‘‰£¾‚±n±ÆÙV¶Üïìõyø~Ÿsþ¦ø¼oÿø¥å&f™œLwÈÎNÙ²Ñüu®ó-ò+™/4èlíÒÑ6Ö\b¸ÏÉSp¬è‘EO º†|K4Qp7â¯>X3L êDp&»çÓ˼'÷B¢V$ ¾ úÈ/JÆ@c„â`‘LÂ;Q4ÜU­_ís^Žrz÷ü??ò¿8:mh_Œß¶üàÿŒ…˜~ì§ÿû+ÿÃп¡ñwÓo÷ÝêU#“Õ`¯8Ö¯ãY˜Fõ<ÿ³çèááýsàîmwgÕ~^k_ à%êªÍ”î T‡®Pm„3ä6)AoA/LJJ…¦x"½°£V$=[ ÄͶÏ}h3à‘ YB¨Ítƒ“ëqîévw¥Fc ; Ê *Ú'AmCíóRé}Z}ågÚy£Í‡M Õ+HZ˜é½ÒƒúÚ~H•IÙ‚+Q XqE ÖÌ÷k~ëÍp¥ 55´B/¬,fñ*‚î ,ð26.»'"Ý"ÎpÚfAoú°} ˆ)W|UÐ"Pk:e>F,4GU ´¹ æ‰sóûŒYâ¿È6œ”qßdÊw å¢Ì¶,q‚ªˆÀ”¶ EêÝ…§u+øˆ\8ÿ"âôžïò´9þ èoÄŸì;ïçÝÐ$ïxFŽ»Ÿp¸ŸåhÑy5s‰" ª LelÒN‚õŠbÙèê<÷¨ÉÚ‹¹ª‡´vÍê½h\b…UÊ’jˆ¼Ö5Ô–n“46TS1¤X{‘ 6ÊZ¸ýóY#¸Õ 9ÈW3wNI.»g[*T'“À³ÇG4æ*Ô-OçÂ5о¾_„hsZ-G‹AbŽƒoWdÊGX£EÅäÝj ‚4 m^ßÐ+b<ÿ®•o>Š™n=Ó9vVxW댓ì ôÌÞ";sZŒ–#Ì€R­¤¡Õ×O¾õžièJ]P2ó°È"ˆP„@‰r,C•BSœÿ²¢áKš™§·2ÈZs5®Ç•­£^°­q¯ê®ÖÊG˜¡·]{\Öž¤%MŒQ¢˜€‰ü:‰3ųÅ] x–¡‰û! ¨L½æ8ÓÒ€¨UHDš›¤J%WŠKq¥F¤+S¼ùBñ¯®üøÑßœÿí_¨?ø¹öc==)sMÎŽioôà×¶ ê'¶ÿ ùG—ð?ºBæD—<7¯Õ£,Ž>pà¡Ùtü¼.ŸúˉÜÐÖÝ­š‘nçhß#p1w&ûöîõÚ_ѯçׯ¿ŸöõþëeüùömÍM­÷ÆAD™“e—7LŒ t†VhÂXÔÀŒL`4ŽíZ1Óë±7÷vÂ|³’…H  ëÀõK•ƒDî̓r¿üd½%~4yéZ† 8M)$‚™62d¢@]!®ñ ¨ËôÖIÆ–«R¨Ú>j¸hµPLÙLYuº#²H”Í"m *^H$y½3 ´Kßà]ôO¶®ÁXÎíÝÛ&ÄÝÍÆ!ï“÷•Æ3ËÎ…X`Z¶]íÁô—zÕt6s$†bvݦšO„Ýç†úÑq HF û`RDOãþ¥ö?^FþÅ^çh4­ÈßWôŸRÆhí‘͹¯mËcœWÿÑqÞ¼™–YŠ¡š43µòѽ®oGo‹cÛ|Ûùqo&øðÓChBÖ°z²çL‡A®ƒ¯àóà/hŒ;ûpu$|z»š=…Ae¬Ñ«ñóÄÛŸîkn}s™†æ„žú8N=6GBªIè‡%œK½Yû'.Q¿ƒ h¥‚N›ÓÑòttêƒì..dFK˽%z±ý@dÜÜ[…E7.{ëôX‹ÛsþÖQ\04G{…É=*ÈVɪ†xIî{ÒÅÚT4Ó š›¬ª©hô$Wt“z¢†äd„$€>Ó#@Ñ"CêÚxF=fâ»ó&bÔ¹î®oÁ½ÈÎ2\$€r™ÑwpºÄI‰]f'€éÒ}ñÄe­m<þÎ6nÎ Çç9ó¬ú²aÍ%ù@ö;ëÇ çîSQ,[8LM7BõˆñV~2÷ÍZ©G/ðíö8ú{úõtkCså™§¸Võ;#ކgÃÜÂXŽ{ͧfw •ž9¯¨Úð&z€¼wq»^Ç6!©5¼eŒ¯óGÈ«}?ˆ™ÒÎÑ…›Q3Á›Ç[oákJÞ`›=§Pà.Çi¬»ŒçP–Ù8G—ImíkÈQ—|~ÇF‡bßó¹¤î¹ÞsÖ“í|?m¹q¼Çîz6ãqod¯?ædÝu@¯œŠÞ7-èW!½ŽBQÍè`;Yâz e0Þ òÜ‘Ùe+'ÈmŽ’-íÒeަ …ë ›²u´ M¢ª¨DRm²®çÆuâ.G«öÁ0;í$z¬ 4$Ègôlsc† í#¢%°8Ú.Øý9Ý›µ ^œÅ¤8ËV0ˆ„‡3tZ}G~”Òƒ3ßÇ™%”ƒp‹® ;"Äac€i…{©@µÆÄ ¸ S€ ÎY`F\Ê«- C ¢ö*#zÒXw IÖz†=Ä0¡T¹æ5¶‘*1ÍÜÔW-w•ÀŠž9eÊ%õbÖö™¬+RÙžÊ0Å>%–t=úfó6Îõ÷:ú̱? ëT”kÝòê{›îŽúPØOôp½¿fÿÒï‡_µW¿œ|æé}èÀwZâ; áNl -}ô“¯G¤_Þî«£>ës$ÏS߸¸ÙŠ‹Å›ëø‹Z/”+w—¶ãË”öKz1²ú€zÌ€¥éK3C›`‰y‚š‡UŽÙ[“½³K¶j jó@ËKßP=1BMûUý…-É}qú­õîJÇïÞÿÜüѳùÕOú>£š!:sEqÛlÈ ²‰%˜ê  ˺G†jH€€ Ì$"–aâoÂek=1(Íåê®Éí,5#ç¦+âÿ:Û×É&1Ô¥+¡-š0*ÍÊGA8åI’š: 0#i¨Órˆ2P"llÍÁc»å¿Š¯ÿptÿ'–ìô‚ª;†Ÿ(uKÂÅ™QWrip!O¸#ë㯭.}~Ò4$Qœ°¸¬†2_O<ˆ~îèºüKοÌãÉÚ¹ëèÒPÂàÂéó(ÃÞ»"ä³KK†ÝØb›zåyÁÞŒ.á3ìÎAZvÔE®vu,*¶PÀDWÇ RP sr+= &²‰ŒI#†-„ ‡'±rF?„Þ_nýý}s¹Ü¹pvéµ{y•G òJÍqRš ¬ 5ÒF$qÒ …a¢¹¤ ×L+4B›Öt‡bƒ2e å”A(ŒS/žÊ·Ä§ƒurý±öAç:³·sÛ'·Öcs½ñž¶OçOxÇùI¢ŠŒhQÀÕÔJ‚v”³‡ml!Ԭ̾µ%š €[/€1;…ñ,§¯òÖƒpâqnNYe­â6÷'È⨕Æ~¸žì•v)5&¸ÌK™$&3Íêy~|zÿ­íé-)ÿÊüöø>ö;ÍR¯dÊ9û^Å­åÚ/ÿÏ_Í ÒÒCæu[FØeІ£•™ÎœãW*ªñ7úï ý.Å÷¬ïOƒT¿qˆb0È0ZÅM©¯ïËÕ³]‡¼}tý¹ÔñbÔDX§4~*,H¬¨Â«ÐNiRÙ3¼n\ì-Ù:¥T•4ƒµã:,ã íŸ0W0Òjçìè8Š3¸†Œ MN˜Òªª.û.81Lï·|WÏÔM ËM;vWiÉ—ˆ! 63P0™3¾L4«é’'·Òiâdv‡NPµÙ¼•\5­»‰'U²Íºµ5äÚŠ‡L"àîë~oíÆ2hv÷m´L`9•iÁG@!N4êh;•YÃQg‹IW®Áݵ"+Å5úÑ0AßÓÓêýüÈ3‰Œ›:2`âÝÑù4…wާÃeQXH˜ŠŽ«/tû³RÛ„±Á„^˜$b[KÝî²Gþ&~§0Ä “UˆR?œy•¹sgð™ÃŸÐ›zÏfhÑú¾àyîÄ.Ù1—îš[¨zHm­ æ•9ªVºa Î0œ{•t«®®ñÆbp…ïÁ÷%v ê¾YVËŠl—ß _•ÏC^½íÞ{66*«65=ò¤d;â›BÀ³ˆv\“u¹‘ŒM¢íÍý¨íqêl(x–5¨ß#âc>¼vШÒ8Qɦˆ[6ò)°m©1¼7ÜÓæ™î0(*ã•2³²Euà¯@ñy!þ,d±tëûñ|kvXqgx‚wU³í°·úʼ÷at’Tq8¼ šú›×¹Ëªô««A~Æ×ƒ;=,ãRDRPw¢‘Î*ô–=“½<û–‡æxÿ!”‡U1v ÁBrŸI½@À®Pƒ:ºm(‰·M‹SW]óé^©üºíÌJoO^žÞÛ8Š<¡ý«¾ˆ×(`š×|­æéÒm!@ƒ& ˆÁ°·EBÔQ—ÕAITµ­¥D"uÖÓŽŽÛª6OÅŠ´UÂÑ4^ „[«ÉŽF¼H¡š&R¨”â-â¬1×±¬zzªŠãg\fTÎ4íGÂ¥^Ë&ÛÔ¡=á6XŠòMk)Ž]Y©2nQÖ¥%‡Þ£n"Isz–§{}çÝboË=vFB]i2¶®‘aˆy-KJ¬ŽTÙ亡þÒÓ°™%MÅZ>ð [E;õh„E#cèJZ8ÓŒf€¥~кwWÒ].€·JLK†ì†‡ I¼¤ˆ™†©I¨v‡Ä"Ö€Øh7äµY†šô{s3c´aÑölâx’n$)eeæ41s¸* ¤›®8 @F„Ü=-VÑ"F„Š!) 62oToB%ý$te ]…zXþÚÏ~W « ´ eÄòÉbŠ µœ?ª½Õ¾)¦»„.=¨•Ö¥=3¨op/ØÓúkú>>ÚÏWg£ã‹£€QPj¶È­&à‡^õTs*âùž>i×uJ"g¨B6û¸ó™—,~_íá ºª`y¼¯a¾Tá” HqWV>…² ãÓ€ u·Ð楳M™O˜ê íü2šGaEo£5Â{¸û´-*ù‚ªzÊËtÑr‡€0BVNmÄQ– ka-n­æÎÙùp0üÁä„ÁGXmsliÓÜi,Ÿ’T”mK‚ä±é= 4Fé -‘6´]G‚iNÜív›Z /uó†§çàÁ |ââ¹Ëâ>Û ‘(1€¶ÊÝ£ùvù²åqÄVm&z/Ò¥ÄzøÑñµ \»a”9 ¹µ1½9Ã<ŠÒ$X¦}¦m Ž­Óšä®½þ7Í…LgwåŽï É==béÒAD'|l·­\á‘è#í½ÂÎâèqOÙÉÝäK%BîÛzUÎC’ëö{9¼ÿ=>1mùqüEÐÖ¾;:N»:ñíx+|­—m Z¢¿*}FzQ³¹˜£†'·/ð©Ñë¾Îp.àièÀ×AæÔøüXg`‡•®®mŽ“Nì­mÉHxÉÌ(?'Þ#$÷vÆîbXCU÷p߬øÅHܯ®y¿Ïhq[ð´›|^0¯_†Djhòù©½GR‰*ªªÛSW×kŠ›‘æô`”´WÄôb—fužko~ÚzÁõgÇó‹v3€WÔÛ-öÈn¾ÉÕU‘òŸÄñ 6˜ Õæ»]å Üwv­Ý%[^v õ¹.IÙò"êñ´ö·›X>Vã¡›Ûf:—×»o{šÏÁ¬^ÀâDA¶„x2MiÜ,óa¶¬žíÖíûúmÇ‹þóqüLÿÂàÙm-lÝ’ûÆ´Ä‘® òCH(’ŠŸšŒ£ ®Æ‚BL0 °è´ò;M{¯Úü¸œŸÿxÛõç‹ñù¤í‘»ú%p?#î½úÛ7¥ÂjuŸ×Jt¿¬né^š€›¯~Øçôm?œ4~ÇŽ$m!FµÎìß™õ†\‚Îl 21…´c§4i‹®—Y?ƒ{½!EaÁqL‚=uØ)–(8…[½Ó¾Ï(¯ÞíùÝeDÔh Åû.Ø^ lÌ4P‘_‚‹Hh{Ý~¤­¾~òñ·CúÒ „&eT•³€2•Y9 ŠŸ^ö\ß,ÍÒí>ÎzÚÅ‘4§oÍ9ô|7J ²aŽg3ž‚8\éœËšã°»¹°ûd=ÏõµÂ9’³{u  ßÝÊtVæµ4 Ë¢‡/2ÊsNçš žtiqàb ¹üÖ\ŸèÌÇ DÚB€Ú_Å—4!í,=Ð1ÃuMX#žETG"€5*GYå ¥’íÆc…Or~ås¦ÜfÛ&ŠL¡R‰jT@# 4£bÊRUÖ+æžr;bGƒ`•ª\Òª Ù¤Ãû½LSwDŒ$¢C(‚"/BS&`‰8,åÉfçu¬ ìʲ˜"‹A%R‰×¡LO5ni#o³Hp#Q‹6»AZ ˜‚2¤*WYa—ü5Ž·\Ûõ×vXã°î¶âƒ …NhÌâ æZ%œÎ³\.‰y F&¿WrLb²a‘êoŒÿ)Q·›’ÊðjU«thK2¶Ü—¬Wõ¶ÈBß¼¦à5·Lû"5û<5À£‘šUi§æà^’ººÜ˜– ›áª½{«Kö0i¨$ÐP‰¹Q“QËRŽ,Üc+ ¤º¬õÑÅš[Äˤ$Ü*gÊ"í,Ø1QQsWõX{ef Ž8`Ž,õõàøT<%àÛv¿Bã·ÐsÄguW¾òæ想ÃûF}ò©›S¸hd¾bÎÁŽ „W9íœ/~`vÎ[Ãæ¼§þô,xŽbvóo®sþD3°~íÚ`ã¼ëQÿÛ½U¼Y  «ç{‚A åu«^Ç¥X*ÌÎ ûú@5õz2¥Þñ%‡™ÌÌÏ2«àEZ÷Žªdxí‡kÀŸ}eûe!WZñ~üòüŽñûçZÅ-ôŽÂ­Ûéu=¶‘­‡ÑFAÚbÀ%¬/yŒ‰–ž8fBÁ´G §”,ä£93ê7ìÈ?R ‹3Þh$ÆœÊcŒ0c<qzã* !´*N‘;K ¤)‹(¨ cËhÅÁñùûÓùÙç½üïøø˜3©¸ÖXÒ|KaW"ø—å'G×e»iT¦o|âõ1|öz#zðHHñ=ÎüŸÙ|ÿR6¥Oë€ò-ñjb" BmzuçùmmáÂj>0´!¹»óÚœ?²“¬)÷8Æ’±œÑ´ËO­\ž‹;ÔšRK›"¤ÊH&±h-j º‹*h¨ÐÔ 2J¦©ì¸Kζä±×gö~pqfNçsÉ\Uf 7ðŽKD ­e«É)ñ,aD „!( ¢ŠÔ™°¦p„€Èf  P0 €D¸§„WU·ë×>–—hgæë€`ÌŒs"iD±+<‡,»îדþñl_ ¾›Þ:·vgp`ª3‹p.Ós¢‘y€öÛb -B)Œ‡õ2SÊ2¶«ù’ Š´:0•?«æ¼ênÚ¯+I°>¸Bñ­ÉðÂ^-%ƒ‹ @8xbfdȲzÁÏwnÿ"˜q^ϽyÜÉx£© rÒ&4|Üû‰'ûåÿþ£ýzy³ÕßÊÔ— 92ÓYD®Ùœß»½ÛíþuæNA/}Úã3<ö7Ø„(.»ã©Ówg7h˳죿¼ÛÏÆ{Ž?XX}a²mdŒ¶yñŠ éNÞRŠFÊ€H# RˆP åœôâ.pmL•M ú íØsë@›léÌüãÅIÕ×K´×IÒŸ|¯·^:®ÛÙyù ülÎ,ŪÄá nUèr…:?½·3Ä"ét)’ãRG˜AÁò˜óøe÷ö~.óô¨1 ž%YÊ ¸Ê«¾«•±ë0‘ñµ!ß6þòr…ùÿΓ#Ÿ‹\§2XæFpJ3¬ñzHÏÛ)¶nôÂæhá$FÒï"ô)8ì •3&=á âŸ^þç/²ïs§[ËPÜ$…=k) ptiRXahó9ΧÜ{þ}ÍÎÆSί@¤éÉ>}¿œ¦%Ëð„ª)Ré©8åài¸µz(ÿ’çïyÿ¯˜cû~÷-_0Õ´‘×÷µ;/?Ö9Ë<ÂzqXºëÊbg‡[µ‰Gã°Ècˆ”ö%x ©ÅÁd)šAãV·îÒf”õQð¤k´‡A6¢a :P¡ @@ˆÄ ×H,d“£G=δ7,À{Ù3ç‡íñ,C« q‡ÑEçĻѴD4ƒ7 VeŒõ8€ÍÑÉíòÕ_9Vî"gÛ×>vNÈÑ,ªEUÑÄ  ŽHqhg$g”êsò¨Hº(ÍÐ}»çQjO5ˆ9lè8Ò—‚I4‹ ‘äÎsºïßÛ_§ÌNWlÉŠXsM-°Q•%`ˆ!ˆRFÊ‚X Èñ&ô’ÀÍ>-t­®/•Â5ºL¥[-÷ I@QÖY-|Ù§yA|A MR³¯ü‹ËÍDÉoiÈyß«0ì”35<4(`¥ŠD²æñ!s醳[€e´o¾'ùª\ þté‡Ç?ÿOŸèŸ a¯Ì;¶ýå…o¯Ééö„ìõZ/Záö”¬Vy;ä¶(· „¤—ÆÏüƒFð\3wêÉøIüê¨l%ÐìÀFˆŒ7»Öã% œŸ_Ðä¡ÉÑ~[õ ½K7Øôèì¥xq}b-DkV¤ÏENT/ã0ÉZ]àf*A`[Yá·|ÅÐè0+XÁ¨¾1Þ{ ”¬ Ý»¼wáS“ ¹ËÓ˜p® `É´_´“¡Ø©ÉMV©ÐH^t«‡ê$$rACôeÁH£câ¨éh®õ„§ª—“LΠZo?Ÿ¤„&QºaÎmrQ$d¡MFyÀÑ@—‡B!oQÃF vk|R^rµp™ ®¶ œÔ67ÜŒšQI&j#Øp†˜]dïÄgƒ«‹ÉÊbµÞµ’:•\º £„IhN3о†z¡õ%žå7=cˆJE"‡×}u¹ˆqoÛ@Èb“ãBJÍ3RAЪÑ"}aá5ð6–ÄKýíF²q¥óÛ-›•\cÈ=F¤BâôhZÖI ØŒ¿¢˜Ì‰…‰tçdԟױ×a$ÐqщhRͪ‡Ÿ&9ÈM§¼’€ ±ìs¯o-”Q €¬†Ó/Ê7¯oÄÐØ]À'CìÎøXÞg—[ÑhßÍD·MyT :é9íšÔýÞU¥š8é‚Ì¥é;”= ·p6À„Ñí,½K5]¨m›#|Z Ì@$-éAɽ€Î2iGuOiH”ÙÌ¡k3E‡‚(@tÎ,aÛã,ñ“ïhµš|y>²L}Š—IVÒA‡{ÁQ™ØJ aÜW r/1ûÐÚVªùi™˜8q9 ½ù˨™!»†«MpË$еi¨²õסËmSrYñg6;¯>¿<'ÀÚÓsé¥öJ{Ù.‡j?TßaÞÂÏcïèbÚ›QøÄí®E»AãÈÓÆq¾ sŠÇ%Ø„¥x•L åj Q޶mŽÏOüþ‚mŽ·b­Q;©›j6މf¸äO{T³iH2Ò|&£;ôXº£2Y·qÌ)ih”/»zº{sÃFz<ΧOÛ•kÛpAm‰;³/WM3Xû»Åî³~k³ý<{X«>ïR!Z™g DA» î]íh8Ñ£¨Â5Ú¿RýŒlCSv Oùr[ŧšŒÓG?_Üëtûð1ß#7´›>+¹wsE)°ÅÞ-ô}ÊÄ£ÕÌ¥j¼4¸Ü«i ʸ l£| å¢#Äœ\îàbG¤¦ÜñæÍläå!]¾ÉfX‹éTqÄð›°tÆ$Ð5\d˜Å^}nÖÆÃxëÿ:g­ø§ft™H®éJ¼YÂgš?ååã~òì{¯û¯0qsÉŸ›' µöì=fyå.|¨Ä‰e´–óqàC«§^ô0ËÝZàj°×$¯óú¨Öª¥Ü«l8À”*Ç…3åp ,?Ì@ÕxŒ&1P³æñ87±â9áº,7«Æˆ½¯çjÊpˆ ›G'#»â8w(¦$N¢©öe¦ž 1¦†™± ‘­2H’HK.59ÎÂiB¥ˆ˜@05eq¡\Ð3ŠUA#‘aêš=y;£Ö,ÚÔF>)GšIFUX"Ù®xot¼Ãèbn‰"ÆQ[HXá¥j !Ñ"BÜRHù*}ø\…W“"Þ•Rh`$–È„HÌ;IòËú|¡SjË–B"T+R˜4˜p§.ì¿vóšÎA+:²N|ØåB!Y0·©–^ž=€ñt‰d:oÑY£˜6´…j ÊH`"ª™ Yk“bð¥bÏŽw»´^å•ò-RiðPšQ?~{)Þ¢‡£w¶sà_·2Â\³CL–o 9ÛàÄYá¶­@êˆh,i–ÙrM§ R)0é™Ò‘ˆh†vȵ‡ž·]†ÒU1±teìR¨‰Öpã) FÛõVÑ:øóŽß•?3µ£ µrmGâé{‘Úp¯“Vïeo#½_ì¢ÿ':‰YÏëy52…õ©½<¾þ.Îþ>¾pù°qh×~w kÞñR•P—µ¹,#OõlIoصr¦õÉ×û™àD„žÌŒgjÁHïù!;zñãÓ¸gñy*° ¤êYfÇåY©U+ºÛzéêyÎ^¨®3¤ŽÊBÈ.®íÏã¯/Y‰g/WU£N¼åèÀNÓeÁØUcG1„Ô‡¢q@¨ Ò8 m5-+‰Dɤ€–w±Q‚N}€WFV†Ë¢(]•ÅMq •¤„Å B|æŒÐ€3(‰œR)'P¸{¾>áæ\e}énß7ÝJ|ÚTúÞ0&fPYнæãÚùèÓâˆõØKäë âˆcvòäßwõ=Åç<çä›(ÆéhÀEdÈ)IÆí¤‰øÆ¼¡wêóÿ±‰ó©­Àrùˆkq_ûŠ3#®êw8®„™·Ò5¼« €±F2Æi"9{u«S¢ÀuÄ1 XÕ… Ô™Œ3º˜"ga6:ÀÈY‰ÁF°2›·âᾞIMÄN#„€€l€B5Õ)£3cÔQD|íF¡•)<¬b©”²¶¸•µrPZé1­_ëù‰óÛÌ ="Í"“•wm«®°Yù¡¯bÿ:UÀ'^Íg”&èOT6Ö™†ZEFÐ pÆjÝ¥½{gèƒ:‰@@È4èÞòÉ/3'‡Ä˜ ‰u,ZKGùŒ²´`®SýR#°ê/:e—E$¥C30ÙäúÒë¶+»+¾LÎ<ÎßüåïÈx°}Õê3þ6½¹w÷Õßúó?ü­¿¿Œ6ó9•o¹´H%bJ5b­¹VÂ5À¿HÛ™âðß+.ë½À4‚¶çõ+Ý{B—)ÁØõ´ÞîÕôKÐ^îôÎÍ‘G;5T¬–Y‘$b¢´ÖºYtI8S^J^3CJÙ;T]zÞ<^\ÐŽ,Åûx¾ù{u_­|[ç/šà‡®ÿæÌ»FV WS—.˜óQàGÓÑýöߟ=ß+Ng ’ƒöõÑÆ}h·]ZËɃk4\˜Þù(lÔBX8‚Ì¥ìÁ–©¯ÊlÁ¬rLDLœ'jK0ÃŽ“^ÌôŽØ} Ïc¨kTáV$XÁõòŒŒvɲÑZ7-'“ÒdÎ- ±‹×ýDwSf&tÏݱŽ3[1î•kU*¾^‰ßlÎÖ¸à^¨ß¨æ‹AK!K©”V‚Ž2GÄ=Áîð¥ÀxùѼç¹Íl•,óEIŒ¤æ UÔ5i·F\Ù«¸¼a¦;éÞëï¾øŠ‰Ï.€˜ûÝöIz”X8, ÄàN%¿æëýü!ø"GÏb‹ÕZ©ÎÌ”QÜéZsûx£+Y¡š±ï½Õr;öF6¥P œ.´Ô0 PÀ€¦ éøÆðQ”‚°Ájš:ÃÐBÀ'àyÆåÈLähQW-Þf44 ꃛK3ˬ©L­Xœw ÖÞæ|ûn‡¦edÎx.6;D.á<âŸÏæÿs™? öè)~ºþºß•;‘¢Hªs(ÝóztžM#ÕPb¿—⦵ZÑwx|Íÿã7ø}òû:/|ÃxS6è«}÷ë¿Óüº¼èÍ{.êŒ m¸Æ}Òs–:çÙÉö÷Ñûò=è‰Jê=èÅ-ù¶&Õ ‚ŽU¨úV‰-š»MCiæwmËçãû|±÷¯©Ì5vr¯Âh¤óXÏl¦îJ5Õ܇œ»\+ÂJ@EN`%±+¡B¢PÐi75lÛÓÔö[¤Æ¦Q¯“%URó$‰bÃMÚV BØÄŠ(aW&d@Ñ´ÒEsï}£žÃasƒ•ºîswù€^LOկϹO|óéþP[$'ûUh’(“g9!+È“ r94Ñ]óžzYrÆÓúžÒVÎüìç´t|3=~|N´GFWH 5â™U’R"Ê´uQ6[\”º'Ì´M§ô&GzÄ0×?9úWŸRNÆ”š§bjf_K]j­ØVcj¢-¨@µ’æj&Û%(à€›³OZ¯ï™}ÌÖ%ãŽÉILÐ5ïɰ†È ÃA†ô]\੉ÎNÀM@ëpµ‰˜šmY°¸2@+Ò9f艔pB‹#=lâ2Óî?t–šèÉö2(&tNÝ sæÊܰ¶†Ažˆ¾­’W[uý ;Ïþêsxl«é6ÌóþUᎠ;¯±¨K´J†RdþUž¦²»æí—›û ¿[ïP[ª÷sœú£¡—aÜŽUæÖ¯oíÃ'ù ­©‹ç|ÌÞ\Zþ¢† X©<.¨k½ªÓ™±c Í(*†-T‚º„l’ ®˜¥Çr¤5¶i“\ªp´½*Q†æƒíãXÓ†‹"*Hˆu;ެ™U·bã‹b‹,È‚ §Qž,Ú÷–чµiCÞ@ÒDØ °¡P7*¬à{™t7šF£ñ¬òk1~¹›ÀC#ç¶ñÿïÐ!ó»$HÏa½äYÞ:lzµ§¶Ó!$´•36°‰žtåÚì­½›œ¦ £ÑŒȤl` Ý“fK°L€ ”°Ûåi°C0æÎ󯥿1Û¢Á•XÔšÊ 7U _è[ò¢ž Ré%ÄÆÇ ãâa«©AXÊm#¨–\L޶Érj!ï“£ ðnÏGªµ—u25÷¹Íï.žs³ÒwÚPªr—ºHŒ‰Ê˜öJkçzõÆ…|e(ƒÍ…þ¢UÏdø¬UwN¤ÊYz‡çP“\ –ŸÉž)ð!G… P˜Q0!ïdc†¹ O†•N6"ƒ4B LæqSv#7‚›9[Žmì ÈÜ©Ãë‘°B,£™<Ýíß;I ÅÕd‹Îu8޲IÞèãô ª/ùc@Ud·¿+>Øì¬z[Â9ýEj¤,šà€=¢ '¡§ìq¨<î8â}›©i»€ÝÜ%ü° µ¼&€¤Ñb[v#ã~^Xõ…ƒ‡Õ.4ò媿Ͳ"<¯>¢k4<³PñKwÑ„3Ù¾Gãç²Æ•}CñËmKÅö…µ¨^ú09å¬Óó ² ¾…÷rß~¯±c; t &Y³ ¼Å·àÖycDê¶ãí¥‰ýꃭn3&-ÞÚ®é+âuGÀ;Çë^Y§™ÂÎÈÑ·u'¤÷C.;.\Q§ÑNß²[œO îœxÝÓ±à`¸0žì>êÓÂ] ¹ji@~AøM±}Ñ_•ÝJÉtàÄiú,Íe óPÁt HÕ ýÑ¡§öû‡^ ·W.|3r¼©C(mŸÅ•‰sQ÷îä‚sü¯||Ùw µÏÁ€¹„ä‹F¿ §…­Gþ™í?ë¥\?ЀÑC"RYœ× ·‡àyò!üÉ(jYÃúœO0M,6‹.ºhg¡iXËTó†a$ûÕ;Ï1‰ŽmÜZ°–C±Î÷I÷Üj,2ÆêSÜfQ>›|ò¾•½ã¶¿zƒ*rQ’î%íp?,”mxi¾Ï c?ÉHA*MFL|9‰=X®b[±hìåñs‹¾FvåšÓ¦Gvg醟/ý ¥ãÓ}ÎB«ÿÝ€Ÿ™ûÜä—˜ïs3­aÝ@üñž!úMäm\äµAXKñ{G…ÜYü\%ɺóI˾ìH÷b¶F÷P RøWÂëùyçêyò[½Q+ê-æõ¥¼žœ–-7Ŷ Z+gGWlb«³jv£òªoÚÆvßúí»ùº›ÿ÷Pîê7‹sýª‹â ´uè?ðÊÄôK_b¹,Þ$Q \ÐÚ©ýh÷’a"2 HHÇ4 `ï¯çâ& Œ€uˆn†fÐiWß]sû5oc¾?ȼþ2|{>ž«Tù&{¨Óéõ®hzMYç_7|µ´¾böû½B®Ö‡Éfl¼Q†M•Ð#ö…‚ÆgÓ"ŠM`ûíE&ÙŒí;gæä,4eWC0]ekL™lÔ<Ón¡JBÊ×çŠÒn׆ŒÈêbAÄäÉMKN)Ñ´"GC0Í'*Ä>fÌ|l Cs ´‘„ÁE@ôP„r0Ç8Q8ČЂGö «aê¢JN$‹cô~L²”fÆçúÂÎ’§XsŒ4‰æD}]‡qÔ?¢ %_€°QNC7ÒÒˆ /!EÑ&,ñ²i¥òNÁJÑk)†ØýV4bŠ wêƒÍúzP&:rÉJaX2”ÂJÊH¥B¡ð‹Éõ8"ô´‹ûfgYØç¢/5’+Õ©ÎY„JH7à ù|õ´^´µÅÅÈlÊÁ²ïUÕªyPÁ*×ó±éY-à—ƒª‡sò>˜(ËÐŽeÌúreƒ#½qtâö|æ»»èÇq雚‰. CÍų?Q4H¬/¶0K&Á™¸ƒ‡Rœ ‰Ìs‡DMŽ^Ö¤ÂL£À|+N¤4 K3…YõÐ×"‡ CÜ"®É™åœ®b+Ò¾Œ/’æ žÌ´jÁ~ú²VFºÇË÷Åú`¥š{ß^=g¼¸ýÉ»²3'’JÜöùÐÙ •l-5{ÆÆCò .«ªoz¹W31û‰™™»&•€P–~Ü–OoGÛÉ­ô ó$ïõ0¼æ ÓÞT.’¼§Ûçé<—-6":fÏX¾V®ø³¦9¯f½²Bj+gÃcÕ"¯‘×.œ F G‹Ë#¹¸•1cAC º&›$MØ"5!gϼԟ•oÐJ’+l¦V3)2á;zQ‘Ê$5FŠÁ%½š·Áš[ÊÖ\‘Km—-q$Vb­ÚÓµ»:j2‰r(¨¨¢Õdb% !»M|É×òuœ÷ƒíP3KÃÌ=B+°BˆN²èýB¥ZD‡­ã%ÔµpߎÏIººXͨ*©ÞÊýüÅý~‹Ÿ©y”-0„5bÝ›–D‚ÒRPäa98Ÿ­óo¦û!Qlh$î©îYé;z ¥Æ#EÓuÁ( »²åž£hŠ€N° „†--Çhea„•âÔˆ D­HÁÈT™±EJYÍ”Sž»öú\›S‰#da«c ¶±¢Žî(ÙüȽg:ͳ¶rÖ¸8Á˜ ÄB`‹R `à`L ¡ÎT€DäÍÒL[X¤5N–áõƒ>+p®‡x'c¼Ý·_ð|ž×ŸºWÅqÏû|žó‰ù,“Ó‘MBòhçÆÚ˜g>S¿§œúÁ(&[Ë”«H¹*Œ³Yõré«açÃŒá˜àµW Œ4®&üíg¸Ó*(5¶-{8Ž-¡çíap1T¤ìKrMÆUhÀAÙ[0WD ‘Ÿ¿ØŸozU»ûñˆÿíç¯á¼W†åËêë1’„tðÑþÇÿú5î…*Ë·æÃx¤ RA,CëÙ³YMø7_wþÎ[‹a"¬Oe×OŽ`PºÏõˆ•M€N&‚#DÌäÒþ¸~ÂNŸÖgCx[žàF& ‘£tñ ^eÑWor«+ÐhLv†&M*PgY˜QCœ…åT*/Kç…Ÿ¹ÿ¸Öïùñ†t*>TF5²ªYkНÞl½Øâ+ÔSkUätbÙïªQg´«àkRöy~Ñ #$ò*æX̓]ßõQ­«§Eך¤h‘éÀ>œu.99% ^Ïqp•Âs›ÝK¼:=¢0¶Eäð“Z†Ú».ß_¡N¥R+j^”“zñ–Æ×É‹Ò_ò}û¶Nzׯױ|üJs#„á@¼”j”賤‚±CHš\:³Š|"–dò—Ê×´pB}Mh¡µÖ >^÷ìá¤%—•×Ýfw~š]âwûM›[¼0tCkÏuÌÄRÏBfÏxyƒûø¶õã<:iƒN´/Æ!‚­ÚB·Ë€ê=Ðq tEU›"áÝ/~ö}IT†Q’×Ì'à]2I/H»±¹µÖf[ìµÛ4¬€±ˆAYˆMûÂŒ=±2Ð…ï³æŽÄ±®î߃˜ÊŠ~f“ùzîêT9^q -™F¹ˆõæ“þ¿÷·€†½ÿ¡ôùÿ™û}~þÙŽÙWŸøëËü¹˜3šQOe ?ñoÞßS€3FR—h8œÏSJ.« |ˆnmw¯zÊYïyâ}ó9óOËLòŽCwègÎ<æÇùϲúãæOxù l¨¶½€ïÅ÷zo¶ãßëΜ>ÓTÊ'ãÌ6Îüv§žœHU´âºŸ^w #ÖJ‘úª3sݤ$)Ë`ˆ¥ _9v‘¨pK“å¯À–`¶ñ$¿ÖŸóp§ÜnÂ*k•:¦ø²±€\ó€B4ú@J ·7ˆU†[…³c«Ð霙3¢äZ¢@æ«Ì£æíÚÃpQ?ÆëG~ptÖ)/ƒ bî;.nýBÍqè²Q²¦9Û/Zêìþn€ OÆÚð¶ñëÁyÄ×!>qéJ$Ð)´·¿5žõ‹ShQþ2âì *®dR“ˆN÷\bˆ©ÛX¤S8ê‰ÕSS°…¢ÆV¨!¤jÆ„l’cæU¡»Sg‘ò‚‚ãÉ—àîôÚ¡Zs™a.W³MMYä8†q)Q\A¢‹›‚à«Ý:鍸¶‹h«’SYªNlÜLL< Œ×Û_®Ý‹ÏHòÜÎÈŽ»ÿ$Ý6/ QŽl9K‹ü˜Ÿ,ïˆúøøzù“Ç_)†ÓrªqV Û¸-ù,ËæVb(|\ö^Dšp…òÜ($œ!¡bN™#é@…—ËE SææNª+’€º*·úyÎ9þð<¾},ã«]ÆÄÿÅýQìdðLcü Õœ2õ=H±h<ò™µ-I‘Ö61N$Xq‰±žWÓ¤:ΗIð(ÕÔ¤£Ëí“_ÎSÏeÌÄ­p°€í@Eµ\ÉÃnìÇj™jÃËa%ÜxVVK—gÎZ-$S³ØZª)<–çޯدmoûÜ ¹<=®`¦âM‡ÀøC)Q ;‰Ð —:Ï6NXj`š]æwÙ•öf±ÍYÁiUws D2-¦kùÛîFn<Òå˜ÃצãÕ;‡UB1íàSTI„X]ž¤3ü5Ýg¡ šGS°LÆtSc>Í0[ kd&§Ç}—Ç·§ä´Ÿ†A–[6Xja_Å1£@½¥£0 @Â-”EyóíáÓûkðáÿœˆ~¦]ÒV¯o¶ìsÈâÖ8@-û¨Ýn?WgÉ¥sÈs:‰™£ÃW˜{«óB˜½[þ$5c²naƒ,­#Ç,ó´ r‹¨ÝìGgÕÓ+T‹cñ¬³ôÉèÿ²b&}3sÒÖý¢¤í2Ç¡íÅü¼ó ¾1°;¥ïùïÿÀ‚7¶ärmãt%iI©tfÛw¸¹µõZx+Ä1ç '¨ÊLúªÁ`¡Ñ©{ÞT>Œ@}y¼ºå±Ôõ\FKáÏ ç{…£Œ­Äã2¿j®¤Ý¨iyÛô'.Ãʳ¬!ˆ£ü²C›rú÷AïN|x— øž±˜t_óýÅþ­Îûƒ;¾¶¢:`!^>lmîžÚbgÊÚÇû1z‚ç±û8°ûO8N¿=˜0ßþdéB&6÷ÐD€€¯b— ‰6»¤çZ^ÏÐÕu4÷IƦM‡7ÀÖiæä«MªÞ9ª;9p“]SòÒ@E/Ú¹ÑÚ‹UÙm/63ztwËÇ34|¸Ê\ëžo´'S=œ¢ gËØÐ=Zƒ{Ú;_WÀ•–UW»„* +T6Am~}¸G™“òd[ÞF0'é’5Ô‡nvɉ]ÌcëCÈÛR ¼ÒHñÝÅÈë ·‚"6b¦Œ½ m/Ä(¦{ÀæÇC.{ÿãCh9ûb?.[ðÞ`«wõÙ÷B÷æ¦H*ø÷—QqµêŽÍnæ¹gÃ5Û®¨uëz}ÎÚpˆ5Ñ›jaïz®†Ó`¶oƒÿßlý Ñ,gåŽâ¾|£0€3ÀtfŽäuòÜ‘ý—@ÓŸÌF:Câ„1ÊÊ½Ý·ÞØm*„R‚3& ‚ }14B$†”XõÛÚÂÚLã“t=??}p4£íoN¬L%z̈hîk©/á_ÏÄn‡‹ Æ ŒÖ͇UZG)‘>;ÃÕª0H—äT oJ´¿úZ3[®Æ’-n@¤9zãÕ¢«³Ç¡° “§¦;§!¿ìî+âJz¾ G NJ3žïEv\”Y>1 éæ@‡a9pª¤à>üÆ<Æ7yJ‘‹hšÀ@s`{§SæL¨†ÍÊf‘ 0Ë5Š@•°5ÁÌÏz¾3ï/Ä¿jÈkfåWû h‡Û˜í2÷O–9R‘,“—ª¢ž$³Ì¨ð{ .–ÛÁ ;°lh4Ñ€ˆ@L¤L "ÆEWY»Ï ŽÙ!IÄ Ð’–B%…28·ÐI˜˜jJË\Ê•ÂĉèÈ8¤#Œä" ì ÍëÄòÞ3Å•VJýj®Ubw0–©gõ¤$ "•Ü¢.öM½jþÚø¶ÛëÞµø‹Þ¶] ‰3=ΞR¶Q…%³ýøJ<}UŸï}Ažýpد™í÷ýüñZ¯VÓ‰¥D*€ËÚø4«©Œú8ŠÈG¾YÃCZ¥¤97¤ LcÀïã39Ÿõ“{ÀŠ–ç oÏ'=y81(a­²I<-æÒZ$­“¢Õ³Há\éÖ"±á:?`òŸUÖÏ̹EVå£ó 98ojŸ#{$¯Ú]ƒÍÉï6ihd ›åý¦t¯S­Êxc×§#›eEçº{z½¹] ø˜|ír±<Ì©‹uú£¬ÒX¸X °B/Õîc²øÕ|œ³4QUúÀ–4 cÏÙKô^_‚‰‰Š4B*z®¨Ì‚Œ+BKíÂÔûš‰SJ¬2F4bp2x­*½ SAI  Ql`Hg‰ h‰—@Œ¬`§™Z&wµèí Z{—Îõº«æ×5Å ´bh Ëò&vT|2q¼ˆu<Ô,°}»÷~{çIÊqrbê.ª[íÒ £¡‚&‚°DJL¤#:š­/ûB¨œ#Õi+(ò :1¬•hKø„}6âÔ­ Ô™‚Ó¸eÆé‚FXС…ZnåÅÿ û©šbé„\Á2@YÊj ‚˜Ô4ÎO¦fŒ¯;t5Ké ‰ᆌÛ{ŸGðù¥ŠgéTèähŽ0F ÀÖ™Ö…"f…ƒ2’˜Ñ(Ô35UQ€©[]à>›5÷¦©ãy6oŸü¾í]nÅË럥µù#°ìçÑ õÕ½éî‹ÍϽl=WŽh2ñ²ÈhÖ@*ѦP p\[¶ÛaàÄ“´R0âY‚ì”'Ží ZâH2":òS b®äþàd:b?Hã…²"$ó œ„=yU蛾 \ôƒ(ÿûü¯t¾î^µL-Ò—öEþÕ§¡ý:E]©„í;ÃB‰Š Â[ÑŠ:µ‰r·©¤"´¿¡Žü­™™‹5ͯëöùÌ©œãk¸`òÂdŽÌ[£zµNø¶ìˆ{d'¥˜³î­@±Q¸Ñµ”,ð¨@IT[ k½(#}TS pî±¾ßÞçxAø”± +¦”kåÜ.¤ç ×TܯðTË[Z¸edØ=¿´¾^_oÿBó¥\E7r|Øü4Œío[EI]?¶ÇE ‹Q­¤á¤(ÙƒSæNMÌPuGŽ 9Æ+挔@5õ{¯×XXkË`F7qØdØÔªíLÌ9ç1˜+¿â%´¦T†0 "ƒ´Ñ’è%Û±xRsAÙ­v¤¹"HØ’Œ™¶B×'W`05”W2s7x\×<è¶õvkîgʸ"T7[zÏé¶UIgªA¼:›(å@7̰Ar@&6Á6œ¬3ßæÄIÂ'Orž©—Âcþv#–ÀÒÒhHÓ]3Ifk “pˆÑÁ'mÎ)7p T× ˜Ó !cûÌ`-_€¬™¸‰L¤×’6ѺÉYå¥C˜ƒ!—¨òh§ž-̬Ãyf£ç6 z^T×Û iöld!³Ì+§½4¡ jóóZG—¦lÖuÚíû=¼óWú}Íwz°óW9†Ï–RË¡ÇOgײ²Xv_NäÞ^«6•#”§aö2ú d£ª2ó{éJ±Ž›ÉE÷»ÏNŸKŽoéåÌ"miŠs¼ÌoW?²ýì-™uæ}Ï´A¯¸á¢ 1á91¿r×¾Õ¹é³ì8F8fEâJI­{ܼ5´NÔH L³ÊÒsÕÉål§àÿ×ûrç?çiP+¶á]ôñ:jµ"[fÒj‚{f¼u@ñI¹Öfƒx âªQgÃÞ3¢ÖEË0x HPÂ*`‰r*4A©­x#U6€±PAÀ‚•k z‚het–œo]“Ë \_ëU®´§SÚÆIr=Úûp´›»cvRž™ ´ µP“¸Ì)Æ"Ê Ê÷’Ô¨Cõ2ƒjF½Q¥ÊecÕM|–ÙRyÄ*‚´x„©ð©ÐP-¤7‚ÌtÔ=œåNóÚVÒö$­T@À y§^¥áî&Û\6Þ¤z€Iu—vR§Z%¥‚T)•tСðõ]¯‰&Q–0¢Oëni›ªŒö¶l-¢ñçNmÝcAFæŠk§m -±Š%RH‹ºÓ~EElÃ|šY믪ÓÃ>Ëe{ˆôñUXt"”JÔ€6ÚèGãÍïÑÊû:··óÀc7óqÌ@çh9ѱž*¤h§ò?šªÂ‘t×öKú)Oo * |¤ÛElv²ÁÉ”þ±À¬žyTŸh»5ï¥ßØ~èW°Çy\}>}Ž-q¢r Æ>°Õp¯ù±ÜÎ͘çêu]Õ[ü`›™­X¨#D`hûRQF! !#µ¤r”(AOQLlà e.’.>±a[º²òH·Ðh<¹²X„5€#K˜,ì $t¢T0£‰AÍäâvÄøÓF §yÔdñ<¥“ÚÖã»Û&Y DÀÀu¦éC9h me¡ª^¶¯ÏŠ'þ\ŒmëÿsXtnt;×Qúü[¾7΢þ•áã°{tòÇ€–ßÎ^í¸¤Ô°—Øñ„Ó5³Ïú×Í;Ž(ÂfæÝEÅò""Ć*Ç­è*e&O×xiŸvœÎšà{~.6‚×´ÍLYà4& ƒpÂ î ˆ³=¸§:W!žÎü)zõ>jÔ„ôYp¬Çfâ€WÌj²ÒCs¼4ã‘âë’#UƒtÛ×VY;£]øÔ ñס¸Ç8Ç42iQi¨%;/#Ìu~Ò·‰€~A0zº-§jûóœÅ ŠD?ƒ‡³Õõ}Ÿ@guî¯ (-·˜CaÇ4JLG¦Ò’ä ‰XPtl!`Nê’Aüi“T•Ì;›fãLªVàNEš²OyS–A1 ~ÚþÕ¬k@Q#Ñò8˜)z––´¹ûùÚøçxï„x¹(Ó’)éÖºáÙrîÝ—µZÌcГÉk ê!'Ît¼<ŸÕó(k$ÍšûrƒÈG™X§e`½[·Z&F:ì¡¿ýû#ðºôªð‹®½À·ânª¬ã#kcà¯em -~͉“$Gò–b>¿…sÆm+ô~QäQÞ úðYuº[~È.Φ0ds¤a6dÂ[’)Û8p`|ôa(ÑY9fù*+ ÕÚ-d¤"6ÝÊ!¢TÅp‡[@ëP› P(Ç‚Ëè5ú#öŸ^½þ¤¹…¾T2esðXíj÷H",,â‘UI ²„ÀÝ<üDÔÍ.焞°¸Š”ÀìÁZ®‹2°‚LÀòËúóÛó;œƒ+I†ªl ùGYsR²œ­é’MytÎÖQ¹0½˜Š½nØh ©ŽFÊ* ™-^(Ò>X;n¯f¸é<·)èBM³êW)l2×.¬­Ù¨!Õt¼½šú¢v]Ò 0s!Y~™8÷r™óÞQŸqŽAtû}mÞÏùÅküuúúäµD]óú¾Õ2¤ ˆ †Yènö‰Övp1tEbÍ0ÒJ¡p„ -V@g€(‚y±ÜèÀLTØ2må¼úç›ßצsm¡« ´ifnÎñö>RÏšëô2¢ÛâZÕÞVgçg‹e[ÄóÁÊjì¾êÚK †/ŽÖqiü¾Ã>6¯ã©ø<©Sf;…A].XÁ™q§ CÈdiXÍå©©Tu&‚cbE4B™ÁŠy±Œ)"ŸCIb×”¯nWÕç£9~žq~ë^ã{RËK Й=›Lõ¶QCýzºöáRj†7&4#I=ãÓlšfrÆœ°ŽÎ(ÅËš®&ëþp˜¿ۻ»òÙÄMOÊÙÙÐ*a}Êwu ï–+šà!lz×wï„“§\hêòÂÝIÚ _i FîóØ!|úÆ6v&­̇6ݦöeÉRòi¼TtÐz@NmvKL™¤ ¤ó+òåcêH]ÏËL€Ó´Œ_[ÔPtsNøö}¯üqžÓ¢ËåL;gÕæþ8÷Ez=ÎöçÆ•y“I5¹î~¡? Ÿ^? õt4ñœï:ŠM0wV¼iƒp}[ôgœïfŸ«¯yo–n^ýù8€ÎkY, Âu?·F¹Ó¾Q…ÛºÏý¯Åùôñbwp«?ÀÌz¼Ì?®-ÔA¤xï«óÆnЭ'¦ž¢@¼¿ïG€¿÷ fë.™eÇ`†ØË -uõàe_´¬ó\žkì»ßÌs  ¾^áõ×|¼ÅüÆ‚è µBJ”"F3D\ªª )›ÉT¶e‰þÍÑ_öÑÄ¡6SŒ»Ì)TˆV*óÞ÷Zm]uŠ(jW@5á@D\)5b…u'n ­°GåÚR‚BF¶aO¹G÷Òr'›8™A¬*¥‰:ز‚À-Ø*ÔDÓD'·õ“¬bƆF +i:Ôö©djá€xFƒgCD+7ÐX…€¬ "ÓÒeƒEtê‚Sb¸ÍL$ 1+§÷jÃÎ"´Tïlº·—Ëx^u£˜šÖ'P TÍW<áŒ@ƒ5Q¬=!¡F„üè¨Y€àŒÑ"©Ë†<'W‚%-Å­ø™i¤bE–Ê{¦Ãu/>ÄUÙXÞw®ÍøÙ~º’žmà-lÄùñ3ôt³×îË–¹ËÚ¡X06T’"ˆ B~%^¬OûyÀ¿í«¸ üS‹ý°$“\2iõ$zC B ÓFåK¡1»ãÖíÛwz=®,Üœ;C¾û¬Ñ…Ø­´ûm3+¥ô©¹eëti‚7ŽO|lÓ¡ì*k½z–û}4><ÝÏnt1!è¥ñÇ®ÿ9Çÿ¢‘Ü@=ò<„q’<öã¾KÑç›ñèÖ‡¥?W.wÄ´¹œˆ7ªsæÔè6w~Y‚j2›YZ‰Ôd­gÝ4©´&ë |͈k`5[Q5eW$dí–¢¯I´L.ÖÅn#—;wŸð/%™› ‰‘Áef¢™fµ1÷6‰œ šÉ™&&U­G7Ížåéì‹Ó¥2òF‘…BéæŒZçÆáÉ`žižõ ÈøæÔ’÷£)’—ðÊ÷giùÒý=˜W½>·`™±¢ÆÒgÐΨᛥ7zÂ)¡”XNK¾îr ,Jå‘~j7÷\®Ìqà Ðy+ûUûæ³Êõ@ë|ô¾ò¾ôÆÅ:S\0Ò7F‡á±œ6\ÖQ‡ÃH5ãŠmÀœfšV!Ú®UœçÑx"dÌõûþdÈ8[NÜN°j«"æX[à7‚õk„ÿÙÅæf~¶`B¨…¤ToÙÃSkÄyh˜8$~ßâ¦@#³f³Q©íë…éþõÃÔícŸ#þ‚Ð6}s=>õHbË^.V=Sõõ;e^lS?yCŠÎ0îî sQ ZLr#À{zÚ±ø€7¹\'T%P— Š®g§}Ê{½ÅÃ¥òèºÀ²–~ê-ô«ÎYM›]çG°ÿEä£/¶F›±¸ˆ¡)ó¯‘C¼òæÍ¯ú* ó"cµ?•Ù ÎE•_a1~’ÇEwºg²È˜»ŽJÛC¥‡¡y-~uÎKŠ{¡}çú ËÎ'‡^ˆé4ÐÕN_×:Ñô»AÚ1…±6 ޝðñóÍwc\ËÉ(‡Gl†IÊ L¥£$A‰‰ñ²8ˆ1b5|‹…‘ÄÑcF‘ˆœ wô‚-–;Úñ›½bç´ƒ p‘+Ò¶¸ë}}Þ‰;åÑÕk7¯ê&úZ "‹Zº—L ?ÕHƆØíg»Kc­zÆf” Ë†‰g-ªº-×9>ã*@Òhá›É)5RÌL3 œQƨ²á\ÿëÃ<à£=ÅéJÂÇŽv¶N"j²³iv½%7ˆ"6HÃtXÑ2QèBǰi“ùýà”/6!|+ð6µ@€!klƒKóÒùëÉ¢i©Ð~› Ù) !4• † ›(øZpË ‡·©;OÞ3¤¯÷–¢†Âü¶­|¬sÛDîÓ_¼‡Q©ž:´—]EÄÔâåÑ3¯À¾è8ÑAËe›³CÙ«“*bíÈL H²4¶&["+Åa*P´L¦5³—² âÞ>ô–´¢¥sB®-§Ð<¤šˆBžôȦ¡¸W¡’8”½¬Ë”ñ¡öåõy­¾Î..*{ëLÔó:(‚™¨È^æÑÔ–°òƒ5×ÂIG“”G޵dzÏ` ™JMk,4ü2_mÜým¶oAœh:°¨CÅP#³‰IBÈQ k^þ¤ÛwÕ(% eXu²l¿W÷¦ü¨¤å°¥S»i<Ê:Abn˜=€!X‘–Rá«V¨°µÔÙèkšiß 7â‚-eUYSØ(‘tº PBÎHXbOl¢9ÆSèѹ‹²væ+s/–k«îêü³U®îÄùšÒ¥e I À «ÄˆœHz—‚"!()Q ’&Ú„Jøˆ…ͽ¥‡¢|»Þ+/=p†æ!ækoѵ^_=©‡I'Ò{£Mws¥R¯Ï›«×+:U£}I.cEìl_´´ùën%'_®Í"HsLVŠ‹Ýëß5B³·ÖuÌ N•:2=25Ý”ÜʪÚ‘*cYÛ RÁdvŒÌuvïUÒ,©è€Q©ûA ßÐraUÒi0×øŸq_³sÉøàѵ«‡2B#PÒP,Ï– ¨4µŒÄö#ugsÒz]æ Ô.P»‹²«¯?³DÓi+£N ‘P@ÊJU©‘áç•¾ÞæƒÔ+Pùòø¹Už„‘“€ŠF"#HbÆ(ÂDkX+i•†|‡h) H ÉjS³ü†2ŽP…íf¶ð*"cLƒr˜ºgZrÔÓ—ðs6ó"Køã‘Á\’W¨™FÆ+¿üRx‹¶ÏsÎ>?;³ºÁ9Y¯Š•-C"qC\NAª÷N¼¹BªÂ)3Ãò†°$TŒ×fš¤Š†_779k ’Ù÷Ѷ†èvÞ2Ÿ—»kZ*‰“c;£´ÒÀK9ÀÁÆU‹ €B7©†¢+E0ÀbÙ#"† ‚" |êCí›·±ùXZIÂl¨¥‘×Xc,¬š ±‡;*\{‡Lcãó§¼]»Ç]]»MàHáú³«Á%§”zûKoí\åç#.y­ç/ÛüQ2WE‘ÆeÆH0 c±:¼¸ pÖb]2Ћzì±›#K(R³nr@Ú¢Äté'Uhèr¬\%)€‹¾-€¥p©UW,SD-n¦®C.1Pãù‰•CIû*Ÿ„Níhë}«˜_LO*È)2=‚oB–}›zÝÆjq½jô=±»(—· 3xf0ºÓ°;HÄq»Ó"ËØµ3÷aQSw"Vó‚ Õ:ÎähÑEˆ ÃÉ.X”K¬A!/Ê L§¦fh”°_ñˆNÕ,Ç¥~5NØN ×y%`QÎÜ_õÖóƒäçZòe×7ï5»ëžvS3ci…^€5T`„ PˆX+ùŸsþi’¾…‹d‡›ýOºö0nH% ©HP0[<ÔbSk¶Æ²QnB&»qA¦c34eX…2šÎ0Õæeµ?`¡­ªO{E«i©ÒwY'ªº×bß°¬ èŒî˜—=Û³Oç©ó¢í<ìy’úùP6æŸMK R  t„žö¨óZƃR7E4´æíw=_©¹òÆÇ'£ÇÚx–éQ-JÐU\Ï£¨ >¹(´qê‚ïžÕŠ›ñÌ¿ÿ>ãv²‹dýú‹½|~þžû`¨«CýÀ>öòÛI33r—+òÞíö; N÷Þ{øÍç×bÖ»À wmùê¶WìMˆ‹néÕöòÅ÷4fã³<±6„Ðv^¯=oñïñúç¢{γ狼2”B;6týŠúïóG÷;æä³®¦—m¹ Ó~P%žy4kØj‚Q1H* ÊÀl°âbŽöëßî=~¾ü^CçæÆ‰:õç³WÝJ«Óž“Zß `ThEnc•hçÃK;¤xTö¹6$^¤Y°«¯  "4B"BÙÇY*0݃ìÁˆ U^$"˜hE@[•iƒú ûY³•Œã¥jPcL&d˜LRX¥ýh¬IV®U© óÏÑGÒº)ªbG®e[„i©H2*5|@4árÜŒ  %dE›»¹ ¯ý­S oô³ðYf:Å,Ú–Êä ÆxbŠd6 YNÛpPš¹i%V%<>¼[ÏŠùŒL\–V ~­îË5Æe&`9V¡FÈL!†ææiáC»–k7«´¥?o®Ný忹Îô¬˜Î^ЫÊà’ÃãÌŸZÃöûä*s—«÷K§"ÊHlPÞÚ|@ù«‘_hÉ)ÎÊÏe%ɪj¹PLzÇÀ$ì`:À,%èwîÈõàg)® ´¹:­%hì¾ä»`Ï8EìkŒÑœÊ4;0†ñ §œYʹX”ËÖ?Ê#®ÐïoÚã:=žLoï÷+ós-zµÿä‹+¨Ñƒ‘#ZÊ3ø¸¸Nܾ/wø™ïÏ8¾ü†f ­È8ŸõüKÖßßù/U~Ø(˜E-Yƒu:T ld˜7sc•´¨ã©KÁ‚6)…ÚprަË×3PBЊÆ<]ÙΨÎÊ] ¿»(^™«m¯0ÜB˜M H´í¡ÑÏcô¬ ¶Uë(ÜVHˆe¶öôÉÕ«¨cÈÅÅw9©4@Ù–¥ÀÐè¢%Ú!• "åÁhç!"¹Y¯â3ùÚûsÑ€XQðÖ‘vý…Öñ´då†Ôã “Ï©ùKëö;ÜŠ×k§H´Ë# ñ¢Õð) B{MXiH¼ûÞ §¼.§- ‹aé©ßŸò^B~äƒã£|òˆ·×$/ Ÿ!Jä a¬ñq‰Îþ*F é Z{dQ6ì(I…]+Þ8­Ö¶hØÜcAÛMŒ‹ÑмÀíÞ>imÉ•q“ôŸ¡jjSÀ2N‹Â&` k­¢ÙÑ ç";qȔъv‡ýVê[‚ ? xmÂ7âÆ ;ÏæÖ½¡I.¹ŠÁ·kÞÁµšçØå5·2íP®/ÄûÛÛNŽ<€¬–MÊ&!ípÂéL˜˜ ”E®jÓÛa›:yîT%›‘¢9F¯-qT'  ûhjaŽÇÛ¨©âèavf¢! j^o®2BßѨ`7Ú—â¹m`¯ÜÓ¶~ñܶníßì`æko:öîéx±¹á&:ÈEÄKÕSǰ”Mqû}tOáZBIVÇéZß·rô…¨Î\àÒ,ŒÍM…½‘,Ù@i¼šäBeH·Ulé%5{¤Õ5W´­.•¶ëï’û%ky¯p³Dx9>¿©–ÃÃùJp×+JÇ(GÖí·ó'îÝnRTHìðUâáCú»?ÎܵŸ9Ú<–œtÜ­ç¶ÐÐÇ*kƒA ¡a¥¨„ž¶Áž¹ê{yîÌÊ€”ˆ=¸ËEv(û´$ø´ei–j;:”/ñRóµG(6®wkQDB¨ÿ¤‡/óÞ°½ªÞ­cܪª·^µŽáy¢X×¼}—Îh—ï­³ÊcŸ[2½†Ÿbˆl 0¬øó]ÿs(9júßyãŒSiËùšÆ× ^(˜Ûa]¼w|ôln•»˜I*ÎuÁjwÔBÊ)Ì·Ù‘ç“á O€ସ솫 bJ,‰Í`T2Ä’¼“o‡ \"4W‘h4Ô=ºB§ÊU z5R"ᄬ`lh¤!T°µ´Ñ< ºAé ãqž–8Õ„sí6¡r‹ûM åÕVjË ™ ¨ÐaÜd4H˜|ÄG¥L›¥SBÛîvV_ÜWwWø–“ÑrÔS ¸dðŒ2æ¦@‰‰’@±%ŽIÈÑ4†ÂÌâDà˜Æ—r{ß>~ªÞ î¾ÌßîÝߨv´žÈ™¶#{Ëœ"õE9t€æ5YÊÌ f¥¹ACT#o°‡"„lÍ๗uq#ÿ)­µŒD.޳I·yÜw8 öê®xÕ®½àL{£³ªÉÏ5J޳…5²É6µ7±ƒÀ1Àé†.ÉìiœúY€A;(HU@#Åĸ§:ßTªÁÆjõŠÐ HAØ`DAc„µ.GŸÁ‘oö° ûHžåÞëŸíKåU¥eFЬ†­ i­TjK@) áU&Ö°êj–X%uæåHJq¸z‹<½¸DJÉ^ •‰`7£w‚³È% Ó‘²É¢°\¤å©ý8Ø«ÓÒ"i D¹úø3a(GfS>À›VÀNá!’PÀ`ZiŒý`,©òÄŒîÌl‰êP.ÉJºt&¤y¹¼â|P\Ò ÑÛãÖº®L8’*SSUOU,%V%›:î©òpmËuTøÍ:~[óYu•”NsDšæT–a« ± ™J †Éa¨E(1z„@ ,2µÈ›áU2gž­Š§—©c©ªØ&_L¤±ªdjýÇ£öuEª)Ó²N¼ð#»I†Î«ýVó¹õlGJfƒuR eŒ÷ÕüµZ¿€-¸Pˆ¢Î3ˆáÂUé¹çîòìMÁRÚ–¿š;tmöAyyÙRh²Xœ°_WDí¶³Å˜‘çSJàe½œÉIÔ y@Qañ*£–Ÿž¯µo³±ÛûàÆ7™[d{*nZ’r™©¤äÎN¹”.Óp㵂‘}!êyš¯÷}BÕ×Ñ®ûï»X¯£ns-{¿¶xÛÐ¥zpMŠTň‚®â½óó·[ôôû»¸•6m%k»ýììéi›kºE ©Æã;a…$Ž(qjTH J Vb%À¡¶:08@58¤PÚ(HÜmŽŠ(Y2¨5‚ß›f’8,‘ž’!´9ÏëÔ6¾´_Híýûކ.œEœ ±¾zø~“)8¤æÍ™ÂœðERû×™e$#›fÜÑú•‹+ðdNdîÖE¡4´‡6p§¢eŸ Ðꞯ¬o{Ív_¶2>?;e¥/0ˆd$.¬ÐyÅ)Á«Ä“Àp´F9ÁXQñ «Q ”m1€+ p¯ÃöyÄG’áD„„´P~Íõ &hº@ß]p§ÙÁ ƒ™ò-XDÈÛ¦-¬%ÆÕçzŒÎ4íÔ3®8Þ…¹Öòõ§<"ÈïñW»fÔ‹±û¢{VÏ4ó|20û°ÿhúþ tçßþkû¯‰ïõ“`úZ¨óQ*>@Æ¢Ãò8X{ÜDk•BTÛY ýjÙ‚ŠI~p ªÿ–ƒÌ`èÅ›rêU‚€‚MÒ!Õ ’8͆;4«¯ýe„¤Æƒáì KÝ’6¹×ç ßc²¡n2 ð šÀvì´ñßû“®øYé·*¿ÙÐÒ¨†AÈQ¨  ÒrîÀ•3#ð޵T>K„t§j‘^1¯cq& 4Äþ¡Yê]´¥ ¢§.¹ÂÉ-ö¼Líž&ÇU7Æ_Ã-ö ~ÀW“+Xd•($@’1¸6KáŠ[†}ãze¤ÄÊ™|F&M¤µí+öþôëEôQΠg"bfZHžÁ ‹J`!B›‹H^¬ 6|Ž SËÌ\ЦJ4YšZ%öJpÅ}\Óî sк“±›§Ê<ÁCÂÄFu9 Ò†à+AMíí|…HEÍ!†À i©,»‡Ë/;<·hVáÄ0ñ®¢©‡RÒrû>~¡Gï=W8¬7°0´ž‡¯Ó÷ÔÓŠ¹)¼1yiERð×課W/¨[i‡zß DÔc§ì¦“™O²áòñÉš[_Y †äf¢E&UV±€%g>ìÜž|Æ·4à·ƒ0Pcxzfg&ªuH©‡”­IÕ!!Ö@­DÓ2µqsbN–V`‹‘"kö1˜¹L¿Ë훤¿¿!ßÏ4ÜvP#›ŽW Âq…\†*CK±Ç§ìÝ÷u6¹Q–åq‹Øôl©m¡GcwÌiÒK‰Ù×v_1 ­ÒrÞ ž#Þ=7^ªñÚúÞÞ$;=ËÌ,ÝÚ±óÐtÒòi8ðæ~©t6_³ü„û¸i†ãkI)Þ.”Z÷Kñ3|>ú#®[º\ž7‘ŽåÿÉù·ûzuN‹øM¼-žÜ‹”¦.¾›\ÓüU|{$Çýçøüó³óçèJµ.q¯¡7Ä<#ºž©™nû¡„I¨›¼ösC‹,£ï9üíðåù<˹Â< ÇsÇîÍ|Ïòûý"×mìîPÿxìüv¾¦—•ºòÏU¯·ï^Ï-Zú76VMUŒÂˆ¬Ç€¢N”cÓŠ¸âÞ¿&Ýý-KQZ©Äz?œË+>Ä|~Œ–€¥ÛzËm»'¥²Ðjö*ó„Ä„´æ¥5ã+›µEbï¤D—³4"MV2û?XR·GÏ\Û¢'(h#¦ÑhÊ09a)Áér<äy(C ¼`; ˆY ˆ[P¤¢ºwÄêqM)(ÔMSË<“ X §CQ  1ê)X·†Qc›°äøtO·¿*•@[UÜ]ô^V׺½)F¯ÅJnW3¾âE×z…†HUlj¶ôs‰-B^‹3\#Çýš¨M×u{Õ+¿ý~³Ót=•æÂ¶¼£:PÚ‰Y4ÈZŒ+‰-Úºi8}4÷žÂËö®¶êÒW×^âRª´=ÂÌsˆ¥RÄ>ýŒ¼¹¦ïs]ºz¼£h¨¥ ÈSþEñ¦š‰r’0Ô‚A”Û@‚æ=Cg¸¸*·š0îFkŪ»ó+‚W I?~¼k{«à“ÙÔü9¶Ž"¶I^•ˆßX«øø ¾66s€YµªJ!7»‘ÀRe ›mbêðôvÆ@¼ÇÚÏÙù{•ÐÉ%„Óòd‰fvÌOéž­Q‚½äA=fÔ9Ô ?Æa!°ÖK[áj£Ä!0=ÅUgÓÎ"ÞE“âèBÿ¤#£$ e i’Ý`z§ú^µâêíbÑTò×ÔU¥‡€n¤Bp‹ÂÀ¶:›»Þ¦ë±¼øb¢sˆA›Œ Š–° •éÜ@ °h/ Ȭ(kj‰¢¡P[3,Ö&8j¨Ýå†ÜCd+ó…9.P³ÄúXcuo ~¨‰ÕC$e«šSˆhš8ˆF’*ê2ª÷òx;wl;©5åtî…ÌØƒ8¹ó)ƒº %éF±9ð£h"¢g«£ ©£ÞߪúR—ZÁ×;[uéÃÒZth ÄN´AeìÎå=›G?½œ¸üöøSÞ¿ô”vF[»6ö­K¾î^æe!àøTÛ#iN³ `—T‘%Ùds´#‚\2€ÅÃZ¬ñvN(,Ž®ñ W4g#ã³,³;ëÁ–Òµ!Ò§”Ô˜'Ò…¾4ì’wŸg*ÕÕVx›‡yFrãg{,}¬égl½“.†\T,Ù݇göÖÑ4Œã¨‡ÏûHO µn¬Ö>]Óó|¨—›ö_ij9Z¦ó¬„ûjGILùm1»¬´ÂÒ¨+–N4*Yy'¾]í+jÞbÏÔbNÝKLßuœáù/Ków2‹‘8WX0E?ìyÕ«[/MW‡ËÄBÔ6êÓ6¿­Ø}sŽ“’èÃà ) L’ A26Q¸lÈÆ~Hn«œœ3†¥uÉKUÀ4\5;dÕm»…‚˜4(ßúfŸ¼ÿ rþäØhžc÷ýyb½(óJ}ѸB–U2Ê+#Ê$2Œ"Ÿ`†œ¸tÚ 3Gn¢¹ÔK7o; Ý'a% \±ŒhmKnXÂ#¶‚s¡ÑÌâ£"Eó9Ϩ¼åb`ÜÊëdeÕÉ·@U‘(‹ Bb?¬TdR¢AK$%YX¢+²F¼„‹™¼‰.u<Îc>^‘#Ë'ížGÍ ,• ‚ Ûzϰ~J÷.ÂÛM¾‹*¿×ö™éÁ'Íœ&G!¬zÎÖPÿú¸è¡7Þ 6>„ nxÕµ´l ¦1A0©#d†‚PÀÆŒècY RÑ+ŠJÝŽI#á—Çþjû^ÿëÏÞú÷à«ò¿ïaW'#ÃH5y!jußoh' €^ð÷…q¨‘ÆCgí´ž9Ìd,+”8^׈Z¨Žê¦YEcf"ÖÈE\Š¿ëoÿÍÏyí°‡¯{cžï§×Ø&“)ì ¸xØèº)^³‰gµ§Y(€€¯dW´AÕ ¨|ÖÇ[ùýs Æ`Š­‰¤LŒJ”L÷\ŸQã.ºÖÍkuÖf?_ò°‘½F0iÜĉp¼_—S2E(N²ŽóVåµÖµ'ÜÀë7]2âºu³íEMF3ñsÆ…ó¬sÊ+ØEþxcÿ™æ×Øy#îžûôX[k›'²Óz@ÏaæMØÐ‚Æ—N‘ÊÅóü€×icñ+Þ®]”Q1pº¸Š®8†â?1E6Þ¢¿¿¼]ârûB–qͨŸ œÉ|¾ì¨58ƒ‡e[Y07¥!#qC=>]w{·àåà™úóN`t߸÷^ÿòÃüGëùüüÿþÐû¦µ§¤ÊƒI‰­(±0l Ðai,_ânÅ ¤Ù+ß…Žæ¾&Ò6&†u®x’låØ9ô“dñq^B©ÚdÛÏçJŽÀÕæ”õH¼Î`V&P¢œBUŒ :Y+E$3¨ze£s„Èm*!Æë†£â+ëÕ¬BÈz.Ý] ¤˜8–#¼ ¬0MåR&*¾’]¶‹XUÞ`XTjÊÉìՙΠ¼3÷‡·WwÀy¹;Œ­Ë®ÍwÜ^ þ—îyþ/}uàwȃ°wÂKÁE-ÅBµam#Æ¢D%…d¢·U¬u^†wTÞ]óã Ÿ#™Cé¤ Øíü ÎÙ»ãª]Ý‹}|}ò×ðÿÏþGß?Vo_ÎËX8YŽÚ6g59³ŽÅݯ8îÎc0SÒÄ»±¶²šQä!÷s™|®ÎÍ5/9}$mÈÿZ9“fÖ Tƒ XP¦ h˜Cš[ÀÜØ;4·ü3q°€C‰@ Ø’’T´ˆ¼Ó¯Tœ¥A+ · ½I§­+¦Õ®t…jÕÊÖφ=Èô:^Ÿõç?s~ïÌÕÜüØRìQŠú4{N߈†r­ˆsò¾“ޝáJ©6›uÆkÿ~ n=êGÜ7»c'÷™éC\³Õ™å~òšð}“ ŒÕR¦.ãü°<¸Ë·›“àë›tÉÝÚ2Að} ó¡h“÷Mî øQÏó‰?P߇íÔ1²Ê€=æN§eãûCûëÓÏw÷Â/À÷Ý̹D^®ú^>çË|Ÿë–ÒçkÛ¿e*¡lÉ_»N3x0³ð?:ÿZçÿuô¹|ï¥L=÷ù±½?ÎÖ›º >Žº¥ë*³í¯‘»ó‡eßq y úÕ“C<ž¯òðiNÛ÷lW¹õéG_¼ý¸3šrŸóçÊV3—eö.œUã*x3Shè[‹b›0¶@W\Í(Ò#=5ÖÞ1/YU(A"mhëªjßž¼ 73#×­û on•ËkĦ«•×PÖ¸˜šÖT‡¹ÁZ×yÄ›¶hÇ3éykû$7h Q™8öóµÝoáy?)ÏçKÇ=uô$ËÝAB»e‚E(=¬óaV9 =R B4tgÀÆt€Ø™,¸°v”÷ÍÖ62®BKÆ‘+Ö`KÁ­rI­# rKÖßÛ³@‚Ê~vF£Jàkºž^u¥VB‡ pÖª‹(Rj»µ¶¸ø+š÷¢sµµ= m,° ç²½x—;Ý^´÷É>\u¾c5Ü« ™¡ÏŪ”³è2óÌÈ@§R›j*pMÓ¤“.¸%6ã~çåk¢lmœ--^µ¬—'”À@廲.˘h.i `ãRˆžSm}ŒmúTh™èøn/ð¤ÛêF®á<$äþLøfé›ÝS»p}#,×Ìeí-Ö^e¡(ÇD@g¸ŸË†sSô½—s ¹7=†G`_&Ëá‚<‰Úü(ÕPÜ-Íç÷­ûÕgõüáÇùÃçõ!s@JN~¸sÞBÕ@˃µ&Zú®¢të^Â[ãNçÅ<ó5èüÒ‡ŸçÛüµËÿ542À¥mÜv¥g<]ç]ƨÇÍËßx¦†œÛb0mùYi?áí{UB=¤yØ= ‰¨'y—±&œéœ^áØy½Ük‹1ÒBDÅpª6$¶/CKF ÝIë„sJ~š©NmÿÔÑ×mAá§ð€=ZY?6ú™þ r¯£ïÂs'žêF§ob~p9Ðazotœ0÷êã -ü„ïÙü>×?s:`?CÊOÔ¿½1Kõ×ÛÔŒë\ÒÐ(»skðÆrêôy˜(•i°À|½Ÿ+²‡žkd7©îèíÔyY[[œ¤-ÚN•S¸…0Zrj«øyRg„BcÛ¹ðþr„{³çDÖ“ktj5ä0ûÃyÔÂmU§ÜF¦×hx¹¯ýób=î¦8ÁPmßÁ̲[“âŒøt›ã€*¯oºªî°í´ÄÝ…^)yßÖÏùë||È—“iëÌäQG;ÄG^…§ñœs[‚·! ükÁÝcX¸vYP‰õjÊzã®óׇsùë ~¬bvçÒZývÃó¸;|¯ê÷à‡:ϰÊ>:Þgú«±•¶MF]Ï&äé¥ì†ÅkbîI³‚IÊ ¼aŠjtDûJRî¢ýßZŽ½ÎŸp·+q¬úóeûûß½ÔÏÆÆéŠ`[%` Òt’潃$Z,‹ , ,¾‚ý§å£²›¥×tKëªAEré3ÚE˜ê©"1 h{™·Pšþu¡­q°_Ó)aŠ\ IEWJÞW 3¾Žbi+Èçôú¿0 ŒÁÅ#çHÆD.Ñ#¡Š{õÑÆŽ´×;‰‰TÕá§NÆ&hÙÜËnîê<Êq8TŒæ|É…’\ÄUeîmĦ·ÜøªyþUWÇÊcí©_ Ù~°ëaoÁºWcÌ“jØóÓÒ¥µ®ìÚ½ÕEù³‘¨“§#͉8ÔAVp0¦%—¡ bÀ”ˆ1H-4ÓÌ´3ðU/̺ÐEÆعFŽqU4€P—¸m6´Ë„ÅÌiµC!I¬–ÂS½ea Ä\Ü)Ñ«ƒÈ€¶N”Ô”uìa } ²y!¤55'ÔVx1Qê0•ÌìXȶ®na‡³ñ€cØ*)¡Iˆ-Wu‹(5ÈYfn2™u–ª&ŸÐIy6 %ΛôR5±]Rs’dfPbØœ¬ÜÛÁÖÀ6½rdÏEÉaäH”wì 2;îre6aÒ0: ‰1H‡lù;£'¤:ÛPiDkr?õ=ö|„ß³.T ÔŠžK‚0´±ç—(uân)TEaElqHÓK:ͽtu:ž«ñ)Á6CgÎ~UR ’Á¥ ´ÀéK¥|‰,ÂÅTÈT¡æMèMó ÷D˜Ò b,މ%“%$¸! Y¯×<¨i ¾b{zÕÎzŒ×)gXÕyˆ+…Þ ÄÚXX‹8àZ }+5÷Æù8Іi¾ô€%í5Æ·çê2i-›¸°”)•Y àÀ•‰·…Ú^9Ú0*¾’O˵XI˰(ÐÝ|ºÀª—N±m-ê`yaÙºH¹”}œ<²Ô¶hÅ(RKP’" D!° –ܵ*1ƒ¸,† Ü‘iZXå"ÅO)[GàI+øÓT÷­ƒº›bw?=«ð[³¡5ŵk«âÖë^®Åþöâáqí[ã¥lóLÛR¥à!QÇGI<+KlÀ|¢](Bm D„g€#:ŸÕ>~2þjã:/&¬º¬Í²oˆ5;õuõ2W%3‹>{9ç÷o×oÖ‹]/×US麳=OÖ©¿èwŒÒV TÙv¦,”b¸âÆ$UçÌ‡È 3æöVë嵺eV«&÷Ãï¦øU 0÷¤h‰ÊÊ‚A.BW=~àŽîøôT_1CÊÆbu^åTèusÍ–¦_S/×·½ÍµÍƦéÎö*ª ÄR^ ˆK XÀÀ‚&9MšÞ5ªËÒ b³;¯¸„©EøL!)¤J¹Þgº¼{wɧÌž¢…FÙtáúÃ^ÏùuâéOjÜ4èêÜç‡ß?þ»ö?/37^¶‰úİqi?º·¥z«î®MoêA€X… –KJ‡4£y,ùŽÄ1#¥(€ 1íJX¨ŠˆLH «X(,+1lþÚ¾¾ûëç“þÝáYï`l6ÀâX /Å"–bcØ»\'À¹î@ëã1úb;oö w%Íhmšy¹]ÝG pMµt’²Säá"¾—¯¿¹ÕÎk^Éë"ûYÓ§ñŠW¡ò¥vÔ÷WÃ(—êM¸ {f)&ÊZ M(Ž D#ü$W%_Ž\­¼¹¬ü¾˜#Â+beòöƒ¼ßúûûÃwÇoQd«“sJHªü‚,eÂ0¸×ïGm´™jðQÑ¢Jc¿¿¢†¾oK'KÍ…9[=d«Õ…rY^î>†uÁ"s¸/MEF¯g®ø£Ù;WyÞäî¿@æôXOIýŒ/2Ïûy3%—#&Ï`ÐØÁÐ]SÉ+Š<’ýÈ×°?Ünkò,mÉŠî¬A%%GþX~u_éG^Ò¦‰ÅÝywüÙÃ_Œ/ó>Ô¢ˆÈ[Ô1„\Â'–lmZ‚T¥SÔ©`ÐMýôSôûºùÍ7ð©aO6'ßÿøá{‹ïOýð'ÿ‹7þ¿|Ç·,Ø-ÕLÙš ;ÞÔŠ !jy"½þ¹þ¤¯Ç-}}Óí™FÉ'MpIê\¤@µÐKæû~oæ[>š–ݸ/O>5çhS ¼§5Râ‚ÕÓî|7_–¯±ÃIU+øf"uk¼HŽÇ¤¹Ì A4cŠ%É¢[P‚ʘÄ)%¬X –ÕïX ¹ ªAHP. ˆ,†`uá˜O´`‚)„;Z=½ñ"2 …nùèbâ‰Rtn[JX˜I'>½ÕÿwNÊÌ‹RÌ.DhEíšCƒP@4lC„ua´pµOU_ÝÞ^Y¹­EÜËYNÅ‚†&B+“Ww·Ôéáu½ÿö—~£Þ_þ»žkl|BöFœ¦t.)Ÿ£ì"“žR³Vk¾åzðÂ&]23¡\ç¦eÁáz–‘Ì<¨“ëˆÃʸgxpE-Â2‚•%9i²cþ¤ÜI¬)U/Pl0H¨RC'Z` HБ3@µRÄBY¨ 0TR­*lXmR#Î,ã(ƒs‰ï¬Ÿ£~¾‰½ûzš;þ–¬N;^õÀ(êD+M æ­(Òâa±Y¦j;ÙÇt 5¬ïáâzlD”º‘µ ²åw¶ N‡Ã*0cf7.öлLEgnÛcxqÓ@ƒyž,ˆ‚Ü£µáKægα?‡ö Æ{¿ÿïìSÛ¶Oa.{¢=<«7ñò¦ü¡_ך¿ùŠ¿h݉w}øà³jfþèÏeCBñ‘}s÷oÑü«Õxk†¦Ÿ+Mº±wy$ø“`‰ÃaÞͰ;ýì^’§ƒ-:S¯S ŸÛÿཀKÈà»ÿ»>þf¿_5·çL$°âôêÝ =!—TØÂ>V@I,:Iq l€‰ãáTu¦ë§éi½Éá\ñæº6A¬È$õ´<ë>Dq ¹œ{ßWÚZ`¼WÀfYjj2,½P&ØF­3Ð0U³¼—5(ƒQÛIù}Ÿ—¡ä$` 1qfö.³×ýäz[R`sf”2v¥j“'‰Æ`k £ËqW&ÕWî:v¸Æý*{ÜÌ®ñLOÏËEy*¥((¨iÅÀ¡Š©ƒJ8‘Õ1'˜ ¨¢k¥¹roþ\u§:ÅqÞÆ,š°ºíà: UDHp@X"¢:v¹}Äclõ°þ©Wö(ž4´su”Ôr-w€JªlGxÂëÀT¥j½µ¢D‘6µ¥u™thˆD싱ª"D¢!ˆe/ž#óÚ½U¾Ðyö‡Fk,Ç0–¢vd!EXš÷x«ÁˆÉ<x$UH{¡K b‹ü6‘þ‰Û/‹ FÛ§î¾#ú!Õë¡Û¿¡péѼñ&(DŒÚØÀŠjFt†)±s.|¹ñ¹]]ÁíuÇ/Kõ¤K.Õå˵®­ÇOÿÑ’kEóƒ»N–/?™þ⨬Öî¶ŸÍ_x¶cëu†çìÔ½"nÒæ Ø,xt¢%‹</íÕë"~™Õª„Ç8º.  î ßî¼ ÊáF¹Êä²™ò3eÿÁ³§dµPnMŠ©•ò>º™Ú éø c!ØyØù"mЏ{¦ö“ËcVºÜ£<Ü`ýÊ× >Xë KxvvÏŸÿü_aµzãsÓ€vh¤Õkµù;ö7~ùR©»ó§Y„†š C^ÍPŸW©÷­§ÏÖu6Ìyë±cí3ˆ d6×ShM¬ýõ§ì’ÜÙZíBe;¼kÈ\Y«tSZqËõöx|×ÚO´wòPî)‚º¤×˜SUô>p¯üó¹ð6?ýé]–ÛÜÛl_ZˆM>Úh™UèrØ R™2ød8e؃ҷ–H`_Ç·…¿ÌÃâ ð”-^ñù: ½Úþò·–n€ï[%$®Í¿/ Z.¿=rûµGͶ¥½Nìe–éªüD<3/c·ÆÁ½- ¹¯-Ñ7Nf¿¡mgO}¸ÉK¼1UYA톔-íL1¸€ž¯ï‰\ccA(‚½78Ô­]– Ü :´%ô÷µ³å×?nÕ®ÇE$>‹>ÍÚT¿ ½fÒ™{œ »¤5¥A†‰…ÅEãTWÛ‰î¶Çãå®–VT¶Zl¦9O=퇧ÃóÖÅœ³á@kZï3ò1´µÆoòZ^$+«ò·ŸkS¨zn[¯bÅ×LãYøüØßéÑ2ÐÛ}Þ¢lÁ=¢x ïÎ;Jûï[ë¿™_ã²±ùR|œ˜G×Ñæ9¶=&ûdblNèwŸ¨I{cŸ ±8 H:—"$*a¢eÂ×Yê„YüKÀ&S7©mÏ1cá+Ú`\/ÄØëy€R]$mn»]Z”Ï!«Þ¿‡Ú†æôß\ñ‘òÛ0×E`Hd!$@c â7âΓ~˜‰Q2c)HÊ5œ úµ)58•Bð„½ZqdÆz=£`; è‡þ)ÝQOæ€V³ç°mœûCswÙ ä†x<„ÓHðɬ4÷AµôŸBƒÔfÒã"•C4bMÑÖ9G1YÏ…÷áDÐ9‹²9ª¦°ÐÆ:>03:Ÿ }×#(û,ï-Zôn/ ‹Ý?qÖÔ ò,òI Qå‚XAá*¤”X…ž&Eı"1ˆXÐPTk»œµ b¦Tì4¥ÙÐý"DXÆõ´û`[ˆK›¦ò*·V êȸB6åÑ49ÃR°D h[QlÀíL†•F¢ d,H€èK©b“HŠ©ÞzoL¹¡¨;j­ÃHYÀDçoÈ0SP1úÌwGª&YÁ (^îÓ*) ÀüFi°ÆÀnZdÀ€,`Xö¯¦¶R,¦i¹¯Ì‡I" Î*Ã:yä: ),y!Å¡SmÊqTØ®oZ ¬1¦­’½ì>AìÐd^SZ†žž—¼xŽØ*O@`f¨u²‹<¥qŸ‰×![òíšÎöÔ†Éy`ZxKuÇŒ SÆqA‚Hš4fzüÅ>_.”Ñɳ+NheÂá’»”?*za|îÈ…¤,tÀ›îP?['\Q•UªRÅ—ÓжˆõeÆuöªÿ"ùÑ+«ý ÚʯÊ,¥ãp-EæÆ1ç:_l´<óB&rIÔV¥±^b'.éÆˆoÄqˆ”: Å8œ©ËVœEc点aR@¨ŠÊ–3éhñœÃgÀ¶ûijÛÑUÏ™°\êºnTn±ö®{H¤H[´,"a™Cƒà€„ Df¬JPV’d”C*[cµ¬E È¤aHúøq¡°@ØpìlÔm @2¨÷ˆ¡4íë͵¯ì×góI±ÔXÇ"»ý¸:ëþy¯ $ˆ“·óÏ*Jp¦6z¾º½³I*D „ Å–5¨Ð3â„CgÝšb¢hÛ9=Ý«5§(&XªÂÈ‚JB^~±q}í.Ú| z ‡2!%”¢)rhæö/’ÏÉàix^L$˜À`0æ%Œ²’8Z(ëH‰^g–m®Ú¸§iÞ½\wˆ…²ìÐZ>ûbÿž§GèÙÏu¼B™mv¤§×€¶jJøCÇ·3½û:UCY2SíIE"E¤ÚÂ4(Šsí¤§ùv‘ï+}m£mpæ[±ÊQ'î •vèþò¥®n쟃<ýy^¬9Mµå̶!ò­v3'ùrã^¨WÖÜS(Rïµ®{eÈwºÏZ›)dËX_¤ÊÍC†8žÑ„Ž=L¢ô¹ÊK÷Œ¸_2 ßý¶ÎD¥ ’ôó]žýNç¸RƒH2sE[ºÅ‡b%cr{çÞÞl>ú|¶ÞÓü£,㘧ÅâÀB |bhù;áÏùARèÏÌË^õÌΗç[ܸ:•p$w²;åw'÷õä½ÙU!ÿtðöë;üõ÷ãõ¼rl«Äßùkÿó¥~6ÿ3Ò¯þåÿûÜûtrGN©Æ†Žeš9›H¨„Jȱ fñK¾ÿ½NçŽf kU°.t ™ŠM­ŒÌT¿ë÷vExþ"Ø|ߨgnïùË>>àôêL—…:È*£­Ïóå2ïøih±@ÌP9Šs\5î¡“ñìŠè€-\•†6“Š"nÊDÞVb[‘ir׼˟Ê%`Ad™‰$Æ&PœÃÔÌSªÜ¶8÷­jÛû‚ùˆ7áŸo¬R•Έ -F†Ø¼f-?°ßúÑú—N>þ£0ÿ×k³YëâÕ:@W5Du´À°é êÉØ `X€È\1µÂ³ùYÜé·ï¼šÚr*|a,¨XD“­ šîÍþ€ñdÿ[œû/2õ¯Ï´‡|ÿ^8ìQ¿Ò[NQÎÊÍW7pt¨¨.•ó‘sU]éÓõ™:š‡Çunz¶c‚N"²¤§ÖŸé±¤îY ‡h¿®¼4X 6 @jÍ£L¯Š¶£PQâ@áBU”ÀhÀNsmØXeŒƒO¼^Q8*ƒ#•Xådy|zZ}MoìëY0ËiÇr ³UC%éО°oÿñ¬™kâWPâb÷©±y8ëݸ¡àЫW @*#-80Ç‹'JÙ ðùRÉ_ YŽö>]ÓÍ4Óøù<4^œïÉ™bŸ©iïçsötû³Ìüdd.Ás½}ÛÞhzéIgi&@À}«óÆÖZ;cîrÕ_I“M;Ì!–j°'ϙ׎ 슎÷ÔF* >Ž(T䨍"#îå(öÌRPBmwÇÜp;"°#3îí,Ά¬P{ºO7›óª6qAQ”€±W ĸTj¢ˆ‰VŸE$ºKέúõžKë"&E.É ¨£â|Uwv¬]xÎ U2½ÈÓ¶x§G×µËáÑÙúšL®$bÊ€wǼN½œFm®×ìØ&<ó›ÛìÀŽkäQM€UÚÔ ÃÊ tœ˜sзÉÇ Ó@pM?&‚µàb·¶e:9ŠƒB^¤òðª§Ì•¬¤QÌU×ÈFÀ’X¡±5Z ™U¯à*Y‹ã´ÊR™é3 Ú•ͨaktB8l£Mv¢»"â1ƒˆíLIˆTÌÐhõ§Ò4ø¼Æ$ W`Pe•%#°C¼²T^L׆8R]HaK,†Å¾E¤U{>ùîš*&¥«œïão¬=à‡ç“GêB‰f¤ N%’—|&‰Q8Xo]qìÇ„u׸àÄ‹#&æ6ÕÇ[)0l]¼“{0÷ éø2þŠuš:a{² àmCçKDe”Ë H<è—À7s²-¯ô®™ÛRÞNKó[¡Ì9gáYãiؘ-‘vpìéŵω<ÎýÜЮy• U’½y4³¡»¶õ²‚ ±*3©j¥½ÐˆJiéAk\W.ÔD-VFü"˜£JÚ¥lAV–‹i=jÓ¶)Äe°6"³?¿KüþíåGòêׯ…¹ªHL$,ñKøKû?έ>d‚^0ÃÃ×€lüN˜´qf¥-õÀ`'Z€ÒlÓ]Ì=ŽaNè(ã¬Hh"µ·¼ˆ 4Y2[Ããol_Ê¢æË*òƸ+×èùÁ3 ç: &DY@—-eçþýÏãÉ/ý“úþ1Ù^ëk·.‡ÔN ”Ò*ö"ófšž–w,ÿvöÞžÖ­z¨LS±¤€Ž’*Òp‘¥œÃ(F‡½rU] ®o¼ûv{û'Žä '®–É XùL=/;ìÚþ åàØÆEmn EëDäfØ—Êr¸þL-©AÊŠÐæGð^;­[ŒåÊV* >‡yl@“¸ìqÒôbúdy`Ô`GÑhŒmDÔàEõ¾™[‰XMqW e`Í2;M‚2Ò°Óé+Øb8œ¹²Ê•À‰M´gÉ0ú;u÷?¸ºŠ5˜™Y¹½ET™Î_¶^ãxׇuNÄFV†Ó—\‚^N‘tã&_LøÔÒuÒvRc%V ËŽÑ*ôSe,‹×@ÃñýÁ‘tE/†ùŠÒË ï1ÝÙ\c»–²L[¸öñmšyðÝ"é„„@’óåaâáÖÜh‡, šÿúŒç¹ëD‡ßüɺ|ØŸ{Ñϧ‰E%u™Ì|>¶lá/†ð‚„ÚX°ÊƒKíý^ù1­-îOiåc‹ø“í…Ð,iŸsÛ¦jN8Âë ¶2°UûÕã•W8P2!ß,/Ô:ÐöS«ˆ*$…o{÷V¹@Kû*¶wâg‡—ÇÀ•áVõpŸéN5r,®ÂÑ!˜kßG3n…[³×9,Wh@² Ô³Rë¢a#16@’"Ñ€faa¤ÜÑøÝ¦œ ¾™¹9. ÛO?}{†£° ò.}õò:òhk¼«E%¡Ù!TXK£7©¬Æ½¹î†H±y-Åüt¯A\êÌ=Ë÷Ñà G@bðÝHO¬»©p ¼­m« ªÛ¯Äåcc€¬®å>ªpWƃ‚êAw^Ã&ðšˆG^ýÝàÔ¡ýµ\o28]ñīØы%ëñáC{$O»îv¸•]á_¶L'—ðgƒó]û^b „ãù†Lwà”mgƒ‡Ï¼<ÛQ.B}×.L¸[X™eB‡}¯bÛÿdþ…³|ß½ÛäŸ?W½q»ã3"V &йaf•bCf„zJÁ„˜…Xæi›ä•)D7Psš‘t vI¡f°âV |Õˆb~è‚qW‘µ ÅŠã,@¡ %"Zu¨´DW X$,à8+¶ê$Ê ÉZ7¨ÄvÄoÈTÓ¡;*@×xQ’Ù‚ç‚®Ò=cf£ ½NT’Hû:…î–+¾Ý –x@@ ˆA?•ÍÔ#ÐÌÛj¦ŽK ¤ÙRÚ7R‚PˆÅT" ã^É ghVìá“ Í… ;&IŠGH¡Ê¾E]•q\©Ç$ÉRNµÁ> ¯avØäDsǓˆ>ýÈœ Ò°ŒÛ8¿4奖4#“^êÔØöŒÅÀWòÉc£…XÒ‰‚Isœ‘ª‚“X‡H ‰¨'õÞ/ó›yç™ ¶¾fkÚ&{¶sƒ·ÌJ™EêÓ‘i³²Jtð_2ûÜ á*m[‰qÕýë´E·rYg¯›ã—ÐòМ$âVn6PAíÛ‡N%rU¸lJ$· ´ˆc«çä„õH"á5c­zܺ;H¤^ s3+>_µŒ¦NäkU ¡ŸëY°ü±†JQ€Òt-­hâÌaÿ\µGîiñ½k6­‘b Êh¹=´c–)ÔHUHMœùZ³ñRe3ʲRJ‘©¡2¸ KÉ F Å2Ķ4‘Be! E(ízq^ ,0¬†3ÞOókéÌ.¯No~ûÛ·ôö¸ú5›ŸÅ+ô¤ðÙÍOið²6Úsc«^€¦\—–†ìîO±nÌÙ¦¨mHQy†÷{qf>êñgóö¸ú±¶7ßýmx™)l tJiËKšB£6‘ìä¶ÍpI”^az^ú>­¯§ðv ¦$ˆYÇ­=ApÀ@Ì>Î ª^Õ±›ežø%¶Ó¶ª“I3\ ¹¡uD‹ÈÉúQc¯@-BécY§*…FR¥3¿;Ü_kÓJ 2 é6èŠGfKqtëÙõX¶9ÒC€” \¢JHh¦Ñ¤.aÈ&¦#[ŠËV`§€ DÁ‘ ˆehD#Ì3ROIÐ혊‘€%ZÚJ ÂÑÁFaƒqh@ÅÎûeAöþÆôy?홂îÊ#rª²žGùüÁë3½ö´5nÄÖyãpÏ5êØ øÒ«áA#ਡBh%X䦱½âÚ™YN5d©¦.·h± &pé430-ÃzO›)É–4…ˆºÒgg› ¦6ù0ù “XVú4ló•ÇoS,qÎÒl´Da0SÍ4Žà®™¶ÆÀAÑÒ¬¹ë… 0Á‘µgýÈCx 3&å.N*O8òôIİT\–çBöYv~ÏôîÒ·'ÁU¹V)€¶0l% ÙOÔ¼Ês+flêœ}¿ÃU©@UÂBdJã~|ùõsò*|°{Ÿî(IJè£ ‡ÁJ}–âï µFœypðgÔ¥~¹C ®^Ìó¡klrj5‡{ÈIæ[«GˆÐ±)ªÊ©»jGE&êi4Îg¿¿}ÝtWóØRY†ýœÉp«÷稓7´‰,¨"ˆs~RÛø¦f€v“dÁ÷Ê÷N¦‚–¤5~…"Bbò5v!ä£I²a—Ë矜ßüí²›|d:…,—Á‘ÖÀ/"³8‚~ÄHOYp 7ÏzÚ:¹õÞ¢<Èó»3œâb¬†¿¶þ©ÓßÏö ¯þÿï'ÿû™\”*…Lh¨np‰ž˜;“Z]­^®KÜ]ö )i˜‹gR/Z&9h"½@?×c“Bëºû?ò÷B_#¼~Þ>7¢em…d4v§ÿ¹?œº×â»Ëǰ˜Ê“¬¡*3(h`Å0*eK\:<%šR„8äcÅ‹IB´x9 Kf™ó@©±êCdrK0fDf¥£_µºÎÅÊÞÔïøóC¹X˜µ ‹Ñíµû’ùRÃ×¼ú±úŠNþØc+×_æ«j+ ¤îÉ™Í'3V1Q`ßákgð¡æ€É‚lpoRg’“Óâ­â‘ðB¾.éòmZüþælʘ‹ŽÁ…r×ãyýõüÜ_þµètmæe¯w\̼X¥ ³[Ãù¬¹ëKξ. ON™öºË¥ÎQSz\Ë©9þNJò¹ìyÙh}å}í¶nʈaËúzK)q 'jÚ´aKÚ8ô „kS³ QŠñfÐÙyŵ npGù°I=d®pm5CZm©Ð$ã‹óØùÀ§«ƒœ‹—&ÓLP(d n¦½_÷IÆíË6¾ëï/¸ ÒänWCy»!hᨡÆ!â#]/,èfZ‡÷ópåë˜hx™NÛÀTpÑÜU ^ÄN–"Êïî5/=76vc îwŠËüå©ÌJ^#Vƒ2‰ÙGÝM;ذ^èY%«P»nÄüä½³gÖ\½¹þf\âÛtæWXÿþÏûEÿÕ7ïÏ¿¸þòùÏØ“v1qÄd ¥Ó_°Í¼ØÌcÞ/òæ¼+ZÒ˓ųÇ~ym»öçøû3~wíÓäf/ÀL&Ç|éc`ÇU7wr³šÂ£<ýÅÚqgn.a5äsMWGO4ÍžŽïD!î{=øÂžãÖL ubwYâ”ùú oUˆÙL«„cÏl¥iË»\G"¥I±Zëá¤dP{YÌY?ßÕÜ.O^·xôÚé6î(   Ç"¢ˆ ô8BÌèëtUO²GJdë~þ¸k·û˜ÇEzµšÏÄtúØ9þq’gŽö}Ä÷óþ/7нáxñ¸åäX«Û󪀙1Oê.kSWÄÅ•kC·ýäü¦ùH®"¶Æº¡©;dÊþ€[ªÈbÂB‹âbXùª0ÛËôa¿C7²yXœDÚ…®5ò­/x£ŒJÓ¡·Opôâ9é8Š{€¥W05È´ì5—G¶•ÔY[Y{ª"V +Ô¶¨$(m8¨O g‡L€!Çd®œ1¬´âj ¥MœS å-σ#lb F¦'goR®´qäñê—æ×m†‚]ÒVë<ßZÝú¶ÿRsÀ²®^=#Mbi…ªâÒ> l%,ºhH²ûÁùkvŽ}À_?ÔèÛ„_ß û~|ä9P- &P„¬‘¨Iå¼ÕqñfЧ—ÝÆð˜<£ÑÚD'úr‰Ì ëoiÿqd‹YÃ`|ÿªõ‰kÜèû*?˜±H¡oKyNUÿˆšÜ‚›ñàý…ÛL爿:ßîØWD:Q ç{_ a¡O®ëCÛ I`Ñ(«0WzÏó1sç{†³o”=+:bqÞLJ] QÛAjbQ#?èžÙŸ«f’ƒ­ˆ³ÅÊt"$•kò+ÕŽÉCN“¥áBìô¬R‘³XKsÁ#wô3ÿöXÙYܹá3ÔˆŒ7!”‰´{ÏR_î¿8òÏä:z¿½“óÊ}«Ø¥!Ü¢án›z®ömÆÉ֭õ“´~RÄp¨ë8RçgجŽmÈQŠå©Ç„{GãHõíÜé‡äOžÙ2¶ÖÞÚS!‰­ûÕLJ* OûÅ©?ø~R…ö®k·Eì½O፬ÅdÖ "ÂC€èqüI÷~º\c™7±;[÷-¯ð¯  ÿ¡à{¨6;MlÂeþ.ü»Zûr>)§Ä”©Ýô±:(¼åþi÷QÂݬÆ20åBØÂT ÈçÝ8[¡³w!¸þTÇßFÂÈø,¬¸O]ŽE,*¨ô ^M&DF û€‡æ· ¾\}ñYû{:»%ýûòzvi‰„S–wm †‹9´»Ïa®ÙŸR'Œó¢á{w¾J@ð½¡÷Ñóçß|£V#úDŒ‰F©çGqü=¿}/žlîý»’µéµ¶G†8Lû;KËe‰Ñmw;Â?â„ýɧË `XàɽμuÝñe#áeñx331„¥H4fg˜9ýÌŠuÌñ¡ånX¶·ÃoúæÔÍ­ ¬úð¿#Bx×H‡ç¤¨w÷Õ¾yQîI¶ A4jqº# ;EÎg6+vú¾­Ä˺xGvÏlÔ(+GÝ:m<:³] ñöŠ®"‡>³.kµSQbôrua³·) ð>âÚia‹P†¹¼3÷¡€ž—ïätl¥Íø¸»sJ{üû÷î¦ßfàŠO_oÄW§0™í²EŦ%uçéjvbëôÄGì;¢¯ßºI;rG<‘<•”Y} þ¬È±;õcie±rˆ±‡bUnm©>t°èEÇhé/bKâ‚÷G0~ÎП™Ã+}.¤'ET›”åÄ;÷°r¼Ï©C,PÈ^¸:â1þ ÁTÖ`¡ŽÖæ–Ó [êYÿ…«ÿðNçòÇ¢Àâ`íƒVµÉÌJùBÅÞ]Ûî5<~=Þš¨z¹Q»oì΀f`÷ÅÍt¼¸î /qÙ\ä7äiÏüuÏæ&z}ðÍ/Ã#ñíéˆs:vPžU0õô¼â! LÂPCN’@ !ÀW"»³:èÃ)Çï]tì|ÖnÅ8ŒÆšã4¨XH(Ç©*«Þ²6€tô ,DAI' 2:Û_$ñj§V¡”dF]˜ñS§!ßnÓ䆄˜!¶èµÂk·–ÒãSƒºa+Trpƶ0-dTe¦‡!©6“¨Þ·^ùÏkNhóZÄ"$RiˆØ˜ôuf bŒ<ÊØÜ4íI˜›øÈZb9…à Öo=ºJ©ÃÜq!cú>5W­›•ÇG²†«Us¡p î•Ñ¡>ƒ'‚;@Eƒ¶Ò½×x&·•oðwe'ýTHÎNëÝŽ•§Lς℔@Ä@( `ÂÜËXÎ~#¶&,”YS‡QÐ×WT.cTH$"QäâÆð ÿ”sÊœy=¯ÈëšÞçøë{Ñ ™ÕI•SÞ6ù +¸ÀZšÌ˜mÄv­KÅHLXŠÜXŠÚNfWñ¤Ö(’E£DŠ9ü³ô̺=$DŸÊxµäî‚ÆÂ¼éYF›Ï£ožÓÂT9^ö³ÁOo)q˜µ d$µ‘‡l©ˆq¦W˜®ÍÍxlÍ£0G£pcD2ØAÕ•ÐLt~X?6U¶U0)7´-Ѳ +z `[$䥯’%!A[Dª !2鑎E2¿—šÕi5NÖ¼µ_ÉæâÔÊÎÇÓÕ«¯¦ÏúáA­OT;þ”ý˹õ\û®³A4%YµÂ²ØyÜþ9’´l»‹É2ÀC}Ÿ_=ß¹õZ5Ÿ¬õßîë^º,d…åî5- }M®ÑİJqf7úrSØÌúnj±$m”ËE%)³(Ð¥ – 6nNµ;Òö ‘éÑVº«çpØl,{Óf-¨C!“s‰r$É:‡ÕèwPi‘ЃDVlLÆíÆ €²ˆ 3 3V˜¢¸X/Pƒ9d‹uDª›Q±–²*H É¥±°ÿŒu(H´¤e…1¦Ê2Âl%(®.a]Ô–”´L9('Í‚Y` ܃WU¢jºÃç·W¿¼È·AéVDúM•GÝ«Šü‚Å®N,/€ á¬?šž›D&s%BJÉ*VÅa§¨ …™ÈŽŽn°â:è ¡Bѵ\pÍu§ B%ÚO b‚Ȇªª3lb`Tä¢ L-À’êÙ<Á#‚µ¸6y-ÉZ É —aõÉ+” ¤D!.¸ ÎN¾*ø¼ OÆÅ(àZ÷„S-a«ÜõºùcÓXŸ¸•mt0P|5Z¶’ ÞWÕ¡u¥v ? |kúU.¨%®“g{¡cR¢Jm°µ™Ëȯ’.'OzM\œ[IíÕ¶¡&ž8(÷X–ã;¦Nű?Cù¬BÈ!!úŽ´š¥Î4Xƾâγ}Æâ—)é‡lÂ5.û¥Ñ‚ÞÐÙ¥Üû‘i`ÇëÿâÅ/¦ÀRi³Ò·bžxB·‹|gíÆqO–3¨z‹mÇ’‚ÈÒësó«gù·wþ¿êärü_¢²(Õ¶‚M¡©p$U'JO“»ª>¬ï¿”×$;sA‹™Ó#ùœG//ZJœ~€Fþ„ÅÙpüWwëeúå-è<'Ï ”­–¶ûެÝöîÛBóÿvLâá Œ,)b  RPZå*ДÓÝ2!̲…(Ú¤Q¦pžÏ4˜½÷àÄ”Í‡Õ [l—ZZôY9Àúxg=¦H5ãO¸™M{¥M¾ôí;Ô‚ ã}ä¼:½Çô1}Z±ÆÞùé¿ýåuϢΠNhD96Ç Þ´D»¡ÚŒ¯¨ƒ)-ŽZƃbY†`Ø HÕï«­¸K鮡¢Ä³u2ÇýÃ&nÍm ´€{MÔƒ¢* íhÏq>K›ÌÛñáæ,vÍz¯ñÄ(XKœñ­MÊÝçV#ÿ|í~ÖóºX»×ŸÌÏW³{áS¾gÙ_£ó§²êc‰#Ò³éÆ.=n¦áëDkr3íIˆMT¬yç—å·Ûråk9ÿ€ž–¨Uôˆ†´—¸u`Æ”ŽìIO¶ç[ž³ž<¡£›sž¼[–9÷b¯j§ˆP¨Ïø/«vº_/¹’A˜Tfƒ’Z™™‘j¬¦•j!E-ˆU„*=àDFë?c¤F  R¡K|:ÔjÕ,yÒ| ]ôÎeÙ µó„Ê£€˜RãºÃ  öñO]ô… ¢0®{¹rÝ~O{Ù×Ö³÷ØyÆtͳîǹ®7ó>ýÁ‘ ô¬KÜ®ÓåQî2Èì8¹&Ê”øpvA­m‘»M™×w\›œ®¿ôˆž¢/ß‘}4 1­*B]W7¥5Bd›€µš1¾ðOi¡À¥ÉM\Ü5×'—Ü6c¶fX$n‘²¹×ýƒ¦7¿¦Î>îb­lÍlŒ"ÈærA6ÑDѵ|º/ëäµ(~:€œ™J  ’¾²XXg… ˆl`Òtð•úUá› ¦Ak£¢)è5Ÿø”Ýôt u˜èoÆUÙ ¬ŠÉ ­qä°º*^µ X"á_”ßV¤ý¤¯-ŽÛlNì‡ágJÐ@µ &CÅW›Ë¹Æ8;+陼5—?a‚ ˜©À­M¶ëœþ[¾¢å˜B+Àdj¹mŒkÒYšBö M,pX™gjl¿»vI¾¡\zÚ³{î÷ÒoÚqi¬`zå¬êæ­acÜß|V=9>ö7|vá…3‚Ö)7G‹^cÍz¢6 ðáoÞ“ ¼ÿ©bæ™ò}×`(àdO~ McðÛ&µØ,,âÈѳ$–dEŽö_C~jÂf®pˆ‘èߨÙqèW…ƒÆï‹ýþÙ}c‰ZQO‡dã›Ûô«"wHʬù‰óñéïyì{­¦£N("•“VgkÇKå…æú Âæ£TxlÄæóÏ%þΩ­dœéùt{ê´ÅhÑ]›Y-^à·»s—…`AQ{‰É’ 9¡f¢4®É^xOí’ËmÒCE˜ZâÀE”…§™£v}«øöþ˱ÄùðùNkd§¾uþÃwíöÓšcxÿ¾þ?ov=ŒÕeý£•Íb½á,­£¹ÖÉLAYW¤¯ç+Ÿô_ù%Æ×h7Ž^e¢Š¹kó’ŸŽçåç^»FôïI¹9Ú›r›ÿm“®æò·{i­KÖ¸·‘yX~|_ª:Õ¡Äy‰§„ˆYŒ89xm{˜î>n§5DIkàðaöÍzåŒôñhÞg&ÆV>Ÿœ~N¬f;æ~oùlH¿Ê!©þ´‡¨ËìÌ1>ÝÇÅû&çG¸º5£ñqäËܨü{œøäsêµJž[²c ûú|NôfϵM'Ó©½;œ>î•Î3£Í==™¹óÝ»¸2a7ãSH“Äjwó˜H£ÍÁkÔâsÛ¯… +Šm3'åy)öLÇl¾:qlRÜ u±H”€ª¾¬±¤¯ ¿ýãÜÏ×/tÄÂi¿ªë +¨„¯º@j3ć4r|Ž£wÊù²¤ãF5ê3äËöõ6¿!'5jS”`v+£8ll‡,\®4”²t$rs8ÓK³ÚbEÛfY´hS¸+‘]¦]‹zfÝÜ·º_.U=#{ž«G]Ó´IGNøl? Kºw~Óò_PúËq¤Ž¢EØr\tø©­Y¯qeA†õ:oûÐY‹~6úÅügþýÙ-LÈ‹îÉ^ë¼Â‚ý_ª)„YXÇí¸­øË …a ÐžV'i„c€JÆ66 We‚!8çuÍÀê`zÀ8Æ_ë¯Á{K ùã=ðˆoãêqÎ>ÚðZ8îZðhˆ›@áø™Ô¤%/—‚ÐkVäÖ!KIZËŽmf‰K'´ý¡ÁåÆ÷ø}¤²ò:‚BU5 Ó5Ãn• ´žd}¼ Q(Ä€ û ©è‚(¸®ËPŒF*IРヌæåæ"ÒÙ˜cÐ….è.Ö"’O¯#Qq-É`ˆ'•Yü¼‡¿›îÿö´ÿí8tpeí‚UœÞWvÀƒ>Ö3BE* Ö;Ë} Ç2E>2¾Ð8q" jȃ"‘W@«BÏ‘­I«å`Fş稽ký|OÀàhÁðŒß;´ÿn+è­âzáÍ*¬8Ú0Ø'S¦˜ôÐÐM@õÝ Ñ¾~X˜J ¦KÍÎ{å}ÒkÚ\M­ Ý d<ïøº.PŠuG up¤µ‘Ô$„D14€4äÆeÍÜÒœŠ Xïk ÖlàëZ:GǤ¥.1Ž>}‹¸è'ØUµá@£Ü›¦®þ´ìµÂAÚÉ–ÂÆF÷uÍ1R~?FŽO• äK¶--­0C–™ ”âØ|Ò®ACz #AVÁJéŽó9 OµŽ`o­ìS;÷òÅ­ìžP™ ½õþ-úº¯Cª”šr ±ÇuXrÞ*-$¾Š€J¯ÔC¡É9]³1pš¥¹Z ¤0S&ƒ6ÔQkÊŒÍ1¬IYƒDÜ1 p”)•¹I$C%ÙYU)2Ì `Ù”Š‚ÔI ¬šßô« ¡Ô Y¬©‹Û—’ºB.«O"-µ^ü\²´órM‹È\ MÕEعqã-1áUP‡žhšB*tÈÐ…ô|¼_|ñ’ÍÑ ¦5ÊÒ–å*‹éšË"Y Š6JÊ`PO%èXcú‡V3²B‡Y°Ò”e;(µ~òVk¸ÅÀR´-Ê8ãy‚{ѯÙÊž]Ìz̿ޭK»SŒ:<Œ—ŸÀ]N©Õ„_·5Ïá3Rš "RQÕ¡C-\) ê¬pz& ÖäÐ:ö~SúÂûzi5{âÞºöࢄеJ™Ü, K•‡A ‰¢%Tðr¤2¡Cí£ÄµÓ8Uªb#@”Ì):ÌKn› ”— ìDêr—!cÆ0*cDë:@É׿ûýûÍ_¿ÿÝï?VÓr[Ö¨gÚ°964ÀÊìÛ€(uäÜUbʼn%PQ¥ ¨Æ€LuÑ Lƒ‹(ŒB Cé™ô3x;—Z"¶fuRù8‚<½*SC©Xš†iÌ줮ÖÛ^j'z<÷«¼¿‘ïË9ú<Â0Æud¼’ `mc "‰bJ` G΂¥ºõpŠ×y¥~u,ؾáUÔKå >`⃀”pæãP[(Y¸^º „FìÅø[ýå䙆Wa9¬¤#.E®Õbñ±±˜júSÎÕè"âKQ€~(¯-Ç!ÌdbœKÕ´uζñÝ-\Š>>ž·r¡v…Ù{3§†g1aºÐ/¥ d¤H…‹Ñ)¿$>$¡ø›dÿÃÖÿ W¯ª2mõK™âb­š2×ïõ9»ÏÓ4¯íÖ )ÀÐ8FI:—œ>@9Àh¥¦H1çB ¢C=žë*©…æ[ƒ¯gøãüTþ¾Ù|Ò¾×GN6‚ä: ÖŠD‹’0gœ:X¹/>ê®â[“veâ‘h!-žxn›{«vÒX5¶‘a—À«ûÝ’õtFWxv+nÓfÔ8S8l¾#>Ô§@ÙßK;@^h2œÄµÐ“ì> }È;²Ítd"zBš}Î7~–èH×Û¬¼}zz."(@g–$0i}Ríðâêç¨!ûxǯ#§$â¦êdçpkШ´ît£u ÈOƒ Ë1H …ðÐ 4=ƒê ¢Ëæ®Ò½;±ñ‰eÔи(uœBć¡_¡-5¥mSXñX#´¸hï²Nˆ« •#¬‚zÖ183î‘°À}1]=ž:MÚUêXŸ‘&ã` ·#4ù*ï¯Kþu¼õËzùÌ7«ƒãå@â@rÑzpð®wÎlVO˜Þ–¼e8ý£m)¯Õ°Bô,\%mdB8&‘àŽ@ ½KfÞ<÷O*òñœÑ³§Öì0}ceÔæ|‚kÑ{ŒÞ3îêykß6ãɶ[ýcç.>Ž.e8¬[–)ÊSv(;)ÚíB( yZ >£×¿{ ·¶¤¤Õå’ŠnÿbîÈ–÷<Ú²¼n·êà´¤46>dsúi®G9¡[;mn#¿, a,0ÍŽñ›…æ0~Ýá<@ûJør‹“ÔWI°0\*@œ<ȱAîc´ëÖ¼‡òÕ§²¡þeVG‡Ç#Ü{PŒÉ©üìÈ^ö l‰Ñ̘N%rÝŠ£OÜ´=’êñ÷ ù$}˜ðt±¶Cúº­ôEe‘Ê[ó´ÆáfX,Cå†}<W–öo¤¨ÊËÈô—c§¾Ý{¸Âìºò#€…aù#FÞ¥¯MG½¸oûæò¯„™lûv0Ú7®¥"줺ª ’Ë‹|9‡¿,ë3•ÏüºHï:©‰eT„†¤‹ÆavÒ´ÞŽÜ›;N ^V<[¯-F‘NùêãÆW/b>®Ý^óŠïÙvÑlˆ¹ê.ãví E*H7(—NÁ-"Z7Šê¤ 6„œÞŒö#Ž> ý¿¼Æ­0ã®<½ý8›‡sX´*C±õf«(Áª‡úØFêNÜw÷¸fâˆë‹yñLÂL†²°^ž¯“§ìÝò*“àÙÞêæ …)l´9„‚îˆTôþÛ$ˆ)}‘¬êÏ!ðkMŒO pÅD¬˜»„Ô+žÌFP[‡PÜÄ]0ØÂ)k1Ñ:oë×:›×Ó~*;P뗞ʴ¨ÅúËñå[ÑCð¹žÓvÉ…Íé}‘ â J5ƪ† Œáf*a3q¦^æßµ#ƒ"³§ZQ“¦dTç´£ ¨SPúŒ8Læ3áØjd¥œ”’‚Ö!­þ]¥BIJe- ®„ŲÄÒµâÅöVµZ¤„´OR#Ñ»«˜šÉV‹Ûë`×ÿ¥(ÿ«Û–ÿü²¥Ž8d³ŒÌ¨¥˜)v¤‹ÜšŸIä4J±#&C1žQ$¢Å"V°E3V¨‘ßóž=P\~0åÂ+–äÏ,ºÝøº®Ã‹ŽŸ’1»yìvN²Ž­ùYìè´ÞÙîæÒ°(ø‹'nRÍIOíª)¹èËlшZ÷°›‘ã47ý Û³ZZ]å[›@ÙQ«pJœ×Ðç®)=è‰ãâ¾K±òˆƒ†Ó©ÆöøÂØ_N‹Wª2Fµ'ËÝ:k£‘ÄX|T›5Ì«ƒw»~<­ñ‹Áâðg$‹ peïsïó½=ØkŠ“(aª’‡RÈXò'hO™0ÖVª6|¥‹‹µ,Ô…9dtR,ÈÊféTþ@ï÷®‹¯}FZýËÞõt€kȤ`Î #•ÕN´‰a0Zì[äÌ“Þ7 #4¢,¢©pA, Y×ê/Ÿon +/·Å΋¬Žô}>:•}Eiµ¾i§eˆ? Z˜&3OHÿõl85KÑ!°EñÀ ˆ"?uÖ_ã뤮ƒ3Ý _€›Ù¦QK.” *±È,4d[$÷¤.~3,Þv£3½n’r®1·ãíJ rqPqÎ{ÙsfFE’È‘p³•u¢JÍ’a£ò%Þ§4lÂÕ8½Q“’Xš”sM š*ȵEòÄT|îè®kŠpKlŶfÿÙpí¦RLñþòÍzux­®š^φVª9„‰lÒJ©ìJ2ã]´ $!©*õÖ6}‰E&äbF˜e„”1MŒ¼ˆµXt04XŒGÝ­V¨r‚Ë™9ÁPŒ¸ô_ü·¾þ·½‹bÅÎ:G¤bÀô®Y‡Ry+˜@ŒÃ2ÔjÁ‘~âÅ Œò»£R´h Ü3NB$$;ŽdÀ‘M·Ó‚go¹PYžm¼3(#uQ›‚ô$cg&Uö887S/+Tútf¤>Bp‹œš\²@o ФÉ~$Þ7ôZ,¸µ3ê!¬>¨Ü•5†öëœfÌ¡/ÝîÞç`nîûí B¢É¶UÉ›ï›8ÂJ/ lXŽOóáz§hCu©eí´Š¬*= …ÍÇ^²Ž:¾?lyõ]&E=Nïª>0~jDŽÈ¥¥T¦·q¬³] -y)Å Ûø0A,Pâ zˆ°%Áh¦U¥q»è$}mÙcÌsX’G*ÝÕ÷ú£hqï9çÙŸÚ9'>F]ãæCUj;j“UÍz×÷~¼¦çÃÎAÉ‚³‚?¢¶8ç9ß8Ÿ™71( ¶ñm› kDjÐTêvʉ5,‰¤K Ùª “Þ,-˼…o饮héW~%ç!…  Ý°*€ßò`Â\óc­È)Ù˜é›íÉ̳~¼Ø ¶¹o0„Áü›ÕaWˆÒ Uª- »f̤£+_ÈÉI"­}¡Öç‰W”Ö2»æÒ–]]TõfÉù8ìZ¥•8•’z.êqEJ¾#vbB(:²%;ª­ⱘ Yá¨/òìóW ¿½°ª<©‘ ¶ Ý"8¡é[¾ýÞ~ýüùCا^LÝ{(îÒk»F:V‰˜¸#,­%DÎUa W)”`âÒ4ŒY5K‰hQÒì:G<›  ´¬Åj11¶#,ƒ‰mÓØÊ‡;•bý4¯×b{nó<-§Boýæ›õÃ~°Êçô"~OX¤á`e’ÃaHsº «t»T?™ŸÞkùž’§V6በ‡“OUñ„⦌“c'U¤…¤z¡÷h›pR{9$É…SõØõ¹ÚG ÎÕx¤)ÕOý÷Zì"5péi”o°]ùX‘ ˆ›‡G™°l›´ê56ÂÂHËpeG¡—î‰ ²à r?§jvÛ8p¤T4€[(0ŒÂؼÿjÙï©OEd¸‡ÜD×½›ZáHÛ±\G-CJ#0l—°hUAd1`QàÐÕl8ˆj65×Û°ko±½-Ù{.Ý´£â¶ugE¿¼ïó ÿØçÍï/ìŸþ¼®ÆÆXβC.,c“®ã›Æá@ Riá¥]}ƒMäÀMðŽŽÝ%šƒ¸É¨G ¨AÔJŒQœ¤o/ûy=“•[䉹@M¸;ìQž"¤5[KAœi_“ž Ó ä‚èMŸW>zëøõ Çõ™&{y—Ë8¢š•÷\tùh¶çuœÏªd2< T…´F*ÜÙ¦zNEfC¨«ÜÜ«e>Æwû\3[Q…‡iÍ5P$ u¸1†j ßó³±§¨‰3±Ÿ×O4¥‹›¦Ÿw/´KY¿ßþ~þËýýGûù4oN1f¥BÐÖ*'9#*Z]èé0W¢¶%ºu¡ç€ÿò½ŠµZ*TÛ¶<œŸì ¾û”ôxÆcƒe³4&Ò%ºè â±JŸ8}»uµë¼•)¼Ï …’QOãJí"¸-6ÁÖ4¨Èúô]"©Ê¬Ú«‘nuªÁPy¼µ–

2à†Z¥ 6QFCY^^Ž+)_ÉS Yµ?/®ø>­ä {D j xý ਗPÉ×ë r©dsâ…Hè¹íܺT:¡M„6¿8˜'yya†&2Ša?TùÍð…äSüH„ˆ}Œ‰ÖV¤ÏÁš…Û†UÆËïŒ ’‹ð=K™z¸œ¹CW²ífÍÖ¡3W(¥rvðAâºo`¯J«\ÎB­ÝáÑíÞ#ÎP϶ôŒ=g¿ãíæóºóÿú9ª#ïà­³_¾ִþíXîžÝÖæxgÏ\ÿøtŸœ’{9ÿxŸãªrt÷ᦌ‘:ÏŽKŠª†àuÁ˜¢îÑD@vqÔ?:­3}YëÅ\÷×t÷ã,Xög]™Mª˜éÀ‘Ð1f†!,ôêm欅X[Lá‘[S‘lfpeO‘VÜèòD )LF 7T<µ !¤½Xß²£ô¡'35;)_ï?™¯t½ÁœŒg÷<_vÿQ7÷¯Ñ·@ ¼-äbHiÈÑÂ…wZÃïzZúëÑ ÁÐ3´Ô‡\Fˆ„##Ž0\e!Ñ>BÆò)Œ©žÞOz‡'‘ ¦Æ<ꊥ‘–ÕÝ¥>-ç’žŠç¤ºN×Ùp¯U´fŒñ+yú^Y:=sööÝêœÀJ PDpúûñq¿ÿôxžÙœ¹O£z!4ƒjáèyæhèKè°oFuN)#I}˜NûŸ¸þÁÝGôW;ÌâÚ8ñÐèºy¿\¢OÓ¬5w^¶Ž%½j#†oÁ¢ %©¬äGÿÕþ›©ÿ‡Á.cX#iù‚›<°sÅp1äÉĘJ€ê ð&GìÙ$"@î᠂榦[^×v2®lω­ë$¯´îÐ<¨NhögÏõ¨µ4âïÿ´^øþyù¥}mgŸN:ù ¹Ud÷ĬÒk§ÛO VSÛ)î¾Yá"ëéë3…wY¬õ¼¥ìZ?ÐBÿÃåßøÁç~ö54š4\oÔ|`<Ó#àÓ¼71-«’B3ØŸ{¡évÅ ½FZÏ¥q^s=§Ò¸åñ÷¿üÎ+ë^ߺ}“¤½ûmýóüÏøÙTŽÅµËD²ãþá#ÎCz4Ξ‹ÀƒÞ£}ãIÅrža;®ñpk݈Ò@.F ŽyrÌÞÉ¡>W㉲¯ìwèç$÷U¿]ãðë9Çú®êÍOLew_?Þ‘ð]N±ZCôFpIPk ÝÑZ>!áŠÝÊä<Ÿ«ñHÖ9˜pI¾ž¾ª§-ÉÑÒZñ”Ö?Úüö5-˨Ež}Õù쎱¯»r\y<ÒÖ¹èó¦õÛâ½SæjŸ¶ÅT²øxÞéñÑ‹Ï\°4on-kBI­;Ò 6v«Ns(}QpѶÀ²n' y”ŸË?âR^ÆÊòåÎPnòÒ6è€TFx?¤Ån\öá‡E¯=JÂó±ÿ¤¶Y¶Qƒf4 “HvÓ˜>W¾¹yíú'ëñŸ›àÉTÙ__mo À˜ <Œ+LM´Ö'0’XËk¦¾M_[Þ»ü—ØÃ‹½ÎfWIËÄñB¯;ëayëñè×R“X]Ñ¡ûŒ0²]¨w¸¡¡Ô.(÷0œð³$¤ÀJGcÏ™èÄ¢Éð%ŸE¢C4­Ì‘ûÊš˜wW²ý)ö|ãz¿ÛKUŠ1ÿ±ã *°‰™p¯¬²*¯ÌøÀ]ü,o};ø!wà$÷­ÂÐX9€àGÂNkñ¤()¬:BhI{›ƒrjäÀ²ƒ%sSF–­—ÖØ¬:ÏTUKA†²#µÐC&I!ÊØ4ev¬–À»Œ€Š ` åÄ3^ KG$ÐM×¢c“®í‡ôš=þ²ÂªŠîñU6J’' KfÑ1Ý?í³ÿs»?oünqw` k0)bëµâKqŸ0›é6•qÝ€Ž…â<½dlJ*NS š‰P€`wS– u\±gå£ÊTÑŸ¸W¥o—ºîËÉßîÇîu8ë#ËüÌÞð­Á¡­‹`íW@s¯Û «á{:Y¬%àf\@D¥ïçnåûv§K/ÂþeB'ôÞÊ”ðDZ0Ϫ[áav-‡¢Öý‘ÖÅ8W·M×]¢A)>1[ 8X0gÖÕ“ÌÁ»²†¹Ï}®·1ß^ÈÅ3å:,ÖE1X~òÊÍ"ÎËVÍtO×`¥i‰õðYyUõ³è&㚟&[*¤v7.„Wº×´<;;ræøÜ™¼æ“WÓð Rt¢·{õ™ToóX™ßr9ˆî ¾äÒ×ëq}á‰f­¼GÎ;ºöÔÐá #Þ›ëÐLÏ×ìÚ3qmd=sȼËà,\µ[ø¸êͪ³`q´rêz¬m;}üoú\™z-6£Ã…ÚKÏ%‚Ì)ûYâ9%MLñC}·g¯ì™‰¶L#uKš…“q›’ë±ë΢fºp»ª+ùKÿöèÇãôß|¦Ô!²ÛÕ•)ý<9÷¯‰+¯dNÿR:ÖœqÔbpiIA1Ã8²ƒ3DVî”`ñÁºÞ¾!,$ÃÑ"‘Ó†èCi•Tó€8 cE›®?¢ÍRÌ.i'2ÄZ „# ÐCû½ÂÁO¹K9)fÚJÎ{äòת»IY̶¼¾K *䮥¦ÏtsfV²ƒ+ } ƒ¨ý¬‰ÖìM]üú¬,> H XÊ4ÈÝâu]ïÇÓŸ‚ƒFñ–¹p)˜É¡àHU…¯à©XWB!µˆˆ%8jŠBÔR´×,öK¨.¸Ä m² €¹e ÓêÁÀP(²Ì{‡/‰EêÕòè*FV©1¼ŒN¨*É©©ÐÒžŸ?Nßß3öVÚ(!Xr­l@Öc©&Ž0ŽÑÁ…± k½Ž•èV5‚*Y¥[@™z@Ž $Î@ÊZq±q&Ç5jNž™&oÍmþ-“[ g„C²„–ÓÉÐÄù_ÍñéìdúÜ}ÉSÜ«9Û°!b…QD­&Ó9ÒÐù î¶×‹ŠGcQ'sø‡¹ÞÑ9®gäÿóû¿î°3Æ!NÆ|@m|ÅÂN¤ät³,_”Wº}Óõlìë²ðøê¼ÝžÚ>ëCæ>=¿wÜ_.•Õåiã~*±öSy’õ päÃæyj9-J•7Þ¹³ªQ3§!Û‚Xå-£‰96²‰M£°‘`L€,ëíû=$“=ŸI ^N.‡}3/Ï÷ãv­óõÌþÒÈ|˜¯×¼“[˜l†ãÊÃÃ=#;ƒ+Ò>?Žî¾ö £æjÛ¦ë8‘{) Òk¼EE©?#…îÚ–N„1ÅdJ&ÖztŽµâ´—%~bಡy|s>”½à»b%ÅݨÁ³@ßÍ~¿Å·Ñ˜(&3ôP)z ¯»‡˜ÝGþqÙ°wö;œ=Ÿ‡kÿ^¾«2\Tš=WßÈ£â¡S ×)÷MœûT_’j†;£«&k-;%a;Zûõ}ž÷xHŒ¡ºBl¨oéêïaÖÕ–sì”/RP Ì–jÒr&]ßämêµ¶’ëïKýÝ¿UæŸä:”@!ж$*Rtá_í¯Ÿ? Ïß«þÖtíNR’uöaòH_ñ“+¼”„A$k P̳¸ý½û§î¡ !ùš\ÿéùG¤À æGµY*@HÌÅ*DÄ3¢0­o¨Z9ëúà$õÓÒ€‚½ªÿu ÿö`u[­Ó‘®êO©ëP-[æŽöý‹Å UæÈ=kòC§ùÒ5Ûº7ê–H¤8íÅiÀ/O*±ˆªSDúÎøº8œoÈ’(Ú<™&tÙÐú¿y\ìлžKÕ¯Dý—sç3¯O¢»ä ÒABbeOà—å¾ñè›u^¬rR|^9A—z­\ÍŠy }£±˜£×ËFtÍÈ0Úž;KgÈU¼b¸à*‹ýž—až‘J¯­ªº‰6¨J›v’Y?ÎÀ,,°@ðB®ÁF’eÁŠƒÌ®Ò^g§ÍÃ9öEÖ¬$Vsyp]TBÇÒ„¾.—°þnñ†¦³ûûÛ¼Ïs®Ð@Æ ´DA ¯–!9©ƒZÔ ÅIíÔ<Ž3âÄ;õ4 •³ívU@˜*Ãv¨'öÈ^ …^My2JBlhy¶óŠ~vèù#2çiD”Aë݉/ž(ŠLž-\«,iì~¿ã³ÎëM( ‚‘Ž.Ó0¦xŠ 4T«¼€{bÙc° ðb'à!‹Œ(î’‰U¥¾«—xݽá₺†™#µH¦o*K§xõ~)žËÛièóG]™žîR2‡ý1Ýûÿó§??á¿ù§Oú½ŒÛ8h‹]¬*q`….z6Ъ1Q%D XKƒVçõGȈ.¬JÒ$Ç4 ŸÀQKaµ¬I*ŠK”¥Î€K@Œ£T >3ÿbû|ðxÔ+4=_ã>j_â #ÚÓ±æ”8Šõm®ÒUò⪊Ëñ8ò¶*¢Oð€ †Ž ª€z•Ö–qq ^ÅÌ}@)0 f¬å@ž`aUO(ÙTÇM¬Û—ý9¾÷á½wWKÄ¡+Û>Ö±\¨ÀqR+€;úV%ÿ-Ìb*Á-[›"«z×¶jq`œ¡1»Ãÿé:OãN½ÖýÒÚÚ™%.ôw"”áºbz¶WvD®Í†Ç3í/UÜ‚á…g˲¼ÎTäÕáh¢:£iS~IúÍvàs/¥¬°•î÷´[3kaëIôc£®É/œklÑ ›ã¹e ¡L½<ÚTä×ÞKð†V$7j'Ý0x£°©áîñ¡ˆ\Ξ!Bƒ¸£ÐôG#½ô´'A”Ô\ÙÖGà¤c †Z,øB}»»Øú¨cD…ûøúá.»jþíkDy•ã4Ï„e 䀥qíeoK¨ñF£¶¼Ðuf˜j™ƒÓ?yâõd!oš¯ç‹M,Çfk;ôiçè`œª†ÔaW T߈Ú×óüÇ—üÓÝ«½ûaY‡¥#Ö8r­jªX7Y!Q;˹ƒ}ÏU-f‹+šá&,‚•Y¸Uà ð¤íöˆ‘TCÖÜÓ°t倧Q!-B5gw§»Ry‡õc³~GƒÊòó.zšÇèµüsÿæÕþWÿ2•WÀ/í϶vÏD‰€{on·]/›†p.1ÏÓ¬¤d˜´ž¾A…Ñ\W€{JƒH6 F¯™¤µ0Nën{3Ѐ£Á0°*6[9ÔF[& ³‹íD«k BËÒµ UˆZ?Þ ¼ íBÏ«L½®„Nf"'úQòÂý'ÆQ<ß§yN½’LÂdR1S›ŸùiP|MùÇËÊéS³’NHH´ˆ ŽÁ…‡QçêûÏ™áÒ'â–ÿ~Ÿ)HBBX]Ÿ)”9yBI„¢ eœú¥†ï.ÊÒ£­Ôî͸(ƒ¾ `8N<­LtËð©—8Áp8zhË0‘|4 ÑMK‚D§1,W—‰ut‹Ÿ¾(¹Dƒ ÷t£ÈS˜@m8­õú’>?f“‘Ï~üžïž}ø¾u>çlKkûÙ@’Ô9Ä:—aþå°/ôÍÁU%„už’jÃéK×ÏKÛo2ƒw|Lv¹žn /x†Ï€@ëhÛN·ÐhI”ÃËT©k aÏU¾…Fç(ö¥rÉ n¢¦yIhIyßWÞþìÌõÏfóDY[¥T­è¡=ºÏHƒ ô;!^âg Í¿?4YçcõIXgìsÍ+§Pí8Èj26âb:{Ã8…û…^šm-ñyý0œ¿6;EoJÏWË·;Ç8À£­q¦/éúȸÇгß7`yÓCï+÷uéýyõýRé·Î­SýóRñ ÅzÐÎu !ÊŠÎÉã*ªGÚªm¸ÉЮî+™ŠeEµ¯#†¦m @\!JÙ[,ÜÔâÜŠÓÑ®ƒûòñÆèEb;j<Ñ3ÔÚý¥a€õt¾?çê1¬L­ïÝðÞ¬||­znx=¬ç;ów®öÛá··šµðíõPÍ`¶QL{øÀ)_pѪgL@ ‹ªDyâÀ¨µÆ2éL/S­i7ô*Šmíó¢3M×Þ0(X"0ª ξä S`Ó†dÀŸíFx%@ ùÀ€Ÿ÷ù¸ÏÝÀ]p/þ2½Ë.Q˃ÞóèöÉvq?öÿ¼?ºxwrñyòlÞ¶ùÚ§|ã+l•ÈsÚ"«^W,OÆÞg0Ò‚‚Á°­ÉVÓD&„Á‹Zc5R'¦‡žÈㇸô[® ˜MÍ¿) ýs,b-S‰A»€J‘Ôƒ™†“:ݦ9™ÈMiu0ŸVÐ4·fá K\HÆ_qÉ.ƒ¶‚Ç:梶IËZžXGW^ÖîÆº›£{*XFñLF èšljkÃC+¬®Ä ƒ)vFDrž?{ùì®»l~æ}!®Â(D¨;NÇ´Æ61…ź‰ˆÃÅvŸótº<ßmtãpÜY~ùòáÅÜÁ¡§Å:WÔØÒ­}œ’e—aÃÒ“€*`‰7×aÖ|²}VcHÍÒ{1ßÇYb‡s_Íey>° g^–’s²’*)…†0R š Ô€•æ63ÅÒÌ uO·zb%ëZ³¤eFD"ŒÚµ†DµÏöä YøCk;/ïn8¢+ÚÆwö‰e½ÞÄÉìë¯vÚ;ÙþËÿú÷ËŸÿ×w³½fâ‚"†› +ijmðÑX³Æä{åú#BBHÁ”±zÚ!غ*s‘~WRh2²ãlŠ §irÉ£ý×'àù§«ñÜ%´­úÊÈd=¡>ÛÓá*ãJœ ãЕݘ'gpüûj Ôý¸ûmÙào4nÜú¶Œ»úåÛÎDé·<¼]“—·{“…Ä'¹áyþÑDõ–<Ø+uÑ£w#’Ü'H&.Øš`½w½+i׉ûª@ž™T¬I%Y8Ž7RTùŒŠ õéz0݆£ZBˆƒ:9mõ7ž¦& D©ÖZD•©E–*æÊ}è¶ÉÑy”È® î‹ét÷‰£rz¼°í„>3Ór¨)’-mdÄ®FE¢¢M+Œ¹Å¸yWyR¾T™M¬Ø 9 E"eÂm,7•5t¹#Á~b(hƒX#wAÛa€Yª­ÝqYC7iÂLø0ìpnb{àu<¾'M³O…¿e~¬Þ«À¥·Â‹rEdùºòâ§ž³5‰ÎEd‰ŒA pë<:$±@ ˜ŠV(¼žÄ±£Z}¨ý'‡Ïyf .'2¥_bNQ)÷~Ž·å$ŒžLt .*XñP ­Ðé[QÕQ EPQ’’@“3ƒÙ…£¹ƒª°¡’ònaúXŠP{ó=}w·çh—Ä$]Ú­^k¥½ïþÛ*|û\yÿfn»Owc¿xö¶¹¹{±³§/]= ìΪ#U&ó*<†³´l\cAq©(°‹¥ùÉŠ^´òÚØK°©OwÞüÛÏÙv”»5µ'Z ð-© á¬ÿê|}ïìhËÔmÂļù¥¶­5›[têp«|üíJ»…‰n˜×lúÕzØ:w}özz¸÷¸ÁÉqýçgãìNîoÕ½Q¦Æ:õ2O¯£½¡3¦"šÉ?úd›¯ðß.ZÑhastñyõ²j™*RB\ØûÄQÍ9Îî±{[äØìLQÃvv¦.ì¥â²£®̘Ýc²Ïð†…¢Ø†1Y<8;}Ïôz[[Ê\k|CŸsR½³öÙöEއkþóôl"Èqô,ô‹…Ão^•'Á!®'>ª³PÂmXñ+ëJÖ—ïoÇ™Šub€¸{@ä›Ò…íÿØÇëëù\MÎrÔb_!{ÃGFÖæ{(¡%‰n ]ì©Òv|6½*·*†š•”Ä>žo P’ºü0ê‚KÖVN¤­Ñf™á?ƒžöYüGFÑA!íªU90ÕÍNÀdH®²I§íÉù‡iôrüŽ:þÿß²î»9€¦uʵLÿAèíªg§{-8Ý]Ó ÀÀ2ÞWË…¶—\l‰³ Bgoc-°pѨÔ X r慎Í3ƒê¬^¡L÷­jŽO•8O³Ì´t·¶.]|¨¿® G,*kv}t6õ\Ø~zçbÆýî<»DßU_c/÷ÛÐñnÁÕˆÓ܇5Ø©çb2Í”ÞÕŽc/ûz¼Ë´¤¥¨î|Tú—V×î¯/Ÿ±|È#¬™ æAÁHPSc ©l¶`9L7^hb´ÀX\åóDàE#yçI˜Ã*`)xDXŠìê ù ÍŽÜaÔ—«JÇöµ¶%^˰!Fà1ân!·e»X“ ¹ÁoŸäëÐ:IïÜh7xÑÛfYRV‹‚‡àØåÆ;+²õ”¿ß ²éçdD l§sN&´ß€‘§‚ËЕœJ÷÷’D¤X‚¡ ÉTLÂ÷l8FIs&‹çø®à»lâ˜Xi(ï´|ÃýWnžæ¾w¥5ÊÃ÷¡ËH¶‚ù«õ<ÜX@¶×YËçÇ5Ì:@jWYýM ¤ª ÓLŽöFÈ ÜÃ8ô^»œö±nÅ,·0£”3‹þ_ÒÚ/[“{õB4RHÓñ€Hõ8×ýU9›5¥!Šš’e[f ˜{bÌ$ ¸¸võíu=[&Ï£o TÕÏX?:~o@åL¶ú{¨Ÿ:úAÞºnéZ“XŒðÔ2ŽŸl–”>“>bš°,êÂB 1 Ñ£æOþý“Mwœm}|+œh:ÖöÚ},ýôÌL!ÊóZ}/F¶¼Rí[ij02*÷ 7K¢ب›Ub3¬_¾ ~).uü‰§måMcœT~é©ÚOídIÏÜ‘²…ÄYWâTÓ=Ù?»Ñ‰8®£(^š¼vú‘ÂÅåÈYmTi‘ƒú1h,-MI±¹a¥¢Íei±Ø¾LV]nH\ƒˆ½à6»v©Ù‡6?ûÖZÞq²`é~FlRÓŒÖqâZ/§®’!ûõs}ð;Ÿ¯'ßLê6Êk•³×›…ð‚¬À@Ç¥¾Uë ƒ/m 8UM¡ƒ¶ŠÚòñjZÈx°´"0[\_¶ŸØ_RgÅxŽ< ¤Â#wY#fטd9¬8b·|Rk+M3F± ^VtÕïO›Üﯘõº!²Z¯èéÒ*3R¶ç&×)ïçR ÓØ0âBþ¦æf%ÒÎÄ6ņð;^+ñ ÉÂRÁª^‡Q8VïÊ80„C”%Caà ÀÌd&\æB‰@«›SxŠ«€,QEœÅ°•´#&áÉYÎ"Mìš×g¿7[>|ˆEI¾3O^]Ï3‘fÕfçÄ5¦¢Ì‡@­JT”Ãd¡@ RJ-é qG9H) !Z'öȪ@±Fð±š(¾]ý´{{´I~º|¿ÍÞWqõJ¦‚-d%)JŠB„"€5ëy;yìõãÇ{¾Lžì“&^Ç©N*1 e,dV–‹€H@þ´23S(·…ö¨GJâ 7åO¦péÔÅúôs nNÅ{ngn S 1ïß8I–°®øgtúq÷žH’êÛ¢2„R°ú<òÑk»ün}~ª¥§[ÖͶì[Dk›> |ì‚Tˆzd g‘ˆI`À˜VphË´ŠÖo‰Òø=äþ`¸Ï%­!œAÈB$ˆM–K?¸æT´raÛÞÖ " Y‰·üfÓNoámþ»e(çr­ iPV7Ô~™çßñWXùL7©Û€áBKZn䂼_0ÙP¯Sžáž~Î̶g•RØ„–!T j`IåЊÌC3ÏûéXj=VÍ ­P¡GŒ WŽP1¼)¥qóN®úÃK€uºØOb5WÛílrÎõœÇ†×RqÍ2_÷¿ÛøúÉÙÆO)çy…hˆ èbŠ„Áªš 1¹Ž@Q»M ׵΋õ"‚•ª0&YÌ’á1ÙÔ²Ë6U™/ mÇL×°uC\mü®¿¯ÇÝŒ¼l”¦Ë[ï=ÍÖçõ/ÈcöuâP]€ð’¸äÿÍùà×ê^Ûì¡¥Åòa}ŽÙ¿þp`¶Ô5¯l1Þ”páš´}'48!»öŽÔÕÙÅC°ªX3¦¢_Â'½Fsÿ»©þjic 5ÁY;zжEæa3s‹~ð½—°½;FgVPAßÉýT®ßYûiúþ€î½ÉÚîÃȼýÃç¸çNAºÉ*3ç$\J¬££‘Ëxš ÒpA‹P}"G­ßêíï~í|òìxˆ„V!Hd6"éãv‚¯]zþã÷ßö/b¼÷¾¿r|<úé|òÂ¹ÆæÛŸh<…øöK•|GÊ.5ªÛ¸¡~B(«!š•}o^jœ{Ž··ª>* îùõãkóþkzˆÀç³ÎoÛGZ'öKˆü+TúÚÚ¯lÞ€ŽsÏš[Û§™ÆnMÉOiCä†ÕíÖ1;ÍÞqtƒwixöô7+ØêÞ9󮯰f ”‚ZÃm>Â6±öö¼3Ù?IæžWÏÛ¯áf§#Î$¶os]N+3ò)÷g¿±ìÑÀÌmMžüã·×ã}Æ^xôd`ÀhϦö‰v‹ÌðÆc ì× Æ®•¯s·’>$#ËÿòÔ¨¤óõu¬¿œÂþé>óÜzjc3Ü ‹×ôø×ŸtgâýY?|4‰æ÷,Œ Þ«I–ª†ÿ´þKåƒ[¡fô1†ÃŒø¥µ[Ùèé1'EP5½* ºœ¬\Nô]!Äßa"‹¥—jˆpH€¡$ '‰0² ?ÿ¹ôç7²¾ºky/Ñ úŒ’"6µ&P—Ðô›5Dø(ì/bŸÖDÐ VÒl¯2Ý87-[Ùn§ãÁFwãòý½µ¦­Ô< m_죱aì—qQN‘s¯{蛞˯ ¶w¢'šTÆ  Š}×·~þµéxÌó¹ÒuÐ>ÛQ¡±V€£ÕJ ©¼ÎÖÛ°äJ%Veêç<œ.iSuÍsYÞ°>®¹wòæÇ›Ô¼¯qbæj_V÷‡—GïõöŸÂìM9ÇèXZÒ•:¡9ÚÌÊâz=Fb0m÷8:φÚÞˆ¨ÌOØGÀ¦œZh !BCXh)ЊJ(aS‰[¹ Š3I±X!Cç Ž m*ìt}u-\&[¾ˆ ˜^G{ʼt^ežò}E3ÑÄ$-iÏ«oó‡9«¸â3ùbÌPiRë¸ï±î›uXS—^3Ðg4þç)ì¦Ì|ç§$FÃí Ïßa}ò¶Ï˜¥š7ým(¢N¬´'+EqIÆ¡ÁLƒ»Ï KWÙlY›útz]—¦äÑx>úÏþ\<þˆx `‚Ý:ò ŸžåÐeXÍ*Hù H’X¸CÂdËEeÒûNÜ6}Ï%èp&W§#Õp´ 4ÐlÃŒg×<7Sy­Å[9xc61lF„ÙÆ×IÉõbî”Ó èžHDov¡×†õ -ãutt¾­»ýãÏŸë»{it-þÍ´æL,"ì¡ÈˆÌ/ý…_¿Îž„gU9žžóm³œé§D3z2·M+]|C÷/až¹wë°B1¡Ñ[IÃy~¼¹Çײr²š«Û7IÕº* (!×s,¨xÖj WŠ/ÔãS €¹cšŽœ+HÕÑ*•†Umi ìI?ÝïmOÍ{M;œt¦v¦Nur\&õž ,¡)põ^¥W8ÑhW½”Æzûä‚+Q¼âÈÈ©Ù@YäåÈóa eivÏäÕõjÓm>[¥ÖC¯\0+äEç?’iþÎ7¯¾Ô­—ZµÐ\3ÙD‡ùZ£ç`!7ˆ€Ô»è 7€Õ¾|¦ªý–ÎR*Mõyt×çÄIí`d…XÔcüãú“W<^©ÖÒ·&¬ˆõÙPÖYw™²mÔ75eñDUÍÑÒ©Lû~Sç¬j3ílž™Ï,4V!GÑ.-„¶•ŠT|ºÞé|¶ôy)Ôà÷ë—_óÏ…7X+5:ºû\sL`ÊR›ö2h½ú(õþr¾“ÝRÑ2rB4jÇ— P°‘oÔ´2WnáiˆîÍTaÜ=8‹‘–©”CB’nh‡grb.ˆc‘¢6Õš(]D‡ÔTÎ¥°”V{#`9°XeìK`âäxôv_~@]Žß5ÐlÉË¿gôá½çõêIéu¦D¡ûØèÔŠkýPX|¤hlE¹ N"4Έî¢±K3¸ò'ëxþ,õ[k¸ÓU†Š$3Ý‘;½OëyË¢ö‘ï›sýn½(ù5ûj~ª®n‹Gf`7?žúú6ÐKø$,Q"И+Štà<)½)¸-Q·Æe2€úbýþòå£|+Ôã&¦´幫B¦sª ¹…Úñšq?Êñ¯–&3ºÐu²zÕ4©¶…cÅ!&€–1ZêXRRîú¾†&ÏÖf¬0q 6q$ˆÐ¼àõÎ%>̃ÆÑìûáâ+úÉÉä³' 6ÐÆú_ª¦Û’1îçAìêpp©×;å2’‘'‰œËìP}·{²jj ´¦Øw7éÙÚÓ±¨{Ž;Ïú"ŠÞ17äê 4Ê:*³A˜—!ŽK<¶^PJ0wp^z>±oV8Ï#{–Ú;Ò nÀÇ䯕_æ}ÿru9î¿sé m½Éö ·™E®]¢Ö»Ÿâ«´ýi]›Ñ»½ÿÅý1k[nµ#ÂT+Ö‰ô<}A…NUÝu@¯Ì£÷0²Ÿƒ1õÐÖÖŠJK“+yÅ(—%,A D$l„ ¬H¥HI–є‰+´Ò&ÌЩ€ë2/σ¦‚>Y«XM¯ÉžøÏ[Pç²dŸx¡à§ð,€áY\þÁëŸÜýuþè~¨Cõ¬½Axþ½RR‚w€3Lއ« FÇÝ@ O; †‚U!Ô°ÐXdÀ1²Ë›¼^¶áOô¶Û‡†,Ú8leRþ­Ëv.¿tŒ‹‹ÒE($Ê¡Ÿ)böðt,÷°°¾kæI8¶JOb…}&k¹õhêÜõ²7óå;ÛùÏc£®fÅbìOÖG|Õl‹â¶ž~}ðXïÃKÕnY`Û´’5êm ²¨uúáƒh FÓ^Á¶œŒ½PÝ«žŠ±5Ñ­[;Û%EûcmxjWJÑgãtªj䔇]«'5K~}‹?Œ£ú}šp+î©éŒúj(øÆ8ZiøðM ÀjfVpå#`*gujv«Mˆ"ãJ3–•kåÉNøƒj! DÚ(p 9Ù¯<Æq iMJ•gE›@ …`HÎâïu¿ßê7ƒßGœªI2ê}äñsžëI®§tÛÚÛT›äÕûHnÁ*°Èôjï»åŒCL} :$‘}²NÑh SÈŠiÞ¬þ•§ä+Õ›'‡ø8Ö–^µL}ž«‡SœCŸ½Qõ¤ÆŠz#¨jN"6\éô{¾dðW¡e…®ÕŸ¿Î××àÌ%U»²È­)b%åº0ÚY"1À÷×ãWrå<\òE &¼`wª<Ë=+®tLM_8…aI ̲pT;ÒûO9ÞP=õuK;3æN'Ä’]Š‹çDkY³¥¥éU 庙5…ZiD¸#m4Ä@v1LfʾM—Úס>æxïkgV~>ócIZeeðîq^ÇÂÀb'àáûÖÑÐÃ}ÖÊ9ᚥ£—²ÊÅEZÃ\(£‹†©"3Ø;?=Ÿ÷ûk2ÏÆQh6e*˜R^£Ù¿Z{¨åçÌ6Ë \pF,1nô¸[®ØúÊÛÎv”|ñùZi10‚¢R¤íU;2Ó•ù"Ñã4w_íÃ|ÙÙq'cî)ÓCïf)Šæ»‰ì¼ŸÕ·8ðÉÒ„í®/T»0í(ÇêWÚýj§¶1´@*ɽw@–êĈ…:ÖFdL¨lÇ(¸ O¨ªÑÝj¦µ"11³ò²h;ŽØ† `¼Ìf K¢˜@HHöãë#."E§u¯g»{£0$ˆÉ‡ÕJ'ýxíuÉ;GÚÌ\±»,ÅÛȪNµf-R –ªA­ËËŠ‘®rÕÌô­èI1Ò€-K "¨'ÅõüäÏ?=þs/¿_÷ÞÞ­ÕL•“=݉H PT )hа+\íÂ_soƒþµ©÷¡|ÍÀQ½»ogðêÎN5ºkò*Q[÷¶ÍlœÁ+’OŠ o[|¥‚{È鯤êy•ð»ø"»Ítfï³£™S-˜H!"Ó• £HD烊½z¼ «ò´ÛÎîw~Ùo—º«ñÆ’ò1m|o ƒOCäVº÷¦ëŽe€·çÝ”Ì"Rß×})p½ý`=UAŒ_ÎÆa¹×ïu&©oô­Ÿ×Áôðü°Ï~º.¶#b¬5P·øÎoRB!% ‚Ëv:DT¦‹Å¢sö~ Êcóµ®¹½_Õ®BªÒ“#uò\úr› ­!hƒÔ¥ÅG ¬x¶Íâª7]¾$bq‹IG“Ah\ P€¨’IÒ‘ Øà^À‹+YÂ$I²6 jÇîÓ輄‡“øzPªù²X ʺ×ýdâæaû£õ·RKª*n²‚†ý¸÷☴(~T?šºÏ¸š:ƒ: !6®‚[5—c•5ñ¢ú*”‘9æg±D‰N¯2ùÆ:Á¸Ëê0#$›¶còTÞZÆe\¢¾!46QH… ;`o¤cѲ⨠iðë2ÛÛFx¬‚÷h-‰´5 -Ç6%ç°ºY•HLà "2qñe .pﺃ3¿ÏËëøÒ™ŽO­—ÑÒ,8¶]_Ôæ+1‰&ù±ÈSç^,KÇ|Þq¶Uš‰š œšêQM5òõlÍ‹Žº¨ëN…À•3º&\Ús=¶)Lïs—9ºÞ¯ùbŠ\‡ËWh¬ÆAÜD«"á¢oÀ2–´EEâ¥ù´t¿ r?-8Þµ©H‚$v&¨ä]°¸j <æGLXw&î¨ôéž•’j¸DEÍÎ`½]v6 æ×;¯E<Ÿ(LÆb¼ ëwg?%]<>‹d-I?8³±°?¶üÑãöYš$è;À†!N$¶X`ƃ)Ã.¤¹±ñQ~-å©Þp/£åŸÛóãÜÒ/Ü#k¥òö”š&g®è~)¤lÂ]ëX7„ ˜!¦"—ÜbwCå”<Z,Qd|®3ÕMáéÞÓþ”÷J4¬¸„¸jî5ï½ëŒŽ½Ÿ©¤Ú žÍèõDŸíÇ‹Hd“¦R絹ВtF;¶î>åà‰™!Z¸}9ô«xûÞÓ]Tª(š£¿æÃxÖ ´UCÏŸŽ?ŸŸÏ¿v;³ôzR ÂTŽpq!ql¥àÊ8DRÖ«ÖâŇÃ2…LøÀM¤®²é’g ©)u'Vö„¨*¶h¼¸`sUÍ$TÎ/»’µ¨Êså{Ÿ¢ôÉØå*£·ƒ©¨í+_´6Céžê[õ%#ÛÃØ©ÔªXw7ì¬x¨°ZañÀ¶€ *8ãjF ÝŽÑ %jǧ­AØÐæ(¡JØðPõã¦j(ŽX{ BPc¬q„;Û’XY—ñØŽðU7™¾+ØuG€D   õ£rѽ­ê®úõÒõÍ~†ë_Þ÷¿úåýš®yÓá aWΪlÜ5qŸZamž\ó˜fŠ^y:1`µÂÛù2'*óY¦­ EÏ^Ç?×ÌÛbË~™1¤ÂLg¿©¹FÁT“;éë×Ëü´¶YÊÐ{XXÚ†am/yIŒ–:TË8–̂ڵØJZFê-~Aí%ƒ C3¡ °`¥xCz WÑÛÃgÖV®°@Sd ‰-uÆ~G®<‹D$¹V-–Óåv5E:~ñwüo?‹,å÷lýÁß~²Ú5šs>¶ÌzXx¶ÙÓGÅé¾ùE‚ˆc³Œý´Koêù1xÅÒ¸8ІÌ Õì¨[‹@ÖJ¥ç'ÙïF§­³ýÆë^Ó¾ŽÏZ¨‘r¶ËT¹”JÛu\ Ý©£(ØŸnœé N/`ˆJ¹H!3SK4°i6£x$—«r"[h0!ÁñVÜ0HÊê‡Ô!ÇŽUü5ðßÿ‹1«L;Mó×­?²¨6v¤Þ;÷ÃÄÈ CªˆÔ±øÙä¢F3Óh˜=õ>ká"ÑPèEÇsŒ ûr‚€à±ÖÈW!Bgï>™ …á–‰GvARxÛÍl¬u†Ûh6‘å%Uš(O 4Õ Ó,å.S=À=²›ž€7kÕõ>*湌åòuüôÉï9Zjúõç§+ï{ Ì^:•^&‡3\"K‘ÓʺÊ"G™¥:¦º«˜ã!ó-ò/Öøê#GP!ö¶~W˜Ò~UÈÐæÊçÜ®wó݈´°‘$N‚†Ðk›´I]¬°HJ&KªX!ªTætMñº­Û²50À Èªš0¿ŽSÐ` 1|Üá0QàÅNR„þ@‘¿¥Í—ë𘠸›}ïe5>C½3~hýöyÏ8MhŸÙK4Æš¹ 5ĨÙH’´›‚–µ"Ϥ./DÞL~šÞMUoe˯Å|.ôS™[óU¹K¿øöøË'_ÙÞ‹1ÙȦT‘4ÑQº$@6©4Ø•C^ˆ!}[ÖÅüô´£ó°Soõ¢XµÞïï‰#5ý³ýêŒøìóÈÙ; Ôêt‚L̘`Ž!>1f7ûã¥3·9¶+[RvЖÍ,Åa4c#Ä( $NíŒQáMúØCÖ,|³§Ê+ìÐæÌïi“ói£Ü¼#r晩ö!‡j°¨.lÛßÉ–n1Ì tô“±[6%mtKàöõ܇ëÛú×þ\2ÅÙ/ØááÃ[½bèÐÚôWúÙáÛ÷ÇgÕCž+BÏ›˜;—ô³¬9úâ§ãí¯Ð^<‚Žé;A·âz<¬è®ƒô¶Æ¯ÞñXÌ…Põ,ÀÇìh0&°uþW-&Té_t÷}—Û㥽j{Á†­fÓŠ“SgöVEÀáIyÕåãºý“Sãÿ·i¶Zf nX6_jó¶Ù?¶’ÇâŒx¹h'ò6 'R{{7ø‹Íf²Í¸fIÌlÞæE•êÁ ÕÉH÷x]Mg åH€;t´Ek¡q¼š°°ëè1³\}Š6à\Y2`ƒT‡´£^îs»©Û=ä Ö”«Ÿ=‘4Ýø˜÷wxç¹²Z>Ì(JÅÅ͉Œy‘¶2#i¨!2Ž‹5ЦÝRX.1K°.ÁŒÏ;PÈtž=±Õ\]ñx¨½¶´ÌgLiÅ=x¯r¶A_‚Ö¸}~;t¦¿Ž C*…ß+(gñ,¯Q¥={Ül²Î\XÅBLj&‚AÔ]•ÔˆY#\.l ã2jI%îgÈ2…s»»Ý2©aI?)¤O÷C Üw6Ÿø·Dàx'÷­ù|9ÜÊøRÿUþ“¼•š©v5²è B¬éÝ8È}oá³AçBícÀ‚“ßTc­ËŸ_úq¸÷2AµFj¶LU)ËüðSW‰V&¨gÌ%;seÍù:kAuC‡ÿfîMÑvnbU¤½—É/‡ãkêa³PÎO{²á_å¢$h8“€ Ñl@a"Íœ–耄JM¬:*•á’1šˆ(Çv[[ì Z]{‰oæ£á Ú:}¶G:ß/9ŠYˆC;Béçò;Ž:ü ¯ÆP^ÐÕí#GÔ Zcüw ë4;}ãvÖ¤osŸËÓÍìSµš ãÜö÷C>Ø*i/S«þô[of.¾Ü·¬§ÎÇb¶T¯Vªj¤‘³:ÈlÆç£\£h  Výp=ïŠ_Öã-õRÝÛºõ,uháÝ©¤S’eúÙ¬çíU.v©dfmžLW sá}hWxÛ:ÓÖr1‰‹?já/fö8æÊª®–ªÂ¦jÆ®éHˆJ™5ç‰f5CET›6Ôµu|jØ´f¿•ûؘÙçLJ-ÊF5tÜ£VW!—Ô²RÓiò­m‡õ4æ‚6M¬’TaHÌÐY}ë31<¾Îz¹V^mnôVed˜3øuþdÖA ‚0SŒ—ì–1å¿|4Š‘² D÷L!z€%(v†U©f«ÙÒ(ÁæŸÚßÝI{,8’+ Ç0eRœ1ÇUéJ–B†ÓtÚu£UÆVTeˆyÑŒ^ u—UYiå®É¾wM+’ˆÂ4M#pͳ§A÷ë»÷§]uɰ”gº?Ðk®C b7r_z.4ÄwËÉBi¨ÅR\™²(ûùŽŸÇìÊ®b?§‹œ»' ¦…¬WÛàb/]:Naµ×ò¼±øJÊ|Ù_ÒEß8aVÌÌ0Å‘èa‡22$±ËÐÐäV]ŸŽ6qݮݴê¡#wO:`KGÕ«ÐYr¹Q:¾g‹ñv½%Ö+®|Íà )YÕÉæÌf®ù©àʯ2AhÎBÓ‰0©ìG’"‘D$™œ×ü/ýÒ{CºÜ¬xû½_ÿe»þ£ »k[_w.Éž¤‚½¤‘*2+ê£W©3¥Þ#˜Xâ—œ†ó>ÀŠcR%¶¶¥"€:kDøqÁÝk„÷sÃApMRÌá¼r;§x%|Üë™Î—…`7Y§?ý¤þr\â~n_g••õïkÐÖÚÜR-*´P‘õ¡ËáÔýLNÊ“Åuꬳø Ô©Àg§l³lÌ÷"j¯ŸQUàË'>òýçq’À¬Ï¼\TïœëdÑXÊ“ê‰_% 2VS U3iˆÖ6Z;µ6)»^&ó¤º^6ÚUl£>çtg˜™¿ØÉ»\!=‘" ÙB7èBF‚°"âŒÀz—•¨¢Jˆ’@¬1\±ÁàY¨Vg”æ=COÏúÌ`Ît>Ù *ó¿xãé³E¯Aâm –´+t˜FþÈ~커'P ˜‚ûŒÙ¾±eHõŠÒòØí´’–¨ÈOFsñz0”ûtȵ"¨*:ð:±¨Xz($.0°Ç0ëHÝ”¦ê¥½Ðürè i¸¯B‘ÑâÔm9%¨B…¤@¡éÊ׎}`‹¹è&] U©Ò8´## ¥¢¯ÌŠ´àTq”Y9µ¨Ã—r’,¨ˆÔQë&«£™ š£ÌÞ û“Õ²A2Eí`Ê8†±±i ·áÒÂpQp·t[æ’\ëy}·½-Y+L@®¨]!¶Ë”bêÚôléM†#iQá[´€›¤r kèµá‹1ëxôžì*ÖnŸ~œ¾â÷èÏ ¿¾Ñ×Ê9:?à[:ìýÁ˾Â~½~ïƒ÷s«[ð Ý“S0L}N.Ô 6¤éà]ˆµÆ)Q±†öJÚÖAN7£}²Pì0 ÀÞ×ÒŸPk®Qɼcd£‚"÷ª¢­á ËBô¬3¾^äTŽñk«HÝþZ™ˆîñîsÐŒGJ•Þ¹VÜü$5r;!/] …Æ }ºÛ9³û§æ‹ËXc0nJ=^á# ›@˜p½~#7~’뢢¨ZóXnbfR¶E.g¨×C# цèàw)÷!Wôz´ØªIwdû çpŸüzÆLóLê‘éº& *ÄTo²šë†a0š3b,ÑépþÉîÕª:´¾³ßF&®6¤“eŽJÓ'òš¹ŽNt°#-¥¢-ž”Š+C†©î¶ÒJ®¿¸ÐÅ•À10“ÊËu©dñÛ|üüL^¦cáþ›½?†”þ<ëœd«$—vVûÏ×±ÿpÎ7‰ !ƒŠ°’E„°o™7;ŠÄ-ì›­´ÍNà>öµmGÛP £V½ï¾¹ž™Çײf2®‹*ÇŽÖ†bj 01Šr ¤‘Ý@…¬$Â¥™*ažžk³_oÕÿ÷š?žfù.ëKD,aý<¦»WìÛ@ò/Ow—%pƒ±«)¢Sr¸–]™¨êŸ,¾»Ž÷ªŽK©é‘qî®ûŠ^"nN„t]ÄŠì¾Sz®WSµø8…Ó5Góusí¬²»h¥:ñG­b¬TÚRîa‰­òlot<çp†—aËÇX¦!”Ã-TŠ•°‚à§ ô ômÝÍÒÀ*¡T¤f¯ºûÔV­#‚ o’¸Õmü;ç¡Ç“ëG[áòÄß-Dßù®½û1šÇSN„z¯ë³åYìTl€W |j|0¸æ^Ëø‹3º«†!­ ®-µÞ|‰íáÞxÉ€üéBj¸â¬€üeæ£9ÌùŒóöõü©É&Å_ÇÚìôèÐ× µPG*»A ªÁà'Üß:ÿuÕ›)rƒIú°\Й‰|†( H¨m±‘XbMÙ¶\¿‘÷;Œ.êåÕéç$¡þ €?†k¤—QÙTü{fûüú*1Xåú-céE¯É´ïßˉÊ?*úyÙ|û p¯ÝÜtî3·¸Èeâ%02lMhíR†ÜÕpV£­sÓ}@7󛼉Ã+Í$hŠÚÖ­HDn÷~üÜôÍ8lXS"bÄÁ¾o–k±kìþ üÎg…­º:yþ#>véÎ3G²«>«LÐö¾_þÙ«Aöñ|äÌÕ—·ööÉŠÉüÐ÷¯C ^ø?)±½«gö6îUYŠóçÜú2õþ¼ÐºlѤ;Ûãó1½-#Ðâ=±}Uůdþ¥×TEn6`ýê_ß%?ü®ís¼ÚéÖªÌ3­ž0o`»wõ‡OóyRµ^ý¬ÏÀØö7¤Ã6,Sm–-Žôû?¬˜'}or·æ ,ÇV*üÕ ‹UŒÃœp. ™¶u9#Ðî¶µOÓÇxöÃáÆËÓZjž×,ÕOôÆÚÙútkÒ׫fsÜïeŠ'G7vb„€”ì£Ó.ò)O7§—Œ@ØSýŒwöU~öeøc|ówÿúáóeõ‡/_û£ãsˆ>¹‰ä p;úxLÊø+áM& .8è/ŽgOÿç£oßÐÊç?½µöñA¾ˆ_·ÝêGÁ?6ŽÂm=|KŸÓÍšÝòà`wé*OðÂÔ4?ÿ«#}«´yñÿõ– Ÿ•"3pšåvÉ×±cFôZMÌÜçs*¾J9<ˆ+ï.6 H‹V„úúSV0‡“Ôe:à)‘¡KtrL$»2­îAÛÝ5bט¹]±³*T6yƒ=ø¨æ\ž Wv€ÖeYÄ‘Ûn’]¤<-_Y_¹¾sõ¼´W#g1êó_æñè¹{dl˜XêF“5ýÕ·:^÷ÁvzJ`¤åf¬4Ì'Áê¿ DݯeoÛ±\z…½dʼnÍ*òD(ŒዱQ–Ú%¯Ze v.\æ:ÔæèÇù/BýeÏÇÞŸeÞ²?ºókÓd4Œbí†äùŽÞž1×—·Çéó=ãT¯i‘Õ™• 4·‘Ôû,þøª³Ä‚?Í‹&<0³rÅðî¯!i(t>Ka¯B Ä¼RmuÜx†ív6½ úñ–&qBgÜÀ}¿ù`ÆÈ«zÁñíÉ­žÍ[÷Iûÿ`æ}·ß5wÓž\ŸüðkYøGýÝI‘@ °ƒ;P Å}Ó}¥®¡¹kÀ\ƒ8v`P3霻[ØÝ¥çÿ¯¼½¯™ßƒl‹B{LÞ<¶+ÀUÏæ -Fgóvïšo¼ûô‹/…Ü Ûº/-ø)Ao*ótwÜ»°Ì¯#š¯Éen&3ú|êþ ]!ÎÃfÛ2`¤¡ÃOêJ;%l<)»q³Aÿèx<¶¼× KNó@†8rŒï-OR·Þëéõë†ÜY*¶yß­Ó¡ÙÙ:}°9ÎiŒˆ«’–}aç§}½6»N¦™C¡G”Ô·;L&âvxTvó_–^-<ß{ñ3~Öó³/åÞ‡þúð-ñÕ÷ïúú©Ÿ´‹AmY,4+®RA!ZD¢ëz¢^‰ìQhF6Á]Š,ÇÕõNã¹_õoû¼6ÆŽêlÍD!b«K â£õë”_oöWrp½ý(ßÍšºoµ8õôúëpR_‡gÙ–ÖŒ¡P$`ŽS}{çéºþ|bߟŸåø¹xh¦îú"µ*¼•ä€Om†——NpYðÕ›­áÒ’é~¨³¶–½¯‹ûªQâôëo³ÿ\Ï>ªŠ9”A6ôGWªÊ˜®8·.¾&›®KÍ+|óYpçuZ%)f¤1tVÓKÛ.áó˜Ì•ZˆK•hó Øò*K¨Ÿaç¤mw  y%Õt&³p¹8.ª°nÙUß:+ÅwÚ(ý°‰PÄY[@(]ŠÎ±1NFkSåA ]˜/ðçúmäsO÷kþªHÂ^d\ôˆA§o߻ڟÓZË.Ëî^²— %c—żŒE„ܬ·Ï=]’W¨°‡Æ§Ý½4ÌBc”YMé.ŒX^ªá½Q!ˆlTjirižOî½SrvüpdæúBÌ®WZ+¶í‰Ž9—§ê}8"ªµðµ¸îÓ5\h ™HqR˜TœE¦ÛÕàfˈý(öÐU*G—¢„и*M‡ðWÎ'È*¾¾eòù)úHØ÷¡‹­½¶â÷4ó¾oye %¿N®;›Ÿ‹CÎT5Þ9ƒ«Ý¦#eýØ9–ªuªôu-O—'ñ9Ù£|-(½VƒÇ ¶+ÞࢨÕgf¯«ÛuÏÇ/ßã{Â&yŽŸë•Fè©H¨Íe9‰÷ò“ó™~µ/pö:Ãsn{–Þ”qXÀˆTGÔÈ(Œ´„)h0Lé€ÃƒRhã­í¯i6ZÞ`Î;SD (FŸ.^æ¡«q´Ô3{¹Z鉸d烅eðJÖ’x’ñËïUºqF— yÖÏÙm–[—Ú ¢˜ØØÚŠ=_|9|±Åóx/xƒ ¨X˜Á"÷X uæô]|ÝkõÝË~žæ^´[ng?-ynu&¶_©ÓêÌî§;õoìTSÏu€õûÎYVžÃRœ!Re½åWÍço’!t˜„]JI»’âk\PKKÏLãÒ#™Õ¼THËœêäH¨f©)ë}rP°6 Ôˆ!F\È-«¶‚R´VA´XÂ^øÅLDÜÎÐ÷’Š+M¡A”6¯èã°ºZ¥ æõeQÂÙ\ëïf€Í _ô}áîK\õÓèvKsÉ¿Îf²±}Ót„bV‘ mú¡•/Y‚½z€ÅDl%)¹éw|²Ý ìIhieWf˜3Mz$)ðÊ"É ØðÒ]Á¸¡k{Ø -Ô‘HÓ=®uIÉ*"åýT>3IÖj¦ÇæŒ&AdA)Dpx_x¬YfQk’·½^Ã))ch«XL“U“ŠÖ²°¥Ù>S‰mƒU)•Ïq'àÔà,?SãN`<^ÁÚð öå{GH¦ì8Ÿ4@šgúZaóºÉMÒm4”ÈPh›c8^dbB­®œkJ›;ÝVßж¸š!9På²RAÂÁ`G’\î•ãÇ9pt¢¿­ìI (w×ðÀAp ‚†ñ ½WÖú´ÑÌšÕ3ÎKâ£ÿ|;„ƒË:”i„ClªÁU†4÷#µ£Ç¹õ —¤üå¼?S=¶‡GúGËë8tçÖêJ-èÉ©ÓqƹOY²Z ‘ÿðÔ·W®t¥ºL#˜eŒõd‚ '_ùräPkƒô’^p̱iVpä·ù <ÐB×3c$"‰° ÛÐD„XVM¾ÛhËE‰%QKM n»DN^)·äM€¥ÙÛ¹Õ1õ'…[%—Úáà^ûiôçF¬[<äœo|únU²åºÓ{£[³ >çóV>¥»!+Àña^ï`b„ªD+ÔsìbK`hŽ>ï_‹]îe˜vøBZ²åäyfUJÀ7˜\¼Ã=(0®Úf.ø§¹OF¡n€Ša~i_5ïÝ^œO¥:âÆx¸×@nQ¿x¢h P&Eص*G“MÒ¦ ê­ Åš€ãXqeð6Lã8À"6ÑšT-Ô´ò;Sæ÷{z2rs|G›žP"WÝ„É^G#óHìk­BZuÂ^XWõÝ^»ýÑpVñGÉy¬JmÀƒB¤`×€Aw’ÙÆ6bÚ¡ŒëgšX6=ÿ£~žÝþIúj~ïùGêÎbÕ¿Vù#qV™$(}OäÌ=„¢ÖÆ8C8ªL)ö\y×õ&loK¾YguÖQƒ’Ûžwoÿ…Æ €N—i½—’AöõZ?nùü?òhxgz/7$Ã…ÿúoŽ"‘)²Ô:‚@q@޵ƒ €Å ¬õ¾$OT,w`5í}¬…oMܘ Ãt½˜×Q"®ÒC.]fR‹Œ£ÉªæšjªUlR%ê6DT½±ßÎ{E”ѽ×Tð‹§[Ï\¿Ÿ,¢¬ÇOq:1xf ¢ÉÖ“P¹=iòœlº&’XâIhGFH¥Zn ÖñƒÒ5ª?´?»um嵩‹u\D¤ÿˆ³—õÏØÂªšŒ4+âTË›-þ’ì@ʨR¯vÉ-^óɨÐn|Áª§ð‹¤ˆ°žf/§† Éc ¤"/üH$~d1™FÖ‘÷eümýp¡½Ïî´3t‚’T–ÈÍ=޽«Ž“©#£dûµRœÉÛy»õFå:÷û&-R°Å:Æû  ƒE”äý‰“IJáìʆldôªòõòüw‘|D±ÎüSë1Ìþõøn[p @¢,„°i‚„Ât·¼ß“Þosb–Ò×ÀµŠ®ø'f¿}Y[럫®•MhB AZ%+ÂËy<8¹ÁÇø¯ä ÞI"k!!Ë p¬ sçׂ «aqÛ;éþ˜µŸ§H¨§;‰úaYœµ¿<æHk¢DjO“ÚÕÊ E›²¿ï£B–lÍkÿæã2ˆëD?]õïÔ¹¶ñ0/‘ƒuaK.ɬ S‚ŠÅ¬¨6›÷Â4¯ž`¶P3—8º_í$•xjt7l7ŒàÊÖL_MÞÄÚ²å;û(P‹ãj·¹,Ú’—BT»«Ý³<6UŠ#÷0í…«Î'æÜ7ÔÎpŸ@ÅöSûýýo®½,Äaí–™— £r¼#%[Ç/Ÿ~_µÏâìÒT¦”â0L1b˜2UÐörcI„ýMÚ_¤ä& Õ(Ôé2xbi" H88z§šÀ;rï¶Évn}TsF2rçg§OÂ@Z¿{´®jntºÓ‚9OhNëÑx•êêÉ:LÂß°ÝNÑ+Ä™˘Ě-,3¤ƒ¸¤Ã $ÃÑ6E¢G5Àcµ‡ÊçabÍQ7ÎQ}ËûЇÄìZâQûçø>ß×öËt›=äEÐ\¼— øÐMOp˜Œ›ø<ºe)ôça&ì?YÇzÅ ¸*Òf ö°ä¦(`¦6䇬¯{…9RÜ6>kÈUo‘jÂAa<îfÕbŸ‰ÊT]#}¬Ö±‹ìÙiõZ‘7½Ž÷†åªYøæÚ€‰ì„)QÀ}w-ð´Ô›ŒÙ¶ÞÈDí>ë¦÷oÜ2εötä»ñ`€ª¾Ô;®ýíXŒš¼#vǽ½ÔI› ?#øÍS¶w´„‹OXxÈ £F¨&K­,ÀÂÙ¸žŒzCßžµôé[·?ümœøØo>™ÇHçÅlÓ!G½U1›Ñ3Œ¹Àá°ÌÃB©ÏyÙ÷VŸãÝñ›?N ÀâsëÞg£[—ôUpz1i/÷ÀN÷½Þ¡}ZOIx3›ÿÿå¨6á¿\ñÈI9­ZÊ+½!›lœ¹ÿ±¦§CV” @~ )ÔÙVžt¢ÛîDëÉIîSžÐµ˜‹/Ëp¸˜‡½PÙÒ‰œ1Ä{´õ*ílzN£BAžÇè5Òå$^Ì™ékÐzè°3ÊÕ1 zfÍ*6£nÎÙ>ÎÙm¡J¥C355Fް*%×™ÑE ¢ÏååǪúllÏ–䨙ânQ'c6D˜CÃ|†»ËÐ ¾âæ¸48\{Ä•„ØÊvƈÜH`¥cò3~õhpIáZr‚£Ô€«dáDªü><ڷ߸çgÁì«+E€…ð3U%B‰@šLÊeûhɆ*¦Ê’Ù—øéaC¬»6ÔûÄ!·ºe/ºSU|Dj*_BbDA;÷Å’)CEX Å#¬úq¥k{í+#¤?i&M Ùá¬Ø‚Î{Ì{ïwu î'Ù? ßÔB7+™—M‹WL€QèIKt@QÅf£™ Õ±[ƒ›ÑÇ8I¸±†Z³˜¥šª-ØÌâÿtÿòùºÍ_ÿü0špGð#èu”ækòò\ª܃ùbÎNßStoð9Ò9óp#‰bCÿ6¼Ëéguõ¼øÆ±¶ÎDÖ§}¿÷5%4Ö'^’¸7`^PÓ³` r4;i&ªF-B "©ÌgÍôjû{j£ýr—À‹Îu>ž›Ü é:Ö À2mE}NÙûŠz]ÃOñä‹ññz?¨¢yÛîÇŽ/ §ÔŠ…È‡Àižq§´3ý·³8ŸM&’™Ì‘±^—®ä[+ç_s`ÇCðTõ=(<õ§m|M×ïÚð”Fb7ì§ÂZÀt^‹^5âú¥ùøó·™žnŽìƒz?Ïøöb±0g××Õ^‹õ§Ežÿ5}=›{µK5Kñ0j¿Tî)=“õ§Åèú‰T°YÁÚ¨ؘÈöÜ=îE£z”r¨Mµ\kB¶F22a+SCIcæÍ•¯‹Å­¨".)‘¡çNkŒ]óî2¦7g-‘Vº¢Š`˜Z¦õÒ²"\Ù— o´™:g9*µ¢znwÿ$s3ÐG]ß~XÇK(g• Æ…0ÈD$-19µu*‡YØеGà/òf ­ /TóêëóãàMó­½w¥B¼è…&âË6j©éÄÎÑâ ~w!¸|mkªïsÕ÷ê«<ÃnÏQ=éÌøãÊ *,E÷ZZ–%‡8½H5I)D©h?ôêÕZg+%sØÃ0¥I=5».Ó’”#ôøãõëíú#ÜÛcjŸº@ñsaEÔ@ˆ=¾€pZJ‹T|YxORΡCµPsÞ¤®=7ùÇâ£_À3ãl!)F“@èl‹jéο^ë¹_ðŽšŸùE¡m@p+öM¼ ¨}g•¼¸}îæ­ øˆ¬ãýécö·Cÿå¸GgûȰ@.e:ÞjܵßI˜Óš¶ŠY½]NǾm§Åöã-ÆÇ¯pö Ìc̾¢K^Ì>¡.Á-±ÌšJ¥© Qî† Bu4Ds Liê[‰)!+ xÑÈ®Xè#Ã" $ÀØÆ5¤jHA£EìbN è^û ‘O€N1³óY•"à­¨O†`$HfB)’f'~óK%%pKÞ†Ž5a\ P$OOÑŒ“$¼€ÃÚ_…玕ðÊ0ˆ&t]­Æ-¦—¦NOI¢®AX\ RJå¯qÁªæäuxS&1Ê«B’Ùj/‡WA‡ÒRS†R ¬—W‰7Çp44;Ú&"‚:DV!)i†î²þÈ®ßcmXѵ¨aK¢Yºv‘\÷T¾ò”ÓæP'¶ì¶ƒ!õ¼'#Y£w/‰5kk¶$œZ;UŸR †2´…¯*ÆÔv¶‘ݱ†߃Z86·¢©À2û•À¤˜  QÉdj`âu/.|Î5º™É#íhÍ#;Užm°µÕ—ï;xãcoÝ%Á4 #áæÅhwT•ÁØmÜ…wÊ÷ÜÐ÷AT}Ž%žU–+%( ÅŠ'1r³g£.’«¼¯•¦ži·¦?tØ*bìº? 1ħ`¼Ý ‘8'PJ”϶cr¤áA,Ü¡”29_ÒÛË‘…ËSö:¨0ÊŒJjq]æ² C-QN£@~ÁUK\AÐÅ+A†ædožó(Ÿâ8 ©àqDƒ€38{¾ôÏ”÷Ööòt“Ê4Lç 6ãH âNU‹¶á#¢ f¸76ËÍïêE’¢•Û¦æÚjºåxN­11åI%æ X±®b •–F½Ï2þ¸þpò[þé·üi8’Ðy‚çlYÈb-˜°Â9¨EÍ5b¨H£Ö˜ˆ¬ž:³}üy3[vVÚŽÀdȺá}ë|û`?Ÿ‡_i`È‚Ä*aZö«Q¥¼~ÑÔòZ÷z:ZLrþý†´†ˆ:¦`" H–Ibl‚EvFäDäV¯‘ÛïL{Z\XÏ v„¦Æ¥EtIzg×ýN9 ÌPãŠB&«> j(^e5­CéD£(2qõï$}‰ ²E•ùTx –L}Õ?U#BÔnq¼–£é‡xÑÃ@bëõuÆ Ø¾ÎÚ?žwÛ¾¼Éµ C!“D+«i}Íê~má‹ZPç{ö ÌÝ?Õvꬫ¬~ù=!¥+´º¹­À[¡¸kPÔrqŸ’Éu´âcË#júÀØQ[ ÙXZàO,1¼LÏšÝ##0,¤"'æ&ù_ñ,T Ó; ¾D~ôâÆŒK„µ:i€ ©Ù¯{Òmœ¢uc€m«H;·Ÿ±{_½>Ž%!U¢‡Å^zOýœùëîß1*6ÒV £ƒ*¨ÐYôš°&âìàõ£\\­ÌOµ-©‰ÔsÁU㈠Ã,[ßþ¾> ›[M±å¯%áF<|ôþMß~ëÚW-¬UÌÅ›D“omýt¿Ï š5UBµ1¨º.F¡ç0©ÿs›‘˜1ß>o¡çUçd§V¾–!q3–4økYŸ§Ý2ÿ-ã¿¥&ðoÿ:©i!S+Ð|L÷§½ßÑ€ìúØNXÌ€Àñ]DÛúºÅ‰ZMD¸ˆ5Èe'l ÊîlÖPã]ØHF fž›QFW<½I®Ý»Úžô;Puª•Y ߌ:«Í±rn«l³´µµ v%T"‚ª¦üvð,HÄbGzÀ½‰ÀÊ aê°­ÃNÌŽŒ›WB® v{Oº¸ÌË;øô _ȯø[îÎz§ÿ‚ÉæUAºÿ ži¼Ém(F–gT¥1V„½JT¦Œ¾ôúË^½—}GjØ,É0 „ V e¨€ °¨$¥¿ÈüOÂ÷l½´q—çÒžÇXÄñ”½tNóoJؾ.޺⸴ºaÚ$8®£<-Þ—ÂÊìÐØÖ (6ݰ'Á7@W‰k©ÏpžJ7Ý€ŽŠË[²e,åбZ’Ò©öp-h, ö ,¢´ÛÃ8zë¥mƵmo˜…;Èt¯–´Ûß,?\áûbè-×WåÉcõÏÌUYÅä–x–÷ûõQû¸ýÆßú+©{¬¡ƒô6ª·¨Ž¶ä©ßgàÜ“v>`„!2Ïf—Üoå^•Cù¸¦–^uûÞM]Ç{Œ>•ÖSŽå¶_éz„×,‰†b܇I¹éñ_ûçãÉûj/ý\ݵ¦zè…ßÍ~aG›º,9‡ÌŠKû›fò$#llŸ›ºÝóìÚôܪ#Ûh»ª€¡a9Æû|üÓv{böGÕV¦¥Ú]Ú`†—Ë4XÜ£L^bF*Y#ÛSwT—¥ë}Æk+Óåˆ*›ý`´¯ü½Þ¶Qï›Y. ¬qN®øäíŸ8­!ÜEýÔi@»TûöW•Ig«äæG?²¾âìzù¥þsÈÅÐgïAn_a?µwÎ(ë¿Ý¾¾}çF‘D›áà¦ÀxÿzÁ½Èõ4eeÈ`¢tzu‘*u@&LETXŠšùvX2ý®(Uqw¯-ŽÁ©¡it1 ¶,4dއ¥…‡löšRŒV zÔInάv4£²íÇj‡ÏëëÂ6Ky«ö–Y%†IeÊB‡¼šˆ°ðrh¦õ<‘QÁå„t´L;ww?üÛûÞ„èK‡JZ·ŸYû^ëéëêŠ1X»›] wÃáäHPãN7hÆÒ‚´Úö’Á¸ZŽÄ’VÓ¥A ~fc¦`jÌ4¿èèƒXû…a$¥F(‰ ý^êêÃå„éo¤2¶å¨X1…×­‘àÊL·@Eà˜qÙÁ¡fö÷Ý{3¥¥@2g%%Úi`Ñ% ƒ"ÈETm$š¡DÓŽ½ wНK85¡í²÷Oÿùóx?æ È©$t—ãMW7s)£‡\äÐO=ëoN~Æ| €F“<Óå¨9Ѩ! 2’dúMôxìØlˆ“‘•Öܻ湂iñzä.éÜ2ðXÿO¬þ§þC®þwÌDa:??üY‚°H}š½ÅÈ3¸J…ÂfjçOÊÆo„­‰$€ê¶9 mÒ  ñ=©Ïç©cô 3Žå•ëdÛÐ*b:ŠN©û’6rÔÂ9·µ' &¨,Ñ"c»ë¬äuŒ_ø|!¢yÖqù‡J£|Þ+s]÷8Õdå=ws A‚Ó<ìðH†ð/–tNáÇÙ-Ìmˆ¡]ˆâÌá1S½qÞÆÇ×½æçøJÞtù—ÞÜgÿõÙ÷œ³‰…®ã ?ö˜k¶^ºØY\³0Í¥èEØ@c9t]/>×·/ãws‘¥ãÖÖÉÒ&™Žy\ÖéHÃLPÜW4$qáÒËùpöãÌPÆ”äyk] ër¼zY²ÏÒ‰–%0„PJà%õЧ5K×ç5å¯Ô‹YûLÀë^=ß#VZïwÏQ8]U^LÐu Ëęڦ=û*˜vÍ÷cmMÜ ²u1 ›YAß¡´¹ÐŠ&àd¦ö•@åÀSå¶ÖºªÔ£õìîÏÏ—ëaú¾p-G«ÀûíÓ®°¡#Ý·û‚#gˆ©–ALÞ‘Gëùó~;™¾kNöì¹æ;òXl?¨'Æ6—'f2¬!"E…äÖy€-j)x"íÁrñÕ·”šoJ°PèªiÿwöóýXò(„ÅlG°ðb%µæ®2es9eôI]¡½6B%à¦)o ¯fTP‰ÝÜ~z,¸ u uÔséc4Óe¢I ÃK¯WuÀ´ ôc¢k-Š1wP¥Ô(®‡™ëðSJ59…jµ=kŒG]Ûb—¾¶Œ2•sá„ð\©/óZ‡%´õñ˜Iƒ¡¿lˆSàiˆ‘)q3â#¶ÁHMM3lšÈg†œT•b=XÃ=ÚžŸ S‹¶UQ” ìÑ|†£Æ„—[²ˆCöÛõG·+¨§§I-­kŽ 2ãÜ9?Õç§T&‹UL ´ÄlIÞ~•/`7:bˆHä:àµúƒŸ=9ž¦Å<ÿdè‹ÚõU×?Îó³Í£SDADŒq}ýý­þë<×—oy»^3º…†dßK®ª}ø¢x…@hT 1§ ÓfŒiR¤â±ÕpÏÒâ4±2E;µúÞõ`ãH™sCeìt¶iЬtÝv‡9þ®ÞÎk#‰‘°‚ÕAÿhúêÌ[¨â%c|‹jw LšRq4:¨D{²Ê~߯ÈÎÖ©PþŠ6¦‘® £%ü4SèÞa’ó+ -ÿäð7ÿiV”iåQÒ±õ1k£ –|NÅET‹3” Côý}¦ÿX·¡y¬òýYúOÇótj4ǃº.c½ä0Õ×cg&˜ ! H$¶×9¬ÈP!DZ•Q¡€×ô ÞÀКÎp¡b (Öð•¶]ňN0U™<‰v2ÍZH€ê gY,Áô58ÔQN K¯E©ÀN&™I¦˜r4BÄ-ɬ0ªS~ߺ[ÂÇÜÄ P«P±z£ƒ%L®¼õ)Òη.ÖjnÈ€@$H¦¨¬Z%ÊÞ;ŽÛ°èí#eÈR W;9¿ácÚK€®ºÛ›3¤EÃç=ÆH‰žDä¯Çuù¨&õü¦ØKž! Ä:´ËÍ dØ4⢋Û½û·îGuÆ{ѵ¬1NHLâ*W¬£FJ‡z+X¡µcšdû¨«QYÄ­F©Ùy+™'NÁR†±zÛ c–=bVÇ£Ñö˜øh šÍ"Õ vÅ!éÁu låKÕ©Ç̵•ú#õ™T®bÄvô¨Té =e3 µôdfh˜@.­öQ^ÅÈÉY{tU“SoôÅ%¡Î]¯èUYÓk|/°å#œzõøÑÕ+WC¿ÎŸ| ÍyskõßÉ3Y$Ègœxäöø;Ÿô›ùüI8ÿkoøG-µÓ¯#æï—ߺ¾vúÄ!aùéB=·aWÖèiÏód C”MZ0ÊéËú“üœ¦ÅêÊŽYNT$޲P XEJœ'ë’áVÚvµþˆoüÉ=YÝÓ ñÓ"û¼A9]g“3Z¨¨\ømDØ-^’ý2¹Ðû1‘^ÖÅ¡ PÍ iMüIx¾6ùyÍýº"餯¡¼&úɵ§w¾Îæ¯æ×Kol¼ó¹_•E%Ú°$^M}T?ÿáÞ›w^mÄÎ6]tM]oâ )F@!y™ÖQmpÂ<Æ^áÁýB+í|åÝÉy 1Ø×š¿m0æw40NðÓªšñ\ɬéÕ.Grâ´æÕhúù° ¯M5Õ°^=$à[¡òŽ«~û\S‡Ô$ÃÒ'†0¿Ñ]^¸’NãóÜ€–‚Rr^z®Ìaå«ÞÒ•w¿··‡M–‘¼Á¦NÞïO}_ôÕÁ%³§^2»ógvy>%£óñ˜‡Y•{‹ÿY‡Q‚Áÿ>íŸF«‚ Ø ¢( "+ª¨ò‚†z¹Kš_o¯O7¼3e¸ËeZa¡)HÆ ˆ2 \ 1c1ËÖ…™X²T•RF# Ø}Ÿ¿Ö½ÿsàÜ­`i µ¤žo‡ÝzYýku‹ðøíÔ33™õèó=_÷‘È ?׿èñdÿÞå'^-ã\­¢¾?;ŸœÕCgÂts©€Y%`뺓ü×-ÖG¸ïÌ›ú=÷º+úÄwp­ø£ÊÕ-Mä¨ÎºŽ#r=— ‰‘–3ijÁh8¼T 5µ$бÂi‚ V\“¡³—¨¢+µ¿¤‹¥÷ïÛ!Ù玸ӿrVέÁÖÅñ0Φcþq^™óä~#©»ó£ÂSSDTdgâþâ _ ¨cœcɹݩ½¿ø÷ä&Ç‡ŽŠÔú»g$XŸë…øä¯"ÿÏžý]oýÚ“oî̽âɪ>ÛŸÅ'v4éð†w)¢}[ôÇ™¼k|¾ÅºÕy˜]ÇÊÐnÃ7»…>5S±fYC¾ÜôT$±¹'º¼&Xþ|½øPIcoÛÓëè${cƒßWÅ+šZï9»wiqy£2kãSHäøtÞà¼Ôi1Y©”X¤³$@S¬ÂèYìÑòÇÕ€.ÇóãY{ v$;2šG´y¯~Ë_æïÿÏ»Ÿvuë@œº¦B#díÝÏ~ßÔÎþGˆí*ц˼*AÆ­Á5"Ê+Y»§¥ Í6ó†½ÍÔVŸúz¯L–pN®±Ø´²l.…"2Ñy‘(„?"Zr±ÊÕ>tíOlêór–íûœßÕób<ý>ÈæÏîûd]–Å ®™M¬ê¦!ŽÈ:ù»†M  õkèþ™X/ö Pæ…&ßü†ê³ÖûT—öºÍBx²‘ñ~¯æžä'Ëm%aHŽž¬Æ´¢Q›£²ÿ§ùϪXø=ÞxÙøÄѮӯß(½÷µxYáV!jµ/½,µÞD7ÄÄôpÇ€× ·`ÑÿS[1Úç¾PÅC—åR@Ï“Óõ´ }uoúJKÿ(õ!“ã·hG·£1»¹ŽÖSŽ_ÌŠ)¸×K°å¼í7öÒÕ‘adú6à69Îÿa•MáÚüð±Mž#8"=sì‹›yïôÞ|4MŽòl’-bêfG#»m]×iŽØ8V’c݆.½Y ÂhdžoûÆ–éXÑYZ‡¿ŽF{Î>[üD\Ý9ÏHþ¡b3µÕ W®d:¦¨6>Žë¾[6xúÝãïñú]ç¢F)>èdÄvfm•?ÆÇÔÞç^‘Ëßì~åÁëÀ²Wü¾Çöë©ùv¬?¶•ÓyîmŸr5 Eûÿýü×Ñ>ñ— ‰²Ø`˰q”´êË©…8¸Íºý7¦ú_ø¹—_×T}ó¾h Ñ ÌYíM^ÜçynÄ~ Æu¸«Âax8OŽ´ˆ—´ZêzJã!éÑZÔ¢¡±RrÕ@#Ùñ6 y÷äf€Û> ^PWUÎ=\´ÔºGwÔÔx²7ÍÔS‹FÈz¶ç[|.x/÷šeÖ”‘¶À*šû¡:ªœ#lfƒÏîž÷øáÑ`9¦uLËãrG¾3Ü{Þpœ.L£õí 2ªÔ`ÍXʃ kÝ®±P²»ã7BÕõvÛ虑¦L1²dÌ;ƒ¢Dº¤$DŠqPéï-xDIé!¸¯¨jañtçpã<†ÒaúšwcuüFØØ×ƒƒÑ… p+° Åz—÷Šj óaw²Û>—Çi7ýmÑfÄÌt*ÓKwÁºÚí 6‘+±]ô3èõ»Ð’ïôëµ›?=]t÷ö×è¾»}ä:=dŠÏ×âüÐgêó%çà9ÎÓ!!ƒdò§‰TäñDi¡‚AÌNAE=ÉÓª;‚W¦‰ZPØÌ™š"µ¹w`—›¿w¼Ýü?gþyõõ"÷ ?b“óØ“05ú¢¼¯’”—-iaÑð§·Ë‹{ÛÍI"¹aGnaôbÄî ÷˜…q¹Wáuòb6äŠv7°6,6f·¶,_•ÁμÁUöVY»…¸c;kò¢·ñ‘£˜â2I-“6ëB9½¼d«_,/Uœ'ЕùÚôðçÎëtxõnð¦Ä\®3Õí%÷ún(€H¨ÈYJ~2[îIÅ!cðg;þ3u}*çæ»4"¶ë7Ê™÷Ó [W_$ˆ9©“totšì ™Á×1\s«x°Vu2.™È‰|ÅqTo¯ñÅ‚šl0Ú©N0{–£¬ eªŸû³àK¿7£ûR2›™ ¸¢f¿á}h/¥#Ô.:婎·î¯H7ú À Xz1lˆ{Qž–4(býrùÓ÷W¦ë‡Êz"#Òlzµç\ôã{]+çZ%BUf­ì3QÆœl_ŠeÖËð¢~9¼{ïúÁré¬dÕ9pèdE¤¡ Jl »+JŸóà>ï›/͘‰y…“ã—Íí¹™—EIs H f.¾\"\À5¾‰íJjÀíð"[3Ž—]ylXÕëÆÕaãžµ¸£€btPðÔ'µ0µÊâÈ, ®¢¸ •±9üÝý§¹æþ¾h96 `¥µÆ­Ÿû·#‰J‡;ö’'iÓÏ{ìw°hm âEÔõ¨ŸÕÌæÇÔøPn±£-m`4›¹j]"àÑë*C*D)^Ÿ=ŸÙ;Ä•lýàl{ª%”ùš¥ ÇY sgÚH^ÑJÏ+Ø\hÐfÐ ŽŠ>H?š9¦e³.ÂKqYæ¤ôŪ5Ù+yÚÀXØPwj‘Áø„›BòDK !b±—{ÛîC ¬Ùu šxJr™¡ipeÔj‚ nÔâÐ×Kj±ÛD²;zxžzîÅOm½x¾ö{žÞýáeWYl‰’œFRSŪ¢l똯¿ËoþÙþÆsHIC Z3“‰³ÝQk ±ª©=ºú<^n0œÂ9¨òOÿñy§ï¯ï?üdª[ î'nãõ̹ŸÛ_øo*÷"ÍH]%Œ=’;ø*a9¨¯Œ*´ž…Ã›É JGñ’¶¨^Óg"E3‡Þ-_TwÌîž^CôLЍ/U*]q&¯ ÚÒ2É™—+ ¶¸¾¼ïf⌔ö$‰aïƒ×Z:KÌ„\LÇ…#k!—¤8_ôGr¦¿ÌÆ•¦^ïï¾›wÝ'\ÿs£¬‚çül˜{ØoÔ£+uˆÅ,õõ×ËgÎYÞç˜"Pæx·îX›¸tSé‹~+OáŽ[vã­\ÝOq›ä| ½ÑÛ—³ú@J=b iEJa¢‡Ç—Ý+ÇÎÀYL@# )\ê® ò#GÏ'Ñă‚e“5¥P…§ð–ãuÁþÁ¬Ož+©Ð~‘0ë•Ï: oý©Qÿ Ÿ}¡ ]õÒ^É7³†¹Ÿx= ·‘ŸÈÌÈ2T«ÝTíS_X¦9{2?K™˜‘@²¨¥pí<%êJI°“ãÆÌQ7°Éqù¥Œ*ÜxgòÌÙ{\ŽËP6Òõ2Ó’òÙ°{=ºEÉÈ;šµ.Åž}ç âØZªÅIÈt«¥—Â7¨†‹©’•–?#%Hô:ÚÑLfP”ŽxìxtYx™>Æ”ä}÷@Päˆú¦Æ ½½É õ9­»ëçPzõ€,aï#Um¼¡›ÂL~?ïÆmç‘’CÓBt€S§SfXy÷ÿWÞ®oQïšÎRúÿÉ/jÅßϯ£ö~41‰Onß~s|=]+álåÛ÷"Ù8>ò@.‚$O?Ñ?ówú#3NMiÖ­(’(ª©pE-Næ$ Åœ"ç!æIò]ÏÒ›'{Ëù{nÝ•²NKYh‚6JÇ Þ=üÅÿpí²Ð›Íík#Œ íŽ!º!æS#øÜè¯"aâ‚=]}18,œ¼{Mÿ2ïósíWòó~ëÿÄifíÙ ¥«cè×¼ ÞÐ7Óñ(½Ç޳ˆÌàÂ\÷»ÏÀ÷•õ$µ.V´ñ>mÕÆù~§›æ4¸Û÷7Ÿð·²“ó1×;´ÉŠâXåydÔ½Q[a­ÀaSv˜ã‰Û }aåiRÁ£èXT5¹Ïn_.æ¸ï³ýÆ|&RJYG Cšbi@=6€àÔqÄO‰Ø_ªk H¢EQ²Ø nt’ uØÔ0O}ÚQÂv±—£ÂDô©îK ڧƃŒ!@d}§ê¶çäõ¬íXˆ Æë9ò£`d w¸@zlk Vué9‡½×vŸÊ|œÁ£ÿè·Ž.Q¼¹ÛHħH×Ö©z{ÁªÔW<1@ƒš_C=ÁïÒA=òžbÑÚ®ó†”A…“{ ¿nV‰dn¸^¸V­=T™2e}äÑ_ý[œoÚ[¼>É6ûÿ¹z«³U §b«z…£h¹*–­âÒ »ÍÊÀ+xåcè±j·{þNmŽRé1ÞÓnC‘`1%vm‚eÕÅC cŽ©spø4µÜÐöàÿ:JÞíRé-Ç=åòAúnÓrþåàóõ‘½ßuŽv¿å™ž—%Óö?È[Fcfõú@Où|éž³“Õ4ü Hš¬j‡N gº)3‚%ÅÎ[¿ôñ'°¶W/]wroÎv2öΓíüù:ý®»Wf~5žžLß¡ªt-ÛF6PbOñ ¹·f²N7 t®D%¥¨¸¯‚ƒ¹‚Ým뇈¯OÄsA¶ß½þ¥³¿{£©.°%—ø¥ÍŒ«‰…N Rþ,p—êæÎ*ÿzËÉösè·BNšó©¦K2c|¤ó¥Äš{>7ÿns?ÿÇLþ@ö‡j­¡Â.Ö´¨CäçFÚƒmBøì çOÓ¬„óš™|£o³TA}Á ц:Ú…p7¹­æJ¦4ðÕ>Q9ø,ñ÷,¡ ZÓ|Í0Ïå×÷“×?üîz4©„ª^„žÀj¾̳“¼Q­±p%F~ðäX{4†·¸=šE0í”b»=Ê/í t~Ž3YuÑê·­Nø»—Zä©mh·…à´ë'„Žð¶0@XFœjŒ5ìeÝk£š9”‡.¡dE±ߨjàÙÆ]žm½¡b,< Æ6IOý æºàÙÄÚ (÷ÒJ:ñ7ܾ{yõéK/1‹ØåU)öKSáö«¦Ýò»xF1ÎK˜&†Õxí¡§w]—Õ4$˜ð{Éoæ<ªý˜›x<Ÿ/?ÙÞ’ÞÝ~·`1Dgb+³è·›²®¯ôŒÒh{ŠíUqNM„ù¹´Ü½¯‹žÚžï´=‘[ØûÞ ÞäT .XˆMºÓÞX1ÂvýôÅCíö®ÐD¸Kg¦‘ë7—tùn!½ÆÎà•·nm‡¥Ù½7˜H.Wè°dUï9'Ç=ô¯vÇôhqk]ÇRâþÓ•ýã©=ÚzÌ|€¼ 2LJɵ¢,ÜB§ÌΘè{ΪM‰`¥‡ÌœiÐ_ÓXAjÎ8;íÆ¼Ã.½¯ ¾ŽLF CѼ­Çí;u^)Gcʳù<{¤³PÇçç]ö\‡Ù9äsôœ‰}N¾Ü6Q-›HpõLlmâÜøRc=•”ˆ!JvInéÄ4mÐíV ÂFP#ض×À‰oâÖ‚ÙN•­³0VÊé!p¡Š¯“ÚbÈ’…TE]ËŸ“î¶Q_$y®ô®ô>ŸjaU<ƒdb³ÄÔ¦bx±½vÓQ£È#ñÌW¶çdäõqó}œò’KŠÚ¨–DFTØev*ÌhPul²Lmí—eE$Ìd »$”&œ%3¥‘ ÎÑýÃ#ûÎ\šd:& QŠNñ÷_w¾è´~ÂÆê+·O‘•- ¨Tèr.–6Mæìn;›É0 `‡Í(üJ’æ¶Ia"VA‡Üs|]¨Á@WÐ-ƒÂDa%TVHÃTõCÌõ¼›^m:&‰oûÙ{zÊüpýtÍ<` év-é5âÈOåÙƒoý“×ôÄ4õ%U½`1Ò‚ÚVذWµ£½93 Ö¶‡}Í&^ÂÉÅ!‰(h€l”åH®Œ]Í€Adi}ļrTœÆ±›ž¤4ýhèëÁð6.ã? !OZ’ 6ceÔ-,Q ‰Qð«)N8ÈàºTIi´ (íDÍ…ÛGËd¬Ð¥‰¨f¶q+i qdõ“µLÔh.‘38¥‘ÄàžKÕd&¢.£'9Ü Ë„VÔ‹Í §`õ@)Äv ÊŽ1ê¢ šÂ+°ÊÊÅÏVÌ!Y¤­„Á„¶ØDsJ±f_'dgÏ,p¸¨—“–ÖŒ‰.uÁ†÷N­FíÉH‹ÉÌ¢:1‚úmå1^7Ç€€%LÅÝbËzÏ“Ìú‹ËÓ«ªK2yx==ßðÌ7Òkù/^­ÿú·Ž_e]~zÀ™ã¼Ä…s ²§yx3•œ¤OúšÍkæ¦G»Ï×çõ¼¹¼–°(΄óËúû›  ¤À”H¨ „X@"F–©4̺ÊúªÍ©*<Ïù)~¥óëZ‡a¶{áã⛲’ ­TG9 –0˜.üá?¹ÄþIK§{C¥/¶Ó­lÁ:‹4ðîúùì̶&á³›.N?µoŒÝáõw¾ùÃÏÓ¯íÝZʼnV¸òWHÐwFβe¢£ØÑŒ ]³ïèœß7é¨vœ[;Ó=ÛbóÖÇ×%ù ëÙ–!¦ .ܸ“m;ä÷¨y̨bÅkâÕ”Ø!±à·% J˜„ G÷§[Œéö1oË ÎÄ«FL ±ÝxU=|þ©á‰÷/Ý­3Ó:}R¼ÙCŠÅS œNyj•…’D} @¯²ÂD?É'ñˉ:¤@›#&V­4§¬­mL§§y¢ë ´Îv§Ý8±šc\ÈÚs¼B0¨*MïP|ûSîW¼ÜEl7(ÄTͱÎr +K(08…-bÁ‡hÕ¨mÈÑô<ËaÛ¤Õ_ÏçLö³Ëßéù:zðk£ ¸QnÓ®s±á Yû ®Q(Èõ6#æT…Úm¥µ¬¤XfÜs+þ3ç_¢_p‚RS…ymïÓ¼WVãæA¨±ŸßÛº.?LýÔþ¬Ñ‹úwzãß½V#wÚº8hœ€”¨Â:Ìj‚ï¼bÏY·¢P\Õ‡M®bÚU€qYt&TÕP@c Úš gÑŠñÚÚ|DG«³vDS{Ž¥e¢‡OÞ6éecwößçãýcÌÚvù0ïùÍßw–ðCú²ùÓÌ÷[Ö°üÑè|ÆÍyhd+ù僞¾þ´Ó[tðÈ¥Å&x†I±÷Ö¢µË“f'ùæúê™ïþº¸y¸o[wV|в:!¯Lè~,.ݱN²^‘û)ž(XrP=ëŠè¨E¿_#^»ß32º«š ©²Å¬8FÁ†¶Gi½iªZ†W¢BHõgÏUþ=^øéý˜ð¨Ä[f¸#aLX8N¿1ú’ûEÿ›Ü_ÇäÔ Æ^©ÊÛ˜žÑR‚N ©uÜöÿ8ݧ•†ó¿¯µ?FªkàQè>ëúDI›çÛöÑk¶ÉÃ.¡zÍo×óÕŠ‰Öi ï.xô´{?xítæeÚÍn„vÀȲ»[/Õ>y橎wf=E±^Õ˜l_r?sòúë n~®>¨…™kPlJË_Dd[$0“Ln./LF NÉbó'k_bú.Øé 5úoQiùz¯”ãL«!(Ä¡eá ¯ï\Þ{ åx³XzÑ×­tó³×™·;ÅO?;ÀÔS5|ri¬cd.ô_r«úv–úì‹„ÆÀý—¾N0¶‰¡úsŸÛt„sãìcÍkuÝ×\bÆ}1§·5‘ËÄE$Ç­ä·®0>zõ;ꡉAÝ"‘mÌôÛøÛ(ŽÝokÖd wö¨›Õð0šê3´ÇË߉lÇôJ3k¸è=:?`¢]À› àFâåŒßÖ3ür¹ßãù„î­ÓFSŠTã.MfCa[£ )ó>Ä~jGssöÂù°;cFÇ@Ys—4š9OW­dû‹ƒ­ÌbÏáèœöâ !¼u³Àܾ_†q ï}B jð@޽uTW,Ø@¢ßõ<£+æ@’4×Û‡õu…\׸ß':ª ›M°\+¸d?žg9@Ëð:}nÈn#_éßyÈ2€#ù9ÎÙXÓæØ?{- =ªylÞ‡Ú YPT\sT0C—ÑÓ†ÏC‘€aeT¤PŽ'·T^èËšPáª&ã·Fd<îËÙéå¯úÞþ_áw*Ù±X.E¤°cÕ•hTøàíYß~]AÑe…•õ,üà¬ãû/Ûq°íϱ|ã½ýçjb<t÷ɨAÛ­6X‘§¶:QSW3¦Ö+è!;Ú„=È5è½Dt[}:„yë Ž:ǨY¾ kXC0©²¶ÔEG*£*ïЧ:>=§õ\´eoŒËv.Q­’ XTØQZ$•¦Fššc·„õÁÁšòÍ/ltïSD2Fج¹- yÅ™¶±'þ„M#nµIGÄÖª_ÀnU£ƒ© 7@ #Ÿ8z®ÅjËÛcâYóɰ`A YÕªìgiceÔ¶Iĸ«@¿Ü;QY5ùbä'PŸí¨H(¢Htö੺+B0f±aŒZì$MH6hʶ0 !”BÙžÇV3 §0ˆ¤"ûNš}ã2­å¶—ïQÿ ù¤û¼5îbã6úóíÿígu_Äâs”©!S{˜pW×~©0ë(¥†…§èøN¼N +/³Ÿã 5Îöi±w6k«üHÚ{ÒU¡ÃGz—¥+F SœßÃì]“¦Åt:&èAÞâ% {¢jc9,s8Uç¿£âQGDWw–x‰te©ƒX˜±Ý0;´­ ô¶tw›¢Õ²Ñ½UÎ3ç&S(Èx4KNûŒÏ7…Sq"ÖÉb޽‡~dÜw¥Nû_$¢?šæ Ÿ/™UðT„aü $„?wú«ÈsCgRÁý.å²ßÁƒjK-XÙ¿Òø –›O ±åª|ðR˜Š†û­k.‰¨@?8c°é 4JœRV¹™=Þä-íÌN$_²PIEïê›0É4c‹Y­UŸ£¼6ê*>¹BâGÚ3C;«¯‡´m3žìRÏ¥]OCDÜã¯w÷f÷Õœ1 >Тs\r¨ôA•äZ2B]ÊA¿eE™22r+:âÂÍüQ­ë&/®Š_›\cìj‰'"UH›7n&ÂB8 ~;9p=Ëc ñ”†Ø6›»ý¥xüCx‡ÁN,Hö Ê mÁ”;ïq® „\—§ðŽÖˆ1fÊÂK¿s çþÛ~ùœd׬†ÔD{Áoæ

Pi qBHväYˆv†ª0_÷j¿¼ŒTqØ¢ä2ÌŒ3ˆs™·0géWÃÐr.6Ê‚˜HÂI04»%=›ÓôPpŒýJ×̶ÊE°H…Yó}ö*!µV¦Ò‡ê¨¢¿Yy:í™9?|Šï¸ÇæÓí~ú[ä™L€‘†HÂ0”xQ«”U’ÉGs¯×ïûæ5”‹,h¢–Õ)¥Äàöšq ·Ãïº÷û2{U͈i±nåeÇ~ìóåûó9½TÎ×¢’À´IÑwôìgôhÃGn¯ Ó‘ø ‚%FM²œ_)ÖÂÕðhŒËQó$ TеŽÄ]‚§??•¥§–NŠMoXP‚èl×™ª×†ÈÂL¹òd’ÈmZ-r†ZÂo¨Lg؈•J§bvrês¬ñ&3±jgG+4e)¨„1#¤ÎõžïôûÙdâþ¤s±ý RWÅm¨ ºÏG^vêÉe_+ Ò¢…†4VšŒ©°s‘e3îàôâeÃö„,ÏoÉcü"«ïó]§‚©Î6³–46ˉýNy…¹¼Ù'tSÚñ­x+Óf€.ÞTP&@dA+\“'@HPL[¤X¡P¤^;´1µ+ÜŽCLx„e*“¨n¼Z¡‘$®Û4z Ñ|˜Ë¡õ@&ò”Š&"D£fš¾â*¨1B"Â`0„Q;ØÀˆf5-;˜Ãø%ÁЧåcÑð #;]À{ìSÊàFà©w¼wHTƒ·åÔãpörŽôôúJTzZ‚¥î_ᦌd);‹ÂóÛŽ•Pr3cĨ_–ÄÌËCJ¡!ÂÀKA”²!J$k7NЪ­@o ×…eR&X§ÊÓþŒšÐ!{3ÀhkX™Öj]«ÎWKè¶zŠö¶½:°ì8‘y3^ï›׸ުM†Ã^ä‚N¼á†ZˆÙhC8)ìQ#ǵÄN†€þ¨~ÍÖpïØëx©"Û\>Aò¦Œ7WöýÇ•íC;­ôyÚ·c˜F>¤mQèü³œîpv¥B€¶Eù T1·Â kl´?D­Ì_ ªùZÜV/­]½œã†ÎßMUéE}*áŽÝ=wòÔ=›º C×[¹cÖÆ œqædy^‡7ù´¦‘YÅ ¾07~zæ¥þì{õzÏßé´j£ö“4Ð’W„#[ a<É $Éàg:Žy‹xƒÁp—ßÏÍóýá)‡é|¸Ùä•:]Îξl¿b5á†^Ýk¹<ô³•Û¶G™5îͬHÅl*Õ`¾É–£\Ág;Ç’<Î_ßç»§§{þZNW¿õýkªI¿Á ©ÏØÊM7Z§‹ œÿÖÕ8!¸g‘|Ÿ½Œoufî‘„¼¾z7 ÀÖRèí±l`³Ô¥n%¦o5›ýòôÛÛxËXŒƒÝºHU[çÑŒà8ã÷KíÜ/wCÀzpã|laä 2Íç>ÃÎ’Ïó|Z¾ß»¾¼*zÆÀÁ@Ä0¸D<ÊPHƒm™î BMÀ89}þÕþz È †¤Rii «†F%ÈqEóSm™P•»¤jº†Žz‘å>õ,@€@£€‹¯:2Çî¸ê@j••‚9¦9Ìxy ‚@…‚½ÏªÌ ²²OúøÉ~ýÍ=‘YpÕç.?æ–|¼´±,q@q”õ{|×½ª¹Ê '¯S̵Bz-Ž‘F4#¿ËÞÂTeW´óéÇ•zÖÒP}ú.¯×ù>š/ÇÇ~TºYø¸¤{Wý§óÚÿöû÷©&¥>[¿›ÞfÓI©ˆEÊ•ÐÆ+ò™cC¬QÏ1íãccŒq$€f DYr°`‘¦4`=Å¥…DŸ†_ÓŒI•™6•4 6¼-°ƒ¬&ºCc놥J Ml¡Ø{~Ú÷•œÛWƒÞ€÷:Ï£i ̘4x­ytM/¾â:ÿýŽ`^ó?Ôð{ÛÏl¿túæýM%ùî¬göY4HF¶-[_þ.ïéÛþÁ^4¸#]p Ð7HaCI„Ñ//-K¤‹c#C{ò ¦‚Ñhm›óÔçWòVò•â«uH!+z;÷MŸ‰E»—àS÷¡b¦†¢¿ä7²öt'"ù½ÛùhæÇ{ç¨ÉgGeÝÿ.ò £_Ù®dA0 ¢+æ^€…B€fY¬÷]Ò–†1¶èßÉMÈ—ˆ•é¾O|Ìñø²D[m¾úà›¨×ñ\ÇE4àÖ0×Ù±²ÐB‡‚`ðàUø÷æ¥TÁMb/×j×pÖZÈkÕ@ ƒ»iÉÛŒòJ7¤òçï7Öñp? y)Š9ü»ÿÞþÛÑ?úþò<Ÿ°n¥yuG<Ì¥¥ÔMÊ;èE9P&È@+ç%J†¾ÃŸò ÉBû뼎ù'å¿{tþWÿ¬èßýñr6Ä3)pëPˆØˆ^~r½ZO7²È²\ÔÊ‘ž»¾³«¯˜ÅJÎâJÒý;ß6vj乄[‚ÛÆ<£vmLï¥èÀ´t2üuiÄ9¹Úñ&†ŽèZ¯úˆiosÔ¦y§¢‡7¿¿Ø½ÊžzÆËO?<¹žã2¯ë죔ܶGè Éu­Î0áÖÀç¿ùáò¥èH\XšªSãwììTZî-˜j¥üЧúôôíÚO5Çë ñUÏ·´Ö¶ ²c4ç¼O¹ØÔèh>ÚÖK…¨}^³Ï_>!VOF§Ÿ&úëÛÜÇÁ‚Içͺ&Ê(tè¾ –¡`˜8™œ·ü<~¡ÒùÎï'GÛ¦FÒ"¢ÅD´‡„ àæqUÔ–.ýñ†­¹WÔï!̱Hh4²ÄELÒu{Âóû¾ƒK|Ñœ¡Ý*tSËqšapry ¿á .ƒúÍ÷ϯu 7 ¤NKñö¶#ؘ@g°}š ÉÑÝqÅ ?l@åj{3²wëÎ]àö;Ê:?¶KÊó<Íë~)÷"ëÑ<ªˆ >薹ˆhí§§ÊͧfÃF?’-`Û© T#€–=ÏÓŸOþ˳}¿]ùŽ~ºg]½íùÝ_õÞ¿¨ßýz“aëÎcE±">Zñ¸vëÈÝB/%P”îÐy¤CÚÏŒIqMHô Î}AÉLFwª(•ܶNì7íʞńG^aL^iÜær{›´b@LµT#ÙnÐC)ÇTS‚7Fv)ÒQâ˜!j†D´S®~=‚Š$Ý;lÂOà—˜–¶4;¤` [T+6vŸ#O= ˜Iµe'MÜÏ©qÎzòÒU kj˜†˜êHH¿Ë5O-ãIök>ö8¦a .6scÏú|ÚÚrî¼Úª‡&Cº$Ç+¿|}7Û_HÉ·€Ž‰ð³Õ¯àߤA²-S¤Q@‘AYÄkÃ5^Ù÷d×àŠçz±PR¬´I´ÔÁå’ÐDtG]zwÀW©õ¸d² à@ERûYôluR!<üšù¥ƒUV‡.HåTÀÁ~×`)mõÂ0¢ØX0«ÓÅ‹¯´ÕJ~®˜Ag25--QJ[´$³•Á™µ0DNJ±‚¥³$w,G(V~ÄÙ—õðõkjŸÙÝÜH±Yo3÷¼¯+÷5ðûÖH9«ï S×gŒ%¬¨#ü ½sŒèéžziA‚v5¬¦˜† ½šô85¾uÇT»bܪ ÚpÆë”ûÙ79ÇÎQžr«áºø0ٔ˃ž6;é¾r³‰.ãš4ˆz=£6Ì‚ÅܨÇHà†d}Ñ «Â6Úu¡œî7Âh/37&ãõXg_B:Á‘Wè‚ÃOÑwßÁLš<.C÷4öO.©Ò*#¯û¿œ :ŠÕ AEJZÛ€w7êBè-’5— *ÅF£=^x¶+†2±>ñœ[УAOp“™… 'Ê‘|V·ä×ÛeÖQj;ÏËSVd÷xúz!›àT1¬.-õõ ¿ìv®˜£¥k1BÛÕîáÜóó¯Ü×{ÆÿÍÐj{]znzNOQ !´M\Xˆe=.Í\…ªû|üü«nïÎÙúë3Ÿ©A;Ý|ý¸¯¦Ï›YË»IžÁµ„.§Æ*k££ŒReÆ™4ØPÅÍL“<šè£½Šb$*&r)Ðw6|ïÝgr__âŸ7£~úõ‹¹æŽAil)¶•N‰¢O~ð<ežÝ™ÓæaÏ<1~šEøÌÕµ ºSïàNŸMÎYb—Ù@=7ß)öŸKxqoƒov¬Ü^[çW3÷7÷;ë›–}Ýûèý±CV¶‰ÍC›A¼Ð})ŒÌ X_=˛Ȍtª¡åû‡ÝãÃ÷ç¢ß—y 9†B@ZK†@™Bƒ©5\óPÚ»žaà™i,5"ûÚOg‡.`, 3U0FLÕQ *¬»åÎ ¤IŠ@ ´ FC-È ¥î©ààˆÅÅ@¶l¬ yŒç¢Èm°®Õ%ÌÔ Tóz^&\ª°[u©½ÇŸp¨OÇk>ѧd¿¬ÓuŃ\¡F:Æo¿ãºó±eâkíM¾¾®r“:“5ÂV¨ÁâʇiïÃ~“\NuòSòvíôˆÒO£|¹Ù:Õ&ø·:ÌYg}̹­ÓTÆަÿZâÚo½ŽÞO®;r¯è~”oM0A„‚`+†M?®, RƒÅ¨ÍÇѰ×=­»½ª«ªÝÕ¯ÖSyz> ¸„Lq|PéñzÚ¸ê¶Çº”Q—.àØkÝõ~uvxÚÑ»·¾W˘HP[Ð’~Þ“É?H†y¾a½HÌå‚ñœ]ø2ºÿpÎþ]ŸßJ_ÏÛûœ³çÊh¿=¸o_ÝùcÍ«³[¼Úóf?å¼[/4t< [™5œÿ\>T÷Ùý|­ÔE´†´G:Tœ-V ëpXýáóA½¥Ál¸bªÝÜ™¶ mXƒ†œhØ[’¿z_Ú½Ü'µÖ}©éëŠbãl˜Ý²ßŠUSµÄ,îS¦ö|ñÃi:'œ=£¢KºL¾°ÿWð_’ "„‚«„¥R€Œvnڇ \#†¯fÏ'/ ,]·Æ÷ºm.$ÐúïuøwIçïF‰ÙD|¾/¸õÀ1ŠÈWayó”Yé½=~ªOS›?I*(¥@`cÝ„Âå¡rDƒ-Úmpôj´) Y{…N_ù<_.©²Ö™Xw](,u_µÕS§íÜ*6¶*d„I ÐŠ®½ø´®ÏÅÍÛ:à›)÷r Ô¦v$Œ¨®ûãÖÉãOÆ{7ÂÛY¾¿_¸mØM(á9¾Ç&Rþêð;Ðýž¹[$v«æÛ3ÇZ¢T‹]­¼ïàü¹„oSãC•Ö2PŸ^>Ã=¡ ]ºƒwô¼Ô:´çš[Yèlw-V_¼Ãæ´rÚÏ‚ É%´T_—Îéú®À(çIóe,ÿÇz¿1wX¹ê¡ir˱ OJ6úŽHøý$Ð?Ê3ÕÆ÷¼ÿËÒwç‡Í; ݧ¬·[&^~i…/ˆ  WæÌÙ %Í-­YF'\jWMóíÔ Ü<‡ÏÁŽqÄ?8½Ž·¯ÍÏ«~AûìB¹íõéÁp…j ¨6¥ÜJ¡d_õ̺Áíž_ùëýh^ÿèÓT^r.Œx†vŽA8}ÖÙÆ/h>xn -P_´QWøz¥_âòX£¯öÁññ02Ae“Ó$Ý0“íÓšŽE¹ùDIISµˆÀö¨3u¬'«±mÖí®Ï“ûD²xïk}-!ý©¬ƒxÛÍ u‚A=Žß±v¼j¥ÚOÛ‡ÆFö|¶6¼ù—éÄb$(ÃѾàn‘ZÁ­O¨®Ç~r®·iA ÏCѼ¦¶Â JV0ÃêQ3Æ™6ƇïŸÊS¨Ù?y·rK9þ>ºðQkàSÜJ9c››ÝÅÙçýùúzsa `8þb^&¦,KÍœãǨ(»@3Þ F9ä>Ár[ŽÚëh³PÌùÜ¡âc¬Œs!&Ö)9i”.$uÛ‹ß1œ‰uâ!S$ü/h"мY=Á·ž¡\nÈ$ƒvÍêþ ¡¿ŒýŸß÷ДOí×Sì2°e:D‘Mç— ýÂP¨!“q´Ë:uƽè(2c&hèd–kà}Æ­ïôG>ÛuósEWgûú£¯Ô⯳±N©.”Ïåc;ýðq']M>D»u4Çv\HWIJRC5Ò+k©ƒ,ŠßÑO0£f?ÛÖÇ®<Œ@Q)Ü婞¥“DÉ5S¢˜ÛÝÆùÅš“î[¯‡÷E@~v;&: æ¦ Cܘ›K~?5  %·7ï´åˆðý`Ó‘©‰;‚ñ0E‰V¢…åà*wy W4¨–¶’O1²ˆ&4ñ¬.ucÊA8ðþ=þÖü×KŒ4 _.éÎèLµ~ç½pUE1˜âÞϱŸîó¸_E_¬Ã×û7ÑÔK/g<¹Õ ¶F—xëÝÙ;öŸ¶ûn¤»Üðú“þëiO&U´ Ý7}0‹¾ö¤s Éuë’ŒÚ9ׯ¨C›’¹øW¹ÈÞT€á7 4l½ñYÇ£‡ÄS”òl&ƒiMËq¡œ?p<™<ªG)À±|ÈÛé2HË”\¨üࣕn×\ˆÁx ƒòSdl[°[ø8åÊ€ï*ÜjQU ÏźüŠm?\…)d¢,©·iæ–„l¨®JW¹YïØ2Ïs ЙíkB†ò¹q:TH!"H1é¿©WO¡èƒ6ˆåÆÅ}+!¼°(’ØŒ¼@Z—ÆÍ(—9%½©«u¼àú@7•O£}Z«ºtW}ÊJ…'>þ£ýÏü޹Ÿ ³^×+g­¤ŒŒ—£¢ëóñfí½ÊH56Èæ¼°å]K?û:úÏ£ÖÔ]Œés¹'FRÇË(æÅ¯f›)â¬ÒÀd¤ÄJzÜï·ô»S‹9ËS£QRS*­BY$*·KÀBðb-âP°Šƒ"…B<’?&W!Ð$†Vjå©h> "(w¯E$˜›,ÁPß~çÇŸü•ú[¶žƒúàèsÞ÷ëÈU Óbn4ÄUá⊠„`.žŠ›1Š0à<´ÛJâ!Œ®`KÊëZáŠÏ»ÜàËOZ Wó±‹+È™¸›u&,pI‰Jì‡52•f¼ÊÉè IÚ©%,-z6ô˜f–£Qr_ιǺѪÇq9Gë–›³õòéŸu½¾þz:ÿA½écP_ri¢:ÄÿQ÷À„*£2˜sŽm0'ïÙ†Û”žÆ:§Û§õ ^xññêìE%*•ÇB§c@z 1¨ZtÖ©\‹̶Ösi³k%§œû@ÚHNŠ ¦>XOØË“g¸_Ç£PoÏ3Ý‚YiÕD"¥V©ÍÀ®çˆõy›~…%a,¤f1¾ãô/‡ïGã>±V™:°áÖÛøÎ¬J´œïŸû™ê «"W•ÍRÚ<+¾÷df¡)Tcqç™L :Å“ŽÊq6uÓKEž0AÁOtE2*µ.žëüy??õ¼}‚—g—3i&úu™¾ÃÙåµ]%¥]¡8j]Olk·‚Á!Q˜«:mIšÁœL²1íŃ,D§E•Bqœ/(AÐ<ŸkSì:‹Ç>ê™Öl˜Tårµx21w|‡‡RæQ)FI–­š‡YFFNlÅ ŽŒ¤±€ô¶±;ë•{¶ÖeÉæÀžXçˆn{&¤¢€bÑ(N,‚1]à)º`-B;£ Z™€jbȰFÆ!(Ð ©ÇæWoèCçç7E7\a¬ª‚àå>I‹…еŒµºLÝî3¤J…ÝLÃr“q$dƒ…xÀðÏ¥ Oq[YÑX8I&i Zø>ö’3‚0޾2ÿ*(8…-J½iEÈ»›š$Xé«ë†Q@4“ϰÝ@\ 5„D¥£#)6Š$øó{ÿòû3µÆ´^b–D`g!¸¤›VrqH: ýÊ!zVÿÿúËiÒ”‘xG<’0´F#;î}}üÏWü£_ugtHêÌ@ÓÖRCZ¸À* =)B[ìní¾rùÊ}éÏE”ºÌͳ⊿§ôu슕ðµ®_¥öÁ—Ì+ií¸©-$UÃâv€¨,) Šúó¸“_=ÞG¯ô7ùÏ‚¿wîvPN¤Ö‡™a/T®vJìê[å–rˆ¸ 'uÌùò^öçÑI­oE‹ƒýØ›6«ú1¢žV6Âvá¢Y. ¾Sc8>5K—=“€e-[Hº‹‹ñ–‰ÊŒR¯ £¤û9º?Òâõí…¥ç Yçúß1®ÿ5؈ Æi«oÍl°ïP?ìh8¥D”ÍJÀC†¥* %OµÊD a‡«ÔÑ~^Ifæ,Î'( •2gõÒ‚NOõ¢~YZo¯1OÂ_ÜìBc™,ÓVÞRÜÚñ}£^‡úµÈP÷x;kÆ‹,¿­ž· ?+(žüÊÔÔÝWB°àš ie阞 óÒÖ%“ìêë}½2÷ölËÆ_Ÿß•<÷)UŒ7wý ùì5ÈÖB eÒZ?[l¡©#Ž ü9æ‡yÎ1 Ó;ÅcO@Cè%ëʬ|rP®Û7î4?[”öéÅ$eÀ¸>JÆ#›êçNï«õüe3Õß^]oÿJº×ü\ø(³HÞÖ±³læÚ;JB¯MS91öÆX9FKTÚêÆÞåt…µ”vÝÙ[ë:~Äæ½ú«\‘ìî™UolÕ)Çh«^=®€3÷PáOÔû¼¾ë}ª†ôÓlͲô¿´úðõ]LOÅ-[ø¿ æ?Gø/¤ÿ#wïãì¿]Ñ:Éç'¶*{Zo#Ÿ¥¦Þ¬.s\ïgywi>ž”kØ/˜½’[ªË>¬ í »¡†.f¶™0€né1‹±}Ãt gâ í¨YµÀÑe,AÀxvÈ& ¸…]8•ø]ìü/‘Z·æ†Ò‚à´dÉÕ9êŸÐn c\¬œ\9‘cq¬&Þ¾h2.@D_ü;á?rõ÷œóÐmðp{¡ž#¾ö"æï¹Âfò©@/?>ý¾·¥~Ì{¦7¹üçîóqŽV3Û¹:Ä!§@c´ÙP57#Œxw¯%˜pó¥uÏß¿˜½)´FŽ.®ïoÕ׺­¨qbl|xV6è=(øgÄ ÿsérøJç>²o*v¾²0êLàföÙX—Í‚åÏÿ¬»|Ñç”Y_oöþÞ?#s€·*ié[»çÅI©•Ôf*t×D¾¿š_º(éw’Î?/{gm~u'pRÉS¢‡ €¥&Ä¥+F” É“Ê~a@¯ó¯<ÕÞ¶àð¬©m¢‰·"m)C*´£IRšZú%‹*ÞŒj½b/ú‹ÓB_ýN²vìdªõ, ÔÆñ]Œ~j\s©G{&H9 d¸ƒÙŒÍ¤)ÔÌhù(f+:†¸%ú?“~(û}z³|ЍGÛÙ¸RïDZÒh %áÑ9IÎä™—µOïû†Ø|nÇÇ}?U?üûý„÷¿øÏQ°^^{¼É«gžcú­þúZ_éÏ)ÇÑöOïœ}!îû[íä|¦Ý CÂgñôѱ­vº'âþŽN|}ø7ÞþÛ¿ÎÅw“Þ{nŒd9’åákwkš zyÛ¢Û/“ÖQïG, @MFX¬ÐÛœéýþñ„·É9s›z* ¾–¥| åÈ{í<7 y•OÒûíÈ« x4€¦‰:Ç.¨ÒŽãqbË‚3‰•f:&dëa>Sš÷Ç mµN¿lùs¾o»À%&j¾ÞÖþžZŽì‚K¯!›e‰9 =S"HrÈ( pŒ ½’εµÎr V{l@i ˜Þ^Öi3A3k„Š·&:þïév¯¤ &Ç[§>ÍTvÇýàýåàòõ^TãU~R1¬ÕÆ[ÜEyßкjj¤ ô¢€Ï­u[߀,ïÙGP«Èç=Úÿeƒ1 àÐ6ÓuÔÝ” #Pøã¾´Õ‘Óú‹ÝîVYc1l O˜c†¢( ‰½FºÃüªþß`©O ·t·DahÒ± ˜ñ sè_Ti8öŽi§§ü¬7sNÆ#‹ŽG·ûAë~MþŸ|š-74áÏÇû!ÚUé6¶ÉÀ:ë"QbÈZ«ßPˆuT×;éø¦ ©Ô–´F(\¨ÚY(ºc‘ÔHüteC;ÓGZzŸ'>Fž{š~p1k™Ò" ±Ÿ¿ë?ÙÚóz¾;ßÔäÇ¿WÖ*·òæœønÕëmp=ÎÎÍoÖÛm:{Ÿ ÷Ë®ÂÈOýÜYg-׉pN{«*9—P‘M#˶«xi¥•Žòþ ÿHl27;µN„œµZ<õlÙOÇ^„-Û E«XªŒf8s^©~ƒ™É:£”+¥+šQýOÐÆrÁZrœ¤¦¹*o ÖgýÛÿìý{x=wü{¶>/?ò­óQV½²K“ ¾ œÍKBÈCº(G¬¡cg.ɬO¡Gjb­Õ<ðy€ñJ~ß߯ÕÏ«r‰Jb ©ª"–2«å-¬ÊªÙ¹Ú–”<VPʄџ_ÿÒçþ^ãú6Ÿù¡|Ÿæ×¡‹æ°‹¥¢FP!åjPJA<ªÇr±nV5ßü÷{q¯ËÍkÜÝü|Ô”_ÆW¬t®=Óú™Þ¥âVx¡î/Wå˜ÂüHá¸l «Ôl {”Õ½{ ¡TÆJR*ƒÃ²H evžÙT=¤VÞî¥.£-\Œ† f)Ç”K¯&ÏkDf„8¥!¬ÄÇÅè=Cçcuñ 9àÎ^Ûušïëvç+‚áªÅ>X±bòÒš£A Tͤިxa Ž=²Û_!ø«>ŽÍLj†}6å3±BP€EÉgŽ—+Ϋ{X-B3Í@G¦!ÓÌ)ˬ+¸ƒ1YÇOSJ§dmÁ@3½±[”ÂVµ¢5®Êï¹óçsôù¼½½¯Ÿý>£ÏûUdvùþ»wàè@I¡§¢¥í„ÒÈ£[÷N¬ºþ÷†vA@ õB©ÁOxö¤dî jõÈ$-®É¡÷F·`k[šr-ÃÿÛýÖòw4ó¨_g«÷ôÛý¾õé&Éë°ß²\˜óÒ|ý ÖõâÎ?Ìmà ®Žlé´[`3ýÈ~Q­*»0Y¬â"5|‘Æå¨usʘÃÝû·ž¯Îí9d+8&gÃ4 º YÀ#¡d’—HQŠSV b¨"ÂŽò³T—bU$®0€˜„÷¢÷¥ÉŽ\Kç…)¸Nñ ‹ 2×Y¥¸.\¬*k-!¹K¤¬þ¯ÝhÏ×e؃º}žPùúÖµ¯Ÿ¢»lmÕ6fÛž’ž@7rDZE-Õlû㋊l«úΠ³6€U:º®dô_6ö›S_ %¡Åý õ:ó‹êýâ u-á*%G_膋⺓ká,aùlªú÷J•ö÷ÜxÑò‡…«í_([u*qm½œ¨ö½%ýø€Òn¯Ž-¾ªœãásÚSQß²¯ÓßläÔÈÛŠæãÉOZ¼{vòÚ[^u+‚Ãi1Ü$ƒsͼûD˜&.³Â=YwÚ±ú°Å1Ñl-ÑO†5g¨ÀÂzøÌ^©?–t ÷Ÿ·>›á¬@Ld>\î³Á/Ô;sS·woå¡d`Kö0¯*l®~ÿ¼ÜÙÿ)-+ -?7u ¶¶ÖËU*~Œé]Á-3œåŒ~’å¿S¾ {=ºò勱\ÓwÞèg^„ÿÕE³éÝS( kµ¾¬úÕÇŸ'ö$‹¯àyžÌý»Þ}½¦Æ­½>·Ozr¹ÿÙÑÌþ"€ºÂí²ZÞ²£«?šââ·âŒji†×cênÒ°'×}ÿ®oX·êHo·äîåàβý믧žwqÞÌu&í«¡âäwÝ•º“.ä4òŸÿSÿØåùrâë ƒ÷½fïûûKß>^ºlr¶WªÐ{££Ð]¾1AÏ©»ûqñÁäž7ë‰Ç°>ý²Û±6-æ,ÂjwSgŸ¯Â+ð–L@·ýÉ%9“&M¯¬·:ÎîÕ?½²úDÌÊ–RjÙ—÷ûhÂÇšFßñËñý×÷¿9ž¿:¬Û;Ë·Ñã›mwGé®\Á¤G§ÝsÆï“Œ$)Ã8ûÖ«Ci£+çÔó+¤¸^·G_oóóƒÜ¼5ì‘®d}ù½”r÷ÇF>v‰s<Χ€É片š½ëαÄ`¹Á6§5g\Ùò#×F)RÛ†OdâòÓ~4ïÛp¥í mŠéšc>‰í‰Fj¹ûÈ0Dìúa-ͺLoÌÿHÄbâ‡Þú½ýý§!±Òy.ªÔ0'm‚‘øóhþ¼é_‰(ëÐ!àËæ ˆ‡¾òòRLám`"„p!Qý«Ëxãó¿ù©†úÈ~á?“¨·þ×ЂÁú¥‚S˹ ŸaªÅ›|BK Îc«ê"wû4]ÄÇx¿ŽŸt±ŽwÓÈÌÛ“aìµÂAÜí~2ªï2¼£TŽß>oúãaÚâD×Þlh¾Å ýjpÏà&žèÙì½!|d²åàŽ15ïû½p¢\¿­¸šgOÞ Ÿ|ô‹>œœšãé„/¿•T?¡Ç¹åû9Òƒ,·Úvʼn§¢ÌDGÃBž_ócL׬5;¤ZÞ':kPÞš#8‚ ëÚîÕ¸:Þìx%¨ƒZdK^­L*tW–ÅæÞ†± È 1Né—jö>JÃ{2t"ºpáݳS,ü*èï¯ïým ~ïÁ7 Í·^ŠùäëHó>ÿöõ^>g7ýjOþ+/ý&ºy­ëXаi˜ÒpjD$"ÐH´1r¤_‘0”`*J¸R¢¨1P»ãÑÝ¿å5)©ü‹õ_5-»ä¨7ÿÝÙþÍFƒh­aϬ@O¼Ÿ:@$5|ˆ—rŠ­¹-çgö^J?èT¡ÿàå½Ã¯z™I , 2:—g!!š\4úµJÛª3ª#™\»·<户'k“Ip…U%ÓgÐLrâçÏ-¥B–? 4G3ä°?š~únOœ©…[ŸÝ÷S¶jšMÖQ‘*˜ªjl¸èñ,¡µïÛœ~ùŽh?;ê¸Î77œ[B#I•¢Y»–ïú´½øù ¾j}£®¹z7îw‡1ç‘ÀŸîÑoÐQH{ŒNTOnbº[·g{¾ÁöŠº­½ñnQŸ ( 3#›étƒ ¸ŒLV»BXàœ/LóˆÚ ì/ü?^×Ù•WªSP ¡3óáŒíé÷fú¢K4̨qÌXw—±XÚ/ŠVÔ[ofæL¸d³Ãr–u]æë¡ßV{o÷˜ä÷K×oµçÏè{'àѪµÞÛ¢ÄkÖúóÚÜßhÇïó•ãu®CŒ¬¾}3m𣏒kbÁÙÈV¥K ªrã÷Dïåþ÷ϳ¿Ò ÆPÚ‚‰,A8DÌ 7² gV@bnv˜²ˆöšC/ÒoƃúGíEá3à0ws)÷ÐËU0Í`QÐ$ö @™¡ÔDI“p±D < 7° *ð$!µ¥ñœÆL¾DûØüí°º+,ά´½ÒŽf5{:ÃÙ7ªÞ¿®ÚQ¶$7öëÔ¿¾OsõøÜI<|*êNõô |© ňY7Ž¿úÃ_>ÆÖ—ùxëÇìbõÔ®ÿÉ¿ûó«üá·xÛ^ 2Ës°~¿qúý6½Wü<ëç,‡Jœ#¿ô²ž‡DösvçáM®˜®ÊˆeªZQF1q(îä@qU: ·Æ]yî=ÑÔYïÇ“‰LÞ}‡&r9ÀÞ¾™/÷™RþñTkq«s¼TÚZ’Éך w¼Õß4:Uò«µ’#Ðã³×Ušù1âbi¨²²‰¡ ™‘‚2NĦX-`Äj€îʬ”Ẏ3µª°tgþ1ðO„‚ÅçÊA"ÃÒABUœ'…©ÞÙQ©j,C„ÂæÅÜU”r›Mbz@léZŒ]™œŠ¨Í Ìb·Ì »!Hª˜eøM¹³›gô$sÅ£·÷ãŸÞÞç!ðS>ÞÝ4·šLSˆö·¸–Žê/loÚg¥É5L£C3¨£ ‘P§§Ú¶–t}F3/sªœÜa"¹i¿çMŸïÿ¼_î<â{±×›úÏdIkW¬J%gTRŠnˆMª¬@'“Å–v‹…Sj!úIãœÝ'}Cyÿ~¾–åǯñv²c÷ =jX”Oð ýŠÊ—yØÞ¼‹}ú=n±‹¯ö†AÒlÁÐ*Èœ´9ó†…O‹ùI?Œ€´h8}ƒÿpä_É.ƒå*“ŸPœZR/rN’€O˜B¡8hʺ±÷s>ZèQ=6™÷=‹¼>î¸ûn¿±K@©iöÆõ¼àäq:MR²´ž *€•FzS²8”Ûèuœ¨‰-Na‹¸ƒ˜ ;xâøÃ]KÌg™z⯠‡öž'2P4RØ„YÕšnOÍÇÃ/v»øöýÕ7ÝÅÜ=CÈiÆóx/OºsÛÇäd#FL›µÅºŠŽ!X[@’+ìR:Qbw á<ó)5ä‹ý›uïk/œo}zC·G¡A爗±2»ë>ßû|íÿÃÑòC‹Ÿ0v³ûÔ_Œ™”Ž›+TÐó(š1þê°†f>·Ó€R^ Õ–‡0?1Iþëÿ^å6¬ gjv ·½PAýʯÍï”2”Ü–¥õNNˆìÊÚú9ßÅÜÕçN‘¹@Y…¡áÊJôÞ ÙÙ¶‹v}v–F}}pœ™»¨ÑÊ¿)U·ûß±ÿìõáù¯óò/…K"‡xŽÖ·­'ŒÀ–œ .šÖA³‹ƒþJ—”9©(¦òs1Äc7˪Ùt„\MfA×9YÎŒŽ˜JŠó«®‹N²~¾tv¢Kÿ¸ú/ …®çŠÏ$Îãîãÿîço¿ï?óæ}µŸ‹§þ­çÛ ¯MÏa]RTø…šéqMµ:Ü/6Ú‹ÛaÇô=‚¶Š¬|eg’od:·ñ²ˆ Õ ‡˜ôè…ι>[XYñ±ŒQhÔÆ­²'‡Ï}1îÇwY¸\. ZÕ¸ke_¨®ã÷_öàB!W¾\ÄÑöƒèK?x“Çö¸<F’äú' ÅR.ûÝÆ¸­ã>PùìxÏÄô¬ƒC¶u6ت?¶ã“v-t°Ø1­0Ô‹héÒâc¨§Ãb»Ö©ÖÃVXjO`ÙAÈ ìºÙØõö̺LŒî\(Ø£Ÿµ¤×ªÖÍn'æ •;w‘ÓN¾7æèß9îýápTL³ .x2õñÀÞþæqZ;“@¤=´†Ëîÿul†ž~]Ê+¥+Ô‡Èm_Â?¼ Ûºµp¿Bã|zÈ_Ο.éóQ;~³òò¢ï( I ÛÅ¥XH  ÊMÒK É;YW¯<¦±‰5ݹám·8Ó³Ð6šZ&„°Sx}y½Bîj¦!|u~õ?¡]–Î+úéä¶eE¬›•xÍt×È"‡1ì½³¶;×oN^ß [‚M¼ô‰#÷ç¾ ;¿)¼ÇÛ¹IB9íÅk%ÞëúÏÜÞ¸ð­ù·¶¿)Fõ–ûôëè§"níËN|«½?O,Gðb𓵽v ^ºüÌÆý«/C•DìŽbcäY‘Mjúxø‰?Å-¦½xv,H©Q\ŒxÿŠkG® ù‚þpî-@Nïn›²†X?;Ý7UÝú{ëqjŒÏ€ÏÜ0#³9'o#®vÓ]fÙ/=Ê¥ü”ûŽòŒè‘G®½èfqœÅq¿ñ“u[áöìÖÒS駃©Õ/5žá]yè“Ǿ6?¹€.]ÝzjÕ*¤5#ü1>õîy›»Ut_{NÀÇæU'vK¤P°Š¢iCºn•lñžŒŒâ9¦Äö®ã“‚/qÜzB0\$D9èÎ’YLcºšý½Šù¶z(•{$~–ê‚]ÉaÛs{XÅ„4ÞžW®'ýò)š@ƒüØZÝ.S’™JοJçvëÑßõÏÐ<ñVŸ° <8ê—ˆ$µ¡G±+!!…“”L’-  Ù—ïxÜb¿ÀbÐ[nŸr±8 YtßÏÚ[œ=ÙüO&·.9,/p/%ºä“ÉÎÔ<}¾%^–O¢Ç–ú<§™ìÛ‹V*q6¡‰¶nw:º L¿º²Þ´ÏÏÂêÚDÎÈqyÖ<Ò›“CÚ1g­º)©§Ó Ni —-Ê)šÚÞäçsAkL_DÅËvj[¶­Û¬8Ím¼5”¡>Õàâº; aù@/²Û…l‰´tÂ38B‹¡mÓv:»MM ÌEùÄ¡ÚîÈBþoBWôg³ð ›êæ·@ÿÑUyù޹¿ß­NÝ>ökkóî~}ãßtgk¾8Uc¹„JZƒ›ÆvÂ5©R¡UBè J`£¹†b¦³DÄ ˆ&û]ÇÀäó]ø7‹ç]>ñæ2ÙBy80›ÃR­O ®òûlëw—24àçK2ù5ý<†³ÄÕª¼?-nØmyßZFJoÓ¸êõm/Ù»™sñúìäRyìÕém®-©Õ Žy‰Ø"Ø‘îÕñõ¹8ªÞÛ"­Ñªñ©êØQ—'Еŕ@\1Û”ŸœVØ -›Ó!¡ü8cQø¯_wø˜ÑEmèîþh¬Gë·!z‡€ Ðq¦àeipÉœ¦ zÍ?¾õy<~]Õb›¤à\þm&fá‘× CõÓÏû­ï¹V…àå¹nj12gÆUÈ\ †Z\šd€$ 3Ó©%JÀ—”› WõĨŽ>Tö>VçL]c)Üz.vœÂ\¡à!/…„B“¹MèÀÂô[ *mjh jü(i^ÎãöXçwõý2_q{Ë̳xs÷keËf­7¼w¾\Úå´O<ñ7±3 ß^ÎèξIm=Þð!­\yvI)éHŒø7>ÌÞuy¯¾óïÉÄÑë‹à¿É_öù¾›:=×âør žj×úêý¸ñ§óøàî±?N†ÍvûX'ƒRœˆNLæœìeÁa‰™)2ÑÝUe­Z5­Ÿ•…´àì¥û—ÎÝÿÐþOë'‡`\loË…q-"ÞPàܹ²6yÒ>|øç£õž•€†9¯Ð•ïe_ëúÆ2fn­ I!!A+†Ôy¯‰JtÑ2§‹†DqAh¤DBqê4臠 \lHÓÒij)Ô©3KtÓPTÌÔ¸ ͬ^‡½çgÚJ)q”ÂÈJ‚¡—àØf²*v ,/Žªí ˆy§i!R &ï¡U‰^Â@LHK´˜Ôà¶¥–TôôKW£d÷5ºsX™ð‚öC\zFeVQ¯Õ|uËKV–äøÑùÓeÎ;µmÑ•õLu{èg˜dTðê2Q%h¥íá'•—ɵ¨[hnKЇØÁ týÉâöÜqZ߯´ï¬stN¯YýF¡¬\\ƒ_RcHÄô1Œ†$“5ªhÀÔW¨TkÔN–Ž,Û½Ww:Åæûì ù©õænêQw!QD¢l‡ ¥:{õ‰¬”ÆŒ)zð&«=<•Gú/Œç€Ó‰$ sˆCWø/Ø3ÿ+üß"þMPjÇ+Ï“F¦}ò±w¦¯ÈÄË-rº7ˆRQ$§ûÚðß?‹°Ó"¶‘8TÞ:À4«‰±U´¢ª%ÃHeáH— WtÊR;J‹$N¸A¯„ Ž5±%Áár8ã¢'õ³l’ªE€•þ¿ÌÝǯÜùÑ×ëC§ŒÓ}>ÝS›œô°4ªˆÁ¨H^$Ýxü$=‚G@sŒ·ÀWXÛz/w&d¤ EÉ;ƒ÷ ëÕq¼c¦·o¯±¬øqRÓ㜉úÙy|Ø/Ù»àµÕÚ/¤5/“hÿ87¼4ÕÏØŠšÁ ÙãÄ'ÓdŒá¨žW‹ëK;76—Q³ªƒS%žÈÌ+M×Ëý¾´Íï¹­œ®µÓ¿5é|ýiÁç•l~„ªd_ﬤc³½,åññ:ƒææÑȯ‹°þuãcã·ê°—ÔokÜ3–µ×Ƹ;}¦%J‰µþõ~ÿîñŸþ̉o»Öî,œqŽÞMFEM{|lZÔ¾œÎ… ±5÷tdn(öj*ëĸ¥íË”èrñ`àGÕãÌj¢’"×òõ’ï7òë+õÛµõ놿s}ž×Ïýöîõó­ø þÉû½ôúBú‘žŸReïÀÏ?Ž¿ý¸øä|mV²JNÉ+®×ûº8—W T„K‘JLì$õ:L4EIe9ãL1)ŠÞ¿<Æ®å¤gIáU_õuX¥cÅ>Öl #%;R‰ÙØ;˜Ë‹ÛÍ€ZÖiMC B™~Êxî̼ž|ÞyÝ®7Í]Ë¢¼*³žV”ëôŸS;8ß}çè«lýÑ’C¹j:§TV!ޝjh€gýÚ²Ÿõ·Çí;Ï L=C¶0§^­³tvû×?2IkÌ[>‹ɇw;ôÎÚæPŸØQspÛë‹‹öŒ6Wkqñf~L~E6ŠT ²BŠâ¤âQ¹fxAÐÚ3…º KUãsÎ;Žö,8MˆUð ±Äk:³1 ü²,ˆJlS‚Ög¥¸‚¥ƒ‚t]#Ú-\5•GŒUÔ’ž€aŽ, þ`Û¤9Þ¡’ÈØaZ§w1£:‹yh?ˆ­å5  E:«cØý\“óŸ ìÅåÔ~[ò?CËž[ÝUM…}€F’PÛZ«É5`¡‰òcÞ¤ 0‘ ŸE+:#õL6+‰A@*,`síU-€J;Ä œIÏ,s`ÏÁU;ŸŸš{—Që5¼—…¯w}}ó5äïuxDvEóÉ~û¯µ'¬´’)µ×qKoSJYh|Üc­£šZ®bD:‰+  B;”(XClyä‘ш{°Oä6¬åSžjÂ8*Ѷîb# QÕ¨“ˆ:Líà‘V5¯CÑOÌ«°Ý$ö Ü­Ž›œ¶ Tau8 J-¿(oÂEø¡#C,‚ÅŽ·EòCò¤ƒð“et:rñU&…Ù´ÈbãŠÝÀ,hÇ% Q¨JqFBÐi(©Þ:/~—ñï^5ö™^®‘¦Ä¶B©t!XG> fK½f  õ@(G2™¢-Wš–ã{³RÙhQy¦-v4d§ïT†öc$úÄ݃ Q›Ñé¦}!çáh¡YÄšö •'Èo`¿ѧ$Ǿûàô~€ "bBCN •{Ó€¤pKþ×2O·©•nDçzr£¯ÿVh‹q@I5—–»~sJfŸ§ÑÖm­A=Ѷ›~.Vôfç=èßÞ,x´E×DêrÅÎN¿ü`þj®;éØ3jæJ¬>¸q(À vÔ`d^Or†8±óÉÛß1u}<>*”7•Üñ±(ös|ñ¹mgépÌêI懷©ªmi·N!W|Çøé Ë8‡³ó¶oÅä'Ún’Ù'÷8§ƒg@ÏödFÂ!ù¨­ýDäÍNÛy¼bsµ]v^8º¡]ºtó僢[Yö«‡~ÿ6~û©÷‘Õ. A.,WP¨tÕëãåÇ6[Ÿ3ñ‘_±°'ìØÞÁj—¢¹ôžt0!nµoØvc¦eem|c¡´AÉl&ÒC¼~ ™æñ7Ù—â I5—£È·!úÍoèD@ùà’è6 ÿ侜yùÿüL…ÕÕ kå£?°{¿ADzFC +·ÖˆÐnD¤e£@<k’Ï»s]+5^¶nÐD²`¬ßÏ™}Óv ^xé­÷•­/ @@Àð@è‹ÆQ3n—£¸Ó{›Áß•[}lOmoòüøG>ó›t í¨š?™~Q[Å%n’Ì¢ßùÎ÷±.oyç:HŒÇíùçóc2GkûèÜ:Ðéè#ÞüŒ¯MÏA& í†)ãÚoÕzoºl$¯R‡S7m·Ú®.LÌz@ãs¤­Ìj;0:[EÛ7ûñÍ:£³Rîoà£4ÿìÛ¸Ç7C‚¸X]ôSåõ–•9 c3z– îBYÞ0Ð ûoKö™SÅ»C+ìgÒA©t]àŠxeߤ«í%Œ­>~šq£özQ;”ç}Ðÿ¡ýo’z9Ï'‰©Êå jèóÙÙσ©é*7ëúÞ[çN]Ðõßmþ'àVk!hIm»ÞWcA'†¨Š Þ†t~âuA›µ{ÔÖÝËŸ0’¡>ŽŽ†m‚æ27\ÀþÙü³ÂùS ?9›«:ÇÛk†°ýdpþ‡Í n‚K ‰†Öå{ÿ›Fà`c_¥J¿üáka4 ÕÙ0 :L–ÙyöŒô£×§ãKóôjí–v1Tš¢!«À{w3{è`ësDŸ—æÑ”-e|Õ/]uDÀQ!d5¨|07TJ§‚ ÏSñoçâA~…'iß_ÿð¶KG~Øøüí!Ւݹâ|s)Ò®ßN?Îé)×ÍÜ—þþáåÛ¢S†ß˜~Þ8œ‰™÷Rnî\¹F4’Gok—ÇÂÊÖ±]œZì.u>Š×2áz mÝã±ÏO·6ª–|«}™e“‡q¬ÿÌKç?iýßÂR{ué‚D²ÚVÜ£a5: žî´i§[£š>Wý¬À d7½+ÛJÎòâÛËõU3¾•1­¤¨ ®œ:"R°¿ 0ãéN|/Ç+:„zÓÂAHx5‰îD €¥&QWÀÇš á¯Å¡*éÃgrá Á‘Št€ Ñ ÚÊa &‘‚’°Tº a Ñ2Þ­zlƒ3­È¿Xî⸺ƒâ GÇw˜ Î~£ñÈ·?ÅÆ¬êË· *°ÐŠím>“Årn4×į¨Ò÷û“Þ·²¶²kùc«z*š(…Ó¹c1…¸FŒ¾µß¡ ?xˆÌ¡Èb¥?(2âe6í#/y÷ì}bϳ9~±¸UYZ㘾¡3­¡å4V¥¹îBÅG‘æLµlu¹Æ·‹±¿ äįæ_¦ŸWõ'Ý­j¯³­ ïJu¦»ba_ûÉX°8}<}cvnçë ¹gîè8¹Sí°^Nó 301¨~‹øI²oÀO™l$†r\]‘¢- ¹ C6ÌCŒ%$¹Jr½£¸”ÏÆ–ìžÐZÔSçRËÌÆ$ ‘ wÙ©ÚÀYQ±Gùº6æúnò,:–Fâ .Š@ÓîMÁICÀÑ™¹/Ö·2… ’’³`^zÔĤ‰›*ÌÄôJ®87°_H­fe)£>pf ¦cy7!Ìž‹ ‘ØhC)‹‰éÍØ1ƒ*¤ƒR3º°j¢‘E-‘‰žú¬»'묙í¯Öc¡hÝlÎþ¿~èáb©rõ†¬Y¨‹/ºÒ^iÞÿÜœn_ûêü¼Ú9dØq5¸U®¡b¨ÊQmሎEÂG`yõËõÔ}<_·þG'ˆëþëzûí;ûrðYÖîÁOÿ§ºqÿ*ZË“iíU–Wya´¼k gN!¬-rl$Å>¯€Wº³Ä‘Ö6ŠçÐ4]¹Ê½”Œ|sI"ÆÒ”æ´²Rõ´0/´èF l.iUÇä¡ .&]„+ÏJï£Ì±uûOgÒÚ‘+üÝýϬñºÙ?7çkÁýxÒ,K m‹rI7dÖן¿{]/gãU]¥*ò’”I3¬D,ÈY§œlèå„ -#*M™¹°èzìÕXd‡‹¦O;;Ó¬×üs7lÕrÆÃCbëú!¢ñ3¿)Z² i94û둇rDH1A«ýjÉ ¥ŠéR\J*ht&ûýv7©‰ª“‰iXñ®ÕÍžMp—k9JR”F ý†s[¹!¨çíxêÛèëÔ'Á`¨[%ê£k0 “À¿xe¦ªì šE9²4?WåË: "W#ÉÖc—ÍX>×çMsé–Ž´Œ3 BPE¤Õ™ŠQ{Q'6È‘mxöÀÉV’­„³ØÅª¢@q]âs]ÿüŸCãÝ„Õ(Ö7É–ëi6g«6f:( “ÎKGyFñ2HZPd V½8h¶æ³@³èšž:¯$S'D K- :Fó?"ÿÖüƒž¨²7ÁΠ&à=åZ Q:ºrHªoX®×>™×ýý»ï?8_× )V?Û¤#ÝTÖHˆBÓ¡q‚PdŒR@©¨UÅY¥“t¤P%È‹D@T€‚• T*iSÊe¦‡ö²’,— I€úqÎ}•×»õ3Õ÷_^Uë½8ì) vƒ7e’‚ œèNlÛJ*GÉ)`•Y ‹N(|½ƒ3RUDiÍIp6h]'¢ïzÔéáºXOàl«íàøž½yèú£§ðû‡îÿ]Ÿš"‚ÚŠz&„£MgFÕ‹è<Š B¹ÆS ñGË~nåZ~Îù˜, q™Y5TžLö8–]ÄUå—ù“kE»ñ·ã_ß_þäΡ¹Ù~óªØ kÊâŠ)ºÜëBäÓe4‘}¼c}GoJ‘µ{Ñ_EŸÅ(8”¾V§æÔ3¸îRù7)þã>@º@vJ3÷8œ%Ä`Üä±+:ÿ°{ïVÜtÍîÆþ Êl´é”žÈ§{lÃЄsJŌ䎖ÑÎ`R“õ^.³êÔâX2+Ý’¨BfIÏ—j.ÿæÜ¿·òùNî}¡sMó³ätÎPöúß<ÿäîóÇç©Wþv­(îÔnÌÚÌ×EqˆêK™”ŠÐŒM÷ 51xfÇ8Ñ™éqS4[oópfþèà ­˜èX|ÑYs‚B²n½ 1ÂKO6ñ¢Ò'ÛȪn½¹wˆ—¿eòãQm>‚u®­*fvrÍ.ݳ„WYsX_E@>wR×?‰6õƒæ Ø.¿…½rª7–®uÑ#Œx![Xék/‘¦®gfùáÕÅøN}F>l~KþcáË/|³}’¸DÑæúé§ÇžÚj´«âz3¼sºz¼Ç°/Þ¹/…>þátcpO?I|¤àÒÒ:ó”Aøá@TµRÞìtÛçÄkϬ8÷[¬ºzž–´­\>­)Í y:?J{MdêžxÔ¥$"¦( . @›ÖDŠQubmqUÍí ¡Vä`­`gæº~˜UÀ“Üö5÷Ç ´ÏŽÎ¦O0• 6í^¶""ï œºn¹mÇs×\f×yß9ëÅ;õåõï×é'+®{_™üî¾^ù5\Êû}™ÿääÿ½íÿ§Ws=òšj_a<S÷±_é¬ô0Ôá Àñ„mt"’TŠ; —°ìJ×çã6,Dh€‰¼‰ðœ¢p—`Ç;òÄÚ١Ǽþ¯ª{2{†©mÜ“ƒÂÙ²Ãm…^À5”a÷NôÝÏçÄ\\oåSÜQEÉØG}ÊâÁnÚŽµµw‘ÁF ‘AF¢Ž¶ÚÄÛǶ—óQµz|+ÝòT ü)÷´ˆpÁ­©ˆ T4åDÆJÂZ€ØêOóLp‘¬8à”dÈ6…MÄšpIÚÇn0„ƒÓž¦žÃ½£ò•Öûæ—Å¡Á¶¨øýK/ñ}愳Þy:<¼K²%î—‰·ÍC«Ac1¡[“ƒEJ»6A˜¢z!*wYÙ¥m°±´ø‘.áðVžn©ÕlêÏ8û$š v¤Ô‰RìûÁDé–öiZ‘w ¨§#s¢Œ Ántt0[ÔLûæQbíÒ,Ì4øUÉqÓ‹ç~óÖÇPL£;qžÌZŒO&=T7j…š*ÒŒzAóásh‹Þ Œ½“¯Þã•ÜI3ˆtÔG3|0É3û€ã›°À\èUÿk?v¸8m«šc’_øãìÓ÷SUø$Hý æŒã:‹w¶ïV½—«=Ãû5´_‰z4ÿå%ýˆæk|Þmè}Ã|h5ÖDÛ„áú}ƒºhwÞT¡*_‘þó@\ !ëytTi{~8–·_õô™Ò¥÷Øbã'ÞêšXèÞÉÉÿ‡ëÜÚºGí)3{XMÁŠ ÎÙ=ÒˆzôX=æH–Ñ÷éÄ¥£]á9’Ó’`³½­/±ÙG3—ÃäHK ‹xÖeƒ %”ÛÒ;š{¯Ëï.›i]ì¹Ël<–õôo =”Üì.˜üHêFct»™´@5ÒÅÏ’!u¬B0›­Ÿ²Ó½’õ”+g<7*µN÷šÚúô¦›më4"•ĬÜݲ»· yn÷Íÿ´øƒÕì¥=…テºøÜ[AŸ_o”ø9.æ(ýüahû9v†5™uý&alÚöZ‰€EƒômËAâ3MœÀ>AE' N÷Mü¨h;1‹ü>ƒ¤­1ZuY.O‚ž%ov›6e,Äî ­ùS}ý}¬–Ïnê¡P»Â=_8œêˆñš“×ÞÜJ~ül¯Æ«ß6¦ÚHƒÎˆ›},U×: —^ñ–.?¿uýÛ:ÃÑè…²!±ocl*Uæ‡Ý­lй/~×þüà \hN‚zÓ…´:jÊ· ‚SiÞYâkWŸ·yLøM@áÜ©`·Ö0ŠÖ”&—Ñ8/&ÊÞþôõCx<Ýþ’ž{%£Vóùñuý%ô}òþ³<Å5¤µ¹(¶2Ëõ‡0ˆÙ3žýÔß[u2ò1nÞͼÓhM)Ž¿ ¦ŠujW±1é›VÌ×85ÉŽÓþéä7–+Çgv’AÕSe¤…Þ¬QKœÈÍøØC’ì@Í Ú4@q(_Œä¸ØÙ›BÏÚGè©j óQCËV)îAœMÕ-´Z/ÃÇÎ_5Z“LôÁa-U @f&’6U],ºÂ™  °Iž¡Mc*0Rkª0䦨hIŸ(LulÈç’®[:P,#•‰Ð‹¸Ð·SlæÚÕã <™èáCWËí?ÕûÞìD°c)â=´xŒ›_ÎÄ…Ó›ƒ§IA”FpÓü£Ká¶^ꛂùŠ­6«`¡ÉiQÖî5ù :°¥ÔËæÉòЗ“okqÑêiRÍô6½ YÓïåý¥zqr¶ŽÞ½}²^yÝ¥/©sW+¾¡[yªßž3¶!‹:¤}ü nËÙ0¬¬&¥aRФ¦î†ÞŽíš“baNœµbTÌ¥ˆKB\ÐDÓµfs²Yp°ì‡î z¥±x¹¯ÂãNwWß¾ ÎmNîÛã@¿Ä¸RYZå`óúš¬]0e3QºŠöa¦#«C¢0çs½u´ºCíhPOôìQEæL˜Nr¡ËËYÎÃÎwïãaïq¹¦¼ ó"Ñynó0ŠL­ÔÆlVåÍE^T¤"ä¹™¸ëñ˜ÂtŽÄ¸ y+Ó&BA”("DÐù…Ì“Af7ˆz¡-üÉûa7ÞÄNE¡d®Q—f®>:?ó åêÑ×uXÄ)…Q?WÎæÈû‘ >[@‹l¼ÛkœÔ#Û‰²±\|.‘P4t€Z-®ãìzç¬ý1ƒ=žPC[À Š”Ä4YLc°§ÌA_ÝjʲâK]Îív½êÞI uÖ*P_ÁZ]ïÝùcÓ'݇íK)@IhÕ˜»A§‹ÚâÑ*td„QU›ú24š4¹ÁÍn^aÍD ¡¾dð¸\â]­ÙÍÌ —jzf®]Åd‹@ÓšÊò”ífÙ^®w…€êÁ4Ì\ÖÉ)̆´JW9n}ÈgHµt@.`Ë¡‹U ‰Ô’v„ PØw"p1_< œgq¯ŒÀ(¬(PëB;ƒ˜ z›u(¥¾uB t¢'þÔ†g7èn:[$¨‚×V“ÛÃ$H”6b=‰ƒÀ¶F%÷È»¨-0ý äÿbµitä êìXšU%}„€E¾ej?³´»œ{Øœ3á‘bN×>~ÞÕ^¾ÝÐâ4¶z̨hÁ)÷tï®/TVç.“ŸŒƒm.6íÃtRæÞÖ¹g¦È¼t tÚÙ¡Œ3ΊR7ÉKáŸbd°Í‘®ÎpÊuØ>¾÷¥×·KKŸ^óK»”—ÇŸm¶ÚÝ›“yr“ÀøqÖï¹Ù«>ÿ.Ðÿ¨Ë©5P|ˆ×.&XÔĦº®²ðóo ë¿ö±ÙË<´\Žt¡Dº‰¥!HônÉïp:Ö/GŒè3×ú¾ž÷N=p-rŒÄæªqvNê‹L Ö3 ב[–uÛg¥Ð †aX4WÄùŒafçëøÏ×½éüšù|¡£ÄµWÀúº!¾fãþøæã¸ÎùæÍD}¤:òÙÒº3¸Žˆ¹¢ŠDé &°‘l f.”Æ6/Œ¨@3›Y笗I°¬”Fê7Îñ¨z’ÂHùŦZN¬w„¯Ãd!]ÄFT]ʶÂKùÎ é;?<Æã¤&ªN€Jz`pj”ø™$“#TL âD¢ƒŠáKsª:>ßuü­€#Ю/ûˆ1¯Û¿Èe^ù–øœå¡Ã-^w i¾ÏãhÖ#=×ë½¾…Š>ºŸ•Å@tc~Õ£úéÍ”1°C]Ñ 6é½ÙWí( Ÿ¼ë4qº8˜[Â.çí-¿EOlLCrê» ï.ž±Ð©·ThDl3Ìœ¶:6î NÒ¦xûaÎaN‹¢J£b€OÍ3å_Û¥—€º¡'r„”Yt±Á¢*$ô Æ:™Ž¤•;ÎŒ—¿ñuØ×õÞ§çšçUöè•elóöÍWù›Í¾Ûhîý°÷æŠû Dig_Í– ÖÈUzgç5œHõ—ús5ûãÕ½‡Ÿk÷Û¼¶ 4tgIòNé=îí¹ñ?¾»*òÈÿ~ ×C1‰-Ôû¸ÃeÉÕbV¹Eª€…ˆWTXK+°TYmʧíCÓn$ñUT²'°.J•<ìõõ(C_ð\¨q=úL|¢ëir¯O{P.z+ ÊTÀúÌd4áóªé¸¼_ÙêÖuÊÞÅ …[ƒ ¶  æãaª¼Î̃¢²€æ´jàéÕy³-÷$ýXn‡½–{}±×¨‘ÆïòXi L3‚# ¢ÔG=$!@RB ÷ˆ*‚ÒÏ ®žÅmy‚0u0 ’ ºöΫÊ+Çî†ÌR4'Q[~²lJ»ø"†tl ´†Ç¬`S¾ÖXõãIønFÞe¯’º_QøX…/ËäÇÏUYä\`¨€<ìƒ@ã}Ø#¥ÅªmvQCÐ iBužƒà§ ^¬nη3?Žl¾¶¯†Ãê;…&´ÁXdi€±¸pspbw5­Å3Œn<²¯¡©[ êã‰F@ä§“ÈÄýIÁÑö“D Ñ0€a‹ç̵ÄšÛwe…~$²á«Pšä0ø9Þ ý~{~Q­“šØ*&héíÕFëÙÓÔAˆa(EeÍn¦Ûj‘VŸSµEÑYþæœ"…äþG;ïî À™¬2cÞ›'×ò‹uS—Ç×Jœ.§¡ts;›f@š;ÌÙ˜ËÜÁ9H4F“‹y>Ï«ÆâÍA†8å~ÞIüt|WS-ä‚6ñ›îtg%å4g©òçå5§+‹, ¿|¢®¼j’Zë”;u-1¡fNY3tÉíÔeè ù憶\UÚjH™×÷N[\ª(΄î¾À£²”Ó8ÉÖàIóûPT=j•n«kâ”øU®Éz¦´U!´ÝøÎ¯ƒ*6¬Á©žÂæÑµy´„Ñ:¡ÆÇRó8¦eïî*M¸X.lI³¸ é¾)Brdl_Å+/¼áx~¿®|úZ©oÙÉÓõøYk‹Ygÿ1/û:NŠØÀtc¯Rõú áo^“[诳ä7"D$ÓË`‚”öèBvש)3šôF¥ ‘5u"âp¨âwx~3uuSVIT«t(¦ dPÝc…Ÿ [0ŠÈƒåNÕ¸ÛÒé»V€.ñ >ÊÕböAÚz°û‘ÜÍ 5C(e–1÷"±KÉ“È)ûvDe âTi*„þGWÞßãÇ1àš™€TdV†G2Bp`óøbêÇ[í` 2E1Úë†W¸¹šùâP¾*WŸàP¿F0 bjwÝ\´x'61¡í+ÞÚ_ßßÿtÚÿj%#™anŽ×›3mÞG.«,7^§; u¤­ºyŽKƒ?¾xÎÜ:ÚëÎc»ÌI¸òýUeî*÷>ï»óÃÑÎIªôEiÔ`©ÁS3,ámƒØ¸X˜/+Lô–‰«çU~êЭ˜äB¹Òµç¶U’"–R/WÔ 'IØ(s}¿ÞGõ´½ô\Û.$AUªëê Ya~꺡¡¢çÂSm³byÑÌñ§ynúcu}L0¸Ål)0™¤.Yc¿ùR¤3ab{Û'0„|Q$ Æ%Z”Ü-³U~~|çÿû|Xßk »á’×´(G•ˆö“AãúºåU)keyµ±­‰¬¢LðÝ¡ NÒ‰&)äCFA´`ÄŒø‹±àZPV943ÍîèA+D5¬ÀV cú8ü7ÊÍd1J€aÊ„}|Í|vT V Ei©ˆ¦z )æÌÐh²qßÓ½‚ø,¸3î†öÀA<àÖÁšJgÚ‚©J)¦Ø(›0ΨëyB7}ž3fÂSÞb©¥‘pc¾ˆÙHšq£¶ŸŠSÜÀ3{Ê|ÙÑR/ž‚J Ϲ¿Þ±ó(CjÊ1‹‚gT‚Ï:”Fêl“Àê|B ¢ü^›*P–c´òȔđdTZ%Jo6¤HÉhºv*Dfx'ZXë,ÓØï®rª‚W9"¹-‹2•™¥Ã’PÒµ€KAJh›ÊЫ-цh×â¨`ÂaO,„\„èR4ÂÂ:ªwPdWö¢…€¥#Á`DC«5FÆ5‚Â`äõéä¬3˜ª€ø5«j2†µ›’ÉÄ0J^xIÜ•~jŠÏ;¥CãÇÈÁ9é«WY=ôzëpØTÏÒµ^z¥¤ÍRþ¸Ùú×A!@×yüÇ™ªzQ6}Ì%Î`êÞwó>ÖüÿdŽØol3ÑR©2‹‰¤#øøa„<žšÝoÌíȘ—V»ù¥ž|ùùXgõx”§že:>ésꀩLd›Z7_?2~ò:ó{NbF¥„+òâyžŸ‹"”Zªk^¿~FÝ€}B–¥—Z°Nñ+›õ¥M¯.Áu~˜CÞWLïñy®ûKjÈó½’G/½'/ŠJ • “TSO°ÈJ Ø8¹u“á¥ë@Ës]rÉÊìåc GgèAÿàü£p£Ð(Þ( „gGr*ÍÑH§Ââĸ³·™;ëâaº£K3àm½Ts÷B÷ôǹîØAÆöý}T5ÊlÏVýF±«ùʇF?³ÍrQnÞy{âûùñüéÛó¶·<Üç§›¥Œ€ñ•çYî{é#yCK'à{–ï^ûæÛá’‹4–4;G®èK·SÑ“:.´æôë=9qù;o/§NçˆÎxÆ[r›œ«õ^y¢´¶“ƺJýÉ›Ÿ×ýgî—×k6M®÷Ì»¶?¬îµK0c½Ë_¿:ihG¹ß{xg¼Ünª_÷¼ªsÛâÛ|¯Ý›™Ì‰ìÑy/H¥ 5g@‘‘°»›«£,D,­ ¥R`üOÛµØÌþ±ŽujA¥º¤ ›µÕ£†j‡¹Z¦¼‚*VT,"ð€˜QB/²²ŠÀŒÃC+E¿¼|L,sk—ý'É2¥&ytÏLîzwÔœQõëê†^Éû©ßÌÁÏ-"F½ejÓ«UùG¦Þm #&3#¬ÓSÇkÒJ@å{õ«\WÕ·n¯ÉnUau[tG×ÑfÜNí•"ÇÒÀ^J¤;SÀE$õ€Ï{}Ìݦ2éödPGwäAIC6Mo+¥Ùï{ÏïŒÇ–^³››i­=I‹J–§¡ˆ¡•^Hæpèeñ–ªp@´d׬œžŠ~…Æ›_ŒYB¸]é_{€øäpƒ ì¼¸ó®£Øî郟Ñk-RÒ1´+£Øï$keçn=æ ¯/#íÔC{‡ÌT%çæ¡,.8ÒíLáßgyòÒî Òí 3ji%®6šý…Þ8%§jšu·½þè¸ =Q{s¸È`€B#4ãDuìáòtþÃ[H_ptWé+œ8qU#µfRÚ?”DîÂ/ÑeuwÜ`1Õ¡]#Øó0i(sE"-ËPi"¬CÁtÃtK6®Éþô<ûk~þ\Ü·ÍÝÁðW?ücz ¾ÈômwÏDT¶ªqÔ^§ÃÕ1ŸÚüþä’`P8Îl‰ÀIù¤®ý\õ vU®Ié}ÛéTFs‡®ïµXÐ ZªðÓÛ3Zz=õõTA¨^ŠçˆÐN¿+ôÞ»¯q¯^ƒíxýãV˜«¸Õ:,~wÐÛ{*´U ÉŒ(5@Qì#µ xlC±é½‰ûæb÷ƒ&.<mÄÍŽ]CÚ/eïô¦¢~Ù¦Ãû±œ|–Ñi?" .އ«s=OûÉM…åg„Ó7~Ô³©(Ê›¾ôÄGk3œh .öYâá›;'üh8³UTíØsÙ£xºqkG·U¶ß§®ŸÔÖ¥®›jjx˜¼•©4 ÍÑ™Ëúí‚ÿZÐï%¸Ñ˜|=Õ£¤Ý½a\z‹JÆT…©€•º…¹´©~žße·¯â—Ÿöîòù­ü|îÓÎr¹ûòùHŽÈÀP}H£']óéˆØ(ÎéÚEÇÏü ¶órýËŸVûsDŽ0F_ŠÈ÷ܺˆÕoÏO—ËÎëi[ /zgdÍ=ÿ xá¤,óûßÖ·{;}»ò-à #€m”Ú·ž:¿Ìóî}¥ü¶¦_ÞÁõÁ¿ÁÀ"¶³s;óÑ·¦e‹RåÙcÝsx7€µ¥ÁÉ/’ò¯ß”ÄÌÌ®yr‹ºáɳ¾ì­HpZxؤlºÇä3¡ÊMŸßVὑ‡ï2/…n?ùÃÁü˜ŽßY–¹ þ´/Ðijé`÷*µô¹ûq”í] Ì>³~H¼ Q'Rúб/{uÓô‹_ºµ.ha׿·N}éÞëö—‡ì/ê~G51™!ÇÀ­BßÚñ`¿ÚÒhPDÓ}Kñ8¢W6¼Á?È•E6*Ñ?‰~çòvÛáˆx‹^-âOAJ; -:H$BšÿöÿÌ<Ö‘©t(|ÑÆó·™&&´Ö3þþ{Ø&{d UŽùE;úÑ&û«x—ïmi-^êsÜ6ÞÀñœ]7»‚zQµÒZ 5é/8›ûý,‹I@?¯K)T)%ýé@~@®8Á^PA‚a~lŸ€<ø\×CkiŸûÀ× [eœùаÐxxHâ­›o÷e^Î̃yDõòµ`Zœ²¦¨Ì%M¶:½ƒýñB&G)ì;èQß®¦ªE#]¥¸BÔ‹ÎL²qe0üM/ͪyH £gçe}.~Ïqxh ‚¥§ÉÐMÌÕy(R ³¶¢€0f×›Hå< ñšu· br† ŽsX(dÚÉ °ÓYåqkp(í*D# ´iM¸¯xŸ&Êñ€I™âhÑH“Ð ×LL÷i@)òS—Ç<Ñ·gª—Ÿôµç§V{•ºö8»8v -N¦`*@À0Få+ç´–:+¬:™kð妯 sã܉ £ÈBd"HrLC"VpÞE˰œ„.é4AùXdû2¡"†hiKŽ€±#°ÒòZ°aDÇ(Uº·mw…0œØ¡újôÒ³ÁÅ“üúAÕb9h ËÍÁ„ õ¨ëlì¶ÄLt 3ÊŽ3¹&g¡ë•N*ͦx…çegy@I”À=‹ZÓ‘iU=“ УcF"ƒaK3,"Dí·•ÑóSÉ•F8.¸â¾ÖËby,MŸ ùDÉÊEtø’ev6¬ Îâj¹¹À… ¡'纗`§gÍüiøyàš,ÌMrÊß÷`WÏ7H5±€ ´½2ÈÔ¡ÁÁ,MM ÐCésVíà¯ÞSs#;Cuà²X«@ÍGôf'Æ­&¹6èþèÚôäðƒÒÂâåÈèmœnÞJ8ËÑåÙÂò2UK"6yf ^Þ_õ¦¸õK½]êh¦š°¸îL˜·†O¦à5 @í£¾æzªøX?ÿîê¯×ÓüD^ŽŠÓ%HtxbN¢hšÛ"&ÑqIÌDn¿×:z›’ÿüí§;oúìÓû×kÀ‡ òÍú÷FêЊ> çÜãx²:½8ö6(‚rózè7ŒSò®Y¦Ïƒ Û¡©Öõex–ŒÒ6Z«?"¿¯|!·œ8œ®bA(Š!O d’5Äõˆá½4Òp[ذyLFY`=¸vP=(Zì©ö³¼ÍŽ.4gñÃ0¢3^ÒOv'j B•$I¥X!ÀYTÂÉåx“­\™üoóë[O~V§Dw”«’©ç¨}U3E‚bHL X éhÜöoÓ~¶.TvÌñ§æ×ôƒ(/¾’ÖZO–Œ¸Gë¤ ëà@f’T3þ •!¢¥@ŠDNq²?ÝúÕñŽßø™+N„ƒ´]Lõ‡}ü¥±;¨7\PëîzOÐi=¯¤$’Eöp%L3–@!ƒAj2M“9ŸÍr¯q¹z-ĵ„ja×Í%S˜³ .¦/œn‰ÓcºwÓ Œ9.upMæžEã R¹ÕfšØÛ¡¶NPÉXçu^÷M5úv=ÛÜL.›ÏZùý={2ú³ ¡2‘1Ldªcü¼9Òµ¾àZÃÎÑ“†Öì:áçX&LhG nÏÍ‚§Y„×1ÿÿ•ø6>ÿ“¯ÛsZY‹Ï}œä3¸eäý­Zz>Wt•–Ø#â»ãwÜ_@¢¢èÒb&(PØCŒ1 ˜2YH;qC¼Â+™"ÓãH²! 4YÐ+qG›ä•ÜÇé]!›™A'IX™jÇš®CûÛ<ö¹a­ÈõÉó†AȬ¶ =Iµ¶µzMI«Òª#a¶¹š¸xfGu(AC³ ·UQZÍSó>ç½ë'}šŸ’;¡ën–è7ªYGˆ01¼‚Þr<ºHnm§õŸ>õküá?j@º>¸H#Hܤ`š Eºcpƒ¸Øó±çí7ðŠÖµd G€¬Æhk_cÁ))–UàE Îø¦{þ¼¹×4´n–E.nplñrz`Á´ÒÎß®æ5ý|ïì¢UŸH‡õBµàR§.À*²3©›3qEž'Q®;-Nõ+«³U‰›Èލam]gÊîÉ.œ–½¨íÖpT#9’‚ã~ªweg¯xõ~ ˆ7ˆåÔ-2\Z”Rô²žÎ%83ÃØ‚Õ&EŠX–E5KV5)@¡¨²j9xcT Žƒ言ŠǪËv½rˆÜ µ·MëÞ œJ‡Ãî³RÈõä^ý®" ;­f²þÄ,dz9د!kE5`(\µ0¹­(’œ5Æ „©wžTµt “€_O¦¡×žû›‹qÍͲìÃV:ög\×ûìhO!4T`Ôt®Ž¥~…(¬àA¢V=úôÌ'°ù¶ôŸDÖ;dgAÉèÓø, Ž(´™ d äõ–û<ãÚÖ9›U䟢U}~ ¡§;3Ûš¿Oÿüµh¿}’¯²þW™«oò~ÒòËNÞ¿˜?¹óÕÁ£èeY¥ uµv¾â–y+4eëáô-+ed/ιol—_Ô5S/s"|Þ®ùÕzíèë˜úe5ƒ‘®÷mÚžfîžÎÅ“<,µ\λ´?7òЋ#Íéfµ/V{¤‘-,‹°¨*µBUtDMÍøÒͺȲ©¾Ô^_²T ®/_×2ƒ§J!œFvjæFÒn™Ñjù`â!®œV[»Qdœá»Ú›TlKë8…Ž nüüЉùúþ©•½ì£–·°- ¼‡;:#'t6ãúVµ4m]ÍÐx2^Ùʺˆª%…šõ´íáãsMê†q@e± áHÀЄ™IÇÈ(³² LÚ”(¶K»ÒÜßM\z>±“ý½¿÷ü<3¿¼1ê?ß> ÓÉÑ BûÃÛƒáõÉqñx|8ñ:|¼œk,Š›CÙÞéýѼÀ*I‡ß¿û«þð^Ý’—paÆtÇ%—·\¯Þ÷ž¯ãj\¿íÜž,ð#´úæó²Ÿk“,IÛÜ/Ó‡†4Kcè(L%6xÜ„ue ÛÄ{*áxÇçÎy–Ñ’×Ö¤ûÃëÔ„ÚÙveJp &VØB'õøÂR×±™6æ9ÎÚËý¿^¤'9æL'%N ‚^ø8CËŒ BÉ‚…*ŽHEŠ @)Ù™€«•sÁDèÐë™Èñ@'Ã%‡ûå¢þòÔëTæø@,i=ÙÍ`LJ÷zW<é~ˆ—@nE<´5ÿÓãâß¼fóíVKNk'èWu¬Iëš)(À¤yåb 1…mÿ<ÚïÔˆçêZ\Å3-‹W×Ϻå2Øq[iò4'ŽëŠ3hé ú¬OwDu¢W2˜­ÿÔú]Öú@leàÕ2˜†Kf?ªhår𖆫”éû;ª¯ž.ï Ó9ˆ4©@ѰÛ{/°êöÔå.–®ëê-ÖÈË'vë»Úßï/_ô:<;JB†'Ù*ž~õ>ŽŸõÞí‰|ÉþmT¢çÛZD9Û §›IUišš"TKéP$$ÔØšÌ2£µÌ²±/ÝÊo}SÈe"vÈw÷þ¹¶§Û«7¬  ¤6L²ÝãUFøÎhîÃl™Ýæ( S¥õ2•]nÙ0P[n.5»ÝG|+…mT€Úâ÷á‰Q1éËKVv}p¤ Û¹ù&E`ÛÕ齉EƒSÉ‹‰ç…ëh ·FE w9ø:݃ˆèN¨0Ÿ ¶ þ©×ô·±ý‡ØáÁYË}µkÜÂrÇ0²ÇE}º«?&ô¸„ÀÖ¢0³[7W^Éë8š`?dYpà â¯SýrS^å›uCrïÖ¾>ÎsŠ\!†QaØÝ“Jýв½ÅªççC?âŒ×íágõ}¥1Ý#í¨1`Ú‰õ €…%íªŸ¯f{wV—×'ðléßÝéñ6">ÌQŽg?õ¼†*h%¼VZ¯ëÉ£ñ|²GÓ1‚ªpØ`–1ÿÊÙ÷ä÷áëúà÷xÃÛ‘'N9ê’$8¶§Qr9–Ķ¥¨áAcß’ï¯û‡7¨ß6"nw‹ÏÎ\³üœO´%¢Ÿé6Ó~õ®«lš$#“ 8‰6KÙùìæY!0Ÿ®=v‚ÜÐ&úåxb£“5ÜÍŒ\ ˆ6Ÿàn—ÿÈ[Ëû9jùœWæåÑ×ú-‰yé0£‡ÃG`xys¦9rÀÆö¾|ãƒ^Û°BçSÔ¾+Ò›y$Еß¿{‘·C}{+^‡¼Q×Ú§$8zƒû1¯õ,ð´ŽMáËS]æþÎ6î‡-n %`öškôÅC÷G©b¡=¸6ºéÔ‚ª+¥—Û³ú#¿³ÆßsðÌÊç×ò÷ ø!üµÐúÅ8‚*5ñ9ƒGWó¿ÕðLü­ÐþËüÀÖBûêHÞ°è™-ïäü\Œ´â£qYÁÒhuVtë³£êÛjäÊ5ZjŸ[‚VŠù‹´U¯‚g»Ï¹-Ÿ¨8yxOÖ7ɰsWû®ºâK3hãb뺙P̶¸#r¶ñiÁ®\C0¢ñ{ѳÓ=;ï¼èæ'^J:½ŸÕ|zIÙp”¦)éGDËf&8Ž)`8¡‚ÔXl¿4~¸ÛJ„“pœD*àòn^~Ž8¾€ÄáV5ba^`{ÙϱSQ¡H¼(šCFaCvÌ\Õ¥ºAȨ¡º¦X®N r»ç°2c/º@vQ¥Ö"©0²Ek$¼+)4ÁP ”F¶7ÅŰàZl™•)°‹YV¼äÇh´S÷|^šz…ÙVn*¡GÌ8a‡¶²iÓä—MŠUáNE߃DFr¦ÀÃ8ȈÐÙÇ*Ê _>ï×_Ž…£‚è·‰¿búo‘¤@FÃD†™â&6Ó ŠÀ˜h7×´f)5¦ƒ0hRFíª6ƒ›ªÄW²gTeÛTƒjèÒÝàfÄ_×í¶æ©$a°J g dÍUDL`ä Å“ØO¤‚lØe¯¥×è£ôæ´ª·<0¤ŠSôW¤¼2µ«»Â¬*ª‰<®wcÀü„v²Yåó¥`͸½YF˜¸”§3«¤®”^E-(oàE^’ÎøEžñÂô™lÈH,W<7W€rß_P—'ÔówëXØ$&Î@÷×»_ºµm[Æ× ƒVø–ʱ,J³fÇD&nHúFtÐ žäÕô^©n¨ÈœÉ ÑûÈŽÓ]CRXpí¹{»F5ßWŸ¹§¬^*LzíB³_†ým¾è걉øÙ~&™«GÆ\ fë8Y¸ê«‘ô8±C¾=IL©âPui|Î(‰ŠÄˆÀP9–|÷nŠ6+ì‘*Æ-Ñ.Û*5×Ð5ø±ªœÅ_ŠeÌBMRàS™cˆšj°Õ²FÄpD(UÈbfœ˜Ó?/ÿØ›ZÕg‹½œÇÊ}9:O‹Yf˜ V(œ48žï:\÷ûìSuMc/°6ÓxÂõš´ ·a,ET#[BBß즭0\šÒd—†áê6 „uâ~û1ÿ3ÂÛó]±ròØ9'iÒïµ¹ÃÞJ]÷4¶eÅç$¾ßO!¸$x°(Áá%!"ÓälScÐp|üGׯ×ô9p‡Å´¬Bº€½LÊ¢DÏ;éSA-U0‹ÏSrÓ\ ÇSñã,³ZÉËqŒ=uÎ4Üe`ºê«:‹z$ê×[3j€Ä$‚yóæ!žë¶öÕrñªvi(0‘Ä@÷ &¤C‡wS?ä;»¬[¿MªC I(gryŸŸ>RCÒòµ=ÿ˜Õz³=‡Á,°:AÎl×ÖÊ´J°fz¸¶¤^PEE ¤ˆI÷ŽAâTõ‘z̧X€‡ã”¸ˆ82 ELKÛbFYÌFd[ŸôÇþßç½ÿO~¹ß"å:=¶­yl_ßl“œg-àÑaFð°šjQAì®öõâÚƒkÆÉz¼{?è\¡}®)Œe¼ÂžÒ7,©edEF¨\H è 49ó[,ß?:î©óëuì 3AFóp5Îéi‚‚F}ˆùðÒœùí|ÀwÐMÙ¯ÿž¿´UÚØ9Ÿs©_ìG‡¿<œÇÁ÷6›¼ìy©> O˜Œ+÷+AÉ–Þóó¹=Ó®¾¤æâ~Øxw¿°“Öd,¦R˜XÙŽÔk?P Û­úzÇ­C&CFYÙw~›Gy—‡in ë0¢ËnHQÚÅÍl´•žæß(î¾õþ,´Àà†gCÿ|û©iú±rØ2nÝî:ÉNs|jV~Яa¿ÊñùÜ«ý¥¯ƒŽÝŒÖ0€;6‚‡¦9 ‹¥a6¢­×u7Iwj‘ñ™H]T)¦Ð­¯,ztSLMÆNÅŸ1+ëÎÀ)ÑÚÞBwf@’d$ÔXÜMxÏB(8¥OѺ¾ä›M¡iÃÆ©%m ¨·R´¥«’›®Ï ò}+;ÙÒ¨;q­ñ:]/gÀžwûû(§nÎU¤2 N--2s…oížçìN‡)°žBí~ÖÑU»«Î2†¬vï­Î6fGЍ*ÑœÇÔ‰EÁOðÉXjÇ eµâç5÷³ž…9s_ òý|'Ï”_.°y¡ñ¤c\)ù~ù=ìA[ íU\´j!¡$òÉOðÂk OpBjDuø3uýíOÿÌÇùž…ƒàìTˆ¯uÄÓ~•Ï`ðӎꪬ­‘ýß?îþ~U‡ãÉ“»3U³w¹Ê„#޲Ùð8ó%¼^X~¿þ@æ‡ïˆ}Φ+{I-$x9åÖdäнY»úúÅ܇›ÊÝô.Ý#@»†b½·3kXi„®93(1¾µZ¦ú¡ßjf“¯&¨Ã…fèŽÝX31eEld/ÐsÆÊ¬k˜;¨`CdDá@LmØ!ÅŸ¬µY Šçl—¢NÄœ V-* ©)\®Å«TËR” £‹›_ÝÔ—î­T°C'6ذ}9Á­ÛíœþÏÓÿÃ}¯ú®>J‡ñÀø…E.e‡hk!«£î>W- ?SKBá#Dª[i¦ãÛ±ž8—IÛ~˧á|Ì…Ð5ŒKdWö:VO¤̉…ª[¢+©¡À„ã÷&çûYä6Ëéq¾ºŸ€°!'æ Mˆ­†³$çx"n¯ÐþaX7{×ËÞÁ†(ÕS/¼ ‘ë:챚¹ž•Ýî&X…f¨N™Çw7þ,¡oʦcbg6<•{m÷+öh$ÀC¨s­H&0╳‘ÙØ¤[;Ù ^ŽD§øíÇãUdF–q™7©—BFC¬-Ì­ W5ðWûUIækÖK=ã! #îÞUå¿Dþ;ÿþð/& ‹ã‰±àAâUí *ª ¨bÅ(@¬QQ{BQ  eÏwÃÑ2¨d!¯*Dµ*C)qœ/画€VnCª&ÚAoú¡Úü¦‹_½é®FÜÛ¥çiÿ!ÍýJù|}\¡"‹ÕKº=“ M¥k«¢ˆ”Ç¢p·¨úÇÛõû_Túè^YV±–k¬±5TÁß“wž’GZöÊ0²â*LжP¸’èÅJ`¥r!‡Úè^íÉLoVL—‰½(Xî*Žf†;(óØ;bänº¶g'4 Ÿåþ”òl’ˆ#ôVÖX¢M1°Y„ö%ퟋºwô!ïÒa©Ó'Äã¶·7œ¾"½Z¹$–Û+¶ sì²h[Ž·Ÿ^Œ¨A€·¿{7ÅóFz@zý»¦~B÷?›w‚Krm?ø#ð³Ã0¥3·FbÙÖgÇ)Ö¹(ärñä#6T æ1»É>G ¨eQ:/gÛÃ{„ôÌÊÈŒiØ gX²D.zS7%vX¿¢='éBXlŠˆ”°/7_’ÿÿ|ùÿÉâMÅávÎ,b‡{Aʈæ™^À¶ÇIÒȾãPdJ‚:Ôåà/Ídcñ* Dwnó›Âû8ZÚ=A]ÂÔM–œ¨_Ö—ö´":|8×oVßo¯Ûž×¨b<æ¬ízìͽ£Þ ¥­é÷DÆþÇæ/…X"oQ—EÉMkÁ4[°jl¡ø·VýÖÝÑ­Ç<•¼¿}q|@¸4¦›pZ° t(„2r2~ r]³[¸"E³Î #é£~¬Ó—ó•äðåå€áKX;…!Ý`·rHo¶üzܼ­ä!B™Dœí6&î-1:ËÐ2b["`ÊPæ8ߪ¾á›z)tHpq«G7”òé¼nU x9½¯®'wÓ/Æ~ã–>φ”>c½()Um+B¬ÚÙÍT2 ›i–ÕOí@0öùŸHï—m hé¾”7gêÃü_æº{m:F<ò×° 9I6„¶ àÏARI,á¼²÷ºÏ`tjOy´”¤¦M–mQZïjvÇ—oT’ë9<دz|ÿÍ¿¼“²ÜZW9OÆýÐD1"RnÝ—â¼r]ÔÛ UH?BgÆÎ>úð¥1_À/ñoôÆ_Á:uIE¢ìãl¨º CXÆ®³‡o~[r Ñ‚Ñ.›ÜRmÈn{†Ö&—»È@Ú>Û¢o,— ’¢Ä)fï¡Ø‰ç~üyüxÎÛ¯z²¹ÙüÕ§úi"cžNm0 Œ¼™ýcãç$aØn<2´ÈB]:Á¦žx XÝø-°o û\ó)y£òq×>©5êܘ÷+‰lL¿ã±õStü6·GkàôdätN˼“Ôxr¤ø%Ï4NþäÅ¢+Rm+.®˜û®ó¯zfóô,Ÿê¬b”^¹<ź1èþ˜l@d¢ï7ÖøÓöQ…=ú»U6MÝPá¾Â÷ÿðõ/ºðŸ.z9¬Ì™x‡FîË@a–Öæ‘Ö®@âüŠ™Ó1ñ‡Ñþ¨+¶DwÉŸœ9®|=ž§†{¹ž*Þ‹«M[–}ÿþvn·-D­lÓ¾­Û±@ŒÞ¨ãR+},}sÀÁ•^õ½‹ÃøâµNljè™ãƒÊþÌüè{œ~¬w#:zÛ!ŸmŒ8T×Ä’wÇj™Øq‰ù®ÏÚºú‚—`0Ô¶ñÎúàÓL8áXˆÂýH3F2ü RNCÕŠ¨œzvf2]Ö0*Ç^ëv3áïaŠ’€† ãy¼ ³QÃy’b©oœ|Œ/BA„Á³7Y…°4t ‰Åét †‘Z`àq^-&sMû‚PÔ¥@°eòHáÒâŠ0ÁÀu8¡-iÙ„&À0¢)#Ö`(2ˆ†k!Pž^µ@Û 17ÔK0Ó?â57 pUH˜+ >±ªÛ"|Í?Þ)—ß^×ÈtÆ  }o{0­03`º™EÊð¦€a,±EPªBgEBS=žo<ñåë¥È¢òÁCÏ_Žë?ßwÞWT¯A¹ð›D_YÎðÒ¬"T†tJØ¢¤f¨à±‚ %; hD¤Ä0!M²ð€Œ*fÅ1t@£”Ü’ lcYZJàÂ-‹Že5LÀúææ¶¯ßt>šùçï,ƒ´³“ãTMº«ºË¨RLÈ8Ôú³®š€Fœ¨LÉ#ZLä®Ásé,j¥€ÙàŒž ïÈÓ”Ñ~>õŠõÎ|í«OÂ¥X®¢÷TÁ¸t |#-EÒª ²O³£ilýªaFßäŽDa$Wù’1ˆl( †Ù†PÔþk®ûůß宬ÿÐɘíá4xµUKÜûuåoG"JPQK£zƧm))+jh&öy‘zD&ÑÒŽ#ß©¯úÜPœ¬É9:¥W,We›•øx8áðoù. ²Æ ú+n¯Ì Eá½ï¸ 5_9¶Èvp ùåšàŽõêç®ÃóC%ž ªE¦jX9!#¤ $,p«¾[€Çùäè·{X̧®idÿz^7«äÅ Ä*—óákð•ÚíRæÕÐxêYŒ,o¨Í0xú‰õ5¾ÐµÀ”'CõWŸ‚fÆýë«þh}~9u@+Q ªÒJÆ9{jin¥6|IDŽ^ô+cG¨ã£þ¥‚¯òkd‡¸! £)ó§‘T5¯^|«!ãáà³ö—¤* ‚/@.JaPjXçš]TCÃîµV$l D„²Ò³‚,.)½*žGþvYœ¿`O:Í 2†*•Ö߯oê'­;28‰HÉÖŒ‘dÂCŽÏ;?æn¾ü£¿;ÒÜ—˜µÁ­ÕãÈÌä$l@Çœ;&2ñØõ°FX®Uåq)e?3ß SWw Ù+íFˆÂ Ñ|,ð€Ñ5´[ÉÊTU+CÇÛC¸¼ ×>c1T†ØÃczkŸÎ:TÙ_m¯«ð&ZXXQãœÍæ×›’À‡¦:’>7¹J¡IY/\.³ªT+¾yU0/•=p¬'ɥϙª'BU¢ÃÉçÖh¬ „iÏË›jŒbLŒŠ^h^lá*iÿ½ú³Û|áÔÂkú³% ÅЦÐQ£KMÆ{pa•7Nfšò“@oSN(Òø~×áÌö{ýàýÕOäí *YÄ‘äxìþô°\3ƒwXxGÂB´I²TZ{uR%«žŸ;ÎÍÇe"3ƒggG1¼\~(¹‚B¢“?§yOt'w—ÿ‰££‚Bºèaqýè^›W0qxŽÀ¨¸RÀ‡û|°³oà›Pw­8U·yuÑpÎxRoÏ•þ"£IžÅÉØ«¨EL£>û  ¨TØu¾–㥶-Xp ™+ÛZ®®ñÊÙ¢Ô‚SÙ”Ù tñ¡°£Gòc)võ ^"Ï÷ªqݼfEâ G)"iÍÇÀÅúr} »Î¿¯)ÔÛå­)«T f˜ˆÐÙj¦C Ýh–d£Æ8`ðšS"­„?2¿ÔoõÇá½ Š;xç0&ÜJ3W‡Û³w[3„°ªÇ:Kºh{û²Å.5ž¼§Ý@ßÃ%ãƒü çÖ3]ä]îcS¶ÀL ð :¹3QõOûûNËJÕýß_ðYñIUÖHÇX´2Ž/J& 掦™û|ɸ¾¾ßæ«(lÁ!,R1ÐzU·dJªÆË«t5*¦ÖnC šdJ£P{¡*[UiqLeÔˆ¢Nmí4e2µŒ"EFflaàŠìD<š-Ækf /§­Nêá»ü%/ƒYGy?wu䔺öºŔaúì'‚çJÂS~æ{99õh´B?‡ÉžéêFk=;ǧæ"š Ïô®êk\!¯Œn¾Á¯‘Сy—]ÒÛ⫌@³í>rÉx ÷2CÁ$é­Aíƒ3¥w4ÒÚƒ»E+ ¶/NßÌUŸð)ºO¹F‹©??ŠŸ´òÐ/üøvëZª '»Ì~DèV’4Í Qç9ҋОöŽ}ûøñ_Ôo_¬M/N¹ØØ Îüðüœ^ãùSÂù®$;ô`ŠR]õ¢¼6ð¥¢?á×ï‡jî#õ<âAõJå¢6q4Õbß)Ýß·öj“Wv€×ezåÚ´rÒ¿eŸëázÜç½íWä»Tùúbq9.,Aif ´‘ò4[zHÝ™nyÁmP໨¡¬zueµ¾ ëöºçVdÞvFåBült]h@$“!Œ½P"c`$##”–®„%^º~Íùx&åj3nIV¨<²±¾Ž¾ãÎéèô‚z½b Gñoá…G¤ ‚È® òà?à[Û`›NêgåU1&`êƒO E® ª6öýƒT-õz§J¬{0O£¨x^2s –;ïØ/<8+~(kþ¨St‘P XqÄbª®èŠlåO0™IM«Ù¸™fâLîü}»Yj%س'œŒÞDUµUƒk«²Fg’¶1ÆC6D›5»¬nsÿ0ßóý&GMï27È’nS šQ!À@cFAc”Ø -Gûü¡ñ?½á*Ž[ç.* Q–ªvôH’©ME€ ‘×·";õìµ/™%qÜDZT¡e¢»(*µp¸Ç}süi¾ ÐñÝ?ØÃ>öl7@ Õc%¢2ÚYÂgªìö+èHKq³r­‘ö¼?OŒ{i{¸‹ë_î±K RêXÄ*^‰ÅC͑ޟÉëM§•\²#%Êráïä¥#0‘5 •#X²r 3º´ØÃ1ùv4EiåÜ  =9ÆÞû@Klk<Ôùµ× ãõ¼qÜõ!EhïhÛ`G0 ·Ì×3+šgĉ<¿!=3rV?*ÄU…-É2LBÜh °” ,suñOyœ] ü0€A4°wàw0ß}îÿæõ?-ê·©ö>ïÑøKÈŠJÐc*!€ƒÄvzÿ䀨 Ë#5šßB@u¬P»žé‹nþ°oœPcŽWíž%Öófa›& ZŠúRú:¿æt9Ê®¡Æ|ÆÿÄê²êl‡^¶½7¯ZZyÞ±R…\Ýý£ùìË]žwýÌë0[3W\õ“æË4F–æ2ºQ ‚}xú$Õöòî¹½àCÑã«úØ`̆ dU ¬É&š—ŽÀ%vs—¼kÓaÙ!i `Ý a<‡˜fçKþGd¯ñàÓ.ö/:5AI‚¢ƒ6OË@?eƒa!¶ÛybõÂGºIˆC®ÍëôÝÒX=$]F`CK´\ùãY½«L«p@cÚ"-xœ·îÛ¼² ï)6ó¾=8"Üð˼³/(ˆ]÷ÏŒ ˜wëAÄ”ÛeÄŸÐ/åûœÑŸþzðøå‚6 PýI­6¨Ãr˜1™tò2§iŽÒbåfÇ1HH/©ažnÓZâc×ÖÀ†EUÅnÈh,•BȆæœäênïàØí.YUg umƒXÑI‰ù‹¼Íå²s½Ûróë«ó<~Nß[™åsãÎÑx·ÝÕ†lén³Ò×òÇÚÊ´vc^ÄûoûÈkLܵö!T&~ÇÜeòY}$ÞønÞÞâð}ð¿Íc€ùSæE†}aoëé$¬¥ú½ÑRCº8€©Ëèä™ ¿ôC#gÛÜ&ðaŠAb —bCwZBY8³edkå`å“Óõ1Ĭ@+P€’‰%Ô°L5N©on¬=ýhµú«ƒƒÚk{ŽEßž÷+MâŲtÌ?NãwŸär#Ü6¼äÓŸIÜšiºC0ytCøºžÌÖÇ3¯cöµ×¿¬j`îMÝçØØŽNLwmóªe-Œq£lÏóyyPP`úÝŠ¶ƒõ[lH>O›Ä‚oçê“ûáªByPYDæbc ÍW;ØÎßžñÇu³ÏÁ UU‹Pa¾.âöÑø<ù±Œf®w™úL³—8Ó[hFfŒè|yïÕ6_ר9“£¸ç[Ç5¹¯|Ÿî}³™ú¼¶ÏþM²­JëtÍceŠ˜´2n5m }%PƒXÑO¯7—†o+Ém#çÕÄÉá÷ÓÔÆIS´Ô'ÿèóz][År]Òâ+©·õ0 DÊP« P€aËvwÅP—8qˆÓ"¹K¿ 6k6ýüÉ›¯]¬p ÉÉ‹Emð$R¡1eµ¨Ñ†,ð1´ù‘8.Xc…³¸§.}Â7“Ãl†¨ NN $jž™Š<~Lç§#ÀŽˆ’>ÚŠNU9d¨àÄû>¼°’”.ä€9Q\Ãh 2,Ò[Ó¬v[Cr-Fì€& $Ý“÷MfTi͆A°‘Z‘JÄ5éŒ<•åâì媕‡ßÖá)3½¥ ,dxF7B&8HÌÕ;îM²ýH¤°’ˆ"6áaVd@ŠìÈvžÙûéqü*ómºÃry6CZÊÝZ¹íKGÞ¾Mñ´ý?=¨ÿAx¡/𥩎€‘O‘–2U$«p¢Fk•VÜícL9ØnóˆŽ nLK. Ì‘ƒ1DZÀˆåPG@³"[ÁƒÆhÖãHPMº*YéH‡sc‘Ã7µf‘ N´«¡Š…`†žš+ ªx¬iÍÜG¢!N¤ éÃÑ(‚s¡¥ýÏßNÊÚç|K«àef’4 k¢SœǵffÃæ€[U2›æAZ«¹OTîÓ}éë öªä_#.–þ%ôo{f¾þ˜×cÌGn°©|19¾Œâ¯Q>D¯µ5À¹HDÅ‚Mÿþ†?Å÷³¾WO눷ån~à,ðr~›¨()Q¦¿ŽMfG›žž¦ªêã…¨;ÜÅNfŠ$c°™‰ WüeušI¦;f¶ÉDîyÖ4V£uyA=K ¡¿vÙË[j@‚HbqLžÏ¡øYžIWÀ`YëN b"ÈåæºéDÅ¥l$ZDU)z_0¦ó)Í‹±Ø³@R÷²wÅÖ10O™åéÁ5U ªå„PÙ$wMŒ41ª—¥¿ÍÏô¹¢zà7"6ôbÂb:G[«d(a%oQ"øÎæ»ØpTY6î>´a.V³þà}ïr›ûóƒó<øy,î·ãT{Ñ?<õ~ŒÔ=¨Ý‡^ƒì]z±ñ2Ás|IqöšØ¦=¥v>OÎÞý¼vûQ×rfCÉòSÞŠ "ÝPº *>,[¤î„}­{›ì ç5LËÓöIt–ÆÔÚF¨pß–?¦bo“‰¥"A‘l5éÄ1ؾæøN5[h‹*±$| Ëgã¶)رb ñÔ›aŠ àNƒ¨=ÁÜŸ/ùáÀï ÷:Ø1õ o @#oêz 8½¬»Óæ^Ù†æß¬Í³Ì©æŸ¼î¿8ܹªT•‘NCb€8 ÅD2AÆ—Yî½ÈÞkºé|½¦>”a=­bô™H•ì§¶¯¾ð&XE †|mA l$=£aG-’ÆÊ49Ô+7a¦nɶZ å*T–h±„)áH+…Ã÷qûù!¤g¹óÌÐÜÊÕáx Ä Û }ÿÄ÷åý4”Ú£-s!½tHý>Ï?ø]•=î^ôú:}—ÓE-Îlñy j¦‡O7•J¿žƒ f Bl±ÐLص¹$9Ђf¹/r–ì ÿk±{ðñòÄnèÊIipú•çé aƒGæ²ü0òp['^ÉßRJx–: ¼ëzÿü빞vú@FåV:ðOúúÊ6ÿZãs­EzŽÏ§³«y(`¹¼±È_ÝŸKÿ¹`ù­ºo7é~VÀèjò®*lÆRíŸ]oì)‰XÂfÎ¥áÇÕ"¿ b=KÏ/Ù“¶•!= ¸ߦr¾–û ³õ¬õŸ4܉4=çè$£̓3 ¬gXßMêuÏÐîÕðh÷P¨ +‚Á2^ÊK9Š$)V^UÉ•5G‡cèK°¾ÄÈ-Òué*I+¿ìÌBaÓŒR!U`‘ˆ©Vb"V-Ó+±s¿^vrɺ”Mÿ,Æxå5Ìàž[s” £‹ÐÑÃ&v슋¬Uƒ×&\…z¹ûÍ'>»É[-ÔBÙÄ„€ ¢=C}]Ú^ß}ï#”F–Èí6V/OçÓ±·®J¤®d†}ù{£7wIÀ….  LkP‘«ù…bÅD12v CNUÐýy|—ûpbÕ__ûž}÷GÑàå5=5¨!B…1 £ „#F˜—d§F[ˆQœˆW#>!®úÞ74¸¬4ç}TŸ[‡Ûd{°ý{‹*X6ËÁÎ!Fø.#Eï¶¢Y¶í‰edSÕŽîûÀq­qI ¤]ª[¡ã­¾BÔ‘J¬Ðb=ìµfnû»›×ÚçÓ®©è:" ŠAQ“!ö¦šŽ=JoÀ×¥55¦ hØH Kq4¬<´"ÅÃìô£·®V´Â’¹ä+—5蟞þÑéƒXÅ‘E53¯_ä쀂‡è]|}]µ7(Uÿ(cžå¼+Ôp ²±â`]Å´ZÉ£¯‹¦Ûúj•Tån΃©7"ÊHGð¥/ŠÓ­÷IDiX²{FGÕŸ®¼Ý­Ã­ØË±zí“©ã ÎYK. ççîá1¤xqZž†*9ײàs¬\6ô¾¾þóÇ1×£¢.ÐFÿñ ½ÑQØåÁ©Þ½N±zö°›^b=†F´¡QÒàeËÁáøü Ñë-½ÉI…Žf Ln¼O›ÿ÷³üãâ~Æt¹² ¨C@È>hÆÆøKiKã÷*)ê½ê•c‡\ÍðÔº¢¯asüˆI?:9™èWv+ø¹¾ØUµžæ‹ðº[š4—ÕÃçÙÛ©)~hû~ðyž–Â¥…º_’ùŒ}щxêÃÎõ×-û€J{…í_iä¿o>qi}æ3¿7ßñNÉB¿¼³²Óù8{¼Œ”yósw½Æ¾½; ð‡Ê“{²Õ n1È“ OZ·á» §Ù÷x¿Úgöų±ú±w‡ÚB?=C[ß:ˆè´3/lˆ·ÚØwg7µˆƒÃ†ßÖ*ù@¶ýÞÑG÷ïÔvOÍnŽ» %ÆÖ_»–ˆ9õË_!ت´^o•k3„“MJ¹†—[ËëuÚº5™)\¡í‚?Ï™û3;’MŸ=¢ÛÊf¹U7ŠÃ†æ¼–ršÀ†^fšOÂOÙ«#ùñöòŸ^äu³:wp2›8¸¿v¶I. OÃFt|’YS‰ÓÿyØÁäúf­Aª0Ï`’aÚ:£}ÆûcÎïMŒp/›iáMy~ÊôxŽë ½û.2¯Õƒ!AÝÎ=\4n4¾É|þXþòܼM!¼h/MÝg[×Ê·cãùyìqž;vJ3( éî•dÜ‘Îu >Ø ÞªëGû¥~r'âKøˆ®upmçgÿšV7®‹¹ÿåÛƒŸã7ù«¯EÒ¬­¾{Çž»Å:sÆßö7†K$º‡K™‚Þ°C¯ö½ rsêŽîÑG®}I–\ÚXÛÀ††O '×AõÉèÓ÷þÉå÷ð ¯úBÒ] Üû¯Ž>@¿pé»=8@¿ÔæÅfìDçòi·W#]ÿâ¯×3»MÞÅææ×UÛ¾/¡~ïŸ/Hƒu¹Æò¡ ›šÎúÞë¼úP÷% Gçâ^×~[úe¥ÝjGîF}êJf¸õ ѹ¡&Ïn}gµè Õw§ôõÄŽ[EGm†;$T ëñSçZ’t¾ÙÝljbZòéq ÓoSaáÆVþßïÖžYæ{|gXâsF±Åg$b´ëÑù´mìk™h‡DpŒºæ2{ç0mù=FÈ??êåe•Ä­xž!Ðè£mŽŠøµþ,E¦§ÕmËWâö&ôùÈ çý13æ¦écÔAÇ®\ ‘ÒjáÁ=Ìâ¾ôóéøh^.ºSÃÎAI|7ö¢OU„Ʋû©„¶ùFØÃzí—F¤8ªõý{¨D+c¥¤Ã0°í÷6?]îalE@ _·¾œ»©óQÚÀÕ¡k..ð‡#úÂÖy|æ3¥Å#_˜Üè)¦r’ £XlB@eáÌȨš²Û5ËÉž(9NpUh@E¤¸Ù„t4¹¡ßÉE¢!™l8†R ½äfµ!Tã€!sI¬e7t$¨*Íqíh‡Fã<]_rÊúët™,)‡:¡µ³Â…å—ï?|‚î3É#Sf(BüX½…–ñ ûÒ—´i|_'5Jé¹,`L¢ ‡Ò`‰$F‚êñÕt4Â5* 9ÎCN-/3d´‚2óÖCÉ×´ÿ§I}á÷Aý®ãñuÓiÚNˆ¥|â´á¡“БY‘;î=ìN—ÏÌx@q@…³Ó* j] c%T ä¢](¥éhÚ~Vd[Õí¦~øæ•[½oûpaÐ¥Š–ˆâ‡ä¶zœÕÌ gß#º€e"Áà;ôÒƒ –ÖÜÛò×Y™] Û F‚«ÌÊ2›1¢—÷·ßë£7lS¡›ÌÜ©u¾Ì®e­¢œhr–Ô!q؇ìíu -ø5Í +¯Ìw­Û§éGâ=£(R¬KŸº¼ë÷ÞV‰Ðð†Ù¨$Z$Wgë² é{M¹¯Ç]ñíÉ;šw3in˜bpçÙë:^ RX†º?»Þ¤äÍgM’ Ž¿ Ût.ˆØ™=\s½î[è§Ã=]Ø€!]‘>a½ )ÈñéØÐ6ÃMÒ3$'¶®% Móóhß<$ýe¦Ä,³€AvdÉÁ 8#¯þÊV·.OF2Ü%µ«Î³ó°d2ô¼/f·ªçz>ƒoŸã”*a1άYu=™Ù_dXž/«(›b…t›‘üƒGnž±šï÷µŸß?Þµ_!Ò€"P(¶ù´œLc–ãDÚés‘ŒPÇ“­tã­ crî¿-ÿn¶œU¸ÐJ,UùøèþžÈ³û±>HÎ{ˆ¼PvIb…?õ0ošÇeúö¨Á×ù>в4Và±&büå¡fàS‹‹6ÔXž0Wâªé!È'~“9ûñæõ»ú&¾÷·^þ†~Ôž¯oiª%¾ñÙj«IW>Þ|ø8`ç?Ïá_gø¹ãÓüw§Ûïgõ)Œ6‹ÒÏÍ/~ªžñ:{,ÒÖçQ8‚Žjvjn´ý¦X³×T² ‹0jÂ×ÃoÒˆÌö’™lF48ÃOè»´0ž ìn^üð˜ËÉußù¸=І- ´õ;>Žº%ÇzÜâ[îl, šÔa ÖÐþPþøQ¾²Ï?ÿöþóÎÜ*C­ò¢©±˜Ö1ëP(‰¶{Õ¼•Ç“¼-M~¿%g_ðó.%#a$9ÐC–Qz¤Ü@"+t-Df8m¯bc”u“-®†q…*ál®]Ë …\oï¨ÈHŒÇF‘+\ðÆ&Ak†q%9«¨eNZ|€K ¦JEa'!Í©ýqpŸ¹Þs}!ðÓÑ  ¥ÛõhXÓiÓáòò=›¹N=aÉÁ— _÷o|í¿œs‘ûW8Ï›Ÿd:ùáïP¬»‡R¾µ¥ªÊ¬k—²‹ý€‡ÑÈ j‰Šˆ82ZX ·dÇ% ´›Íë¹ÛüÙ¿'úX&ÈUafØ—õI7»%FÍuX1Ò3шü·Z­Tl`·R·’îñÿ­¼ÿ]Ǩ‘°Dv¨Åöìy$oãëfÏÿÚh”ÐÓV¿[ˈr·Æ Z…—WLDJk̤™<Ï7@^_‡†±85÷L´#µ_–¥Ë4`¨uÅ¢Ùê>šWWWÙ뤈+ëê»—Âd*Uu;ZyHL-}äÊÅë“â["¼×N9ºÏƒPåuÛv§Yš9ï„ʱêG‡ëçÐY6—q½äê¬ÄjnîfŠ* ÈB#ž ¡"®1ŸöC*ÚÈû’C}¡Y¼"^Åâ]y«E4Ñ•¹É , "¨`V k HD €”$YkÿdëýìK’™ 6x•F;­ãØ®Î×ý}º¹Ž5<’ßeßjX™ ü"õRf*(Ð*Øå)-ªø4Ñ2íp½ØÅTsÝl—žÿN|ÍùœÃ]﫦þœï0¥ës®òüÝž‹ë —˜8a:¸8ÕÊí5³¯é¹;Òf@. æ¦òù²^@ŸüÑH²cXÈQËK»àó²)ûõÖçvç8YÔéÕºÞ_æ™±6ß_¿¡VílmGtá´SÈ’3I`qz×:ÆÆraŒ•\Á6á¦êPÅ}#È…T¹Ú¶s3*sF¯‹~…Ù$ÚÐÅD{ :-²`%ì]%èµÝžšEo÷? "…â.D#kÈÐý«q±¤×êŽ[‰Úñ,ËÇ JÔ"3gìy¡¾Œù¶ü¨÷Çñó®Ïh®A((Q €Sà@#5&± 7øÛCQ:;æ{Ö´U{Û YÆÀ;Oº_W·?äzòÌã“#ôEóÇ=äeç ÖN[&¸ÕlÂh-ûý(>œ÷ö׸Ú]ÄÏg¹× JY#¸–¶Jj¦$`î«@zÄ¢¬¹`GÐ#@Õ°0"Ê Lb¤—H‘"RÃ"@—É †j騹å­§ˆ9×;ûËo¼GB˜Þkô‡Ëáh#º- ‚¹kˆâCâ¿¶ú LÓ;K„d p¦¾MN‰/Þß?ÕË*Z¥UQó Ó.¨ „ëÓa¯$× Dž¨ 8tßü‰â¡ÝoeŽzä§Ðk0WmŸÈž¨üªÔ™ ów,|B‚CòÍ7ªä d´n*tfLʧ«Ÿ¾{Ó™óQp­_éwõüý–Ü£§§ûa­£±ÔKH3í>C"­±ä†Åq{eR Cé€Ú5Á®„V„±àd†Y&_¼ùu©_³Ø óßê õ¿z1Î f—u–\½Æ­t¹%C a˜¸¥ö–~–ӹØ0ø\¬Á©Ë²Ñ18_0Žä}"šmOtË„’)Cµ)*u­HžûyG•è'?)îuùOm$½ÄÜË5W5›±ááoèæÿ³ñðX™jˆ#úý¶âͰÖýËvéÓQFûÁÌ×;÷xç_>>áfŽ»·ãÜ©©tÃUÚÊË.MmÝYòl–CuÐLŒ»ïkc·IH …ªÅÝ¡|*k Xì­bhTŽ‚k¤é4Ñ&Þ8šìoÞv$ˤ¶*9¨©AŸÄ ¿¥¸µ¥Ó‘I`®<¶jŒ~ûë˜Ã¹Ú&ö'34¹]‚lÐ Å“hoˆXR"×@UÕF8ÔœÛÔs7‡‹¯œc%Û Ä¢»!]~õ1 ½¾·)P™.ôQ¸ÒÖ¸üùtþöí.ÍE.éÀ›S˜Vr‡´Ò Å©ùBç~ßÔ&³Q—OìÀ+Æ Ï“}Žêc q?~!"Ò„A ©Ò…x}Øøê„ ‰†˜3¾©€ ç?zx÷gÚ=Æï2_Pz•ì ³>ÇøÚ°`¢ZܽºòTôÛ¸|íyF0l>€‡Û&~²A¢üSµSW ´ÐqãsÄwƒEûrã"i˜•}d¸:ü}ýõÓ3ù)u||³!øÇ[—~kû¬í¹zžbж!™¦¬à‡òDý‹¿ÿªìÙü¼9½9ó0þhúÕÚà[§Ã7¿´.¾ó.rзá·OÌOÿ$Ý3R¬Ñ¤½ÎöIÙ9T»ƒ|.éZíR‹`7n~?OVwË2ôIǦêf4ün£zõiae;Q‡c“"œ h3ÖÁmgýg¿âþ}çwm¸““ºì+³Ä`Xç¦Û çA€ nê½Æ0åÏ<Ò¼] ˆø+3Ÿ°Lµ o3›>„¡#[á@8Ù[ãoœ¯Åóá3ÉÓ`ÚN{ëd`Ç*/¢Çƒà˜`@WLJ}œO0Ï>^Þy2ô#~­&Cº±^D~H÷^\chÓwŸ<ͧ!ŠQ©§g c•¡”„ò¾HL®pàPÜËݾw'WƒKá€àt®Æ·-ÊYý€i\(Eði«.pŠø^Z8Sœ|ÆØ‹iÿ¦0t9^á¡ÓݭدpúZ£, 3ë®Jå”¶ÑE*täõt7 ®†L–23Vû1WÂ`Ó‚±@9*k³Tµ Ù„ -}œ™BX N1…‡Õ„$FB]&›mɧ_8Ï.H@E¡ÀYù¡ëldÓ½ …`à2<,9SÑÃi%±2lšu(¬©èn¯Ýj„BpXGýDè´jÌ'd»|ž,ìØü0ÛO í*­1ý¼½Ø~rå9»’¤!Ä  ‡4r”ϳ_f¤n/pAÙ#/}¬*ÀÕp¶Ä[HÆb(‰ D$DÈPÈ,í³ß˜ˆN-~§µÇ¾Î}~¢xÏíƒëâ:ožgÏg?aý9òýò!‹)‘W"ù˜] H¢V­¨•-›¼X–²m#…þ¬¢w”ø8€uŠÏ ¨Vå­fû „e~aOiõw‹oÁ7ÇWëÛÜ!16öæë¡ù­.fça0ńܴƒ0*[€—`SÎ-P3S0”í—‘ïf¥ž„j;” cÊe+%9:Na78ã±m ¢ˆjj™^|{­§}ýØ,ÔØËÓKjaÓ÷Ë}îmi¾ÿÛÔ°ý÷G5 z• ©4«Z¡ÎCMr^ÞËÝ­+¯ÕK¯úÉo³*™öV@ÕʺÓB¤ÓT·E>Mœ¾Ô[¢f …ÎŽd*6qÞ,ZZi0žJ–šz”í… )—HL/yôË܉iñœ¦Ì†âï+çå;ÑžýD\+ŠFPð"á<üÕ>?¼¶!T+–\f:Y…„âŽH—ÖZÛH£°Œ-0 PM׉ôyƇîö…p9vîºæãIw½fÇÅqÏÎì…õ%'0k@–«Å8R—Þ1íÊ¢“Ý,v¦/Íë’Ÿ%¦=[Û-"u{a6tr³˜6pÞ{ð?üc&âý™ÒrÀÑ;IjLº¶5¿–ÿáíü?Þ¯°+øcÊR©$¾z‡ez¬¾fÃᣙŽbv 0e‘)Ë>)€KY&›ƒiFHF¾Òžz´Ï9^¬?}"Ê|úÞëajLý,o .K%ˆb=ÃVåιÜ6-&u[¦2-q à&|ßoúĉ4Ù}a>43ƒW¸ŠtD‰uŠFµC{ìŒ/€W¦,÷ÐÃ#²*)é´Ž5ÕµeÆ‚¹=›™š¹Í>Öy-·³€Fï䮄-o³ƒLáö­n©¡¸œH ÑV7/ÆÒyG~3åG&hhXGšh[åâØìʧ0®–ë]ö[[´¡iXœmk^´=3ÃâÁ:u¶h¸ÈЋ¦WÙŠ?±„I‹eètdsM®UÆ¥ÛŠóþè^Â’!æðϳÞõm{âÜÓL‡2\£’\ È(˜ROû}5~1¶5årBåØö¥¨aZÒ¨G[ok¬+Çãüì6–ˆAáÞ¼bsî41ÈãûþæÏïÞ€G0‡ûÅ×–ì“h{A¼>Ú„¹Oä Õ â‡9'Œ½š°T´±„ŽÌG)î&ŸPu§£h{BRVu£¾Z}ä{b”ÃÁK¥Wê³_<ñfN^qNížJ´Íývö³Î¥>ω=9U¹«lå+X"F³ èãºzm+†Š"·ÒôJŸY Ó¨„^à'&xòúlb½»õræÍ.Ë‹RÿÓû¹€‡R:;LGu*=j»é¯Ÿ¸ßO'2Çc¤7S×ÐEê@1ަр–þam×,“.•î þdøµµg¬ªm*Ò•zÊ›¢BÄÉ\,§n”N²ËÒu™VΔL*)÷ ôiÅ³í Œšãؾàð\©œKty¯î7Ÿ^Ê}ÊŸñ©<ÜMýðÖ}ñ½h)œýÕÈQÍ|äõö¬ÇžÎe¯°…Iz *W1ë¶ž ížuJܦ×d+²ä Ý¥ÆHÞàú‘½v؈¸äu·ã*Çb<=s×sª©W ã¿\#Ü¡mR12ˆ#¶&œ!”ƒ ^»õÌ^¼úÁ)³DJåbÕÝ£7Þúlß~öû—-@ñoÇ5<†Ÿ‚èØŸÖ_G½¦ƒƒU+ö·ÝT5BÝò]úe‰ËOµ&Ýb¾+ì“<>íõ_ïêRÍïg/—†ü̶˜P(X7åòùJ0¼hRp”*Ö:1‡\¶Ú5~cŽ.õ©ý¹µ‚xð*ÔE‚âˆcŒÃ ¥:2D~Ä~¶ú¬¯ ”«Ù?ÊýÏç{Nù[Ì0Â^+#vŠª6 *, fhÅqᄘÈȶ8KÀNX‘Ê"õLö¸Ï목œT û}ñ½å…V Yu¦¨Å *¨G¥ø2W3ø—Àb Õ„C´Q“†û/܇*ˆQ€1Uµør}5Ý‹€ÚvI¨Œ£]¶B\«¨'aäg†&ê.®Ékô—=;ÍØ/§Nûàšªr”@>ãC Ãwü€1àÈÞI’9BÙWÄyPoóÉqÆ]ë&vâ%*'´t~VP²YëÞ¥âý1ý õG¦>ߦ.ü7½W„¶ÅêËYV”^‡Á²ýqv™¶8°N¶ËÁŠ™Ö1ÄÀ ¬xf8«Q{i-¬¼n.‹I`Ä#EÙ8\rILDI¢„@¿(®ÈjIÒu XŽ(È}yr¤Q-Ûßz<÷ûoòx;G]ˆð¹½øUÈ/ÿ®(EP$¦ F ’)KüM$¦Ñv jBÂ'>U_<­©?tOz¯5Dzô»Û ÇÜ“ØàÈ®3B"L‹;"ò®µ¯×Ì´“«–~‡a›hÊ#¶Àþä„A¸ÅÈÜíÝ^±8LÞ¶3Ü›‰zYKc#HžÁ´ôΘjޝNý~`æK­—ë =è1>¡{+¾D¹”2oÆWž¹6¯°wçâ¸ØUl§"’µ4 ÔdÄyeìÝrwï¤ØÍ43j!ºWÿ2”ÿª‚^šB/äädŠ\aÝG¨¨C¬³]MÖ2ÛYY’ÿoß¹õJ߯fî&ÍöÞóöÌlÖý!ö@Kèºõ(:/RÀS~TÚÆþöBÔøÂá×°HÙõð/Ó"¯H«TÚÁÕ‡Ô„fœ _.´`žÙÿÅ%°#Xì¶Ÿ ×zY„‰…’qBcòùvöõ#«öéSìýÈ<¸©œÕû 8ºµ6ŸåU"Îã“;“Ë…äÔê>hLáÁÞƒi·;LX@à[;BɦܯxoÒcC ` áYùˆ¶'é¹Ñ#,·¨Îñxæcj°êQÒNïÜñêU¼náq_ú¶äë“]V_ù­\­d‡&j#¢êf$³Ýyõ¨UiHÌ•ä“õÀku}øÔdÉ[/{b±ž¨_9-¿wóЫt 08û —‡‡¿ïÅDPÌ/áœÈë2Ìm;7ˆ—ªàv LæèWßGô“ßõuÙ­'žFRŸ9‘üô68nh÷?ŸbŸ<±öÓýé㯱þæS¶e´2 àçê´=Ʊ ‹"ó|[¯,CµÙóÊìWú ‘^o'•ã‚¢aC¾;?Ê œ#ϼ۽ÓøÆÁÇ4@צ«ÆdÔÎþûÆ?± O©×µÛi¤ õ“mCT~4ý¢]Ü}³—F·¶œÿYÝøØ~¾cïåü‰Ûjè u´µ†ñÆûˆU¿øàoïfVO VË©°ÏŽ=æ‰yÎÍÓÓ5fÔ߀˜*|º×ÞÑ`IÙ¦GMù¼óQïÝoNßþfé6/9óèm ¶eÓ× Á·žŒªÜZ‰:ø65Øîý|þ0ÿ-oA†/ ì›b+}ˆ0C¦+":Ð(ƒP‰¥Èf-’MšvuÂû˜‚)ÈÐES·¡=…ˆµÚåRºË#@|¿m.-”WX-‹Lƒg‹2øñïÇKÏ·?zµØÅ¤êÎõ{¬[¤Nη«·[CXšB Z&…Mb0caïÂ…™ #´›†0cìŠá8¤ƒx¢¢¾îäÇD¨¹Xi®S©øê*œeÓšzÝèqQî×Ë_'?¨¡Ì,kˆÇƒõKyx*ÜcV’þ°×õ³ª9“y˜}ü­C!£.s§¹±d3‰ÛÆEn´ïÖ÷û~韾_uÄç`:`Oèlܨ…'Äb ÂRTͧM ëÔ‰«DrÐt“ F3U ¹‘uQ±²L ÊRrƾÈYR4ûüZç+ö‡Õ&%šÉt6Ö¦Îöa~bwäê}–ñ;DCè—)™yž•WÞ;­>}:V¨@ÁBcº(ŒILñÕÓYõ1ÇdãŽLȬèˆèD÷TâáÇ#é‘Þ¯…šŸÕÛªÙ>6R#F)‘'Çë<å€RY˜PûÜ!kQÍBË{Õ¸Mp‚]ðÛœWK"ÆZYh§Ñ®¯³dËZ ¤(]kú]Ŷ T¿«ï»¢Ó54'ï‚7AïƒpÚ¢r¸ÝB FCÇÕ?œaT°–‰™³±hô©ús›Å,(-’H‰ëýù®?î€Hß&dž‘ÔþÓv¨Ä±'`P˜3Ñ·8S1½„‚rXÈàAý},ï°-ž•+¸9*ÃA÷¸x§q{²X-·VṴÒ)ò5áôÚɪ87ÍèÒ ZºJÃ0 Q•Z²QÐ:ÌG»)<uŽÂ* ¨dj$ça `ÁöÒ¥(ìˆ%3 ж'n¿ð,T#=ZFm¼j{cïÜKŸž' 74ášëR§ ò»rv3=£k2^i‰ nU–¶F0p|e4ìAc€÷édì&Ã1a@÷™öB": ô\‚²‰ÛvÄaú ͤ牋wKK%–ä¢0é 5° áç õŸËï9*•eC™!,¦ÀGÚznì×di¿áG˵LKˆ†Ÿð€s’“Wµïäj˜0Ëf5/ƒ—pÏ{„7¿M ºã£Ù/ù³ð><Ò4Ÿ- õÿ¬ë‡ì2È´°úœf¦ sxütž§t(èýroYv€J¡ˆÌ€# •¸< »¤W¾ø‡õäž}¼ð#ûs¼»æƒâÙo4ƒ—Rªž™IûüY?ÆÙ5úëLòêšÄ$C¦z®oªÿB’LošÑª¦º¬$âm÷¹²¬É;sÔgLvË‚…¹<ÓvŒHULC!!ÁgÕGUàÞ j¢æ²ÞÄS‘‰Ë{»xÍÜøpØFöÿôáéöþÇöóþûŸþ¯^j®îã¹gl$SýTH[ѽ4$†xóîì\à6PDÓä\Ú²›ðý¼¾,IX-5Úc„]Ü 5Óðº>}5L+#)5°ßd ¿ åïü|~²ü\o¢ÙóqzÎâ¤%v‘àZ1Œ ¼Z¤`œ• zÞ÷÷®Õ;‰n”@V/±:…ÅU¹ùvxäóãq™‚ôû—dqrÑx€pQ)øGrÄr"Î6Ý‚‘JÀ$†4øuprý̵ÐAœ‚°-° Á‡LŠ(%9Ȱmq±¡UsÈÇYóšÌ2[? 23yü£|¹ïvÖ{‹µ$l8_r’8ôQ¥85ªÉ Ū‡Ž$ˆ*“Â7׸Où½€ÇKß:mø8‹¢¬j¸ÜM–8Iò܆ÍÈšYœoÏÎ?8ó9z%‹vðíéÉô¯0gï?ð¶¿Bõ˜›òÊCqè" \jA-E+Œ,DÐÝRª%M1‹Ä :\Ñ/¡+;®Læ5çCó&O §…Wù׿­®˜™ÊÁüaùñÇgçßIéÎÌÒÕ}g}3I@a¨QƸ(d0ÐÁµ@MÖ š•‹˜›å. 7•OrOšÈ*%×`W³G¶ø• ŸÞ£ü‡;þ/I~ Ñz¸J,,Ú‚I±MoG@•ãÒ|¬=ÏTÆ‘íú‘7̤ŽÖÖûë‹o1ªÈà¶êéþ\{Qý'%g»Ç]q-)ƒÓ5뾦ò¡ê ½¿ëŽÉmÏO/X{¤w¹-YÑæAýž@¡/!lâ:•ëP~=œî9y|GÄêÜ]YqÝ̽S™XÙè­™Ÿ낆 ‡ ÄâN]h ´£3€c‘Á_T#¼êg/V?†FëFšÃðª\-‰½9ÏëüÔ|uXâmñ.qEŠ×Ý>|£-Akƒpå) téV!ö?U—¨rêÓ<Ïf?CÐ÷ñ^ýœ^=­ž [*á=T\ïÛ"€ÎØÓjdr¨Xmz($m&ªw©-ÊñíýnRŒäžÞž¸wš/Ýä«j{ç‹ýþ/vÛ¦0‹þêöÑ®ÍWÍ€µ jë¶­`¨•à…Oð. …ºÄ´ÅJÉX!ƒ€e–m‚{*¥-ÚÃëÓT›ý%þg§ î~àÌ—§Vˆ1PɃmÊÒ@Uu.r¯Ã8êyÁ ˆ·¤HslRA.û²Ûi7•šX\ÐÜ6:°ŒõÊmó&¯3rµsD^¯¶›ÂªÆkîq_é¯yøVZGáH¸qeìE¸¯äÙâ%¼7_“f†ª;ògAËñ»©¯OžðB’8UÚñœíÚ¨•–ËúýçùMñËÑùËÝWO>|­YÔ…qß´®*×½–3S=z}YÏãç]¦“ÃÐLÐpu$4£9âq*ϲ¦µFD=qãð(šðÈ^ ÁFQÑ´"Gv8g‹ÊÇëDî‘AEêPG`Àf§>¬·°Ž>ÛþäüŸþ]ü£­wz=o¨Æœ øþ}uGÇì€ P«‰(!HrN´ $h$ņ …ÌËÆ·ÿi¹î±ß-n¿á^)j ·+zÓ¬yöïÇ.hÒ+B˜9H!B^Ëä>Þç!xeÇ=f¢¬÷Ùj.½-v´õI{§ö¥­ï‰þc8T)‘Ó¹ªBßÂtFûΩD‹3rÏ'ÙfîÙ?P/±'Îôqå™ÚÓQ0½æm]›%=ÌTÛ‘ä`Žíæ+¹ŸìÈ‹ rì`ñLg¤»ik=€)sRO¸´œï¯ÇæQÁ=Úæ3j£"Ùú§¡£VŠìEÆ#8Ž'Öå&è•)|Ÿã‚/‡d aº_.RèÆ! ƒ*]TZÑXàXÛ2(­zÕ¿ÿ¿ãÎðÚƒ‡½1K’>¹ïR ¨rˆ½Š<|Æx¤8' s Œ¸­‡ÑPT̼¸m–J¯\€7æ’[îU‘k²Ï¥ŸûpøØOª=xDÙÕmp‚újÕws¨òCì®Â›ÓŸ¼ñùö~k£LI—6åÈô(¥žŽf¼¸¸5% ¿Hãöö:NzÇãÄ8ŵ,³pÀ¹-ÏhС׼ݞN=|ÐÖ¦ÜríñèÁœ‰î/ñü¥q} ýÔƒ?è?úiö^ÁÜ9|i,éÎ,/™K`3¹Âþ±ì›^ë¸SŽTñH÷g¦¿{L4 HE¯`="Þb=ÞÊòu QjÒ?Z{„Ž Ó·¥}Áöý$¹ºmî;Ÿ~äÊÈ3+ýí»ÜbÜõ¥¨­ ÕÞñ›u"Ç uüs/~gúx6Dz˜úñù‘Ž·ÕÑ#W/]úþgöÜã+¹­?¢Î­€ç8±ÞÊ/\ýR»SWôÚ·~w»œ·»3"¿½¹áQh]Tqßׯ{ýø£3ÛG˜?èã!oéä©ùP¢°â û–7xÐ9Xö¬:v®Ÿ«úѳ[ÕFlwç‰Ë¦Wëµú¸påÅûzDÀx…ïFuå¥z×:~D#bzαûùxa ÖyµÂû–RW=›GCyñ#ýÏM 8…W‘ë Ó1ÝúÎÝù!­«nÿŸ÷t@¬[гUfú[tÜà؆fD€žÐG&Ä–b0Í„a 9‘ˆðæ‰vø(ÆxCy8ìù¹ØhéêÔ® ÁH2åZø@8àR†Ä:¹,b‰¡1™ŒÎv_xÉ(m({” XòP‘A¹¨à0nÃ~ßaÆVˆŽKÁ™…Dt5ÀQì" xvšf„°7·$^£ß˦&ìEÍá´E;ìb\Ñ‘gBGã¹pAûÀÞ¤'Òñ…Væ¾ìl®gÎxâÛw7´´'¦FìN@ Å©ÃcN8ŸÅoçŠÕ‰8[éún ë°’¯]܉&t‰”ã%g èHéFÓQÿ9†'\©i‹WÖÌ»UMÉ”™™ j¡üýÃø_¿‘ÿ-LŸÙ·I¸Xž”J²Ú QË®غ š¶©yíÞ6¯áÇäáÃÕ6 Ã4Þ}äNg¼Y6ðf}(Ò$:^œõÇÿÆ{þð ~}ã-Ç^µðZù¡ ÄH°p––³KÔˆTX¸žáÌ/TMc¯ºµæÄ(Ç àÐ̯¸zæ¤éroñ^™WU°Š™q½>þãKŸ|>§Wä[0T —ìò¾Gyð9‡y§+©ï¹¥È÷ŠïÃÿ:_<¹ÖûSAi}DYÝ÷\$Xjv{W¼ÌÀÚÇ÷«ô·Ûüú¼(JG¹u©œ*NE)aÍÑ‘\rëžGr¸ ¤дÝW…¾M4¾¬\@2oSµN «_yTÖFlk¼ñ•[.Îëååü÷§q$ë)w ÀÛsJÔ‚¢a "U1­šW±6IÑëþSP·Û±Xh6Íî9|>óØ(?½Ý_/oÎõUï÷ÞŽw<ñþ€zbþOô§¯ é’0Ðv§Sα<›º5:DWy²¡:HnfBfC‹Æ8±ý êÁψE4„!Èz¡·µçCµj!4ÌËÒ_ã÷ózœs¤s¦Õ÷§¯õ5Ë‘F‘V @·aEŠ Ð ’@J¨$"ØR3wÞÊ=ìJdIýIý§ðf«äˆ?¬s J½ð¸€—Ðnº"öh‚†PDB®è’‘©¤×؉w¢ •3‡–¨åM¬íñ&™ô‚„E©*5«_tïm›Æ¥V]©C‰­+uH«¨hfu§$QaéiŽAÕ¯xÓA(hŠÐõ}ýéñݾ«†>ôRóð¥Ÿhíºàg;ÒÀÓ^Zz¬%m,¬püÁì+Ó ;  ¹|Le½¦öÒÕáNÚÝçÝm-¥ƒÏl6ÐÑc˜å&ÔÓŠý„«¹º‰t]JÊg¶x‰@JeIä¾2¥*²pX³ËªâþdG¦eÎAàŒ3)Ã\ëù¼®ûáÐèÜ?|~=ħÐИðY{#u0œå'ݹ›ÿ–„óùü#„rúëgö-V._BQ<{ãO˜zŽ®M ¶,yy"l?ߚﵜ«&fâ¹z…¨,bHƒU²#zÌ~ë¼ jB$Pž'óÖy"î3z-ñ!«)¤.cÛjQº‹Ãæ)ט±¤¾à3Y«®g!ci”‚(_ÝëõtþC¸»ÔÒ*¥’t}íÊ,z{e0-¾ÅÁæ§æ‹‚Í‘ø;Ô" @Ä”¡ßoâï³vìÏàèÙ†AXõá3,Á¿ÉÝ›}þ[?ùÛïàv¾þó<ÿéWýã]¿÷ÿx½ûGëoÏÓ”o›½:†³&ÓÃìÝÄ÷¾±Ÿ¢Ê‘Í6|^ÚK7qáHZ  7yäמßÏÏ¥'0Ì—tfgy.}Vù±â}Ë@!Ì+tg5AäÕ÷ÚØûçî>ÿøßÓûùó¾>Án÷œíù¹Ç^ûíá…ß,8À“¿Üjk@”Omh+´$6ŽÂJ—›ëiç˜×—ÏÓëí\Ü?›×œÄóæ<ÿÙ<7ÏyÕÏ׸`æX² ‚hº3êàƒ<‰a³G‘•}GjHƪ02øã¼?•gžÛí *£ FÔ– ý`! žÈgØÜª`Š—½¯¡ ¦ddéJò׾׬*F𗇇ºL,Î Ù¬H…•yc­Hc*„QŽæÀ h¾yºãq¬I“¯òX¸5wÄÛC½ÆëRÙ–6zºÝwt8fÅ6éØLÄMXñâ´û¥±$-Q©2˜pëKÂ,|L¯z<«üú½ôŠ¿™,ïûïí³Íϯä¼ç§ûÞ'¿–’›.Ÿ®Š2ç«*¥ãÀnÚ@®Ò… \ £<_¾ËÁ=/ÃÛÚHEïdw†UÔÛèd4+—ë<©Á?¹ª»äš}w­^þ~Sáÿýë5Ï©Qh(9¨ ˜ÈZ ) ¡Ä¨`.Àtp´ÉÍzŸTN1 ,]¹ŽæÿrÕÿ;xþÅÏ¿L]Û½ü~&TFªrs–ªÙEÔÉ\ÌøØíÍûXœë³T&~)B‘¦¨•4Ñ‚)ÙãÞ½ óƒåEFbÎ&ÄwQTö˜äkeºø1›*ÂNø›Ì3Ù n;šÓÁ’ëqôv4÷¼1ƒdÄ3” ÀÈYÌ[4>¯¹!;l;Úz$"ô‡ Û„pÁB‡ÜDc†¨Ü[,32m*&žm߃œá9+yõ–äéæúï1'Z?ˆõýœÝ»çÒz NFAÉjWÂ!‰%C†|®Ó»*˜×7Ò¬vN”¶®÷ñ”ä(÷º=Ÿá!ά1¶X¯ûsÉšoœ·É–k Ó¹¨³PA|ˆÓ ± (B¢xÀv¾Ûíþú,ÿCÃj£‡"뱆²È±@0]Yý G«qö£¸µ“×+ZlŽÄ³º­ÀæTzŠÆžîÈVÂópÛ˜÷Š>kÀyù*'·³ë­¹6x…ãÍAMeª°>n HÒxCTáþ„Ö Ú ù. pÝæª±]>.\‘ò@©»u{ýb0Zjá›s'¶Ï:Y›±4¹µRÐoe»Ä×nú\P ˆÐº'F=Fgô°Çãâ}YÍF|žÃgbÃK‘/Q‡;®o=B»—LNržbªÕÎçÃKâ¸Ü­öì#é¹Ô`Jƒ_}[w·ùŒŽòLû± †’/D9¦3ý;*››Öâûæû-ƒÿ­ß6ùOJ­êùö6o«\ð­6‚ý¦€d "ìn¸`2Zuåâš_|ñß¹†­Ýܮ‰»NÄ€„áÖLZ’Y9_ÁLŠHyÁ@*ÅÐÛCÞÇÃÇ’ž [ùÌ¿›Ü“Yn šEèý‹“¸8¼Ûb>“,$I¼üIÛâÑâ‡,pùb g›¦s…~â {U†‡åÔGõ~·œ ¶‰Gªï°ZlTv± XÏM&w(ƒþ­K‚~šÜ~:ù³7fn~²›øõïÒãwŽ'ìuƒÚþä±îøÒA>Ýâ­ 2,©¹¿eúðN`‹Í¼È•îÖ숵ͤ»bÓÐâ[\KË£p~4oWš7?¥rƒôÛ?{üé?ùEþÊCÕ7ÛÓÎæ.Ï£³þè‹cmîœ(áŠR+äô7²9&~rò§W´§¥¼®ˆKÁã°ÈæÄf_Hà#Ï;Õéd*V‹>%„LYèÄa¬9¨w¸…¶£Jˆv˜øt11ho} ¾ª[˜ªÛé·0¸4õJÈB‹ÐzíãXŠUm³ŠÄ$‡©îG£Œ!)c%Ø=o“€å…$!Çv{¼³Esðù»þ½Ðùv7õÃ$i 3[–2þŠ ;ë¥õ\c«³£Wmo™VœLÜ«µâ0ùÉ(”6ââê†Íí`ÞOÍ:mÉOŠ„]NañUÅqn¦r$ˆ=Íf1SÒn…C4Ðlh‡fWÄPºEvBng*Á¤­Ö‰´½Ç]=‰XãàsAÀ—†¢2¦ò ºqy’ˆC,À ¬u R"“6¦»1ÎÏa„¸Y:*±“~/ŠÌ;f´ñðamÅÃÙуnÖð•4’¶åÓ4É­š…"#ú°¬€Ã¶•–&úù«óüËÜÙGtXyæÏ oôNPldj_œWÿXû_Ì#›êÐMCÓãú)¾-Æçá¦q£…©;÷ÃÕa~d¯4xà |h“Õ&F C£?:Tú²ªvTÁN}ëÈ‘ˆ@ônŒÎºü°¦ó_Œý—ejâ`C) €j'À¦äJ<ƒPgûD*éNqÂÙ?,þq¼Çg2Þ¯Þ…tÙqÕ5°¶ ÒJµ·º0+¥˜Õ±GdŽ%ÖÖùtžþ~¾U«tVò šGrrWº‰œPWáÝô™Ó*Ã$–¼C•^»'Ì£‘™ÄQëÕ°ì.ÁÈCT“,7",Xkdj»Bç›÷•ÓÏwª³º µ1£AÏz|ÿ6Õfщ߷üš/¸ö¾ÏÆ Ó—, 4úÛ³Ýàªr’vbúîŽ#G$«ªŽqò6:?e>æ»­_œ‡zqªqžþ–ï–ÿj½°ö›2 #RoO®*Ýj9ŸIˆ`Ì—î|:Ì^²'ñéfɲ Yb³&0kõÝmeUz_%¬ãŠ"J±"tƒh·[)Z$ôiØeéµ­çãâÊd½IÜ×.–Æi­gÒó>ÞÎRã&šÃßRýT\e¨k¡|¥tì)YLÖÆHbâL T€ÇÝÕIÇ izš=Ÿ§à<Ëõ[Ú`8ÅD•–mƒ©/&…J1A½5Ö%.ˆ¶ í"F5Þ‹ÄjÐ@ÌjµRC³òfm • e£Dª±ؘŽAL’%ÑF60t öȺY8!†$¦LrµõÃnçyÃÞhD.–óH·$¹Ysrü,õëêÓæP&Ɔ"!J…Ä‘%ðW3†$LÂ¥²´¦<Æä3°å—¸¨Ê‡òû³ë øÚÌ[çãÏŒ‰•2Ô=†"¾©—ølí RñövOz{–Ü8ùaNKu»ïÞ£GwqF T’hÅmŠš–Hž6¯4on~4»£G·£f>ÏG9U¸¦[:!ÚŠÏsÆDlˆ9ßùÚÏcØB¿œé–šÈ½Ñóüû+?OΩÕQOKÀ =gÆQáàN'dç—„Tƒ¾…â΂û[‹©hm5D=ãr šà4Ý¡â–Zq\º¹N<5£ˆ(²[áWÝ3y9¼¶½Fõº5 –é% ‘B/è#?6qF`¢qˆƒ!@C2ƒÔBYgfh̬½ºê€d¸¶—zQÛz<<òWÔ¹Ò{ÕL*wrUáf²ÎmµñÈÏwBÏ&§?Íx¶Å¨ƒÑòÔ&„6Sº*ꪢ 1°3/õžf\ NèQãK€ø„[ £Œ¯Žø.Ûõhp&²35î$Ñ€G‘°“G†˜y¯È²çmDH#¨‘Æî]ÀaŽÉáwm ïÿ5h€ @P?’pðÁxŒÌABE¿Ç7:ÆlSøŒ§øq¨±oûÕg%¢k–_å×÷Ã5Z¢Æ‹¶Ï¼OJBc•p“?ºÈ=ÓÜ;8"õcí=Ù3éB°ªàZ³"4°Tã¹,)Î}¾˜ãõ >>ó¦3ŠÞô¶Ý%°ŠÄ0A¶žÕŒ×Å(J$!¸‰Ôˆ¬‰7(à)|Ãa½ÉۃכÃÑjà’ §€ÁÑ»o…âÕ 8€u8¯”¥øâ“/?~±xÅÝi‡'áó‘{qvé³›£;¨Ò­Óô<^n=Ý“î~;>+5 ][NÙ7D“4ie}0ˆ-´ëÆ—°ÇU›Y\ûZñÚ~Ò??Éý y¿û©çqOÍo;yĵÝïOÙž<ÐB‰DÊ#.86ô†2†YÊ1>–NÄXLÓ3ÅÆæ6‘DP¥B´LÊ~ñ~{ŠKž?¿o[x$?ÄiÏaõ Þvˆ¹+ÏÞ¿ØçÈÜéWž×d¼ BÅ‘k, €¸öƒ#$¨U@B—¸¸…´¡[{g“ZÒ( Ý|F«‘} ŸÖÍ“ã–bJ=´½šÈcèº~ÎýG+/iàÖ§áB-‹PM'WgìG‡åÖé‚=U³s8†àа݊4ä¤Xà_tNv~Ø®‹ ÿÐsw®Ük‹„As¦ÓBjqíÙ}«ktì»­°«~Ú?ÌM˜Ž„ö'mƒŽ™õÕ pºPòV èöZ©ÖàŠ«¶Ù²rx˜µÛ]k«0‹CrD¿ZR¬õ&tÞ{³rNq®E*Ou˜;Âýôu<ßîœw‘·ÏVMj‘R‰½¬bB%,s[¼RBZ(5ŒIÁT^.Ï`¡PL—@–8™ûO󟽑EoUHx½ ëaÏ6Ï…^„K¼Š|J“­@®=}mÝ VÃ6êfñ£*wÖ»6}p\u¿éZÐL©Ž€Hà*9fh„#ãR‡”óàôµ çEZ'}-O‡»³f<‘5¹<± Ü-úªU¦UÈo„À9‚:™Èža·#îð[ì(AÁDó­ù„Û…Ú9frœ±jxÁÒsÎ_Szü^I.ê0;.Ò…^ÓÙeQ? Öj,ƒN Ô˜ ŠP¢?!àÈ@†»íì–%ñVK½™^È1œ„°»¿ª^J•£ʇ?´Ngzö®Dp[.‚ 7< ¼ 5»øÍϘ¬Eëßê9]þ©{(Íj<Ñv¢’`­¨`#â>Ò(÷NÀÖ«ù hÜó4»d9‘·Å¿ò‰BX÷)³‡R>Èwa߈YcË1+.ÕÇ1‰^ýHÚëãì#ÖÇwóŽçå³ýï 0‡Û…¡Vãxy*ï@!„ÅšK_o+iÐe„i™ Ÿ³·мõˆ²QÒB"a\r/ ?BƒJ0H„`‘Іà¥/ /¥ÂÔ¨}n;"õoáym¿hEdds§F”3¼½éÍ;Û_ëΗɾ.ã£=²MigˆC¹~DoÍß{›Å&eß­qfÑãz0"òìü‚Kûô³ï„§ºÔçŸÃü'GâJ ÊòÛBZ6øøñ/ô?ÙŠjCÀGm~r!2 ¾é‹oûsoŸ÷¾Ý9íkPƒì;iµf€Éõ{Û›©aö+áÛ¹xèýöŒžIÊÃO]&F»SO>8ÌdVbOß;~e¥£¶Q ‹@ÁŸ0ÜfbÔ“¬…_Ùºå·|(ï±§öãÃÖ)¦…ŽÂê¢Â1BÒêUííÉê¿ãËj:>üZ¨rž€vµ pÇ0¬ò÷°—?oGü]Ÿèër÷òÈL$Öíïcó‚ðUìP,”èÔ(<0\!Wa"„“޾˜l|Añ¦úßqä´%²Ÿy¹urù\æ6¨aPݯÁ£6˜ÊœOR@U ¶ÀD,'›ìZÄYv/åÙ}vƶ³4R£ñðÏE+u‹Ys¿¢ÑPâw3~M…ÊYÚÊN(7ŒL×ô%µ3ò9ÞUÝËŽf˜kFDAc•ñ4•Ž%Nôé*æCuáE;ßÜA,Ì6` k÷”1[H°À‹0„p”–ÚÏÇr÷¨|³òs[š¤Û=˲|P£ŸÖ~E™p__gåA0oÿ³ÃàwJšBߤŨ+räKªé‡E]. ¬á£íæ~J3¼d z=1ntA¡ÒÛŠZÙÄE†Ú(V9¾Ê`ÂÞ‹àŽ§³½'¿ßŒ}¾‡:šPšOI7•ØY¯~­_¿WéÕ^¸¥ùCÔ s©ët>N̸I€}MCý•Ci¬TœéÊÍâ—‡[VrÑÀÍyü(i×ñ7¯·þ/dz/7²ÆÒ4oKévÎÖs[½£É¤·: ™vØsG÷{¿´.– /Ókp¢Òq¨å$QŒ(Mæ.–²ˆ¼Èka ,Hx£NÉr,nÂqªZx¹øs?žÛøøŒ×&x­Àž¯âŸ|}1Ùù!ÉO;4´"cJ%æ©]µïñJÍvx3ó•|ác׆" ö‰ÕäAòý¨¨óîà«és¡êÕHœˆ 柼 ]Üu‡N=È-4•QÀ ²÷Âï×#÷¹LO«Ž\˜av8Âwû›ÎÄ@¼b„YMf¼Â2i˜‰)nìÀR ~·¨ gŽ`Î? +NšØÒ|Ô2áÊÑŠ¹˜h]ˆî{o*Qˆ‚ÌÊ šz’O Ù$!á‡EÅ×UBE&ý‘ûî>W¯çi”êŠpvähAéaí¶ç=»7¶ž9 4ˆ…ƒ§P-稉É ñdݨOµRJv\KùŽ‚ã_èñnŠšPFÖliT,¸ Í ÃÄf"‘Р̓´Y‡µ"n±«Å1ìhxר‘Š—ÜÚÏV;…ëkNiYêÁ‹šJj`R †ŽˆÅäijÂDéB‰” “Ê“8H´51•,‘Ã:¨+)’GƒV¹Äè°ŽWfÑ"-ÓÈyA¯†)"Þ¾”é2 eL®ÜÂÚë …Ilž¢`…è›Ù xiÈ&ªù©:Ü~òy• 4ÃŒ°¦\д5iNð Ìi©šxÝ‹ÂZÎÿÀïëÓëï¿Ëÿ„ûÐ÷¸”’å‘h'7çí·Îq’„ùtGðMëf\ARÆW-Š@pÄ‚p„eò2ó,ƒRØq™ÖÙ+äÏ^ø›Na)ÎZ’°+©ïÊ% | –ç‚3^äÑŠÉЊ gY7OϪŠÞVàÔý7TýGL¾‡¶æµ`öŠN"—…·ëi»g¥@¸%»†Ê‘Lp-49m˜i(ym°–€ŠiD!*d ¨AhFÖ6s‰e™Õ¹Æh?Ü-WÙbVó4rLŸÛIMÃ)/çG(A¦%ùùùñ|¿–Zl(™ † É@)\ø|ÿéãFmÚÍÍEÃl,íU¾øþ¶×·_â·¸“;—bV@dDTü0ýG|ã1ŽD„Ú<ý®÷Ûo}îvïÜûûýñ¥Ëoñõ‹uN>ƒËlzùžH~ò~½˜åñ+òýïÞí|bDZg|Ÿõ=;çóÒon—çJå)ó ’íî~®cW«+m¢æ*pG<ИªÏód>Oi?·Ÿ×Îyyè£ß…&ŧ“XC¾f2E&ß3îsÎw:Ò›ó\½ãK·¶™Yì%÷}¾{ùŽÛó ÷ª÷ ^ S­ñlÁÍ Nu¶»ÃÊÄ M‹à³„ABáí n àÁSÖ÷]Þ=>ç}± ‰JXÕazðsìÉjl¤ä)^þ J2F‹Gp¤ÊxÄ\¬㜓¡C-`Oyw¾…ƒH€¨†!þrš—)(JÁLÔíc²%µRŒ~ä5Ô‚Së.ä9®4²;”ê׈a‚KÁÂ?*| ŠÊFOLà@¶Ä†Ê2TÁŒ-c]°žw]o4²V‹8%8 q:Ktar¦û…|æs2-¯Åãøñdk\ûµ}ñ)Ò¬vf˜çVþî)9S  .»Ú1‚¥°Ÿ t\U8Bj]‹§9r`ñ„ˆf hÛ­TíÛ/yèSž8?çæx£ßèk§¥`îÜþds“'ª´A•#Aˆl,9fØÉ¹t|€Q0€5j>mDê¢î¤:[ä&íƒÅæTîÐП|àEý˜ ëõþ,ÿê©‚%Eh¦@Sçš`í nCÍë‹Ó²×Ïïv™óù¾ÿCÃáag^àxÑ܆N}ô§_gß¿^ýràð`ذ*µ)D=õ0¢'ÉІ„A>Z–Ö#ò±;U<»’ ñY­s€G”’B&tM 2‡DX|]^¬@rÔ¸.H5õ¤@gÔÀÇÏ_t.^½8‰¡‚Xs­Ôœó޽Ðè]–áÆìÉÎryfÞªxü|ß^ž7ö¤~ö®ð1+ˆÂqÀpEÏàÜÚWh%n³<`°¶`%¸Åâ‹ô4®›Ø(ð’í"®|kß~t. '9²±ÄeUÝܧ™91›Ò|˜¶¿³º—À]'¶;DêRç˜èóß^%¼Ô´X!ús×X=G¤£Ú™«Å)"——~4‘&­QsèN-‰uë—ù¬[Ï¢ö¼Ý3­¥‚ e7ÒŸôÕÇYüñ`ÞŽÎ$«-9”Í6rÙN‰°€‹VdOx®ÈB"Ø“R¼Ù±<ÒŸy^:1û •#Ø„&ØÉ«`Î,ôgSóãKMþ ÿIJ*ðÆ<ë8Ýaµ‹Ð.þ'Çi®ÍZ˜}ÚžÝóÕ$`,ª$N‡ïËÏõ?õÇ}ÞrFÍû¿ÏÞ'Cê]b˜ˆãÁ_—Í‘ætz‡új.G-Ô6wU_Æ’ƒ ¿³~£Î!÷û2›'›[p©(.r|D§q×§µïzêùWìÆ!¯­ë[æyŒ\¿ú\¢S£}|jý~öb·´‰0@ÄÇF¤¸Ÿ¹œóÛjÌ:cíFˆWkjOœˆ Š]˜rÔn$- šˆCªOoM¿tƒߘ{мø.±òVŒÜf`§–YM¥¶Œ¨µû‘Ú<[ 9„6xÀE{¸”ã‚"Üð\n\Àþãp6¤p ‡ü­‰ùÝÒz}øB!ÐM¸5lÍ`6>ÒBOgPjÛÙV»!)ävlÅ*ð÷>Gè??¿º_ÖÍe{%¿™{±ER‰3·•ŠãÇ],‹F“oû5Ô¸™¸ãŒùJú¢ŸoIOMØEfÆÛ«ôþŠ m ÓXÖ½¼[óß[ûô+Ë@Õá°_ís‡^:ÊZý^{cívÁðSÌm|vslß'‡«Ñv„Ý«ŒYû}Eu5•âmkŸÆœAs‚~9ïñ¯lÿµ·žÒ‚ Ê”Yuíù{Ý…¹ÔY´×‰Y‚Ý.3‚¦‡ŽåÞ'š¨6¬D pª­v˳!+NÞ¾ÁrÈ@H{õù×Ù¹Ÿž£ì[°‰Ds_ÄÚv6æºÎDíµÏ,Ý&^ûèc»:­9¸—-M¡­ËÙW+«Ú_ñõãŸô¹Ç œÞéù¯|pPH]þÖa58oó¾ÚŸ×&ûªŒ¾™è.›®m˜P®ŸÂõ7¯=ÔI„AøgÇïÿÄþÖ¹6¢içÞ-õmIªƒ,a}'ç¶;ž~I–ãc¤o”˜:`ÝìÚn®óÁ/óòš1ßží_À×ug®™æ¯ú|ûçãG? G®Éw†{¡3·çn¸ÛÿÕo¿Œ»Ù¿¯ò¿¯ëÿðL8uæï®rÁœgÈ1ÜÞhTÃŽ=SS°ˆJ\H¥—,$ë…È‹ÔÉL-äf%@F8ŠGi’±™üPrq¶þs›³æ?,J—«µ¶–u}íWþbŸ|¢¸ªl‡%!+—ß4XWÊ”!ÕޞƥM§G‘¿x|—œá£gÉg(ת=ùÙ ¡B+ئ8 âS4šñùÛü|òê9ÒQ•»pÚ²B°«¼ïû…ò²yÌöTTaª.NæNkUP2'iM¢+¶ÃãѪãó öI¯ª´:3¹+?­[1Ø“ü!M‹¦¼ê·×s~½x¦·¤„1öe²d8•KˆÂ’^B’L×&q ¿ ¤ŠµáRúGî¶õ`§æ®ü(Ý>\KQÕO´wJzí¢×/£•8:÷¾Ìá¨*7'I3×k•›‰è•׌*÷öºµ§ ý…¢Ð¨¬ ‹¡ÑpÿAÜNÖ¹XÂti~‰öVIÎ gêÆöõôJï5!¸U™yÊ—`í‹‚#”¦ hŠ9¾Â¾ŽuN¢rúMI+¼JnX„´t¢D­AÞ2˜=M+ÀÝò£n¥aЬ¸;Å`€ŽÖäãéðgçųøœC¹iÆíY±ß¾Ös$ʹbZêÍnÏq+á&ktÉ<ÍqM.¼¢¢¯NE^CÍD*$ý8Ó@éýlÎnòÔNñvæN®¹Š‹!ïxÌà$ZTÖRGÌ`Ùi¥y&Y—‹ËY ˬœJöVbš"‚È|ÿûý\Ÿ“Ë%)ãœ̳]xÉ^sÃZ³Ì¢¡²í’‘ªòœ¡Æ­ -êl“ãÏ´^1u²-­¹Ì3Yîßœ“Óá²U窗&DÓ˜«ä¾„ÌRWÏ o¼sÖð0é*S«…ÑNùEÛl–fªÊB ,m‹ùt^LªT%$p˜ÁQèuPt¶Ã´]ŽŒSÿüøùðžÔ†+ °è°atF|0bžc¹)ãiv^Gëý£{ NLª9ª#3!”ä¼~ûgõçb4Eë*«RU64¯©ß(ó¥8•=|¼Ë+ÍëtŸ¦)ŒÍø§aE»Me#¹§¯_Ïwø¾[÷õ-óŠ–uKû{&ö‚Ó2áüÎnO㱋%ßó÷¯ð~š ¿KÞîìðÚmખÞK7bÒ)÷¶8Ñ(ÏLFYñ.¥*š Œ'qá~´íc.R™‘ÉÄ!bpU6²*Q€B k’:ŒãcRÎÛC:÷¼Š!>ûlUu—u‘XJi;åsÉ>;» ¦zÈ©ÕÞVæ…¬ÄÇ£¼åòÄUé£éF UQM£w‡Î\V•G{œe3„Ô>½ú׊Ìàh /ð ÊZpŸôKß¿Ùy•×G8jí>ñ§7½<±`¹G¯q=¥Ÿh;-`BÃiPaé4 £·:imÜ;ë­xÄç±þM'Èh˜19Ødl"éBm-ÅÔCžã¥Tí§Ž±:{:èø|ß¿û¼’ü=|óñë‡ç!¨µ8ßP…ãYzþíýúgŒÂª´Ø‘ãõ¯|§ç›Rõ Ÿçƹêfåþ —.ŒÀ´€¨*ÎhdŠRÔãã .5UápgñEXD÷tʵ“"¨…Ðf½èÃU¨!´àÒY Úr&Pέ kw³PIMI«sú‚ô˜L€R“¥Ñ‡…‹®GKå \S‹Ø_'Í åÖ{Ý~Ûà’L¿ÿ¸ìpD>ÞÇ¿áÿûñç»K4Å7îeñ…vÔ‡~¤Œþ$¼ ZNÍ,D ¹RÀ…›’í+Èê{MÛ V`%Gœ®{NÚƒ:dVê<;}O·©€åb †ƒŠìkkÈì¬ý4{‰L>$H8’lV2y Q3-ê"9I‚ÖhSj˜·_Êsýœ¯åøªÂv?ÿ‘yÙmÜÒîaCôÓv÷ÝÇBEâ`£Å·bAت˜†ê@Úå»ÎÉ×¥³àqƒÆ)g´ ÊPO–8Ò¢É&Ɔä®Ú`/g¶í‚–¡ÃLË˽Q÷гv“eì!˜%¬µê ln\·áñ‡B§Ñ“8dFUJ×XaTûÁÕ®“êûºKÿá\ŸúïÛýõf?ãnÒ¹?Š.Ñ•„;ÿûqÎŒ/õAïC8 —ñjË|!‚|fqÙ2Æ£ƒéx÷á9ª,&u4D7Ê &⇃]-"A3qžÊ+ÔíëS`VÆ>‹…«]Û°ì‰ÓLƒ½g0K$JˆHí°` ¯E¾÷>^„  u5 g"L60äŠ ¢åŒnOfRö8`Qò©<²×Ò oxw9l#¤À~É[*"¦Òrµ¡ãò±°÷ºæȲèÁ‡ègn1)?!É`ûdEí¯çðãBþåý=êjG‹Ýn]”jrmŠC²°v±,½Îcóç'ÖGH&Ê,å‹TYÿíÞûíͼ"·=Ïò¤)Í«¸ÿåÞ_ô'‹Ô7†p³ž Ä#w³Zé¿Í ,ohg¾xûg1u÷º5’©ÒKhµmav¥O‡v\ûéâÕ‡b³à*…lÿGÿ;µ?#‡ª±2­!»}¢¼ÁÚÌ÷à‹‡ßöÌ–í]N^^R|þŠ– õÓ:™ÆhB,,@µ™_[ÿV565Ä;H>an7ð¨Ã0èZõÁѬ±Òð­b©3W ^cëº~ôèwœXkP|¢2G`Q`Z÷ ¨™;×ÁÛ[§‡m® I`øðÑeÙ (¦aª±”’XèšRk{öï4v7 üѩѩ7äZ±È3rB®>(¢‡¼Lw+rd8>Îñç¼ü®­>Ì }Úui¢ ²‘G,4ןyûßBGYÓ/ûa\ëÂãS4,Þ¼¡ï"¸7ðÞ¶W½ñq¼÷ÏâhY¬Udí1?ûƒQÜõ!ž1ž¦g±]òìØÓYy'ŠÈ£ÐJÔד¸û‰'xïpdY2c<{ûsøÉ0Ó/¨#‹5&[“j0´¸Íï0õ$ M?Vó\¿üáGÝ@~¯àMÂOZý¬_†¸C‚!–p  n[©0@yfXÅ D¨ƒ%ý ¤9z÷€½\>N­4·B46‘"‘œ8¤RWJ¯®¬ ³›ÿ#‘™)€Æ¶I—.ÝÉbÒ.××êqÑbӲఴ.·X¬*)1ænÝcˆÍ }WÙ slÍ%µ#€3ó\z®^à#Ÿ%Un¥#òQyì½ì·Ö}kþÁ&P‰x_ÒäB0pÄÑ}]l7Ü­N™{*–¨ÒÄź–•ÁdÕ„¢!©”;ï‚MÍ”SÅÂlNy›.Ʀ¿DEêpIZ‘Q½9γñ™T„Z«Z[¿Çe¾šc{ùê¤ôœV½Tçë}uÓ NsÍý|ýù¥üœŠ8>sf?†Uþ>ßÉçÊÅ?GúnU°r“7¤ó ÛG/ô¸‹ªÑœšáËC1õ J~4ûý˜HWq7÷æªÏ3Ö£”Ö¡qØòÌœ Å€¢Âz•›éÊeyNÓBn™²š´ƒ¼þkYS­l=+ÒýY¼‚)·u‰ƒŽ¢¯ãõ¦ð|9åèÌ´4¯\4c_þäû¬neÓ,´÷é1q±bb'âCƒW¼8»"qnÿ1몮NЫŸ}‡‚~uS&‘è&„C~šæ¸ä±çă+±2‰”E$ï Ÿ]·%³£ÂS­\±w&’û9,F“ +Eª×rWዞ´ŽÒŒ¹¤Þög.Ä«µhÛ­¦µ {(G…ÜÕ?KÜ*òAˆ%å•H¬Ã­n‚Ç’&\Œn‡ãé¤P/Ên{xm›©,zRž-‡•3"+˜duHL LýÌ^ˆ4…tzÕQV÷^y¯§ûøªÖGzÝqAçþ×p§ TœVëõöÜß;|]¯Õ+ù2„ä5yØnµK„dÙ€ojáU$‚•­1@Uì¯vM¯®Ö‘Nõ#èä¼ ë`\•“ÕÜÞÖ®Cz¡3ÚJe¢‰ŠÔÚID5E帨­&—žÀ´‘L˜ ¬ƒ‡ë{®´çJÀkCƒ ©§ì«(|0 ºÊ2hå9ÔÎ*^…}0„óJ° —€(¸$VbÒgãAºÌ•JxŽ-ä¡Úy]úîÄ.GžŽ%šÑ°m{GÊRÞ$h YÈ2ýÄ:}4õÂëË÷Ì^¨kýD?ÿ“×q?ùÃäi舥±>7Õ9?ò w­‹7 ÷)•f\‚¼à,s±}eQ§æû°ª$Øz_OÛÜ!¦£‹T7j ÷cö±°³îe[™Nо¯­µ”2¯ãAF—.¶¢¥_Jze{IˆÅÄT<Ÿˆ‰œÎµ×±ï¾ÎªÜ¥ü¹N=¼‘^EÛ¼Ö¼ž"õ™%hôZµÆ¡ž+æç,?_°®Y~!þVõ·æ¶lÔù¥ü†$Aœ¯°E 6öDë:“˜$W0P;~}ûõÈ{9`vNû…¯ézÑܽ”äMò ßX¿:?Ú,%ïp~àÛ²_é½Ô]ÔùuÙ­2³ô˜„{»˜í)Éiï|WòXû;éh‡WÅÍL8íÑœ§Œëœ¼ôë9™ëée«×è´}ú“ðb-ÉçµO‚“¿(Kk_ÀÊ ¼ow†­whCº§,%‰Ý,§•3HÂ;‚ù”}.l¾š¹{\ŒL -º©Áh&*)›‡÷¸ŽiPϘéE¨0ØÛûGçíÀ5‹×ËÑÞ'ÑfÞ¸)‰Œn%Ih‘:ãõ¡§D ª½:U:†8+îxTÕ© ŽZy…ìPÒ}° b„{hHƒ¬·Æ«,`Du\ ›Tÿò7©!öØè\Ešh¥4Ê¢$øT~%-Þ*.‘¢Žµ ŠÈÊ–é¶«WYrZ ‚Õ!ŒÒy6rlåJ+‘ùèB" ™©ôľ§X 8‰îkúHÍ©]2ÓÙbf˜ÏP¥»!º9ãì’‚t¾ðí¯"»‚€Â£!CŽÉ’õ‡YŒ ^/ÿ“ye@’¶Ëp¾üß2·°®`†¿¼ÎÕ&9¯ WÁö •PäÍãêØƒì‚¹:ÂOæR”¨94‚­†wîIñ™9*²³Ð´‹Aÿ³–…œŽÁÏ2›Úòî+ª~PáÁ1õÅ_•Ô2“†ߦ:Øt*óÈÓäû:«ë•‘&”¹èªðú@5«(w¬'·X˜,0 ^Y²h²‰ËÀ:­ ‹ÃRb[»†fQÌ4’­Œ }§wãʕϲÛ&N#oèP¨Ù+³b ÀÕ®»—ˆ1-Î^ÒÌ.I †Ø€öŒ5•š¦”|4¡Ë<äefðžñ†uB潓Ñ~õç?n}ëq‹*à㽇Ÿë!_þ_ý¿Åc·b"~B·ô¸|ÊžI~Ì„ƒFÍ‘[¢„DÈkDåjþЦCžài8ó¼úå‹}¯ÐŸž‹zþïõ%ó^ÿJ©´]iŠ7“€ê€‰÷=‘Š×ÞÜöú¼¸åxƒ½_ÁF·ˆÉ©j¢]6Ÿ¬)´Ûá ßVŠ…ûø¯ÿ®ž_¿oK‘þp%[Ò¯ÙšŸw;nÛù4ÝýÞ<¯þ¯ž7.på˜â°ÆÅÖ˜€DÑ ×Ò­GA®¹î~nè¿HÿyñõOb ˆCÕPDP%‡¸Ã…¤KήîÞƒÂѽk¯ÏB‹Cw¼'yŸuz3ÓIáÞ$Á5(ŠŒ—ˆ”Êtù½ÇÒ\7jŠÉÑÛ>n‘sJlìö}J×­<>;2œåò´WJÞàYʇuŸn;šˆ,öe@n<ë}M7×±b1|ñÙÁ÷òanYîßêoÚ|·n7nóWŸ6þqú£Æ™Y“„Ã"ãZÄÀ,Oÿí~3¹Ñ8ÿfY@ÙdLdZ² 7좕kk”Åë"t½Àj&Ü—ZK½â Ÿåõ9 Lp F]ô ŠÖóy½_‹÷”÷»ãøÞëMÊñ„×ú¢oàG´I¥ðS"LZ.åƒMÞ¯m{~.6g0‹G“ǘí£W :wƒ<")4JÈ,(gçÈÀ>} ¡êšâ6 ”“MPðäHˆJ[DqU0îõëß.X|*²`×": ”lCÕŒwùOöw{6ìÀ3Œô…_›3…¢î¦”`º Ï%çбí<Ïšôüsãòo}åûøèÕÂ?…V©tNGvUêõ  Ä@W¢%bbžTM‚ð‰å‚oÐ¥€¤w†cŒ‰ê@{o*K'«A²cMŠ–Ó0Í ÑïcжÄxásäÓì+ä qŠYØV¨÷溈u.:·&R0T£iª¢ÝÇÂú„d˜ Ž5ôh\N‚qðMÎGG×ÊÀ‚«ñSØN+â Eºøø4@ŠŽÀÄ8.¦r ]Ȩ!¥ˆtÖe2¬@š$JaÚL,gäÄÿ¤¯þáÙt§T_𡧏™jÝGN%ÄF¤ÃUØŠs°Q­Rö…@q‘a#/΢èªèùQ{ƒdôt§¤¯—åJ—GUÅñ­=UÅ/ÈÂ~‘ÎK(°k¼X?‡z-Lé•î}žäC´ÁTÀVà¡ÿt?H½½^?øºÓé˜<<úoœÏóëÇwÃÓ÷úÍÍG"„v] X!AŠzéØû¨Uu7}¾ñHÌ)B ‘YŒf^ËȾ_LÜuXÓ²0Ôn9×× ú…=¸Tº*"oRXrdµ?`'~`W:®ôøÃzûåÙ÷ø:»æ‘|ñÑ©­Õ×|ïg?L&Ò¹ßâ&¹>^¿îã*ýÆþØõáóÁ¹(Å•}9º?â2üø‰‚êýöýøý¼ÒçÔ9PÎâÙŸ&¿¾Ç¾Æ×ÕÄž/„Œ¾6ýd\Îiж¶<ÐIõ”!s!2TƘÈâ\dŽ…—‰3bH!ÎÕIÍØVRŠËØÛCüÛ˜¸cÉ@váeåurˆÞ#¹"ONÔ¦j4>Õ›òÅÉ]'ŒÏCo'T Ž…’Z,ìUO–z7]¤Ó>ÖpÀeºh½9¦qÖ:¯ÁÏ—ï,_1 8‹ ¶ˆ¶:yìÖ@‚û3ƒÉTÖhI¢A*"EßêX¯&¡n¶Ø/_èáêlXÀÖ`ÇóÉåD»ƒŽ Ød1#ÒkS\Å𵥩²ótáxÕçvLÏvÁ9‰Cütûqè×K¤Ø­RTž!ãè”jǃ¤DN‰‘áÂ\ñþ Õ àhéÅâk›žöЋø?Y¦j÷F«ŠOÕ^x"=¶~¡ýWýö×÷ã¿Tx¾?äxჩ@¾]žs‚efëï&?wš«ˆôSÆ_ዼÆÈ{†`ˆc²Em® 9$ r¾2üsøoUÇÂÄ\³|*a&‚ª0˜•¢ííE`ŽéoîýIÖ°Z¨JȲ’‡²-e°6—”\11a¬Nüæ|è ñ(:Qó2Ù1˜`!³ÐS>r[üäZæBÚP #©¸Ê¾ñÊfs6[P­XSwðe±!%KHC4Á¸Þ°Går‡i IIé {(2î2˜ØÇã !ÙnhŠÞ  ^S[dËçÎU¡÷p=0˜ÁL+ŠËNÉ-MWkCòÅBÀ‚«Z½ó–Ê¥r/úy¹+͘ÍÌK®÷d‰ž.õÊÎ㼋ÃërbÆ2@H…€‘hMJ„ý¬ÞÃÜ¿Ò?5:^}áÇS‡MÝë ÷W”raÛ°8½KÝCm³RayöÂï.6uѸS)­ˆLCCœƒi,©•sŸsÜb¬ÍÖ®/ècî·/é̳њÈá\s:=`/1y„ÛD.y»J¸¯áÝɯºØ Zœ:3u^b-GˆªJ)VFDbopz¡Ì"±¤= Áå~?û †›¿žJ÷Qî÷3ƒt°©5qÊ@»ÁyÍg~„S»¢7C#m¥°"¹ýøMí—ÖÈ”b!U W©ñ7pîþ-æ^d"-Öpõ¨3ÓJ?WI=ûŠá¯@Ëy+.âáÑÀWêeVLj á+WQ¯¢Yéª×Ö¶t–ÕÝ]æÑüõ—ýÊ–×ïïpwÝŽiä\8ÛÉ-6âB_'<ËåsÑO˶÷ñæt¹ó;wçcö.?Ùœ }f5ÇÁÉæ'~_ó9v‘f•3¦1=YŽW#£1´Àªu–3öæêFbmÞÄýuô™Ó¹x´ F†|uʵ4Äs>@G‹nò­hmªk}Ü·ž¼Þf0盫·òÃ#Øä:n›_U5ÊWý®µ“uÁö Wá€É+¢Dè˜2Na¨òìuL}N=áÖ—Ø_ì,8„;àäÖ1 FâW…Ø4(ü Ûó¶½S¨œuÕJÿ"#“Q>‘N1d«q!Á h¥œphâùj„Ù&çHdZ<˜•Äc(2mY[ûOžšš'<«]g—qկؗ¹ œ4BÕ`m!+Oµ5Å^Hí“´"+, ¾ ‡+¦ ,uŸ @N8nµ³dñ­g·tWØ̃^I·›AËÉ®€aØ9T©ÎX\ãÅ@„lÕZÑ2ÖyÞøY¾ñ³”ê£.DF™ ÆácL½ýó#”ᇡ§Þ¿k ª jF-g>OQë‚VGÅ“{ícŸE­Gþ¿ýk&ù½“'RÑ|æ³ú¹¨›`¼¶]Û‰†V·¼6ïr8 }[dLv¸ÊrdjÙoÅRX"AÆéêy©//)n–³6ý½¶dž>)°‹þ¨3&G¦Kn…tÔ¶„=øP±G¼(Pº¢ÏÕ`%òXnŒ?R­9+mÿHk07yÁ´€òÚÉE’«ÙÂeU]Ù_ùƒ{&6¯m“mà6¦Íºô…ÛooËåAëïÛŸúoE¥tDá;B@‡†‡xïà…¸·â[bD_…‚5£Z)ök]y-PR5( N›àE®>íSs˜a]VÌ=¥Û²ÛÎ2×( )⣃&+ÎïZ™!Äv±5‡E 5nª·Aà§e¬·s"‚zPf0‰ãWþÛÿèþ÷láîþi¿~ÛçJ%úG~ÞÒßÿë+ÿ/cóšÿ§¯^ô¿1c¾p5X³Ê  °ÚDUT°Þ·ùçŸ|ÿmAíùoÖ(4Žk0/ß(°X 6Ƨè!,¶žaSÖcÎñîj&> ¢ì-pp3ÚsšEð˪Ã-MbèHU‹Ñ•ÙI‡zŠ©í"ÒtŒлœµëõÑÔky|j¿–yë>þú$ϯÎ1ú ½ä¹åÙœr]ñ}‡ž~æ4mQ,…mÛvK$6C„¬Ë °R®¢zÚ‘ BÆ}7?HW”!L"éjGXÇ,7¤Žvýë6Ù#'äö¹-Ëâ©mj–nï¼zÍÒ}x<ëÇžïõÙ1ºŠt¯I·æäh¼7ü)êoæO!k¸¥Û/7¯-&‹[jÈ1bdƒÐtußÏŒ«ƒ‹‚b¥D5ÞMJ¨%º¿µCmvžz-ðÁ&ô̶~íë¯\Ÿç[€n¯uÞ²{“æÔ¾xã]Ÿ½pöõ†¼ûÌ)t¹×ù<›ÀòW6ì[’BaÞ£ùýrw`ëúä´Ç[­¤=ÕÌ`˜‘op̤HÖ®*…Ò=ÑHj1è‹L5ý¤‡5c¿™³FD`è]¥hdß{u•¯ÇõåLßè;ÝéÁBOšÃÍÉŠc(+.P™ %:¹±\-%²³›•#×Z|䌈\![Ïëp~Ï÷ǯ´·k§U߀7°PlÜb\1Å$X0­äB&š‚n­MÆd·Ú=],îZÑÙ«±ª…ç %…¦•í‹ì1à`} Ófzù‹ZxvqCøªÑ¨6ã¾Z~Fê]ÝY}щKŸe’jº@gÞ•Naºø9=¼Ï/!ÇþÐ-}ΗÇC´¹2àMâMsÅv»³¯óeSŽUÝœ $ÆþÞÖÿh-¢ÇýÆ@nÚ_…6„Ž€÷›9,=ëöO0y„ú\~ãÔ¨okÂ\!ë=Žá…G›yß½¶öv­KA"KziîŒüÓþˆE¡£C!cÛÙŽ9ŒO&–ÈIò àRõe¸aHA™åÚ<‡·qåuv¸»½'¹N aò®Øæ¤®Ï {ˆñ™D[Eô9ûw”aï`ų Åc öèÞå¸Í“ÛÓD?®Ðó+qHü¸at=:‡›ÜO]W­{l ¼Í†øt%0‚!ŒÒËö§9žl©Ÿô‹9éú–˜È‰è6ŪÞÑGZÍ¥¹WÏŒ¿2ã/ À |â~Bébàðrà쯜G˜4‡‰iÒ°ÈaÀ®pŽ&†sí;7ã†kŸ¨Vr{h¤tNÞeL|#üagY9½o7£Û{»þò¿ròˆÊéuâÙG[ÝO:É~ÕÝ£U¿0 ‰Ü¬éÓÓ!ƒ© ¹jX^ïa<ýÅ¿ö§~Œ¶}hµ‚GŸêwÖƒ¿q¨GÃn0\K{ùø‡ÄßZï­šaÿxî¼Xs;,°¶2õùðö–ý#ŸzŽÞJcE—ʲõjt¹“\ž7dQ8YBδ Nï,ÍŠì:ÆAt!J>,ò–;µ•6\{Gg^9ÓdâQ®òò@9¯+?`°Îüó¡£g;XíÎríïùÖ箿Жú±)¾ >’dsXfN;¯=_û:o·ö׃]Á7^¯»¥Í.ȶ˨Ž.Pí4ö°8– ÞÇ“Ïc›£S‡¹?Xžj|*•›Hs3?EôÛ \šä°âqÎà¼qhÛÎÌ«òÒºŠe™Ó–f¨C‡Gô^”ÅÕô2MU÷ÚÓººÚôJŠ5)OÁÐÜ١ª^y£¶âh&ç í ó¬¯-Z‚Û lUé”a‹jü‚d‡=OÓÛ  h ã‚õ"<ÍøáÄ®Eßm|$ ‰'ßÍK5ªô¾² 2íXHÇ4µ•k´«FÚ dé6킉!gé@€rÈîšK®Ñ˜„]uUD§:ƒqÁIK/0K&G„’C÷œ}‘Ÿ|x ô?>ýÐ+ÙªÆ>ZÉÎ!¹b<Íä¾6:e­#ÖêH—§ã)h4¢gSë ƒjb¼- riÒŸÌ!Û•±‰jR“ T¼ÆŽ¦—E·<Ƴ.N Gk¦±ûðª" Ù6Ô…0A 46 2›-†H“`ˆ¾ ú®~îŸë€òãK GÔn.(ÏÜú0&‹6é¤"8ÑÎh‡¤ghBkb*Ž1à·1M¶Édh‚ÜßJø¾ÁìvÌM®÷ù ¨Aϯš<9{Z»ÎóêÎþ«ç~Z±ñŠá.~QÔ³õ»íóK—Œôþ€¡*RWÝÊŸÿo/ÿºýì—@Ê%Öœ÷ή{ùÆ…Åö]ô-ÆjC­’@Mx]n…Ã] ß4mø\äõ h&ëïÖS86)ˆ›XшYZ 7 ^ ÕTB¤`”VWÛc\½¶˜QŸugÖQ½Y;ýŒ‚d–É v}R»ïÅâ¿÷^ÿú¡¯7—þ¾pf‘Ö쬚-”5­ý¹99löLV12«w„Ö¯—:ßÌtUÖTÝjý:·=>Çùñ<–Ïç?Õç·7E3b åõŸ]÷û˜Ž>LýGìCñ]ŸîÔÏŸÙÒDe¤½vŽ¢A5–Œ¥2%4xHC(W!I åvÄPZØ}‡JÐk “»ÿéÿµ¾ø?qø»'.§Ì„¿\gq¾úI‚Ÿ7{v’a¿jÖ* •›÷¾Q(¬[éÏÝæá…ÿ³Þ_™7±Å­Y£“5zñ•“ÐÐ¥G÷yBÁ•Ò3 šõféÞÏH¹k8˜ÓŽhKØ‚XùsÞ'û|i®ºýats,a{P“ª  š‘Eœ¼w»×Ž®„e Jg¢±/Ô5|ñDÝÊV“&Á±Î‹Ùï¹<;…[öË\Ô¹æï¶Ê¹âàS¥ïyëüz0&‡¥òa=\YhL9 wG’)7\;ßÈ™ÎøL’KÐ8p?}ygQ‡h—]8¹g"4Q^)å/lW&‡…Ý}ð\hPj’ˆí8ïdzßëŸ,»3,ýþÁÑ<.’}òç¿Ä•¢FUäØ9K?kyb¸˜ˆ,‚‹O5KéàÕRŨ’ë¶uÆhK© ݵmßÇ^XŃRWꊕÉWGVè<Ë9®ý,ç«,áþX—ѰѳàýQÖ¦h.ið)«!—°)IøÁ¹QÜÃZ©Ô)àËaM³ŠŸn%N•¹.!*Wö/öÛ:°ÄÑLÏŠ Ó€L5ë¿×~˜9;`^Õ±í}#¯O²ßËÛ+­Þ¬éƒc#G).ê5Î,ÂDez·ÛÒù°u0º§u• æc-›!P$×ÓĦZ £2ZŒ â ¢¹ñÑÁš”à*wÎCT«ïœÔÅçdÚ§³¯’¥"Ø8Õp Ô†!‘¡­t<-¾ °%ÆÉhËߍо<:¦)¹‚nË#¤o*ýðƒí6«dÚ:Ü΋Õ0ϰŒSø¡jÝ„¬¬:ËÞÓÝ Jç¢j?‹O&žN\UÙzü1FÁlÇK$TPùîïèõÇ}7ëahÝ6k“G{Þ½Lþ}öU„KË£f[ªP0Z ½Z`tÔÛ„ûW¯ëÇ+Ÿ/Û«v%`V%UEKÔ8Ç ¨X Ó¾¹ç™óiëc^óþ”¯Ïó¹Á·ÛÓÃ3šZ{3ê󓵦¦Z4EY²6ÇÎöf;ôÞ_¯J1B´__ü±£ ctVß1‡ ª»Úâô2ÛèIŸ™È4]CD1ÊæeCf‘†Ë­$L–O[ý©íýl¦¦uŠ2¶33FÛKKå¸L“@3úŒŽ£ß“ê¾ÏXèI÷äE¬Òþ´Ït2UaT·QI_Óî'ÈßÉ*²@ÜÌŸ¸y­šYå¸CM×S¬Â[ÈJAXˆ©šÈ'VXsv­š3Á6RÅ\;“¤ì0ªδ6¡£yiE®¡ +T Q€)ħØãàð#²âk ·á­Œ\4”8¡ÕÊ=¯˜ ÙAl‘&4àë")&ÂÚʹ8s$G²w½UÇ®ö÷¤›÷··ƒœ¦×”JýŒÇË|ˆ#§ä¾Û° §Â3ñ3 ä—ô—Ý“H<€‚•ÿÈ*P¡mEÔõTÈ| V¼i¯OèjáÎ>r¬Õ†•øÎ  „+B>Jw­»FžœeÑTy!¥P{QÉ!lMѺÜ'{(2'ˆ£¥ˆÄ©#2Ò·P<‡nÓ#ûÄDd°¬%·ÒÛÿxç¹›Ìß>¾-OLÇ_¿ñª£ÿßùþMDZ³ÞB|  ,M¢(¿:ö_Îæïû©"ˆT4ÂÚ+ÀZl›IÝ;Π$“Ho箫™Ì ¢Å8œÍSÖ*¨¼ºj/½VqŽèÁgq^ãÔâ€EpÑÊãrŽ&ÍxáìÞ¶ £ &&ƒ{?”ñ^×Q˜:ÈéeªÌU×ÎÉÑKüê½W×»Šübž7•¡+Ãfû” µ®båé~[UªJÁ[¼+Àt*åµ,7`ÏÓHËܽª¨êyPBx7Ò©Õz$«`Áxê+çþå4"öý{½ðµåq›;@¡³®bíIÇ>õS·ööc›¯^‡(¡©ò(*­W•ÿÛÿ;ZNþ÷M·Õ°¾8ã.CA©NjU#îÎêPã[ëãTqfXçiÜ€b/Šëáy öÊkåãh½Îó÷rmSÞºÍ7ÇWÜ‹«¿£N²éÈa§YeuÆcÙ ¥Š±š~†{Gj¨Û̳ŽK´…Yq?Ûì>ïÌ„­÷YOß|±õÆë÷>?€á¿þ|w<Ö F! êµ'ƒ›ªAAÁ^Ћ„huC?œµ¤›U¡®84&mŒG=:¿Üý—‹¿ü•r3EfßìÂÖ5Üñ¨ÝÄJè›ÃmÞЬEüð,à-ú¦6Š<+µ–<Ëxj°W!Þ<ÁïnWžŸ/:ƒ~ /ûBTO³žÀ­!&Џã˜Á”¢×Õ»Ð޶ȦRë­‰îXÀ¡¼ ß17÷§×{Ïqí(üiÔ 8ˆ€Á`쉫ìFi4ªN¯Â¡eâö·µF…{Zoé‘¿'ö94µ ©ª-®çŸbUç ‚ƒÛ5L’ÚqOÍ3‹„›’öAÃGym•ê§1»•*C_}“áÚò§»ñ‡½'òKÁÁ÷sûvíw¯}¯XœíRX—U>$X½ŸÏOŸ¬ˆË@¾niÅá¬ÐgaGSÿŸàênÉç¯C¨ª^ò¦ñk¨å,ÔZ\3å Ê6!ztlÉÞÜb|Žn\ÍÌö&ÖÌï‹yyÜXÁƒ¾á®Ë/Ü]øMÎŽk3ö>!pØ%-hæ4926!\},î£}0Š R!ˆÌ\˜Sîe¢Å]yP£ÿ¤cëï¾mç_Ž+<Ñ 6ÕY+Sð7]2\ªˆ¾1ÄK*0ð }sT%²`¼paüÖÒú ˜ËjaTÞ'(ç„"i@Ô¡Ñ¢”è+°¹)›Z/ ,¡ŽC®CÙ„”®gF™Ý¢ÒÕU‡®Àµ>M€‚úÎ:'sFžYžÓƒ5߈«{ßï­níjÐ?Ïë ÊJ <Ÿµ\´‹ö®ôìã>X ¹”—²Q³Í¾ÍƤè)’"²-uŠ¶ÂŒ­ßŸ¾A²Æ n™3%5Ãä%õ=X×ïÕŠ.FÎ æi:JL­q…%ÆŒaÓÑÀŠÇϱ­jÌ] o옩׊§ÍA{ÐÚ®õœËÛæ­è€äYôéwÁÑ]ÿPç¯Ä®)Ë…§œIÕ¿«¹® FÀÑûKÆ{ø–ê•riÕoÒrv}dˆ™iRØP"Т°„ÃÇᵤȥË‘@Û×þü{ßꉓ~'W'e“¼Dúî.]‹+Š—^æ¼<W›·z®¯/’ãy·&ã8C6ÄrØ „Óì£ßŸ¾h¬×ìµ\m+^®±Z^ÕðT ,TËÓ£Æ%­… ˜ ð8æ“Uì s¨‡ÇÍsAk‚Œ»hcyäN L±iø+Ü:xjƒ+ +éºäã XØ‘ßTw«oxšÐA›TV‰ dÔå¦2çÀ7á£5–c>Iéäžæ1½j$J 8’QE ­4«÷rɲ%¡÷^çÓŠJËØ+ªXóJ¾°êJ»¯ÌŠT”âá4Óoq·Nž¹í´™°ôÌh…âV>Ö1b˜)Û®¿ê™öþðã?`Dçfó—ŸõTJ¾û$?Ö³¢VÿYðO§ñC˜Õ†\GÁ­¨%wñs…ï÷2[Y0!²DMŒÈî–s± L±¶ˆT2àE‹RùŽŽâ¬7Ίù§XöÞ°èbV3[¢™p=ça-h¿žÐT•Ž2»_DðvxóB‚HªÛÐq˜üeYÓ#;±_DÍ |¤Œ½º«ž­Ä˜® ¤*\µXøPŽzœ—zúÔ&¶âØzx-¬äRqT9ñR3°‰¼ˆÌäƒ\•G¹k ÌÊ0&‰0±VZh7ÔÒé" ¾ðó7¾tJÒƒª¨‹dá|…7ëÊE…Â20·~¡2úÓzâñ”i]O¤þ'ú‘§ÎàÒ‡%ûÃo¬ÌèÈX‰?¬¾YrÊ‘‚¹ÔuÞ8~9«œ;qr—9)B³HãÂ2ª&”“‘Ïúþ²ú`Šú±´òÉ0b™Ó¢ècòTnFÇb²PUNID†ÜÚìÙ:2㈊ÑßaŒ3ÉÊ'ç!úÝ7Ó°¶²c¬ÈÁ ’"‘0­>¿ñAœCdA~ŸLh–Q4 Ñ’¶•\”ÂG,7.ÂRÛx‚€‚ˆ ÞÖÕsÁ£¥NçX©ë2r*^ÿdçØí9ÑHEÐ liŒÄœ9b’ªMÑâÈœóÚëé~Ç̬BeƒVÇ‚f]#€•$öV#Q®™ÐSß8VAïH ek¨ã @ v$Žlª•˜‘sÉg¿#ÃÐZÐ}8—3ï0ŒóàúMÎb«Áæ·9ÿˆÞù4ð¹c‚Gøèæ®èPŸÚÛÏ «m]©ëô’ÿÈÃ?.9` Rq_ó€-Ì£÷qÅÏ%PJΫ%óô¢4ûÎ"ÞÅ_·;¦€1ÓEÁÒ=`ƒ7Ý‚P­Ê©ž~EÌ@K×õ·ž í “À>_÷ž>­]*lˆÊ—?âªêïT 7uòÔ^©´ FÕ£®û´(¦‰q’GiüM>Êüðb)­6Â¹Ì zÎ÷7ehû´SˆË:PÌ{ ïPKJŠ{†ò™ÒÃsB I6B« z‚¿V þgïþ—Äøsž¯ÏgÞyÁ×kwhÓýË‹ûV¬0¨ífÙ(2 ì —å¢o@ LdL1­ uäÈ@.)ÆçU`g³éG¦£–θ÷ZÏ‘ómÙyºo»ßÙÿuÝ58¯€7èQ8pæŽbÁÊ<É CŽË8~Wúìì"m¯nJ“p´-[&ÀaòV?~?þc¼­_O]÷\ÂãòÓé©$ùAø¢Ý¶ Óy|Põ© Ú(0/çÊTÉ ‚jC$ô¥ºÂ]]pPÌ,EämÊË3[ÝáÓrœRP_ù±Ü½«ÀoÑ‘°˜.Æ-ÜzñåW¿VtÇZÛlÍÃ&òö\ÝnTfTÏl«_ÆâЉîI’8Cvÿ·²ÿn«¿÷ò®=Q_wúë¸ÆŸ3 ©ÔœjˆM…ïJù|Š«m + ÀLÍz3“ôW÷Ÿ•Î+ÞÆ¿Ø×ƒÔ}÷+áTVÞ©~zøÖèòÀUvÝ+l oúïx°[k6éŒhüK *¯‡‡aʾš[ÆÈééû}‰¤®q–ýïýÄ:Ñ5|mVŸ³|lz¡ƒ E’s 1|B2¤ƒ¡ül)†?\:Ûð騽þ°õ¸1Ô»k$5*þxÃ>àþ‹%-j-àä¾ã}û<*4°ÁÇXм¡‘ÎŽ³¸©ðD(EFÊã æUùýœ¿ôà$'·;tG%¥°bæÝY^84}î?y昡ÃÌüÈÙÆÈǾdN:5=PJŽ’òìúC–êúÔн¼~'èNJ¾ìàÇz¤ç‹Ça¿Eh¡\ƒlRUzî·¿÷d®å(§sº.ê»í—ùŸLËð«wÜømT7±kdVÎî Œ©–z”ó>Pv¹-¿°¯TuÇsíhðÚ˜œÃyõ’o3¤Ð¬“b: Æ;ѺËäx’ãS΋ðŒv$dÍÚÃno©H(œDâD÷ÈõYܶ:—‰Î0ˆ‚~$-¯ôY(b³6ŽGõ¼ê³°Ýœzºr5·QLÅ€O#ºÍÕÚ»É|²Ÿ ùªÃF÷$PšÓ ‚ à\P›½ \½ó~ÿñç'×o$8_YXžÛ™·#ëCË–"s¿ŠÞydDw +hû¸Wm©F5™Æ¬¦ûY{\ÎeÞ-Ú©Ö½Ò>ªª\rŽTZÇ8+‹ (©ÎŠEÊÜþVÔÐa´²môPª–Ù8ú8"¼)uŒÕ(Kѽ5Ïc»°VM ‘ é:‚“€8ŠEiyô‚EK²×/ Ñǰ@Ùtñøö=ûyÏyÝÊšaäZ¥í&[c)‚!¨¥Ð¨mFCÁï0×3…áï}u¦€tBJÖ+i2‹&d¤‰"•p²\ÂiŠfÐîŠùÈ;ÆŽÄÉ™oá€^ÚO¸™d1e‰,DÇòò!0KÒ!ÔFjÛž .¾)T¼_<>ý½ëŠG»>c2Ù^z¸‚4ç}–Ó.HZD'òY‹Lú,d“âÕöý¾¢¯üš‡˜îÚ•é)Ôô“ÝÞ«à:–‚$E~@°—;´žôÑwÐ#©K¹$PƧǴ–lHЭë{]2žÐ° /Òu~ÒªJ¡X6Ó°wÃnÀúQ¤GÃÔfdÓ¸&ŽžÒÀ¦8á`©7ƒ]q—ÈŽ] …XÊHdHe£äF}«ÜÕŠýÏ! ¬ì}øâ~Ÿˆg¡Û[ZØüµ¯|‡Þ»±)¿üÜìÇb¯Î»ý‘vÓþN‘Ç…Qyxl}XçÂsjJÝ=K•G»"ó¦ÆÁ Öù2IÁÝ^ؽ!}T.¼¯,9×ÄNÝJÁe¸d)‹M‚-þŠÃL%ubmDgq\Dçñ"NdA´àY\U8¡‘m¨©ø]\þY«òTVw~:”»æI5+ÊÚ u9ñÛp*á¸ÊxD”‹«“Õ¥°9šØ“q)½$k›«‰G?]“Ø¥`±¬Ž'rDœÐ¾¤ˆV£Œ¦¹G"¦Bé㪠†>zäSø·Ô'EeßÅÞ$×u݃¼TJžùʰ^½Œ÷Äç‹íä´ø««†$:H_TVþ³¥Øýëƒ_÷?œ÷iû¯+ŒUô9¶_¼ýž­{ﲇƒo<\·eÚ#ÿD³,¾ü…`õN'#Ç(JX¥)%Ë’Yñ‘ÀK¡ ˜£"ôCü>Ñookï ¦ýKÅ&1— Ê=slZ¡{R$ýn7ípÈ‘9$2)†cÔDÍñKTX´*Ñ/ãÈãL-÷ÔjÜéÝ—ó—‹<ÌGþÀ€…±û¸Û PXXw\¶ë»’Yž Û+gY(É‚Ï?ÿã…ï­ÿ?¡kž·ZZd\¥²ªb”YRœžëÍgOç®d©œªFU^±ò6 ,…ÐJ|8]Öbv±0Úq‚=Þ—^î\š…‹Äª nQqiì4²UV«¨”°IÎûÛpøzÒȬÈákÙʽâãGfRˆâ¼=Õ5[vc^*p±Î’X¼šQeMÀ\ôux×­ä*_»Ì_öó,i^—#ãu†§bž5÷‘ê¤h_®è­NWñ\bÜu-í¹ eü²÷éhwª€Y|ª©¥Št!ðˆ¼Íp†‚RoF«q Ë9íG°;7›k¥ÓP8J®¢ÆùLXΞχ °Z¡÷ý”¹Úõ¾½çó)„¡µ9Î$ãLñõ뺨£zúÒ¸‚ ¥!Uþ3ƺJC‰ ½¹œ¡'Tx[i³ðŠãÚpGÑ5-ç"1lû{>ðBücç0>áÏÕ7zW"È8ˆ""¤°$/#åi¬‡$:Gb¯rÀWý#ÕŸ¥?éÑþ4ý” ¾BÊs(u÷þØ´ys©õ*¯ðæÎÛ{}'|¿K´NÎJúÚͦn: Òåxs®ñ¶§Aï¾hw¿|ã=µüåE¯xÿ¾|©~~Ö°wó¸×²‡ IKî˽jçÞj“~¾WÙ;ÙèV8Ô|äyB´çUtZú Þb®Ù¥"5"O¤ hRsˆ µ õ¹@£ç)ý¶¨ŠÇEö¹ž3lXbµôÚ^×˨Õ-VëhB Æêjî:®EmZ´½Üç'>*Wçf?ÇgŸ[§Õ ¼ù`¦ÌµXÀHVÍ-È8\h³¸¯5üÙ˜$úàÿ yE²¥ä‰¨xq,h‰Jm[4ÀÊØíŠóER˜™ßo¸c­Ø¢6$ õ‚š0ã¦^¤`=n||ˆ¬Ú[-T'ÖnôÅ›éô˜ EúòL¹XL]N¬~\×–@4ƒ¬*AytŒVñ›ñîµûhc­ ´Q(B›ÊíØåR’=[Ò>ª¯†"û³ÔߥG°yiÉg¾kîu¨:ˆ-¹HxÅM¼*W£Ã»(‘:àüƽ›Î;çØ ÃhˆeKÛÜ )˶á1ÍÇûèîš‹‚â€^k¹Æ †;'ë>P'>c±Úðkèˆæ”ŒÚ}/åo}8²£k2«%Ñp¤E}Â¼Þ Å‘ 9¥q ‹f1'RÏQÞj ôeHiP…:”Œ4zÎ4¥#¯™$³ƒ†,ËNl"‰˜ Óð b^ðŠß9 ¿ù^`Õ‘ uæ¦.FÒlèO*X,–[{_`¯ 6Î(Ï~ºüpµöêç¾eôwx“ÍIÕ«†;#™À‰@Là:Í© û˜qewNEh“þžÎ*»)A ^Á$vذ\(×E§AûlV»¡˜¯'y7ûýõäwÞWûý’ëòRùuà·BþS”ê:¢ÀBÁÔ Å—ô9W‹.b›Jvæ’Õ¤ïÇÕDˆÑ©×¨Òõ}¶§á|Ov¼V£øý@§Xå;v§ð.|Og•!Ç¢~²¹§Û‡\žàÙ’Ý]ü„Å—pXFj„_/—QÀý€|¤¾Ð?¡o•CÆÚ¿|<浫›Wº^Í¡~«~’ =¼cG2dF¢iï6€V¢’ÕH…Š~J‡l,e¯Àƒ¾–yb|C(3mn™÷²WV—?‚ÿnß×[&9ïûG“7Nˆ¥kަ!‚> zKcE~tw6ô¨7¾1¥¥˜á ÁÌUøfÇéŽþÒ%ùÀ6-——^—ã?þÔÿÙ]§·%sÕETÖ@œ© ‘éá°¨ŠÐáVtË ¸Þ÷»ô—bn=A®\Š4¥’¥%g1ìÃ~¼¦‹R« ÓPShN6RüÖœºî÷ʯ`¶råÁ2㙎 dá3¯^´êqæöœ±80ª”-ºq?íÐ& ÂJa,†©âï¯âïÊûÆ—þ²÷74{ M ›QŽýŒPTËsX«Û}M9í šçö·]‡£ KGwôªp$¼5]ž·4t ÚÖzí,½Â>Ei{Ë3kÅÿçïN«&{Ÿç¾ ÷†O,CöÁ~&8LXîšNx«O÷‘³x…]½ÇMi ¶[´]•Ÿ'=¥¾¶™”wß\U¨º&‘h4Øgܽu@ÑPOÞY•La¢ÎvŠL®pGúÚCçxìbùÈ>"÷êß)îÆFZØi.o,ëzß1Cy—¨)÷cO{ Ê R»³YxœñyÑOµOC5‡6/¦ÆÆŸr§š¶â³ív‡_~öp™5Vo\Ùª·o«û°Ü@ÍÝ»šÝ\lb+›XC00[n~×,=5ĶŒ†<î ñu91¾sÈ!>Üú¿ï§.y±› ¥ôê"/¨„-Ùp,¡dGÁø*epä©èj/¹úb{{}0¼Il~ÇÛ0‡Õè_^êvŒƒY»y>ÏóíOÿÊŒCzÛžÛÇÛñ¸ûkÿvüÖwðùk¿'ßú8ÊEO×O?©ûj§~Ÿ¿zñÿùöÿáðá.À·ÛÏø›?õoì×=úMÖœn£ÁÍo‘b½tÑÿ ïV¼Ð/ˆ]A7ô˜ÃÅ᯽/®ÿ™Úï~´ßåpÔ&Ù „2Àb¼M¼”r{…¬n4L´ä#c¯üIÛ‚ ffk¹þ:ÕYŸÓm(«îë<[E*(¾Þi³¬{ Hƒ`œocê]ÎÉqßC•vôÖ¾;'°4»¬³öpë5ê WZ6ƒ|tøë³óÚhÏm¤÷±óåüÁçsa§z#0gù fñ×-¸Îõ7]¡:|±n:Î,=±FñyP˜cí4'´Ÿc|¥gû îqÅD;‘µ¡»‡ž)×EÊ¡,Ý”J©§J¨HŽ²ÐØé)Û/‘Jå06bª;˜¤e%j‚èŒTº#çénC@«’ û0x0†yÒ’««qñyö9zÙ·”Yp5z"êÅÍ—™ÛqïújÝïKï$ú.ý÷_MØuT61fúÕlöùð ‘{¡¨kfE÷‚²ÐZûÖ¼«Ïò. ›KyM#˜¸4‡Y(J¡”D(ŽÒÛ´Q4 Íy¡*;ŽÊ¢Ð+¯«š ÓªN°†¨d~¦¾DœãŠRÐumœ^ 7µ“M‹ò8¹gï—w?˜=Ø²Ó ‚jÒš}9PªçýÚÝ _¼^¥Ç¡ré¬k€¬Ú±Ù 0·RÑ['QëÒ„cùçFåXǧ2ê?»®AŠ˜žo/žå‘j©&z<üø5—â̾þp×K¾PX?=In0ŸjÐhc–¼gÌMØXB½–÷ÃéÈjJc uSÑh­< È fÏ™< E(Xfpm®µñƒSË]ÚçæU<08 ʽʑ™X )GS•å傸²4Ò°Žå'~åï w_ýqØ?/õ·sõ¿¼¹¦Q¨çòí×õsKøAÕÙzÞñ¶Ôá®&€>מÝ6[df[¹M›]G›“:ëÑŒü{ÚuÕ£óž&n 33»§a¢º³™‹V]¸‘¢Ó‰ïãÒ£sOru¸þ–)Â0ü[!oþfø:Ámíé,£ç«U‡ºÎ£OøÊ¯ ÿk»ÀÕ›(îxFþÕ íO„VšÒSµëŒ®‘iW޵mª+ƒ%ÜäG3Æëik×­Ë—r?«ˆÎ/B+…ynÿÖš§Ü²Ø§B€ µöç‚­ÍÎW}n’éîÌ–ÍâNM+ýÚäŬ{ó¶5žÔäK€ŸìÍyªzµ*¸|u½v†Eî ¢<ÌõÊƒï ¶4¯ßñoŸ_gãl…¿ð“^¨Ž¥¹š™Jè£6⪗H¬ñõ™b(/ÇTZ* rq6ÙnqþL3 ,ÌSÖ¸/_•WxÇ4ß Ûkþ,9D€éÌUô‘3»ã¼[?]?-wEJÓÐŽáví‚^²*¸âx¬LX£GÞWÒ¦_ôX<ø«ùœ¿FëÐÑôØË@Ëd—ÕǤ ƒì»ƒi'F¨²fæ¡–G…=½(0¼`q“^•¨„TàäÜçgß×Û.t&« ±.’0lMà‘¨<6ã ©gáÉa±ŸyÌ¥4e¡©š &Ö®½Þz;LZxp±pî[g–êYÎ 5Ûq–V[+Éì7pðÞ‰Qœéçm¨e†é 3/³?f+üͱ~ Œ•¼,áñPQTìhQ3Àթγù¾|‚>ÌÀÛÇ[+tñ$E™m'y|YÞB”óä9Z?}õ¢4ûk†}3ù™Ù7üÖ]#4W™yZ•‰”IpA­uUZÈâztü¯>™_3¨X‡Ã¨×Í–5n9NS¯Q1I¬Q@Â…zR_w)”b¤÷r¦öÈ}2k®#ð 8ŒÃ[÷ƒµÿÆõÂÈP€X/õ0}‚¾=áF~¿Ÿ_¹8ÓE ^ BHÅ¿GÿQ’-xφrDXñÐÞ*¦'?›=³â•Ë´ëzù‘Á¾ç'ÌX0nå}–$æšIÕ˜dTHb((hÇ`sG€ÄEèqvYgãÞ§¹ÀKÖå—Ù û›÷‡ôÙ”âYŒ[/ýù<0ü½òÍøû8´¯WH°«59Wðv o2'›sÁ9e0{¶FË3wJÅžQ"…Z L,“ƒÒË4œtàÉztÓ$õ¹€zd ‹ÜÉH¡1F(£ )ªŽ0 ê0“„Êþà]SpK´€bU0>¦ÙÖmˆ|¸}žqŸ'í„…°¦X0H ·¦i^ E;2e»†KÇš_ØÅ)£?;þào’ƒJ„3<± ¤‘&GLMð=ðn±1ÇDÜ",ê£ÓÊÌžê]ÜÁx¼ÊEEÂbŒÄn¯‹Ð]§†ÓʳÆ%Uº%I•)Nt9ò©˜r³nG¨ìœVN€2hHMYq°9“&¤ºÈZ¼{øÙÕ#bˆ’8PdXj)ØaùµSluÍ®ô˜VÜfýžïcûå8V—ïSâ‹:;ˆˆp1+r›rËà ãÑpO07cK£»€ªû­çbYÀ ›f°ÃuQ „Æ´t4(1&jæR$çÒŸ§SyM¢rÏjÀõèÏ@¨ ö¸Ÿùò”ÖÜ8kk® ë@™¸œ•tK$H*ãÙ#É@  +§¾¹ DB§©Û¯W,i­´#΀GÔ2 ŽxÜ"ùÝ…J»® æâDŽ7°GÒ9£Ã5q KELÑ¥¹¯ÚxptxþËâ*sÉ®j!G^êO6Îô+§Ò°R}8nÅ2®Ìæà—3,Æ£åu„ö|«j ¢'ÕPcËÆ²•Ÿþûý¢+ŒÂ;üAÝЂï¡#Lj!õj?//ÒÑÆ\£2E…ëúª¨ð#h¡6"¡¨„ªí³v[tfû“ñ—Õõg/÷r!vÚçsïu?V–¨þödå3Ó›é#¼‡çö%P%m?Ì öd—!콃‹d“GXá’–(½l1—£¶\m³6 :#³ÏÛ“;ͼ’ýw4ô´ûLõ¡ï¿-»õ_÷Öÿ´ÊÝøX*àbøMCçºàβf§v<äQ$¡öÃФ%És÷*hSU³+t¹çŽ»è§ó _Âîòê厌ãóaŽÉÐö*wÒª}‘þ¢·q™€¬\#5lûœùóyøzf#q4F‹BõVº¤_æà|8bnŸïЧ&}Óé?fg©])4­¯*{§½•´âÁQ– Ñà)s‰WäU ¥©0R&$ >ò¤,ÛK‰v¢BÅ ËDÿç¼u¯(,#E14—»ï®Z¥?¶õ§Oa÷Yö {ˆ<î_ù<óyÕz9xƒqj„¯RÓ%Cì]¶+kÕ­¤×ä *ÕÇËés mÃÁLzáF05¸ˆÂÛ-­ž5ºvˆ‡Äkì#}Z7ÖV^zõ‚ë}ï·øõCjòþÕôm¾OÈL?{xG~þ<ŸõW¿}Ø1ÞïZ±OxsÝz@(Š eõ)ËdyVhâxú6u-c®±FÑŽYIkB :ôC7Ñ;¯Ó|løHiÒÄxG,†ËÂÝ÷‡üBµKî¬ÒÑÔæ9ªÇÊÁÜ6yØP:¤3NO8K üú=°ÿBýeÀÿ Ħ¬™–•’·õx¯kÇ-„"mA@Ù‚šù8çÇ>šõ¹°DJ´"tórú˜‘èâžÒ©_Þ:õÚ©‚+ýNl2…ûÀT‰7G#}Ê‹võˆ0· rø(±½1T„ 'Á—>$^è@{8¥†¬[å3£¹¸sAÁÒ¥ÀÛš%謹°þ‡øê_ XÞw0RÅ|‰NÞ&îË©Ú]—{­k+h£:ܱÂ¥ ˆ0‡VÝû$îÒhr`ÊÔ„ÕGµ­ ÷¤56—Žj3rÛdn؉{æ£mÃÁBsðç1÷ÏÝÝ5h*pÒ‡}R) åµ£½ð:í Æ—Ç^Ìj‚™†ÑoÖÜh„µ¢£!Ç€–dÌNµí7\Ó`(Ùxi®äîm{wPG[.#Iº•Fäæ}ЮË1"8î¿Göá!lqÇ!5JñÊeC¾"ei¾°»rÕ}~}üúíKRèûOÄÓ$õè&’ÖVŽk¦Ì…ìJœÙ»o’K€ÇÌOím¦±ôÞÏ€J,aèð-Ñ9 ¹·üuqÉò–Cn”à5ˆ_±Ü: nìÝ×a¶é@õÓõÚºˆ5)á^œt<¹&¶G¸ùé©B`}ÌÔD}Óï½ZÐ#¦šO°f·c|ØÙè;1ûî¤M¿'\ý÷4?êÜVß.|zTF©Ûí€ tÏ™šØRY”ÖfÒ2ºé]t‡¤¹RhŒÀ˜û§¥¼Ýä……†›Ü¸Ò'wñB£ä‡ØCar²5‰ÕŠ¢™w•QYóô#?Õî.†û¼¶fáùŹÌz¹™€z©^Ë·[å©€j¢ïÅ«GsX`š5àÙtÄý&l»¤ñ„‘p³.§Àtƒ´A4×1åU àv›‹˜É}³«â>%™è @Ö¤˜5ùH×S”>ê~ä[»ßs+#PC{HB±b$²}‰ùˆsÌÒ³Ta¢,«>t ¨È{‚9ôŠ(ôž×ôA†Ã!W‹m°•×Ò÷ôŠRQü,åO!ž»ê%YlžÌ [ýêÒp_•?N÷8õ”)^ÀÔTF 4ì9íÉ ;9?uµÍ|lýÖGaÍó‹Ò$$×3LA×§ÄEe`Èa‘˜F92‚ä LZ¢œÐqvÄhðˆ¶À[Õ¹“9yС(|6R©¨œcbj’Ž‘=ém Ï„>pmE†çƆâý¨T7u\ çÏ4Ó¬$#v`Ò~R[’ʯôªÍùQÊÈ[Њîg·*âc/9¶$Åë˜6éŒãgòV?ÒK?8Kþ‘Ï·ú’ê&Jx_ûò{¼®¦-›PÊò@RThKáÂYŸ(Ë‹ªmÌ` Á%¬2+‘qn9JF驸½TüøÅϯmF ®GŽäa4R]N+µãN¯ï5ý¸£‘†ÉÞÌ­/ž?ÉÆ"–ê¼"t¬`ÆeOjsW Ø)Ö••ÇS׳®=‹ à KdÏT¢QTq ØJ%Æ$1”Óä†d‹óõD 9‚žŠ@PóçI¥Dãhc•Ï­•*®ÄÆ32N}ˆ¾3½týà‚÷—,7~Ž¡í}ACÔ_¹Î.Ôš˜°ä+3¡ÃpÅò“ì,^a ,M;¶9ò¯g<šëÀøþ:fZgÊ_èýé=ßo*Ÿ öö뙟"/ÐÛ÷«–ŽǕĕÈòd®bzÚO9OrÊñJð<: —£%Äí,H¯W<1fÚéø¼fsûm× ¾ÿªF®ÇHNº-ü:*§˜›H`Ø4¬*æè\ì®R¼_^²®«)Ñ/†‡Ä t'fðÈ6ÑPVñ%-à·×ÿÿïÅ×'•´¶ôi.€=G-Õƒ?”q&‘ì sr8zwú] áyà§mH@x ¼+¾XOšš…°V\&¬%p†…âéöÓxn"𮑫(ņ3´§© º=«i/H)úâ…ºiÖ5óÕ¶í7…W/•£Í`Ãä‚Ó#O{õ³§Ï§ëøúÞtìÀ3Š9¿¬Î&8ÌÂydŒM<p–Êa\à‰^Ç=.D‹¦¹ib$TÉ6,¨X !EZ5Òóº ŽÂ6u‘Ý¡ aÏIÔs,IÀ'`³¨«y”*÷.›§­¼Àh±½¿²ÊnQ-¦õmªËª4¼'ºˆ?K=Ÿ†áóe¾•¹RÇ8Òz´ÐéÄs㉠%­ži6¦céeÈcq ;²,vÃyX?® ”lž)ÓaÌ(—hS&ÕãPÏN¶éx  è‡Š$n”ÙPÏl+)_鼨#•ÿz`i\Á¦YŒEWó*‡>çÞ™Ï^¯» z2Õ\©û ÈÜup° ÈcO;þZ¼ ,'{›Á9`éñk¯H7ê¼¢UÂ+ê »êÖ%ÞNµ°va§¯sÈÈ´îfÇg‰5Œ4Å='å•À£0ôO¨”g Ú“7Â×7!«²ÿäö ¦%í0òÁµ^×v  G¬ŒFX¥âkH¶S«“RÂN密£ÆLìZ¶BaYG¸9íåꨡ÷ºv±M I¢% ;I›ª†•‘™#;¦ œºA©aH䤡—ñ¬ 4â)°Ç*·…k° WæÜeŒŠQF ¼nr•v/u¿ÜŒŠˆKbPq@âæëªm‰ˆµç³¿¶ÙËú°)›³ÂS[=§ ‰Ž+§È2 @yÆ«2ªêÈD*"Ô8²ÚØOæå2éÙRK+òYää”ÏxqO£ÒsûÑÁ„}›s_³OºÐÏ–A·³KÓ-9”t˜l+B’‚qÑ-{êˆæg²"fA…13Á¦HNŸ%jsv_ÚÙ½žäe.ä±0GÓl»æ·XÊ®ÌKbRu\Òç‘zÏoʹÔÙ ãc8uìGx6/g(DiH19IõX·ðxUûUšÈ…­}ĵ>µ`ShÃI`ÅPæ-(P·îÅßF ŸÐ`oà€*Y46kj3l¨".u¡ÄÆÂ„EZLÅÞ›×åo|M¥ e-Š¢åa²=š±]™xUÛƒápCóÉk.ÞRŠçþ¶º¡}I½Ø¢­ï/—Õeµ'×›8\ɉ.³þµ~Õ Á™¸ÁËÅG¢æGŒT„„©c„P• )-° 惘¯vç€Õ¬ª)Ç^ì*hŒ¼jîgÅ_¿·“Ͻ©~y·½ÏÜÏÊ„&ékèz÷çÐeDï6Ù[ n¢{x¯ƒë'ט|Þ&OŽ—xG‰éy‡R‚¼ c‚S :•h2ºáþœÙÄ+=¹*˜ÄîSt=õ Ï| ‹÷ÓÔ ´ž¯yϰÏËþužä:÷Ÿoù7´‡…ÎK{˜2]Y­ž³÷ú]}îÍ4lv;Øó›GÇ%„ô™ç¸lõFÑ-z¸»ådD¾Ù¹ê9OÞ†ƒÒÔ©þ¨ÛPN¼…wMvz¼†%ˆ8±ÿ:Ê”tŒD…Xœ@*­4°äÚÈ­€†qŒø€iöÙ×yÒAµë¯¿ǰgø¬·1^xáË /Þ}!µ'ýLn8iU…îìÇÑ6è|b見usì먳#N&9Ëv’1'0'Z!‚4’eJØøà',œJ¶Ä™Å£ãG 쥌.å±U>¶óò¾‡”wÒ#ô§ÎýÛKÏgfýtÞXã|=|cX¬çP{”2nGVû®ßìH´öõý`f“hÌ¢áèµÓx‹zÊÊ·/º¿Xô˜¶0çy®;¸Š ©Ì£a_Aj<ü-Žç4§•W"¾¯ò¹óE«óÎñýšŸšûú¸@·&­f n.„î÷©>Ðú8ÿêõ\|y¹øÏ¾4?"lw ÷à›ÖFPwÆ7&=²™Jï<¨åb©ÔÌäPôqäéhXrÞ•ÆÞ—/ÐwKß”®xv×+*¶KJXhýMÏì—oÑ2'csk¾ÆqæX’ÛHR3ð—-Öc«ƒ¼4”£_–÷®S ½ÔErŒH_¹ð¤vpå½ÜsïKáQ½5QŒJ½õ<½Ù ¢¥ßõþ_ò~35y`ú° ”RÚ¹ӋÍ0êì ÛB¸ î‚ÆDÑ ûÅ5ü{ï¾DÈ?' [³Ñ‘éC£Æ=çÎ w1Oáeh­¥§U‡4:Y¥®ôj†áƒÐÜßÒ7*iä.üÄk<µþz7‚("yë,ЧNŽŽvÕŠ¥,×+µÀÂÉÞWönæ96¹’›÷èrŸl"ÌÏ eÎîƒAf‘ì u,…W7ŽŒ8Õ`gˆ¹¿…ÿäù7!ÆÂú°• ¨kd?ï\Æ£µü¹˜ùœi:ÍTˆH¾ûjáØºÃ‰1áy%–Ytqsýô7º[ÅŽ¨ 9-q;Zµ;V3‰òõÜ¿íÚÚÌUã!° çÂrC5Ë ™Ht¹×²^ßp†M³€q¦oGo{ØÛÓÒ-­?Ý ®Å­GÔDDÃ)`?ž7§ ÒL3;ñµÏç»{™8®%ÈÖµ§úþ!ç° ËYR,³{ÑÏì6Ý÷éÿ·ýTÅRíËšÍaL »¦ÔÞMúˆFÞ6®›xFýjâò£Þ~dÆ ØœÞQJ.™5dûTu®·ò“‘!†Ã„¬ß:31}›¬ÛØ/5 5ïVéÉfRH,4 îµ€évã'¹ÜfhDtú‹“k[™œ‹¿{`í{¼œYã'0WêÜÑ<=™Žp;_dÖ©UoŽ‹)|!ÕÊÒ|èß—ŸaD°Ûœ§f6~»Ö—½ž§qõëoJo÷ë ?mm›µ?à×ïBÇüê¿´%ÑKÆî×›ø¾·¯à,¯ÄÐLH3Mâ§ãû÷z¼UèèÆ™+\ºÙŸgÖãLï{Ë­u‡*w¢)×.•âmX=\añãkÃýíi¼AJÏ4‰­ºª …ìý¯xÿ&ÓÓ’ÉÔ³Yó Iz/ͱRqŸ[<…E’¨›öxt…âšÓ½ #ÞúhZVEj9| ɾÁ€gëlSµ‹àà…ÛjH7Üí~o!œßž’‰mWrðŽ¶£_÷ ºÜ…¥l/UY#”Ê' ‚äý@‡æ­W‰¼>>gêÓí\i+T•ÜmÄfÅ?ªJ‘qøËö~WTº,ðSŒ¡ é¢Âƒƒ¬%w4løÐrÕY‘ŒÖ¥] ¢˜Ê@pत·n¯ßj4ҿͼÇêèpþ<,\ì37¿üL½4W‰¦6¶o•ÝêÎ1@‚ü}þv~òýuûfhj8>ö øÆèÚ¦“dvz´åÓ<Ÿý¥V*2¦®ÕT{|=£é=MdP É¢-š/6ÊUb2¯ÍÃðL_·ã²Ð®±Ý2©Í$1GlM"PÆÖbYòè–æÆR®Pƒt…<Ù‰¬$ú•œo3Pæ¶p°ºÓ!­©ì¾õ²w„ÑLÇö‘‡ÄóäãÇVbÕˆê0Ó…‡wÇ=¾¨¸{eë@(è7Nož}<£='VƽüI§µÀ-l‹ÐÅóÌ^½ßë››zYë†($ÇVálƒmÕQTGä2“Žó˜§²vn¿QP-T áh™…'#}.rŸÿ¬•¯?]?ÞB±ÜXË·á¬é,í*℈Ì$¯ß<×_¸òOª¿¾‘IÓ™i𮂬„“›°;á x’2jÆYQ…§dÑ¢Ý*^5¹!‰ªƒiÐçìÎÚS¹òtvg°90oæ÷‚~–¼ÛÉ.> ËDkÕL›¼&R[6\¥I=—1vñšÑzO·hùÚ¯¸û›¯5‡Ï*ÿrÈ…#¨ìÐ|hÇ„ã³ÿ¦Tñ×½jyU¼ŠhbØ…ŽÁƒç&¬Iì¢7ƒ)€1ÛÌø¡êõšÂ Ïc”j„ üçϪTñåÎÿënl~M³+/‹HÞ0f>D‹©V“£Œeó™óPRlï4òqÍìj#Օ涪ÍÍMáhzûe_^‘FIJ"4½¾1ñ‚É”y?{O2·¯ô§[°k¬LE·PÒà´qHqg¤#³í¤&8ç|ìúÉâöæ†0;˜—ઠ.¡0%(ÃÌĘžÒŠ ¤ÎØŽa|‘TKRï*qJ%""fÎûÞCDÒI«¢%ÆJ X·/ý‚t?¸2AV`x¯+¯æH¿û¹^åã|ê>Ö“€ï•¹/öãfT{´9º †2X†sõnº\nn™*r \áP0a= íÀ ¤lQ3¤tžzr7ø`Z…©I) ÌsU™ V&¬ñL-$¢Ñ@ࢽݵx`G—zÿ¦Vûî¹9!E´$]P͵·~Rëo=á¹’xF´Ê¼á‡fL ÐðÒÆ•Ñ ês\É.M qorÎ~‘´ûPäçm~?bHå¥üjPå…ë5À){àÍn-ÃoǪuWÎ`n%¸Ã•^°øcƒ&¤‹¬ŸÇóU?‹´V?*3p­í;Õ˜L… pÒN¿ò:Ú`³€iiq:Í5Õm…æÅÜX ´ÁÅ(]£’=\‰ÿ•³O|\µHŒfk @=’NVêή؀ê¸ð3tæÇ¹À?þ ñÏDUÍMrqñÇ+ûy¦Î¢Eb Á 3IslÙöDcD`‚U¡Å]“èß«  B”U¥ _8÷Ú Xí%gYBˆ« ¬ùÆ}N¯×ð%f‚Žðö÷ùù³qÏ=…\ˆ`¶÷¸{(Ef~—xÞ?†Ô¯o@/„ˆ‡ß/º“N ž±Ö}’¯O}íf)’³™Œ{+ïFJ Û 10Â!;Â@-KÅ¥¨m ê–SE鑊ìkm´ ‰[¡¨Àëç­'Ý´zÕœD8+ÁUÄÁCñp¹S´'s1IÇ«ºøÏ@d¡Äð˜$7ÍHÀã4È&ßÔ3†Tahïq™­}<Ìø,:œÌ»@Z²¢žÓÌ™ý˜41‚€ÑØ6Ö†*‰F›RºÓ§ï¦Na1,ôˆ];mHÅzìþJ+}Žä”+“¨Ž’ ¸ 9A\ù×C4P}ÀˆIOQ4ò]°'#‰ý’Šß5™OeV¸Cï Îï³;Úâ /‰b„ø•qðÙ§ò·ÙsMŸƒ| G4cT(€jÐÊÌ Â$H¶2f\Å¥}Sj2ƒ"Taˆ1R p“°»wîé™ÛšÅ§GÍÛiÌ\ŸçjÆóNvy~œ C7wúB[÷~NþHõØÊ2E(I4TPCÆVXúá…,y®D£ÔÎkã½5h¤Ä  ÉÊ`ˆ$¬HÈÕ±!ÈÁ£_áºè&¹ÙCš$>ò±aÙ.VBÓ˜,fê›K=Ó|XÖø+…hJ˰˗*VÚ¼«ú½W̰sK8´\±AJÍE²{ÂLQä.a­[Å*[ã‰ç¯Rë_õ1Ký,a…3Å p…}MžiÆ"–Ž¥µ!Tl¬ÒU¬æˆG>Ø€WU£P­/5i­Âýô¼ãÐ~›íçÏ«}ÿœ8m+µf¤ ¤ž WN¸¯%æh‡{†þöÿœ¥³ €êõÉ-ɳWå Öî 3%`ejüÂHŽÊ¿ˆe¾þEWM)ˆN¬æ áã‚]kz¼€[ÎWùJq^¯5xµÃÉ xsf4ÇÊ£}¼Ÿ.gú¯_ó¤ä'{óÌaô„S˜wášwbCJ«ÖŒî±OÎÕæç÷×Ë*çŸ ¡ÑS?©ÙmæC×òe÷6÷Ïþ—Îþ kÛÍÿtþü»y…s‡4bÜŒ*†æ4s±ò@8.w«we.Ð}_]u¾î9ߺÑëŽu™kýƒ›wá“~߯\ÃK—þ•øœÿy4€Y)íGTEUˆ8Sw‰%­ÑÒ–áaW gíXwüíúöŽç}>ØÙ¾¼µBÎL¼Ã íµ?´ Ðé$¬¯“ `M\ õ5¯×ê5††X‹´?”-d…áð>û_ñWG*.1òìpµâ}¸4õ.¨£òATÃ&ÜFÉžÆæ×³!ZD›Ùµ¤ß{W—jõýhØ¥ôìM}ÛiµÏêÜÜ÷ õöƵÿo£i>£ Ç7íy¥+üþuŒü]ŽµÑ¡Ê!CÝ}\9êJ\JÔ\‰„hÄ™?ÒyrnNã›ú¾«û6jqB ½æ»Î9ÿ›ì÷t;›9$ã&yÞ}ƒí¾5þ÷øÅÌÜÁŠˆ†ØÈÈ0â£N{rßœ`¥jˆ ÿ®‡Ÿ3ÖiÍtóá>®Ö*ÿÀeÅ\Í3t!›Å®îð®°è*Lecð5úñg!œ(h8‰ ¼YWà%ÏÌ24Æ.ykbhÌ´ œR£<.döãIíæeó·ÉäæÎéõi# ˜´úº<úÊÄÜÑÏ#w÷p‹\´ \ÑpúD,Åa@ÛÏ|-á{¨ßBsƒíù«ÇÁO̧¹'I7LÖš}ЬÐ@~XZ»¾+Ù nF¨Þ´ Nõh÷ À›a½i¹lâ«a*r¬/„ÙÙŸ©¶þîíèÏ=ÿ½Ž¿oÑ0Ì)Ü”w/¿NÄ”á,æYzOÿµ9Œƒ¨Ìk:JSÑ,<®á+¸TÛ¬lýÍm“šÕqc’D áιwÎ O`ÇŨmÁñîõG—@x®·’–²E™ŠÐ»º6œÄfËŒˆs,Ž8ŠV ®{<¬:'RWðÏ’ÙìÑnÍਤ›„v»ïXÂãæ|yôþÊ®ÿ;§aþýÔÚ¿.6°p¬§¼%™¥r7y³Á’Ø3,•9ÌÍ´Sì=ØÙmT<ÇXÕíV¾ö¹®³iqë¬p¦Îã=°íèG/îÛ÷?†qApm sB?Jý˜üLÏ·‡½mpD@3η‡o5] 14ÖÓ£ÏÇw[ùñæ9h¨–dó×ïçd…ú§ÊÃ[ýÎÔõ~¥~dÑ$È|ùlÅȹNÔ¿žøôD_à;ËíVø|Ã×èA©Áîîˆú$÷ƒÜob¦~V×{]àDšbާ¶çø4âÚøA‡)òb6S¦<Í8ut®çÑ®ÃÝÌr£ã öæ2£(6Lå  »4¼­ª(òi'þ~î¯Û‘¯šÄg“Çj_îF˜³Ì{ˆéÚRdaº˜_n†Î½l­Ë6½pí·M¿¤ l}7’¢QËr*u×É6ÚˆUéIér"zë'ׯÿ3Ûßÿg¶Í—éE‘m U×ï|ÊÇŸØ2$ ØA4œ6åPÛÀ,°³Áõ#ý/nó‰Œg;î%¶FxìgÐéF ª-`Œmî6ÒOAò#wFŒ\ÓP‡ÆÓÖ§Ë.L\ÁÜXj2†%Õ,£UåæáÏGu&Ñqo£QõñÈ?ƒøg»øo[~âüA,oÎ™Š»Ý“p#l‹kt.]9:£Ï¶EÝ4G!hÁLJh ,Ó5ðË»Iàœ9g{ 9`z µ¬ ,f'Â>ùô™Rù« ¦áÑg,‹1F@«–üSª"ÚóŠI¹¾RŤÀçœM¾ŸÝ|†P‹? ~á¯ß]蚨•8}j$Öí¶/x$ÖŸ'ˆÔNMè\r2ÐŒ =Pa⦌µl&—&ª5!Œ‡$Ñ€ûÁG›=VÅù†u­* nû÷>yü¥üë6ž žuv~P9ýÛºóébåß¼Mí§‰9w]÷jõÍi¦†¸o»ˆuw¿k9²óÄqdéŠjß—f½¯o >ÀáÞÚèça×KKGc`,( KH‹Z»´¶`‡“©f;”´ƒÉLôþ¼æe¢jJõ5¬Ë«'ã0Ó‚°[öŠÊÒÑ¢¢¼¼éN±‡`CSqêÙ«gÏog3A¦6vwQÓË}WœÑe j@'ü¨§ðó1ú,ù_Ø››$ó3`GíÖñf÷HþH⠞ȯTï?r›ç;zëH¯ÿücð­Ç[¢û»¾TQ?ký¦Œz€«¶±¤WºÎê³àÐkmÚ_"J:Ú ¹8c"„¸2b i#Awfµûxz• 0I¶ÊE2†Ka!éIöñ‡¼þ/ôëûè g}ÙZ^#2(oøMû"ÒþMމ`ŽeNOÂziŽecv‚¾hü¬þG•_,Œ³Ö${¡»Û –9êCD²EI+æ ¬«ºRËîQ’kw`ÂTቒaOÎ3 °þÍßù?ÍoüÙ+©DjýöªYJ·ÚNÇȩތ´ µרäuähv 3{?~>{>ü ÞK?´^9W"*ËašJŠû.ºÆZÏÊáÒƒê—לqüåÄB²¤MAÈ¡3ú£«ƒPäðL/ÛÙNe²î¢_5ŒdÄ¿+wU”È—m÷X|œ¶¨/;²Â²ƒ2iú‘ÖÓ30šb704µ…©g)jr!r0*?,ç²@•(E€†;iG$#O?ÿ•Ž‚“%êÝ E*…eD-ú6döñzû)ñAøÖðûÙíØÝúA1Ѓâ/Ö{¥ÌGeµèkœÂ1FX’ûQ I”;<û±ôþïûÏ¿™þOçU^tTƸ1žÏòÖÌÇRµš¶Kl¿lß÷+ou{*Ç2q ¹˜ªh€[¢žˆ$RÚQ*ƒÈ#,p­“Ø‹;u·Ì/Û~ÎÃãkveïÛ×Tר1¸°„Œ›@®å¬T§Ð@•j€ÀŒK"å€ t°2ÈÑ÷˜ÓÖÑy»ÓëñMvj}òÌå˘ë~ï¯VõÞã+E AQ‘Šbê. Ät²WZŸË4;U¼®ár}Óx¶4:Uªt„P‰ôɘtM ¶´éŒLŠ¦Þ¤4Çž‚ ‰…‘§¶íÓÈÌsÒ›¡)üüÚ“Íh"”¿w6DÊ;°ÜOÖr»fîÄBÈx›±À/V:°P.ÀD4=SsÏÚ)¶ ,ša†&ú¦<Î2Hâ‘x,$0§íõÚisý¶¼gè[¿tÀ[fVmb¾î1ô‹¿½@}»‹üô“å:y˜ŠàJõ(VnWvl–ÕñkZH2ß.Ýv "Pe ­Q!)K4PrE;Uc³ ÷ ß×F*d®Á d‚Ì2Ïœm ‰sµ›oÈq?~æs"fiò®§¼¾5÷“Ú‹++¦Æ©“(ÌñЬ¡7õ ŠRšÖz'«nPRR‰»ž~õ •~`(qð^4ã~‘d°¸Ètb°`k@pp„+Ð~« … W€TàS?Áâ4|#%$œÎšýÛåùÍ×õ'Ü-Ñ4Ó ïØCŒÐ‘H[Åîs¬KôEÆ™j«ÿR [‚‹FRŒ&A¥ÏeÞ ^.[±C‡TwÏá^ô8mîKïŽÏ±U±RaÒÓ«ê?äyĵ)¦³Ï×ûæ 2¬WÐ$3:ô„ZÇH@äÐLÃsòWîÿÔº^|ü.³ z1¬§`Çïköð¥½b#ú®ºQ9|:óãÃåÑg2OóµÍWûjgÓ$ Ã'ñkß«'ƒ6-Kÿ7?>ì{õ·kõçÛ3ôëñ‡7Û§.g1—H+‘Þ߬ëØÜBÂ(dº‹Þ·S'{êÖ§yöÓß +(˵Ì*O"r¨ó'FžðŸ!‘6TYSJ!„s‹q .‰Dþ°¶‘³Ç j-’Ô ˆyÜò]1¯Å_q½×o—ë&êw~X–ÖWè+ ÄoBîé“lÔŽ‡øX“êK4ôìJÑ룴’}¥×Á†˜æÎÇFÅ*&ý5bÖGÄ1k?&bÒAµõéý–8Aª×ÇÞÌçV/ó´ºß£÷vx'S[ßs ßçOßwñ¯Îòï<ûÚTOZ…¿ýÒŸE ›iœŒ~þ7mhnþüT/ºòiPt.×ï{âó?6<ȹ÷Ö_eÎ)îØЪ?Ý»ì9…èB«‹¤“w«/ËŸÍû“ÒwðP¨ØGùÆn\lzö›Ç-Bà5‹0¢8ˆF÷BiOx=ã­«íÜtúÝ™šÆ™Sx8¿Ûµ[rF6„r²¨-­!W¶2Äœ `ªa½rJˆï縄#µÙY* ÌOÞæ¦æ/hC‚E¦¦/ç}R¿¹ÌÏoÛîhŸ=>2–†(͉„é3ÍËJ—‡<ŒЮùr¦MžãeàÄO,þ‰tó®”"j‰êYóP†4°GøšÁŽZÀæ¡z¨‰€ý¢ðÔ¯þ»b+¼Ÿ+}‚ëtǺü•÷Ó=?±ÀŰ3‚5ë5/%˜afÈRSŽã’*ŠëÇ8qŒq¨Í7ÜWÝê2§rGåbiôkw¡ÐìTE@ÅA¦þÖÓ˜¾æFµQiÍ1Ú³ÓêÒÏE=R Ëá艌٧‡íYª5mþ01¨’Y£ÿaÑØ H‡åHå¹÷äVÛCñ¥ !jNÙî}I9Sâ4%^üc™4H …öGÍ Á_6üR²›ƒfÍ7qa¾Uùs]‡ë2ëGýñwì“st~CÍ>åðÇun»Þêq6ãõdãÙM´Cx—©!4+EUhåutr•Š)Xö —0vo® êìånyà(åôÁ¬2ëq¸ƒ:ôu~D½‰` ®ÎÀ3cך¯ÀõsB™–mÒÃsžgôŽàÊpG3!“Öâ>4.ñy“' ãNsHVù•ZeüóŸ~Šô6M¾²Ïê‹nW®íËûæ¿ôãÕÑ-Þÿry¬¯dþÕi¦xbñ"Ð4? Âmdz0G$B[f¶}tÀ˜†ÍÛúcý½§ãüq˜…Ò67žRÞÅóî•®èCOïåÿî£ËÛK 6ƒz…[NôpÊÌgÎ|šE@?¬â}¸,(ζ«Óèá1y89úI?/çñÈþ4l %˜ÚÝym{×[o»A›K¶›íJiÛqÄ~@hZs®~ÕQŠæ…{]Û½*.-¡SÙ›BÇðÂ~¸3øe8‚‚´®øäÚJ«ÜfÒîD¾¡†P1vaj‘tE/)Á+±jf4 åPz„.˜9Zj\¦¶ÇÒ’8¬}õ´ÊØ­+e?Ìc« ¯”©ƒ.-uŒmÿ|˜OløyC®i#ç?½ÃïÎ)XÝÞ\ñÁ]ìx;R­]5ØþÓǟªÅ’ô¢¨·ì<¤]®wdMLf"²p·]e´Ã&x$à»ÜZ†Îå¨aC(‹€b3`Ò%¤c¬q÷öåG³ŸÛ~„‰ŒšÒT$ã6µ88‘nMO´VæZFÕÎæÆÚû éñ_}<ç1½JH\þæ7þ¬BžÔ|¨[2>C€4èâ.`I…PN< €þ°¬äÝ{’ Úê¡-§¬üÊÙ±“=CFKñ.4dC{—AÍ!G¤+òƒRkp ÏäÀÝŸïÿäÓúG?ôðØÑ .þ}½ùŸüîÁ'¢Gu~´÷w‰ú|–†FíHMÊR·àG‚=uu¥éXW6sÒŽD?Ü{¦ÜC^Ÿ1c{¯ŠÎ×Or"#ÃØtƒÇ+èN€.uÞIǰÃW»G!‡Ì0ȬÚ6ÂèÜ6¿¼ÏF¹#Çëûïæ·ºçguRJJª7Ý@÷éêqnP%iN‡ R7ê‰Ã"¯Á(LñIƒÝüó ]©F\¿/¼ú˜<à/ޏDœÔ/ÂŒSþ?a#ÄŸã‰ËuIX4V³ýÈ-©*' ñ©—Žºäï©yôv<~œ™/›cIÏ«©¿¿Š 籨ÖW"a´Òlu€Ý”E ¤³ØÆ«¨p§µZ+W9–2H†³lß°«ñ09 ¢–Nî0‹WÑ$þªß0~¸1Jáḟƙé8‰Á´Îrb2­Ñâ9éÈbè2W#ÓY/•˜Ôå 'ƒ=[+¹2?ñCRµX¹ùKþ‹àqF/œOG=¦”…MÑ0n¯ý!÷?ðq:ŒC¥j‰€ƒUÀÌp8GQX cߎ*Î…ößEýK¾ý¥Uá%±²¸è컣9Ô^ü“œ(™ÅšvÕל9yu0ÆâÌŸ h'™ÁÆêØèµk­š¥š¾w®´ ÿ¼ª4\FAБ°°½n!ñ‹©ó<ÆL ²¢0žª+©‚‚<ˆW4¾)ÎVÅF,_˜y‹®Z÷?—ð]ŠŸc;¬)QÙÒŒ˜æ‹Ýø&u‚>ZTgœÕ³1KÏÿÖŒÑ"ŽQó$];Ù–wÈtůßëóÚÖ,Îë8!¡çãÂPGÂHSw[9b£5qPm1ì96éÂIÕ×ieÄÄíûìqbÍLg§†ŽI2í¢yj|ÈZO\ѳ±42edý”ãMMU*Ì0`{@Lì\D.±”ŠÅÈ=ö ^ÄÀ‚|3˜þ|¹ý:×ûÓ: EÏ b96äË-³7™5×]XfhèÅÙ^ÞÐ:‚,56}Ö´ŽEû•ùrþĬ«æÙµ¶è€ù²Ô’JvS¹2Pæ(FX‡VSô…¡øš1q„Ør"IC†¬¸î’ÜU·5rq eåÃ|-™ª ŸUJIOö¹A‰wa‚fdQ‡MÐÐ"È ¯—×âêxÎúšÜ‡k)3X)‹*­ãUµLƒ-«r%cëB3V6¤ft$~Vô’6ê¢çáãó§ï¬ä߸·?¦TÒX„¾VŨŽ3—åÊŠÐÈ5 ÇžW I§Ý>UW++ãµáèkâb,—Ž]£â¾iýH%¯Úò6»RJ)¢T$Šõ—"ûØÊ¨Ö¹YšAÌÖàîv–zRB@Iâ«~ýÊ:þam‰ Mv±òÎÁBâd®1É{½«rÒ=ØÊ›AÙ…ˆß:Í´7f=Çà?ô3õã«Tzöpó<¹Mée9rS¹ZIŠ©AG޼IÅ9G+³K‚—ça)IÅPái± Î{^-¹$Ä5)q0Á•¨d(,Ii‚¤PŠ¡×ò´“šàަ¥ŽêÄ•2M¶9’ñKé‚ÙGåUU_¨Œ‹³ëAÝŽmë<³ýu˜½›Ó·o[zçæ{½g­öY]is3'Í®Zжm°rv;Ãh,5FÑL†¨VX+¨b¦*‚áL çYŸ©hÂr¬sZϱWÇ·aCš¯ÜОáÑt¡‘X#2ª5Cªõ˜ÊE.±ém¡Ï–I«TL¦”:_êcsÌ)W)Ö˜D"BJFJ¡æµs#çÁB— Á&O z,ÄØqÅÕ)•Ñ7óV n@â ðEäÂúsÜ™¸t*ŸA_é­óã4ö(jŽ7£ÉÕ4ìãà9è‡ðnÛ;›Ýìb+:ÅatMjÍ£û©×œ3ªŠ×€7›Ðu}ÖÕ¬%ו•-Œ¨YwaŠ˜•À¤±,¬R:ª RàH y!—”P•AM\JÕ=nºÀ5È! Ë’mpͲÆ×„’ª„ŠVË9‹zn) ÷‹”LÍï416Ì]Ѓ3»gzÂ%JAMQÓmóÕøÐ+8É–=¹*7‘UkT ¿âAŒžÁ4xʽՉ¾$#ˆü£ØšPaØW^@|Û ç×Lm j½u¡Ê•±Âž6çCS 3gÁa‹néÇ *;lF"àèœFÒ“é†æ F1ÃNq.8÷1²žŽ›^—¬ëB”g Ë%,+™¶ÏðsAt1ÊëøæoÿÎþ:ªÌOÍ%ã¾9¿äzÓ^6ö×_Ú÷þÆù}7='¢À‚&äŸahßÃ{¡;ŽéxÍæÏÙßš<:د© |´Û«æµ,ÔÅ-‡oÎFŸuÑäÏ®×oÎÔsøñqÒÓæøþsùoÚuâÁ¼ºÇñ/` Sý—N÷Hš~éì=ÍJ¾µüuC Õ˜â8KY'¹Ï °äãçæßQ}Ì=ÆúÚI»8>N™yx/µ“;º¥€íõ¿]úo{OIdGFÚ)®EoHPZÁ­!Ô;%XHÏÛ/ºüì9°ÜåÚr&“×ö?oÀ{E°“˜wÒ3+ÞeD‚%çrŽŽZžófr­¸È)CMI W"O,PÇר0 “01²"êˆöMBv½òº½«]ϰ4º ìŸÏòÄ@ôÏm²ˆ=ú%ÙŒ“ÿþgêÿ“ò_÷Ðc\›äépQ´eûYhêߪÿ£òí1ž÷Õcí߬¶èíÜŠÔ½ÇSÖ\ˆ[º6­e³îyùþ€÷/‹{ï×»~ÚŠ!¸/Ô=ðN@B&€Ç—Y­Ðksr7÷"gf¦3{ÀM =%Xwú–ÇgÕÛ` óT“üõÈýÂìòCž<©ö^ØpÏÇÍD¿¥¥©+³­ÊÏ^Q`)39¿›·ƒ½.AÇq ž¾Òk:˜Ðú¶ß®›ï 5ªiàÀý~˜y)ñí}^ N¸è€t)öåäu(Ó6›T¶¤1SœíüصÑ)“ô¦s-Ÿ¶LYÒÑÓ”^4Ìà”‰õ: ۃ̥!æ€@07þò:òßXû!PñuÏ20à‚‡,Œ8²¹Êô!6­xˆ”S¨¡è â ܵ¯à>†ë4Ôžó=§5x^ç,Aí0½î:¦{PßCVv3]}¸T7µÄ31Ÿ¹·ƒ&n1˜æt·v-lRý³h£91îŶ "“ðÆèØMZŸ4ËOAÑ ¡8ÈrÑZpŸroGù ¸è=‘AœÝzó³×Æ?Ój¼ŽŠ)?_×cf<Ø>ÉXžç€t#Tº‹›öºÐJÏÔ rHq‰6aS„ééçwõ+ŸÖ à³*££eúÐ#èLp¡žðȃúß®è?ÁëO"Ãú”NSݦAFÿZ”Ãø'ãßô‹‚k/v”0®êü}ëJø½½ã÷2Ç?ØhŽÛ–s÷Ü_÷§¾ë` ³xe1Ü…ýù%r#îtXî°áš^AÀn )PGC )z¢ ¢‚sŸæôy̾ÒÊÛ7¶÷{|T“Më.Ùï“ÚÏ_ˆ¿è¹D×Cèù O¼;ú)ë‹Ö¹~ežC{|Wyeço²‹$ø0 Ò‡Œ"̇†‡è$²_"5ð7Šb^@Óqº!NËßü¾Šd|Éø Ü÷˜¡!»©µEÎÅX¯â1æCã¢Ä´™^BVôòºzÄøM•Ts:Ó¦þdF?ŒþË&ïx§Þþ·ÿŸŸ¦oý×½¯zï$#õxA§'z¾*K«sO¨ƒð%¤ˆJ²Gùv_Oú×—W:v·ÍoÏ”•j’¢ ið5/í4ý–ïŽã^èsŽ'ØzÃçv}$\×–Ð6õvê°sß?âìè_¿lÿtͼèEé{N«li¡§N_ V-Ó+€IŸòž>‚Ñí$P Ù0-ê´çoâü9óaÛI½¹A³#šf•b„­ôÙÜ…ô ôM´Õüge{Òx Ù ²ó‰3JH‰Â‘¦¥šyúZ-ñÌn2šC›\Šíãûwuïò£r>1ÆwÔN7}Ô#^5„+Í0!ˆË t­Ï…šè»†² -8¤rI-€Âùªš3¯»`X€$Y$eKdˆ"ëHÖÑ-TYÊÿ8·ìO'Ëé–=k¤ôdMTìÀâ×#ØÕ<˜ˆ,)2E°¡)Àr}ÏëNE,aNÌ;ýãHQIŲ}^ÍüÑé×HÐhíÖ0L]¦?¦ïï1 ¤¨6¬"dñ¹iRªªU.²Šôÿ`ó_oÿš‰¿"ÞÍÓí53}5tf°³M<×§ë½\d¡sóŠL ;²Ü%c`/M Bü–Ï9t)¿“Ý*7s‹†©“wQá{a‰dÌšŸ3*]²ýV² "¼·uÔù‡rþÃu~œ DV ׉ŸÁ媪¤EX̆þ#Þ'‹â=µ/xã;ˆê’|¤ø¹”J}ñ{ê@-¹X½”ŸÏ}œ”H´õü Bó;áçÎq=ýÍ»ée¢Mò*çä[¦Å-VÝfƒ\ælCˆ ÅYqXÂrn¶FЦcß‘3O—ú÷ðW£B©æ¯EÑ,fUMuµ7SAaì¡•Aб] 0Î.!‚… Ñ&,øÈüZÇo{¶©Bf%BVwìÞ5 –&4»¡òŠ)£ACUDsÈ’mä×t÷LÖ~Uå¡´¡]â»*»H´`íöË’Zä  aÀæðÚÅ>œçùï|üYg¿,Ý×í0³-uµoùÓBFÕ_oº‡5•ê2•Ò‚J$ôªÈV‚ fK90\±¤QF)p*9ƒ ê` tÉy`}„±.(ÇHsyÕ\PÆ8 iDm²†ªXy:픥£¸© •Áf¹Ø„g¢=Ÿ3½ÿ¢Sµ…:רF>[s·¹žJ·Ã (…ÈœùpŸ’ "/êYóîºñät2¼5ëw~Ç_¿ûùÃÛ×øÛ>¯¦Q‚WþgŸ¯óÆ`¹æH£Œ!í:}˜š#S”¬¡¥ºp”jRkÕx´¾ýq5fúöuüÖ¹K#˜AaêâÅRír±£‰¥«¯Çª›< ¤‚<ÿ©õ¤³±ˆŒô”#oÈÇþ|èúöSúîë¿ñsǺqžÛKr¶¯óÉœÔÛš1Q'œuG€EN %Õ) WÉ#7ãä’~ LqÓiŠ9'Ù—¤÷eU]¯éü9{ÿÜò4i‘­¾}N;@}¯Ž=Á{¾›™û)DŽ™y:?}©ý>Úæéƒõ'xÞ[ŠÇ9ê˜Ô¨‹¡TdcÓ†"J˜œ•‹$ÒH«e*Š'^“¬:ÚõeûZÝy^l×mÿñèa*ìªí£{{ŽžðËêKh05u+n©RˆÆyŠÜ`#£,ÔÆD¡À‘1±p”ŽpÝ·/$+Îù~ÜK¼¼ËZ²sÓT÷†®íBÄ I„ˆÇŒ˜lÙ8¸7zä)`ÿŒã¥ó¸[•9r®`ôiAÀ=1ÊÌÖÆJ+. ²` A5æärõ!ßc7>Òeòh apŸ?*(Ïâò^¡Ê³üM¬ÿ§ñ#˜`6?" oeW‰``à÷©Ñ÷ù·Ý—ßšž5Nô¤PN B¤Ù ÏJ„ B8$®ÇÝ7Ü™$£ ›7Ù´0 4#€©¾o“çÇ1ùï*ý×"k(E@†”œ g•Ùg3örŽ8UŸûž_¿:k³îühuÏ´×WÞfUÓ¨c¬,öè¬HbÒR ¶/0€*ç–´@Ä"ŠBå*4Û `P²4Fê¶:’D%J0 hXv<é*¨@vrïtM±vU’”I”#…Ò4Í¡Å+­=;ÃL!n o«\uA´’0‰‘Üj„•Ð ÉŽ§#OG9u¼K8Ëàir)Òª1saP\}’e¯öÇ¡öJj6ÄàÄ~Åj‰K@°±áâ ¯ÁZ?Âëz­T U|A㺮xDGC­Al"Ñfþs¨x-<º{ ÔØûz‰›ƒD”Þˆ“áè~Ž»Aÿ”y4 l®90­º³ù ½@[ahh½xso¶èK9À“9ð_ÿœ?]ý=/æožï™aÑÄH8—7Ÿ{]÷<Ö×r“+¥¸ÿðQ9ÆGþ¹ fÿ]ZÛbë åþÝX;¢¹àk‘ ¸¨3ç*æ°>½ZÕËuèöB.a)äÃåÀWötʳž]ùÝø>xÎî=ÍÃÇÙ…§âlp•ŽÂT¾Úܯù­Œ9ØŠ%é^‚"Ô„UâÄ7ºÒ/úþ~_ôyüÇœ÷ZO9ý—½þ÷ž Vû"wEJÛc«ql2«TõÑô_[¾£ä QÝK”Á#]V:éPD DP¢:Žd¾p±ÍŒûëºÞØïëwgäÐy¸#o£rªg3iVN¦¶(~ê]Žö!?¾"S¸Ï’§?ž0úvë,[ÕW*T §5œ¥î‰ ֠åî%0!8âPðñ=ö«860†¨| ˆSãGþ3¯(Ž HCŒÀܨÞá³ï«G§y¼"·±ŠagVT?ÿ;‘ëhŸÚ?:~Öéú\?QÖ :ð=Yk±5Y:Á:§X›Ñ©ÈÔg¨WÕƒÕ[oÓÇ#ÞUÅÏd¾ç ˹á<Ôäuã=ÓÔÀ»çSŠ|_3¿O½ä13R¢˜½ß}ª\Í ³YV’ ¦Ây³íÞÊ¿E|èU$Aw&TT‰O¾{£>×B7øìå|Ö¹7r/±«*ç»cÇ™?î_·õkzñbìé׬Ü9]ë9sÙˆ>®7gÖÍ ’`mr¿Ƚ®¥²›O œ¿Ý¦Ÿ2uqX!Éw¦7ÃÿÇú'ô©‘²Ð)ŠZ›’²Û@@s4ZwÚiïì®<âî#=¨ˆ…(ee@qˆžVU8­”†Bm¸® Ëu¾ È´»}"ãò“?ú銼õßL»:çØWY³©¬Öë&Ò°…›ñóɉ^y½ÐÅ5þ”hâ»ÍEᤡ8Π«~ŠyZxt@ºßøøŒ<­Ù9ºžY6cÿ‹/5A‹ÒΨÿuNoýÕÀóà¼wúìf¶­Š1S!+"¢Â4K‚âÁQâc*!‰‰(Û‡ I«¼,¹Q+bÌç<œÆR*×Ôq‘ƒd»TèK!lm:šŽF…bÚ CC¸À”Ǥ›C5+*Ñ(Õ»¡ñ:Cc–2£T´2Úr±^Î täÃãâ[b¯«ÿãúKm©Ô¢þKÀÿJØòFÌ«pìŠDöÎU‹Oz¿@fb +u ½Aml66ZBs)%MJÓ/C´,xºg3šE›^£2kÕÇVpÂ1Ü8ScÍôí\¼Û?‹Oy /mñp!¥¾ ãÇi²ú¹€ÌÁ‘­íÄÕ0(Óžàü›Iø :ކM[Ös\6Àó]3 îàŠZ5†(}é¥ìOϦJW_‘\@5øÎþÛòjmù•Íg´šl8-È ·ÚSos3+ì ËÒ†Ÿ{Î! V7Õ®ºÈŽ~*sL¥Þìo¿=â]$j”M¤ëûJ‘i³ŸpÎSêjÜ_E‘ Ól.x¾™ V ®ËÖ:aUKkùxÁ²÷_<\F<#83HaA/øÙB™º†ÇÆxóàê¼ae»¿ôÍ-ùÕS?Êþ¸¨u×€KF”€L•ųÒ~*‡ý&´%Õæ[7ÿ¤>«œ©m<Üìɧ9óý×o}úr-¾þƒª/ÏFÃ.³fèL±Zî‰vÛðhWR´ã­'à ÀÈ›EL‹LÁf ñÔ¨'¼!(lïǶq¸¾¿º~7°ýǯgaê³}gÅY†¶6Ï󵯴ÿýÛ¿ãYÎÉ­6Ñ? SÆõ»ÙþApþ½Ã³µ´HF°Ëô±ýL¶Â÷‹ŒË^X€uäø7è¢!<fžîÕ@ô²1»»–Åb»5:€Ä\A­³9“_æJÿÃ;ï¦CähgÌ\/ä;òŽÛó÷ûçC¾}̘¼mãÈô»d)8¸—©|õ‡Î¹¹“•ØŽç®ÏúçûÖ>{$•íg»¿¼ÎöÈqDÈÀ,B¥˜9¤TXù¦‹ÝÑ9x¥9^kü2ëf"´Š£ûà„T¯¦ ó8— Ÿ¼¾wZ¬øðìüx®Cm¦j,–ŸE²û¼¨3vf$ùþ¼ÿˆoþ1Ž[•¿±SÛòo1øéè˜÷·rïÐEoÛmÕ”ðg±l)Ü'7ð9Ý‹¿ð~'ë0Gí¸[b¼mЙŸwä}¿tÕ©“åÕ~ÖŸaJÑÁ-ô\¦qvßÃC+}çëR¿<$;e5ÔJÁ‚‘ûd™ï̺ŸÞÞ`S}E- º‹¥®"ôH½ïõèaùóÊÙÂbð nuGëíÈ£›òhI¤EjDü¢ÜR<ý}h<Ò/ŸZjÙ8έVŠÂÛàõQ¬ ÷äÇ´½…#z[ÓÕîó,ÈEÑݽëy°ôÕµžÝÕâÔåݶ¬ÎcT 3r¯£ðw—ƒDàb¥½Þ˜IU„@•Ö’’éTqÅDPN30‘´@‡BYkÛ{úø²¿ó©p•wéí?;ÿÀâñæ¤vîã:Éz‹g1MaLæ®Ói‘$®4Ë.`#ÙI¼ëö,tžWò…7Í­•™š“[ œÙb/ €TGKв`†@CP´“ˆ(»æi›<nçô˵žÏìcCGIlÓ±Ä[[äìÍð‹DØYOñ&¯ëÝ}Å ‡«l:ã+Ô™™)ÇM»p\RŽlj#[Sóçž>ô{>*;Óü/ÏÚ“ž’2QMëÒ§ «¨c,¡ å¾»S¿ÿ¢@~æãd81’rŽ ër-â¬ÝtUЇ°mÜkUyB‡áеBw]õYjâÇ>Ø“û^|…ÔxtÒU0‰à¬æ”+Ï­®±QŠUqÀ†¸HLT¨Î}Ï‘diäµ*¬Yä–|Óù ú‹[GT ù¼¤WuŒ;¹`ôc2=ëÙÆ"S‡ÎÕ 8^I]~öòWŒ_³õLØ^Yåe ­“ë¸åûf¾X®×ñ‚ÓPQ˜zj‘| C5­‰ý¶wO/.k^F&Ã@>]3—äÌš5+”“1ð¥d*5',N pqÂÛpqãÞ4’B zÙH;tr*xåB@¯ùó4O%ˆŠ2+áA!yð¸RYUÔµ=ðB#lÇ•èx¤Zúñ¯æŒ1/ôý¡ÿô~¾6<¡G]¨ÊI•+U@ih]ÊöæÒp `”Íù”ï÷Nnâ/LÎUâL˜h9^ÓŒHW¸Tç³ÞþÛ¹0ñL௣k–qŽ%yú+–)RwA}Tþ)o×{Ñ’Ä:Ò02Šª¿´k‡Z« Y¿QÔ GþPèzÄÇXš¬×ñ[æÏôòòµž×…QSþÌÂ4k¶PÂ80"C@‰€MÓa9C©áLvÑq™©qÊ¥vNµð™ÌÑ©2Ÿ›B›¦5à‘“â xL¶¨\ªk¢ ’@--1“^¯ÝGTª‘{%4ŠWU¬2UT„‚]H7Ò*ƒ4Ó² À6ÓD@´³©­©Ì’3Y±7TF¬ÈkC¢ Š‚¾Ø&ÜtJ¡ 5¥ÁjÛÁ %uСě#DP‚ [Š#b¤¤Éh“áß5/Š›ÓôåÒMí¤gp2àóEî—/oïgìÎøÝgzå+õ€Üêý3þxÈ]ÎXàBŸçŒ˜wÛ1û:¡‘ä|*ÅÜ" øøf´@Í3F;­ÔòðȤʢXµªÝ©à1j%•ÀÔc½F¿Þé{îšõ½JU€™ÝóÍå³\ßçRsݺn×àü…êN'_§kaŠŸIC;rYâR¢€%aŒœÀŸÇ_ò10'M%Ì||Í«³ç1 ų2>ö;*ÒM¬cˆTiDÑhÔ²ÊdÔ‘"t_)LKœ$øƒË‰Ò;e é0¢¼H5ÃäK„æ‘|­ô»òë ß窮âSÇ q’ \¡™æŸ˜ÌÖ.Š¢9+Éȉ!± ¤B4ãT×ñ ÖAð(€ãhƒø7Ž<ù3k S’¤@ fRXω†©ãŠG4srÿø¸v4øm—Ï}ÓÇĪ~±åkBâšH‹€`Ê )2 Æ %VЃN‚*³20 a&šžŠÛ á°t°PJD˜¯òØÑ„5‚œr“£Å… ‹DY*Ž#„JÄ"‘„&u¬f¡Âf8RÃk%•¥²ÈÔD:€Äd« S˜‘‹Á»…‰óïÈ5çöÃø¿g¥¹Ÿ’œÝ;p¡\ý.!· ¹fiز„²R Ÿ‡ÍYïÆº*õ†ZÛêäoóÇ?õÞÍ3íç½½ßA÷ÎçŽçëûíñýxÛ(ÿ‰®ÿ½à‘Ú©«f*m8GŠlápµ½”0”°dRx¦Ž…La²2^<ªßÍÀ\j*q¨„"lÚ×ëóéÀÌÇ×ÁÓú‹¢ey­mæŠy„R7Íñ»]C{¾t~€7öL»¬m‰S®Ž‡~J Õ‹p`«­äSˆ rÇæê Á öSa2þ0{ÊÌ¥(‰FGsÜÔü»¢9»¢×W¹în[ÍÎý­ÿÙó«ÿ½ÿî¥þçm^ÆúÒÓ&Ì(FqÅúT}žSƒßkì ©òÙg»´mO·æ$ué ¡=«¤èèÛ”.¼ïæ°/`:JyOjr…¦8Õñ· .%RxŸª úPÁ*‰F]Àßµ0!Ù`Œ#…CXV–žXoÿÆ Yx|Á÷›œ= ÄÀf¿Åó}`ŸÒ÷q~ÝÙ³8FÚ›~Ûýƒ-ùzóÇô>-±" ÕºÆa4–SË1ñÓöøL¯7QNãÒ•üzཷTû©-ÚÃGÔ½™‘[â;.Ì;¿Éþ GGÄ4ÅukùpìD¼¶’?·¾Qÿ¨š\œ~³Üyd¾ÐuA¢ \OEwÝ…ÃV pÃÛí‡U‰zÓ}{x2æÖ5·á»ÓGþ¹_¡e}~ýôÁý©·h¯7”ÜŒQ`Ž€1O¯­ÔÛ³teØýH]—Xì6ìçóð–ÖÇ !jÁ®ÀšÔ­¨¢dÔ`Š·Ã£—rïw£ÏÀM²ì±¶7ó •Ÿ›74pœëç3î샡ÕÙ–+°>K‡ÀÚ<µfëÖÎþµõüí¤H•ÜêÑú!åB7žÃy¤Ž+áHJ°$4ÞÙÍ¥j‘¨¢3…•½Ô”M`¢b?pé«[Ÿ›‡œÖú­?ŸÁ¼½íТ¼¸ZýE&þ¼åÿdíýêfÿ$ºÑø™ç\Õ›ºº93Òݪ ·–¦é§’KìRxóÀTpFFYk…óväw+¹Ùi åt§•¹.õPÔ‹¬‡ˆlu”Êney´Á£C—Ù.»Ÿ<Ög©:œ€@·õll‡}}=Ì»¿û9I^.^_çøóù—û§×Ý.›5¬Wš÷ãû ä×·Úí{¥f¼?ôuk'¢êÜä5ú"ûx4rŠã‹wYsX2¼ÊðÑ`T«Ú"‚fœÏîGEͱ²GÑÝc羉:ûÄg[QU:„”¾°á±¦a*Ét+¥Ó®Ï«Î© ÏKce’ß ÝHWÁ„p?ÓÌ)>Z ï^[èÍûL±u³N6X:{Þ—´Ð6Œ”Ë=¤®¤7}ô~îÍèf<³#ü÷ãàP¯±|m'óSGýã0/KF¶‡ÓLÜw[Á0Éfo&Úo\ñäbí“Zé0*íÞËsâ%·î«žA ÛBöŠËìuÎk\=íÞj„E± ±Ë‹nµC!°…¬aÔ”3ÚŽ°$ÚÍüˆÄ–É=.n¿›‡0"HøH\=ìcàØCÔes1†X:¨µ¹ ì±ü=÷ãª×SÔg• d8ˆ8õ«îßÉy‘9RË»f„@@ðL`0ŒÍ‹\ ‘Jp|bô …‡w°mÍ^οœ¸Ï>øY—…ZŒ‡”w9 ()÷ú­†ÖŠuáÚ‚;Ý[{–¢¡ ²¦{¢ÞÓ÷·ŸÞ¼o<62Ò¯6?Òuþçp3°†/3HÀœ34­7„çVT£Áì ¥†m™\°žøzò¹EU­!6 ЦÜ/}²¯þ·æÿ2bºXÞÜ了–Žt­ÿ“>Û~ýåù¿­n‡mZeÑû©þæyv@-Þ¢ƒÕÞ‘†sïe|ð€úpûõºtÉNC1 µ#6‚RªÛ–`P{Ö×Ë&°—‡W75·:Ñ ü7îÖ5ÆûQã¬ÐlÝÙÄrw €ÛŸŒÈ"ñL·Q>mcooÞö® _Jý #Væè3g !1UcuzÐ;Fì‰Q¢L»TdYEA6òRúrp|6¹íÛ娶£;\iyp3úÓ9bŠ@kÇd”Äÿ¼ÿ“ßiœ}anPº`%*] ãr×+ÎT÷ÃÕÇígŸ³ «uÜã‹›ZWŸ4ïî‚ñÀÄO¯òº.!­eÒC»[à¤|ÒU¨ÉÞì*þñþ–¨”J!µ@HXI"‹Ñ•晉’2>È4Hb[¡ìfhÛeÖóúÕM©ø,ïe§è+Å$†:ˆfÛÌ%¸-ðXDB5L·ÊÊv+‹i?(í ‹Ìõ2’™ÔjêêÇB}ô¼ˆ.aK(.S<×~C%nbT,jÅ)‘Äf¶á¬nüájÓ7S©qoe^óýIòÞÕ’´Yª^týrð¿ ›žƒÙ?}3~­+/Ìò9',ÍDùÓåît²ØeQ@FŒ\µ4ù¼ðÁùSµ¿–ççüDß@¼ï&D… vÌ~ó+–ÕW_â°[ ÍçE‹ëéñgþÓÈF^â—Ì€¬‰¡“ªûŽì'¶ °Ú¯kë~ÏÌd÷ï^Ýe3º—&yÜ›ƒ6u•†À8$ŽKX\ëHŽïEµéÈáHjM´çv~ ÑL 8-+Ÿ 5v‘¥(°ì”7ŽÞZ¸Tþ/´_¶ƒ#uÇL4®î‚.Ëv·.E1´Œ˜nâ ”†”Æá ãðú„‰ÐIB9•jÆvïìÔCáúÀ=ÖÍaU¥œðÂhu|¥–6›‰ÅÙ/~ñ+O~Ù[ú¯¼ÞF(ˆóaÐ𺬬ÈG¤W¹d*t)>˘çÑb°Ö‘bdD®Ýt¯ÎÏEVe¥ãm•bÁç cOfX2«Ÿ&TE–V]*ˆInDv.X_«ùYâ–f¤`Ê‚+©Š#!VRµÖ­ì`¡©4¯õù±õzþIèû¯õˆ¦ pT†,R2 qÅ *„¬€ÌR¹Q®O÷ó\÷†i` —r»î eîGªÞÖ”öҘµ1Ú ñ˜Êˆ3Ñù@Ï÷æ÷84RXªé<åO{‡vþúP·¿ëØlʧz!…u¿º4g1‰Í@)è¤÷^~ëá‚åå-ÈAш— ÞÄ3Æ"—Ö­Ã@½¾8^#/Ý¢¶ÔæX°ms DTx¢%Wluµ´É²Ö/ί·HÕ”1 9€˜Ëz¼éßOþìñßg ާÄÒäj¶Õa:JW ßLoEcpâ•zŽC±Û=;È{ëZÞ¼Ê;“s³ëÍJe é× xc‹0iˆBv"Rs7uÞ Þ§fö¸òO•þÆKsÿùÿTýö'ö3YŒ21ƒ ²€ä˜¡!@S@¢1Π: ÀD°©…«WÉ3Ͱ¬ƒ+‰0^nòª5S¨´ÙÈrµñ2°¤¦© 2‘QBa´mL²vP³Í»øŒ€4Uëå3Ak*SJPC´ ¤*Xá#æ„G×F1Éu'] +í j›Bjr…F   P€¬"tÑ®D å²3˜RãJ L*å‰ ¨"@õ9Jr( uúñî³}¶þo1·÷aç„5OÍÜtêöÑÑv«AdMoñH¶XÀ!ÏþþB—Œy¾+R– ›ÁpW¥ÃLI Izmõ¢AÃ(ÏjÆÄrA*ª@Е Ã4ÝÚ-•ô¹ôuç§“á©XµHûÁPõu°¹PÿÛy;,^jßó ʤL1ŠSaH¤$AVª²VA¤;®Lp³C 2T³)š4¥—b;OM*Ô‚Ø^[F2¦$ß"/„°5­µÎ rŒËqÚG'(_ï:nòLº´ÚB“-K_šæC¸“I@xLRHÁè5,RÉFD‰êˆÊ2Os­OH¾dIM†ÏbÅ™%Ñæi]„—œ°ƒO4ÏÅ×Éù¢Æ\À©æsgšM0®³»ÃΨё4ÑRq$Ô$I‹h–r Ô (È1LÁÀlÉÞÕ° ônÀ0–©ëkòþ{¡­Ì¢nÅ-(Š„ì, Êd-ŒO¶¦óþOúXÜ{÷˜Õú‹V8M«~Ù.XÅ9SMšˆZI‚ ÈBŒz¤Ÿõi™QåÃRY¹èt¸mÅFJbdàÄe… X£‰VAY»GÝô¼H]¡DÙtˆ’/¥‹¥9òÄkì=g"Ö(%NÇ;Ò• K{¾ïòóx‚4+™v¦ˆˆ4x~ÌkÝoׂO7{挮¤÷†B!¢¸¹:ùg›\ÈÑ'mŽ5뱕tˆ±£dW\píV\ƒŠŒ@B„—5öÛ‚ Ô0Ò!¬½Å¸õ@¢ÔÿV¤=pŒR…*ÃPIêƒÒÖ®µ¯Iåxª ÅÙ&7ÏèÞ¼9ÑòÂ-Ér†qÏqøÜî[çlà ǢJÙ1#ÃXçˆ/ÓŽ”ó¸3ÜÙ©nyYùZ?6×7ð‹Î½Ódj“0I•ì÷Îç÷IÕªÃlÍý§–¿ß·} ¥ªc·Ÿû1§ŸÞ_ct¶ûÑg€‘ÊB‹ï_1—Õóž»ÉÆ0ˉÊU]€­éñ]pZR¶ˆó׺Oìõªºò¦˜&•y5·+íêxò˜Ï©’·3ßëIºìsÈEBÆà°íEmdâÚ¢ÏnÕÉÒ/¼þ°~õ7zoóí¿êøw\Ï™ŸÙ›Ì…„3ºx¹Wß*Lö?ä|Ý@13Ä«%§‚[dœY-@R<¨.‚€íØó)ŨNm'Y|ȳ,^.³ÏBšã§A°o_åzCÕÓþ—wÁ'èOí—$…Š`»Qϼ¨þmg€1:ԯ׷Û7hY$/Û D·†ŸôÔê0êðòw9ãɉVsJ|ÏÙ|?õöXµ÷D KÄBg¸Ê3ÚB쩽̃~~œ.¤r¾£w³?±³<¦z`D¸è|ë®G“_ÿ]uwAR¸ìTGÒX êek›IÔUÉ4Tžk“-¬¬“|ýý7ôéú'Ó—ÞÑÖ56 \`‚ÏÒ(®úúŒïÛë |egƒómæ8LoS+žol”žZÊ[0ãà¡p:ÈP…`ÐUä”ïâÜÐ[bľRN(ÏSñüøkÉ}2ñ“|Kü9*ÿÝëÁ/(üÙù¨Ï´¦×ÇKÃ5_J¥UBÉ µâ­¼=Ò ê¾]®JZš¾äógl~<sþþü'²¿ßš¿I›×-ø.¿˜§²S›»“+{lÞsñî§wÐ ×ÉPàYê[k Xç¸Ñº“+î–§?‘´ú2iØ.¤øŽîb>Ÿò꽯à?6^1óâSCYQŸNq:ÑÞ¦€LE¢¡’²8ɤË4Wcêxé0b~„ßOäÔøÇËç?n;Ph¥Þ N0nw­R-óOÚëRšêo¸³­o¤7w*–ÉIÌó#´m ,Ã&­Ûþªk£jÍÏŸÒ÷ RàMJ{ô¥é!€eÉÑ\Ã9wsãè€M,*´õT•²•Uú$õ{âà§XÓÁ7£ÛÅë¨Wô}WN¯+¢ÎG°<ÕìRš#dAÕ»ãÜým»üC|Ÿš]´à¬`g^ÄãÑvúÊ@ÍxÉÖ9Ž~çKoÂàÙÝ¥©O=RÇ30ûæÜù}ŽE¾À&¯ì>àË™³róT HNÀFËßV¡Öù¤ðsãóãØØ³>èd‹£>XÇT+uNãù7ÿÆo7Ør®¼äëbô¿«¿ßßξhÒéÈ>ön¡¿ò•àÁ޽<ðƒŸäë\y‡l¶‡Ã1ºÐ’/–7š8” ÛA¥ào™ nÃ1XgÆátÌâÀ;oéÖê‘\]A]F)}ËOo½Þi0BÚÆOæ#Sqöœ©hÓé4=Ð<éû>4Ð~55KÆ.öh@aZõDרEä͵I±¢Ö¦6âj›AD´¥Íšî^~Ù۽䪖‰â‚-ú{Þâì¨Ed[ë^#ˆã)ÕOío§ß~õ^£œ9@3tr+º7¢=ÌkY?ŸÅòQ¶„ûǶå–wÚã·—Æhë KZÐ @ÂêðŠö\Þ¦8í‹®}] ¦,"Áª<4Ð Òs‡Œ¶iI²6”uX ØÆ/»?µ}¤2‹Ã4r½YšH…ôÓhP§ŠŠbP§ÊQÅcçk9ÿãŽɵ¯xÿL¼‹KÙŽŠã|”e&£­{ªIú#ñ0(d–œ”;Ô%S+&c"P(µʼn´”ÝÉkÿÞõ ­Dí¸Q 0´ D»ð2…X¼žûêÞT?¯-Ü]uÎ…;’¾i| ÛÇ€}7²ÆÜ‘µEέNõC§Gøltž2úâ1úç0|+(G~©{ž£3¹Bõ#+?VTǧŠsã[¬:ˆ£¶ê샲[«§ÓcSÜ•UÕòù[z£< ¹•‘Ö7Þ?¿XWé†õÞôñUöÖ¯ZøvŸs&f0Á[)hfóꯟÉô[ÕôøìÂoó<÷ïøÑ#¯ïêbœ.OSãü·×™—ïk$ROuì9ûëÆG $Ò @)uc—’ÄBT±?|L~\.ed°5à C÷9Ò{Á÷û§¶ìÞ<$9 ­%Õg§aÈ~rý?ŒÛ?>+Fwõ㫸U«™óÁðÝA78N< l¸ ‡n4ç*8J5H´øË¹ v«ª5fïLÇ‘êke:Ù扇ºf¼J’úÅ,³×ï-¥ QÚMC×{\v7^ªmº¡hö$øv/(Ž®>&:{Æ]é뺮ž›=ÔíHG.ñâi¬ o )8{éš«®}K]±¼"žJÞòùÑÔzFÏFªoå¬TŸ>¦B¿6Eë® ‚ò©ë‹ƒ«×YƒsT˜E»%›ö!«,ЍØrÌy)¹K©ŒôÌØÝ_„Dû+ël“ë¨Ø0¤ñW>ãzÿþh…1íÊÃ…TU‘@ÛÝ^êì6JÀ#q•jR™%ØÁÈf—ßÖ<#b"F–Y¾xšñÈkò:kšR]ÒÒòoÃÖ8W&/J\útë¿?zçQ†Œ„¯)®Ôæb>Ê®±=OŸÇà>ÞÑ’Ú¹‡¨á´²¶ Ãʲ°Ÿv­æQ» Ìû?Ÿµ§/¸wŸÌQÍÀ-@䇆Ïe*sQÚàúG÷G#ÔÓc”‰b+Ü%ŒÒH‡1 3I‹»ÎzèŽoòqßo—ûÉÞ³Ž¬ž[ Ö²“4ÄJ"È ½Ëx €27jž×ûÏÜУÞè윻Ì.e¸Ñº¯)!}á’ð˜8¹2•9h1ÈSIüXo¿Wú«ì ®¾$IΚ¹†z÷àg÷ÿŒÍßÝx‰ÛL÷wúŸöùù~ÿ×Ôîæueí5œŽ8¨@‚‘l.¢í^$~F‚–Š¢ Aw@}…~$öv¾f\,ç·ƒ‘íǪ^ܳ€X „ÙÈG—¦æ2ÏcrÃ%97¾¹”rä~K\ÝC®B {Ô©Yû<›O7ÔÇ<„³ÅÜÜoŒÑ´Y’u Šw¸i2mOžœáÍ­·´gQ1lž‚:ÚCΕ®`GbjÊ'ÙÏ 3šDÕø†'gl»JsŸ7©Þzž22À¥©˜n' ‰ÍÊ dÅ„Q4€¨ÔS´E²$‚Š!5…sˆ[²x°º9jžêO-B²q” % ÀK IZ€²ÀNJÎ:¿ñahÚ5Tгph«#@±PÚ#G‹å•%y óÂs’¬÷‘/µÃïÆ€CF qã-1Ã6´"ã Þ%Ö”)LíIùhìxlÇ–Öi0ÌÔ2ÒŒ  !ÙŠªˆ'Kƒˆ! ôÙ@2¿zyµ¯SBwtžªu xOw yjí!ÜXÄea[Üñ·—h!Í ~Ï~–¹©wºÛ~FÔwezƒÏŸxßùJ­³²ÐÁˆR+·§ŽF“×sÏ(®Œ Ñ:˜õà’Ïjïšâ4„Z쨎`¬¦i<"6aUJß™¤ç);:É8ñ}'SäÆûÜX¨?vD!‚!CÑÈ›@\©*ðÉ„¥¸ëEšVÙ _P·R„Å Yˆ£'êõAÿ³È|¯_EFÄqß%Ì’l7Š'Õ1N–Ú¬¢k‚@¼ª"&ì åÕߨ©+”¾C›‘ò[s£ï¼ï]\±Û‹Àʰ„Å’mh¢¥JŠf5tÎL€™I™<â“ʵ·ô²n8ø;õø¿ëÏâ ©’Í9âN!ȬÍz *€5•×çr é´ †Z‡2 § ‡!B*YU¶ÀR\¯bú³|¾d €H62± Éb±Õ,4²i uY‰í‡Æ) ò¼],')Í=“$ ¨@<Ñ=uöB®!=°ózÅ,¼ûL)}6}kQÎ'[\½Õ}Òϯš[>T$¯þt̼hnuþÝöà‚Ñ¡Š¯bÅ…LT¡!¬¨Ý÷À*ˆèÈN\ù¯°b­Ÿuâ1´¸‹•%~ÀXƦ áÚ+Dò\Ø’) ü RǶ¬ÜKP?35›^MJ-\¹Â;êWø|;ñh‡ˆØªÓÞÓBê1Ï¿ý¼v½‚|Y»?Õ]«Éãðß«è½ä|¨Þàº;בIÅ´Û^ÅéaÔœˆYÙN£ŒHY½Žˆp©¡ÉÒôÀ}ç/p}oáBóòüÅîëðo<[ÏèW­_Õ¾BÏW÷mçˆÜG‡×Ý;ŠUhèÚ‡ƒO?~õ<¦FX_{ÞóíRêËpÝÞG7ÔÁÖ»^G#¹Æh€E³ ¡P»ÓšãøD1"#î%‹Þmþ*¢´µb Z¨i…ÅÔ„`ê¬wy;õFLjI¬‡/†IßýÑ}­ðmý§¼þF´¼€Î` ôæŽEºò®æ èuÖŽø1¸Ð/¾*®p]ï—„÷n®RUøŠ¦dŒ©µ·F…j—WꜯúÛó|k®:~Y€×F‘Nt\$âƒ`¨Ù•²c&Ê”×àÏ @Yh@‘Sz‡ò¤÷¶‚$/Š“ƒøÀÞkˆÓ3Và Ö;³¿ÔÁ5Ý„Ç[ Ràl]«?‹Üé° ! 9€FP=zÄÆÇ_”²sï tmzKèFа¶Åi׃ý‘*?>Õ|Ÿ'ódX•òÊÏEnÌvunˆ#öˆ!ÑT Ü›¸n|•›Êû`âljëiTMméñn¿:øfI˜%3ÞÿË+ª½»Ói•þ_Çäód[îÒÚ„ê†ç_…õû‚þw(Zè½>ùp3É«ÞSKX¼=žŸ- E²-4á‚Ø0Háªkî _küÛb~\ùzéáçÞ”*#h‡Q-c¨PØ01G’Û|dÉ]­1 Ñ…ì šÔôÚl”’š,¡¤á6EPêÇqdÃÀ"Ö˜önkŽo<ÞõëÇõùw mÓùŽkQ[¨ÑK°Lt|è¶æõw ÿN>ÙKü¡Þå”0‚¬¿‰¨€—2I‚a Ï¥/ylCÇ›8ÃñŒA0B¸`xjÀ ¸“°QºÕµ­"!zh¯+¥Ç³ýuµ½°-CîÉ ác‚"Cß§mHTµe š9<ìèõ¸Ø­®À«ºbµ9Û‰÷©QKâ—Õ?¡Íx"ñXwö=Md[®TÐÈìÉBSÍ¡Én6Ê"#eb% Eã¿ù)½ñös(ÔŠ>ñ‹écdñéá¿úž¯ÿ“{ÏòxþwK™to£³Æµº‡Çz•xö'£Ÿ·æ¿w;Wøe&wP?ôêŠ{Ÿø£ô1^S󑯲g`1›B¶åEO×›KÄÏ äÇ[Ç/<éÂnJf@lû,MŒ#ωàQx¿2¬ãhhWø®8Õ6oÍÒWž½Þ?ׯ~ÄÌ;ÿàlx|Zÿ#ðS®>¿Ú?ô¥+~®Òûã ‚5N,jÁ^xéQbwãùõN¼tÆGŽHàå2REÏà-CäÅ‘Aì‚ɩɣNzG°—êFך»hºWÇÐMÞ#M„“ýb²¸øB@áòF¾p2ÙÛ5¼Ç¢xSXåë9­™±ÎÏç縉λ7§” •ë¯Õ0ÎsŽ›;Z‘ôXDEÜ…–.L:þÃß1¢9j J1ò9ó3Y'¬Eãüð¢'Š.Á5ŽÍ¸€‘Vå‡-j™OšY#å=¯ïTúI»ÏžÂéq£òšˆXÌBÐ$¼ ƒ®•éÆðÞ5l¦®ˆa Ó‘¦+•±~12hz³_ï1ãô7¬Ê:.`“ÆA ¯·Á`6?ÞÚ0 Òˆ±¦•:É…mQ+g{ó­©¿ÔüV^]2RÒ%°6žÎ¬È²4-: kíÔieüë‡÷-Óå7õšÅÍ[œLECqì-2÷»k3<¥ð}H¶)P7®^Ü4²µV~û¦NGrÕóò±w“â%Gçæ­9½Üc&õ‡¯¨þÎÓ3|…4áòøµA1 À}ìei.ì™qÓÓ.–ª © IÀ C£9Ã7P}­ÁYŸç;J¦nuAâŠýƒº}Ùà ZV×EU0É™_ãÀ@5<•æF­Â+Îä\H—dÀ±¬ñ’äLªPçÓU¤£È˜×{®¶ïmkȱ9©y8’¹(’&¿å-m,×É+0’Z€t„cKjàKR,"4Ä|PHÀl¦Ö <žy7ôX~Ñ/Û¼€K‹»sÏܱ,ÊÇý¿à¯ž$é*!ÙRý4Yól/_Q¿˜?]LɵÉÄg]ŒRHKÚýQÎõ^î¡+XâãäjÙÊ<ÔãÓú~'_(˜ø˜H׸ÆçÊ™Û|I­L*LW¦A"¿„µÆG3ªLi Egx¦eÊH¤ÏÐ.÷çÚ Êà×øQÝý½ésf±Øh[¸™t‰’” iá½p×µ®?ò,‡Ì’žñ¬J’”F ®¢P1¬3•¯ñVJ©ÑÂŽñ«óOCÖ =sP§1Ä@éóœÑûßõÿäú‹»µy˜i6á—ïï­ýƒ•œšÔÍ M,ÂØÐâÔ$8¥óœrlÅzbJ’ç:=¯¦nÂV:¢ó‹óï³½®ëÇ6 ”† †a1¶T1X  Î+›]èœþün†ý_vY³Û}º¶žÔA®¸š¾ëX{4'Ãwf2ÌêmÊ*møX­°$kBÌVº·‘õÁŒmfƼ)åK Ø ö•XuyŒ¬ÆØŠ™$–gaYÓó‘űvÍV­y aÒªEÁ±5H5#ª9lˆ%T±(æØù©%£¹;È‹ÌÄnŸª@±£QGnhT¯`â‚0ÀÕR.Œ«žKγÍÓh©E™b”Œ2e`pÒ ¨Á¬N„´2Ò=2Á[íu} -?Wh6ÛÁ™¤Á÷™J)í=%³µC¼!¿Æ§r†uÇSƒÙÁ;qñÖi8n̳ç¹KïKÏ…‚Ò¶†fzNñZ©þ$)æ¡Cµ(¥:’´÷U=Ë%G=‰žÁPiËûPñ{¯ê…]ø°Ñ9ýøL;3g«¢aªbÿ~p¸¦Ô÷¢o/5õ¤£OŽ’ÔÖ©rõhq‘…”rIÊp €±ëí,vŒ_ÊWy",Ó­R[ ßXk{hfäÑ1úà¨ëÈÒåÚ.J%ÊUqÜuµ¨º!-5!kìµ%€)¯'{j£^â1…ÊJq*é:^•HRÂÊ6,u£ÕÁÜr4°Ž¥ÀȼDO€¹ú³øâ Ó€˜ Á œ’Wñ>3—ÿ>þ¿7áÊóñ?©å>3GŠ)F"„ºCs0Ív@NF(È'¹;’‘ƒ8bâ[À]‡Åî"j C†#÷íû!t„'¯Ð®(-¤š™ÊÞ8S¼¾N7ž@ØŠ¹_ôÚŸe×”¹ù O{•Œ2šL¼Ud ¤3À®PHj"—F”òak[¼„]Hb ÇÌ ¨™ä*M "Û0ث‰ÝíòÍÔ„TC¸^YL”'Z˜¨PЬ’YD’"›3™)“Sëñw~¿ÒÍ—Z±2-H´œÚ´Y²™ýÞ3¶5¨8.54Lw]Ú ªY7)ý•’L<÷MpE¤OÆZŽyç®ÎþìøS ‚#TtÉŒxìÅUøBQâˆc‹Häm©ìÊ Œü1^Ië+_|Vž€Â•Q°òÅ5 £n ƒ%»T,,úZ|íÆp_²t#Ñ­ –›ÊãOyûaöÔ~ª›ãœJ߇·ÓÿzC-¡¯)ƪjð¿?Çs‘îåŸÛ÷ßXÿI5eÿå4÷ùÜWÿûSß_µû³½°Ë²OÁÝçÞ”µ>‡ 'ñi±Màºb¨´=¶Õ;êfw|Kÿ‰~RÏ-yB sœ_N&zÁüÓ’"7Ð5ÚǬ8}9!P>§ˆÔŒkŠ÷®=íÒU¦ºhÉÅ3í[ÞÜÎô^Ù%ò(¢í$¤­KY±º;íõŒœîçcÒ¹nZÊÅjóï>ΓGòz50–jóœâ:êÝJæ¬ÀÑC‚›U)JGÜ ‚ ­p¢…ÂÄ@bU«ò>lo肋Så$ŸC'NÚ{e$;¸3u –)fœÏÑ~Tp­«.¬øýžïÝ×çõçÏϡ٬͑¹ÊWÉI©¶®œ=„Zun”óN{‰ Ãz&-;üvì ‡ˆäϱhø¥âHˆâöäÏÓ·ú¯²Æ-iàA`©N×éÚb‰\·cz*xÓmUäU_Ι\¹Ô׋:Ñ+~Ü]¥žUÚ}Õ&\NÝ|—ÉÂmѳڅÀ/º·czk©`¿ëýñ·Éôí÷~F¯–ö<5éYDÃ>—žÌ²¨‰Þ9¦Rí_è±gØ}Ï´ßOêu†Þ@↺©)ÜÓ£;•é ˜@¸ázwåÇúŽ{ˆ§„62¾= t9”O„UÏ_77Fê,Hˆ¥Ù]é·ö¿ Ûë⻋>g6A`>é? :¾Ê.?Oá%½âY!–¯k °,d«ø¸÷?týóOsUZ_{#‰Â\éí Â*J¾dØþB;Í…;ðE•ùƒ>Õ#ãk¦¦Í¥Y,ì|qK)ÁSñ5p»Áëν£Âmf–XÀ–5‘Ã#°éœõã¢WéÃúÚÔÔ±çó¹~uP¤óÇMï<ãS&~vªÛâë${A0Ôr›ã¹Ôos>ŸØïŽØyí\7Ã!b¯mÆæ@pºº¡Üc`ÿÎfÖÐË ñ×´pZá™ðT|YÇ–;–ÙÄ)Í›67÷—€âZ¿µÝÏy¸ãøiCÎVôxšoâ|{€4òPxþÍ;k-Ë¡„òÙôdhbq½î ³‰ºIÉiÿ°â߇?"fpëºäÉÔ0 0» –=`©Âp‘òÝ›Ÿ[/m1Ÿ×áÎJwÊJ@,ÑsÛa<#Û„A‡y<­éõùXñ­îœùëö¹žÑžÝ#¤aÚÀæ|A¿î~ßo‡˜!Ãê=\½˜ôíÞ¤3£Ì¬FíÒHî Ó&ÝvE 4c*mdš\Á5¤w (u?ãzñv#çPÞ‡Ë8E¯ÔÌPËùr¥¶ÆøFضZ»;£Æ†KÔ)…‘×å_b~øÝ¿XŸû˜sì@p<ÿ—þݳ³5²À[¼ý¦¾–žóûè‰ë7gN_|úËuG7ófÇU}æUÎôó¡’ÝPFë׉ó W>~[O²gž-c-€=÷£l_JÈn·6yá·’Eœ6| V´eVÈ]sô5s¾LœªP­m§0š¸0êäªrPëe!ÙÑZîpý4jH¢¡mí‰äÑäîªCb#ÑÇ"IÇÖ**ý¹ýÜ·‘†[’aS—=Y!Ë c÷À.åÖ‚¶ -ö¼nÁp.kLWV+Çô¹\Á!/àe&’kYÀÈYòƒ Û«0½l³1®ˆûR9ßE€#´g{[˜†ïJ¦i×@˜£L&Ûh¶Q´DÐtÛ‡6Ž›ëÍ’fHjå†C~<þV“?¹ºTµC®°»Ò—¿%³ ü]ÿ±þ(tüG´~ßé߃Aòüýê•>l= ”€ ‚ÑÔ.÷¤û, í¬x10šR €–h÷†ºí"Ûf T/z·iwã(Ò¨¸.œsoĬJXâKDŸF%WE;.8TÒqÁ‘ÄnæÔp‚m·•xž-ÅÛÞ† W8b1.m±vêÍoýÅïzlZÝþ8‚Œ°Œ,÷æÒûÏŽÏÍÑñZ¬ÇÕÿ¤ ™üçséO÷ÏW½eãYà Wvó!uÄ™”õ˜Nû^}ŸÉ©[ûü³çóRñßrë§?ÁF-.j>­¤8Ü…Úoqïå¿ÑeLU´z¯ô`‡E¡P"9€kA4`íhÌÎá¨^ùŒFYŽ&÷Pœ›ÑK¹'£rFû¾›áìã/½"—rëGÁUƒç¢§wï®ÇÁýìà¯/Ä«ýÐêxô|ã®\¨#æUÏÍ ädWd Z‚bbeÈÇ™S±—°™vçlCÔ Ôɹ”ëøpõJKeÉ™Éî;‹0Ï{ATÐ&‚M²ñ¡xž™›]XªÕCçe .íÕ0fõ¼Ó×­Ïþ¾Õ½„åÜ>ÊþÑÓ_& et§xk[y¼…t‘ÝH¨ÒXÛ–f9]§¹f—6À‘–*Vºä˜’qMÏki>q‡Ú¥¢ÆÒZ •zªÈ:ý‘Áo=:Ý767Îæ‡° W^'Mæ0S¯Æw\ßL ívaëKOY‹´ìW·ËpŸÕÐ*(¥úŒðEF_èÓÊ`7w7¬ù(UyÝŒ:3¹³«²ëÇ8zÅ ÌT¸ÏÌœaÎ ×M%£W6V¦]8O¨ +õ?y:s35’* H,ãC²‹›¼N—eÃ1ÉBÂŽ†à‘6BŽ‚! smˆo¾¯šî~˜Yñ)é·Ú|KyûûñT¶¬‹Ê‘`ˆH%W¯¼J°ô ß!Á$ÊMQÒ¯‹KÂVY­ºz¿2^÷ k¾ûî-0˜ÏøâãЫ| çŽë|ù¿™PÒÒÉÑe4£Ãß’£Ð(ΧâË«gT N‡¬cnä•ÈD‰iÄIGTÙ1(Æ7á‚ÈÄn5'`D*FR$5å9r‰“¯V ¨fœµ;WSç“u„gèµt`Q+&(˜Â«H¥¢R'ÜʧÉÂS³[  “@ƒcRdZ5ªÃ}Ýr}%2 LK¬K ¨6{¬:.­;ÖÊÅŵ0€tBº.mŒøQýæü>Ǯ慄«ö©ŠmG,‹dé‘— »’á,¼ÿJî±çóÞS›ù¸ò·mÏãÏüØÎMk ÙBåC¯öܸú–U¹iˆ,aL‹T²î)BÓKË ßÊHg¹™®³âïðºîŸåh´ê3žj’¨ÝVլЕwI¯PŠé¶•¼ÒEq´¡×ã“v•qhÐŒ¦‰P^WÊdqL”×7^Dº• C»Ü êÿUö·ûËC_fcñL¶„fë0O‘¿®_×Þú'·æó•”Õæg™—_Ê[³îJ ¬ +v¤Xl•oôôfeyŠÀÌ€b¬ó«õd®>¯Wò£÷7~D†è5'¥Þ|_<Û2%… (Øb!bSËÑàÇó[×N÷«g_ׯ‚Ýb65ëº ©¸ùxÀõtH¿1¾Ldj½ºØ³î‘ƒ®º.2 A2PzÙ°Ú\$&!£f0Áˆ²±2–@Y6K{„ÔÝ¿js£ó¯ÎúZŽùhQ$})ŸRce²FÈÑ¢Ã@b‚€lL`!E}¨RÌF8b‹X0ð*š).DÒI¥wFšÄfb5Ð0—, )JŽh•qˆñºViåÖÛa”X5ˆ&è*áFTD¸²Jbæ™E’, ,ð0!æ2ßÝ/k?Ÿ€„3Ä÷I4SùÁà7‚ŽSÝ`cª(>Ö‰²(AJLÕ „úU4ÕUg½óÒ݆uj¢¤ô#ªU£ £á"ê0ÊÞõÖÌ©·ãe²ٗâãÚû7 ï3[l`”ÜÐ)‹œCjØ€@AbaF4[*&ïZZKWÑ1*‰‰D EI²Ä g sÖT¤pÆ„—¯O_ñt½¥µÛÜ+·<¼Ñ^>^cÇ4²G‚¯èÑŠ|›±Ø¡'UÅ^=›xÈŠ)[3€‘c=df+ªu¾‘ ÛÉÛéýã#ÃÑFL‰N>zaXjE%°Cë¥fQEæhÂË ñHÀ £mÕ˜/G@H¦™Gƒú˜3WÎy^Š^oçµKëäwçÒ¹‘]©{ºù•S~  <œ1:¸Ër½çuø½S°“·ñ}ö9—á„Ò%%)³,€f:³«àèôʱýfÓä"Ýò'+ \’0\¸¹*Yþ~ØÕm·ksB” Q)!ùÜ5Aíó˜cÚætöºWtUl=Ì+ô(Ž €pSh7VÐ*¾k|äI[ñv[ÐÞ¨[±›¥/c¤mã1éÝ‡Ž Á‚-*¡»Ñ–ÓF>“_Ý»í®ÏGïß½h\N„ÜÕ9› Siâ'«MhƒÛr;â'ÔÏÎ,‹ÆjKG”ÆDþ ó—j‰ᇠ6w5ô¡Óao–¾6Á¸-§Uÿt€XUóf‚‡/ìÄøbõð1ïž•ÝÁý£O/|ò—x<”6læ¾ùC ‘ÆæžYgi_/^æ ó«ÿÊÏÖ©±€\ï©ñên-ï?ºs\ýOã^Nþâ×1÷lWê ú®-Þ×~xöS}vÕßû;/¼÷ªû‘WW]”D«œÈib¾|ãwÌèÎóoÕL–_2žK«ƒ¼0›sµðZ¾šk~Ì’ÁÁV–2‚m_…Zrg¥€ö_4 ‰vºÙÜûyþÝÖ¾´{` zøHÀ9\åÝÍZòÄ=&ÌàSUkýFDÓ·ñ–ì…ýzm3­` ]oÌLöÛžðsð\Ó\Ùz|ý©D‡qŒ;¬,·ìbËRÈ4îaû ”¡m[ÈÙY4ÛÀtӜؖŸE¸çݯ3ŸÝͺCsçMe|-ž;uýÆ9žÌ—“•9ÒØ¸Á’Onß=z+°çÙØ×‚NÏ„–ɲº#ÅS¹'¶x2 Žér…¥§]:É$ÐÀ‘VœÎp¿§þòÛ֢ܜ'J«GôbðRìg1V ˆß?üµË¡Ì¯¥Î ó>qþiËÑ%áÜ䊂¥Œø‰õåZ¢6põŠõþç«ØoNõ6v^õc›xiêF:°Vj¼ÿ«çÂ(ŸÉG7»¯_ŽûùųF!1â! IllY޾UÓ×%~^“ÙÆdyÌáÉÈ®ÃNøÆ·¨^}iGx•YÏ]ûq¼ÞÞE¯K~ºi…t’•ܹÙçáÜBVß‹ó«E¢ª¨-p.TBhƒðÕ O‘ƒmç°†LsB1¼#§ìЀ[ kTÊÖZmÖP†›.!Mm—êZ§ï¢ˆFs– ¦]É$²îmÌŽÆ©P@µ©ÄYØwµüÁñÚ­v|Ò8¢ù1z_vµ…n~2B¡àz(èçl×n¯~z^Øg3úÖ|ù“ë{d?cx›C€ÏÏïãœk;ÝJ‰‹Íb ±L­”“عžéÛ2ùLË­äËÀÏ 5ÿðÉ¥ŒÂÀyÉGÀN]5¥nuV=–¶ñ ع‹÷$ûj¶¦Ã–·ãY7r\O·=ƒqxP¤§vS~·½Ÿž li}ßäÛïǯrßu“•÷ØÁf¾#´Çbýò—ýáuâA²ˆI³™);ÀЮ«Å  ñ†¹‰ª¾¶ÉÞáð$ºÏ½Av¾[K:±w²Æ~Êïíñ( †p»;¼¦i«B,ÅPJÄŒT%5(M±6AþfbÖBkeæ\âÕši’}à &&”˜sñ´ ¼¤bš%n[A7I©H" Ä´k˜Çq`wD‰‚]*ý°üŠÃjŠ1lÀޤŠí4|–—”¯MŽàëü`Y—é ~ܺÊYìžF.Ÿ¦R'íö%H%hüžVZ½|Ïæ|{õgqÕX|]ÐûL·ðãdR³#z¡j˜ŠL>ñÖ5®*í€Ç0‡”)ª‘òd2œ‡_81w~‹Á»×÷Ê–ër¬H†y~èÕŽ+¼U= uöVUÖ.`b‘jª‹1uÌ®ÊuS›…Ù;×~™ì[ʼY¹‘#„Åaõ(:¸ù9NmÍä3ðXþmwmê^W¦?@«€‡“Ié·•¯Ò³à†*‘ìÒîÂFMêyÕœãÌ]ª?èlÌ®¾ç¡îدYõˇ__ÈÙâ/®ê¯0Ä«øhJSZÎݨ¯Ê§Ä,2¼ÿ"£=÷€¿Ð u©…«:æU]ÆÔ,¡†Ê$KZ€*XB[tËÈ*ª§êš$d!Yf!q]\-©”×ê>í˜zR0!¶´gÎäøÆó¶+9Ãe©òö4®…`^þqÑqÐ%ÑB†ôúÂÖ «XÅA‘ÿ\÷mM?·—§‹OTÛÐB4²gê ð†`&]}úÙ¯ú«o_î÷\¬¤*¿çî‰èŠ‘ãú±^÷ùØ šqÕ¢`ƒ‰˜FâPÕÄ5œÝý-Ùçò÷<À™´ »šež9Oe|ÿë__ØÈ%pX GžW°Õv)Š޽a‚P³éÒH{eÅ€«‚µ‘ÇòÆoeJË5•gâ[ÒŒ®UeºM+C1:ɸJ‚Ô1é¬e*·03±ËTƒ1œV C†Hy2×Ý[ÊŠ92ä+F./`Z)ªOÁYŸŠ›Cm¶ÖÔ Lóxñüù—ÿÚ÷ß{Þçµ¹3ûó]+Zs ë çò¡Ëø‰Ã°‰'-Hh6[=a¡ï?©7I¬éj’I¯Kžøà{ièVëimŠÂòâŠGZÆ@"ZjͤH>Ô^^F`'¢Ð:º.ð1-kRj)T¹j_Ûæ’¶Gãí«Ã:yNôEc0fÝŽ2Ö:W*µë9ºïÉ´P¡3*)dVj R#@¦‡àÜJ9]õ—q’ÔÃóU 5íö NjEV%Ï¿>sürõ.[÷ ÄT¸žú±šß³›³›žÝ!vJ…ìÄ$ŸMŸC×IÕ+3”U¹ - :«$™<² A `" ÁJ(#Pa ¹ ª`¡^cÄI¢èº†"p8Dð°QR¨îjÏF)ØÂ‹¤¤D¼ìû7üÝÚs>ƒ|ž»ð{Ø—:†¦Ñ3Õ)¥8Y ‰Fä¥Xq8¢ ÒS²©¾`¼ž<_6ÕjÙ®’“éˆãÄ©CØÄ$T©õ¬<<¬×™8`LbÔhTí®¯iÜ„·9p*mˆÔx7ãä—=Ñî0æ¤}\Ó(x¯¥FF;IÈ«}ÜðQ=†âˆèKmïzÏÉr—¯°O*ì~ \“øé½Áʬg¯{§oNÍÑrvwH‚?·Âé6¤€<€i’üªEíl<·û¯lã­Oê¶íT²{£¡Øô«XÏê#yŒÖŒ…l  åºÓG³L3 Ûe¢º§VdDZ Ũ¹jŒÒß ¢ oÚ.+íX‡¹LÊ€ÅølÝ`–ÜëÇaùdÿÑÇúëY¿wµÝŽùË ù²oÈe¾éI XÈô;»£f‘Á'nKòÏt6l“À7cKËÝVb"³S²[…"QVгËÌUy)Àš¨…Ù+éÔ}Y̰HŠÐÅP¼ûºç–Rss¹[(F6±7¹ H¤2Xz_tèdr¡ul¨®S€å@’0쳽ʼn´^d]µu׼׫]ïfMãäÚôŒ»U8š»¹ç_Ý?>\/߅Н”T.´HÙWœ̰á/÷ºE©,†² “Ã-QýV·Õ¡ôª¸t·@Ê‹ZNÏ¡£VÄØ›Ë£Ö³ÔøÖruÞ¹Íçi}9Í&ãJ‘6òµ*ÜîÎÏå¸Ðvxqåa\ÇÞqâ¸HÇĜѻÉR5S"RæD¬T=Ò/´?ÐZ™»ãÜ:=±—ú:ë!Áy³o»dÀ£ËcáêO€³ÈŃ¿‡S"âE`e‘^¨´¨k‘¸7oã‡ùi,€-j,2Z½¥X† ˆL@,V‹¿¯Ë¡$Œ¥ãiºÌÓ´§YaÙAW´$Hêí½æí·;¬MZâ šZTüÞæ» Ÿ¯Ì†œ¥ýr É=ØŽ©q÷¬TLÞŸ^º˜YìÁ·nàÙy»ØÏN/â'ù@”Ѐ‹“(U W—Û¯¥ ±Hƒ¬¹B…ˆHwµ:ø…ß kÐTqÕo«[Æ]·‚™{4“ŒŒRa`Ϙ™Åy.Þm<_¯©J[¾´¦%LÖ³ìIc©Ä8(‰I- GQ¤u£Ú·þ…Îç§±·CékÈÒóšÝÏQ'j&ÌyðëbøÌÀ¨ò¬Œ:5{09kL7r¿M¸‹tË #TQ2bl3b*`dØ:I¯ÃÜ¥Ô"hŒ±¥›C)Uf*MD J8̬]ûåÞ‰ŽÎJYȸÚÕWô£­›!Ÿ:ßu+¹È£½?ÈÉù™òŒÔÜ«Ù͘^š={eA¬N˜T‰Hù®¨÷0^OЩ0ÎWâY`/¤ÃI HŠ%§F;ð±K\p©‘.sÅl¡Ì „O©Ž™«©k÷cíðû×ÿ›Hþâ¯ÓŽþ¸Í=N«ÖÓ]Ë÷/oŽWæËËÚ‡9AiCm+…ÊÞyUûw[ût›èޙ˵Ã˱<£¯›Íxº¥²tH„Ÿ+Ö5=å’‰ÙÖ-äÊòççÑÎF¿¡Gä½qbýšOJ¬cÕ¦CGÖPƒÀ|¹\Ì&¼Ø.Ž/º¿mcwAÒä‰]ÎO-7l½cÞ!• Ö§"Gع&ýàïjãSÞ>¶ÈƒZÛ‰[6€‰ÏWí»¶Æÿd]p0©±{Ä´D$Ïy…'zÀ±Ûî£ûØO>ÛX½wϱ´~ÕñÕ„gˆ½ Zeóm>ªéÜ×€b<ûWþð UÃc¹1Õrò•:zR®Ð‡Ä÷ÖxV{ç—d¬‰¯«— سó|²SšýØÇ”|–‘*'ÎĪ1®q<¿O Æ·}„ê&êÌ£ZdÍëþfÿæïËþ/Çëó'åQG¹µróíW·gdÏ)ï›ÇÑB$ïò°»7š?Dp³!:[pÞ;6ìÎÏzðÏcœ|” %ä2ËÉ& }¯{)eNƒE„¥+y[Ϫ_›½ ¡7Üêc­"ð'2!].°Ñ©'YªÅd6å/5?_Oçãíýùÿx”¿L?¿"0üHTkjh÷Ã4‡º/ÑÝžöfÚX êÕL^}â'{Qæäd7(ûÀÈË_üÁV·Ëö;cgtÝ—‚£TÉÄÒñ0ºž>M {óº|-æ²…r5ã~ÁË xŒuØÓrGñöÚËO\ŒÐ»\㛺®H¯B†„¸Ñ(Òó)~¼iܹ};1P91ê}T³·¥®©(@ìHUõ8ñ‹ýß­·Ép´žÐÉà"3ø½ûø¼j¿Ú w~xö7sÝ“gÕ†R&m¤E†±„Œ pZ”K¦/+çí/Ç©§í]XhŒ_펵ñšÅã5{¼Î|Oï¿‚ëkÓG‹Áàë㆞W÷ÝMþj&¸Öäs'¼Ó‘ÿxç¾ùrbó¯VÐ=ß@–h9íq’ß8îða#ÙH´åÅæJ$°/ÇþšÜïÀþ¾o]É+åÅÍ€-Œ|[œ.wÑ­u;ÇpGf¸jÔA€Uäþ÷†ßÚž66^ü­h½ºd"få X™áÆd6§²âÇÏ^r,ÎâØi˜ã?;p_qê¾¶F“ŒÃöÁÌ—R‚¢CÛN9`r")NŽËWé\ø_ÑÞMŸr!HC‹kFlgØoûƒºß9â¤Wj+9A˜ ¢ºPÑA¢q ]fÓˆ Û¹ÆÝo¼ð‚CßFRŽ!ÉÄt:9aÐiGzy $h/A è8„FiÐFÔDÐ@È|r9Õ® Ò°èŠ0rõ¤ç€ÖM!ˆÊÎ7— w¦öÒ7¬ì»¥õB¨AÅ£F#‚˜ª·”~LÁD 8ÌÌ[ÒzÞÄæ¡R¶eØ!g„êÓyÃnË%ä|VÃP¬jWaºGÛïË&ØÖIØøˆzhP©TŠ~³.š}ª|y+ õ %Ñý"è>ååο¼KÈÅJv,{ŸÜþdÒ6Ù—8ðÄ’uÀ²™˜ü»]o­lÅ 6$à"›vGh›ï¶|ðqÛ¤l³=rƒ¶©€d£µl¤p`ô_”ÝߘZ ù|ð°­×wòÜ2œÍ¨{hóöŠ^k.‰L/ƒ\ãÀ‰¨(ò‚g^G‡‡í|ç:I¸°#VhT-ûSã‹ôm5Ãõ÷š;uʱÝÅÆ4×r̾®Ð0ÚÄ^F…FêýWú-Œ)3 U$ˆ EÛtFF«)»¥­B×Y~]îEHÜÈ}7ÍÏz²•³™™£T·.nÕŽXŒŸ–e×î8dLÖ„P¢ „ºŠQd”À\õH?i”M‚B´tS@nŸÂØmSÑfñ7Ö_WÌò:+Ê#U¾™fÀÂS’hÄK±QP‹ áÁØŠ‘'$r¨´lB)KØ£™aXµÖ¡w}»ùÄNXé/ fµ Ñåèxœt¯„ñ:a÷×Þ>´"í0P®×§Èiá‹uG`ÈH¢³e]7¤ÑåIJ Ç}HáUE­ –H{'ƒSPdeõç@î¾ÃÍ*» ò`Sð(É&ÕšYåXÏ »Ï½ ú\ì@ ¨*Ūa ÔÄ ­Ý‹a°ò }Ä®å}£6>›¿è—>Žßš}çG³Ó„gHpIÁâƒ!H§ÀÊ ”̓C2³5ït6 Xv?mó”lÚö~‘¶)PD]ĕ󡮫a8³KY«¯þຢ_E÷}>ûs^ Ÿ =XhŽ‹7œMç(ì\7ü¶“kýêÿå6þãoðóøê-Pêz:ª¢®w~Ù}ž£Ifý¼¢Êº5_܇Ì),áÖ´±¨%Ñ©½±ÓÝtøÒ_"2++¡×–¸‹iEà  »HËÂ0P‹êʤTyV{ºp ÉWæ”ì·Qz=óØ× ©‡ËSøÔ8©i¿®¹2½q3>hQ)Çö¦zæQuݶ£P×9óI,£r)œ¯G I,tæNq{íÈdW–Y}óäµÅKj%·nFC9ð‡žôðƒÃ×lvT$|±‰+|äÙãYÄYñ$7HîHcw*J=LC¾ž5nDR¯¢¼®½ûé}¶qðÕGÝ]™éˆ†™ Ç……SK<ìP‘ìÈu4ɶñmcÓR¸`M„8¿ìgÁ Q4GöOÊ5×+É_O`ÆUh©¥`àÔ#µÇ4°å4„¡uâ÷JèѸÔÒ2£š鵯mgZÁóÊg?òŒa¡z@wœìQPeº"q2WÌÉXèCÝ‚N‡dà8dW>«c7Ÿ+ŒÊãSÔCnâÒ-¸DÀä ·»kÌä^¨Žf†#üѽç|õíË[_„JFÎÙ‚âˆÃFfÔ^è˜p¹3Ëz+$ŸËûìUáΧ×ÏzÜ|"ÿÏç Xð:«¤Ž¤vƒ]A8LḴõlae±¶}m_?Z©²‰Ûå/+ñÆr1€ÂMøØØ%k™¼wn?­dÌ€}zn‚{Ýš —šGK¦r·s?tòæPÚ6óþç(rcïÏÆäª‡ÈvTÙgÃ"–CÐsJ\õѺ™E„‹4;q´a°oÒ¹Ó0sa–bŠn­ö…Ý©¨"ªJÜÀFM£ªù²Çc¨®y¬(Õ:b¿ÁÂzôÇaà©,KpØXsüò+¯ïâˈ¶ãïÅÍt†5{†Æx’6?媓ž*-jƒ:KÔª:Y—“{ÊVÉcL9ÍŠÍvÙìËâ°¯v÷ažöåo#VöÔ…ðöÏtR?ÍîßZñ7®Í×"‚÷O¼ù¾ø¿Îï¼!ñûýF÷ò0€µˆ —?Ì|\U óŠláŒó¢G•ÐÒ@`È|Ž’²5%:ýÍpÛ% à¶þž¼ÿ¨Æ#Ú²6¢®–OðËV@Ùàk‹ˆoŽqÉ]q¤kçƒÙ“žS€4%7Ñy{ýóh¼¾,¾ñ|ÔzåË …­‡ âä$ëó9~ŠB< d-ØŸ°3w['·åײÌm(,¡¸»¼•ŒZ'Ö³8âÛxõa–fºA¥“1‚¾T}5Z½`ÛÓJ V ¢Ùl„J·Ë’Ãgz+->êaíò¤s +娹Öm’5‚¤àètY°é–ÌJÂlÇ£}ÀÅöÛp¿ BFCA˜² „ÇNt)5ñÊ@„[Ó7l'¦Û[ÞŒ.äu>V0@gMŒ½ÍøÎI8ßU=¿¬<#ßô¸‚+ÊgWã±oW0¾§íÔF9RýÈéëX‹u ƒªóëãáéª^ë Ìmgœ“†êÝšS4RÜaÛÒ„ÀŒ0”ç)JÔæû…vþfÓ¡ábtÉ-…«/µê¤vpóºÇÉþ•±Å.¬Uw»«Iõ’9Xo½í‰®ÆÉ1Cœ5Êì²ç“Äà¸{qæý| æ›9]ÑšÐä„õöWƒ|Í(E­Œ”Ï”BºK‰¨‹ù f‘J¤‘.šÕžØó}K?w³z%7˜±ªNëýYwÞ'ÿ´Ž][Û ŸÎëë¿ô?ð1<[GÇJ-Ø­Cá¡bnêmy6'ôÝØîeKf2CÒýÀúÊQ$;qϦC¥`ÙKo\{PìÌ5늲“é B }Y{ÇÈÖíÑ<“Ë¢XĸZæˆäaãçÖ;?u=­Ã—}$p¾*ëÆÕT&š6{D ‰~ïðÖê“…µÕömô²îZDª¯X?ºñ8D`Í1Î’à¢L‘Ñù½wµ`I—ÇÖ*zPŒZj-Æ ªà_µWÕ?Ìvžøpsyö}üúdeÞþ'ý m½sò´'ýKP胼ØTÐfÍó­×OR?²Ï“ðùßÇèž]gfŸVõVg¯Ôu\ˆpf—y¼»$à¢Þ[Á:Ý2±p\ Jé@Mä®væ@ðV*ª€ RÛ©Òt‹ì¢SÿAâ™ß¾¶÷¦WðDéÎ)ÐããóÖÅrR›ô˜k^W4Y¹¾šäˆ³óx¤îISTÕ®TnTš€šk^ËuCÌHÆ1žKsôë÷µï‡w„µïïÏûó9·Ø Ø…TÎÆS,•¤¤oo¤?òîù©î­°ÿG©SÓ65¸£Y0å)‹Œq?xLõLò?p¥ ì³wqªÈçMÕQ©Eùä"ô2ˆ—¾´Ä‘&V®"Zý¹kgg<µ@)S¦ã×ãú7¸ãOÑã&D úê£á>WMxœ,‚€™-Œ~¢¾,ÄÏê^"Îî8^ ju¤c<ˆ¿½”«âÂ+º%`ÔR8ƒ1€£¬p¥" I„•¬ !‚AZrÁ®¨ôuÏçãTM ¼õ_t ¦Dwº#ã:(@zÅ4i#!#‚E4h@QY ½fÝ3{Ra Ùû&ŒD(‚Œîât7ÆH`“ŒÎ, 874Þð0{çx­ÄªØ,IòàGüù©®m@èz\ßâå NK'±ÑH…©™–Æ5W¢h0Uxïížß¡¸S`­Yæ‹yç]l ’æ’V[²$³ž†Ta\«ŽaÐìy~è÷ YöR£*·F%¢vü‚¹Žùë¬E÷ )TEÆ¢›éaÈ\E¥î:äaïùLRï+÷øûñ¾Qìûú+övöõÝT·‡üm‰çñ&QµX<ŒÙ©œœAI‡3É0ØîÄ'°’™!E¤¥¯¬¦²q‹‘¥sµ ¤‘4‹Æ5!нT[ W¥Øè.÷•~º=ëghò4ãÓ‹+•ï¥Ú®Ä¡Õ5pjÔÀ¡Üî»dŸ“‰Ês6ÌÜ:Ãg¨Ÿé©_u¼&XP/ÙPOð„vÊaÎ#ŧ[ŽXA¶{” #q°O¡£Iw]á ~C½±ˆA¢—%¦]YÜÓ»#y#½´¢$bí¢‚q˜"+ ï»å °“r'ÝŠ#+òìá©äüxkÞo~«Z¹öƒ´2ý o¥ÍÖaï·R’ÓpêH¢=¯rÓz©ñÑjn=°iÑB.”~ºq¥>I, l[p­9XKºjhœ_I·ñ("mæXw´’.á œIb1 Ód¦;·?¹W¯ú3ê;³‹ÎÇ.W§D±ÚŒpÙj_ #Çiìc§nÍ“åã÷Ⱦi9H};‡;Ïá×Ô8xÿo‹[É^7»sfû²à܈0¤bL¹•ÜB ÀÀ¡y’uä)wY Q ¦A 8Z'T@…)n*Í$IÌøÆm䡪•Ñ€[¦Öû=½O̽¥‡"j…”jÇ L*­Ši”‘Y‚"À(Ï|ܾ”#˜CƒpvŸúb´?s•Z(zvýó_o©ç}ÇÙÆS”,×L'Ü}¸{Æó÷2þn^ä,ÚÅ¥ˆG„ˆD.Î\Ü*ÖnêaôYÚ»®˜ºqé~ùº$¶-ïDN¢ (‡( *˲òIúíÃsl7[¯* ’¦;ò©ò`=;uìs©É ]š½ãü¬ÚË«C®±ª3 †…é¹ÅEfÑIWfuooó…`¼ø÷ ¿ÿtÞhCù~ëŸÑΓ€$¢„Z`¤w':æàtIK9‰xÒ…{€9õ_Öã 0¾¶‡mž]¼׿¥úý‘ú­üß»°WÒ‘•¥l?Á”öªBZvT—ŒÁ}oÊ>M9³ò^ÚŠä´ÿÕ{z-ÙÉ\Zlœîª; O)vY-uµÕâàz~és’KŽmµ¬í¶fÅV‘ýÎÙëТ5.r[—àé"Ö—õ¹â×²Ìæ¹õ±¦1Ü5/Ç»QY´ˆ2ÕEG p¾Ø RþHÇ>$tðÆáÊû°@EÔ®¾ôÖ÷A˜&¾0h*ÝÊ8›·´ÉÄÒΰeLV¨:¡ˆ‡ž¦ãy‘%êµ —&›k5ÕEÝouàŒÐÏçƒßÐþKóýCŽüÕKàÏ…ÿåäTÑÿ%YÀèÞÇž·ï1°ê¨[ôì·›!™±N±âÓîg\Ó_Üì§îal¢ 蹌gô•·…¿Dû¨;­–ß0gia™áÐ&µt¬Îæ¶‹z€HáõØ ññ ²ÿ*¢ï1ÖúáQÄ:ÑyØŸ\Ä^¾ÕÆKò3Á¼A=Š)|¼{°NÛÕzÁ«PÏ3i¶ b]-o‘‘€lËüÒøø‹¹gÄ£Z{C¢p ]j¬à”{Áº('Æ0a¬ã@6Š3óc¹§±ÁêFV‹ÐUI¿}ÊÞå §ãÃÞƒþîb¡~éu䃒×Å.2Ï9YyDH2›»Õí¾ŸÚûž©[žzhe#H<Ø éÝY"U 0cL ®`Út¼üì4²íNÍ‹£Ñ-HDàÜ7mÙVÐílæÓûdí×WhU©Ù= ñ­prŠíq§e\ÉÚU¯…Õ°-a-À4oJɺ¾8ÁñUë>sYŒÜOÃvnå͚Œõú“z!bÇz¡£aâ<ó{ŸkÒØy’ÛÉ}¯Ý)¸Â|Zx.?ZT¾jØv‘š0üÉV³9+]îßùØ£¥ãd_ÛçÖ†¿3xvwԛ߿‡Fš‰¡ÒÙêÞÈÞ¹¬'ÛÏFNÖæ˜[wxŸÂ–0¨í_÷(5ÒÏše†äI¾«Ä·uÌ^„^ý{Ûä —Bjè^D5‘ÊIÔ4Z ~ˆàzŽf©yIûöǽã;é‡}j¶PcXZ¢ß‹Îù²±l wQv;°¾íV=RKOÓ   xåëÉ+x¹@ 0¤fœë´½V!ªª¦½àzÝšƒŸÛ¿ÄzÉk° ò–¾ëB™,˜+ßy¸Úd¸BVÚIá˜?DÖÛŒošøÃæ.jA&ö'¢§ŠÛŠ;¾'꜖˵rAªK¡=Òˆ¬Ìo—ŒQ`Þk—½TðdÓ( QkeÜFÀÛ€<¸1s/?•3ÖóJÿí¼×ÛVÝZ®3»¶¤ÌŽ EË–Ó"g©â6¿2½a‚­Í‘-?á«S›¤Dɹ…î(lóÒ§‰ôGþ±‘<à»zî¹Ñ2N€*vÜ®†‡` úª€Ø„  °= ’BGk½¾ZjEàMXd•/Ç :ž›2Ý•\‚¶7Ä(ˆÊ¶g 8¦8ŸÙÉ>êŒx»×à\'.{ýë±ÔCFsÒÃcñk1ûÜõͺAšñø(áôrHy*x:͉@%:€ˆÙʳ‰Š«²ÜŽØˆ.3¦¯[¿ëkX /íée-eA}9¹ [Ú?=Œ$D"Ìt{ÓÚ«gŽëÎ3GÑÝZnîRnq½Å˜+™N<<¥¦¦I]t¥T,FLªŠ„¢Ñ2#µºžÕy%=†'®§bÈóÌùF{­BNušÃ$ „ VÏw½ûG4?"ÝÅì­íÕÝgšÃÁxÙbPE%*›€h¿=˜éð©%Ù*ÇkÏ"' v׿ûq+a[¬Â”e¶è\«ËÆ®}ö´ï1Ü«ÑwcÈìÔOg‹3>6ˆÇ¡2³yÑÛª­M›Ã Ø«_/EŒñ3;û¶ûÃPßÂà stãÐÙfËÑ ÑîbO õ×NúÊj~­6†ÅCe4r|Oøñ\s¸%næ˜ÙŸ\^´¤²Á óðëÍœœ ‘«ˆ¶­pÒu!3®1¯ÿ˜Ý0útL-Xÿùµ›Ý>W7$³`#WkjÕÇòA¤[iîÀÃ^áÒ–k깤A¾îÿaañAO‘ñ_ػίÿ 3ß7.0AƒIÅÌk¹-™† ´ŸF»+Ê'–¡EìIWÔ#[f©$ÐvPIDž¬B“š‡ÔUÿ)…ÿ‰{ª‡23«iòQ%I¤óa¼ÞƒŠ—)HÕZ\(ÄŸþH3†Ëbˬ Œ<½5P]a-fA|sì.—î ÙÈ_,×Þô%}Á꺺ùÝÿâý[ã<øqYùº‚&V߯Æ*D \ˆSJ3b{LsˆúÝÖØ“^~Ò~XÿÊ> ïÏa,‡ËΘø«~XêÑ^³ß¶P~☎`«»ÊSc 3]t¤Ô0ìjÛ’XæÏõ=ç“þ~Tçs¯ÿ˜~8ë¥R Ó‹¢™1,¿Á¶²Ù’«ëfrêɪ%®«7æZ)O|.P(ãáç<|c}è¢%Ç¢mÏj£QÌr‰ëÉtW”P!bY¸àÀÛG©Cæx(¾†¥ Ê•Φ™§}ÚøÛæÒó¤Ò·QÆ,B‡š‡XÇ•îum4¹¯ÄQʰ²c1œ ’ÉVÀ¦¨Ž’­cµv©Õh%þRWçz½÷ö¿ÿÿûõêý¿È÷?hßþõû\—Åþ@—¦Äã±Î§`ݵ3·æ'ËþÓüã·ïbKèʨbe‰œGf]ÏØeÍašÝÂ𼤟³¤¸t‹­â¡S–lö˦¸Áeè:âü^ L}iCC¸\Ýçìºü?û¶µ^ì?ò‡ÉoGkÿÉùÃGy-üćëó"¡ ´R6úö¸[7—¥Ør@Ôø®#ïûâ‡J@Õ"­Œàíüu§%?¸?L©d–X;´6 `£˜@¶rVòª³õž?d^Nà Q ÊÄ( tC×£5©@£”VŒ¼éæíZ?[0` âé¾ðW¾2 }ƒ–š”CiÞ¤§A¦œ¢*¥l¡ºÔ×ò.Ù€s©Mk[Mè‹»àA1éîR0kÅ„IpE"4{ÞûY~|Gn;%#ž ;)«ŠE–*g K@™êÊ-À:J©Í$JVÇZÚ®Fß·µ3×$üÓgï=¼ç›û¸ëkN­•|.«XB0 -aò‚ÎÅÚê£ï\^.ÄçÔ[B4Æ ÉŽ%7‚ˤåÕìÊTp=ÑÒú¹¾Èyaÿwgüã¾?)ßàÒk¢ôøçîû}|1ì¹Ñ[')Ë‚–"O|7>‡eú£“y¾­sø¥~ÜufèK-V9DÖE!GµUrŽG@Ï„ñ!ÀP¢*Â\“۸ȴúy¹gÝô1s1ÅQ¼øm¨¥‰9ȪiL% L§TÛÎ:ŠÁ¢µnÎëÂ&ÇhäL2tí#$Cà’(‰’³‚:mÙx°ô ¯‘ÛðZ§3Ÿ+f_æô÷ ï°o=« hž¯X¡ ÏJbð„RԺؠA£©í@Ï%"'‰8¸ ¯TÙaY¥„=u“Š\ÆþãškûKo¨Ð†‚pPa¤g¥cÚjMD" Z ²€0¦=æ[T|™r EÊ1À©Rjø>·m¯;aøÜ\k–rüˆä'Ô—kUåRÎIΦ—CÃd]ëÅ^€ÐÐ5|Ã@˜µähi-}Jﺇn/aN¸NJô„¬DOˆE¸ècÓ²²°Îç¨9B²H%õ’Ä“¨ì¹lçHŒÒkf3JϘ©ÄŒ$^¼¬Ïšè!WHá#´A x Ei14¢CôA¾œk×wâjêÚË”… Ž—¦‹D\_Ö 2·aê5l_ŸcëõToG{\q^½è}2Ѥ@²þeùhãøþ«‡•"°=V@°B’¸.c!+i³L&€L.qx}®TDeÓcÖQÌaeÄCi¨M_ nä¬ÀËö«õøÝ NË_›Tçg Wyzaålçµs|ÂÃ|ÖìFíù%·áÊ'ÂøóÇÿâ_Zÿ…+÷³ßççqB?·)?{ÁD;tBD†8¤¶Cã²§¢äÅÖ€Pô*еŽJ_tPVÖ{`pW™mLkqZáX‹¨œdˆ9³üÉðãç$5Ëv)·´792&fü²–sV ¢©‹PA±°!•B¡ù¡êL1ÒQC(;ù€‘‹—u¼‚š'D!EÓ1œÚk¾bßšW’ÚÑüsNÿ³/⿦ÛÌ‹ÐX<µ²1YÄLÅ©Ã:àHÚD¡äIŸ³C`g,DÁI‡í¾X©HX¬-?Ð'(bªÜ×Ó~ƒW¾òVÜÇ_o¿r -Q\#uçS?‰–yt¦4ÔÕt3ßca–À£|ªjŸß”¬;›Í“Þó‰žDCf•òî‹^¦óŸbÛoKÃRŒW„!! mYF XLBáÚwTá”–Í[g#½0öü2owû Yýeþß§ÿ— ¿Þ‹%õÏ¿â?~â~wy9—Kvmù¬ž†n]æ8Eç3gsÊYI¯$ðg,y¾Ö8:8muk¿`âŽ`ƒºHƒr¹(·%v»[ûÕ"‹ŸÖÝ÷Pì5fŒþꚬÃðǤš^`ßž¦ÚP—•ºuƒ~öÑ©ÎíEL¢ÄaŒ‰çÂÿäÊzðÓª/q9 ®QjÃÒN®¥Y©ØDºoþìKÓ^±Ë)(,!á-™%Ö‰¸ƒ¡æ‚ŒxYÿÙk¬Â¡¿5ðbÓC©¾ÊÛû9‘¡ÓÀ¥ª½:zëHøhFó‚žÏÄ¥«%õo‡ )±©›ŸÒûí…c]«Åâʬµ_›ôZ¬äk8îa‚æå·©a /C[Ä*0vëÜ%Ò{Á;Œç—ïl¼>_ú-}8Bº¸â£ð2)äëóy±µÈKÓ2Fƒ"—Œô½©3°ôÁrÀ¼€P… hIZåÖçvÿÜ—^)ï'„%<‡8Ï`{Yg¢¬ú£îµûxíU¦ÆŒ ØÝ«Íÿº¬}‰¢‹ýLÆÖ”¬ÈKÛ3‰ò?ñn†‡<ÌØPîÑnˆB£Üj/…P x•^e\´e³èΤ(—[á*Í„Á”ÙSÉ××áî¡Oº…ýŽ_˜€ãÂLJr:ÝÞ}é8Ù0cNÃ71r9¼(nÖ«UÓ +ug|Ƙ]ê#-¥õ¬}ÎøcaJtŽrmÑB¨’¥.ÝÁ:ÆPœ9-Þš‚,Þ]FM¶Ë0,¨¡w?ȸL´Ÿî³PÀ}éÀþGJœö“ò_¿ôáWÚ‘WÉœWqz#¬WÏ\¡-~¯–Ç®I-1,‰5JÈàÐÒ•_ºåÉ»~­êg²Þa`0°L úJ®k«…¾-¾¶õ£x÷ݱ O›l0ay]. À‚P: ÀÿÅ <蘌‘¦ †áXlY¸ôzóTK¨.¬y”:ÊÛæ±Ñè4ÇŽ!ÎsQ2.°Ež=s‰+¢ D@ËU{„Mˆ˜]ÃJE[4¿WÞø0?æ[§C¾Ê~ LæÐV¬¦oÑ𞞪™WôHñ¶r~7¶Är˜+~xmxáÙ…žtظžßØ~usüc?úzŸG·³Xƒ^ 3i“ÆOaÑ® h×MÉÕ,HŤo õÖ§¯ôNòu]Õ!Ï}<'×G *TÃ"hªÈ[´ˆYì #‰ÇЊ©ˆÀ¹ãÕèèr‰A\ôál-œh2gÕ$Ê"28Ë`Ô$NÁSjûüj¿çÿã<øW?®³¿Ü¸?.I>8&SPÕÈWµV"rœÝÜ”,› ”`š™-Ø-Úî œ¦Q2Š–ìÔh(TìiIÈÔÀêXá˜*è ‘VO»X÷0šSsÛžÃüÒ¹û$«Ù¹¯¬Hô˜{çˆÆ'7x„jöä"ï&(—Ž¥áŽXìˆ ƒ‰Àîv×~Œ«Ë p5[6†&_ Ãª+†öËš^é€ }ÜÙWï??ÐPa¤i4]l‰0êåj*ŸݞøÃFvR“ÉñõõwÝ;í²Á¦PœËÿ ú¯¶&Ÿ(¦®Ç?‘%|§º–i%æá©‚*1º¦Y9@ê ™çCïâ3“òâÀyà.ß%RJ}CÓ‰Á i [Gîh>efA1%'d¯S; -…Çñòz”¤¥Ëüp)&Åj;•t€l$IX10`i<÷ ¾¾âýç÷ãfB奅–€#ÃZñq]3¨,Õ·"×ÀW¬¤=›D <‚4 S‚BX<§ N]:Ýr÷Ch0#ký~kpcñþv¨ßîÕs„‡†–1ãOJS9£ •„˜~z–‚­#}áòpÕÕ‰{Íä®­óÍ=˼ Ý”'ùg/<ͳ5ÇHÙ¸žEì-b¥bèî˜N/FËÊ0¢ÊL„ÃéU‹Ö]ç?Ì÷š2+¬;JÔÚãhˆÆ©=×àƒüÍè´éDÙ¥Ù#Íþè¯ß­MgÍöºo\÷xjdÂÔ¬à\8ZT‰1¾CÍ–‚• $‰ pSh Í(äR¢­o€LÅ&~›Ö9šÿ©í²Œ*/ËJåIŽxÀöµ}A W¨b¡Z:›3oNU fuε§`“•ef$½H´§÷ûô›Ñýßs^gÿÛˆº”‹ &[‘D!¸Æí }õõa¢m9?s?`³Ø&Ÿñ`·œÉP&1¨™•²L¦j‹Oµ¢£=Ìmao34NCÅD¿hþ S€Úçõ¡ù\UY[@:“ªv¾ˆ^Øÿ3lÿ§¶?ùñþ“q@cLÙY_çÞOîh É©¤«{vu;1!¡|U¬\ÎçÓy‡#çq1}ÿÐAÛìÂS§Þ=`ê­ZË[ K¤Ú«!ñµ[¨†5X)”õ3¿´æë]¾/B¨(Ј*[Ù×™…£‰À À ž'ˆ—×Áˆ@‘FŽ AYw¡–´ é„Ĉø ¦ARc%àBpµÌÌQ –F1B±¨–ÔªB.É8ÿ·½:Üñý²¨ª AK(j‰’ñ\'çý^Ç«jQA¨2ƒ EFÍÀÔ¢A1ŠjDç&'Þ @ –ÆŽ«f\öÍF¯¨hx;ìý~ïÞ5n)ͬ–TêæÞ#§æŒûç ´ö,ƒLM¯ã1-÷xÅ’HN{ê…-r ÇVø·§çüáoìwÎÇEîFw£ûÅR¶·xۢΫ'wr-.8QʯñeôvºÒ7ñ ù§7‹팔—¤’ ·<5 <“•­•ÖQ2ä`,Ç¡”%@º‘wÅà$ÞÕ2kNþ¬ô¡èù%nwÒ%«¢VX™ÚC\M"•‰”-F§¨È$ö¾5ÚŒOΣĸÌÓœc  „éFáZCOz;¸·¬·‡ Æ¯GŽäž„âŽþœÖøžXòÝõË»íÆÚó´yß©¨†²nr©Žуk2ÙÅSÑÂUu¯¨;jL¤wŶŽùVÉ\ÍGl±ž-Ñj‹|å³U2-ƒã¹·µ7œS•‹Ën±+0¢Ew ÖjMì©[m¶mÌÔ#ªrépS¾–¾²kðVxË“îæª·¸ÂÄë™bº§öà"^(îßÏœåqïî1çµKÈK¨Å3&0¨‘œ´SyC¦Zö®é-=Jæi»?oþÄD€íP‹¯QVêø­c¿,`YöDD+²²ñjWnEtHFÏu j (2/å÷©e¤ÉùÀŸ¤!å¶êã©^jÖS~PºoAQ“TdEº‡/â´C7÷ô{§Z²3ÇÕvÂÄz†õù»~@”ý箂~×ó%ÈTÏ4_ÉeQ‰ 9ÒÀŽ+8šÚ[–_òR+yȧ±ð²Â FëZ‰Z<Qq„jµ¶e,:x&ƒ[pu¶3¥ë‹`gPAk‹Q"%3…¶Žã ¦£ÑUDLÚÝÜâ„,%Á»5œÏÓøN9G»úÿ]µ¤¬Ì'ŽÇ퉳—àú¨ ºÅy|Žø=¤s#þ»þ˜Ûù›²%(ZZŠKÄ@†P%ê ï4ú<ع2Û¿_ÕEÎôH¨åFĸQ§CÛœ„ù8(µ¨Ôêf¾˜~¼;käVê+(W;˜î­Ÿ2þ¨êðlOÅÅüÜ7&gë虬2ÐÐïT¥S$ŒeyŠd¦sP Á7R ç2T ‰ÒBŸ¢¢‘„$,°w Dý&R2#Ž­ÖÀ긕²Ù®-t;üCKlãŠg¾~‘Û¸¶7g|ò¾:':±X©ª™‚"Án¶0R/»|Õ#wÅHk ±Z¥Qê«rˆ®”û€~HÙ{.d©ÉB/˜bID±ï€†â¶o²nnéÌ.º/wÙVºµ„“÷à/«~ÀI¤¡Ñãó}ƒ·÷6¢·ÔQê¦ébZ’Ê^™ˆV©5nMô©‰] t#Á«·Œ<3ö&´BIˆ_‰®WÂ_fÊÂ;|,«Bþ\“9@A ›,„»ÈV†Ô¼Ú`óÞïÏùsÊöí7†y™•qo£uÍõ{¨ë‡¸}€@}þ#KýþZ Oº ra”'›!† ß #•®¸më3öŰ%{£2êTn¶?ÝÃ\Tû™ugzS´ ~ºÜ¾O"K¹íÝÅZSëmèÀ{3é5е~Œ×¿LC¡!uPW)[>÷ãËg¹ø{D …DI̲¸# Û0‡8l¨tÑð76É¥„œáÔñÿ®?ÜÝk£xíÍ&²±(Pmì2 ÑL¦1ìWêqÌ ­xøõ€9}ŠØ ”q‡£Çãü7ó-ª¯ßÀ—a_=®Š[Ò×|Üd«‘if’3©L˜ŽšNÖ1>·Óö\í½NÉåÅÈ é¶v÷¹El´T(‹j©¯»œ¾¤Øé^OÌ ¹Hž=´ò0,>Ã1ye`s“h²™·ë7² á&I+P«©–£«M|ýÀ—§ƒ¦Zñ|ŒÐÒñìñ-ØšÿÛ§í`›“ö[Æ/Ig¼¶ a¡£ZjK>!´¸Úžt;N—%³,Øžš‚•ùHÎÏ0úõÍÓ㪎ê(úÝBI8]­êŸ•þâ{ Äæ=x¬®+O•„Y§õiöòX·ŽÒT‘Н\ƒú¨¹:úÖ<ˈ…Oȶ.:ïÛàÍa3"È¡Žwæüy;Áme+Mà–‰ ê¨e뻬¨ú–÷~ª«¥wp¹„E›eØO9Š&“Ù^S©IEò]H»ƒ1- \F”|°† U™´›ãŒðGÒö޾7.ïü¶gRãìâ;ñÉ«@@×ÞÑËkþx1lŽ0‚c°4±NgÁÕ›üÈ…oá"$  nþ ð=¿áìÛ¡ÿŽóÓŠ%~—øÎ8uÿÿ{h«ÍÐaÀ·u段òàî-$‰Ž@)83¶Ãb×!¬\^[/óœN’(§}X¼¼ Ѐ¾x¡Ã•0åVÉš† ” QÑàBí.°°†Óå?ßÚPÀÁJvV-Ö¾ýIÏn•º~~€£Oƒ;^å wNvuW &ªYe~«Sç¨d¼Ã\ >£äÂt˜×Õ`Œ“>à áZ‰°>òYc;¶âôµŒ¼ºBw A¨œeYœÊðnÆ%vRj @<<7høee“‚ n×üÞ©jmŸÇƒ4a܌ƙ+ûžº2ŸÏï|ñØ kN¦kÕn¡æn‚àawæ£MÆãÉ£‚A )lse¹onºÉ±´ÁpKm"·'†Aâæ t–L4±Šaà Áh’§0ô€AWIÝ" J‚$€@a(0ÀôÐ>bB>"^(j‚ º/%¸l€ºAÀÙè"],PŽ á¢kWB*³½Šc›åvþùT®£ÞÇŒ+®‹ÏÑbÜ?¶;ÙC>/çYc–4ÍÀÄ\~ êûد"k±Ñþ±j¬IBt¬Òs±”ãqi°3oài‘¶‚cù¸\ä§\ϹF+6É¡Zr­|›’„4Ôh‡bþ\L?‡f µÄ1éÖ:DƒJ$EXÐ ‡b…#Ñ ›Ž1ôN ·TtÐ17:%eÞuй‚Ðq> ýsåâÊÄ¥µ¨i¸–Ë߉ýøR/ÿÿJùû/çwñXûL6©É=%àá¯:¹ š~ †+wõ™Õ…–QËæœ;1Sj¨D„–ÖÝg.kèÖ·ŽžþÉ£–ô­µŽÞ\áIºœGõÐîžÓû5h†4Ì7Ë’Ëéô’:ï°‰MÎÂZ[½èž½W›«Kw/ï wÙ“N`9 à±ã˜Œe<¾  ¾JÃÎáãbç}æï?øy ú•¹µéˆÒüáç^¾Û®´O ¼û+|½e÷èfÚíöT¸tìlO’P¹~]ׯš?rV ŽƒC4¼×ƒWjŽ› Äœo¤ÅÕò“­Ÿîêã{wÃZ~âº(H‹gn·—HDY•6‰R˜a¨jëœÉGªÊǦ!òr_5.âÒ‘‹bñ܆˜¨^e–B1¤p*.¤ÁßúòÓdE5–Œ   ÂJõí # ç•E‘PÇ‚Þ Ã ’0©Â¦Öœz,“¦)b9p# Rb‰&«áW‘dÆvÏ9/øûn¯›gûãý¸3ÙáÚ¢u*™lf`Ъ‚4`¡Dŧ¡HÃiEK¥€ƒ.¤—ÝpŸûžmñç0Wµf¬èh¤è ¶@‹cMJZYhM쇗rbÕ©zLÒkRT¬VªºES.…ðJ×:ÐÆ©Ò–a¸ |Y,–†…ðE™Më|scVy=µÈcmS&"†=½ øéqèÜìÿq3ÿWêJ™¨t¼Ãq–o j%›¹EP·2 Vý¨fÿZ$—þÓ¯êÛWÌŠÑ Æ’¼ˆI|0ÿáœðMdx¿ÔbçÚ³‡:PàuÌsÅ<¢|Ôç­W¹]Y—;­)˸è1(þ3£Ù;§%V"žð~о^^ïQÎT:´­Xfxªozi4§\Õº+Ük‚¶}:HM-(K]¨ýázý?²×Öøá¬¿©øì1^N·Ñ”®T¿ŸÛ1qm)j™³fýø¹ž¦_ßS¸?§î’§ÓfÜJŸ›®·RíY[žùQàv ɣè±6РWÚy W @1X¡­”(E Mz)í÷\·ŠF(2±´& ˆ…<ÜC+DñÒX‘ DIš•«Ã„ý‚§ªuóP#TÅ …Šjp~°I²^KÚOO "b¬´Ô€©<ݼº‘ǧv/ìDT%DEb0Éy]è!³Å.‹©ö¹LÁGLÑdP5ƒÕÓQ#-—ÆŒAJ'78r|øžãÛ­sƒ7éçÕ¶¢ï;~ð¹H@ 5™=†o.Km¼\à†òÈÏggÁ¬µ^°Ý»èÌ:¹ÉÅ8ˆžØW¼" «A25u8|ƒ×íúϦO¦.#O“ 7DÈU^OBÉ2L¥ßê©£ïú˸Ùeé¨à¦Ó‹üx»¯ èät4iìîŒ0R òë(F,Æ"^cW*ˆƒBƒ’Äœõ|e?EÏÁ!AH¸¥j·²W)$F“H'Lj¨()µ ÜMPgNçIÏ”á H$UŽ' ÁzdV gWö­žÍ:Gèa»éȃ•D~=úyÝKñ™£•3=óؼë¼³ç‘;CïBÓM” bª.Òœ¨nH\T=jÕ%Jjfúrà ‚ ÄmÏý}ŠÁŠŪ‡ÍžK»{¶Æ4VÃF†;D&C! ì¤LFÓAumÍîVX‚~†àv¹T Þ[0ŸB»y»¯ûhK0ÕW°¥Ï5vcA¦KOƒRG¶Þ›eÍžy–¨ªŒªÇfz”ÖúY¸  ŠzTÓª‘3ɵ (Ô®Ó@tI¯F ®±åxo-`aL™T|:ª’íPT¾@"æ›c‹ÉϺ×[beJ(!€Û\L[XŒ¾¶'[:Ï|$ì(À{0hìÃÿ¥ù„¿¼¬_ü‘üù¯Þ–•hD§tÀŒµÍñ*ë¬Ó97ðG\·5ös{ÛüÞ÷ùŸ»SøQ…ªP—-BW ¼ ó5eF«ÕÐç ÃéÔcG_\ *™ÅœRþåºßÖcµŽVzYûòêìXy*EÏ‘ZÖæA"ld»3î1 ¹žŸ~õ)߀[/Ï€‹ ZOãQ­EŸN&D¯e®Š¡N’œEdI£›[žà*ÆX@¡Õ+¡pkQä%ºÆ'ëŸpïð'ñ“XŘ‘P¸q@á(N Éc£bq:a÷E'"}BÄ_ñ¦K‹:izg¯å J˜ã_ã¨ü)¿¢J RÅöÌ[õéÅìQû>eÈ|α]ï¯_®áçàðb-‰ˆ¤_jß©s s<¸¨³ÎV°†x4.8Ï¥ž–h¢Vh~ „hIM.¨_¬W~Ý &Fϸê6ª¼¯I ê˜q‡¹²ïE‹Úh"óKJGáÍ–`‚w‡ÖI©±7}¼×xŸð7¥ÞîB ®–ü:O <˜IÂðÌI¦¯uï+Å\QÀÌ@šâ– #“ŠÜ–„"öÊhÐ$bÂXi˜!NTÁ@AÊ*=ÆE2ŸÕ™[fÅàQkÔIq–­ÀiÉÞ¼Ný÷Ãûßñ…/_l9ÍîÖöÉľM¼Ïõa ‚¼µ;¯Þ^ÙçÀ#x_uCÄž4.D8£œ©vy&Û—XßÞùÁßÖ°pÕpW1 ;2¦e!TÓ1æ[wÓ5Žux|.L}‹»ECž%–X÷aÂ*o÷ç7¶H}¼·è˜tNÝÃèÆ#±³ó*Ú —¡#°ÜÑ1ya`¤Ñ *GºbD¬ÞAV¹èå3½mN“ú)6Vý8И%Äo‡¹?!ò§IøöeêWk}&× mÚ†ro«›œ£9¤qÜn´2àIh˜=+cÃçqÐ× >›æ¶ŽÛ–95³ëy ŽI1–K Çl}|í@=Æßé“îýþ8_¡ÓrÓêµrXù°¡†ë èê>ƒŸ·Ç?þu”ïY4FÌ"ö»Õ~žúü¾¬;BUWbrø• ¨yomÃÚ&ÓpàAùÝ´çCl¢g«é­¯S«È¶÷Ý<]ÅÛ <\Õï ŸVÄÆ“@?"MQüMÔ–Ü…l𯃈*çßC«Âì¦Ûî ¨Û˜zÕô(Bižh‡îŸÅ‚I×GêÙí4>W³+ÏoEˆ^ø ì"E¿»æìË'„ËÃDHTò¡ Õ„—GtHHíÜlwˆ¸šþ²!þóöÿÁ ·qk^ÇÑÖVòÝ¡øh9ú9´êàÊmÒ8Ý…-ïRæG‘kTº–=¬ÑÀ8 së`Ž&Ì~[Œ%þÁ½"žmýå=£ öˆ^BeJ3[Lµæ÷öï«]´.I‡Vf¯ ï”·v5Î)VýýâwAªµ>ò3«k ›>Ó1¬ ºZ|û‰>·Èã€ãÀ¥™®Õ˜‡~™sNßÝ ûÓz™¯ñÛ_ò¨K¡ˆö»ál0'JÖ1œðàu~ó¥'×c‚Ö‡ÿÐÎe'|’ñhÆCV`λûô¦àÚv RŽß·ÃÍr9ît©§+²ûŠ7ïæ1’OF:jBí” JÞâ™SôÂ!f.™¢™­÷îeÓfpØ;aÛ3ÑlÖC÷‹d>¦ÐUW¸ÓŒ¯C( ÷zA®úÑ™ënáB°l§Š#ߨÞ3º!öèÂüu˜tò#é&‰0*‚Ò£øÕxˆATéÒÛ`?yVk7õ±fŒ‹ªÒ½^ÕÜonQz `*!£3~õ?ce÷Oþ™wçýåÇÜÉv¾æñU”íè¹W5ce&Ú´¼óÉáÑí×:¡“)"䏸ÝÈ‹RÝ©Œˆ*Œ._’&yÓ~¯g2JdKÐuÒnã,Ë¡/’ — 0!öðæ\ Ž÷¹„_\Ï—2²f¨½‹+,ñ1œêÊ›ÔvêÓHc*ÔPê6_Ç$Э¯½<¶Ãݤ› 7Ûª…¹žéÓpÆ¿Z™ê~%âq‹÷3”‚ºSÓ"`u-ÑVjOX"+7+%åC˜Ñ—!å6@RƒqéΨ»+‰– áRAYv¡à8û€Ä(dã–Žgû¤ÿj.m´ßwªË_~ãñÅËØ~_[sé%àP.Ÿ¾Ü&щñHG¿Ù·/KÖÕa^®Ü9ƒ¥³îØ”ÿäúa7ìζ8~‚%$ˆD,FùÌ.ÜemˆÒ6‡½ÇО©ƒ£´h[dZ¦D›ÔÐÎÿß½@À@O 4€h æ±=Ä-€Lýÿ½òüåQ€ „ƒ¶ˆ}†ƒU{ñþÆ‹Ýccúö§…²‚Ý–kP°³õ¡?ëO êpsnÌöÁîzùú$žÞ¹ùþv0[ ò…<îwqÿ¾_Ÿ+TŒDðÇKß ºÀT±Ù¤^òûþ5§ìºP<š„ÉÝK/:”9iväR\MÉSÛN¦„­bÂN2’‰ V0Ȧ™Ð+´µ3VeF>R0Yz÷t­r® § "x¼cÆöÙ´kéQ²EºŒÿˆÇOØŸ÷yŸÏþú¤#g›4Ø<{¸¾p2T™ám$™ó÷fèì°ìºGŠÏ¾†Gt[È•Ágw÷Q= BYÄpCÉꟜ޾Sª Ó3­ŽOëSÿÉ ÷¡3ηcBß•ƒáa©ËN‡k+œ ÏÓb¬-Ùm0GÛàã3ËWýLï±Á/Ww-ò:µˆW¼’âA±÷¿B3/9ÖÁ¤wµ~aÔ?/}ÿÞ_eõ°Qz Û•¾®Ç%véöUzùj!ŸV$ˆP`»«ÿƒ¸;ÑSµµ½„»]ªîÖ€µo‘È ŸX•¡œv£pQÄÆ&pè™'xnsÝ{5{—8P¯ûã}/VÇñÏå¹â]/¶«åJ±sµa¿&_VoŸ^x©¶7ÚÕïÔ¹FËI½Í¢¹uî—¹êÚC0vmd‹¥‚8ò)s\kÖ£Ùïü¡Õ˜ãĵü%=WL•Šk6†ž®b00,wrfe ›À²N©ˆÊûÜ(šNâ„B=ÁC1â3~¦È¤C3ñÄ’Ð`ùì\m=WªS6hdÊz¤E­”vb <”ÒÚB1é®ü8Ò[ß9¯E¥ßº¹Öó“­–ÍjÜ¿kV¿ßSJ¥î·‰S¬`»0"£ÐH3*¢RŸš>¬¬i<Ñ£­( Ä\Ðb¯óäVhÁA1LÄMeÙ¸ÒL=†Ø Šåª*zѤ‡U4Þw„'*sgè/iõ¬ågWÊîp{ ‹OÅ ——7( Ï&±°¨¨á…°?Gý9øØ@ŽÐmkÍ4f9侩>7¶x>L-º"õs[OK+‰¯ÀfÅ3ÊFJ3#ßÈ|ë]ãpXÿŒoêíÚõoÞ ÓF åe}_-žœižºý¼ôcæÛIû@—eô·CB÷ÉÆËUäšÆ#¨?—÷wU«ÎuBÛNk+æ.õ®”á tãó}ܲú­ëÌ93 ^áTQbTÖAhëbjùç¦ôü¥° ÅdŽÊ6“r¹>_¶^ÁìÛÛ¾.NÔÒ7’gEïçÁ¶°aÒà,ÕÛÜ{u\øíh}ÂóÇS­£Z1ÐäãÈÝÙª šR^LuAãðÎÜ3û]ºî¯ ަïÖ6{†Õ^åzâ²ÍZb€L ¥2—”ŸÔ{ln„¼R®îqžP3 I†DEíA9$FÒ) T!uƒp¬–Vš„%¨†¤ƒ³1FsZá@™Œ'Nø€£<ƒ£@TÕHÿYîà¶à^ÿæŠ( À@‡-kX˜„q¸‰'À ,’ðŸ¶g•„PB¸LP©²$ÖPfGÓû¡z@“UaŠ’ <ºGžg|”÷Û{Žbê=í^$Q˜ÎTQwæsý3‡ø0æÈ.vÿ½7èJhª{ÜwâE A¼M ŒC+z­ÕÚŒâUÖÙõ‡;.×f¥ž±‡ì()™þïïOŸq$ý­K±t¹Sæ5¼­ëΊÄ÷A™ì#ª‰±§îFAE!‹iC2†rHW‘–(h¨Áð(Fv÷Љ™qŠÖre0­Í*W„¤ÊC¢Œ0ߺ‰ŒŸš·6Àfösª±Qœ#ÏŸ†¡T›v˜ ²rI9£I£–ºA-¾èö«×J£ðcE½…ñ±\ý¢¿¿ö|¨.¾ô'Ä×ìîÒ¯0¬Í Ò‚̦¥,X,…Ë&2K¿Tžz¸«â’ö¤DÄf)˜…M…§ì"Ðä†G¿Â¤8 qF!”{!µYÉA<†½gcÛÂA_©Ë¢ì¨¹§w†–ôK¨²QWà]OÔ$þ£Ì´."½õý†Xý‹uWµ€Ž¾Üöm9g^¡ŸMÔžr®ù`aZ=„R–…4ƒ Moâ‹ éS)Ò P d}³ùÓ¨b…wÎiSëçM´?’ ƒT0’WÇøœ…¼ž¹¯5_Jõ¾’–¼/°ZRf&˜5\õˆ/&[à8VTÙ*•Ö V}ö‹KŠq=Ùú©û9@žÖ³0'H;ÍQ,ï,®ÕÖi×Ù3o|2ºŽìj‹(?¬ VHUFhØT¡RÐ"cߚϕzç}Z긿r^?ùüØuì§ASÉl%åi ¹Ópê•áú×Ǹ°Íý™û™k¾¿‚¥Ç5G:ý`($=G`:ÛѪœ‹cÆ ?Óî¶_h†ß%{ì5ÂÏdËeLðy8~_¢(G’SòH> ’Cʴɹxž¶FAŒP/$r#°2âÊ€&-©êë–r”Ó±a( FÂ`WT°'‘^j2Út;>äÕ*òŒ±ã‘¦“Ý‹¢­dÏvq´Ëƒ;8Ð MX+ïtJ·Å4G™9,ƒb þù†%}cñ ç³çªeÆeÍ‘a8]xVnaiqZD!k³è3ÄX¦2Ó~Eúìdµ›®âÜ™ó´¸nx6ž™MâÙuZ:¦™DÝŒiAWƒ²Ÿ ÊñòÜ~ðn_ܽu=fC¤zé¢7ñ…g÷Ë™>¾¼‘›½åÍZ;óì<ÝÇÁ¤©˜n74^±¹—öÇï¹ó…_>2žˆS0‘ jÊ;%f` ‰Å`Nç"j‰dS<Zï"¤²öÅQ¾O2 n¦½Ïco½Uùs–áÜÂÙ6‡NÕÇÊoþRéPÞòQ£Åë2ȯ/}~ÜzîÏe»æn‘BÏŒ>[‹æÕ9ï§Ç1ðTAןÙüÙÂäbW»Õù×´þá¥b„ R ÕiÜ#`wLì Ö¦·ƒ¯èl¿ÂG"’£Ò@xlHo{~I>Ö€ÌÓiZkô²â}yúLû­`XªT¾r™ FfÌY ½2±`Ü gþÂn<«bË¡¨“G Ž"-À¥¶©x˪€bðXβH¨+‹Ì yDSv 8ž5ï]½\ÆK6>‚ؤ<¥ÚŸ¾ÊŘôa-¼0ÅÏ„†rÌ>?ŽsÒþòÄûSÉÜÑ@8ÊÏAwžÄÔ€÷dÝà"™öðªq—à^_7ÿÏ ñð(7ö¼çÃXü¡Ô;ô3tÏgöÿõao¦oÄŸÞ2ïò­*á™,cÛÂÄûz.mœ&ЇâmwB¦Iq·òüë³ø¸™ÿÂð_ùöÒæÈ/j›óØŒÎ/ÀIYUµ˜NJx8DAõÙ¶ؤE3&ʵ㠷2Ì' Ù¤Á . b¸¬ÅÑOØbÐÁËñvÃ4ªÍjSmÞÙl8L DNÒë[$·þ ë1±Oî? _.UÕWå._”Ɇ¿ÄÓ«7”85ÑQƒ¢z @8¤ÅêÏõøÿ²@ÿË&Lƒø5»H,[)Ê;úýª¼ v¤¿\ôv0½ãBÜãØ³0pÄ'O“5Æ’û¨9=°ËšÙRÉ»·Ó_èp*´O©lÙó×öÙ#¥ŽBTÊä6Þ¶©EßôÂ2ü²Ä½¹÷½;ì1Ì9b\D”¦î°£T˦cA£¨P| jUÞ^Þ R_æ”ùåŽnÑæJmãݸàÃC7³âR<ï;_âH\õÎ0ùÒÂwò“?òFÛÒ~«uŸä§G[™=z-9[  ]÷S®zë¨ÿùš1…1i>½ùâ°õ>Ýks{+þâúwÿå_bàa÷Lд!ªù¹êÿüÚ Ë’Ö¼¸EÀƒ²í$ØfHx[íh]a½[í4¤ RWP…ê)nÂ\D{aáÆ`¢xÐ.ûePfUÚ|[ŽIuëP€.ør•,Ýֹɨð+g‰üpèþcN®82ýU† ×õXí½}ó§×gòñʼnG¯__Þ>‡‡•þ ç†×öÛ> $¬6)šÔoãÓ¿]ëí_¤S#'ÕÚ¾™FÒœˆ*ï¢Ê¹Ø‡ˆ ¹¹ šdHó~]‘ .¼ˆ9ÛO§d` 8 ƒ…@­ƒ8„xÚŒ®ÖLnNÚÜËFŠ{\.r¾„GÉcÃÒÑÚ†š“l2ÌpGMÇVÒó‰°j§\¬AѱJK6|ÜO=H4/4E¤—q<Ëv‚½ã5ÒídÌêØpÑBæîºi·×Ð!­h¡èˆøÿì/ßñªë.Ò0[Ó¤h˜ØéfiQÈ鄌Ni2è.Ú•|„”íÁö6Á;A|4”ª§³÷.Ñ îê$ Œl‡O¾\ÛÚ·ÜÜ|¡[e¿ðõ˜~‹‘‡=ÝÁã·{Y¨ñO|›L»HZqŽÈ~ÖK†â '×hßpk:pX Ç÷E!—S„Fy¼7bcÂUþ>ÔBëH \SlªºŠQ«Éò_4\R:NžB€ÿ ;ÿ¼>У  ÈPèà¡4H€‚`h<$€'€G!РA²@žûxH Ý冻Ïc´ÇQ¡ÚN<—*7 0<ý<ÂÚ½D°4¤c÷æ6¾ÎÎþ>aÊû^y÷ù²œ«×}Á(þÙøÇ¸~œPö ë½9s‚ùV£†‘¿þÚ3ø<ÅÂ1u….èóFP§‡ 8[y7â¾³”­ ߨÙ×qª¤rkë¶z`›1Bn咼젃ý;¥(,<­kË6ÜÇ, [¥Jec6ÿc£ÿ"øG¶ïºëyfíÛª¿¦’Ðï&~N=íÕ/7äºÃÀ° *Êg•h!o‚pµ1*(\ä†ã8²Ø†ªàD†•R·³×QmEö^ìà…nõèk•^;™1Ò\íY>Xѵ©MÓ©Ò@)Ô#îÚšÕ‰½OLËP«í'<hSx4/«xT¬1JÙ¹æÙDM‡LíÚàÕ%M·J°Ù+[žolIŠ ¼âIpA‘ÜHÿ^ƶ¼å›âvXF¥*“ç%€ýÃþé)û ›V³Ñ½ÓÃLN°9ó&­(Í YWÇæýôúºÊ•g×ÔÉN”3™Æ.b£¼R|n ÅÁáü»¾þµ'um®ýÚ¯-ö5ôµ:ÞMV_«WæîÍÝRlU¥Ñ«‹"¬´1j¾ÔÂco¸{§}8Âê# ÔÞÍÆúm;Ø·¤XìXÏH[k;ér1ßPâj+ˆYbÒ˜vfÏËuifG£{ÓP¹0 sOñ s HpÇqX. …2ñá1B‚ˆ24°@”¢É$B„üðsçÜ]€³“³´©â†”W£-ñJë(§Ë^÷¢ƒŸù¾^'×É“×xâ/ÁO,GÞK…½'†.Vf4$nâÍÌ™¥–è}*š°pîXÎcXaØ>…ù n¨ÈÊ8_ <\X.»£:ÒÆåÜ”Ã[ø(³gèíMË÷ÄòLU™²X;õÜʼnØRId©Ô&¥­ƒ§Ì®ª *)ƒ3"0Ù˜eòè²8'uèéL/ES:_L~ªžÕ¹Fk’ÀÄРœ@¨ŠˆÅPM'³›®eÀ¨Ð)%›Ü¤þTÿ¬ÿÈTÓ›v`=õTÚ”³ço^Ÿþ•Ÿp{-æ/Aþ¦ÙÿÅ矡çŸ7Ï oÿ`qÿø—0Ç7ë%ßms ó²öÉ\__cë˜âšœ™»GußMlí HÃíÚô.ËÏt&Œ}]b—À·î´2^d¯#g.”}]þ÷¯k¯ëÎ÷ã—ÜŠ»ÐÓ Fq¢úxZ€AÃÐÜÍõŸHýÿžøÿ}Æ›ßÇÆøþ~Î6yö‚S÷¹¥Ç%õØ-DœÅ‘#S>ÕAªФjkh;µüÞÍ $šÑJ4FñD® 2E© ²åmk¬·L³žªcÑDdc €Nˆš†5¬0ƒ¡š#TwUôd)-ˆ’ÑT% *b‰½ZŒhE!#II[¨$a j™›IFB6ˆ Y‰°&Ê&ãŽg ‚”+hÀ‚DŸN`¢¶RÁ^е ]-—œ:Ÿš§?¿íÿÚô-ÃN#öü½ÑTïµßkçNÃD¨¡Øìq´ÔK¹CN˜íœSÓÍ~cƾH%\É, Æš¡ŽÆÂJ^/Àq¨«Ieœ,vr(ìc ì~À=õ8¯Sõ5oØåµ2_}-’©[ …—"ÈÁŽ–‰¢*bP #y%õ€„)â41C^;åiEî‚ÁDL©8ŠN(²Õ7tí_TFn7¼tJLáŽj"•Éd›*bŒEÊ 6ê¬9–¹}Î<8“ç½jþ ¤óñ›[J·b™.Hh+.£ÝS5yWAƒ ‡X›¡IÛ˜s¸‘©0F«2ÐAÒx©A ĵnϽ_TGÕ¼ù¿¿˜aw¿]Gb7“ç%Ù Ç„à.wÅÓ«¹0cq޼¶S uÊÆÍYýöK`ë,ª aeЕcîWýØÓm‰ûí i‰e|îãñ9×¾[aZâï½ü“*}\¯Ÿ‹G½Þå{(Û3öî$ö]áßL[¶è2f˨zÙ°Çñ–GØìn¬#;#@ F3%÷¦{FjÝ÷.kçU™°ex¨xK ÑD› óÜv—§Í]€ÜàÆ×çöÉxB( šä ¶½ûñ)’¹Û×+ûõ1ÞÃk3 ·Ts"Ó%„ÁÂ=Ã6gQOñ¾°[…×MÞbïÓ%Œ‹p˜0èÞ,=Lhf·‹5õ]R}Ë`e;‚dž G@ˆ²:Ý2µ¶ŒM¤ðßt 2…píþy\üÏšúG#<×Y+ Ý@µö$î­tœ™ÜÿΟŒæjÍ]*›)9¦‰{H¸zaù6>9ØöÙ°§Sñ•G„µ[íæ„1Õq?¥>³Èš8¿…bë^ ؆¤·ý l¸ÎESf8jI =w™‰ 4À4 NL!O„gG÷=‚ð~€h¡M ’Q|éŸh^ßý•~³KÕµw‘)~DXø¨ìé¤V\:¯)æóÛöÌq´ S‡Íâ*áÑÁÆ÷ó¥ë]Û=ì/”¢ôš®Ñ] ÕZt;¨²ÛMó³òÞBW2^UÓ†IVO¤ÈÅùqráô@Ò&Žɽ^걋jn*ÐUìF‡6 ²CmZÓçæ¬þ…Ýoì~{ÝL;!C39¶ ÷¯ÎÎ.Àê\‡¡/HÚÁ!>é…pÂê`ò)ªÝ´ €Ñ(°!(É›ä¶ü‰Á Ԣ؆ÚÔZÚøMÇU"佉 ùòRÝô›ŠaŠBÄPCY¬ŽnʱF@gÀ®ñ™ýùumg¢õE¢(ÆÁ^˜:+ý‘C­@KäXt•SŠ%Nøa”¹ò:Ÿñq óBZë‚?%\›/Ù´À‹ô™ø£ûz1!IGC6I¼(tb‹d&cݲçVHhÐ+§!8UÆX9.ù9V«·ûŒ’™míLð¨`8T&C®h¯UÝJ§#­«ð,¡2´² Bêè1hÝö `× ‘Mš§i‘ÒÕþî?nh;d¨]¨Ý tˆ0 sªEP-Ä( iw*¼ãbÜ ¬n¬3&Ë@€D3ƒî„±˜mm7'ø¹ûµ¦Ÿ/*wSô©(}d¼õÌÒ‡ðl—…/ÈÄIÔ]Sц»±ÇýÕ·>†¤¼Kݬ?Éy÷}ŒyvMKrÚ!–î—´A?šCÓ½ EThRÉo„Ú¨öº”j•éÅaGR†ËÑi$  €ÿ?"Ò0ô(P ’ÿW4€öP @ €x @n€lž‘°•‰<53 +×S¹ú`¯klZµG Ä´÷j@äôƒ§/öÅÕ—zvVØ=}Çþôfm'‹Ô«x…obm;ßàðrÜ=8óeb΃ö$qÌà•¸2 í˜Nû*K÷íI±JZÙ=µ‰’‘ä2B‡Øh˜ì4K–×ïò½ÀOý^©ÄãÑ9Á0VHm «º¥¦['àÝJég3dÒßésMȲmƒq>Öá EÊ xÇ¡œrþ¸üH00”‚qÜL-âLgûä,“-¯Ð–uåu‚ÖwFâi÷¡Ç’î" 4ƒ%2Òh*H+1£•ëæ¼‡‰33 ˆ•¥â2cs®ÈXŸ¯^oTCh&"2Np.R8õy”"aCãAŠ­»"ºÎOÒÚkõ ÕÄïM×"{†4*1î7üå zê-]÷¤CÍwQ}0ž ½ŸÎ)¢b7ÀR¡4RD’¢$¢ä¤²ÈÔ@T$°> Æ¥¨WDN®èÝzß²:©È?A"Fb‰fhCΰЂú¢¾ûµ:³aZ€´r@ ¨dÆjE\ݱôxÈYç’Úæ ¬÷Ùùt]ľÀ)˜Ž+JÖ;¦9 (%øvH©¡Jr,ÂV6Fæ:,p á9˜z2‰Ï<7’ÚìùˆÄ$µ•R¥I³+¤e[€ÃˆØrKr'ðØ9ÓéÁŠ?mŽž}ÊÌ:.UbÁL¦õ£z?Ôs5ÜԄྞZÔ’B­2e6{éa¨ÒÛ¬ÛêZ  UI˜Š3˜É›*Xݱ â•'Íj%f>•lúÒ¦jzQ¯‹û(A€íZÏõ×oòÇÐåg7°' ¸áxY’â zêìCýCáÿ„~¹€€iöÖÇ“«÷¥ÐuLû­5ý‹Ó0#÷Uìèd©Lt/im—¥˜Ñce5w®=tHŽ^Y›ÛÔ—¹ûçé}bôoÒüîr‹ôô+y]Õ?š5ß·æs¯|?«ìÌ Mb: ™6U6Ænþ”ûF°žu6¯½Âû¿W¾ÑZ]ØoU3I9b3Bµ¨Ž™³´\Í.Ó<þƒ›a n‡;‰‰è“²A®ù«3€H‰D$"¡D)¥¨øŠU…Æ3½ÔŸÆT\gf‘¨à”bª)2ÀH c *V±Æ.<úk•,€‚ e êÈX=:Ä ° /]a¥EŽ(€l"OT‚Òjk¦á!2BÇ*¨CÞÉi aS®¤Æ &)ê4šUd5QIaši,R#'MŒ¼yâÇûßëá÷ãt¯É¾¾ç¦X¯~èß1ý¨x¦úÆxAy¦ÀÄŽßøY½öï>|÷iÞ)šþ:÷œÑ›ÛÂ÷á’æäFÇh)oJÅløŸ¤y ÞЬ%i²ÀšhÙáÚG¹•RuÓÍJGËk=îçµ°Ú>{ïÔŽŒ|KÛý>úïàÓž¯Ù?|ŽѬ÷^š0uT ÊnA®2ƒÇy4@k£Zµ¿go|Û¨ö©X­wJÁ´d+lÅ%°N˜*0(¥lÀx«wó6è<ÛÍæÈ‘± Å‘ÖD´S5ZB’DƒÒ0hSkC”=¼CÅ”û€TË^ü oÕHû7¡Kõ½$Ÿ¦Úî÷‰x›×n!47¥+¹:/'%é8N"±ýÍ1M•º&Ên±UÚùð°gÒX_Ë»']Xn#Ä"ó”ÈT1p™JB ¬TóBuˆ1;šÂ:B©;äY£1sL€Æ#åh{k5zôö§ŸúVêm9ƒê4mƒpmrbböº&+Tq Ñ*Ê` ‘ýc„M=H¦Éö/ø´Äê¯[]pK_ÄàõǺð}´³6vš:8Mdƒc?+p·m2C_efçÜêÿ<óבñeù­Ë ¨¨~ˆT‹—þè†ÍºÇ& ÷ءȆHÍó‚& âˆ8YÕ;2e±~û€f zæž j˜6äJ¹(ˆ>[™æ•;ߺW­O¯ÏnfÐIÕï9äìÚ®äÎé<…cB ÝòaœFy¼˜CêËnBÂãÊ@pÒNʼn8 '†“ù¨¢IMp@²å^ϱ»òÕL]w:v$ cÀ"ÒT†'gOø3åsî,Ÿüµ!#9G(”ÓLÅ-ÒÉžþhv~¬~œ‰~`í^ |Â<“ÞÜ$înÄáûTOQWCG¬ Nzò¸Á%e ô€ê5¨j&ÈTò.÷ÿÅp¿úûàïÎо€lùñ$¸Ø½TýSöW.Ö×HÍGA"k.Óˆ jT=Ô( {³úäeúo,ßi8N?ª8;دzí¢™s†±½H)عS~(=ãúßGç…áÏ’»FôP¾òÞ½I1pǹ¯Î(ó”íÇ  ãç¨ßÝù;€X“F—ý^µ£þ(š¹þU>‰~¸Ù|œÖÙ_CÎWžŽ¥˜d$0É$Q.7SîXøÌx8›C™¨°$YÔÚÔq,Œv©Öu!T.?·ÈÇs°omU„rc8ÕH¿ùõ'(^šj£Æ{XÔñÔyöž%BN¸¶tÁé5µó\û¨‡áùžïÆóHþÇßîIßÜrÙ ”At ¡¡;üñÅéʧ՟·»MçÍù¨0ªœ÷…’p‘kX,Ó“£ê·–…Þ[]â,k‹å·ùlû kÇû…KË%B ¡ãp =À[S+`†K‚´ᮘ‰A`ˆućtb‹@½ò€!Ä&fAfà†ÕͨHxþ®Œ¦jŽé3¯öº›g!f ÖÈvbÚ4$Ü*ë­%˜ct)C„F§M| ‹{ùå¶êÙ^˼°l”½KÖ"îô/å“Õ®ýv?óÁ„bߥ]³ûðt»¤ ýûñø§_~ù¯yûß5äÓg[ xΑàjãÖƒ‘å9Ò´À,áÑj3õ 1ØÂævgÊ›‡5Œöâј×kï‡Oû¹ñÌ0âªFlÆ&DBi4,æÕ nÑqÀv¬Ð&}3ƒ=r«ÚUä6îÖW¯<ÜfNeû˜­í¥Ê¿8Š/go*_âÕoúrs± AðšÞ‚ûä©ëÖ¯wúÞ¼?ä=¸ŒFàNOpä1Š,³ _ëçâ/?–ÕôŠ0`x”Mz’kÀMPÒ ß²íý_ð}¬QŠGE-ámêø¸-ð7û7•ùÅýNúºùX<â‹y|†W'ë“zÎgo±UV}É‘$D]ÉßüÃ[e1A{=ØoNbs: ÷÷ºÆPWïŒæŠ®h$S°Í„0xòô©q@UKmÜΖ„lýEÙÇ,¿…Ÿ wênÈ€tÜÃÊú‘àd_=>¶ýõ’JÁ´k„hþèÜzÿ'üfưPèçâ j ©âæþâ׺P½ØÞ¦Ð‡­ÂÀ¼²Q\vìµà¯ºÒÏ·%½…:4ÞÔ7ci¼ö€™lo~cÃðà‡÷.m¦k0ÎqDbã‡~ùÞ«œ@´*M…mL—×Ý_´±Ó±î©OÜ/F –•B}/¶Ðf°aÊvPã'æ,ªü»eOÏT/9—·>*Ûµ'&ÕÂ9ïVæsNùÞ’ŠV†+س³]s©x !ÁB@#¢ bgGN(@a2?ž¹ߣ½QÜS'·d¿² ¹ ¯.ÄHBŒPf?Fó‚(ŒIq¸}–Œ^'4Ô»Ðàª_k}äˆ<#Y L½V¥.¥ý”Ú$M¢!òG×°ü3#ªL`ħÙdtáÌgXïÁÉù+ÕÛÑŽAè"yl6 %ÙPs sÝ v”Zn4 lô[HôWîñëüÇø|2ö×ýö%œwÒêûN{AT¸«‚¯[ñ¤ÑåóJxËe@5hÃ`4J$MÐ%XÓ6­ÁÀ?½ @”qÉÀNœ«³Ùö8?Ûv5üxò”¬ÿäÅgH[ìl›ÕQ*'⿸…þ$¨ò”+è´$ï›éÙW&Ô³-Lº¥òs1ÕüЃµ°ñzPYý£¡ÙÇ—5É~‚Ž©èët±[;P&ìjŽNɨf ¢Y-cê2¯÷aK®ÓQ  x H Gàÿÿ‡! ‚õÿGxh  ÿ/þ™‚JP†Ié J&ix( ͆áA(DµÜ’¿ a4Y.’&Üä+ÃІS§D‰å ¤Œå‘L@ƒBØú‘¹°¢2Vd¼mï÷…çVZ]H‘: H; qì)³õèPïýë¦6Wã?þûî}Ã* šÖ)ôD)Öf§3bOyD¬|öoºݶ,UªXW’ŽË¹Q)Ÿ÷š¤…62 ñĉ*g›v¥k‹Õc7U±v#ƒÎ̧òP|vuïY¡ÐS¼XŠcöZÔ~¯4ª3ÆwTÀŽ\Tvtàˆ8¸‹+ÀqÍ–ÓÆ¦?¶ü‚-÷f“d:CÒç Ú@Œ6%úð¹#\)¾gcÂ[gŽÂØzÐy) 3¯¹yz©’Ó–ó!GZí²Q„4 q®a&ÈXF[Cëªý¡­Ù“6£°n°Åqë|Iy>Ïñ@‹Jî8¤&@¥RN¸ãœÂæÍÚýŽó~íçe~(ȤC¤ÕËÆæy OuØ+ÝËT5ÂLHtÀÚ&Ö"ÓêÙ£>1#¶•‚S„Âñ¦ìO¦€¢ê%»’Ky4 ŒA.$S@ÀF®tB•ô¾ï=K—¦,…ÂItp¯\¾þÕïþ½ì[(›* ŒU€1®þø¸ý,oK¹.ðuÁ÷Ôq>“@ÂYÅßK§°Ð^ÌB&!.ÎÖ*/—}x ÏFfÊHÈbirµ[Q¼îl˪ @¨f5£+D˜¹Èµ3l L\¶Ãµ¹Nc E „…‘‚hé7‹—,TQ¸u7ûЇ]Xíýƒ<ŽË׊Æó ¿ØÌk¸ô4ͬcW}veG¡ »Ò/”kb%8"x¼~ËxÖÆ©ú¬Ö—Ž@JQl/HkÄ#1Ðp˜ó“ù&Üß’@¸V&…GN/ œQŠúÃ%ÔD‘RNB5Õ‰Óž"ÅYÓhé‰íÙó~Ußž®Í%KÛuéYs*OWf®MˆaBQ=Ó`•ùSc\ùûö_9gæ„56*aÚSòZ¡"ùzëîâ7ªS“|-M÷¨ÞlX !ƒN9O|v»c1.tæÈC‚d4së¹È ­£>ƒOz¼´´Î{š(êãïõýcß±ÿÍ2ÿ1ð?£ò·íoŸüöX˹êO‡È ??ƒý ký¹3·¥˜œP6®<ò wîdz‰j“µ¦üìªå1±Œ‹æKÌÿ-œ¸}„íxEŸÔ¯•?ümÛ°l!-Y6Ô¢>J;®çó­SQ—Ž3m¯|1â9ûpî¿7ÛÌúc{¤<=ó'ZßÎñíõÖÑ\­¾žpÆŽß5f»®Ð»Èï[];8ÉUBz"ƬõÛ'ï)ýȳó+Ð-S‘D !"3¨ÊB®Je!qÎIæãÓ_W¸:G%…i&2û.j)„¨É~LkPŒfXNB@ öŠaAÔb¤Länœ¢iUІôŸ4“U3à ª LȪ`QsT#µ´Jj)ª´„uPuŠÉâŠÉA¬ÈP|ìþR|f°lÅ"­U €¢Xd(0+Ò¸×ú?~[·ò¦Ù,vwÎÞÝüqà{ü/gþ·§¹É©Ü+c_Š'MPÿ–^³9¸ìÁ<÷žŸíëöž~9Ònvn$ä7É¡¥4 ᢈúg™©ýd¬Ë …¶h =’5ÑxPYqXE’«ûª¾®ß´"UÁoÓÄ‹WŽÈsä“y/sç·Qãhó0@P¤dšÈ±æÚ0.lýüyéŒïyw©oÝv}€ºÈBfº¤•Q R¤èv†å”RPG1÷2…]t»󒇯 1í‰~ÄË"–Yó¤‡K©JR¡fተÇêÌdŽÅ#áeRÅ—@ð X¥­&J¦šNß±GE Ƹl#$-·Z#[êj·¡‰8£S⺎îÀÂÈ¡2î7ÃÁÆh›sîºOïïá½Ã¥Ëûmò‘h¢#cÇõ«jR‹KQšóv|ÞÒJ}Ýpâ‘©ÀìÞ{çäb)ò $¥+²a}háÈîôÃã¿ôK,þÅdJý\dŸktm^)“*Åi_ƒ$aBB‰Í &¢~†x²ÿ˜ ZQ]ßum}íùGCãØ©]F&…Ül!bG ŠÅ9%Xž }Æ?gñÆV/£~ÇÐãéL(êxsÇjŽá—þò_û¥Îç—ÆüK&çY’‚ŸÛŒÑk¶¸yvcË»,üôZþñ¬¾ÿëþ˦üÉI) I@#Ó“P Ev“YLNÙ  DaÄ«t°ê1NËhg­>v6¬ˆöliÌ„‡ Q†Gïky¯B ²lw´ã3£“îAu´<¢‡Âc™­¶Êüí•vŒËtìjÐCœ­Ê¯@D€&íÁy°sËóë4OYº-܃âLõ&2„ç¦îAWW- öíâg´¹:8—ÓdzJ_ûˉ?KǤ¼²£dzz3½o|Veч ÷<, (²(xa"£7ÖtZÒêN M¬z.8ìžF)j A·Çp—”–Ðú‚8ìdXK=[ŠCí`1zS;A±¥cÕQDùhnÉòâžÕ푾*øø¬Ü>­Ý-´¯ScÞ®š@3)áïvìϧÿª ¯ëØCÍsLx‰˜4puÎ'Q8è“ÈO5ñz­|ÛÉÌ"xÉyvxÀݪshäŸ~¶OÌO»'›lìu'aNÃ',2NÞ϶ iö8æ~Œ•;ÚZ^ró4ÁÛ>£äùNÝc·êt Fk݇ó1À|/ì;`Õ+"SÇºŽ¦ aé¾ëá51MkØüèæÆWv¥²àä¦óváY¶ ˆP5GW/Ì«¥OÝ$¹&FÙn†Z²eÂ|2ËpA§)0m Ï.‚®€¦¤ È35è~ñ€{tY€Æ³ßŒ|ƒ£†öÏÛ]œ¦÷Ë€'ðàl tm–E~ª’vÓèÝ®;zÁÖS·õO?4Âæ¢Î*:µŸ)þ^t×ø³’‰oo2E0úÁc%æðé’’*‡ÝþA,9Ñ1fCçF™KW @ZNÈß5pDy‰€IǘˆÚ¡Yô/ÓQšDQôråŽh³mëOž|fUè}+oñtœí~Ud¡ù1Š$¼Šœôߦ;ú–ÂÝÁã5¬ß‘ÆŸ„¯ ÇiB¾Ï€†ub¡AÈ hù‹”áJ "ˆÉš!äã>«Q†°SØç‚ê¾ôX3%MhkˆÍp-¾L¹èp·…,ªmáhÈxH鲸€DÂI0ˆ.!KµÜE.·†©tGá¨Ó#®b¿ †ò9ẋ]pDãÜàɱé®+ÐÅZÀ P’k¶ˆ€>ö")#6h <Oêu£ú¦7Š„¾fàÞ¾P°òíž,4…ê$H!„CÑ& ˆˆSɱdÜ9ÁõP5y—°ïàê\ÔJÑ :Ü]Ë,/éaÉ#jöäàNhbP÷÷~Ä3WƒÝ\6òÊËãÓFªAæm“¡ë»ç¯ ¤Ù®3·~±Þÿè:cÈJEEà0㈎ ÕÆ†k÷~ÿŸïW{ûÃ~î8篚:Gÿ ±B`Ü“S]$ò¢\mPVºZRÜ>Ýõ•_ç [ZC¼Ûlâcvš^qeŒLAr>zx³î'¤€;ËFBO±Á/`£7>¬qíb·Ï-Y4Sí„2@Ë ¤R i¥Ô¥i„¹ äFMØå³) £Ø©SA çMD~Z0}>N “*²õÞ} Û÷ùé–â…k=(Q®Šþi‘.#à|’6\D”ƒ*:‚³ S»ãt{!0UñèGçÒUƒú¶ŽÝð@÷©ix£«Êì58˜Î³±¯]v–z²ØœmcÐO€èÓ};½¦1&ÎvYŠ`Y10`Ûÿm2Aƒ@í²  @Ð#$€‡ILm£9¶.Ô˜ Ê` @ÒE(Z±"ÃþReuë9mo)÷ÓVb{)·Ý¬öÀ»™!ßhÅ{[¼¾?çr‚ýIìCmÿ?~2Ηã¹Êó8\4Ôå3sü#|~¢•Þ»ôˆä5sS$]hõÀ’Ø¥ÕwC^ßþãåÕÇ:Ùsí8ƒ_?*ðÙߌٿ;âo¤ÎÁ@*ϥЧ+M+ᢑíD ‹R® dg_Ó P°'Z€-À=Ñ|@µàÁF±ôüà>°œTª…¬ÂPö»o*ÝKùcðtßp‡ )¹Î5ŠÔ.õ2 n¨œ‘Üb‹’2o¤y¥‘—*+íÁ¡–‹Ë¿\SDC»ÍnÖ /†Ëõ¸íð˜tÒâ'Óm»ÑrØçÖDl9{ (¼ðÿ$ÿ/î¿úùjõ;®’ôâfí8R[€d #_dþä‹þõ‘ýç«uÚ’^d$ yíê‚BáÉœÐ7$‚˜‡ FfˆÈ¬*yÀE3j‰¦|bœk6 ÑPˆÜdö`PEzðæT ¦Ð1•@‚ˆ×e£ScÞ>h¡õaÞÈvq:m×w÷¬ù×›yWéà29¬”‘Õ™çcÑ—ºÆÖbò¡þu’%?«O™nf›†808q˜&ë =ÇSР˃KÓNÁT„¤ *ÚsRa¢œ^nQýtÈôf†‹JéqЀJ(¥,à³}‚X‚äBeû"a˨ t®š>á$œhZRh1ÍxÊq4ØÅîìw¸mê ‰½eœ7ømóO(A4z8dZʧÅu"zVp¬p5ËÉGï´F§ÎÔ´]†atWûýÄÙsúŸîm½oø® ß5Î&P»P™š$¬L¢©ƒaÚšÂà ­A=ÂÅjRSmXÃx¯:_D¹V¹¤U„»q‚ˆ#tãO×íûURC¢¶àïå~?ÈûZz_?îzÈã‘ûÅÍ €$Ô$h‘à®þ8­Xß²ŽÁ_,öºvV‡ëj5ïÃ#7û†û¹œ‰Ñ‰T‰F Ž€’B $Ú?¨.s~¾:‰’~<å¸Ê#C™&k J§™"Ï”cm7±Ðá¨òAtšiB|^Qûa¾Ñϲ#½GÒ,ë£lû=Ã8µ^µ-J…Åe£_2°IóÀ ¢D$_.ĶF—+*ð4ÝæÙ½²Ÿ3^Ôž·MC8µ<ëXeK%—,é”~Pꯖ¹¬¿×5YÍ4 ´4¡/*RáÒ‹Ø ßÄÿhðpHUŒêÆããoOY}ûX†„O̧Ôj5·ãS¡é æë±7ÞÒÚ†_>ô‡‹ªs‰˜¨Tó.3uˆ†„ÄÅ@º‘|Gu ÏŽ¤ ¦¸*$5ÞÏÀÉfyí·EM=b,ƒŒ ÆØ:è\n#u½ÌúHâk^8† b!‰”ørRœ‚@(q˜ ¡H9Šë×$03 K?¹>õ|¾…E6`ܪ3¨±Ú±ÏÜ1=”2f È-Ö3»öHtšÝ{ÏG9ÿ¦)Ô_¡-E wXT|©,ž1>ô 5Ò„d-ש†ÀæÌfH¯_/ö ÷'ˆ# þPÎS¦’zûߨf¾Ê|Aˆµ löÔ€z{ˆýÉiÆJQ#!Zz®£áþ5nÛínÆ>‡ž™çÄëSaÄêÃQy9S à㛪™±Hï’³¹-ëøØ/ü….EÁcúqÊ=©¨~¹Ç*] ´®E–kˆ$º¯2” ) ÅEýš>G4M ­Å"À£…¤—ÝíÅ\¢ÐImµ…aÏ=,]ð•ëÑ E·ÃjË×Ó_^ýh‰§‰(BùUöÝ„ðP,Ö‘AÓp Ãñô³‘|÷öÕß~eï×kî‚© 3VwجY—üEKÞÈH‚âD‚ñ ,R#½ZÞr(µ·8k¬ «„¢".ÌxüŒk§ïwV`%!¤±8* b,‰PƒÅ{Cx:¨¬uØà™úãb‰ŸÇ_XDv{çûäÖº{»ñ ¦5ÝNØF{î}d¢:Áµá¼þž÷ßý3ƒ—ÿ]›ð éHÀ%…w°€a* b È é8‰ÉHrëé‹§L˜aŸÅѦj aeQ–QÀ»"ÒÉÙ'¿j"”BÙÐ^÷¹v«x¿d"¡Å9É«ó…ð"¹R0JxÔbÙóîH&—¿t,7 ËÅj‹ù!VRhôŶ’43X'üÖ˜ÌÃïj7ßÙs$ºé: ~å†cY¾=ï7žù?¾ºágh;ÂF…2¦ŸÑœŠâ®è¶CMPppú˜ã¢`zìHÆO×r+dj‡Â ì)”Ø rÆÐý>Þéj¯-RÛ.ƒâÂ@;_B{©‹4Mp›aìÎ. =>_Y' SBùÓ1|^¹Uã1;ç/bèÍ|D7–xeåæŠêo÷ƒe_q–@/óvV¹‡=ŒV/r4 ûç‘ÂûûÿO9ÏoÌ?àÞˈ^9ò.’ÿæJ²¬·ÿ-z£O¸?X4åtÃÇ1 j^‹›‡”u9Ðô7”`7Ì26Ýd±kÀ–Ôª?õdôä}þRUlŸ@OÅÄ‚kÎ’¹·r!Ó­m¬ž^¯©Ä^?À Q‡ñhÒW¡µÓ¸ ‘ËÈe­ˆ@ú4û›uÞà^“Hd¨ëü¼^ö¨*Q?Y»"ôî ܾñ#ƒjxAÈ4bý>¥¥Ë8a” 9†"P]Y¨ j[$²>¿Ï½V}ž6TûšÝ«w÷—O— øu[û²¶öÔ^”¥ifN.^þ¦îÒ5RY{ÿš~>½²áƒ@8Û Üû„ù÷‚6­»údªmç†Pksp,uºÍHÞ#šb?€ÂU!DÙn›]_ÎÑè´H­2:=©:œT™&…¶B 4§á3sÝv~xwö$lËÝ¥«Z¡”ªjeè Z5Û%ôœŸ{í_Áw^¿ïí<$5ð›ÔuøZŸ«çOôäùÔ¬øÐZæ#¡á‹buIsÂß~Ÿ°Á¢±c€Û,܆RḬ́ÚïéÛÝIKTöùÅ¥–h†³æEN„›pEîŠ|.WÓb[‚!˜Ä - ºíN auV”½À­Ñ½wm}çÅ¡¯ûDŸ½v¿ mdvùA‹ rƒ‹ß„m¼)ª´Y4Lv‘5ªUºÓÌæD…3+î¾{9ùv-†íòÚræèÍëá—c€ªœŽl b‚™´„9 ÞíÐÇOâ­Wnçç^Ãëxãµ§Št-ûÀx2E=‰vîªLd‚0§ ƒø)t"¡Šâ9„ÇÇÅ÷gõ#bÚu¨|{<ű4Xg,ÂÖ²º©[Ýà *RÍZXËfæè cT+[¡~¢f$¹›dÑžU$;¾fšÇ¸]l[”L1Z1B©vg™_²ûãCƒk](ǺØŸÁuúS\{„ã ŸeàY‡k3pmĘláŒ%üt1Ý"ôA øÙè—pÑR—øh^IÜÇbùQÓMô>%ñ.Ò¤Œúþì§Ë;€>Ùü>ëôwº*ÑÍàTº¶uÀu~ÝÓkÆVDѪößçlô_`©( a€!ÁFC дЖe€ i›š_:þ““^X)ž©p¦Œìêh¡1¶8m÷M./5Še)F¬Q˜áXÆw«N€ÑNtÅOÙïži$ðÂÌ%˜táì4`ÿß> ”,"LÌð …Ð`É#@Â@< 0Ò#€îvYÎ÷Y]p4Í;¢vx. i„ÂÄ5× W,GìޮΧúwÇ\L}1ê(guÿõÃŒÄî›EÁÉó1¹é_kqw÷ yÄ‚WÚù>žÏͱY qíGQ?ñí^Ž7Ö{ú2 l|ʃOsÝYöz ðu«Æ|õN¯Åò™ß(=â¹[?ÇÕ—ÍëZV}zý”ü÷JàëªXS˜ò ÛŽ¨f~gz2eÅ0 ã¹ ‚w3b¿ µ¯‰Ýº (Uåv8­3ˆðîÖÙ ¹Í>‘šÖAÕR+ßÎ5Ävós^x:ràuGG¿hBï›Lù[“Ò6g@éQgÛùÆÑèy¾²‹ÒšjçNg‰r'«æpQéiÅ ØgЇócìhp4 ÁªäöWû1Ë^#ŒvÅÞU$bôëû©~ù0'8”ƒ?ø,Ð6 ÂåÏB´å˜øÍep äðh35»SÉvûl|Ë{ívÎÕðbã>éô ª4Xnü‚•ÈÁ¼¦ B›o«—ÙÅ83•-FmôEôˆµN¦þ‘«þcç‹ô &«ê|…<Äa㟳@¼Ì^A/`?h0öAšä\ð‰*E@¡sÁ_NŠ½Ú£ÚµH¸*ñ•ð!Ž";êOM'dFF¼@¬rö c[K=;‘ìȈÈðWÍñhûxÆ>eíô³>*ä1k!8‹aЦ·µ•ä7'æ@è`”ÇðT¶æ‘¹¨x¡'2K H$@4*aœ*U M°8Ä((æ1f60ŽÀÐàÈ9_¬•ðy]æ`¦ñÂ32]S2C ·SG –P(¡yÉæMÕ"ñ(k®™DT9å´"\Á*"¤L£Î‹÷ú¤ŸK¯}­Y>ËŒuåçë—æ-z}iÇuëQã&2íDa"Ó^ð¸Ë€Xõ—¾.íz5ʽ’kXixù¡ÖLêÕëïûòñ‰¹{kˆñ«Ì0º¦’\jjÌÏs÷í®“iòB•Êƶ ¢Z§µr±,W© >uƒŸkšK]¡SATÇÈÞÀ=Á¦Éåý°¡út QY_ôûä‘D3b¥üTNjÜQ³.¢Ê¤ÒD!ÉAÆf¢ÎÝD ƒPtU,_üÐs­Ä‡JHlÔ@;©¯tŸÑV´žˆ4õ¾[ÓQµQ«‰×9g¬#pš-§{âNቷª|­½;[ o•Ébº‡±æ<§«>VÍGk{ðÛ}ñ®‹j¢Ë>÷q½Ó>̳Í‹¯çk¿¨u¦‚0’t­¢Â°BÒH\v7ÇGùíð¾ƒýZßû¯œ½LT_¬çÕLëÈ: Y ÝX–L"·²»NR¾¾• )бC¡rWËP´Pµ‰Cdáq+äý dhŸk¿:‹QÅ&hãn` ,Fw´'ŒPp6Ü,/»>íÚõÊÓURØÃ¡ æ`^ ׸ ‚U@p•%¢I ý«¸’ôÁ+Pˆök•œt U9Xœ3 _™Ø‘;Ã!$""#ˆ!µ —;?æãéFô>™u‘Ž :3²Úî}óY;›d¦ôR?žï‰Bq1hAP1as—ùF¼ÀO­úœräí=¹¾?fRš'“öÌnö.¿ooy¾Ýþm~›.áÅD‡VQ#\öj WëŽÃ2×Ïgîg•…én=›”Ô}( ¼d*T@r”®7­!Ý„Ëä/ô<Œ'Ca¼%—Ùnc"Bº…<^DM}%Cán JIt©9NóÁ,ÚA—" sVi¬‡îqaimP®´HCdä@™Ë l§£áÀbXh*82ÐGÀظpÕ¥+²r…¸2'oÎý¶÷4Ê3œ3®`KF4Ÿâý¥üÎò³>,£®fû¢5D„)aËêÒÏaü #nþÛnþ©•?Jýy° ©0Ã}[p+Ä3“.ïgõï·SúÓÙß\¿YþÜÃúñ/kgNn£“IäBõXUBcpišZ ™Œ’VJË¢%åNUÒöÓ½ÙŒ(¥Ž8@d1`@…*ŠÊîæ*ñûÚí´ó¾×Ø=]ÅbTdl¯:Š1iÀ^Ñ)R¦@ÇqŒm Õ”°Ï(ì¿ÍÏwyv9ƒ×t8êsú‹ß®ÿ«­7‰¯È½&ôð“¿f‘¼žó6·Q•k/T²¾I÷ùÎYÓ““{µ/Š7n»w¹â¾ä!º,w‘+°<¼Z-ª´zï*Ù1Ç®«WJ'×ã$êäùbö5~ýúí *õýÄogç;ÆTÎxhoeF—\KzxÝ•Y«’+¨A,*[Äûìøå”3!fÆ®›;n9ðqu–ì v¶žyúdÝrñj}r‚ À›!Š@Œmq Æ|,#I"$ùYшjÝytF]òõ²)§ð63¡I¸¿$ùë½ócôK™m‰*¯D%PÑ ¹NzOm÷É0š®-7î‚1P쌒$í§Ç¶)“ÉýŠ_ê~]þç¤Gò¨`¦'™Ú^.µù^Æ+!€),‘€_±üÊ¡MÞ²´ÞÎff׃GE®‹†zÂt€‘–3gšŽ!5ÈlÞ~cÊÊÄÓþøìo‰Øü¸AÏñÃë9¼-¤òÂâ5¤E‚b…TˆþqìüýGøF*Û>~WÊÍiûhÎò¥ S^žM÷bþjÐ÷i.Wê«v|½4hïÞk0C‰¬õ&êdžŽgsÈ›3·¹ÿ•¿y{LßýÕèü ùÄO*SòjÀÊ‹ÊÔÎ E£EÅeU#f m€CC`@Š´’éacÍR¦·¹^Ó”ºrp‚ˉH¢'y 6g:{›K“Ç$ì (|.ù ño†ÿïÆŒ¼ »÷}˹: ˜‚[»óm{ö xê¾ú°ÛP‰h¹Yºê$-|ôІÛ9'PˆXI"Mªnmh[S9O½ëÑY„þptÕ¡™õôXÈ(e<É`>0*Ät†+)SÕlñ‘NRÃÄ„$À¢õPoYã;Gu_¿¾µ´2zªn»ôzB²i< ñg ¥Ò€g¨ ùÃ-±ÄYÎ2‰€ ‰œ4¸ Àæ:ÍÃ:â5Õ‚:$iæ=œÎ/¾îô5ÐëÖ½WëskúÉþ8ü©¶¯@ƒ„67Ézªû+`¥”ûVnõ“wå›êßœx<œÎ¢‡ðÿžàdë~3(O¤ÝúüÌ~ËѲ}ºg¸2¬¸÷ßßò|lšþº«½+ÞZX’+.20[Á ÓQ³Çǧˆù*úª@¸ôÒÇPµƒi€á- ØQgJoæ³U¯£ÔPß^At:‡Ëú½'À1G”×M~nò3Ì ¿Á3 iç¥^,fHmjEðÕüÄÝmÑjÓíÖn6ÝÌQdÈmú(”´ e»·].n…yŸÁD·fÏp(ŽÙÕÎY»ÑkÔ j5§õgØÓ‹¶;àjh—p¶Ö!*\êÐ ÜôÞ€y¹lU.«æþ|:¿œü'Œ¿|·­ç·~»~%Uq¨øâ[¬ÞÛ¬±êømÜpÓ¦wµ u†ª^xâDñHQ£=ìõä'Ï À`Xv&Ö'JrÞp•Îö¦I­ÖÍE|¬þÎÑ»%â‡_t±îïm:ºðxbþªŽnÍãF°™~<½ôÓTèN<®£2Ä‘«üLÆc ~¶?¾[qm†ö­[ƒcqvcD>þ"…/¿ðOÆlv\@?…ùi ït«ôÕN°¿K5ÈnW2/P­"xû-S(¾š¹¤ççÎØÑ¤2tu‰Á9Cxaé±¢<¯qz „ÂHzÑF×Õêy*Se"Ã}_ßí ÏÃ]òMÕÕ*ø=¡) [¢k ë!a»0©Ý@b !CŠàVé¯ú×GÜîÜúØ=k<ãæfáÁvý”ôvnæ0~ènw}æ7ÏEv0tY‚)"p“ï5KŠìĦL ’‚ýÁ劒éËÒhódZG~kŽc{?B‰™ÞSÓð"]`mê¶y+]Ê»€<ÕËwmúêÕÆ(}Ì ¶cóÁÒƒ8XþÔRX(Pé®.:cT+úX´úêø+åá&n»S{ëK{Üy²Æ$-PIз^LLŒ"\ǘ6áÖLž0h4e,’…Ð÷à`õE–A—Ô4×AGÒ¤e{ùxY³jë-}ÂqUæÕ0úôý»¿†Ô6‘¿Ÿ¿üÖøšë;ÜøëoW&ŠÖíüÍ/úÑßþfôz~ôPd~JܯÙµÂûï²)r-:óY½Æßü-åÏwU_l|ÚçßdLJ)䊊–f]T/c%0ðçÔ…]òkóËmjžuß<Ïâ`5-}[;ÍIu°­ ²³è½;ß—æþÙ{µ9å7æ]ˆaäv}Þ×ç÷6wlN²¥1˜S…S&v‹V˜†ERà_ú#çðŒó×ÂþÝOrû®ìœÏ­ ,Ef&«}ö'´¹û˜2å"ì¸B€§‚J p/¯‹sã¼\§#ÃÂ\'x”,"›„J)8€£øO”>Cæpãþ|ˆ[çŠQ‚ü~¶”önGË^Zûçæ¶yèu=:ß=Æ>E+ý*¿ÛóÇý|=wDT_±xvk‹'ìýy²Fø2ÑJžíÑøˆÎ’½ÔvTò4 [cÏÏ{ñãu€·°¤Ðß3cÛ02J|˜ÞbO«¾udó¼~Ûã城ßV´φyu°6u¢°7ú§ž×l¯©m{UO”(åZOçæô‘ÜÇQTd·ïÐ倕Á°•÷]ïô@î –û>™™Æß®¾á©Ù-£|ÕqØ´-0DYÜhªÒš²ìhÿ25ߟº–½QîQe—³p"õ”êv´/è5úöN÷Í¢>•0ÝÇ—‡ýª¬.ä^TúY-ã­á9Öu•±B8´óóÈöfk¡…C>í\„‰+yå"ý$Nûðv¾´òrú»¸ú½‡k.by·Ï±ÀÃΡ™§Rlu“Ó¶Ž#¹/›"˜¡cÏë±å×Âj¥æw̉àŸ4ñWïñ£Av”ÖPåR¥òÀ ¡äo B3ŽÄ cý;â÷X×ÏÐᔵ•z±hÀŽj·Æ9B9äëCñfFÁ‰T!%jáSa%í%+ÙJƒ‡u¿mã–‰úð2lŒ–ã0é" )Ö#–bEf^5¯sUç¨:Dr¢%Yù™‘žo¬\ûBìÔã…†,;ÃTœiZŽ¿8!¥y¹aÐ/3_4—RÓú¹rCœˆ]ø£{»nLñie2X-¦“ÕÑ(¬/ðG‚j”m6 ØõCÙÖ¸Oñˆ®-€9º9§ÀŸs¾Œ‚Ÿšš+÷£yóWà‰Ð\ï™ ¢PŠMXDSýªOš½§ð®RN‹ (Ó¡ÍDPL;)uÇûì>øŽ>êé÷ÿéµë†ÐZ=©¢Þù’F‰¸ ½Š»šYl¤®ú°©Á…l!W´%`.Ö7W×´|o¬­6³GØŠ´!Î[±¸zý³(J%8BG×íà@³ÉLäzy]nèp"œÉ“µò:B %c.^Èh0‰"×F^®Žd0LŠD«{4(eÚZšð™éšM¯ûq}3žâÙuÌGYõéÚ:ÓìbYjce a^}T÷l7Í“ª5Ñ…|Ú¬A(GËæâyuTc PI¸ïû©e0i?1t¯é:^áZþlk^稟=uöhs¨À|¶¥ôèT T”åh{Ö·<\šzÉüœgö{û~IxÆg4ú­{B®eãÈ€]ܺ%m—p$Gþî›ÇÍ?ýh7n}¶^®êöe;Oé MCÃÕ%b#B‡{ï¹Û×»«ëZ§¨ô9_”ö(œáµ*I°©‘OV[RÞ6‡œ ÅU¤¬ÇWîƒ7vQUšÁ"B?õ/}Þß±É:œ%ifÎr7^gÂ¶Û €­±"S†3$ŸäZH_%Ï<™â¬pÃdõÊ/Î% ˜Q†Ä@"„°Ä[€”m\.M[A QãV÷o3{> nbq¢ôß7øFxh€ZÌè!€A…䃄 © ßëõlÇž×bVL»[>k§0¤¼ôù_½ÓW·?ÞýÃížSuS 4‰Œ8Ú"“ÈMf… ŽÔ{ÞÕ¹ìé¿ï\óÌΦrý×hŸ<~¿ý=ïîO?7Ì¢5¸¹| ¸Cšçãñas+ õ=]#´¹áÍÚ8 `*-›^Gx^]kw² ŠùJ¯$˨ƶ`œ™Ÿ^Tó‹_=nˆ¡hÅÃ#dõCßW‰Ã`ƒ¥ÒÐ~¯äõ}íuKЉ˜0²gwXÃjŒfUÕ´+Ÿ™Æ<êËôJ€Éß ±‰â4le(·ÄD(™ª&#ÉÀ )¬îÛ']‡ë¹Ë´˜¹9:“f¦ÎÑ‹Y9*Fˆ5š¸ÁˆÑ;"ä?é –FÑ^YÒÉôP lÍð]Q¿gê°aÌzßÑб§7ÕLXPiš4 ªr„° Ð@4IG„xwµÖ™8fR ÑVW8³¸[εL™n[Ru¨ñÁ?ýÛÛû_Ëñ­®ÿBÊŸŒAÉŒSÖ©º%“0Ém·Ë(‘†fàêbŒºwRÿ3¡[DÒâ™üŸiÎ*ìltHNÏdlC«8èçÉ´'é~¼÷^è½ÿö þìOøSªõw“;ùøÒS\T"4¥ %( , TöF*ØB£Bƒ8»‘"2-Q¢Ž pÉg@Å$`®¿}jùÑÁ¬ãÝ÷ÿeHÔ±+tÇ+3ÄR ŠšÉ•‚H!ßë&×V¼KЛF øÙoÑ ø}øÙcÚÉþ¯þÜüüó/Y.õ,"Þè:[šœ÷óv£t鈨ô]]˜As°·¢ñ¢\'ƒ5pßêe¨ïzÐH2UX\–¶†ÈC½ZŠ)ùj.hßd#ò»Õ&žb ¤Ç³=Õ©+µ_¬‰Ý?£«b&=œ“´&5¯b¯}a—úušù‚„áL<õáSšq<˾׊ѕ¹ÑûÔusƒ[BF Ù#¾æŽ•N”+¹bGÌk¤c¹cÔdÇ÷7œP01Dú#»mþ ýj©U·á)T¼c'ä’•ª¼ uù&c|nÃĆ֪¦U³š<–ÜÃý” ±Rš¬4 "+!‘-¤&ö"77«ã©‘¬:Ô §ÌAExNëŒtC@gÚ™‘©€`„¡˜Ó¥qSJvX*54ßWå+‚Ñ+ík»±YLNz(_#BKØùüõARÎrÓÉè]­ìK-0‘x¿‘«¿ÿü¶’¿úéP/ýv#‘º¤høëôÐ?ÞhóT”ÔÓuÓ­Îk}Æ#aŒûóê³~t{>x7^¾Ç™à)s’Zd—£J¯Gku†·`ºà Š¢„”…`9¤‰’žØÚô*§‹¤d*G(VBr\kŒÊ]MsãpŽ>Üçæ°æ5g,†IÌï"êâfIoè?ÈÂãíS”›Î¢5´ ì‰YmÑìQ¼céfØt¤2òt„‹4<ŽŽ•gõ7ë3^…¤ñcºÿùLxþaó;»ÿóäsÝ[h«Ja_êF'.gJ“ŸÛƒ5m3Z>ï@e7¤Îá' *½ÚI4«ÜdŒðþ˦KÙ—œF;€¾?OÚÑú‹_ ª€c¾ýT:•q æGö¹7ûLciˆØÀȬ—¹ºV|ZºA{-°ä‰L¤ù(ʶöÕìô˜ïwö“‹&»Ó°•î¬Þ¡áÖ˜{oj§™B>ËÑ&Þ–éÑl¯˜…A…83˰à©]Cjø)g/¸`oì“bA‘œ ìÍ`vŠa'B4¡;^W;>¯L~JÞøN7×穹 ±gPHTÀ3æÃ­½YKi›îzêBËãú¢©­Ÿ¡/Ûh[Q'¾E‡æœæ]H/º_{ÊO³Lˆkxmj'¯3/å}¨}n B‚{m†eÛ(cd³tõáF=€vš.Ø7¨Ú{4¿m¾r !b€äãé‡ßö9BŠNñCëúÞ>oSU!<áAô7TDؽ#:ùŇ;Ü“l™çFmXP1 :ˆdÚÆS­êÛª\wùTϦN8¿6‹œýÇùlÏÀW—o½èÓ Ç·!‰“ïôŸâ“…H" ï;TØd¨é±.À÷’÷YËr!¿vâ¶T½ÈíA“/ ¶:jˆ›Ÿ!º+C2I@ $`h«CTk–vVUUŸ ޳;kýnl™ òBa_¥k“+ÊÈáªl)Í3+Ëžà·Õ§Ð™¡…áÖ·#Rj|¿TVrÈ@\þà• ü꫹ß1°wÚÌG~W‘¿žñ·Ø*Ñ@"rÈ“ÕqÄeaŠ5^’Ž1nfc“ÔÂÞÆ`n׉VÝ­uÓ]OÉÎ{ rY4ììØG‡º\çm91Û3þ=¸ ª—µÞ4¥{§,Sʱ÷‰çS[•R…äý{ûVƒ'(€† *@2L T{:r<Ì÷_;Û»þV_Ü|,xÎŒÄ/r‰Õ¤8µò–{çžù~ÉÃÔ±'MI "JІJ!X‘ Âk>uEÐ#9[Ù»²u÷F ¦ƒ_ñDâm^-‘ÀTP¦ -WW$`„™&©†ÙMÒ:1†”ˆdŒf Sœt­GX´ûò·»i޵Op¶2}îwþù¿÷ƒom¬,\ƦîˆÔß\Y›Ö¨ÝQĬ)~$ô-][›Û¥ŠKíb¢¯˜)ÂFQV¥™q’2I@”\sÝæ™c(xXP䳉Üñ¶µ×Æ:T,MöO¶ ýîËÑ©OÝÓž°²Ã;_^´‘‹…èý;í¯wm¿ÿâÿÃüî‹ë¹q»óþæèx?ÿS»Z ×½!Á¹á—SúZX/®ËÉGM¬AôUýäâ!/86¼Õ´WâÍXR¾­µ1ñÆvüÐ9ën†&½[«/3 ÔôCÙ¯qT>e&K;x˜ÉÍW_.ªVü2ÖÀ›ˆûn“RýŠws`ûö¶Mö‰ ¶œ=cÊæÂ™«ŸŸ”XÀKCä©ëÈv}|Î9,LÜžj 3× qñ@é4ÆÿëhÒ“ûIƒ¯ð:{„@Þqjô<Ì&ea¡ÂsYN~Ø6 t©èGâánÆ|˜"ÅSÈK4ya%!¤ß²Ñzí?w‰çؽm‘PëIá÷–Ý–ø„|ls`p¾…XŒŸ7bhùRmôm¤c_Xßù»{Û¶#a ÂöWLZB¤Ý‘¶±¤„–¸î–hÕ¸îïžÛßu X›®æ›©åD%jœ¬¾ñ~ZCz¾3¾07¯æq¥4_n¡Á£âæ©Z×¾ 'UBx÷R2“tY;„iK/BUµh«ógq*;t7%zªfû¼Cj>qA—ðÞ8e„ê8Ê`ÅÔz´ÀŠv¸ºBžµÕ:1¸ù¤§D hiG‘9Ü| óɾâûßü|u«•×9rµq­n:»µ lÁUØ,¡)ÉiÈš+ÚÑÀ<Ë™P¬sèÓÝ«µ|3‹ãÞ§RMÃjƒ¢| -íã&+ZåÀ2ñÆæÆ‚Ê.s©¼Ìê †È‘e‡Ç(!XÚÁFíz¢ƒIòKTÿùÞ­!¢zPlðõq~áo¿oôèÐTé(¹ëÛÙGIBš.¨i$– €„¼TjH@‡q=ìÈ<·˜¹êó[ù°îk‚Æ%G®õ™|f4œ˜±  jáÈüL±ªW’_’ÆÌLJ`§ËUÁ°‹¸­Ò€Ú¼´X­0Aù>ʱû•ÖÀ±ÚFfž 5n¯o7Ä{.¬WÕ…ƒ™H­ÂRþë¾Q\½êË…ÒËm<±Å7®•™ÚTƒÔôöÜtâ39%^éAxG*×Â#è"Š^·b|X¥}álÚŸ¸Û40FÉ­õóÙщ× êïU¾Ï:ÿ8+NàçŠY%¤+ !øÌvnÖ ¨ž"¡ @„È‚9K¦Jeâçøüël}ìòGÁý7o|þØgºWÆ×ÕÚŸÏ Å<ß<µfçv®¤æêxþ õÕûàT¦+¨Ð!Œ+YÑ9˜.w.ÔÖ«½0DάõŸîý®ú(ÙóìóÕ]ýÉTûfB•R—À–Wa)»r/݆(J=´fX2 •p\%!1Õ•R‰gÕÅsÝnÊN9©8‚¢Fá…ÞFþnóµ/ÿAŸîº¬ºž¾Ó½‚ÿÅâÑRÊä•®§?·ÜsW&qA eM¿ÔÔžnühë¢\¼†í«ÇædéEÕåTR,Ô-¤TY¦Å=¯Àbö܃ӑŸÑEÖµgíÜÚD —ÏYQñPCÄLRÃ)LΕÇ,NuVÛ<™­ÐXEã¸"’L¶aÀŒøÒÍç­ßÍýýk¥ÛÿåÞÛE> \“¥KªìÊ©.21S€ÏãXÁ=¿y~ï×ú퇺t]M_Ë£)‚v§y8%y Ñå­™¦ šÇ!eà.GI±Œ#Ñ`!àS/—Öâ¬ÊU½7bÒ°=<µeå1&·É,%Š(­Àj©‚§ÒdÃúÙùÕ¯»Ý•°¯ƒ#† äWz¥ ‘,ÑœÇÑp°U(‰²”e·–‘Õ a•m H‚¬ç±,?6wèiôÙ*ŠÉ>öè.ht‚ %™xÍÊ4€´bKդ΂¹+Ö~¨½òæ[ÌZ9WvgÏݟǾ˜;2ÇÏ6š (¤D­ÁWSÕ&óý¿Â˜È ëæý¾wÈx[ù¨¶dЭ¹3ürT~iÏk>üò-â7ˆXJóBöæýþÍû¾Ïss2}·»vZ¨™‚;¢ƒÑ'æÊÚÄDpˆV.Ðâ`‡Ç ñtªíyT™­* ÇTA É€1Y~Æ€šâwe/¹D,’€“ôH>8ZÁÙÊ P·ODó¦Üñ)kkÙD?/Ø*Õq¤ô©±™D°xb V÷"F±:Ó°(d°AQ+nÝCx¥ä5GMņ0pÚÉ•À ™j ¨ FS êqiô “ÁŠ¡g¼9mæ_*Gë_¤#y~³„cöׯ xÑùå ðbWMqë9Q'_õT*¸Öt£&ŽÀbSrw_t³›§å¤vãiõ2Å”Á…Í KuÙ@âþ›sžì‡èÖìÒqè¶ DR<"­‘½®¾Í@(bðÒ¤k|«s¥5‘?"\xSÕøÅ‚å½\ªwÌ=™;ÄÔ‹â)ºÐ«d˜óÅöôzý,¿m}ò[y÷ù09/ÔÙ%ê(De H0ÄK†‚ Ä„±‹í–™\5jª–÷£¹«ß¤}+ì€YL”[LDDž‰Ïy+ü­ÝŸFþ½Ë¿õ´`Ó2°±aHHÈCitȚͽ_²$ç}~2ô(åHÿü7ZƒývæÒã¯á”øòí ¾;šÿªÛ2ë“ïÓ§ênoÇ{ðt˜CKwÌK÷mÿ×Ǭ·A®êE\Öê¨_pCj%ˆO­RUE/,lÀà!>©&5-i÷"\Ïq;Õãl~ûDWæ–Ù()ÌLR‘쾆×6.²s‡÷á=þ¹¨ÿé¿C‡\Óª<ÔÅþ››úÒ¿úØwRV™ž,©ç,Ç!9ðxƪµA}·¯|¦Õw¾»GþtÑ|‚ÿ%Å7ª+Þª6ä:ÎYqª<î;kFœæò£ï~úímø'4‹hxmR}÷3f’5kᡪ;ÁôÔ˜šˆÛù ’¤–ŽE‚@ìè¼âµÝKí{n¼_YÿV±¢“®d¹áª°-k±…Ú!S¹¡ûŒBF‹´ É•:Ê1bBwšŽLI¢QŒ¨ ‘X†ÀzNs‚ ­}ƒz¬ûŽr,œÂ å¾Áæ²;Å1NÔœ˜Š J‚¨¹95ßGn÷¨HðA¿¼Õî/ÃÐ$¾œz™@\ÂÔläìÚ³Øù1øœüGîovEÉš0%¼õpº©;õÒîñíš×o'IýDwsá×sIÉ¥j5¨ÜDYë”È™¦ØÇõß¾ü®wî´NrŽü®ôéAŠ–’jìC mÀ1ˆÚ)Ô`e5I@¦VÎ÷zqñ~íW_| *ºXù5¼Çì&±ÙF °Îõþ™ãC‡ª¨ƒÅq®è¿ö¾oêó6~r™`­í–£ 6K¹¬kjó ï±DÙÂý·O\ÞÞÎ7à3í:š3J¨VHl@¥Gnƒ²ªíNþºóþã?ÜßÀ?‘6H ±e»Õbái¹aªÖ;Ú{6ÀÁǘJŽjCÒ qÍÛ¹tRæ5=~ÙV­9sðøröÃ=âÑk¶q+Ƈ£oãÇ2:•›ê¨]¤\z¸gÎz§çÙ9ä 1}‚¥®éCÅS«Mê.½½Å@\&£À§|¨áÞj~`ä¹Àöú¦i¼5öïÝ5Ï—ÚU öIm}‚D3gìU”ü“îêú”ƽEÐ Ÿ ·óÜIíZHÒÎ'I–µÖ%V,Riùs€Áýg2ØÁêæ%Å;&tóøRÜk3ï¯1{g·,ûÖÃnlãèø5:(Ì2ñ^‹˜‰á¬Ì4¶ZÞ‡»2@ v«©|Mêh ¬|îîeowï÷ÃA˜e³‹˜áº7T÷™5á ((TlŠ_ÝbÖdd–m ¿Ž‚áú ±Àký!¿©ºŸÆ:÷¥”Z¼Äþž~dUšœÍ"üìfL‚Ó1`7æ‡=´mïï*ù·Vyh@­‡!³ÏKâ ÐoOu»Ñ~nüPÆø‹—*iE,K­TÚ~X¾ºõUÇää¥íM»ox–»-ÿŽÔªõú£«ûñÙ϶nœÉ锓º½üêZÊøzÄ›õûóøW>ö„[d!I (e€VÐ4g8 ½ÿþøyÙ"ñ¹þÚìG á'E¯é«²€Èèb›ô¦Æ·q2 øØvÇ1†Ôú©]¢U¾†+ãOGÂÕ6Ô­æeŠ _£ý×ן)·" zo‡ép¹@¹–Œ6z)†,Òæ »‚I÷¹ú¸dãù¬-Jƒ¼oÉvN„â• 8, Û Ì‚‹/i‹R“*¨j4^!Ó•1‰·:q9iSEÒ|Å îZƒâÃ?šL>X€Ùkö/•xÆÞY¥ÔCLÞ €ŒÚâ']_›Û¥Wò¯â²|ׂ<©ÓÂuôæp/%Å«—¿Ÿ¾kñþYÙq˜4Eˆ(d)S¶)ÀFR­Æ¾Ù ¹jkílõœbíåmKIÛý±´<JRxJóÉÄC³élÈòƒQ[‚†ÀÙx—m$Íé΃ܚ¤_mwƒò\ªÙýÈSf‘ ÃﳞJGöÄÝõWtfL?¶ï–»§[:"ßðüÒ­/ ‚ Tc¬‰ÜÀkußïbM´U.BòQmzO¼AÈH4k715ç"ÕÖ%!&öúx~x·ãåi\?òx ‰7wEnž8»`?Ïçf~’£™e…í÷·õwo ncwvû÷ûôºªÛ.}‰PZh6÷~Ýßëü aûä¶]úþÅ_ó¡ÕlÏX$*Ö»$& ÎcÒAÛ•kôÍûé'[¦¼û®þ¤Ë÷t«ä[b|OãŒ×ž@ú\=”Þ]hE½€#ÅõÉÔ¹­iªæ®DÍlKÛƒ¹X;öL—ŠŸ.Œ à“¡žDŒ¦üô½`è…OŸõùù¬·OÞˆäPóž[“ÀÅìùÓý ±_™=¡øÓ?ÞÝG OýýÇaŠb×ÑZ¹¶…’±ní?¾?FçÆWFk¼öЖÁgÿêý¶ÉŸûâzÇ—K×7,޵¼\?¿¡w}hë[q •Hçoã*mrrhûÉòÓ€‰•¸ì¡"ã^â×h¬Zd.Ü©§…YÎo?¯³×(Žr,mb&BFõfûMØ® MŸ%1 ½ž¥ñcÙ×.¿ðvÌ÷Ó˜À)ÌëGíªÑœ¡›–ÆùtÁab9®tfÿò-þߣ¡HKóÏ:û¦}IFF#Ç”•ñ¯LY& :Òku 2LÿÀôÉYµ2‚}0ðÚªOךaÛ†pH°…ÒD–𛝓(cÝWà‰̰܋©$|©¹e4J¨:Nã”åS½ìøXÕÆ\­ËÏ?{`·¨ÀÀ©šAGZ”š`<aw¤W™MqʳPëöf9g`xKÊ|«_;s¼ŠZ‹(!‹Z[³Ýˆ†Æz߯ šý¦Ð#ØDƒ¤5 v.Ö g~RózïoãúÒK{9›·ÙäP CJI…`=êW/ýYå 6@°i …h$4·¤%-ÈY_ŽÆõøp¾ZMˆÓ£?h.-ø–òŽ Å%o±Qvf7ÌeѤcî\ƒh¡òÄ&,µ¨WØæ÷ôX­ÑQÚÔjÈUáI°a¬Û×K1u-D³m@Á^Óú’ÑZB3†2v®\ w}iCjc€0z;èïÖ[´Fëú´`Ø{àÀ7©ˆ£…RYžÙ”*XåãÏ §…ûFWQ‚(‚4!ÉÀM­wr`±ªzJöYš&ÖûI @BÈe‹E±ßœš™¯V­F‡h7Â2(ÈÙÌ’?·T·Ksœ±xq?˜*>Ì$.:ŠÛáÏb¿ü…øimÿ&mÓÕ- Üé›5…ٟɯxNëÛ å½è8sÇ9,Ñ0µ•Jši,A:ñ[ôhîK0( ±Cž)—Ÿv¶L³6úóó=ìs&þRÝ~mfÏÄÒÇD®<¶“• q¡D7•’:M >j¢Hr@¢ãDudÇ9h¹rr÷ÚÍðzj¦ecgäøºÅ'Ë<þßœ±fW[‹GŽ›„5ÿúÄšqPÉÍPS×Ræ¯7k×_||ZJ¨ìÝImîÝd©ÞQº‚w˜:D`¡ TŠU o$ „ç:Lèz(Ÿ®"ÍR)€Ð R##‰Ãa‰B’`"‚L@OÄB$´D, @*©¡p28ºœ‡-ìœ+µ¿ÌûwÝûÕ¬‚¯µüøÞÑÊbUxTš3u%Ú«—âEýsféýv«|äBFG`í¿1!Ѐ§Ï {„'È#bÉ /z:kR¡³§…§—Ͻ Jdüã¢<›ùŽß÷O8`žƒ›“æ@ ‡™ë wFÙiÜ[ Kò¡¨Í¢]éÁA§&cU¹Þ§fÊnÖœjß Öf T ßþKýæúÿ;Ö³¬;¥ai\-y ¯#bU††ÆÀ,4¬(ô¸ä°çmlæWƒý#( bµÿyXkÐT»’ŸGˆc…s÷˜eµ=zèï7o½–|…Ìõu—±£Gˆ¢&u#…ņd@ª±‘FØ ÆÔ²í[^Ɉ=¶'㻢x DõDÝ7©ïn+¥·Ú_òyçß\ô÷Îþ•Ï`þÞ,È¡9•D£Ø03û$ÜSÊαbì‘ËÖçŠÃú¯#=ÓÒg/ðÝy¢kþvõýãî†Å é3‡ýgÆæzîGÓÔŒ˜÷¼ßÕi;·òœùþ·j‰¯å?EébøÎœ âª~X9°E©*d$Õ/=1?¢@×~ö#¼Å³ó;gËúgþ£l;/)«¦ ¤†ÊE“ks¼ûåO~,¼I$‚Éß!ú;‚­têü‹_¹øõóP°Ps-äkÍÓi]MÊf=ÓÜéZ–  íÖ][žßçO/ðÙïÍ+ýò"{ôwÿm/ÑáÈ8.íÏ[@wä…Ø ÷sýõç§û??»WÜfÑ¥5v-ù,Núh¬,Z;æ¥7þEný‹;™Ñ%CÄa1Á†$,ˆ}*Åò@_Œ¢Ùù¥úã¹g¯¾åD„d¡ç„Á#·áŠ‚Z×’ÇRÙ#µ˜0¬µ­ƒ¬&+è'O¡Új!ŒÀ`r¹ÅgÌ;œ››ì‹)»ù‰£¼û_ßSR'¤÷8¡Ã¼A‘ÂÄ®hרñÕ”%G*ÕòÚ“žÇû ùÙ+ƒBtü[Ç&˜ÄX;ïÇÔ‡4_ º¦ñx$WåzûÈôf“Ég*·øLÕD…ÝhÅÌÑÔöU;«ö§üRv;©n@šnQÒmâ6*Øb“j—âŸM\"ê³Ýãéîî‡`ùsí9ÒVœGý{!*û‚kJW­ÕîæÃœ†ÒÝÕ.¡¢@§¥ÀBË¥Þw.ÇåÕ™ŒÞ¾3hÄËR½Ïe‘S²ô—æ§_Á·‘P `Чxû·qý”Õ×~òü·üLåwè†Anî/›`è°V_FQÿå3?G¢rcs«¾ËLo¬-Ï_Ž—Ü^†šâíÇY£ÍI (Kfè« >€–`P(4²!Á…lÈ¥Ì,õèôßç—üï‚›¨C>úÝÀêñö·ì¡6"øþ‹ð²½~KM£‰pm¸ýñ›ÅÆã9Ǫ¶ðÜDuDØB(æ wm`Éû'5ʬcÖ£g/œéé§ C®rÙ­_¬÷Wuabý’Ùß‹÷o”rûwF­$½P)Ë×ëL=ò]Ñêa¹ã:ž0äëÖûá¦s¯æ¡ðŠRãLÆÇ*Õ÷‹¿žÓÓÇ…%ðÐ-ë:ë§-?lºŽ Š`~VHÈ‹}òy e0Ñrì.Ïh‘¸ÅF5ò`Îð´rÜ»õÐ×uyìõsác«ýq«ù7C—%y."æ«sÜÙ¬p…ܽŸëò7«}ÚJ›ˆ†„“¸àÔZP/_÷2ŸõD ã1Ë/ñµÖbû{óÛt?xü캀sÀSÒ¶rÕ½3,‘Eµ äœéäËùñ/v*Æõæö­‹+çèó\˜N‹zÙ.Ø[+\í¦Š$á…ˆàª#¢w¡yÚIµ ׅ׺¾·ü¸é¿µí7ÓPñÇ£Þû“Ðõèf9’¹{gX{˜pXŒix¥U`…àeVŸ"ÜÞãH™¦º Qh¶å­!úoÒˆÎ×fWÊ!³ÂŒï±íO³šN 8U±ÛøÍpWÖn¯wj FŽÉ á”Bvæ«n=²ñøžê2kîjõXÄ2q[ ž²_rÄöÚv¿ÛûXœ‘ˆQZ¸f{Þûr»¯•o5†.ëïÊ?¾ÀɆØ]ÀÆ·_ëÆÑÿþñصùšú¹QE’&@¡À’X/EMÂPäû&²!è¨a8Û ™,_¾¡>FÑÒàn¯Ž‚(_ä30´ÍÆí›iš$Ù!TÌQ5@°À>;àŠ»eLiØâÓŽUÂ4ÕºÜPO׬÷û@¤>žW½°·zûPx)5þ±¥ÎÂl_†áÖ.žZÛ'£òêúh þôŒ¿ØÕÎ÷¹j…ØU6¡†lG†0\CìDQ¾zK'd§h6è™ÝÙÿÙ/¡5oäØÎm_Õ“êbåo<çì\XžVdþíë\ÝJ0·ì3èW¤â|ÿ9N¬ÛÞHl¥°Õäëvë£óm  ¿öÂÎûäùòŸ~×gRs”/Å)õ­Â„¨ØKݪ‚ÂQÚ‰«ÆäM×¶zžö½¸ÙHªY¼Û9êÎÙWüÖXk™-KåÕ@¥Ì½Hü°$„¤ìÉ«¿D¾yýV§Ì ÙûHu2f';´Q/î–2îíºê|ôq€¶gŸ]µŒ}o_fÀÈœüÕŸ<ü²õsú8ø¾RTÏøã•ˆ™ùÄß6ƒOµ™×H©`šíw†gžº¦–¾™êRú…ªûZþü\ÕzºtKçeæÚA©§ÝcFÜMjØ~–ÿج ÕDÒ­ ´ƒ`ŵê†1Ó¦<°$£Ò³uÜÉ íêòÙ‡Š=qJŠJ‘Ñ€¬™@FJ(„—YÌÆ2‡Š3<!‘®¬#°#vlŸ8ë ڶʆOä›ü9Ïs^kž™oY£¨Qa½éYó“í>çLuˆ£ä¹^×a‡Ÿoíi rÀˆ¢©yÒFUqÀ͘6rR+ôËåÅ-/\bµßóµ>4ŒTÌ PadW)KXôB.\çØ·qÍ•gð_DdZà8ÈDÑ£ÿñÇ pÄ´Ð2óút~ÿž×zi¿Ä®ö±WÙÿ¯0Åþ2Õ¿¼*QÅE®*[.ÿoçûÌ/Ý—ue7YT³&[²xE/y# €”RYÃ.Z‚ù@ øS:¢:¥‚…dc‰5é“NVšQýnÓ-LÅûgáÔÅ;ÿû ½ðÌÀ‚`BÑÔ€›THEQ:xÁ¡KM˜»O7fšU&d³†v=üÎô8Å=ÒK’Còjܱø %íå㺖Oöa7 :²Izü\¹ÉWí«CQ&Š  XÛ ‹?ϱ»Ã™UÌ*«0 *IBFJáÎæVU[î ã-AÂÅÞê?ésÊUíÏv»¼ãÆCeœ´X¢ZpóÖo|J]ÉýØr¦tF‹"²0É©ÑN•hLÜ3‚ŠN¥@ð¿–ĪK)¢P¤Œ*hPPsvåï´aȈP¯J-€ Ê0Ž(I£vŠ´À×p¢ZafºY>ÁæÌ#.QUÅÒµõ^8‘攎^±÷¸9{ÇUáyÅÿe-ŽÛ Dái­VÜ€&¥zSEV´2¦24©¬ ê+]7‹ˆRåÞ³ýòá´ì~üª'faoL•ÿÿkϼÃs‰FË1íÈD/ð¢NUè'1ÆLñB/úñúÐNr«êJŒ«÷!C^$j¥ï¥Øg³*ðEܤ÷¹—WD;ÌØ¥Æßæk~â°­½¬ä>ßû2ôÌÖýhýøÃïïl™„POd`m¢‹y«Ü¹dd!b4ØÁ•ñCõ¶.<ñÛ†ŽxpÒ{ì ·%%›6.桯‘™ú:P“RÍ*‰èïÔƒ ÿVU¼œÃ¬²¿äu· †Eh¶_ÏüxΖ6GÝÇ ùãï×?~êÏû´"ÖÀI”éiêü÷*ÙÏ9íšñO`DD2%Ђ&¤WA¯»,±Þ8«h…ͧ:†í]ÇžØsZg!¬½ˆKíìåOˆ~yF]Þ‰71–ò_ÿÿÆéýyS!µkÀ¨‡º`¤ ZöTÏi]ñ­½Åm>Uäæ~$ó0s¹q7•Œ=QCý¥âRÖÍ'HTh‡Xi)M'A×¥öVTš:¸!"ER»W`”œŠJÆ1øŽ¨ºŽHÁæ÷âíâ— ¶Yk…‰ÊAR!ä‰JŒ00C2Šì€ˆK)»0ýŠŽÆÇ)zK|råÓ¾eã—N#bQ‘=¬¤ä›Ì%¬@"àÂ.pŽãKvÓ| w³5ç ÞÒñÁh²U99w]œi1[šÂ®sWOø¯Ó/j|þŽ|ÿÈÿ>ÓÁq³w*xdr*¸'«œµG¡ÈÐŒN…÷~íe+u‘£å5;{8šVú¶³W9ÉK—>høÍ§–Ìó(üÓÿñƒýÅÜNøáód_¤mæ‡g²£ëb"Ä¡op± W‚Q%%ΠʼˆÌ)yå6£}ZÇ‹q­ë©sníD‰{¯²srú õ.@ÊEÈß1ô×Ît^Yæ×/é4zÿ¿yrž©ÿüãÞùãŠnlB´ý(Jø%ÙÃåæ:Ÿ³#L¯ëù8»?³º{‚l ›¹äf¹(Õþ?¬s惢æÛ);*µ–c÷8yx²+ð¹ ¹a}à­øëT²†ü‘¹‚Kð„’OEG´É3t9@ÂÓ…¡žüM€ÿÓÜí¯á´á´[¿ÿ>±¿æ)ðƒìZ—˜¤MëQu'ûcR›UWÛ“ç"¶£½õ¡{ÕËýí„éÄ[CPæÔe õ’¬gõ«DíàqÔ Õs^Û®$X‚|ó }™4Hpén Z€“ èáh /&qz7²!òïÂû7ËøGBþÊ*·»‹ü}ÖnÖtüÆ>¶ÓÜR7œö?æá,b{™<ݵªzë&¹YHØé'ÖÛîä=̳©×Õ6ÊV•kòѹ îsò[”ã)ùæ€%NÁç–ôk:qŸWûò±}<â½¹e|¼› {§o¸êص&…D¶¬¾ s}bÒ ²\ûÐÁüö«ýˆúËxÿs•ÿ¿³Ž]ó$Bê2n£>.=x‹C‘5CsÓ²ŽG9Y\xí¶ ÑpÜ4=ÕörXß³ðû[-¼G#ïnƒsöX“B¯/ ÛÚÙk§®I¾,9Û/4ª‡< ˜'cÆ©Ži=Y¼u`Zü…7îkØ[Ïê²bwë‘EuN‰o¸½ß¸ÆEs»Iãyz‚KÅ´ã/>|y÷Á°Õ们³Õ‡á1„+øÅ(íhãß<þçÿηw õñѸí*žº¤«5ü6zÅ~Ħ¼ºÛGÕüÄ(võÛ`C£¢ýŒÑì¥âSÙ©3ÿÙÛ÷zâaöfLä~J#`(‚zÁ¦"¦5)HE¹( ` ßJo£(‰’ û…x'ŠïžtÕ!õ´}‚( þ´h˜Á~œ“¸ÕÙ[KëôY%h­@-¯[¡Dn$,ä‘ñœÎ:†—·£/°hJ‘œD’Õ“vb/L'z{GµÑÿ™OÖª~¥Á)ƨ)Âé‚Lp槇Ҹâx4ïí·æúÔï ¶¨úJúŸFÉ×{9¸§%ÚÞ§9"ºÒëâ¯o8:º4Òðò¯«êJKͲöÁIš6–ûêÝ1ž9Íïà1i©—_=uJ3ØÝö¿qxɅ:ÄÕ²9À©ÒǸQTŸpû‚×°Ð!jŒW¦#º¶õ^ÈL\¡›ã5D'lnd3èQL0^öZHÍÁx‘®¾h¾~mØ»r³ƒar(å ßö/Ÿ¦ÀÁ¯_Ã?z¦~ Õ"k ÂáÀÈÇ1ú¾ÙˆŽsNõañ¹ÀQ@1cnõ10!45eé]^‘öWu;†œ©-Šý<Æ€ë±b"üKøàðÜ$'¾»MGÜ^»ïã#:3ŽQ>”Š»Ç‹ºmÒÉ R5]ŒbM%d\£1ÂéP´År‘*l‰} ùh½Éiw r˜FÀ,!ÔÓý¡«ÍÑ÷ßx~ãüSÞøYÍç¦1òjž½uóƒ›þå‘ß_óú`/WÎm–XŸ]'Fˆ´´·ÞžíÊÿyŽá¹ÀôåT¢¡FŽ@ÚˆÖµÐnîWÛ–.ˆWsUð–ùU×oboû>¶”U¡ÊÙ;ìPkKI ¤²¡Ü±Ô¹¨Ó¯ÙóúAþî£ù8Â727˜5N«Ö2eå–‚² µ]j$Øãj¯%- uPÊrZº~G¦5÷…¼ÏOL8n: ñ‰ë>™a(êò[ (cÂn…RñöUÔðê"yίïÚÔQ£„[4MÐ…¨lXFtâíD’ D®k©ÃÆ8X«:Áhé:²Ä;˜‰gΞ¹ÑÜ/›YÓ@Ä€üPŠç®¡Õ&´H˜í†M¥H1ƒô„æãJ²Ûõ9† À²U×£ûãzš9ãYÕ…K2¡ aÌ×\®1inÞ¶Ná)=ËX{«¦?ý˜WY¥§\×%'®[vg e¨Š4a"’ÈÈŒ*ŸnV¯ÚdÖûˆ¤$R‘²§H¢Ì՚Л(,t Õ©6èí±¿ð³| îà×&‹h@ $¢ç¥M‘„t`ü@ùžúëŽ>0|ʼïGíXázÉ^Tô…Æ4ii‘È{<¿ñùXüø}‘Í…ˆZè9ã&² «™ˆI†ÆO¯Ä½’•¤DlIð¸Äö†•C¶–]ÔV=Ä“ÔÆ¬G¥NÈB¨‚ªC%Ú‘†$!S‘ª…gU.qT@¥J¹ÔAš_èmRoJêæ§ŸÏÒ̇¯#ì¼&¨>æR Eq{…¦3¾.Ϙ>’cN‹ÙîwJ¸f=1R‘‹I  -E%h¢€1"3åÉËšLûFzž¼\ïªà8ÅÊyí©Út€‚RŒË‹— °d¢H¹ E]*Æ0`eˆ¯o™ï$Çp^—Yªm{}¸©J@{tÝ©Nì ¤Raµ[µ($æâLgrã.Û *ÅL]æDS½-٤Ŧ¤„X´É”¯“\qî>]¦­ UnKjl¤EéØ&Å XÂ-„ŽYó(îˆ5±–?6‹ƒyˆŠ‘|ZtÉ4²à2ÕÇ߸û]¯{^¿0¿µŸûOVxÖ|u °AT…*«ÆGTømŸ±< ØÚi Ø”@­I…Ђ£TòPÈ Z˜N `*Ê1%Ÿ Ьð0ŠÒšÆa€)"hƒ4½Xɶ6M2£µL²ª»YR“˜4ã¢Âj± (ÀÔ L ÛõŽ[‘Sp49~qER{tî2ƒS9g×£ðó,Ì;VWl~½Â=3/gÖ€7¸®{ì½4XÄHJËTÂcš-952€¦ xƒ6&É&@ 1„C j’j³ Qa…*ú«Â„xQ’Yì_÷uмÂ?]ïßiþõÏWüšl»ãýû7yNîJ|ó>‹|NßgjcvþÛô¶»0Š$ ls=Õ$ωljE%Š{g4ðæ%„²$ˆb–+޵(•DcŃ£¤(%½b?8F ‡¥/ʵX¬b4âœ~Ç\ºŒ|&çÈ<8#1¹D§jÑæ‚òND´Ï?îW`>x \÷CšàÿEC)¸Íš¯ͺ«iœÇÄÉó–Z´TÓÑ1±"û@žŠ(%Ý—žOŒtŒïØ –§ÏU³¢+O¥ïÒø,ÏþÔÙy!•\öê&(†\›îŽª1*ñôÇ&*Õb’JÄŸéýD®ˆJûØV³Ûî.³WËA0¬qr6T‰A„ާt7Æ æK?cÞ­MVm‹|ý`=Ùu€è”&Ò8|a‰ ²µ„DÔ I>ÛTÔyã-Q»:ÔöÐENÖ»Bíi´Ûµ9N³[{ÐǯCƒX ký¯&À|§Ú3C!ò洴™u,A‘-Y³J³ïýô-Ž«çY§lxT—½4­,;ü9\?wæËÞWN–o¬ÇCÝ×éå÷ìyé±>¹²lnê='µ_þÑzZÂEüàO40êRI{¡ªOKaÕ-~úÆ•!Ù$]S R“ëŠÛA+TPymøxöúÚZ÷çGÝY0;¯{nž¬Tt†ÖÙ,ú?¨ 5rzh>ÿ”¢É‡%8€x‘E„¾ASçÌæ–úSˆGÓ\»’$[ÇØ3 ·l‘ °œ­úÔ\Ý ¸Gä|iNP·óã[ɼo)ëù.¶kÇã$d%#f w×Hpâ–z§úÙkpࢂßäë„ ( Él9©U‹â8„¬æ |œƤY„rA$#k‡óApÀòt²–À9 îR);1k¨<ºkʱos]¯—ç+ӓמõ`qÈl§ÃUáb0ÎŽ  = ¤‘H©ƒâ‚"S¡B§Þêð&ÓûÔ¸s¼µ:š=Ö7:¿ütÇÇ`D¤Hnœûó;ü˜Á‰&òhønÆâ“œß¤GúHEÖ OÉ×ÍAa¶x°š9i;¤‘>œz±þÒø—'û*p ·ï¥ß7òeÔÛP&J(ã›iÁ9Ü\zŒPû¾~ó±jM_ÅUdí©*›ÃÓ™Jp¶‡‚)¯ë.GØ¿ÆáÿÙ§ßéöÿú¡þ»<¸/{¶Á C¤§¬b¢ÇÓ XW„Ri¾46 ÉlRˆ“`1tš53¥ÕŠ7?/W®Ç÷æûN»;I¤&>³Å5S|rœÛÑ_‡ül/Ü:oƒv?'ú_Od?é´ÿïB†}EO¡(ò‚ÄQÏÎËÚÕ«œz1ˆØh;:Yk› ø^4#žï9µ¯eÖ«Ù2_Âäë_óû gû¼}ób±£¦:cÔæãÑ#¿Ðp‰l ã²cA%ÈŒÇ%Jâ.Õ)CÃ#Aï]Š¥ë’¬«ÛÅ‘cÿ¯¶ñu~Ãw~IµÿvÿÕà>*í%UKâ¼á¤di?§ètWzaZ¿Ï¶»Tîá:íàì˜Q¨4Èd€TÔy˜@OtX Ë«H.¼¹8Ä^Ô¶©ë—~)ÆW%ëSý•£K𣬉´O/FíU{ ÐDƒÑQ.Ú¬jHôרQžfÄf8ÿO9ÈGNsjçƒçKž^lµËÙW™Òan†qÝî÷L>Ozíº%1^#‹2ÒÈQ ð ×ÕúÍGœŸÒ̽1øáU<^»±òׇÄr € ¤Á?â·rÛ·ûí›zÝ׆­‘'ž^ %lÜ×´íX–¡ºïÛ¯Vãùhé;?ÿ¨Éßú?’ÅïôÛºÑÏšÓ¬O™_”$L‹i0 F!Ú ITº§E=|j @&ÂB°® ¸¤åvvжÙ=Öâ› ŸöO›Ù’Ľ4k—Cl½|n4ÒÎÑ1ˆÅKo|löãåY—üÒÛ{lÃr—¸ÅÚÝ\‰X+NdE!ÄpWƒX†W„bˆÕr¤ÇE m§€¦óK”-ÈèA8,ZäŽç¹ýãÖçÌq/V·>}ƒÈÅéûr)|ˆý;Á+ØÜô(Îþäûóêeð7…0X·ˆ®!fÜe°Ó0ƒ¹uÜÔ·Þž=òmkßÄìðÊèçzrç,¡ÀÁt%<$]ÓBgƒF f!7ïÓõVeÿÖjFÍC¶=–ÐH%à®Gy•M‡gžh^±VŸÞ§ò[7¢AÓ„‡°‘BDÓ‰˜ìD]‰Ñæ@, M@&îx‡þ"ƒpð‹"ÆfíŒ,ê§ã Aé+w»®½yž¦Ê{柩Z ²gþa¶™{4<õÕ#pžÖ°ˆsöJßJjÙ­kçk‘‰(œÀ  Àða×ûìKž™®xµó#ëˆ"¤˜ Îóy4ÌÑïKs°#öа‚¥eØÕÆŒƒn#5hRÖE÷%(oR’DDø2"ß…¿õ«ÿõÏÍü¤úÛ–·,†}r×€@4‡Ê„o Š 0øaf]2KÙ»M:÷à{>Çe”Ù‹>÷™Í_Dé¿Ñ. !=+Z.“ðSd“ͬh‰4Yºg¤fÙö]n;=ù˜ú×`=?ÿ­|wÞûúœ”…õ150J뮊,Õ€9B—ƒÂåðw±¢¤„¢gí5#ooŒ>íY3ð¬8$Í[Wä•ñb_|¾)GöHâ;Ç>bØï¹µ·;UbZã6Žž ~:jù8¦»“0AÓQãÞåΓU¬…þùb [;4©t ¥Ø<[Bzvh79F<—b”ÚNý>^ÚFk¯^4fœ¯êmtRtGáÄ?ïnÕ¯P¢K´÷ïþåö=`?ýzgOð¦²[cCøÙh5øk‡D±xfÑ©ŸpŽoGU0Ç´|3½Gé…F½¡GSÆûB¡ëýÌ5Ÿ[¼p‚{+Í—Ý-lˆ [JôbüÀfŶW/ÛHõÄdÀE#"c¶£«óÅðÏ:ýû—Pƒqކ¢r5ºO›"¶’iW‚þž‹™̱y¦Û?‚íF@À¸ƒü)é¿õRþU;Ÿícst©ÇAˆ*BãìÿÒÿÚ©¯s_1’<¥ë1«ˆšNàóù1³¾ÑÇ‹½êtôK$çx#W°>Îä$@b³:”-ݽÊ¡*·O~Ì>£ŸóŒŠ€ƒ:Зæi­¡k'ØoŠ`¬A#Ú}­JFIS‹ÙF QHüÍ>ÏÝЊ޷¾ørF¯M‰¹«íx¦+›T¹z 3®p…èžÕßʣ䞔L’ÕHôÃ¥BOîQ­ÚrÌŽëõ^+6åz˜­æ~ÈË£Du( ¥¡'š-[jºB@¶¯ð8»Å2ÐO±»Ô|²¾ŠAÄnÔ÷·õ+Uï¸K8¬s£–O˜Üü“#D}rWjÏzÊ×_Öƒ»oÖI+€óô:2ÒvuZs^%§Dá 4îaf9„.;„hªøPDN ‘E¨å˜±jY…Xf`ERy¶âš9}h`g½TYüD}£ørÍnÉ4K¸i9½¸[ìÀ‰ó smûtïèg1Ï*~Ì[g]± Ñ‘ª L1 D2ñk¬ï‹\UŸaÉ¡pµÔÆÄ܉•Ī(îÕ‹ñ Œ‘ï#•ßáSˆ¡¨‡Ïih†•èy$€å6ó‹´h¸Æ»/Ý;iÿëh¯‹%Ç ÍÔ wC °Ñ$ŸªÆ-ñéæå+¥uã9Š`Ә«8‹ë ºSþˆKd rýâzû8Ÿ”±¢bÕЇ E;Z„’ÁXwîþÓÁ¬Œé…êjìµÄŽîævRŠ ´r%ªJîBíñ´Rý^“‹ •¸™WwéD 8ïÖ¨¡u¤ECC„y üþctÜý±¬<¢UßÔœíZŠÀWÍÁ²†ü›“/”¯!8õåYãSƒYiêsÐ*qqÉ´mX‘ŨjL¯d-©v–ÇžVy{6p!‘‘Sfy­…K!†a¡@!fÙE»éª$‘ÚCYêÙˆTB(mâꉢÕÈ,Œ é‰8ôX–©*K‘µ°lHh•Ò4SÀà¡V —=\ó××"$…µ¦(ùž–j% Ç€8Fp@7”KƒdIQ"@PH’Äáã»Ý# ¿›³qäéí1g+Ñ8<¶'Ì+“cŽëmS2,ÃŽ!WUGµ»»B4¾´˜‹6G”ão Q–ÈP‰(LŒƒ°‹ßåã<±ëImZN•éhb?ΛIÕ÷&‘Z×t«½@/6#ƘJ¦PÖ^­#öZ1fMJz«±õ@á‹ÕÅüq¯ó„üÑëÛê¹{÷þ¢{fkGͺ‘WâU 3 IÎô¸J¾aÝ@r‘ɘO$-õ ê–‘FD Ð2ÚXæ&R-sµ)ÙØµ´WæÈ'ø‡P“àŠš2®£k,Á¨µ”W“¡ LÍÝù€š¡¤âD0Ð:vh¬¢(D n¥ÆdwFc"gl=“ŒÊÏ[·§5¿éɇ{¾ïç~Þ-¹N‹sV‹œ“¤÷Øv—;å–Ý#¾uyádp 2¨Cd·Xç¨sÓÓr‚Š*Aš*¤±¢‚T¦`À¢•qÐñ#kT·¬×àA…ýó·è/h„ŒV‡®¾]wÖ÷uÑ#‰DÏÓ¿ç½—WVêSÈ*ÐØaÝ[ñx†ÎmH*EýTPÝcžUš\A°”(…JªTy8†ú$‡vQÇÕÚ®¥ÖØR0‘D*I2¡$UŒÜ@9’WÕà­šb£Ÿ•›‰,ÉPðäB[tæZã-!=uy €¥¾,/ ó#ßeëói¿Œ¿:4½¨Ÿ‹h’¢I0‰ø¾Àª$Ÿ¥-uÝ&™°,)¯;›%ÓrÂs‘?ˆ'ŶJ‰ ŸFKÍŠˆbTœÎOP‘ñ„ߎŽZSùÿ)Í'0i«,ƒUÿ®/¾þ;óŸõ/‚«ÖÒkámcˆ?j”°Siy@w|†wלí«]^ÿù—þüÓï¿#³Wë¶ò÷|:6µt„<Æ tC¾IKXb좔»èGË×Kv8Löøfõû2l•ðh'1f¿aËò´E’z|ÆEŸžûÎôøouõ¿;^ þõä¿x“÷KÊkhfS::”‰ù^ÅÞjú‘äEƒ‘M×3<3[Ï0‹ÊÈϾ¤ÿ¿X÷³ükÃ<ó“Ïó=Øn³¡qŽwóV¼Mº·Î¯_»ó¹²µûCß.¥vžåíï³eI€$ñ&yàà*Ãà©/¹¢âO­Êâ§ü‚# Š*u-J’ÐZ°I9ÛE]z0=Ù9çl_{ãrækë~DOñ¦ùØw™½¦Ð‚Â\/U­ùKð>òÿ¢ß÷Áem%Ïü?¥Ø€"'(ÀÉŒD:ÝÈkiåX>ÑàÆñF~IîaàR U2žÚG{d˜åm¥½ï>Ç(\šm@‡¦X¸û,:çTý\=n%­UGš¼¸íøÊÛÆ½¾sqpiÞª^UôÕB·äÖ|dó&/L¶ºRá°¦‰Ð퀠Ñd@yáƒÁônÈd40ZÌjŸÂïM¸íSáq×ÖÇSq–`ñ\A=:CïÝÙí„]òÔÞ‰®æOÊ☲x ŒÀ²"Ͱ«ã® ‰[Í<{¶ÊWÀ… ìúu=wÞ²ò|ÔóEø¼ŠŸÝžl1]-eÕÝfq©tRÃÖ}½zZšÑ9´…’â|ØÜà6– |èãZ• ³+ܲ_ f|eîáŸþNùRÏÆ!è],˜+ª¹ÝsX$Õ ]P†’  aó°‹.4ÎîlªR¥i·Ï¶2ª³—3ÞÒWþW¡*óq^qÊÿ‡Çá¿ü8o™\lÿ*Ml³·•!c•}G*ÍÒðm «û¸h“#-×i--¡T÷Õ|ÌÔÜ>ÏJßêY’9áí:d®®¼»Å̼Nõ¸¤ihÓ»EZsþ<ë“Òêtý­\eò÷þúW÷Ïî>ÿÑ_Væ(õa’ Ž¥M˜æ¿Îá)ÚìrßöÛ/j>s‚/Á¨‹î”†ʬMmpY_ù¬×|~?ÞÍz½Ý=[kî“òÇz‡›©_±a@%uTÈ^;£š-å"S_ZGž±/yÓÂ){‘]ßt4™œqPÂKÛÛ ÿ–µñËã¿Ð…_zm—BÄ×.’ñ „ˆ- jÑeˆ÷vˆæ$L¿[áâã”Ü s0^X)X§W )÷1å,ðÈûݳT9b|¬ÄÍ·ÝÚÕÒ•ôùÉd0GºV¸cÅÏŒ‚:&vW\Ã,3§^×B†‡±Bî ™X„-HtfÁÈFC2Ïn‡QÛÂQpjäåŽ&6àÍéÛ2öÑ v2[àÍÛ ô)ƒNnqæ¦~×;_·Hõb?õB¹/HdäJ ½߯i†ß#è%>¦°žüøù¯Ÿ{àiÙo0\‚lH(ØAÄ SÐ>Œ«(k÷=„bÑÉ5 ÚýÞ·ÝÛçò{)¼}ˆoó㙞Ïûë„ÖO Ì3§³9¸²˜²,Ò¢r4Ä(A æÒʦ«!‘™½ú)qìú¶µ˜ƒü(À1l‡‡âÛ••Ov±¹ia—}–¡ü÷ TyµHW”ƒˆPt=j¼ ytŠ)Kí:pÖÌ]¹IYA (:|ÒËq‘PJ,S½±CÚÌ­á-u#iúatŠ{ºI·º–±4>n»CÌ;ª(¾J3cyÝäPÆýÕ§ÑÛµØX‰Û|øÏ ân_¥¯`€i•Ö7êÙ57‡Ò»ÑæÓç—ܘ8ÊtçÏ™zÎÛëN|gî aá{ÑCÙÊ Êš+Ö`¼lÖÞq©h9‚hB®Vßͧù …7w0;´­O½ôæÃdÙë³€ ?} ˆec‚ 4˜€Hž¦ŽhY½õž¬Xxʶ”·Û.0ä–b]‹ Uùϵ~û„’F;)pÞáÚIL6³ì |ú%î|y}rZ»ñŠñ9bÇþß!aÀÖ?0åùñ6®§²§ibKó±G<9Ïoj4¹£È6´aQÑ(D€@­HàÝÔ) LE RV’®£V £¡p¯ú‡7´VDz:Ì P±)°#j|ýj™Œ¾h˜èÏ[šñ”FNaÀGðóòÖ£òóF?­ƒ/ÏæçÇ /˜ØÏñ[ÿyÙŸtß´F8d}›]¿§<Í[Z‚<¡GÍ~ ßæˆbÍnŽ(2]¼ÿi@Ngj—‚(€Š(7è¤'Ãú …ðLR¾ê³G$£§·Kê ö5yëqïùÐ\§ç[ïz-kOö•Èž_ÉL 4pD¤¼ÙèT©é-ÆéŽ;üËÈh,zè(t ª†H&ZÎJ–”#Μý³ìc²zÞŠ®åÉ…§|›Þ?Ê|Sþi¬ÈŽg?6Øn•‡ÖÛi?oï,oøòÎÚžž˜ö 4áx.ûqº/©–òêHá¶!7 Ÿþèа®1+T>ío?[d°•éF #»ŸkxîÿÔþi¼é›Æ» Ä/ž¹xŸ{_ÚØªA&ÖX£MĪÿKKþÔáe‘Â-¾Fò’s­ ½½·Çt”gd­|vQ…ý8ØúämDPÉÕÙ‚bTkm‡ÂËÅ­‹i­ŸNø÷Fð_ê늎6Ä ‰ˆ‚°PŒ®§Ã}S®ze6?>«Y95WrVŠG¥ÛºÎ¤Úív!Ù2Bh²5ĆÆÐ)‰!¸'¶¶ö–Ì_#š–äzçŒEãÖ1|±«~ëæ¡Ë6ržŒ" %?¿JÜP,õëîô¾¯†÷¥/ÛŸwú#úœûëzïé¸@ ’ûxêË%[L@x»ƒüõW¸SOÒäÀèa½ùýší0R0¶õ±¯«½vÖ1;°ù¸ÍÆïxÛYOÏXòJšŠ‚Ô©ß{mH¹Xì}_²wûTÓÓ¯8¿±&bGûWݧ6:ò]E1ÍHèð›ŠbetD׺LÕ¶®vÙsac²G.Iþ1„àËëËYúÏào¡{¿[;ÚÏçåÛF¿€b³KqÉÓã<÷2ˆ£`힪¯ñÖíivìBó˜¯gù+/0ñÓR“A}ÂÂçV˜%âa ¼+/-f§u*p…:ªëx³ÎQÝ”¡ñJOàý·¥3h¦&sê²aJkN•ÛEéDG*–¤!MéÈ `ì=ÑÞ™hk1F)@‚„$!XäJU™¹ÊN‹¦¼0zSˆÄY ñ¥èÔÃ&­¼æÀÍj3 žXÔ ®å¹¢ „Z1[1áf3q A‚ˆIJ‘ÖÁôð¤µõ. q?ÓFþäâän×£jÚ˨$-•âZþ×—×£âPÁŠVÊ»NÒÁ-el«+J_­Ì`–cEóÆ÷´–Ì-&ÛÓë›5D+[g!ôFéo„=X2r%3XÆ®+Ó’‘G½¿áà?QxÿÚ9øÕÆtxÿ4#Î/‚òx0½½ÝϯÙüAêu‚cFÛ›Z}ü’´g<„„»“£'9‰Ð/;Š[¨Ey±nw×ëí8#¬7l(‰ty¤¤#ø&Ê a‚%l¿°ob å,ûJwãc‚6´7Ɇ.›(•pÞÞº£Zö ?ݨKz©35±ÏÒ’îR—Ðû7§Õب¢)„Ô¨s¹§šû6,vau%Šâ¢ÝYà©6‚Àìö…gDc·ÑNÍa\†š6¨â0Õ!šǰŸuϯôÎõ§Í»ù|™Ÿüà@Žáóÿ2ùñ FÏê+ä&w¹¹As À “4<ÄrrŽ>–äkê^³bQ7h¢¸†½üéÜUÍ ò­}Éæ7>´—Üçh8›@:ð Rw£ ÍÝ€Œê:(Ÿ‚ ýJŒ€»#ý5³¦ª×60=ÐíìÓ°´@¢,™ì+&°Ê¸…«m @U;ƒFšÞ§¸Î­U˜S Æiã r=»K`"ö ö¸Ùm:µ'¸ÖíPwM¾…ôÆ:Çààí=Т±$HZ´Ù$KÂôØW¯±zT(Ÿsë+ kCó6­Lû×pQõmm`zš·Ëyéô¸ú‹_½ÙôÇÊý‰ûGÛf§<Ói"_ˆ}(>¹Û§€Ä‘-kÕ(t$±—‘¥oÌŽÝN÷ÜþgÆùŸmüv‰^RBA[UÉës(ÎËn×Hœ%q4Ö*5°$N|OãgGÓ½tñÅGy(ÛE¹¿;¿{#ö PÉ  ‚b‹AùÑà•€YÞF™Š=Ë/@„IÁlÈ@Uøj(¬a’l÷šAc«´®4Rú÷§®þ’ëðÔ„ 2ˆÉ\Ãã$àêÑkâQmný¸K-éî~9 ñçn Ù,¯î'%µû¥íõ lâôÀtì’@â°º,Ãvï -F”9k’vÐ3‡ Ãð†À¦KghF®Lž4ËL§ûa°æþ†"iž5¾}Ûi 3Ð’ÆB ƒ†2“d‚œ ª)wa¬HÚ°^æÅ/_ñ¿q®þô|áÎÌ[Vˆ z¹üèV`.e ûw6WŽKN7gL=y¶>}X]œìûÞ}„j£Õ¸ôŸË¿9ý%¡Ôì_eà7¬–™b$]%á SÐ RÉÆ€Ã.ä<ºÏ>³=•½cÛ;ß%ã `k¬œwÌ8y_¹1m˜±ÄqB"ˆ’b1°Žì"mêËÀò®CçîmôqLžvR4 ¶Hè‰VÛ‹›7X“'å!Rµm¢¯ÚÆÌ: ŠÏæž:»L Ǫ)bÞk뇑º(§št™ Íæ›I¶µÇV¡KH³Ï+H4`²ŠéÐ’}7°žÿk» VÞÛ3ÁCô¼»º:-þÏùøÝ\¿3~óÕôØsÒž=U`OêÊÆñí^¶¿ý‚vq‚‘+®ú3!}ìÒRh÷‹ ûq;›b§:çº%#>È7#ÛÆ kåoh F(ÕÖ3›hþ°‡Ñ ´9ÃõI²aÊQŠ#C¸Ï¡tãžFOŽ­·rÃ}þÈ[°Énþ­ ÐX_ú´×s¢¿3ÖbÓÞqÚ4":L\f¢ã6‰©FÊÁ~X[}6cðiUb«ãüáéÃZ{cuר; W}Ž?@•³Ù¯I«ËÑóf‘-Êøt+‡O¯]McQZ\0%)㘀oæçI§&pÑqž ñ¬í¼^õ ú 4qsS³dcísÚwe©Qðm´Ae³Ìj%n_§ÌlNŸî‰J—ªdü&xÓµ)¹¢¹ªán ¸'«o}›ÿÕEê”%pûpæ;iÇ´bK„@O![Äð#ïŸâ‰{Å£ÔvµS€žô†ø ÀJDÅÁ\'‘)¡Íí@ÈF”é¹BõÚ¤KlyÄ^DQⲼͶd<ˆZ¥Z¡Æ´:~@V±&yA8tÙ<,@Ÿ°  HòbÎÜøËÏšZí @7c)ðí)¼œ(ÖN<ï×¾F*WþRûSõJô&jf€‰ -ÌklìK}ó\<¿&nJé2D[SÔ0—P’V¨Æ ‘x7WK²ZG4¢é€;ei±«Ö÷fûG9¨½ aÇ•™—פ¬RÔæ{WÈèÿ¦q1_¥xù`Õ~«5 ò3v2ÂÎ@/Ì ã¤0æÒrh½1j»X OÇo7fxp¶ðá¿¦ÆÆº¡ù•åù‹ÁÆïóU/÷×+&cƨ´RC3þ€DF¸f$Iu߯5F¥ç–6ªU+åÏnŠG×âî)€K®„Tš4°Ã’ñVçãÎpG©„±’)@„ÅK=©vÝúŽ»‘ý‡ó—÷×è<åì­O—äy‡)|áé„"!”)Ƨ¤%J#a,%™rË.çöR\åå°†F= „ãç)lÚ„×çC]Ü(Ú–H$f@¢úñÌ4ÍK÷¤z¼¦ö¿Æ©ˆª3ªòïÊŠ–!Y^@hV¾îÀׯµ+h (ü쫊9ú@‰ËÅ´íÚ*í|5¦m'emIg¤!±'B©eifÚ5©§kJÓ’ÓR¥R"ÈPp¡"vËÙ’[d²™ÔYõ,Cz@° ›,êm5ÙS =™Td,ÌÐ’LÒ±ÁH3».œ=›SI@BERÁ,"Q…’>µÓ¯-ô´ᥲG€-Çé•”i7]Ë¢+„/—VÕµ¸±r²WŠÅFtÃZ„1Ò\ ᄾNuÀ%Š%Yj¤¨[@Œlˆ`@Æx8ïga–I˜ÉŒ ³Ñ,€è TR@´*#…¶5‡€BÃ(‹d$kq8ïäÉ«w”æ|gû:'@N•ÀÂ[Út,—©ÏÖÆ^yïôúöf»óšXªÆéÉGWx. jcíµ0£NrƒsÔ8bE@u›ˆ`@¾ZPPÆÑ`3Ë&}½zšG°A¸d§Á„úzòžß}·Ó+½!Ï0j5†òBžÒ{ÔÀqnñûã–,¸ú·5å%i #'“5…ð3øÒM9¯_ßà¾,'FiGgºEé%Ò  ŠÆ–ÛÒ¨;4̳ÑR]xÌ‘A)HlÀˆ! ¬XE#"X÷á™&L®›iá×€ÄX° ˆ€/ËèAãm –+Ô¢õÁî™Bm†ŒJÎ3ûË’~§×oô6•9ÉÊP8†J¯x¼GÜÊXJ@+9mê’ [œ<ŒŽ{àΊš%áéI… Å@`Š’AðÔÄP•Žœ1ĉ B-M EŠ[ÆÚ¡5V±ZÕ›_™})™‘ÐÍgSšùı(~=!4 ËK@¼ý³˜Û3 D1EžÖˆym±Ž-ª\'cIÕ×.€È -ï²£æh·!ÅH.žD)'.YI°Ì©E[]ˆùdRrW•„hQ¤`­œžGI¥KÓ–Ðñ•0‰–¶O×ûÿ”­½;´cMuîãó+­Ȥ~¦Ó`žbsgsÜ4ôÜð¼Ð ¶qRn,ìì¶ÔE—›š+ѰöôŸ}ìá/¶nmÞ§±¥…8E†9÷Ñ…ü¢½.éi]I‡€SÖö:É ã£8Ù:clDŠDÒRÞ@ùnÍ ¹\i% û§q;ûy¿þ廢Ï;øÞ-ò³+"V®»´Í³ç…q“ ›„@¡`îØ\"¾˜5ܤ®s† ý¾n__ ‹'s¤ï›Ê¼íx»Q û…h³¶«érq-GŸ°¦‰_úXÕá¿ì®§:vŸ¸ý1~µkD5AüÂ?ÑQ·::æ (½èu2__úPåùIû¼ûZ瘳7X·iʬ±é)_óá+9o=S>WöhàÂ% «5‚Q{t†€v9 çMM¹'ï¿OÂlD‚›´\ï_é¥'§S¯NL…c1N‘f€ˆ‹‘¬Z{…}ª—ØîŠ„zŒôj&,Duôv1«Sös„Ì(žaÌBÚ·ò…Vf°Õ~ª¹lº÷㽘s}ÿâžûñˆrÇËfAÜábRõ4ˆƒÀÅj¸$AdŒ"Z!+luŸGÄ=RôÍŽÞ€Ž0XÒ±VÖŽªDµ²º».%¦E)Úû0‚ÙŠW‰H¤S‰VØÒyhO•IÎ{_ž˜@9›‡´äW»öt[ßoÞímýøÛÕç×Ï83΂¾îŠOßEà«Ä9m¬²_bµˆ,ú´±øä,Ajâ(pñøâÍGDÛ‹sÞ;w} úÞ̵ù¾À– ï~Êweî‰G.²Ù¤ÎxýªIåX4Ê«>|¿=Ñ¡dé¹GAšŠÅÁ–šiX}Ìg'iÆoà †««R>ê~þ•c·ùÿ?'˜ï|ö­uQÅÌåŒVýlÞ{´Þѳ5W“ÎЉGjódëD$Ý“ÔÄÖ6`BWy„¹ÕñäÑgO¾¹¡ªÛ¶ÊßÔíóC¯—p‡V*ÃG;:Fž)"€(þíêü§lt©Q5Û&eL?3]Ÿëö,Û˜£Yãçe¹Ñmn5;åçËbûùpúB¸SVUÏÓVð(‚µÊ_öeÒúÚÞͶ±v¡Wfks° 7ÁxÝ;6ˆj¢̓MC‡æxŽbÞñ¶ì7Ô5Eßsh%Ü @qÎ 9@hÇ®ÑjD7îûZ?ò^"nP_œ¥AïÅà)¤¡tS–YPù`H’å¤O‘ÑÂÛ%$ÞÔf«·lM$Úbª$ ³Qûêå¨=]tRšF$o‡cjL‘{¯íDÏÇuú=Œw žIßj~W{MÕ®Ö̯wgn屫Ûë¶ÁùÜk3n„í÷½ë™ÇŽ>4ÀvbX¯|Hï±ÍÚ hú9Úåym'ܽN} pGA ¶yãÐÇ—üZ±³°=ÎÉîÍyü8$¼mD_Î5=Z‹ilË]UæOÁ—ÔV8 “`4ë6Ý‚z3>™l˜ær«´ó­k½W¤õ9ïáþí*9ZQ889ê崮 eˆÝ\k.ŒÜ±#¢·Eq¬f<žmŠ3©ÞvEŒ3À|"Š„¯êß*f‹- ÁJç|d³c¦Îg‘¥xº‚´Æô²0…Vâø7çÇ›?t›ëUÖôÞý=·ùˆyþ“~>ìõª_‡¢g_à½%ußjs}A¾uF¸þL`½ð[½^8ýA?e]é?ý¶ƒoà4üìuÐVÏ*Â’*àhóÖúÌôîB;®Ç˜è©,wïòm Ð×?aŠ2;d¶DcÌÕY èt©ö’]; ©¬’@õâØÖr€„˜}åëBhÈpyËI•žãžó­hõê°ñkÐ3³lŸ0üѦҠ’ =J&!K\Ĩ—Ôë¾F‰;¸\¾D÷b›à“.F[“ͪX«b*‡ÏEíÙ’ö½ëÝ~Ï6fkдPШDEC%¬œ®·?½¾Õap±è;jüfÎfËj‡T«À¬ímg, ƒD@…Zu¤V% ì¯*§BA™x¦*óCÜrŽê]†g–Q³ÀÄ$018Æ¡]Ô6/¿ÚžwáC©ýÍùæ®æìè ]¿úõ\•ó–7o\/FÞBª €ÀB–C6Éœ• o·rè%<‘¾îx÷æ¿•ûÓøp-NÍÑ7õ"!‡Aš +ÆàôªE•uk½ðÍâ|í½b„¸QY¼ MC´™ͳ« ¦×goeyJ]PWæÂ:Z¹'ê R%DQa* ÃI²G²Cƒe€z£ÅHÎü\²pS¢+ϹÚ_Ñ/F¯]xËbÇŽqâKÖÈiU[hPÐZM`(œæô•ž2½ Ÿ;Jo\Ó„›ÉT°ƒ” ™†§¹äîÜ]‡?øøéUŸ‘ìTÄ ørˇIIQ QÕÝÀ†L‘1„x.\vã¶M[¨–l<òТnCNòDŠNR s’û!#ÔìZ]ç8öÙpÈ0ǬTXÝì\½G í@ãØ²°œbŒèÍÂâúå}k–‡Ò¤"'€(Õ nPÐPªìŠT2i´Ž<6^׿Šâ˩ګùàÅÍØ&Bâ¶@iÑü-û_)–J±ª ™ÈSÊäȤï&' \/`®Ê$ÉÝ”cZïÅ©ÌX%"JLl CyTê-h¹“¢â\¤£¬ 8‰ÙÖ+,(–+  VÅè°ö B•è ¹5ˆÙ?;9Þ[Î#Ï1XøI”ÙâÞ¼{\»—6à¾~‹ªYÛœ¢+Ëvõjýz½ûŠQ›xZ@³´û¥¡P 8óuƒ†X§õ¬›ÞA¦¸I¦02%-b &HåàßЖÎ8h$‰1N¤®`ÙÏ›AgÛ‹å'ïã?‘ Ý}^©)?!%Ζi¬§=ª.0XßEiìø#ƒÁ\_ŽNçŒ`û&óœ}ç$hÛf•b¡^‡( B(#ð"Úc-­Í9ÑHñøýf§Ü_×2J­ˆ,h¥D¨r*\EɪÔÎä¹Í3« S7‰2ÉÜÆÅzCÇÜÌ WA•" :~ØÙ×J™ouŸr;ÕGæóeÅWäv'£¬(,\$«1ªNC&ªÆÄ×Åf«ÁH‰JÛ=¯›³‹s‰2Îq„§ü; éi­³¯Ð#SIŠu}]‡DyÔ¢&‚Ìa§&Ö½s$Œ õöΙóó IñóœdéL¥ÊôåPÚÜ›¹ÚDèÔå–Qøûë[ÿoéÿåMÕLµ¬8SÕûØ«4Gí‰GÂ6ò¬D5’%x rW®¦J1”7À$iIf±$…UEY l‚5UªÔr’ùº”„Ù1'@c"[BO]›©d¶üwzÿiìòìþ‘™ÖÍ@Çà³8$ØJi3F¦F9RÛÌ„ƒZMk RÊöæXUxccuìÈ®Ïs¹^ójPæ‘;‡ˆ¡ VŒo¾å¯2ôËâR²§OÉ:zx=€«õ¼IŽ62‚µßö–ÌgÏr¥/±Œî­ýàÃ[ôé‰@éøCÇŸo†Ãӎ˳ÍMl›ãÊj)s0У§™úˆÑô5Z[e2̦›Ïk8Û“úk±›êïÖÛgý<sí\»í^o+´sdíú%ë¶,7Ëoò_õ†RÅø™Þ m:¥F“ÑŸðݬYY\ €¡:ZctäUx†ëñNÞÖ<~þÁç1Ìý¤Š5·Ó^u¸&v\ØÃ0Ç·çüf÷n}?Ö×¼ve EÐ%©s†\"²žNTÅþ)dŠ0(ä~Õlûiëù_ÌÊzºn•Ö"‘ ‰‚@ ®b6­ù«}™ûñ&=Gñ!DбŒmÈ” =U§­×Uïõ¶«¸Û9…";¼¼äpa÷qZ¤év:ôÛßûèöÖ_›áÙ?wY½ŠçÇråÜvŒV4Ìxe²«–6êÚ ±A­ŸŠ Ã>š·á³dðÏ^ò¯éeÔa… ƒG«uŠû'<ÄKÞƒ›Še|¤–¦fŽ``$„âaèd,¤Ùà·ã6ìû=ÀC‹L1'û ¤Ù}>ê/™ëo6Á1Pª_ß•ÏjrwzRÔÆ"'é*•@AßÒšj˜Î•ˆÜ¶×¤©ÃQîh‰ è1_ E‰æ À&7«1gºà %¨PAǬÁ²Àî|(e5Ƶ¿-ÙúùŒÞÈ×–ã·‘»Cz\‰¤s‘N{Ót¨ìÜæÏSúýßßB÷“çK*qû6üÁÅóäûM.Ž{‹rU¨ªŠ%†Q0”ÝïÇòœ.k$¥+îÞÆÊ©m'‹çu†÷Hã™×ìyìÎNïëàÇÿÛçÆßÍæ_Ïñø;RžEEóŒWÿïæWþÿ7ìÛåòŸ_ÚSùÜd9œ²žë¬Ú6¤u÷¹Î€jäÒqî'ÅålÎW7kŒç¯õëÀW¦¿½mI[4#}¡”Èõ–›_‰=&î_„2pòÇ­x .,ü”×^ž˜×XÆí¤a)h%äé°5«˜]Âí‚ლl‡Xã˜áM»#$:UkÊÇÇgðCvå–=ö«Ièü¢MùÛ--§ªÃúo›œÕÕaÛ€æÏõ ³LŒõ¨8|=PÔm¦ß2¬vmÿËîÿÖc.ÿ çKÙŽÔÃYFjÓl;Ðö>C»r3ëýU óõ?ú_­~=³?†¯Uq»÷ÝF°¬dsÜY§!,K`Ç:â²tp*Ñ¿*Ñ{ÌŠ–BýÎ Âe Í7âÀXPB‘ɵy#›_–o5{íRTu\©{ù©‚[¬ß1Ęý(†(ÿBô½EW7Ü@4#BWñÔwß e_³Ý‡ÓÜh|£Ì^·.7êž“‹ï®U^3ÇÆËO÷ùŽ:y\Gž«î‹•¢£3„j{“WÓ&ÛX“ ™Ôqàx@„©Xm¶GkbsJîzñÛ4vbåÂFíí(S„ dà à±=ŽO¿ÀS×f’´³:¶¿½oO®³òv"??j|£þ^ù÷·“>§|®ûÞö® ¿¼L·l$«:­+Vex4–<‹Hº—aÑùÍq*O«Ö}tÆYØŸ›øpDxDŇmF;dÞOìñ¥ƒŸÈ÷…Ô®7\d@nê‰Ýâ/ë‡ß×—×_ÿ/¿ýÿ½{^?ÎB$Çzœ\La iC¦q- üøøKìËÞÄ^Ò‹JWêI48WÖñ\ï»g-ô,í«ÔŸêÔz£ì2o‰ių±t±Ñ™4±Akg‘=2‹¼Û2”}‘ rM)¬äCõÈdŽ8YV}Z %¢÷zß×+ƒ_Ñ«§¡­ÑñÕ& ØõjâéôŠW—¹Xøª2óM¼ÔhAh ñòAU2`'=cßZ(õVg¿5êµEñ mWÝï_Í.’ú„85Ú<Î!ìÝÊ<ùŒ©ûy|*Pª÷‹}"½ÇvÑ~îWy•ŸV¬u\6˜çýü;ó‡Î_‚w×VZqÈEûaV¯7›[Úϼk ‡Iõû—니rb ÓœsœÍÎ,t”œ¯­ñêŒ_L;h |>×Ê”QŠ›6‹=µÁ›ÈEl7ÍX#åVÎ.ˆ… ‹1ƒ½Õ5´ûÎq´ýúox|r°p ùS|.ê6+=Øä[¦“éæS¾æÛâxë%Ð#Ïcd”Fâ5ÓÜönŠÏéQ@öH”°É#¾X½_´úâÿÈÆþ‘í¨?3ýÆÙš&Dåg]–ê¹°`…°®¦Z fìñsŸ<‡¶¸®×àFÔ€`$(pùT†¶-t‹$-°jàÛ§÷šFTÔysßfŽ«2¾·ü(v3ü)ùa¯³Á&FmÌÛY=•9üÈ> §áØ×¼Íxòš-äÄ¢&ª[3}f.oÌ=³O«bêmtË-€—èü•Åò£ÄC.é¶ôyQ¹”$ê5$Žª¨Ã‘GýÀ£v3gè0¤¯I° «¯$ê ÚpÚvÔÜ´L¨GP@i>úÓX¯’é×Éw»Hœ’; Üì~ž*óHóâë“ã'§1ïí 1 F¦–K-ªv¾QéqÄW"íPC5±ÛPÙ­"îežÌ kœ`c¸£/ñ¦4'žÍN«7ðg®ä‡ž-߯RlP³3-ßÃMº³øH„Gšù¨´ —ë—òëk+÷ö²~ÃǸ‘`bÛ¡ŒQQµêÉû†2P2D&1„È0 El}º3Øó8™\ßý¶nüÐúá²8º€ Uq‘*'÷ßNk”@&ÂR~-¹8pj¾9"&m \ÒÁ_¨«´ž)SÍ}û÷<†øpÇNŠ©xiz‚àªÌ‚å‡Tÿe>i©5‚ºÏåOM©Û’=‘a*Ág*e6I+¦Y ì²úSÞãìy6^£fc˜ 84c!R‘Û»ƒ›9rùÅÃRÇ»ëϋַu2Ç%"2d fB(·t„iW’f¤gYbg5†\ÌWl)í°º³£! Ͷ€o¶Ÿ_~†yXy h^T§ü–‰àå†ÒÜ6‚B´ÖUnKH”’TÖ»iWˆ|¶¨S]6ZÒ2—‡ G dL %ÊwÅ_µ<ÿ“ò:ðøÑî<¡*‡åHHÊ58¢@I$.(€X2° ´B ±Xa„€ ‡–,cC!©\žƒ–$ãU3w¯¨Ùn$PîïÏ倰á ëöù)ëéG x[ˆàA€´syÈׯ}?-¨<‡ÎIGW´d€@KŽp˜º"4€Š.Ê[v¿O“×aï£Ó£ï\¯æÂÂ1,.hYŒ:ïg§QY`xwf&‘×ed‰Q ±[j1•iPiý©\H´oJh»^·La·‘ZaÔƒ¾>÷yËëÊ.û~?Çd+£²\³m3áòBFXk‚rJ8LL(… ² & ƒÅ™Þ”Öü<9O®¹Oå¢#JÞBû¡–ŽÜœz+ëk}Ô×Ù ÝåM„AÚ¿-|“w®7r SufûrÊ=8­Ÿö%ê¨I f &Â×(t>C¹Ð°4 m6VîbiÞw“ñ ïIpf/•æ "ãÎ?ÊO×ùÁæìq÷ã×ÿìnoèŽ9{zšÛ´ãV½Ç&È` \cSVˆvËõÄ àÌbzlÁÓ9K½Ú››7Ƕiûù\[=Bs†³ ü˜&U!C©B–@ÀºÑ[Ñs¥©q £º4"‚`Œ¸¸•{tì¢c]t1{Rû…“èŽ_œÕöN*=yVœU®iiƒÆÁ®Òh¹uRÝŠÏF…žS¼š¡UY<#8Ç·KÞøüC˜wUø»ì/Lcs¸°RªÏà'jM»‡ñ¸:.뫬ʭýô7‡«SUž«G[[僀øŒŽÖØ¥(tõ‘40ª£8$¾ª*³\Tf|vÑóˆ†13RYÑÕùð˦á\Ÿy™áX@ïßyT¶h31'ó½*"|R»¾÷ßxßoîóþþ)%"“ëX•bÐIYôèÖ_é\ïZÙZ,®çgë }¡Ö°ªDKC„:ßÓÂha¨9Ê ñdúÚÑU@gÈî†AY×¶¬Ô«½%u‹”uQ°Íô”w`Ù©ù^ÒŸ‰gî£8 )1‡-Š¥*j»b™ÆAÓ(§~£ f¸'ŠQn³0‰f´Ðª}B{›\W–c¿ÎÆÕJŸ¯dÓßW)ÕB]ùã_¾–¯çsj4!öÊxY•P'÷x×`UÈÃX)F) å~ô‘ð@®ÌJC¡¾w#s`.½ãIŠ…Äó-™Ï~qn2ëC¼1[J»§Œ5>ðˆ±~ý-šƒ›µ§#WYšÅ°ãzŽ{å5ç^´Ú:0™^_æÛ;û<àuš•¨A ‰ |1é.ËbÍ›„¥èX `,%!hÒË;’XOíóbæÂ¶óÜdöYϵÎ1"î9ÔÙKæË¤\$£œáV¸9üb=#ßIUH…©ãÈ&æSÃixù°ôˆ&+ZTÿOéHRe® ¼4¶“&¦Œg)uß×…®Ï• Y†kNŒ=7@2LJ¿o°€Žk´±ŸŽñü–ÑçŽÑ¨‚_¨›®Z ìEiÅV×~÷oX>íÙö I£¨^»6£WÓíšD=Ú_“þø»ýùËü|?³ŸsžjÉ8†âš†Ð„nÀh¬Zw¸§¡2‰&h]° [>ŽÌúSö[I‹WmQµ&Œu¢AË3*Š%-n(ö`/Ó$Ù”’¾gw‰–>N±* ˆŸIý• èªðò¡aë“%"¶‰ Á~ÄûlòMŸÇ"Gmf7擽ä¢ÎJ?¢,¦ØŒeœ"褭£{·UŽ…g¢N.QFcï—#ñ)N§–B“÷¤Qª´Bugt@a$隣cKLŽŠ^28ŠmV•ó˜@\ðŽ ŠE+é1˜„¦©uk¾î qrtÝ󗇸b]Š-vÜ1>ñ½øßVí±ë úh¼áèlªpš?åÒ8–O3Eêl£ ¼—ƒP…Çñ‘Ͻ ÖÇ>G˜IÄÇo¸³?7ó˧×]|Ê{ftv4'=‰üM§Õ6ëÎ?<¿½ŸÿÇ*>9ó)Ïl¼ižFŸgPÏêÙpKelgV3PÖŠÐ\gø|'×* «ºæºâÛ^º’Ügø],âî5¡zÁu¡uî~>š’ÕÁ†èí¯;v(Kªmñ¶1}fô9NRÛRv VP Ó2l¤æm8ÁŽò¦ /è“?’(»s±zˆóä|•T$5Œ^ßÊa¸`(ÿ úû³7è!ý–KÖCõ­ŠGÊV…‚ ðû1þ|büÃp~ºË°î`ëŸßõúyè_ÆjŠ?í]$ Ã7Ïô´ 9\Cȵî. Í†îæ™:úãòs…Æz ¿>q>íçQ—œ8À2îm§Ý2i/è¶ã±?ä…%›˜ˆ;+ƒs,ª®ðs`Ý?;ê Ì›=Ú¤0“¬Ǹs^ó‡‚TÏ2)e¶`§Ç•ìžåùfüõ¦}¿;åÎöÜZˆm"¾Çb%¤rà =Uú5‚õ ­µõ`Ïä•¿­‰=q«õœõ€ü8v_¯”µ7êç˹Rñ€ÝWúöÇŒÉÒ|½?NÏÛ"SM±lc0u»†h§5> ?j3{ê 9o2?.^t)Äì÷6l}µdv¾_8°¡´”0è©I…*ÑARôPì¯~V7o9&ú•@¬'ñR•_¢¤ÿôGÓ˜öæûSX`Œ¢ÐPRƒ ™¨…Y<Ý%]\%µšªè~J‚ÿîàø0½8¼w- ¦Ê½€ÛÉ׳0t©=üÑ{›Ôˆ1vÿ¸ú4ƒÝ¿U÷;úú§¶v_tâ;z?á·>ÕõÛÏßüɵþ÷þµ7•mYIƒ’A€–¶Ì§·=¨¹V@®B>ûœ,|êí¸5•LÖë’ûDuÜ sMwïHJ”P£ñœØs6Å>˜Qc…a(Õ ¡ê“ÏÙk#¨½Êà›4írACÄAª¢ŒnŠÈE¬R+È‚9Ù¯ÌXy&©K÷¢TؾmÔ”ÇùñŒeÎZ,­âHu/ÀƒPúøÉÇJ·þÉáë–]±ÝÄØCD‚Ïç.¨_Îø#ÔiÔwÁ• ?ºòðý$QDòàí7Lݞ׎÷x <õàÚ¿5> ­w²,Ê¡ n ²Ô a¸4N_„Ùy°—XtÙÑTúëIq!q7ᚈw¥Ð;ûDMÂŒSn“ÝjÄm^ï¾d‹eŒ¤V—‚` #tªW¾¢Gåâ°ÑÅŽj¡ÔÞÃAAl8„Vhì.’«éØŽ3]Pv#´ŽË•2^î‡N °=tj´ºRRÃöäå´L7-pì ºê@,K§s±r$…}1}ÝgÉ÷ÌK¦&°€¼êçGc^ ã4?È7ƬCªê™µi¨aÀx#P£Ø¸®­]Ô³˜ãú¦ƒjEË‹¢^If7˜"#£+­Ò–̸Ó×…óµbÇ€yyf[kG‹”J™â¸^–2-Co_À•ûõß~oœ‡ß©í\P"´€ b*@DZFâ “‹¹H Êq(;«4»0Ûë\ù´+_v5KO¸å—rÂlXžÛáà+WšŒ,&OR±¯ß„w áRBœd bF“ÂÌ|±è»-wWt÷¶{¬ ¼ €DVF/”¦&\FB*šf,ž÷{4H›ƒf4@f|Œ?˜úÇâ¶Ðˆz÷ŒI*ÀÅîÉ|«ðøa¿¡¾˜¿eíC¡˜fœ¢ç°· Xa .Q›P)¬,dÜóä³™•Z\Gî´Ѭ@e“ž ‘¤u®³Ìx㇠ ö–HÚ¨ì ÞOzMûaž½N//áã›àÖÆòÛÔN`¤Ç(MÜ‚"È Q gîV±*iCËQ"f!* Mô\)ØXúÚO¬MÂÌÓ¦WuÿóÌúrø~‰Ÿ¿=låq½ùâš¼¨šÇ”šÌ@EÊXÆ¥á"ÆbZ,’ÂÈ›-;ªJË)kâ5•*û±Ð/Ë8dMæaòLµ|Zxš¡…Çt¡:çÍþL´ªÄsëíö\3] N¢#F“YòzKšZg›ö~4ôJï+byÅ$$b[UpD6R‘Àq_äk§ÍÁÃCrûúèýv‘(a¡ª)²Äï}Œ¾ì•K[–t¦ƒ<©•ã*¾”}ºG3%5}³ «‘ƒ^—š7`h¥Æq[U¬‰s\÷x’æíüj™ª˜ƒÝÉüªþóÿþ’Ö6:ð€ôúzÈÎ5ß êaf.•…¹×§2”5HÃ0¶ùYn0>oÆ Ò«)ß]nö¼÷u¿ó(Z¬I ßD}bÈ Ëezœ<^«£=|„zqÏÙn4Qk&83|‡;!§¶7eùä•^&® šÇ(~Ù5òÓ“ß‘_ãdšeÏôz…˜ÚzЏûâ&Òô¼¡SöNh¬3luçúRô°ÒÚ¼bÓåªÌ{'Ù®n㮵xK# …1a#p åj!t³$R—„‹&Ó@›Mß`Yã0_s¼Ò]ó5¸[K %#þ½8E…¨liƒœ’ë§p³“M«sv’ýY%”ˆðb1$‰°À !%HÑ(‡ò$_|¥ÑÄX‘Šì¨p}j•*%%ëØ•Æ¶`*©@dY:›Ì©í*ä…Vº‘têìÈÓd–‘7’ÐÝA«~Jêëkœ R1ÇîÚ{E©ŒZ&ÓÝg|þ0g9‡€–‚!#¡ê<Ú¥F¨£ðJõ,F›sÄíT{ÊIE*Ä &qÅ«O-'˜áZ?ÂzŽEinÊÍÆÏ½çÄÿyÑÿñÝ ~ÙÃïüü7÷×ç÷×oû¿bôî¶nxd`œú²k.ç=¨hn”—¢z [8ßü€#Gé*BtFåZ>2Ë-:Ê35U×Ñ“¾òÎlɼ•gýg4Rº^Cå'±l`^èdK­'MfNèDò{ÒL²r´F–D“> ͉ٔø "Wóè >*.bü|O1”}.ÚÓLà–[·šŸ2T~_ÙðôRzQïHÝ=Rºôðûíý¿<äæI°70ãX·Þ_t©ùŒ/7BŒ.M*᤽·Oos­r`£’žçG¯_ʦÂZ¾ >Pøö·Ð=Ü#?¸ÍSÍBÖf¼9õÜpÓ†Ì+c3ÜRC’NB‚{ëö³3ýÁöSŽ¿6ߨ#m‡×]IâáÕî2ë‰ö«!#޹ë]êm¤õO˜Æ/tE#ââEþˆv$ªi½êIyê¢jdA€U Z¡<ÐMoÌ~ùúZOÎ/[ƒ9··ÃíA¸.w¥Ikê®;göœ žÒm3Ü÷»œã|sÌÜR•»æ‹<†ªzeÆÇ•¾Þ]óa”^do}þß}Íí­ñ<ó|.JÙ˜ª)þýg×¾3ßEO0TˆR%Ê6Ü‹L™ßþC·ü` Æ4FWµ¯y€\MP-‹µÈÛx³ü×ÿæØ•]4ñþW‡p™ºGó½×¿(©z3íñùwZÁºY­ºg<º]ççËHÒ¤ V$éÅP´PMÒàI'&Š–[ÃR/2[xx7~ßaµák¡ü¡‹x•Ú$ñ€E­ˆüœp„^xU«Dy»gö9£‡‹$¶,•F¾Ø•Á‰GÁaP·£¡ž”ŸiÀ]ŠU„Ô"šTâ[4ÎïýÏÓ¨VÑïnñÆW(­˜ÒP  €ÐºTšý#lIÚT•ðI“6ÓcÁv}dTŽñì`q #•/§VGÊ…H£XŠNw^7¤Ñ=¬ × ´ŒÜ5 ›«‘n7&U. ¥LA¥Ãµ¬Š¤êH=†SêLg™SˆÁëÊç#d™W;‡ãþm{Úª¤š»¢-—›wÂùºùkî^O“[˜R²ÛáxN’ÓMä8F°.=PüvºãÂR‹³ 6çF8ößJüOroýÇGóo§øÂæ5m^ÔýSnè3;ÂÒÚ}«®ëÖTK¢—‘¦,íJ@q5¸sÎâJ°àö}=bR,×vÈ8œ¯QŸŠ÷²Ûîf¡:ö~£$ûê²DU¨Áz”A3µXÜeZ`޽Æôóz–}] Þ¨U—W&©û<ä °k æg8CJ)btÉ…a8¨Tï¶!%:Naýeª³x™ E P‡œ»òÊ €à ór°]èÈD¯D#AÄ×ù„•Ïþý:™Z_‰åzCë¥Ùê<6òx“Ëøx¢ó³û‡Šº£¨ã¼º0¡¡µA"´Áý3ß¶ýû'iœðXWŠOjXZŒ?‹ŽÀ™à>µ}¸ÈDx<ëJRf…Eeu q :EwÛI©Y[Ë{oÿ4ÜBüYFˆØ‹ûZxaû%щÄ܈?Ýž! Œ%Oê(¢›ÍMkÔÜ&øÔúj€Ãüv Ma:ôšÂl†|Y|}Ü+ç³Þ}Í‘+à ‚Þ0žøÈ{§xNöµÞ‡éÙ¼ë ŠD·4ìÁ–}²ˆ4m¤ÃÒ ´IôÙÈÎLñ@Ô…2hŠéR‘NŸÏ@‡Ù lmÏ/îŒ<±þnÆFã'Àá%c!½:ëê‰} K#Ù<ä³µŒecÒ(iwC™,4_öãri_µø¥†‚ä`½8>¢ŸÝH.£ÊÑÒIx•ÈÌOnzüCÖ^îÃÐ,RõœcìXÓˆ¦ÞoOƒhD)"ÇP5§ËýÉ~Gðz*$—â!x| ´ìc,ÅöÁòÝån~šöÈï'—½íý`}B{LâLÖ$ÀýTô½èxë%<ü¬OAK¦!”Ÿ«šÈ‹ƒrŸ‡nó–¸'rææôEK›áVAÐîÛvHÑׯþ»à>ëh­w‡/á¤è„o>3¦2R=ñ$ÉÒSJk’CÉ´_dÓ‘ÐÕx?¦X‡±WSÆðïÞK8U’Œ+¶1r×úM[â*±† "a§Â‚Ö|œöù§_Èa{ÚÄ>06œg·ƒã]sýnT¢í;¢›>ŠÖÄ0·¸hì ÓO`|€›âw=&.,œ;à[Áñb¦6îÇ_½Ô @ZníÀ <­q±R“È"\ÖXUãm/À Âzaàì¯/ÿôÖ(V1DÚ”×Äy"È ý–‹Å!sžå Þ<ÒþŽíøUÑxKþóeãz³*±­AÔ}\¥…àÎ4µkÕc‹öE³äd/÷1Õ­ÄÚ¯¦%¯.í¤:½èuùo³µO®>Ý6wnþ?ËÇLÒ‡¥f"Ã4¡ºà0^ÜáÆØ°¡gÇõW¸÷pכĮ¥0×QMBªŠ¥Þ‡¼ñ‘É›U‹éìÆmÚÈÎíØÄƒãÕ€Íjî÷–ƒGí?°ŸãÅ@$­²—™4uÉ}ô|X7*d"3èå9As™Ç™»\$¡_´8ssü Ö íNï( tÑ~7¿òC'€ÊÉ8óHAÔeIèv(ÏKúŘ“Ö0ßW4;0A.‚ØÅ‚A›ò¥¤Ô1zÓïéÊÚ0fjÃÕ“”©BÃM§þSÆëö>•Ýc4lÊýY¸Ó΋Øs´:8ƒÆ&ÔÇ6lùáHÝù>´}ß7âo‰á¦¤ŠZhìÀw–*Ü»q&‘-‹©Ó †­A¹$hÞì¹Ð F •» oÁüØü¼0Ëhʉ¶;M䘢@‹2 R:P™rtSƒÈÙVÀÑhÀUñ6¢¼ÛPX0J»îh¯4Ф™†K·˜-!9Wúx˜¼ÿ5Úî6V=ÂYΉí1·­™Àw™‚Õ SSA™³C©""˜”™¢UÄÃÝáÆÅ³ÍѶDá {Ñåvôó³ÿÆÃ¿Ôy±Ö) 2TBN¡‹HJ‰±áJTŒ=Ôµh ¡’éö{eïÙúý½ýuЇYA¢s4vØÕb«4ýD™\ g`cÆ]•F‚ ,%¦!ü‰´§©‰rz¦ùGÑL—ñ»{ºCál¹Ð2ïï7S(ù¦ ¡”pLü*#c`7ŠC‹š}¡`Ú™4ÖÆ¹y-5?Üc!Y JqE#¨Ù5Rוi?êüÎ…,äšW¤‚Â+5[LÎ4UZ¼WóPË6é³áú‚«KÅA E,1ulªûÔÁPEci½"ž¨ X,hlØpiM ıœwâ©4sÝWª?^Õw«¹V |l<4ž¶t‡´…"mÀ¢Ð¬ŒV»Š÷­&IÃC=j¡QŒ/µQ*?a·ð6`ÑR³eœ‹…Ôdù:Î$”û”Ý}/lõcbúŸ—}è9\çš/¤¼£ïhö2´yrø—Òç¥ã%Z˜uÜ$81ôBÏ1 PóT”5OqFÕ}(‹£u¢“cZÉIŸ²¸ ûmò;æ÷,à,¢XiÚ3H qjб­O¢ÅK¦ç¶¥Î"ùS ç÷ÌÌBP_+ÃD„ÀÑ•ˆA†BÌhõ~¾žðG¦±Ø¾Û¿8Ú*X‡~Îèý Ó¬@ÄJ#g\Œrhd¨±Ì¢Š5K (hëB]]h“†ÕÖX[ öÒyÒgn[®ó¸ÆëÿXê…?½ìœÍòz7=Ÿ™ºÆÃteE×AÔ˜ú8»Ör´SŽÌúš©zx0nMxåÓ¦.lN5…ÕRõg ñõWžžÎÝ—]+~•Ù]ä꟒Ôõ4®tXš{žwhÁ) H‰[¬˜V?À§ðªùgîæ¥üÐmÍÄÓHê3¨y½Ðt‡)ÍuX®¹(ƒ”óŒ4÷emdt±a)Ó í'r·VºõüMIY™Ÿ7auĤœ»hiwF±ªˆVc\ŒNÀ¤OÉQñ¸†Ù¼¸ÆÃ:Ï÷|¶×ª¯—Úòg¼>"¿p½4+GI‚ Ìâ b‘Ñ¢£hM]ešKB˜çÍÎÂÏ7(YWôÿüRgx¢­œ±x4¡z÷Üž¹’b¡Ú†‰e¦¼þÙ¼ûØç/ãL#\¶-KÅÌÚ|€áœëþ?}J÷tÉ¿r½Œ˜êyìÁ?}ó`ûò£ìÐîH ¡|q)OÀmz£ë±¢óy!f¥²»ê˜?¼›ïã‚[/È&°áµ´© ždºÂ[õöEa2‚í¢¥ŽÀ­~U“õwÌ\Ga_ëßÇØc{êÉ^Üì–Æ ëŽæóš£¯Ö–2Œ±í¶ç)à…Ž]Ö6ŽëT ÌïáµÊïÉ4,}ày²…ÉÊhå SØËŽ£n"˧Ü´Gç:½ŸC^ÉÔŒ×N¯o6±É´üµÚó…oÒý='ø5«±W[àå6ÐmÀí8wyÊ š;¦ž«Ú5ª1þßÇñ´{¢½Á5‚$¡5ìZãØÔ'WêýZÖØ•œaÎvƒcƒ»;/<'BH…Î=”¤CC ƒ®ŽvMi-èó·ÉJäç%n3ᮎ5ÃÍõjhá4žIüªØÆuv`|œ•Eß~ѽ>%5Ä«±vóÚŽÖíóÇŸj#·‘0!ø6³ Þþªq|OßùèÆb»\„N'­ây~òEsÜ·sÉzÜÍpì0^‹hûl¿ü#ò±¸ìS×øé$\‚=Ô«aYìP6œznå^”ýºÕHCúÀõµk~úr zùæó}ë–ã+nÌüíŸýôßο½ÏöÓÿ™÷×íÇs|¸Q¾¼„^ñšÏ¨g«¤îOëÁ7äß&ë¿³í ¼£àX:óWõÄ”I’ ¨µîÃr[Íx|úþ®÷€¬¿ÄŸBˆ«“•ªÑª.„C ­zŸ´ì-ŒŒ‹Fé5[¤!‡A1Èë´]†[в‹:ÈÑ»*ˆ¯¤ƒ)ÜÀùg„0 #Q½q½¬8Ó–4Ó´i×=^Õ9+žu1éý˜Eéµ^9«‡X¹§§NWŸG» 7T¶¼0°z:8d¬#Ò uèXïRK¨¸‡Óskýgó¿ôþðÁÝ_X[fÝW‚¯¿àã°ÞÆÞ,0zÿåÿÛKÿ¢ÿ¼­@Ú©Éljhß›úÚ^“_°²×üûNUDËÃËÎÌü»ë7ΈÌ?Qo”èq˜H¡. sMŽÑ&©œj9žB%8ÀÁ̕Š`F ÈéZBNǶÚxŸÙñé¯{ÚÉ(j˜L@ óè~:6ž¤V¡·+R@Ŧ¦Šôùü·ýõ¿#ÀgLÍ›.ÇÁñÅvróûQãϽÜ_Ïß*u“GDÑ¥¬åZ(0 m·õâjÁ$fî9Z±±=j;Éó#|Úé]<÷v¾ZÃDüX|3ãF¾’ŠÄ¥xƓҬœiw7Ùz0·›PÃ}¦ Am6dCÞ³Ý`àö»½¸0Ls;¢Û<²uÁ/è!•¹ÄU¾¥ôäŸËæëiç·W¿üë¿åg°wØ‚ Š¨ñ¨ò¶zÒ´¨ND||49 ÷xL4©R · §uîénBtb™øNôk§™úmº Ÿønáàio¿éq]\w†l¥hËb²ºNŸ«¦ôíP‰‘$iàFÜK‹yÓ)oÔ2´eœ.CÎ §N3¼#E±³±jè‘t¹Ù;`K³1—ö¾_žþáù‰nwÂÊܘ½Ä\ðLóù"ôV5sìcÛt=~îÚlÏß=åaXXˆcÄï'éôéæÝþ¨yòŽÄ£}Œ2„%¹H9v;D‘r¹ÁDùÑ „‡(t¡@»á·Œ &ƒEÐ ÛLly"`×r—…Ì‹2[THD”p½}ö~ëí—ïȈtK[¹¯ò†F»€2¹]õöЫ5 —ÏD¬‰-—‡¦BÈá„Y®Û‘¢ÓôÛù Å–ÊÔiVÀ1 Á+éIýÖWƒJµÆ0dÊ¡ã¬L¹þþ¯Z¢—–ÜbUaÔªÅ'Çÿ²[ Ï’n»N^AEá'ÚÊUˆ=K÷t¥à‰ðã|‘½,./^m&+Zó@S"—¡…Õ·ºÁ¥$ŒQ&#ƒ“ïÖ È3£©«‰'ugéZ¢"ÀŒ_¤Ò7¬×ÿþ»:D[_ˆÄ¢9Š ÇZ”I! ŒºÐ@ñb"¿YaÍÅÓµ?¥nùÜŠŠkär0€|±L^Ôæ›3Ú8IF¿«Yµ vo Ð ðZ %)]¹Ï& ’ öï9Zs·wÙ³©ýÕ¹>7¨E–LaN:„Ë$†-á‰ÞÑb%ò }V-‡yö>^­Å¶Mh–V¹ÛJ3 S€ÅéÊH4c!x̳|Ò fYâ/Æá/Áü¿îkVéí†Ü*ƒàÓç6µš>_Û¤ˆ#’fe^W:æZ ØE˜þ-æú´(³Ûè÷Ô3]eGÓ2¼Ê†ÓaÖß©Gv}´&)ADF?ü+ù)v±þZ¸Gk¾¸&ÅnPiœ.Àp=ZŽñçÁ%´ƒ2ÿàn~½«Ù8+´J&YaŒ¦”'–&ñVÕ]¢i2-½XÜÑu“>G8åÔöå¥nÍÛ†×!¿!–>«ÿ#×éO·^šþŸeú8É®^âúY÷k_}ù ]ÚDtµª†CZ °÷Ï Ë òCv5cÕÑÁÓåg~Ú$òöœ}œú¤½-'í<ÇY«ü9_I¯ÍvŸà~•V¤­‡ô¿ô,÷ØÎž]™³rç¦ÌíO»’™79×ñyyAÜ×n™”ù¬7`z„çžïÈŸsþóȧešxB>¾ÅËaÂFw$Dñš,A´0¯ÃÞS¸] ñÌáù™óKì¤Ý뎣êx0¿ÀÕ¥œ‘a©ï¯wWC£y¼‚2H+r¾3’ÝO&^O;ÙG{@î wxÌc»\¼×söå.gí,ÑTb!„Á²2çí…ö|*[œÐo‰€Q|aï/àÓ‚*6Ê@WA¤Dµ¢XJP€’®ãPÎU•ÁÄÎldIyõ†6– BAœÝN­­¨ÅU~zòµiÿ¾?ÚÏgÉצÕ*ÍÅò°‡LìÙ›ãC¡ï¼¸LïônŒÂcõ‹ ÓJùèzŠý§`¾ñq¨[é©dtr4´fë#ûfÖR¦ERõ5ý ýf®Â=³Æ*7ÒËñÈ N[óØvå:×ZweA&y£ÃLú5çšµ¸(-9îó@ÞîVQ ×ðnü ö©Ù¸Œku9Jj°ÝÂHÅÝvtk¨ZÔ¾KÑ:\Y·RaâÞpvæÕ¢Š‘ zvÇpÕçAJbÉyÏÇòÐÈÁH©†Áó¬+×¥Çûñóýû_˜oç³ùº¹Ï[/8¹ŽéÓ9Øi°*™{@sbe«(åG\ذa b¢â„»þ.—Kä[}â¨+ЋÉûùq¿†Ìf®†¯Âû^½l›ëÜ…½3/ì3%ÍíKrÿ|^ì-»nîÞ—ËòYW.ž4,w~2˜¬Ië)Á¡§r Çs0{I>"|ªÝÕà ¯nò³È_æýÉ _äcü|mµ6=­"B¦€ÍîaUE¥ˆ¯ AÔH6lƒ‹Ñb-ùÖ|µ6½½{þM{¢MØ¡仆Z÷ ûºÿ5/Š~÷™»‹k^\÷ñ׳GIé£öû¼Î’MjÁz'uým¿Ÿ{.l1®P«ã èb-jkÐH€Ø¥‹Ýì}ˆœûš•Xý‰«½-ÓÜ ·èAá„Ú´¥/úzò»Üo'ÿ§=:I u^Ýý0V¦¢‡8†Šì}EŒ0žg_H¬ÆüÔXÎÈ_«‰ù»ût]¨0m}娓iMª·òü·½¢ÿ ¶¹ñ®NÞ})%²°6á4Ž—×' tà_£ça%ÅU•2Øsü«úɾâû×-w$ûÃHÙ×­½h¼Æx"Õð"wŽp$` †W:™r R(GV¤‹9 ÆtÖ•ÇÊzØ¢¨f$Õ!p§î¥]©]+óý‚uÈ]3i¸Ó¼Ä~fóÌèû…Ê·Ïšú 3ùbuÜ(²oø9‰^bnH%¾–¿ï|jšCKåÑÊÐH ˆ¶X涚ǡ•~è\‡”§4™ü,½fî¿ìã?š¶O a|\_p”LxÔÔ¤¶åRK/B±´úµÅùõ¹5–~|{ïvwŠúõ ÙÏ‚F_óˆHÊZŸÃâ%¹µâ{£1út™±OŒê„úÚƒ™ŽƒD iŽl—ˆã¼%ŒÖ›“³ 'èpßN?†n]óyÍ6™«ªšÊÁ9kÍ‹\IÇ‹,…˲1Á‹X4 v,2Œb1¤iGg>ý¹ö/»ÏˆSñDàڗ0~@ënÕÍ•€HlÀ¡ž¢•Ÿµ5òT¿>h¤»SÕîg+þzVh,ˆy;ü÷ñį!í{{ÿîX¿ Ü|þ½Óú³ÇüaX`/0ä*°ËMwwœÃáXbXRžÂ<÷j¿¸mÆ¢UÚ¼ qïíIŸÅHÑ¥ °ØA „Ýzrâ_½Ø|K*‰§½\ûxž«Â›Òë°íVúðÈ Žç–¥òø·×ÏøYÖñNYrô2fmëŸ2öO•Ïv¨Ë·yhÚ ²AqËt•6fÙW¯·r_ÊIÈ*<ØÜ¹Nšð‘˵2ð òh6Àu3æ@íA¶±³y®AÐ /¡ð6ο·ù?èë-Û#HU„aRj€´¤1x¶Q 2QŸ#øHôã>Î4AB|•ê»4Êç_XÐð©/E©u³ZFã. }gÞ‹û¹žÁöHoFmuDüÅá¾.uZ×ñÜÙ–ü,ŽÔ\,˜0ó?®Ø4{éªwª_Ž)¹Î¶äQýªâu×ÚÕø`Cˆì±t*ꮺ ^#WO5 W þ Xiõ½XçÎ3þÁ½EÅößý‡Û•óüÙßþøÒ³¾qËö‡¿SZ;¾•S†è…øÐù½Ä×î£rŒCåÉW'›EbëÐÏèç;z¯a£[«›àS‡`õ ñã´§K8ˆX&’ÚŒ `¬/ˆ]w1Ô¶FÒÙÇ ÊP6ií÷MhrNiñôpèÏ·Z²¨J|X•ÒYî®LRß«»+ëtî­y% .ã0®Ãçô‰Æ¢ûhukAHaK“ÒÀŠ;Y¶‚í«wø ƒ==¬mȯWa¡•CRˆQ -É>iÆq6R™µße…%?ây³ÐÕ³TYÉ™‡ ²@YPfTŠ'0hàÙn œí„ÀÃ$W`¢í"&|:‰›Ü4ŽúL7ÐñÅóT{6Ç^¸}LÇž> yWµÞý}~|#qom¿óo…øm‰ßé?~‚·h\¢¾C帀úñ´öÇ8™aF¶ KäMO%úœBŽW®ûsùA*±—¸Nh’Èj¾ˆ«ÌAL*¦Ý÷3sî°IyRÛþ†Þ6µnçç/è¡Ô´føh>:@àÔ]163 Æb1\ºŽ WºÉ¶Š,ÖäËI´^Ë=p ŽUïä¨â’稓.½Àþh;¬ðÑdã´$8ÑÜ“c^8Ð ´ÖýÆŸ‘?ß¾œû÷ó=ÞùOoÿ®¶ð_;û ÝííÂwŒ9SÉn¼£[¶¤é¾Þ}©Œ|<üåÙÿݾ,÷ÝD”‘4×5À…ü¦¿ò¿ÄâOºûÃþð¿ûg>/çÌñfúñ&hDN´‹çò÷Fh»ŠPѹ·!<—Ók¤™‚¶¡]VÝÑ®˜¾ßqïpeõr¯Û?bæ'Þø ÝkÊ"hÀP++cÿ¬/畇(ƒ4•È!Pà]¾î…2©³Aî`À ’ÝBFPQÅ.¨WxP×ê7ãõ&7¢ [îÉUdòè!p™<<ºS -¤Ó y*ÌYªXßÁ‘Z§ÿ\j`!KŠ K/uÃm°MÍâòx¥7-%X¦Ìj´P¸kjH&LB™E%”¦B–¥rÂéÚbV!XÅ,ÌÉõø~®KYeÂaè"[å°S«?xýh°PÁ“"±IÁËàKgu÷4šµD[- óð‹]\¾«é©Ù‹È{L)â¥fuog…@š8¶Æ3¡á,TE¬qL_AšÒÊ”—øšÕÿ%zMS$ÞAí7`’J œû7ýÆŠH„†÷¥£ËRü…åXFñ©êoþˆYB(UÑ ™E¯Ì»p¹êDÕ„ ‰íq=K35?ñ†>Re sT`ˆ ô¨æì(kknâ¹ÇñM{ù¥èòzYëêÅ !®dŠ®ƒÏ—À)Hë±×üþvÖú×ö«]¢Þùs½´ë@T% vHI=„s  N]‹­• •2ÕP0ªrrÐDk)åpmG€p¬5óêK$û„çµΓ§8óÆõågTÙZGQÄmHM™c\Øö¡9Û¼ÖA‡ ÄkÄÏg#èIº)i-•—­t"Í5©€‰Á5ÐèjKÓ MÓJ¼Ä8Y‡Àµ.àLþ›²ëÑùÀxvíºÍ3 QV–Ë]+ù~ÚÆåO‰£ýSÅ^rD]k”ê¶åK/«ˆ²& ’f”¶LŸ£:CIhWñÖãïȹ, hKþ˜œòÆRèÀ™p9u¡ÒÊXØäP miQÂ$y¾Qöõ¨'û)i g¬œy>_÷Uß2Åÿç÷¹×Õ÷o\Ð…czþf½¿{˜u†5I/ï|½ŒùjúQÙÓž—ßÛ Ymœ‚¯ÖX'3;p±Zþ,oájødku½~—{eŒ£Q9–§è1ÇÆ×Ô€ùq½Þn4ïº²ÐØN`ý ûõí ¡_¢?àyàúQ¢÷œ275\çÎ#ú.½ÇóCäšãc€2 Î äœ5§æù gãk©¿Fß”‚Ü‹Íîc*D\ΤtËNÌÓ݃´y%ÍÛ§p¡.§W’º÷ ö{b¿Mƒ8mµ£ˆT¦¹Ô•–²ó\À’2Äõ.\jЧf‘¥žÃMœc*FdºQŠqß/«ÉÌrߨ§€ŠŠ±@£Ø5k²¤=Ó`Pk¾¥Ss‡Gq+¼Ñ“ ˆ•'qm±Ç¸(pŠ…0RÁª¼çô+ã×Mí#ÌØÑ{ëžÌ섄ȱ â@US“1ÆX$ÓVbBeŒ¯šŒ½bp¦=®[ֿ̽ônKyÈ:¬5ä©:{Ò—7/_yÒ«o·U-•¨&%Kô(ϽÜR­Ñ¦eò(ŠõU¸’Ç \9 ‰ûø±º”*RO:uN‘aH›\Ÿ1‹"è·ƒ~ J7NV¶ßùÈà¬9 ½Ð[x¿ÎúÎÇßüVÍa¦1ü¼ç'×?ØÓ™ÃÐí6µ¼\ 2Ù’%)#Á¸T‚»Š—Ƀԓ4· ‚ö€/[.³=Þ‘“Áe—Q–âΰ·c@¢ŒBSkÝmÕúG´·úžßÓ}ü¼á-öEpöá7ˆ¢¾cÏ4^ì{ÉC™Ä&§f5)YÌëÕ#ônS@ Yq¦sÅœÂgùÍ|W푯ËÖO‘׊ºÏfÆ¥[Z(B4Ba,Ba’ÔA@ç¢m EmKÉÎÊmå½ðs:¸Ÿ¹¸ûÐëèS?þ~O>êk™þZéÎÑûõð9Oöýl5H«\­*Da!]¡„mÚÍô;‚Œ&N/ÕÕž'4G<¢èzO•þ˜Ÿf$·RÊæy©|‰Óòuî>í¼Ók¯SÓEXÈ!ÔÍxóºé ¯:…¡ DJ]4¢ü«J `DÕ€'»Õû{Á¯ 9ÚÉåüø¿_½¯K<Ÿõ¾hv8¾ÏuòNÞ³Ïýp¾Oì¹k‹<¹¬±‡s>u¾oi@`H.ˆÕQb2 àâu|‘Ý÷SfŽr-«ôìaè„søjÛî¯[ÝùõËÞtUªKˆ6\Ù"e×+Or@BB•ˆQË Íè°N †Î<Ûn³®ç?€×ƒ’vÿÍ6ÿ*½S;)ë+Ÿ’…½FY›_¯êÒ·ïjwza/ÈðœQ’Nuö‹«z?zîoåîç<éÚÚ<ö@vЏ(D¤‚Ý]’QÌø8Fòì±I½-È}ºG°c¹|Ëä.º/‹@ ukãsº°·û4¾Ÿôoícz-fªÎ­52ƒA.’NS”'†5;©K Ññ³p)qî©e_ïÌxyÕo½úÉëtk¶-†;*oýôî¾xr¢Ø-üñïWëãà—d"ì˜\t…®9ŒÏoã´" € 𤋕X÷ú»­‚E/õzêP];Ók”D15I®4Iñe¹ÀÑиÙñ+ø.À%@˜]ÿ-‘4ñßr5â¤j¼g«º«½ÌA”¼$Ÿo $íªë -ÔE¬:¦m£rù9gîΉ“5á~ÊZ!y‘þ4eC—lÆÝ•qKÉR !b dÄ›{÷ÇëÇþ8芾hìQ7×M¼/ ÊÜÚĸ7^®¿~=_Oúm{¶ÇßOÖ??¢|ÊI;mFOÎÀ4ÛÀì.²o½R;ÍQ EÇ“ŸÑ¨õ뻿Q«{7exöz†£•Ù¶ÝÞdø.X“G° “iGa^#x6[ÑÙ”¬–?õå‰ÍSßÞ¦v¨KnÂpÅPI˜7q}~­? ÊTô‡/½Äˆ®Fø<›ð’¯ÏL*n?úa÷Òļ¥1“þx¯–‰õåk ¶»ªLÓç¼Î‰¡/µ8†Èq·íEww|<ÓSTýhqÞžö¾Ýu¶ÖÇfŽîGëñY×çÒý˜Ã³â|˜›‘>e†±­—Õ7ð{{¼Õ/Ä»¶áùþn)tKƒ*›Xír©°„%%aY®1‘&Ûê VPíg;½<Àfd ×ÖG.ö'þiÖ 75åÀÿÌdþJ€Ý{|K×"XQ2Χ•JovŸ a²&¬þRŒÿ“sôÑ3ÏØ_ß4ëó‡$Ol“Í?£ù{Nžà0ƒ”Ë–¨‡üHÜnáU0¹Ç£Ÿ]8L#ˆ%¬;sÊZÅлV³Õ098«3HIé¤:áÜ©´ƒqJ/°’ª2¾$.‘×íÑXo~®…i¹IÃ*‹Ÿ™òØü¡äº’ótíàftÕÁëªîÌŸÿmCŸHŒ=C]®çX×Ã~Ÿ:>¾=× ·¿úÚ};àîÿ¦¯=cA=çîØ'ÞÂPWœ-C#¬Ô®‹%fƒZÕ}h±Õ†@§MË·]cÇ?éë'þö;ŽÕF ûZëàpˆ{Ñq´~ k>ºõq},sÞ‹‰ÎžÇöeÄ©î-˜hK[)Ð9J(R™'¾aœ ŠbÒ9Þr/”A¹ªçó±pö[OüM®ŽìÔ!½’™Ûí-ò G­RÒ$Z¤ÇY±2^mûB¾ºÁ+˹›¹ îS.'ñ—Ó›‰&8A®.~S8RVçGòe¼T=ûì;´Ä_ëQ\¶Ü¯øòrW{‡3**ïŽƽŒÛü¿úWÜúxïã[çì2žÆ\+©ÐÚðé»=9í¾®=³^4`æ8‡ed{ïäXß.l¿x‹ï/Ç9}‰Çañ{Jbeåè×>îÔ?Ò—H^,îÞØ§²h,_Új!Qñ¸¦í`*Ø7:¹-–v‹¨‰ùL¼_çy@¡;ëôÕc öþqknC=¬è~ÞíÝÍ‘ó:=E$ç{rÖµ½FøzåW,.Ÿw­-OÏÝó±SÖô×Ë6/:°0™ O6õ‰‘è’±Ô ¶Ýg²‚±©ÖLÁk¹¨bS© ž>Ð¥:ÈPÍ Û5À+=hö&^·1Bëê•°÷‘"*±NõóƒÞãá̲ø–7Ïô{hû¹oÜÎ#”!Fr™{bÞcgíŸ9iµøÚÕôÛ5ù±u{{ô³á|÷pâWñù$lû#H+½IÄÆÆIÑí§ ¥ÆP´Âã¹ØÙߎA£Ù6O•7HVÒÓÛ *CˆIáçyÃÄ¥â¤CÏ”pH?¤M%Çô€uV°OÌMëÒ²ü e\­Ù¸0á1T5]²C=ó+lX8‘Ñgpžm3K)¶ÚOõb¢˜<ò¶î£.˜ EÛáÁ5‡ºÉÔ@ ×(CëɽŽ¢Ö@KÖ×z]Hû¾yÔ¶6«»¨ˆu³Œ®Ô™.f_n'Y_7·æ^þ…³ô{ß{ÿìÝúݾqàÉ_§¦>ÞŽ¿Eüûý×ÿ8ýÿï÷þWx˜üÿÓ¯úwÿ-÷÷®ÍND;ó,¬ÝŽƒ2ñƒ°"ßÇó½ÛE j`Ž ¦™Eã·CEÌÔ=óJ›4Dÿ¾#[Íù#!!ø‹ï}m¿¶¡gqF=Q•Ù¢hw¶ß¹z™þö<õuõQrµäA5­PÙ󄻚h#¼ˆ>£}EŸÁDcbu†Ö‘óÝbØÝšDÓp@¯–ûñÐË“ãNj@T·ÂƒüžÄ9  j/æÃõ|]~º5 X]-\~SÍ i²SSü‘‚!ÃiIEÐmK–À‡OW!¯T¨4*‘4£LàЬ*ä ¸Æ¥CÄP쪜_Éìû¿ã;sœ™EhØÍ…Ì¡‚PÔà´{0 .xÕ¼¦£ÎU^$v˜ ¼ü(Êêß6Þ¡·âU€;Û($w¯º­m;T{®¬ ¥dü`v#_eÜÙzSl:J,ž@Õ¬‹³ODSÌJÛøûц¾ŒšŠIP[û¤\¡X¨ø—Ý –ž¡eš`¡Pl3s ¡‰1/I;Oz+9 &=¤?e#€/öLõD7cm¦ÅÍÜ­€×A·^^š½ïŸ5«82ö„U"GÚ@‹Áàb¶Ï?ì¤zžû,ºk³û«2©´ÖäKªh«zµtnÈ€ ‚¨Ó³‚R/©‰´wòöxV4ÏAý%µ5m‹N¦4޽<ÉMëxäˆÔ æÑYxð²öÍ<³y|:÷‡d­÷ɺ/JÏ Á³©¦°pJ·X‹@,@D½N <û8—¥#®CÕãÀ‡æØ i~"hDÑ`Uµ X&–jÆVå’hÆzÞ~8‡½¹ÐÛ#Ø¥“ÛÏ—µÐR•Þee¡è‘9_ÓœØÂ¤º^Š­¦Ð4ås"†x¡ZE §–t )…R1L)–  KjÀ–»ì×Üé·\Ö_~»Â»Èý7ý¼Ÿ-“áä²TŸÄÙ,E˜!›úøs ¥*RúgÊ˜ŠµmP–‘¨\ÃÊTLÞ #"A #ºv ¸ç’˜ßÔž—^ ÉoÔ¸Oñ®B´,**a}ÕTt‰fd‘2Ê]98¥b]²‡i&¹Vt’ކí®ÿÅ͇ý«ÖhÀßèý jåÿù¿YôìŠòê×¾ÏÞý]Žfr SÛL>µÛzÈñk­BøˆGM#®_§Êܯñ-°Aj²Ñ"áuý÷ŸÿÿÃÌ6ÕËuÀeS®‘{ݱ½Øê:;ö Ï2«¼Ð­aù•²rŸ;_õ<«œ2 <±¬/_¶GÕL(BÓAÄëè¼Å¼™wsÁ+IÝÛpçu4V`‚P ȱ™C¹N¿ _¨Ýz‘O×{ê” c†QçôRžÓ{zkíëµÔMÊWAcP–FhidÅõC÷fC„²h–qБÇ"%H—„"2Î9§%8Ñc2J£dɈS_ôÅÑþ^ùÑ™=âKVëX™æû3 6š-²V€16Ã],uÄI¹¤Â€£TñªÐúa{^=÷ƒ3.† d#[uGQ§…-jO¯MWïí30|sO½ÏêƒÜï*(wâ¡aà XT«ð¼\èÎÁ½-#C£¤LSª:6Ç6À ˜±ÆZup0%!;d¡ÆZ@ú¤>WéCûP¸Â+ †p.LHž3ì!r’Ç(蔄Ò1}iï¹½üØë ’kxŸÚDB™ÌùdýK†JNyóûåï |þdwÇù(K^²YÞ-6=ÝëXXAfg^–š-•¯½b½ÛZu“h8¹°&Sœ†‹ª;ôQÀ6ÅçXí«q"¹YÛñ(_ÙX ÊQÅæŽîýöË9×HШ÷l°yý‹oHQ}d˯Ü7½Ÿkçh G}ƒDm¨AÈ~‡öÓš|‰y’E´´P YšN2Ë3šÇ¯z¶`º¡93™¥KÑ€ÔDÝUX[ÔÂåOã ¹0Ö",qÁÿi#m⺞ûyÝúÏ=°ÿ„×2N޾cžýjÊ%¶òŸß_ržsy½÷Ìœ»˜óú¹™<Î:ïùFΫþ¸q ºŽ<ž¦/gÅXh ·kÓ‡¹öD–è S‹®“0ˆØ´[Ñt5F×Öæõë×óoé锳XHd﨟ÃËzûV§Â}Ü/å°8šãU“í‚{÷ÜT ä(ck€Í²˜!@Bð+z-V% ‚5Ÿ¿|¾ÎÏy6-ôÝ~7{œ=§{äýº¼Ó‡ñ¦­ƒëíª·;‡´ž(uz÷¤w­_ëýžxòݳ~9y©ÂÒÌIÑP0(Z%ʨSó<á†wf¿ö«¿Ÿž<”•„R/nR@T¤‘ P¹rŠÏ‚ 㥉Е°³íbÅ©Ë!$¥Åñ¶Ôíp,˜¡­U^–bÈvÝÿoàîþ»í?Ñè3NÛ/ö¿áôaôáîÙâÂ^u«³›{ë¬ï /²ìÃw Õi —µÇø;o=8ûóÌãë ìPJ‚˜ÓK~˜+\<¡K4Ž Ç¾HJ! Âãö³ê.@Pز'¹•Þ8ACFÆÁÇ‘‡2‹'²®ÿVʹ¾›S ú„€085LÚÖà+J0ÂŽ##Ð5\Šðou·|•õ¾ÿÉu}$ƒJyýb3¾ÉÐ/¬«î° Á~®aÇÂÙÁ‚6d¥yÀI¹pÑLž•¬S؃z<*X…ðÈ)&R²»?>ÿl_Ð÷WßñÅ^%¦¨ €âXÊn¦¢©Š{PG “Dá¶OBef²\Hªk-¥X˜öØP½‘BŸ¬ï¬ø0ë+\¡ô÷¦ÙïÃè…d¾6}˜GDüɾ]~Ó—³‡1pz]o¯Í\Å—Ü͇=Ÿ÷\:É2á¸BÂzñ ®‡§ŒÔ2§AE*#2ÅÀ”ëAÍoï$ë÷Óý«ÿ|F…›ÑBR·©¯Œã9|{ÔŸ{‘$`¼s¬Ú¨MHƒF¶gqîÇžÿF»šÞÕҪͳƵ®GI¢|H>[~Tü ÇiÖ{Z‡J$‚|›Ìe°#zØ*$u4@³Ç÷>,Õß×4ºÎ(²1k–¦À/oÄ!=É^ýãÂ%rGŒõK»­ì"Ò´fþW“Èÿº8[ߨÑ( °…rÛ ˜I0 Ãí¸c†ÝéĽtCÊ+ W¨œ¬3*8º5þhCÎÁè…½ÉZËØÚòÓ}9çãŸ0ü†'ðLÓTæQijQ4ŒIÁ¬"ÐðÚ°Õ]íàǾ_œê_~ÉÈ}u=Ú ÅSºÄ™*¡}~OÞ^ âý±¼›\ÃháÛâJ/þ6â¿ÝAѵS*€$<äÌç˜ÀÖÀò¡‹Ÿ©‹ôôBWØ·ý gu¼FVžê:·¾b°Wû+Îñßx´µ)Jsw 6ƒ`²²,„Ÿçª\ÏNÎÚwô^ýZÇæý/ë¨8F¸åÏû^ÅFMÿ¾ü˜9ØËØØm)zj;:ºìxÂI'úŠÇÀ¥b¯="ç ŸöÅuQbˆ†„œJ™8×Ée½Àµ¨<õÀ„ãØÑ-ÈBc½Ý9ðÞŸ<àR8$ÑÌi%ÝÕWù«Bõº?Iü&å'ô¡˜b¯höŒ¹ÃÈi!êíì/Ÿ«ça@]ÿ¹ú•xØèVÿ´®+_—0Í5Ù#¬ìÞIÇÄûµ´Þ¡zté2¼ aYg®'Þ¥”D›€]öS÷©ðqSŸÏT;† !Ñm'Úê&€êþÕ b͵âH)‚]€;Ó[Ì®ïºîBk76 ·ýPvâñ˜Eß9ˆ Ô9âk·5ŽÎÍu_9”=Ö¨|ìúîÆB;Ç4»õK/Ïâ|¶1"7&\Sëã–~ñ÷¾½Õ9¢Û[½Ân­Â½¾ºìvãn“œ¼ož¾a¼± LÒ.Ù’Ó~äB$òÖ{¯ü•í‹úYÀGno}à¤Ð©:³ýà#(íPP‰ÐÞ³8B[xS|ºK” 'ÄKécï!Æ­{®„…¹®}÷c´,\Ù«–iÓ£Ýî§×Únó ÷âB窩oƒ‡Ý¾Mý@*OiêãB Êç´¶‹,cùޏ„n‚ÛƒOß‹ÏQ'îß¶oö‹žByˆÙk}‰uû·×–ûËÿùxá¯D¥ÏêË»º^}…1²pU¶»åH?š1ä¹W¤ ¸®îeÊjôÕùØ]_ýþºu«ÄvµöõÖ-÷u¡,›Ï)¿ð“ï*÷Ná>´“­ÅྉYOÖ¡Ôºvk…#yL}û†|ìÚŠÊíìäŠÙ«&Š‹8¼H‡ ¿`ùåi®ß,ÇÙÍÍgz é`çºØè©{±ëYÙáRÏäÃ.š‹çúÀä-}ÉÞ®n¼n1ç³ùl“ÜÀ g°Ì£™èHt›‰ok6ZB+™¬\ŽÖ€dÝVÍ šÌïòòÀ³=ŠÍ8¶ 6ÌÎ,ÅËbµ"k‰ÈmK+ŽWoiQçs‹ÁæÒµT:  ¦Ã,CsãÇØdÓl­ë¸¢r¨”eÓ•&?Øï·Ÿ¿½Çgvºë(W*繖͵ۓ Ö6GÚx™7‹_fýÛÒ§¿h¿ØÂšŸñ´ÿ:.ÿí4ÿ¡>úïßý?ýÞÿö%ÿ}ÂÕ›Îh{žÿÈ¿ìטù?:ûý'ª¦ \¸ÑÁÜWÿ¤üw¶ž’‰DiÉÒ ö1aD…S'úŒüS0¯M'”t°RðŒÙ6¨ièÔ Zú*I B0„åbcwÔ®´¦ö$d]praNL5*V€ÞõêÄð¼[Òé¶.uÀÒÀڛƌÁ E Û0­áÔ š\SŠ˜0AAQ #ˆ4ƒ …®üí÷§‹7¬[½I“DEÈ¡sH'«Ž¦¸X³˜ ½8Ì y4‡È2¤¤»Íh+è+˲é :3•Š‹¥[šÒUÁ21-ŠŠ@ ÔÂ"Ô‘Q‹Î¬ñ7ÞµrøDŒýðÅö'ª¥CÛúü¼›7§byÎ>êÀ­a5OPÔÝŒUõ šf#ŽÜÙâËkZ"×júji¨ki—†±T¬ØšœÀg;>@Ù=P>Äó̘ÁÊ‹Jßl9ó…T|þg¹OèÊ ƒ‹ž,.–ª’!ÖÂCE0ŸÃÝBd,ìMëÒɵð쇶²›ÍÑÚd6PîJà–l=èÒ±-êbT¹’ØÆ¸¸f%ÖÏ®s¼ëçËýͼæ—û5#UÁ ½ÌÒ–ä lÍP(î-ì>suH­ë`}kgÕéw}ÓÙË“³·k]Z½×}·XÀÒ¢6¶)¹…hOæûë]ë ÿR–rÐ0ôA˜-Ë]êA•‰C/©R X`HaëÀ¯øù5îþP冒Eñ ¾j u5•¨-bòˆ ›s*OZ£PÜæÛ”íºÓì'ÊÿµË?2üùNýñÍï=µ£x5£©Oj{]œ'÷ûùi{iŽͲõÈ=Ü:ïuª*â 2` uï³+-´ÀÄvpÞ²4d¼v„æ«;:¥.vUÐjέmû]Îró¹Ò¬Eœ¸†È ÷«#‘L!ÁuF úR—KÖ­ a$ƒhé~ŒÝëwºûçúˆç+¤ê»ubÜ!•9à/ÖBö¯œ?žçQ£º³f\ª§ œe¹U¢1j$ (¸‘¶ˆÔéUœd¨²Š¡KÖCã¹Éæó$ö|–TÍüjùÔ:Ö‰àˆ'ö•ÈJR€Œ™kÙÑ €/dxçÛ|<ôÙÿµsšõ;®€p¢†Õe$¤#KÓH§zÓ 1d¸7‹ Aˆ±5ºzérH*“T8sq°D48(y”M ë.Ô²§ÒS‰ÛMT£^ÿ7¿ý‚÷ªÜчðJ1b "M´BžÒ]¹ç~¡ç}˜ŒKõˆ¡“™’ARüŸ½1HŒ4¤4²jØsùÎ9ª[ÖÇ/ ¿iÏ^S†Ú¨÷àÕJ-Fï‚SÏuùy vw=ÝGÄ˜ËØÀ¹é;æ×{–æUø#‹ôüâüf†¢¶;îwøKÕùl~ôæÁûËïù³ú§ýßë'—û“cß:6æìWÛît9Ç6ºU}âÎÍ–8}ˆ±¸µ8y«p·YŒÓ}ÆÆ’HÆEïDWý8×·ËŠ2"OS e溫|âûi79dòùiÞÈA»¯{³[lŽZKÐ ¦âÊ8å¼ê­AÈ %áø‚dyÛ—âç¸7£b* ²¶)i%a×IÙ6ŸÉ§‰¹‘mKSddÙSÇÓÕ0Ÿ¶]ƒAfJ#ÿ >œ÷@È>ÌYvŸrŽûšH͹’ôªÉ{ùŸûG?õèÕ©ápøí~^q¾}åæ³/è0ˆÒâ%Œ•¸­y.<Ö{zl°j» “mRTˆ·N9V‰@ Û÷_8ò"}i1êÒ/õkÕW·ýµí=r{3ûCþ q|¢ùÁ2éÛ:Ç»ì ow<HKÙØ{¸Gåý()|m<ßçö£qÅB*ÅÆybWŠg•ÃÀQUÎÜ#Î.½uío}ñ7£ßÿgDV4L‰Xa2,'§q„ b쵚õ|~–‘—-Š™“NK€èþû™Íü<*, .ûúBè|”s(E\ð&¥a%tl«}øç}Ór+/qLñB‘ˆ] #ŒýǃMÙ7 @u^ßôöWÒº8:ž6ÒR¦6 ¾3ƒ ®ç†d{A‚)[ܬaÎ fÿ$‹ß~W:¼ý¥¡'y‹iç©CÄmãaáMoæåjÏ+ÿVÉmºU,P$A>jøòùY»qð2ç×È_à¥1‘È©Å}è†÷þõÛªgÁ'1¤5fC *´Êµäì9õ#PÒ ¢% 3PÑD":¦Ÿr.Õbðˆ'é¢\w$ŽHwi®§:Á”˼:Ý÷ÈæûÓ³_ÛZsØÏÇY_ËÌ"÷&g¨ãÆùzI¶\üºŸZÕß7£’Ž*xe#+Æ€«ºBY[W2('Åo5_[õ§‡û}ú9;³ŽøÃôDзõñïñ ä‹ß§¾vnRË»<ß´øºwþÅ5}µCw|ä‚Õ†€(XáÐо}q›-…"~BÌÖAH´‚ÓÖêpg—$Ô†[ådtOÑ—;ª© MÇ©”ŒZ Z ¤ è]ðš0»ýÀŠŠ<>´„fó8`Bq)XÐè‡Xja-ذ†3^úã2ÿ®ÉFÏ¿DA0FÄm鮊Z}ú¤dÏl`áLj¸@¡ÓOÍĨ å¶KÑG£øG30׊ n*.—Gñ›ûöw {–å-˜âi”‘ã™è¹È´9T;ØÞv¨ ÜÓ ª«ª¤lÔø¡+B)G.YÐ3­> 2dûv\y®iÂÙ*ˆ‰ ™pëVp5ó-ß½m¬ïý:Óî†@ƒ°1Åàúv-¶úÆòcÛÙ2‘Tm¼& Æ“j¬¿¡måµnŸ¸Õ¼¢<…çF¤l¦aM“m@ªn*VÔ¢²=˽ìÓaÇS¿Èã¼wçGÕ_[c²´TÙ ÉÞƒÞ¹qÊnGu´&zÎîª4>‰ÑFíý¯q-­G¤Ç­ØÀó°¿äÂaQ"iyî’/¶ £†§‘Q–PÁÐþäó0Î5Y­Ecµ|s«Á”gb2(ÄêO(ãE£ŽrÑŒ;›Fd UÝmÄ Å­ØœKް9Ó]06ȇtº¤Fû$pÞÀí9JZêùU§¸ÌdñÔŸFΨ+ùÞ§½;n0$8«›ÝÃ+ðR‰_“ÌУáö˜)…J ’[Xšn µÈ~©øIÖ-ØBwGcÄÍÎ7d‹îqÛÛD-ÄšúµÁ´\'«|L@Æv‘óŸlÈBÞ¯®§êÓ'ži½»oJiÊô6ùħÙ?kÕY)C¾VÓÅx±Ö÷¨1b&mlßÁ=)Ú;v ®sé뀟ºÕþ«×æëëÖè’ªIY¯(Àgé*8É'îï;/ëÌW<¨è…—1n£Ç]­¤È<&ÒQȾ֩ìBxXN¤OûZhv˜û—X÷7¼*]õãÌS·2}eîØ7F%2ć"Ø-OxŸË¦£¹UÌÎd¹ƒ¹NŸKh,MN³\…ÈEG¯Â隀{Ä‹ÄÚåƒï’çºJû¹{Jȶ޽ÝNñëaÝ.T­U{îݸ²·ôó}Þ· ˆ„ ë;/ÛÀÅB5©*ЧLEíc;Ün¿º½ y ÜÏ0•ÄÆÑÐÐ÷ªª¤XíÎEwIù’ýµ»{+éºîؘGkêܘ»ðÃkhÝó숣n¾ÛnëcX:ö(üòQ5y”SØÝ® \ EÞÔË®£©º¹»=œaRÔ8EoèéÑôΟA~<ÝQ›}èeÊ~㉯î¿ß7Ù;äá |ÃlÚŽÙ×ç[<*VAÀFW6SìÁ¾QµÞMÀÛ]:Hê”,©¤ ®jG¤oàz¿M¶57KÛåþ•^Õ}›ßì9$G^±±l‰‚.䯵X¢m’Ö­Ú]™¾>¶šC~Ì„ö¯­[{C–z@= Âçÿ«f溄8$Ül27ñ&‰†ûQ£^¦„xí²ÌOeÝ*R¬¾¡*ïÙ.3±N%<ü‹×ç³Ïޝø œ7þªVäÇ®…òJZšãf{fîǨsÇ[KÆ`Î+ÂÛÿAÔ›’öÉ ×Ôn|PÑ`8$‚4Ç­\H–ùbSY4!±u\Žq®Å"[œ ë£Íèõ-‘³®.‚ÏxXþL;)°k&£tú™ìÈ;l*¢MûÄ"dê.‹ ›•Ó˜H ¥¨áV|xd°7ÊÇÞõ<Í3Š4˜‹´ŸKûÕ8ÆÇWOªÙšæÌK%C±{â¢u:? •É84ƒjUPAvûÓÚíñÅå—ÎýÏOÕêúxÆ ¿A»¯>Ã(ì¬÷½~=_gœï~úÎæ¯Ê²Â¢!©õAêWÿ¤&üù_™Iw»s$Þêãø@nö²êfÅ£šã¬jÎ5ú ?ûË;W[S'¸%8°¦O´,tJ’–EqJ{á&$« rMLU›‹|·²ïé•ctuöÑA"µñSkÎî¾W¸‚4†1±ñ…ÄÑ6 ÷Òä€)X]#º‚cxª MËu:çKÑÚ¶î½áN£;îa·!KH¹,Rʔ絸NP¼-96D@×M¬½Çâ`0I¡mGbƒpbÉ"Œ´!A±ªYmD0=NaçàƒSâ0 ‡âq­] æ‹×‘9;:ÿžŽõɉÐC3íÊJ/u™ea°f¬\àâůîlOÓ%»9}±‰Ì@[¼8-`3+…8Ì™i\¡a.1y\žlD‹¸²ŒV3DÝÐΔ©d°œ˜c@Vä¡-p!•„Š`Fw¤,iñ÷«ÍÇiÙ¨äÔØY†ùpãÄjON×MŠaÒèØ|!Þ²H¿p𡪸ì4KêÓÿáëü%½~Ž~M;"ˆdlhƒÏËC{V:ÚÖÌ_·¤$ÛkÉwûƒ+?ö¶ëå^ÓûüE^j¸—5=ÛyD}U(’ÈMÅB;àëóï”kÝ6KRˆ+•íÀvߩ֣9¥œ°Í`bÒ˜¨·ƒÜ¶1Ûç‰ÿ¾Ön›6œjŸø8\ýbÕÊáî’(‘ ‘–$ä,Æ2pÔ+„öuÁ«ut%f’™Ì!q é f[»LÿÕµü±Ôî¦Oœžb‰\™¹ÈŽ CšªÈHÍÊ‘‚a;Ñ$ôFKH¬÷',ýìqv3‚`?j[Pª­@H€­¥š LV¬w…[¥MØ+‰ÊÐÛ@•થ‡KÀU÷ÞƒhåïÂ$ÿ^/9?W^†PQV´P’€áF;X%uàJsÚ°•´¡šF ÜØüª2^®úéJ„zd=ÖoY&œ©¼Kܸ†‹ÈÊñÂAj¦b7·„ Ì[™eo$ÉÙé‘ëo=ÿ‹–ÿbãõ3ü×Q3›‚é-˜®Æ«‡–=×_ÚAì7¨c›S s?/¯R2â uMùðP—œ_£ÚF ±±=ˆ¡†i%‚æ*‰ŠŸ#ßS¹ÖH*ø”KË 7¯^jím¾· 3¦ÑÜÉ]Ï%·ÁíEÈJ*ÛÀ #£N©.Œ©ô#Øñ ÙÌ)³9n0 SõÞ¨%ÓvÎûk~^·ýXܯLÂ1×Õcüd-rÙœ;så‰z5XÓÁS\ ¡û­ËÑ’ÈHyb éÇÄî³1#Úšé<Â|B®k)Ög‚+“ÿ;]KD§¡»¢°½ñlœ¼ ÒªÇ€j“å;ÍÉûmÚSý~ »Ë©ù6dŠ˜HÇéD~AQÇÄùÀðÎØd™«¹…”^°‡(â≣¾•º*/;–C³b„T™(RjtCÑkû®„¾ÀvïgéõƉ»ùœç»4Ùå¼»Lg‡‰ÈRÈA€ëZÖ𶜢û˪Ÿ‡§¼›6©¥ÍUQ?gÌ‘m,s6,EZºM“R-ãÔ­õétsÕC )]Q##Òx5®RèN§Öq§wlaXs…@´ùCçÆºîËßñæÿøó;pþ~™ñåŸ ñeÊÅÆ.q‘ñµp¡t¨bô`sœ¼xa?Ö8ïÌ/®RðMVÝsãbG™ª‡’f0LÏh-V 8ÅA&ðH3¢×c¾Œùjð0ý6'% ísz5Ön¤¡)….o.TúL® B1!:¨‚»gotªfkBJÕX1+(dë’ >cŸq@(+†0±IØP;k@£.-‘©!1¹&ù{%f²?À-‹=Ñè“{žª$LìéÏó½oÝ;þ|^özÑÔóå¢)<·nIã/& t;Àv)™‡wýËÿ¼Ÿj#nTÕÂHľ˜±†½&…Xi×)i*áõM=Á÷é<Ûä˜%]‘JŸ[ãåúy¤ýøp¾óuòé‡9S¢1%©FܹŽ× “ôe}Mfå×ýÔhP¬(@˲R  ­<)ðbÖ)úœ÷MoßÙëº×F×hserþÇ7¾[ÖÓ»™·{\ÞŠÔm#ã}že=›·ùyõ‹Ö\Ï‘5Ã| 846ôÛ/×£Ïg©¯j|#WÿWÿs×@Xô왯¡(5{½} rýã¶þ¤y.9<¨¥å~¢‹Ä.ÐÅ@V©šu%8ÅÍÓwqɨ”üÅ1CšŸa¨Ô’nõÏ5°”(c¢·ïïûymõÆŽ#ž¡_v;šýþ¼µj™O`¸½“¤‡=ÄwOþ„v½‚Œ½Nu5^X'³“´uh¦ÄAqjñ€çq‚n´)Lg—­[HFq’¼GÆÕ¶Ixâ5.šêÞ³çܘÙöño¬ìŸ·ù«ñš‚?JT¥e7Å´,‹8´®N°\ cZßšù`¡>Ú¤£“™dôðեǷ¯ÖFÿŸ•=tå6_¼oÆÁ‡YD‡pD'(8Y•iZÛ€[L«WÛ± keÕYa?[ºÈí ¼ûïr²D;$©eŠWLM3H ”H!†BÐYR‹s@¯¥3YP÷ýõŽf¯Í²­L]¢¹ò:Ç–Iб[ý̺ǛÜV›až¿Íã­¸^»|ý~>Ùóß–rÛ'ޝow{ÿš¿Ýæëc7cÙ»uf¯ÛÃã0“~Ñ+8‘7×p€£žjÌz÷{}‹Ò€ùŠðn_ùbç;?­ÅòÙF¥ÍôŒ¶Ù¶{¯û»éÙwîjÞ¶a×üä`ë®|tÂ=¨š{µÇ*7‹Î†/ÔW]E¸±!L?ý@ £°¶†úÆä]ÎѲ*|¬ñ»iXjÂ+ø¯{êñâs¾ˆIpÓgõ¥YT¥…% 9\}Jc7§ÅHÛ™!±Õ\ÊÃÛÚúÏbùóÍu+ÉöuG.#v 9â÷³åÈÃ^35IUûvp”w°õxÓJ  ˆPFzínÒm¸EÂ"Ú@oØV JkFan#Ë,"8yMÌW—gà}žZ¡Y¯Ãj&åèÜXËáucÅ+Îþß]æ†z]fY¤ÃX5ä«¶L$[ æ2ÖíÕ7ßùR±²Æ2]F„[ MX„ µ›ÄÎäÙîúÑl`/-ï©djbÄ&dîòù·Ø¨ý÷Ço>Ì¥/­· mxû[à½ê]ª]ŽáfÍ”ÅIL ¦z€õiM#]oW}þ‚ëíïðavì¶Œ³AÞ™`ŒÙ®£¦}•úåc~¯ªù¦/4­k¡Ôè•ýgn„íeù=3[ÍñÖ2Ç´¢Š”l„zbtìCÐß®)‚€gŽGj@æ‚RVOUKó€/}þÙ½óMÜ7ô6ã^åáO¦ñóEBWÔ V-Žú£GhÕ¡'à³ô#¶ª¤0:¯ÌïEÒó›÷ö+9|‡ïüÅßËÇÍ ³nÇ5“$IŸFühÔìùÓÅÖ8om Søêþu¹“pѳ€0c2’—rMÅô äîúÍBÝtÕÁÚ3ízb[Xg;¥˜´²MX÷”ŽY® œî.ÂA™* 㯪\«\³Þ©œê¶5øäûøÜD¤ã’ì:vÃ|è²øiÜ#ãôˆ¿•ëÜzÿ•çz0ø“l,ýÿS/ûécþxüYß»wf"Uû¼fÇtÿÚ£ÿ˪Ó'æh^#:¢µO[¸rÝ®?NÅãí…ßÚ‰yÝͨ«‰º­·Úü•Tˆ’i!+);0›ÝCôøàbFÂYòé~“Ýï‹|´pÆÛ_2‹®yp¥üâìn°2F÷.ûÍÕïyg/åG~6K˜òÄÊÒ0¬„ÍŒáý¨P4“®X¾Ïëí2Ì£@ÍBKiù€Ì?ÞQû–ßsɾݫmá‘w¨Iøj|&ä<ߢÐ9yú %Ò´Fû6QÕo]jmÂu×çZwu÷µ’s¿ó¿ño{õõ,oH®ʚ­?ÄLÙÀCÒç±ôéÔ^?6v+«w^ ïÄúi­Ü…Çœ}¿âž3…žÈn¡50ô/œG¹xp?·%?½¶EzÕÓ þ•^ü•¯¯Ì=øý¯H\I;Pfžkn3V*°ØH3­ å’H–­ƒ²”U}̰J šáBæï —cG.$;±âWÿyã¹[õÜx=þ˜ۯÝO»¹Ì¸\ÁϦÇÍøBÇm÷ØNÜVmSh³*ÀSù[‡•Ft¶-¬1°`fäb€5ëQõ£8vAíUÙ¼UwáÝåWÆb±*ÜÕÚ’ U6-çGqʻɢ5¶%óóšÏ ÔØéÍ‹ö¦ÀÓN?Fy•=l}C_xUÕàÏVjwÁ|a«Š>_½êeòGx ¦,¶èMrˆjÖü ŒÞRµ…®üðâ3Ì»«ÛiOžÁŽb·†”˜®O¶$?OÖ—Þe}>ÐÎBÙŒj¸Gm£À#zÓ«·-5ªÙå–ƒñȨÆC¦Ö¡j MÖ¤0d5ȇz‰]9!džúbæ¦ÎmjÇ„\0LÌà°Än6:iÓ+ûž!tæD4N±ØJð÷Û¾ÔË`(CR3\<¾rìÎpH¾$ÉLðU¶¡‹ôgI¢„yÞde‹c›õ8Êà]…а,t’«.Mzð,°‘µÈÂÓyF0ׯ ;ÐVÅÕ‚aë3ºþ»«½aè~õ_D”q£7K¤~ü.ãÛW½)iÒŽ$‚ŒôËV–Pÿà‰'ç¼°¾VîƒüŠÒÔîûÊ<“ ]= žä¶o ÇajÂêb J jÛª´¶‚vz½ŒZN©j¯~„î_NzÂán÷¼VgŸ@ýqtg#ݤ “›2p«, B»(…ƒÂ5¤m†h‰J¥…9öZ» í÷쨅4Í3ôŽžÄrÕ¶åéëßÊØ4™­˜a0Ë5ŒuÛ]¶ÞlSLˆ À –¦íT¡ÙlvñPÊ IC#€a*a¹j®Ï¦2z{¥2¤yÙ‡á ¬a³á ¬ÜeQ Z€DÝœ.ºP]óR¹»ƒBÖ°g›¥ Wö^ÊéWºïjÌ×;ûæÂwüQ¢È•†¶åU?±²ûžaP€Õ[bÇhi‡zUn‹ÙÌ]1¥‘IÉÂáFbjƒbËô‡µžPqÍ“g/L›µŸ”žL r}”ÍÄS*ƒ`éŸéÐ3MáVè³áLÍ7]% °X±$J +š 0¦Ko¤üøÊw翚Ïû݃àŒÓÐs{îq¡hºÏê>¯´«Ã…±òÖ,›¥\T¬‚)ŠýX ûQíÜÆ÷Y|Gû¹7ž˜÷!ç»qÎüõB@ìˆb2T€k9cˆUžÞj`ÐÕê³TõB“K+P¥±ŒI¦`Y”—Z{ýÇ__‘ÿr¬¿5ö8ºÞ~AÞ÷¹âÏ")æJIEVdíJ:^{¶˜¬ Becçìl“]ìëÒ0NEÚø9Xzõ ‡¥Œ£jHÂöxÓÙ(=š¯š ÝRñ9€JAˆ" 6“D&æ†*€„¥"Qf ´P‹\|0w¸¸ØÀ@"74`E:P-QQ@$qP)j Q¶fV¶i{"ŠSf–ì¡¢…ÿB~þmtü¹ª¿ e±þv÷h'a´{h ÒPd I‰¼Àˆq˜´‰é#q'È÷†÷Ž×à½Ô¼ )Î~g°1Cö9VÊ 4€0W-ÇmäIÇž¬ÀR ° ÌôjPFW: L¸]Ɉª†¡À#^Ûuœ8r¿ÿáy×çí~ãìOŠÝéø\®‡•]}õÜŸÝÓÉã9yîþ4«v`íê'í)¿l‘û­)ŸOõ¢W©¤"5î‘)=XX&ŒŽB´%`'][9¢Q^QX,[î°ý?蛵s2>XvÍwÌóø;‹ØjoL¹*d¸Ðâµ^Ûj¬VL$lR©‰!Ǹ×9ÎÇr‹°ç7¸ËÚ{g¹¢ÊCr3§· ¤ÌLÓl¢2@¶rN§°† 8h(‡µ† ä¨p˜^ÓÀÂ4³3»KŸc1dFL—Šõ×Áü¤¾®ãx¸“ªC@idgEJô„«Œ0’ò’¨A‚ $ØÐ›qëÞ‹}]ûÙû|ÏnOú4†u„’ZÉ•f^cÃqG7G[_&¯ÜiáÕdHJQà¶4ñ<:±YïŒQ*\ÁÆAl¸ñC'BèôîFõð\ŸUù>þŒçÁ éÊm{&»„7€SËu¼ƒ0´–7`…aÌ^žlQ”0•Ýd+cc¬5ýárÏyn—ã°grÄ륧FÛI•ðü>}o»(ª-¹Ì2{3êRAÌu–àÐ ëB¬áÄ RÃ/ÇàWPŽ&ßÂÑ4 ðó>=M'­oÏö›h ç÷_›Ïð™•Ë2Âüü›ÿòù ~=çyqËÓýüôó«V˜>/©aÒ(”þêÃøE ¨Ù†¢_•}V{vtßÛMXüVVÓ‚?W50¸Vé­DÏ®»!6 Ù¹ çȼvÈ÷ý(Ÿ¯q^¥“sÖd9—¦v2f5Dº uð)D¾Ážîy‘jØ„–˜Çè`öÄû‰š«s'“*/ÛŒ JñÄè lT´ˆªÔî ‰FI-ÔRW` Çÿ;êÕ rGý¿²ù›¿Ñúotùokb¥qžô£œ2º /;÷,µÝN­â:W#9Ú:VO™ƒÖ߯ø¤íࢂÞü4Ðôüù’€ol®}ZF4¥éJ¾l_~Aî2ódqßóçÈR½Z}uÑòETq¿#Ý8<·û6Αrþ`Þ®ßßkx׳»×…~­ùö}oq޳Å~¼Ñ9º†ÝÈóѾÎz^‹÷á|¿Ÿ±=Ù–`’ν,ßÈ|‚æ5º¨eU|î—ü"Ö¥é6÷a¨õH9‹~3CdK„:Ëb Ew6Ô3+J”‚ßúmù¢œ×£Wìœ[ñ¥“L†‚|€°¥?Rÿ— µGì~®VÍlî]v À°Lê|×Ö·azÏí|.ì_p=pÏÉXáAPÓbäÇâÅbRñžc]rò‡Y¿ÖÎÿ6ÖæÁW¯º¼öêÅýŽ™é~)h+q¡GˆJV…M($ ðŵ4ÙÚÙ%¨Üâ3ðP a%‘‘‡"ˆ,pŠ…üÅÚŸìsÉX³,NØt‘Djã Ic³QJFÖ_-‰GT]þ€†³™Ó1vå `ëe9àƒ2BÜP°5,Z \n Q$Š!,4±á$BŒºš ‘B­¡„­IÕw©nC¯V´ëКm£Xðì@wïWÊþՀΦÖ6Èb Йâíflm~<)€oÃXÃ#ý[ÒV¯ ÷èàfãш²ÝƒúPÖ+3I,’pŽŒªz ±4ìe`¨´ !§l ||Ï÷i"†·i®S£7öé»Í–¸½nwTP˜¨ç°ÿÁL¸Äx›·©:,Œ?4/v¾ªÇ—Óÿ\ˆ ²N±8Ï^ÙíÞDؘÖl£ŽëÉíqöOÿ+¢åßýÜúl¨A<0ŽÛVs†ÌÌÏÄt˜Ø’ü­}qiáØ7_ËçHZ×Áqƒª ÎÚÝ~éÕãlñt\ðþ–@gX 4 (ˆ:Ãö|IºËhé0A5›\F½]«lÖ¸™x™‘FuÎV=DÎq'„±a*ˆ ©Ïß¹ú ÅÓëîÙ˜@ûŒáãÊèä4›ÙÅÊ~¾ αxœmµ«Ó´Avg¨›el%ne¬¢mö˲ýœû¿Òdf6ymÖ¢ _ßøÝW*ÊL$¼†‰\t5NE‡<Ì×ÿ½ßÂ]߃›‚5Ê]ÂÏÕ—Ý{‰ë ÷X;ÖíCò~€1õ­þÃÁ>»;[g; &­¶Æ5vnÛ…x’×RWžNOÝdP81WÈ_hP>só©ÏºŸð׌ÿw{¼ËÖ„mÆ…æ§“ëñ×W»‡¸°´à ·ñ«Ì|®bÍ eIêÙk¾áx¼g‡»Í·ã¾³âËèïïIë}Fïûwõ˜íg<"e^ì­OFá%G¾/çÅp)`N­pH½›­Â;¤MS0F>šŸxPݽ¶Q={ö[/G' ÚÛ^ó—®­}¶»±…šÜckÝ'®Dµ)ó!ÝK®¡­MõðÂyž‘¦Š±Vi€–x.@D[Ž¡7ʧ\ E° v2ap@ b¸¡¡tô{Û }6ÊúÚËCÞvçÝ€þ!ØÍð"¶‰%bá|L„Ý—ña&=Ë{AHªQŠB‚/$lO¥mµk$œ R‚èÙã±)ÏjàUZSì¡åv5ž+ÚÚÌþ±c/×½s¨€$!»”Ý0¿¿áQRØCÙ¶yÁ9Ž^9»æ$X–uê8k§¸ßúgë_;ð²÷:9þòç2Oï_ÿñ¯<æ^ň¶~ãÌÖ<_ºyê{ªÒGºÖ¾FÔÑæîü9ÌýÃò‚’ ´cÎ5rŽK¢±â¾s‚ðMHÒˆ·ì%_µØàWl­Oó£pcR[yJÍ~ŽRŸ™½˜rßsÿ±·N…© a^ïÒóñ²%ÙÛ˜´? B¶HØÍ!Rôuî¬Áܬ!ö 'Ä«unJßÔ£ (<–OÖ„‘JM‹ÑÂ¥€í:JµÏ NX=Áä!õ‘œW²oD”å·ârô@“jJ1Fa’¥ÂRK˜`–ä"]J³½uwóGÍKÓ9ßšZ º=JóÐé^™¤u*CO¦Æ©TÝŠÚL )Êœ?]§ßÞ .˜{ZB.ïjšþä Ÿky ã‹§ÀEMš8˜W:u…Â?¸W»ÿR–îéª÷¦®Êµf´ AýÿY’.4ˆî&6º!ù”[àÇ&Jvqi-K” \ÀL l7Oµ…Ç6e™é~‹ås«A—ÕðSãb¢ØíÞ˜]‰Ç£›7æ¤ØŸOóDd` ³™@$B D&Ù.¼uºhÎTx-ÃkiÅÓ±V&³‰"mH94eÉ<ÑÉ«+¸§¢ÚB½„©o»h„qƒz0¸¬ ™t€ùb•›ne«NTš¯EBsà ó¡BÌõÀU×É Å\R²<ëàÐÂMŸÕÚMÓÆ=Î ¥˜OŠA«î³ÁžWÊ*i¢ `„RæR!~9y[+ŒšÔU!MšÔSåû¿j£ÀÖ|U×m‡:S9êªt‘oæÖÒꔀ]RKVólg&s÷ ÉFÙ69&Îfy]©DBˆ ¯ TëE¨(ìorîötB/B•’H„¤Ð"˜¬KÈLjK»æy»¹T˜‚E’ïÐúM yV‰&²òÓfIshºÅ_þ'¯¥?ÒÊ6çr ¶c×ôþà'yÛËËV(‚Šª\ ®`WØ)^ýì*Æ*$ å­ô}Ž–Þ¿ò®”†Œ_©xK½fz}³>œ)­K8‚‘`ÀMÖç2ÅTl bÄÊ5ŽõÙ®¾z™-]VzêÔ«> ô_Íü—#õ·ë³Qr¶0Õë¯t¾¼Î®v£¿ý_ŽÄ…¯ÖÕϾÐ+£5ƒÚ~nÊLkàå(©|Õ¹Ô‰0ÌD-­qñ’¯ŽÞ8ñfÄæ0ÃSß7©Ò1åf­|>6·Ji…¸â%‰¨1ÀFA ˆ—DwŽš{ȽÇrVK1)è’„(A¦a®c¶ÔWúÑÙ›•ë2xé„p,R:£v Gž¨‘€Wĉ­ É )F;pT;hóöýýjµ‹}¸ãIH½ýþe®ÿÀ7] ÎÚB› V!¥“ÀSæï>ô*5£Á5¬•t‹,9î»k`òªñ—†ÓøÞÇgëËÏÑÎèv‚g§í ¬€r9•¶é¾’‹$é%NÛ7L4ãsϰîz[aõQ9Ñ¢·HeÖ‚½ÆT/Îh)½”‹ìîúÍ·ÿïÕõ½ú2Çj¶Ó{_üºÃ¯Ï[ÿA,‹*¹õQ4‡ÛkÞ¼å|E‰ýTûUrìKé!q  Qéƒz$Rú(wávÿâîøì}žGÅ\S%20"àC|c¯ÄÐCŽÐ’azøÃÕîº|ßgû˜3¥[ÿåš 9öì÷X­3-ä­quŽFöì€ñ2¨CTš¿JŒ¡¢Zóý÷º¼/ü”4•x¥E®X]õŒ{8çîóÍ=ž2Š^{Ã{á6zÅОK3a,·”€x¾†W¿© Z ¦Q¢žº2ÏÎ`Yóº À…]‘Á‹(ƪ) hŒ ƒ¶è°Ê^gW`Þ™0úR)+:œ-=èÌ}‰ácB&SÝ^9O°"²%SN$Øí¥ù8¨ëÕu×qˆÓ‚C ¸&í.Á”MZ˜„)¼ÂˆÕZ„œ*3 B(^´Œb'» n;6 pÛqr¡ý ¯šš F?.ß/£ó+qrÿŸÝëcμSk?Þås!¿Þ‰×DVUým·¶è†_{óiY.‹Ya.¥v´Ô²I£›º•vøTèÑÙV´·ðÒo3n3xÊÚã̆3Ï#F}Ñù/1=`ÚaqL§/ž~KÙqy_gÏjTÜ8µ×a™x¿Íuüœ| Û·íøóuhûž ô¬À¤'‘ÿË9—SLësHuLÏObõ…› Àýö÷ÑÚôÛë‘_§‹™ð§ÿÃÇàqZÎò“t[Å ð˜côÛxY=þtþ¥‡j2¨¶ƒÅ4î)Ô«9 êÝ0×ç0Ÿv(dqN &QºÞjx°Ë¼Tº¤%ºàð.„¤O‡¢é¬[.]¼ùÚKßö‹ÓV2† x%š›Z‡Ï+ášØÜ‹i³¹€²ƒõY£7Çð{ƒlmn_òý%yWp–ìG;U<¨Wu"ådÍÿáÃÿqÿ­Çí;{W¤BóoqGùõV¾ìõ¶öò¤(ž¾:f° wùþð‹Ê;œdå6Ðú‡'`!å‘(j Tö^þb|ÃèGÆe)"­ Ñ¦PR`ÎíÞ½[•àƒ¨ã;mlóü×þúÊoªŽÓe4¾¬ béèO]* 68i·D–Ù nŒ—‚—¿3Ì'A¨ÊþîÇÀõpJªÉ¤S°,$ãr VjÖVï6Ñ› Ãß)@F¸Lªæ°Ü"i˜ËÆÀ¿Hw8”B¢¸FÕ¾äV¬àˆÍ(& lÄòÙÎz1j]ÃÙ‡3M¿­8Ž É‡`S‘¦ná(b.ê“,Ę9ßN½éEÂ*ói‘'A:Ö~*Š~…¢‰¬åRaSâ GªP§CÕõx¥ëJìüXmÕ1Œÿûë'%_ž;—–ûv…ïOWjM빽ё‹4Ö!¹+Q^ÃÕÈõ›ÿ¶gŸâjƒ¬x4™I€hoß͇ƫ&e­@9ˆÑ ÿ.êø-úR Çu…gÜêܑˮ‚à+ŒåVüimd7£báwíú‘úø)õòçtNž„(…óOÆùLp’{~„ÑÉ[¿pìâX¿§®)¬KÅ ™™^{h?ÞÙ-¨ðÃà#™¯cF(–Ý,Õñ˜%çµåú‹L[Ó–e¾7°½©M,*r ÚFõ„bƲ g²r¥t!Ђùg'¼{“°Ò„5‘”?ê5ÛöꨨCÔ½íwî¢þ點™i52Å­ÇC€®Y¤ÑÍ1/º×sŽR1¥ž¢5eúèÛm9Ìë4I {+dÑÜŠ`À ²B„˜b,8¡q-èå}|[xV?_÷šù6r? o¯~¸ÓŸñµ½,°q]à x€"„àè´*æv»/”sLlEà”]¨Œ¥b®±ÎsG ŒØ-·Ÿ<öÕ5R>_»Ì0éæL°ÆÂHJôEbX:TMºº°E;0hC*6Á,ë—âþmÞ—÷7*ÿ°´õý\MônV“Žþ¦ð§õ6ɲx-ï`àAšÜ™éëŠt"ú̹zv®çh¹N …:{av •*d¥C·> ç(I.dº"‚d¶jÍÖ(»©*€AJ¬'IãñèP‰8úal]Ï+ÏñÛ')^ã}j¢ y#Z_‹{Väê‰8J>ÚEÜì~Aãܬ·!G[”’­·^Ÿ õÙ´ÈEä übDî† MP u‚Ͷ!ª˜8ͺ*R¹˜fÁh³Hû$b¬P U$ÕÁ%•ñã@0º[e8,½0zÒKbÂióÖüY*ÈñòÊŒ,³.ÃNÞ˜¨ž\©:nå6 x‚ZtŽÙ¶èÆhdCW4£ ŠëÅq©¹‘*Òª0N–T,ã²TßKIÜô‚˜+i2tÙ%iœÊVp¿3°/Š%¢A-ä„–+#3¹j"˜åØ:®¦.R1¹h+‰Ó©™ŠËâD#…ïFºxvñËc.†WöA-¹woåG.Sóv²,fËêù^ß‹êüC¯7r© S|MiWš¼pd¶Ú6‹4¡ Y‡JÔ²‹-¥…“»ïRPùý¸_[eÇÆo(%_Q€a%C„ˆìq, ‘ *QH8¢MÅ\Ó:¦™²®äN[|ñõPÏ_£-Äß ˜+,íµ@±–¨ŸPçg3ÈÏɪ_†þ´_ÞLÙ ªGÀ€u¯åtö“{Ù†-Í^èY¦Žxƈ€×Sð®¯æÃÀë:%TÁRó*S—kXCWÇ•ÒÆ˜¡‚%3ÙŠŠì¡À"2²R^¤ŒB2‘Ò°C ´P‚¡4¤Ä0† ¬Mˆ*A‰r¬„¢˜Ö ±3ÕÉ@ð8V€’Óž)Ûã«Rðþk´ùs˜nÿ錵+d(ÈT,¸x‘@zt¡´RkÅËÖç6¾ºÓû³·²¦LDæŒlþ?ô'éúuÁ_å²­Ï¡ã+å±×$®w™‚ÉðÂõsÐcZ“¡»Ù[r*–f™ÌZÕÁî-™H„傳C>‡ö庅‘mŸ°KÖÈË ¹É.¶KoQÈFÁ°x}éhH…嘜C’Й8ùÈœ ÐeøòâÝ3û™¬rë~ÜÔóÄÏlç,SÆNïøè&£Š—^¨r«ÅSo8€÷n÷O}²/½<·[½4O|ÈþT/ ˜;2ì¶7±½M`ÞYtÊø,þ_{ùã[w.y­™¡Øáv7Þ– sAþV¼r{~ýM翽<`Þàý ýv Çæ}Ù3 K@!B2û‚ àÓÒ¡3S© À¬q¸eŸÍ»jð4Ã|¯³ŸxÂÏ_q¯õ|Ò›çìºù/;ŸàoÐ3Åq®PN&ªr­Ùq?ö´§+a8˜^¹ªÚvœ°LÇ¢.±¬PAó‚ØÉýÃÙðsåÕz_ù¡éÿïºû×Ó»­5ÐXáºÞb3ƒ(p’1èÀ‘À¨²1T˜ Q„úe` /)պקí]5–“Þï§ðZaú¿²_%ƒ IôCŒi¥§ÔmÊæ¾™5ÎiÄkºQ*j|Ô6Ú ‚¯ð£Xاð§ä°=×ìG°~÷´;íôoÔf8ÄiЈGŠuí7%"©#5†%Ȭ¼¿ÏÛ'ƒg ``0^Î-þ9a"¿¢äÇ7oníßëD¾¡ïå_gžÙ NYöýŸ:ôâžwÙ[b¢õšZa®ÃÀçt)÷¸žî«î/¶Çð+YÅÍ®9;àRŽÛÃ`ôs|¥G¸ñáùãá—Íå“z4`ÆÉÁpÀTs‡ºÄ£ÓpjÍÃVïæsvûsuíad$¹Ÿ¤¿ n$ƒ††¨ !QÍÁ®X;:F¤õ´9/ïô": Z¼ru¥]d`|†>&¹ÐºBHãpÖœUjY¢Ï63ç=QÖ^RÌÅ¤ÇЋÀ:|™;„xh=ÍQn÷\L‡P.ÛÚ,æõB¯)Ì6£ÜB_ËÚ¬ä÷€NͪÐÓ¥c¸‡ÙáÌÐbŒ]*’Јò RETDÒª¦BJAÜ€›””·b¥†":¶ñþôÌåwˆOÍ¿™ÁÑ.Èzïüu!aÖÉýP_îšÃ§c4Õ¥ k9«¬j‘’@´R¡Ç€.mÎŽ›Ûׯ¯Lr§NZV&øj°Û³=QÑSÏ™|}~}m÷ç¿ïÓÛœ/ïãòãoZο~ûᬋ÷jµ®FCÂá§óžÖ&•‘Oóg‚ß\›¨+ ô«(ÍêŒU0×ăìzËûÓürüÈ<÷ÂyGB–wW˜+Bì€:ÔkÎ,†Råš_ùlfµYñD˜àš|qލšH7q!¢"¡ ˜†«ëÓ@êÇë¤]¦ÅpÕ•/!QZecqž8€”öJU~q:ìuåoWd(+\Ž«ŠN[SŸÆì]ÝJ3û•hÏ"Ì€Ò åÆc§ª=VeÊiƒÁ¶òˆð·”w1Wωþâûa©ÉßÉºŠ•3g¹úü£ÕZ¬ù¦{3–ô»Y9ølºømú¹o² ßÌ@Áizö®Ÿ7~ùÅzK¾Î˜e”×f£KŸ¹Îtæ:^`î})4¥-„ú0•(†ˆe‚aN4—§óóÄùõ-ßj¶÷ÆÖ§œ mé†4µF4M­º•öš|(TD¢&Åé©äèî]S݃…;"¬3dÏE*f2j„§1ºÏƒò¬qA£¬ž< <†åF„›_d陚G?~¾8-|öLðt]@Íp9¶HI­lÜ–q'¸…µ"OØRµEž[ï¹C³%Ô+E¦oÃã'YrJücË%k~ÑTÅgIºWyþ¼¯ÒƒÖ÷|4E¤2–zTF³Òõþ€ `NæUNi÷+¥Ü,@F‹ÌNWûž†ã]-ÂÀ—÷ úË‚ƒÕ¶~n}ÄPB×$x­u;~2ÇË!Yg ¢sD3LuÔM+ž‘‡ß¥îš÷ñ”ø3oÝÎBB‡y»#g×O/6â«4-gÂa·Òµ=@|œÑ]yv¿,üË›8^²š‹O¤º0   ™@Åšú NŠcÛæYB\w"¢ÒY¹Z GE,’NŒ…ÄwÔÉ@:Jc³]ë³€Æò¨X<ϯ-¨ø]vøàø†ðÛn0°kVPü<‡ÝLýòÜ2묉´aØØÙ°‡hÆP;qç°ø]`²zU°7XüÞr7vBd»7âH¥û>øÐŠo±Ï4ŠoÒà8zج¿?¼íܰéÄu/âÀ±Gs‡þsÎ)‘Ï¿îò‹î™Þ«·ÎÆùñMb‰î!r¾ô¡÷k¦O Š©D{;—þŠ…Ë®S®þnœ¨ãû6:©KsÝǽ•VîüÚà8ÜI=xÎKÍÄž|¨pN9ZŒÃÇæÐO;ïËN]ëG©‚òÝ>õáç?÷#—ðÂj .žŠîv_3›”³Ú i`¼e»Ôö¢Ïzx;»½[JÇÖ,†ì~{S¥¨ÛÌ×ÇV9p;Ç•rüÞö1:¼¸nã¦}£[ý‘ÁƒÂ" ²ˆB–;]6ÿŒÄ»wï­1?e.à%zŠÜWxviIàé ¸÷ýÏ»>ÆYÌoÄ; ÝÞÖüù×W»·28Ú̃ãÅÕÃÔ·PV[|uóN™‰§ù0û±ðÔ¯¼Î͹†•²”¡ð‡oÍßÚ©”æx6a0ËkFüK˜Ž…¿wܘQ?ã¹³î­HQÖc³µÚìÒìÙæÝß^Ëøòœøó³×ñÔççÃ÷ö»¿ÌWÎwóHuÁ˜Pˆ°omGqÂOèÊŽB•‚·•Ž EC+øîL‹’´Ôjµ!Ï.–¿J¥©¼‘1Ñöy‡ÐqÚXFLÁ0ò '¶À ÈUŒ€ „0@ÍXLðÁ ¬hxŽj°)Qa^ÒT‡`¥ TÚÅó{ܰ˜ã¶-¤Àü”+o³è©z—ÅœÕ# õš¹R¡Ý>ܹz‘*ý£ §ƒ¹Dذ§Z×ÿ>ï„!Ìv™q]@ê-ð-äœ:“] ESöNJÆl*WëR²¾µÁ5¥kÛÞëµX)¡~sbv›>ôè°¬üfSDðå.çC Û[r%:çÖè¶~d?¯™A3Èú³æ·Iì„·ÍÛ~`!Aý\¿ ôï«Î¿d+&[R2æ®>=Ýå–Û[ÍÛ¨ð»t~]ƒ¨^HréRíHUÛG NWŽ*G©’–@Ϻ9¶ #£ÀNòQ‚A7Ý| ðÓ•@JÅsz ºf¢¢xÖqáøn ¿˜Â/§ø•Òµ§(Ž;gëxD6Kµf€=¶¡3%ÑH¸ÀnÚßJÅÒ×Ûq·˜g¤)ô‡Ý£ß¶Ð”˜ƒhÔê‘$”„€  <›Ô¥Í©Wrx ©ÜÛZ×xû˜˜\õì»yÔëèÇ×óvUzB¸®ž`‡¼ü äz Õn›c¥»ÌRhÂÿh’äBþå6‹‡Mé,áØÖNÆUý³†ß:žÝ=–ØÓv>ØW:jMŠ d.väϽŽ£ëÏå²À–³Ÿj°®×ž^Æñ½Åž#Ön÷ï^Í‘w?ï¡k—Ç «Í¤`P‘µh kB ´žåô0Ý€üÐ':,íMœ! i`Opä‘Ð%›;¯BH ð• R¶lwóæÈ3€ûΰ!&›áq(3Ÿ{Šhû+Öæ‰wÅs¡iBâXjkú·$•xâAj3™ö§A™Õ굸`Ä"?ù«kÀJïÎ×ãÐ3’&XšUK‡–h™éÃc¨9OÔùð$†‘0EãTšøƒ(-)_¼È oeEÒï¸Þ¤5êÜCÆŽD¸.ÊÁmã a=#Ì paÌ&)!DÎ%1 ÙÖIƱܵàZ?v×/í/£¶¨’TM¼´Ÿ§x(Yâ²Rûsn2Ñ `å‚êŽBíqáÐÂn7?M3í¹ž½\«ã÷Šß›“FSmb˜ >­“>è0IϽa†é0òö#y6…’Yj/r€a°µ£šSŸú¾Ø™ÌEGÔÒŽ bÉW_eõƒ<ÕÉj=³$Ü‘"´Dh@ rwQC¯»¾8O¡]77÷q²F.”Zef.ƒŒ:ÔÆÏY;s1Ñ+•E·Á Oì,ëâ•) ãB“ X(„L¾7 Dg»d±ëX‚CV,öÐ=È6GN‚¨’ÓÉɺbFNfg1ó–CN†'/Í ~Ì.Ò¨üµû'ð=yJ³~J~½ìý†ü²‡'µó)ÏzÿÅÙ6ãëœjçÜðQÝÑ>â¾÷µ­k®™ÎÓ–^q÷%žÒ¹zWV÷ör1êg£ÎSæ:¬¾D,þ²E•F';·{4áŽë]b}V¿ÍaøîÁó©L~ÂçËîç‹ÿÒòþÉ”ÝÄU 9ûm~Ù> a-ß]_?zñý±÷ƒúhn@Y‘±bg÷kFó㋞'.úÞåK{μft/9w+íä6àúãp£?T³œsL.àæhJnàgk¶Î¢ìÑ—`K<_¹¤˜K[Ä̘LÁ-DX¦&)¹PAÈŠ.ú†¯ Ýä`Ã7áKØ”Þñ1üdùÒdù™Û?uã½Òw»§úV8 =ßûÃß?øëðϢߙh¯²œñhi0Œ"‰Èïŧ'ÏØßßþìùMº™¬ÖëêÁÊäæÕ¤vÛWþ}Ve¿|á:Ìãpþç:kÜq=ÓÉÁ]î0s†ãN–avlš·9Wp®ßãN^G#§5¹ è6ÃÄ#Ø“d3GÓl7¸Îq­öµÍ(mH2CG(R5ja”-4ÊDé¥SÖµ i£*B(Ì@ ¨›çåÝãŽ_“Ÿ¶*–n°”-£2éÌ\ `×r›]ÓGÆ.X1òðš¾®&V çB±¾c—m÷Òw­¹îyõ3Ïëø}§hÝì:Ó>[2ûh våÇgc²ºaÛÝigÜðóø23 ¤ëÒ5Yá6º¨ÿûýÿî7ŒÎñÀ0PE!³Xx"¼òjçZÉvø\Äyßp¹!h£&ØB’ ¥QöÎ_óüzÿ(nþ•¿oÃ÷t¹…/m÷-^âÂRù¡}É!(Äo‡xÇp¦TŒàšÒ2R°r"QF\w FD ‰4¡Y„®¤e(„e4ßÏç}» qï_=wþēә·|~Ð}°B)7v·+H}T¨!¡Ì"à,TO=MiëÂi\ Ÿëó¼åvUU=Y’3üýnô~Ã}Ìn×›BD;^þáˆ4Y|ŠÁ(›aÝ»ø•*†Ã€[¼áM¦@d‘X‡‹™×dXÆ%[Ve—í¶ w~¥O¨~Š„Ô„vT a´Ê»TŸ^’Y­bµŸÔ~‘í„N€‚[a¢0Æa8¥‰•YkÐ8ŠHlÑLiÂìª;á¥PÆw🰖RQ܇‘û"€I)œò¾¯ É| ¤À0+Ñ~±±^Ý~wq)½€pÈÐ'¬Ìo@D^ܾ¿[ïÈiÅ‘TÈe`FQƒåÍ¢ ˆíÁ“´Ûê9i.÷ß³±›*@(µ·n72A „A ëELD Ú¢Æižòx³*Êij±xäIÐ#”…’¡vìxrÇ6iÆûžóÕƒ•1Ö]. :xáà…íÖÃUŽ@§ÜïÂo'íŽ}Õ5Æ£i´x”›Û:]vFR`•¶F›~u ‰Û{èâ³ O¸c²ÀiÄ«ì£ÿ¸Ž­æ?|â×v\öZïµ­6©`º—ÏžëýÛà³-L¹E@"­ÆÕzžóØû üó‡ãý|öîòyÔ£Tª‘ ’ ãú5çòzʵ8÷×~÷ÚµÖ'Ó´,çÏ×…ÞNz¶L°óÛåim¼$,¬#qö(˜é~}µt×|ð~@œ6Çù¨®ÀÖŠ¹ŽŽçÏÞ°<ŸßT…;N ²Ý9ZÊ$ôAIå«lZÃÕ†‰ a,Y+pvÚóÈØê æˆ g‰Á Ÿüdñu %ÃöRÏô`VÖµFX“ëõø¯ßÍþ7¾ãq°=Ò;Úæ>Ûk0"ÿÉÜ*YŒŠïÂ5†\ÂÑek4Å©pÊ@Šˆ¹ QX: œKÀ*©5â´^'›®ÖRš†²F<L¨9ýŠŒÂ-kVÖ*æjèb·Zü¹÷ÃZ#ý§qy¾_®?Iú/wuy¥Ê4v_³\áŒã!ª¨‹/ö‰u~^ö κ¼”}4[·eõÞ{l8Ô—ÏžUâE.r;z-™sß®°kŠ vÃó©ü¤÷æû¥WÚL !7¢¬Ù_ü¿bk™¾æÅ\äà/¸kÿ`±,ÖH6©~¶"Ž5$ÝešJ‚6ÕfÅÆQ‹)b!UƒÊó+-%š½áÙ©»œœ„ÖXßWi ®æÁro……MÀl÷žA¯™·?ìý"žØøú©ÕŸí;ÝsÁ¯qÜ¿¾n‚Q'ŠŽ*H B-©KUR©;ŽØ°71ËUX5"ps/ß‹wz-d]ÊÚµ£G&•Ϩ2Þ½©¬UcŽˆ›²¢œWdÊv{¾<áÒ—¶e:´¾÷>¢€ûàÒÏséײ±–£jšZ€ºTìP½L’9‰_ÇE¸Ü±·§[w[;¤°òTyÞç!RÇ«¹¸]ý“u²;N4ÔÍ¿4¯&É´ ‡TY ‘Q÷rûÐÌ€ôÀ†(2FÅ×Tn#s\ ”[M­­rÝ4•ì•í¶XqámØS'Ú.A0zŒ½ÙÝÓhÞW,Q@¿ Ñè fª@2Ç·ë}Æwû£ó%‹¿¦º&htÝÜ…cÂnÅ`í^u¤ng«ØÆ`LK:J¾°˜¾ø…í"æÛÜ ‘ùÖeÛëæ½Þ}¼÷XóKmã|r0–]—þJø4~W­¼ÜÛwUw5†;@8¸óôTî­Ÿà©Zwîïóˆ‰e—•ÈØšmÙXonµØ¡ L˜¡<3¸zGlm?­ðÜÛpϘÏ©3L=¨~ˆxñ\ûY½'’"fµ]3Âé,ê£aH4åcS'´c:ªÕ,FÆÒ ¡i”ÂXàÌH{‚9ÜñÌ«öhŽõX€A³ ÖÁJ(°'Ìx'Ì ¬€ØÌÎ…n º£ƒCè`É¡,šñN±ÚH`þXRÒ€»ÍÔ¸‚#@>·4ؼ›"l,dz[ˆ!´”êŽ[&b¼Ð&ù j`bL–Ž\{yr}?û£½ý©'n’‹ØU³ix𦦓êÛT÷9½·m‹„ƒÝ†^qš< š/K0ˆD—£R™ìnÎÒ#ùô Žõ+˜{ÚwöíÅ'ÇkòËâ7Û(›c+ó™È]t+ŒMƒSèóŠ]£ymté÷‹˜[Fè\< Y©ø×:½Ž=zHéÓ­Ý ë"Ò-&Š9BÊÄ8»ògçZ‡«qtì¹ÙÕd&0´•‰bŠg×kã3¸£N|YwúÑμ41}W?bòŸ’hž ž|jÏÌ5×^[¡ØÐS½üñ«oìN`©9·f§l=Ãêre»éˆ’¤kМE„Ÿû@xr×y—ù‚I†Þõf醎8Šy‚ï»ß<*)xàŸÜÆ•æí=Öé èë¼f±–UôQ÷ëªo€G…ñ¼Ò¯¥É_Yè ø”ú9¿kÓí÷éycß´åÕÈ$YŸ|Óýn‡ÖÄå†ù¬öÕ›i–üDƒ[¶tù'e§<£¼Dok¼“uêEh×øÀˆÒ¥1!kfí7™wgÞÏê·Ù{þ®µÍŸ¥È G;nlúdhqÛFމǟ÷ØÛËâŒA ZXN¾{A_+YQ¯¥É·¯µRR1±Ã+Џ_/{ŒXB ÕCMÛºÔIv·Ní½§•7-›GrV²²ézØ©òìÃkZ“Ùãçg†H±á¾]æ®Sû@ ”îò©(ëãr ÚÉ¡»0J‘^äLuÓ7ã®P©°–9¶›’é¼(Îݲ1Ëóñ3ÏÌyvDóÞŸ™TŸ¶–/Ö|Qå[f‚¬P´Ã‰žN–££g¸_\vSû;k«Å¡:‡Æn÷Êé~<ç™(75™3°wýÆ¡žÂWÆf¨%¼ªŸ 4R¯‹3˜gšc{fUcÝXX(Öh…Yaê$ü…ÿòë7¯¨ÐÐ Å+´î½§ŽÞ7ºã}ì×stz²#Š…Ó” IªÌö}úzµË­òÄÑÊþ:Mçªö`5Ù,4¦?]ëûCªß #2m½Y­œ~¦*éášÆ¥0L#hYVé± Ú©ÂªàZ:ÜyJšs'WnÅ‘=”¬¦Šf+QIטuoaËõ.p³7{-w;)Í0äI%ALJ–´¹½å÷ ·E@6“«ÃóùUô{S§¬ÒûyþñbçÎN¡¿ƒÒoŸŸ“¸ ZkÑîu5„#ŭ¸Zü³þ ®YRfJx:Yí~.VúàòjLlx°Ëˆ(¹œáX|U,†æp ‹U™”{ ÌÝ=v©-™èýñüñ/ÿöiþéÜC!øú®E¹ÀwyäÐ5#×Óóý4à\-¯RF¶Óa2ä¤a—UúÜçwÌ?ῪyËyÿÜÍÍõ±z¾e—¡Ë¾ìù×­Fç•|R檰:e {ßöªuìñyÎ`1ÜÓº3fP*]"”Þ4±tð£ îáƒP dÀÑ…(¦4Bˆµ1x>æSñ‹ëœ]g²ç­ï}Þ†SpôΜüÇf‰ ¤žÀå$ƒ*;i0$B"Ô¨gó&ûùgcÛ%¿ï}+Ÿ”úÓ~mÔñx>¯xzÖÁëüù„ü믜©æí¯û/ˆ½O±Û¦¡|«mÜ*†q²ª ŒÈÕ¥¶÷ý|yÓôœãv-ÄæÔ^¿Û7½ŸÀÈLÈè4œ²u PæØ¹A˜´J "AÑ¢ÁaÔEf¡mÒýhž@*®TÉYiôìîGìÃùyH£Þ‚Œ$±ŒÎÎfbù 1îØ(6%\FìfŠýe·–ïûx4+ÅÖ–Å8•T°êš˜=Oãë3¿èõ#&íã>ççÛ]´—ÁÍŒ=•<ýUð»>ùJØšÙgúó󓵑–›ŒÛ\¹vPg±!»çq…:±,Ç Céß+§öZ¦™áÔ¯»ò6&¡@¸ÆRµ¢;Çæpç_òY—D“}¾ºiîÄýþú~þA€6+FbƺG"RA¡ÔtËÆžD‘ ~!El¨q¦ à!`k„ÀƒL©Jãm©èý¶vÏS&<ï±ó“~Š3ëÌï)Þœ±0n\èÔ§^$Š:(< ºJ t$H;—±¡´üJzͯ¾”ŸÊð¸ºqÞÃvY‡wñ®Ó¨Ž`Á”8î;[LC ê2=ºXYmeTPPÍe<Öi=ñÇ'h×ð%o,Xûñ¼ë¡÷wymSÝáÇˉ¸Fî&eö¸½—gï@FšlËÁŠØØö0äÔø7X—^ÿøÿÞ}µÿZ?®õ6ßëçÕ52™RGìKeœ·k®y]¬Ÿöst¹Æíg8÷~/*Tºu2]Û­³ÝÜ]1›ëzP QFRº ¿7ë]á–sŸýÔxF#uù·G4œ+ ­†\´á&„Æ<ùrÖùe³Ý½ÈôƒnKjÌWž¬3†>¨X&XABZ©{+}!zp¨9E# ‡PL¨Ùݘ̌|[ñe3BÇä‚;òArú¿Õó»þðoL=Ûk Í B邳*k»f°Š‡€®\ÁÂ>öu‰ªíâáe!—Æ›@6Éè‡E*Uçhoò M‘ÐR‹‰ Ãj5†ˆ’œ„ ͵ŠB˜šÒ˜¼ÕÚTúààÌÉ?{ÿòþ;yWöyû¼غƒÒ T¤AË™ÜÕîÞ}\ÕØ´ž•¯ìJzm°°õõõ~ ˜W#c˜˜]bËŽßýkdº1^{%H‘)C” YŸŸtõ¨ 1Nâ~›è:SÉXþh0ÛH¤`¼ýóŒ^Ñ›vä !È+§0;71<’F¥§2E rB$öL®Ó„Ü›•É>Œ‡¨F樸ø" Áª¿ñîaClìŒõé•«‹ChVÏ5ÜŸú|9¦úèŸqM̎⡈ gŒ¸û¦/÷ãÖÙûõ;îr-X÷Dƒ‰Y*‚ÁsÓ÷t‘œ‘‡‹^Á ýø$üJä¬ÿ’YúãÅl »iY€ŒÂ ×ÂöçV¦ £?DÕ&ϦŠÞa ®^´·Âìö¤P<ÕjäÉø¡e }0KÌü%î MðˆSîŸ¡ÈÆ]¢{!0d³(ÛšÈ8-.'á®%-ac£2ˆj(÷ê€]#Nü0ËÅõeŽ.»Ý²k-œö{ö^õyñ¶…cUô•ˆT,J0f(p¿üqÕÉuü*º!|íPðd8Èacûn£i»¥Õu]­rqê1¥§âB°-h;we|"ù’ÎÖŒj×JOâÃyY›±ò—ì–`g×¾‰ô¾?¼¼Õ‚Y £JÑ¡€\m±EÕA@á( å|Aö¦Àš!=ê·œpÐ^œ7œAßùÖ„¶ÉøD²<<м9,"Ãдò%˜Ó±¿5á…üI]úb/»?Q»Ç­õ­cuö—TÐÇX©h8™k¹ôîÍp;âzl7Ÿ Œu v¯|,ê‹I*nÇtW†C(,„$vÚQRáΗ÷LÿLp³?&'|;U{X^9Ë©ßÀÞ›V·n)ÚÏÃkÆð˜ÊÖl¸=àøÑË›~¡o>Ï·ŒqiFfù2/Q];9‡¿Ùÿú™ÿówgùÝíúŽïwZÒJn7¯Á45¤ÑwÈÚ§À‚g„í"Ò$”$c ôï__§|ÏÖÛÀ“íqŸyÕk³ùëëûªš½µÝ±úúð6´Å‹ÝöòÆÔöìíÊnIJ@í\&ð¹w;Õ}@8±•Åšé\í–†Œ‘XÔ7ˆoÝPµ#OÉMN((‚Eµá«ÒtÖœ|§z¹¦h˜Ë¿5—ð›Ò‚лòGþîÓ|çd¿ßϱŠvÐPÂÐG&XB>+—0>…°þ1prâ\ˆ` ¤õÁduËp·*ÓGNoÁæJ¯ÔVš²€kAz*ul͈qÏpxƒ  ¡è b!ðXf +Š!;hØá´ÛeR`aŒQ !Ýènlžh-BϵâfͲûf®GC±>ÐtpÀZ4FœÙ5ór5/¿S,Ü oLœ2h,±ÔõjâKÞ¸^¿´ÿ³Gœ õüeÓOóõƒ­pSl Ò±&¼WÅZvwÆÑCï“„0ᬼ×¶˜‰€Ôœæzx‹ˆ±7à\ øRÅ‹ßúˆÄµýéäË"gO½™µv9íp¸ðëÝq_»®KÑÛÐèÃ6¨™{F7àù‡CkƒKH1`ªÌ•SÙÌmûö‰8ÓcH„ øqû“^u\Ù+/A{žØnrïZίŸê±ÈA 81]OŠûFìڌƵ•_bMÛÕŃ×ÌPý1d¶êš…W¯ÑÏ*ÀùËØ ·<ÉÈmVR(T„bàÇÒ¼ÅOúùøü8/¿úqmN›‚'q"æãm¿þží®v<÷P^Üjã‚ô «h ¶ùÐNLK… bL2dÙôX”’#?êp× LTË„™ˆe¦ˆqJ;Ž¥ÓöÃv²ŸhâqŒ§æúÝÔŒÕòj‡VyÁþRíì8´ÆçˆçÀ‘ç:Ѥ«Ÿ‡øEG¦LbxMkAîÍ凱OAuÂaú`³@·Ø6çD§Ç1莨UŒÕ”ÚÖ¹ª¶®2ÚdÈ86<·†Bjt$Z@†è‘hÁÏé‹_?ºý¨/|zį”õõ-ÿݽÓfnb7ñÖ¶MÇkà;È‚ >v/È.]3§Ñª”ŒAT:¤‚e·òx68ìTOmq;›ÖÙÎ ÑØ ãXôû‰˜š,$騣·G/V[DZW÷õˆ§?†ÏÎ×;æ1’£ÈN?.eûl‰ Ýiœág=°^ .÷Ì;ôA1GÐ… ?T‡O0òWÛ¹ée o”W3IkñÏQnâzϧ)æ|þž⨓«4Ñh‚µÐÅbê¦YR‡Ö·!~‘ÁvîJÖ)¨^2‡^ô rl„aÂ-Áj3¬;T”M9=Ñê©=¬ÐèÑ[dlÿ ™ñþ<ÏWþÊåÞ·mSЪQ<"ƒmgèÔRfvÌ\/ƒÇI-Kôk½RŸVS¾Ä†ÔDôfŽg„“ÃÉÂű¼\¸®ÇL}~Þ\e”P0f—:&Uâ¤ŸÂÆì­ZsV‰"l&MD4ÅN›·°ê”B†·ël”eɼˆÉ¬°nD?ï˜j7ü¨•ëõõë£õýޝ.«õ·úæSùo{³U."¢­ÏíÍ-æ6¬Z‹aMw­z”g=õ]¯8/œHJz †rÙÕ`IXeqz!\°‡Ö‚2«CG€%Ë´¢¼0^´°ý°sÜÁVæ«ðÉ` P•X10|G€Ø¹©¾Z*¶½¶FNm³R1Ëx÷¹çž™LCTÌ²Š—ö;hÏjØîÕ#ö;™úÞó$ ½{!¢†ºœß#oTZËcû$HЯŒš¶±=ò’(U9¡:Õk?„'¥Öá2½kúØÒ]ËI´Kè}í !Î N¯ûš@Ö´a£8¼(Ú+ %ÞÆu*r~Óý·`ñAþý%§šßE–Ûr?®ÎØÄýÑäA?½§¡a.Ô©zkI(’I;¢ä.yÌ#óçÓÑÛlJšÜ>?ßÍuÅó3wŠt{ý†ù¡VÎóžÓ€nLƒbÛáƒ=ÐÊWN{>ЭiÖ}¢Íø^…±¤KºòÕŸ…CžÜÁszÍŠ¢˜ˆLp X ÅGT‡»¬·ä”ˆ"c5[”¥>õÍîªW¹çõnwËŠ3ûuýøÇ²ô¿}ŸäãGû{ÎóÌgZù;Bòñb׳¯ƒ,oçc`Ô0YJõÖ_^ ös}8n²ÿv5¥½OÌqž^§G^SxÊ»#x"jDåÀd0âȱPÍ5Yì àÑØT–ƒ•!º5^ÁäÐekK A¤N•=Da#@¡i>wópR6¿åÀ°È¨xÀ8AóÔ|° ¢æXcû–©u5Ìí¸gÜ?ßSnßÅmPVšJ+?,ŠÈt™*uùút¦2„ñO{@„îµàxwº“Ý z%u²LsÿÝþRM¯9Ü'k¶r®£áh$<^Ë·$JV©>É £‚ûšmë+ÅI¶•TYLr•iqÉjêÅ“vó·—›ómýÙg¼åÞüù͉ºëãñ¿ö¼þþkxô ý¦ öÖAð°=®pZ!¬CBÀ³Ô 4ÎEDÙÁ€¶„H0º¯\’ ´¨‹ÜWÒ:ÔyØØ·ñ.Sj‹0,ŸçyÍçWË펓¨,'/ÒÈ ´¡(‰–p¡©–ѣƆu@‰€J5ü³ ¾¶Ùï+ªq «¤#Þª ¦¡ ã€-’’/ö|Ö·l‹4h*B £]Žj²!ÞŠXRŒV×hôœ÷yë¼”¤"mÔmZBd-·M=ßV‚°Ô¥+³¶¤^6RŠˆp,ÕÊF/¤Ÿh/½d‰¢c'„×ÕÒ_W`]Ú.‡‘ ûD3¹%AÎaåMÖʬÞY¯£“{åz½Úpiî HTïö®‹Gœv ‚_4‰nö/cP_£ ®í›éñ ´çµôìj‚|¢íZ>°ýù¹ß"!¼E’šWkÔ`êæ“ÒW<¶Šá±ðÌÝ­C›Kê¾=nA&¤ Ì)>Œ`@ Ð%bro„/‚>€°(°b{Bž§?lM£|Æ4©emJ¶pKòàT1ŽÃA0Â4K–Y<Àélf„°ð1òÒsÕŸ‰gü2s(šÐ¶/X“ZGUb=å²³÷51ô½´NüBähqwCSø(¶yÚ‹ÄS—•Ë*‡ªÙ“áK—¡X=N#¸j Ð"aí2»…;ß8•£«¡×¢_ƒ|ÔƒLà0=†e`ÿÊ›gÉüC?>Ro·fêmC¸æñÝ‹“¯Yuöâûàaôc›Ì¹qJˆ¦BakÔÇS×|ȯWî_ö¼ÍïcÌy«Ý´dÐéI!gúúÄYOÏoMÞ7]÷æþÞ\gŸo?ïÿŒܽ·ã.Z†Á8œk°¹ò°â½°‚‹†ºµÚÕóía¹Ø~–MwÏ”¥Ù”š(&QXœSÕÈÍ®§#Ÿ¼ÕÅ5ž·[{/ÒSÛ›he ò©|b]˜ cÚ¡dÈ‹ j 0ÈÉC-¢iÐAÌŸçÄhÞž%|®À¹$*:¼( ]*ÚÅömþ_üÛe®üjgÿñKûÌ¡êÆKÏÓãùåoøÜçÅ|Ÿ Ø.úãUžÕéç|3¡We‚ÅɸÀfõ!H@–BJëßç‰aÓd®ºNèñajüØ©I¿2§ì ²¾Èà6Å6f"1“üfOß6ÐÖœ¹³#sÍ+»çS`hMΕÎ0crìºT¨4ÒçÒPjß'\ø‚¥GÕëàw{Zø*‘<š/|ú#5µ¶NV®€Ó&h¬4 ƒ”ãÆ”E®ž½ãî»S&”=väM­ ³3P­öÇÐhS}Ûû/Q ·`'g9!jv{’ i@!cÖiÓm(êÙ:}á‘ݲܰ “qÆÇ…X,ÛÀ„MçÈŒÃÛê2ò÷Ìdü$YÕ„„kûjíÜîéJ³šeÛ“î85eSDšèóÑãŠÝZÿËhÊçÿôÿá»¶’È164Êx:ÌÐ(îÆæ€zb¯Xw#Þ­µ“Ôš—8‰QVQ±ÉÞMŸ¾\dïœ =gfGï¥!,<%•‚A@Y²7šÛ“­Qb¼£ c#Í#ÎAau PŒöÁe‰ ©xܰ¡ ¸/ ÀoÒûéø€(©BùvLëBKÿU.ªU?e—w'%¢lï˜ÎCå~7÷·o¯Ï§øh¤8CtHð€Ü…Å™b¸/ËF—+˜ õ0u«•ìyžúˆçUÚãõ£/|Æ•'ÿtîïc+ˆó_{î;BP³8V+ ›• ëZX£_C k¦ó`ô©§Ê>=VïÓj5ûn­~>ŒoŠ r¬^™üd‡#„Kþ”Ÿÿ8ìæÿÄoKv??‡×Wêqo íÍb%—FŻ͟ˆ/t¬qê¯y-lF®{7ô–5Jry«ç{=Qå“L"r(ª #^Ê®¯™ÔÜRâÅG9Çö/ȯC ©‚˜e¬ÔR}pŒh¦ýæÖ½¿~ÎàÆkð]*éu¸¹±Úkõ0>ÃÍn«-07I’Ç;×Ò›B•P Jâ™(ˆkÊá¡ ^Û{ÐyˆÀt@Š.—ÆôDo÷7þÑ«ïLw&Ý‚[4c´ÖX<áÓ9¶·Š‚EÙ\ô{8>L>5ßÁs ™>ïÍ!ˆ€T“‚‘\>.µ§Ž.T(Uâ9©#ä´´µô"ÔºÎÛ÷¨Éô Þ–ö÷¯¾¿µSFÎüÊ/ÛzÿÿmåÞ9‰CǤ)!€VDfº¸l==:öàlÀBr|’Ý‚¿¤ ‹Rq`ˆ!‹Ã0©EèŸC×&áAX%)Åà°Œs\- Z4œŽ@ƒu…¨ °X œ¥ŒjÑ ¬Šb05è û¦‰iJ¥²U(ÄI,2ír²‚hDD.Z~µ…±¹ìnG ÍÔ*GÏ„!‹FÛ¦®f{¨k?{þ©ûÔõ½«_×ûÇ„†Ó³™È¹ÖïJS6Ž3¨sî¾þ aý“w$øÖéÐ'M-ߣí%˜Œö|0ÝLO–‹¸v–G;éÉÖ´?¯_fÎm5ïúhä¥ °fµw ¾0Ñ,Ú‡=Æxn÷‡_·óW úBܹ\Ê<°=Fã”é ;F-=ß½iî{^飈o»söWæ ÉãwíÄ5º—ðyëmeÔ,][æZüj'îwÏ 7¡°Ùh‹Ä^¤1‹ˆÌHA$ô)dâŒèHaJ[Nìó‹ôZWfóH7˜Z.43zfÇ~DUN5S¢u÷Þq9Z”Fa@ŠLÚÔT´"y µ`ðOMÿQþÿƺ2ƒ³ñ›©^ÕtŽŒ²Á%Æ7ñQñ5Î9¼ñ”±NX}\#Ý”U#gRa é˜h÷„7‘ïÝïÏM\{“?~Æ4G¿ñùKgk­Ö&‹P ¬IÝžÁ›ë›Îøî-þÓ…µòæñqS*ßgËYÌôžf.)r³—ïGfosñŒM¤.«ËF˜Û¬t˜#ß MÖƒv½·‹»¼~½çï&úÇ-O°eŽZÙêæÂ—é=$kÀT%y¼72Ýßi4WàèçˆL÷gˆ‹E¬µBÙÉ ®CwE²ßx©áñý‹ùrz ®oÔ‘l0Ñjt_¬Â‹('fð¥SQ— æ¾Õs¬[nSÙmRìóÌÇ7­óóÛç1¹‰ßÖŜͽ.WQi¸Ùõg1©—x'Øí¡„ =Œ³ÃíM•Ú A@”ú!J;ÝnÝ«’šµš¯îÏî‚T§A' ®sþ\¯oàT^Ñnè¥T!aÑP§ùÐôð“]Hfs½ùz¼ÿP½îÕîµRêÜBJòcNå•L.9ZŠóL ÕŸ@‘fº¢€¯£¿~·÷ÍÎ=n ìÍ žÛIÝvÎ6 ɇµ3xâ0ÍÐA? ²qiœY…fgo¿’ÓÞò@6ŸYè|¬ðóÃs¬EžÀ#¶uàÖáØv—þò¶®Þä¸Ìç“7Î+=Æeſݼ ˜© ÄÐÆ9>ë<¢y6ÞjÆn»[GÍCò>D$=*É^­€,¢ /Qzfüc¥×¾Ç¨›Û–Óº n£F1êM¶÷©ô‘»ÖôØÓ ¸R_Ý¿÷ìS<g|@}» 6”™¤ˆ]Š–vG—zé¢N-¹v«±*îÎr¦YЫ”š'áWüòŸpÏg[V!â¶Jx±e=K[F PŒ%$uD,&¢ZË¥ãHÅ϶§•Ýù‚³Ñ;ç”PJ_Ûl8]Í,œÒåÎP8K=4aweÅ®¤OHœ°¨n3•Ò¥?Æ]ò:Ì7‡´Ñ Ø—(2u–"QKw­ŽøöàWÖ}ž¦J­qËà^8ƒv×¾}fúéúzF7xµ¹ZŸ7¸‰Å¢ƒ§ƒYÛŒ¸MÁBŠC‘¬#IXqinóúZØGûgþ] çï~µ§ëÛ{ïÜÎçâk_ñ]f‰ÝϹàZÀ¡©‹ññ Ô´Ÿ­c6ßGÏ5Ò§Ø{9;õü§ù}Ÿ¯‡jÉwêÏîͯdRÂ^URF Î6 ¯gN>iUi§:¥ª¦ u¸b–©é0^ˆ2pzڜ‘%‘¤†6Ÿ1Q:ˆ*±ÀZŽ 8Á"˜Åt ¾{•Sbª=ÏíÙ“g?8â§ès·80âzÙ® vn”t lxûî_lÇ'u”{‘0ŧúº²¬áÇ›|Å{¿Ifì7ÎÔÜP:«:é«Á–éY:ÎÚÑG*ßW¥çïú.ÿ†¼ç£»OsJçëe—ŸzÖöð`\]–×ð»i€ÚÌ•" )£[ ¹[H€dÈRÀcj‘²Udx‘bwyaäG˜(0„Ø(‚Š1¤¤“8v¢  ¬@Ī&‘#«ÐçˆA› SS¾^ŸWå‹“VzK7ñ%ýs=~Ñ•¯6Ãçv¬ïl]Û×÷sàœ~?_'¦þ±A9yžÃ=”íÀµÞ¸Æ^ì`ô ìáú2%^D—,Õ£¦„Éâ´DÅŠW›•Ñ0Æ©d`\ ¢ŒPˆuÔL°¥£¹œ9yüÞÕ!"Ì× È >¿ùÃoÚßéd7„ôð?º±Ç#„d¸¡iÃ254aµVH•Öe„4Ï¡íõe\! kˆßË\µ‘4HJòzóÎͧÏ4Iúæ—ãçëK{C¥9hM0Z/w¦Fª 6BŽ;`Ý6䦹™‘žúïÀõ~Ïï†[BOZX0Âų¢hÉ«©ÕĹ"®¸” „ÓÒ§+@Hjsœ!ã” ÚÀ‚½eõŠfó쟓o?ÏÉ2R’j¶ ùÆ”Fjrm¾Y$ûg꾪Ûï°G¦6#Eµ•{e¤ …C™j„2ÄQÐ-öä! ÏÂPûŸ“šEäÎÓ;ûjGu€G³ªý8ƒâ%‹ƒ-Ud=-?:\áúë½^|½ú¥ùw?µ4Ps¯á5º—±õË?V,¿–zoó&îú$R…‚d;tp?@(/\¯iÝZ]]ÑpTÀ†gØm­9s²E 8q|àD?ãöÎû ‚!Ja%€L¨ú'n+ð¯Î¯€UªÊ(¡b$²›b@cÚâÈw•õ‘r/;ÕHˆâl w­€Hm½ò8>BO9³Z±)Ö•‚ä ¼ð¥"<=É¥^½;.lHi°0¢ÅÉz+÷ÃÐ×ê*®Ë>@L-ce*ïbËÔÑb‚\Kƒ5ÚlŒ4W «ZYªt™Y ‚ÙRf—CÜ.·yC Ø“ZïD”É6‰òŽô×#tþ AÇobhárY  «}2ª -o&õ»=ËÕ‹~òšmt­ürö¼•ÛúýªLÛhLg´+×¢¬È HŸzíœÏ‹×ªr¾É¾ñýgåc]®tNp»²ïõ¼}µ¿æ|çòD÷bn§{L{¾·×§ºNz¿úúýç>_U¸x­¼{„Ýî~¿½˜P×8{>'Øé’z•óó‹¬ö\¡<»ˆ42“ÄT•œ¥á@ÞDÈ…Ìb2õÛçšNWcnäp ¦û¨ÀP¶Õh$ Þæ‘ * |ZˆùÆJRÚP,Š0ƒ:Wófx^ÝŸlw/¤!®g¶f†CçÓÔaÌ·ÓçÅÁD¤ö/Zù¿{­ý·.ù³¶¶§ÿªÙ°yÔþ«Ü]ö*?U¢/V*?ƒtvõíkílòiÑa‰§5/D»@¤Ž¦²³É‡´¥ÎÆ´¤"Ú&Þ Ã Ò$ …j"I£³^s©© ²Íá©×GûöbÞY|‡òZ½Ï‡îî Ðñ8I+j]@äxœ”Ð ¶†$ᣥ h×Úíu-ÁºJnfu8¾”ii#ü2¿s¬¤·Î¤ð±º¯j —3›U×ôH"‘TôÇ«:Ý1 3qèè ßCÕ ö¬•G¬‹iP+|¥U.SŒ`aàk xX‘òn@¥6Wmˆ%8Av¡+éÎ`àTȤ»þk)5(¼ Q„úÎeäcÂÛœÖâ‘X×z*¨ØP8ùAŸ¹>ç‡üÉìƒàt$j$ä³UãIõÍã󸼻âbðd¡j}»ì‘Coˆ¼™Ä ¶öwæºáX16Añøä›W2ÖA¼d®Š¢¼A÷`~ð4)iY´ÝµY¾W>`[ãá?IÀp=In Ø6Hûmã¼ó+ÒrÛ¸¤ÿ`΃þ¼Suæu`MžBù¹Ãf0§…%oêSNè2X–ú)˜ÈŸÒ·×ç6nKî/ÿú¿þÝV ±î=†AF@#„'R_35Ô~ÿÛY»çõ€Ëímг —üm>}‡ÞqË#NskrAÖ zDbÃtÓ|–ž1ºÙ›¥^w) ÉšwR›VáÑŽê`ÈU>´¯n¨¡-gŒpt5©)_†¬ ˆ€FÌZSA抳@‚n‰Ï|ä´üðŸIÆ÷(³»‘¨$ðÆ=9'ásÞ;íh×Wg”4 ôýO½Oë-*ÂÐTjóÑ5Œ7" 5ÌmQF€Ö–¹p€“E¶ÿÄ7ã¾(ö&Æ“kñ÷Þ`äO4]ËZyíÓmˆóÊiÑéµ Û Ôx8xÚiŒõmÑ‘­ÆKg¼Ë²Â<¸R]x­åõîk×õ­È!ƒD¬QŸsL¬_ úTñóµ[\ïéˆòìñó éå‘–e<–~àÀ÷ײ³¥G<L2µ·×ó81¨=Έ|±s›3ÓR ãT°%’¨'w­?ß/ç«2>Õ0Q Ë©¿¸ŽÇIV¢ZsMÚÿÅÆ+c¿×ëoõx\Õ¯‰kK†),»Õ16GUËŽnƒ´,J·éêÜéÐ-~!~cŽ¿U›À–_ûû¨Þç¦0ùBÜlëÂÒZZ¬ˆOdª\áa°v®ft×ÍmÂØ2=)1à bJŒ–sè¿7«[ІÂ3Љù#¤£! }:ù\ZÍ' “^x+²™\4Þûö>_Œ†.áE²E'¸1xnù+ÇûªMcÌŒ÷< «{S{\ŒèÄà‡þíÇøè.Ö›Z” A €ÁÆ!Å4¨ÁÕ·$’™œñ/ðé§CÒD¸J–ôBÒCX€[AlJȬàD•v‚IÆKcòV t„Ð}`§±M4…íKh 5¼ Ý$ºUœ8ÂÀ3„vA›AÔíÄ ‹AZÂ-Ë.úR±A°x2‰1ú¶èÔxh4 9©•.Šùƒ“Üï7“½ËÒnö­~¡F|<>½o#k|á}úìÅܺ™ÖÿWæ-;27G˜ÒVm¦ÂŸíö¯1\{;Gºfz%7Ô,š:x\2´­ö…5$9ÙÔ–ïs/õLb‹°ì‘îÕk„ÄÑ£4o†#ÛEçXòXÁÛµçcHÔÇôP·p7ßãumŸ¾Ù(üË¥¿ÞlÃóôMâ¾õTz=g|´¶†\ÔæP­Ò£@Q£¦—AÕXΡë4d ËÔ°!0 ‡.kÁš`úµºf¾jêwö\Ný°“Ì-žÑèùÉ‚ &P[Î%Æ/áòÑ[æ}÷á™’2BÛ d[ÈWÀ`fâ¸âÞ¢ã59^ðMíÏ-ÅS ÈM%·¦õÅ7/·šM*¢KÚ€¯¨Ùªô c7… `#ŽFªXÅÍa#ËgO³Æðç¿›¿”Óÿ•þ’êw½ó¾cò:¦¾A›4²>ÍnoÝŸwh|¿°M4ǹÍsà_NâÕ³•¿ÕÖVýîà<ùlé‚DZºÝŽÇ»·>‚:„ÝaŒ¶f4%±,JòÖ´zàGêsåÙœùüÚ£§0ÅØA^´ìÄ5/-h8H›ªþaû׸SêÃô¶ýeû÷â(Œ=ØÎûVx<çK…$aêëkù~{íq6Ô%›ñ*{t7úÁÜΚz"PG©t- ©“*$Ùá aD¥L0AÉñAßú·ÑÙÆ®ÛÿÑñëám(ÏáÛÅAB™>9j/]_Yëà`¯lC@œ¡ÂÄ\ÀãÖÿp÷ò:”•x]À´Öç]‰¬á…Î:'(œ€%0Ê_´]Øó 2FE\ÜWÎʾk¬!ížSÇnô%(úÜrò½Ÿ-E¦\v¶²ãg¨r+ò Å!ˆ›½Ú±Æ Â(†9cFB‚—ö— ÂÙrïT£áFBåfÄ¢K5HÒ®R &í²Å1x>FW\µ­5U¶ÚÕ$^ãyÙ¾^¸®Ï»i>¯¢—¼”Až6üî9»—Êv³wªrœz}}KÕ9N*ke”0Šf%ÒI.d•Áêä¼cÙZNx[Áþ»v«”–•¾ˆµ«–¯˜HµfÁ¾£ø˜Ñ1B€€ó5{~¼¶iNσdõàç¯Ü§·é·R›»/ÝWÆÆœìÅxheÙÔãÑ%p´0×b|ë—|"níÝË˵X)¢¥ÖiäÄÿ™•â|Lf°–‡} t-´ð‚WÕq«ñ8›\4J¸”ɨˆ›.ˆE!ÜŠð¡ŽÏ£ºtw]AÉiš¿wÿ‰ÏWœv ¯>^ª×ý÷¤û¦ì‚Y+¾ëµ€VàRš64ÆÀÑ>Ïh…IqK€t›‡ÛÛpÞFðý>7ÜØ¬E Ð…@P(#^á'ÖÄ줭GÌ„$ÕIM»»›0~¥—ëæÃ»I¿`,è‘—Ü” DXx$J/†W£¸«5+  5ˆFiÑÄ µü™»þõ.÷£ýÿFþ½xÿzžÆa“3úuSî§ê?¹×ûu7ßÓ¶ß’€ä#óP—qZGÏ%½÷™õCµÖ“¼ ë¸ã Ž•U¿áëv¹È¹§÷ C¤¤j 9¨ŽèÀ.¼¾7O8gUnÓx¢T3Q#›ëåf®zLXÑê¨ ¼|Rƒ6Ó„Õ©àÌ`Ç÷}öGÉåƒ$·ˆY : Q!ýŒ#×3ç¹ó&{î×ϽXÿ /A@ƒ9d|¥zïô\¥ŠHŠP¨'ï*ŸK¤# TÅõ´Ïýܼ\ýéý‘°Ž‘Í­j9oùù™¾ö- ³¡½*à‹öD=èÇ\?¿ƺ¥%ïñ#¾’eÕëcóÅìj?øÔ—½èÙ<{û‚ ×Õ9ëR۬ȊR´‹¤`#j¶H„ôŽUŤGÛ>N™ ò¡ßâ¬isØ3Êj eEaBÑ‘P4š"1 À$ÞK¢H-€ 10¬uB"Cy<›d{$SJ9Ôï7Ë’cFޝ÷Uœ.þ¤Ü?e-Ÿ d´õC›¶›Róì9õ÷Jy¿T„F”J|}6¼FMºŸûìÛ­!ëùN©¯³Ôv?¬²‘Smãk¸ R‚I®…[Ã'¬nì1ëT¡‚]£"3º‚ÊH4 1ˆ[Ž­0õ£Ÿ©^DîóçÚ+.÷z«°Pß^ÄW­£Oåd~ÎÑqý%f[Ø šî"ŠïÚÖða<©c“¢H))KDÁGy«åîJ³“ÉQd(RµNõœò<¥'º …ïö¢_ÒsÚμ8lú}· "ÇŒ²Îúö8·kq"«‘5fÔQ(rj1à„¯³qïkÍá<{Ú_Pœ% #bì“ûNmmìïšàV€íÍ5|*F~Òá×N¼ÁLm$3°ƒƒ% ǹ3G÷LÕe/‚¬±ë¼ØcöÜÏ ÕÃ`^Ÿé¾9?|¾§þèš²L³{¥‹yß¡çY»>êâîQÖpŸ7¢†Ï<#hÍòt²„\EGAÏ®½šýËõþxn¾»Ò¶«™:Üó)y@Ç‘ì'¢y2­Ò×1Bº˜@ŨLlØd„pª€È…Hw±„gJ{”:a”Bb`CEïóË8÷»Ç]ÏáÇúè4Ç r¾4ž]Ú-¸‚¨—©óµØ&UúyòßjÿørPmÌJæY \ý! I¬ôÇ0…sõÑ›½Ç35é ,PyPà¸è¾ߥ¼;º¤Îà‹ä°.ªÝÒ”E4ˆB„ÔW=/bÚkÈh K¿ÇbL­xQýá4Xé{nëÖ™J†ñ~QhGËQ…(–‘•¼ýQcÔ%ÊBYH8ý´Óh2%pØ<)šzÞj¤{ïññÊ2kM¸Ä/>YnÉ\²¸ÜPs—Rl7ûÎ5F¸…WªÏ‹f'3ûêŠø!·:öT½q† Ú ´â€ ¬ÄÙ$™x™Ô¸©Köß ñ¯ãúŸÉüÿð} €jrE,Šû Œ ÷^] ¸õ>{UŒ j1]ËïŽþ.èå§Å^nç~L¶R]rîbM¹òñ¾¶„ôj"&ótοý6›çÁ¶…êÀ_Iyæ[-^R­Î8>6øâ5_ÏK .zA½ó†…Óª ²&ÁHÜ3ÞIï3ÍŒ®p“ï6˶̌GY ÍW$Q™O®¸ž2‰j ºZŒ®÷n;?¹8Ž?Ïíé%MÁ}@…X@¤ @à]4Èê8x¡Œ¾Í+"ý4 G€n7Õ‚ÃÌ®¡ŸÞÜ éK\̓e±Áý\>hµŸ±î­±ù€B¶ùðP7~˜;!‚S¨ý;±æÃ<¼Ös&xrEî0WÒ_º™ú,÷ ¡#ÂöWÚ~×LÓݶ™µ=s|þ‹Céû5íO¥¬”e>ioÆIGáXÆ<¢~°žôõûäçwóKr‡@¯Û»Ž°]>ö'§=Þ¡©hwPLÖGeý#!hl ¥:ÔSÉòÒNLm˾3û%zT«/¯A~ÀÒ„Ld‹Rµ¸Ž=Æ»÷‰ðœ§çú‡âûÛLÿÚä¥{Ä;´CåôÿÜ(n=¡_ýÓP…ª˜–à1,i&‡º¯&h£eÜßã©Ñl:WòJ.%TÀËcn£j^ØÑl‘6âP(…“ðraÙqªr÷¦µj¾¢êíLQ§™yðnZ4•;ÂU쪑¬T¦7ÖÄsL;WXß¼K[¾ä¤(D% õª»÷{¾ýÔ—¤!`…ŠR8Œ«éÇ‚¢*( ŠVÍÃc¿—ÒÇ i–bÂ$"lí’_TBl4ÔT¬’ö@Æš@iØ Móî`GYX\ ’̨jè…:£j0Z&Pz’Ø¥i 0·‚eñ¢(p—wÍLÿ;x±8ìmI)³e«J€á>¨!\g;ÐH3iب†¼Hì«Ó‰~Y&fõÙn𳹕~8H»Ýõ9]\Üþ×bðÙâ‹GRm€„å_BIºduVQAmcçNƒ4‘ðš>0c0 Èj_!”.¹cFhrÑíê¿¿.<¾E3N¯Y¾#xù¤â±a¢± »¹hunSãÿèÂ[ùZÊ:ýῸŽGDê.§Z”Fsüd~œ€Ž6îÝ­kúò]n­f=ܱb…†PL0èM»ôhoLBÏ‘˜^%Ð-¢ðžv©þ¸¡ÙK7Ž}ôèÃ_zzý\Ócû\÷¦u'¾™>3˜=WZ7{-«ñ±­àCè™Ñþ6Ñ0N*jPeB¶8ƹ¶~“Æ'Óùö-t¶‘«ûéרáT;Oèá¹’áÓCk°Nãv&yœ‡¯Ê‹ë”IÛ Žlûm)óMDç·ïS°õ¾D3t$;îïæ³U¶ó zmXÆ~ÏxÚ¸Y?Œ¿Â…&F Ÿ;ÑÌÜ=:=Îíý$é¿ð‘åuÒÄ¥®©ÍkòÆ[²øp•n ‘PÁy+7|‹e˜àqYÏÛ’zM¬'?NŠgGTZ“'U;j¶…‰æa0çýàÞÔˆàøÙg\ÚÇîGN(üª/àl¯Øª(´Nk'üÜdÙ.Rf·[L3GŒlCÝ®‘ékì,iwÃ/.o V'º7vH§k:(ï6‚Ú”§ºU4¡¨ðeÕXDýœ¿¼4Ïy¯´ ?jd‹­¨psvéðÊøP#8·2[‰mÀ|U 5b Ùέ¹Z‡ þz;Ç×½Ä6d± ËÔÍ®úüÊ7ƒC¶r*@$ÔŸ’ªHS€ÝêXX{C¤ÌF1mÀ€ñ•¡2·¿­xîzž jSC›DUfŽ1WI7.£MqÔÆ!¤±H¥ BŒ\L5ú7×Ê òÂØ¡ó>}㌒3ˆv{¹tÎ#,lP¼tsz6 ‚©1†é¯þ+1?žî±êWˆ×i÷u·e €ÄïÉ<£ÆCé˜d9E»œw;'i’ °ã<ô<¬ oTU+„%c…s‰Ú[y n¹8ÁGŽè+Ÿzû(ÿÔåó¥žãñËýð“Ù>Êèí—Ï]Öª_ÝæëwìäÎOðŽøç\~~NäˆMm~„¤®r™Èmè0–¸f½iLÌ–á«+¡…xÀ¦:$R.ãbR¨6/(šãoàåù'eä…¡ô3Î]ôSûÖÊŽÕý*ö(…k¿Ø·®Ìƒ}ÀQŸº2_iürý^ÎØDGà‡Â·rï ùÙZ{y ·¾™­ªí/¶4ø|MïMb‡»ú6 8‰kmPL6À"µmÔN‹cÄ)íÒ1Mbá›þº³9Y³$³½aã) Ü»`>_rôwÐOÈjcŒþï²yôéú §Ø¢”%B'g.Né&î?y‘]²å ®ö²3ßY/úC}$•äÊ-ØÄæ‡iÚ©€b,.€ªfqNüÚö»Gï}¿ÿl/Ÿ³0Â<çÉ©½ójêÖ÷ÈχË&ŸV×£ÖŽ\YTÄKM¦»kz)’FÄ™ÎcàÜêZZµn~Çϯ½@ý^×=@ÅDh*S‰}sÿj<·~;ïê>zzï†K4oQÍÚ}ÛÉÑ7YDƒˆ°V…kÚ1ÕÛt+Rlkª'C•i'|´]‚«i5Gl²Èœ&jªÉûÜdz‘È8ðñ ŒÅ¸eH»ÕñÃáwno­s™u(Å R 61ÔÓãÇ®®÷¶ygWõ¡©T%û(ò "®GÉŽ÷×iã >¾=Ž;Rа§ÇÛY;?5¤ÞŸ¯OC¼¯úMÿð;Ÿòy¾”8n„0 eÚ¬ „JœdI‹k!ʪå´SÊÖ{•§OíVe%9H…¶qBF!®"q¨DìX 0fÖi LÔlí_Q‰ *=3õVõ$*T'JO­rε~¦yÅ.Ãûùj“£Gsk§Dú1—׌ %Šhx¤Î…ݦ¸yåwmÉ;ä©z}µ”{BìÚÁ©fSÒº)¤v¡0½QVZßßýó{wÖóÅŽeÕX:‰Å±Üxš «¼!öÚN73…üú"îþ•5³Î: eƸ!¥û¿‹?åKø’ü#¼ÖÅ©…¡Hz=¯Èblë #•€¥°šVU«Ÿeáìq§.Jˆ+RòÿŽWŽ Ìƒ\ØÐ€ÀT-Ãý‡ÿ£¡‰Ýw|bz"P³›Ó^I39rw äDt¢hü`ê¶ùØy{±ú9{í—I/¹ÄèB\Êw9K×j,t…TëÅù¨ êþ®ß¸½”DQ^Ñ`]nŽÖ|h «’hÊx£›®[UaO¢ˆr)`þJTÆìÃ\{V^*zùÄMÛcw×åB‘þ]K Á·ÒÉN£¶À*P6:öÀ—kbi ÔõpKq`|ÚÒ–0Œ‚XÕo×¾~í¾÷ÿ7óWu ÿ%Ér!^Ä;s®eW™¼‘öÌëm¨KãÈÙî£Õ¬Ã£0U‘ êA– c±6r#£@Zzžr#X–Um¤j襠e>«`ª5³«‘“iÿu†‡tûygxü>S:œ>±_>¥~;uvŸÒ”Ë`»Ê*˜a¬‚‰xÌûk¡_û“9‹ƒîE×/(ípÄ$÷/šëü:ÓlähMÖŶýdàîr”8¹w¿4¯É:…Tlyîâ,Z–cm\ãªBm±uعÀßÞìÕŸÚ*l’xf±Ì².˜{øÜΩ¬;®çzÛevÔg½¶Ý™F“I&¼DaÆäœûŒF!»I°ŽÄ/yeXÖÏ£Ýf8ÿª›Ze½íêœ2NÕT #J Fiج2²Yå0,œ”®o$—ܱ ù"Ã+é‘7tž½©¨ ÎѨcqdÔ‘:Ïs=ÕÚ®ê@Šbú•‘¡–æ¾â¢T±!UÖ³M¯?(ýóB €’Ð$$¥þÿ·wú/öÿùû»¹Ï{wçxª0ž¢@>dzP¶ëµÅQÞZUäžZÏÒ»â- hË+ÂÏH¶jøÿT|‰†Ž"˜ D0R×"$+ÆTv"à9ÇH#î/+>J¹ËùûsÄœú‰ˆ© ¤^.åk bh ¨Â䃕‡˜P!…¥¢f9— ÃŒ¢—B—ŠšÁ…ÎE<ë¿Äñ£ ±ý½íÝb]¢YóÖñ×ú¥kŸÜG®zRj3‰¥¤PUj¨ó5 Þ¨£z£…‘ލ¸7}.µ >ÅÓ —(ˆF9ZÍ  #¾ß­To&»n¢ð2Ý’Æ=2sʾÌì£ÙˆùSB.snÁgù #Õ±o“ýŒ8÷ޜݔÚPlÞþç_µØcRSè`‹Øfz\Æo-oáÛu6î…w´­>w_õŠ^ÄEƒjLå­)‚Ê%¡œ¤=Â=;lP Í êŠÝÙ0ÕHCqÇܧ5µìþ’¨4Cýùºt_VÌᇀá0|gJÐL-c¯Vu_ò\>oã9ÎNœçÙcG½^Ú]=?åìÐÛ€N;Ž·ú\G[2¨ÃMDBôB}ç‡õ–ëóÆÈ”T‹Gˆñ¼Ž÷Õâwç{ÿ¼/î|c¾î-Qy ê°ávMˆ ¡Ý@Yföµ[ûµRÌ—›ÉIÓ¶ª¯"\“Þ0¶ýñ˃Ð%#2PJÛ@î%âLª¼òÿʪÏb aëÂØÍÀÐÆœÅ„ßý/füÓ§ArTž‰ ËB/Y¹¤m .÷qEf©B ÑmŽE›p=ŒÈÞi„öpÔ¤–Æ7º‘ "ÂG·svÁ;=Ú‡P'Gˆ. ”<'«™h?U7{«><ñáYÞ]}8:8øàø\+è]ÁÚ×cöèö0ÓL»ïMÙö|Yt¼ó±ëüjÎ=kŠ–2;"ö'-Û_"öµžú–/…õ±½é$ÑN÷Vg:¹ÍÚØ;!¤Úmñ<ãk:Y±í¯5ד“+yèL…f¹Ç$ÓLÂßóBÒêïÄö¸qËÿ¹} Ý‹êôP|ð¬ƒ^ ™Ÿ¹Û§vz ÛÆÍp"5ØR êaŽ…=ÚÆß,Ýf\‡Ëî*®Ãc‘3ŽT/nAÓZ6ëEI1¢¤ä±«X âõ蛹Gçç¤Ô¯d…ÉãWø¨ØóWKáiõ‹ÉS~ -ˆ²"H’¤Ä T´žÙ(c|žë—ÌÍéýjò¨§°‘¤%Ux|ìk¿´®ðɶ-˜È´žvyÜwK É å«f–Ý5\‘F}[iB DIp²‰ìfg35°;<”s×´iö€°1JÓ-èHÁîT\t 1QMˆîßI\­nÆ€}c‡çx‡ÙYÓ°Co+èæ0„íÈÂ,O´…Œeyð#2°:ë•Nâ*WÐ/éÖ ¬À`ó«3íUêLÒ9Z í—yÑ-™Wó—×:ùW|¡—'¿“ɧýÆ[´4VÆËš7ˆ%Îc²SÞ\Û;SEÅ;O«çä‡ðóõS„øÙ¼´Ò´3n­–Õ×ýϹw8ºøùoGîíõ¯O O‰œéÏöÇk˜}=Z½Ipª‰¸AãÂPfÕküì½¾ÅÎåQ?ãô¹Q+öþžÿé¸Úšn⤅< §g¶ñ½{ùøµÂû/¹»rÁJ ¨> cHš”ù2£]0›pÕ[‰¾Xð@»7jBƒÈjwýt³Å†Æ5Û4ŸI.yöÀ/>fUy™C×KÎ%ïÄÒBKkó-r%üÁ’LÆ´é®–a‚)Dà- ЄòQ¡>×ÅOGh#Ûk«P¥IñÜ]8s€<€ çߎìïwñÃU$…6ÀŸbµ§ëD9 ©ºÌØ>ÎÏ@´X/Äys;«Q'ûøþ诛­ ŠÆuQ°Au››¶c›{Â×5ºL‰± 5ŽëH[Îðö³Z­]nƒæNž,ÔÐu|=e}O€«Mx‘1½=éÐXÑ‹äوѢ˜¶.š{öÔ´Äñ«å¶Go×Aü&(Le±l20÷^lä™»öFÕoÜÝF"סt/éïƒ[á` Χ}åÛËÇÌÂÚñd¶òiꊶ•}K¹ÆfÞßËw(›I;Á0zRÀµÎ±xÏ8q‡×¥¨Ÿ4!ù€÷};³òâ,°k û:·ÁäÂõŽi6Æ™§V‹ ¾fº¦n­M”âeãN=¿j÷è¾~š]*‚D´†ñøÇöM÷jG!~¼°5 ÚnL&{G~…ï½úsê¿+a Ja]ÔÛávÊD‚G÷»_Èýe)„³>X»‰£6`#`ÏÕò#ŸHSY· SÓ jTŒ}eîÕiID;€8¤„˜Qb ‹$R‚%)B!X®e£Ç5dHT¢¬d¥h,E‡­aãÙ“|ž,3üyksÛÊÎN¬aѮƃ¶Åþ8wø&$XV5ØC‚·«=CLE<„ÐQ‡†=„pà÷û©ë³“¡9Ï{™ûí¨©E"ºÛð°…,JBnMŠË‹3âöˆ*©¸Oÿþô?^³ê;?3xaþý²ŽU,ûw¯ßkóÇ.Í+*fÕTçs0\"5hŠ¥ÕÞsƒMª‰®cP(PŒ§|J…VË©‘ñ¡bIÓy¡g˜åã ÿÅñE™våó¥Ï1õnírRֺǭ!CÖ# ¤a‘5éZ™õN¯øo4ã.•±L!|$¿é(ñ¡/}n¦«ÆÝ}]“`>t MÞð;€5 Ð6±I”]"µåÆ,vÞ¥èb¤î&Ø­«;IÏU½v鸜0 ¥¥÷`¾?÷\úR—ô2þ¡òQ³êt‹¨‹ëÔšÇò{uöÊlŸçÛÞÝýN.wnÎHVR$”¸bYSdaéŸVM4>ñU•À̸±@ ˆöF–„|Ù«U€«•ÖL ¸ÖûÍýÜ 7é³^óÇrÎÛ\7=¿Ž—ýêz—Å2ü<˜Ç4]š<>=$k¼¹:°®pÐZ½‡6Oßç.ù²Zòù¾ó•>+îäÛù9:ýEòÒùnn®s,NPAcúwd!P ¹Öšk? ˆÕ© 0SEõ§¥dÚÑ! Pf­`–I'Û¬2QÙÂ|;¸x® íØBw÷ù/̉4ÞöÜN™K÷÷£Såã^¾†—ý}GûWoîŸd—ƒy¯oI±Í~˜ÝcÊõáIF*‹*èŠxŠÙ⡉KؾiÒóÏ­z F+Võ•Q5)!R0r4C hÅjC¥1Â8@J®±[JAMâ¢VÆ'E蕱̀ï^à³ ‚)›Ž+ ÊC¦6nÆ›—¼6S`ËE¿ÃÎŒ¯ŸÜ,Ýþ~u»¯Ëäi”öD:sU)1‚ôn±ì7ð\­k¥î'íѬoVÖ¥oµÃOÝWÊi4ÛÀÂê A½X®áLM’NxoÞü2ü[þ œ¶Z óÌ®ÁÈ^·ýž=øÓœ«/¤ŠAÊØ)=MŽS“¸P-ªïIÛtÑE åA0Œ*y¼Š[¦ƒLs„­1Fxo3i¿Qm¼ßM±ŠT)Ä!4Q•)$‘CÈá¶å½T ÀºPQ'}Ο?ÿöû²}Žö“ãU±fcÐl#·Œ‚!ÙNÑ’ØF¤J˜I¨¶<6Ö{XÎ÷5À=jëB Û2Ì 2pŒåÁÔ8 ™a‰äÀ@i!ý:/Xe +"DFhîðvæ­æØzƒ–5»ËÔü0†ö£ã{q\äDÊ*Ü2ýkf«Ó•ÀR#\mH"P¿ÐáTªpYY<)BjÌð›Å°ª±bê}'ZU˜eáØ?3 A&àd ãèu JÎsœ÷ÿ?özy½N¾õ…F¤:±:l\ò¤`]1PÓ²¥¢ÚpõEMnHÀ­ 5V×àV¦æ‰Œ¶Ì‡wÚߎÞ9¾ÿ«üÆÕ¯®~)‚–uz ì‚ìÈ%¸5É•\ˆïîV¿ƒ€VXcôõ ««HýÞÆz)-h s¼Lâwüã[g~ û_0ò1æË:˜& „1UƒÆÌ‚ùÚ2еÚsÖæzöGÇ̺–ªgÇs/súZ`“¢ƒì¡-Ý}G(XXGí3Äî<È!‹Á¬x*á U \ûÒÁ§k3Þ \oû¨ÂñkÈŠþúð¡þ÷y1GØ¿u†–Ö¼ø÷«êMˆÏƒæÇ}©üÕP,WEt¥ÁòP¿»ÔlŸuaXˆk?ãý6ßoûì“íMàõpZôÜZŽ4Så¢;šê5ZBaYi‰­¡•SÖPS i®å,ëé$ç®ÌŸR5«?c9ݯsÉZÞ7÷r;žóñùc¾·÷óÚá*º{­ß},‹Â2ýMý¼¶Ú1ƒzŒØ;6&:˜ÜEaã赯Ó¸B·’žŒÎŸO®€@" \[å9ÉdJÕ´P¬0 —ÚŠmwBàØÝ‡OñÐSõðŒg‹ .'"/¯qÖûhS3§€èË,Á%`†%Íw"(³ÏÂxÒ:#¤ùûùNü€L h¬(ýÓýüy=\íµ·3þ阪ÑÓ —Izb{A¤s¼öö‹:¢æ©“ F@IAbP`q…'†—\d6R& ä.5¬Rz-³¦ Ïø®§ÞåœRéìuòïIrò~î+ÒƒŠZ‘‚¯Ž§)H5ãfÙM]› 12m¦¤m ,1œb„$ C/kŒðWY}éþô÷„ƒ¾ízÚH·QYªæs\æô¿îµY—UÍõ¹¿=3ÊÈÂXQªUÝâ«­Á­>–çœ{OëEÒÈô";8Ÿ[Õ­z’CñbVÌd|¶Lí1fYÝ@‘zNdG::äbß@êû |~ÌþÑê6w½FdÙ&nQY¡þ3U8L6S…¶k¹÷[‰¾,yœAM¾Êis÷Hƒ¸ì§ß1æýçUoÂ*!'B-rb&laÚ9ö`&{h´èzÛÍð¶ŸÜ·ïµû›è9vm^–á‡ý¼ô/ôõ¿-Œ#ÁÀrÚxÛþP‘™›Ó‡03Ç‘¢¨Ýh†Ó¤8lpùñÉ@Ü¡–1!‚yQ“mèÎ{ÏÓìVÔ: „6-Ò)e³èIŒŒÊŸë~o?Žÿ×çÿ ãß{=VñýôÈq&€„@2&&½™ÉN¼Ïjµ' ­Ê~ÌÔ·x#ÌÞÎ }Ò*oOÖÒ´sHÌi8¢ëDŒØBVÌiœƒ±G¡ ™ËÓèÿï9É»9ÑÞv8庒3Ù37VÊ{?=ôãã»s¹|ÿ¶ú»ç£×û¿}]¹.}^÷}:\=^x¾í^d7 ÖKÙOßïÏN1 B’bâÝûåÔ=ULCkûÍÿÞVjòÔ9luEŒþS¾l}š<@ÛHe²zÿè=ÿüiHˆ/Rv86Ø& „-N1±Èî]qôãð¿êÞÊ[<Æà;CðíÐÞgœUãΔˆ‹µqÓfÄBãpŒç©äÅ·RFĞͻ,ë«òXZ@KÓl`w=pÑ żaCÝ­óVùÕ4—#ùJÅÙÆ>íÄxÞ8ôÏW>Ž£yCI÷Xà`€žhï}v@h s}y ¿OÜt¾±à¨Ú7ÿÞ¼ûÌÿšâ?Ž–—?ûŸíW°õ hUp#íÍ=Æ^.'S ¬Ûí-›~¾áë#tB¯­¾w,Ö1-¥³¡à ˰¶m3}c_3‚åüQÚK´ŽœÏ“ºÎ²êÛýò}üÁÒ’¿Í+2Ü`Ÿžy¶°Ã‘;«½±¬v¤Í®Ög<ÚøswÝõÊ"P7ýù]—ùÞäý؇ûèOòbSdhù N î²‰=ÿ8±á›tX Tl»–ï;a¢$\f5dƒ-°®Œ#Fòƒ˜LoðE%Œê(PŠï–ß8Ò²àªÜKpRtð„ o]óËŸHµ:œÓš„è9+ý(ÿ½ ß­Fâ£Μc§ÏÝ‘âPmb"à¶EøW eYBú4&õ¦‘Ó½ ­³–å’û@ºœMi â  6p‡î02 |@â gûr`HøÑžÃJ)ï(¥ÎBÑ)`5†H schøn¡änÆ`ûBë+p†„ -ÐeÄÉy×Ðè»­æn.°W]„>Ýú4ìãÌ÷[ÒΑÈÈ­Å&ñ>RæÝ2Ÿõ&ð2¨ÌÝÕ{âïŸþ¸3Ë-÷ÊnÇívXöèãï˜BD1·ñmz o¯%3ª+ç¯#ëö¿ÊþÕ¿ëkýù©ÕÍã¡£ù¡pZ§ÊÛ*ϤQ‹×Nf–¸ÔèÞ‡ê8|ýÁß[«xC.8`õ¢ãÅ?mš•XÝòëç°ëïŠ¢Ô Òîòt† ‹ŽLPà‚G€l¦ǧ'!.96÷ °hµ@ÿÐ §[s·ko¯zØZè…ŠpQÃXœý¬ =dÚh¢›r ×·Ùdnã:Ân`Ú¤$W¡ X€©SòËvKþóø÷máØÞÄu ‡%°­àxä1“AËã§6«¥5 €EV¶ŸòTø@ ´,3Žå¸{·áýÛÂêó™oVˆ ¢[$•uoÜ9)ùÙàváom×µƒSrëU²3}ïÚZ‡K\F…´ßîåbs% _ÑËZáÁñ…‹w–nZ…ò('(@.CgÖûS°aPu†syÎßœxêýåë›×áÚe?¬ÂÝQ„ƒp” a=î-;Íåäu{úðŸ ]X#· n ôrˆáÁÏ=ÙW°2ŒÚc?âxžóû ʶÓÐH”Ãˇ’ “ §DZ¦qU2â}o»\™õ$)au•[Wx?¬âš÷Ú·ÀÎÓ»oÄsÙ}NôèK2›7ðéVí(ˈ+¥†Ð¶¨„d–ªÑz4z o#$D´ç;V¸4©]å}eQJâ[ôkݔۨ4ßÌÒù^5aNœšÔz””ûÅkPƒ £„!Á+Ò³ùœ(]ÎZ”ûÕå~ÍzÎç±dÊ)“>™†1²,B€T˜Jœ,B/Œ”4 °[3©à=Y´¡ÒDÆ ¹jÚ¢å8¿žÄiGÑ»×qóÙ½×:ü¼^+öÓШiØqBÁö¤3à·4ù@w¦ €j›]\Y…‚`Dbû¼2‡ (@Tž¿©si¿*Ó˜öô3øV-»Îñ¥E+ä¹–”™ŽiŒqò¡Âú®K—EàzÐÌ0總á\g/Z:NoUÞ¯Oú2‡»pf´,f‚;}8ó-Géc1¼eAäî¬<;¢^1 ¦Q%ÙåMVÕ®y‰±l%S±§ø(Û@/à•™˜ žó¯°Îûkhý~t½­·P~‹—ï9Å:P-V ´oïÝE›¡ —²•¢aPZ‹Â¼æ²¬D2¦‡>þN¶æšØ‚$…B,#!ZE/á_w´K3&ô’«v+é$lµ*Nï>nÏV4m‚;“gJ2‘ 9^m¦†´AÓVƒ äj=`-´o‹œ~¾~Øåf­¶1Á®‘KAMøÙ§³'Þ:Ÿø¼¿{Óì¾3»¯aQ-ŒÔÕ-º@º*(ÚPû ÁABa&° @^ì(†„ãÝâă Žjï‹ø¿o/¼öóù¤þñ¦©`V(u£„¤0¥shž9Œfe°Á²ºèˆ2”RNŒÄHÏÀõìçæVEœ«Ör0ÛSCênýÒü,õè"¤Sƒ÷–«ÎšU(T'YbHE’Ž­¢%¡B™pû WI¦ºÔ@˜” ­ã“¤ƒ “[½Õ €bqV3œN„û-xDtG€ Ñêx8kÞ>mh9,£&ˆéT%¦‰â©Z»mú*WÖ¢ÏêS=eëq?,?ªg}Ê{»Sœ©º ¤›ó´:²¯Ÿ¥w*t |"D?ð5'{®CWV‰’Õü´¨ÿ¥ìooç¹{.Û~®¯¢¡ìL¾kù®J£Mn7©2UZˆ~ TãžÞ»ßh” såâ$›tJ…¡‚DëÔòVPI„ÖEA@âJM1¤œ5ˆ’J [Ø­B#r›q±—Õ#_ØÖŽãâ5ës_pÆûçsŽ>wW¨Ë«7ðçÔ"}Átç‰@Îr‚ÎÔYpñ™5 [Ì]:moWçœ0>V@n¿wÖ ŸßyøK+BW:SdTÉBêÑýe\Àh`LRΗU¹ÿ_›ÿ›$.)%$h¹vŒOwÀÅÕÉ4"ÔOÿ.’t¢èQˆwÀyÇi^öÉpQïaÜeA3¡¹…8B#§=JkNò¼õd/‡›þœÌó‘0µº‰ “€`ZÎGy- €AÖ¸¡C,-fútò¾Þã¼ç´çšû™"„´F--‘«ëœ’Å`ÒÉWR§¹>Þš¦.ôZÝûåð»!ÖqaÚ^Û8‹ÄÊ(©²ºŠb$?T6 áÕ ]  VHÅ^tÇ8`Ûùdõ‹¯¶] 3°åJÕB«+Æ'ï2We…P @¶,ÒlC1Úp1Òþ(*϶žˆ^ЦNN IIä‚iaMË98Od,Ÿ†›‘™¯’ˆâp”/j2¯¤&UQ]B)ÌìÒŒ'ª:ÇOß=ŸJ®+úƒYr§ÚÇ`G0ÑpâÒ¿"#sH×èk&<˜‚C"3l·¶Jâ"çŽwú9ãÏ>ÿ­ýû§ZI4=³asÈYƒÄ†½Æ¬'Ij)%àø¼7d>М¶W‡×U­Â?в‹•Ç•ÕÁ¤º{N°‹i±8Ù²‹fZ&•U™!È,—0ÈžzŽ»¾„@¡5÷²¦Œ¸]*VÀ Š 5€½&0…‰Y&“Ì%ËF›·«9Öq håù'A‡×„u}³þ‚w2U]ÀsLÿ1û~îýæÖ±N”%yƒq.:œá>Â5;ö•ÚÛ¾Pt V/¾©á“Ûj+ï¯=×8gžuêJ[ ¼íÚȑܜ¤5‹ëT¨|L:moힺ*]eßoK H’‚þ–ÈP_iÙbkÍ5 Bè€ë2ûœïSf¿OÐÏÍžævuŸýéAϯdñÚܯº}úô{Š’‚iHŒªÞf¡7/"]QÂz÷¸JÔ•f„¶ëyÚ^èjä!Uönñå%¿ƒ¸5 ±½ s¹ ¡!îiŠ€˜Q¹1¤ú@ÀòP…Ê(ú>%\&z“çZnz˜f"È1iG$SvT€!­¨Á)W“¨wÉQ·cÀÓ­¢·¶2oéaô€?Býè@ôGjÌ‚¶ùëûÜŸÚ½?Ÿø·ø\~p›Z<=‰êX콺ò­§°H Eœ¤!Ø¿GçS‚y¦ÙÒA¥‰Dj.ò>Í™’ßší„›{j[ºæï‚½éÛ2íÂä:¸ÂL«6T€Èa®ƒi%›yx¥²/úudQs@„ÒŠ+"U†"#'ð—N¶ÓErf¯€o£ñ÷X‹B)ðWz4ž,˪¢üÕô’C‰LF™#f#’R¹Ï²LÎâ ^×gZi} ‰Ym¼nùÒÙ ‚P¨ /pLßœXª4qÅŠ–”ò#èîoùù¡åÓ‰ºA$(VrQŒ0¦ªúxaLé(@oΙ/o©§²Û3€“ú@¦8L2L7dú’"°K¶gIˆù³5nÕ·•×ÇÆÇÓЧA®†…ªÐQ@T bäNIØ4„Œ CM;ÓÑß÷ŒdéoÍOVVômýŒw?qüÏgòj¡Æ˜QN@áº"}qJßÐéõ‘µ9ZLü›ýñ‘ñˆ¬Oú—é¥Û~˪Î= Ìͦ5°«Xê)Úç‹!uñ<(eƒ¦–ØzøùjZ¾³É.ÔŽ·Ä®œÚ:w¾ âŒ4âk,(žAå(oüºÐ5äyª:Іs·V;WÛ/sô“Y?˜?†¤ïýŽ ¥>ê‘ôCÔÍ JeÎy„ŽT˜kO]Ñcßoƒc.¿~|{1í¨I« íGþîáodre7Öë1¯™Jät~düÃü!F~y5¿ž´Ûç”h8€øå¿ý!¼šGù%[SÑîu}ÆÑ]µœ]¯9¹V3hOÐOŽœÓH ¦v¹t®ÞsÚ×;›q¢çôëËÕ—ÛoE}cx " @A·„=¡:.ÌÌ8|{—Ñï-´ZjO­ÈSÅÎUˆjþP9Z (™Ë™í2é0¡ð<Ÿ¼v´^´iŠE#a5’Ù¤˄ ó”Jðd6`,Mûè1túÌuF­‚«s<}Û„æ=Îýñ™m&ƾ(N4ÁáÐÁÌ uôð]V;àËT׎b‘©t8¥†­ŒeP¦Øÿ¯lü.öO½ñæõŦ*ƒ«¼ÓB –ž§Y[ûìÒÌ¥/Á|öçÏÜîkRb%‘‘¨íǽÕ)êÅ´ª/ñhM{hªÚ½ò0 à5`]‹ñdÿÐo|ÿe¹ÕRíÞátýwßáž½X>sA×ð…ê³âe^ƒÌèÎ2.Aª=^îÏŸÏrBï)B™/!H½S|Oþk…ßé¿oͲnÿ´o²»X A fùL ¹qÁû‘þG~MîTrZ C [RðŒ¤,A£x fh Ò…ÛšòÛ=ã´âµ*U'Æö«%gQ(DÈI4O“F®¥=ƒd‡híZÅÑP•A¥Oc/¬À Æ‘Nh€k¡ET 0( f3‚$  €–C8KÀlÀ¤¡BÀƒ¸ØeÐAtÆÐFQýÎÑf"lJ¿®»¤’C0`ߢ‹q‰m‚¯¢“-¯&ãcÅØˆËÇ:»e>v#4¯j5NSLM0º(–2I¶ÂNÉÝ¡ºg[%N^öh«üL¶§¬ðJñPdt±Oi®—S;äˆb ŽÑÕÖ‰a¢7Ž„©éò!n<ϺêöÉòÿµï¾çJöË-:´Ó|¹vlVµ®úœhkì0ƒóÍ9h´ÛÌã/©±q!„ÕʈØÂãÓ?JÜ2´À™ûÜ=âIÒEKðfú—‹Ã_êÎ_#á›?Á&8|¤0‚U%' ¤Ç¶Ú°í ø´:ç}’ãD`ulN›Wòú ~äï 7 @~¡n¸û²§ÄÌ›a e„&H @ÌÌö™ÁgüÎèMDÚŠ0`a% =€ŒÀ,ƒ HD*X—æ¿ÌY†».÷×¶ùò¸=»txꚃ+³ÏðŸ^:_nø7wð[ïõöxúCßñ™µC¶(ee-n1¶®dŒò<(›¾-ù{ìiï<¸Å2ž#£Ñ¬ýíŒT†¼ý›m#‡V¢}gÿÖ¤9ãµ™ÙâÆÇk– ïæ^‰Æ­÷™¤½ÚN»h•=áPöØÕµ@1Û»ŒŽ†‚R#DSaAÏ·4©8â*(.­Z˜{vÙq òó]!ÁÛƒú$Ï‘H® èôDŸ<}Å__y龿žŽu†þùçÏuŽD`Ð »'»KVÓŠ `D.’%™>‰ð $&\Â¥$¶æÈ'?‚¸œBtc©X” ià” tFó3«ßy7î×MlÛûš‹ä4bÂÂX—aõÂ|Ä&sEϤ³½|¯_>Ü„E¸ª]r’C5¿ ¶| ã…‰o«v‡"XU}4g4Å©l5ØæßÆ7:å1ÄXh!ø@òÔ¢¦ûð1x' é^ å1@xîHÆTJpƒyŒQ0 tȆÀ(€l6Àáxr"ëê„fEÁp–‹á}«'öWf‹T‰ž.§ÓM…Û=3-® BmÖÏe´£G¸}ŠlT!„gôëHש»™áýÕÛñÚöë)KÀ¬®$ÐF„£¹;÷ßÛþ ¥dcØdfa#ˆG"h:Ÿ$“,a„]Ï9aúõvy~v&.gBœ€;A¬ž_ïü‰›Ÿ<œô¿ÜøÚõ•«˜gâ3‚0ËIÇo”‘ "ðÖM¡ÛÔvâ‡IA²­ÒAóˆ2’P€”è–Jo™cë†}põÊrKÍ[èÃð(³â¬_âüá¼þÔgXßþëµ÷æÓù¯Nê¨^P˜ÐŠT  I•ùܘK¡X³ WE`5䃔0®KCÍ;¹.±Ä ¼BÅ€@‘`C‘ u™¨`;ª)o:2hA’mü«5Ž™´¶óL¦,`̱£oìY, Ê‚VcPœkËh¹‹üÍ™]4»‘ °ÀCpí0Œ§Ö~?[ËÏ÷4×ni´‹ë ^‚ý@×ïǧ2AT,Ūê¬mEe¢’AÅ'¤ZÕ%«Ä C I…ML1á[¼" nƒºÐƒó7ù~вîås›Pûí__Çï»™³à ŽjŠËsh ³e u¯ p#LËD½"×zŸÌöy‚ÊÒQ}Ç‹9g—ǵùVè`-'ýfëÎe9NS% {-“© uhh[7…+´ªª£Š@ÊÏ›PÒõ42,6œaj€%€£½É ÓžåÀ€äŠkl‘ÕŽžš‰ý'sô4€@¹bH”GˆÇßÙzQEôšmJX j€EÏ»õ9Šâ±g‰F6'—ûÙúú~'¿X?¾ý¥yû³.Õå‘'ʱ]”ÍíÙÈÈMx¡žµ UÆÕ†(¤¯ë–7ª¼–]‚žž­ç)ó› €ü Ο|ÃßÌs_ìKçxu§]ðM[çÄæÀ h(ìê6Zª'TµóˆÐÈ­p#×ÓÒ\„¦UvÝS@áÔUÐ`1H!Ž$ÎÄPÆÌ‚â" ¶ ¶+`QnJÅOi½‰ë^EnR"…(çÒ2Óöθ5ùåÍÃýŽ\<— r†]ên‘v›[­›´Ö®·mÉrëd§T߃oû8ÞnÖ¥@þwñ˜¦ä²}Ýû‹ì‡õ>%õ"ß~ãÖäöÛÎü2âÎ5`¸yxæDBˆ©.\Êÿ¹7l÷ÿØóƒ²6$P¼ dÝâJJZˆ:ƒPTqô#!S»ÐíšPN©qAW€Ö6X4L < ¾‡LQÖ¸*ÕÅ +N‰'™Y:µ&¨ÓFÆ\„ÊNצaÕ·¬ù¡Šf#´|ð¡AmfÅ3û8¾Ÿßá¾½ûïÇÁ8«º™j™Ê·¯P›ì8:Rd×ø¾°\¸7¶tf÷¥ùU_œZWqŒ±EEˆ|E6fx™&‡G)ðƒlrxÝ-u…Ã-Œ/„¸*ðòòLr$CQŒ˜¨U‰- TnÈSgïu¿™©ÚŠ@IŠ.ÇÅ’e {)ö„çiŽž…%Ê•ºJ…ê~€í؇>E±8_¹»ò<‹Þb3,° ßf<“¢ðÈ¢GùÚì¯ûç+£`X'©ÓÎ;˜éÔdH‚" ®=tWjÉX:E÷ÉÈAr&Ç ]p¿lå•7óùwOõïó2n=E£p“¥À¤½«ÒÈ¡fr{ÈQÙ]TO›3‚+Ý?ÕËf¨l–»½( â>¯VÂ2fT¡B24ïL#Ëòqa¨˜‘1æS©”2•I¡éé´d=ÃÎa£ÓvF Mj¯oŽ•\ç4¸âˆõˆôP(› vibŲ”¶nïåö! ®|¾öÈjŒ–ZŸÚº€×G§6}&PjaYC•Ÿ]÷ŽÙ,„®œ–˜†ˆg/r÷ݺ½Žõ$6?ZÐÆÑÃaq ù2Õ¿”¼]ïðzvÝðgjû!ÕÛä’?g¸¶ö¯ÔÈÔ[>+C¼wº–|t]:-4¡ã½â®™þ,o÷v:ñÖ›ΟçSçñ+|ŸÍmÒ®×Ýo_™sëz³;qÞ­ûËÄÁÙÚË®ŠwœAæ€L¹‹Y/ëÁzNµSmUóxêýù-¿™QÔæqeËØUØIaY7^Õò–•gXäG@/œ24$À,UTaGÝV|Šp&ÎÜù™Þƒ 0h;+T)p9ºpšä‘T$¥uaëÉêMÝy’BÖÏ>›§×•µà†:±e Ÿ®kê3vJõ7<øöñ8îß‚ž£¨ýúÝÁñ¾÷ú¶X[DM¨SrÁýë÷ÕCduøÜŠ A` »äfº­“øÈ`ˆÄonoÓ«6¢ÃË—+ïµs[ ÕÐf‰Ì[£Bi¸²`­”•ãXÉ•3[ P뱆gQMv5}; PÝfXÌuCè W8lÔo ¨ ¹†õ´Îñê~6Á9û.;¨¨X2fyC|)›`a¤^y`ÁÂÞc¯«†Þt6×úH37öµ Ó÷µðHosÃxí̦!È)“m‹Î:b e§˜XÌ@:§ÝÈmëõfƒ…q-èùt¶®e3D:_a¶o¾|íÕÓ Ù>Œì­¢LÎÙ“éfLê™kóî—?·LÒäL™j+õÈ|˜ë÷^…_ilŽë•*¾ô´Ñ5»dÐ*"‡øo¾”‹‘B6®ÿ¢Êo>:<Óµôó$îýëwßï™ù//­…7?)å2uE9àªYš“Aš m?ØiZ"œAúbÚ œô•ú ¢ÄuÚ‹>ˆZêÿw•­`•ÜSb‚`RJ€zŸéÓ¨«&1‰AZh÷9&0%”F@âý±Rˆ7Ru87r0Rt‚•Saxeé}V¶'›FÒ+åSÇÏéU³Åüø;>çËkÐ×-2§#>µó°i›Ñï¦éáu’Õ­ìô¸`Aa\›JVËaÊFÇJA-Ã!@i =Ãì ¨M³ªÚ—¿’‰ƒ2v µRß .Œœù[ì›&¥¿>·2QºcÃ~p¬ó9 ìv%¦ í³KJXþ“­ŸÚuÝFœÀuEóÖ®áKÆ*'µ]õ@7V(ë¡Y÷±Oü.“¸‚DÔÓŒ–®¼û±o/7^­oÐŽi,%öLÇfgFF7¾sYo ¾[¥ô­=7.k—[,j[¥»÷¸{ìXj˜Üí¡ðs¢j¿’¹³°mñ“™ ‹­g(>ÝÅc&wË,m“w9ƒ'5Ð&)S¥ 1uyYíDûGÖâ³Û¼ý忨¢$&̜ާ|sâ뀋ƒ00…Dƒ#Ë‚lžù×óù¿¿_0VÃW§_.È£Ð$[Dßý¿ž(œk‹ ÊwmNÆWYŒç ôÄåõáŸ%/g/ÓýbåJwm̪«mÏÌ-qmQlánÄíã„È–™Ì»fŠ:PÎ9Hï=wšrß eäã#¿®(íA4®záG"³‰}óޱFdÇ/a‹ns>u›'–•ç€bw‡lZé.³GÕzOûÄY–‡Kñ‘4I2WSCä}eéòõÍ~RsM¶&™p½/ëÇ’^BÖ¼¼FœzÉømõÿj¦¬·¤ºW$Z|a†"BD—v5„ìÌ™:Žãv$š³ ×nçù´Ží8 D Í` Iœ9,R‚rM÷诫þï>Û½ã±Õé®™ÖëÁUÃp‰×¦É]M7Êž® â«|> !&Þˆ•j5hNçUn%$äè£×L˜7'B°ßgrƤHX`ÛD-Ìâ“w/~@xþ¹Þ¯\¯3F—½¢#(õ&çÑÄq“Þr¤I87Ù[ί÷TcBQ2«¥ªÍCσâG±»êLHŒ™ôgü²¾šÞZ 6²¢ 3Í2Wq^S¯ÂDªÛãvyƱ©(ïÌÏ6]/Žöîr­@ª9QEnFL ¥Ÿcšóßöl/gͪ?‘àO÷þ$t•,SFZÈè 5Ê€ÊÚ~iéå¯{Œ5V‘8†Æ"ÌV•ãÍÉîÙ Í­  /·Î!Ž¢âTE¨Í´\½Ò& ^ë&t,+ð ›Þ˨F¸'þ égñׂiÏ()¯—%J…k€¹¦¸ÞÊ‚/Z!È+ „À–ÖB»7ä…Óµvº’Zöäp5\ü)ûûý˜žÎ‰ˆïSÿͤy)…½ÄE–*¨N ø£FRQ4õš4¼AD¥ÏüiÇʼÒ*tuÍ}ÿÀ×dNÆ­Å×ÿž77õ¹äœ¥ñ¬ˆ–‘TmÃxT3ÛÔŽ 4å÷¢=½‰WÔ©ã_ГÔUOßx•˜9bO´Âý¼Qžsitè4²`%ö5FHˆxJ2ŠbNLÇQÀsú¬C ¹"Ea@ЗµXH1€•‰*,Oa‰=¾q(háò“wòâ@æ’HkJ{†”°óOŸü~ìô¢÷_›Wyq˜kÔ1þ;^7Ýš‰“óÖx ÎÜßýžØëþóñj3mý‘km—›Ì$èf :”¡0¬™Añªèã Îügiÿ™ð¯‘C ¬‡HƸ¿ÈT,þSšÿ®å?>Åÿ&ôÓE]TIïáÀ0ÄIÅÔ¹-²Dq­Ûµ½º]¦Éö;Ì£n·Èéæ P ") ãuƒ Kô‘§cÑBT:³¢½¥ d#J0hj 6(‰hì"ˆŽHW=…e¦ì5­Ž%´º¦’É×ùöÒÙÈz²?~ÚØçŸ Afª¾}5Xh+BÈzíìÄõ. X|Æ_ŸJçõ粎I9Ž›ƒ¹pɱK›¯ºˆñ“ïæknÐJ@d@±îùu¸Ï—¿ÿkëª&C“ë# Tá:äØn.;h.T,k,!-5›Þ¤6öê¶*ÔŒ¯Y¥0 k°`aL§RE3©dúvêJ’ûÌ"®Õ;¤ï€ûÙ¨Ï WÓVLºÓdM{×'%`øj;ñK×9Ñ Œ¢¢ 2ÂãëŸØ_÷ØM}5CïÒ+¬† oŠmŸêF7<Ó8Õ¬Ýïú¬µúÔËídf×ÓóýÃ'ð•¥Í$TF€‰jzË©mÍ'¶ódŽEß¹N ܨÕKájV„à¥3—.\˜<>ެÜwð;«§îêâ ÁÆhÇÄ­Å: ;ÍvªH§!}^ÀQ¹‡Ú`Q ˆ1¯,]ú¾ÆÔ;NoúË`Á´Ý\©žsy¿JÕÀ5JÚø®Î‰Ú×H9“O#‡µ'?VƒŸ{ïWÃÔÈwëë€å³{kúœ°Ó5-™vÏTóTðJÉAV‚Þ‡R„¾Z 11êki_º]-«¶k¾Ö<Ïqߨ×ö19ÏÇÊyþö&ýýI[ÃCeÁÔ¦09gý0ènBìèl Úò—7õ— ¸/êxìÎú×5éØaN¯{ðoûò—×…ÂÄçÉ~Œê®lAžíX§szË" ¯CÝÉG®K”˜|T0€½ù°‚9œìÖc–@=1Þ§¿_ûw²ûo±(aså é2ò“3ˆ`"ù* º^•¡@‚Éb6œFUR‰ÅˆÄ$üˆ|Ÿ[ƒFí>©}ö}KkkÔõú]|ókè|„¼ùwéL¶€ Z€‰¢¡bàÐ=zèÎÚ:2RÇvg ÛÙ‹D€©·ªVÙòܬas¯r¯®fë2¹»9T즥0²w9fƒMHƒ¤†™ »ø˜¨ê+°éaFbzÈ„”°@IiÊ¥lÛôTA(USŠ ­¸&~žô{Ú˜1ù²”¶#Öû ˜¥ÉD2êdW:ž MPóZG1ÜÕŒ@#^ ñòÊŽ"c÷4*âS. h,/*Ðéîʤ‚L³ÛáB¡£¹KÔèê®E:ÀX‡6ˆ-èT\¶rYiçÚ\¶[*CK“8Œ<ðÊ×q>€ ‚K¹§‘J¥ñ÷ýƒÃk~¾ç½æ,:&U€5Ò‹%¯a4$†X6ì6n¿õ££L%Tù¹?÷·R¢v=Ç2¥ýs¼¿µ•–-ü­iHq˜Fêb¼>Œ“–¶3åB_ĵÅOù“k©ßPÔN‰ß>DéX­XöpíNFÒ¯W9¢­ëmmo½©ýÌHÒnÉH×6ðvnoïb‰â̼ç[Ž_)däL¢åûwBÕýÂJ¡­%ú 0d•tTïS ‰seEíjg¡<~ýfnO¼ÿv‰ûM÷g¼Ê«ßÛ7†°Â› †ÌI>êŒc‰»$çý|m*YŒ7ó©ãõ̓±%q³wë”&“3b½nÕÙšûé®f+Z „ÀDeµ‘&Þªü{÷ªýΞwâµ>>DìH3©ºöî@»’ÎÞœ ˆÝ`Ÿ&<•'²‡ï¸[7Žéšê´¯ºgìÐ73˜<^Á‚ªk⺫' q®¸¬’œjLA×e“AŸ˜=®h¹¬êf䃤£Ð,€ä»Ð½bYÍNUÒÒÔ6w]³”6 òB»8Œ ì¼—Ÿà‡±tbÒí.Už\í û5ÃbúWç®F™Vu•»oÚ Èßõ›¹Eõõ‰#”ûb/‹ f›F°Í!§‹`Z˜êÊx îKÖïU¯Ÿ¸ïºKâmíoN­ÁÔ8Ú †ˆ Ói×»»)n|QD R{Bb­6xŸ"rè.¢¨cJ¶¤t4æŠÙÿnþBçÏ^‰Çäl‹Ez.ó#ñ÷å,uøí;Õ3eJEÓv)b—-îÒk~@8F¥ÚÒØŸp¦/’6Óµuª†žz?ƒ>"W*GÊŒOª“wl?6ü#àsi^¶€@Òm¢P6µ“Úí+ORÀ` ž4C4äVl*™NåEs0„‡ÕU†Õí+÷’ a¨JB"R&&06ý^ 9É”46¡¢Ô"SS¾¨ cB‘¸©žV E#Eý/$@#6JÌÉq“ihÊX9+%­î²$áÚ·  5K4%ËYúè]_Vº£DÃÂÍ®?Ѫy}è@¸ûÐÔjHRP ‡¼$Ì-T P—¾Á¡WK½o<_ ºh+[EzÀ<¤é3[ìÇ.ÁF2Kô®‘mÇÕñ¶½Údaõ–£}%ªúcû+Œ@ãªîÅY૱|ú±U7ïÉšÉg3Ý„[;p§š!Ò’e™=½TMÝfÆÂèt$Íîž™ö?œ^q奊C“ª=[k¨Ù½|Î ü{ÁCWæDž¹ÛφÞèfù§Aƒd‹Ç ñt:+ÿ¾ÎäqwäÎ1À\ŸÄù7Žëòœ'ޝ¿ÑîãÞjHc'³ýjìú{VKä—ªÞu ÃhÄ­¯°0¤rš£ûÛùí¢°:HŽ*!Å!·ñ·ê€e$µ P—M‹°ò×ÿëÎþ?C{©à‹XîlEH.³ËÃ=õ;£Óhñ½Þ'å«®µè$YȰV€•â0uÀàå#NhìoþGGõ‡šä¾¬¢ëe-–Ò«A:DùTç#¦îÝÊçoòK0ÔQÇšDšÚè%,=I‡¬ÒS …9Ð “~A´ðŠó¨zùq¼ËñÅø{í %,áfCXìž^m,]úñ²ž`ùþ7< R: iº^%G›OgŠ#6ÐŽQXh­ØõÃÅ×½é (ßH>Q¦,/ÀÍR \¬AžÉ 30œµ’Gõ×,wnÓå"[2–êû“à'!ÄG妃)¦q×Ãå3òjl+^ U©*IYÒöñA˜øUSVÃ*+u'Ts7z2À%K_"qök²½Ü?î¯ßž]m®|©£‡¸â£bf¹ÂÊš U.‚Ô °Öpë…@ÞX]7ˆ¯£’B©N™ÈEj„Kä¬ýcÃH¬¯Þœ÷Gíóõ‹íeæ|}¾¿µf\á-…¤ŠDduùZ´aâgà1”¸QYîC w7%\ª·zÆjÈÇUÔ¬ø%åas,X‚ ²GÎ(¨ ¬@H ËÁ2¥šO-Ö¥jÅH®´, 5O€Š¹„x$a0&ÀZá&ÜBGÖ©Ò¬¨M΂*éѹ‚UbÎÑî±!+6ÕÁÉÍãúpŒ<<ñ‚™'Ù‹ès{Ü8[í$2ØÖ¡µ‡5»"¬álÐ>&qoàˆ´°›-´ÑîËj–ò™,Û*Úe´#ý¹ü¿×ßy`^ újd;¶DEÝœÍ0¹ƈau¨ykõ*ž"RSɉœÕ¢¿Ãò½@>Š…‘9ŒvšW?îû½ZáI”«ë¯m‹Ââ€A9…@tÈÌC_«Ùõu ,¶r&’F9¢Sød%nT×Öäî$˜Ë–Øbhv‘[íÍŒÖYÞs¿7ŠKß?Ùm½†°ßœ?½ùõÏêëÍ/:üò¾Û”ísVë–¬6Vð\gÐs<ì ÕbaïlöGR“d(xÅŠ·òòôÛ^c~—AÛph­ ŒÓ`7Ì¡:ûB¨sÖ䂹—ËjK…2´GžÅÊ ¬®è,,Jë&Céò1Ñx–:É¢F &èhíHUŽÖt‰IsÚdªP²ò÷jr„°ÊÂÂ_1þíª®ÄûxlÌØ¤‹Š™ž¾Üø·ÏþW»<½!pJhâÕ¾ôÉŒ%.†aé9FÍá„Ô¼©Æ:{HLJœ ‡\Y´ÔaÜb;±Q!ÿÆþ|°ÿFÇBÀ´‘’ã8Ѷê ¨ó#p‘1ŽAЏ¥ƒ¬BæâarÝ¿vÕ4§‰©þ0ÌÒïwoIùô'õÎbzùKÇWž^~ï<Ñöx¨› PÇJåb"~ƒÃ½píDM5ã&WS´3g~;My©äÚT[  6u¸­ :š •¶Ê²Ó+µ’9ªs¯;}Õ¬¹•†¢ +]ÒFS+‡½:_ùÍ¢7ճЖ ÓyœER›A& ‘ŠH«ÔBYšçóÈÎÙãÒ¹úzíT .-U,²"‹˜1ÐG›Y¤½LJIƒbôáó¶´.áþéê<ĉa‰˜ÜŒs ¤ðW6ô˜;²9‘ ØÐ¡odtL* ½^^åQ|Ê(wU±7¡T'53 ä7[“fîþ:å· ¶ÙñG7åît s¥mLš"Åð?ÄÒ€dèæ“Â-{V)±Ý-ûD5Ø@Ñ9·³M þ!ƆϹHó—.7µ:ê¶ŠŒÿ9¶0¶A£b:Õ7d!RäªDbJÐÓ1Xy¦/§ZQßšá¯^)n­ê/‹£Ó+Zø=^·?þíóð×qëÁ¥¬JwÒeo†>#C6ðYVE§übX)4Í¡JÃFyÝ{€å}Nñ€òîÈðækŠAaö)ÉɹÍ@$•¥/7øö¼×¬k}yÇûšÚTÝ›¿qî#SåXx¶»Vm>ûÛš× œÓF )†sÙ3ŸÕ¬¾ÃlS‰`•ûál}ñГ+‹mwª$OÀ»¹Å¡ÍêØê£z•5Ó+aÑðT£7»ˆ†ØfŸ  ƒZâ5À9 ì¶íÛ^( tÈ1㙘M]H:¾…[ä-ðÕÃ%QÈ þEÏ©LlÄTÞýtöQK¢hY«²h •$—ùIdh+Û¤xÔ8¡Ó3­øOH††{ëW 9nD•%YO‰äZ]k'®ÙåTW·D¥Â)Á0:˜ÀFxPµì8±£ ÀDJ@À(2ÈDX§M )”‰5À&E\JD‚fÕBˆQÛøàt*í­ã÷- 'X\š>’ËÙK"ù&n)vP-ƒÚ?Ñ6xª¢@#‡‡j|¡QàV,‚`1M ORŒRÂ| ÞðaH–’DQ+pe ¶µ¶­Q¤ý̺àVŒšzú/bý·×yö6Ft5bdÃgÿ‚û?Ý|8ºë®’/ –„ ŽÃöÄbŸæøY!-‹|ŒkP žvqóÖ ‡˜_vÈ£Šº,yú¡çdRÛ¶¶)¶9刽ôÂŽ=C$ ˜Ç‚lzÌÅW+­sÃ[¿ý1Ëã°=º±±û”Ÿz[ÿ>¾YŒ¿Jw¾²ýÖך˯Ðó.o/sùXÑB¯ó&¶NÄÍêy»‡èà†KQ¶%8ÆIOž>;â0’ËV}EBÆ´åßí¶:Ȉ- ªÐ€Áy³xg CÌS¯ÉAµ#€`@|‚à2Ú $À!ðy<_DëªïØÚIï‚1DG= ;ŒÝør>µ}—žf¤DÑ7ø™ž£Á­¢ö#ø1Ò»§ìkqì ðî%Ü/LÏOª×ŒÞ,Âüù'Íìsêjtœ*¢ã¾æP6]eÍHÕ`4D'2¦ï¿ííQçÃæ'öž1TÅ+d!Wî=@‘,eŠýÞd'(ΣàôÇ+Þ}ü&üøãÀòøáô©SšGc‹ÒìE1—ä8¤È°“cŸ-H—6·¨VA½]ѽZÌ^>Q›2{ãf]®é¢@§².‘Öô11¨«š·oÛÁ]–³*H‡[¸ÎŪY,RóŸr]¹¯&nî‡L]?œLÍ9gr63µ¿L9B6ÍÊ©_¶)*ÀŒ2å®®ªÖ¨² NÓ˜]®V;;¡¹?œó©a ‡^Vˆ”(c'kõA}1¶Ù[:5Mê?Uê­:[zexsh¤œ³á­Á³~º ç[q%ùåãÅ‹«³ Öæ¬XÏ "<©œrOýµÆ.|¨œQüŠíý‚ƒI è#¯YÿŸÇªÆß"ãÏú,*ŒQbA†€šm9-.{‰é-ÙIfÿ‰/ê8¼ßG°=&Ã&iÊk>ÀŒŠŸË›¸´‡ylþú̈»TÖe#f¶%‡ ÛPXv×¿ä ¶UÓöêù¼¶ÓQNô;« …ÊļÅén8ƒzcÄÑ`޲n”¥ M„Q~ÍG¤a{ád\8¨R ¦Ë 'g«Ê%c;Ÿ µUš^‰Äê.hçu@n3Þ9imÉÃh8=XØéRyÑ„*K Ò­AR§â¿­jµþÝð{^ó“É-sHªk·n›©-ElƒÉe˜ªZ#Ju8¦ZdšFÚ«Gì›m¬w 2Ãý.sH"+ u=ÚAŠI½ãª‘¦°#l^ùU¢³<TíãK¦F–a,‚δQà†Zêfž¬V‹$&ÅÀL2h1*2 E:<ŒÊW¿Yš±HQ¸Â"O¾Þg\A'RÛ¶;™œ¥ZfYmºé«•9÷Õ5ì¬\ÁKœÉSž¶ÓK–ÑêwÛÿ#×>{?™¦GÀ—‰ëm2ÎùÖœøþt¶gÁç¼3ªèÛÀï®ÞiÅÏÂmØs‘-™Dù[Í_Ë6¬QXÔÊKæwì÷Õ½Tl#5lRÓ:a†’ ]Ûä²—:?Â3(„²±GMüyŒPp“Ÿ…U´w%ˆ§ÔZõ•Ž€öd $+ßQœ¢&b#ÇŠ…©3ËBYH£ ØÑbÙý`§ö!R‰:j¦àb4×̇<®šãÉý¡úÒt¿HBú“ûø?îÿãR•AFà \© X 6°ÐÚ `̬‘²¬\b;¹œ\Síë­ŸCK/Ÿ=~s.IŽçðLÞÿ¼øî߆‹}º YŠ@| tÛ»ä>•äaÝ kVF'ÎÂJ! ³R-3à 5Ô ÆÔ\w‰Q€™†¼4Âd„­~©®GàÖsØ£ÿuû9/b¶>Iï@îà2áŒo®h¬¡Ð ¢kÚ(±H-3Ñõþ‹”ЉD‘VHIÔ†5"%âý‡å«k¹Ó™óºO’ÊÓF­,¦TëJ×8&\\øD^#ÃÊ»zÐZ«4’ðxçàŽÕ¤só4~}@ÍÔ”`…7 £Gd¯ñÙ#å ¸A‰çÕ¬ ÅcQ‘ y°¢@¨Ú¢ÜãSvã¹bÏÊ `f<†ÅCõv8¸ò8…4tiÚ£à2h@žuzºxš? Ïfö˜ŽrÝQ”4Å¿n9l…»j€a¼rEŽ™ºÑs§õ;ÏÍ"Ì…,uEMåû5ÿ¿×ßòÌ·ª÷¶ ŽVasq0؈•ÅÝÆŒw"ê•ø›Äš€H°ÄÒr^¢§åeø6œ…ÇÙ’…d?‡¯§=bI7R»Ù2-( N’@ ¶€v¬Ø lº™Ze”8×Úë§žØçH#ËtlLÎùP”I»‚9`æni=HÃ/B]Þ]÷õ•ûBÝì÷)4ælžÚ=noêžþ¹¦¯„€Æ%áÿé‡ÂzfŠsÔ)uh­ËÅ—®Üëç»ç=P7¶sFãCn»í/„šv¯ŸÏמ¿ü_Ïßðþ­þZ ~ƒSva|©•£Ô•U«ÅÒ°¨1 ¡9¶«Bó²mÊ'¬4/Ò¬úoü@€ªbð1N=±FZ…*‹Óõ$e2Ä ð•¶× toM‡OÈÇE…µ¦úæË_xI Í½ d [³ˆžê­îK­z«õ­$v5r{ØT`‘„^û×3ƒ{` sîkÖr ggž¿ÿíóþ¿ˆñoðý׿ žÈ€—OJA€U€á&hP&Çj-¥'1®Ô˜sc:5Çü…þûþ‹ b òNSA6ÕÓô€Ëâgàù.­Vïu8Ÿh.+ +€Æ$~µ5çlqß-ÊFÑFt™+–ꮪ*JßK“Ìk·ÖɲÕÞÙý±ÜSäáØ¦, k=&“^p{až ˜Ü,±-G.‚&‡‹-¹mXöÔëNvF¸XÆH'm ñ–à(v±ŠQ ÛÒW“··EepXÏŽ¦î{U_˜ (¨ Š kiW©MÛp”X*"™b qÞSxlçv¬ß†Àtq‚bú‚_æÇÜEß3=„¹Dr®À D€ Ë¢”ªrîF³#ñ'|S<{> !´@Ÿ\ySÙ‰#ímÉß¡5Ê;¼Ð¡ÕâV˜±~åÜ/[ñ˽ð™–žkŠå±5Xû9¬£Øž™¸@ÕRŸ:1T}0.ÔÃøhlPyAí—)ÿ òÈ›û¥éž{®rô®“¦"ýQj„G‘l¢9ïÚú=dÿF (Bjz©ÙÖzëæü°'<ã?ñ-_¬.°SÎâ-T×óY…ž¹¥7: å£;»¤›¨dØ¿ð<×ÉÒ ž·a•õÿý³½ @&ÆIMñbۨ׉>¸—_ˆ›:%x¾­û³ô'D §U_îð_^¾Ÿqp…t?èŽÔ¡$´Ž6Ê;ùä•1¤¶š™òÙ7™:M-e43úºŒØ&¡¡Ö„: {¦Éof}W …@HÃG~‚´‚A¾H0¸€ÿÀDÇŽ’€ ¹H{€YàkÕGÇá-Ù¡âZý°Ñ9è§ %÷4Ø™Ž¤Ì@w’hT«Æf8N¸?}è[‚kôÝü/ßA+5 qî!l¯üÊ«M•´_]KÀ‰˜Ú>²´rûïõ®÷G§AjñTB,Í"6À¢±Öòã*¼D7܉%st½•†R+“rh€Û0-7Kºjpì4Õƒ¸cŒ ç][ck‘rKjfu>ö=ÝùǺ?¾<=Ú‘®„œOô]¯ö‘¨ä––%޼m‘#“ÛÞ}ö{ËÜs£r¥ZÍhà6Ìw·ãw ~UyzáØJ¤Á!ZËÀ"AòÕ'Ƈ³ìpÝd¬É‘ô)ñÛÝ#4pä,]øpo‚ŒùYl`š5¤\ÍL09ʦƒ²Vì{Ü»Ü-»Ñô:'žS__&ÍDcwBFB67äèØÑxG3ÎL"¼¶K6Ÿ" ¤I®ÅëgwÑ}gB| 95î  P½Â3ÐúÕÀ¶ú T\FŸ¤Av‰Êáè{Î}÷þ/Ô¾´XêY+„MH Ä ‘8š!½|4åN“[¨Hb#Á¹Ãƒ&à â@™B’¡a‚ 0)Âd9"9tHű1˜4à¡i œ@B2–\5-6† #8¸´­û¬¶ÞÔRì±T)¾”±ùÓÙ§A ÷Œ yƒ¥åN¡¯›|á³x-pÚþ³N˜¢M͆CºJ2/UƪnI¿É¢û1öµe âc^eWؽ£>Uþ]hû=õ»Û:«½jŸ 'ôAÞ¶duË9Ú ZY7LV6:d•f­Z„ïÁ²tBÒ—8ª~à@#PòŽˆˆ„øñz´9ÇêkîÛžÛ›ÀÜýö/ø²¾ðy}r}Ôñ⦻õ#ȶۿ·à-”UK9€÷.}êMÉ’]È^ìD0¸6cÛÃüܺŽîøüÞš³õžã¶/Œ>í×·(Ž/¬z–ÙêeÆ­©ÍFdVí3.íS’¸ Å6>ûÙ´S”†tö¶!߯üW ²}!0!úûâ(¦¿Eõúî¶{…Û*ÜöøprßðcñKø‚ VPº©Ç¾ÌÙWÞ.rg ®„ÖŸG÷72’tÛ“dŠaVjÎËÇ©ÄÕÌdÓ;qEÂöi& #.VŠ„Ñ½Q÷rÒÛý¾½¯tEìúÑ>~‡:äÐØ“ƒöi¤ÕQ…Ø[p“€“:&|èºXëfw§bféŒmŸc;l„'È ü ™ ×Ü@ùÌ}7bªZ+ɵNÑ1~ÿ¡OGrö–fëÃ…ô;’¬ŸÛQeyþ DZ2wWÞ·óÿéÇö8~ÓǦt»(·i½ÈÑCU^†vÞ€i`ËÒh‚cõËÝŒlÇÂÆ4l#hêРHJ4»êIj™D¯Rÿ<ºAní¶®ox<Þ¯Œq#öVD«üï<Ö Èßÿ³<›@6a(/Zé’‹ÊÂ"ÖÞy>»†Vw›:Ä4‹u×M3íò&LÀLñIfhû¶ó…Îÿ©€å šµúÓx¬y!Û4Ëy.×Ú–Ï·GÓŸç–ýääŸö §Ò P^ÜÄ’x©¹"Èܧ=Ž­Ö²ó?¢®†E”ÐxecƦJŒ‡Ú¥ï.VV£Ç.ùs¨h°«äaD) †‘’)È™£P1êFi?SÖÓÛÝ| Â° aÈÊ-®-¥ë¥°‡>Z‘ž{¾6 )ì½Xlœ=LŸîÌÂkæ¤Ç·Ô2¨Ë&÷_uí9'?ÁÇ0¹úß=5"C_ œñâ–q”&1A$‚ÑÙ¾« hTi­ôÎkËÞã—ïuzvnÅ ÖÛ†ºèxŽe’6j”¨US3 |WŸ‹ðdæÁDH¶-=øÊøsÅ`ê9dw•]/Œ½á·¢ WN´§ž(¿q=¿ýe¸ìñ¼f¶/kii‚2rœ¢šfK¨ müvÿÆì8[œ»¦ßvqeu»~y±ûtgµøz5ðåU'… =ã-­Ñ0||oVýè,„?±£üîÜþñËÖoϳ1·ÚJTmQ)ZE)Ъ?tîÌžºg65xÃïÓ{‡]à¥ÂÃ[l¦¬aè¯^„ú¨â¥ÊzkQ•;y<ªHdM6;)[³Œíz§ÙU˜eoÒzU6Õúñw6I%ª\LŽ*ibL¯¢­m÷Ug µ—´{íª‘5-yÐJ“:ÆÜx~1_üÙ–ñÇczKÛÛ;qñÔ{Ó6küÙþï,¡—Ëå?é{¨„¥© ”»QUàUÃ>Æt»¬C1'žÖ*ŠUØ#‚ÚQV¹by¸{~瓚švƒEá-«yi,<È8Öª[b¯«"2 8­àš‹ši¦æÝYà /ëÜ[² `]É™évSCHI0 H’ÛAR$.á[¾ë3OµIªÖ19N@a€ˆ‚f8e @€àIûnÇ AspžžnO“= Å*N?Å»å+ëm`T-Hè>þ¡_f©÷ú;¿Â¬²ãS2‚mQEôjåÔ~ôÔ«êý^fïñhónãçkƒ"¢Ÿß‚k` ¥”òO8Â{„1B©¤ñ2F=^1[‘ÍêÊ”21rëò-0%ÀŠªÄ  OYÛ%•a"ÔÛ®E®‡©qÞÎrá!÷Ù8Ÿ)ESÍVC‡Y{ÍõøÓ¼³2½Fe„£Œ•"Èj§ JÖk ­È²Hk Hc bP§ùší{G;ÜÞµ¥ãÌb¢=…WnkmŸ‰x‡‹àÚÚÚ¹ÞOó­hk÷¡ç‚b4PÁFÂ2€ÍZ© ,”sÞ}5³Î!ézisz €~‹@_v›ã*Ë‚þ­Ÿ –Åÿ»žW¾aÝâÒAÕP€’—º‡}ŽÔü¢¹®è)a ZC1ƒèÅJNS³V1™Ô¸«øŽÏ»÷¸ÞTt¥?•g=ýÿæ¿{?ç3Â^3q™™É‰Õ¬Ž %%H@DÔ W ëRëå™ðCm>ñµíîF9@ñTšè¢ÄǪ°xlp#öí_ª³ö™tÜÊÕzàLw™ëÒC”ag‡mji©¢ëÊ–½=,WŠI®TÁL¾È‚#í->Ú<mü2g/¡œØÁòuXZk+½úæÖBd­£ÕÞ…LXC‡–{º{¨'p³â‹$ø½Î uÙô°âU†va쎃zî\^É[á-Œ8í2†ïuaK…¶dÍ=Žh¡,0R‚HK zÊ•Õô׺nCÝ»7Þ\Þ#TV+MH’Ø*¨R0a•uYøâ·¼ËÅ·lÌï@"‚`Ìpþ“þ›Üþéõ#̃)ä4ÚV/ܬ)Š ü%8Ö½°F51/±†ÉÌÉ(^€â¦ a~n¬t)/òt'>]âIN³cNëÜFÇ` £þ‚¬8PJ’˜I‚,ŸcæNÉ`1'9 4ÌòŽ›±‚\,ë,à,ÅÓ,åBö„º¹£é¾nóÚL—1–Åb­ÆYP!$7â UçÌZ— GýžS/sd¯ßEunêl”ÀìĘa{ó|—UãJåÇ”xCϱ•n×ï>U[êÔI‚õ±Ûµ»W¿ûcûãT®j¹úûñ½?ÿ±vïúi~–þ†=õ qQŠ‘iº°ð[6YX ÇH¼†SΡ©"Q}Ê;ŽÚ” €J¼ž«T–¦žËm®;;­ê ÑÖÊ iiÀ1Pð(\ï]“ö¢P2Åf«µÞNþK˜+¨¢žÈÇ„5ÙžÊû¥{L ew¬9[ÓÍKSïy$}0“qéÓâtÛ­sÓŽM´sgq+L‘+jÍoý»[ãO:ŸZä_?Û¼¸ÝúÝb Egˆ`•Ć[ór•+‘ýœScÍo«Àszõlݪ ô¼îc6Çx»TÓËé]Ù”€@ 0D¡£ β Yòÿü·ç?¼pþWG˜­×&Ò8)Ý ‰1žÑ|ïÖ¶£ —HµXó¨–'á%Že}æŒçE8ÔÑU$ª)ΩBÒa ™íDÓÊÎ\nL. ²¸Ìå-œ®×\g¯iW„ &V"%"¤“ëmu„yTsõŒ?\W{ÙBJN©@Ù+^9Sb ½‘1¡ÍÑSö½j¦U©Mê‘FR”àn¤cLØ"%mf§xÆÀÀá¡8“݇€‡ÁD•qˆA¤ yˆÛ÷FËìOþxó”ðØüº¨V'Â(ž*~¾©ç¤9‘NÖ8(ÂJQÍ™mîÜ#>[:|ÎÔṇ%­wY>®ÙŸ;ÿû”OìüÜdCÀXR™„¯Õ±Y4ñol,£7ÐNæpÚÝßSþ׫xHKõ Ã6BTâç.þúƃãöœèµ]F×ÄLHèáßÀ¦ÿ¦Íþ«æ²-Ÿ|5P+?¸²ÂBô©½úimï6ž *éçÉ5V@Þ#ûÓ¯T'ÉåÚ«É4¼‘¬.¬Ï-‡ÇІ!z£¤ 0þ¦x1žˆ¤pìLà¼Áoc1HÖj7Œ¸kìQØbG»6Šx<¹¿øhsÏ%DÁœêÚ[  L 6¹îZÖ<ç?xaæÖˆOÄ(îÞN0]–„¤Ñ¶¢£hÞysnFfñ‰z™,À‘"ÈBGàôj5Æ4».±šÈмÁqÉtb×.¯Ð„¶=ЋÜ›ç÷i¿JÁX¶éîЧU”¶*õ*Ü#5B‡Íº€) ƱŒ‰ìçì÷^ã/ÄžVõÛrn:QŠ Î©}´ñþÇ,Hl:u8õ³1Òåµo  ‡—é¦E*’D…[-b4[xºÜÂðn—‹aôn_’ àXºZaƒ" Ø\KÝ↠,ËçiCe®úD“ lÄÞ|ß·ñK Òƒ¿÷¤ôæš)aຠ—¼-P ÑÂBRhœÀT8­6ñ[áBz°8ê*ôíJJ·AA6“Œ06Ê„çî[†&U†«+Í/.ž#¹ÙáÓ±Ùúõ%Ém ÍÉð·Z@”úµ´õÄÀA]È £:lÓ)z¤Ð…Ùh3üžî?¸ð°sÜÎ €‡BânßY* dÈÙ¸Bv±M&º‰³Û K¢Cx©Âz,­÷ϳ3¿‡y#|(y.|™¶Õ-äÃü“êáè)µD»’Ãüá{ó~\܋ȥ20uU„’Ÿêp-,wd¬&ÇÖ£ˆB˜À¡Ð Ò)L°ÐèM†!q°ƒ)0 e3Ýôi¦•b&A ÊP„`©(&@F `®ªÚ`,& “Ì:á’ŒTª ë°…j“—å·¸›s˹–a¦ L5bµ q’¿R˜³SŒJ¨„$*É= xBÁL„òÂIµƒ=ôG}yìÚÓÏ·«ïî5Æßi@Þ†4?h$¨ÁY:ÉÁ]Ã’•å5œþ𞃱ƌÆi›z¶¿òg¼š[öõíý?ÜâéßíÒˆÝa)eÊ=n¡ým%±¾,ûŒ:Fa£Á~ôÑ2t]7b£¸WGMtt (Ùßœè~êåm?v3nw:Ð7ßa~!çÙ–bþþ´¿ùåmÀ}ß?…&¿¹ú®Ñ*rÚù(AùùC˜¿'çÀÑ oÒçú|ÞŽR7?®é—±·z~žx }ÄöB­k©zÌsf‹âzú³ƒŠ£Ž8WM RrMáK"žžƒÜÅÞ^˜6òAý-—¯#7oì‡üß {uw¨R$˜ü#¢%„½Ëuk$WoóÏ»õ'“Ã`£ÉðÕB1!€€‘iY´ÁÜJcÅ÷„:o·%Á1¼[ý|ni¯ ¬2È@. e'äû™Ñ‘®¼ 4í&Ź"Q§Å3¤ Ä€‡[¶é=âöDï¤1ÅŒVrºá°‰¡§m#nE U[ºN!N:ö{eh_õ~x|ÞqÉ=$Ým2ãı>-ß}Mã±8¡“¢Í‚¼&óñÔf÷û&°?Ñs©ŽØ5®|ÃeyÝ"u? wºÎíÞ=PÄ/{ ý sy(ÚI-þ0£6Æ1½QÙÎ:F{™×ðÄÀ­S,ú “w¢÷ú³;zCÚ°Gt$,À&DH Bƒp€†UÂ=¤»éýÛšëðá;9 ×ËúÍáÿ žyù¸·Ñ iÓ¨vÑ‹º ù“EüEÿTóWÂ0"ÙaB8ˆ˜}K24>)óÚ'î± )¡´÷mþ/;ïs¯Ì.M’Éeå­Öïït7³Übp×\õŒç»ê6õÍi‹,«ÖËáÁ¥£ÊÔNÍêà-~ħý]ÕŠ‹Ž/Ø¡#úÌ1„A È,NÁCOa(|‡` ’%LçïWÆÒ¬Ïòqé”)IÄô É¶ÖBu ·—OOd‘1 çÞ[5¼.ø¸òŸsï¶mˆ/ð@!oß.”ÎÒŠIоӾÀ^ŒÊ xÊàFý”€oˆ°dÒxUê/×ÄZDq iN¤³4ŽÒZZ×Y4ºL-luYµRé-Æj·XL7šB(_”E[PWþi½÷-±Ù ¬­ÑË}áîë7ãÚ®í(Rð·`fŒwZí´‹NñÖµúÉ—ÏÝC2yä¨_¼•ÑPIÅýr Ú®Dë k{?ëÎý\ýõçŶùò:AB 0&”!SÒ`³Úâ‡ÆËæJ¼£õûš¤x=¯Êÿ<û7¨|†Í æ iaÕd‡ð!{¢‚¥M—ç2nN™QhR;ð­ÏÒÇp‚9ºû›OHò,5ÙUSf ä&}1#W½kæ\Î<8}l•v`¡»o}÷BÓô6wG7ÔнV)T”Ó]ƒÔ¦î}¤Mµ±2õMIP£KˆèXª Ið-ù†5øÊ÷Cÿœªä?ÞíÏ÷ÕÏ–?Ç]õ·æ?ŸŸàí×}ˆÙþdùìjÖ„CëŠ9,œT RH,d Å:U€bé¶õˆ‰)ÂŽH¼ )(—€Q (°&RodÃIèÕv˜>º»ò6â µié0î ˜Ø0†à @A³C½ÛöÔNÔ¦EYÿ´ý .p©‹¼—dI‚³€¬Æ9¢Ç­ÚiŠÜzH P R ábÛ-g»x ÃùûÁ”Jucoª.‰y²oÙd9æ‹ìµN›õwËå u´.fÝ.þiIŽZ¨ž…#æÖ‘ªÍÓuyM #„Í{?Ý9¼uÀù­É¯MÿJú¸ebÍoÁSðùP™ØØH!k‰É¯Xo„€ØXE³Âˆ%ňè#ŠO7õXïڻщ>ÆTã=}¬B¾ê.¿ÿ´hç½iîKá®m¸U#sˆ­’-õÖ¿ßuß·|×gY²ÐLla­ ²l+Œ‘@…‰2&¶c]Y§2ä.hi™²flâëx½¶Ô×Ã;X–ÿØgŽGê)«€¾ÅºN¥k\Ô¥­hùoO–š"åcW²¥·À®A‚UÅÉ1OA¶§KI_ì”Ç#DzîHîÊÕZå•ÙL §ã"‰z‚ã¿úÖô𲾘â9ÿ»žµ}Û $Q¹€Ý0¦ùñ¥´ Db¨²!Vžvˆt¨ˆÐk|pQÆ(‚ØeÄ—áÚë6Š|¼buF\Ìÿ$7²¹=Êgæ³b$ÓWd+kíÊîqæÒ3ìÈ ¨œ‚ü8?‚3·¯óÒOšè3ØGЛT è¢T'¯w[WnyqOa…À(,|¶,J–Ñ£òš –5èYmËÒcJaBX—·jc ¥òòÍæp…ñ[˜é ªšÞò[Ô‹Á¹,¼¶É{ä!÷¸NSe¯Ô,7èù¸Ó¼Æ4Îz¶ ÛT“ñæêÕT‡Y%Ëp,7Úi°\›ô8F‡ªÏÛÕ¶A<Š Þb° ý”pA\³TCl6–; ™â=ugŠ!ÈB£äJ/ ’7/ä9ÓËh‡su;>g˼“1¡Ô,VÏ0e“c×tÌÀ¡,'Ô¸‚xeÜ/°ègt™¹;·vi€ª±Ÿ+=oµ½ºïé0¼ÅÊbXáÚwsÕ`Ðl†à&h‹ tß] Q å¶0Ý6¼A}i{æ*›ô¼M1É ãîÒ?]„¤|©[;:S„€G ‘fJ¡2ÌD¤»Dªú!ØÛYAzOƒŸñ¨áL§QÇZÕ`1QlÒHê±#ªþ€CE.ž¦í+s~[?Çý¥ó)ÙM×âÁ¢yÞ kLfË­Ÿéz¶÷o<÷ïf«¹žQõGîoþäHùqýd¥Ö­øW±J|”úìç}¾÷¿¼“Ü|íùøòÇú;Õ µ¿—®Ê¢ê EI¹°áÀ‰ FÀ(-UèÂâ=RÕG+(„Z‚VÔqÀqx¥°!Ôj¨ŠÍØ h,9"ÊÂ1Þ½ J–ŒÆb‡2D!µÒ¤%]´¨Jß‹™´ÏsÏ\ª4؆Ô%ª3h·©ÅU3(Ü5I´x "¢‹|‡ÁCà)ˆx¦ì\´Mhú»Ÿ}'MZz/Ç22p”%4úÒE” `’¹Š#vME‡MêÙÙÃW›93£SGïÌ1k-‘ (ÔY5=V @©õæä ‡Ô@FÒÿ½ñ¿ZƒÕçþµvop¸7åZBÈy)8˜i¨¥5Ve…æ”&*:˜ˆY.«ªÖ“»»nOh§AQ&: ®®Ù'äjtÃvÕÚ"è1¤Ê–ç6‘,TÑu&ÀÑä0ޏ‘û|âu_©Â&ÊÐäÙSoSF–'Þ|åÈ4Ïtèsdñ¹wJUÁÆ=kbi\­ó«ý¨Ñín 0 ÆãZ”-z©òY o"³*B†¬ºUÌ@=G…%Àšö-ˆJ @ "³[þ®ŠDÇÜí± ‡“wŒÂ6NœL¢”êÅM³µ¸÷Tfé•ÈâˆÔâšS®ªyÖu®Ç=;4{îÁäÔQöȃ.â­ìåHÉcá5bu§¸½±U•ÕL!šÓ&› ‹y²° §ölßý9Nü1–m<áµtåÈ1¤íß§à/mAä߉­úIÁeà_†96nõrýÝ~÷xÜ—Tnfd­–žÂ™mt\ãÁ˜FC!wjÍwÞÑñÀ‰¡vû?gå¯ üíyü·—ß¡¨m`¶œñ„’ê8 I¦ÑÎ÷»ÇÎØCØv«Â*zjþó7r”‹\B5s4tl,¦ Sµà<¶Ÿ^?ÎïâËã8¿ÁK»oh¬£Œ‹l#ð€Jè› ‹’ypÍ]A@L àDæ4ËíAc#­€P0æ±(£ŒšÉ*4—ÛH£& CÃ9ä>¬iÁ@…q1C”—c¢–Hk·Ex¸#¢¬€A"]ëRÙ͈{ ô‡Ù‡`c0(ì‘ñ@±÷‚yvⲯ€Q–Ã"Ræ;{ó›ÞOìë"ã0 Óú'ºIÈ·D-{40Ñ º¼NÇbš†k96hÈ^åÐ!8ŒE¹U»ÇBdŽÊîE:Ìùø=f®‘óìUY°¤Ï‹;_j³™›…' â0˜Á¢‚Ä=N AUÈ KD°Ÿ*;¼Ší·:›½sL$«ãÜû¦#“5ðØQ:ëÎÕžÌc›ÙX÷ ò œ(Úl0çu.²}ÿéLêk7w%në.÷¼T›¡/ü2×ý(iDoj% µ]i`@7ù0ˆäIÑžXý5ƒÞûS’ó¬øXû6Ÿc¸Úßý[U…Ëkki”÷€{þ ¼ý.ý*> ¸º= !Þmñ„—õ[{]l{xÞÛc•õ`!·¯‡ª=æôÈq:˜.\Ðzú›Û~/DùEhá…w@±¢ãì£Ôwhý³KÇöÉÕc÷A¿ñ}žk/¯µxrÓ ¡7\-’6¼}DkÒµ—ÞÖ%æk_ãÿý"Nð+|½µ¼"XÎ9¨vœ’‚h0âü£p‹Œ‰[ðÍ"®žàÏ"Ó­¿íŠx ͆ ´*< 0Ô. P$@¢¸¯ ù7gr7[NåñÚvÍÎõëÞ ÕNÀÏFp"}¹%Õ²ñº70^±é\é°#Á(RwÞÝ«—U¶òˆW CU˜W;9ÒxÐ:ûžktLH=ÙùBä~¹"Ø*& Å‘îmäãë ÑþA×Ïèz?ÜáJànglÒZ÷¶/=ÿê£Å²F.ö’¿,ƒƒcn€A‰¯]órdßöLé™ID1¬ó» ù³è?ñäiQÔf‡©7Ïí×Ç\·˜múŒdÆÈ?t¼u´Åy!:Ý %‰ÀS×ýh®fo|Ìôç ¼HBÅÃ(—*t9e*a¶à$+¹žzš© »Ýûi.ŠJ©3èƒZV>ºé÷s¢ôû5"``u`1Ë(6ú5ÁÇ»·þ¯¡÷s8–±Šç1æÉ0zå^¹WHP~I&6‹zºÿiMÆ3¾˜MJò2dªB˽ùùýÙœOr]e¨Zy«TÎËFåh\dCrÚÆ%Býæí?ô첥͓ë¶ëdb#M§ÓµC÷ÉõGÞÎëï^þåþ&ú£½oZcµÏ 5} WFR ”|wûoÁÆ Vmt_¤›‘KIÄ“-õø¡wgæ¯ l°ÔfÀ>ÌÉsÕD.f9y¡¦î^e°Æ…g–;x“;3³ŽÁ0l ²¤ƒœU¯èþÜëµýdsœ˜cmDh„ˆŠ:¤Fî«Q¦Gï¦ûº[&gl׃GåR‰ë"XRd’ºrnWœ¦¯«åÉñ¼§ ʱâ´r:‚²zÕ;§ª¸ÏÅáÓÊ# æEC°]A”¬še„$ûªP3€¹*­”‡ò#0›j/ê ë«o÷òç¥þ•2˜ 00D«@‰¸ˆ×„²β>E(ÞËÔY鑇£ÿ‰=Ê5fÈ/üâS¢Õ½u]¢YªÂ€Uõ´àKŽM¬K ä\¡X †=]Ì>1ï<îûá`礡ŸM`^>1Ÿœ|y±›t’-sïç;Ùn ºÕ/ŠÛvªd‹&1¥d2ió‹ÒOe4Ù]ƒghBˆN]DÀ%êPS\ÈÍVÚÒ6éúýÐ?fü£ÝO«b~²ü‰ãž/æ/Ù|½õô£‡Ú§’ÈÙY6’ØÛͲìÀºÁ]RóDÜlMFŠÛ°ˆ®çòØ-"hIVDcF1a5`´eŒ‚5  3j o¹BÆkbˆHX¥ØbŒl×E'¼ Œ<´+ê¨Ù=6üs‘Bº%T›ñJ'>HÆ7-M‹ÒI¦Á‰ÃlQôdÐ0‘é¯àœö¤Yh‰ T€ ·¨âéöÒM¬+Ú¾µóôätŸ²—’;Í¥OO¶?;Ñ{LXg ʼj¢¾Â|ÌxݧN¤H2`i±Ö[º œ«Pjk‘[½æ®{­ÿì»ü'*Œ(DAÿô7ÈßÈjö7ÊßZ"F €š\i}œ:ô Rë”æU*R2ðTõûa7þ4>Ño×·Ïokÿé#úÏò_¼èaòSþ¬þk••K­YuXE¼¸„ñK+@8z͘büD+@X¨ QH5 ¢^1+× D §^„ŽDFâ¿“)°ŒÜÔRIËшóbÙTJô…¹ª qзý¡>ÔÙï&÷*é~-$Ÿ3 ?}®Ê%R §Î}3ã ´Ë퇆˜9{_«¶ì1ÞˆjOo¹QI)“×ä´‚0†U*ëiñÄ®y):p˜˜…CšGRãÜÂ(Ы“’¼Ls¤ÇI徤ò:~ô.7¢V©HûÛ¿ûùtÊÔ«ìF>¶ =E 7+†ó™B¶LȶlÿŠpôýuuÑ?Ô¸爛!’2`ŒQ…"3Bä©åžõ^­ÍP(†$*öÄ7Õç†&È¡‘  *W(êtÖÃU‰Ãd 0f)‹²¨âN"0T²dº#Àe¤9S6ˆ0²CË4°lÊlèÂ6¯QÁâœZ¤Ì ·^»¶{¥É}Œe‚‚gŽ6òŒ0–—Ï‹Æ6S =IJ ¡’¼¨„ 5*:®¦”¨ÓPƒÙ^81=þRÝ›}*?á-$kg0ä̦™l¾ AQ‚Í4 ¥àDº:ýgîøOOœP;›$¸Ds’ŽÔ\^1ZƒunÍ|õfq7Õ{ÍäËuöC>àMû]ßP}uõNE #ò…¬ßCPNK. Ž­T{BÄŸÌ¢8FQ ¬h2a|ÈYR”Çàýöp»GU8¤2ô|MÝE}î÷b‘èiÖóØ__Óhdq½GñŒDË·S_0ã9ÿ®ÛóéS½²Â#Í  ¶ÄC_àƒƒ¦˜¸†¼*D·ŽïZÿf¡]Sû‡mäïüç¡“µ­ñSí]Æœvæ™Ê/#5Á²H2Œ.i_o#‘æ¾0†{X:j<øe?77ÓDWÐfÖžüÄãýϘ—;jëÓ0ÕÌûÏ3òŒ52A”Í;˜8Œ©j¢0 +–‘Wp\`EÃq!õ8܉-f’Ôâk„Aжðùkjõ§vFF$Ð1M&)ˆŒ©Mš@–D*cíU»¬7+Iž/gk¡J8œmPO˜X Y™ÜM›Ý/>çŸ($2„`Xˆ–…LÀ½Ï¸áîñ1œ:@(.P.ÞÛØ"î{ÂÖA&K~ ¬ß—ûÇ ~L #·2øÌ^«÷UŽÝ¸ÛˆF»˵ú¤a( *×€Ô{98 AªNe^oŸ[¾ñ¸Ý6öHîXw€ÊG‚‡†Hc6²ò›ÉwïÆ\涨p…„ ƒ€@ò‰êÐÞãÚ½·á'´$®ï¡f!.kØk~¾ùÑ-ÞqWrS)ܡ ¦ü{V×–ùüÇ/êÉÍIuØ×2ƒô±KiuŠb4éjà†¡þè2þ¹DëÍïð³Ï3@®Ÿ§ú;f} \ï±ç³{™2hÔk ~4—1#vÓV#C&"·Oê@²nÕÇ—âúË;ÐÔ¾ÏÜßEZ€ãb¹8^¼ö¨Wƒ?a*óÉ?¨}3@R%X@‡á2kÈAR-ÏÊ\ÓŽ“…üYÚU浬«ðeô?+C>ØdW& BÌ~>®f ƒ( -!,Dñ!¡› i5³=ÓqSûpR‰ü=cJ7Œ„€cb^C¹e+º4eX‹ñˆ¼ ŸË;>_bÿSsm^þ²ã#8n·ª?¯}»†s©Ò¢ùÓkŠFw'{I¼  ´¤+è¸o¢Ž£VNˆ‰²Ñc*§LÛŸôB8“kÜí;¡ßüN?`\øñ~mÜîÿrÿ‹ÞX‡·Ô­•••o6 6{AÕ¿PÀ^…q«*}Žo~žÇ=÷~?¬<¨³Ð•¥ý²ùYFNjNâã{ë²:}]ǦÿÆéê»Ý¸å5ð¨ŠÛ•.Þ=ë²cjÿþQ¿¿´–cäÌ^Kc¾L½óK˜¨æ$z|ÿÜñÝŸnžvlp zƒ÷ó0M1môpì;«ÒõÇ¿ó»Çn6·õ}ÚÂh¾kù„£çóëw¿ß^å@µ²x#Gt:‰Ã¹Keü£7µÝóß‘Ã~Ψ_‰ýgúQÂßg¨·Ã¾½ØíðR¦ß?çñq½¤–š×vî[„ªåf Í2Ñ_»çæ(Ã[ˆev)ÒîþëŽÿ/¬þ}}k[ØßÂØÓ·’çŸoÿ³xû5ià<¥tEà‚IßwŽçá°VmŽü³kFy¢Ç´†Ùú®£#ìÂþM€?iÿý÷ïeŸŸ?y«OÞîãÎ)¬ºØlÙÚ%¾÷#ƨvWêFú5Žhöt$†óðG¨Ž|rp{7¸aŒ¡ÁÓÇTAAd¨ŒX äûÊ]×ÙxÓt¿z. ¾Œ+1õÏñ<ކ9¡'J ãƒhVÇͲ‡–u³Ú¦&ŸgÏò*\¬äâ,_·²ÁÈK«‰2PáP8û(‹ÛT¹“pï’Âvõ†×+šç?åö¿ °œåA Ñ‹ñCÀ«x§ö1ì$Y¨Q—ï'˜sbq¬ôÍÏ:BÔä±³O}Ù¡‰Óqû$”°WlFŒ‡z%|îyÓ瓽»7,¾àJ­ç/×Ë;ñá¯Ü%GB-u¥Ç0-ô¹C.õ—ªG½˜›ÈÖAÜ®tKî̦è>ëjGó1¿$¶ §}gãj3×–m tÖ0òçØ¯n.ç“q²å¦á6ëÊ ¨IOŽÎü®ÆÞÊzW”ž[ͽ˜?~Áÿ'Ðéç-™Å¸cTøä}eý&ÿg¿}Ü·-Ϻ¸Pñ“_nð°¿$… M[©‚"`h b5xÍé}/ñRagWwÑ™Wjª!Œöáóè]ÉæÙè̶ۤ àÃ&_c÷ëR¦¡^‘9£±yG޾×·ÖKZ/k¤ªRGêó§Æa~ܤÖÂõ‰ÂŒIX‘òæÅ°œ £¹Ü°ïüÈ‘8^ÊÄcG¦¬›ÑfPÄQÍ)9¸®?|žó¡äù¢£8Ü/>í–„aœ/ŲhØËœ!êÖúºzŽ=¢©ÙÁ‚›p¬Éǃ˜ÂB«êˆM)`(<ÊL(nà§ÒpÍ3°Bš²]b–†FÝámíæZÈë3vÞÞ¾c6åA¶]J,@mä†Î ©)ëù—Cx#ÇÆèR²œî#YÅ.kÍZÙu“&Ö6K`×mD ¿S%ÄJàT—¸(SYçÁ+Ǧ•r°ý¸Ò¦ ßÕD÷+ƒu‹¶ìÔðŽ~µÃú*e¶GŸç›¬×Ú9j©zºZ«§ í¢‰…TÄDàY/ Èýn™ µdëx]þjÏR‰{W†v!BòÔ¼Ö$ý#:樗XãHrHŒ ô„ôP+¥„<™jŽVCkl3â1ûç÷Ú€ÿëÿvš49ã”—ûÞWîåkÞ»Ô ç3òøî[ÎëxȺÞÚÚ3÷̼¦(€½a=ñç­Îw›Ý¥s.Ì]T[/HáK¬`äQ‰ýò|îS%ÔØ%Ól×ñšþû_äöQLgÓŸzú‹KžÛê/³ÚHfEHó¥S¨SgnœjU¸þPGoFÅàE¸´ë#9&oï|}óì«þQ•BP…»í@¦-«GŠãJÃ:J™_ =´¦ð { 1Ì:nàÛòRyCú˜NC ^p }‡#¼ÒþxrùðYß é‘¡‚„]$;ô%¶-øUð)!ŽË[9®îÇ¢‡1½"‚ÞÇcÍîc†×¼ÿþ·üT¼èÖwÆšôùKçò’y…¤,Tj*Bæ‡E÷z­r¥hÏÚ £°í yî®iš6‰Ô~çdƒtˆl”'LÈ•¨È /¬ö8ëklÓKã ä ÉKqmP÷Z!\­Å®…34Æ~ªÄ»ÑÈ\¶¶ÖƲ¢M¦(hÙ„å ¤¸lQÀ¼Àš¹D«7ÜŸÅz‰eÓ»5£9óÈx¦‰Áÿ¯Mù—Åba-Œ@ô:¢c‹=Fè‡á_šóËbÏ•/ŠâT‰–5;bꢓúYžÃ‰Ûþ@(ÏMÑÚÝLÄ‚<Îü±´úêë¿ÿŠþ1v{íßÝ{Î~î!ñãQ¿fq‡Ÿr—£ªŸ”Â….½PØÆ‰3 #ТJʶDª>–UUðed•Àƒ à@ÕJ 8 åýÁñÕjU™D@”Šë:–æâ(È;ó$Ö˜£Eæ8¤C—ø,‹ªcºN*äç+ωë£P(Y­0ã’]îåÁþ|yÌp÷¬ P·€Ìí*2d1šR€)jŽSU¿¯$qN¨ô-íÎ42“På=x ØÌsƒ¾¯íñ«Ïez3Qtž–ºï‰›·+¹cÞŠùroÈ*•ž#5„d{ÜÏ_¯º' ŒWO7¯.­ Â1¶oèlÜþ¶_‡u›ì–ƈÄ@¡pƒGå®ÀÍô³Ø’¶‹ÔhßC ‚ïg̾f\jÄ1e6æê"‰Y¥`ÂŽ”¢,ò'RšIWòˆÄdÛ ¢dfæß Î)O›ËMv¶±˜pmrŸpœAšÀBë¡iŠ-Õð:`aKŸáÇÆËQ¿©£[NÄ8†æŽ^ñgÈ™ª ƒ¢@&’ ¼a* ça ¬Z+”úÌ ©%JpF„nÉÅn–^UèÇYm·±.ƒed1ˆ«û^ê¢Eìfr—æ+õž2‚[³ºÝGç~w\û|Áw2 É ‡³VÈ´Æñz-ë.)º+î{q^4`Ÿ~xúOxþÿ/ʆ¦Â§“¶“â™fÞ’ï,¸cìwÐzȯ§È{áŒ]¢þûjo_rÖœu9mëˆòëÒc‰¥ªï… ¹&AS´'Êo&ë) §‡Ÿ8^¿rèHM²0k4qPc~^_žãö&ÈHˆÚ‘j0. X=«‘áíÄd½Ôsu4ÈC’ hæ €NÂ6픣ƒy÷™¤º®‹·Î×¼°oðm´ìôˆHÎƘ"*{t6«ƒ e¾Ë~ñÔÜ+F^ã‡j§E9 —[Çm/k>˜Æ]Ë@9ïÕk«þ`œ(çÔAç“6ÑÂj0Ö5Ô%—ãH‹QŠ„ º¨ {c«LÀ6‚RñÄæ9lwMØjÀCJH1¢+£ÓŒi]<ñÀ„¾+˜¡‹$ú>¥Û$Ÿ¦s0$õ’Ž%/r–°‘V†u¼ÒŽ*Pk*p€†AÜ‚<¸w"ò~l‹;b´*&xsÐvx8ôyÏžn¶C0¬€Â”ò¶2¡sL]iÕ¾9eó‚ȧôØN qá”n’Õ–éIèQj%Ýp6 ó#P³­aäã÷qH|çŽ$ñ]§<Ç4PI„Nõ}¦§Ç‰üÀ¡6²r:X7Pn!@nqi}7ħӆ®@:I ×6ЦÜï§«áÄ–ïÙB;hÆÖçu ½ør´hnÃ%<'Pð4ØŠæœä±8Ãq:ÍšŽÃEZÞDÙÍz-R¿Yóôtø,fî¦J(„[gPM- Î6¬ANâT`Ê+G-®­©ZÚ—ùØÙàrqÅÕíY(+!MÈéò<}°•håõVä^ïËלÿxßýzKS‘à=HDa è©ÙˆÁÒð¹¥LddR<% †)§™;ûÕßœöjyF,ø1Ö†‡¨žÑ+†Á°s„b`B:Ø“J‘‹ºU9ÁzíÎ. €»Á ³ˆ˜£P_… ,Bê¢ý=D„q¿kÓÆQ—Ÿ¿ÿú*¿¼~ý°§&´=Ì‚uVu1Q¿BÝ5‚Så”8T%E9'§‰n›L-± `¶C2[p8½6Ä–•Še­±Èâ3ž9\´ÝyuG~<Ÿÿâõ%SñÞ9NöÆÉäëo6P ½ suò{,ü…¦oý<%|; É}á¿!ó/úñáãˆ]÷ G¾†êɲ¤Ë~*«vùoÕ¶tqQR€ªG;xæfÝuÈJ…Gfö¹Ç•Tì7ûe9s»3Õ{ Ù;«/Ý£á›oãâå~ÂÞ­¬†c¨¤ÚpKÞÕ@ëk®t˜v{ëØÔåS¶ú!¯– DscÁÏylÍaOpÍ0*‰ô/ÿ¸ýÚ¼õmû¿^™ÖA¢ºÿÀq’ûß©æ9—rs«RP]WÊÝM:­xÔ™Ge×ûíÁzŸ»°×W}Âyì ¦kÇ!,ƒîŽˆšqkLÐ € 9È–…cL¾¡Z Þ¨>9l·Cè*´ ®Eµ$‹Š‚1€DM @@¦š‚ÁVQ[X3:ž;¼½+;©¹ÞŠ!y~£v¸é>Ž5ÿÀLüîXi¥Áƒã ê}é$õag¼cW?YOôUp›14"2×êl8ú'$ ï“Ov>ÆÙGäJÛ›ÄÍ£EH¢E#è˜d•H*Ðìšœ^(s T÷ˆ”0±7´ã~z¼ y¨²}hFk\O÷9•ã{ƒrôiõp³?Þã“X¶ê)?/‹‡z¢#HAqó}h~u/aäò‰›c°犟OòyuàQRÃ‘Ðæ D²ä=ït´zŸãc{0ÿ5ëõjŠ³Û¹é×u_ï,c¦çþÒïÜ}ß3cøÅW^¤)²#å«Î¾·87&‰ˆiï‘ÎÖ¨êG|ÿ/^]NÉÛI¯K,ŽÆpUê%NÉ]›&õL]¥¶’GÉp͘r[.³Ÿ{AÛ§^ïÇi÷xeÊÇtk5Æ@B³]³úËî3ÌÍð+ÑÆ$6$i<)”òùÚý¸FWƒ¥Â¯?9Ê{u’UÐãÔÌnY»ÿú²ëƒos‡u|q~•´®­õ?€ÿƒîÛl„™oEôDâ=Ýuûò£³ŸPZ0O:¿¢BÓíÕ°„(º%äOQ¿„'"ahnžþT=íg./˜H޼<øÌÍÛ<–’ÞÎÁ w;ÒV·J[•+.J,,gXhDмR›ˆÅ$EYÄ}ÍQ·n8ÎÒ#!:ppRÜtǾ ¿\:NV9„eË )ó«'³šä¸„Ó@˜NLÛ)‰2q—3çL© Û]¢cOXRªI.0ýR$ ž<s¥@yôAÄ“Ÿ[¯´¦ð½ÞÝÔÂÀr@'pTŸøÁÕ$šZ:ëêø0p¨†äf+†Kq­§^¯EõÎV>¾øö¼Íâ0 ±øû8{XôX»iÂjÃiùšp*Ž*4XGeÅ÷ÜßÓq˜8Ûf׬qàánŸŽ X³ÚWÃÎAPŠL—iÓõH_vI—ÑL&¹¨OÍበÄj`%K·,Ñ;QÎ’´Ð(¢ÅX6»½-J¤Á, ÀÍÂ--¹YïW%Sv*’ÛèE´˜ÃðdÍÝ|p¢Á¬ìÉfIææRºs¿4&ÑЪk<átD‹ÇsLÙXCy¬Gä±–-*l=0T¨Qe`oÑ8bäˆP`Aê^Ø!˜mF“7ZƒvÊ@h ~®Ãde‘6Ë’^ûõÝü]I™ Ã1gÙ.uîZ`% –Ñò"NÂâ,£CE : ÒÄe€¤Mg€‚@Ü=9ÿ¢~þ3„ñÿZzm+QõôŸsãwïéSœnÆßÉÿn.Ÿ[¥çü( a'h×xÛÜÞ¹sz$5V¸ëÜ~ÿâý%Ö¹n½­çn[ÚS'±’˜h$ @bD4P•F‚(•¶œˆ­«eér/Þïo+½‰)ºêsâð$¬K©o<5/w÷„Ý@QÉÇz®³ÔqÃm¶9´3VØf@ò§ÜéaŠ>Õz¬ÚQìÌÊwNi×PSÑí>¿{?6g}&=uW[6ñ$0d§¼1$˜"B$öueÉtˆrÎÕæEfÖÉOºmÿó~ÜìQ³`ŠñQ¯î‡`-ãL‘í …ˆ<’ÃæœòuÙS¬ à}ÑÉõ^<ÛfÛ7Y[×Õs¹>*gÞªVŠ@ªP¾×ós)l¶Ž(ǰPEãÂÚèÄE¤¨ $¹/«Ž×ȾoªúÂú6º£rN½(vLâÜïÎüÈ307_Û:×€–”d3ýÿo³÷Ž£¢××]ò·‚Ìÿ{Z— ï2f«9`Ftg#Ú¢®›½„Ô7b…gNŸžé±eñ‘÷Ä‚•Ê_ ˆêQ ÁCV(BjZ”Ý9&^>ûÒ¾›= .yës'P!uhÐ ÂMÒË!½]ÂtV©x =@?-Î",[… _„uï“p`áZœ @‡E'ƀʱb!Jr5)¶¢t"¡Ô 7ÍTLO¦ÐU©A(ãÓ]ö*S½ž CŒ•ʤ&ôìŸEþ³ødV<¦?èsNc{‹êèÜ·,ÝݼBí8²q‘ U+’Lµ”@'Uà`žº´@©³ÜüÑag¥~yiÞŸK¤þQwþ•Ñ~?çý_þ¾ÅogÁ’ËÿÿÒ— z,‘ $ªe”r@€"ï@˃ Ȩ[?bð”5ÔÆÑHEâÔV#…EI«©m‘Ív'¯×z™Ï9Û9º:ÏL=™˜ÛÌ*XµÝš`˜¦å©T®+OU»óW±‘÷!êôé¤Þ¥›ä«npϳž/š+{:®ú„OÆD$`b–êv>£Í®µÔ¢i`˜úŽÓí €MalZ•b>š^< YiÃé„3ÃÊo×Ó™¯nõ]sp1Ì]^@2DJq ¥OÎ}8¥ âzçkŸ©!,ÁV\¡ÜeÕw~ÃÖÛ!¿À¹«Œ$)ž4–K=û&_§KuþØØu›·ôòYäz ÂP.epH,XC£4tdJñCìÈ‘-ú¶#¶Å*ìâ:Êr>ËÃês—Še(§4‘Ñyè@°"•À`/*U¥ò–‚]hW×nOž'Q¯Xœ)×â¡067Ûv¾rÙÐÊpÐHÝÈeì`ŠiVªˆ‘pXœ(“d¨ZÈΆ·þñ¯žÞC8–'@#¸<‚¬µ^Ì4eƒôæÒ’:|‡àÆÄ..¨­ Ÿ ’p„]%¸‰¯i;ðjî›óægÛW­[ A“²9¿«ãú6ßk ~\G¶Rð2X¡‹ä¢®÷Qï†ÒÓVéÈsæÐQßêµÍzÔŠ ¡šð–H…¤ipŸœ-“ˆvâ žˆ mîšq‘J’v€ðÜ„nj#t4èÔ“³¥&ýZf;»îµ÷¤ÑÙ^5f9.º\UßöÀ°2 ™®@ÏŽZvé3 2:¬LR¬‘rÌÕJ÷æ 1YÀ:!ôI¡p›nA‚2i*˜gž‹[Åû%h@V9ú{I:Kà•*âàˆ/Ï'Î÷SKõÿ5²Í.8ÕƒŠŠáçâ‘ 3aILœÉq,§ÕGÙ5‚Ý*E(èC÷áÝ].Bnb†M¨£ÐÆ «ñ h™,\—AIÍæKoñ;ó‚l¬CJÏ«òÞ’6¦ šš…DllC} ìM@ê7tÑÇG3ìÎi«`Ë&ºÇõðuš ‚ ô=™¢Ž’Ó#r¾‡B"'†~çå¨8Ýù×þb!¨èž5úÈv¹´}Ö[T ê¼<-4©²!¸"B¦³!Cú²=³|òÔ>EÖW=îþÙð{>ÐUÉ!Ǧ=⪠ÐíÂ>ˆN¬Ã%*†& %Ïÿø<›ÉdyÕ÷¥ çÎXWË<›:B&D”nIË´Ô£‘c£W–r]Å‹­Y€ Ç|wÏQ;uíU14«‡¥xP…Užyr¾™o‡úž$ÓìÛ[æL»/6\›æxËŒ%°Ð0·è±°Œb××G( Ó¥„CþúÚ êYÔÓYo8§«Oãx…̸6 ’Xchø…âÄk•yë™p4 oñ–YSà îö&‘¨i× úc3•…9ÿ xÂT,Î4E.éèί¸ï… {âZ^¥õHÚäñ%ÕÏ[ï^Hý2êX‡U4>þØN“[Öà{~å¾ß^¥?Û?Ž­•_ÃWÖ%¢¶è¯íb²[´Ùrt¥½¦¥2ºÆ„5R‘6{îm/‘ /jÆòV»û„†ŒÝ7·û>Öî ×Ò ™…狦þê^ý€G#D‹ç¥ˆ'œù½ÃÛXÏd¬'\ñ|ù³#®š¾Æº˜ »g²õÍyLüh=Èþûn´Ù²¼~ü¡¿gÅ×p,TZ‹l¤µ´Ív柬ï¦&5L†ÓÆ}b ¦žñÍ;©©S€8>âº#´G‚ÛÐïèwkGM¸wK_"ï…秇¹GÆx*$}Zy|ÞÉç³cŽͶüw‰DÙÍÅ—xT¬*©CÁ_ñù¥‡Ã"ǦòiÊÿÆøu"¾Ûÿq–çoòÇn…iÕ™ ÞŸÖ¯­~yk  4LSÍúÌm—ü|éÔh•ýâø5w>±Ó­û•÷9úØæ¯Ûúؘ»0p·'| Dl­¬ò¦ØÕ³³üÐÿâñ+„|tëpŸWêOÞÆ©ßyÕ£>PFcµ–kó§íÚ¸r^À1t›6Ê\;[^á¨rÀׄÂ0¨ñÜû4ˤ÷ —jÒ“/ĸF.®Rv{LiYwgä“ ìfN´ZtkhyÉS£o¹;l¨[Ú™Ð~Zay:0—Þû§ûhÓ⦖áFï¯ÆòùÁ~c&|Mc_£³ã=]å5šÇ8úâùð÷J¿õßüÖ‰“RZʲ¸¶lÆUèÞþ²ú$õK‚c&7r3³åüœq%ÍÒ~ +Ò‚éWï-o^H‚!'6-%j¼÷ Ov½)Úlˆ†ÖŠoªÔÅYkv©²Ï2‚ÙH"B)˜#vÿ5ýO!…&q[EKDBðWœº.šÖ¢hWMWäÌ(ê;èŸD½ì.èL} îT+ÉjZ4;(²"+ˆ6Š(3´ƒb ¢ …HD‚üÃK©.´Þ”N4vˬㆠ¡‹?—ÜS;è°—=Œ’c?øØÎ…sÕÑvz‰ˆÖv–wª9èæ^„¤†ÜFCvPr?Z.t$à× ®¤Š[Q$Ân”ïý^(\5p. ŒHUéÓ f›$”ö+1KO—‹«ÐÄ 5ˆeP§; \Ä¢«”ã÷ͱi¬1mb3^ÌFƒ6J¥§œ×G›£ù|m¸Ö2n\$)&MŸx$ÄIåH IDm §/ƒ©{¢/ÎZRNØ´áífœÊAîÐv™ci2ޏ(z•:ÎÆz9-œµùær¯Ügz/±IÔ‚[cg³–8”f;e‡±&&:pm(©êL ÁEŒ …„L ó0 T Š  • W´Â[齨‹¯áN³D,é‚€&´ñú›„°eåê1+õÔnh[Ó5 `P¦u;‡W¶øTC®ˆÝÒ8¹Š™ßö"ªTY„p;Æ ì” Hb07^ßÞõóÏÿ›êú‹ó¡7†àƒÿËûE÷÷™kÚPêßxr'çñΩzbJ Æ"ݽ¶oëeÏ# )Œ‚ˆ1ëwÿFuÀLí«¢UI]I(óš3°i5·2Á( LWDYH ¥øÚ28Âèxc'cü8y'ÜKÞÊ §áäãyüéô}Ÿ3ÜSÕÃPìÕÆ»ÔAMeZÛwßµTJeý °ÊÖdÔŽZÉŽ¤ªcºDá.yŸÓ|¸Þàdùmpùiê«}½ÔWÿ/óo?tòM®Ëéc-^Ùl}àc þRÏÚž5Ý'ú¾c…|ö)~È“µGÖjzš7¥¦—”ÇYÂ@4i™\ŠKÓw}h{¡Ç"V…Ä!”›c£¥á´¸)¶qÁÅ‹ºŸ)†QUµ>7óºAIëº3¡áî¹.1$S_øIô_’‹ÌóÛñ‰Í%Y¹ÄE½s^‚Ò‰Œ0â°– EHÅ"ÅÖ‰Š}žð*·dw”‚ 8p´9o ³ý¤¨êKµœ§>H¿í™Ú_gçO8ÿ¨(03ÇékÓÂ3Ça{îÅNOqµÖ«wsòºŠ+n§‘B¨é¦Îyín_è~Êo÷al=­\9di,­^§î&3ÎWs•˜'Üu|²­GÏq•UF4P•£ƒ Ij+"ÈߤEh@;8´£“ꉵT…»)C\ÓÔ[½®6®ÌºI¤]52¬JR&W Ô ÁjÐD‹ò§ãc¤íSãm ä!ëRÝq79ñùƒ½¥”X‚™ñY@ÇEðyü@Û—Ý­Ò¬³ãyÂÒ¨#µ*ªÇF-.¶Úf£•sßô…˜ÿà_Nä»3Èg‹e;MîǬô·M»‰®Ô•åã)}œðl)׆¬V³ÿº5¥X„”+&¦…Õ©ïëÒ„œL=y±x7y‚jêºÃa²–È 5ǫ߆k&÷)È"¸Mtç6 ØLkÌÇoB1™»Ï•øNwº—í‘ÄÈÁSãt,x11À&•´ULs `ºÈ$hVâÊñkÞü¦™Q ¢â_TÁøÑühG‡R±ê+T%:„‘Ý?2/È-¥ÉWì_¶Hx+þ¸TáNÁMP‚ehkÂP‘˜-[äŠ@ÕÚMÃè)Ð ‚×:3mÔ{”Þ/ÿšèë±ý—zê6B£¿u]ÿ¤6O… ¶M8Éé? éjþay£Ç¢(E*E8ÀnÍ”“òI!¼%á胪@]š¼pæ¹ý1õü~úÚ~ÉÕêl m*àP¹í]ãk€7];IÊê4¾zÖüÊûóLlÀiåZõ”^SΗ7_í²YÐfs«Çk_NPt%òëȨƒ@šÌØÃ§ãkì,wíc2l2Ã9Ãïk!’Š ‘ÎÄc¨/.LU!ÅP„¼^Ïi÷Ó†Ôm™ˆ€MÔJݦâWˆÞþYäþ±õ1° m¿ÐS‹ôÄ#å[‰|ú_§¯ö‚»À‰ä½5Sc3a ÐLéøÖ£»NÄ € i• 1Z7ïlÞü³lü ã…æ¨(0ÂÛúòë-0fþ¦~¬Éëýíûþ`kˉÂ#6Y õ¾Ö`N©\t*¹d§¦£hpÇ®œ¸0eCºJ¬fÑØ WÏnwØÌµ´h¥ÆöAU!7¸Xh@,˜‚€±ì‰æ7]˜íæBÈËiä9š7®{hö1¯úÓK·ç^;ˆ‹/¼8n¡¯’bªV_åFa¾Žyi.A&Ú ÞöÛ®No£Ì*dFžÿÆG¾m}q7$‡„ˆK؈ÀÈ€'¢CÀ2{+˜áÖ‰®¦øŒ‘²þzÏDSb„EeEb°_ó¨ÀaÛrï€ 60xÍöóé/¤ãR¯é)èIà¤8¡:Ÿ½ýa;¯2H ÒœuîÙbBâÛÑþØ¡¿$a)F ÅmË@6~ˆÒ^é1Ú³'PÙœl‰ƒ‰ÀÂÉÄe¼Èn)ù¿¦Šª„Ha¥°éýÜ_YµíÖ¼¼rœþI½×ñš^ˆ¹?_˜Næ.‡FGôÄ­^å:HÀ6#ˆí ÷‚ ëTsDT'!mme)^BÈáýsÒJ„Òƒ3Œ:2 X¢…µQWîn¯{p¡I…Å©”ónZLC–£—TÕTڇÖòÙ©îs÷»Ä-À¡jž=Ì18ãÊ$ßg¤I:Øq{S¢Ù®6A7—VIœPS°…ÐCåÇ0W‡<Úìïœ9ªÊ( ÃB¤VŽ”^ÕDaÑ Ø‹ À†œ :ÒFî!†ZknÖTîÍ«BJ§åÔ®4XRÇò8Ú÷<áij¼ J`ó¦=€¶ñ f * ñšŠ÷ø-Ì`øŸÉê½Å„_}Ø;ïûnÁŠ$vA€ýaV9˜¢¹Ü!‹@-€$RCíTÝŒŠÝÆEàš«‹jì\Á(ïÙ˸'Æ™häS¡Ã3^µÇˆ÷©­lcÐgƒI¿¦BÜ”-Þù82«´ÎìŸE‹F)r0m¹3Nx‰ä …1¹mÈ$€E>Ú°M h/ƒ{ŒºÛ½ð M° Ùˆ€kóy5ļ×ÅVšf:BÙîPÉ\ìMsû4W–8ýþ¡¿·÷çNÞ`”í´áÄz¢1Ì€Q›s8ÝF¸Înµ‰C¢è"þÀÜèÎ#t4ÓÚ]gçu¾ëµIRÂùXb(Ò.t}i}è ê Öé:Ë7Ǩ㹭‡ûë›×ù§/±oþoñ\Ôsª3˜×o&q­]ÙÛ5ÈÛÁ‡ìtNy_‘6Ù’¼ÿÌãßÎø§ù°ÃÈR¤º•ô’¥—ŽMnü(ÓºK¹=æã7üb…–êZk/á»YOrî³ù—NJ°ŒÖ‹«svœÑ#ÌBQ2Û,š+á³®};?ºõqÏ‚)”PÄ­ôûúc8FB]¯þЃÀjz¢× tsMfáÛfmÊ9™‰ÚHe;)h(‘€ Ë;aNC^ !‚7·°vÕ?TÏ6ãLß¡m¬ ¥Å}¡"ëf4}iîcsÒì·¨emRÉø óQᅵ̠Hù[Hªj[î£í‚Û¼ðFæN}­Í¿tY?JÆw{˨bøWÚŠþ­ÏÝ+ÕïÓqЏËè¨Fyª‰½`½Ül¦±ö‡Ÿ¢wiP&?ˆõâc ½­èÎó¸üfô·~ÙûO¾iþÒî-}ùÑv D®ßOÏ‚Ý@ÂÍÖ­gT¤7銒AlÖ‘6ÂÏõÑc<ÔËùÏo3œèš¥y ¹«W™ÕÎ,¯ZJeáëãF¾’ûñ Ö¥Äížå­{¡žö÷÷¿à¯‰ž÷©rz^îÚɶökmîëI­låČ웅Oë ¾ÚL÷å ÏÈnúÞ—ë6 9+3ëÿ¨ýé—Å{9ù2½å±¨µ°¯?­ß|梪|fà$š=ßK® å×e*:èx¨H2wEíh¼ßyðŒŸQå—œßpáDðŸïZ·v7¼3ÐVA}2iÎO*wqí)+VÁ Mw²–5)ÛžZ›º¹î5¿©3'+’áǹ&zÌVüÍÛ×çosö˜^ØÚwà³K‹‰=^Nê’—¿qå˿gQÖ'ZüN/¾û½Þ]A E–î-øRK:áƒé|«Sˆ¸Á_-ÿq]þ´¬TG„õ˜gã>EÀ[<ܘ²oßޕӓŽD,¿$Æç—ϯ·Õ<ŠÍ¹iË@(„ÓX%¦GÞ·XK\ù9õ®2P&@i«oLäEAH ,È¡‹#š#ÅŽÙ—„$–Ùuù‹Äâ $DåĆ\1\{N`ºjðxžñŽ3.$B@f‹RÁ!ƒýqÒÙgZ"ŽÇ›f&T'Ë*MVyè¶ÿÀç•W{¡7\×mI¿1-—!é©cSê÷r.õÈlÎ^žBÈš`;+Ží?‘ÿÒÊ}]™)íÔZ*lÆ«˜T’²$’¶ {ÅÄà_jL£LŠ…{QÏ{C罘⛽OFRN•¨!×uh̘“•^ˆÞœë;éU@ÒP,>ŠÆÚ'P<úl8¾1u;KuÔ‘p‰½ò~*ÙJDëè{Á¶e;{ƒJm'„Ú\; TûcÜ+y„ÄYS;¯Á#`œ‘bÆËƒªôö!.×uÔ1ïÖµÇí4»i€ ©C@á8Óœy© D®Å’[‘‚h•jDÑÔ(EEÔ¦(ŽQ¨¢ ÖFyWXCS 8Ü›ÆXÓn ¡ b§¢P—Ú«*Ôï™Ì„t A)*æh¦»¹XÎÙM!Å91g¯îÑš½ÿ`(J“fÓ9ô±”F|q)Á`»É€‘3þ6C+R"bJ`<Ý>™¡7¯ûù?Ãû/·Üoþø!8 ϺÑzïœjg§s¥ØN¹£H„ùɳÎñ1÷½}†ãõù¬4Ø ±j\¯×õû³wÿ6ïaLHQFf‰9^BÅ5Ò È €R„ € ôθ•QŠSR3)"˵—1y+5M§Ñœ@êôé2Álõ³FgŠ ÊSŒñÎR÷’Ë?owÛè§ƶòjAVMcNW–?5ÞÜM /øyf×Wzè—ç»àü}Øäpæ-yír ±Ó/Mö䙼zôÂi«Yƒ‘ -\"ü¢.ªêˆS´Bê÷ÉÙ‹¯jéÂì™XDk‡8 Ÿˆœö‰<)·À'hÅÒÝÉsë$Iuf>"Ø {QIUbUH!ª»­ŠÍ|ÂË•:Ñ,˜xD΢ûíÌ'0c-Ï ¿Ð÷ÑHÈ%),þ˜¶©˜öŠî¥±B0m–KN‰)5Ì$Z7,(!£Ê®eYêA¹#%nÒH¿Ú/YÄ8qåétÄ/*ôs*ú„ðl° ýµŸ˜lžguv—5Ñ«P>äD¯8T›\¡:ÄQ…H¡ µ§Š<¸QaÍ,­J¸Æ#»6ü¾|Ö oy߯=¿ž»>NÎ[gÞé÷ÑæÚ¾ºva©ù´\Q)¥”‡y¤k“2B‚)MIoB.¦›¹ýaˆö"2:ŒÌ¸‘·xlÖ”ÚÞL)ÚùdU¡ù€A>7ò…‰Â~wçžp*x sŽ bûãX´ód@UébAÈvžž®B:Le'†€56W6yrr>Ó ©ưÀ²ÑâàYD·JÑØ—ý|ê—_˜×ëé_š÷8Zº¢çýdzPˆæ ºþ6 §±1´+ϽµRBœÂ`"2\”“9Æc<øâáWïþ¤p's¤èº0ÖÌqù+v¿ÿò‘œ«?»ûÚ¦ìמëD—62Ko#¦€8z5ç´é¬DGšò†]5+0ƦOs:–ÁÔ»úËIà1ëéöSåxÅ€ɨkW^¹h«Ð†M“Š2qÚÖªxLö]C1v®é|<ßV¹QAïÇeœ2L¢ãHéÖj¤¶ô‹‰ˆì¨×ÖÃÔóT,§”1/$Îm»ž<Ò»MŸüË[?}Þxý7#~ž¼o釛šIE¦­( R,¥àÁŠò,šŽe.¨xA)1ø©aOƒ¶IWÝì~)LÛÃûíéîƒÒ©díX  ìû›±”~™×ç©z~>Ó}“e¼ô½C‘ YôÉa¦dÔÞ¸½ô—Wt]Œ`A2~DnƒT\hcáϦŠSãwºõ±ø–f•ïx"ÍìºJÛ!ÚòPø àEÚs&‰~ÙÑá™Ï¾ÀÎQ9,éuddh¼³¥xàÞž4X°à·i/ 3ve6 ,$¾ÝÂÔý9"º•œâ§'4Û>/uÈÖ¨p,“ˆ„¤é<¨?ÛâH¶ãuõ8(—› ˆn¬D·¦Áb>1ääP>#DAÊ3›ÜtˆùnDšƒ©bDŒààPfãÔ™•B¦R:@UZs®pÖ“­¿¶£k¬t£þŠ@‹^™[ëfM*™·ËB‘…úù¾¶ÚºLX7GL:nm ²*é,\^+Û¡×{YlWöÏØ¥ð¾¤TYuœÁϧ7½v ‡æñ4S7€œØ2Å,(ì–HF¿¸†Q („@c¨sIuË{#¿·þ/gbÿÏúeÛç“~¼ûþ‹¿ßWu„®Å"L~hVÖ ní¹¼!›²m.‰ªl LŽùêŒO1Zý>¯ÕéjƧ:H"ôþq;Ç¿¥½$+—œ,ÙÔláõÃ~[iìô"ŒRÅÓ‘bd°$HLÐÀ¦ÈA$¦¡Š dÃ-Òåha(/سà#P`RD¤½¨£vÛ  &Qî¸ Âי²¥šn0ÝBán™ ¯lѵ€ˆ„¬ina“ l:Érª-0OðŒGµè4ˆ‚µlÙ¢+ö£Ø›Ûþt›ÿÑ ÈâàUúy'ÿÊѲù„s™§ ,ØÓ+:àÂç‹xí ÛëwlÒI+¾*»ù_='ü ›Îp»‡¥‰aèjâ—6ddžIÐ@{þ:Ím™ç–ž·O©ôÑpŠzé[öw÷úÑk'ÆKÊ sÙjP£¶׺7ðÝÔ›M?H õpð#˜Ñßrù¥ª€£fEª  åeŽ^>ë·$Âv¶§_‘m<êºÌý:®¼Ì¸}°8™.\S¦(ªj\tŒˆ8äY¤`E#çaûèÓæ®ºuva+Ÿà€?§Õj/>â¥g ³Q#A@Á#Û´ªO‚”[¤ÏÒµEJ¢;”4ZP ˜Ò">S”!PT¼(ˆ€DwˆŽNí5Þ]hT[$ŠDˆ‚Ѿ¢±1n·n½³›eÌÑŒÙV®«b)Äx48ðßý8˽+± ‰ù䮬$oÛõñXÚÝLߌsâ(ö¨ìý$*qSºdPB‡ÜGFðœŒÑ*\aÙ‡ŒÂÜäëv³?_Ήl ¹¸‡ùj÷ ¿_µ' î‘S›­ïI">èÒÁ6Æ?5wb˜?”žÃÏÆ$@ÝÚ©·ÍVð²ú‰î ‡ >äPÏN¿œûãƒOs<^µ5[mÄ…þKsþoÍ綯ý{$ï3¹óªÃ E‰ °ÖZbã„GK$Oñ©€•8„ˆî p•>|ïcæ®ÍHŠŒn24bÞ +5É~ç!2¼°æAy{2Àkô”¦YÈ­™HD–YæJXΤróÞ©µ¨]+B_ﯷr4ÑR$²#%K´@c,1 Na ikWd.*ŒêA¨wŽð(x»þ,ý~V?’æÐ[ÖiͰ֡חö_2ï÷®ývÓ£O­– Ïáoã0TMN·Æ§ëãƒ$<ß~¸ü~8cª ÂJdÆuüí½çïý8룊Ð5›ªÀ¬G|œ#R… ^­•ÐSyõÝ¡s‹~&unè^²ÇªÒk6‰h€U%õ¤LýðÐC’‚Îâ~ŒB89 :jt!K%:#3,PyAMØZ“ ôúîåh¨ÃºÑÅí·ÛŸ¨8fþ ´åÑÇólfÉ`½6ƒ‘¨çÅøÚebï-T Â@<±¡6&À¼\À^@½8S+,ëuiU,¡e¨jiÐkXë.R®†tþ†¦^ù•(´†P¡0ŠHÁªª™1M|\ƒ"®eŒÖ4vN;!PåmUÖi> ŸË?WÁå+4µóäyàœ2-G:äªÇN,‘êÊ[²^^ž¼;7¶F÷a¼ËÆ©)Œ«‰Ëõÿ×=úñŸý§É%ü‚‡ÿ3_úÿwüó^ýô—ôR Ð€Eð"á¥M’2&Œ|aA3H=$ŸùÞ>¥ø§ê~íÞ•üîúÜÙ{pZ´Q½ŠjÇF7i5NŸÅÇ®*ßõâó Úöê¦× wS„ƪ±á;¸dûÑÇ’ztÆ­¤…{¡¬ ³mÁíÿìfU(Õ ð89'UO´ wË7È^ü½ñÑö·'ŽùžûT·¾úœ_Ú»ÕWÄ^D¸Úóô¾^îŠ)MV(QàÔÐ2¦IDA T=NhâcÙÐCQ˜d¨˜)2gŠÎY÷B4˜ö×úÙ=C—e/[æe^ºÒ-" Å›´|çËœGγ,—†Ú8hØ‘RWÐ0®}×ÚAüžó{æs„($„è1’©73¥]åç¾ôµ>9ú—œ®Õ(]6rúžý|¥Ø½Ï+oÀuÔe)Þ¦ráFá‘”aÏu'3®¶MéÔ²VµJñ±1€È NDòtYcJŠ ’•{壀ÃÜ”àfâB»A¨8%F¢±0A hSÏ…ÏꞣõŠn{QøÙ+PJ¥hWÍô€”é# 4R”uý£Þe}«}buK šâŸfô7Á4³®”0ª‡xš¹@†[ޏºÙX¸J]þ|žÌô-vz/¶Á„y[Qwô,DôR¿½2e\ùþyë‹⻄BžÕÞ|îU^ÿºýEîaêùýyÛß") :ݘÝÕnÚ>ð—Ëɦ†7*µšÀˆhˆgýµÑ®ðà™vî)›%b¾ÇÔI¢Fk³9*Ã2ÄáUäer¹)Pohn®7±Q¿ì×&× ©×gûNÄh|A 0‰¤6…ÀoæÏð3Ão7ý°kU¹…¶ñï³K•‚jï]ÅqØ–.\ìnÙ걎ðD˜Üx¥—ÏÂE-I7Òœ´eÈ?"ü#|O›mldÀM3iÁcÚ(+ ÓLÐN÷'`"¢ÆA{5žXìgë°Pï¤}„×ò:¹¥[dC,dí¼¾™¿È½轿è±”3{Û´²ì_âe\›ª¡¡H­¦¤–Eßé¾#Õe7Е˜) P8X‘N©^kêÔšµoÊÖê’ՀƪÇÜŒ2ßÍWÿâTÙä¼0ëåûºÛ‹¥V¢P¦Ü‹fG× ;â@Ôf¦Ñ‚Âõ× ÞoûÚã4H³'ø³—Г<Æ1Œ@Dªšehìý>*Ô Õ¼½U˜X–Oý–ÓkçXÐ}3CΟ?¾ûž)E•úUàx¤+ÛX@É †UhBý 0¢°>ètÈ"8G÷P" Nb‘Ôˆc•ÂvOX‹œŸã9é¿ç„ òÂÀje¨”†É öo=kÈ ˜ (%QŸ&E”œJÀçð¾¾öåkÿ÷¯™í*TvRؾ]Ü_‰ë{‰üðs5ÖÚÉ•}LîËÜ—®¡N$¾‡¯…WQì”`¨·ËŸ¿Šç̪W_åÌ󉔜2/e^N©Öš¯]†Ä`À„¾šÈF"W´0ž2 ñŒÙq¥Å ‘eYSö"PÁ¶4`öqAåb{ð´T‡Óñq”jâWe™5XV­A å ªÏ†êvvüÒóÙÅlùg äÇõ~_}ý¸ùwïË?¾O¢éá@Π†ƒÐ%ÑRD ?®äfDp¤1~Gýúmr*ü¥ÛŸè€r×V$;!ƒ ðÝ’?öígäbWP4Ý—ù™+÷¿¸;¹<ÓP–áÍ!ùÜ÷›‡´Óõò㕺Gá]ojRœ-¡C1. ÃÙJcnFÊkWί¾4ö4 €E Š˜gþ.ð¥–X ÆŒí3è=`›²ÉØñQÿý®¨<ᨺӤ«àÒ½F ´rÐ&jŸØ“ªh”啬Рîì–={zÉ`­Hcq¦®ûW;—™ýİsîé T—Q™å"ÝNVc(dT‹€î)&r¦‡Ø§§ .«Ü-Ä a2%ì#éìõÑMß@'YÏ’‘Šl¨!Öµ)m!¯Ç<.Dè"DŒVâñÒ\ŸÛrŽÊ#F0A ‘Ì™m²4ÈWew·C£‘朘8/éŸÆÎ™Zs ’*T«€ ïÚ6n¾ÅÚ©‰Ä‚ûá,#¼" ‚¢Ž`ß!|q}Rsÿýñ×:•6 `2™æˆtÏAƒ¨%îmªPÙqÿðè]Æ–Öÿ±þOÿ€åí°ö?Ûl²ÖmKÄ1»Ý²ßµÇbÙîKYWÇ»ŒÆ- Ç|¹ðËc?ì3cô?mr`Xæü²¯‘ß²] Jú» Šþ;«qÚ_¾}úh?*LÌNÔ M±Œ…ºˆ%ŠÎhK™_–¤LQÃH³Ê-²¡!ÍVó6ºÑPÁ×h 3U(ª-J(Ī;Nš¶#H@r?‰™Ò$Y‚/kMâ›°žôS¿Á}•>i€¶I;¯5Æþ*ؽZªøÚëõÉï6Ú ó1ÄTáùd¹Ã`ÖVEz®t›óÂ)8Š0…”zS{ncF Gͽ³8GWD[æÕh‰Ò6C&¿iÿ÷+þççì4Ý02\,.iœJJœFLÊ ,-\ß_é’#rD*@c(€W:ö…¹Ži¸mBž6C¨DudLÊÔôº[×0:J¤@ŽA¿²Ö"L_PH5Ëz¦ˆŠPˆ ÔH™bÀaŒLU¹ïŽ­î%[dZÀ1¢ÂØÎ@B*$ÄXXƒàc˜Ÿ{ü§uÏT"žù^(É­@ý,Üv¿Cß{Ç"•#¸/´Zö[íý,rKŒdþ©ÎÝ n]çB¦ÃVú³†ÿû#ôÕüG<ö}sèŠQ`ê^6TmŸ^ý¹};ókÓ»Q÷à/¸û…¬¿Dô—FL.•û½I+ûƒJ!ªíxÈuþÂo”“fFa[ÐNSL¹P{S)å žo½Ó±‘ñk$¼O:åžäRú§¡T  ¿ H`°‘0Ð&<$,2Ëê0:xÍ܈ä—~p³ 7\Òº!pgc<Ûb=ÏDÚRSáIU$¸?:tŸöH}ÀmsgË=5Öæ![Ÿ˜Ë~þX}6kGAìÓû$ÎýèÜÙ;M6Ë6!ƒƒù»#R5£Z©YÕÀ'FÍûŽ_gwIÁG`Z % À dA'¾¬v(ò=Õ TK[ú:ǧäÒõBòâé-Eœñ2ÐÎÓPÞn¥¿ÕÓ»ÊÊE”M°51lOï½@.7ðÕW‘}Šg-øŽÚÈp 'äd¦r—ü`—ºíDñü|¤*}ÅöHóQFÈè%DÈ5‡UDŒêÇ÷€¹¹ü±æaÐêõÍ÷©×ôºR9ÕØ¸øúê>ùHljzÎdt_}öÇöm¯í›ÉÙäXî{Ì~Üa¤z¸–‹¦ŸØ¶Å[ZTl˜&>ÇÅZËËÌÈ÷›5{t=¾Æ[ ­–²Ž¿•½ŸÿÊß©À*êèxÀcËæUõEõÔ3Á=kQÐ'X[Q?W™£äá:½baئÿð]†ó|úzÚ{«>óP9¢ŒŒmöÁŸëî²Ê9ünjýbÖcÛÃ2s﫞4уOúh0ă›´B Õ3¾è5² ¿4Þµä1ø¤ývûk [¡3š3ý<ƒ9ãžî‘Œ°âX~ÚsÝËUð€Å °µyÕJØD*ÓT ÇNhý:- Ñ2ÿÀ…áxîl•˜‰sSJ‹ ‘”ºÂOªþ©çý&Wƒ¹Ø‘²‰.:ñe!bÓ&,¹ˆ/Å2[Bâ4ý_Ö!¬\ó©®ç ¿}W_+,ðF‘HI‘uäd 9™¡ØqpÿÉÈj¬þ|¥¸Á¯‘óÑqç?©ÇÕÈò3JÄ(²Æk-½©‹[oñc‚ô]Ÿ=ÄÙàÉL6êaž—‚2÷ßlGу/?ªa…€Ë?^éY_ÕÙÈìܺU| âzlÔ±È5 +ñHÕFá» 4Î5Žx꾦‚¥ãÐ~v‡Nz*gnEd”©=ñœtÓÞ˜W“&¹$€X¡ÈIsi›VEˆeæ2³­+Ù£]À¦á*¹–‡ ·+‹\èåÅí$ÆdB¤ÅQöèwPǽÀü‚®åàýA.ˆHÓìÆ:1§6&5í N@ŒõÏq^D/GvÊTÙ'bdÛÞÕÆ¡ŠR´¢­9Ÿ"hÏfK0TGŠ$à˜ÄPVEf[RP\H9˜1©ª@žHÀȈX)Ø M¸ëþ=t_Ö®Ïêó ykÖRͲH…==R'pAGšT]u–ÅñsÉͱêpjJ· >nÁ8–ÉÓnèß?o|ó=?>÷·Ôÿ=é?æ•ß3û=»¿Êßzððó±lêï÷íòôt@**`CW u% ‰‹[jT+rÞ«Þ©û_Wô•ïn³›žÏ¦ÞÖkµK–f,„zU²Tf®ÂTâ–"=± Îë;dŠ~ƒÐIIˆ=à Qù¥Ò…k‚#Îÿô~üAGmÿIp@4âÚ€Û¡=‹Ý’jå’v7½ÓWã<ÙS‘Åô­ýh­uùNv‡áê¶‹ºØ…J0¼R»­=/ï>ð~p¾˜ZôÏ ZXg”Ø6?,¶L•ôLÐD‹)trxâL[I>¦¶höZ¿ŽN<ó™_ôj?÷~¿H¾'ÏlË|±Û`­·½¿õþ~æ oa `³† Á²ö°j†}SDX4KI‚ >ë?ÕGz®I[¸ð¢ešgá—š.Ì0‰3še6;{Ÿ'ÃPPì-CÊm »nçýF~Ø¡* 0¤ Ë2ëP5ÝFR¯Šu´Çeí%ÐߎøåsýúzåûÝ´3Z5ì梙2sH ÕµÎë&³ñVi:¦áÄbáX©`'^nÇË»ôTc¹4ÑX¹ œ*ÚL%ÄÈÀT¡ÓT·ü~RÜ`TRcœFaT¸dATþ­Á&/iIª™ð¸áì5­µ’ýE»º‹{ÿ µ—qŸ|~Ë¥‚‚²ÇqA!¹Ä¼ÀD+ÞŻʨ#΀2²HøðŸ«Ä|ám‹âpÝ”¥{e¬ânâÀçã0ZŒJœbc:µ&(, Ãdª(:’X!_ŠöäC]¯÷¨©]2oŸSà¨è$â¹îþeþwáûû=b ÓœU‰Îiþ7M#:žò¹˜©—1„ªƒÕ¦5øjJýwð½ò¬aG¨CŽK¶•+PZWÂV«­Z ›8Û•“EŠ¡I8¬7É÷a®AŸqÄCÊ{ŽwzŠŒRÊ PŸYå8íÒ”>ƒzµ}¢¬;[ljpMm©#$UPW’Æ·E¿MÏପŠh³µDM=›$.4«x…*w*Ë® k°ßåc6ÿ§‰ÿñ†úß¡^€S´‡Ø ôL«@‘ÊHj¯V¶7h²I3lºr,䘆6›<7–<¹ÆµÇoÜùÕõ篫ôoü‘6vßó ûP|ûGÛÎ*G]) '¥êKÓT¸ôAwÜX$.VÖ8TÅFVW¼õ¡ÜºèeÒœ*¤I÷¿È/iŒ¨VVŠc²1ÜxNmú5£tåêEÀB+Ó× 2gaW*Ñ4mà+aÇOœWêð/fH™bñ|L âdãê•c×–­Úû½¬«ƒÐ‰Y´3n![ Ì®–ïg{Âõ@Óq}÷æˆñS±! X1 + @HCöKÉ1{ó#¹Å¨³ëùWbrˉS^Ƌ̅£Ú'³¯®c¢Ÿ£ýèJ×é~! PB€A%Æ…H¼öû|5¡²ãkS€!1‰È˜!=%Ú׳omH~žÎÛ#‡÷þˆµ—L¿çôw¢™/ïogÖÏU£;6Çb%Ktg²Æðé»:It0 ”Cdÿ¼*;³ñ9óÁÐì„6Q€‘î QXôŠƒJË1€Š¢R ªP˜†§ëKFŠj£P[_ýésÞ¶ž5Ñ÷Ü©w•ÈàÒiê´õÐ×q1ÇÁ×úïÇ3YŸBÚVi&âh½Â,ï§–/çsb –ØVÁ\¶ê’®3»Féߌõÿþ³ùãé=G·&wxn™¡ø O µës‰cÇõ½Çé×4ðC)²ž·û!¬eÄ £iÜÚ‡øê7îqyãʵ7.\ýHékÍÝråækûê'¦Å¸¦öß SJ8"Û9¾F#¶¨T0Œˆ/€%Á5ÃÑ5`ódF´<‘†@‘,4™Qcu€TΞ—É÷1[[‘GÞCL‚¢½¡FM=ð›} aî´CôtŠKª$¯^ãþA}"¹ÉÔ(ÂEX]ș־\˜Á%õ7ˆ=U¡t˜ø€Ù¤Â½.ƒF﬑¹J7—Eœ.ÇËÒÎ÷SöÍÄ7©bU+§¾9\+4-{d=ì%Œ[¹{–’œ(%®sZ‰6ýDÚk$„e+ây®:ºbab‚ ±ü0çÓoé6è~”}Èž“¦øþ‚L«@d'äpƒµrË­{ŸÜµ›±{Õ}›ú/Bã&¨Ü¥9s 62Ê“ášýª•ið0d…*‰™]ù-)R P@diaáHm¹TÔšD µ›¸ ÜvìUñøÙÝŽBÍ7úEž*ʼnÔ.¬[‚œ\89 †¸ìNl€}‡VxeÜ}|?ÕÓp¾E5ÇåÑ›E`°L{o¶>áQ}÷Üueã7‡<\-Ï¥nmÍëcÓ˜u.çéi9Ë­e.çpd‚óí?Ç=Ÿ»?V!>™®bÜÒ0¤—ì‰ÐÈ‚’¤/ugÇ `qðQiŒ½ ›6¼„/Rd ¶«N)y0ÀòP …à–8 v  I–‹Ej_ FP-Î*ÓiÅFG¡S…™$$©H›üsà Æ/÷ø aRñuÖNiŒ…m/$ß…ãR&ÒéZ£QHqbr¸ßX»zž:Ah.à¤Õ“‹ˆ€õ »ãæÏÏè½[˜.ýÑÑífbø¤Ôv†uYëÕ¦¹fÊ…(Œ†6l˜s£Ðe!µÀy$ö[k:"@€—rBD>ôåNüc±{÷ÿ˜OSþ…¾7éµß¦ãïqégÒúòw,Ð\èÕÓoý¾»jáóhM@ôN`z÷O¶NVœU)¨§åsÑ£ÛÊo ÞØXµ¿ŒÏ+ðB~ðHxƾ8u<½ðËu(ü#ž:Ä•¿Ç…þ„)øç­ÿœŸ[õÏD±ÉM‘³µ» n ~ÿɱ½VŸÙTÀ›v?fŸL?ñ –î((—zì¿ó“•ؽ>s¡—½å_fnó±Ñ2V-Fk¤¶MkÞÃã­3üT0)£Œ‚:uaÄ7GÿIf«Í#£ÖlÕËšñSo»?_l—Ç“h¹ÑÖ*S¡Ò8 ²w!nEEBðJ$Ž“õ’áŠà^%4|"Rm¶ÕIµÕn†Èoÿ÷ë)ûûÿêø—WWêš!åeþq»=Âc„e©5«±3~Érì8¤çàçBUÑH]¾+Ñ.šÊD¢ãÔÔäÖ/?Ïç×¾/«ˆ‚°Q6˜¾Ÿ¬ce§É$F7Ц:È£q0 ÙÔѼ|éWûUMö×=¸ÍúŒ†úTݯV¦z\‡zãžAe·>ã·ëWÁo¡k%ÄB… ´±[¢–šÆþ6 ì ù»ïôýÙ£Ð)òˆÓ9Õ]%wçK'ðè<ßϘÈsfÉt+}ZU5KLª1r¯×ºš¢W¬6‚û\æƒ~Ê®L2À)p¦rƒ”]gOé§T­”3ãùÒZIJ ·”Ö•*&trÆ-÷ÎÇ9ÅÃÉYä¦n/¬º W o{­÷¬6]I.!>É‚­äC­ ¶Øaj¦û¹r`öʯ¡kägV‡*‹ÍLŠ .‚ˆ¨£2@µæH˳-Ê6ÞËó-)îYD]»Ôje”* JÚÇ›WÄÏž–(¦_Dò!v\ßr7üKí9ó_¹K´ƒÈž@ðVæ *&¥PAP‘r@Þ²Út«± QR}]Zh<Ýv0¶ÞOWùøUú¿šë¸ nA ˜‹ÖÓ$Ýsô2\@K¢´´: &sÙСjC)h f¸“ìi±é8?a!V¢”%ü\–€ÇÈt5tòƈ…-˜ßóZëžm?G›Ò´bP`%4ÄÆL¸’ iá)E†ƒ£r”\\´&x·¹ÚìF ..¤¡7Œø|ã/fÞèç®bæÆ²á¥ØÑ¨¿ügwçí¯è&£V¨ÊÐHÛØ«BªÀ*ºgUÔzÙ^œ4ue³c!¶™f¡ßˆRº¥½1™˜H•¸(·¥IQ–cM÷.н™å©SÖwòò9.´ÝXdždŠûìô“Ÿd½ïÖSÖ«Ôe{û«Û»Rmhæ.YU?é'zö¤²,÷i#óiY£ÝXƒUær$¦}U&+5ݵ½Šü›³ø§6ÿ·Ég€ þfMd{¡…‡j¨·™e€ƒ ôt·ÂT" Ü$m°¤—§g\ŒÛÞxí(¯-ú+¿²ß>Œ­úšÎQòøpÎA¯—¶ësb@jë‹$ý£?áÛòeý¶T¢ê"´òàˆ¬8 hk±åGôT¿kÕKMl©ñ‘Á?I¿S>˜P%D_úÒ¦FŸÌ) àÂD¢ªZ*m‹³ð}Âfª’2ïåp'Ñ4‰°¤j^×Éß«e€ØãœögU…Û·¯ ÈqݹÙÚ#/¯J§¡J7a.Ð,Ì6iç¼·™VÇO¯õV¿0Ä4L+ QL4\»Fz EòüQ¤?~,.eÜÍLƒ±£:d®i?»ÄV9˹Öípɯù´0iq£HE!6€€R$ PŒ"HAÆzÆ«n /R‡$ B@ˆJR6 =ñíB%-çèËó›?Ù—GúK¾£KëéU½Œ>üoôâoGw>æ‰Ô*•ËÑý®x²æÁr=s‘ùÕùèjo”bàjMËÒÃREKh¼&t˜RBeDbkaaÚjvhÄR2+‚®D0Bvj.2–òj+°J½®¡ê³‡MTwLÓt"5¸°7Àd0âXh¯…aÓ 0vŽ [d±:O"Á#Ãs~åy<™¹­ïýù<ûêsákz€^%_ûÆ?†òCIôFc?̳¶ô%ª)‰²®g¾¹Óà¦ÆdÞz,Whv:2€† c© k ‹ûE»Þ=WãfÖG0¡CvÅéq' @ Uo+ÊÀ•ÐÜ5É™¨Ó?.»0÷es7þêÉxªí3±" MÜòO«Þqì&M¦Œjì—ßÌKÿôN•‹UÊœŽ5çœ ñ½`O÷lcžïs®~;ôz…Oï}‘n‚gúÜ1/1ÑŒcCAámÕÔ.á<›cQs½[e…l3ˆg—FiF+)˜4¦`©˜8¾ÇÁ)_11‘úɧb|˜¹G7G±Ÿ´ ’ÅI”QÛ@øÂ€ŠÉ„z|Û.éV«%ôÜÃõp’›u Áj?æ0³83B@ÛhVI’ÏíTs† Ä$Ô„kyÂl¦7^Ú{ÓW»“ëŽÍ„¿®•´-0¨= „Û#dÍA`lµð¾›kÁ xØËûÚIMèÅPf(uÆôPÆš¬I+†rätÅ;Ü gFC†]˜ÆÑ{ÁŠ2öËm ¿›uÿÔóúY< ÆcþÓ—ך_Ë%Xꔾ9Ìôw®6 ÔöB¬°Ý÷κ«öŒ›Òü!'ZŸ›¹Ü0ûûúèö[ëñu¼ä«¯}ò-É=ÎïÕÀf‡s^êë]÷²PÙqs×ebd'ã¨"ö-h¹ÈöúÐX`[7=¾ŽesúÞX”Ibá]¼Ÿ”’ò:·HmbYSƒÍè…Dlø†º}Aª^Õ-Œw¸ŽêGsŽò‹bQ̸-„r€¬¹8‚™ößÔããSìÅóšzÚ(ÏaᱬÎÒ‡:«ÏöjIF´ƒÑ 0†z¦)òñµ‚+û„@Sd½¡\"1q™Ü“ö$D…¡•õ>w*šd橨^»ëÑ‘r ÝXúeYÐ ¼Ôr´£]¬`ªl³T‘KÔàe#©þbk´$H5/åèmÎj|å§Uèÿü›×—†“O6¯è#§âÝOÏË…¹íÀ›’VÍR" S=!S§¨B‰zj© pTÁ€Õ'”¶Çî—­ƒ_þþÏÿX›ùÆŸŸšWüˆzèqÅ¿çó_Ý´ä¼sÍÇ+6Wií (˜d™f?aé±?ÿ|{u¿ó–æu{ŒÑñöŒ…?³?Ê4þ:fƒ7>¿{Þ}b_'Þ{sËŠÌAhÒNUJ¥½n¥% ml3;z‹ì”}e<åC&@x´­÷´wðfëLã _–­{UÕ_óÃ/DE/ðivû—|ùü €r†´¿dnX/ò÷÷Ìtw’NèD©²CŒ”¾XðÑëwÆTràáH)‰F4 èd¸óG&.dïñ!±U_h.°“<å܃d/²¾ùÝ®K§tRKOxLœ=·—¶¯nmõ†‚Ç–*õñÌ íéòAt‰eDÁ!Àsé!õ—Íù¢á­0×nú‡ø`8gAËâö”Ö0Þ»‡Dº¯>Ž\[ú¿üoÍ'Ÿ½t¸é¢Í#dp¤ Ò¶ ÂR"ÀCVñYÜ3¹ñ[l+è¿›z—ôÛå¹jønøë‹¡€.(QQ@Ã"E››žIQ èn<ë zš$φe~9 m2~vîËw›]Æ_õæ5F‘®ãŠvÒÈHJeXØèl\̰!ÛóbUc¸¹ocЮîxŽNăè6 ›¬97ÑMUÓk82B§ê¨Næ;“öñ´gùåuì߯ßXYšæÊëÇ^!@vºïßáÒ`sb&†~Ö ÞÖ£YŽqÿñå·NWÛô}”MF€|·¶ƒ¯J4KK-Ø(AW$ïüÂlÿõ&;ŸçúÁ™õº•z[h½ž§¯®þOõÓVjºa&»?;ú /s8ª¹ûOÇ>ÜPÀù+ûþû¹þdÓôtRÞÃzMòQ{}ÅÃt††Šú#Ís§bßžšÏG+^sõ]ÆyÜ>'ïÆûÛ¹‹q}}²=«©ö.:à¤!‘®6ik }ÍÁ¡ÜÁQK‰ì %é1_·´*™Ù(Ñ#ZrÓ¬>ã?÷Ÿ®÷¼ÔµËTŒÑIZš̼Àv~¾d :-¾]ýÿyƒ^S;yã6¾vðyžž –O<—uµ€fe£@£6šŒå†¼ \!}L2ðŸþŒæo<ºgwåŒ]Í®~šö|K<Ü—ŽÌ j'é¯vÐàžDBö0Èo…€ECÚ«59¼ â2PfQs¬„œÈÆ8^˜ÝäÜÆ—ç!è[µ`¯Á7K?ÉÔѱ®ƒ\á_—žzPŸtó¸p,fòçѤ 7¥SõÆÏÒÏVŽýúú­ëä}N>òÎÏ™>3ÏT  oX{û]´ÏùHˆBÄrM.d“¯ƒçÇÂPÀ—Y†×åuØšsÆq^ˆjKóŠgÓ;vg/Òíy% öá+Ã+äJpŽùßWE‚´*¿Xõ¯õÖîcê7OO¯Z—žqú«£uýŠöžºjÇÑo¸N£J˜!ÁÛÕ¦Q•¥Ôc`75²SÈ WH* :ƒŽ²N_="Ï»×¾Yf‰t¤B€™çEìù)rj½hM4ÖÕ‚J\ß\®‡m !³ô" ¤Ä ;‡TLK}ÚŽ²¾KT˜š˜!Ñ9@YÇ4¤Ž,ä:ïË{üñSì¹ææÝpXà¶§a–:{ÀƒY>Õ'Çß¿ô§Í÷ñtOž­Ypsù„Þ–È^þáñËý_æ¿*Z@;£AÞu±XEIõ¡¢™A³¨pd5Z  pHl¸) y`W*•‚KL_±>Üú§ØcŦÈ' r”×iMªÁrþËüöíù]åYÏeŸBâ«G‚ Ð²?Ù\Žªýs òðx¾ñª‡7†.Ùs3’}_þ“ÿõŲ)ÿ£ÿsÓŸÞ|ÓîÈ•Któ÷Šß¾û³çz5±7ã³?z®a×6oö»/Þúïóëª;꤫\r8¯:½çøÊ^b9{Të\½¨í–}ËY‚š‚ŠtPƒê ·¦—‘£Ô¨Æ†¯¨°Èð [ãòŸO1›Á ÛCg VÑíÌ*•îëKûa^W/Õ"¸SV×&“§Tõs Í#kRd€²àš‹\^£+àñ:×y­úíÖwàå¾¾Üy…ÚèNæøsuÿ\m%­â|ƒ_/²÷RHW`ïÖȘ×Ä_Â`Ô¸ÊÞÆÔ;§µ½òP Uä!Š»|˜»“)ǤwÉ–!p<¢Â(1e©ó,'Á_f÷EÄá/!NH%ªÐNP ®É0М>²”íÌ­‹9S­Í²b¹NŸ5¯þÌÞýç59(@HÑN.Mûu_B¨ó‚/šfÒ˜¸  Y¬pD6ö'‘ÉùÄ<{Ì+I´Â‚ `8²T£ûÜÞ/sŸ/6–Ư´sËY¶RtÀLö½m•ÌÊó³-œ·÷ÇvÎòîÙPó˜ýж"½‚¹’;`dÓ‚÷Z, §Râ ÆTÕ±;± QÕF¼§”Îó*Ïûì½Þè8öâ!sòD±ƒŒ+Ô,Ÿ,Dõ4mÆÛ§„kÜ›eÓ=ÌR¥”Š =k[X«(KA êÊÇ ¡Ø”¢ -’;œìßuŸ€˜òeÀÝêÂψFùÖ2òÏí“™¿Ô«ÙóÙ FsSÙŸ´w>ñè†té†eiT:M\#m²Úë±,"¦ DUU×Úäæ'ô¾îùÎøwÚÿQsBx½í©>ÒüËà·sšwûÌq¹ß‡¤ÝÔFRN*†hRŽ¡¹Äé‰]ÑÆy.OzvL AŠv… ;ê{d¦$ª P†…¹!F.ª K Ѥ3¤C[ìË#&V}Sªå¼Ö»c´ƒ*1ÃÌð>›÷7-¥£+Öj—±È=Î|˜È,vꥪÁŽ’‡÷ä(k¦§ÍŽxoWïÍúŒBEœšù¶)·Ú¥&W)'£Üˆûèý¥’(ê“Ô­…Y§¦Î!i ÂBZ> ^ÎFG E’0J Ú*µáÓÝJ®ûÆ>VôŽ£z½îoÓ¦V}{³É# nÃÆ•~—Ž<ò›ô.|›r ª±_çPÄŸò–?Â3¸A¸¢‹ø(`h.K›»Ü°²²*µíŸƒ€­+`”ª±ˆÚ21e‹¹Éá$¤ÙÞiŠíúξWüø£Q‘¨êÙx4Ô`ª3>WýC›Wq=ϪõgÙ/‚1iGH•³›Åõ…LAÏÅÓª»{Ä-#X vîëÛ¼ù Ê,\Œ‘,»´" ‹gm–bæB?z¼áAÀ?B$ËíEøQ6e`‰Œúžò|¤î5•ÅÎÕ.P¥+AµâîuV÷Oñó»û€¥f™Ä„°¬ý\ýujl)u&”ÎÔˆ ÁÜ‹H¸US¾ü~œß·íîü^ê×Ïž+‹ÙN?ynµÏ/ß?[%Ù¸5B¿ll_-ŽVÌÅ@5úpRµk¦{®ÕKz­k¨ÍǬ”™¹!/ÇÔà=#\4™°‘ò‚ eˆU -Æ-äUEVCFk1ãêyãYZÊ„D@…Â4E‚’1Ú ÃìÌ*˱¯nBY êêﻬ‚õÓCi‘qYå¯ÇO«†ô^bö€\Öº?ø'}ü³õ7|ïïrõã›lqÝe® Í è… ú§MþÓ1ü["ŽøÛë€!i€ÐÈú€:ñÀ+†cZ'ð-x6ÊQ¦¯+’ ‘Ûšl&—8“ˆ˜wÇck‰VvÑ iœ ë?Òêr0Ö”Õ^ÍTÊ0‘òBBiP±Ñ·Û-OûHeA%é¶|¾zû³pî â<9.¸×ÀÃ=Gýèy|Éç1´¦ÊûÀX’Œ:žÒF¸.è;çßÐ{/®>Ô$—†FÏstæ8ÒF\Õ-eDë„áxaˆ‚’áÿ¿4íœË o˜ÜäÌÄa7udÂ^Ê,gïk’z³šÊÞ$=Lƒ•aNf2œ{]¯†z>£ÞÑ@§`·..ÑÇJ_3ì“ÇÃØCCã»Q½d$³¨Q+Ë95D †ËbD@xìÜX¼¡¢Ð„ YU-âóqh¥ê(­j/¬§}¯oÌŒ½šó5w 1M †&Ô]´AÑ…!k H|€ÑT¥¶Ø™fìß§¤©U@ŒpR4Î;ôh⺔¨âW¾ÀWt/GMµë 0NŒ#KÆ}SóX3dC èË<ù‘7ë}ÃMuÌÁ²1&š{…X8Âe²1 iÂd[„®J-š?íçožŒ•Ï~MËÅ"³ ËÈ%g©ÝМ¤7Y„V@‚Hí.Yï¥éÛ=¿:ÁãŽ%P—kX&hè1g’‘ +ŽÀ!«¿ˆ+Ý$Ü¿·},ܧ Œ0Š!]`ÆH]ª„ñ0Ñ0Ì@ã+J ‘—¼«§²m?l0¨a‘Šp‘˜¥Á@‡vÄN†]‘ЭßQ€1T¹#áfK"à‚Ì’‰ƒY J4EœÀ Œ( $ÙCßs¨h„9·Þ7½4ÁÄ îV)0)ze…­.„1Ã$%ÉÃ8)Oé`MØ»g‹?¯íÇK±ÆÔ C®¤¹F¥â´Î Ý~Ú nÿ̧Wý±€d].1•©Û6«ÙQ¦ÔˆáHÌ{Æ6‹!$.çHÉÇ6¨gùþ—{¿¹ ~ÏÐ#*o:®5üQ* l>ßúÆÏ‡Ý=ÿÕ£-dQâˆÃ1¤‹›Bf¸o÷þKÂ3#œØ ^}9è˜Üû,óŸÜ§±ï›Ì¼ÜôºPC\HsІ:@YV8„Ô•zà¶Í©v'nýB¡Öv…^üt}iUò£Ž´Æø‰ôïœÚ$ë¸Ï-ºYÒ²ÖÛBwlÓÂoU¸Ô­Ïz®qûq»ÝÉ^æ²7Žë² „³¡žÇË-—Aá¶)N `8SRûƒæ‘êë-Üý¨@j¤§í6¨!Ì϶­:¼L‡*e|PZU׃æt¡>ÑI‘Y ψ5ª2šÑ<¯>ÿïäþDÉÑH¨q>T‰³¹9–$^Õë×8{íI»¼B8·uÌö5 ÛiËÏ‚šÓPm²ƒŠÓhi]x¦¶ô°:7”qåz:Š`µ}Ò¼V³.eKg´DªDHŸ:ŽŒŸµ/ÍÌ$ µ£ýTŸRÑqÐÝ@pµ+³Äc™Ý/õ)ƒk‰ Àt@Sv¢4JOñßûáÂŽ™ñœJÚLÑñã£ÔOH­þl>*¬êºWÖ(K°a@· ‚`J(IžÂdE¯ò2ž? oìL,ßvõeõ‡A𕏄ôñ‘ÿ‡ ¡=£º‡¿ƒÍqúò•ÁØ$Ò=ö„»63 Ãq¶¢.W6r¸âƒÊ™h¬ã›òm 5WÀ±“ä\h¬XáÞ[p0cGܨ„™9Üø…®èŸ«b=W5•·¬@ï½í +–VF³ñîŸÎþ®¥º¬(Ä 03:/¸ "vGÑŠ.h†1‚È„›ÌÒ:ô~öNöȺYâ¯àžå¥ï|ÇþžÎ›ÇtŠ«PElµr£Â^Ù{—ònpuH€Åv²R^õŒfÌY>IN‹€R˜ªÄÄm'¥ ,¾:`ã ËÁu~O¥îE™HÍkßpàg(s Gr:óˆÜYGv2¯å¤¦O¤éçuSײq&€·¹õòÔ…9±×#I§j¶AÕ TCì&¤)UwÁ0X+(”„-§D”¢eLBöÿŸ0ÂÖ`!õ³Hä>è!«4§ÎzO%srÔ1dŠ’v§¹i$§ŒFìôsôcóïô<ç\` ]XXcíPáÕ½nW¾ ‰‡Þè°å~¼¾ìÛ5ëÆuz^êïÞ¿¿Ï™ú?šÿ˜¶¹y´Îl®3n/ëñOõôФ':Š—Çû:|žuWwü³Ï#¹½ö~Wé.{2­äŸ4üYÍɱ¤PÀkZÅ’2¢‡\Ê^‘ÖÈâ!›ˆ‘ˆ‰×f+›B€E5 %Œ 6 íì9· üg6RÆæV›Üb{D§ZÕù÷Z|/M'¤–®ûø§Ø™iÛ7¨›dq’Š ¦(’(ŽŒŽ¬ 9__Æ!D¿ÌøruÝ?MýŸ‹"* ï[és,e¾¶K8ÉÆâRðƒ}މÔ-Ædº –T–2Ð#öƒy0äyënÐÍ-µ5½J€À+›Cu\˯/ §Ð¹¼¦É ¢jCǫȊìD4‘xÙVjï¢S¥â‘Èž)AÛï—k15H;}üž]ïëßJÚö·Îeƒ ЇWŠ‹âȸ®~>§V´ÄÉ(Nö Öx„ävÿü;}Ëi0„E)ä0C#I•ñJ5SÊÈ´˜²I£¬àI{Z=òÇO}8ÏO_ØÝÈu¤Ž’dÚÎ÷¯ï÷ãÓû£ÀÁ¤víõ°É„Ç$ge>ƒœÝ ´ ê§óG3¯ÿÍìï\¤‡ªc.Îëû&GR8ÖyÿÜ–øeÏ™ž¶­¡ß™ÆÍérO†$ ä<á`ˆ ¥&z©„OΔõ£Ölí¬ºò†,ÆÑSÊûœH8o¡Àë÷%†º Ê„E*v@BÙ8„‚ªR„HpKt‡)ú‡Q.+²Ÿßëúª×ìœx‚þ ÐP?¼¼+¥òj¼ ~8¹¦Ð5þ3ÔÝg—ë<‚ÚZ”n1bÒÀ*C‰júH€XÐXÚN^\¨E/HÞÁgážø‘§Ü¯ ëÚ—ŸA†Ž·ÙŽ{$µ¯½ÅO„Ÿ»sKt¼sßd&MĈîùÆ¢)g‡£ÂÉ”CYï¿^o:Mœ‘ãâNÀjGª£ZMv‚ :0r,\µüFQÃi=V-?Z$ƒî?Õú‚o¾k/-rÿÎæ\'°óþ-…ƒ™e÷i×ÑÔ±vV~~Än‹™ç†©•_dÖÇXDóÍ8Èî{µBñ¼G9@a_¼ú¹,–\#?K@•¦ÓQ³Ž³%®J›ÿıˆa¢Ðª|T°`!p„À!ƒ 1ÒßÂu³2;Ó 7‹e)/è?Ë8uÕŸEŽú&ßkuãlOªØ´ø8}#ra™PÈù„CÝ*f§+5"Ð¥¿5†„%pj]GJË«ü€»þ•À…Fb@© ,V$UNÊÚ”aá0?âYù>Z„"qM5з͛­pj¤b©ôKùº¶~þÖûwW§7¶zO¦wNƒ2øÊHz¾Þä×M÷×#B^x\ ANc’HgN]Ɉ0DbJhVGñ’€fyÂÒ"<Mp x°´XöÕ8"ŠOœ tG¢²Q¤-ÑvÔö6ïùùü«§0žÊÀœtótò8jÞÿÜ%rŽpº;1Ï;Í#áVÒ€ÈDÕMùSÖZ¿Æù³ï¯ÏKúœI*”qÕu™@Ò0ã@MiP:IœÂ T*<â¶z¨Â›¾IÎ/úx¶•ó½'!žÓÇíZUôú,§ä*øúÁø'J¢kD)AûÐ ØX™ù&YÓÈ fb'RòˆTm #˲¨„0m7TKˆŠŸû ý¾ú,× òš;ú'¾&ø…òÒ‡Á¦ç9Æ]¤j¤¸Q ‚éI›~ˆn²žÔ”" fu÷Z–Ò:Jõ8Ä´Tíξ–wÄYlz.ªÁ¹÷Úæë8sæ¯ÙúÚoˆëå/ƒ²ƒÅvº+¬Ì ø]˜?‰ÓÛú´Ç“ꉌ>=c$rËX›ÔiuÜiëV²‚qý{Bµ(-j>Wל>!ýééL=àš àékiƒ¦m°8 !ëß\xcåEᩘ£Œº“>òö®,¶©eQùá±|›ûpä^Ÿ+Ó®Ôššˆ´òêÓ—yþ}^ŸÌ¯ éD'ÔÏ5çú©.½qÍŸ¸oËiYÍ£}p¥d¥O.õ›Ý‹‘G­¨Vï¬E£lvŽ8‰r_Æ€&ÊÀ 2©ÿBÈ! â„W‡ѱV™1‰¼¸bŽï6XT½#”ç´V¬ÚKNR…ɰW½˜Ô–(-Ò²á6éŠÃÃä¾AݯþÓ{ü?÷šσm×”Àd¸qúm+o^Öyaé¿Õç<¾:|eíõ„Wç¾¼»E¯-]”û®=SS$¤%Y lËMtAû,™Æ¡O˜ iìàÎHuMÈpNtCv¯Š•HÃ=´ ^$`kî‘td )p°++)ß.ßþÒçóR<ͧ~¯ÿpü›¿´VÈÂÌæ\÷ ßce|ÄAlí}=üòžþ^÷y#Ý|Wô°w£$1˜\»˜Ü¿€žßûËŸ~ù£Þ¯TFÔLBã½eÏŒ”®¤E;£žÁ'£ H‡ò;úL¶íù §å™×sí}7n~»I˜(wqâF¨f¸«CyŒBM¢Lle¡MrâU>‰<⮆¬áUSF„V#ZêyåñÐ1þyä ¢ÌÏœ „ú‹^”£µôc`á|.¿ñ€×H-œû»Û[I¨­¥/Ëã“ Ê!à :bHõÒch2WϤò¢Tˆù…QùÇ¿Äo~b\H¤#–ÄBÛe,„¬H a$‡VpɦB`Ô‰±Y:3Ò¬¦§9.*T×BDRÒAVŠíåvK4r=vÿxWºwÃðËGz|ÿç~ûõðìï|ß]óKXÄœv{N¨ÕÕ-d£˜ª¥T¾<î•Ø ³Ž°À iGÌÆ ×­E×Ó LŠÂÞ­Ö'p¾}Ç÷|¬71k[µÅgzUH•d¨bÀvûk¿û!Ç+Ï~êî¹wS=‹RɇW7…þœüöìèô‹•¶ÐýG~4gµ"¥T ø„ –‰¯XÏH+3ƺ“ö5oÒ•ÞŸe™?&÷©÷·.´ÎT€ŠwÚ1(Yqa1— nûÎðJtàð!q˜=w8~®gÚîîñƒ?­Þ?¤q¯‰ðg9†Æ©¶cO áŸð7ªéqz ¬²#ƒèÿÆëåÒ(£¢Ä0G¸èuRZÂCxmÞ6‡惗Ž% Ã0#¸w@ ONÊ[A»Â-íÚSÐî×ã ÇÐÜIqìuÔ°h¹-X(1f³j:w8:>ÒDkœ7çpœÿò<ª×–œô›P»e´ºUǹUÌ35”Fq×@™ Z¢‰x=)½v!Îé}¾˜Øãþ×]áÚ}&Q+ÆåM– Kl2J¸šÙ¸oæ §¶•šr dX”,5ÖxžW> ^Ñí_Ћ]ŸŸ{ôÅî3’§y“…UAmú$Ú]Oµ»>N…‘à#‚<ØŠþd-ïÈê5P§.¤½§ÎrFtMÅ­È´6ž`y´¾mÑzößmx4u4´½k)õ(\Ø:¦qÏf(b+}+ãB¤Í%dGM=Ñ¡(¸láj#,C*èÒÝðŽ;ÙÅÎ&ÓÐ .ðBd„ű¹ËОε óœ‚t©œ¼S³ÕÊ¡Onܸþ…—í¡îz0g¥KFjé8g²Sέ–@q¢Ï|7Dvþ÷Ûÿ­ò£êO’ó·#"RÝìhAŒQ+‡+(©v+[ÃÒÏ,í"Ôh0cUP¦Ôz·ËÏæYÚ‹¤A P @Ä8F=3œfìõq?_´ó´Ü¯ÎJ“ÛÌ[©ÌpòLuÝUœ#l”D:œÖÀP‚«Ý@É`f¢K@ã3AçvþBó?“oTJ±Q£=俥œ»w3èqd¤«E‘À5V1@N¢´$vs­Pn>…¨Ü2kTƒ•)PÈ|ɪ€òGéC´m#Äx™¼*2· #óÄAD#$QzñÄ2XdCWtfÑt8±2g±†ëÔq°#/§ÙóW…>&àˆC-”8šiæ.æ÷´5”(CTLd‘jLQŸò™§}~寇O—Û{›@´‘ Y20•bC#Àå‚uÓµû¸OÝõy2ší÷ßv:æííd+gɃSÇG³yáN áqý~ë’…þT!Šª¨¯çet“Ãɶ©wC¢œYÎÆ=Ÿý›Þw,’´XÀ¡¶ÉÏâËwÉ1oO¶,RV¹Ý.*»òŸ{žûÓ™[çW/p§w±© qkŠd4P„!®˜`±ž½z°þ ˜•yž¢ZÑ*ɲ!À¼ ¶xrP·eû [ ŸØ­­Ñwðç ;[Ón!3A­¿¾ù*©+Oí×Ïö¯‡í“t²+Íj Š8W¬‡o·&¶ntqÖµiÓÒª>ƒöOï¹é¬Ã¨»- 1/{ ªe~a Ä:ì‘Ø~>½Âqº0þÂM¬¿îªÂ“?ðǹÌóŒÿ=¿õ±ý~Tt?L5&¢G¼ÂÔRš ðiDÙ£ƒ·í1ˆ“1´¢¡aq¼œ …Áì ³Ô<’|†ÛYµ Ì{&§j>iXmuÙì8ø‚Õo+S݆??3ß³þN}ïX?ÒÆy[íYäﯸ/â_~ >Ò«ÏBËÌ£õsËgc|4ØÈ)D'ä·â#þÇV‰y#Z¹&°ªdf÷eæªã?rÃÆâÕˆ Î`)”D\ s¹AwÃ-æd<Á jQÀ @øÐ<…‚WŸ©ý?+},ië{ÁùMÀJG¿†Ò7m‹n=È«Y­¨ˆ k¨Þè‘myŠf¤Ë7ëûï°zê ¨ÅwÜ/u%€%ð0ÄKޱ3lßñ¨k`QÔE{|Mõ5IˆÚŽ™M‰Õœƒ—§5ÿOƒa0§•^ Üyæçvé†]Ð×Õu‰GJuŽ<2fa¾o1Êyì…å Bx ƒ°eŒ¢EBó€6TB§z6Q­ù|†¯¶ugfaeyP$(ÛÖ€—(8&¸Ü‹€€Ü¦¬Î–õå%B'â¥!:Ì>¥ƒÙˆ<VÏŒ¶:Oñ&eB×€Æ7¸sìÞ?ëìŸÎÒ~]÷êûÑqé4 õ¼®ï^ÿ÷·kÛ\ÿõÓ+UƒTI( ê$%5€IJIEÊZëÖѵ´ÖwcP<@¼€r{òöév¯í/Gþí) %€µS2€àP†ÌšÃƘ(†“™å*¤,오i ±’Õ˜KÜ ÁZTìõÀµm"TüÆËñ87xÙªG“/¸u›ç1‚mÀòp­…ú¸Ú(¤˜i…NÄâ@²Â©1¯LÏQ1# J]p<ŠTC¥:½¨Bü1Òz+c¦¸•>ÔõþçW¾þ|ÔøÃG_óÒo‚™fn_åjël_mP|Fû í¢ðLó{ýúݡ蹴ŽÉ\WÄ“b®/Z›/Ô¨¢Šlƒaº¯¸,£„D¨”î,½®ŸyWü/‡tŸñßnþU-1†«ô°BN%×Z¯tÍÄAipâ`ãÈE¬¸ó¹ž]íÒ•å£tÂñ—÷#U'àÊàÖ ²ÕžjK_=ú²ú­âð…¿yÇ럵Â}TÿcåU6q.‡ÎîE„½¢Ð•ã<¯Q=&Sã|ìÜý}[á&H˜uèÁ”Q4cìbã§âÊ Hê5lÒ€5”fÂ-²žë üZ€“ 'k€Býî8mì†É¾%.Ji?PŽR?nï\HgL31ÝÓ’²x<öá×·òøË'çÊŒ‚D’0¬ÔH Ǥ,¢OnôÔØój/‘»ß;Õ!-­eíu< ½YÝþvi @`Pd¸VŒXI‘l½#镬è !‰(À½S;»z¦ª•ÉÓ!öc’¢Qràò³NEÙ]z7q/­aâQlÁi¢ÃKÇ™Á µô‹ù7þaÝÕž‹ÖHksV9¨2žO5²‘“aßÓXókÌC)dL–_®“nѺ„¹ˆM{çæuM{gá;§n;¸&¥¤TØ¿¶ÓÛe½ï%3£5!ïã;ú=»KR2U„%‚³¥ k˜ÊI©EÄqU’c<.­ÂoyGoõ5ˆtÇ+€.YÞ_#j0/T~­Ö»Ý£¡$Ð"t³$Ž„"A¸ƒkÕ+ƒ gûmú€˜Ì5ᇬowÙc^U…Dp°Y_=¤…©øÓŠ?@±0mG*Ä:êÓøÙN˦ P¬ÉJžØ§`¼hÀò*½Ÿ¼¥$¯ më™oÿÙ/øÚßzÈo°è£Qzì^“õÝà¾{3$DE !¢|IIq)¦b8 (bËRBiŒ–jòRˆŠLT¡YÖÊRôÌþó¿÷ë£ÞÞd­nÇ~¹Ÿ½ý•6ÿÑíg~eI°ö‘=øÙÔÎBí~¯òñÁÖݰ]bYʯº¹† …Šp§Ï‰fŸz©//žCu÷9KÝõ9׫Ï|»ý¹Ãá:^{kU@ãÚ{‹~ËÞ'°Ë4bÀSSò¢F èX” „te¨&]à#´>}/¥ÝyLÿuܼÊû8é× ù%Æ>QW0n–h½éíÏ]Š\½=Û))Ãè/ÝÉç/þÈÆ€9W÷gì¿’û†-jWcÚ¶{eðF^§ þŒ³O›ýµ¦²O×üV ”¾xš¼pbL~3Aµ ÇiÒ¯£ä‰Uw5ûÙáÒ†ôÂE¤)DÝf±1®Ð÷ªÚp!†¾äÊ¥5iºé¶bõÌdDw˜¶1¤¤Üæ@8`ÐA;pRd5d¤w°¼M)vXWJH;Û¶14ô×!JXzÐ4Ü<£w›¡`.w»&oÙ7;ÞR*–E²‹q\é¼ê<ð6uL·ýu|~~o¶G)ÖÆKsɺC¤Øaó¶æßLÖ§;Š˜<O=)ÊÀT,ðÀ>#4K‡ï÷_9•›Am´F¦H•¢C@â°0 ¡àE¼0U‚ÌêP¸M11—¢–-¬HuhŠ–aºA‘Æ7ÄÇeÓ†ˆ±ˆaa$†e¸€cŒßf²8ZêÚª|÷¡Æa¿¿)MÖ¢_×DÍÇŸ}š ît ¶¯¢RMÝ#gB†h.5j¿¶_ò˜.ï‡Ö%¿eû¡ ml7²eÒóæ«2t?ºŽçhp¨µJ¼Œ3Œ»qºHX’Ò°Õ'¢´A'ÚËz›ñÕwtçá˜(tJ§#YèÏ]¯äÔɯKý ²yëu¿c¾b‡hõD“Ó™éª8$£„’¥)³Ó]lÐi…Ë#Lì8‚¯Uây 1 ºa˜!'ÓÑÁz?þ†»…qlÌO§baÇÔ‡ÄpËɹ¹}»ö¼DÑ•YngÚðC†ØVa¡s¬÷¦öUpX>qh€£Ù‘R™£! 2B“º`DTMPîÄ…nbÝÁ”rÚå&tÏPÆJMuª¢V²Ó=FZ0AK·²ÒE+ÂeéÔϤKÒ¿\±rÓ¡PÚÔ^S]óÆcåvt±wÐ\ÕN­k‰³ý72}æŸYŠ%´Â•Ø .œÊàÇ·°§Õ™Û{yÑ,‹ mƒvSÞÀaµy¡Ø¢‘{Ç÷z^o²P…âÎ$’éjHÊ.Ì—èR¸&Rdb@ü±Õ±\Tˤ! ø<óŽ5ÅhÖµñ2ÌrO®=ýžw8ØòsS„‘ñÔc¯ª)}%•4*m$@¥b¦9$A×híªŸƒ|…^6už°G‹¦l@2µ>ÏgWZ&$kò*ÖRo.¿Ó<Ó¥G¸SYµØn`I–°Îdõ¸9‰UG2È$>Ùê#ÏÒt£ C–aã*yöCÛÞ¦ai”Ã5fÚ·‹"¨èçî£zü¹þ?|îß9þãõÿ|î¾7ý^}¨}.çš>•ÙÇ‚î¯+‡~6Vdͨl¥Ó±*Š#8rhpPZ'­€.”ÄÔ9U@ZœdÀ®+ANá„"#ÊÁ®4®¹¶³±tOµ`.9äxÇÜ{¥ªóci® RpB,¨qÆ…#4\û^¯’Gü(Hír ÄPR „@Ä …íýXoÎÇfœpîÓc¸dj1屓4f#_ŸvsíõõÐýø}vÖ×ñ¾Óß ÿ„+œAþ÷âJ¥Ä?àOy0€…)Ã(žQÅ Yp\¹•b ²C` e0*·)oAÔ˜ºÂùx篗7ä'6¼0ĈaµËYg®Õ»è‹õï+um{*&Ïëò{œxÜYäE½P+lX%58dUT\;“L©F gF’Ï¢Ý)ŠåÀ4ZºÊ¨:‡=î;þŒ_ô¶„$V³‰ÏõåÏÇkwˆó÷’Q0ò:û<¤Ÿ†â÷¦ Òª‚Ÿ¯\¸RÔ H"5ÀðT°6(@`@+ð­5°Æ"ÏyïCˆí^H‘…ž(,}mã<‰¢>ª8@I T@>3ÉÄ© „TÆz@¹aÝÛ«¬6îµT­`­…k[¸°$D&A½Ìö$‹Ü ÔýêÁÉNšO@}àBk^¿øöG·—WÞ ¡2Ê vÈØÃÉ€…GGFF*ªQF†y]î¾ZÝ´43¶Þ=P¼îIî²Iðá™ËÇO¿çîýߓ޶>Rª)7¶É6M&R…YÊD15¦†óp<¾±Ÿ SFG§”¹¶zžvÞNxô¸‚ݶ BB–УúWØO—IÎb©Dïg­êù»;³ÌN$~5P–.¶ÚdÜ*­‡4 ‰!‰VVq½™E¥]vÕ\›YñVTÄáäÄ_G%[ï‘Jž*»?|ׯ;ÏöÉîüå«ûý§ ù›…üîž_úñÿclÿéžê¦lÊ#´uá&¢H­¶Úº½ª¹â,ÛÓ‰×ßÚûÁëÔ%F¸eœ?)ñsEñ xp Fc½Ôá¤UvüV}–¬ª91;öÉVtÚÞžÞn>FV¾5©w|Kù3(þNx¹?ÓDÎi0tÀ8vªm©RŸ•‘»Íl`9GÐâgÀ V†Ð!Îo·:ƒM‡¹ÓÚAKï MîɨGçÓ'íœÇª—§«K!0ÇpÁÊÚUW‹;«×C=}wµ¾¾žå^¹•Íoµ¯'éèÙ¬oè±_Å^Œ–|ív%ú…~‰<7,¹Ú•ƒl)W°¼ETê=‡ý’$¦ˆ• «¦òØ+óÊ´=ßî+éòÌNk"§Æ6ž%©& ¹ “ Ò Ø.p”_íÁú a™aZáæz>/ëãL¶&ŸY) sõøÒí;R ž4½&HrÕ@¥J,D*8òqåºäHYvM1"*~áYz€ú…¾õÆ £*Ê ©Eâ&$Ò¶ñ+Õb½BQ±uì›Å}&Ÿ•„L /’€“MvkzV¹—¦¿ë1ä~uÂæ÷§Y¯ç{£Êx‰¹k~ÁÊ-—rᙳR¢8½Iä… h|F¦K‹Ú0ê$fRm]s FÁÓ¹¡Qƹ„Y0ʨ£`Šä‚äöZo‰É ô3§Xç$îüF” AÐÈC” ŒˆAì’ÔԚƟÿº–û·ŠÁ¹‘À"?ý/µù›·¯×~÷'ÿúìlm×·Á…AOÌèåã.¶úõß|úÚ¡'0 ’P¶!LM2@”UÀ€€1/es`È€L(A ék?«\{óþ“?°WÜH £ ±b™õP…‘è—æ'¾ˆ? ìÙÛaÒ9Îv"*B̡Ǣ”‰i_ÉÖvcí4hàD eH¸oàSj?ÓS’–¸3h¶ÑD»{XMóPnóÁ.¹À¶dcBݼÄR:i¶Ðõ±¡¸Væ—á1h|Êz•Z»JG“H>ôÖ+"® µ¹¾0ërhJ\,áŒè½ï7[ ºÑpâQeB°’.ˆOšs~]²}§w±îŽ:× à#þ^Wˆ~„ø­ø"xÞôü6+ÜÎoü*BM~·-‚­„ ÚwÂÓS)­ ›ª}‚ó<"Öõ€”ûÅ&M†¤¡Šé)¡;ØêítÚÈ·zÓê3QLa"è÷"ØІG@~èóóz-"Èä³[\¼íÓ×Çÿx‹ãµù½†µ2±ŸÆS¿Ÿÿå×·ö´¨’bA9£²†‘e©,œË™6¦ÊŠH.rƒ\LGX‰½œbNºÓEÙ0½Š4Ciþ10Õ¿˜¹~ŠÒi6^ž38ÿùWüÂÏÛÓçù›¿àÞµ9Ú")ƒ£ï)OåNÁ–´¶3ŽPÂ`(“œâè¤~ö _ïÞýwÜÊAÔ’ôäîòŽ}ßÍ¢×K:íh–Üø£—¯æ‹î¾ÀdCÕ˜^H‰%•Å!¢ÿÚ­0(€t£Z;­^ÀÑÅ÷›ï¡Û³ÿøøN|jê±J!·ðöhëÕÕà·<œ dDÕ¬þýòy1W*‰mwƒ¼7ühsê>J…òêü^ÌÕ›?RƒêÀ‹»Ý¤£/¦mŽþ$zòª—Vz–ßhdØ?ÿ¤ÊžÓ@Ÿ²×5c]_ø ¸á­‹ÛŠ™.1@Ea ¡»ô˜/ù‰Û‘Á[¨ÆzŠá:’ês„É©q‘ð!BÐL]À¢^~¡‚!›æ‹•Žn£q{W‹óuÆEî&¶™¼h(Î’½TÏÆKø÷~â[7Æ×-ôWŒÝÝuuÈ-‘6Ú06 ¢ OÊÐþNq óY»ÒšÀB»A¾:+‘hºrøf°#ÇpkeA•Úè3ݱºcýHED`Â">NDvSVôÕCÙáQ§tŸ¯!Úv Ò%\ƒÍC¹“Z}ÚÀ1ÇêsqAQÇ,ž¢^ðyûÜïcü2xÓ&Yky,®ý€”\Ò #Ö>2·òâ‡ëÕ½ÞjÔí_[¡Ó×p–&M²¹¦g&‚ˆ0iA@ ÒpH%m ³!€€eQÄ©m»Ñ¨q%5[¥A!¢}‚$Tº5èÄm7—Œ…k&Déö+Éž˜–Wléq:{–_´¼¶ñ¹ j;õXùÌû²Ï6öò6¹÷ŸÙ3$,õ¢­P‹Ã ì$¢t]ÍuÌÞÈ{ú +ë…5·Ä«Àml²G¼ÿä9³Š‘í^+p—׎š€hÕ(Q×§ºc³MtG&2ÜF9îa‘¬Åî (9k ¡•$;![@%-ñ¸‹ü9;O±ËÙÓd_§gŠæph€µØÿЉ–vài4›Råø^½µ–BÄMÅ„N’éä?å-¬d9dzž%¼µ­#½Gév•U”‰§én>ä‹úqÏE1dGÌk&ŸÝF]i³=ÓC! G­‘ šlxèÜ‘¸ 3 Ã%ñ ±ð*ÁÓH ðh–eª$“8 )i‚órVÀb ;òÏ.^\Û]“3H¾¸bæç¼u[gTÏÎÕå V ,8Àš;qþmÞ|¢9a4‹•¾á^=ħïU³^bŒƒø1ô ö<²i¾)ʱZ3ƒ *ª^$ —óD!29ÅÐàŠí”`¥GU?ðQW}”»ÈØR¬u]’ª/„VÐÌ1@Ëp¤Кƒz.=¥Cc¨J¡]<{œôÑPôÛ‰þàéFlÒZŸ1_":öÅzÑ—’SÉ–rZŒ+)¥âàj„í«´¶'ðpR'ÄLÞiôE>q8 i¥L>Ë–ÏyÇHèx”Û¶¥F‰½ 7j/]­4ƒcóÄŽJȹ]a̸"¦ivf“|‹w.T ×á*ýjÈCÔ–Ý5XûJo‘MêØð¨EÐÇ?ÿô¯OüÛCY¾¯7·¹<úa2º5Ø&öHz«ë™· ëÙ¹×þ%ÝÚ Ýå¡j,ÐØP[Ñm ¨ °@M("´`¼JB¸ÆÞÅGŽÚ¦• 2ÖP±¥ZÖ ‚ªÒHË4v ¡¢—NÇöÈ×ùæ]º1ñ¾[¯*T{×M‰×˜¦ìU¡žŽ$Í‚ó?ŸÜ88F)Î HMH(4)#.[¬–ðí/Ž=˜Ž,>gúꦵÓÂú¦¬9çÍ^)ú±ãÛƒD¥¡øW ÒGâïMÿù÷¡ý=áoþ{ãЊ ’PŒ0©1¨D9YC¶à•1v'9`0Ðn§S8®Á…À4ßg8ÕYÿ§Ëo³çùØÜ瘩¼Éu.¯LQùžßÜû¦Ç0óºØ3¶]„iQå™{uc¡:†!]ÛŽ4 I'gm:.þ±û^ÞÖ€¢ Ø’¤mAÑÄ™7÷÷üž± ÊZ˜8–Âú¯^hxã9-žü³ÔÈÌÀ x׉ "È^Œ,´nx@ PP€BÈT°…A 2tæ—û !óhˆËqL…îáÈt¥„ If´¢§HA-Ù=3’ÃêÞ™ó¬z”©ß2Û?T_ºiHÚ&Mz¦'v„‹™{¼çþ‚ÉjUÏ»Zs€©OŠ„üÂü£ëï/HÆÈf"ûÐHdLM­ähdTS…¤™‘a_NÇ.àŽŽ)J‘0ÅèÉ1”it–ó­0]ô.vyë’"x ó@&¨åÙKn‘\íÙÅi·6ä¥íé˜h'Ÿ/ˆuU)€ "·qÕ !\JX'¾éöê=_öóÖÑ(]K÷î/ã>¨WµŸ6Só-èù^æíS¡³ ‰¿ôQ¡$uf,ÿæä2“6)Ø _€B_:b+‰.x»ð얻؈ެähXðê%’烽â%ç G ›-«õ¸9Ûÿ,˜¿6ô†‰Pû¹?@>Z‡ÛŠþÈ݆Ӓ4¬Ð]ˆ;£A3µ¼ËQ ¤u É¨7ž€D¿1mäoÚ é¡1k±%§k Z\Ñ'ÇjÍíóQJ,ËÞêãÿò¸°ïðòYe›î²=Òž†Ž(å™îyàYbx”'€¥9`)jª™âC8ª%,ê;@ o… !1Èz§t(Û•/A,'¦3 1Ñh ¤ªÀ‡YL —ÇÃVÏög¿š¶¨n­Ã=«—»Ï™WY^c³¾ÒoÛÈS¾ÿDÿà¥újÒoì#Ø»þ‘bý°²³Ã|¾©†;L¼š`•ËÉ=«*™*¤,ñ³õó]ó+„í@*fŠG”`0pÁ)fîËŒ’⊵.Ì*‹¯âðGÄÆAì¡6ªÞæ$íˆJJ€³0ð–P[k2&_=5É…Ù«ÛÞÝv Šh·Kø¡ W*ÀJX+W¢+#Ô8ekî*j\)gù@ÊK%¨«?‹°µqÛW ŠU€²«¥¼ JLšJ¦µñ.B#k5ûŽ3#èç6ãßÔº|½½2±àܾs÷îãMWlš¤ò\ 3™Þ#¾®hf~›ü œ©ŒˆØ& £ç´{¤[ TAšót§õŽŒ¥æÆÊ°·£ê±¾!égï:Öü|9èËUCïçðr¤¯ê ”MAp€ª"9ã C%“b‰,ª:Í^ü¾ß—ŸÍÛ‡t+½¿$ým略ÿ|î}ùîfmñ?þ0³ÐrciØTÝïB{úîÖùi1¿0בY`$tÊ``(P€€ˆe*!@bøýǵlŠíÂc/þº™¿a¼>ªÏ\-RÂxTCýrÊè5j&11Öæ2ãxFVUð6«¥Ñ ¾<:@LG-ûE¹Rñâ¹qOºTŒÈ>‘ˆø–ÓÌå ‡±ÜL‡‡2€¯Sàb‚¾ÖT¥¯K;vqè)«­XúùjäD÷²ˆe¥ÑH(¢°ÃÍtW½1{!=4ͧ]lWp¡ÃGÀÁPúWöÿKtÓùß9ÿ͵8ûÚWZÿÉý•ªü«´[­#ëªÐsEùïGå«J÷¢}:âÉ¡þQçÁCBç« ˆ ©3PñÜÔI9Oôimæ\0 ´6m™"Î}1•1P"©οˆÐ_ ô/ºøo÷Ì_LþÓà7øô<‘C6 ÖÓнßÐq_MSÊ?©sBΧù“ÖÅy ÃдçºsRÑ®¶~jÆñ?þúüä/Àg–ªFšÓzQ/cÍF³§·½õP/3\lÎU©DÛœÜß ‰a­GÌ÷Í/fzMqqêîdcìòH¸‘¹#YÒ?Yš³×ÁCiB4gÄišv…#ž–û|ÈÍOâbÇ󰎲Øt&CÕ©Å&'{@7¯$æK¶W^“ýÂ>+bKjLjˆZï¨g?ÿœ®&pO—͉ùíÑÃ;"ÇÆƒwËxIÖ¤:ï Ápçê-Ù¤mw*¸æÈ»?Weî´Û·¨ ¿FT$ x‹äù´xñ~uîféù‹_ºþüñ–t».gxüW?u žwá7Üwë…Ò¾))3_a­ðí9`d%ëîÌåËóªK ¡q£q£mJ¢Ú be7ûË=|ŸÀ&Dìºåñd7?‡ë=óñçuù¹mžSòëÔJ*:4 C”UŸ ó±)ªòoÝY‹g•!Aq“°ÈU#ú®Æ§6¨Á\¼zï;´Ï3BÊn ÜÉwéÀ¤9”Ï"™ßÍ×–Xª’MjqØ …·1BñøJï0î+ªj¤†K&nÔÑø3ªì¿6÷J¤ý\×/HÊïŸÞ…ÿn¯™užgý lWùQµÂ¢8e¨L^ºƒ'ƒ¦z§<Ƕ†ËˆØ‡Í}c”µÎx§*ZH6"‰LÔö¸ªÎÄ T†X.äR0à¡ [¯ŽR‹]¼BT}ƾ¿D ù!‹Æ'Á¶4û/}}Ýëgoá­ñó_ëì­ÿnftÝóú-W2ÛÒ]îµ¾b£ÚMeB "~J³æpâ1Ó]Å, åe*€3@$!¢B‘hZ,‚–æD!V*n-ŠH9 I}æe¤ÿÎïn~¿vàíùÝå㇃û®¯ßÿöÏ¿4÷oû/ùøûõÁQˆÔao ]FÀyA"„( ‚œËëÜøÄß¾ßÝîKg~2Ù\ü¶2åø¹_×ýŸÆÇ«óKÆÆé•¦3ÈáŠk?qq§}!W›ð™ŽÁ[elìñè@¥Ë-xÔ50ÚôŽ´wÌG~6Iš"ËA(Oè"r\ü—慨U]]Ã×ÎJÔ Ü1GãªÒ¦>¶á Lù6÷ž½ŒWE $¾2¨ò¯e~ÞÞÿ>t"ûx¦åÍ; D÷j+ n£ëŒÅ,"ÃÜM!Jü¥Ž`¾q¶¬ÏÞºoOõÄ&¹fë¶fd¦È£Xw_fŸ9=æÏš§2×ûo–ÕV0zÒcÙlIÂê$ɰá.4 “Á»ž00\Z ÓøÂÝ–>åRÂÔÞåKÚ~@ŽèA6ÙÂ;œ%+®皶%IÃ#,ÅNiqŽnÇüz«ÊØÑ€jÉZ’G¥Ù6€±Á ƒB¶² λSǨ;ÐÅ}>ñ{-]áÙËÔKÂO!v–Ÿ^ã–êÅýòÉ/·ût\»ÙPÇâþÜ|öÊcŠo3ù „aQ @@š†‹A5Ûã:­ÁVåoP. )˜Z=Y«Ýžm¼„ ƒZ.Nr¯Áø$^M€ÐkÛ+:ïÈ34&? ³âvò÷¦}öÒÔÕâãŸônz¬ýñú-m½Ü;Û7äÚCée™Å’ƒO‡yQ$-xhÒ,’@“ÌIRq32 D ˆJh‚œ¨Røjíªsq«µU­€¨òX@ÊL` ÊÕ0Jø¯ÍøeíþŠšUÛÈÚ/3ÒÁ ùgu‚é-ƒH-º(¤ÔóÄî¥csÓ* Ùèç F?¢ŸaCÙGÑœC£sY÷`H×$“ð8v–Å4ó˜L›Az­=°¶ýõËøîŸ+ñ/xóÿ7^ç®)]f$AúÇ.D;¸B ¤ÁÙÊëcœ†ÉÇ]†ȇ^öjRz¨K”¡!Ñ1 4dÌ`XueÚdcyzBE ñìßòìªO¦¬¸,d Š dÓµ[õÝf q¸b1!àæ§Lßpõ?°_ãaÕG/o{éw?ÞK׈N°«.`º£nQKšæá/ZFá°øÔÆc7oe÷TH+O´êh4€»ÐNs˜—]™+Ô]LÈðÁv¸+ã`tsˆ4S’€¢0ÂC™€œxôÆy‡ba!²"‡')û¦ªVÊjƒVU»ÄŸ÷ÇúžÓW|íýß—Ö—/ÒE eÝÜ^z‡¸ñÇcô MÞ¿|ï ÜŽÒGÝÚ¢£>M UÆ aÅ8•@bŽNø€&Xgj•îÒ¯s˜I>È)D¸/sÅÌ -Xå—kýÌ®³~ûþ\èRöR,ÐP‡i@§i@Fb†… Àá´ð€r%É! r“È q/œÅë^9v˜b›aa¹&_, é@)[í¤ZÞư¨$!·f-ûá2ìL²@eÛT])ºQŠƒ1ˆ(BÃG0f|§X߃V[àWq{t î(à.NØI;ZMž‚¹0Mºîfðéãô¡Ù¤ëŽE[¼7Ýû Ÿ§¬ÙBêí–i8¡ôƒ=ìÒΪ,Í_Þþyÿ&ïööÿ9þ ¼wýçVTÞL‡áHF@˜´Eïå¥ÿXü¢©&OcSk¬E Ê"FÖu-¶j[µÊ‘¦`ê 脪Õ’®ÉËœ«hÐSÜ¡ÔV³3à€dOÅj%öib¡KêEwÈ”}¿m\ŽáC=?áã™æfßq¦“p©««! BCmFug×ÍŸSÿZ¾H’0óv¡[:¬µO„ZzðwÓßîÓ`ŽÝúëˆ=²ðŽsFj âšVÄ(• ¢$¥ ÿ-’È'‘±†bŒ£.±“ˆ) ›òd¨<‚mV¢‘FØB˜2œ†AZe†tŒ9R Mrt†±¦Œrjh:Ëz?$ÏÿQ>oÖSæY: ÷3çb%UùÎJ«À±8lOZ†Y\ŒnÉIùN²¶ž%H¬uô¥_Òž}Gë òÁËF­­]£u¸*õ>'óUÝ·ãk†tk]‚J¸Ól„*d«Sw‹ TOÄ*Û?j‹(¶Z\_–ÿy›Š‰q†•iÙ! ²i`¨õ%Åmr ÄJÐP†ÚuÄJÍÔ‘B¯‚zHUo¬z ðHã¶lS§ɸYµ¥P>Ÿ­åVc1#šåã‹9+}~žp\Þ¿Å?i`©rßþäŸ vï;qº{敾é,Ž7¹ÏRÝÅ[ëéåbV´»ƒµPýPúhY–^Anâg™…¤lº–Y÷|ËÕ³¹°f»0ª½)÷\{v"èj9»„ü*9\LA†bñ”ƒš^И\ åh;öß­¿&8àu¹-» ô4Q ‚8H,F à +¢…baá®K™Ä(uU¢¦Ë{é—>J^i¾ìÀG7z`1›}d Ä©©“tµîEÑìì”ô鈛҇f´Íˆ”®pûHûÃâ{àš©·Mú¾Nï¿Æ?¥ØOfÝ ígG[Ï·Eñ¼2 åyK%ǰ¨3ã¶›ôåÆö“¦Jº¬¡óP½Ùn«Ó+8­—£&“R;èKÈmú '_/kÐJZQ®fz”ŒA‹­-0&5* sP¤׋ãçùß}‹ïC2ÓÚ‹ç¥üËnðƳûum™ÎP{Ó¯=ÁüÉè܈ö7ôúŠs¯÷…ó¶úœ *T™Jƒ-e¾›^ˆ/BCƒß á}ÙíàLš¸ñ_Îe®fâë£öŠ Ÿ(¿A^TÁ¢ˆÊ Âš†xQJËpÚî›— vƲb'‹œÅL\—ÓŒBÑ‚7€ï)aúYG]½0®e×ú³6c`µ£ÃXx>ù ¦êoå¥9"Ÿ_ëG³Ð ‰ €ˆ´ÙóOa-5N÷‰e6•åÚˆž}æ°êcæ‡CÁ)o‡Rn>?ÎŽqQùÒoß ýÓ¯y·¹ÞèÏö忽VZ 9îá›QÚÑœÂWï·O.ב]T¨S`—qN“7C*–ÍKZ’º4¼^UjE‚x&…ÔÖŒB'C«13££¥Ëp5£ ÔˆEßÈ•¼ÿ±DÔ’É4§ßC7œó¢¸¿[Vc8 L¿7z-¸Ö#.Þ°ä· rþJÖåýís÷úËÓÞ®ý8l]®— î„ßâ—/Ÿ*éhw<Ñ—œ1zðe^ÍÏz>¾ßú|Ej½Êt KÛÇwÈš*Ù÷1¿;š9Èæö¨\M]†béf[¤€o„ÄÈf%Ô¢Ps+è´(ãRÅ£)­9çeîUê¶sÚ0 YÙ%ZF¥I¬ µèæAÚ˜+¯c;»î"´Ùb2(+† R’­TÊ!t£?‡ëŸÎö‰Êòk8, UVÉ×Ú‘V$mƒ×€@I©ìiR£óW7¿î¸žr:wêZ¯ x•˜©ÔòëWï<ÒÇ£~÷Ÿ=ræÙ¢œóN_V÷zþéë¦/<ü¡óztǽ{|åý󇓎vʯ- E€¹ŽÐ¶¦‰\ÜÇnTXÎ|ªðH) ƒõÊ;[mÃÞ¶eð—ÿdwvÇÊYnE8ˆŠý~fZÍÚ mÀZèb ymìÿªÿj×ÿÑ‘:3 ã_X—I×ÿ³ÀÂãÛrÜM“0tš¬.ý…nïsk½¡8Q8¤ ›'§(¥†™”÷›¢g9‘èY0ŽfÁæ8àBwé hçsïßL5EN¾}¼ÿFÏ·’?Œ¥æi°þÎm|2½]½d‰õNüú:_.<ÿÚ} ¬Ö4æ¯ÃkXŸ6 ˜Aú* qÒRŽÚuéÓž]E7‘÷ˆ ‚hÒÆFVží‡@L1 ¯b¡ †ÎÀìeÐTÐ*_ApÀ  À¢ ƒBÐÐêíþûþ+öÓGœ~úâÐÿþöæöÉ>wªàØxþ@>¯¼ãÅ’?ùêʶæIp¡À”%%@×"„ È•8ˆ()É&%pLl¢ê1CcfÄC‚rÑ&1‹ý!xÜÆ÷¿x¬µ0¿!¼Ú7Õ'ÌvŽÏ›{Ôöv%+y±Q2aêV¼ñÔÏxmé½h#¹d§ =s]æ =ĆŸ­™Q,ýÄ£æþ-=ÕC¬ñ¸xျöc] Ú:q{VøG:76ˉ`5¸cˆñÀ¯nßC¾´ÒR¬(ZWHÕ›øLüõ€a8”Ãk‚ùÃ9èáøFK$¿ƒWv"ö¡BAuó|öhsêwÖÛnoí#Í¢x¢g,U¿hõЂ©èmlbÈ=ºT%CÎröúxlm»q±Ÿœž ÐÄÁu¶¿UÛ¸†> QèÄSm-mïùqüƽÁ™Ëç~/´÷¿üÃu8žÖ$Ì3¢Ln‹¹oT`…È£IÀq¨dU· T‡²á´bô[OŒk©ŠÑ°EèÛÀí¯Œ›†ˆ¤Ò¯¥„RFbÔ3´GìArñwû™ßÞŒSþgûV»Ð>”ÿ㦟°P ÑY.$²]Ã=‹*§þlŽr>ˆ+¾þîýÐ>Q8øI:ŽDX -û•=ÜÉ¡Þ~|áöÓ•~%×$ó­þÒngô9÷.Áa „" ©ZžÌ»~ÔY"nµ p,CÕpùÑ%{–¾ža]¡­?™Õl³8`=LJžL·O×c(¦g¾î}-HeÀÂ"bqj8QB!’O֢ʃ•_é ûèÎrþöŸÊú• šÓeDS!t  I—„Hƒ @d m²-4MFé,Uêv ŒR˜Lʺc4¬öd "¤NÈ€rSHX§-üKuÐAÚøo¬ú +´±»Ñm†§âP”èƒ&pÓ ­þƳ Õ…ov˜öýƒ_ºž]zd8Ž¡õ&î­qœoËs¡àÑÀ!ˆŠ}Ú&_àr 2©¬ m¸Rc¹YIyüztÛÍw½¼Žr´6žÝq§9„ʳˆsÜŸîGXð ÐÒª&\ »æ™®:‰H¼L€%ç=Ža×¼Ä#²Ç„ª:@ŸMùÍuŽ“óêµ87ÖÁ ‡ô,XÜu_ÛAÆtefyL¾„íi¯“ì/þèÁÊG·«JþdO?<¼+ˆ“ å{ȺëF¤R¨™žà[¢‚³žáY|sÂYBFláÔ`aÈgÔe Ñ3¢-ÂÐ-÷˜ƒs´E×ÝeyÉÐ=ƒ^uÅ»=S!ˆ‰¦a2†$m¹Ñ"Ѷ–]5€¾¦™¤$`ÕDgav¨”Ç×_ãÕ‹Î?üWëÏ—lM©¸ ¹y”³‹¼ŠgÊHŽ®^ô¯.=ƒ¨-“EB|.Äx‰Ñ5»‹5e°ð)dœfωE -!Wbh"lª,ÍÌÂʲÒña^ ¯|N%T¤îòÔ‡:«CëЄRaÄ€\ b©<åÀv—› Xò2`Á÷e ÛRJ¨¤+ð;—›/o¼_nA#pŸØÉ€)$!é²”É`­'_ °b£PàÕ‰yX€æëÝj ¦Tª€ìˆÆ ŽÚÓ\eÊÔMKJÏjÓì %äUï`à N½úlõUòC£ÀÖ1Ac8n3»/IëVOqë±)EJ)epÙcY>FY¡U}¥¯K÷ÒÍøöÞ‹w·}œ“Æeù pÁˆcÑtTÑÞÜú‚($ uu­³3î¶RŠ´ˆˆ5‹Ö¢¬Û\žS9nX#pQ8†²¨Õñ \{h®Š"„•{ƒKADÛ öã·p99Âb¸õtA6Äš¹›¶gä/õï5%¬]:«‡¯ý ïó>•/8Ћ1lT,­mg"lˆ¥gç1Ÿßó—)jï‰Ü<`Q쀋À.˜•ĸ–€"ñ·êÿ%pM +!N*-ëЗ Êà 0³.ªF5tLBV’£3QKÕC .±ØØ”Lª˜¦8ŒAçø–Ú‚ ¨ìtZ¡’D6‘a;h= °æNÄqµ2þ"ª*Òe`åÞÎ*¡ŸØ—ï\m57›…t²WbrC~ u~Ê|¥ö¹?ê_·×'÷ÕçÒúNÏgŸ5i8À—!—ENf©ÏÁ3&w¸!gÅMôK!VŸËVøŽ:Ö˜¥ê<ñùÌ›ìÛãü LCxbbò&>¾IBË…/ù¿äZ55¿ z:[˜¥tZãk7GeÍ{'§°Ü{œL#ôÔúœk”¹Z É8âo{#…h³SFU$ÃHˆ$£æU¯$G 3r£`þ2µ/„­‰ºq%$³Õ„cÂ,Æ^AÙ7Í®d÷1>qö ?ÆŒýõ?o[¿°ðÍ{yúØ­a¾K ‚éÄò÷”–=ãÏPɘÿx;«£• .3ãÑ\Ÿ þBþ:°oYÛcÓi$k¢-Ö¤Éðð]Ê>=žÉ¸$Nð«fÏ2¨ss»¹/ÃRºjíɾõ”ÐIkoßüø ¾*ÀËÁ@à„]îA ªK•At4:X!‹Aáø³J¼’ÊÂ@=–F@?£¤<øÈ#«’x7_jÂÿW«ÍJ]’žÕÀÆ5”ÊÛÕ@±ês¹õÓ…#q˜Ïpã`refì%ú{°ð‹År®»UÖÚô»ØËG;·v×ù ßYâhÔŒËÃ3økÚ–’¦ ,5jâ¦wäž#*úU-Uˆ ¯¨­yÚ–Dëñ”áЂ¹»ŠIBS†Ò;ÇøÀn°8 ›@’G4&;b¶I !Š ‚´i“??o?ŒG6oWk¿‘u©}Ïìöxê¢û?ϱfš›qmýuÉÙFLzÜk¾½ÿ•ÁÇZÀ«‘ÔÛS”t¯ßìú¹T{/;°Aø²3ŒëðqH €ÂþÙ?¿ù_êà¿È¹þiÎσ?5xcåSò“V^¡c™ #ŠDÑ&3 A'v ÜÔ ¬xÆÂr-V3}¥P„$ í«r1‘õ»±ÖˆÕP¦b+DØÈóej„T÷G®Ï\W ³>¼9RCD^ÌŠ& À¥ÄÈšŽ/´ÄÀ ‘:¿\3Òñ{Dø:y KæoýæÓ`Xݯ|ákßÎX½Îç;›sß^ëÛBÆ*ó|_ª~ÎÞëüŸDûã ˜w× ‡JÚµ¶)üäÄ~ @¤ÂŠØvHBPì„?,yõI÷bdÜ#XÇ×ÇÎ_²¬Ô[så?”¡¿fU›¥†[ÛÆ®s9V´#L×W‰]cªG!ô«Â Àù ¯OS4Æõ@™¢‘ ~<ã¿í“õ_¹öoÿ¦_,ÝNjíÒUuÈÚÜ`4_zêè«ýŒòÙe} Ûߟøùí§?ë˜Åæ³Ä¯8ìÕ™ÓŸgy20ï®!e¥É9û(˾ïã `èAu#ª¨LU¶ZÄWäuzµK-Úuꮿ22€ˆ°lîypÂP-Ô‰è!£ D Œ…Ösу5lÚ­-Óg7[ÀÍÅb$+ˆ2+iµÆÙ«²+Lä5®¬§Q$aìv ¹vUÉãF—¹·Qd)àô¯ƒ†´G»Dõ|‡mv`x^ùǧ´òÌÀÖcnç(Íï~P%зÉLBµ^w;ý‚Ã7OnÍòRÖX××þæ "ªÎ¦gÛ>Lèu`[ˆf8|†ÙÕW®¨S0£!ía!—“ÚÙÅçcôˆðÛç|Ì=Ú:k´u¸XÃô²ÐF73à×Z>/Qçã™§P‹¾ŠÎö× 8â'RWÎÏ·µµ×JÙåægûÚß},¿ðô·j}Äád´Še5/‚Ÿç3ªâç’s5Ž‘„5«˜Jtàƒ;Ðgz­ègÿ+}ûŸívõxz9â=dÕ<׃ôx=»ÜjZWiÇìì/® LÀ!ÏéT‹’öcê,{M{TÌݸ'}‚MˆÖÀsb²ExÌëN—¡=´j?‰@¸èk1 â겦a õ8Ÿþoðÿ©9ó©­v°á‚ÐM} I¢@dëÊþzûeŽèSiW^‹½4ö\üÌ1`žr¼jë}Å{|í44u{þàöñÂ4sMI'R¤°™ ¤t(J†¸•$‰!4Êót‰l£–.*X‚&8ʘ¿ÓÕU›jʼn?›y#í/~êo¼ÕÊTûzfϾõ c»ò¨‚A«»à¢ZF®üæëâ·óËh™¿ ôÀú…¼ÚYýB šÜ­˜žœ­£}?FC¿?å8Ï­|þ8‡¯ ?â…uÔ<Ð,.Í-pv1@ Á£26j,ÈH¶¼øfåOãžßêï¸ó Æ_m¹»›¨ÑaÀ€²ÂKñÅlÓ"ŒRD [0 À±[õ/åÐ:†}8w5ËÌ^šdŽ27éŽòˆ]|Vh>üÖnm]c£vwZˆ¸rœïG1’×mKS‹M%ޤ¬†® Ürð9£í˜ÎGNìG/fìJ^vöÝW¾?Rü¨]naf˜)Ò»ÐlZÐIÔ¶™e zHBØÇ~¨îÊzE÷2mJ¥)~ 7) E³:ô ÓF"öÃzz[T’öF†jù”Hº&#Ä–ª^·Ãè¶¶IÚÄ3°' ˆƒ¹¢ ý˜8a$H¯é (#& ÙÄ  áP‚ù«TVS¤^fþ>[ãeV¿àÝû×—«¾/xyèöˆÓ«Rg‡öíÇzb›Xä 2°?È£éGƒ/¸!(¢Ðú¡ôôû]ýÝn>ü²º2&N1$¡Ixm¡Nè_¶ÇG²}F‡6¡‚ŒÝvPü~ðåå#§šù,Hv„²‡E¡±‡²E.ÄžÁ,E ¶±ßíüZ™ðvö“ÙA5 DdžÝ1$‰‚ õÔ H`4Ú-³çVšLQ`€!¹K¥B4P3²V-ÇÉ0©ï2±öYΈ»ÖÄ/ÈýC‚ÿPݨq)…c ¹Êô°$ß5½à”ñ|´ d ŸÜA½\Ò„SWǃÀ’éõˆïà{L{ÌòÐÁî&Á¤£Ù OÉ$µÿÑ~µè‹Šã¡Í3fèÒ^ Ü%æ/lú×½Npe0xÇõEþSu¥÷gæ“IÝa³¬dtÀ\o_…M1àC+Ï%eÄû“׺ôн¿êôéôçïþø÷ߨ_oÀ¢#’‚Áˆ)†)ú=y«a«ü2¤â“ª¤ŸK…å5 Gˆ«¯˜(+Š`&,…(*ÙâEØ÷Ó{‡‘\xj©Xá¸1è†&FŸ/=rËïŠlô ‹Tk–Ÿ.Ù;®À0›à죮ê±28 OCEw™1e¤Û< II´Ú3œ(X ØÑSŒ‹?ŒÆO÷|íâ­×>ÝÝ„‰$g.czH Z;ûÛRÄ·ÅB];;(„2úêèž|KI EçÖDLSÁ\ñí a Wø ÏÊË :ŒÃ¹€ÅȨÛ¬|«j(=¾Ó×…ŽÆHb‡Õ .uÞ‚4y* ©‘a¦NC¥ 3p—lU@—¼ÀŽô䫯®LÅ,Y5f¯ sE'IH0n•ÀÃX˜ÄAh˜0Ô½± c¨ÙOv“gh^Zª|ˆBD$@ÄÔUwxƪÕÜHNg¯Õ1ĸO+sç²óäK²ú†ÕØi•*Yôƒ?Û=¥§Bè‚« b¢oZÚ>™é_Š·pÄRŒ9Ç8 ¤¬à.ñÐÑ(3Ƀ†xtÄ.–Cí´ëé k™eÊT§m¦7ùd¤y"¥ P¶%éW¡A#aZ•Ömlà–²¤(Ê’ˆk<[H=¼:ÌÎiÁ˜P‘`]¬ª&Dñ,¨Óþ"pRŒ9Ϋ|2qΧ2â©áæ©dÞFžŽFN©=ðKVýqýýóÇÝÿeÊ¿-åîÜk½PE<×:Ÿ““âÀûLY#+¡ùx<ËA’8¦•Q p-Yd•?Í(€‘5*z“Ü ­·RKi¤ô#q:kË÷3¼+*ýÚoŽjS'š¶öñ ÷NŸ³2B}´vÙÐXís4F¾¡›XÞ¡TË©·>ÍËŠ`÷žïgÙÏ›¾¹¿Æ9-O°¬?•èü-oZÆ—ÍæÊ¡X¤³YªÛ§ð"+ˆ±£2™]á…жÓ:D»ÚЬ+¬®°Oò^à³F†Ìî\›sMÝ-ZÚ‚mw%{Z(*œ½¿›Iæ”OjRód¶õùò—‰g4fÏüç4ç˜ãTt‡XE9[Q•VñEòD\ß ÎÎÅo-¥0ÂBhEÐV–å¾Å²Wj³|co¹ßŸÞÜOçßø5®‡û»ãa¡ÅÑ•PIT`ʽ[pÉ•ÜzgZŽB»†0žö±®á<“5§í ‡#*¹T‹‡ê2)ÝJ«ÿ%þmŸÿ\ñ§Ìi{,Ý©Çî‡õgÆx={X4nâBçaÀþÎÒŒø¨±s¥¥A¥T7Çççi âàôÃã§ŠÝž\Ÿ‹±?•n [@-9ypÊsÄÉ h¹-¯»Ë¾$|J\ë¨ào¦WeC>—ÎqÂP,¾¥+­CχC¯rj°a !tÜ&ϧŒlZ´±â¬Züóy¦É›ÏÁûÌŒÛ^Y¡ôåêéç!ŠhޝÕ/¸_eÿßôÛÿæ™þ—çÑoÓñ›&OÁ@ÛàW`ƪš+¯d_ÇéÅh,¬¬Utj*kÈmzب–£ÜOåìKmÈPƒ+­ØvmãRJ™Ì{"à_[¾øæ¯Ð%˳5þ°Î„Ü·tÔ ò 26i`(Üú4S¶?\k—3-G“6Öyb–ãÚ£úúu_ùåËÛ#èÉ_+uÞÎñ sz÷}[oÜï¯Ú¨þ¶¯#‚c\‹þèõýæ÷üã{œ›Ÿ«—åÝ@QdlF×~Üï)èéñ©íˆËÎå­tXžæû+~ñöà›¬–¬Œ>sùÀý^cba&Ú%Å)!à … 8¨£ðQŽÍ61ÈL‘J@°ÉšNt’žI˜ò¾iBFr$úi)Œ\ #ËhKÜòØ( Q±€fB åòÖ¹¾òÏÓòXõˆëŸu^gÂ6ô˜‰ÿÇ]Á†ðçC'®Žô«ÃMGÈUißJbV—óxv÷WÓ¶ƒãS­ã²µ=SË"îÃ["öøÓ>ù„Ii#— Žm¶Ù#›³Óc$¦wm!ÔØ¡…|ß\Ÿ„k“/üêýý§ÉjMpé+NRÞ-òq]é`$¬w÷5×G½Ä“amáQÛ˼<÷Ýí¥~Ÿ$jì¤NmʺNg×BfN£Ú’öN710TÆ,¼ší4^)ÐX4ëŠôhÃå!:? œåUÞw°–góõ¬y‡IÏDÚ!Òô _¸÷[v¾ó›ÁØÂ8í€&ñ~”Þ>n\:§Ï‘ÿ2þ… _±Î,a}UÚt¼mxamö¼Ú©‚MPM‡rŒIu€Å_XÚ1ŸügØêþgêçß¹]^S¡ ÛOZÁúCh©_ýú˜€¸ ŸÜT®ñ€¯„‹ïé~‡@EEÏ äïÂþ½ø|Ú '¸B¶¼–Ë«>_Ý/DaÍŠ<m˜å ~zzÃß­.xF$¥;»kS»âMD&‚v±TyFá…DëA­©ðدLøË‡ßë5õW!Ã(Ê@Û,F &@€Mâo HœÐщ5éø‹fIäWT~Í=7)óÈJw4 ¢A’P••ì–døœU~ȉºt€Q¾ Ù<Îi$ýÄÄÃáàKv—hÈØì1(- Dv Ȩ<†6Íï⤯.ûÛ‰—¹ÒÏË¥¹ÌŽ%ßyÞ‰#;Ñ~7·R—Á}XR¢à¬Ÿ|t|%Ïc• !>»/§#”ºÆæû(à1ªGà’ŸÉšG‚6÷vjouPV”‡9_äv8ª8=?ž·:ë‚ïÿ»þß2ÿï8Äô-¸çb6êë<ÚtÀ¥¹5vð̱écå?ž¸úãñQsú†n/ÑùÌOLÂPPDÖop_°|ÓüØ0’ØÝ¥ÏÔÙ¾ýn}Êš–’Xàh'&§²E0ËΊÑÒä4á{ä?lôz}'rqV±/Ž?eb)é…62§C†é‚‚deR .£@ODÔˆíA>há+$ˆ,ïFŒ²±Ònn´È ^è‹b)\Gúæ"º…U*’™¯²’ôu.||À£Ò°<Ý£*¥Ð²Å¡€`¾"Yüpaºp7⌔C_ädGyòxvÛÂŽ¿¿ç绽±ÐÈhÞÃQZÓnuP‰)…O”¸–ÇõÏ8ÿGçC ½06°5_ÙJØÎÁׄÏ—õne¯ÏÍ<\ IÅ:öTcº ÀÐkÍCjÔbrq~%xl} Zc}\sx`b«m'ÑŒ‡) €d\¸Qsln„7ð€„ÊZ3{Ÿ¿pÎ2b$×£>ÊÉEÕ·îI6uëT¨ªõÍÑÏ5;\Rvì'pL-š7¦ëõÔÒ`b£›ø»DGF‚²J>™|éoö^šc©Á¤E -(àÚ9öHV-Öd¦Å‰„:’lŸ?Š÷»Š£=ÊÍ,¶ëªpvÏ¡µ#‰À$TË_UP £.hZ%¥¹Ì¶55šTË[“–¸"r)rÈ!DÈsœ›°’$“\‰»‹tŽ!æ¨ÓÎ!)±¢e½'sÏÜün…ºÀ~1gu>aKÅqíõûÄþà›vÿì´ùsæËzkEü¥úÛX&ôªÿÝÅ¿W–*ê3W®#d(è¯ÄÂý2mhô|Ÿ`îôöû«›UŠ )1Ž•ÀTcšA5BE#Ï‘hiUX„$X$u€% Rˆ@iäÂI+j1Æb4Q¨\0DI—äµP!T¦¸(C¤’ÛD6lj1¦×ñt€ÊA 1¦€@/`K†iþrA%#X06Ê(\J”‹X.E³ª¸E[õ®!‡âž÷ ZÀ´8ë–¬u'#ʲkÃŒ£Š”iíT¿±i^< ÖÆÎD¨yŒ®Õ§ ü6ë_ïÜ¿$¬Ã«d©‡|µš 1Ñ2½¯Õ¡Ò}¿»]ËÅʃ8ØÂÌ©RÚ ¦‰dÓ ¾¯øYѬc4RÇûÏó”•›~î¿ò+ásR/%xr¬OåÂS` Ûø -„Hå"2Ã/ ·‚{=Þû2 ¨“<¶Ø6jö8öaž­®Ò¶n‘k;Áž—w¥MËÅqºÇáiñfÏåÞ/Ì÷‚ºï©!Õ¶ôDš*ÊH(vu,â= iyÙ’M‡a«$%péߪš—3%s[{8óÞ¬…hdÕ·_ÚŸ7ïÏÿçïÿÕÿÙ^ëŸoïó½;PÂ(.°X/1ò“òøÑ-¼¶žü£ž¹¾ß"aâ2÷O­¿òÑ>wkR‹Ò*zÚ¼u„ :ˆÌœ×}þ#|=‡ÿŸbÄùµý=©ÖEõ—ÛŠñøì0R“@ÊòpM`§JJ1¥8TÁuÓcxO·ä'g]‚BG©tÉëf½ÝÉÇn¯K9G¶ÈËD¡[Ô`³G Ð:j2¨§4Çg8I‘>ðˆ‹Z®®{]~4O{n­±Îâ퉆c®9t#¦yÏ$DÂJ£Ü›ä @µ7©<Ðpä¨UuXy%0ŒŸzÐõAàË\â4”à¯huE#ðcסºèVž£{(Žª6´hÍ|س'÷ùúl_Wç¼½än¹´¦tê!=.Žc$’ˆ™övOµVsǰß5û1äðéÞõkQµL_#¨ ´ÅU÷<gP0WÆ~Õê’ÚwGÈv 2‘[˜gÃo›„`m#SÐ,¢-«ò ð›ëI) H¤ˆkòÙÌy59 ™¯õÔµWí 7 Ô IŒ8Þ|PÅ)À‚0àŠ%íÿ϶«üèlë/Š/òú-JÂáU³Ùù{m¹_Æ`¬‚—÷‹íý:•ÏöÓ?îSyx%'óCfôý `>0bi’tð½%c¡àÿoþ¹µÿšÆUc'z>\ø”…¨¥FcW"FUÈ„†m¢(‘Èâò]Å!¬Çr(´@†Ä@fYR¢j… –•24]_Êi>Êq³Xrõµ/L|^öÓžf&Zoóúj^Wóé†ßŸë¬îZÕŠHÃtÂÉè) ‘*:ƒîÜ9úûûÿÂÆ·&BÒÜ“þ­—»R7ù7uÊ"=—é¬{ŒGûÕ˜{áëß÷üø4ý§ëø×ØOŸžÿ©tœ*ëÊ+Wø^x nxË:ÔbÔ¦ÆúæaËnž( — ¬€Õy:Iíî­gŸúcÒtM°þWóÌêòQ½¶©ã‰¿,âRWÂÛž¡+&ñ^²óöÀ5K\® ŸM'Ò·½\¤U¿85è·ôOƒ¯›Õûð“~ é½qhù*Ã=níœËç›\þ†?"þØ$¾ûNÏåÊþýGá¹|>5ë‹'Ü:ö×âֺϯê‹âÙT_‚ R¾?“îíT'þëìÏûûU¿¯õø_öûF÷½Z|øôòúé T;?mù:ˆú.5“3±Œ0½rB2±åžË˜±÷‰§Jm̽¾ÄÂLú9Ï8QFQz ꄦÊ8X'óœÇÌ ë,ó^ôÛQ:ŸäÙµÞZ{4{ ñ{L˜B)8èC6™Öj(˜]ÚãÒ8†ÂÍzô¼3´VZªñèòÓ¦\9GûwëðÇ*pÒâüžO~;‹}¿ï1ö}~tõüÃçqîãóåŠð¡¬ßˆõMØ&äcÚ¤¹D §ˆ2!6 0-[+ož±³÷FxD>±ôÖÜ r Q 4\³Ö?Ç_û ‡,W’zá͘ Ò–åvQ$"G¿¸ù{ýhE î¾Ehò¬ÞZ~ùt~CñÉ¡úòˆsÛžLƒ«ù<ùgyïNg®qî Š'§Š¸©ÔZØôÊ}ékò‰æápt€+ôÝSýqx›]Z²¡AÜíÄ$úô¯8M¥ ÿ¯Ù΋0æÆ<øó‡ÚgÞY•‚ÉðQΫXÿ›ÝŽqF#š¬Å4d`VsØéÖmZè>¡ŽMÆ‚[LÁš’AX&ÇÐ`aM´¯+qÍo#q*‘¾;û&Ïp­¥‚.ˆcðÓzùû_ïý­ÿ¯¶_ú5?ꕛݨ5u¹£õ±u[ã™ø¨òÈŽŸGt>%ŸÂ«³Z2ýoð³éCÏ“²b !cªËH¸(¨•˜!ÂXÝ$¬ŠéÂ!i6*¬°C‚x€kùƒÝµáÏž!¢ñÂæcë½¾}OÈ?už›ûo^ö¯¿ñß^¿6¹èdr;ëoÎᶵݯg¥Ò”küþÏù0sÀ¿ö3Yèö\Ó}4Õ´QÊ•½4?êíU?ôYí-gù•kåG9A&RŸ[úα7îBGaOoÝ«ÿû[¾¤‡?qèßÈ¡;n›Ið` ¡-”»7½Õ®ãd zJpõJÞà²À5ý‹NAU ,ö–€…ÄOòZÞ¢‰š™ÈËN=Kê ßy™êp޶iÑÃpü*(vìÝÇb5.’å©/yŸˆ†¹’V|‘v¨'†aÃÐ!ò•-’‡Öw½ëb}!ýIðÄ5ÖÊ=]ÞØÞ‡æoìGJƒñûÜ ždÚüËAw˜i \á$Hʟ鳆ŠiËÑæG2Øcp^Úu‹ _쥴չ_å–Ù»Ú:qÏ&*û ø˜ÀŸÈêSþ–\… Û§âÒ:íw1)ßGþ¸ÏüûáŸ/“<£mØh óìã*³ñ=˜)‡£A@CÑh Û3’f'úOlÆÃMvy{Ÿ~ õÌù­Ÿí[x7¬ü$ ùÐÊ,á/¢]þÿOÇ[ìH÷§Þk²À„E€àá÷@Ó¿¤µqæcZG$‚”uQÖÏJŽLý”MðDvAL¢ ÐT€½e TûHÍ aâ¯äûKÒä°£œŒ¦ ÓO5`yÕ J²g.j6uÜi„bÍRg¥ýK\»høÍÛö$­ø‰Õ¬ñz_ƒÁG$‡¾‡Î‹ŽÑŽX-Ëç~Uvd (ýÀ/„§ƒÆÇ\Wñ2 h<g?ž=76þ€£TXÀŠªH†Ïh à“ðI^&ZmÛãÒ:užjíð¨_N±å|ƒ®êÀû $wYîy‚H#~¢$¡ ­áy¼<¿Þé§7u¡Éßù?vß+Ü;ßúÄ_}ê[ÿ÷ï]*´Õ8s=– KA‡"­< cõ'ìÏÝcú¼¨ÁÐo¥=÷=îÑ¥‘cpu†DÕÕ‹f¾ö5±¿½2Ë9»?üñ¯B˵³dÈS¡ jbÔ0ˆ'xAáËn±_£™ÇÁs<ûÑI’?3Ùîv(r3/+¹¹ÃWë8n¼g…‰„lEÈ\[ÏÍŠI5…¦Ç6#ñLÒéаy„.Å:LçÞNÚŠ†¶* ZP…ŽÐS†ó¨ ØDÈ9¢\`êuPÏÓ|î¨í|Nª(•©—´NÝ[d*è1P–r¥¢H§ÃP&@!Ð5Œš°…Ÿ°H$(›[¹[þ•œ堺oßÕ[‚9žºÞ“þVÍC½þCï¦S§tT (Žé¶t®$:ƒ|nh?õ?û»ëO ØÌµ¢6kE~*%qèº ³ÉaŽ'Aé¸fQ)êÕå×30±ÒŒ«b¦'E`\P¾â¨3“4pQ.xÅH,u>Š5w3³f¥9Ù0ñQe)fq9}…Çûì×’! ªrê¹uÝûEÛkê‰üM9D ªëOô¡z6øúø ÌÌp}†Q+‹ÒÄXQ ؎·ë›ÞÌ*¨ã÷= D𬓳k† t†f§K© *k­¡%ò\3 µ\åjzÊX‚–>õZI=¿&ו§f*jó“Ÿ   B¹Í/P䂇Ǡ§*cV8«2#RiÈ¡Fƒ„\?2]üP!…Á +ˆAœ%„ƒ¥)PŸzT~Æë\R—×/?ó<ÒyS0ƒãZá&÷5\ý0÷^ #¬Œ¬n¡ÿåðÿïµó¿<Åï³û²ùüé2Jì=z(tÐŽ‚Y㯱ëŠ$˜i½ÿú¢Fý”iy:)§M‚-NjÑA b\EYš½ª JwqB¡JIœ$!› m‚A‘¸•Ã꣢ï°'‰ <ÍCVÊúã×¶ŽÄ[´ñAW™ò(^+eÖ<ªòDP]i BhK'bË] ¢µ³‚…ý\ßÐS‘˜‚@($Öf 4@Db… 0ÑÈ— ­ŒÔׇžIýQê;¸ÝíÖó0<Ç)m¥Â+×^辺sÇEÌ^-}ÊêdH¥Q "¡!D#P FPåsØz”µ²T«Ö¸ Î6üFõOÀþ‰®$æ5¨0'5gd¿+*²n‹ÇÜÊ—MßD›\ôžø`FóbV°–º¨Á]Úu‡l ÅdÔ6þ 9³º8°X65‚–±!µóƒ#=ø-¶hujv1–, *ß•uÒ#9Ü *ÐA·MžôýínJäg⺙ö `eUS¨¼¦ÔϾ¿· æê†åô9Ã7æïúÎÿËþÍvñ+<ê’g˜NhÖªÕ±+º2h¹ÙÝ-×<ÏxUº´»Ö@кÝõIV=—;ÎV5|uŸÏ oóz²¯¼2ë2þòÿxýgnßþ»ÿø†ßû»¯Ó Íä`ŒË5OL˜Ý‘ïŸu^‡ßýèòoÞíó×Û×¾žÃ’~NUÖ,û™=Îw’«¥NYè¡k”%0,µÙ¼+&ƒâ…6ÿå;Š/ $¸.ª{ºžó Sål• ˜hí.äl°ž9ü+ÇöO½õ;Љo¾Çð]ûnÿ(R—(´F¾³ÖÙÙÊø˜ê»ŒéqÑ!p¢Ú6å*^x‰d&ÞIUD”!:°GÃJ7à8kp™õí{¢T·Ck0ʨ‡¥øõ‘þ°´2ò¶ò=¨=÷ï6Wó=·ˆBfA^=4h‘BH‰®À(JøËîýeY¿úMæ¾ ø5éÅI¹AxîGìGƒÝ((ÀHݤ‡?%éæ +ã%Æs !&ˆž¶˜3uT™¯Ô«J ¾c˜§^YÖ§·½0øˆcaÅ ”ˆ¨jôÅ0ÝrJ¡PŒh™±×Gv]^ÎÇŠóenßèã~’×h´=ÑÇkÿò:øäÓ«P²¾Qïg7z˜`£ƒq£Û£aÓ.Ðò\t©>yÂK×Ä­jT?ʺ(Óv̉a¥Gv{zðói:ÝâêxMh¿t]/›M>¨ОLûµqïø,ôìaœ„J‡¢ÛíL¸8‹‘ËÝ‘“z¿aûòƒÖ¼s}Å¥èájÙAåÍ ý ‰®•6O©9ŽRi|X¤Å=åçOå_nán©»ôƒoü3ßünþ6ãß¾Su×õ«³PèëýßðÎO¿8ÿyÍÿŠça²Šlá•WŸ¯©ë¿ñ½I¾C”ˆtWþì|yFùnëŽÂB-ÝÚ?7ß^”¿/SopP^UˆFÕTÑC+€"1cSª,À FtŒ"×Ò ¨0™@$Ô’ëbçÑˈÓqaDær )$S/(‚·Ií.£þ¢$1êqzJ55—zòËQ‡!$4A„| ðEq8YŠÇp\—ô/ÉÞ‡°œ¤Û°ú]ÄcBÈ…ç }óêvùÞž [=ïö‹Ñß]èú]7¿((æYŠ93ÏÒ:¨¤ä€a3¹ uÍœÀq¼ å øØž8 îMtÕ–A|nùp`Ü,Ó ]Õo”Vÿáxííx\uf2›tp‹m2JÏ›ÿñɽžkfUƒûœç꺰õá#µ¸¥ŸRxF¸}|x^ëa–‘õË{ s?¥Ÿ™þ¦ìí.ZñÚ¿Ÿ]7ªÃ¿r§A?2Ÿ~wå›ç×OÈ3î/IþbËþ É@ªÔFq¸”p[5_·ÛYØsË5þ=Ÿ­ŸÙ7÷ÏuÕõ¨ÒÁ9ø~hþù™–ÿ»q|D5ܘ]颯<¨óýìøÑ«IAˆÕIŒ¥ ²$̈.Æ@E‡ÉÀû+§—™$mÀȃOåaùU'Lý/%þÓ¥ÃyÒí¬¶¹ÿ”é[Ÿô sÿi_Äî{ËsÄdȆ›,7`¡¼iæ5¹ŠÊ õ¸Nçtõ­N™ivÓ§&YwÓ|[n0¿½]8S›S«¸Ï¾µóvûïÄ;Oíx·ðõ}æ÷ÿòƒïGJÜä‚“Ü' ¦ƒPeŒž,Ã(½4ˆCzá“o¯êHú$ç…¤ÔŒ?RThû?ÄT”(¨B2yhP *d†Ò ò°" ?|%wC8uYãÌN†£V+µÄ 8~o«Å]ãno«ôÏcPSïÔß>Vª ð©¤P3ñDèÅ%·ÃÒ¨azu¸ýê× ˆŠóp.;\ÍiǦKXXJÕH‹Ò¢†…t/*¸ˆ?è'¼–¾D/5p`n¹“f0ü>9èµLüFsY,(v‰CU×Ñoc…‰~ÌÕ¯/ô[².Ž„i #{±Ó€˜@z¾…ç‡Y-ØwÍü…º“03@‚¦·`=5)K^|ý+ú­îkØ àéÙ‘­è Ë)¡;¼u9@m·ÇóûÁ\ þÍ‚—}fë°1wÃl#Ì›¨rr—ô¨”;eØð>Ó”óÐ1zWe™®6Oð÷èF„õ—£CSÞÃÿNàûмÚnT±ôõsŸ~Ž»®70³GF¸Û÷oÊ<®´¾õ¶Üôð`7º¶6vÔA)CyPgkyÔ{™'Ìù^³\Ù£Ú±ô >ØW%E-Ÿt )ùd¸y|MßµaíÔe1Ù½½G­¦ÉÄ>(xw,XâsO|0r&ˆSFwùs8X=~œYÇ`)®d÷™ºÿyÕÿÇJÅ•ª°¢'ó¹Ïöÿë߯Üt\7¹+—´òÄœü'üy8XãPÒÙž‡Ÿþ‘Eá^ó`ÅxVäžrn ê¨#¢DŒ4©‡E†ðò{/¨å¹?ïUlÅÿìÎøÑ°¶—{ž…K=ÄgPÁ¾‰‡“Ê?ÕÃãóoŸuiÝ'mÿŠ>â €Nø,4€³ï~®§C}>Ü•-NÁOLÓ½sêÀË,K~Úyíùu¹ûËóýöÂSå¶ç—0ÞÞ·êç¹2´&/ï~¢e¾ù|Éòîù¸'ˆ„kq»ÒßÕWàh.œÜkh/N0@ Ô•ÚPGÔ‰ƒè¨.^®Uœć¡ß{.EMê¦ÇËb*Çëð8ûþYœ9÷#±(r¬ßùÒB+¨Úá¾=Î7?gJ(„»có¨w\§3×{:™É²ENYlÿAø^Œ±¸ÑKhD·×Èïµb ä‡;ì‘D#‹YÇæ=×#VUÌ»®8Ö§–íG:ÍjÿHù‹9\QšM©!aë6°!¨þÍ|{<[£dÝòùú½r(üa™AJRcˆGf¤+ƒíàÎBìzó~^ü/»Ö#/Å\®qÎnp|\è«/®šó¦ Çþ©{{ö©°ø³ÐÔŒ$d©¬1d¬(Îù¿ÌÛ¬Ï÷äkëuq!ªuQž¥€™|·qLáX5ô]C±Ðz–[!èן‡¦qs­sKx¦KW>þü¨ 'U·«ŽÕwJD’Í„O‘á•öšd‹•|éf0«Ð –×®Å\|.­Æõ¬¡&(™X¢)ŠU\ì}çheô6_ežwô<çŽ&·{]ÖgÎ/X ®X1¯Ñ+t¡ÛÍ ×|jàU¿oÁz¤£ ÀGÁ¨=5f/ŽCZxöïÎäürÏéSº/­æ2­Ð X0»Çççûqâã¿åëûŒSÂB JÔGF­|PŸ':RÜé?ÞÍdžøãú³ç~×±µÕæ#B-LC ‡@ZtÏ™ÇÏÕnDâMû˜O†W¸!ôŒuçΈ„V6«¬e+¶oò%»íý}of5Ù‚ á'¿¼ùÖF•ȉæË+ÏA¬M5²P§ÉÑmý‰ÿç¿÷¨Mþõ‘J3·ûz—_(«ºLÜ´KºDB˜ŽR7¨%ÂΤ‹ò£_§»‰^æõíùãF¢h•Ùèîc† a áðŒl0Ãau]Ÿ¦15eUk;#Ðs`å¶ìíNÝ :ŽKÌ ô"úý(%¶´°€ +HbÃ"( àÀ3¬B¥³ Æ ¹{D*&MÌZFâPXSþØN\ˆ$ÅhÁ4Ø …8gé¶#3x†ò¬ô4†UàÒ¾Å9‘wKXBb‰WÙµõ¹ ÂTúUø ýpü=“UaÕ?7\ª«2‡•¹µ±8ăÇzÝE1šCœq]áÎv†2=¾ãFÄÅ!£`KFÅ]Û„2„F<Äà—¼–¥›ã£øÂ [¥"Ĭªq† *e” ІbDÓxUšÝF2öpUv”!á |¤Ž:ˆ8'c# RM R+n%FªˆŠ`VÌJDDxc°1¿Dø·B Z!d°D„QE‹½aÖˆJžPAjáÒiè—â‰}×›]ñ.Ëð‘—ëZ{q•Ž-!KÁ3»?þ}þùüý£ð‰¿À*ú3«×BˆQ0LÖv$ÂWtÒ© Ox(š¡þ),¨úÚ°Û€‰WÚ‡í({¾½{=¿‰þ‰¹÷){×DØÀèÆŠRàºlš"XñÐW³ÕJ2H(~ÇRñ:CóV\éVÂDLŽ¢U†p .Ö‹Vd˜·$ ˜¼ê*ª?##çEýñ\Ÿ3˜®UžLó!¨‡¹ Ñ, —™‹L°LèZõá·{'ÐkÛ×Ä!ü}É?â9êß É.¢Q(m‘ÀÄ€¹p¦z™ˆ¸Ïûróéü±Ìϼû­ÛÏÚïð }TRY毜*yúÚÊ}#NppËÍóÙô¿Ÿï¯ç¾í§?ëk®¼ÿòíï½íåóîj¡¼Ý{.v»Éz_màïÙ ÔÃ@x¦\#9¦ZP%Wí!z՞хªº$€^k ¹ÉJãLÕ‚K믂n4Œ”ÂÚ3÷ÏÛXô7P·ZÂB˜g[ì®& šAk6K‰&[®s5,Åð«}•Éש˜p8޽aaÅ‘L ý Á$½¯`b¶Išú»‘;P™²zÇÊZÐ$”DÞŠ¼È´ò©p¡“Ö®rFsí_ än<"Ÿ°SÒ[ ûãÈîDÃVMïçëÙë W›ÚF¹ZGÙÒTdJmî!Òš"ŽçÁdÆ2&㤷Ä&ÏéØPŒO»¤ªÂßÈLµ’ÿáJ˜üóÞxþÿjÿè‡Ïã׳x µ› öÐ@+\Xð‘õØå'¬˜ŒÀ±ÆFUVÀkù- á…@Gm ƒP,— l½,EÆjU á }žzüeþñå??¿_wö:×¹Ð×äÝÜrÍr•0;3u‹ø¢ÏØý_â-èPE޾,WÃâ‹*³BR¶³¶Éçr¾èuνT`ñuÊM²³ë38ž¯0ƒ—ë,'OdÍëÚþü$Ñt"þ(²³ë„·™û6î0céŒÀ뤦ôs=…œpæq˜ß,®p[àt™\ 8YÂXÀ0J{õ©'BA¨Ì‹ÐVu!â·¥Ú}ç> ôcÿ/þoûôÿÓÿ矗ÿ¾ªã>ÜÇ-¾tð’Öóñö·_þØßpæûÊ,ÓådÏÖù×箾}|·ì-¯ñ2€|fÌpø>táNbUƇ¡n¡òäìù¶þV¹•é' ÕP;¹ˆ×@ 0Xhu€(õªa+l±AТ=Ä÷ÁQÜ40Í!m‡ìBÞ9 ÚC ¡ïVöàö>ô$­lÃäAÞ08³Üò¸Òcë:Oeÿ ìÛ>QNJßµ×AK›ÓgtÕšŠ$°K5ŠlT‚¤óqàÙ™Np25þpó ü3p@#îQÆ’Ôíw\®ßßà+Œë²Ýâû3¿¥ØbÇ—ª; °¢ë”²*ÏtÊjVÀº4`ß·`F‹C×ðÚÑ…cÃÏ_Q{]ºT¬¸šüBæS™¿wÓÏš7Á··—ß¾¥ÖÑ¢]œs…ãš\ ffôðøF­ãÈò³©‚›I¼ËµÒ+Ö?ÏôÉu›é1¯4\‘ø[§¾9“ó>K¾/ý7²šÝ5ÎKUéê}Ñ^—C÷k}äõÜwñz¼µÖ'fÂÒ;i«mþ´Q3•ý¦3L05×­¸Y!^Jþqÿ†GåG¿ï»¿ö?{³úó›ÆtÖ©QÕV°ä_úY‡LÆ,õÆþŽ_CÃò © ÒîaÂ…g;Îd¬q/ÇpŠu!jZmc–«C ÉTå|¨×W¯§=7AÿK¤ÿ®áFmŸG…;ZÚð*§.&¤°eéî(RÌï×uþdÒä1Ì]¸Á w—l\Ÿ§ž†¾Ûøº —š20ÝàÌ+æõ9ùúgÑÿûG³8Ýý½Ù÷¹ŽÜ³Ñ?5ùÖÏý·óÿûì§cã‡|ŸS®·µ/€¦S<—z˜œoºÇ?ã_éØ«Ø‹oëÎŒ±6µº æÑê°ë^ `†ž"baŽÔvíÌr±ÄÓED¯RÃ\Ç`.顼—›Çs@VZZ4  pÁi¨«¨ eí{ŒçêËÛ›Ÿá>µvÜuåü}áºùr²ûù*ð“òþˆ˽+ ÍÌ8Þ›˜ìÍ?ûݱC:³«6»-1éöÂJU!ÌtVçþÄb˜8Ò©:,¼Þ½H â…’Ô$´À½©zHW¿`¢æ—²VÄšFKð8%/gE%4ˆ3M ÷d¸&ùù®%À:tÕ0«òk).  Y2 ˜’ ”÷—?Éÿþ¼‰åLÌ•ÞM¸T.âÿË‘Q7X¿ôá·ZŒÆþGÏñò~îÿõ0áÊìë_?c-}>7UæEh4H¡ãXŒàQ6å野DÓìN ˆíܦϰHãÏþÕ2¨x¨ÔŸ.ìnÔ,v/Q‘Ž­R6¿|µvžýÁÔèE]Õ«ÊCN[|OúÑäžòÞºTkeZ–ZåË4/‹¸@a«J éØl›Mjlãü+4<¶´Þ N›y•‚àïÎåû³þ®l÷;´-5¾FZq°|¼_ŽÒ‡ÞØïàç,½íÆ»¢‡dÀsê#×ô ÞÆfy¸RÚâ€ÓŒVß9˜4šãÄ„úÑk½úc½„údV0¼fñ1._\t²3ŒX;ÝÂS¯ ß*z{3–ÈÞeß‹^µ=-S•SìÓè!VŸ•a?Ê£õῳ´ƒûdìµ½ü\^FŸhº’æÈ2«=¨(ßÚoZ ½uµq´uàx‚_,¯ë?TýÅ{O̲ƒÊçÕZZ.·ÝâÌè×ôÙ™ñ¬TEí\¢¹3}‰2—èò?¹³þÿ²._ä{Â×RÒöd÷Á\ÄÔ>ù1—ÿ oå<~ãƒö¸‡CÙ¬gzŠfÍgøP'ñúm.¬ðBé0ƒ(ï«ÊæççÝì–ÅØtÌÜw{¯×¶¹MÍÆô)ZEðã‡üƒ½ã\ÿ—hªödû^jM+ªX!À‹¹Wp_fŸo-tØ8?®õ›É!b’ÛÉy<¹Q[m«Ü§¾ùžÿôµË«ÒÏoü?W|îÏNÜÈË߆TH«O½JsÞá ?9¹wõ…vN)¥Ô} (ŒJ0 Wè*`)auÜríƒqáÅ&~°õ‡º«Ø0b޽¥uìÔ…9hB„ v=D€º!9æ&|Q³ùc ù8ŸoŸá/ÚçdSæ~t¶7‡îpå<Ä)Úó—ÇÏ[¯? ”&´®‰7羺ּð¤ðO>ÏêŽëŒØýug ÓZ.tg_ª âÈ>3‘SÕTx°BU¦ëÚ“Ï£ÔZŽâ œúýs½}çü #Ò¦²p#SruÕ±ú\h­ºÂÀ3®žy/œh%“ÂND~lþÃbÄZlþòEñÝBC:– æR}n¥^Ÿ5nЪ¹Ó/õ d,)Sz¿­‚…•â;>Ïû—‡`rb/‹·³¡š¾6Õnl× H(Å&N•<_èq3?u·ìØú^çfC}Wn>ë^ÿDÏFy}2Ÿ)¬‡;Ji}(émM6U¥ˆwÂ\%¢Fp·s`©_HÆGe]–·´f¨í]Û$7WÉ&Ÿ5|•áL¶÷ùöÙ¼L6àÇ2û*Ed÷3Zµ ¬„\‘Óû+nóÝïWSÉrãZ< ÏïÚ Ú§Ö:.né-L KuGÆf‰soÛÃ_µM%…^|ÿ¥ìñ²£Ö\† ÕÔZix[%Jʉ#jzËÅFvœivßù2ýbø(ý{'É Üí8„5ÔŠb„D…80ЇZS$ŸXå‡É@Á§Û“¤Urá4MÄd\©… æPŠ™LKI¦%\’ ãUa–S(eÝN]éXk©å@…Ãd…V£„wòô KÐÃL€òž¼4|×çœ3S™'u¼5e‡ÝeÜ¥zœ-ȤÜÒ3Ø <€ÜÊ'v‡qrI,›Ói¤zŒͶŒÀQά»T#-5" €2ÄfœÔÝ*¿äc²´j8BYààà;;d Qª‘ TDÕ¤Àû†»c/ŒÂqMOŒaÙÀLI÷`l < 9’çØX!‰‚§h"YS¬7 Áo!+ø'Y? šTtÊ@¹?…åhG##@$@‚‘ƒìai6´“V¦¬€Da’:1ª7ÛÚ`kŽîç9¼çëµX$ÏcYw×8öå×`g´1óßûðüÿüãø1+ð;D(”6J£'Úè)‚¡‹ @°4ð |±Gø…D)ß…•=Û}|óû˜}Mêó'Ÿ¨íEöÿñ±wÏûúJv%®RäKba„q†T€ªLŠ$ù‚9–S3K ÚfnÑ ¨à…DR¨ˆÉÓº9Ça¥*Çè¼È<6³ÜuOØë¾oÈg/»ˆÕ.‰Mùí©¾ªŽÐM®\÷ÒÐÖèæ7ðõ{Éâ(Jöÿ½Ÿm?Àz®¶¹r•I M=’˜ ¡Áóò‡“üM;¯k¿¿ ßø[y$b@•õM¾íΜ‹é×½ÇÛ_æJ÷Æž‡Î;_Ù=×½z³ï¹›ÈžÛ·ß¸ŒÎßý«3è+&äê'ñ½û4j$xEk5\e³åAÇΘ,½ÇL„` $7ˆÆ¼@p¸ŸäxYN*„1H…¡R±¥ô7ÓÞ«q{fIam"¾Ÿ·T}³éÈ஼¼G¯P^¯:gÙËw™ºÓ>£F8ã^•?o'þGÆÑÅUæï]#r/õó[èÃÝìmùßkºÇRO!§<ªYµ ‡a´1†;LÙ•‹\Üí^Ú·¢rSó¢øPÑ+CBnD@¦­ö‘“¶CÔL¦‡úñU}ªëbŒB”#@®N}ÚÄbÂcû„ÐàuÇ.Ìuz¿µQÑÙFÚ„ìxm(¯Ý®k?WK‘ŸAFÌ3À=”‚0¦g¦>öèØÃ‘Kõ­vN¶½‘P–^èî€#œg1_~ @(ðÀ³¢£©“í•iN÷±Í®¸jÇY’+1dõP!Ç"vj’%”¢°.ßÛj´¢Îf•Ù“ÅŒî+½TžnÏk‘ªm ízÈ’¯å/¯ù(·~Ñ'[é^?çõøœþ÷ ~H7r'»ÆIøøÿ_ ”•€ö dzôˈ°ÞøX6¬XW%¸ÇŠ @A–H¥,;©™ÁuvÝî× ;¿áý÷—¿¾oåù&­&Ò;ž×…zB®s2«9Ï–}fñºØ”[|hÕi¤b5U·ƒ‚­ ®A1RФ¿•‡¼±Ù< E{Æ~jzw:À‚~!fKˆƒ¤wwo¼¸Š% -Ðe´Ü/¤l…âPœQܮԆ;!0œÞú“]7¼Ö¼“âßLÏòɹ|­—Oî…KdÖö‡X¨ò€›ÇGÅïdw’¦}a7­™tØŸgÆïæýß oû*DÎ O'jûñ¯Ão{IÖQj[.Ÿ iÄ —K×ï¾K2ö­çuIt-è±ä“”¼Ygÿ¿ÄFC£VÀ“ˆa¶@DœÎ Hö*MðN³‚!8Ðÿ?oNT?ïÂïâs5A.éüTEפ(9Áïœ#T"Wõ@YôÜÂ$êmäUò ª¾Ð!¦H¤n³BlÅP›bºUÕž†ÚÓír‡r?):ˆþÏ®Þß²g2º•$Ñ)ŠJW½/ŽxÖ¿j½²Êc²%t³t¿ŒmÁ®ÚÛrõV`f~î+hîtj^³âÁ]js¬‚†4À:´ @0:”ÿ"ÑYßh½ê;Ê?‰Ó½#}1>ÊþÐÆï0oÜ81ûèÝžTG¢´ÔTÛh.7_wÚn"Òžéõo{šÇ'À\­'+nlÂp jÆLÀïŽ1pœ&H©Õ9±#ˆwÎ$>«´áo°ó²‡°ÜéS mÌbê÷¦°4`˜^içh­=¤â)^ÄѰ31cüÕûÇ©ëJpo:ï5xx~žúÞ‹¾R{Èþ @7NUã)WfØàS,býHW;± ×`l┲B?€.üŽã>åšÖ¶ _uÚ,ŠcHäz7ÊèZN«‡LG:}þËþ…¤x „OÝ †yß̀ͨpa’3Í祸²ñÀãB1vÂМ,J—B°࡬P"UK¿ñÝøá¥íßw}GëØ’]pP0¡è~_οwbIÜ5hŠýÇ™s.==ÆæŸTíß¹Q›Ó0v5^_í Â)5\d7a$0¶…¢a<5\R‡7¨1A¢Æ°O4‘ë‚C‡þG>½7ïg&ø>* ×F:%¾Ä»Ã£´H7í0'Þ²ñðþ·2ZÆÕc»FPÆ7—Y ð úC>ç‹@wÄÖe…Y”P€1–¢ë¨àĶ:ÒE,ƒÝÔ»êÂ#{p³£?óË÷›Ù¼S7µp´²ÛÜ®é׳ê v^ odëK¤Ý×€Ñ.Á@^Ãêv£¢‰÷®mÁú!ëé(ЉdŽ;znmŽþÝÞ»ëì ÷e®¿¤éÌuø…  £w-F¡,,D©uŸñmø¥_wE,EÂ…è×Ξ}ióæ&1 #»§ÊîWé7_Uα1B™Ä®L¨-ÉK |¢JÊh2=ÑÛ('zA`Èé6C’0ÆZNƒ£Sµ†å ]¢ky /]ÂÇáÒJÃs/LYA-–Õ¹)³YªGÑU­Ýç›FN£ú¶÷ŽóRýH^˜>#P7ŽVE4:´ž[㉕$+y±ý•ý+ Ü¿P¶jZ芛EŸíàMïtRä)êªö‡ÍŸîç¿»~è ¶{žç¶¯fG§ÛŘ@€è#ÚáËñŸ@ÝüýS?{¾neà#Ú¡€(¨Ìc€`KV; ~»ËåµÂ%ÕZ–Ó‚F9i?•¹?/·NÕnÏ3Øý¿éÿAèd%õòEÕ–ËŒ³®ÈllF÷üîöÊ¿ûôøÎþüýRk`‚¡Dr{,bpËûe„ÙœÐv»þZRìí³Ïœï±ÏI^Ú'ÏýıFê„LÍy M}ôMæ0ÿqØLÈrÏW8õÑýª1$X(šÛ&<µš2ÛÎòT÷8-´×ÆÙŸ:¨Ë­¯þºÇ–Îwü ­eßLô0o=ôœNG¢Ú{@¼ÆŸŒŽÏCÖÒ±"5å7[âösܽ§RÒ›Ó´¥-öýW¨—ÌŠ=É 2‡¸¬œ=«Í¹÷Þ)”¢ª4µª…Ò¥¡ï¾­‘rÙ©Muz¹üG…‘(û†U—ã tœâ´¤°~¶¹kÍ|M s´e¬cõÌÏ @ „0u)t®ùëý¶±öåõƒÏ3Ú‘¡fý¼ø šì#Ø¿·s稣’–¢½¹**£9_y•E•ë¶VŽ\JAÿ”ooÔµÌ@IIC° ‚èd(ʪñF«™ÇîšÂNò ±BF(RÃT¥†2Õd¬éæ5ÃÇ~óÏítì€V¡R%på¤Ö…Ï5o ,Ù&SÃÚ󅟯õÚx®W\Š?_ooÕi®Ê°Æºl¨>Ç75kÊ‚Ü`=ÚQ<©Â–J.Ïœ4vâvj¡YÔÄÎc}ýEMßy¥L¬[:R¦fT(rq§ÖD8ª ª€ÏŸéè-û-–Èãé “NDgu­(í2× aŠ—RG‘èÔ¡††1Ñÿ*û=݉kŸ±¯›¬6ô"È™•”Ε†‡Z'6¨rçZawd8âLßÔ)ã¶|µs£÷œæ=²YÃĹÕldÅ‚#€M8bØÎ†svÜùÓßÛßê·U5HG²°ê[a|›#¹¹õ0•`ÓÁ¹žÜ¬¹·F9Q!=ŽùÜkÍ>)f0m: vŽ<]º£Q uò‚ö› ô$Æꫲ}-«™Ù«šG·PA:âõ%d©Ñ¨nÐøÉíÇ?\]”-ð~7’˜DgHÇ–^QL‘‚Ã&¶”%#Æ_‰JG 6ãÉñ¼ÝLÂDŒ}%0ѸB qI‘%IJ\€:²Üé\Á5tå‘v÷ìpXˆK9Š+¡CîzŽ\Pñ¯ítiu•ýÐÉÓùo²Ï,Õû«ÇÈ1ýLÅЉ:µ-ÖL– %C˜ÁgQ»,e„±€ ªšQ±K)ÈaŽŒ¨ÂðýÔ±å‘)`UÆ8ZaŬP£p|“ÅNÔQM3KÝSd½ìDJѨ  PE°‹Ebâb ã¨Æ¨FUÝf”0©#<¶`P€ˆ1‘VÒP-ŽMåig•þ“l¢ÿ6R$‰Ýd+ À”­HdCâZ%(„ aT:1%õ ¸Ä!n¬ë23ÿéûëŸùã!甊¤ –OY9 H5š&]+H×Lþ'þéëþ£¼¾&På*UXN#©e{Ù2RàS!kH ðÀ?âY» ©7é‚?š×mSSw˜Ç—-º ¢çsb_|¿g>êîúÜ-+¦’ÀÁE1>AU+W‰Æ*c/¨.bB1(ŠbAª˜r{æ°°ÆB4¨ål±ÄÐã×L5ÉgÓq¿dù9…ž ‡ñª¬ö³úÈ\wÎÛC©° Zûk`ö“ ‘.ANƒÜbQ¯Fg)Oñ?ü#ÎO>+µhÁ PW>JAqÌÀºÛî%^÷™õñٱɢº?ôǦ¯D"ÈoPþ…ŽFy¯eëúÂnUA ó±oЬŸ÷^‘¹ß/€ ¯S!ñߟSû«_?çÁ·ùîKV;ÿѱ½š/p… Ðê̼ ¶$!« ÑfTE¨ì[\®.· ²Pné #Lƒ"xfáWêì«¡”`ml<èäÅg,>9dÅá·¡·$èIš`€g×=WŸö´À©zãp§Û%ùJ>‰ÿ{Ê/ë Æ(Ô¾Ÿûqj˜ ‘«ŽÏ†­At ´6. /`˜y†©TÔ¸e*Fì3IïsdˆÇ×ý¿Óù`xÆþ*¿žò¹…áñÉÀ¼†ß—PèN’ Qâ‘åøQþÀ£ ÉѨ• •æ{¬ñØnˆAW"‡|ôÇ?ÿxùÌÓçqG~Çñ÷Ì÷Õן÷çë«ýs6f»N³#çíz”:Os_˜½R#­ô005ãtkÓzìhÉ}ÓŠ¾×I5Ûu!¯ÂÚk÷Wodìã…þRª€¡¥[mØ. ÝT§LwBOjEQ–¬À>Ô}Œbf•Çað¤§Èòz÷€â†V .¡0#gļâÂ6«›Aí‰ç6ÓŠb¼€-0j¤¥™BÒ‡x©JãLb¯Ï½?ö!™aȽŸÕýúcøë™Ò‡Sï[#¾…ÏpýÈÇÏèz¶önô6ã'Y *Þö̃2éëÅ`v)ä°½¹ÃfP*­ÖQJ’@€: ×Qq <`! 1À&ÿù ó#m<]{Tó€p÷Ò˜ Ú /w04 à*R 8dÂ.†KH„Cn$mW}<­wû»³_ aG!tD¦5§DŒ”³Có{mÍèϦh:Q_b9Ô›ë;Õ¢FÐÿ 8C84xAláôDºÃcÁõL1ª6¦'•I±P§2Ÿ¨Dñ^ŒD™¨WwÛ^õeî‰è×}ðÿÞÇçUZÄk°‡éËÙóÄÊä€ÃâIMôà(à’ëeb(”4AãÅtž0#:ÜE—æ‘§ÍY•ÑþáW~üUìÛ\TÏǯÌßwæÇR¹’±rç¸Q¸A]ü]ùÉ¿+x3õYD„/\=?çËÓs¼ýÀ==™ˆ¡*¸“VT “Kk%˜âoûå³}€éž© Þ®Ú*5}1º¥š”w¢Ô¿Ôl@¬…E#¶À´v,¶†ß=^ÍU´ø·ù)_Á೸ ãØ Õ†ð?´¼îá -!@33H8*6³è†0òUØ\½pPqtD’N¶÷H5ºÏVšIY†ÂHB„oÓOhÁ%i‡jÉvE¸'úÒ®Cc|_H·]߬Wf{¤À£f‚U<ßõym@µU[6@F;é‡" mpï»[ñû|¯{s`ÐLNBH´J€²‘´?ovS¸U´¶´žWÆñ&ÈHþÕ‡nüEíbfL‡ÈZm]‘bòÍ]-óô¿ÕúãòÕÕ½D"Ð%b¹|è*PÈl«aé H°5fÒ´ )ß Vxx§Ìê­p He˜ìÇ¥‹‰w„¿½¨cfê„M ÷£©]Ò6‹ïr:OÝ<ôØøO?ôB)Ü‘™k@ Àƺ…UðfŸ{_õ_çÞÖzõ$@šŽ7èv›ÂšØZK³@H-”h§{[J§a a P/HL+¢.°x „`̪íX2š\·Oªm¶6ã{’s&l"L‰MŸGÆî¥+A¥³íà0õîK|oÆ3€ˆ¸¢ˆN´h½Ü"Þ!ôpÀ+ÿ\äËÿý‘onì;œ™|÷1Œ¡_•ê÷¯žvgð–¿¿|tt\Xz––~ûÐdFãTn Ì&‘Q3ß‘ýÛvío ò“àP eé -J h‹¦³snžÉÒeÊ’E ¾bŠI©A$Â’ëÃú™ï§µÎ°?MŽŸ,D[™¯Þê&8ŽÊTþxÄàéo!ÿýWYÎÃ}_¹5;޳~L¬ä|N_û€%²ÑeßÀ°ËÂA‹‚4l<ÚQU7ä-ˆé’bܾõÇ”OOàsRþéØõkCQ¥Ý®”ÿ´ÔH§‚¯áæE5­]¡ÏñË›sþ({kµßÙ1Í Â^Nɸì+¶®æSdÌôA:-|5LÝíŒý=QYÈ• º*yfvlJ°Cö£ó±ò‰CÈ/¶Ml°‹¼Ë½kõgCýöðÚ¿ôáó«§FÛU…A8X 6¡(ò}ŠçèÒH"ˆD#ŒTp!6²eA° g§Ý?0¹EÁàX¬±óH¥-.­*k%¶R»êf.ч«Q…îÊ`¢è*] ±\ò¯E­€y<ú#ú_5o/¯Ïª®Ä'ë]Yù‡óÖßkçxÅ/^X¹JRtœ­ÙÓ¸­Ì—¡‹ÃgöúÊÜYûâþ«Q9ôÂH,‹-å*pÌÀ*ùAjškõÔ#­<ì myURŠŽ¯÷ÿ=ð~n¬ªœœXËC‚Óޱ$F,xüú÷ëlß?ô·Ÿ¬ô+T<¢­|4˜Æ²AOÌ»µcL¾C[g}Ýçy;eÈjw± u¡¢o¬ÔpvöµÎâ™ÚçÌü?}`GžPSÊÎ]n¾ÝK#ûMlà ÷%é<í³“þõþ·ÿ²E/ÿ„®ƒ‚ L–øÏÈÁ_-¿3÷Ï—{zäõöÿ)Þ á=SW>Eã[G÷²¯>{ßÖþ3Óv¬mö Ó;L8 .5xæC&µËï¼ Ò††ÖPD˜ˆ`šÁ¦îÌ‘C ÑDˆ#ÍÒ”¯h´EÄS^CXõ¤¬K°5žØÃ%v¶ÔÍœ°ov•7å·¸ÕÉF®vÉô¨oó êI—Üþܯîí•â1ÏñkUdtp,’'?ö5}<õWwH‰‰ݨAfW7`’#„YU©’b™,®`(ê] †a°²¦ü€y.,omÖe¬êWK~QÛúˆï°¥‚•²d.BCÚpÉøqÉg½ô"VÇç`5¯\>—¤_ä°³£E$–K‡ÎרYG¶ŸÏêAùÌPãúôG\ßx÷\‰=×××RÕ`jtæC™‹žëдç# ŸÏZÌaLöÂò ˜îcòJiÖÞC%Óª$¹ŒDÎ8KHwCa²›{V6,.Ì”\àb§K?ªõžðœ~,Ö0¶k¤‹ÂÊ`ã´NånV´µ0ÇÒ_Qöô‡¦^z5sWÜ·2 ó’×*©¦Z(\áÏ}=Û(Vî”§3£@U\?.ž”¹ß×Ûl¾HJ&”âÅjà õ³¥·ñÖS=þcÜÍŽO[^DÃãúT¾âó5Îe‰^rì)Sh¤½Zîà(O÷™Ë7ø=—Yzfœç)³l‹ùºyþ ½ßfÛ=‡–<êµÚg0á2ŠŽY¶¶û ÷Ù»ç1Ûjª ÉÞ;–.˜Ø”¹ØÈxcu;›jgÜÛvý;ò÷FnuÙ¹ˆ­ìlÚÄ  „‘N§EZS,71ܺãÎÁ¸µ,öLÜN+Á’ ˆÞˆɆ¨©†Õ££–]/Ü™ô°¨7=“¥¯³¸kKµFŠ5{ºUÖe£õ› ÍtÕ×õîÑ·5q㋨A&„>„H€ ¤ŠU@Þ\o´• º…§w0¦”\#;èé®ü°H䨂x€ŽcôPp% H%†H9Ed*µÝ‚à·Ç%]§ã~gxƒ]rÓ -ýïGë;ƒpœÏ¼OÍ!Ú® aþ$û¦öÊVˆ\O^ºCeß.£N}µe‘!­®R‘ˆ“"b…×RÜ l pä× ¬Y1âœÄ}ù°ì0تRù*áX6QrVi{¯ ÍQW/ÀLI¾3`@-TŒÔ5ZDá•TZ$ŒQ%Y#˜YÊL‚À(¡7Gð )¨B` èÊ¢l‚+—“¼&þ³¬ß}EƒPa”o|‹k¥Î C&è0€²b€ ¥S  ""†2F£™¢ˆÛòQ:|ù®£#Óo™ª…RPËn²n¶¬xš0kÝ<àùOýü/‚«K¾êø™<파¹­U©}Ì¥e¯|á“ a‚4³üÃdo,˜ü«Ÿ›Úؘ/\×¾zñdg½ÃNz››ïùÚŸ÷ÉÇôçýé¾·oÞäŽZ D0¥Y^«JÂ#ª8-«XM@ ׂ2Á©ј`là`jŒ1HŒ+ކ‰Tà¼mæqÂçìýö2Å'q‰};à5`”Ú±P14˜üM#o8@Î:±o“;#OÌ$´P ›e0ÕÝß4%½ýÔXæ.tÞ3ãÕŒ™`ÍöâµÙœÇLsq„­À)HÇŸ¿þ¿~r?y”vš»K€fÝíj¾xsŠÈvŽ%9Ä=ŸŸôòü·Ê}•zü9"»…Ýùľ%-4¨ÖÑì±4Ë£§+Ä)U^_êÐ*`À·€ž ,M¨áТQ{¿F-,Ü'2»˜Bÿ«ºó/¿†A° ÀÄrä«d3Tà°‘—dÁ#ÔˆŒ§èÈ\¹GÆ¿5êÀ=Â]ù™ñ?ëcqº‘œOð!܆»¤–¬|*y/Ѱá¼"%Ý”•v­’’  ­r¦bµPw‹,EE²Ò8ã!Ç.z]c:SΟøíÿ俸püÕwó'vþ4õ“r´¶Žk.| B°‡ ¬x÷w<W9ƒcÞ.½Œ=X9Dt@M²!¥ `™F)ËérD3-íœÝšî0îv¡eJЉ°ŽPŽ0Ô ™ (åUš³’V³ë€HlÝć”_ ão4òçÔ_Z±lÀñûƒ“¶ðp\³Nsè·ñÝÏM¥ùvíÒšq$‚`¹˜bñz¹g'y>&^SçráëÝÿÛ4¨³µŽvßÛöhmŽÏ1ûÖ@â\ öðÄX£•HÌäp)Øf ¢ÁjÚJl•þ#MŸé¨Þ. þkðR÷ï¶á_xýêèþ…·1½ÏÕ)L_w¯Ágø à*Ï–[‰JÆà¾“ûí«ÌK£zÛOû“ûõzœa»äÇ(÷fMÇh-áÀ÷èç—ÎçVÁËÇàט®´#xoæ¾\>í«ßku¤ÛÌ)gMûé¨úªB «¤”@àY‰ø×ÿïkéžüÍ5—Opt´±Ñ5üÅpèzäZ®¼<䦬xª˜–êÏ'>B6“¹O2/¬ßÔVûn¶×â¢>” Ñ }j.‹»L¸ g=ÂÞ”^}¡¡´û´}ÉçÑâfxtNž—dN¼T‹uõœJºî0¸ÝúñEs†±üÄö“Íi&o.¦¥‹Ôô„1â™i`mMá@«Ñ¬Ê<Ô,l»úWÏÙØü¢7ZŠSUßíµÁb;æÿj |ÃÝÿçƒ[E,»ÇtlìÈt7¶kõ|ÅjH(z>FL¬Ï"6a’ªÚP•õ1r¬¶{ÖiMè J5â [Ó¡bÓÑúï8»ÊŠIìǰ­±ç&)ë9^«-a"Ô9먔××¼»­ÑíðzK‡ûž£UH)"-p£ãð2gÏ_¸¶«NÖlû±›|Ÿ°_Žü ø$çSC¤§ÞpQ,%„aHhêWŽó!>6{üÌj Ò¾Äk Íc¾BUªñZgtüuà¾mMŽ>Ñ<îYà•¸&Z›*û ;0ÆØp¼éhKôÒ€tÓV;´;Wç>ÐÜhíS÷6pAži\4]hv:OqæÌ}îbÌNo%Ãß_96”ºÅÃ'wýºrilôX×>Ÿ½?|–úîûÙdï‹=ž°\€&C[qj¹9azœ6&€ò)f°‰¸Š4nØñ¨݈£G1ÿÆHþ0öú;Ö‡×Ë«´ø©iOéN<—ªfë¸ÔÙî‡ç4cgUšF^ñóú‚jZ°‰‘4²dÊ?=º>›ÒZ±ÑSq­j:ÙRÆÑåtn–“«çäùø\å­´l—}¥ë¥òRôøÎ3ûÜhÚ±", v ×h¨ ó¡_­Gö1â46IþìÜÆêÙšÉw‡ù·³-¥0œ5õ n˜vÀ>× Í^sÔÁ޲…-ë¡I¾—O%{y2LE-¶8Ù¦¨ôó¿ñÃ:1 :Âên¢Ä›Ã(6åN0¡0$*Ì9Ê∽Ðf°z¶/kk,4Ú=å}ËhÝÁ9.ƒŽáÄf÷sÖoþöJšZ½½*'ÎñóÊ­}ª9ª£ÏƒÖ*Õís,LÓ‹ù¾O¯8>Þ«Uî‘~±>ŸQùÿëkop¨ñek~ûiw¹>eÿŒ¿§zöÃ÷z½®ë\¹ê+ŸX{]ð÷]¿T†ðË_LŠÈ!oº§aKéÿ®SùÉÇîQjn5k&ÌÃSŸ^?ük>†ð†o{®wùbû^íÆtBÂAaDtëïqwßÇ÷Aû½öË ¿á#„ŸûùÈ/ÿÆ×Õ~ "ˆÐ#p—È|﾿”o¹~¯ÈšêÄýÖ㩩ʺŒ›³\?n±/ç7óݪô wõêïÏvfc•÷ÓY!.éÓÏ Äq–b>Ca’b*çUêEjqÝ0†Ã¡¿š# —ÿ:ÿ£ †þ\›Ë¼`µEbÆÃ0ÙßÞî»þ?uz½y˜5 AóYÞŽ*„–ö¼¼¸çù÷쟾ƒ¤æ ½4oª‡´"ª —?ÖÑ,â;ú˜”!íèx/ ¼Ð²ÙÝâ#€ªUö`wÙöšû»è·èžca­‚†‹"¿Ø4¶¤™ÝYÒ‰¨µüÌ£ÇØÈá$r‰¶ò‹T\Q\ײQƒµç•àÂ+;Î4Ù%'›ØFˆ.M±üºŒ?™wY£œÄhDîFyL8ÛÖu˜£ÔÈá÷þÔÉÿv×zgiàpY!¿ "ç?ç…žùÖ:¿±®ý£"~u'E/ühã²}õˆëG±ëž¼8êœìf!Ñ›¶…wš ?‚¯Àõ ×Ïæ'v§>¡×õÅŸ„pf¤›<…&n]XûˆÆGIocy~…g,ÓI«âÝ]+â ës@J]FL0å<ŸtzßÃݧd¼Âª‹¥™îMuj8ÛϱÝ'bnŒŒ8n ñø ‰‰rLˆäœUóýë|. ü²UJU><áx=÷ÕË?çµJ K.7åcàUma®è( …²¢n9Íê ¡g…NWƒçË×7^ú QÝ©±ø¿Z1åûsuޝôkî[¤j‰¬Ç¯ƒnö *Ea“\Šs'¯ÇJIlFÏǵuä^r¾^ÿl§Ž¡41_Kû¹#@u˜ëx(µ•L°Zvßõû\~¾ê_àóéýÖ|rg9`©Ùyž/çÇ0gɯ×6A_Nì,}2ãR¬¨Qm"FoLFŒIpt%&ƒî¯[pÚ ø®sÞG½OÖá%};ñz«Ü¨hŠÖovM?›¬;h?¨EÓÀõŠ­Ñ›½[]«3M_…*v½°ÙÍ©G{ŠÞŒÞ/¸K°Ž6 POHj_>o:Q¤_qíQ/=¿‰®G[uSß?Ƹ3ÑS¯æ¾Ž'“ì[î]ž¤ T®ÂŒ·@q‡#¸ÄkYbB (rpJOhË 4©Ž¢Ù 逞’eÞÂ}D·ZPJFH" ™DmGBÈêd3×¶‡Ó¨@™ 3„}©eXÚˆ>´÷l¼<œÍK… t…Wj ?åä6T¦Ö~}%¿ððƒæm·ç kt~š¼ØÜþ‚'2§©‰wŸÁ®šo¸Â—^!cEl µ$A ÒÚTñm]”e!aE[¤‹lU‰¡~9xÚçšÑÛÌ‘•Èç8´®a{§†Æ¨Òú|畵j ºI€'W!Ã[iPkf”6†Miž±õT·°,äe$TÈõøØ ,Œ‚F\†Å~Ñ£®;Æ P£†‰‘ z FÙ`6>£¬)Ö2‚'lÄOôQÿUBVŠH"#ÛPáϸɶ·'ND ›TT‰ˆ = ºÃÁ ±”éHãOó1Z„ˆ 2ÙáG=&ˆAÉžo”ÿýûõD+† ¢€ÅÄÎÔÎÚKõŠÏöƦ)"dÍ TáDXíþÍnfhPƒg¼áºÖõ_zGw—D¿Yú|×_nîMö¨îC±Ö)c9-#íÁ i0HÇJHÁB"éâ‚)(RÛ¤€J4¤€ˆ ¡8†€­_q5à²wjÖÛÃò:õ^êy3žÜý–?ž¿ÿùKçöÜëØ¿Þ„ÌÇÍDq5ãT¸ó5&õ>èìÆ ƒ T^µ`Rnç@™ã.)‡õÌXçL·¨O¥èh_ÑÍ&ûüÂwÖ˜Dë€ÒL’É' âK5 "KY~zÊÏ7.i¿pl·/Q'üÒw¥¦šhRˆ68ºp2‚Ée{`©D‹NàX ÖNH„R |Àß–€¾]_s¥R[Ît3,aĵËå%f*‰7:ÎuXceòtÊ6w–A)¬¦ͱ1·á-:o/±?‚m„»rX›×çþ…ÿŽ~Õ[Òlß/½µôû!Û¬·ýü¼M€;‚Eäá.ážQMè€lªÃ PDüõ|à_\ ’ßÿ3h¬æV5ƒ$Ãüq¯^ä:ÿ”Œ8jhF^a š‚ˆ ”Ê ”U`ÃØÈ2£m¹Î"©!^ÙöìBš^¤¡‡C]îì;NŒ¯ŽkìŽ ¥øj¿7X;Pɯâ Hˆ{~ßï“6E¡ x;²~óÍ‚^l´h»92} ®Àf¬WÂîš¹¡ÏÎtOž¦ù4ûý2öÛ÷e!WcÀ‹Y5jrU§î3iÇ Ê5Yˆ ûÄ‚‚JD]ÍEØ„ÂapÚ‚˜#;ñb·”U³ò¾PQS’­éWûç±ÇLjŸÏÎ$E…zfV:°Ò'}ìÇŸ×@à?(t iõ^ⱄ›`Ø“‹µ’/ˆú€R&‘¤D¡uyŠž–í¯Ås8Óà!ÏjVVµÆñä'.º«þ^k%ê["y’ÀÙÔJM×|Á°Â%ФD GÕß ó¿¥¯jzìÏÎÏ}8®’S H¼žý*õB‘ Xöh»ü;Älx>ð-_¦œjW0RRj_”ÞHÞ8ÓSýàp6µa>¡ïÒÛ¬ŽSbÄ5ßUË*æ4Rd¿fää%UCjêË’&èv<Ôä­J£2‰ªmÜMxh¥tãb_Åâø^%èံÐ3¹bx/ûý\º¢Fá¼ib†CWA¾‰Uà/ŸÐ×öÁè§hVÙõÓh¤‹ŽO†åN6áBÈ_ìÓæ¯o®V~äûÏWz¼€_10ñ¦%ÙQ&çàŒŠò’‹Ï‘ï†J˜(IéÃà>{Ò pOÆi<¢Ä-qØø=JdÒÎGéÜuŒdœßsM@a蘀E#ÌNÊW¨÷oëgÅÐ/jöò#¶; ƒô ±Ôö{Ck4^òæqY>iEÉö‡˜¹äR$ëë ðûð' 9˜fîõî±'ö.UÂkxû«{Fp¤¿ö#~£Ñ@tScp8à1eZ™É­5éCÁ¥F«°‘$ ÓFœ´Ü.Òd¹Ñ.…ÇlY ûⴙ˲¶4 £«é‘^ÙŒOþ'3ôMýÓêU,jáÇ[°®à< fÏn.§-¬x÷Àˆ¬2ã…†:­ué8>œl§}_þŸ}ùød¯qôe¨§øÝûÓ¯çÿÆãoÿs•ûóçBD;ʯgä|œ—­áMª* ÐJ­#êX¢ÄQ£<ù—Cljü~ƒ„¾ ï²(YPȪ†ñ,>¼`ÕÚJTÑ6Ðæ‚>V>úƒyâÖqÚ ¢ q˜¼q4gp{„WŸ®ò£èïT^h8¹øQõkq#œø$rò²èèÛ{ãòí,D¤ÔÕG¯ö|ÊSÓ44Û"FL'½Ü µ:ΰ4;F³XÕ…¥m‡dôBµ55pe\-4Bò†ˆ„€‰ˆ[Ì®¶õ`!ÿ¦à—žF—é¤UDã gI{Õ[’ É,Æg–ü³¥WäÈ¿âÂÿOÏžX¸¤Æÿ‘­¬Yê˜æÀcõûÌÖ“ø‡­WÙWjb¬6þ?~ëßœsöïSNA—°ò!¼!ró\yK<…ŸV…BM˜}MWœ€‡`kR¡Z¹#¾;ýR;çúÖ¡tòiëOø ®Í„GtDxÂáåë壯¯Ç÷wÿç§¥Ø}VξsŽïÊÛ ´¨@Q à$À··>|kö±çÀRúh¬¡>½ß·gþ·ëÜ'÷¿ßw_SÏ)þßúíÝÍú²÷ŸÎìýÈb&©Ùª6à“ Ó_ÃÁ³KÐ9`Vrö˜ÑÄf”¢± Ö—"¤Îÿkö›WåÑþˆ-ä…é±÷žyê–$ò È9‰šÓÀõ‘=êüÚó½„}+´>¤Av±•µ™)òS{yë©’s®Ë[.6l\ë8èžp˃J^AûHµ½"otfØ÷vP„[‹gÞêæß-åHUÔŸxŠ£³ÀI1‘Ê9A¤Ó*ÿìÓEæè•‹_ûéƒÕÙeˆ•ÎãðŠ91ëìæñ1"Y†è$#p P‹ôqé¨ô«{\e—$¼°÷ i¸Í&Íb"O`ÎBáàb,?uú>Þý;ýëCœ5)¶!Éx¬‚ *Ïûæö~oeâŒés·Øéj‘ãPy741Ìîì»}U2Á‘jõ¨Nî­»¡X’ä–R“¾úðíˆÔÍë¼æì;þ‚WŸçsë•×d¯#è‘ú$hòe[ p,GësUÀ™.0d€…ë(äÃúÜ7šü\³Z暟nnKQm6Ttž›¿ëíÅ×+G’‰ð@ÇÝ[=mË6ÊU0$2½®pd6pi‘‚±Û¯&÷³w6w^Œãïû·Œù°è†nÀ®[SÚBˆ/©˜JÛ1523F¥‘u¶”+ÝE ¹omñI­‹ ¸ãÇ£é÷”¯ÿ?ÅùÝÝÝ?ÒÛù›ìfòqûš!/%æBcÕQNcÄÃ>DÎ[Wîú<¾ÇtêßÁ!Lƒ²/aŽ_ÔoÏS×EÕï®¶ùž½ŸuÇù‹VmùŸ÷­Œo§Ý'cì§ïǧ÷ÙüH3C×¾9ˆaæÑôÏÈ6Ü‹ntjÅÛðd\ʪðJ^DÅ>ô§ÌÆÚMgµÿõ︂¨u*‘Ð(8¥í ž0í—›ÐÓ •(µ:£zœ-áˆdo ¹pòïD*sš$‚c©FêõÃ8ìVˆRÔ†öÀäÛ¹w:‚Îãg“µi“ﮟ>ÇÜþjKN®º4Ç›ÛEcÑQ•‰H|ö½õöL+Ǹ ŠòJ¸D7àã3H’ƽX/ªR#ö4$ÊÉ(!N—­â¬‹Lr•T]P¨1ÂKH¬Óˆ¼P´‘S¼løÛ¶C¬JZj:™L ¿­ïÁ}h¿:˜p%|6¼Ç½ê|>‰s4ÿ¡:OÒ^»è Î>;¿üÓtã vû·æa83÷³XuÓós²è±…ìù"ÐS$}Ä1ˆ†á!š‡‘gý`z¾v]2n14jšc†åýû¹ÞAy¦@ÎÀ\#ô:uÓºš×z«ŒÃôÛxH¿Ú×LJ*«Ùë2Ä9e,骵0Ãä²€ƒF6€6Q‘ŒhÈ òÒ×DZ´Ð&^pB±E“†…ð!‰8¹À2“ÜÈdÓé(çžlÁ5«s bP‘²È%'rä¬&ÁïˆÀCª*Z— IÂŒ’—Á° *Ššê%hF ÄÅ‘$žíäµ<7PJYªApiQm™Ÿ2®ñù¾FÏ_ðã1‡R†ªMDœŠ˜3 ¿Ë¬ÜÓ9) 27Hf¤Q€ú3±Ú0iø¿¼­MNúä?z£00§á—þøý¦ùæuõ7]ï}_¿wgÎ(!,Ší±)B ÄZ±Â0™‚%PŠH%£&}\F6RØ4.hD¨4–ÈÆR@¥&.8¹ó9Ëè(3 õîðˆ»(›M‡)L\•Y‚ óÏ—ù_žÉ­RáºQQ…&ÀÖ)¶´"îéÜ]O¥ag6]Íω˜Ià–Kå”Ë žŸ¿tqèÂ>S<­ ‰SðU|}²£ÎÇ\6¢Ú¸·q{~9^ên?îù{º£"L¹‰Ð )ÝŠoåRÁëûißÎê5k×5”t»%u¯c-Ý›m¤-æà¼Ä½D“ °Ðm`ÂD¶HdŠEÕÖå)4Ó ˜ hÑ[aN¤a¾©€F­©¥¢S'¨(µ «¡@I™PƒSV tÖ&>¥hÿQ‘¿‡h+–¯ò!بš®A»À*šŸÂTÎÈŸë¥Ï5\ÓØ%®Ó™iÄÝ×äC¬—€lÅî5 ¼Ð Dž‡”ÐÌí%&EyŽ¡Æ²ª¨4 â”hBÁàUÄjI/~IÎëm!¤ýd]Üñ³Ï`F¤I±˜,ElŠÎÊ«T™É‘‰ m‘+Z>d”ÔgÙ‚ïánt½™yô{3-Gqµä(Y½ìÉ“ãûÚ‘çÚ*ÙŠ„xvjú=·þe ¦!á”ôÕýöZ÷ä˜@¡iI¬_W3I¦ g™^Bb ÅïÅ…L¢Ép×ÙEZkM›GÅ“]ïò•ãaûøjú¢7œç—M_ë#¬ ¶xïð#Žc„+x+£”‡½Gµ–>†îè£Ò§æ×GgÚëÇÑ}ØŸ÷úÿÿ6ÜBk€5 6ž¬¦S‡*LH™s8ˆÂ3¶„°Lz¡×ÃP3|[»NÞoÿòY~Ë囼ZóâSI²WÏŠ:Ù$ÏÓlq’kĨI]µxÏ€³¦[ÚÏ#Îóo|c—þüCbå»>Í±íƒ ¢–¹ d-ˆG8­Ã­¹ìž4ËAóëG©˜ìHqEZ‚JüÖÊ*ª™‰L‰îäeß®À¥ßRÙéÕÍousÙê¶@;Í\½…ro~ëgmÓ¡§|m{k}ÿåÙ9³ß~/Æd*[ùœ™VÄè]ªâžÃ×`sóþü}ý¥þœ¥GV8>šîëðþ››ÖCîØ.]8;, ¾l¶lÖbðh,œø§ò_*ò8ƒRß{ûÃéœÔ“AÕ'¨9i_MaÚ¥H²LV4H.„33ÇYðð•Od(³KŽ«*Ê2¹Â«ŒIá"”¥ÃòU­=õùW~‘áŽèÈ ÒP³¹øù!y·¶2{V¡0'ÁÞjÖeæ« Ým#y.¡¤9ñqó/gs1õ—¯Ô7Ý}—!ºª¥“šŠº¯÷ÃçOL.]ëR®@\y¯#ú'¯­éŒÑ¼Þ) ÕV+9E{‚Ýi…Š2 Y„ÐÓÝ8`ŒìJiÉKÁsêÈ3QñóÇý%÷²‹28îôùìjw퀩¸E‡ŒIÍ¡çèº'”ñ>i“1BAµ“œÛŠ Q|º£zÌ>Š2¶ësâ•¡ãí?PŠ×5²K»=ºÞó>¾¿%?ÿïþøõõû4w¢O´Ãt PqNBhÕ¸¹?‚ÏØ0¬…Š÷ÚÆÊ’ F nY‘*¬…!P2S«Èiù“û•ô¥}-^Ón9ƒÉÿ¿tê–íñ¸\×ËÓtèœ }ê­7"?,ÿ³‘»Œ›;aê•ftiæ{¯ÃîÍ~êŽÀÜ™QS7g?—ùzþæáÝ­–EDm¿bøé‚·d>+ü¹ããZ3“yy|þk'Š6jÓ) lÂÝkX6€fS9¤vâ¿‘ýKÿEïòÀË£tÓgÜ’döÑ:üwö¬2ÚsÓ¾™[kDF€‚çŽ9u¹xŒ×2ÉÕ±â0o÷??¢@*õnª·fýõœõþîäãË]~·]‡²v8|y8•t\~¶qÐȶÚò(vå¬Å«5ÔÚÞËöéù|/Žêh@h–3¢«8îJíÙëûfÞ^ƒ[Ù€™X´,àÈ]D7›\¿¶âõq>U3(ÈZ€ŒÄµÙFM \«d (Ú]ÏŽD™ÉÛ|!Ië<ÿæD7mj†PbÍÍB!0²ù\·÷Ò;Ã= °"•N}S?¥Ex§dJÈ–ÄŽ27ãáò”+PÀdÝümçÏj½’‡Áw¬2¶xÕ:æß{;Þ/S¹†õ©ÿIê¼ÆùÝ«òûÙ8Õú þ–.íyžøá¥Ÿ¼ ²CƵVgíÿ¹„{ïïOPBKŠõ§Ôóy4?>žãÛR™º¢…¼dë[Ý~üü{¨±¾Ø}?§nÙœö?%{v÷›%»ÏUIId&JH¢ÿx€k’i @HTQÐ̉AL§mÞ¿M‰˜I‹¬Ñ¡“âÊµÆØ¡9 2Œ à}PF˜‡4ÓÔýÜ€t”bSP!Nîß,\5¹2P'G$£½% “’:‡hå!CôX¢ã`Š«m~UÆ.Å…äÈCÑØØdÚóháÂÅË•le ÄÑö²ÌdÌVs*ܹÍãþú¦nÏ-‡žÉ^u´¯ÙWÊ=XQ(¿ô|9ñÔ±/"lºâ úDÇŸ‘ººX, #Š©eá{†>yÎýÄiñBEÑôÈÑ´ö¸N˜òUݫߋêùj&ÎÏè&ëŽ.êW-ap`5û'îG†-?Ó:Æë!©ÇÓc›Ë‡«ÁGÁ™¼äp'æºyo~<_¹šš9Ñd8pIY¨^ìÃ^»ùC÷ó½ë*vÆd‘[ËQ™QB”@%TIJu¨'óŒKm|Kײ޸%&¥9† `ù¼ïÛÄ4xo¸A.Íó‹èS ÌxŽkÌ}à{n!PikŠ¢œAÎÁ•VÜÉéRHíYcýdÇm‹xOdä>Ͳõ¾Õù°1 \ºÃs>?ŽI›f0jJn öî¤ÏUåþd>oûJϘr{ë:•™­«%JIy|=_z^»½—^Ÿøë×7LG"ØA…·LÅ7¢R+ºäl“ÉÈÏ´Š•‰H…HÈö©ìx2å1)™€¦’ÆNà3Ž„PåFdTj ¹²qª}Õ|×Ê‹‚`2Bˆ ëÂ]_‚v¦4L‹`›']€KérÿõµØOùçGûsC¦ð+MðxÊÏ­àõù·úý#>l¯áJ{™3ûíçñûüeû±SÿÑõëX:lŸ¸$‹¨â”Õ]¦¶¦ãp/•è¢r¦ŽƒíZ´~0.qíç0&C…ÊŽk8‘fILìzŸrhhlâî~šjëƒÚ|˜«ÐWœ”1[rÙñÆÒà£bQ%bQÑpœbຈ`èI47VOÏb (©]øŒ½n²(€}ô}Pêh‡V¤vW§©H(CMËÇ¡ “9'‰´& ­0&‘ È"RY×h¥…‚"A:Ò˨©f¥D‚É ÊW²ª ®FÀ¦Ln¨P83uŸŽ·ßuN7sVÙÎSùßùÑ'3p1Ü}ÞÈ»5†|…oc›x¹ÛЂ<÷Çÿl¯mùSågœ>P(¼Ú¿¼‹©k"ÑÔ.àò£»×ÃŽ¾?þÚÏßÀ/çé¿ÿi/®|¢Ã>È!u kd @!qkÀ6•(¸`¤Òµçó°åöª¡4&Xˆh€0N' £’j¥u´’Òu—Xq£œh¿[RŸÎ„¬÷UÙ"Çû1N@&Rqû—ÿƒûG?Îß>eÇÝV¡Q zêES’®ÝGmEÖQê%¼/dËà^(–î`¼”:v3•Sæƒ;WüåóöµsãÙR˜®Y‘:Ig%ì)'$¥’Ñþ”ᣨ;yŸH‡÷óòãýàùâ#Áò`ͱŒ\Ç S]jÔ÷ôÆž|¼¸ŸÝCÏ v!“!—È€’ËcÕ˜hêM¼c ÚNxGhJ‰?ýøñÏÞó;œÎø^‚«=€ge:øIJ!Ê E tÏËcë‚j[<„ZÊÚ„.À€þgÅŒG"j5£YÏ\1M³n6 7ñlKþZéc ±ÏV'a±çNS®­L<¾¨ƒîn;×!@ Á³0 tÅžÉÊv< |-³€qŸpï‹sκ¸Œó£$¤EžÞ‘ÉñSMW‹Zs.𰉥á3ííšÐƒfÎ'ÃNM‰šG!°]¡ªb?Š:$JÉzê#¸!Ùio“Ø)ÈëŽ#¸ÑÍiÇLšö¬7vF†Ä5–¸Ø¹¼îG:bøìˆ¶VœJfKEá>®ºXì»vîP&Ö튵 tlV3”‘31AÕ PnÓîІ›ÞF ¼ «Ruâ7eJå‰ÑAˀ莭ï<¦oö×}ôç;vkKEBÍä’CîI¬„&]MûÅø܆U-ƒ‚€(ðöÁš¬ФöâÏï3!Ó£g.-q‡¿~?ÿxo NKÑczÝ—.l¼<¦ã>öæ.×*­Ó³Ü]L¯äm ­¹5ÆiyDÑìÜ,ä1Œî8õ[8¥ÞÏ)èÜN<ça¿ÚK1ZOºŒBÊ9¾²>ÕN²ÓÏÔ¾j@üTÙ-£ð:W6ºhÁaÁ[¡¤KÒ½5Ç;á«8˜„_ƒd4CbB:Ê0ª¥x“6àŽ­ôd8ͪҗ«|ŒV€ÆK?ßûä Òc¹bŽ£­þKþªµoÙ,Ÿ¼ÉÆö­q÷—ÿs×gþô^_‡ëSCQþX&šÇpEZ?':óÃc ÍòEÅá`Ûë×ÅÑ÷³Mt°¯ÛÊ—3¿ðÌËÑ?îëÿËžú»æ±?:$ò[¼ú;§±†o#{u~dð)&j”Ä"LÜuIçŒVÄ”­M±_áöÉú =£0' p¾9Ð1›if´æúÖŠç5F]•¤I'R[{qîw•ÝÃÃñ‰¨s¸–ò/‚MÓUáÞ/È0°ªˆ![¢ZM!êV>ݵùQᕉҜ²o“©Ñ•\7`¥ß{Â_®Ÿoî¯å®Â¤f]zô)ÜQ[Öxt`ì#¯ñÙï8òqvÍnM³â¾½!³5ïsä{ží °þŽsï~qzOÔèw×ÕÖ „L(Iï‰no9õˆ¢}¬we%h7õÝuýÒ¡ûi÷ö÷ƒ7¿7ãŠ`¢b°%¡žQ8€zDÇ@®ïCõ|hîR?.‡þËW—¸à3£ý'T¢3<48c0ûáØ3ÉŽHz‡¼ÄÓÐ}v:¬ÐI¯ˆ鮜‹\SÆDp*[.ÃF) QHÄ ` ðU­¢“~æ“ô+õGDŠn(xF/feDJb ±8À{Ò;Ñ_Ïë<ú3”±tå¬k‹¬bR½Ëœ¡°R"Xò:K. äÒë°$”êæ}7¼µÁX5ˆ¤¡:ɨ˜Úµ+ªôØŠ¦*aWÃ/ºK {¢œßzí nà%xC 9Uº’=¦¤ÝK±õ»^YZ”¦zéŒMj!ªæZ‚‡®=ПànV÷þ7ŸÅ-à¨fŠG!Ñyâù¬øãà¾m¿}7!ïÀà%MŽM'ð†È¶,A ] ÂQY.o´ñ¥ºF ,ƒ !`ÍLÛŠÙ&°¤¸C v¦•ͧŽýI{¿4œç|Z•‹ñã°ak8·žÝ^y°T Â:†Æ‹³i­ÖÛd“¢-3w{ëë¥|©/æ/ßbjØNU¥{$üåásì*zLO¸ðÎxz,ŒsÇßûE~ûr–ÿáóÄÿ$ÿÜOÝmõß·ÌÆ‡ìÚ6®Gø¦¢z_;ûجRþU'öò†YpÏ=¢‰¨‹Yù¶‡r^5 ˜~•îSÃ.4Ä#ÇòíÅý#}Ÿí[—®+kZálCIw‰G_92ªY™“_ÀÞh£°aµ¥[h8¹å1”ì·½ÑßýÈ6úcbP¸ÓU깦3¦V„Á8¼ }Vk9°c!¦CUŬZÇÄ“ˆøcw¸¸fÏOÕM2ZŸ|ú“ôÃaeXMÎQMÚ‚‘ý×B5ü³=.½­vëÎ:Ÿý¾¦_ë¿iu÷þ ¾ÿ÷ ÿñ¿­É¿müf&+‹X4¨Ù'WT#¢ú23Þ¯h†¦Wæâ]µàïÕ<ÿŸ57ß™»‡@Ñ—èC’ººù®õÝkîÖPü—0AÒÀ1nQÑ}õýv~S<“àëôV¼Q¬îÄ•Rº€•¦ò»ÿVsðü@~ïG7ÇÇݯþéÿ”J>þÿïÿþö$y”òÝ*4ÆÑVjc©#<µ £ * S +ÙÒ²h0#¢1",ްDN01 åLv;ïß^÷ó/èGà)×úcІê(®1ï§£•îk J:=š‘"£¨yç8Õe' jÚSéÑÉ‹¹w™·ÍðôEïÝ|’(Þ/6HhÙ@CHÓeiµ*{KIPG¸9úõĶÝr\<ä+ã+ÈE[CÑõðÈf×ß~{$ù| (¢¨j+N 7ë5²Õ­xexêèUæÂ™`Ê($ÑDcÔœG °µ$ýù ^FÔ(2`ºÌ®Á¥ÜSÑB)5»âq@†52ÄËCÕ”,`C©jÕÛƒgÄŸ%`sU®W®zg¸K\Øü_û… ýFy,è ìTËô`¹ÒÄ%³5§sÝ98>ŽÒ¦cª§ý†?¾˜&šzôhëµ+¨¤°¬Á(Ø“™@÷áĵ5ìCïs­—ÙÁéb®O`©fd*w¶W]×O¥“`v 쇣¬Ruùà¸÷SæÞÅ÷Äí{V£˜ëÐYÂRáNÖ€Aò~óOg„ªxÅåÁ`äßñpÐ~hÜ—– e²r@Ô A]¬Ð^‘œH@õZGÙ¦’¦7'rŒsðŠúv§5J¤ËW« Á*ù`âz¹ÞV4Îb™œy>^>_<ùWožóoü9?ýÉýçõ•Äÿ<=9ãh—/¸kÚa™™4ZöÂë>¾Ýåkâ€~[Äë~‰O¿&¹·´­änsEa«o.¤(Ÿ½ëãëÊåûO?ü¯ÎA¼ƒßºé.|o¼Ó&Øô“Ý{ÙíµüW MŽûy­tø:O‡×'éêlv¸»ONBlÇöõø„›SbÕÃsúU&mœ4=-!€`Kk›kgF4ý뺤Ëïi†¢M}ºÓ«]IÍ™«=êSœ #`V ]!.¬År®NîMöçÎÓHt'ãXarA{˜^¹»™¯nœ‰$T \’&·ô5Ó" UÌè±~>χû§×ꆯÛä»->=ï6Lâ*}k±©ühp6‘@Ókb¦ÌPâ•4¸]´&ÐS4Æ Fذ07ÏÙJLdÂ{¢Ôt-G³ äØ7)™uã§E¯¹CÕ6ì‘"ÀCëi€Bë:ô.uÛy—¸=û\gŸoÒý“Ñkî~ÿó/ë¬ý ÷/ ¼²›wí*Ö<»¹ÚûÏ^gŠ­£Ê=C5šRc‡ýæëûjx õé¬Ûž¦ƒ)jUêúìjïCØvSBSÔ®G˜¢tñ27™1ÞÉôü^AAë}Ÿñ¶ºjo”÷šzž{®<ÏÇÛ“•ÞÖ„LJ™£ tÄ„Hà X¨Ñ4 ›µ ÂV†-+— ^;Ëé[ãºpÛK>Ôé©ÀÇR4°Â*C.>„ Áê(+ìžæö^&09ú¼Ø™sUMµ+¬Y©ådp_Ó3)±™‹5ªGލš5 @ ©]=³ àá³NHÆÖäJ-2ãxøt4ñöšÉ?ÛóYkÙ;à̯·?dÚ{ƼX"³ïAÏá1ÿü EÂÏ8yð­s‹?jîÀkøQf€z6úzqï_r?êý÷cöâÛãÅ]N©™P@µV¸D@`…b„5Æ.Êä7ö"‘ר:BÜ’ˆUB+DjR¢uËþt>Ù̘¬öh¹7ïW•Wì†9D:§3¦Ù´ÓcЪu Ê<Ü3ùñåûj²&Ëm¼…µE%(bµTç®Ò³c”°6£ÀV‰Ð€ŽûÕgª¸Qr^7ëÆ×^Ï%òwãÊOµ÷™äæ¼ks1 `,‹E" §‡M^÷oÆ\ñm˜¾˜ùÌ;ï›iäE5³gú † S`÷6HÊkùŒz?gG^7Éö¹5¿„ϮԨã\kcgp/þ{vvÚ-q§³å$n§½ W­0oÓ%\ÇÚ·—ëÿº Òˆ– ñ`HË6AáéË…Ë€Ìîés+°c"Æ@ð Ãb¨%èYáoçâC¦¹çv‡<úàê{ªšIEr¶‚½ÛŸün×׫BR=‘¸‹‰œ¿â‰†3X›¶i"ƒ"öídùÄÔÆsFÉmåOûõhéPv‡ ƒ5Ó¹Ùñ ÉSTãüéa>SVB€W%žFd$çIV͸)14(‰—èR¤ƒ"(…Ÿ—9R;Fƒ8á½ÞÒ% I??õ—Žùá1K“¡ÎêØ•r¶dæèìdx”tvwn4)÷0¯. ûUkÓÒ·³¢) I‚EF:ë@¼Åsþœ ýЊ<ÉWfV†åÜ";*ưó0nní¸1F2Ó—ê³ìCêv±q¤#D>¹¤–•Û2Õ€)A p‚’‘ØiÒ  ‰SŠàƒÛH+ ThXÕG|@O@:hs.=t®¼¾Ÿõ£e_ÜnœnÎßoOÎ e$’—TgÈ'a&’œ-úÙÊ«²þ †.ö@Ñ‚~ú‹ZùŒ”¬ˆyU!Ë|Á]ÅÒ¶ýDoI“ûÜ‹~”5[Uà0O°k•2¾úópÌ€O_“Ÿ‘e‡ìÑš·³f¨˜ØÞÔ„˜\‹žªŒÔ€’D€¿Ù¿gÒñÓW

ˆ£V­<.ª' &FÎL h͉©™>VQ˜:y2»î>ã KhÂYäE Fœ˜rºNW*{fi‹ S¥ƒ1œ&Òf£"v`ñ `ÐÞ0×E+ Ü üóLA͈ QA3†È+m{ázúY£,é6í‘w£Á}ÀxeÆo_gÔ”)ZéZ,h’~¨+:x¢¨ç Ö9’'Íï¯O¿¿ºuÓ”BÙýÜ»r×ä »Â¢R&´um’v55ÅïD éÄToÜXP %ÁÉÁÅLs1/F-Q}~W›x Kø üÈXd³”JÏšú,¿[ðéùÌ}cøA®û"ÅàÝ>»d”D8¥è'˜Žº™½SÞ#ÓmeffÖÐTN~ù`üú#¯@2C8ì› C*Šî£sPÃÛ.¬Ôè{ ÿ]§áõDÀ žnëkÊ*¢¬Æôì‰ÞØY7³w<{:ñ"~’iéYß»ÆúùK@BX¡Òž¶á[Ö„½“ù03˜5ÛÃÜÀЮ-Á¹ŽKoÜÕUÉ"é Š5Õ”„ y¬fœ8ˆIedšÁczö.ÏžôìÇù%«"všRܯ{U †u²z¤y?¯Ï¸5™Wt_aµd¡¾G§Õc M‘ˆÆz£1r’@:<®%`S¯ŒíÅia°Ñ„ÏmëX®q\&Ævrë•¿¸25¹%'Ê¢³bs@¥šŒ´_}  Í#µ²Š w,-"I4{lŽñêiן¿Vû3¾ÚžàwæÑ¥fª'z ºuõ¯·K¿e'×7ýïÞïî :qЖ6>ñ{/M­~ö÷5¶¨ªŸÚý¿¨3o¡vmþ0‘²Ð¸ä%ž’Um¥¤/nDO¼õjé¬ ðKŽ`î8hŽ”£Ñ*lÀ’Rn4*‚É•5ÕáÜè°s¬’#ØJ\NÎ@DŸ3¬³Ä×Ǻ9úg^‹j¬Ð“Ñïk‰mÂ+À™¦ºn=´1–W¤öynuœõÔc¿2dUyÑÇ3aÑÌÃ"ÇÎ#Ž×ËëŠ×6Ùþãø›ùçOPOã·Ïãs™ˆå4m NãëÎ/ÓLÇcuGÙ;;ÿ BýÒ$1V)DȰ|ÌÉa,^ØV²aàµeb1=éû9¯‡ë‚Ëä®Wû1žgÀðOÓÇKÌåÜÿ]ò½ïŸŠ&ü @®SKAñJŸPE?‹¾úÔœ¿Êím˜{ÆZ@ATi¤ä2¾uøãêôÒ#»ƒ=ÏÿX£ëoiO*Ÿ×Õk¥ˆõ”Ž‹a^÷¢a U2ʆ³²+פqа–¸ ‚„J‘ßX ÉQ½Ú EÚ¬*î×vmglWªœJë¬:Ǿ®yýÌzÒ¹Ä9‰Ï™úfÌŠUäŒrÙß¾ç8ºq®wæë{¾íåÿx>_áïÍÛñykœÌ?»“5ÑoŸüv @.0 d:1Ù?lVe±:;×iP ›ý ŠF¹»;;"ÿ®Æßs{²ÿ»HþG§\½³-9¾²yyÇ9—×”LöÄçã‹ܨ¨W4Yãl ÑúÂda²*;^µ¬È‡a1ã`´`Ü´q]‚Šæ‡tÌŽÃ*“w3«BdLqÊÖy³Î‚¯jaCÕ4è¹,€¦©­e­ô°žÎíû±ÂöWáM¡á“Ý.Ða9Ò/®3L¹ˆ5×ãÛÂOµÌ|/LfÍd7Ü_µjƨ©+Ÿ*ÞTK·¾/ÿn¯Þ©Ã3}hVý™c¥eP¼‘“Ø™×4wÖYv8GÖCÎAs€ÁFç[<£-Ãçkª+L(*^¬Œ–z0m¯Þå 52ö17Zˆà\Τ›)"¶‘iÛSRu’2Ž’¶šF?½‚ìË>Š”÷d—*Q:8tà“/©/.³ªOµbçVi-į¼~cpZƒªGBx¯â«»Nu}-~Ø_¦kÿ•©/Î)$m&à¥Ê£Ä‹Ó6úíž—Ìd©¢æ)ËýüºÛ|±4äØ X¢aÞËÙ]0{Y¦ù¯Ï5ûõjVòw.N]b¿b(Oé‰y§ÁDZ&ð;ä=;‡ßÍf¸Í$™_NϬaóe# SñÕQ¯ç¨ù¢9ÍÜÜë¼VÌ-¼oNW9Ÿ1ü8쑱¡ê`PºhFxó(CârŽÀ×ødóy•Ùyª¬>Ëk×å×,¿õ› 3³ƒjM‡Mš.X¿¿fœ¤ï=¿5-Óºç_Î×!¾FžÊÇÂa_K£B”T ”SmGcüáè1s„ß )ïÊ%TÞªWy‰+©$Ö!0RÙ("¢Î¬wÄ¥üa'u…£è%ÿ<E1 H¢ ‚H™¨‚æ™*±Œ¾@°rÁØ–isN’ .¢Ý@ ~D‚³'¡N®µÏ-rÀhô½¥O“ÊVþ§g˜òž/1Ù˜>û)˜¬'­y?Ú®‘_R¾§i}ÅM­ê8-Ý æ·èf ¡¸hò­9}Q5`ö×^§gÌX=5¯/u^ÚǼ^Ýø=jÏÊ×׿ž¯ö­ÇtÌXöÍÑðeSv¸ª»üÜMJ|Œmèä·²+°Œ§b]Çì £ø:)n–PLb•`ãI˜V3¹I<'MNß(S”1Kœž;a;‚©D"óé™Å¨¦hKkHa0À*Yp›rP `U³ \,D1¨ 8!óÍXQ,× qç`țֵհ kMT1¤ û÷`ÅÕ~nð* ¶Z3eˆMx4ÂÏ‹™§V ù3MòÉ °gRnÒKxFv 3fhèb:›x¼|²üÛ™ÿ/ï(ón·ã3¬M°-yáüWÿö¿ë¿iüLY7ƒÍs`é5µªì$Ã`h8_Üß5=æsûóký½K¾¸˜Î™–_§@ B -¤5Ã,ˆ!FÆÄ*/I'P6Bp®p„c€¸²< ì#Û“Ì Jº§ŠÇú®k'ò¤Þ2/ôc§â¶Kæ`dOaËŸ¤¿´3áœOy–@,ÀF$Æ ë «‹ç¼l^“Ô:U )5©3‰md«®¾C‹¨T³üg©?÷‹¾á}:dÅ£h):`#½Â–Ùm@É É•÷c; có@ayÎ(à”B´BIëªÂ¸†ý.ÌE˜Š1æºÛZ””µµm££úU1£6{£­¯–9T èe\K(jª2ä¦Ìp˜J$Ô1 (£‚¨B8‰öö|r±—þ¥8“ÛW¼¯|Ô?еŠÌ(®aDF£h¡à£²¡pÓÊ«—®gcÞþ>û®UõB ºìŽ›ëã•{uªgƒ÷ÑîótÓyúùë·ñ÷o¾ûœ›~øÇc>δÕt=Ê€oÁ&ìáð]Î@zÙeÍ0À‘­Âˤ]­[ψ<Íš =žg¦4¬Î/>s¦ËÕw¡WNSÀ̓”“˜É¤”l±%5X û@mVÙ…)–nŠ #€ÐlÑÊnRD! € A KP¢`å÷8Ïÿy‰ÿãÓûjÛ«ð¨¸Qe=ævþP¨C¼÷òß¼Ï]4K˜!Þ=xÙ±M“ÉÑý…îíÝé"²dŽxýâï¿q„žm;UÂçÒ°£2õht¿^îè¿èÖO ùí"«íÎëä“ A¡Iñ£(à©3æ—Ø|¾¹7s3PP¡ò|ë'kÞgÊ¢¼¸°|úKO)å®þF˜éÙ#¾´ßïΧÈ2]®ÄÑÂ4ÇÉxùûäb±TÙpªÿÀáÉ gÃ9=”¸™Î§µ¼ùxù¿_ÓÏÿ3ª´´ÃNEªo¹<‹ Ç‘ûÝŸRyhBçqžM'؆pC°Ù2À £!Q`s ¼ c-Ï’VÈ¥dk`«ô– 7krvïØÆ¿f³’½>biÝèüÙ¹”ÞËQßô`Üñû}¯úêoìÞÚº²ôï±Ðûº2›ØÀŠ%-ttF˜î_lÍ AÝ€ŽG³’é¦Á›ƒèw®(Ÿl¼ö£‡?|cÄgäYºÊÝØ®Ý¬ÕQJí®Æ D£ÄÙâæ:Âø@öÛÅ«˜»cý«×-P´`AR^)!³È<«ÿ¿æëD²aåµS²Ù°»¶}¯iOð9®ÜXè£Ãm 6Gáª+æÍ½¡Û6“2OEYªöïê×j­Þq´­YÃýI?ü‡_¸ÝGª'K ª"§ñéÂdùïfŒ#ë™v¿¦ù+ñ*‡Ÿüq¶½za#¦!ö"2”Ù` K\JJ¦Æ,Ä[/ûF¶”-õÊÿ<ë{ÆèŠÿ¬õºá1¹PCA¸Âký½W†ý2ÞÂÓ £l|ÂC2õêÓâçoA©?];kî—F~›MábÜ!„¼}cõM÷Çáõ—ˆ}fk<÷…˜á~{-Jô>a¢RJÎG?y4ˆ,Œ,¼&À¦QÑŽTŽD#›’4¡$`2 Q¿$÷ŽÌ~Ǿb©9Xe!ñ$OÆ:_:^QÊñÜôÊÞõ}yNªpÓ$9 iÕ……l1dtëk?ÀE~›åæÿ8íu¿³3Éú*Õ|´6’¥¦)âÄN«ÇB8iQ´J,6þsWJf¨@kåNe–þBÿú_)_ÑÒ¿?~úþ©Šø¡?šø@‡˜#‘µx_àFžÜ}Ó‘?”8JÅD$À‰<1)öÑվëÞ‰òµÍö»Dê`PQð45…9wEšÐl½?–_…³n¥à7}Œ?J^¦ÿ©Œ_U¿W' ºv×rm‚†íçºgLæ¤ÆÀg.“Ü"\•UÒKñÇ”ÉŸÑ ·ƒL{F(œs¿]ó²æ,äÑ‹8ü‚ráïÁÛâ™ðt ®úPZ¹Å÷ÍÁc«.—zÅ뮲–c1¸ë2¤yó2<(îj}L=}b>2›f­œœ7ކ ùð‹_Åj÷VÓ©¹‡ÄL¤TÕ4Mѳߥ̉YÁzÓXL+Ñ”cÚ¾kê™1°´ARâCN¥5•ÃQžçÏaÞëƒó;­¤eˆã¡ý^ã!oÛç”.-£E¾\¾‹=Gç”߮ߑÝàÀ(8ù´•Gúv%ÒÖë{ŸUl_üŒøpÓÒ$lŽG‹Ì tê AµûÛÅ“ÅÏ— …²`ÈÉ䎜ƒÚœÏ†­úé;Z¥eTLjÇ×}téÆ(b´¹ >_³÷ð¿Ëöy¹yNŸþñ¬?ªLyší? æÒ3¼ÈòÖá=wc(2?é¼ëÜaxpw^öüäÜÈœ ]Ä¡tŸ…wE¹µ =Ó׊’ø›ç‡ž¾œÊD¸ V† št;åRði/ÍéÊñY3¶AÉfn¶³/ßC¬Ø¾bV¤'|us>™¿5{Nëû¾Bî}?]\ó|}(ýJÒ‹U|â'y›¦µ¢0Æë T2Ü·nÄqYǦL« ‹âÈé­@üˆ‘Ò¨I£•…ág(¤‚8HÆ*ò} +3ëu1VÊ× ^”G8ÇÀWj÷6R¹½Úö•ÔéHEÉmÔLh•FþÛÚ˜{Eþ¤§àžà}¾×Bs/˜Ì[Ú[Úci.£›Óœ.0v°&ƒ»’}Ä©öÜuÎ×wfsÞN]@ñ† ûùDšÐ‘J2*\3| \ƒË¦@ºz_¥>nú~fOºBÊ(’b](wÒó¸Ücy®òh d}<©À·ï·+ÝoøóÏ^ËlTý O .í­{„,ؒ艳Í:ý?ei>4_iœb˜‘ŽˆÔ®HI'XTG’£ T†» …aƒb§ÁKEV åjÁ8«(ТcM†"€`‰’ÚU¦d|VÛb Ëï{v\ÂÒ£Y EpÇ¥©QC‡1¥—xhÏ:ð*¨©é×é’ëñæ°é…j.pªlOçtÝÿéU޽ž¾”¤/¹k\~šMWÿùûù—}<·K¤Lº]Vò§ÿ~þÅûÓ¸#¨ ª€hgóÔ!]`¶<ô§¤ð ¨}À º³ûžù¾6|ÊÎa“,jƒÞ€3IÀÂÊPåA 0fk±q»\©ì‘3$Å‚ E‹’0öâÏí®*p{É,@™°aâƒÜïàEî½”k?§‘F!S02“L_í:À/õnâé½Jï†u7ÃCâ ,vC[¢Ð;åMHX ¶% (V6fs_’"6`e.’ŽZŒL kAÿZ4Íbg¸—ÆY“tIY(5uÕ㟷’Ϥ#‘{d·ê=Ñhw//Û‘' U\°K¨µøjy½¶>~¹ í_8d ÷1â»kᔤ¶ìxÿPäÁÝÂQ¥• ) †øMæMæ•i·9!Ÿ,|8äYŒþ(ð­ãü‰ˆ+·ï¡2áXZÇ¢ïòWþ›¿Á}¯[ºœAè0"Œë ³AøpDCÑ¥PXEóÖítHøp°%fª;¦7g—k{Í&ß0=¤ØM`.—­ |¬Ø”¾ÜOSBHò¶6Mì³ô}ƒ"¸Aü9 WGß÷ѪF]É@LµGSGP ugá¯Búj} ~_ʵ£3UŽsŸMà´Ù}µó?Ê/ þ*xƒ˜j–Cv¶Þ‹gyã6“ >¹üB=¿¢¹Ÿø±tAÀKjXœW¢V¤rN1;õn}´ðˆZ| ~a*4óéäGo¯°o/6¤´B¶rðèë®gí½ÚÈuqÞ_œß™A ÜΫï»)×ʞꨧê†vHQÅV°Ð̲ÚÊV¼Chª÷j­·3«ñ×Ô›Vk½êºÞª|%fòëxjhÂ1â<êÒî4 "¨(*HÀoŠçóý¹ëóÌëíž·²¢®\¥PUëÃ(ߙǾ?ßxŽò˜´•ÚžžÇ6¹mryt9õpqœ|g·v½)¹,-UB0Ǹ˜Ç7 Rõ¢žgä™ÖÒ@QÐ7Ç`Î¥nÖöÇþÚZÝ’glÌb£Ïþ>(hËœšôý¨á”aé>mèjpd{ï’™©©ôØÍZ‚ u¶•Ö ]€@0ÈB `%7 ²T}¥†S/üj¬¦]_d«ãÖzQ©(ýЊô™SfòXóê{Ùjdq £ –H ©Jᓈ5Ù`ññ5§»WsC{Ãð9¬f[Êï´þ¯ßçÛp5cÝÃyïF ‘wzk­mè½=Ö_n Ç­¢Ù¥B–#»LµVzßøóMþE5Àí–.«©üèë;èk__½ñBP‚ƒNQK,g&r˜fu‚¼ÝêETöß-ýÈi*ñ–qוK_Ê™05ÇŽe|5jA$ÝOv©u¡ë#5ŸX'JB±ùhx\ØS¹\düb´Ä°À•hÁ°ðNwÏT2i(¦PfxÍm1TÈí.EãÆê/®tM lÅ`£XuRÅHš”¸}b£óâÀF8ÓZXÜ/Ñ•ƒ*ë¤O<ðÐÉG%»‚=:íé‹R7do)îbFX¤7¼üKÖrÍü`MG÷ÌݳßR÷ë\‚†Íô`ÿÚ÷}v~×íÝ.ŸiKÙæbõ­7ƒ7Õ“jWkÜyb¸: [ÿ.MeZ„ˆ,IYŠ”|Ô˜­hwH›Îѧ5…ƒô‹Q"¢†Y HjgñØC&âdÇ.Erd» ½«:^aÔô úljžýö@,ž?bÔìý0•j);Ȥ`‚^.†% #J`Ï-7Â-á[<‡PššÓ¨:aK:°§Ò L”:¬9’\²S4ñ{#3-›=§ÇP>h ?mý æ9Ì(ºÙÃkºCŸ+x?d–-ΦÍtë°UOJ\éò¹Õ1'tÎ>úŸðO·Âܽ4Un©Fua0s RK°ÙÛ–wÏÿ©e`¬eë² Ó.»îºâ ¥^Õvú9çXPäÍ{ý «ˆµãAPòbMT´rŽ£A ¨ÁálPÁœðíÅ٥ߜIÉ1°\‰o\{«+²uÊÙrʺ'4úñX¶ãŠ"t®¢Ê6=@aH Áºˆnè²aiè‚ «s~{gÿÕo]ÿ¸Ž-äˆ"t¦‡¢ˆ/Ï­¡úÃW> fãøùõØç@L3Z¢Ì„‡êmÂþHJãÁ‹õuç®â§i\“o‡—âS­5€vå² üñ|Fô³7¾„¾KÎ >ºƒÍ¸„ùÒ õöÒÉéËîÝöžo.æ°Í©g9_øÒ«’5f§ntÜàÅ3-ªâÎí\v;ãöÁû|îm£à»öŸî ülø‘ÿX7RŸÞ«ÜSÛ ½øÑ G?í_ÿé½øû{ÿ(GþµM›Àc(Úÿ1¬‹]XExy©lŒW³ßëÐ"þÖþîRþdÓ~åïQ+7Oëxød³ã|ì–ÏT´¢u£Ä<ˆ†L$êŽ5ºKÅbÐ8Ì[$[¦+Õ„`€ž"¨æH+\Myß ýç¿åp`c¬è->ÍØ‹ 87‘‹)ßûìIf˜»{÷|+ã=ú—0LB%ìDàká—†³ðF’¥> •\ñ“}=¿è·Šƒ½WG ¯JW óy£ /(Ko¾úzn§æ2'Ý}µ’ØhÕø…ðl% ‚c{÷Šùç=o1÷³pf}y³»—Õ~8ýòñ»Feº)ÂŽd¶ç8gÕ×¹UA¡ë„éó9ñD\ê3|ûIïiYPš g³YøðçgO¾\·>‹Ÿ¦V…wñ—óØx ꈳöÍoü]üìç!¼^w:îIC)},9ăCƒ¨‹OÿYy¶FãÆó¾DÂmÎl”I+Ì¥)$$R+Pj]škF\t×þ, ”®@³ó±&rv…*lßlo[§àé>Õ޽ǥíã­oub­I_x›ãñm~Œo³‰sósŽ×-®+qeWå’ÉÊóêu9RYÄ–â?ûÓ,ëÛ+lã>ï?öæ3s(x7¥çÔå‘ôÒ†½x4œÏ–Û"ded õC÷Ö~¸ýËÂsHø±%wׯɆæ¦@D D{eGL O›È—ç—ç°‘÷¶¹O»J}¹˜\'8A`ôBûüý×ÖãØ|†êÝóŠ[ËwŒué™Ån=|5ªmMáÿîìc÷ÏÌ—KÕºìˆ,È;îµ~6©Ç©ƒV«£ÎÖàO]ÔMFÆZûõ±KÏ_|þ±ÞUü\ÁKtüâ‰'À"$DwlÏñÉ%ºW§åÿÀÕggXjŠP ³¥¹ð:¤®S31°Ò¥÷ÎÅ×[&½ ŸBaEˆ£ˆ²nwO¹VcÀr 7+¤Æ°ÞW9ÏCÕ1ÔìÿTå+n?º~Ÿ§gËÏãú¼V«Qv,uâ¯?£w­>ŸC-¼‹L<ùA´ªê^›©÷¢ófÞÖƒýØ]oitëtZ…(zŸÜÆËä]ùQ­ÒE÷Q0 + âLqÊ]‚5ÚŽ\ÿñÊ÷iÿ.ûÿëÑá§ýÿ¿þ—çüùÛ3ƒþœÏó­‘T†DveJÙŽ ý}ÏÝîíj¸7æsßzÛ%蜓 ³·÷¶çÊU¦gf ßj¯Úi–»>¿6¬¿f䇵 ·nÂ]’%§õ“ÄcX—Ïm­QÂ;°ŠM8^ÍnᙜARÄs–û§¾þ¾Ÿû¨?¾ºsŽÃyÌîûæ!â\FGÙfઑü9ªF¯_âk㨠bª´6f ¢ôÔÌ2–eœÁ"CY¯•ˆH±"‚&‚ˆ™4I_5“DÉJR]͈3݉¶‚SJ’Ôæ‹ b €-è1›­w¥2Çúã´·¹A{¢ ÍeΠט¤w»OŽß¦™‰Ù#kÑK|‚k8srÉý"ûÁ†’½Ã¯.ܽ&¾_ÀŸ¶ëÿjÝͤä8+ËLq;÷yî{íž7ƒ‘qeËsžÛ–¨qJ$ÐPO+ÃLu,CÔ$ÇN4âºãTáhÈ,L‰Ð?±—ö[œN™E¢ÙëÕ©2«?8} îÔc²xõ1sÝžMH§HJ†ÆÕvþ`‡þ~^å‚]:ÇžÍ1g/ß¹²ݘk&Šˆ)Ùí@AAÌlÝJ`Ñ€B2Õ‰˜Ê "iŽ1"èb1Š`bG‹€pŒ€,*©` Æˆ»Ð©ú(#B1iM™Óš.ÎÈÑA•@qÄâï/OÜ:v@8Œ+- &Úc€âøï¤½Ï͆_nüRÿVO‡ŽèaK—»óE>Ç^|‡o¬Yé+¶ydûî݆8y¸Þã¼ #;z²óÔ”¿Ïåþ—§}ˆÁ+J£ÛßÁR” ¥Äô ¦#4p÷såô\$ÊCÐxE›£ñ Q¡{:ÿ;r§×÷éûy©ÿc0¦Õjã ÈIá¶œ~)¯1„ü¨,L úö7:Öo.[ò=õ:v-žz[¤77›N”×¾‚}Ë {êqº½=‘ân®ÂÑ~”]EmQ%•x›[Ÿ^¿1~–êäÕD„4ȆÚA~mAÖA’ø—ÍÌ…4Xmƒ?~r4¿jKÖcäðÕEm‚ÿåð”XÃþ«#. ¸–J(a$Mq2ÖŒ(~|]IÌmVÕ×ú·®ÝÏGÅÄ$`Ae*¤“r•{{Goõ6²vàöEK4 dùÔÈG…ëÕô1}‡Ýs%¯‡½"kOûßšþ;¯tzl¡´Gp©2:ÔN"@aJÃ-EK`ntËÙÂÈ(†¡3Ö ýÕ¬…uŠtˆ¹Õ¡ 5^“Q-Á„5«x1T àÄ­°Yñ …Töóüõ›Þ>1?~öZ“¾‰%,JY‘XôƒúQi¾öç^ßGÏ}óÜßí×ûe¥’½‘ëé9ýð¡;'ûvßã‘ÌÛCäê{MØÔ[šÓ§©t(6õx–^Îü°¨,ó"ùBîš<IŠks$÷øûâ¥cŒt«HÆlT4#Kù¨*yJ¡4 =?¤TŒÜGîY»’ܹçÄ/F'[¦‚`m|„Þ–Ñ@Í­æPØŒ c¶MZLTB#‰`‰2Š!_ÉU]4y_9>¿›>f¡”aDy™´Mê8š3SLCZ1X Sàìà|Õzeùñy7Ç÷Çô:›)Ρbz”Y›Äô(²Þ8€8u!¡ÞP_ŸIa"Ë|þvØßß\{ÙˆÖx`¶Û¸!·=ï &]v"E{èBÊ>ëînîQóâîÊßèØ/ÌW°Ñ†rúoÃïk&ñèý§ÄWh³Eο1ûèÆæb,bçI»ðhÿ‘åmþ¸g?{0‡¼*g‘?M‰kooÄÞyßa­¬)la”Љù#Ô5;.­|2«¬-È ©Bs¡KAˆ£‘}XRrÙJìî½ d {ʬI!±Æb’Ù 7Ï} 9P³"ý@A™¥¨˜©JæÄ`²¥ž«ß¥Ô²¤ÕÌ‚„Û\S|(<>'4¬´¨C%Oì9yÒc– ÛàAAÛ¸—4¨(Mü@«¡‰gÈ+Ò>ä 8ˆ²Æ·ç±Èý ¾Þí·Íwîºÿø /7_½æ\‘Wˆ–È]ïqSð Îà‹5?7€ZJq²¹©'Œ…¡G#¦œ¦àCûo JB9¾1•»º1ŒFQ‹âbÄqÃü¹ƒ¿öÇØÿë¸÷;Ôy DSJžE·ãð=¬ :eëðÖÈs!E™š1™ÉÚ Uæ0€Ü×öüöO„÷æÛýOxcëªû2l£È I´k;K2?7„‹k ŠÐ‚¤z`²«FꊇJÀ&^+„l¢„:¶±­Ä—sûsÛoÒЖjh¯=©Ìœ·Û­dVƒËP–'Ÿ0!‰<»ä¸÷I•ÄÓu/håÑÕ’²#X<³1ù—£²$Uù-T›@Ð9žßàzÿÌöÍ‚†Q„T8 FFûVÜË‚ ¼Ð ¶±S–BH,˜dw/ú¢u®Ò§bÝq¶+FpѱÊ|~¬’KѱžÁñèLç*)cãØ­ S±xWKëJo¾(‹ä‡XÓ–€² åǽ™HW€0,ŠIÛifƒ±ÓQq¨+F¸á<³kÁ½ñþU¡â-ˆ—ƒÔn¬Ó|¦îöòçÀ®ûµÞÞÊç•ldˆ vY66».[`Í ±l=ªb!>­G5zò«õ¥ÀºÌšçÐKý€'<6·[á¨h‘yÏÁ×μ±ŒÞÍï{GLv›Æ2{£YÚó:úëµæ#„°R½Oú bÓøÐÁ@ RY´7_\ž±óÒÀ¹›=ÙºÖëøåìÍ_rþ$JÐÆoûÎm_?º¹5DÓ^Ù¼}ï¿ý·¿y:‡6 ù» CÈ2— @½*b€-A²äùÝ3L×XOX’.‰üëÚ¿¤ÕÀàçGÌmý‰§c Éa·oÑ%ý ‘æg9ÁKÛóÙ$D¹|š ÛB)À#!qF8Ý °@Âm„áMÆäÛBOV'Ï…¹W<Ý&ŠL•8òg_øÆ¬Q¸Y¨lðŠÙ”AûKGÌ0´™wŽË:ÉpÐ äLp‹ÞšÜYìݺìPÈó„=Ûtgé›§û4“0áCqÝâE‘’¶é7¬ê¶ÜgsZ’䦢 {‚Y­ÂŒñÍ~@L¼ïÔÔíÌÑÝOÊï {ˆ¤1±£˜+ÁfËnž.,RQÔ]Z曈´³dâá;¨2v?W{—ñ)m‹íc°+–Œ…¹âçgb­M·ŽÒ? ñz畵oó§y÷¡Ö[ÌŽÇió.ÇÎÁ¡uNK¥~)6¦–ê<ëÞô8^ˆÔl²,ç„_HÁÙ蜃 ³4KЗ Wâ‰ãEž½)|ÿ@~;½ª¶3JÏz Üp¼ÿØÞ“7'Æc¹ ``D^Ò ÇhÓ%ŽpAƒ µ!úX>p’lK³ÖJÜÊ…¯Zä@Á‹½aÊn(~ŽÜÏn?&—Ëê4°8ŠgŠä S:T£UC2’W*muäšâqÐÉ è4eÌÀ`6¡ðügǬغáhÒ()x Q#îh“Gn “•Œ¸qÛäÙzÝÚG¤9VÏVQt×%: ³êšìAZ~±Ks5?ú*óÒ[/þ°CÁÍë¿Û+J[Ÿk÷ERSnrÅ}6¥™½XsW»â[;æ °bfTÊ7h_“Ñ“èö«ù˜üžb™»ùo^ËÖ­Íêä=ã:þ]i•ËÚLÞ:|‘å~ÅvF?Ðû™cP$‡@˜ÛHÄ0ÈÁ™-èòŽðSoX|ùbg´?cTK»ÁšHhRS´ÒN$C´–^xz´üçÛérOwCZ,ÐI./zEßH3QS‹4<®ÚVgn›U“(*,ØuïKóÒ•ÂM@\¬f “XÙ‹Öc:ì¡…IDêˆdD}Ò{øŠ\0‡_,ù|.Ή15.ø–­Ü$[M •!€^$Cƒ "`.ÎðDrÉ,w–8p'ÞíyúïÜ0\Ó«­ÉZŠ8çÉd? íIŸüü|ýüÌ·ÿ†Õc»®î§áG,àÜÏñ‚ýxõ&lp°RÈwBgµÙ¨ÕNüÅjvþôYDyr¼… Ÿ'ùëyÿrƒïØÛ‡~ó°¥tïPÒ®qßé;êçY¦WaeÓíøyÀ{g¿Cƒ9×n–AT¶ÂÎ2¯÷æ|þüvµw#;ªð`gó½þzGô.Ÿ§w‚ž…¾ÞYË÷D±sË$:¿ÒçÍÈį’xYij0›`ƒ±²ö´®b1AÉ•W¤8x'ZN!€„XÆ€‚ÞN™ Ez¦[-Œf²€XÕYÔIm²-°¢Då:<ޤËi®‘$@ fÐJ¹Ý <Å-…%*‚fÏ[ô>ú´oO,È[¥÷¯Ü±ÂgÇwÉB0¶?çŠÃ1OkŸ6÷ÚËpŒ$ñO°ñcƒ÷ûÉê>uÐųj§ÔªçI!MOi/B§¢âS¸©Ê&$¹†t"e)t‰ÒõÅ—‡v¼Ñœƒe»§:D{[¦ôŠ:¡vØ03€É^Ê>GÜú>` ‹Á]u?#g^bìÑÐj~I8ÿ´y¼yUýÀsZީ΄9šFŽ0D.ËD­—Tê¢(Žq~¬Ô¦a@+Vdb7bj§YTQ—JYЦ •Á`À¢µÚ šF¤Áš®HE ®Œ".5檈EQÍ º¡hhÊì ùÇæ-('¤ X ½¨cçvjïF½øÃè÷z´ýr»·ûÌŽW¬mý¤–vaYùk¸Ç7[D"F bÓþjsMgtßxçs>áÍË\˜|~·çëwØóÖ]k‹ÞÂ?+ßå#c0™GüT¨zªÍÙîÈ;CüaÞùµú€ t¬ÞvOŽÄb,„ˆ féæy»Æø“œVÚE 0’x‡@!fMèxîÑ|}‚»[]dÏ–g8§Ï4ǶÌ,AÛÒK\ßÙ›ìýg³²ax&d„ÂÛÆÂ·l(J©±aœ Gë“aÚQcw“šA®Œ´I¸¬b9OFø–Þ¢Ž‹šúÈ«Ô` ‰Ûª«y ù¹ÄOnüâ¿ç:ãCô Ü`.4Ä "\í” šN­¤™Ój’z1kŠØj ££ŸÊšèFv²F·Ž_i`Ä?À‚pÒ.ÆÚY>§énlË#¾:ö †²áH4<ÙG:Pò7÷û‰à˜ˆ•gûäo³×µwüÈ+ëŠ —•?ÒØ&Ù’^Ânxxpü2óJ÷ÿhvD*ý`Úq“°JŸºÿ§ž—öÅGŽé#_!yЉ^Š•øå­Á®ð&ºÑ°Š¼¸†Ü} ¼Î\u7YÚUŠGЍ‰’ãâWóªˆ~5Ö¬ã4ðqèOT’+‘Àˆâˆ"|y²/tØ©r¦ãª§–WðµR*ÖkI» ûÞ@ºGÙ÷5~kKÌפÿŠâ_PÐrÄ…ÑPÜl/Ʀj‰ðÙžè5d4s’šœ æ5â„;¡ÈS‘S&O'îKzé~uû™¾½Í0umgÇ>vÆ~±ÇƒÇ¨H”´ý_‰ä3÷š^ÑÓ½Yw¯Õ²31ÉtÝ0¡Á’á4†:ªTe íªQk‰¯û¨ç‘òìt½ufJ»Q§ég%@ž ]‰éÁѵK¬cCAs €§¦GtP7†oZ;ÈîÇ +W€’&œóûBλÒÌ;7÷N3PV]SøÀ¡ÄôìûÙ?Ùb®õç™æ¯¶GÍÙrmuŸðØîõYß_r¯ëóù ‹Ð8,Ó•;ì˃·&ýzÔ¡&€þ1w¨Wë/4ù݆¹\>5HUþÚðó—úð.縮ûJñÏn³ÜêÆh†`úU6Îí#£ n‘¡:>N°ƒ­t5«#ž9ÆYKmYMÀL‡ Ëlõünè³QQ’0>¶×A™± 1«pCA@Èña!+ë˜&cˆÁ!<©Â*-î9ïk…R)H€2_Þ¸¾6øtçkg{;Í6{±‚iò\[ëõ˯®÷”B¢ºY¡-ešöõ‚&¸Ì0í`\à·òEéDÀðHôÅ2ÉmZö·Ò’ñûÔaKÀI!”Óü¥×~]”\ÆMŒÐpÔeCEýy§VÍ'¾–õ†Ç-ê*ûÖõu‡yúÆ¥2{ËL´­^Ý}=韠ß{~t i€Q3(5“ÅG÷bµµÊ׆WÎ{8B ÌÕ¶€ÊðµîÂèr½H6(H qÊ ¤a5ØnÙ¡(.ºWÍ>ÀÓZ¬À†@ØÅQ& ~ä÷«ùÈ€mÈŽï›®©ÔÉ[áäèbÛö=ì;ì”^—5/•PÌjzŸ2@ MCÌÁõ“?´Ècèg`¢¨a¿”“‚„0XLÛ”`F¹ÁK½ÐíöŒoN´½—ß,Û¯ë¢çéqÊÙÐ{w, mPøáVÇܘ(^Gd,MÇwmu+‚!Gü†‡ƒ7%¡ª¨+@Z»g~ßÙßk;¯Þ¬Oýs—ce?»å‚7D‡‰ÿžÆ±ö¹ÿ¥OÉCeÓDîúsÒ«é.IE™€ éI#<)ÉÈ9ײx’Ö;ÄD\JŠÐ….½‹gÑZÌn;¼gQ7¯ˆÖFS9!ú°lwA«LV×Sœ»·>À2ÒWYl™Âì˜Hü§”KzªâÊK‚¨Õ橈.‚w…÷Ÿ•œ-=ÔgØn»„¡)!¥ŽÏΠ»µz¥'„œüŽçáyßÐY/Í$_·‡ºrv*ëÛDV÷-ë3Ð/t¾…/äĬm¸ÚèIÝxêÿüFö…dý7ç!Í786E[–!íä›mN6æ-Ü °2Ø!QAÜ/™#CÑô!“‘èF ¡ßE›Ì0ÇÌ‚j¿î¼Æ=Ó· gCÆ2xËšY!º½r3«ÈK<ÑAԡן£^i‘ìQo>HA£¨¾é8—û¹/ØÈȈ TÈDý¢ß§pVöþýýžÇ8¼ýܾ熩dB õÐ •ãU}§ø‹îüîbÀ±N‘»hº)­(ºß}ø @÷£(@}5fú†w'À-jØ@êl¢e‰ò¡NÝã÷¿Ã{ŸÖ'Õ¼ÖrVá–ÓØŠ]ˆ#µ—å˜Ãj¢WÍtº©þ"0{”ébü’Äm|öqMÍZBÓ£e¹|˜9ñ8ÕË35+ÒC¸ÝoGíl§ümægðw•OÔ£€O—EYF;ñºØnÿ›j¯{Ï€~Qb»¨ W“h˜Ô2a`ì$³kÊQ¦‰F Ù‹¡Â¼=‘_Zí×7÷×›Ÿßgâ—ÓJ1Úam+ƒYP2"îV­UŽøaÓz jbŠ8ä \³õ£²gÍ—ß{s„žE¼°£B”2Å“FSPnZ–Ã*ì×óåŠõ®s<¼þÝ0Cf·å°£m¬=kùžÃ—ó?:ÛZCýxßMÌPºSÏÈ­K¯ðn_4eêÆg/\|Eq‚9KJìSj/7˨[¢í\1Aö^?Rì0QA´\c¸Û ÏhÛ¼f¼Û^rÿÄ%† B ÎP8°õtØ9l8"6ÔªN,bsLEƒ~uy ÔF`á#^^¢¿ºŠÎ9æËÊ\H`h;;•Ûuí|ì°›ˆ'…±Oãâú@>V|~ªºò®IÍg+¯6åɪÐDr`ËP|.uêp-„B.6«€d¨kµé«ì|Zs­ë£I4­ú#3h6qEq7u{ÞËŠ•r¦Ü~¯­ûAÀò3¥ƒE"„ÄFBÌea-T…ÎЇ—œA¾$²3È‘! ] [ZÔ?¦#K%… €f)˜´ò’î±T+æ™{Z–A?X>8­…ñSz7ß7?×t%ÌrcE"²"3lùñÔ›“½fC?R„ZîeJ˜†l€Tµâ¹9þùØù×\;E¯/zýé÷õŠýñ\+Aú¶góu•»?“üôOÌöì‹M Ú=òh»¼„ÁÔkKÎÎAÎñ›ÞooööîÝ7ÝßA>7ôÁßf¦ÒdˆË…ÚÙÿjþ­×ËàW!Á½uW‘ùä Ëé%Æ‘Óx"íÖ^õ§I+¹ñ m˜c9 ²n÷ô…—…‘ÌvyètvOˆäêv˜³ GÚÃæôæ Ò&ƒYŸûÌF;Â<—±‘`ìbQ%hÆ!î9Á±×ZU¤èˆÛÀ‘ЕFw¹‰)ÒcÔý(¢Ä›`w\É<  ®tD 8’&†Î©Ùœ ±«¢RM[ß²Ïøú'¹ÇÁÛùÍk)³(¤¹Ý§ÝUWñYÉ­ô£9XØè§Ï(Õòõ&rç4©N¯p&!Ǽ>Ko+Û¤!ƒLeÕÙ-cW4±°FIdÐXX;é)Y”ËšpDµÐ¸æáÓ1zXÈ¡¬éè½)ÇÚQ›Œ" Dˆ’¦Xå”v™y6¹[Ì–Œéòf­ÜóÛïB.ž)|½¯¿I¿ýò/FåSøÓp Ûy«$àŒ×pq䘬Ènðì¬ì]Ú<»aÖÕq˜ˆ¶&U­ jF4ØJÓoÙ¥nVr@€†U‚M%Ç Å Eö ÒFÅ"LD²D$Ä&kM2"Í3©w;jXK©ƒ®á nœ ì’–Ú„¯ë‡È–7®W;tßôç³AºèšqÆDLMƒL6xYR¯y5kûî\͹¥êÛOÝÃMÉôD>ÄŽ¹yçøŒº’{ó³½½­/ãqJ/ÉÞïÃ=°À@ PAøPÂOu»h.AÑsQ}î¹OŒª‘j|*÷ŸÿΟêÑÿò¼§KÎm±f˜œ)’‘§Øëò¶W‹:× @’)§·2:…QD¸Æz¤-i”ÍÄŽ+nÝ”K±>˜S© !ÂjouúT.tIq˜ØÐ C°”´¤ð¡u¤Á… é+$¥&^hHBŠ Mò“Ø/ÿrV&óaŽîá ]¶öt¤óP…ümÌU ¼‚Ę-("Ög½-\4]j=´÷[|½]FtÚƒvLQÎ×íñníkOÜ<H5ü¬ËYÄšžŸ´ØÀ"âºãrá†3«„½Ï7_ä>µS8mÀØÂ=² pf:ŠºÕº7Eò-&Jž-éáwAtôÄ=%­è›Œ ωY#-+0¹6Š[‹4«e,[Eôå¦h[tÛ½OiX…@bÝó–Ç‚"ähˆþ‘·žæ—+)ÈB}øwUˆõ¾/îssƒÆ•Ic!/°i"ô%eísµ«×žþRÔ¬0…üÆhO·æ£Ôks‹õik~¼ 妹›Bƽš‡0Ÿª§ëgpQK/Êœ[ÚçRn“± ÓÙVšTIer‰Ž]æ…=—£¼?ç`GöfôÉÑ~çöü¾P—~R-“Zf{רbզʘyì)Ó^á¿X­'mÍý`TÝ  JÏÒÎT“ I6îgZ³­®´µT±†UoqW‡ÿþ#ùùÏ›ß>ÉNÝ]ÇµÄ #¸“»Cq˜!,fÎ|NW»‡ˆ›é»+`í¿í<$> )^×S®ñ~M}ݽ¦…]~ÃjcèûCB)t¸¡EÝ$ˆ¬ æž»­¹«”á²ÆësW›¬3{[ïmÌ^óÑqÊ;D®eÿô‘õ€}wŠ’+šÁiG”)5ÜüXÎ×»:÷JµQ^°C÷ƒIçÙ`æXñ`Í9’®“dòüý £Æ”ë­“þ÷ⵎÉ@…oðí#©†Éq÷>¯|m{Š,þú†v&Ú.]ºÒ¤0¼X¿,ï¬ÀKŠ˜B  i©ÐK, CØŽBÓ!Û2ÌŠ,‚T úhˆÎcRÂDyŠˆPˆåS´ŠŠ>Ø•¯ . õ4Æáí#öæ'GÌr˜¤†™¡´Z–­Ã}¨ SÇ¢Y4¢ ´D¶Ðq "à°ìºÀ "Ú_S½§"¢pK^žÿAXîâ/Ã^½¦RM×D½ùt4ÔðªÞo¾ý®õOÏÊ?õ'ëÞ¹1•ÊkIØÄââåàMó†ì–d³C"«L‘„صHݹ ÝËÆ6(Di˜lCÈ6ô-YÿÒÚŠ[ýpÌ'Ρò§…m\|»E oïag¹¦Jy/Ø)ÿ!#“L‚mö’”¦¾¹¾ýìûø1~É)e‡Dënq`îjÎzˆ¹ß'3… ©z-3$ÛL­p-´µýîN˜(Њš¥õÉoëqàíí¡³Ž§\#vÚÑæ#]ð˜Æ Û:Ü‘÷Rª¨ 5ã¤Ï#î§êÃÙ=ßé.Ÿk`Ls=˜ÛugÚN¨¡R€›I­Á«áªÓZÿôüîn¬ «ö£¡5îT”Ê[ÂÎàxD#¤­Pr<}UnšÝƒT÷ZJ-•€JLÙªÎôT8ð·Z׆œ˜ýõqí¯¿ ²´f®_§Ç_Äé©ÏYzu¾Íëéëh¥,E*ŸŸ¼‡îodç²>X:•LUöC[Eè ³/— §öÞ[›!éÍûiØe6 ØJ\ÃÀ,ûWnåyk9ÒÓªq¶µ-Ê.ÿû௠VÌgùzäf&]“ +ž8¼š£„-d‘}öòù±»°v)H&Œ–M‘B*Å 8Kp6Í„×g ò¨ëÞ"nˆŠÛ{}:o ×ðž’ï;aÛÔhŽÊõFM’ko³Z”Y퓦 z­»@K-§Ñj©Ùe+ Wš@j­Æ}ˆGÁn­ ‹[ò2$+ìi:L‚°ä@h@` @v#¶ÕÛûÚñï®ïŽÅvÂ'Æé™LŒ4µždÕ:e¯†Ý¾Ù³/:È?Çm¦ßh“**A²0R£è+Â5íI?å‚bƒù»Ú÷ÚúÖ‹u¹™àzôù×ë?»žþö›“?ì¶ ¡wHy%P[éðô|KÆ ÿˆûAVdŽñ¾~Ôì çÎØDÚ…àóÏÀýto•½ãKä‡&ΦžÌ–ûˆ%M‘ºÃÕºËz6\׆ô®³t7ødeÞ0`«¸{zâ¬ò ;j·Õñ @Ørõážíòí×éÝÐ]OÖµìc;ý1¯É´òð#¬àì¼ûŠ¿}nߺ¾‘îGgû«äñ0oË!¶KS¶`@ I’µèÍd`ÄoÓÿ3ÞÝÔ¯ ¥‰0’`zz$.]eù¹¦á¶Ãl‚rnQ7;†–Ö©Ø¡üƒÅí’ñÿWcxa-ÊYRäK`«žÔ/`ý‹K?Úè÷d1ã%¦RïÂj ¢}Ðr¼<DB¨˜nÉt Óím~¿î­¦Â7Án^8ΊcîÙ­lô0gÍZƒ‹´—“›ÊQ÷WÀßÙOôvº,' ¹ ù‚ÝU–Ã1Ýë/PÿûV¯l Ì2°Ì XxtÂJ( v”–0æyɨ.™ÁªexL¶ P,06t/c·‡6B¼óò7ÁEÞÜnQá29G‡¡ª#qô(™„ü—²WŒÎƒ°U]NÛ€dlܰ(¶á^h]í\ìžî§‰‹À4‰F’ŒÁ½7ýã·Øë÷Ó—Þâ•\ ¯§›X¼È}¼!T$äç_\|í÷Ï¥lþ 3æÇœ_[Þv£"]4$ZÃÎl½ú›ü‹¬þ³}µÐU‘¨!^…ÐE𬍯D‹¿\x€£!Ë`¨å«©¦Žß©’Q+ÓÄV74é.ãGˆ'ô ˜_€`Bˆ+¶Ú2¯÷‰}¥~ÞùÊôçc{Ê¡6©ºã°ÕyöÁGNx*ÚOöÌ‹Ð`Yª‘,ÁÐ&›3…×j„Âd…:Ó¸ S²!õ8_¹= NUÓûÉó–oø£þ…O¯{ùü´ù6×Gf±¯&(y0/Þ0EØc%3Q˜±AešÆZ¬I”Pâ#ÅÕ!I¬>UèqЬ‡(ÏA(Œ$áh&{œÙªz5‚ñûùŸ7¿Nù ßÙ8}§E”š;¯”:Í2Ý2¨Ætz”¿»xÔÁ„`'¢Îÿ:Ϲ“ÿ¥¿ÜÏv´;Ú­3pæ;Z{|ðœuë™EMRä¨ú~2¹¹Oj¨gd²g®ÏŒžË”Ð_€%qXŸù ¯ V… ¦ñP±®ú¶³ q©Ù-fÁ±°â,¢jFšë?ºÃÿ8hÓú#ù}¯mµF ¨À$1»® ãÕÜÛÞž”–c‹ƒ‹Lï.6>-ÀÜe‰€–HɲêBxl®naíS2¿9^HJ×Þj[w _ ¢í×¶ûŽÑwŸD“Ø´)‚«Š-V€…@RæãAÕXãø]Ý·ÄUpF.å=»Ô „J8³…¬¿.O3R&~en :ìÐùÄßè}ÞüÙÞvc…,ÈÍ™'÷¨‚Q‰,Ê2.ˆ’h\“Ì8Ÿa‚i +¢bØšš6SUD¥¥‰M©È¢„%)C1ZMÃF-'ÎI¥ób*¿óÅ£‡ËÌz•wÆ©Tj¤†"«`lƒp6Ûi‡äþ+ÁrÃxdO¨7'¢€.Âú9Åã…V¡¼ïÛyüq®Ö=ç©|\<{'Á)ãûwºé¬˜û­çâ·ÍÝÓóÕJ‚‹Á*›»Cb;…#*4qCjr)v·‡&F”ŠqÉ,ž©ïkôVä³÷fo§¡ÛÈÃu÷oq¿Å},i»)Â.àÌçýóè«nkݨK©°H~Ê×@bTÛð!º†iñ,™1pãžä]³Úeï’›ÊSô0®®ñ¤H‡¥¥×%!HR/M¼ãÙ‘3ý¥f$•^É´”JO3òñ6J†0Škµ6ã­RL Œò b¡j½L`Åd¢qSîô"Êâ:1ûmØ«ö±; !‡è8'^øÌ6Ã*Ö!X‡4Õ>?—Ô/_në×»éhœàùÔRùáÚfúäWËW/žWlIw$] ø¸ˆ/åܸé0³sÛr_¥mÑ ÆíHìÖF¿rUÖÒHy³žLŽÇŽÝexŽ 5J˜I¥t£ù~B2Ðg«ÞʹpÝч0k6’…ìî䑧زð¢ÖzR¥”0ºc:d«´?ø'wSëþt>µ(z#"³„N/5×ÞÝŠmûšÏ×Ý•ý·m€óÿñøeíß\ò}“ñ›çË/ðí‚¡eS6rWù“ß}ãiþðÓù~!_wsÁVHÓM÷Ë@L$Q*β¶òxD9½«ì1°!`ób50…ˆT®BÀäÕ †2PÓL¨©"š¸U `Ú´ªwÜzê5#"ËG†<ŒÍ¬ÎØÔÑÚ9´Âɰ²¤lpü^ùtÌÈBï e§¹Q/ެMÁøÏ!.ßÝy»~màq½ÅT4q9ô0èòÝúÐãžwˆÝîï-¾±Ô±æBû æ³ï…©Ï˜À€ES^Æòra›W¨!¹°÷¶Â$G%Ö@9žPµs­kG!AuŽX²Š«¡5Ô´îþ2Ý_‰ç}ûÿ÷¶ù­Jhćýbzn8s˜}Ÿä=vÛåÛä±i—,£'™~‹©ëÔÖ•BŽ´g‰ƒmÀbI/w t"çÁbnõ29™®îb \i¥à)þB8Ø@gW_œË&}XR®¸’Xrs±ëÖCÍžŽoͧõT+%)lMy|*GŒ§gëVìX2Ò>²¶¾(4XMóg¹n;c7r=œb»‚aàú˜·äûÅÙCæ smÍ©€/eÉ‚u}æ2X¥Ö[ʉötÖ#Î-Ö³-ýƒÊrð?£ç}ÛaéÖRÀXÊjÓ^aš"ln¸u½K(”å f¥aj¾ŒŸíåGûßâsË­ñı¨€¤“ŽöÈ™˜†.¹! *¬¹žî.,šSReÂ…CMÇáŸuž5º­WÏå‡EœÆ<ì03}¾Ðªêþ“ÄÊíß°Ô/™¦óõ?¼ýÛ*ëMá`$壋0çKMœŠŠ’%…(Îw{è-POØ9Ùt ׬¦#˜0š ªëèÛV솃\bºÇÃPV©‚̦b¾²t„Áo¶Qq'“Âé•R&ˆ&$¾rMkÁŽÛ3Å‚õ^üŸZ ™`dçZSŸÆÏy1lðµôQ¹FîÑ«4rS\h«Y¯š|V®öù·Î¯;óäü«}áýdo\À+ó9ù£ŽÈ†öµ£ÞŸ_ÖŸÒgE+¥äZ}™CÝ–×ÑéÚ¾žâÏíYo²z¯jözÖkYG³­+ëH9fˆ>¸t}<º-F+âljÛÆÓ3{ýÞ¯hþþvéÛt†‘2@B¶ôxF}*¬Çùóí‰Ë•õ¶2¯9ù›NsLñK8.”äÛW=É*iú!j™Ž§Ê¨á$¡:F1ådºŸž{-·¶oâÇ™Drp¸“‹5N“3é)ðžý/Xœ \¢¥ËÐbH(“…º±* žïÐÇç+| Â¤LeÚªŠØ~W*‰€–€;á4÷o@‡FÚÎ)'X69âÚÆT –à÷à˜^Ž –dB¡BdB ‰„)ˆmŸ¶Ü°n» ¶’ÂÀD´Œç¹6©ë?#Oot:ПóèþŽî,7nuLrÐØ@nð°¨…Wʘv(/{Kýã™Ý©ÌnBþEü€¿&A ÀH¼H—ÙåiñXÉ `A~ž•ûì·¿×õ¾ðãùäøFç ÔC5ìr[ö?†ì7û=J˜¼£&E…ÀædIŠXRÔöF6¡EŽT²Ë:Œßçã¾ wôNJ5ÎæwpRàÉÖ};Œ›ó¿ç‘V¶€¤Ã /õ%¦ÉûèQªz8‡ñªºÇG/ߎ²¼Ò¹º©þj¾{ïž;k‡ñþìO%>’‹'~Ö¨A2–r%ŒÈ’ÚùÚV<À‹tˇ*§Žô6vvYAÙÁŠväòh¡·ÍÜ à 0eÛŠ ŠãgÛÒ~Éž/Bìðœ)hž¬ÈhAÈD)hBµ°gÜ3<™‚L[®\{ìí᨟5Z«…å 0\˜Þ°$´°›,¶R"q‰5*SIX/IºŠG¦.(…ÿö§èœàد~ÅðË~Æ~®wm~`´ž>XoÓzòتi™YM%²•¾"äAuø¥ð?Íw{ÖÏk8F­F¥Ñ[ø±ö•9^äÀÀ^Zënï‰dÙvHT¨t…Y6.iÏœÞL1` µpåDµ)JG…ý§½]!Åj“,]×o8 $»†rÔȪ¿(gCu‚s—·î3 (ã¡t¯uMg«gHŒ—_wj{¬íã±,”q;½:Y‹Š÷Züú_Œ‹ê-Sþ\qùzA1B ËgØn’/•ŒvíÐÀ pÚ”ˆý~tåø¥GS·OçˆÌ"þH¦Ëû9]ÙÔ—’r%¼ÎvÝÈhyaòÀ˜n(¶^Ä{Z_=Þf¸€. SlÅ(šXÞÐar&ŒEÔ‚­»êü­ÿéÞÁ}󭸆󽬳µNõFZ%cÿ‰ÿF`Õ ú*®½Ñ#³8wÎgGd—4]B)zÇfE£òKöU<ž'··†ÕËp©¾Ê7(FÄLí’xÈ©T³Í!¦Éɦ޳}¤6îd3‘a/H”Xq©8b>Y„RîG,ª9º\û£¡þ±‚jÛ?¿Œ_û…0H’Ùr¹îá,­àPÊÆk–oÀÚrrcX$›'KƒÝW|á”se&P”Ÿ×•/"yCÖò­Tœr¥¾øe­}ÏKG9>©äÄ×wƒ”ÐcÎãlXÔ BCX¿^1¨’ƹž‰V´Z6¤¾¸QÌ•Óøú¸QqÔœ"p¯oÂz|^³ÞÕ|Ê\Ä€ÆPX`¡…+.$¨báˆÞ®rúC4>Ù‡ýùÿmß6X[9Úì„<ñí¿8<¹³åä½szÞCuÒ׋ۇU¿LN;K/ ;jf§Þ8m†Sf*lCY \qÂáǃ—†#dç¿&ÿáåŸ?ó /ñ× ã,EBBö`t6¾”_Å0mÎA‘á”C= ªêMú ^/‰ƒQ¦ÇàÜédùŒ„6ÖHkÒâXîxŒYøtt5%ö?ÿ34§·¸JÉ›cw«otNˆ*Ö5 :XoÑ@­¿Ç'£•ö"öçMÓ.+N+>Ý4Y;° ФäœP4c,¾3jÓ€7ÃUðJ¡QR}DÇÕŒ“Œý m?f¶ÿ÷Gã¾K¾‡V&Ð,4…Æ ˆš¨•~æ‡ö’u\Ǹæ¬Ûˆ×Jãt¼p½°È~îóÜûM"&oÂAüÄO–â ³5ñ‹ˆ½9ºp º©¾*ã C¤sÇØs]ø‘*¢:*3¼fdŠWÜ8’¾±|½ûžÓ·eB·A¢4Õõs¦¾S—f°ÖXp Ùð®@SÅÞætñçí®"ñsnMóíׯ©? ïgöÕžì/åÉÌÝ~:Ò¡@hLç逯’àÓÆ ‰ÍØ8Öu¢ëzS¶%Í0D•lkkd€8*Š[ÑPCì5ÓØŒ˜P‚*@%¨ËEŸ(4SÞòüägÞ{¶bÃŽgBD$|á'W•á eŽ}‰µô þ:ÌgmMÖ•Ï“|ÝárªäV¯l,^øPÍÜÝ>Øõ¼~<áÔë+#b`ŸºØ£OEhø:*ÿ†]Øó€×#Z«•léÊúãÇÐFµìßDŽf꘤3É©íÌyá «‚ÖD*µjœQ'<ÃNéjN•_R½–~°º;g–”«`«FgĪs˜>^7ÕMfF¡(SryS7®ò3Ú\Îãdx¯s›s`dœÄþž‡™qÿô£ý¿žî{¸-Ž÷d弌ÆÀœÕe0MÏm«ßy§[hþØ®ËõéqkD³‚âžQ Eq©8Ïw³FTž4‰Ë– ¥zr˜/4Ä,a\aAŒF:Rp5&áH,u!-®lúŸr·LŒL0¢²æV¡H[#¶q»½0BZšÁƒ‘¤ÁÐoÍÅfÏ;t#ñŽ!ÛÓ"0ktZ•!ûÝÝÇÚjkäIÜ.4 DÃt ȱ¸¦5>éù¹ûøÖlžYOãÍfgܰ½sü”Õ'ŽQ i"±øeúb ø†&4ûNÞy{eÈ«“õ…  ›t[Éy¥÷rÃõ>Ö?Ojíjõ>Ùr¥Ò"Q“¢ÜG¤ÊnyÈGYuh8ëÜù“ã ³ î1ÎØ+cꡳ>q?_YJÅ¡8>–Ô«–ŧQ½°À¹®:N+r»ˆwNþûþÛ_"CW!ÅÑÏ‘úÙï $XÄ)Û™Ï(fëÔýŠS†&òSšæÇÙ±›ï \”×ÁUÂb"Ñ)&ÕŽ™"¥ƒæå_¿ß×eA,'U©9¸8ÀݱӤ…È3ªÖ•ö}À2œËéAQ#–èPù^Ê™ÔN+•°ÎƒÌMæU›«ÅMåݵ÷"|03Æpü¿Æ“âòŸœäŸØšÆW§: -_GÃEGÖÇÌi³c¶`»clÔÅ%ÏŸs)ûõ¶½{a^µë-ñL~Ÿ*Ne{ýž?ïç1íÔûË„5™ÇÇr÷~þú|ëZ "Àòfø“æ¶< ¤Iìzš÷OàWr­-Í^ÓÝ©”øàÓ ëÜI†o'å„ Ò/‚ºýüuMržÜ[æ¸Ÿ× Ÿ DÀBzûT s­å~Ó?õ ¢Ó ½üø¡»QÏÇóO´ Š™!7IÑR˜ ÇNOiøÿGâJfÕWÍ¢Ó6ªl7r<ìÚi ÉØÑœ™´òr?ïÅ]Gå¶zÙ‚Òé"Ǥ„*2KpN<òÇmߨ3ED ¬¢’'ØPÐn /NfÝÀWÀŽbYäÿ$Ñg 5:gœ"&h–ãã Ðßþž€â8‡1¬è«u{µòöãÄ?¹´*£ƒÚ¢ÝsÒì Ö¶ô‹$¤UO„®kê3´m—jJ*™¤\ËÜ8¢uœâaÐU0ª qvu¯´¥Zñq8ij¹;¦FÎtÖ0i[gt[÷T;Ö_€×XÔ¹Ðc~òú¬K0 mf¡n‘4Ôš¾Ñ`HÞœã'#m}ÿô~¼ã)h©jõ˜ag—é¬ù7¯ý÷?ÆpOGž5©ýÐs‹žï—¹.`rÓ`jö¤‡B.‚T ôÞø<ÉeéTMØ„Sáô-24ùósòÍQ|æ>Ë[ï\¾þ…Žßãz¤žZBÔŠc-ëIŒá3ùYRlá=yÿ¯ó§`¯ÏuÌ=3QT´õ±ò„Ð~_òÿü¶ò†¬ùÎþõî ûYÚP –¾æÓß[_4ûôÏÕúA‘‘žš~³Mæÿú§0õ1ž¿¸yèK¿½½¤‡6A ñ…Þ ‘t®›'?¾ŒŸ½]­²ÇAø!0ßv¥ŸväÄ™!à±Æ¦œì27 0ŒEåëÁ¹]›x°÷ÒÓx‚Ÿ¨,è–Ãeu9¿¾‹a4Ú{Ì‘~<Åçñxü§ýuü‰¯ÖÑÞc„6€Ü>íµ‚.M c!¡2óBÔÝc²mˆI“hPì½}ö˜póÔ†D¹FGÿÆiÁz w?ÊÇã×óm2?¼¨­¡ïå‘ÑWu¾3H¿—$4Æx)·1ÌX¶šD¹TÖ&R2! …WX‡Á¿1>éDŸ s™¢Í{^)6Šnü’Þ?Ɖ­ú]´HðòX¯¢·pºî< ¡õ*Ü"àvÐFLË\5¼­<>Mö¡ÖpÕáÏ-îä?ôõ¯¿~ôN«´ÏÆc®Ô¹à% 7°®!3š=y >æö÷›ãºVʧ€ÖÎ-;•S²#°òäðiµÑ³˜Ì¨xÜÜçš ˜Øô€M†p°Å¢²(…Zݨ¥ =ÚŽaõyÍCteS’´=­ðCÃëÚ’-Õ1wôÂ(«“¢aF«?Ï ÿDÕ_êàçÝ]  Y±¼sâÔùWu­tá$ …¡APhÈÜpîl“½ÕÈÁn¥Òèí^ÁÅ¢>B ^só:¥§üW8*Ö¡ŠÛ•Ed=‰Š…LñÁ÷x ½¥×ÝÞïlhîÏ|ÿn£¥Þ¿ß*ÿª/É*}ÑUFp§{í~IDz >~®ùv¼¤¢#f‹‹ÜR£Ãj= )ÍUX›Ç•»¡I># ä} qÁ ° R|„ 5k_…ó‡Á}›>îE³=²¦|<Üã÷¿™  °î²ÎW¶ÂÝyŽâòCÔR3þUvArz4ŠTÕ’ÙBÏÈøÑ]UyÅˉx?‚ö¿äÿŠ{–ÿ#ôqxP]—’Â*uh¨¹‹ö·Í„ÎŒÌüÈ4ØÈx#\u»ñާÏÕ9cñ˜*luslâê‘VÌ!­¯å).ªŠM:ñ^ziËíO9ûQU¹”+%*…¬0®ˆ}g-'ü$83‚­´H~„¾Ç˜çšèAÖîft yñ‡â{ù&ß{ųYg>ýÑÙÏü6SÝÞ?R2Ûû¸Á#7Á¹ïlÿ§øveá!q9µ–ÑÂcÕjîÀ"¦ÄÒAgP¢!› Ü@3x]0a‰ÀÝþ"{FлGþµèVÌ«½ ž…UÈ6îÛßÞ¿ë‰î¡žÁeßßlp~KUù)C]n>³JT–,«õ¶Æ›ì.ÿªf¾ÄÞÑ߬öçØ—ÖŸÊh \‹\âÛï“ðXð€„ì¸Ä88¢[Èï—ä/jÍL—"C;HCÓ¬¿]»1,8ÅMºÚó€÷嬷³$KÜHB5p±[Qr™TInê,(aμ#]¥gäBç'ëϯü~ˆ gþæý:櫾 VŒ-SÁH0Ê@B¨¡@¥½ÜoÖ£Ö‰6ÝnfÁ(±%&84¤žBshI¶8qÃöœÊÅNÉÓù¨Øaduµ®æzû­×Ÿê/ÿ‡ïжüÒø••Õk†U«¥‡I×QZ䥫B$[…D¢P¢ø »YÐ ¡¬i)kRssé,µÁ!™kÇM°6_cOSJ¢Nœ´¶ŽE|‹YJJ¤Å€ á #(2L±‚ÚÕV?笪¾ÂEk4Ȭºñ¾Ðëøf}‹™yˆœ>®Ã|:tm¢^æ'&jà0¼D+MtûßÝ×Û=ƒÍjð7cûý¯ö/??½éï>Ù39~iCdˆS 5¬ZESgI@!”kP{OCÌj0ת¤nÒ›ƒ©$8ãD§±4¸ IÐ!81Q<5Bù ýÀ©òqñ`jl(¥G)Õö:y4Ípz ée9ôª2ݨ£Bމ$8­b„«wîEïh\Ö N>åÞˆ(£‘·»íË.¬IÛ«?Ë!¨Wéíz¢]p¡!Éf[#B£°\$5vš½ÇÖ<2JW2B¥â¯ª¥<Õlj ×=¢”³•6Ú^)gMe”äêÔ$Õe5æØ…²Ao>ù–«w}í"·ÕR=F-U'T¤¶Zó]9×ãÌɤïȰuÂ,.^•!aÖ ž¿F ®˜ù@…þI¾ÙÎÍÐÅ:ÞñäwH•ܾ½í}6Ê™œL=qùHŸ’ªqŒ ©AQ3B°Ka”!‘Çnƒ)EÁ¾®ì}ôŒðú$Þ¾®HÓŽAA$ Gƒ¦ŒÎ7å]Ý$LQ( HÞǸóûW³G«M……ížD)+‡{=Á#¶ GíÔƒÁèùjFGWPas\«‡CÄ¢kRmÞͰxÚÝ ƒ:Hˆ± â‹ Ç[Ø}/YÔÇ«—9ëÝõ©d{þ#ݘª`û““ 4l<5fÓ’ZˆµYyÛ·Cæ‘–eçI¬²‹¢:±»u¸u~°¢g{Ÿác‡LG/áµ=»ÕM«ô\ä>¦v KB²AF¬ë0Û‡Ù³/œ³Œ À \ÛX•0¾Ç~™T•ÞBºø45Tv»çBþ¡ Éx2ä{»,Ê ÅŠÕè*èIç\)"Ö´&×Õ7Ù_eý†𓼔ù«"D¬&ÊiǪۇ nr¡€²ðIâ;ÅÓa›Ä“ÑɶŽG'/™ÐnT¯±á^òñž 7칿a4kb]ŒP_MŸOÝ‹~¤ñRáÿyNOpJ£¤î©ÂŽ MÁ»ëq¿W³ž;ÏëÜÏ2ô6¶®ÄæÙÑû©~òÎçù›ûã_XeúKïmc‡ÒmjÃh°?$ðu/wEM*[g}Q=;à‘¢rxâx{ú#aê(x²äÛ²ð¹ðÏóäýÝéOÈý¹ 2Þ/úˆY‘?²O‡%J¦—ÁØŸÜù ú§¼ú ?–õc;¾YÓä+‹Dö5X‘Vg¹ñ×+ûËgñ·ÏÂ_>‰Z4“×ÀÙ§†\ϱ{ÁàÔ± t†¸LLØv,[‰,Ž=PN§ÈI!Ï‹ö¿ü|íÁXï ¾3"rDÆÌ&ÐÂfI†lG5Ë›Úìܬ\4™Œ5#¡yl6eeæQJåÜcMÓ €<Íq>rÄ:òÔ²^f­ËÍP¤åu²q¤$‡+½|1ïh‚ØBãõ×…´Â¹?z;sý#g™f^ßt¥»>g>C“•5ïYñ³´QX‹Ž0¨ bœ7³¶î×~-¯Óz.¬ƒíQ!^ÝumÇrG]cYwx^™7ãM®Kœ³å£çõ¶ÑBó@Yõ›Ì»\1aŠjKXªè×½îãQ{¿™emg“¼¨Ûs]¬ã¡Ž)ó(Ãm>L.ìëL§™ka>ß–ç¿vè#ÉRÒ¼QŒò}U%RÇ\ñù±7 0àÊ¨Ž¶HãÚîûaµžÞ‘ÁÃØ:ÔØéjг3¯û1“± ¤ ZrŒ,I£6Ô‡3bÈuËwî\2œ­0v°6Ðc±:zòB²”]rû.µ<ØÞO¼µÈॉë2°¬,@PaLÀHòŒƒõûãÎ'šåwL|æ5ÆÕáLœ%‹J‚LwüUŽæ uÓAkEmîšNPOúáSƒæn=vþ@3Z{У‚õž Ü ï¨½àò‡-ÍÚP¼­;š8a‹€5•ž$OØ£…Tâù;Oaeµ(^I»’|&\©ò·Ç¬íÇhÿ0´7-þ4ºŒÃŸe…ËJ¸™køø«éÏÞß;Ÿ|Åõ›V÷þ‘ @«è9ˆÚ4åv#2¤Ñ?lÅzœ||^»hð"ªràÚ—7GÞ®Ò\ !QÖÚuÞ;Å®O[ ,«ƒ+h¬ƒöPq»¬;éV¨¶sG£ ¬ºemMÎÊ “(Í=bdä­û¼p½‹¢‡5{a=*5UÄZMÔá…ØMù¦“õ&Q$WßÚÓ˜¶w×ÁÏB‹½Ëù²Î²™ÊcNßy½uÖ'¤œiB&”€npÞûh5ôfrLç‘bàAÄÑ¡ÌI5 „»RØÂÈìGµo·'ç6õÑ;¶Îwï9̆y èL.ƒnñD€<švÆãR9®5§ŸJï¨tV1–ÈPÁÛËæ…XÛR4ÌŸÛú˜V(õœ)ë¹, è‘ÒÊ’e/wÍã?œq†¸a1q;ñ\þ“ÑN.{öD åÅöSIPÖ91˜åM`ªhYæ¹ü¬ùÞ•ã îIÝ3)þüÒaÊ‹×Pj&ÍØ i¨Õ‘wA¬cnýùÂÜJQ&³z¦Gª¢ŠT )‘0xÛÐÎg[+®¹6ƒAzˆ¼â'«€nVÛÑ""]dʾǣ"4ÕBݨŒ40L•ˆmäç¨W•õRà×ÙÒ @KCÚÒt¹¡Æƒ“$F®€ØÈÂP D¥Æä‘øM©™IïX HÂ=PM ›«h÷tžpà0ƒÄ„ Ñhh.Î-æöðCGÚš­ÙŠÁHÊųºn¨Ê•Eo˜ÿœ3ßáÏN=xúÅŸx¼¾k|®ÖwaŽqÒ?®'P=ºŸ#?-ñŸo§Ço|Ò=¿ qïÎáVÛÝì—ê:Wx|Cöñòçg{žN£ú¤÷ëÏ6»Í”W×Ćÿ.Ñ[1sꢵ„¾Aœ‰µßÅ|È‰Õæ 0C»°­‚åºMŠ!@~Ÿ:…öÀ×:óò‘¿ÿ†xŽ ˆú]:™]°ʸEzfj+˜dî~ÙñŸœ«zY ÝÚø]Ìg¦©5:\ЮÔGÿªúáF¹'Æl±÷‰4O“¶//„>̵rÿx­²â;ÞëdU`¹1ˆôEÅFy  WûÐi¾‡{9œg%v!~ —IÜPøÎZêp5+¶Ø,lœÝ0*|¶†^NÀÍ{pº­AŒš÷©¸Æõ–ˆT®ÿX€©³A´»o?ÿ™‡ÎÌÀø´?\ßK@ˆ  ڈ¬ã®êZwmVy"É€­ö~V€ˆ¸ÍƒÝ&©^]•… oSå 4§Uc®OëQÞqÖ‘žP¡¡ é‚ôX–¨bóc‰áv  ZzÔb±R‹ŒÍi–g<Ř;­±/÷dÏ$\‘‚Ðààz=ÏQ9÷¶–;Ôß4%sÐÃUÔ©Ú‰aŠßãa,Ííά]k×Ñ袯™¬—иYÛÂ9c€ 1 âXãpÒAp¤–ÊúOyYÙSQ'Fp27_Šö¯Uí÷¦¬Ýœt‚‰$üAŒÂ:fð«£°XÌ5_\Cù˜šP¬EwŸ?q·‚sAVÔÁÄ$ cé0Ô8ãžêÍT9ðÃi‰q<˜¼’®±ÜeÊ[–~iî¢ÿ¢EDë!,]2uͯŒ’GJ6ؤÝÅõpáÒ\F04 +«Ÿ¾àä¨ åWð†#|‚"Œhà-Œ A‡#áÊ&§ÿèõžÿ}c´8~ÑüPž·ïÛísÿÃ?þ߈ùÚ÷§þýéoÿðD&0„ ó·Ù©Œ5Ìt_SýG)”Úè+¸"/€‘³bÑ'ÉžÂlQàdÄv@fo½+?Œoh°>,R—x þELý)ÿZ“>䄘—ü®KFbüQî?.#JéžmqB(¶Ùd¸€0%¦qk@ Vê‘§¶êh.üWÇþÛØ¿­9r¬G~šç ~æ¼W@rn0ŸúýÛ½™î—XÙùSô쵦׳uG泌ö/ãTJsð ¶6íXSDöcs«ïê³_øT’P• hÍêÈ30 ­ …´.Ïú˜\+“ÑRP.ª–Dyæë§üéœÜè [Ý ÌQU]R €îèm Až $L“ø(#ü Ïq‡“06Õ_Ç%þËŒÕë¨Û…þÔÈbÔR6…fPìu S2BYzÓïq8D™û‡ýZ™uÛÿ<ßæ›é?ZÈ Ï®é>ý± ô tšE)m²”jΠþ­˜)×'óÀˆî„Ò&WʇÄX™À£&ú|¾<¿P¾Å|[:2 X…Hºš~º¾N8ãòQòò4û˜.îꅽߌ¦¼ ÝîéкY2p5ë&»¦zxãмôZÙÞ|óóÿ /k#†¾z*­ ½M ,Ì@ Å E‘Öç‚TzâZW² +ú_M‘®Tðÿ‚ú‹È_Àꇮ+U¬Êªd¢Ëð1î&!È¡ÿš´1 ©¨an–”MàL9Ž@á¼óÜ4r¦Z)çxD+Ä)^¯T8ÿ{@µéªé>ŠÓ­­¡žü˜¬êÆ"s ű½pݘ™>²s©Ÿ²×öé‰ÏcD»,ÎûÊ3åôÜ §±ÄuÀ}1¯I€ÚnEFt0æ«ÛF¨%XæEÝÛRÑ—d+pOO¤h(’AG«ÒçñU"áŽtQþˆk®}‰Sv|ûã¤xdãÏþÉotUšŽÓN:0Ee 8!—©GHç;²(üÛìàV–»û2=ÓVw-'°˜/`Äz‡ü(Y˜cë;2h€m”“ÏspK—«ªCªÜ¿²jìšGkZ“ÈhßÔýçó÷nÍ—ö¼×ºî5aD .áC5‚¦Â^4©&d$Î*ôE7Ž…iáë;L]ï_yŽ b‹µºõ¡(†¢:­Ý‰áU4 'Þ²Y©?põ€AõÒüøÁýóvD‹„3h‚ «S ÄW~kèÆײíUÊÁWÞ\'ºä²íØRÄ7èÁ¶_ä)É@m!–d„V”É ;` LQ7nwÝ$ žWuþ¶ÿ0sõ;’š­Ñ…ùûs½È·˜‡ʨ¬ñç(ÍÑ5!tƒø[Î@\júW»sÒ;ñµ¼ÊJZOúeË`[ˆªÍöL0(éuMGËSéŠÌõŠ7o‚øTYP@MeçüT²ûxù³˜š“sJƒàI,W»5VSÀY»z…˱<"út³„¹„@E·uà±úé‚ÀˆE $¬?éôâ/1$ÀåF7…IAÚðï§·,ùY}Úêqš«©5%ݘ¢øLûåñ®ÇÇ>Û%³–ŽH¼AÔ['ÆÚBÅUü}’RØYTØ#-c €@ÀéfC¶X³`Æ~Q~ >®Š $ëh¢éŸøÝøå>Lÿ)ù=—‹@!¸ð€þªG_5üó‡ðç™{ÉåO_?t¾ðâZÚ·fãÓ;sôQm'Þë›_F÷'Eý<õ±‚#Üy{e[Pk2oRŸéÚÜW»8­‹y9كøm}üÝ Œ»zY±T¶vF;‰ä¥e·èh×Ëø«‹¬”;’Ò$ÆaÈ)Àm© €  è¦¶Q,Œè`nTCÏÚö]ÈZÕtÏÊ_"ÚÙPĤ¾Úm màPN(§Î­õYßÝBͧN?µ°z#$›-R,­Tz“•}Çð…¯›scÔœ#!ž}ª†ÄÔvÛŒ®£"s ~‘LKd…ÃNUÿ‹ÀÓqÿ7ÿ‡·¿4 oG[yàQ¹QÉ{ßøp­0tª‡mBœYæ‚ø^­÷¨±™`(íå¸9V‡æ9KôuÒcص~T9Eú†ˆð»°4ˆ1ÓþêyßtØâ¥ÃÚêÞ¤¼w}Õ.ª%¶$›Éz.Ãué¦6Ùx‹{ô\ùñÓñ]Þ€Õ¨ŸEµ£U2pZ ¬—ÅnD & yÖ¹AA›æD8a4 yXo¬}Êv·?Çh‰Ý.Ô:êæ¾sF¡lø`cA3‘ljßÇ%æÕ½ÒîÉèx8ý\ø’;ìŠDÛ y!LbtìCF‹½¯ã±ý{µf]hù=¶Š>Í‹XÛd00Ìî›ý#â.ÐІ'×*´\FJ#G¢…n± ‘s©x¡³¯þ3H#IZ«£Þ0Ô×7Èç6¯„)€q*F8'ÆÄ¼tPCÄòÀ± ;)5~Sþ~x†¿=ØMôlÊÑÿBì ß—&wÝÌ0s.žù+cÀK—È+<ª}X2‰.¨öEå¢XÄL ¥Nƒm¸À§Ñ@ A„McÂ5 x ‰ZóAOé6B‘üøYwÆÌªaãÈù\cÊN¯ñï¬dÿøîU«3[{fôGÓŸÔ•Ï™Éyeçáì5§ü®d)>ÒH\ìpÆîs6zrô i(³Ê’Qf8rVmoÒ8þ¬!™gÿØÌºQ±q"ˆ¹" ·'È@Û€§ŸÓ?4MÛØº9-ö CY£¦•â&1äX)’‰A!d‰R*Ô~„3¨ÑçÛcBõ”ÊF‡ïMsXt CKù4p|Z9ŸÉ×G‹–¼¨©´WÂ'}ΰ‰=U{߀ûÇqÓ›¶uãáX!~t  Ìù pf Њu¦_ŽYIŠÂ9$(XɯÖì‘|\Þ¹æÏÍ›W–“éB$¥j©$ µ-Ö˜3ADœÝlÖFð¼ØG¢Ñd€q[Œ}Ú ñ/Nj­ncNmjÎC/þ’·w·È'jGûz´þs¡ü…c ¶©’ŽAaÒáÍŒY¸×7´×àdsF3½oxÝ(´ï³J ôî?÷XgŒÃº$½³¸ñT2æ]¦î’{x§r ›4i‚  J°SZ4F‰°ËÊŸ»îøü­þxÞEYJVhŠÄÖ°È ©Ž¥Û%n·ÞªfR6‹¦û¦A¥Àn„¥Ð±ÒzÆIá…V³:.­Ne¦6àÐ"V©”–¤¾5ÓêÛç…PíŲB +Ó6k„%T„KË‘p»R?YZ(SfžpAjÚ¤M² æC$Öžˆ< ™¼ú7×GÄ¡J©;_ABñ#ÏXy'ÐÞÐP¦&ZÆ̧ªØµ+§(õZ™JÙréØ]+näf,i1°é2¿Æ>´,Ïz[Õð¤ÃÄÅé&lÆgö<õî`µBë©€X<Ë”'Å„rwwu¦3dL$F&=¢¨vâ’{þF#<»¶†S”u{ IX¡úêîvs€°`±òMDLÁ»íŒ鈭Þº›ôd\¥…‚&½dè4ÒoW̬QÈ܈–Ö.. £ÁØ`”¾Ø†b¨*Mƒ—B¨ÂpuÄslUL‡Ï15[¸cF÷ä£ÕBU‡î^…ÅYaE‹ [[ípëÅÑ%µã¹O}D6Q¨0B€ª’„ŒÎ¶í0Æ•/z¨Gñkpïü‹-ƒÄ3%Q#Ÿ€ ¥¤rP@'¤ÕÞ%uÈ:Õ!8ÞJŸ}Ñ-.ç‰ë³JÁñv hdÛ^òÎïÀU+WAU8É‘<ÉØ04[U\8U! Ì8’LL0ñ+ri/çͯçúêÉžCœêyd“–©Á€°Šˆÿ3ö«v(P›ÚUJ…º‰ÁÖ3- _ܲ-^ ~ô/ïãÏŸËJ™JZ”å`œ'3r £Ÿòöî´o‡ä8¸fß‘›ýqfÛós ëÛù“-§€nŠÇVÁŽšÑÆ çñûê×ï—÷=üâ‹3‹¢˜R ÛuØ9ÛNÓ EG2²šÍéò´–Ù®¯"›ô°•AUV$FM¹^!ìMz1n1z'3 ä_òÄÆÍ|ÏL¤Cþçáé¡V $èâÃ÷¹½–®¸ö¯ <¼õ4h•ßñÔ]hÙŸ0±ï Xî´HB@ÜCÁý8®¸¨È-ZYNvu$/ÒHPÉ2Ämï-ÎÝüvo.n«¹Ë´åÎ[¼öîønÐr‚\C 0¡Q‚²ÊÚ‰Ž6º‰ÉK#pPDý›ŒÞþWïü[%9¡giJDhd)¯J¡L_AÅwê£0ûQ2hQH‘¸ßä­Ê-Ô`Ý÷ˆ^44Ë}ÎfÜŒ­WÚ¿×^ý“—ü×ÈÐ-Ã3  &á,[.û9 ¢£m]çŠÔ™¹RI,lÊ ¡$­ßpéɯ}=–¿&ï7þºJ™¸Ž3?væÎæ^A¥:L"‰¥ˆ'u•èrùíK½Ç?þÿ¾s î8‡é­“g,K&ÇÌ y¤'hËqšWJA×½5á8£–ÐÞëËîyœç¤‹@MÏÔǦÒjÀ3­nnQ»> ÄçPÚe.1Ñ1¸‚|”éE—ý7äd U8Á¤ ƒ÷™ˆÖ­wÒéÄ2ãÁšGüÆ‚Ob¹ (,Ó‚Ò¼«jò§“úr†>ä1¤„H×î!ì3?ÛN®›;Ó-VpÌi7ßTÀ×MƒÕ4#;S­T¼Èu½PÓOK¾oNq\`÷¹’ÞÁIãGð¼µàuPO:,̘´_~Á†£Úp0h†’^븿;0x“¾¨l6¸ ñVæ­uZŒ Äc¿ýð›a2Ø[èô’33–g]ˆP£¨n2°8D$ä9(8áˆÒS~»¨f®Ì{°f_Ѹ6Rçû¬Þ?íì7fk8À‡côEŸ@!b!ñ!<¬½u´ìb¶ÿvO©Ç®º­c”z8ÀÕùM~ˆL‚Ä€*Ú=É<¶Žå¶ì²¸¹³4—Ý—±aâr#L÷‘$R"pòlŽ|#œ Ð6Ôð(»´ËªlèN‰€Àm©h¸»Ð6U›[‚PТö©!µ£-Ù.×¶Ä_/5×É'.\hî‚Íf<ŸvUc·Ôð%é„oçªRÆcÙ^„ýðR¹‚é[Û9Æ S \f«&g€BÑbG€€/ ™, ÓF戦I£A2X¡©h[L‹„ÊÖ÷ƒ/üãGù+L­‰B/C4µE Av[þC½ðù⯧‚4±¯ç-ý}Ó?|žÙf¨ÝÒ¾ú•—]À¹óòæUTÿ£–ÿŸÚKªÞ{jŸ¶ëô ¿·¡o$Í¿€-šçí¬Ôã…íýÜfeµV ÷¢4iÑxÈŒÃ&7¯ˆoSë‚a`X£€¤nŠ™áPF¹X|дº[mÊï5W4Øûð4Ø’k°„—'.[Ù­E)©ÊCq´È®ÝŠãljW½­U®q¬ßæïØÂ\+žx1(n–q¬“ã´lÚK£ò-E.•¨ãÇþN!¯—²KiÙî.Ížwðyü™ã8Ü®ó¹kË=ñà9¯›,pfèò2(DÊÆû¡÷3žß|°V¢™rWW[/h{P*pjcIÝRÒ )L ]Lgàšžˆhº"6ïXÏ~qÉýÔ³ðâÃ>m`óÖÁm%º#%‡…âû%Ï•‹~Šc3ØSJ&æq Ô%ƒ )Ny¢¸ 7‘fîüìîji#Þ>ÖØÝv·›äÝ‘]€Þ  èc›R$ È=ã²$—Íýç¯~6˜b–cìƒ]^¤Ã®Q#áx4D@ÙõÚ¡£Õ{Ç_"9–Å®£,½O’Za°»Ø˜ ŽmÝwô½‚uÒbÇ¢oc£2ý*ê•^-ƒoµ€ã€üšûcrÝvyÑß5ºtˆ.«—nü–ò³ïp±{Mú²²…ª«O#¡Ž•><2H(ÿ°‰KòdÓªˆü(|32S›Â|ËOÀ!K¿NUÕÂWJ´!ÀnbÍÌUr'ýÓXX쪙U»˜Ü߀à ðDÇ¢|H·úê&E%~Â"à¦"¤¡‰(i úˆ2X­_ÁAFæ²q‡'ãO>xúùŒVxÂ|ŠÕnrô+;?¬¦NŠß;‡7thœ$ ƒ1§¨®ªÔ4îTn ¦fõÌÛ«MRwb¦hÅêpø^çÅät•POrÝ™œÍ®?Ç.©"zä™N Í¸ŽÖöÕ×Í‹´í^Íd¥ ŸýX¢×Nì€9¤dv`F™—¸—ûB^jçô6#=ån.B5_)#¤J" t.nË“f²^ÉÊv¡¬“°¹³´tÑE³¤|*EH€Íu Ïy<#p¯‰ÏxâÛÍ*ÉÅè*çW|ÿ¨uݬ?sˤ¦ú¹°o51`ýeÇ]²6ÄîçîÕ$¡(:pÁþñQyOk6\IªCÓCT¨Icr¤Ð' 0=V~q:ÎUTI]••qM[=&ågËT;þîñû?ùæí—á;Í|à{³¹$#ß÷Ï+Z+ž{êhZ;‰L[¹uú°jbV¢"±èÍ|Ž”šÕ”Ùóµf®•Kç¯áéì—vÝÇõõk–…Ç(¼û…r:õ¹Ýoq6°g(ï.~Ibæj^ØÝ–ƒg½Z0ý`ŠÖø²Ù8ÑZ ÀUp'`hÀÊÔƒˆï(=õ4ÏÙɯ˜E¶µQ9¦¢ÖxDÆ·¤KÒ6À€À(émö G•º4°@q纛±CIùnYè‰âÒmX[ÅE] ¥¢y"Í0òbÀoµ”ŠÖ£‘¬‡E4æ(*·q[5ÿ†94Ùס‘šªž1j^ÙÆ[þÔ|ÙC§ÑÂsÄ®#kìeÆ´$;»Gu/l¢ö„Åsô»îüoïèÉ`O«`ðÈËØV{‘ ˜œCºP_¬Þ"‚Dl­«_ ¨¹De8°&š…_®°ŽŒÛÝ0’ø±‰ŽÂL·gµÌŒëû÷­—»‡+_³Q« ¡H„ »rc$D ƒ'ŽpNH¾Ò¨[jdURó¸ŠÝ=I@“šcd€„ pâhslé b0æø~r”9:æ=_$·~æAy|}‰–õP?~gcªêû›¤ÌßüåÚs>Zlcø›•>åÛ{¿øœæü¨¨e¯Ûñv2ùh1$ 1ž„Bd!ÀÑôýC9ªª|"´ÈuÒ”Q˜ÁL¹’-H  A¨eÕÒ‹ß0Ð^½ 2aaL¦´Wqw{­Y'D°ª* „".”Úöá¼6™-QÜPÇ»,/è}†° éÆ(‘t+ŽU)²–"­Àj¢h49[äT)ªàÈ|ßaݦìÀ¹/Ý^/<©üLL7PSøÔ_b=rE+]ߌWî¡ÊSrF" ‚ª•¿:®´EÂØ–`«å7æÎ«¿ÿ‡\µâÉò6¶ÌÁ@´ñAš°N'_·#55æÌR‡;¨”‚â"áMÕ6lÎÄÛ÷. ¨zOEvî8[ ¥‰¡Ô6CT®c„ã‚Ø ‹Ñjeãä¨ÐUÜï–²Ÿ ó6Üq·2Â@-²Ð÷¡¦ÉxC)ôt!h”Íõ¨3 çwßs¸„0ž{õc9ÀÑÉAG£ÂÕ¸2ŒÔÌÌä­òºùµ:˜p6$‹L°ÏÔ*vRøyk<âÒ#ÏÞÀDYù ]ë¡|&η(B† £Ž`Eñ‚‰Q\²<’pc·õ¾¨-ªÙZ¾¯}Û—·Öà+Ö®g®o«UæJ¸MHarâñWfTáÕÏ–_F÷}ìZýFÍÍgýÒR…´vôé:\_ÑŽàùsB–sY$czåGYIÿöšÏ8ãWìÅÇ_¾1ö|ÍÎË/æôY¨ï¦æÅë½7¦5öØ£ß2è_-s¼MÕÜŸ˜ÒÝÓJ´E3Ô4À²>ðJͬÃ{¯ŠöS“ŠÌãð7¿q_-¨wë&}I>]Õ"£Z°”á¢Ù*T2`€†¬›Ž‚{5I Š(9^¡"¿Þà|‡j—ëÖì‘ÂÕ!Ïgt< ” ±]XËßÝyùêÔŸ‚¤c‰ô™¶øHîЦ Ü~šÞ6R™"€Á‚é{Í¥²¸PEP›ÙÆ‚–+n“úd~lnêÞó†Ô.ày–ZóO¶•áºR®º_G«®> ¨^«°:·˜ª[Yd°‹W( m·=$˜Kþ„R@BD¨Êr ¾ WZ¹HhÄê4´Ô¬À61 6ã ½OŽ:š(åf6˹-¼ßR†œ–öT¾ô»,òFÙàZ%(i–¬ÊT š!$ CP¢‰CˆÅ,ËÕ©n”hB¯Y]ÀÂF‚¨pÏ0À¶”^N’ÿ³k‡7êð óþõBÍè¨Ès·þêÏ–´pðœ¦mšÿÉ-±Ï6¯òúÞåëmg4N/ã8ÃxôŽË;Ð×j­+÷‹ýÅ vî~=|YK+ß<üâ‰Rwjáê’ãÛæþzt½¢VWóqèËì§ 8¨ø mz‹Í9¦£‹‘:Á9\wQË Ð®¸ûD³ÐƒDbe‘X×6ÒuXm€uº]j+ ÄžGƼµ/º B´ Ëm”„ÿãçi®“ÔÑä?ì˜C^¨ «EÂ1Oëé›è!fˆÍ]WÛác9MzçâÌå?Ë‚µ‹õømõ_“"×Ì+¥Þá½µê /?\ÕÞyß7§)¦Qd‹f޶¸Ë:¡KMÙ3.Ô8uû¬¦G3 æOGë'ÔËÛOÍøÄÅãÏÍ–Ã^ÑöRÎÏÕÒlýƒFüד¶ñt¨qêÕÒ(ˆŠ8f*b¸'ï§Ô>¾èX ÄD0j”÷îÏÖµ.× ÄÀK JÙNMI3Í•‰‚ˆÜX¼ïÞ³'ŸOê¤Êsæßó[m?îÕïñÞ¤˜³¶‘)ÔKpa¬P[!jcQ7¬(J½m€Òž¿ü£ÍÙæÞ{.û48·Ñ|0‹p¥ÿ9Ä€âÔ¡ ʈf"EîH£Òu’c4ß%‹Ä,¬_à K1Ä4LmVb±¨Y(©g½^+êÑ}Žú`À1’*íÔ{áÄT¿PâŠß°ù‡~ôâ/øLÆBâñ„U, 60õOÕçl™mÅ4¨%œ¨ì•VŠ®‘«÷”kÚ5X>­óßßü5ƒ)'J?½úbýðÉêkžtʧ³÷È*I²S>®ú°æ8Õª*Zq^Ý)´€5w­º­B܆HìF¨Žº7`eÚ>£ €8ëç‚i˜0ƒE¶ˆ$a¹·nýÄÓ¨õbPAT;“~Òû­µ ¨*† ø ó³—òNbÇâ’ܒ‘ïÒÔ$`t.¨,ú´Kœš +­Py$•Wƒ¢2vU³%mÖáìe£°NNÔ¸Aù#X©úÄŧøp²cÕ«lcõø(E” ’H7Ýi»ü }0}7÷bâˆJÄÒÝÚ{Ô•þn4\à #ÚþöÞþ=b®I½2^Í¡€Ó@O…[â62TäN¬/Â0Á"åB Q)‹kâürïÜz1È0j-¸Æ^1ZêŒîÿ«ïÏû2î*¯å eÐt€Öu×YpW÷QQäB¬EhbcWˆÙÝÇD^uvšGØB+$Ã6àƒ³˜A&Cµ•&vŠF%+z­E^„OðѼA>ûòÛÌv½QÓÎÉš‰•«ºñÿZ8Ù ”ý[ÎÞp7Ûcôcz”mÚ6v×hSn‘n‚㤉ܦÅŽuSöÚ µ2añØÓ ¥Ì3¸cS~íWnœn³®aøÌ±‹ÂÖ U®Õšç7ù~»[iErfð¨‚U–/q§˜ÎD$EDÐJÇz¶ÔK8ײZ‹¢*ŒýÜ|s2nbn;*s-¥ŽÓ2ØîšVt.VxEÖTPVBAvrGø`äKë(#½Ë>©Mçúgøß{þºyó½¿|<âµÝTA0háABÍü¡™ÓŒ«€îš(Õ {ÿÂýèèƒ\ è5‹µ…1åbWÆ+Gsnrìô«/:nì dpOýnõõ½öï]J5Ϻ˜s¼ŸÎ®V…ë³U ­CiÝ©¢C#óÁFðÖžB1Z‹ãÎíi$CÙñÍÞÁÕÔ>íÆöð=ÉçëA~ncØü`ö+ß¼›çVÁ3RkúÑÔQ…6:º© rV mqLt Ò^îðQx¢ND¦9² å ƒ}Üh " I d¨T ê³è#NÎÏòTᦑ¯€äÄ ±©Œ¢¥P¦ƒ= ¶ÃRà€w€±„âPåæÅE,!Áè¡×JÕܲ!ÕÆ»½W’Úó¾®Dfÿ~êå+ætÕLôyjúóì¥ú"«mÿ<}-ß5®ÌU*loÌLRñ~4¤d½ÌýÙaže”fî˜ÛÑ÷ké]»ÄÌîY9üòàÁîäèðjc5ßá¶|ÑŽcÈ ¶Fo/·ÿ®¦mj”¶iâ)ÊÕ>êØ¨³¬%ÎeËZ¿{}îã4ìXW¬M˜f|HZgµš›oC³IV žÕÎãÚÌåå%GyrÚ³…Äh«¢«ÒÆbèXœ‰bÙ±‘¢„4P³ÿIek†k+©cP&ÅÊñÉðÉ÷Sjs-©#€··˜)ȸ?’¼$±‹¶A‚¤QŒ‡ƒz`è(ˆ±p|Ü‘E"Ú Ë08î`\5C³[}“ûfZHOa¹²=‹ë¸5¡#‘âÈVF'ÊÞî*Ï øŽXfN'Ú½“Z¸G}ÙóˆIÌ` ]Í·*_§Ï~Ìû‘ÏõæiÖ–{@gæjšX=ëe{·ôO¦½ïBPÑ|d}øó A9B”6^ç{Êžºž{'›Ýü¬k«ñzN£hÚ¡€˜ÃbÐfÖõxªeŠ;:Oqõ·sScß_RZMä3î!NŸm 2µ2Gº~úiýœ=ÿÅwö«í9nI“yMx’ûä½<åà:‡1­2 @©ÞÛZÌkœ¦Íñ¶æ‘5¦ ( ‘ž\›J¦R`Žz†•H3ÈJ+j*Ït½ÄáªûˆvojÓÁ˜ Vnú•Gˆ¸ÈÂÉj?UœjKBiÚwʼnXÃɸkŽB«üX—…È%^Ìûžß»cSûÊò 9¡Wþ²Ý(Á9ND½´: ®‰†í`Y&’'µÐA4…-ƒD±´”İÊ4;C×M‘F4 ‡ùg´ëQ ÆŽ[i¦÷2ßÌi+ãŒ\ûqp]´+ˆ KÌ}­5m°`F6=ד¯Úʾ!5-"¾c¥ÊCÚXbµçˆÌfeÅìgxKTðzU}ëÐá4X‘€BÁÆÄÍ"éïh0x T% &ê€ š1pÚÕ%þe–¿5¬¦Ð{I¼Àø3ÀóÖü>?õ]_ú®>øá|ðÃÉÄ~C¢¢?©ô£ÁÕ¾}¿õå-ªC¡–ßL7ÑïùaÚT•±-ãÏŽÉïtŽý³c[½•í?tú<Å÷D\~©›×På×ÎøW¯õ/>¿à¤ÙFÃáåÉAoôQJ¥S`pç͉Û" ZÑ ‚èû‚—_o­ÒÍßÌq»‰uCçOµå@ÃAWÈ¥ÉUi{·lº†31&-R¬upˆÊ­™édœ|¸Ò©YŠ!ïÍžÍÒV,õó9ÌŸ0ÙlÏÁȆ"ê@PFA©€æÔD(hzI¦Ì‰™ðtÄ­„ÖæËhçÚ¿3ó­ÞöH xø‚Z¦·Ãsym Ö¨†¿«ò~Ž;a¨¾EŒt¨J Èà‚#ó…PVÜÕŸ“]¨H„…Ø!¢É&³ÿ¿8°þ1¾á°]ã ü¡#%$|e<ø4PïBE$ꋲ‡Õ×››¶F»Oý,-”Xí;è寧#¶ÊÁ™7å§ïG£›½¯Š,?‹-©ÿh}óô8èm¼B!ÇÕ Í6%4‹rÑ€‰ aë寪D]÷UVúg”ÉŠ«` P¦ DØ‘*—ƒ€Ž Êdù²7pTÜ•ì­Xå'ìBá¸Ç>AH”È$…º4ñmô?h­nÓe±,»Î#¹î‚Þ€3P}Ÿ>‘花MM Z³2~ðÐ] _‘ŒÄÞª8±Êj,ÍÏJ©$¦øB‘™UŠ7!Úé)Su}÷7ø±Æx‡’2¤HÂ(ÜXœš·cg«Ú¡(} _#?üׄŸ [PëÿnS8o ›MÆšá.”áà!„€ð@[P¶ôÔ=ÒoèGÛ#~Е=VF#Õü®ÚJts•3¬E‡‰û Ë~ùÊâeûÑj¬þÐd‡mYdM¿N}¬sú,Jt(²ÕgÚÊg|h¡Þ²N#È\¼áã…+SÞ…ËGœWsZS=Éd“œ9ª)ßÜ©ÔsI/ÿwì<¢ßq¬g ¡èLG~®žY¶Ï‹õÅrgÖ®M…_Jð^ßýƒR„pêPq2ާ¡x‰`Ž‘ÇTS¨G69gDŒitüf¢Ÿ„ßdjž»’ÈÈ¥ñ!²üàãê±GØÿ°§ð+SCçoT}:\ßã+['<“þ¿^ÿüÑÌí:Í)LugèÌ -à8Õsû‡ÙŽô¿Zr~Æ‹ˆ@n(>©½8Òq¸4\°¤f†¥þë_ùüø¾äµ"éÆœŽ„÷Šd¨=¯|i6VãʳU†@¤œq kIDè¨ü´+½qÂÛ¨›-U@#i9bïl¯Ÿ1UôXÁõÕ5æ‰÷•ãÛkê_ú é?ý]ô8¼ Ä'83ÔnWâ°t‚ƒ&ŽÖúg}ÿu7ïµ'9‚`üg÷¹æßö1ög„C…èĈ–°oJS" #9@6cýùõ2P–ž§uZëýÛü¼Çš¼S” f.‹Ê–‡Ù>±k"D\)x~kÏ—úãÈéM0ž*M R‘ ‰ †„`€5 Ô@ ®²E¹ÐõŨÁÄ€’€ñMût*ÔÛøÔYNãØ ½[ ¢ªb€Xc‘‚6‰ä°@'{`ãf¹´æ%λÿû{ó/~âû ö?¯?ÜË€¸Ð O2æ]Üâ@Þèb#M™:E‹h‹Dí×ÅÞ½4„q)Õ}æqÁ’aöÈ%¸›Q{FVßV]íí*Ó‚Zš9õ[‚aäžÌžÔ­§r¾­ôQnj\ÙµWcå0ç=oz²¹„ÖkÈè)uÍùôGd‹-ë·¯wÑ<³ÉmߢÆmÿýßïÿ6nüý¸Öꄊ&H µÁDCÈš‹]z¶²#ï&¶Š- Dj1§p0W¨‘ãñˆ dM¶n¶6Òï±^º¥0yЩ¡T±åQXG±ÖDà:)"»1ÖcA[1MÀ˜ "ç·€ƒ8áÁÅA® üKŒý%»M,ëJ»ŸØ%ÌùÕ{\80óÆQ'BG6íʇf¹åfÜÛQo£=OµY¹ñÕ_÷’»c5²*딳÷=(›äʫࢠÎíñŽãµÛªfD ŽÊåNcDÓúV(° ÃëF‘£2nÍ-ÕwiFW‰¤Zqψ‚îΊ+«gv&-/…ÏôÅS€ÆjLcÀ i†d”p‰¹,VR “È!—3cJ¥p&Šû@ZsOrB·ln°ÊP#U°Ao¶B©HGÞ˜kãø£z“´ÅõAæÆ‘É›îìág¦]ª0á9­Ã.ÛÝë)ºixúi~>7-|[µ§o‡Aů—°”ûvcôfúéö´z¼®Öõ¢"§Ãõ“=ËŸï§®ñàÒãéK~?õ;•¾Õ«´Ï=îW[¯žˆÞ¸ùš<÷í€Ê¼FËï¸hxìéj0Á Žš;’fȨ ÜÓƒºP±eàNô»²ˆf¿þ[“b/¶>’ö‘?|‘µ 4Í n•Zˆ†¶vêL+á £aa°$ˆö‚Ž2ª éìÇ|ûýàÚœN='-E…õéÐtöÞµSYxÏÖY  å`²[ä#yÓ<µÔ¬Õ @¼©1 G…–èMíë·m÷ªØ"„öl[óZbQ÷¥H+Æ Ox³'2G ªÅJ@Ú,v¸ù–Ì;+-ÏÉ%Ø™šÄ› žN[ÛhŠ)‘µ«Ô’=KàtvœS@ò|åu?Z£SMDc1¡~%VÆ+f±G¤ŠÒ3*ƒŒBEšÿÒ·(ýa>Ìž9˜ÈéDÚ¾ÛÂ3ºl °— ›-;¦)&MÊ㸭Õ0@!T)pNÛ¦V7h ˜¢ M€áÊ»ÉÞp 6˜ì%Ö߬r ‹0`)+„•Š ÊEˆÛjo½ÕsZ‰a§@vœŸ¸…-|¦‰æÜÃ]ð¦b1Í|z6Æd§JÇlˆŽÇérZ{TŒé ¨x¹¬á5õ¶+e²¸4n:áA8mÉy!†ÀÆa  á1Ôƒ ÐPàf¥nãÂÂGuÌgK¡/ý¯O¼n~Ô#íð8x·ÿ÷GºqÿD$-üì#Nýäuâóó¾KþÞþVúã/ïþÍìbDËçOæ NC)„\[ŸòeÝǼݸM.#þÈòÁaì²CRµ¯âÂǽý?è]®ý»H§>[®È*…ŠpD4DXÂT…uªÚySÎýéS‘ŸÖ½šcçúO®Q¹ØOÃZœÍi™Vƒç0À$²õ.¼çÊ·_9µ¬ ‹#D0Õ%º$׳ßG\&ƒ9Ötoë­ý8•Ï¿ã'^#˜„ÄÈ@:>¶UX˜†12ÇDI oǺ²•ÏÒ­^pÜ´M4îÉ4 mO& qØ\ ­¨_®³›hN÷ü*UÜ×ý¯~ø?§h–ÒÕªõÓ†PéÐ1Î?q<Ö˜ .ržlX¶†úýžJ‘i?”Á¹] ­|¼ÖQ?«Èr(]¢ÞŠ+G˜Ó2c<Â5:ÖùÁ=_ðšW}{h¶XÃ,©°»ýùF°`ÊÐÝŒb–c‰lâ‰Èe¼Ü0dkÿÁž/PH9Ž¡·)^®Ö Õ/”sBYl7h°Ú '»A6dJ7c]—g ‰A¸ àýþœÂÃ(„Sd …à\´€)ØÕ\¶èÖ)æ%Qn‰Š[j ‘±Ù1Ò¨»„Z@9Ì…]]%Z‡îí”™ Ez¬,dÛúËy‚ r‰Õí>¢®ÛÒiæ¸ü*º <¢8˜Qk×­Á©â&+³˜}ââÐû à"ôˆDÕ# Ÿã&¾#Ú8d¿¯Z?÷Ìÿð§‰D˜—ò’µæ. â¸gÝ[,+@ëo v'[û8È€é‘x¿ðÇb òÌŽ’}@œJ’(Ѳ¦h .Z…j¤€ 0@ 0ä7|aÜM´ð­Ð (É Ò—5½U먞lסÜì‘_®<ó§ÈbáJ´7â–Lµ•uMmvÔÎuÇmIõÈñ2·—ÿ&: =A±µìÀT¤¼U§²‡ú¡Û,IláX¯šÑ‡êLÔŒ‰t_yýùâŒw€Ñ«þyµ¤BfŠg2]Z‚"-ñü\ÚË`ËQ¥ã麞è€ÇJ£*TCãÍJâH%– [ÑMù~4Ø8ÛWË|J=ðJÊ5yBî•kd(m<Õc£ªE¦ùÏMê?ý%_ð9Î<•òqnù=íÔn’ÙÇHRkÐaÇpŸþ¸­…Ò£’¥°ÆqD)ù¸ÒÿN•¿PÕP‰N\ šƒÅÿh­bÍñAK6UAÕç‡3 ×ó£µVÌØ,Rˆ7ˆªbý‚k޲χu~\s«®â€ìžiùµœ‘@B²L»‰ýn¢=&ñˆº’~º~Z ¸Ð{¹(„°IØ" 4K»>Îr®ñÖȯ«ò¯؃g24C¬DöC:aÊÕ ""×÷ïÏúêç¯o±öœ‡o“Á|îá¿øç ·(ŸNµ±ƒAsQ#l®QE.VàÄ}eË=0·‚¹êÇ~[Ñ[7—ßðÏ£ã]éúFl8&c9L}4$ ƃ`àG(lƒØ$Æ™|¯ÜÓèz’ŽÀ[ª)ô—êõ|û߯ߠÆgS :À€ 9ZFÎùûÌŽ§«³Ý‹.k罫ceð @ Uá€c(‚(!0‘ÐRášãéð.¼SL\ûu޽؟ãWé·êSò«õo;| îßþíí£y|õ:WhþwaEGù7 9EÏ@­c‰(1Á É„ªuñŽ-”Ùí)ŠJ€Â¿ðM8€×–ÃÛûÿ/ÅåøV^¹Ô“®ë:AÀj¥¶’²jËbuq­õvØZíÄ ¸Fžàª¼o=¥rìqu7u;^ÒW>G›F%6þY4ÒóuÞtÕ°—«hÍ-Îoݵj{lÚDÎ/õ_ñ>‡/-ë0ªëk.Y g‘¿eû§äý„Ÿ/ÍøxWßa‹Ll7„Ž“ÕQ{™Ó8cçHQ=ÉHU2ÝÃCNqíá6×<7À#VÆJéÇ·õòªÜ\Ãwê(±ê%æsÌì TxòýõÐç³½J˜eâ]’5ÙËèP„@”Á¡Àû„¸¨^RŒÏ<{fÁ ö›ÁIDG¿¢å[OUIYÀjJî+ZPi±Kb’uÛÈ5 áPê!Ñù>ëêðÇ}ö—¼”‡yFOù8íl~üÂ_=-k¸Á bRQP\KÍWzCo£Á«;V‰ÕØ“{v)Xã ’&¯9â—§Ë0{TÝUiuK½ž/ç>é^Í]+·Õì?´'ôs}A6ž¢–uËù€w%t}G)*ÿ¯.~õa>Ús©Ú½ 8†1|ði!vkV9hŠWÞï…?·g{ýÞ ø9óë›ïyN2^™# R‚Œ"qHh8E(#º%w` ÄÑ$ ‘¬Ó‰Ac1³Ì™æ’ú”:½ít:×ãƒÃTR‡=>1(Ôä«ulH‡VlÒP ‚ }p¸9À×ÿ /º¤O¤yþŠÊYn¹ ›JˆÒK6>¸˜;õÃã$³r«Bw.tyÁòT½Ÿ·e5*Æî˜Ô!‰ºe¡Ù×ÚîæHtÁÍ™OjèØU%ï_Ž~iî—ÓÞ1^¢]‡×ñË{lb>ÆÁ_¸3ø¼Í‚_+™`“÷œ³+…%4Ûƒg{ò=^Ø®ú ç5Ñ®©÷?Î_ÃD™!²Îi†fD L$_è_ózoüõs3ñ-í‘–R§Âúù´²¿©&¬û¨^/Rà³u–pç)o®¥ÑšŒúë½§1[µ‚8Jϳ~®(Š^y‡ #@ãÞàè9b¦íQÿjŠ_ùÒü×ð3géÓ€si§Ë¦3!>)>ÉLÁÚB}2.ÚúÉÌÁ?%(`G´™³ÈE1¸&GçÖL#@“‰QU:n­^ÂdF º5–¹ô¶½³/³hç{gúí—¾î1~ó÷ –ïù ÷‹™õm»ïþ]x@Å1Lò(‚ìÈ 5`(‚#× qÔ¢¸R;ãs —#­-‰žcÏó͆yÑëºÙ,‹]½]¬Åú€S Í˲S(•@Ð"‘ã¨*uù4I*ÉÝÛµÓg®§§·äCºkžp)³¡<äšvñóv 3-(xúÒ®fÚ¬eÎmÛ¡™¹Eõg+÷Íý|Î{×nÿ8k÷m Ò-ˆàªPóŠ`€ !@e %¶,çR#”^cc Š)1uvg.›RM§ÂBIg™-ñ¶Øq]c³„öVIÅAAJ6G—}æ{M"¶Ö›f¼Ýí4nÌE [°›"6µú¡E>Ë“Tm)x=Ô“§ ,q(î’ +ËrKÔŒR²ÂS¤ö€)$ Ë6vâ £Q@€l\0nzìò¾wÿ6§LûÓ9°¨ Í`sÂk×÷µ™Ã+Ž¿,ÌæŸqBää<e'‹¼ðDý¼ª~©÷è [öÎDŠšò%j+9ßÚD–öVR'­®Ö¬±Æ£JO‘mnô‹õÐê½—Aâ„ ;˺>Œïçš%£·“êÉÊ6ù;jÝÓP6•Ãáp¿ˆ›žÐåí&cFýÎu+V•]Ò­*'"Íb:‰‚¶û«X˜"‡v*;¨+¬ð@ôiâ‘L`äAi’ÅM 2ÔBN$à¤wÏT}²fy×ɵôÑ>¼†~#Mhˆbз¸ö“@n~Ïì[„(Ùnuîï÷æ¢!£}ãîišDt'+>Ú­t)y¶b!Çã¹°”J×ãNc-Ì’`q»‡‡LŽ„#ƒû-,ìôŠ 5 ü;ë2|¿CÙÏšDú°îÀ†U‡!QJºâ`E©èž¨lEÂÈ$V=zNÅö%í»ÿ±€GF< +ƒçѲ½ªh‰@!ÑuœP_ïû-Øñ×NÖé÷û6_7ç›Ëät*¡s([¡5W_éòdÝ0 J ³…Fuœ¬1-ØeO¦r’ΞOG•SÃ!VIƒ)Y¢d¦ÑA„ÚÙtV+9¢BÑ 4m ¤qÙR6ÓbÌŠW¸àHCz:rÍ´!9<Î>Þ}dÒi.§~Pî³_E½êµË—Í’I¬ïÖßò|–$ÉçðeÔD7•SöÒ£_>sggÍŽb­h8Vp•ÉÒ%Òæ>—±ÈÏ-‰dXø»½lÆà<Q lÂ÷ÍÇ È fè·äÙí9õtdG‰l­D,e‰©Ä¡—#¼}oŸÏX(‡#]€© ðÍØ ˹€÷‚'"ˆTgÐíèk»w¥D½cwH*&Gy´c¨¢‚ºÚ’²À®~n_Ëp¤ŽJ1mÄj,^T’®ƒ¿Ð£¼Ôµ…wç4Ò`ÛÂcë'®Í‚¿ÖË1[Û‰±*÷¥?Sµ!­ɯæ"lèl¬¾ìx¼þú—ë‹¡xy­äiE`d2*š™ Áa^ÒÉÝñð}?¼v(Æ«~`IîblñRá#{>ƒŽæGýÅqM è‰B |ïÖc¯uôËüßļM‰6GØžP-ÇN%{»½M©FC—l©KµÅJ„‰MÁWr?ˆ1Æ[¼€ê+eDÆqܾ|‡c¸ Ö+rE³Vx“î.@ ³¦°Ä1A‰í$Ĩ[¡iGîÊP>Ÿî{é£@ÔúŠªиj·žRD‘BH6P \I âFr0Ò IŽ™é«ù ´[%LñHÇ«ÐÅɨhÎ÷ÉW»Â¹7cÙç‹{ŽéH&Ö±fG)èZqV‚dÔ²d†¦ü/ÈÜ–§þ²Š»ëáÅåL\ù½~Ù øšR´ègMþ3Íþ“?L44@®‰q¥WÍ·ºçEœh ñźkÜsÈ Žðï Vì,Ó!ÓìÔR8Wr=‰ée2Ô \R‘]w²ÐiŠ»”ÔR ·h{?e¡©Õn)Œ°Y]5Sõ#ûó¬Mx®>µ•GÁ¾u|¿%õ»žg[ó°aƒ§#(–óÛvº`Šzßx\/ñß|¾¿.ö<'»û=%÷ß‹ž;ë > “›–ÔvÇw9ö6¾øÞóHZÌõ«“ÐXÌàk¼š©;æX­NmV3-cÀÄæÜV~Œ0à)`̓Q³éOwšÝ¡)¶½ãùJuçÇVÔÌ™û¯gôáûøFûó´¢ð$¨1Î09‚5 DUKúÜQºõÌf÷4¼{¦ÖA(9@¬ÙL3LíokU†|Æls—ƒ*סeAš%¸B»É—åÏ'™„ :JCÀX/ùkZêãK°¿z=žÚ2±ãûþ.S‹% Zde¤ͨ¬fZÌÀ0 Jˆ11º~ìw5.¥ÎT‘AB¤ÓL¥ÃzìÎ-{Ô+­P¿nïÂûf_NÝܘó(-²rrv¿C]}\Å·qKj뺡#ƒ9ÙŽ)Ùè·;oú¡_?:=ÒÊfšèšß6+­~wæçòvı†:9ïç/??ì<ßÉþøëoþåõOý‡ÿöù§?;?¯K³Ã9ŒâáöX”Ûúê ˜•I‰ö:-LMÈ‚)¨já!V^eåN‰6€Ñݦs˜Æy@–³QQÒT'§„z¡(henTåZåEHP´C›ZƒÄŠw¼ÀêDzoKËŽº,Œ¹dcŸik¯št¯:›ßöüCï™·êšò>H8,Ñ ,ÕÃÛ¬ª9\ËÉÑš¾"™GL£ŸÞÌ(}¿ ‚föÏÃötºhÒŸÿî:õÇ ý2ÉĽ¼3¿Äºmpvl¯£6þãä À;m>‚Oƒ‹UÂÜQ¬OÜOx®âUüu&ؤ}áÈbpûÉFJ[íl¹“ŽòäJº£ïY+ÿö ýæï|ý8ÿZ…ué8 lFB5u9)üÄôX=ÓýãÄ…ixÄõ’Ô„–¾6¯ @®¬ì$z¬UB(V\#x¸¼Ç\5x’ûšò×ðXÇóZæÊÅ£Œ²à ó§Gk#ñž/ç*Ì4±¤x¢hS©k9 Y Ä"Ã¥ OšÝ@)Åì®…D ¨gÉ ÚaA[x±¦¸./Çe/5øøÃ¿á[Ýk¼5é•ê‹z}+÷'wŸ÷ÊòÉÃ.€Pq€ üø( FEÅÕ°{­»3k-eï]R`P6z¿êjŽ•Ó9Å+†ª¥¶Êzüb¨ïß‘ %!¨pdRž¥P„¨ª#j°H’{Ä íðê'ÛŠ£ë*.êЙãhöÓÖ¹oõ†¹~£Ì‘ú«UoO™‡O§XåuÙ_¦]"¼¬j3 gWp±g÷Ÿt—b4@€˜JW”!.`ÀÖâÍ¥ÞǶ…ËËÜÓÜ¡]#5¦Í¶TZ!#±Oép ·×™Fa”.ÄshD ÃPˆÀü ²là]<^!´¡‡¡Dé1KBÂl¯DXc+ ™Â›»ŒãšSÆ5L,IWÁy倔 ’Ñ "†X€ L1Æ·õ/-ÿÉãßQÃBã`wç7lØf:­Gd tB!M!Ñ’ºoJLˆ$F=¤÷óÃ[âh¼„iÁ5þZŽV‚kk/cLk{f|ÌôY©{‹IÑ UòÈ“$E€<Â^¯UCBô~¢=ͤ٠H°úùžHyWçR'0ÀaC¤ËM 9÷ïJ¦UwvåIè×ÑiQØOë¾ò F\×(µÆu[hŠ›ƒøšÖМE-þéjÀ^áç7÷Iᢅɬàhð6z €«#Ô§+¸³Ÿ\ÐxkŽo*§ %,Õ ¾Ð}ЦÆZ#éf‚9ð³ëywîWÛø^¼m‚™)ñømM5« ”!´UJ5 í]´&U¢ y¹&2,å /lôžþq¢'ˆ@&ÚB „‹C $”‘l¨1pÐíLv„ä©8qÎAÝÐÁM•Àí6a‚òRjÛ¢Ô# ŒXÐïB¨rÑ[#%§jÝ'd÷Ö;cˆ¢a\kžÓ‰â‰=çDœj}-µós¼® CÓ­‹]Š$äÏ}auLUY+¹tÞDtHi :^ÒéƒÕàÏuÉ;(Ö’—Ò‘SÀM tš;ªä_‹Ð.ü°¨¨Æ~:%‡‰Ž:Ͷ³Ê¥&ê®A…•8lkв 5[ô„³O‰óRïxÈîÖ$ SèiÁPw‹‚y–:©UôÞ«HÇ&åFdªd$˜ ¼#IuûD‚Tób«ÃV¼aHJ´¥d–³µz¹O©X2"Ô(X`–I tH2Éy¹Cª†OzœÖr“h¾Ço;+{¡JÌ)>û‡'¿ÿþÝ?wüù—QåÑÝŠÞ´ûïÜÿÞ÷Ý-M¯ê¾¼‰ŸØ;ã=÷-ëCŽìdí{YÆ·ž/ïí?_ÿ }?¼$ŸÛÃ'^?Ú˜Hñ]Ø `8¶ì•±ûòäÃXF êf’€i[ÛµTú¾(éùÍÝ7÷Ûèx?ëë}Ž}ùº5>Œ5Óu¶mƒ§ŠÅàóÎVã>-…ß­cùWÜQI¤4 Já-“묤yTKÔ^ähoƒQ­ Ê‰}³Ã)kº•ÓÂ’ÕÞQØMʆ|40tu¯Oø©Ø s". •lÙ¿|Xº»¸ØŸëïúµyýñ[6µ±vf Kè –<\·“98‡ï·ï=vuÌŸß Ø¾ŽÇö>ÄØdu Áðñ±ýæí:æ4-öæCmŸïÃV+Z RBµŒ÷ZRÛô²…އî–Ð ( ±·€W\ Q„ºÎ‹ŠP÷n]NÃJBÝÇå/%¿»åº‹½¸«ú§~ª MÞμtÙp³‚“|ðÙZW_î=Øzp467]ï·ùNû—¿ý‹?wDÃÖ£^ÊÎðeÿ4w<=í%Ø@š/(/3°w<Þöö~Œ‹˜\Ù=û¿ë°ä‚¦á¬tô)>m£k È© 4h£´':¢x g8$ƶ-m‰w ¸¸ã‰4z­õ¤ïOÛØÒW¿ššUïÈ€QA£rÏ Ì–É¸ 5$€€…VÛŽGºî ”.ˆfJË®‰Xhëûæ5ñE¾ws²üæÌsüa…@:æWFNø¯ÇA€1±¤±…K5ÃÄr*†Ä3Ø&c'­‰" 9|ªÁFXPÓò=á ¦”tT¿Öª((J1¡X¨LÐ!@C „¬""¨%&Pž¢ý’\OÑ_àSÉ‘¥ßZCWmö_úý «×È-ó¾ò³úv[;&÷»GO[gÉ:úÔøÅz³ÎÔ§òÌ[ɧõô¦ƒ¤G‹KlëÍÁŒN;Ÿ6Lú(oÎŒ\ ¯Äܨ©öÔòØã⚟>û—öA~€]‚Ò¨0ª'“òñŒX¶v)ršgc± ×¹brÐŽ7ræc˜Di…ÅIüÄFV’% óDt̘<Ú'2JØnÃv ¡—ÊažþÄžCÁðX×qpDSÍ«j]ä=QÿjOù‰ãd¾:³1¾A—ý"¶=®¦e ×Ë“T|bÉ>©û“ GXj×®yí(wísŒ]yÙ@J­€º2¥zŸ¹›’/~ºÆÃ|[  k©…°"µ©Z9^hF{(„¤–Yj÷î[ì_»ÇòÁÝ@Õ….À¶sÛmk¤Á„²§é “Ní«ù0”'M\»gƒÜš'”fѹ |¨©Ðvøm>–bÝÖQŠÄ ™YÊ·ý•œ¼ =]bJ`PcsfSYHqé1ÈŽàEl5ïAµ¨¦ÅWWœqÜY‚ºŒòl\3r%-”ÝÂÒ8i¥h#äŒ*a(z QéuØ–Ü #àª_Ìpé~鮾æš<'ÓÝå ˆçÂÂȰ4ŠC¾—®V/ê½€&TÌPKÔ €—P ƒ Z#¢SÜÖ^ÀqWµ=f¡±f¸uê¢&1k†O R¢ 1ÔJIR´fݾ–Z‚6IlIÁR²¶ÐÉèlãã‘\w,%)x?‹Ý¶M’òÚºtþÝúX…ží‡–£–zðVg)åÐ'¥³V£b‡° H Zl—Ç‹PÎLôõåö.ëÏÿC•ãï}é^#Üì˜ÇG¿«›RÜÇ­†Ô|?3rÇÓ³ü%þ‰<­ÕŠd'ŽÂ$Ì’XвÊɆ6Ô*3âú,®•wu€ÖTˆôü¥¯ƒ RQG[9©-éÒX*ÖÐTËr3OK0™W<&šãKù›Z»¸vqhSr¶GmÒú%Ô¯^ÅÍÖCûdK¹L$ÔÅ/V;M¡~­kÐ œoæû¥¼N)~Ï|çÎs;;ÏŸðþWÀ‚½YëùñÜm"–EkÇÞödy>³#þ7¥ßgœ¿0÷Kwß?ïŽÑý‡AÔ•Ù.3`E%Ó8Üpf·ÖôÑ8+Õª#)~•‘©ô-£!ÈQõz/“ªHWYšû©ö‰i7¶.q½•«´Àýß?ÞØÜßýe>þÐ{H#îq"a'»ää К‚KƧ!¯Ê·œa~øˆã÷‘]³šQ: H"’pñNB%jØi.„"þcç¨À-¥±Æ ÿ!ý$(2D.ÕQ‚‘è|j±£MÄ bsÛje4®Aç­Í4BbŠuä‘‘Ñ®”7H”Å¢b/‚ŽšôT®k¾ú ZC1šÆ¨eo2æ»ÛJöâí'^_zîtu6™é½~ñ^Ìòì ­LéŠJ1¿­ùêÉœ† ›vµHë‡ê2ƒÙÓçÞUø:ÜBk]@Ò™ï9©Š}œš_b¸_oÍt9øã²§õiŸ×Ùœó½Q7¼Ço!U‚ó&ëX÷ûWfì⊪i\¤uæûEÏÃõsWîeÇÝBPñr~ü°´=¼O74?£çèꇤýcÿ¶5%5ÑÔ„€–ÀQW{FÚ¢ûm¡âxÔ±-ìmØèH!ï̹OìöD¨DsÈÇ…'© ±@#P ‚åX£¸Ý™0A5Xk¶è·xgÊJdžïG¸›¢mÀ: ÈŒû´¦46çT4·jr§{RëCäuC?:.I~ +eA.î˜0{Ýu©„ÒŠl ÜGõþ`«rç"=q5ø —”{ê(ó,\áž©Fb ÄðS™©ÝS\pÒZôq: [É22¾|OÎË¢“åëjÛ'â3‘ 2¡…iF ¸bX !øt¬-*±Á6, ò#`?G•\£F%›ºC£ ,¹i<ªÁŸg|)bÀ8a÷ì*åÙÛÙœ:/U|an9|"Ü&Õb›h’Bµœ%!uY7g†ÚÕÛ+¼‘œš…|¯tý<_ÿ«þÿ [`^µÏê'*¯Ç™ÙV}˜³z3Õ¯ ~'š¯8{Ä78¢|T¶F,6´Éͼìß4Û¦…ö*Ž-•ꋤÕƒFFÅ–”oM°¨ž[°)®‚›ÍÞޛ͖bwo®nI©6+ç çØ…èÐ ¿ºUv!×aÑz–ÂÅ”ðÜ·NeÌe¨Œ8¨:BŸÀ$8BªV ghæ–'М'®µÁixÅáŸâ¿~>ïO)Û9÷#W4ôpd°døè÷TY‰u›ù‰bãüÚ÷ok?øöo¿år_øt>æÆp Ÿ·ùç‹<Ô³ð7ìØï;;{$(¼ùùñÍT]ŸÝÖÅÞÈ…#`ßBÓ-®aC‡C¡ËOTKnú?ùéç’åßÔ9wq‚&ÜëÆX4ˆ‰{ýšçµ¿}úÃ3«¡@lX¼Ç[í×k±¿ÎÚÅc²–ªýPÆ×s´»¬Š ½év5ÚpÈ`&QÛ7Äè|§Vå³0´Ü¾î€QbZEÔ†@Xy*ˆá#аçM}:D ¹4¦0L„ÑÛnk1àVCý'û?Œ{sè¤1ñÀZõö0 ’ ^à ±¹Œƒ¥÷ïüáüùÿ|Ý*ëHÌôæ:êÄÂcc ¼îÞ@ŒùOò³D†Å»uík\Òþ¹˜€&@€Àü˜Ž?¿üðÏš+24v¾¥6ÊàvŸ:ñvd†˜4ßÊÁ¬0F‡Ê CBgi†¹ë§¹–ëð~ƒÏŽ~º"é«^¿$ÍH (F¦JÎã#H*~J½±2Ä—ýöã”ïï?ãä8«×œØæR¬ÞGDCÚ Ö5ŽØvxÓ@ÿ«Ï„Þ}¿Ø=Ôœ?Z€ ‡F!ƒ¹˜ÿ<ŸÓQ()L ÌÂâQ6I.€Yt›¦«ý0^KËHŸÇn_ó{åØÛv%c|sz°ãʽ›õ+kÜ0ÿ.¯Ùb‡Z« &Kò@¤ëÉ{àaýd¹Uh¤ãJ‡ìA{ÔsVÇüuÁoZÕ-Þ3ÏÛóÿ¤«ãÓÒ­ÏD´Äøj0'° ÃùàÐ,|Ç÷>³û¡‡‰Ž¹Ð½•ñ¿–n "ÈCB¡Ø+âwæ€4 ÂU‹Vš.ƒk_ÂŇȴIÊ‘0ÛŽjR%F·ÊpHR`˜ŠB.ê'€@  €  bó U©òG* Ü^Ú¬¦Ñ‹d>l’;äÇ›©é˜=Ðá¹áG{ רÁÿ9ˆãï;³ê\iEà‚¦7sd‚¢·Ð—@é:ïÍ:|w‘LÑÉ£Ka•°ÑI©U§žµŽû(}ìœõêÇ,êÙIbÓ‘RîAÚbé!œ2€u\ЭôÕîÊ[­Ä+]+匊­Iz’Æè–®aVd¿S­î„©+*i5”H<\1ö­~3ËaœcåÁ[è‹f^Ú¡Q&~1ïŒÌø‰âÚsÝþì'Üþflþ-¶päžèmÃ…ÁBÏ8˜X­Æƒ8vZBÃP¹ôN1¦Su•uU&uK¼Þ¡UKð^­ûØÚ×XÈ¥± i…e«:ïµY•úöŠ¢  2< $†k¦Æì¹9Ût8©Ø÷½½õÖ/×{@ñç£Zã]G'ÓØv?ç%ØÞ„0"sP¹èjÌöCÆWôÝG¿ü^ö¿g Ô5…EGS|yy ¢W×ø“s}D3ÿ0çùÛÊV´{¿ØÑ7Mÿ²FïFcíØâH5šì c&H{5˜è1K[É‘ 7ãáçHú¤®@I7ådòÔ7÷/~Nžìê/}5 +†^´5S‰)U ä²i§7æ¿÷á·Ú¹¤Ù…u¹´ô¹Ä–^AÏÎC8³¥¡ºÍtAǦ3ÃC- €4†Xfp²L†j´!ð°©jæ×ó4S‚ÁH}×Sè(.ãÔ$> saȨ>ðE†;J %«˜j´Û…DiRH$°dh>«ÒÝø°†\œ»L›¨ÀO¯ý~ôœ‹W…Ì¥ ý·M‚ô¦»ç Óïûó ,››öš-f!¸ߨ›²F~#ã!TV´ED‹g ã;žrº¸„ŠžYBB¥3Ö, K*ýxéX"¦†R;LÁÖv ‰Ábsë³ Œ‘¥\×Bc±‹P18”ÀÕZÓí,¦‘íJ§4Äõ¨!©1êÚ©FΙè@Hil¶ãà:A'ÏØXnä9AúýÔÙóK楃ÃÛŸÏzN‚O;échí¬Gº¹ýówÿ|f¿:{¿œdvłǧ¿÷áùqëöp=־ijyÃúÕ_ CHaÞý=&+Ù"hí‹L„A°%b­:¾Ä²j0œÒì¢pnEj‚¢Ö«Ð×}ï€þ²(7`&–ÕâV¦!WÖ°°ÈÍ#mR'ÖXXH1"à…ЮEÚ ƒ5êü•{å.1šZ}éÎ ÏL­–õâ½í~hrP5Z£Ånä9‰=Å›ùV‡hìNQ(ê lèLí²)ÄÀp¾d²·{ƒýþ+Ykb Üõæu~ÿyóç´[v];j,%ŽQ2¯ü b4³ÆdMæºÞêä×Åe¬<ÙrñV“øDÌ5Zsè“R¡çÌRu•©GúGvaËÇ;÷o¼í<îç/ržn¬Í¸…ñþ³ÇÝ8ž^›¾—œHK!÷¹‡žoí—3Ïëß›½³Ë>è¡Õ>¶Xa°Ø$“›æ ¢dÿw'ÿÓÊ«¹B-Ù´ÉD!ѦëFÿì¡ DÕŸl¯XM…C‰<Òb–Ÿ‡Ï)¢ý´NüH*HÅ«Áù+T!"QBÉ[ºöUF¥iž»ëçÙ6«ÓòÂ6ç®ÒT5û±ëÚå+^lï¿TÖöŽWáöú¾³ìÐ4‡yßþ ïq¡ƒ–@¥v×póožyè¿¡ì™ö‹Í¥‡'®-ëÐrÞ¬R>÷A:Ùë¿(™ç]wMÕ9ÉtÛñ{±èEøhhFÆúPvä™_¿1OÖï¶×EàP¡c§,H”"ÚDÈ…솈iÈ&×$.)EǺ/NV—=û€mþ-Ç–Ø?zØ•6^wí}ÆÿCÁÿ=#}ôîVoâ:´…xaìçJ3Œ4.L2;Ÿ$ª6¥Æ€—ãúXY~__4vñϽíˆÌbàq¬Là·é¹kO¶¤ùûÿ=Ûäì9êrúC|5màö»ÛÎ[àßÃú£ëq÷Ozæ!B$BD4Ú°)ߤ`y¨ëˆ³HA¿]!®²ûÎYõï=|Pÿ¦ÓŸ±Â¸Ý@Cç]Ý7_º6‹ºû{»eæ™ÇM÷’ó9Ö¯ƒ¿4ûÛ&ú×qAÌé²ÕÀL¼úÿ³ -üTõ†¦R¤Ü³3OÉ¢$(¤¡¼=Ñvæ ™ ò›½¶>io=Æ¢Ÿ;û! ]¥è© ’M« Wà¢Õªz,© U©©¶IkÆìùVÜŸc9×Ä;µ ]¦¯Û©â¥E%32]Õ¬ÖB‡¾¹|Ü=ÉuÓ¥¢äé¬Rf3ëntÛ²âU ¹aç`¦½æOàm…yP×ʬ¶ò[t?Ô'`+êë{déMuD(<€‚!ê&ÄŠU¤,?Ž+ZBáÅ‚ZãŒkÙ#ßÉ]A#*R6*YÀ"„@Ê (,¨Q«XX¨ÁQÕÑJ­Z3ã¥ê‘êdÝhS#Òö¾Ãô×»}¡ÖÃщ]‹Çëù¼/#wGÓ(' ²±­Ì†Rèà D=H4¢ Ò"A6Á× 2h*TþF*Ÿ)fp¾7Y€yŠ|‰ÏzÃï§v^?þí­7÷§óµLïn$V$ø"p_„B£gxí9`-†Ó:iÓ(b.ŒÇØ”P0: ˆF8*œ l¡ÃÄͳ^ûF!]˜\×1Ow×Ò2Q&WG§ò¬“Ûègl¡FÄ fE&ñ ¥Hd<OñªX:÷鱆¢¸©š0ö8ú(ePZ,¹žaK”€jª8n”˜†"#ºW“2*M‡)î&®¤I8~ÎÎHÃô9  4OS¾-M‡¼ó§z­×Z©°åsSŠ0ÊÖyx<­š÷¿*úxÀ™Q¿Í48u Ëc‹’Œ68÷ëïΧ‡~ìãeŽë¥“zYÀ-8Ó6n'+v¥×‘@p¤ 7f‹†½X±,š¥* î„t‡Å0¬´ŒNú*20*)÷ªÞð³€"qׄf{(2»ã® l}wf,kj©˜€ë=õþ˜å±âܨK¥@a«fZFß»C„êl²Tj:Ù§?tèñÓÀì±sFóŒQ;²Ca×4lÏéÅÌÀ^S $ÔÎ2ªg*êzf> d®k eÁB ¦ØƒsÖ'k¢„Ô4M;Ù8<ƒ½Í¬,·d‡€’÷ƒµª”½<3>#µ›OˆÐˆû~W!aÍ u—‰²LÕU¡”+éæcÌìÊÅTÃÇÌWÏ$Æi¯C‡ßý£@£\@$Ë~"ÙQÈ}Jñ~0ŧÔÿ5õª¯\ 8¾BÊUØb[ðÔôŠ8Mæ°G‘ªyy¥Ïoô±zùáŽüº_9,ܲ˜ŽÀÞ¾è¶ÝC.è’bôàZOÇÌŸ—÷]¸¬(Ö=s¶ÉU4† vÁˆ††L‰ ‹ ªÙæJûb"uzÔ«$AÅ0Hß=†sí æVWàDo)âA僺s¤—û¾zDc¢=ðºÏDµº«yЯ<Ïä¾’Ô&s ÒÝIä:éºP £"eÐåAd¼#ª9ˆ°‡Áå P•\ýéoú?µuãè&èƒN|£¼®æ9&ªtÖ]¬\ø<ë›sò×Itå{= wn·ýÔ~¹Óào/P, p=ßß‚ûÚ¥Í>H‹FüúdùÌGDYµ¸•;\n™ZQ,hi`ì®k«[÷mjwWuä  é˜úÜpÁ=&lµ¥4å¿—/·“olm=2±*j·Š[ʱnàºÍû³ØIL—λ€œêY´ÛŒXŸN £áÙ!龯LR??F&þ|Fâ­'-qÍ ÷q"˜ÝŒ¨6oÌ;k½e4bZ8¸è•á¤;B[]š;¯¿_‘(õ¼†Çù½ïòÙùùàsŽhÙÔrüêÝœsíÏÚñýõó>Y £v¹ÆNæ²bŽí÷ß{À³íÖí@Ê)?µûÜaÖc©guOú,m6öÿ¿b¸0ôxŒç»u5üMè  …´‰ƒÿL1³ÊhªO=?é¶J<Ñ ¼n€ @Á¦å”+mrd6u¢ÇMúõðûþM×{4FŸJwQ& Ú*ćPÎÎ?ªsnʵ&aË+ÖÔ÷E‚ÛZ$:vŠ`ôB'ã:ѪuL$òu\ºž?>ik–vW¿ÀL‡¢ðdz¬o©;#Þü~ÛiM˜m´Œ€!‚ÆávÛò¢£ãýøí=¬±ö9ä6Oa¡©½¶‹?z~©Hto}l Â&ä<ûц©™¶ÍFù=¸“§Å+íaЂ·Z^½üÆq]렻öÄC}^· ©}F¦RÓ6PJÉ7ƒrèn? jê´ÂwRÂ$¾ÜÇ"À!›ˆ=žYgîïôÀq¨•Ï ;¡%¨æ ñžC—FF¥8g…Sç©ÚCW)/âˆym¢!1Õ}FH0€@K`‘7¸ ˆkqÐ'TáEªÅ„–,‘%T¥'u8Tày­ü0ût³Tö· ô,:˾„ƬÔê4ï#×Í|{u{ÝE u• w¤'çäïÈry<þ™Ñ£W«}Þ¬åœ2øÔ“ë~Ïwd\—{`IëáØIuû£|J蔯“]8)ü-²ê„>L ö1þ Ó`© R"zi¼rͨ´xŠ1 GR-Q9qÅ8^MÖYl'õÍÙ ÒÆQeGº$¡aG£eûðpîž@†ÈiÎ2-¡ñÔ|Tê’€âq^½>7r¶^Û¼½üÕÿÉþM¶ ¦@¡(j¨²ß sð¾HJ+£æiWmª.ÈÇìX^2Ï…‚T‡µ3uÍvée£Š²fÊ×Ù“2.äTqUvlyé©Q5P“B®”b³Œ5$¤!¬¤445¢ƒ(së°øˆPÿ3ÿOñõtìúË^ ''\—ꨰ˜Ø¶”s}×//nu}Yý?—˜ÓÖ® ŠRMxR­ÞâÿüR¯j,?ó^Ÿd÷y_Õ1ÑÒ蘕`Ë“úþL^^Ÿ@wLŠ3‚$ÖÑìTIh,Œe #,£[÷š{\ñÝvJ­dF.8;uªtÇÛ–,Ä"ß” @À@©g ,•¯5N'“E£_ž kÏ£œµ>kqÏå­ƒs0N½WgÊ9«éjÉÚªvEÂá¶Î¦{ÁàȂʠ @¤ZbY€Êc;ª„L$ˆ±¶óÆå%¶¸ËÍæ«[ ö cª×¹U?˜†µ!D£ØÈF% HOfŒ˜ËI” ÁÃô^¬L˺[õÌø´¦%Xº{ËCñ¬­ßTÿRô*y 'jßm%ü¯ã_^þ–Þ'wï•Ë ¥Z~Òï‹ß TÏ¢‚îó„sÄ7Q!/ìbÅ žðâ6Ö±† çb/Ž~œš_p·úÅ' —…+Ùºý¹žOe ¿_‚ )¸õœèsÐ #Š8";ˆ!6]çSˆK¦ÖEÁlRE±ºE e85.в‚ÕÃbÄFŠìÐétTo˜©s&+'X¦U¸Ô3Nkd’€|­˜¨±{0³Ü7ù<ïw„wµëâ)÷‡¹÷††l¬/¿Cæx6¥H§N¿]ý9~9þN“V¼)&ó³’nóÇ=7ë²4ŠÑËéçp{_wHPqäz¾]mÊŽíÑ+¤(»Á}ÐÆ½ö± Íbœ„6¡F|´µ×j°Õ’ª:üå¸a‚u,Ò.wŒáÕ¢aeNª¡Rˆò;º²»ÉEXˆÖ @…¶ìÈÖTAlD´r`¯ ¥ŠõLé§?ÁHQ`®‰51ž² ¢ÝÚÔ Êa§ñî1Æž½ûÓ]fˆq$äíÂÎv_õ—¿;íé4ÐnŸõÏk¾‡Ùk-½j4ö䡨Ⲭfñ*%e\ñõÇ}D·ì*s)Û´`AÁÞéGÝ/£/váæÏåЂô€Þ©Üì,ú×¾ÜT‹…'~ü®k]z5>ç;ß7ï8ø|ȽѵÏÕãÅ¥¡°uß<Üçì¼¶4Z˜SÍXã""0Y®µY{žrêfüÊÍv@;û'Ò_“!‡¶J=Ö{Àu™º[€õ³ÑFP(a©fk › D³Ø%ÍH7?ÓÅW; R5''„Ò€H¹”Ä€®þ)/‚uÂ:»5©ò'H´š¿çI<]µ¹wÊ·þ¹¯Û>Zyºé/ì¯ÿ¸]§ÚÎ=NaÊ4ÚÉîŒÙqBêd&W³ŒÑŽŽúHíž´ñØN)¹‹m ,)}B(Ä‚~#9ù*Òp§лľ!ËV}>þÓ=›ü«æ/îþÂò¼é<Šdí-ö¡lp=|Lÿ7¼ôe ó]γþœù—ŽçgiÉÏl~×…Ák£iL« L«Ê€ŠjŒÀªG*R™ŠØšÊÜ q¶6åUËIwª¹•}SiR{x@q¤-Ü“>ÜœÅ|•¤ð´2¥éóÏæŸêeüü±&ë¯ ã ä"ÅÂ]U=ý>ùiãŒCh»I¼ÜÅ5ï˜}??ZÎo÷Ù{MÝgäÑjÇ‰Ž‚Vu¾{T÷ÜÑ×gø@¨ÐVéX•ú`'¥þ snölŒÕù¹µŸÚ/øxöŽ-ÒèyœçÒb»¸ÇòjAS÷ܤ8£\”CéÁ^:Öð’@4ŠžÇ±mKî‰çÉ>ÑÎÒ7»~›Îÿo`©GpØÉ+ª· f™¢Sc¢ª“&WQïÝŸøŽW(fH§Ž©“ЙykÐt®?{Já‡]7?sŸXìŒy{¨¡e… ]”™Ú•ÀLËbÞ1•1•M ±£šåImM2sE±Ö¦8´càìR\òѼR.!?ç‹ykÚ‰öäNCÇ"Ç8Yïé†U¾r„ ¹ع}ÝœÅr\ô|çV»ô\š=¨Qg7'~ûN½šÍ3~V\ Œq =ÉùL¨Aluªi7„â°‚@—X|bdµ°AG€ú@KF ºñ¸ºCb( ºrö¡R ½9’¶Ýè÷/çýµÒ#`N²Öæ8ñôùiæó~ ýi|½2w{R¿L_ŽÆPA¶€6©j`ŠH¦ÓhèïA6À€@€@„*›É7‹Õ©žãUMCa_oç*sR¢N8¹<7ûñ±ï±ëlåÃp PÒ€€Y«¼–ÔÃ÷ô±%\–[¥Ú9ÿÔ:ÀÈû=¢µê•Xt CWߣþñäÌõ¯k¶ÁáçòóçH´¯ˆ`FHĘ’p“g¼…6­‹I§h VY>jŸ‘ ­°KIŒ°ÌHP(š"Q̨h“Ú1ËÊËsóò ÷±8 [QY#àkÌCÆ,ìèVç½?°øs‘r`¾Ï6¿(¨FŸ+.Yv©P³TÇ,woe¢3lNön¬­XV0jwÖZ9u9èUvr½û³-©œCÈ9 ½×)ûkÁ0q´ü¡Wë!ì-HYKé£`„5¿k›tƒ ¢y)qí˜ö)lO¡zõ‡@ÂAgr¿QW¡­NñÜ“z"jX"'‡é¼R@jW,†³ÔÚ2SaT3ãô0ƸLñðNþïã“ÑAòcÐêTˆ±k”G_t:1'L<—À¤.+ëÇtùžÙ8Zp‚ƒ¦ö1Î5+çÁ­*RX@!mTÉtXsÖ”‡TKÊo|Ý\Oá.:ˆìWÍBÂ’â®àÿt(QÑÀè‚üŠÙ#êrO7†XÁTppàbrÇl‘"vf`!^eËïv¾ùù^íž(SBp6_QXÇX´ Ù9Ö„6ÿí?IC”¶[ןNr9š…Þb gøõ^вÒÿC¤‚:÷èÏÕØDŒ‰Åµ‰æ©J³Ñ%*õÊ’ÞkýŠo¶ÖW˜îx••š™Óº¯"˜á»´ô½…}s¸—s{ª\—ïñÄÊ.Üöñq>^TŒ:Ç÷5(Ìè‹ IE°¬…/rú©Õœ;Ó[YÉÛ^KÔ®ô``Œ3Ê*#Ó-^ª Á ¤¡;d"ST§Z˜Ö5lÑT7™0ëÁSa†@‹xùQ,š—@š—nYÚd+†TL7¾m¾Ž¡ýŒE:¦xíùÃU¶{†¹èÙ2V·ê³èÝ>`„F2^íþrttÔ_ Õa"9jÝ0xêË—KR)üÕ“ÛNWBHÕ=3Txn¾3¹›#.&Ô#ÖS>yðD}/uwb.;½<`¯²·j çÒN¡û-¶E‹Íz÷Vt Œ&M³["þ´çLoîäªMç!OEOÃŽ+ éS._µ­§m-Z]G¨À‡ðl$@³%…ÿJâ?T-Ð2v!âðemˆ¦Ž6ØÂàÝ[{ݹ¦•<ü¤ämä@ ssø¶¬º{¢Ÿ°åßÖ 'ÁÀI¶C*’Þb2;à7çŸü= Á(+ͳțŽl†fcÙÉ4\yÅß½®öåQ†d@Õ¨T¦ 'Tš.Šl–͆¥™h¦KÙß9â1üÛe¥–iIM&®[@‘b:ˆ¢mÓìÃÔ°›Jÿo¨Ÿ>ó£>È'{SnV>;®@]rïÁ¹„w*ÛÆÇB«¯‡ÿéJŽ ^CÜ Yˆ+~¡ØTp\xÍü)º2Ï4…K†s¢?BâYZ”gwÔ¶‘Œ Á›Hi íÁï}ãšuíGêx:ŽH9™S1@.Ç'Pf4Ü„"}TŒ‚Ÿ¿4@Q›B“—è!ý8¢Ýô šèO8’Êó˜à5=SÕì\AžêÀTuȬA«9JvÈVº§öWÏ0³¤¨¾¤ßqЍ9,]n";Þ&5ÔõÔ—M©±0®¢‚n˜Dv™ŠSßñ`*Ï—‹k${íYÿpücÏŽHrî’bl­ËÇíPeÿO€¢a#C!2T7FiÁð†ñU–=o·™÷ÓÑõÜW¦VzC-=ZܨC莻òÑLU¡“‘;5Ó‘¡`ëéL H™ƒhb‰m%4^Z¯ tÏ/òü.û\ B,ó^SÕ•2ƒd[Ô’š¦8xªÚœ³®]t¸Ç@ëq’ev]øÓ—úpq°Ä—‡G¾ÐŽöƒÀÛ2ÃK«ÓCÇvÓ©Z2FAÈ«,$‚‚K«‘h#áì§vPTˆh”‚rLh ™ï­Lý«š(5‡†*x rS"DqˆG”à@HªáæÒ´43Bõµû±Ÿ½kå‡fBuÙÜÈ4]Èlä)ÚI;aÇ€ tIW¼E:ØãóXTÆVBÝ ªÒ³µßƒGö6T²uˆªd€C˜ðÇàEG…oL‚ Lß5z)Ð@8¾/ñàáôüϰ¤8xƒÄ04€ ðA3º{úÛ§ø.®”"œJ‹…**.àAg0u®D)ˆF+ÀZ㪔 ‰s“èX)¦í1#G„ò¢©‘h´fâHGFñID¨N0:+®/ªCô¢küy™Ÿ¥¾îðW­_»½nýE‹ŸŒ§è—¹øÃ&ËO}üç·7’¼%Ï7„Ö–ÈœÍÒ‹¬fðKr…Öé¿åüÐY=­Ò˜™¿Æþœ¦*U9GæFÜ hòKÎ*<¤S-B‚ðzLô!–ÓÔøKįD$bN¡æ:¿×†G³Y-AŒñÚ0´¶Ù]ç6†d*Yجu0¨Ê*P¡  ˆÆÙqWøgB¿ S ²"Ñ3H`à ³™ŠaÐ%À’lE66˜5v:áô¤‡ýQ[æÎƒžÓIY²w|ÿªûw}u>ŸÑš¾@¥4õîõÝÉããÜ3ˆF "’0]éõ+£TË´ m$«ÆÉ¤4Ž÷ÃQK¨È#kl”À£¦X³€tc~þÍï5÷ÜŸ“÷ñÔ½ÿÞüÎUîö||{ó¹Ùãä¾>Ü©½`êùmœ¾7ÿt³çÇv»¾ò¥šOAíMZt*0mB&‰îl,£ èŽ=æ;£Tí½{zÂ&,ãH‚šŒ, ˜:`Ê)â “Ò¡ :°5ÆYQABOÜ—ŒÞ>¢CÚ…q„B[ù½4}~žù;ÕçßV­æÖõú/¿ÿÍÉ£þÎó*颌z[^a¡å@†(Ä>¶V¦A- %‰‹ñ:U¶âåUf¶iAê8ªùB}é·¢ p — çy¿>é)Cíïsÿ¸é±&Ï4Fáuï|ïæÏÍYvî’·²-Ç÷„_¤lf ÁÞDI\¤PìÈA‚Í>"«Üš3¤Ç#¦Yª´šûlSå×>5ÎÁóx@Uåß½¬¹HÒ)Ž`£¸(p8süõØ—ç_8†Án Ó¾Ú&§šgÁçç…Wu…[À}@U Vd "Êèhfµ|eÿü<‹püN¼ùÙya“ö²EvOúœ¾óyèÛùõ'/u‰ÎÖ\—ýËÊüRcRf¨¿øÖÏâaX1°Ž%F]€V‚â1ÏÚï t±ªæOã“—ahãìÉc•88€ñP «Go¹4\€W\wŸlÌy¯H©GNïíõ—ߨS×päœ\nÁˆr2ÊŒY*¡™c ‚¢„Èg¦Ã£\;„ Q!ÔkHæ²”Ó9E°„h¤”lSZº· âœLNëþJ ÞPiÍ'¢ð,¦§Ær¼2!s–äN]Šà ñ!:tç˜ò"kL2§ªÉ8ž“µÛÍu)óT}0È<Ç˸ž+ž¤×  <$MöbIdLsôÙ§xª‹U³ÓIè 6à⨭銦«ûQ.A¬d[Û›ÛÚåg‰vÍøî?›å_ÅÃÑ)œŸ”k¹ÿ 7¿Ð(ÂôŸÌ.ô«==¶™ÂÕÈQõB„4OÛ¤Œ{èŠn±+çNåx´wFIŠN'¶ç]ÍSôŠ´ $´¢®R)§WC@ˆ.1 øÜKš­ ïà9¹w·íJe ÷8O)y`^$®¥V3gíãÊ]áXO?¦VÛ‰ÁF§·”Þ°gƒVf6 ȃy/´².ü'•§žþôZ·ßöoëX š4×÷˜¤ïãÁY ߬1gW0£©’9mfÂЀ¬ŠM£.Þ’¬›<°'–䀧ÇvwDÒU [MJ²ØâÂÝ&i`g OÐcðÛ/‡[¶èíeA{F œâ€j¢›9£<‰„: ƺ E9žÁ›«T“]ÏÓØŒsS¥TŠÈÚ˜ßX%H›Y“<Ä a®ãÙ:È—ÖUè” „2\‚ °ôíÊÂÑU$Û7kX70>jeÛç¼ììzçž+¥ÈÏ+Y¡ÚÆ¢us¦6sëCç!CF ÎÒyfcˆWœ²FzVÈ’ÂgBõ§C]Ó˜Ôõ¸?:ý‘ÔZçŽyãçfçrò©±ÞT 1x1ØòÌ[Iî§<d‘¤xm ÚdCq„:ƒæ„Y4k¨òâáÐÀ9Ûº—4ñ¾ÐÒä‡ùPç½x›ð8œ‡2ÿÐx`ÓD(Brc@bÈŒèè«Ý“±'P"¹ÂϲµGí•Oüÿ:ße\¹¼qç†ÔÕ”Mo¹}káVÇøyú‡—ãÞ²YŸÞód0Ô¾è<† ž*hûx/´EXÙ°5'‡¶À2zO}áÛ'º¸ácõXFµ-‚ ‹ÐŽZmhJ –ì·9&ÆÅœ®]ÏÁñéöÛÍ1 ;þ¯*Þ·eÆx—E':e™A–KàX¶ÒÜ®™þPûØá€¹í†Õ¸N¤VËëë¼1ô`Y_+=*y‹æ͈m´Ô,ÇDØ@3[Ñ>æb¬k©Mª$'5Ò…o(Ž#Uå†ì­µ\ŽoöQ¼†V)€<‘ø¡ §bq–‡Ú­J’Â÷#¾êÛßpy¸¨Óe¯þhã%ÈÇÉ<^ÞC¤-:ÖÊL³Ó@Ò”Q†Ð3kÑönóÁäÙS žteQÙ$MBMï ÷pÕ1†X…ºa h mžNÿܰâ†j:•‹•ŽÉ€ßÏ¬ï •e!Öðt~ñ­Š´¸®â+¤†£N5q·ûuõÅ©»i’$‚[Âa½ÎÆÔŽÈ}Dªµé†àѨþ×ï ù·€üÝsú5x~ÙÈ•ôN^Ã×gø„Ç'PôÐ:ЧlÀl¥çøä,†×„ ¢ÑJ‡@ &Á|“jEBbja0Qí*S!šÒà¶(rÂaW}ˆž-þü5øµ!»ƒbÔAÅùSOð°jÁ³ä›óQÑ3gÁýŒá±®0BÆJðoµ¸'c>à†|(† U°Gr‘ÆLJj(t3BDµ—›ó¡7YeE¬h bhÃ9@’2½ÙHºR#ñ¡,ÀŒø!|]&ŸÒ¿€¡·èÛlðúýþV:&m¤å€J¬NjÙ²±Õ•ÇM·ç:Lµ¶ÔF×ù®=r¨õ–cOü|4 =‚æªÊaÝ’³‚þТ»‡»+Ín2¯›>çä꾨S60¨Q9y†Á `±F-k2ˆÄ'Í(£$#&³îCê¶ ŸvšÐq–´hl¹=Q% 5ÎÂÅõ±ò%&)Þ“¡þ?¥ V1†` _µÆYKßÃdæ{«_å´Ìƒ5UÕ_€§ZÞrGÚwÄMÒä‡ÇUã“á—eš¢‚ú¸‡ASÆiFÕ©q™x©¥/^nMovž97«ÊV¶ä²H…)ÕØH”¡MjðŒ´ƒ ™~©¯<1áymb[Éç.,+ñš‰ðÎVåŽSŠJ¤ üêK‹£nžËSW*tÅ ¥¸”ë,ìF °˜Öy×Î… :Šº [+߄뒞٠öŸYy•ï”y9rD(HHDdv´=œÌôhÍûq­9 Å;d­j¹a°`l˜\½öYÙâüë†Sò* ÇNKpßÌö§T‹-‘“ÔÌÌ 3h“x@±t~I•kx1A!B‡U”ºÊI« SJT€B=bl¿š z0‘GÈB ,",@Ä2¬£„d-²œØ˜QÓƒîÍ^Æ–¼È&PñÐÒ ÅB¨gDˆí Ô Ö ª9*šqkaLé¯esë¦Ù6o6÷´]¶D“„¶|5•VÑxÆ×íâS]ð f"„°n Ôµ*ôŽëC÷}ÕlÔ7d‚«è!;ÀƒS­:m„´ú¤öVÏ.Îî}´TE€¤HTÄ©W¢±qˆ@»¹ã(6€êX‡."B H¢$©¡a¤³7lÐÎ|x ½#Š‘ èÝëóó?ýÔàõI_¾þmøû]ý:^ƒ|þç/á»_{ÈÎ~>>ª?mØûþoïüg­žé?~Ž,¶¯÷õŸ5ïçNêææýß—z¹ÃÜmM·34ÚÙæ[‰¡­„Ýòî§‹ŽïYœixË ”‹ô8SöVÙЊ\±ƒ¸¾þB€AÄêYÜï)_-~ú{ósg1݉8éAÉÉä )J†-µ+]²D‘Í´”"05)@€ C¦ R Àµ1ýYB_ TYÚ:›$H À`ºBX!-äCu‘:¸¶n@CöìÍmr_¾m7æN¾ý5OY^”væ÷=Þë›îë Öñ0y”/§“bgG`‰èQU¢D3À¢š§wÞ-€¿€¹N[c·4g‡¯øÈ`Ð]]9-jokÑÁïß•÷OW/|¿ÝöÏ«ùÁœ.cF‚œDó¤–*èä¨ÖìÍù4sQ~òz¿ï»œÈ±¿»ï t$#-qPÇü“?¿ÝÜoûúùg;7÷ºNçU•LS%ŒK&™áâ €*¢ Pj!˯ðcþDlè!Æô,}ì{>ùÞðAG…í­Õ›Æ t _€•PAK°AÑh{²?ÿ»¯ÿÂkÛ³ý‡®½k–ëŠ?b®énùéÊö£íÿwuâr/mk”Yà ­ðZF2h‹TºÒJ"ÒHUQ kwE Õb‹zNà'MâHµT­C½tbL×ÙæÑòR¿ì‚^u„'ha]’ï8 ç¶ùdrº3‚„wë·÷ÂáÅÒ۹ϗsÝwWüàýr=ÄQa¡PÜoƒïØ«Â&·)52¾1´B¢ ,5½½Zìi$ÜÕ[:O&æÉ–ó€ÄŠ~;¥’ž Ý·;ñWþêm/ëü‹*í²,æÞ*H¯t¡ùÁíÏ”5y°áŽéI?¼ †éÖÛuJ¼±âJ~µ§ØXñÎpªjVÑy΃²¹\åÝîm›d''¥M3@$Ô)‡™×l3ŽêÈ xç„ÞŸüKà EQ¸<¥Nëñ…º>SÛC8rOkôÎG¡«fx'¯ï¼4y7nb^yWÂlÕÔwOUÕ9ãm|![#;±B=áû_ðú3ÏAeAeû,1Rëd‰Ñ¥†™Bf ^8=ãó cA?Kt(tœ9Ÿ’®Ii8Y÷µó:rŠ©TšžYÍì›pQãB —¹jOMÆE‰á¦ÕáI R§*U#ëÀæ_`ªB¹5eNé$ž™ITŒ=/2QùFºÄ4›Ò”ŒÊ>ÞS9 ¸çƒ!L¿ Š7Õu[N£¬6+ó´ÀÆkí¨Uìgiê…ù…:_ôÊöïî~ý‘Ì—îb)èg®ÅŸQBAà$KÅa0”Chyܶ¹ 詆Ê 1…{œ‡V…=¤]½á•ÍcƒÄvkkOÃû-“7a¢=„AxQÓp¡kš[wx ‘߆Y\W—9z;È ~RÃaI¡.I° ¿qþ(¸n§ÀˆK|£fEçÕ?Öo‘Tü?>¹Ï:ÒUÎm.x÷÷¾Žè¸Kú1Žg#}^@óyKæPÅ*´¢Wg ÉIw–Ò„ ÝvÁòTЈÏÓ&HGf}—$âS÷M͘'f5¤Ô^í©W¨'0Ä™aÄ]l{~–,68¦ƒS†CS1NYðŒã€aNµ*r¡lè«ï·í{ô“áò"{Ï*`šX^8q*ýâT¬ :ÖÛGE“ÇW ^ö>¿ßàñÜÀT.÷ˆà\){ë½}¿~,6+d#ˆj: ˜Ê¼‡‚¨R UˆÝÁÚ=Ÿ²Y‹tÌÎ5¬·ûùªÛÕ, ìnxVŘ6¨'!áÚ[ ¶¥‚±øzLK/ÆcÍÞ=íT÷?ø€4[¶÷¬îj½°cÝ«5Úç±€Pq* OŒêô-57 I ÑzVA×éÒË…Bê¯ßoíO;)Û)p*É) ¹ßm@…% IÃIòJPPíIs3rH®RoD“­Å­:©‰½.aÝòù+{$åP‡ýxˆâý‚$Y jºÑÑ1–‹cï`¤5Wo®…oäZ¢ó›ô˜qüÜ1EàÛo¿yOýé‹Îî¿€>]òœ{ÔÙ¨uD>8_ß¿ÅYìBiC[~ë 0ÐT-Än ‰UuŒä›•ò`Ó¦5©ö¢»Yc Cà¸vªÙØLŽ˜akš]e(Æ™AÖª»ånq­ß‚‰jº?öåïýʧÈwð1 •ôÇVD ɱoϯ)te%ÿãOíüZ QÞØýö‡ª¬Ê<ÔJÀþ„x_§ËyñüeåScà ×pi¥½žžNº±½Û»¿§&¶ÎÓ4¥§kCŽþ%*ÚŒ¦þãy„O̦y.wÒ3Af;} ª—\ zZðJˆº•[xü–èK;£^íúîø4Ž•&7IRÀÇÔzoéÆR¨/Ï&µ1 I8$%Ãp›vˆV-`´õÕ]3aî  y¸jÐa[š‹éOl¢¯X®dÊ¥LÔrÖSañ; :¼¦Àf´ }X}ïë×FlUMÜì횬}ÅN͸!T8Ö™ÕÉÄP1:¿çÙgŒ‹ß›äkFÒ È[®•ò÷k±ã@I©KÑ6 ›Xm@ƒ¦0‚(h˜6`tIö6´ lW«4ÚHÓ] ß¹·*Ö¯Á^U®ãy<1š*xÄBrr“DS¾aûY¦ëʉ…I/]—4ñI´ðŽìÓûרzçô¿lŒíújùñv65Oš²»aÄ- ¡2Fß²Ã%¯è懣³n²®¹[~s<Ÿß®é8OøY†ÿÎsHzýrœ_‰vBNlÛDK)ÔµÊÆcèÚ1¼S ‰LÇ ̉¸ðpØCvy` †–KE" qÛ‚E¤Q]Ò¡$0n (¡[d‹±½ôh·ê£ÍdÇÎ笑/£Ô™®oŸ úÛkQ6/ÎP¶!(¾§ðÐú@ñT±ta(bYÂŽ€M[ÐÇØt@¿¸<šÐ-\û€)üÅÒªùÒ*'_¨ËX3i‘¥â$cò 6¢T¤L´©M©ˆ[<7†]â7$‚ñ„ÐÐ!´ ŒI ˜ð |LG\؈‘IBÑUwñ·Ðk§¯¯lÇÑev]†H—˜ëã,ª6 Ö¤z%„%wÙ ±Ë&_÷ígº¿¶§{“hþ­z°“7§U³†Â€0RRÔ™œ!;-99Š’(~“ÈÅ/øCE÷ߣ¥ÈÒä`Rin‹ÐÛQ#ä©éh¥Ø GŪU$%æUÛ/¯ HbRy/ž+ £l— ¸ÎCÙK©«ºZ;öù<F”;2«¾°ÚÙnG³&°Úy”x±©sMZ¢Žº€°É–âMÚÙn«ÎÿÀëÚûàçÎïL¸q+z8+Xršvº¾ÑuË©Ú3wtœ'´²îÿÇR¹ªj†¨`óYSE¤)&¬\Eì<¯g2¼8.$:ÚV¶6Ýh8:Ž·µó5b“RX¦¥Þ¬ÙEæK Kós1µû—ÅÍ¿¢3Ç+8ÂQÐGä-õ¿B7|þüõïG¹÷¿üõcóÇi_ë÷/]¸ÇÿôøÆÿýëú§Í÷uûÃn*2§D;Ü£PëÑãÑá~$Ö§y”p]ýþPÈ:ªzuÆÔ:K:p$²a“ý˜6µˆŽâò‚Âï¢Ãz:Ÿ.8or{Œ²ûÊÝËÍAÕO ^ƒo3—×:sã™´Àê]G¶êÙÒh1®6k¶´3ÖáO¤¾½¨¿ÝÏÝö5Vöñc~ÌŽØNj7ˆ|ÀÎIépïcî?¡Ÿ½?ßö?ûpvoî憷=5{bÌ1dCFI4=”RSQD„*ò?€ÿæFKŒPi@b¶†pƒ üe§jàSCQ¿èŸ47;M¾x˨píàP€‚ ÐOÊÙñÿ÷̽û¼žÌPڳ¼E•‹b«­çú‡^»}‹ûžÔi ‘Æ n@Q‘ Ú‚•A†¡ ‚­ ¦WI¤k“²weÔ0£•3w² 7ÄM¶ËtTÙ:&v¡ ÄWûé½ôÄjÀ®çÅ{´Ì8cíÅ s3ógöùj6㓹?&œ/¶÷Ð~²nV 4Ãã ¯]ˆê!@j0†šRÛo-ÔJ@U;õ(.Vž‹§³<²ù’ti‚Q ªMg¡¶uÍzý/Úì<Žé_Ĕָ+QS²"®ÞŒžŠ”Wâi§x»3ù‹æ‹Iíø)ÙNdcìãîºÄç5éˆz6ÕA=+.‡d‰jÙx±¸Œ—½4'JFâå˜o‘bÏKœïŸÙz¢a3t©‘:Õ?ÏгÏ[Œ­&+·îЪz –WfpÆ‹±O<Ç)~û\zþï£þóÜYÍ 7ð,xŒ)bžÐù¥FUÈ»T÷]Ë+òY¯Gyþ•RÿY ïhgüíXP<n"aôç)ÙXs/óy ç[E%W*,ˆPO‡C6‡ ZÌ]fÍ¢³ ð²âÓ´ßùš9šŽ 5åNÝsÀÎÌï/Oì%h7¤$% ³MÀ®*/Èm)õ´T¶§ákÇdγ2$oBk6Îõí² fÌÁ” n‹\QV«Î˜É¹‚é±]¨=óÀþ|K™|Kh‹syÁìò>³Ù§NŸ—ŠI ¨·xÁ•(áh÷hoIÊ+×ùçÅOÁj…Í`B´Áƒ˜”•+UB,‹$‡©s×}#÷;û%»êûâÜ¢ÇôñãÝ5ûÇãÅõ:âÒ¥SyîÓ½‚ü]JMôwኌ! Rl‘„ ›ƒ$´éŽ(Iɬ˜©øTñÎÒ´Éüë\öãñÔn¾øûâ,PEUw5/þóíO€FkŠd ëã†Ô`õŸhP4dô‘ëw'IërðÛå:ÀŸÞØüŒ‰'®pMX†€3§µÆ¨|AÑmùÞ»çÿ'ã´æzi}ÖUVí©­Îj·€t“+ Cb³$Ê»¶ÓˆuÒ¹d`€Á Vu\¡å‚Ôl4#’gsMØ¢nʨá| (‚k@v;á’”Ó–¨ý¡ý~õOoÇþïyåL¯ü§¬\пGxFE"*•gcöÔãü£?¤ßûRZj=>d´ãAÇ=¸‚kÛÚg)BÙ·À·8}ùãvÅÖ~Lɶ6†žìWðmPñvsdg"YkÚ5A} 7=Näí X¤WÄÚ Á{4@Ñ5i0(µ?jr^ÁʼôcÐsÕæ¹¾•’ÂLuèÙ˜¸ÉfÝž&§êÒ9,”ƒ¸Iܦk •T™NZ4  ¡µ6Y­©^Ööi%ÑN÷K/1ç>¬ B#¬¨NØ êôŽ–‡Q–j@ân54,ï¯Åž«üP_CìõÉë…ß^¾uî§¢»s¿°çÁ¼¯NÖF“][ßaâl»ÏnÎ œ³Ç`+‰( ÅÛ»ÍZ qM½éè˜&a=¶J¡ †¢Ý†a6ÀPè{À8âЂ?uòÅ¡i£´©Ü\ä…Î5ó ÓHö%y Úâ kÆŠ'¦fL†l²\µNý„ùÆ™§¾ßH0”ë=IÓâ¯kxÑ{wÆÓßb 6“‚Ûä«éVgÉo/<ýõÊL-gžMT,/œ9ÆY”$“`»!D½Ú‹ƒç8C%Nn&\AlDE‘(á-pÀþC5“D°ALŠhÈuy¦&Ê=-ñŽÖØÂ§ô ÝO$`€@wLÜ ¢ íöˆìhºKž™˜X®Òß qi ªó|vå…§j ul‹¨Ý;1Õ¨…Z,Øu(àçΫcWÅX¢Š]9sAfF°+$ÖÇ´Z"Â<Þ\8go…W ÎzÈ”ŽKe¡xX €ZG$cus­RT,aSYhB‹å;hªp³, <€0Ô&ýâOÓ‘¾.H E£¸ URÝTè\±jèF3uÕ:ûË›žV>jáYI쵑wáOæ¢`ý¨¥9Î/mõ+XÏ­by­ñ#[5A`¥*Ê4ºJÕØQˆÈtªþÍ H¦ (ì÷ø¸´ê1¾ŠÖ'ÔîëÂ!?ø.…ìƒ|@¬aÌ:ED Ž”T ÈŽ²UФêëïLoh™û ×I‘4Ö3UîÉÔ=§±Ž™Ù×äÃmú œGsh—dÓ*J"lUG®^|Rwë†2ó¿uö\-£ˆëÄø÷¬k0U”lûi{LPÍ gpø0p‚¦(øÜVß’Yð§ä×0V „·)Ú‘FFaÜ·:YŠBäKªª¨•W ™‰Žãv~ïʬ•^ͦæÉiäq á÷㛨ãy4ƺÊ"–s¾÷ÎÙÇ;O[õŽqá‚ õ£ýb9Ö<õcµ_˜è³øSþ_Q'™ð³(õãÙƒ,;9ÉãûãŠÏ[©½ù­¶Et°„ôe~Û£ÊÝulaÙ7#¦rlé¡›7ǰ­KK›#{)&ÉÛ•-C¤]±0™ö(s·Ý7ÃÉBH å á§7ꢛˆ2´ˆ ÖÞùê¢æÒýÚZkà4ÚwÅ–$«KuS:;µ™Ç5—ÞT 7ÁÈ{`‘ˆÊ:.{æh0ÿÈòÓù`:HŒi°`©u"ˆt¶Ô«N/ƒ&K*R @}0+þ‡ª[«ívð``%õ"bìÜÀ G€í ,”;Pr¡u¢Zë\¤2 ذZ„¢¨#¯š:öê3¦Pq¬›Qƒæ°â €KžÕ—˜‰ŠÀ¤ø‰ fl¿ì¢;@ R/8"-8}# ¤ZžæQ¿?ëüÝOLðN¾‚Á¬J„(65j*D”—F.xíí QŽÏЉ^Í]KêÅ(‘f%QI(:%hvǽûVµ5écÚ•¯8æHÄ’ϼx««îþ£!¾Ü«ÿ³îrÊúÆýËöU¢Ësü,}ôdÎÞ|¹ñSmõÞÒ¾Ózÿ–]Ÿ·Ûïý“=-ùôZ«éù9A?=‹½‚S0Ùê=(¢ê*üÞÀyÏ/ÐKi7×õAX“Ý—Í@òÆ=Ù×UI”gÚÑY»Ô´f¼ ôûñÌîíÜÈcÉò>ÀŸ4ƒ YÍœ7ßþ¼Ïux?O1s›Z¯#.A’ªìF¤ôz…â.;’Ée BHªAaëq:ñºAUëA*PI À FÊ‚B "TbF%•!Ô ¬áb ¡p¬U€PJãX`­©W-"Æ)›qAZ,NîE‚SœÏŠ%ÊAIÓ¨9%)ÍéP!0Qba,J ¼¢5Í­6â/gú_»ÀyÓgF4вÇ˃yöçˆûxf[Ñ66ðøOdýâ½_3;¼Néóžf3£-¶žo¶Þëã—Îwï~F?Çû/Ó3?õý2 %¡¹<4‹û㺧›ýbˆâ‚Œå çZýÅï+Ýôèùý\¯«…Š\<þÞüñ^Ñ© Ùºµ’…h>X‚–1X«&=À Àq‚1…šK[,;͵Øgv‚ \ˆhFŒ1 ¼Qd*.H  ,&Tò‚ mŸíç~}ä—7¨_ð–=Ðk|«¿"Þº½úÙÒb  ¶Ñ A$5 ¢ŒR¢5R+ RwÌ7å8QŸÐØUœ¢~cj,•W«z³bÇæK)ÓÍH|âõfß¿ß?­°– »rÏùÚ‹çaÕgÈ£2ë}’{‘ãšcøhK$Ì:iVÞV>ÉCØäÀÂÊDOaññq ^3W¶©»K`Vg[Ìáçþ8ž·p=¾>àwãØø$¦`„$1˜po<SA’U,±ï+œ·ë>Ôù,´ƒ¶'m–CM2Gaè?Bp(^#qUõƈ¸,ê&ï ´™Mï‘E%„¹¯Í^ZÒÏPņÉçqÚŸ_ëï·ô_j[½õÏ:—Ö›;š)§ˆ<-C? 'Ä)… c°ÁÙco5×S¨½ÀqÅmŒ SRÇÌæ¼§”Æ@B…*Yq1èÏóË @€ R À ”*Õ©’mÇDÞvŠÕaO6aœ8uð·Å©ºr×gßyn¿ðLe+3ÊÅ×—x9]—©ŒAΨ^Ræ`(ªÍ4uSŠTz†»ì=åR¤Á€ceP>ËÓ©¸ðàP½>ƒ’Ç><ñÆA7–>yä5›7—:fÄR-rØ1»µcd–ßLæñÚ왾µÃÄ%¹; käl¨û\ÿ˜Â=7ǯšçñµ¥4`¢È·W÷î¦P–îK!ôôËš«î×ãí¹@ø½ðŽ¡f’)Pz*s¡ ;³jô–îcÁ˲Ô{iz‰Ðî8“,* #ÂÑ9¼" íóçm6?Q~" ׌删âr£õº(ÅÎŒD!ã™õ‘VÆ­Š!‚‚uÍš‚ q2" P‰ø*ÕJH·X¢é4œÖ­ÃÐBA?¯Ä@Ø8(§½ö.\ š÷ÜsŒq­ÛêtðíáP%|ÁÀÔšXÐLyPòiö“³&‰ ‘-P!‘¤æx)_±œû_è~¡ºUš×b͘’J–’Ìd%NF€‹Âg$?> 9$)\ustw Ö'N:|‘a¯} z«/!ÒKíå߯n‡<ðÖ—Šë=ë%±XqV¹´bµàã´žÙ÷©Î¶}`HbM&¹h!\gÄ ÓUñ)ûPµp.E8>Ölá“ò/'ÿJÇ™Ïì×çúIO݉:‘,툇fœÛ¯tªO^', Ô,Fð Òè©;&­vdã#ORRÖøhv^Ž}ÎHÑî,͆Ç\ik…f”& + Õ5<=$d‘àTOdOÎâÍç†ù:†®ÒˆŽ§ü™–޹vÜÛ{ÚÀY«tF*'¤%–ò¼ïÏ»^-›îôhçÏ5óýpQ{ß>ØMļk»Ÿ(£ðz'ô7jjЗÍ3_•NH|œÚÙà5 „ŸvLç¿ûû™éúŸKøÐÿ×v®¸=¥{ùvVúgÿlïÂo[jnÓmûÃÁ±iÏìMC&Ä ­cªâÜïÕrömp™ÅEm.Ú#¾¼ñÓGºõâ -´¶pWev¹?œ'j•q”dÑû‚sAgÖÕNxX &!Ð)h ÀlÿZ£ÏëIní3±2vMñ-äT”> ôDtUòÎQSÅñšB ´1;h› =]-Dh Ã0!·Í1`Б–XYÏÒ·<)ȵÃ0ÇTÕ>hˆº]¹ëíR÷2ŸN ¢i-³ßËâîw2س 8«¾<ëxªÝÀ*°–û1¾s+§ª]Çóîÿå3¿½Ž<±ÿ³šz¸rïfµ\lÝ)pˆ€ ¾û•vJÀæA¯3w‹:sñ‚aY¢K¸’KºAK2 å¶A´“j¤9 k‹ _¾Ò;X ’½jÃØAÖdÃ…Aè ÁÐéðc9v¨R„>Ín¿úp§–œmáïm—©’@ð¡åÖÔÁN`÷á¶¼ŒMâ÷³#=nŸGŽ8Z9ûÖS°““‹/\SG– èÒÂɵ‡ŒO#»5±Ê£ì,ôhåÁ:Œ}œË§½ÖfôÁxÙ8ã^„›h»‹ö”;!ÁD„ˆ-ÐÈ#1OrB²÷³»c Ëÿ–`gÙm(šS;% ¥A a»ªð?Þï’1ÞÈ«G«f QÔœñl0Hi¿7:ÇQ¶Û}¥É—ØdeÖ§ÒȹÞ|ü½Æ+øž ƒíØÕATRj=íqž—„À3ZãÞ°exUI¨‚$®ë2õ´þecXŠÉ 4ÈZTdt$ W &ƒút)‘-h‚-ÝÄ[ÊoÁm&ú%ªU¿Ñ ®!€ ³$tÃê#’šFã±c}#uUŸËæäRTå ïož^ýуh„ã$²Z¿ªnXÇ®¥ëΫs2£ŠiÎ –©M&îžÙsÙî×D B×™ìzóõs׿¥_îþ:û¯ {¬~ÀÜ(¼Ì¨aD<™[â‹8¦¿ÜýXO`B ÝŒ[±¹@r=k¡ ê„ ‰ SÚ³gb2)›»”SŸWÕ㥳ñþö õ*.=fÚlZ9œaé‚ÝÌìˆâ+ŠÎÙ¿¡ƒQí=›ÑìÁð$©…L›öò#zcÂVDQmI¦5ăýé´NDÀCaK(¨_Q|𱕻fÍ™:¬¥r2°£ÅáŠàºÞ{íï%4ÊŠ|;-¤vZ1Yë#ÿîßùz¿G·#ÁÊžÄ_úA9+šÅ0¿Õ©k |Ëêb b/½á¶—¥ý°ŽÐÉK#+î¹ØVÒ¤N|Tâc6B†04k‚EÞ–xâîFB‚ Ç„x3[”-SKØ‹ÿŽžÌJ|K™S¡j«A3èÌw1§æyZíÑÓs´ ]¼z*+ @ÌÑr¤Ô‘—fBÝ[ˆ¸Ù2A¦dçД×Þßšs‚óe¦‹s¥‰™t;©ÈD‰–[ª(•*1hXÀe¼¦ª×DMcÚÈÍ-®À‚¨ q—ëî~/Ö§$!pΚ‹î&6 œèN)!3ü1Ò6‹IdÃ¥;à¢Ð¸ÄìíÓßÖT4v2(Ž@ЖE˜`€T‚‚:5aõ:›i»ìk|%)¼¾1A"“O`{Ð "Ñ7è„{À¤0³@Ƙ6ÍÐ,&@gÏšj mdŽtñ" ú¨³H ؋ӷ£ÕTaiõénd‡«M¤2+‡­º¢…N§Ð Ùø Þõc›ãtu®œ?ï-9Fð½<“é¿×yµ¹³yÔs©Ê‚ð‰ÕÀg2bî×7zê0Ä6µ°X½(/4ÀE2£b Ça(ÍÏìü~üjqoŽ ~çÑ&k Ä Pãk*óü²tWÀsÌs?Ïm>”CVË:Û AFF>j»]¹‰¨æ3&a…Ôd-]3%Ãwíë—W e!XðBl4‚(H œ EÆÒtkžÑ~V÷Èl\Å¢L0¢ÈÐÁ01h 4Æ0AŒ„0…+@ ½Ý%i-*@•IòÉè ª X E(`XRî*Oñ:®[>žîÇ)Rñú×íPtmV`e:q>öX722U½à}aÄÝ¿¥ïo°¿y§«ôeiéMæ§3à‚N/oÿέî]çó9½¯¯Æn¯k¾~o¯w¿_7WßfÆñþÜh_ïÞÏ™³Ü ÀÄKƒŽ&ÖuguÒÖß[nW½opï¼ûö»¬ûXÒÆ ˆ0W©§0u¶t]l³1ˆ¦2€1Š8[cDϾÞýåûJd ÍŽ5ÝÏ/ÕÜݾ¹çßóý•ØÉ˜H þ:*@Ù™þÂùÁÛ… F¹ÛÏnóÏOÿ8Ϩ?ò:ëÒ¯dQY¢Ö¦‘ 3HkˆA1ppm”FPÃØD¸€H#d‹Ä/¸á@0Jt ‡¸ÊÅû= @ßø©ËZÓZKU±óó|«ÿZï?›­dck ¯ÈÈ·ñ’ô|òŠC8¦_ãªïÜc$óÃde&?)žÓ¬w¨†Ï Ž°$δ,D„#»Ú“•x2¬™B%R»QWe§HK·Ñüá¤-+ß6‚Ž¿D Ií‘…À<ÄØŽ`šQƵð‡’?Ö¸é!Å5)R(—ìéñõ5^üÃâ|>|ñ®ãGzEóó6Ih÷š­ú5yŸ–»”ŽëZkð¶øÌÇ~:îïD?õ§-îáãŸkó=·K‹V@Б7çÃy4óéT Ú£ÿËËÕüâÙºñ\“T2]{Ÿæ;ùOÚé_¿I_¿íþÓù᯻õþÝÇÝN»»\5Öåm¿y9“?|”¸ks¦fäÇñWÁŽ2s“ãÙ®#1NÙ‰Í{‹õU©ËÁI¿ )F€C¡!ãH0QК©F´ÈXТ\2w1Û㩞99CVàEsJOúWdQ!áä˜ZÅ¥Ñtò€>=T‹žª2²¼È $¤`îèŠQh1y¶KÕõ(žO›ÎÙ˜sâ9NªZëËs—R†–c笄ÒNgg—hyèå0ÂP_ÀŸŽæ7y}žõíü{Ѝ½¶ô'»ÝWþr%ÌOøÞbˆW ¡;æ%ÊFˆÛá‘ÚìÀ#&óq‚olÜy‡Üö¨q°n·Óž73Ë-œ’}β§Ø`ý®÷£ËŠ^ © @'fØã»ÝÇØÐÚ•Þ5(Ô ý<ñÀh%Ï×ÛÙö(ç6c\£SÓ!¢Ë¤HÅ´¹ K¤ÉÁ0 !&‚$ P€!XÉÁœ #;“Ïô`ì-z‡t0åNW¢e4, 6ƒ¤høóÞ#B@ƒ’J&‚ÏB¥Zi3“Ǩ‡C¦¤€Š½Nåc>[ÿ–®ßîf“KÃÇ¶× ä¨ÊÃGÌÇC}7›mƒŒÔƒwƒÓ“„,ZV IJ6Ès 3ÔPa“%ÝàQài«¼òK3†#°tþ›=•Á­„¾›œ‹³¾[×…oPÂò&à ƒ‹z­¯ø—‚h¹W±>[§ t5;a =½_ÖÃã £«Šr{¯èß~K_>ãstoWï¥Àqø¤òË‚ß:2ûÝ‘˜öz§oCo±³ÀžS¼ òèЃÅÙWié{Q¯á©8DMjNïÊÍ¥]ó`ײCÙ=_¯LwúiBWïv|Ø~|89øNÝ+ ˈFXaë´,ØÀòëÙ•:ÕJ ˜%p!µT^¤–b.qy%MˆÊ +.b±nÖ ¡§—„¦áj›î¾™¼R À6RAÇ “éë1v(Z‹.UÇû .!Kœ³·Q²2‰ËÙ…ÛcéV?èmÁî hB[ˆ¡°ìGQÊ7!h Æ»Û~äëS3ß캂m;àœ5­xFiž—‘·q}=&–•®>=bq_¼î)BT¹ÚH¶„ǵO®^ºõ†h‘p]¡ë§‰+Ìo›«³Ù‘lUÚÓ:îéÊ­‹^#ê¬hêû³œãË2Cdo>¯* z;y÷|¯A¥ 2ð)}ö½JÝ”Þl#4@K-"-†û”r§öA=šRŠÕ)e4¨  «²óÔ¼gIƒð饇À”–h |cçµ*.¦)0¶cú}ó¾or’ŸuBk°*jj ìÁ4ƒãB8}ŸÃ*âïi˜¢X¦5+<~U[A7áNŸsDkÐäªwϺ/Ìö¶qy07„EÂ!`9—°B£¬†Óè&ç‡0ëwÿìúxéýî®ß€“Tb.˜!+p”Õv‡ÜÛàŸ/~4ìúÏ[ܨh†?=\¯‰üþé<۽ścT_z ì¿í¾M¬0Duc×YÝC¦åµc]äÒSö£Œ)o@z6Â6Ï¥¶ ´ <á<¼¥×ðRÞFdjêóJømóÓøF‰Ï@¸€>‡ 1¾¼¢•veÓ3˜BÓ]°,ä êðÃï ¢ä'@ŠÔ2MÐn‘=X8@b>!ƒäÖEØLŽnÓXvÑ:Ù±‹+Ï+™ÞŽžŠØ-÷ïÍn×È}àýN¬÷ôjý}3‘v{?ÑÑn¶·Gsu®s¤ñ26Ÿ…Ÿ¸ö<–kðZìý¾zÂ¥ö6U[äk@Ì•|6¿láç|m†M§E›6Ûf{‚ÁvĬ€¸ƒpÏéÊVj‰ÁÖÐDv†rå¢+›m¥/vªJk¤£tž[±Ò-®®S„­Ó|É¢àØÝÍÃCåU- ÎÉ‘!ké›–,î}éL¼+°!TßÑæsZ®äœ0•‡O‡ ^GXŽv hºŒY›¯w€2s©J[é‘$½,u+c37ÉÀrƒ J¡ ¼£;Ý1ÃH˜ [`Ã$ÜMD $@(‚’ €”B ÔRÛcÑ}•¿ÿ†yÀÿlÃl€~ A3Nð[68X#Ö}œ›ðÇëYT>u@LôwÈõ°ØWpa} eO×ÄÏ$VZ ^Owñ p ÇM.~/h„° D@›ª‹Ï³Šv—/< –$>.DA Z]BÂÃBn …8kbih& ¨PÄ.H, † -êlH5&ü\aÃrAÔHCª"¨ ¹ò–ñH„ ã¬- zpÖ 8oo4Ó™k©ëô'!A†l„ã¯<ÝkµÉéÕî8“=ÓYdL€’=žè—6ÑÒ݋ը¢5„$#®ã3æÛ/B/o³‰8좧¥Â à%YÁI%Â$óüÓ[°…À…Zl©M¤‘¨*ZgÚ•º‘¼ *‚¦äI¦ág)ŸKn‡¯¢û(nMçŒ_·ž»úÄ÷¬Cñ\Vv*ǺëUdþ¶ãf½NOÌÀœOÈyó}MRê\”ä'ÚFÎ_ƒsþ̦‘óê~·ºº¢E¶{Øœ‘S½ÙJ7E´-kÞG‚æ¨xïTLÒ×"Ϊ&UÃéÊ¿3^¿œÐ‹µ„²3El”ƨ[~ÅïëñåË_ýù§ëÑ|]Ú»ÑSÉùsoNëHÈñm*¬œßci‡‘Øy†„c÷9û øTÂõö–‰˜‚2¹0í2èX;‘cø²Ÿ wñç/Pý@ )îYÖ¿Êû5–C­xæýÚù@àT»}z··¡Þô³%Ž~Áïüó¤~‰ø‹š螎úËÏy} µíÕ‹‹'ç2Κt ¡“Ë·‚TªòFñ 0 I¸€‹ð”•µûFºxqµ(âUóÕƒmšø}ùÚßeoÑ@KÌ k²¦†#!ÛÒ€e¹v«ºz×ÌÅü¦‹¡ÝÑJ.À$ëi¶™D¥Ý%§ŒqAœŠÑê±Á‡0*û‘4gÕ˜ ¡Æ#5B¹ô\–2”Á3S©9#myà‚éøCœ`ÇPF"ÝI£vD"•HàuÂRÿQ1œ §•ö`åJc‹¦”HåÀ—xC²ëÙâ†Z!¯Ð˜t_ð ª#¶>ó>pýC‘8oæbm“N'\mæ@kdÀÕÛEØ&è¼HâpœÈÐæIó^Ó˜}s·$ÖÉ6t z"™ &ŽHpVu†,Pœ± „¶2jO‘õ€QmCY'n-ú4üî²g Å:‘â[q%Ô=ïãÇÏ~–½‡2þ™äóÞl ìîšmjñ6lŸ÷yô“[?åžÔWãÇÇÇ;Åžzºãö{ÿšÉYÓ\ÉóùÜ›÷:ÈuÐâ´y¯ùjúZo©tµPi5rfÖÛͼçO¬/0â·š‹¦WTÒÎÉ™QªÔ²>娕 üSíX²‘çɉ‘¦ÙŸ:AÛ„G—@)#¡öÙ_;Ös>ÒQ‘\ëî¶l"5@JV23€°í¾û¹õÍ”i95ÈhÄ*i•ªn˜o#‹»ÊÎuŸ™É\¤„\£‚”¢WvjÈ„*¦5‹cÒª0‚F‹"€ Ä0¡ÇTkS‹À1BÈÑH !4š™æA@ŒsKÔCjSÖE³ E32r1 ©* PÙŠ'a €^Íb„´y­ÙPÅìSÜ_÷ÜÞÕíî³5&âJ]mú.å,¸Ñ-ëŒ1ȼxÿöI_?Ç]À‡ûü6îo÷êhI ´|"_ùç÷£¿ü1#ãe¯ÃÒdÊiŒ:„˜Guè¢5˜/Õ¦¶í/™u…=~>ž|¾Y™AÈ´¦‘VTÛ‘Ö¼T‡¶P‹ #ªEc:¸}æÂ:,q {íb®´Ã5öe¶ç?ã÷KþO_âïîíç¥÷—ï/ï|ÿS¹;Ö,Õ(ñ_çk‘|¾ü×òÿ|ïõw¯¢^¯âs~áó»{½ÿßüYß²®db³2È ¤Öš €1&­ D4°6ƒA:…R)-¨–zB<#¨­]d¤Q6è2dÓØ7€O懸(Õƒ«®¿ÿø«Ó£#UÄ!Ú³O޲hnêüù»õ­óIƒÆ5:4ÍÀdF&ù§óor›yè·aWNkP-CŒ WÜ•‹T±’Ô£YSÓ‹…÷ãƒôQÚàã`çyÅç©GÛÄÕøª¸\ÌA!ªò˜RT…ê´ãt7å~î{<±ýÙ<‚‹ši9o÷ôOÑØì'óVqªTø ec2+#£¸anr({“Á:C·*LüÜý×]aûž¼‘LιíMe›gqŠ?r’“VCS¨ ´9‚Uß·ŸÁn®ãb¾èIPõVì§)ÐlËgË?ü­ÕÛö›‡ëšÂÀÝz˼¯|úZúˆÅ‡× tu»§{¼´ˆ­èñõTspDRœôÏ\õä éæ²Íb¨9Ê\õ/„a•ª\ŒEGrÂì (B®¸J Ô_4m(9cyΗ¾š¹4Ú2‹HhÓL*ø÷,‘<{èË‹—Èl¦V$ë$äm&Tº™›Æ+ÿ=îmL±PØû${½³_QÂÞ:Fñª¯ð0 R…»Ø||e¾'p<Ÿ2)ûËbo¿¾ÎÃénUŒ#B†ƒ±ñZò÷°2=âŠ[øjÐÐ1½“ocmºË¾«‰ö6û°©€ÞÞcg¯·ûú8GiSëh™îLr\äöÅœßÚƒ§l’<4'í…EÆ(ÊÊjµj­ÙøÝWv†ñùÉ#{~˜£q¼»?_ÃÒaïqŸ'òÇ?ûÏ/Ÿ ! ¢¤0yl¸×¹3j´'ÙÌš²©šŒ-äló¥î?kûÊØ÷±×cû\æÜnwÒªªäÄV_»âŸ1Iw¡C,k:$„@IÐÀ ,TüiÇDŠÐb•H™–¬€%g”rûùe¡?I:NRv~™îm²>Ñãg>_´¦![f˜ [“×ìM[/œ$4,t…£0Ò Âl«±öâ«õá =öÒG £¼STÀ¡—K‚ ö.p ™—¿¿lö5=v/FñÝùñWý«Rß4 2B Ð˜Æ€í×x?D9/ „."ÒÅuY“Þ}¹ë);¡¬è—çsbÁܧ¿àžÑÈEWÉh(&Gc]Þ7IÀwßí 5ÄÚØ­[‚WU%CGÈ‹©Ø†‹¸×ªkà:Â`9Ê×£B•» l\Ô%šóx.ïÅ2d€lÚž3é)ÔïnB…›HÍWwT2 Î0û–8¾ž1:cAwë¬ÞFWoôrÊÖ³fþÞ¹O?* v¼ÛdÞçï67]ÇEPtj•ZtkÍ£|ä ¦ L6ÇiŒ'øå÷Kï[Sœj'ðṏ¢Ü7²&Ξ=‹¬Uf9šòn) éÕ‹ ✩/ÑÃG»´?RŒù½  é{VŽÃáí}B9{­”}<írï`íýFt““\å;¶f ¢³UC¼Ë=œ:‚T€Þ º #z¦“ƒÉ«°W¬ÿì4õ‘ì©Ì]3i7›Gi)C2åô±1ãìÈ1óòŸ^¶öù[_"ÔÃP[dލé¹'/êlLÏpPîL²($¾Œ–ý™8HLNá…¸¤Ž˜!­(ÁßPËöyÆ=†á5Û`Þ€Þ(`ƒ„ÍÙÒ}½™/a¦ÌæVhSbû'ã‰ÀY_!¶ž±Ò^”7Ÿigx*Ev&cÈÆŠTb5£\˜é¨)GbÕ„oÅ“¿ ’Œ§>üäê”Hye¼N _$öö¤^°l¦Ü“œ¾»Vµ†Èpn®¸sì¥onÉ%„˜X˜£æý„¯õu¶z\y³Ò­TbìÁý×j÷ƒr€`ïß= ¶º%u«^oŸÀ\{„¥rXJãz@:MÈ”@¢Ì@B 0`!5@¤–²o7ï FáIÈ_ÚiÝ"¯®ë`GZæUQpgØ7•ÕHÂo4¾p×ÇkÒ[­Î¡w¦þð£¯ûFÍŒ7’b^0 s ÈðÍhû±k­Õ\âÊ_Ïg¿ÚÛÊZ¶ÑõÑV8¹ еÁ$Û+ÝëXb'þ21xãj‚D•Ö ò¥õ!ž¯š¯=¯ñÜœèD:|IlÅDNz!±ÂJFX†þiÆžðÔõËr~áwt…1 âí³B¸– {Tuu_1%^·þºŠÎû—gýëÕëçó;;€ZʘN쯣_Q·U/ã¬X! Qåú•êhü°TtÈPrºüÄ|K~-¦ÓjI6æh.PjÍ‚[ÁÜ! ¨[5ðŠnØ„Š£)´`*í˜Ò/Ñào`Ç €Ââ¾ P€LË\"‘Šlðײd "8ÎGÝø=ò´úaysB|ót÷©ž2S”nŽvØÏ÷¤Z­Õ§YË[¦"ó²_oÆ¢DÀÅØ‚Ö£õn¹¬ÇR懦üì²éŵtR[˜vš"œJ–06['L4©ÔRÕ° “WnÓC •e{É[Ï’1ŒAdE= @|F‹Â"ãm+Ý„f¼Ö9ç'Ã!”"Ž™DM6 !§ìW»?0ºã¾çÏç’GòúÕý5›×s¬ùŒ;Õ·Xjˆm«Â¼BÅ›ú‡.ý§}<‹>Z²Y=û+ÝJ/º6!†l6uUEW!<5ÍÙ-Á ô¶T)§#-,pcÏÍ£­¤xm‹CT©ˆ:dŒ’ 1 jÇÇï—¬®×g±:(MÕâ q¯ˆ©DÈóKÉR޶Ë"YÒvi»»¡¨£¨üX¦!7>ç9§Vqž7_ÛîàGŽË¬\†å{x3]rŽïŸÊëÕ³eÔ5ExZL#æ5ž.É=þ6UTú¸ï?þ\žØ¬ Q6“’Yh ½M©ÖNf)´ÜL °âfžS‘˜ˆJ‡ÀE‡©FšÊ›d2TCK.¤b í'‘ã—E/ŽãÊʾ[ñö¡ €0-;ḭ̂ë=BÀ_ƒQÍA¤Áh‰P•9±´­5¨{`¾ØX ¹ÖlÖñÃ:¬0ÓÐ[ÀÏBM«éÆrÕï ‹\Gš3ê,,²N`¡(¥NöqI¢Á2Hp4ÝZ0i,6ãL®Ã_¤þ*Zp§ö9–eÞæ ¬:SoÔrƒlB:Ùa=Îq§f&yƒ a]÷„Î'm7*E„‘b°;ƒšä÷ïž.Ç,ƒKe§0›Õ¢éY“5 •+£ø>Ö&Œ´C놞HF)@ö¥/6og6ÉÌ»žUë¡VPçº|Çi Ö¢-)´€ˆÀ"éNùø=©©`!è5•P§!X]  ŠŠc0 ª«‰t›‡œÃP"ý‚ÖZ’ó)!ÞØ¸ŽÜ§ô)]/ª éxø*Øp½©ùC_-xðp\ú¯ëónÝÝ9çøÒæÌÜÈ(Þš1Ò§"µo¡zÜö@ f¢†êÀcN`GI™_$ é=بˆEÎüD÷yZŒ·å_óÒ[4ˆ7€Â£”û­9ÒAê„#ÐÝàeL¦¿ëÄÏ!Ÿ;Ù6J'/Úçg‘Žïò¬Hú¿MÿûÿþÍå=ÏQ.II VÆšgüË¿u÷µFQ]-°¡MIH­ÌëÍ©5X8ÝâC‘‹!æÓ:ZÁJdQ²DIŤ?ò3Ht’¾s0P…N&9_¾eìž,Áª €;ꊴQfl Èy¸… zl˜`z ZQ´jYÄ8&ŽìèN’„LBµh@‘D•ÃóÂN´_”Çdƒ›yÿ2¾Ü¼ê«±/™{Î[WòõÝÎÅ:~!ÿvôŸ˜þ-ã¿1íýš'òsOïs_æóïí ­}z"ï»>,?”Ç$è;<ÏÓ^Ô=Ò#¦‚€zª§ ÞsDFÏj¦¬3„˜àºgÞŠ ÔÔÜæô‹îÚb¥¦%¥ ,ú]iyäéŠWåé Õ„0Wÿ¶³Báô„;Y65…ï@ ùuI_`ÉIµØ¥DÈòÌídê=ÕŸÂ÷¯œ}ŸþwL’«I¾…xÒ%—Ž'ìÑ*©‚ýÝ | ,L/`÷”Fãõäî ×®6/$_P¨ã¬aj3Þ‚2ðQOŒA):#d½øý W¯È'¤è\™“kve<ÀR(|Ãèdùšå:zF‰Z``xñb¯UÝ¢?²€!4ÙYÏÌe̹#«noòÈù¤Op0åx”ÝS&ú<î)•º@9`bŒÈ“|%N"4Kïä1,9p¬£m†"1,281T¬XúæÙz晥ËVyï|—GÛº=·b˜ ’ ith£ í(9.a74ùG/Gõz†$ëðȃÙ?|ó®ÜiNÀ9.†‚úaÀúè‰à}Їâzö&Z¤x9}±ü ]ZÉפÝìV¢|Û­8aº 8⋱‹U10£ý0Œ/ &éœ02 %Z,¯PðÕ 2”‘LD$øâGßÿ‡ îÊ­k½€˜˜Â­¹-`yˆ –OÝ<Ï?ã-}:¿€&Ø¿Ù̘—¾ÈpÑ­°R,þf…œ ’MЖڛÔÓ`«uvÓÛºn¿Š÷o§N¯ÝŽ«QL™µ} pÃ}ùógÕqï6ï´ðå Í×&fHA% @`¢…¥ «„‹ É,9¼gZÀØ»±2¨.Lkçµôý¨SŸÏkÔ»¬¥d›åK˜®>·t ,{ˆÇ°—±B°Šߨ:Ÿ$™šÁ2[ÿâ9Ÿï¾s ©Ñ]ªòCÙŽCãi^;\·ÏÁ-Y ä'”&å$FZ£ˆj@ÔV1wÕóóËÏ3¿œ+¸?ý„KÚ„<Á¤`Œ qMˆ m¤QG}BÈß¡÷¬Æ ¶”¸¶Òíyi¥“ 6:zÇp‘G4Öc¾À/¶ºî<[fÒ.Õœsr“yQ|ê]êKw4#Û€TgW—P µÞv^‡ßëUù“Tm­÷\ò€)Biºr¼DCj]/¶ƒ+wà°õVK½…<+, àâ‹0‚ÁáT5¯ 1B"¤˜"Kÿâfkttµ«æËk –KÌASÿ0}ôÖqØIúúíjLÛ #Õ½=$ÍÅø2Þ\–—q>¾Ž†&Ýó™6ŸM” ¤Ã@ì!ãK³RnoH Ç+GY¸l},¶aÚÆZ2˜„.®Ž W ·“®Šsd ?èùs{Œè¬ã]Àbí°Õ·i"0‡&T)•ßðý…9  %¹i g‡YÏ…Zê^TÙÔÌK„îí×Úç|ŸèOûÓðìhÓkN9‚·ˆJP²`®âq”ÈözNŒuö^ÂOy¦ÑÎÒö@/Eä–úfZܾ渷 6òŒ†@sNl¦YWžæ‰î5ó-Ô¨$‚*±õ´ÖôÀCxºáÀKìC«:bnC ICÄö ›fµžÛ~€Ù|ˆ€1g¼Cè9ƒžï5­äôkÒÐdhírŸËÃdqúœá’[ìÝ{ÁÛ³+T×±ñì¡o ²É¯;Tœ§Cb\xo5/¥”x6Ÿ­ît1ݯ}ݺŸÑþ¦­³%êÒ‘ð¥ö¢–ï|¿ù^´0s ô¥0çºÑHi¦õí”d;ñz vâ¤æY~ËdZQHY1´*âžJJ%é@iq"ÿÊÛ >¦¬±Rf3“N ùrÏýOš, MâH±Ø, Á{  а‚›ªÇ’˜öãéý¾œ¾¯}U¦$uñ|NÉ3úµìQrýñá@upmªZªLw¢-2ÇõÌô-X%‰h5#69å@F`ƒ3lª%C34Ó¡ 'KÒIôÓ?´{Îá#1 ÚéEªþlîÄÈvR»H SØe$¡"`ÌŽ»S;Kï¬É9Àï*ØØN+À+Ø=Ö8ˆ/é@†N“ Ì3ì+ÜKL"ŒR½5óÎe¤Uÿæ»è?[o¤=Xsç³ö®Ž¶XÃÉ,(…{*Q—ÑFæMíÂûšÑ³Ù”,‰$t IÈtÍUƒUÿ—ž‹3­¬Q…¥àñ*¦9.>ïÆÛ»Ïç•αWUï*ìmóÙÍׄ½ˆç&&‡pÑXAžUö|Í3¶þ»ÌŽ|”‹èßøÕ·ýw÷M–@-苨BñœQK9ìƤÏqA=p‘ˆ ¾hæi¹# ³¨±SDT€¢ª.I«µ·à§8íç@üÖ‡"m@ÖjA´ta7.lÓ­ n ”™œ¨Ó&<‡2wæK·ò ¦(‰ =â„òÈ Ú50TX—¨ 0Ø)I6d´Ý7¯ù\›¹i©]ÄÎÉ©;5˜Ü,œGòoô+ÔéO?_r z›½Î¾›÷úÐ>*ñë²ï_&_Š~óAóâ{íýîKì½ïûΜ!°ŒP°ØDì€DÀ× Vª žê@Rléž~¾vñ¹{J+ãP („&)lánaÌŽ“¯®' • Ã6U®‡ouñ†÷Z÷¸åüõÜÖÍîû¹í[ä».^h>¶Û·,P~ë¤~ÎBje¸Ä®ÿxÄýzs÷Dûux¡¢Âç0?obG v†")aX!@W   ÃP0( fƒºöLÖÇŽÝkÙ)¨ѲÁbD×þ<³[Èt³äú‘ô“R‰^ÿs H§ÙÛ?øWþùscéD:M]ÀMH*Î`ªÔÃü„%ˆŒ:ƒÏôN'Èg$©†á"d”ÇÚâ½£ÒM~=F5Ôꘜ3žòè‡zö¬9z¨a]ȺßZf.5ÛUus‹)J+죃„©S§¦"TûO•ª8žç q†x[{Ì(rÅø8† ižo–›Ït?j×g}F½þxßùÁÄ7úíuÛk|¦=·´e:Ï ¹Š ocfó„àRETÖ}Sþ…´âÝh6°=çMÂ#fwv]óÝ×*ÝôKÝâ9ûsfsÝ‘ÿá:LÄQÅÍ3ûAP){å‘墎œà`–È–_ÝÈÅ{Yl¾¬¶AÁš"47FïÙ¸géZû›ý¿y~ó?þinŽe/'­E°§Uw3CH÷´a‚*‘pÜ:S¾L/Û¡¢3•©h+U‰o4ò*²!n:/2–…k8–qh<àr¢}lP䊧‰3È+ÞYî³ÿ¯1LœÜÜEZv¹›íi l)}ÌaûÝñÇÖ®¹ù³™«LÆ!O@§Ý'ð»ÓWO¤GW>– D/JÕß„¾=Sè†å¥Þ$¿’ûþ}úúó³óîÏûÆþ²°ÞªŒ"Çž¿ÖoÎqi×^z/žë73ÿ%g®´@UŠê”1e…»ñ\<Ì—’ ÝGð¿^Ä›Î~i%‹éÚ¬™<ËÏ,°ü2u··¼»‡ ¨”`U M¢tÅŠ`ôÔ?%Ù!‚Û<@+pmAÿ’|¦–ë‰Æ ±M£4ÎT4´‚ÂЦ %ª5þÎù5ïý;âçÓ‘„Q895+ 0•4~ì·Í\RØBt¸Zõb–Ag}%ÐÚÆó­põ¸ —k#tñ)£}®¤ö/ï’ç}¯S£&6w„‰~L ÕWɧœ¾€œM=¼‘µ ½á3ÌÒ;×GåÒ’(1ÖD;;…-È\u?a¼7Л©GãÊèzcˆÂdÕ ¿¸¼K©ÀèØ}°/zÎ^‰ØóìÖr?›“fBÀ´¤OÅÑØãåN»C³àµåˆùæÏcfš=š†]¢<µE}R?1ŒFwå*RýéOØÛ1Ù™èªFüâÏt‚~B¹b¾ìAŠ„aE@hÝÊùÐ,Áf%oc`V¡’‹kÍË“ñÚ¥Yà iµì{:Ž,»°Ëf/êì7bkÙ’ˆË9x”ØS·Ç+ÏpES–Z[Èp¤÷»ÿüÁŽÏë1ö\ŸMgmÍœÏñú™%ôì17NªŒrÔ]²~)ì7PÑÑH®q±ÉÚÙ}L4š áts,óoâïkev·5½‡·s/E<óK—õ´0ù¨pã†&\œ×iôT2O©vƒèËÙ|]Û”â `W !Y ©&€€Â˜xT2!ØÈ2-L1”­=Þwå£õvûGêFíÆÎ«>¯ˆ³iWö3ýç¨þˆÆrdœ­¼rº—®ËÞ p(‡”NW _: VQŠ ¹ºÙ¼ï~˜¹Cýü3³»7yï×zÞ´_Õy•#¤ú¨‘0D¡©Ž=DÃ\µrj„0 µÌ®¾_—½9rK&“ÃY_U;Ìhò~NåcÑC‘V¨€0bFY$qcØšlN+¦*X¶É}+“ÚY2„0QÐ8ØxÁNs;²U'è`Ò È$Ô» kY$7þ-htê¦IÑ!¾gý2`”žr;–F hˆPUÑ^|«™åxèÀ¾Ÿ¾Èñ ¡y ö8D"ŸÍ½m4û °`.øb¹èÕ A þÒg0ÈÞƒ‘=¢§öÔVp«Aô .à ?VPÁ•¹’ôUeå\{ðΫ;ÍM«~ѵh|W_¬ßÌìùºx÷ó$ë¸PÕí ÷à5Mr]žy~ §ïÖ¨³¾=ï¯fÁçvdŠÈäà’˜ÄmÚ…­ßÖ†?gIûY ª™ñv `Ææ¥Ú,~pI­÷‚Ükç™Ô–Z3*Ö÷Ãö3âÕhÐ"j¬¶\9Ýu19aOb*ZZaô,·‡õŒ=Œ 4÷øú8Þæ|½µzÚú;ùœ˜Oh ”ÌÑð4‚ºGý9‰ÆÆ·³ÈðBh0dÃáÓ…}oêñ] Œézu‹…Å­>gÚ2kú€Ú5ÈC|l&Ê “  \àÙ1{±÷1¶•®,ËDC’ ¶4Y;]‹ a~KÅÏÛ ÌžPL’š†xk²k1W}LFÅnOvܧŸ·×#8‰¶¢h† QYCcŸÿÁÆT§eÎÔ]ƒ©̵Kì¥ÆÉb†Bzíu7ªÃ›™¯”›ùD¹5ài@T B „À‰0µ lÁÿ}ñ@$»0"#œK}?ÿd=Û³¯Íi…2ìÃß³ý¢ïŒó"-äJLÍX3ñFúÌûy¬(u ‹‰D¥'Ò¾‘¦Úô,j”ůª¶®^Â[RÁZb H4™êŒ{ºÔqž·Ë˜®ˆ¾³¹õX ¾b÷‰ª’ðnýõº÷eô:ŠZI¥ ©«\"à[Þ=ܸ¦NW_¢Dªšð8¨Ìƒt•¶)š’Ñ-ÙšS8+æKƒ¸[Ýt¨êKUwÆèXí&ñÉ*'UªDÚføj!ÂF”Lð“ovwqVΊ,NŃ'š ¿ÎAéPù”’p°Û;è "å2ZcÄCJM¥É•rEV€]ˆB2Ð(Ø{¨µáåqþ'ŠËžçKßçÛ+1ZÈŠ„¡ éHõ`î‚–…Ÿ›‘‹ÙÂžÄæ±HK†Y¾éýCÛßçî'Ô-mVá×YüuG}¥¬ ßa|§øŠb”—cïë:©,ÀGçÕ¸Qòñ«hTSݺ¦7ñ›°cþQ[E{ñ¶ækaÔ€7¨W·Á^æß4rž&šÞÜ’\×ê×ê(<%ë² AX“¡G¼]âgÁœÛîŸ}ÆW:šogþ\ø©´̲…»ÆoJX »<ÿÕó¸×¯Ü×=î)ÏY“{³\rhoÚj?žs?Ésvz!E >F ¨átÁ…#]ÊVèþ·ªäû5°#ýL·ÎQA!AͤA‡ ™hÓÁnàæ*K°D*¬ˆôàŽh,…#Kyèl÷&EÓDÄæˆÆa±8Õ@¬DÆÒC ÂV  qB×ïœ_ ÑEÿéH¬4Q´f# š@“a:?á–xÅ#Îà UcÉAYH…GÝÞÏÆÝP/™Âܯ¨OÊ—Ùœvé¨-I+¯ÌZUk–…%îO4ħ·»nNšïä g$GqÈZéà´C##î!"aÍ*i !€@H &‚‚¥#9`€K ÔÙ´3]°l\º&WÁzI=3r=¬B½I5D<‹*6Õâ'âläôøâe^²ñÚ·Œ¨J̲Ñç4@)ªÏÉǪ̂IC©aˆ.cG™ÚRØcFíkyí¡ q9ÂDœÒ©w}ÚÑŸ+MkWpßú‡òåª_§W‹…¼­ü|ê©íƱËeoŠ'n]ö5h«Qt¶_R fˆ^°–€mQ òÎáHâ@ì$îW¨ð\0*ÇNËv<›+xXö9¼…C@HÞ›C" À¬×”-×=@â¯,çµ¹ªY$ª)k*™<öñ…‰sð@ßä\¢¥˜¯ÛóKVÍô_ýZ×/þ˜OI/øÚãã-Ý´Íõ{5†¡E€$PºïÄlIM+÷'(èL,Þ—±R03 4Sl dŠ‘c®èçìqô²gLãÔ tæÛ‚Zv z@n Ìy ðèÆT“Xh,€ zÑn%^9º¨ ÂêG5÷Íñ[~êõŸbk‹+–¹Mq¶éÕ!"pÒÉÎ×F÷¾wO­Í­î@Lšáî{=ß×ÖBîÜ Mz´2Ê+X[þh ÊýYu’`Sa´¥zØ6˜BÀLm'î‹ísge¼¦ëñ‡Vl†+çS£,Åš£T>à±Óʳ’ºŽ¹P¯(j™¤ÜXÑl™"c…Y(ØZ²¦ ZUYFÃÀã~INý”èxGM F[Ô+&Å„q1Ø"ßppˆ.%×’¬|G3uw, NÐÞž&t™#z„“š‘¨ª„ÂØŒÃci#9JÊàûve§Ž™¸Zª1T:´¨JÛh;4þ?vð¼¨HY*x®°N^+ßNÍÃ8}v¶&­o8´¨Úª¶:žª­HJzîú¡{ìÙ½š`t.$ìVη& èÍÍ“÷ dã@“}-rlmãÉí§¥t1ÿ,q}B J¡GGF(doŠS@SaH¶S' ;¡O;±ÜQ`>ÃzŠÊWç×GH;zƒEÓL{v%éýhV‡[]ƒ#¸Ú@t#‚üq™¨H>@à™^$“à¬qŽª«•/öT‡rŽüÖwxàç7:êò¿fä#³c˜MÎ&š&ž;è÷]\./^CÝ Ëɬ¶`½ŽÝ± ¹ id&§= %ü³ oøªíy¨2‚ÁK;jª´kGËÌŒ­£So¨ŸòÚçJ§bDzGÊïÁ§Ô€"D¡u1y¤.š‰4‘Š|ö‚ ˆ¢›·ÃÕsä?³š 8Q¤H —„.>•x›¨Ø:û<›çlÙj`,9#ºWæPnò¨ºGõÚzJ8DõÜQߨñõBã°Ž¶ÛåçþìâØþ•qÎ`aòÕù}¢ûè–%ˆ(„Jú$‘Û–®Êò˜01Jiññ+€–¤P¨C¹,f—^èþªÊÛz¬gUÉÚ [ø›ÉËõõü¯÷ðŸrujúßȱóÖk«Y³Þ_)?^“W3€cÜeY)+Äa3[I”ìào­~‡ÏÓWÖmW^wMV9L«í@âaµuržó>Ú O’ØóþÂ};†qÛ%ŸUñBžøzg-Ÿ÷dN—×ø¾#s—/ÿˆ'ä±òþ-g”úàJP@aVdPÚCƒLZ}¾tû>þ¹Ïg£†@LN—Ãuí§¦¹®žU!Bô¤þÜ*iYàDÜUöô‹Þ}yço®'ÿÖLeó§ É1ý]«Ñ™'–”’”™¬‰+G•Õ* ·úZù¸Ó*ŽðÀ )‘dtðä -,küê~t:âì+,à#Ћn4òA!§4Øà•xu%^ ¨pGPð © oôú¬ M‚q]ñÙèuFdŒ¢]ovÍ•ëa]qJ“Ú4¦ÞÄžxWp¯®ñ¥Æ"x5Ȱc@¹,¦^ëï"ºÆª{™8KÕ’\2K“<Í,£G (—µ`—­‡é²^›™Ñup\×ћɸÖ6õ¦WãüÞa¬ôrðâQoXÑ0%L4ë»áÊ7që,—Ùà˕Ȥ;ëcoÅy>«‚’&©ƒ0Nê3U3ý*òƒ‹²qTñ"»f†–FbÏåôf꘽ƒÓø³ ?ÊH2£›jEÐjOÚÏ£ÎC 7ÝÃn¡hÞcœë¾âû~¼±»:€¢t„2Ð<#¹)ïä´‘H¤EX  V‘1’–ˆ€A=+ > ‚Îv2Ï®’pR<6ué­–p;…«R̬é©ßJ07ÙD–^Ì ûþ•…ŒÌ-T¢‰s~—2XPD6‹ÙPXZ ÈV-%‘#$KI¸°ÚʉN†· fØ0É‘¬Þd‚¥™Q™¹»e™Íu¦™jlVḉüòìÍgh’¦Økø$"Z~´œt/Ùs7¦ž¤'9ñ>èèÄ`·ð·Ç¤:Ü:ÜvwT³ ýŽù‚›!9ö`ÚV¢ÒΡ[T" Q’p…œ ÷CÀIØ9Ð?Xtª‚&p óÈ3 89Ï£¯ýŠíY[ FÄÃ$îÁ­<.;ÇÜGt)x Ü&´A—U³ãìÀ<<ï)¾f¼)Äg!¼úrŽ ó‡òŸsÆ×Š/Ãït'[asR +)¥d³ÏîÜ*±Ü먉2éizÒ¦ T‚Ƭ{#i‚±“ð:ìk€f¥¶nʶšh®íLÓ¢¼I[^^vÝoì „[YI£tPMl;hS+žîw€5íÓ&ëQ?ÚÛ”Þ¢AL¡uYÝÆÊxŽrE\MŠQÍB~bPÃ@ ¨èÞix¾/þT¿¿€¹ÇHÅÛ@mÐë§æ¢3ª¸Æ Á1 G`¡c€1m’ôPœ«œ¶7þ]£’³ˆôñá}íÛQÎGæ¼ç¾çln ·éÞ¦9î?{÷I×#›Ü¯¦ç+æíÔ[¡ä!)X˜" 41Ÿâ9ÿùý(ì}¾‚<ÝãìßVŸÏWßóú3ó]¸ÍÌÝÝì»{?8¦’»Žs(¢¸›ÎªÚlŠR´²äþµ÷ü·ßµþýÚcÜtw†ðN~2˜9Í}–iN k²W’Û’‹ÃlæÑ(…ƒ ”IX$4W&1Æ)›pÅ&]ÉX+5Ö“èœMmß5žª3À4³¥D'Ûd”½¡=æïý@›?øì |·\›Ç¨zŒØ»xðBÉÉZªÝ~$'œ=ßä‡7@]rÜTÂ2'}W¸é§]üšµ)Wu|Ef𣞷 WÀMÍÍ­Ûû*§ 4 ‚ èÀe08¦%O¯§ï´K1N·"Œ@H¸£¤ª¤ó çÎ/¾0ks]âlç!Ž3í”[Óª™¦`z_‰Ù¨U7âØGâËšNhycèÈ[Ó(*-*¨ôˆÔ|kãS§ç=Ñ8ˆ¬j§{Âï‚Ô!2R§vn7A«ƒ›ÅNÅ}ÓX¼)3™®"ÙL4îÖb2¤ ¡¡Rö $B†Z(RýKHâ‰uÏ–Un°°€Y ONÑ’?\€5`€þÆšG h¹-ÓA_x± €£G45ÚJ¾©ÝIõDpNÓ¬  H²¡XÃy‰4£Uƒf…-°Lù"ÎIQbL ; ××vs'ðÉA Ž:Õ`Þª vÛ‚ºØ’È œö¸ÊGòtCÚÍNi÷)ªƒÆûLTÖ(Üìv¤piÙâ›Êèv‘öƒ"¡j ×É¥—aÊÚY?/f-¯ŸMµ+û"¯œRí„BB¥?ÀxŠê ®2G²ßýE xížv€PŽ¢ó-„@ì“`’™@®úƒ¹ãr~v8{4‘ã ÝÜõwtä>ÛPÚžô`ýGÌï¥ãD7x€ÞsÔ«Œ9½JÇgÃVYqÀ\—¡€ÕÖØ µW²ÔðºZ+:õîç.Où3X@T4à¯Í×ÁŒ3½TNœ¶CÇ»WRk”Ð2‚Ý+I ûU™fæ*ïÕév\_O#É‚­þMX*ÜÓÃã$lƒzè$~e{|°¾[ÖèçîÛu\s«žŠè&Ç9ôõÌð Ð߸ÿ ø÷­zS#AÝ×…'­;–6ЛI¹™Ø(˜…‘ )º ýŽãFþg”Ú£Vþþ~nŽcc"Ë—Ûkã‰eîWÖRð]!¶ø,~9õŽÎ¹©;`‚‹½EkÏj w€›Ü°ásè+ÙFãžÒ=Ë©–á>úšS5K9Üׄaˆ?²y”§#V6|dÍm~Ò>U£ÐÆNIIÓA\vʰ‘ò³S"ÖH\’}çxݨÅàÝ÷˜]GšÁ2oʦ“CúÍåîdǰd +{˜¸4ØvG¬³ãèÇ.Ï+›êõéüÒ ôøÕç9tA¯»y-£‘»ï¼D"}†°ó:‹±fÁO|û×i½ì~ß>j÷¦Þmµ= ¯_oõR‘HR0æVcÖöðþ\OmëªG,¿We‰gÉIR $Q€™ V?mt?®N¿Ye±ëÁ,žO>*¯‹w–ß^ð^øêߟÁ/9‹Ï¤Þ§¿øË_ò—:ÍDfd‚{y÷iµINÔ#ÝEï.o/¯c´oݹ|Ö|'œFÍÕ–Ýż-KÖ*ß꟟~ëÛú•Ñ}>K=rÕÝ7ëÍöÓý÷ÓŸÇçóþ.UQÉàAY×Ïpby$)ìOÓzô*ZdJ5ϲh‡@ ŠPrÕ)ƒijHÔŒ>JÎZÏúùyÿò_öÍÞç¥öщ¤¬2èY ¾i$Ä[åfUwÖ¤a>Ò’p—÷®Ÿ/î}çÎbSe¾W®J9Î,ZRéÞóùç¦^«&Ñ@m£y³Ý^ZÔªÁ¼/O!¶ÔV„U‰ãuÒ)›­ܶ7àVó HÁâXš€{!)RZp õøêPW õà6@@Ä¢?˜¢®í«ÿ>¯0üä.¶u–pú¨éNŠM ›`ÏWVÕÁ«ŽK©õªETÂ*yÑe*¢^5ÕÛw"–ÒÆr¦ä¿jþ.X¤Ê¨ˆ¹ÝD<\…y6òR—tÉ"—Lzìmj)¦Úb×  ’7±|µ®4؈OêÁ{{€>øCGÛ›µ)]‚R@ š˜³š3¸Ò¦Ö¼I*¥,?Ÿ} _Üj4È8΀C¤¸A€×ú”l¥ÑxßOçɬ7¯,_~Ҳ׉„Þ-ü Àö¢ÌEå×Û©¢›D¸›ä¢E¶zqbKQÿpá·9ttè¦jüB8C<²Z×|†³i3ÚÙF b@IwhA¦¦´.õDïF±"×µÓßfý™*+pw§}j&Z9J±P[›5áW&öêÒ¼TH¸¡†€sÂøIAZ3ñ´jHœ,-qĬ¾–A([úy:Þ÷êò` êkì_žZThšÈi®Ò´Ž¦€n5íðœ³Åç£Ö[¼ŒËý2±ÝôűK%eo@ž[ÅøÖ$õÅU¾ÕªH°9µ$ k£4K‹§' \Š¡4ybõ‡× X䀢<™ˆašÝÊŸg|íˆjÖ‰=‘Ld\am÷†˜ïÍ–ŒBl€E)˜é1ß”¥‚‘¸Š 8¡¢RzžÍºžß3}~™~­áï ÉÖ÷ž\ʓ촢 ¯-‡ÿ''ñOñ«MÆô²±Iµ²TK¬®ã9xG^²åþëÓ#{¶÷®ß½?X5¾ßõúù7U¦·gÛu# äè  ­Ãboó²Mütp—>¯Á“ó¯Ç“—/’"iO8xú]ú&RŸfëîý’p=íwç§ö6±ýás›÷QFÆßé}+µU‚JXJ9œ©Ð$N³‘OëKP¼@FhV)9úôG±<þÒ …~¾ïÂ:þˆf¶‘-R4ÇEd%R$²›àI†{x›Š¡­KaÉJ©` x…>ŸÛî÷ü—Ýzø¾&¥ÈŠáVQ #1D®iQj’NºdHJU©Vœ ¶ÆòrØ@@UØÀ3æCè٩߯rßâ§2hÅuÔ @814T½¸ä†}¬ð‚¹À¤ù¶).Wá¾7›ˆ“,•ʦC"±€iÉRMZ@HU¨`hg˜GMø.„„Šj,Yƒ1ÅEQ$:L Qtì[¼ úÁ~yÜý6?=ô<û8lº˜4ÝÚ$˜@:¯ú¾ÞddU“x FÀ(""¡A™œj„„†§0@H¨Ÿ…ü¼µ¨/3ºÇ`ÙH"Óã J$c4±…VhCl¤>Y\Å©^=…|\®üUÖ¹wÿÜåŽÓÏqeçõ|lz†»­é¼é޳¼•öÉÑ2ñ2·uîî)š0bÊ5>‘:Þ‡g"¯Q¼ZëL°b !bШ‚+Z¦ BL j ‚I®TSPB²A6ªD¤d@HئO¶¡•ŒÂ‚9‡`ÈYÎeÿR³È<Û+ €à´?Ô,Ñ̳ºž³o?»â£a+7ª8ëhç #ÂD(¤OµYh…]XH4DÕ.ýÚ.AqJW;i –†º‹OÐ23"Úxf¤4um×{©OÔºWýv?§ë»V¤Áu„Zí»qf'¯:Ò ò9†k„ÄŽ­i?Êw€²:ãéÑÈOGùÌ3¼ŒVÂƵÎ(Ö ïÁŠGÙínª×dSvÞðK2~*u)Ùº9(@f¹K…°<þïÈÝ=¢ ý“Ì­ÅÆÔÆÈ(<¹•ïœ÷ôá™öÛLQ±BX¶½ÍBŠ`"‰ñÆ-ϳ. 9Ï § x6ë@ÕŽ/T ·W‰\˵¦_Æ?Pú@ʈ*Oü^·Ì1ÞÍ[.ÊððíŽÏoÌ/ÆœS}YÝ‘vÄb•$J÷ÄX ƒËPvÇ4‚d· »‰âžÁï…’*!¡®Õç5xþÐ÷¸!3„Xàæ´¾àÃäS8°-­·.Ÿ¥°×1žM@ž…µ·˜‚¦§*Æ…±K›†¶ºÖ`\)Œ±‚(y”_±2pÐ 0rWîëÌËq")Gô:SŽÂS~þ)o¯V^Ó|¦õÉÉqn‰½V•Ï_Æ Ž ˆÐà€Ä +´DÛµŽþI:»¼œß¶¬9Û¯µ›Ïözv¹¶|žÎ9!}›>¬ïíàz›WšÒ?¾Þ¯«~Ïšâý\@–BÕ¨‹ê`Š Öc‚ʪKB¡ª5Ð,àv#ûj®gÜNž9Ù~¶Ç)ÃÌ·¯Õêîy=~âs•ëä0G·Ku/uŠ®”H,®€l¨Œ›¢¥Äb4Þÿ{µÿ¯Ï­oúOÔq:)ªÓ{ÄÕëû²<÷\Ël׿ùXÓ&õ”ɺ «Þº'Ê®µ„0 @B@„1ƵP¢tá¤Q‚ÒFVC}¤RY¡ÆîÊÜRÕmã̃Ø>¸ŠJ4)ÍãÆdø¥ùœ§ÿÓíT»\°¼ðH%õqâÇ>ÞÕ“Eö²ã ¶ï4Ÿ¤šŒ † ©Ã‚Qƒír ¼ýŸ?Á¡{`9ÓgÿâÌ[á‰æŒà†à ÒŒòÍ dÂdfH€R éÌÒ¶z³ƒTÚ«oê¾yéè"É©ùÉ;š§Û¾¾;•ò[ŽÌ5Ƶ2ïúœ1O–­Ï&?8Ù“8Ê¿xd¿yôš—½Ñ5™æÄÉ‹+I’è’Å‚·ÖűæÇ>ßîêõ±ÓÌ£Ÿ«3ËP“°ÙS~Nܵ-&cp:Övk ÷Î~C¨±Rãò@CÖ‰j3SÝM1*'ªyˆVQUD =¨áJzØ;$\•˜–ï•­ÐË5%/@ì¡á‘àåC]²åՉʹ´ ®r™èuÔÞ öמ"TÂdž¶u‹±‚Ø“ûõ_Cÿú¼¼¹j†¤†Ñ2 ð²í¤4‡Øâ âAP"¡LЦRC”Ä 4a*d!² ‘à l´@¬šWŒ•X@† Ù8ì˜Q³…8Db0fˈ÷eÎÜmš—8WÓtn*b”š³õL6­[$d±uøAèôN×™±¯³êÌA¢zî¡’SòÀ!ÐFý³³ Ès*¹¼›Ñõ °­‡ A æ§|7BÇ.×b²|L^ÁÛÒ=@%ºC! Co ß jon@ ´½.rþyëúj0Þ¶ !gQH¨pê[Y Œ˜ûrs{CKcMÁÊ@ Š(ÐÀ,f¥‘Š…rŽAÉQôè®B‰ü çèÚ2Ð[LS¦s­Ý#R8Ÿ7î?7åÕçOéªR "\ô¸hpŒÜ凚2M>ǹO9_ŒSø4h}øO]Ž·‘ûµ¨J= ÖQ§A·Cµõ²X©ó ëéÌFI4N¦ÑÉÛ:؈K^z$ÄPBB¡´Uoæó`4X²è ' o¾ÖæVÎÝI"çþY\ÿÈ£,}‘©àØÇÂQ[M¨—P‹ª ”%‚6ôqˆÓã§3š»\x¬=O,&íÜÝK{ÎøÊ¢ o£QÞ¶ÛIkÒ!ª”yãÄ4o‡é²Õé°ˆPjª#Ršb‘¢°¸,KŠ–r.¹ÜwUýH „dóùdÔûÖ`½°ŒN”Û½7TÞ-%4o¡»Gû“ƒ ˆ¥+Ûá™$yZ8.!º‡=Î à¹1Ú€–F^Οuqèí.UÇÎh~÷o÷ÛøÚ×ÜŠóh…7ÒÁ;ÞÜÑ]¥UÕ¸Û€h€Rˆõ?j.üŒ2¾¾ªJÄÆ½'W/d‹/ëGåºôL®ò˜$—à‹»ŽÎyåUSuÕ•†8}ÈéXÛZº^×ø×Tu§g¿Êã=ÖßýÉ‘vtlò<ÆO4÷ŸwKSì«|íóâüqT"%ÒûÉí·Â‡9dã¿„£¬åXn¿Z¦VÈ¿OfæñêµéÓµ«ÏÛ«'õýÇ;wMZQ˰ÓëžGâSgªÙ?ûãçí/¿ôØÞNMóöwŽßç$ÀÄ#„h¡UØ=w;.5 !$)>ðëxÞÙ¯6œú‰¢˜ÝŽK>Âë 7^8ÕQOVß\M5¾ÎLjh…W÷˜™!B½67H·Ûx%‘›$³²³®™œpÅ‘®…º ‰ÖOÛ”¹• į$€Ö |ä²–ºvÔfÉg’Î2àx¥ýDflh„UŠ«!”>—ýö‰Ï'äãòc¹X%°œN¶ž:ô¤M¬F` –#*²Ö©£µ”ZÕO4·4gÀFžÓ–ß?Ù~¿U¯dŽçÁè±qFY¼‘ÇŸ¡%®ÀJJÆDP0åíþö$µôÌÞq©!T©D(ð9P énÆ×-ðµ·^¹÷Cˆ4­ß±‰$/v„$d:Z`®‘:FÃuÄP^V—ê\øš¯›°Ôƒ24‚â8cŽ%ÕÅè`¼:–ËðÌ„y[Gt0L²íåÔ ¶ÏÞ¥€ dìɇ‡~òã ¶þÀæ0j2„L·Ž‚¦¶Wb*~šÖÄô®¼üÒ3"ºÜòpÓQ«hÂO”|Ú±„Ú8 ̶w¯[Ÿo?ímáÅølq›+¬¤ŽU¾¼sÌ4ÍqýzOéÁ¹‹B‡Ã­×qOk,ç9JqŒ@I°‡åèZE¶!¤é.:2^e‚õÌô£ ¹ÚñÄrK9I 2Á °c3’¬àðœÄe77zKpfZª6˜uC‰{dx«KÌÎnìDÁ@ÐM?„1å.ïûý}(MêCÚâzeÌ =Ó 5Ï­Ni1.~Ƹ¹å·y!a b²Z¢¥tü=ú5±ÆŠ”Ü)É€o&Êz”9˜˜ÈÚz—^§X­87÷ΫÄÏšRWQøÂîÍŽc4\­ú:öù•¼²ìÁ\T¯°øD}ez/\ïü˜×'-”´ýÓ¾…²üX)Æí pÃý…¿–T!Ý+øÓеNË…Tª5Ôï5ÕÜœvjík‡r³Œ|x´y¨»1¼¿N´Q“ÔIÉ¡\ ÒØª Ö\Z5±0‚;‘hj(˜Dk,¿›Ö-0°©2.| ʃĺ& œ ·¥’´ ½Ô@0LÜó§„)PB·òžGƒWºNÇ ¬9Æ¡”#pÚtTì•®FdU 8á°¬!±7“Ü¢yvJ± _æGRÖþk8… G ¾)7‡Reô4 ªI+¸r,¹dU —’ BaJ§æË¤‚ˆI¹ƒC¼¡8lÊ\• íˆI°3ïŹ…e˜Û ]6;ec™¥–£Qk‰¤Öð“¡ó À"ERiÚFrJdRZXikuøé$¤bÔšEÈØ9¨%‹0]È„´3*¹Þ–ů%ý µ.^*^Ÿ·‰07çâØP±,èÀ‡X#—I1ű'yÖQ[ö–ðä°mhG»¯ ›SòÕ9,ò†õ°IÜ–¿¬¹vH `Änל!çVÁ‚ñùÞ]S4­ç©I~Dïp¶¼X®+Ø(ãiÁЧÍ×A€Fò ݳvë@Ø(c•g+=.Þ%` îî‡Ù5•D ý1p›VÆw¦f¤ªÉmÖ­ZOŸÍcÉ3\7©ùî]¤„^Ö$eAèuQ§7CÂ+«~P™Nm©È-¥ºÞleG“HK©Z ðÍ£Ó{µgVŽ‚1¤„P˜rë3ήщ{Jïì¸!_ÜÃïÖ$©*Ž®Fª’¶nZ,4Å]–Ú bªlQÀìJB¬ O„jSþ»ÿJ×ïÿÛ™.L‚k#BÍ%†`S XY«FÐBÄk"…÷¹8F[IDx\‡;E¢ÈQ°-l4 \ª¹ËKÄÅ`<,ž#ŸÇ&™I5ä¦TU¡1‚qjWüJ6^?Z¹pBef´‹À`‡ë²./PŠ4uAûþú(!Nˆ5y®ú°¨nºETçEqÏôPó¹¸ÎC¿K‡¦$B4A{Á| ÁŠP¼ni¡‰ývf¡öõ~óxúÙFýs¹ 4½á1R¹ˆmZ¸è© ,[×Ë$•‘Y&T*LÔÃHØ.¨Ã ßÉ)8:K7kΓ´‘ÎNû^È9CgJ/‚àÒë•>´¦ÅÊMÌX½WQ¶`º´ë~m6 (FwUmF°tq2(ë ˘-Aªñ@ä¶)ɯÏZNº`ówô‡ŸÌº‘hmúðsͶÅ,é]v…!rd1$Ô“[¨p^øÌæù«™uGð×á˽Ó=1Ödž½R}Ý Ð ÝRþJDÔ»íu¾ðp¢\$䯭#IàvíÂãþ>ŠòÌÓÉóþÆahVûôi%¨= EÒ®‰~(hD²e©‰ÓÙÙ«øù8œ/™²±àq`¨sì\Õn½öB½ú\£7¥›ÎêÂóÃÝØÎ[š#v™“¤[x,.[Tά¦Ë¥ÆOËD‚'#èÒEœy(áÇÄoÍÇwjPa¼VAb®Wvý¾ó—l.óÍ÷'oxºÛk*_‡Ãµ.[;ç­üh®¾¬i‹,F½ŽvÚµÚþí oÌݾ>È£U’wõ7㟧úÙ³¿E¨ ¬Æu¤žõËö©qé® !ðYxÿøûY=Yžï1Ý…yEI¡²jf¼”µgIg·œèS¨¶=ˆ&Ïü¹çkØyù·Rcðoý~yöO¥¯Oþ™Úò´Ë9<ùÌz½«;êŞŠwæåÿ±ó—†ÍHDGt¹J&¥•"p±€|IrüR¡ ¶1•Ÿ¢3nŸ:„Lâ ´¨xÔVÄAµjWG¡ ¸ )D°ÂÆúÎ7>çמó°î¥ê(CŽé@¥ú9E&®ìþò§ ØcéâÜzy³¼×&î=Ýj©"GEo©·_Ææ)ÙÍTÚ].ðˆ‹»qŽ·7 ¤ -ž%‡t¼p‰ X4 Š [2Ñ&¸q«ý‘¤š:t!L“ö©#eI7¢DÌ„S`@-£Zų/Ú(ô4@z‘j3ˆËùôNšˆ¡$„6<ƒ À Ñˆ¥Êª,[/>õ¯9‡ðí™%\úcÂé·½ˇ·ì|¡é1ÔW"*B˜0E€)rê+~žšQ.À«eã‘ %1”O»­{Wœ§ž¡œÎ½Cû”R$ l0®T»H hКH¤å’Ø ¸ÚjNŸEW\Ì´Ä K‰8*¦E.sGnÓVZÐÑ¥TCY§BÞ%˜c]ª uÐ6F-’fzá}‚B€Ø€Ro&_-3ªÝ·-c[)‰ž3Ð×ZoÎFa…|wy–p|Q¬g M“„`fŒ”ä* VÔ«C®Áw6~Ìs?Ç^fU¨ç{§…}º>É6ÖLý…¼ÿ¢'w4ž†#RA{,\»*vUÜY…Œ3!.ôd'ذʱñ`¥Süz…¬›24ŽV,èi˜@^ÎTËÍȈ£PÊË/XVok‰=vÞf³ð2.å篬KH÷ÊÁ¹Op¤UFˆ=vlÖÝÐ÷œ¾}š .•™u2¤"…‚‰ÒЬÝl‡¤F¬Àê®Û šwžý¬w-ŽèéU¹!MŠŽÂh>¸á²ØéTIžÃ4Äfoªô«ÞW“¨9ÚBM®eïZù Ü¡­¼ëã7ž`‹6z|xʸ-º¤oŸƒw8ÂhñoÏÿ¦¢ì©‘ŠüGð 9Ã9‘ÝóðÇëÌÇK?ÁíÅÅ´¤M,~âùó¶È1n‹ó×ãš [àœò¬gù“Kû ½ÀÂ>÷c·ËlAh†—‡;ÏÒHÉ]–w0 üêÈÔ4¶ "ÁG¢Š?×kôT6ã4¸³» §!*ïg•ìÈ/vrö¶ÛR¨lûð†ç÷ë7 Jx‰n‰L¹Éü)8Œlø1ÓæÂ" J.<_ĿԺ˜’Ì\i'Žq%áF8ÇÁ1çžt“ã²êJªˆT÷´ØÌ¹J4Û² „$ÚV(Ï™†cypM¾p"ŠtdF ËP‹cl9ÒX¢ @V\G‘¥ÇàlÊwH'¢Ö¬¶º€‚Û¸@„‰&BˆššóŒ{? žŽ yQðƒØ¤Ä ŽÆ A6’–êplüéøÇ•ŸHœÑƒ@‘ÌúáÉ8.Eê”éD o{x™þMn¾o]ˆZ@ÐAtd qcE”3£»€17¹86S˵TU8# M&Q0 D#Ui$‡cD"Í@…tr±Ö†0£MXÆfCf¨!4 =·záu¼Ùp ‚$J‘IH OŒN®èãåúœØ9ï—³ÏîHµäN¨Ö01Q.7.„€Éd$Ææ”ª€ÐƒIÅX6§¶ehl€2(R:¦ˆy”Ÿ›IR¿Ò_oñò)ŠŠi‰¨! +§5ÑBHm4·ÁÊ’h&“@¼ À†ºFGlÌunÛöâèâg[Rûƒý4vW}Ý?ùÜëï¿P+BŽçÎr+m°$v$Î:u»›Š(!¡ 4 Jö8ŒÙà ë;oÛ½¾Ð*Ž€Ab1’AgVeä²Ð=ÖÅcІYËLhÆâ’S°bÚéyï±î°£»ÊWLã57Âý×ûó»Ÿíƒ,öŽ}ψyÌW<ÖJV/¬i®‡}2†;>FãUnk®Ž1ku±ñ¶Nq©9]âf™X’Nþá9å™®Zìb»¾Öâf¼iYfÂS —w¥²*ø¤IܘÂa—à>ßÏbÎÎe Îkw~Ñó¸d±ê”䯹Îýí××Ý×úå'ÿj¥ùj‰œ‰éŸ/Û+zµ‹œ¹Ôóža¥w=µüòxí¿Ègý;ˆðá&P¬”ºg;>ç³ ¿—_Å Øñ®å­â®p>ñv 1®š¼AÝ¿»¹m–Ì´¨àb¸74:¸8Hâ¦É¼àÓ’30Œ\"„qÆÂêßÌM‰n?ßÇÎ)#kßèZ7lf³B¢+‰Ö|#ÏV¹ú&ôMº‘C î¦ép)%À¢tàŒæ`xã(žÍI\w{Xï rñ¡ØI{æ&ƒ &ýÁ& `… ´·)@¶“†çÃJÙßàö8wÈ-kk^à½ù(™ixÚ|þ©¯b.z '‚ö™XøÂ¢2bç +=PjS¿Ü]^{»àªü9fOE©–9n}O˜`mÿuð’\hÅŸd>e Ö€(.P!ÀÕçÝá¯Ã¼^h'¯ß.\èºy‡´©Ÿ­I^,ýo†aÊëc}ûúëíÍä~f?“Ä?–:Âzs°“ßêÖW¤SIH)H©ÞQÊN×ð`•¢^T¬‚Üd|,ù…n›Ïú±kÞqÓY¸«—×~·~È=SWÓc~È5W5•étÑ¡5&;0&bšQ®gööŒo_M%ƒE}¤ã3fÛ] :Yüü~ûVÎç$}ˆ1g+í¥×\½Q¤Œ†Z%"j&ŒÒÂ5 0€0Ö¨‚ˆ^VxM’LÒù¶Iz‡b®c‚U“êZD¨-B]L“&P2TD¡”õÔ5ý¶ùÜÈWý6Dã]J’81’Ÿ_àÉ]`s^^¿¢fRõÐC÷x6Þ rzÏrôK"#íå–ÙØÂ38qșѼX 5FÀ,YIÿI*áEʈ9Æ5Xâ?¶©ÿw}úhpxßù»*Eåa5Ý('15^VèUºÿôs%G¡Rb ÄŽBœ êO¿1ØQ†á¢fq£ndü&®ßÚ‹¢'ñ‹_,ɬ_= ÁöOÍ~œ=òi·Šª¯'pQ:bÍî¸FwõovV…8€b‹Z5v.ƛ箬7^*3~A;ØÜV~»¨ DÔçÒØÈFQÉäZNÂÿ3k’·!Ë'~ºß‰oX ›ÜÈB±,ŒgîN ‡H´\çð5}å¬?ewúN ª9­3@Êd7²sLOy–ð_’ŽL©£žÏ>­)&RN(Ä‚då¼/Ð@¨~ÞÚëPh›‹N«(/‘:‰µtQ‹£_¢,C·áv]°t‡ QTv%¼Eº‘.WíåÑiòŸsâ.ãÅË:ûŸÞäh‹*.=ª·D{k*ÅrÇiÝÃãËïD-î>bMïQ•WQG¾è1º+Æb?u¬uæ]b5ìŽ1µà>~Ã4«\–\ã•u¤·ö,Eƒ—yÇ ·õÕœÁÄd¡ñ¤ÍÕa¡º$ •Y^fj£‡…‚{p ãC/œ8à]Q¬«¶0™‡\çx•ç]|Çv$T„ê°àMT϶J¤O³\±+TXB},á Ê–Ì@—R(·‰êrýÚúzþ+’ ÊóÕ|´T'-3z\êüþø?¾ÃöÖõW°>OÂQ’ arêc€@©w’ðB8J» TŒ|î£S]šŠaG+ì¶Ú 5{˜¯•_vS¤,«÷"+Õ\lyž­MßüˆgYËb… +½­5æô*+C<{@Š0àÊÙü¹éî¯,ÎØ¥ÏΑ}a}Ôº±êÙUÈÂÄT hÇ6ªƒm § 3#•¡\pKÚ±³æzßÈ+Ý/X?«¬byFvR‘m/¯Þϯÿ‚Ôèߘ³OŒALænErÎ÷.& |y¿*G¸å€vU‡Ï™ÞyÈs½ÎvÔ”G™ôú²ý⨦Q;á Þ›ü‘ìµþ7ÎWÏ[þQ—¸ò¢°)s¾§ž[OÝ.—‡¨do)ØÌî¡K?MŽxE @øâ™̧Õí|^Q4ƘÅÚÀsááÅÑ]ö"3xQ°¬…pø^ÀÕU@%W€æê~á*3?•Ùí¾ú¼–vŽ99_+܆T…MášÔ7†U2JÞ!ßè6›Êu‰Ýœ )»$+´PL€¡\o 8&=I«·É#l<½›Ï‹!­Ycë%›qFÚ_³o°¦™BñOÝÜ}ã×Eˇ~ ÷²1A'yÀ§MÊs5A³àJ&¯Ò¯FeZÕCp®ŸÂ G­^°”’Èø¥QËø®õq{§—­i­JEJwy›Ð`ÿݤ7 kn AW¬ñ¦Ýðs*Ë7²Yòœ°{oÎ#ž¿‘–¹ƒJ_µ®À¤e,—bY $r¿D^뇿»n|öÈ÷º¼tX°Û¨…˜.QS?˜ÛNýåOŸeë|,UZãé=Ñ;‡ú—UÄêM@HoDà‰NãB…Û :h«È§Î&Ú£Û»}ÉËëe–E¸ÓJŠA*s:'|h\Ä+ÎCG¨Kq6†Ö^Ί¬k¿tãzª^iös?õh‹jÆÆrŸHCâ BFùs¸dZÔ†v·¹Ìãn­5Ì~tÞúPOS9,jEßFLµéW‚OÆÈ½‚Z@Ù Ó©§Ê¿MHꉴ­~•8Z·5-Ð{WÓt9·•1¯¹=SÒ LA¡²22dùDýléS÷ÆâÍ3LJŸ¤°ç°©\¯Nøä$ºq/Ùš…­hé ÚÅ‹åÔt.D—ùžÚ}Ë^ä­‹v%Ö³ÀÑó½ìu)ÝLgº§¬#¸oÛ¥BçëxºßÁþFö ùÇ«}HžÂ/OÏ+ôŽº¤ÑÈ B´õÖ¡µ‚+;†¯lø˜ï±ú]øÓbtºÝjßþèhŸ:Ÿ½ËêÅ*)¢ò¶•X…•D µ hâqVz¯W©·WþL§d([¯_}àUÌ;žÝ÷6?Ý0ËZ½šõš)¢VŠ]ñÚî½àØñœ»œ¼Gu”r‡yË Ž-ú©óÌvÎ×ËÄJëJŒà!¸ßíóôû|v!N_ÌÛOþôÏ7ßÏ>wþá‘‚8â¢ßϘÃîûɃñÇ—ªB?ì‰ñ+·{ÄáéXR9ùÑðåÖµ‡³KGí¼~ÉÜË]—ï2èö;v(a†óÄ Þ«ÏG¶¶éEøøª$19ŽBr!KûÉwÐI­/Iäø7ÕE¸¬ô‰ËÔÖÑ>~Û;N‡Ö= lñp‚·ÆøJ϶TM¯sêB"¹“|ÖÀªßVËò%Eሑa e±Zš¬Â¸2©ÇÈ1øY5Ž%኶?1&@R¡#|µ¥Î†8„L‚¸RbGw2Q±ö(ô¸@£Z×xE‚½’0OÛ,ÆUw1|_½Ÿ¼3rÏ×õLƒZÌ$…1iÂ_,FÍF·Ä—uѵ¦1ÃI5åZŸ[™Ÿˆ†K]òGMZŠ€ J1€(d´Žü+, |A¦3:»µê†¦ÁH…° %; ÁŽR]Ó$ãä’;ˆ¦¦*V$C'³¯Ž74•d}RPÙ¬œA#޲(ˆXÌ€žS+šeB!£žÙš³œìY­;Q}ïƒ<÷ôˆ!Á^6‡ûßÕ oD0™XЄÌ@˜ÒœŒ¬ò›µÈ(0 /èPy‚Q©Úäâ˼5ïßnšE˲6«>§T€Ò °6…‚DŽÃBˆn{ ³ÁE# Aˆø+…‹ÿ«ë#ÝòÔ÷e,ä;†·X‹e‡¯ùô¼=–Óp쇨©( B%Û hN§-O£Õ¤ ºäÇœï7>opë;:7©:J—ý^ÇÈáW{E)0„fÀH6$„n¥0i:ŒÀWÈ%ê¤éÙ eœÀ0"ÄgnŽ©F0@»»ØêmÆNõ"CùùõòçýÞ½vÆfkR÷é.V³e{ “×$:É4cÄóçdÀ UþÖ7M(ß[s–&LÇ…ÕŒ+Ú1ü&¯éxGíá/Ö‰ÚN¾{ŽÕ\{:¿®ìú€ª [ÙÎRîßá÷Õr딯ö)„(¶©­ÅÅã»)GÆÀç°÷˜ýüýãÞ¯ëeù¦Ø™gh`¬‡²$Íî[9¦K&ðXkJ•a H ÙžÔ5(MZáÂÚÏ¥êW®ýïãµ³¦åO§YôÜYc+ŽXžóŒº+|8ö 2Z[ñÅäÝ~§è×–Ã¥=ñ¤C9ƒ_ã Þº|l>p/ÞLÌ_UÙð˜ˆv- ƒUíó ™FfϹ¾2e×i×Þõêçk–pÕÕñóâWUÙýúñùù§sþûÿø‚/é¿Ì®°D¡ðÀH º(¢´ðâôk?³y[OiÉï+}ÿâüL÷wÞó»\Ÿòõ¥Þ~ßèD«q|e k/÷C\¦§ùC!€é·ù[@ PÅÈPºMYõ²bWÇÖ• ‹°T¨›^åûùÊkûñWr®ç½ÊñÓ~ß×CŽÎòôhV’}-ŸªIЩ0Gi}ÅÔ-Òdéj©!À Àzz¿·ÎþÓCkú Ëçc\Wò«—ÙâÙ…PZû{¾wìô³½}{›kÿæígF¥Z 4h Á;Ë2L\ E*DbYœ©uª?»PŠl*ÂittŠcs›©•Ð\" j7 r±-  6´,0ùDê#nQs²M ”À<ü€alÎouiœ/Sš)´’Îlœ®6阼`ÇØ[@ÕHD{ˆxGHˆ4Cǘ­ùNì1u.~ ©%Õ¢ü69ç+ºÚßö´_¡•XÑÛÄ»`ê0nÄ‹KzÆ_ß±#Ò2ýkÜ£ýZ»ÊÚoÅŒI´‹ÓÒ±ÉÚ ¢ÛDÜá/üüîÞSPƒ¦y`µ?¹ÿ/ G³5TÝõu,<}ß!kZ ôÍÔc¨oh}ƒ»7%†Bw(`(˜¡Ï „ ;ᆠM¦œ¢R"h™¯õlNÞ¦ âp¯¢)àGoMß´i;ô ×Ã9èLoj5ešÅ¨€‚mÍX7ËœñÕ(†RçäDçÆ#„‰ðeØ;õ¾^³í FÜÄAø˜ðC*(FBž¥E­š˜Ùû˜ö}`ÅWùËÖS»Rm 댡÷¡íGìI¶ÈcԲÀcb°Aš:Ú1²Û§3XiKï×Â1±×žãÔR'‚ØäʺԜà(TÄ#Aµ@ûc¾°ò’¦)„–‡(èQ§ÎØ‚vNög+4|…áaú<µ|‰N7Ò¤œó, 뮪JsûZ î‚oR@Àì  ŽË !f4ʵUÉ£g§ÞÕ;>oäRdLÛ`„n,Àóŵ¼‚ж×–¥1``­íàÇ"Ûö ¡Š§a ¢‚†$p,7ߦ¦Ÿ¾Z?rÞòÈ¡_©¼æžž(í™–„¥¶0ì]b¨Û£GÁÄp¦©"SGgלaRÛCÖR ®5L‹–é—L¶ü†ƒÞÞ™ûƒ×œÅÒùÐa,ìä tÜ'“˜‡ÙÛÃtX*])È[¬øìm™šWì"ºnµÇýk³s€Í´„Bd¯T}1ÎtüžP7¢ùŠóƒI† wVî’+51消Ž4¨L+—ó.¾6)€HŒC¹v1¦¥ Šô„9I}â)A@Ú!:TêDc¡/½" ŽÂ-ÏöÛàu1mQÑû™¯v“GµˆZ–€GXLQÏiUÁ&ݪ@ÂÊЄ–³Ã<»:`7WÅWÁvªc¤b,VWMW=ª|ý¹Nê*nÎô¢9iO\xÓmh¶”»×[¿ t»eZŽ(ûaœS£ Ýl6¶áã²BZ3jƒ¥‘K_ï€õüº¶|ˆëý€¬o^‘º^+ñ'ÇÝþ’×ßãºï O¬Y¤Þpï±ÅRºÎ´'K‚0âl\¬ê-­0[ÏȬ ޏéZZµ)ªK%‚D€`HQn ΚaülͰ²!UÅÀSÆtäêÀJƒ€ ž8ÈΓÝóæý¹Ó¶œâà GâŠðÀ¾ðýª|Ê|ùz$Ä!°®ÊÕ{x/~<AŽ¢P°Œ%_oÆCǕϛèÊõE„S–z¾L’ëQáÌÂrdKr óÞÏ«{ÝýqÀ·òâ4ïc=½ÿ#ì<k"¡ºE4U³¼×¢ñ7äó‚1*eDÁìŲ­½Îæ&†½sö3¿oûß3÷—³%K¦Æ[£¥Ñ}†8Õ¿³‹¬MÕ<º…ŸUÌgätªš+б x“‚ÚbÏRsLeŸÈ•D¸ˆb[÷oý£«T4¶¬ÕYZ(u­&Rq)L F„hUïøWÿ˽æ¯ïX¾Å»ù»Í¦Š× ¦È:C…ž)ÎÇøAuFä ¬.?q/8sgT9ZƒS±†¶jåãE5u¿¤æ×‹½œ'‡y~UÒ\,ºxº;‘JŸ;d7¿-¯Ìóqzú¹Ÿ²Ë'¿oÏ{øé™H‰¤ `Ú ,ÀA ãˆF0Àg›jƒ»ƒýºþü[ÔiÕ÷#Ä‚¥ÐmÙŠvi(]³mûkµTâDuLÚí’í€ÙòÉšhw3ÐÀbE“N£ÛˆÙtS4¯}¾‚=¦ÛÉÆX5Kì X‰”©K¨†žæö<ñË_·\Ž"ËÄXÝØù›û$¾k{Ü;krVJ³%ÁС‘QH`|8½V©3Ý‹ÙJ¬]­ÞÁ}¶î2_9ɲ0`7í; ¬AL»¶mМp˜%ûåžÙÍr]À*° R‚”sj‹=´JIOܸrhÓýZà±oóÞ/ŽÏâ?ÒGÀç÷Œòàã1õ¶_ûn¯O„ª#µébƒ0&\yhʳJ7ä­ -WB긭²v;4\Mê\s‹:mŽõXçéN¾ õ¸ÐV÷-y®§êc±xÆð’Ø U=ÄžÚû/@þp}C0›çÍü]ô*î½¬Ñ .:ð®¤ãé<*•’VFªÃ„þBw «N,jÏÏÖo^\šÝH¯†³•ÿï„îô .d‹—,Ï"š\–6Êu…‘1¯»«9ɸëE+gz¼ÿ.ðƒ ·(c0PDUä弆&J^âqñ·K;zÝ]3¾N<“Ÿïœ8•{ü\aF´C-8Ëñ¤Þ\{–‚…C׸ 2ƒPªK÷äýv˜é1õf†4–í"Ÿìdßjš;h¶#é1€«X&R˜èZ@oé‡;G”ê®¶1? ­"<:|,övã©êÙͺ»Ý>ÖâóËü–³òÐàÀPkY •â3oN÷]gè“/nþtëôQÿìpûÙþò§ŒÞ‹:Wø¹Ê>tÒˆž.~ø©Ž2$*uÔ>‡1àê}ë½ðQÅ®„ihf¿ìeþŸî|»­ì´œLÅ÷á½oµ’½÷R:™Ð·qz#9›x~KA9_|÷Œö`×-À2Ïííßê÷W¾ÄÝ'*¬±OŸwœ ËâVk›ùÂàÄFD'xd6U­Éô®µ1ùß‹;¥ ° ×ÃÇ¡­*ÉzÈÍx.î(:ø§Òu)ñá&Œ«Æõºž¹s gäãcz=·/Ž]vq•×HËÆÈ64æÜDäÖØî°u÷ý³zÉžg>ïÉ{õ#ëܘAM¤`ÇÌ™~©wF’ÂÖέxcE[êÝË)çµü - z XìŠ((˜ª-ÝD{¤4÷6æ g€…3à{Æ7aâg«ì0"Ä&˜ÎŒ2Ÿþý”fE7X)í,æ„Õ¡4ÓÄŠb#Lv Œ  DT!-PÑcx‚IK–Y{ÙBS`SFM Å ¡¢$‚bÂ|’ùOæcñ°×€‚²(PLT0]™ Éè°I&kg§%"Æ(=`„v¤$L¢@1¤qbdEGHtŽérͺ¹f:—ª.ÒÂ$‹„PÈy pô÷Ãbˆ¨;‘ÁfY“0Pä%²U술1@A¡¤Rµá½<*:䣇¢¬žg•l5 /I ©M-Ji0 )A ’´T!6ÛЀ ø}¶÷Ó¹ŸÆ¿~¼÷Ñk±+6Zz®Jž)lI–0(½Æò×Û2·œo¨áÅ·ˆÛ³àä¿ìñÄi‰üJãŠH2zµG.g®×rwÿó—+¯÷°~z׿ïÛÛ}TéDÀ„@ Ûo¥ÁÎQ™‚NA¤À¢>Zd]Е'¦eG4N-GDÉÔÌN3çU»@Ø$àE¬è.®÷þx.K»Œˆ­e„FP,ŸjÇ%a%ÅÃ<^èÎQȤ'•Ê£’zö9Ó £”ÕS–g½µý¬‹3©ç5V=z´ÝMÝŸT‘¾ºkqùuõ;z¶ž/†ÏçûþNsGê#ç3±1]Üm[·&œÐIãLÚ<Ò¿/ß~xöÙôcTåz¢ÿìÝñítb7ÞÛµ~¾Òª0xEJ{Ç•Ñúµ'<½Šù¨ÁšÞãWrØ,·X«S» ÎTš8q¿÷äÍ×ï2 +œ;‹•ÞQse3Öòç¤ÆÉ¡DDØ´7©ÚÚ žMø…°8 )Ñù>al( ´¾°^³I[¸Rè5ЧD?2ÚŠ9-³ƒCÑ¿ˆœ_þ¬b¡ÒöLJ\sçþT•5¤­æ‡. _øa$fêLœ3Mr)¥ çû”»FQ¾ +ÙÑ”q @S-œÊ™ü"¼Bž+µ@­©40@‹‘V91=g•§Z2€ šæ˜'¸¿sž‚rÊDõ›‘ˆUˆO±¼EŽˆÚVüqô\½qÞBù^ÛQ}ÕµŠYWá»îôÖ¸ãØÆE'ÙÉNÚ¹ Íwòq<·)æ«®*o¿ÝÏG»J<»ó ‚Š‘ â—¡xBœð à´Ö Z_sñêé}=ÓÛnžýòuÎËã¼ÿó²uçºçZöѹýàs©T˜8Ôiù²€*ŸƒF;øØÞCÒN$hš&ÝPnË$™²p ðMy`¥šI³‡××Úëqïeó½^Ê9î:-mY W×U”e-'ÑÖN!:¢Âд¢í †öLÚô]­ ­V*‡›ædŸgûZ™?LéqGÁÏþs®wl78®ö›äv-·“¦´çW3Ïw•ô€÷Ó½Þº*"º…a@Qe!†”0b *0Jò`Šâm©+ÛªdtÙ\f$SÂqãÝJ!œ„G”:„‡I™5æÔ±KBœ² QË2õÑ•+á1àA9‡/ZØÕíPé‰^±~,]¥ZÜjžÄ  iû_ ߺj¨™¥‰8{HH7 Øœ> ÎT^ ^nL_!½Eê’\à¤x|i+N`о+Š)ÈGµûýç?ó¹ÞÞàE\šº¾}q{¤%q{XÃí–lã5AÜNék†¾žÉ•¯©µ ¢!Äù(ûÕŸü¦=”’ Âà3„çêÞhÙá´¢éiF†VRS‘; &4ÖYÖÁ Ú/ îÍõQÊol|3/¿`VZY¸á ÍdÊ Cã†SšËØ}ç¥j‘õ†÷û Löí›c|á‚Ý7 ^[F¨ÕÕ1²=‹»7çlÙu…f¡†Q•h€ö˜½_€ÞœÙÚóÛ‚Atp•ᛎǵ`“€'‹É…Êb‘E÷б ª†šìé«0æ«Vo]bN–¤c†cÖÐñ’Bf~¨1µg6åD|Zø5H±1º$³yËÈ𕱧ÀÎç«D€`XgâLıF„sp¥â¬‚ö`h.×Ð’<1;Ô‘j@;!¼ôŠj„†ñ„@ }BVªn@V›m°^Ê”XMnl÷aÏf?•|z£¾†Ù¼–îïàì í½ Í;¬ÌSnEKÓå¾$F§†6йòãŒårßP» ¼äÑ¢(Žº@8ùÊx\az¸ƒé‚ÄÅæ-7iIŠw›¯åØ·#I$äYiÑ‘Já±ÂÛ’cb¬ËyгåÙ§{ösèš„’PúF¿Q«ÖBø,W”ÖÚÑsý§ÉA¤ £yA.&?;^ƒjÆÂ¢¿Y£ €G4Œ.‘6TG€¯nßÖNüò5âWƒ¥­w–ÐË4™Œ’#ü?ÃÿhÁ¾›µ"ǰ¶¢àèxm~þy›!hã\±C,‘ã®™5$!@"†@³¥©‰„š3ãÄ$£QêD|wä úqÚ'4Aˆ¦\»|©Ðj™CÍ <ÔžÈu¸'+õU8?›+#CíLQI´’ª‡IÑbˆ#KdŠLA«³°ºÆûë±XÒwU¤ÏI¿`7Ñ|+ÿðäÓþLþƼj×~¹ïÒ^÷ÚìÀŒ+4I%¨‡¡“ÚŠ‰V{°ZHÂÁþŭÛ‚Á5—¶IHÔX”Ðèö·Ãó¨?˜ó¿¯w>­½´c{Ý8è ÕçkΨjý‚ßb RÖ¢†Êª„–,M؇ôý+ ï“gÐm?ýr7¨Ö} ³1¾ón^ñüƒÅA=¡PV¶æ.œ|“›@Di(L%Aƒ&WøšÎÍ©fMª-œ ¸øS*0 nÜ!¼äî{ÕÏzšç£üúý×·m³8«Ÿ•ƒŒA0Õ*¬…²#6E-*©t;AS<7ey•¤ªP° %ÐÔzg®4ˆh”{ãîýj(˜³*Éî·ãgúêzáõÀ}ßò°+ê÷N¶RµµÝtî=D¾½{jòæö/¿øËá»_™=øP]QJ(/¹f„æ®À ` ‹¼¡ëÙnzó›?Æéã7wêxìrÖ?g0ÓM•¾Ý¡·žQÝîÓhKo­œ3½úðLó<•·q+Ðq‹”0@e1Éš¬P¡°E¡~«§€v °  ¯’j¾ÚÆ£'‚G~UŠ(ùª*>¨ Û’5–è‚R•«bslêúê«Ì pÚü¡'[Õ /ÇG"©IŠ2‘ÃŽ_ëÏÕiôKdB ¨Eäå#'=ÆØµõÂnÿË6~ nÿ¾½]þgõ0pj†Ås—¿_ñÔ<rþ{z»Nº•…ƒŽbHF,TƒLÖMõÐÛ w¼`.ñÀ~¹@\º8׊eS6‰Š‰n”dыȴ 0è¸tPÇB1G0ºg´ßt˜2(é2:()ïØ ÏïϞʳ]Ç0Õu{cŒº4(Z r2 êÈúÓ?•ݲÚ3%†5†e»¦o3ú‰ûÓ™K4KÎ Ó1)H û®ÅŽ­)@éáÍû´k)2S¤–o‰˜e»| Ôa˜øA¿aÀ¤«@(uP€(IbL3çu§{LµÂÄã ¿,H3?¬1x¤Ò)S$§ÃL|j¹÷”½òÁ8Þ<üƒ3Ç¶àŒ¬«ãô/í­é÷·vÁ{C‘`öæC4Ô²yk¥Ä±¸c#J@¼!Jª1XœH÷KÀÔÅ~©. ›-Ó®tu€›6²½@æK­ö]wgSÊÙëÇmAoàDŸÖÓŽ:347}âÖd^‰3pSŒÖ,Sður Y.K5Oƒ"Ö/åR ˆ£tÉBx%‰ž¥tK¾¬;ËÎ:Ä9ò(c²2¶*5&öÛpØÌsoÜz<¿›ÜʶßqUl-‡‹ïÿ–`4Ïær¼³Þnc `—Å zïÝÍ7g¤ðÞdðî‹Ú/Ç  V¢98CˈXbTGœêÊÈ^QNþJŒ{gš–fí׫{…#ýS×¥E³—§·™é‚_Uh"N9Ç"”.ÏÏòþêyý—Ÿýx–7J›ŸÚù¹Ü³~J_û¡JåƒôWã¶ýëç<Ú'ý|žÀ«ãäh&†D#.Ü·ÆxTr<Çg>­Í:|¯íAç¹;¿ãÙ¹nx Š£u+F¶jG®hʽÒG榾¾,:>ùÁ%k¥í³Ãæ«k>Û¼‰ì리ÇYŽÝçšý÷„°ú€>œ[ËBýà¬ví`àƒ,ñÌ6±œ”±×î=8r×5Zà Àz“ºè‰MV÷AÃ33(Rp‚¬ Ó·Ô¥OÒi‡cüJt„N8Gã¨Ns6Ïuœc[+s*Ù³Áµ*×ñúF¯Íó£¯{XË«ç:õDÙp‰aC»þ0ïá)¤ù¶>vùÆCã÷²÷7º›ÆŒUÎdT“ˆ,4\SÏP ªt¤’ÃÌc²®¥”Ÿ=+{@Ë,Érqy™i‘@4Õ Á@Šuíe~í}#Ö=~®ö¡Á o8,›1ããíqŽOÌæ\‘§ãnP‚8Ëb`^Cz HݸvÕ_Š•žIOc3Õ*TÕ€ª‚¢¤ É$¢Cº=.õf[ÔUÀäÑòqRå^TX¨Ûê@“¡y#ÞÈm¹wV“™ A¥Nìu÷‰q(Y\‚Ñi­s…èYÂR¯“ šSô1mÈk†P.c{!J‡ƒ›t{À.6-TFifŠ’1à$YýCçÿ–ÂÄ¡ÁÄ3ŒÕC¢^[@\ÊÉ1¡%…A†à †q(bP¹*„w,4_æBý4o:Þˆ,9]+¦`Hä›ÉÄÔж®›2TÓF$¤/c!ŽäÍTb(tý¨Oaßî<¤ˆË½º/‰B¦|W2W÷ùµ¼fZÎÅÒg&/q¾¯øYIÚWÍWEéoGó¢º@}û夾;ª‡íßÜÛ•s>}¯ëo›{'´!ºõÞ~ôÝÙô&)Œ¥ "Šð ¬ßZI‡oHÌ!BÚèí¢‘r†’¤„¥(Éö:Œ‡à}Í"çõ5Ç®ÊVÙ¤0Ïê/ö<³[á=ÉJzÚq‚Câh©+¬°'Ÿ]?j^CV΄ÆcO…ëÚ0§8›×KÌfÔŒ=ŒàÈžÀÉŽ¤íV/Çg3|¨K7…MÄ@gQÞlOíÕÔó{ŸH‘BîÙ×çå_¹·tµðU°´?:§$®*Ýkè~v«BD>ÛµŸpxb%<2Òö×j·Î,'vê¾Xy¸žsh>‚84qxÀÛ-6µä‘{Õºi±5J+}{-^àÃ$yJðm„F3HÕÏ'íä¨{è!ÊÉ–0PóÒ¦ÀDô‹|å9óB½¥ÆÖA/£P´ ÒÈuQ;¬}wV1s‚SÝYmâ‰C+QëT„¦–Ç8¦O¸ša6î–ˆ<Þi¦ ²Ê-¶—7-í²© œ;W;ÞE²2!Ï› ¸›{ ÞP‘s@tÑž²¡¦F¹òK#—_œz»Â2¥p6{ ƒù@Û4DØÅ§žË>ËÔ¾8‡¨=—ñŸÃ”·¢^ŸXÎçØÒŠ”ˆx…F|@ƒ#(F¡ªtJÁ6ö„óaÿšç\sØuÓõX_=|‰¿·Íãñ@®ÿt,Û^J*Ûì>òôõÔ8AFN\ö¦´¢+´Ý1#émÛ3~’ ì‘{ÒÇ8_‘x’?·}ß¿êCMggõµï*]UÛ?Dà‹—´Ô¼©ÒÀz7g×md;°Æ´]”5Zã©gm3v^ºV;¯ßÔ> ¸?Çg#œjëºIN A燹oî ×êô£¯=•Œ1 ÊüÙÅ5H*¨$(D!À ‚LAZ'rQ¡W¡¦€Š¦…$,”aÑâú:,{ÜeHRçx^œÂZ6ˆ¨©SÇÉ<µÅOÑn0ôjn;ºÄDÓmÒö¥ Î’m,ÿ½éÝÓÛ‚VŸ/8 X™«».˜‰²Ý»Z.o?Ìe_àžûÅÕÐ)®H"RkÜâA:ÑÂËÛöx•(;p÷Ö ô$ÈÅ’D„ìßÝJ¬ë™"SÂhÂäÃ¥s÷¬“˜_T:ÀÖVÒˆfàÓ5Nw› Rh¸KAšZàÂÄG®_kTÌòÙªŽˆbQ¹ÞTß³ ÷åz¿Ø)ä.}.õgœÃVoApÐ0“¦ÁÊÉmMXpþŽCSK§Îµt^­ã‹ýÅæÇ\}»~~™?z¿–ðN[ëˆ&Ý [$JcEµ]s×ÍÐVï¯Â]ÐÀM‘YX¨âÚÒ¸{tL£¦p¾¬§Å½:]ŽÏHíežˆ(ø9Äu‘JI;à UL‘v7DwÚ0XÅrcß½É#²&¼æBß²}[+Ú+ ;Hï”JÖš*VJ³©½d2耬Jl„VΛk¡Ô –«tP¼æFuh~ÆH’&$Ã;‚‹ `—îSÚ©!ï^„ùນ¼bÑÉEWÀ:0ñ´¨Ã¯tŠ`˃•:bäiz^Myj¹ „,Û$Æã3>‘3ãé½/o»=²üNE» Rˆi Aµ¥f1‘ªè¬®áœØÑx;±7çïkl™a\èõ¨ïÈQtF"›¾N (ǃÐý:í ÂZ‚à„ E_1~­Î¥—–Å¢·lWGó Ÿ`ç5Ô±—'Ç“b¾Ø-ä%‘å¶ìßC%*¾«p¦Ý9µÞ‹=F[7ÆZ9L[mùÌ(óŽÅšèžt¡z|q±æGã²!0c®EÄsäÛëÈsW¼U¡F8uurã”ì-di'’ûY S#ÈL¼µãfjcs.I:32™5‚¸8J7¼©Èb7Ö¶B0AmŒàËq–XNVí/¡ÐsIXÑï…I) Q]Ÿ “âÊð÷5ïíÀ8ŽÔg‰R†#$#A¦—7®6~$/ŠÔîùBöŠö"Én†ØÖËÂbµq, { h”À©(¢¡LcÌ•¬ƒy‰rrõu…×í«š0|Ž#êY_þ¬œO®Õyô—gs­Òl›ß"4ô\ r½fËQ @v)—/¶aËA>UèÆŸ­–«Óáá<„€ûx䓾§â3¯ÄñOkÝÑ$ò¼“ø¦é¹ð„Û.ŽÖ›¿>¡lax™ë)¯Åé^ª,+lãꆅ®uó±=3)¶ªnê|{´Yt·±›Zþ(zù1ŽÆä£+UMåFØÆP$BZ+Êä€çSHú«ÖÞ?ëäÏ,ßvGÉ?ðáeç±±. à“óv½ë­ÖM_ƒúö´n}aæTZ3FœLE+4Üje÷l*8(jsÄ]QÖ±$è^<×`­®ÕŒ­r—évék×µü¼-'×Ñz½>:<;j®c­®ý§»^ø~Ò|pþøÍó±Ý ƒ¾’_q=I]”-Y=b\àõ„I@ت+ëhU‘z\:o€X ®º {_ï`OýõùžþÖe^οßåÜ¥®›x•y0z´•C3'gr@æƒ:kØõb÷‹FwH×rY4ÒÅ.| S2Ê*º®â/D£bà&‹W;§{î"Ž¢«³®Š.rSGTÈè©iÜGÀe*¤voþäÏÞ½ÄÒ û^¡qR5_Ã&Zm2(‘ç¬Ru·ìËÝÇ\‹ájôÒN %ÒRI“•ÕâW9cBcGÁ6»×²ó O³owS.6Ãhì"¡uïîɳ|H¶j»k®1%Ý.Þj6Ê•4 ü$:õ.HK°ª;H›H9ÒÝÒ ³ÖëhÀ@%-Ùµ|€&µe ±ØABE‚ß*´"åadÉ|ú1¿¨ÅŠÊŠí¹62—’à5è4;3×άÓyrÒpÛ\ž°=n“./M±/KÕ±·6{½¤¥ž[‹B¤QB·x³7mBL ×úˆûë3dgë(ý*í]MÕ‡U!Îí¨„¸Nú¼}$t¤«‡¸Ìo¤t¡´¨ò!ÆMÆ`ȧ]ä67J)1e‹Y^ÌŒnBKУØw7z ẫ) ngÊ) Té?9Ÿžxhæ¨G+é9o[!@ùÔR¿™‚Ú#…Ÿ™=ôÀ4â~Ÿí½¢úû÷ãOñïnJü…Ç¥ºÇå´ãÇ:ÙnͱdÁvÚæX¢½ä»{ Ï¥¹ XA* {±û¼VVÜsþ Ë]úí’î>ôl¾ÚÑö4àebÈXÒ@†‰‡¤aЂ´N Q¬(nf˜b €e*òñ¦]ÑL ¨'ôÇ~\«ü¶¿Þò]fíÏ&Jö:ík*·…‘ä ŠlP‹þ®òqÞ®ÝtŸ#¿S,fŸœ­vjn‰0l“8lôYkÛ'©%…ƒ.ÄSB /_›ñýñW'bÚoM½bT?¶sÚë#å¢qɲuÈ€ˆøè)à¾ëwÕºÓW]U«tÊ~Žöz|–àaÅç5ºFQ°„Å®¯VY l.gY×Õl_ÿ¹óñ¼ãÒ?úâçã­cõh»z·4P ¼b\¬£;|C ÆÔx¯t‹¬Àm*“9œ‘IK|Šÿ„qOå5÷¿W0b /Íݧ¹V|½&ÁBRcûȈ2ËÂwŒlÜQyx1º«ùPDKW*ª3êL~b›sð‰;Ópñd1ù~Žú¼¡þX½m™ñ$KØ«\÷¤¾eË­§Rc ñ2ÈIÛèƒ.Ún}6ÉÙÅ!Çォ\Þ² ŠÈ^‰âzvºŽÅ5ì’;ôCš@Ê1“8xSü¶æsæÅŒTØ\k0þ=ñ ^šhV>ù¢õî7q<šw×`Ußzùƒ“]ÁyyùèTnY››Û"‚]BBÚç¿™C„Mò¾³]—\פò/ϰ³?¾L®¢#Øeªžñx1.x™Dg÷9÷îI÷qÄšû„¾Û~wFe¸‚žªu¨£0‚ "@ŠˆÓ¸Ã>¾‚§%×Þèuoo Z ÉŽxfË¥ø]ư'ä–Ü»}å»î8¶ˆ,r ″S(*iÚ³2.÷1Y泬(TM› ÂÈ5€FSÓ&€ $y £h pÕ<'æI½Ê{äøq‘­}ºÓÍ©|þµt.n&õ­ÆÕb­uh\I…IÎxѳjƒž¿¹b6Ì©i{º_½ã@àê:~ìr@È ’Éy©Éo#ÂÇ®»ÿïjSg/H*F?VH³BGöÉyøÍ A¬ïÝbе€ žšŠºâ ù“蟫Áq²T1Kÿ X>†ÌX/¹æ›ÿWðG8*š‘N>œ¬ßýeò|ïœo…Ž5«&÷§xß,ÑCi–l꩚•Q4ú© CIîØ-¬ ¦†ód›ÒG¼;é2:ÕΨYîíå4eÂëÉž^Uí?Otõž{õI¾ñ¦)˜–òê=Ó/÷å± lŠüÕRùE·?'ï—ê'<>21§3y\êKoùÃàÚ¬žØé¹ìøÎ[ $¯@A ¡¥†t”¨¤¼ZŒÌ»Tj-Ä‹ûÜ/Ø„ ¥Ð1ÚœÈ>PHŒ|P£ûóùTÝ îIhe”ü¢îë<Ë"¬ ZÞÜŽ x­^¢Ô‚$‹Œ4[:…êòrh࢛¶Vn'{|OElÙûBâš®¿zß–ç­X+™¥»‡]1ÆìÅŽ¼–ÂÖÈDÏœà®Á^¶°3diÐ¥ÏøCH#¶ivYÄOò}(L‘¨£ Ä‹Rj¯h|zÛáÃLŸò’”¾…E¶ vÕA ì q%óu߸»_¾ cÀ{4ŠH§æ‚œÍ ÓÜ©Ûa¡ô¬¸¿¬ ²š³kU,$šŽäpÈj5Õ=ÍIìø]’w=#q†›Áõˆ„*o¡åA‰CZR©½ ¨HXTXHH3âmœ–4”«Õ9ÙÄ€ šE¥Ð#sò*²£BÄÛ š6'ªQL©h±2Ѥq¬éÔSô)-½³ÞÏóÛ׋›•×hHtÌa%PL<™¥ÂܦlŒ! ê…C°’Ù*‰¢ìêÕ›]ÎîÌšŠ)ÃʦRÜ\lÇÀ3µß³g”®Ëïçßù$é'£\òHÜ47ôÐG]ÿ‹|ŸzeŠ÷3A—¸p8’0fÜ U.:ö«N² 9F£œ>,åk–gê‘?ïYòÜ2¹“\M¹ýEVBKJìÓ(!A‹zRQÚ“=9yÄsÙ4Ël»Tԧʇ©á=c*¥1Ç!6‘•°¤ï/µñ©×È} a?fŒ€* ñ•‹’rmÝj ô’^ÌÎ<|Í˜Ø ˜®œá^ðM(‡P„jŽ'[a\ÖXÐøe¼: þ½™‹¸#4¸¤…¼’qij „«[’(@†ÚÊR]©çÔ’ÜÚß*æÖg%XŠT>F•.ð, Ï}Ý¿“ 2§ö–2rÌ<]µ/Úˆ \A´ IJ]2[fJI¥–5ŽvbÐ8hÁŸ\¼.ªëàI2O¥Žré3ëL(…7„ÅpÙ2ní^Ê=ôï¼øÊÜË<\uœ¦Éøþ.%¹Ÿ-&é#²p¼ÇE>*bux{Ü^ê«X,ó[e2ûlßdü¿ó‹ó:e±*»·È3Œçº¯× µÅxÅ`½ úyîÙÆO£¾‡wÅx)â  6Àé)ôÊaØ žXƒ­ 4¸Ž¥¬Õvz9ŸjA9Õj±µh«‚ÐÆŒ¦uY`¼þòÕ–t}ùnû­é?F™jþH<¥eec+ôUxåœÈ]Õ5-±Èã÷²*±½‚kÛ¾¨+Ëcª}1í’ŠQ¬|͵je,rkóUçëQzËŽ9ÖJ7YK”EæÙ? ŠTšuìåâ<7!‚I›ßG—•3-;Îíç°%jךÖ)ÞŸ»ãÙoqàVšàÀA̰ÊÅ)J¡ÅùÍÚ‚'˜øès˸>=›†m3;9ü¯ë©°†ÕN?ò0#Ÿ!Aõ›Ï÷¿ÜÛ‚ ñ< =o2vœC1þ/w S¢øGb£@˜Ñ‰¹Š÷‚M÷uÙ[úSApS¼Ü4uýõ}笈 ¼"p4Öš¨ÜëË^Ô”0Ye«wÃ/UöŠ c4«? Ý#-„/’+-݉gIÔ1ÅEyQ3¬ÓÜJAÛò'û‰ÃÅλkÌ•Ýèé·Sè~Y/î{Ç~&„“YgÜ-¦©ÛdÃ,ËÚ qj¨37†ë§NôÀbxP1† KÐ&¬QõFfrèÝnm¢¡= %ظBXZÄh¥( º¬¤u˜¡a‰óNYG{‡=CfÜh‘Vºöi´Šñ¨?zýÇÁæ¹Ïë]F­¸Iž„Œœæˆø4¦kþG|ˆ"ÜË/ÐýôÐA¬BTmxû¢S©;?õ}é×?òçê "@Œ·ÍMOWóüús»S¶·\b0pD¶Ü!k{Ðz1ü"‹ÿ(  TwŠ(H3¡c¾DÛåÅ13Ø|ñ=ù±k4 ƒÁjm}˜-è›RÜ$T ,îuwxÒíÖÝY@QQûd¬¼© ^¯<”‡˜Ó f1ð˜BÆØónº=µêÔ 7D± EjÊNx·Ö$[ŠP\ï€:™tÙ-¨”#|RùÛ=nCúªµ)·Á€ƒ\Õ¸"ºóòìE}´U•Á3Ž*“Ïûé|ùžõ ~_ŽšS`+`3±'" ,3 è‚lÛÈ· _Duàx k$ÿPaΞ¶qéH«‚;NÈd…°Qn K 6:‰u¾íúÉgßJ^82ÂJÊåVŒŒ‚¸¥ " YAÅ?ÀgÅ©ÿ®zDLÐ$$ˆøx66’ñ,|ò|½Â×úýÂEå-ÈšìZ0ÁÕ©Ú¡Ÿhwp÷!4êâYË* äT£NZ}ѾZôö©~Y_zÍÒ|ò׿统ýlÞÿ5{º¯Ýw‰·&ŸQÿ6GMˆ™´Ý]›œ/º†H©8à-cö*E <$Ìjǵ[Ì÷ˆ›oÈIqÆÎª²4ÐGž>4õùq5ÈhÍ´úÂA÷ 94þbŽw}k†VIÐŒ/L2M­KÛµãŸO×CJt¤éŠDö-ŒÓµ^n7¶ðRT¢f­±ä4”½*RÉæ»P¬?M¡:Þ°—àÓÙï´C'Fi‰rWè!)cå!·wk¢‘$~´“@{ƒë3æ¹´¹­<ÖÖÔ•ïŽþiç²™Ùv6¨(oœ8óCP>ÌÛ`šÍ—çÕÊ×’µ>¿#®rÃÜÝQ×aÅ üU?¾¢öõõÚú¤kÄ ‡Ë/v›5Ã[À‚€VD–Àh†SÇÑHF'b´óŽý‘x?~··5ne‚â D¦2 aA FxE Ï(#ª›LFát_í>–ÛÜuÆH4…UhA.š©YÒU™öÜ8Jê«PÔ¬ P-(ÊZgu#¤$6ŒÍyW²+\f䪴”Bð'PG1ÃE¢ Rá¦Ö ¥Pw1>ºóv°—>•¤«³—2Þæ¬”J;r¯!F7²ÌKLUbLGœL1¡ #ç§?€Ø˜ô½@¿$"˜°È’‰€:’NŸìõxƒA«$b“Ùý/¸íŒéÑ9!¦ä\. }„P)ÿƒŒ ¹lÀFDFAg*e € aŸ ³<!â AMa½ý“Xã†+BÍDÕ*ÎñS 0žz“W…C§Ðû–Ûž(¡©0SŠ%$òÓäÄ&ÿú²Ïpò6š>ÙOgÎóƒƒa]ÝY,‡´Ûý:Ïñ­øÞ}“Ïí³ç¬žò§¤×Y»ÅÝÐë»úŸ3­/SÈäËsì<ûxmtMÛ!«ùø!Óî1$«ðJw¬6`k«~µºãÃ<þïOr' O—¾¿$î¿Îëõ½/^¢U€“¥ p6å¹¶ú G¦H¤1 Rİ9ÙÜÀ5¯?®¿²c¸[K"B&`ÉÊé7õÛ …Z’pv{øãó¹?Âþˆ;åÚ®ÊvÐ9¶Rî>ÄQ3LÅsÀ,Çwt”á=Cj¨jbqÄ+Fü¥¸ã•c<_Ϫ^_Øç‰ûñ¦v‚û‚Îm™ð¼®b‹j•*Bï†Ü±ò¹FâÞ ðÊ¡_öù­EÛOìgãû¯yèbÆÖe&HÈnYpÌ­—³Ÿiw¦ëj!Ú¾iqé©5@A»ÔˆZdÁÝê°ÂeàsàÀ$¥K+¨Ù|å¥åÛöflö~y¢cvüv¨jÑ!ã2„/Fò’DÀÄß_#ƒ$i. ›@“N¸†wC¢:öË;ã›»ÃSß@]È!)çl«¶cÆ[RÂâLÁvè`«‰J™úGv)kßÔùKØ'ˆ[ÁÔa„åõUGÒ¾B•!Ø×ÎÁ©“fÖ.•Y‡4MCT'BdÜÕnðÀ_VÊaJ­X ¹ÏY{~xM¾åDRÅâEr •“=|û(zÈÖ>²4¯lúáþn]¹p÷ HJéá:lGôàÛ›×ÛuOs¿,{½™NÚÅéOžÇ±]ßÈo'fý)q Ì!~fã·8"Ä€æÀ@E B-c™ ëuÒã½»Öéprz½v®1ë¨ÍUE«ÒïÄj°cw "ª’ª%ÇR¬±è•¬>è)b PL?6“XxH0;G9‹nŠÐ€Ô§Á:ŠI~ߊÔLÅÁUX³Z11TkµöÄd¾”feFQ•+åP_^ÊAí?rNq}h4“O›Kß@—ss§Œ¸ÔÛé>Îxk¼ç›mû&Õ¬1µb$DHi@!¼$5…ýS,ꮢÊáVœÓív¤AÊQÊ¦Ø ¢V5 ¯zûˆ‡|"͘’L“u?  ï‘(5­f–=œ0=~Ü0Áµ9LFo»a;ò”6ž%6ÚÒª¯/¾ºüHwÐ-ÊR4_Ü}Î Í"59¤PEa¦mñnpÚX§KÁ>á;éïK!WXdœ›ˆºÅŠ‹2v,P0ÆLL½FCão禔¢ƒ«&æ:äñ3%¶“ô`Ea €-/4‹ ”‰…KAÍÈA•"‘²ó™nü!ŸUîÍz}½ö{Î]ö>¦=#Ar† ݰHår[Ðͅ䔫>l³–¤Û¤³'é8\Tx°Nð54ÃÆNAhP²½O@Ÿ§Û·R©@³ãä*äŒT¸&ìÐ3Ì3oe×Q›Xtйª ÿ)üDÇþ1VÈÁ‘ýòÚóuûÙõxmÆ€]^×O毿nsåCUT.Ò 5ï6 b7„ ¡° »7|(Nã4%ðù¼¼”«ûÛ$Ó„APíQ3Q«U´tU&+ í03ÿÖDßÑÜïÒ¸o–¿µ1û둈m î¡ÜA¤ BÃÄø""+“’äØ:×"h\c˜—‘M‡à 0ÝóÏÅU:Ù[fU[T1ŸâW±/G8Ì b…Z¡#´k^X.¶7Ó•¬pºë HÄ0¦)Á°œðRRmÅÞ²‘°ÃtRzg/¼núØÍþ„ÑK/F[[!/.6fÛHQIK F¥°É‘cf¨d,ÇFßÁëÐCèòÔ±‚¡–÷eñS¬¦“kõ~ôƒð’Zùä}Öm)Êx·±±{Þ/ý½6OÏÑ-\¤†f¸È³´ÝH—+,n¶IxµÊkëñÆr£"˜â|ƒ~çxœª5ï-±4Ø`0¡मLb/ÞÆ‰}ÜX{ãý5ÎwÐ}êпûÿŸUšD²‚€ˆ¥®uxIkîo““÷êDú§¿Þ/‹ÌÒ‹ˆ ßã™á`·=SR+¦¦µ‚l• ¡T”·6° ÀÊU(4,›÷cYÐküMÅÿ» ÿ9ò­*Ù¼8_ÇŸÇÇ›hã-öd_„ažÏ9ßæ¢š‘EN~amté¼NÀZÖÅÇQwq§CKèä8)ÅzsÁ“*ñÿ×JË,ŽJ˜#n?M:Õq”·¹¢™–ÆËðHœ×-t³´AL@µxAe¨å–Ä'q½ èERLLД‰.>Çp”[k<°`ÑKƒ3ü4wSx¹}‘þÔOîÎýu.WEßh}„*òü*"–:wÑ«¿Äùi,°gEãË{?·g²î’¼óòáFæ=³¿ñµ°\x¬ÿ“>úzÆ÷æ½1}›’·í»æN}Üœ³ô„¬2YcáîY¶Îv`vQßñ7á÷Þáe4‡~ :ÈdUëÊF |Ë|Éyt& jÂv¤á_“kÚ… ¤M¿)ë$(ƒ7ˆé«FÉ Œ,5NŽÀlb]¦×ø²÷O·Ç6 Ìåõýç_žs–%‡¤ºgUnœÅЄ(–ѦAZP|wü®H¶D)Àn Yb54¨`ú:}Å'³S˜2ÓòF€ ªºmwº¢š7wA%J˜b;ècöŠ,¥ÐÐM¿Ë’MJKá" ’Ó€w9Ôˆüܸï¢Ï’méÍ0_™•Ç7àÃtcºd°|îÔ\¸åiÓ†è;Û6°¬ è Qr;ö•.°rzò)á ÝÆäqwBõ®D ¿áü1 QsSv7ïÌÊaÓGèÅxjÝýnþ7s}Ò½ÏÄ+wMdSå GPiZùX°[¼AìïÜß«)µ¡#*4‘³6N\u(‰¨g$ãÖ6C¢‡¸‹¤l£üÏKs-ûê/œ¾^õ÷½Eùé"kãV7·%1ÖQiZ£ór¨·ƒŸFd?‹]@ˆ-KYW*[G)yÐAa±ç§ð›„èjH¬LÆ–`˜[§Ç+EíÞtÜøA£×ÜrA$KR·<…JØÄ‰Äˆž©³j0"#€QO$Ã0“u®è\ü8),>-½”×KÍ‘(Ѷ «HiãòÙ…oÄ¿W‘õ23ìõÚŠ!NÌ^ËÁd1ˆ¸&JFmˆ•£ €ŠžCœÓÝRå“V‰U\SÍëõÞ/ôˆÓÒÔ\1vKýLžš§t›íÔgTòôêYùéëç)ΈœËu|iM΄“|óÁò¦yÓäÝ»“«\âø;ÝK×ÅÉN§ù;‡$Ì_±«Ì‡Í{„¸!Wmì—"q©ûZ?Ë9 µnUT@ôíÝ…Wšçe8 oãm;qÑ{úœ‡…˓߉Þ,çpR4r‹"–BÆÄ˜ŒNL)š9“+ŽŸ ×Oö>ÃE« ZT!.äÂÇ\• Ï§Sp{@ËTŠ»ýêuŽO¢àÙýñ}yHÌÖZ˜S¢ŒA¡”:SDÜ%±æÕ*©†¶ îB+ÈýéÀ7 ÿtuÞM `œ¸…BÌçê%;"÷u}3ó¢þ¹4‡î+ðΓZ…z6Ò0ciߤÝ]w­À}YÏÌÏù²•å´Ù—¶üUÔlƒ…Êd‘ñ¨82¢[ÜPºBñ*EcÓd¦‹5Ùõ臶ÿO¡]r~XÔA3l„êhGiM ˆ Á€j U4! {梽9ÛVˆ;D­ æ°0‰2è&{FOÂåê"ºçÒƒ¨•õBÓ µH¼D`úžÞFË Šd‹”… 5`퇢XC´ˆ1¡­Jœˆ† Õ"ê*«À”ª³ÐLÌñõŒÝ)Œ@" ô™|„ׇÜNQŒ2i„„î¨ ˜\T”dF“tž#tª¤‹Òv$¤îÝ;ÿƒ®„'¡‹sÒP3ŒÍxA.iÁ„EÀ“D$va&7߃8˜uTs®clÿ~öÿùGþQÁ$˜s ˆ’‡ÒR¯"D, FM @Ì2Í<Ügnr O@béJêŠN¹Af+F=§êûÉYÏïœüÄç“qÓë©Ò`r(Ö´Ëé«”* Hó A0|wžSåî¿›Í?ÿʹ~{ôu—ó*vqžâ¹rçò—`×oDoø¦|SssïžqætB‹31Í£(¥îœQ0ìÛ»½¾å/ÿp0ßÒñd1É1y¼ìa¡ˆ¨Ý¯%Q@t¡£?Yü«}›ûqÉ\—¡ùÒü²ûM9Ÿ`göMõEüòîçÇ–tÛ@ŠfÁŒDN–ë Ÿ£ÉDW1RâdßZ?=mÞb^òý—ÜGv»MÏ•zó”y§ØÇë>ó‹ÜŒœãÍ_èkåŽ/×ëï÷ßÞø3ÄØ&3|Í"nD˜èZ'¯–•nȦ¼‡ëè PÞúÇyÐÖä*mÀæêÆwÎsnžEºôÝ¿øâ=Þ„üœÐ<öCò™í ¢Ì ³¦– ¿8ŽÎÔ7ž îçt‡p5´ÏùgÏÎ>½¾úˆJƒ+]FY@gwÌ6+º¯}ý¹“1µì^™RSv¨¿âQ•!yÔÊ• }îŸëÇ}·CzÆÁÜ1Šìîpóeœ ÒÐØÓ/xrG‚wµØ8˜ô'½+¹¥cóx<çx}β"ƒl(E„Dy-öX(çB…2Ȧø·ÿá$Ë[æ"ß™ù}ø4˜›B nì7™é„ÐàÙÆËtÌ"M':'A"¤Ñ&£ß#o¸B+9¾Ñ6ãÒiiÜ®aƒ:‹ÝÊnÉ%¬¿Àe, âšÁ<#7ÿ†ýIËpyøKÈ£h³%fþA|^ù»íò[â&Bჵ}©hѾVÊKögȰfŠ”PÔŒ f¹Cækõòz>¶¼m½©.åõ¿þíoØê‡<ÿiÿÏßüë@€ #Vh2ýH¥‡„½R„ËTÊK@‰ã8ðúÏïqïŽóã´Ce$ʉµ/©U5¯Å®Y¸â·ÜÃÝ¢@Ĥe¤ÐÄ^JÚàUF Ma~àÁD•¢b©B=£LÝ|–K)‰¥— ¼tÕuÒ«¶. ˜7…´ ŠT’Áö3¼/öùþçëø%|íùõö±ù¬sÏxeÖÏ‘¬e>ïóùµß¬æ—WOüç®N’@ˆŠV@T‚8 ´ %…´H#„zEpº[á2L‚:ri™i}>%¥>â,ŸØ‘^†š +6iL,Þ_ÇŽ:ñ‡¥ÆiÇ «ôpߌrd¯3` xønsNî‚7ïÛ>p¦«Œµ¾y/Õñ/ŽƒG~hòw°Ð´bM;£Ù`Œa§€m.n  ÷qþ²‰íµ˜{`d‚¸pR¨6" àáøA_Í%­‹›ªW9ÓJ|¼³ìãÄnðr“™®Vê—Ÿù¼ÜÃß|(š…ÀÒ~«ÃÌ`ß]r•JGï›ÙoÍ}ðU0¿‡F÷íS;÷Š.¿è¹ç j(Å ²÷Cïåy…”¢à•1¦h¾­²=rþâëëúÛc…Úà]LOv‚6ƒ[gI†O¡˜ ÐOËÖуb¡ìð¨ÁÚU8Tœ¿ùëú㪢° -ü TWûáüÿå–óHtý˜9tȳ)ÌÍ8Ya…)´ P¨õ. 9•äšP[Ö6XfdR¬‚4`m1㉂`±‰0˜ðueç@îº95'…Hƒç†'²`Š–³ÇzGqÕIàAw"Ÿ¤/¦„pÐh<¨Ú"R,’S”'à¶½WÇ,ü>ý²²F$BœÕ f"Ôu2*€_¨_rª šåÇAÏoª¢¬˜ë¤íè JÁõ”F=nP^ç>¿çµƒ¾—@^Ñ v¾x§”DËìa8œCÐ4B +¦v±ÉfÉáûDßqE‚r®ð€ZŽ(ô‰÷¥^æ;öñ“•®ü}$ /6×ÎáŽñyHžõÍä&ï§:G¾\^.GÅäòIÔFÕzoP#ðr,ðÙw°é Ãô  q§¥qxÛ§]€à´¢& µjmˆ€jpl¸"DE£góY G< í0`=¾|=¯lû÷¨~ÊVÓl „Hf‡ìä²M¯oHÓl¹Œ¡…<@Nw“.Š4AX঄Oå9§ù!XÉc^Ç 8ÓX+ÅÄÀ›¨¿wü£o=¾ôÙ¬Ä1|¼2o1{ ~Žg§î'G¨-smRŽä3Žƒ EÚöaðºéÉ %mÎ;ûݤs-Î~á¬9¯@oЉ»9O·s³«8œ6ÐÚ#¼ †ÈY¡‰E?­XØ#šà&¸µ6Sêw0B†R‰–ùi)8š˜FË*b7^Þ×ò›À[öÞ\ùP(Ô o»APj´씌.PkÒ$²>ý³GŸ'“a­«ç5`¹LB2PæRtSŽ4Xpöƒ ›ÜÒý0ÑÿåzaíqÞ~,ë2dH+¥ÊÂe)Ç„ÒFã³\G“¶Ø‘-VH}?––ª@,€smŸ._TlM´<h†Z£èTŠa*ë\¨žÁ©«¯õ g|+uîg§D‹a•ï×p}¸«ɸgšjXîN˜s”¹˜3Ü~ؾÖ–û{Gûž ZnͲö†0R€z •.¤ÈŠT;IIH2ì­è5^ÏOsí‹{‚Êñîs¿Ç-®7; Æ'^íýœÿ8ßopþ̧dä] €ë ¶QŒ¶u´µFWYŒ-Ah*¥¹t<™ƒ¤uq²ÈKS¤5e\Üw[yö{5ÍŒ]¥ÇA0páXˆ³ÚGg˜ÿF?læÞò)ÌX ¿’ÎL”¸’(†Fž§æ\rž¹3Ý o¼K|<ø‡_àkÌ©šÏ2á÷ƒ.Ø ¦–üäv“¬ÏÒÈσçþoçå€ÂŸG¾š;ý¹/ü ÃíÃ×Ëý||8ÇoõµReH’VÔU'ÈT7ѹ&Ob½ƒàϨì_¨r‚²“ DpèUÓd(¨KúsÂÑ(dp«&ðKæW›Í—÷Wê:" Mî–wC´ŠY+ë2š|Ò¹n]×î&´IG=7#×ÂjàÖìÿ"ʯ@¤¢4MóqþÅå”L’¼Ë¢²TóŠJ ;iÔ€AS5öþâˆ1 y‹·Ž›s[»H h•Nm[«ü8›Qœ/´ÍîôߟŴ¢ŽˆÉ$8b6ž°®æ„b5y›ƒ¤Y¹Ê^7œ V£ƒv;]ã$lA6×J3W'7~øÍÚ1bBK°Õ¼F@ NóªÃ¦võ0t°ÄnïÂu³rx…&z퀚ŒQFrµ. ‚N¸¢[žž˜o¿ÿú'óD<³6]Ú¸ÙÕ}\?u&whiâ¸=šmQ)Nz^™ilÝâU:øßäÜ¿$îÝz®ÇÝ•?úùÂ=âî¸È<‰ºH{!dÞGAë;½’iUÍÔëŽcÀÓC‡Cïªý)•tË€€HFeÂc…8}¥Y,©µ©v”þϨo#ÛM¡D§<Ÿ8XvÜsÞ‚´_!%‡èqÎ/=}I¡º/†úµbcT¥@E×d«­EoE‚hÉ•Ì9Ê«]•^!_OÔLµ˜[|ã]æ"ðò䚬ü#1•ï9·Øý…'%æ`°‰¾P6¤Æ ê¸xX¸3ƒØa(V¶”øEν‰åB‘éIg*¸={Ã?‰ÎÞ‹”°ª{]Ÿ"VŸÆ)ŸPÐCùUå¥Õoûíïj›_ö¤ˆ_~mè¹p»Zng­ëÇv+g|"zàÑ«c·Õ£ñÑNûérF‹Š–c- Õ+iÙmKëöÂfh÷ѽvJˆ+-Ȧ‡Hûªg¸3ôrª&”˜Z؈ˆ÷;^ßÊÛóKTÁQŠüxÌq˜¾èÃb•“FòÞ¤F‘+åJÉàH„Çà=ÖfæQ÷ñ£·u´v%é x’–”‹¦ßL¡ª•`”Â~k¦Ž!±’fç!,êûÜÐÐFI¶/Eb\1§cƒ´‹ Õv1Ðè ûÄ©ÊÓRìyQs«|°ÇÅXŸ·ìÅ­§{D&ŽzúzMì{îλ¾ÈátàŠ‘¯ÁúSA6ú§LiÙa¡ ºKåZÁzÜ®17Õ Eåd€VlÂåR„\i%x˜£œÃˆlaE7v}óý²ÔSª0yÒ»e¯Kñh&àÈ–€tÇp(@khA1JªaÛ §ë›ÂGŽòóhÎFö°3À¶&3%£ÓpY]¾¯;wó¶yk,H¦g°€íÇ\HDT ÁùÜ_Ž+¶A¥(Ä"‹p -*©S•(\@üvK—Å€„ÓÄp¹`žoiŒ|Šûÿíí¤_ŸÃvÍ'B:4%ÞäTÏM²U…0[vD(%‹!I3z6h‹Þ\2g&ænþÃÌè¨Xd¨ sn/žéåꈗxè´Ä‘²©Óþþv€O"HFR)&}ògöoK©ÿeûw~`~¥ïHѳ…i°Á,?E3(ËÁ²±âÐ F§†¤u¬‘€×YÔˆ[Pd†q¦{_[-Sœ‡/6¿îÚöpéÌÕõK×÷Óó×µçÅú‚—§ûMΗ¢çEi…F-¾¢øõçw_ç|O÷¯Ç­ÿîo´?ÏJ®Öá\ò2Êíœ{Òå^ÖïÞº{ß"'†(¥çº”üåX%X0 ‚¤´‰wå '$ßpœ×•šƒiiåÈ6.xP&wº—é˜Â Í“y4\½ªNyoþÏ{<{þð×óïǃw߯{¯n¢}sûVéùöÍã7I‚&Žè¼¤ÐÊ’Cðð’ ¬J[urƒm~ïÄÛ:ùã/úhßùuþ¨oÍ,W?iqî½N™ûh=·fîdû¦·ÝžpÙ7ߦ³lÅ™¡‰®¿xŠãÌz¤nÚCz\Žqýi¯MO£Ròê½MèÀ3$&|¿ä¯ZÍÅ›º3>ù˜”9®¹5µâea„·6ïhÕW†_ôÛH_ó£¶t€{¼fßG ‚Ë|ÝB‹¨dˆgµåú™¬‹ÏÛ›Þ7ÒþöÕ§[DfREïÅOMKË$ˆ]¨ ØÛÙÈ^}¾à±%ZY(à§Sû 8±ÿç4ë>§nnBÑsZ|Âëm“3ž ¥{!éfì s]ñvú°e6½»K*Jt×¥U×Héß}çj„—]ëUËJ·ŒN:UXT•Tùf—ÉÿGr„3¿È”clý¡©â(ÈYÂVÑ´P å4ÖÌöò‘8ó*ç÷5rtç‹á&v¢Ð7¬ÄRŒ(îvÚõ`ײ»~ý”¹ÚP“ÝzÍS N¥VÈZζ]!Ò`;XŠ 2FXÖfD´ÚßæQ–’Ç'Ä£›>k Y¹/·«¨ @¶5@¯rÆÁ°k°B°®âõ4wl¬´,=©8žç…Ë-ä¬ó &+û­•ÀêiôãÐu‘Ñ5F¤TŽv $¢êj E¡ˆ¾¢O¹k% „C¦>ö]ÚÕvZ0j‰qÙ«4‹^‰V›žºB"©kײµzP ;¾ÿŽ(Ã(“%uR¦þ2An³Vµë1Ý•‰°š©ç*¶”š+™éÞT›SÎaìQ'VÀ®üµx°.¿¢¿¿“ï5{¶Ïzä®-}ÖㆿšùúãÝçÝ~róüî½ÖÖz½§ÿËͼ¥ŸA F#  !­;iR$ ‚’_ž²´än§ P°!‡1†ˆ„ÆNÕz¬%Sc7_ö‚1òªœayõhøm„c~Íæƒ#z ¥ûî¿oæÍ-†å7÷áär}89‘#º—?uô,ïê<_fWÛÖć×¶y"ñô[™Ë{ΊùÍš–Ñ'Ù ýöSóˆçî—…Wàž•Ö#Ïmv»¥Òú×<š¯3EÎ"èb¡ë„O“áN¢Íjsè¦ÔÁµ#s}ÀÁ}TIªÖ&ôª¸KÍWmÑGÖWà–™k†»5ÔíCá`–N"‡¦_®—Áñw'˜ùþ‹•Ÿr²žÆ¯v…—­£üÖ§åcßË¥o(!ñíº(ïç¡=½’Ÿ ëù°»ÅÑÈuK’¾@Ëtl[5ŸßUÖ4Ñ+ °À$¨bŒµ3šŽÜW¾‰ jiÿp|»þLûzÁöA/õ1-“ ëýà÷üí·t…S¡ŒwrVR×#“ÌÜ+!¨û`V´ß°Š Çnš]SD`‚ ª¨ ÜCjqfÖÂ;Pgšw>BÜ ¨‹sòˆtØå£P7 H#o¨ÙÏÃR°û˜ž=~˜^?àÇ%â¢óÖMPæôQ6Ž«^=Àe  hæÆi,²£µ¸7`YÒ†„ØaP1ÿPÓ úX¨#fZ&|g\‘ø1þÇ D(ÑÓæ¤‚FŠ351•óÁR 8= VŒá¢áCðÚâ{¨CPÐAÅ´æ“ÊÕÒ£GOwí1íDÌÑWîø¾Ä+Xfð…v1ˆp‘¬uG0 ´®*ƒM ’õ„¤î Ó4­°"Áa$bPQ¤xmêœ{à(0 ³µìÞEi½ýß—úý’¯Sï0ðbãÆóu›uI ?¡óÛØ#ÚÍ\z÷ÒÝtˆ…’4ÈŠëb!E§©UÝÀnz p¤&ôÃ:à×O9÷Gv… G++aíx…Vû:_ö¯Ÿ]mçV‹À‹ÈWP³M™cºdÔ;nòÑQ‘…vK[7üÙÈ0ÓM„„”¦VƒP %P<±iRëËø”³pz£¦¯‘†2‰_P³¹Þ… .Aë3þr}\ïg½^·1~'eYfÖ¿hïc‡·aZäs»áŸ‘›a„úyjþtÕ/F,!~Ò)Ñ„Uê~¶á*X– ý¦oÖÜ'’Ò=X³šÎ £=vÒüÓ(ûÊõEÇfEä¼P(B0 Å#‡±GKs—èÈÎ%½ù(·m¬ uتÃ@!fRSÁÒR[xÙÄ…‘¢¯±o]uwyñ£td4¨:Ñ ‡g¢%Ô(„t)X˜N½g´¯òºþ“ÿß§ÕȺ:í@Ø€@(ˆ -’§üáïó‡ÿ‹W´÷”id‰j2°ò¤ g¡Ž>IÓ3­@ÆMCYhE€E T¼0"£µ±o”R1ü©äGã¹Ø-3Û­¯þ·®¾Ã«}ÇÈwqˆ&¹F&ÞÓp¥½Íˆ ,ãó¨ürþÔ Þ_uõùñЭ"YsÀš @Äd‰!¨Ä¸ºÀš(¥]GÕff¥U–?v^’L]i/.Íè|~û÷óãW]yàaH¯Ó¨r„+5‡²DM€/B  ¢Ä‹¾!†ìõê2Æ@êÓèJ,pá¨/º'ø~§V÷pseLR³¤EÅ Á+91õ—v?ð¼éõz¸oK@â Jä1Ý ¡²G ·úEÉ¿m„¯›ÁþP¾F­EV¦EØ4+^ñ¹÷ô) cãÎ/“[iïê?Ó¼l^£çûéW§8¹6Ûùê~ÝëàŽ³RÒ&wÊšÔаlŠº_ ·Ãtç±zZkDƒ£1Z(½Êá› …aô}o1e9Е¼ oýðS÷¨ñÇßo(›&XÆ‰Š­ íðîI·0Zn=©uA³d®0LRÙ:íûÎüI÷„5–I´æ'*aktÙ©›cýpw½XTîCÿ× 6 ÆùÈkx‘Î' 4E~²é ›'Íãâû–_«£f8aX ªÁ•`çu8%VkZb”§U @µ9çNvŒ³Û§¶«ûyÞùõûmð•¡nåšÀ‹ŽRÑÅì°J/¹¶Qc+2‡E[#TaD1^Ú¯UðüüÄßJ?˜Îæ| ü®û‹ÌW–b¤;¯[™©ôþǺõí/£ò©áKÍ0‚[ hŠÄÚ–¶•[iÔ”A”3Î#›#þéîÁ:1ë%·tv?%Ï^–g:ANjI™Jçd#‰ƒDYp×ZCEaÆŠTBE¥ßÅyóüñ9uÃä91ì‰ç[þ(}•¬eK˜šþ«|𽟼÷?·µ†L»Ñ°ø½. )¢ÄÃéß›w›/a®›&À¦‡nãn¨ùl.îŠÁô£(вIÀ’r‰ª"0‚.9?ð·¼ù‚ßóÒ_œOü‡yí?¾Uÿñôê:„a#dšãÎ'ØË^£¢N¢1]D *#ç ›lB  %½±d»ô Ý£ìtLZ =" •–H.ÍÇ`UÒYŸ¯ß½³cÈ&;ò<´f’”^Û´Ôü½ò¯ 1WsÀ¨ D$±4¢¢!¹Vâ h,­<šg¹íZÜs”äÔV…ö¡±‘(ç»”±™«”+¿yåuxtÛÖûÏ~“?Ž ïaÓ®ø˜¯óJ@Nt=¬¨ßlårØMìaÿu.ÚÉyš^³×¿¶÷æ§ÿ˜ñ¦7t©}Ä­Ù~m)=›üŒy6†)N‚2¡+O¥+*B¬]¬NÁ#óìæ}osÞ¿ºûð‘ óÐÂq{›qà]%¾‘}üûoÿ†¯ÿåùöé›ÛßÐ,Ò4@±A§´ bÒ†C.’0¤ž1çâ—ã»DjF+#£¥Úª@ß3âOy~{_·ÖKbq¦çV,s™Ø‘µ¯;s¬©®*Ý ;ÌšºÎø“ ¿Èö ù&i“ =Rž:&­Ô´4yŒ{Ã'“ëkº%Ó?m WãêkW/šÏgæ=«Ì eü}}?ØŽ{ŸÊpuÄ î+==ºä¹Φ|iY Â~E qp6½æ­;ÒæðÍõŒ—úcìûqý8KÜÃU.¸!¸ì!»“°áíÑ+›#ÂÝiîayOœÏu{^·Ò¢/•<üæ˜luéñ *dá©û>IçsoéåÀÚs6Ö>¡uÀÞ16<š72¹m^U7çëéÜû%{Ê{Ý!d7ŒåœÒ¥’%Ÿ´žÌ2¿ãô¯z8¾zZSÊYWЃt–°8îæ<Œé4»íþ•p¦ÚˆZ^©aï^½íøf²!Ö®]ÄVì 8Òñ5â7Ã#&«­£påšE´«ªœú`Qa!(d#¬Èšr§ >P¢“‘{©ò7 “;qaTèw䜱p¶u·Uu{.\ARç‹þÂ8@²­îÊÌ;Žå®<@S@ BÝ8ÁŸfªÖãáöúÖb³3µ0kÖŸxÝ>/»ù…@²g*V*ª+ÛyÎOuà.%ÐA2˜äÒÝ‚¢ ÅTªÚG ­€…—iúE©‘Qâ`µX.’º-ɨ3Þ=yí9ï#A)Ìw•‘B¢«¤ÐÌ-oæÏéJË"X¹ÒÔ ¥’ªôP `à«a Ú#n¼bÿìÓîõ›nß¾~+Ù85éõ¾&]¾c{ê±yÍÅí¯¡;„Ö’ýî!ýÔˆ°ÔÇŸªÊ%ßÐÂÀ:Ìvë´á—»Ž£%@ù½Îv/‡ì•ZÄHÁ´ôö<ê^­¦‹zÛZûi?‚böʽûj¼ ^L:ôªmS }îVxÝ~fLúvÖõ!°{6;ð숔kõ7·>w1šëx1ëºgfÕá² –Ð!¨ãùiB><þöþl¶ÖOþ†µU›Ö´whP•ƒÉþé{<)ÊPÆ=dÙÁBs‹de®È¯ôwÛzå¨ÅòRÔxçqì˯?ûþüåµê,~uàSÀ_N‚ÌùÆñU’•‚sˆ9Q_PDÇF8LÑn©P !VŒˑР‚U7YãñJÀ45‹U3fÔÅœæÅpêq)áy:$7²X‰ ‡ ãä>Kçhî3õ׌X4…‰á‹ª‹wkB$íñæ8 ©‚X•P¯¤‘æl冲.÷ߦ•ÓÝ™2Imúхɉþi&áïÿS„„L T•+Ê;Q·Ï¬6ÚÛ·ukP:ZaéHìÒkCa*%Rty15(ve|j5æ¶<;<.–/–˜ºùÐè,'”?§Ô¬|ØHÑ.˜´z©5ãÆ~ÄÎ÷oß—ýyõZKyÒ÷ù¿}çÊ|qº¸ÈŸ‡Ôp.¦ï­‡ëý‚©aCØ‘> E8VBÀ—‡(zcR‰}ºîµñüq´½ÛjÕáô&(fI’»ÔNBO9DÍ.;; ]öP©öÅ袣¤ŽQMP¤9‰š;´)mkØM³W4Öîh°›Ï´@Là0#¥VŽók?¿F퀗½j—âç×Ç·7vø8x—h?¯¥Q¹øß/žT¤ë•I åÐ~¤xc}ûŒVhÚ#L^¤j•â*i&R7±gM†í‘kOçæµzñvfš˜Ø¶“šk4"ÊöÏu‡øSÜŒcf0FÚ‰3t¤ˆl¶þ¦¹»šÝõ  ­@à@¥’€ ‰ÐlÌÑšE^šÈ óêV¬ðÆ!žKjªwý·j¤à, öæB0F"¼^O+×'ûD$6{µ³Ê„9®z “ ”&/@¤:h8~Eà¡ókk}r´{'èŠBAŒÐ’³:ç‰lÎtüœ×—ï¶ór1¾ Y’_sјAˆˆcR˜ÚÅËSÉbC%¡ZèÔÃj¹ÀÑ4àc1MÔj V/N¬†~vøó?A3ܪœÉúƦß$:(‚ë:ú|tÁÄpMsÉ ÈX-e"Öh˜ô岯<¢ÈÞÉ©}e%´âÚGÙh ¯øR§sèc ûJR…¤·ò/NÿrþÄ›¹ƒ5,áâšO¶ §u‹fܧ»7>ô¢fë ­Nt\ï!¯ÔÑi}¤Fhg¤††u´)R$¯>3Ëߨ„+ÀyLH|_&‚ÈWö<ƒ.G.Øé»áËù“ü«#Ä»Ô5¦»³åTÏ6TFßn§õ@ÆÞ„ ÆÈ©ø(Ûán¹ôY ­xfl0>+Z¢š½wå\˜jdÌòže_š„$kÃuÆNvø°ùî?צ×à#¦ÆíÀž¦íŒRÕ¤*õ!2ë.DD í€X‹´ŒÞã9 4Á•½H~7¿c‡*¨0ksÀtãcÄŒùJöÛ M²´yÚÑ!dö_î}WsUÑ œ=̉¨ÊSÖ¨ã1ÄÏþ¹[s iÚ 5´Â£Sü©¾Ô üûÕûCKóáRª )˜<ÐSPËÓGò¿;¼ûÞFê_üþù7Ùºÿ!T}{€U)ÞcÝž´QZ\¸\ywêqóW9J›ÏAýœä˜,Äp@EÛZ,ò»ëTJăô€#¤n.ìN÷HGd–À‰§æÕ{uòÚ?Guǯ;èé‘õF{$w‰@ùÊ| wතȉbz©S]oDæ#~]Úw_ú¸·Gÿl=‘,9‹’¦ªž?H†¢þ ôoAö¯¤QVbC ÉNQMG@‘ Ø´žcñŒ¢ºæô/ a9ø ë @ÌÕ¤@ÍL Š­±Cµ›‹"0-×åŠA&VT ‰yqᮯúFÝ׬°bXquYA¤ž„P1C•VJð¶)aE(ŠÞ–™R‡·0zÄØ q`ê“øÑF <×›Üzu©þ:ú:åë¼ùòÏ^ܾµj}~²»í‘¬ÐÞ>ùÝ—?Õ2?žÇÊÉ «nÊçªQw“ðJ]ÂâP®µ½ÛÓðØ¸¥,ƒkÔJÉuQÖÅ*íÉËd¦„«hhãCKœâ†#x{Öó /ÆW»°½škÿ$;â!AÁ–tÁ¤ÒUùܨ¤» 1©‚,»²»ÎÂPŒ'ÎpØ`mâ„ZyÂUI/w;“¹ê¹#jA[à=?um`¸_.·€uû£f¦Œú€në6D<ÔËE´Oo\!5i+Fëºæµ©— {­­jJc¼/6芮(}…Ÿ¸6ÌÝù™sœè[3_;ýg”UrÉ€ƒ²ï}¿;¿Üö÷‚K¼Dš8( .Ä™DJtbm)y(yIåYùyTü¬(¶fv”UE7ÝwÆïc%A‚T9L*51gX„ˆ1FA@:†‚)]’ÇRw© nåñÕõ=¿¿r/xr³µþb=±{×WÍ|Úý!Þo÷sÄýÍ ¯î]¾3qGEì͹6Œã;“ÈHà°Õãuw8Ã{L™ÈúuÊ·°ˆHÌpŸà ÕªZCE¨ ª”¬¤¡@³öä]ŸGžõØýÇŸò¯÷Í¿çèW_º,Ía*+ºlˆA•IéøH.7wQ±Çt–‘:K K%Q„®…$-Ó)ƒ9ÄëèRdcJc iUƒãºÁÈî‡×D+»sïÛ×}¨Ñì³%BÝÇþ?Žˆ`Bt,¢ùÇhEUözU"c ŒEfaŒP45Btxuò¦²(rBªÚ!ø^®ËÕŒ9˜{ù¥¹2ÚL_å yÜŽºÒþóIÿk§"Võ;3G°5 Cus”δŠÝmÁ‰úëV%˜¨Êg4\z¶IUê#.Ú¹Á×`_úÇÞû&Òì,cöÉèWzÏC ¨à$’HöñÉjŒ‚¥Ä©cE‹P&nÑÑçÍßÇwçíg6»?™ b5]¼Ûõ'ó¥ûówÍ÷ü×=^ëûk>úa¯šø$I*D¡ÐMI—Ñ̵™‚Ô (†AÃ4é—êVŒ³äͨ¿áïa ¯ñ6õ 90w%…˜™’6q…+säXHNÄzù˜ù·ó6 ÿ…¨Åb”Á“óG~yØKî–µK.Àt0žJN¶ž¤âÔdíTO•íÛuçXcד²âö–cÐÍÜìGMZMÉ}žIêèOÛé]âÈ…é­ì=¤î†Kâ£D¦>é;øù±íËGÕç·[Þöø’=ñè <Þ`Ø_ßA݃ýÃSfØîä=_]ê†YQ6±‰“ c¯“‘ÁúîŽÔéJ…zzÇSºŒÚ@5µš1vÛ¤x@äoÖSB~ûøxsݾ'Ò»‚˜ÓCóˆ{í0Y@á‚2‘P^ÌÒò2‰¾O¡€˜œó(Œ(I©øé©Ò×õ¡õö>îíïÿæÎŽ'´Äl”˜&jæÏ;Î›Ì¡Ü Ÿ—êÕ°C"¥É ¡@‚ÍG>ÐMû°ÚvŠàޏMnl}®+—uíTw (·ÁÌ€mwfkz&jzo±·p;)‡P^θÊOÓÁ”›Ë…ì>+£†Ex©° £Ô ‚^ J½ð×,'èŒÌ°2Oþx>¢½?îq6„AÑ/¦ÏT”<])ܱø’­ö ÖaB„HûNáAÃBÐXaÀЬlI¨À/uÔ£bN/ÐúÙïû»;E*ZŒ%A€*b4 08"õC>äU¢%W,•Rdå¢ÓrÚ&@qõ¥ V( ºTjÔL…@h@°#½ZÓ7!“¡’ëÄÚÓa Ÿ3Z®jûOßâé=ª«:\æˆÕ”“VŸ`¼üi¼xñ:M< PY¯~ùëÁg üÞ%¹­Ù:÷çÁLFrk¹×µœ|âA>kœ÷x…W«…Ú˜!ðš&•0TT¨~gŽÉš?USÍVõ“ÙÏÜäþ>4æt|0ŸÎ›‹½Q6uÞ_—¼åÏæÃ³9°´ŒÚŽ]Ämî H‚(l6jÙUšVöóõ+MAkÄ!žßp¶Ú]U-ž™cHšjxLSØÏȈÙ@N8…„*çó+{Ì €¯ðÐݪpÙOî×~·ŽÔº²ëöœwu<Û.‹6H»ƒ5s5æDŒT ©Þ°UšÆ[:|BŸ­¤í®ÞpÙå¬ô!3¾Kó“Øü]u(ï˜-Ó Õˆf`Mö×Rýíô#£7ìÜTû„CU¦£ŸùP㪽,è1`´È4¢êœ``¨PþX†#ÌaëÝGí¦nÃí÷vi–mý"À#ÈWRMìÜdJÔŠÒn}6A´À“Í­$vü}@Ñöí-¹èg+ÂNu £û½ø±gÛþœF«‚d†Ä;Á‹(}e~“ˆ´oéÅS¥”=ÛÏ>šaå‰ÁñÈ£šO’Îí?O£2fÆ}¹WE„9ž»UW»èÍÔXP5´mq£Y§¦ cnÌH;„;ï¤Pm¬aw?¸ç/ óì_âý»-?:Ýgö»¤ûHçìxþ±pÜš)¨µÃz§œ}×ÕѰ¡í—¡ jCÙ^88fçögÉŸ—2Œõ6TÏ•d—zÕ›û+©7ÃÐIQ·AKº ÇdW TrÀ2ðÃPOL—®AË>»¯•ÙÑsôÝ êe­‰Y‡ øÅ€`™P9l¯cû0ï(ºÒ¼Ÿ÷äb¤±ò*Žê›Ákžš@›Ú"„íªæªÜ>z[­òS¥^»oœùÐp·ÇF )°òQÃò¹‹hš‘"0ȤÒ5<ñúgO¿Žã›A|…0S׈ïfsñohä縯ÄwûäÌYD2¥JN.uÄ÷cÜNçN*píÚ3N C ÛZ9¦…ƒéÁKÉÅõßò|õ©gÌÎi-ãäŸé/‹q†uý®ÇªÛœ3I” žKŒh;™§„˜‘®ªéXl߈ yñÊÆJÓíS7”ç`¼½Ï%̃SÆò‘ƒ¢×¦!!CÒÍ£ˆ½¶jà.ý©ÖXÏMC§Ûµ<aç÷žqµÐ…1Ó‡ÓŽzX0˜žh`T‰„0„x˜š”‘%¿y À„¹µ ás‰3+ߺ^X•šDFÍd¤X Ôèw^ýɧ‰ª’¢È%"6äTQ†*:èǧb»ªç[ª©àÕÝ}õíÓ—E 8¯v›é†Vž‚‰ ˆÄJþ²G'ÇÅÓ¨š.}¶§øqÊûÛï]à+Š0JAˆ¡Å&šNµ‰½¥ã¼íÅcšB‘ÊhãÕÔó>E-‘µ³ŒŽî?Ü\ª»VS}5VÒTƒc5ˆ@>ˆwíÖáaoÅ×O$S½¨#@hrGX¬¤íšp%U#³³ªà˜áláXÌêF>=o…ê©é P„Íjú¶<¿ùÞ“ýÀ<¡fo|¹9!îgP‚ã˜^OIOÔ¥mÂÀ5®ÍÖ«P膑Ţëñ¥9ÝnP ®§<˜f‰†¼C¸òëo÷÷W>»˜Ï‚Ï)o|3¾ýü%}å•=âÖvÊ[C³ØIðÕÊÒK„J‡½ä@PIIkuÐÔä t”LB§ó…="l“…¸¥×:ÿó›ºÙD .Ë`8?Åã ”Òƒ¦›¶#ñϽz>ö Rª;ÛãÛú….2ï¼}¸­½ÕS—mB+–O´eÕPÀr •v æÞÉ!\£m· C÷U®]Oõ“òFlÂÙS,r©¶V©óªhsawz³Y6¯h®lá iGë@”Ê)’9/ª,´ š¦$]ÆhÞç©úIŽv2^ÎöäQŒ *m¹L›¤v1jÌ{3löcÁkÛØ¢¯ÉŬžSò>éÿ6Àÿ4Á=–¼X¿ ãŠ˜Çð|U”ºÓì/ø$íÓéâÂÎCF¼ uÎÖÙ5o̹¬n 3Ù¿kaÞ9ÿ=¢æÛ/ÏHC×n>¿ëï+g¾ßÀ¯ó}[>vj„Vš´žýÜ™˜«xîSÂni–ÁVŠÚB…$”2Fµã‰S )$¶ “ï`Må+!în£õmûN.çÊÒ15Ápò =߀íÅÈÛ*vñ GÃ*)®V3ØÏÞ)ïl žJÕÏà>sª^üämp}úϧtßqÄü˜Ù]¼arãCl ljD4x8²ã °5ê^í?Ùø4mà%(>š,Y²Ò5†{à Fd Y†t¾DJ.ôÁì1€ бÕÊ=X|VK¾ÍîÀËÃ^(©ÐV–CóXF¦”ˆvCxˆc®˜2›½¬Iš©Øn9 ãE­Fĵ 41HEG¡ŸÊ²¯ò™áÊ6¦Ñ_¹ü"s8kãì¼L/î_cùLyÿû?›Þ;Ý„¿ ýs5C«%U÷¬ùwäšMÛT{)Lø‡ÍëÑr¯Ü¸È\¡ÀMöA¶:SBë‚Jlna||øš½‘šûSۉ땻‘!¢Æ›¿¬IxI¬8¯ÿîé“–¯ÛsJÙVu ßj”eÑ-° ÎOÍ'/²Ó¹Z³uÌ]û«úV]õ|–ܽé"Ä…1Æ{×;:> ¤>›Ã§2²bS†Îc4®5ƒ»ºVŸ©n±Ÿð|ƒöeµR±çª?sÿZCjhmP7“¥Î& ‚'ü­ ÕR–Œ7„£ñ™ŸO¯Ù´X™Žƒ=¥"Í€žãŠqþ?Ù¤f…>­¹±–ØGñqÔ×ü&û?öÇ çògè èPS1ƒå¨m‰‘3¢@GÆ„ ‚¡|g9UÍãêëWý#Ы¼ö ®ð¨~TôKÆ£ßòÅÎ('` PŠl!M)]IÑ@Šv/)s!¸Dvİ>q¿B¬õ_ô£*39{¯¾ïÛ†å°Ýé©9—0Rkhi\k¤’¢Â±\z¿\é5Pìñ(ëe æýÇÍ'ýl…Ñ›ºáFP˜ò&quWn;Çù h¾E ­ GD†¤;È|}¥¯óÏõÄ­ëM©x@¦£Ã"Zè‹yŸ©@Ð@14B Š!3CÇРvªÆMp.cŸÓæüôÒ€:kj`®ˆ¯ó‚ñÇ9(¡ê=ïî–f¤Òëˆ L³h& 4dD@G¡õ@!B#€[E@L*@K”¶©j‰öL+uTF'Ó–¤ØyÝåáïo\Ó‹¯q‡zÒYªöLʽÕóÑ·¾¹Wã¹@ÝõóNΔ¯OÜÏ‘ýÍÜÇwp¦m‚Î`qú†¿Ýý|”Þàü³ÓT¨n甚—ûúÿM>)~ÑýÇÓåô?íç]ÿ`þÁÿÙé}v.Éœ-…  •êUÅ PÀ3G¦à`q楀FêÍûÎpÍ€¤_¿éã~¾ñs÷†Æn¶ÃÜýs6ïùh}‰S•Mn€Œ—•‡OI‰ÖMq9.LoI*åb›wθsŸb‹}Ï¿zÿUÞ¾É?˜Ê6y±ìךw‰U¶KbL@d€ñ‘RõBa*²\s)Ð*˜¥{¤Ø¿˜·ž®$Pj«¯ŸÞ/OéZ?{ÿt¤P\}ž~ÔâËsÊ%ç?熭!+ŒÂºÁÍ èŽ»ÖeÖÄ£`-x^ÚöÙ÷¤¬KñMë©3ÛO‡bɪ’¦t³n/Ô¼iL|hÎ÷ö­“[Ÿžrÿânˆ¦L=ýxÆô½aZ×Äî4¿Î‚êýÓ/üÄä3áOÂOCŠƒ ‡¼cºä²™~¸½hÐ4cǵuYÕ2Þ‘{¾üùëØ›û^¿ÝÈ+r.w±Qô6nMD,RÂÙ46œfDv.9Æ~i†=’Æ'òÌ”n»H‘(³¶z§ØÖ-Û¶îê@‹@ÊÉF‚`3ì·4ûà¤cùžõ‘H7TNAhK_ÙÀr¾+êÌ]¬Àp;ÁÐ>j©l\ÈSâºÆ÷]-”k ­!{Az€Édãµ1ö>ÓÆÚà –¡]›q*±=Aõ§ºWâ¡ZœÏ<@Pe šÌz’c”ˆV¿"ÕS€éøµ¹ò®íç8Ùõí°¸¥è°$1EQ¤69ešHÐ`²Kmõ¬Ù‰’pÂVÑ3õÝ4+¯ó²hÊI)ФºV¶l ¡]Ê/´P¨N°n «Gª(­$õè—‰«¹x!?oÉyO'ߪµ×öVOW[û²·;§ ›ÍYÎGGÚÓýó|êÆTïús ÅékÄ…r!0æ#øŽù‡{ÉïøÄ7µOÿ"|«à½×‚uëŒÛ§DUå¶Ó«»!î ,rÖIy•ìHQ{µ®£»õùû€ùù×s±*‰&àžò¿½ц뾥¢¯ž<žŸLï+n ÇK÷um_Ÿ<û£Ž–,¨hÏØãÐj’–¼'½?-œD¬rKqÌöó r‡Àk‚•žmEØàÉ~©‚‚Ô'‘ UjŸé=0Árt·‰R§·ÕÅèXÿüáÌÁS|C;᯾”ûùÇû¥?û‹ÉëןÚ÷@N¨C9l\F‡ «…qâ\ëÁcuLÈ>£)Xo£÷÷¾dÒ“ØLÏRÑ›RÙ,Å>qØÜýK-f%"ê¡aQ²R¯Jhï=²,£êßw“¾LSÓdàì¥À f³46SQ}ïÖA8a7ç­ûC^Õ†E]/ìâö‡|ÿ» FA\Qœ2B sƒ+ËÌJ×Þ¯½¹ÿíû´’ﱉ/Žl¥¡3ó­EIùs[bm#TH3hqˆ HªÂþ4_F6™—ųû§Ö ÌOü<ª²aêqafœ_*p…8;¤Å³¸HÆÁ!ñª”MÏ0D»(6¥S- ¥0ƒ À Èþ†V¶3®\¢ÝÔ<>pÉ<™çF¹X¬ë Sj/ ºL `€iÜs±Á ×ùVÌW”¹Ãá—ú‹œôG¹Þ· Bšžà`@èÂ{Êá>iNQ›­Ùö@”mhhEð³§ÝÊŽ„²x^[U w¨¿âñvÞ !ÚåÞOJ/ÂMä˜Ðe†¶ä˵ ‡"òÝ^*¯Ç‰F¡ÈeR‡ÃxAqLç¨iÑл?Ù½º·Rýi*ûq¬ÇÇÌWø[Λ)½o÷FrŒµB­@ãØc–òÒ9o.¡å|RP'¯éCb!äÉsþÍsNÞèê2Y4ê1<òx…5ÝÁnAn÷Áü}Ö´ ²«s#Û¢¹¤LÍ‚â¹:¸yþU«ÆÈªÅTŒ.-ħ¾DÚ+êN±ë•º¼Ãªn™©ÞGGꌵ²‰#Ü¥¦LC)UÇmí˜Õ²!mã%’‰mÊA¼üÁû§~¿Ïfâ››oâ _>Þ,—?iHs]Õ®}ñ„ØÕQ,×¾ô˜.ò†ƒx?‚Œ1½póÕl"¦nÆ:ÙœFÍv,§º•¾ÈçÜ#·š¸š†¹ý¢b˜âà§Õ7ë§ðY> "kÕ.ZVŃ>¾·Õ4%ÂoU–´X¬‹sf Xh0 jź¨iõeý…w£+âÔ÷è7oÐ9Ι9®t‚ù–]šJ(ÔÊ ÑB”Òb$ü¦œš&½… Û(@ ûz‚Šîùµ¢F 5|h+j0g3 l>F Œ&…´Ê€”‹œ‰ Fí@µ›] ÙíJ"ñ½ySµzrñ®³÷¿=®Oãün;œšñ+{©ûyûÛ¿81ÿª…Yøúš{Fµ등´­ÌÏûþ³g:]C¤í«ŸxÕÔ»[Æõ®?åÛþåî›zŽÝÔ×®lê”ÜÜåö[_†}ï—÷‡‘ K°ÚOµUÝN(M¹ûÚΫë2.]^ÝYÇüY³ ¹ (èVP¬`n\]°Wf—KQ<\ÎäØób2ƒÞZ¤çðà !n‹ ²EoU{ºaº3›Ì†³²E·ØÕÉÝ|Ïþ…Ýj‡P„´›Tò:뵡+Ý>VºUx?Õö‰Þû㚔Π…EÄ#ÂÕäI¯ÜJãt2+x>¸…¶Wµ,a3)C‹¥œ¬LiHsTD.KaÁvãœäÈ’"vPaaÕ—Ïbˆö™Á`’Z‹Ë™U³wš;ü†V·Aw@C9-OÛÙ÷„ÞJö66€UÆte‹yÔ£‹:6 ¡ ÈÆƒ'AØMµ(°㕇_îï]çúªòk½ümŽÿÌ Çð÷6ð u¿4¿ØO·Zþí‰ÿ–w¬'n?9ìN:ãÛ—Û§îŒÜHÈEÒ.Ê^È€p¥qb¡á“W¥ú晇j?È~°G¸q–ªWßÝ*?=Äüiß1GϼJ…lwKS:! Â^žóû h˜-T´ðqù ¯DžcÔ”¡&׊G«câØœ+?ʲí±w´3¶œ*ÚѹÆbñ| Àç=^e›;aÁl?˜?×qÏ6¡R½ßÞ$íDß4J–`MñÏ®þßd¾‹\húm !–æcõœÜai.‚.ÄÙg>êer÷\ñ3YZúàßs׿÷t=Ñwôt"€Á¤”T …*'3h`‰Ñ(86›ØïcGDõâ>gYÅO÷éÒÙTM:e&©¼ž"tÁûu‘U² ‚`_=ÜôP u´¦bŽ16ÝYVB/¢'–À!› •éÖS‘Âóžka…·Œ¡³ëöÙ†'*yéµ—H œo¶zmBÔ‹[¾ã.™\5úïçÞ—Ä>þ¡^Œšíš§o„û\j¯xØ»u^ jØ‘ˆÚ:Þ´MS S°ihJ”¡KLri>¬k©¢$rΊ‹hÄÁ²‡®¥W'*á@²utæÁàÕ#+P¡¨d€8=ƒT)DÍåêÕ]5´À(¢ ö;.fÇûoªXÕuÁ £¯"4,›0h@‡¥ôl[›ÒĤ12Ž&)—ƒ´ͯ?@:Ý _¤ ÷,~Ô›)éþ‰êåLrW¼®ãüóñü+ü¯Oôêøå»‘Í{‚ ºÝéø~‰«°…N˜FÁɧ5Ðè¾²[ÝZdõ§ßÏ´f.~áÏϺUv6…¤\(RЦPEI6…W™/ým*„0Yíãs'º[ ½œxþËÏïäOWÆWLŽ@—õ@f>=kfÎuð HP<P‚†˜¹PMæ()â!@u;QùÀwÌDÔ·ºÀAáb??‘}N¥‡_„f/Î^›ßIˇÛ;NºÆÐ¡$Ì´‰¾Ûëüq)¦˜FõÑz¿r3sóê8ñ>–ëÝkŠ3¬TÊLdíP•iÜÙ[/$*“©–k¬Ç ·åМe˜¢,眚|7å#¼ºm±äV¦ÊDb“QGªÚb­uéÄ{ž~Öu®\}AçúЛ"#J$nw•0 ŠAŽÅä._Xµte<ºÇ`„ ÏgnßøÉξúp‰KÿªW}â~9ÅÜË4–Õ¤ø‘•5ÿcÞ‡öÛÁLòOqcðúœ'Ç|€Pú.ûs{wèÉpÉ‹öˆ‚õUyޱ”sGçf…#=ì2N{,wyÉx—ÚÖöÔºÕNû†¹n~2¹ï}û?~|8}süɼ?zýÖÌh98ÓZcº!S êxÅ6;Ì=¤Ï‘>Éß9~¾ÓÚ9Ø„%hSÈW äX½ !gÙhì*©9Õ³bÄ•wyÑÆ·—±lOs²WPòä¥dOjb£ÉäéPú..¢ûppŤ_6²ñÈÂm÷„ûyÝxQŠÉÔ¡ ‹M’ÀÍ‚[ôl=±£åPö°©=¸r˜ž©þWþ¢jsEð®ÿ O<ÀATBªCÙ4ÎÉ÷³}uݤßç­C»+?A¶°ÆAÚÓ¶”©¦ƒ÷.=1-k:ÌOæK5®Ë”ÑÛêEÍä-µöœk÷¡„‹AÒMÓ“žz}TÓš)`—kJ  *¨ae»Ä… „¹‰%éI÷æh®7™·NÒíÇãC5uƒuEw¼¨5ù¸·5ð6ñ5C^~/e=ׇ¶ ó.?À0?Ž>š[§Ð]Jtò“‘C;e$yëµÞûîÁÁxlÖo]^š¯_²1R[>ß+Ó¥¸Tl£mbvܦœ‚«â~ÖÇŸ÷½h@¤ÄwïºsõR ¶Cæ§®õÙ¶‰–ªüýãû™øª±‰§çÀ/½§9s´ÜŒÁ•TQR _œ&Åx¤ùöÄH$»$€eÖ"»4ZAä¦,@ãYÂiÙÍ;mºè߈º¬w•ÃÍ®Ëe;?]}N¡"+®Õ-±>ÜÁ”ÀÞëõeá™áç/N~=jÇ—»..Ý/44YjµÉòW­•)Ò) M­èç;iûóUkG1ÄS±b#lÁ·Çoædu¡:@nÜzF„ÏÜð{Ÿϯ¶Î_þ§Éÿûõ‡_ùqíÞw`'ÔÝêªIgT^V‹> > o ^¬B@1Þv95V©÷{ÉΆd}öô·<à‘çðGK² }ã$~G ŸÏnhëõg»¸7þäuißÈö{Gké|F唡ÆU—ýI £l"+¼†¡Š[ãî&VBȼŠsnLÉ® ^)o¬\uzJo/’¦²0œ™i¦òd:€(½¤U ¥ ñÜjÁ0¸ô«ø¬ù ¡(Û‡´68g` ø;䨎a¾•ò…­{°7õ€mŸp·ããqäÔ£#K¦ƒíhçW~>õYgþƒã@òT$Ò2¼rý±;ð`æWÐ`®ãw4V|G’9gøn>z䌦æ­°ï3Á"gîÏ[§qVºlSû€Ge˲‰b ì"H™Ã¶»Ï‚ã^°Š³È›o×kó+€4+…µ°Q^¸sˆ1*ˆLˆ» ‘@ 1Òé2àäʾ*r~dftÓéú,aßòubœ/Z5´ŽŸ:üéQ¹›¼©7Àʇ:Fù+”Èò׺)‡¬çõtèðœ?|Î_¯t4`¤! šz”2X.Ë‚i¹4Ç—å — —ÉöÃåjJ Äd¶ Üá¶{@¤Ð¶9àeG•TÕ¶ lÒ¼¥à¨ôMæóM«®Û0»JE d*R"gwH(ô*úÙ‰‚ö¯MÿãÿM¾?zÿB{Ü‘.òmÃ4ð¤,©EPj Q œñÑ)FÒ­ÄQTõ5k!\÷r¼ÄîBŽtUŽ@ÍQ4íÏ"{ ¯_^ØCað4Ýv']– ¢}T#ͪ(dÏ’‹höAìêöº+ô¤‘GIæu}nqéoåqæ9Ô†Û{.¿ÏIÍü<Ä©tuéÓ3àyU¶ZÞâk֪Οp¹ÏÃ_l” g –ôl  Ms§à´U@¬»Y¤µZ IC(©§@tG™K§`¿Žmåg‘1êþ‡÷/W›%K ˆÑÀ¦†màímPì/Àhâkq˜3HB@H ¢u3ÑTC !´Ð«çíë¯o _È_ׯuŠ› ”P&"(A¦ ƒ¨‡´§ª :ËŽ§}ëµä>ÏóÉ%š’š©ÎÑ"bì‘Ek¥ƒ5 ¤02©Ó+ÐMô#ΤŸÊ»@c®JªD”yâQËD0q £XNµÁêùâZ‹[Ç/¿:7Ù[DZ ¸ª¹—9ó¸Îઆ«=)-›…¢,m×Y)]œè`ô[˲S:zѾî÷šï¼ùÃKßûwh‡oâ…Ö´þ%Z·àÊ­ZcAåd2ù&„€™€°š03é3e#å(•È…;ýÎq(WÑD›ùæ~ø`â„®ë\¿ŸNØàQ fÓÙ˜¥º§ ‹R3`M¹Q‹úa­aÓ»jo8ÚOâ€ï#sé Ûè·L 8u¦ŸUi”T‡ èºFÿ4>‹ØègYg¶‘¤3ÌÞÜ_Ô÷DXÀ·°ÖÑ=t†ã5ÁS:ÕÙfT}§ïT± v$›ðüÑ–D1 â’±¢,›l“«·ÎCbèäŠ; .†F$»%Ôêh ñÄ ˜={(ø§qáô©úßf®ûaþ××òšƒRË-ÚVÑš`têžFùŒ‚Þ’ü÷óÌT›ÀåÖ™gLéÛ\kbÕ]1…v tS2vÜ}Ÿ¬dª»µÒÓosÓ—Ð}C=!»ÏZÐñ¹k+¾÷™|úø•~+ º‡:¨Ö7¸%uóxqÔŸ Ã§ÙÅË“.ý4–&ŒE;{…–òSÒ%³Ó +hE„ù˜‘b8ÒõppîÄêµJΨ. e¶R)¬ªÖe‡òZ ñ ÒÓ¢M%¨ÔäÐs=û½ léËÁÕáÖ^½ªù¡uÚvõ•˜ÇÔ³íA¸Vß^™·&Ç\•–€Ù•¬r íy¼çØœ,¨äs ¥²œ{vܲ˜F¥RI ^m+ã¥Wö. F(EipîŸh÷¤{í$(#f-¬ÊB¼€øÞ+“ÆJ5Ô‚&œ${v>ü9ºŽUmƒ³AÆ©ÂM3ѱÆèWJ´˜±õÖŸ¨ÑEõ+Æ@¤`ÚI#F›Ô&Bb…†u3õü›ýß¹9Kz’[_Íמ6ÛñOkPí67¢, (cÃ*[+ô ÿ"Þ¸)GѬ3dya_í®XNÜ¡}/oþAF0z¡Ww¿m]ø›~caîÛŽÍðyeR}+i^t¾ªzRt[J×0 •²¬LFcÇˈKjdö+÷ºUùu×3åc dS¹Ãl;&$à-zucÊ©KÁŸriËϘ¶qàH‡ë4$ž­Ÿè¶QT'ˆ¢òLÕ¢üRHô`6WãùídwSw¨¥pÎ"ziGÿíˆênÁ»Çµ9–B´|Yg¥g¥FJKûÜ9Щqyÿ°Ú³ú¥¡–®áÿ;Ñÿ3¯ÿG¦lþâýg‹ظùú§†MhB‘a@‰M ˆ¬Ôí*ký–ßf­ œV¥øÙ±-¦.»fÀ¨- ŒòJwÄÖAü¶Ððj¡µÒþgûøµù¬o·Û¸ lAÒF*”…+uCX²4£«‹]ïºß¸‘©Éq#Ù¡aR³qHâ¿ÿüþɯ_÷=šec>–­§&ùyÐŽcæã®­×%]UJ$€@P0HÀ!0pÌŒ£Ž=h΢Prˆc©<2Dmñ+.ðÈ?>Z—‹çîÌšéw ±Ì·ð‡Î«—ß¾p㊰Ûí±^0¡<ï<æÚtiŸ\g•Ù˜J•§TEîôl‘JÆ6M\¯Ý«*P £Í4Ìê[¨ù›{f4=YTþVTÃá›QÂÖš­MeLãQíÏð0Ee”¡¢Y—ý&ÆyR6„ϳI†ÍË­Âå—«®÷ƒ¸Ó5™ñ1-ÎS™†N³Ý²¶@jˆ4&\ þP@áLýÚ&$kn£ï>‹#¿Øgsã÷íß(|o¡DTŒ`aTƒ ¹ãç=ï&oG–€ :ExE{KŠy95'R©R”“aEÚÜÝæ³ýjvµ®J]ß3¬ˆ-€4`ñû3UÖí,åÞo;}ÌsE&õå;Ï4ó~\ëªÍûßK³²$Õ%IJ S +å+‰aã•øÜV>#üh÷ùòÖþ¥{ßüý{K[©Ya Ê Ý\±›X/ô– tì¶\w‘u¨ÆGŽ’Ü2__ÄÒ*÷Cµ<ÐÉ´$xrfæ’’ÝåÊ ½A ìâÝɶsm†Çm¨â¶ÃÉ)=Yô°«À,*ƒÁ¡‡<ÝÉþ*|‘×g┈;»c³vS•=äxvfë¦Õ)~4pĈÃ{ŸVˆ L^9ý~^ε~ÿí'žg&åQI´ B‘ MkìÂÈtÓÁ{/>+û¢¦/TZµÄ¸HÒÕ2pÖô4X±)¦4]YHuVG]ƒjUU1P"kZ*ThD¢Uo‡{Ûë®Ó WžëùWNs:mwUÁãþzZ¶Ãxѹ?G›ûÝ?WK|ŠI,›oxÄò` êã·ÿjf8ÛnKÆ6—°9O'…'äíŸòo0€ö‰O÷QþºmDám5)v?×í¯üº–s«ðаéKkÅ»=ù¹çi—Øo @è¤ýˆ‰¢_ã;×%ö ª†VȧÿÈñ½ºxêÔhn!Ýö^ŽÍ¥GÝ£¥Vê;N5$ ïµ47#кãW²£Ý®·.s5Œö†|¢÷Ós"IÿéOxiSD —€óñ#ü¶a £WçöÏçf¯0 í^Ÿ>ýÆë=viŸ¨4ä:Rkéàê!ôNÎgÿ•á"¶Àê{aæLë˜RPYà5;@,iÏÇ`¦ÙÓ–ØÉ∠Rñ“ó)sNtÀ0Ū{&NñîV-j¯É¯ç¿ùöÿÿ¾ÿ^oMåùv£Žú§!|~>£?þåßr{¿ü ?À¹ÛêEsä%ãËaË9ÝœZH †¶Á_<É'¡Ñùa]:Ÿ"Z}ô"ÃÒµ÷Á†¤ã5GOøüeÕ…«¾p_;¾Ÿ‘ðªÞå ÷vÛÏ‘N>ZØÝ€(h;¿¾á²’añ0çÎ];™Â]U³ÀƒâÖ9Ùo^b‹FÖÖ¬KY7iÌ¡A_vP鮕œ‡/&† ‰”‹¨¤Ýoè„-ЩÛ2ZqSRl‘G-q<õ ¶)êj¸½¦·TÆCbê#/ÅšNTæþÊ‹‚’åFý… M §¢hÓq›=‘‡IÂëuiÿ«‘”Ïš^#S˜x'>]J©žþ€³ÞôéZòax»ÁZj£ª3#ý3¾aÈ%„X ¶iG†dÇd pJý•QÖǶÚ5hÚ ÂÊóäÏæ¾®±Â1ºE´\YÛ¬ðV¼äû­%å”$¡%;æòÅò #l¢õÅö{˜/‹ì®¾~n¹à9³!ˆé¨1?¾~?õ™ÎX90hQÑñ×Rò«ûC;QÌ™êumWùù£ƒnbŽ Îgæò×r5„–uy! å.’ÎêÄž¡Wú1C jÉ FÐnª<Ízº[0¶‰ ¡–ÝtÙ€år,Ki¨ ¤y®:²cü ?WûxX[©ôTœÊbæJ¿·‘l¨Ø¡CCÍŸDËigâ>ÛV1«²~pÑb7ƒÜ ^Cޏ!+hÕ̱:àÊF4ñØ×1óIÂå>/ýné1ŒüÃý£/j»¼Õƒ\—u4)$ÉtØ. õñXk͈ ƒRf¡BƒˆMé)>WH::³ ¼'N%½Qź«UÜzEáâÈÆêå¢y¢á6²Å“H°¯¾î)€\5äWþŠ{G|9Þ˜h©×x}²»íl- >ÒÛÈ"~àòJ~›Ôèu »älË÷Vœ X&§Í(Œ¦˜R¥TFZ$FU¸‘ð=޶)@ Ó¿ïXÜàÌCT€@HmÉ›oøø.”`S¹"$*J„m&B  Èmj#Œ„Ö’ûúëóV}î]SSGBDÐQ›€alGm½¦êÚªÄL”HE¤ÔìhÍ'w;·ä$(2IJæÕœaÏê’Å=~‘¿S¨Ìd¼P!M¨ÛO×Kýâc›³ðÎðË·÷aÇÆeZt~T/_øœyežv³û"n)¼oà°ÎuyéáyšA¦’‰fI³b,PáQ¨$;šòÁëD}¼\Ï®ïÛ5iªdιһoĹ˜l|S/g±âb[  …•v‚|Þ¾i8½~èØà6{MÔ7å‚‹ºµ%¡ ZÕÍ(QHZÌ2å#šêYkÖ¾’¶g“§å™[>ÔŸÏ]L©…G¢˜lH¬<©p—mG;u"³µ+Qzh?9ï/ßãÞ6R¤åÚ‹„5L<îWY#S¡³ýÙ€µ”´CB%åòÑPÆòtGKè9Ü õ LdÓV“ùï ëý[c#¨ªÚ5RŠ&¬ÁÍì ÿC{ý¿qÍí'l«æÑÅ ¿*—Ùø |š?,ÅÄH¹íè«véIn˜€) , äéÅZжtª~yRßÊÍOsõ7ÖžO_ß/ü-ÂL¿¦x¥Ž®*€¶V»W¤cN^qE KÔ(u† #IóçÂyÏZŒ<Þêý tæ{ E‡Ñ–~.ˆ8Ñü¬„;ŽÂh|²ôîJÒ¦ig÷ ý&ØÁ´øšÚü0ÿu©´~[xGïRó…߸Ò5ï§Ù5Yt50¢¹7ìs=dÛÅ)RL¥aÆNP‘ëðl|ÔùÆé³Cok×ÃO±Å-3©i×Ã:µ3m[àk9.­U¶`ËTæCSÌ’ 1‹]ø‹Ão+) & á P«’5ŠþÀò@q±VÓÕÃícƒŽù»kÚ©‰è$NkFPS6î ¾{èÎíê“îmóÔÝA]&àԥر°0ÖbÈ"*MÒ,î6ºì^IòŽöÙ¨éÈ, `¯JæEÏ™U=“{|X$`å(¥°Ä2-œæNÆ}+CXÂpÙHËŽ|Ûi•“ìTiT O£uŒvú]ŒWÀNP—t¦ìqë‹þ÷ŽÂNh,¦J¦‚7pôT;,[‹éȃž§‹|Õ%UAEˆl¶T·GƒHâ­Íp‘Ïî>¹7ãàƒ«î{t9 Ã# ¸@½‡…T…sõðµþô³Ïx|é:›×Û¼~ö÷çsïΓ‚Åb­ÊàkµC}â¶} R+¢Sk´ZmœC-L"ØÊä™Ê6:¿Ì¤,Z…âÊÿÖ {€¢´HU­Ö¨‰°^W1¢윛>è5oaÏ¥;Ë ò—ÿÎço$a‚ À@õ.wfÿç?*ÿS‚oî*-Æsâ½8w˜•¼üºçë?¿Ò¨¦3fÏzáU.—8ãÔë˜<ÝšhÝQ¸Ño¹pÇB%˜Œ±¼×ØóŽý0qE»ÚÌub0s+´±õú3N&…ý”ý}½ç§giÓ¾žõ¤ÿ %_ƒËŸôãÅ»œ>0-_˜,÷`lçLOÐ(.a„=‘¦Å²³4‘Æ@vèíæ»ˆS+¨'ú€ÀÔhƹ.ö§ˆo&¢v(ïÕ\Ÿ]'ý‘ÿ<ýéë¹(¥ªŒWÅüŠ2ToŽüؘÁ š—¿ëÒõüåéìHXÖË@b$Ø‚1‡ÎÅKðÆ(Op1ðL£¥)Ôb Û[Ð%jŠ^O9ÚEš—“¹_š¿S]Ÿè¡ì¼|ë|ö¿}žar¿¦™û×gúçÇ^Õóã[1,×Äí…l¾SAP„ˆG%qþxÔoF=µ÷´¥tq•É£ŽíJß%Áh÷vgäðbZv×9´òèíÜËD%†ê)ƒ­ˆËŽÅ©¥³×ÅåMþÊ=Þ3,¨%àò&`!â¨ÔØšÝɪ0€?\£¤˜H½#‚–†Q^4&ƒ¼É…·{%ŸÕóÈ¢ÖPÚÅ%ÌõJ@[)cx¿1D]‹®dIN©…Œ[Ý›!®RFiCУ¨>œ"u|369¤µ¹€rR,Ub*w7b^½‡ê+ÏßtvW¹'yw…ïòÊౕ»¾g“^’::Cö.{Sý¦½¡6Ô­‡ÜKÆ€_›Ÿ4Œj„jÞ§5¨™9Ù6† ìSãFNŸÚ·™×ûǪZ&MX}NdsH£ÖðqÌ{ÌN¦V46ûÉ­ñ¼2Ø(;Üf8GLKyÓ#,; sÜU$L~·?³žoqIíe´aÖa(,ÛÛÑÂ}µˆI”Ð"ÂEþ  `•£® ,ûÝ´§…ùXªÐèr/ö½5 k8±H¯´"8¤"Ÿ¸¾ö_ò£ SsœŸ}¦ôq\© •õ¸ô™³—é{eðÇ&ÖêPiJ%¦Æ‚¥ŠÄpÝ|¼ßOæEôHåÄg‘”²“<¼J÷(GÒÔmô–x—DïF¹R&¸bW%í l¥l$^樀«SÄ6Ž @Qõ¨#óª¹4H§HwqõmóA^¼ûꫯîrܾ ãmÊumëÕ{PDÂ=hŠ"þaîƒ_ÿ¸Öw©ƒk½^XŒû¹’CÌüÎç£}§“?½­¢A‘–§Zry[å=ŒÌ»ÏܫвVûøêHóƺökôShœ\'ˆ”’R&-1P½Él(cñ͈l7û³!~aÂúdªxýºÐrÃý¹ÚÂç9›3‡7Ü•¸š] Ç ¬X¾×Ü1¦Ñ²sKl³d´kg„`#}ޏ1˜T©_5W•ïõyÍTí?|®üŸWþ¿[õ¿ãêŸ)y­±˜Iá•p %©g¯p1麯£ý2ö\[_ Õ>ÏÞgš×åì ¾†ã| Ke_{ÕMÐFs ·µÈY¬ ¥ºŒ5hàœ±øÏÃá¹ÿéšOtNQÞá™°¶ÍîZ)Ä,…h´…5¤TøÞd=k-µŠƒÄZܪty ;Êô,б7 ¨…«Yl2Ðtïüéå‡îç t­Ê3?ËvX+é«RÁq];$é$L$Œsbœbh¿h–rÇ|ï–Ôâfp‰b  ìsØgȾóôvþ½ÁÞú·»µNxÓPÝÂÃ*‚3+L-Ê$ãævu”HC8Õƒž,ÇË^gt¤¡Â˜ Læ)¹È½1f"Á &jg&¨¥¶ÂKÚ ED) ¶/‰^§xd09`> 1Ó€Ò\=k,²¦âVƒÁI—^-ŠŒQ´Z‰]¶ƒ¤ ÏVfoFVD+h1²†ª %Sðê²>büþ‚þÕ ÚÊYõ\õ9Ÿ[¹¦ç‡Û³^{¯¿û|?·ÿÛñë—6”ÏÍø¼'Sy5Ùp—9¢Hë0,ÔÇñââÛ}ßÜÿöý<ÐÔÿÜ—Úæ ¦ã¶R©ªøã\Ì-*rx@é°P@v¼q¬ÄüRYj’,{B4'¡‘¶Òõ*¶‘`Ü€„$Å£.itNÎLmev²€Vgyúÿð/»÷Úß&¸iO”WwèÅ @)r, ºdÍ’®fp@ÓÆìµá ÈÏ8% …U |$>5‡xºç*-ëÎOßîçoÞÖÌÿ³”ß3eÎç󗾃¼¤/ò¡j¤˜ØFf‘†LeF±1ª1,sNÞ( U¢º÷P¹ôä‚gO¿|íæãüp¿µO±j Ãêz™è.}šËñí°Ó v$U A &€Y¹øÄ¤ TÐu—Kµ›ðêF«³Æ€NQöNX¾]™Ú\I|qòjMÿ¡ó»bÿ¼àgžS!3OŒ o9XÎúªå²^ü|DÕYÉ]#QsCO×âõëà™†jÚ ¤ªMkôà§…Ïjš,ݲÑ-dEŽnãV¿¹@ó ï%Ü™“¾)JĪJšò¶^›²êÚ‘VÔïKë¹ÅV$x,ì´Ò®u/#l”ïx|§½Í.ÝËa( ‡n†G0¶6w®°íؽâ<¥~j}’µØ +QSάØ@š ­ ÔzšFÎCæísöñjuŒcÔ„u©’íº(±Y6踴ï;½‡÷?|½>í&M¦igL¡wª²‡|%>,CV$[ý]R0Ûvô€™¼/§·Ç²kàAÊðÙ•ˆ¬Û•fvçÙ•1k–Èõñšo4!­ ðÞÏh’IŸ{{F_Ð…¤u»÷Ÿãö}zIØÅ€÷@Uhµ8UÌ‘OA+Œ4BÖÊÖ­@Y½h+lcJzÒ•&4eŠ™P…b¬F„È)…véÒ j£Êè:¢L»{ƒV˜ÅIÐN¬Û5ÆI¦Üƒ¼{šb~õ?÷oŸfÁ@xweGá‹?®¯¾8ü«§w>‘ß…z´'ÇO/™¿]Ùüõ’sñ›IºŸŸB–G<"¾«¼ã“-Þ{Ž q?Ÿ€©ê—³óû´NXÿÂ'ëy«=³¡jͬm®Ð&–A®œºrq6ö>½Îi½Ö½¦¨´QóÍlÉI1²DV«—ަÌÌ÷â«Ãå»"°[¤VˆÆ_IâQûvGzÐ6{jµ¸bFrfèðî³ïã$ç¾Õºv~ô|~8çtÀFƒØWT¢º%G}7ç¨í¸5YvšÔõ¸¢;÷Ûé¹ê=¬lw• Ac=r0WŸ'zc–º0áÒÑy£öb÷¬;o#E´P ba? +òóˆfl唎œ®ü¼GCô‡cîÖüþÝzû‡óןü–Þ˜£`i>'¹îÄ”ÖÃu™üÊ«x& ñ’O¯æÞuŒsæt‰Áô 04gÙnÉ]ë—*rqʃy¡3} )»ÈÒ/Jß|;Ç=iµÊÄK„œQnAßÌê²øÃ·Å[ê†ڂϱ´*à½_ÕLàb T rìLÑH¨!Æq‰À*hš´°É5•’®R ¹Õã¢+q…JTæ¼.<8UâäíÄVò´Xå—)W?U#BY÷„kš÷‹¹r=R£ºÎ²[§çþÑ5÷µ)(X±P¡Š{½^p=9ÿÞi×€vâ ÿø(s‚; Gxƒ ×:jUDr=UzùÕÁWÇÝMPг¤Ø¡„°¦Ó€ER«‘rÙiÅUå(V¤ªAâDÑÍ4»Zk_H^Ù>­–‹ºœ 8v³*9ÞΉ^ÙL²S)ª Q$_ŠÅ,Ç©2öW^JEÍoöáÕ+F†N>—¾O?ŠäøÃÝ–¾6¼ “Äj¸E‹cfýúÙ~ºý8 hµ3WWýf ª1ÞC;Ù&?5È0ª£™U$ÉÑçcó°ZÕTÚ¤‰,Ý-Àä³$ HpY £ÌÛ!ÿ³©–àJôH'êc­aµ%þ± Ð1‡å½˜ÏíFxHÛx’ênuk ís8§\’~ý¯±3{ò^yœ& Maj»wÊ@M¨/{ ¦b)9d®æ½Ok<™^ð ,>Ú²ùåCN3œ3š;MN $æR•’ùC#Êþ Á\®ÉqPMÀÂÑ4%“œ1ZÉ€°£)ÇZҽ؅5®5ÇöHÍŠYZÄ&—J¨Þál=îÍ¡SÔ€&‹J[l9Ñ ’ÀÄDh<jç.Œ DÂÉ*÷nëùk½®ù)VwsI„íKOó¦Oè×ǪáT€OJÃê…Þ‹ëq¤æRHÈSâÄ…À7bÔñ'«Õ ´wMQ»Lëçö\Òœ¶ Ê’´X7B-N¤Äµ’¡!ƒêÜ8íŠ,ÐÖsyœ *Å(ñŸ‰ &°‡Üð•×Ì*÷zúê·SÈÑ.£ÄFÚ&MÔØ¥L í:Œ0–0  Œ¶bÇbÕ|«8þàòó_îöúÄxzðT½uǯõh%©Uv±F!y“a|îÚGôúû½ÔVæyœÉkïÇÖn\×2'¹EaŠOà/‘ Ó úÕ¨\ï.ýënéÌÜ;¹Ï×~r¾¾è׬s~u¹Üù)¡„[u´]€DIl{Žƒð-ò^¾rù‡`¨Ê¤»RÝߪÞß“ƒ|ˆä™Å%bšžnU+ "±Ñtî ׭­—:0üg®¤4ÕiÆÑH ÔB#ŠrwÜý…µÑ‰_1¡·f½>šë¾\•¤H@-*áå²FS@%CfÜêÛÓ< c\eˆS£òÍ×9Ä[_3ñ M!&’¹~§2€þY"&Û±{LÅ0èJT«^Ìül_//gO¹(Z eÄ`¼“¡¹]Ýß?•l5oAˆÍÌ œPáòí¸QËö¦ŠĬêùÛ½Îù¸ÖSzãz„;ŒT&¢\yg ŽÅzëëÄ<È›o”¹ÞèûÄþx•^wBÝvto¢Î•SȳÁÜ|ä Îãûºù?lñ¯úÿ¢yc6ëg*ĨfUÕg€£ @œ¦56àØ Hƒ55g)+Ô'f–rÎ9a\Å¢ÇP=WåFS–×?‹ +,µ’ˆ,K@’ŪÐ2TÎsjAL¼,ënÕ-+hf‰ë¨©Â–\Çæ@äð€@Q¤#^õP|0dˆX‰ P(Øò¬š ’qUngÈ÷…Ñ–nL ö¬üGÅð¥õòs¦x~ñÇìÿüþBóÍ LËeeåîÇV&äR9Á´ë¯Xvì®üx ®çãw<ïù±ç²ò÷[¥%@2ÒÎbæ‡2 =0DiSE[…‘DE,AÁ㡊䥲_šb¦•ˆÒ¿uß^ ûó·y¥Žká+`†ûr4 &¾îÎöö©ª<åÝÑHGUËpÑ«C"ŠÙ&D.Ðd—aj†àF©RF0¼IŽ<𛌢òMd A+¬3ï+õ¥ú„#=ÏŠN™é’ÆøÉß(ª•`@•é ¡È! S4È©jgzõ!.nMà(Íy®ÚØêVÎâø¬¿°Ct=X´nBiEäidrxÕõíÝÝ¥ :*”Fé5IÂn„y-ê³(•WUŠ*lâ‰bD&SõûrîðKÑ{_¿m«P+Cûiýµþç!u¹<ƒØðôDR”ûå¤4lWdß\Ôñ´Æ:cDÛÉÿÎ5Ò]?~1Ÿ‹=¬ÃSÆÝ ºÂWP.{_Q…JìON÷)[R%õð>©8&ÑMX`ºÛ¾$ &e†¢D’=¤£.Ÿ5îyñgÀ–ÜCÝuÎnÀ‹æ@áÑàCå’\6ÁÐξ¼pmÎB¦’ ö™qˆGÎ ·]îoèšýhwé줴ÄsÄÎ:³¨LƒÐ`Tä´›òè$¡Ó=ÿ0Š-hÔÓ{Çû[u .XªJ(ôŽfêta4Âv$9\¶Ÿy½]ìvK² `'óÆÔùUµèD(€{Ñ&9ÂÓ„²ÔºÄö½"¸Ù9è8YÙs9V~sͯ÷û|ÑÚü>–€XËi×n;?¥+‚m Ðõ²¶¹¾xŠY±NDJ” Pkªöåœ}¨³{M$u&¥OÊÍÍ{ξJSny°81Q Qkµ¯¦”Dd:mÂL!EiQ!z‰åC!H­½:d Ö˜qÏIL•ê;¬JáóÊOôð^@ {Þàçu>;ø«—×ÜÞ#½£ºÆu¢Ôºðz6Ò|‰N·_ãqòrìö^=8°½g¿.&¸3>»Žî¼>®~ÙñŠþiÅóª‰ìÛÉ8a*ÍutÄßâ5‚5Úíôìƒr5ö€ÉÇÔÖ2or¬wŸ™i nàLèsv6,Ô:Ø4KÔR‘HN£“PêòpÎܨfQöe"#Ó”U©p5W8ŸXȪaÓ«¹Ï Ž¡’i¾½ÁßùéT/ûï\æ …«kG‹ú„]i9 Ö=p‰d†¥ob¹Jûß,*84,äZeЩÐ%¬„%v²$}b¤zZƒ]h ‚=ëáú¸Þ?¼QJ%¥ÏQ2k-ì(Þµ­;šÆÊ—ÇïÅs»ñuõø±Œñ íeŸ"`Æ×å['ùLãí6MÓì  œ»e·‰B¼?<¾­ ðkGN)ÛrK`0 fXÉ%©5˜€\`©Æœ/šCo<»BÝ}àB¼Ü+®Lò˜<#Ú–Š£U|Ùà´u«G¸EŠø]æQé›søŠ÷Oÿšâò,EiеŸ—ÍzašVì'WbAà‘â—N8܉´E‚3«ˆ.ZÔ”žû}EÝÎlà4@óº¯øô¼é)ù²†C6vY)«„³ˆ,Éëž×yš§®õFþåc=Ïo‡§ûŽö¹4?"Õ¶Pr¾#_@ƒ^h‹Ø¦è;ÐO¦J`MJ¡gW«ëÍ„Rvæå%Ã.úk—ɻݳ×0©Ê -Œ4Iée€ˆX’Ñsû³q®Z¦e¡pYÆtóϽñëqÄ—¤“­[æ%±/)bWèÒÕ)ûìý¿JŸß¹ë˜/sÓª‰ë-‹ÒÙÔÕÜŠÐ §L\DvµíŽðŒGìµ …q]CÞ%Šªºh—:5qÇýD„¸GçJëêIGfÕc?avJyøNÎÀ46'¯c å;µT¡Æaóîˆ]\Iåaã«Jc;`d:Ÿ•ž÷·ßxfFÕEйN†9 Ê÷M¼M­ÃnAßLæxUIqî™±ŽPφ%øžoªLæYö‘s¼Ú sH |Y×mL9&·GQ¶A\àE2ÇJ”(XipÚ”#Ã4ÍÄ©{­ÄÒ$š" -²[f”a–ngËĨ@T –Nb1.L ™¹¦Ð˜?dwêR>`ÿ Ç~µ‚r‘¿dF~³OŠfÿKýÕ¯u—ê ?Ú“H¨„0ÁÀì|/‚]ÉÀè­j“=À G\¸rPZI@¹Ü¤Âè…0Åšöð7??¼£@û•b"jV@¬PRáfêÕ¥%͆¬ M#ÁU¤‰B2³¤À Ú¬c )IÚ“ƒl; ^ZÖ•R=#ÔlJY§3‘³ÿ‘Ö M=Fo¿Ò§:"„!"/¨(xA¬+f†Œ#±õ‚/Wß?öõ“ü©ûµ~«_˪4`„P‘ -ƒƒÕÔw½ ì‰(£“UA§VSB@ƒMaÊÒÀ ܦzs$Hèç®1•Pˆ«iÐþQ_¦õòN¸ '÷‹ŒSê§Þï öÙ=3‰ŒÝRð$õ!Daþ‡F»vü1ïý,ŸìÐ0çvÀ£'¯–ËnOÙ*8²áð´Ÿ¿’ˆg¾Âå/Ä\W3ñ~Ýá÷ö¾ŽäÐÂìþݹ]a#gpyüú‡Óã}*€1íÎNãªNä ç>œC,Ã9[u±¥ ˆÜпq:Wþm°™j03G"„QÛSô¤#+ÒʼnòrÚ:½:k€vÜlk÷ÂÕÛpÔ]çՀɭ™»Êw4ÓNŒ UUÅ: ÀA번¦«X'I¦®Ðèb>à!å2¯Iµð”ÚºK7*Akñmku SãB?< ƒfN÷c¨†öゲfàrŽ„@ ¡*PÆ2 lh³—H,kqX •ihlC•&…4JØ|†ý?ÃýQ0„CЂ$£±Áú hšÇ³¥YÊøNÚ€“»äçú`ć•Ô`„”XñTײþ·EßwÛî®ü`XóÄ ß­®,ÐôÝô=ÚFòí´*WÕ û0!à_“ßhöùylß—År×òŒÃEË÷v®,è ~äÝq<º„ H¦•iF&HU7kز ÙôAР*€ëðRÙ(A-€ËqU!!IÑb5­|¦ ‡ qÖ!S‚Â)šìk½ vz˜”«7Õ§ýãË÷—tKШw¥L…!4ï¾)Ò˜Þ– …(5¢ÕÙ Ú\\UÐ ­¥H¢ -cP訴%c…á\ݬò¬.]?»»ŽÙ¬Q;éFW:ÑZ^Ö›yC‹H).Z Z‹ "H¤€ÑªbUà‚ rdAfšWj¢Õ’SfÉq{:ÝCfò51âðÞ‚´„¤³€+ž&ñã¨ø“ ‹Ùlu.3+NíïÒ‘š`<èß%'<7¨ÁcÅWbóÛ=^nΧ~¸®`¸f5ÏNgS׫«6å}VZ¨eXl¯ÝW*öt=xÒ1ŽÍ„²ôÞSáyù:>v¼%‹Ñ Ò¢ä˜2#&ÚÖjNF¨†RÉ4GóF¥)^¥0Û| YäŽV(3s+©“d  g¸ÓáC»©ðýh€È‚~¾™·ËQA2l€L¥ÂÞˆƒ0ZCkpî!Kðä~q/Ÿ•! O…浯¬ y íœýšª!h¤:T•“gs“bAЇJ²žÅâ3šé¦zl$›µ»×Ä~>øhÃ…¾rñØïTäUŒÂô󾃣XÌ-À)$ÞkèS·pg<z#ŠH5Ó…7kUx–y…™ý|b»½m^^ ¶`|“%ȇK‰P†—•‚‚„Kz¬Ÿ$:?^4u?ä›yzt ^Ô݉øXšÌŽûµöW~»BQr_¥‡l oÉùØ6£+ý‘JeMZÌithÐnÔ¯F’ÛªdÂ"K&»ù7üÞ÷GP°‡0^,#ÊšØÆt@Wr„¸Ø‘ì¹8GªKN¸åKcäHh¶äÃ' çQÑŸÞ5ÿµÞ'wÖå…Ïí²Üx÷)o:’Ò*ù{¿[1óOfÑhä?!Uö “‰â'õ¦"8éÔº”@:É’tš´M ”Œø7:—Nù–$Ú…1hSn‘ŸÈ•ãZ~iµMÔG˯¶OA¶”¥iŠ)ëÊlðm]¿øæòè6TŸ-–ëU_U´Ô9ì³ãwö›Â„µÙ>´gá$Q‚…­Ý÷÷õë£Éó¸öyí¼~À4»N3sskøÝŠ ½Ú܇:?“^Ïì,Äãæ®iìöl7R#çnÊd×b»¯_ö˜Q}Ÿ?ŸŠÉL_u»ÖŠÇ!ã®»°<z¤Üg=×}Ê¿Ð6QÁÿÆÅP]<ÝÀ…‘áÁañE\vŠþªóSh#6€À¥€…±Ì`›g²Gö+zÂH,¨‚j@ F’¦sqBH*5êpæ-‡-ÅflËDÉv%Ë.J( ÔÐb¶S„D¤ $1CiaäB¼ "Ó™gE×o/oTäh¢ 2­qº › °Í×F7KÖq„õŒŒH€Qƒ¯Š Õ£ù«f‹K[u^î@cªŠ‡(M@)(+1‘i˜Â)&–´‹5Peƒ¤ ×¢Pc;0cý¡kꇚ†ÔÝF\+l13Oƒ8!¾Nçwâš__yTWÇPÔëqwp¥Ò‘ÍQÙ÷ìõÕd!{¼F…+É÷­Á•æÅ2I’\.fÌáfIgü¤ZoLöÓ_Jb×·ü,­¥ÜH4­cIÊoŸ•s|Aõ~m£€ßµÝ¥wa⩨"ð•D´Î?"M81É ¶kõŒ›¤b3«=Õÿ~Ì_ŽFÅH+OCÕÌd3îÈ ƒH»,#åOï»LH—F4Û|©gÌî€Ý(´l\KSD «s‹§ØÅM„–*fY°X[rÆ«O4²ãv”n×wíÖê§Æksñ´ÓÀ倕(ÐNÂæøWéI›Œ/í ¡TÑ¥‰‘ÑâÚîköëËæ÷}7bb‰7úf³D|ÆØ41a±d%Uuêk;hïé¿<¡J)p(°Ð€¦ b¢æ†ÒíØ·œE¥´ ¨¤±ðí…„yQRXRçD}Föü±WFC”Ô?ª h‚yYr=÷ÿ¼8_¯óÁSÚ]Åú}»v>åìÜ®iZ”[:4Õ×¶—ê¬Â¬ÐÚ”šá ë a —Ûã€öõ}ÅK`wŸŽ~¶öõ ªCß«ëx’ÊqUKŠ®æ¹²8 æÞd €‚ÆG[ËÛQÀ€F0Ô d«°oÒììœq¿‚ BÊËùâ$#&×Ö6ê¸a HÍ^w<Ósi'$ïÝ?3¨ÁÀ9ÔÃI‘o!„l˜v¶ç?ûv—g¶ûëÇÔG®ô€¬õÊÒ'£ú =ñd*?AN¯òI‹/Âa‡+l€¾*‡×`‘Öì§œ¿Ý³Ý­€ |ãíam`£*6q+H„B0‹ÈˆŒé¥ž°§‰7cèÆy¢‘;çâ<í¬Í|îÓ¿Šä×Û†åô˜Ïn¸f n è,µ'”Ã(ëîïÉ£óZ`£ƒ »$?0$Z„Ûußàö°/?•%½Ÿ·¯™ÝÇ_gI-㨖ô›åÍü/ÎGèÓÍÕîUðý¶l^X;I÷…˜CrëyQû)}màóÊ ”î>¸½ÙzÁMÍÓ©÷»Û÷ï}ÝÅÓŠÒ`±~‘‚éy“¹m‰ôAF oÊ/©tEÌ`#Þ²©Ž3ë}(Œ¥‰ŸÖìÜøõw#³Îâx[B ‰á {Æ«¯îÓh3PEÞʼn]Ó«A`Ã@Ñei6³)oýy•^Ï'ÿï¼Ú-ö›€®±H; Ìņ»¨…hÆ‚b € ©Â-l Ä¥‚Mf‡¦ QHÚ‚Ëž)ÂRlOˆ&4F’{¶îäa«¶ÃW€ è0žP@, /I@™ÇɆù-!MI Â+PC* ÇpD–ƒt"/Q¯&ççÚá ˜ñDyíÉ+ &Ö1ŒDÑ•éMËyÙ¿½Ù÷±·á²tx&k€ÌNrôE„ÈÑÇ †f§<ß-Åž{æ>z/·3‰×ÍïmßÀ{ãÇ;a±_®©ñù‘¯%k7#iÞ/Ý?úÊûþëÿ÷×GñÙ,¢ÙÆ¥¡ašsÁ¼f+“°Â×å.Ø+z†#ó‘ãø\½áæ Š7Œ‰‚¢Bó¼¾ëœ†8Õxç ¼¥™*á¾¢fU0ª–lÉCF… Ô–W†ø8ùÉ'ï#‰±úЕ†Âàše*”–6ùñ%,[ŒhMC€õÕPF¨ª)ÓéÙ&ÒꚇIʈ+m€¥.ˆé$»sÉžžm·<6ÉëßyoçXdш§ûÙe)ø0ø6}ôìïsŸv'¡\=É\!izvXìCµUì@ Ôð~Tß¼3ü(žýxZ8‚ TäJ¨úX(&טHÄŽcòÌ—evŸ^`éK‚¾å9œ„_UZ5_h8ÛUÌz“÷¼ADd°t&\–ë9_ídAAÑW-Eën<ÑV‚fö!”š¶©ã:hE–HÈ=éu\ycwL£VBQPçø@0GMŒd0@™‰ 4ù§ø¸‚Æ :tÖd)Þ,£|â*?g§Dbmª—>¨Ñsåt'D ³‚RD¿Úlfl_ E­¹®c¹ÚÝšŠlOÊg»ý9ÑÿlÓñIópÏìõ5ßÏ×&`Ç/Œf/_KÉ[…G¯ûâ=æuïáå’|ïç Š*EÉ€è¸-Ɖp‚Ìñ¤óŸÕe;„4h0‡<2|É/$ñ‘œ—/µÊ&m9žl©N:Ùò-®Ñëí·³UŽk¯aӶ∪=t"€Ç‡<ŠM7Ê62 ×úÏŸè‰S~êýB~®‰/ÈÂÓBÖïZS´îˆ¨Ëµ1OÆVÀéu“Ì +ëªúäçÔò727VÖ莭Øítž —øQoWÚùÈMŽÒÇVÔ¥Î=Ÿ¬DšöÑLÎÅ$Ö†öÂÔÐ ˜Ò¬ß ˆ`‡¥wg#aeeSÕ\2î³æF‘1ç­my™àfñ†-Û#«j;*CªûÊe¼¤êL~aïû%ÞQOâ±'+ÙßR—Zz²¯ìE}Ǧ4ì¤ë¬gÜhŽ%'Ã<³Õc|ž§yl2ü5Lq‹κ—ckGï" @ ©€~¨ÐBëñ Ši¥.0h åÅâÄ Ð¢ªÐ q‰UC§qO¯%ŒÇ!»kÒEsÙiWÊ&¯q4×dS4–,9+oLY-4m õ¥:å û€q¢„Óñ85ù Ü1Ò=¨ u˜»ÅÝ∣wÿ)ͼ(XæùÔW?AåSþìÞ<ð /è°µ´i2„‰Jà;{K~¾žûiø_œçñ•þøåçe:Gô>k4Ýùêø°¦¬bù*HB™{Ãø‹¼‘÷Ç Ýhš]ÇF{{ŽÎî\\¨ÒYñ7×AMysНªæE`1´@Ÿl~dW¬ZË ˆ-å<éFºNÔáÈÅ8ÿÈǶE!Äéåˆv¿‰pGÉ3«s ª€Wè?Šú‘¬ßaäî~X› ØSåìº>GM}÷w9:£V£wJ"V:ï­8ŒÄ<¤ÉÅ?ÝáGŠ—&«Èû†‘`Þ³Ä$=LY²ƒ²”[ƒªH‚AL‰¬„RÇL$S¢[‘© ußdš]LdJ,“Üû’hºÒÎNûååX;Ʋ ¸ÀŽ 5qBÜ«’LqÒÃ>Î¥ÕEâã¡t(c>»¶K.œ$‹=@~Kwè04‘ d% Åná;–gžèØ`; ÕýX^¼WScfçâ=ïðw¹üãL´»`æ0w·í ;Ú*VaRý(Ið8i4l꡼›.ïú௨þ+ð:Ÿ®Ì0–þ&´$¢ç½?àç~eÙ_·¶”ÊaCDÎ0Á¬g$¨«uþÎ:SG¯?VíƇ”#OšoÚ=J”L }ﱿ-ø Šÿ í‘̽«-ÁgT­Ö­„C>zëã*—LÑ(ƹ÷°W)«áb"¥;áIù÷x…ÜS8j•““D)؆àÞøÆðu&oÉá8ïhȆYö0Ç]ˆ-1ƒQŸº^ž×zÖÆìrxtp\Ú.©µ‚!ˆYëÁ«›Íç[¨ÉÅù)ÓI\x Pszµ9 ”Wçܲ^NаÇà|%Ò‹"ºË§.bQÕû³Úw;ØYGÝ™!mÃŽ‡wk6˜vds6u™g·e¿‡ÂnŸ’ýÂDZN: «á§…  ¡–ä<Õäxê¶Öñ¢R ã»÷¸ÞšQ «ãU7Pk¥Æ”êÑÓFÚ–d<±ÄèVµ¯ÀÅŽ’û‰©ËR¹ÊçÊ–¹e£Û×VMqÐ܉Ï>¤cõs:‡ÊÄÆdIŽ.[¨ËÓºDæ`XAý:o v•`lrœ']Ö  :˜EIwì‘÷t Wu^7u¢X_APµ³ J-vãõÔ©5ÿŒ»„/dl/l×ÝÞa'Y!ÇÝWaŽ×ëîŒCÆ£l̤o5(ç‘k!zW‘£¬8ä¥@'t"Nv`ˆM0p£†,J:ÁYç,ÐŽ»ñÆ^‡ŽS AëR Ýøårÿb”¶°Âjõ±eÓó1;*& Sö°WÚõø#7ØÂˆC”4¤${%£´²L@b¼a$½ Õ*ön¸”Ž‹r`…14=òb­=z^x=t€DKS­P–¥¢iP¥Ü•- ”´E±E#ÖÒ!–¨TZ§¥Ì„Aù·ÆEÅîvŸZ\}}™œ¬*µT™x]›‰sta¥ÚIj)¨jZb-RAA, ƒ½Æ( i]ºï_ŸÅŵ+<ùŽç¬ÝZÛy»i€fiŽ'¬ Ni©J÷Ç/P°AHG¶ƒV ÐjÖ&¶F©ñ`Çï÷ ¾Œ­‹E•9Ìn˜;“ÏÞ_jf±ÍÃçÇR[-ý%w¹¤Ç¡'_™;úb-o&Û/Q 1|ïEÔÚ;Ú7ęە¾Ne&T톋„ÇÑ í—>]·"¨}²:ÀÅ­ôIU?Ï=å2Z¡%&ž„£ðàoÜÑã›k"Q d¯”p.éðˆcC]-WrW½â"M˜É†DCí|¶ ‰:Õ1Ýä/GÄ•F¬Ô!N\såGöD0<½ìü!Øœý^6pÕÊÅ·ýè«i­Ëbœ*7ÁùMsAHfÛ´M8•àÁQ‡#q»ñµO¼°Ä—®¸M²'åT?¦—ê©däà@]Aô3N£ª1ºÉ¿c¦®ëGW8X”ê6vqÚ;FœŒ8eŸðÍ(WŽÎHâAœ«Îµ¦¸cfÇ:W‚˜×†¹¼ö#äBÎK_á.$å¡Ïd>Q™flS„E]4Eª¼L´Øg ]¨€  ˆŠ–ëÜr´þøY¨B•ÂmmnÍ4™îºÜÀ‚±Ns ̰,ï¶–5¤ÖÿnXÿ¥†ëbéˆå˜Ù‚T!Ø;rÏ HYÜš¿SçRDø òÂ=tçñÎ#Í×r4¨c±'u¾{ú·4÷¡¤™¼#»3Z³6SÛØ{VüÏüãQµ’Â&?j^ζp .è¢ocÒ¾üÝzZª‚ˆB Ôg£Ñ(h€XÄ¡$Ö'žoE^È”/NëȘ”#OîÊÙ§Š{if&(SÑ‹†_à%hM^kßœÿ íïûüÓŠ+~éU‡ÚGØb&Ò˦ÈG¢À B¨6ÉÉE51 ZAk+S°³KÜÀTRв4/nêຓº[Óòâùâ™fÓ&;ã4¤ºý‡¬ÚàÚ\:­P.îª?M|K›f °9®j+‚@Vs‚ IÄËî{8Uªáß¿Àa±&.,eH±^QiRªC ‹ê7Ýr\îϾ®Õëeê™.x'€jÉáñµûÌy7£ŽsJC”"à7q©b[?÷Þ,^žp‹á^jzñóùÜÜûfÂ[á#ýh¯×ò¯ö÷ïðºÚó—ßÇCµ©S…bz¡hÆ*©À¹ö̦’N ÙÀ¬¨£yæüÔÇóÿbþñë¤1ÑIó†~ö8*ƒÑÒpÄæ9&|hõ@×P U“¢*@ aP±DHQŽ$õç€<(ö½õ§??†÷zdÕ¶(#! Â\*¹ &P ‡ˆ<ÏÎÞŸ!9‘ `o"@‘Z6c¶¨»>ؼ7Û—;^ä%'¤uµ½ø³åÏ'ÄŒ1£¬&>)¡Ë:ë“úy-5!?/¡÷µ—å‚Më¸Uí`?îïˆï/ÂÞ2)'êƒ xðß+1Á·¤­Œv¬ S$Åkøg>VÊTP1è d¾o. Àª-öÀnÞ5×®±RõZéEW>ФÍ\31*3æDy"ŸW«92üæt‰È0±yi‰õÙÞ<äåP< …‘ËbÃÄn.Æ>g瘗šCš¶cÑö†8J¨ã0KF" 2°èHB‚ àÆ5æQ•Ó)oJŠÈ˜Q?8ó€ò2‰WÚ’ÈP‘`+·¢2¢eûŠ¡ÊK§P©:hÒ‡3ZŸúH…“†ç%v« »Æ„?¥Ëš*”ÓðCÉÅFoÎp¼N¨®Û{¢×°(* ¾b×BX»îZV–xŠç~æ¨Ï¼µ¾}k¬'Rƒô¦X²Sýþ„ò¿zG ŠÖ¸N™a‰?œ‘v|¹©‚9ë2¹O4ÝL&K‘‘~Ð¥7©Œ!”Z]éGNÿ#•:«À¡nCôxrËóî²j¯»¦îî}z*€ÝÂ'ð~x]|yÚŸD¸ºÅ i{z2§8>ÐyÁ¶^Ç5vËêæKÎììÃË›´S¸kw•efˆŒô h§«Á©`bÊ/…:Q -öÙ-1V|¯éý^xvä@©›æfñ¯)!PH\z ãe{6™¸ŒA]¶{yü “­ÍwºRUÖ”°Îb©P"Zî1þLv€ai¿ýý7Šÿ¡¡e½Æ¢³`Hy ÙãÞÚ GJw¤Kys:?Z½p7稖êJ¢ÖNÿé÷OŸ]_Âëpl¹óÎ…–(ADJnœ†ªáx õ`I’ «J²ñîòÐÅ2Qd …¹¥åE@…]­v™jÒ¹KV-%M›Åš @M³iºqe]ÏL[\ÞKš»æ( $wÿç篕Ÿ㘎ÃÙ¼jØì±¹2ߎòÎå{|þyâÇáO÷Þ«zÏE†ïž²è#¶WtZüN»±gD#l•0!%ê¨Ö£/´¸¸'±SižÌø@â¬Èzz3³Z œëDÖéL“òDGù;åï±éÍ\ÝaÜH»‹Ç“JÐû´rÜé¹|hq5DU¢-jýé$Ð(еÀ¤‚x:ÔÄ_8ûâþy7Q~2"atx°1 '¶»Ÿ‡£]¯;Ê+t+$ÃjØ3H!² À!}´…ðÉA•—.vg±KL‘×·«"H\$°A“‚ ä8ÐiéÄiÈY„Šî¶ Û£Ã,„ QëgžtÄZëMAõ9&ld4P“<ŠBŠ©^#¸ÀV$A¤`¸œ²—·û“«Ÿ+îU4§‰R™Y胹ùìÙ¬ú,Ô §°HÍÌ*@ƒyllW÷ºC‚h](2•$20…º¨ ^¿?îÞ)£{<–­V±±ˆµ •-Ï¡Š{O}ôô­½õd骪x\ü9´¥­?ûÁ¿¸(Æ,*þ_æÛí×Ýþ5€¿Æ\Àh_SY`9óÑÝ>Ýp)­r¬EűÍÍxIP QåLe/^­|_“.~ öò0`t•’ÛâÁNS‰u•­°3=”x‘òwÃS6óTøÄBíW\mŒ,ÑB-#¹IÞRNk9ƒ°øÐ7ÿ^ ‚nììŽÜŽp/¼ÅéÖÉh×f0”ã^¯°N|¨N‚΀ Z†/8Õœ¥:} ê4HÅÌd8òóà4ÚqÙ i>랢zî„KÑâÛéô:Ʋ:á¢ñÿS7öóÓõJGTÔÁ€lÁÝr5¦+ÌòõïFg !ÎޡѾë.ä=<3×fêýHK‘±4UÅIŽ,bÅgØe°u†d7¬2€Ñl-—Ç´€ ¯·sÙ4×–:¦oÿ­}¾7zn׺EG°.öRé3¹#±ã·qNa½s ÕL3mnf¥Y~²aãºËv7ÂC;üP®è„ØGI(£½¥<&‰=¥Î6,†E^Jvá1xÚi!˜é•(¢v”á‘”½… ?I46Ç3¥ë-£c®ðDb„#"Ìø+uI—˜¾ÂsÊå’ l.d[‘ BÔ‰jÊ ®â>†žO¹gsç§¿µ'Ç{Ó°ñçýÕà5Õh8qf#/ÒœÙåF¹µº6¦5eÙE­8Jm®ç²=›ƒö¹]CÎ`g5qΧ5´½@rR»¼Å/òQÞRÑst^¾„ڸͿþÛö4Uµtl¡Ë¢°B9špÒ•Ù­õèg¨ó&6{MÞâIÜ ( b ù²9Ê'$æ9_¬3Ñ#f…^ ß\ŽjAî‰ü=Æ?-¿£½¯…`(# ÇZ”Ū8Ø.æ0$È YkD²/wV{u5ºua²g”hKk®—`s¶6IÅÃ(êbÆ™ÖJb,)Z †(½HPC 0Âã0Lºçìtlí¨í8õ»Ù˜®ÇyKü(™"×Ü\_N?:¾3óÉÙü¨NÛJ¬j¥k‡®Ç¹.z0 ªtÚtùÛËKí8CqìÝR—ñov÷‰nn¬ñ=¯íØ7Y¶Ö±B‡ƒ¬rÃÆ{¬j£žiÍ>­Üãž!zdÆR%“½/µú¿¾<öúÿ§n»‡xº Ø7ï}s\ÓýöaÛWÚ`2v×i'mÓÞF5ÒöÜs2 er»=­¶÷º¨»$jÁ1þäDVç¥Qå7mØ4¯’?Ÿ¸+0³øuºSVDÝç*$Xaë0(á=M˜ '@a¡íòÉÅqÄŽ³MÚ¬êÚ=vÇ(Q±u!—^äû6Ò.0(«QñÀ@boé^÷VÔâkW(†Kÿ-{/É ÎÔHC“"5‘GY‡kt&7Ùêj"õïÚ¬Ëm¸ñ%¯ÛKZÐð’Ü੬]žÏàüãèùøTR% ܾ*Ï«$qò²×÷ÝKn§ýRù‘O6½º½aßèÀMéFƒšPÜ”dUˆŒp–ýeq}†ó|Ö<‰Ñš ¸Ÿåô|*"Ø ñ¸&¶Z±;IÄ}LÍ‰Þ Ø¡ 4°"šÉÿJâw Æbå1ÃêS×ï¿ÅL=¯ƒ–æ6ۊ£ ¬T³ó÷Éʂ٠ÇwØm¸ý¤žÁ¾G%+ Í{%ÑÀµtÕNÇÍ¡T“;LˆÚ ¡SˆÊ)¹Ãä©TòilkFVÀVzKÑ¡ ¼=+óhŸ:|ÏQ^äUË! ÆS|7¯Ÿ?îß·{ˆi†1£ð Õ Û:ÒIbŠ ¼f|ì ¦—è†$25¤Ô<3Ùôν¾º¥9NµÇír½fŸ¨JÞÕ~¼ÌØ÷ÖFÄe¨+þâ+ê§G~µñ›ÚE.èÔÄú,kv$ïr-öS6Vb`L×(ƒÖ¯ˆWC·š* ± ŠÔòX"»:Ú7_·®°ÓôX΄÷‰]Úƒ]í5[œœ=Rõ.°æœÚÞ™ M¤4íŠ-6[ìƒÔhÈŒ¬bí¡<ˆ"K‚Òstësß+úQ-ž£ñ§™×º”MÖsÌ F2G0òv*áªKhÛ ‹+”¤ŠšJ%I„P+.É7á y9¥ÿ#~üöÓ7kÚÙOdŸ(ˆ¯v½pµîS÷S“Ó³ ÌíÏþÞ÷Ïé«Ã¥¶øð øOüU³­”Ù¹jTnÀVéÄŒÜFBÎ$·j¨ÍÈ(/z¢‡reù†Tù_^„9ïlÆ´kéá|rUA´ÌxåÙâf¦ÌCoöç66.¼~º¯5÷ÛøðŽýoê­(‹K,‡:Kw©S«…a0N®àÍ_n½Yr¼¬Ê S›õ[ ˆ&2Ž`€E¡T“åW¸–×êH/,kK€&g¢ ô`Ö‡ú/íób¾Á½ `(ä%Gt–*Ã6çùøùÙÏóü_X· æÁaÁH+tì§ÚdùV1r3X&ÅÃ_4÷Ó;G½$NT~ù¡ÙÏ2_z|†³ÇÝ&BŽ5l^kÃÞÏ0³UÊ2ƒát3÷v’ôœ1ÏÍ#ë§j¤ `Ã^K7Øí”ÀË+Ê5.].² b  áŽãŶÊ:j´Õub*/N‰s0‰ûèž,ºÌR„ƒÆÈSmV[j\ðbÆçØ£ÙÑɨ-Ý…ŽâSx)Lgç]ùñŒ6Yyêëb žQ†‘ëE‘ÇG?ÚìŸÚçeu!3H‚H±o‘°$PÃ(6PZ„bE`Ì èÍ/õdóƒ·“hif-у ze£b#ƒ€‚5®±ª …È.gn äá©Cå—óJùêI]x¬òÉjoƱš˜Q ^DzØs¼yMÛ;êïv&ß:‡%Ä·Ùþ ¾:±£–š{Do'´Òr%´4:Ä|*ŽóßRg¤£ïÌ‡Ä ÷bÝáwÑ ÒÊ¡¶%Ò÷O{~™K‰P3;Ph† _âüTœFå±÷‚µ´ÄõŒé` ¨K—Ïk÷þ‘²¬Š³¨A4 Àæò ô%¯ÏUº—ÅŒšÏÃWüÊ]ïà *_0°ôcà@FËÔpÎAS·{9=à©é²ÒÛtµÈ¦‹tSI6e"ƃr"ògð3Ò™Óg–§`vÚ¦ëý[6è"_n,ƽW–k·!Ò+vã„”t7ÚzAÒÇ‹Æ÷.Ƭ®T‡ð߸5RÆ BÑIÊÓHkàØÂ[On†xU¤8bq†ÛìÚ™O olÀ‘ ~WÜü­‡ø¿Nû÷ÿ ùò^ÉHdο8yJ,s„àlÓcбÆÓ=Ó‰ ÑE%ª¨ËõØë¼ãÿYX¿õybN`qÅ] 潾®Pèb[•4¶Ûº)ÚkUzj@ëÑQw3Vé–XJÑX]¯K³Ò¬î¾ôLr5{L3u!F×B8€Ù‹:eÙ’Bkª¹XCÓLþ†å ’®rª;€£CÅ(Æzü^ˆ#\A®Õrç,—ÚqÅ U #£…ççÏÿæ÷É·ìîéŽAÒ`öÒI­”êîü*Ì×õ}ÃÍֽ̌t+l‰›tGûæøÛßó£4ÉçvÞú‘:Ûû"Ü’]Ê!ør·OÞE. ðFLCA ˜ƒz‰RHÃgÒ”ÐvX.¿ìtïmÈ.¬©@°WE÷—×¼ÃoðÎó–x_Zö(s´0g_8Ú¹ kÂûù¡¾ôïM]xmªiún¥™~‘¤%m:ÓÞ @Jˆ5àúrúÖ )™“‘AZên~£¢ëɼy§·e„É0oDLp k\ì˜ã–Ab¬zˆ˜EΖ•©Àd:îËaç°Ô,ŠOätø8¹¹ÙW€†HƒØhŠ…²àÚ,@ kܺeÀŒˆ]H_Ÿlr€.«Ç%e‚m“ƒÚœFb9µœ5è– áPb¢´cu#{ø²’#qBÇÂOŠNòßj;ê‹"™© ä>Ÿ>c*ö›ZÝR&2® ð»Q3ì›çBͨZ ùwÛn—ã²ç‹/ì®u³ìÝ™¾zÀøÚnÍþÂáŽ5­5‘÷ƾ0üeÿr,h»yÕŽƒ÷ ?HƒæÿB?p–cnŽõñÑP¹ny¤„ÐBç=åÖ'ÿßÏðú‰ñ-§î´6Õ­T=Zp/$ŠƒË©¬si­ùýkñ7kdÄ?šzNG*¨È¼’0ÊFQ”Žn_«ÊMÇOöZ~ñZµe=­hÖB©j¶ Ic¶»ßJÓGPÀ .“ùµž@ã´î'Ó¹pj@ÞqÞº|;¡j TÿjŒ¢„«Ýv” Õ ÊApœ­i-e¤™_¾pVè›6Ñ3•€‚€,7) *Ua^_ȹ4 £S €3tºõ¾W åØ=NÝ:×ø½!•¨Npã×\ šÑt>À³ŒÚ‡>úþÇÜo¿ý;Ïê‰Cœá»Ïó#ÂæŠ4„ U2æ1lë±4–Ȧ•i¨Ó}‘ÒÁ"Ù¦M.îëõ-7ߟ#ã.õׂ«/S ÛŽ)~äÈúóxµQ}¶êE«þ}ÔýŒ^ v¿»ˆ„s/2ïðÐËÈz q@Ÿ(jÏ0Q°<óp¾\k$'LTcZYhÕH÷f*ÒÛå†%JÄÞœC·áâšüùñ·¤ÒÞlã…¶j 3$Æ=åã¥>®æh(~Zø#•  M@*‚P0é›Gü§Ç÷ÕÛI?S£a«áœšª¹Ý$«¿ðZ6‹~s”׆ݠL=îö3ˆL/)&  œ…éÜý¸óº·¯ëÎñÜcŸ§ëM À D-Jqá;ñ:Å„D=¶gûòøÌjù°&ûÃD«¢Êñ}ûì8{ÙÆÚvˆ û’|$´¬ŒÒ4Í2õ@`Ú0Lj”¤°0 :ˆL$"€Äà€%K¦õ'ìKžWg½ÄgâÀ_oûîû«ál¥·¢€Yë ¯šcqKER5±2óä…å–ÔG6äÆRhAÜrE¯Z$/êä“Ge2âÌC""¾^6«ÑEUM'y2ÔV: ’µ`‰2Mi‰("e„rØ¡ 1x¤Å¤½ š‚ÂW:õH¥B˜ÞHkR§pr^Å\±¸v'º>7O0Ý-ï„¢'`¤7PL‹4¦¶àò.cÄL Äcv[â 3$ÞL" ððEÜÇ¢ö„y}Mü1wÕ®Td(äÜ À}ʪÖ²I>$z÷ŽË^Ôó¸x¹o]œz_oåIé›ÊîA]Õ³rfçö:Í{é|Áþ2°mÑswr9tTš·»íÞön@©'xGæÙžöê¦AôNæýyÑ7§È@> ¯«íñÁ9g˜ì -õ#}B£µ FýLë„&—oyfœ¸At¥‹CʳÝ7£)ïj–¸¬¥Pk8mÎEÖM¸kƒ3yƒð_ÍÇ*ÅoKtMj.–„ÕT†s¥°~²5Î4»Vj!Oå ˜zj!‹uS²ÖÉÐBÚJ7¨WOAQkRò•xØNµ’¤c}àdƒžæÓYgLG©/êÀÒ>—Îïxˆƒp±¶Õ0×§‡\< ZÌcIV=)–IGM4 i§žiáš h©j%¸ExèÈ1°“béËÓ75†¤izº!¦ ˆ°É¢Æ’›±Á´œ'0!ÝcÙ¤èb˜ “ãïu7üúãÓÓµUunå䊞͗±/`ÍÃP¹õ²F7j¦…Ÿ4Wy`ÚöÛ}qˆ.— Ö™=ÁC¼íeMˆÄ»ï®}‚¢éêÃ%|ªïšN댩CÑTÁ3_èŒ Î¾´4Ð&üÇ'Ûôæm¶8]#y Æ¡ž¢ÊâjÅJw‡y0÷HÝ˽a2l,ÇT®ÆÀ\¾ðæÜî?m­óárȸl‡Ëq|q\{Swee[gtEÐO?}~ùu±o˜O-—ø*{„'RëÌÜ}¶n̨‡™É•Øø>ýËþ*]ÎÃ,`¢T·ózµ!¢Ä3™Q¢>ïÂY¾{k¨XX:D)ÚóÈSs_ãxÙº)ÕNa`¿ålzç!Ÿ oû«ÈKô­\èšIŠ\«Mñ›ŠõË2h±D¢³º®ÿÀóq޲݆9”ÅAˆ¸¢1N@‘‘Ù%J—™ý1gR¨d©ä‡{3Áô”b@ ¸‰šPq#’ï8üå,@>öÂîw>öý¸5hª¼ÆîCGcßg&›kþ“/üúÀ®¬\ü^×þ[‡Ï~¹êúô¿½ŸµAYÂÙ`-Á“6® JtzI5sÔV~Ùµ¨²±ˆéð˜|9’TyÄx©·ÅK¢¦OXK®™›UŸ¾Z\nÁ±zê[¿~nÉè~åÌ߆¢û*@‰Ce”á*$©ûVÞxÁ"õªwLWÊ•µÕ6{>à€eþñôäl^J}Žs[/¯é(*ÍMÑID…%»xÒ+`#ûø >H(Ó«©@!(B)  ²#˘ž8†E=pU5ÔE~S€ú¸\AÐ’pRî‹õõ‹û9ÓÚî1šªo;S/¢°Ezô¤Ê‡ÝÄŠY’¥Fn‰‰àõ|ŽxI œu]PHD£º¸; T⇩Ö&°GÜ…x%Qȉ˜Q nºyA0O`63pg ’/Ÿæè“Q… 9 LĉÄïìý9Ó]›Äý7ô³¹ 6KÛ=î@1îêy4i¥Ì¹z4°èu.’‘FȤ+ê†F‰ý lD1f{Éý?Ó•¸?šÔ?“›;êîò³Ç.# TÈ7qþªN‘^”rn”Ý‹T¡ÊŰSt«\˜®1'I:ÌÖS๬×>jŠEî·˜½Çærû÷Ü‹oôX®xEj@{DX«p]U4z¯•<·çAgA—ï"-% (qCà“鯾Åÿ Ñß…ÆJïÞ“Ú8JÒ¼Üø¨9Ì"_š ¸ÝILmx͸G²ÊU¹ËTi[§_q_èCÏ·ß~>ãL=F`Å#|wp¢o$"z/ PbQ 1@…€aP{éCÖ‚qëD­4ªÈd-ͼrÎn3E›Y”: &Ѩô…­£ÊŠ06ÐP‘^bI¦·•"UÓÓ®uHëÑ%/¥‹ ¡0ù!w鈲B‚òŽ_„pÝë»÷ûÄ:8µ×ûFÎMÖ¾Ÿsó9sÀ®¯>—÷›ÏÖ€Þï™䎼ñÝÊÞ¥ûzÜ çÁøÚaãäþ|›3pçYú`çWÏ#Fôé¡!àÞÜ{€o•©ÕÉc kg%–fá2§Û`LÒ£CvQIî¦gŽ‚ ‡¢ýüDvÃîÒa¥×Ø´ôºnôym¼ÝO~;°õ\{14“*XyHªtç ^ƒÙ'ŸìbñͪçäþòÔwf7")Ͼa-¦‚ ­÷Kã!­}xza±‚ ·÷r\˜&Æwè&¢Øè‰kÅ„8À šÐB|%BM~AÓAœ•© P{ÉŠ+û Ü6bbÎXŒcÀ´°¸©ÖÄHøL½éœî’æÎ’Ùk ª·‡Û“5¡8ÛÉ]¬BÐQ¨ Œ€ZHË)±‡Õ@,PCO™ ³Ì¦¨>)8 6¨]]„jõÂ-Âí¨Te3€@Åy]8,¬ÞrZ*ìWåì–ábE–š-èt™dä‚C½áüH[t¢JxL´>ÁA"àØ‘Öd-Èú}{¬O×ÀÇ ¢å~ŠÊa>õ{n°›qhÑv £µÜfþ}/ʵû£¯Åt°&dAXv‹†ai¬ÇÑï˜ q#GÆ*Ocó쎓[¹®î^üoßþOäyZ÷q÷³ä[Á‘3pxM§Š>5o×WYQʸݻÔ"Çæ´4þªG×Výd=ØPݨTî”c¯|ÿ›ís°=ÓãÄÌJ„5òŒÏðäž í£ô4(3¾Ž-áf<_A@*œë€ŸO{¯I‹@e…Utp¢ø[æìÐ+œÎç $—ƒo1Ñ·âlR3y@6jîµÖ Z[õ¤Kèš-qQ™–îëääÞ‹Éôë÷íù«Ó¶:Ô£*seT°c`=]¤ÈN~ñúêºï'õ¨„Õ¥ ó\ñ¨õÙé5‡ ö”¹ÒM"-”ÉKnŒè«•†_ðB]5‹ˆO®Çx°¯qÈ¥<u|†ã(§Þ*úùÛÂE¾Ü¨èg <ÞfÒ|•ôXL€ÕFµxæ¡8dTÙŽSHMøy€sž]SFuÿÑþïãðOMÿ<«÷‚‹(e ÛV=ÝóR¢HEãȨ—¢þð²RïÞ~J)È‘§’#u•Fc?çŠ\FÎ.Hÿø‰: u8ba*6Í<ØóëÛ…ÿJ½5$Š=†e¬¬ªXÌtÅATá•/×zìÙu\‡£è`\ÇúÂ'0â,5TߡկÏz/»ß­¬ Ù”cèyøIʰX(kRægaü`¸Ú¤šû(›óÊΙŠÎ C Í´W1$C“Uû|¬o“é³Qdß¼ïõàyǾjHK6 QŠ@P‘Di¤ÕcÅC¸šª®ª®\çë¯ÖeÔyÝðµ¦[‘úÖs¬£ót(D$aüJœ˜¶XúMO$b TƒÞÀÄeTya£^ݾ£7ÅJè_iâQz9~=ÄRçEÖ4E*×a„‘ÄQ"R¥ `„1Ž=àØœ(…£`&jcqÕW« ¾Ýòªjuv1îV­ r„ûÒ¢ÍDÕQ‚«í¸e) 󼀉E`<ƒZp*D#Ì Nà{p_™@åó³ÉÃþ#æÎ´]ÖÕ‘Y‚: ÜpCkcKm=”Xq5IYWöÇäèX†àT÷ÐQüšé“ŸÏ÷UÇæ´_O´±ôu¼k|×pŠ;Á°•ƒ5ȧñ´¢¯Qo˜hrcO Z0¡QG%Aó!Œ’Ëa3W‘ÍlŒO«JÄç„*¿Q•‹Ú*­J=öÆíL’›£éH9_I6üF¨@±M†ôI4mÎj×JK£ßÛ߯þôNl¦9S¹8«”mE2µ­Ä`-¸•‚‘ MÓvst©m§Î øô‰¿ÓÓ8œ»Œjð£~¡–°ÊñááÖ#KšË P$-Ö•·ôùüáó÷§îŒ½‰õ¨e…c¯´ÒÔ¢!&""Zñ{p]‰ ƒ$¼¡ì/HaªÙ!ÕÌf@XÀ5+™bÆðÓî~×¹‹Æ;?ÞøãôáÞk»qß½³(•iGlÓƒþÀÏÿãM×mÄ¡<ÒšÕNô=µÿw^ûA)Y½=UD{ˆÒ!uJO`C['U…ZûÑÏ×öz‘müá9¨_&ìt8­†žó×Z[íyY¾¤rïUµCiáÎÍy,ý,â€?Ÿ£§¦?‹|Y|¡ºàKZ;Ž62­ À‹`š$à› u eÜ@«”©xP¶L$$‚ƒêñz¸Q©TÁ`þØÉ}ÑfÖŸIö;uý\3—I7Bá'L|ÿl›w÷T1âŠøŠ©áPÌh`±°s…Ë'ßwk4»ujNƒbV}õ“ç»ÿÉIß>›¯¹n²<Ù¥<œf=0!³´ _±•[÷ ˜˜/†¼>~å¼>Ó­FNJ"‰(@aì•=-×/Ä>º~ÍïC¹¾¾óóÎs·ü­{þ¿÷î¯ÄÜ,O›~}Ê^¼×“Î=û!œA~¾÷k]^’ùuŽŠ?M!#SM2 ¤:jÑB %^§¤3'â’bØ€9‚iÒy˜ZVf×µíñºWÈj¦’0$I3IN0 ¨€ «¥&,Ê¿%ý³2fà•Á²âTt“ÒØ,þ»ñ˜µ ` Äö’a & `6S¦+Ø8;dÄæxõ{Ó®nÝ-Lª ’Õ1`¬(5k9ƦÙW ×õLNÒÝu¨0‹âÑ©VZv•Z ëŒä8ÞsOï)pliþX±Ž(lv_Ýåâ¬)C%#¼ðÉw_¯‹{hK}ñHÁ q¾”a$m¸à%‚ Œ &òS­b½ºlNÓùöíP·M+¿Ê¶¾¼;Ê9šÛwûëîÖrÏbãÙiIušùž®”êz çh7ŠÂ“סì1‰BKæL °C©'‹…C›)2â7àÑF“·yúb60[U$JµÀÀ…— D”¢+U$Œèøø-íà©ifñ™P{Nò¡ýákIÄÁ€‚¨cŒÀJd †œè%õ°Ñy&i ð0娆cí÷ÿ}g)°Žuš•C^U9bèã®j 9-¢í}AÕ”‚nÒÎ3³Ý‰œ³¼úì‘è÷;»Ç~|>çΚ¦sZ<*3fäSíñfË’3ÿÀIéñ-¼Ê‹¦jDOS°]°áw6#ä0TI¦†èë¿ÐލÈá†øµ`‹ø½?8æ˜~¶d;ï{T—ɱo)çdΩ¶Íðxë£C^fÖ1W½«ö‹0Õo4T¶K±lM²æ{÷‚Yɉ»š;Ëî†{Ü›QˆåXôÛ¡ÿʼnóãÔ|_ã9ɘ•™‘™ÈgÁ¡•™0Nž‘¤â´¡q6WœÎ >q^Üäqf&Ñø¹œe»â Ð¿Éšˆ>OCU ^O5Z3`+O‘ŒWÔ o ÓrJ`[Ø\!0ËpW9a'Hºo®þºÿz&Y;äTŽÐãA,öæJ­F׫CWOB¬¸ù&‹í%)¶~ªÌ( i.««ž6£fS˜õG¿ÿÅN~ýü@BBÀŠDÑ€&«j&:ÂÖJî…|³‘¶ð¯Xx}WbáLí$KàãP$¨B3Ùr*Ý¥Äj¨iÇW€nˆ@fVóÑ]ý£?¦ƒ‘íñ¢i{žÆ·ŒzÛUcXÐ÷B•´âáN€À&Ô1aQî^`ìk’TKxg;S©c§Ç\3¿Rxqb÷X†’î‡,ª0 †è nÄ„ 4n0 !hMÞ[ Ž0!6¢@<@‡4!¬h”Lhs&#–ire2CÂì‚9M@çž"`QèQ˜ì'ø‚«A9 ñŠG˜8(5Ø!«É¨€p\ g8+ÔÇd2·º!¸ˆÕG‡ Ђ۴i ™HDèDHHVŒëaË¡•ØŽçéô-ºãÈ!Áõ„¡3©€4+ê&VIÍ+¹ìˆÍ!¼\N¸2` æÂ:³$n<°±bøZº^)à4fkÛ¡!a«–’”âA4õ¦[j5bSðH¯|‘3զ….£¯0©qOó=Á•œ’B1MWŽ?=Ù8Æùº¿?åØ5ir/s&ÞàžiqIØ„ì8‹úDC¿Îêü¤ló¡œw]§7ÿ+§×ýF ·þ6ý±y;5¶/EŸUüuñ…tâg *B‚TC?ݦ½"YbˈBޏ9Î?ê¼ ùýügM½Ç½™¦Ë³¥_qlØ)hÚ‹äPžÔkG ŽÚ£URïr†v½ˆZ55RN<<ñBF,NíÄ«>ps #Yö4•ÅU…yùVN,9J`€‹š„¡‰¢î¾(IDoHviTü~ìõþqRù×Ãý©)6gù’ÃÜ4²¨+賦ÜéÇl¿W5{Ú›¢}/ÖIý 0àÁaù9ôE¡YºvÂj-ÔÈGe2ˆÖy¡8¦53VRý\CÇãó)xÄ wºÖ‘U cØÐ"ìÀ±Ÿlµó9—rtrÜå9§$i$›éºSjñÜ—×Rúh  e~"ÑÀ8DqÈIÝDæÒ. ü±åççT½Fl‹”çjÏáïÎÚŸ!Ô]<"FDÆŽ fÄÈÒ».†Ÿ \ñæSõ!HíX]Ìà Œ¢¾ÆÈŽö÷z9§FÅ,ε‹YP“ƒgÅQbH•H$Îg/äå(µ8¤3çt1ª!8k†^qÜ)¯5êàs‡¥(§–ÝtyëÆ¹µb~ݶúæ¢#ú.¯iHÕ¾G(E>*»èb|åq\§»ªïšÄFAÜA˜Ê‚€òñl}øóèóŠýªE\mæ1²ªàÏh”8ZZM°Š¥! )0*¤e ‚Ò•±Uæ,{a™ðúÛ;s¾"y5‹?aÖ+,ÌÝ:Ì +[pà,=+ŠkW‚YÄ HÐH vZŒ “JT˜|¢^ •ò% %åh HK"É1 øX )TÁ ÓAy % ËuÐbLåL¢BºŒ†Î&;Ñ%õªÖ +¥û«`522Lõz+Wµ„E´‘dþ6´ZA¨Z zŽ® 2ZÏ€+kã%É„HsXŽñ^_2¿“wµ¿^ÝmÍUDòbD¬ 1˜­§ÍîIjg±[ì,i޽[£†[£að„Ïss~„÷ óì²Ego!¬ÚcMoøãÇ—`<'ñ9W<õægæ×‹¬Ž–AA”§ÓÏ<Ïž|€çÒ~ƒþi„@Ñg™pLÏ,/¦#1’l™%­È6I†:ŠŒ]¾ç¤ƒ›K×^垌¾bb‚7™1œ©ÊœôÏiG’…S D¶w]êƒ2l{øaþ•ÑÝñ¢Öå¢;ʸ@žƒ70=C.×6±°DŽõ#ó)sDoÚd}uy%€;݇øñÁ%WR/žÈÍ`m¢M4R+´ÛþÔ¡R¦¤G£°¬#$ô@:t»"QåÉï/ß|%ŽO“sy# úš>^¬ƒèKöBUe«‰Á9ï†nï5N‰ê& 5-DÇÝ‹ªPby¶C…MVáʲf(YWÖ­*ØŠ€°_ìÔ UŠ)]¥ëµ`dýƹú—k÷œ-ú 衟m$W§POÔ¢SŽ¡Ùǃ `à¸<0l†€ZpȦÄ4º›¨œÆÄ";¯Š˜t¾?Ýõµxd®ýFöü$‚U½„mÇ“+¦ÏÃP];‹¤¥í ^ßöI£¾þð|YIcæþã$¦uG-)"­‚ÛTÒ"°éÂUÁ— …-Ù¡Vb¯Õ ¸ÏÒÀ¶pÌoûÍm1IÆ> gµsP†"ù“l€.œ1;Ks=óÎ_ò¹>|Ó¸9ˆ~ÀŠvW§¤¥5kÉG9•WÅQ^1±”^²ž|{âŒ2Îeu²=ŽÁ¢À K qÒ a0,ÑjrAT§uJ±|M—鈒Öb!”pø”P»É.àVÀÝß¶oæ+·¦—»ÓÃî¡8Š/ÿQ.þc_dÁ‚™Y ènTŽðO}üÿÌ4õs¡ŸE³ŠÖãüü+î3–N‡×ßñµ¼ñÑ£ÎõçùÑ{üg‘d8O ´ ÜÊyÎ6ç.ÐfÖUIO³©ûä˜ûÕöJûœÁ¤N¶êD—³óK’Ï€ãXnÓ¶ý($¤l™n^@T CLa6„Ö¹«ƒ/Ì9M³L6VD‹$D#X(¹禫†kˆ{¯Íe´Y8Ó²s8Y°¤‡öŸ¹ÚÏ­â{«°WÖr"¦¸ê˜KÝ ÊhH‰…P…TÈÞÔµF²d ­cgÖ´?¯›?öÑ~µ¦Ç,¯§²;ç-X=0ó”C³VŸ­ÛeÁ„‘“wæäæ¡«žÉ£·š%cЦA4€‚hÿìýéŸÝŸ?Øÿ}·¼ÑN¹Ç¼û¿ÿšzëË-u·×ãùªßÛ:_\þÕÕ1D¯ÊýLÃ0ýUêùþØœxxŸ÷ˆ ;GÎ’ŽdÑ,¯ûLk.á΂•,5„çôùòhWZ-@.ŽBŠ“<{Çnn5}ìÌÖ¹Çj^ÃêdôQÍ3æ™:š ¯F4S"ƒd£–ÖÉ–Ü@³©K„,OFg^©þ¾ímíhYA5| lK˜RO“)šss1âíýßö×úLƒpT”³ùéO6;x=‡ÏDžq<? dRBBqëÕâÈëÓÕ>ÏŠí¨ZYß–>ß_™/`÷h'°WõôÒ“[q@Á:fË%P„“Û”-×× ‚Ø,Hƒ}PÁ½›µjBgiP¸µõ‘þîç¸þˆ;žÌ³Âδ/ï‹é ÓßñHêŽ-Þ>$Â'æ›''`'™MlV €ÀFbN cÅÀâuI Ól2qnòÅ…› À4BíÝˆŽ¢”eÚû¢Ó6š&g&Ã- ¸ªRà0„‚[Ú¤žd„½!|ãÛŸ~rždñ7 ¯o¾¶šHNµv6ÉÅ"ؘ 8˜°ª}ÔQF–P½ ªŠÊýŽa>×™åVù&3™ß >.}œº¡(Š–Cc?]ò ¢âÑ@ÛªÔ®ÇS=-cÙÌÛÙ|Ô±‹h:iÜ0Å´†-­X¾Â8Fñ`d0k#ʲ6µqfò’ :¤[+:´33mªüB •£SFk¡+U…_×rndOR FHþ’Ë@½1—åpâØàÁ¬ù’[SLÝWxóÀá¹£'¤³ U8¥‰N[Ï#º«1¡´*ñ¤ŽFÕɱÜÎG¿¾ïÇПx{+Öë±{!Q1±Qõ2ý4Ÿ}³3%úüzɯÖùçûÙérÀ¢a³Ò°OMN…3Ó6ƒ( Pá_ȈO#/1§š1O<¦ÞØYŽÇ9î *lâH×U¶—ËáΚÀª€ôƹÑóò·ßȈ ÷yŠêÒA2 MnøŽ.i:ÔY8æý`›õ”Î~L”÷oÕþ=ñß "käÆ}™ò,ë ^.^l£©x {©íx#kæÊmuùskÆg QeVɲiÖb¾¬SÈO¸Â‚—H°„H׊ ùTÃR¡ˆ¤2â˜2P °Ð”0 ÄE ‚S³þHÈ›îÞ¯ŠÝÙÍ÷š9|?¢•rTPýu4uç£Öû8ÊxxûÌý ž1óðÉ×u9çÖ×ïâÒhÜ›ƒ_÷îK†÷|o¢aSÇ€¾P܉Ã+Ú„a,ùWÓŸ`û–5•³vHb%l.#ìXš=ª0é„['PŠã \&Ù³üÊ÷ïf^úÞ¼ÃbW|pøé:½ÑŒ€ÉTåžY7Þ9Ýö`qSùáþKú§)+ŒƒsJEtâ°¥Ú—ð[³ªT3M¤ç®Í%ÓÃgÓè‚•0TLIe°5ÖÌí ¯¥€O@ú,lÅ”ðê i+(RæzXô.ÔŒ 2ÀÒ {Ђ›û•t'ë1×Ååˆ-P –T6Â6‹(i½ÇÍ]Î(:JL]šÕ€©PLhLÓ³’ÞËÇô´¢n3Öu˜”TݬP{äõ¢ÈÈ~|I7¯6D­û[tM‘Üj¼¬bíuåÈ4jÓ)òhÐZ\%µ-̈š¹_âÕÇv¥vàåÐ}ü&R2:ïÉýÁ>L|ÃVä¼õ¢i¥u‹úÖŸ4Dû‹Zyd—rÿ"ŽþpX@˜I§Á>ˆÚ¾Œ57 ÛÛ&ÿyðGñœÑ¢Í)¼£úouX'IOJÉú¾ú9ú“°Œ6„Ióm¾~‘°ƒIÛÙ–¶aÝ ³†7w /’f7À†Š RC/;§„)×?ǽ 8K8rð%ª& Ù°ÅyIY±”D¡ˆ.fвyÅ(Ir ‘.ÒÚaî#”‹ {nÍLÃvl " v"ã’ –÷Ûü¼t‘lTȱƒ,yfl0Œ^DÝ ‘Ô ØMŽŠÇìOòò ðŠÑh‹a£´rD%— ÆZÍʩ̧„„˜[ÖQ2À…”tY X½h¬o‹s8lŸû?­=Ÿ‹ëèŸCIJXcb¤Á¬BÓ§–v¢h¡M¢#1`dÓPVZ©k W[@Ëè8ƒmá”néoõ[¬4vK:‘8ÁŽ©$Xj 8D⥠îªí¨K…ÆÄdbŒ”FPÄÈ/rµ—zaåH!8t4D¡à¿ä‘ÕáÔ5W[F=I»ÆVŒÒv7¹³çá™­X½O¶½Ûmv þò_ã^‡JCˆN‹þø’y£ïâþé–•aLq„Ý¡ŠU¬¯(bÛå.k…5цPÈձѯ}ãÛÒw5 §Šn–y†ÙÇY{î.w>^XÍX1`ŠÃAb>[‰îd=S÷zîGa`86vf>?l‡ÝôͬÀßjµA[«ä£1Uˬ4‡dÄ<–3úTËTCϨŒq|¥‘«½ ¬é&é‰9‘³34ÛÄ‘ñÍÉw&¯ UJè-yW܆%G Ã-jg‘O`ÛÉÂéùŒòñÙaišx…ÑSˆh4»ƒ¤®z1ÊQ{feò°åŸæYçGîE5„ A®VM´”èÆ5é^cóéw¬)±OGi(‡dx~ìNd¥¥CK¤nÒëØ~'ìùì´;[ØóV'ÙÑk:1Bw©ZÔ ôSæzº»>WôÅŒö|½Æ$*J2„sØÝÏÄ Žd‘ÿݳ†‰ÉÝ»•Ýßh³ê£Ér[¯¬Œ[Êv¿(_‚O@‡A*0T—Ñmâ…0>Ø1¹Ìåp——Í:„Må«6³u;%È«ÊæGkå ².‰(À½°¡)fhd7†¨Cª/v:Õs‚’Û´(lI5·StÂj´Ã  ä8Ká¨nnÍÇŠÿ,_š2ÜžåjÀ‡(el1´¢šiìY³ §,·÷h·‚ ã½`žû½‘ôÂà féN.¨nI ÐTpìM€’²•4¦qQ`¬åë•ÿæ¨ÿdÿŽÔ½””¢Äçq-*žºQëiöíÝ«„u…ŒFWÓ«tÍn¬4L¡q×pC˜z;Îzw&%9Ñ K¨‹k¤o,BΙ°3„7„îË9Š0Qq××û …ÒÍø„InâIWP¢±Fš@Fwòy~’ó[»Ù¯såø„°Ñ_ž~}a57ÉÆ_bmBÛH*¬Rу‹<¢ ¨BˆW¡,ªÍF"D,ЬX(ƒ "Xc .Ü’«Ä+PJ³-´½]HpŠ$H¼”ÃA a;…DBÄ É=äwÑŽtnngpQKbC' @:f{1G¤õòÏAþßxSXPƒ@(³‰ðæ¿*xóEس¬‹Ø¬ýrTXXSüCÏélÜzƱ7؟˳ø¥m­x=po¸Ä("={[Œ+p&[èW° ˆ2¬ãRz¤=B{˜†•$±Œ ¯BåˆEDX`ite‚¡= L¾9ÏåUý4¿Ãªh Mìq’ÑAw³WVSiNÉHZ—…•‘)ÞÕGfýÒîBÌ–¿‘^öõ[fÛäS¬m"«z¡, €Ì dÍèR  5Ò[­[~`Ø»>SÍV—·þÏ3Q§ö»ï//ÒÉßOÃÉ)µLzzÜ)*:0Œ·ÇI2}ñ/¤[ï‚Ý^ÝÒ9£.<£1à $Šø;{üþopÿÆyóOúã2¾ôýÏ;ì;?½ÿãðÒ•žé;|GÈÛó|“_®eÝ4ùÖuÝûƒqÊLÞ'¿çSïcŠ›•x$s¥ªúJ ÆÍ¥ ÔHÈjÑ3jHD!˜ê¨ÄÐL#OË©G6$Ÿ]ÍÞ6Ûs«Ý@‰ª[Ñiózõµaõ€FM€OÁR¶A-TCâò#hA"®DùÞý£~ÅÕ²Ž F¸--d diçÕk5N?pªàgù¥@\ƒYBÿ|¢¼×Ö×ä°= §|¦Ç)iÇèŽA:à).N1Ïq¹ÏUôk‹”0VªÓ ÐT¬ã¯uôÕmæLV(·ÑâÆ]kE p±ÔHÔFŠ«->@UÂ%=ÃܤéC®Q€ ž-=·ä %Èmý4x7lÏípùìnk€§@´Ì—#hÀßÊûz9}µ\Tc'Í .à¤GÝH°¨­G,;.q£Šv‚cxÓr.¤4%=IÆ dÍÅÂ)¢Ï|ŠGyžt1)ø¶#+ª–A$QIÔ0z $F®ø…P_ Q*Uá×#~þ…uŒ¡ ‘ŒÆD"RUaÏ* áxœ¢g:9DË»Dãòl™GV ŸèiÔR3Õ9G¾6Q¼¤;E)MLoøùœï ¤sÊÜËGæ#Ù­ýÍqí† ]ò)GŸV%™îªêz—[…¡Ðg—…mmÏÉÉñÃgU àæØfÛö(` Æbwv#·M7Å'Ýô¢âÈý›õнñ3AôîšÞ+Âæü%ІŽÍÙˆH×9wXº4’£ Ž‘ošs3%‡ÿj?¼úø3 ݯaÀ€Â ãPÈÏíM%^u?^q40ï vç)פ’ÅûuxOMå ,[äèÔ·òÎ'ÜÏu›?|ýŠü Î.¿xP?L'©®ÆÌJäUOë';^hLo/±ÇÉh”ëÞ¹—x#ï–a$9GD~Цmt‹†0­ìuîos—Ù…±T‰i[ZrÊŠ˜LYý;çŒT¶¤XE1¸)Ó§­EŒí‹ÉrÊú·%ŠØ‰™€S¥.³û»¶—G†4ö²]l ¿ÝÐÒ™b§X¢‚ PºµŸQ:µ4”òížó¿ôïÒ1%(¸@€¢Ê*´«ÚXi(T+Õ PÔ0øí$;Ÿ,ÎáSÑ&½vÞ•>“¢iÔÎ4D8£Fˆv ƒËŤûn_Œ`.*ì/Që&e§6›òó¡Ûˆ¨P N’$ÈšUèbT©X½ïŠ"ÐT€‚£ ‚Ç:#AbP-@+ÉÃå ¯gæcÞÕWÉíê~»Ì9û|3“~1½¢¾í°WïêðöóIN9Q™_þ8úeŸº_k£och'^#+."N6çÔg~|<µåÀÕ3ëÍ×{.t{mÑ­ŒiýUË®Ç~¾ÄÁŒð±‘Gif”3]} û EbL[PQ©¹*Áéx ¶Â¡òü^öý¶"/€È/[Å™Ð=<¡»í¤ûO‚MLXo,‘Gîß߯lרzVA¨ R1Û y€¨¾–…š[¸ÝUÒ0j£H"Õ®])”œ7Úh³"ôBÔ°6†jXT¦Ô…87ãN£SŒ[ƒdp ëí°ÏtHÙ3Ñ €P áqõ8h9íð,la '6¦lXGÂÊ(£#dO¸…â6$íDw­ˆ­-ƒÒE÷À²º–@“ÄW ð ‹pºA2£[غ„ïTÏÅk2º.šZ”ƒ‚:„`°ÅP1» K!`ƒ2àŠè¨‹%$¸q‡B¡F^Nztð6‚‰£˜Ynâ`¦P. h2 nÉ‚’£ò³£©e«‹rÔÝ^|¨gDý<°CB nyÍJ—¨n¥Ö ÈPt5Ò…„A Xqi,²%k®JغóÎãHÙèÎNԹɼÁ;ºþÉj2 MluY};XsdÒñFó7©…Ö…Äüxû-ºûׯöcœ'§vØí.d‰ªÇ3cqi ŠùŸd0€Ÿaÿ¬Oÿn4÷¿å»¯ÔÓß~¦Å:Rüà_ïë¥ÿËæ>R¹GÈ,’¦[€Dºæ¾Uí®GÔL*ˆÄ‘›‹fÐÌ”žÑ” ;XM;@GŸ-•…9 ˆ¨ƒ˜Ms—°E,ב–PY)êÖYÅM«œ0Ô å»uÛˆA0¶ù@`.ÀìjÝTèÑÒ_fò}þÄM"¬14×—Ÿ™QÍ©ž|”AdÀøŸÏœ@Ìøön?³ýËûñí2†,x@Юòkø¢:«ùí6`^ 6ÆyEÕ%÷qÀ#ÊÚm~Jù°=·Ë %ðmÚ÷:[-›ÈÅ* Rï+VÕîFøj…ƒ~ÿ“q…äJ¥àv‰•²ÕøÝêOðPY×*5“ù5²Åæ~§C—ºê;5J š30Á"“D܆h#iÖc4½ÖÙ­iÛµ§‹Æ(‡?ŽJ`>…a’s†).4¥t,1"/­épÓk艩áE©ãTY;²Ž"UTSxÝ9°ZõFIÏ1ÚêM3-n ÝŸ_ïZ0ž•õ¹vbÆ÷ˆ,»½,:2ññ¡pÒ‹V[|(Lš ü}™Ô°7ÖòÚ¡–Ò’•hÄã!ÞNH1nŸô•*Å=E‰ˆJBäÀ±Ê.ýãR‹ž­Æ‡ÁB£,D@UfðþS×çÞ ^w.¬œÕ˜Å¥T³¨m,‘â\QR>ƈ¡ÊÆ0‡&$!sɆ´µ°¤Ô’ ©Š@`K­A¸¤åÓö!xéŠÒ"®È˜rJ)Š}ÑQZ1ÄFg³'@%Œr¢J)›°ªÖÍQ’€Ž7–­RÆ)–*µ^›1ÖË­E®ä5e#ê¼¶»îÙzLü‚=!GÔxkþ6ñ×?å§wÿõ‹þxǯ¯vvoQNe“»òù½ëñ§ÙÓqhR Ä‘B6BHU°‚ÅhZÈŠ $€¨ dŒÊEÑäÑyù÷«þ™-XB>y•°=Zû5=e¶ªJ`xµ’;RŒ«KÈá ÙɲœvÊaYŒán1YŽAý)vM#t]dN:XzQ /µÚIDœŽÛLrHâ!j8cgØL|füJö-`ÄC?â&ÙDM4Cn&7;ŸÓõ%L‹ ‰¬u‘õLÌÙŒ”»…K¸ÕÖ¹Ìm’R-6R~¢8`šI31Ïø·þÝûÛQ¼–?ƒwJ ÓÔeA·¦„Z 9ñbv½€„¡6)dEkwu˨Š(¿™ß8ŸÄ5àÕ/e††ÌEþººš–µL¹Híò0ÿ~ÛMs“îÜÊQyÇFvïÇÜc§ Ù2Û …ýœyðЛ¦ñmàdzùI÷ ô4³ÊêvQ醰[ ˆãM-üŽà‡öÒéx3ö{;ô±ñZÃóvA —»ª*š­)¬-÷˜‰Øv(ë ÷(Í29…DÓæ[­ßò3q'ò£·§Ò§ |¤ÒupH)¬J-ÀC‘y+¬ÚýÓÓxMÄW– ÷4¡r zyíû¼Òfe…TbDqÜ£läD~ïà9ð7i°[[& êžÿŽS!ÿ.»AʬóB¸§>מʧù$Ϙ!×àüGÇ=5 b÷.øZ k µb݈TnȨéÉ®èÅ¢n¦¿óL­žûGÄívío2o"ƒ¦rŠ\ä®ÛÓþÙõ3YßÍ¡D¬É‘ÐîÛ=8óù®_»BÖpáÊõ îêm5ÍzE¦µ¦òZعËcT1CAˆªó(‹ Œ$lÚKÐZ*ýã”aeÐÕVN‚Œ´RpÖˆ"JïnorŸçf¡³?§šÝð¹é¯É¼G°4k% ·–§•8²d'DX0Ñ,h‰¥Ø&8’È«ˆP Á‚-PP¢%_óUÿGÒ•õ^ ‹ØéÉ;ñ•3¹(E $…š­!# áC® ?àn¡Éô¤{Ä„ª(G‰ ²!û?+›óɯùŸ}Y5†°T„˜…6`!¦¼–÷;ý7¬ß·1>l–½N:öÌÖ¯í~ Aè9~®¡NÚxÎËŒ9}ȯ b"µMBΈ•OàÊ܆¢<'#@os:Éxß·«÷&Y‡\0[¦Èï1Ki-s¸Ylï5ÌAD¢2€3 ï?é_Ú?nö•ò/Úü÷21&¢Ê>e?•×M=OÑæ SŸg>^ç6káÝ“  zð º …CSX|BH+Cº2(%µsÃ8@d!Ø43h’µmÝ5ìõ©ïo=–÷½d#:"òö¤ïg—úSíÙ:=:?èn«‡×„NÉOÕ¼xbÑþ¶Ë¬BkR¡£¤‡ -)ŠŠmdtpާ;ê¿ ü“Çß¾ò½ëûcuñòÒÿ#Ϙ§5%^+;ÍW“‡UÓð¹ƒ÷ñ†ýJ\8fN°ÞsÏ×â~_KÕþh`ߺŸó»«ŸÇ”hc­‰]Cw†&BL“@JÓêÔÙ)/ËU99îÂÛè»ÒQi.¡â3’@t m(©WB”NJvÖ¿Öb‚ L° 7X©eÖ°ƒ(”A`Á\ª/xÙ‹K°‚RèÃñ¾1MƒÐä#%"í¥š0Ñ{•˜\\ôT€É1FmŒ`C*H$2b…?~uò<ÍÅX–ÂÁŠVá#•£îBmï•õ’Ýf—n­ÂƒPÁEÇy\ì˜Zã­¡LZ< h6\áÑÒ@_) ++%.bYF`ÔW¢!£.lƒà–:Ïš ÞÞq³ñI°©ôA²Œ>~†}ò§œú°¤Ï—Üy ŠÎË¡PnB”\äL.ë:–<«gÇq“`§i@¢Þ„&2ì‡zOR|Á;Êâ Æª¢™™vÕpè´#W8U9© * ÂPèÙÏó&þm¶DDÅd¡h3èÀ @0B‘Fpƒ )Z*žA×]«¶+#Ó$sb³È¼èišÝåõfz©WLwïIâÁPÙ‚º”w쎄3qðTgÕð|¢R­«Ðyrœ.•23mXµ»'n,›$Ž‹!h}”Ï£ËfÙ„€Ôµ‘Ȱ*ÞM íêvËÕF†!R j2¾ø}Ú6ɸG·=ö± ½*äúòAç´? ;bȤRG:î¹ñÈEgrÔõr­ß÷¸ Wf„Æ3Æ?yûý£õ¥ôüGvô36 <|a’>ÄÜŒéGHIо`ÿ-Á‰ÿÛq½:û˜¦ºh]ïÛbŒø9KDêNò¥—¯*Ó4fÏK‘\¾¸œvÏQ?vx:yWÍQåö7Ø»º‹«íu>ÞØ­ é$„JI¶×UŠ&ÏDUo=¢‚Õ Ù8·yû¥³ùrmw‰KwIÖÜøqñ‚ìa¹Z˜·¢Øs‡"ïa|L6ŽïM\oÚ9¤²p$œÍªO=0òÎD ÷,g¹®ns£ïn¯0ªwó´œ$ë »Ñ.B‰hwÄ9N/ƒØ£/…5o*Q„¸ˆ)ª2?Yz¢’²y™ïp§ˆv €Ž¼¤†P2” ÏU½®î^åv„†–µ¡-Œ]GmÁ Ð…º´!€B²i©ë\j­qÚºTœ:tO³X@Ç"*€c´FººCƒ’%/@@*ƒôuXZñjUÁœ°¬ˮΆETâñƒ|?Ô·ÄÛÆVÓÝ·–?%ë¼6ξcÅ–^H±ÚÀùìž«@¬ñ¾´½ù3gAÏ¥rêî"ƒbÚ»A\ß°~[C‰ú9âé©üëõÞl=A²°ŒÑÑ‘ ]õ¯Êë:«óáœok¸EcCüôa†:ã²Â$¸Fʶ ‚¤\ÍZ±ã=šRS¯µ ±ll«4½q˜µeÆ‘á^—O`Ëïv쟷³ìpÁQŽC5oë ¬ì?Çð¿ßrPœµlþl¿mÿËêü‹ëö¿aòïoҕ‹°³ÝåççþÜ«”=wÐ^îG;g’`ˆ‡EøBóëZ ³´Üê%ölÒ3?}pŸ¢ÀK„Iq’=Fµ¤k#%’SŒ ®|¾â¡PUpI|áy]_þdö%º€8‘¯Ï~D†lní–¿‹Ìë!¶”>ûøúz„ãHxªgâZ m½OÏu¬àü4”³’Ý0ÐS/,B ÓNžÞ×ðq vÅ“p;ƒ‚Юù"Ò¿œ4*>R?ƒµ”!AJÇ*%Rû3W^%¯Üg¾öéö÷¢½0êB÷ jp ¯œYau§!)Ëð‚b*$‚ŒúY‰³p“Øíj¬ÇT,Õg}j f1Q0BäbŽ¡–(€–¡¥×¡UÓf¯J>' Ë%ž¡‘h0’F&„ °ÆýÍæÝ%´cQ(«3JAѵvrã•PåǸwd@‚¢j«mPšÙª‰DÃPI7ƨ*i+Ò0qf5‰ç‡Ø·p=3¡ëªóO»ûÏ?˜W ÚþA÷?Ö¸·»öýû,=Æz»–m~ÿé·ga¾¾Å?æÿâûÊWêˆÄ´IÏ,1B€0¸Eй1ĤÂAcDU"²Fid¨×þîùg%œnØfµú¦ó±NÝþæ^ors”y‡ÏÐO €]7Ÿ×… ÑÂ" Ÿö–šA `I,}[õr㨡p Ä Â¦÷½ z5’œc£qí¡m6†u…Ÿã6N0¡‡ä ¢&½‰bªMa?!OÜ&ÉA µ }¢‚ùΜä»å ɰ¬ƒÑÒÎ.y®œóðn‚ ä©Ù^×dmH.Šl/¬žíÜmªØë€*CL&œï¤”â'Ÿ§ ´»Ð,? Ãó³EgÖL'q¥W¦O2¼í”4•K$#R³‘@À”yÚ1‚/=Ëó\'§“¸Õ×/ V‚.o–SE†z¤“vßµ-í5õ(“a32CYz̾@~o1ƒñV öð&êalkú4O¥ž#» ‹¸W¡:QTQ¹ÚE#ÑçÙø”?Ê#ù;¿Ó&—Ç•›æzޝ ¡HÀ,*±·„À ¸$!hkS@q[=êqºc)ŸºÁ½}Øõ^WÉlÝs'„ õãœå¾õ=—˜ÏŽÒfíÍ'?=°eYâ‘axˆ‰ŸûÌÜvÖ¥yØÚÔ2åˆÜ9VAÃäBõ%z6žÕŸ¬ÓzœÑcPåÚj]À0‰iÉ"RRø1 â±Ð*—&Ÿc‘°N¬ã^ú£s?›Rn¸Q&„Š™øÂë)Ç ª;‹‚ fšbÜ„1 'uUv¯otæjwRAÆ[Ì•H0ÆžäRÍâ9¿6_E_»Ï'ãÎF®f&WaRë¹Ú«ã»}L¶OsÖ÷,nÛ‹*j›p<’dÑ¿*¸¼XçS)ÒØÃKH&-€ `#:dÇ™8†€[ Ûñ÷xø¿ß;ø\§ÎGõ ð%’ ‘Ÿ† }Ñ@R€¨`¬ù%w…ŸFkð¿Åä0”å¢TaGì!l]^ÇÕ7i.[IèÞʒYŒñÞìŽqSð°*˜a5ÝlhÈI iÔÀ ü–¨A ±aTJcŠt"©èÓÂcY%U±fv—·éüÒúM/2è/&ûãÓe5ŸŒ† W3|X~¶­ÍTehÌ„¢1p¢U£“ývÜ¿é¿(utºõ¨†ŽL*ø©ånÿ|’Ï™_|0ÖÃÅhÿF^“uøåÓ™æ@y)aºÒOí(-±i2] ¶U@› V‚NÏÛi ŸÇöukŸoú¾ÿ”¸• @ 4ûþ>ßñ0áÙäK¾'´¾k¨q Ö]Kô¦¤•VùâŠÉ,€‡Í¨ÛM23mtžd0È$§GÅ~zùüýþÌÿÛ°{žò7Í?ü<ú×½¾ùð'/­žÚbŒÁkóFž-ã›xRÝÑ‚ìéçrñÝÚ¯ï×LÿJïÀûÉ~ýÊ·çc‚£V ¢²e%péħ<2†”n,b9Ò4”7ù1V†Fó"gzf¿¬fëœd(€(h) H¢n!+ þß‹ÿtá¿aþBK…:IÒa¥”H™k¸86Y‹¤‚PÎ|ºß˜/!§i ŽIŒòøñÊPÉ5<ÝGD{b A‰¸õ¹DoÎf@È¥ ‹2Á©] B¿u•¯_þýú£ì¸ŠSÐÐ0rxlçzºö’»gWŒusêA7^ñbωu’"«]ÃÝA¹W\ChHd‰WzGƒ²¾ GKJÒ.³01æpTJŪ:'…]T§Eú@¡¼ ‡¯‰ßý|~‚ÏßñyDþ–þ Ÿ—ó_7þœû˜³Í$n«€À–Èà3fmGCBG@¬#:á­A¡KÖXsú(¨Ôù‰~ ¤?Þh‘ÁÙ8 &;âŠ5O,@éBIi&,ª äº ¹×ßæ»Ç‚€Ð*žˆ{ @ž”TíF×QÉôˆ8„Å#ÊÖãªNšø9+¯p÷·î§í,Zc+³ê»H(Þmªh/ÉW´vsºÙ¶ë£šŽ 9¦%ºô¯Iâ‰zthJ5à jÀ-$g›T>ý*j>DºÕ÷fO©ié÷fÇmv™?j#BPÝ1Ÿ_4cGð üqþèñ¾z¼¬ý·<>v¸±på8Jo¼yX¨0µ4Œ’(¼Iq•ª×¥í/ciÃ×kwmðA?r;9×Ñ·f½Î𲟖²V˜¥»©þžèú’IRŠÖSò ¼fD²Qz'˜¼èc¹¼{ë’Á#‰îæ?6æCök@4_RFè–k–ƒû#5 5çz5ÌÝT‰/ÔÞôW¢FGºJ±1cJ-QŒ'þXö˜8´â‰#Q’†ލ,Zy"‚Ö¡ ¤”aP±D× uÇ•íJÙD+°CÀˆ›ºD.³¿‡àÃ0*JÏJ”8©Ê­½KŽê5­Ìµz/ Ñ£›Õ8Ú [ÐM}å^ʇ±{€ƒU&„^cLŒFÉm$¸Ø®”¾^™%Wb"¤"¡HˆXHÇñû[÷é†Ì‰ŠiÉÀé /\Ÿ¶Ã²ã\Ìë÷‹]³Ñä9;»„棊…¦]b;ñ ¬v¨-žˆÊtQm›Š$EYFA²ÐK­Ñt5m|ë¯Æ x2¸àÞ‡! igý¾sß2è£k¾ÏÕõp¢VÇóúcóŽP‰ ° û‡õp¦[åÈØ%O›«ˆ°.4†Æf¶C‡FgÅ\4  &#¥4!Vh”´”ãÈ@÷+cË¿î—Ïx}ý£í¯èóYΞ¿þ°˜—ó‘&ô±eÔÛÝõ äƒøÑÇ߯‡ßõèür¿Íüh•ݱªtQ”%XÀ® QYvª§[ÖHÑH€¼ŠY;ê ïGø|‚­ÍñŸŸ¹Ý'Ù§ÇŒ­—tÜÊ\lÌÎùd9—÷²Í]ïdÙe£nö~[Œuëòfº½ûÔnß;ôÖ†`Ìéæyë¾oû)X¬‰+U Â×…pªZ·šÐÕ}*ìKÓM§qÐ#J¨Ñ´ŠŠ[#UÐùèùuÕëêö÷vz²yi:]&°—›¡Å´'HÞ,)Š¿ÜÁ\¤è‚™Xû”sš£_ÙE(ä¯v:ouçâî¸Ñšã÷ûPÛF_ûivžïwYÏQzµ(''pDÂq‰·O‘57¡(€n4–*õÏD¨ƒå ](eMZ±Ü%’«ñþ{˜Wå­rÕdP÷ÜÕ™í4ëÖB()=³ÅL5ÜÒ`?‹þËÞq•9=§x~\ózyîž7ýã—éΟaÞWÝÏT{z#Þ¨oü1ðȉéO©ßÿy=ø[þ>ÿâ;¥4=‡ê¦óó^_“•=k‰HMP ÁÉ÷SÿWüðæÄå\Oo¬ä®zžžÇô-ÿÿ(–=÷iydÛ‰BÂ8&žºˆ¥µÃ‘/kR¥¾ÖËZ\zîª[_pü}IëEmB53Eènªƒ@a(¤‘Q¯[¶*s!ÖÆa³Ög\‰†dN¨fPî>¨¹_„‡DR8òs$ÿB„4_uÛV³ôúD¢”VÂJA=&DëU…qZŽ6¼èÝóúZГ râ—uUt¯òû†¾îµ ØÍ­©yE[­Av;xç¿ñ— '¯¶½6Ä%^ebQ¿£2ôê¢ýõWòû}zÏ×Àœ{m:¢ú Èl#°À¯>x:¢€7L ´·æÊ8£ h¹m@4\±u"8¡ŒÊûï4tFÒ{ãeÇŸÚÄ_ÿ;ì©…¥cÛ1,¬R›@F¨åÿºúùeèSÚ&¤:§[üæ–‰NH;V§“ÿÎvƒÇŸF‘|â ÙÕ""iÃ×:;Ûò±ÛÁ KÑP&)HW–Q€IºŸÂ‹1o· ÃÝ^¸ãx(™GŒñ†¸KÛ × H#å;}è~¿~ZÏÄSøÃ"hÿz?WíÃ÷!ÊŽ g ž8ß0ZO§aº[¸Œï; ‰?¬kØ›»m¶vSÝî‚{h Vnn…ÃDBEŠÊÊþʬjgõàL»×½çOHoWõ5r•Ô¼Á ؈4ÈˆŠ˜GJÖ¡“4E¬ ‚2<¾Š7Ò²k°•ëffÐF`i_‘» lÃpK–B¬V–S#p wòŽæpJTà@Œ1F:ð”KY0€ì™1(E¡¡@É 7àÒ–& 0T“&ÑC½$X¢ã„÷ŒU%®•-æÊŠ•Ò¥•2°+ìØÀ»Qv‰ÎiŸ‰šîóoÛüˆHàûYÄyþ@ÿv{û/²çÖ9å~vù‰ÅŒÍs=Ÿýþ­¹ßf?Ì6‘Èp¶aœ¦ ]=ã©]Œ(˜h„ê5ØsôjË=‹9³§Mê;M×%‚0ÖГÈgí‡÷a(?ø N)·(0Ü×w«× xj RAô¹K&K…%1‘2³J„y1áé©_{y|ª†›ÞVÖ²I ¥|”IжGÑ ÎcÌtHÚ…Uè U-a 8;ö*væy\xgÕb„²ðÿ±ú›Ý¿|þ±½2$/~·ú¯nÿÿ,ŠÑ,ò<ññm]ý?Œÿ‡ÊMú³N»*ÍçÝÅ{ð;¥ÒÌV0¡8çê&ˆi3ÇÜÍ/iÿ‘í%_QDÞ³?å-&b²&2XÊȸ™hÙ•¹.O=LÛ6«Â±äT8ÛlŒ8«Ù>1pBjp„̾ÕV·@YõÒÍ£J"‡´#ω¸öÀ‘fGöPªEÈŠUQvÈ!­ÆØXøÂÏOˆûh©o s†ÄÏ|xå¬ï3ªÙžiˆ^·3쿾“—îíí{Ëæ.ܘ¾ë |ÿØÉ ׃~ÿ~[pçÌßËÌDû}0ÿbÄÄ‹‹c·«׺ â®Åñå·n&Æ^ÿ˜xr¤‰›6ÎKg®Šàt󨚋Õ"ZÆ@Y‹£(¢‘³’±å8ØÑ–çÞôÏkñÖNûÚ|»6ËxSlÚ;7™7ã­·ü×%ÿ³þ_Òàr÷÷>´±­ÿ2èØÙ Be±—/ÍAº¥Î@5X·P»µµê/ IB42È ØÂ!dA«ÄwÁ¥²Èž(Ûc6tãf<ó«‹1Â`„Vº‚1Æ*¸‰ãí±=Ž¡°h/÷z*ÿ9ísyŸçü<öcý—ÿºÛ¼Õ¬È9c'ÚøBz¤½#Ä ³ÙØ4fgçóõàîès_7þü÷L¯òÝmVN±–ï¹ÖXl6€ŽÉvc¥bF22‰ùé·U–¦tÀsjÎG9 Âq‘nµTB§nɇܴØSTº¯kMºgÓrá?œøÿ:G»®ÙJ+ÛÑ¡`§@ÊV,Æ5CÐUV}…]Ñ4óxe^»Õ[¬Ð±Ä&á›z6]@ØlzÒ@ÏÍÚBh ‹y{uï‰Òs6å§sN¥º×ØÇ^OøóãðïÞÕ;ïšçáe©Øò”>ÙýÎ>ÿ½ÿÒ›ÏkìG¼®ç!Ô^¾Z4BÝI*ÖPM0\ÈnYÅiƱ`ˆBû$åá|Ô sœ®”ö pÈï~]“æéæ¬ùĸÊÏÊ‹Ìs>Qþ{¿~âþéÿúå󹯛Ïìüù]_þ¿á‡á6oÛâ/Rèà%S[ ×zþ‚U¹Í‘ß ØÁ¯|Ë’<‰Yk£ ¬Ï”âÏeX:9V \nÑŸT$ŒºmO]M† l^¶?㟿å÷J…å§Ò½ùK„¥Í×/§c#ˆAdÃÇå"›ôý,Þç)}p}ã{÷/™ß¿ó9çoÏl³îéMÇþ¶b’õtÖÓ¼ýht“$ E¶Çq_t.ãÒôÇÂý¨"/oAÞô e¦ÛÁa={Oo'ÛýwîÇ\ÎôL¹NèÛ‹‘)@rŸJ‰®f¾¨Š9µ(`µiL«Z˜­ mcXðµñ·>—ôìý’ìó7‰¸¾ÏþälzëüZþ£“ÕGïø«WîówNÝÓÏ©ÝhSaÁOk÷µô|ÏÏå‘“0C5kaä èøu~Ý~áð8è}¡>]Eã )¹q¬, ZÏ»½È“ÌÅd¬ãX<^–ø|X¡:¹µôÏ/Åû^Îf²qØ#U#ëQv¹ïÕÏt½q]Ñ-\geBl†]ñtÆ`§©°<¢Q6à== lÈÈ‹ï_\ßI’©Ä ¦’‹pBb€DP&,Û@,¿Ò€Ùòœ6ÝÆdY˜’¤£Î®¦63[èÕ÷Â=ÝþiüI6Y!puÞân?ßRÝÛ+sôÛvŒ2³"Q`Фªø Ä,ÞpTm~ÎH A­ÛËOž<áD ¢ûŽ 5@ˆ%øòØëíùa_ôhÓ¬ÝÑúŽ_»>ûÅ¿R±hg]žï+ÛÜ7X^Æúˆ1j¼Uí~À=¶»dÛz“´’-€¨LeÀàä  “µ©ª¿†ËÔ“ñy°]•FÇ¥úrßW}ê»Íâ;'WLÁÞƒ¸~é>ËöÏ@¾†HÇÑ%ÝÊF¹r± 6[Ý… Y9[U°nÑAYÙR k´=R…Q¥ë刉òäz–åNèåeOÜ»b@éÉLëë„×òBè'5Ư¶;Ÿ:ðQÖ”źù¦¯{ëÑóÈ=/zQ•B%”öÄór¯kÙÙáîò®Ãkì(ÒÄЖÁÖðW­ÞúH]K±9wN߀NÃìçC°·2ô¶˜ƒšù(Bj{®"7„6F‚’†º, óCÆe~d¼˜C¬*ú‘С©¬h£‡Y90BAš®)‘Ü äÜ$$"ØTù}+ü¤ßo’b!¯£1lþ “(JI›˜3¸™3¢RQæ…UK#ïoL…` ˆ¸k6Ù‘ªô­ "réøÆÜÏž§ô|S™çüB§s}XöF¸àú­,ø mÓù² çm.[êªãfZíœRžš.É4su,+$Šü0½#Ñtq`{«Ç[K»kž $*ª²Ì„ë¦cvPªôp6JNÙıÆÂ»WóöÕ<î¹ç͛Ӧ.@ŒX¼x˜7ßp@jÂo1RèL5“v:¡Ö_»y?W?T$u~¥5! ¿•R¹Dˡ鮀ÜS@Dyx ÅâòWé·g¼jÁ0»T+ œ üé{ãæì´¢•|?àŠÛÁ$ TPóÜ“oƵ_ÆÕ?ûvò‹í|fИG¼ÈtÙJé¦ÿd‡ÅTõÕüüé½Ëò•dñÜúú—=­pÝÏ7¶òË ØzìšQ.©×°^|%ÝŒ¿’S,y1ï „>œ1(}ëÓ;;¾>O®æn÷¨ßüÃ?’iD®°ÒÐĽåÖaÏTGÒ( %‘ÔƒCnt¡`¯À™‘'õÊV¦ ?¯e"…|¬deÙköA½sðÊE^¥6àš¤ˆ ëðª^Mv'%?è#°AW϶ãžS¼ïäh{¬P¬PAÅH|ðêÞý¹0oào‘-ë:¸–e7ÐF)‘ p[ô ˆ¨†Q­ixÕB[1¥‰2j!‹"ÚÑV(g÷/üõGý•ñ×ߟõp–-©_;ý+?†ócÑâ;ãS:Ä$ßíÞ4Cú÷kÏ!-"$«¥’RCÞè B¨ˆ( Bðàb‰´¸.ö˜Ož'Ñ·¯†—Ã7ú°ÛNÒ Ñ+\åó ÆÅ:ÅZÆ­G©Uš„‰!öõ*Es ¨"EÆyUº) „,d€V3î¨uC—ª0°.¬én—¶7ʪT2¤umqÛ¿æ{3ã.ƕ鷃mÝfÉz”cÓh·eáê(¼ï YL=Nv\Îñî'úQA¿š‘-Ÿ¥u_¥ôÕ ’h$€ý_'~3Lþ½h¸ägøb-cÕKnÄQóáÔ?//‰Nl9,ˆ¸²:ÒOÕ? IsAEÊM¤b4ŽW“’S=‡qÜñCl稌¢ f®ÍGrÐ Zd©éÓ†”“œ¼©Œ4fÜ¡T9W‹„’ëP¤h’h<©! è¼rº£Ý‚ÒÌq#Pµ‰œÅftø®Þ0»'Ñö·£¶çY&C^r;•ø?t;mùbï‡å¥ºÿõoüÃyiJý¿¼ÿõ0{•ÙáߥJ˜)ù~Òs¿ÃÞ§Ú½%õ/ôÚ#c» ]75w*O2*ƒ!–:àØÝ ™,ÒŠHw6C›î1Šª5ü«©×nË0‡lÉú¸DEàžÁ0Jî ¨ÀœÊÚ®%]D™òFÊÓêìêdžlàÆþâ]\žŸóûwÿ§FjnïA÷•`¨¦òÏcÜ«zC_ç2ÏØ’ Ý þ–8‚¾»œD5¨ÔÊ›ìowͦVeÿheL~ çPý4âmÐLçPÌ ¯£õ ðYøÓ쵞BƒÕ}»•UyC‚V³'gê׃1D:š…ͦ$ÐH)ZX†B±è!JöHiœ»qÁ…\r†Ô±NpJ‡Ïî,¸ï)[vV(T`IÀ‰»HYc%«Î’šŠä°A‘Ë¢øé¯ÿÙë÷G{u÷¯jþË~üEùÏH‚]Ä Is……"ª© 8P•jÀî§)—;„¨.Á+mÆrÆ•®ãB[ĸ„R‘"¬k)THb*WXÊ1¬Ø€p!Mˆ1 Œ‚j‘DÌ‚Qs+"¹¤òrGÆuÙ“q­~ÚÀß®ž«&.¯§p|vù÷üÛáûyü’Ë}x_ÐÏ:w–eŽûÁÙ6¨ý¾ñ¥>a ¨ØÉÍßß’ó6´ŸO«\Ùý~Õߨ/û/Ÿûÿ“c*)ù_ȳxô¯‘ÿ³ðˆÝÜmÇáJBmÚp ÿ%Qª£fqÊ©g·6 ˆqïƒ`¸6ó-º ×d(€ €zhžõ^¥-ÚÝÀâ´šåÞ› ­Ñ¹—Ï%JÍ”‘2ØêÆm¡W`h¯%FL¸yĨWÉOCðoÍûœ[q ÖÝ>ÊõeûŽçÇs\i7÷6ãužn¬‚ç~éžWÈŽM|ê£ü~o=s5»8¿ÔpÏ.y ´Gs$TíY…VúKä¿ÿ_„ÇieÝcª¦VGjÖƒv f‹zžU|0ÕÚê±1°J£dG¦ Ã.ðXRà…À çº7?ξ»ŸºBk½Ó¸ü®ã÷Ž<ïgŒúd_ÕN¬õR_ÍÑî†>–8@»³o`$B R¥– ¦¦F1æ¾~µP> ™K¢?ÚÕ®¯qníµŒ­PÍ–Û)*­¹t;b é3Èœ`9¿èɾá+¹ Ö¢.C„SGÀ¯)/¯ê’Äü((zwÂûF/¯éË o-Û^íŠ}ªa¤(‘BL™.ór®â=~êÔýl{ÑîW\GƒKòX½þùm³¯»»‡ž¾¿³ U )M-zÈ4u†Á Lù€‡Ê¥ ¹B¼ ÒµÒq«Ô°kp•…É‹.±B<¥(e@˜ÀCP»ÄÃ|F0€!-jǾâÓ6ùmêQ˜`À˜'%3¬Qz˜ÔmÆëÄbëŸ ‘¨n_¦“¤"Ìô”¡€ÌUìtReyºNâ Ó?Q<3fiã Ìk@bPŠH(A¢îW²ÍO ÷ç‚~¶x*õÝ5Hû2üH-1Ôð­Ú·Ö~ØsÞï+›öÔj¸Dª ‘ÃPF‚úæ²r*@’ˆP ð„IAÍ+ô¦hv£‰cÕÍÚ;ç}¬^Žm?X¾þh髉þ+oL>²ÿLpã®{§ÞdñüëÇâ\©~ÿ¹“"lâ`izÂWyâ²+Yu­l}€ä ùq|qÉcD8ä«ÏšG»G]5 åIöjÛi¶ímƒ CÚ°ê¸À…[aÏZYðú½ëc¯ˆÚ€èNP~vÏ+|ðiñúÁ¸70§tCÞñ¼¸}Ük•Ø/¶û Ì‚°T$0Hé¼Ã&ƈPçôÅÉ3‹¹¦Y/Ïó¯ã¯ßâlðK_>íq ñ]…VMéšà‡{3-Cq­£2–“åÀ3ÝaûÊ jê?ß“óºîø”ˆ6)>uÊýEþô@Ðäš¡óù¯—ÂkÀÂôŠÆªR”"Hõ®,ÔªÜ,˜)ŒƒžŠ‹cýцSí”ÀË"¤ƒC„`ÇP;ÏãéÝ?ÞSz2&.°Ž…3^çB;¡óšÞ³™÷êûSüé;Ô«ä=‡oé¶9ð^}Þä½°?Ò=ÀZ2«{п>üš²+£©¦9Ç„¾Š‚ÝÎsò7‡Ý àjm¾¹·Å—G“v"8ç¤×wÖëÕ¬‹ûö\¿ê5îî´' h6f·ñ)æ|šî‹´{‚<ߘ&¬^WNÕ¯G‘”5˜¨¶oƒM/ŇäU#TÇ\!´íhA Ë0XÏpîx~ze +m/ RÚU^?9Ò:¤¼sóR!ÑC3ª UGÈ94äˆFQÙöö¯É XtJë/8Oã$2ãˆbŸÈq飬îóA4"m’‘Ù‘Nxuª·†Û[Ëûbx…퓽ªË&w7âçmþõ–ÍÓ£‚Ô; ˆÄ(üyÆno÷ô‡èþଠ®DŸè3gDh? ¢£Ÿ÷ì·[ñlPN¥£T*±jÚ´í(¸-Ö=?1 »³ç^yy§¶ïÕ=^×;BjÆ4f%%bTSœÍ‰ ”3¹ñÇLáÂÄÒ­u—j½ˆ¶zŠ©iϤ²¤Њ&žD€=SÝÏíÿz•¿ýïÖˆ”™]vž÷=Åo¸KÖŒkƒä©&¿5R Œ V)Ž2u2ûØ—óç‹ùõö=ëª<ÇÄúžv¨ ¢˜Nð{!µ{Zº·ã+º`ã$Ì!$XI?®ñ–÷}JÒ:.Âg%óœ“ÂìM˜•¢gï¦rúæûúñm.#çwø4óPRŸÇ›{™¶›:­f2Òë÷×.ï¿ÿ>ùÙîLekZŸLn×ßí•ûækó!Û¦ÜÈí(þý[mÿœFâ²£Y@ è¶ ¿„¾~+¡hòÊ_tPMHج¹TL9S¨W¿×7ÃxÕ3ŸèEŒ+hÁ8’ºÒ|'¬ˆ¯ÌžD£ÉVp¢‚lÉOf8̳gÜM=qרœHùˆOäÁ(U«:ŸâFœŒßkò~K÷ºÈ‰v Å.~¤š¸‹y7Ãn-n™KìÏ”·äµÑh䯽¿Aª4OîÆ HCAg÷®Ó_¯öóNÓÛÏ–ÏÎ×þißßw÷¹ò#ßù¸ï_œçõyÚÝ`Ÿ½þºÈ‡íCvn˜3åƒRàŠÙuÝ*2}H¨A¶oÀ‹qjvMõâ PâÕ¬ÃæÇOÏ&Úç÷ñÎÝå|2ó%¨÷7è$CnOK¨ºÖ©NunÝî„‘e#ÈÖ“ ÀâG_^¸BãÁ5ã<Ó#äxÅóÐÏ'¼A”‚V~^_xÕ^Ué]•kEQ`Êñä˜ß FPÑʯ¢â ,ut2?t>ÖžÐV×iù„Ü;R§Ø¤·ëk–¬ ”¡ ‘öž@þnœê×ÐÛ‡Ýdhç ,ç(_El®™sL÷ѵ¶2­t®5 ÒŽ&Èô1…È¢åÙhëqØœ-àr&e¡¿8øJ ¥}T&Âîìˬ¯F{A¤€iàˆM@ÙÜÇl{Ã(q,#SBÍ „dê¡Ë=Á°QÙ-‡ÕWÉëJ~vV¤@ªÇ#zê;î¥õ¤šõ|tãdï!VŒ˜§bUð_/…;ý‡…=Ãÿ®ùêæüöm½èçÊG+i`ä j*Xa¡,d bŒ #ŒmMrâ0"ÊÈõ’™ªé­ßŠP…±Š#D„¢žÄ-bB¤€ ؃À‚‰Š1×qc‘;x)*E¢‰šRÑøÛáHTT…F7±ñòü-—o7ßá2yo׳ëjzCV5)ÿþí´÷ô÷=¿?z½ùÛk>µÉf3q"q™QZ¿,»NzXóéóO²¿üäÞÁrtçIÆürwg?ŸÿW?×íMÊüOWÿ7°ãü4iUE$@º%ÿÚN±¢ù—„Ùj4)1uÅëÍ`«G'¥·Áí=®½>nÌj]6P 2È ,õ}YwSРÒþý–ïw“‚ÀR”¨°à>þë^øÅh:KÆR¦¨BŠF+Z¡äy$n^uNÑÅ«Ö~®~ä™#{äÜÞ—(ÄcU¼©… ƒ’Q3c‘ª‚•‰bY+N-f(˜ÝîËß»éëcö¥=ì|Îç{ö:y×e •0&£),Y£[šj’Ç€Þ8ÇØç5×Ywö,t÷rá$:Çç9+RH➆º ë‰V;`’Œl “¬Â@Q 4ñÁ¤dB!REVÉ2]脨d§¦ðYšËÃ=õ혆V)V`5@׺)‹°4½’ÏxâéL¬D°/•A¡çïùýº¯_úk,–wå6’4g›x hka¬°w,£—ËWæë_'o¦Ï?åíäQyU\,a"ˆ$Àâ ý˧„j\U‚O\{ç± &×[0‹$®2D£Ét~?oŸJÈxlàaüWýªßžÉü»=þù¦‡·ðk|›Ý÷º6ûÇŒô©a½ŽãŸÊ£O™ýóý¬“ÇçÍÉÓá#p©]ì<¿—y‚ÖSË¥ëâík+=rŸ_…²U€Û4Šé€P8MzÝòUó?Ûoßx>‹Ý5m`aÈ@xfÅ Ì˜é ³§"2Y¸˜ÅÔŸ`Z’DŠ@¡"‰Hš¶@Ö%¦¯\ÛcÐ…èBõT’ùLáqPËT6Pµ¾í§×}Œ.ä7Ž€ž)óñ‹½ô?á~™S\…ºH¬ELj÷øx¿]1 )A›5ƒZ™R‘««Ò]F÷Xà´3a kyØ^’RnРûô’E0:¤9^oD Qظ:àµÒ TXÅ¢i:àC[HS¡D ÂÕU„Ó^êòìMðÉîõG‚žбµ±†àMRÞ{‹ßlbÕGp†ž ®—&"MêäPVïñ‹O·òÖ‡ëOÓäuG§Ѿ³¼z‘ŸßÛUÝ¿ó»Üu´6™ÝÒÛE ‘óâ +Wë† ÇˆÀyµ0×À pÜz ‰6)FÁü8ÊJ¸U †®b,Ì~×ÿ í?@óèˆm¦Â[ù‚mŠŒ-†JŸbª ñÕ pä›éaHv¬dð“¤cs®rØ,dæ¡O6‘'&ÓæôåLR‰¨¿¾¯&ƒ*¡gõûÆ è€Ø¿E\ñyæùYΊnש__¿›Ÿ[žÇŸ'ìGÝš0Žà¼’Y@Ð_…ßUÿ»Q9üQúÏîÖÔÖ~&gôŸÊÔ¾’%¨["YA€¨~µ÷a]Ž;åˆõbŸ±£åÀùóÑùeÔ„ 7úK»» /S øq/#äy«xë銻µâW­ãÁ>&âÔŸ4’®•´t–©]3~o. >Î//Ýßÿ<†¾ýZÖUbàÚxýr3ï¤ÓA$’rTš×­ìþô^ñÂå³0E›Ò‹=›cf\§A¿©×Øüìø#¼ÜÜ„CÜšêr?o”k_ÙŒ¾Š‹‚*u"m ¡)Lh¢R4L²‘3ã›/žÚª<îîŇÜ_-T\ÙÅ“’ªÎ™pi_g?Ÿl‚4b˜`£G•¯®#úîÚçr}¤zääÉw¾°W:5·…÷ì´¯…FŸl‰x–¬Ì(‹Ë2»>{«ŠâbÛߟ½ãÃãiì«ûYìo=]¥Ö’ì’áhÇèÀòù•-Ò eRŽP‡òÇ'3oÅQ@ö7pøÒÃ<Ã'“×o“A Õ«xLj¯…Tµ,'S¥$ª‰Hÿ…ÅeVo ·á@ôdP–v3G¤±ZÏCgd=êŠÐf• `1„%ˆ‹ÄLˆ=Š<Œ h¹:†¨˜Â½úóþ[µïpúêÕ}M»ž§ P‘(تRY»Î×Ã_jÿÙ~Wֲذ›®_Q^^ŽõfýæÆO¹ßùxðçoûã­£L•‰>_õ>wâïü¿¿¤Mø”ÉÝò3û;—oܼ¾ð9Y½åû Pþéëý×Ó•Q"òóJoõ_Å顼èIœô¾AäÏB„‡–õêX$¨4´=Ð §ðøy~eæ[\o?trçk-⻥ƒ°Õ ÛÑSÎ:2›¨òHî­+„‹_|½¾Õã•W}\×hXœb©òÀjà&‡6†H~ÔR2¬{ ÈD\Üm‹Ï &ŒààSXÖa>eOèéa˜Ü ¬‹:æ7ÜäÔ¨r£$5vªq¨8ÈÈÐk”‚Ú" =äŸÔÀÅáåðc÷W¥‹*“G;Ô:¶˜ÆX…¤ÀôºÌiÊiíHÊßþžî‚”r”ïW«Ãqyy‚úNðÍÔ¤ª8äãBÇ3Y E4”…¥a„ÆZT)l¼1‡­£b“ù5Ð3Þ¦^cŸØbvK¥cª F˜WcÅÍK¢¦iašÂÜ®£¾ C-ävÀfR¹ó-›ö×ù·´Ž^ÊÉêȯϬ²7óJs3ȉp¸¸Àä¡6ÑÏìôÞMû39¨¶_÷îìÏð½üý®õuÏÜ[oüïÿJñ×;}„€XxP¨Ç"ˆ2Uû§·ÒXöo2÷ªi%N9ÂIý"_zd²1Üèt!Ãá‰M3‹Z µØ)k‰©ŒÎ}™¨¸$¦:¡²çµ+¦(¥zˆOÝG·üáÞÝ-2Ç©»Zõ{Ø|~9;Û´ÿÙcÍxﺰÒëM+É–lO¦Ó«!;º+Y®Â'T™¬Ýn,Ù"`Nåä´=ñu6Þßïù¶9o“Í$0]0¿Áƒ>î~,Y—µyM¤üK;3cVÇ–??ÈkEwLâ”Âbf”1¥µð0 M1¬L-b+ü8"%™\-ÁÜ ó ¶çÒJUë+÷¯ðj¤Çn‹w)På¦])ª@/W†ìÍP¼Ç,iE[cNmvB=s¥„¡¸öP,Q¯gqüíçkžÑ{gwàÆÞ=ýMðQ#½—š¯¶{÷ɼ³oa%YŽ寻«¾ÿOÿ-õc÷?ûÁöo^~ºÿüz™{ë~òuŸ3A€" @Cc‹,²œÁ5¹¦"ÖÆü[~œmÞõÙm{ÕÄ¢ºP…„t¡rL€µêªkœ¦ Ah­€VD¢ö!Œ,"ª0Då#Ÿq’,iq•>&äk?"ñMsBúôôtó¯ß_þ×äï=êçŒOúþ_¯øëø_žÝWµ½ÓýiœÕ‘¨”’Q+µ¤cÕ⟧ø§^øe5o«XSé:óüAþåÏ;÷ÿ©¯Uû¹nç–Iyr¶µ52Ý&Pý¯*U"@AßÍ3ˆ iRä0õé¨NÅçý½,˜íöíÆs@H!@` iIfŸopÞÃÚÙ²ì©q.ùó½ðj û¥©ôU<61´ «¢*”a0ÄXPV$ª=ÌãjÕ)­õúÂ>¿¾×ÒòæÌ½Þ¢§¬edHç‹ñH"¯J‹,! s¨M¬ï—™?Ã[Íâüú::?…WH&¢ÝÌì$LaÕ4Ê<Ÿ¯¶óLTäÀ-AûÏjÎU™'‡IJÃ:ZB!ÂÌ8´a²]ì:î¿YýR´QF!@uJ-ÉBt8L0&›ÂŽ µ†˜¥F“'‡WÜ6ìnËÌ/áïs…‹Ó¦íêj4¹½7ð€mÂ3Y\>ÀÈÛâ™O«E¶¤œÿê}¤<‡ÝfÝÊöÁ½/“/BXÝç@›\‹÷æÍßïwyßg¯ÔÖŠ–eG€¡+ÄÁ‚MI J$RâèT–h͈Óõd 4åÁ€Á£>µÏ™Ÿu{kw½FîÜùêøgæ›îóòúä×ïŸí/ ŸåîÁ³Üèɯú=3DuZêõ¨¬yNK=üÜbõùÃ+h¥ŒåŒóÊ®XÍ{ôv:Ôývo À؃ƒÀ0;}.¨è¨B²…Ì Pf¨}Îßò=k|wÇû!¯Ógøþýâ_³â?r‘_¢j*U܇ ]\n¢¡ŸM«÷.,I$Ì0NÿÔóz{ö‡súã_¿^~¾Þyå±Üò)Jsðä¯î4s²”ÓÏ=sí+‡Öïzº>˜úñÝ™ÝÉrÈ>vàau߼ƉBwXóZ²7§FÓ³øRí"ße’n¥ºêe\ ?Þ•³fUrôÅŒ>~˜5Õq÷ÏãP—¡Ü•ÒÚJ*²îè®e]_ì{¤,Yî±`è›øÃ^¦°wÒïd6C5Œc\«á®]~Bä ?Ð8©c+€~õâŠB”§ÆºH¯Äîwœ]Kù@ Çóy_ívŠœ¶2$¨Ð’büT×9¢T‘*îæàÏ«U;Ð5Éî3à< ÞV1ï&£í%âˆÐI^\z¾ Ú ¨¾«î“¡vEj)«Êéûš^«®ÈA•K’B¹T¥_Õ‰ê G£ÕŸs˜xä$9ó$ÐcAçÎ]V1á÷Ò¾œô¤ì²­FÃ7ÚÚb·CÔö6õ/!GšÀYÊâþZ¾9¯Ü³]eŸÁ°«L£@U)h&Êï IK±Ž®#U+ìÄ,*&g¦ŒC¾ À"ú´• l8Í­ûõßò΋ÑFœÆ>=_OÍ]*<Í;¼–œž}7(K«»Š'¸€gUT ¿à áâÌŸ?¦*@ˆ)*Ó½â1żþ‘¿M$/’£yí)SÅ¿¡Í|øØ·ÝîûH¢Ë穯ñ(³†‚F:00Ãtó<&y/ný–ÞÒ]±†&U@2Bàiˆ×ê{U+ÖÌdeB¢Ä /˜_5¨€€ %áã¯õ“-ÀŠõÆ™°§Ë{ìrê£çó½G9¿ŸÏ†P@J«Â1…Ô”p€e`¿d…íÐêŠ/‰æ6Ѱó°ë4Ù?³òÝ6ó½€Ñ!“õŒéw}NBÚ¥í B¯e˜„Qga×’àf£`R€­óÚS͇jóOª×?k+³½Òn1]˜ð‚y‹]ºÁ®Ÿ\Ù;.£Æa‰CÂ]FgÈÃÊZª`ŧì­úM\^´‘7»»éí3]“>ð›ÎãÏgyûúÞ ñÅIN5]–ˆ ê¼bœù|= ¨`h'¶ƒX ô*Ë‚îYÞ³>·HÐTØNs 㣋ÿí©÷yh²1/Ef›ý'Û ÅDq¶ökçaŠ+§\),gQˆ69÷“qµ‚ sÜ•aÉ€ñöÔ7Ãü‰ó±åWÈ÷Å$ÊBÀo°Ë›ÔO:XSÖœ3‰­\nï‘£Ã^Ìå¸óyy~§üˆ'вr¡Z™Ô°æ£Rñ<{Tš»W¸±ªPtf×Ǽôx×Â?›Ù=<†òMMáÞÏD’º~éÅ_‹øë¤üº,žùMÛþÞ ]V_HuùÞŠnN£.×™s(ró¿^ò[ ᤻o<©üè>@G“Ö3W¿pÎqI“Ÿy³‰7ŒÍ)÷ä6ox;~]½­m”ÕnLcZUƒ:¹¶¡`FÐ0îË#í™Ë§íטÏäõŒ|ÿ¸¾©žE÷ÜPŽM{x{ûŠŠF¡B¤„ó×ÑèT u”ߨ©W\/açt¶«ÎŒˆ{f\L¸‡>]LÕI5Ä=ý{Nf5ìjÞs˜«dkNUÀá,X/Ù\–õ£Ö}r…uoÛŒ7;è²P’œ gõö°â·SÈK¢0ŒqÎCÍ„¦2ÊLâùÒuíÿ?€ú|¡@;^kv ÙŽW£‡]‚¢×3vCqjÏˇ"Diè›C1ÖÈ}sL2o1¹|zœ8u‘”aÚéÊîqÆŠuÜ]óÚØa`ªÕôÖUb^@ †ÍOr¬û?3…yqÓî<ÿQ!Ýâ5W‰¢Ø£eåVäèp('µ<2Ä¿ž­ŸÞÏ(+qG*†5’郌xÿìÒ[ýôùð_ße?k1XŠõ-ÛtYx|õúT²_N½ÐÐFbØ¢…<‚À!QÖŸcÍüòë=|½ãB…*’C˜áQ¢4 /Å Iâ#zåˆX²‡Ë£b•Þö+¶°ƒ…?:±¿$3G³6Š Çùµ ƒ«ÍS¨¦¶¤÷ÇzµÅø*º"·ìÕ‹MÖUÍǃ2ë‹g…ä??í_‘þ˽å¼pnGÙú±HwƒPu>›QÛÁçair›ø@t@Ùo½z£»ß¸ð}Qê¨ š2OŒÀÒ¬WóãÔ @FÑ<ʉ]Q˜49ͳvl¡V“?g††™è²ïE\2]Av7kNÀJ;dÛ‘Ø"ÑÒ¯Y J ŽäòŠsvâg•²`ËkŽÌÓU*D d_åÊÆÏªVÛºKïj‡[¾šQ5D¬®8z¯BѽÐuÓ~:”Ö]À¨Õ¥¼í¢wãÝöQýU®iBù‹ …Þ¸ã«ß3ž¨xÅ@Op¿=>Ä‹ÿÉ8k˜ g­/Ü4?=à 宧œ6\ÞâÈŒRD1»=_þ×t'hM§ÿØÝqü—x'+t¢„羄ðëÙ<,æV˜ªLʬˆÍ¸.‡0²ìx];0‰7ïŠaèHS*(Ü)צ{¯2£§²Í¶´CÉ$,=šSá0Bf8 xÐ$t•Np•§|3ŽÔ»K÷ɽÕý7–×X‡_(3kë*zrÙãS% ¥øÒTJŠê:’¾ÅÆ„?ûû¹Sáóñ°¼šß'ÆtMÓý_ò§ù7½ ?.Dò-¤Ã1Û¤ÕÓZ]âþa@R¢†]a3½]b•¶G ƒÐ«bá-½ ›œ0b¤ÈiM¶ÓÉÿúËî9$ϧ£é€šÜ¢FÓçÙËÛo¹º±ûyRç>Ä 9ÒeN¨µ=ÎhGŽO˜ âxÞŽ”!^°dV¿¥µÌŠo$å$üéW&œ…\;þÕo†ó†§Soa|l‡Œïñ ÷‚‡öõbkC/a'EÌ vóIwIúc?Œ¹‚뾪ç_¿Ü¹ÒÈÀ7¹È‹‚6út&² …€ E'NP!ûÄÏŠUx'¯Zd« ‹/ÿûž6ö\ßìn̶O¸=ÒÎ mˤŽBè`RΙÂ:_2#Žlp“ê°=Æ‘nòŽ-:•/„9Haú™áwÝüöï»ùÑ—ÉH<3ý§3ÌGü¹«»¿¹ŸÉQHjˆQa“ ¨<ýŒ× _õ^ßÁüŸãy}x%=ĽÛ/_o“ÍW)@ˆ ÁíüËpÀkZCï¯Ú÷èË|•¹´7ô<¦o+k/¾4?Â(Gˆ©k¯PÛ¨¦•4]ÕmÂk»à2(±ÓÄ ¾‡ˆ§lbs\ÒÈÀµdõàd•X| 2§©ÕçkµÏ¢2Ñâo¯êßwÑ3Ù;þ»ÿ)7}O¿¬_?ÆñìxN¾2³ò†Xû¦t$Ÿ7û»¶šyBÚ½ÝÁØ5MÅñyÊû“¿ÛR('J³ÿ5chŽ—m :Ja ôª)=‹ØÅB3(”vG® #%½&?¯>'FÆh1 €4Óè¬~.a°Åòvœ·(‹ÁxÞÉá—ÿúóþOS£×"ÊëI4¦ê¬ .E°­DM˳ØÁõ¼š ‹N¹‡gÜ·yÝ`Gé1” iÔ,r\‘Êêp¤F-‰I®œàÂzXZR9Ã)p ·€r ‰ª(‚G§>¯s‡ýH¯[λÎÍ㬷ۼv°0ûn¹âú|ÿþ:{àÈëu:3çªÒn4µ+kv/«r쑾ժ¤¢† GNt;ß}#cn£†mŒ7Ì“M@E •J ¨† 3½n_cÈ~²û›~^zò^ÐkîÃ|¯ø}¾Ìç>9ßî=Ä+´u_&ä|^»¨ô‡ùõÐ~zn/@Kw‘°“|üq÷u9ޱú3­<É2îÿåçKË1…)šRþõg½§­tu…ót÷ÃùúG˜¶Åä3¿ÿæê ¹²Óðµ?ï;©¶4ÕŽ+£'é?Kíúñ‚gÁ~Ëõ㬷!G*ò ¥­Õ<R6(/ðÃé”ìíöTOÁùÅÏoüº£k±s¿yâ¨%ßËÑ:ñyJþÒ§j-­m¨æÓ~–”½¯aªãÅ~ù†Aè{ÐצcFÚQR>ÄÞ€(mÔΰ‰²Óuq;æ$mßmõ²´#®1^žOÿÌ49(µ; @‹ ä2ÂÓáÔM*È Í©óép0¦‡àõÉ?ƒŸæKDö††ÅnP(ÊŠ1! ºq;’Øp´…ùÉœßÇ‘ëŠK°ˆ±"jK^†i>Jj\.ÚT>ü‹Å6š†3Ò p27s&%¢"åä]J‰ç'^¸HKfQùƒW+úgôþ:wÿŠ3Uñõ¶þñåìôõ£ýÌÓWÀ4 9¨—âÆØ+OÔ–ÛW €MŒƒ‘4»X»X¿X„ÂI‹^G7fü{þõ~wT0·ª YG@J”'Ô"9%¼V:çåWÛå§à5;XžÛ—žoŸyš€Ð @pÈ~4±º>µÏ»ÛîçJI…€ªyo² &P°“©Ú?W¿™vH@B¨˜(ñY F4û‡_Zÿù2Œl÷”Ùþƒo½±Ë´7ÀöŠÈŽ8?Næ1¥·ýò¾ß–Òà1列¢.Œ.ÏÚ†»ˆRä¶%ºÓ܆yÀKÆç¦€Â‰Ý?±Í¼‡gÈ›E˜Ã@ì༰Æ$¥….ó>ÓΠÇs59GŒ(À‰ ó›á»Rhçñòäå¾Ç³»rVí2r) ’ù¡•¡ } ©)ÿš’œs¡ ·½¶Ö¤¬•°÷íªW r•¥£² 9àÜME>€_Ù·æ sÉ—&r½ˆ^k—KòA!i‹Lx°Ürƒ¨È–¼ú vÜÞf Ç 0¿À\9Ÿý©hœ­ÌÙõk3Ôvg}A¾8˜)¹up4ÚÉ–_<÷ÇóÅwÍÏoÓˆSŽƒ™*Oäjʃ[îHwãÏå7VÔwI&ƒ©IêE: úêëáû9Ítûö“Š)CûŽÝcàâp˜j* Å » ¡kLÛ¹Î"T*ïÆÞ…Ñzx;…7Œ&w?üêQVîV4fkŸÉö[ur¬È..»³žÙgßq²þŸ”S}GŸOî2j1-÷«õÍl’&ßÂêF?½r̯´uy‹.ûl–Wºœˆqö)Ï¿z®>ÿËó>‹ãêµn÷?ÿMزÒvÒöûâ­Ú¡¹!ÀbR%IÎ$¼þð ë:=xõõWÜžwî9›ÛÎ%Ë3wm’Ko+ñÀg»œk/Ø#ÆJ×K|ïïŽW+"Fú̵¯)—p梣ã4™¨­Ä†Åî9_Ñrd ÝœŒ>ñ½Níº‡žŠ¬y#ãYÏaV8½æbšK¯j]yk¢$ –“ê(kÕ ï׉Ԩ×nc®a(‡ Š-š<+ÎEZÈ`µƒ‚ém6XNoÜ|{P.!G†¬ôLøª"×µç£_NE¸ˆB¼ˆ•7tP`À@ÉE.›*M¿ÓÅÏ|ñ—¼þÛÆNðâžÂ­tfxÄòì}OÕÌ¡‘2“Ê[7V܇×ou=¾¼.}K?J?’B‘™€ ºý‚uˆ5ˆH/¡2õúÖüx`, v¤ò‚Ì163W× Vþ›|ìîÏO†z³Qá!4&(HéKJçVÔ!Œ‘´að4q$Á¶”"‹ÊÃætT‚š—xÕª€µÍm¤AÑ{øHî¤ ^Òq×#À[~×ä»~Õ=ýzÍŸ;šOOºíg©ÎÚ˜KÁ¯./u—Ÿ‚®¦›õ¾p[_ïÕј²a! 0k~_às~&¾ÞûíÒÿø­<_|UùOËúݼàü¾™±Ç ±tKMJúÄæâ,ñV.7@ÕÉvÓh[à:¿(øM×E9ر«penOF²wØêâ¨L¼J¦)Ú"—ÚµÖvëšAÇ&&9qÝ$YèË­Žg·nÆÞ¼Ÿ|}Á`a«tãIìh¯>©É5-,õcóˆþkÎ)^óœqS$ÕªV? à(@ WõŸ¢~Sy ÇWpŽÅþ«E§ºP ƒ´pk9Ün¾SOuJ:eÜŠXZÊMXœ‘ŠCûLôÙÞç©×í°a‰a§fäå½9è«|O½±&f£•¡3;—þYvhM[£ë$­%kFáj·e{ÿðo±¦€H EÇ"V/ºqÏÙ­Ã3ö'~·ö®gfwÞ›èLÉCQüÎçÜI#LÑ'"»£ÞtÉÊÌ`¬Ã,¯X—H»MI¡D”‡+SåJ=Ô§ƒ®¥M\óBCÀ>—BÁE6»ÔhÕL‡ÒM4J„°.yà ~•çØ$”éPfîüûíýùLi½º÷×÷÷’ü\±f¸.¿÷ÛOABgƺÃmxXà&§ÓCt÷Õò}À†žäÎíàãÙkø£‘_cù×o©Í˺.þø»pª’Ug žÑO[Ÿª’å˜gscg8ð¼Äáiš$Æè¦k…™¡@M†FIŒ)ì¬øÐÿ,>6³2Cz¢„û¨†¼59ÝGvãš̶uU]{ošï;¾ùzõç}.´“µÂå^mÝ}-o‹^ä\zªøê‹þnj³ˆ& ¯G•bæNCÔ-ŸàÓÖÙ0”<'8/ü¾{óÛû掕 ·Ÿ 9¿†ß;¨Ò©Ë"èØóšf^T#„P@ ެU˜A´rªÒÜÁOœûW?ä<üüú󿮋ׇ̤߮{HáU³18íìßûðÉù:PÈDázVÁ"”E¢cà¢+Âm'–À©¹²cõ ž!d µC¯g‹¹Âåô“ö\ö_ýnÁJûÂnüǺcšó ½Oùõ³„Èb€:XYGmHRןZüó×Ï×Úy­–Á÷køWœÿë÷ÚªòáõCöoÏâÿ?¯ý/ýOÿ׃žp‚ÐÄHË ! X½bÛa5¡3º—»B)kôÂ$l’-éQ ÏTî¹ÖÞë¿ýy¿Õý׳¯?}ck8ez?†6pD.%tGè’ ìTåúï5ø‰G|ûõ¿-_eʈÀx^*€Ž]R% ­4«›‹*Xc¸ÂS,°hÁÁc^7àÎ܈9…ƒ–A‚@* ª²EÁ‰€ €ˆ†“PØÒ¢gǼ†k¨JŸÝÍÑýxÄœÎ#ï·šÁ4ÆÙ^–ìoSŸÌœEh=ؼ(ÏØFÝiƒšPgíL§´Fôs¾óî|»þŸçžwê æÎ ÎmÆñÐQ iôßZ^dÂ,„5¶¨…‚¨zÐA5¨–.pfòM¾5£Íº7œ¡MGÑáÎ4>;ëé!’ôPZ;íP}Â#4»úÓŸ÷?.{ïówþÓëW½¶5÷¢ß§àøÇïÜ÷óê+|™ßì›șœËGE=ï‹îÿ›×¿¦#üÈ:±Þ·eTijŒb¸kÝÓuÌÝäÁžÞ£`OI "õÁDSzã1Ú¾ßt%b€‰(@(ROÜ®úSXñ#ƒ e©h”ëøÆ¸ô}7•§r‹²îæLe0Å"Foì_ïÇ)ߟšU"ï1cƒZè£ÌD`©tmtƒ‚£@ˆLBQ, &,HB çëü<-…çÚc³v'Q%{h€«¶­Ý6ÈEÇ0'%c9ÔiÄŸ°jþòÓá¶x¦¥e¦möóûœŸá^gÉ EeuŠk0}¬m @FÁ\Ø PHCíÃW(¸…Û%ÚÄ´lJ·¤PlTSwJ,¼7ü庵¾B„49…UZ5:«·íUR2@<îz#-?1 û,sMÔ “3gtO:‰(9„²¢/*_ûEwaG48A§Û/RœvP‹<å>.ºpÓXd"¾™þ¦T^®—÷‰ôNNËvôÜMÄLÐÇ üÒÿ ½ì²°Ò[í€G±ª¸Ñy¦`íÔ o ŽV@ßôÒO모¼Žôe¦ a+ÇÌʦZ—k8_œõÇæxÔs"”ø¹'«è±5éɾ&±4Ò𚜉'eª;%k_êúÔ¶MÙdJÅ M"š^ëý]h…­ô6xãn.%½ÂîÎ*ÍðëæÖ=ÍlbnžÇO³¾ ×âGðpá _ìÌ6‡á(>?¾µ?ìüVs±ŸÚEåä“–µþ<‰oòëߦÈìkûó%S§Õ'-u °[&Úw™¼Èû0‡¬/”ë‚>È4#YpN«žpûÀGþ=̧àÔþîg*+llò ù›ds¶âGR ¨3)1»ÐkqÕQ+SÉÒ¾N9Õ…ºã¹‰ÞÝÆ¯| á9ϱ8W.ÐÜáìÔô트£>$ŒÔõÍÔýr¥XªÒvZ»jŸ¥´·bëýÃÓ¼r^rs8+ GK¨ÛÕpügW;ž,»5ÇŒ±HÖ*dFÉ‹šŽ é‹çðù{ò9‘³º>õY&ù`¢ú|=—’£Pjþ´|vu9…剺]ÓeŸŸ¶E”Í“@åõMÎ`åäµ ‡–§²?Ójjœ¸"qï–©Dw jêeäžÁW¤ú IYYÐIj——+± ¡[2ÕqÕöŨ5Þ³‰+MnM:º¼{\g ßž ”ï" “Æf8[«î b:tYgƒ‚-ymè†Ç¬ÔÀÈ+0‘—Ñ©Ž‡´j5@ûqözsAY™:ÌÃY¥wôú­Úóaãs@I+8 Ú¡‡s°®˜ýx-ºÌxü:ËŽX¼Z* ¹î¹4NüÁD¥w(ëîT©9É/ õŽ;è lo,\‘Û¢žðiÕ"Ö˜Qn!18ÈC¡œbwµL@§,‹çô Ý ¤:*}°íÚûs™ÕáêŸnøØ·¢:HI(ì% a ’¤Nô´À;¨4 •Pš@ãÞqHEIQ$Z›­Rו ´’G$`SÁ†$ ÓK}åÆ"Øš7²w߸¸¼õæs¾:Z¤­~N-]‹%5ñ%é<7h‡®`gïrÞ¼û…j( ŽIIiÚ2¹u)¯“¿yËÌë?Í5Ä;vC):ËG¥>_v'”‰9Ôߨû™¹a®8@ƒ·J¡ÑŒšKªÛ]Ð)¨ä×Ùqˆ/f´­@ Pða?a¾uK)úlURyœföÙß”“‰Š~sÆh{ëko²~ß#ÑHSµ`Ñ: ª¸(èÂtý~Öñt…ÆIu7XŒTºÊÚÌ¢ÉÏ™ýÕ7C>v’Mr:ˉHÝuªË¢ê8h¥††Þç¡ ’/Ï‹O Íý ÿ‡›ûµX”޾y¯‘.Ëgv½«Qûç½}NfrOôHwÙJ´i‚zãŸWbúñÓ>3a+ªºuø³ ž™EvNVn@æ°û3¹ÿÜ€ XÂÞ ˜B5ÑQ?p”ÏýrôŸßüѺ"Ýß)÷íËöî°&1§6G­SeÝwŽVië|m¦ò"Òà+¬÷ÇC}Kuö±Œìl¥}ýîU‚'ï >ž}]‹¹\ýu9ìUØ-õ¥³I5ÔéC&•-àö…"–ŽDš&rã-ï·æúRw?SâDK:YÌ Ád?Õ÷ãÑù:™Ðc€U¡²Ì¢ÜÔ‰ahÝJp E±žÿïõ뉵šþÏ÷L8÷“Z¤´üÙk\{µs[× K•~VBjå,VÈ\H`7¬['nKjCÉ0P«š&;=Ö Ñhf›4wü£x꽇NúW‰ä×Uü.¼,ŽT'’Tõ\õä:ÌOãóÊ·Ëß|~Óß»ªì˜Æ[Û'é«OÙ•<Î^©ûJ0"@@ Œf ÄVc·¬!·T=Ÿ¬—PYæ¾ýk¿ÿ=ØëñÛxwÑí“Ç ¯½BQŸù««y¯‡÷¾Üç "•¡hÅŒGèáÀ&ê€Öd ƨ@Uºôˆ9$󑌇9æÄïÜ·‡/o?Ÿÿgãï¿u‹Ãôïçäó£üùtóXÝ¿>œgè”×D‡f à§4-ñÙ‡²bEMNÚ¿9}>ßþÇ«–ý¬‰­]PÞNÙú真¥[ÌcbˆÙVŒ Å  Eæ:SxÊ}B÷ØoW–óõæµY`cCI×ÃÛµ÷—d“4ɬÿþ׿½ÙK Ÿ™}>ÆMÔ>ÒÒm©Í}’s¼º:»É3Ê×›3i¨ƒq¢X¢>âÚ;@vz¶ÝÿÞý¼ò†ïcÜìÿ±ÿ•vq¾Ê«sþ§¿þ™¿}þÒüþœ~jí^;ˆkÆÓçú' ·ú¶¤ßqø}b^«’¸êú8ì©™À†_^>–¿7aïpá÷­ÞLvJz ŸtP¿ï­783¶ÁQ‘<Ú›_ú=Å›Ísmž‡ßÏÕÔ—oãõ{ÙO5\ßM-V³(驳/1_Þ»¶[gYzzõŠºã>BVú𷙣ñ6Ы4]¶ÅJ I£ æ†þS,+ŸO_S³o)‡C̳lJ2’ôÍþÈËmùY?~ñÿšl§˜n‡Á>Á"Ôa‰—TóéVÌ"̵ «OÄdòvÈŠÕýú›µ!o69`Þ>¾,ôÙ`En¦°BŸ½0Ý­"l ]faF&žUÍ[Êt«Þì°ëvÂø.ýÊzÒuq0/¡¬¤µ| žVJ8{ï,Ïív~^Íl§,.S麜À¶˜Á=1·îf}‹«™ü¦PôHÛËÛœG½ÚJ½ù”lX­éî5afÒb8òV ëÂÉ­XYVw ë—?À#—ûW¬˜·ß²ùÒèî|¾c'ïQ}çkŸ&{¹d2ºÀ‚Õã2Ô¢{`x˜¢± 4^†k’/ç4ê!‡Á­Äý¯oÿä—F£\ª$\‡Ôaµ2°¨Ý–Þß6WÿžéÌé |BL‚‰Õ>¬öÆe3f¢"Ý MÙ1Ë‘e÷€¦.'28„b0¨)A!˜J¬D"1• ¤¸ >Á Ppp(É‹^‹ýó…yb§p¤Ñ.øcÒ/¿WM_??Ùl_ÞÄÇd¹p¬m­ºÎšö:Å|M¹™¡\ÙU¹É.ËQXŽY¶- q/m)¹{¨5xß…è ˆúSùykƇEªŒE¤è2¸Î C²²™#°¦}+¬ €ŒH±ÆA8ŠŽö»!i.j`Þ¤3íÚ°ø©Ëû­8˜÷™»Hu¡¸½¦42†![¼•°èÃh­œ²À7{Þ«^û”„BßÚj Ä…Fº4¼êvm)]ÈÛÂ%XÕª^6®4=J÷b;—a¿ë×!á¯ÕtÆsÜ䬒A»t¿s6kàœïþiyç=ó~ÞX¸¥B$ºÉ¯)‡¬žß»ÜòÀX¿þ]ÜwpO”’¥Nò[”äOŽ‹7ýh8%‹5@Uϼu¼TYãVjUÅW¦ð¤!ÒØúÂwß[çÁÜã܈ÓÕ|êŠlãæxÞr"¼ÖwÞÅNŠ“±êíØÌF9ìËVÓú+ö%î•pg홾„¾æÂI]äåCЉ¼Àå¿ÿ]{`3é}ö$A2Ÿð%ù¡?㛄*Òr¨êMÚ¹Ò¯±˜~Øül Õ»WwÇìu~5£ :ªJ_KR |êNN†ƒë\εW] (S0ºàðGîs¦êý=1¯æŠŠö^”oà°îœÃ$ßý¼»ó¢ÖïÍ+bsü`»Ž4¡)µ£CÁÛkJWäèU¾ÛÞßÛ5àÏuïå+nìñü†‰€Èë`¾Õæ«¡F&th­()ãCaÇmGì¬X0¡Á¢£,A®‹Ÿ¨Ý¶çóaf…½ÔÔ8«ZçÃIî}yÇÈÍîÓòqbKS2§OP(}ßÇÃÈ7IFz>þ䨰–ó‹BPsÊÛy+s*ôÝŒOß? ºÜ-% ¡’×í½9ÎÎ!cju*IŸÙÔŠq]çŽ{UΨÎ+õ—Ϲ×&VK#ª” íê'6ãaAÊ‹WÐqN6Aöhº'£ñg“æ€ô ÷réÎ/@ÛÎkV S'Dë´'ÙðŒ‰fªF¼RÈ|Ú2¹ºï°2ú 2éVýF Kdg“YFi˳mDîãÔûy77Ù¤0N¾ ! .ãyMöÚ„DD"O¶N0$Ñç>}° ¨Fk䉰*t’‘LyUß¶4óO´¢ããûAa|½q’>‘¸GþðÇÄyðŽ€Ö'}M…þ|Ù›ä¼g¹Lð,´¶në]z÷ú –¶n¾Ü¯Ý_x6ÈúîOìíOxú¶Ž:÷ÒÔÖ®±›A»8}|ùñ"v–¶„º©8•ò¯4œ4\Ïí\djHÂÕÏgûaurÈÕË8WØ¢Ó߯Ó×Çß§š«&Êø©O*² V2…LE•Ö8Ìu !!¶5C§¿ü÷ý¼?µR"¬u³BÙK_Ó˜¢-–o¸ë”&ÃÆ©Pè"­Ù©Á· <§HÈ­ê9}æ¿FqÐW—ð|ÿGΩŒ^÷¢ƒÿÓ÷ o¦5/š’éœ.QºÒ®ç(¶‘Ûà°Y7§Î:ª±•»ª+j3‰¹»Ä¹á´Ñ’Jd%ztt¾—kZ¹qþžØáfQ|È$ß_œÇ¯îaÒÇM“ëà}§l (6!щé4¥Sq‚>”þùôß;ò¯f9…`'(¨ \ 7Ð| ûíÚÅrŸ‡š :fýùkünóWû‹Ž8Rò<ßíÅŸ_è%’³|]c4Ø}ªùé~¶µ9‚ÁðþÄFCóàôì{ÞHUîâò¼w÷À2~n«½éÔKW¶C¾€Ô=æùÁð´§!}’ û1 uëéN1|ãÏë\è<÷yãû³3ûõ:˜ R¸¤M VzyÝ›ç^·gr&Ô²a¦%•&7ÎÁ´R­_þ¶>îçÕË-³µ óBL¥¢7&ƒ4ë¢Ð~Á“BºÌ-m±X°Ù)ÔÒ06\$Œ&æ€4JË—O©ýoOZœæÐγtnEᚇž.³ÖcKfÌL;Ò_;uÑu"ï¡ÀTDÍ«†D×yµßä™Y϶±ÏÕ~ö·+~žˆ"ÏÒ±UFY;H‹À"J BܶÙñd†“Ž˜ºD¡á×e U?}þ­ý'o~^ÃÉ6§=Ÿ5”Ç0y™¹ùèÓNHåîÉåÉ1”¯DD°QÂ¥’Ïž›_È*abªZ¥Y-2¼D*Yv°ÈB–c[râU¢ÖOZ—íý#åÍŠ›Áëú? üïÔÎ…îþ{ŸO sÑõzgAˆŒÞ!ÂYH–0Æߣ‡½_GϽ_ó_>ás^þÛ×ä~Š/Þ£þ~ÿMàsDœÐ†;ñ|ääì[¸¬zUJÁœv²6åýšõG-¾w÷ Ì3ìO?sƒ!‚˜ÝÜÉ??º’oMû­oÛŒ”±á²‰B QR­Í (6€dn`2c©³‡ôHKT8£õ…šÆs—|Õ—Ï}Ÿë>ªB 0 P |M޽N‰±IC^_x\Ü „8‚æ`ÚAõ±Þ2“çi;ÝsPfÔï•ûãW'7¯¿“b÷µŽámzÁC"¾éÐ%îâœùûÙûuüÛŸÚ&0ŸþùùÜ?ýú÷õÃ?üÿ—ÏŸâÅÆí g!‰Ž?… ÃäÕ|žÿ1S\ü~µïOÿ½£ïÙ½zTM'8çݤŠè 63 !¥J¦mדÓõ2XUv–þë)þœDI@"C®&RGê8zéu;>×Çùyç<<}÷Â÷.˜Ì̵}[:VOp6ĤŽÃY0døJ Ø^&{ñ3Ãc­ÇöÇ~WôrJB8,TP¿•ö²/m;ûP„˜AÄŠQÁµ¬ !çÉD¨ØYϧx‰oÚ‡ÆïNê¾Uÿ\ƒ,@T<=孵͇r3×øÂÞ2ghçç®­³õU·øÞbVºF/·€Ãñ|yÄ=ÐUêèÔû+¿5>èŽóxâõ­’¯UCwªŽ­£}?,\g÷Þñí ß:¥ŸÞ¥ü=Iž»{–sàóïÀaŸÓü¸Öº`O)ÁF!$ HæÅ-aRz9<‹Å>ÑÓ(žo»<¿ôõ9™ot‡æ{«Ÿ.-Åž¾¿ú/póòBØK¹æVúÕu›«10#ÞsÒ÷‚JÀÚc`ËVd®ÚL¡•¬IÒ•i©n$²=#8k\99ËÊž†´JÏíèãäì±£x#Òò˜6‹WÒÃ#Óäw M ×/!`"U™V˜<±Ø.ÄDX™€‚pÖ¹õuÖ¡ÝæD"Gþ:¿ÂÌ_ù¤W‡ç½ÂonÆã^2ÄãóœZ÷·‡jWòsˆ‰êusBÓÁŇky<•vG›¡¼ïB>zX#îÃl‚™¼_¦ŸÁÇ)¸3ÌXÊ 5ÀÆC6¬AÞÂ_t=e©1 ®®qÏ(ål8˜³Ÿañ)r$Ó¥¿üJoš?‰¶(\Û•õ4¡´¥ƒÍâ–ó,Á,Ò†Þ Õ …e Gœ¶åJÜW»UÞô:BØr)2xÝyR_ûʶ nézaÇnÓâZH›5n?¹oàhh³ÒiI$»Ü)»Ú‡‹•Þô±)2ÇM7DP7 H¬ûÙs¸dë½â¦Þp¥ûOõzogîµ7Z/wâ¦?G2ÉÜ* ™®šñ¢G±I­o6ç€õµÊ¾tëõ¬À0'Ù¢‘SÛxÈpxTÆÆåxíÈTV§«\x¥žs£†¹ÜÚ‹9-èó*² òy³A8;©µNùAß>œ’F›éå°l'›ÂCƒV¹*ŸæË‚ø=«Í]f¼]˜`Óß‚[” ôoÛ¾;¶d„ϺOy!w^ÊíºXd%JÍÎXà•©Xï(¦/ k eÒüùde3 ‚rñyáÕîx‹ÖsýîhM;‘›Ð͸tÿüÎû­Ç,79œ¿?fù ”ÜpÕWUèdtôù'1x²˜ošéÎ-ƒîÛãðéçÍA#ŸÃúÛ¦7*(t†7ìU¥•Æe9#¶µÆ Ç¢GUš‰Æ¬ä1ÍŠí ¯PÛËï0k#Ÿ¿žýãúÏ3žŸæªI’éôg±àºäÈeRðÄ,'&Nß­em14}Ï®é†f¨—ÕÇ ú“…à»I¢…ýåoö_àZ¬cZ§Mî‘é·Ö™a­ÌDÕµ¯Ö¬È$|Ö`¢T›|{WHþ‘÷M3!¬rù•Þ§«[~ ΗyÜú±mqsˆ_þüÛèƒðˆïSˆÕ@£FÿÙUK=KRÆ»ÆÛš v®Â%Û“.J‹DOwÏ NÓŠ– ~:\H8$,äÎR"˜çP‡h4©Lãv\î8oÄ7äuQör½3K÷®exº*ErD‘XÆ(Ç$œ¯±„¬db›ŒÄÈIÀ%Lˆ’ ‘ÖwD'Ñ4ºÂØ¥âGq?¦ÃaˆÜÆüB u¢µ­³E*©‡´‹"%–x)•†Ži1p¨„¬Ð¤SüWqÒ?ÎYDCGhrÆa¥8j±r©c=Öq¢‹å=ƒš2·L¦:bf0ñ`º¼8ò#96ÒMFT˜\$EÆ!YI"ݦÀvU¾œPñx0”ùÝß Õß0}Tƒþ”þƒj°6 ñù™§¥{gü ëŒs艊T2 Â¡Sº¤”‰4…†µ’.¤qÛ£Ÿè‘æ¬HÓšh¡88d¸<^|P–Â"’…$ª Û¢ÕZÎÝb¥®¥ÒÞÐÏ?¡]{jRo§­Ä¢ßþæFóÏ÷î½ÙóæõÓïoMöxœþëíÖ«Œûcš…å¯Sí¼þ}ï·ÞÌ×§©$×ϵ»ìÕüýbÏ}±3Ø|^ò Áq |5¥½ hã…XHMEàÀ_u|ÞËHX¿â:6ž(Ѓb“”BÐuîGö‹™íе^kg“~r 3™óÚõ²÷»S>i‡ëž¦Ç\óX&V4^ÁÝ&-cZ/iëõÅVuõS·HQ  D a2Ó­»¯Põ+gEQˆl3¬&ѱ¸ÊD„/,;M&ç¸~Dèi/ýxÄÌí~àöâ­d¢tõuO~Ûî|/Rê$ÁœÈ¤ÛOW´÷Êóñ'Çí+;ÐÚ¶ÏÇ¿HZ_c.oîðby¬>ÃB•²"ñ7¾Ù]§Á,T*µ×r÷ÊtÛ£8ˆ•‚ö>S LƒBª¬¡¸Ö\ «ÄIm*©à$õˆ\œ…¡xòåMRµï´¼Â …—ÕxF!Π6K€ÀÞçxܸ˜ú¬ÓüK?®ð6ÏyÖC$ˆ–´.\ <äºëÜô¹,­¶ˆÁÇnª1wàsô¥4ó^ó:9×ààÌW'ÓjóÛï(ýÒçSÃe©ž × ԕ箆Æš!Ô = òÙoÁߎȞ}-0q‡žÈSç]_þ>¯Ÿ=R>v*2Eƶ>¡ï2…­?‰\»U³‹â<÷mýŸ|ímóÿ¼ýÏøòׯ”«¿k|ûp?Á;?–¸qP_Ý×ò!Í.¿,ëüH·./»QQõWrõÍLþwÑ}Û?”)u7¿)eþr=*_à„,cçÝȱ€“Ñ‹ÐóÉ>ߙݽn?€Ýù áW¾¥ѽUâbg3ÄÀªO¹Dm`ä£ú¼rÏGd™ŠÞÀqŽ­}JÞ;¿È¶æpöò¬ R\€…vLE„2ÅðäI$èÒiíXc:0D-èÆ¤ª`Pp± $@Õ ™€ç¹ç0Hƒ‘ˆ‚ˆ††%wëÉýÜ5%qGÓ`š€ðiF­·Ž'­^šÖTVœ Æ”Ä;„Lv˜Wòn{»Û6ºŠ±íÿ@(ÌžVL Bãð÷§ QjHêü°I¼»ÀP‚‚êÆ[i ¶e­kRùÌø!}šŽª»vÈÝtc~*úFrðÞ­í•Á^[­ðt1â,°! j¾cµÒ"¿ùó—ôNïî&§ýõôÿÍ¡üwÿ#ÙÕ÷2>-± XdêŠ ¿5ÿáúMóÓ’?†Û%¼&í ;h&¯O±:©ŠMf, P¡t×ûÔjüÿµÌØ;þä_üêÿg‚¤Gò:ENG œôHcTgž¶îLò¶×‡ö£Ÿ´ÎxJކo Ù¯ñ@®£ÊEM  ÄQiû‚ÇGF”£Ò°Ë;õF¤Ãìvt·ÃΣФq:º€Z±è²/v2$Ä¡DŸÈk›˜ò§|¡ÿ;~4÷?ìmº¾}>Zné*îÒ‡ð1lh¥_˜a|*Oð»ö¾ÛÔsÏÐS|3îç>·9õóÄ$ÙùNýCGs¤láñî÷·ÏÃÎÒ'ª%ÃpÒʹšÇ½.ÙºÕÇIk{yÒUäý¦ôÕÄÙïìÜlÜ:¸«¹¯SÏ×þÖ)ôË,ƒÔîÏs#«ç4ëœò|@”Þ⌶²NOK×h˜»¸Ý3T—DÒëšÛG)%㩜¾€µ©C:WVI[[}ªJ³ÙJOõé ,WZ«w¹¿Ì¦¹Ó{ ˆÖÝø(Q°KÁ€ô²3¹íçî¾D4‰B1D€[GT+ÂZ¦·˜¯ÈÜò‚ Êà ˜2 pÈlˆ0/¯àM*ÄûUÛÅ=eç–IvÏCa˜§Y™Ëãþ®-A†ÈBуö`œI>¡B¢N) G¡cv~`¥äcfUªÃ¥Þßux塇ð.ZÉc!g¬DŸ" ×Õëgñ]›ì¨k¸¿-µøŽüIg±$O­h‡,ã‹k$¯É“r%0¬Í¨éV³ ØFJŽ/ó…ŒCRÅâÛ¢wçŒÎo7è9Å€­´r„Æ&·Œ‡(ÌeHãKfõ¹ ³E¥ÒÛ[íwîõË›¾ÑS=¼Ñœn17žXO¨j01ôȽbÇŒµ‘™W3ý`í0$E/(Ô1è »ý®·'ý™›Mö¶†¢·ö¼7fÒbwºõw¾ãi:Mss;£çN¹ºGz¡³p*1Õ+…•…DdÈHiè1)ÕCñçÏäËЪäE`TóÍs{j7ü§â/-b?óÌUUó=ök°dÖ2Œ½tZtPãY;ãgýo×<_ç×ý9èÎ;.ÊËý½´ÿöGúÑžÏm["s#'8d5¥X¶{ª1CJah¡QL+Y•},‚çc.òP 7”$kû¹ ¸]Êùû6`ÿ<3µp|–eC…YcªÏÑLù•$FkÚ¯`‡¾^…y}k(°9iªy>ÿçq;Öç¾}¬H»ƒÍ#ñJNÐѶ§@´{UÇwMÈ:¼/8¯Á«ƒ­Þ¨h‚gàÓߣ‚¨+cçÆ~ží˜Eùqì?¼³³sÌéh6QÃR8*@éPȯ³¬&¾°% i€5.d¨`:¶Q;"[<@±&6$®ï"6ÊðÐæŒ!ž*bºi3ô5®AHÙ/r>éëVt ](mÄ¡ö8K5±“ϸŸ©éV¼mrWx#ÐÈ%„D? Ð /ÏeôêT¦ØìѲÑò¸r?ë—[lFÏnV!pöIAVÁAIÙªn–¾X’æ’!dT§á8ÇG€aü†@õa#2´c d!ŸÕÀIÎ4ÔX›®DGˆæ¬—Å+‚ñ—ŽQ[˜Ey¡ JiœlF)ÉÃtL ±J´@Œ38sÔÆ±lÒV„ ÓÄã±$Šj ÿÈ&‡Ç§?äh¯6›o†_Ê`œb¡Èì$këÓ’¾¬‰scÕ­’˜ÒVAÖ´#Cƒ;Ý5QœHv4¾¤í;ûËU_B< Ó+odlK1Tu{tk¼àüz­¡ä±Áªèêd°|¹Ü~ŠÎ÷7ù¶Pò]ïŸèËû¶òó½Ñ†Ã€*ò½˜õ%“ضämÎèö¶ü­½›|ø×û|ÞŠý¿þA1ûæ®æR*šñ€[`¡øP @ôÆ¡“E†à7,Ç6Ôa."¥ (²ÅÜàì3í¨»Ñ¤6$÷Ï>93È ÄÆÜeFQ¿S¯ 1ÒigzZÔ%!øˆõןâ}õQG†2W'#mÇê”!‡Ì³²êy‚J%wãýiá±—ifL?õx |cajË,v¼s«1ŠQ%I Zt£„Àb^X_Ù.o Ñ@‘’0âÁV!LJ3¹±ç+ÝKî'Îâ•&Qr§„¢b:Æ›ÐÕj»Ú•rŨI™“}MF©´ª$©F‚J¨¯tð¬B^/“‡4‚Ya[ ÓI½&>¥6´à*IH8 Ñ_eCD†)œ¼¶AÆÍ¦ ²gMÅø=[çNÚ#÷·>ëBÙÐý͸Â1ÜjÒ>ì3 8•àáÞF6Å ZÀx±ãoÓØCúúÉž›Í=9[¦7Ùv¾œçÇJê€G=o©èÊåŸ>…~O@vJ«ÌyåY“ è)2}ohâR¨ÚžZÁtYhczŠHù*šüŽÿñóz-ã@[Ðù¢ïìÄ;=Ìâ7æ¾âóᬩ_¯œv^°Kì>iŒ£õ;·_(®3Š ¢?öX+ù•ãã«yà”áC'‡ënË©*’482ÊÜÊD Q9/Ðpw–5œYÁ€B$2°LA!Å*ÛÊ9 ‡¿Ñëˆ=ÖÖ¦zVT%µnG!²!Ù"I"h#!W‡rÐ*ê ªAÒE3œb3ÒÏ.Û˵0:gMèÌÞåP2îLÌ2Kc«ïìéXEs$€Z‡65r¢&±GÈsÖcÏò´uöÒX")C=€¢‚èCúÚÛ/Ï:®4âLF¾p@  °ÓüÔÖL–ŽëÑÕèõ>«x÷ëï~Ýó ýÁW<«W¤C…˜/Ž3kçÄ °,àV J˵~ŽéÑì®GèÝ·ºµ{xºûÝ /øFŒìd@Dtùò•ìíÇ1¾ù\9pS¶÷è¶“6o½ôìoêú×ßÖ?>ß^ÏGš¸a‹˜ºGí¨jø¤¯’û¡Xòç‡)_LÉ¡T¶ùRz>¹®æqÐï_¾Óï"oòzŸ&[<ÚÜÇŽ´]Ë ê [¼:%® `ìt W¾^÷ýEYÞ×ã˯óþwäŸðÏf㺪ømð@1™Øóñ|^ñ¬û°âçÔ÷ñöòJçZÞÞ°n¿~•ç{#Œíq\H¦~#šÓ8MQ 8# ’tPÒи·$ÉEâéÅvDâ …iÄ1$ ÁBð@%Å#K&ui:çVžÝÜœT&C¦„LÊKq¹uµFJ™å™Ì@k´#¶b‚9ƒž‡+mÌBžányµQg”<“ÇFL‰(”Õücâ¯R̤…¬IBœ$ krŠ( b8PzH*í°WUjZ†ñŠlœSfîB&uoÉ=ˤ“=Ì £p®ëÅÆÄšÂÀS[T‰H¥~æøõë÷çâoŸÒ¡;¹‡¥ˆŽ^…nŸ"¸˜‡Y¨Õ[´€ÝbÚsÀ›DêDLôë«ý~ª³~w]ðl“Ÿ©”®×ê™ú üï¹'xè¡ON•0;8$1ÆÉ¬C9Az•£>Ýö}Õ¬;ˆ¶€6’‡Ù¥ÇX5†L’KP>6T¶_Ù€‹¹­M[ÐXµ?Z§Ü3‡ÁJ·+ØF†9îvq@ßÕmt,™ /òTèÈ~Á÷öCvã÷ã»ì Ð ’o‘L©"û«õ5ûÆúÃ9*‹4ÌXKyÐ×îdÌÏâ±®Ò#̓۽Û]ߣލñŒƒã-UóuÊ­€P³–ûÏræjoÖ|û~|PçÛØÚ“¨j§¹ÚÂÖ ð›ö®½þêÇGTÁ~ÛÈ+$ØÚÿÆî»ŸNFqF tE5/Î2ÿv¶õþ\(LÚo¥ÑPéøwY)²ÎÔ5ÝŠÅaY½A²È‘éÇq§’MqP;ŽU D•ó²sÆ…´”5.k"Xï›Uº8Úö”ùU·W]Ç%.¯¯×‚C5¼¿°nÈ9÷Ãl­¹o-¡,:înòyÀ-ó×ç´‚&pª÷]zØ °Ø2ܪO‰%Ôñ=ì[6Ï>)Í6’öŠûîåfõ«ÃŸC$í7ãù³ùîJ‰ô}@M «ùÄq´zˆ™0³¼5$6EÛÕŒkŠöWá~1y~u©F¢ÈVPBÆ/xIöŒJD£ñ…¯Èú×ÀßpU¶å/èJ4(ÐÏ,yMªØíR˜p™TÐëW·6âmtMbaùÜ^‚:Ž*úVpbßÍ·Ýí´˜ïò²¿Î}`„®( àƒÊG†jüxIÄdAÖÚ¡aGö?œ/Û:DÌH†GUÒVT[Ÿ¹Ìl:÷ƒ¼íùÛžëZ÷ çiºì?Õ¼ÀÌ\g)€…ÊJÉ1L‰µ¥×Ö1<©M]õºEºéÀÂÞb³¾‚â/ËþØP‹™xgâoó®}`¤Â‹n½äõüÒkÓMXnšŠñÓ(Ü6í ûò®‚Pó9ŽƒRÜ»'m˜*бE Ÿgç»é3š¶`[ý<ó¾'S4%¯?Ah§»œsHhòà|;¸–V·6P™ðxÙáLýîZWö^µ¢™òËpìwJgÊlÕxdr v¥ Ä^Lrì|ç_è†fQƒ@ñYçÙØÐ.hçÖÓzK[[ë‡âVëêF¼ gÉ64F{Þáwò{hºP9Ü «Jð5ÅÒÓ5Rež†PmŠ —.ÓíF8o÷zׇÁ Ûíµ­]ƒ%°ÎJɯ;&ô´¼û©G9‹JÁjPEDF]!ŸëL³–Ñè:„X… ý’Ašßg^„ÊúÅEÒŽI9å Kk^ʾ{½·øéûþÞ-¦ÜÌ•C-œ8Ê×tK­þ“®^¿Fï¯ÙƒtqàD¯êý‘Ušk–Ø'õ¼ˆkEßWD‡ ø.ø×ò?¼÷èíŽúÀE‚Ó/ƒ³Ÿ×&K×§Ä —.VÑá°8®yÜÏ0ï ûz»P0€yÑ3‡O›µ mïÚ}î}Ñb’ú²8’²zxd¾ÜZ ZŽOCe¢=._gr «ÑÐD'©dN, åtlc®½Àg7‡ƒÚ'WâÓÝÅáU–÷ÒÃ\Ƙ&]´Jh+ˆ×Ò1ÓT>‹ºê½?ãäìTmeÈž~`ý·K-+æZ†;ìÙÉuÚåzî³Ë"¸qq!ñt¤BRE‚i<Ô$É1\5K<Ýõ8{ÄÂÎŒ!¹°«²HÛü¹yS‹°èHl£`Ô:ô!PI€Œ©|Ó!z‚Ã:ruü~ƒí§Ï’hAZ4”Èc³é~ä­óIp.÷Žh̹vãGà ¨Ô·.‡Ž¢(æÆi¨—Coœhжì@’¤b·¦ [c HR0ôZ^Xs;G¸åZ9ÿçgXIjkg©ß=üUÐ28 Q§ØÒâ¸|ùm0Üô/”mgX­C=4G‹éá°šLGÞ38¶£Vùqнå !²ñ­äDï–ŽÓ3cÒ5m*‰$Š!ìtöåÏ_š=øAÖW™[gpÔ0°-½Hßéá!zÕ}úúã‘|÷¼±¯Ü¿åqŽÆ­a4&ÜŠY·úçe7NûŒ{¦ç ®g©0søã²×vá\l!àê©%®z¶@A+\@З/Ž’¦Jßç¾_ùz+ qk ½k6öåL{§±˜Û¿œ,Ïc&=_Õ§•¢Øi«^:ÑŽÚ •.–¸;_ZßÚ£~ˆ%ÌRcÒxЬZjšÆ&m<¦ú_ù[å$T#h¢²z;(÷㩳˴¢“.Ül"°€¶6 Ú‡álRe^ùO OY¥Ö°ÑõÒÜjš„ùŽí€‚kúºþ3»óÃÛÌ}eÁmñëq¯ÈKZ-îöVwG9¸¥_v7*)Å•±’%êKJ¹ÙÔv¹ÆŸ[nåT»èy°²z.%øåª¨ÞÆ ?ª#ã¾_tÛÙ&ý¼u‹+UÁ°|ÑO(5…Æ]©×åTLÃvk³WÖÅ0A"¨"†r§¶R.:T©¾ ˆ€´QßažøF®²ýYõ¨k«*™ DŠ7!6‘F IŽ6[ÃSÐ4†Fœ0&&x"a}‰zl]¶o·û˜¬Z²«¤bQªj gIEqôë£À$a†Q[,´ˆgtigÚ=š’h‡'ÑTêâZ]ô_÷îuÖÕ2(•¶ÊR,Éçh Dð·#³Nç£â$…:ÀÚØLªÃRÇß–üöéQdde툑ÐÇÂ{ý{Vô¹-2%¿BÍ臽6þÿU%;àØàîrºþT_F^¸.H!–`§Ð/Q:½eGøiÚ©R­ß½Ïz û¥f¹gz›í>^r&º,0ºÃ‡‰§ß±+¯Î–0^몾*ü¬4…ËÂÛ'o3šŒvsÈZ#±J‰Æ*WkÅwî)ƒÃ{¶©ˆ›f^„K%°‘®~B ŽsðBîRH×Ê}>Ôó6¹ùdõè²!³Çj½ºr#Y±)ßãUÓŽ8¬\¾T B#6 j’&Y&½úLÏ9HísûëÞ÷CÃìô(¦ß„´Ú ZiUµ Ÿvþ¦ÓMLP Ç(CZzÊ£Þ²©< 'vÍÝGÐ!h© ž„:½¡R3¹aç·™Ýð»~7¹š††Š²U5QÄq…Ï8bÛeK4—=C¶Úô˯çÙߨ_š?kD0AÜ Pë¶©bdDZE ƒì‘ù•ò—zÙ¦ç%>uùù©Në~$»glý£ÀD¢V²EmfßîqÏãê½ÇXÊxÎDH÷ÌýuçûεwçlsÀ3gßé|ÄE<óA {°~ý—oÉ|íþá½éúòQÙ„äZêÜ·“NÜÓۿ䫟LwèO»ø×ëÆ¼'{Ø~zÒ—g”aPLD‚¢ÏØ~0m‘À‹r/ºl¾Wç6Ïmæ7úæþ7ë“<©Óþî¾rò ›÷þøÓ ÎLΉÑäé?lÿñ~f†—»gœK-,ô_ï>óýní½KˆÓm½Þ()e©ßyŠDǸ@Œ O{DT™)A%yvi`S ³†-Ïèqq$Ù¢“ÊšjP<—Œ¢ ƒ¨9 ˆä¼ÒgœÌKþ¢ç™³zgêwe•%1&;úÁŸp¶tPƒu}×ôZÿãÓòu€jÄ´¥Ý¬Ñ³õ”Î`j6°©>´&«°G`¨²žbõÊ0`Å (&T"޽]_øwP€„5Ý@ÀCrÈLË ]@©ÕБC™g”ç¢Ù¾ï¤»¹F8 ŽïÁ,~ֹغ‰,`õÈ8|§¿¬^¿éùüíæƒû­ýßà¿'b0݈qžV&–¡àö3#P³IA€_mQÈRÙœ=sEwl5IªlÓ­ïÓ}¯::Î.¹Ë|½]æt(jnÒã\F¿Z.ß­r†(®R¦¼$u6ðƒ|½{×csåûš×X‡±=b±§¤C!'Å@dB¢á¢Afö´í®ÂõØÃmƒ5—¶ëaµj[·r›uÖyöž]cŽ@ûµ½"ÐÒ$@¬ÌZöF{5û^àßø÷cܵß7'Q"„Læ")ÀuöMø„þ‹æ|&!ÅÏâ¬?ñ–7†*éñüo »Ó«³y è€è{ÜÝí+h†ÕÐÊ,&¢Sæšô9ô·zÿ©BÕ¾eªCü³+Vçí#8P^.¯¢—²Û8%ÊY%,×mM¯à‡ÉÝ»¯·‹’xAÛ“õ`g …d@Ù'>r×gEkÜgï'دXž%ôãr½çÛGAìÕu:ÙteЈ´Œv?‰ï$ÏäâÅ~!S2±(JŸ™c@l­Kð\07”tÀÓò´DºÎõ¾’G6ÛnòÀq‘Å.\QàÆ ÙNiµT¡§lÁm”ˆ§(‘²ÈÎãpV Ã<† ë‡ÏîVy kròr@bà9°UürSûh*¡‹Ú«¸ ãÀo©~žÎŸ$‹â@Ù¨çªÓtö|: ÇóR Ld‘-0çNh }Î&b©åÂÚž;‹ƒufœ’ëþìŽ8›û-ÜÞÛ¹:yNs"É×sGIÒ»ËkHöY N6ýµUÒìQ‰N³§“Ø€SB†F´b2õáð«ãø£)0±©H€±­øˆä I2ôÊSÞ—#ïW÷ÖWù(‚|bX⩯ºé®ü’˜KÇò2ÄbϺyQѳ1aì˜b#ZÙB¢GMÙ-ŒiŽQŒ°°šÆbó˜â±Á `FpN™ŒŠ›êâ&€ˆ˜žó{¹.ëŸz½þ^ûp~?füòÖ-LÏÖã Îdp>Ôš}+d„©¥ÿVôÜÃ3˜;îšwreòÒØ]åÂïÑTŽ»µ›î±„W]ï=¾=5·ÝÄ­œ{½úv}q~ÿÆó=Xè‘@“s%—ÝFi!Ú9bÃvÓFAêþ>¯ ©â¾Â6E.{ÝŸ#æëß{ºÿõÛcþøo¿®çJ6Y@è̌Θ½18j)×5-½}Ô°e’$ÃÛñN3ùütÿ~¦ˆ^pûóù•aÇI;ƒºo:^sw&~?ïØ¼}¼ôlUO•FzXžËw?@Èzãg.ëö+Þû½îiû×Ïíø^ÿgÊïåälÚüœ>5u|ÜßÐØ<±µ’¿ãÑ×)ÐÊËÁ%ûßg^ˆ‡³U®¨6vw‹Ò£~(“vOF#$˜î p$=1Cêž­ww÷4(µT[Ÿ¦Ö1±T cýfž–š8µœÇNºÌl³ÞÇ)«DÆ­ @W!È€Gª@yª¨¦Œ‹è=¦œúÃ|éÌø8‡¬?¨¬ŽJúR`n ˜{ZªcˆÔiç°÷ÒàDU”^¶"ÄzYJÁ*N¨*w~J²ÛóòçS÷Û‘ŽcŽ'×< ña;5Àã,m¤zвBZJíU&SèÊh£·ghGö¼,žDjëÝé4ä`jø¢ D ôˆ/ItÅ{‚ËBcZ.”Jн”þëÿÀößkþ/pqâ>ý½7>©n¹ÑC踣-Ìw«ýÂÛ31ZèNÓH AY%&Ö§ü£ÉFtJhŒf©µˆNÔº‰È€ “Â-38– **Þ""% ‹5nýupH½ifžÆ9ÊÞKNŸŸ÷ó̳¢ó¾Î%jcð®=°Þ{wG0 GbPצ›ä³d¿ÏÜÛýªgwò­üjm# Á¤ÇíBê Š˜ø=P@Š*\0q_½b+‰¥WÝ~u7 Œñæó©N»ÓFºÁn­»<¤œl·e»Y™ä¡ë}ôpY.?¹f:§‹c7Qƒoò »cn%ìk"wME›2ì3źÅ 0YÐ$«´ö@-õJø Þ¯à‘Æ•ÏB¡¹¨žÄylãñd+_À 4wå£<õ,mèìÇ2Úäô\˜Öâè—Ì¢Ð:Ë{òà "R¿•ÿ­ìg»øköz|4ÿèþ/Èý”0ÒnNÀ0îêgElÔvtÀÁYÆõÓ,F kùÓn¯ÝzW“ .œX±&‰•£ÓhW¢^–&ò^ޏ~ÒuÝþ éÔôœK‡hR©en š Æ{0?s.œØ·RæSŠÅP‘ŠÑ•ÖMjF¶’™{ósU¶ÊÅ¡³/'Ætn×9“4BôTÙâÊ ÏhB3m$©ò\Ç´¹a™ÀVc]=D)_¹UìÖ„øaaO¹å­¥I±—·tŭɾ»ÌeLY¾™eÇHí*g•;ê¯/ŒÈq _ Ø™Îbƒwo*Zb>C©°mZm‰h¦Ôµ?2w‰ð·.Gß“9–™A.€ü"L„*ªB4)A#þKülËŸ 9ÿÊÿ"ôHOgà$h‘*;%õíàçÊv 0Nô…´aÄå¶K`m2pQ¹/ ÍC÷;W·b“Π‡)hlËA᩼ptB?89ÍÖN;‚¯¸lUÀG»º¤¡A„ê² ¹lh|ÝØB­“Ÿ¼üÒʇK•ì‡lª:‡Š\‘Š•” R¯žvË:Ü—ŸxýPホ{³ÿòüLo-¦2£ f fèúÎ÷²Óiÿt«Ì^´"¢8@N¤ØÄ%êÜd³®ú¦õÔ¼ûÒÈ× )Ktú¡›N+¶(ž®¯?†ÃO쯜à$=È„t`X±€FâªަÊ#@çE„ ÖŒf±à÷=¥×øÞï|xe~žýÙÄXçñô{®ñn„ECxg÷™—ü|s^}}‡Ù6vŒý4áCº.tŒcAq -±/T» i ´dª®KWâÉmÉs¤Š=«©§×Ó|¾á÷«ê>šÌŽ?­;‚¨Z¶³m)¶¿ºüüˬƒ3û#‰˜p²àt?3qtãuNeÅk¶j¶©'SC®Ï¶«žùöÅ>çAWb>º±$Çœ5x5ç­þIú7{¸ß¿û ·2Ïzª>ã®—5û°¨²Ñ`°Š­8‘IƒKû¹Ü 5ÙüO[|ýn¿é¾¿šÇîžZ²À®/ûË7’â÷;mÌ×_ÓúÒû6:o´3÷층Ûœ¦Uþî"¥}6ÒÇÄäÊ2yãÙ<½ûۧ묮 --¸6¢Ø‰#P€Ä•"`Ð$!ÐI™DÁ’Ѥt‚FÔÙBH(B&¢Œ>éÈJ È’6èÎ¥ŸÐÉ_ÖZöýßû´OòþI¼š+þ•¤–´/þq>ZßasðbÍèéqÔàS¹~$HÆP¶ fÁT[3`0Ià€Hd ' À¨ôùØç¿ü×Ì;ãJ’@hPÃAB%€iYŽYY ÅUâ@=x@ÈðsÐÀ*$læjŠš!X«X¾ºË¯ÑšS|r-»^Ç`Xæ7‘«þøO¿ök÷œ÷)>ùûìÿöêÂK›1Zœ(msÕ­­yÕW-þÃD|ÑXÓ&,! 8ÉX̨}»4'Ç܇§ïLª Õl•»âÜtU+:cšà)MÆD&›ÊeŒÒ Ýôàísûò4ž'Qù¨ÒV91™mâ,Í %½M =:ÅÀRèHçõç™Õ¶ù¶þÌ6lh§ÕÏ‚©gïÙˆ½à´L¢Æ@u´®\ÅþÀû?÷¿ü HÄi¡ J(Â6#É1ü¾` §I-¶”'Alx¦hjÄ9´ýØA ¨gþRýqe¤;˜ë¤ 'EœxnÖ¿ùc¡¾ÓNï”,N5YÆJ`ÉÒÈ+ÉM2P;éÒ¹6¸29%«¹v0¯ÿ½?öý¯ç¡¿ÅWßÛèŽûÂMùSj—>U|«’²¬›º·~î YmÍþ„ÕoJ77r€µ¥ÇbÅ ¡MJ³,÷[Ð]GÜ7y¸É¢«öo¯ôï]€¯Î} ”ÜY “±ž*W*Ï}[T?Ž—Î·ÿ=~+û·RÕ‰“~°kËdƒ[@dé†Y©e UÔ\Éþ¼2š`˜é¾nÖmÒ466(®Û!(„“zI'0ÐnÒ2­Xe¨ï©Ã+6ª‡hâ3õ`TxAZ@僚 F¨“ò[^Gì-V¬2v0+î‰'ï*ß’Å ,ŽÀr‚’â’„f›BÄé Ý`µfB*V°­£Q©Å J~M*“õÕõc­’k¨¾y ébmh½T*¯H܈_À¡†GÄfi¨0X¯ýà}7;€œ–Šø’:ŒÉÐ9+P‡šnlZé_7^ã}±ã×Ïâ$?¥âª_5¿·šï±–ý\‘İîB|!6wu¬P’AãÚØ¦£Kæ¶­]C¯äµ~8þ,.D¿*Ÿvól™VtèaG5õ‚pÝ,—ẛ §h¢ÊP|¾ór„¯ø ßm™ˆC:² !Îä²À+u\$pÔ;øçæAKëº|מ°ˆ3ÌJž§Ø›=¥j審gü h¶ |&Ùwàm¬À‡ø'‡? –ÙoI›IÏØ•&Xð¶ZL!ÊÞ_Eƒì¾‡ñØŽ¸Ðćš@ÔÈ5ÔÊA4Ú\Ókðdfœ¶õͳüˆYú­7ŒŠ@^¢‘vBÆ€:$§â²{Òl°$Ýv) ‚×q œÑ¤¾ª7d gÅà½,LhÁeúáJÚYÏ€wð›  Þv¯$nŸÜÂ9mKfDÉ5B”ÖQ<æw8ôŒwÀ^íÉ©[7].”.ˆc(p7[h·I?Ô—µ+F‹nÜEެÁîæ·Åg»ÅW‘žöóç ¦!£º(éÑÓúÂ.‰*O4§_oB„úc;,ä¤P©­J›û—…Xz˜Ú–#>´d†BFV…óLÓx>nD0¬;qƒ¸x%V‹p b’uË’À˜—^Y‹ ö×ûw;õÔü‡Çʉ¡ä¼I´GL..­ öZ[ §"B ·™¹9¯V8u¾šòÖðMëãQ"8³:¢¿™Ûƒƒ©,WìóE:I2» zÒT·DÞi€Xâ­vòt ?•>u¾âµ‚)1žó°°¸Ö#™wíþ¢­,è‰X»;ú|û ôæ“og6ì9sÑÇ¢K} €ÑA®òüâŽÛ<ø%F¡@–UjשÔI .Z› @ÁÊ3¶òTúgŒ`A2`rþ4º˜*™\f[ºÖ5aèÖ©´“t!ÇábQi]ay~н,;Ž´™×›†@Z»ä:ý‹Ðfo²m—Yý8þU!fЧÁJŒ#î˜Ð ø«{õlba_¸­y¥ù.›É9Kîܸµ[ö k`™ciÒ’&(0Z¯Æ‰‚ƒ×AÙOŽõú´Ïõ;wög"ìbçÙ¦ Ѫ©ÜãË+Ï”L`D*0ÈÂv#±¾ý™~™í·¯ÖÑœïo­3-¨…Ø£ ©Û¶WÚ"–Û/U‰áàľ™í^tz8íšzؽŒ ÈÁÎc"1 †;D \",ÚRHñÆM9ÓÙ^XôŠ¡ÉM0Ä0ÒÅæK‡»ã wŠç¸r¢¯ÅÌæªk -£âc¢:Ö^ñ ™á­¶™™8è­vŽƒ C¯(ð>[¡ô†¦—uÑ5]²5|Ñ0ô‰Àþ£Žm7ëòð'|0¦°€Œ±dà9‚.ÚiþòÚç<†tÿ›NP9gæív6@†Äÿ¿c¶ÁGW\º%ž>7©ï5H4MP#lFøj%çÕˆÞ¦§5½@D@ÝN®ˆBÍV3¹ŠcwR7ž›ò¹ß ÙIíºl­n[”Sd± ++£PwÜ}øÌò®³ÇÝ·ÆÔÕ¬w?NrTœ›c©#RD ™X (êf¹Cc •VòÆ\noæ)¥Q‰¹¸”¯J6'â!¯¡…@ »Æ:ˆï|ÖtðÆØO$¬ ÐD…X …d2‘Àq½ÉÏЄGóÙ­W×¥+#±ÌX,¼òøPÆ«+Ž*˜ „zhd@Ð0ıˆ'µ„*@œªEFL†3 Г±û+¯û;Û¥ù¤\ýÀ@~…3¬]n_ïÿíõUÛ5O¼mæOß+ü>¿ˆæ_GgÉ‚xŒ`¦®`E:(ª¨aŒ1× ¨;€()ûVˆ#DÇ÷€=kÎâIGN¢I4GÆnt†oPÁ!BJwrÄ‘aªf^]kqx/ut­æÙé~‚题‘†‡ˆb%[ +å~ÕGò¯ùà—¾R6$žUëŽ –‚bdW%Rˆ•¤ÕQ°ël~ºúN9w÷yw£õÀ¨(¼Äk€b5‹ÝmúZó J¾5³Z„>ÙS³ïŸ&vþ¹«ªÖŸúôdÚãÃÕáÜ&¢óˆ±ÊY•ñ«oA W@Ö—F5MªÂ˜• ¨"Õ„$s ݉f[TEÍ@ˆaÍ"B¤0Wä¹gsæ¦h–Më¸n3vMÍ:'%dŸ‘NÁCþµNF ßœj£wUÚžúÅ2Á04ΖP1÷ïçøo3X@4D%Hg/+Æ:ŒD´ÃD¢¡˜=÷Ÿ39/ÖÒ"%E €¡A•—_Z1`F £KõDÖáÍmÐ’TYZ„­lL ~¡„´NÛ”0öSj…йWÇ?ÃO÷kÁ®Ïø='lä›lB£Ÿ+)Hõ¬æÃè'v¡CN‹øQUàÄPHfÍ×N4@ÈWQGj¢Á¹sÍfëGçqôía3´ùþaUž,þ— ~™#9,e±‹9cM¥FVÚëõù¾ßìoÆñ÷‡<Ë_[|w©mÝOÏ\p\˜y,*º‰dºZ™€ìàÔo™ƒwËóìe=ÞÁ6W< Øž¹pA¬Ü©—&/b ö1DIF7SrDW–‡Ù ´°F± vÉ–ö$öÙ5²{ðwY+~† |èçÓòÊ[p˜FƒYI%´pl'´Á-ð#N:CuJPäŠd*M锑J:3ÊG8ˆACª¹‰•ù¯Öùëùô,±¤ÍQä±l®7eر¤%ûÊnì"bE[µóR´ÛÎ:åÞu>—îd‘ÍÝ“"aCž/ h\w(ã–¡&wÏþ1^I3÷OǦŔ!ëi,´P/[EúŽs®¾NIÁˆ3TJÞŠ¼"3(¦"JwÆåu”ËaM™ZaÀ*‹’#€á9:¼<£ÆÜK¿Çêâ5:è½g0Á/­Í\¤–UÃJ‹$e^khYVüÙ‡Ì@Ðè/êR3d¥ NЉH&Dþ«Ûÿô&C™<Ä€¤°¡žP'%1§I ç÷ôPW ’gæ‹!Wä9ž±óÄRå hô4â$n\.Ø¥‡‘öÔcŠ(rÁùÀùu åoä¼ã"‰HËó3÷¾õ/Õ»£Ü˹Fý>•}XÕL4[¦kï †ì—8k¼ÝÆÓGQL ëž®¯³…=>Þß8¶y_¾´]y?8©1Q×/ÏGãÚöÊ J(Y¾¯¶¡‚ÄIAXR@yÄ“·yþ<ñ8*hRÐcÎù=±X6¾ œýPeîxì`¯k[ÔqW›ó³p–ø6r¢)®ºîs'èZe˜Ä!íŽlQoÜ”™ì@ S3Ô¾k}ã??zþN|,Q[HàyLÁZ`\Á"Ý /­ÕF¾©öõÑ^'íyò×Teu©i—¶J‡µh9e]ögï Sx3lIÖ†í_KQW¹Úɺٯ|!vLà E'ÊM—Š'ëŸ0µt—­£úŒÈ^e[áÐm‹§}˜r|‘ÃxX3ærT7bÏ©ú÷›½C_PYÐû– ýfŽÉO¿ÈM²47kŸoÍ¢'¤vtá‘qE”i˜dò$(„¬@Jƒ BMwŸ~ÁMpOŒÕè%WöäÚ½œgÙù†šð5¢X¯]u\}X£’ä HÊİ•ÔÎJ󲻸‰À ž†/Ò¡÷c3©•×ÞæQf}ƒ>‰ªwÕ‰(½È¸“D[âJ]ââ°-8ýÈ6³UrªeÂÃí«O^=ÚŸ¡àAÖOá­J¥2Wb¹²v»lÙ.U‡‡öp'f´á‘âZùÇŸØ8sÊžgÍÓ·ú Ý„K’I:¤Ã ‘K»‹œ¤žñí’Æs\§(Äje> "]ç¥L̺RNŠ43Ø’ðFMš*×ɕיˆ™r ÎÀUs–!.ÇÂýâÐìA¨¥„Æ»ATèw«8%•0A¶tâ†øðš/И¯qG¥4š§–Ô¥®*tëðw‚÷܇e={ÔtCèJŒºecâdï°[©¿ËìIký™bZt†\Gæz/¸ó™'ú!TEì}n üö~÷Ü»?Ò¥‘ŸŸÈ}Ѓ‚ ;›¢‹¶ýÅu*H#Ž;·/¿ú÷ì‡~¼8¿±u—V¶™iAá“‚]›ä³÷ »ƒ êúŒ¦µñ‰cpXGÖÞüÃŒŒ*ç³Óî)ªõH­Ê¨Šûq J’Þ3Û’ç OÔ‰Ì]v–Iä+Ñág8R•©@‹þžä£HŸÜ'ݼ¹ååV^›ôˆR Eå Ôdyí± ýÈæÇc±DN<‹‰2¤‘#åÏ75*Ytê9åú8HÊMá 6žèõÍœõ\a__öéäŒæô>=°,TðzwêÒé篇%cgàxcù)·XÐNLá@-œ4lÅâÒÅGõ¹÷¿ÔÏ›¢7í´1Εç¡mþÄQCîÚ‚8KÂÚs½#t2²¿Tƒ¬Ï©!:ä”žŽ‘‡ê(ïk½¾OG(KY¿,ôœxÂE2fä QŒl‚2L=FEH#FÏVódä¥ÞÁ R¸)™$‰ n³ãè_ªŸÄÐp!—(Gß&NÞ_¸Î¦ƒngÑ1¾S»‘Øú;ÎÕShÙíM/¡}ŽIóh&"%¿Í~Vêæ‰r|‰[!ÐË]Ž0Ců͒:P= ö1_7ýÆIG´ûAîÝ|‚ÜZ•e[“Õ{ÜÚ‚„{ f¥˜Ó%Ÿõl¦pUv)>Š‡Ï¾áýÕûcý·~²ž‚%*ÁC×Ãí)ÌÞp„ jâfà¤Äµf(feSjŠbKÒ=w „´–”r`d 6&±nI¢ JR•ÚÒ§â-{î3+Ë¥Ž§Sýxß<Îçx¦×¾§S PÂÝ0‡dЀ8ëôQ4ßžÚÓyÍØá5—Wù;y)·¬½e²ÒÏpU;1%Y»>ËcÝ®ànf­í¨â'Ë~ݩڞFP7kÀœ€B!Œå„^ýXû¥Ëðî÷¯GoÇóøzy÷Ééþ–ûê8g_Ïñмױç}ÿxþåpâ±%®CÅ$). „Kå -©’†‰jPJ‹˜EA šËÖcèdsó„/$â<ŸìŸ=}ÿùßþŸø¯œü-é¿ð…Ø!á#ÖR µË:ÙÏ׸ÎyEB”=±:O)ÆŠ• ¤†¤“¤µ[vv[FVÀ“ D÷±¤Å1,gÜóá΋ۮ¾™4M×<ïèi¶apãE_pÛyÑÔµC.°mv™U =AÏ/;åÁMôGÛhÁ[ ðO_üýGýR4Ã’NqŒË]ÙƒXÈÖ¼y~.ô—ݯuž‚ÒkY_Ì奦ºWÓø7YYJ nN`QE{SJS¿+Qd]:Ž„&c$Pâ«P(€ àOC™ÊPdñ¨liŒ¯+~(ÏË2é½·½K °¸Ì–oÚþV«€3y0A‡ ÒP«Ë`t›uÝõ\ÀM‚°ýL¸YÌ¿Mü«Áž¹3¶¢ ôæÜ<{çÜÏ% % N”1¤£xb¾ì¨ß§ÿ0¡€B‚‚D€@@h€Bàˆ3ÕbÀ¨‹Yˆ ½mŠºŒ%¥£D«°ÐÕizÛ‘ÝïžÌù~|4.ò¨Ÿ?ÚþèzôfÌDù ˆöØKŠ©› ˹â>ºm#0ó%2ª¹§‘÷¾¾Ÿßsg ä~mW{kh0bGw& §¢ÐÎw6òúhkrÏ'úÚf¾|¤wWÞ0W+Þ{røÛà"÷ ¯‡j½è›ÓÇõãí8ÆÇM?¿£¡;Í8ìð2’q܌ˆ¶LÑH0#ö'ÒiÛ«KµŒŒ¹CÝáOvù4ºÒ€¾ýi)¢gZÉ&̲yìí…•Ó:#~oëw©Þ@àû£Vï1ƒË zçÝGs³%ä* b–² €¾Õ¼’#SÝ´¢spV(Ú¶Ú{kSÖQ-2œÃÁ]ª§‘ÚPº$…J¯FñøSyL}dlG_Œ¹èŒÛÎFª‘P©'ÉC /—\H‘³ †8‚ka(ÒiÔ6@LšhÁ¢s)—¦&£@ñûßiFÀb$ñ&B]!°c§ÅðïO0¸¸ þ xPZžÆÒgÀ¦4fûD4à9ô& =å|è#6¡DZ´ y„ÍxGz6ÿÎg»U¶u|åí×I÷’zæ¸ZÚÌÀ¹ˆJ4y!oÇAž3H¡þziܯàÁý<ã9çw…ôuû¬?†9»Ž5çvGD* +€ø@Î20C–¢>+`ØHÑ˨ãoä?óæ7cÕ!ŸE\é~Šçe·å‡þ¸Ù ™­ì<è"'UÛãŽÇÙÒÒZNb!/´u -¸í©Áò(ºäR”må®YØÂRI8'Ai`+9½Dj^ee Ö!‚>s`3t· ðz€£äYÝÚ*vtœ.ýOg©~4*hÄs'Ëj\­ƒûÁnfÕËÓ³‚©j€¯ØÇ^Ê9¹îØU"æZwž©+Ÿ)A0[– †T¨ØW;—vų«¡ë ¤e•¹xŒÞª¢r‘/t¤Ý¬Ó= )Õ£úÕŸz§È\¨Ø¯Rààp-;Ÿçcz*ˆP¸Éjb$ׯ)ÖN spRk‘•|‘F)ŸƒymPJ÷Ĭòë"cÙ²tÖßd/¬‡é~)pÁ­Í<t¼òU²'ƒ"J¹ÍMUƒ-éU&«“ÍeÈþ²Íkè@2áòÜ5³{"í–ö¥{ã¶¥ d®Y¤¡ÖŽÏ¤ +Õ.7þoáMÜ€0Nb{Ù¡Ž߀GöDžpú†¾_QÉÜÙw/ªúÔ]”vD%]ÜÈÈî0ÉxŽvõº>á¼Tƒds9ýÐ,.|í՜㛔:JÅWV²À—AŒå‰$›U†iO£’*W¼V 'áŽ4†ki/x§ž>ù^ ÷©i*fwí¶Šº`H,®Þ¨F5—XåxA4‹¬â,îh0ƨSâm'`Hѽ¯Å6ÍðM‹CãÌ*¤ ³áI´hpüOûÛÙJ=‚Øt¶ö4û$Ä6`ukЖñ.ÕBNÃe^¡ •{»¦·Ü±q‡Ƭú4ÙѤèpúy›£³¾2òþ½MÁ£âÜ ­€ŒÄ Äêó¾õC…ºÜ÷›_G^,®ÕÅ®6©¦X·?²êúˆ²»‡ û!K¨+DºBà_Á¹ç³•G:È£âF&F˜T¨‡ä¢¾îyµ|mcÚEµ¯Áö^“ó5Ð$éGØ’®!¡eqší§NŠeNÙ˜ò`âaÞÜä<ÇÐ4[f[­Ž÷® ”æ¨U¢Jõuˆ~ø€¨Fõ“$>"ϧ>Ÿø´ëíÍW‰.èèåѬbdf˜Kõ¸Äý{šâ1ßyP1;q­^œ?D~e¥ùêxhž ΡÙà•ôê6º¥pÜçVgÑÔ åêêp|6wt}ß•ÿÖü,ïòÌ'q¯\\dåG©ƒô_ðÝ'H´‰41íF*ü'gœŸ½?Û0sƯyEâØ™ñ]ÌxÛ.¹5½§‹ÒÐæþŠ'íTž]Ö !"•¬ê,6H¡( ^D!XB-#sp³føV{œ³®£Œ†¢‘+~N8‚äüèàÖ~°ÿé 5u`&;K<¹Þo“¯Å×ÏÃ%hícòÚÛÓB •%!n²Yàq[{<èï·ýnÏÝ»‘Éóƒ±âV$žè>Ä•T€òyP¿Œ§"C XÝ]S‡0½öž 3’™)ßÄÚ|>ʇ©Aî«Ú!®GJä6ÐPŸ¡í•UMzëo#rî@;IYœúãÓ™ú¾ü<¶µÕˆïZ"Ãè52OwY+»b©Š€°oBL¨ªÞqï†÷x©p´’Aˆ‹J èPgÚ鸻Ñp™ÃŸw8ßÔ_|÷ó>;ºYó§ÛN«VþyÎ:G2)­LPfÍœùþ!ïlVªâøÏØ6l—c×ÀgwGü÷çf|¡ïÅ»0îâ¾ GË=Ï„C€]‹l|f£ ¥h¤Ó [ L¤ßMO+Ž›ñ•|Á+U!d#ÚSŸ]iºtú©4`]FÜPsfȯù—õŸˆ?ž°Ë"ŦXšbA¤4Å\ðMl#” ùVøÚéø±iÍÂØ’ÏâB"v°úx<ÑÖ•8¶ )÷Œé‚³G§e<š’ÓuØ”=k›–è’cò{í³4‡Y nÈž(¡MhnˆkÉ][‰‘U·€ÄØw£ýBS…ey–ÇŠ<×€ Kr”Zýœ®‹líC¯åó4™~ç#ws¾o¹ƒ€íij ]¨( ˆEÑOõ™]Wâþ}‹9kH{ìƒìàÀ5º%²ã¿¶ð¯ûãyoÚZÐÐaTÀv`KX²í­›àÜ%cw53=,k®3<ÝyïξÑwþÿÕyr¶Ó^+¼}ZË:'æ=%µÔ»Ú~¹c;u—n·%Àyï–%¶‘ljê¥N¢EK8©ž ©>—˜øÉ‡7Âw³:úƒÑ§Õƒš©¿»Ÿ:ÿ)—¶Ð@ç–sósþrv÷Ê/ýáaQ?zèí¥Æ:ú!fo*Ú±ÂR¸ð\"0‘%’[d,± À% rP¡×â¬d˜dâ[rME·cGÔÅ·]:³pTb(BRÉ$5ŒðOG‡×w݈ÊeôÔø³Ûúø¼ÅI‹UNC H(ˆ„ª†²²/~ûúìý›µÏ«é÷ócÌgQÝŸ×õ.¯ž⚊c2„™ÐLR¾Žrñ9tÿªô]“'å*ZÔ³¢ØO<GP¸’¶ßêýË$ƒŽ‰¹Ç©¬§2þGvЦ½ÿñ(&D ѰõÛlAaCWC ôŽi“_½°³W©¡]”âÐpò|J÷ŸX¢B²CUCwŬ)5ìù{:Û¢¥mßxuÀ¢–‘Öƒ¼¼ã§¥Ý×ã©î}Ç"Û>–ñǦÙóÓj•[”ÞüÄêz-ë„ObI³yx¿ÞÒæ)ò¢È °` Àä$Ëê¾³¦ÀÌšVD³oæÞkúã÷¼Î–>˜£·[2™HjJŒníá1e¹†^Îå…çNzQ.›–è£9)8#KÄ-Ž‘× ÇÚxi¹ÆSQª1­ÙÔ  áÝ(ÈC5#ö>1òöåH”«©z3ûÃò§AŽ«ß,‰­r šq -€ËÜÁÍ™PÎÃ@Fa•ŠzÕýÊ‚Ìq¼S,„VØI(""3ª(ÛKÂ-ÐQ´ËÄMŽ%\pµßWý§ZÚ1"¹ˆCd¢ËÉÑ -œ•1SL\ CŠ'h^ó× šJ'<}xƒÅerÒ 6  K–‘H  µÿÃ7ä8~ÿ1üýÝúöÜ¿ó7è!F%{þj˜XWiÎ cØO·±¹X ÚÞ(Нérj= [ /û¨,”T€"¾caÊLûlžî¨ÉÂ#µ=ÿ$åwõ1–²ßר·Ä~ô¬Œ©fê2ÜF&;背—€YFÖUC`–Š\†0¨rfî!]ôQû¥‘(À •Ý0Á·šT¤Ý¤/šÇ˽ىqfY‹îaö0"4RC }z€Šf³'R0Þ¸C¼hà;àf¿Ú¢V£Ø’9޳"¡Ûg”jÇ#œm#°>(µˆ0ƒ” ·4—qý‹æ­'{é{¦áG •Xra–¨j K-›J¡±ïNê`1rÌ£§Ö ¹³”óXÍÁ=íõ-*wÀUñïÇûñ€…Ü(…SMÁ Áî ÅôÍ´›|n= Øp¯ L@0©7A^k•/î‚&ßì׫Αj ²hà7;žå2¬)y:77›Gu[^„î"nY­ÖjŠÆž,’T+mb³xæl˜õI”ý<”Ñ9@^rD§asÔ )r7y9{± \ڢГ’ HlƒügB™kF4±ˆ&0p%…¼“IL‰`ÜuˆLŠ•Ç´* ¢’/±Ä¢’D*oˆLÓô"S.B¸¶…DÐfBBžÜ}må¶B ˜CB‹Â–2€¡Û¢ž´ÔHÔÅ,:d%" @‹Ä£2ÌZàP3Ü!Òà¸æySO¾794ö}›ùö$æTuåe«i2ÕY·`Ǻ½N|@GYÅU„CˆgÊF†’"µT·—ÿ»>ŒÎý>C¾ì†žKý¾‰-;Žd´l\°ÕeI´Ï0+pØMæ@háýŒ²—Ù<Âïþ¿ØOå‹ÂyÇf‘ç¢lh°o7}«ÇóÏ—ÇÃpw÷ §è†â]ò"Û®€BQ)<úuho烆zE†¾ÓËÓO( }ôÓázQ¿‚ÊpÝ85¡^1W&*¦~ŠTçrÒ’¥y;ÈIQª²LæêÆq.@ ¢ Ãf¼ *MvALNúØB)eŠW^Èï AQ’d>÷V¯&ßíÿÒ©ût!|Ø2ñ ªë(ÎëÌûx=Õ¨›F#òîJÔ¼¤k‰òÊn¤Ã=Ã+D&§·áw+¸Ä~^NªY]MhfØ'@¢U*¾Ó?±½³µ„J ÆÚ±±Ñ8œœ’:ñH¦.µ7Ü þp1zf=€iËì27“ý´yv]«ì|jÅÜÔ_Ý(…uÅ8éI¥T¢ Â n¬¤¤tÎÆb¢’HÂP*”™ò±PÉ÷ìõ±=ÑóW̉$d"–f»÷Ìõ˜Ì‹ñV@×Gô¦×wKÕˆHb(.âÆËQ{{~hVýËß–uþ€‰ŸùŠî‰n©µÆªTˆÂá9×gÑ×jòÀxîLü~ ƒ±n©UÞ!DÐ`¾‡îŠ sëvU ˆMKõ;]&o„c1HuËÅ–tÛu󜻠b£n°X$09êkg|FÂQè×Q}‰^@{»ýÔèùC‚2Æž B`Ü„«(¤ê¼!Ý$Á'NÖ­y¦i=“›Ÿ.ìß÷¾·øO„ü¾Þï¥7ðC§v^Ù">/È«´+Ès.x (r>"pu‘ rÇ%Ô)<¡é ·ÐËÞ†ŸÅ­ß¥È;䣷¸X0OË Æd3 _˜ê`2SJCB þÕ®h.a¡àž£"€#ÿ¶è²©&XØâ-…žf)çHM Ï P©IØékgÂ5TL‹â“B#Ç( !ŒAëpïË~rܯ¡ê¹»¹ªNÒN¸ïXß$t¹ëÙ‘ÙR¦} U-túwê É0_øšWA¹Ã^™ «‹ÅNÖ®>%c:1PEÕ¢œ'ÚpÙqÍÞt+dS,|·£©¿Ýúgöï¹pÍHŒÀAWFUÑ#šÄžÑÙOôþTÓªÄ(í¡­Ðgšª²£¤ß§ÕªnÈßrA;@@8H»Éhuó7Wc¦$” »«½{ ÇŠûuLÊë¿DpMÝ3Ø1Tµ@[ˆ!…§ÒBñż›Ï½þ¶¹·òìô¸[Xíìãç>¯{k{ˆXªßИ Nl.îÃAGTœã’©:mŠ»*¬Ï³üÙ_åV}sÍ“ñTd+@%‰€ÄùýQóWµEÏõ®2³Š¬|7Qiôåʯ€;!ŽÈozÅ›S‰z#°„§ÖYï]ü–îÁª=¯kº§=õí×Ê ái:¤¯­Ü.åÒ@å,/(aZ ™"ÓÄ+ #!“H˜Â‚‘†  QÁj9ç«^Õf ôÔݯ;¤[ …^ÙR^)¾ˆÛB’°ÒÂ.d&­¸W1] û—C£V´-(Š$óþf׈„5H âB(¡×Å)ññæ×¦™'H¸êûö‚7‚›´¥Ú°%†ïÐ]™Ì&ÅÂ9+‰Q)ßÿu¶ÿ<õ[g“ÇÉíõ÷Ór–Ï…¡ë>þ£E½¾ù‹ÿ÷µþÒÕ÷Ц\XC¨`ÁÜÑ17‚c¥ìŒT¼­è.F€m½Fø85éø½Ê¥^u+ùk¢9Å™ ñSŶ “]-@ŠÐ1VÅ‘ÇF}$pq!Pbš¸™õû"'ué.[I¡*©Ú»ºË=&lðµ×„{<íî²wqŠ–Ó'yV{{T+å#x7Ü_ÞûyñZ{ë¼ß;7jüü<‰½Œ¾Æn"mOÞiwî-øÅc¸¥£[µOèê“ÌTžûy¥ä¾5oÍ·ž9u®½Õ;Éüò«§ñR ë~Ž3CýFxÎȨ<üÅF5¯üá[…êZÅ0'‰‚µbêH!é``6ÁP1ÁµY % 3q!Q…DÉè°gʬÎnH|“mÆî. ’µwßóœŽ}3ŸÇ›_hw|ä=ùM{ÍÎF‹V¶ÚÒKÙq0$9Ëd4¦…ìnÐ"h7Ï×ËÁ i¡•–á[ŽÌˆcN'‰F «¬‚IA2ù™\hR5S Ô—&-s¥(0TÁbˆiKº=ÖA[û[ØúâRÍX·ÿ1|´?4ûlü™Çæ¦{µ(ª®º;¼G1 ^hA T"_Ú3a ˜ 0ø– '@†„ *Ì“x ÝÜHä9´›ô<#Í:º½‰ïX?ßü›]Ûüp7ýZO“I1$‚ƒ©>B¿Ø4î¯5d‰240¥€ ¦Š´2s2Qé¡§J“Ì)Í`t±×¸f‚¶í±ÂÛk5¡f‡3|ÌÔLÏFôÑe2¥, N™îµ-fèð$2DGÚÕÄgÈ'±È¢ŠÀÁéЗq&;RU».Ö¸l?è“¡›¿_àW¤ ª:Ñ¢ûKï—z (¥ê3Lñü%¢ÌCö2¹ù-ÏŸDü <Ž 5ˆYíùyÖ"åRÏJqjÿ‘9GDI bG2D› ³T–`Ú6²C#!ÓÅ.Oð,3ä•2Ú·b×2¤’-Rˆd{RýGDu…äâÜìû‡Õ¤at¥§F³+rÁ& )0"Û[yÑÑÈ›cxÒ²Kªpô3Õ>ÑÚâhiŸµ×¼Gÿ¼PɯËÛÝ%/žž5ø’·1yçV3‘‘†¨ cùÖ mЧY“=Wº­Îvi–œ÷AŒßã0cö€ðľÀj2>¢¶²ÌŽG“‰UýÚúq¤êëñëîTš"ƵgÖöY¢Y!{u G_¥C[*Ï:ÖÜÆµ2äŸ#i@ jÊ>l·!ŠmÝt*èòÀ‚4¬¸Kä!Êþõ|ëëô‰R”@ñ׿ÑG:ðóqIF¹ê ©kW‡¾æÿà!£6¿ù•öŠ~n¨·¿ȦEMX]a& `ç7suAb†tS|,·RuÊ Fä>¿\D´+>‘„á 8 új“,-¤¡¨üZ>P°Ð‚T•»h›<™rVÔå‚t[6+ê`‚¤Š¥’grf@_Œlæ+’hÅULBÄÄ“zPÆçC‘xÛ@‘Ö§?/8—3íÍõµ_ÍL$¾:€3Õ~®¤†˜=Bm+^“K﫤ì!Ê Ûˆ–È’úòæücëußúq;úü+'µ£,ñ7ìF”€{îìl0k:?,|€)‚=ÁÎUE“¡×eQ_›®„1ÅÒL5€-ÙõVµN[\+‘–TP‚!ìÁ3ú?’ÀÌØ nÝ´lÿ©¾º·øïhl2ÉÓa; %ïi¾vÏ]ù]Ó¹}|ñi÷éWè;_nüëêxêÙÖsÕSWÝ£dcs8³O.ZƒN†âì3ñ|ús¢ïŸõï·úv&ãµé2ÉßÚª#]§W“ýDšœqÀŽýÐÏþž¥Q™±3†=?lôSlJÚn½L4WºG¹;^j%Åáw©ÿìi¬Þg&¶®f£_.ù÷k‹ÓÂå4Bf z• '~‹¥#t3Mº$P¿õoÝv <¡È2Rèhõ*™,u˜!ŽØÐ/¸Dew€J ¥Pg}ò|¹QÝ0²6ˆi5]cS>9þŸ|ü‹_í_æþÞÑë[BâÍ© XX¦ÕŸ¨,ácnHâ ?Ô"~E0‚JÇVjA{´_j.ù²&ƒ"ÖО(}ò©)f~£oßg艗fîÖ ðÊAÉDj$ é¦r@ÂÕ³\ÁNzÙjª®¢Cˆì„˜6kdÝb~ç>ÏrmªˆhïÎ&K˜B1ÀBS´k¹H>°ï×@"-ÿ8cw®Ç§j#Ò#l0äL¢%ÄA0àýUÈ?æ/ÜNÛ »Ô’B̨C’à²ù¤Ïþ<÷¿ñׯæÂ'¾$÷}jnæ§<óœþÿÙ0î.×þ@Úô}ÕR­*š^v?~òUö©b¨•$]æ)ªµöÝt°±4“€ *šÚQS…ž¼ «XÐÙϾ3æ?Ã¥hßœž”ô9l¿ L)n$nlFQÚA†/))˜ø…íÉÏ‚V½9´`U²‘s€ʤGí¾ü4U*!Ü>¯Yë¡=Q3+ƒj``–7!Ñ’B2 (YYê0î×t‘Ë>¯Õ-ìIºzó"O-Fq:×ÚÐJ+1„K‘*…ÐFysž‚SþäïÏã(× îi_ `ÄFP²µo„Žpd€Í¸_þp×µ_ßë/Ó/ÌË﾿œÓ\‚Ž^ùÏ×y‰JGø•CÆ.E¤pAæ>NŦ®TÒ’žoÊT/O×r–Íù|Î&´¹ÍSÏ!Oïõø1™ñB5׈)”E! &†d‘k@aË”WS]\dM)B:¥ª¢E,!9ÀŠê(A³zC)îÕÉóÿô9rDV÷Ÿÿ?š¸Û«»~'ÉŠ~&ˆT–Ǫ$%EK‰Ð€…bP—í¬òydóÐsÚžæK‚úZI zÀhA­Š(ŸøLó1ñƒF’p%²hª¼?’·ƒÞl[z¯ÿ੘wžÖ? M98!3µ.U’´Õ6ìzô>ýŸ›~>Øì–ü”û|œhBCŠâöŽ—ì‰ýíè´­¡3$¸IVÌC‘j58g†ñb¦j`+€´$Æ*”1ÏÅÅíñ‹€O‡€”TС›$a1þx‚Ã,¦ u„œ¨@éB>Å|.ÿ|<'#°¸?79¡sÙCkÙ*y¤×aÑì¶NÏvì&¾gu_·ü’—l„"%Áfæ· [#Ë*²NÜšEÊì4o–—¸Œ¬¬ˆ2Ôld[›2¤°¤%xw7ÝqÒ*PÀÃTÄ@€9›€Lˆª@ÕAÁp»1L5‹#cQ¸6,xu--ô‡î?)˜Q½ßÍ\.2„¿üÿ:DâùGöré6ÖDç¡m8ÖÊ?æxÿü”—þYýŽdNÂ,#»ŠDl’òiˆjD¯8Ì2Dd”Üɽ³‘ÆV€Àí÷î….~‰úðxPw?_ågõ_ý¯VÂl祎!™*oàqÀßÏ“m±KÁZkQ6$ “q•@&ôá(§aÍ8$M–+±ÑLjR`ÒÔÀìP'„ú6x×óï2¿½ïùöðcE‰²0Á0ƒ(+a¬4` +lئ0‰öR]’UJÁ¸ë–æPlµ"ûŽ?ßá¾`ù‡‘à˜ ±qNK÷¯ÎNÙ|fó‹u>üGÍçJ.à Ù F¸C²û™žSãß_ÜÚcsÄÊ–OŽÀ~*ÿŒ ôÈH/ ¶ˆÌFò•úm—õkr2mŽyáÕscÎgˆv1Ø[«¨ÈzžyàD'["Ư̻̂YÏÈùl–÷ãè]™}I}’JÆÄì“,=µkjà?®²à[²¥ÇÎrÇ%]ïÌ8â¹"Ü‹ÕUO›M5Š¨ÆŠÚkãÎØñ隈BBÄ‚pSÅy­³s•|¯k7_–ÐFuxºÆèB'Ϋ£ ‡×0†úœ)aV/°‘芌1’{Ö0*(^É×eýÚœ´VâýŒ-E×(xŒQ"6Ô Èl8="Å”;j6"èâMu¶aµHùÝé§ÎBì±”Ä1 4¾¬@ DØ)ðœ(÷zP hÜÉT( Ò” À˜#9Íðˆ6™(x‡k"rHhb¸ßæ•w¢¼!å'ÉÐæl¿ÿ™¯?Õ¥)@_š +XÀ –Øô–€À¥2„2b SΦ)Œ ŠOšt©Ò+|€ æú™½¦qìæÓ¹×}ùÇKñ=2û,§Z?.w˜l÷ò¾Œ×5œžx^_¯ÕÇ#¾¶-ÞÓC EsB› mòpäwÞ®‘@ Íö#Ó¹'±ÀH°J¥!Æä–Ú¤ÈEØ!™î,^8§Ðk|zÙ€Áì·¼*?l[5/Ž9{õ¹i‘ù>ðq¸@"°Ú…é',#[b¸¬9§7wîñ`‰…½¸½nï–+Sú»Êº•ñˆ ÅîÊmFÆÿ<>w|¨¾æš¡;wûWqÓ½â¶-rç‡YxŸCïj†9øÎ!'¸#ó¡[oår§ü-oíÝy¾pòÙµyDú޳œ?ïod*h1E¶ÅE×à—ìÌ!DÏ{øBü­‡ÉUs1ˆ*‚@Ƹ$¸X xÃ)ÊÑõ/<ªWV¦ÔÀe¬´Ó†•t,¿„« Z^ „Îå8‚»Ž¤¨qC2@Ÿçã ÕöÝ5ƒ=N¶¡G“vÅɆ”à1SºžÁ¦Nú¾Â::€``´æêº­(õ^Îju!9MðÖå˲~(¸ó„vàMY†Í(Æw*E®_µ:߇*ˆ iuA7O ”ûáóyÂÜòöX³ÅÁ«¾Ë¯GÎÉhãse~v²åˆ“‡£V£Ð[p¬µBfĆ–T©L’£’)@ÅíèÖ;®Æ‚‘ÄBXЧ0“ó‚L°¢+†T²—qõ³ýã'¥ïOÿ=unu½·‹¯Õ±f¸“.€#‹Bu©¸œ mLÏnXm#^”wú&WuµŒämº—åš/ò@UY1,Ç“S×”™Ñ¬Ô€ ý€!N…šØd’¼†lE` ÈáVò?·>·Oüõ‡à͘ï!‚7˜×sí+>ÃP>¨<8|\߯e¼ïø§µÇ=÷vT6üHÜ9rµñ}w"¡Tà[g|XQÐ;ƒ3?öÒ®«äÉÖ™h A æ“’†|'\Ï“YåÙ§¨*¢LsQ0œ…ZdôQ7íÁ©öŽCopÁçWÃOâýŽ@þõ©fê-{ÆÆI¥uâ¾\ò8§8 Hå­_Ø+hŠN •S½²ê@G@oUhÇQáÚÕ‚¯×Ý»DÝá3Jw‡e1;×e1zvSh¬9˜×‘Öô€¯!Ð#Ï?+(|úW9ÝP~™‹!*þ ñÌbç~óâ2õާû‡«ÙXŠ]¦È£nÑ7!o¢PRŠY©iþ¸Xg‹ÒXª$=yà£õÙ2¼íCaÅL€´„q~6s“¼©îë.6Ä6*¨ÂÀÑÏä÷J«S%4z{çûhmu"¥‡ËyðuƒFª!Q øAi8çÂûòÌ^õæ+°Ãâ+gâd¿Šª[|T) …e#?]Wšê“«;nŽ¿P²½¦‰­‡ð½íbãhÆWOpêÁƒsÂ+]K¤¶ Å©®•T6ÒÉIú7wš>u§e‹ gpä:lÁ e­‹Êþ Xª3ñ쑆U™Iƒ[«œ[k}_»´r_­7²¶.¾[Â3äÊ%LhÛFôÙÛûëœ;÷§ãØ»ïäŸNah‚ú÷Ýüã¶Å—Y5[PK–óÚqóz6áÚ’÷uà–²›ÉÁ<®OYp‹Ýœ¿T8Þٌܻ½¢\ý]Öxw'#^¯èûkÿuGÙÓíÚŸñÆÁÁ@ÄË$r* ŠI@ˆFÓ„‚GÂЀj•a!L x!D#„†NDI„q‘x =‰Ìib7×íÏ\­x«‹b`T"ÀöÀOõíëÛ?ÞöAæïøë7òõÇ¢Öd’ çÄGûsþ¢ƒÊKÏ^5"¡*º¨üüæÌRQŽâ¢@=Ä9ÉJ-©í „Òèªö¤Ó Ÿ}»…nkŸ¢“r‡«°  {n‚Ë>m{³a¨…eRܳӬ3œÐh7Uƒ¹è=êm¹êhsÎ^Ÿ5…ä´'¡C1>À´[ H`¬ E‰=*£!H q¸ê‹h@ŒþQŒý!KˆHBAYÎ(ªV\rhú;ºüˆ ÎvŇ™2½Ø!ÿLd¢0onçÿÏQ×`M Ín3/¾åûgR÷ÓðÆ›É_Š›pp$4÷uYá’3F†qgKã•gEªà† ¬Â¸eÍ4Œž¡}/>®ê=FÖñÉÔiÞo]!å üC±:¯ ÖHÇ“ôÆ2鎇,FT8VÁyöésÿ5z¨ˆ€@ ŠDB (/[Çßï=¥g¿ï“{üÔ°-[C‹ñòh‹K”£—q¡vÊTØžY%„3b1ê*°‹_úè‹p½Œˆ"ðÐSÅZ†0gužÚ×èà"B Ä(\ +^,B({ýŽ9]äÛóP¥É.‘(Bªp؄Ң”JÈ"kHnýÝÙþ"þÙùoœæšÃ=S/zP[D•7}tg â¡E%j©]âÐöùùæ0‚ÑËT;f‰MÑJˆmÇS_žš¿–‰Ž£Æ»[ˬSÌj­ ÏOõÿ<ÑßÜɆÒ4`c›Dõ™µí¾K¦i$·™V¾ WàRV@’œÐÅkt4QfI¨'W¼b«¨šÒ(Ž*‹PW  ¹¥¡œšckO¢c¿âŒŽ qª¬²” õ¨5i¦,!Eºtš(S3µßV0P0"¸5…-hŽPT&ÁóõËÎïS0O½ÎS¾ÌwÌ&¾y¡3˜0zC0‡I=Diœ¸ÝãWyÒžÞ1×3¢Œ%õ6üCoºè`ÏÀ"‚FD ¨" ˜ŒB:ì#ïïq½3|š. ‰i€% ŽAZNYÁ @Bƒ‘0è²Xø¡|…ðûþâó;oîrƒZÙÙ&— Ìkš·Àþ-Ü….`U\ðA? „}æþK?Ïïýþ)0d@" 4ÙQ²Ac€>cÍÊj4‡=”’ɯŒÂ2Z:ܤܯÓb™Ü‡xUnò§÷A“§öÎ;Ú™dÕåž Ü+f†ïõ~Þ´öü*°†Y…Š ð$@ö:„¨@I%j5tø/ô7òu‰$ êZìtÑŸÛÑ®æÖËäª:zñú÷å×ûÅçoì÷\h‰¢¡Èr•E)&33«dL$9f@&ü­<3b±iææ%UeUà5¬iUÓÿF´Mç¥_ô‰H`"ÒËx}þd¢#?Ï¡'zb-ÃSÅk:B‚½Å0ÂZ€ºá¢)ô¾m^ækPÆ¥ LôÅ®µY!·æÓv首Í  ƒ7àk?AKÛø ÓÖºí‚Éÿös™(Y”N ¥œhÁaQ¹ƒøqúL]$L ›[Э®"4¹Âðˆà¨çøì˜¨^^×ÜÜ'Yè ª1{ˆPý#…óyoÞà}¤¹ÝÃKZ¡´VD€ÅÑ`$+€g€Æ$Q@‹^ÍAÁH÷‘UÓµd™@U–ßÖÖ7eEGážw£î^Ü]£fP•²ÝjO]`5ôÅô5KëJ9ê`óÖ­N‰£|ï,èq¡F"•´Wn@;çÎÚšì ÓÌdCy¨³bŠl2ºÄhY¡@çTÌÂ8¯LÐ}Îu€Bl9Ñî‰\ì!¸ø-@ŠÇy¶F~˜'C, [Œ7eP”3Œ~Y ÙB'tƘ8ë6æÒí#bÕ3fð¾ÁWî†$ÉDÁD€ û¯ëÿHšec) L#gä‚w±IòË•ÖÍ·A€vFë¡A8½ø}š€`ÉMxCÍs¤Óû ü§_–~ŒÒq©Õ§I·¤BB}•@¥’’¨ñˆ›c®óÜ|è1Ö[ó:Ž•‰´S ÀgI7Yàï¨{COdžÍcÞ‚ÔH_Î0V¥´¬R‚Ũu)Y[îÚ-<åj·^¡ì®ÃèxD±«úaQ7-¤TP`Q“Cu^•¸o*kJ’QTŠ-Ò}æªäLZLÚвôb‡ëÖ¥˜¡b+8}Yø-wQ‚¤šk¶ŽË×ʼne/ëo[®Å6NãÚ6,€%Ô@ÔÔ…ÅŒ›;fŸàd3lWä®öÖMa·4&”¬eWðš6Å ÉLÓöš¹]Ù(CpK±AïB«Û²ðMÀ£åL8Ç–ŒáZ}è×­A½<)˜³cÔÀRZ¢T´Ã;5(˜©)Ó•ù9ýìÝ{vwàe¸:Ç:„§j8“-ÓÈzB%~ÕâðI%J©¯cé›FõKƒÊ@&ô4F+jÇëQWKËRV¦Ñ‘ð·ó&cµ1#|'ËìóÜ‘i÷ju´Æc§-¡tûq‰ïÁjÚÑ>-gÓw˜@hnƒ"6V¨Ü¨MU6µæ¦.içžV7:“)%Åê=²Q'~Øßi­Xgx‰c7áa|—ßßûq5ê÷Ø9ð°|Ù$œÉ&Ýpºñ°>Yœ\ùؽŸÜÞ{¯¨À’Ìò±Ëš_.µ[÷nyè:¾,Ö•žá0ÑíJÂm*Â$ˆQ™p]57ÌÈ“R°JS…ÕQ=V,¥ifëù {zõ ŸKd^ßyî½ùíCÛ­y)A^XxÇÌ>¸ÀŒ :…¤H2g—î|zC\¢ŸÉUDÕ<=:ã ãÙ¼.ï °ë1ÑÑmAM’VÄ‚À†#J;…ý¡¿›=± ²G JSÅ5!Sj«ájŠ»FY~ÿÕøñìÏW~bxümRû×ÈàV>,äñщ9ÄãæÌ9Û(χç¿jï_þצoчLÂ2 v9Ü””ïtèÅàŽ½C/[2ä=åÙÑH·É¨òtµ¯ç‘1³-ªOd›{ÖÆÔÄ)˜ Õ:J)²^+÷ɤ²rKær£">î¡h •Yˆ"zÜ1*Úre{ÅIY2Þ1‡£ÙS/ö—ÁʃÂVÝ•sU‡tIh8·øŸ¹Jž…D®–YU ¦³•à”~+äîdì±'Üyb‚,j¨œªlý˜±Œ« ò:eÿ•$AO¥•Äÿd^ûã¼::×îÍÕY«å1ЊžÊcYë NÊÌžñ!¸ûª¼vÉáI3"74Ä=ëöP–ß?Õ-å­Ñôó.ð9!“©%|°Ù6BÕha„ @sÑì$P¢mŽÚƱÕ8 w&²Ûíë­ö©XWúiú ó×<ÚýÔóz4¦äÙ‰Û£’*’ªr0îE¶FòÌ5)£Äú7%™?‰…¸‡‘÷AZU Äb¬¯h¡ˆ­0Gã›;~Y3væ–ÏM?JÿÀ̯8½6l‰M˜8¦}¸UXÄLRÈ$ß“R…¾™ÉLØu5dºñ!®*}¢ ªW´›mX° Ñ…â‹5K7PAÝ&¥k£šoõ½àþª¯Åó—¯ÿ®ûˇF”&ÿîôæpQ½]ôIXb‚3¿ˆŸL(iTc燥xäWiUŒG•y““9½@Ž^M¯Æa^†ÄÇwa2b×¹KñÓôšZ!’º!ºQ¸PE#ðÞ¶.攞WäLzÀ瀃úo¼Ìþn(°y¢hØ€šìq4 -6š™1¡Å›irW33L¹]ónþ‘ØOÆNNÜCà Q Â@F€ 3â 6@@”™2&@%ä¿ÄÉ4¡5Áx„©:¼Á)W&xSäÀ”Ê$4_¿êq>ÖQªìBº˜?ùþàK9CÊU7¹ï(¿)©N/ËxØÑ’ò‘S©>í³˜\ŠÜ+»Þ¸Ù顦Âd€:y'Ø›Ç:0‘®,œ¨ÉIŸ Nk€ay2¢AÚl)fŽ º@$•˜Ê—¤þN¶yC”"Eåø ô8|^!õ>ÌýVÿý§Þž DXÙWíΈ‘Ÿ¶¯T€ˆ€ˆ ÆC QÛ²Øg«§süz‡6L 7>ú𘇢}Ä£'äÌ;¹,‚îae©ÉÑž§rnœoÅŒ>,–Q 97ÕÓš/ëæ…ã³” d¸•>ü øªâ`¡Gãïɬ}ó Ë=„ÙWî÷,T|$tÉVá$qãèç­Óá ³¹¼¿2ÒõJèá±[‚žþÚ™ׄOºMÊUr5Ù?KôO7^Ûror^Ž5>LfUÜkB™´ÂF@µ’9/G‡ƒ=j°^}éÀµ[ f–;0ûô{ä+ã€Õ²fFè8 ˜¤V¼š§vî3w¶yZ“Q«?„z‰Ç·cC^ƒ-mJªT@™€â U”Pœ!a_ŒÂÑØÅj(Åပ%®¤bÃí2á¥{…˜jR® eÍ«°"T#-ˆöÞï2ëþ’©[gU¯ð„¬òÚ«n¤5« "::þÕõõ }gRô#kÄVÒŽ]©8B-¬:=µ;—T¢1U‚¶Q“ ¨l ûÿÆô—¿Éú±©u°Fµw8d5yû:ã­[¹GƒDtup¾\O¶zR*kÅE5¡A}’ûB}žËŸ.Û˜7À]Üw(ÜRuA§ì ¥N°mÈÚ g°p€-$„ÈZ€Â¼ÊV⩚CcT“I‘Vq)·>CE$%©žY•=R¸Ê 2!Óèžnc¥×SFÇ D XÚ¶€MÁÔ¨ÔS5TSb¹bö»v\ÉS÷ÆÕ–ÑäæwåN|î;õìßú¹Gwß*W³¿~ÿñ­ï/¾WmrwߥsúΧæßBEáºüvÇÓ#"2%™cû_R´²p1£ª€!` AI­h01j ”5è§—ûÃiOžgмŽä\òu™ë[¤ÎžÀ”‘Q×SÞÿÝ=þö¿\í‰%+¢c„¬ùi ±)ÊHÌ„9:~pÕ0uò~¤mS› (º†(RM­´èRÇ·%÷ÆtÖü­æßèŸãuÄÙÊWgm{û`#C\xÊ¡QRçB pªâЪ(£MH<Ú£òML  #ØU(®hå><ÿj×î®ú·¹Þ=±²K DIÄfl¶k.lIM–©`fè`nð ¬­8tàP5ÕÙýíÔúZCYºHdøAUE2%ÙÅÏûüÇ~F Õ€½yÏê*ΦK¡ŠïL3¾¥¿€yV,‚)´ «¼=R4í¥È×~¬^iý@ËŸ‹ó%fš¡]ÁáPhÃfÕå3éH1Q.:¬”5Œjlß¿ÓOœQsdY¸8 JA‚(kf]¸d*@‘E¸¥*dµó£qKµè>j hdÀfÛÏØ6weû„ô-μ *Nƒž›"#òé[ûûöú<ÙýÈ“ª#QcãpGÕ­LOàD›^­N+ÈÙó*Y¢?° ÆïâÒ" Ó÷ȶ[LnbuF&¸Éè(@ç©d^ù=Au{~m»Ýzë{®¨Î©•ºçç¾Èä><ì¶ôd¸æ–ìû:{gŽ»æÄÝ+Ì1©æÀ“«:bÍš#“u° ±‰XVa¥Ñ:M·£]¬†G|ç…Ó™_No«™Wj´‘×¹Ôqfz8hJ†7‡(Ÿ1ÁK€È+Ú£ŽÆRG i€²âr£NÔý.ûɹ%=¦dã‰Ä‘PPMµ¨ˆ.ß !O 8ç6¼“Œ6ÅÚ˹Ä=çïü{â@B(ªU{Êâ³ÏËøyrà·ñuÉ”eFƒ¦Àã¾’òÛ^weŸ÷²Ñë[Ö/ÿC†(P @‘ë;å;Pãk £â;uM%)T],PáA«ŠÕ! ±Õú‹¬›W*’gyÅZP– B‡±« ±ÆehW–ˆ mr` ÊŠ‚‡¾{AIÒ!Ü_žÏuʺˆm¼3¶‰A}ðØ.Jƒô×T›0tï–BºVi«¿/uýv^¥35Î=hìâÐJÎ< ¶h}À”¹áWzªœX ¶ÝaMÄUW­Ã)^ÁPw’‹äª¹Hê226žî&4iC³ 4Çîª[©•šò‡’a¹¤‰Â/ƒoãm‚ \hÝÕª`ž™)™‰r"ÂÊÚ‚¯¼þ6ßu¿™’BɃg²…™«#íÛ¯?&·¨F(êñ™]Z¡T‚‰jØô ÀKxtNTº=§Þ‹”í]TÂ*Q½­2 áN—xµúàòmIVòvÔ„悈Á6•p °(Q’W…Éð‚¦hi<ô[¹—{6›ôN`t‹ (aS&ÆÄMh*»fXIµâjtmB`× —õ8¯ûïs΃(z"à³h>“ÄÞ+·ì¡Á P†3€ÔRU x¤ (¨d´ Ãoœ[ot’z!{!vrº•Îä ¢CGݺI^jµhëlÏkgÎxå e7Ã/ŽŽ2À¹åõs–­ïã€D§xhn¿’ßNÎD§ÔHzÁ­ù{¹Zÿø˜ý`ß‘÷¤gÁéÒÈ…W²QÁ˜ µnZD²§$!fÄZ’Ázüv±{"Yt’¦ãö—ÏÈ#Ø­yƒ¶Æv“¨nwÃVÁ…f8²„åfPx^xbÏOõ_?ÛÏÊ¿|âW¿ÿüÌ%¡öóƒ9gyÝÚÏæY„®1dåöúý—“aï9Ðm,-È,žÈÐ$ˆd§³‡s¬ÌæÕÀ¹£F“Óh ?l6êRíµQÛ_2dÑÉ ²˜dôÎÙv+·aïzï ÿ‚¸€ñp,;|;Þ£ùãÚŸ§OJÒ¹ MOŸ3¦¢zƒ¦ž¡Ò®3[ÁuÌòȕҕ­Üá•_ÇÔ±ò7~Pp4jšôÃ@rÃAõaƒÈ€ê¨Z)ë¿2k·ŽÅ’]cÍ[ª«V¢æF¸äÎüǶ’Kù˜sGsH_©šËÀ èTexx‘FJ(!–‚Ÿ=7`×zÛãdúIi=¿§OKÃ=14ÎG j/ƒé¸.„—OÒkq2E”E1»¤·k*°Ã%šÁ”QiÖ÷6§45(’BFÉù¡™ýèùq-’Ulm-á%zÆ@GìKIe!!‡Cé4ݯn¡Î®j¥#UBª¶-*¡(àÉúpÐ]kÀrúîÓRb<£Dpùú Ëþüþ%[zbBÔKeG„ ˜ Þº{ŽõÈï²q‡H€>VÛutáØö—€7œ­}„A}³ÿ÷}§o½8˜‚ ˆb ç(„²ÂœÿO ×÷?þö/wwSÞQ~+¿SË/`¾ØóåŒÞ»YRê^r[ÖЏ±˜çJ¼¥›+ƒz…}÷Vwö?{ïeÈÕná¦çF©:qàŒíMFDÊøQªq}”$ËÜÃZ5 0Ïœ_ ‡p=xüµ…çí¯ZEñZõ]ÝŸ ߣd¿!‘%rÆ+H1νi¦¶t§¯^SÖ„Ÿ³öu¿).üéù<©y+éñ<íõµM ¹ŒUÓÆáäN$æù@ïiÌ„}[fN7TÊkÅùæ³uó¡„ÚãZ¤®eïå»/­äýͫˋͳ ×n1u=¨H€e°·é€B,YQ®*RŠcGŽ1D ‘·\i‹Œ-6åÚ•”P ­•# HÕª\õ×@¸Ó*R…V°‘àǨ³´S`îÊŽ)x%nçôû%ß>¥¬| UIŠ´çŠ¯%B$é( ¶ëÙ>¾ùþû–wÇÁÂRk]g÷ÛÑð­W.J\’c¹DÈsï–¶=–Æ-ôʺüÿG’ü¢ÿZ.7Ž01HNÄ–y2ó€Ý¯–a¤b›jí¯ž@%ÐP¦¶MÞBÐ`£p4D>KHÊ ,’Ø(r•5®‚‰•³Â…‰Šp„ )d;Y”©$Å«Ê*ˆ›·©U 9!¨ÔÀãl ¸-JyÈkgK÷·å»oy™[Э¿|‹çƒß?þ ·k±0èéûŠ?œüPŸYþøž_üóïªÿñ·â PjÃõ*Žf³ðtçn€çGóÑlâÈPeá˜svSvžm¯5VµŠ%âÄA€ˆ„–FRL,*ÆI…-Ykgüò›lÚOˆ (c~B:=*”›P"Yi›Q´È¥£L‡mº'w«ž'z?›)ó"Nö¹ã~ûRЖsÑ9wšx^cúoÙ^Ûï„ (T@9ÇÝ6?áò?ðwÿ›g¿¿ô÷[29¨`A„´R @Ðd"% Qú;ÉfU3*ù®ÃÛúS`¤5@Á@õÀŽ"Ôß©kü©,:Hÿ}{Eï“ÙRÁylUhª 8%‡ƒ’ŠÐ ñäAÑ0A‚œöEÎL>¨”˜¡ƒB+JÖÈØØnø[Lç ëD=}hl±_B#¢ S©!*oЪ¦‚y–üÛiXp®!€+{ð”'M9àk‘S4fÆN{Ø+êh¤ ¸Õ8?ÏARàt[Û«#|oªcÛÓÁú$ÊjÐd 8R D8à˜(1Íö@ØàB°V‰cbôíuÏûçoÞÉ3aÁHüÃÀG¢S“ᆠ…qÄ»¸‹‹Î{ºÙAÝ/ O¹Ù”ò1yUŒ08ÃÙV˜:âbM"‡Àá¦s"©p ︥ä0xúÉ値ØnÁF»nŽèÖ¬ê,ÊÍý…]iyÑ;ô3³ìPFg‹]SwB[Ó1+bE P‡fBÇÓ„&õ dŠØ‰Æ2Iúóƒk5 «ž¨ÃK§¿VÇ ˜^ã £wv`à’\Þ[»bKJä³sô«ì’‹øýSCÑrtr´±îH5Z¨aY’-òKêʲ,J†01Ô¥LH {Ø ³ñ|”êTpYZ0šÜ9¾…ر)rܨUt8]ëó#ΟewI…Ê1"Ü\ ˆ‚FZ =ª&Ä@¨«4&cä° É½,YÉõð•j\¹èÛý2ö  ž@Ü¥IŠÀzèÑ€Ø4Ä'`ƒ 3z7º'@€Ì`'èüŽßå7…aã¿VïPB>c6Å_¯D:ñöžúõóèã2›^Çýz‹ ´w0­öl9®Ûwü<×A.븬GÊVàûm}çkà¤ÌÀÙ­æqbÍ”kjÍÝÖ¤_s\/D°Bv€2 ÙL›}¦Ž]»ã>¼i =N€]WˆÀ0Ì™ µ`úF÷ HëÐ5ÓWE6}¾—ÞíG¾TJûöáÒÝ‹(ɸĶNJ” ´”*´Ë^†Ð7ïiÉeU€j­Zg×ñ³Ì¤žŽf6i‚W«{l¹ª®¬ÞÓÑ=NëfÖ/Ýï] PÙÂ*F¢.&A-\60¨‚*ÕC±ì`ÈÄÖ \š§y£+§Êq‹*H7³Nñ°äºj?k,ºK/ô¦Z“H7¶ã‡UºÍ3YÏ ¢¾ÕÔJ)ä }û¨išº£æ.ºeÈžXÿÃêÃÝvKQvÇ«aö™áÈ=Qù]w0ãrÝfJ ®6ì=¨‹õBÕý këL_áJÃrµý2V Xq$«(CE”꣋N§LÝrLÖk G÷Ï0}ÅíõgTj¶j’±GÅÎñ V‚!€Þ-µµkkiB (Äi™ãûĤ]`|} Ÿn][mÑk”[…1БrfÀ×Äc|k…ÉZ¸DUÑ­jÆ”)$ȇÙ:”BM„’àq UÕª^ÚÒ36W«´²^»ãµ{-îR¿¾QÓÀ ÊPœ¬ðÎçûHE4/¨ò@KoÌì^R”æ}Œ§aÑùRÙ뫇¦CÒãT¤÷hbBê¡åäm‡•¥:‡«B;'‹]kÒcW[i_þní5œ{,à³Ë„Ç& t¨„Ë2¬§×‰•_gÁ ay»÷©\[ÛFp“êo[¨©–Ö:òÂÔHϱ¬HZž¯)³¤ð5)E,ÆE$Þ`Ý.a JYLVM¢¨ã\RxÔÙFj[.°¶D{íWÌ_€‡š<r7rO½æ±mYâÕ9TÌ»'eGMÊ™:„s),L†ÅÖÕ«¥ÅßÛÐÇ@½Zø•\Gƒ[IܲÖINl£‘Áyl' =MÒ"P4憾?K–šÎ= q«‚²SÿêÕ—?´ÚØúFç¢ûuVa'&f’¼J~h+S<º>ž­cÇ©§è®ÈÎè$YfkŠ¡ö§fI­ÛæiçQÀvŒwS¥ù¨‚á"lËGe}ååòrr¾dJ™L‚N(*B^£°ôS…j…aú›v³¹ã 5ÊS&ëÏ}com‰IV©©¶¿«ädN_T/ím!„­hkzo"‰¡D½õ”»Q¿?œÂÄREZ>µ?~Š/—UÉ»x»ý_s+Ï(}û²/gÓÛÝ ‡1;ûa¬'£oúåÏú^ìø W’!Ad•` ®·ÂGê’Y, 5•<¢ eqq<;85³•1[¾ùÜrÚ]æµ[ýÞ©öüô¸}g•¯%OÐHÆKzÍœT>Á1L'vÞO?q!´#@"í*²™LÙÒn‰“ âY5- 5M;!¤ILºÆcÑ¥P N¸É3 GDz6¢H-¤Ñ&(ÄãÏÑÝÆ2Üs®sÉü½ëü3U‰uó–¨M~bíÀXR³[¬à¡1#´h³jRÔ¬…ÿÛK+üDBHF*Ö‹a&Dœ´ßóçÛCÎñacÊ\ç~`µ”FvU¬rÊbY©n0B¤Â2â žAɺJåï4²élÒ…\ă¿EÃ>²FÇ(P°Š‘+½=L—A5¿iè&»fUP%U4ßûÑä`k»§ Ƥ¦¤$S‚·ÆÙˆ\® ˵ ·RøXj"f‚Œ3Ó dœÅœ$ rÁ©ºrˆÚ¶{-­Nýí„üª­\Úc aD0øíŠˆ%ÐâmçKZãhKjÁ›Ÿþ?Êý_ˆ ¯=Ÿ€Ea-†rúe>I& =—ÚxKù徦x…FˆAo;‘p§¹# ¢LÚ—É¢“‡Æ•Þ+Eµ^6’¡¦iɬiJš#}õ{™m„°úöÙ¯§ÿ•C×SceúÒ°ÈQ5³Í9ùÍó£˜ë@¹Äèxœ÷_<ß_;r¾˜W‹X‹o/…ä1úñ¸)Â¥z ÛÆ |ˆ•·õ ŽËæõÓ:tbÇXÞ|³ýõKqï`¯ë^g§#Ï•>q ËYœ›‰ïV¥pb8yÏù{ˆ™›Ü ¬ïq~ OM•T Sƒê'Ïù¸³â=Æ‚#„>С;ç>¾é5â38> [BK¤çºîžÖφqzq›]sLbjsõ·jÂ;A@) °ÆìŠê*@1ñBÔDX™T@HÊ”*h)Ââ1× †‰Ö¸ÆzÌ«PA‹ˆ*"Š1JHÙ®ïÝż¸¹VYYv&_gÎ cA´Hñ)ƒU+dÉça¾«;bnÂAÆÀˆ d·Tªºp´J‰Íöªn÷ºèÛ½þŠ6ŠÄBGí$£}fÜ;p¢²§g²F2ªn®§¨®—8L¿×îçZöÐÞ›7ðŠþFØÍ4È BÛµím P·²JƒIS]a3†mDéR¬[è H¢l„‘DøÅV¸)‹øð56îÈ¢¢ãñÂW6‰G%ƒ*»(PHñjÅH“Œ“¦ ,&…¬€Ì˜QŬ € šŠ$;½‰Ïכ̀ž\nþEùæçÛßïOËKûŒÞ¢?ÿåüï·U¾`¿I¯~þLÿõ/·–èX±`üx¾sÎ5†ìä¾'ÆDŽ|Óg&Å+µe×H›{?‹•¯qs e¨¨‚€¢„  ÐjYPŒÐœK“Y%i×€B”­lCЄFIÅJ5è@xЂˆJVÃD<}ô%ɘ2ïv^'=·ZD”YîYû5çÐLhR pyà©q q¬j Ï»ðk%M>zõs¾Óüz¾?)“‘¾À§‚ Q@ä«EU¢Âwä»Bz¡‘Ù’D‡møéß1^ý¹±3@@˜±Vsîž7òoÉ<&¨¶çh®0«qr›0€u‚°dõ@©8P †hL„@J9\RBeÊ©o:±z’:tqPh`Ë(ëäÈðnù§Í®fƒísÜœçÄÑÕLRɨ À–¤ ‘aÛl7E6¸pŽÇÆo„&À‚jÁBΫ:co»swjͺç=‘/ÍÓËsîàO } ìÑžUÐ;ÊNlÇ;ŽtŒÅ¦#Ú¼Ê h@ÖN!kÙÍÓY¥×hù¤cºkÂÐ#þÄ<Ÿ8ª#­Ë-;»4É šÙ<&uA¼\Y—gS½Bú¸1±ÿúò?jr‰ôÚ-kà”EÂSŤ>rÐUqKØÁ»Œ‡C#@keâK’²¾lº(,¸½ÅÛ•eù©gg×R' ª›§_=Çñäw«!œK«,­c×5*/h@ +FA kˆinBð’š’{:q(ë˜&Ëí® Fæ4b„ùß…)ò×_ŸJWKÈv¥^/¸–dHÏ`œ@nÍͲÕÔ\ú|Ôv#K*íPºfp êÅLJ3ˆ,óÈ´"cÉ´m ±;4°‡Î¢—Fƒ D séV|{ØÇ-6xOAŸûÆ,n‘±R+œkX¦÷F`k´ HØ9›mÔÍáÍ'«ŒðèÀh=l ¶¨_-õj»Ç—o×-Ÿ‘?Ú¸o ” ŸsñEUdCJT&¥¦À„gPjŽ2©¾3\(z â¤0ßéˆN|eÑôÃMM¢¶~Àý/§ês4?÷¾=ßúéËÌÛ¿|—×wo0"ªKÖ1„190@6CˆÚ½Éàÿ]nH@€|hË…ñ“% *fRlM´TK3T2¬ aˆÇL"(Ž¢6ò•»ÎØ>&Ã3‡ÄÏiçÑQЬb¸Õ¡ L‹þ²§u¦gn–bn©Öª`-¦ëh + Ïœ“j vD!Žz?a(r]LŠîdcÎHpÃì“¥ÕØíL9P³Û}öG}6þqŒðø~ë7LÔ1ûtª q YPšísébh‡l€vËãzR0fZLJý"öø²U³M1aŠÄؤ/[Ðçƒ0²ÛB iÔ'`i/ÓÄùÀCPÍK8<Rl kœ§²­:Xëh5Ô ¢6#;2@1¢ ‡$N0RuŠXÖ\!–¶Ò:3µ/ú0ç~s¼E±åÓ ÝSºëÑz¸Hóêùè›ê}íµîï<«œ£ }¦Aâ^cB ­ f\2hôwŠÞZ¦hoù=±sÌ”èÐ,OæT\dˆ§ìE 7‡˜q$zi'ˆ<ñ%LÔrŠ2ð!  )1ø‹ÑSź8VŸÕ¡ês« ÜÕx4¿q‘íël9êÔ? ¨h€^67ƒ–‚¤w3}°°³í?Ó(ÅZ£–”ƒz„ûPÚeðýº¶˜¨^q1wÇ{g^mì†ÛñÄuÆç¼Uì Ù™iÏÚÏ¢Äò`ö\·Èõ"Ï‘*Aí9¤q·7™Ac,Œ ¬¹¼msÃ}êl›+KýŠ·!¼ eaÑ™x"fÊÂ¥+G€/±Žöúö¥ªiâV{ƒªˆfˆ2ØiÙÆS»½ý<æ°êç‡8¯LødÙt0‡S´Ð0tA³UµLsÁ@*n®n1ÇIe{ÜEÝtºŽëø÷ñUí©`­~²jaÙdÇéüý<×á×g\âJÏœJIw!ïq|$XFbR€ XˆYðZÓ=’…Ä¡FjÁœ°ch‚(*7vš ò2)#‰Mpl5¸Ýr¦½§äÒ]afµ¥@îVÊ|çöñÅx>°ÒX~_¶£öJÂösʤÖÞZ>ÀŠ 9öº‚U0)ãwt¨ßq­wͽ•plŽ$ f4V%»PK×ô‡Wßë]Tó¢OG@„€ˆ ¨Ë ÂTS‡•™¼›\l ’-Ô‹y€9ºëz}é@‰U9Û´D•ŸB)–@¨¥À‚2„§Á¤(Ç! )Ua¡9°X™±â¸N\Få!dEÆLŸ{®+˜Cà3¤o÷ŽknúÞ$Nëv{áó‚“vfÝ“Þ;}\ãYëÄ$H1U£]F+3À[Å6n}V‰V㪲ؤÒj+È0lúª %×…t%K[Pc5&ú­c|p^â¢sZ“÷Å=°h쩲“’¸K´&qÓpNÁ–H•qb$›ªÂ›ÓU&|JƼq9^ò+;Œ(™—Ýp ͨ˜¸p´„hˆN aæÉœ¡9Þaßq¿±9Áséa¸G·©­F&‰Ñ‚K*ÈY Üd`µûppÈJçØÂŠC£’0¾¼óºné³p³b$â\ì” 1 ~˜¬€-Xé‹ßz24Þ˜Êx`Ï¢âê@Œ³õÔH´H”Qt… ô>.g ìÓÒ2|!ñ½Úˆî¸ñ4R1¥PC >Òˆ DÜoM@P”PàmáÎ;é7õ!ri"ç [Ak(î>°’qF™ÁÒ^‘oÎ2_yVôTÇÆþ†LÄšZ€[+ÜHÕ†®'æ[­Rô“T$£2£xO8Ȱeø ©°ä²ÂZ<€Vðö‘¾sìh—Úª÷5nÿã¹ßUç¼ô:[žj18§íÍW™ÒzTé/zíÇšuïîŽi³nû`?¦C7-Yn JÛ‚(ñ®:œ6O°Ly!OÁÜ~³~hήêæN>xgÒdOMÇýúËQºüª,gÔhú á—¨]o]´ÊëãùÂàûñÙsÁ/”’~ˆ\—+«¸°ž‚¢‡Jy½ Ôýø¬ó~î•„0œŽØ™) \‡5ë(í§^_ß’õ-Wª"7á ãÕ§&àêNȤÂméúºk¼"õ´ŽjÑÄMU‰4¸S>‚õ!“¨Z ¦DÑ%”“RÐ¿í¹“Þƒz[ˆ°D½ø~¿øüü|Ÿ-¾óã¥gTÒtÌÔÞêr)4#GL‘±˜´¥ú¦½4 ¨ B ]ÂÕTF*Ž䊕ˆ(BÒR oìçö{AÎzT±'é¥û,Œ\ã•àFÄHjU† Í“霤*]ЙwqnZŲÆW±6[f‰½½]J…ììá&¦°FP–&—pt&S^Qð«€e(U.|¢?Ʋ‰ 0á˜bk3Š:-¦VëÑ™Ð:~÷O¿W¿óBÉKHŽãÖõqws¢½žmýI÷ÐP „c$[B\¹q”X”–’?ã”ãû™@Þ¹‚5 ‡á—ü*V 9EGz„˜¨Ø(­ ã SlܾªˆíH5" ăŠ)0ÒatÙë¬ vôG`+`:U±Ð(¡Iã*ZZ2Š*™ZÍJܘâ?ºs¿_ŸLeÙN¨Œ :®t—³rìÆ¥¡”ÄÄ…ò“ïøÑíÙ2ÙŸg¼ß"(È*˜4¨€Q-Q+fË6©£M!’í¡Ñ%Ç,¢YlmigÝÅ)äÄCÚk¸ [P€ ¨¼±4Hmøß(Á»û;ëó,sP@=Ÿ'm”ã1.wÎ5±ÎPŽëaÛË’Y¯±e:ÆÒË$¶'ìy¾ó¹íùS}°ßà ý-¤IÁ¥”Tʃ=eÊÅ«}ÕD´—t `m’Öšå?ùUDý9X²VcÖìlب’U1b‹)9ˆƒ«dÊ^Ó*k$M¥R „P‹ž’„ª ¡öyuõЭÈBÕSeÀ5 `îöÇí§õsUÀ xOͱ§áŒt‡cÔÎðÐ5ˆÕ0°qò*Õ©›œMÅíY øaž$Ä–ìí¸FÙš¦W:/ãú@—D`—–öä– #Žå‹´rw ŸtJPfÆO‰‹üùXÑOx¬kTLÑ ACT‡‹?µd2=¹£RàùÎb=›1tJ§€mª"· èÔUÊ0¼$Óá¹3üédïŸîí·Õö%‹;Ý:ã°n¼Å¿ùÛ\që\qozÛ™XXQ•Nmœ kyÙµÆÍëãÁ€’Có<w8 (lÖeÝK¿Är™¹QjîÕÒ1cu¢éÞ=W·^åÎØ€Ý²„ÒËXK$ªÌù‚Ë>‰˜VßwÚ…M<<-«e÷$M®ö¤ßã¼Ü¨oÌÜ:B3TìUM8Ç ¾nTÈßêc]š@çY9lè2 ±Z ask~°9ƒˆ\!3dÓ˜t¨ƒjIáÌÅ”àt1!;c¬¥U[Ðäus_ïöÃøCíõî1½%¾ õ¸#j«i+³K]B´}ÌmÌnåCéõß :ýù":yýhnSÑ+Ô<ú!ị1j’CÊ‚“üQjIñ‘ «AuŸ¬g0Þ!úÃóÄny6~ŸÞWÆþ>™ô_ž4ø>¾Ó…Z0øè—áõÓí{ųÌÙƒé7Éú²úoýÕ—9öYVDuɤ h€‰#<†þ߀A#ôAI ?0ø;o ¸øÈɘ·eÇàÊ#Ã153µÑò@VTÕ«åEÒ®Š)4¨E¶MD Ä39ñÞ£ͨ\R%>.æâ˜aÆ…0Äh"¡¬dŒ:èÈL#z(M00¶áû”µ¬,x5ë3·,L™°èUL•šCÚÀÛ,´û¬RRAY¦+øfºNºF}1áoÅ›¦CpY©ÐJî„¥§rì”   jè%جtœšÕ(”Ý´2dÑ#¬’Hƒ:3Y€Îå×Ågl‡~tµ™/£j ´• :Ф¶ •f’Ï "F{;ˆÚ ð"LܰâÚR²ã ¾¬.goÃ|˜½jdyxè P}@kQé…¬Ê^ /¿…Ãe‡Tö£Ò¥£öVî͆-%ËTm;mO9ëØ:U#™X‚N?÷=ñ—zÄŽ\ÝËvÅœ†D<й C_½wV\ ¸Iv@êØ0iDÞè™ÀâR¢˜2.Â'ÉA3Dx¢"4Fš¿q~y(K¼cyt8OyÒ¤Çmß4Am‰EØ©¬ˆ½Ü@-‰ 5,-m Á €QóÔE¯öíe„´Eø äŒÏ@Nà Žj˜ýЦiÒ‹€Âê Ã$RA;ÓG•ÅvÚÝ)åŒÝ5²5Þ;Ïä~úºm³´´Q¾@$üƦ@À€€ËÀ)˜rêH“9'WÚ(m‡ÔfyæÚýÙ¥WÔ¢™¸ŠÖf¦Fð·÷ö-L¦8Øq ÃPû¯G[5p…&J@P8–‰£"û¢¤öÐ(=ÚðÃM.Eô(Hž¢u °×³yB±k¹IÜ´!\Í””˜ Í‘ñcDs¸J …„¹4±§q_‘Ë£ÏGêÒ5‰ì©1'‘ÁO‡ßoçÁ亀‰Þv#ÀŠH:Þ8˜0ŒÊÕÚãéÙ0™ñ3À”yjŸ³ô€S.yƯ4l=ꀾDÇ"‰8yûÀžWÏ׈³'^FמN{}¦W‘2­×UQÐk ½Än"eÏ-"è3…•Ž"ã]!ÂcHsüŽl¿=™×¯PN(9¾9¯w’§3¬DLf–Yì0âë¦ Ký™Š”?ÔìŠZ=Ž?\™u§ ŽÚ¬FG/­}ŸV ò2 s濺¶nöÓ'Ý3­ßø9£W åél@P+“áÚ£/>®á å5о Dõ¥  -å#¼t+U’¨+øB¨î”V´°w(mˆ',IKsû÷/f•‘­”Ò’m16T xeߌKe›ò“ŒÊιG=> ×Ñ8ý6>°éêò`šå0±gÉ+Ÿ,ÑÚΤŸÿ‡þÇÿ|úó"q ›|mnEP VáVt£IàËö¹±„o”,z†®tJva#d «@k(wŒE³hݨ ¨Ë®IÑ9¾çøÝ6x‚©„Rš¡Å]§r`¬ÔfíWƒå­‚ ‡`ÀT ²Zj F/ Cá¾›¦äpp^Ò®\AœÕtBG”¶r‘݈=óiî+uõmi»+³§EŽj+’V’™Š ¹Ȩg}yWÎ<:Á™JùÞÈ2Ø¡Y¡øš÷#˜süà¼vÅ6Ëby`O`']zgIL³Òkw_U;ÍëyÙúš†aÛp­¡¤‰ÙÎì›ú›î<–‰”ÌòÅ©œÿôî7–㜨s8ªÁk²B†a†@±Z:˜*&4‘þ*05ë 1}Ñ¿ ñ3ÜŠS(ÜzoX<4ªÖyÓM¾üåò‚\„³kDɂܑâóXEZƒ5£(ÅÑíÉQÈdͨh¸ô[[+7Åï´Ìî 0EwÃQÒÊ #´q )JOøR>¦7c#lZÎ\ÐMâéTwÎÿæõKäÜBkË¿s޼ñ@—“kQ;dE"Ë×*ÖÆ@Iˆ— 0ðQ4S ‰ñdðýÂRΉE߯äaLQ–X—jI‹Ñ„ò¨y8f ßï¹îðíƒã\¼¤¹±fô̦Zp6=P-Z T5m¯ä¬†1 [ç0ÅJ ¢ø…P\ïïå| üs? ÿŸðþ EËø Žöíîñ9mø05¼¦ËÙÏ£¢¦RñzìiW”.?\Ú§zà< O\š¸Ö—€OÑÚÖàloÒQ@³²ªU]„â´•¡ zåßR­î민9Á^š'Òn{x¢Î¶C‰é¾ÐSŠØ’„§¾ÕIævâ¤ØYÈ©Ål·îçv+2´<ô)YÆø|Bfg=òõf˜ ÁEŠ!æ²?7N¿›¾—A‚ 0Up7æk¨c,ôá“Bb-v¾û]ÎÅL;¹0ô#ŽÆ“ò°«gòŒ¯þ½ïíº®ÒÑÛtX”"TëúBùùþsÎÏž`ª‘XùíÎ 2+÷–Úõ1V—®fê‹÷ÂO#¸.ïÑ|De®KW^òÂkÖÔ:ª1 DÞþyÉw.b±0¢ˆî?úêÏ}Ƥïáïr ij±—ê"ïïïþÿ?·>Wßo;µ˜ÒH¥âÖFXh ÖP!õ€rõÐëZfŠ ´BÀ¹âäe£AûNôDeXw+9èEúåÏÇúhÚHCc´©nZåÖ …¼Žß&ß |¼¹û)‰?qœå ¢ñ#tõWRiÉŠ—1™¡UXŠWÍLV઴2)”“U–h ‘Le*F+«¶² ]´`0 »Š¥Åm­zÕ‚“Ú a€BÙè! #ÚŒ4 v&“Ÿ2¿ÑWXQù<üóµw¦‚ܾÿõ÷û[;—ïŸ=Ü×}ëÞá?wöÿÕô?ZÎ@ Í’É+f6ô·Ã?ŠNo¿Ížù*öbÓ9[ÎÙÜ9¸d`)% ¡ÒQAl¥ŠWW l¡4J‘:D$ì©íN™ qK[XðÞËKÈ„'Zãú‡ß ö¥~I­=: ‰¹"â"#õIËÙÉL$eàÕ o<ÚkÀ#% ˆX#`éžï½Ïïðüƒ~‘›‘I¡ 0¢ÇÈ& ›ÉÌká5íp §¾DÛ@àÆÈ]ê5@f-|]<™ŒˆZÕ%Å­td÷–ÓFá 3kY J 4ZLj½ê´[pS¨RÔ¢ä€"\[d‰PÀ0÷–ì²¢`O¬’‚%4´‹»|?ûŠB ¬Éè¢5~-²Î6&ÔPˆÊp@*ŒCdž%×ú§…·¶^³­:êÁ™“B rëyrnTB&£¾ ¦–#×b8)µÐ»Í-°Á–e‰+v\i¢ÄiGah¥'Ð$;YmVY€ª@D² Ç× -`8ÝkXúcsom=·&cþìÿÙ÷oR°îÛ™maMùa®øÞaÝMº$ÿ=_\ØaÑŸq¯YþÙy ÈO„Ê™žÖ’w‡QËGfÝQZ`úl„´u¬‘©*syº«§b-Ï]÷v¬5Wk­ùä:·N¦c•7Ä“ñ|xîB>ÆDm{¦„4‚þéÕ3Ökm¿•j×in-Ó=ìî -Ò£J» ¯ o€¸{u¢82×,MÂÂ9!;<ÜŸZç‡Lª¤ —î`–|q"#õ*}1Ò³ðy3Å+}og÷– ƒEÍÒa!ËP>(%Ðî´ŒÌÉT©ëˆ/ ê\«ùX¸8ëh_ÐU€Žòt…,ËV7ûú\v™óU^›µ‹Ú¯æÚ`ŸðÛ׬ê€áÄl9s@ŸRÜεÿೡ&,?±á‰º¿‰Ä† `N ¢P¸™Aðé=XžèLúýÅà;9V_ ˆüà.þï7^ŸðŸó7ò}ˆßÛ?^üò}ç§Ûâvø¿”ÿÓ3Ô6b‚’q¡Dp¥°PÀŠøŽ£7ÄàL<$GÕTyµü,F _0G^W iÄc»®ÖÊöUÂrcÔ${°„ &Ò"ªÎ~‡w.Ga¯‚Ja› S]ÌÜ€~.̲‡°\51”R©²…jV4‘ƒæ²‡JÀâTÐé¬WcV`L)0Wâ‚§íiÃ骧îeçôRùz1ëw9eÏήçÍèVÁU“›'óÀwQ*íÓB8¸îØèb>tcõù°72BÒ¢ÑT2X­ ®­œ  äDÖA'„¨»·ÏV8C ‡ÎÄ tà™öîÞq,ðÒMb'8¬‚Eزµ0•@dÃRˆP*%Ó4s« m‰OAALÅv™PÓsÏy_7æà̲ ßG&?ÐøÜZn­ÉPCHËüD|4âåvÁ¾Tš8>Ô}-À¶gu.ÔìzÇ®c^¶.O1/.ŽÈwZTsb°ýX ÎÐE ÷–³@ðmšæ5À’W²ˆA¶hÎa ´&Ðí Ýž¥².d+ë²EØÿpÒ¼½Y#ÚÊÞä€p©‹âBbñœ” 'VÎ\hÖî3õ­T1¡>n+<Š0´MlI§f* 8@59‘n’ÐÊí‡]`€(ãh]/´: ÁPódJIõõjÚ£ü ºœî˜W¸ò;åšTšÙígžÏy]Lh·§99Ì)Ù§Œ…`x±\FQ»Åö‘côN,<°ë¦sáæù½v³­ŒÑ"c<¢P¯›|`?ÆTÏÿVî^h?a!EÜ~•ú>ò â§¡%9>?B/[&&eûnC‹?®9µ©íãýóÒM®*›Âtî¥y ëìT>9"|™; ],T¹À¬‹úz1ý ‡Soe&–°bëTŸwZ—²̃ Ûo!ÅÅÄ *$”)WҮ̚l™-“1H Ç͸ 6è‘Xeq%8RŠSv¢[Ø¡vVû9wòÜCÌ‹”¶v~¯§«CeŽ’ ˆšL`~ÃóµK 4WØ#¼v´÷ÐÃX9<=9høäbØ3K°WX L¢…9  º€¡VNØ‘ÈÂ’–J—­BÑÒ)mBÄDÄécSâf­hPqŠî,6ÚâîÐÝ1³ 1¯ÄrU.K7‰ïfkÝáRÝÚiS,LaЊ$pñô4nÑò!Ú¢¥Š5ÉÀ,X‡õ&¹¦'iœˆ’Ñe€XiL.¥vD‚­ Dû[Ç–îNW÷ntÆýD=>êÈ4vê{é\E`ˆZóx˜&íò9§$i`T/Êý°p” ‹ÙÁw¶×æ%g²¢¬õ»‡½ûk«o–„Îö9Θkµ)ß°ÂwzÕÓî úbÆnxÌŸ’S‚ùñ›Ù­§‰„Üq`«Ü¸4#--­šÎ\‰4áVîïÅ(ëѨ˜&ÙLôÅÿbÍ÷£KuÄhOaf&^ƒoöNëÿk¯Ù^ØÅÜ`U•­½‡'|ø¨îHZ‚•.æ-.~áêkÂ+{Éb)¨Ä"Z·©õ~˜{Û–ÉŒ&z,xÅk»wÉ\Œ)P°LyyûÿßýG·æü;0—IÀuÜ|ø¹27â…orÿêçΫů]ÚàJ˜w/$I1Š=T;†ê°DÅ¥D¤„Vq•UhIY°.Ñ(€  jÐAXVeÇ)½ÞnûH~Éîý©O|— “µBŒãŒ`z " €PS+,RZ}S3é2}p©hl5Rºf"uíÛV«‹oߤ·ë"Vf£¯ŸëA¼ï7«7ø¿‡ð´ÍÛP-8›c”IGxçì¬ë4%ì‚+ßon]†ø£äªür'a˜‚Çï u”3¤Ð–b¤C=’²\âªßL,Cå’ BØe<31h$R°‚Ê£Òj­¢®B ­ë@DJF†AŠH‡NÉŽ!„„†´ëNhP¬“Õ8“h@d3¹«¡¾Ëñ›¾Oö¹â?}ðrçágŸÿ_ƒÿ—)W`“U‰e& £•m^ýùßNk.ŽóaåeK‹Ó¥°|…XŠ"Bd™–’f6¸›™¥6 1gtõd,RÀWé:¡£·N‚£‘I5Wjt– ÒÒ}„RÖÀ—üpxÜbO=º†›÷ªÄV|ÊÐ,-u‹H¡XȨ…Ð|µˆ„€ I·é¡0aL4ŽQãÁgÇÏÿÔûߟ~ÿkýïFz%ª*Ñò Í]yÈÿü“EŒp¥Ñÿfô¸æÄkÊD”1ò?Œ•V<.ŸO‹ï©2hUôÒJ¦A¤Å„€¤•%8´™—¥†6Û‡@Fh‚)‹€nÁ°ms6•¢`,à-‰¥sÀÆÐyÑöF‡ƒ†²W¨,È%Èb“‹ @±e'‘¢‰%— 9M2Å×fl^ÇæÆ‘¥ÄæfËÖ{Ÿÿ Ÿ˜:8¯syî%ºÂî{ñŸqƒLhÃø>D}O9ØÀ|MµGýUÁšÑR$p ÝH­¾_GÇ0–ˆáèAWæ¦Q<¦C &î“€ '—àá‚uYÖØ§JßB­ÀTènôõÿá„~ÿI½è¡HlìÛ‹þð}õMèdÚòŸ¤‘´@‘Üvº·/_{è‡Hvû’{¿tnFçgtM˜¾zÖ€§…šÛž‡ÖåŽwB?Ä<¯·GÔn›Y~˜Þ+aAQ–Ã}Ø›¬¬€kLGZ¤îHƒ(|€”èÍz2Bf ÷EzÓH4½Èè™ìq¨dªhœ„2#Sl¶'?Õ_5ûw9ü¡ /ê•!Ü0^È:SçÈr‘Så(¤E gÉŠ‘Y†êº˜)[WÍB™ó™YK·A/à¦n’øÃVêu¡öD:Õ@Ùu‹/Ý—¯?ÿõ|¸gÿd~ ³Á·¯Fƒ·éõµ_pûý†Ÿ«±¾´R™–1AéuÜÇË`uñ¹»'ä 2T2 \F&yúxß÷MÉÓ{²À¤kËóøÃßýëÕ«øðgöûðû·>w÷ïOÛËþÛ÷¿ÿO5щvÜø«¿¾úå‰iÿBÿbt¥øõÛ•6< 1y`g‰@…l‡M¢P‰¨¡€ïlk æ|Ö^šûã¬ÊÖ3RáÚ$·t˦ãÖhm-ä£+‘Ém šö$XeE.hí¨þ´ÛÞcIëV ¨%ÔU2‚Aâøó¸³C²5u¶G½ú6_îUÖfÕÕ9µssí“úÎ л6"ÜêS¸ÄÂf•”Ä«³‡ª`À"U;á Vp ‚¥QÉx¦’N-†Kfº´o¯ôPuZ¸Ð~µ‡¡A“2mO‡9”QtP½©N[Wo}¼3ÑéŸ8ÇîoïÓ69=åõ¥4ŽÊ* p‹ëÂa™½kSÍötœU!炲6ÜA¥ÇPö!Þ §*Á.rÕhö‡8?ªüI&°¥ÕVê”3ÄöÙ‰¬N†=ÃõÇ}wý {n1‹ÒG~= ·:µom2²ÙVH«ÅRKÚ,rÓä ѶVGãH ‚‚Â.­Pp†LÛ—öå¦ÔÀ4éå±&6ã†wáTn&ëN0†\`±‘<㢶jIá “ €×’ Æ'nÈjì3¶g½PNÔR›­íî¤@|?ãq ü5Ö\•¶'rSIåÒ«=ÒT£³ad@[œ.<1Ç.D%£ÔðŠU D#HJ¯¼Þr.*åõþRõ§?JUsƒ–0¨Â`@oL¬i¤Ë_?Ú¿—o' õެ5¤:¤9+êš×)SÓ亦…Ê,[ÜÆ‡Þ«¬LÞXMݹm‚EB7MhëÉ.Ô+EÑS Pƒe [WëtÈÊhà·ÇÚ¶­¯Çuü¡>-] U‘Œ@‡‘Ô£œørŸíàxÉeaêïr¨ëf‰ `Õ!‚HÂv„d‚tÁ‚DÂtÀb´Ý ”P@:ãèÞ¢†FÙ‘‘6joE¢4С`4lÏIuÌó<£çz÷ Þ(sªï,—&š™2]49»$x:Å"¸al_¬´%<¢‰Ž¤X…ÌGQ ‰­)‡Õ.Zùå"s¡W{÷ruÇöÆ»6hœr^ðÜ3B"]søÉ37—×-æ13øš’SeÅ\Vk©ŽF)w*|EèÇ@ŸØüßïj4R>¾žó­«o\¿öz ]4ú1 …:_©’®¹öX X A¯Ö…Ãyc…ž U1T”­ƒÊžyK¥3:M TK– # ¬Nà]ޤbX¹Œ›Pˆ’ex«{*9‰íª-`……Ýx3¯»þjÝ~M´Ç&'¸îü¥BfþC6ÉU’;¿¤¿79›Žp¯SŸIe&±ñ8K®GŸ¯Ž ý"u@KPfI" 8Š Ki@UHR©†„(P"$€bö„t í@¥¾wÀr(Åzãº*ç;=Qx»î`%YáûÄŽ•sÝFöÕçÖØ9 ýlõ¦ˆa¥ÉèFÇ2KÓà-R9j UѼ²L@ºµ[wH>Ð! ` ˆ6¥U|{ò—šb(¶[4¯Oc¯°:Ã¥¦ã<tb?W¢jäp3ÓR°B‚eœ1ƒ 1È€‘‰‚Ô8„ {ë•z¥¦_ÉJ¢<†yô’‹m}újeaáöWhŸ?}}Û/`ªR˜bã"ŠzrKüÎ=$¦1Ø$?ÇûžøC¸ÐAƒåa]Â0m¡cIgÀ:Õ¼™ƒÁc³!'ðÒDˆ  z/òæüÊO¹ ë¯+AdÁÔ« hû/ü¯ž©NVLêãbA Õ«ZJ¶hªÕÐ&X3ÚÕq $aÉ+á…©â‚,`@JºÁhxåðàЭ‹ñqVê~Ì'¬^îwL{iuߊæ°Á4­h:ÏDŽtŒì±ÒÑ ë+<Ų‚ïÔ°ŽfËoè² ¬]«£Ú.ù`áMï›—7!¾¦»î.<Â~[ü¶Í(£Ž´–›O½Ðs™TKÖ„…Æd9BJÏX8Zá¾=¿+÷ò âA[mV¸ÔxÜv€’€¸­/¨Éº îgU³v&õ˜“m!@o¦]¯B…§>6„ë œµ(+x—ÌØO‚»á[ ˜;á£J?‘¾ÙÄÓ4¹]'v͆›à¯û“Ó@A0t•9œlî] 3’õ~C@Ñÿa?®¥_Ÿ hÙÌ©q5¨¦g¤!Meö¿¥õ×LëlKÚå3´%h+×Ì΂§½ õ#›”'q«©âtPE1Ì·Ó¹N¼J:¹[ÚhgOrºøÍŸ=ç§F{öÐ×Õóz‰Gq% j-@³$×ÊV§3ëùý1ÜÛ7÷¹ÃOî?¼¹&ûùt’£*”€uÍ*Ýt PA˜1ð@¢¨4é Biø @žÏlt¼÷ö(N'DôÛ²î&½ó‚ŸÕöµû»Ììd¾Cç´"d*aR.ÄA‡‰…fýð¿˜ß³ô{ˆ×U׸‚5ß?ß½'C¬FRPc¬YšOð1ˆ=ûÁ@ €¢¢.Œ,¡˜ÃpòÙÍ÷ü|¾á.ÑœOâ›QÂA(¢Ö„`]ßgólGjg/uc­¸ãþšõ-¾¸0k¦f€â€>E³ƒH©ô8Š¢U_]±TSÛ%q(¢a™+¤°%2vÑ.iäýü¿<ÿÄûuýßÍßÄK\äZ4ö¥ÙûéûÚñëµò§ß´~ ãEJ™ ˆŒü×D}¨{%§ ñGY•kMjF^îݶ‘£M]ãV󵜖`P|‚ äˆ u“,ÙĤDBÌ®‹.H0À H`ªî6謫üM„tL0–C¢‹’Ùr&*È£'+£p¸Ò`û-¤…og–Ñ%£’fT é°¥Ÿ"$ÁËr®QÁôX^–mýô#|è‚tfðr©ÊŽÚ@yn5}"ÅGÌ `”âÓíëUßþ¿÷2¾Ì”©ÀŠƒh]Nf~ì{LnÛ >ê¡ À¦+¹Û=ú!ò~B]K~ÌåÉüÅì[ Ô2VêØÛ³žÏƦFÓæ]={°2ÕQž¥mÝzjÚ àlgû†ZTpW7wí]d¥?¬&xBzDC'nd#80*·zݛלI_<éÿÁ?ßœe¬Ýý`îLùkåÑKëÀí3ÝÝåSŸæ¯nCçpkã8™ýÜVÓÏüà܇ý}ío^ÿQü½_üßÿ¾î¿}wþÏ7ý­÷6üpðŸ´õÿ¨éRr„zC°|É,c”<· ȈƒÈ@%(Á±$ù§xŽKËñÞ yŽë]Ì¡mŽ8¶® 5\u=¹´ö~HŒ0¦€™K01ÄÐÅHÜÐ,Vóxžä|âÍöô®ëüЭË+½¬!ê›Ã#TM^É=¸mºF‹»fÒ¢1ÒKh-Áv/œŒÎ­ŠeÛÒ ™Ô?kä2¥™÷@3OÒ!¿äÐ)Sâ4¨fŠ~®Ÿ[cý£žÌ“% ÑGË[<(våü£É®o´xĨÝÙ‹R=æª]¡+¢Bbg5ZÄ>õv=RHFMÙBИm—AHŒ¿XMÔ0¾S'ÙÀ¡'v0Oà˜FmK²„ÞVð®nwN0ÐTÉhp'ȤÓ;Ž›öÉÍòÏ)ÿhêô=ovB¡/qï‰9°ÄÖ˜”ªã4Go´J©Mz :ÙÀ»¾†ûJÔ€`¦ò.ø¸:½ã®‚¢ô¨ô¨,~L÷Ç ¸úáZü^àG¦I˜Öö^5d Ç@õx;fÏæùè1hÀ™ ²‘`­hˆ8­s­$I·ÀØx¤êAÑÀ5Á ØI:Æ`Ú ›l†ýBeîÎx¡µ¨¼ d@ ÌTX3긑‹…Út´ “ÐÈfÃ:IŸ]!R|Þ¡;³±­2ê‡ÎÑéj”R£J࣒xÞà•^iØ£%É”«ì¨Zá…PRˆ]ÂØ¨^eÍ[锕UHm%R{%&\)2>Cé ¿ý\‡—”©ËqMÉó쀼¡ùkU‰dVóVPAÇ€É2^;À )©‚%:Ó{Zµ¸øË:ý¡ŒåÆáí¡ÐÊ Ù†  ú*@Ǫ@î(zªœ(€ãÑGríMÇ Ôѳլ²z?×—rSöü‘©q¦ûq¥æéûý¬ ®Ù,Ô·à®Da ÷1¨Ç¡*Ðe•RcÓ¼·2¨"i±0©bVd]CüŽ®!U I§0Ú#‘™â‡‚F¢d¼2×r eat¢B¸Ÿ ,[¦v¸ä=Ú>´ã/[Öjã"ZzŒs™&p(ÁQë˜dÒ¿"µK•ƒíUJcî~kS}SæÌç\’¦Žœ2ãóÝñþlÆM‘V•D6ʼ-(ÉŸb홯eí šs«º^¯»ú-Keê“"Ò¡˜úaß'³û¥¬_»ù*ÆóÔgÜÞ¦?Ð[xþå­én>*h8æÑDI×@!$(ÑXÀêhê­6‘«"PS³¶hƒŠ£cÝX»*`eTè.¬„b£ÛÇ¿ñÆ'~泂}S6×w%p°¶¥\µ±LõcuÓ1=¸/{áK`‘½Mϯê0ýäé•ůë5JþY£ÇYHšŽÙ$æv&g9Ç3\§þòOŠ`¶Qy1Øê4D‰*±etT&?Å¿"G/ý‚B-.ÇKäK Êaç$„OÔ¾ƒqPUà°‡m·æjw ]QNÈÛÒ®©B/'wï™vüÔú¡ºUëåaP|iVÇð¢šæaeŸmÿ1(Œe5âÑY6À ´]ÉQ…PÑÓ)›4Ý2ëzm=IwnÊE&bÉÀ« ýk¥[ïB´;¬›ë+¼5„I®úš •I;ˆ4E4*Q–ŽÔ#ÔÏSÂ#¾2ÑÔùÜzçªZý Z$‹A¶Ÿ2oJ"ÍØ‘–NðWÜoÐçúÇ•w|¡YüKúŸº9 0Ÿt_ÿ¾®òèKiN=‰*$ñt2G›ñ´ö@_I  ëæ`u- ö5Urwq±«[Â(Ã{e"#¦ŽNš|V<À—¥^šv°>~ññK-³™W¤€I ˆBW]MívíCúwüF•¶¶ÐX¦jxöOñ=ù8}˜ùzžhNi}4(…¼›éI :FØxœ0ÖíÚêû$JxTs¼ÇHŽt.¸’Åwµ·#ðSD£EÓYsôåN“mœÄÅ %‡¢ë7øø c ydº­É^²7Qê€v¨‘©@ê ÈS}5TÛÝîÈ“I n%-2 Û‡HÑØ„¶T…;î ¡]*©ãº»>üáä1Î͸#Ð7-JAµ¢d” íøhÐìóüù B&HÄ@ÙºfîÜ}>º¯{Ý̧ãñ)W˜oñ óž@“§´<È ä}R.Ô.—J­Ê‡³]6È#±Ãì³­jƒ²iä±$]qV¾•ê°¯ ŠhÞ6–òeÏN¬£6w‚ÖDüã¬É@–¾ºZ߸”ùiÕ «@ЊFI‹¹Çpç•ñŸÏàk-#x΢ž°š±ÁñÂkL£-„R“á’hm‡ñ'­·EWŸ–‡|ô×ö Läz÷´ºâGâE@+c‘BlúÄåì_dçïêÞßîŧ~êG^*¬Ï:´«ÖJ«³ÃŒTz·¿\¼ü^•7ß½‰Î§öždë´:Ö¯“qrÔW“l¯¦¢žìÊtÕ|´½{ô­j¼åW÷ ñ>õ³šNCH‰µ[ày‘ýANÃÖOÚ¯òÛÔ¬–å×ß¹°ð¾ï÷9‡ê«Íò´'ÜÐ7{7jztþ#9ñ#¶ ú{Lýìn‘’ªXP#vê Z³Bp]´ `‘ºJÊí¨$bEPÂN1Zê@…Ñ/SäȧĻp!äçpÒ" 6* *²–5T," ­¨˜k‹´Ðã=Å.¶H÷FàBZ©i'xb'(p\ƽì_šý5o–;ã_!«i‘µ@i6Âä{½.u+c‹² LÖ,qßÒn[ÃÈ4»{Oyc)« ­A—ÑS$‘A ÂÕœAÑHf H±0Òª H©FÁvZhm‡V%•Uoë 2Ä¡BhP¯PC¦1@*IÀI6ÙÜ_þååŸþýúW|7oŠá¨UËEݾíˆc.š“ï÷#ÃwÏí¡ŠPL¿„Owñ©&Àîú|>s*ÇÊmXObÞ\îaf3‰#Š ‰Ž˜¹sˆÓ›{ÇŒÕU–Ñl a’ÚÜëxx¯7äÄÏ÷onþMØë§GÜÛjX °”§p K%ÔO¾Ï¿üá¿~þéÞ;¿öýßçx0~ÿ¸ÿ¼í®í÷ßï#5¾ö a½TXPC^B4•a­/JÊA·Ä•Ô""çfŸÆywF §G‹©—JÏÞ¼÷Çùýó÷ûù#º¤_xkþB¹üçéæþÇßãþh“ýÞöލ‚ Òä¿æÀ["© ÊËM¬‰˜_ƒJ- á "¯Ô_ú‹y#—9ÂŒH‘êÂ’Ä@…€ggŠ`É ‘;ÒÊ*—í R0€0а·$}áaCÎnÂ`»¿ ¼áÁëüŠ À¦<$‚™Á¢$º6‡S¦¸ˆ 1Ê0ÑBb-7`w/a+J’¯ 0U‰®2—&…Ömü ×v’!GáNáúB¿üë6¿#'öÁ1I­Aq0J€¯À T’8`áw¢tp¬©¥‹9ǸÛüJ% Æ"vQ'¹àº_ô!¤!U;:Æfs‚BWb"‰íÕ¦Zû¾|¿»àÆáî‡÷HI<²Ì'v@‰­Â¿%ØÁHèáà»`bECÇàã¸y¼oéžç·ïýéÝ+4Žç.õg§Qsò°ÇËéUÙ´Äî‘£Ž]ñž0I0ë¸üx×^O£[ÛQÃ`Ï´b¯˜^Ó:‘óªéêút*îŽ4$Û"ÿêa3çáöÞ„e«ô£Ž»ño¹^¯¨š©;v¤1Üôjõj ÆÄ8ûR¶@Ö³x¢ÖP‹Ãóû€ýå÷;Ê¢YÚ ƒ›„qÕ ˜z‡î‹$ê_u/;²a¢…>ÛyýÕ3}¿÷÷?1/Ë| å9å½uôðç'®Ô*NÕ¿VæØj|íw‹5ûÂå×M­…zÞxÈ­xâ÷Ë SÅ*ðuý#L6äé½Y1^íïp¶Ýï®ìé®ÎÉ>âŽï~4>¾ÑßøÏÁ«­60­qfÚ¡@zR0¦É²Ó}vn*E€ˆ@@¡ ²"ZøÀ  ¡TY26˜àyÖk‹Ï’wd˜ìÕ¡džvЮÃUö¾Ñ•>WÈ%ËHÖMjÏ óAºÈY™ŠFžJ(;ìxvœ}réü‚¶=Ït*÷%½Œi=DqÊi}͹VþŠÅJ®ìŸÖ½º|¹ c£PåÞòK¹p™~±d¦¸„´ó°dÌU£#+B”è2aÞ¢mÞÔ×T¿ÌpáTÒ¶*´»•+ß­Þøç躽˜/÷¬öáñ>.ïû´ŸÁ%©fšBPÑ‚˜˜3 h¤á» l8h—D¡ö€'[F(Q9ØâØÉÎ~Ãó}^úáîvÍ(!–›xköýz9u‰¼ËÑ6NF‡“½I5cy!Ú‘‘ÓÌ;è̃ëü£çº ]2̘êNðd|YOìxž6NS1¯ó#âͼ5̇¹+÷²jÄr³–oÐj6Dþ:ͬ/Õ`+À 6©é™¯Nw$é&$K5ÙÀ:¥‹0ã½¾’”¤åÒNèÌ¢ìV~ Š€p5Êĉ¯ÆÕ‹j¢R}Ð0Þ /ìÐ+9c\X¥"ªJ£6 • €°òS.ÚV¦ã FwŽ b€OšVÙGô D$0»ÆÙ ä²ò¢mù}ØRV' Ûá`.­–€eˆ l¤Xu¥†PtàC!†ˆ¦ÒY,Ë/£ A@bŸ[°<ÁŒqí©ß.µÎfö~ýÂóÙkúº ½èÆZ#¡h®Gm5€Ší´ñ æu%#{TQ×”ÚF¶£R¿éÉYà]Š8»C/^ÏmcCè)çåB„TÅÇpSÑ1Ýk Išë¢ha „¬B³”.‹‚ºTµ—Yј¶ó¡Ö[hM7uîwÈ÷{3»óÕé†FFSÓ^ñ.(ÄTÌBYüÅ#æ=—<JDMÐ ø,/Æ‹˜ÇàKC?És(î§´GÕ[£©¡‰˜!¥)¥fÁ!KPèYç”Y)÷`“…D§Q‹Šµ_yÑè—y­s>djtÀóN 8c |* ÅœÓü°çh@+ñ³HãyLmËЫ<`}(ûè“[€Ë‹Š8-Ã#é½)÷‘žK•ïþ+ëG´ñS„µmÒM«or,ô¤ì4 å¼=F1Ut fA}¦º#¦ÚŠ‹dAs:€×ú•)PçB¬újÂGåÂaªÃÒ½hïÔ›°E‡ù"Ï×7¢É»=d0¢ ÷¹«f×åÄEjäÊT‚DÜ]±PaúÆÍI¶øÏÝ [oŸ”ú^•·o ÀgìmøÞ«¸©+ju£Þç½ëZ•üš‰øžuê–pRnöÞ\ÿ¡·ëè3úÏZ}ü@EnRO®ˆ×<«ê‹˜ö2>úýïÀãsG^(”*GÈZÚ"Ìé¤uJÀZ hQùÅ%BaT©¼"F²Ürf´%•ë5AEâ¬-ëZîv@@é’°Y£HLSýîyþx9û§ö.¶]Þa’vÖFtð’ðéå`â:Aîò¬ZÛ˜Pjв= § ÕŲLH°Å1oÆ6¢+º‹›¯œÆ‹»Ÿ8È% Á2-Va–tÉüO2[¢iÊ箞Ð’¥™ XΉÄ@]`NÁhL19ÓZ…tUj X{×ð¶ÎHǬ BD5v‚®¦öªé"ÊCi¢üJç»ãÆA¤ÐÇøèÞâ@¿´ßß„OlmUoîvü77_t(5føà¨IÀ-¶H1©$®.Ì \©ø+ÕÉÔØ#DO–Ÿ8¥R‚R†º ê z]Äì|)·‘nÓ0uRŽ¥.O$ʈ®³e¦¢âð…ñtÜ)OÅXŠÍs¡·ÿ¤¿ø¬Œµ,«gýš|®`ˆ­šQ~Ïo—÷ì:uƒo"]*ÒAyzójûÅ–u î M!"±™R×jݸ³&õ]Þ&Ïô×q?­ÍP,BNºÈƒ2Y¥Âç\]rKOÜ>ë¾ÖenH”%H¦€‘MV:ƒ\A/U™Pš}MK»êZ#&˜ >.82d°ÛoÑ=“EÕXª’úÖ­Ï1Ý 7•’ÌÀª8S>þ³óõ21+y¢ ´<É™Ãú:Љv]Ïj†eÚKé ÖÆ0Àý1µúj~8ÞJþD}½Ÿ§ÀÞvP¹Ž"šm¸[Q.l‰=éT٧άËÇÑÈœÔÅüÂÈÀöçœS›#ÍeYõp?,.*•füX? õrrš~dð6‡x•<OõÌìè}3×ÛtƒÇÝL¿êS¬²[²%‚µUõJvÃ>1Ï ÿhŸçðK›G—§ábŸlÞ`/-Nú/™afÅ®òÌè9:=TL!%Ö‘…ÛÔƒÑ\¹ !ä1 ¥^!¯cîßäüº´‹Ê•·®X…à”.º¦JXÆbÌ ¤taŒÄzÄÈŽ<‘;!Èj¨¨6[ öÕ„D­j I­Fù5®­\œ% ÄhɶÔ1bDCU8X†oÑ…þÙr»#÷ä—ùñækõnÓ;±š.¤¨§’r(p7v÷‚É–:³Ê܃°ù¶~O-EâPk £BvÈ J´¶ ꤎ[‘Ö°·a¤­‹äò»`”ùe$0Hb‚¤  —Y*mDP&ª²ëßæ_ªÔ1 wHœ;QP(Qt¿Ù›ç²öù ~6þýöçGý¾v¾wtÆ5ˆ˜SÎÉ‚ì‘]Xô^Ð2½‚ Øöfúu…7yrû/nf2”ß3¼s'—, ŒWïÎ{—Ü=nÞ)H¦ÀØ -¸ï‚ÈŠ ÈÀªš—]Ï£§ã›·üþ8z›B¤9þ9iSæx) Pî¾]zþ­=ÿà¯ïŸùüÀ~ü²ã‡¾ÿ?ލáJZ‚düГũµŽ•‰ ÌH$Ä ˜0[ÚXBÍÙ!,ÍuóhH—jþ¥?æöûË #=éûÁÿN ²³õ¯;K~¾Ýéîfiá.¨e0P¦@ ‹ ÿ¼’ XtEWè¥æ‘GºYt ¨ÆÄ« ?–0Ä)—~RAañ)"L*@®¼DÎͨ¢Ô<œÍR+lŽQ6¾ÇÎ8àÌŽ­wEøE`Á–Ï‹>æbb±ð¡1@yæ·Ú ³£À( 5$Ì#J—×R¢´–âŠ5#ÀL5ËŠW*›fÚ˜KùQýV`…ÅÓQ $Õ”ÐÃk;Df’hÁCàDnº©Ÿ1Ö€J*bMJ\lÉ@ ^ å%(á:¾Í E$…oÄ`F&€„b÷=QVOß2ÉmÅâgŽ™Émdydxs¤î²uïC…Xá„8ÀE°D\àR½`œöåÑ™¶†¨øÉ´ødó‹°À˜85ÑhdãQª¦Æý}G9”ùdÏ6bjª#¤Ëše˜X`ËòÚ¡·k7maq¯R¤ÎóÎó±UŠóËÖ±0—¨Hjµ?ÆÀøÆ“¹)7™Åy¬÷¹8öŽ¬í¸›—\Þ_ÊpV²cnÁ!ŰíÆÙµ%Ž|Qq®Ðv;NþqNvÅ+G6M7ÜkšnË}d_qdçz³|¨Ú[2%çìw52S1Œ…¹€ ”Rµô@éöe0ƒƒÇQkEj×Ìa¹W¨¶Cë0{3{qäPƳÞñû[I3×?ëÏ„ë19_$†($_®vûRžæx Ç]ÔÝKšÀ³™ëÓÜ/Ø¿Õ±ß ÈPŠcD×5¸¹üþ~<(ÊÇ‘ÿbS²Te{oÖЕÙë÷±ŠÖÆ7^ÿý§ïÿÿ‹ù¹ÛïØL 6´€Pð:¸G1HiA&‹â¢€ @‰€@dبžVM ð}@¦ôÈàEŽNL–¢ªãˆS %=Ám0N«l­'«Ocìö¥õëlÂK†9ÒN ’B2…¨J5CgN%iÈ™J#­8ÑÉN½Ÿú»v^&"ÏÇ|ó+.üÚ¬sÛ¾-ò|‚©RñO¬-þÇÝ)°šHA¶)wtc PQCKK*™XóN,Ú E‰îÀºD7 -¥ú­L¯ûxtܺ2a“ò ±(p¢ûª¾©(˜ÅúÞõ‚Ï Jö÷G´b® Éõÿë?âË÷•á>¾3VYÑ+ª  Fì˽YîZ•öƒº¸²”žoÜýv¢²+å°cªt›>™çÕÿê£týêó5yÃÞôXï‚9“_ùþgíf8V0™h¾nwÀ¼- 5(”¹ñ裈_ä׫ˆ+éøIŽØi… ù‚3ÛL”½>º¶}n}:VÃ’¤BV3Wz»¡Jdb¦[nœW„zà\üï6Ñiœ^†ÓS&†">«¶~ƒsXn÷»SÚÕûÓã^ó,£-h Ue#Öó`š}J®¨6ì©Á"ô…0.ž¢*æ0aÚ X€Ó&É£Š\L†›7Vî(¿Z423”xKÍžÏ=}C»©¦Ýª,Ë>@oº†nÏ$,ªû˜ç®½ db`wäüõå/»–uzQî>¾ë¨Z3$¸ôjWø¨ÿ6¿xT=ìýúÇ¿_ü¼ŸWÚÉ"{ªFyœuÖfÖ³4kù+þˆþØÎ¥~{ëjDÖ¾šÑÏ_R_ÀÕ.¶Þ]=|öp&´…ÃÙê–¢ð@b CpÑ–¶lzXHcµF\”„BùPŠz¤wÕÀ& µV–ØSöYŠIÓíCÚ¾qo1Ò\9!þq®Ü’]+qXiÖ­%W×бÕqàËihdLÐ4èôÔp Hlq%î)DbOëƒê.Ü+L=€oD2ˆ¥åÃi¥ÚSÛ{ä3Ĉ‚TL9(²¹¡øSŽd„®•Tôz„žÒšˆ {ª5 ²4 I4uTIlP­Ò®£pâ”÷Nï—²¶F¶¥‰ñ9Ûfãéxêa»¦sb_ò¦üõÌFü^rúGÿM^,‹Hâ•1V }Ak3˜ …‘L°,ÈŠÜRB¼za‚ <‚J/³â©c[É&Õ ’R”å«]&ž½" ¾à &go'‡(òÍ¡X3*‡Rˆaܾ9H“F‚¨Ô÷z_Ë`f©G¬VÎ[¸D ’ Æøß™çJ½w­P êž:í+š œÔ`R µe·O´’»gm„>Ç—7᣹ëP¨$Å)«(ÀÝn4lY3òÄ躒j>Ð/k‰<¾·]}N 9¢ZȱÊ:¯+:&f6€Î¨ó¥yÇ ‘¯e{ªDèa;~:¨‚i´qÉM8=ðöÚÂU†îp'ψœ)KIE.†ûAAŸ¤•îM÷üüH=Éó+‚ì„°Â&Ôöêq™QGh°Ðžk»°?Þà ¨m@ìRÒ>¹Ï È2Ú»p|–-Wr-iþ—öÿÊÿï•ñŒþ ó·ŠÉÀ_f»<é¹\‹B60ÒP‰:K —m–5@–cÁ¤oºúf°zÁHàšée7{þj÷2 VKÎÒ&Ìkme –6b˜2Ï;å¼®BgBw—ò®pÚš­hLæ^Å/gußõ›éX“Õ æûàdð¶|/ÞoÛ ¤QR·X_`n|L™Xfí³Î_‹°Ò¼ÏžØ–â¿*õo}õ<ù’NüK’ÓØ¹çp¡‡ÎrGò Gd|‹ªÊêí»£èÜzëÙVéJ´é–òâ«Ý×±ëäµ–seäÍ~'\vEÖX„3A°éëÇÀ¢Ê”[Æ£²\ð¤{®²dƒ4|Ç£¼Î#ù„!$>ãx®H7E Ö¬\¼Åšk—ª02yçµb¾Sƒ}Ìó¨ä]ZÓ¨h§„c-,DP k¨4V ±ÆŠR5S'XåT #ѹz¦}f¦ K#°F…mq•*µ¶šñiFD‡@¸GŸRoõÇ+ 1ÒÚU©‹Á*»Óůøyºøíñûé•Ôžá ÁÐ@ð˜EƒÊ.Hß7C¸/A*+`Ý·£Ê‹Dï ¾ÂˆŠbbåP¼m’ fl,BQU_2E„+¤U ª€†ÈR@ TèHgî›í¤ÒTAÔµ\ œ3²üoÈ_Ùp©7Ùk©Ð’HwÈ)¦5­!A˵“9 þu¿vNè€Üûþûãû³ùYøáÎá}Ö²t‘ ú¼À­‘H€c@´@4€@CbA F;½±ñ{…¨N0 µA°‘  á¸ðšLBX<…ÈKh.LfÞ,%©>æéò‹c)•Úa(AëÅ€ *ÎO%5ß‘m5úKsÁ®Ëœ­-óˆ‚jŸƒl›Ïd¸ÀYn`ØVbÌ˯ŸuÕ+¨î•ú<ƒ ¸‰¤C÷pBþl!íŒ:î¾:Ì¡›*Á±aÚ¹µP˜6.‚.")\ÔXÒùÓÞ¾Iûót|„?AûœRJéð¶£SP´'äIÚ†XõºÎïÎÞóÎÚn}ïrÕ¢ÕAûŠ0 cYC—ÎuÝ9_bz”yÿüü£>U¯ñÀ£àÄYÛ–hjHPRU Ô¢)ÖñÿôC[Çïpæ™sÇàÄì°´pÓuY»ƒ$¶ò.ŽU6Ç«iQQèÙˆà*Ö*ÏJ~•s>wN îγigꤰ܉JX‚/ÅöFe‚~shzù€("ˆ²Éùgw=BMåY¿ØÏgû½åöj¶Úé_q{ºú ϸ–'÷íz“µPŒÄ·*¿@‰E°èöZù…ŒÐ€…÷–2$Áê6ËÚ¾u._¼W LMEÀ玕þ>>¿8¿kÛX²8²/û‚æH¢Á)!ZÇ0¨8ý½~ €†‘É <,–PCB@ÒåOn5cn£R5ÄŘ„ Ÿ«,*ÃØäé@ˆ2sAÏÊX^b­yÝ"avP ”¬$|°1M)Å‚ï †ö‘§Ïÿx‚€-¹ QP«‰[1Ûò”êrí¹ùü8¹ë¯ŒËï}ý$YßÙz¾ºï§ËõîÎÃÏÀ ‰HDê¥. ¥2b( ’²n[ U‹¹¦¾Ï |¹!-d‡mÐ/Dζ êY¼êf‹H\b0Ð"ƒ1ÀÍ)ÈšÑB¼¢°P|Çé×ûFÒ@5{–ªŽm†ØmøUW¸ãÕDÈ›*D+4‹© °ÄN BÒ"¥¬›÷ïy»êù®èÍëEž©ÛMhËhŒ3íc²aˆN1Ä€¸íáý3]Hÿ 4¥ˆ†l_”_÷D¶jMµ¢jã„0¡ã²ˆÑnÑ̆lˆpµ,=ຑCnÂ_t‹kx®VÁ¹úcö¿sÔûj ×°ÂŽkü{Ë+ê“Ð3É­¹O7¨Ï^¦Í´‡¾P’VJ–Qh…ÃA>x£Éï\ŒàF˜çÀã ðh9a"ˆA€„û µ¼°—R/Á{1™;a€[ùû™ 2º@¾ÄIÍ\B°(î€+ÔV œž…ÜÞ¾õ8H$-cÉ“(rŽ{s|rê㜬[sþÁ,¼Ž/¥ïÖhÐQ‡PvË5D³ê lœfëþ= ò&]*GE$¸(gºXÑUd‡K<èprò=óÙ‚%rº~¹€5—¶ ]ï¿­Ïg»-høRŠJúÞä x€jW{X’!:9•¼”QêO­×‡ýQ5P™ ùuj>M½ö_ç‘ÎA,‚B n¨_J½3X£{ OºdYïf‹Œ»î\\ß(Šq-[v“RÙäÀz@UMÃa1Q,ÚÔÑY5qít°ÆÊ(úÓ^âWúô)ÀÏ+yÍצÆ1-/̹snÂ-(½H ¶b«Iåô€ÅR¢…µÕ±Žµ,R4ƒ$ŠÕÒI¥5º4cZ¡HÓÞvÌ\Ö0@Ðæ¾ïßÙ>ÑŸó{ðÞ |þý?ö×ü~ßýùÇ•þýÌÊîŽÞw€êEr÷‹oŒ,¢¨¥K3)R¨Á¸²9w‚Œ÷ØÔδ­Ã‹%ËAžŠÛÓ\Ð#” $ð4€AÝ:4ŽD@ñ¿˜¤åßÙûÌ?ìzð~÷ÕKë×ÿ~¼àOò{Q…-´[`K:&€€F@+²2b‚ f…*°2‘ŠxL}îj2v@­ ZC%ªGgéVê$# ”Ûœö’“(ghÿŒ¥ ßt³LpGé –£¼˜‰âŠAm0¦“*ØRÁ,§l!a/XÞ¹o¯ ëꈇÆn#f0š~Ÿã&T$—*‚ EXRßâ-pXKîÈÛ°@£ö¤k6¼¬XÊ_T¨¦!ZÌþ^–ÐÑÖò¸šÿ¬X%ƤFÚÖ“J¾"0Œ áx¯À$.ë+ر¿ÔÄÅAZgkŽÔ³Z]Å‹gàHjÚï„Ôîá ÛƒÞ©{PE‰êkQ€mœüÞúo»?zßäOݺ•ocþå‚â„ïLÎøzÝÏÅÙiurß*:ÓZR9.´Pb!1²©PÕhœWbÔ%ºlh9®‹ßèò?#ÕÑì@-…Ϻ;©§Å3ÒOƒ÷tðžhø8–îèþéÑ÷À¼¯ÆãGn™5wuavq(ÞS¸#yDuaÿ±>èäŠe MÙJ"FãȪʆç%˜(ËoULݦ: WõÑñø÷ùFñ)¾'=&láÛÕ7„mÂ=T]¢râ<+S©žÈO@‘ÆX6{¬¨TtÓy9|ÊHwÒ2ÀÓM/Ï0`¾Û *Ü–ä”çàà–íRìâC=HÜïñwØíü<™ëw€cÉW©Ï×~Ça!9ÉÔùßÅãÜ^ÆQEn¥H~%Bþ$ýRŽ ‚¢"01?Ò˜ùõ "Ôï@ܤádÉ>´ïæœO8=Å­NÒÌä+¾DM˜;UšìÚK‚‰̲&*R‘‹%[D†B£\95ýƒât}ÄUe+ëz¸'R« WCà,öO‹R2"ÇpÛ‘y'8ÆhÉQ§b&L†ÀtÌ…5eWðB08‘žö·¸q—·¯v)z¿ì3XKK ñAÏ}ºï©^Ð_XÓrýîüãö'MÏoûÇoyìEÍ@f‚ñÌëb¶•u#ã¦öÕÇà€´. 5ŽqT¬BÀóÐ\Þ]ÙÇaÑ MÒüéÑ †ƒª ª[Ú]ߤ¼¶D{uFÊÕª~AÊëeëûþ¢ynÕ£}]-0Ì»fbV–DÂF…«뉫ê.Ÿzõy¸ê[ýhÔ>¿nØë 9$R'Ñ—ÿóÅ“T¤õ(ļ¿0Fƒ?šü¹¦¿ýÝÑ¥w‰iì¬å-2‚߆N»<Îâ•émP°»Ö·†]4; Êñ†oŸH€lmZiêÕƒò]ÞþÄGþרdµ£R¼yf Va3þ˜Êeµ)+ Îl_Ê¿-­ÎÏÀE–ta7ðto<ØÆž»rnîÏÂ)Ør土myû‹+žà&í(b÷6ëØÓ¾˜—–››’PÂ!‘*ð ‹®p±†30þ}ÇĈá¡„Ú©*Ç41p¥,O™!=âÁ¾‰«h­ï™j”ra a›46±7¡!¿ ¬W´n×Ö¢NÐè…¿B/Õ*€6yÊ3vP ¸±‰Ñwˆ'$’Á¶FPÊZêû…Þ.#2ðÅÔ!‚ìRŒ%⌎4ä‚ÔÞÖêøë½}ï_ן8å|ݡᑋhK¨‰¶‘e‘ä#¥ð$£Õg¢7C±ÖÑäA­`Ù=qku™;ÜÍ¿ê¦ô˜\Ú›–,zÔ'(Z†°¿Pfm·Ú%Z,(×"Õ] TH5*w}ºG¬˜´²§Ð1b˜ßRÂ×ȣ‚'¶JáƒÁ⺯è.‹›vvû¡«Ì®ˆƒh‹ ¬îˆ¸C:hF‰2V6z#¢H°6­A "\²'*RK*cöªâÞ½ýˆçí햊ÜšÒ—RE[êQê>ß>Ã6{ÒÀ ¤69 eŽ„ÖaZ´›ñjõ7·“$FtTZF™TÀÄlñ:^"Ãz58eå™å°ÖÝšÇÓ•ãÈËëó‹6ÜhèÓÑùµÏ]Šes‡DØF&´AèÐÓeiÈVx`ª–ÄNÃU¼sºgj:-Îç9Kv©Í8®1“Ü:‡<\&aËG…‡§~»×7®WØ?d|äãÀ<˜ÔfÕx @¥yD™ÕsÝ™VˆW è:]wÌ1ósçž—M i»&75X’kÛÿ[Ò’úшþäㇼӈ ŒEÑóÒŠÛù~Ë·#¤ž‰‡¨o0Ùó}]ýúGÿîÙ©DŸßkÏÏ%-RNyäUT<P… ë<”›Ü&—â±eN·Q r1 ì wÐ-ü%‹ÖPÈ]*q "Zu “š@…SRû²a­ *‹v£Pa7¤×î÷vÒÒN0 ¡QNzõwªWh@-Ä”ÖJqÐB(µ†jTCBv‚KMp—r°³ŒÖMBÒ º–%*IÐS#u„DÙPNã«æ ªåÅq%©Ì×ø84¦1ZDÞÛ=¸¡Žè.eÁ †«h¼ÂÍD #Kà#°\ª¡š9ƒjÄ—h‹, l nŒ}÷ŸómíŒïcáÖͺŸøB&"»Ü"G£-˰ÏN[ËgSìuyýº~½L& ŒÒ¶Ú %ÒX¡Ö*½Óà`)U‰“ ¹“Mútµ¨û Q! (°˜À!¡7ŸhVû|ŠÏ†P î¼²<Λ?dœõBÈ.)6œüÁà•ge£Õýøûþ“sÿ¹¨.ž1Ι?[Ýùü¸B¯æôçhׇ«=xÚòáÞ;jÀšÐ‹‰Ê™±Ã9lØq»Û¹ w;+Ë“T0¶ly¹Ïk‡ßù$ÏÐýôv³÷{þ }B½Á…" ^a¤Ö¨F¥¤B+d ^£5ªpÝÒÕ/q†™òSi1  iÐæŠ[´™P²9]ñÅDÀ4Ú£çA:iI—EP 03¯T®Ï'²©¢a m(kI‰Ì*¸¬@y} Ö®«[ÆðJkLbóé` fâ!&Ĥµ” ^qV‰¢@ ­¨›i õ™GÒá°”NXŒ›Óº¸ w¡û.¹Ú;½ï8„Ê ÕÝ„ÏÀi*!è«ô7›? GnØùÇ€2nq¬Dc è¹õ’*£éA. n€¡³ Q¶x€Ÿ*ÀðMR¶z&sö×JSóDOò ùYÉè¾nïœü¹^GûºÛøžÆŠò¦è¯¿md'ï Ò !£×P4*_4H Å19 á ––ÈÀ }¸:bw²Z”ÑbRÊKwàfG¤gX"Ë6]ñPçžÌ¦|¦’äœÓ—õþÝãqH0¸ßvj.V¡li£ [h¬ÏÈ„Z%G…qA:$‹·E%XÀðêÌZ‰ú„þ…7éXoÑ]Ç鎄oØ«júsþNÿô­ç|±»$GB ræÐ~¢¨FkÏ«J¿,KI)üŽì3œTʶ™Ðérà :çz¦]#*ëzZá¦äõág;ï[Ka¥ BGáàC” •UFèu(_/`k'ª›µŠc•Ÿ®$]¬ÍàI_#óã•È{¯Ã…Õà®ñu!S÷I@€iFaË]§Ðß</A`z×’3+Ø&i2{L´ïû–y/t÷Ðu^²ôµsp½Ë0¿˜¿ñS2‰I @a(Å ,@I3î@²¢„=ðy­àËp›™ôÙ>¨r@ÐlÝqyÀ9á}c==.Ë1›6•ækŇ;gád8ˆ„™xEC°‘Ó–ø(2œìT_¥U¼¶5ƒš4•ÃÓXÊn¬r"P‘tÒžÑ×ð³¢phø»ß{žI@x>æýÏ»ŸÏ?¯D™a xz JW™ Þ"‚k¦a¢‡pDFð@´tpƒh3ìÊ£Ž©‚¸fpð@”Hér)£rX8mzVo1kyj´l—.»ù&sÞrÞXÞϪ ˆ¿*ȦñéKô[@8„k2¡#2볆Ë| 3RôGLIÁÜvM`·gcÎ 5ÅM’bTSÔbØÀÄc°¹y‰vÛ¶ ¶_•'ÁBUÙ….hI·qn{7X‚lŠCÕ‚éAc€âÎuDV¤ß±5…%èPS’h à •… ½ÊæƒøºðZ·âN{˘–4ø‚—³ºT<å§ÞæÑycÑÞbñòjnÍ+œ²(Á8-ACf—{ZׄÕÅ"š€!‚‘£0Pc[©ÎØ®‰–^*Ç™M¾üë_}쯽÷ë‹zTEÉÜ¢W‰ß[ÔUpZ"/Lj"2Üh6#-TsFli"S(×mL(¾ï~à>,M{t1<½ë–IqDzŽ}kÊa(CÑ']7|k`ËŠíçx‹ƒ ê5SUoØ»“è0bp–—h*æË»Ì6Ù À-âbQº ¬êYwœ F‚øø‚(£ròÞƒ¦ ¤5œ Ipsgƒµ!ÂI"‚µ)a€¬ã9d›&S“‚9žúí¿kþý¤*é’PÀÖð˜Ã±—ÖËðwÝ0Æ–ª‰Qž°+;fmå0\*wÈ7ñÄÖ‘5n¹/®?Øõ„æ âicª´äÚ+)Ì,Î;)åÕ“ÔM–|`䑸}ëÔžÚª;ÒŒ88%m×/Š>ÔùFÇ¥À å±&‘¬yÔ‘_u€‘‹‘bŒ1S ðPÊ% J­XˆÁ‚[¼hm” €RÊøá*ÚŠ0hU]9ÛqDE™… '„ÌÁQ†U×@c(øÈ”$.\â­…ˆïê. ÄBpÅÆDuØ>hú’pì¨FGAÑ×âÐA U«tP¨™Q¬ÎØÒïÊÓÝxJ†žJ·ã˜»¦-ØÌµYx*+»ÇVÚ­-Ü·MPtìÿâŸAJ!Q4Á1®‰†J #–V4ÔªTt”C!¾ÒŸ1û¬Þ´²@Iq•Lj𢱦®U]œc?Ïög–+û"5¦v½z†ÚŽö©ó’èÐăÜñ=÷6OòoÕ·"Ð2\½ç¨OÒp¦øƒþÿõø÷„ßßêÏçéW cGd‘Àf5£(ײØ-}qßêû1´R…´Îš›ëg|o é£(£›¾„sܱ4š™‰dú`!ƒ° •Âh½ðÅŤ„ˆ$„Ñ}jiþcbúø‹õJù:/ΩŸ§—a…Æ¢WTêÚŠ3ñ´Ÿûô’ˆ Ú€*ÉÙ '5á­“e–¬6#†;8ÕÈà &ÐÑQç&åÀ=اƒÝ;WG YÛ ˆ,WëŸS^%\€Ø2ª[ê#GR§R*OŽâ™ ¢×Ž.™ii¥­Ã±s™ÓB÷Ôï)Ç;<€ Ž£…2ÈANò@”X‹w[ *ꊄ`…aA„ZØm·:ÛJý/ýd|Ô©µ»=#û=½ßÝ9¦˜¤Ø7qŒ¸ž‹às”I@ˆîϲ½8U@uÏØv¸°€$z›jÂÛô¡‰j«t1J©.™>õD— ÜàÃj ɆœaätaÙ{¯ÔGþ^+C3Û´A£[U“sLöûcÿ+fÖ~Ÿû]0—¯ü@ÿœÎ棦Ùg4¸"…ЖÏ[ÚûK;(¯¨?Ê…:qëÓ‡gëlüù×ëŸxux­q¹÷{³íÃrŽÈÇò:ãªô難ÌÃþñ¿ðÏßõ·8™@KÞ[dÄ1yüo'ùëA6©Ís§cõï_ï+ÏóMj2Ý­¯Ïk¯ãë‰jnKभ\Mð d“zÔ—Î,]—A³••Ä„¢ *š0Äk!F+¥`ŠT°@g&`ÆT¹„½À0«^²vå‚êdŇ@;ÅË#ÄØ’¢ dB1võéûÇÖg„%Š fk·bŠ %tÕˆ}º³È "% ma%Ö‘µl¾à^7kÐ3´cSÀ½^{ªTi" yô,å#´u€£W¤0Ä% Ã8ZÉB0¶X*»ÁH“QTD™èÂ' {Ä ÙŒŒR¦£â›nРA&ÂA`¡U(¨f±D25Õ“&Ùâ¤Xœšyýë÷×*-ÄÒ n†Þ™" •„V‚(2‚'# yjgfÓîC %"ãÀÓB# 8ªED T „D %DH¨äÌÀD§¡BMD!)&¥îLÃÔÁ€õÀNÞ¯Ù¿êûàŸ¶?—¼éKo…{ßÑoÞ¯ç¹øã—ö_=ý`uôxpËïˆ÷–“ zHˆA_8 ¢ö¯°OæuC¿B…a ¦ÂvSíp,sé|Op /H„ŽÞADÆzä)\"„7zþW÷ÿÿß¼óÍ¥°Ž;—9žù€ƒ{à‚”F€)Á¤àJ),0D $`¥teD¢yÆb,”¢¾qSh]¯®|Õð«@€€Ï%Ö0%Áѯ,’$i*0@Óxõý±8—Î} ªR`$CEÚÒ­õ²™´«m±a,*³ â‰yŽIÐÔ,x‰ò°ÃÜÚ2E‚‡Ÿ‹9A˲´±NM†ëË`ñ‡ÎƒGú=›oâÅüžµ?Ò3µôbØ/šhºÇh$¬È•AüÃà=L[*+p‚ 5Ô€ Ó)7¹M²Â ^YH¿¨Å"˜j© ¶…Ô„±ŽÓ\˜ØKQ1,tE/q,žºI¶/ª-k@íœx }Cuó8?ZÛ»=;ÿÿ-°ø%ùA‚IÆ!M“óâûßÜãcÝ¿à%ï0·ËÛýžM¯³ÔÃÂTÀI€Pä{S…pBС Dk´¤d€LeЉÿs[Çú÷Qí÷gܧ»<"«\õ4aàœm[Ž8Ì aH”Q†;‘è7ŒC $ÉHwc2˜ör²ú\YIõÈ«,Yú° mÝöYÉý`£gâ]1¨Z¦š¢ßT¼ü/¯ÿ>ó yÃÁx8]øš²„ûJÛº# `j0ÚJ× a†© ¤mÛ Å+¢6Œ(€›mÝ [Â1"ƒE6alm"©ìÕxG>ÃY/rQ<Ëî¶,º >Jõ+ÐoÇžov¿ ³¤Ÿ“»ÏP î‡õƒcÇÎ'N«µwm„EVÔ›¨õÏïÏÇß|&íq•BbÙáŒá)­ ¬D{äçÀÉ„óûÍÐ’U‹»ÕË2f¡¾Ú]ìúÀ;‘0&\]¸ÎxˆÏd—½VQ$Îp§½'xN¶ãUöØâ´ š8}¶sW[ÉUü(þ7аsúÑ«Z=.utúrà…×á@‰*ÆÇ›eï6išyåÔ]DÀÃ`ÀÜ1e˜‘÷Ä™W7„9ËiIÿ½ù¾nµ¾ÌØCo 3/DާæM±†EîÚÞýv­ð¤› ‹¿êoãªPÑ,Ð /€°A D¥e”QO¬Ðå’¥ÏÑÁµò‚ýŠÒ²Z^|ë¢PrœŽý#«¿ü­œ¿&GRZ‡Yä;¦w±±K:Ü¡)N´ì6¬Ð ‰òœxz•Ô*œ([þB: Ý(%*9†[\3v|­W‚T¦}ÈT  ©„”ãItÓxX¡f}ßtFÅöÆjm\RŠsx¨ sŠQEèNÄmÖÊa{A+ŸlE«r® laÒçqÀQ²zUÖ’vvg÷[†kjÉ—Q0í!z/¹Õ°xlmŒ¼Ç¸îø˜Æ‘ã!‹,° вU‰ ¹ÖÞ2X§®è0@OÅŽ†º×#ŽôìD!\Ñmp’• ‹ÙÔº^'.RpMgöH« •®ᢰȻ=}Ó2ªhw°= %—ØÃfDì2aâfù¯TûÓ¯ý}ØHÖ ŽhZÎê²^§ªh¥¿TqBÙÚMÜjij͜Æ^ƒØçÇ©>çk³ÂFlcÓ&šZawAmlvö {¥¬s _BjzÈ×mÄÂÆ¢Óè‹´½ÃäÑý-sÙ—Ÿw-ߥ;œÿp¢1ë—þŠeÐê &.åi÷½x)e˜¢œÎ¨LÊvU~zÅψA4‘Œ é3õ…ß _4Þð/ößÚ¿ù—çÇt=ñ·fG´W-M Åúx?¶†žïûxe>›dDÁJ¯þð2ò'J.)§bø™Ý©Îr›œ$¢•Éí²ï¯üÈç¿û_É××ÜZÏ– T°Wæ?qÍøÎ9ˆŽÓœ²÷¸JæÑ/vÈô|üïæÏÞÞ®Ÿo7ëLþRï*º°ÛÕæò¹ýÁaçÌÄ; „°Q³Aª%²Ô©ÐíKÏõš=lÑ‚Øf,aš¡j”“a Øðe[îä(X©Ïت'w°rtÁB@0|‚¯¦ê.†¹î•ˆ‹Ú,¹ª¬å]L5\07‰5y;$øuO5›jëb„!ˆÕX¸'V HÍ ¦•zuÕ¼ò¶ÉHé'Ì€I{_•#Ú„”éœO=Ês¿ãìÏͼC/ÞÀu¦íT×joÁþ™áÏ$ª‘ÀD´(PŠÆ@SÈF† C43íAXٟ¸©:殿ñ‘ó'åä†Eä~Ù‚%QA=;1„lÝ·Ø#:e-R~åý”™Ü4x €Í "ÄS´" Ž^ÏIɳºÄKBBÌ$šÀhN ŸÞ‡±2Bd²¹"àtD Ä ªXÄ^g±Wðú뢂 ˜#ÙN^z°1ó4$ܹ„p•Îdr¼˜²S–£æa§³>H1¡’:ÖÊ!ñ8vãóæWçzÿ{¾ >Ò’QÚY:‰ãœ¶øFñ¬^ÁBµMœËëóyŸ./ÀÓiŒEŠS `\d.1äC‚½i¦BQ )Š´à$°c¬¥&“!3TØ€ÒÃ($Þ°c”RâWè²S‚“械DÛ ä Ž9±QÐ[–hú5‰£âÇ’õ†Ù¦àMÉø~Þµ°Æ\úÒ!÷i÷A‘Ѳá#?Ž„ DD„ÈרeDÖÄ_#fB½4·ê@®Ùsåb3†µ¬¦ˆÊŠ™é÷o‡?Û}~.ηøÝïƒw -µœ´,@#´¢5⦊) Sœõ@¦±´ÃDSÔ‘e6(hI kwtL3%gbî´dÓ/é¡ìêžÇæO·ŸùÖ?¦w¸‡ÔRÈÚG¤…kbOd™å‘¥=©3Clhãy±÷¸£ h«ó&+ëãY•5ž-pð²“òõú?Ü?ð>ü¥ÛâÕÎÐ ¶u’5b³º*šÊ³ºëh²¤sÁ(aWll %ý „Ä“z¢ÚAÒ öDL,søŠ$F”ñJ‚€5³Œð*AâŠÚ¤‹§ÑD¾.@Y$ê<½Öwñ?8 ‰ Uâ˜G'H€,€©»[bœ ¥þÒŸ_‘ªãì‡,„3Ø“¾àËn#/|Æð„WM%’U Ç…l4@3 ¼©µèÀ"´Œ©0Ú+'ªjF¯Œ ÉH*FÕ‹a €y!v€@q ¶¶x¶/±Õßýûþ)¿ùÆ¡‰o—gÖÛáç«û\ÿ|{û{~þþû%àŽ?ŠÆ2/ÊãÖ‚d™¥ ŽÓUO[ÍF:Aöläý€Ïù8Í4B¬H‰2MÚ¯;¢§1T ad2€C$a‘@ˆ!»ß#ïü?ÞßýÉ™¿nbüuøÔ›æ7âhÐÈ ,¤B(E!ÁJ#-J"Á d_ƒ±Ô°#àqw§£ƒ¼'©ö â™×@Au¾u&t0Eùj ”“Æ¢¢³É½0#Y!žÊû až2­7:(4Žò(] )âRØmqþ9©®&Ä¥°ˆ&&É“íáXï/ps«ÝLQ­Ô\y4ï賜ãÛ­iR,údêh—c"ɬûÚºðw/ûûm_E# úNR“­¸ Œ6XƒÂëÄ$¨5Zy„^ƒÛ|ƒ;y2Í˪2””‘meƒ­Ò‹Ò€LKp @p†q€VL=ÒÕ®<û Ÿ16?ûüo?Ÿûñ|ê=Ñ{Só‡b÷ ?Ç1•m°mµË%Y i„¥ÄÀGÇ5´V\`׈!1ô÷ŠëFQ:`ƒ¢’,F‚ Ôh Ï+¿¨~`E àÁ1V¤ ‘QŸ·9|e’M5˽‡"' ­7Yo¸_ËôšégZ¶ ~±ÒÇH䜜»Òge0¼¥ž’ø¦ú°îXWðΨ µlwGÙœ &<"ŸRÏså¹`\±` ‡€ŠØ«Ð÷ì+cÍîQv" MÄ–Ô ¦Ä¤ÖöŒ0¬”Ui0Rfº'áÙ4o˜ï~m BR ó8L%8k5ÏðîLl tZzéž[D¨ï ìÆØ®gl_£•çX>ü¨Që¼… ?׺µ÷­ÿ`xëñ‹·Øôõ‡ì<è—ñìÆd–æë°QR–Æ<Šnr#(*PˆÐ»F …*qÌÎæHýYyí!œÅ/zÅ"äô) áÁÔ»Ìá˳œÞÞ”3Þx—6pZÎ]»­âÇR@ÈLéþ©²?9ø}ì™:ãûífŒ£\PuÛÅvµ×ÕÊ É ÌF2´šu]ä ïÊZ‚‚TÈ X7ÜAIõ|­@Cƒ=G‹­UÐzæiGËÖ„oeP†4W|K*8¹<Ý fŒ—¶  !i9ƒÛ“<Á‚óG¢ß!ÿ=‚ßÊ /N5«1j«jäC¬™ÿÉíŸØâÂWª§•(køªRû­þ„POÄb”ÿ$îj[©BIéKù'cêÅ_í i†bH«›¾¹mYÉ 3¡%ݾ2µ!RÛË%j¸ë^êöBHWšÚÖb>0E¹p1ùÚëGd:(ï%œ:ôÅe $,µmD›жZÊ HÅ4àF9”¡Y„¯­ GÁR*sâ¿|µ°°.£j°EµU¹:ƒëv»…ÂÅ› qÅá£ûhz ‡ª«¤Ô¬ÜoçÏÝÈ4hõÝýÂóíˆ-8´aß={8|. co©1ïsý™Ÿ;*m¸ßû®£…«´„&£À>ä®L=Wl{•WòôJh@±…°Ë}Î2èg‘ë·È/îÃá¼6kúé•x}Ö_ß§¾¿ÿóÏû}ïõ½†6œåÙÛékÎþsEºo]ƺ}ôøïg¹ua:w ]H¥›#Õl)¹ú‘t¢VÛ`ñ4Ð>2ň¼¥ÑÀ€Vò@/d¾ti_®­Gô_æÊ-Y\TަXv/Ü©Y‰)|&¿DpÙ§…ã«TjûØó>Ëh1*ß$ÝÉ,çmn?ÿLkå–04žmPE¹:(ûK,¤ͪ½+r>$ªØ…1CÕƒŸ?üß~æ³ þÙoó§¯Ï™?ÿco ÏÊûæpîkJFdþ,ù÷ösâë_œ;ï÷úU‘Ñjb÷xÜÌÒ% |¦Hê#¯×¸²Õ è9mÿ]¯Þë¿óŸÜÿê†ÿÈχ§„IäÙÏÙ¸xY# _àgÛÜ¥ó¥-…Ö2ù~ïÝùwÿÉïÿ²µ?Ýôz赺÷¯Ñ¦0@‡mù˜î…Û¯÷w6¯í’‰*¡ýI™rþ9EMeàp w @ &Á`bC¢è 4Ðh´…™Fÿ4 /³Dc¦Œæ<€^9›O"Ö2º“Vy7R!Á=lרGÞô#Î~'C±¡F-£ ¦g”0W`Ám ”> ¸ÌN©­¸{¶G2;‹&Ë÷ š±˜´«$Î&« ÑV-‡µv´"0˜ƒªöô°·û+Ç·¶Ó²Es.Ï„%“ÉÜÜï:Ž“£|¢cT?^ü|ìë›Ö®ß)Ì›¸bø„ÌV·×ß[l—¨Ê7öÑVâáD-ÒèÜEáçèüLá—n¼5ðô¼aq·á§ùU—+(Þ+ÖÐÿ}þ’_­'~±æ¼þ§Õ5¡£ín¿ÊO.M%ù‹éZÙ²‚h9¼Hfr=uˆ6uÿÙo¯ sÒËdûù½ë7î1]qߘd­5U°èfoÜFo~ð`‘¦ÔEeŒšêpñ•S Y\u¨W46³ïO¹žVžçÌ·TTÍ}ýùŸÿÕþ¯ßß{÷»ýÙæé@o V@=(ŒŒæ(Ò:Et n­Ò€)“¦¬CAÑ–¯dMG¼ÐáXd1EdM%*ݽ·þ_ö­ÿ üëiöÈÚ#´ð€HÆ.(<¦uCPÇMœô tŒW™{½—Ìh.‡¬V ºR<_s'(¡aÀ_ÆÙ?ºö‹-h.ð@›y 긖ò8¥×ç°ü™x‹£†8óœàì k’-`N|MK49æß"ä[W¡Ífל\b†í2L‰A,¹*«ÃB@‚ˆŠ ³l@¨«‚%hc;+AYBŸm²Ò™Ì ‰¾ ÂàÕ£I¾Â?…,"BÆ8V¥Ï 0` ˜„´a2*‡E ˆ£nACÑÀ>²2‹¬_@L&´&ÄhkXÂyû2á‚H‚9`r€ôЩ/J@#Rƒj„ „@!¨â+“sÈÇãð‰ºy¿ðÕÞ'Ûʼn²¨œ*~vÓ©+ì°¾þçËô~\×ì¨pÈâWa:زå& ¤ã_Ëÿ\ù—ä¿: Y¾Ø—»ï}êµÔ¹ZôêŽc}üä¤ò¸,6¦8™yÌ’˜P°ƒÐhQ$†,¦é]ÿØç\pÚqÕ ‹€*²ÀIϤA3!,J‘ЪCY$­Ší­óª.•h§ë€ °ÕmMÅEbˆ¯®8D)xðD@Ý‚£·>Â/=8@.«PÕƒWH @ÅH,‡PH4Ò),ÁBÄH”¨†„y‰ETÿi°*$@™b"“@ˆ•±ØÂ`RȈ¬ØP„1Z*‘Ä#¬#àŽôlîcrÀ’á J A8>ÉÒ {ÞiÆ¥tô’±îKâUM[•Űf3ôÍxÖ¢9Ï:;çÞe_Õý¤%ºf0W=Y4ÓT@K,²ûë µ„…¡:cí×Çoþúöƒ—~äRjuŸ¤ÂwçÈW཯dn/ùbøS;Äû½$­P«Sj&b¦÷£h©8´OêøQae{ŠŽé„Í·hÆ™œIÒ½®ÂbQ®a¥|ŠóÍ®/GNÕ³ n“dÏxé|÷Ñ‚gõ[L^Ê™³ŒùXÖËD}Œ¥,߸Øòž§¨åýnÏŒQ¦™õ o'“Ð",€m5]<‚ *uÙBJ˜ 5\­ò0d´ÔZR¸~ƒoéḸãb&µµVä$>F‚^ ?@}ÑAnÝ}H{LÐØb 4rC³í:ÆÆ€0ÊêѶȲÉÚæ8V]eø¬˜:L^^?æ|Æs%EÆ÷η/óXþ¼lÿÇØÃnü"Ågo‚΢١›ˆî=ÁOh€åî2‹|Šõ®^:ý+u··+fpq½&K%]ؾ˜Ï;«€$€Ø„@mMOÖà ØZ2/»îø\zõ> a¾ïºÔAôp Ø,À%+ €#(™ÂxX<׋û·p? åMf:":[9R]3ÃKúRNõf/ƒ‹³.xÅ.ÆË»¯tö“ØÑ6ñûÊ7EƆnceæ^s•~Δ,'Ú­,À$¾['] Ý£„;¹†› jR Æ×ír¼n…#`™Ô›N(<¸ aºÇSIŸÇñ±°gQýR —y•Ež™5c¡}èJX&…#@Ù"¡[CÄ Žë›Þz~ì [sêEII¯Õ´â^È÷$Én`£ÊÝäüÕÓœ5³‰ÛòC²9t`j/Õ2WÓøk¯¼d›ÎŒ‰¥ÎÆàSÛ®¤¸Ùyp+뢧°CŸM?²ë4r Ѳrý‘'ðüí…½§¼Èjk/ò7¥~Ç®¬‡Õ îw?=·‰¥É}ýÕ Œi/fëmu3µJõ´·ÍHéÔ„Áfé=‹îÞlE]É,J^4#FÚ)Lå6|¶æ|[-òAÑl‘T€C2G™ªe² Á4x'£Ð>˜Ò-Éô¤å@¦‡|µ¢nP®ÍOiþ(4Â)×TŽ[H€RAh%€”Z²%—LT¸à$×á’¾Z—ü¡¸LÈj6r== !Þ0Ít |&ÕèM,ŽL%Ó:!Å4®[¶¤D”{ÇO19y;®°aÊ|䯬7/^ø+%mdšê5ûv9„€2á]ùA= 7qã\ôÂíN#މ%n¥„ð …]C™¤©ÓìRÔyxb]C2éΉ®$ÞTÓW’pJR4v‘Ü@—ø˜‚læK¼½CÁ"aC47Ô³¸¸ ëΊ«©­Ec_•ý¼Ø]›ð^Þ,üGó|غ_âx……_{;Á½|žåósÚÝÇË1¬t昃â¬y—rîùÝ€ — 0„9¹mL]²‘Rü#Ý×µ4׿†^{ðùöøõûð¢÷]½—ªå"Q4ÌÕâO¤¯?÷ñvîù½úïœú†?¹íFœ92®*¢ n÷z¯Ò=)Ä_sA* š(‚U ÇÿŒLžÑ˜i‚ýÀªõÛ|•áÎ!œ£ -ÞèÓÝ™V”".+³ã­XW"TP¦ ÔE»(ITЗø‰ï,´’c£ƒsŽuóøf7HüÉ~nšG3˜’¸2Æ,”—p˜Žâ%--y #"OÒ‰%tù󮟜K–-R”¨¤ âî'e3ª­ÔëÇŸwüÜŸûÅÔŸ|YÈÅÈ ZþÖ܇wî—þöï»®ýÇÏÂ8ŸþµŽö þB$žç̃|„ü‹ñ§óù3_ÿ±¾öÖý^ÎÀ-ŸÉáè·ö¿ü©Éó£s½O;€Yÿ˜L6`y*óè{Pr 2ÉA±_w<÷¹.öZüܱ÷l¯.­Ö¿çç¯Q NÙI]#Ú<Ýi2·©'­ìz% 6$+öÿâ:¾Ò3hè„SW[7é<ÜfZWb"„d jsL…¥A‚Ũ¬""T®„6l@©pµ@»ŽêÝ›Å0³‘ÄÍ@9 ž Ùif¢‹x¢­ PÈoM€ Ñ @à0¨]À´RRdpnB´Øä)ã7ß_ué¬(#y¾7+”u¸ã˜Äÿ©Îª®´™""†v'$4œnVà> ÇróH@ç´Çd3Zº4-s˜«Jïâ÷:.AÚÇì 6ÂÙËäC°‚.'ÓUÍ-“¸ÓæäÖ_ã)Þ¸ÿuIH·Ö0lõÈÞ¥»×î à‡d‘ñ Šÿ-Ð*:AJPDʹvÒ#9Ÿí›w³¿j?ªPWGeÃCꥵ¸(ÿNþù9ú~ÿ¾_AV6äWá7Dµ8 xúÅT±ëÿèJ»÷zì›>ç/ýåGw¹3»Ê\›ÑM¡¨ 0E9ä+¿¤ VàŽÎ“ÕU ÓQŽ‘ÛCý t9ùwLˆ·{ÿÄ3^Ùh[“Y ã£Tt1/‚FªšøÖöiߌB)‚Ð;È5 VÇ£ø*1%Lˆo­ÈÂ+(u'uŽkA ÷JÞ¶K'u¾??¦ûpLù%Ë‘>WætDzä`˜Nc®O³•Û¾UŠ)oè«Çp)H]¡"ƒîöä1$Öè#|KXa“µÏe½?*ŸÃ{Cê—mîí¢Ž©F¥S ¶ð`#fZ“t·(^0 ¨ÑC(Ó`‡ªa­×H³EèÞÙèkêAsI8éÍã¢vú1úôîj˜4ˆ$±Q­¯î3· f”œ 7¥Kïî}ú”™Á¡‡Hd‚ÍÕôŒ\ZL.÷«¹«™Š— G–ŒÂt]ËÄþFûýo.D_Ÿïüäà…n'||»Ûû¼ÿï¯Ù~ê;ø'ÕeeÊ/Uô—½‚¶5£àèQÓÀ„=a¼“[®¨ó=˜äÔ$³—± Vm]˱}lìÌÞ|þg_Ùß“ŒoKê¢Ä•6½ª›U)Bñ)‘(ŒBÁ*›{t¡&…(l-­ƒC¯WÎGQÊ©™oþü»›Ÿœâûÿò|“‘*÷þúýÍßçþ_¾óÚß„7òä1$†˜‚@Ê„ZµÊ›38Œ¦¿Í_MÀ@B‹=8–EPaLµhUßþ'ßz?¢©¢¥8N…ª¨Ðˆ!ÂCœ$™M!Ô@'€NZ:ÊHøÊ*)J‰± Ôà-ìjaÔÌYÆÅT5”RÖÿ7zßÌöƒ #ãTº;ë5žï|ìƒ}Õ1‹Ak\pûyí¡w½E˜ëù6Þ/‰ZÚ ë s²è¨Ø5Ô–6$‚Tk1’a††”&l¸NKØQºäFñÓŽDܧ+ 3:袤ŽU»¦#-!kS ½T+‘nCÍ’8.k E3ÔðW,G¨q-uP˜- Dˆàƒ‘S.¬NL( Œ˜`0xðŠ@è)³L9 Z ,’„I±€Q€d¼¤¬û€ÉhHT%§tAz#ÙAƒˆ ÍD -X£.$h¤+„"ÏîKüÕ†½u½ÛǽÏÕ|ÿ[¢!)XÛ#R#TÚjoy\âûyÿÏÿñÅϯ‰MÐÑ 8Ñ9õ°Î (@®$ FAÍ^·°AðT'°ÂJz]aÿÏM¼­—4rC÷ ™Ïå§#îÆá©±CB®éz½¹s›‡,Qì=¿áÛ¿¶ßýß½sz.¯ýM*Jš™*Ú!ÀÓ ˜¢\r[²ƒR\BÔŠå8¹Œç%Añâ6F¥Ybm¡ÚUˆÖéŒGB±Xð€‚§@X°ê¨,@!€zðÁ+´¼z@âT‘IX€€©5…„"(P8`*êAVIôŸPae" šÀ‘91"‡pPk* Q£G™*Š’T§Z·#ÝÆY5ª25?6o'#P‚5¦ßž!=JJµ"Jȃ¸™À^cï›{»žLîÏ,šµÚkû@õH­$ãZ[½3ø¹ž8ë—¿»û;™lÒyŽÚç቞¤îcú9›PÓ3(ZÑUU½c Ú×üÀ¸5H¥‚§…W‰­¸+ê 'ÁÚôÈ-ÆEΞwïŽOÜ ’B0sJšÊ‹Éí!ñ&ÌhìÔfëYGC§t¶n`Ëã¡6 9ØÄãl–Ȩ‚Éëhÿd%ß·"×wÚ—/÷å_Þ1JwTßïûOÎZÿ2Ðç±>6OÏþo+±kãå«sõSý¼N?jæQWز%îe¬õXìtú±vöêþ{_Û£ÑëlÎÝ¿¾q Íúô¯WåoåýïÖð­ŽÌÃw{e·u·`SAwQ#¡æì†XCœguØ™=С}"LbâDG¤(Û¶âcNÆÅê<ôŽÀþfB‚ ³ýH Ô£ˆ9#j¡É°WÐQ£ÇÛìÍ…èóÂD?'øq5Ú{¿\½÷ëÓBÍUígþ¯ïWŠ?áíCûšÉþï¾~÷žñUGg«™6§ó­õ–vewO¼ü¾=‹Oþàà ŸÜþõþçÖì|¼„Ð(3 ¶ƒQÅFÿò¿\T T°2ˆ-TB!‹„VÁ¨uÛlõý2\+©”À¨ Àw@(€%•€–<ækR¤PèñÏ÷»ÉNÛãJ®*DR%.GˆÛêàÅ­h$Ð:IJL"08æÙ¿ÿö—ßïÃF4_]äg² "°o°&È:TJ°Ej´.µ€+ÂÈ“‚@}!î{ÐÜSvPŠœ>}ë"­nµD£…Y0ÒlÅ`È}XeÒDE}Ø)!;žòN·p |/L‡Q(·÷Û‚T*Åe'ü‹>%ãñV'ª }ò\5¬âbzgaÏ…ÅÚkå7ÂØA®n÷u¸˜•;¿5”ÅwØYs¯TÈžA™2º¤Ñ¦ñVÜ:c’ŒRpZ¦pq Kß] øäÎYÇÝMêE;§¾é…æ8º ‰q¦†ã¦÷@»û’0øðßÃþ÷l=Êçˆtææ´m“1Vå4^Ù2Á…¦Ã‹˜ºoGíò‹KSX û¹k×ÅδŠ?“HÕ«²í)yuѺܚÑe0¶M(JÒêÆ³‡xHjîÒ(5¯ºü©RôŠ `…¼"‹N×h¦/Q—2¸Á€ÛŠ|ØÈõ2nå?¨*l¥¯|0$𫌡r¾©º`ª™í¸Qù™¯æ¢ß„ßE#N@0·¼Ub³d%ìK0f™©àÅCBjó Ôƒ:-¸%Š’,Ô\2M&`R·Ï›”U ¦Cºº§‘î^ÎWÀ.ž¥s›x0ÈvxB3ºu PÆ$ÛÕÎÚ-ÃO k»Â9%‡¾ÓÜ£eàmûÃéªh"@XgÛ5\—Á®jΟi.-ë 4h^¤¶oH¥Is:„D\J* ­D5¯À_¼¤òHŸ·b~z.ÛîG­xçöMЧêGî9cû^;Èçµÿ žÏ7þ¿þoö’là fH@C !°I¸áŒ™ *ؽ·¯®û—y0È?,!µó„_ Úâú»®âúß½oW‚}gw²¡­‰«i’=ƒwvk1âz^‘û×v^þ„1®‹må;#Ë4XV.YÎ?ïÅóìó}› …½à3"Á¯¢AÀVìÔéÞñ¤[þ6¹æ¸@slKlé›­kån®´5¨JÓ¡­uÎ/UÞû^g~:#ü¥¯SÛ¡“•<Þ2ÍÀS"«ô`Îf†Ÿn=—£«Ù°`7×—HoÁ (àG{£EZε¶èÉ…Ì¥N#WªÄ¯æ¦ –†ºìbRjÐ|üsÝÏ]|sxÓ[?ÌÕƒ_ÀÅ)ñª:n.{Q»è}×d?«[L—;Îõ€Fn+Â?7ï7h|A•ÿ‘ž_ r¿uÉl¡,`®i¹¥ô§Ø1{_†®×¯ˆN£\ìu” Ѽ³ aŠ’ÎVÙµ»Mys¸@RkñÖVîµÒç¹÷U¼'*ã,CëŸpäéÁÏ“Ëûº›£> ˆQ¢FÖ²#D–yžðEOè%]«{˜tFO{vâ^Ä2ñ¡P=ÀJ4 •POD€Mv @˜ež„\/’¢Ã“Ñ© À2+|vIYÏ%°”j((¨wAÔ¸—5%9+Ô(&€á 0 –<ŽeÎZfŠ=­ÛÙqˆ¯¥µ>12 <”Ïc<3s}ßóD`»œÏâ¿ÿϾfl·È¼úÝökzÞÅfl²«¯í÷ùe©×j;ð“é5¹jNãÔ^ñ ¨ÿ¨;õônt,-Êæ,œlQ@©µ”U\Ëã:ÒP¦;ÀN»3Ðúðì ÊfíhçÓÚ-è3|)k´çŸ8ÙPøÕ‘ô†ÎÈå‚E»5ö&P¸¢m¹j“¯ÐõW¸ 9ÄFÅ’£r€Z„âÎæ[ßé³Yá+X§ëÙDðQ}t–¡›š}t[’oç­<}.kk8ö(çö¥ü+g9HÎ#ºjwÆ[7 €ÿ)êçÅà;Läû¿sþGó”Ñ*.­Ó¥^ÊËÃx{Ê«yâdC¼Ê¬ªwÔîqftørwðÑÏÐ7­ îŠÑÀƒW<Èüê*Y/:¾6o—RAF­®/®|rª“ßQ㌄ú_ïß9å¸U¤SB§]¹“¦¡hX@Ñ a©¶äÏrÅó.«ÐXjúÓ =zÎÙUt–Ívc Ô—Ú€zØý`Z¢”-׋ÿ·pV:¯Mïˆ#¡„ÒáÏK:Pü'ÂVOM;€6ï~ú‚¶§i‘¨*}½æwtw?Î(ßñÅgÏ~&‰jøaÞKÍEËp›é’ºWz.¥ G8ãí¯f?ÒQE)k·{¡/iÑs”Þ>k-c›°Cú!bÑÛCŸ¢Á-Žb¸á*±íÏ7â ½aõœhl£O’ðò|_Ÿ+^C­ÞoóÖv[Ç3á‰DxÅÜSß5ÿ!û\U™†„¼KmõásüþûëÚÏ÷µ_†,鄊¾üÓ«Ÿgÿ~~…=æ±j›O~W7üÛÜô²&{¥$ôpî[»áŒ9°»õ™T¡ ÂKº‚y^bÒC(c#ñî¤.³<Úüó?{ïçÞô¾ä[Tó0½UtM†QöªjfM\Â]ů°&KëèÃêMu_œðä~ïÓŸžÇWT=k”¢)êtÇuxÃKXT ü…¿…•*ȬÐ7YVDa² :‡€è¸Â(\€"Üœçê¼ÿ™oß…ô|SGñ,££}™Òµa@@­¢=~l‘Rça¨²PÓë,ÈVE$ :à‰FˆënXIWù¨ò`4DåXÇ'ÆÀ™§Än÷¬L"Z…ªŽè.ÔA¨vW­ÿó·ýßüåÞŸoûÝIW3v­ŸŒA&¨à‚Qˆ.ÇÝ—{_õí¹au[t•*–*$Ђ.I^>¥¯\/o7˜ Ëcü…ÿ©îJ¾H]ר´À%œåEs£6z®áÜÒuP‚L53€±Ç%â9FÁÐ24SE£ ˆ­VQÒ‘ËAÐçD‚½ÃpÒÀZáp5 €€ÀÊÀÔvÉ` "dˆè0*2 ·tŽžXBäSŒ8«±UC) &Ê"+ƒ$Â;°`7\âF*ÎÏ÷üþ`~upÏáÓ£¾Ov)L32›~» V|Ky )Þ˜¨œ·F_¸§hoüíï-œ/ýò›?ý¹Ç½©ã‹¬±¹ì5W¥‚ †Õ.ËÜ® p–p:íu'ãUÚ¿T9Õ=E¹–gκìºÞpWìž~N{"W¦q¿~û¿éÏðvE×X9n¾î~½c÷ëY߀ #4£Ñ4Y´DÉ€ ’3Ÿ–KЧ,Õ ¸IÌJ{cÀ+¬áòÑ5~UvZÅŠ0èÀ  8EÔ€A(p€" = ) ÁÀ FG½"+l, X$>x€ÑQƒX(Å\Q%V@É£hÅÑb%­€Gš˜6ðKF®€‚\TÙ=ŠhIº¥jº’¢R`5l ü+å§ç¦Ï  fØÃíôP¹åÀ‘¨ àW4'R~&½í§^ÃY™d{šìiŠyMèÁqs}¥Ç‰ãoýæÍôÿö;ï4fÿxph²lã×µ¯™, õÎbAC¾«ðq©lA*„í¤à`zËTT‚k— 0P"€í“ÒÝyä?ÛÛ¿Kè§éyMÏ ÊìŽEŒQ$²Æé-DïïÔz‚íTY´= ˜Óß±îÉ/dÞ®QWŸ5‰´‰¥ë]¿Ÿð:­ùY‹x§¿Ù÷œÖ÷[Œav§t—k=æŸÿÍh}œ%;°kL‡Žhº— j”æÐ^_·¦»¯î"±$ Ö±ÒÛÑ_ë*wFܵö·œ§˜ïV/ÝT½ë)UÑoÔÌé©’Xe¯6$mnAÊ5¤ÂQ@à«C¬`S‚ƺ‹?ÝWÁz]ý¾QŸ/Òn> äH9âí@ÀÜ{Tž=½9p¤,§C-–ô’"ÙêØ£¸áó/ôÜîéxäêÏPþŸÂw—V=òã–ä[séÃdépy TgÞõ°kWiEebz²^œ¦íÞUºfôü†É†_ÿq¨}» û.å{ša7ÇcþþoúåPqùúòÙ¬Šö®ò¥ÚÖí¶)@D†06˜C*òƒ†¤@ð—h6B&A 1"ÈP¹ŸêL¿÷p‰4( @xàV±ý‘S0©´¦‚±}d¾¿Í|ïúœæw²›ýÿê+W_uRÍH¬Ž{úbz;.Q…–ÔÑ•’p *&# Üg¨–ïoÝfzÔ_>7ÜG+Çë ½Œl·ßíÚÓ¡Hêk¼I+\n'^¬úaT¢0Ó5d‹>¸]@2SJoa¯¹ð} ·™™“ûD…“½Öçm¨®Dî][K' Ŷ³Óg¯ø”>ÑWÔ<„£®3´ôZ₞¼®„RÎ /›2Lí ,›¾u!zwvToã†E LÅï3<•GÆ0†ê‚>Œ‰¿’VÜú¢\^‡³h`“´ äDÀ†[nÎH%ñ€ Ë—í[é\戲;…-Ð"-äÐV¥¤Öú§² Žz­€¼3¤=Ó1Õ€A !D¨ Õ?nµ¯ÿ *QÝ™Ò TK,¥UªÙÓZ¼Â—˜þŒ™ ÷l,Ù΢H?Ó ÇâÚu- ÚÀ0¤¦æ42+pJTYÏåæ-øÃ®§dC—æÙúOæê¾"Òçª$žƒ » Z¤ÂD(p[ÕÔ’+÷¡]]§ˆÊQÓ¥Í+õ7Y£(¤£ºÜ^š={‰;äaky£CÞóOÿªœKzý ßðâÕ—Êu0NŽ¥›æŠzÒOì ›GÃK Å4tOàhÃaó8˜Œå^Ù^€~fV.’>ö+Õtí ìø×¿÷>~jAù?†þoæó|äü_ƦíPȸ´Ñ6 A© â«¿õøê®VZ)¸Z }²Ô¿ÕÏÏ7_õÚï|«¿î÷FÙ?ñ²U=*d«v•´Ÿ%²thoÌöŸvJS á!¿Ü6>užçõW䳿¿Î¹Ë¬6zzQÈõÆ?Üéߘ¶ã)r~‘T1;޵º–_áñàŸ“ìTNÆì3_µ®ý(Zj%›¶ðjsÖV+"ÊzúOúòÛþ÷÷£:Ý·_ÿ\õ“‹n­ÝÀO"&w¶Ã*‰uh v 5v4ƒtABJÙßpÿã¯x矿ÿ™‹êݪ~|‹—#Û4´]„2­få\8A[K­Dªd¡j£†zíçÒJ †–û›‹iæ¯îÌõúå—Ñ_û|àÒ’d¤3µÓ:fºœ=Üï åy‚[ç^zg{G{²ÔDÙd]`«Ær :ôBí‹4Ò³‰¹GÚãý‚{T§lX¤rï´bÖŒ ׯ|vÎr6/¯³ÿ0Í¿ó÷þñ»øþÃÆÙa¾Ì_¬‹²ãaÎ{†Ý\4(¤™è—¿ÞÅ è:»’ÀÃÏ1/n\é§Iu¤ÓhMŽ ¨ ’Ît(œ]ÙYkŠ¡·AHœ)¤kØÙã@+§ŠY9íhNïa63-ª=Mq02¥è`­•䬈Vv"@ÏË4á®VEK ÄaÇ"[ølÚÄv^l˜¿ßClÉDf¸³4íNÅ[øœœÞÃþùøÉäæ?üy˜»ù‚­Xá®\‰‹Ò GWÎf¾ OpŸïX…­¯éZJ¬2d$d AˆA0¼5ê@`¸ +”17”– %øOR:ÀT隉ˆŽV’LJŽåx¼à‡Å¬Ðé<’–ÆupzJÓ„EJÐ82)ÊìõÓÉôVÀúæ~[¹HK ¤/ë`-µÎ¿f<©:›Ù§ö¸Þcÿœy˜¼öè²|×´Ýxäl±—H¬¨×jX aŒ‘”d Éš~ˆ¯Á3 pCÚÌí˜îÔ‘,oòñ¥éÛ¿Rô Ã(ƽ=Û{R^v„IŒèŽ·HeÜlÓ+ ÒÈË@dU²– ‡œ•âñãt«aë®ø:Yâönßýª‚Lå9¶~¾ýýóÀ¢Ì\Û¸{9´Ïï–ÒKláÌù4WkÆtóÓ|{÷ó^º‚S«Œ¼uÚå·6z¾oÍÝoqäØXëèµÌf|¹¶¯hGµœÿÿ$ö_}ÔÿûÈŸ?$Àɾz¹âg³ÐjÓjm”œ— sϵú(£¬ä¾4}x8€[s£½­ŠÛ8ІŽsæ¨ò€²·€~Åxˆ‘ÛWjúxÐq‚VUl€S¥ ù\2âÖ룅äçVUc¾×¨<ÀI«Àx;·–ºË­sõÁ‹/Ü];¾}çÊ™…¥D÷¯ã¡ßžãti÷üÖ‰7Ë—úÇù¥þ ØÓòH2¼>œî%“Èò°_í†SeÄ6¶¹ÌL»mfILb´”·C¨B_1^ê!lü/ø @Áš©ŸÖr (­Ïž~=—Z<í¤2ä¡E Ayt])Z€)ÿѯü9Å}æßæ6¬Ù§¯xηûìßß9ï›ù·òò×ñÜÜæù›‡¨ËPh£sÇŽ)B¹T+‚»eŽFð³‡Ä™ÍúðN\®$TÆêv¡+tV[‰¥ CÕK?zÄk©[«l±õ“û,Rµ¯¶ŸO[/7÷=w¶#Öh ñlJz˜’Zƒ­¾§k²-^âºá¢Þ(YÞ¼Y“V²ª.¢2ÈH·,º‡ýñ'†¡¤ 3Ö ‚mÔž†k»j>´¤¶$#ù~Q‚,ã ±ôÿ0ÍjŒé4¦+Án¬<!Œ«„œ©/òªRÃnÖVûGìÑw½M_«ùÈÛfV„{G†L˜¤…Q©êð«W…åš$Іû›%1%¯­­ ª*Ê݆„¦ÏAÅñ¼ËŸ3;%t2®\E:"–Xt×åÍ—+ª A)ÊŠ[J&6l(5àû )›03†'nâŠÕ‚A!ˆ‹9JjŠ`#ZÔçYq0 WtµÁJ©ßêJ ,š¢d p6X¦£¼ÉœÓJïjxÜáØ’6,SN“„zWÔdô=.ð&-Ùª3ÓRHË †¥ƒ³7|éVó‚–9 ÓN¢ ”à+ì…Hneo§]4Þ³tÛÍ‘5ß‹÷¾Ìs>hr<3Ñë9÷Ø^bt”J ‡­ƒl‡Ù3FÇ4w7gOäT˜ÛaGwi¬ÝL3*¸Ö]·ö¸#VÅ ÕŽËÎ~¿¥ã\Ûž<±÷ßšÿÏyæk3ÿ§ÿ—a£‹Rø2kQb¿Ѫ#o¾$B&ƒÎ#§ú÷öîï¬ [ÿ·ùø0”¹_œüPM»ºM·˜›zòu™š0RhŸÎ·`>jVè±÷Ä&}±¯ùN»ìÛIòP¢lt@ÓË2.¸Ûå£úzåÿ“”}ðÌSÌùºygã_}+#ÿ™[/ã0Ѐ¯Öõüuz¹ÛÂrÙþï})-›'µ Ç‚äÝQ¤?têÒ&ö Hð* æ&Ô¶»ÊK-(¯%lž>‰ŠDÝFâ@ÚÖÀ×_[?üþŸõ*ûNàýÒ1™Î@Q‚¬¬.æLá-2×2ÆÊ ÔUçª)I> ßÔP‹\cä=YÁúkŒ¡Øwüg>×§§ïD<¼ž°ñ£[sS….ˆú%Lå÷Ì[gKÿ>‡¯ l¯{òvÈ–Å`i*0(Cy]AÉŠå¹ €ÔªïŸøc”¿ÂÌ9T¦aš·áýòsÏO ›fyRH·«5‹1ºÏk|~žŸwóüöó°Þ·ºa[ÁÑ›ÑíS¿]á=¼#DNB‰Tkƒr?Ëi©Q¢šb!ÎRåg„3Š€ C™A ØÏ/­4@ÑÓ¶Ràl¤—t`qe”ü4Û.µÔ ˜4s´‡1QÛhƒ@"”j:=œéà:¡X1ê• a¡ ˆZÓ6swˆ^¹ª Ulg¹ðùÕþºðá©vίœ×î /nZü>õöŠ;äOÂzÿûÔ‘ÿüžV; ß?ñß[¥ìªÞ;„ÜÔB úU.Å»iy>Ì··‰77¥fI qj.Þf•7ýL“Ü—ƒëÑ%:!Fb”¹qº—‘6·ÇQ¯¬ò7 ýG¼7†ãïtžKpºàj(Y- L|ŒTãLŠ¢Œú©É¨³êmXÕÑ`ïí*ºÞäz—DA=qÅE改Éë+„5Џ ®ˆÈ£K—¶[3ÆËlÂùFèÚæ¥gÛi.™€]}væûÉúZ€çÍùKáSÇÿA/Ÿx}úSN … Ü¿ûÅ}ã–ä6?Épö¹É øËè÷˜A2Ë HCzë äÛØJbôÊ4à š+îã?“Þý¨P`NNÐô¹baMÛ{Þ¿(½~©ßëÑ*‡¤“Šð„¼¥½«d7¤û¾†è§ÇóÙuU¸y}•+£˜$Ï2³®ä‡ÂE ²Ôávè/æ|1Î[Ñw3µ— Ïucn@—jS8]f»Gå²úq¿¶Êñ²-Ìvü10»*Ì 8œt‡áuR¡F ׋„"0qȱE{zSC£—›;m«Ÿ5ÇÀîìÊ´®ñèùÓ+÷ÏQŽÓ½5÷Ýï(DÛ¹ûf„/urñùƒ’âVQЭÁXbɪ`5ú0Y-Üj¹±Ù8Íuòýåq‡ïóšþúýM;ƒÌ7*ë†8" ÍôÇų˜e˜¾[ãÇé²^¦GŒ#,"ھΡ}ÉJ6Ããç®â¥‰«*4LzO‡ öküÞå§®ñ?¡ ßTÿû­ùéæ?Ýè:©7ÃùxAšÏ›Y@@ )(©N£Ê©Må¡ X18ŒB,*ód>£Ú«;”ÂÕPRTxÁ­‚B¶H@nuÎ Ab€,™¡³ÃýÉöCº¾÷bÔ{ØÏûÏç‚’\ú¼ßú¬²ÏW÷#;k‡tWÑ0×Ìt­ÑÚ˜Î;Ÿ/ã‘o1ÆvL«X²>ªú¢£“rÊ¥$ Y¹Lt3ü)¿™ûã!†M´å Í‚±· Ð¢Ÿè´ü¦¹CÈcï©+¬õZ[KQ>š×bŠAYŠVKãfä JžG¶›?²|õ5BÀ-¤j(ƒÓ$É6m:<¬ê Ks|0PŒVAKÖ é¥sî“c9C„250S‡ :SI3ê5©ˆ¼ª0õb¡4 ³DeEÅbÄBÖí¬OË”LÒV× RY¥–ŠXªG¦ªÊ,€f"`fe®)Q,³…R\§½Ã¶ :8ˆë@!œÓfˆZ{%À›<Ò\ëÐ1~×ù}D‰}:,Öv šajMÿƒÿªí·_Ì*¾äîÏ>ƒš!°!ÌTÆ¿ôèýíÿþû˿ÿ–í@¹Œ´Apœ¢T,XX¢ÀØà„õeÃc[rÃLŠw?’/( ÍÇ£c_hvyùš3ñ„½y^í>’¯À×ùxýö©œ{ZR÷´Ð3îËe;.WžP-D)¥³6-À *M $ ˆEÎ:IWÖºL "Sì(§Ç®HèÀ[ÄÒÒ5«Æ".L°xõEVW`P«@êçº2ØÅ~LÆ €0 ›…¤¬i&>vóF÷}ËôN~Ôg{ELIA—š"\Èc ¯þj·žµ£O³"ëTÆ Ð@d" ŒB˜eb °ˆiÁëWH WJÏù\ñ¶iÅXß“8àÒè0(•Uk™Gâ±%ÓA±tе Cˆ”DëòÑÕp¯Õ2ùÐ]E:“¶ªÈƒŠãdÒ^Ð.HÔ)I2Nj]¬ƒ:«G¶Y'ÒœùqõõГv‘m¦û¶¡Ã¿ÜÉ¡×JbM—)„ôÌâ~‚§!D€B¨’"\)ë(Œ+rCzŽÇ÷ü$sÍtŒ6`t:úÊëøÁi*ñ\ö®à•}6Bº•ÕŠ¤*OTEw ±Ò2¨2UF¥ë)R>UÑE\,Çã.¸6Ûf{ÓUf×™=¾å>×öA¡äVC¬×5FOÄnr‘è™é¼ßÕvO=%Þ‹ðšw;³Ý^t;êŸerå/èØLw?>¬Á®9Þ^TE|%´IqæožÇì?îÅÎ?5ò±¯6ë£ó`”¬‘ÚÅByT@f%š{KÒ $éhWKMˆª%Šl.”Õé ôŒ»H«:ik×Rm™‹I¯²ÛS.ð{â¸av•Ù£i6ÑtÚÀµÂV tç„ Öôe‚¥Ê"]éè§^ëzÝ×ùVéè‡^óöÙwããæXý?ïVÌŸ}MôÒ³Ã=ÆþþËÉ÷:°25uç³êÊä à‹"£Ì]Ï­Ž%Ä*J™ZØÕÏ[óÚ(j†ÏSx®â´Æ/ÑÇ\ÄX6" 0‚ØäË¿Ÿ^=>Ð2ß !‚E?…”VPÒÖlÄ qŸbëÓ)íZ,s›‡§íZ*&X§ bÉ­ž\“|ô§/ÅTÞz¿Zšz¶O¯çÕ¼>Õߺ7[}~5«ï“î ;…ÃJeƱD7wÆ[Ÿ×Š K¯¯ 5±Fñ©èQ¡…ûÀ[½BÖu½dÖ²‰ù`16Г¸4ô¼‡êÒ’Ý$/*«-½Àc y`éúJ‰\˹B+)_>º\‡C³ÒWŸë£ÖR·;)cK+wòÆ®‚+š¯=¬WV®\x˜)ê{,15Ï?ín¿“= ”$šR‹(”>#Üð&jƒAƒLçf×1„qQ¶-k¥õ<ú“õ¯ ù 9l>óÊO‚çÑUÕó°X±¡œ’Tf\“{ÏŠs ¾@‘Óô%IÝá“p„”[6…s-—º–pél|â÷ ñp†INv4î,–Q J`d¡¨´ ªYz#ÁPÍ:šä`ÈÝ@©áŠÊ-¹|¥¦±i’´‰˜¾6¤ò6)ÕèP=7Ñ €çÀ‡¤mb°hb•;¬ƦÂB‰h¼\Àfü‹…ÍÛüQ¦BZ ,«H”:|¦6c’â¡Iîf]i}ýžÎ=±ÙC•­¤7ë®Å°XIºœ-`a?9oéó /³¥[°O€#…::ÎÐÙHŒdL‹Ø³vËî!v K'à¶[AË œƒ‡c …gPݾ&Á´Îj3(7! ‚–J8$ØÈiÁÓÎD—ru-D#Ç@A ÛY b¨tˆœ¹A/ÙßúÏWü âOì‹Þªµ¼Ãu[›¾äçé;;?|þëø¹ô'·ï–·suۺˌ0['ƒ}æBºÚ´Úz*?‰ÏòÉ_îÎ"7þšE7=Ïü ½3·»Ú0’6ö~ƒ†‡‘0IÙÏ(KÑ@Æßâ ³t%4ë Ρ¨ß·[ú Üì.?æôŸsÍV³V¯kÅç±Cô‰5 ±þU‹áG§q--ü¹loÚ+9ÒwÆ{Æ{ü¬_*Ý(~µyþB elcÎÄ …ŸôÓ>ÿNwVyß®5œTâí°ŽKwyxå/\ADÿajP=ÖIY ‰ßÁ™@„áyŽcýs}¶6ÛN—j 2*qù‘öY®7uÅH6º0r$a£x=øúÄú(0«çÖl¡|y1 `Íä;¯ñÿþ|ë×àŒ%²j{Ú §âãÔA<¼÷£‰3è—¯—ËQWžžü!õìúC’“Šl¿¿ú+xŠ~Ê!´ñ›³´ó1úÛßÏ6AþÂÛØmd\ÀO‹n°7b{XÍR#DÚîÒÔ=GY‡ß]Ä ^ˆ|5ÿioUQœh¶[sŠàU¹µÙkâ°zžs¬+» ßZÍ…üw9ÖÓ£“v9fÏðA$D³wvMú1±…|ýmWªßÓ£V;|;44ÞeÅ`¡C© N‰ [ŠC[ î€kp/h¾I—¤hK”f×z—z!¤ÑÝ`Kq¶æŽ¶±ù&5j=ÚŸ›Ç rgy“›L€v~·+`¼a<4O3…EÀ`G"œ¡c›ißní A ±§[ïÀŸCEOüô>oß?Øà¯ï>[Çïý«W6ÝË£Õ‘ˆÐÔlÏYƒ£ÿ#$bï&h5ƒÄ41û #Ëø|üÃí9~Hlª=ïËcäa˜ö¬å_¿Ø|ßÅD4‰MÜåú54އ¯ <ÊÈU@ŒOº«ö¬MmPå¬"¨˜2‚dJ@Z‡:3ü \¹ª(:p·¸Ð‰€ ¡ ØRA0 àJWnRtdÅüó37ö±Lx7˜4Z_ £_§hܱç1ïä;4UG)Ž‚ê6,}œ¢‹œÝž8»3< ‡‚ZÑý‘…甜/;yz°C$hP¼öPÿØý¡ëœ)©\Ó¸»Ê+²$×j“ùÇáývÐaͨR ÁRKeÌIYç¡<ÐRs*–”À«@½[tmÛS¡†VHV˜¥¥ªîÜÇ,Çvã„IªE2‹àK.Rƒ³ËŒ\wŽá2·°‚+h)ÀÌ׷̢쒿W`€,çkåÆ5Þµ­Ó+cÑa€MXñ@© €JB` /Èލ€xLžÀ›Ý ·V¦ñ1¡ÈÍ@†šÑéè¬&q% %¡h TÔå„`¢f<g˜€8ê0·ŽX¢)¬ãTÓÎÀòéÄ·ŸÀ6ù$ﺫ±oNKVƱ3ÖßaŸ[lù[¡®¿yòÅ×÷ýЇb˜bVš›«Güú7ÿì¿‚?öï+píD60â*í¡qͼÑ=ÅÙTôbÒ ±àçÝîè-nËZH‰OØgºÕ-¾¹¼ŽGo^:vÇòÙêóùžÇå?óþ•9±Rö´e‡ànÜ{½ËÎGö¶ïäÔ""Zb¨Š AUHèJ—:Ñp„§L_| ˜ïm‹˜·£¬¦¸*7eñˆ#†@pØ•P EXâã/¼ ’‹>¿‹LJúõd‘!.Zl®dƒ6H3Ü_Ÿã_ýuáü2s²Žß½>?/§sòm£1º}mÿñªÕùAP*â}7ï§<ç rEg À¾&“ëСCÊCfpòŽ1?ƒÀ?çø|)áLÔJY³ê·1ãÜÏæ¢¨q Ê@w·×_z®½• €Dà% ~*eIôVpÀàT€“| ñØÏRvd“>Ë»:™¤…Š Âa#Ž€YªÇsôúMUà‘Þ;ædÓ©ÿí¼þjx»ÌFàø¹U¥FÀ#¯„R'~Ü«î¶GxyUË’2ha@WöW˜!’" ø°¯ó•Mß©vºñ¶Ã#Çñ¸kKqëÄH‡ý^x•.µ¦1yc@YûÅBµ ¿:„ d` Šv,ˆžˆ¯¢Ç`×ÌÉI?–ëäa]™”8ÒÃÊOR稳r­:˜bLœ;lÞ­û2³ëv7u"ÄS6FÈFN(dÈéѶs匆 .tÀH{Ñ;ª,¹~ºëW}w¹þjÈS2Ø<ÜÇQL¯¯îE¬ùlVœ~ê6ô«—™;LÀ\j9ï œªëbW`'ÝDØC¨hmX”j±=fDK´bYC$CBXHå s˜…˜ÊŽ¢âÀêlåº=çd¶I7ÙØ 4I%Ò‹}޳ÜR¸pA‡@x3Dâ:GC±/XS9#°#ŠóN +#ùN§Dc[׋¶f%ü¸¢TŠÀ^Œ›Ê±o‰@÷" RŠÖøéµ™Z¬ÁQÜö')³”AÙ“@aK@º„0« ج¢¨¨–Œqn|nಀÑïÝ­U!hÖ³„œä˜~¸jÆþy¿î¨õªýô²z_¤r‰ýpišµwm«!ÚÏPÌÖhýnÑ=ÙÍO èlâgšŒžüáyÚ…õæÜ¿ûÊó«¿¶8ÊÛd8“kƋݹeÙËCo~u³Ð nä—t_³Ï·gTÏ{n¨ïI#”G0AÛh™.ÓØ_-Ô>Ç…¾'´†˜ öý[ûÏÏŸÅ¿œ?\þ›£¬rh–h¿û=}?V©Ô虤Ȋ\QdEu~7„fPÎx‰YvïU_‹n Ÿäù[ö&Y_žôŠWõH…Ÿ“ÆXžÆÎ»w^ßÉzù·—ý'ÄùþmÞÒlÂᨠgŒàD^&?Õsð5üÄä—Ñ ”þáóĵ›{ü—ÞÅwíÃóI0óÄÀ †¶ñ%%Mà†Uæz¨Ý]×zÒµðX€©ñ•-êŒtò4¶"‰å«#Û÷(°#Ñd#…J]zàM©õB;cÜÈ…6²*É%RdŠŒª—Í/©ùÍü¬|ý>òÉ·ä¿3.Yýaš¹˜ìé‘Ñ“.´R·©ñ‚„wbýÆ¢>|;¼ªzú-2B‹2¾Ó¾[—á ~ Ëu"ǸhKQ¯p¨Nu G·e®V7yý€ØtÒó…¼/:‡ÊÎÔ“·@®Ëf˜;7 –ºn¶ëŸ»¬Òå“Ä=“GøúSú=©“$•¨UЍ÷!K‚o¾úì&ÇJ¥#"ÏaÁ  W­½ ñÒÓ°2[û§[ÿ[?ÿÞ æûYÎã¶eÙõr 4",D½ÌìQg3 )P±¢1¨ÚDÝA’Äi0“qé°Æ#©«Z‘Áè$3I‡·ÆÍ¨S/Œ $·':™i‡è0g%ëð9)·—b„AE/ï_Š7•0g]qU,À –Ö.ôºú™çÍú'~}ÿUüœÊ ;ñE›7§Ïke¯¡0¡Þ.—³5æJÚõ ÿÒ³‹žçÀ4߸›¿ªð?™þ5áß\þ³à¸?—Ã1ÁÊû(/ÁÜÈ×äBtw$û¨?:¶NèÃÉ=Rd'‚.p-¶h’BN¯x!6ÐáB?aêóBYíÆ5ÉEb˜Þd!¶Q¢KØñÇ9–ãE•ã—#1ÀáçÉyuƬæYójéæ1…«0ZUËÖe͉b:Ñȸ˜Ýy=Õ>­¶`Š“!ͨ•xÍü/÷á{»¾}ù×Ù·‚HzÈ.í«V#Ø8³ƒË˜uSïg̱|¾W|{擼EkÁ’«Ý•ïµÑç­Bª|§?æ}Æv!uÏ7Äj‚÷aû“Ka(_\g®|ãΩJɔЬܔ$Ks¥Õª\ª…s>xÕÀµðcH%" B W^GɳùŒßl´`Á–åÞ™¼pì…ïä#¡ãÂ?Æ¢XÂxD Ì"}ÌØ˜ßR38™"ƒiMZ ¢üxdlM^p޾Êvíu•ÇÜVoBÔÛôðþ¸aSãÞä¸S«B¢&0&rða*Ð@¨Â¤†(¦ö›møQ4¦€Âm¯–ðãT’?ìU5fXFNælé:›k/Í‘ªÑá´ÈÄÛÔÅG·OÇq:Ѫ–ñ+m[R´‰ $¡þ 0'Å„¤fìsMt#WªÚÈm´û#øI7e[Ú~+á:Û]QšLQ P#i4˜zŒ6°ä…#©ñfê]ž…ÈɇMÿÚ=—_ Êê¸-ÃÏ u!7гhôjÚ˹ë"KTÛz~  ÒµîKrŠÏÉC_(3 zxÌNƒˆnþÚ¿¥ýõ©ßxÈ ÍQõ¨¥ )SÅ6S':ªq«"‹~•Ó*U®è@b% €)W`4"C §`çFJhöIWçª*‡ìîÆ1†¼û5žç•{bgÌŽ=Ë›úZç`f6*GØ"u-vR³Y …ѱGŸ†]S‚­¹®VG,‚ÕÉ‚ˆÚƒÓ‹K£³O$ÇÏph± €1%ÂDÐX^.Íœ­Yùªx;"­(@»îAÖp€’B´@D  HQ ÖäñR¬n—ßÙ™ë>?íl7¤‰½0£rûLæÈAMK„:®cbL ¡Rô%0+½’9m6¶–}òØÈŒ´$esâ¶t€ÝY÷ýžŸî½:Yžá&^™ m°Œgò‰ñ¤ž©ï5À.õÌ5ŸÑÑ*“WIcœ³ÎUÜü~wÜŸŒ×ÇiUÙ([E&£¡Ÿ™}hÑD¼j¥úœlþš[.uÙdË5Úm¹Îd÷D¾<ð>÷iÝ}rÿð>·œïðÑìQ4Ʀ̲‘#L“9b0ˆ˜ÜtÌd™JS ! M r°i²‡è¥¢¸*û¢K>fãÜûÆô«y¿¶ ¶€êŽÜøb) 8EQ5 õ®7¼íùÙ gtP,©¶AP¾‡þË ·}=ÿòNú+äÜß“ÞÍ>Ljœç¿ÍÓ»ÿü{ö÷IÎv–¸öÉM~ßS]wÌ·£¿ÿ¨û:œ?œsÚü=>éðzØç»]»k–ùÖˆ¬„—ã§žIîe6æ¤9¦·KÏcºÄe•û¿Ü¿Ëî/¼\lvšò¾ž÷ÊΗ¿öúqŸÊv1 cÎ-%\È•@Ø ¸¦´XÇ1Œh‡¹ôe‹.b7ƒÂÊi£æ†.ðmÀ+yC^in‡h:;Újen»:–Ì]©FÉÊxgÝ>˜¤Í Òðš’É mŠ®Q ¦²^ݰq¯@€·d84ØU¦`_¾ß?ZýL4q ùàÚ¸ùfùÛá4B3ƒn …`zH˜a—ÇÄpŸŠ :žÁÈÎœÊ JÙðEk"<î%{nË=-tØM}ÙøhÆ­«ÿ£8óü£}‰t†/Ú?D5:ÈûãÜ'¼<²“O…D“¬¶ u¬ˆÔ~>ÇëǧÔú“iÂc®=äA»1 ѦöT¦"(áÖ§3ózD'–öï—!ãûêyœ¥»À'ZßÝoƒëÓˆ’ñrMÚ€¡avœ:¡àˆHA•'dd–@5Ÿi‰-küpO<ÔÍÔÃcÚ²öànÆW°Øòs¼c•5ýSÓQ@‹8åÓîºÍ;-w?ß§÷ã‡ò¼ð¬…¼>MýÞú.¼ô—ö™uÌy¿sø%ÖØÃ ¢l‡hT¦~…üö½ €o Œ NѤNǹ9Œõ¨¯/AmGìDVóLîy’œ®K¿ÜÉ"ž³®$+ÏF*óìëCŠæ}ê¸Üȵ3®_5<û(‚‡4øKS€PÝ„aÓãùY_èëïÿ½'çóàN„ˆ6lÃy²  Zãj «)ð¢XŒ7Xï3jR«¬r°¡2TßÏ éC2-R¯Ñ½Êm˜ÏEGQ’=©Ôæ%½œ/w (ÿMZ!º‡·¬Y«û¸»+¹èn;鬊¬Ú14ÑŽ ìL€‘·ë…Ç“è> Ð)^„&Ń¥©¬Õ£ë-äîh«y6µæw#®”°[ªªnú—õ6:r_Œóº|7ÓPK®%ÚZTD,P)SÊŠª‡éʉp?nU¾H*åXŽ2í8¡ìMLfe> §™§@ûΚÇð€ †$!HÖ>“TW*ÑoÛE[Ì R\ vuˆG²3³ï%ŸÆ«&€Ni)%0¨B?W ãÞäÐþž±L³`·êu÷X=G.¨”ÉŒ–¶˜Ö›‡å]íáh€J‰²mìBÊüà#Ù™¨5¯óVn3ì§áëS÷Ûy2/%BÍJŠä:¹Ïâ—N~~*‹ˆÜ_Á¸¹³ù©³¼–¯ÿÆ{ÙJ"G€`°µæù÷‚–¸­xÏ‘– ñÛó±é_˜û·zì|–#I³8¸4*mÙ´2ucv»ciãZ"|é„å ¡nWÝÇöZTu¤¦þʾý]çœñNC>ଂ/ÏrB"fc^µ–8?>‰JÿÎï£s«%«õ½äªdö3UpgÉDë!g:£Ÿ’š-‡Þrî^xðÊ•Cœ=¤Ÿµ;‹N®ïâýÁ.)Œ{ÚÇ!CÐêÕp$BeV‹W`Ø–ËäÉσM4ÉsÈ™9 z°õð6¸žÎ…²!¬Añ‹Ôbr`Mã7Ñ"0M’é.¯:[„å "ÚZ¹ÚÈÝ"gùøûtÚÞØ>?âä̪ý4øëÉõÜÐ9A˪ö$b­Ì$ö UŠp­£¿…ßš/@Üõëõ|7 qYñÒ~‘åöuÖ_G³…)!ùh”NaKÂóDŽ|Âû¯wyµùœoñEøºôÎ|}hÞʲ}l˜¸þ;`»&M`Œ¦°µ.|tP\KJ ±U™+ŒP†Þ.Wt¥|÷‹D-_ž~nÕ´¥§kÊ?Wæ¬"ªXÓr*D‚zÀ-ãû®ÿú¹ïqÔ3Jõ¬„*ÕDcEÐA£J¨p¹Jfîi0óÁt‰G'w bÏÊÓc€ )ñF#ÃU  Ñ,Ô]µ#5ØZd +’¤&PT cBIj &vb!ì ‡Œ>sÃu§j€†7/Í ÿ|Ù¿s¿ÐçÄ-ñ̽x'Ñ\G6CâÀÑí²Íÿ•{c†Í5¾çsì×Ç—¯neFvÅŒ¯ GZý[†ÿGÙÿs³µù‹Ó.«¯Ý­<óŸOG-o`|<_©2—¾Ä… iÉH¿Ñ[‚”Ìf&$}3‹éÑìëÕ݈f\ýúR¦óµ³îÅ=¹HvéOþW°LÆæ-⛳gv’[S3{"B®Žæ8~4†LŽ8&¤½¢±ÖFÉz!ªå•Xú’„¤ËÄ‹µ~·à°^Ö¼Ÿøýã%±²¢RL…¨x?ÚÔ7ñnZœr,ŽD[ñ96Å*¡ßí™k®ŸjŒ©÷w¯«/¨ü¾Fõ^nk¡ÄŒ³`žu~_Þ®%ã¶ýå°ÃJ¹ãœÐY>s½ùÅ'Öã¾Á_pRíóO†¿¸Hor¢pîʃkŧ6ìh}8Î^zXj8êih膅;–I–’WloZ¡» –$ëiëÜDÅðôu·æx`;â°B:“QŽÐÎuz»îli7öúå°{¦Ö(—j±5ZC¢×“aø$ÎéèrÛãe¼XYŽwSzc0Û”§îš1 4#WSc¤…À«Zù:›E1¥h˜£x¨—£lî»NR™ƒ"Yì+¦•]Üø´òDH> –ê[[çËó>ú³9“eÂä<(ë«\ŸéZ¢*íg¨¥Z®!>Z¸²ØôIÒ‰TžÜxxv¢æW˜(¨ùHšÔãöSO¯q?ھܞìÇ—éû×vw„ŒiF¥NHèÔbý¸`KÖ£!=$“‰å2Ñ1_K,åju?f€pÒ·Ue©;Kw¹:åßnÞ¾öQ~ »ê%“]²JG~Ë]ÿ:6EZªªÉ7üÝ{~ØýË'þê¦t,ƒ[CFóØ)±ÐBRŸÉ“:¶A\r¾ß4_ꆉœtROúŠ*+2ˆT€ G<$úL É9èm{æÏ¾÷[sáE÷£ñÃì}~“ŸIšë9«A©ãT$JkB ±A–p¢&õ…RÁ˜¨´mo¹!’™$ŸÖWLÈ'ѱEV´Œ €„Räôp¹—¸d­…š×ïvŸ0˜*ùfÏÕ2Ýtâäаz:ŽÙÒζžG©ª Œ[+ŠèÁ ¹}¥ð u*d5¢:91’P)$†µY d½P¾ª ô2˜¨î0I@E2U0RLZfE×&w¾3m<Ž´D·\üüø©ßæûëöë¢fأǵD»R¥ÎòC@a¥…dðâR¥# (¬˜d*=’wÇ»Et*3BE/t¢? ß¡½%®37 f¨B „‘€.­ã°8ó,u%žœvß¼I™f²€þFÒDdO7ç‰×¿«ÇK²JШ£ÞF¢‹$:€œBÏmiœåßϘùá<‹}«¼Äå$Š*'ºÎû ø‘{ße•Z(ÅÀ “-# ”0“)n´¸Ò¿pî úòóìmbAœÌruT|ù]öºö5î–Ë'ÌÏÒ/êÔzÔÞ ‹.t;OIyuÜ.Ĉ‡äÕ;ó ^;$$tíX’À£µ‚F€Êktà rxÈö€:Ë“9#ÊÈÛ[ÔDÝ—ë@@ÚvÜÆu,E–¤Î"!Õªè¼5czïMŸúrË2ˆãFûùûùs~~}9nï€ÃWï|jæûþ]ùTžÓÔ¯o%¿h¿á2ºnSÝ"Æ^÷2¹È<,ýø7þ÷¦ýr%ŒÔÓ˜Eò4}\×9Α:Í÷©äqs‰ÐÞDdÇoÍó=Þ¦ºþÚ@½3„ñ µÎ$GÌªßØzý†ÿæ¿:¿’óˆ’\Ãy ïN€—ÉYáZ·ºF5È@¹à1®ÚR°¦ ™.…ÂÀ:Æ&%’|å㨨Q= S—Ú™f ÌýÉPËqÁ°·šÍfÂ:oCSÆvÚL³fœÓ¾§NS¦u£­ÈP§P*ÖL”Ã5Œ  á4€¸×lÄGr¯ˆÀVy£ Áùð×а]YÆ“¿}$¢´‘׺€2¦‡Šîg~uÉùð¼}ÙGM± ŽkOü-Û°«Ë£e”ŸÛ?ŸíYF?Ñ’·ÒݦŠÍFìp©¼:([ï¡Ûïè*Â%"9X¨é™ ’è„FÚŠ²›å1«Þž±K¾ÁñC¹§Ô4¼€êöôEñøwùçˆ2+Ñ…]ýÐy÷ý¸²3–1uòÐúÆóöëÎmÖîÖ®þÉžý ŸúÊqòÄ›ör¬M¡¦š**ÈüsIŒ·¾J%Fa 4­jRÛEˆ#‡!¿ZÔ]‚âþT&8÷L‰Ã-?þ¤¥sߟGZ§¦ÍMÞÆyuz±f™c÷·ë>¯×P ²‡LüÅ&Ò•Vê^˜ºú²3Ÿçæµ98ÀÍH‘ÕŽå›Ü´P(EZleªƒeŒŠ\FÕÞf݉7ùšwÓ Ýx”†*…ܧ„JÞZHªdÊ[N‡Sä,÷‹oRM®=@@vᭊ­Bø¶xråþ4Ct»ˆoø#¶…ëN®íÍ‚ÙMC؉ŒVé è°éŠËdxòn!†Ø„5yp§¸Èk/Vkõ!XçKöרèU¹Bh-pKtE–nGÇoG!76TA}ÞãÉ:ílákôÔö -`Ë-#;äƒHí¶(`{±°Zm#™Àî¢~ÈÊÐÁ>„§ÜLwž|:˜c;I@ŠÀYûÜÉr.$B1%ý¸ÆYæµ^¥á|ÈO]0bwSMY3y³÷ð`!Fó YTð<þ&ððý-´¨n:ha=A¥ ÐŒØ;Žúl:„²z;µ‡§sêQ?‡ "÷ƒ«Ma6º®ë¤Ð-šCO|7d?\|Ðçß Î2ïAv‹•#ÐŽ®Ä•¾obŽíÓÁQkZߢ»™«öQ( ³&õE¼GÀ:êD’faWáÕÃå/௟§{g>{͇§?æä`Ùû¸ýBT6­=:lƒ7&3L¬ŽK#¦1ÀeÞuÕ××w¯]ÅLûNR$逯M/|¾Æ¥«°štÍJ¢>cÑ”»Ö„Jƒ^$ð,Õá°c‰4ïØ@}¥¶aM¬M]t¯¨Oà>ø¼ õ·5f6B¹¿EË®ÃvB›`ge•e —Œ±Ó´$ŠŽp‹éª²úfeßE$;Iîx†Å‘}KnÊGŒ4Šž#™ÜvÚ)V;·„"…Ç šÇûŒCêºZ2•/ªÌ^[á$ª¢áw`’5c«¾}+ÍØÏzI°gÛ¹„…»"BXÆ6ùŒ*®YÛ‘”€¬$  jAX¢Kéuv_"¤V…™ÖL6]àˆ)D,MK}"šc¸¶Ô§ùä4Q£R %¬`8EVP­b•i,£YËlCˆflä½é«#J4󌘴H@>ú뢛G¯SêA¤Cõ>;U×Äü»v% c Ÿ&H`n:7Ù×T;™Ê“}š'ïû§gºw_˜…³zŒ‹:úà[ߌ~¦OÀ¥ÜD Ò‘í™’ùRÞ¾–·Zûo÷ü¦»–F»¯Íê!yWÔMNÐ7½oU…„éq¬™‡Úo2¿œ h·»ÖTØ3/š“¶ DÔÄ2î  îÒ£AÛ£¶ïÀ¾2eNjõ ß“ï,5]ŽR¾,sK@‡]•®²X}c½]\aŠW3ÝoÚ;òìrFkaqñ»ê›¹·GÞ~L-<¢ƒör·¼//B‚d‰k4v´6vãLWýV{îÞV](J–ÐVo.¢£O4ŸgúÑáôá:¶ ñQÅÀJNÈ¡†Mú>ÂíÓM¶WŽ’š £cmvµ|=·ZáP1S˜3Wƒ$ÛàÅÂ/mÞ÷û²÷¯þüö…ëä£Þ"mŠ8&DÙfÌZ–žÂ𢆾z퀍 AŸ,ů"€A_'AÚoÖfJlEwå­Ž„7 ·­óÒoûЈ ÁßnîßO!õ“êSµŽ"gËׇüìúiø`Rg!2TÎxU8\Bª<cÖ®M™˜ŠÁoîÝ"$Ud‘«EZT¬*4e:Ò¡UN>\"i°¨!*.² Rª¤Š…l®ÅwÓ]ø«(½ú£=šÀIjªQËz”ö²‚WœAZP\¶`¢0fAÃs‹Ïi+;¿¦/ëÛ†›i¬uà‡4×ÏÛý+Qbt¡þ«þbþkµ†¿šä@Ä@'ƒXpJ…4S¤ˆ .ì¼Ýá[+:™¬á:ƒ°ÅÿƒÞ‡¿T?À ÉxÿN|À?±ÏhÂѤÁ fÌZƒÆÑ®в›3 á‰'ïÏý—3:Ã3íä!³ÓTG7Y¥µ‚B°ÈöáíÂïŸM¿òü"î n.æQâ~cxqßóÙh2˜$5Nöékôöz[¡– ,2C€( v˜ &épñ¯cåÔæýíýñP ¥ P€PñzÆý9—w3÷×õî)vÜ瞯g*ìðc}~ˆl5`å\Ó³“«Ë'åcÎÛýýÇÞÇö›~oä>4 Šø!‡h f¤Ø ›5ŸâQ|²P¥Jtvé9lmÅŒìiˆ«¾‚ÀBYŸà 9¤ÞE÷W_ú¨ïf2²cnÆ÷—æ_ýLþñÔg´A ŠPâfƒE_{©§zÒ*¶z“NžJé="3æ†JMë~޵òÔi-¡9$igÁCQÆT²O"©ÒKiâÖ6tG¾¶ôxã]9LáÁ¹‚…ˆv¸•‡MìÜlðcÆs‰—Þ…ê÷^?ÿodnât—JNÙ;‹Àëî:&é͵Œ&åOFWÁ‡`œ”¬ÐmÕ£D¡ŸJßÜZ«¬4Ýn¥eÖ¬4v’Öû:ïñn×½ËußTe°ìc{<*Þ+?äeºi—ú8höCZô@u5Þ‚@Ím G~[,êWùâû8@¨NGX~X>8nÏ9Z_'?,céÝHV<àhé†èˆËì 6 ;…(¥âFèëòyÝï¾éË«¡KJ£ˆEÔ‚]”ZB€S ŸZAgØ.aÅÏl³46Òßeª”ë;Ú$¬é[vR9õù|9ŸlÏþóŒûóy¼%ºH>|ÔJ™‰Ó?nŽYäîl L2œÉö!]ë {é;hh<1#YÜD‚Dd(EBòA)Ò Ú’£gMS7Ë=¤­Ù)•Ò>ô\bêë(,ºÚ„TVBqMdhî‰Àî+nÃ/U‚"%TÛú¤h*\BÜcŽÐdnF½ð>×Ò=Ó¥B¥ì KµànF,Ó^\bw'H/Á g+rîQ_ ¡aê‘„û»tGØ kÇ›ì“ml92TäÔr«çÊŽ~ýÀß·Èn¼uc‡äWíäj˜*½.ºw}¦ºp/˜Âº€të`EtàÝ×ÕøôÕ{N¸éÉ×¹§j¡Ô÷*mÄXBI0'oÒe•Îv$Mx¤,X"¬m—òP™‘ÛÓIb$á€÷ZIc#d<@–üuÑžÙ!?Þ¸³¡†¥lÃPôÄFapo÷WF’â ­ú¨IzNÙ®L"mE‡LÔ|¥¨"¢1e(E›Ïì~È%¬p©.!°_­¿Ç3ó ßrÃ|_­1A„qÁi‘f!NTáNÙ©y^Vw,†FÏ­ŒÏ“§ÿrÇ2ÿ8ç5ë;ì}¯Ò«Œ9L¾L¿g´“5ˆòÐeT"G¡ämÚnu^Àò'õ$ËV÷xsxUÕÉ®/367ãðaËiY²¸Òd°;Gímx3¢•3‡öøzHâE±©H7çõÊ+ëŠÈ0 ò†æ¼ ­$-B´§^™.nœ)¹f&â%jr?&Óg(wêß•L¿7µôªpõ‘à|+[·!ÜEz`êFœòFëÚ/`PvÃ6äj.wtzÍIûŠZOªhœè}ìþz’LUw‰·l~õœó!aíç•,»»uWàÜ¢½!}?˜ûáŠ?çîm°#¡–׬µ{A;v­IGs€•HjÝqTfªuSÝZ¥næEÈ_‘~zß™Nñoî©3$”ö³*Ó™„?ÐTZ„!ƒêâj­â =(*µûhdÚv[ꀚ’Õ¦ æiݾ0-†Irv-²2qÎ$âhoøþýÍS«E&Õ(&vGÛgJ˜¤_ϾMZü…7·íí}<—ò(XbQëyYdgÝϸ Žˆ(ø\Ó©’¤›dµºÉDª¤P³vÑFHØnê§?ÊXÂðÊ–m W—’è‘éìáÖÚÕÈá<óHy—8€=É´ô&å¬eK$ØÆVù :Ue1L*RQÕ‚rhfÉH8"SiUÉ;‰¤Ì!‡$eqr©»žTmÀ Îjcx~ÐÇt×ò´ø9Äzßü¼;‘ aí$(müÐ8±2‚ÁI«Ôå‹1om£xVyq@Õ L5ÛÞЖ5²ƒÓî5-ò±¸œ; ?pl%,+ÊŒ<‘#1]ÍŒûñ^«EíVö†SFÁ¬#ÝjŽÈŽvïë…ú™!£ÒÈeÊh®¶þ+ù¯›¶٠ʚěëk}Ð?‘p‹E<Fg§q¹ L±WR1$ 5“>¿ÉÏíš|6$Ú œÜD?¿ékÆ\uú¾ü×ts 2p†¿Š“ÿš~I Ö­xÈÒA™,DÁ"àÁ‡NK,=£ htÄSR"b©þ÷ hoÒå| -cKÀ•“Q@ROFÛ:AƱʵ`È1–ôè7P&äÓûßÌÜX’Ñíù<²ßÇ}hâ~nT-+H©•©#&’­ª~Ûîùž¡$ä‘Ë1«ãã<Ÿ€3‰fÊ€ÝÙ® ™ÑxÂÀ`0ŽÖx3@€¶ht‡lDd”VgA¦JuDÐL÷Ø<ë;ŸÚêà·{†ë xz«ÍfçýËk¹m6Ç=RP#ÏnÞpÞë|зWïËÜiGZÌ v„h*Èp%%É*–,Ü ¦<úœF+ÛU6aY¸É«èª6B^LìÄsÁ ÿ}£)œdÌæpÀïlÞgÉOr÷kg™ÿ©ó…ýóoœß07ZеoªÙž=-´3p [<ïnšÞ‹wy®édºFª‡gŸa |îò\˜œû|ý}RÜäjÞgBJÀÑĉ c3s ‰‹Õ­,G“U‰€6Š¢Iá“ù jéÜõ^JéÖ°—D^'©Šs»úz½ÙΙ¾‚<†ZB\tTP£2t-¨Ö{Mîë?Í3×™B¶r¨Ð1Šüfº†–NïìŽ]568'CìZÊèzÒmÖãÍÏ÷ü>tÃ^íÈ‹æ¢Bé·í: u(êÂt« Ëý>àIá7!é ÝmW¬ i@ °1ˆÃ~)S¯ ™š?¸Œ!º¯3»=ÔÛ #<ÈÊû’Í®sw¦’ã´ø.i&(,Öb“ 5(ˆO,ábvDá8F\%Æ æiß>—sùèÈï~3‡k^µZ=¾y¾þ¿‡\×ûÿf¬›X |ó±ŽÜÖ·òÏÎà8‘µßX/‡ö€4xHiyúp†ÚA(Üè†ü…^åYZŒha nJ£’2’Ð*5ñ€ÆÇÊøŽi+¯)ݪ¢Aˆ¢dCÚ'æe1#J"Ã#A a¨Kmr—œëºØW­3‘ˆ íJÙ1=ÊêQï˜À~Ot$êó¾ÿ`yÌ3}»+õ•¹%ôxê{¿½ÑïÃðµçÛKÜ׎QÎ-íysE†.!B…’¤àäïÓçù9v>½¥ª’(E¦ŒR5þ+qá ?<‡C{±ÿÎî%ÒJ.ïñ ®ïÔ²_œkP¿Ýòâ}N4ˆ˜ÇY–Ø·Ëöëïè§s×&V’ífÂg`jt¶h5Eüorr7ùúe!¿\èOßoùûwÌ>—’³î£¾ôF7Aιù)§QlÔÂäaãNJKà…ÌB$*}ÓU¡¾JÄÚ­¸’´e Âv⪯(‘t¯ôLŸƒH ¶–ãTÜ»Wf©FRcÙ8›q=±}úò‹û«?̧åZƒ ù˜=²Rc-/Œ3Î8vÃthífk±±Ûjà)¿õý’’L‹ÓÐ{Te ýTª‘âªù›?]Íï„ÿ ÖKý×Ð?1¯zðT/įƒ$y§ÓŸŽ/1o@§(êK´»»‹ VˆÛpÉ…M¶û Z­ !GnÂ'é1t­Dö¼ÞBú(\y𨢋¢‘"Åë±8Ý¢y€ 4. Íôt­M-UÑIâY­³áŽMÁÐvV•‚ÊñË«„ã>šŸÈ­n™Åމhm7 =$³gÔÕ'Ó ¤T€§y•P‡;ï~¯ðY‹N:®B?]›mV˜…Qä…Ê”¦ h˜ ªˆÝÞ¸\èæê¦€{£Äv)•2ª¨[<.Fðèáîkú>“†±ÏŒ–žÐ#ŒT"dròq÷›¬¨êòš:¨PœWÓƒr›QîV6Ð@=E˜îóy'JB‘ä2¿X*¬l(3Rb«¹ðÅŠž:î8§›© ÝEÓƒ›}K¹Ž›NV “² iälÍ‹úðVþ#Àžä¿t÷ãeÖòÖ/·D÷2ò@ŒvñfmpÓµclcPFŽ—CQÊßU­Þá—Í4ªÂ/Ø1ä·û*•ÂõŽ;»‰ý)1¤%–hU#D¤V?³8Ží}S- +ZëÅbóÈ,ô¨Â½û÷$NL«F_nÄFçµÏÖk½r?éŒ,·¶‘Ø7îØI)ÐT†‹°'Û·“”,tö»fa°ä¥w»—í” j—þ™îðþ×soþ^ºÅdÀdÁ˜Q‡NJ&m‰Ä<¹¢¢}}¹:ãDê¸9çöï3x¾ŠTþ9å¼së£ç`×dCÆ&ÅmØÏí:QÍÔ&:4±†mÓ.´ººw‹±GjnÛYÕu·ZqúŽà4±B¥Ò”VÈÁP–#Â8äPº£e)F‘™:µ`Å ÀO€÷£~úÝóî{,ÓRg©ZêÎÊ]{¤w¸'$\!‰°ž—ºÂb—¤2jLÃÔXª³Ðª@s¢RÄ©AY«H-a¼z×(1Sñ’­Ü²lDë2Åè÷dµ37#Òƒ®Úëõó|æñ´âº£Í8 ² F×Ò,+CPé§üLô=F ‹Y?Ò3j;×Sæ¸gÏÕÛî·\ÆÈ=˜ u®6Ý‘­Ê¢z¢ t0ȱ4˜$Pc<­òæÝŽ×ÙêÛ/½Æ’·óÊV@z| r:fTl3.S¨äR4'L¯…@›XÃ&“@ÐËVŠ„Jj©‚Ò¨´@¨iºLŸYB˜ú˜%NÃ&^Ú•¢¦ZãŠW;¤fù€+ó¶¶X9+`¡£m(‚oÉ ‡pö‹®gã£;½a>K(Í5¿Ïû¾ŽOlN m\Àµ·ÁêÍ’Ù“áõÒ!bžô·¤‚œ~a¤óKÚ.›ñÇÙà{sç,;Ë9P‘÷ º î¹çœ<‹Ò~KdCˆOº¯ý:ñØÅ•1€‚z´Çc®ªf+¥ F§d޶ F¨Â<È ®áò"Lÿ °pKWj'©ù¶~ôwà^ûþLøÆù ‘Ñ Kýa„…š©Í&Ôo# †B5m¦qåëAa~K.\NGaY/g—¢UÕhX„jh •=2ùø£ÒS,cå÷É·dÇûö±À9€kéYŒ®Ú:#¢{Ÿ®»½‡û X¦š@u 䈽æ…ð$ (Vån) ’˜s|¨EQXäã1¥oÓB_Ó¼DjL$†+ô† æÈ‡¾5a£íçŒ2>Á½›.ÒoyjÇkXCìIí=9Ò› ¡3þíÑ—n¼7¬²ûÒ1 uÉe”Z˜TÕ,+Æ ””=é1ø5¡·Û¾µt}’¹í·46,#}~ŽL®0oqæν—ïÚ”ºEft£ð»aî•Ý¡[‡çü^'}Ö3æÓG”=LïD6ç“g¿f»ÄCLB !»ë‡§ƒÙîéêR­ëßócaÒ{ —År;qʇU¬Evôë€*(òè4„ÔaÁè?&#Õ­=&Óo«KŒÃ‘u0—G±?¬~£ûS U\Õ*G—k]ºJC†ñóõÎó€<yn¯9ŒüLìÀ­É왥|´üåÿþŠù{dðúL¿ú„Ž– N™ˆ¨•®ReYi¤@É!™¹OÿÜÕêû\¹ølô¶Ó;E:8“C]1PT¹>[*Ž ŠRDÁC¢Bç&æ(k0ÑJ€r1´‘®® H–c!.èmhOy]k4nêöî½>Î<Ü¥\ÎäUiä n”èå;»ì\óÈ#Â:sv0´ I(`Ù@! ¤fJ°Å²„b‘Š…U©@ P$¦¯ Ùm¥#| ´#¡ºŠËvhäݽÿ€ýOOq£ì>wÏ7ÏÞä}ÔûYøý¯xI'?žŒç»áõ|NÝþ¶»{t‘f”jKÓÁðÙU>x¿£……ëžØàD—'kZ’óì‹Tae rŸÁ´¥IY¢$Ù`€N"á¨m§×ëæÙÄ”·51N¢ Š"DÁIâ|4”eW-CøPÊi#–O÷‰Ý[{ƒn¾”‘]‚•ZÄÊ ÇB„^L§¹x¿ù«\SèF*¢AU âÒ©H#o 6¢ºÖZlG˜qÿÉ„>’ç'Ï~Âóyüýš›&Ç=f¨sLq핽ßMK\©žÎkÙ6¦-í EÂb`!ÄP Ï®d»uj0GXÃ,Á‡X”Vös¦³£ûÔi(ëZ!4Yg->ˆJZûzY ´.Rm(Õ£JH€\ ¸šLä•{YxqI—•ÞJ@ˆahl@nøÆ+·}|ú|æà µ;Þï‡Ð½©é4òÉíƒó0m:#Õ,¢ €]¢·ìlj'u$Ùþص?„ûC$˜¡Y¢pgr¸:ÌO<|&Ï[“›z]ãIÊËŒ@a¨] 0î¢Fï5ãÊtÆ®¨cßÅ Snî6jk¹c›à‡U¡Ï–®ê`Eq¤ÐüC`ׇv½Õ:pïW·rµßº>¸yº·…ïY;~jªRß••Źí ã— €Ý«QQ|ð ÓÌ7á ¿nV6*T`V‹ÐAT@pÆ¿KB‘cM\GgÏÖ‰š•q|[úKüöÞºöË+ÇíÌÕXé)µöø…ZûÕ;Rá‚DÕlÃÏP üŽ«BÙ®yM½þžÙ¿3Óß×üOVùt<(iç†SÇmßœCæ.NÙqÚ•2aG^º„“qi”V#ð‚•oew]ÇÁŠ~Q:a‚D(Ìmݾ£Òr&«Œ«öUé ¥4•Eâî™Û ²{ÿHÉ©j}ÂöWÙl>…¨­MÖn<ì grá,÷À¸·³¼À§©E.zÏ »ö&pιi <“lbÔ¾ï»Þ$\ØÓ´Ò´äáO!§’šüMùÄÏ@¥$#qe½‰*õžÂéM}3+zTVã…Ñ ¡6ëØ–^!ŸÇŽê”–ïž3zP¨Ih'!²àny+f’mŸÀ³%¾tpФ<ì´2+‚Ê®è螈‚X-–eEŸÐ4öah/ÒwW®3,Œr¯úà4 N‰ lGL'«Óäpòùï?çä\r>M•¨nåmUãÖi<“fGOoëÝ|,ça¼37f`ø˜q£iS>–êr¬[i;FM¢À°ón6b³ÊTḬŠÂ§¹T™$qi«¨<ÞŽoŒŒU(TÛÉ`úýžˆ ’¥¶(@ú™9$"f"}5dà‰[; (}4ýõt™íÜ3ï:$Û¦sújÓü½m]ü <"{HÛP'¹hà È3“èRAÇ| ŠGøÝÌè7ø ¬¨‚0TSX ØÊQˆ°ê'° ÇÎÙÞ@´©[å2¤ˆ,I¼»YvÛhžåfUU.Úp%]ó?’üµ`s¦1õ•_îë*B@=Ñ_jcŠ¡X„DÜëÁ¦Œˆ–íÀ9äÁŽ£“Wôe‡¬‡¦ÔÒÑ7³ý0?ìO²ÐH%–ÇE†éóþ®÷Zñ§`WúíiœäÍ·Çn¨AñAW ²é4»6Åíu¾]5O>¹Û ŠSfËQr6ñ…¾ u»ך‚k?¨‚>êJ]³­¾B nNÍ3~í~¾¦ –¶‘¤8³ûui®T©žzíF,â™&›fD,UHA/)D .`GI´áe+C7·T2L€U«ƒX/k%ÕTBIy=Zè XÀ¯ð¼ÿÈù[Ápâ&tíPRs®G$Ð%»Ç­ÉJêàØR/§-û5Ƭ¾  UCvŠ™ÏŽdßÔå&£œ[kôÒJ0¡‡T@ÔÚ–Ù Ï ¬b1µ3BµsÌeïL±sæÃàl+úŽçWòË{_ðH4óu®ºé%ÑÀ—Dѱ´.¿ñáߟ’꜀¢Mš©™Ìa/S¸Wø‰bÂBMùcxš)1ÄM þ¤&,€WºÂ)zL89 iË@4Œ¬èˆ¥8P⬅ 5\ ÆåÝŒæëü ù$’­ÁhX‹Õ_Áíp1“-T¤XðfœŒ™´@9é¼>³~HIo^ÙÿÜúf®¶>Ùõ©kÆËr vsû¶0›_«ac“Ñt¦ò‘[ ßOn0¦ ¡F«Ì8èÖðú’JÀº­ãiG zZsD°LºX ×Ç[S{=?™‚t´Ã¾‘_íž¼ÿš—`íÉZ»²–ZCÚ02#ƒPú{sfÈy{;û1•êÒ EÖEïšÜDvJ§ (6ƒ-Ë"Ò]»Ð\1}ùéŒó_ç°›Ÿ4|-öЇŸxþUŸsùÆçÝwoôVwtªfrhÒ{aß.‹ôÄkÏõü|DæEŽp§=X˜ù¤x>²…'ºC@q¤²÷‚ªk»ä.={Ÿ—ON°štõS¯ìæ&ª¢§*·R‚k„4¨ºL ݲçÔÚ“…½.X)LRÈÙÆ[ ‰@À6ZŸÊÙz.qvä>êN»IÖCö~w¬AOI pèðÜ>—l‰š˜ÁA{@±åÕ'·´ëÌâ<ŸŸfo1OþrRàÕY„Åé]Ãè¢"ù¨$NQÒ]~¨Ê…ÀOžŒ©¤(õѳ嚘ò"’ìt¢#6²¨á#j§§Ï7ï]^{L¤SV¸«UÙé¹$U¦ð¾º¢q$Ññ§œ’¦àQì:­Š+ó@Œñ¨4”Á‡AIP6H£ÄÈɇùÕüâ>ó¯9¸òÍ·~ÝüíJvéŒõá!U¸F·b CӜր¢O$hÜ-ï‰ãÅUÛaïÈÏL«zã“Þ—%G¡õ™J]{î[÷tÒf +¥êt霠¨T'}¯Ê/§•|D>êìRy\¹<½ é•"`–+–r]Õ³šs·¹ÙÙ §äûîuäX«ñpÕ›Þ§¾¾ëçz¯Ñ1 À°aGC]D[M:5Qop‰[ÔKZª#E FE`˜Þ$0 lµ"y1ÓÐð‚È ¢‚!¡Èsˆp1âê-*Èbí^å‹úl÷Ù8çÝõ&V…kŒŸpn}wr¿7žoŽøšøêÿ…8†˜æŸ!`nb÷YŽ**˜™—¥&7S«—áˆKPœh@‰r2ÚĨñJ*0´ÀÖÙ?ˆËûyƒû!;8ÝqÄô{6õ"–`AºØÏÒc·t ,N#«1ƒ+˜v"ævÜ1¼Ò¯C|üøÁ8}¯s¸—¼/H0뀀V°Ñ9&Àñç¸ßÅÙÕKôs`þ«³OÕ/ÒߨÂNç$OÛ-„„2«ÜH{3€a n4Äa›ÙìÑ0¢`„ À ÖbApB9Öã2:ÓñÑ{ž–óÀÛÆåDëqàqa/ž·™«¿³Î£X²R 5åÌtÈsʶH:éâijQf‚C…qDyF ‘q0!?—„ "'C“ (SŒÕÃgÛ B¤¾§·ð.ÌúÞêxÿÜðô?òußßçÝßÝýƒŸ}Òb¼Y_•“áöìí± )Ÿ°îl©+GV[Âr¡ž…µPc§g–ò™`Û!ÒÂrÔÀ3vïd±N¥¹"Ù‘ÎÅž–¹pÃ"x8P1Uº<ß”:Ÿ<)`»–DQ·È’6Ô‹Œ 0 ù!¦º®h{­ÇP=Ž]VQËœí)§ŽâB)©oû‚‹äC®8_ŸY JŸ ®¥ˆ˜qË£~…]¿õÑ‘.üGƒ¡~+¦•ÅÓÇõöWõRnÿ™³nùqyQ¸Û*W®Gw£¨ä±UCçJU¬(‹\>€‚U,ȶH£iÄ®¸°²W„æ"·(×''þ}}B¤Ÿê?q×oÌÜlón²måŠ BíˆñT¯ðó¾3ï.ÇYWçÖríÜø añ”ˆ^î·9C4¢òÎ4´ê¿‡–ñØŒ8oÝÖ©x†ŸîÔÛ‡nxYÌ£ÕUxéœ[_J[ÊýÇ:ÿƊϵ7Z&Gºb`ÆŒñ¢†?s2½§fÁ>XgÊÐC¦W/‹Û;}Ê¡ê0©fŸZ?÷O¾ð-ÿ8˜6I-6™ÈˆH'´@'4ìPìðÁF\nÜÏú’Ï ÿüOìï°=K†Ã‚в'>„CzØbp\uL»¯†QžãwäêèIØ–.&·&ûb•qÒÎ7Ñ—dÔ$‡cÔGÃèô®‚¢«Þ[lÆ+¾=å¬ðZ*—tÒ”.º‚}Ñ5ت¹”  EÈ L;† |mµ•Ç(n¿ïœZ©â5]ßè)•ÕSy%: Ä-²B ¤W@Ïc|2VZI=/ÕÒ­L¹°+ß ¿U\Â'²cf˜ˆÚi@Üø¬,¬ Hتn$·lÙ+r€ Æ”˜¯š«ô®rPC¯æ*^­aÇ"osyÒFEËÁh™YÛ¢~G’³HhO¿Âˆq„ÁT'Œè«tÌ¢Dð­ºÉ6nƒGvN®§Ý4[}ayEUa ÖJPh1;„#²ÄyT0é3h6ÑȦ\ýÚ?Õ³3=µë„º…Í"gî ’Ìf´î» zAÏBrW˜iW!õl=¹@1–ÿÑ?þû?ã¿Ð:êd ze)ìvzÃ’¯¤BŠ‘À$‘kÖiHÛÒãXRÌÇ Ásäu#IO<­è‘]åñR^8 L;Ûrƒ¬’‰È°Šsè×sÿØþç€b˜E¤7)[n £Û¾„ÓD *‚MWG {ycuŽëÔâvEØO'Hb&Ÿÿò.[ãíÛYxë³ýâx{t|¸ûû›ùml*<+"’¬ú"Ï}ªüîT]²¿}Ë]'Í ›üxy—F—MS•X]°Ínqæ>±ü0í'pÕ‰¢ðñ¡¡ ª"Äô"Ò‰ÕéáŒáO:#; i¾kQŒVÞ2‘“,цGèÕÆ®”Ww@-+ý¬ß?²ÿmäÏ R«ìcº¯öÕ#ªUYÖÆ ð‡Žbø+¾Œ‘K‰õ"‘eœÑ"›‹»q,ÓKQ«é#²pÜ&cÔÏ€[§º8É‘GA·/ð0¯PU£B+¨\¡ÿÅáW«ÝeE†€çåk´M–w†ªÏaÀµÎOÖ/Ø{ü€Ž»ôøµ‚ò–¤õ%«ó)áª>¬V‹Éö{3‹œÝ—§©?ø±:–(ÅVï>ÛÔWS<ŽçÃñû*¨&~‰*dð«ckëÝü¦þïð/Ju¥q.¾óÿýØûÝ™·’–àÁÓ¸ã̶lû1òyµ0»ß¿Ç׳;³[ç ©fú.ÞÜ>ÚEb"T?‡¯ós³~÷4úÒѸ Û=lëE¿T”¢'Ùµ1ŽÞ]f0£~Ÿg}«7%¦ô"“ ^\ˆ¢¬¹Ï‡A›]?uäÐ(c§´í–WÒaÚ©A+1zî(L» êÑH(Ö¸´: ŠC…e[R##É0¦5®Ûé‘>Dò‚bÕ¢“C˜ÊîCg¿ô›‘D©ŽšÏ~^îùô'Ãf6Ü>ÒÏ‚8þKXË”P!“ˆVÔKœ‘>Ç»&@” ¤@Òé BŒV®q†Ù`¹¨Ÿ|9ë^«/“¯pÞhˆ±{(z¨Š°ÀaÝ^°š†›rw‹ÿ}|ƹq£¥íØN¯—{úe˜t¶?B>Rí¬H¤ÄT@A!Ô ´2¬A =¼½³ÌãÏì¢y¦Ó§>]yøvî d>ιÀãÌ^¤´ÂÊ0¯dn†É5ë*‰-bÍv`Š*1 ñ°KS÷”’僩A»1r¤MßÀ9{g¼M8¡qsUÍ]ÈFª3gF, ŽÉäê¹å‡Ãçƒ:ÖBÔ °NìPĦ7AÓf=yEØ놫äG<לÊVùD‹V>9ÝTËÔNaw:ˆR$‰B#èIŠ­L’¯*Î*w‰"ýEçÅ îu¼Éqöúþ³ó¾ ì.b¶Ç±h$לD d$† Ь•÷³ÎLÏ|ƒ3õeP­nÆ£2 zw~­˜ï§‰ÀÂRÊP9}ÔµKß>>åú*Ô—á&=Ü•hÅ¢DcH]uÖâ4­K¥Ìk¬m"ÛYÀ¸èú¶&Æ JÀ@ŽÜOR¶t¤ücö+•zПÂÑÆüŒˆ‘ÓÌpf3m£Ù° L@Âfdég\Õ¥½+®}­Ÿ™>9-Ö¹†Q'€‰6&ÑQ+oj PQ[4<Æö¶ê×r”ËÃÍÅÛ÷\6iI¨­ræ9”²J—ý· åáRõ¯Ñ\¨_[ÙuŒ¿»ßûç% ïIã…îøîĆDTæEÚcÊá ߪhïh°”üÂöi‚~ƒ€VHÑ'éÂÀvr|jüp˜Ã üLáQçÛyz®œ®*˜SÞáaé+’¡%“?}ö¿öàÑY‡ü´¹<Þ!]€0©Útu·qyèùÁLg¶”‡)—P§ éô¼üÀ@äÓÔ[m×ñ[¯OoCý(Ï1žÝuOŸÏwoOÂSæáôã‡;.ÙwuâAû…)Ežø:Oìü1×ä\‡àìæxP $¨éBB‹?éð   µ"ˆVªÐR)4%Ek(õ²¶ˆfÍsH>ØWÿ§'ãœaÓø5ÄKÓZ>:6$F J8ÓÐËîviÝýtD (D0RHîdÉA¢€ÒãSç{>yr~?¸çe> ‰øÛû˜½ð®gQ£;2z걟ÅDtÈg GÜt2ЪèꥪgÐF¤EÄŒ:+t•rt.¾ÒbÊnåîNnÐÒ×ER¢àNþ:ü4úèíì8;™Ï-éEè©·iÇ1'\¹ØÈ¾ŸsM}öyÓ‡j‚8À¶eöœŒÏ;Ê•jä¢;Q…éñlõFcùÔ 7ÖžWÙ2á*jÂ5:0 ÃeÐÛ\ÇiËÑ@ðM`„ÏŸ^“/Љ×Vë–§ÛLáqïïéót~(y#ñR {Çîë‹ý¡¯ú«&À3„žÖ÷ÖjM\…Œ;pª¢‚eo%!hµÌÊz ¾XK ‡—*Á![pB‡•í24C‡ÝR—¥ð<Q{‰@Ìf—ìëê©8Ä”%™2ïÑ£ü·Sÿ,[º'ð{D¶ª=¥‚ºíߨ@_A@‹ S¼."jâÃË•7p°…)Ç•œÚh¦¬ Í–Ek¦š8U'õör¸×í â:ÇUõžÎ¨L¥·åÁ2½ŽlP{?%×ÎIG´ÚÁ¨3à+ðtR;P0b+ =3&ÍLL¬à°÷˜ ‡Q*ðü‹(‡|ª ¼ÏéÏ8iF.YkAÉ”Ôe E‡&ã H“éoæçIÞ–6eŠ! gçÞm†0f v™éÖœZ¨QN¶Â@MÃSÒõå:†”8™j¥¶PHD†{ZyïgÁ?Fªbè•úo+**²“ïÔú°Ã2ƒ†Zoõ™u¦Ó›sL»¤9¶Bíá à ÇRó põ¡(6qˆy¨mŒÊ: 7î]Få©£üëøƒWlçs÷Säi¼’Agd·rÍ<¨“°QR(1aä”%ºdàyG¨j1ÑdÍR—MIü#®­‘¢` Ò‹ñhÇt #²¢¬‚°‚®VÛgÔáúÄC¾0ãÖ·RhKˆ«ÕiFUçÁçƒî –‘÷%Ð:„47Æbì¥S8*=^d}«ý`Sǧƚ^‹PÔ¥‡IàähË`»tø;¨ƒ%g®~dRv]ˆz¿m:\¯’u-ã¶ ™¶ %°JwÅs­PMºbO\ ?J¢Š‰¡‚TE2‡R4}bˆ¡]£œTd¼Éʼ*[ÀÝ5u…Sè‚siÃg¨+©ôÔF *B´¨@ÝT`!Ëëv•_ËkáFÀ,äk7ûtþ{߯:2™›ï`S0CÐ+Kºdñ`§¢H½.2ˆ‰XcQ·+†"ˆ!‘„´zŽ« "c’ƶÓSŸ©ïñýNH¿Eos<ŒÆN*¥º«‚Jsü%tå'õS™]RC¿aѽØÝm0ã–ñ6·H&×¢Ÿ7Ë~ö×i±ò×Áä`X­@ë{5Bp” A1õ‹ž¥Â c#[³œe”iå0Ë4 °¹½vÕÜI;=¸lî–ëù1l1ÅÒòçõo!R›*Q§–6î%[õŠÞÖfJQš@²ò"_€Ð\—í&Þ¡5§(Ž‹LgÌ`kQ¼öîD7ÄÍ%ºÇh_r¾ó. ´‹ 0)PLŸu¦¾]~f÷‰[nfMœØâwqSke"'‹ÍhíTT›Ž·?ß/ÿ—ü³³ žyöÏÞ–ž™ÚΠŽB´Ä aV½ìL‰žfAWf¾¾Aþ™ùW?ß7¼Úí…"!ÇÜŠ¢Ë®¡B« ôDF‹±‚RË6l¾e–¹NÆ]š“ºÞg¼²ŸÂžÍý„µ]º‹ î‹[®›Ul/q¾FEþ¥3?µõꈰóŠú? íwOÏŽ1¹³ v<|/>Pµº{ŽmíÌëCÞˆÝà>MœŒÜ8\ËD£§AqçáïìÙ»5Œÿ–·í-å³²Or~½Š÷¶˜/{>lOE£fLa©uQ4€9;§¥+¸ô)šÅk^“øÓß±‰« ãvJ« J·þ>×Ë䛼­ïœ,sE¨™–¥uo½ÇKl¹ÅwÏ´ø ƒÓšx†Œ:ð—Y1×at ’ð˜×:}Ù‚£).H“Ž`möA–¾©]UôIÓ0|ƯöD<“É*4; ㄵt —=“ç`sÔ:9Ô®ö iUÖ¡#%³ËmÅ‚Hñm9é?*¢æìZ¯bTÒaî¾ôðë§ÑŠ£7¿Ñ­/e8ÿëþåÿóóâ¯ß–÷:Û¯ßýwý‡ÿòž?÷8üçc~‡, ò–ú™\“«¼k¦÷µÇÏ©×n¥w¢ƒ>ÒØï»âóìÒ¿_¥/ò® pà¼ÎÛŸðó½®ïò’ýq~ážjXÞ9¿ªû-øíø¯îúoeÿŽ[œûÍUq%;[‘QÍý¸›ØÆŒÛú¤ýìýe¯-2ÝL6PìdýÇÜò¾Eº¤¢dŒe}ÎyßìŠÌ<«º&ó|Ǧ°¹N¸–ºØõçOîÙ4ª¯|«· È*e¿8`èã<} âe|ʰ!%ãÝ-F‚²2o6ÎYA‡³ä&ud11ÈØ-Ƕf‘FhÙ¥ô³›«ÓÐv2¢võ|8Vù”>–aÀÄ« †D"m­]Nœù?üç($0©—–NVGѪ:D@¼Ô–˜„«5h2á“2¢R QKÙ&æøÞ÷íþéü3G{nöò'ÿðŽ²ªEV0A R õ;eqžüœO~Ÿo~sé§ø¤ ßô>ô“Û ê:Ú3‰UµV´&š HÒŽ X¬7 c*û‘7!»EÞo§Ïú!³žnøø¤¬÷Z±“ãZ4ýlØgíÂÍINfQp63šBŒ²ÙÆšÀªhÒ ”p©á’ðÄö9ÚhOÖZú8œ41ƒ˜I-Ü$"åégŸŠ’ ŒšyM@‚IÜ]×PÕj§ M3 U§¥Cæ!9ÏÍó6³è#½þQ¯{7yÖÏ곿–Ìð`‰â­å¿~§?4½Gg@<‚qÚ½÷ƒ-[š%‚£ ?]Þή1j¬ÈY²!=í¸hÈg¡54&Hœ®«„t›ðm·ìóá<ç$Oçégh³UåBBê÷\nfÑÑM®3Õ"­Hã£áȈÊPÄq ùŒÓår~I¿n½q/ãÚ·î¥÷÷ñ«O]Ì|É­éßÉ—ßÙéôFÔÈ*‘H¨ê¹"{$¯~>ßÝcÙcÐü"W«»îñoæÈU#ÝìókݲÝÌqè¨x¿Å.‡Ä>·×€ÛÖ¼ýGUøèj|¬G%YcfˆÝ6ƒ£Èúe>WF7‹„¡ãÚ ~ʉ>ã‘a7ãzaÙ1Rš/–šoÆ=MßúôÞþ|ñª3Ö%@] ¥1úÖüI’.¼E¨$ÄLåÎÜ”íOwÖ—­»¦ž“ÅûÑúh\Å=ƒˆfL)€Qm"?·âqZE®#ìõí§Ç¸}.O,èÓˆ÷Û{C.‡ï†÷/ ôFêOHúiß°âû¥²ÑcíKĪ߬Qò2&ꢒs¾ðV0GÄBM™ÌŽ[¯hxÉ™<ï¸/kÜ’˜Ã-í¤§|µ=Š>WÇ}\÷èÝÖ™“¥ëì#g‹xÌ2¸F!r] ¢/3—¶úû¿—îîÿì“·îlÜÑ/¦~UqÔTÿ<Ä"9+;ã³3MU€i. ²v]¨[§JWFI€ÈæL]ìnî=s}ZZ{íéÚ—Npµ˜?Ùa<ãõY¿‹G° ïñy~ç="C‚ÊsùU¡.fD4“%8§¯EÁ˜%˜ŽPÇܱP€jÕÁ ÂM e@_pé?m·¾y÷\ÆsÅ7á €¨-Ñ_ІÑêÆÂ !E„dY B®ëx¥¥Op.uB káGjÞ~Åïcw};©Î –ó–ZJ­ábØ!Ê0r0­ ðÈG `[bΞ[ò`‘ôäÜìO¡E`USÏŒÝé`hS¶¨l–ÃsgÙš8æÅ# µÄL{.*4y…õ¥Aô`Iû؃R+òÞþÄÃ(ñˆ<¯\ÌtÓ©tIW4l ˆªféÂ|F&—”دº]ò“(NYöÔ<†'dÌ ¼˜û]·S;5\ۇˎÉ;âJD¡Êw¨g7_J·ß²³™ÂG¦DZƒ!bEA#°ÚÛª¬Ì ïj–æ0lÚM.1:pùÕ®RÕ8äØ;~A´¦ƒN@bø.~ßWíéúX  ì.×)‚md´iýË~{­øÑìÊsD]WÖ£Äå-¢=f˻欑2i(£û׃ç¹Ò´þ…ú``LVLe'Ë[öÁêÈJ%ýòé‹z¬›:•' +a¨T[…Ø>h=hÓ‹2«Ê?Ș\\0â 6 kæbÆaBT Û4@’U– ¬ª“]ÄÑ-ñ–ùJSÉVQÅA L°©sƒ wjçÒë»Ú^B±¾xÙ«¬õB¢€ƒe•˰Ü/¥ÉäÎ5à7™»è›¸Ü`¡›b»Ó«Hð^$3Iúÿ—Èÿªk¯[É^™¹#ÏÔmÙ(%'øåxÉ‹†mámt™Æòºê’ªk_è%)rÉ6•Ð;Ð `´Ã~æ#æRÊÚÅvÖ£-ÞÚLÖdâ*X•cœ‚ÊN|­B¨%†h>'#”C Œ’)öV—Ê$ß ´GýÆÙïûßûùgï4¼Ÿ¼é݈2ºS®À–~½‰¯‘Óë•&…aI©uš„L(»áfÝ%W°,Ð>nzÍV!ÌelG;(U Báfô¿ý¯íŸ?¿ Ôí»7“ß?¸×%œÂf«ÐZ$6fb¤#vHñaS¯h´¦¸tŒôiU½@ÁA4a$''Ѓ­Yú`è¶j]ìüpïºùl¶ôÌ•¤pv4G‹ Œy¢7qÁÀÉGÞÌÙ»_ó˜öÏ\e,óÀžÉœ¹ì“øÄùõö‚†µ·r,–% ÿ¥þ2v4gT+œŒÊî™~ÿzv4ü)ŸØÝ–Y B¤—– \"~@·Ðî{ažÀ£¾_Óݸ¯0&Dïh(–ÈË…¥Ù):q “äb¯›Gc#mŸ joêî›#íñŒžpFóFÏc?ñ/Õ¯ðhKk?/¾Ád±^ÞZ³QÊÅã\ áˆfÉ ‚ƒô$L©ÑTPv~³×š]&_PëûäÎüwöãøƒ;fT«­à*KÕÀÈ2¶Ê­åöxÓ'ÖÅi#Òݳìùû`]C(7GwYmž£s½Ê<^–pLC'Ô3 LPy{kЋ¸Y'(‘dv‹cÎÀHañ9ýJãÉ(¼ËQüÈ‹v0ñkÅ;:F KutX¯:-j‚ãÆÄÈ·% Ü£4”´7pÓíÝz cÔÍíYÑÄ‚#ŽçE.D‹6ܼê¯S…ºAö©¬Þÿ7ú‡ÿÃ^Ÿ¿Öíõ/ýäÿí_É¥ÚÝððüùèžêÏtÿîp¯¶Xû„·KVœ²|x¹ö~ŽòÅ9óÁ?>+oþ¾¶žDÊáÒãÆBÞ;³fÜO >¤£¼™¯Fý4¹‹$îØ-™ÐuFŒm/'u¼AœÙc‡^mó ¹÷Û«Z梗É7ͱ8››ZEEº~ÙÎ`†¼Þ|v­¾îøÏl!S\ÀœS‰Ðü3ÀæYB!‚'r-¤½BÒV?‘v`Ûõxñ̯)‰hÂÓ4ž˜ÏÌZ—üžö«»UÁÛæÞåÙ|…ÙgýOÈ?€S\™Dö¢b#ñhADmDÂ9 )ÔD¨@Ѹ‰(µ¸žÏ,h <ªò_÷V¿×­Ž–¥þçlœZ,Àe`륋d-q¬^¯¸wzNI0ß4ß‹:ÁôÍ@â»Ã»nÞR=?û¥S¬f(ƒ hƒÌ `Ð6`Å4°ËV¾^Ñ´…æÙ{ý˜ô{°„V ÎÙôÇñ ü+úK:²qûZ0„¦^‘3â`#XYC€"œ0=Crh&ð2˜`†²9ÇÓ|ÞŒúxE÷f>¡Ãµc@GdˆjJB“v-Gh`dÉ„½¬ æ"„n ¨›ÐÓ¬eDˆÐ¤þ Hƒ9RHNnî°g²æõƒýünù‹^A#~6#û{~Óó¿9$üýµÿá“ßy†¯­Ç7¡XÚzInaG ß)ƒI!ã¼ÚÙÝ!GÆÅ®G‹• 3ó=ý´¢Át»¸…ô“M×s‰A  " Xz:™²´1žœ¯l 3ÄÔØ®"òÈ®wÎ9S(1Åî`0š(K’(m·‰U ¹-ÖÏþ÷ 7¢®Ö`ŸT{}ŸïÒÖv>_ÔÝÞ]!{ \xu§¯KOyûŸõ.>ÿßß?H67¯ÒÕeÖü ÎÏ8‡£ð~ÿõûׯåÿù™›÷Ì<¿w­çœ»çµí/îy¸m X$ÀÐ`WÀ¤ÝéÑ¡TÕùQ"´kõýiéÆÀ…¨vGBñ7ïÃÉíµãKÅÄMà5ýèÛì\àBð¶0g4´éUŒ£ô¬é–æž iÃä%º÷þœb]ßÓÎ;çGsÏL§kŽòhÇJ¤¥FåRþ\cS­ÙóåÐzk¯V}sŒ>æÇÖ¶½®'P¿¼—ó=[sË‘{†¯EIÛ89X›íÖP{³}ÓnæA—\¶{¥Ûm‘` ­ «‚v¤†uB¤ƒœ¸úÜã+x†+Å¥ë:ô~™*Ú„3,\j‡«\T“³¦„ÁrB3=ÑД4î*!µ«Ë…Ûvýö¶®}ú¾4ft;Á}‰GÊ›2»[ §¨d?À…Óõå`jôq$÷ÎÜp¨Ãý3uÖç9Ïë›Þ/í1•Ѽ§ÿoŸùîë][ëE<÷§?W£æ LhUª4ÔDã‡?ÆìéFdÉ5¿V½3͉e¥Z’Lâá<S¿wÓ6™)«„½Ò_*Ž Õ éÞ½€ú{F,Z$¸媄8Æ„– ŒO79Ü®QÝ„—‡·üA— üÖöxÀÓã}§¡ÀV,š¨=–êR™èvD—šª®†í©z¯”Û;ŒÇÓµÚ‘á±;AH:’™šžfŽò[§ŸÃÓc˜æeYv ßjoÁÊséßkþ“áJc$ì}9KéY#‘Ñ ˬ½Š áêJ|utNГ©'~]tŠ:6õŽÅ²Ûýj:óÒ}©oæD+ÝR“›9‘UDÇr–$™”šƒ³¼ %HI¦˜Áõ"7[ÅèõH FU9lp»F—I«Z1ºC£1.Ù[6qßh(2ü?û‰vf2¼©Ì%5€äIQ1gFb ÔuP½˜œoø›†ÃpgϬÆRE§M»¦£ñaœ¦à€—P™ /=Do7ÔRÑí‘>¡4ÌòÔÑé¶]­£9ìîŸo\j¢$Ø@]Ü8p|¥šƒk{_á•C–†¯G/áÓ5,ÓõS$e4+ƒ+²ô.ž¾ú4ó„ìöpª‰ûû³¾'Ÿq7 À›°ß~a+(Á:²ÈÚÈ=–í´¾q¼nYËW/m¬byP‰é§0’ÐVj™]õ­êjz}|9‰΃z|Y]ûì ®€\r©ãb34ªh…³c]ª©«N»hªks4(gØ±ŽÆ…Ï<U|}N;oâ&GÞ"kÑ1hï°ÊBb¡£åE¡w%OÝ¿Ôdû%/Â’l\qWw©­ûöÙ)W¹j¦ê(q‹¢Éòp¹)q»! ¬…*Ò±%nD0—'º.44g"Ö#n.ª€&–]zHóç^V÷íz¹¯5Y,÷¼þ>§™ ²‚ù€²Uªß‘ êZW¯ÉKUZ@m£—Ñ:DTCËP’£«µWúZ¨@µj…="ù ¬.Sž¹ëg8j L•ô ã WëIÍפºíÛU^! I‘‘p‡Æ«ãC·óïÜ¿›÷'ß^È@9ÙZd‡ÆÔ]vÍþ Ÿy”°lILŒôP­(r3 4ÅJ<ÞÈBêוUYaîöø™k}lKF¹ZûŽÅ£Ó¨ó’ôÁ>‰æ<9iÏ ™xô’½x”?2ÍcQl¢Hm¨¥KZ| <ŸfçàóÞs{£˜Ã¢ÓYâÐ 2\õÖetpަ²X Ã,ÏreJãum€E%Nö+8ïù–ÎïøL¬ÂÕ}>ã^;Ý@lzï» ÆôȘm*C‰ÿ…aÎŽ&ns¶Š#¿ }fȶåZI˜5ØCyifõï}ô ‹Fý=}ÿúôCb„L¬¢ºÕÁ …™ŽÆ¶Q ŽÂ—x·ð o0ÈÎE!dBˆçÚŽþÉž×rÿ7§o>˜ý_Ãè åçºóôxEPªh©ñŒ °õË­=$ƒJ>†¿¶†J$óÜTÒ"gB£­·ìc_VK·ü?w¶ßú}Íù»¹mà @fÛ¾ô‹˜cã4ò ¡qnO>Íà¨ó­–1>j†ß`ÊrÕíyª¨Äq¬ì½0b~{Û9·ë‹ŽÕþüepZuy={“ÍŒJn‡Ì€À+Á2^‰Q3ÜÜÿGoJ¿ÿ~þêùóÿñùO‚ùÚfe“È@sº¤@lAè`H†»'4Å®ÿPM®’ æåïx«ŒZž!84Z[™;B^ðy„ÅBØõ¯%fcÒDО¦¦Ê¦CšÊÌ  ÝýAWW]pTNS’Gªš†Yz(©ìº5Oȩg#jÕ!u·¶[£!n¤M¥Y3òVr8Ù Œ~øñx‰í‹n]éòð œÞÍ fujs5Ç{µ›ÓÖÒaê\¶LŸ¦ÂÔ}#¾†5'`ÌÙ£,C/%ÎÛ¾}p”Odä±ê-†u‡ŽÀ˜2é–©dÔÑsvW&ÒwɸOcÜ)‚RDèÅp ˆÔÍ µ¸s¬œä.~«^$å—p”@ÚÑå-³#rkh¼,0ͤ­8K±‘òÄ®¹µ¤gªcžC¦\ÅZ ·¦ j ´¢m-Ú ZÇjZ¥6zÍ'o¿ÿÒæÄÕýÕ¥xý™¦•Oô;ù½×Ÿ?®:ã÷Ïjnæ¼@.²As3ùí÷rÌq<þ½z¾R<(Ÿì3b»ÞÛíœ÷Ÿ¾Çúq@'¾Á~×þþXÍ}5oÞ.—ü¨…_ ¿Ï£êKUÍÌî¿»Ú<Oa(õ&´‘:»ŒE âã­ëÏÚìé [ +"¦Tr›ÏÃRÖ,»«¼Åg¥ÏS­çž2ò:É$…q[EKÞK\Ð(Y“W×¥èr×ÝCÛëcŸ—ŒL'°"ä!Ç 8AçRh–nèŠÝƒ¥Æ1SªˆÕu¬IÁ"¦¨pÛÁ4¡a*TÝD5<¶2de7Úš­Y«( Š ¢„–”æ^–¥ø’ËÐ *°\Ìâmõ,° £ô/ŽÏnàˆõ3sSdK²¥Ë‘v3aÔ¤^ 1‚Õ°0 ‚PB¡4jj ½ª4?þ'¦ÿõá¯Öÿ”»N½ðÅU‘™a8pv3í²¿ÛGÏüñžoö =ÝwÆt3Âoñý•îO~²ÙœÃó‹\(3DB±"hÄT)A@ nTšXVº•j1Á98¨×òýoæwÿÔ·øT§Æê>xÀ£SÏnïÈ›BŒg¶ž©Ó8s´¦)iÁ@‹…‰hHƒN ]ÇËru™i_†çÞ`Ûîç‘‘t,ähA( ƵÕ8ÊNÌx"GÔÔK˜A‘:*•7™È®´©]•FfB¨!™Ànfì,X5w˽zôô–ý}|öþr?ãöÏýß|où Üv~<\šwúA 'òÅut½H•Û§•OŠÚ«v°_AÑ4ÔÕ T XÐ5“ÚPˆ O"nËt•Z$ ¤/"„YËgAޤëª$ʘà*k[ÀQ•Ï éÀ:/ŠLº Ë †Õƒˆd¨ Ôì@C ˆX¯ßïp8x[”÷ˆ;‹>…‘þ8xóh¯œc8Ñé:½,½*½Í}¾}uñgç/™ðºÐ¬pðóŸúªV»ßúzÿ›ƒÒþ¨ß›ž¹Úúó½nÄW÷Öw*×Û½ÖÌ;ˆÒ’8Z!*PaY´Ì7\ 9D„ëË»| ‹Ð;ë‚MàÓ§Váh‡¸0–¿ò:¿Õ‹{-Þ‘•õ¯lx=>Ÿÿà5èù CÉg$w¸ŠD`ËX™ ¢ðh5-ôÃÎ9~ɧL§›µ!“)Ñp„b Lb€T‚2€ 0@(=,ZäJ"B|>ò»~l‹¼ò=qv y÷Í[C·%ï·Ï>⑚Xÿfý³?ÑùÔö¹–ýåsõ¸šŠïH¨³¯|£?X|‚3Èj>cC—æÈ¹=åÌh@ÚŸõ6B»%ääôLëóéŸ}hFU©X¨q~ÁVr„Õr‘&°gªBë³"ºêTDŸóÇ“~‡„¨3¡ªö¼£øª™–Œ']€@Ìu½àÕI6²“ò9±Ñ¸;ö%¤F9îs‹¸›òYû/¬Ï/ÝÕú}àDDzÀ#h*Fs4z«ìŠÜåK°"œñè7î|rã‰xÂ0µEeWpÒëlñµY;ó¬(7Zuc—«Ð¢*¨[X]µC 5MÝ«'QRkRàS½"»ó›kY?¤?ûÂ1Gï ¾Vï—Xûþ}XM¡â#ø’2°)AL!è)”«ˆòs Í|ÃÜ•DÛÚdˆ.Aö 3ò…d¢Âו\ JJü²¦ÀSsÀï-9íäUQéí‡KÖ8"hIïö$Ú¾Ç÷îP¿–CöÒ×'}}z^~­¼BF©@Ý ÅÍò¸¼8˜8ï€dp³îä`í¶î>T«6.“U_Ú±ƒO‹3ûäU>ælÖ½¿×“!n‹Ó4eªzñ).’bœi³¸ÜIgw'Fk‘7Ù릕õýÙ¾àÎT}+ÝïT‘lÐfÿ´¾+?þ4µï|?‹>±—«ºi û9ÑL ¿Yäû­}h`ÁaêÛôéÐHª a¡X™“jX% àQrœÉ’ÃáØ3Åi~—ý2þÒ3Ôé·“C° Æ5¥'– â‘Ê®¨;W‰Û›†Š @±RSÞ¥­ 61°d E§”Åuô}ÀžËK|•íÚmrúÉú½ºËÉ4ùÒy9噂)ë.3s4¬\ßâ« ~Êa7XŒMlò‹ÀSéWÈy¿ÿ•_ÒÜ~žC^`ƒøÁp-\ðˆÔ¾Àe\Š2JJPEDü>Äûú…T·†ñ„Jú WŽÚg|ÈZ¹á#z‚,ÐÊ,iÅÄïÙ“¿’M?¹}‰–i HåÁêc;®›T1”@˜LQÚl<¬|¢öIt³ÓÖ% ø€P6tRèQ‘VŠ}ˆäN&‚5øëŒ'Ü>£Á œ¹ÊߣidHmOÏÒD;U)Ãßÿ3üþ™L˜'Êï÷ˆÿTýÛôÿµ)Í«ü§€Pò™Aè+âBOTXxì[™áøöžßÍ ¼“~K\«ÆíÖu£%ûÜñzlƒÔ°—Ç™"l 2$…lŒsQ„ùíÑóBéÑò¦aUÌꈄ0ØŽØGPѯ|Z+ N̈ú"(ª½j=qÁk¹{þ½‹ê f§qíðQ‚þìóÊ£Üe¹>ò=xM$cg_CZš’’²õ’Jemᤢ«A÷ÚÃe¸ëˆë§í#çdS®p?ÄU^…^7Âk€\Öi‚9ŒÅÁRPÛægŠ•ñ(`Y~†ˆD{Š,Ó*gp%$@õ>60óÙ(#¢%-l;&ºBlU%Ã^$ ÕE«Ô_3»5õ+.†þZ©£kCÛŽ kƒ"–CÝŠ>…#\¥f,îbNQB] ÓX!Ï)ÚO7œsøÃ5Ãuú¸¹¶ÐÖÉeç›Ïü4Ýýû¾Æ»²Ôw~>~§û>‹_jÉ=<'-ìÝ%éïYß|áú¹þî?w|ÛwýõÆ¿¿ÓýQ|@ÆÔJëZ?àdÃéõ^‹ËsÒÆ]ÕOŸý{ççt±›õY*‰ðzsÄ Éuó|¾œù˜?ŸË32ïøjµ³ŒèÒÃûþfþHûÚôa÷§êóv½k‚Ç~{ç×}í ” ~VPô‘èÅURÎûpû›ñÑeôν?öˆí„Ec%e'ã¬À˜ÊÅÂÕËÚð—„Ø²û¬Þ€& š@SšSk±3Ÿ½®kY#¶tˆÏ¬_¹Bôæeg)=0ãLk‡ÑË´˜¦ F!æ x×÷“ D¤†Â2.Ñé©©Hê6¼’l¥< ųŸûùFËV #ÐR¶‘!׌;¿‚%V5Œ#2µ‚˜…“³›çzíL×óå4¿¢G¼×Ý~{aÂRÒÍåzQf|UÚ|™šèévÉ6Üä¹,õÜ×èûúòÁ}¿à1•™”3Î…€E¥˜¹4Z0„ H±,ÂèW𮂤Áæ  wPB²A…æ§Ld9Ó ØÓJXèøésî—ÉžÕ?ö‹»M¿1+Â?wæ ¬ìN†á„ºc/Ì'“ö(ï}vw@OÒ8Äi›%wsi@ÝfXìK(t5¥X¼AC¥ÃÄÈ^Þ…†@‰–fèÁBKÒ ¤ä#€h‹`H½Ù/Ä~¬,t¯±Žu 83D¥¥i¥}I—ÍÑÝ4áDÆç)ÁN m³–ð#’±—ˆ7܃j>VæŠriiq¿_sÿ“ûíÖãä·?ÇßöN_º;óOƋߟŸ¾ÁáÃñŸuñƒùê->Œ\/ÞÚ7ËàÐ8ðþ2>¿þþþ˜ã¼fTVO¨«HÚPJ±ö¢¡ ®A­XN—^W|ö)áO0Þ` À¡šÖyã  ÊdñÙœxíc¹xâó‘ý|Û[îR¸Ø?ù¸þª ’Oä÷$GM1(¨‚@Z;ÚUÈ!ûmefœR¯/›%UqÆU^€D±ýçÙñéZðëÏ/•?z ®_é3¹Ó´ñòðDÉ“ëãã,÷îC¹m'zïjtöŠóˆhýã»VãËãkÃçk2‹&s63F–VgßȈˆf‹ ý¬yBGq¯FN°~ô:•×h2Öé<²Jý¹¥á¬>زâ 0šL¯æûŸèþDÛÌ /}žÏ}žTÍAKj)IÕ#•sÖĹê–FPFp¯¹åp[šW“>Ñç̳Þî>ÚM½¶tH>Xzm““©Æ:NE¹V¸÷ýeÐîg…l;ÊÝÞ>µƒñBûæ(V©ÆFcºxÚ!MsGÀ†ªÒ¦ d¨wÜù¤ËæA¬ xIÞœ‘á' לRÖØ¶WŽ*F)`U…V´媰¥:(„­h„µªó‚\Þ×g9_{Íøžs(d ~>RÛûþz €Üëð¤èo.Ã÷$"JHFÓfŒþ§ùÛó[éÕèþˆðóLC€¹á2JÅmŠZÔo 6ECk&+°,8b‡œ1C†ÓÛÝ`,&­íõ8ïKwù5,r4œ,¬ëà]¢ e]¤•»3R¤@ÊÚ" ˆÂL´óË{=ËϨ#o˃åNª€…b5ÄQ©ÜÆ>¢L¥vr›ôð ÀÑTJ "FÖä1j:J„ÒmtÇ+ÆWµ˜-XðRïoâ}¬Ž l뇛óg¬)æìݧ …l}ªøá¡õvKÃ>´Š>*A%yùdùBY׃«/cÞc^?9^ØÕ—ëƒH¼¨Fý=—jQQ¹pQ”b'9§v¨+¨ÔƒrñÕ°ªžÒ(@2]«¯ëÉ*®ä/ðµ¬Av¸æ!†t"tÈd-`Œ_qË8ü2_êË|µÝcXãÎj#êÅÈžé¦ÁÀ8BF;ƒŽKߦC':‡F¦¥¤+oEVÝ#`@CÒ9“>åmÔbPO¶uk^/².¡—•}÷š•,©ÙhëB]ÂÔbz´«ß}âW¾n·¦2¤¨õ•¦u¯u}ÊKî©ÖÅŸ/é]Dút*šµÏ#ÿž®è =n¶íŽ›F3ÅÉrHà¬ä=1<Ý0Z` &ºP½–0‰¼¶Žæ“ÁÍíïhFµ´fŸsŸ†qçóÇiç%ùöV~sêóÌ£öà[wuÔÒÄ™æàiâ^äx[@—¸ Ê¡É]û~XVsÕéè|ü)¢¹:+é4®Ší‹¼§}ÿØìS`¥9CºýµþnšY䆟}‘¤3¡Ó‚7³õÁ÷+!ëÏÊ-‹ßÄ=Ç…ºÌ®Ñ,Þa,O­t‚oÿ…Ý/:y`e؆D‚z  Œkå~‡ƒsæmœg]þ>®7N±Ä êÔÜMٚǰp­ÝŒ™2(Œvä&¿‚I¥*–HÌr[þ좰}!<·!s¯ã@Ê©%T´\ÀuÌ•× (L¡ ÁNUèÎUæþQÎM¾?ÿ²æß¢Î6kHv·eaLp0E -׺ø¨g5eó ÁºoÇÜÌÐfd޵pd.J©6/}Àƒ ŽÂKä œ-ÓH|ÇÚ¼”ÇŠI4^ßAióc.ƒØyGþâé¡õƒ –¤0ƒ’:˜Ô_¬†U÷Õ«j¾õÉ÷êîgc•BrTJÅ™´Èxg¼ÔÍú ¹)Úˆ1´§ªlD¤µ$ §¹o,²È„‹AŸYÏg^{Ë l¯<\n8.…d€TúîN”C C A ¢zvS%i¹Zj”Rœ" ?ñ‰3>É¢š{,ûÅŸçgj….ýM:ȧښ,&›šñ;U¸9칋B¨ m˜ƒ‡¨Â+¸ÄÛ› ¼ÅTøèíî&.#‰Óå»0eõ®ÜI EÓ(ëÆ#wXnOåDûuÖlÀàhR6¸L@ÝrèWWd§Ý­qbÎ?ö÷üB<–ší¹%.#ÌlÌNGg+¤¢.ƒ™‰Ô4ízð n¶PAÐ΃ɉž«—‹S€Ñ»tYkEš,ƒ( ÑÆ84LZÒ—m¶qê5×[²­îw–7BáIQèhK/?€Çy¼Öé›D4gp]HÙJö’ ÙÂøcŠI…1N·Te¦g²0•̼¬äªýj<_ƒ)„¤ Ûrª(ÂÏžD‡Þ|ïÌ·×òæŠlÇ oÕ¿ÿýá/«éL¨,KÍ‘)öÇÛG1ô}+IîktØõY¬âm¹ m=b)ºÔ܌̌ç â ^È7ꢄ̆¼“ s9NÅE‡ +€V2E…*ç4,B1åPVµ=·íŽ|Wþ|nüË _Ò,$Ýâ ù#ÆøJ¯^s®ÏuIʉ§òYØ0]OO ´]Æ._”«­µû.kƒ¸ÙÑ(\ò÷è`ãÔùê €VË®AÝà3.c¨þáßÿŽg¿[~„6»ˆ.µR ËaF׋9tz÷Ü5£9<©­½R¸qŽ" ¹¿™þ(W+uÔ›s]¼J:¢F º‡c]-oJZ)ö£#× s‹îözŸ9†}5Y¢ qÑí¬M<„eà¡›ÆÝ¡.®pS7öX` 5z½›VD±ÿ=[÷½:“¡¢ŽŒ:”µ‹žŽž=& G;s?4£>‚7©ÏJylM¦ÔG@P¥,½âû¸ÞÔ ñ#|ZFÛq±qAè×1¬Ð<,ÚTTfl|Ì+Ÿ¯¾ª%‡•ø.gr«¡¾Û¼-¤ŽúÎ=À|t-Æ:‡Ë8d¶›IÞj  8‰t_¹[®lÏ8îKÄñþh“µ”D_2C(ç9†”*Ñ2_µÂ*¬(ˆU¨7HQþrñ9@]fÊ\ F2”ÊÒmöÊàz¥0C"¶•ÊÂ0”iÁ+°¿:vX LwuuÙD¼Y*ذÕÑÐ|uZâ:¤B;3(‹!ÙMÞQX‚Óåü…„‘—ÆnÙÅÕk8†gh‡Oœi”GavÓ"(ºÆ&Ä[ÝÍUL«–ú_QãËVs³º¬ãv­m|¤¡jîåzîüÏÿÙÃÈüÿ“ñ²™üÇdË3s Cw€•:þÃVšúÅqö¼îìѨ#õšXÀ¤Ðí÷U2û«Z÷ñ¹úÒyO‘ã¬VòÂü¢Ý£ÂùߊÉeõd¿ØóFOÝ^äë¦ÉkçÇoßq–§Í¬ð±d­‡iµêú¢_óîÖ_¸ïä¼Vσ(p­Ð²ê’L=’”ª˜å *™,ßþ9·þ,gZú®CÂhÁŠ Ñ "8™IŸÁÀº§$«#ÚÆ À§;óÿ8íºe4Û<[Øaâj/%IJ0d>¶›+·z·n¹[JVKq»Ù‰”†ÃM]'h{0ša癀D³„^ô‰Pi¢Œ`‚ª™€X ¢SzL†›÷¿ýJßéן|ÿà½=–¼ /Ç3á j{òæñy7†«’)ƒNGžùtdù½þ¿¼Öf;/V°•ÅÇÈdÀ:Püˆ‚&€BF02H#°–#T¥Å0¨bUŒBO‹m“¹ø|°×a÷ܾÎôÛ|?{þjwÞ !}\‹[„MâícPi‰áˆ30›²ò¬ Ó‚‰0¡90Ãæ>¸¹¢Ï˜W™’ŸíǃýˆÔˆÃa9 ªØÆrª@ð-#ư$È™ 4Y`Ÿ"Éj \µ‡ÍÖ>^yhÛ‡>¿Þ~_×ɽî|öƒÏ~%<}÷Ÿüfïý§Þ¶k½÷Å^:ÜEãy’ð&nX{4£QÖ¥œ$¡kZ?*Õ_ìÁJÿÆ™ª°H$€Nk¥”JHj-0”0pê.Úe„Íx‘t•SF¶"ËÀöHŠ‹w)vwá>ÇláÎ!DŽ-»U+¦}qz2n£!X•Ž»¸€(à ”ØÅdG2¨¢·# d"¥í~þò§õ¼ïÉÿoüÆw\y•Lêï»|î_Ÿûô'~~ÿž }þ³øŠ×ÍÇî´‚7•ø¼^ûEä¨7næý6qÌ'[gu§{2ÚU‘¶Û4’%¿~$YZZª–‚ ïùç~Áç£é¦¸£?•L ƒ!º[ @nMY¼¹§ŸäËI¾¯%îc(@•H&ˆ/^/<~õw»Kw¸¦leW"“Q¢½U”%~6ÃsýÄDû6~||vÆýn…þ`BçÊr ì~¸Ë N«W^QGÁ•BzûYîAßrƉ‰VV²:-\v8‡xBœ–¶¸Õ°äªÖ¾0B<•ÏE[¿p¼ï‘t/Pºì”{ðXa KHgæ;g™uZ$¥ÊOm¸ðèS„ùðÓñò·«]lz]þ;EÃH6$ÜðßiÜ÷œ<¾1}w}Ù—oü9÷ƹ­v¨§¸Ö1N›êÙW,”èdv{X9µñ(AÚÀ bôàÃcö.ß1±L\Ì•€ŒVÅÒ B5‰ØWK.ZA‰•Zs –âxÑúK UJ­É!éh©‰¸¦v‹:»N¨`%Mx9Æ•ƒeÔè…£#äÉp!•Ö±8D¢„€ÅÕà'ô>2;©#ïoQ@éÇzeNŸUê¦é)mº7T4,8ÇÎr+a »Ç*¨ Ù€ÃB{¯ s—YmÀ“¸4פ¦@<2D4w±Ñ0¸É6eZ5Ùy…hº¬^vÉ­'•MÚj`í¹"pMïŽ"0ÐE5 ·“RJ_¶„.ݯ÷¥+sMAOŸII¢Ëà*9 )~ôJ paï˜ —¡n¶¢Êÿêµýdïƒø:4ÙÌ oU“š†i©Qf¯g0¯ÊºgŠ‚’Mkäj·ªk µ‘„ðݽåF,t}¸k3ÏŽ;~÷¹R!Ÿi¶ÓôØhÔˆá2kø°Ö•A~CMùSRþÑUïI^¾.Þ¿ ­ éÝâ„UäÖ¾ÓÂÀ‹š€^Ûwº=¶[ìºØ¥ŸÕQû>ô\_µ“+1ÕEž®HˆH²žt˜Ùëœ߆QdUA)AÙ ºd38¦úꥡ&4Йi±©Ù9É5AyœŽá53´×/ôNˆ ÓMiT ~ìÔ´\pÙ˜?Ù`vôq;½)ÎsÈã0r8)Ä®”?­Çß_¿…j¼ú—×ýëþý2ÃôÔØ)¶RVOûmð!\U¼Ûs÷N‚™E‘Êš+iL ´ Ñ[ñ’ì[&g|ÅÊÎ/ÌÆ,wË™§àÏÌ¢<8|ÇôÝ6ÿò²ãûõWý¿Ïõݬ.kì^ÀLEâ‚%DÒ–:© L×uµK熹.ïtŠGÆ¥$‡[ËÕý|òµpâNíÊ&½³³³†•ÚlÆce¿ËóWüî¾V—«R½Áö.;èž´o÷¡ €M-5º‘p‰‘åaƒÓõã³×ú/ )ÐÖD„já *>î±Æ•’Úésf×›Ë ò겎€rha5ñëë»@Æšù\u@‰Dh€%ì\í :å¦(Š×ÍÊ)KF.Ê—–ÓÐE/ç’o`pV¯Ê&ò,EÜH „DËîÒ(WöÏ4a‘éãà;ý¡hHÂgÆàãÑ%ÆemØñêºV©¾P¢)¹cÓâ’3@£}¹^ÁÅ‚lŠû׳­\s$W€1yZì$‰ë—‹Ãùoã}u4 æ8}m–à„TÞ¢„´‚%ØT¥P••E!¨Ì®èE£6@Âàa H1€p . u±ÃíF°ˆ)¼Œ›åLU0‚U³¼¬ÝUQp\]•{Ëï¹¼ßσ¡Æ§á°_x‰PÚ˜rƒ–˜< 7DiBËUYúTõZ € =2Qc!¨¸¿sª-)T(5ˆ6 ˆPz1_ÈB<” •bØSA¼÷Â.èêvyw§…ÑÚ\2ü¤ãÐ1;Ákãî ÉØ™JA&ÈíXbpd'ë+öØË„8- „eƒ³1m©„Qhf;B•©®°%•ts¹’ñåç?l?3º’iÒ¬£5!9ôæŒ5ÙÂgú&~xDÌAF‰·Ÿ[ÿÙd‚n „R8«™Ù±Ñ] Óè“£¦.ÇH€UÑŒa@äA„`èèˆyÈ©VYœ!•,gdßcX⥿9cêA§à„ô›˜Ù§ß„5'…O_Ÿ›N#7Báië +ÝÂe¦.C¼\ãŽr†ŸmmÀRPg&©/„`¬Äe¥+3­å–KéWŽN7{ÎOèD°ë¶mž3ï ½qÐk¢Ö^°²)(4Á¤R”ÄÒ5Á™ßÙÿBÉ.á—‘8“ X¸Löâšé6LûÌG'±%ˆ•´ñqÉ^mWn¡ð•X §iõÂtöÒï¼anµ2ôùûâ¿÷q{NÍ<Ò÷sñ¸^ýryµÛÀ*Í’r÷b6s4,Ó8é"´Rc,¤]e#Ï$÷Âñ2©£%¼<@!Œðs¸=ùàuË€l¯• ø0ßþr??w>»ëñfIÉBV2ÞµýÀ‘ƒ°C)`½Ü(u‰ƆS%16‚.Y†]Ç4š·ó ÉÜ%Ýþâ§?}M:@Þà'¡‰!1âªày»5М½õÏú»‰11% lHÅí£Œ´W(˜q@p¨ü1·~¹µ»ZA݃Š+¦Å…Õ'`q¼N…ÍÜeX—udX’ÝYsÊÎ ¦'Éž›yd ®) ÍbWZÈÃ.[ `4usW ‹ÅB–”Õ9™½ŸÍîýYÆÎçZ¸Ÿãß¾D•Í÷¾í ËE´sóßeÇzM¾Ö„AoèyY5Þ´ô±´€,׸APR›bÙX‹Í5—„QfêUǾ9#Kkì_LË5E–TfJNh ®q¢áˆYŽ lpýÂ0®Liµ= Jðt˜o,ƒÜ‰ï¡ö‹B[½TTík‚¹n¬*|Øš†d¢˜¯Ûu/yuÍ>sÕ©‡}7n½&КAu#yN#G÷©4…®×œÌ”n*£Y`QÔHfëvC¢0Úã‡^±Ëè~ŠÙÎMÊh0BilÙ¨“®ë©!ÎDèu’re¤‹|5šÑþŽÿ”é‡;/=À™g“m¼9•µôc¿è·H ¼z~ýÇçh+¥k‘Wç×jœmÌc=¾±{Í^³–ƒghÛ¤NžÎ»ïÝ!>Ÿu]û çoóã Ò­†ŸËÏÕmÎT:¯[÷7üíó—ŸšÎõNÞ6õ*‹’ݠΜQ‘ÞûÞw7«««>Þ¯§dÞ…ã@Mª¸ŸÇïœnZRi«µÜ«%lÍaí?‚$ ^gD›1Õ¤Ý,Œ•m!³¯ÒÂfÝÊû䈵vû&¼$©±$ø?>°°ÂÏû…Vâsc”²§HGâë€Î0Yúº’æAmhçÔCÔN8l­W+hàš`:û´æ5³Fòëä·RáMa @]ÉbxÉG„6A£‘ÅTËjdœ‘šf}¼ñ‘}ú·1äËž·ßpùýTówJ˜ð—ñe$eã~»Z§%‘ ŽžÞMÇù_yžÏåD@•gºIÔzZ £¢  ª)(bУT2Á X €He’•sË&°gîç öxv΃ùÝÝ“®I/î™û®è”+bMaÂÞ”(u ™²Á¤Ö¡EÒ #4DÙaÄ£V¾&/ÝÓ—ïðíÃ|¹¸÷Þ%pP…|UBU*À„lG€$F( !@@¨(€™Bq`’8!MˆÁú<Ï»G²×¿^_ðñ×ùyÊoûg×»KI®‹jåãóþ?ó)ç³ÝbŒñ5´xwã<†N+Mou'F弜y¥áú0ä’²X·M¶ˆƒ›xУX˜McaCÍjALÚ /­‚Ü‹û÷šŽÇ¨¡ ¤Í•ìT¾’ã*7Á Ä¡ú]ùܘ£DhBÒ­|6e­œCPLcS}Ë6ÆÁ5ÚÖ*€{h„HÚP8‘HÝ–!°×ù¼”c¹õ5ñ¥‚JaB]Êþ󥸟eÏþ̽T¯{j×_½/Þüß_·ö¤@|ëõËsÏ3¼VpõÆõfnÛ›9Ëz´Ì7€6¶Çùô”# –ÍûM$‰ìÉêÜ}ü UèMÞ‘ d‹ZÆ÷])«Ú®Kß~3¿ý¶6ÉbÔÓwRK›jÞ­˜ˆ¸‚‰{†$ÙÛkÔ™»ZÝÊŠÓæ[»×„ôѤC©hefLÆÌ H€"¡ÁÈÕõùœôÈGTN±S"*îÉîè‘òUF¦t×i”>¶÷UáÐü gÛ¾œÐ¶Ÿo¯®ªóó1"ÜÇU-@}÷Xß_ñÉNº ;ym­jnÎôzÛêZ&¦­ãžQ›´%»é®ê3³?ÝЗFBBihN{C'ÜÛT ¹Iƒ¶›§&˃ʭÍõfsa¶ŸS×N¦[ùxª.§“þ;‡µu”£²ýàÉ´U,éõ³uÉûù9ŒÁ½».žü‚ǃ7”MQä€À#qÄE4b @û÷1Í@Â`,£*€]SŽØ© [ë%+$K“•ÛÐR¥Ö†tbë·"º-7©ä" ¡TFí†]„g{{Ý}ë™NE=ÍyCpצ÷ÇÖ›±oG ‡U:Zò­ÄÉ-„Ú(Ïò½4”¾};—w ßò…(2Qõ<ĸµqÔ²"0e`Κ(™bFNËÙÞı ¶ÝNjE¶ÄÏ-éQ®2Ï-4ÕnØP_Vd'nÀ‰4êsîæ-Z“À(Þ1_·©ƒv¾¼í2¼öºM©&l‘ mS(WU+\ò@gq¸¢Âå5—Â^3*Ì Ðéy@Û¥—p@:¨Šô3pã(j‘ ¯G8ô—XÝý¬z=xûõã¸Î]D~¡÷ÁÏb+ºË,Äßyqª`<º]Pjû¨M·îÖ]æóqËr®[âx;>´—añvŰ˻UÚX¹ß ¤kÚ^Â!_ÙÒ„±R¯I‹ËÉ6pYÞ1of»Ú3þ¼»{f#Æ#SOe2²M»2”ýñÖL(Õ½nîOûH8Ÿ÷åoºw1ìÚó劬TK 4aS8'ò>‡i†(Ò«ã½ «m”%íÒ#öº#i—ñ3¡Ù»ð BÂ¥ VÎC& OÄ{аä%H¿†.•o³#D¤rÄ·³Í×v_¯ç=“àBy>û›õ+_ßÿ¶®záÈ]×Ëæ³r؉¤V²ò®Ãw}³õµ{B9ãÓþùBò¢óž’\)˜èšÔpVY $ºö}$…¨îàËâq“|Jˆ]Ô»¶çAo»û‹\vüƒñÌË-?—æýºQ]ÜïØ?gù=Cý¢¡æ¶|ÅÍòä4J§*fƒFLˆ\Q ê2Ð.•%lߤß6»3¿Ä¼Á&”³¸i®Ì&®¢À¤Yö‡Úój»Ñº–ŵ;“Ì©&!uêÍ\ox­Š{Îû>]G÷ñaŸ'å/Ó:­¨5Žhùõ=þÙipžÁÉmóöp[¾–v€Ž&Ìl‚Oën˼£KK@ b³Gu[¥‚Þ¸>Y®§¸]wð¥}U»GÐÛ/EyŠu‹õ²aÕR]œ¯E¥*ÅÂËìQö#áÙp ¥²ºê°R»ÄµAydÊ,°%“ýA)Æbe:ç©ì¥¼ÌºƒO“~\sÝë>bµ+ÆoAœ£fxWEÁ´Bu$39œ†· Sñ+ÚߪÍGA‘y¶É{5ºâ?à+n'Ó˜m@iz`/q~P÷+Þ? }pŽæîíÀ¨ÎªbU*E×7¸-"UˆTue¼lKë²½€¢ TÕ¿ÜT—¡’x@ù|5€l}&jCrÙ“_‡f\ , ªZ¦Õ`¹ŠZÙ0I¡–±Ø“+z¥|õíÌÀ¯¸ß{̬.A¢ Vzõ,h.ª›1“aít¥\µDa?,6vͨ+;…ä+¶jºÂ=DÕXÝ1­b…7ä¡9=þփ̣&bû"¿Ù>ןIÜJ©þÅÉ¢·ìÕea:Pšpmbª 2ÙÙmŸÉs@ín짘FˆwëLFbÂQdÓƒœ •NDP†7àn¥Fe¹¼ÏÊ#î)¦36=ºöeÛ÷³Ì\4pq:„ææxÁ Áð]eZq!ášì÷?ù"Òà%•ÚœÞÄŸßea¼¶sp½’ì 9+%Q‚É Ô K.ê^ÚÜÒ<ÅÔâJ˜•99+éÏè ý û$‚8”C†ÐÉ€T‡úÕ£8Ъ,=™Þ¤º-‹;ˆyºý½ ø¢0#ßï¼"]’Nç̾3WÒãQÞcyf$¦ølTŽÝv¤ D XðNÐ7±…§ibR-²º|¶Ö‹uغöÅO¶¸ç9R„D_uë‘_ø,æ#¦{â!¿I7ð†>d­½¯ßûb›bÀñ¤ê— ½¼4€´sËléš­v5»úõÊ;¸”M˜Ì,(Ñi{V½äow»ÿ?ð>ºOÿÎ3¶ñ^óeüÌ |W¶WøZW¹ra¯³;M·3Xž¨ÔßíÁÌm!Z–"a€½3q( º,™vRýªvßâ¡©âÔ›âñÕzÇù[„Tž¤H\ª«Ÿ¶¿:âp85U¶Pí/'ÄÅ:’Èž‹{mwꉡGèªÇ~ÚÅ%¿z®—¼î9”ž\â1Ý¤ÌÆ‰kíÿ|©¯göۯƽ¹í×wíT 1¥&퀈P ÓV›” I—I,ÐlÁÒϰþèìiþñ“ÊŠ`2uÈåÇS¶ò¨•C’…H=X-ùfœx¤løÖ•µœéV•tr¨° §n£µ¬`Ñg¹žÉÑÏAÖ—´œ…6vÃ)A!ë©íÛDT¢B)ý†Fݽ u¬ßîœ/Ô½ôÏÀïö3þ {#µ~…ëqϱ}õávз£®-×ólêí3'슸DlÔj.ÍC¯b÷Cù3ôoÎYVÖÙÖ®½âÜó®÷’úªGÒÞHÙÇÖº’S6}T?^¥Hbˆ@*VŽÄ±%†WÓQv\ËúCΠö…5F×äòõf”ª•.qN©,Ž,îH‡œá`pÄíþá§¼Äú|éæáÁRKá"d§®¥æ%« †ƒ¨Š”±5îh!êt®FÄ´/¶”ø6w#vjhÆvM“RLZaU†©m#_BŒÈQâB²fKﺈƒà !µHQ—Uù¶\Ôƒ0)Iˆ&`66qÆ Doê: 5~·eyqþøó³ÁuËS‹×›ÅÁäp²ß,^ŠhZÏX'2bæÕѾn™ÒãszOèÒÚÉçêñ“>îöËqz&ÌÌ}÷ÚÿìûÇý. ØÌ}ü3ÜwîÏw’ö¼æ½Š—uc !QÿÌÏ/_¸k Ñ7Èò¾V7ç¦[ÈRú˜Ü£Í×ÜoÝ/yq ±¶µÂ€ÁÈ€€Ë0‡5Œ0Ó©œNóÄEj £ *A¨WgªÅ( &Xƒ s>¸V¾é½â6ÜZ8 O2¦y¹:Á[„5fEA.>ÇÕúm˜œ±uJ|”¿­yÙ„ X³:UÀ‹J&(ÄU‚ŸÎp©7Ùn9nfß„,yx_ïý&Þç¿¶ñsQ*ºÚ×ÕÓ:Å-T£‘´¸}çkûåQd‰ñW!qƧ@èÀÕGº2 æE)¤¬ˆ"ˆ2 Lt„Ah-L­AÑà Ç-d3ólÿj<_ûpÖšO! Gý|Ó6´ dD2‚Ѭ¹×o8é~(o¶Od¢ÛÛÙv:ºpžÞ½(+?ßÇ— ¾È)¥IK¦A‘$è"‘q8$(8íвˆd ÉàYçñzBOi¼¿žåÿºz~ûøç×ýÇSî¤üÌ%3~ÿ|ýŽÞ¿ð'±}ÈsÞ=öæ × ¶DºDå …ix÷X‹p¦wÛ»e®5³‚‘Ëx®Ü1Æ@uCŒFIÕ€´uàµè¼ÜygŸ!Çóç2dÅøiƒ¥ÃÖØ Ó1o@çq¯!+ÛY5ØÀê(eÐ-ªq9€HL¡¶2[Qr¨Š­  Ò¨lI’p€êyÍmÁ>þ¼øuäDÈë´¯­}èçëÍg~ŸZÞÓ²[Lžð™óñ^rŠ›p3vÐ,Œô'{M¸}ãŽà¹ÖÛ彿f£[»µ¢;z8–¡ 1¤Mg>`w€!$dMnÊ2°RŠ ø£¢ÔÁœ1ÆáDrdJ+vlÀŽ2£|”šG5{ø+ŸúÅܶ~…õŸÑÄ90€@Á‘"˜f敊B` Ë3«n.æç WŒ>­Œ»n/¢ÈZ"€ €`æ7óZÙïÉ»”^ýµ«´×ŸNª¬% FG bÁÔZ|dYж ô”ïÔá5Ô&ÞØÇ:¬ªË™NW4ÖìvêY꘻“M||ÖéßÎ…?Òø³ä™åª ž †tê=0%¦¸ìx]‡æî ð9Ði•ôJñâð7ñ&Ì‹¦Ò­mèLNê‹.—Ä0Ѹ#'g§öù]}vóÑôÝ>Â+}®t¼½Rè/[kßÈ.½î…L_šÓ£mwÕá±þyÈ?­à,¦-è ~¦úvû¿4 “„NP@€ÞûPBL©XRlºˆ'´Á³ˆ`JÀhà©c U鱺Ž.­’B‹x‰C4eÍ5•T“-R“¦ó„ŶìÊÀ×ã,¦vF(=ç L:ö{‚GཞD¨! @äÿz¦èŽ©ibªú!Ô€Ãñ=ýç Þèbå2´¥¨ö^šú ëÜÀÂvÍ”»Ä7ûåR­BàEJôÕ^ä…uІ%h#¤OÊÝJB›½,N˜øZùrT!ÁN>X`-±”¥Xï•u¡›¥ñuN¤Ÿç;åÎBžÒfìÛ-ÙM&ô·Ï÷ü“?ïÇ;~è¥ï¬îŠ!¸ kÕ׌;®oŠHÛ‡ó}žP2üf–™•Ýk»ñV_|Ø¢¡ôÒòkö^yòb>3p‚¾·}HQö†TxõòžÁç#¼æ¡·êÖËkºÌÀƒba÷²waÛïa‚™¨yµ;îZ'÷1¬)xÁÖY·Œ•öp óÐÏú,dR FÐOJí2rR4Ÿ[óÚ™EªÌ{q{ÆÍj¢d—£R¼ÄŒDÏÙÌŠOã•­À€—¡ œß,oÒ¼º± 'Pˆ@ÐºÖ €i‚Å*sV ;íÓs WÑÖhd´€Ì•Šð8”¬à"¾E;0À±€Í ™Ïš8Bîi?@«Û™Ð„O¬ûg‘Šé@Èž=©sß\쑘x],É=éÙ4gIX§l:¼HU¬q_òßhØ]ʳ¼îxجXifb¿”P{Í(ÀUJváAǶ¡÷ªaw'ÕL1Ft¦ÿ²‡k,\ÑKû¡—Oûotº?ß«¯Þœ )J ®„ƒšdµ$6î›®ØE¾ ¶ h=ï¾{©WÇ’…Ïz0åÃíZ×P;W„i÷ «[鈖 9-”tªJí(¨âéYåSn~L¿É±©N““Sõ†îSOê3oÖ¾A¿`%Ú×¢ÌË c‰Ü4 µB¾ì) oš^’f˜¸C,*ë]j­™©›Wâ³$wm_Úƒç¸ù”ÔŰ_)O äìlo°Õð2aÛY­ì‘Ý…yÕ}LVÞ…×ÕhËÛÅ’“•qŠaUCûô,‘e8CZV×0îÞÍß=W77e²¼³T4@õnú‡ávÆõy6¼þàÛ¼«~õ^'â=¿ê*Hš¢§i¼MÇ`¢ ݧKþ§þØPš ‰#ê@;V—&oþômï[Ög(d7dê€EsØ<Ö÷¾+gØ÷µ‰…ážÖB!ûÖ””æE¡š’òÎNT'ZsG`­»Ü”LaäEUU§Ù‘êÚ¸uº!<ý•<­šY‰^ù8ö¹1ëgöìÜ5gtÝ(EU™úDw«1œ“<¸ø9¸l:•ã Jfº[ q‹,KÏ›êMÅûÈÁ‡à fåá•[›¸£þ¼]5gŒl=*ØG–K ÒæK>€¥Wôj4FƒÀ.àµxÿ@6­ô ¢»ùƒ‹¿œë_ìoëèÏLÅÍ«œ*J Ïs™i¸u¤Šl j'“Ÿ´:ÀèpÿØÙVE<› “€;Ø™-ØV{ÍY^-íÆ¬åaãÚaÏž·ñ.ôŸ³À‘˜ò¢ î· ®D•š®5ªT(]¡ÒR¤$“kjqªdLÌŒX6ò[RäMÔÓ XaÑLÐñ1ü4¬&4££i 5FIB-¤e‰SbíiÅëéî }&Óèú^Sv¢ÞÄ„e‚P$ÛûØ@ÏxÝÅŸNëø)ö¡eÃÔwÝÞ©Tò>IØ@,cD<þíÙYwYÉo¦ë:U±ø0<þ©Ï5ñÌG{^ߺåœjÚÛETrÓžÄäêa¼ô/„‰2·64*qÑ)À(M‰2Òadp>åM+VQI¶c³¸”^‡¡¤ÐœYÝZRÃz¬Ÿ0Oò·ú;úù”¶fv"DÍ¥ÁÁƒZ®…ú›‚ï–r2Öf±ÃH÷—Á¹‰Å·ÆòAb££x ‚‚l„`Yªº„Ÿ<úòÕßø¯ß×·ÿ¡Íœ¸íàKçžOo@XÖíÉÛaúå‚ê÷€ïŸ³ý…ª^@2zN+§@ˆQ™«I4K’q`®t··PX&ª%}MfÐê|×ÙôËÜ\uü‚h Q’€ZËÖJ FI%íá) ™Â$˜"‘ÈB\ H’ 0‚Dîi†Ò‘žÖøõüÉ/p;ŸO÷ºõñä·K:g—‡>?î¾Óü¡ßß¶ô]~¼iU¹FY@ GO`õˆ&ô]'Å8Ë¡@ìæEï½yP ë( ªc!;¤8° ¢tM ¾-¡5PfcJzs) ¡ H©( ŽòUC$ D;rZج¢Åt‚žXä2ȤVÀ™hJ1!ä Fh+ŽÕ–®vÅéÀî´Ñ4H?ͬ”æ}°5&Hêl^´OÁq—ÅŠçoœxó•ÁÏ'‘Ê€–É¥Ó„¹OæVfŸIŽ^QŽ^Ñg£­îÝê2’=ßÅeº&‹nÔùmùͼ‰Zr£‚¡X)DÔBÃ)é!ÃP™Ûqßc—ðŠìÆ,:(,”B:.Ê)ѯÉ‘‹?ŸüÇçñáöÉ_ ½Ñ>µïïÕ_W"\ ÈŒÔH#`sѾ±…òigj¹àu@^ìz7«?ç1©ÙM2­t—  >ÕùV @˜@(“[ߟµ÷Ï蕃GfðÝK‚žBƒöÝé›…£| /ÍãljfˆÝ÷õ™=/<®áŽ­Äƒö_¼¼ÊÕ^ðçÇåPs~ÏùŒ–~žÏoý›Ÿu7ñ?m™³ÿ›Ù1­¶ÊqÐb˜ÏŠï¸´[W&7zõ•Úß÷ï¶ûË…Î*X@˜º0GGº/v§ÖÕYØãǨ\“²Î›òË@ÜX3*gNiÚãâ+Ká}ÁÂn CNjÕ»}/·Ú}ÓIè†mÛÒ€#æ`\ƒ¥“—FƒÐ(™Ù¡õ #þ%`8 !„ùdˆ”¤ >³I7aˆk×m÷y–­¢EKLü·•wXÇXùUo¨hªk¸ =ªtÈ´®´­%8ïû= £w¹ˆ—Ñ“–Õ1ôpù¯ÅÏ_Ê: ‡ùbòžAÏ›ñÅ×k!ö”ÀsëòüiñúŽºcªÌƒ;Yµš’®ßújøÉÛw%6_ 'ùÒº¤¯©×â®Þ›õ¬-jãb©Åǫ̈¨›o?ó®ÉŒÊ²£TÏwÆ}@‰¡U¶dxñù•-0EFÛÇ®d] ƒÄׇ"Mç>*ÙÎ÷Edm…¿F¯™©Z~Îüh\1PUŦ=¨‡³³Î£õ)W‘}-?hÀâOÇŸf~ðüÞÏõS/xß¿ïcÑêƒ-Ìj´»¬V.FÿäðŽóûRÚ6*aÏ$)$˜¢OÆ\„LØ z< Ï6f$‘¸€Q@¤p‹°ÀÀWâÁéÃ*Ø™gܔ˵*Á-óJè½ãI„ÇñØŽÝpª[í- 3íü~7Zž/É͇y‹`Á{0zšUyçI)°ËAKJ ^ïèfÂ%--¦Ï¸E©ã–ÙxÞW0þn¸í_¼JÿÑÝî¨kTûºÞ:šA†ßc)/à›‰øé¡íô%§‚mêgÜÅ}˜ÇÖ‚5–ÞI?¿£³Ìœˆ#Wƒ‚7¾7õ“°€²t=¤”º”m² w6ïwâ5¸§7Úã €C4±ÂµY†ìÍ6û¶PK`j«õC±nZ¡"XÖUºPôýÈœŽÑ«Õ1úRº «±!K§‰ðQñF—f ‚´Rš2A]i¯í8Ba™_ˆ°>–B©¬¢†TzLn‘n.å¥4×aäfš«p ˜dY+ˆº«Š¼TU°Ñ@Ò”¢ÔVˆÊ;ÔG÷®@ÙPÐÈ'¤‚¤@øŠ±•Wöwžƒ£DÙ–F¶ÛâL~ruPsçÍä 10c¾ ž5Á@6œXv¬Â-–_È+·à:W„ÅõCµ(N„3pZWÝR¡º…_XIÊ9ÔMÈvU‚4ºŸºRÀcËS¼ƒGÖ‹s™ŠIbn„tç®–]AÉË@v–Ó ›¦º’-Ï/ÊUPvDüSiÏŒ¨YilæN7xÚwTŽíûŧÿUÿ}É?"Ÿÿ€¿¸-ÀsùOÇ¿–Þ[ìxŠN]ùjуo\xÁ•É™þ—Oï™ ÏsÿxðËóØÐèÓ'È rŸ—¼YAÞ°ET>K•üÓt™å£c¯o`]’˜Ž`--Ùš¾ ØWmÚ•y`[+Ø2­ÎCzC9#›ýi=²g„vP¡ ¤:ät’€tÀšgMe&9:ä;sÞ>8eVÙµ'…2–ìX'ý6@b `¡sB l¬ÔðÛ.yH èž)L7]à|v̼&Ók%¼T–½,Yv‰GJN´m—[z²&‚Áve›9i'[µzÞ(dE'zÙØÎPÐH™V—d‡Ø|ddã/QYúì~ NW}(fÆð=ßH+Ä:IµoEƘÆ<²ëoNˆIÃÀó9Ál@™¬x ݤô›ü ü!é\‘#$úâ•jÄeÉ0AOÜžÑa`‘Z5QY$a™@©}9e?ƒ”5ð0<\Yü=CŸÊ1P4Aü`Žü]f†¨È Ô“¤*J¬{.ˆ,õ0 ÓDPl‰%³b{»´àäÏ¿÷üÌíåå4±ùæ;ý%©;òÈž^¥pdU›õmë+0¯#€ £CÞwV††{Ã3ì„Ä‚Šrs}¨Â6c\ƒ÷ê¼ãêªÐZ®Wà,‘ɲVA¯ˆ‰de°ÁoPXŽ@#ynçeXOBVRåDûB†¢ Γ A€YRqç…oœö~/ñâ=}B"Ú0C8Îo½°>}{˜¼j=ñ³]¨íh×Óm:ŽõÐmaªh«±ÊøYMÔ&Ðí¢ã,[ªÙý¥ÃBìõ§÷§ /SêoÑÕ áü³õa»c²ž)Ò±ÞP (ifÌ hÑX‚´ˆyle÷pE@¦Äƒ(ê¸OŸ3é Zû(êrh~ð%ÛáÊp|[Wà)ß·,$úGÓ;rÃ]9 ‚ý•#÷© {†øÊ¸#dÂIÛš z?r¾{«£ºu9«-òÄUé Õ§A‘³¸ò¼‡ùà,Þ·¹Ë:ð”øüô}Ý3ùäN³F ìt7ëeŒåº_}ÄN¶ø 8²†ú„ñ%(iŒíŠÛev?ý$ÛLëTÃ,äØÈY~¬hga”ko‹K{{`©4ÍLuäÜÓM#£ÞXŸÃÒRVì-ÞAxo"#Yn愎†ô8Pä¬up ‚âF0ªTa]wpG£ jV3©ËªÍÐu«Ú ªLQ˜QÐTψâ…R5…ë [õØUyӚݩ%TжĢ`ÉÀ)‚ÅŽŒËQt(mZ`ÓÔшRö•ÉuZ†Ú• [z jŠ(ÑÕE\¡ ÃÂ7 5ëÒ”GBúÄ2­uóÝøhá†Dfdï ̪¾Ú°ÄVB"“‰¬²µByf–™Ûj¢¾¼\}\¥ê}ÔÄÉ3b¡6õ¤és!PCæA}½„¿·ùW±ÊÒâé2ÊõM$ì­E× UQ11c®ÐE°ÝÝÄ1Šnkã«°T=ÚjÄÈ\ô’æˆyfõ-ÀÚ(Oÿ¼ÚßãûÕc¾­ñÓËþ½)ÍFM"…4«*9AÀÛ?øÝàäÊ–á¬ßT¤Ûì>RXˆbÀ\‡¤ÄñGUÔàFÖABÛݼܗïæOÿœkÎíïG?ùê{J¦ÎêîõßoïÜØÙÊú5°¾öã¡ùÐsÖ34½lf~ŽdãYΞK˜ÍˆAÄ“ÒvQ`¢bƒ€1F¬`"Ž@EÆP‹JGCM*„4ÖmøˆÔN?átñþœï/c¾†ó,Hû~Ù˜_ò)3°J&„” 0!Ô öX³¾Èù¶ïS4àE̸tîò8ö£÷OûçüN”T‰õH˜") ‘. ’=…B¹âd¤¤ÌXÀDA’Ø„©rKïV¥¦‡_Ÿ/þöùƒ°Þ}µO}>ÿ÷Ÿ½­~¼t¾@«¸âÎõ±ëÕG§(nAÉK*bö%wää±?îXšAŽÓ¾wFO·q'€E½RI#—ôÒ«Z¼ËÙ2Óƒ’ÍRNš6àÛ³‚Q ƒ¶}lïÕgr·£‹e76â¯Y\øQ²eíôxÄ=ÐÖö5Ð(’Ù:±ì¨ @ôóhËvé)b ¿Ÿ,­T–a[Ú!}!ÑÄ´‰_ÀNEb¾ç Á2õ.)Ði‹­-áÓùWqÆ`9ÃÞ d…ÿð7ûee<‚–l‰ˆÁu°l`r©)M€L¯TŠPõXš @ Æ›BpD¦Š×þ-Ê«2ùð¢{¥Þ´'Üt¤G•SKÄŒ’^ñÇßnØ>[ýþãïüø;Ù ¿C ú€–L…ó*ªI[8¢²Q´j&®ÃêÙ‚_¿÷÷ïSµã¡ÊÍúF(cm‘¤ü›TðUù‚žx$Ôz ûÓŒŸë‘y÷ š3eL_d=Ú×ò 7¯ih§oIÙç³ýìØë5ÔíälëÂ1Æý±ëIæèô·{ß©/Ï ++™ÉŸ! ]Ï^<ûn=)¢sòbíù-’`A¢H/æÆŠ·%þJ+¢¢Ï*µ;"@‘¬ Ï>Ý¦ÆØ ¨1âT‹†­Êµô&t¾â㇃þ:Åb ø°íïÐà—ÁIWÞ§},âéO¤~̉ö·ðÑ&tÂÁ¶ I&É=¯0ïÅ-¢Ô 5Àh¸¨’™kðž?aˆ„ÅÄ㢠X´÷(|š„‹x¤4I·S¿ì_É—*õQ7ÝÖe‚ÑÂ$lÉ€N˜W;·š3`7×m>&F‘Xœá;U@Á+ІÆ*ð˜VUOÎõ!}ñ3ª„Qpa¿¼HîbõØÌÌi|Î($5í2ìˤ6Záv‚' ƒë\ºÞÇ{’ %±” ‚Rª`¹ÿúÕ››²ß¥®eÍ•¯‡'«]ÙM²ž<,³öiñ€…E6Ì}Ñk÷`3ï[ÂJ±¡{zkà©"p-näûÏí˜ñ/†+)ŸÖ ½uìjÁù /ÿøÕ™?<¨áES.ŠãlH¿šB0,…Ýï_o +z*EBüPlaK‡ˆ¶s¶“úêø†ÎA«"Jûü®{íz½ë:¸–†Š» Ò“r€¥ygpA> åe1 º3ЃÝyß³U‡R;AÒ&³rõwÕÞa[K‚ƒª‰¯ÐZ¢:tvrw'DÈ«Mç ¸ l˜)(ÂL|B0X °º—} S %7¸˜@ú $VËŸ¿ÿíÏP²}¾ÏÑà„'èDÌÎÛ†»;#“?ʳ˜ð—èoåûþò¾=²ßtöwuaíu£ãàGÜá½£8`¨PÐÙq( Öb ›ª@Ê)\ç] Öê0±'’Síws 19Ñ”»@úÐ ÖÉ¤ßøÏ©Ð g$6¥!&KAá ¢„ àÒ©‘õ©æüîçî %‘Uß;žwͽ¢Œ4˜8>Ž«³ƒ)Ûq¾>G|k±±êö˸=Ƹƒá€`q@à~¬yð„22°Úz±ØsÑ5¼ÞµCTct¯G_•£¸:Ö³QdG!Ž|CÑun à Œ$½y|ct1ÿ´qßšã8Ω›6š0FÉR\ŠÊ²çég¥àHÍëëå´Ø™Ø3v˜‘‹;}Õ«Mu- t«ÓÖʽ˜w¢¦*ËYË«¶«¶@Ú0s oª×T_Ö`®¬²"l{ò ÓUMÓ8\Ù°‰ûœÁmF6ëX¨žWìô.¦ãV·€u:;䵌ñ¥Èãèljž6à{X.ePXÞi/4  „j%Ûaœ¹Ù =”’kF›&\^HžakTz~N0ñ-°êøºzµ´ç¶c¶ÔïRè%b¬Õª\É(šUº,b A[VD“°šÂÞÿŠ`åöŸ£ÞS¯™fæ[P¨ØlÔSnH\n½]¼ä/>Í€ƒU$l—OÍåm@’ŽÍqRR4Úù…&€.|2 ê¯GòÜFÍ…zƒº *Ò9R}Þ]Gˆ¨14€Šò‚JóÁÖmUT…¼ÎhŠeÐÑÛÂ©ÎÆÎŒVQ•‘þ^ûÃcv_žîœ÷ù á@V´ÐæTW…8âXƒ¥ÆÙò9ººù.ûfË¿|àìÛ'ªEPÝáè!˜V)†kT 0 AÀB·ªH«ãÂw@¾˜¨;1ŠQ¡l3º‹;7 •×1-AºôËþtµLzÅÃÝvmÊFFZÉ–öšfî>lçÎäÜ‘%w-ÞMoéæRv®¦^ ü;Ì÷>.?|Óܨ§;MBIœbg šñdЙ[Ù÷ù=O÷yÙçIÕ©Ua=á‚Þdž–t£´j»&Ng˜ªN¼Pƒà,舠[–‚)±–JDV¨eÀQ‚iÃ5,‹V€P¢Éj(±ƒÅÔìÔ°“"[BJX°‘PAVéJídÉatÛé–;†.Ù%vå§nÚ”«{çë›»bz÷lD¢PßIµ·ÓòX­i%…T™Û=¿Š\+S·{:ô™cJ’Ê-¤ÿO¨†÷™Þü{aŒC”e @YQP‰iÁHŠ$‰äÞ©·TKÊêÀǤÖ¾»%¸¤à¬AUi&Y[ OIM… «4YÞü¿ß¼´4¾op Ÿ¾W¼£ýé™­&µ,Ö`ŠRAKºå4^S³!iž¤Iý‘ÓR–\•‹*@•ÔŒa*à _‚h„(Õ¼ï8Ý'›æ;ßkyß÷r'ü8ê1{(Ÿã~O9xµžë|¼üý=ŸùŒ÷lDÇ’ŸÒ»‹Áè8Q4ñ€€d…På Æƒ 0ÆhÀc¤¬À ‘B™„äíQÏܾpƒîµwÿÝ}Þ©ßOó÷ݼx˜uØÿH—ï”ÇõçxìbadŸ¹$çà³§+÷åN&=+5‰Á$éZ®Îµømç{5”=+x&’蹂CB@(q€ 4gO%JšWE`ªkJD¨E‘¢ˆETúsǯçÚ—û™ÏÇsîÅç#¹N÷v`æ<š1}\uÓgµåe£…­ú9r×çl'ÝöÊörôíê)O†›¯FظŒ¯†lPÛaÛ µÆRº1@P  7¬‰Ái'­KöÛw燳ÒI7aØ‚cJáÝò°þÜ w +H¸«A@ã…ôT´AÖÚ%l$¡¢5z‚(m¹öÚËéÞWò'Oœ1Žb” ’‚$Jd„êá(ÅÔË™.$&ëj¢w±vƒz`¾ð|Ì/öÆíAz¶’Ö#Îâ¢Ĭ/Çy}m?®ó?Ê^©Ø-\¨éÑÒã%°â¡‚Ä~]šù¬æý`÷ºžýöu¨"¤šÍc£&DêŽxü4ˆ·óñ÷‹Wúw”tZ䳤ÿ-k'Á¡Eõþdð¹¿[ôã t ô„ѳþÓ^)t^9Ñû¬¼'~Q Š“ ÏÖ2GñA«a‹ãôüx­’’Бõ^:<——§krÕ(4Üêx†7#óÖ+s@:«@lV3ƒîkÖŸwÏཛN’^Oòœ³7_:ŸÔGzÄ+­h@˜€ܧ0 û|Š`eŽB<°Ðq= `b" „Té`í:LòCåøJ÷Z®e‡¨>µ)”‚Œ;°™ kð\+Ãb;n“™Ïê_’ I3E€b E"*Kˆv™)%ǪñÜ­5ukŸÔ—.Ÿd¼\ Ò×q•ÁäÂX5»æCÅ¢ó`|§Ì!{3ðÍ·VMY-ÙMóžïI¾OiÏ#§éWmÀ&’C™UÄŒ!  ñ9‡$ܰ ì’‘i;­%ŒÍd1m$n¯F‡×Þ›Yÿ(?G^õW\D- ÓÀ—u!€Žd² õ‰8Ä(íâgœï)ÝéˆWà¢"ÿ­IõCêúèa‘ÚûEø²~üˈõóà:”–Ìn•µßõà“ñÅWÀ£ô”~ñgÜ÷4Ê%9$Y{’?6vÿû_VæzÑ ¬ CÛ4&Ãd§)Rqx°~ÎŽ™ §¿ó²•ÔÞ1;_nß"ÑÔ[ãÒ“†yÕø–@â0Dßê{×QY<Ód2 »$o„–ýÆ/#}×Û…×øÍšù€ªM/úâ̱S‰{WÑU«ÿ| m£¨1b…åÐ N×[düdŸGϯüßÏ¿_åyKv–šÌj~x=üå™wòßÊ:öåÙhàê ¿°*¨rMÀrxÙôâGËp”ôÌ+׳´åŠôH ¡t5GÁ›zÊ}0;œ6a{©‹×#P 4¡IG/z—R­D®x{|ßð(úôLa±¸(A‹Gè^¿õÒOm¦-\Ë»À@ÞØªfLÝ  ´`±Öt_ˆÊz…M邏deªÃŒ’°ÚÜ{Xã±34ßt7±™LjhNÜ«ê!?‰hå§g´jÀ€“€Êùø¾c>,Jìœ Æ9Õºïx@€ÝbÞ 6¾—QÌ«œ7îÉÙá:4+¿Ú€ÄÊÏ|;'ÊøÃ"Â> ´Ú¦²VŠ^ (Ðeëõ§>î°¹À cót¼íMg^,—žOTGZF·2-ã#sÒx"¼#(»ÞßæhŸØgôY9æ…À2D2,£X¤2 .ÙU”7ÎÖ¬ª~Œ Ñy–¥¶" ž·‚®ë‘³ J]æÀâi†ÙØÀÛ\Ë,»R¼dê«ã»ÓCç‰YÊØI-ÁM‚À/Z± ú sÙ+Ò¢v©l hhe—ƒ‚“f!:ŒNÀ¥Ý´±%,» ”a˼(U˜ƒ…Åæ~ˆ]¤Êªp¨ÚÊÍ^¨uðÐKiÛ¦‚ì-oÄH6j¿R²\Uefmg8A#03:X8¿O|–âÚJ;|Š_tg˜ðx¢‰DÂ2E³<-–ÏÅÅ¢Wî¿!°ïŸ««ÿ¶÷ƃàd_âò&AÜa÷ Ëº¨ü".¼]'1L.€= ÆÄ˜ˆ^ÔíÎ/ò=KÔtñ°§%¾›y„`áTÈC-4X©ìKú@uôWÄv^È ~P¶kÇ\J…´°Dˆ8ZE ¿ÂˆÅ„S¬d÷`h†±ô{x²²ìãé@«Ö³àâ/û‡½“›ãv„ŸÞ6ZÆ1:UÎ#I‚KãDÈ õ*ïÜfN5"¹`n…ÝÎß³û}ì=ùŽG‰x¦+¹n€Ài2'‚ÁÑœA§Á­”O»%\KÔŽ6HëÌÄQ u&Ú+7ƒÆk H°Àê…‹¿¶¡± zA«• ¥ttâMøeŒ~&pôkwÛtñذ×üdž(Ð J»x·!×ËLz™Q\@sa_¥QœSâðÔjTÀÒΤ°²7÷ã³^~pÖèE[¸h„rÁFx#^©£‘šìÎQÖ­!8kÜd‡j,v¿Óýø¯þù/™:,&cÓ ÎùÁ†Ëb¡}àT»U€Ì/²Âß$)ýBL„&Wiú DA HÿÐÉàçR0ðhúB!êÚ -¤²c³x^VÅrz VÐK¿Œ¬àë/ôõâ¤rr=›˜¯}ý¥•óY|S¢æÒÊ´Þ¬ ±´(BT FÆB¦SðDa—íQú׋ÏÐÆ$ɱ‹‘ˆÒ(b|Ô#Ÿur®<¶âOï;Úç4Ç-ù`m9âu>´>ãÓÊi¡ŠÐ’z ½®¿zÆ´Å_o«z ç¡B`äüîåùé½z<÷CI­)V™ÀF¦<˜ ͸:ûþ€8çÌ §Ý®};i!¡:T™gÞw1'©Û>p åQÚBÖ½'W±%-zá¬H——ëHŠsq3úZàœ†ÑÌÀAo¼¾%âe§_áãÂW”b·38hÉ~CYÌ)¿ÍÚšuhÙ~}tÍo¥¿¹ŽÎ_CßF!$P‚€(»ÿ?T{ÀÇJ2¨ó`iÂÜ `ƒj=˃R -дb)]ľ꣫A¬ÚFU›À1´-h]ÖBö9"‡œ³Úãê_ÿR"ÀŸ½×´ö“d»¾.CŠr¶øä¤ˆgñâóP©³]ƒRP6Õ©ÎÔ ®jέѭÌ-u‚ÛRœIð¡¦Oð¦yE©ò¿ý·ÐÜx«XdDPû˜èQ“ Ô|_¹Ý˜TN²½d?sÐÅØÈvq^G|­É 1\¾t¾]úÑ}â¢s¥ J´€+XÌ’M ¾ÉS€:¬!,9¯’¿`¨µÜzÐýãï½ ƒ€Vœ ÏdX8_O0€ªA™˜rl`ZèjðÝàíJ}^6ß0¾ ËU†À)ŠÉÞ¢“cŠ/~0ü¾¢ÏÃS²¤8pÆ,6у-<‚–%zpç’×!õ<õ ooXM20êPÁ¡k¥¬±ºÃ² 7áêÞ]ÂÃu<ª7²º3òÑIÆÐ¹Z6²gÒÚ‰3Ðg/ä“8üÐgủòë¾ØnCµ„1"ž&pB¬ÔeI¥N¯‹UygõªWþRÿËñW¬8x ž•´ÞÞ !Š‘’H¡wéI¡ÈæM ªŠìÑ'>Sy£¸p–|‘°QÒ`·” õ(eÊ g7rV<‹÷³ñæ ] óéhÛ•ZR½X‡U8š¬xbMc`g¤G FBîíoÐI4>{ P'÷ÛÖVÅ~cµgï £ê°&cƒ"7Fب»3«ƒ²qöa»l™Ñü™ÿq0YsÆù µŒu2³ë :›Ír„B °úJJf{ÐAŽ™š§Ç$fÕsøÍƒÓk€œœ‡yXHÝ ¼ääÜQd.ß4à}_îÍôöÍù{z¸ô¹Ññúâ·Þæd7Œ¦Ž‹ ‚@BÔG’z¥4žØQ`tV±[L+‡…ÁÊå{‚sþ­×ˆ9–Õ|PÄ@ªš¥Çhvmõ€ŽË‘˜$%*qdÑ@‡/Áu)1È †¬HWK/“ˆ}µ#¨Në!i¦gEŠ,Œ›³w€‰@C`0Îâ ý½ÿ¸†fÞþÖ_N'ü•ÙÔ.!€6Ö6€0% ‡Ø-«|JÓsט¿º«ê\…»¥xé¡5±Áf±Gµ½xK §H#”ê q˜ )ä ËRñpõ49Œ…IH–d[¨å"6¸ÌØáËñóe¿øT?±¹OÌ:wˆ×QAg;fX+½ü½­>Çi¯yÜžûÿ•£ÇêÊÎì•^y­ù×»/âh:2”›T`\”=Ú–XT!ÑÑYÌûÏ<¡ÐQA\œµÆ ÃdñT½°0ÇŸ¹om9=ÁìWÚ/ÒæKíè@&ëŒ:Hø˜–[ibÜIQkzY¿jCÁTØÍÂ% %ªî"[}6{õÊ~Ò'š`¯˜lÜÑÄØ3ïåwx½k ÚôƤ©ºSe!œl©bŒõ®ò¦{RrkÐ:Iপoe/8¢@ÐËæµ,ÚM=ùl²ðì̸(Ì]2Ö ­þ± ‹¦anònÃyQÐ@¥«fÝ[k㕨l\DKn< ìšöRÀêu\o| a#G€8`qW¦2ÐN†¡A¦†ëæá‹6L]­{é¯¿Ž¤§¬Æö˜EíÀÍ4©ý—…¿ºü—±à¡Â(,D­Ð>ê`^¯élK–ÞðM®è]*(JYÉv ‚O¹¾£Ëœ®Ûl´’(Õ-`Lw0 ¤Êð@H@˜o8‰êkkóõêZV,D2*!`@tµ$&¤S«Øü´ý£:ç¸TØ b<@$„ˆcËé.šXaMÙ @ KÅà@…µÀ¤±ƒ"`\#R}\»èجlúÒ* ¡&ÍY|Ý>,QúJõlt¸Ôy|U-Dh´™Ê#XRp)H! )¤gD TÁ‚ ±nx1Ô$¹ä5°l“ñ8ä8:‰Ò€ABd“Œ8¢H›D¦¤¢¢îµÛk³[~7ç'ì¿Å¿|nÏ¿°×µ4¹ Rmb>MÉÕ¢I“JëÇ´è8 ­x·t5½Íž|ä‘'NU‚QðñÔ¶ð>ûÙ«×õß9þ€á?÷È’êwÚ{¿ÆûÆ{ÚõÑ—d.ê.‰éizNÙŲ¶?R£ß7{¶x÷ËÕÒÁPм Á¢<>fï°¾J® ñ€ !‚ ²’ˆŒ"¿RH˜BQ„`ƒÕ,£‰©g×þúœïÇþÝ¿ëÿ]î÷®Ï¿?ïy¾gþ)±ønw=ù—­?g £!ö6^ìÏ¿ÇÇî•Ýgvxœ&@p¨!HZp8è–\’MSò±óýQ2øL×OÉ © e”&‚.H`„’fmÂ,@!„€‚QTFŠ7Qä0°Á@º@’-¹­5—§ß;¾¹¿ÿÓ?é;?_þøÿüÏË~æN4wrõñ±÷óH‹I¼‰Vx"_ò;ÒJÓ³Ôˤó¢çÆ>?8þŽîi¼Éé¿¢øQ¢é¶ÞM«mÒÛapÅŒ ´mäÀ«q©“/íY•H6©ÊŒwæ\Q›Z‘nC!]b×sÛ Ôö×#»Þ&îÄzC k t7bceµÄZŠ[@J"T$UR—¬I·ïÅùPk%™î°=Ú„ÓØ´ù-Tò&hÓ èZ êñ€ /¥Žî¥z €Ì±8 ‚܆Gĉ‘KùÓù cá–“JEó ™DZ+,Ò™ÿ–ýÇ6wßÿm§°;àÁ©ðv`–\, ³†± ΀ûh`RÓT¶0N`ÅÔÅûcê>µË”´çè~;£¯Õ?/˜ßAZ Ëò(ŒËc²bØÄ Iˆ =ªd‡µ@ƒº+“Ÿ{Õ¿ÙNBûuýã¯÷.»ÐŸžã36dlœµãC'Wò-h(VJÖúùÕ»û §úÏÄ’Òе_åv?ë¡»ërJT Ô(×¶#³IuEM#^H¼ãîWž”#¶ÍÜ“#~ÝЈfdq’l$h=F3‹ô®„]Ïý o㌱îìfç²òáÎ ®oøèæ|]K*Cƒáã.òåîÖÖn„½<¨QÏǸ~V¾•ùÒݯ¯#Åàš%Júæ\ò†pOÃÛ9¯kÇì*ìŠvzê×çtcøÔfo¿ã\ x”ÞâZ!F„1‚PÑ --ˆ(bd»Ts0*0 à&Fð€š †y‚ºÀˆª-]¹–U¥2]Œ^GëŽócÚ¦ñNfqV-g†Ù«Ý3ýY}Îv1¬î†X1ùTÿð Íáü›ÿÚDúö ~ÞΛ‡¹ª5¡é eåqœ†BuÙ b V™"“¢ˆaàz;Ý{•UŸ‚™îúõ^¶t<…£ôDr/ÚÓÇ㽃WðúG[wž¼K(Ev¢òØRÓP:Ùj ÛÅ)Íêùþ1¥Ú°¨Ê~>ªªæAùµˆÇVº'ŒhN¾q‘\³ž!h>£Ï¢€ë <_‘5P}ñáxÓ w\ù™ë]¨‘ !’bð¼È^o{Ÿˆ¡`‹·ð>è-¦eÝ ¸_”õ=ì3½³Qå|×ÝÊ}àÔ5pU™èŠh}°âÀô)É ã “_h}×­J†UX0„IÜoÖáð.×À|Õ ñ \ ¹³w»©Ô͸MÃT­³ØeÂG^U¡‡¨º9b:(Z*ؕ䔶à3u#éô~q~ æì^!ƒä°úZïÄñä áÛÁ¥ÝÕ[ÛmöºëC5® —j¶:p¶t‰p¸$¼çhÏç$uÏýü¹K¸mD]Ô‡X ½ûÇÑÞ“ÉÓØ— ár² BÑ擄'óbÂ̽[*Ål–DLjè¸:”¼ÞÍg£hÚþ:¿¨Ã™ 5=x…vÐù¼ÇHð¤ˆJt—¼HNÇßÏäVòäîFlÒz<ŸáükD~mâ?wzM-¬ –]OžÏŸ´€“(ir4gÖNèÌ™ðf›):eu™oLÊ"8óo)¯ÝL[ìëÂÍqH3E€}Näì^àRüÚ©§äv¼2Mk)ºÀiM,2ê tíÑŠk­0ž©PçHNJj>y¯ÂqKE¢ø*íUÔ&~¬ÓM4êš?‚…'öR2Ì·s,¿¦=Âêct ãAH­!u»ñªÅꪕ,ư\ts5Ùã6w™nŽñFN­Ÿd; è‚.ãK F†h´rú»tUYÅV ÜÓávÙ5ë*Fêˆû´­9<è™UןÄ#‡ÑÑ  —Àóá½MÞqz7€ä+ LÅ*¦!UQ ü%Rr#ÏþŠ®u[¯çsŽ®^õë~õ¦žÀóXMQ’(Lc \´ÎR†¥Ô+¹b€AJ «q™ð¨¢é ÜÃ>.C¡ \ðÇr¥fõÚì( nÒº·™‹ÀP†Ç¯”Šò&AÈ¢öJ½l¦€¬D(2Ï ­|t ¶éIš:HbÚ¡Û$*¯¤Ò `,‡#ñþžgç‡Yþ/«ÿŸ4VòBÓiÂÒár6«û…}9n+l–Go1 XÀXà€‚âfØ'^ÝAiœÑ˜É.&N3€}yÂpçí&y™_zUÂ,íÃ6àê!O0¢ÉZŒÄr fŒòÑ:=ÚQ ]•åhA ¤5ÇæŽ¾LFªU!¤º(ë>JðñÇð-fÔp™EÎý¾g6Õ mÆ_æ#äv—‡ß¡¿Òuþ{%xM$¤3bº%ß Î8ªws WÖ³7ð–›Èq]¬úÕDvÕxW×½H¨¼S‘qÌ+y™V1äA†B‘´E´–‹ní"ÛXAq\‹ r26cVÕxd¬r –íÝxµVtåsýÈƦoǹ]éž§ŠëWr| èŽ_ý¥Ê­½„zŽmãß9ÄÀñž *ÿÊÝù6±uRA{-EÊB HØ„¸šê¥JDàÞZEtG3•&[X/üg” L¶»ô&ëv¢§åöÓ·^ãÓ'Ó³ YÜðØ&í‰?±õç ^R½ÑJHEš3Úòjö0Xöä±ÂblWR•ꄀ̰ïãCÅi0™uÈÈzØ¢ÓEaÝêè5ÍÎm ÐÏšÜnåG-ï\yš¹ÊbO!v›&Õ0eND§s||sœÝ+‰ÊB}¹.¶5`Z…Ñ”Qs;ɶ+™T úeõq®Yøl……Òv»õ‹˜§åºmBB-´™kÑ!©ÉßÖi¡©  29ŒèðjêH#Ô› h_'kõ»Ó_*|'Àr>¯à¦x(º–d„ñj®=ðiOÄÂ=ûO̸Ýíü3aûcí&`ðÖL×I@£|4ƃŽ‚ªJêßâ¸Zy‘¤Ïß5<™‹ËÉZª‘U«Og]„aÎîP³öíª‚'Ç’Ù)…ÕˆFb™  pjäõŒì˜Š-–dc‹)R1P IÃ|5È™.K£¡7L'ˆ8•FÐÓ΄±8P£k@$Vb%bV‚ d*„$–+@xöÄQå|¤¦¸Ó\2%!qîë¯zùÛ—÷³·$T#uTBõUd­=ê&w@·A±â+ë›@‚«»;.õ§­5!¡e,‰èx EDêÛ‰X'ÃàÆÍ¨¡ÊWŬ¼&%Kp€BCÜÄÆf½)6;,(‘Ä[açNýÓþûqÉûfüÕl–Þ–Ÿ÷uµ‘0ºÁI= û`½Ô•¡úvÂcýÖð¢Ë’ [ç~öÚz7êJô¥æÀíæŸ½æ×Â=ÿÇ,gæï8þ;ª®ý]5Žžûø.ïÉ9svòµbËÒ| m|—÷[~¿â7½·Ÿk!@v+ì‰ (AÖžzTÐ*ýt®i¹ÛÞ$’гéZ;T²ƒ-ÜDâL¥Î1:íâÖ¦!ÄfÓ¡²PÐÚ礼æz~ÁëO|ðþ.ã$^c/eC.›€~LøçßNø¡LöI|DþÓ{½«ƒ<æõn¾úûU8¤5u$GDsM¶˜o&¹Ã÷”Ð+ˆ@G q1„ @Ra#!Lá¤%C F¾d 0qx@›*¤Æ˜Ö‹AÓ>9ûð¼Ÿgã£ù½¼’Ï÷üM»Ö×§¿Ýûgåc®+¡–[»#áÖñ½Ñ-;tm;i%K¤Û?4™ø“¾%ÙÐmQ¨‚й'Ìad¯ S–:TF"»ÔF„Ñ{ŠNE·ì ФpæÓ/³¶µ é6ÞN¦äBÆl˜)¹PG¨´Ò=–t'ªw‘’ñÒ%ØB D²j#¢/ÕØV ö9ËÛTK‡™{øÒÛ¯¢`C³Ì¯Vχ›?ÄŠ¢Âólú‹ãZ§Ã !Ô$xIG0…˜ˆ—¬æÒ"mxšÇKúlɃ J1ÚNJÉÿ ?qÿycÞ¯ÇwÎW -ÂH8—$gdLœ9wø;L€4Oã å×]‚„J}êýqýmðþöô°ûOÆ_q²}ÉdãºüäAÙÁ†w§½h4šn{FBü|Šc:PyæÙ™Øb ÜÏÙ.¹+wߦÍtåÊi}¼¯ßx~÷ÌyÔæŽVÛùé× ÜiS‰ ?Ï&÷o Ýõ—•¹ß=®ÝÏ_*몑ÕqW›wá­CÚ]fÔ·Ðw·ÃšÀÑ5MgP3ïsUI?|ÜK­‰}ÏcMé’ª|ö8ð!=ã)íë½Õ½³éžCZoÖà|9©ÝlDl} ¨Ê™@5Ñ”Ëâsª ¤u¨ sˆôõ ßFnDÞ~ê|R²:¿íÒŠBG3¢MVäÄTIY»Šú™ÚéÚT³#ä߇WóÚËîæA∢Š*…¸¢˜‹Y ¢0+- ¨£"•@„/ -,b(“BÁœPFaj0!¬ š{ÅN!‘äI®±ªÁ[Žªñrp1;,f  q»Î6ýG@«ÖP1SAUÉnYÔ×In«Çü±e¿­—%i‚sT1?ö”O“+Т acÅ]Ú²@ ìfÞÎêźÚñi ;Ö…Zždê…yXüªþév—òvÇ!꜇SÀ„&±%T‘TÊ´©ûƒ?nûßî£mg»cœ»£á°¹_#a˜µ‹CÚ"öÞÿ¿ùó«ùè÷Ô÷Ð:ù ÖÁ¯n”`œæ7ZFï*€}ñÊZeí³·-¹†{¥\¾ë2yb ±”íê"|TNÕÛR¡¹rÓ«}jøl÷A5äwËqu¥ÖêHØ€ *{’ ”@¼|†‚Öcð'Z±§•é2DLìµÇçXàÂUÂN›' myWØÛöŽØ×güsàRÞ@¬†lsOû¸ ¯H™tÞÁ<8ã¬w'B!\_>4ØÁ w;€y;'wg‚Ù[Ûp@ 'e~Yw.–­+z[7í9ÉŒ›3+YCKækÐHéF 0ÀË5VÚ÷Éýu?7³ÿ¢Ë_¸ñìå®õÅ{—³EÂÜ+жhf;MûåĬI(¯ÖùH8Ìì÷´¥ž¤³ÂdŸuuN1¨Š¹SWtõíIä£y½k]ÂùÁ-Ÿ©²Ì2n5҆ס¥¹QõqœdÂešä©ÓùÜ’8œ$'ÿý ‡ v…Ó7ßûËšß}=2yT]ͬ ••rÔŸ‹ƒö¹óƒÏ²_øKwãK÷‡Ï6È\Dµ,8£ó‰u¿=ÀúºD`kkˆþV{òôžyyõI¡¨¤•Ô‰¬P0dUFlj5 ÷FZ»°Àô@= dcmÆCW»gî|ºÛn©XçßâÁý®áVÓÈ'åúðh ñàý<0£nzZË·AP·½xƒÀùƒ®â¨Z†§ØØZ °]­>˜ûÙýyØÉug/èU\óÄ ´*ÌÁÅéDç#U@©[¸.Š¡ öB”ì¬ûìôÅŒóÊ6œ-ü–‘à9r1I¼Ð l²/Põ¦ ¨¥@è9õ Ž 6BC¸NÖº Šd ªjãw£ßâïî0!‰O–îWò€T­A6š®^s”³iæ:ȲAB6(ˆ¶Õ÷¾çÁw¦U0r3Xñ[7ÏkÏÞÍ9ô½»Í¤ƒì¬jt#ˆn!&†°x€Z²4e&=lOõÞy¢ê-go97ÑF–m«Ô¢ŒÞhYê/ìÞܵ/èø:,æy6º_·÷qŒ¼  Ë œ–é¥{•>èz~Óº9ଂš=Ú2qÍŸœs,“*¼XQû¨Î<2zÔ<ÏMê{ŽÓK÷Ñé5efóI<úá¸l™âvz¸>Ë7¹ÿë×?·xñ¦þÊ¿ÈBybãñÞ(Îg2&’a Y¬N×AòÄ—ô9ÀOó׿ª¿¼\Ô"_2 •¢çܼ%>zwŠr2æÜT dâ##ñ"ÁQ Ñœ‰£±Lx9Ÿòܬã™_ûWÁŒ•#Û9sÐÄn¹Ôv¢õóßßÕç“ÚÿvöØ£³…ûÇ{Ç}éËÙð5ÝŽõs^ž 53Ï¥ÿó×ÁöEöJÒÒÒ°÷@øL®;ÍÇ îÊ8‹ '%àê(åfŠ)}Å; üµ[àd&V]·ÝÂ]s½$SF¢ “ŠÝi“` F‹2ˆÃ›ðEù2&vF®x!„Y L-ÀWƒJ eÒÇÍ陬EF°Û)$ÕIrúPÕ‰ÜU>‘G9ð‚wœm~´~¤/r‡8à™Ú,ÎI/ð2’ ®ÞÖ;Ôr0¤=ã–ˇ¯w^Qà˜£…¼ò" ¨9VŸ)§îÀÚÛjU¿ Ú–L ¹Š” R¦Å†ÖÀÒ @€5f•mžpèɃ(·(, U¥¸6ѵÁ<°Z9e¦š’MnßäüÅ÷uöª7„"üöÖL’GXî%ã_Ú"d*™ÁÛ@<˜ÖÂ޲mb¦H*†F쇅Ñöüéêü|º~>\+¾$$Å KQA‘Sý³Fæã]½×Î?Ö¦BŒ¶UÔ/ká€Uà—|ø4àý4åu3 Ül¦w 2ëOzÛðÛ­ÞЦU ,Ü?V¬zC ºâÂúâät7…*p4 0Ïé@Íc0Û™*‰öU(EF™¡RD«™zx2\¶9ï§ÍI·…5¢bÔ10ìžq®ö–¸ñÀ®632ƒ3¸ÕîêÙ;ªrŽ ÷u\­#S}ÔŽy±ö¤–/#›ÅX¹(iÈ€Òæzå3£;Ÿ¤²Ìn;Ù‚n#yy^ëg~Çž½}¸N·õçì‚,é1 Vs`íZt«¥û ð_óïÆç¹EnH²éÁ¦b®î£aÀ§>‰›á½&„!ˆÒ 1I$ðʼ6 ÄB,ô¦²­ž\µö`Í jDôêB_ê³ú”Þ¥~¹n+µs,«Cwo®ª`L0ÂXj^2Öâ4hÔkD(çÄ)€ÿ툤 =0xP5-1E{ãI€a+JŠ|'6bÄÀ¢ŠÄ²êy9CYJC%W)  "€"Š S):Åh“r^º)Î.hu:4õSÛÏ’7‰›ÕÙ*4¤öð+PŽ©bQZgK40 *V„ Ñõ¿,páÞb=‚Ħ&Æ\.¨fbN¥yÇ^ X¥~Z»£ØÙ‹äÏ(¨ððÕPŠR˜žÊrö½ÒÞ·ã€{½ï‘—óµõiºc`et-"¡sŒXááý*Þm?ì±üƒå›«¿$Ðaˆkwègü£G»^É•Bcõìž›>C½ãnv‡?¾­à&:öe¹-{ü=îúzoÃÏG÷~Ãø0ŸQSîêĪ·ã÷ÓeýsvDˆ…î‚¢ñi„GŽ‚&AYÍ•èÖæË¼Q˜°©*ÇIõ™„‰3ëóž<òÞÿô{ôú7 oÔ}Í·óõ.û©/ìLº¿}óá÷Ÿç_Oþ:##áΧpsN) 2æÞÆdA²6¹l–ˆù—ŠLšò1#Ð~„ø!°©LCª©é  PiÊÐt)ÑiÑU HQeÁ™â#ƒ H*C$D"äÊ>Õòñh¹÷´>»;ïѯõù¢ŸUä·ëÞ×z¯2é³'_¼iŒ£z½s'÷™d‚µXˆ\¡ci`«–†¼b«h&s¸jl˜œÍ}/¢@ëåî ¾Cµ½€}i»éŒNT/dM!Q&Û’u- ëUoj­jZOñ ð$µâŒ!fàldZ%.ÉíG±slÀ ø–CBÑ0;Bƒ8Ù^”èÂA¯u Ø|ož‚Ó(¢¤É  äyëwþñõ÷þoü ‡3.0@Ä  v ޹Q Õ±~ Éä±WÐKWG€µ:qª¡®6ÅcÜëSûç$ÇOñû,;+µ{s!׫u†@Ô­t‚ÇŽ›È6¤ñœ{zöó¯žùbr"0¥^Áг>*¿‚üOŽðuL½f÷ÕBD*&;¤}=Ù2ó¹½Ù;‚&Êp&pà*qé”Ò1&¯ˆdiÔÂ~ÁRÏ>þ[}›Ì¯®lù½‰?0?Ï87æËåøƒ×ûó?¾ÁÑw‡^3b•†ôáYO““Ô[2²ºæóŽÞ¿sÜÈc‚+ ¯ü©µTýmwvk/o5xMt+…Œ‚(fÁ¸H5ƒ€Ûº£>÷3ý2DZAäëSüÓYÞÛ:‘³yû…µøÜÎf¯_‡A 9GÑŠ3Ç Rlˆ\“jŒKnqFEˆ1Ed¹9-œµn¾è{¡g_`f6ÛcºDú˜A>ÛÜðPŠñubD ]ã~ûTÂŒéfK&šBí9†ô €U_ä·¿µÿBÿú¢Ž¢)`]¡Q˜"GŠHñ•AŒµ"¤1 UDDaiA p'1ÊIçu M‰©.l´HDS×Q÷¨Ó“ÎÕ*ÔU« I´«[¾ŒÀ7%)¸F£ë>ð qÔB)³õaÿðoÜÚqÖP­ª|Lë3»¬“Ù² ‡‘ˉ뱭­àKDL ÃTŠDÖpUWëVAâT²¥e×ÜN‰G!G.‰k›2¨›¡r„$´Ñâ`Ÿ]*8D9*¹§u¤] „¦`T%E}¼üwàfåuåùÇg«#|—gO¢zRÛ{½‡'AX’¶ë6úûõc.É/ò¥,’„m2¦\”3WUÝÛÄK³È£}4Öo…Ýç“=ÓßvûîntþI»¶¡„YÆ  ÒÈm€pÝSó†V(rÅ<2·£™…{åÝ*¤iÇ0Ô¢|?AM{±.0•gB¯Ýïe‘¦9t›ÁÓÞ<§67‡=n‹38È!(»>sæ~!ïõ3~<¨zMN¡Êâáå×ïïëg@+ôøýWú¯ýYbôjl ²ƒo> ˆlù[ŒÊÙ«un¨³y©:ùv3w|{ŒóºùüÌúS0ÃÖªu̹ƒyÞ@TIdë®l½‰,½.>cTG$+Ù3ºç¼uÿrs¸|p×é®üJåRKJå¬4ÒõdÏqÑABr‘3U,5ª0q[i]ÊÇϽ=êÚ)‹gÙ+J&&Ã%h¹"˜!­GµÜ©Dï¾×0ÃÞ“—Ó冶nw%8έC–‹AWè3IXgo˾·ãB­oïëÿ•ÛyþÒþE4ošª¸eöÊËAPY…ÊNÆÜñiËþϘ{#åÌéE€­1Ì~À5^—²¯î|† Ð9’@ðèi¢«±Äêi ]LQ‰/p§«9¬Ç#(¡f…2{6{ÇñÚ´|4ÌNû†íµ$c0±Ré»ÕÚê:ßþѽ®šéã&(óû£™½¹š ¯*:”q$­itƒå&PM —v}ŠÞ”N4ý%¨„uÍEk ±£½Û ÊT ÍÜÑx`©)U$ ”÷Æe-JDX)ÐÅ ;Èò»ã<-£æBÑJ=±$ÆlZ –$ (—Ú ·A#mžû›|8B(jÒtdë»Ñbh%¹,ú"˜ G?”ÓNÁŒ>iwœÁ]…c3„pÆMí$.,Ò.Z!ìÄÐXÀEÔ»ÂðÍKG>$%¤%¬2=¾¸ ,Gä«74Ç.~oñDl“wÄ!šXÖëùdäúžIëÀpìä&©Æ`xI@ÕØ³ç=ÒD¿Ña[Ú0/¯¬ Ö²ƒè3éV_»f½þCÏù`î¶¢× )„£Ag p`N<Òäµ]¾ˆÀÝ^5—öDHº;t:ºÆ5ï´Ë]uuF25Ó¡A„IÐÑÝ—i°§Û (¼#8JµKp…]Þ¥X¢VþÏD»ïéÁòŒŸzì÷)¼ÐD8ȇîÀ,õ b Ë«ö²,vw¬ºùðA¯J}6g…0Þ{Ç@’3ÓëÚë™}¢3 2K£Ç¼®gS2T6rªíaIïõÊå×Kçå„g©ïúñöy^ÂÞ~ŽÄ8¼ó§SyÉ¿ÉÿÃo³ß€"^‰ƒû=ï9ê™ÞDKŸf™§Ö{óí Oxl»ï]®v RB¿Å_pL®.C) Ut‡zŒá H€GÁ'…$׌ìÈq“¤3³å†Qñ1ΞüëõþûÏüüËù9ÓšûÕ.1³s¯öŠ ÂâÄ ¤ü7›§V¦ô~±w²ï‰ä'¤»g`î6º±{ž… y{ù¿Ò4‰7K†@Õ&íAâb2•I«\&=:5`ÀÀ v ò¡7P®S’´…ºÍSñR×¶¸Ÿ_ñ Y±ˆÏˆmlȳ…¸ºÌÄ4Š2±DÚ@lKq”ÑÛ꙳ÕH†§¸R-%Æe±è‰)·DʵésÑp2ѯbGJ•2Af-%ˆõÍtgÄð úÕwäm5æóTò—ÁÀv¾`ÐÐ÷¢¤°\î‚x¸uFm1 rŠ~‡)Nu††Ú P+üe¨__\\ÕWT‚!G‹ è/ÛÆpØ=–¸œ&ÜR(y$U5h'µ¶¹è”e+•Sùˆ­QHF'bZÍ¡÷2·›¼ˆc*þÏç?k@P…ÍäÆÃ}â™&Wª×©þ; nû¢HIœŠµFøB€)©tÄ+i€”8ò@F0¤¢ŒNQIü%À?'òsH$vŒöÐ7š1 û‚pš¼^'ˆÔ‡ûáÕ­™ÿÿýÕs2rúý“°V¾%Ö(ÓmO*Ç7÷ÈåzÖ²E3½ ±±Ôñræ‰À¢Å´SàT¥²¸)^&ªP§• Š‚ŒŒrK@ê6 MšbÀ“óŠãd0àqÔÊÓ#ñ0ý l:uÏQ]².j„ÜZ¾›þ8gh4A÷¤¯Õã³ÄÒÜa!·ÍšÒ+|Z[‚f2N¥$@ aLoØ›%A§ÅME,8ÙLa0U&@î&Èz€kpEw1A´-A§UÀœ‘»¾­ßè/Ï^ýp¾óZ•Ðp§fJŠÈ„ª@è ·w»Z*èŒRˆ£¬F2´(Ã1yßQ]Z]u­T“òòBUÔmïóœEÚÛÉìõåªw½2QÔ­â¤T™6t]'¦Ù …´2©£ö…Y›EFá’± ÎAbX‚‚*KÜÜ7­LÅu˜Ã*€ëõ>nµ8‘±`ÚXŒ–Ð"XeVRú†€4+V$¨"ÞQƒ£¯²=Àè*A’þèóþÛ¾ÿ•ûï¹[6“k`/[©­j*Ó´è «ÖPÖF&ÉÔ¹ÊÔ‰Ç`XÍZAJ‡´¸I£—Äâ݆1œ¦n^W?l—•Y/vuV(WSR.g÷v+Eî1ó0”óA,vß:li}ìg}7̈`«6«CxIFÁx«Üç¹óûcçËKÿÁ°ÍÎøæÙû\û2ð-‘Ƙ& ÐÇçxgú_uþ`^·û}"=»pz ÛÒ½Gàì짶ð¼7³á< 7nT*ƒMLUëA° ]%00Ô‘ñ´¥ŽÄ­2NYUK×ÚVÓYlʳ4!n ’b1ˆ<¢ê(‡öøXö)¾²42»p›Ýƒ b¨f 15à)Ü×·¾ôë¹¹½Ê×ð`2„ÚØ¿’ RÅu:M >–·uá®Ðˆ\#Y@dM`^ó"Ú7IóêFt-×Spf9hÿæ|ý\ßþ«˜@¥®ÆSqFÝ(²léQ³(P^u”šDRò…¼þúóÿÿ­ïÿúßÿÝÿúaãÛ@äXf”AãÀë×׿–ùú²Y›¿”¶…$@Y5ñtA6ì/‡eŽ0%VIFlò™ pÊ”º‘Dˆ¨¸UÁ‹½G‘(ÇßÿOïß^K—^_~Ós9$ó÷gr’¹¹×dÃZo[c×Sÿ`¥y•ÇŸ'Z¯/®M}4ÿÿo>áGNPBU­ö™ÊÛ¯~«KjkÄIWÔC ÆÓ];ðémùµÃŠ3!¸5ð<ú„òõŸ§p\G›GÅÑÙ8¢U=a‹Ÿ‹N…ÓûmÁÓÔ°‚ÐÔWâ±¢›Ü×mÀ’®°\<3ýôÒèªD.ôWUø&´ç=¥ÏöçnŒ;'Ì‚Ršyð—ç=·a©…;K¼³þ:–bu¯Ø.¬Î+Kú̼´Dþ¸ÿx 2‡NSöì•øêEzR^ô߉Ÿ|M-y¹Wìz;—ÁºŽêÉwû^pÍñ”jñ÷ZïÅEo¼ ôM×3õ‰ù>ºçÐŽìhUÏZ ”ÂBÔ‹…Y£¢>üÔþnˆš¬ èùÒEr3zFÆP %.té0hIÉ6RPfÌZc{­…À(!C/R˜›ÚÎè¡h7v&Y»—Ùö¶à×D—âHNPàm,Y7eÑš~t|<Ø5¿”ãv0Û8^Úï—ÁÒ,+´¸UUnÌÕôØ*3±˜ÚøЬ©Oð¸¾@Õ´€Ù _YkVŸ½ÇZ[ª?è€m”é–>Û½f!"0Ö&&UÜ…Pîg6œŽ1vŠ8BÒ§n¡eñõ¿‘ÿ÷ݸ˜ã9®û°ü³üîO­¦k:Á—ü޹t÷k×ìé9ÎãȤ“L]áÝ®#’P=“?—×n)ïsK´N×kÇXïãŠÍá ŸaÍhbÀ!bÚ‹9S!ÉÌÑŽWV)td6£rÊp‰ (‰Nboñ‚ö×­Ï¿°ݵWv§KG ýšé‰è„›Ý½‹öÀEÍL–J1êm´_šìk8ö¦tE³d_zÑ­ùa@ÿÛ£ÿŸYyNíÐRMˆ¤ð錭*aüM9ެ¨R jžõN²ÄöVûoÙqòȨWBèuo0N™Ô¼Ñ7äÔòZ0=&:ˆEàhb ¤œú»þ“$ÄDVBØM÷šC½oX»çôæKÜ^ÕH‘bŽ“0—fy÷0JîÍD÷këCX Ÿµ!I êM¼/Yq¿›1}q§èpæP{J܆]I+š_Ë vO•Þ•÷»žÐ†7ŸÊz4mÂI13ºYÔÐ`€bà™`*†ßjE‡¾*9Ê@A˜ FA 2Yx$_kGë಺¡"[®ã:‘7D¸éY}%[af¨†¾׿òbbŽOyö½Ð¿ühƒg²iå9CŸ;_øág ¹4R>‘j{¹¤?ö°*ÅÒz­º~aþ­ã£ŽÖ|Gµ=Ÿß­"Õ»$.ŸÑµÓf&é.‘FZ˜È‹+4&šòƈãé£ñn­ÆO IU‚L»(¸Ý†ªÑ,§Å>l:ù5sWû¯ZÅ';ÁJ˶>~æ\˜ìZÎ ­ IJ hNÞ^àIH¥RK`¢Ò ™à‡:W n”HË–R´ó:€€ n$4õ2ª%m¶\…ôeK|1b©ÈÈÖ`p‚AÇ×ϯç1¡€Vz­¯&TˆMìæ1üè Ta©µÔ(C‡B œ„Èι¾§]ù%!ÎF÷ ‘òªª®Ú„køv’±ìùrÔ„@Íåz¡·=k 8yŒiqõ5ê…sUÈLZåz:*«¥7ƒ”té*‚b‚®¡Q‚ui´8}Üýºë[Ó#Ë!tM ªpáB&D´B Á%l„¥RX ñ(€ $À˜€€œQK#[ ê²5ÆÉn×ϹkÉÎ?¿U§†ÈO9Ï}ê³Üfbšˆ”ÚÖâ[Rgà¨N—F,®b¯¨g€ KÊ’D•4Ã(öÌuÑTLQ‹,ÑVzÕw]wÑ{æ¢c¬"eÐ wZ&x·‘D4Eø³Ù‹ä‚ ´Ý×=PôÚw¼ý›VQ@Gt`‘®EÉYüCÙ÷ŽwõôMyô‘X\iÚ¦º<üO5Ê& 7{Z´æÚܶifÙ£¹–àrç›ÏzÞ÷Ù-þ÷Y|sðå×öWøy?óaÏ¢þã÷šòâÏÊ« ý·ÿ¼ÎLYüÇvÄëôãë¶ý‚Õ—Ð1¿zé£^¯¶ùÏPì ɇ½¶£˜¬ïá.¾ ¯:ÇBtÜu«V•Ô„Jà]|M­f+Ãìtû5ãä£ìã¾j”][@d⣟_%^¯‘Ïö{qsÿ¯¯§~;£#™ŒFNií?]ù«-Ï~ߥ°'; kЈ#Ð!M²d@áB˜ñç%ŸGÀÎJ‘1˜B™É\’H(5U$S";B–„¦D ±5zòM®‹Šfˆ¸Ýa/çÛbîÈ`o>üÞË_øí×òsg\»oÖeiÒ%î0WU.XR4­À%´rEìJ‡žF&7Ž ´,ød³;ÔâƦ+t¯MÎëë]u?R_0w"®ù¼½ƒí<Æ+ÂyÛ[ŽàáýUrw:ŠBÖP °¥ë‰Hq›YʧÝÍ÷é±7ÜHÊl º €F±S±D–'î%OÄ-¨X‚-¯ ·™—„áÍ`!H)eT”„MiGúºÉZŸúyûµ~j§á°ˆ+x1*R\ z M­.•Çk‚ÉC†‚¤Ú‰´²”œ¦guu˜%º ?9‡ºÆÝMöï쯷ööâ¼Û€›¶§Ó6eR§t!–BÑ1z›ßÏÏúÃÈï±Øûúúʯ4ýþëÏÝCòn•)TKýò!쉫ôûõÉ÷ªl£“|Çóy}_7®à&A«Ž­A@X©£I&¨š&ÈQ úsoÂæùúo@íù0ïoÝ¿ýïÿþ/þ‡÷ýÿùúƒ¯úíó¯¯ùÞ•ïŸÿÛ«/§ö§Å5fççó;UR>ôÓµ·å@ÝÞã¾¶¾Ë—ôÔc8¹­~ËTç´¿Y‚wÒ·È0ˆÙ󕜆{f|4òîmKÂFEûêÄ’¿Q&Ä×?£ÿøw™ÿù®“·‰žËó*âŽïtjüýZyŒÊ1C ?œšm·öYBܘ&/0"Ÿâãø"2i*qZ“tž¢³BÄEý,\ðã]VÓ/eýÌ|eú^ÈŪ3^.aD{ωh~ÓSµ“˜æ§NnfÌ¿é·oø#­—Öc9#§©¥ªµÌÀ¢iãlDX‚À !¬4× LèˆCˆµF¦‹• /ïX+£á¤—¨ªBGŠTŽº:µ¦b¨ ÕžM5­+ÈèLÅ^npñõ[xn¾>;£® ¬¤š¢"€À‘G&žG-Î}ÏïËÆ<77ŒÆã©óÈLßöê¹öVm"G0¬6ê‹Ü²Ô£l,È¢:@^ ÃI•éù™{^Z˜<¯·úŽ®ïœ¯‰7ÐÚÀ¬'J,i©Â(Yä1ÕG̼ÔiÞ룀ó\¹^GŽŠº˜q]SÚe±†[×ä¬ð²?œÏ?÷/;×úMðÄÝf©cCÿ »ɉZÇyÕ,Ù mù¦!ÇöN umJY%Þöð}vÒÊgíÇ/ë7s½›Ïîô„P×›»{1mԈ܌ŒOê 3Ó°'`¥=HC½Ù{ž4A‹ò‚P”Ýõ¸¸; ,ÇûL#»£ÛV;ì©áç+!È…,ã7ɯ*O¯OÿÒ‚?‚Ç´™¹­7©e4Xœ\zÖFvqÁOª’_! :‘!T«bZðP'QG=ñ–·\ç¹,R$“GÅ]Ý×YÞÇñ8S‹#Ú6}«¹ãÕõC¶5ßÍCWïªCâäF·õ½†s:“ùÔ÷5ÃH²&ñ€áJt – £ šö>|0Ñâg°R ¤å„vzhŸ"¬j¥Ìä©×q¡lL¶ï¹°•v×$˜Â"c¿€ëõЙը1 ;'š^ W‚Oæ¥9ÚA”ySÏÉBŠ"À’,X#Û\z¦£`¦÷Jc}&~=˜Æ'ïû Ïƒ®ùäì^ ž\T­0iãÃæØ_‡}ëë—¶³b쀎‰”‡kÓîF§ÿèÿlÿýåöOd3Q};ãÙÓ7Kò7M–›¶(æäöº’e™Kå¼§mÔt¼„eŽS攳‰—#`@A…ÓXVÁsí¹ÛB6J£àÎ&üÒY#>ÐVR.¥M”ó|,—AMPQè…‡LØxl»¯uà]h"…So®ëk\Ž›¸‡^&+tkþŠœ@øÌeVÇ:j(·¦²¼/“ 6Ä< PÍÈ à•¡ Š>6€+†4©™("3-½àÄ{ nÄ74…VÌ.3'«ò³YßÊ8¹×áЉe ó{ú‘ðW/jý¡ù¨¡Íö‹)h (ô">«×·J6QeL7T¦0µL˜gÙßË]½€t—œ£‹wGœË Ÿ~~=˜yn`=Á[ê¸Íÿq§¸ãÀu³çf«Ü†UÈ á×yä õ´õËh«`30a6yzý¶T¶¨‚ö„‘ýÁÖE(3AÄc/'0Ï;£™»™¼"°ÐÛúØÿB~ ÊøŸAçºÕO¦ ’k©[Ôû±§HîaŸµÔ þ®Ø·Þ"À[wÍ>ÔarêB¼5Vª ~šc(¹õ8rNM$£*ON MÊὃT.Žî›ç¯òt§¿áñø¶Ù="èýZ¿.ø¾YÓ–Ÿò£®¿ÝÔÞÖ‚­Æã™.¾A™ì€'ÃC“âÔØPÉ.¶´P+u$Ûš¦hØ+äR[²‚›àáîSÇ·ÑEZ¹å‘@ SjÑÀNi¤mqˆæƒWr³ÜÁPÀU¹á«\:Móqg»±*Tsf¨‡­úU²É’;h¾£ƒ‰=J¢òPÄ´ \ žß@2 Â#dÉMM0C!mB"/ È!Ú•$iØ-ÍÌFΣַînw7~x>£z#zõõÎûÅùɸâ"0ñ³àŸ5ù§éþ·‚þÝÿS=ÌœT®ë„]Ô0èP*Ñ_çÿ|¿6úάS>ðYȘ…%ñ¡GW)ÆqŠ¥ úÌÖÙDËÑÊhU´¡Úa´Œ6© ÕO×]躌´“/8ç=d8åt<ÕܲäåÌ„ ¼ ×^E ¦ß[nMAk±}…Œ[ú?"tš•òA¶]ËΘ&Zjœ :T¬Ž*/Ù(Ž,òº¯®™¦XYTÖBcñÈ+D ÙXjH‡2£“’u¸ó²z­ðîãîO§íë$Òô«øQÞŸíõ“³ëÎ*–* }E.ó&’ÉB€J%*¼×σ"ªqÄÑq—¸@£àÜ‚ZšXK¸5]Ïwì*: œÄ) ¨&ÚE¾ïÅí‚®÷6ã) ¶Œ½± :êÛªÃ블±Ÿås d˜õ&M6EÍÐ\ÇJ&ü+%7çã_¯/äwóiŸøÚõlw9ì3_ö¦§¥”D_ÄïLŽ«§5Ï*?‹/¿üÍüOŸçÅ*\C×°So•§åÔ½èëÚíŽÏ ×?—Nõ=³7?÷>Ï÷šáäK§ïêú¼Ví÷~˜ô˜o›Ù[nñJ·˜­ñÔ\mv‚@c`cˆÒOêEÄN]¬NûÕê`-¾š"]à•©H<=Žæ³ê\ipûœ©}§É¼‹­Åî9ô'‰¤ŸÏ¬ü²¯w͹tHð/àŸÿsúkA¸âû·àRÖþ²Û2µèµ‚P42äÂLf2 €üœ[ˆvt2ø#H©€taÛƒ˜"ÐL°lPK‡f´Š«"l@@;û]EN>9ævô<ïž¶óÃúíÙÝ_ /zÑ}__D &é-«w>*àI¿ 3µÔŹދ¤|[n·aÜè*í5¾‚’vmÑaUÇõ;œû$öî]òâQbøcÀÁ¹ÿÊã¡UwÛhLÈjºKÐQM]‹cÀu~Âî®/Ü^hE+‚€I\SÓš“h¦é;‡ ­L&áØŠ"»['U.g!Êà4Ãx\B,ƒÃôõ¾ì×34®æçÿÏïïù[{ Sm`Ók#Y@È—ÌÍ•ƒk åª{¶B ¡ÑU$W[ŠfÍÈñ`Ñ>ëîŸÿó_ÿþï_ÿÙ÷ØûX¨`$k¸‹¦@圑£2wúÞß×u3òë‰÷mïŸß¾Óçù÷gBBrå伸ž!‘ÆÞÙi (M—®âHGFMAŒBE &œ¼¾lŒÉÍ(?|:?¾ÙûÁûÿóÞÿ¿÷^?þøßþþ_üãÛçß"Ô]yÇ^ݾÀ\…¹ðâ\Ýz•zsÙFcõÁa2‡+Ç=*šDšGFz¼¦¹Ï£±Ö/÷Wmz¶Ùȉúm¼ËkÆ'òñãýåNþ½?|çnü³6çc½ö¼ ÛÝöú||¾=÷ü·~µÿ0.ø$Kí‘Å27+ç9éÕò ›¸@*¿©ë‰¤"u‰§Aabˆ’Y^Të"RÐLt;#‡ÞE{Ùôa‚‘"Ü<—M›òx¶Å,Gõ…£Qd×ùš´GDÌ@…Wó¿³L´éH%Ùéc%ÍEÕh÷U“_êÙ›Y»„gÈ×ç,­ܼç«fY¤0‘¢mêtá ‹±zTÕk•õ’ûéY¥½…uY뻥èÜÓÍÎÈÕ]Ÿß½ê¿‘õ$ùäù«ã.ì ÜÀ»ûÿ¬]Ê»‡b-!öA¬Ã ñ–aa˜°#ÿ9Þsê©¡õò‘b[ÄèÓ˜Àü iкI<™n½½uû½ün+e•Cfм×çÞóvû|t“—×/ôà9¸Ðà¤æˆÓײ·Óï …¥Mæëº—e§Wà$•û7ÀLºs¼¹T!UP}zÔ\Yô^Ÿ^Z[AåA9ùæ…ßâ-¦ÝhKLé·ê-ù?¬gG((—>Ô± ç É–a«bª9ªð’WOºÏ[NUÃ*278†ilÇé‚ZBËMçhÇö ™Ü’ÈE¸ÎeUÉ4'²Uw yȘ”ܨ6}’PfN‚ƘŠÖ`ÖÂ,ÔØµysMÙ”-Šš)'Eä°æ y­ëÓýÁÞiðZŠ'úÔïÇÄëyÍlÃîJÿ¢îÄA“î‹–Á è<ýƒJŽf,Y0¶°Í‚[žéó¿Çó+ÏZW ÏP³ò‰X?«æÐÄã ×Õ$ø0)`bîÊ—0 ¸Î©ÆxB6aœz»^KÓ¹òi »à!BÉ\òœ/U•K¯Y{ÈߜïÍ ‡!Â…íÚÅù½Li]tW”ø2 Œ‰€Ü=ç1*¡//­½Õ1­Ç®nΰÀÉÓõv!r•®´Ü^Á9à¹Éð”9á|¯ñ(®éä“þµLØ#Í•uÉÁ@¦íqWŽÂ)ÿ˜OHDLZ&I<Ù7/Ç:Cl­®¾C™.âòœ–òÐu ªÝë~Ö9#"*¬ÆUeD£6˜¼dFXš¸VŠB¥u$ö2-ÝE-229ˆÒÿ‰ÄªÜJtˆÂIã ÊGALJ{!¹ ¶lë².õ@Üã c–O( =õU!˜Ê´jw°vV²_e[˜Ý¹8 ›Û[ÖxÓ5D¯g (¼ !€°‚QZ&$…¬p §ñWú-§¦!^³‹Ýˆ$”R/j1*’R*!ÐN'š!Tu€`&0­&éq¡Æ !gò!ŽÃªn ¬!Ö¸Æ_-ž}wóÔ;®ý|ƒ!¾·Uâ²(v"ˆ$ƒP´ž@ãÒÆÒz}#ªü 5²,2 †•y°Zv`JÁ| ƒ'®”'=íd¬ ƒ¢:_8J-¬ .›Â¬è³ÒB3}ËM8ÖRøj®'«N5ÀÓA9%ú„j²ScK!°eYº!5F‰œªßc²mæž3ækg¿¸6¯ln£ºõ/ø×+Ùt“× êÈb\Л h1¡Îp©ŠÀ!‘“ÐÛE²èÁ &!0²hèK;s9š’Ø 1½@+ç‘[a0ÏQ“q\F]$Úƒ¯à º^Ô¨JÀ”Á?óÿu£Þï·üëå~&Â&ßþÈø¦^¾±æTÛ•j¥‡™õ¾rßáÞÂ!sêkíË30}vÅ’«£ØŒìOSo˜&†IÆœŠú‘xC\ƒÕ´fëD!;9º¯ ÞË“‘› ,[ã\’Z/d™ÄN™H\ô@FsÊX3hÛÜ^Ó³÷‰û0ŸÔ¤+„hÓö–?ÅL¸€ÀÝjžÇrYËw”ÙÜ»×ç\aÊ_¹“H¦k m úðyhÒ7'?f¿¾”ƒÕéÐÒ.Âa“_âoÆ;ÃÉôKüii{¥~,×§dPèJUŠm ÈÔÖµB°8qÅS§9=Í@Z¢”´V¥šÃ¯Ôrµu¥#lC ˜À›É V…CjƒŽx¡B/†Ò¨)¬+È.†³Ój˜7 äcÎd9b'}²+µ¹¢VÙPÀhe4n˜så~ò4 “ã"õ¾°ôã"ŽEZßÉmÆ2Ö‰””%zVvˆ 21V ,ž«e9´†\J[x ·ÆCeµ\ÌÔ’ÇWÔ[—þ̳½aÜåíço„ Í:€Ÿ?Ã?oè7®­þO8+ÓâÒì⤗Á\R­~š•1zJýeõ¿¾æëµ¾^¥ŸÚW Ÿ°n¨niÍk <9­6SYå1y²´»6iqÒ'¹ÓÓï³"e9íÈÆ[#™žÀ~š„¡”æ$An›yP˜ÌötJà”ÜlyJ¼¬k¿ÝQêm3·Ì·' 0Z­”Œ7‹E‰f5ûm ° %„ôh¢‰@æ`ˆàØÅÌ´$¹éj!k(«cB3b6©":V©ÛŠÕ«?@éR,íÃû­ö’FR|Ðo /Ã÷y_èGÁXÜ2‰¶Z|õ¢#k„Ñqjþjšy±jÕQKÁ­­jèìzÈÍÚÙÊÊ`]±¿P3a”YƒÝЪmã¬ñ¡êóò­W*çè™8ÄvºÇ”“06ÝÊW’¬bêoòá´´Ä:üi`èÙ$U¾#›Caœú2¬Ÿm'H6²^YÊ€‘4µ@I©Ø8"„¦EƒXX ÍVV‚€Ø!A1 ¨‰¸h@VJXº$$+ôÌ㪫ŒLÉ?nî¦wGÕ·çîèZ÷‰¬t±ZÚp` ‚U8õÀHDûÒiù”É!EY¿ù)@d ‘žä;ðn·iX\óì$R­ë %§²ß=¯çøº²óÇÆÄMÍYCÓ–z;ÐôÇ5¾núáß¹øíBò;Oâ=§I-p8'g qå¿—Åüf”ììYý`A)ÓúçÝwÐÛ.Qq.ïb5 ¸y”˜¿0Ï?Ûk¼ýeÛäNž2/k<·§½[ÏÐésßÈXqgËÊq×u¬~÷ëøÇ/‚›Ïœý©¿õèÜ1Æßâ]¸‹-õÎH8ˆ2€&ÈÝXrŠ!š®‘×M¹×LS#¯[;²¯m;µxan¤Q[¨N–vÎ’Ïh콰άiL‰½Ÿ5ëŽÚgJ·^ìm¼“¾ŽvÎ „"ð/Ó$ÿùÏЀæ÷ø~Ç9‰÷!¬$CÛ8ð¡ ÈÑ ‚‘„ ˜M¥‰ 9ôÈB+  ]  E@ƒš¶Çj&mu™Öj9¬EB*¨Jћ͚w„ÕæÜžñ‚«ïÇK¿ºøÞ÷Ü?wôyçJ>hn•àmô÷›ý»lSGØVd!™Äé(h½€–­r4£KÖ¨úAŒ[!”¶[Â7 SËÈIjÃW×p[Ø úc£‚ ûÁì¶K9¬“B—¬%¨‚ [JHŠX+µ<3éÜýÖ4•ÔdˆÝKܪÝôÛããOÃg­¡MÊÕÑ1XTh¤vqàw›«š ééi›u éìÃ'¥ÈdÛØç+C^a»áÈ<-\s\ Z(䥨ÄKqÂȪJJW†Å²aö·}å%ÄP*BqQz=o?Áí’×_ì¯2·õüº•Û[óGîž2Á•½ÏzuGazòx¿ÞäKöâµóË_ýòÞçÏÿìW÷Ê÷¿ûIÞrçn”v°~ÞîÎ×rïO™ÒpÆñ4CÞ±¿ç>ÛžUè1’G) @ - é¬2 ‚‚ «>²UŒþ¼c_¤)õŒ›©&¿ áëë›çígýôcq?¦ïçÿÖ'ß~ï?ÓT©º{$LÕªÕª.ùúkÛÔGrŽœÐã)DaÇW@l2ÀwÜ8ôg-.Lfù~öz*ßqº‘ž}ë½søSà¾W7]üý2õï~ŸhõäÊßOöÅÇâá1ñ`bbß¿ÿ™ä¿<8ÿôÏòOªîdËûsïÌÞžuYÒòÙR#Ú#›æ“oõ‹?tâ`n͹J°@¿6ÝϯýVõwþÕwÇØÅ´dV4‘ K¾5½êª+p—7;¡ÐI›r›´7¥!íë;ß·Ÿý_ÿÿ½õÜ)KS Ž^nmj1ŸýŽäÙzªÇˆö´Ö–Vi¥j9°!¬Dv%ÆQ媕6€)nXÄ&B´ "¦È+ÐDSËAc*³ ¢ºrà‚ B )«U†6:‰9)=<žsî5Îlsv1åÜJ*¾Nåš™¢ÐÄ>0…žˆ=4ó §ͺ\Ù¢0®Ob=³*…Õ@%*&ËP …hEpÛ¶¼/¢Kú(8•ÌÕ¬¯d¶×S\Œ­ÂrfÇbgHœ™Hïr`_î“Ó«Âö²þZŠ.\ŽþMi¿k1Ù8LÃTõ:×d)zºN8)FÀÕíú‹wîÖ0Ýø#çŸ^ ´Çš/D/­Ò *!t¼ß«À{}ì¦g•à ÷·>å>-~¦×•Ý»–Öï%³d ¢hä‹Ó7ÿ7Ö¿ž‰œOרŒfÞ¡%í°b_-ÚHÊŠ° 6%,›ºvœ… Ùè#À;莎ËytmÜt§Xî—ÁUÞ2]›¼Çγ—÷*z7Åröòí»¼X)g".Ð*€…w dÐ~ô¾šsÒןxåfÑ€¬Ug]pö™¥tÅ„h ‹éeÖ/êJ7HÄNÃÇdV,p³V³A°1$Ä Œ¨Ä¢ ‘;2gÎqêÈqhÅÕˆNôx!x4d0ªasÉVÞW±øJ4o|HU¥Ù‡|UÌgl™.²Ro ÇßáwŒBÁxPZZs r¡¿?ñë‡ ! ÌoÚí®÷g¹oâÖA¢YêaÑY¥AM2­Æez ìÿÖ_ÿÛ÷?ýÝþ¹¥‚ÛcNcKcTˆX#€Jô¯œ?qµ"ÁÕLÿ‡ã\ôþËù×Ý~åžÎ]ú}„¯ê ¾[ãÖ1ŽÀ.¼t|ò–B¤A_sħÙ–!ƒfžSA·Sø‰·ãçòž'ê¦èÍŒÏQ£–MÜHÔ¨ÁÁ®–7“¹fxy3®ÝÝìW¯ÆÅ6Ï” {p&ô£OøcZ¦%¦¯Ç k Òº"¦b–ÎÆŸ=¿>ñùú{Bž·„•Sºœ­EX†WÈ6Ï séˆ8ÖʳàȘk.qê7(ÄÚ• ’Íà¥ì3˜À7óßõó•mëx“Sà•5xÍq“ý~Äÿ˜ã¯âЇbhÎ3LD‡Áƒ ¯›ÈjY]4Ö5Û;s+nÃ~˜P,¥–p¾›“\ ð!<Ž“%ìÄ ÔÚEb:‡G#gJvîméoZºF Z ÐÑÎ`œ²²õber£ÊXKñƒ¹g7^B%Ë:ëü~Žo”:¥ˆZÌ=ó©}fw ÂO _¯Ùn±~šÑÑ:”´Yp`iË‘Yà·ðY¥ÙeQ>à¬<¯T/ì?ù…<xk·\§RMÊâ‹{šûØå|»%t)ûÓ•þNÅÒC¾QœŽ>RÙüyÈ?Ÿ‘¿÷P«—²-ÄTF°£ü£;×Úß?Üm±î9ìíEö³¨V2ïgóƒÚ0æ&€dÛjíô•4_q%×´FM[ÐÖ…’êSYÒüt8þi7qÚ[].Á¡:,`Û:¢#Ù; E×þ…ð`íb¹Ð fœ¾ŸèS^ŽÌŒ=%omˆ‘Ù# |µÏЉ-Â@€†tÊH% ³À$ô,Aekw´XšK*H1ñ<¿ÃÑ@dÆ.ÔÅ-õ{–±iné×À®8ö—¦i–˜W#=éÎÝ´séÃÀ¢ ^B‡½$kCÂ$ƒŒÚ@þ¦m˜ùsâÍãºrÚW/ØûÔõ9á]È¡ÊÊ6,V¾„ª‰f:,{®ÐAÍ( m[ U©–è& F¬võ´'õ…ÁíÒqœ(nLýJ]bMËC±9åÀ#‡«­EeU±>·÷ýp‰Wab–@a ܉H– ÌŠ”TTX<’€‘„X5â4a]s‚ˆAúHžêú5òÇÔÚþö' ÂfíøAš%³ôžYÑ¢"&E0°F·œÞû& W~2+t”°wö]Ø2q²¥]uF5éMZ¬FM´Uek¿P+hŽÅõç„ÞÚm½^²ÁWÏÔé•)P¢Lò`î´Õ4l)à :×X•ˆ;'Ò„3ÂßcgºâÉ9þÌü5Ê‚›¹f*°ñ[þɰ‚(kÙ§¿ïÓË̯™—âàúqÐ4oZd§çJ¼sdFÙ˜i)g.ØïÓ¶1Ïü°øýÖ^ù<˜Jvü·K̸ï9×Åó6÷Ýí_Ú}‰{ï ç9¥¬)-ºlù†pM<¥eR§&Ç 1e—¨”dg­Àb5 e×N;š B„¤D@ñ’‘Å[á|š¥¹cU ƒ–“€¨ bDEëRû¬´æö c&M„±Ö± Éèu•=Ÿ›ö2•‚Ñ:œë÷Ÿ˜¯¿÷|}ùáû÷c¶»æº´ß—ÿöσ᥿ÿñ‰ÿíïœûÇO釜Þîðõwú+þûDÖ½þ·_þKýëïó=Åëú§2Eè9kçç8: Þg=¼Õ—i+‡±T@@Ôb}\Å*€ Š‹¬"ÊS=P€Æïùåýþ+Ö©þÃoqæÑ¼ŽöùßÙ‡Åö?Ï£½qšÞ`ÿE¨Àå26ÛvÁýëñçžû½òõÿ÷†xV|wýüÒ3½ H›äˆeŒÎ2Ë<;/¿}ü 1HGšäg‡<÷›ö¸ú$2^Hë­mETß·Øœ¬á7þQ¾=|ÆÎË <Ó7M'42s4çtáîøO ÛãÒHD" –Å{‹uI`˜Ž¾©&V¾ §z ½‘ˆeNhj¥UbÓ:RÓ zÓJ(–£†«n¶Ã$nIÉ(ÃjÕ×5õšHÈ¥Õåçôyô»8´¶&^LÐMÚân@Îç8>ϰߌÑxÍ0‰B?iÓwœdÉôÝhõmIòÜÞK(v½Ö0-í½rÔî`YºÏ¬X{£Z†ÝÙà"Yçºø ™QF:ŽÚ,P9ØKVÄ^#*}xÊ ÖB„´`ËÍŒ«¥ÔzWH*«¢X6x¨U»‡³ Tñ¼¤ ÅËèjVzÊ}ÕÞT2ÅG„u¡yŽN~ó[½xm¹Sg Rd?Ü[ºfS@"âˆÊ-t*‰tŒt2°k_øñøÍÇr ØKûT…ĪȜ¥±ÍRwì“©J±ÂÖXÇ)#LᄈµgÚo= £´koõnE,'¢=rñYÁT^ËY ¶ûîÚíŪº¥6~4Šü¹œ—Ã’×áEJ6©UexüR+o™©U*ªáƒ@9$g˜{€)XKÓŠeUÄ¥¹)ËKñ±ËˆeÚÓWSÎ¥~g{êÀC\Ƥ{Ò¦–eŠa˜n¦•¾/\Ëdì›àØØÉpÄÙÍ× †ŸNôÅ×&ðê¹Ü+¸¢?Ü-ö¯l~Þ?×þt6îfldnÍUbŒ‚­@O%Ó5¾ 6It, ¾F*­zÜlµÔ€K訛„Gxé”›áÝËŸ½ð2¡?ëü.<”OŸÀ£vn[VŸÜ ÜôŸ=ý þ¥,?±?ó¶îæì' áÝ-ï ðþ)ÿ†k#úÂáÈuôˆ[Uhã0IòíŒþš;ûÊûšõÁŒä¸qzk¹NÐwéuéÜ!æ)oîJ¤[^¯ƒ,hìà~vÌêm¨¸yÌ-GÊOù–o,åT4¶]¦3}ÿ0)ùnþ¸/²S…ûÁ>ù/ÃßN?–K2 ÐßN"1›q‹âÐQv G,àµyEñÞ\›ßݽ„M<Ñ»uÓÒ|…»â‡` fÄè|ÁGÁù÷{T/£";àç½–mFŠ2S¡aÐï¨ó|óì/ðÛ Ø’xŸ“ÍŸøÿØaþ3,1 mÉ«¹ ãªt&°‰Ó”¸¸ÎØé9m–²ü3 x8}D”ÙKQŵ5!­@Öfe>à‘¢’5B·à]˜³ë¾oý»¾¿ïü‡Üùyû/æžxCß_TÒÏiÇp@eW1Úªq¾ø®b2ÌpÏØÏ)Ží©õÔUJò–„–eÐ=<ŽOS½œ8X¢$UyNdç¨ÉeÔî÷½cW/Ó_óUóê¿þE®”çL+$0>“Ðdm !æ2;¿åj B }oÌË—ó‡ü7õ_¿„ÆÎ½_É{?k´ž;&ÚÌà ï¨$`¸AVN9#• ¢K¶à]õJÞiŸcyõûWÿûOûûçN›ÆŸÔ!†BüeO>1 @$È( CQ+Ýò)_å[âÍýV[ã’±ÚÆ^È b©£ƒPÓ`M‘åO´fí?ÔWî+¶çl¸Ïîæé†òăSàÓîQ§‡+þ¯Au‚‚yBA:‘àˆ2üH$¹œ°­Ù2ˆ^6ç\ð"4øŽ‡1 $ÍÓÀj±Rs«FÇ®úSûsÕ6ÓØI^=¿ýð,„&ÓY•oõ×7ÿ·ÇøÎ`ä¾5÷³vœn¢ÑÒy±rã‹ÍÝA€ÂÀ^ƒŒÁ3@2 $‰`k6Ù9`B³tZ ±Þå¤ 1Emœ [¡)gF;Œù+f=¦ôõ› ¾ìù׈]sèÂeÖ¤%ZĦ—÷ñdæä §Ù¯×¹s77Ù hJ¡”JVR×<æã:˜¹¾ÌÃ×|··”Îմȼ´Nª« Y_Ãþ<Úê®ÏQη™ù¡µz %ÅGÕ³ƒÑÄšP‡ë]PÝ¢† W×l™Zyfki­i¥¥Ö£§³›^ )Í!PÁ®Q:»ôbrÖÙ@>Õý7äË4Þ<ýÕ)Ý-}žomÜìñ ÷ùÁþ~<3Pþý4¬$¨.°ÍÓGö†áÎB]§ùvj=/’OË È/µ7¨é çœÜTô²Ø#74ãј@((AaÝ`Т-ÆájQxú]¿Äý©ùöû}y[#Úï7¤'Ísç‡Áj?®‹˜÷® øtó‚m×í'$ŒtšÎJ‚§a¼Û]0]NÚßµÉ,~ñЉa„ qTYÕ.µùצ9m;N5j\:gÐÜ·lõÕC¦t+a•®vYC!-¼ŒˆÀµ:XMß\d¹sÉ ½–8–oL}š’ʬç‚Ð,¤·aA{ øŸ¾9Åþ~¿qo 儞éäa¡$L€tïô}áDÈZ°:Ô'>öÄ÷²ìÒ®k½Jë K¡‰­±—Ib8Õ£õè€ágyK5,ÔÕ|HD$>jÅB¢BÅ 4° ­F@½8TÖQ$G¶F ATM¬O€Üв„RŠªùõS7ükïœá¯’¯—Rà CO€:N@FYtR0äIɦgjÞ2Z!sFwFG¬JÕRa/muý†!lˆ$(°,²µ—¾»|,}ä=ã·ÕWØ“v’ˆÞ¬P-Äp7ÞÅ‹j¢4T¬UÒ ‹f€,Ë¢’?ËüÚR¡ø¯“ R Ž~‹Ùâ~DE:v)+ß»ùïøË—÷ëg䝸þ&Ódºx5ébÛüMÕ²#·òbV`Ú¯èÎ/ßE«Þž»×ü¬öuF‚þ±~þë’Á@]Òí¬`O˜ÉüøÞšÑômñKŸõÐ@C‰À‚‚‰õUعÒ) EÖÓѨxÞólG1ï›íòMbþ·p˜Ç¼2ùàŽð”¾ìýáæxËMõóÅüµ¸õ»õ5¸5ç²×Ãóå¿|ûáûú1ÏeÉ(ïÔw”šûø®ç·ó‡Í‡™¾}ÄûæÎ¾35žq Í%¡ƒ˜ ETÆ ‰(:ˆâDX”¤*mt#±±¦EG§ÍÚfšcB%Õ©æ*…mW#ˆÃ8"9A8™oV@š¶eê xÒíµÿÄãü A Á_½÷B½]ÿbšÇìg9ì$E_’΄A:¥ótmµÇx‘fm¦—:Î¥xƒæh4ã¤ê‘6ì”}±ÿ†ôŠ{Í+ÙšùùyóK<×  v~ëš~ýÅxê—'oê6&Ð…Õ† ñ!¸zºçªÌa¤Þd~ îc¢R>º›Oöüü¶¼OCÊ¿==¬Ýì{ób½  ˆ´p:CF#„¹ŽQµó2%ÓÕshk7²ÓÒVÖ¿ÞÿžÅN¿ >ÙÑåž/úÜ?ˆôŽþÎÿûÚ“G0R“C` ’šÁª€ÊŸáû®wùr#*#”’ @–"ÏíPÛµl?ý–}ÿúƒ×ø!mŸy¾ÿ~kæë‰K´pKKó¾2ïE|‰¸ šœ·Òýõ«´©s颸åí„zôõ"­dYå…ŠC„ýŠ5¶ T!z$,(2€@+`ƒ´\€M@Úˆ`=œ´ Vt 3;ëô3ÿðÞÇWïõm+x¬zÞçcùñÉE(ÙYi8¿´> Î*íéðkûç¢ûËÛÍ푪G@¿t]hÛ{úýÛ‹…HoO‡¤«qÝïÚðKË.ò©{}îÙß.ÞÍ›7¯pкú!Ô|ö¼^—y—æÈ-ž›´1IÊU*YRÑ07¨ ÜIQ5Óc¾°ÇæSÛSï%õë´ þ-?W'©»sæ ¯2¼áß9¡(ùÝ~Vù"†‘.#Ò9ëMëg+ç#̬6áÜ`ŒµC±_¡Òm)Û8ÓF?ñ-Ÿëû¨•öåuÞoô8úñeì{Ç#•šˆe()À‚¬’@ CI—%´1!¢"(TU¨d´ªp* ‚Hâ…’5 Pƒà•i@A$EA¥&¥ÙxU5K­53ã¯÷ö÷tYvÂFE˜³³Ø÷´ý*§åÜÓ¨à¬P+ÐÕ *µé!E& $u÷¥m%Ýͯ™ }ã¨qy×p{œ¹¡V˜3d¡Qz^SÁiá³×LøùjqÅÄ@Y)8 Ê®#Uò‹W=!ÎÎÑnãœBW¢B1’{®ÛÒÏ™{*XÆ•Á«Õi}{þèo_ó¼rÅøþ°ßýí+o¶9tƒã™$„á<8í=åëÅ«7f{EéÐJ®Ñ]׫X¼„š?õ~é 6VÆÎóuf3¸øÕÏîóáóô\›V @§2èƒA%ÁPÌ{*,ºxñB‡ÛŒfázÄSþ“Z—@iZºªYQqs—™$ö½êq"‚ 5èHŽ˜vª;¯l÷:'Õ†oGš/jŸÐgïMªªÔŠˆ u4Qèž®o䯛­TêYk†ÃUf”‰ E;DX¥®9uFE§sÊ€F¦$am×Qw]6j‰>ôËB§ x%:cˆ=”ÐZ™Ñ™'œ‘¶%ÍʺáÒúª”™.s! E6àñuec¢"1„¼±‘…á[úX­œº /ß…CòfÐcO¨.¶, yÒˆºcÖ–É¡³ðâEi=(HqL—6œGw÷Mèá‘l5Õfí,ClDÀ­±qàŽüáæTp8œæcD3»lM裴íÛl{ZLàБ8$M»t»'Êèa²"Ž–ÙnxÝP‘Ñ®²å¦°Sht¢³ºSýºŽ®9ìsÖÑGó%F£6®lífz³Tuº¤K ­JÊñq›è$S¨`ÅùÞç¾7¨œá»ÒYˆÔzq}=¹DÒ »“™\mã!†Ñ£êÑv±¹„[—¤ýÅ;¹'üa¢FÀdo<œÌ˜+ÏQ6Üצ;έÄ4è‹Ú$Pvfƽ¨+ëÈ«ÔG n`ZØpéŸ6ýl¹ý¬mù‹¨woºì:!bºw B9Àš )B{å+·uù8}Gü]'W4nýóm»ó†vQ GÉ#÷bB>ø…£”YƒÉTXáI(aiº g /OÀB½è~I¤Åööåõò‹në !¢¦ <('Ô d ÷ b¨!K aÛayÐC¿£)å¾€]<~ÿòøh¼’ÂÛÐû¸/>Ô¾Þ½ D8З$,ü)½O´HBŽÈ'îb,rO¿„,¦¼î–ô¹ûûìCSE:hI‹{Ò¯è ÙD„÷»@Ñ*Pâ@?xY7ófša›†ß6î4òOüë¸Ix~s«›á×)%ôS¬píB*§?Ì´vx»(ŽæGúÊk ÉoÓ¤ŒùsöM,°3Õcm „ÈŠÌŸþ#3ñ<,¶p1%ßp//eb;{`Ñ9aߘ–Làå…ïÂŒ‰ :S¤eNÅ:(%zÝvÉn]N³ì³yÒ¶¦Þ 6@1[TígÀ<8â__ÃÏ?÷ݳqžÕ¬20¥F!!’…2þ9¾cõ¤$Õ½Ò•‘Ë…’’{©vNálg>A¦F =¥ìxŽ9?õøÙOçó*.áÛõô󉦸•ø|îø=mG^®¿ÒŸþs÷ÿy æ_¿ô¯|H_Cc8?k¼´{ÑþoöùGþ¿tfó³ÌìY,ôâ\f#Ù¹­^ÈÂ|Líæ‰3ªEN!e@(–El…Ó˜J±n¢Hr3ìóë=ß’Ëb¨ä]ûVì¥ãh_  _¸/ü3úÓ¾ÿxðwŸWWB3^j!†{WÛ­Wm S9ØÈYOñp´_£¥½QäJ¦\Ãyuna]kXBÒáæ“­xEM´®UoEª}¾d@™6`ÇJàŒ›'3™‰v,i58K)㎠R¾ŒÔorOoÇ:Iv* ՞̅+‡\ë÷æû /mÁÝΠâÐUнÐ7Q‡i¥âpq:áÇÑ_— •Ør]1®²o`£J\h_0ö–{ù3Íé–rœ…Rò…L©—„ã"Ed+qè>KgÐQaN$Ö&ä;L·²6!]ˆ¿‚ç1ÖŒeM¬xå UBÊ#IZnD ìŸYaös¯€'¨ˆÁQ`¶$%Wb‘Ø‚˜’SD©Âå; ÷ÖiøùqÐâ¨ùO$w¦[n¢ nRÛÑÊ Ófµ –äP•BÑFåQ'(¹" ]Зÿ‘Ê\k€I@F^©Rô¦¥PÝ-Úc=( ·Ztb•[Çj“CƼkL¢’e³”ÅÐÒ A-ÜEÅY“¢ #²Bå ¬!qÖ°·&QI¨m&®vñHŠo½Ð.ÆÐ9PB©ßâBs!X@ˆ[’0p±Q²aÞýn¸5ÚœjM„¯tõcò¬ªã¸â˼ÑM]éV°55o“JE€4Lf#µ´nS•«b›b!ÄzÆܸ´M1™ëØÕ0u˵æ{´^+ßNî+¿DãïßA ˜¼Œ!?ö®U*iT(˜DçZ ¤¬L”Çcœ!%H{?!~ƒŠ”ܯ$ H&AžšÄ;“"•ObãË‚¼þU|s¿>w“èû4 U$µ…Qª ò›í )qq.l¢þñ_¿¼z7”ÝLÀîèW•W?9;Ù%Y±£tkÚ‰›µrríÞô“y暑55HHH)j©†ƒŠ•´¢"Õ@°SZ½›'OÀ…œÑ»ÜÌûܯÄ}»=›óÿCò=—?Wc7ç׋¥ör~ÌŸ÷ÉmÙ»ã]³Ñ²ÊwŸO;«'óòìÞ_¿|¬>ðÚß° Q Ø—uü4ŸpÿuWvÚ°d!!L¢$T H¢AT$Ô1$L&Ýεjþ ÷ãÃsd u§WÉ×­µspe#‰D§@($Ò1Ä@.X±”Ô É Œfq½+—î¶|`"2î¾Ü³C)k!0¡q±ØŽæC“ÿþoúœ¹/äãæ²B§’•Pa«Â0œ ÛöJÞ§ø¥KãPEIo{"Ñÿ–%y¦-3ß:{´·j~ï÷¾ø}‹­µø‰E^æ®ÅºØ7Ü7?¹›pâ¿y›† ¼ÛÖÜЩK ŠH°¨Ø>‚‰ññT¯G © æ£qß<±YþÞž?ï~¯å—F[n@ã!Â%¤¢éE"#”wË(Âê1zš9ÍõQ^Ž„›úz¬¡PÍáBƒ`çuý^'¿þ±ûm ®þãçÙS§ÀÌ8P`‚ФZÔ $I…B}߉߭Wñ<``HBE†zYG9eôbnçõo\y}‰4¯æQ¬ßþÇ·û?ÌÞy¬M›—ÍI Ø,ãÓêö—¡Ï¼~UÇ] G¡#¶òn×ǧzØL @¦P”BŽn`¶îÉ4P,tK B¨‚}¢ €•YĘåYk.e]£¯Rº>½}aoŸÞð*nNé‰P?Èñ¼{ýü‚Ì,¸4n|úJõþÿ¶ïmï®çwËßé_Ô“G’@ÿ ˜™÷Wj[+C˜ÏìÆ+]RBÍg™>™ðéØ[¯›ipwm¹íî#Nꪉ©hº+ÒAÃÉÑÞß÷Þ~Zò˜SôA²€•\¼Æl¢Ç9è•Ð}~™¶’0-"Õ“vóÎÜŠ.U HzÓ&„çäN™¶«×M‡öá9Ï£‰Œô—.úß*¦›=ÅM<Š ètE¢®3^Ñv¨6‘‹ 6…E ÀÂ-`­¡Æ±3„žt…9!Ì\ìaÓ•²ñl§ãH–E´0oëÙ• $£ßxØ¿¸M³¢—™ËL+$²la@TÆ Í :ÿ§ ÿÓµöŸþ×¹òÚ'_¼à5Ïžî2ØKÊÅDÔDL”´Šˆ”&Äz­¦öýÄó@uѼ N"lé´£¨CØY†£–ÿàÓjˆƒŠmÝ]É·"ć›}‹ÅäL› H}Ut¹Ï*¶²"jmV~œâ‰xƒƒ~å¼]/’¯ýá¿BÜÓÊ‚ë_U,¸rÄ~8aŸhL1¬qi–·Ý®öËáâNâŸ6 ðbõ_ìà°ƒÕÂ0ÈG¬ô;ÑGvq'¡Á‚Oê9áÆT¸åÞvp‰ ¸]¹ÓåtƒG³zõüùSü\å»á­¡{©u¤Êà}žI„½ Ê`®¾ )6èò`û½?ÿ²wênß&JºsÍhs†Kî¡[x>üNëb% ÄÁ¯Á&j B$—¼ÌŸè³>|ù@žïgUÞXã½µkøNPpã|!Õõà”*Ã8XMŒ8Ñ‹ö*ÎËœ(òÍ‹"O(ñv©WéŠ{ Õe^–Ò<]ç² +Q´ š&¨õ;¹~Ñ|÷%8£‰ËÍWö¢¾’<"ý†›=Ì|Ãþžð ÙwtCÃo„gùpbr¸¤Ýâͨ‰-ÃFŽ!‹ÄÄO¸)(Ål徃$~qÏ|é@8¨ót¬ÊD[w)Zh¡zÉ'\Lïøv¡q¤:Q™| ©Zj>ðÔ¿s÷w¦w6ï™ne*£²_[ÊÉÍM÷ËØ0Ãm2¦ñ­¾[r Ô-d¹ÙûKqà©Ìü¦›µŠ’3ÐÿóÆ6æ×ø ºÀI’›µéË"´]±Dr{º±fl¹p^ÉËg3Lе¢”[8Ïå¸L?ya.c¸Ê9éæ“BÝÔUE=Xwó¶ÐYìí°Öy˜‡Ûä»±"#è&éò[qghŠös^š¾WC@ùÁ~ܽ'üì¿_Û>ÿ¡ïû¾Këe\7ݳíëÿü_ÿÿáþÕÒÞ¾²dàlŒOþ~ÐúúGø;G=V¾ëŽì<á_óüËûûü&ˆŒR²sÆ%å‘W¤¹ÎÜm›\L×-aœÉ &Y†™Dôþ;/zþð—üR”\æ:Ó‰Îí,ìÍÒô@ì†Ëû×?ÿÈÊŠ¹üê¸ØÕ“:Ú¬Þ \HÃŒ#Ð2:}…±tAjÈF7nèä®)”£æR}Á±ÅLh[p/ÌåÛ´Sé¼éË4ðD?¡ADºy{žâ=P®»ð›ñ{lèÛr·‡xê{qÓúKŽtÑé úDt„‘Ó+˜½ƒÜt«EÿïážÇþ27S˜Qæá†„GŒ¨eíi¸ô:F«©jH@¬Cκ%=À`êÙ–”ƒ+M;p" І; AÿØþ-‡á+,d2Î’‰‰Ã®h*Û8<ñCÌfô›Ð¿LáË~å+7 !rB³QÔ™bª ³ïî²XgbÊ=wÇ–Ï(fCí¦=DtÄÑyv)bWìù(Ži ™IÁöϳ~¶ 3:Öe™t‹z¦2IØ:¯áiñöä#4kàS–G¤´QWh~`Žsqìì¤â‹WZâÀx¢ä'M_lGN)Ë4áó…^ÛÝ!ÁZ·Ë‡Óþ€òhüc/³÷ÀÙ ÈV¾ftBôš«×S ³ì&×°„¶˜\ì7º=®B÷ÜHrV/ó(“4à3[]{Mš1ôiÙ§Úùy<Öã2ÄEZ`@Õy&!Ôi>oɸXç¾hßÓUþhú\î}JÓæˆ«üùíùù~ÿû/_ì¿®öùmy–i=eP;´j`£)!Úƒ»ZÉäÔ"Jâ†nÜX ¿hÃ7H¸Œ,¨‰¦rrû¿÷þÜ7V¨Ì£}z\ÂÜúX¶0’ÌýäV¼Ä’æN¡ 82ÁÜý×v¿ûã7ëGÀ›Œ¬}D e6œ˜}G›ÿ—~÷¸j_g âõþlú^± »%Ù€f›X g°`(œ˜`´u_ ±.¶2ÍÌ%ÁcHŒ@A¬ç]û û6ÆÖy}¶ ¬u,* b´çƒòñ|CÛ™N@]ÂÖÀÔR)Š.dõ“6¢‘$€ _£Zâš®H¹uâP!D"ºˆSdä@ïâ¨FˆDÈU.lï÷n§5׿e5‰eêt¡ØÚòn¨W€èQÒ•$Ê-PEâ¦Gþ \G±  Gq¸`ð¶‡òW#ÆRK¬kÉA*YÏNY…qÈKV й·±6,%Á5ÛT 7q€!­Ú”sJÀª•Кá !¦(¤£œ?Á"ôW[Ða¼h¨ìhvª£LÜÇøñÃæ>oðcI~›¿~3¿Þúä7óÒ(h IÛ–;vÆÜn´’Ö*ß߇»yf`pi²ýÞæƒ¿Tfñü¥õgXÒ L²ß,á7cM% ÈRi†òFªåªvJZÄèY[ˆö l´ëJaº1µ´8ɆBÛÂQwÁÞ徯ö|ÿ‚?÷wW†z^ðêÏ+ ;ãíÎ&ú\Oð¥zIsCrÆêŸ¼¼¿98uYwÅmrÞ˹¨SÑ"hÌÊHAöìÐ!fP@`J9t$„‚Y ´¸¢Ø+’+’>WÿüQµ±ô N±bµ£èÿ¿>}ÿæü\¼jÄõ¬ÐºäVÒýµ¾ÔdÔ¸ÏÜþñî•KØ‹,) ÏKNŠæ{ùó_ŒàÊJÝd}îo>Ùé_M;¥©Êjò̬îX«[Ì«TqoÔ¨’4Ýèè‘}ioLJ´XñOì :¹oYY®·{Sþ À£ ÆB@»ÐŠ· ³­u;žÍI‰'*ö¦:Æ8ñ¿xr"­Ÿ+ó%å÷xç £Y¥F‚XK *a¶ˆb€¥.ˆ¼Ù6]§%‹÷º"Ϧ‡·ü÷[RÓ”>ÅÒ(‚Ü–øƒœ¨Ô»À‚¥vzú¥ÐVSÌãòbî’Íüeø¨êo3~äÌÊ!Ëð‹F8É7á‡!ç(§[‚½^CfG'À ÂI U1cfâ­RË1žî5gKJ‘ä÷mFfviMôFb³ôx96DÈq¥è'gó®KSðŸ'\”¢Fø™ú5;%lsEgŸ—ËLõwÚ/Ò`ÝmtqÝ›ºGÌòÁù0b#@ÝS¾ˆªŠªº: ?öï¨s?Ž9Êóz³;ó½6 ã§§£,®Å:>ÊÛ¾®šÊ9ÒÛ-y]JxZ³TÃõô¢IÜ¥[X]­7>Ánæ‘s*î-ËD0„(ÒÅÖXr‹#¨=ÏûŸ²Î8ç(¢Æ”5Lß2™«ò…7“üÜòÅ~Þu#Ü¡ðsº>èýõÊŸj9ØÖÙ9FYëy!j"zâŸcw#Ìñê¯_÷ÚÿÇûÿO-¢Gf\ä!i ¬@†€VlN¥©‘r)+Y<̘£4Q½05€0g$ϯy¯=•jDÛÙr  Ö‰ x¯4çý¥ÿÍs©¿ïkPc½™á¥EÜŠ+~$Ú½°™TF§0…(R™øF 3D§é¬¡¶Õ  ’D‰Ó`±Œ»ù:ΧM«³;ó¾¥…°M Å"¾6_¥Sº’¿“l/¬£;æ÷Û¿×Ì (\&¢p,€9ÿBnôŽÃ{ÒQhnôl)å $æãnÝ_ºâÔOô£› € 0*`> d*Îe‰FŠý¼¸ì _=«ŽÅh5ª “å`aQªµd2çšñPVqN ´YW÷Âxvø a”ª3AÖ@b3¾dÿ†Iœ£¿dj±`M vx6Ú‹¬©R€¡3VðL CÁ Ýé¡Ã{ò ¦*?‡~û¿óvW7`MMÊ –Ñ'MUh1Éí,Ž?/ÿ¾'gy¦Ž Ìy‰sÕ›cà¼Y–åÛN)rÃg@›eðÃØhxuà ‡áéðÖgG£‰^ÃêÎÌþX/ŽÂöh µí´¬QÊ0O„ž¯£C{U#ãï—SÞÈrŸêýù}yý8N†ÁŰÁ>ë‡Eü«¹?»öv‘çcC_ÈE ¼ÂÊm0#ªq9úÒ‘~97f­W{”ñ^ ìMª¿¸ŠPØnî„#ÿþ ÷è7x8ó @;ãÎ-î ï›׺:»nŒ²ïó+y}S~õïëý<ز±JwÁ‰G ðê3ŒX…œ©Ô*ÄéÐðáJŽà“ ÖD#µssŠÆOïoüú’¥Ëd(×ðg(O¨hP«m¼åš¯ÛшS½tB–ÈìBÖõ—쿜Ȫ•'q˜×ƒ¥½J¿ôÞQà6.µ´,x¢1 }:7ÞßÔ–4D[¹5È_ñßÅÿáQ“L4´µƒí±Æ¼Ù0õ¶u¹"Õ Á˜Àš”ð I‡b¿•× ÌBñFPPªîFì*¬ó\äB¡&tº¤ ¢“‚Bì‹£Á–š_ÏôGÎoËöÝe·³R)—X Ü° Ú@Üõ*‚.U^\`AÅ R$2ð“ ÆÁŸºyÚµ:ëEÖ`W%£ (ÀDcWg¢ðl6%ŒÖˆ<Iu10Ô8jŒ ÃË1‹?ôV\’H Á2\AeDÁÊ5ùô÷.(’è“ÁGñKÝ’ Á8 dB.‘øÊ§”h¢c\ @Š˜L+!bY1ȨT¡6ûÕêWd¬Š-£q!ÒcÞý¦ ùr‡úõ>Å3 ó=Ï{|ÿ=þPxæ{§y‘Ue˜C ¤A¨/®ïaç/îëŒ<åGowÜï“<=àý-zã‚ß Ž«çoÂ×^¥o÷ú|©q¢ªXÖ¦aYbà£GR4`°¾ÅÆ79íWR¡Áø“¾/¹¿ƒgóNM´ nÁqS°#&ê¥Ü˜‰rý¨ògÔ¸äµwìû®ÉèyÀsJN›ËkÄ'^ËÍ£zàÑL–CVμ<çè†(h˜ 4 C&U‚ ±Hy˜„€@ UZ¨B2Ä€œU­ëÝEΊ|êÌcÏÊ öªí,Ä”×·vþs>önïZ™»<î2ŒÞ@†ÀUX3Íaí†RB HnjÆÉ(®üñÿüÁpTHßmÎØïPÓ!KÃ:=Lº¦—íxeÛäzpºÁ~ÒóTkè]š@QGäa•æý|°f§ŸÅ0Oç†v5»nÂð¤/ž;­œ®ìÄïò}÷e}ɲc—¨hÃÀd:âgøG²_À[Áƒ¬âybV´¤ÙlWÙ¥î \íϵ6{Ï.Ëå|¾ësÚ¾__|¤ožÿ:Ù n?øRDiÚØB¹Æ0šÑd¦œ“d%¨Rw#;8¨aFÀëQvlÒôáCg ƒ^o’ÅÍ“Ÿ+“/(@T€,cPCc B* @phK¿øhßš±Ãž;c>ŠkpSa¾g}P ›ß=~ÛÞ¾×å›ù”ÔÇÏœŸ"¼¨“gûú~üáö™AzYlÍz)ÍûS2ï£8ؼ¸íµ)´CLR^ *—ÃV¿ÿÞÚÕóü‹z·t7öÐ (œ¡aáqàq;&…‚¨bH,É*¢ÿmàrœðf.xòؼg`õPæŽÞ÷!õ¸=~”—Ë/D°øÏCߟ*|~øçëË‹ówúªIÇ‹÷¡ÀŸùéæqX«ö¯Çú½r®y/ص‚ºË­Èø {.°ùÖäpú›Uï« o?¨°Aí@F ¥Pa‘`ÅC¢¯Þã­çoþÿª¿bX¾yxçñÔU‹;÷ÛžÔ]z©Œ«µ2|*å´_ ]uDSd²Ÿ²*êQJæï”°ó×âXÞÏ–îQ<Ùßõû=£ìè-5·CyÔ8ƒb[‚D« Äظ€]Zl' Q‡ƒî+2•ÁlÍ|r ùJú@(ÚıÕ×È•µö~Åwö<¼gï¾ ö®^{ß € ‡¯I$bƒÊ²é!ŸÍX»U”1‡·ál+€NYð ‚r³æ†N,TThꡨS\š„À˜A“‚J7¬÷G÷ë;Ùñ¼„Iy*3SÒ‹{ƒ]n%ð–ÖNT­[W/5\mäÂu–ñ©2Û^·?×T¨¤»_雯îlÿüy¶¢:˜ker9Ø6î!Ìpuk­¹pÍœqaSœcѧV’ÚM¿@ïi;ér„Ð)2©B´“tqºÔÕ´{2žg³ UL„ŠP´ è0ÏÐçf¤]{«"#é›'W£WGþTïÁ{Ïê±X³{òøS¹£š’ö˪„Ü1ôp|%7pRpÐ(4Ô%…²›Š®®½áÌ¿ˆyLzo;š¨:Á"Ë’L{V,Î’áFE×ñÁùé΄ËF+祪Ժ‹±¯t½/FƒÑ_çly~e~ñMa¿9zè·¤Ú“âY´ÞNø\­úå¯9_óøH·Å j‹’«›jF™­Ø×ÍZî=­·s$òžNdÀ( w¤ӧ;JJ n^ÙP"¨¼jK«f#¼êÙÕâQþx‹qK¶¨RäåIôêÃIìm{anáŠLY €©Ç~¥bAìfoOyF ó€Ðš‰£­ãˆZ"x®¥áqEîU6p‡Uz»3Ä;óÝÒYwr¥0®M¦ê°PCe›õ'xX|Æ0+ ‡É`F¢T$#ÓìߨØÈ;»›7‚²æ\ÂC·AõÚ™mAHáà€âI_óü<,( JQ`˜¨…”†ŸÌŒ°¢ÂÒi¡ Ênwt€ÑÉÍ—.FØ{“]‰^¼óžŒ“¿Ã9àÙÃN›ájn¦¬¿Xïß½¹t¨r 1Ê>Î4Ç#9W¬ ›^’ ‰X9»ª®7.c-=ûFNó&NÜÑó*d 2ø3ׯµÃÛoegýÎêš{aï[¾zÝÄË%ʺڲùl¼•Êü+#ÈG§æ4»#2Ó3Îp€5ñÈŒ2žl £âUmaG«:¦ ×MopëX?Ý ÐW"ÁGwCÁ¯ùO,Íýáïï2®‚°xŠä\v0üP¯x›në{LŸ5_6Â0oeÞt>1F¡\sntù|ÉÞé÷0N¦ÓðãÅ­%Çu6KŒ]áhQzÓ|áùPå­{½°Â7ø¥ö‘[üÌ•A‹ŠwÒYjX±Š ¾yüΔ¼C~,ù¾ý)ø[¾šŸOÿÓZãF2ÒâÏ KÒ;t6 °œbo¯ihu šH…C¥ìååx.pú.&wúÐ ùMñ-ÊHf‡!ÐÒíððµœ)fI\B…£ ò‚¹ü">•‰&}’ŒR”„â0fDpE^m¬³~sÙ%÷“G ¦Þ/î3sÑz ä Ô’àÔüÀÖ¸.„¹˜]êÛãÑwÄï“ip2Ÿ“RÂEYš.ñUúdRvÃÅòÙ3†éU²WÝ2QÆ1ŽòX 6‹.p†ï¥Åût_pyˆ/˜ Ž’/ >ø<„?ØÛ SfÉ¿œl²“é´æù3§XÓÞ¾y{F†EqÒ¬!–„ŽMqQ\ò • )XV›ÔQÖ7ä6µe‰<8©¬ãÈÓ¾%žŽ»]èóÄ™ŒbK¯‰†ñ³Jô8¾žÊõMoyHôÊÒ*rTÚ3¿|ïë_ä\2jؘà)çwñõ¿ËlãïÓýžèOù×Kî7ÌìÒgg‘š2(3ó)S®Yieþ *Ц„€ÒøåAf!$CŒ“ùÆùµnìmñ¼EÀ’Í©šü‘÷'”Ò“¿þKüþ#òêûw"Á~ÏÍwÚ\òÒ«èMó4dªG¸@†ˆH€#š2 ’A"´²½^èäÙxq52mlnupfàˆ,iµ×tˆà® ö&÷”|I¯¹IÆÌmÚ¥TÉötà“¦*4#uÔã¯GÇ› ŸY²f46Ù”9ž23ËÅÐd6öÝcx®í‚¦êDcB¢³Ì?”¦¬´­-ݽ¢0Õ\ÛEXèÊ0Œ Ê ´2†œ¯XjnpÇ{xñqL¬¼byZ†Ë¼ìŠ›öLŠg§”™±ç‰(,c.•$E œ^ÌþË&²[”àÊPöäÔ(‚¼T+ÓdÐaŒ±cdtGQ™)!:–x8†à ׯå§ËÀÂ2}»xt”™I\[z‘穪_¾¼ÝR ¨úbR}uí5†Ó!id³É  ~†¨(HÁ^S•tÀQ›ŽbŒAÁ]æ®@?3m´²'±ÚÌÂKá`øm3-]ûŽEOòЛãÈé7®q –í^N_¹99ç7íþñ_æ/ÿâõ[_þÚó{öóß ·ºŸz‚úô™Èk9/©ÔÖî»vѰc‘k ¢•CxœÇL÷¹£… I €%ßJG}Tôહ«×ø7_:¤4±¹[sµ¯°‰X±Ÿê~¾±¿Ÿ>NG€¡ B;‰6톘ŽCÜ  qÕÒÁM$’É Z+mìbÑTÎóxe`‘ÝŽ«…Êô¦üOùE¹ó–Yg¥ÆJ,ñÀ¿ø4Ÿ~(&2&ÑÁ> *ÖDñ.9“¥­M°Î¶·’tŽsŒñar“S0ƒM“¾Úêtžˆ—í]y×lãmêù¿·ýO8 †¼bÁ¨¤Ák•ñ ­`Dbù(‹, ^V%L©W(43h0Ç•h QGŸöÙØå–w[:pEav™dëØ!Æ…éKgWû³„…:-ýÄP'σH²Øb(n1 ¤N0øJZ&>m#¢¡õÖ³º‚àÜ:Ÿz :ha¬K¤lµ‹¬ŒLCetÊ&’ TD +)aGD"l— ÎÖI±Š µgjlæ:¥…?Î^÷åª+™!Me¯ÒÌÒSžN¬¶ P­Ì cJt‘"”O!ÑÂ5$……ëD ’Œµxq ‚Ô¬÷NÝž'H­ÊpÏ­§ÿöcäœOý™|^ïç­ûùOçoß9¯ígU÷ý‹c¨ 8³“2€†JØ1Ó›¿£‰Q÷‰×ã~cç…¢^Êê-¿°…çûÁùœ¿“>W°Ì"°†ìÅlHmt°­}Á:Ž‹ìøJ ®Šâ»[ØÒªw±÷uã÷ô³šñpz<ƒ©Tã<2Ä,³ÙE—Ä/Ñ=†—Ó\¾ÊæY Ò)Sϼ·]§×&‡ ZãX1ÉtvtqˆAÒ’í`¢€Â@2|(ŠèÁƒY1„ˆŠBäv—¤ØT'Õyºõüþ›/Ôs@ ž_K ”¬aÖQþñªßºÿæígR‹Ç¯ëï6ÊêÕ¹Æò¹8g^ô‘YC]±K˜]ú.¹Ád£FD !ÅìQ'Ëb‹²ôLYø{ú^Ñ5ÿúAä?¢yŽãæµÆ_“‹à ¯/×ÃUŒÀw·yý¦î»Ç`6Cå+Ó7z¼Ï;u,]¥ÁÛ*Ûu‚§w‹ðf*û\“Ô™·Aµ \"*—ÇtMÔŠš®ˆYõ¦˜2#Éêiš”\5‚€ÖÈ.·«ÝN^Ü4Uª«¾4wúÚ‚…ëœ7~¾÷ènÚ„Q£Å™2$ÁzìuN/ÛÃî$Í` b4¸ÐevW™ò/ˆò€Dá/t‚ðÔ’'†¦ ‹`ÉC%¡„,!Ú÷ö¯ß5$/5—F½~¸G£Œ D7$¤ ½hKZÄËûu®ö!kšá&NnMSªhNq™ûlÎÄ£¿™ÕA,ÚA0Ž ,¼:mø+xÇÄ7:Ù˯\Ý…qx¦Zûcü`ìÇ2i¬+šž ¦1c™˜¡ÐÒT Eš¥3Xg½êæyVή‚;D¾«Ú+c²ü«ù¶?âýpƒ¿+`¤Mäv’íñÉ>?wåL×`RSÕɬsowƒ;y§ìŒe;¶V>Ô_l˜5ð•b":[½ô õ]ðØIâSï»í¢ÈÕ<³Á_ìúÖ’Ç ghtNŠˆÎr³"”kˆ&Ü­. OÃhŒÇCQëøÊÇÅkOö†XËj¾oþT»³¨ÝÖλ9Vh=80—¶ZŽzÕkܲ[oz_AµèW?“žŽ¦ |hþ>N[õñ’˜iÉäaã¶o9À¦ØnJé®î8ˆ ÈÞ^º—ëMÑjºtjŒUžÑ~à H ËM;À°2TI!€ÈKPÁ­Í#ίÈÉ(´W»óUäüéK·CvMZcÝgÔ>uß·ƒ.dÙVEÌjózifŽê£ º~ŒÛéeD·íyÒF+Žfc g«í¸*2eˆ›ƒÍæcȹ[€#ÏIOð ÔŽ½Ïä0«oáÛîÜÂL)L¦§Æ³»'6¢SRJÜN|í¶,4X¥ät«»Å8˜#µÄ®ðY“‰ÜŒ^"µet°y¸“.¼j £D 8ŒhÐM˜Àw²‚k5b¯wÏU/ô²bÇ̘¥¯Ë„=¡ýÄ×h‚líÔ:÷ãŒÏÑÒ}¤ µiÇ›Ù~:qÂÔÐ †ÖŒ³S¢{i¼³¤­?Ÿ5 HŸ ]ÂõgûùEwéƒj€ªø ™Ž\ËôÙS¨ÔLw©‚s¼£|’›ÇóÅ%(AK3| ˜.š^0ذäÎÜtû½•{±éwè¤a¨ ~€hO²´xÆŸW?½þ©ã¦µ] ¢¦wà5 sRZ,E'þ¹âk±%+ü`ƒ@œÌ‰‡.”FÔeÆÃ»/ý>ûtíТÇ47Lð¦¨|¦¿èb±žt›^«§odŸ}%…i$a©J" Òd²2ÃMt„9)ñø—¬?¡mŠù;&ŒüG¸]@ s;^ Yj¦s¿ª#[Ý{ϯp¡_­ãr')€žE¸rSØñÛãÍ– »c~g]ŽOá%¹Ý^a‘õ:±býŠ?«?ÙCÎÕoÂNC„ý9HIår,ëV»ž®ºœoËï†4è÷XžHÍ‹•wÖ÷»{ïœhæÀ÷Tï›øƒ®‹ÜÂN2,S_SÙ™±#h Žú"úh÷(Ééש Á£wBðÏ1³щDˆÀJº@–?jæQ'[[ôD¢›gÏ´Oï^Y®ñYj@¥•+™åIW¬oÙß/:ÿ¾Ë®×¯žÍ´Üëí+M¾ØwáBd0:ù†òÒ„ÄàOdQ**Ö:)(‚(¬ â^ã lÛëI(S:Õ—€r­!“ÕÞµpºrÕ®7èA£ À—ý°a›pe¸!1-øgX=Ý®¿œçs"­‚ÁH‹ä•èKφ+f‹ŠYÂ;C9æ¬\J0€lC{ï–Ma]Ey«io:ó +YÜóÑÑÝÝ7x´žLKÞûûŸúÏwýùçñ^BØ­±À¥2JYÏ8™Œ½ï¹'çÑ_¿'¿×~¤å…Do~¸Í µ#Úö(‚…TùÁ¿*t¡S=í lOnÅ>¹yb2â(^+Íìâ:q¥ x󑱞Ҽ„‹4 êB"]Ò7r¯Ði¶\ÉdwŽ‹/óå·_Á&©t‚sʼÓ1 #¿–ëÑ_Å;ʽ”bxÖ6à^t¹ñù@_E.šÝr»÷»üëMïÍ)ýL_Gt†T$©jÀÀÕ¥k;êU'wÀ•С—5„†®¢¨P+ŒÃyiB÷ JçÈR²6Ì6™ “T0g8»ÒlA…»2>BÕ^šN…•ä2;⬉ñÿ W³³‚¼ºf Þ]oÁ…lÓ.×ãFD‹A¡QDB0IAH>Äy§” h‘= Pq²Á§«¶g¾ÚGí½¼ìúšEwó´Ý™C£|ðí-øø@|ŽÌ}Hk-±Ç2æø,ÿÖÑH$ ‚;.,z•ã–‚ S e{å0tº—°C«W­v÷eM,“…„ꥪŸSÿ¨¸}P%‚šu¨—a׸õ!YŸ™.÷z´Ý²Bzc¾>_ïcXëxÐÝ4Ë›ª¨-YÍ=Ì µxø÷VY?ë^Ñrz?rËã)î«gjÜû ¤ô’4F¡½]q ¾óv«¬=ˆ.hŒ{ìû>ºïY:O¸‹ãñZþå¹i÷ú€f»nµ›ŽÒiB7)òÁŸØýÄ[ i´Ð+7ÁÃ-v¡¦£Ÿøº©­*‚¾ñ¥$¹AKËw.&£¾çú˜x›mÚâT~ ‰RyN”^ÝoO:¯`æ,‚ü’ý“^uËZ/Ê$ ?´Ç륆 ÌQêý¨7Á«%ZÑkô‡g¯ MZ„ŽÆ êòÞp) IŠÆ„‚‚Ä@ žE,Õ˜$Ì•/¶FXøÆ"–HŸ¹ï}óêOÂñ‘ýdö£óußËö®¢u¸©ë*­Éd[ÌbKHDBÒƒ ‚ï(ŽAH0E€*¨° +HüÔYhƒuaðôýãïx¾·A“8X/žZ° 68@P˜"Í0ª+K‚@ P¦R5™fš,ÛjXq¨6@@±… 8`@T®ÖµŠWk+<çÝò}øçhrÍ7¨†zLòvË肨^, t­ãdŠPÜVî©3„µ¡„i¡5TÙÁÄ-ôxÁ=¯¦WÓxü?}N¡?5Oý½ñ­<Ó—Ïõ¼gÿÙ™<›÷nx:´•´£«/ûµmÙá%µóo+Aµî–¤ï jõ%e}—ÁU{oP£àdQж¡,Y™85…)È@ç_IqU¯=Úƒ·tëÝçoù®Û}ûï[½ÝBÀ!0>æ°‚ 7Á¡‡E‹ã•cýö܉ùÏÏéÿºÏÿ£;¿vŸBè¨8ƽ~NˆDÀ"HÁD)‰A" @ÕÔä[Áþ$ ØTŠT±ˆŠ€æ#YYà¡bºÌ.Ð'Ï÷Oš®Nñl™TÙ}¸›|&g`ý°¯ŸëÇó¶K¥c:e*)d"B¤A¿æË4ƒÌ|2çÓŸŸoíÚN¶ÙÔ¼¸tûÏ— ¿«ôÊ%ÿÏØUÂ@ƒ–Õ&òaD0ãSiÖ—‰™VßïûoŒž^·5–m ¼GPïí5ÏUsöæ5ÎÛÓµœ7ê¿tž-òßþþ¶?ërÞ_¼{¸õj?&~9•ŽúµúCñIîÇýõÃÿñkò!¼¶ëA¤P&2ì)ˆô¦½-ýžã—ïWó¾ø‡ÿ&oå}üÎJÂj÷ÓÓM^^Ì?ýãc}¯þoŸç7ï6­¤K8œ®ïN‘±€5ˆ”£Œáˆ6‡E Gi¢>Eö‚bt0èfFÂÑQÏíI`™ã€b†t«§S~Ê' B$€ LI€Bœ`ñJ+¶Ú3çq[-f KöŠ|Xr€Z@µxû­^qW2ÓE¡¥ôø¡ž¦ç¹o§ý+äg3@‘GX`IoìíÁï£÷ýtîzíËÓÍçõ¶ø–;vÔq)ì„*¡=ôÇzïññšzk?¦AÁ°»Oš&|BdÉ‚xZuÉÚ´!ÙÖd*Ÿ¿Ç=m¯ë»~Ÿ–=àÈù¨ü°6?ñ?À•×ûWƒiý24ñQì…¼ºéoÔ9,ž-FpwŹbí'ïFh¯Ù‡Ú‚ÊÃóÁþö›WØwï÷¥8÷÷͹úyB߾߯oëë§ ¢&·tT†C]6:qšURd'ˆ*›ÈB桱GíÖîÜçææ¯´ãÝk¼VÛ‰—^ýmn83˧ŸþÍuµ˜Pz—èš à«»—Ô›ŸhBh‚£¡¾‹à$-Cjb.ƒgÃ>hL6Q"•°˜.ØÒOUÄ|t…U™2Û€€môC¸r@Ü(骸2sÅ,è®AaŸÈN–4îϘkË ù9‘©ayR!ºUv¢9,TºÆ„¨TùÚRïúK³c‡³õú2}¯Uóè‹èÑUY“Îô‘O„hôäH F ¢‚ZPML@:À""²'¦A0fX©uyˆY û ø×ßjÚY¾L‡ûÛ÷§YF÷ñF; ¢T¢´äiè ZžÆ:Š{u‰^ÞdÛäê3s·8ÂMU“ìã׃äkuG–Ú­R^‰öüð©ï †Åï•-"ë5×LSW™¨Á,´ž~•-玩 K³*¢£ZL»øPìÊÕ¼ZЂñLÌä’‹³þìëÄ÷¿xÙõ{q,Aë>^FïX3Ùè)¯Þ/ë_ñõ­/4ª}øý7¯›ÜgêhOÀ]ŸIëôª*åãв†Aô–1 ­ hÇÅn½T¶²-¬IhÜÑ„+}[_:ýpäZ•ÆvWÇ—tÝ´€O~]yP¸ÊÒZR¸a £Ð(Ogéb§É…fÃÅbIåïæ¢žOK^Í j5H£, áÇ(›úµ#"W+Õb·FõEÞjpb¼iÂ&K‘r4/ª¥ŽÑÐm»ÆA×O­®)tC†r»øÞ‡oœkeã¢E¥µüÀú"Ï OxÆØy«¶èÆßÙÛl.µheXHtZË碭Ý —å¡öí8#g7õgÛv¹2qñdßc‹.‡¸zjÝôM¿,&¬âëñ“²! „9gAh\V܃íꔘ$£³ø”Têm3JÊô²:óUF;wGñž{žÿœŸSíð·¾>Ø\Ýʶ^·Í3ù¨/mXBÝš\Xí£ªÃ)7ÍÛä%UZq´Aï0Ëããèî%Å­Q‘t¤­–˜H¤pïÀ£&ac@¾˜â«µa9ÏjWùpuzÅ÷ã8 ü>÷ÞƒŽÂ­ëÅlqU–~XùgXÔÂ540}hæÀ!ôÙd¾m‡ÕÖOsŽï\ {^WD\à-]ز$„,Ú©ö¡Õà?[<ºtÃr¹ý–ÆÊÞ˜¿ëüÅûh¸gÛ¾80³pCæÍ;çåßs‚p‰ ‘zè³ZXI¼”ûvfã¸w~ÁXŠÇƒž×É:¿NïJþþ♼µíD >jZþNG–ý¾ÿl'}Ü \ªiømÍ’aw‘_{—-ié)‹g™n6Ùäˆx)@Qs{ÁV:⫼ÁÏ*moÍþÇݱbæ³øcX”ï £çÙ ßýùÑV¸CyæFn}ûP# FÞtžE)ᳬ„ [B]2 F±²ñ‹v¦“ñ:o‰aŠØêÖ£ò!ÄrËûÚ~>ã#¾¥4|ä=°§u”I!>19x_ûZ㘧°¶½ú<±hº"/À°dHT3ã4½,·Ž+(ç*df¦— £w¸‚"Îq¾Å¤Y0yü¸x‹çn©Ü—ðÓ¹EŒ63Ù2O!_ÔÀôíÆiëy¦*# €úDfa„*·‚Å€T©‚W  hË:`¨ÊAHA[ãb‘¢ñyõGò¥:-’ÙkƒÄP öe¯Ûtͨ9;C¼|)§q²Amè3XUòWÁäBÚMWËQ'ö°†£Íß¿,–V\Ù«Q×%èfe¡;‘laŠ`:xÖÇ›j>p Çs¹êÚ¤6×™ô£ò÷_}´S~f,Üx¾bºbq¤vûºßþù›íOו­`óÉÞ;\KQúkÖO‡Ä0hâ@!…Ï‘^̦^´‚ ¬3Ní7Ù¦¸KŽBÝl3BN%¼¶ûÕIqgæüAôZ`\©¦¾G{)B·ªU:‘czwÓ*CíÓ† ¦×àÃøkx2£&ómñv|‰n*7üÅûDuü@ÌaÎ.ú{Í7¬“ÙŸp†7û»Eë®sÕþx‹](Û¾Ïùù|$IAU¢C©X6™|4Wþ®CÛ€Ð0¼Rï¶hsšülæé¾?”Ýz"FNfÿžú«™oå'ð¯ÍþµÖá›wÒºâDX™EöšT žbrÞø}!@›Æ=èB}ð:»öEHÜÝ´ÜGþ?õ˧YìhæïŠŒe1ùX®KãÌ¥“,åæÅ]fúôh_‹¯ÀrdÖ ]g}=Ôü‡~!M¸—4ô½ä X±=…WLͬd©Ù-Õ´±ê©\yø_öYbøNoÄÇ<À»¬/„’ c`Ðz ¬ínqãt€ ¢H™B"L³ãx*OÄ…vÓ^ä^%ï‘,IcÕOéLåFóÎÓ}˜^Þ®g9à*2¸Ùyßý½#.Ëël~Üj ã+G4œÀI$ª£·¸k‰W\AÕ¦ @ÑY$ÄxpÀÄôó¢üì÷”¤òGÆ·Å-cwxµio[X—P?­¬a?¶¬§D®bM ʇ  ‚RU‡†BÍà•–‘ˆE7Îa¬$A~›}ça›éÙ³w¢HÒD¹Ô a*.üì—snã­$>F(À’Uk®…ÙÇ%NGKIb\¹A ƒ‰D–,NË'  ‘NÕ(E6>*TA|X6W….A½KÿÔ•¹®ƒ§»yþ×™¿[¯g¡!”é¶7{®]½WÑÌ6&»&½ÎGæß‡ýeºõÙp·ìŒE2lˆ{Å 8 N`+`Æ!V;ãÚ¬ïÁ=n‰ü àtßúh6£û/žÿÛ¤üg¤w+!‚ªæï^-DƒŽÑSŒôvJ¾sõòƒ¿ÍáÇá늭°tZš„ÄD ˜˜”ðsþj€4ŠH©Z: ž©0TMQ@¨p̉E;‘­‹t¡¡žœ™0"àÙb©›¤  ™m¾ÖÕOÊOZKáå›^“&ÏvN{×±À?¢ãhMnæ8éé?Jý/û­ñý'óú¼|þE¥¹ã°l̦ºñœ oëq1²t9Ôö= 4uÙN8.·ÕÚ4Ö†ø^}ôsÙCWiñ4ÖÞ_¶À.ÙË·óíðÇ?œ¢ÿ ¬ûÚ7ðÜüÈ$÷†÷oó×Ç¿‡†`OÛi]JúâËè>:³œg¡ÏΡ·íSñq›roà½\â-±Ñà ¤"õãþÁÅ—öSÎ #6—s•—æ»s•ÏDÈ+%ýøÏTDªÆŽ‘XG¸•»2Ï%õÈóè¼~|4rÅu`)‹J®¿€…¤ €.À´Ðˆ0¨#ÒpQ0·µ 59^~õË_µFϬ0 Ÿè]À&ày®¿ùÝëës3kª¾QdW üÖ|ú?¦•ûSíô[Cæpx ä¡sÜúv†^çÈ-û“éÿüòO™qÙ½ °È¡‡`@ëß%ü±ì9€=PÚàçx¦¿¬Ë{Ω¸(^ã\×ë3³±òÀ¡ªÏ¯ßcvŽù¬JŽò%¸l­:MFÚ‘ì¯ÿùýõw.<æåúùöµð“òPgHv8ì½Ó‘¯+µ½zȽ<Ôá—®–â/õLmlî1t|òêÇßzþýí§œªA{wäÍ ‘Þs‚Fhÿ|«Ÿx)HäH ¡û~fŸÖ[¯wedáÑ,…ÁØŽ”&uLìº/¤BïÑW!æ$IhÁýž¦ˆ¿ïâ ô¬ßÔ'˜C•@aÆÇãO nŠ@S/"„ßU÷‚ÔUƒ´%ÄXûÑ@’Ãa¡ùùÔø;W‹ó—`ƒn5ÅŒ~\¤û‡Ì%ùc$‘jì°Íè T-TÊA ¡è¼æw¾ýå÷¿Ïç¿Õæ8•cÂ<Æ‹ŠD{  P*)@¢”‘8šx”KcXÞB•4è4=í¯2³¬kͬޒðŽïéÍ!=€n‰#l!KŠV‘òߺ‡™QÈÊ×v=¸@K¹eûùÇy›+A7„I2B2ã²ÚÇINjJçÖ¦¸ï2Ùr:ñljÊ/zª^¾ 3‰ÓÈóì“ìÇ”?¿¶šö¢È×ѯӛ2X´È`3È€!êôss櫸µ ¯“3÷,ó|¿®«Ó´ãxã§ðo<¿ðë#Ré£Ò~'-¸ Χ«—¥î­ñÙ'›%êÇÖ‚eBÎÂ^uЩþ¨÷н̤õÀHG¸2P9ÔbMßÈ5k‰Õðj\`Ã*ñ^ÕÈ•ÿ9Ü7rÙCc?†î À¦›}„>,b FqVúŠ4j@ÄãZ uí} áÒWÛà¸:EÎY<±.j±&FBV§ÛÍü6ÝX7ŠTÚ+~Ë]ªdœdË`žì8Ç¡4RBtq úÞ5®õ°u£.)y§cACÕ¸;Ýf5%J)³ålÅÅ`Ä^$ñuÓ§ÀÔô7®ÜÖÊA¶²­›Ïrº:Ìe{¨DÇù…¾õqOPãNCo߆¼dÁ<ñðb ÊuðYŒ)§Ù€•h‰:SNDµÂ]¾aH*óÄ8”~<§EÔ@š‚9ÕÊhç TÆ(-MqØ÷Ñûí;ûqíÍÇÿª¦Ø'ݨOÜ«¢=,-º‘s8÷ŽÃôàÁ’¾­5 P5~Ff)lGwe†ììÞi=­¦­"Ô=ÕëÌ–iLíµmG‡g_:›ýÕm…Ö‹¨í+ ]ù–Ø I¾›áynLRÂqX-z §VU®.zwUpš½ÃÚ4œØne?¸@Òî©,ìe7íãÕÚÇ%ª‚À¸Ÿ÷’Ï:÷`ùïóN¾ï— mDsÿa~ß­:qŽF˜®o[:3¹ÃP$ëh ¦[68d<Htè KªÞ—¹ÆäÊ…åЃ¼àŒÄ§f¸‹üf»ì%šxÍùIËée“ÆxNû5Œõ¶áœNxg|ƒ·«×Lbîl\ðÖn/E²›'ãF쯑$®5!ÉŒÍÌŽÿ=gŒ…Žê§½ êýZ ÁYµÎŒ«h!K±©¨£=-Á 8>¯«óÖD@ÆžnæÒgýÞÕ®„‚Ô"- éïº/cƒ¿XŽH‹'–Ø‹v‡í'  )¯f2’î¨ßŒ5½K ÿà¿t18%6¾L¬ô_ˆÏ×÷>>˜Óo¦*áïŠ]g@Ú€_û -ßüØã.È©—ÃÛz»8ùWü‰ßs®ø HÕ†}“—Õ ã–P¥ÊI@¤›AkÀÇ´°‚¯¨Uvíx€§OLô`të>¥ÁSmµ­Br Ü0Á¿ì‰».­w`hSæ—E úmnÏé3+FÃ&Ò :ÿÈæum¸ÊÉÌXDUÑƨÀSN-ƒ>ÝÐÏô¸+n\Óûœ(49vÄ33³5}¥qEŽl­³õRد­isÈÖlqk‚1$«H̬}¢H¾.ƒ¦¸î—Ha\G”ýrïOòxgÖóûUð"/?þ°¯³ÿxùóv¦üðÑŸÐÏÌ«$‹ "±@¼;~Ìùî7ñ—Î,-"g#ÛÐ@x¼‚–K‡$¬Ed·IfKÇ…£T§PrÅ&èIŒ(BªFoˤvXõ¨Áƒq:\™éÝΟ¹çD—wדèX$5/Ó¯È ÷rj*–㈑xÜǘ}’“&›™#Ö0-ÃÚ Âø€“ßhÎe£ïLx.Ü™YÑ]u"GÀTÛPœÀ3/l§hÓ«ÀVeÓÊ«‘nT9ß{ÞÆ6ÅT‘··ËÏèÎVj–/<ÿ'î+×Í eäݰA°Ž¤6KîgÈÕÀ2 íŽ ‡Â¦Ì€%äóYOò6d¡†ÙcÊÜC×áU…O €6*©©v#;+ʸhˆ“ZŨ&c¨/òjg/0Îa“´ÀxUÝŒ«¹ÕÀ 5].˜­È¢D¤Žýš¹Üâ,ßž™¨2 ꀓUR^™éHdI˜Q'›Š±ÚÝ·ÿQƒÏÝüöÿÿtv}Í~ù Ýå´ÿ4×Åùw'¦çY:åÔ·|;< ~~]´ã|Ý÷²T&Û_½:[)fZÄL5 %HÔ€†¼a^M´,°!Ó˜a€&—Vç‡y¿àæÂy÷{àù²1#^œ‰nà6¤¯n¥ë×ó¹†õÆÅý ë?n‹ùí‡C§Ð!òÇ=‚WÙÊ‹zöFÖ{ø¨SîÑé$7…+=únÿã_‡/ç'nÖü„_?¼)ª¢ÕÕóΛú²—sÑ›N4¢µŸï]zN(>䛯³4(%ÅFRw¦Ý^}}3s¯óTŽÓ¿¿Nêp6™FÀùaÞ§È%ù¨²¿§Þèt%jáLƒÌ»×lM³6Ô^Œ† iì>ä ÑÙ4Ѐ 蕽þ:ü:néêga!;òSn.þ¬=ª9šì壽á +”í•g…Ü陚­õp'£ªGxÃ*¿-Ò\ÇŸÀqmoa¯å«¯áºÖœæ‹tF²…Ë(€élöÈpl•±2dŒ2=Ì´²éXdõ¡~”ÏŠ~ oÂǰ”BÖ³@9=Õ5ݦk®šìë-æí@°Ä÷cÏ/ñ©‰:¨áE–Ac˜ýæ*=õkè­ý1åýÌÒ³xƒ¸G^¨`#@œ €@)j0µÂ*HiD¤C õSú©ç|.\H??`Wyz»*㯗èM'ë>u=hÜãGæ“7]«°i•(³ÐWjœÈŠÂ\Gëj£Ñ áAÖe…æxWw²/:€ÎY+Z -(ÏðÃ.;Е˜¥7[$Ý6* ŒÒ x›ÊÅÇ!C…0tZQ‹ÂãT#l§‡P€I£pŸë1÷X/t¡ŽY4˜ÖUAâÿù[þ~ž«ýþàrôsnœ\?4z¸“‰‹@œÐDîèz°Ãñ2/oåƒ*û äa÷YîQ°ÕlÓív§Ë«p‰aÏß¾0Ä/„ubÛÅ©íÛ±™ï4Ïnòáµ»áû{²ß¾B¾ÿ¯§Ûqœ+Ùe geËîÓ B¹#)ëÙÙA¹|§d_ï}Õ9gævÆ´ÜB(Sú@$4'5 ”ø n* NÜ;yp$TPÅ  1±@9ÚlBˆ-§¡q¸’$ \™•7öÏGá¯Z§eê)³}‰Ë–§Ýl!5’€¥XÉ6„×ׯ}¿}/3!œ¯’ÿ{¨ : åtÅp…”—t|<æ_–'Ð $AR#¡¢Ä)ávvS_å¡® ¸kšÖÇiVÖlùݶ5½¹o¾¼¨£= †›âìÿ—yóüÁïý~WüåÁýþ8ùËÈþ¿Â!ïöü ~¹ßùyÕûþz) 9Fð÷Ùß |þ`~•¿0Ÿé£¿?Þ£îÓDÀZ<lvUts, –MIÎø&sæßn#+=‚‰WD'˜˜ }†~¤`EHDq v‡òf€c-°½^¯+3‚_ÏÞ ãÑ#mÐ1ú?˜›éhˆÄ+¦…P ÀÈF "©0@1×Ïÿs¼¿Úãi\~ù¥å>¼Ö5¦Mb˜Üîî×oï~ÿå4O‡b¤$î™q8Ž ºÌ n~Ôá£úžÛ3×)é,•ÇÔÔƒ=VᘰKå¾<¸7šÓ2Õ ” ,Nk^d½ž‰+0]Ș Ls\ Ι-”vÎÄî÷릡¯HF² A}òBòûq#ï8 Hż¹–®[á(EÃ{}¯êìý«×³C¶  èü›+Øþ[—×íN_ª[¸Iš¢ö¸ÿÃèè–bšÜƒÜøîùitMgçULGعãXZ(º~jÇ%Þ1Ãê,¥.½šO`Kwmƒ¨`â‡÷°kdãþ¡‚ü~fF0£ÞÒùŽzÙ½Ïʯúî];ãßÝW0nZRÏ`pž'XoÎîy6k½”1Aƒ,]«8ŸêÑp4qüHC—¦Å|LÔ¡|˜qk,†.4h%ãÁUR ˆ¿#ç{ìn¥ò²ÉVÁÔ.†%ôQ«n‘yÞãu§‹Âº¨a»j˜±‚(òä¤,Çž<˜ùçÌ3²¼[îWùÎOÞŸÎû©8 rÂ% %dfz…ƒQiΈ€¹§`C TSR…¡š¶Å÷_2³ú†h=·vsÆô øÀž ê¦nÃÕ·:Åy’‚Æ@´UX … ¢]1÷¬³ £Ž"ÄB.ÜgšqÛMKgÊÏî=)BI¥–/ÝܳtDï"¸ ßQdtq{Ú¬¹ªqWbÉÇE­ [ ­°9÷ç9ÏýízŽ÷ó:ÎÏb½­Ô#ÿ : psfY±‹€4 5ô¨9¡ŸTœbñ:ä­t[ß¹+ékrç>lî$-aݲ˽^Ü—öË3¿z‰\žÛû^Ùgã‡èÕ(Âb3gáéŠÈBzö”¿Œˆ¨p‡€,!^y3<-Ãmüh±Y^«YYQ;ª›1ƒ›û¸f¨¹¦åTÉÚëagþ¯ªë½XR³jÜÊíÒ©Uc åÑÓΤ] ÄsŽlŽEsUÖ  ¦ZÞT¡TþVöRÝ’Èv¥“ÀN×h»î?{v‹VVIþAv˜ròbÆ¢\6eÈxÕ[¿]²-U-Hw<¹õU·îŒÒRqÁŒÓ™l´§îF tíÚI&R8ˮ̅ýGR‰–ÎZéÅ …ÈPƒ+çÙâSë•ÝuIªÆÑê•ÑýŒï½{PPéÄpHÁƒ[ äìëh $H:B¡RøPö ª(M"QuA2³L¸‹éc²–Öº„Ê#ùò  “ºRשÃ]™„×Ŧåø&n@‰–£¢ SžÐˆ2ИπÅc•Wù­o®ÐYPAœ‡x0å÷›`ÿrº z/¬*N±%cx½A-wí× ”5=dú)œ“Q“˱ ·w~´½BßMõõµwÅ %½î“W›Q·)IÅ×ϰs8x§ûŠkâ™A´ÒºIˆ Å@C1 âO 9z¸§’DS#¨ŽW´D R4IfÏõªFtØ´dgx:]ËÈà ‰›ï¦·áA|`%)Ó|x÷z•bËÍ—käkàô'·üCŠïïñ˜shÆNhÜY2¡éHl|@¥Ö•ªC¿™¿ƒ¾ñ_ïVln “#f€dq¢}‘Õt1ʆXzZ šC©_øU[ ºÜÌzScNŸOxÌŒö ý¬ÄÎì%dd·,±†ŠIÃ+I/ŽJ앺p@wqcøËw÷ô ÖîáL¹F4ö;Ÿo¬‡,”Al%fšŠ;áâ¶8EŠ[º˜‚Uˆ CÉÀ´rëßÏÛ’q·ŒÇ2 ›NȤKQ%ƒiñ]Ãëz‚çÛñ‚€˜šGúš¸ô6ö1?i'Ccý:Á»3a' {tš¦ìÀÏOÂw×Ô@ËÔ8¢e×ÀÉ™" ˆ!Sš%lèPÑÈFºÎD<",@xAwä jZÅ·Ö“¼ýþ®ú†§7€ˆQF%L8ùÍ·WNB”RS£-r"a‚ €.ðLý‡#Ñ„‹É¡Ø†õ÷ä,ŠÞœ`4 c–ýK–2M‹$š\ªVÝ1~â_`NZik)?â·zƒ7ƒKˆÅNÀ8ÛUS‹ÍEï™z,ùŠÖ&Ò#‚±Ó'²Y¤W+…ÁÎÙ*¥ÞË-|l ´X¢M]Ã!(ÓLDcâwóF#tæÈ‹l˪a)Η“-Æ6™Tq¢† ¨ÃR À¢¤·Ð€¿jþ„—30⣢eÅö3«ÄXȋ݂¥Ð† 6ÄžÔW.ó¢¥eÁȤDƒ>^½ZØÐŽÂUpD³ Ë4š. 8ëŸâü^ûñÍâmyßøiu¾í~¬e}ï§Xx]Õ\üáúïòZëJ[ ]¶z5+µùξ§0(JErk¢³ o $¡Ã¨ Ó  A!±m­ãœT˜&`‰z`¶´»â_ÆkŸ…ØM5ÕÁá_-©O'U¼Œn÷Ÿžxí#ƒX ÷m×3ÇtFèîQªJò·î|vR*P°ç‚Ï–£M>:‰`ë{ø#ÞO·G-—k£ ¬îÀ»ò6õÿáúÏð&ûPó„=çÚ›Œ}O^w•,°m{Å1ær'ÌKÜ%ÄÓûÝÆ[R¦£7ç/p¬ãZ<ŽvQk糩ACð̤ePPhb/³Ëøïm&nl¸¶œŒÇí ARc+ö(]]ÊÓÃèÌ%Gìîv‹ó}ÿ0_¾¨WGfõJ,nó0òíh·ÙÚÈÉ‚‹ýPB–g¥Äá³—õjLì¢2“óuf£ 5@ei=ŒÀÐI×/†I–Ö¼Ú"I\@ÈLÃÄÂ.1\–%8æÆAÔ¤„å]¬‹ºŠ YÔ¢ÊL¸’šwé*¦s^‚w¾‹{èÚ5x}x}ý$ü‡[{‰+¹gI +“Oo‰°V.–¸ž·}Î]òõ`¿ÌîOr\ï©áÀË!7ž®ó0 ®8[ÔU-HÐb!(Ê4Æ#$@¬@ŠŒ#„ûûż¢gú¼ƒnÍ/‚¤uñvø7Ÿ\,梣཯l?côT©›£öcd= 4XÔäÄ)z©2‰D=ÔÛм'‘ue¶P'õ@;Va«×õkû¶ Ã0û>  –æ,Ë&.ò›k¦Ãímù½ç'ù¥ðÔ×ú¯ú8µçõdÞ¾äÑX0Ñ~E섲!÷CÅÅÑyæÛÔ ³‹¨.ëTâÐÃ×Ö²ÇjÚ[÷á,ŸçÜÛ-f¦µ v˜5—twõH2ƒõ_¨žMöÚÛgM pPÅv4§Ù™3 îæÖl ]Ú’âÕ'Ò˜ ÜSl2’›&ó~´“ï¹î²;üýíˆ÷Þðòü¹ž*´KC£&H…H2¸¯~ž/½îs‡8%º ì­E»Íõ+žA”í_͉g×dlØ1Âè&4?ï·mûs ë …ŠkRЀDPE@B$(¸B  ͵ 5¸XâÀXbcJ¥ÆßQ~Ï[õ§ÖÇgâ2„Vá7‚JZ*TÈÖ$L+á…òÉã÷޹=‘s¾ÿÛË ãï°±~’` ¤Šý”¶Ë[š˜Ö6²ŽRÓiÝã‚2ŒJ5·J´Ìi QÔ«¶W âÌÿÛ×¥÷í—N"3\è·ÿÕ~õ}×̼]pÿ·ô÷WïóG÷Ãî ¯è·‘ sð\æý-4W»º||=m÷¯?þÐï÷Íáž;ÿùÍ}Šr‡¡fZŠšØ>úªÄb*„a;‚E§b;Äñ )#‚ý¥Éýˆ3Áä°2‚º`×¶ÌöÆÈÜHÐK ©2ää'Bš`²Ô¯ó…Ä ¼N=Ö¸¯ýÈ¢Ø' U05þ¢×'"Œ€²Q°(e‰vlÆ€„9â^òõãív;§¸ ]tqN˜` Ø'fo÷Îymýø¬Ã?yÁþó 0ÇíýïgøÚMêZ~|¼x.j $Q4Õ­·½”ŽÃZµ@}äûÏÄ B%gÑÛ c†Œz¹ÅÖÊÛ¶[Ï_’3F=úlìrÇæ[N&çÀëó+»çïpŽ˜ ۻțóˆÇé7GŽî®}ïùõȱ̋žšê,Öã±ý‡ý”—Ó}ï ¥0€€ï' zUý¾,tØâ˜òMˆ”a˜ZgÀ¤–ëÉn?õÒ|¼Q2ͦæùp¼X«QŸ÷«ÃÇË¡\V¼ý×~‡·YKô|ÚûÔ™Øéê¡Ã•š„èc#yÚÆOkîÝÛU÷oÍå(TÊlBå×ȰÿsaÎûj-yÄ/ã¿¢¿3úJVúy\±x tŠÕÓ>±³zVÜ»ÙC¥täß•[RRì4tѬQ2f<Нñèèb~w÷ÿ!ægxÏêý“Ô_’ŽÅS-ÃÈq:§è ö"¾¯Üïh.* ‡<•ÛGN”¤€Å €U/„»•È;Xî5,ïéŽâ|j>|?Ö|ž÷*¾Í˜A=™É%EL› ƒaÌF+*.DM â\³ØÊs?ñÍåuz¤·{W¡“Ô<õdç+/À¥]D~´ö,É;qIC<”-­Ö”Ò´²r:ýÂt¸R…_â^ZeG*¹-<=¼““4-‡µ´_t¥ŽC;!ô`3$D*} ILA×]Õ^:]x¿ö\s„].Ça¿~/ý°«7Ã[çåFW`NÚÏj/©v,£ ³t€È¬%*¥‘]2 xÇj;Ì/“ª¥»Ð^ýKwï£Øbf[Öûb­­ŽÅ{ƒ¼÷®Gz}òÙÎ[ (£°2ƒ—ÎÆ#²¦.ïC÷‡åu{xFØÀyI·zµ‰åÈIÍ»DW,¦­š&åêŸ^¶$ÎÃfëýöjXŸW¢ÒÉ}MW¹7—Ð"8A‰æz”#5XiNxÔS¥2¤ðyÎý¹íÜÖ`]Fª±6AǶ«Þ×Ý#úY´Û,ø¿ÑüßÍd`™Z Ñ‚µð¨àN®b鸡ÐôVÛ„7Hå8°ÚYÓt@z0€h HC [î`‡›Çµ·MT#ò†¯sKÉ=aGó•ÝÒ¿0ù¬Îš×× w“A¦tÀÎ齿p+ß^n m‹·ø"“9ì)^.­{¾<Ž$h³ WjÓ4 ¨t_$z/O5ÆMbÊÜ|~}íó7ÏÞ\ðí±|†h ¯ÁìŠÕ|jwQQ×JIW«èT!ß`•z+k¦Õx› iAq2γó _mœ"Í<†·P×RaÑ ØÂÜ)›c˜•÷wµ­ç#¢×E7É#ˮRÌ N ØŽY4r#të»ÅÞ²$4ÛŽX…Áx´½wQî°Ž êÄЫh_çšoáÇ4•ÃÇï¾öŠé7ñ—±Øƒ|&cɵvz ÙÁ‚O¨ž $ ÑALŒGµõ‚®hH ï+¤Æ8ƒÉb$\±Ç8vÝîÏ·9ƒ”H;ÖJh‚B¾d{aÈÎüG¢Ù} øéâ9} yͽö…‡óˆÎîN¡Ù‘S}憞æ öÓ1ΰ"ª„€ÓvÊ‘Í`O•Jµ„Ñ,`…zÑÌài%ØÞ†?ƒ 7Xg‰Zƒ8ÆdʼçcÁÖi3šX¦˜ ÅÈ"ƒu!¼­´èsþýëüijndD7P'ùSn-ßbU0Â)«çBãJ¼yf(ÊZZÜÙ1EcÌéçÂwþXÜD¸ÏUÐçðëï›5½9­Ô„5‚#œOvCÒužF“™¼™?æñtq9!ÇMz8Íwmzô¡…eœfÐŽš!›qÙ´š3ƒû¥™ëáNä3Ë÷òžñ¾ø¶ Ìóõ&¼=ûÚ÷sÁOê·cöé­zsánïFô|1Kð|(ÍßÉR5—]9ŽŸœ~¸RäÙŸ'*5°å!±Ý[/@3<º[YŸƒV#.1KnL¢ÍÛ™ì}òoMoÖR£6ÈÑ&+©cù…üeE´âàì$5å7œ€Ú¤%ÓÎÚ_ÀW4„8S–Æ”¤ á@Π‡e?ÝÕW0nq–p Š” Ž£«‡xˆŽ«*ȉ/Ñ0^õeÝI\Y“sŒ…½v8p_ ´&Ìp­‹a$±Ìh_C'4Íá =PÄ;ˆI( kèÔÔË« (khP$+´‰†f4Ð9cQ%“ ãÑÒ®êÆo3"9'£1/ô“/Ïúø³.%q7Ÿ…úúµU ¶¢pEK˜Paã ›†/ã<²+@–¶’Nꌦ Fõ>ÑôÆY™ü¬Rik„Æ¡š5F¾H˫˘ӈ~vïcAl½÷°§’žl.YÊ·%ËÍhxц‹ ò¥6J(͇‰4GÉZ/`¤+nZf,þçÝNŸ/lŠ’ á=¥ÒËÊœWÂn•RhFzsa„àîˆ7Y!ê6]¸„&†(òÚGˆ?qï±H¤My`¤Ðá †ƒe3© UÒ­®>â‰bŒƒ\x=}Än±CÑC*È@^ Gò–SHŹˆYÏ$¬Avþ2ÆÏ²¿ÞªçÑü‡÷æëW8o8~þŸzI®Ÿ½S‚sÚëmÝ—Ý)cm•.YéTg…@¤0í`J•ñ«À5ª%¹™žÛj.‰´µ}À×%ŽÒóéð:^Êo:ûwÐúy|o0_ù%¶äÜ3'eÝG0SØtî”8`²ÞgL‚îxÅÕeäN¤=ÒR°+Ûh<;¸$f¥‰Û"’à`³>?ÔåÐzJTò£~u¶§im.wäÓö®ŠâÈmÿÝ^ß÷ã`ÉÓ~ÕMºF#ŽŠÔº»i9Oïñ=váNšx?9âÆt\i÷9îfÙ6´@s°È[Ý&âªpãVh ¸&V2C]~ßäo'ʵ(û,ãÌΣ U}ÐbR!:ivéˆ0#ulÆ{.wýÇÍçסv;ÛÂzï7Ï(Í/„ú•ê“è³þf 6§˜¹M(u¤‹èT„WD‘PM"ƒ@f f(• œN¶Èg€Öu±MVS”Ò!7Ž‚jªŽÌ!&-’$YÐZ€@àP ÞËïaï³ú§/“ÉABãhh¶¥?z\‰Ã±åEܶï6³³Úïd‹ï‰èLE`_=ë´Óž°fÍ× ïz¿¯Ë$+WɽÞãþê@4Ó{·é·ŸÙžÈëíÕ F¥ PTêŠ/JìŸÖ;ģƗGâìt•Ýg«™ýŒbb'Æ|à™®Z)û˜3ƒ3)HVvÜåòrP÷Y¹—}{€ë©M÷çs_üꉃn4”Èa…y\äcdz¨bH߇í~þoþý’~?»û55ÛÏÿ“ç'øgwÿûQ|… Öó–­¼Ûyæ¾}NC`我J ÂÕ¬ ‰§U4+L³M§ÿ–k¿ÑG ÛB'mƒP ¢©@g³km/J’‚èHkŠ\‡²œgp Ó\®Ä¹Öc¨³-J¸ÇäîùÌ. cA8®®*ûýÕ¦IÒ„g*,IÂ¥f.—·y 2ôásçø>gê»ô‰B‹(lçÆu£,üÅsæûU³4Öº¼d+ï¡jýþã¹uäî"ÀÀ«ƒ¶Yy/Õ%lDÚÓŠ–#¾€+âp"ÀMWs†1B€Á±áSAlÅ¢pËöÜ#õô7J÷ç}¨Y.¢6„D{ÊŽuX÷§öCsÏmàxXŸGud×d&‘IºÔQ˜6ÅÍ÷ÙpÝ‘®n®ï~)ú_ç~ã»3íWx²—` ©<¼?ýg͉V të–ê$xê‹"bQ¬#¤Ô—àFºÉGÌówOÜû5…çq °b‚Nйµª´߇*›ºº—ôð.Ùs÷­±kUbÍ|$9«û­ÚgtvV¨9УÄXa«hÿu­DÚ[׃–ƒ{$ ˜´ODTR?jŠgfJOÙúü‘iß×u>WÀ§E4x t•OïºGõwó÷ÿœ•?ÿáý5½¢L“±zâ%F¡b¾Fº×g9ûwõ¼3$à*—¢³˜c‹@ÇÂ]à; Cιië›éÈa³m¿1öëÿ§'ù9\ÔIˆ7,ŒA/JeɬԌ˜†À d-Ø‚è~Þ?æÛ³YÌj¢»ºwkvXæ¸ûŸO·U%ˆÚe» O‚¥†`˜SowS`þÂ1œ‚”8X‡W2Ú.ÝiL:59Û£~kcAµ\Š©ˆî‰vZ@sFÛ:}7¡&bM'CÚíí-øù»›a½!ÍÝÿälh–&×kÁq³ã „£¢µ<|’GŸ7ÛÈÍ"!¸›‡¹$Rmº3 ‰á_*ÚUÁ©¯$©Çk⌓w Ûa©Ze¸ñÜ 9ï4$ºÒó%´Ì¨-}EÉ.xc—:@à£Þ"TuQ¡À£& t®b‰¶ox­0%§ ÈxÅr•´'ž6Ckñ|efAø•ŽC?6ÄoÍG—sÆNêiœW]Ù0³Ÿ\’·}.⤵rËÄ?P2΄@½÷êÐŽ•÷1ZmóØCM'…®Õr®Oƒ¬ô.¦•óïž=lâ.²P¤°R溑ÏVSEbzÊ–Áp¢E[2šŽíI 1kN_ iK×]h¸’eíÁ½Åë;8tÂHtë«m)QÑi|®Û¥{ÿ0mÚM'H`2ø‹lÎ(ïðþ|F=‚©"fQOIa/{°dü’2®Ù€h¬â0¨Â×”Fh°(rÀÁB9’Åè®H\øH8ŒÉŠrJ‚€ïåo1 b(‚‡¼ÿËÖ`ßçÌÂÿcDÃjSUë½y/x¹ÖR!ã’ÑGÕ&1\d¶©ÄH;óYŠášâ…!ü”féJí­2ÑÍ0€]ƒõråo(ÁÂ9B[S2±ˆÐïRSÕ£ßuÜ¥·À…á@€Y“‡Zo–ߪÈkY¡ˆJ‡VäE•p ÿŒuã$J ‚m3Þ*ê«l•[“…Â,ò˜ý5š…€ýȉ0ãg2F‹[ê€kœ³áæÎ¢%ád‚œdä^ DaÆj¤€(„¼U¥‡Ó^dyì¼Å»ÌV3䜬ôDÎÃ5 Ñæ" N«Ëã¡í¶/CèUß 5ÿèbÌ´ ©È†exâ.ˆé½jo¨bÍ2.DÚ†ÔåÜWf¶ªü5&õsæQŽ‚:‘z¸Q–=ŒŠ­¸ù"M¥Á(¡–Ù'5‘%ø8gu€Ì8 é¦5!k¦®±PŠ¿_ôqæ?]"Æ97ƹ‹C}¦鈰~6²  ¶rl6‡cI\sûzª >l9|ÝJOÛr*¹Yö?@þ#ï‰Í‘{­Ú›Ý¸sLa>š…Óœà¼Þ·Ô­gÀ‚IöLœ§~2w—­¡î\á¼Äb!ŸR‡v@<¥_6°lШ 0ÒÍén÷ ±Ð”ÖŽqŒ ƒ¬V$'2‚#eRqjƒcิÐM¿ä´Š0ƒ” QD *Gªô£°­×šeÝræÛ‰šeȬ¢(ºš÷4CøÆcÕ B“ yBzA„Q1Òž^ýÙSò¤ä™}j%ƒ×#6H€´@D›få„ßÙLêZZ(,’#þ‚ =²#6êBDÒ@JQP”•°5O 2§"ÛÀœ<˜Œ¸¸¿†ùœhžŒèÕô&yóIã5Úà!W P¥(ä=™Î ¢¤Ìmƒ¬X‘4 ¦YÀl¸U\²à°z\sÛ²7?Ö3š#ê‹;mjýµœ©õ`Ú{ûDìác°nÉÚ{6`r˜kù²9ŸQ²2çõ;qÞxÇÔÜì:—0Ÿ‹Ð«a98Ï2Î QBIŒ¤‘«®{ØÄyñ´‰ü&4…¶æã÷ÍG÷{É×ëò¦`]vô`®Ió§ý^ìT-ó6ÌÇüîÑ­ºßÞw6g2‰^€;#¡×u=íÖ²%5»JR0Õé'FÌ»î–cðý’;v\Âì6K'nq«ù4Ô"a!4Î2.ËêáÜ;ãÍ¥ø›øê·Ó¶J jê‚ X²»Hç¹Î ÓL©°ÂQ˪ üsõ‡ÍIvïaÕ¬ÒjE¿(z‚…V“>M3&XÀ:²¤,Ä€§#]"»¸Ô `꣠sõÂ…è! %§Ê2Þ%å&í/Kæ*3PŠ9V‡©i$–ö ÅJ@A;pØ'ˆ¡íã€È–¬;÷k—" *5ÿÿïðÿÔ8»çÆû}B‘v3#Òï<³'Nâ·®çÔûÉjè3’žÑ~‹˜ÆÛvÉ®{¸Ðk²"ÉU U' À€ P‚b£t)åàQìe­Tyº?ÛÌ6EÄ„d ®2¨ŠÝº©„qî^ÂìæÔDò—0wpA-*%Š’1 ‹Q‚šY“ÁôÙÌ›X‘Qƒ;Ù!etqÆ:a‚õ›åxˆJFˆÇ”޼Ü9adàfg@¤mwÿAþ¿súÿä‡ÿOÿð??™Ï–…Ô&[MQ(‹»zœÛjÚÊàIxéz ÊÙ£ÿ£×e¤áÀ°‡º2FrHa¤y' ×aw^¹l‡õEÊÎ̸©JÒ(·Úè;8‚à)Þn»™…8H2¯hÀêIIŽ×ùÕËÀjǂԀÁW¯¢\FšM’Ùn†>³¦®ª{ qí¢¥5{ƒ}Ó²Õˆ&(Ðýëìò¾ƒÖÛ†L¤“Hì3^o8éåS¾ >C¨%b¨Â0Aò¸¦RˆiÔ¨ †ˆ ¤&4 ’JEÓ"*ª¸"H(¥‘ A4PË”¸˜ª¤KP0Ã^W)™¬<ê¾êu°÷VGwÅ`\‰«IVC­õê*6ó ÷OôãÛMŒ²ž}å© Ö—#éóÒÆ‚Û ·ˆz¦ŠÖ"Ë,š’6'v$:nßÇû“=êŒÏÒ§ÉS–z<›Æ§RšzÐsöáþ敾ÿ‚ ý6÷3÷—Knžožï|ó׌ðúä³}'êýƒîŸòïewÃöîâ;»~ý“~øTfÊùðSàˆ¥]ʘžÍ°5A²0íHEeH+fq{V‘Àµ‹†º4å(a@Þ$4lªS»•$¹;)Ãb"†qøyBvl¢PÇŽé•°uãD pªÌ TIªb¶||Ç´jã¦g( P‡?²p„ý«ÓŠžóâò‡^õè׿îsqû–£íŽ"ŸõÙϵórDÒŠ€%ƒ“—£b…Á0¦‰Ÿµ“J¨goxºtÝK ¥îÓaÊØëÀ †éÌ< ]¤‡³p×ýÁˆÉ§ïŽõêõÄ‚RùÔ²®…ªF(÷ÐÏÔ›k Kh ?Äïº Ò¦îéÀý= æ¶±'ià(¶ ±ÀKþ®„ú¬vŰžaä+Å%·w‰NË‘[Þ‰ñ­>QP]³uË3@ÓÇ>ÌF)-ÈŒÚȈ’.›]=¢`^‡øêàr|E È™éƒù¤?|$Ag ­ÕåË™ úE¿…VSΣûÎ wp”ïn1äÝGÀ˵ÍaXPËÏ»›ó'¼vz ieô…#…g¶³ÆŸ.r–sV=ꉷ1ÜuíÛÚñ–t!<¢ÑAƒf[8´à“Ðϯë“ÍÜÝ›';BÐ2ZŠò¨!›R²'@ÊôþæîÑRĆmâlíò0 »í¨Lø²ûƒþÎã?nw÷&§f¶ðˆ~äopçi³áÉyõ—L+’iöC!œr°ÉwU¢#Ñ$hð‚A54 4ÝÛ¯÷'‹>Úåº/@T·}™“Ä£iCI-=½(8³I —TÝvÿÿ/ÿvOU§Ó)=zòwó>ÿ•K|/Ç;v ï{¬¨r_#ÆV)Ó ~A  ¨9Lu?PºÅQA×™lùÍp`õâz5VŽsÖN~0ÜHm6ÑSAF¥ÐœÄ!ÇáIÌo›|oåÃ`½ŠQ(º!4ý`Ä©8@¨¤£=»3¾þÇHÿãý¼o3ÜØÆ‡Ì­ð<ªkÏ­)=‹E}o%mŒ®šLÁÙ¯2¸´F,rì¯ý¶DIÂR.rÉ ,Ðu %¯¦[-ÌFÒqr¸Á¡ñtÎ0~s'h”ÚähP[ßyºÃb+¹ †àž²›õ¶õ¤XÐYï*]Š Uæ¨*Ûd´ŠNO‡SèC|õvÖ Õ!úYPÄŠ áÅI~`ÄÆÏpÀ›‰„…͹]PM‰†ÇJ³2z>g./½z\À.-:ZàÞÐ2©;VÑI¯g1påwéz¡Š~?š¢C¡C8M‰Ii~k¶O¼³ê]|&Êž½ÕKšÀ'ˆ©ƒ†¼`¼£D—œ ­•´9ÉŠúü$ÈñäÓ{ø.{-4Ê÷®˜KDXœ5e¬e;¿ÂDlMùÖ¡ÈZ)7•]ž¯K¨DŸ /l†cIÕœ‡v2]Р¿뎱(ÊZñ7[„p,ëVgop£6-Ãñ Øí­¨$Ž]“?Ïl %Ý¢KÝa3ÌKÏhŽQTdòNp`½éß¾œ”§CA= éºÜÓ%J.¢1wœ™!žõm<ô§îc±¡ ³‹¶g^)©Å '{£–•1Â’qäüM¿SvÂgüà9­µlÔ°+¶…TTÑl!Q@? ªW.@Bâox&8Ô§Ý,ä‰,8ºŸíŠí¥9}£¸LΈQÐÙ6FHòkÎðBÛš¸þñbêt,òlœ)Ÿ_›àíÚÌ@²¦áë:Ów´ä‰Å!¢MéT®²6VãxœÔ0ëɈAõ AyvÑÚÍûuòÕK„F$>¶!¡=ËŠ¥ü•(@¿ÌhèÕˆê Jb†çšôÝ™68AÁ Dªø;¨1$âoÖÝ\²/¹ï¸Ý• 0]ä&Ôj•©Z€°_Ðýô`‚ð™ʬJgb~Ç0Ö™Vü˜ ý}úÆk ¡ÔÎ{µ´ä5½0Ð&èCɘ]F|ÓœêB#ND|Nza ãÎö»¹-•$¦;‹#Grˆ†Kº•¯!I d˜CÁœèh6ëâÞQŸpx»E'"9Cxø`€?ÄïNÿîÃlÁÙ›´TKæ»x ÜI‚5(ÕsatÞœÜPðüÉ.îÄ™nwhtŠÀ‰ó"fîú Êé :ƈ’mÞ{ÉMÔf‰¥`·r±\²ÄiÇ;ÆÇrÛÚ‹BÙµ@†+“Ȧ1õ€=S©®Xö e@ ˆx@… J-CLÃDªº#9ekÂL$ ØpZPªÂÔÄ+fR8’Úp¡Å [q‰ÔÀ ]ZÒ¡Sy' E'¶µÂÓùõ£x½®¾}ø}Xo·FV ÅY«*Ò}—8ƒ€ÄT†H‹®zú„×÷³þ ý¥¼Û4ßî<üäŒM‹"j¬p™4gxÎ w±õ‡»6üñÚúÉÕ@z‰¼MvEÚíaK~ ¾B“J·Ù{á[Ä@'òèÄ\ÒÅ"ÑÀ)Y!ƒØÄÖ.°ˆ€YS¯4‹¡ŠYÍס–«ùa»p‡BF…øô8V¸B­âð˜”Ò/J94:í1üD'4!‚´ç"ʤM2bœÓ“DÏP(ˆëà”žz½{ÛÄ–„Ä€ Ìf=º|×ç$g†œ<º[¹ý ³ÿë1~ÂÇgôðª·ÑèlùGXߟÍßûæoÚŸþv’”} ûž´C™‰7´¸‡Öçk5ýÙüúµqZS¬îãm»+¢^ˆÔØÃ QL:¦ô‡ ¨ËÂu”C0w Õ„Ú54D"Aè5è¨ºÌ„Ž •ɈÞ]Ó­ä|ð/Ö)>@"ºFºI­î6Ÿ&ZcñÕ«@‡Q::=6æÛ`¢(ÿÖ\sýnebÞº=àëÇhž¨*Ç<ªÜVܾCReï…êÒ†g»ÅB£f…û•Òçt;f¸pŸAe qßXNx2·Øj&ê Q€)"^]„w;Õ¡¥C!bƒŽ1ÖTè gÍÓÞ,Ž|¹%ü°þù¦•±K™9ÛœÜùÚ}¯î<ö—–×ÀäïäKˆºÓ•¼“Ýœ™R…FÚ’ÉT7 Û@Ìð™Äïû×:ïe/NDio‰l_Æ~Ò¿Ó‚AŠ判ç^,w;GÈaÎòù³=õ>[ÊÑ’Q+‡Ú£s"NäZ™ ©Êqm•·¸Ÿ™Ôî‹å^ܵFfÌ>ÃÇUÕÇ‚ Ë€VC†Â£ÁRCÄu‹úÀ{’˜S}ïi†J®h†3ba"YÐPhÊɉõ^_ƒƒ<Ýyë÷çþÜsÎò°Fe«lùÓNÓ0¾XE$m¨@–°åuY×­i›A#ü¨®@Þp¾¨\¸kÑŒ D½°yh¶ØmѽXšÃÎÝÅr¹®#™,@‰C_¸Å|³ÎQ¯õí„ÙÛôî×_­Äw=þ.Eyð.ØHÇ$ܾ„² .¼ì)w]ªFgl¨! òä©<)­c¿5Õ‰g§%³UnŠ•{éml½˜óZÒu÷æë,­]X/ª qïÅ DŸenœ‚)!ìðìœíàûLUÒ›¤t“Ó]MüGékç}Ð)ãL€<ÀÝ`Åo(¤&ê¨Ûˆ/œ‚,)ܬ÷WÉCQ¬Ï4/ —…„Úl,ðt_ÒôÖÖó!Zµ‰ªX¯@EÚG 4 ›Û .´´/ø£º¥¿¢¥ ¢†‚âìmV¹ŠÚ·ªŽp¬Ò'žc·êˆZûp”ÎFe3mÆ Éâ¤ñ~¢³m/\ÃïÌÝšô-7ìÛ³,+ÍNI3²—l¾Ï|ó‡;¾›uÎî¹ô¹ê—2ßJb8IK:r\ê*­ü‚[wF -ˆK°!j.±ô®q)šCº&J‚À|óÞ f,3A@«u»z¾ôâÉK6wæ„rá=]€E0^Âå'×ç2iµïÔ-¬œ}õ¥°ît·ÛaÛ UÞã×ܪÃ0t9¡¸Ã)ÓI3Η:Ëæ¢Å@;MÈ ¹Hòëô+¼1?ã…Œ‹ƒÇîÐC’”h±¦þMæãïͼyá –‰^x:B‰7séP_–hew^FÏ yNk»bñve ýÁûPµÿ\‰uQjÄ9cr¢âb@  Œ– ùˆj Óæ–X´`·òNÓW¬êÁ‘,ŒX>tgp.=“­HAºˆÁ%BºâU·bØ+<ñþy•-1m ÐEL0oy”Z{®Ú-™œ§»3™ÚA¨EÕÃ7PË¢…šÄ¿xR³Š]|(à3®q€Cy iˆRZxc†¯rH:s¥ö”S,LÑÜ2Œx@‰…AØÒz‚Ä¿,›3mLFŽT?ÅR\ñ°,94H!àã¨wÈ80 «XZ†hªh5ë!ïÈ|sÇvÒÌ—Ý>ö¬‰>µ7èÈ !™Û¥Â<èi«ÇP¬Æ¹4¾bˆXƒjªÆdZµ_P@e ÂIr@]dXåèá”[„F¦^VÄÈ ¥Íâ&p$èáD–Nþ%ë¨YZ²¨`x¦1- ædc WZlt¦`–ÈØEØ£'ñ›ž§7ö:Ø&›¹±yÞ‰Õ™ÎK/P$b,+àfnÉ—ð–Þ<"37Ž1 ËÜh]9GGs¢Óq\Ä<û´ü”IÇ™ 9´pëXäŸ9,`¦#5ÿ ïî Þ×L§•6ó¹§ìÃ8sgþ8ö´ïAdÊô§‰;nÖ {îâç†øê5y_D¯+w}%laeäÜùV)wÊ…Zä¢/Ê‹º E\d)¿ãûö/}^ÅÝù'SZW4ÙËãÔyïÏŽw”³•þpßîìÃòʺX»SB]³®bªk7ÜO–ojÞX•2Mš˜µIì°Û#f*¤Æý•ÞˆRγ!±sÞĕݾ4VÑÆv¡Â•ƒ¯FãÒ ·ãH?ÈÄ «Hs²“€­Ý ¦|-2‹‚䘵„B_¬Mg£›ç~š<Å1¦ŸxRÄkÉ@Zíçì>ϺÓÙº“”);“Û†¡ØÀ˜vº”Ͳ»f"ÎÚÒn¬“ÉzÉš eõ'\”­z­£i»Ö>·Uà\ÝßWO6‹^“fÛj×mÇ?¦[ÀŠË™_޾ùÞO¿Þ}PÖ÷±å—þ÷ØKn3±(šS ò˜E+u ÏÉý:œ2‡Kþ~ÚãrÁ|Ԛʩ•G·i[8|++¤£ 5¸ Ûð|{ôás¦W Õè>³v9»6€ïØðý ƒ”¿&¾Ø%2¾fxd×”9„û@¡û m3’ºDËX ‹4N€WáQW¥Uìj ÿ^d•<‹Né‰ò-£ $^úÑV¥ž+vT„Ę…ñü‚²¶†Î oŽÕÚö*Oßê.•ȃU©9¹ÈÜ–ïc5­áõ¢QCêRh53œï}éì°± ¬‰²Þ«D§Ï,Ø•5÷žX‹è]h»íTE K¹°àLF÷¸K¿–¦óç r9=×ån UÜD…æA0¥ÐœM4²J±9U…àFj+(f§žœ±B·óxV|Ž%ËÀSùÂEÅk½è–žhˆ¼9þ2˜Ã<þ°ÈÉ%³½xÀºÃOxÆ”¿§Sñ'‡ÿêŃÁÌ{y³ÿéo_„›$%"¦Æå'¥MJØS­´ð‚ÁŤf=Z‘OíÂ¥úF8CHãíßÒWP’M×Y/É*|Š+k´ý þRq¦$!q…P©ÚÛ^b‹lm¶Èª@5Õ‘œá0ô9bïh‘’v…«0i×èºÖâÞýo…¬·Ô›©IèJj0ý”¹nÇ2Oôu …ØËÔÚ68;h[|àÐ`¾â‚¢à{*UUNÇ£ž³]ƒÜf›^˜šGlÀcн¦û­ÑŸÿò`?à~ÔŸ{ü¾eþæÒE•5a3ŒÂ‚{ƒë|"yz”ˆ`²C‹6OÇhÚ˜¬I'ʈ6^ƒ×('€hÇ–9LiÐ ‰z²o3P~ƒ_éï9[F-"‚°]‹å,2` ûÒAE€v’P…€1±,íª ÔÌÀÅÔ#‡CÙ±V˜Á3%[!5Ñ¿±ÍS†ï¾`¸3nvçÔý€:kû(÷Y¿”Õš¾’‚q-—MC‚rF‘ÛŒ×â^(Rz0 &ñ“H'N+Y_1\¹rÌŸ··fÉ‘6ó˜åJŒ²`²káö•‚ b[Æ»\™^ã‹—Kô£B°½c îOîû‰W²AÀæwö0³ÎhPsÂ=‚URUS̹nöìäBàµàW˜è±#Nn’J0¬ä”g³ª®l8Ì}H›ÓûC˜•ÀÌI£+‰Ç=1Ï¢ërYãuPƒxfù·W·njnÑ3óʺӫþ]«‡èð –Á+ý³Ý븈oÆeÊ0Ð ]E€õH•‚ô&(ŽŒð/íY‘Oˆlž íÐ_‹³wÀÓ^ùg_ª7p²ŸPzþÖ‡~èå≹›^À '5‡k8L#:à(J íÍéœ9å âíÁãÒ¨·å®Ù®šÑãîœ+ô.ÉÞg4©–²î»‚æoËW.¬ŒŸ!Äj¥VxÌÁ‰œU\ pǃy4ö†ÙÚ5¸¹7S‰vÑ À‡”ê˜Ìˆ¼À”ŒdhÌ}ANˆ³kPy£Àhã¢@wPÔ=h¨¸•…Æè±` ²ð\¶†Ux}žç÷¸cžtÿ¤þ<³¼ yÞ¶þmßmù¾@AJ‘bdiŽ4BE&tæŠ@S—êÒ•(q%œy*/‹ËIZÇý|¡]“Oƒh”SìÌ0¥€†ÂÃDu‰Å^/·;2ºÒ`î$gZ`¢ ãóä_¿žÌòÌPSÆíT¤h!¨É’ç)óøn äuÁŽÝ/±ÒÃÂØYÙN”»¼+`¡Òƒœˆ9±ÀLŽË3Ò,m*áŒÖ¹hN]V)‚,ÉâMö3Å 2UKöØy€n³²@'ƒÛ™û /‹M.wE`JT¢Ù/x+¿YX±6°ûù„=‘= “Ú÷z˶èJڛܥ¸–°&Z ¡ñø¡ÄÜR Æ@@$K˦ƃ2 †>‚Óšw“®€D-Ø™ªq>‘aù2ŽL-"Ñ •X‡ P¸Œ U"ºŽÒfSA(<.f¥gÆfxcng‡ %.—¢% ù¥¤Y§ÞÔ`b±šìhÃA°ʰŒì‡²3R‰^©zVWCÒmûdüì¼ßÏ1b–EäŒAK‡¾_½ý>Î9xÄVi¸ª$W5B–v»8_Y>^Ëp§¿S2Ü+‚¦Qs™…Ÿ©7 ˜»2pú|àúY”ú1CóK:>×VlO™ÒQºÍ4_ñtäðÑlKª‰äD4 i·è«#™¬àdkÙ!C^~鸘¢6¦£Ä4¢Éh …½´–—·¯úùɫР\7ó„YÓ]ã¥ïél45¨ü¥L`—-ÊPB€Ä×6gà‚šAÝÒÐÔhM hõ—›M¼cùA7x‹¸ªZŸ˜hš°­-t·oîµÒ1¤ŒÆ}ìOöT;€C fÃÖ<ì…}T®õkG,(µã0QÀK ¿ƒ±eàî‹= ¢±„»ˆFÎ&C9Ì1¯4Åïr¡Ø´ò-$š6 ÊÀ.©ÉšèÑŒiXÅ$©ˆ˜àd¸0;)‰¢q‘Ò Œ" $=F…aTbìÆ›6¡Jˆ˜2q,î-Ø9Ʊp’M6œE1@Àös9O؉5Þ†B'¿4é?“Þì~ìN“ÞÀ˵sDž'6l¸VRå@€XËBêX‘\¢Ae@‘HÑ&•.gE©™'Z<5À€`½ˆ‚Ó4ùù¶4›íèZ®¬è…4Q¢TeƒôÀ–»pä<_^ÆkñªiÏÃ"›Ã鬯£DšƒL©lœnöT¿úŠ„¯“Šxó"kšI×:`‘4ÌE¯¿ð—?éOô·¯ßþåWÓj$1'#( †88îŽú¿}9ÿËoûž;çâ/sk¯ÿ Ûï¯Ãò™ŸgõxIO=µ¹uÞ¾úo¾jèe]/ŸÏµCi‚”!‚€È#ñ‹ƒ1l•Œ¢P”§Á»¢ªÍ¯Ç ºŒƒ€ÇtÞp”V¬«¹ý­6:˜³pD½F]aÎüý™×o:0åB%4[ðöÓk„j÷L"„rU·m”¯TI/_P¬4ýwÔ™±„lyù·«p=ysA ä „‘Òk”€Ôôu¹··ÿ©IòìL¸A&¤5ŸúGÂôëïþóqD 0p°ÙÚ//ÓPM~à$oo¥'œ@áÊ<6ú[çç1ùÃ>~’ Pò:Àž‚V§9Vyê¬ÕãË¥¢DµLy~pæÆÝ;uXpGߌGdcç°¦EÓ7?1ÅÌò%áÑ»TACÒ>¯¾ÂŸ-=f<=Š>U jŒ£ÐEîuÎ>] `u,±,ªŠQÆý@š?7õ øpÍŠùÄ¿e,¼ÆS[Òý¶¦8«Èãs7Ëë»G…ÛI4#R4ÒÊ¢R>û<¿Ýspq¤È%ï*¦wõÅ@ËÚí1ßà<ëõß|ú=ðç1$›Î@“œh¸3`P¦ÎkùôûßÞ99æaÍߪ×Ï€Ï—ç©æžÅoœü .ž:õТ‡ž¯øÃô$ÞbýØŒ>îªêt3M4ôv¡nl‡îaZÉJš‚RJ^´Õ£ß$ƒÒè_*~Â2sŒÜG8 ÇCZ”°Á_¡Ø7xY^©1áx¶›ˆÎjëµ´”{WÂPv-’ç¥Ö\Ô-üZë˜ 5°1ï÷8(ܘćóñijº7ìõ1<)¾ï§BÉ7¹ 9Œpo¹g}#Kô^yÃùý°SZ_#B¸5:›ñ}òœö"n©Íb3€,RC|Ås²P¥Uéªî€ÖÄ/+¿Î™Eþ˜(e¦n¶OàþÉ04üF¹Óq Œ/««%âé$Ž”Å*Ç 8Ç«Ë }{Z&mL9~<:®xÌú( ¾³‚šªD[B¬fqÎAìl(&>-ÖÿÔ}àóªõþž¶ñ™×ù=wìF2R4*袩‚ºA¹º–ôÁø ø ÷¼šg“wo ñ[†üÐÉk›Î-Ö¸ÿF‰Ûe¯‡¢yÕ¿¥6Ãò‹Ökì`ü=Ød¤x—|H+ÁZ²àÄ´“—çÆ„iʇâqYº`íšVNJ]°ßíìg7¿u3Ú×¢2)*Ñ/+8Ð:ëFe‹,á‹Ã81fÅQªK"S¨ÖcFêáÂd§Yœ±ÿæç¸"רŒr:îmYiŸ¦)FÙ¯Q:Ÿ/u—õï˯û¦ÿþ¸ÜÛÒ=Ø3ÈÍ„î¬'À\M8ŒGÉ{¥#dò«áJþ€†rÊñ^±”#CÇ¥»™*ÏdP ¡½z:õ†ñUSX0Æ ¶Íö^•%ß»v¯¶¯ñK‰!Ü’º2pÕSÂ%;A;º¹)xч-ÑÀ»ðZÙT~$Èãï,@ÚÄÏFÜ0qAJƒ(éÈwÁ ú­)¦9ÄdYq÷W¸3TŽ‚êÜ %dГ3¥D‰  ÆêœÀE›Ó  "ZÏ^W/SC›[…ÑÍ[üïb–¬y>ÒbÖÙ»ÞÄÎàÄ‚¡›KPpà ¼c’XÐÊU¸2=I"äÙ- |hïz)0‡‚šÍÚ_èsI]¸rÔ/aÃH¢T„h H ÌH„Nº £Ž’EΊvI?<¯—NRÚ‹»à;à  6º‹2|ÍÇä𧸸û:Q¯lðކÙ^›îÓ Îk3žé–RyfÝËÒf1\—;p€•¸¾ô5_[E·ÞæAÈL p(Q ý@RÓ˜„°ß ¿<Ï{æK,äb  ‰Â=ÈPF´ßÍ6VšsŸtgª< “¥rY‘|tyïD}B5:Þp>š0œ¢óH+&×é7ÃI&óÏ¢m¼ä<äN6-i¨‹fW¹§æ.BeV¸ÈÜ™—s·æªi‹XV±) ‚é‘j`­LÛRGT޵L§À%¤§Ñpc9„ ¾PmH âLŠ.þ‡³}é`Úv8#a³%(`M9Ûò¶—cæUè3ÉÃ\Üʹš’ àÅ>\£á™þz´Õû P5Wr°Pl,¼Úõ}…³¦÷^zÞë{tn¬Íj›#Kñv"d°3Å"NJæ¹ébxu£õWbKz`£´S¡@àE (ßv²"ŠÆDšR1¸ƒM9ÝIm B¥wíxñY:ÌDNÔ’Ý– Q»¯'yÓ¯&OÉH‡†™Óx`Ÿ»p3p6 nmÛ X5q®TîžñÅ~¥ý)Þ%-\*«(QK1-Ò&Œ»c\¸7¤Pä0÷ïêgÑŽuìIm“­¯8 Î~³G:'t ³¸êžlÞ/V’‰çFè)J¢˜ep’Á¶ºúBÍ:.ƒþÈëõíƒú×nH$ʲ¤f–À bÁ€Ä7)íÚœKW$‰FËg $¸xQ6Ž"òJƒ¡Wè¡¢y($6‚:b'èm +iØ¥4¤F[Æóûûª?ùz½=Ù£ý} êûÖî“yE¹”t»HGÛ´ÎIIo~Äa'·ù}íë!*X>½Å…½ «L@Yk¡tД]IÁ¤rWy­EjЂޔrHº¨Àph‡k<çóœŒCov¦mÜ? ]¤{Pð ™Ï*'½@2õç©“ÆKyÞœÌ»× wÛ;pû6²ž«K*9{tQ§=ð,ÒZ,‹ëðR&Õ—$Øóõßçáå— Ù£»¯pèå{ÍÝÞê5̺-è´<ûɧ?Ÿiض½³fÆ‹^)Dň€%R‚l]•—¢''ämšotª@NZ;}¼ÃÅh{ÿIÐqjòßJ(9ÖIx«Ýó ŠÌ(¼8oø/ßð»øwµ§¼ú]K@_zðÖnû * h ºJkh¢Ý µ•× (hí¦…t²ãs9LþC~þñû÷ÆÌSÇú>ñpsk»£~ú w‚®J5Á‘¦‰áWº¢¯Ö8™¶b}ýþåÃÏá»{ÿƒù{‘gÔÌPƱø«ò"J<1+§5ދĉ»("%QR¢¢šuŽx͉kÔ)rñ™à¤›”áý̦Ïf) TMa do×Û KŸ‚ЊHÈ‹\°š«D—³s‘‹J‡Cóþu`ÝÞÈNö“CU¿]alæù¹]*7µ_ŒöÞ¼õ ö›\³Ooß±ÿKâ€*¸«yíåÇ~0û:_ç§>/!+åúŠ9W\Δû:4—§.¸y¯vñÉ<‹÷ǰäíçxý½­`þào~ã p´¼Gß>–Ï6Üÿ²Ý>×ZQ×þ>Ú6¦A›×N+t†ë­y-½.K5)B‰-­J ªEd0gU_0’䊧§ hÅ(–I4ã"WgmF“ÁBYtzš43d@éG!Câ1ƒ bNÌVRè–£-þñдÐg:¾FØX„p¥ô Tå‹¿°ÜÎuÚ=y§µh% …„€ètŽ3¿Ž°#y^$4eˆâ®c# ¥Ùº®GÜúæÛÄϵ|­­l-áÑç õ¶0ª{mî WKàæÃÓ†%{c5üèá"»¦¦œ•ÃôÞ º¨$%ħ5†Îr«Ö«Å|¡)„Ù wµfz̦Î,pïÇ,W4›GïQx+åfâ2îx°£ä¨¦ÛóÝå}KF~ÚòÙ_Ù¹w¥õ3÷VØ6y÷g~?ýpÿÁúë:tÛ“â_ü`NUÄ® ÈÙ1‘Ë¿æ7¯ôD²E2ñº’o,Y{FÝñF p,ƒçwÒÓÚþ×µ².ƒ`w®}üüûõ÷õ{}ù$_6gýZ"«·Téîœ?ÔDhƒ¨ ˆm]ëQkºG&×´ÏWª·[·‡ü)ýe!¯w^¼¤gC‡û[Íþ¶–ý±£ÍÝzÄÊ5a‰¦Ó`Üšû¼W€—^Öœ!ç=®§ÏœØƒ•ñûÙ`GÌàsòâ‚Ù+˜ÑílÏÌÌŶÝ$b+*5=êë¾y2[ N}ƒBUl¶Anwg¿õ-?óË~¦½®4ÄYqÖ-^³r;[¬)Ða¯taQj Gþöô~z¶ß©øØs³îg²¾¢AºkOÑtúÑŸ]ÿªoÆŸó`\þÎx:Ò^FNšÀ&aw¯ßïôò#{½Tèð ºÛª×8Þ0‡uÜ´ú»uÙÕ­ꢓ")]²t ¸« RâpúŸ=…qk²'™.g…•‡ÄJšðÑ=ln5X¼ôVné´ŽÊæ‰wt\ÈNA,u¸Ó-ËúËu.™W"LÃùä²+ºœ”#Rå.ÛÒKìÔŠ9w¶¶½ö_U@Å<\Àx$[ygÀíššlå)Êùþ Ê–Ä;«e/Û=®à!iòV9|âPá‚Õ% zÐNÉGª;úzjš’ª³Ô‡b;wáòÚb<©õdü.fŸ<ô [Ø@rÝ­E8²«`ǽõí + ~lÌ7ð,û⟟³T2¿jg¨õf °$Yhm#ÅTHÄé©õ¹×Ôê•ò¼œå»þ)0{onÐþ 5â*d?R2x[ÚÊžbõz7,ij¶w^º‚4ÀO; ßÉÛmh&A˜#ŵ†¯D.À“U†Nõ5xJÞMú3Ý¿6w¬w„Ù&ñÆvéf-Ýx©Ú*¤ÕQT³ÑvPxâ¹Ê!LÔð•ž*Xfmp…[ÛëW7A÷}&îH:x…A©`ò˜\7¨u(DNJS“Œbý’8=Áûpð€eC^¢ …_ûC¹¡($š ª6‘$L¶µ=Ê]tôÁYnc÷³z¯¦9ad"lqChCë{V(F¨E[Ú+ðùDO¾ãWýï¯zc¾÷^N§Ýç³zû%L¸š¬ H ˆâj¨4©á}hé°Ò0(úÒ0ÀƒÄaîj¢spú29 Ŧ‰Y2RMêÙë0¦ Š%Y/ÖÜr°‘?A…5òB¹ÔŸ”:Å^Û€zÄãV(²ë_îºÞþ6¾›†A;²Á.g(jì ÄM\\€ åXO mu×à¡~*Ë.æ#OݺD„)>4]i´9Zç±Ór­µ³jf'9ýò›µÒZuÍÕ-Aè _&ÆCÌk˜õPù•ãTg*`štVzSÎ?Ô»¡H2H0/ÝK÷;ñ{!ÁÙêwã.µýgjø|¡-Bä9©ž)ÌÅ ëâÁêËB#+03LŠEI‡ÔÛTjèd46çBhV¹øXBŽÄ2÷&¶óÂ%¾ãIºOû;ºO„ôéH”¾&" ”˜˜ñb@'š¡ü:N¾ St‹ƒö<]ëmr&¡hÎi?È )·“«&±+úêÚâû7ïJäJÿ^ü\øS‡9˜6³(̘@Ç4¬Ï_§:¿&SS}Ñ\Œ®çà$3Âe²|¦ìà`ÁAØÒ2Å2…<Æ*ʤ[‹Mb…›÷åßйžñ„ˆÛ«…X&‡Ê^—'›9éæüèu9Þó^J«™}ÿø;7ÛŒç9 @Mø¢Îé¿À¾rÓ¿ô@ Xý•£t¬Z6 4Ö;ÏKhM0’ÆÕì’7‘È ÌL8N´¨“{ÑYä¾%gî£[r2Ïib‡8‘cT˜QH¤¨\‚‘Q ÉV]¶nëSÅaÖ˾}jöƒœë®f—V_¸¹?’‚±AYˆšÝö_¿¿áÎÙº’È2Ì4 dè*V›L™± jñÐÉÜÂ/ôt†3 W˜}rmÁÔÕ·¢À;¿wïÖË—>e¼_pVì™S7»_ùk«H˜L®09joM˜Ñ¼ž ô­4 Bq‚1,T)Œc©Ñ0fVøæ8Ü8“ÊA›yXXl‚û¥]%{]‰(+Ÿ,^ur|ßM¾v£Δf'=ÆMØ?ÐiÛ±%"¬“í~´&€ Å…CG†¨ìKí÷ýL›_¾·áD¢z1[Tíéóô¨±k[Œ¦Ÿ‚ŒŒ%y¿|=g"“ãBÒÙ®a&*ù^fa @ÃâÆ[v¨ 0éÇõ(U’âîà<6«xÙ"Ö„{4‡¼¹»øJàþõj…U9H›XEÛ°ƒA‚g¸Ò¬‘ y˜5ÒÆù°” ´’%¬«öYhA€é5 &9ÐEÌL5˜¤B1bPWeDu`€g ”Yn»îA¿‹Ü¹ϱùl–€]%~“áãÄÜßÊ®ÆÖ0÷Ûçóí]•Ÿ©ÉkÒéùçåü®òóµN«¥ô©êv4GoV’[k—™s=¦1µÒªÐX¬^¬Çd t¥c"ô im?a ÁñqD™!šBp«måòÏ·s‘³¡OÆ›MЗë2S!J~ˆÃ á±÷Ï öÚO÷4»û·P›Ë´”4­BŒjEÓAMJ56»§3O‹0ÎÀ–ý¦j^˜ŸçΘïŸ_ô{fƒŠÙá KzÙ¾´vmŸþï>Ÿ¾ó«¡g¿A+c4i“¦0&Œ` /K”tÝ_fÉtõ9ïÜŠmºcókãaKýÒ©Žê±äÐSø*Þ¼;¯ŒoåE‰ ðNÐ@p ozï6FëôU¶vê¢Qz5”Ѱäp oÊ QÖ ê܆نòµè9Kk“1¿týf¯gž3^dÅ\:Ê„uÎ.wú=WÜ›íÍìk!–9šû™ð<Õ~fØÁu¹úh9Âé/›¦cV¾¶|‡½ÊwxyÝ4ŸÙnl€Á@2ÅcrιNHQ°Uß9Ï)KEÏÙìM»âð¹¨CS7Þ B1 ’7ÀÕ²´Ú«BÂÅPÁŽëÊé5ÖíÙHt¾}|Öú~ÝòQíþ‘yýÒ^O÷Ÿ½r í©ÿçú…öïÀÐ@¹ãæNëC©rœå¶t?ÚÆstÒg+þL¯Ðk™ïo”í™ôürrÿ7Ñ>Js{ý ó,é‹ÃÑûsÞn›}k¥éóæ£ÃyæÌK¼>pFœ xûFT?ùcúW)oîÃì¡oíûèÜí»Äñš£¨%Z]ÑlBÁÛN"6Šn´¤†%jÈ,ˆm€¤ð ~¢Ë,€¦ÓJ’"*¤ Å¢–å`Ua$Z¨¡dÅÝÅQT+µºØÑWŽ8‘Z@ê¡’cšEN:m„ õ‡\yàk=ïËn<–)jÅk’krRvÒÝYô°/ò¾öÒ Gd¢Ð(I( âÇY,v<¿ïã·ËÇCQ_’DNÈÂÛhQ7Úa´ª !3·l*>\º×6?½¹ñåKçóϘ.ºgß½hp„Ûõëñ…ó8yëj«Ã@ÔŠAgÍs@åÓÍm*î9I,´€sí× ÃûºB;£ã‚æ,E ¹Þˆ]Ç  bÛ–€;fŒä´ƒ2ÚFlØYB¯çïèšÏËGü5¸& ¦.ë±OW‚Üs¶2¤‰_Iô÷}¿™m*›X¼«Ù@+ÀóFíßö.–lmƒ“SÑÞ ×ïíGnýÑ7;ö7NOù­Wu1}yŸ\°©æníü¹<××{ýèÃ×û—ýˆžü‚Ï5?3ýŸÍg'Ð9Ë´l~ÕÕi+o7žãsGèoÿÑ?_\ß3.ß(ä5EîJ1›XkwOÎ/ôü"ž%Žåg[ÐÜÖyãì4Ås3[¼Æ¦ÞäªûÎ{&fµ{wŒÙnýŒ©k« WkÙ|ž3zmX®%Ë@S:ÕŠê*j%úÐhUÁšÓsý$é­›9â9Àž”äƒá?žtßÈy8˜µ•ÊhÄÀ*•¶‰•Ö%MÀÓ稩6ݯhs—ðtÙñpé¶¥Õ²ýMqfæÜç£ÍÉßhð{ñ=ì† Û{˰FÙò• Z‰± íŸÃ&c³"yY“XIE×››ºj 80É®HYN®ÄÕðE&È0-×.9ÕôVQy;d÷6ÓcT@µfUÙž|OwJbWœÐb,|:ƒRÜaÑa㌢«ÃUZÉ4ónã8¡½Ã™³*¤•&TåÕ3¨¤5»¬yÃüÐòB”CØñP‰‰êSOƒMJY?{Þ•E½GÙ1fi’ I˜qʺóR_'èÓçÈ»ªüxê;÷„›–Ѥý(|€BôDŒî k3çÕîÞ»6U® •ýa³©þŒIvtšnÅxb<±;…üCk¹Æi¡ÄZ|;-¯ÑïÍq„êýƞÈ- Á2¾¾/Éõ3WÜ‘Æ-`¥>žX nT4^=z7p¤…ÞAwã~ÐÞ'_‰G­[­+Ͻ綘hŸ‰ïòDz¼ŽS–MÞ”Úýø®êò—½ýföáq¼R;Œ»ô…Úv” ŒÝÉI;(ß)œåBÎ’R ¨·Cc2.ígŠÑ\ùÍ(ËêÈÂv†>OÕcGeTfõ¿[þ…éN°!•B°ª®•P¤É]­œ8 CNì¡gÇMW3šé“) ¨Û²Bcjµ55£ÖámQ “î"E!ÃÊö™i ’“‹¦ã–Üm¸:Çé¹Í#¨gôä 1®„|kÏÔV1$ªÐÒ*\ÞµÒÇ´W|¾Yùf=ÃôÈ·£}í@»òj#Â2¨õ•Ýó¦øŽþ]–”„VnðŽjbÍÁ 4p g`x•wŠˆc{ñ1‹]Ê—9!'¨Éú/:g•?Ó=k®¨ñOù{Ò¦­ÕµÿÇ0ï’—Zõ2,ioÆë;‚³——{>ý±ü~zZNJŸ`³ò¦Ù²å6ÔÌèXñé2±åŠl:&£å5†]g6îÄït7wŸäw W‡¬3ÞE‹ð KT’g(¼Š*dw…Þ6O5©s&ÙEgtÍŠg†–²/©hàWü¶˜n·å¤Ð'œ(Í­|oñóýòU¿‰#ãŠ+äéj°çМK°I7gæ„õ|—m£¡ìT•Ò€à§[â æXÃÉ­ `åRº €›SÏø¥¸1Ö‰ÀPÄ`b5U©<`Ó8tZº„WrÏF|ž>«‹¿Nw³…ÿˆäp1þšîâ¡&Z4\ÙM ¤¿[»˜ÚÄïe#¸-hz˜l)@ÂubfXpc×PF4а¨¯Ú-: Û Æ¯v •¨ 2£‘$˜ŒE)8Â5›š±¦í;¨“B˜’ºç'¶Ç1U/_·’#”"ÔA9 eó™÷kw@Iµú„K Έ"!{ŸO~žPP–ì ~qr¡ $Â-žõÔ3š58‘P “R±@Ô@Lò.ç­$¤À1˜*bªs¥ÌD[Ž'C}¾msŒùÕ2Š(£ÃáÃu‡–ŒPsbW†ïÇoÎj 8N'”ÇÒlñŒã‹7L.à «¸·Úé8(ó–«S/Ø|Ñ6ÐÅå"¨`‹A1JGàÆÎèg]0¡Á@†9ê=Ñ#7Ù ùKÍ6|$/….æ™Ð åÁvì(Ç Œ ‘u½ò~®xþšù–¾Æf/`Ëw—¾/¼/[ñ(ž³€c/H_o`´šÎŠSuâÊGóôF^2åÍì/镈ŸÅ>¨c9.ÏÑ ¥XS‰ð @4)—½  Èe &DUÀEfbA÷Žakš ® šÙš±-p Às%j:ÛË{ÁÚÚ©¾áÙ^µñÃG5=Òñ¢ªÊ6P‚¡G¨Ò™&“ 5HDZ*— ¯<Šk¹–¹zì –Š)úu__ϯ§ÚÊ2¬ {KK€•š8ãЊ£Õ9æÎÀ‚9hÚ :¢Äïïê笚ýí;¿1í†V„vLÕå¥ð©ÉŠ¡n Ëê.k±ð*ºÅôšZ] hÞ—Îs’3½?šO8;O0´›þŽã²³â7K ’JØ©£tˆQ¦°Üi4ŽØvªu`½#ªÆ¬˜²v—ŸLæwðÕ>ã︸1Η¯Â@$mmØÎàyyeº§¢Û0,'v0H*ˆäÓ^±¾ï5€4ñ¤Ev«‘ñïà¶¶z\ ªÃnôA mm¤¥_J›\yoo àøò·ÎÏmÙveŸráú ¨=oà%riÍ Ik8Àãwl3erʉ’'S>¢DÐÿ}Ç’þCš'ØD ½ž µ£2ÝðÏNÿLøç/åHôÃu=F µò0Ïš‡ù+ò‰Ÿ`~;¯X‡ ÑÄ 2˜‘­0}(2ÁåâäÉÞõfB‘ŽFÙ¦qXꂈTS½¯°-Ó“/oÞÇÕ¦%ûAè:‹X7´†ƒ÷M—ãœtùd¯ý¢¦M6öÐÛ;{Öšý,ûmæ·ù"ûžíQ&‚&´¤AúF–¤,j(ŸÕ}mK,ECD_µÃæŒN>™¬,N×C9?r¡LÙ¿•fMòræ`[SãáUu×”ñŽ>Y³÷dÏËîé-–‚iH ‚C¨ÖÀ@ÃCÂ@HŠDI¶û—nRT·F/éÜLzâ(8|üe¾k3 ÞÊÎY]9a®_.ßy¼¹òÅ!g½3HXÃC—t¦EF€ÄW` Wb•ÖúRúŠƒúz·º“7^`…ð§CJA&:¾J­]ýçtgš•žI”ÿÒžo“Ó¨@[MùÒR… €`Á°Ú&aíJKd" (òVÈl35¶:F¶eèã•À%}MZH147À´¹éœï‹¬²Y¼ &CÑK‡ž)´õöý{[RŸñã÷Œ%íùèãè|@†o;ìy8Þe_ìÆÍ«ËE-è®Ìî‘ ½iÊ$XÑàIðUÞÿ òpoï¿·çª%#”ºàB¨²ç}Ó1,@ƒàS&¸ ;B7 ã lPEÒÊï&m"g¬ 6(’ëÖÝÂC…d¾7å<ÁSgMG ûÜÚ±†ÑíûX²ÍñÅ<ëuÜ ‹bØ©âÔrí“Ï_—žÿÖ~ýIØ¿}'çc‘¯yïæï­æõ û›_ïŸ:_?õþö;7ˆés÷Ÿ×Î<ÁáNr#3áËá3%Î;©™¼åþ| GV+ËîçdÓî&ì^áÍÁ‚\¾•¢øj D‰Æn«ö(ÚHŠ6HÑjPú5PùB¶F¢wã½c˜ƒˆ»ÐF Çx°-( ¤0&0¡Å±$´´]jH+®*,Yæç ò oàwá‹{q.³í› è¢ XBq ØpŽÂ5@§5^Ï^(Lý1#7‡ íÛi·C–L†ÐP¼1™’€Š&X  ™±âŸÔUÅØÍñß¶¿ákýwâØ gœÒ)I¿Œõø©|ù¾Ú?ö›Ï{Ÿ«ÂŸGÆy믬Œ{ú§cF¼¹s¡õ%ï­]}´¶Â®JÚ÷F\L  iHB9阹S/ø§¾ã¸T-ÅO„´H˜/uR%þ‰o¤ka9©¶3ÁÙõMâ&ÕëUC ½ú­ðÑy÷p¥Ô:ƒ“?:N1uÝcf«O7|}…)yϽùƒÀÂZ$+`‹ »ÃŸÉÜ›ó|?&¤}’ŽëоóêÁ•¶ÏG·í—ÕÎË®w·Ü9Ç œ¿{S¿þÂüÙçßKï½F¾µá¯GâýýðËü»y’•ÄÛ§±o—®{ÿ¯b©äpQÍ™f˜ÃA¢[hÇ+Ú[z\í~7ô,1‘OÔÉë[¦Ók ðG/ÉSÓNÚ^SJøxÿ¬­ùÞû¶‰[AÜ;™È§¨êëŠìˆ'Y{~޽Âð‚2;_›ŒŸg@•RÑävƒSdäB—[–Ô¬@…vŒÔ)†d(d\US]–…\¯dÁáÈ•&÷³Ü¼`$Zµã20j$hTÜ€½é>Ë¡prž|{øû~¦ÕÔ©¥èÀ÷ €Nš›7Ëùßfs†M÷þ‹zç¾§×õ%Üëö|ˆ“äì‘Pö¢ÀšFÉÚ¸ W­vnUe@xC€‘Ù0CÊ®ýehʸuÖP§Þ.£¢Û‰^#cAÍéÃé>äOƒbݵ3(JEQŠ*À¼ŠÚi…ÙD©ËpKŽã‰iÙ ¤²`c±4BxµÍ=Ïf#¾Ý­N=¨˜e$âú6^:© ‡^È™•è"ð¶ z0k“Ü~ÍYx‹Éº}”ùã†û:u=¸½Øëi¿¶®Ëœ¬fgË]³Çt“q‘† ÇëyÎFÿŒ·ÕÈDSã=sKÝÇ7ƒ,öybßÚÆAŸ„"m§Z("£°¨·ª¯¬–V‰¸±•’µ^“˜›T¨Ì]PíT\4ìÎ\-ƒ}†/¤uògø/iÛ ³0`ÂDcÂî¼x0»ëbq¢¯•vÕe¦·º‡íÎÈ;šãóHÃc°ã?b××­AwõL±ñ‹DoN] 7Ì(o˜d¿Æ?»¦ˆ!¨X4¡k«[¬>ÚŽÊ\~kHÂŽèš¹¼Bˆ" ÃÕDP6X•Tùèú£wŸ=Qï 5TöÂ(£mŠéM"LÚñ…Å4Ãȸ.¬n=79=9ŒÅvÓ`Œí2Wž¨¦i§µ¿Åk™Vô=ýa¶˜È[“’s¾Ûe`ëX +ÍÈb}w¶—ÈRu•:`ÞØ³±ªö5ÝŠÆBœ^ ’¡A¦w’+ jdÞyú †aÓ ;íÚl†xÝ¢$NŽm€[!›½¸W=g*á–T ßA …õÀgW<ðUtýÅÌ‘”ÎŒˆR—™Üb«yá'Oÿê>º‹”óôÞx½, ¨Î©´ ûHUëLÎd†{¬Ë|sæà&¢È™ØÂo«Ü‰êúëËß½˜ï6AŒÅ/Ñ ŸFðÝÒV&Lój>*æÜ¹½ŒDAa?Vßô I"ÎFºÚG9N0ŠÎ–_K$p…¿ÎN IÇBd¹‚ÅM†dÉÞb5wñ¤ñŒ-ãu%¬Ùƒ[?êwÅ_,d”âIˆÅ/.ãp‚$nؾ 3¯¡ {ƒ½¶¦VÓw°b# ¹ØÜ¼xWô²öÄuH÷;Ç__äÍS/Ì¢ð‡èœH±tkü8¦uF\Ý–·—`Ñe~o€à DnŒó¬Óg"N* þja—Ÿçƒ5ñ†$ûqrß‘ŸØq&%ýäÙŠ´Ú7{»ükksfëºø*òý¤yшÍGîe¼a~å”<鎹Œ¿Í2ƒ8ø¿/=¯6ÆtT~xç^­Á†637»–Æsëˆo ºÆ:þ‚$»u§" aÎŽ’¤Ì£E™‘›%i õèN4KÝqXû.M­(Î0À•Mó|UÀ‡ûðÈ2Ð$Ç!oò"÷žùC=,"‹å€ä`ìï-,³]¼oÅku 0“ 2XP K“£Z_™âðiD6ÔLáG:&ÒfÙØTÒ3Ú6X%Åq$•b'ºimäÁiŮ☳@ jè„j.µïÎŽ²2n ®AÝñþßçì?Áe­Ì#RJƒ(C (­ñª7}·ŽJÌ: ¦‡‘¥€uÖÀq–ɶZ˜Ju†XÁ8+O^Ö¦3G} óbÁ@3@ð€MŽ §çùìlˆ’x3C¯iô`0¨ÀhÛØ"g¾Sµ†=Ž×—eyËèˆÇð•?M°%ëß’8K )iÞ sfôêþï±>³ªÍ¹gLHâ vâþˆZ¤›L vÊ¢•N@(äÚmô¯Û\l¡@íPOÏ›-ñßê­{G°ÕÝ¡Ç5ag 6•(Õð†|†e¹<ú^O²Lc¢‘úQüWq¢Ñ)-º ¦‘öоþ3Ø ™¬DÂå_ÁËÂ8ÔqЇ‘‚¶Ø4•¤¤¦28»Ö - :–v©‚±Úõ¦Å6iÜ»˜ÌG¿9k±å·=]¢Ž›bZ(S?r.̳‘¯,ŸßO_,ºtWü\ÜLþígK#Ý#2gµ¡š…¶kOÆòìH¾pd6ÑýBäbÖS­z~hMÍçg9ún¤[T8òúÑ© ¡Õ¢§ˆ d 3æŽ鯏'‹ 4œÝG§ å.K­²d3’´ÀK¨´eæxÑÕP4ùvÌák&îEã(x—§ãiÕÞ®ûøãàê_õáþXš“âÉw|÷ÇìðaÑç6\é[‡ª#M$îcí~FçMÀYyïµNo€ÖXÇÑÀHÂF(TÁ BcÌ]|Ø*!µ¶{a¶rñ ñ¨ùá¼ÿ›~Ö¶zZáëÝ‚Õæä¢ê8ši ‹=’cŒ·ŠJW€e‹;YAÊeb_ˆ‘J÷†æy»sûo¬irìk‡aÕ²¢‹Ø`³î”)W³µí x·ã·ä:a|F5àøÁA8›°èt-2ÔœãæŸÄ6§Îu¡1–x¢é°ëÒŽÿQóvTÃÄAƒ—lÖ;Œ·º üs+·Òî×P¯j«8¢X‹Ï¦pB ø[{RǽdÖ–' ÐADIjjèÀ–A´’£…»ðµ³°ø`‚DSíÞ™k¨•(ÃÜŠ5Ö€Œû8;¶ŸÀPέ-*h¸¦W„+»a/}¥ýŠù®6ý»+#tÛž÷³y¿žÏS~ù9Gï#VöÛû¼Ž)·iQh¿›îçùôõôd(G^4E4à.„j¢-¥J®´2&-ªHúáÇÃ$fl)eÂl ­&ŠlûÖÄ" ³B?LLKsÌ•“¡XJLsI_¯o6Q)“QW Vّv’Ð2ˆªbƒ7n·› Øe¦ÎâÂFõÎ…}ůóŽò‹ìç½²}¬tý|¶öNðl==äY;e2!UÒEù&—4ájˆY‘$®aEëx‹\ÿu]ñ3v©?à2…VÉšQ¢Êáù~Ós¥©öÃ{¶{WçkÖß…Ÿ|ñOãB ZL+a»X8Z”U‰ eÓÝñ6u20@]½HoL F´ÉC¸,·qQ&Éä%YBºæ¦lÀgCy>êÃ÷Áë XÕ¡bcURЋËKî<=¶mª B#¦E”Q)"µÍÝ-VŽŽßîÀâ0¼aEÃGyKËýD.=Wûýÿ»××Úwö­Ý­¹bÎŽ5©…‘si3Œ‹G !g¸ñPê¡{$£Z¦5m8fÐtT6A¯ØSšv4{öN=»ßî‘ì÷\·Œpœ·3ç§nöÝšU™Vk*Ä*-Ç›ƒNîÎ ö…ûÕý¾o¸FSÕQ,ü ¿þbòÇÑëñþ·૟7Q‹97üÁšÛ™lʹª‚¾¦«ÔâÕž«{%*ýÚ£Çý˜Üò!½Ä[î¢{D"…âÅEÈæ©¶$–9QÉ!W÷…ÿщ²(z¡5ï”0Êc ^8ª™™)q´°€Ã”B:^‘ ëhpPâ‡C9è6²Œã“4„ÖqÉ^¼5?Ã$ˆ¼‘`Þà(ðÑ<×FN…„ÀB 9¬TÆeÑÚ߬òTLŸÆx³6æ>ùôj·`d¯„DBR2ùJV$¥ Ĉ,ƒŒ‰ øøóÿïsû_ùË/¿øò)y& @QÚª úÒ°V&ß~¹¿˜÷ïèm‡Çcâeø‘Á/½ï£xc ä{|Øé'§Þ^ÞÚäILøÔœwVeSÎÊX;€¨·ýÕË}¶ç5´¸\´¶Ñ™ÆX–¸_ ¼A`¤ µ†zµ§ż-[MÑàµïŸüˆ·ÉÕõ"[ßëÑUÇÑ;c;N¿öãÌö£_x¿ß¨¯g×÷c¾rþ˜ÿÞÓÊ^A!D‚Ã×vöÛ$ïö'ÿêÝ··NW­¼†î£”:¿ßs—Ñ`óÀô.Ú‡Ë1g _Èv'_^Ø?ÿcŇζ.›ë»qýÙеvòÓ{p©šÈD“%§EóºÛŒ(¤Ã“;–o£)àšLÖAvL¶{”ª Ôk–qÓ—Dlo-ÛnñzöGÄÏ6~.çÏyÛààŽÃÙ¦û 1ÁªyŠçKÚ_<Ö.¥Ž®ÆÐgXîîœ E Ѐ ZA6¬VTåUê¸ L5´hl¤eªñTÑa_ÙP¶Õñ7“xƒ+•´‘ˆØ«éƒæò¥ÒBLîçÈ`°mï^ÙóÐçæe·çÒ ×õ÷žÞ»ïœù˜Þ†æÎhzmeçµi®²ø6Ð/ÌÁçÌ‚äÕÿóCýa«T”ñ|l#ör#ÙÍDÝ$C©6V´ áºíµ#á¥ðQƒdEo᥵w>µégSË). “¤)vNžl6s±&šL¹ .¶GÇ骽hNÖ›;2 ¤5•¤ è-ˆ¹âTJ:a­igAù:óBh¤L0Ù jW’Õõû-•Ôõ¡Ò+WSj€èÍF+ԔĠšZÇVÜ)%Ñ„Z‘4ŠG,pföz°§ ¼´è\ïI²°ë®$=TÞ‹àÈñÒ7+ëºqzt[‘:z¥>½&ŠÕ{Ã<È­{Lî.V-®û’‰ÚÂÛv‘ú»Ç+’ª½ê+º.‚hìj¬úkL]ÖЊ;ª¹12¶‡„÷œ}l¿E$,£"@…Ç9T<%ê–ÓÚ<ñ[.’ d0„›‰¡ %kC„hÞ øf.AsÚ€ŒÙraúy¾âÏ¿€ÿ”ûÿÔíO®¼ËnÒŸÃÓÖ´ÜH‚5N&«ÃÎy¡&(˜B?^Cë–ª/¡ˆŽ Ïqü÷G‹… -ü௓˜Ò•z)(¤Ž· u{k—ƒìŒ3pEPâz™Ë«•ŽóBt ¼S g)mõŠwÎâûö¦‡o¯Ñ%›ÁÜFþ¨ VÆ'EmñþÛùŸBe¿þë¿öŠä)u˕DžJ¹vs«åÕdéìïw­‹q§¨¦›e W«þxÞ®ï?r¥Í1×:¸Ï°^È¿d0º±^˜ìÊjCPi! y*yÃ5 m  x"I ÌnW¤³!q¬IÀ¶97ÖÂ\KfÓœzgëF=‹Û÷÷ËÊ_nÙhgkÃ×ojÖÈõ¨9ÚÀ—^‡òÙÊ·o˾›ÏÄäsÝ÷õª¥æ©:N;_Ükx¶÷ØDRYÞFqHk’ †¢y:óo8wŠàHu›7 ëºFzõf–óÅ`úÛírÍñtJ®nГÛM)ÄØÏú4»=\Ò;Ž$F*ßʸI¨/®ˆÄ•\ïÚy»)Ãð1n±]ZcÖ¦HàóÂàú6|\ä˜5Aº ú¶ /zqó8%‚Ž\­+‡>ǃc†‡6Y™Yv>œÓ‡c(sQö4Ð9)fÕöLß ¬”4× RƦéh­/Ôz馓X£4×÷Oøsr*9¤“âD$fo2&ø‘ìù2›˜¸Âïʷœysc݆2°t4#”P‚²™$Áoa°Ô·kÅJ PÎusølåûÃÃ!’íbR 1î™Ü¬JA{šC°ßg¼¸Cé Ïu¹{Æ3gÊy÷Yõ‰\p~½L׃²¾«‘\0:A¥Å«œ¶°PÛŒˆÝQe8&Rj;ª Lp1Çu{ÐhòÄü:ÜÇ·÷û™ŸÑ𓱤†›$úI®Y (W„'×év£1ºK ÝPãzhÔ•Ž¤aQ˜ôsë‚+k±âŽ$háμÚ}ôãåŸ=,‡{NŒºë-ùԶéÈ 1Þ‚ê)S채´ßåUtɦ…Ö '¸pûÕûÀ¦ú:Ë$í½ùÔè¥ûgÚ?½T‡0äO¥FÔ·|q>:ç°·*Gû=í³Î‚Ï=¦Ïu@Lt–T\™ÖVòŽŠ­FFH C*'Ä8•ÊŠ¤±íT΀3˰ÊF [‰m‰P8ΠÚà<@—GK#+qâëÚ¯÷:þÅ Žx4­'ˆu,è⊜±çôØ´CÉFUˆ*&@¶é<)Íj'" :mº-x¾Éwa_dß¹ßñþÿõó»°?\}ïÕ«—•€hê±Î¤ ‹8™4QÞú¬hÔ ìµÌgn6GÝšˆ«A-•B);o™5Ò&¸ÕéãÔ<+ùqÙSßnÌãÏU—Þ7á*èS³¯Fç{o÷yÎýž;6ò2нV“dÏQ¿1&gZ›u®ýfn\âR#n«¾}ñY»ûþ˜S}æÒïq溕/Ї¼G¶Âpˆ¢±v®&¢6­¸Ê`‘û–Ïý¤ÙCi«ï‡TÁÆY(Åö‚9©°RhÍW1á)Œ&* AÂØŒZüoÑŠ¥GZØ›3{Í]|:’‘c{ÊãD‘h În:‹ÓŸÜ‘ ºÆ®Ïñ œxú_:Õˆ—0Er²‘j­Ì0í3רÞ\DÀ…àƒg }2 .”H¤ÄÎR·uóJ™æ"y®/#¬äâ)Ük¤’{ÄÐh ñd ‚… )Ú‚@ŠI @ AÑ š^?}\׿úòýÿX¡®À§*…\G“Ñ'A3O_èÿ%êÚþ‹ÿŒl^1üöHHÌà~ (ý9vWßõb¹;ñ…´<[“¢ŠS>(Ìû6!û˯Լ9Hm¨¶$Ý}vÚqï12PfÑ)Ü+_õ0W#hC‡— ŠêþxPvúÑÊ?¢u^zÎæsðë÷ã~¿]oþ‡ŸþøÚù­ñVBÅŸ›þ[î?ô(&ÄòºÞ_õÛ¹e._KÏ™`»½Æ:ªï¬˜ÜÌ@…¬.¬³GÆK´îqÊ $³ÜJ_×Gzåï÷ŽÁ?oƒâDCôxÉ}9çª*'ÝÅŒ?Ëþy¶ÿ‡}SˆhM¿éè~¶wb$AÎeKVŽ94Ö±oÏ5[‘(`ÓËòËZZ—/!µ9(“€²G3zDfìA [ÈãH÷D¡ÁmΊ¹v/%¹æÐ·Ò:‹˜ƒÆ»¶Ùã|’t iÉ©^&,ÄÕçãèzšG=JVtsof¯µÆI>KÆ¡êPù+/‹wžõžåõgi.‡å–Ëù²{áçðY2¡ •°¤´;O¿m—2ÂÊ4›Æ¨M×Àx( ¤«]Šé¼ ;AŸ´»Ú?ÔÂIaº²m;oÕÇÊtŸÑ\:c†¯å#Šy ðB©€ûE.G,Zi¬ÄgR–¡íHeà!í1,V­úRm¦xpƒ}šä}T”½|dñSŒVó­šr': ÔÕô‚ÃÅ´·û¬ËpÜJ F+®#šLæŒÀŠø¢"xê{ð¬O;‚¬éRßïù¼´[ÂÝ¢y»Ãœ.íËVçLV Ã«Ë£ …!¾§7¦æ¸Ó9Cºk£`ÚýÿÌ¿ÍèIï¿êì: ,ÊyCLWõ×îÕlr.*_ÜTÜä°(A«Y£” ~,Ú¹N*¡Å’š1ë¢Ñ™4–2™…ÚÁFàÒ)mh@BÔùX‚âr±Ã"µl0š& ã%±Öì.ýÝd×¢*@ˆ€kjêK+ô;°§ÛŒ_®½–È]•&®RöùòâpçÂÐ&"®>&:++†XSW\ä@ž²ó9¶N/Ûªjøùüúù‡Z';Ü©á•iF _Õ}*W|¿9³ @ŽÚÒK% o”¶³rK%îÄréü•DNd y# ãîü$" $ÉÚî-³íÃã6ºt05C+Þ™xgæ6¦šk_è%¶êF¤0)cÒp‰ˆ}™©ú|ÆÞc÷ "W&Ihš, ˜@P*6Ì9@§¦´Fðb~c#/4´OŠL¢;r¢Ž1(b ¡ ›öÓ2¬Ë 2¡Ю:=&ÖPEÙÕ ßq?‹à õ•5Áb•W´D ˜Lš ò»ÄýŒè¸š»*+Â.jÐxÒçâÂΧNlŒ‰Phlq&ƒìŒ!Pæ> (VZR»kUóIIe%èE+8¦ 2+ØÌˆÀTb `A,h‰Lຂ˜Pœ©qþâp>¼É6þmð­.Šå%«eáEµa#ö…ZG0,°ÁÂw’JˆÑBÔY~ªšÚQâ¥~¬ù1m|©8Ž,¹Ò#û‚@“Ù™eûý ã‚|B“Ï%¶rÒJ-ÍÐÏ>(¸"lòÄaEÒ¢P_ÒQºÝO˜çøA-€^ûï~‰osñw»!ÝŒ­F;‹‹B‚á@%*Z¦¸ŒãØÊ?•~ù½àê=„©±p{ê}èw†)¤ªÉ˜´­NÀˆ½àgs¾6'ÁIbê_ãÅíœÀÂ…‹äb6e¼_†xyäveí“LNB]úNªî·à žH‚ž,–"uÑ'¾Ñ%4ÜqBœ§"<ü¾‘­u \ŒìäíÈ×ï$Ãu hðW¦ñ¾ìéÂOwÂGÃ7;|é›Ó…~CŽ“2 +é¥áI\˜ nwБ×(x)¨…S<¹$~„Å2¸Âà‰XŸ¯ô$F6Gä[z‹^Ôc~lvƒˆÊå¼°äާAÞ©å„IЮeÒ\øÄ:N×pÁ<Ô5ŽÛS=mDó(èTf€ò("Q½Y ^f÷Å0.¢Å€ ÙDôWõÕ²DkDl“vbø8–õ¬^vt…†F™ƒ š#KŽ×ÒÀŽVt® <¤€šbøµ(£3[¢„šñá0#XÄ(`2'‡L‚5jÔщ$ÉÑdIèoXù‰Ø (-C  òè+ú6ÿdA’âZGª87ÚwؘI~Ò„ìºûœcxZ ¦•Ð)Èèúx™–[{éz 4QØ$.Õ¼z Å) ±¡•%7̱iî£ÑŸîšûþóøqçi¸nÙýüº{œÞ?îïƒï7î{â;‹VÚTåù†œs*LËÆÓÆ=m˜B*:âà°"3nž8;´¿èëTr Ž3ZÞF¥ƒŽcêv ÉsO ?V¥²Î²k2 xÓ¸/ÂQj„wŸŸ\ÅÜÉËßoË’6‹):®_ë'q]hÚWõºì~Ï]ÄKÐež¯©–:Í韙$6:ÈÁ\®‚eª|qÑ1 QÚÃì#í¬ö–L)Ûzþ{úæì½õ¼n´NÂJa‰Lõ Q ´–å~Žíèpkd¢J4¨Ä¤{„ÈûpKŠî²øFÈ–+gùAŽ1Ô†{7cç\p?d9í¤ÆÒ”\×£.訧º=Ýû6>I\qÿ|7qoB"zT\×+à‡§™oÙŽ½VçýÌùË,•ãç8çIÔ$«x(ßd¾8QÜ‹“’:ßNwo´^¼>íüœ–“ÍÉN^¬ÉlÀ(Õ›jIXÀ…fÀ&/!Ôtã±[ƒË¤ôJ’ÑÁîðbµLh”s wHqÞf´Žþ)$]±4'•ú…Wd‹QÅ`±azál?sïB+ì¶1»ÌnÚòb™}ëZÈÊY-Ba[$°R7;ï€à‚þãý&›¡—¾ÆaÕFµVrt88 ºå*áŽhÄaT¢ö&"³Á)ò ê À®…°š¾Èï¼Ëy/åõ1a¯ÆQÉŠŠÈ(´-mÐxHWÊżAÇQMJE4ø’oš TØj…±dž{ŸégF:Ôg]( ƒ9Œ¡àw<Ï»Nž¹ª íg–×3àï[Éyy>ì½hÓøÈ ƒ¨l÷­Ö™ð0î2ÎW£åÖ6(i —°mU¨#q‘=Ûq•ô¢(­œ7`õK½Ó9Pû³ÃØdÔ?¿s?¸l|b_·¦*‚6sÙĽ¸Aj®4-Ïáî¥3×þî§ÿË{rßÏn_0ÈÔhÝ8&£[Ê nÕm÷ÓøÇ[|ßE7?;¢vÞ"Xmåñczô·\ß³îÄ·©"_w=Bâû|×ûù¥÷zm_Þxþô¯î|öèÅQ’Â@³Dí, `à—±'ù)ö²/¼ì=su±u‚ñ:ˆDD!ÂÀ&mæåEÎO>yf¿¼ì»ÿa£öëK'øVqà²áÙœ}ÑÇíõ6ðKˆ»‡–·b'ü zR{xï2`ÚT£å£íÜ ˜r\úüÜg†ëµÎ—Æ+69æçË™Ûþ³,àÂÌJ›cEìµ§QRQ[µlG@@.¼'®‚€QŒ‹­æÌzK\7j †ÁŒë±f¬ŽE,eŠ…XØ1Ÿi“ÉT›‚"7OþXÂd1›ž0ŠÍ èÕgpBÉõt3ò@ä/áÔ­`iɤÜxØ{®¥•ü¢GÌ F¬ôâW3zÈÈ7B! +䥜.Ûk¼¤@lª=³Þ˜A¨­ÐÓÉÀf]LRJS"ŠÀÄ $$$ˆÐ†HŠšËýoõ_àÛz»üŸ;&¾_Ó§Z@ ˆf— 5­Kùò·°þñþ·~Ñ~5v[ŽTÔ :-ï«èi¸ íÞ…y<s*nss‰hÃÔÚÞœ~÷yšoÖÚ f¤ÑäPWż¥-‚²‡åÈî‰Á£ ¯M<(VÜH¶#BÏeº;I³ö”ìÒ`ìêÿÓ¿ºœK‚ÌùôÁQ†¾^Ô{VhV𒤂V8è°/à|,'Ï˃Üé¾/Òîj.{!üጵ­¦¯xªÔóàúáßò粃vóêQ©®~K—«Ï–ýTãiFë7ó›Â¹^+ ú<6ßÓ•â}#Ç^ãMkñàø±ΪA[Éñ᪴ºâ‚­„;Ñç=Q–+yÓ` ÒÁ“¢Ÿ©’⟠³=`÷&ÄO¤ÈŸ)&¹wîv—iÑ/‹ç,ž?<2ç3!h[]ý\òuœßvæLÓ Óc?ªÇ¼Ê¦ÏZD†%WìMÐtZºîÝ›’©põHÎ[…"1,ƒûÀø´cw¥/{‹ÁÓÑ“œzçjZ” 'ffϬjé†\*dZª…‡·ÐñL9ýhä¤[ÉÔ+÷OßõàÑÇq/é3趆uu8i·j(IL&±”-´HÎ n6¦:ZçbC€î$“‰{qž~®Tæ–ÄÂ0AS…¥4 :lNܸîbð†9©­•\uDIqvS¯ â“æé“È à]Á­õgÙï—W㺂@åwÚ íSû¡4‹ÎZ'Æq3•Ç ×EA –~a=fYZØ;]Kª2ÑÌ=«t,s=²+-uÕV-D+ |k\bV‘GLŠ•Ýú&å`)·jû€kz²[ º|–_ãjð~‹j¥ò×+GLgý¿¨ÍÑ'lTA+t Õq6 ÜAmPrRã½´QñD¨´\=P˜Ùh.íè°c¤$Œ1VB¬”ZòÅgå’ZtFz2Ö|˜€r=¶;ÛæI…ܼ{ÙÙH¹Ïb¡+•…JŒèv©¨W-1°‰qrÞîð;°Â±O’@š®cÄv¦'š‚Žæbp{øPüªž¶¬´£8ðH:ÄÃ@[’¦:Cì>rMD¤`&Û[µîÕLW€µœÔî™nÛÖ.ëV…DÔ•Îï 礱lN67sgaþž^Ù¦ì5žÀæëC|*s/E¤+è²¶üŠ,r‹§Ä=w@Š%Τ ‘ÕÀKM$s àâ h8J´Þœ@L¬·ú•ì¸/è;{Ò“j®ë‚9P2nÊñ<rÎP+c1½)%ž}¹i©F~:ËÐϲßkrº•\6Úµ6—ØÇJ¯ÑWº‡±åu=]9©•Ôn­h3h—þWpKQlÞåìl¹–²Ôh•„Dª!Öœ5 üÎð{ݵØÈ7Ó€œýt ’±Œ2”&Ý¿ ½SÝt>7ê§EÒ“¢|JérÚŸÕŠ˜}aÕãµÕ·Ã塳݃0禧)òo½k~ßH>@oX%…FО_<^Rø{‘ÜÅNzE– €dÑ3;à»›ÛÑž¹D?ñ¯ Ù¿ˆ~—ž‘QN”^‰›ûžØçHüoÌ’{û]‰ì`?iî¿çÜ¡=Ç“ÞÃ/‰¶a½ºÎ7Äq–x!ØÜ;¬¥‘’¬íE¶n1 [WŸ›f¢t…Ü ¸ÂŽò+Ôþ§9wEsL?¥1¤›JDj ŒæM#ɤ !šî\C…úPVqìÕw1ÜŠZî.Â\™Ç¢Žð<Ë©z¡…;'ñHYl_4(°¬¦8èú(©K(Çrɳi_²n)…¤RhÐø' “B €$Ðfþ €(ÃRªI¥öµ€Á†ÖšŽ<;¬ˆ°@.ø:]‹6ŸÒLåétQIÔÓ3 Ï ÐnY]ÀÌ6Ñr êØ›uƒ«`G2)ébŠJμŽJLÆmÂçbyúIÅf­È`n š#Fs„‚»N@£úam¢#ý'v…€ŽÉØf˜‡éA“!Ö7)sz’#ƒ}®œËð.h%@cÐ9'oÂ+v¿c–÷×'<Þˆþ[ø=æ÷×Ã÷9÷Ñùíï÷-3¿Ì_Žç‹;Ó×Ϩà­'¹×ÁŒJËÄæI^mà$™Qo,÷’íïÿ™ÿ]ùGk/lÎ6=» ¥ÐÊëU8RÎz¢¨±°‹®ºVPÄ”ÌFn’mIVÇþÈo¢'<‚Zë·^$º…#ÅŸ¾ZÏçt‹ŒÂ8g³†°–ð,È>bmµ/›2Åb¹Ï™Ÿ—Tï¾;¶KU)Ð-õqÌ\ì6„l?#Þ®ùO²öêf¦8œŸâ$šß3”Ø5Ï—Ö– ^ÃH†5Óe§R¸ âÔ>3FáÓtÝ‹ kî¨_P|²`#IëÅJ’ô¤âd¹ºZœ?=‹Óöém!ÅãÐPýu7(¸#½bˆÖô)ýF'›ÿ<&ÏåÖ.œã|p—»;Ê”ð#X%2ÕrŸº˜S( Ë-1¸cr?º×ùsœÏðly"×'TÁ;R­£"ñ¸q} 3² >£nì–åZÖGÌ´F1æ‚]Õ¥qõBIwÅ^ÐO­Þøk…e*P ÄÓZ¢—3 è‹–xÃrÚM‰öXGnÎ˶ÁiU~J“.à‰¸˜ ½á'c4̻şÕ/â8>JD_P‚ç5óœ„DØ¿×þ³'›S~^Âï&Q0 VW%µJ Šåoýgq?Ý;áÁžæ™Ð¯ÄNL•Õ¼žÅo„VælPÈERm­ð×AŠ„q2¥xȰÚQk%`YØÎ®«ò;íG‡4_Ù6³tÿ¼ÌÙ:M_tß!>OlgÝåòÎ=h·œg'gæþ˜ûz›÷ëçƒ~nãÙe¢þù= ¦îÔ>£Æk6оà—}ŽöÜÿ|ÂKñ¶ÙDÜ9½Ð1!ZÇ:Oè6擌NJVÞ<“Tèí’|@*s±†=EôÜèò Š%ìÉ ˜Ûhö°÷xV3må qøíùûñø/göû»ýœš}f—û–ëÜ+¬È°jkØö^ËÒnqÖßS>£}ñht9g Ðô­t.Wï…ß¼qš½þöæWî MÍs%i9ë^û¢§BZxùÌ*º“AŒjÃÒc$PKhP¶dIëx% 20ÃZqÅ\J#  ^­þj_Cý-ô|v9wh⣘aPP(É2ñÿØ1›r• +“î@ÌÇ4™“Þ­kl‹ž¶Ùd?%ê©é H•àœ5“a¹„Kÿ5ø ù¥ùûQ[M¯f¡Wìb×°3»FÙ HЍ‘tûb'zÿéÂó߸CnɈ%`qÔ[ YAÁéé %ãKÿÿ?Gá ˆ†a‹Ê!}µó_üãÿb^o~ÿrìûÛ÷ö~¿_^3òÌKMÚb45¸UÃ(Úu§dý a½Ö*@k3_š1(QŒ´f«ÚZE$,N-3Ë }Ð~ú%¾ý\•÷÷ÿ³¾gy byf¥Žõ4é0„·‡:#ýL¾ß¢¯‘üÒÍR#l9eC × ¤åjqÀjæú¿ç=sÃß+º4‰+ v!@WB†ôãâ8Ò‰húkSËÆdÏ(Ñb#¼Î6CÉeäc‰5Á™ è¥v-!ÆA«§–ƒÙÄq’Ù¦ïØƒœ-Jg'*‘iDü‡¶y^rä¨PB8M(Á B.z6@œUÁ³¸ŽHNsÄ+}(0âa Ít£Ÿ-ñ ï;< ú;åbò‚m¶@–¸FdÊ— ÖD:ô•´Îò8K§ ñ‚GjnÍ,©BF¶’ €Ð,Ÿßïoo°€RK¡4$ðúù¯ ïoí5 áE™FùÊ„áN'üø3ýû¿0¾û¹o¯¹õä ©¶WŒ7ÔúV‹~»·(Ôn޳ æE%Óz`Ÿ,‰hv¦¹D¢åmt›šG¯ž<ÑZÂ#:S~ÐT¡Ê½”)àc€z+W:F6&½¿§áBíZzaøt 3ó—®ù¹É!ØDd¥T¸üþ˜|gøºy¯„.ïýÞ÷S~Ô›RIaBY(ŠyTÖçÿóüÏOåðäëš=ÓëA=éßpø±yÒí5“5EóªñZ±Â¼/¸-?®ÔâM_ÎÛÙó‘é ›Ãð<ãž4sÛ××¢~irî7tVp.LÐlìLt%-L?_íLÙ:üÊ^áûÓÌö¯xüÔ_}ÏÛ)Ûž6k5×j‚2À_yäéÏš¿T >ú³h«}?»î”¾\@‰<Çš'ïîßÞ?óÏksÜ6ýeüµÕsž»Ï+Yƒv2Ah3)ÇeŠr‰C‘”ÆVDíÛ冒(øÖëÚÚžBÅ6áŠ1#qFÂÏÛçÍÙñYjt„í+¡ÎZ¬Ibã-Ýu*³-£n#:'{}ù{OëÇ–uÏqÔV¼=½÷®ó‰d‡Ã{dYz¯µó}ü8\šÛ—äÌ50Ð)X;Q(€ lDzì»z®óP—޵׋ciÙûjÜ[‘Þ¬‹2XqÀ¤ ªùLÞY}Σž7¯c–”Ùå‘…I'‘†v°% ƒÀE0*Cƒ!f[¾Š P[˜@[)Þ!eÑB´¤T±òUð`:l†i&Þ}íŸGÑb–Ñ äØ@jÝœƒTIŒ²Ê—Œ$ïÌ#Ê;Ø0:Øï¬`Ì(q†ŸQ0_³@í8CíxÆ=·/ëƒï#àîVo-DØu³Å˜fÑ……tîì´HŒEªO$Z"»jðLùyNgŠƒÝäžH<1g ìá6eÿyÑ·¯¿d 'f|;¼se-SFÅ4ª)(íHnƧà¡1q½,D\A’s/< ,&S]naj(X·BHÒ1Æa êP£aÃ$þ¾[cÒÊ^v¥"‚÷u =4õ»ÌÓzv®Úª*o%Ïçð}áR@ ti á÷Q÷pÒœŽÌQo=AÆeT–üÊi\X¬ÑT]ŰYTuÒòb܆^ Cv±bwÃ=@kÙƒ¬ÃDƒo‹ATûf>ü>x×írËZ¯£H9:ukRßp³ûdχúÔùo~¦h]×»†>ž9\õoÜ{”§B8»t¦Ü¿\8bU„uœhÜJÓ{Й/ƒHv~_#Ÿ?úúµË¹þMÞxço4¥ª[¿³ÚF<²Úq"™à¥Œ¸jÐ]iÿþëÏ]§K V Õ$pÏøòwÇ ²rKÙš Ð%¯kÛ᳜"œ%‰üÆZ ÛA‡G¨I×vR“æå³®)˜sëœAFz:+k5Wa¯¬V÷9Ö8L¨ƒ2^ ˜Ñ‹$PÔBX0qÖvݺÕs¢m«&wÏ/Ué4@ÔʵZjÂJtN7Ç\5mq2Ø“[g’s|õKøT¦^ŽT®Åµk=¥ˆÆQ4TÛ7 Àc…”“îªh.ã&€Íò”›iÓ±¬6|7«ùoB”ÇäꋽŽzR—Ÿpàsüеx–WÚDpʺz¦—´4ý’/´!÷1Û[Á:Þ8–$‰l¡Èû´­rßàÅlñ˜"-ÝAÑÂ*Ú"[w®NrÕ?y2éwsÀj¤^2 Ÿ€FМ[$PÇNüù žVöãðwLÃÿNkV²ä}'9#–:¾Ó“Ä»4^0¡µrŒ\‹Ø‰|K6z@*(P#|-ïâÊ€åÙ½¨ÁxNÿw0ÓÒð•¨×ávÑmA; ¢a²}ÅBeùÛÈb ºUh“T«0ÀÖmÄCqçõ§l‡$'½&‰¶æb­{ÙÎVˆM¸`O¶7rÙ[¯Ê”‹×¢À¦ª fUj=fFÂ[Rhia8Äiëtä¶2¼3ö«Rßm> õ‡£ÇRd€¶ÁªdW´™­n€xL;æ¹Z¬s€efÈÜ‚c2[!Ë 9hü\6Ÿy‚¡pO3`s|¦%?$a8*50jÑB´C‰ÓU=Ò“nôL1ì4±$jsLhc!vÆâg$¥Â{îµu¦-Ä$b¥0hg&6ïϧc¼LŸü°_óRœÅ¹MÅç4 ¢°ƒ9`>¿i¨ü"ÑÇ:$×Aì<˜eL)"÷%eh¦D™z¯åé F?]I0Æ!&µ)ðq>G 0“:2!bT•zÒ>)v¬ ÊÔg/íÓ¿ð21ÊúÛô‚ŽKøudîðÀÒ—Y#Ø9©Ñí`8r7|3-Ë_ðƒ¯*¹èÆÙýGçÿ€—2¡/ålÔeCÁ%¡Y¸½Ù¹f)V‚ÀÆð( Û¶@ ¡Ñ0”¹· œ§…|_•ÅŒ††÷Ãbó ëƒ~œ)‚ªó‡<§±†;º0§ñ4Z7h5‘¡Š‡Œ§ƒ‘.’ Óâ²àU7«—JìLV–EÈ8?–îß>¯Ú¹>ÝÙm¾ÁãxLÛL W‡5fÔo^ÔD‘C ýAF“. „yEÔFaÂu†Ï¬UjH߀uùDLòI†±çLH1哚*ü¬ØZ+—[Уfh&o§¸ñ›¤ðª 0§{–E§…ÁùŒÇS`ù®îy›í&‚¤ذcH@³îÇ‘sJÀ¶¨Öƒ=Z¨¼’›T™ äÈþ÷ï÷ECÜÚžfJBêpÁ§mG…’Ñ÷±JKÓ.YD+R\‚#‰Øg&Vû Ì:;ÿ>Â_‚{­ð½ˆw;G76·Ug¹ ‹˺ټÁh6ɧˆkJWßA¦ .Â:Ëåî+¸á=a£Õqƒ·úf‰Þâ ¼º8Cê:¯+Iô)–dÖ¼ÐóÝcIJßðOÿTáN±î`”\VU« œ4$´>e3 ¹tMT䌆=ý&!#Å#A0Òæ:R ”&: ÅŒBÜ‹àæZèGÀ²]G¦Õ4T¢"l¨ˆ¡œCÁäŒBJéö±/GÆ^9Æ;5³î÷Kn=pÏZÌs‡ð®äz¦nýù¥ý>™–{tÃqÌÛ@àuÞ'Ã<"§ß›u·ö¼Ñó1™€£ÒGäÔÚA¨A²ŽmhN¦\¤û Ê­™ j[@\ïÅnô.)'ý¡œëÙö>ï8?˜SSšä&C·ÜªUÃõ)}GNN^Áý¿½gîñ;ÃËìûvßÄ}¤=ï ¾wÇͽK·ÒD•”a =\™|t¸y!Z®'K¦çÚ6i^ª/Æ‘‘bd/È‘›@w*#[iª‰iÈE™0Α0fTYdhâ-¹d”Zi€ˆŒ\È@ë¬DÐýßJe}å=w¬Kfß#ç`¨v-»xz¸®‚¾»,h-¡úQy“³Í=C‚.v7ìZåxÌŠö&aËÌ6/cjÅ;¢GÔõ>tƒè"Àb: ! îêk&Ò‰²)A¤wÏרç&?^z~±Ï‡›`ãÔµhÅ«U)2k¸ä_ãaD1?ó³ò³O[Aá ®-?Û¶_íó±ùP÷-ÿw_îBâUŽ¢‰`«iszŸÎRv ä“eqWƒÔŽ¡hÆÛ"Q¶L#IÀ›.SšôR iÌÒŸöFUÜZ¯Ïöæã§=ooŠ©á|ß§îõ5µ?F|±{´ºU¹u¸Ñ>ØÃ–#a «bb‹UùÒÂtûº÷quäÉoªÂR@îtÊ"Ž(I¯ö$Á æ½:)PÃI4.þ"Q¦]MI©#]©=1€„)‚M‹>ÉÝÀ^«XV‡l€,ÆéT2¼‡s¾{glÂMßÌŒAœ x€@±5dfíÐ8°z P ËNæ+×úZ#Á™.bùµêè§û-Ú¼–dÀ©@ꉛ'–=C»/~Žâß#Ëê¡IÊ®&Øë|.ÊâB(0ÀbÝÒAbáÚ´ŽHjÒL 3„ÀFmE!ø‰íëï¯×újàždG×ú¹`~{ýw›f5®Wÿ}KѾŠÔ,úýoOêåáºÝêx &ç0oX[¦]“38h"@ÊJJkžo† ë’‘˜˜ÒYq~)Ím¨á„2t‡e+Ym5APä¦ë¦ó‰°öGìÀ!ÒÄ‘lÃ6Ö•ì *™5H%ÿu=ÿ )smñûõØÆž®TæÎZHÀt& ­  tYR§ï;ï__Ùç[ZžÒ>3ggÝ.ÖØXj“¬!böL\Ü­8¬9¬øü¦öþñ7ׯ¢Ïè/æÛÌÞ¼i"(x´=¦€°—ç\¥h³"#´ñò ?ýÁm­©Ž&©î—²õœ¥ïz»µáÂþä;–~µúÎúÅIìã£sKéeÏÝóü÷Úʺ?ïû0ä¤>kÞ·9á{«þvÂ!¾Æ{ÿólü½áVpÒ1Õ¡a%ýzñùt¹e¶Ô—¤ƒâ&ÄAÖCNðeŽöÙ‘í kR›wBy÷Õ»¼ ¸,dH±:°Q„hpxäé£mŸ]ÌFèÁ óá]ÍÝÇÇŒ÷î“ýèÝnrY;#ì­Ïžïäéß Ó¶PÕ\:ìÇè½á## X«8±’\ºmf6¸Õ±F«â¦Œ[xßò8¬iòYöPÍôˆEPØ)™îÛ¿Ç<]“y—‡89Åp©6éhزë@ƒ¡t±) 0G%…8 ¬: &%Ø_9U2iK ,h‰vIÍÇYÎZ­-]95O:™è9îFã£QGÅ¥VØNÄÐ Žûà\Z£Ž98*›…¡£@ɃÍþ"uÿÚQn«Ò8îüšEDJXê¬tE—GŽq«ú,{1û°­t C¸„ŒzàvÊÒ`Èkey)Ø8å©-Ü‹¦ç‰&‹#`vœ…KQ—† †¿xö9w¯Y¿–¯/ëé­EX€ãªq¤ˆ ‰Î¦×ᩱ\õsõ›5ÙNÁhkÑÕF±˜ŽÓûÚNZjˆeÈÄ@@Ê R‹À Ù¢6Œ5¥¡eYèr²v¯t™o]?ŽRÙQ¿÷óô]70” à—eøü(>{€P±5 4 T7D?¿Ã.²O9¡=‰fº¯×W›–ªTã]ø{ñ-2Lpˆ‚3B¾BÑ­ñ 2ãòŒÑ i0L íÒBÝuZNIJ“’ß .·à\€!ÌXƒ®oìQ“$_çgø4€¹nmÉr–ôÑîÞ\É®DŠŸfCîd5W†0KÚŒU‡ ¾¤ýv)Ó’àk3Iúê>N°N®üÓ\{ÍÂì]+½ã {º È7öØc¢Nt<¯ìeò€3“@øX(ëÅuN› QX¶«Û?ƒCF˜_(וF¸èR^.£½'ÍÜ î/‘ŸNg¶à`ín¼fa¬PË2q^ h·¯9›tÍíòÄEN  É@€¨ Ø YyMlìdÁIð% ´-º¨,`UcZá.^ ÂjižÒaÝi¢$~rbí™U‡Ðoa„ŸÁ r€NGÄy¼Ê2—Å7qÓjlDF·‹œ,Úl `¹`S€`'#·ÐÃÛDz‹t`V0“ùÖ¾ñ °kÖ÷%6×Àã›îs”bpÛ } Ÿ=YðÛGpæ—8…6Éõ̹¤ózt»|˶†è~“ÝHr²Ô„NŽÊ¦8¥X®ÝÖ®ƒˆ¸à" ¢Àº‰~þ2Ó¢>VC/8†à'y@⵸:½iˆôݲÛÐC9sÓ²ê)–æT ™¼éˆcì " ØoµÎTÒŸàoÆIK ï]<ë~«ß)иf!ï»Ö²qÙãÑÖ!3bh°e.׿çôC¼ ‹: á¾ë0>ˆâZG÷fÖÜ͵æ|ÂËN^1Þ¤/³#œÔî»ØL‹ëFÿV³õ—Xçˆ#a Öt=º˜\òÌ0Bgž5S%ô]!%=R <”ö ídP Jg¾ùîÒó¡O¢ÛÞ5Jηpu :øG3æÐ ì#ö:ÀJ…YÃÖ@ëÇ|wšj%![Z¡5àeíú-n|sKkv0ðàÀ¥u¨õs§ûJæÇnE£±¥,+º‡M t±Õ ”zœt­7Ò%¸„ª®}ÒЂ\v9Yb«@îÀ2uÓ>lǪCŶí¥ÒºÙoŸX2Nrµ=jɾ*ÕzFAµÊh¢Ž}„™bˆ¸’¬l!¥œX5”`pÔh¤ÜŸ DPÈà1p ŽçùŽ,hB†-°US©FB=9¹7ÈÆþ|÷þcv@Í·’7”8/üiø©zKp;óUT ýeŠîÂ.bˆC€êè ëþñ÷åôF‚jÅLï–ÿ²—ÿ¨ë±2œȨJk*ní1ËJñDÏ©kTH:*0 ²¡)f&W÷,Tº3;ógÊ`cêâè{´µ¸Ç:¿Þ‹—ŸÏ,Ïj^Ÿ£ùk¹¦à±î@³¹[HÝ1¨Œì!Ӯ܎N…´Á7ƒW¬áêc¹#[=üÃUÈÍG”³]`ž¯<ݯtž÷Ÿúèÿò‰ærîg³+ „3 ¬·£„ŸcP¹Eåf6J+ZqY;@®{`éÁ¡¡Tœ–£y­Ù¾ÕJÀN9bK´…’ó#GIV8]….Èç-·PÑ ‚rx12–H_ûÆyzsN‡öÏñ†k¯•3Nòr¬£é·Ã·¿Î2öé#E„Õ9¨á1±¨>Ëì?Ï3üèá£×.-D[Y÷ݸ—î©weFTQv’Úft iÇe(1XòJvÁªh5!p»3^Þó¯ÃÈ"Úê®Ê­îâl0І,~O»O´¸âY`Ãv0îZF¡§žõ£¤í‡Còb¸‘ZøvùQtÜ ¨¹þküd¸×Òϸ­] ¡kê+êbšùüáÔy^<ÁÍ?Ëþƒ ¸e3.ï t WhМN—jš„¤# Õ‡7Ö YÀÛð£©Á®¹dÎ J1.~Y…]V –å½ Èì¶FÈ‚àlOö†"pÄ0:à@R 0:tD7e£xÖþåU~d|g½kx©AE~º)yW)ys}¯Ÿæ¥æ{6ÅIë3ã}ªG¼& 1O;]~¬ì ò÷Ìz3Ÿ‚'ãElU`¾®ócW‰v€M,c‘Y££º\cˆç0Së€L9³Ñ™m2Éñå”J ®‘>O÷ þ–íÎ÷aÔR-Z/1L6°ß,›Ûho—cØ,ÎõÞ=À{øÛLjklj©(}LJH¦þ’/=Í3‚¥¦šñ"w9àd"áÏÏ'?´rRN`N N]DæZ8kÜÀb3r.À±Ù`kFŒÊLb2G81Ñ¢jQIE©Š"5À’¨Vº"rÂ+—„œ'ääT¦Ü2ÖýúôRôÊU.ƒÂ˜´“Ò´½yûŸEwn:¾LÎ÷À;áµÕmZÊ^3l6õKß“l·0×0V+kVèö_*Sˆ@õ` M|¤EÈR>œ+@voš™ŠO,þ`ýÙ~É&ä¯ÿMùuñoÞÅÄÑ XÚc°€93ˆ$›Œ ÿ¡P$fRå[b®p‚ü3ÝÏ÷ó‡àßï÷ÿ›Û©;( ,B§^…æšt Ù4pQ%å´¬/«S±°ÐÅ{º³ëˆ–¦#*&Ð"^Q”;â$©EÛ©*£xu¯ï“ó~¢óâûxöª«çããß(ï·¯¯ÛÖ}8G‹³ïyT¹î«ë,ɸ%¯¦6†ú’âÞM™”«úM³­;€H¸4VH0I»¨¤"„š ÒP… Ã%@œ•ÙíIˆPd•T‹0LœËÙJ» ÛÆS(ìðq¹'â.¦zsf|glŒÉ>ùaíA¤8ÀXQÔ$ ‡ùˆIÔ “\V ²gíÙú“@Ád;¨Ç•š™Oó‘Ù¸ò^ " ª‚$×üÔþô;™Ð6°ñoâÄ"cÐJ•η‡7rz:&VÝÐ:® ò¶tö TÎF'¶›@¦SÎLåþBmE¿ÌØ\”Kp¹ì»šñÂ6ª_9wÕ¡¨É¼Ï®ë‡y~²Ö:öŸßwÏ“C ‘™±R¬ ˜½Ív;ˆUÀ>¸{U¯ª\À(6×­àBZFˆó êaÁ­ˆÅ¨¡Ñ@¶'«t*oEW4¶ãhaS¸—£ ”ê Ž­ËÕ%æ 6‰÷)–ŒKU1.ê]Э¤Âµß­ÜU‡Ûᤴ8¯wk¡&îÝ4¨¢ ïׄª0 ©°,0¶¢ŽÜwÄ9šÔ³F<ïÐd 2VÅJNÒ¶×%îÆ\Ó'®ûŸ÷ÛÛ_üØö×¹j7‹ÍÃIÙp…óò7¯_7¼ !Oy»‚ÍÔ¿ÀS#±Õ/?«“fÿW÷¯Îªîl_…2ËÙw˜:ÿŒ>¹÷€©CfÙÔ|t´êÆóÇ}¾ÆË9¬[K=ùX‹p6ï?ðD2/Þ1/+ ñ MÁ’[‰ÅðjîYfBœ¦•B²°o½ø½ÑÏn,掠9¡Ý Ád˜¶c+Žï0.ÑôÑD<šx†½ ¼" DŠf{¾ŸŽgð\‰b¦ÚªÍQì,b }ÔiÉ „?YpV ±jëå±ÓîµðuÉWãm4„¤”…‡Ò€5Ù»–N"G »ê±A£yÇ&ûК4 ÃË˲BÙ!kºÛ¿ßbð¯ÂâËÇGégäŸ÷Å[蓇+'R3Ërã&á”ÓM.cè`Ôíwà(°£G‡%¾ƒìhÏaèllˆ3›Á@k’¹]­Ô ÙP›ð mö&—ƒJǶUe &j&`rw,“µºfÀˆ$gæ2åpQƒN5rHm«ß·ëò]ô–ز)4`éžfpW ]µôíŸç­×í››–x«¿Ò‡î .©šð2Ý´´bxMW,ËÄdi÷d"œ¹ªd=ÃØ<1÷q¡Fÿ¤•¦ÍC7Ÿy.޳‘¸‚¦ûó8Þk p.tö‡qÄŒ"ä–l#·jÇ0š&x ÐZHà\sÛ–… <›6‹ Í(|"*œ±&ê`TJ†¨p™{„Ÿq”{õbŊú¤ m%ApM"†¹D=,ÅÜhƽë 5šB÷wmWÅ­þg: ²,d1ôŸ,$ð¦k`³TáÈNÄ„hàÒc·YÓT+u]=N:$iSJö'‚žµªE|‚Ž9ã”|•U8tR@rœÕÃNÙaˆÅÞÝWTd©=z6ˆ4Ì®Ñ]LKšÏ1(c<°yŸ¯ÿTáÁÁ$e"#ûº2ؘ. HTR6 Ó½%•'ÔÑ‹¬J¤,Ý~å……’%ÔᔓÉMKdŸ£)JÏҡ߄Ȧy[º;Z_òËþ²æÔ‚ËÙ´X![wðñøòËKz·¾cvìjï̆û(ºÖY|óD¤’¨…·Ï¶˜i?ÆcqP%BÁ\Ò˜îRž_Að÷á ÿ‰]àÅ]ï²;¿#” ˆ­¼Š~˜· ÊfË]‘xöîX‚Œà׉Îô¥5ts‰íåN˽7\34Ñ®Á¹ "Û`°Ñ4šº62»'|s:£kŸPù¯ì˜N¢ ÞfRiÂÉtxåÁ A€¡ß’nÀ7'Ó~£p\‹I/óùtڳ˞œŒäÙ€›7ω –‘wdÚ“¡³g›±µ:†0@è8‹pÐ ` oÖõ›‹}þ¶ûŽŸÖóçÌóæã÷Ÿ JÏóíëßtÎ*ß:âvè<3|ó’Ú¶ÃÌŸÍ.¡,êÓš_2à\†ßè%‘Ø,H¸¬-?ïx!wÝ%OŠ£)#tYeÊ%"€A¤Ð·ÔZ/€;IÊÑ—”‘É’1ñÓKÛ¦^6Ù§Þ1Ë\ÍéÙͳ’Üx®Ï-s}=ç‘×c.¸)žÿCJ1„·VçS~»¿ò?-½¢+‰õÊÊëIàå$”X`uÁ½²Ä bÔ¨Ge ‡C Œµ Võñ2°lÄpôh€PÌ.©‚žÌ”¢Q=9›šyf8"fÉ%Ô[„X(ŽÁQ¢ÃÀišð¼$ À£ëgݾsÄâØ Pxžs1Í.ÆËü;{vÏqþäð‡¯E_F!sjŸ<È+¿œq„Þ PÚèR–™Èè…Š{ÌcÃ}5›Øx›åáƒ\°N£WaZÖ#Ã’P˜©eÏïùêö¡¿Çý7뻩ŸÂ•K¹‘¤RW<Ìšw]/ÅÐÂöïþ=þ˜/è¶êgx¿sã€gÎÁ|Þú /ÊY]ÜÝ`ds^zÔ ÍÍX© [ƈ’†žŽ55¬3Ð,€K¬Œ¨€(­a_¦g¹š¼®Éjä¹ô>¢ úæâ´A|¤X(çA˜ù7ñü“wþ.˜Ýòë—,°È骢›]À>>’ôaÖeö:}”%»Âüp}Ÿ‚ϘLõ9_sü‰7þµk 'f6\ýÝó[^ÊWýÈØsç'-X9GúUTkÙü¼ÙÃRˆ ØôÄú8g2ßóèÛ2ÙFt>„ ß+nzC&H§I.Ä R؉´ƒ%%\¤õÑ€³"ïÙWEi" 1cÚ,N”怖xÀ« 3 4–­A»b>Ùc!'éÀLAT3Št“nþú ~›]•æbfNˆd©M©ž3Ö„¤âÜõ¸“¤0•J ÂŽÕ“D{+u†[ˆäEƒ(C˜6ig…~·Ž÷T#4…ü½gí`ßæw|_düqѲ–*Ä !üFòÛ]±ï:RšŠE4"¢ö½tG¯ÓíT .×Á:á^CLŸïý;AE1H¢Í‘•ܪ›Ÿ% ÄDüò0ñZþÙ³ºE°#wãz°àddI°tà(±[ 4"Ìéó0 'CdK˜À˜@†É7Xm?¬0cÙ^΃'Ñ:s=¡NóNå1hØæžÏËý¡É×hýÇ@2>9çºÏ˜'ggö÷—ëþËÓó·'¾zý\ç'KædNʪàac,—ãÚ$ûmWôþܹš~~97{Íkdz`[JziyE"¬ÅHE²joýÕâ´ËLm°þâdͶ{̶p:NcPc®,Óñ}@‰ ŸN~võ‰Î³ã€¸T°Ÿã~¼»ÂjOËó`ç=Ú¬p=®‚+‚<>ô°§Ã5•îd¦ü./ýÌÄPw@^:Ü»3Üìœm̦C¬CŒ;Ø%Åã5¹K]CÓ kÂkðßr56u—|'¹ÅNgÏØSc|b%l ©b"/HDkÕôC\$ Q· QïJ­Ù uúñÝþžc^ø>5®(ïóYžÿ-v8Á Z$i9*Š“stvˆú Fó`K½›Ñaï¼üøw/ÿèùÓ¿†}¥Ô‹¢³Í"D˜« ‘A‰K+!‘ ¢2‹èk97zZaÐçÎ\•„RO¥ ¢+UÙ´ÙÓ}f¸·­*ÚóÀyžòx1ëà$ÿT÷_õ7Gó\›tÈ­I:ŽŸ1®#˜(wÚ¥rD¤Õ½QºòìJ[Êš¸Ó½ÙO¥Š!–f5 ˜ˆ…²d m°‘Ï(Kª”ªoÔŽ!2 b#+àXzMu§F:nO:ÆM¾ã·TÇM£Èo—ô úä”Eø¦€Â=KêXŒ 1$ñ*s¦ÊT¢Ó}눴&‘ç •³‰x–•s´QXu da/ú®ŸA‚é‹ BB'T áV+íêÌwœÍE®ÄGi„ƒMÚà”`EŒE{ÈOãAö—ÿ‡éããoÿÝÿÉÒäljÇýÆÙu>¹(ói ðæz”?üå<ëÛ÷íö²vP«$ÒjiÉ8Ý‘£f™“6 à çpD¹å$ŒÄÚ t°i`žf3Òã>×Îî3R¯/?+¸ª òxÄ%shR¶ƒëÓI ßèx;€dw%šÈLÒ#(©ˆá‹;‰¬Áiž—œ[KèÞ©ïÅ3Dïw¬E¸‘5$•¼°ÏÇßß©Ê!êñ~ã° `H”“&¬H'@¡íèY1tð =Óô†ÒS5 ÐN€Ëã_ë(­'Ç$a|ÞinÇîŽ6þÆñ<ÿ=VÿÎÊÛOϨòضe×¶z¹!=LÀy CI4ˆÆ) ‰ý5ƶú%º‹+¡V4xœÅiénWÅO=ä!»dgû¬f´Ë-tk{…ËåíÜìãÞu®)¡Á34fš!<çÍŒ&ù)ßÖasÆÐ¼Üx4'¢‰¾ÂÇ‹£@ÏãÛM1ÒÊ Ûí¹]zïëús»³_>¥OÓýêNÓtqŸ¦uƒŠ‚ûäéma=*ñÞí_ŒÅ²¨€J²Yk¾ ¸¸^R÷¸=9¯¦iK«Ë˜ðëW2oZC?·™v°Ü §€jNÀBáðŽ™b©Tª©aè7—†B“zóÐ ®Š#¤7GÐ3¥/Ù—ß7XL6ïö§5¬|d*îý|~¯þU|òÿø›xPüD«c’»ËS6`^BÈJB›"R7í°3ö–Þ=Ù“ç~¢‡6Ͳ“lE µ§v¹s°d¦]m­eÆQ¼JÕ=>n!•ÀЀ3+óÒóšeé¨àñ°)×h³kÚËÌPË*9N]-Ø…ð ëtWæ)ÿÙü–®ëI8‘E %žËYrTÏFí-¢ëùz H4H,./ʺ\f&¯½Už-[v ÷È:¥³ô ÌÑ3Ö´=«yÉêEí„kÇo«~‘#2N¯¹ÐG@5oÔ$E- ç®E¶Ls©µ@ÊÜeÝÖ¾‘o—LÇI—îSŸ²c_;Ñmh®(ÜQªÐ˜ÌºsPg´èV*Ma-½¸¥Üçºétïš’Põû¶Ëu`‡Îð!E—rµÞ-m¤iÔ3‰@wmÕ˜Eî€Æ:"*Ûʨ¼Ä+ïãždkqXÍq¼3-€áÓÂÇ®-<àH‰‘€&ô¥Úl0´""¼"þÒ·ÐèÃuá´püyÐm@:¯Ñu.²wzev쇨\—zÎ4ðé>z<ÅÌ>1'Ã!íbF~À×qqÁ³¹g\|½PI·ãp¤‹2ÂGư•o}«çœ®ýg­/uÉ´.e­ZÙ‡~éŠo:;RY,öƒ„ng¤èläèmtG;W]ÄÛaHM{¢¬;C_X×þuËœ˜ÍL ^•[`ÎS÷È‚Æm¶ôl }žVÎ r*Î3ÚÁŠÿªùïù5ÿÝÝlî¯ã=/ÝhËT7 ŸšÛû®_Ð^Ñ·k“ÁCÔ… `™H«Êl$°¯ôVï3íšßhr?NLõ¥ÐÎ',Ðל἟×÷ï#ÿLñ6îý=«Dv¦/”<5ù޲„‘r¤—uXú`°Ÿ¯rº}­mùzn˜ì„@ðL"‘ ¬!BÝÁ~9ÍF ƒZä i¸ä'š>;ˆšSÔ$ã-§郘XG†!oïׯßýê§µß^7Lù¡‰Œ†×xÀøE²Œ "ƒaâ ñ¢÷&UÐø{âg@ŽÁs'IDJGÒ ²PHŽˆåÓ—Ñ4®ßÈ_‚z|b³µ^À(Úâ xƱÉUÒHoÅ@M8 Î4XªÏدéå%ÐB•F(µÓ :‘Öq¤ô â 4YäaÉà0œñ\KÅâ  `PÉDpõ0âà@ ˆ€+ääd•´¬™;ÊIk¢lƒ—ÏLèx§?ÔÔbZÊTó8 Ñ.qƒ?¿#÷ë„ð’øMä<ß~þýï?í—SŽx„ DÔ}oÎüNëÌ8 cÖ•’êêícYì!Ä Bâð,~÷Õ^ÆŸË„Ü7´ê81ƒài&¨ß̯VèGHAjåf<ß;{’ÓLư=€ÍjxCv>®§Áì,ûŽ 2üÇéÿs쾩hîîÞ?‚‡/íÙ¦Iê߬ÿü95Éfá"{9KM¦¦K© µ<ÉW¸qin¸´h€Š-鮩4¶‰¦QR‰å«âï‡â# ÚóSçÅ~{Eþó•tUW1§ööqöÎcþL<”×× ï¯Ôr¬û@ÿÖÖ.}¾‰ç‰Ø´Vä`oùúo‰³«Î4_ƒü†+uð1÷YfŸ®e½V×óšô–»_ýä?åÛÇ¿ï2ísx³Ó))Šœ¨¯"£='W½ÐIl™F2f)‘×m¸ÁFŠë=ÀD¢(ªÐšEGX 3—mn!¥!±z²,#i£Ë)e…«É¼ClUNÆ-F…d½ÆBì,A2„yû;uÄŽðÌ“E„ßç9®f„¾sBi` Í¾Ò0jG1¨ðxýi§+îÜ5V¨ÉP£±—ßmÐs+À‰J¾t¨tˆ‹C¬”·6}D„¶MH‹ÌÛ¨•ÐØoHbÞ · ÔöØ\`ù8ÞAÕ5·†a£Lû‰¢¡ E•Ž~6Ïm×ÞYêLT°å€QP”–Ó¶ å(-S€båùâÖüö|îôUuY׳2ZäÆkCŸfÍV9QVOŽëß‘Ãþ¾i˜ 7ÒX O†¤1ˆÐ¥³Â1&ª4Í €Á3Í{U¦°%´¦êš·Ñ dò=gG|"%ƒ“GõZƒÉÈf²ð’©Q 0AOr£°Vbm,Õ A¹1˜J͉‰âfä•Þg¬£H »fÿrì×ÚsD®–u¿Èù èh'¯SsÕ~…gîÕㆀ}]òµ¼§z{ƒ½ÜOМ–º×Y i4Åf#;¦"j$3šìo{tfd&Ê„íÑýÜOÈk%"hØ3+sÙ£_'¦á˜ï-ÇžÝ7?xçâ>¯ S>¡7¹Ãì«°„#çÆåSøª}°ÓΚeé(¨Q- F! †"`†¼(”„D »$‘UíF3l²Óë{<×Ý–ûžÇÎ%WúöLKN͆yÿ}<ŽË1¥+ÁN>™ÉD08Ò$”‰(°‚Dcø T€aÆÁ™”MüT~þÇž’ !ĹłB$;¬Ãð—ÜŽfвF¤NéÄgå[³ÓöhˆøÔ»sødU¢&0Qª€ JÅãiÝÏ׿ïìSŸ¿à·ßåû™¬Hç K µWÉáh¿ÙÄ3“4*J#QÞRVJ©d´rŸÍŠIúÌ©V¤iµ=.Q96zãá%óÐo{[pT˜biÃ~â,£lÚ¥S'çx‚»ÿxçªÉ©;M®c„bÂRbaÐA ŠfihH ZŒh© ¤Ë4E4ÿÔ0ä@dÀ-³¢Œ$‰‰U,:,R%„#ˆ$ÈHZi€ÅR)¨“cdAQU‰sü”À¡ó¿ ø"¼^‚“dM*á]väôÈTP¬h:â>ô¨h& 5@ |5’­QǨFÂ¹Ñ ôÝ :E‚e¡Wúílnˆ§ Z:½YN© Y‘–ÇŽƒÇ X!Q!î4QLZÀéd³à‹è8iN€„ çÏ¿è“õú’—÷ü?9¯ãßÝþÖ~¹°¼z>>v­ }ÿ–.¡íq¦p<‚ãGÓŽë/Ï핳";Î$¶Õ‘ÝʉŒƒÐˆÂ'q".¡-ÀÝ#n;]Ü’Ù€Üm àò`þVµR(È”2ž9ãÖ€xÊ’s½_Ç÷Ö3:åÔ]¡«ýæÚþ†ýŸÆõøÛô‘=•‘.xL+„0(‚‘׳Oj0Û’kXêäh€•¶ Tqìþ¿ÏëOKÇ/MØB™€…H‚!䀙·d¥Wïn,@Œ —›@šõ±mž’Ÿt9S[‰§„qúþéÖõ7~‡9(útp'?ß<ùë\±¿ª÷ÃJÖF/c—Q”À)ÊfrdEÇ]sØbVc j¤SµÙU+¥!ôñ© ÷&ÏÃÕýÄÄÈìk ÞŒŠÏ†U›âOê÷Y)5Ýó¸Ï”BàÊùšžÞàJwêÉx²á [A(µ¶'h+ýT&¼¾£ê.ñ 1ŸPÄx)ëi¬XY,ZosýÁOZ>çãï=ÇS{kƒÚýyr?ýÝɼi+3Ûýɳáa}^\Ôu¼¤ X8ËÜÄÁu'cÙ=¯N4Ãã°Åyö4ß,ÿdÞäL² ·7¿ÝèÙfòÂÐöÑþ™5>Òj /E¦ÄÑ1%”/9“/µ|£Iˆ,’rïŠ=w—Á0?íûâ^Çé>±]ꞀIÏvÐ`vÿå½ßÜÎß>;*1Ò>\/†{€Þµˆ¹E,´^ÐÀ¤cú™]B'É©ñ·Oº!.c›KòËWçñÓÓ]™jXz¢ÜYÝ4[°ê…½@Åt0‡íP ZÜÊjºtúL'AC:£‡å‰™ÓÅB1T‚eŸ½¦eÂfí\“äUJ DËbGñDå:< ƒÔvôñ¶¯WEN-¢Ùó¨ŸUĦ¯\%fYHDd&ï!PÊ5 )€¢q5±gÜL¾·ß¶£<ë-Šn•ñ/*z9Uá®i ‡t5`QÔ=!—ð`j‡ÜÙÝÇ‹›–¡½È„()‚1ÞÆYcz{µ¨õ~%;ÊýZÈ7/E׺!^·B•Á>µ¦•°È„p „¡ %4c[O‹ËÕjÜMV DÈ‹:¡=‚;¦s¡©Z^¶ýž®iŸßÀ;æêÔkÚt_UËãéVÊg`£Jí25&g`OiÇÒÛd¯LèÆ<ìX ¾WüÁ û¯ë|ö\F& Eµ+mÉŒØ\`«‡VŠ©±ã4ÃŒ~Ȯٲ*9×WuÕîJŠqB?3x¶œé®E£†á~ï&»’¥R°r/!Õ͘]%ðv1XúË+L­ f`ÖAïŽ'² qjÇzI Uyùeºq˜ˆ©î!Ue±±R+åA8½Ï4c¯1‹à1UÀZc Š,[jU— Ô¥õ<µ`¼ÄØÓ¹cÞgØß_ñ_'§ïÙÍ̧gäÖ§ß,Îçž’wü]šóó±8$&ùx$6ÃjFÔ€SPTõ¡øÌ{r‚Y+É(Ã/`À¼!­µq ŸBN¿—aTý<’¥CØ›Ñîyø^d<ÍÌêÙ&!ZAˆý©w83Â'nƒ¯0ï 0`)?|M(‰Ê„^…Å‘>¼?,hK^ÉUsì²l> `e]›3õÁAËôäJÓ…õÛbø;3Ô¼Êm8 $òL¶S3:jüŽGœ'‚€SP$ˆ·OF‡¤æËpÇ3 ‰Äw$Q¬™¾ë—)[×ñMNb9…D ãšU†ñˆêJÑ61S`ð%¨£‚$Š!ºnÈOð7i™žòµŽÊ_ ØÎî嚢>ö÷¹¯üY¸;æïG¨‘’œ_óó†¦ÓœEÉa†&YAh-ÑC í.¼¬j"ËP€Ô›îÙõ]Äe+xÌ÷˜žYŒÞC±€œwie¸KB„_€¢%BÂRqA¾›ªŽßß_öÙqKräe•qÛ° ¯ÿjE;f!i…õÌÔSƒ*2È«¸—RŒ!µU†Hòx‰G­œXcõ„ô ƒOì«,"‰Q(¨êN­õC,ûsÜ9ßUÿÛ¯ïóþ_»9·;Q'}ƒ‡æ_ÒŸ‡ óQÖÔÒ Tr§‚f*ÍD,©æ‰!ÔYÎÒ˜OñGè'X=¯EC^ë•kÖ=ÊÑs¢wB[.ØU·x¿ÜžU¦E™5¼èÝæ//ÇïöÎ~ÊÏîËô×t7”_ö~ïø}ɯǯêýÕöq;9yRêx r9V¶Q?vUmØ ¾œtD!L£Ò[¼}ûÃâz{ã«_}røYp,þþåÿý¶æGðéèåîs“S4WÊ»ö6˳}3ö;w{¤ÇÓ|çðæU[çÁs”›R,ëv,ö§£ÔKIjAÌÐ#Ì€†/ ìÒûçÌö?ä°ïj«ûý¥'8Â+a½‹äðä©@=Ï2Ð#Áz/Xùð[¹äI>5q©òmõˉ£aŸÞî€m>žO¯÷ÃYí1ˆ‚IÕ^‹T 3šïľŒdKƒö´œ˜ÛiP&¡|Re`@Œ^ds -Kh,dgˆçþŸ¥=?:•C§D‚}­Y9b²RˆØN©÷Œ¡”=¿ 1ŒM4ñ72²x¿ëT}—.3íÙÿNØðÅ*¼dð/¢G³ÝB½­k´ZÑÆ>îN0Æ :þžrg-X¤eèl×4ëéeÛvÒ&­†ž¿*å÷˜Í·¾˜ á ú¹hxOÉö•&ï)«ºKIpÓÊ-7!8g,Ð6v["ù†Ì„Ñê» 5*À”5®YëIÝšúî¤_N®„j)¦í¸Î4 {!í ðÇÀæ:1¸¬ã$3nu#:ÛÉ Ò@kK4ÞE,aœž©OŽPLR‰.qѬ…¬˜v OäÁÅÉšæ¤H‚—í‚ШL$Jq³Êûw™×ý»Û_¿îÓålL)ë»ì¾ ùöüå`/$a'…Ê{sÈùظøÎ~Ÿ{ó>ëËæàÅììëö¿§°­Ô÷v_ñú2y$¨º~…œ±¡¢½¶­Þ<—´>v^fžá8}IézÚãxÕèëiO¹_Ì9ã'ÑËùщùÚ6~:Y?Úsîϯl[øLn¸_”ÇJµ oæ7óËì ¿®ó~'øêuŒò¹?ݹÉ–ÞÈÐ €ŠÊÈ( (&òX]Æ­v”Î4„Ôæ™Ľ¿Ïÿ³ÞÐÎÒé í¹xó#î šKrôäMÅ´d£lTBRÌbVºAIà`A&yÄõóç¹³yl§‡V6LÔœÝUUÈkžˆ ¦Lr¶lîlÊ‹Pi×— Q“¶W¶R7Ùia»Š­Öæ"F’‹ÿ¡™Ngwý…üÄaÛx™¾úwŒt6¶€n£”AZ“ÏýgÏ7ëÖÝéåü`fÿ¾ãò²÷V²(MW¾Ãùúƒ}üãÂÛ`É!©© $àŒ¤'#(RfÍ òÀ÷×/òýÉþûÛûxæyÞ¬ E  0ÄÕ“‰h€DFAFcu› fˆ”51:ôtn:#VJ †ËéX†ì´ØÁµü€SÚû€1âq“}¬í„ÞpróìæQŒ5n£ìÒ°:#HŠÒ´²i’4¼‰hp:¦© Sü` ˆ`® 2E'Vã ¡}]d2¦F4²±BæŽ@Z¥!A¢H‚@C… B‰óÄY±ÕIo ‹£° @ÒÃxæY‡–BØÃœ¡¸¢lè Ñ»Ä?”9S*›ÃËÕP ·Æ¶kIOñÓcìøH”h’˜ÀZK?u+ŽáÇô#aV Eæ™'?µ<ä™êDQm×[·UÍ~ÉÿuʋŽ|ñ$@ T!j ˜Ð°F·ž_¿ý¥~{ÓHÇk‹SsZoßÿý×̬J‰gN7Γ¥âÉ›¿Î8\Í_h™EÂx^;±xzƒA9o×ÐDËÐCF¢0 tÝ‚‰Zqñm{d¥«3@JÁ®ÎØ'†c"81ë¼nïP0ÿˆYoØž!§"DÜ-Ü«ôsR¿ƒ”ß/¼?4~«žþtl.ø†õƒ²2ÍA|ÄøHÍ!Ý;z¶…AÞó›Ú¾´ÿög ™‚Ú"° €€@<¨Æ‹o:Câüä€äaf°>„¶ÀwRn:5Çw±µ°N­ÀhQzÓhœ·Hòý—ú"æ¦ÖdHHÌ0S ¡m†—º•ŽKcûíÙnï“Õ”ÓQY½x(‹„hÄåœç‡¾ÕéQþèþñ|®!WùË+¾ö@ªrý2Ÿ_êÓK½–µI9){®G <\Yô\‡)‚Šè" ’©fåXƒ’Q3»Ê##¨À%V^‹í»¯Ÿ¿ëõÒèð™6¹Ë1ƒO¹Þ,çvª[sû«|(»úbL¶d‰e¤gqS'Ü4ç¸x¬¿NÜÉÚn µBº%ðù’q­½ëi³Uïv¬޼#žð͆DH e”£l¹!]·‡$Uã)B„-ÛeÐ¶Îø´Ü³Ï—“û|ŒÏõ„¡ÛJ”ù÷5xXzº=ky#*'"Ö^Ì)‰ «qc|'çg0šQ“v†¤0b2Ó=r'±xÀfke¸Ä`%ÚªÌÕnYÇ“f7µêÌ4dÚjFço¿¨ï_vTóÞ8&¸0V %_×ø¹JÚb_]½Uoís=JÛ+y;5øéí»j^cúÁIÝ1O©[×Õ ¬tÕn¶{%hnŸèUY2HP›òNM,€ ”Öº°ŽÞ6M‡Â1Y 1ñû̃APo§èHMzoœ`ÁÚöVá^I_[{îç˜,ù„‚²,*FáÄ›yfÚ´øÖù¹Ež._”huٵݜi„PDÎ9œö†Ig "ååËC–[í8áLùêÊ~˜"$åeéÎßêVWÕþlçvŸo¹ô+^ôÏÚ¥iaU¦6ìÚ‰ÓÒBy˜åÔÄ8C&’¨¨n#ü©®H4ìÄe†u‰³Uà„{[óvà¿G±G‘e£õjsrýzr¤ ¹mc‹Ô¶ñµ Éçý¿ÒàRÜ™îÞ{¯ùq9—‰‡•³ïxbIF¨¥‰CqFg­>ò13Åt‹®¬üMµ?5¾•@›¶gLm¾”f©ù8ÌUýLpcÑÇ“|žÃ{ñõ m—ý5-Š‹Üº_¯<‰ Iä4u‘ÔF±Z$¥,?Š?¬Ì°N©³ ‘smÞ«XHû{Ôs²GW«Ä«f¢Oü%9Õe8H?d¡”ØÀŒ"½BÀŽÐF] ³Vš²¬.©ª ÄÌ ÐG\Ñq&X§|Uf,V´2IéAk4„W`G–¼ÒKÅŠ>ER÷œ—÷6îgÉÞeE]ÌwJÀ šf>}ÿL×Xæ…ïø·l:&ÝtÆC“0]¡”Á¤v‘P@º÷Yä³àÙvº¸µÕ€HDÔæ®è,hÉ£4ãG)áq¾´Q¥ ¢À˺=çɧ= €0k’Øs`Z}v7Ž`¨lA´‹ 9›åNSI¡e sRM$RPõ%}Ê/éÅÀRš{Ô]ó;ÈpŠE§¡õ@~çˆt+1Ê4ÒÁ;ˆ0m5<„E³x™÷;$AX¥±⛆U¥D.úcÈD‰á€9ÝÏhž³4pàÁ!J@ Æ: ¼WP‡‚PpÐ,þaZ® È2A´´åˆ"à™Ž( oºN±h°Å´nêAÍ‘uB^¤ ßs¼ÏÝ ï¡å³÷ [ s|ùy†´hTÑ騬ÙK2˜2RÁ´;²ØMú-¹òptÁdg—oºoz©Ÿÿ‹ŸœÌñE¾äJÈ‹·Dunz4Öhoä"éA·Ò¢³)ÚƒæO7G”ŽfRYdcÏ4{Î&}Y©îÌzý®UbÁmC½´×Ï·—x½¶YAß7#Ôndßǽ=¯ôü‹yÿÉž¯ø…Òe bá Ø £Ò +4}›Ó7ìK"q ¹Àf^‚cœD’!%߯z3* NÑ&dc˜Èè¢?Ã'0ÄSÂKa63…’µ•¬!@[ dÐFW~f ³æ¢™zñŸmîWç©¶ÜûIÞñqxZÑ€IÅ“û—½x`3=‹Ö·½ŸÑпY³Ñ­ˆ¾f°1pþîýú¸sóû·qøBa ŽÄ¸OÃÄö—érpÎŽ1ØY|’›ͬÅxóþçÅ_ÿ~z>‘#H&gœðœßô~^ùP|Ó_îÊÎcþz~tßA#ÝR¼7¹¿ÉWÆØ•ej–ÞŃüþr_ôo@õ \ÌpödÏüñŸ¿ÿ×ÏOüå9gî´änR¹”;*NôltG ÌÂR?œ™f:îçÏ~ù§ôóÏÁC> Õ¨v99´çZzþl«¿¤@™òÇÁš)l"E&}Žc•òÇ`M¤¡ö5óЏÿ”Ôƒ~œ…§2)!Z•î°˜‚D9Á‘`Z4ŒQXüSÚ¸¯°¤%Ó²E¯£ycsொxÒLµ.ƒ¦0sµ_=Ì}Üj†«;L)ámb» âYXï,V ·:Ë­:‚v?@JP\©ü2š«]¬£§Á–%©|ÌÄÂaÇ舴m‰µW`›d—7 2æ“bÏE?ßZå#«Ä[Í=?g6÷3öŸo{Œîœõƒ ¯áðÙ¤ÑNº¡#òD–;CM~¯ÑŠ%$ÇöËÌÉBåÝu=;»&ÌÜ«è®[”ŽuâîЋ²—ýæ(+ת¶·»=Üψ] ±ß’}rþû/_æÍêM&o 8iÜð[Á½ÃúFÔ*k\’éõ ªè¬è¤¥Î'ò%cû¿øñË—æ’oÙõ©õf‰Ò@CT¡¼Gp°†²œS`¾;÷Ú¥Þ̆¥—T¹EF˜ñçìîZ! ç™ì%±.ç<ëé–Amž5‘LäÑ•vN¢Ïtñ•¯X¦,!Y*Vâ¡©—¼ì–ÎB µÃQ„ˆÙºMæj.¡¶Šu[8Ô`)æ´v‚¿ÁBÿzÓ1¡{KüDÎ}=ß…^¿[‘Õ˜L¯v/³<ù|Ï#ºiîîi3ßKÎæÙæÙöçˆÝûb}-ö÷çóWÔ£s.ùE“Ù÷gûìo[`ÌÞYº²Çò>5‘3Ç;¡3P¯A“ÞŒ_¿Wõ•¿–ÙÇÏÎðéÎÑûÕ‡|JÎ6¢Ò‡~ ,u¤5®âæÓ¸Ûf;¼g1ÂøÊGÿ[w|÷|ýßJ-P*à ‚TÕG…Öt¨Bˆ‡¦NªcR.bÉ <ŽßÏ×åŸæ—§ã.$°¸Þ Χå½r·˜•/QEبdM#ƬÙÁoˆAWHsŠ\©¢Ä©Öäa¤UaçwþB>ÅIr5ÕêlêTŸ ðÀø+ ©˜j¬ØµõÆ Í¹Í\WR(è~ ê¬D ©›¬±¡©x¢ad†‹1U†—m6HF!l ·Ç'ê‚lÝÒvZ¼IYÌÚqyÚ<¶ýžEå¯}O~¼Îß‹ê:ŒâZEǯf wÈç§dçå{þò§·Ë£fàH©'c"Á°u2 ‚¦V¿˜b1ˆÞšrßÏê}üß—¢yð9R (V­€`f„C)¦ h$µ Q‹ íFDëЌΕÆsc5Ò$u{9Q¦S‰Ï–,¾ÝåUIkHp@Síà|ªtÜ(>è…&UTóa‘ˆÌ 16±Y .&€P@­¿ „ÍÿB¾h’Kd9ÞÆ­hä`PWŸ­«n色‘‚»ˆp ÈF¶#—ÊÚý4夌óó{WÁwo~ èlƒ‰¾©^ýÓÕÛzí7‰Ô' `™D‰v•¯ÁªÑ/Þ†·ËŸ X4áV[ÿf=ò•CµóÛž•§þŒ`R*0ÄêßxÜ\'qˆêlCî²[/¸ É¥)&gçn!À³>åãêç>¼‡&-2   Šú}þ]Ÿ†~ù¥ã˜yÿêB.ãó* 6…‡Z”ß,  ðé?å¸ÜÙPüÒØ¯0ɹ&—·cBp3/‡D£§Û•ƒáC¯˜F P6 ËÖföF©42Ž÷bÏÝ™/ Ú„{|¤’4Lz;ÄtEB`&HÉ“ýó«cõ¼Ù®ÅÈÏãCSu°fçºÜ¬› Qc„¼i¨¸­zÜÑjÇ>qýs!Öñùýò\W”ËߎçËçs¢Tš U¨1!=^Ðs¼Í ª•BeÃ5Ê®nM@Œ ˆA‡}ß°Õ5#£ÍËðÏ©.êzóÐän©Í‹À}•1˜?»¹Ö㦀^‘]£Å'ï¬ÐZÍ “¯n!íëìÓí"ü„§Æ-aºËöÞ¾ÔøGÏ·ÐúM´v~%¾ÿá6`œü®—ua‚åÕæÝ.èm2/C4lmE«²]ô4ͳKÈ£A‡墘ªTˆ½t0°9-ã<,†N’*‹íÅKL¢–4gYŒ}Ž·Ÿ»Û­ô±ˆá¼=þ4n7t¹cUòâ—xÉ©nì òhý®»õˆÙ½ð‰½´—vf6Ö»3îÝóß+ýœgÛét l©a¡(’ÉŒj?E¨¦Idge-ßVR Šníøósüü«™7óˆž;@Eß¼þßâµüþWcÂÓÙQ¶/l!¯Ï$ 1<@D¨ù´<{j–³Ñ™ËkÜHKPØYÜÔ¡«`Ó0¥tOdtÀUª ö‚Ѱ¸UGõˆW q€í! ³¼lmYÏRª ÆÌLŠ[e´“ßËÚf]nù¨•…³Ï´»”3UÛñöòS[0y½|²÷ÌöÁm7¾ˆ¨§³øE~Íê_4åH 3ðHKÊb«d~Pl“"<´÷ø=>¬W!cŠ¼Ì¢AŽ:ÌIø=y줇•'Üs» RÕ(µöµ\ºe¿c ”%¸ –FÆÝÏORÉ•UdªI±´@RæÌJZ†:E˜ªÐÌî´ OÃF4ƒ˧˜ŽŽÒ¤Ÿ§ž'°iÀ–V<2Žûâw±'øuõ<üäù¬ÛÃý!¢ë'Ãî¶‹³s1ç1"RÍ<}ß ˜ÆÙ8Qà»j³ØÛÊÐŒãöô²ik5«©&kÜ™kB ØÊ€6¨ƒ°Ç.nAºšçÛ\ÏB—Èaa QÑç“Ýæó®ÞS¨äV§ô*P‚§ŒU@\јâ5tY¯»*H‡Ë\ypÜ®šQ_‚¢º#q¬³v3¥XNWæ¥i¾i,€#q;Y¹Âæ ode-+ á8ç€ÎHñ7BêÑå}é3 jðíû=ƒŽäöå•ÕêÛ¹Ò„% bˆäçü áò{d‡žíeÒE%|P/Ç*5Uê¶pv˜˜ »J¥–K¦€¨¶HŠ…m§ñ „©ZËŠÁ>dMWjÌ¢íéጠ»§¶°`ZU«>åï-ÊH‰ˆÅuEÙ‘E²ÜÁ:(T4ભ9³_#È7ãS²Ð—ð‡°Et$¿iy:¿Çóë¾ö¬ÏG0îçÁ¡¹<Õ‡\Z뫊ð" z¬‚ÁÌÓMü Õ‚•lcÊ "3ˆÌlâ5ŽDáI@Õ7î%£ÙÊŒó‰u˪T$öD&£ÂÌH§û„i”Ü@'IÔã«+¶Û¡jŽ˜øM_±PJ€¥ ]ÁG ¥úàø}·¡$Î; 㟠§ì«ïå?‡*~i$[þêHd8§åÞPÓ*åd¤Z{RÿÖŠœu!i $ò–~j’­.‡«8=Á>à<#9DC*˜aНSJi9ƒ‘¶!jYXœƒP=PÔlp¥1B ôiåwÁé/‡Ÿƒ–쨇yP] 2WpŠïרóá—Ïö/ïxO5„¤ì è’wîö!&š0¦¨LcüI&Y–¸äÒc€‰ßŠãø˜ØŸØŽat4\¶›—GÊhá‹¢¤w—[ù1O¡OËÍI2Œ\Öùû½òö Šon¾ãid ;ƒ¹,è4ˆkÑE´1†2h–3^Wþ`æûeç8é¼ WÉùÉe|\&:L—I“«ïcÁ*ŲŸ4å§Ô¾™^[¿|¯?ÌëÛf¶Ÿ½‘ŠQ  CWµÝ¯xÍ›oy8rHÞUoYÏù–|†?‚h€A“¡!´QÊØœÍ)œå棹¿ÙÉaa4Ú m”NIê™!­¶HÒñ›é´qÌ©$ã±×>Xxñ@0†€ 8MmŽâŽl‚Ƭ4"3+[tãq§ïX>vÿœç~‡cë3L®·¸˜™´µÇqfÔ³$“Ø6gº%7¨ªùØÇ«O¤½¹óiìIÆû­Œµ–R„:?ª‘cÎ(`&M§l¸Ê˜VO¦HR̼?ÿsy'ùÙ~ŠOJPGp€j5¥)8©"Yx^ÒÐÞ”[™ŒIº8º>i¼žƒ·Z:¹*¿ÞüËî{2'~sÒ\ÂÔ(ªyº¥Ë¿ü¾ïû¯™¿Ö·ÿ ï³”0SºDC(—hÎD“HƒJ$¡šW\ÛfŒçKÿA}üˆ×oOýo»ñûÿÏ=ÿ\ÿžþlðkNê›]æÇ¿*>+ÚK#yì¯D™3ËÎì˜]ÿqVËGLN^ïJ?¯ïË6´Î{3ꥄЛn«4Õd  …“§Íç^Ì´ÅöâPp ©Y™-Ë”XÃ:û©ž­ý~¬O®+‰ƒHªu0¬â»&-ó7Í·ÖŠ%­ÞV†JWM7å@ ZSG‚ÑnÚ=Å4[ 3]§Ä(mÑf•zÅu/QûܧdxFŸ1%¦í‹ò2ÚEÑp¤{½óù=Ȭ^®|~@Œ¦¦ß½{˜½ÊÞÈ2Vä%ÏÑ~›y>®žjG}üÁù¢žã¥ç³â)ûUh!¢‘2SpiWB6¥Èg}*ö²†‚ÒŠ”èºÎ®¢PTîʇj¸#-$–ýöa–exÏà’\ vϾŸÏŸðs¯ß÷ýç€Ò%e¶’CX(µî[ÓÒ„=àÒ (ІvÀ¶v•yä©¿\ŸØ×~wB:IÅ¡ÂѼˆ +ЮRz…gÈBZ@µ|_¯lÅjœŠA8Ãs‡§Í´Y%¿•K¾ ;£­d«QßM‚©Æ ‚»’g¬¥…‘?Ê6CÜì:k©yee¸©ÞDqmˆ¢ggù@ACÉò(é 6ÊÈÖÖÆcCŒ©ÉÌ^å¯7û}¿Ÿ _wkÎñ7q^;OçYüòÅ¿{6I¢«ºa\¬Ü"X­üñÇìSî|š^ÌSÕÚüÝf=¾³ÞöjÜö㜗SæœñùÄO™OíǽnFk•sfúËdÙl¬³Íùsà—ôë=¼ª-v›hsÖlЬÎ:‚³k`•»§æJ¡TfT‡YfÛ:O^À¾PffËìú7ïÛ'X˜k_\ÄÒÀäÝ‘®’ˆÅÅ GZº¢àgF¦F%Fº}ê0¥ã¾ öõ;ÆÅ>ž”v»c‚‘Yÿœé†ñ FJ]ÚÅ€"‹Ù¿Uÿ)ìŸ d7z#°SÐÑßÌóV_‡ `ƒçU93Õ@mNÉ+š\Œ Hv"ƒÈhRM©fííÐ ³ô.hƒ Ø” É™émÉJì@7•èÊ„  3‹iõà³õdÚi¥uMØ÷FûîÒVdì%`ÂÃÜB»vAD³¥ÍVË7;i6ß«a®«ô§$þí°³©iäBg|ŸÿÇ뻆N¼È™œà´¤¿I&t!QÈ@0ªö?Ï?ÎÏbàw€Âø…ûc!]Â-¡¤@*‡‚W‰T®š)ÔDÃMgY¡X•!’ñGþrΨPÚ2QÔ7NËÀ 9¾â£že1#æ&Q ª 6Ú4 H1(f P0p@ Pþt¢ù§£Ì&¨ 0PfЀ>™BPvGµBP,kȽUm…‰£%ESd†\„‘42(±zºÇ‚_ÿàþÖ2š[G©9)½[ 6=z:…m+IÉ”R cš¯~˜ª©—DðsCÛ§ù¡&èLýMÔýI`Ø‹o¹Ü›~’¨B4I•¬^5vl麦1wQpkñÌnÜ;Û ©I³{ߤæG[×ÝÛ?\y!@‘`dÃgëø•î™sãǽßlVìnììÈi}|aªçTV½Ñˆ5’gº4‘U¬À?J ‹R, "jöÑÙ‡Rùòü`mˆÏ9ßÃgù'ß}÷Sººê#±ßM ñùiØþùž3æÄÎÃN¬^Ͱv"¬›S¥Šbi1·Ý{1+á…w@Ù™jmŠÉTÜÝM„bŽŸ¨|IÖ ·„ŽcšÙ´“!0ߪ«=” Ù¼š~¬5Ò¸¬}n­guéé³åû•óñ%e©)t˜BôÍpTÚé)í“J7]smºŠÚ&|øó}€jrü ·':¿†g#ý5¨¯‰]½ÊüáùîIzÀ™¥Æ7hªM5í4$Û÷ÒáÐ#sfÆ$Ý„MqNˆ ÁEe“@ “Dñ¶E›úLÒ|aÅ70ëXèÂ¥Û|;&ÂÕ1#ö›ïi¾RÖr¹úa\³?ýwcÎÈ AÂØoöî¼Pƒ¹ò¶ÜÝñ&ìvN7ƒ#K›ž®$PÓKd ³Ýq™Ï?r­¬£>£}Hçêñ•} þå¿ç|ÿñdßPÊÑ'*¼«áͯÿü‡÷co`¡‘Xëu·–™›µ ‡–½ŠÚ…ž‘TY¨åsï|]jÀ½ÒxGòzn¼(¼Æ"Nú¨4Â¥?à†Zã6d)h *=5êÞ"V]WìÅ­‰Â(WKWT†Ï%C²Ä×~¾LEêkâ¾Xe©jô*è²…X\›~ÐsØsŠöóùÇŒ5lø3Û‹ÕÂÙ5ÎöY`Wòx‘;ÖÙÞÙm–EœÂ#Ã:ž¾Ígœ’eNð Êúx'[Wˆï"+°r;°9Ûlì“WµRÞ€Ýá·Ï+»q(y (¥Ä–˜±;®•ÒJº¾–õªéÚÕE¥g"óPlxÒÜ”qc°53Ò ²*Ã0:‡…¨§j)ª0èÝͳú–8Þ éµ}:TÖø^_ìší$¨\þË…å8œ™i?h?J³•ëfÔƒ8¾Î|ݟㄉ; ‡e]²½­î9#ˆÊ«,NÓ$7ÑÓ¬eI6¾¢:4R®ª½t‹} ji¡C’9­ÊqjK@‡X )ù&¯£Úº÷7÷·„Ÿ²ÿn-š‹p¶וèÇèNdb±Ü¨ÊBbí>>5’½8kS÷|tÏ.Å:ªµEQ¸,daB FäB}Ù3 ¢€‚aõ–Ü¥´ÍÖÍ6vW ·Å=­«ì†l†Æ n–þö {¨"=Õ’¡Ã Û˜,ÌUoÌŠ@RŒö£û7Û££H¬ôÖ®„s‘­tÙ¬™%Ç÷Q!B0îâ«E[¼…}Öø²õô]§U»èVvSÊÜÑJíÌA I¹ ‹pš’ùÁ¿C/ñYà>%Ä© ¥[šâs«<Á6Rç匲ü3‡·fïů©]¸o\±p6‡9P Žî<:/åÊ–6áwÈÛ‰û˜Xþkþý:I¦W¸>™u¦ßŠ„jÖ9§ýÐé23Oq„0 gª«¤àíe"`2~Â3?/œó[þÆ9ÄiZÜ=£GÝ ÙÚÒÌ<ýÂêeÛ½®«ªÀ‹‘ ½fñ+‘ó¼©C®•;H&9Ä:"ÎâÄh{iÙê`äÌ6Ž4žö\8 Å4‰Û)É,ý¤¤½àKžàkŸ%9u7¼ÞÇ/]Âì›NüvÄàT8\)¢RЭ8¹AöcèZ e !o !w¨Ó@)¨øðºÎ(ŒŸžb:ö,n°9 ŽÌ™ŒóX‹»9±#PÀR2cD' %2¨A³æK±AKt! K.=Ý|Ðk+ú½»|ß²ë[cÇ–·­©_Ætû}dDf÷*±û䃜û/˜fž Ç|`)ÆöTÐGÎ’Í`ž~´An>~¬¬ô¶g­ ·QQÿ)ûo”þ¾Sab¢Û¦!¸©8í?ÄŒxž~æÜHmlÛŽ‹-¥Tf`Ñb?q_°‡û6ùrÞ+ß™G÷T/³8kÃ;e‡v{mÊleôµ3xÉ€‚ „…`t"„H,)¨ÒÚ AC”õ1)ÏrÕºû–ŽD—GI¨<Û¯Ù‘ûš½ï6ÁLO<”@àçÑß×8H7 „û§âÍÈ‘alªE¸%`Ció‘S:-Å®Œ¡ñΰaO(Ô´Rô’ŽΕ¬çÞg¼§å÷©N E‰Ëä+i|‡(Ù~¾›­r–yëi,•2.âL÷ŒùwGÖ½œ6ûÔŽ"-Óñlý2=ç«ýç o—ã™ÆWÑÇp~¶»Ù =&X½~\(´¬Û.ý÷½?‚û„ë²™sÎîðý ÷ër?:=žë>×ðX=Nœƒm½ÐkZ:LèÜiÇ‹¬çNÝýV¨¿íΧ÷õ›¾t$i *_Œ4.ñ”Üâc<ï›]z0·Û×¾~숩çk°ÎÂÇè`!*¢5¬YAÕꀉX\ÚÍÖ±…`Zö{:ÎßÖýŸïÑÞ¡;çGeÉÐ{]ùú##z4ò‘P‰I(‘  "¤u”¿å B|A"c¸ª·ªõcŽ @,ôŠk6Sç>pLAeee‹WH 8®4*¥D§€=ØÐíà¶Ú‰¹|—·„âÏ¢Ã{&à>,ôbÖš­%3FÆ'òPcÛVB%›Ñ4g`l-Uiã`ÈÇVôÔ¥”v.T< ¬n“â²Ò­ñÐs­~¯¯º½ék1¤ºñ·†@É!%ò€cöë«æŒ¢6ñÒ’pö&PDù;Œ&j4šHø“BŸ €?&”+i¥Zº6AsB¨¨H(P !ÇÇ1 FªÑ*É¥%ÔªLõí ÑíJG„}:AÖØÕ=îê ]Be:—o€j¹8Œf€ à 2°`6L³”P1ð€ò§]¯5TbFW´ò@ƒ]Õ˜Æ3Ti#IRIÌ ƒC˜d&"ŽDad!Š|DP`¶K{ZÒŸ \™ÏÏù0YQØËZìâ 0½£ÔbsàÅR3 @dõ!ìôíø‘>†àIM:áØŠü€ÿ ý³È8¶ÜŽ .¹‰Åù–О ­Éô[³ *w yèÝ"JÓ2X=Ò+¨sMÇIvËËž\³|¶ý ~ÌD&*ÉßÏîëÇ…ß¹ÿÕÙLœqùrYg·p7×=zŠ´]n¢0KÑSÁY³G¼ ¹þW﫬}N ô÷;Ⱥ&Þ±5f1¢¢‰®󧚯ܪ©¢ gJX§+ÒT¿=)Ḣ@ìmë[±À0…¬A ~;ì[X‘­Ž $±•òGõøDo4~³–w*oFà¤è~•ÑSVýFÝÅgþsoG_¿{xúÔâ\ñÇ!™Q-™÷í7üåòüÙ±cÁ/­ÿÏßö»²¾?\ã}²IÜ–÷°%¤ Lˆ2`<T!S˯ˆéŠbÛ0ÁqXn;öptØ9 º«×‹lO#^>Þ¿ûëúé§Ë¡âDQ4P¿F¸êú«{\N}U]€#áÇ€”Má¬CÅÐC™ÒMç=Å粆çô}ÔÏõˆ¤ža—ŸÓå×_òüH¨( hgdûv¾MxxTØD/ÐS£~™jÔÝîÏvÂ×c@wFbº–Z\`%‰“)K†«EZYsÙ÷}ÈÁ ¾ káöåå^Á\ƒ7 Hi<:З{Íx=N/;wÒ6õЇ¡°0Þs¿ð{WY ¼{ö¸|ú&ב‹Z 'ßÊ‚³y3èÊyfs¢ ¤€½5…Q a¹çƒèmë'¿xõë¯óÑÎÿü?ðß_Ïû‰]ÿž×n^ßcí›ænðù×ßÿöçýo?¯]ûûsŸV×VŸY1`¥âÔu_¼7iÈõÃDªšû§žïÏeýúËÂ{òÙ/£â6kÛífv”}m³È6Q A49vNän7™Ã~¬u-{kÒÉÇ¢z°--c£Ú†ïúê;ý·O!XÔe]ŽF†å9ç‘Iè@Ø"{ !®6…ýaõïÆ¬ÆÅ×Ãâ<´Ù¶Ó3GÎÇã2f$/rëЃ~eéÒ—tGAŽÈT7õåaUW²¤r z·8èlaÓã¥ô/L‰èÉš)ôöq‹ŽÀÅÈU ciLÖöýýsµFÒWQ½--‚ °„DB“,V)¢H@uΦ‚tc,B#3âôìÕ+ YU½[3›ŽÇ K´?ÜþäU%Ýæ_ðí Ü:pBdñç}ÍóZv" íÏ÷ÃÏ/¯ŽýpÚU·PO]ÎÖè X·ûS»¨}²¥}˺h7Öî`ÆÝº¬TÅÖݲù‚'sí ÝâRû@5Üq·Úrn†™üP/VRÊLN«Ë¦“Ò¾ÛÍË4}ÒSòƒzݬÛOs'À°R¹ž½­V{틤QŽ´J“â„`„¢¶ŠÃaK¦Jh[ÖQíÝ ù·$$aD7óêF¼ò—ãRØ >?‘¿Ì¯²þÒ9äNŽÑõÖÞëã,a‚Ô¡S´Š²‰M † ,¶ÏÁŠÃ>ñ-cHkdå×Ö’%ZÂq³#:¶Y&ñú¶Üû1\Ço^*ð›ôÙB‚ÅGìnÇ£ëWûÄÐ1ºN3*AcëÆŸ n>7jJ*AdÐ À^Ð<òREéŠVT"2wTù©À»õKXÇ ´™H‘sÒw>9âîvÕÒœýŸãûœnÒfZo úÆôt(p+õt=­ûß):–+&"Úya =—ïüõˆ<fè>ÒÊH¡@Û‚¹[×E‘ž±>ÎŽ·mμ‡ Ýb¯åSŽÜKC ü•1qcY¾HTC/«<#”lÍ“þÁFÁB¶Æž@ª€Ci‹qÆS m foÂG´æp|¨¥JD©úü)ÂÀÑ,úðMú:f ü+éõ3ýÌÞøQ>Ë~²ûN}vM‘©›ô±Çù'¥.Û™-OŒíötÅwƒ3:¨ +ìo‚‘C@ @,D\]Ep±ù ð²¸›<çÝ ‰Ã‰0µÃˆCNP”÷ƒ}f“`¢ (rAX:$V£à©'´Bö<£þ&^›§½<|{i—«²§?Rè|OoºÝ6ÑÃ%P¯Ì¦(Ÿc9¤ï%Ÿ›zÚÖQ,”@PÔ–a‡‘mBÙ­.r,æãÞ(ë"u. ËK!Ð~wŽøœ¼ÑG¨©Öpz™§»^XüÈYFsÐXØÊ) 4O›Ÿ€";£ÏîpÊd4¥ÇzÌí”]@.ßZmBÎé*»4º.΂U)ac]Ã[ û,ïPÙ[^¯!yìY Q³¾kiïçU³|­kË.ÈJ>é sœ1Ç3Pððš@” 6¹”L]î@ÜB^Ç]·–öDÏ{ôš$8f€ö¤3ŠÒ^œž< ”4 KD½ªs¸ôߌÝ„«;Ñ‹=Å3%ö{»¢¼ìa¦9pÀÍŒ&–¥£ž7ó7ß^cRš‘ÈŠú²‚WòÅ3Ñ_šd¼Ìµ%a –»AV‘kÞèX†XüÇYù&ÝçÜÑ!ýBŸ«sÎ÷ùtƒ2ª`´C<–òRšŒb¶e‘±~²ðww¾ûžÚ¸Áæ„ÝÙøX­ÑoþÑÓÏÔü!kªy±'f<å sü&¿&5Ëê}¶÷¯gÏŠS¾üõ_.í‘›#ljq_Qÿ¨«Æ›°µÞ×0ñÓ¡ééXNmqö¢Yå¤qûɦO‘6¢Ýx¼&üó#×Ëð«:¯õÞ‘ Ì-ž—¼¿{yôæÿwøú»ÀמÎ÷±ÿùå«7ø $DI,ŠfH|û1|ùNGœŸä»GæЄ•ŸsüfkÚK®6`Õºж: å8y)êœÎ51õ;þ7XÁµ‚oª²­·£ j®×±ðyG¿‰þÞ²CÇ]RONÝydéˆlâ^gÿÁÔÄY‘¥¹^gІv,yDcdO­Go.‹V(=D WFeG¿¶A‘p_]Œä4e€Í lSÕÒIã 8G‹Wç<½¯{ûá\Üå 2$)©°ðdæá1ï‚§VNó|ŒÏ)È–ØXÑ!€‚j×9 _û5]û´‚C#‹O¾©lFþ~q°m~ÿºP~K­2|öoùúÞý¯:¶(Ûy£ç&(œ8)’né’$ 7·¢@|¢í¶Ä[–hgÛ‰®€)ýüR~.æßÏ¿†ý^u̲Ö$i$F5™Ïa?ÿxíxóàÔëQ:HÜ… ˜Kz4‘ò. !tˆ+¾'ìÉÕÚ°ü{ÓøDLèÂe w"Ï_û¼áö.Ã"Ýa†‡ØS¥í×™\[æNÛI!ó³msÒ·rXR\]ió[#kc™Éø†ÿX â,ZRÉó¬“('ùëÙ<‰úòDº{Zžá¯SúÓ–ã8mgÝ—é“íá<<¹—ïU¿ççôÂ[í [Ïí=z·ô¼J–9õUväŽiê¦}NÖýK¹)|š<¶6צy9ÓœOß3C¸¾³ó¡™Wcû:¥—1|š[óÉÊ0SU•È’%ß ¬p^¼30øI{Ä ïmÖg;z7÷ƒù¸÷óä7ßäù³\Ç´÷D¡$“1'¥,Šb‘@æ¦4“Lïoúïß6%iA)D•­4‚«¼¼–e¢£9b=™æd[WÒ]¤„·÷²`µ,]Æ —z·õî{»Š¸¸Ë(X:òžßÞ_p‰k\;Jm)œ&9¦·qu ØP©Ó™nåâ~JYà„è©׳n?&Ù3(ê[Þém±S(›vV³|«ãt 4éØCš1Ãçð%/æÙýüƒÿÎo]ƒM ¹3èð1’næd d°Ø¢Âú3Õ§M•W× ¤À Ò Š·qõC>$JQÔƒ:ÎÛª¾+IîØ2QÑ¡§*<$J…£êàY+&¢®w®žaÓu%ï©ëtJ"eÓu?ÌJƒœ“@€@€*dòÙÁ㮟`üIJ hdvEªHUyHf'Z¤ç@Všˆ"7ÀØÝÛb“\`¤çÀ:à i$E „Pq•/ƒy*˜fmFVÐ?ôê>¥HÏ+BŽÓÒ¥L• B-þl7¤‘e a#¥È2BD¥áð‹®égóå \J݃DB¸n¦~#ÏÚÛ_ j£ÀîjC\s´ÉÊÒQÌŒÚÊ™F3a}¸LŠíÜ–W5|HÖú†$…x Zòü~\iX¿r{ûµ=Ÿ(¨=›VQolèmëòãŽü‰x‹l‹î”{°GgàÈý„ѹº3ë¡xÇÃM{|Aó¼°Vätá ÀÖ¬p·c[$:Õ,;q5\=à”߯Ú~Ln1O”ž1î¹zë¹|åøÕ×XÿëÓûÀù‡3ßÇn^¶ïtJï5HЉLAÞ^tï³Þ½S!…W¡cDP­éØ:×'ƒPˆ+òÐ%ÃAÁ$…èàDÅGty».öI•ãºù®¾çÍX\[›¿ŽÎã¬åã’ž‰Ÿ_ž¹/ðZbKý¾švH?ÏÍ•Ç_ 6î ë×ìÌ&Y€˜®ª@ž_^ÿò6›oßÌù{õtûX矴8šc;ÌL µË1Ž]¥­‰Y¦kÝ]¦–häÓ ó¥?LàÜ7ltæ%<ñà:ÿ¸ºU,’v1‹†ñ´œ½-oÔOµ{øÎ¡,Ð[Ë3lN[µõX‘nv=›¥¦wyôoÉöé7‡ÇA‡¯déµ£;-jiíDÖŒñ(°uSÓSZä$„CÊ^­PîÄœ£íAá^äîÆkÏZÑŸ=dûç$_7ŒdÁ×}cbg=þBûèß_/çú‹óßÿΗ?¿ôò+>+Œt¹‰ZêàB}ñ *iÃG:¢ €ƒ°Á°–á•úpk[ܤDP… ±™spHÞ`ÝÈm"Œˆ‰¤C$’Cüb®ÝêâF¨œôªhCH„+L¶qÛer.2Ýȼ`2 z•×ê|Nÿ$)ñr‡ß,Áµ€±”Åp‘ˆ<‰%:>JÕ„¸=|-„8cÚïu£Î‡[“}¥é”¢ sœc¯(· hU;ÔÀ.cÒÒ¸ƒØÈw™±ª/Z„HÅrgøf¼KñtTµtfåTÅC¸ŠKÛBóC[}ƒù¥zŽóÝ‘F(²¢p˜‰{I)ß$¾1=¬9o„:IQÆòƒÌ3@r…gú‹_gHØD>%_ŽŒb(Àz;9ôh99‡Óžª$Þ\qá¶PwÈâ¤g¹Ãœ#/©=<ùføEñdh·Û5 ÁuÜ5é @œ$ÁDˆ9ÃÀô¿Î)oK}kæŸs‡Ķì]¾¦Ïì¹þÍo¿!Àˆ*æ(»|~|ÖO¿V}Ñõ‘bËÓ9© a°ZžÁ_’^ð‡¹gçø™Xp+=!À¦pŽK*èE(¹-¾s\ €÷ÅüÂ×–&ˆéK“Á›”ÝU óy”׎ªK‰{ô²y9ݵ(Ï祎Î÷žO—›__4ýó¯ûù9¼€Ñ»Ægº±×N !ï o6}ƒMåˆ®É °r Ìåªít¨BfŸ‘W°KÑQÐ zOìæ§ÇŒNž˜K(FbY¿Yà}sþ`URO'[Ù`°ÐQpÊ|¾|ïE½¬'|<Õ@ A¬©MÑfýyv P/Àì®BZgyÖ‡gõÜ­õò}ÏÓíǶ†äçJ„N_½¡Š®žr,+Þó‰O—¨NÐ/›hœºCöº—&epÑÛ1ç77ä[”˜ 4 _xZ-uÆYý|# Ä@rÖ_jš תÚüð>GØêÁ¸*kŸ>ó0¤?gD|‚ˆ¨-¬&D8à 28sÌ H‹ŽFêM2½£Ú%Î8o|f+ÜL(gFÛx(éÇ{P’æïüEï¿hÝó `X;¹Ö‹eá K‡‚Ë\Òv9’.ð$A4úëi ÌLx!C)PÆb;ˆ |4u–Ñ‹„”ž‰ä¢±U³¤ª¨f T†˜3äcÅOCÌO85›Uµâ7ƒkÇbWë4»ìé"Öò€ÆQCWšêÌdÕ±çßþƒ6_õç©;zæUòF›9ˆwyÛÞ7ŸôÏÊÿÌÿŒA/©’ÜrÃ*¡Ö¡4np MßÈš£>´\~~…ûwïóâû¥G¯Ïéëiô?Iv§çוû7ëÇuS9wù]Fþ!Í™} 9ïÏhÑ‹Ù~l&ýê­ýÑRéŠþ¦”ÑöäÖ¯Ôµ5ôˆ47¥"éâ<ŸÕL¼¦«‹ •j³xŪ½;þ½ ®oÓ]Ä?PÆXç /Ø4×cÍÏéuñƒšqe&Å(Gñ¨/¾ íë9Å¥âq•ë(ËÊÒ†,$'èô°Ðá'‹(ê"ð&È ˆD 8Ó§ƒÆ°±»37¦ZÏï ®ð{Àk€VJÁætQè”çmtoßêÂu-¹ÞdãÉ]^ÿ×_îµ!:ø-]!ÛAb5¦3IæAFš9±;Ž–.d²Åòá]SÁ¾âl!0ý6Ïõœ¯ïŸ¬ÛÖõèïíÛ¼§å$º›·ÒÁnÿvóñÙÆ°)7€dÎLlæìžfŽªEªSU#=‘†dܭ܊׀D Qò¦|Üñ”üYÈN_'¼…ÿ¬ ÔÜ’‚ Ì”£ôÆÞpi…N´3mtî½n£0¤te-ÝPèAH®K ê¡G¿ŒOÛ<’–ÏÙ9;§›Ž™y\ÑÆå”N®hÓî62#u½§h6óå<|ÿÕ'@òsŒý³¿÷ _w¡p×AÖµ½š¦6<±,Ý*WÃAÌȓߪY(i]6”Ó4í $bà§·ÞKoPÎs?ä¾dÛÓíwËïOû¥ü¬v(Ô86W÷ìüéýƒvz¶ý°¾md ê¼<"]%œÏ ‹äùµÞýÛØ¯ç¨ÖÚ³Ì=Ÿ¦Ýôá$g¾‚½bê\—‰ÂÈ:º[—§~N™ü€d%Øèl ¬³ä7WtŒõΙö¥Òvllÿº]ŽÅ^pOÞŸ¿qóƒïo_ò¿)¹õÞ³¹u)Lš*0LdeLœLyt˜ú[Þ¿m!``”ÙxbW£JÃéñh¤‘‡URë¡åoƒ d)lOtêkXÇ•£t3Ž:àn×Q!ýBý |únµÃG0PÐõ&.ŒÕSéŠ5¨B›9 ޱ%jË (ë]"6 f:ñhº¡z)¥CÆZšvj!9¸ÃtÑÑCM¸± ªùfŸç˜æÓÝŒ¤ÿÿ»𣿠|‘ÈTP çˆÁUîDL4¡¢z`ƒ§<@à„WQ#'!(˜.€,!@‚úÀ °£\ÏØœá.{†îÑ=*×câŒX«Z#…%]CѪžàI€€ó ‹t[bÊXRÝJ—¹åçF KZÓ €+€ .ßi^ÀûÏç+9 ¡Š@‰Â´Á ªÜU¦x¥I Aàk½¤Ì‰¨€Ð›[èÖ¶Î7vÑÁV¬Š@#A)dV¾ÑS) %à´îƵþíüÅÿŒ¬Þ‚Al4¤?†ë¤9¹),Äa3Ñ“«ÕƒO|>'ŽÕÔIb$“MÖù ?¥˜ únXÍOD,Ñ\±–@‰šgÐúeБ׼õUéÏå&¹sUÔëœIEž¾ÝC{Ìõ´my «YÃÎÃqñZ'›6YÌ çÆóéòõ]¿W<µÖO¸®ƒ¿‹~·FC9.ª'>@òEéÌMÚ“"t9 9”¬L75®ù0<ˆN¹î{¤ï¨È7Í»”j¸ÁÞÈ&èƒå*{‹‡Èíº {¾«åG;îF°‡8"¤ 0ÓÁ«šõ­l)Ô‡á]ãî‚ûuÓðÓó[çNË@äLà P‹œ/Ö•ßùäøxLéJŠ@z¡ÒÉí'Y›ëòÄ] ð_~ùÊÌ‚Ï2]Óq°·ùÀˆ”°–£¹]!»ÊÛÄüæT2 š€wkØŽnŸÓú€:`¿àÔ Ñ„P™‡Tû߬ëþÍåcþêàz›Mܾ0ëf=ŸÕ/Où÷õ|kù-ÿÓoƒÕ[ôWIO&æÓEá'hj¶Ëõ±Ûϰ‰1ž}?oþûÍÔ–ªý9ÂÔóëÿ¡ñ§ðný†&lh/ë×€ÂâÓçp@‹“¹ê¢ ±œ–måÁôt"n±ö±>¶6Í™kÙW¾ÄÏšcE*÷ íóZ¢UQ1 àP®6}®/ót²ZtvK¯Lku[7Vt$ØŸ™×À·Œ¸Æuá|—ÇxOzÏnä÷ãLï÷¾áö#-s63.´xŒ‘Yo8¨`¤L‘CÂÒ]—ÓÛ½­¿ùm”N³ÆjêÝ5vl@Äž¿Ó~ýúD¤žWï>;ÿñÑþ7ï·óß•Ÿÿáù‰¤ ©çÌ ¡êR€²Ô¨é&ÚÏø¨§.~ìqµÆÁsÝÿéâ_dzﯕ̹½»_ Vó÷Ö¥} Ã4VY„±#ï9;EÔ.®ÇÌË9~ÎÑýâL$¹K} ©m ·SYõ 5çk}œk¡ÏX„Y5©Ô9‹¶ù>8î§Hvþpp5«|e Ðv.Þö¢nk÷þýF·××À"нSª"N@QÚÅê²-‡2±»‡»ÕàÔ,„²jPï:îrrSÊV¾ LÁ…-ìGµ«»‹¤¥/8!E pI—Ï‘~rZ"†Pi‚UÐC4³dÄ…ÇÆv)ô6<&Î¥¼>-Cö\“1âÛEô‡öF§’ÄI´YŒ¦¬1Í™À{{œÅÛäṫÝ.·á0ƒõÑõi'‚ 0K.;mÓ(sÓãXÍÁÚ8ˆqA[¤²•G¢ßÑL鮺k!’ÒEG"½&kæà..¢ ÉwZE€vCá t7:cƒ,14©ò­¦J¶|<¢ Kaî˜c°bt¦Kxz0#âµ~ïÉóV?^g¤DíV35ÃÖSËküT|e(÷4˜Oüêþ”2(ÄwÜ!ÏTò>6pW[ãâÐOS´vŸ¡u5út¶7®É¯‚BTPu7½Fã†ZÉZo8‡QZª)w«°n¡P5(‚ItšÐU²¤Ko+Ry%kGØŠY6‡mc¢|´ƒa½ê¼Î:mO†g:âíDËá®îR4*ðŠ!GkÉJCÛpO ¿ž?9läýGÇ÷?wÜôÛPÎŒWÅ`]D8²`s§c:µ 9í‡ØˆÈB¸@cw(~#–¤SøZººŒ÷º3›P&bºŒñ@ßN{{9p9ê³lÆô›ÈI]èÒñýàÞ}!œ)1›ƒ±‘7½7Ÿÿ™f3)ã•\_2ò9úYÿùŽ@N=挅i˜L„Zç*¡(¿].‹ä|+o.ŽÌ ¥ðu+¸KTpɯ,èè$ƒ{²¸¡\'Ø3_\"ǤÀÂ\±©þý&,!?gž‘2L4ïuðY &÷“‘_É% ¦ÝÜØ]cËü†<É;ßuxûçï«û9ûÛ å&ÞKæ´H·.aÍé/G4È7ùgDÓ˜µŠpÍhò„ræšlÖæW/¤$ƒ³Hj¢~á§—Ê 7ŽÄZtOœ„¥j PÒ± ‰zæ"9Žœ´›7¸ažëX1q…:‡#– Y ÷R #öå#j¹É¾îoO/?Ó•‹®=4¤çìô#¼(Õ[úæ-wª·BÉ ¦W¾;ñM2ÅuKÁ‚}1bÞ.ÙÏwvû”œ~˨FNIIc?ž‚—+ÎÄ–BIOÒTÇÀoÄo·6Ù’k2¾5^_ÖIÅj»ì«´û¸”­8“!z~-rÉêá:ÿ¯$PÊÑ(%YtöÖ\Gâ¶pT)rcUÖ¶÷GÑVMSK9ÔBõ°äx¨·¹áD!‚LÉ PÄŒTLXÿì|v~;P:\Ê·Ò3:é(Ã3´”±#-è?О+±_Ô î[/!ƒ VvNss‰ x’<Ç‚I ’MBhR˜3gôh?½G¿v?Oâyr€ÇDà'FrÁΉ¨…I³·Ê£‡#AâÙC $±ïûÖèý"‡µïZVœÅ„P…¥Þ›¶q„í1ü™î¬I­?ä ÙZp«ÛŒ NÔ#u,³æ@›Ø¸ç\³#–Ëî˜ôøÏÿuµßà͹Ȋ(IŽk‚‰áè

¿Ï› ·Ð¡ï µªsë¶b›ÜÜ»-øÃÝ˾)¾‡Ý)9ÀÍø zÿ]er¦#䦿ˆßþóºþþ«f˜Ÿßl/-³¬¼ëûÚÿzSø­þÿçGÿg÷ÿûÐo§ËËß¹`ó’%;" õà¥çè­sºí}ñ¬}þíF¿ÒQý+å™`}{õ=ò²õõ f„ dñŸÞìï‹Ç~W»»¤™…2BÁR0bÜ`¨ ×óâ1R‚lF`k0±Œ›?г ,™…âv§*"ÈEÌÜEîH»³be O Mš?°¦çõŠ›­s5»:ÈÖ¹é£t#×¢±ÃíÇ¢¹Ä!o“å1ë$r÷Vå¹öQ´l@S!n)xÑ]ó=œ¢ÙdL»"n«ó.ø9‹ Z£ÍX³*ÐYìoMƒIC#îH ¢dzþî8‚žQ ž|ܹ%3†\EçË5'bMµAÚ¤e¦šœm¬¡—;ƒŒH-l¬l˜?oZ¨9Òhé¶o÷¹E‹ùoýØþ㛞®æùôóùßÍüëâ²YÀ•(»Ê)J¬iá2¢©ˆ^ÄYì/|!‚+«‚"ï‚54ÙM‘ûixhO°eî T `CjGPÔïÁòйÁÓN(·ä–ØÎÞ®"‚ËŒEà ÍY&„!ÜLrèBþ™óQ_O}Ö6y7ç;\—YÒJ>aT,(~Doe˜×š‚ü³Ð–,€ä ;RéjIJÅÎSF|¥ 3a¨±lÕ–= ÎÍ´ß?ø‹q‹J¢„K¯˜u«ÇÃkÿ²ûóû}¦AýUÆ—©_Ž' °€¸/×xŠÅƒ¯L%°èy?ÙÇhïé{~z½ÙýNÔ_ª÷9¯IÏö×+ñ>º¶Æ£ƒ jè¶m½ÒO³ÿnÕ·áÿPñï>Çó[³q†¢ ¡Œc°2.¯w:ýzÞ²ýëëÞ/ónÇx?ÉÙùÇŸÏþé—ïîÒ›ªa¥}Œ’»úŒÀ׋Ôo_£îøûÍ÷cüîÛ’O,Ol–s9Öô纟‡€òuh¶ |õ¤¬ú\=3W. 9©¦—näÑC\³•5´L7˜¢ä±ô¯+:úÊ~|ÌÇG÷ü [狻闷OšóS@ŒRKl Äá.ŒeŽ¿¥ý+£0€0ZG¾z¢`_EÁÇøN¦44u™âñ1¶öì¹RÀð*`m‹F‹ûÒt[Ķlßëæb×7Iƒ›9Œ€Á¬°ÑP·v'pé+.ëÊ‘ò)Sk 5.³   {~Ì®ÀtQ§VHe-5ªqJ°€·†­½=í¢AÞ‹ r ÁMWSÇrâÿ÷ûíÇžpºÿÈxÉɈ¢#>*é/ÉR“2#]ôן±„¨A‰ÌHä@P€¸S§ ÊuÈ5{+Šö"¤WÒÊFBzAe¸GnË=•ŠˆãÚxäÔb;€Dî\‡ µ¤çˆ #÷OÍõ™lj”R40 À€ ˜\"²}Ý)ˆ %²~—?õüø°ë¦'ªÊ¦ ^F€k IZ5)¢£ŠR%P‚êMÛ ¥œbòzîõ ~m@u¬ ýùHç­€y©ìŒ+¸“Ö.YD‹¥µ«Ÿ‰„ ¤öë“¢Fw„ÖhŽX;&ä_Ö&À‰’0¬áê9,ÑÌ?£´ÏîÙâH=%`„+B$æ T*´´¦4iqÕX£&Xs®Ž‚;³¸¬BÕµ§Ò™uóAU¦ÄBW‘û’Óµä þì𔟀/Ì)äëú§ã{ݱ¢#?¿ýüÇ_^w-ÜZõÿôºþËýúí­çŸ\X=Ä–uw<[šÀ’£º`·ŠÁä¥Nv'ݪêÁ¸Ó¶Åæ+´w~Ÿð‡‚f@)mÎp¶x|º¹üÈå'ÝUÔJ)Ìøé%¥‹ÓƒÞ¥´r^÷*šºœ’&oƦ ópÊ·æ‚õ|EC »~ªnÖE}ø¾¦?P~ÖéS‚—>ÜûmÝÜëå!N~*(ëtëµ¼rÅrËÚ.ÎË$C¥ÐÎ'ßöÃjÃùU…OaáQ·vÉknÞ *èÊ4p.^Md‚šjÍÍ0-W†Ýj‚ùóu}B¤áˆ9Â>1ãsÀK_Ƽ§«sç i"Rž{n輟9î|âÇÖ/¸ùú;aýlû5ý³ãÅ<Ïþÿÿ8²Áb‘§¥B? ýtºæác ¯vjºRít޳èxöFûÜñ8×ô ;•º¤Å§ü8}bopD=ò¨±°pPEnéôRÍ 3æ0l!?ÛÓò\çæïüíàxë|{â·yßBXÛŠÞu!ŸÑb³ö (Æ Õ€¹$£è9µPÆ<÷í|åDÀ‘+OCGn´üæ¦VÕY•‹/©ukRÈGx£óÀ‘mI¢M® †ôÜ bbš;&1YzaÅÃcµ€T΀ÉIÁ(fkHR •(‰yŸdÍÑ:ðVöË…¶Ÿ'b’ïµ9~2žóT –Þc÷}ê¸ ~ÿÁMh6 î‚0\ à•ý%ƒeÔÓºkG„±,£¹K³7ÚzšöÍÃ:˜lnöA¹r¨@•fÌžCÈÖîÝ ¥ØrÉFN| j8saw¹"Ód¯a7îãÒš¢%¹2mðæV'ÞôDn<¨Ö« ´")MHÊ;ZÁ~§ÑRï…mçu1צö_ȧɥÂm¸Ùë«þÛÞþý°¨„nd‰d(ô!¾¡‹[ÙuPdõL&ÓCQ¹ j±…ݪA¢J@'«ƒ©÷)°–ôæe-»ÆMÁfJ7‘q$p¸2r£×ÄÇ|ß%Ö`1ù³ &¨Åæ´G7îvÖ-ï¦ Ü/§QÙAÖµ´6>ú à=$ í^óZç|=ÏÞöÀ¼s"-½(z᥿¾…€ÁÌaR„•<®ÎC<Øñªª¾†÷~l0šºýû´Í…–¦UögÉ9³Ïüvº5#:ê÷Ðûpž£oÉ—8TwlίØ` ݲY!ìm¹XX~«]†Τi=žÞ枌E1zc'êÔøú¦[.½xé³rʻ˼ײòGíépÆûz¶çï¾ W"XT·ä‰ DvJNJ ½žgÌÓŒ?Ų«®œÍnÇ“µ°Pñ}?W”‡Æu’cm¾˜ž€Óð.Û[cR!Û±C#~'8é/éa¯ä—àقʪ4?iÏδPÌØÿùÎ}>=?ñq¦`l%ýôsšÉŸ’ßrö£Êmê÷sÖOáI͉¾„jº§_fnÎØn^ìs‹H²·-ѽ‹Ð¹ç*¡)ºŽ-vÜm+¤H¦ËdÄZ äBVç¯÷®¹úÒ9úƒŒq³~4ßó–-€\ÜDË +›s§¹A’ÙW÷­½ñ=vOEz#MyÅ™a牬!¶‹çÌö¡ ½×L"{¡4oýžH©3Ë·ˆY$ÀYÓ`†ð ¡æs(=Ѽïqé¤â€_†Š^ꌌÃ@O[?!ƒ‰%[@!XŸ½K Åk ÊŠ t.ÿ,y¦NµgÇ¢šÝ|Ã^‘Ms!ÏÚ/sSÍâAÍU”ã›ûû­NÀÿ©žn6z{gz™UÇþ~°+ …Ì5–ÂeîtϨoê’ƒÜ&è¹Ð&Ý’‰­#Á¨¤@.s“5Ò Úƒ(IÏIHËBŸÀ_ç/ÇC„Øä*°µ`Ùð¡‚ÅØŸóÑÜ}ÁôWyæäz†%ïÍnmOó'ߢÛöJ=£)Üì_Â~÷WümlT Kgg/JŸ=çêËã ?ÈàlfÜ,¨ '&@‚}—_t~Fï©!™@-ÁRº:k¯xÇ¡ü6«çF7”ë¹g Hàú Û(¯ÙnwX³ìBƒd…ö3 ‹ºn¥Hc7Û[Ûtí,”‰+ùt¡~Æ,Q'—‚žT/÷–„vht%Vç2åÉ ¦÷£{€ólû†^püYñbMûì ¨ô$v¡Ÿõi|Ì´åCgDùò¸lðšYÀ+Àñ–s²Ê–uˆMë˜Ç\dÙ dŽ>Ó'q 58‘åbˆÃ"­¹V •(¡ ×þ*Ïd—ÞÚ—¶Øâ!Ш”Z}fˆ‡ís|‡ó/RZ>M+t†‚DÝœ½Šç}â}_þóüõÿþüŒÿŸ§Å R;Ô΀›*I¡âçyNwÊ”5L$÷°òb+‹{Uödc޶ #‡{H Ôù¨ì<>ûœt[ÅUBÒAï°¢&CWW ¬1/F[l"ÛuP¿œÄËÁAú4p„[ù=»žÞ³š›ø¾/aõ.éÎ ¼†EOEä¾ÖꊒC`ƒÝÑJV,HeÎY ƒa›V¢‚ˆDð7Ì­8£i_[eŽâ˜Ó—ž%Óúñôµœx(U#<ë“¿šàüÿ·ø?î¾ÊýÓŸƒó‹•Ýã×øG;oäûç½þ¥àÝ8Œ}ì ÷l‘—&¨Ytl0 .c9•Œ$BAsM¨K°· ˜¡J£1NÜ:óÕù\qþhÿÅ€Ew6vjKV&ä±´À(Á¶‚'ùB«–Ùù]ž37ÒÈ|¾ÖL2N™¨±ùtŠÂµÑ(Baâqh²räÍ,}]eš3"Ç´°DÕ|y%Ýß«§Ááéí =çzº>3›jïX¼ ôL(BA µ3ÎpÐÔí¼ƒ“ªè¶ý†æò÷õQðÓÛƒæ}>)¿ã ò‰hFÛu³€øh˜²v?™ÝɃÖÑeLt2 Æ?òÛê¿æŒaHçƒÀšW_€QÌ} ®«X¸3èJâ¹ÍT"(B ãrÄ¥B'ev/¢m})nàU <øœ~ÄÞÒ ØÓÃMqòó1 ˜HªQœ>ÚAØœâÙY1ì ºˆ›ylc-Kè*Î85ôÄÒhÊnE|­qF#A€Û µbCFñöSoy`ä=5S0©¤€ÈÉñGø¥ªïg؈­aK˜SÎ+̓ì‹KE}ÇÅï·ÏÙkbö*(ý„ôÃ&Ý[=ÞPF}>¥ède¹·&hñ—l[Ð$bžÊ†¸(Mr÷\ýBÜ𕺲 ÕtÀb´ë…ÕÉ Æ\º/¢OV͇ýГ$8W²íLÃUIËBìàzqkŽò°," r™QU©•Xs"P–[F2o¿Dy¸œyï³#Aꮈ…±‹ aů>úîwͼĉ!(PI°ã©)•#4ÿ)H#· ½Zoc EŽÕÒ þÏo#™ì9A®ê¹#fp9¿æ8ÇŒ¦f‚*b×'»û]‡=TL•µÅ ¤ž²ÀKˆ×©I“ÁPÛƒw1±ôMskÈnXƒù.°6 Lš/yŠ¡¾‹R܉ÛÁZ ÑR†q¤ú³ÁPC)·¨{ä±Õ[Óó?Ïo_âV=¯êcYr­’`ÒXcÒðh“ÊU·‚šH(=ƺúk²ªEýò×5E_ a­7ÎâB.˜.^Œ>¾o~ϯ½Ô[4ÙÆ.„Æ:˜i´….Pˆ^Re„2¢ÁÕŽ¦ÙÒsr+¹ï+ç=~Ç 7æÈ Ú „" ‰ôøòiæoî?ÑqIbŠBS€üùäg+éF  Zà6QB\ˆ AŸàâ8€õŠ JQ#ËÃ!ÅÆäÅì^™Úá ÓeÂäÞðvutɼÆòêg=ÿÙË·û·ÁêÛþ  Õwi<œ/ªb(zAKÀÜìšVfrGKz³lŒV:/Œ$æRɆF¥dÊ-1'ñ$ ”à.ı£‡‚«XÕH#Ua[A€o+B“DÓš*maÅúâbµFÙöúvÕq*W€6ª/ H‘#uÈLº _ â8tÀ#!Yå« u¤Þã5\–7y }òúIrh"<*Þ8|[tUÚ€ Çgº¾üì¶ÿþƓڃãEŽŒËn­D'àÅ!— µ$9£°Xª[3ÆšÅG˜æ¡/ׇ»¯¸‚é~Ç …7S±\±™8-«š;Š·¸€Ú©aTäŸ@Œ ÿ|ügÏîϰrzŒä­yÞjuô»ܦ¼^©µ“÷?8 y.ï³;>ÝïVÒåÅÌC?œ5íú<¾´ŽS,|–BX&—5ŽËÏÍu·ªî9ûæ¬[zÖaÑüà!ß«ß\«çó´F!ƒ&ÈÄX,qTÌ4EM?'k زÿ¨Æ%väÉ‚ïètÑx蔣KuíáG_+°ßœ‚Ì…‚ !ãÿ×?<áúÆiº%|q*¸}§b^™´ãÍ™“™HìÑÚÒ¬2¼bõK‚xù06w|Æfü×À¦.½¦Oλ¦ôa%ÜÒ‹£7ó (!¡V¨*å|ºld+su\t/’µ{íÚóæ÷×óþÿïè j9òÞØnç56¸ç刊Uc°U¢\y-£ÁØuLÛŸæZ€eBÎ.ÌÝc˜å«FCç«Eh'™X9œñÉ$ˆ{£D•çŽÇU€ MF„4™ënÙÊ‚Ì" IAÂÎB½Œ4‚ˆai7#"Öà×ãð¨QA[¨„àôÆ€$-šˆBE£íL[säZR½RöôÀi§˜—l­F¿+×)³&¦­äÔ´#`ÌÆ"¥À×·Ô_òWåË5]±åÞžç¦]p«>×#îÃÐùª‹Á¤ÅÅ”Ú<è·‰_ÜN?´ãò®ÆNF»~6o¯a‚¦÷¸n|ôåy|Éy:ûOýÅö9]#l=˜0‡‡g5»€”A°à™ÄóUâöl€™YGB¡àÊYíûµýþºñ˜ ÞI~ͬK¡=§¦+YûìUm¨–ø.Uôm J€Â1励*Ùâí´4êF~øá m2ˆæ^HYN!‡Ð<á ³ÕZñ2°ÃURjÕm#3Bëê5PF§Í ÝCC;b ÏD?n3€þ¼Fœ[ó`_|=ƒ‘×Eù<€ÒÆ5–h1nI ô×ýòýC÷ŸÜ×ѧ>ú·Ú|e©p†c€Kij©›(]àM;¥…»óMmµ˜ôJëajΣ,cŒ\tô²?,›—x„J©>D3bK 7§¨ûâëÃÿý¿ÿàÿÿÏv÷ Ýã7Ç6ºñF68Di\A…gõO°ÒF¦I%©|„"N%Å(ãqÕ0PLÁÎìÄ›jv=Nt®ûr™6U•1e(€u¤ƒHÆÕ¯6Š[‹ðCü‰™juJ\­ÉõdßóöU÷^—ñ›Ì…E|•Ì •!b¸š`%†¤Ær3’Ô ŒàÁÌÚ4K´+vDëI¦È qªnBš§g”gdŽÉþÆúj÷>NŽÅ2ˆÛ•"àñO•æóÖ¿ù—­Å¥×»ÉOø|:·å<ê<å÷¯#ÞÍ2êKÒª ÍÖ€hÃ&øh4ή¥î^§Mðt ëwvnIÁöÉpð5ö@EÎ{^ìó^Ÿþþ«ä'“Ý37g†¢--‡Ô {ɿ逯æÂ²º±™8Li (ð€Ú93N'4 VˆºÝî=øH£eÒQBëÇiŽœ™ïUõ¢½où%Õ`KÑÒc4ßÙq¬l†Û‰U X’¤]BIpQá&Ø ÑeöØòr®ºèbYP4nV^”f©XÝFVš?w=ÿ\¿»C袻:¯¥¤míP ¤,NpÃù¸7ý"ìö äÂq´D§hÉÖý¿çÜ¦0-]†ÉC£IOz@¨çQ7^…BÅ7NƒûÀ¯˜ƒôv_`xÖ˜ÙïËW2ìÿìÞVìó’LüÍøM^r{j}蛬1TŠhE&2œ2.ç>o$*WZÙQ~”ó2KÄÛ÷¹É›2Ô´ÝMóÀ¾‰:áÏ>±¯Ä|}l{È©|ã]:ƒ¡i˜Gê¾Ö¿w<é¥x•æk`ƒ;“ûãYHh=dy+¬fmžõ}–ÌeS§sŒÚlÀœî›pÁ ‰ö.ìâ]‹C_8”uažG¾ç,#@YÙUfeU«-hH(”x@ VÄ9ëÅ1ÌÖT<ì%EI)vF¹V¶S S8”nƒz\Þ-­ªe$ÉÇcöÊzj,uy±òj9r‚á«+÷cÄQ¶î¤É:9ΗÃk‰‹-A öš˜7{²(fÕ-ÕìÍÚ Ï 6žIËÓÏ3©ä¼Ð[*™¯«r*WÉs$ŽôÙP«^ÈÒcy?6,Çs¸²@R&ÌÊpe-¥D)¥\^Š¡Ìa&qAÅb[U-ïÄÔ³óúOžO¼Í{Æ´R0êb4(D-œ=Ëuóq)„‚U(VæµÞš¸† ó?°4€ãb6.–b©`”á„Ó};G4Ȳ[ëa¸©;óÓÅ™­ŒP|zm´1Üí´™³#¥ë Y\ …VÆŒÓÓö•²w9féL–{ÞùH¥÷ʽ”ã†õÚï'–:ëh´(GïvYÒ²Ø k—Z/û°Vq”Œ&é7„WÇ ºí†Ð2ë +í noÒ;ûÛÿøyiš¡:I ¤I‘°]%k ó¥GÁ ­ŠYÿÉñÌnûà?9÷02¸ñʾ‡ÝsØ»v±ÅÆr{‹’ˆÂ°Å´\±`@— ¶‹R¼(D„fð ¶VUåyk´m?´úmëÚV€Ãl‡l¢ ÿ€ŸþÊÇQ"ÚöŒÚ˨Ip[fûÍ~?tfoä 3„C˜Ù+b¡KH¹p¸­‰(ÀH³UÔÛŽar¢ êX9d!F1*ÛÍ‘CðåÑuí{Ô×)zŸ:/['ׂ·Õ§ÎEVÑ©õ¯,›CÓ•·&v'žœµ Ln¸A£Å‘2Y*‚ G3šÉ›)c½|V9Ój*JhÄqÚî××YTUÍmÙ üÊ–v«ñD“ôØëÈ(UtH6øµhIPL"™£f\šC†ŸÀ¢±s²EŠÑMšÒÚ!Åz÷£egÑØ,[Цù Àڜ霖fðªüs£­m—_ê¶»–²Ç*<«¸OĪbF yIòè WŒìÝ>Øšç¼å¥êøÿúúÛ€˜îÏE©} )àšcÏ̺†|LÍÂNM÷žÕ S’´@ œ¶ž T^½.ªžMíÙ¢•¯ìíÉ¥ì˜ÏÇ=Fuùðññ'¼w|k˜^‡?lòJŽ™oÃè¢.A}©ã~¯%UÓyŸ“÷ÖGº¾ú+fÂó@c%[ǧrlò—7£€¨ûÎØ€•ëx5g€¦®³¸Ü£òöëÒ=OÏyñ½Å߻֧GS¤–¦eUµ‚Éë²"SÞ§-z¾5ôàH#·§Úbµ<ƒÊ.ÚÔraðñkªÊw«ò§DS“†t[Þ9é iSþ½4ò:Î?KÚÛ0ÓÖ±×ï‚/GwGrªdu>a…X ¼ÛÈ °¬cˆÎÑm[zîïêöëOö5P4öþ@ß/Ð}Ž©•xÆ‚{Z–AƒÓ»kûy™º}1b4׸ ô"È!&à"×€þâqÑ(Úñ"÷N`E$Ë tX#¯f A€ÛÈ=Ðçäê‰Äé$&jß‘bB†¶ \$½k. ÔH¿8n`ùËJ}Ã5»Ž@Ÿ#zâX‹µö‡@c¼¶×½€þ÷Þä_|Mµ‰òôìóDNh¯²ÚI<øÞ§LßwùëÛůž£ÊTÁÖ´„Ö_ÄàÑ}xNIknk:QSªæ4œ€\A9^t]QSSŒI.«Þ .º¶¢F›éå-âô,Iâ[ ±yIçNíKì¦aÀôç ~áœâ¦Ù6¹P¨Ôí‹û’O ZtXu®«Çj·"€mX€„VÝé¬Äª„Þ‡~Y¨±©B'pL³è–íÒݬDSz©C™ñ”†Ã÷Ô¡PVGúAT|©üÊðvÑ‘ô¸·çP†‘Õö,B9×xùy’1Ó{úÅzÓ¢8*P e%˜°îhäŒ'B*àˆuÒÑl Þí¶´—ªÎ©ú.ß<>ç'F¨[ ØŽÔkò@/= ïD…Å”fÛg–¤Æu* L¤ÝgÁyþeÁ­ØA3óê{wº}hwO&zâtËeFé(]ޛИžñuyÝj! î¸gŽ+åÀ†Êw›ZTZNóVy[ÛÔ—uVØu¾®¢ËæEe¾ö(·u±l–w‰{Ú¢ ɰ>í½ÞnÞ»YëÐï÷ §84&,ÊÇoâêø]§%UÈ‘ ¢ì8¦lÌáß}ö;ØiÏ3Y’«ûaLíØ™yq¹øþýëíñg¹1gS#ý“ʶ¿ÁÕ<Ç5j7ò’®µV¬öAA¤fh &yÍ_—Í:³Ç|†Ÿ’oŽËsd}Ù^n¿änÙ ‚j2kÞØ¯XhÚݳ8]žQëç…ü"vÅ×íBÔíà€DÅ Z+aN⑪ì`,ÆKõgu\3.aíÕÔAÐ.ýæèóDW€e|¿ç¬Té ºª¥ÅäŒÉŒH!£êâò’@ Æ@©³ nZ[—³ä[,Ý£\Ç6KM…?¯à§?ýÃèG5ŽZ°ZÄ@hKnûGöçÃïŸ~€°¸V¼jd6Cÿ&ÕŸ^ö‚pžá ’“XÞJ´4"&Ähž=;2^“R4 xsâyr†åRÀaÝž1L’èüo§ö§Ìÿiü41Ó’ÇèngY©tI¾+Êð(ÈÛZh³ fæÄñ71­nùB,þ ”ѺKC²ðÙG®S™‰$,¢˜"—­órü(J¸pà- àfÂî~”O䘑A4ÏP‰Ù—ËJæÆÝ£ÙŒŠi,“ãgê3;µ±p (~Æâïªf»?ô¡åݶ‘»}¹ýe'üVßøÏÃe>Ö}:?µ¼~<”_-K7ȉGe ¹ˆ@#9Ó‰%sYîD–ÚBlƒÖ#ÒücÈ4_ð¯ÏßøhòÙì"œ›É!PTñ&Âù%ailòÒ*š–[$íFQ±F Í¢"ùJnÚ ¶ÁÔOÁ|ȹÚö>EŒ1kÝÀ= rK=+Ø9t­iÓ0~pY–í7˜ ôö ‰2säpˆqo#àœÌà P[pk4rq@©)(öËú¢N¸a&¸¦Åhï3ñkܧ%Ô2sãì~´ÿíòm|T&n¸ÃýKú°go0©Ÿ ÂÇ=,y''yF3@Ýë´Õ\ ƒ3…` ‚ØŒZaˆŒè´L |ñ…—Jš±kV úÞ¯ï×ÿìÿ_õÿÎ &3`lB"B®Šì$A$²‹,8;‘ÕxØ«_ZF¯J´CÊUKòjPÎ>ò ¨7ÑŒ}…ŒI-—Õ^™ ™Ó¡©\B ”tª`SxRm9šKh5°“c5à׫¼JþéÞYmï–èQõtŽ¢æË­÷íëXo­ˆn[êR§q#i&aœo¬G ­¦”á&pRÇM;í not!ˆ¡ ʃÀîȸ4";µÏuÀ#=ç¨mí·.±ùòŽºº×D—-Ë©ÑÆœÞýýôóM³J·£25xHÕL(È%°`†ýŠté, jõ™%¹, ;u#ÜÈŸN>4“Ÿü–{OŠæYyR¸l󤿮¶·â3Ê7<1Á\ñ$lã€*{A%ΗÆb„PSQª NPókHPìÐÂÖ‹È%4ŒbƇ:´R/Qšª”5®%íã6cgéyºv©AÔñå°=ÃÔ~OJ=)d®”–Iˆ´Á¬CÛé²i™vªäB” !‰xly³……„d)«XV‹Þ–^X;ÀDC7ÓfWÚ!*Ê·øVSj¥^­­ÝnT+qÃPw° Ïê±ä¦uØL¸DȰ7_Á½6÷1œÔvÛˆ)ÃÅŠTùÍPn/\ö²ƒ^Ðp,æ¹Ã›TŠÏ¾“CÆË­=ÜÇïnÖw&§šQD 5³LnÃ>"0ž–nAaа· m3±[Ä2˜‰&ÙöE7uÑEòD³Ì®/,Yv;ÜócfÄ0@ãT}=-ûý3n ƆOØÎà+[<‘¼„ç,ù0?PQ޼ÁÈé¹KpŠìée]÷h;†1ÞÓxfΛ‰rì±f¬»OœÝN{ôD$›¾Z)`Ù!Ë(ñ°l¨î#œ<¶ Ç|øŒ/sé¤ê I(Y“¤¨Œ!•ÇÇ€©(¸Oôráyy´[m—pÙ4O†¯’éÕÜó²Ä¸5l] ø¶¶F£µ»º%™ØÈ1Á&–Ããv#£OdJÑäá‹®j¡¯²eeU„skÚ®Ç~ÐVü$ÌÄ”EÙJE#RLNp} õ‡”;µº„C.Í&]‹K’‘*a*% ¨D©dD3xfƒ_úúÕé 篻L-Æ +¡¶ÈÚ³®~ï‡÷ÿ¼à•×#ÚüV’t6¨ ¹µÊ¼±º~Ê” %QWä*G{]gÔ‰Z•cSÄQ2‚²k©$Œ°´C1)Þ£¹Zj4 ½FL@U²ÕÛz¢‡ÝÚ¶+]ŠRf­ãJHª¥ŸÏ<çÎgdÚ±d= 6ý”Í7ßÛþ†oiiCe*;°°µ1¢)®eÿ~æRšL[&›kŽrÅT/©ã}< †vç0Îuãó~?~žüdnî“‚q, ›L $éÀ¢ª  €ŠUË?ó?Dý_ø/%œn®2jZÑù¸²SòwZò¸kîªJýØ>Ãxçø÷üËì±÷מޞñ-ªšfÌ$s\»9+×+»ŸÿðOÿÿó¾Ïfn£7²ÜÆpQb àˆèI[üu}üóûKHèö)ägkpÿýéŒë+CÊmù£Ž…óÚ•…8ì´Û}?"®ØXõeZó¾>1Ï®>?Ô[£¤’ìm‰·pºæÏrðpsND–]¡Æ…á}¿Iih‘‚}øˆ«z~íœÜ|­â‡z:ýÑÅ­’Gy+rb]|Ê.è¨c€;ä…T8p—|i:'•ÊéÀ_ý«-Nê‘¶·@o$²ô¢ç‡¨JHBLaË`ŸK.eˆŠAÙ'ÛÐ *0®¥i½9h”&;à;_œÛ»3¸È¾®™ƒÍ$)ë¤I^š†¦ëŠÐšÌ–lší M¿¹LÎ8ÈT]ôGmZä&-¼L|*.jrr?† Zb¾Ô…IßÛêéùµÞÇQjwá¥<¾'=îÏÆWv®îõ)çZÜRÈã-׌Ý=—d¯â(ž:Ëàq¨Ç ÄÅÝ«»j{4»­ª-ŸóÂ_›:e¹$—„ÑR¶ã¢D¦’õ@ô7\ZȺTÿu§ÞH¹tÔS‚ès½Y#û/§‰_-N?ªqªÂ™Ìþijœn˜›AbàjGµ5G2ÉsÈóÝtr>!ÊcESöB¸zS¡M¤Cz@؉:£Åº(‰ôƒ”4½µ»Ë¢„é¾Á~–ͯ|D{²' $ ø|þîØ¢ô*ZZ´Ig¡Z4'|üÉ>âó]Çí±në~i¯R yâ5 2ªqé€OÍ%  q[ Û—LXÊE.÷˜åóîÑÉ¥ùZK?Ƭ=t€ý"Ò¥S/°N.žÊNœªÄ¶!/ÑáP*±8iÃΓwMàùü¸úùÝßV{Ôצžýåúž?ï½7KÓ ýLþF Ùï6ÿØþT›8sOÊU’ÕC²ì̻›9Ó©£Ét´7Ý iQ3ÔSÅgøF¥]ñZÞ/³Å±¼¼†*"&DÃ’N—9NfÀ;w«³üÓÛ%‘ùƒ„ëï—aj»VBÉ).{¹¬Aº‘søZ¤ÀµÉ[?÷VäÖ¨¿ØR(kçgW´²Yw-w<Å÷ËàËÑ4çò`öe%ŽÍ‹Š=[D“ì^§Á ú3`¶„BSc ­ó‰/"Ì ¡ỴϜˆ[ïÒ[ª]þ}йh)}FËi6‹0è0œh 261ŒN¿N žÖŽXmÒ®€²—è&¾ £8­äLO%5ÁR}T¥ÔíénUíÅí:îâfÂ÷÷)!ÉcùtÌêRq¦þ·ßòŸ¿ÇÂÁBà ÃS½œ»xÝØóЙѱæ"Þ f»[ ”ŸÙXÂÕ ©q™T‹’ôKž‰Y¯«®tŸ³É®I*ÄržA( o§æ5÷U¸©Æ^Bp%tZX+Ú·Ú§½O~au=¨È}8ÃøœÎO\ò4ÚÞ1›ê†É 02²ÄÞ®Æwí ˆ”M³óÚJÍP}À¡=|¹+áùp(š½j™äsƒøHoou@éoéX±7µ¤W}•›¨,ª½²ZÙäêe/Û»^²S ácïëkQÀ œ)±T| ¹ag h)HBiºtŒ(LCÛeÇp茫¶"MÜjŽü,ýgNµMn UËã§ß{õõõM¾WÝ{­· Kƒúà£ø&=I&Šea2GB3Ny¢'ÀU¥5×IU5‡ êæù r3^¼lmœ;ôÖÄSÄ @³2{*†K|$ Ooñl\ˆWßUì{eYó6Aˆc˜£¡v) ;¥ct+#“"È(%"1³(L¸¡6¦$'%‚i)Áäs×O°pû(!Û-/¥P Ô)=ÛC97ÄðL )?À·6NMoÉ[šI§ëLGøè¡¡æÂWä–6;ÏbÐ%áÀ%ÚYÉð«Å  û–Ž_ÄÇ(Æé7ê ÿn¸¶­~39FK,é;½4Íéoúú/Ø[Ù>>~ª>5´‡~‰ ÔBݘ†@¨‡cETƒ8Bb9)=êGlœÍ à‡ºõ_²æí/˽%ÃMâºõÕ&Ð!>c(ŸxNé˾.Ý‘¿‰Î{vIÕ…ä±{¾Žk* &›l.R…z ¯3b÷! 3© -fÆ\ÁB‡ô°¹õôv³7·;¹ïì}Qs§Ð ‹bbYU „*Êc C%¸"!Ã"KP­ÞD:N¿ázo¼*òºÚ„: gÉžG"ÎtåÚë&…É'm|k‹GϽ.;WÝË ÛøÇ÷~Š(‰§ò|%F–ìPÍ`%f°ztjdï ÁÉŠ QÆÛç_îîWKá• ò<áC CÅS\(\Vö‰ƒž”óô[`Nˆ4¢ ˜Ne°§â;ˆGÁmAÎgŬG©C#TRjrÌUÎÃ,âV†Ì%A2PÀ–²ÀèƒDûXNñì·‡™gÎ_ó#æúî¶:4ö[q:ùÓŸâ»Í·ž=ïž–KaQbI(ÄMH‡€T¶a Òç‹ÛjÖ ÊÂÉAÁS«£ÊÐñ“ lÕªÄ@_5ÈÝ&ÞÖ’³Î×ÞÌòƒ21¹NrÏyîãÙO˜s8m’2À$°]ÄTCk’«¢0!NÌÄndFn©âL¥¨5T¹ÚÀ‚Þ´¸®Rc¤ìâ o»z¿òN?>¥8…Xe-µè¢æ ×ÔA©“ä™`±ËfÀ¡•0¦P”»Ð­²M"Ý™nÝÿ.qê´Z]×=ar ³"C®Zquòmœm–8]>§Ép<<°ªþ Û÷[|Ç?h\œÁ˜È‚Ê•5g{;”Æ[Yøúx<ßFç Í«8Þfë5FþO­Á3Ðñàx—RöúJ—¹_75º¶Ârd¡’WÇï¯ø¡07hOK{<6­ ö*ÁÅ‚¡SôQWïXùÒ\MåþvoÙ¿ç5?Ÿ}n*Ž2ÏIÓ¾´ÚœæÄ…3€ÓþxV§?3rËOiW‹¯ÕüµY%zC‡£f9_ëUd’×3Z›Énµ˜`sØVÞWîó‡})“·¯&>ðó5pA+€—ÌúsÛyû“n뛫Gn¥É…ÓÚ÷4ªw”Ñ*ûA"r¤¯ýÄè-kþ?W:Æ~±þ–®¶žG‡vÛ%ä"–]b ¶Éu¹Œ€;êéOØ}ýmë¬Áñ /¯û¥þÁÚOþš&ÓûçM¬sûˆœ>”®&T³"òš½nîq)M »úG8¯­Œ#Ùéº,aXÅglñ¥1_B}_Ê3Ñ' xZ>—Š PÌ2í–GT$X§ ÙM«î欒@f·R‡áºí—LWš¶H‹nœ @*ˆ\TÖ"Ô]é.p •¤lFÈ‘©@2åN Gû¹"’SýÓäa^w¦”Ùk •Ø5JqÈÓþÄv7U.ì¦×[…Q ©ÂÓ*C#‹¸1s„â¾EØ™LzÊU:lcqµdx• Á#z_ù‹ºL^„ é`mu¥¡Ý¸„ÁRùžÀ?œ+9Ík3/*p»¤S÷%Kû¾[;¡áT]W­+`Ÿw$A+—G¯ó v;‡Š8U_›: x6óÙ#òÕ86ššÅë›iÖœ1 $50Üb‘³Žc^—IÜà#ó¼ä#ÿL`c`Š  Fáœ}&oj*ã³óL2/ ä\¥û³Ú¬9B&öy¼çnJAÛw϶ùC'”áJ&£ïû«Ý¯+¯-Ë{³W\6µ`iEÍ\%)0Ê:ÞAèô¦­—ûγÏ,3a›¦^æÅðYI•=`ÂkB˜5‘»cÈhVÌ‹¨ÐùA¦£Ð`gÏwö>ªP_xE·¥6Šv*ÕU£”]H B.H¡ÖR‡h`†L8“ÂçЉŸ(øÛ奊Kkrštôä~H%˜pÞ‡˜©Ëo’§j¯è1Õ›g…’ûõ5»ùÆ[ýä)ã-2€e¿%¤÷ ¢]*¡èŠVS´¿coÏ›Uj¬×ªæùñxŸÞG‹‹;–rÖ9ÉÃýÊF)ž·ë«zR*Z|¦ŽgÆ3NÚé½õöʹXê¤E—î#¶ÔÈ}êðª¥,Wìš0ï1^å?• jCåBJ0Š T{rl›éä ¸5ü’¿#ù˜} żˆ} 3.ìŽ"ì´ð!6vpÛñ!²mÕ•÷K!L׃Ë÷(3ïý–³züúN︔B¯Ý¤Ø÷{^PâNŸ¦ût(ܸ¤leŠ|u_m¢«™=»+fUqô"¨©V–$A(é$oÖš:‰–È›&„1[¦€Éì=Ýþ›ý{îïoØç¬ç'zæá b§¹ò€—µ}×{A?†fçqŸè‡bªÉú¹Ä3a0_* ½A›:&š¸´€x¥y³»ÑÐ:hÌݞ\^‚;œ¾ä_J §¹8hé æÙöÌ¿PftØÊš¬€BQ!™ÞÙi‘Ït€…ó 7{Ùn~%.ð—^¡d'V–0®R+qó¯Û?Åéñ:{NC— /ž&ЬkÎ%Ôx­ÔŸuƲ_?ì.&…•« ¼AMÚè™2älÐäAO}?½å‰=£(…P2⃆&:9‚GûÀ,¾ä§2Y "¤Ž¥øR´ÜÍšñNôçä×/+~˜ß8s;àÏØÇâo >½HDßôtÆ7kµ¿æ3Y'J$5œ7‡ü’Ô ¤WÝ{$ŒbGpÄ(šÎ¨ÆýZ~«Za´çì, gY$3–-K;€ònðÖ»a—WÿÙ;‹gÍoÅ×Ñ_À˜Ñ½y ÝÝâö ¹™Ô~%/š^{±)Õ¾D°"° BœÝœÛ$Hlq3›ÂÉùx³à†\Ñ6àNr/v¬G%hµE]Ì5½‰NGF#ͱZI>(˜çù€ÙJ6 ·Äb§dÑŒ`C @ÚkÂI¹£ð¯Þ “$úu«ÅP à¨"}ÉoFÉFïHÝz¹jìô’ž!Bwa¿¿ÆûLœKŸ'ÿW~3=R¢u/Ðßíýjü¾†ý÷ÐïSïÉNb‰Ô!ïÌoLO¼)¯±¾I†i=M…=ÎÀ?‰ÉIè8ÜZÆ_(3pÀ±º7AÃùÍÌl¡@‚9&x ÜñcÿW•]FÖ¼•쪄UZŸ³çh¯§¶c1ý<¼Në×ËÇæª¥g`fÞû‰qº™ÄÕŸ >oÒO00e ‘@àG¹I¨B ¿ .Ú +tWs ‘,Ú ßXXç3Qâ&ó¦œÁþ^ñ½éšty ºk „Tð Q)tBŒ•…H)À×ÀŠ9‡9REFP ³Ð‹ü ‰*ÃÈ%1‘ )äø–WÃßwt—ÍÃ4LX‰}·MßAk\˜KÍ ̆2pŒ§n·LÒÃÙg£à¨­Á¨·ì?‘À„÷Ë,³~¥¦Â^ôÛʆãR¡¸b»wšA5®ÝÔ¿Ã?F²­Ü›q©Ú3ïÍÃïkìc³¼N.~rÄŸæPeÇÁ ƒ&ø’Åü{|C/Š}d·„‚øÑ^Q'$?f2Ðzñ©9ó’`¢2¦Å£[á¾¶ÓGy(sh[móh›zµ´M3”ÜÓ±G÷EÞ>õðç=å÷¦O¼§BM€³…­ É͉Ⱦc#¥¬e !;öÊ“;x]Oâ˜^·›s?Üuçñ½³fœó®b(4-‡R YYÅŽc‡]À¢ Àn`Y$ðBpÓ4ªK%­—3¶,WXÑqKkc Ø{jêÝ–†ãqyT‚5z£Þ[.É—Îã]7oœlš­Ü¾Þÿådù¢j®àduBÜ"x€`O}t[¡÷,×DÊB`@3d~³óK¯8`äf{”2\Wû?ÒÁ~ÿoúé~õ;lã×lÛÝ×ù®j]6¤!Éa|Ø"ÂCåS=2© ¡ŠU¥—ÈJÜváZÿD‚Í)‡ô`a2U4XÄ9x–ûó™³ËI’élZvt—ˆì©BPU»„p[j¨0ÆU½øÑeu„šÀ…`kß^UÚ@Ò¨ò¬[šŒGLÃ#‡‰àPb–üAIª¸‚•ªŒJ‘xBÇó¬n±O|ÜÍ^Ï‘‰ŽÔ$/APŽèlse%{è°Ú°ìÊšé²Ö\müâ¨ã“ÿ‚û—:ÝX¤(gÖu¬smàUKÏoûÁðòKÚ1P³[KûüßDëX5Lµ0%Ï"õ~"G\÷UßÄ&èh(Ç­#t×—Þ_ÿâÛcOߌ½j½UîF^1Ð]D*…©3>ï'ížG¾éù¦´ëÏãáÚTC^`%íw¼ìÞý‘¡ß½Ób‘])–ÖWš³ñCýØŸžýþ÷>¥W©ä‡ž‚wñþþÕ±í}²p?iŸüýž"Ø÷éþecݸãÎ\UøJð:PŸ„a¤ëùíš÷ZÞ†‰½{J¿ëŸ§­xy¿.YŸõ?ìsA²ÄAG½ÿÄùË×´Ù–òu3¨d:¸(8ïì§ãWòÝ`³½ïÿÈ×özûídÛ ·wÙ¿PKm^Köï*•DÑø{R¥³>©´iú>º!ÞdÞúý ‡ÒÌE´ÑÚ¿oýlç…Œ¶˜Ö‡¬Ø ›ZÕÕi-”³?Ü7R›8ë4'K~÷Û¿ëØ©ó¿~𻩋ÉÏÜp€ÖdÆ>1Pb"j-ÏœèºÐ•ká}úd“–ÂQ6jZ§.BHEW“–þ}¿åþö½¹>¸Ù1JÆÐ.…³ÙÈÝ®ÁŽcN²¡K C’HÔñZì)4J;c>_Ï%Q²¥´¦ V…Ãù¡½­Z ×¼ % ‡ƒ(‡H·„R˜‘3Á™0i]Øô:¡,€\h9Þ×üà|4h·½8,þÿà/ ‹Œiì”pï!ô1G ˆÛ^úöŠö yNìACÒH[DÂéšfjÀóþÖs§¡“¶zÓÇæ£&ÄÇYS;%ŽÀ1˜cQ£:ÑMWŠûÙSé:?àéñ#¨ÁXAíÑîÀÕžIq±f°,MÍ™R<8ºz8)sS†ÝYåšðv¼`„‰]„T¿(‰X‘ ¦+çl˜ÏøÓDövnßýöþyºÿ&X¢¬µVOôÜvåQߤ ïa¤È2Yö'à¹æ­þË­u-‹M³ÞvJ`TXˆ’(Ÿ [1§4ê·Û„~£šqðÍ \ÕÁ-y%wv ç’­òlöžÎe›²XÁ¾Ø¾('Ø„ãH^µ…)𷏫îA€Pt¹%ïHlè@#3) Ýbpš!œ„ó|ر½{¡¼/â}<½3s@§üV^æ΀°J—íøwG'ª²ˆ{©¢å€+>·Ýr·”¾¿@â«â_xƳTØ ‡Äó™uÚZge°@(Âk¨ÐÉ]áý^&Zg…·óqÒçõƒª/ A6”ƃJ\ŲW˃åÖóªJãBŒÑÈf3'*ÑÉtL<ì™~Ë—Ê¥Yx M¬©šò0X@j¹ŠÀAÓ0èï6×ó“-]ÙuvΜZV“ ‘)o %-$¤ñ§:ßë-¸3š‰¾«þ6¥öh²Q÷º8ªA8–ÃÅ"ÒXnÁ›?ºÿëÙ“™¯}…Cðës']D%•w1†ë4Ú;…vÏ':¼°HãÒ±Yz½ižLZ´¹(Àý¡ÌËk¡…ƒµ‡”Òº†;QI¶ŠW„´ðÔ–,Ù)o~hƒ³g'›gᤳ$0ü‚ufÄiá%Ò`gãAùµdíÄýœ¸ªÁ1ß8KEð$…NÈÍôb…Êò;ÉOÿs8‘¼—¼d9/# ].ÝÊý9¬+Þ¡žã:pa~Õ)?Ô½žŽÓþg<zŸÍ=Üî^³W1PÎZ–@tÔsfÊ RÀ^š±œmS8ìˆ6#ôšÊ8‹¶³ Lòó쉦¼ï]ïóó‰èb(H’Ä$®²‹ËöxéPœ‰D®I©ÒºD» ‹}ÚóÅ9‡2 M,&ÒŒÀŠÅ‘xµÅwø|«(&“3!ë ñγd”rϨ<Ï&^5cˤe¯icƒ±„TvÚ XáºuMúÒJ¶Íøj®±àû´<¦ƒz_±{¸u 2“à’³© ÊèѺœðÕv)ΗyõZºêrwèÍY4ÔÌغKö‘šÅŠøÐbe}ÕÆ'`ÃÈ¢ÔÒ­áH‹vSk¹aS6؇Û÷sý¾/HÁL—\½S®vJ’£~¬§¹íÌr“f?ð·”\|r±vÉbÞ+Þ·\A'C’¿g"°`0J ¯³éÀ<‘Ì^ͯü°Ð‹Wa8 !4RvIÍdòEã7XÎ X²Ó¦Á‰~‚Ë_ñ=¾_¿¸Ïa1»ƒŽXÑ—ø b“:ñþ^ì’W¿¨ð )žúø,)ËMM|Ñ:8p‘n³«w¨Z‘ŠXÉB¨ƒˆÞÄpðììöÎÏà™` Žõmn ËÀÒ¯™ËàÁ¶Îú4;Téí¾ÊØL¹ªôy°~t¢kCC¯ë¨æ5Ÿ½ï­°v¹: ¡Oc`¹’*4„¦mJ ÒVKjÚ;ÚD•l…;@Lû¬As°_×ÿ•þƒÐüTÎHž;aÏg´µ0œ½Þ»6ãâDº5±³ ÑRº•ÙT™È·Ù›Š÷Õñ1鋻טÖ+6¾˜…ŸgL¨MsirÁ˜(¥qz£÷ã¼Yi¯‹}Í\j1Yy_j4 :êo²#¥3øœK¶`$V[¨˜9©Ó‰‚P,Jp©e"X¶ø›P>(+AJªÌ¥]ÏÎÒQ«ýÁnoÝ\ÝGwðýäß»7ªÛn@_‰æË–ÒkWΟ>Ö ™65Y ¥µ¼UÈ_öZs™§ ”,Drñl¹<ŸÕëB—{4'¾ØØ|DJœ.ùG‚`Ú$›¢4’®kÏD×¢é)}µ¼«ãPZDçŸ-<˾®Ê×êû”w<ÎŽÒ Í¨Y‰1_HEZB"‰ ªH#`X¿¼·ð>`}^N.í?cÆÑ­Ÿ¿®©<&Ô(uŒ0=Žä‘x:ùx˜zvgÃÑóúæèþÖv’–M]»ÕÃwðüèðk¡>ƒâ` *ÀBKÝå=ø¿yô¿^¹Æ…ÛfÇxMüjˆÑçÂ3T°é;¿¸½aAd$uM5Ÿ±ìÉTyz]’ ߨ±Ôx¡S‡¢‘~#e,]›1±1¿šs³éQÞïD> ?gŸß3wŒúØ­kÉø pfjËݳEýØ 'ìf•Ͷíœð•p(jrq<ÈßÛVﱎaíÜíÉúLω;PçQÖ]ÃP-¹û`*W½éÊß›cŸäõﻬn£Õ"ºòß‘ú5°!€e"S< $©‰æ-ì¶é½¯Ÿ2ª‚ Yâˆ&5VZgÕš Áñ÷ŸïعÛüÙWrž¨òlímÌððÀ°«“}Ýi^ªv&X+²r ¿®‹i>ês¸¯Á&¤¯XEûÂsX$ÂÁÀœÈÂë÷µÀ ·>åÐá1¨W‡ª+¼HÖ6k…rpKÃɨ.ÅfóÉ`”£«z2³¥•ÀÒŒ—*b0P„ Ž0.a"T%m1<´8놬E«39\+ÍúÏþªVø¯ð÷Z‚TŒ£%õ³|ö¹ïÖ(/î^«^v¦´@‰4®ÄN tUvyåu0‚b’ÕA®RÅ*ùÜ!îCÃø_Äþ3»N‰Á„†0†u[ÉNfNÈ{dc7§gn`&HZH rz½“áÒã>µ®Ü¥Óˆ¼;ý‚Üóôúºp𕜜¦lWܱ+—H{pïÒÀÃe€c<Ù˜¶O]MA9×cLÚöwÏǦ$̲Ï3„æÐ÷´¯¦kžS9“»ÛÆ]oúÇÿ¸7³£S?TIep4”ÒIjizWE‹ë±#× ‚ÿŒµÅ/Ž«õXã”…Û/8î™ÑnhÂÀfµ ¬Š(t *¸U –Bˆ{„É–CO}ë‹Jÿù9ÜœÈãùÏÇýA9?úq]ÌU.÷¨üö.?>ÃWÏ¥þ´žß_ú\>ó[ûB(†ˆe ¤€5IYä-ô Í€P“…–¹¶`S‰h "-]¬îëßɤ?ÿ?ÿjþ<ï•t×ɤÆa=?]/Q’àQÔš j×Ú V2˼AÒ0,¸Ä–©³Ôä ”éZ›žt3gg^¥õyiQÃÃgÍ8O4Ö‡ÖQ-ŒE F5K­š:-#ë8‰ªTí4EIå—úÉï­ ÝÚ"ã€GF«®VeÁRµDk;Ðù:PÌèÒ¿Ôkÿ>Š'ˆŠ]àæÃ€Çª’f¬>:tŸuÖ¾þ%kîál¢$¿%¸ ÚXJ³}Èm»b¤Â† `€Á/”«jŸ(¶¡ÿalÓ&†®èí‘ÔSÃüÅsi\þÒ×Oõº6A´¶Ïg¾ŽŸû"Ïí‡$gkÊàçÞO~ûú@{{jG 0­Ög€+oóú:†”йiWð;”>¢wס©ë`}â+IéÞŠT^ÔewW\ÂCzôÚZ’Ù¬TË@û§óÁXßgö«Ñc£*ÛÚS“[i½õVáo­ëšÝw\ÓÀ•ÛÕ†´{o¨À›ôw÷@ŽÛïßs£rz?¯ŸûžÏѯZzò÷Û@ª‘m›÷çŽÈiõuŻãš§Éb§îóšß¿ßÖÖÇÿ—‡âé`*?Çk¾"0 ËJQÍÒ~´§?×xᅫݣr=<Ç>zçóÈ=®O­¬ÉS9gùŒäؼÝÈËE\ðòIÏv׺HV.àŠ,jèÄ@¥ƒÁ¥ tÐáØ‘È)s;>Sª  3 â: bµ.ï’RNJ.hA½Ž9½.?`DÎaøéS_ßPÁ‘M`— BšVõLbb¡JghžíI5Y\Ïo¯AIv%V¨ ¸&n„(»LÎ4|Kßÿß¿ÑÛ.|×þ8 û gˆ6g“ÚÈŽ%¬Ø" aG ¡$" c›©ŒXt<{¼ßæÀ9±!ò/9:Þh¢“ì½m7ß9[ó!%À£÷D¶û:+÷uB›ÂÜL *„=~'³žØGö(T'í{àÌž<ÉŒL3–ê&f‰b TR,ܧYÿ’ð§¸V\qæ<´}bdñLó 9*ä^¥nŸ¼x\gß—‡?6WËÈvè/|½ðü|pè¯Ññu‚$2Ñêlˆûê¥5ósHƒã)E?0‡Æ?ÒÜoL½IuÕõ…–ÓÉs,ÓH ‰ŒâI0‚«N=b1ž²!¾ñ (j³…È­[ã QR8±È¢ÏŸ|i•ÙÎe°þþ]0jE—í xP¸PׯÿåËoȰvS¶5{wæ ÆF]Å70ØXLÚléézÖ>ìÍ8_Á9 [Òpueðð¦ÔtBb Šv¥×a›vÛW/eÛãIXÍ­EYW÷Áådv¢¦5_¾.ö첬ªü±©³å`å…µr µ,Û°]b¼®DÜB«f±,sÂù-湇\Ñ—b,^+æŽ|ëG݉_—9Be²1/Œ¿¿Þ6û¹=9bCv—uŽY-UØ?ê'°Ëþ ~>Ï¥^dÊMØ0ÌØŸæ!×ìÚ¾j72h ºïztª¯»O¤å‘åU??Øæ9ð£¡*Vjã3©X¢iú«ÒÍȇ4D /\f›n›Mßð塤í‘ìðÞ_• íÉJ¹Šb„»KŒ_Ò7à².çUÿDzQ5¬+”¼ŽRÌ9I*ämAÉÍÙQ¥n8…‰Æô¦ÜUˆÛx-kÔ&[sVd‹Þ‚~¸"’>8½;ƒ.m…«ß>¿”ôãÍôÖçr9}zÎöMãòÙi8’MOÛf×£Âeª+=ó0úû«G§&iítXc–UhÒB°:µ;I¢åªVH¨Ø¹¥Â0ÇŠ¢ÏGÖYûybÂs©’yŠ<òf4ƒ8¹š•Ý;ÊÄ”ð u2Ëy‹Û‰±t&Ö´r8¡¦¶(5ÁPæSà„eìæžê¬gc UL†ç¿p?ÏÞ ^²†$ÞÇ3ûúf®?¿Ó‚ýø÷ïàïܲ7ï|‘ÖÐeáxÒG§äùeìÒiéb Ø\«ì—q3R` ܦ¶õëVdf´äeˆ_õçßÑMÎQ^$€a’G¾ôvÙãrŽC c½zRg4í©Kc‡œ$’°²òªÝB !2î$€Ê¬(¡—øÇV{¢°¦ØÍlâì)iý÷Mûº¸Íª/.ˆ¬¼þ“aDúü„bú–%Ä^BÎÂ_s·€.uå^Ü„fî8`Wž€M`/k¼©¿]ÏR `øE±ÀêùšKýuº¿í¿Â]ðƒŸkÓ~[^â]ˆ$t…~Çò8ÐsdðaƒÁ^€¯OÔ€¹E3ØH¢½ßOBXJ TR¦t<¡áwS–€ò£{½&Іº½åQ« s„²o€6¥Ï*0ÁƒRJ=;Ze£™¨ÍSú¬r’·¾PMý¸¬óogÝ¡.O •+„Bó‰Ls¿ÞœÇø=ú"CRˆíÍváBª1ד#ð¯YÞÉw}µoÙ³ ãOËZŠ«[„’ýÊ>±ó ?æJ+ˆîº^ö³]Wø9¿ìS¿þ½Ø3ª ÛÕŒeºt­k x ä#îÁ;-mC\ÛQ“TZÉ4N &}Û÷×µ:ÿ·›Ç×/º>H¤âÁÞïr‹g¥X¿ÏJ®Ñ6x¶]ˆgÐч¶Oh$ ³W,Ð’ñÕ#Îá­™J’Ä@€0 ´…å˜ÿ‚ö+ãY¥2êršœM¯ofPT rŒWó o>ìÞw¬LVÆÈ„r"f$9Q ÉgÐBEÓ t!@ÐQ´+­õ¬JÛYÖN(G òˆ™^'?¹ú$oú/v?8aöæû¹Cø¯ 'áÂÂs öš>·žñIrv <ࣵ×zwJÁl:5’ˆ„›®Ø e“Ðìkvu>aÖ‡]9“óÃÉ(ïy>âj¯qâù "l, Bœ£rD=ym±.¨+âöŽöÜMU%îÔNm®,–i!‰,“U“(tR0R¡sÞ†3$¯ø˜]òó÷|ÿÀ2•p¬¤Ew‰ŠÌ–GaCÁz „å.Q»VµD?äéí›ô÷r¬Øº™æB8M6ó˜F”&(uWÒ”íßÞÿ;n³‰5AÖ$Á9›;·Neæ?ðÊ 1±·gÒ^­€ÉF:R:c †‘=?ÞÁ9óÀ+ÛËbBÉÜ.×ó57¯Þ¶w‰9DÂóŽÃÑ£Þ£û‡½¬¾NRŽß™9àD!cÁ»d˜E_A \â\ý\*Ñ]u]-¶Ï¥?½ ÁSÙˆü\ ¸ ܳmîùÆÎ€aH&V_p‡ËØH,Iµ¹m‡±PÎLÛ[s¿×£åèŽÅ€Z ¤Ö‡<0+8ª¡ 8ÈÔÌk1}âʤ˗Ñãy¡™€áM©Áô0[„%ÂÏFÃô4þ€q¾´}½‚1 «1 õ"¶D\¶ºWÎVUz]WÄn•¬t,Zo^úòNاÅ(A'•ð@tw²´¬Q'X™ÁG¡šÝM¬I¸iNmÎ)“:®'̹ͮ“„”‡tª®Ë)£ÌC¢Œ´ «\¦’’0à‰$ 41P<™…(l%_H7TáÀ°mÅþ®þ%0‚¨Á}Šh\í¯àì/¯7ÏÓ2êž £ŠL+uE¥B]á ‹YŒb´„0{éÞXÆßÂ×@,¦»tƒý³`ÁKt»n£o9²\þÌf†ö8ÖN!¼p …äÓTÏh¦0iÝ%^™I÷xKZmn'Ÿ)X¢Ü;´üÐÑqc“*Þ8Ê&~i¢sä` YË6‹ç`Û°­fÖ5_Mƒß¯û¥’1ŸÍ3¦×O‘Þ<íÙa…{à\صฑcèij½SLŸßþŸ=ß2³2|,ÒšŠ¶Z–…«ÇRû%  ,«Ç®ã öågý„ä¸,q¶¦lóȹãÆrá,¿UL¾À 3ÆÊ½†aØ%lÉlÃÄÆ4€§«3ïò©¾~Z×ôóV¢wò’¹¦í#¿­ßÒC>ž|9ò/å¬Ö_"S-—4Mû›ŸüæÃÎíãÃùùóO§[j@ÐKñÖÒkPd™1M+ðW S€‰¨ EBz¨h°D ŽÔ´™Ç÷ó¯ÿ×G‹yÕ]({ÿ; N”­2uV/˜NIÅ¿d[©°Y¦ŠÙÈ&Üp$m!TÌ ¸’P¾—;ªëy=yYh™êZåÚs¬Ìn;JjY錤ç^íNÆåÎú¾L¤ÆCîžÎ47Híð‘»2à”ªƒ„È©½\Á)œÎÀ…¿N˜D$K¸2%¯ý\?.®þèø²íëEg±$Ϩͻ³VG s}ÓŽ|7|nqÀ+< "¦ƒªÃZò)¿"BRı`1*!#(‹,*›'ع“唘#EèÔœPW\©VäÃÚŽD@ô8}¼Ÿ#ë¿|3ߨ˼k²ÏÈ<xËÊD T“Psè¶—†RWìvÀŒxWíÏlº6@¡ëÂú<ºÞ=}ù¸½¹æ=IòG¸ìŠÔ Šòø\Íÿ¾®à<üúÅO=ámlC9‚˜8Lj{ûÒ)ï·Ê…_ŸK×t<âG.Ÿ$í:5=™PDà{ýÓ?î =çëÇxL˜·úƒK“C¸»+ž/|Ôúâ-"hxœýýy¨Åœ)»LËî×ÍûͲÔ- a›Èò]‹‚ƒÇS"à9FPŸúS@ÿNy C‡0°ÞKÉžQ/Ð*¨J‘õáÄÔ~››z­žhüž¢¤å}ø$:žÇMõá˜FøÕ¶,x 4\c ‹Ü¼'o=k5ñšV„,ãb“¨`™ñêç¾ô[o.­d –ŒkчúqªºS¢,ѪOЂôºÆA’>Ð:ø¿ýkLÇP>_×°Qi„k¨pdTPD’¦ z¦±&_úŸÍ¡ºJøöÜÿ)½Àšº£s  ¶¹«Ð•K™œá° F•JCEÏÏý¾½ßY×ÙZzú]ªÆ@:´ìFÂÎNÀ sU,/êeX«r(jæôÂx=Í4¹ºas¦»¾3©°ÖDMfËï®Çmß]z\Xe¿ÅÈœqCE펵¶®2Ly{öÛYsZÿ÷Áb5µ3ÒY\ L¢²ÃÓ UÆ´–qصdýðì£äþÀKŸc}¡qùøª­/ÞãÕ·Ÿçe0áW”á¾#Ç„„õ&G÷·tÔ/tù[³™ìÊËë;¯×&ì™úüøåbKy¶ }yKÆwPÕDµÌ’¼Š×ÉTÊ•.­°æØ¼,¿Y—8Ò—t‡ÇOP߯¾æË/à±pÕaUv|¸äÂeÐÕ~Ð3±ÇvŠ üi´ @—w£>\…Ô 8œÎ#RÑ"í¬ Þ„zFL‚ÛÔƒ B»`À)Z¹ß†™·$+½“û'Z©>‡a™a'|½÷ørÙÞÜ·Î3{_,“>Fí®Û»ÔèõAëjö@ Œ E¢»Û‹µ¼ÔP¤j3˜F9OUHcÐ’?ê=d9'.“0Úb-Á0,á.Y¹×]¤ º p9ÀÕÞ3åš Ð…w¹«[â¡ÂW»)+߀¯&<‚0¹–g£~¹¿¢åBÊÀ¨»ž_&œyÎP,š1ŒP‡š­Û·F’Ç>ÿ“¹æP×Ȍ߬>8õVê¼ÐVçú²¼`ykL–›ePPp4 Ô'ÿl¼t•”R¾–Ý”˸-úÀÚgÜÏÉ>ÒÍø¹ï…GòS6X^ÀkY1{†,¦ñ™;y£—Hì:ûÑ¿¨]y$ãM "NÝ‘ÙN¾´ŽçÔ<|.³£¾¦H2¾r*€^ ßë¶;ÛY0 ®õhtÎR>ð|yÓâܼé2^Mަ<§H4x£ËžærA§ä7ŸÕžÈéK³¨=XB$€Ã­'³8ÚÂ4’ûqž€Á–"M—uòAíV€|ÞÞš"©:Qç"ŠM«‰ƒÑõV”6Ç5sv2;ábDë‰píׇsÒÔ§-7ø›©ßl0[W;\Ú±Ð(³O,6Ô P¥Â7’쳈p4‰Sn9Èc©˜ · Ú›;¤æyqkî‚Ñö59%¯-±D\L»á²=¿õÁþXv~;? *†(ˆÂÄx[vv ©`éO‹™¶g–³‹kSàd£Š†T®0³PnÞ’õ&ƒÅA‹ä$3عî ΉxìU†º}ºG½IQl£Å!0J"©¤ð3«ãº[ÃV ùVNÉø:¯¯?àõìy=ççÔìÝäÍR^@Þs²}·±8Ø0]Ù0Bqˆ«¶báE¡’žˆïâߨþ·/8«‰&î]ŸwsÚ| Ç÷Eû€ÔQZëê˜R“OÇÞõ­œ ‡ÀP ºÁi6øø;ƒHàHdI Å2æ6._ÃþB¤nOŸ•adÍ/ÞÕ€aWnáȶä”5ö¨µ`šìL¬p Œ7Æä‘‘@¥©É)òÔ¤ñ¬Ë2iúà“‹¤cˆ† m;hoöü¥{Âw~º¿Jbí«gØ÷é£{Ý .Ýúbt´±öðQΑô‰/ëíYŽ¥ýz#ÝD±øl¶—®ì,N* c"³¸·Xv¨Y3Ÿ}ÒÛݬè8?Ĺn:NõF‘ÛK訑°04ãò£»—67#Ù“ñÓt¬ƒr6Hº‹©™DLl4’!ò„Œw ‰68éªÛgµ&®'%¾¹uMŽ‡Ì³˜Až¶à@Ä"4]¶ùö¾Y¬|‹ï–'ÈÇ3þªúö GÜ2½q·ª,º”ù²1;P”8«@õdþß¶žÞÈk”:¤ê—Ó7ÐÉdÕjÀ±37qP|·B4A¦<›v³¶Šña¬!ÿóJ›¿µïMYÞÒ»šB;Î’7Ÿ–F¾þ¤£Ïw=>ù´Ì´³ßsº_èëÚ]_­8lyæ;„QZ¸¢è¢I[!ÅÔ ~íV$µiIr.¤Ð)ßärTCšr2]æŒzh d”ôµ*謗yWK YÉ@C¡BpâºCŽ)@°~‚ï ‰¼`hºí´•D$‹%g€È¨ÎÇ.M $!Ëzjo»Ð°[à[ðWR*e9U沎»—\-¡ é(S{×+øÖÒ*²Põé9Ò/J²¨UQâÌl¼s¸¾Ñ•Sòãé\ U¬L%DkÍ$íð3Ë””§(xií°µû9´4kÅ_È©œCÌUJQ˜BªT(†”€i$@,ó¸P¥ «U¢ÓÌfÃxçÊžIÜi‹`ßK:ø-Ž; ò,§¶çòÚQ—Ïf^÷J09”+PªL¹QRÑh:Ûz&{ö²UGQã‘ÊX¦GE½(:–u.C¤¯`R´&’\¹m™.û òDmd¤£0ƒv¦M‘€XxzU6ÈîHÏ“åÑ;Jÿº~ÄÏWÆó°¿×-(.oÓ&Éüêáu?Öät>ÑZÜø>]&‚à‚ÈêMz½xR–GäÅ™“¹/²WgHòh~díÃfÖëÜÎÖ¾ŠdŽØãžoÿ=–*:+è¥]Ý¥RT’•”€9¤N,&Àv½ÝB¹Ô¾¨ÁYÊÇà ©±¹®±™QLw0úpR ŒHlLO \H$L°Íé¦N¤ìˆRË0Hm™Aº’HdŽIÃx¦E¡ùõÿé·Ÿ¿eÝnsJYCu|w¸´œ6q…hA’öÂD=ùN+3êÚP˜Ä€ûB‡=þtÞ„Çó?ah^Mñ£Êð>s:¦Ä§F!úÇÊ®­•3|ßö®ßb›X‘ŽÌáÌdtËPêʯ§0Š"Â(|áèõ›;µ¶½2ÇúÉs¦v1xÿn&`e×ñýÇûå?fx[4½ý­§:Ì‘XË'œ^ÌOÁ ¶D§½cü ï­<2Ý÷úHgr×½¦3ÓëÅÃu&š¼í¡Aø û!z@²)@t¤6f¶udc‘–wVý?›ÍÏÆþm‚'jÓhmúa îŒÏºœÖ¡³PàöÐÙô¾ö9<“>òÛ„%ÍŠR{…W…å’$t Ói8Œ‰[üûůjtϯöþ €c+jXi½Ù«çu9-€ŒbdJadZfîy³‚ç묾þÝ?û—¨ºÍ¼ ~o¥ÓÂÌø>Rçnn{¿=If=4w·ù|°^WëmC= ƒFë$öàÏ(Âó&̉´çþú|æcâç½xž­ãhT(…å´Í’âcáµµÕ–í™õ<ç㯗ðµíNÖÿ¸HäüW[N }4¹UNq<ˆg®ê,‰{äæ~;ß¿¬]‘Qµ¸ú×ç§ëëàöSóvü7®õ—6y`~žnLÝ;’LPÃi[R(zê©–¿åêE«%AYMÿó–•eÃ.pËøÑ+— `RuüINÑVñE RÈB×4 }Ñ»y®_@' ¡“‰·æ­nY€»KZE—°À>²ÐzN±‚«ójQ… ‚™^ppù¤;,X¾H†dH1¨¶÷$§Rå“òmÑJLÊÊshκm{Ù¥ÎØîsš÷)]îk79‡ú麭ŽXf®Ýž¹uzЬÑ@; ëAøTF ,•%Úàª#1ú”½’‰>áP9ùQ^š«%é9uFŸ(8-_v 17ŸOçÅ}¡6 # »-ýéåÛ?ÅHj°q´ñ'^¸;UðNj- ؀…,ì!‹íQq•­i­¸¦ÜiÀxN§GIj¿yT˜}6;¸uíJwõžê¤w~xn;ùöû…JÓñ4ËÊ*G^åÔç%£‡ÛÞIð<ψ”hPà%¿ + u© †4@èØâ¯ñS5i—úX~^\Ï3QÃ:_;{]€-ÕYfä‚$‚_ÏÉ‹ù†£k¶¨q¾¬‹m?EEµT éµ :Aù-h¼ãö´úɰ»é­l %%n1FiϺ[ ÅáY.ÄžáVñ±«ë.”5­høeÏ3dÖ7Ñcºž?hZúm倞ˆiÙ¬³BD€(G{´à-s=iAÆ‘ïçÇrI Ýå—¼£yÆŒÚ_°g¸®N–§IÎZeÙ—÷·N½ÏÁ_ŸT‹`;öÇåƒvõ’jsÝ^ØÎò å”L-Ûî¹×?.oxïÀ0Ô_G™™eîЊù§ðÞVlÕ´7ãWÎr†¿Ç:”ÐôíÕih¬5Æ«ƒŽ2:ËòU?+é6XL$^q©† †Å-¤†‘@¡ È.5zÊÛs¢ŒÀF56¸ù‹&=A̰}FÏ£m4saé|q1N¼½”@-ED€’bj32Ȱª˜DØç# ¸ùÊ …ï顉.õ5uó¯xÙí¡ÂË*9‘㈠$}:ã17éZËlBŒ?ägfõÜ`°s"á C´ÐEkDä8À­Š€$ˆP8²N\…24Gl›·h&ňûaVÛ£_×[³ðK½ßNsr¨>Ø43ÃC˜xî¼÷»§¼µW`‹…¹ÍÚE)§*¦#‹æžr<|ÖŒt’¥Ÿö°Ï=³Ê»ãÈçÏöµÜ럯¶Zò¾®y"XÄ”$¼ªµ‹p (OfN€Q?ŽR Б±È- ýçãõrî)yz||W­W½a â€ÎVX M+ÏTé+-¦šãŽÙÎmU03úKmt¥H¤úg8HÐâµ€Hs¨YÐTÀA²èuV X3ð¢À]ÁñÄ8ÇŽP‘…\‚˜· D½}*5YS"®w)ØÜ1À€ èáÐ’)Ë/|ù,T¶ˆ1§˜mXl–ªyœA^â¢àtX) «¨V½Ô6"•"2›gÖÖKXEöV[dν˜VCbІ•Äk¥º;–èu^ò7Çš¬Š†8 Ù.cR®Ì^ ¡jç|% L¿Õͳ»­+Ö¢•Èe5ýû\Ñ[» µcEL1—}×H@f÷lb›§ŠöŽ©î·ùå[ÿšÃ=_sÇ#y´‡Ð*Tļ7Å_wpHÜâðìUH§jW×Vüp9t%4ìp¶VfƒD2„"P_h4|ç××ƃ¤§a•Ƽp‚Qo´‹<}<³^òKŠY ¿ªå¡1X‘,K2åPÔPˆPê*×ÀxtžÃ&˜kü’Ý Þ;(:Ñš²è±Áb^¯ßÑ=Ï~Î;Ö'G{>-|ÙçNvñ¢Õo>ª™øi!]U„ :–Rꊛ›ç¢ÁtŸàH¨i[ðè_¯æÀï4OàúøƒI= °€4€DBûµCõ쇣¾%[3qÊ~wb¥Ÿ¹n‹½ÌÍ$±l7Ü⮌Mi?íÜ犩TLøLžFFTfimÊ7Ð2=®‹wOðàR¼fQp§Ä*D5ŽL+ƒfî¹Þô–íÇ,4ã/è³a,sÐÁ(b<ñ7þK‚6ÎLëã~g,Ó*µ…4cb=ê@‚ $Ac'Àu +¦ZÀ#PŸâ–Tf¤êâ"DP‰âjв=2,ÓèÓ™•{ò¦¬¾ñUŠÕFÅz *€’ÕÞ~¨îNwåîíôÿÖYÙ«QFãnev ×Ö0iD P (!¤1HÑ•:ì<‹#Wå0½åC²¬ƒ,l¢Åvþ.¾/`÷‚Ão©žœ·ÚÌ®K׸-äÀ-UÔŸ,•<.6=p“Ö|‚íÀ-_Ú©¸Èœ*†ŒÛ’'„D~ÿµnÛåî·Ç’ªš@ Á"Xt-@Ò i! ×yÉ+ÇI•Håíg©ð¾Ðçr¿íüÿÂ^¿~}2ð|rWÉë鬿v×ÈŽKs™­{,"ŠLu>¯åºçÞyú}þR9ÆX5,”oMÚE!_“sØ —c³ìz¨’ E•9ÔŒiL›RîÇÛöóú?õïžû“é£ßiÊ.J¢&cðºŠ0Ô­àT’"ëõ*z’)eQ À² en,ìÉ<¨f œÙH`2‘îÛça×)ó´RøigzXEÚeC  xzÒ/Ÿþ˜3ôÙíç'mf~_ÇÛ;ùÞ™+Ôn§váU†ƒ®¡%òèqOÓÇÂÈX¶z€aÁ‹7.Þ¼k‘:™z¹Ó?'é©ññÞ†Ðy†œ½ovÞûåÒ®’:7pnÏË^lÇw2sO›öçèï_ o‹óÆœØ$QBŽ#ZÈ–h„A8VµdÌ*æ[p²ñüF½ì­[ÐAûAÜxœÑW0ú˜ô›òåj…?iîùw2ö5wvj‹ñ$2cÀU‚U‰¶ÝŸ× w@f>17œØƒ‰Íá BÏ5&ÖÅúŠ riÙAsL˜_Aɉv"hªgª‡1UWÞŒí”ø°ö­©ô½ìlHEº÷¢Zq‹×§×Ðݽ+Ð8–C¯ˆñà´ï­öêÛõ³7Ïý»'æwo鶸þaæ^ܼä_ý?.¼wÞ¾¸~Ó¥“^pFqΑ¬±mPœŸÒÓøž£a]PÖüÝ=ëòƒ¥ß›vÁ¯Jµ‘[^k( dGÌfcyï üqWÏÐ#bÖhà­'óûì«qðl[u\íu óã¼.ìøã…»LÌ-Ä#\íÀj(ˆŒÉ9ùzW¹S½ªËFÇç‘ݹT‰É¤ß.{›,ŠéÌO" æ.8z\¨â6Ò4tY»Ï°c°þÊZþéàçÇk:ló‘SWÍÌ绺iå×WÑ.±—¬ð{èdW[´¡î'îÒ >A-DaìÌ5©ÒduôBf_¨ïq3™qâU¿œ—œýÁÈÒ‘ø@‹d!÷óh¦–ßwÛ¥ÖCãã 0ÐÌÒT)¨ï7»ei}üâõtkF éÃJ9¯!üÞ]‚ÞbpöÀQõcøŽtˆÏÞ¹ÿzòø}™¿Ê;~ïX彌ÉsT˜¿XÙkª{@G«Ûµd˜ ƒýÓ³úh_[Õ-»25E›žÂ(¥¦ Y+ð$з`”3w|&Qljð0ùNT,l×°e”%uR D¼¤M‘>Ï9ãWáUp—=ê=j½ªHÕ‘’p@G>¶Sh]›íb¹P˼<È¡Ž·ëýE^*áÚ½WꓺížÔÑúj®ß šòbÑŒÔ(XvŒÇ£;mÙ\5+'àöó4ø³×ÐZtˆ•2EÏ«8˜åùÒ +Rõw:XYû[f×py;S‡]*Ÿ}Ûå7zÄàÁåÙtwf€?~–}—Y\¥W|à¿6ƒóWw¦› ·e:äLˆÑ–½¯¹® ´¿¨ È@ LåhÝ‚±DóêA\ÒBYÖÅ®ð%WŽì~Ô^gü8(w ×Nót¸÷^%á–"•ÝÜ^—W½ñò|<å7æv}p´¤žn·×¯=j%Ì«9·…WûYÉ«Âfù~_;÷J·¾×ï§ü@«ª 2ÌÆ:Ev*…GñƒÍ>}êv‡]~ñí®ûþÍ%mjìÛ=ï¦:žáGJùñm”™öaظùNÿ…$ìÆÚ>J‚:]&ŠüÐì[h¾ÕÈÂÏçúb6CK¨§3Ü:—&YÅ—¹íHÍÛ%~åO·9ýt9ü\ßx|¼ Iñ‚e.D°mDŠcpЬu:îz[ÄÐO ¶Ô®°ÊXÚ#W†JEÙ¦[¹+©a—Â`è'ŸÍkˆÊ÷žÄ¯Å-7kúñÁÆåUùh°½bƒäº›[}ÊîÈtE}-!\£¦¡%âY3Ùª²Ê Îçe]¾QjŒ(#5™Ry/¹‹ÿ3µaê±fv^ ®åŽò•¬8øjVV¼s€™RBDi¤pˆã÷ÌàqÍd^ÒQì  `™Ì¦"HéðQ&ˆ@±$~røÇ¼xy¤ÕàÒm× GÑè{wÇcxgNÍÔ îi/Ó}ëBžÕjÈP:”—²+ù‘ 0•“‘­iÄ.@º¢ž¤¯ŠŸ(_Ëœ´÷²;¨êuz)nžÞ1×îÓ·çš÷'DZû7˜ kήŸÔ–°{>LsàVVöj´%i`»–\)aå£Ðž_F 2 Ó$ІY–”ß¶¢‡9jÓ“Åvwþ’ ‹‚ï*ÙŸkš‰Kó™÷•(÷5Ž\ü2s³ªï*– Ƙ)$È‚¤††gXÕ1jÏŽóâÁžOÒé϶ÊÍõ¨Òñ¹˜âiI‚˜6"D^ÚS³]O7&NU”\#J¤ÝJ…ËÒr.ÉêÓ«¡äì ·ÐƒL6ë#6p9²à{e’š0HR©Pß…²c ›É·à`S*þëý_§`áoÕ&}Ÿ£Pß,°0÷€ ”ÕâœóWyÉÛ´?¾Ï˜ã÷Yþþ²œHs$3‰Ä“ôIÁC“AÁ/ " @ &¬ €5ÁÿSPßsó­Î¶sÔS,¢ÕŒ ô¯ \W8¡BräiQ§|MT« Zö›PâÕÇXRn¥7­î?ˆ¢€"$¦wýÿrê=J®åö;ã6ØEMÍVú‚eìMÈvÅkVfMÜÜez¹yú²ûÕ÷{\xiñ™½ÍuY¦Ö Mâõ*Hϲ?Î÷dW\u»V»«ºž#tÉ?·ßf¯1•qtЭ÷Ûþ]ã×eo»™YÃhžÌ—Éö<û4÷ŸÊÏŸÛÑJpR©+?2“¬Ùfר ˜Ö£¥½áݼßüýŸ-Â÷û¾¿&‹±æý à ®BÀZd¥€ ¬@lI@áÁB°ÆGxïì_K_¹?wøeÿÔÒs|°ù‡[üp&ëÔÝåÒ?Y8º~ñ= Ú1\$ôúÓÜÿ[—"Á;V¦gy~ü£Ï-Ü_»rr^õOTy ¯ˆ‘`m aH^ 6@Sèê è뇶.A3TÇ•i}|û\ÿÙßÿÕïáúʧ:¤ÕæÒ„(9A$ºJk™ªÇÉ•GݲDÆŒ!&Nåć•]inòóØg€‡.#¶{¤ÈR˦­$@{§?ni®¼¦ÇWÀ:Bí22@ý¡$"+`B¼>ú#ýåóg™¿~§ÿãG߿׸£_ËÅ1؈¤F9ms,3 œÁsB>Àe¶d2(\à™ÓKléF4;'ëÕ÷/Ú¿é¬~ÈMBƒ¨`ŽÐéeÉx&^Þ9>üþ¤>ºý’´ ÚõŠ#€Ói* +JÄX²–s`Þqò“=FFÇýôqŽýíóoŽ—#khƒÏ%àiµ×‘‰ÒÞŸ#V¸éVš #4Q˜ÜvƒcÔebk´òVÁвï|¯@/•.îæ4…À©Q|ÚYNŽyÜ*3Ø¥TÇ{³ãŠÄºÜ謆@8Çh!zNˆYßJ. ‚4áÀ,ïì乯˜KPZ¨ã©½u´þøî'…YC§h"÷Â~K•m{ìú×÷úŸ½äOú–ëϘùplý]§$P±u÷Ûÿ»_¶7¶ÎòîüÅ'f#zû;ãÿ¬ëuFÛ®§þáãßóCcƪË룷yà‰×€UJ# ÑÉ/Û*q}:©Â°÷VûXOÂ;°\;nÕãÍs¶ä"ç÷_w§ ³e@5‰Ô  '‹«„"8ÝÁ‡FŽy#X9—I:0}ÇdøZþþìþ-é±,öÌ9¢ÖÔpª±î{I_}Ý‚ßágüø„Jì#ÛO]zû¼‡Pb !É}F;Ôž£h?<-¥óê¡¡/”4¬’o”E°hȺÔ@û…fÄšðèð±£KÕŠh©+ÁFIkrm+¦©= ϺhÀhCŸ0K¤r1Ïœ:ã}ÜwúŸr¼ÝeŸµë,{ÌôÌ1ƒ@ÒAÒ$TSí:R¸a#¡­]öÜ»æ®ëËMl­®`-½ç|À¾_»¦Þ–I¯Ÿ,U6´o¿¡K#à{q¥QÜûð%Vé/RžÿâDmac'ׂØÏŽfü|pU3$^9f‰1¦ôÓ£Èäùê¼û~tê£p¦¬Ž7м-1á<7x“§‹¹ÝÐË‘ ¥àTÓ0o…]©Ú_ é̦ëLz¡{쉲k}Jùñ‘ݶEѪ乻ÿ\6g+î/‹VT»Z‘t3^˜IS’˜ÀF×MÒØ¥=}áÿžŒrˆoµÖÑ’¡¹M”ŠCØÎi"=Üd;B®BãljèÁ;dÃä¦cxG|!ža‹Né„§ yЇõ¨ÊÚuy‘ 6‹šðÍàÚ\æ¡ÕØ" ¨‹MaªÓSÁ Q&(ª\àAy¿ƒ9`ˆVkk½ÂN—Trk±Ë¡XkDÐ^”žžöŒŸÜÅÁî¬ ?̈;î”& ö<Þ ¹º|Ä–S_XÛ˜ ’Z·X… TG+Oq$cÎy­fFþ*5ªïx6r­j»Âå–TÕTJhÇÖ#´Â³sj|³›àyØ™1§^VÕ¶ƒùÁj×$˜ƒ½Nôûµ #ÂøDÒܧæüthñoÿ±û^ç€ÊËø(Þnßû¤Ø0ÌXn¹©FAŽðEñÿÞ•ÍÒ@w¢.ò%2÷RƒFÝêA l<èø¡?îÈűsVÚúFhê5ßg©G,ÛKß©rßA°á:÷{Þ¾ˆðÅ[ Ï}…äÞ}§åê¤w÷…Þeˆf[Lï ¡Ù8Ä¡K‘ d¤bÛ[}úípº2\–ÞÈÏýÑçg/‹¦  ?AEwÒÖ3ÖÙ# Ʋ  HA {ÔU²™€1üÊÉY-…¬[™£ ÐÙ:5¥d$Ãý'ãÇï”Ëyž–ÙLÝÅêžf  -vsÍïÅ÷vò>†‹®©":¼¼é;t±É1’¶r!¨À¶ãþqn¹°Y( :x—·S¹P Ê{!üJeJO²Më]òe“Ã|lš¹yÏÓ8–(-~/Ù•Ò|¿jJ•DÍžx`]*@W`ÈÑ"^&yÅÆDµ^ Œ`h[¹ ²~ Ñ¼ã 7–å)d¡ˆ2ŠMƒ)Q5žTŠ9ÐáÞ)Aªe´Í%,4¶†ã O/%_‚GP`´ÌáW{á$‘¤• ŠüMΫÒŠ­VÄ|h]lk`Ñ‚=€ÐtJÖRØÙ k¸©¢{ ‰qU‡^;éTù¬‹ëÚn¶Ÿ¼Nû§±•ïU?šlgæ\þ~ýÖdô+$F±Fkn#b¦K+vîÕ{ ®/§_»oÒ6ÌnÙ'×8KvËÁ°AÇ·æîØ|Ufùrÿºæ¢#;š¦-þ±aBtuBa\ðžÕ•† º²„¬;Ê*-Uª¶„à‰1 õ}ôɉ9¢«È ÂѤAéJGúKY–ÓDË× ¤ÔkÀtѺ]÷||ÇO?_ä£Y~ ÏJp ä ÿ \„š ¡&ª¡O#j؈£o.½-Ëؚ̱ üa&A–)qf§vΚ9.SãêÉ ³GWð3ùOs¦y[.øÀ—öe.ÃÑ'±TÙp¢qÖgPEm"Pº°•kí3[¢F)N·pŽFÒZ°ifƒˆa>o˜NîB#K-]ÔKA˜llÚ )ÝÓ[)‡„U‹ÝTj÷GËgnáù”H·:¢%<+¢Ó;ëÞ¿û4ÏÇw½üÃýÆë×ïþÇ;ýÿÔûÓy^ÕñL{êVÍ*UwÍEžà¿󶘔ñn^4oºŽ~wF1 ªfûØz"2Ê)ŽŽî$ê ÿ­6cïyˆW»IÃÖ\'8r¨˜;Èzl±Ÿ}uþô­w rc½‹ýñ+²­\ïÐâhÉbfÁ•Ɖ`~Í?Y¯JïÎþ5[OÃ2ŸË„Öäá™?zÕ¯¼*õaˆŽ22ì‡ÕÐ*Nb!y*¤wa4BCÑÐh•ØZºØ:ä 0€1OÌ·ç,’aß¾ ÓÊÊ GQ/ñû7_ÿ…÷˜<„¿Hur®›~„oÝq¢ÎX\3æ¿­q°ô4s+==^ u«®dù´ÂeŒDÍ 4ÑŸt¯ctài¸Gö"6Î1}žÚ,s Q6Ù-åCy0†á ¹`6ÍÆdüâBqÅ›™Èl´OÍFdy¯÷‘žW·¢a2Lþ’€¿1¬ÎVþå_kë#Ñx;+*õA®T›Þ‚wÿŸ† é`áç”_—WTW[àU LTŸ`Û ¹µÑ¯ç¿ÿþ¯ú÷>û§¯¿›Ù߯ÜËæ‘c ý~½ YêcÈì’¶9Î<ó±Ñ`?ÖK0(ìãÖº>ñõϯãñµÅýp¦%%b›žÑ(D„¨ê¶L( J¢ÒãÎP/‘N[ T Ñ]ûßû~™þò÷~yÌúpK§RNÅhÌ «Ò*ÒIèÊI¥—ÙŠ˜‹I%¯¦ˆ(Wü«­ôáþÛÿÉúç …ÞËP¸eÅiX è G\0:-Eж¦ß ¦f’û |À;Í®æ›âmÝ‚ BÇNbö#ÏÿÐÏ/ùëÛ¾ÿQç?}~/¯Í`—€Q¢¡ë4NõàЈqÀ“!½ÔŒÝâ«I‰P˜ Œ<ÜüÝyýëã\4:ÏX6w+ÆãP¹]9CB€‹yú¬BZ`y°K£@)UòEŒ¤…ZxHÙrÙmÀmˆaN”ñxÄÉ÷ü7ˆûá4>~k­¾ÿƒE|z5 t `=P±$ùØ}Ÿ2æ¢+6ê9¾o?¤ÙþhÿûCÇ÷ÏßðT‚U1Ý(aO™Xó¨gëã7Íɇ8ïõE–±î#×èèò¸]ò“p¿¥e×<Ý<~`uùØõ› ûòzþ |OàÓ‚«xL£ï˾{¯ v ^爖±‚xJ_s ÌÑ:wâݾê³ÿÁ_UÐhv‡ô§3†•¹‡+e¶¿Œ(‡ywüÎéb÷bøëéo³Ï:•/Ì;(`·r-m¾¼7ÿ 5RF´Þùûó,\sÊþ¹?^VýÐïÄÜv%ð̲{sÆmšA¾°ôÝÈ%M?p|©G(w~ìã•ÅÅË¥Ñz7 sŒ³ñvœW©Aƒ¹NÞ(Öd·GjŒèÑÍ™„(Ü”/ ¾Hè#Ì×9µw=-OCœà«mgƒ‚|ý°mKn®ÜóÄ®swÕÞ®Q8€^,m"'…žËàM8FK¢{8ä`µh݉ÚÄxËô-£¯]êÖz›÷7µv“‹þxj´äùJ÷6läC<˜ªÓaÔëÇïâÊý¸úÜ­?¤î@Bð"È,n¸À:ÁõòÜç/?ñ=* iÌìJ¨h©|O‘Gwôªƒ7ƒv}¹ù¡Vdd½&ß™¬a˜@Z no}HÁòŒmª^dØ:ï†é’ŸðѲ sm_IÔîÍ|:zÐV®`$rgEœÅÛ/ª›¡*s¤TïzÏJ& ÿ+šÞ;ðÕèÏ©g®Ÿ±1áâÝ¡Ëx«¼ÝŠ6YórÇnïÀX³èÀs=¢hpžj,¹ÙV1É]e>ü|¦" ™1sŠ¢ê£;Ù ¡´Ew¨QùÖýªüjôùŽ>Ð.yvm½-üËÑ»«åGÈþS¸ØÍöAYÒZ\PN,êL,±à^<–†˜jÚŸs^“ÿu-ðýó6–åxíUk µépq;nS¦Â xÏŸ(?’}Ÿ»>¿.†ÂqûŒHQŒØ†øŽÉÛHqÓI@»ý±ÊE¬©"½üòí·¯[f}Dâ+#¥:\»o=Ù-·îPX\þÛ÷æµÜûOúÿ _ù7ˆúŒ†øä*v0XÑ×^óp?î'lóààX¶œ?‹ÈIø3ª‡fäGë‚yáŸCó°³$7Ÿ=EI­¹ãÏ>p²°¸Ý¤9'ì|õýÇÿzþáwÿå*4Ï€ïúÝÂ=é:7à½ÕY;²p…êŠ }žs8Τbo³nzð¯~½ý‹÷/¼G©Øþ€òãW ½]Á{oDÉöd‚ª¤E–ÕVTåÇeÁùӳƔZXmØÙ=P–=t—ŽïëŽ)ùAžh¯^ øÕ~OÛæû¹¢pðµñçC½Ö±a…~^Ó^ð^Ê¿h­zØñ¨A`wáRýÞIE³úLoè€/áG¿÷çn±pñú ]´PŒï½é%Þ—âdÆôúýûòæ÷?ñšÞ€ÑœÏ¼|éÎú2·ŒkÏóº‰ßñ%±`7'k«¸pq„!C>•ÚR @b‘`Ø4øÖL*®‘ ¶Ö³¸¿¤O? þ q“7þ•sðK(Ó„¤;š ‚Ta•¡V I<¬Cèd¼f]$㜾¸ß]E2èq?…—³‰dô‚\buz¼Ùs‚C.Mð'ìLR «Uã¬êŠ/ðâ×ê'ªÂÿükyÌ=Þ'»ôZH ‘Ús Cà„ÌÞTþ›¸±FS\¬c˜ ±©Kë|Ê¥æ[ôãü’ìö$ê­¸[dzsâ|yV} —ö^¬lá‹£`»Ô‡$GÙWQ8–:1³Éþôù+ý:=Á&±†/ŸÐŒ=èr½½&‰\í…«¤–Ö{«Ÿ»á½ÿ=C½ŽVço-+Õ~a‹lmDÏðdÛ¤•Ü]Nøˆ¯ýFWï*oÆí )éˆtPz´Ñ]º·~cÛËs!uq̱æb¶ÏÙpù9¥Pq±-cÝêwãúQ…ûÖ«Ç:¶êwægoÊ×y86®¢û‚Ð=°ÀÁéŽr`„EÊ)BÍíýØ(4í¼'ßê‹.êÉ¡ÎeF0«¡=]àoÿ[¿‘ê”SÚç³çkþEöq¿M߯‘<À™Š ûÔ›ƒ!–³7#¡ªÔÏ7Ç4pÜd½jo¥†x¢É 2.Ãd›µÉÇ#a)TæQÒJªhKzÏ ùyu¾]ûií¸. ;ëwOs0ݯ4н™ÙéÌ“œ?÷ùf,ho»xµ)éÄõéÙí±ýÀËŽoÖá§÷RV_Ø P\Ï¿P^ïïxTã±ÂÐ}a1«N–'â¸X®iHsc©¬ÑMíV­5Ï_ß21Ô…Ú~Ç3¯áYC‰!ˆJXµhäGÖhx»ãZí—=¯_J Kze€Bå {B¸Ü{EIR†D•ƒÿçlö-³ó=žïÃþ~}_ðA8áÝ=«ˆà´ÜÐ&Ø9ŒAwT¾GÐbS\PÑ<'ÛÝòA–¯yE=ßœ1±f·Ú¢‘±úk§•shè;¼oµ{ô‡üþã›þ›t$<¤ùÿüs•ÿ9§àü„ÿoøÿÿؘòÿ?[Q€L ˆv†7'ùÚöø™'Ã÷²×á¸iv~Üçõ¸÷91¯œ½ $þ?ø¥^°…¾¨z‡øl+ý|¸ûÙ9÷Ð#OÍž: „E³ö:û¼ýó®8>˜Ç,èïYâðMÎ1’‡¢GÍòáÙWVÄ€´IÒÁÕö)Ó Rø­ËOõ!ZB탦ÝÓŸ&^sYkóµz2‰m?ÌÌdäb¥û*ÕlvÒ+¹ôþö/àÙW<®}ìvÆ›<9fͧ!Wz_«ôCöâÉÍ¿ªe„º¬àØUêGëy( Ž¢‘ÿ%Ò…øm½P´¸·y+ ­ñ0ʨjcð@T!P WÔl%…~ÌDýçà?0dŽ•Ža¬¶p(jœr ­JW ÐMâAtæ=ÞW¾âþßËþ_ªÿç°XDˆ0| £Œ6Ü.7J¦t²ï€ÛgwV[%¥¦s½sÕl=—æÅ @Ïõ=„ÎðLÊÝ—v’ ùµãz_Ѩt­„táW7=ðônÿPxþ€Î×±´G»©½(ÞÏ×…¬rµU½libwebp-1.4.0/cmake/0000755000014400001440000000000014606317060011133 5ustar libwebp-1.4.0/cmake/config.h.in0000644000014400001440000000641114606317060013160 0ustar /* Adapted from the autotools src/webp/config.h.in. */ /* Define if building universal (internal helper macro) */ /* TODO: handle properly in CMake */ #cmakedefine AC_APPLE_UNIVERSAL_BUILD 1 /* Set to 1 if __builtin_bswap16 is available */ #cmakedefine HAVE_BUILTIN_BSWAP16 1 /* Set to 1 if __builtin_bswap32 is available */ #cmakedefine HAVE_BUILTIN_BSWAP32 1 /* Set to 1 if __builtin_bswap64 is available */ #cmakedefine HAVE_BUILTIN_BSWAP64 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_CPU_FEATURES_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_GLUT_GLUT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_GL_GLUT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_OPENGL_GLUT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SHLWAPI_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UNISTD_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_WINCODEC_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_WINDOWS_H 1 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ /* TODO: handle properly in CMake */ #cmakedefine LT_OBJDIR "@LT_OBJDIR@" /* Name of package */ #cmakedefine PACKAGE "@PROJECT_NAME@" /* Define to the address where bug reports for this package should be sent. */ #cmakedefine PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" /* Define to the full name of this package. */ #cmakedefine PACKAGE_NAME "@PACKAGE_NAME@" /* Define to the full name and version of this package. */ #cmakedefine PACKAGE_STRING "@PACKAGE_STRING@" /* Define to the one symbol short name of this package. */ #cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@" /* Define to the home page for this package. */ #cmakedefine PACKAGE_URL "@PACKAGE_URL@" /* Define to the version of this package. */ #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@" /* Version number of package */ #cmakedefine VERSION "@VERSION@" /* Set to 1 if GIF library is installed */ #cmakedefine WEBP_HAVE_GIF 1 /* Set to 1 if OpenGL is supported */ #cmakedefine WEBP_HAVE_GL 1 /* Set to 1 if JPEG library is installed */ #cmakedefine WEBP_HAVE_JPEG 1 /* Set to 1 if NEON is supported */ #cmakedefine WEBP_HAVE_NEON /* Set to 1 if runtime detection of NEON is enabled */ /* TODO: handle properly in CMake */ #cmakedefine WEBP_HAVE_NEON_RTCD /* Set to 1 if PNG library is installed */ #cmakedefine WEBP_HAVE_PNG 1 /* Set to 1 if SDL library is installed */ #cmakedefine WEBP_HAVE_SDL 1 /* Set to 1 if SSE2 is supported */ #cmakedefine WEBP_HAVE_SSE2 1 /* Set to 1 if SSE4.1 is supported */ #cmakedefine WEBP_HAVE_SSE41 1 /* Set to 1 if TIFF library is installed */ #cmakedefine WEBP_HAVE_TIFF 1 /* Enable near lossless encoding */ #cmakedefine WEBP_NEAR_LOSSLESS 1 /* Undefine this to disable thread support. */ #cmakedefine WEBP_USE_THREAD 1 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif libwebp-1.4.0/cmake/cpu.cmake0000644000014400001440000001427314606317060012733 0ustar # Copyright (c) 2021 Google LLC. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. # Check for SIMD extensions. include(CMakePushCheckState) function(webp_check_compiler_flag WEBP_SIMD_FLAG ENABLE_SIMD) if(NOT ENABLE_SIMD) message(STATUS "Disabling ${WEBP_SIMD_FLAG} optimization.") set(WEBP_HAVE_${WEBP_SIMD_FLAG} 0 PARENT_SCOPE) return() endif() unset(WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG} CACHE) cmake_push_check_state() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}) check_c_source_compiles( " #include \"${CMAKE_CURRENT_LIST_DIR}/../src/dsp/dsp.h\" int main(void) { #if !defined(WEBP_USE_${WEBP_SIMD_FLAG}) this is not valid code #endif return 0; } " WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG}) cmake_pop_check_state() if(WEBP_HAVE_FLAG_${WEBP_SIMD_FLAG}) set(WEBP_HAVE_${WEBP_SIMD_FLAG} 1 PARENT_SCOPE) else() set(WEBP_HAVE_${WEBP_SIMD_FLAG} 0 PARENT_SCOPE) endif() endfunction() # those are included in the names of WEBP_USE_* in c++ code. set(WEBP_SIMD_FLAGS "SSE41;SSE2;MIPS32;MIPS_DSP_R2;NEON;MSA") set(WEBP_SIMD_FILE_EXTENSIONS "_sse41.c;_sse2.c;_mips32.c;_mips_dsp_r2.c;_neon.c;_msa.c") if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC") # With at least Visual Studio 12 (2013)+ /arch is not necessary to build SSE2 # or SSE4 code unless a lesser /arch is forced. MSVC does not have a SSE4 # flag, but an AVX one. Using that with SSE4 code risks generating illegal # instructions when used on machines with SSE4 only. The flags are left for # older (untested) versions to avoid any potential compatibility issues. if(MSVC_VERSION GREATER_EQUAL 1800 AND NOT CMAKE_C_FLAGS MATCHES "/arch:") set(SIMD_ENABLE_FLAGS) else() set(SIMD_ENABLE_FLAGS "/arch:AVX;/arch:SSE2;;;;") endif() set(SIMD_DISABLE_FLAGS) else() set(SIMD_ENABLE_FLAGS "-msse4.1;-msse2;-mips32;-mdspr2;-mfpu=neon;-mmsa") set(SIMD_DISABLE_FLAGS "-mno-sse4.1;-mno-sse2;;-mno-dspr2;;-mno-msa") endif() set(WEBP_SIMD_FILES_TO_INCLUDE) set(WEBP_SIMD_FLAGS_TO_INCLUDE) if(ANDROID AND ANDROID_ABI) if(${ANDROID_ABI} STREQUAL "armeabi-v7a") # This is because Android studio uses the configuration "-march=armv7-a # -mfloat-abi=softfp -mfpu=vfpv3-d16" that does not trigger neon # optimizations but should (as this configuration does not exist anymore). set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon ") endif() endif() list(LENGTH WEBP_SIMD_FLAGS WEBP_SIMD_FLAGS_LENGTH) math(EXPR WEBP_SIMD_FLAGS_RANGE "${WEBP_SIMD_FLAGS_LENGTH} - 1") foreach(I_SIMD RANGE ${WEBP_SIMD_FLAGS_RANGE}) # With Emscripten 2.0.9 -msimd128 -mfpu=neon will enable NEON, but the source # will fail to compile. if(EMSCRIPTEN AND ${I_SIMD} GREATER_EQUAL 2) break() endif() list(GET WEBP_SIMD_FLAGS ${I_SIMD} WEBP_SIMD_FLAG) # First try with no extra flag added as the compiler might have default flags # (especially on Android). unset(WEBP_HAVE_${WEBP_SIMD_FLAG} CACHE) cmake_push_check_state() set(CMAKE_REQUIRED_FLAGS) webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD}) if(NOT WEBP_HAVE_${WEBP_SIMD_FLAG}) list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) if(EMSCRIPTEN) set(SIMD_COMPILE_FLAG "-msimd128 ${SIMD_COMPILE_FLAG}") endif() set(CMAKE_REQUIRED_FLAGS ${SIMD_COMPILE_FLAG}) webp_check_compiler_flag(${WEBP_SIMD_FLAG} ${WEBP_ENABLE_SIMD}) else() if(MSVC AND SIMD_ENABLE_FLAGS) # The detection for SSE2/SSE4 support under MSVC is based on the compiler # version so e.g., clang-cl will require flags to enable the assembly. list(GET SIMD_ENABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) else() set(SIMD_COMPILE_FLAG " ") endif() endif() # Check which files we should include or not. list(GET WEBP_SIMD_FILE_EXTENSIONS ${I_SIMD} WEBP_SIMD_FILE_EXTENSION) file(GLOB SIMD_FILES "${CMAKE_CURRENT_LIST_DIR}/../sharpyuv/*${WEBP_SIMD_FILE_EXTENSION}" "${CMAKE_CURRENT_LIST_DIR}/../src/dsp/*${WEBP_SIMD_FILE_EXTENSION}") if(WEBP_HAVE_${WEBP_SIMD_FLAG}) # Memorize the file and flags. foreach(FILE ${SIMD_FILES}) list(APPEND WEBP_SIMD_FILES_TO_INCLUDE ${FILE}) list(APPEND WEBP_SIMD_FLAGS_TO_INCLUDE ${SIMD_COMPILE_FLAG}) endforeach() else() # Remove the file from the list. foreach(FILE ${SIMD_FILES}) list(APPEND WEBP_SIMD_FILES_NOT_TO_INCLUDE ${FILE}) endforeach() # Explicitly disable SIMD. if(SIMD_DISABLE_FLAGS) list(GET SIMD_DISABLE_FLAGS ${I_SIMD} SIMD_COMPILE_FLAG) include(CheckCCompilerFlag) if(SIMD_COMPILE_FLAG) # Between 3.17.0 and 3.18.2 check_cxx_compiler_flag() sets a normal # variable at parent scope while check_cxx_source_compiles() continues # to set an internal cache variable, so we unset both to avoid the # failure / success state persisting between checks. See # https://gitlab.kitware.com/cmake/cmake/-/issues/21207. unset(HAS_COMPILE_FLAG) unset(HAS_COMPILE_FLAG CACHE) check_c_compiler_flag(${SIMD_COMPILE_FLAG} HAS_COMPILE_FLAG) if(HAS_COMPILE_FLAG) # Do one more check for Clang to circumvent CMake issue 13194. if(COMMAND check_compiler_flag_common_patterns) # Only in CMake 3.0 and above. check_compiler_flag_common_patterns(COMMON_PATTERNS) else() set(COMMON_PATTERNS) endif() set(CMAKE_REQUIRED_DEFINITIONS ${SIMD_COMPILE_FLAG}) check_c_source_compiles( "int main(void) {return 0;}" FLAG_${SIMD_COMPILE_FLAG} FAIL_REGEX "warning: argument unused during compilation:" ${COMMON_PATTERNS}) if(NOT FLAG_${SIMD_COMPILE_FLAG}) unset(HAS_COMPILE_FLAG) unset(HAS_COMPILE_FLAG CACHE) endif() endif() if(HAS_COMPILE_FLAG) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SIMD_COMPILE_FLAG}") endif() endif() endif() endif() cmake_pop_check_state() endforeach() libwebp-1.4.0/cmake/WebPConfig.cmake.in0000644000014400001440000000102014606317060014516 0ustar set(WebP_VERSION @PROJECT_VERSION@) set(WEBP_VERSION ${WebP_VERSION}) @PACKAGE_INIT@ if(@WEBP_USE_THREAD@) include(CMakeFindDependencyMacro) find_dependency(Threads REQUIRED) endif() include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") set_and_check(WebP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") set(WebP_INCLUDE_DIRS ${WebP_INCLUDE_DIR}) set(WEBP_INCLUDE_DIRS ${WebP_INCLUDE_DIR}) set(WebP_LIBRARIES "@INSTALLED_LIBRARIES@") set(WEBP_LIBRARIES "${WebP_LIBRARIES}") check_required_components(WebP) libwebp-1.4.0/cmake/deps.cmake0000644000014400001440000001206114606317060013070 0ustar # Copyright (c) 2021 Google LLC. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. # Generate the config.h to compile with specific intrinsics / libs. # Check for compiler options. include(CheckCSourceCompiles) check_c_source_compiles( " int main(void) { (void)__builtin_bswap16(0); return 0; } " HAVE_BUILTIN_BSWAP16) check_c_source_compiles( " int main(void) { (void)__builtin_bswap32(0); return 0; } " HAVE_BUILTIN_BSWAP32) check_c_source_compiles( " int main(void) { (void)__builtin_bswap64(0); return 0; } " HAVE_BUILTIN_BSWAP64) # Check for libraries. if(WEBP_USE_THREAD) find_package(Threads) if(Threads_FOUND) # work around cmake bug on QNX (https://cmake.org/Bug/view.php?id=11333) if(CMAKE_USE_PTHREADS_INIT AND NOT CMAKE_SYSTEM_NAME STREQUAL "QNX") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") endif() list(APPEND WEBP_DEP_LIBRARIES Threads::Threads) endif() set(WEBP_USE_THREAD ${Threads_FOUND}) endif() # TODO: this seems unused, check with autotools. set(LT_OBJDIR ".libs/") # Only useful for vwebp, so useless for now. find_package(OpenGL) set(WEBP_HAVE_GL ${OPENGL_FOUND}) # Check if we need to link to the C math library. We do not look for it as it is # not found when cross-compiling, while it is here. check_c_source_compiles( " #include int main(int argc, char** argv) { return (int)pow(argc, 2.5); } " HAVE_MATH_LIBRARY) if(NOT HAVE_MATH_LIBRARY) message(STATUS "Adding -lm flag.") list(APPEND SHARPYUV_DEP_LIBRARIES m) list(APPEND WEBP_DEP_LIBRARIES m) endif() # Find the standard image libraries. set(WEBP_DEP_IMG_LIBRARIES) set(WEBP_DEP_IMG_INCLUDE_DIRS) if(WEBP_FIND_IMG_LIBS) foreach(I_LIB PNG JPEG TIFF) # Disable tiff when compiling in static mode as it is failing on Ubuntu. if(WEBP_LINK_STATIC AND ${I_LIB} STREQUAL "TIFF") message(STATUS "TIFF is disabled when statically linking.") continue() endif() find_package(${I_LIB}) set(WEBP_HAVE_${I_LIB} ${${I_LIB}_FOUND}) if(${I_LIB}_FOUND) list(APPEND WEBP_DEP_IMG_LIBRARIES ${${I_LIB}_LIBRARIES}) list(APPEND WEBP_DEP_IMG_INCLUDE_DIRS ${${I_LIB}_INCLUDE_DIR} ${${I_LIB}_INCLUDE_DIRS}) endif() endforeach() if(WEBP_DEP_IMG_INCLUDE_DIRS) list(REMOVE_DUPLICATES WEBP_DEP_IMG_INCLUDE_DIRS) endif() # GIF detection, gifdec isn't part of the imageio lib. include(CMakePushCheckState) set(WEBP_DEP_GIF_LIBRARIES) set(WEBP_DEP_GIF_INCLUDE_DIRS) find_package(GIF) set(WEBP_HAVE_GIF ${GIF_FOUND}) if(GIF_FOUND) # GIF find_package only locates the header and library, it doesn't fail # compile tests when detecting the version, but falls back to 3 (as of at # least cmake 3.7.2). Make sure the library links to avoid incorrect # detection when cross compiling. cmake_push_check_state() set(CMAKE_REQUIRED_LIBRARIES ${GIF_LIBRARIES}) set(CMAKE_REQUIRED_INCLUDES ${GIF_INCLUDE_DIR}) check_c_source_compiles( " #include int main(void) { (void)DGifOpenFileHandle; return 0; } " GIF_COMPILES) cmake_pop_check_state() if(GIF_COMPILES) list(APPEND WEBP_DEP_GIF_LIBRARIES ${GIF_LIBRARIES}) list(APPEND WEBP_DEP_GIF_INCLUDE_DIRS ${GIF_INCLUDE_DIR}) else() unset(GIF_FOUND) endif() endif() endif() # Check for specific headers. include(CheckIncludeFiles) check_include_files(GLUT/glut.h HAVE_GLUT_GLUT_H) check_include_files(GL/glut.h HAVE_GL_GLUT_H) check_include_files(OpenGL/glut.h HAVE_OPENGL_GLUT_H) check_include_files(shlwapi.h HAVE_SHLWAPI_H) check_include_files(unistd.h HAVE_UNISTD_H) check_include_files(wincodec.h HAVE_WINCODEC_H) check_include_files(windows.h HAVE_WINDOWS_H) # Windows specifics if(HAVE_WINCODEC_H) list(APPEND WEBP_DEP_LIBRARIES shlwapi ole32 windowscodecs) endif() # Check for SIMD extensions. include(${CMAKE_CURRENT_LIST_DIR}/cpu.cmake) # Define extra info. set(PACKAGE ${PROJECT_NAME}) set(PACKAGE_NAME ${PROJECT_NAME}) # Read from configure.ac. file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_AC) string(REGEX MATCHALL "\\[([0-9a-z\\.:/]*)\\]" CONFIGURE_AC_PACKAGE_INFO ${CONFIGURE_AC}) function(strip_bracket VAR) string(LENGTH ${${VAR}} TMP_LEN) math(EXPR TMP_LEN ${TMP_LEN}-2) string(SUBSTRING ${${VAR}} 1 ${TMP_LEN} TMP_SUB) set(${VAR} ${TMP_SUB} PARENT_SCOPE) endfunction() list(GET CONFIGURE_AC_PACKAGE_INFO 1 PACKAGE_VERSION) strip_bracket(PACKAGE_VERSION) list(GET CONFIGURE_AC_PACKAGE_INFO 2 PACKAGE_BUGREPORT) strip_bracket(PACKAGE_BUGREPORT) list(GET CONFIGURE_AC_PACKAGE_INFO 3 PACKAGE_URL) strip_bracket(PACKAGE_URL) # Build more info. set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME ${PACKAGE_NAME}) set(VERSION ${PACKAGE_VERSION}) libwebp-1.4.0/configure0000755000014400001440000205615714606317243012005 0ustar #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for libwebp 1.4.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://bugs.chromium.org/p/webp about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libwebp' PACKAGE_TARNAME='libwebp' PACKAGE_VERSION='1.4.0' PACKAGE_STRING='libwebp 1.4.0' PACKAGE_BUGREPORT='https://bugs.chromium.org/p/webp' PACKAGE_URL='https://developers.google.com/speed/webp' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS webp_libname_prefix USE_SWAP_16BIT_CSP BUILD_WEBPINFO_FALSE BUILD_WEBPINFO_TRUE BUILD_IMG2WEBP_FALSE BUILD_IMG2WEBP_TRUE BUILD_GIF2WEBP_FALSE BUILD_GIF2WEBP_TRUE BUILD_ANIMDIFF_FALSE BUILD_ANIMDIFF_TRUE GIF_INCLUDES GIF_LIBS TIFF_INCLUDES TIFF_LIBS JPEG_INCLUDES JPEG_LIBS PNG_INCLUDES PNG_LIBS LIBPNG_CONFIG BUILD_VWEBP_SDL_FALSE BUILD_VWEBP_SDL_TRUE SDL_INCLUDES SDL_LIBS LIBSDL_CONFIG BUILD_VWEBP_FALSE BUILD_VWEBP_TRUE GL_INCLUDES GL_LIBS PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config NEON_FLAGS SSE2_FLAGS SSE41_FLAGS AM_CFLAGS pkgconfigdir AM_CPPFLAGS BUILD_EXTRAS_FALSE BUILD_EXTRAS_TRUE BUILD_LIBWEBPDECODER_FALSE BUILD_LIBWEBPDECODER_TRUE BUILD_DEMUX_FALSE BUILD_DEMUX_TRUE BUILD_MUX_FALSE BUILD_MUX_TRUE LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB DLLTOOL OBJDUMP FILECMD LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_ct_AR AR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock enable_everything enable_libwebpmux enable_libwebpdemux enable_libwebpdecoder enable_libwebpextras enable_asserts with_pkgconfigdir enable_sse4_1 enable_sse2 enable_neon enable_neon_rtcd enable_threading enable_gl with_glincludedir with_gllibdir enable_sdl with_sdlincludedir with_sdllibdir enable_png with_pngincludedir with_pnglibdir enable_jpeg with_jpegincludedir with_jpeglibdir enable_tiff with_tiffincludedir with_tifflibdir enable_gif with_gifincludedir with_giflibdir enable_wic enable_swap_16bit_csp enable_near_lossless ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures libwebp 1.4.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libwebp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libwebp 1.4.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-everything Enable all optional targets. These can still be disabled with --disable-target --disable-libwebpmux Disable libwebpmux [default=no] --disable-libwebpdemux Disable libwebpdemux [default=no] --enable-libwebpdecoder Build libwebpdecoder [default=no] --enable-libwebpextras Build libwebpextras [default=no] --enable-asserts Enable assert checks --disable-sse4.1 Disable detection of SSE4.1 support [default=auto] --disable-sse2 Disable detection of SSE2 support [default=auto] --disable-neon Disable detection of NEON support [default=auto] --disable-neon-rtcd Disable runtime detection of NEON support via /proc/cpuinfo on Linux hosts [default=auto] --disable-threading Disable detection of thread support --disable-gl Disable detection of OpenGL support [default=auto] --disable-sdl Disable detection of SDL support [default=auto] --disable-png Disable detection of PNG format support [default=auto] --disable-jpeg Disable detection of JPEG format support [default=auto] --disable-tiff Disable detection of TIFF format support [default=auto] --disable-gif Disable detection of GIF format support [default=auto] --disable-wic Disable Windows Imaging Component (WIC) detection. [default=auto] --enable-swap-16bit-csp Enable byte swap for 16 bit colorspaces --disable-near-lossless Disable near lossless encoding Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-pkgconfigdir=DIR Path to the pkgconfig directory [LIBDIR/pkgconfig] --with-glincludedir=DIR use GL includes from DIR --with-gllibdir=DIR use GL libraries from DIR --with-sdlincludedir=DIR use SDL includes from DIR --with-sdllibdir=DIR use SDL libraries from DIR --with-pngincludedir=DIR use PNG includes from DIR --with-pnglibdir=DIR use PNG libraries from DIR --with-jpegincludedir=DIR use JPEG includes from DIR --with-jpeglibdir=DIR use JPEG libraries from DIR --with-tiffincludedir=DIR use TIFF includes from DIR --with-tifflibdir=DIR use TIFF libraries from DIR --with-gifincludedir=DIR use GIF includes from DIR --with-giflibdir=DIR use GIF libraries from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory LT_SYS_LIBRARY_PATH User-defined run-time library search path. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . libwebp home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libwebp configure 1.4.0 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libwebp $as_me 1.4.0, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" # Auxiliary files required by this configure script. ac_aux_files="ltmain.sh compile ar-lib missing install-sh config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libwebp' VERSION='1.4.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 printf %s "checking the archiver ($AR) interface... " >&6; } if test ${am_cv_ar_interface+y} then : printf %s "(cached) " >&6 else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO" then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 printf "%s\n" "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.7' macro_revision='2.4.7' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in fgrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else $as_nop i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_reload_flag='-r' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. set dummy ${ac_tool_prefix}file; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FILECMD="${ac_tool_prefix}file" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 printf "%s\n" "$FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_FILECMD"; then ac_ct_FILECMD=$FILECMD # Extract the first word of "file", so it can be a program name with args. set dummy file; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FILECMD+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_FILECMD"; then ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FILECMD="file" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD if test -n "$ac_ct_FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 printf "%s\n" "$ac_ct_FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_FILECMD" = x; then FILECMD=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FILECMD=$ac_ct_FILECMD fi else FILECMD="$ac_cv_prog_FILECMD" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because thats what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else $as_nop with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else $as_nop lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else $as_nop lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[012],*|,*powerpc*-darwin[5-8]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes then : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_shared=yes fi # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_static=yes fi # Check whether --with-pic was given. if test ${with_pic+y} then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop pic_mode=default fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else $as_nop if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else $as_nop lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char shl_load (); int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else $as_nop ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else $as_nop ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dld_link (); int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else $as_nop ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "checking whether stripping libraries is possible... " >&6; } if test -z "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # Check whether --enable-everything was given. if test ${enable_everything+y} then : enableval=$enable_everything; test "${enable_libsharpyuv+set}" = "set" || enable_libsharpyuv=$enableval test "${enable_libwebpdecoder+set}" = "set" || enable_libwebpdecoder=$enableval test "${enable_libwebpdemux+set}" = "set" || enable_libwebpdemux=$enableval test "${enable_libwebpextras+set}" = "set" || enable_libwebpextras=$enableval test "${enable_libwebpmux+set}" = "set" || enable_libwebpmux=$enableval fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libwebpmux is to be built" >&5 printf %s "checking whether libwebpmux is to be built... " >&6; } # Check whether --enable-libwebpmux was given. if test ${enable_libwebpmux+y} then : enableval=$enable_libwebpmux; else $as_nop enable_libwebpmux=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_libwebpmux-no}" >&5 printf "%s\n" "${enable_libwebpmux-no}" >&6; } if test "$enable_libwebpmux" = "yes"; then BUILD_MUX_TRUE= BUILD_MUX_FALSE='#' else BUILD_MUX_TRUE='#' BUILD_MUX_FALSE= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libwebpdemux is to be built" >&5 printf %s "checking whether libwebpdemux is to be built... " >&6; } # Check whether --enable-libwebpdemux was given. if test ${enable_libwebpdemux+y} then : enableval=$enable_libwebpdemux; else $as_nop enable_libwebpdemux=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_libwebpdemux-no}" >&5 printf "%s\n" "${enable_libwebpdemux-no}" >&6; } if test "$enable_libwebpdemux" = "yes"; then BUILD_DEMUX_TRUE= BUILD_DEMUX_FALSE='#' else BUILD_DEMUX_TRUE='#' BUILD_DEMUX_FALSE= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether decoder library is to be built" >&5 printf %s "checking whether decoder library is to be built... " >&6; } # Check whether --enable-libwebpdecoder was given. if test ${enable_libwebpdecoder+y} then : enableval=$enable_libwebpdecoder; fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_libwebpdecoder-no}" >&5 printf "%s\n" "${enable_libwebpdecoder-no}" >&6; } if test "$enable_libwebpdecoder" = "yes"; then BUILD_LIBWEBPDECODER_TRUE= BUILD_LIBWEBPDECODER_FALSE='#' else BUILD_LIBWEBPDECODER_TRUE='#' BUILD_LIBWEBPDECODER_FALSE= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libwebpextras is to be built" >&5 printf %s "checking whether libwebpextras is to be built... " >&6; } # Check whether --enable-libwebpextras was given. if test ${enable_libwebpextras+y} then : enableval=$enable_libwebpextras; fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_libwebpextras-no}" >&5 printf "%s\n" "${enable_libwebpextras-no}" >&6; } if test "$enable_libwebpextras" = "yes"; then BUILD_EXTRAS_TRUE= BUILD_EXTRAS_FALSE='#' else BUILD_EXTRAS_TRUE='#' BUILD_EXTRAS_FALSE= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether asserts are enabled" >&5 printf %s "checking whether asserts are enabled... " >&6; } # Check whether --enable-asserts was given. if test ${enable_asserts+y} then : enableval=$enable_asserts; fi if test "x${enable_asserts-no}" = "xno"; then AM_CPPFLAGS="${AM_CPPFLAGS} -DNDEBUG" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_asserts-no}" >&5 printf "%s\n" "${enable_asserts-no}" >&6; } # Check whether --with-pkgconfigdir was given. if test ${with_pkgconfigdir+y} then : withval=$with_pkgconfigdir; pkgconfigdir="$withval" else $as_nop pkgconfigdir='${libdir}/pkgconfig' fi SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -fvisibility=hidden" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -fvisibility=hidden" >&5 printf %s "checking whether $CC supports -fvisibility=hidden... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -fvisibility=hidden" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wall" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wall" >&5 printf %s "checking whether $CC supports -Wall... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wall" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wconstant-conversion" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wconstant-conversion" >&5 printf %s "checking whether $CC supports -Wconstant-conversion... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wconstant-conversion" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wdeclaration-after-statement" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wdeclaration-after-statement" >&5 printf %s "checking whether $CC supports -Wdeclaration-after-statement... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wdeclaration-after-statement" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wextra" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wextra" >&5 printf %s "checking whether $CC supports -Wextra... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wextra" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wextra-semi-stmt" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wextra-semi-stmt" >&5 printf %s "checking whether $CC supports -Wextra-semi-stmt... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wextra-semi-stmt" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wfloat-conversion" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wfloat-conversion" >&5 printf %s "checking whether $CC supports -Wfloat-conversion... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wfloat-conversion" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wformat -Wformat-nonliteral" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wformat -Wformat-nonliteral" >&5 printf %s "checking whether $CC supports -Wformat -Wformat-nonliteral... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wformat -Wformat-nonliteral" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wformat -Wformat-security" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wformat -Wformat-security" >&5 printf %s "checking whether $CC supports -Wformat -Wformat-security... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wformat -Wformat-security" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wmissing-declarations" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wmissing-declarations" >&5 printf %s "checking whether $CC supports -Wmissing-declarations... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wmissing-declarations" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wmissing-prototypes" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wmissing-prototypes" >&5 printf %s "checking whether $CC supports -Wmissing-prototypes... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wmissing-prototypes" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wold-style-definition" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wold-style-definition" >&5 printf %s "checking whether $CC supports -Wold-style-definition... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wold-style-definition" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wparentheses-equality" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wparentheses-equality" >&5 printf %s "checking whether $CC supports -Wparentheses-equality... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wparentheses-equality" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wshadow" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wshadow" >&5 printf %s "checking whether $CC supports -Wshadow... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wshadow" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wshorten-64-to-32" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wshorten-64-to-32" >&5 printf %s "checking whether $CC supports -Wshorten-64-to-32... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wshorten-64-to-32" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wstrict-prototypes" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wstrict-prototypes" >&5 printf %s "checking whether $CC supports -Wstrict-prototypes... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wstrict-prototypes" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wundef" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wundef" >&5 printf %s "checking whether $CC supports -Wundef... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wundef" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wunreachable-code-aggressive" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wunreachable-code-aggressive" >&5 printf %s "checking whether $CC supports -Wunreachable-code-aggressive... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wunreachable-code-aggressive" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wunreachable-code" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wunreachable-code" >&5 printf %s "checking whether $CC supports -Wunreachable-code... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wunreachable-code" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wunused-but-set-variable" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wunused-but-set-variable" >&5 printf %s "checking whether $CC supports -Wunused-but-set-variable... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wunused-but-set-variable" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wunused" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wunused" >&5 printf %s "checking whether $CC supports -Wunused... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wunused" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wvla" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wvla" >&5 printf %s "checking whether $CC supports -Wvla... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wvla" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62040 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61622 if test "$GCC" = "yes" then : gcc_version=`$CC -dumpversion` gcc_wht_bug="" case "$host_cpu" in aarch64|arm64) case "$gcc_version" in 4.9|4.9.0|4.9.1) gcc_wht_bug=yes ;; esac esac if test "$gcc_wht_bug" = "yes" then : SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -frename-registers" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -frename-registers" >&5 printf %s "checking whether $CC supports -frename-registers... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -frename-registers" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" fi fi # Use -flax-vector-conversions, if available, when building intrinsics with # older versions of gcc. The flag appeared in 4.3.x, but if backported, and # -fno-lax-vector-conversions is set, errors may occur with the intrinsics # files along with the older system includes, e.g., emmintrin.h. # Originally observed with cc (GCC) 4.2.1 20070831 patched [FreeBSD] (9.3). # https://bugs.chromium.org/p/webp/issues/detail?id=274 if test "$GCC" = "yes" then : case "$host_cpu" in amd64|i?86|x86_64) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if !defined(__clang__) && defined(__GNUC__) && \ ((__GNUC__ << 8) | __GNUC_MINOR__) < 0x403 #error old gcc #endif int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -flax-vector-conversions" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -flax-vector-conversions" >&5 printf %s "checking whether $CC supports -flax-vector-conversions... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } INTRINSICS_CFLAGS="${INTRINSICS_CFLAGS} -flax-vector-conversions" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi # Check whether --enable-sse4.1 was given. if test ${enable_sse4_1+y} then : enableval=$enable_sse4_1; fi if test "x$enable_sse4_1" != "xno" -a "x$enable_sse2" != "xno" then : SSE41_FLAGS="$INTRINSICS_CFLAGS $SSE41_FLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -msse4.1" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -msse4.1" >&5 printf %s "checking whether $CC supports -msse4.1... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SSE41_FLAGS="${SSE41_FLAGS} -msse4.1" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" if test -n "$SSE41_FLAGS" then : SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $SSE41_FLAGS" ac_fn_c_check_header_compile "$LINENO" "smmintrin.h" "ac_cv_header_smmintrin_h" "$ac_includes_default" if test "x$ac_cv_header_smmintrin_h" = xyes then : printf "%s\n" "#define WEBP_HAVE_SSE41 1" >>confdefs.h else $as_nop SSE41_FLAGS="" fi CFLAGS=$SAVED_CFLAGS fi fi # Check whether --enable-sse2 was given. if test ${enable_sse2+y} then : enableval=$enable_sse2; fi if test "x$enable_sse2" != "xno" then : SSE2_FLAGS="$INTRINSICS_CFLAGS $SSE2_FLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -msse2" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -msse2" >&5 printf %s "checking whether $CC supports -msse2... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SSE2_FLAGS="${SSE2_FLAGS} -msse2" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" if test -n "$SSE2_FLAGS" then : SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $SSE2_FLAGS" ac_fn_c_check_header_compile "$LINENO" "emmintrin.h" "ac_cv_header_emmintrin_h" "$ac_includes_default" if test "x$ac_cv_header_emmintrin_h" = xyes then : printf "%s\n" "#define WEBP_HAVE_SSE2 1" >>confdefs.h else $as_nop SSE2_FLAGS="" fi CFLAGS=$SAVED_CFLAGS fi fi # Check whether --enable-neon was given. if test ${enable_neon+y} then : enableval=$enable_neon; fi # Check whether --enable-neon_rtcd was given. if test ${enable_neon_rtcd+y} then : enableval=$enable_neon_rtcd; fi # For ARM(7) hosts: # Both NEON flags unset and NEON support detected = build all modules with NEON # NEON detected with the use of -mfpu=neon = build only NEON modules with NEON if test "x$enable_neon" != "xno" then : case "$host_cpu" in arm|armv7*) # Test for NEON support without flags before falling back to -mfpu=neon for flag in '' '-mfpu=neon'; do LOCAL_NEON_FLAGS="$INTRINSICS_CFLAGS $NEON_FLAGS" SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror $flag" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $flag" >&5 printf %s "checking whether $CC supports $flag... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } LOCAL_NEON_FLAGS="${LOCAL_NEON_FLAGS} $flag" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $LOCAL_NEON_FLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(void) { int8x8_t v = vdup_n_s8(0); (void)v; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : NEON_FLAGS="$(echo $LOCAL_NEON_FLAGS | $SED 's/^ *//')" if test -n "$NEON_FLAGS" then : if test "${host_os%%-*}" = "linux" -o \ "x$enable_neon_rtcd" = "xno" then : CFLAGS=$SAVED_CFLAGS printf "%s\n" "#define WEBP_HAVE_NEON 1" >>confdefs.h break else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: NEON runtime cpu-detection is unavailable for ${host_os%%-*}. Force with CFLAGS=-mfpu=neon or --disable-neon-rtcd." >&5 printf "%s\n" "$as_me: WARNING: NEON runtime cpu-detection is unavailable for ${host_os%%-*}. Force with CFLAGS=-mfpu=neon or --disable-neon-rtcd." >&2;} enable_neon_rtcd=no NEON_FLAGS="" fi else $as_nop CFLAGS=$SAVED_CFLAGS printf "%s\n" "#define WEBP_HAVE_NEON 1" >>confdefs.h break fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$SAVED_CFLAGS done if test -n "$NEON_FLAGS" then : # If NEON is available and rtcd is disabled apply NEON_FLAGS globally. if test "x$enable_neon_rtcd" = "xno" then : AM_CFLAGS="$AM_CFLAGS $NEON_FLAGS" NEON_FLAGS="" else $as_nop printf "%s\n" "#define WEBP_HAVE_NEON_RTCD 1" >>confdefs.h fi fi case "$host_os" in *android*) ac_fn_c_check_header_compile "$LINENO" "cpu-features.h" "ac_cv_header_cpu_features_h" "$ac_includes_default" if test "x$ac_cv_header_cpu_features_h" = xyes then : printf "%s\n" "#define HAVE_CPU_FEATURES_H 1" >>confdefs.h fi ;; esac ;; aarch64*|arm64*) printf "%s\n" "#define WEBP_HAVE_NEON 1" >>confdefs.h ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_bswap16" >&5 printf %s "checking for __builtin_bswap16... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void)__builtin_bswap16(1u << 15) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_BUILTIN_BSWAP16 1" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext, ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_bswap32" >&5 printf %s "checking for __builtin_bswap32... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void)__builtin_bswap32(1u << 31) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_BUILTIN_BSWAP32 1" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext, ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_bswap64" >&5 printf %s "checking for __builtin_bswap64... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void)__builtin_bswap64(1ull << 63) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_BUILTIN_BSWAP64 1" >>confdefs.h else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext, ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Check whether --enable-threading was given. if test ${enable_threading+y} then : enableval=$enable_threading; else $as_nop enable_threading=yes fi if test "$enable_threading" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for threading support..." >&5 printf "%s\n" "$as_me: checking for threading support..." >&6;} ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 printf %s "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char pthread_join (); int main (void) { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case ${host_os} in solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac # Clang doesn't consider unrecognized options an error unless we specify # -Werror. We throw in some extra Clang-specific options to ensure that # this doesn't happen for GCC, which also accepts -Werror. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5 printf %s "checking if compiler needs -Werror to reject unknown flags... " >&6; } save_CFLAGS="$CFLAGS" ax_pthread_extra_flags="-Werror" CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo(void); int main (void) { foo() ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else $as_nop ax_pthread_extra_flags= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$save_CFLAGS" if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 printf %s "checking whether pthreads work without any flags... " >&6; } ;; -*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 printf %s "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 printf "%s\n" "$ax_pthread_config" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 printf %s "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; } int main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 printf %s "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int attr = $attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 printf "%s\n" "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $attr_name" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 printf %s "checking if more special flags are required for pthreads... " >&6; } flag=no case ${host_os} in aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; osf* | hpux*) flag="-D_REENTRANT";; solaris*) if test "$GCC" = "yes"; then flag="-D_REENTRANT" else # TODO: What about Clang on Solaris? flag="-mt -D_REENTRANT" fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $flag" >&5 printf "%s\n" "$flag" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i = PTHREAD_PRIO_INHERIT; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes else $as_nop ax_cv_PTHREAD_PRIO_INHERIT=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" then : printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: compile with *_r variant if test "x$GCC" != xyes; then case $host_os in aix*) case "x/$CC" in #( x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : if as_fn_executable_p ${CC}_r then : PTHREAD_CC="${CC}_r" fi ;; #( *) : for ac_prog in ${CC}_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 printf "%s\n" "$PTHREAD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" ;; esac ;; #( *) : ;; esac ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then printf "%s\n" "#define WEBP_USE_THREAD 1" >>confdefs.h LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" : else ax_pthread_ok=no ac_fn_c_check_func "$LINENO" "_beginthreadex" "ac_cv_func__beginthreadex" if test "x$ac_cv_func__beginthreadex" = xyes then : printf "%s\n" "#define WEBP_USE_THREAD 1" >>confdefs.h else $as_nop enable_threading=no fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if threading is enabled... ${enable_threading-no}" >&5 printf "%s\n" "$as_me: checking if threading is enabled... ${enable_threading-no}" >&6;} # Check whether --enable-gl was given. if test ${enable_gl+y} then : enableval=$enable_gl; fi if test "x$enable_gl" != "xno" then : GL_INCLUDES=""; GL_LIBS="" # Check whether --with-glincludedir was given. if test ${with_glincludedir+y} then : withval=$with_glincludedir; GL_INCLUDES="-I$withval" fi # Check whether --with-gllibdir was given. if test ${with_gllibdir+y} then : withval=$with_gllibdir; GL_LIBS="-L$withval" fi SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$GL_INCLUDES $CPPFLAGS" LIBS="$GL_LIBS $LIBS" glut_cflags="none" glut_ldflags="none" case $host_os in darwin*) # Special case for OSX builds. Append these to give the user a chance to # override with --with-gl* glut_cflags="$glut_cflags|-framework GLUT -framework OpenGL" glut_ldflags="$glut_ldflags|-framework GLUT -framework OpenGL" # quiet deprecation warnings for glut SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror -Wno-deprecated-declarations" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wno-deprecated-declarations" >&5 printf %s "checking whether $CC supports -Wno-deprecated-declarations... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void) { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } AM_CFLAGS="${AM_CFLAGS} -Wno-deprecated-declarations" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" ;; esac GLUT_SAVED_CPPFLAGS="$CPPFLAGS" SAVED_IFS="$IFS" IFS="|" for flag in $glut_cflags; do # restore IFS immediately as the autoconf macros may need the default. IFS="$SAVED_IFS" unset ac_cv_header_GL_glut_h unset ac_cv_header_OpenGL_glut_h case $flag in none) ;; *) CPPFLAGS="$flag $CPPFLAGS";; esac for ac_header in GL/glut.h GLUT/glut.h OpenGL/glut.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF glut_headers=yes; test "$flag" = "none" || GL_INCLUDES="$CPPFLAGS"; break fi done CPPFLAGS="$GLUT_SAVED_CPPFLAGS" test "$glut_headers" = "yes" && break done IFS="$SAVED_IFS" if test "$glut_headers" = "yes"; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu GLUT_SAVED_LDFLAGS="$LDFLAGS" SAVED_IFS="$IFS" IFS="|" for flag in $glut_ldflags; do # restore IFS immediately as the autoconf macros may need the default. IFS="$SAVED_IFS" unset ac_cv_search_glBegin case $flag in none) ;; *) LDFLAGS="$flag $LDFLAGS";; esac # find libGL GL_SAVED_LIBS="$LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing glBegin" >&5 printf %s "checking for library containing glBegin... " >&6; } if test ${ac_cv_search_glBegin+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char glBegin (); int main (void) { return glBegin (); ; return 0; } _ACEOF for ac_lib in '' GL OpenGL opengl32 do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_glBegin=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_glBegin+y} then : break fi done if test ${ac_cv_search_glBegin+y} then : else $as_nop ac_cv_search_glBegin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_glBegin" >&5 printf "%s\n" "$ac_cv_search_glBegin" >&6; } ac_res=$ac_cv_search_glBegin if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBS="$GL_SAVED_LIBS" # A direct link to libGL may not be necessary on e.g., linux. GLUT_SAVED_LIBS="$LIBS" for lib in "" "-lglut" "-lglut $ac_cv_search_glBegin"; do LIBS="$lib" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __cplusplus # define EXTERN_C extern "C" #else # define EXTERN_C #endif EXTERN_C char glOrtho(); EXTERN_C char glutMainLoop(); int main (void) { glOrtho(); glutMainLoop(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : printf "%s\n" "#define WEBP_HAVE_GL 1" >>confdefs.h glut_support=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$glut_support" = "yes"; then GL_LIBS="$LDFLAGS $lib" break fi done LIBS="$GLUT_SAVED_LIBS" LDFLAGS="$GLUT_SAVED_LDFLAGS" test "$glut_support" = "yes" && break done IFS="$SAVED_IFS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS if test "$glut_support" = "yes" -a "$enable_libwebpdemux" = "yes"; then build_vwebp=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building vwebp. OpenGL libraries and --enable-libwebpdemux are required." >&5 printf "%s\n" "$as_me: Not building vwebp. OpenGL libraries and --enable-libwebpdemux are required." >&6;} fi fi if test "$build_vwebp" = "yes"; then BUILD_VWEBP_TRUE= BUILD_VWEBP_FALSE='#' else BUILD_VWEBP_TRUE='#' BUILD_VWEBP_FALSE= fi # Check whether --enable-sdl was given. if test ${enable_sdl+y} then : enableval=$enable_sdl; fi if test "x$enable_sdl" != "xno" then : SDL_INCLUDES=""; SDL_LIBS="" for ac_prog in sdl2-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_LIBSDL_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $LIBSDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_LIBSDL_CONFIG="$LIBSDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_LIBSDL_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LIBSDL_CONFIG=$ac_cv_path_LIBSDL_CONFIG if test -n "$LIBSDL_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSDL_CONFIG" >&5 printf "%s\n" "$LIBSDL_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$LIBSDL_CONFIG" && break done if test -n "$LIBSDL_CONFIG"; then SDL_INCLUDES=`$LIBSDL_CONFIG --cflags` SDL_LIBS="`$LIBSDL_CONFIG --libs`" fi # Check whether --with-sdlincludedir was given. if test ${with_sdlincludedir+y} then : withval=$with_sdlincludedir; SDL_INCLUDES="-I$withval" fi # Check whether --with-sdllibdir was given. if test ${with_sdllibdir+y} then : withval=$with_sdllibdir; SDL_LIBS="-L$withval" fi sdl_header="no" SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$SDL_INCLUDES $CPPFLAGS" LIBS="$SDL_LIBS $LIBS" ac_fn_c_check_header_compile "$LINENO" "SDL2/SDL.h" "ac_cv_header_SDL2_SDL_h" "$ac_includes_default" if test "x$ac_cv_header_SDL2_SDL_h" = xyes then : sdl_header="SDL2/SDL.h" else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: SDL2 library not available - no SDL.h" >&5 printf "%s\n" "$as_me: WARNING: SDL2 library not available - no SDL.h" >&2;} fi if test x"$sdl_header" != "xno"; then ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu SDL_SAVED_LIBS="$LIBS" for lib in "" "-lSDL2" "-lSDL2main -lSDL2"; do LIBS="$SDL_SAVED_LIBS $lib" # Perform a full link to ensure SDL_main is resolved if needed. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$sdl_header> int main(int argc, char** argv) { SDL_Init(0); return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : SDL_LIBS="$LDFLAGS $LIBS" SDL_INCLUDES="$SDL_INCLUDES -DWEBP_HAVE_SDL" printf "%s\n" "#define WEBP_HAVE_SDL 1" >>confdefs.h sdl_support=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test x"$sdl_support" = "xyes"; then break fi done # LIBS is restored by LIBCHECK_EPILOGUE ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test x"$sdl_header" = "xSDL.h"; then SDL_INCLUDES="$SDL_INCLUDES -DWEBP_HAVE_JUST_SDL_H" fi fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS if test x"$sdl_support" = "xyes"; then build_vwebp_sdl=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building vwebp-sdl. SDL library is required." >&5 printf "%s\n" "$as_me: Not building vwebp-sdl. SDL library is required." >&6;} fi fi if test "$build_vwebp_sdl" = "yes"; then BUILD_VWEBP_SDL_TRUE= BUILD_VWEBP_SDL_FALSE='#' else BUILD_VWEBP_SDL_TRUE='#' BUILD_VWEBP_SDL_FALSE= fi # Check whether --enable-png was given. if test ${enable_png+y} then : enableval=$enable_png; fi if test "x$enable_png" != "xno" then : PNG_INCLUDES=""; PNG_LIBS="" for ac_prog in libpng-config libpng16-config libpng15-config libpng14-config \ libpng12-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_LIBPNG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $LIBPNG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_LIBPNG_CONFIG="$LIBPNG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_LIBPNG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LIBPNG_CONFIG=$ac_cv_path_LIBPNG_CONFIG if test -n "$LIBPNG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBPNG_CONFIG" >&5 printf "%s\n" "$LIBPNG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$LIBPNG_CONFIG" && break done if test -n "$LIBPNG_CONFIG"; then PNG_INCLUDES=`$LIBPNG_CONFIG --cflags` PNG_LIBS="`$LIBPNG_CONFIG --ldflags`" fi # Check whether --with-pngincludedir was given. if test ${with_pngincludedir+y} then : withval=$with_pngincludedir; PNG_INCLUDES="-I$withval" fi # Check whether --with-pnglibdir was given. if test ${with_pnglibdir+y} then : withval=$with_pnglibdir; PNG_LIBS="-L$withval" fi SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$PNG_INCLUDES $CPPFLAGS" LIBS="$PNG_LIBS $LIBS" ac_fn_c_check_header_compile "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing png_get_libpng_ver" >&5 printf %s "checking for library containing png_get_libpng_ver... " >&6; } if test ${ac_cv_search_png_get_libpng_ver+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char png_get_libpng_ver (); int main (void) { return png_get_libpng_ver (); ; return 0; } _ACEOF for ac_lib in '' png do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $MATH_LIBS $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_png_get_libpng_ver=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_png_get_libpng_ver+y} then : break fi done if test ${ac_cv_search_png_get_libpng_ver+y} then : else $as_nop ac_cv_search_png_get_libpng_ver=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_png_get_libpng_ver" >&5 printf "%s\n" "$ac_cv_search_png_get_libpng_ver" >&6; } ac_res=$ac_cv_search_png_get_libpng_ver if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" test "$ac_cv_search_png_get_libpng_ver" = "none required" \ || PNG_LIBS="$PNG_LIBS $ac_cv_search_png_get_libpng_ver" PNG_INCLUDES="$PNG_INCLUDES -DWEBP_HAVE_PNG" printf "%s\n" "#define WEBP_HAVE_PNG 1" >>confdefs.h png_support=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Optional png library not found" >&5 printf "%s\n" "$as_me: WARNING: Optional png library not found" >&2;} PNG_LIBS="" PNG_INCLUDES="" fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: png library not available - no png.h" >&5 printf "%s\n" "$as_me: WARNING: png library not available - no png.h" >&2;} PNG_LIBS="" PNG_INCLUDES="" fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS fi # Check whether --enable-jpeg was given. if test ${enable_jpeg+y} then : enableval=$enable_jpeg; fi if test "x$enable_jpeg" != "xno" then : JPEG_INCLUDES=""; JPEG_LIBS="" # Check whether --with-jpegincludedir was given. if test ${with_jpegincludedir+y} then : withval=$with_jpegincludedir; JPEG_INCLUDES="-I$withval" fi # Check whether --with-jpeglibdir was given. if test ${with_jpeglibdir+y} then : withval=$with_jpeglibdir; JPEG_LIBS="-L$withval" fi SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$JPEG_INCLUDES $CPPFLAGS" LIBS="$JPEG_LIBS $LIBS" ac_fn_c_check_header_compile "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg" >&5 printf %s "checking for jpeg_set_defaults in -ljpeg... " >&6; } if test ${ac_cv_lib_jpeg_jpeg_set_defaults+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $MATH_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char jpeg_set_defaults (); int main (void) { return jpeg_set_defaults (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_jpeg_jpeg_set_defaults=yes else $as_nop ac_cv_lib_jpeg_jpeg_set_defaults=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5 printf "%s\n" "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = xyes then : JPEG_LIBS="$JPEG_LIBS -ljpeg" JPEG_INCLUDES="$JPEG_INCLUDES -DWEBP_HAVE_JPEG" printf "%s\n" "#define WEBP_HAVE_JPEG 1" >>confdefs.h jpeg_support=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Optional jpeg library not found" >&5 printf "%s\n" "$as_me: WARNING: Optional jpeg library not found" >&2;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: jpeg library not available - no jpeglib.h" >&5 printf "%s\n" "$as_me: WARNING: jpeg library not available - no jpeglib.h" >&2;} fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS fi # Check whether --enable-tiff was given. if test ${enable_tiff+y} then : enableval=$enable_tiff; fi if test "x$enable_tiff" != "xno" then : TIFF_INCLUDES=""; TIFF_LIBS="" # Check whether --with-tiffincludedir was given. if test ${with_tiffincludedir+y} then : withval=$with_tiffincludedir; TIFF_INCLUDES="-I$withval" fi # Check whether --with-tifflibdir was given. if test ${with_tifflibdir+y} then : withval=$with_tifflibdir; TIFF_LIBS="-L$withval" fi SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$TIFF_INCLUDES $CPPFLAGS" LIBS="$TIFF_LIBS $LIBS" ac_fn_c_check_header_compile "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" if test "x$ac_cv_header_tiffio_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIFFGetVersion in -ltiff" >&5 printf %s "checking for TIFFGetVersion in -ltiff... " >&6; } if test ${ac_cv_lib_tiff_TIFFGetVersion+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff $MATH_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char TIFFGetVersion (); int main (void) { return TIFFGetVersion (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_tiff_TIFFGetVersion=yes else $as_nop ac_cv_lib_tiff_TIFFGetVersion=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFGetVersion" >&5 printf "%s\n" "$ac_cv_lib_tiff_TIFFGetVersion" >&6; } if test "x$ac_cv_lib_tiff_TIFFGetVersion" = xyes then : TIFF_LIBS="$TIFF_LIBS -ltiff" TIFF_INCLUDES="$TIFF_INCLUDES -DWEBP_HAVE_TIFF" printf "%s\n" "#define WEBP_HAVE_TIFF 1" >>confdefs.h tiff_support=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Optional tiff library not found" >&5 printf "%s\n" "$as_me: WARNING: Optional tiff library not found" >&2;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: tiff library not available - no tiffio.h" >&5 printf "%s\n" "$as_me: WARNING: tiff library not available - no tiffio.h" >&2;} fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS fi # Check whether --enable-gif was given. if test ${enable_gif+y} then : enableval=$enable_gif; fi if test "x$enable_gif" != "xno" then : GIF_INCLUDES=""; GIF_LIBS="" # Check whether --with-gifincludedir was given. if test ${with_gifincludedir+y} then : withval=$with_gifincludedir; GIF_INCLUDES="-I$withval" fi # Check whether --with-giflibdir was given. if test ${with_giflibdir+y} then : withval=$with_giflibdir; GIF_LIBS="-L$withval" fi SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$GIF_INCLUDES $CPPFLAGS" LIBS="$GIF_LIBS $LIBS" ac_fn_c_check_header_compile "$LINENO" "gif_lib.h" "ac_cv_header_gif_lib_h" "$ac_includes_default" if test "x$ac_cv_header_gif_lib_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DGifOpenFileHandle in -lgif" >&5 printf %s "checking for DGifOpenFileHandle in -lgif... " >&6; } if test ${ac_cv_lib_gif_DGifOpenFileHandle+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lgif $MATH_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char DGifOpenFileHandle (); int main (void) { return DGifOpenFileHandle (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_gif_DGifOpenFileHandle=yes else $as_nop ac_cv_lib_gif_DGifOpenFileHandle=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_DGifOpenFileHandle" >&5 printf "%s\n" "$ac_cv_lib_gif_DGifOpenFileHandle" >&6; } if test "x$ac_cv_lib_gif_DGifOpenFileHandle" = xyes then : GIF_LIBS="$GIF_LIBS -lgif" printf "%s\n" "#define WEBP_HAVE_GIF 1" >>confdefs.h gif_support=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Optional gif library not found" >&5 printf "%s\n" "$as_me: WARNING: Optional gif library not found" >&2;} fi else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: gif library not available - no gif_lib.h" >&5 printf "%s\n" "$as_me: WARNING: gif library not available - no gif_lib.h" >&2;} fi CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS if test "$gif_support" = "yes" -a \ "$enable_libwebpdemux" = "yes"; then build_anim_diff=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building anim_diff. libgif and --enable-libwebpdemux are required." >&5 printf "%s\n" "$as_me: Not building anim_diff. libgif and --enable-libwebpdemux are required." >&6;} fi if test "$gif_support" = "yes" -a \ "$enable_libwebpmux" = "yes"; then build_gif2webp=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building gif2webp. libgif and --enable-libwebpmux are required." >&5 printf "%s\n" "$as_me: Not building gif2webp. libgif and --enable-libwebpmux are required." >&6;} fi fi if test "${build_anim_diff}" = "yes"; then BUILD_ANIMDIFF_TRUE= BUILD_ANIMDIFF_FALSE='#' else BUILD_ANIMDIFF_TRUE='#' BUILD_ANIMDIFF_FALSE= fi if test "${build_gif2webp}" = "yes"; then BUILD_GIF2WEBP_TRUE= BUILD_GIF2WEBP_FALSE='#' else BUILD_GIF2WEBP_TRUE='#' BUILD_GIF2WEBP_FALSE= fi if test "$enable_libwebpdemux" = "yes" -a "$enable_libwebpmux" = "yes"; then build_img2webp=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building img2webp. --enable-libwebpdemux & --enable-libwebpmux are required." >&5 printf "%s\n" "$as_me: Not building img2webp. --enable-libwebpdemux & --enable-libwebpmux are required." >&6;} fi if test "${build_img2webp}" = "yes"; then BUILD_IMG2WEBP_TRUE= BUILD_IMG2WEBP_FALSE='#' else BUILD_IMG2WEBP_TRUE='#' BUILD_IMG2WEBP_FALSE= fi if test "$enable_libwebpmux" = "yes"; then build_webpinfo=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Not building webpinfo. --enable-libwebpdemux is required." >&5 printf "%s\n" "$as_me: Not building webpinfo. --enable-libwebpdemux is required." >&6;} fi if test "${build_webpinfo}" = "yes"; then BUILD_WEBPINFO_TRUE= BUILD_WEBPINFO_FALSE='#' else BUILD_WEBPINFO_TRUE='#' BUILD_WEBPINFO_FALSE= fi # Check whether --enable-wic was given. if test ${enable_wic+y} then : enableval=$enable_wic; else $as_nop enable_wic=yes fi case $host_os in mingw*) if test "$enable_wic" = "yes"; then ac_fn_c_check_header_compile "$LINENO" "wincodec.h" "ac_cv_header_wincodec_h" "$ac_includes_default" if test "x$ac_cv_header_wincodec_h" = xyes then : printf "%s\n" "#define HAVE_WINCODEC_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "shlwapi.h" "ac_cv_header_shlwapi_h" "$ac_includes_default" if test "x$ac_cv_header_shlwapi_h" = xyes then : printf "%s\n" "#define HAVE_SHLWAPI_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes then : printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h fi if test "$ac_cv_header_wincodec_h" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Windows Imaging Component support" >&5 printf %s "checking for Windows Imaging Component support... " >&6; } SAVED_LIBS=$LIBS LIBS="-lshlwapi -lole32 $LIBS" # match include structure from [cd]webp.c wic_headers=" #define INITGUID #define CINTERFACE #define COBJMACROS #define _WIN32_IE 0x500 #include #include #include " # test for functions from each lib and the GUID is created properly wic_main=" int main(void) { CLSID_WICImagingFactory; CoInitialize(NULL); SHCreateStreamOnFile(NULL, 0, NULL); return 0; } " ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $wic_headers $wic_main _ACEOF if ac_fn_c_try_link "$LINENO" then : wic_support=yes else $as_nop wic_support=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu test "$wic_support" = "yes" || LIBS=$SAVED_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${wic_support-no}" >&5 printf "%s\n" "${wic_support-no}" >&6; } fi fi esac USE_SWAP_16BIT_CSP="" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if --enable-swap-16bit-csp option is specified" >&5 printf %s "checking if --enable-swap-16bit-csp option is specified... " >&6; } # Check whether --enable-swap-16bit-csp was given. if test ${enable_swap_16bit_csp+y} then : enableval=$enable_swap_16bit_csp; fi if test "$enable_swap_16bit_csp" = "yes"; then USE_SWAP_16BIT_CSP="-DWEBP_SWAP_16BIT_CSP=1" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${enable_swap_16bit_csp-no}" >&5 printf "%s\n" "${enable_swap_16bit_csp-no}" >&6; } printf "%s\n" "#define WEBP_NEAR_LOSSLESS 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if --disable-near-lossless option is specified" >&5 printf %s "checking if --disable-near-lossless option is specified... " >&6; } # Check whether --enable-near_lossless was given. if test ${enable_near_lossless+y} then : enableval=$enable_near_lossless; else $as_nop enable_near_lossless=yes fi if test "$enable_near_lossless" = "no"; then printf "%s\n" "#define WEBP_NEAR_LOSSLESS 0" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ac_config_headers="$ac_config_headers src/webp/config.h" ac_config_files="$ac_config_files Makefile src/Makefile man/Makefile examples/Makefile extras/Makefile imageio/Makefile sharpyuv/Makefile sharpyuv/libsharpyuv.pc src/dec/Makefile src/enc/Makefile src/dsp/Makefile src/demux/Makefile src/mux/Makefile src/utils/Makefile src/libwebp.pc src/libwebpdecoder.pc src/demux/libwebpdemux.pc src/mux/libwebpmux.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MUX_TRUE}" && test -z "${BUILD_MUX_FALSE}"; then as_fn_error $? "conditional \"BUILD_MUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DEMUX_TRUE}" && test -z "${BUILD_DEMUX_FALSE}"; then as_fn_error $? "conditional \"BUILD_DEMUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_LIBWEBPDECODER_TRUE}" && test -z "${BUILD_LIBWEBPDECODER_FALSE}"; then as_fn_error $? "conditional \"BUILD_LIBWEBPDECODER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXTRAS_TRUE}" && test -z "${BUILD_EXTRAS_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXTRAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_VWEBP_TRUE}" && test -z "${BUILD_VWEBP_FALSE}"; then as_fn_error $? "conditional \"BUILD_VWEBP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_VWEBP_SDL_TRUE}" && test -z "${BUILD_VWEBP_SDL_FALSE}"; then as_fn_error $? "conditional \"BUILD_VWEBP_SDL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_ANIMDIFF_TRUE}" && test -z "${BUILD_ANIMDIFF_FALSE}"; then as_fn_error $? "conditional \"BUILD_ANIMDIFF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GIF2WEBP_TRUE}" && test -z "${BUILD_GIF2WEBP_FALSE}"; then as_fn_error $? "conditional \"BUILD_GIF2WEBP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_IMG2WEBP_TRUE}" && test -z "${BUILD_IMG2WEBP_FALSE}"; then as_fn_error $? "conditional \"BUILD_IMG2WEBP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_WEBPINFO_TRUE}" && test -z "${BUILD_WEBPINFO_FALSE}"; then as_fn_error $? "conditional \"BUILD_WEBPINFO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libwebp $as_me 1.4.0, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to . libwebp home page: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ libwebp config.status 1.4.0 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "src/webp/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/webp/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "extras/Makefile") CONFIG_FILES="$CONFIG_FILES extras/Makefile" ;; "imageio/Makefile") CONFIG_FILES="$CONFIG_FILES imageio/Makefile" ;; "sharpyuv/Makefile") CONFIG_FILES="$CONFIG_FILES sharpyuv/Makefile" ;; "sharpyuv/libsharpyuv.pc") CONFIG_FILES="$CONFIG_FILES sharpyuv/libsharpyuv.pc" ;; "src/dec/Makefile") CONFIG_FILES="$CONFIG_FILES src/dec/Makefile" ;; "src/enc/Makefile") CONFIG_FILES="$CONFIG_FILES src/enc/Makefile" ;; "src/dsp/Makefile") CONFIG_FILES="$CONFIG_FILES src/dsp/Makefile" ;; "src/demux/Makefile") CONFIG_FILES="$CONFIG_FILES src/demux/Makefile" ;; "src/mux/Makefile") CONFIG_FILES="$CONFIG_FILES src/mux/Makefile" ;; "src/utils/Makefile") CONFIG_FILES="$CONFIG_FILES src/utils/Makefile" ;; "src/libwebp.pc") CONFIG_FILES="$CONFIG_FILES src/libwebp.pc" ;; "src/libwebpdecoder.pc") CONFIG_FILES="$CONFIG_FILES src/libwebpdecoder.pc" ;; "src/demux/libwebpdemux.pc") CONFIG_FILES="$CONFIG_FILES src/demux/libwebpdemux.pc" ;; "src/mux/libwebpmux.pc") CONFIG_FILES="$CONFIG_FILES src/mux/libwebpmux.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # A file(cmd) program that detects file types. FILECMD=$lt_FILECMD # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive (by configure). lt_ar_flags=$lt_ar_flags # Flags to create an archive. AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 $SED -i 's/-DDLL_EXPORT/-DWEBP_DLL/' config.status # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WebP Configuration Summary -------------------------- Shared libraries: ${enable_shared} Static libraries: ${enable_static} Threading support: ${enable_threading-no} libwebp: yes libwebpdecoder: ${enable_libwebpdecoder-no} libwebpdemux: ${enable_libwebpdemux-no} libwebpmux: ${enable_libwebpmux-no} libwebpextras: ${enable_libwebpextras-no} Tools: cwebp : ${enable_libwebpdemux-no} Input format support ==================== JPEG : ${jpeg_support-no} PNG : ${png_support-no} TIFF : ${tiff_support-no} WIC : ${wic_support-no} dwebp : ${enable_libwebpdemux-no} Output format support ===================== PNG : ${png_support-no} WIC : ${wic_support-no} GIF support : ${gif_support-no} anim_diff : ${build_anim_diff-no} gif2webp : ${build_gif2webp-no} img2webp : ${build_img2webp-no} webpmux : ${enable_libwebpmux-no} vwebp : ${build_vwebp-no} webpinfo : ${build_webpinfo-no} SDL support : ${sdl_support-no} vwebp_sdl : ${build_vwebp_sdl-no} " >&5 printf "%s\n" "$as_me: WebP Configuration Summary -------------------------- Shared libraries: ${enable_shared} Static libraries: ${enable_static} Threading support: ${enable_threading-no} libwebp: yes libwebpdecoder: ${enable_libwebpdecoder-no} libwebpdemux: ${enable_libwebpdemux-no} libwebpmux: ${enable_libwebpmux-no} libwebpextras: ${enable_libwebpextras-no} Tools: cwebp : ${enable_libwebpdemux-no} Input format support ==================== JPEG : ${jpeg_support-no} PNG : ${png_support-no} TIFF : ${tiff_support-no} WIC : ${wic_support-no} dwebp : ${enable_libwebpdemux-no} Output format support ===================== PNG : ${png_support-no} WIC : ${wic_support-no} GIF support : ${gif_support-no} anim_diff : ${build_anim_diff-no} gif2webp : ${build_gif2webp-no} img2webp : ${build_img2webp-no} webpmux : ${enable_libwebpmux-no} vwebp : ${build_vwebp-no} webpinfo : ${build_webpinfo-no} SDL support : ${sdl_support-no} vwebp_sdl : ${build_vwebp_sdl-no} " >&6;} libwebp-1.4.0/doc/0000755000014400001440000000000014606317060010620 5ustar libwebp-1.4.0/doc/tools.md0000644000014400001440000004325714606317060012315 0ustar # WebP tools ## Encoding tool The examples/ directory contains tools for encoding (cwebp) and decoding (dwebp) images. The easiest use should look like: ```shell cwebp input.png -q 80 -o output.webp ``` which will convert the input file to a WebP file using a quality factor of 80 on a 0->100 scale (0 being the lowest quality, 100 being the best. Default value is 75). You might want to try the `-lossless` flag too, which will compress the source (in RGBA format) without any loss. The `-q` quality parameter will in this case control the amount of processing time spent trying to make the output file as small as possible. A longer list of options is available using the `-longhelp` command line flag: ```shell > cwebp -longhelp Usage: cwebp [-preset <...>] [options] in_file [-o out_file] ``` If input size (-s) for an image is not specified, it is assumed to be a PNG, JPEG, TIFF or WebP file. Note: Animated PNG and WebP files are not supported. Options: ``` -h / -help ............. short help -H / -longhelp ......... long help -q ............. quality factor (0:small..100:big), default=75 -alpha_q ......... transparency-compression quality (0..100), default=100 -preset ....... preset setting, one of: default, photo, picture, drawing, icon, text -preset must come first, as it overwrites other parameters -z ............... activates lossless preset with given level in [0:fast, ..., 9:slowest] -m ............... compression method (0=fast, 6=slowest), default=4 -segments ........ number of segments to use (1..4), default=4 -size ............ target size (in bytes) -psnr .......... target PSNR (in dB. typically: 42) -s ......... input size (width x height) for YUV -sns ............. spatial noise shaping (0:off, 100:max), default=50 -f ............... filter strength (0=off..100), default=60 -sharpness ....... filter sharpness (0:most .. 7:least sharp), default=0 -strong ................ use strong filter instead of simple (default) -nostrong .............. use simple filter instead of strong -sharp_yuv ............. use sharper (and slower) RGB->YUV conversion -partition_limit . limit quality to fit the 512k limit on the first partition (0=no degradation ... 100=full) -pass ............ analysis pass number (1..10) -qrange .... specifies the permissible quality range (default: 0 100) -crop .. crop picture with the given rectangle -resize ........ resize picture (*after* any cropping) -mt .................... use multi-threading if available -low_memory ............ reduce memory usage (slower encoding) -map ............. print map of extra info -print_psnr ............ prints averaged PSNR distortion -print_ssim ............ prints averaged SSIM distortion -print_lsim ............ prints local-similarity distortion -d .......... dump the compressed output (PGM file) -alpha_method .... transparency-compression method (0..1), default=1 -alpha_filter . predictive filtering for alpha plane, one of: none, fast (default) or best -exact ................. preserve RGB values in transparent area, default=off -blend_alpha ..... blend colors against background color expressed as RGB values written in hexadecimal, e.g. 0xc0e0d0 for red=0xc0 green=0xe0 and blue=0xd0 -noalpha ............... discard any transparency information -lossless .............. encode image losslessly, default=off -near_lossless ... use near-lossless image preprocessing (0..100=off), default=100 -hint ......... specify image characteristics hint, one of: photo, picture or graph -metadata ..... comma separated list of metadata to copy from the input to the output if present. Valid values: all, none (default), exif, icc, xmp -short ................. condense printed message -quiet ................. don't print anything -version ............... print version number and exit -noasm ................. disable all assembly optimizations -v ..................... verbose, e.g. print encoding/decoding times -progress .............. report encoding progress ``` Experimental Options: ``` -jpeg_like ............. roughly match expected JPEG size -af .................... auto-adjust filter strength -pre ............. pre-processing filter ``` The main options you might want to try in order to further tune the visual quality are: -preset -sns -f -m Namely: * `preset` will set up a default encoding configuration targeting a particular type of input. It should appear first in the list of options, so that subsequent options can take effect on top of this preset. Default value is 'default'. * `sns` will progressively turn on (when going from 0 to 100) some additional visual optimizations (like: segmentation map re-enforcement). This option will balance the bit allocation differently. It tries to take bits from the "easy" parts of the picture and use them in the "difficult" ones instead. Usually, raising the sns value (at fixed -q value) leads to larger files, but with better quality. Typical value is around '75'. * `f` option directly links to the filtering strength used by the codec's in-loop processing. The higher the value, the smoother the highly-compressed area will look. This is particularly useful when aiming at very small files. Typical values are around 20-30. Note that using the option -strong/-nostrong will change the type of filtering. Use "-f 0" to turn filtering off. * `m` controls the trade-off between encoding speed and quality. Default is 4. You can try -m 5 or -m 6 to explore more (time-consuming) encoding possibilities. A lower value will result in faster encoding at the expense of quality. ## Decoding tool There is a decoding sample in examples/dwebp.c which will take a .webp file and decode it to a PNG image file (amongst other formats). This is simply to demonstrate the use of the API. You can verify the file test.webp decodes to exactly the same as test_ref.ppm by using: ```shell cd examples ./dwebp test.webp -ppm -o test.ppm diff test.ppm test_ref.ppm ``` The full list of options is available using -h: ```shell > dwebp -h Usage: dwebp in_file [options] [-o out_file] ``` Decodes the WebP image file to PNG format [Default]. Note: Animated WebP files are not supported. Use following options to convert into alternate image formats: ``` -pam ......... save the raw RGBA samples as a color PAM -ppm ......... save the raw RGB samples as a color PPM -bmp ......... save as uncompressed BMP format -tiff ........ save as uncompressed TIFF format -pgm ......... save the raw YUV samples as a grayscale PGM file with IMC4 layout -yuv ......... save the raw YUV samples in flat layout ``` Other options are: ``` -version ..... print version number and exit -nofancy ..... don't use the fancy YUV420 upscaler -nofilter .... disable in-loop filtering -nodither .... disable dithering -dither .. dithering strength (in 0..100) -alpha_dither use alpha-plane dithering if needed -mt .......... use multi-threading -crop ... crop output with the given rectangle -resize ......... resize output (*after* any cropping) -flip ........ flip the output vertically -alpha ....... only save the alpha plane -incremental . use incremental decoding (useful for tests) -h ........... this help message -v ........... verbose (e.g. print encoding/decoding times) -quiet ....... quiet mode, don't print anything -noasm ....... disable all assembly optimizations ``` ## WebP file analysis tool `webpinfo` can be used to print out the chunk level structure and bitstream header information of WebP files. It can also check if the files are of valid WebP format. Usage: ```shell webpinfo [options] in_files ``` Note: there could be multiple input files; options must come before input files. Options: ``` -version ........... Print version number and exit. -quiet ............. Do not show chunk parsing information. -diag .............. Show parsing error diagnosis. -summary ........... Show chunk stats summary. -bitstream_info .... Parse bitstream header. ``` ## Visualization tool There's a little self-serve visualization tool called 'vwebp' under the examples/ directory. It uses OpenGL to open a simple drawing window and show a decoded WebP file. It's not yet integrated in the automake build system, but you can try to manually compile it using the recommendations below. Usage: ```shell vwebp in_file [options] ``` Decodes the WebP image file and visualize it using OpenGL Options are: ``` -version ..... print version number and exit -noicc ....... don't use the icc profile if present -nofancy ..... don't use the fancy YUV420 upscaler -nofilter .... disable in-loop filtering -dither dithering strength (0..100), default=50 -noalphadither disable alpha plane dithering -usebgcolor .. display background color -mt .......... use multi-threading -info ........ print info -h ........... this help message ``` Keyboard shortcuts: ``` 'c' ................ toggle use of color profile 'b' ................ toggle background color display 'i' ................ overlay file information 'd' ................ disable blending & disposal (debug) 'q' / 'Q' / ESC .... quit ``` ### Building Prerequisites: 1. OpenGL & OpenGL Utility Toolkit (GLUT) Linux: `sudo apt-get install freeglut3-dev mesa-common-dev` Mac + Xcode: These libraries should be available in the OpenGL / GLUT frameworks. Windows: http://freeglut.sourceforge.net/index.php#download 2. (Optional) qcms (Quick Color Management System) 1. Download qcms from Mozilla / Chromium: https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825 2. Build and archive the source files as libqcms.a / qcms.lib 3. Update makefile.unix / Makefile.vc 1. Define WEBP_HAVE_QCMS 2. Update include / library paths to reference the qcms directory. Build using makefile.unix / Makefile.vc: ```shell $ make -f makefile.unix examples/vwebp > nmake /f Makefile.vc CFG=release-static \ ../obj/x64/release-static/bin/vwebp.exe ``` ## Animation creation tool The utility `img2webp` can turn a sequence of input images (PNG, JPEG, ...) into an animated WebP file. It offers fine control over duration, encoding modes, etc. Usage: ```shell img2webp [file_options] [[frame_options] frame_file]... [-o webp_file] ``` File-level options (only used at the start of compression): ``` -min_size ............ minimize size -kmax .......... maximum number of frame between key-frames (0=only keyframes) -kmin .......... minimum number of frame between key-frames (0=disable key-frames altogether) -mixed ............... use mixed lossy/lossless automatic mode -near_lossless . use near-lossless image preprocessing (0..100=off), default=100 -sharp_yuv ........... use sharper (and slower) RGB->YUV conversion (lossy only) -loop .......... loop count (default: 0, = infinite loop) -v ................... verbose mode -h ................... this help -version ............. print version number and exit ``` Per-frame options (only used for subsequent images input): ``` -d ............. frame duration in ms (default: 100) -lossless ........... use lossless mode (default) -lossy ... ........... use lossy mode -q ........... quality -m ............. method to use ``` example: `img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp` Note: if a single file name is passed as the argument, the arguments will be tokenized from this file. The file name must not start with the character '-'. ## Animated GIF conversion Animated GIF files can be converted to WebP files with animation using the gif2webp utility available under examples/. The files can then be viewed using vwebp. Usage: ```shell gif2webp [options] gif_file -o webp_file ``` Options: ``` -h / -help ............. this help -lossy ................. encode image using lossy compression -mixed ................. for each frame in the image, pick lossy or lossless compression heuristically -q ............. quality factor (0:small..100:big) -m ............... compression method (0=fast, 6=slowest) -min_size .............. minimize output size (default:off) lossless compression by default; can be combined with -q, -m, -lossy or -mixed options -kmin ............ min distance between key frames -kmax ............ max distance between key frames -f ............... filter strength (0=off..100) -metadata ..... comma separated list of metadata to copy from the input to the output if present Valid values: all, none, icc, xmp (default) -loop_compatibility .... use compatibility mode for Chrome version prior to M62 (inclusive) -mt .................... use multi-threading if available -version ............... print version number and exit -v ..................... verbose -quiet ................. don't print anything ``` ### Building With the libgif development files installed, gif2webp can be built using makefile.unix: ```shell $ make -f makefile.unix examples/gif2webp ``` or using autoconf: ```shell $ ./configure --enable-everything $ make ``` ## Comparison of animated images Test utility anim_diff under examples/ can be used to compare two animated images (each can be GIF or WebP). Usage: ```shell anim_diff [options] ``` Options: ``` -dump_frames dump decoded frames in PAM format -min_psnr ... minimum per-frame PSNR -raw_comparison ..... if this flag is not used, RGB is premultiplied before comparison -max_diff ..... maximum allowed difference per channel between corresponding pixels in subsequent frames -h .................. this help -version ............ print version number and exit ``` ### Building With the libgif development files installed, anim_diff can be built using makefile.unix: ```shell $ make -f makefile.unix examples/anim_diff ``` or using autoconf: ```shell $ ./configure --enable-everything $ make ``` ## WebP Mux tool The examples/ directory contains a tool (webpmux) for manipulating WebP files. The webpmux tool can be used to create an extended format WebP file and also to extract or strip relevant data from such a file. A list of options is available using the -help command line flag: ```shell > webpmux -help Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT webpmux -set SET_OPTIONS INPUT -o OUTPUT webpmux -duration DURATION_OPTIONS [-duration ...] INPUT -o OUTPUT webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT] [-bgcolor BACKGROUND_COLOR] -o OUTPUT webpmux -info INPUT webpmux [-h|-help] webpmux -version webpmux argument_file_name GET_OPTIONS: Extract relevant data: icc get ICC profile exif get EXIF metadata xmp get XMP metadata frame n get nth frame SET_OPTIONS: Set color profile/metadata/parameters: loop LOOP_COUNT set the loop count bgcolor BACKGROUND_COLOR set the animation background color icc file.icc set ICC profile exif file.exif set EXIF metadata xmp file.xmp set XMP metadata where: 'file.icc' contains the ICC profile to be set, 'file.exif' contains the EXIF metadata to be set 'file.xmp' contains the XMP metadata to be set DURATION_OPTIONS: Set duration of selected frames: duration set duration for all frames duration,frame set duration of a particular frame duration,start,end set duration of frames in the interval [start,end]) where: 'duration' is the duration in milliseconds 'start' is the start frame index 'end' is the inclusive end frame index The special 'end' value '0' means: last frame. STRIP_OPTIONS: Strip color profile/metadata: icc strip ICC profile exif strip EXIF metadata xmp strip XMP metadata FRAME_OPTIONS(i): Create animation: file_i +di[+xi+yi[+mi[bi]]] where: 'file_i' is the i'th animation frame (WebP format), 'di' is the pause duration before next frame, 'xi','yi' specify the image offset for this frame, 'mi' is the dispose method for this frame (0 or 1), 'bi' is the blending method for this frame (+b or -b) LOOP_COUNT: Number of times to repeat the animation. Valid range is 0 to 65535 [Default: 0 (infinite)]. BACKGROUND_COLOR: Background color of the canvas. A,R,G,B where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying the Alpha, Red, Green and Blue component values respectively [Default: 255,255,255,255] INPUT & OUTPUT are in WebP format. Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be valid. Note: if a single file name is passed as the argument, the arguments will be tokenized from this file. The file name must not start with the character '-'. ``` libwebp-1.4.0/doc/building.md0000644000014400001440000001344114606317060012742 0ustar # Building ## Windows build By running: ```batch nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output ``` the directory `output\release-static\(x64|x86)\bin` will contain the tools cwebp.exe and dwebp.exe. The directory `output\release-static\(x64|x86)\lib` will contain the libwebp static library. The target architecture (x86/x64) is detected by Makefile.vc from the Visual Studio compiler (cl.exe) available in the system path. ## Unix build using makefile.unix On platforms with GNU tools installed (gcc and make), running ```shell make -f makefile.unix ``` will build the binaries examples/cwebp and examples/dwebp, along with the static library src/libwebp.a. No system-wide installation is supplied, as this is a simple alternative to the full installation system based on the autoconf tools (see below). Please refer to makefile.unix for additional details and customizations. ## Using autoconf tools Prerequisites: a compiler (e.g., gcc), make, autoconf, automake, libtool. On a Debian-like system the following should install everything you need for a minimal build: ```shell $ sudo apt-get install gcc make autoconf automake libtool ``` When building from git sources, you will need to run autogen.sh to generate the configure script. ```shell ./configure make make install ``` should be all you need to have the following files ``` /usr/local/include/webp/decode.h /usr/local/include/webp/encode.h /usr/local/include/webp/types.h /usr/local/lib/libwebp.* /usr/local/bin/cwebp /usr/local/bin/dwebp ``` installed. Note: A decode-only library, libwebpdecoder, is available using the `--enable-libwebpdecoder` flag. The encode library is built separately and can be installed independently using a minor modification in the corresponding Makefile.am configure files (see comments there). See `./configure --help` for more options. ## Building for MIPS Linux MIPS Linux toolchain stable available releases can be found at: https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/ ```shell # Add toolchain to PATH export PATH=$PATH:/path/to/toolchain/bin # 32-bit build for mips32r5 (p5600) HOST=mips-mti-linux-gnu MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \ -msched-weight -mload-store-pairs -fPIE" MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie" # 64-bit build for mips64r6 (i6400) HOST=mips-img-linux-gnu MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \ -msched-weight -mload-store-pairs -fPIE" MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie" ./configure --host=${HOST} --build=`config.guess` \ CC="${HOST}-gcc -EL" \ CFLAGS="$MIPS_CFLAGS" \ LDFLAGS="$MIPS_LDFLAGS" make make install ``` ## Building libwebp - Using vcpkg You can download and install libwebp using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: ```shell git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install ./vcpkg install libwebp ``` The libwebp port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. ## CMake With CMake, you can compile libwebp, cwebp, dwebp, gif2webp, img2webp, webpinfo and the JS bindings. Prerequisites: a compiler (e.g., gcc with autotools) and CMake. On a Debian-like system the following should install everything you need for a minimal build: ```shell $ sudo apt-get install build-essential cmake ``` When building from git sources, you will need to run cmake to generate the makefiles. ```shell mkdir build && cd build && cmake ../ make make install ``` If you also want any of the executables, you will need to enable them through CMake, e.g.: ```shell cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../ ``` or through your favorite interface (like ccmake or cmake-qt-gui). Use option `-DWEBP_UNICODE=ON` for Unicode support on Windows (with chcp 65001). Finally, once installed, you can also use WebP in your CMake project by doing: ```cmake find_package(WebP) ``` which will define the CMake variables WebP_INCLUDE_DIRS and WebP_LIBRARIES. ## Gradle The support for Gradle is minimal: it only helps you compile libwebp, cwebp and dwebp and webpmux_example. Prerequisites: a compiler (e.g., gcc with autotools) and gradle. On a Debian-like system the following should install everything you need for a minimal build: ```shell $ sudo apt-get install build-essential gradle ``` When building from git sources, you will need to run the Gradle wrapper with the appropriate target, e.g. : ```shell ./gradlew buildAllExecutables ``` ## SWIG bindings To generate language bindings from swig/libwebp.swig at least swig-1.3 (http://www.swig.org) is required. Currently the following functions are mapped: Decode: ``` WebPGetDecoderVersion WebPGetInfo WebPDecodeRGBA WebPDecodeARGB WebPDecodeBGRA WebPDecodeBGR WebPDecodeRGB ``` Encode: ``` WebPGetEncoderVersion WebPEncodeRGBA WebPEncodeBGRA WebPEncodeRGB WebPEncodeBGR WebPEncodeLosslessRGBA WebPEncodeLosslessBGRA WebPEncodeLosslessRGB WebPEncodeLosslessBGR ``` See also the [swig documentation](../swig/README.md) for more detailed build instructions and usage examples. ### Java bindings To build the swig-generated JNI wrapper code at least JDK-1.5 (or equivalent) is necessary for enum support. The output is intended to be a shared object / DLL that can be loaded via `System.loadLibrary("webp_jni")`. ### Python bindings To build the swig-generated Python extension code at least Python 2.6 is required. Python < 2.6 may build with some minor changes to libwebp.swig or the generated code, but is untested. ## Javascript decoder Libwebp can be compiled into a JavaScript decoder using Emscripten and CMake. See the [corresponding documentation](../README.md) libwebp-1.4.0/doc/template.html0000644000014400001440000000361114606317060013322 0ustar WebP Container Specification <%= @body %> libwebp-1.4.0/doc/specs_generation.md0000644000014400001440000000172714606317060014501 0ustar # Generate libwebp Container Spec Docs from Text Source HTML generation requires [kramdown](https://kramdown.gettalong.org/), easily installed as a [rubygem](https://rubygems.org/). Rubygems installation should satisfy dependencies automatically. HTML generation can then be done from the project root: ```shell $ kramdown doc/webp-container-spec.txt --template doc/template.html > \ doc/output/webp-container-spec.html ``` kramdown can optionally syntax highlight code blocks, using [CodeRay](https://github.com/rubychan/coderay), a dependency of kramdown that rubygems will install automatically. The following will apply inline CSS styling; an external stylesheet is not needed. ```shell $ kramdown doc/webp-lossless-bitstream-spec.txt --template \ doc/template.html --coderay-css style --coderay-line-numbers ' ' \ --coderay-default-lang c > \ doc/output/webp-lossless-bitstream-spec.html ``` Optimally, use kramdown 0.13.7 or newer if syntax highlighting desired. libwebp-1.4.0/doc/api.md0000644000014400001440000003221714606317060011720 0ustar # WebP APIs ## Encoding API The main encoding functions are available in the header src/webp/encode.h The ready-to-use ones are: ```c size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output); size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride, float quality_factor, uint8_t** output); size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride, float quality_factor, uint8_t** output); size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride, float quality_factor, uint8_t** output); ``` They will convert raw RGB samples to a WebP data. The only control supplied is the quality factor. There are some variants for using the lossless format: ```c size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height, int stride, uint8_t** output); size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height, int stride, uint8_t** output); size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height, int stride, uint8_t** output); size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height, int stride, uint8_t** output); ``` Of course in this case, no quality factor is needed since the compression occurs without loss of the input values, at the expense of larger output sizes. ### Advanced encoding API A more advanced API is based on the WebPConfig and WebPPicture structures. WebPConfig contains the encoding settings and is not tied to a particular picture. WebPPicture contains input data, on which some WebPConfig will be used for compression. The encoding flow looks like: ```c #include // Setup a config, starting form a preset and tuning some additional // parameters WebPConfig config; if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor)) { return 0; // version error } // ... additional tuning config.sns_strength = 90; config.filter_sharpness = 6; config_error = WebPValidateConfig(&config); // not mandatory, but useful // Setup the input data WebPPicture pic; if (!WebPPictureInit(&pic)) { return 0; // version error } pic.width = width; pic.height = height; // allocated picture of dimension width x height if (!WebPPictureAlloc(&pic)) { return 0; // memory error } // at this point, 'pic' has been initialized as a container, // and can receive the Y/U/V samples. // Alternatively, one could use ready-made import functions like // WebPPictureImportRGB(), which will take care of memory allocation. // In any case, past this point, one will have to call // WebPPictureFree(&pic) to reclaim memory. // Set up a byte-output write method. WebPMemoryWriter, for instance. WebPMemoryWriter wrt; WebPMemoryWriterInit(&wrt); // initialize 'wrt' pic.writer = MyFileWriter; pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work; // Compress! int ok = WebPEncode(&config, &pic); // ok = 0 => error occurred! WebPPictureFree(&pic); // must be called independently of the 'ok' result. // output data should have been handled by the writer at that point. // -> compressed data is the memory buffer described by wrt.mem / wrt.size // deallocate the memory used by compressed data WebPMemoryWriterClear(&wrt); ``` ## Decoding API This is mainly just one function to call: ```c #include "webp/decode.h" uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, int* width, int* height); ``` Please have a look at the file src/webp/decode.h for the details. There are variants for decoding in BGR/RGBA/ARGB/BGRA order, along with decoding to raw Y'CbCr samples. One can also decode the image directly into a pre-allocated buffer. To detect a WebP file and gather the picture's dimensions, the function: ```c int WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height); ``` is supplied. No decoding is involved when using it. ### Incremental decoding API In the case when data is being progressively transmitted, pictures can still be incrementally decoded using a slightly more complicated API. Decoder state is stored into an instance of the WebPIDecoder object. This object can be created with the purpose of decoding either RGB or Y'CbCr samples. For instance: ```c WebPDecBuffer buffer; WebPInitDecBuffer(&buffer); buffer.colorspace = MODE_BGR; ... WebPIDecoder* idec = WebPINewDecoder(&buffer); ``` As data is made progressively available, this incremental-decoder object can be used to decode the picture further. There are two (mutually exclusive) ways to pass freshly arrived data: either by appending the fresh bytes: ```c WebPIAppend(idec, fresh_data, size_of_fresh_data); ``` or by just mentioning the new size of the transmitted data: ```c WebPIUpdate(idec, buffer, size_of_transmitted_buffer); ``` Note that 'buffer' can be modified between each call to WebPIUpdate, in particular when the buffer is resized to accommodate larger data. These functions will return the decoding status: either VP8_STATUS_SUSPENDED if decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other status is an error condition. The 'idec' object must always be released (even upon an error condition) by calling: WebPIDelete(idec). To retrieve partially decoded picture samples, one must use the corresponding method: WebPIDecGetRGB or WebPIDecGetYUVA. It will return the last displayable pixel row. Lastly, note that decoding can also be performed into a pre-allocated pixel buffer. This buffer must be passed when creating a WebPIDecoder, calling WebPINewRGB() or WebPINewYUVA(). Please have a look at the src/webp/decode.h header for further details. ### Advanced Decoding API WebP decoding supports an advanced API which provides on-the-fly cropping and rescaling, something of great usefulness on memory-constrained environments like mobile phones. Basically, the memory usage will scale with the output's size, not the input's, when one only needs a quick preview or a zoomed in portion of an otherwise too-large picture. Some CPU can be saved too, incidentally. ```c // A) Init a configuration object WebPDecoderConfig config; CHECK(WebPInitDecoderConfig(&config)); // B) optional: retrieve the bitstream's features. CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); // C) Adjust 'config' options, if needed config.options.no_fancy_upsampling = 1; config.options.use_scaling = 1; config.options.scaled_width = scaledWidth(); config.options.scaled_height = scaledHeight(); // etc. // D) Specify 'config' output options for specifying output colorspace. // Optionally the external image decode buffer can also be specified. config.output.colorspace = MODE_BGRA; // Optionally, the config.output can be pointed to an external buffer as // well for decoding the image. This externally supplied memory buffer // should be big enough to store the decoded picture. config.output.u.RGBA.rgba = (uint8_t*) memory_buffer; config.output.u.RGBA.stride = scanline_stride; config.output.u.RGBA.size = total_size_of_the_memory_buffer; config.output.is_external_memory = 1; // E) Decode the WebP image. There are two variants w.r.t decoding image. // The first one (E.1) decodes the full image and the second one (E.2) is // used to incrementally decode the image using small input buffers. // Any one of these steps can be used to decode the WebP image. // E.1) Decode full image. CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); // E.2) Decode image incrementally. WebPIDecoder* const idec = WebPIDecode(NULL, NULL, &config); CHECK(idec != NULL); while (bytes_remaining > 0) { VP8StatusCode status = WebPIAppend(idec, input, bytes_read); if (status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED) { bytes_remaining -= bytes_read; } else { break; } } WebPIDelete(idec); // F) Decoded image is now in config.output (and config.output.u.RGBA). // It can be saved, displayed or otherwise processed. // G) Reclaim memory allocated in config's object. It's safe to call // this function even if the memory is external and wasn't allocated // by WebPDecode(). WebPFreeDecBuffer(&config.output); ``` ## WebP Mux WebPMux is a set of two libraries 'Mux' and 'Demux' for creation, extraction and manipulation of an extended format WebP file, which can have features like color profile, metadata and animation. Reference command-line tools `webpmux` and `vwebp` as well as the WebP container specification 'doc/webp-container-spec.txt' are also provided in this package, see the [tools documentation](tools.md). ### Mux API The Mux API contains methods for adding data to and reading data from WebP files. This API currently supports XMP/EXIF metadata, ICC profile and animation. Other features may be added in subsequent releases. Example#1 (pseudo code): Creating a WebPMux object with image data, color profile and XMP metadata. ```c int copy_data = 0; WebPMux* mux = WebPMuxNew(); // ... (Prepare image data). WebPMuxSetImage(mux, &image, copy_data); // ... (Prepare ICC profile data). WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); // ... (Prepare XMP metadata). WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); // Get data from mux in WebP RIFF format. WebPMuxAssemble(mux, &output_data); WebPMuxDelete(mux); // ... (Consume output_data; e.g. write output_data.bytes to file). WebPDataClear(&output_data); ``` Example#2 (pseudo code): Get image and color profile data from a WebP file. ```c int copy_data = 0; // ... (Read data from file). WebPMux* mux = WebPMuxCreate(&data, copy_data); WebPMuxGetFrame(mux, 1, &image); // ... (Consume image; e.g. call WebPDecode() to decode the data). WebPMuxGetChunk(mux, "ICCP", &icc_profile); // ... (Consume icc_profile). WebPMuxDelete(mux); free(data); ``` For a detailed Mux API reference, please refer to the header file (src/webp/mux.h). ### Demux API The Demux API enables extraction of images and extended format data from WebP files. This API currently supports reading of XMP/EXIF metadata, ICC profile and animated images. Other features may be added in subsequent releases. Code example: Demuxing WebP data to extract all the frames, ICC profile and EXIF/XMP metadata. ```c WebPDemuxer* demux = WebPDemux(&webp_data); uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); // ... (Get information about the features present in the WebP file). uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); // ... (Iterate over all frames). WebPIterator iter; if (WebPDemuxGetFrame(demux, 1, &iter)) { do { // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(), // ... and get other frame properties like width, height, offsets etc. // ... see 'struct WebPIterator' below for more info). } while (WebPDemuxNextFrame(&iter)); WebPDemuxReleaseIterator(&iter); } // ... (Extract metadata). WebPChunkIterator chunk_iter; if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter); // ... (Consume the ICC profile in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter); // ... (Consume the EXIF metadata in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter); // ... (Consume the XMP metadata in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); WebPDemuxDelete(demux); ``` For a detailed Demux API reference, please refer to the header file (src/webp/demux.h). ## AnimEncoder API The AnimEncoder API can be used to create animated WebP images. Code example: ```c WebPAnimEncoderOptions enc_options; WebPAnimEncoderOptionsInit(&enc_options); // ... (Tune 'enc_options' as needed). WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options); while() { WebPConfig config; WebPConfigInit(&config); // ... (Tune 'config' as needed). WebPAnimEncoderAdd(enc, frame, duration, &config); } WebPAnimEncoderAssemble(enc, webp_data); WebPAnimEncoderDelete(enc); // ... (Write the 'webp_data' to a file, or re-mux it further). ``` For a detailed AnimEncoder API reference, please refer to the header file (src/webp/mux.h). ## AnimDecoder API This AnimDecoder API allows decoding (possibly) animated WebP images. Code Example: ```c WebPAnimDecoderOptions dec_options; WebPAnimDecoderOptionsInit(&dec_options); // Tune 'dec_options' as needed. WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options); WebPAnimInfo anim_info; WebPAnimDecoderGetInfo(dec, &anim_info); for (uint32_t i = 0; i < anim_info.loop_count; ++i) { while (WebPAnimDecoderHasMoreFrames(dec)) { uint8_t* buf; int timestamp; WebPAnimDecoderGetNext(dec, &buf, ×tamp); // ... (Render 'buf' based on 'timestamp'). // ... (Do NOT free 'buf', as it is owned by 'dec'). } WebPAnimDecoderReset(dec); } const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec); // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data). WebPAnimDecoderDelete(dec); ``` For a detailed AnimDecoder API reference, please refer to the header file (src/webp/demux.h). libwebp-1.4.0/doc/webp-lossless-bitstream-spec.txt0000644000014400001440000013326014606317060017110 0ustar Specification for WebP Lossless Bitstream ========================================= _Jyrki Alakuijala, Ph.D., Google, Inc., 2023-03-09_ Abstract -------- WebP lossless is an image format for lossless compression of ARGB images. The lossless format stores and restores the pixel values exactly, including the color values for fully transparent pixels. A universal algorithm for sequential data compression (LZ77), prefix coding, and a color cache are used for compression of the bulk data. Decoding speeds faster than PNG have been demonstrated, as well as 25% denser compression than can be achieved using today's PNG format. * TOC placeholder {:toc} 1 Introduction -------------- This document describes the compressed data representation of a WebP lossless image. It is intended as a detailed reference for the WebP lossless encoder and decoder implementation. In this document, we extensively use C programming language syntax to describe the bitstream and assume the existence of a function for reading bits, `ReadBits(n)`. The bytes are read in the natural order of the stream containing them, and bits of each byte are read in least-significant-bit-first order. When multiple bits are read at the same time, the integer is constructed from the original data in the original order. The most significant bits of the returned integer are also the most significant bits of the original data. Thus, the statement ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ b = ReadBits(2); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ is equivalent with the two statements below: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ b = ReadBits(1); b |= ReadBits(1) << 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We assume that each color component, that is, alpha, red, blue, and green, is represented using an 8-bit byte. We define the corresponding type as uint8. A whole ARGB pixel is represented by a type called uint32, which is an unsigned integer consisting of 32 bits. In the code showing the behavior of the transforms, these values are codified in the following bits: alpha in bits 31..24, red in bits 23..16, green in bits 15..8, and blue in bits 7..0; however, implementations of the format are free to use another representation internally. Broadly, a WebP lossless image contains header data, transform information, and actual image data. Headers contain the width and height of the image. A WebP lossless image can go through four different types of transforms before being entropy encoded. The transform information in the bitstream contains the data required to apply the respective inverse transforms. 2 Nomenclature -------------- ARGB : A pixel value consisting of alpha, red, green, and blue values. ARGB image : A two-dimensional array containing ARGB pixels. color cache : A small hash-addressed array to store recently used colors to be able to recall them with shorter codes. color indexing image : A one-dimensional image of colors that can be indexed using a small integer (up to 256 within WebP lossless). color transform image : A two-dimensional subresolution image containing data about correlations of color components. distance mapping : Changes LZ77 distances to have the smallest values for pixels in two-dimensional proximity. entropy image : A two-dimensional subresolution image indicating which entropy coding should be used in a respective square in the image, that is, each pixel is a meta prefix code. LZ77 : A dictionary-based sliding window compression algorithm that either emits symbols or describes them as sequences of past symbols. meta prefix code : A small integer (up to 16 bits) that indexes an element in the meta prefix table. predictor image : A two-dimensional subresolution image indicating which spatial predictor is used for a particular square in the image. prefix code : A classic way to do entropy coding where a smaller number of bits are used for more frequent codes. prefix coding : A way to entropy code larger integers, which codes a few bits of the integer using an entropy code and codifies the remaining bits raw. This allows for the descriptions of the entropy codes to remain relatively small even when the range of symbols is large. scan-line order : A processing order of pixels (left to right and top to bottom), starting from the left-hand-top pixel. Once a row is completed, continue from the left-hand column of the next row. 3 RIFF Header ------------- The beginning of the header has the RIFF container. This consists of the following 21 bytes: 1. String 'RIFF'. 2. A little-endian, 32-bit value of the chunk length, which is the whole size of the chunk controlled by the RIFF header. Normally, this equals the payload size (file size minus 8 bytes: 4 bytes for the 'RIFF' identifier and 4 bytes for storing the value itself). 3. String 'WEBP' (RIFF container name). 4. String 'VP8L' (FourCC for lossless-encoded image data). 5. A little-endian, 32-bit value of the number of bytes in the lossless stream. 6. 1-byte signature 0x2f. The first 28 bits of the bitstream specify the width and height of the image. Width and height are decoded as 14-bit integers as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int image_width = ReadBits(14) + 1; int image_height = ReadBits(14) + 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The 14-bit precision for image width and height limits the maximum size of a WebP lossless image to 16384✕16384 pixels. The alpha_is_used bit is a hint only, and should not impact decoding. It should be set to 0 when all alpha values are 255 in the picture, and 1 otherwise. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int alpha_is_used = ReadBits(1); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The version_number is a 3 bit code that must be set to 0. Any other value should be treated as an error. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int version_number = ReadBits(3); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 Transforms ------------ The transforms are reversible manipulations of the image data that can reduce the remaining symbolic entropy by modeling spatial and color correlations. They can make the final compression more dense. An image can go through four types of transforms. A 1 bit indicates the presence of a transform. Each transform is allowed to be used only once. The transforms are used only for the main-level ARGB image; the subresolution images (color transform image, entropy image, and predictor image) have no transforms, not even the 0 bit indicating the end of transforms. Typically, an encoder would use these transforms to reduce the Shannon entropy in the residual image. Also, the transform data can be decided based on entropy minimization. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ while (ReadBits(1)) { // Transform present. // Decode transform type. enum TransformType transform_type = ReadBits(2); // Decode transform data. ... } // Decode actual image data (Section 5). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If a transform is present, then the next two bits specify the transform type. There are four types of transforms. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ enum TransformType { PREDICTOR_TRANSFORM = 0, COLOR_TRANSFORM = 1, SUBTRACT_GREEN_TRANSFORM = 2, COLOR_INDEXING_TRANSFORM = 3, }; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The transform type is followed by the transform data. Transform data contains the information required to apply the inverse transform and depends on the transform type. The inverse transforms are applied in the reverse order that they are read from the bitstream, that is, last one first. Next, we describe the transform data for different types. ### 4.1 Predictor Transform The predictor transform can be used to reduce entropy by exploiting the fact that neighboring pixels are often correlated. In the predictor transform, the current pixel value is predicted from the pixels already decoded (in scan-line order) and only the residual value (actual - predicted) is encoded. The green component of a pixel defines which of the 14 predictors is used within a particular block of the ARGB image. The _prediction mode_ determines the type of prediction to use. We divide the image into squares, and all the pixels in a square use the same prediction mode. The first 3 bits of prediction data define the block width and height in number of bits. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int size_bits = ReadBits(3) + 2; int block_width = (1 << size_bits); int block_height = (1 << size_bits); #define DIV_ROUND_UP(num, den) (((num) + (den) - 1) / (den)) int transform_width = DIV_ROUND_UP(image_width, 1 << size_bits); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The transform data contains the prediction mode for each block of the image. It is a subresolution image where the green component of a pixel defines which of the 14 predictors is used for all the `block_width * block_height` pixels within a particular block of the ARGB image. This subresolution image is encoded using the same techniques described in [Chapter 5](#image-data). The number of block columns, `transform_width`, is used in two-dimensional indexing. For a pixel (x, y), one can compute the respective filter block address by: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int block_index = (y >> size_bits) * transform_width + (x >> size_bits); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are 14 different prediction modes. In each prediction mode, the current pixel value is predicted from one or more neighboring pixels whose values are already known. We chose the neighboring pixels (TL, T, TR, and L) of the current pixel (P) as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ O O O O O O O O O O O O O O O O O O O O O O O O O O TL T TR O O O O O O O O L P X X X X X X X X X X X X X X X X X X X X X X X X X X X ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where TL means top-left, T means top, TR means top-right, and L means left. At the time of predicting a value for P, all O, TL, T, TR and L pixels have already been processed, and the P pixel and all X pixels are unknown. Given the preceding neighboring pixels, the different prediction modes are defined as follows. | Mode | Predicted value of each channel of the current pixel | | ------ | ------------------------------------------------------- | | 0 | 0xff000000 (represents solid black color in ARGB) | | 1 | L | | 2 | T | | 3 | TR | | 4 | TL | | 5 | Average2(Average2(L, TR), T) | | 6 | Average2(L, TL) | | 7 | Average2(L, T) | | 8 | Average2(TL, T) | | 9 | Average2(T, TR) | | 10 | Average2(Average2(L, TL), Average2(T, TR)) | | 11 | Select(L, T, TL) | | 12 | ClampAddSubtractFull(L, T, TL) | | 13 | ClampAddSubtractHalf(Average2(L, T), TL) | `Average2` is defined as follows for each ARGB component: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uint8 Average2(uint8 a, uint8 b) { return (a + b) / 2; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Select predictor is defined as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ uint32 Select(uint32 L, uint32 T, uint32 TL) { // L = left pixel, T = top pixel, TL = top-left pixel. // ARGB component estimates for prediction. int pAlpha = ALPHA(L) + ALPHA(T) - ALPHA(TL); int pRed = RED(L) + RED(T) - RED(TL); int pGreen = GREEN(L) + GREEN(T) - GREEN(TL); int pBlue = BLUE(L) + BLUE(T) - BLUE(TL); // Manhattan distances to estimates for left and top pixels. int pL = abs(pAlpha - ALPHA(L)) + abs(pRed - RED(L)) + abs(pGreen - GREEN(L)) + abs(pBlue - BLUE(L)); int pT = abs(pAlpha - ALPHA(T)) + abs(pRed - RED(T)) + abs(pGreen - GREEN(T)) + abs(pBlue - BLUE(T)); // Return either left or top, the one closer to the prediction. if (pL < pT) { return L; } else { return T; } } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The functions `ClampAddSubtractFull` and `ClampAddSubtractHalf` are performed for each ARGB component as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Clamp the input value between 0 and 255. int Clamp(int a) { return (a < 0) ? 0 : (a > 255) ? 255 : a; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int ClampAddSubtractFull(int a, int b, int c) { return Clamp(a + b - c); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int ClampAddSubtractHalf(int a, int b) { return Clamp(a + (a - b) / 2); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are special handling rules for some border pixels. If there is a prediction transform, regardless of the mode \[0..13\] for these pixels, the predicted value for the left-topmost pixel of the image is 0xff000000, all pixels on the top row are L-pixel, and all pixels on the leftmost column are T-pixel. Addressing the TR-pixel for pixels on the rightmost column is exceptional. The pixels on the rightmost column are predicted by using the modes \[0..13\], just like pixels not on the border, but the leftmost pixel on the same row as the current pixel is instead used as the TR-pixel. The final pixel value is obtained by adding each channel of the predicted value to the encoded residual value. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void PredictorTransformOutput(uint32 residual, uint32 pred, uint8* alpha, uint8* red, uint8* green, uint8* blue) { *alpha = ALPHA(residual) + ALPHA(pred); *red = RED(residual) + RED(pred); *green = GREEN(residual) + GREEN(pred); *blue = BLUE(residual) + BLUE(pred); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### 4.2 Color Transform The goal of the color transform is to decorrelate the R, G, and B values of each pixel. The color transform keeps the green (G) value as it is, transforms the red (R) value based on the green value, and transforms the blue (B) value based on the green value and then on the red value. As is the case for the predictor transform, first the image is divided into blocks, and the same transform mode is used for all the pixels in a block. For each block, there are three types of color transform elements. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ typedef struct { uint8 green_to_red; uint8 green_to_blue; uint8 red_to_blue; } ColorTransformElement; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The actual color transform is done by defining a color transform delta. The color transform delta depends on the `ColorTransformElement`, which is the same for all the pixels in a particular block. The delta is subtracted during the color transform. The inverse color transform then is just adding those deltas. The color transform function is defined as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void ColorTransform(uint8 red, uint8 blue, uint8 green, ColorTransformElement *trans, uint8 *new_red, uint8 *new_blue) { // Transformed values of red and blue components int tmp_red = red; int tmp_blue = blue; // Applying the transform is just subtracting the transform deltas tmp_red -= ColorTransformDelta(trans->green_to_red, green); tmp_blue -= ColorTransformDelta(trans->green_to_blue, green); tmp_blue -= ColorTransformDelta(trans->red_to_blue, red); *new_red = tmp_red & 0xff; *new_blue = tmp_blue & 0xff; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `ColorTransformDelta` is computed using a signed 8-bit integer representing a 3.5-fixed-point number and a signed 8-bit RGB color channel (c) \[-128..127\] and is defined as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int8 ColorTransformDelta(int8 t, int8 c) { return (t * c) >> 5; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A conversion from the 8-bit unsigned representation (uint8) to the 8-bit signed one (int8) is required before calling `ColorTransformDelta()`. The signed value should be interpreted as an 8-bit two's complement number (that is: uint8 range \[128..255\] is mapped to the \[-128..-1\] range of its converted int8 value). The multiplication is to be done using more precision (with at least 16-bit precision). The sign extension property of the shift operation does not matter here; only the lowest 8 bits are used from the result, and there the sign extension shifting and unsigned shifting are consistent with each other. Now, we describe the contents of color transform data so that decoding can apply the inverse color transform and recover the original red and blue values. The first 3 bits of the color transform data contain the width and height of the image block in number of bits, just like the predictor transform: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int size_bits = ReadBits(3) + 2; int block_width = 1 << size_bits; int block_height = 1 << size_bits; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The remaining part of the color transform data contains `ColorTransformElement` instances, corresponding to each block of the image. Each `ColorTransformElement` `'cte'` is treated as a pixel in a subresolution image whose alpha component is `255`, red component is `cte.red_to_blue`, green component is `cte.green_to_blue`, and blue component is `cte.green_to_red`. During decoding, `ColorTransformElement` instances of the blocks are decoded and the inverse color transform is applied on the ARGB values of the pixels. As mentioned earlier, that inverse color transform is just adding `ColorTransformElement` values to the red and blue channels. The alpha and green channels are left as is. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void InverseTransform(uint8 red, uint8 green, uint8 blue, ColorTransformElement *trans, uint8 *new_red, uint8 *new_blue) { // Transformed values of red and blue components int tmp_red = red; int tmp_blue = blue; // Applying the inverse transform is just adding the // color transform deltas tmp_red += ColorTransformDelta(trans->green_to_red, green); tmp_blue += ColorTransformDelta(trans->green_to_blue, green); tmp_blue += ColorTransformDelta(trans->red_to_blue, tmp_red & 0xff); *new_red = tmp_red & 0xff; *new_blue = tmp_blue & 0xff; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### 4.3 Subtract Green Transform The subtract green transform subtracts green values from red and blue values of each pixel. When this transform is present, the decoder needs to add the green value to both the red and blue values. There is no data associated with this transform. The decoder applies the inverse transform as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void AddGreenToBlueAndRed(uint8 green, uint8 *red, uint8 *blue) { *red = (*red + green) & 0xff; *blue = (*blue + green) & 0xff; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This transform is redundant, as it can be modeled using the color transform, but since there is no additional data here, the subtract green transform can be coded using fewer bits than a full-blown color transform. ### 4.4 Color Indexing Transform If there are not many unique pixel values, it may be more efficient to create a color index array and replace the pixel values by the array's indices. The color indexing transform achieves this. (In the context of WebP lossless, we specifically do not call this a palette transform because a similar but more dynamic concept exists in WebP lossless encoding: color cache.) The color indexing transform checks for the number of unique ARGB values in the image. If that number is below a threshold (256), it creates an array of those ARGB values, which is then used to replace the pixel values with the corresponding index: the green channel of the pixels are replaced with the index, all alpha values are set to 255, and all red and blue values to 0. The transform data contains the color table size and the entries in the color table. The decoder reads the color indexing transform data as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 8-bit value for the color table size int color_table_size = ReadBits(8) + 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The color table is stored using the image storage format itself. The color table can be obtained by reading an image, without the RIFF header, image size, and transforms, assuming the height of 1 pixel and the width of `color_table_size`. The color table is always subtraction-coded to reduce image entropy. The deltas of palette colors contain typically much less entropy than the colors themselves, leading to significant savings for smaller images. In decoding, every final color in the color table can be obtained by adding the previous color component values by each ARGB component separately and storing the least significant 8 bits of the result. The inverse transform for the image is simply replacing the pixel values (which are indices to the color table) with the actual color table values. The indexing is done based on the green component of the ARGB color. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Inverse transform argb = color_table[GREEN(argb)]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the index is equal to or larger than `color_table_size`, the argb color value should be set to 0x00000000 (transparent black). When the color table is small (equal to or less than 16 colors), several pixels are bundled into a single pixel. The pixel bundling packs several (2, 4, or 8) pixels into a single pixel, reducing the image width respectively. Pixel bundling allows for a more efficient joint distribution entropy coding of neighboring pixels and gives some arithmetic coding-like benefits to the entropy code, but it can only be used when there are 16 or fewer unique values. `color_table_size` specifies how many pixels are combined: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int width_bits; if (color_table_size <= 2) { width_bits = 3; } else if (color_table_size <= 4) { width_bits = 2; } else if (color_table_size <= 16) { width_bits = 1; } else { width_bits = 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `width_bits` has a value of 0, 1, 2, or 3. A value of 0 indicates no pixel bundling is to be done for the image. A value of 1 indicates that two pixels are combined, and each pixel has a range of \[0..15\]. A value of 2 indicates that four pixels are combined, and each pixel has a range of \[0..3\]. A value of 3 indicates that eight pixels are combined and each pixel has a range of \[0..1\], that is, a binary value. The values are packed into the green component as follows: * `width_bits` = 1: For every x value, where x ≡ 0 (mod 2), a green value at x is positioned into the 4 least significant bits of the green value at x / 2, and a green value at x + 1 is positioned into the 4 most significant bits of the green value at x / 2. * `width_bits` = 2: For every x value, where x ≡ 0 (mod 4), a green value at x is positioned into the 2 least-significant bits of the green value at x / 4, and green values at x + 1 to x + 3 are positioned in order to the more significant bits of the green value at x / 4. * `width_bits` = 3: For every x value, where x ≡ 0 (mod 8), a green value at x is positioned into the least significant bit of the green value at x / 8, and green values at x + 1 to x + 7 are positioned in order to the more significant bits of the green value at x / 8. After reading this transform, `image_width` is subsampled by `width_bits`. This affects the size of subsequent transforms. The new size can be calculated using `DIV_ROUND_UP`, as defined [earlier](#predictor-transform). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ image_width = DIV_ROUND_UP(image_width, 1 << width_bits); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 Image Data ------------ Image data is an array of pixel values in scan-line order. ### 5.1 Roles of Image Data We use image data in five different roles: 1. ARGB image: Stores the actual pixels of the image. 1. Entropy image: Stores the meta prefix codes (see ["Decoding of Meta Prefix Codes"](#decoding-of-meta-prefix-codes)). 1. Predictor image: Stores the metadata for the predictor transform (see ["Predictor Transform"](#predictor-transform)). 1. Color transform image: Created by `ColorTransformElement` values (defined in ["Color Transform"](#color-transform)) for different blocks of the image. 1. Color indexing image: An array of size `color_table_size` (up to 256 ARGB values) storing the metadata for the color indexing transform (see ["Color Indexing Transform"](#color-indexing-transform)). ### 5.2 Encoding of Image Data The encoding of image data is independent of its role. The image is first divided into a set of fixed-size blocks (typically 16x16 blocks). Each of these blocks are modeled using their own entropy codes. Also, several blocks may share the same entropy codes. **Rationale:** Storing an entropy code incurs a cost. This cost can be minimized if statistically similar blocks share an entropy code, thereby storing that code only once. For example, an encoder can find similar blocks by clustering them using their statistical properties or by repeatedly joining a pair of randomly selected clusters when it reduces the overall amount of bits needed to encode the image. Each pixel is encoded using one of the three possible methods: 1. Prefix-coded literals: Each channel (green, red, blue, and alpha) is entropy-coded independently. 2. LZ77 backward reference: A sequence of pixels are copied from elsewhere in the image. 3. Color cache code: Using a short multiplicative hash code (color cache index) of a recently seen color. The following subsections describe each of these in detail. #### 5.2.1 Prefix-Coded Literals The pixel is stored as prefix-coded values of green, red, blue, and alpha (in that order). See [Section 6.2.3](#decoding-entropy-coded-image-data) for details. #### 5.2.2 LZ77 Backward Reference Backward references are tuples of _length_ and _distance code_: * Length indicates how many pixels in scan-line order are to be copied. * Distance code is a number indicating the position of a previously seen pixel, from which the pixels are to be copied. The exact mapping is described [below](#distance-mapping). The length and distance values are stored using **LZ77 prefix coding**. LZ77 prefix coding divides large integer values into two parts: the _prefix code_ and the _extra bits_. The prefix code is stored using an entropy code, while the extra bits are stored as they are (without an entropy code). **Rationale**: This approach reduces the storage requirement for the entropy code. Also, large values are usually rare, so extra bits would be used for very few values in the image. Thus, this approach results in better compression overall. The following table denotes the prefix codes and extra bits used for storing different ranges of values. Note: The maximum backward reference length is limited to 4096. Hence, only the first 24 prefix codes (with the respective extra bits) are meaningful for length values. For distance values, however, all the 40 prefix codes are valid. | Value range | Prefix code | Extra bits | | --------------- | ----------- | ---------- | | 1 | 0 | 0 | | 2 | 1 | 0 | | 3 | 2 | 0 | | 4 | 3 | 0 | | 5..6 | 4 | 1 | | 7..8 | 5 | 1 | | 9..12 | 6 | 2 | | 13..16 | 7 | 2 | | ... | ... | ... | | 3072..4096 | 23 | 10 | | ... | ... | ... | | 524289..786432 | 38 | 18 | | 786433..1048576 | 39 | 18 | The pseudocode to obtain a (length or distance) value from the prefix code is as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (prefix_code < 4) { return prefix_code + 1; } int extra_bits = (prefix_code - 2) >> 1; int offset = (2 + (prefix_code & 1)) << extra_bits; return offset + ReadBits(extra_bits) + 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ##### Distance Mapping As noted previously, a distance code is a number indicating the position of a previously seen pixel, from which the pixels are to be copied. This subsection defines the mapping between a distance code and the position of a previous pixel. Distance codes larger than 120 denote the pixel distance in scan-line order, offset by 120. The smallest distance codes \[1..120\] are special and are reserved for a close neighborhood of the current pixel. This neighborhood consists of 120 pixels: * Pixels that are 1 to 7 rows above the current pixel and are up to 8 columns to the left or up to 7 columns to the right of the current pixel. \[Total such pixels = `7 * (8 + 1 + 7) = 112`\]. * Pixels that are in the same row as the current pixel and are up to 8 columns to the left of the current pixel. \[`8` such pixels\]. The mapping between distance code `distance_code` and the neighboring pixel offset `(xi, yi)` is as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (0, 1), (1, 0), (1, 1), (-1, 1), (0, 2), (2, 0), (1, 2), (-1, 2), (2, 1), (-2, 1), (2, 2), (-2, 2), (0, 3), (3, 0), (1, 3), (-1, 3), (3, 1), (-3, 1), (2, 3), (-2, 3), (3, 2), (-3, 2), (0, 4), (4, 0), (1, 4), (-1, 4), (4, 1), (-4, 1), (3, 3), (-3, 3), (2, 4), (-2, 4), (4, 2), (-4, 2), (0, 5), (3, 4), (-3, 4), (4, 3), (-4, 3), (5, 0), (1, 5), (-1, 5), (5, 1), (-5, 1), (2, 5), (-2, 5), (5, 2), (-5, 2), (4, 4), (-4, 4), (3, 5), (-3, 5), (5, 3), (-5, 3), (0, 6), (6, 0), (1, 6), (-1, 6), (6, 1), (-6, 1), (2, 6), (-2, 6), (6, 2), (-6, 2), (4, 5), (-4, 5), (5, 4), (-5, 4), (3, 6), (-3, 6), (6, 3), (-6, 3), (0, 7), (7, 0), (1, 7), (-1, 7), (5, 5), (-5, 5), (7, 1), (-7, 1), (4, 6), (-4, 6), (6, 4), (-6, 4), (2, 7), (-2, 7), (7, 2), (-7, 2), (3, 7), (-3, 7), (7, 3), (-7, 3), (5, 6), (-5, 6), (6, 5), (-6, 5), (8, 0), (4, 7), (-4, 7), (7, 4), (-7, 4), (8, 1), (8, 2), (6, 6), (-6, 6), (8, 3), (5, 7), (-5, 7), (7, 5), (-7, 5), (8, 4), (6, 7), (-6, 7), (7, 6), (-7, 6), (8, 5), (7, 7), (-7, 7), (8, 6), (8, 7) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For example, the distance code `1` indicates an offset of `(0, 1)` for the neighboring pixel, that is, the pixel above the current pixel (0 pixel difference in the X direction and 1 pixel difference in the Y direction). Similarly, the distance code `3` indicates the top-left pixel. The decoder can convert a distance code `distance_code` to a scan-line order distance `dist` as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (xi, yi) = distance_map[distance_code - 1] dist = xi + yi * image_width if (dist < 1) { dist = 1 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `distance_map` is the mapping noted above, and `image_width` is the width of the image in pixels. #### 5.2.3 Color Cache Coding {:#color-cache-code} Color cache stores a set of colors that have been recently used in the image. **Rationale:** This way, the recently used colors can sometimes be referred to more efficiently than emitting them using the other two methods (described in Sections [5.2.1](#prefix-coded-literals) and [5.2.2](#lz77-backward-reference)). Color cache codes are stored as follows. First, there is a 1-bit value that indicates if the color cache is used. If this bit is 0, no color cache codes exist, and they are not transmitted in the prefix code that decodes the green symbols and the length prefix codes. However, if this bit is 1, the color cache size is read next: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int color_cache_code_bits = ReadBits(4); int color_cache_size = 1 << color_cache_code_bits; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `color_cache_code_bits` defines the size of the color cache (`1 << color_cache_code_bits`). The range of allowed values for `color_cache_code_bits` is \[1..11\]. Compliant decoders must indicate a corrupted bitstream for other values. A color cache is an array of size `color_cache_size`. Each entry stores one ARGB color. Colors are looked up by indexing them by `(0x1e35a7bd * color) >> (32 - color_cache_code_bits)`. Only one lookup is done in a color cache; there is no conflict resolution. In the beginning of decoding or encoding of an image, all entries in all color cache values are set to zero. The color cache code is converted to this color at decoding time. The state of the color cache is maintained by inserting every pixel, be it produced by backward referencing or as literals, into the cache in the order they appear in the stream. 6 Entropy Code -------------- ### 6.1 Overview Most of the data is coded using a [canonical prefix code][canonical_huff]. Hence, the codes are transmitted by sending the _prefix code lengths_, as opposed to the actual _prefix codes_. In particular, the format uses **spatially variant prefix coding**. In other words, different blocks of the image can potentially use different entropy codes. **Rationale**: Different areas of the image may have different characteristics. So, allowing them to use different entropy codes provides more flexibility and potentially better compression. ### 6.2 Details The encoded image data consists of several parts: 1. Decoding and building the prefix codes. 1. Meta prefix codes. 1. Entropy-coded image data. For any given pixel (x, y), there is a set of five prefix codes associated with it. These codes are (in bitstream order): * **Prefix code #1**: Used for green channel, backward-reference length, and color cache. * **Prefix code #2, #3, and #4**: Used for red, blue, and alpha channels, respectively. * **Prefix code #5**: Used for backward-reference distance. From here on, we refer to this set as a **prefix code group**. #### 6.2.1 Decoding and Building the Prefix Codes This section describes how to read the prefix code lengths from the bitstream. The prefix code lengths can be coded in two ways. The method used is specified by a 1-bit value. * If this bit is 1, it is a _simple code length code_. * If this bit is 0, it is a _normal code length code_. In both cases, there can be unused code lengths that are still part of the stream. This may be inefficient, but it is allowed by the format. The described tree must be a complete binary tree. A single leaf node is considered a complete binary tree and can be encoded using either the simple code length code or the normal code length code. When coding a single leaf node using the _normal code length code_, all but one code length are zeros, and the single leaf node value is marked with the length of 1 -- even when no bits are consumed when that single leaf node tree is used. ##### Simple Code Length Code This variant is used in the special case when only 1 or 2 prefix symbols are in the range \[0..255\] with code length `1`. All other prefix code lengths are implicitly zeros. The first bit indicates the number of symbols: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int num_symbols = ReadBits(1) + 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following are the symbol values. This first symbol is coded using 1 or 8 bits, depending on the value of `is_first_8bits`. The range is \[0..1\] or \[0..255\], respectively. The second symbol, if present, is always assumed to be in the range \[0..255\] and coded using 8 bits. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int is_first_8bits = ReadBits(1); symbol0 = ReadBits(1 + 7 * is_first_8bits); code_lengths[symbol0] = 1; if (num_symbols == 2) { symbol1 = ReadBits(8); code_lengths[symbol1] = 1; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The two symbols should be different. Duplicate symbols are allowed, but inefficient. **Note:** Another special case is when _all_ prefix code lengths are _zeros_ (an empty prefix code). For example, a prefix code for distance can be empty if there are no backward references. Similarly, prefix codes for alpha, red, and blue can be empty if all pixels within the same meta prefix code are produced using the color cache. However, this case doesn't need special handling, as empty prefix codes can be coded as those containing a single symbol `0`. ##### Normal Code Length Code The code lengths of the prefix code fit in 8 bits and are read as follows. First, `num_code_lengths` specifies the number of code lengths. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int num_code_lengths = 4 + ReadBits(4); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The code lengths are themselves encoded using prefix codes; lower-level code lengths, `code_length_code_lengths`, first have to be read. The rest of those `code_length_code_lengths` (according to the order in `kCodeLengthCodeOrder`) are zeros. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int kCodeLengthCodes = 19; int kCodeLengthCodeOrder[kCodeLengthCodes] = { 17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; int code_length_code_lengths[kCodeLengthCodes] = { 0 }; // All zeros for (i = 0; i < num_code_lengths; ++i) { code_length_code_lengths[kCodeLengthCodeOrder[i]] = ReadBits(3); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Next, if `ReadBits(1) == 0`, the maximum number of different read symbols (`max_symbol`) for each symbol type (A, R, G, B, and distance) is set to its alphabet size: * G channel: 256 + 24 + `color_cache_size` * Other literals (A, R, and B): 256 * Distance code: 40 Otherwise, it is defined as: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int length_nbits = 2 + 2 * ReadBits(3); int max_symbol = 2 + ReadBits(length_nbits); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If `max_symbol` is larger than the size of the alphabet for the symbol type, the bitstream is invalid. A prefix table is then built from `code_length_code_lengths` and used to read up to `max_symbol` code lengths. * Code \[0..15\] indicates literal code lengths. * Value 0 means no symbols have been coded. * Values \[1..15\] indicate the bit length of the respective code. * Code 16 repeats the previous nonzero value \[3..6\] times, that is, `3 + ReadBits(2)` times. If code 16 is used before a nonzero value has been emitted, a value of 8 is repeated. * Code 17 emits a streak of zeros of length \[3..10\], that is, `3 + ReadBits(3)` times. * Code 18 emits a streak of zeros of length \[11..138\], that is, `11 + ReadBits(7)` times. Once code lengths are read, a prefix code for each symbol type (A, R, G, B, and distance) is formed using their respective alphabet sizes. The Normal Code Length Code must code a full decision tree, that is, the sum of `2 ^ (-length)` for all non-zero codes must be exactly one. There is however one exception to this rule, the single leaf node tree, where the leaf node value is marked with value 1 and other values are 0s. #### 6.2.2 Decoding of Meta Prefix Codes As noted earlier, the format allows the use of different prefix codes for different blocks of the image. _Meta prefix codes_ are indexes identifying which prefix codes to use in different parts of the image. Meta prefix codes may be used _only_ when the image is being used in the [role](#roles-of-image-data) of an _ARGB image_. There are two possibilities for the meta prefix codes, indicated by a 1-bit value: * If this bit is zero, there is only one meta prefix code used everywhere in the image. No more data is stored. * If this bit is one, the image uses multiple meta prefix codes. These meta prefix codes are stored as an _entropy image_ (described below). The red and green components of a pixel define a 16-bit meta prefix code used in a particular block of the ARGB image. ##### Entropy Image The entropy image defines which prefix codes are used in different parts of the image. The first 3 bits contain the `prefix_bits` value. The dimensions of the entropy image are derived from `prefix_bits`: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int prefix_bits = ReadBits(3) + 2; int prefix_image_width = DIV_ROUND_UP(image_width, 1 << prefix_bits); int prefix_image_height = DIV_ROUND_UP(image_height, 1 << prefix_bits); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `DIV_ROUND_UP` is as defined [earlier](#predictor-transform). The next bits contain an entropy image of width `prefix_image_width` and height `prefix_image_height`. ##### Interpretation of Meta Prefix Codes The number of prefix code groups in the ARGB image can be obtained by finding the _largest meta prefix code_ from the entropy image: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int num_prefix_groups = max(entropy image) + 1; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where `max(entropy image)` indicates the largest prefix code stored in the entropy image. As each prefix code group contains five prefix codes, the total number of prefix codes is: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int num_prefix_codes = 5 * num_prefix_groups; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Given a pixel (x, y) in the ARGB image, we can obtain the corresponding prefix codes to be used as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ int position = (y >> prefix_bits) * prefix_image_width + (x >> prefix_bits); int meta_prefix_code = (entropy_image[position] >> 8) & 0xffff; PrefixCodeGroup prefix_group = prefix_code_groups[meta_prefix_code]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ where we have assumed the existence of `PrefixCodeGroup` structure, which represents a set of five prefix codes. Also, `prefix_code_groups` is an array of `PrefixCodeGroup` (of size `num_prefix_groups`). The decoder then uses prefix code group `prefix_group` to decode the pixel (x, y), as explained in ["Decoding Entropy-Coded Image Data"](#decoding-entropy-coded-image-data). #### 6.2.3 Decoding Entropy-Coded Image Data For the current position (x, y) in the image, the decoder first identifies the corresponding prefix code group (as explained in the last section). Given the prefix code group, the pixel is read and decoded as follows. Next, read the symbol S from the bitstream using prefix code #1. Note that S is any integer in the range `0` to `(256 + 24 + ` [`color_cache_size`](#color-cache-code)` - 1)`. The interpretation of S depends on its value: 1. If S < 256 1. Use S as the green component. 1. Read red from the bitstream using prefix code #2. 1. Read blue from the bitstream using prefix code #3. 1. Read alpha from the bitstream using prefix code #4. 1. If S >= 256 & S < 256 + 24 1. Use S - 256 as a length prefix code. 1. Read extra bits for the length from the bitstream. 1. Determine backward-reference length L from length prefix code and the extra bits read. 1. Read the distance prefix code from the bitstream using prefix code #5. 1. Read extra bits for the distance from the bitstream. 1. Determine backward-reference distance D from the distance prefix code and the extra bits read. 1. Copy L pixels (in scan-line order) from the sequence of pixels starting at the current position minus D pixels. 1. If S >= 256 + 24 1. Use S - (256 + 24) as the index into the color cache. 1. Get ARGB color from the color cache at that index. 7 Overall Structure of the Format --------------------------------- Below is a view into the format in Augmented Backus-Naur Form (ABNF) [RFC 5234][] [RFC 7405][]. It does not cover all details. The end-of-image (EOI) is only implicitly coded into the number of pixels (image_width * image_height). Note that `*element` means `element` can be repeated 0 or more times. `5element` means `element` is repeated exactly 5 times. `%b` represents a binary value. #### 7.1 Basic Structure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ format = RIFF-header image-header image-stream RIFF-header = %s"RIFF" 4OCTET %s"WEBPVP8L" 4OCTET image-header = %x2F image-size alpha-is-used version image-size = 14BIT 14BIT ; width - 1, height - 1 alpha-is-used = 1BIT version = 3BIT ; 0 image-stream = optional-transform spatially-coded-image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #### 7.2 Structure of Transforms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ optional-transform = (%b1 transform optional-transform) / %b0 transform = predictor-tx / color-tx / subtract-green-tx transform =/ color-indexing-tx predictor-tx = %b00 predictor-image predictor-image = 3BIT ; sub-pixel code entropy-coded-image color-tx = %b01 color-image color-image = 3BIT ; sub-pixel code entropy-coded-image subtract-green-tx = %b10 color-indexing-tx = %b11 color-indexing-image color-indexing-image = 8BIT ; color count entropy-coded-image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #### 7.3 Structure of the Image Data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ spatially-coded-image = color-cache-info meta-prefix data entropy-coded-image = color-cache-info data color-cache-info = %b0 color-cache-info =/ (%b1 4BIT) ; 1 followed by color cache size meta-prefix = %b0 / (%b1 entropy-image) data = prefix-codes lz77-coded-image entropy-image = 3BIT ; subsample value entropy-coded-image prefix-codes = prefix-code-group *prefix-codes prefix-code-group = 5prefix-code ; See "Interpretation of Meta Prefix Codes" to ; understand what each of these five prefix ; codes are for. prefix-code = simple-prefix-code / normal-prefix-code simple-prefix-code = ; see "Simple Code Length Code" for details normal-prefix-code = ; see "Normal Code Length Code" for details lz77-coded-image = *((argb-pixel / lz77-copy / color-cache-code) lz77-coded-image) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following is a possible example sequence: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RIFF-header image-size %b1 subtract-green-tx %b1 predictor-tx %b0 color-cache-info %b0 prefix-codes lz77-coded-image ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [RFC 5234]: https://www.rfc-editor.org/rfc/rfc5234 [RFC 7405]: https://www.rfc-editor.org/rfc/rfc7405 [canonical_huff]: https://en.wikipedia.org/wiki/Canonical_Huffman_code libwebp-1.4.0/doc/webp-container-spec.txt0000644000014400001440000010067514606317060015237 0ustar WebP Container Specification ============================ * TOC placeholder {:toc} Introduction ------------ WebP is an image format that uses either (i) the VP8 key frame encoding to compress image data in a lossy way or (ii) the WebP lossless encoding. These encoding schemes should make it more efficient than older formats, such as JPEG, GIF, and PNG. It is optimized for fast image transfer over the network (for example, for websites). The WebP format has feature parity (color profile, metadata, animation, etc.) with other formats as well. This document describes the structure of a WebP file. The WebP container (that is, the RIFF container for WebP) allows feature support over and above the basic use case of WebP (that is, a file containing a single image encoded as a VP8 key frame). The WebP container provides additional support for the following: * Lossless Compression: An image can be losslessly compressed, using the WebP Lossless Format. * Metadata: An image may have metadata stored in Exchangeable Image File Format (Exif) or Extensible Metadata Platform (XMP) format. * Transparency: An image may have transparency, that is, an alpha channel. * Color Profile: An image may have an embedded ICC profile as described by the [International Color Consortium][iccspec]. * Animation: An image may have multiple frames with pauses between them, making it an animation. Terminology & Basics -------------------- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC 2119][] [RFC 8174][] when, and only when, they appear in all capitals, as shown here. A WebP file contains either a still image (that is, an encoded matrix of pixels) or an [animation](#animation). Optionally, it can also contain transparency information, a color profile and metadata. We refer to the matrix of pixels as the _canvas_ of the image. Bit numbering in chunk diagrams starts at `0` for the most significant bit ('MSB 0'), as described in [RFC 1166][]. Below are additional terms used throughout this document: _Reader/Writer_ : Code that reads WebP files is referred to as a _reader_, while code that writes them is referred to as a _writer_. _uint16_ : A 16-bit, little-endian, unsigned integer. _uint24_ : A 24-bit, little-endian, unsigned integer. _uint32_ : A 32-bit, little-endian, unsigned integer. _FourCC_ : A four-character code (FourCC) is a _uint32_ created by concatenating four ASCII characters in little-endian order. This means 'aaaa' (0x61616161) and 'AAAA' (0x41414141) are treated as different _FourCCs_. _1-based_ : An unsigned integer field storing values offset by `-1`, for example, such a field would store value _25_ as _24_. _ChunkHeader('ABCD')_ : Used to describe the _FourCC_ and _Chunk Size_ header of individual chunks, where 'ABCD' is the FourCC for the chunk. This element's size is 8 bytes. RIFF File Format ---------------- The WebP file format is based on the RIFF (Resource Interchange File Format) document format. The basic element of a RIFF file is a _chunk_. It consists of: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Chunk FourCC | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Chunk Size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : Chunk Payload : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Chunk FourCC: 32 bits : ASCII four-character code used for chunk identification. Chunk Size: 32 bits (_uint32_) : The size of the chunk in bytes, not including this field, the chunk identifier, or padding. Chunk Payload: _Chunk Size_ bytes : The data payload. If _Chunk Size_ is odd, a single padding byte -- which MUST be `0` to conform with RIFF -- is added. **Note:** RIFF has a convention that all-uppercase chunk FourCCs are standard chunks that apply to any RIFF file format, while FourCCs specific to a file format are all lowercase. WebP does not follow this convention. WebP File Header ---------------- 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 'R' | 'I' | 'F' | 'F' | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | File Size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 'W' | 'E' | 'B' | 'P' | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 'RIFF': 32 bits : The ASCII characters 'R', 'I', 'F', 'F'. File Size: 32 bits (_uint32_) : The size of the file in bytes, starting at offset 8. The maximum value of this field is 2^32 minus 10 bytes and thus the size of the whole file is at most 4 GiB minus 2 bytes. 'WEBP': 32 bits : The ASCII characters 'W', 'E', 'B', 'P'. A WebP file MUST begin with a RIFF header with the FourCC 'WEBP'. The file size in the header is the total size of the chunks that follow plus `4` bytes for the 'WEBP' FourCC. The file SHOULD NOT contain any data after the data specified by _File Size_. Readers MAY parse such files, ignoring the trailing data. As the size of any chunk is even, the size given by the RIFF header is also even. The contents of individual chunks are described in the following sections. Simple File Format (Lossy) -------------------------- This layout SHOULD be used if the image requires _lossy_ encoding and does not require transparency or other advanced features provided by the extended format. Files with this layout are smaller and supported by older software. Simple WebP (lossy) file format: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | WebP file header (12 bytes) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : 'VP8 ' Chunk : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 'VP8 ' Chunk: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('VP8 ') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : VP8 data : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ VP8 data: _Chunk Size_ bytes : VP8 bitstream data. Note that the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20). The VP8 bitstream format specification is described in [VP8 Data Format and Decoding Guide][rfc 6386]. Note that the VP8 frame header contains the VP8 frame width and height. That is assumed to be the width and height of the canvas. The VP8 specification describes how to decode the image into Y'CbCr format. To convert to RGB, [Recommendation BT.601][rec601] SHOULD be used. Applications MAY use another conversion method, but visual results may differ among decoders. Simple File Format (Lossless) ----------------------------- **Note:** Older readers may not support files using the lossless format. This layout SHOULD be used if the image requires _lossless_ encoding (with an optional transparency channel) and does not require advanced features provided by the extended format. Simple WebP (lossless) file format: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | WebP file header (12 bytes) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : 'VP8L' Chunk : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 'VP8L' Chunk: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('VP8L') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : VP8L data : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ VP8L data: _Chunk Size_ bytes : VP8L bitstream data. The current specification of the VP8L bitstream can be found at [WebP Lossless Bitstream Format][webpllspec]. Note that the VP8L header contains the VP8L image width and height. That is assumed to be the width and height of the canvas. Extended File Format -------------------- **Note:** Older readers may not support files using the extended format. An extended format file consists of: * A 'VP8X' Chunk with information about features used in the file. * An optional 'ICCP' Chunk with a color profile. * An optional 'ANIM' Chunk with animation control data. * Image data. * An optional 'EXIF' Chunk with Exif metadata. * An optional 'XMP ' Chunk with XMP metadata. * An optional list of [unknown chunks](#unknown-chunks). For a _still image_, the _image data_ consists of a single frame, which is made up of: * An optional [alpha subchunk](#alpha). * A [bitstream subchunk](#bitstream-vp8vp8l). For an _animated image_, the _image data_ consists of multiple frames. More details about frames can be found in the [Animation](#animation) section. All chunks necessary for reconstruction and color correction, that is 'VP8X', 'ICCP', 'ANIM', 'ANMF', 'ALPH', 'VP8 ' and 'VP8L', MUST appear in the order described earlier. Readers SHOULD fail when chunks necessary for reconstruction and color correction are out of order. [Metadata](#metadata) and [unknown](#unknown-chunks) chunks MAY appear out of order. **Rationale:** The chunks necessary for reconstruction should appear first in the file to allow a reader to begin decoding an image before receiving all of the data. An application may benefit from varying the order of metadata and custom chunks to suit the implementation. Extended WebP file header: {:#extended_header} 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | WebP file header (12 bytes) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('VP8X') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Rsv|I|L|E|X|A|R| Reserved | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Canvas Width Minus One | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... Canvas Height Minus One | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Reserved (Rsv): 2 bits : MUST be `0`. Readers MUST ignore this field. ICC profile (I): 1 bit : Set if the file contains an 'ICCP' Chunk. Alpha (L): 1 bit : Set if any of the frames of the image contain transparency information ("alpha"). Exif metadata (E): 1 bit : Set if the file contains Exif metadata. XMP metadata (X): 1 bit : Set if the file contains XMP metadata. Animation (A): 1 bit : Set if this is an animated image. Data in 'ANIM' and 'ANMF' Chunks should be used to control the animation. Reserved (R): 1 bit : MUST be `0`. Readers MUST ignore this field. Reserved: 24 bits : MUST be `0`. Readers MUST ignore this field. Canvas Width Minus One: 24 bits : _1-based_ width of the canvas in pixels. The actual canvas width is `1 + Canvas Width Minus One`. Canvas Height Minus One: 24 bits : _1-based_ height of the canvas in pixels. The actual canvas height is `1 + Canvas Height Minus One`. The product of _Canvas Width_ and _Canvas Height_ MUST be at most `2^32 - 1`. Future specifications may add more fields. Unknown fields MUST be ignored. ### Chunks #### Animation An animation is controlled by 'ANIM' and 'ANMF' Chunks. 'ANIM' Chunk: {:#anim_chunk} For an animated image, this chunk contains the _global parameters_ of the animation. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('ANIM') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Background Color | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Loop Count | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Background Color: 32 bits (_uint32_) : The default background color of the canvas in \[Blue, Green, Red, Alpha\] byte order. This color MAY be used to fill the unused space on the canvas around the frames, as well as the transparent pixels of the first frame. The background color is also used when the Disposal method is `1`. **Note**: * The background color MAY contain a non-opaque alpha value, even if the _Alpha_ flag in the ['VP8X' Chunk](#extended_header) is unset. * Viewer applications SHOULD treat the background color value as a hint and are not required to use it. * The canvas is cleared at the start of each loop. The background color MAY be used to achieve this. Loop Count: 16 bits (_uint16_) : The number of times to loop the animation. If it is `0`, this means infinitely. This chunk MUST appear if the _Animation_ flag in the 'VP8X' Chunk is set. If the _Animation_ flag is not set and this chunk is present, it MUST be ignored. 'ANMF' Chunk: For animated images, this chunk contains information about a _single_ frame. If the _Animation flag_ is not set, then this chunk SHOULD NOT be present. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('ANMF') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Frame X | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... Frame Y | Frame Width Minus One ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | Frame Height Minus One | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Frame Duration | Reserved |B|D| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : Frame Data : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Frame X: 24 bits (_uint24_) : The X coordinate of the upper left corner of the frame is `Frame X * 2`. Frame Y: 24 bits (_uint24_) : The Y coordinate of the upper left corner of the frame is `Frame Y * 2`. Frame Width Minus One: 24 bits (_uint24_) : The _1-based_ width of the frame. The frame width is `1 + Frame Width Minus One`. Frame Height Minus One: 24 bits (_uint24_) : The _1-based_ height of the frame. The frame height is `1 + Frame Height Minus One`. Frame Duration: 24 bits (_uint24_) : The time to wait before displaying the next frame, in 1-millisecond units. Note that the interpretation of the Frame Duration of 0 (and often <= 10) is defined by the implementation. Many tools and browsers assign a minimum duration similar to GIF. Reserved: 6 bits : MUST be `0`. Readers MUST ignore this field. Blending method (B): 1 bit : Indicates how transparent pixels of _the current frame_ are to be blended with corresponding pixels of the previous canvas: * `0`: Use alpha-blending. After disposing of the previous frame, render the current frame on the canvas using [alpha-blending](#alpha-blending). If the current frame does not have an alpha channel, assume the alpha value is 255, effectively replacing the rectangle. * `1`: Do not blend. After disposing of the previous frame, render the current frame on the canvas by overwriting the rectangle covered by the current frame. Disposal method (D): 1 bit : Indicates how _the current frame_ is to be treated after it has been displayed (before rendering the next frame) on the canvas: * `0`: Do not dispose. Leave the canvas as is. * `1`: Dispose to the background color. Fill the _rectangle_ on the canvas covered by the _current frame_ with the background color specified in the ['ANIM' Chunk](#anim_chunk). **Notes**: * The frame disposal only applies to the _frame rectangle_, that is, the rectangle defined by _Frame X_, _Frame Y_, _frame width_, and _frame height_. It may or may not cover the whole canvas. {:#alpha-blending} * Alpha-blending: Given that each of the R, G, B, and A channels is 8 bits, and the RGB channels are _not premultiplied_ by alpha, the formula for blending 'dst' onto 'src' is: ~~~~~ blend.A = src.A + dst.A * (1 - src.A / 255) if blend.A = 0 then blend.RGB = 0 else blend.RGB = (src.RGB * src.A + dst.RGB * dst.A * (1 - src.A / 255)) / blend.A ~~~~~ * Alpha-blending SHOULD be done in linear color space, by taking into account the [color profile](#color-profile) of the image. If the color profile is not present, standard RGB (sRGB) is to be assumed. (Note that sRGB also needs to be linearized due to a gamma of ~2.2.) Frame Data: _Chunk Size_ - `16` bytes : Consists of: * An optional [alpha subchunk](#alpha) for the frame. * A [bitstream subchunk](#bitstream-vp8vp8l) for the frame. * An optional list of [unknown chunks](#unknown-chunks). **Note**: The 'ANMF' payload, _Frame Data_, consists of individual _padded_ chunks, as described by the [RIFF file format](#riff-file-format). #### Alpha 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('ALPH') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Rsv| P | F | C | Alpha Bitstream... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Reserved (Rsv): 2 bits : MUST be `0`. Readers MUST ignore this field. Preprocessing (P): 2 bits : These _informative_ bits are used to signal the preprocessing that has been performed during compression. The decoder can use this information to for example, dither the values or smooth the gradients prior to display. * `0`: No preprocessing. * `1`: Level reduction. Decoders are not required to use this information in any specified way. Filtering method (F): 2 bits : The filtering methods used are described as follows: * `0`: None. * `1`: Horizontal filter. * `2`: Vertical filter. * `3`: Gradient filter. For each pixel, filtering is performed using the following calculations. Assume the alpha values surrounding the current `X` position are labeled as: C | B | ---+---+ A | X | We seek to compute the alpha value at position `X`. First, a prediction is made depending on the filtering method: * Method `0`: predictor = 0 * Method `1`: predictor = A * Method `2`: predictor = B * Method `3`: predictor = clip(A + B - C) where `clip(v)` is equal to: * 0 if v < 0, * 255 if v > 255, or * v otherwise The final value is derived by adding the decompressed value `X` to the predictor and using modulo-256 arithmetic to wrap the \[256..511\] range into the \[0..255\] one: `alpha = (predictor + X) % 256` There are special cases for the left-most and top-most pixel positions. For example, the top-left value at location (0, 0) uses 0 as the predictor value. Otherwise: * For horizontal or gradient filtering methods, the left-most pixels at location (0, y) are predicted using the location (0, y-1) just above. * For vertical or gradient filtering methods, the top-most pixels at location (x, 0) are predicted using the location (x-1, 0) on the left. Compression method (C): 2 bits : The compression method used: * `0`: No compression. * `1`: Compressed using the WebP lossless format. Alpha bitstream: _Chunk Size_ - `1` bytes : Encoded alpha bitstream. This optional chunk contains encoded alpha data for this frame. A frame containing a 'VP8L' Chunk SHOULD NOT contain this chunk. **Rationale**: The transparency information is already part of the 'VP8L' Chunk. The alpha channel data is stored as uncompressed raw data (when the compression method is '0') or compressed using the lossless format (when the compression method is '1'). * Raw data: This consists of a byte sequence of length = width * height, containing all the 8-bit transparency values in scan order. * Lossless format compression: The byte sequence is a compressed image-stream (as described in ["WebP Lossless Bitstream Format"] [webpllspec]) of implicit dimensions width x height. That is, this image-stream does NOT contain any headers describing the image dimensions. **Rationale**: The dimensions are already known from other sources, so storing them again would be redundant and prone to error. Once the image-stream is decoded into Alpha, Red, Green, Blue (ARGB) color values, following the process described in the lossless format specification, the transparency information must be extracted from the *green* channel of the ARGB quadruplet. **Rationale**: The green channel is allowed extra transformation steps in the specification -- unlike the other channels -- that can improve compression. #### Bitstream (VP8/VP8L) This chunk contains compressed bitstream data for a single frame. A bitstream chunk may be either (i) a 'VP8 ' Chunk, using 'VP8 ' (note the significant fourth-character space) as its FourCC, _or_ (ii) a 'VP8L' Chunk, using 'VP8L' as its FourCC. The formats of 'VP8 ' and 'VP8L' Chunks are as described in sections [Simple File Format (Lossy)](#simple-file-format-lossy) and [Simple File Format (Lossless)](#simple-file-format-lossless), respectively. #### Color Profile 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('ICCP') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : Color Profile : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Color Profile: _Chunk Size_ bytes : ICC profile. This chunk MUST appear before the image data. There SHOULD be at most one such chunk. If there are more such chunks, readers MAY ignore all except the first one. See the [ICC Specification][iccspec] for details. If this chunk is not present, sRGB SHOULD be assumed. #### Metadata Metadata can be stored in 'EXIF' or 'XMP ' Chunks. There SHOULD be at most one chunk of each type ('EXIF' and 'XMP '). If there are more such chunks, readers MAY ignore all except the first one. The chunks are defined as follows: 'EXIF' Chunk: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('EXIF') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : Exif Metadata : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Exif Metadata: _Chunk Size_ bytes : Image metadata in Exif format. 'XMP ' Chunk: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ChunkHeader('XMP ') | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ : XMP Metadata : +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ XMP Metadata: _Chunk Size_ bytes : Image metadata in XMP format. Note that the fourth character in the 'XMP ' FourCC is an ASCII space (0x20). Additional guidance about handling metadata can be found in the Metadata Working Group's ["Guidelines for Handling Metadata"][metadata]. #### Unknown Chunks A RIFF chunk (described in the [RIFF File Format](#riff-file-format) section) whose FourCC is different from any of the chunks described in this document, is considered an _unknown chunk_. **Rationale**: Allowing unknown chunks gives a provision for future extension of the format and also allows storage of any application-specific data. A file MAY contain unknown chunks: * at the end of the file, as described in [Extended WebP file header](#extended_header) section, or * at the end of 'ANMF' Chunks, as described in the [Animation](#animation) section. Readers SHOULD ignore these chunks. Writers SHOULD preserve them in their original order (unless they specifically intend to modify these chunks). ### Canvas Assembly from Frames Here we provide an overview of how a reader MUST assemble a canvas in the case of an animated image. The process begins with creating a canvas using the dimensions given in the 'VP8X' Chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus One + 1` pixels high. The `Loop Count` field from the 'ANIM' Chunk controls how many times the animation process is repeated. This is `Loop Count - 1` for nonzero `Loop Count` values or infinite if the `Loop Count` is zero. At the beginning of each loop iteration, the canvas is filled using the background color from the 'ANIM' Chunk or an application-defined color. 'ANMF' Chunks contain individual frames given in display order. Before rendering each frame, the previous frame's `Disposal method` is applied. The rendering of the decoded frame begins at the Cartesian coordinates (`2 * Frame X`, `2 * Frame Y`), using the top-left corner of the canvas as the origin. `Frame Width Minus One + 1` pixels wide by `Frame Height Minus One + 1` pixels high are rendered onto the canvas using the `Blending method`. The canvas is displayed for `Frame Duration` milliseconds. This continues until all frames given by 'ANMF' Chunks have been displayed. A new loop iteration is then begun, or the canvas is left in its final state if all iterations have been completed. The following pseudocode illustrates the rendering process. The notation _VP8X.field_ means the field in the 'VP8X' Chunk with the same description. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VP8X.flags.hasAnimation MUST be TRUE canvas ↠new image of size VP8X.canvasWidth x VP8X.canvasHeight with background color ANIM.background_color. loop_count ↠ANIM.loopCount dispose_method ↠Dispose to background color if loop_count == 0: loop_count = ∞ frame_params ↠nil next chunk in image_data is ANMF MUST be TRUE for loop = 0..loop_count - 1 clear canvas to ANIM.background_color or application-defined color until eof or non-ANMF chunk frame_params.frameX = Frame X frame_params.frameY = Frame Y frame_params.frameWidth = Frame Width Minus One + 1 frame_params.frameHeight = Frame Height Minus One + 1 frame_params.frameDuration = Frame Duration frame_right = frame_params.frameX + frame_params.frameWidth frame_bottom = frame_params.frameY + frame_params.frameHeight VP8X.canvasWidth >= frame_right MUST be TRUE VP8X.canvasHeight >= frame_bottom MUST be TRUE for subchunk in 'Frame Data': if subchunk.tag == "ALPH": alpha subchunks not found in 'Frame Data' earlier MUST be TRUE frame_params.alpha = alpha_data else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L": bitstream subchunks not found in 'Frame Data' earlier MUST be TRUE frame_params.bitstream = bitstream_data render frame with frame_params.alpha and frame_params.bitstream on canvas with top-left corner at (frame_params.frameX, frame_params.frameY), using Blending method frame_params.blendingMethod. canvas contains the decoded image. Show the contents of the canvas for frame_params.frameDuration * 1 ms. dispose_method = frame_params.disposeMethod ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Example File Layouts -------------------- A lossy-encoded image with alpha may look as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RIFF/WEBP +- VP8X (descriptions of features used) +- ALPH (alpha bitstream) +- VP8 (bitstream) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A lossless-encoded image may look as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RIFF/WEBP +- VP8X (descriptions of features used) +- VP8L (lossless bitstream) +- XYZW (unknown chunk) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A lossless image with an ICC profile and XMP metadata may look as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RIFF/WEBP +- VP8X (descriptions of features used) +- ICCP (color profile) +- VP8L (lossless bitstream) +- XMP (metadata) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An animated image with Exif metadata may look as follows: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RIFF/WEBP +- VP8X (descriptions of features used) +- ANIM (global animation parameters) +- ANMF (frame1 parameters + data) +- ANMF (frame2 parameters + data) +- ANMF (frame3 parameters + data) +- ANMF (frame4 parameters + data) +- EXIF (metadata) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/webp-lossless-bitstream-spec.txt [iccspec]: https://www.color.org/icc_specs2.xalter [metadata]: https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf [rec601]: https://www.itu.int/rec/R-REC-BT.601 [rfc 1166]: https://datatracker.ietf.org/doc/html/rfc1166 [rfc 2119]: https://datatracker.ietf.org/doc/html/rfc2119 [rfc 6386]: https://datatracker.ietf.org/doc/html/rfc6386 [rfc 8174]: https://datatracker.ietf.org/doc/html/rfc8174 libwebp-1.4.0/install-sh0000755000014400001440000003577614606317243012104 0ustar #!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libwebp-1.4.0/swig/0000755000014400001440000000000014606317060011024 5ustar libwebp-1.4.0/swig/libwebp.py0000644000014400001440000002002114606317060013015 0ustar # This file was automatically generated by SWIG (http://www.swig.org). # Version 3.0.12 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info if _swig_python_version_info >= (2, 7, 0): def swig_import_helper(): import importlib pkg = __name__.rpartition('.')[0] mname = '.'.join((pkg, '_libwebp')).lstrip('.') try: return importlib.import_module(mname) except ImportError: return importlib.import_module('_libwebp') _libwebp = swig_import_helper() del swig_import_helper elif _swig_python_version_info >= (2, 6, 0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_libwebp', [dirname(__file__)]) except ImportError: import _libwebp return _libwebp try: _mod = imp.load_module('_libwebp', fp, pathname, description) finally: if fp is not None: fp.close() return _mod _libwebp = swig_import_helper() del swig_import_helper else: import _libwebp del _swig_python_version_info try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. try: import builtins as __builtin__ except ImportError: import __builtin__ def _swig_setattr_nondynamic(self, class_type, name, value, static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'SwigPyObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name, None) if method: return method(self, value) if (not static): if _newclass: object.__setattr__(self, name, value) else: self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self, class_type, name, value): return _swig_setattr_nondynamic(self, class_type, name, value, 0) def _swig_getattr(self, class_type, name): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name, None) if method: return method(self) raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name)) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except __builtin__.Exception: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) try: _object = object _newclass = 1 except __builtin__.Exception: class _object: pass _newclass = 0 def WebPGetDecoderVersion(): """WebPGetDecoderVersion() -> int""" return _libwebp.WebPGetDecoderVersion() def WebPGetInfo(data): """WebPGetInfo(uint8_t data) -> (width, height)""" return _libwebp.WebPGetInfo(data) def WebPDecodeRGB(data): """WebPDecodeRGB(uint8_t data) -> (rgb, width, height)""" return _libwebp.WebPDecodeRGB(data) def WebPDecodeRGBA(data): """WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)""" return _libwebp.WebPDecodeRGBA(data) def WebPDecodeARGB(data): """WebPDecodeARGB(uint8_t data) -> (rgb, width, height)""" return _libwebp.WebPDecodeARGB(data) def WebPDecodeBGR(data): """WebPDecodeBGR(uint8_t data) -> (rgb, width, height)""" return _libwebp.WebPDecodeBGR(data) def WebPDecodeBGRA(data): """WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)""" return _libwebp.WebPDecodeBGRA(data) def WebPGetEncoderVersion(): """WebPGetEncoderVersion() -> int""" return _libwebp.WebPGetEncoderVersion() def wrap_WebPEncodeRGB(rgb, unused1, unused2, width, height, stride, quality_factor): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeRGB(rgb, unused1, unused2, width, height, stride, quality_factor) def wrap_WebPEncodeBGR(rgb, unused1, unused2, width, height, stride, quality_factor): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeBGR(rgb, unused1, unused2, width, height, stride, quality_factor) def wrap_WebPEncodeRGBA(rgb, unused1, unused2, width, height, stride, quality_factor): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeRGBA(rgb, unused1, unused2, width, height, stride, quality_factor) def wrap_WebPEncodeBGRA(rgb, unused1, unused2, width, height, stride, quality_factor): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeBGRA(rgb, unused1, unused2, width, height, stride, quality_factor) def wrap_WebPEncodeLosslessRGB(rgb, unused1, unused2, width, height, stride): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeLosslessRGB(rgb, unused1, unused2, width, height, stride) def wrap_WebPEncodeLosslessBGR(rgb, unused1, unused2, width, height, stride): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeLosslessBGR(rgb, unused1, unused2, width, height, stride) def wrap_WebPEncodeLosslessRGBA(rgb, unused1, unused2, width, height, stride): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeLosslessRGBA(rgb, unused1, unused2, width, height, stride) def wrap_WebPEncodeLosslessBGRA(rgb, unused1, unused2, width, height, stride): """private, do not call directly.""" return _libwebp.wrap_WebPEncodeLosslessBGRA(rgb, unused1, unused2, width, height, stride) _UNUSED = 1 def WebPEncodeRGB(rgb, width, height, stride, quality_factor): """WebPEncodeRGB(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" webp = wrap_WebPEncodeRGB( rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeRGBA(rgb, width, height, stride, quality_factor): """WebPEncodeRGBA(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" webp = wrap_WebPEncodeRGBA( rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeBGR(rgb, width, height, stride, quality_factor): """WebPEncodeBGR(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" webp = wrap_WebPEncodeBGR( rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeBGRA(rgb, width, height, stride, quality_factor): """WebPEncodeBGRA(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" webp = wrap_WebPEncodeBGRA( rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeLosslessRGB(rgb, width, height, stride): """WebPEncodeLosslessRGB(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" webp = wrap_WebPEncodeLosslessRGB(rgb, _UNUSED, _UNUSED, width, height, stride) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeLosslessRGBA(rgb, width, height, stride): """WebPEncodeLosslessRGBA(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" webp = wrap_WebPEncodeLosslessRGBA(rgb, _UNUSED, _UNUSED, width, height, stride) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeLosslessBGR(rgb, width, height, stride): """WebPEncodeLosslessBGR(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" webp = wrap_WebPEncodeLosslessBGR(rgb, _UNUSED, _UNUSED, width, height, stride) if len(webp[0]) == 0: return None return webp[0] def WebPEncodeLosslessBGRA(rgb, width, height, stride): """WebPEncodeLosslessBGRA(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" webp = wrap_WebPEncodeLosslessBGRA(rgb, _UNUSED, _UNUSED, width, height, stride) if len(webp[0]) == 0: return None return webp[0] # This file is compatible with both classic and new-style classes. libwebp-1.4.0/swig/libwebp.go0000644000014400001440000000232314606317060012777 0ustar /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 2.0.10 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ package libwebp import _ "runtime/cgo" import "unsafe" type _ unsafe.Pointer type _swig_fnptr *byte type _swig_memberptr *byte //extern libwebpSwigCgocall func SwigCgocall() //extern libwebpSwigCgocallDone func SwigCgocallDone() //extern libwebpSwigCgocallBack func SwigCgocallBack() //extern libwebpSwigCgocallBackDone func SwigCgocallBackDone() func WebPGetDecoderVersion() int func Wrapped_WebPGetInfo(string, []int, []int) int // WebPGetInfo has 2 output parameters, provide a version in the more natural // go idiom: func WebPGetInfo(webp []byte) (ok bool, width int, height int) { w := []int{0} h := []int{0} ok = Wrapped_WebPGetInfo(string(webp), w, h) != 0 width = w[0] height = h[0] return } libwebp-1.4.0/swig/setup.py0000644000014400001440000000226014606317060012536 0ustar #!/usr/bin/python """distutils script for libwebp python module.""" from distutils.core import setup from distutils.extension import Extension import os import shutil import tempfile tmpdir = tempfile.mkdtemp() package = "com.google.webp" package_path = os.path.join(tmpdir, *package.split(".")) os.makedirs(package_path) # Create __init_.py files along the package path. initpy_path = tmpdir for d in package.split("."): initpy_path = os.path.join(initpy_path, d) open(os.path.join(initpy_path, "__init__.py"), "w").close() shutil.copy2("libwebp.py", package_path) setup(name="libwebp", version="0.0", description="libwebp python wrapper", long_description="Provides access to 'simple' libwebp decode interface", license="BSD", url="http://developers.google.com/speed/webp", ext_package=package, ext_modules=[Extension("_libwebp", ["libwebp_python_wrap.c"], libraries=["webp"], ), ], package_dir={"": tmpdir}, packages=["com", "com.google", "com.google.webp"], py_modules=[package + ".libwebp"], ) shutil.rmtree(tmpdir) libwebp-1.4.0/swig/README.md0000644000014400001440000000261014606317060012302 0ustar # SWIG bindings ## Building ### JNI SWIG bindings ```shell $ gcc -shared -fPIC -fno-strict-aliasing -O2 \ -I/path/to/your/jdk/includes \ libwebp_java_wrap.c \ -lwebp \ -o libwebp_jni.so ``` Example usage: ```java import com.google.webp.libwebp; import java.lang.reflect.Method; public class libwebp_jni_example { static { System.loadLibrary("webp_jni"); } /** * usage: java -cp libwebp.jar:. libwebp_jni_example */ public static void main(String argv[]) { final int version = libwebp.WebPGetDecoderVersion(); System.out.println("libwebp version: " + Integer.toHexString(version)); System.out.println("libwebp methods:"); final Method[] libwebpMethods = libwebp.class.getDeclaredMethods(); for (int i = 0; i < libwebpMethods.length; i++) { System.out.println(libwebpMethods[i]); } } } ``` ```shell $ javac -cp libwebp.jar libwebp_jni_example.java $ java -Djava.library.path=. -cp libwebp.jar:. libwebp_jni_example ``` ### Python SWIG bindings: ```shell $ python setup.py build_ext $ python setup.py install --prefix=pylocal ``` Example usage: ```python import glob import sys sys.path.append(glob.glob('pylocal/lib/python*/site-packages')[0]) from com.google.webp import libwebp print "libwebp decoder version: %x" % libwebp.WebPGetDecoderVersion() print "libwebp attributes:" for attr in dir(libwebp): print attr ``` libwebp-1.4.0/swig/libwebp.jar0000644000014400001440000000414614606317060013153 0ustar PKíŒKC META-INF/þÊPKPKíŒKCMETA-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜éÄ›˜*h—æ)øf&åW—¤æ+xæ%ëiòrñrPK{ª×ïGGPK íŒKCcom/PK íŒKC com/google/PK íŒKCcom/google/webp/PKíŒKCcom/google/webp/libwebp.class…”kSQÇÿ+7Y¼…&HfæBÔÔò’^34Q¼P9@›á ëpÑ™fz×ÇéE—9MÓèC5=ϲ£ytùÁžóÿ眳‡ýó÷çoãØ—Ñ˜Œ¨R³Ïå ¹ò¼ËÐpR‚uA{K]Í«¹‚¯eÔâf:“§϶šYªåE5K‰bR-–rZA×h”&£7Vx§Q•¡Td%KŸËÅ]Uk#¡èygŠîÜ—z×Âzþ??ݸ ûðÅÌ– —gÖvZLïsgµGÍMÕcTœ>ËúÄ”^£ýª¾ÚZ-ïZWµR)¯–JÕÉ_”Ó«™…õª>ó‘Âæ½ÕY¸„uÊzacnq%.a½nqQ“õ8«Ãê£v˜ÍôY¯rP­Ö8—ͧPNh•bV]Îñ™Sò¹Ì©š99LŸ¤ôá®o bHÁ0 îᾂ c„bŒ2Æ82Ž &“Œ)ÆCÑ’—Ï_p}º@ï2ë/y×bYûŽ6ñ5'FÁoÉgÿPK~¥yIX PKíŒKC com/google/webp/libwebpJNI.classu’ÍNÂ@…ïð«åDDź°‰kcRTH Aƒ]˜¶Ž¤¤´¤y.W&.|Êxg: aóÍÜs´ß?Ÿ_p'Dá( ÇIhH\ZŽ5»"mž Ä®ÝJ ׳ÚŸO ê=ꆕò5î;tvCMtxCêù–ëð6•@J¨ªóêšZ««©šÊ¤ “‚®A§…Ö?QÃ[6¤*¡‚Âýÿú[AÈ€we9Ù­ž¬¸ðôé3…¿–ÅtÃqµù«.žQZoUÖ«A|u¥Ús}ߦ¾ ¿Œãi›Ì<µ¶ù%e³L!=¸sϤm‹}«œm jL»}õ|¬¿éiˆAÃMw"\wdS™ÉòÒF ÏŒ²­;#ùÎSs ˆàÂV{÷ÞêH‚ŒŸ}yÇ$î ^L‘ lÁ6+ AŠ3 ά`N0/X,оìp–w÷÷¡ÂY¬ 0âuÜ#pø PK`­éQpñPKíŒKC META-INF/þÊPKíŒKC{ª×ïGG=META-INF/MANIFEST.MFPK íŒKCÆcom/PK íŒKC ècom/google/PK íŒKCcom/google/webp/PKíŒKC~¥yIX ?com/google/webp/libwebp.classPKíŒKC`­éQpñ Ócom/google/webp/libwebpJNI.classPK¿‘libwebp-1.4.0/swig/libwebp_java_wrap.c0000644000014400001440000015064114606317060014655 0ustar /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 2.0.4 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGJAVA /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Fix for jlong on some versions of gcc on Windows */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) typedef long long __int64; #endif /* Fix for jlong on 64-bit x86 Solaris */ #if defined(__x86_64) # ifdef _LP64 # undef _LP64 # endif #endif #include #include #include /* Support for throwing Java exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaDirectorPureVirtual, SWIG_JavaUnknownError } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; (*jenv)->ExceptionClear(jenv); excep = (*jenv)->FindClass(jenv, except_ptr->java_exception); if (excep) (*jenv)->ThrowNew(jenv, excep, msg); } /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 SWIGINTERN void SWIG_JavaException(JNIEnv *jenv, int code, const char *msg) { SWIG_JavaExceptionCodes exception_code = SWIG_JavaUnknownError; switch(code) { case SWIG_MemoryError: exception_code = SWIG_JavaOutOfMemoryError; break; case SWIG_IOError: exception_code = SWIG_JavaIOException; break; case SWIG_SystemError: case SWIG_RuntimeError: exception_code = SWIG_JavaRuntimeException; break; case SWIG_OverflowError: case SWIG_IndexError: exception_code = SWIG_JavaIndexOutOfBoundsException; break; case SWIG_DivisionByZero: exception_code = SWIG_JavaArithmeticException; break; case SWIG_SyntaxError: case SWIG_ValueError: case SWIG_TypeError: exception_code = SWIG_JavaIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_JavaUnknownError; break; } SWIG_JavaThrowException(jenv, exception_code, msg); } #if defined(SWIG_NOINCLUDE) || defined(SWIG_NOARRAYS) int SWIG_JavaArrayInSchar (JNIEnv *jenv, jbyte **jarr, signed char **carr, jbyteArray input); void SWIG_JavaArrayArgoutSchar (JNIEnv *jenv, jbyte *jarr, signed char *carr, jbyteArray input); jbyteArray SWIG_JavaArrayOutSchar (JNIEnv *jenv, signed char *result, jsize sz); int SWIG_JavaArrayInUchar (JNIEnv *jenv, jshort **jarr, unsigned char **carr, jshortArray input); void SWIG_JavaArrayArgoutUchar (JNIEnv *jenv, jshort *jarr, unsigned char *carr, jshortArray input); jshortArray SWIG_JavaArrayOutUchar (JNIEnv *jenv, unsigned char *result, jsize sz); int SWIG_JavaArrayInShort (JNIEnv *jenv, jshort **jarr, short **carr, jshortArray input); void SWIG_JavaArrayArgoutShort (JNIEnv *jenv, jshort *jarr, short *carr, jshortArray input); jshortArray SWIG_JavaArrayOutShort (JNIEnv *jenv, short *result, jsize sz); int SWIG_JavaArrayInUshort (JNIEnv *jenv, jint **jarr, unsigned short **carr, jintArray input); void SWIG_JavaArrayArgoutUshort (JNIEnv *jenv, jint *jarr, unsigned short *carr, jintArray input); jintArray SWIG_JavaArrayOutUshort (JNIEnv *jenv, unsigned short *result, jsize sz); int SWIG_JavaArrayInInt (JNIEnv *jenv, jint **jarr, int **carr, jintArray input); void SWIG_JavaArrayArgoutInt (JNIEnv *jenv, jint *jarr, int *carr, jintArray input); jintArray SWIG_JavaArrayOutInt (JNIEnv *jenv, int *result, jsize sz); int SWIG_JavaArrayInUint (JNIEnv *jenv, jlong **jarr, unsigned int **carr, jlongArray input); void SWIG_JavaArrayArgoutUint (JNIEnv *jenv, jlong *jarr, unsigned int *carr, jlongArray input); jlongArray SWIG_JavaArrayOutUint (JNIEnv *jenv, unsigned int *result, jsize sz); int SWIG_JavaArrayInLong (JNIEnv *jenv, jint **jarr, long **carr, jintArray input); void SWIG_JavaArrayArgoutLong (JNIEnv *jenv, jint *jarr, long *carr, jintArray input); jintArray SWIG_JavaArrayOutLong (JNIEnv *jenv, long *result, jsize sz); int SWIG_JavaArrayInUlong (JNIEnv *jenv, jlong **jarr, unsigned long **carr, jlongArray input); void SWIG_JavaArrayArgoutUlong (JNIEnv *jenv, jlong *jarr, unsigned long *carr, jlongArray input); jlongArray SWIG_JavaArrayOutUlong (JNIEnv *jenv, unsigned long *result, jsize sz); int SWIG_JavaArrayInLonglong (JNIEnv *jenv, jlong **jarr, jlong **carr, jlongArray input); void SWIG_JavaArrayArgoutLonglong (JNIEnv *jenv, jlong *jarr, jlong *carr, jlongArray input); jlongArray SWIG_JavaArrayOutLonglong (JNIEnv *jenv, jlong *result, jsize sz); int SWIG_JavaArrayInFloat (JNIEnv *jenv, jfloat **jarr, float **carr, jfloatArray input); void SWIG_JavaArrayArgoutFloat (JNIEnv *jenv, jfloat *jarr, float *carr, jfloatArray input); jfloatArray SWIG_JavaArrayOutFloat (JNIEnv *jenv, float *result, jsize sz); int SWIG_JavaArrayInDouble (JNIEnv *jenv, jdouble **jarr, double **carr, jdoubleArray input); void SWIG_JavaArrayArgoutDouble (JNIEnv *jenv, jdouble *jarr, double *carr, jdoubleArray input); jdoubleArray SWIG_JavaArrayOutDouble (JNIEnv *jenv, double *result, jsize sz); #else /* signed char[] support */ int SWIG_JavaArrayInSchar (JNIEnv *jenv, jbyte **jarr, signed char **carr, jbyteArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetByteArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (signed char*) calloc(sz, sizeof(signed char)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseByteArrayElements(jenv, input, jarr, 0); } jbyteArray SWIG_JavaArrayOutSchar (JNIEnv *jenv, signed char *result, jsize sz) { jbyte *arr; int i; jbyteArray jresult = (*jenv)->NewByteArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetByteArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseByteArrayElements(jenv, jresult, arr, 0); return jresult; } /* unsigned char[] support */ int SWIG_JavaArrayInUchar (JNIEnv *jenv, jshort **jarr, unsigned char **carr, jshortArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetShortArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (unsigned char*) calloc(sz, sizeof(unsigned char)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseShortArrayElements(jenv, input, jarr, 0); } jshortArray SWIG_JavaArrayOutUchar (JNIEnv *jenv, unsigned char *result, jsize sz) { jshort *arr; int i; jshortArray jresult = (*jenv)->NewShortArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetShortArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseShortArrayElements(jenv, jresult, arr, 0); return jresult; } /* short[] support */ int SWIG_JavaArrayInShort (JNIEnv *jenv, jshort **jarr, short **carr, jshortArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetShortArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (short*) calloc(sz, sizeof(short)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseShortArrayElements(jenv, input, jarr, 0); } jshortArray SWIG_JavaArrayOutShort (JNIEnv *jenv, short *result, jsize sz) { jshort *arr; int i; jshortArray jresult = (*jenv)->NewShortArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetShortArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseShortArrayElements(jenv, jresult, arr, 0); return jresult; } /* unsigned short[] support */ int SWIG_JavaArrayInUshort (JNIEnv *jenv, jint **jarr, unsigned short **carr, jintArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetIntArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (unsigned short*) calloc(sz, sizeof(unsigned short)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseIntArrayElements(jenv, input, jarr, 0); } jintArray SWIG_JavaArrayOutUshort (JNIEnv *jenv, unsigned short *result, jsize sz) { jint *arr; int i; jintArray jresult = (*jenv)->NewIntArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetIntArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseIntArrayElements(jenv, jresult, arr, 0); return jresult; } /* int[] support */ int SWIG_JavaArrayInInt (JNIEnv *jenv, jint **jarr, int **carr, jintArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetIntArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (int*) calloc(sz, sizeof(int)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseIntArrayElements(jenv, input, jarr, 0); } jintArray SWIG_JavaArrayOutInt (JNIEnv *jenv, int *result, jsize sz) { jint *arr; int i; jintArray jresult = (*jenv)->NewIntArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetIntArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseIntArrayElements(jenv, jresult, arr, 0); return jresult; } /* unsigned int[] support */ int SWIG_JavaArrayInUint (JNIEnv *jenv, jlong **jarr, unsigned int **carr, jlongArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetLongArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (unsigned int*) calloc(sz, sizeof(unsigned int)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseLongArrayElements(jenv, input, jarr, 0); } jlongArray SWIG_JavaArrayOutUint (JNIEnv *jenv, unsigned int *result, jsize sz) { jlong *arr; int i; jlongArray jresult = (*jenv)->NewLongArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetLongArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseLongArrayElements(jenv, jresult, arr, 0); return jresult; } /* long[] support */ int SWIG_JavaArrayInLong (JNIEnv *jenv, jint **jarr, long **carr, jintArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetIntArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (long*) calloc(sz, sizeof(long)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseIntArrayElements(jenv, input, jarr, 0); } jintArray SWIG_JavaArrayOutLong (JNIEnv *jenv, long *result, jsize sz) { jint *arr; int i; jintArray jresult = (*jenv)->NewIntArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetIntArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseIntArrayElements(jenv, jresult, arr, 0); return jresult; } /* unsigned long[] support */ int SWIG_JavaArrayInUlong (JNIEnv *jenv, jlong **jarr, unsigned long **carr, jlongArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetLongArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (unsigned long*) calloc(sz, sizeof(unsigned long)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseLongArrayElements(jenv, input, jarr, 0); } jlongArray SWIG_JavaArrayOutUlong (JNIEnv *jenv, unsigned long *result, jsize sz) { jlong *arr; int i; jlongArray jresult = (*jenv)->NewLongArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetLongArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseLongArrayElements(jenv, jresult, arr, 0); return jresult; } /* jlong[] support */ int SWIG_JavaArrayInLonglong (JNIEnv *jenv, jlong **jarr, jlong **carr, jlongArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetLongArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (jlong*) calloc(sz, sizeof(jlong)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseLongArrayElements(jenv, input, jarr, 0); } jlongArray SWIG_JavaArrayOutLonglong (JNIEnv *jenv, jlong *result, jsize sz) { jlong *arr; int i; jlongArray jresult = (*jenv)->NewLongArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetLongArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseLongArrayElements(jenv, jresult, arr, 0); return jresult; } /* float[] support */ int SWIG_JavaArrayInFloat (JNIEnv *jenv, jfloat **jarr, float **carr, jfloatArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetFloatArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (float*) calloc(sz, sizeof(float)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseFloatArrayElements(jenv, input, jarr, 0); } jfloatArray SWIG_JavaArrayOutFloat (JNIEnv *jenv, float *result, jsize sz) { jfloat *arr; int i; jfloatArray jresult = (*jenv)->NewFloatArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetFloatArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseFloatArrayElements(jenv, jresult, arr, 0); return jresult; } /* double[] support */ int SWIG_JavaArrayInDouble (JNIEnv *jenv, jdouble **jarr, double **carr, jdoubleArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetDoubleArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (double*) calloc(sz, sizeof(double)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseDoubleArrayElements(jenv, input, jarr, 0); } jdoubleArray SWIG_JavaArrayOutDouble (JNIEnv *jenv, double *result, jsize sz) { jdouble *arr; int i; jdoubleArray jresult = (*jenv)->NewDoubleArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetDoubleArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseDoubleArrayElements(jenv, jresult, arr, 0); return jresult; } #endif #include "webp/types.h" int SWIG_JavaArrayInUint8 (JNIEnv *jenv, jbyte **jarr, uint8_t **carr, jbyteArray input); void SWIG_JavaArrayArgoutUint8 (JNIEnv *jenv, jbyte *jarr, uint8_t *carr, jbyteArray input); jbyteArray SWIG_JavaArrayOutUint8 (JNIEnv *jenv, uint8_t *result, jsize sz); /* uint8_t[] support */ int SWIG_JavaArrayInUint8 (JNIEnv *jenv, jbyte **jarr, uint8_t **carr, jbyteArray input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = (*jenv)->GetArrayLength(jenv, input); *jarr = (*jenv)->GetByteArrayElements(jenv, input, 0); if (!*jarr) return 0; *carr = (uint8_t*) calloc(sz, sizeof(uint8_t)); if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; iGetArrayLength(jenv, input); for (i=0; iReleaseByteArrayElements(jenv, input, jarr, 0); } jbyteArray SWIG_JavaArrayOutUint8 (JNIEnv *jenv, uint8_t *result, jsize sz) { jbyte *arr; int i; jbyteArray jresult = (*jenv)->NewByteArray(jenv, sz); if (!jresult) return NULL; arr = (*jenv)->GetByteArrayElements(jenv, jresult, 0); if (!arr) return NULL; for (i=0; iReleaseByteArrayElements(jenv, jresult, arr, 0); return jresult; } #include "webp/decode.h" #include "webp/encode.h" #define FillMeInAsSizeCannotBeDeterminedAutomatically \ (result ? (jint)ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0) static size_t ReturnedBufferSize( const char* function, int* width, int* height) { static const struct sizemap { const char* function; int size_multiplier; } size_map[] = { #ifdef SWIGJAVA { "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGR", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGRA", 4 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGRA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 }, #endif #ifdef SWIGPYTHON { "WebPDecodeRGB", 3 }, { "WebPDecodeRGBA", 4 }, { "WebPDecodeARGB", 4 }, { "WebPDecodeBGR", 3 }, { "WebPDecodeBGRA", 4 }, { "wrap_WebPEncodeRGB", 1 }, { "wrap_WebPEncodeBGR", 1 }, { "wrap_WebPEncodeRGBA", 1 }, { "wrap_WebPEncodeBGRA", 1 }, { "wrap_WebPEncodeLosslessRGB", 1 }, { "wrap_WebPEncodeLosslessBGR", 1 }, { "wrap_WebPEncodeLosslessRGBA", 1 }, { "wrap_WebPEncodeLosslessBGRA", 1 }, #endif { NULL, 0 } }; const struct sizemap* p; size_t size = 0; for (p = size_map; p->function; ++p) { if (!strcmp(function, p->function)) { size = *width * *height * p->size_multiplier; break; } } return size; } typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output); typedef size_t (*WebPEncodeLosslessFunction)(const uint8_t* rgb, int width, int height, int stride, uint8_t** output); static uint8_t* EncodeLossy(const uint8_t* rgb, int width, int height, int stride, float quality_factor, WebPEncodeFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, quality_factor, &output); // the values of following two will be interpreted by ReturnedBufferSize() // as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } static uint8_t* EncodeLossless(const uint8_t* rgb, int width, int height, int stride, WebPEncodeLosslessFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, &output); // the values of the following two will be interpreted by // ReturnedBufferSize() as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } // Changes the return type of WebPEncode* to more closely match Decode*. // This also makes it easier to wrap the output buffer in a native type rather // than dealing with the return pointer. // The additional parameters are to allow reuse of ReturnedBufferSize(), // unused2 and output_size will be used in this case. #define LOSSY_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride, float quality_factor) { \ return EncodeLossy(rgb, width, height, stride, quality_factor, \ FUNC, output_size, unused2); \ } \ LOSSY_WRAPPER(WebPEncodeRGB) LOSSY_WRAPPER(WebPEncodeBGR) LOSSY_WRAPPER(WebPEncodeRGBA) LOSSY_WRAPPER(WebPEncodeBGRA) #undef LOSSY_WRAPPER #define LOSSLESS_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride) { \ return EncodeLossless(rgb, width, height, stride, \ FUNC, output_size, unused2); \ } \ LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) #undef LOSSLESS_WRAPPER /* Work around broken gcj jni.h */ #ifdef __GCJ_JNI_H__ # undef JNIEXPORT # define JNIEXPORT # undef JNICALL # define JNICALL #endif #ifdef __cplusplus extern "C" { #endif SWIGEXPORT jint JNICALL Java_com_google_webp_libwebpJNI_WebPGetDecoderVersion(JNIEnv *jenv, jclass jcls) { jint jresult = 0 ; int result; (void)jenv; (void)jcls; result = (int)WebPGetDecoderVersion(); jresult = (jint)result; return jresult; } SWIGEXPORT jint JNICALL Java_com_google_webp_libwebpJNI_WebPGetInfo(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jint jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; int result; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (int)WebPGetInfo((uint8_t const *)arg1,arg2,arg3,arg4); jresult = (jint)result; SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeRGB(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (uint8_t *)WebPDecodeRGB((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeRGBA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (uint8_t *)WebPDecodeRGBA((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeARGB(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (uint8_t *)WebPDecodeARGB((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeBGR(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (uint8_t *)WebPDecodeBGR((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_WebPDecodeBGRA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jlong jarg2, jintArray jarg3, jintArray jarg4) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; jbyte *jarr1 ; int temp3 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (size_t)jarg2; { if (!jarg3) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg3) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg3 = &temp3; } { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } result = (uint8_t *)WebPDecodeBGRA((uint8_t const *)arg1,arg2,arg3,arg4); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp3; (*jenv)->SetIntArrayRegion(jenv, jarg3, 0, 1, &jvalue); } { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jint JNICALL Java_com_google_webp_libwebpJNI_WebPGetEncoderVersion(JNIEnv *jenv, jclass jcls) { jint jresult = 0 ; int result; (void)jenv; (void)jcls; result = (int)WebPGetEncoderVersion(); jresult = (jint)result; return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGB(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7, jfloat jarg8) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; arg8 = (float)jarg8; result = (uint8_t *)wrap_WebPEncodeRGB((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGR(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7, jfloat jarg8) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; arg8 = (float)jarg8; result = (uint8_t *)wrap_WebPEncodeBGR((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGBA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7, jfloat jarg8) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; arg8 = (float)jarg8; result = (uint8_t *)wrap_WebPEncodeRGBA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGRA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7, jfloat jarg8) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; arg8 = (float)jarg8; result = (uint8_t *)wrap_WebPEncodeBGRA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGB(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; result = (uint8_t *)wrap_WebPEncodeLosslessRGB((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; result = (uint8_t *)wrap_WebPEncodeLosslessBGR((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; result = (uint8_t *)wrap_WebPEncodeLosslessRGBA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } SWIGEXPORT jbyteArray JNICALL Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA(JNIEnv *jenv, jclass jcls, jbyteArray jarg1, jint jarg2, jint jarg3, jintArray jarg4, jint jarg5, jint jarg6, jint jarg7) { jbyteArray jresult = 0 ; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; jbyte *jarr1 ; int temp4 ; uint8_t *result = 0 ; (void)jenv; (void)jcls; if (!SWIG_JavaArrayInUint8(jenv, &jarr1, &arg1, jarg1)) return 0; arg2 = (int *)&jarg2; arg3 = (int *)&jarg3; { if (!jarg4) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return 0; } if ((*jenv)->GetArrayLength(jenv, jarg4) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return 0; } arg4 = &temp4; } arg5 = (int)jarg5; arg6 = (int)jarg6; arg7 = (int)jarg7; result = (uint8_t *)wrap_WebPEncodeLosslessBGRA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); jresult = SWIG_JavaArrayOutUint8(jenv, result, FillMeInAsSizeCannotBeDeterminedAutomatically); SWIG_JavaArrayArgoutUint8(jenv, jarr1, arg1, jarg1); { jint jvalue = (jint)temp4; (*jenv)->SetIntArrayRegion(jenv, jarg4, 0, 1, &jvalue); } free(arg1); free(result); return jresult; } #ifdef __cplusplus } #endif libwebp-1.4.0/swig/libwebp.swig0000644000014400001440000003401114606317060013342 0ustar // Copyright 2011 Google Inc. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // libwebp swig interface definition // // Author: James Zern (jzern@google.com) /* Go bindings: $ swig -go \ -outdir . \ -o libwebp_go_wrap.c libwebp.swig Java bindings: $ mkdir -p java/com/google/webp $ swig -java \ -package com.google.webp \ -outdir java/com/google/webp \ -o libwebp_java_wrap.c libwebp.swig Python bindings: $ swig -python \ -outdir . \ -o libwebp_python_wrap.c libwebp.swig */ #ifdef SWIGPYTHON %module(package="com.google.webp") libwebp %begin %{ #define SWIG_PYTHON_STRICT_BYTE_CHAR %} #else %module libwebp #endif /* SWIGPYTHON */ %include "constraints.i" %include "typemaps.i" #ifdef SWIGGO %apply (char* STRING, size_t LENGTH) { (const uint8_t* data, size_t data_size) } %rename(wrapped_WebPGetInfo) WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height); #endif /* SWIGGO */ #ifdef SWIGJAVA %include "arrays_java.i"; %include "enums.swg" /*NB: requires JDK-1.5+ See: http://www.swig.org/Doc1.3/Java.html#enumerations */ // map uint8_t* such that a byte[] is used %{ #include "webp/types.h" %} // from arrays_java.i (signed char) JAVA_ARRAYS_DECL(uint8_t, jbyte, Byte, Uint8) JAVA_ARRAYS_IMPL(uint8_t, jbyte, Byte, Uint8) JAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B") %apply uint8_t[] { uint8_t* } #endif /* SWIGJAVA */ #ifdef SWIGPYTHON %apply (char* STRING, size_t LENGTH) { (const uint8_t* data, size_t data_size) } %typemap(out) uint8_t* { $result = PyString_FromStringAndSize( (const char*)$1, ($1 == NULL) ? 0 : ReturnedBufferSize("$symname", arg3, arg4)); } %typemap (in) const uint8_t* rgb (Py_buffer rgb_buffer) { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer($input, (const void**)(&$1), &unused); if (!PyObject_CheckBuffer($input)) { SWIG_exception_fail(SWIG_TypeError, "in method '$symname', argument $argnum" " does not support the buffer interface"); } if (PyObject_GetBuffer($input, &rgb_buffer, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method '$symname', unable to get buffer view"); } $1 = ($1_ltype)rgb_buffer.buf; } %typemap(freearg) const uint8_t* rgb { PyBuffer_Release(&rgb_buffer$argnum); } %define DECODE_AUTODOC(func) %feature("autodoc", #func "(uint8_t data) -> (rgb, width, height)") func; %enddef %feature("autodoc", "1"); DECODE_AUTODOC(WebPDecodeRGB); DECODE_AUTODOC(WebPDecodeRGBA); DECODE_AUTODOC(WebPDecodeARGB); DECODE_AUTODOC(WebPDecodeBGR); DECODE_AUTODOC(WebPDecodeBGRA); %feature("autodoc", "WebPGetInfo(uint8_t data) -> (width, height)") WebPGetInfo; #endif /* SWIGPYTHON */ //------------------------------------------------------------------------------ // Decoder specific %apply int* OUTPUT { int* width, int* height } int WebPGetDecoderVersion(void); int WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height); #if defined(SWIGJAVA) || defined(SWIGPYTHON) // free the buffer returned by these functions after copying into // the native type %newobject WebPDecodeRGB; %newobject WebPDecodeRGBA; %newobject WebPDecodeARGB; %newobject WebPDecodeBGR; %newobject WebPDecodeBGRA; %typemap(newfree) uint8_t* "free($1);" uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, int* width, int* height); uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, int* width, int* height); uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, int* width, int* height); uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, int* width, int* height); uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, int* width, int* height); #endif /* SWIGJAVA || SWIGPYTHON */ //------------------------------------------------------------------------------ // Encoder specific #if defined(SWIGJAVA) || defined(SWIGPYTHON) int WebPGetEncoderVersion(void); #endif /* SWIGJAVA || SWIGPYTHON */ //------------------------------------------------------------------------------ // Wrapper code additions %{ #include "webp/decode.h" #include "webp/encode.h" %} #ifdef SWIGJAVA %{ #define FillMeInAsSizeCannotBeDeterminedAutomatically \ (result ? (jint)ReturnedBufferSize(__FUNCTION__, arg3, arg4) : 0) %} #endif /* SWIGJAVA */ #if defined(SWIGJAVA) || defined(SWIGPYTHON) %{ static size_t ReturnedBufferSize( const char* function, int* width, int* height) { static const struct sizemap { const char* function; int size_multiplier; } size_map[] = { #ifdef SWIGJAVA { "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGR", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGRA", 4 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGRA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 }, #endif #ifdef SWIGPYTHON { "WebPDecodeRGB", 3 }, { "WebPDecodeRGBA", 4 }, { "WebPDecodeARGB", 4 }, { "WebPDecodeBGR", 3 }, { "WebPDecodeBGRA", 4 }, { "wrap_WebPEncodeRGB", 1 }, { "wrap_WebPEncodeBGR", 1 }, { "wrap_WebPEncodeRGBA", 1 }, { "wrap_WebPEncodeBGRA", 1 }, { "wrap_WebPEncodeLosslessRGB", 1 }, { "wrap_WebPEncodeLosslessBGR", 1 }, { "wrap_WebPEncodeLosslessRGBA", 1 }, { "wrap_WebPEncodeLosslessBGRA", 1 }, #endif { NULL, 0 } }; const struct sizemap* p; size_t size = 0; for (p = size_map; p->function; ++p) { if (!strcmp(function, p->function)) { size = *width * *height * p->size_multiplier; break; } } return size; } %} %{ typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output); typedef size_t (*WebPEncodeLosslessFunction)(const uint8_t* rgb, int width, int height, int stride, uint8_t** output); static uint8_t* EncodeLossy(const uint8_t* rgb, int width, int height, int stride, float quality_factor, WebPEncodeFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, quality_factor, &output); // the values of following two will be interpreted by ReturnedBufferSize() // as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } static uint8_t* EncodeLossless(const uint8_t* rgb, int width, int height, int stride, WebPEncodeLosslessFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, &output); // the values of the following two will be interpreted by // ReturnedBufferSize() as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } %} #endif /* SWIGJAVA || SWIGPYTHON */ //------------------------------------------------------------------------------ // libwebp/encode wrapper functions #if defined(SWIGJAVA) || defined(SWIGPYTHON) %apply int* INPUT { int* unused1, int* unused2 } %apply int* OUTPUT { int* output_size } // free the buffer returned by these functions after copying into // the native type %newobject wrap_WebPEncodeRGB; %newobject wrap_WebPEncodeBGR; %newobject wrap_WebPEncodeRGBA; %newobject wrap_WebPEncodeBGRA; %newobject wrap_WebPEncodeLosslessRGB; %newobject wrap_WebPEncodeLosslessBGR; %newobject wrap_WebPEncodeLosslessRGBA; %newobject wrap_WebPEncodeLosslessBGRA; #ifdef SWIGJAVA // There's no reason to call these directly %javamethodmodifiers wrap_WebPEncodeRGB "private"; %javamethodmodifiers wrap_WebPEncodeBGR "private"; %javamethodmodifiers wrap_WebPEncodeRGBA "private"; %javamethodmodifiers wrap_WebPEncodeBGRA "private"; %javamethodmodifiers wrap_WebPEncodeLosslessRGB "private"; %javamethodmodifiers wrap_WebPEncodeLosslessBGR "private"; %javamethodmodifiers wrap_WebPEncodeLosslessRGBA "private"; %javamethodmodifiers wrap_WebPEncodeLosslessBGRA "private"; #endif /* SWIGJAVA */ #ifdef SWIGPYTHON // This autodoc will serve as a catch-all for wrap_*. %feature("autodoc", "private, do not call directly."); #endif %inline %{ // Changes the return type of WebPEncode* to more closely match Decode*. // This also makes it easier to wrap the output buffer in a native type rather // than dealing with the return pointer. // The additional parameters are to allow reuse of ReturnedBufferSize(), // unused2 and output_size will be used in this case. #define LOSSY_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride, float quality_factor) { \ return EncodeLossy(rgb, width, height, stride, quality_factor, \ FUNC, output_size, unused2); \ } \ LOSSY_WRAPPER(WebPEncodeRGB) LOSSY_WRAPPER(WebPEncodeBGR) LOSSY_WRAPPER(WebPEncodeRGBA) LOSSY_WRAPPER(WebPEncodeBGRA) #undef LOSSY_WRAPPER #define LOSSLESS_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride) { \ return EncodeLossless(rgb, width, height, stride, \ FUNC, output_size, unused2); \ } \ LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) #undef LOSSLESS_WRAPPER %} #endif /* SWIGJAVA || SWIGPYTHON */ //------------------------------------------------------------------------------ // Language specific #ifdef SWIGGO %insert(go_wrapper) %{ // WebPGetInfo has 2 output parameters, provide a version in the more natural // go idiom: func WebPGetInfo(webp []byte) (ok bool, width int, height int) { w := []int{0} h := []int{0} ok = Wrapped_WebPGetInfo(string(webp), w, h) != 0 width = w[0] height = h[0] return } %} #endif /* SWIGGO */ #ifdef SWIGJAVA %{ /* Work around broken gcj jni.h */ #ifdef __GCJ_JNI_H__ # undef JNIEXPORT # define JNIEXPORT # undef JNICALL # define JNICALL #endif %} %pragma(java) modulecode=%{ private static final int UNUSED = 1; private static int outputSize[] = { 0 }; %} %define CALL_ENCODE_LOSSY_WRAPPER(func) %pragma(java) modulecode=%{ public static byte[] func( byte[] rgb, int width, int height, int stride, float quality_factor) { return wrap_##func( rgb, UNUSED, UNUSED, outputSize, width, height, stride, quality_factor); } %} %enddef %define CALL_ENCODE_LOSSLESS_WRAPPER(func) %pragma(java) modulecode=%{ public static byte[] func( byte[] rgb, int width, int height, int stride) { return wrap_##func( rgb, UNUSED, UNUSED, outputSize, width, height, stride); } %} %enddef CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGB) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGBA) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGR) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGRA) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) #endif /* SWIGJAVA */ #ifdef SWIGPYTHON %pythoncode %{ _UNUSED = 1 %} %define CALL_ENCODE_LOSSY_WRAPPER(func) %pythoncode %{ def func(rgb, width, height, stride, quality_factor): """func(uint8_t rgb, int width, int height, int stride, float quality_factor) -> lossy_webp""" webp = wrap_##func( rgb, _UNUSED, _UNUSED, width, height, stride, quality_factor) if len(webp[0]) == 0: return None return webp[0] %} %enddef %define CALL_ENCODE_LOSSLESS_WRAPPER(func) %pythoncode %{ def func(rgb, width, height, stride): """func(uint8_t rgb, int width, int height, int stride) -> lossless_webp""" webp = wrap_##func(rgb, _UNUSED, _UNUSED, width, height, stride) if len(webp[0]) == 0: return None return webp[0] %} %enddef CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGB) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeRGBA) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGR) CALL_ENCODE_LOSSY_WRAPPER(WebPEncodeBGRA) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) CALL_ENCODE_LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) #endif /* SWIGPYTHON */ libwebp-1.4.0/swig/libwebp_gc.c0000644000014400001440000000267414606317060013276 0ustar /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 2.0.10 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ /* This file should be compiled with 6c/8c. */ #pragma dynimport _ _ "libwebp_go.so" #include "runtime.h" #include "cgocall.h" #ifdef _64BIT #define SWIG_PARM_SIZE 8 #else #define SWIG_PARM_SIZE 4 #endif #pragma dynimport _wrap_WebPGetDecoderVersion _wrap_WebPGetDecoderVersion "" extern void (*_wrap_WebPGetDecoderVersion)(void*); static void (*x_wrap_WebPGetDecoderVersion)(void*) = _wrap_WebPGetDecoderVersion; void ·WebPGetDecoderVersion(struct { uint8 x[SWIG_PARM_SIZE]; } p) { runtime·cgocall(x_wrap_WebPGetDecoderVersion, &p); } #pragma dynimport _wrap_wrapped_WebPGetInfo _wrap_wrapped_WebPGetInfo "" extern void (*_wrap_wrapped_WebPGetInfo)(void*); static void (*x_wrap_wrapped_WebPGetInfo)(void*) = _wrap_wrapped_WebPGetInfo; void ·Wrapped_WebPGetInfo(struct { uint8 x[(2 * SWIG_PARM_SIZE) + (3 * SWIG_PARM_SIZE) + (3 * SWIG_PARM_SIZE) + SWIG_PARM_SIZE]; } p) { runtime·cgocall(x_wrap_wrapped_WebPGetInfo, &p); } libwebp-1.4.0/swig/libwebp_python_wrap.c0000644000014400001440000052301714606317060015256 0ustar /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.12 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIG_PYTHON_STRICT_BYTE_CHAR #ifndef SWIGPYTHON #define SWIGPYTHON #endif #define SWIG_PYTHON_DIRECTOR_NO_VTABLE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG #else # include #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_FromStringAndSize(x, y) PyBytes_FromStringAndSize(x, y) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *cstr; char *newstr; Py_ssize_t len; str = PyUnicode_AsUTF8String(str); PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intintargfunc ssizessizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) { long result = 0; PyObject *i = PyNumber_Int(x); if (i) { result = PyInt_AsLong(i); Py_DECREF(i); } return result; } #endif #if PY_VERSION_HEX < 0x02050000 #define PyInt_FromSize_t(x) PyInt_FromLong((long)x) #endif #if PY_VERSION_HEX < 0x02040000 #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif #if PY_VERSION_HEX < 0x02030000 typedef struct { PyTypeObject type; PyNumberMethods as_number; PyMappingMethods as_mapping; PySequenceMethods as_sequence; PyBufferProcs as_buffer; PyObject *name, *slots; } PyHeapTypeObject; #endif #if PY_VERSION_HEX < 0x02030000 typedef destructor freefunc; #endif #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ (PY_MAJOR_VERSION > 3)) # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #endif #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #define Py_hash_t long #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX >= 0x03000000 SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { return PyInstanceMethod_New(func); } #else SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) { return NULL; } #endif #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN Py_ssize_t SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { Py_ssize_t i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { Py_ssize_t i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS SwigPyObject_repr(SwigPyObject *v) #else SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { # ifdef METH_NOARGS PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # else PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); # endif # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } /* We need a version taking two PyObject* parameters so it's a valid * PyCFunction to use in swigobject_methods[]. */ SWIGRUNTIME PyObject * SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_repr((SwigPyObject*)v); } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; /* PyObject_CallFunction() has the potential to silently drop the active active exception. In cases of unnamed temporary variable or where we just finished iterating over a generator StopIteration will be active right now, and this needs to remain true upon return from SwigPyObject_dealloc. So save and restore. */ PyObject *val = NULL, *type = NULL, *tb = NULL; PyErr_Fetch(&val, &type, &tb); if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } if (!res) PyErr_WriteUnraisable(destroy); PyErr_Restore(val, type, tb); Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!SwigPyObject_Check(next)) { PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_disown(PyObject *v) #else SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_acquire(PyObject *v) #else SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } #ifdef METH_NOARGS static PyObject* SwigPyObject_disown2(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_disown(v); } static PyObject* SwigPyObject_acquire2(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_acquire(v); } #endif SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #elif (PY_VERSION_HEX < 0x02050000) if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #else if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) #endif { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v); } else { SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown2, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire2,METH_NOARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr2, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * SwigPyObject_getattr(SwigPyObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ #elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpyobject_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobject_type) < 0) return NULL; #endif } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME int SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ (printfunc)SwigPyPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpypacked_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpypacked_type) < 0) return NULL; #endif } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return SWIG_Python_str_FromChar("this"); } static PyObject *swig_this = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (swig_this == NULL) swig_this = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst = 0; PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else # ifdef SWIGPY_USE_CAPSULE type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); # else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); # endif if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void #ifdef SWIGPY_USE_CAPSULE SWIG_Python_DestroyModule(PyObject *obj) #else SWIG_Python_DestroyModule(void *vptr) #endif { #ifdef SWIGPY_USE_CAPSULE swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); #else swig_module_info *swig_module = (swig_module_info *) vptr; #endif swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); swig_this = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a placeholder module object into sys.modules */ PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif #ifdef SWIGPY_USE_CAPSULE PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #else PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #endif } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { #ifdef SWIGPY_USE_CAPSULE descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); #else descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); #endif } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { #ifdef SWIGPY_USE_CAPSULE obj = PyCapsule_New((void*) descriptor, NULL, NULL); #else obj = PyCObject_FromVoidPtr(descriptor, NULL); #endif PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); } else { PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] #define SWIGTYPE_p_int swig_types[1] #define SWIGTYPE_p_uint8_t swig_types[2] static swig_type_info *swig_types[4]; static swig_module_info swig_module = {swig_types, 3, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _libwebp.so ------------------------------------------------*/ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_init PyInit__libwebp #else # define SWIG_init init_libwebp #endif #define SWIG_name "_libwebp" #define SWIGVERSION 0x030012 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) (void *)((const void *)(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) SWIGINTERNINLINE PyObject* SWIG_From_int (int value) { return PyInt_FromLong((long) value); } SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { #if PY_VERSION_HEX>=0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (PyBytes_Check(obj)) #else if (PyUnicode_Check(obj)) #endif #else if (PyString_Check(obj)) #endif { char *cstr; Py_ssize_t len; #if PY_VERSION_HEX>=0x03000000 #if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if(alloc) *alloc = SWIG_NEWOBJ; #endif PyBytes_AsStringAndSize(obj, &cstr, &len); #else PyString_AsStringAndSize(obj, &cstr, &len); #endif if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ #if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) #else if (*alloc == SWIG_NEWOBJ) #endif { *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1)); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { #if PY_VERSION_HEX>=0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) *cptr = PyBytes_AsString(obj); #else assert(0); /* Should never reach here with Unicode strings in Python 3 */ #endif #else *cptr = SWIG_Python_str_AsChar(obj); #endif } } if (psize) *psize = len + 1; #if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) Py_XDECREF(obj); #endif return SWIG_OK; } else { #if defined(SWIG_PYTHON_2_UNICODE) #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) #error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" #endif #if PY_VERSION_HEX<0x03000000 if (PyUnicode_Check(obj)) { char *cstr; Py_ssize_t len; if (!alloc && cptr) { return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { if (cptr) { if (alloc) *alloc = SWIG_NEWOBJ; *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1)); } if (psize) *psize = len + 1; Py_XDECREF(obj); return SWIG_OK; } else { Py_XDECREF(obj); } } #endif #endif swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; #if PY_VERSION_HEX < 0x03000000 } else if (PyInt_Check(obj)) { if (val) *val = (double) PyInt_AsLong(obj); return SWIG_OK; #endif } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else #endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { unsigned long v; res = SWIG_AsVal_unsigned_SS_long (obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } #ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; double d; res = SWIG_AsVal_double (obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } #endif return res; } #endif SWIGINTERNINLINE int SWIG_AsVal_size_t (PyObject * obj, size_t *val) { int res = SWIG_TypeError; #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { #endif unsigned long v; res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = (size_t)(v); #ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = (size_t)(v); } #endif return res; } #include "webp/decode.h" #include "webp/encode.h" static size_t ReturnedBufferSize( const char* function, int* width, int* height) { static const struct sizemap { const char* function; int size_multiplier; } size_map[] = { #ifdef SWIGJAVA { "Java_com_google_webp_libwebpJNI_WebPDecodeRGB", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeRGBA", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeARGB", 4 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGR", 3 }, { "Java_com_google_webp_libwebpJNI_WebPDecodeBGRA", 4 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeBGRA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGB", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGR", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessRGBA", 1 }, { "Java_com_google_webp_libwebpJNI_wrap_1WebPEncodeLosslessBGRA", 1 }, #endif #ifdef SWIGPYTHON { "WebPDecodeRGB", 3 }, { "WebPDecodeRGBA", 4 }, { "WebPDecodeARGB", 4 }, { "WebPDecodeBGR", 3 }, { "WebPDecodeBGRA", 4 }, { "wrap_WebPEncodeRGB", 1 }, { "wrap_WebPEncodeBGR", 1 }, { "wrap_WebPEncodeRGBA", 1 }, { "wrap_WebPEncodeBGRA", 1 }, { "wrap_WebPEncodeLosslessRGB", 1 }, { "wrap_WebPEncodeLosslessBGR", 1 }, { "wrap_WebPEncodeLosslessRGBA", 1 }, { "wrap_WebPEncodeLosslessBGRA", 1 }, #endif { NULL, 0 } }; const struct sizemap* p; size_t size = 0; for (p = size_map; p->function; ++p) { if (!strcmp(function, p->function)) { size = *width * *height * p->size_multiplier; break; } } return size; } typedef size_t (*WebPEncodeFunction)(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output); typedef size_t (*WebPEncodeLosslessFunction)(const uint8_t* rgb, int width, int height, int stride, uint8_t** output); static uint8_t* EncodeLossy(const uint8_t* rgb, int width, int height, int stride, float quality_factor, WebPEncodeFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, quality_factor, &output); // the values of following two will be interpreted by ReturnedBufferSize() // as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } static uint8_t* EncodeLossless(const uint8_t* rgb, int width, int height, int stride, WebPEncodeLosslessFunction encfn, int* output_size, int* unused) { uint8_t* output = NULL; const size_t image_size = encfn(rgb, width, height, stride, &output); // the values of the following two will be interpreted by // ReturnedBufferSize() as 'width' and 'height' in the size calculation. *output_size = image_size; *unused = 1; return image_size ? output : NULL; } // Changes the return type of WebPEncode* to more closely match Decode*. // This also makes it easier to wrap the output buffer in a native type rather // than dealing with the return pointer. // The additional parameters are to allow reuse of ReturnedBufferSize(), // unused2 and output_size will be used in this case. #define LOSSY_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride, float quality_factor) { \ return EncodeLossy(rgb, width, height, stride, quality_factor, \ FUNC, output_size, unused2); \ } \ LOSSY_WRAPPER(WebPEncodeRGB) LOSSY_WRAPPER(WebPEncodeBGR) LOSSY_WRAPPER(WebPEncodeRGBA) LOSSY_WRAPPER(WebPEncodeBGRA) #undef LOSSY_WRAPPER #define LOSSLESS_WRAPPER(FUNC) \ static uint8_t* wrap_##FUNC( \ const uint8_t* rgb, int* unused1, int* unused2, int* output_size, \ int width, int height, int stride) { \ return EncodeLossless(rgb, width, height, stride, \ FUNC, output_size, unused2); \ } \ LOSSLESS_WRAPPER(WebPEncodeLosslessRGB) LOSSLESS_WRAPPER(WebPEncodeLosslessBGR) LOSSLESS_WRAPPER(WebPEncodeLosslessRGBA) LOSSLESS_WRAPPER(WebPEncodeLosslessBGRA) #undef LOSSLESS_WRAPPER SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else #endif if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (int)(v); } } return res; } /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite /* isfinite() is a macro for C99 */ # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined __cplusplus && __cplusplus >= 201103L /* Use a template so that this works whether isfinite() is std::isfinite() or * in the global namespace. The reality seems to vary between compiler * versions. * * Make sure namespace std exists to avoid compiler warnings. * * extern "C++" is required as this fragment can end up inside an extern "C" { } block */ namespace std { } extern "C++" template inline int SWIG_isfinite_func(T x) { using namespace std; return isfinite(x); } # define SWIG_isfinite(X) (SWIG_isfinite_func(X)) # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include # define SWIG_isfinite(X) (finite(X)) # endif #endif /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif SWIGINTERN int SWIG_AsVal_float (PyObject * obj, float *val) { double v; int res = SWIG_AsVal_double (obj, &v); if (SWIG_IsOK(res)) { if (SWIG_Float_Overflow_Check(v)) { return SWIG_OverflowError; } else { if (val) *val = (float)(v); } } return res; } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_WebPGetDecoderVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int result; if (!PyArg_ParseTuple(args,(char *)":WebPGetDecoderVersion")) SWIG_fail; result = (int)WebPGetDecoderVersion(); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_WebPGetInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; int result; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPGetInfo",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPGetInfo" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (int)WebPGetInfo((uint8_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPDecodeRGB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPDecodeRGB",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPDecodeRGB" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (uint8_t *)WebPDecodeRGB((uint8_t const *)arg1,arg2,arg3,arg4); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("WebPDecodeRGB", arg3, arg4)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); free(result); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPDecodeRGBA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPDecodeRGBA",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPDecodeRGBA" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (uint8_t *)WebPDecodeRGBA((uint8_t const *)arg1,arg2,arg3,arg4); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("WebPDecodeRGBA", arg3, arg4)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); free(result); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPDecodeARGB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPDecodeARGB",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPDecodeARGB" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (uint8_t *)WebPDecodeARGB((uint8_t const *)arg1,arg2,arg3,arg4); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("WebPDecodeARGB", arg3, arg4)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); free(result); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPDecodeBGR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPDecodeBGR",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPDecodeBGR" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (uint8_t *)WebPDecodeBGR((uint8_t const *)arg1,arg2,arg3,arg4); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("WebPDecodeBGR", arg3, arg4)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); free(result); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPDecodeBGRA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:WebPDecodeBGRA",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "WebPDecodeBGRA" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(buf1); arg2 = (size_t)(size1 - 1); result = (uint8_t *)WebPDecodeBGRA((uint8_t const *)arg1,arg2,arg3,arg4); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("WebPDecodeBGRA", arg3, arg4)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); free(result); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_WebPGetEncoderVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int result; if (!PyArg_ParseTuple(args,(char *)":WebPGetEncoderVersion")) SWIG_fail; result = (int)WebPGetEncoderVersion(); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeRGB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:wrap_WebPEncodeRGB",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeRGB', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeRGB', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeRGB" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeRGB" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeRGB" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeRGB" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeRGB" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_float(obj6, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wrap_WebPEncodeRGB" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); result = (uint8_t *)wrap_WebPEncodeRGB((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeRGB", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeBGR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:wrap_WebPEncodeBGR",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeBGR', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeBGR', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeBGR" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeBGR" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeBGR" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeBGR" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeBGR" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_float(obj6, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wrap_WebPEncodeBGR" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); result = (uint8_t *)wrap_WebPEncodeBGR((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeBGR", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeRGBA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:wrap_WebPEncodeRGBA",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeRGBA', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeRGBA', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeRGBA" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeRGBA" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeRGBA" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeRGBA" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeRGBA" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_float(obj6, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wrap_WebPEncodeRGBA" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); result = (uint8_t *)wrap_WebPEncodeRGBA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeRGBA", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeBGRA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; float arg8 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:wrap_WebPEncodeBGRA",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeBGRA', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeBGRA', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeBGRA" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeBGRA" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeBGRA" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeBGRA" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeBGRA" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_float(obj6, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wrap_WebPEncodeBGRA" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); result = (uint8_t *)wrap_WebPEncodeBGRA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeBGRA", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeLosslessRGB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:wrap_WebPEncodeLosslessRGB",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeLosslessRGB', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeLosslessRGB', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessRGB" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessRGB" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeLosslessRGB" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeLosslessRGB" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeLosslessRGB" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); result = (uint8_t *)wrap_WebPEncodeLosslessRGB((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeLosslessRGB", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeLosslessBGR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:wrap_WebPEncodeLosslessBGR",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeLosslessBGR', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeLosslessBGR', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessBGR" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessBGR" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeLosslessBGR" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeLosslessBGR" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeLosslessBGR" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); result = (uint8_t *)wrap_WebPEncodeLosslessBGR((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeLosslessBGR", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeLosslessRGBA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:wrap_WebPEncodeLosslessRGBA",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeLosslessRGBA', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeLosslessRGBA', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessRGBA" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessRGBA" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeLosslessRGBA" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeLosslessRGBA" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeLosslessRGBA" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); result = (uint8_t *)wrap_WebPEncodeLosslessRGBA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeLosslessRGBA", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } SWIGINTERN PyObject *_wrap_wrap_WebPEncodeLosslessBGRA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int arg6 ; int arg7 ; Py_buffer rgb_buffer1 ; int temp2 ; int res2 = 0 ; int temp3 ; int res3 = 0 ; int temp4 ; int res4 = SWIG_TMPOBJ ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; uint8_t *result = 0 ; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:wrap_WebPEncodeLosslessBGRA",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; { // NB: with Python < 2.6 the old style buffer protocol may be used: // Py_ssize_t unused; // PyObject_AsReadBuffer(obj0, (const void**)(&arg1), &unused); if (!PyObject_CheckBuffer(obj0)) { SWIG_exception_fail(SWIG_TypeError, "in method 'wrap_WebPEncodeLosslessBGRA', argument 1" " does not support the buffer interface"); } if (PyObject_GetBuffer(obj0, &rgb_buffer1, PyBUF_SIMPLE)) { SWIG_exception_fail(SWIG_RuntimeError, "in method 'wrap_WebPEncodeLosslessBGRA', unable to get buffer view"); } arg1 = (uint8_t *)rgb_buffer1.buf; } if (!(SWIG_IsOK((res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj1, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessBGRA" "', argument " "2"" of type '" "int""'"); } temp2 = (int)(val); arg2 = &temp2; res2 = SWIG_AddTmpMask(ecode); } if (!(SWIG_IsOK((res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3),SWIGTYPE_p_int,0))))) { int val; int ecode = SWIG_AsVal_int(obj2, &val); if (!SWIG_IsOK(ecode)) { SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "wrap_WebPEncodeLosslessBGRA" "', argument " "3"" of type '" "int""'"); } temp3 = (int)(val); arg3 = &temp3; res3 = SWIG_AddTmpMask(ecode); } ecode5 = SWIG_AsVal_int(obj3, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wrap_WebPEncodeLosslessBGRA" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj4, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wrap_WebPEncodeLosslessBGRA" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj5, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wrap_WebPEncodeLosslessBGRA" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); result = (uint8_t *)wrap_WebPEncodeLosslessBGRA((uint8_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); { resultobj = PyString_FromStringAndSize( (const char*)result, (result == NULL) ? 0 : ReturnedBufferSize("wrap_WebPEncodeLosslessBGRA", arg3, arg4)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); free(result); return resultobj; fail: { PyBuffer_Release(&rgb_buffer1); } if (SWIG_IsNewObj(res2)) free((char*)arg2); if (SWIG_IsNewObj(res3)) free((char*)arg3); return NULL; } static PyMethodDef SwigMethods[] = { { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL}, { "WebPGetDecoderVersion", _wrap_WebPGetDecoderVersion, METH_VARARGS, (char *)"WebPGetDecoderVersion() -> int"}, { "WebPGetInfo", _wrap_WebPGetInfo, METH_VARARGS, (char *)"WebPGetInfo(uint8_t data) -> (width, height)"}, { "WebPDecodeRGB", _wrap_WebPDecodeRGB, METH_VARARGS, (char *)"WebPDecodeRGB(uint8_t data) -> (rgb, width, height)"}, { "WebPDecodeRGBA", _wrap_WebPDecodeRGBA, METH_VARARGS, (char *)"WebPDecodeRGBA(uint8_t data) -> (rgb, width, height)"}, { "WebPDecodeARGB", _wrap_WebPDecodeARGB, METH_VARARGS, (char *)"WebPDecodeARGB(uint8_t data) -> (rgb, width, height)"}, { "WebPDecodeBGR", _wrap_WebPDecodeBGR, METH_VARARGS, (char *)"WebPDecodeBGR(uint8_t data) -> (rgb, width, height)"}, { "WebPDecodeBGRA", _wrap_WebPDecodeBGRA, METH_VARARGS, (char *)"WebPDecodeBGRA(uint8_t data) -> (rgb, width, height)"}, { "WebPGetEncoderVersion", _wrap_WebPGetEncoderVersion, METH_VARARGS, (char *)"WebPGetEncoderVersion() -> int"}, { "wrap_WebPEncodeRGB", _wrap_wrap_WebPEncodeRGB, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeBGR", _wrap_wrap_WebPEncodeBGR, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeRGBA", _wrap_wrap_WebPEncodeRGBA, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeBGRA", _wrap_wrap_WebPEncodeBGRA, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeLosslessRGB", _wrap_wrap_WebPEncodeLosslessRGB, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeLosslessBGR", _wrap_wrap_WebPEncodeLosslessBGR, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeLosslessRGBA", _wrap_wrap_WebPEncodeLosslessRGBA, METH_VARARGS, (char *)"private, do not call directly."}, { "wrap_WebPEncodeLosslessBGRA", _wrap_wrap_WebPEncodeLosslessBGRA, METH_VARARGS, (char *)"private, do not call directly."}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_uint8_t = {"_p_uint8_t", "uint8_t *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_char, &_swigt__p_int, &_swigt__p_uint8_t, }; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_uint8_t[] = { {&_swigt__p_uint8_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_char, _swigc__p_int, _swigc__p_uint8_t, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ (printfunc) swig_varlink_print, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; varlink_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 varlink_type.ob_type = &PyType_Type; #else if (PyType_Ready(&varlink_type) < 0) return NULL; #endif } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; memcpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; memcpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { # if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, # else { PyObject_HEAD_INIT(NULL) NULL, /* m_init */ 0, /* m_index */ NULL, /* m_copy */ }, # endif (char *) SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = { 0, 0, 0, 0, 0, 0, 0 }; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { SwigPyObject_own, SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; PyTypeObject *swigpyobject; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* Metaclass is used to implement static member variables */ metatype = SwigPyObjectType(); assert(metatype); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN swigpyobject = SwigPyObject_TypeOnce(); SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = swigpyobject; } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); #if PY_VERSION_HEX >= 0x03000000 return m; #else return; #endif } libwebp-1.4.0/swig/libwebp_go_wrap.c0000644000014400001440000001456614606317060014346 0ustar /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 2.0.10 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGMODULE libwebp /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif #include #include #include #include #include typedef long long intgo; typedef unsigned long long uintgo; typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; #define swiggo_size_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1]; #define swiggo_size_assert(t, n) swiggo_size_assert_eq(sizeof(t), n, swiggo_sizeof_##t##_is_not_##n) swiggo_size_assert(char, 1) swiggo_size_assert(short, 2) swiggo_size_assert(int, 4) typedef long long swiggo_long_long; swiggo_size_assert(swiggo_long_long, 8) swiggo_size_assert(float, 4) swiggo_size_assert(double, 8) #ifdef __cplusplus extern "C" { #endif extern void crosscall2(void (*fn)(void *, int), void *, int); extern void _cgo_allocate(void *, int); extern void _cgo_panic(void *, int); #ifdef __cplusplus } #endif static void *_swig_goallocate(size_t len) { struct { size_t len; void *ret; } a; a.len = len; crosscall2(_cgo_allocate, &a, (int) sizeof a); return a.ret; } static void _swig_gopanic(const char *p) { struct { const char *p; } a; a.p = p; crosscall2(_cgo_panic, &a, (int) sizeof a); } static _gostring_ _swig_makegostring(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)_swig_goallocate(l + 1); memcpy(ret.p, p, l); ret.n = l; return ret; } #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { _swig_gopanic(msg); } else #define SWIG_exception(code, msg) _swig_gopanic(msg) #include "webp/decode.h" #include "webp/encode.h" #ifdef __cplusplus extern "C" { #endif void _wrap_WebPGetDecoderVersion(void *swig_v) { int result; struct swigargs { long : 0; intgo result; } *swig_a = (struct swigargs *) swig_v; result = (int)WebPGetDecoderVersion(); swig_a->result = result; } void _wrap_wrapped_WebPGetInfo(void *swig_v) { uint8_t *arg1 = (uint8_t *) 0 ; size_t arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int temp3 ; int temp4 ; int result; struct swigargs { _gostring_ arg1; _goslice_ arg3; _goslice_ arg4; long : 0; intgo result; } *swig_a = (struct swigargs *) swig_v; arg1 = (uint8_t *)swig_a->arg1.p; arg2 = (size_t)swig_a->arg1.n; { if (swig_a->arg3.len == 0) { _swig_gopanic("array must contain at least 1 element"); } arg3 = &temp3; } { if (swig_a->arg4.len == 0) { _swig_gopanic("array must contain at least 1 element"); } arg4 = &temp4; } result = (int)WebPGetInfo((uint8_t const *)arg1,arg2,arg3,arg4); swig_a->result = result; { int* a = (int *) swig_a->arg3.array; a[0] = temp3; } { int* a = (int *) swig_a->arg4.array; a[0] = temp4; } } #ifdef __cplusplus } #endif libwebp-1.4.0/gradlew0000755000014400001440000001320414606317060011426 0ustar #!/usr/bin/env sh # # Copyright 2015 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin or MSYS, switch paths to Windows format before running java if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=`expr $i + 1` done case $i in 0) set -- ;; 1) set -- "$args0" ;; 2) set -- "$args0" "$args1" ;; 3) set -- "$args0" "$args1" "$args2" ;; 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" exec "$JAVACMD" "$@" libwebp-1.4.0/m4/0000755000014400001440000000000014606317241010374 5ustar libwebp-1.4.0/m4/ax_pthread.m40000644000014400001440000003267614606317060012772 0ustar # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program 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 General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 21 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case ${host_os} in solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac # Clang doesn't consider unrecognized options an error unless we specify # -Werror. We throw in some extra Clang-specific options to ensure that # this doesn't happen for GCC, which also accepts -Werror. AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) save_CFLAGS="$CFLAGS" ax_pthread_extra_flags="-Werror" CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], [AC_MSG_RESULT([yes])], [ax_pthread_extra_flags= AC_MSG_RESULT([no])]) CFLAGS="$save_CFLAGS" if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $attr; return attr /* ; */])], [attr_name=$attr; break], []) done AC_MSG_RESULT([$attr_name]) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case ${host_os} in aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; osf* | hpux*) flag="-D_REENTRANT";; solaris*) if test "$GCC" = "yes"; then flag="-D_REENTRANT" else # TODO: What about Clang on Solaris? flag="-mt -D_REENTRANT" fi ;; esac AC_MSG_RESULT([$flag]) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: compile with *_r variant if test "x$GCC" != xyes; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD libwebp-1.4.0/m4/lt~obsolete.m40000644000014400001440000001400714606317241013212 0ustar # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free # Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) libwebp-1.4.0/m4/ltoptions.m40000644000014400001440000003427514606317241012704 0ustar # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free # Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) libwebp-1.4.0/m4/ltversion.m40000644000014400001440000000131214606317241012660 0ustar # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation, # Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4245 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.7]) m4_define([LT_PACKAGE_REVISION], [2.4.7]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.7' macro_revision='2.4.7' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) libwebp-1.4.0/m4/ltsugar.m40000644000014400001440000001045314606317241012322 0ustar # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) libwebp-1.4.0/m4/libtool.m40000644000014400001440000113165214606317241012313 0ustar # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 59 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_DECL_FILECMD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} _LT_DECL([], [AR], [1], [The archiver]) # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because thats what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS _LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. _LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -z "$STRIP"; then AC_MSG_RESULT([no]) else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_FILECMD # ---------------- # Check for a file(cmd) program that can be used to detect file type and magic m4_defun([_LT_DECL_FILECMD], [AC_CHECK_TOOL([FILECMD], [file], [:]) _LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) ])# _LD_DECL_FILECMD # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS libwebp-1.4.0/PRESUBMIT.py0000644000014400001440000002152314606317060012002 0ustar # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """Top-level presubmit script for libwebp. See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for details on the presubmit API built into depot_tools. """ import re import subprocess2 USE_PYTHON3 = True _BASH_INDENTATION = "2" _GIT_COMMIT_SUBJECT_LENGTH = 65 _INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"] _INCLUDE_MAN_FILES_ONLY = [r"man/.+\.1$"] _INCLUDE_SOURCE_FILES_ONLY = [r".*\.[ch]$"] _LIBWEBP_MAX_LINE_LENGTH = 80 def _CheckCommitSubjectLength(input_api, output_api): """Ensures commit's subject length is no longer than 65 chars.""" name = "git-commit subject" cmd = ["git", "log", "-1", "--pretty=%s"] start = input_api.time.time() proc = subprocess2.Popen( cmd, stderr=subprocess2.PIPE, stdout=subprocess2.PIPE, universal_newlines=True) stdout, _ = proc.communicate() duration = input_api.time.time() - start if not re.match(r"^Revert", stdout) and (len(stdout) - 1) > _GIT_COMMIT_SUBJECT_LENGTH: failure_msg = ( "The commit subject: %s is too long (%d chars)\n" "Try to keep this to 50 or less (up to 65 is permitted for " "non-reverts).\n" "https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-" "Project#_commit_guidelines") % (stdout, len(stdout) - 1) return output_api.PresubmitError("%s\n (%4.2fs) failed\n%s" % (name, duration, failure_msg)) return output_api.PresubmitResult("%s\n (%4.2fs) success" % (name, duration)) def _CheckDuplicateFiles(input_api, output_api): """Ensures there are not repeated filenames.""" all_files = [] for f in input_api.change.AllFiles(): for include_file in _INCLUDE_SOURCE_FILES_ONLY: if re.match(include_file, f): all_files.append(f) break basename_to_path = {} for f in all_files: basename_file = input_api.basename(f) if basename_file in basename_to_path: basename_to_path[basename_file].append(f) else: basename_to_path[basename_file] = [f] dupes = [] for files in basename_to_path.values(): if len(files) > 1: dupes.extend(files) if dupes: return output_api.PresubmitError( "Duplicate source files, rebase or rename some to make them unique:\n%s" % dupes) return output_api.PresubmitResult("No duplicates, success\n") def _GetFilesToSkip(input_api): return list(input_api.DEFAULT_FILES_TO_SKIP) + [ r"swig/.*\.py$", r"\.pylintrc$", ] def _RunManCmd(input_api, output_api, man_file): """man command wrapper.""" cmd = ["man", "--warnings", "-EUTF-8", "-l", "-Tutf8", "-Z", man_file] name = "Check %s file." % man_file start = input_api.time.time() output, _ = subprocess2.communicate( cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True) duration = input_api.time.time() - start if output[1]: return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" % (name, " ".join(cmd), duration, output[1])) return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" % (name, " ".join(cmd), duration)) def _RunShellCheckCmd(input_api, output_api, bash_file): """shellcheck command wrapper.""" cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file] name = "Check %s file." % bash_file start = input_api.time.time() output, rc = subprocess2.communicate( cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True) duration = input_api.time.time() - start if rc == 0: return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" % (name, " ".join(cmd), duration)) return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" % (name, " ".join(cmd), duration, output[1])) def _RunShfmtCheckCmd(input_api, output_api, bash_file): """shfmt command wrapper.""" cmd = [ "shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d", bash_file ] name = "Check %s file." % bash_file start = input_api.time.time() output, rc = subprocess2.communicate( cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True) duration = input_api.time.time() - start if rc == 0: return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" % (name, " ".join(cmd), duration)) return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" % (name, " ".join(cmd), duration, output[1])) def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check): """Ensure that libwebp/ files are clean.""" file_filter = lambda x: input_api.FilterSourceFile( x, files_to_check=files_to_check, files_to_skip=None) affected_files = input_api.change.AffectedFiles(file_filter=file_filter) results = [ run_cmd(input_api, output_api, f.AbsoluteLocalPath()) for f in affected_files ] return results def _CommonChecks(input_api, output_api): """Ensures this patch does not have trailing spaces, extra EOLs, or long lines. """ results = [] results.extend( input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol( input_api, output_api)) results.extend( input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api)) results.extend( input_api.canned_checks.CheckChangeHasNoStrayWhitespace( input_api, output_api)) results.append(_CheckCommitSubjectLength(input_api, output_api)) results.append(_CheckDuplicateFiles(input_api, output_api)) source_file_filter = lambda x: input_api.FilterSourceFile( x, files_to_skip=_GetFilesToSkip(input_api)) results.extend( input_api.canned_checks.CheckLongLines( input_api, output_api, maxlen=_LIBWEBP_MAX_LINE_LENGTH, source_file_filter=source_file_filter)) results.extend( input_api.canned_checks.CheckPatchFormatted( input_api, output_api, check_clang_format=False, check_python=True, result_factory=output_api.PresubmitError)) results.extend( _RunCmdOnCheckedFiles(input_api, output_api, _RunManCmd, _INCLUDE_MAN_FILES_ONLY)) # Run pylint. results.extend( input_api.canned_checks.RunPylint( input_api, output_api, files_to_skip=_GetFilesToSkip(input_api), pylintrc=".pylintrc", version="2.7")) # Binaries shellcheck and shfmt are not installed in depot_tools. # Installation is needed try: subprocess2.communicate(["shellcheck", "--version"]) results.extend( _RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd, _INCLUDE_BASH_FILES_ONLY)) print("shfmt") subprocess2.communicate(["shfmt", "-version"]) results.extend( _RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd, _INCLUDE_BASH_FILES_ONLY)) except OSError as os_error: results.append( output_api.PresubmitPromptWarning( "%s\nPlease install missing binaries locally." % os_error.args[0])) return results def CheckChangeOnUpload(input_api, output_api): results = [] results.extend(_CommonChecks(input_api, output_api)) return results def CheckChangeOnCommit(input_api, output_api): results = [] results.extend(_CommonChecks(input_api, output_api)) return results libwebp-1.4.0/Makefile.am0000644000014400001440000000023314606317060012105 0ustar ACLOCAL_AMFLAGS = -I m4 SUBDIRS = sharpyuv src imageio man EXTRA_DIST = COPYING autogen.sh if BUILD_EXTRAS SUBDIRS += extras endif SUBDIRS += examples libwebp-1.4.0/ar-lib0000755000014400001440000001336314606317243011160 0ustar #! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2019-07-04.01; # UTC # Copyright (C) 2010-2021 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin | msys) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <, 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libwebp-1.4.0/gradle/0000755000014400001440000000000014606317060011311 5ustar libwebp-1.4.0/gradle/wrapper/0000755000014400001440000000000014606317060012771 5ustar libwebp-1.4.0/gradle/wrapper/gradle-wrapper.properties0000644000014400001440000000031214606317060020017 0ustar distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists libwebp-1.4.0/gradle/wrapper/gradle-wrapper.jar0000644000014400001440000016250714606317060016416 0ustar PK A META-INF/PK Am±>=@?META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àåòÌ-ÈIÍMÍ+I, ê†d–ä¤Z)¸%¦ä¤*„%¤ñrñrPK Aorg/PK A org/gradle/PK Aorg/gradle/wrapper/PK A•%Ó¦¹/org/gradle/wrapper/BootstrapMainStarter$1.classRËnÓ@=Ó¸u1¦„ôEy”@_IikÁ6ˆU‘@.,RuØLì!™ÊGã ü6 ±àø(ı ]t1ssÎÕ¹÷ÎÏ_ßxŠ½ó¸³ˆ»îá¾M|4ži£ÝsZ«}.à穸k£ÞŒ‡=eÏd/c¦ç‰ÌÎ¥Õeié0“c“ ”=<ÚO¦õ±b»í+7.Pÿ£ômïB%œÀÚßM• Ñ-°wźláƒ6i<øZ2³93Ööìèê³#ð‡Ò±w¹Úºl hÂãâòø¹æx8F×èE´‚v~ÿÄ—ê9à½P%pw8Ð.ÑR3êSò ѵ²ÜAcî+jŸgèQEoN SzéÝB£z÷±Œ•ªÄjÅ\Ã:­‡ÛØÀ zQ^ÅÁoPK Ai,«$ -org/gradle/wrapper/BootstrapMainStarter.classVÛSWÿsÙ°,ˆ1*‰‚±BI/µV°V(Ð-m´Ú.É!¬nvéf£Ðjï­½<÷·þ ö%Ø2µÓ—v¦“ãô;»IIb¼ÀÌÙ³ßõ÷]7ÿ>ýý1€£øIF2^à C˜”0%cïÊðA•0#aVF —d\Æ{2æǼŒd\ÁUq¼BNP®…p]ÂR2"¸!c7%|؉^|$A aQØÊ‹£ .aIÆ~ †¢„eeÊ4¹1´r™—‚§tSwN3øÉ+ þŒUà ÛUÝ䳕Ò"·çµEƒ(aÕÊkÆÍÖÅ{èw–u²‘T-»˜.ÚZÁàé»¶¶²Âíô9ËrʽÌhº™u4Ûáö8C ,® ‰ëê-펖64³˜Î:¶nÇ=Šn¥/èwñhv‘<ìl#Ì {.'­aénVfèð¸ÓšMèó–éðUÇ [µ´'bÔÓ0¹“^˜SXB¹D¨]ÃŽß.I¸üî,[†Xƒ€Í— žwÒ$w7'nm¥ž¼H«ÙSçI¾‹r•¿=£­¸btr6±šç+Žn™e ·¨:KºYPµŠ™_æ¶_¢%u­ÉPŒ-q iûõgôÅóºMÐ-{\f­Šç‚I‰jWË”0 `ƒ NãÊÂV8sÓÑKüØ «bâ¦åÄ Ê‡ÃãÎ2_t+¯c‹OŸ‹ëf\Ðɧ¾XâCƒå¡CÏ–“K‹·­„Û ”ò³ç9%¥9 ,¬HøX Ê©£ ‚; îŠc«Ö|‚OÜÃ}Ê.µwÊë¦TkÊ)¢à3|N­*Z‚RÛRU_àK_ákê¤zÒ3†U梾 ¾Á`\­4‹T ä[ßá‚ïñ€¦ì‡làˆ‚ð#ÃÐ+*0ô>¯iò¶X åìiFZ$K–]Òh²O&žÕÆñõêVoÑæ‰ÞÕFW¬€c-ÌM‘ßD²qh§Æ›ë:U“TŸ‘T…ñ–ÊÔ;#RäNv­ìðRózH$['tk=ÊeÍæ&Å›¬o²º§çh‰8ò6¿lsÜ•¯ØÂPý=ÒäÖ£ ðeîdÚ,±Xâî: º×¶Ø`»Ô¶Ùl"´zñϼ¤”žNòEë/¨›w¬Û¼¥-j=𒶨‘¨¨y1/ [Ö\ûf òUÚe÷“v¡S/7,¶ƒxBY|·šÍ™ZI,<ñJ¶ìG xâÏ&–¯Ó[šžŒžá °_é² Ct]b :OI Ó“a£$EÊì$úî>¶ÙCÿ w¾\Øïÿœo4ûÁ Hn"”#RGÎw¨ ¹ŠNb(Utm {ÌÿÛ£þ*z¢þðŽ*Âch ¼“¤#9_xW¶ŠÝcÁhyGè}ÏÕ¨ÿ/ô®CŽúC”A€ö» Sè¤s/A݇ô¡Ÿ~8Œ#Ž E¯Rü7q%нBÑß# ܤ@-8q;Dv˜{Kã0À*ŽÐÍG¶ÎÑ¢cäM%Ê8N¼›äãMœ „½UK•Ç;I¼1¢D°í ú%Ğↄ„ˆDvN¹˜Þ¦ŸDôí©Õâg¢ùèy|±Üpxïö©#Uô­c€ýëèÙÄþÜâU˜ý]£ý¿@õ}Ⱥ¥iˆP8T©(Õj@§ ö1*BŽ“Ü ºqg)&r•â¼1 Œ3D¯\>CGÞóËé²ÏKŽH/ù|aAøé¼2fêJÂe†£Ûö–\Ç㥋¾WöE¥’·+p•ëÞ_,Ú^µ²qFøEá ,Gø'm×N3œOîBà© {¦ÂC^‰¸6åmW\¨ÎÏ ’Ï:¤iÎ{EîLqß–Ï5e8˜³+ Ãâ ¯:ÁN‘¬œKëÃ+A§vãuè?¢Qi¥š­ð ZšãnY”Z’ù«|‘§]¤/Mä2££2'ƒ—J2Cããf†hÑs)hn9˜£ÊŽ2˜ëÁeÄ(!¯ñ…ZÆ ÉÕ]o/‹‚—å” ž\Ãj-V}Ÿ,OöL:¯ÁÛ^:7>r½(Ûs‰EU¶XuhJžpSq©Ý pgfl“âºÊ,xUòÉÚ’et=N¿´°-´b¯…6´[؇ GÑO¬ú ¼aa ‡qÄ¢÷æE“.aÊÀ´´¼Ie݆6Ã>¥u¨ô鉪ØóbÃ(g ¼eám\¶ð.x—!ó?ºNIoâÏ^EªNïSŒ7ƒ–”jßñm¡—j­» Çjƒ¤Ðh¼ü‚x¿*Ü¢Èôl1œU§å`d£W|Û-Óà-r§*ƯP瓹­ŽkÈ)¾]0â˜Ú§m+µÉ9ß[R™Zã¦aŒË¡Ðæùu9C¹œœ!mÞ¦¶uìR3tÑmñ…†f91tý5Ë¡¡5$ç†Ö0Ù÷ãɃô4KzÖxj,Õ»ŒPªoZJ[FøŽòê$Ù ä—äûõxˆF|EH_è§üÑCêº+\¦v9D{šÍÞLjÐ쪿ù!ö¤>…öfª«5¼äÍ[ˆ’2Ôù Æ´4?@L.½d¼‹º$+M±:ƒä7tÙKXßQvßÒèÃ8Ÿ»q&´ vƒxIÅn=d ©]¯:×G{Z<ÖBjz¿j”Õ(gcfª³{õ1Ó™Ðú-!fá„þHÎ }&ÑŽ¾‹†¦S ªxMƒúˆÎ´ë+h¼GA«–Æ3¨#ù3õj̯8†ßÈþ'øüü¥R9Nä‰|šÕÉbÒÉçUc²éeURLídRšJªÚÀ9VåE7D-¯ ÊJzÇc%­ûFç /ަk¬bÏ*š?Ùh}DEû{‡V¯¡Åñ’B séù2žUÿ¼tù OšÿPK AVUPL4org/gradle/wrapper/Download$ProxyAuthenticator.class•S]oA=³P·KÅUÁZûa[ëR•¥~Eƒ1i0MLÐ4©61}šÂÖlwÉ0HùWú" 5þ”ñΖVÒªû°3sï9çž;7óë÷à'€Çxna l,˜XLcÉÂ],§±’ƪÞÞ³°†ûpM¬›xÀz凾zÍp » ÉJT W«~(Þwö…üÀ÷Š8ըƃ].}}“ªé·)·-£ÃÞfG5E¨üW‘d°ß†¡•€·Û‚0¥j$^Còz ¼®ä­–Þ›¨¯¯^(3Ì6„Ú&z7’õ‘œ… +n¡ú™á^(”7T6ñaÙXx£¬»6K ‹—¬¨#kbË×½gNSEíÃF3¤q‰'†™¦R­bK÷û±-¤‰G6Šðèÿ&N¹ ÐÉ’‰ ›¦ûDyjâCñÿ.“!wfì\b~bÓ Ù˜ð°áíôÚJ0Lë¹ÈˆªÇ°æVG Júa£\¸bx1øÔìù™PQ¥É妔œL$ÝÂ^…!?¦Ä^EOxnB›X¢WcC z @'Vš¦Öû0¾ÑÆ@–þ©8ØÇ5èùÄ8¸Ik9ä‡äwÕ¹ü1Ÿœä¦œ”c!ýWú°¾žÉ9D${Lç$1‘ΟH0ƒÙ¡ôKZ¡/6ÞWî0ô¥w·1ÓîÄøy܈KÔz×aá–†eÓPK Aä£âüx!org/gradle/wrapper/Download.class­Y xT×uþ43ïiô´0€`ÀÆc0Xh5ƒ-ll„$4HD`ŒŸ¤'i`4#ϼA`ÇÆvCÓ¦MÜÅ´±³4qš68ñ[‰Iº&]Ò%]Ò4]Ýtoº¤KÒ8êï,š‘ÆŠÓ¯€î»ïÜsÏ~þ{ŸøÂw^} ÀVyÊuø5?úñù*ξ †_WÃoøM?|ø-õòEÅõÛ&~ÇßÅïø’~ß?ÀúñþH _V<¬†¯ø±bà«þÔ•ø3?VàÏýøþB-ÿ¥þÊÄë~¼­†¯øõü[?Þ¿óãïñjøÇ*jû'ÿìÇ×ñ/þÕÄ¿ù± ÿî…úSTãø?žÇšø/?þßT¾¥(ß2ð?ÊŽo«á 5|G sj5TRiˆÇ¯â£eb˜bú1(U¦øM©6Äò£Ÿ7¥†O©U,ujVÏ É2?KÀ”å~¼"+LYiHƒ"­2eµ)Aï6d_ÖÊM¦Ü¬¤®3äCB¦ÜjÊzS6˜r›)•¼MÊžÛMi4e³)M¦4›ÒbJ«)mjc»!wBÛ­p<î$÷ÄìTÊI nÙëŒÙ阻71%ìѾdb<é¤RÝÑ”ëQ éÜùÝiw‰»ÑÛMX7Ðs¨§÷XÏ©Á®þH¸·‡lݧí³v{ÌŽ·GÜd4>¾SP³'O¹vÜ´ciÇ”­‚êÎ}ûºúOEÂÇ»®!¨íëïÝß߉œÚs€²+Uz¾Xb|\±¶;‘oOÚ£1§}:iOM9Éön½H5ß{ìI‡™álÐI¦¢‰¸ ~j‘3­åä¼™ï”ì»7º»KX°ØõŔ̓ÏžÄ(¬ëŽÆžôä°“îÚç Ü©£FQ ÌJ§ŠŽ,Ìøæ² ]ì¥J­¤ð΢PaÇÇÄ¥a;ålßÖÑ=²©±L핃˜úqÇÍnJv܉s´¦ˆ/éŒÅ¨­=»F~ËÑÌy^#ûš,°ÞáÓܤêBÑîêMvÙÉXTq­,â*ŽfÜQÄèÓeÁɪ¢v»õÓv`Û~$³]g ‰õå3Vê¶Ž\\cž9E¡Ó‰$½ ”ˆÓõ,XÑXV‚_Ñø¨ÂóêìK8—Í/h¾D* ±U‰T1qwr„Uï$ÒÉG5![?0mJŽ…Çð´Þa!³¦1iá&;—@§Û¾ËÁD‰Òaá<µð}x30áºSmS ‘”ó†ì´ä^¼(h[JËâÃM ¾Ï]–Ü/X²[:-Ù#{-\Â;-ü>dI—ì# æ{±S#…3Zܱlõb`*^Rò÷«á€%a9háçñQ ¯á:£¨ oÕi³ät[rXx´®]ÂKz¥Ï’#ÒoHÄ’£2`É ²ö²cZ£ ~’é)×5äm– ÉqÁòŠôJXÌ‹ MÛ©PÑÆ6eìqCNXò œ´ä!9%€![bËqK†Uô­â’µd×-Uƒ£ÌS³q5Lp 8¢ÉÚ% ‡=<_±ýÄÐè¤S´¸|ŸÍ Ž†ÜDhÊN¦œÒI©§-¼ŠYW•BÊ’3B¬¿xlwO¸gh ÅÂ8z´/¤Q,T c¡ÄY'²ãt=åŒðp Í#•Ò”‡ú7…öël„FYŒÉèpZñ´…úb1LmKEÙá¡tAa¤]¡Ô%’ÑGs ¹jaOv¦£1¾¬y–LJÜÂÇð¢% »)yÄ’¤¨ƒMím£ÚX[§†MK\I³€æÁ§Ðܱä¬Lç ³xïm…µY0<šÈ”ÓS ‰†œ³ä¼<ÊÝ×z·%ÉÛKøò[——ÁIAHQϵ›Œµ Gã£m{m×vÏO9<$}}T.›¢7kZ'úäyÁÉ|mª€–‰}*4u'–Èm4Š'ÜP*=5• šÑiç Y¡ƒƒ‡™›@¶»ÚrÝ¥ÚÇ])±/‡²*-[ò„jX ›mgs jåÞràX—}œ§‰T[³ýœ•m £k7¦Ú7¦BS;õ¿ÍESK.È“„2`Þ[¸[ݼØñú/wä{5M<Ê]9è~ùC¼>âEìÅÐ]’þ£ÉÄtö¸²ìQ(8ôÿv‡UWŒâjÕáðƒZW~?Ì?¹‡”cœ_Ê+«¬‡OÿâÑËÏ®oó52XÞá›ÅŠ¡Y¬¢â†¬ê ú2XÝáijzfdÈ×tAO`mÐÈঠ'ƒ›;¼Ëñ)³ÃTo·l÷Wí¨®ÚQôÍ BCÛ«*ž‡s ·f°þY¬| ·e°q›†·Ï ñzCõʪ‹öŽê†ý¬i¨YÍ“Uϼ—üŸ¹Œ5šæì¨iú$ÌfÒª_A³­A³reU-/̽‡K•Ö Ú‚Þ0ƒÞ Ú[o ‰”;^À†Žºòë†ZÖ]¿Ê xq¯3T¯ãkú™Måbǽ\ßGŽ {˜¥v%uˆÅÞÍ";Ì÷ “¥Æô±#ü;ˆ£eF'9K3ôpœ¡?wá$>ˆ‡ð 8ŸaêtðEŒáKìÞ/#Нâ4µ;ø:iß í›¤½Ó"ˆ‰‡Ò.h›jù÷Ÿïb·â6Í$Ë?ÌÄþ8ÞÍòx˜»ßÃ>¯¢=g¹þÛ3ÂÎÿ ü$ªiÑ~гzq?gU«Š7_BœåJˆ³l UH%.ãgP)ª²;¼døY¼—QQÅüYøç(¸ÆÀ:[ ߇*G"$vxZ…ëýD:¼AOÐËÅþ¡ÊæÀÑ Èù ¯pçÛÔΡÒA”ãîðètW¸Æ|U0é}¬Ñcìß'èù±\Œš°ƒLöËjvM«ÿú}„ýÐÏúŸ`\ÀsŒÎó:^2«Éñq\¡„6¢ÇUÎ<¤¬ÆKø38ÁgiOñPø$x¸QÒNd8S5r©ëK:®¼t0²3ì÷ áfTÌQ}¥®avÌ+ªôͱz< šÊ-¯b6WÉ—ù¦’¹%p‚g×áÀƒ{ZnàáÚ\½ðäéªïÈàdk¶^®°ººR¨˜}€~ˆ ü0míö¢àG‹*eKÁú-ºšyáşÒ¾E¼ùt¡Rª!o EÛ;ÈÅ×p=gçW¨DæÉÀ)ZØxX[k+kÃ;<õðFÕÃpêM`Ö¿'2äáÃb™D†|AÎŒ /2d6G†ê}-ŒÖÈ5Œ]Ypqx‘v~œ^áÍç*oQ/± >Û™åÛ¬A9ß| ìgtf,&â³Ú·Ïƒ_Ò¾yZü²¾8„ØE¿Â™—r¶ãW9ó‘ó†Öü9â:x«d=¨ÿ¡5¹¶ŽØ¯þ»xÎÀÿ¿PK AyL¢¡Ê1org/gradle/wrapper/DownloadProgressListener.classuÁ ‚@Eï+ÓjDËöEÐ@Û–EERûI¦ˆ#3cþ[‹> Š4Úv‡»9œ×ûñ°ÂÀƒç¡O˜Äª.r%ãÐJ[™ÍM Ç„ñ,Èä]Š‚­8Ÿökߟ_ÃPU:â]š3aºý©G­ÍÆ©±\°^¶&a¡t"-ãœE­eY²ÿÂè›Ë›¼8\3ެK tÐŽBNûÐkØûPK A!9|¶„ 3org/gradle/wrapper/ExclusiveFileAccessManager.class•WÛsWÿYÒÚ«u|iªVÍMNZ*;±•JŠlB×NåKœÆŽ[—t-دvÅjÇÜSšB[(·¶ÐP`x¡ 3íL«$x†ô©Ì0à }á…0¿³+9¾%L=öÙs¾óÝ¿ß÷íúOÿýýÁ¯t<ŠgZ ãYµÌjxNG_ÔpNGϨ×Ô Íx^mMEœSKA-EµH ›1¯¶ ::`éÔvIÃb3lIÅžDIGŽºqu”ñåfxJ_¥~O¡ªc—u,áJ ê§íÄñ–ñ _Õð5öñÉ¡± #ùñá SgGFòÏ tŽ_2/›YÛtæ³S¾g9óý­C®SñMÇŸ1íªhñ­’t«þDE@äv”]ÛÎ;¾ô.›¶"Æ,Çò Ä2ù|÷Œ@tÈ-R°mÜrä©jiNzÓæœ-•=·`Ú3¦g©sõ,jÉŽ»Þ|vÞ3‹¶Ì.yf¹,½ìð•‚]­X—åˆeËÁBAV*¦cÎKŽÆÍ€ 0˜ ã°Ü¬âëOUß²³×)T=O:~vÈ´me±¿{]Ô“s—dÁWÊ䕲å-3ÄQºd»…EÝ!£C½…Óq¤] 0ŠE•(¹Þ;&f£*2³B5ûþ?ÍÊ^¨¤£±}Òò虫\j÷L§è–ÂøC¶‡ÖlÙtGuZÝÛ5Ó[" äMn,Ér¹Q–‡ïíõÀôtÿ1•„)ß,,N˜å@LÃ×5|CÃ75|K@gùdÙ·ˆ'ÂhÊšwL¿êQ÷ÄÀtnkŽ}¢2†ts¥óÒŸ&J',ÛVXjÊt³Š%syNÙnE>]µ¤o3•É;6‚‹ÄlK¡q¸oF3åV½B½ÖûîŽÌ>%l W Ä!½8$`¬ÍÀ ø¶À›»ïDÕ²‹Ò3ð"®x ßèýD]AÌõÙ…EßU úð²Wðªï©åûx•À¹cóLÕQ­½V$ÃCnÕ.¦×O#€&¤A7zxŠ N5@¸ïT3„Ï(ïúåz˜§Yò4©}Ï ˆž] Ò³û4½?ˆE¹vqÝÀ<Ì ŠáÓøLø¥˜ÁNŠpÿ8>K.š‰ü1´â‰DgÖ[A|ö4n›khéLp©Á¸ÖS½¼ÍESÑv\ÇcêÙöêÙ~]+蘭ËvvRˆÜ÷5dwÞ¹˜ÈÅÊý=ï#rÍ<ª‰\KªåT´¤öúÛ8º‚äloç7ð`.–ŠÕÊÅSñ WÿšŠßÄ®TŒ U4]»‰Ýï¬~¨Tô®7½‡6•‰övîãþà7ÝBZ §§Hè Ò«@'¼c ¥¿›KlÏ“¸3Ö1·™ÿ¿ãcÑÆ¶‰õDQDDwp>¨žäPõzp}”ÕÊ@8B gmγ*& _$W™Ô ëö+ôkôŽrÖ}¿F¿A?~‹Ô(µ‚AZÆÇ8‰ðÃñŸü:üưŠqÁ¤Ð8­ Ó›“"‰¼Ø…Q±câï?… z5)“çqj…™sDP·hí hô F›9Òˆ‹ޏë§uì>cÄÑ~êþiMȈvz5ÀHMü¾ ªŠø †ð$?b‡)n¬IŽPò$)SÐþƒã¢üݳŠhÑ ǧB¢†¤†<£À¿q¢ÏÒ0¶Ê.Ò¶åƒÃx½dÐ(§øÇWW½§Žw@óMì߉¥ß­5S< Ÿ ’a„<õÀuõ.«ËŸç3ôäGhí¹…GÞAtü=’£dl¥Ù¦@]± …ùßéçysŽýùü:õmŒšO• ‘ ²¼8x4ó?PK Aì„,y†-org/gradle/wrapper/GradleUserHomeLookup.classSÛNÛ@= $vŒÔ”K J)$´ÄÚÒ E¢`@"\”@¤Õ-Þsc-ÂÄg¥ØOˆN™QMž} (1ŠáìÁ#Šj€ RŽ`뛿Í€i­õm¹õßP/ÊQ«ðWM:‡Ü‰â;"¢¬+) Q¤gc@'Q„)‹f! Ip @"p€å´Hw·bo’8=N%ŤډÓ;RN² ½8½÷êôÞCÇÉ?»§Ó•éË÷¡¹7oþWç½yüá+V‰ ž¡b3ž©Bųäðl9Ü­à9**$¹ÏUð<Ï÷ã~¼PΫx^ìÇKüx©‚{TÔJÆZ\‹/Sñr¼BÁ+UÌtɯRñjÜ+aï“ÃkäðZ÷ãu ^ïÇüx£ 7)x³Š…x‹Šx«‚·©X,îÇ ôãí*Âx‡Šwâ]òëÝrxÞëÇE?.©¨Äûäüý*>€ªÈ`XÅRñ0F|HÁeëqEÅ]¸êÇ‡å†øñQ“Ÿ—‹ŸPñI|ª ŸÆg<"9?+!Iþ>/‡/¨ø"¾¤âËøŠ‚¯ªØŽ¯ ÌêØÛÒi?²¯§}ï‘ÎîíGºw÷vuïDNè§õ¦¸žhê±­Xr`ƒÀÔV3™²õ¤½_§ PÉö¶öÞ–®H{[§.˲g_W{oŽ:¯€Z²©bc,³7 ”…ö øZÍ~J«‰Ä’Æ®tâ˜aõêÇâ†TÒŒêñýº“ó,ÑgÆRK"¦5Ð4`éýq£éŒ¥ VS‡3=àÎvê±$ò%ø+03|¨ÔdGºn ¯ÎcY@Í"o×-j—#f6m‹Å ®VY&협’Å2M»-FÞŠ!ÝJüX˜¯g4kj5 =Ù/Ýíð¨2j&OHnX[¼¡ç\Ê6»s¢òZǶC1‡ìãç!Ò‘ÓŸ·ìÓRE°t‘k_ÚŽÅ›ÆéÒNk•í4´³"n HeçzE!â,r_M–Ò~Öˆ¦m“ü‹¼ørI··Ÿ®9 ¾ÎàèýýÅn¸)\™Œ­êJr•^PÄÞPÎÚ¬Bù2¦…KØüqf¥Ô-—IÃnÚ··‹k‚ræ{Î%mýlÎò„òm—Ù×S©6ãø63ìo·,Çþ©=¶=¹Srr^Á7V…'Žj‰ª[&µéF!T{Ì´5ÜôžYr¾VHLˆ6óL2nêýö¢GÑÖ`#¥á(è×ÐD§BÃ7ñ-ú¿øP2‡&sð ²NsÙ–§ ¸|Y áÛøŽ‚ïjø¾OžSå§Ò1ÃXý; ?À5ü?Vð â§Ì¢ñCÔ©§D ?ÃÏüBÃ/ñ+ 1àš˜kŠ˜©‰Yb63R1Gs%qžÌB¯{(¥Ìù,‰ã2ò\£å;NÖÍxÜ<³/y2ÉÃØ=Ö…&Ó”*Ì,è:ÏÖyˆî\©›ˆ‡)2¨§Z¬tÂHÚ©–Õýòxl m19—Ô¸Rcd/(w:òd­ñl™yÛœâÀB=`ØùíböX»(m¢J¶Ç lDUÎCaÙÐP4˜î%FÞ;Òv‹¬p1}°pâîKx wB·¬)i¡“jç…õ˜Ò`xßÓj‹e“vø†À^u¬+y®”OG€b8VÐôC^iã)­ٞk^%בs‹çU¦ØÅmª“—W³:¦æÄw¦ÒÄrRZ·xݘWææLº±ô.¼%+dÙ¥Ë;–fCq]Þ¬ùׇ']/ÌúÉm¥WjÆ©N­uM§Ñ6Ë4ëE›é¾Ž)ŸbH­˜}®©˜gÃXé¾.‡ëù^qïE|ê” Ž¯oöõÖXùˆÉ]%sM·xG6ó ˜m:E½ˆS^;gç;«wÐ2ÏÈ{£ã¾žè á\ÛSi=NÍÈçwûÙ††ƒdàÑOè ÜíÞ?ä±Ç+r3<öJMÜŽ•dæÉÆì6ªR6`8u¿Ð¤1 ó™ (¥RiÛ̾¾œL•¤â¾SR_éö±ä©1ݱы>aíÎu©%“ãä‹‚ŠgŸÜ^µŽ‚×WÄ4O¦‡x½ lØ›!ÿ—ð!ˆvB`gSPÅywÞ\ã|wÞ¼†ó=yóiðó›7u޽¤4ñWð·¼qS.9,û8V8ÄösÔ\Àø[‰>$7‹{¨TiWGPY:ßNå»FQÑ7 ¥Ùôeà?ô•_Fe_Y ª§ÏÐz2˜šAõ8¹F’§IòQÔrg ¹€A(”u¯Ž‡ÇóÔâNíõ‹#Áp$9&¿ùöÈF9J¬)Ò2:rá¾Æ@Ã0G°”>Ì’–æ‘ÆRMÅ€m¨C–Ð|iÔL •€óuÔ1J•/¾¬ÀµÙ´ªbü–¹ÿ.%׎¼äªrüBØ9ˆ–,ß,Gá –óoE )°2ƒ[‡±ª®;nVޝÑ,Ü£tÔ»7 f°:ƒ5¬Íà¶`jdëû–ãö«ÑØÁÆû0[›|—±¹¯¬±g[†qÇU:¨å!l¸ɪÕ6Œö‹r “g6Ñ[ ™£ÛüªaʨaOÑ<ž 0ù‰ÚuPÏNYêÞÈÀÕpßiœá¬Ž;Ïâµï¤Ugñ$~Ícª¹«Oæ_-|{¬{ • î u)ªÊGgÖà>'€ª ¶Ý‹énä9éÈ Sª=‚.鯲¼P÷S¬9̵qw.prÐZ1‡bø¢ÍŠYŸS=ŠíD¯¡¨aì(ŽÎÉ<¸ê,œ`*K®§ÿPK AúâæªÛ"org/gradle/wrapper/IDownload.classEÁ Â0 †ÿÌéæ¼ ^õbÁë®* AÑ{ÝÊØ(í¨Óùl|JìTf $_òçÏóuX ï¡ë! ø‰®”ÔÌai'$|TÆ:Ü/Ó ?&áãNJø„@ÅÕXaXQÕГ7é†&° ã°zDèV„çÊ™&¦§œ6ÝX”›Ùú`ÚÑ-³×6¦˜L͉ôv·ÓeLµÌCz~@Få@º«Yá%üHÁ™ë'ø©„Ÿ)ø9~¡à<~©àWxLÁãøµ‚ß°þß"N˜iÓ ÍavÂyܲ‘ 'ð; ¿WðüQÁ“ø“‚?ã/D\˜„¨V+mĪMË©N›·ëÉjJ jÇ¢N4 „º55e™-$õ¯|à¿áï žÂ¤ÀÒiïu§MGOhSBÙWt„ìäå³%+i/ÆŒÀ•³‚FàúKLÑ\г¥‹Êva:PÑ™^hw4*\–ó’kQž—–^\)¡6jkªãæ®À†’•¶dœQŸ|5\$çÇ5g—ʧöò@¢y—šÐгpú6`Ù&•‘ÆšewÆRæÄr,oIàÚšRe¿¸~—ë©¶Ð\s©nõ”gçB²së`Ê2ÒŽ¶Ku†È1j4ª¥è¢ZIWU|ÎWPá1æP™³j›YmÃlj 9ù49ÞUÌ[:–¥y‹c™‡ìžc)G£«Ü§Ùvþ±‹NæÐù45‘gõjÖ¼yΚ !±¨„BR’gáyq)¤P€ƒ1.(Ìe%ÔOßWßU½¶N·qMá¡¶øm”;ÖšguhéwXñ¸ Öpg/˜ÙÀ¾¨0Š„aŧM[˦mš»ií9‡l¼H›vX(65¼ºÈc…Àá „(÷)ß÷Xô²,JË|ˆ®{v³‹˜g>BúT᫪ÉßÏD¢‘†ÔT—v”j›ßt»œ7°s1` tù.U½z’ÿÊ{ÒÍ„×z¶e÷%Ø’øK)y9XÁÆÿû튢u’,5N V>]¤æêE¾#¼+§Ká%TÓ—N È>+*ø)P¿%ÛÓƒÈíéMäöô,r{z7Ñ7¢~;ð|ân§ÑÊ Q]]ýD]ÃÊêÇà« ûÇ௠ƨ Ǭ‡ôQ–áfjƒÄ¬Ä-ÔVÑI@ºwÄšèAÁOÚ#=¾[`=eòY„úëDYóÎBîG¹7S2˜_¹€š ŽÓ»—V}\6ŠõõTŽ¢™/z‹&pygÃ"D]Õ©ÓXBý„‰~iŸ'´ò>Hþðû6ÓÜ?e]ËG1<« ˧Lhñ‡ýYQbWfI+¯"‚Æ ®&¢ ª½ÍkX|ØÏñ!ì÷¤]Û—³x+ZÜÝç ´Â3¸N`›yt½ çe¨%X¤¤†”„ƒtLÏš¬¢ppµ}'þ;™•È .ƒzÖG?ÚlÈn”yjOà¶–@‘è‰ô,dá•+½©/;m.P˜Ç¶Š-"…«§œ>òG=„ç†d©k-«&°†â±¶Ïœ:‹uý<ºb7LBˆƒ"!’ô1ïw1u7®qÿ‡QƒÕ„ï5„§µè¡û}4$¼Ç ß#„òã„ï; Ý' ß§ ݾ#Ì=I¨~íb nëq‹Ø†±]â v‹ö’¦na£GÜ=âzÅ#Ø'Σ_<ñö‹‸€[]L‚Lú—a7ö‚ORNõ’v?É®Ç^IÒ~ô‘mFuû5âqôÓ®Àˆ¸—rk?ñ÷àYìÃÓ¢/ÀA’r ®äi¢÷ön#O¨´Ò ùöIIè~ æßHv9BÂà,–•{­‡%4ý þQA#6? :T±•Ò.î¥"n‚r8ƒõ§Jf¯âdO0%†Ú!—^Ça·†áî%`¢“F•´¶Þ_7­ö@þPK A¯ î|-org/gradle/wrapper/Install$InstallCheck.class•”ÝOÓPÆŸ³u++àDE¾™² ¤ãC¢#‰Ñôbf ÞÊaºŽ´úyÃ…&&^záe|ÏiÙÆ˜eÙ{ÎÛžç÷>oÏiÿüýñ À H£$ÃB†Â¢ dº¤£,Çe¬èXe0j>ßsÅËF]0 mò÷ÜrÖ ÇéÂ>wܦ/¶Eð­ÈE+\îÕ¬Jè;^Véñ*ó•„Üu7„}¤ROø›.0l.ª‹[ ¿fE&¬>?>¾Sò4ª£m6ö¨Èð–ã‰×Íú®ðßò]W¹jØÜ­rß‘y|Q¯Ÿ™Öƒ¦mS°^8ßa?ÕÓOÏ Ÿ2ÌuAz4U%³áCû©`8AUøÎ¾#ö’…â;†l%äöÑ6?Ž›2¸ê$¿\.3,® —¬ÄÇr°"ë}ºÆhU‚6ú?Aƒgm©¾Z™2iTMß²lû€-Iˆ‰›¸eb×L˜Èš00hbS:Öæ¯èÈÄnËða¤ííÍî¡°C†ñÿcÔ&U1CoT†^¼rÒÍrÒÊÉè„R¶f€ñéVúý³R]§˜–wØ(FinF«pC1 Ùd/B‰õ Œ#Dn²Á˜°CY’Æa*?PZ8…VZ.óœFy/[ú í7tí´ä ]HvxíðšÁÓôO!1øŒ àUxVÌK‘íÔIWÏÜf%‡Äw1wALfºXoq÷zˆ“Wßoíx[ü‰ËÄY%žomv§˜]&Žö¹ b#j÷é“EÚ¨PK At˾¤@- org/gradle/wrapper/Install.class­Y |TÕÕ?'³¼ÉðØ! ë€BÂŽ¤B  Uy$/ÉÈ,ñÍ’¨­¶Eqi]PÛ‚u­Š UQIÀ(ÚZתժµ­[í®µV«V4ßÿ¼73™$_~ɽïÝ{î¹gùŸsÏ»yæ‹ÑLþÌOçpŽ4ä.M®4#²ÑäI3R^~*àQ v¿ü¨Ÿü^"3å"øR!¬ðS/óñIÒ/ÏæJ^á瓹ʧ• Wûi>vÅÜ*iVKsа[#j|¼VFÖ)¼^áZŸêã:Øà§%¼Qš¯ûéu>MáÓ>C7ùédÖü´‚7+\ï§UÂ}7øX——Fiæ)Üä§uܬpÈÏgòiÂ~ª•‘ˆŸ6ò(G¥I3ÏÏ-|– ‘9žÍ&'D³­>n•¾MjWøl?5‹]›ùœô!Ÿ+Í7þ¦Ÿ"|Š4ç áù KáoûÉÚ³ø;²`›({Ÿ>â åõByÚ.ºPዾ˜I­ŒÆM-.oÖë·X¯QÝ(kñ¸g ,­X¶x]ÕÚ3–VÖ¬]S¹dÝÚÊUÕg¬^¼v9SNÕ™ÚV­4¬E›JkL#mZÀ4°<&ü¢æz-œÐ}| “7kjÒ ¦ÑU1£©´ÉÐÂzi«¡µ´èFi•5‰•¾†Xk4Ó˜Æ9V.MÎË.-šÙ¼"F6‡…óD§«3i°h”ÞVNÄC[õe¡°¾¸¾^ÇWjQÍ’­Ô‰CÅa€wa(21^ð%z}¹&G{êz&wy¬Ag\ŠêÕ‰ÈfÝX«aR<«×Âë5#$ïÉA·Ù‚çÆ8îlûÒûë ]3õ¥¡¸É4ßQƒZ»‡CCM C3C±è‚©¶ÓC±R±‰¸¢>sžiêQ³‚F ØÞmNÈû:#Ì4ÈfÕÍÒuk*A’›IRӬ͜3·&aÕ—fL*|)†«ú3Í>¢•'õ[…ÙyiÈH Õ£³jm¾!Ô"ï°%p¢·È²¸Âß…[0YŸüO,èÍeªSô¸šõ6&ᯞl´ØgEcmò¸^Ÿ0Bf{éJ`@\jÒ㦬l§ç¦÷¨Œ¶$LðÕµffðnN46 Ô³6.A´mn‡÷5ScÊÆ¦¶L#ûIµÄZ%Ž®1µú-+µ g Oá˺›iÄVÝ5¶gšoM,XÜGåþ;‚% ÒI™‰ ûçe"a©¯7B-¶ƒÝ !ʱùc>\Z²¬â·Y/E`ǽ£¥½%1Á> ö{Ñ…/ïQ3»–Xqñ윂þŠQq„µ±}hõfB [8ÉŽÇF½nEý­E¯7õkƶ UƒÎ`ÊTÝ#àéà½Iz ›Ô„š¢š™0°ùô#ðêg  $®›m€¢)\­‘P<.ðGöåE³š#Óã6¢ô†5ºÖ`gÒ¸ÙK˜iøZ[/‹Í4-w™|Z6#‹gsµ“œ¼$ ÛœpœÒ°þ2£÷ŠŽUé]ö¿µ¢2Š-D ŒžI2ÐRy,Ñ¢GD1#„ _“†âµ¡(Î0èê*˜ºjÅâÕš/»Aë’k û€P‰'¬³RâÍWß u À¶Ñ1Iî ½'¢g‡ ñxÇ8Ëô€GšF{Ú –±´)¬Bf$§Áé”!Á’b²*c\Ò¢° ²ò2˜UD=×]–Xî]åìTžÌë¿» I¾Rá _´ÖÇZÚ3rÓ´Çœæ,ž6XÎeáÉ+ú5˺“¦OŸÎÔäxÔ¥ÎÅÿÏ|•Õ6]šÒÌì‘b¶Há|তpÜ%]'¥ÍF Qf•â5÷È¼Ž˜pR¼æ ¯’cᵡgññ²ø”£X|¬É6«mVÏ.óe—ÇŒ„̈d5cú1«‹Õþ+ÉÛa‘ªÀ§ ™JÏÒs*ý•þ¦Ò#ô¨J¿§?¨ô8=¡Òt¡Jß¡m*uP§J—òÕØø˜ªVYtJÓ%*m'ÔÿßWùüC•wò.…¯•—©|_¯ò |=jÈ/Aû av£Ê7ñÍP!SC„|ÍòÅ%(|Tþ1ß‚¸ÏœÍbp€®|+ߦòn¾]å;øNdç Dá»TÞÃ?Qùn¾Gå{y¯4÷©|?ïRùz“iÓI–¨ÁÌB!8%?>%ØÓãÁhÌ ¢X5µP4¨EÛAfàpI2›¬Hž´A3lDêm8”ÃíÁiºöi¨1z„[µùL «¼;Tîäý*à{˜N;¬ɽãØ"Œ|5 T~»~Hå‡ù ÓŠ#k,^Ó ašÖ=è° œaÀífú±Ê?埩üLÊÍë¥è Õ[™=ktZlÔà׆ ùÑühpíHÑÚƒÍÚV=¸Y×£AS‹´H l ™ÍÓò£Ö‡ šÍš‰FNq,û§[ŒšíAèÑ.{Ùè,I¢sZr Jý Å¡¶!ÖƒËdIP3 Z2]ÖvÉåÁF#}L#OØ¥Ø4Q,˜YÞQ•óãùÑT. Jm)SöpÚ—õÉ*±Ìò Ø[¥^¿ •.1ø¸ÊOð“ ?¥òÓüŒÊ¿àgQôäÚņ¡µKÂUù9zSåçù—*¿ O/Âgô†„s(šŒZ‰Ñ_áØ?\ÉÔ Ð©oO}s$†Ç5oΕ_BxËË*¿Â¿VùUÁøçRŽ)àpTÛs*ÿ†+Œ~'Ík½”J—z*¿Î»P8ˆ %°ÞH‘õ.ÙT~SÈÆ}yÕ¦ð[*ÿžÿ ò%SæõO+I–Çá+XP×"ìR…m°¥§² 6ÆŒ² ¤œ?)ü¶Êïð3Ès±ø´(J<•ÿÌQø¯*ÿÿ®ò?øŸ˜kµ«A•ßå÷Tþ¿Ô±þQé=þ·ÊˆÿæÌÛ¯HSù#IuÿéëU½ª·‘™7sJŒÿ±øâ•>¦OTþ”¯Vù|; ëÃ'{¦)GY÷ RNMK£Jœyìß)¯[ÎJû“iô—|g"%³|Ô»NAÞ/zù%£eîTdö’nm³kµ¿"QôK¥]PY)½“ÁœnAPò6éfoí‡Lí{ 2²QÆÅÂðÇ«„à‘ìÎtƱ\û|¥;”œ>b[Ÿ@iõz.Tü K_§lûÊ…Yo«µrΣWK~”-vü¼²Ð‚#`Ä·šYZá½.vì €‚–Ñzh8ÃáÆ`ê.xÜÀ^ƒàkã’©•.ÑÒ ™RkaÀ†œ·! î‚©rÅ3´w~´®9˜±å=·=¹•ŽØñ⻩Él¶0-{‰Íä«wtAyúôQñáµr"÷™±”J(^i1ñêm´Îë ©³ý-ë(~º6Ÿ!µù Žbýwœ;:[Âìg±´Â}I,fúZËJT]5¦f˜âÁRÛUi‰(*c…†‘qÎ0=Ñ‘ÖgfòÛ±ùÑëâÕÏBñ!¯ÀÁ–rga_UØYiñæx,œ0u‰óÞ•B;Ê#¤ÝÌk•Õ0nÏMÁ0‡aøºEÞÂÑ>2dž[o Y(¶Q7ë É–ë¯eö¥ÖP ¼Ÿ•Bñ¥©:¢i ìqG¾ÄC k¹EQç†meG8\½Xù=.Žá3qÐsϤ´j! N+ä3޼Œ¼×ûzv¤ó‡ì7¬g*y_&£>IUÖ¥ØÂc ”~Wk’yW¦î!3\ŒƒÍÊ7“ù-õÞû´±GÈíWª³>†*¤.퇽íœX“=W'+¦ÉGÅAJûì—ÃI®×Õ¤ÿq•1±ÀÊŒU±V Z\ïÙ#“ÆqѬ·­j< œ+­Ë˸ ÇÛ¼@A¦kzߣ nÖâ+c†^Ö#ð€? ª·™É×¾ÎH'#æ²o½‘-öÝx Fý.ÌJ3uíu+x8¼zêÃ1±’§G•Nè* "è<:Ÿ˜¾…·,ú6åÈ}žsäòÂê·ÓEV1]‚~h/¥ï¢ýÞÎ7úI…”]ØEþºœCé©NR÷ÑÀ¢}¤ï#oaÉ>´×Úá2´£È‹v"Vi8&Ñ8ÊÇÓdº3…6Oº‚®$²žD&¶žDª,ëIärat]…‘f?ùIA¿¨¨ƒ¯D3¤ºð„‡¡eƒrÊ<Ò +ób|`ÀÛEÃë Þ€§¸¨¤“r;hÄ£”wo9§BÇBp.†¬%4š¦Aòé–œËíÝÒr.¢«éHä¡ùô}ú¸øi6ýVram!í¤A³ÑÐó:ºTi Ý€'/݈Õn¬¼ kð=oëÃçbÌ™ rFî§ÀÊ.UWÔI£«]sÝC‡ÐC¾2O®;ëSðtИ¹î\÷õÝï<®\(9vw÷ÛÅ4® Zޝë¤`™âšëËõ¼o¦éC©;àÍõÍúæ~šP–Èî ‰îi@@2½ƒŽ« (24©v›ww?P:(_Ìâ²Ì²Œ†¢m„ØM4˜š\x&§-4…Â0T„ާ˜Ã “(NkȤM”ÕV:‹Ú¨c瀗[\ü˜ Ð-0R6­ 9t+ÝF>Q:mÖ h7Œ„ÐÀªÛég08ÝIwAžðÚƒnðÓOèn˜uv½O^ô‹è^Ú 7Ý>%äé™W¡sÊSè~…`…öû‚†âA¡ñ|ˆ&+Tþ) ìå“êLb¬xDðB¸ÂS]r€&3;NO¤ÝŸe¡sEÍGP•I–Y°“¢[X Ýg•ˆKÎõ¸æzs½¹ž›iBÀëY¦H°“Ôâ€r€eQí6/bëÍâ¾.Þ þ·Ãìw@Ù;i$P>Ÿl/Áórˆ˜rñ Ä¡D†ÊÙô$= YZÑI·û°Rœ•v±=ò0FDá"ru#')©¸8¨ÐÓøe˜hœÀÝ•žñ3Vvüþž¥çìSôZ¢?†Sàk;ɽ·‹òêŠrNì¤Å+¹º‹–Ôy¦ò:WÎRø>§ž–ÕtÒIvZ^Ž´ ßWî¤e]´¢®‹N®“÷ªNZÙIÕ’ÀVÁÖ«aCoRWæ{‚òJÎ;b¾šª©Eº¯­ÞMcl¶ëñˆÄ¿ŸNí :Ø  "õ+]´¿žsZ.`D×AgtЦ½Ð&au­³ú«¨6 Å 4m¬Ý ûÀAø ( ¦2˜f ¢¡ñ° ÛˆÔ\#]Ï\ß\ç«èi€öº¼ 滕žõ –G[×Z.ÏÓ/­ÌÇø‹Ø­™ÆÒ¯NvZC/ÑË@KL¯Ð¯á›K@û*ýc×À³¯Òo-°?–ÆÀcVp£(Eüö\dÆ×Ò`¯ Ÿ¯ûúR>Æo¹BKz]¡ Ò ¢q ¸3‰HˆÖ¤v`lß 7“5A3Þ$¦Fåhûió}TßA UE9z5fÝB÷מt|çXâ¾Ñ_†y_Ü_µŒ1ÂæTC¥Aô–³"²¤GŠYò¯–ä®ûaÉzóЬ0›†®i¥kÑØbœv -@ Dv’[NÊ]äqíÙæB¾ÒY="M´âû5Xþu’ëÙáP,Ûb³b¼Ï¤?§#0T¤?A‰A(HääraÍdz›Þ±˜—öÃ<¬º>©À@r}Nƒú ýL²ä_GÉÿEl.‘´£‹šå¬ÙH>SΙ-r΄ðfÀ,bÇLt'å‰rÅòƒzÔ‚Px©‹ÎBu½æ:)ÞI&ŠŸ€[†o'm•˜jÝMíèj (ìî¾Z6m“AŸõð=²Jž†CÞ€ttéýùvôÛqþlO°`#úfߥ!ô/äë÷aœ`¼ÿÐ ô!òõÇàô)x}F1 Ë@ߎþ\úüºi Çnº ý•HBbì5°Ë$:•þ¾¬Oÿw/ø·Ò{ØCߎ´±w`Gû¼ÛAÿ¶@%Þl:?òHâ¶\¡‘ò9 QèCÄÙ!*U(Ò´ªdà\f0¬ÐG„Z῟RvV7¼îI“X!*SÝðœ§ÏJl‘:GÖAŒé“ä9rÆ®ùCqðúª‹JPÀÕÍu_KƒŠK¬ò­}w÷»æÙÈN­=ç¡U‘²›¼Øp(ûh   «4‰fœüùiKäÃÎwY–ȧÿÁbrò·Ê$ ›Ëß–´„JY‡¤4Úwˆr¹Gè!>xæó¤ÐX%–V ‹pÂûz e¯µÅhK„ MB_$EPàJÛ “U|¤OÖ!>fÎJp)z¡òH~vf­Ú6k,v±Ûa±÷è{Ø›\\–LX^«¤s^m'$oZ+¯­ø(pƒ÷žcä“Íþ¤™WÃ:’}03>K\{9ÙI¾4'8Ùe]ÖøÉô™W'wf9oóåî¼>ÃÀ âÁNÆ`gÞ‡1eñ¡ç¡ôM ó.ä†sèˆÝádÿìâ‰8D³ÿPK Að¿:öo4org/gradle/wrapper/Logger.class…“koÒ`Çÿ—UncŒá@Ø&s*]7¼‹11$KHð’°`²wÏÊ“®³´¬_ÅO¡Fgâ ?€ÊxžRŽ5KÓÓçrÎÿw.éï??h G ·b¸‚Û1TP£†º4w¤¹+ͶUÁŽ‚]†èÉØ.;`XxfX†ûœ!R9¨öèÓ²û‚!Ý1,ñj<8Î>?4éd¹ckÜìqÇ{ÿ0â#†bÇvtUwxßꇇÂQ;¶® §É6m!Wéó÷\5¹¥«]×1,½)Ê@ŒF\÷s ©®Ëµw/ùÐ'.Hq«Ï°3«×:âNWœŒ…¥‰fuæâ…ç-Ce"Úè„!ÇÐÔl·U£#—;²›m"x©*­@o¦ÑÛbˆwí±£‰=C•˜ôj[Æ$‘B#‰’ î%qŸc”‰±I![3ŒÌ”‘¡JgŒ´ÇXó&Õ¡ovÂHIFií ó” Qª¤V÷(µIØ”’õ)rµŽ /‡,®Ó*üœñÈåàꊧPæ¹*qw(¤PÝ&nü_Ý–7Û›PK AJJ¯'ï8org/gradle/wrapper/PathAssembler$LocalDistribution.class•QÛJÃ@=›¤­ñïwjÅ7EA(*(‚¾mÛ¥nIÙ¦Š¥`|ðü(qv[Ī ¾ÌÌ™™3sf÷íýå@ËY¤0ƒmf]Ì»X`pk²•\Ê&Ãp¹Áoy ãà@†b§W*IÅÞ•‘Lö–sýMýhýœÁ)Æ5Á0R–‘8jßT„:ã•2~9®òðœ+©q/é$W²Å0fj%Z§d¥È8bð£H¨bÈ[-A-ÛåXÕƒºâµPwŠ7›B'<¹Ú§ú Sk?†Ð ~]$_SæœÑÜú÷[³ÔG¯ Ó¸­ª¢ ü¾%[šç!ƒEp=¤áºXb(ü_ 1*BÕƒãJCT;§_qå¯iX¥OLÑÏZðµŠ|-ˆ¼ Fú²d ]P‡M~$ÿ –ßèÀÊov`?ªghYI¶A´k #ÄeVº4Âc€‰ôxf"½Ð¢ØÇxoM@^×Rù'XŸÃÓ&©Ì@¯ÛÐÈ0ñ+ÙþN¾ÿ…laÒØ)Œ’×§:˜#]™PK A´çtx7‘&org/gradle/wrapper/PathAssembler.class•VéÕ=cKy<^¢Ø 6vPœ@dI¶šM›˜”Ø2‰À²]oÔ `FÒDžDš1³$viKiÓB÷–®iéBWº‹¤·¤Ë·þM-¿Þ;3–l!ø ÷î{ºïÜs—wçýûí7ßp ÿ’p?Ö;0 MÂU\“H*ñPæAaðö/žaJ°Î;KvÏ×%ˆ¸ÁÛ›!Ë5Am%-«lø…Òcªeãº:½i«ºå†= »Ñ(:B†bèW‚Ãß]µSË ™}BÀá]6Kõ¢ÞÑ&ð *? î$%ÍMÈÈþj\ˆç˜.Ž™Wy“ŠOYó xHÆœñ#iüXÆ“xJÆ*æe<Š,ÝíÝÈ2~‚WdäQ [ÞÌbÒÑJÕ”ñSÖù~NAIÉø¯&ðK¿béU¼"àÔû/zÆøµˆßÈø-~'â÷2æ0O>›~PÄdü¯áO2þŒ×ô¹ìÊ„™šÔŠÝV‹Lí V˜@•iÕlQ» ŽnkeuןCS†S*DuÃŽ®SÁF5}ñ£^ÉŒ3ömr›„¿àMÛø«Œ¿±ÛÛl.únn èmî2Þª¿)Òu¨Ž4SÄßeüƒ5RÙr…œ‰RF5+êè×tãñím83—»ªæí=[‹~©Ÿx÷˜ÇF› õ`Sœtk¯/Ö²à›•Ù"Ϧtªª±÷týýRãff;>kêÍ-€V¼»DíÌãè/<÷´<¿»ÓßÝ"JiŠrÉPˆºh)WÔeSp¤õÍoDLÞ½&ÜÿÓ¹¼®’q¿y¢|rÿíÛúÂÜ?¼îˆrÿ 9Å&¸`ìò$»*øÖB±Œ·ÓË´L`¼Õg ±³´n7¸_ºë¤7‘/¨›sW²wò¿Ãrr;M÷P,ÓÚ."übQŸq”’Õ„çU÷ÙÑK{ |˲ղÄyÓ ŒÙ[ûY¡7Î(=Þ€v àƒ8 ¢Uâ´þð®u’~Ô3IÓµPÏÑê~ššƒñ„×\ÕÐ(Ñ #€#x˜$ÙSÂyLÒÌS>À#¤ÉºÄo ­ÒM´€(¡EF\¤Cž¶ÄÓbiLû˜o“%‘æ›ñDí5²ñd ÁÙøX¢†Ð™À6ÄUþ+\CÇ6¤Õ:i%WÑé¦a @C=5ôž îèØ£Ù£ëJÉÆ¡Ð6®B5ôUêÞ "Dc üPî¡F‚¢Ä&Æ\Ï.zœëžÝ¤Ø\ :ð,ýwšPzà CR;-Ó·ê4EfŠô£ GÆ I!Ò¤ï˜ ‹VšOĉ`ûmôWq¨†Ã³ _<úcýJS O’ÑS.½¸S§wÂ¥"¸ezwa֥ׯ_*ŸÀ«tŽOŽGîº,œM’µ»·1´ RÃ5é=^Å=•ì6Ž®FF(WÇî¸ÈG)éQÂk„ï<“è$·{)á#”òcdù=@!Ñóÿ£X û¢E,ÑÙc$/cÅõf¼Î~»ì?FrBN$;müðY_¥“\|}‰Q»÷¡¡—LTíCUÜWqï sЏž=F‰›!+Yt‘ß»%ëž­[ëÃ%ךH—ñYòíþ]ô<ãˆo÷y:ɘƒ§Ù$§æÞsÃdg:Ɔ¾ÏÙV¹¥K9#½ªÛ]QÛ¶ìÎÍ”nv¦-m•¾Î½†v^g-£*6`Ja©Èà#Y­" GANÅ lª¸‰”Š-|,Ðûì÷ƒg+[ò *øDŧøLÅ縥â |©â+|­â|+ÐXyvyÊ) î'ð1MnÄBʶ6‹w{/(æè¶æX,£Ö(~> WÙ¹Ê## IŽÀ±=×þ›(¾DÚÊÊWFîÙ$v tð$õ0;©À/èÓð~Ç*˜x¤BDôV©`ª -nýµ|/âº#·¿ÿŽÐ)ãÚÅøy­eðǤ2FIiÙý&Ñ^ÓÊ«,=A•5ò²ñÙ¶ì’áð¾´Tã‘mªMëfRص/}6·’-Æ·„bU ñ$eñgþ‡èRevXà|ø3%Àóò_ ๡~Šcg5hçOÈW‚ò -aŽ‚£¯÷Äï.¤›²Ö5¢T ô —cúÐOƒÅ_ð ü¶‹šå{ðLõæáý¾¾»»ðÑP;½ e™™ý3ýyÔñ؆:â•JÐ{3»P—wÑ@ô¡æÃy42ESÍ÷pä~GwÐ"03°ƒV;¸L¥M`Äôæq¬¹=çî ¿4éÈãøˆ/è£öZú‚>×u‚Þœô`iûÑNß]xÈG7Yø κcÃA=·#7?£”ÇáÇ ÆI4¹lv1ê4ýÝ$ Ĩn¼Ìq˜³R!9K€MÏ-²z›™À9üBÔ¯r‰œäWÊ)´5È"è î,µÛìÊ9z|Œ~…_=/±’ÊÈ!Ž~üLë0›Ä÷8WIþH±-_„Ú÷{ÉÿM F1µWÁU>…Ë ¯=€ÿ’‚úއ¨SpñL<`¦×Ý–_b†qW»üPK Aª=©°?-org/gradle/wrapper/WrapperConfiguration.class“mOAÇg¡ôÚãJKŸ|iᤠ" HULCß-œåH¹’»«&~*M$&¾ðø¡Œ3w ”e›˜&3³3óŸýíîõÏß_¿ Ë:¤ÀÒàaæ’`@EƒG xLá<™2OÈ<%³¨Á’ÏŽxN£8m—ÁPíˆæ–kÖöÖÖ3Ýõ5îÛ ²QO‹»M«Ž5·)÷½çÁ!ƒBwª~È+ó õÎ1í«sM¢(ê/;®¬0è/•wÄ^´°ž®9®ý®sܰ½¼Ñ ÷nïóÖ÷Z‹d,8t|åZÛkZM´lë‹ÇONlÏÚü‹¶ûÉiv,.âsñmâìî£nsúô =ÌN æN8¡u‰ Ñ½ÐÆØq$&ƒL*AîÂ=HL)£ÆìBCO*A4dF r_ ¢É s¨©ôÉ )%È  2¯)©AeEÔ,õÉ ²$!ƒÂçX Ìþywã ¬âyõ%^}9„¯°úÏ3à 2¦y~žÉOȸ¨`;¾Êä¯)Hãƒ^V0ƒYWðõ^”а¿;98ÐÝ14ØÝß724Ð3’èOt K÷×Njí-;Þž´-#;¾[ÂüN3›·µ¬}HËt eû’]„rbbßàAqy1ypßÈ–mÛG’C½–éNŒ$ûº*=” 8%g™9ݲ =/a©£zÁ62í‰â9©¿ ÄuÀÈþ NÃlç=qÔ¤Ìì˜1.aCi·[Z:£·Ÿ²´Ýk?ìÌ‚§`i¶aféRݘi‘œãzÊÞoX4šÖ”„­ÑrðÛ!vÖSºF`N3Mš-ì1²z_arT·µQÖ5Üc¦´Ì!Í2xï²Ý®\ò)éá&* Ÿ´µÔ‰^-çÞ«Ùcd {¯„õZú»nÃ! ]«÷$E×锞s=°' r|Ë™¸4gé9ÍÒ÷yJ¬Ñƒ Y†„EÑ Ž€¬n· ts@òfÁJ•BU¢(Eò2æÈDK×ÒÒ²2t!cjé„'-BF–Y×&‹vÑÝÙ\ÁvŽwËø†Œ—d¼Lî×m¯z¤”^B<úÿd‰¬ )G£Go..?¤n.¶LÆ—Öaš6é§åz5¶K³lÝq hÖ8Y[ç#ƒ”0H M·(aɨþ-ÊÂW ÃvМ$›ç‘ûÜ`Pm¬‹Þ¬Ü?}U·b§ú4FÙásïN‘Òú˜VÈÜè\;ïéˆ/TÈÒ,P¡§©(ŽHždHW)¯(±MËî5òyb-Ù«$E;µ¸¤¢"6² Íÿ»vÈ o±JˆVð;Û6w»±ÔîT â›$Ú¯º™ö-†T|ß¡Æ]²y µI½XjZ]"%ðÈ)Y¿6¿>’6i›5íˆ~šªg#•M «”;•Šïâ{,í5Ÿ;¬¯ÃëUÀkUD· u=‚£*®ãû$$í)Õ-¯«ø^Q‘ÇI?dIe ÍžPñ#æø1ë½Ää„F/Q²0©â'Æi?e6õ!#—¤(莄Ÿ1õçeøLø%ê|º%y°Ó,dÒÂKÜ¢"§|j™“¡ÙS¿RqŒmý5ÿ¿Uñ;^ýG©Q¥Ëšh†&Ÿ…}#YÜŽI¯§7w<}EüAÅñ'æLÇQQñWüMÆßUüÿ”°¯ÏŒˆDœ2ì‰È }ʉx>§§Œ1COGŒ¬¯)7rƒ’a…W¡äTÖÖN{üRçÓ“Ë|88a™§œ÷«ÄÛïAXTY¬Öø¾oeÝ‚zfu”Ç‘´y±¥º®¡çtR³ý{…·»:‰íßvêý:ÉZ˜¯|`GË_8檫x†8󨊣¾¢êò~Ì•œ£7ó:§Ë+x‹µ@¤ü-I Ý:bäqJÞ»q(¸Kq6±Û·ßb¤…j &™šÐù˜Ïï};dm§?JßpõEö¤“›)º@a Ú¦¨ƒÅ•führ%’•Qßæ¦2&ÛÔxëg“lL¿->lDÚÜé×ÁM6øuF¿g–ôÊÛºߊ C±šþ!Ì£BµhÀ^ÜG»×Ю ›h¿Ï³_FûÏ~í;=ûU´ßïÙ7Ӿ˳_‹0·kZ‡¹c‹™z8ÍóIvz‰³v¨¡Ð0ixUñpõ,sÏ¢fò´€ë§Ña\‡ªs oе(ŽC´ÖØ BÏbùj‡ÃJà%Ì®Ž%¯@Åü«,,V.£ZÈX@3#Œ8šÐæ‘Õêš‘¼RMô`:B¥ûéB€N¦c³X@À xÑe,޵^F8¿Œº8isOÆ[¯`IìQfQ?ƒ¥b^ÆÓ –Ï¢aÎÙ ç¬Iœ­tÎV9gw‘‡"3Xí6;‡kc‹s¶Ö9['ÎÖ_@cŸpÃÇ qvCÛ,bW/’þ<…guÐE4n"kÖÐÿÅÍXBÿ™èeÛ(¦Û‰rÅ}îÇNLbÅnº¿—öà<îÅ ÿ„pa€öKq‡…K§éÆ0 VìHI¬8Cª„K—¢ê?RMÁ“Q%Ó¿Vš£tʯ<Z‹0«hn!çÅ{È£­×9o(g.¡nmt²‘rgíÓñRHÃ"2„¸ü ÑLòŽDÆrõ â.<€7’^¬MÒ«h–Éî7Ñ.@§#Ä}¬¨Éâ "áð¦l¾%Þ4‹-‡çp÷°XnŶÊÌê%úPG ”2kµ«‚›Yu™ è¸2Ÿ&"[²rÛ‡É÷ôÆ[g°ƒ~;/@éã¹M´–dÕ客ÔäT­¥P, Ia’UOs#ÍMä\Ö#"t[éf8¯80Œ´£HyCTÏ!âøÈHsˆôš¢ºcô£/··ÐÌÖ…œTÜUYÇÇ<¹0ýßîÞòýÊËãžËÁâåã8áú*C9ö­ŽôÝ»mñÊŒ=‹HN@N3XL¹Ìˆ[[Å\ mRH # SdL9¾\ö¸ÙŠÅ¥l¥ 9O†ŠC(ˆ.ÊH']¤„Tí µú!Ùž ތīS´ª˜§]ÌçhµDL…³yW !p 5 éÖk¶N¯<ÚXœzZ*%q3a0LQwxˆ|q†,8‹åx˜’é¢?æñcKQ—–¢.-®.¼š"öc#ÞLg‘d ª_EXÆ™`-q-z3AiÌ·šD#»7è6²á×þ¶^á—Ç=n*êÒäê"á-‚ÿáÿPK AÔe‹ #gradle-wrapper-classpath.properties+(ÊÏJM.)¶M/JLÉIÕMÎÉä**Í+ÉÌMµåPK A)gradle-wrapper-parameter-names.propertiesPK Aorg/gradle/cli/PK AÕÜ?®<S1org/gradle/cli/AbstractCommandLineConverter.class•T]oA= ‹ëÚ"¶µ~C?”R*O¦Òh4!­ÒÄÇaY×m`— C£Âߢ/4ÑÄà2ÞP–´ôaçÞ9{ï¹sæÞÝ?þPFÙ@;:v D°c@ÇóÀ{xY9y†xÕõ\Ycˆfs§ Ú‘ß±V®g{m[´x»KHªá[¼{Ê…ì' &?»†bÃNɼӵKV×-ÕÛ)¸%ü^{€ìÈ÷Îm!mQaظÌõµÿŸ¯|¢j«U©›n†Ãl㌟óR—{Né…¬•ì¤}f[²’ C¤… ‡´¬-¢ k’ôÚ–Á=,È÷¹Ø‚ak^ÀÌÁß«Š^tÊê Ö”Âõ¥-JŒ×_,»/]ßèØc¸ÕtË¡ +;Xš¨rŠîCµuVQ CWˆ uÁhúCaÙoÜ ™«ú¶Ô1aà6Cúºë2Qľ‰LÜÃK†Â &„!9¯‰a{ Qá23Quá {¶'§M¡†Ð~rÕÝìõ3|i153 ¯mnžDevf¨èÎ߆J…£–š~-C…Hý;"d©9´š´«“edcù °äDq‡Ö¸SX¡Õ`I²w/!)²Œ:·FyÝ7²ÙÍ_ˆ|¼@ô8_AË #ÄöFˆŸVX! ÊK`öªR~œ;©xëô†)ï>=ŠNâRnpŽ´âØœœcÿhÿ˜âŸ¯òÏ”ô4=c/ƒ-e·ÿPK A׃µ³Xì ;org/gradle/cli/AbstractPropertiesCommandLineConverter.class­V[WUþN2ÉÀ0å H¡°Ô„¤ÄKKµIQJ©†‹¦‚Ø;L†0fâÌáOøîZ¾ûZ_¢t­ºúìÿñA—·}N.iÊ2Y9çì}öÞç;ûvòëßOð6¾Q0Œ÷e| `ó|¸£`w,â'?ä«û ÒøHÁÇÈô` Ë=˜Å V»ð‰>íB¶ƒxÀ‰Ïø°&cë.cCÆ Á”i™Þƒ?]cì¼ÁЗ1-c¹¼·i8´Í"qB[׊kšcrºÆ”¼mÓe¸™±B¢àhù¢‘Ћfb~ÓõM÷V»d8ži¸ öÞžfå¹ÙÛÚ'¦á$ F]èp¥ä™¶Å0‰fv´}-QÔ¬B"ë9¦U ёѻ†§™E#Ï0ÖfÏÕ³f±[·­-³PvòTä4ØÐV5Ç%\ÜÁ’X3L¾Xž¤íÚQgIW‘‘´¬W]Àp§0™?¡•¬:£ì™ÅÄ’VJFOѹ’MA`i Ò®q¸¦ËÆâAÉ1\W@ µó¦\ì¶AÜŠ€A)5"É“ã4‚¡æä8,ÕäF³hªJ+gŽ ^Èzš¾KÂŽŒ‡añ@7ª e<¢ fÍ‚¥y"¨ß¾´;D='þûš+›;†î%£­,†üW»’J /G¬dí²£÷L¶Xg<Ãm©x# ý§íªx ã*&0.ãKo 'ã+A“|gºŒ<ß¡o©(`[†©b»*ŠØSaÁ¦¼¾­¢„¯ Â«ÂC™û”%M—UÅ4¥Ü¹zÝù%ÜLEu|tššg·1qBuÞ)”÷ Ëk$1Ãø‹ú 5ÖÈÃÖxE;i1g¯÷Yu[së°¨ª¯D:2ÜKZMÍu6ò?Al©†T'¶[ô'\íL’z ½¢o’B‘“EŸ1]^„½Í†.³õ¡&…z6ðK®Z6<ñ¶ÒS+Y‚h~ßu.›VÞ8XÙb·»uš÷ù2©¿iÕî°•t»ežÔd£N§Û¾³áH;¾4A†Á?2/y/• ™jéŸÀ~¤…£43Œ1𺸄ˀ$ñ¾ æ‰Ú<Ég’yWjFK$í§ùj,ð ¾ ÿtþì†D“”­ °¯ ¸'R® kýøÔ$G è}/aŠNäƫ֪ÄjŠ~Œäú¨ýDH›ñæARüôßèô ͹?·‚î ”#ô0,_;‚Êðiqá9|·¤)Ô[Aßl øq"û0àÇú%ÊT‘Âéq¯Ô¶þù9þ„NêËäR7¦È3ä…wÈó„oƒ="\ü× Ó bôÓjŠèkDóÛæ·ÊQ0Þ¾Îá-úé#KuïsÎuâÜQ‘þÄ€ŒÙ¿ác¿cøÚº)Q‚á=áÐ[ýótx’V¿p¢2‹?Ç`á'g[©:¶é«YMᶘçþPK A}­ÎyGK1org/gradle/cli/CommandLineArgumentException.class•‘ÍJ1…Oú3£µ¶Zm+êÂî´UÜV " Âà–îÓi˜FfĘ́¯åªàÂð¡Ä$-U´fq“{rïwOÈûÇë€34K(`Ë„mu çœ žöê‡þ=}¤^DEèõSÅEØ=.å˜T}.Øm˜ÐQ¤•š/ ©â&Ÿ‹…t‚_ªÐ GÌ "î]Ê8¦bl *Ìb&Ò«ç€=¤\Š.³$¡¡¥þrAÐ^âí›2˜(ùdæ[ÃÅ€f‰&Õ—V”ú2S»æÆoë/c§PFŽ ‚Î?^E°û5ÿ.)Ùâ-äõ/˜•1ttuÖÓyNïN»3y±÷+:–¬ÚÔ•;XէƬJëk–â ŒuÍ0¬Êœu£gäõî¶;ÇSä~ÂötÓ¾…ÌÊ0w3§*6¬ÅMÛ]ûPK A³ßâúg)org/gradle/cli/CommandLineConverter.classQMKÃ@}ÓÖÆÔ¯ª'Ï"4 F<6¥ EQ($xߦë²%ÝÈvSúÛ<øüQâ6…L ]XvæÍ¾÷†™Ÿß¯o÷8wÐupJp’L-¸6„~/œ²óS¦„ÿb¸fã”%ìu<å‰ ¼*Dè<.þid¦æÎn$…b&לpW'<(a‘ÑR‰`ÄqàÙKxî…™¾Ðl’r?I¥ÿÆôœOFÙlÆÔ$”jçήwÚøºvRm_Uˆ%J¡¡ïÐÄýªñ°vJQ–ë„?ÉÔê_”äFë%p}»b.·;o¾ºÿ-7Û‰Zä3®ÌfSm¡Õi¶M´l¶g³–ÅÛplÔÀ~Qqk*[9Àa¯‘#ïÉPK ASf Õg&org/gradle/cli/CommandLineOption.classV[wUÝ“¦4™^ˆ´i¡\ä"iBµ´ ­ÜZ.Å^ÐÖŠÓdL¦™0™pïwü¼ø¦¼ð .UYË哾ùü.—¸Ïd:™Ü¤Ë‡œós¾³¿ÛþNæ÷~þÀËø&Œm8'ã|œkE–Zqo é¢Þ‰à.Eð .‹A•±AšŒwÃh/ÝÊ iEHzWœ¯Š…ª8ɉÁC^ܾ&KFA†-A6ó¶næ :¦®¨×ÕTÑÖÔœfJhÓ³9Õ.Zš„Ý•§c¥¥¡æ²©9ÛÒsÙÑü¡¨V¶¸ªåìù[y^ÚäÓ7ÔB*›«÷Æâf$£Ò–î8#!Z /!¬çÒÅeÕæJ‚´Dÿ²–YÌ/êöŠ„¡jÿL+›ÊZjÆÐRiCO›««j.3¥ç´YLjão8£å--­ÚZFB˘žÓíÃbqŸùI[³ÔeCí_73šHafŠ«Ëš5/΄ÃfZ5TKkw³Åtà Ú+:3¼ëÙNUæÇ³-¡»ÒÓë©çkƒê´ÍÙjúê´šw®Ê(ʸ.!¹a‘pV³g×)³)Þ_Cš½Õ{ œ‰¬¨…c.[$ Çk¨Ò¿‘lª¹'è´¡«{âRS|~2ävÆ?á§êæõx+ÉÚbi…¢ÁÈzkNu#£Y¢ j>¯å2ÓZ¡ fYËT¼¡òR­QŽ–ûxu¤Wx8R‹º± Eë1Ã0oøÐïgëmñަ¥ž74ŸŠ¢Ór_q9éë\…WO•w¸–/jÝh¼Šz"#ñÿåÐzÎ,Zií¤.Zª»FkP *Ø$}ÙÂiµ°B+ ¶c‡Œ› na·‚]bèÇïá¶‚÷1£à|(¡³º 2>Rð1>aÑÊ Sz´‰5 ‚‚½xAÁ$>UDœé¼P~Ã.*8…Ó ö•Êï%>Ä‚Ïñ…¸û¥‚¯ðµ‚;ÂôÎg¥¨ÂñÙå+ZšþEkߌõM' gÓ6-‡0 ë:ú ¦NVçÏŸ=!!¤{ŠÝLX`©e2zF»I«Áœ3Uö\É%ÑNµ§e5CC]ñZ]AáºmѸYC¶YÚb×Z.+ÈËØ&%ôÅÇÿëb Ý`¯ð)ð³sÜ4 º"((¼á{±j^×ð<ÿ¸·ñë QÁ*°>\¸ÄòÖ{ø#™åæœóÎü%ýNîíÇ׃\ý&9ŸI<†”x‚ÀùÇhzˆ`âG4?DKyGN®!$azÿZ%ÜÅV a ¿"2“ø Á5(,Þ{ú碑⸠!ŽÛ¹Š¡=èÆVú½£ôé$¥Ij¼Hôa¼Dÿ›„/üi;ÐßaÊ çÒÎ¥ƒ”»xÊšdôÉ8$ó‹¬ð«TŘfŠ+q½Yøúƒ£r²*6÷:^”ð›]Û%׸wG\788ˉ¤H€ir`ÂÎv?/'¨î’š†ì–ª†ØÙãç¨cæGaf„;B'”ˆFÖí|vévÊçrȵ#áx=Œ¶zCÄ8Pc.ÆÎÑ}‚vr cйëü JR̰i1!¤hô¹ÇØìˆ]ÑnŠÉGˆ•S³…†À¯Ö«ÓÁ¢ô0§»ì ƒ.§jÈ5"GO¥ú† ý™ªñ޹nÝæJ0¶·ï.b4Öó-ÂÉÎл˜n=ðŒw³"`´á‚~´r<ña³s>Ìã)C—ÓÕ0Œ9y®mjú®V!:«©|¸Šk‚Ø"%²£ƒ…*ðÕý5&˜@TZ¥[AkI )†áª±Zb²=Níʆr2¦jŠÁ³ å¾sš¶噜É(…B`4JY:TCaôÙeºcªùU•¨°*çœb2ô”vŒTzCɘ‡gKEËÔ·N„ö¶R¯9‡r,m:µïBM}¯V´Î÷{"O.6¸ÿu1á³ ¢‹~è-ôëg~¿hW´ªƒKt/ÐO‘vs´¯£Ù }„+ ï£î=í]h§±YèØ,êÙ¼l$ë Ùã®ÖŠúÉ®“7õ½ Ü4O?Àõ îðgԻ𠞥þïh;_‘¦!ÈöѸwiýÞõP˜¶¾þCEÓžEVÐh`l­l í,…[±¨m'GT&p ÝDA¬nÓÊE‡ÀÂé!iØ/8<~Ù[$›"­ÀáVôì8z€b3%®ø‘+Ž>gÖ*hÅ/V!r'î·ßÂÀeš§Ém3=³:Irƒæ›n w„¿NÄ0ñ¾Š!ñØŠuñ2‹aÚíÂÍI·ôPK A¥D£¢&3org/gradle/cli/CommandLineParser$AfterOptions.class­•mOAÇÿ{-½r-´¨ >W+p€Š"ÆDð!$MFxa²´g9½î™í¡øü.¾D%ÑÄà‡2Î^ÏrÒ’cšìÎÌÎþffwnûó×·fqÛ€ŽQiŒu“4®£h ‰IS°tLë˜aÈT¼z‹jÉ6ÃPÉ“5«&yÕµ­ŠëXO¹lØÕ¥}Ÿ†ÔG8þ]†‘±x÷ñ2CrÉ«<§ +ÛõM[>ã›.YN”¼ wË\:JIËi0dï½ômùäïxB©ËBØrÉå†Mªu0r$f„Žî§¬óuþ~Ó^õ¹ô›F†þ±Ò+þ–[.5k՗ލ-Œo0$¸¬©äÚz<Aè˜eèkÊͨ´èS ÈbÅÑÆVçï…ùg<±â‰?ÕdþÊ`±Smññ¢‘t\cX>ÂÇcg‚>Ðv¦Õ@]7|”- ƪ·-+öCGõÅ@›Ï”ª0‹ ²j¸žE7 7æcékâµðÞ‰W7xØ’Š1§ãf·0Ï0y¬d˜8ÎÙ3Ì¿5èó?U†Ñ¶=ì¾ q~ :5úh˜hþkºmqéóåÕêƒ_ò2w·íC^€2 ô\¦é ¥G@õI]ÐTŸ‘¥‡´G¤i4gL¶Í,~Ab—T ½4ö"A;Ÿ£‹­Ã`È‘m éŽò:CóÙ¤ú÷3q‘æ‚äÓôhbÆoPK AŒ‹Müu <org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.classÅVërÛTþޭ䏲Ò:¦I à§I|‰sk›ØiK’^‰Üœr“Õ¨±¥Ž,Ó¾À[”˜2ÐþƒáxöHnb×Nä0áϹìÙ³ûí§=«ýóŸ_~0‡‡2Ncñ K2†°È‘“!aYF—ø‚«ŠÍ ǪP»&CÆuŽ!Üä¸%ã6>’1€u޼Œ(68 wúoŒz|†a,oÙ•LÅV·«zF«™5«VSÍí¼aêwU»®Û9Ò^6LùÂpsÒ_ýu W¼Ý¢—›ÚdÖ¬má”l4jeݾ§–«$‰æ-M­nª¶!öM¡$à2 ­ê-[¿aØu§Ø(7m2(·MS·×ªj½®“Ú¢/ÈxWCiX;PíBNg, –YtTÛ)§âò}›ø”ã3%l1ÄüøTðŸ3,ùzºoî˜Ö³Kfž=ìHÁ9Œ T_1$w°bW5Ýt®?ÕôfœkšŒ5s$]%½˜—€±‰ñúÄ4Cä Y åGºæp|­@EYxÔ.ù†´~H@ÃÝ„]*ÿ[qèçrå‰jëí€;˜;þk§G柮G&ާİÞSEêõQɪ¦éõz|q†×|ïyÊóÕpŒj†Š( mªjÝa8ß ÓË”Ww[E–‚ñ^lqŸá6v¿ëÆÊ(=­»WN#¯#¡rN©YS‰–¥.8ÍÔ~éêrWøûß´ö¿€¹ÿ¿¨KÇ*bÔ; QËÅ"Q¼iD@Ôr0¼M»[´Ò¬$’?!H¦vüö¼CãIqÆæÑÇfð.ɆéŒô1J¶á®¨–’ŒáœoZý }4«{JÉÛEßFâGž£?õ3x/ÊJ#Òï˜õÄ'¾Gtr)IÛp‚ô•g{(EOJ¿âT)˜.>Gdƒ/ö-¥G¤WZo=sPß#—`K3‹Q–Ã[FŠ]FŽ]¥¶pÕ…¾àÚ‡®b“Y¬¦h@˜~R ¤Èæ(®!ijJ3n¿‘ã8B§# g›¡HW¢™»Ü±îú…a6ç:Nx*ûŽ9µÀg\Çó.{bµ€ î×¹èÚ¸„÷i^Eˆ¾`– Nó¸$úä,’ÔÏS‘DŸ¼Ñgq¢ŸÎâc)€/hþR’ÿPK A´*«ZMïForg/gradle/cli/CommandLineParser$CaseInsensitiveStringComparator.class¥S]OA=wû±P·RˇŠ"ˆUhAx1¦„¨MLšÔ¤„÷¡êàv—Ìn‰ÅÿÀ‹/˜ø`|öñãÎîƒEkâCçÎÜ9÷Ü{Ng?ÿðÀ&6 °Q)`Ì,9Ü5Ë=K&½l£fcÅÆ*!¿¥|m2ËÕ]B¶t%a¢¥|ù|Ðß“zGìyœ)·‚Žðv…Væœ&³Ñ+æ"”M?”~¨"u$Û‘V~¯ô…Q  NÓ÷¥nx" %œ©6mÜÁ#¥nÔóÖ›uBå_Єñ¶êù"ñ[šf)ÏýåØÖ°àm¦*´ƒîȧÊH›j·fŠpÉÁ\ëp ¥ß©LbÊûúèÿÙsì‰ ÂÔEŠ‹£Ý"L¦ïd'höü@KÓŸ0}Á›1/dü MXEÏnØü…qsYXÆ'>9|r9Ç\í=¬w¼±Pä5o’ô—yï$L Ì‘Œ…i±ft–cyeõ™í¹·ÈÍ›}ö˜³™˜©lôy:E¾Á¡1k-©LYÍn3q§2®òÎâ\Ãuæ™M&:åâÒcî#íÿ€ï2‹µ•OÈ­òïù㿈(&íJ`æR’‡­ÔºØ™p6k·0Ï÷,ÄøÛXŒã\‰ç·Øî*w™ÅM/ýPK A|ìRÎÐ&=org/gradle/cli/CommandLineParser$KnownOptionParserState.classÍXéwUÿ½6ͤÓK‘*EqDè’t‚;VkE¬´E­+. ɤ3ufÒ‚ŠHQpCqPð![ÿ>žäu¿\|ÂÿŸIø\@-V< á°À¥gØZ§YÍ“ˆæ€5ͨ-4Τ¦j§×ª¨ 窬ÓÕm͵løÅ Z n­ÍïÔpi S¬5ê¿—˜$뻦 —b^¡)ÄÌSº™tçÐd%f³ùâsT‹CPÅž`Åg^íá •€ôt ¤µÒÎH‘@Ú'ÙØ„N‚rŒ"#ÁŸ^häÛÁN°oGQ7AUß‘çt$‹ åYFRkº|²ôžÃyÞaCè@Æçg‚²°pPÆÉëèn'»Iì<:\(ð=õÄšÆpÑÁÿòÙ,§œÊá›Á«ía…µîà¿Ò±<çÔV²â8æŠoßSTÀ=âGŒˆŸ°KüŒQñ ½’~Ãqñ;~àWqÂóW”|²‹ò¶›â\Šãä¹ÊTÎÏÛ°kqS Žä'×Í'Q.á–¿QsŠw8¿Th·áÚDL)Ù GcMóCG!O Ø+žm>V6ådÜŒ¾ hd¬ ŠFÆí^Ñð©wŒ¬÷øÞ‰&Ï aÄà ‘îWÐ~qˆÿªpÐN߽̾2BIî þ7ÄÁ³!ù?PK A$ľ¢¥ô<org/gradle/cli/CommandLineParser$MissingOptionArgState.class•mOÓPÇÿwÝÖ*ˆLDÙ² ‘!¨ ·'š`0ÁWÖÌšîo;¢ñoôÓøB…Ä~?”ñܶÌKË’îœÛs~ç±íŸ¿¿~˜Å’Žr:’È'I*(uZG 7ÕÙŒ’Šq”ã˜eМ-ÏrD·†_øòK.]S®zÜ3Œ§B˜²js×5]†¹š#ņäuÛ,nÚV±ê4›\Ôk–0¿É#%Šr×–wŸ¡’í[cˆU:å3¤ WZÍ S¾â6œ®9›Ü^ãÒRzxóÞZ”îÈsËu-Ñ˲VµÐ;‹®žTJºÉ?n˜¤I/¸GQ²µw|›m.ÅUO’ÛRn!ÊeCåwä&à# Ö» º@ûë~Ê+ŽØ•:0ßÝrïæ`€´#:L‰:՞ͭÅ1Ç𦯉÷ö)û[ùPR—2Ãäq\ôU§%7ÍÇ–Ú’Ñ#63ª†V—Ûtœ201,¸ˆKî`<ŽE†ùþ–ˆaú$ýe˜=y&z·ƒaêà °ÜýÒýioÙ¦ SÊžx[t¿­¦)<†L/gdè핤÷=Ij$iˆ¨ ÑÉ0iOH‹Ð*ÏöÉ~"ºCj„ÌAæQòÜÂ{Iœ¡³ÑÀgI‚/),£ß9Œ…ÐÅªå »ˆ}kó4º¶ÝÁÑÚ çqÁçЖ„œgŸ2À`þ¢»(LïBû~÷ÉÇeÃ6n0Ä)I')BòeŒ‡à{a‚I¦㇡Ÿ;rL¶¡ÉvŽ\ Q_Q”ãëÿíÓ•;û‚ûêãŒÀ0À¥AS¸B’e4hØØÎ¡dšv6lÒo¼’®ã†_єš Äh8%1õ+aêûUÂÒ' øPK ATK>ªÄ=org/gradle/cli/CommandLineParser$OptionAwareParserState.class­UÛnÓ@=›¤qâ¸$”6\Ê%¤)MÝKÚ@)½p)E¡ E*oÇÓĮօOá xá$ ˆJ|…˜MÝ’*A./Þ™³çŒgf퟿¾ÿPĽ8È©Ð0*w×TzŒ©Èc\…Ž “*L+(¨ˆcVAQÁu†„á4›Ü®•,ÛdÈ–Q/Ô¯5̂Ѱ O¹pÍÚêÌCÔ{i¹¹™è\û èe˶¼; óÁð`ùñ CdÕ©Q²IéØh5«¦xÆ« ò ”ƒ7*\XÒö™.Cúɶg9öʾZÙãŵuÛ6Åjƒ»®I¸…À,s½™è]SMþ¶j’%¼} ÃP¾ôŠ¿æ…·ë…²',»¾4þœ!ÌE]&ܤ–8ö†c$Ž${¿]pÆGÓì§±õ˜oûRËNKæš%t×éi©¨!‰”†Ó˜ÓÐSnbXÁ¼†[XP°¨a Ë s™¬¼ðL±f ×+·ª~˜a°—[ªÝf˜:ç~½¨Z§)9höæOØS†É©­‚» cÁsž›mÏqÌrºœ |ê¯Õ¼ñ¯ðFËüËdUº©ºÔ©áÜ0L×ÍÍÍÐ-=ƽ”»õ_îïqk³Þ¥vr®l0.’¡Ï¥FÒå|©”œxò„¡!òJ„ÓšÒ'vÁtö!}ráOþYÐYг,T6‚$Ëaˆ|iŠÑZÏíÔç ûÌ‹dKTTŸø‚ȇC¾(ÅÁò<ÑCž(.âÅ.#ãóì ¯*êŸ&ª>ZÙ7Dß!½eSZ2B™ÇÞ#¹‡ø¦oªÛo+5UÉÀ¦cÓºÅCÝ¢¯{•ö B£*^ÙvÒ#8G«Ni$èy6¢˜Ž+ùÿÑ1Eˆ8­3$r£]‹ØoPK A˜%àÌ»ª7org/gradle/cli/CommandLineParser$OptionComparator.class•TmOÓP~îÖÑQ:¯ ¾€ Ý ƒ2@Š.Ñ,YÀd†Äe4³¤kIÛ†?„/~#‰á³ÿƨ_ç¶ N6).]ÏË}Îsî=çô~ýõù €E”%d0#¡Ÿ¿ú0+bN‚UÂJ"E,IHs;'"V8|UÄSk"Öz6LÛô7’eA(;íªi;­æ¾á¾Ñ÷-ò Vºníé®ÉíÈ)øïL!»{䛎]všGº«ûŽË WlÛpË–îy!–ªŽÛP®~`jÝ2UÂ6uû€§y­»žáN_åÐÄz`Q¢W…kÂH-¡TˆÓ ôÃT|À%|‘ÎÚ4yÔ`õP?ÖUK·jÍwM»¡…kÉÚw÷º¯uz”Š-ÇÖ¤¤ñž$Þ/0LßÍÐ[3¶î·xѪÿÚMË7-õO¥7â ±IÔRÍi¹uã¥É;?Ú‘~žSËÈb@Æž‰ ™Z½a×ÃB¶ÏÏh÷Οñ\ƶið®ö‚a+6eY÷ŒŠí¶gúæ±Ñ™{"!c /&ãªÆqã ¥ÿý¿vŽa¸[ëhŠãÇ‚Z×0ü0 }‹¥m j†¯]{–…a¤=¿eÑžBº$Í>•½Pí¶Þ}à4¥s2¯|=ѧÕéQ*t±e躣KŠ.@ >rd ’¥’d$S3gH|$%!z÷p'û†aÒå€Ü!Éx‹¢àD–"¹2{Šä9„·ì ©Oè¹€¸Sìp­ çHs»wnL8…tr™­I"þŽ!öyö3Ⱥ2GY¹v÷‚¬à>i<2‡˜ Ø<l’4!»M»{ín•Vˆ™™Ù ôé ùäš#fÂdYþä"’5’‰¨>¬{}FCÀåNS˜Æ#ZOâq€Ï£H·INQÍ2(RÔ8éô˦ÉSÄ<Ùi’Ëÿ PK AäfC˜§£8org/gradle/cli/CommandLineParser$OptionParserState.class•’ßJAÆ¿³Y³º¦ÿ4Õ¶Ö¨£×JoJ¤P¥… …H.¼›$Ã:²™•Ù‰ø }¯/ú}¨Ò3›€ˆ…4»ß™³ßùΜýýçá€#ÔB°ÂÇF€ÍUBñXie? õ½Áo¦}IXl)-O‡ƒ®4碛pf¹•öDÒF¹ó8éÛK•–ή­Jõa2iÚVXþTú®µ4ÍDd™dËÇVjâ(6¢ŸÈ¨—¨¨™B÷]ŸQ]í¤AXH5‡ÆžÊ[ûÅĶóOúÖ÷&£ŸBÃT3k8ÚNê­+q#¢Dè8j[£tܘš¸KûMdT¾Ì‹¼W^'ÒÊÛ„Ýúdð‡†[ƒw{H¨ý›»´Ó¡éɯÊm¤òÌsàÆ+aÅ;„£é÷@(?^ÑY÷JöxÂ÷Ó\a{ò(„ê$“_åÿׇ{ŠðÜL |ŠX‰ufÿÞfs'é'æ8. ñðygXÊu+¹®âe®—/;çÚþ‰ÕÃéßðÊÈ0‚çÑ:^çeorÿ[nÎø}‡y?Ä"k™õ•³—gÿPK A¢Æ÷E«¶3org/gradle/cli/CommandLineParser$OptionString.class•TÿNAþözåÊq”ZDQ‹´GËQÄŸ kLŒ&(ÿ[®—rx½kî£âø/$‰&>€ï¤qv[l“B“ÎîÌÎ|óÍÌîýúóý'€9<éE?LÄ´Ž4ŠB-¥0£ã, ³:4…( 1—Âmá;¯á®†{ Ö²ËÛü#·<î׬µ8týÚCOЈÝÀ§Í¢ë»ñÃT¾Ý¯ÝRXgP+AÕaXv}ge§¾é„oø¦çˆLͽuºBoÕxËŒU™° Cê ßwŠǣȡSk9kV-äUϱlϵ*A½ÎýªHñš‡‘æNÆSéš?s£†Ç?¯ð:幘/t*´-æö‡W¼!éh¸ÏŠƒæ±† /ÏTww~eÙåÓ¬e!ærg‰cèã¶íDQ®ä¹ŽÀOE„–;McBÒ»…ÛÉ-Ü!¹%Œá.ÕÌ"‡{ä©äN'Möë¬zz‹ÆÇY%¼B65[ümŽ~çèkÿE“T‡BZÆ“q‘5²<”]/h¦¸äŸÀ}LѾ‚>‡‡‘ÆM²c”ïGÃäMHxº¦) ˆ±ïPK A`M~U¸2org/gradle/cli/CommandLineParser$ParserState.class•SßoÒPþN) s€ÛÔ97Õ½Œ&MLÈf‚ÙÃÞ.а.åÖÜvFÿ'_|ÑÄÿÿ(ã¹-›Ý Aš´çG¿óïœÛþþóó€´mdQ³‘C-Ç6êxbaÇBƒ{áI/zIÈ4šÇ³Œ\ÂjÏ“îáùdàªbàs¦Ò †Â?ÊÓñ4iF§^H(¼*tU?'‹ï¤tU×aèòËv/Pcg¬ÄÈw¡ï9Ý`2r¤;$uõTy‡Pšˆ/—#}Œ¼@Ö½3ñI8¾c§)OŽ;ÍBÞ / ¡ÆZå Ž°È›…&¡œøWtŸÌi2§íâqf¸YC!‡¼ûzÞPÚ•h&ß—ûP2£»e²»gÆv¡nÓ‚$Ù$T@|„*>AŸÑ%¾ W|Å):ËT Ð3€¿â‚Â_qIÅ_q3!ŠžÅ¹ t–¯^= xÎc @椚ÙCäÍ!ð÷:°Z_ eªàYòÊqà>8YM¨ÝHÅEÿF‚Ÿw@³@9\"žÙ!µvÚC”œzÀ¨1‹ø‰vñ«®¥x••&Òƒá€k$}ËŒfÇö!¶uõÁÇÏTsj]Åp9Ð9†+Î1Œø:ó*…4ñ*4fEù!Š´“æ¿Ëœ¦./1YœŸÍ ®‡µ?PK A£=l)&org/gradle/cli/CommandLineParser.classYi`\Å‘þJš™7zz¶eÙ²=`láë–1¶°åS>K6–±‘ÌXz’Fψ™¶8B¸ÂŽŽ``‡‚¹d ÙM¸ÂÈîØÍ²aÙƒ=€ !lÇÇ~ýÞ›ÑÌè‰üPwOwUuUuÕ×ÕO¯{ö€YòT:ñ±jþW5¿×±Ÿhøƒ/>Ññ)þ¨sú3 ÿ§áOùø >סã yøRÃa#ñç|ÁÑ|ìÇ1ÕׄW‹ø%GÇÉÕÄ£c¼xýâS¿5ÕøEžŽ]¢û%_ͪ¡fFúeu‘¿ŒÖ¤PÇt|ÂeŒ&cu”࿱—qª¯8&¨& œ¤äž¬š‰JO‹ï”|7#ñP"t‰™M$(°¹ÓùÎL8?²=ݱ×cq3Ö”&LMÖsÇsO°¶A0ÚeúAQC(çÖöj]¬ÝZ¢-um 3fÏÆ5iŒµfÎ Å≦îmÔkG0ÒJKͶhÌÌš×dcÊu;ƒ13cßM‚üŒ‰ÍÜ0Ý[‚1«×¬«_ݸµ±®aÅÖ5uëÖ­XÛ(¬ê ^¬îN„ÂÕ1³ÝÜU½&˜ V‘ù‚QQ[Ù¥=I£Ò¨‚]¤Ék µG‚‰î-\‘¹ºÀþFÚ«móWEcíÕí±`kجn ‡ªÛV…"¦­ìüE”9:Gw6„v™­Ž»Êú1Ö|ÆyqeÌ41ë×òP<¸-lÒ‰¾¡H(±H[RÊsô,‹¶šJîÔØ½c›[§…«¢-Áðú`,¤~;“žDGˆ’§|…º¶³©¬·Kg–lloi¶‹­5M%ä· ü¤9.bˆI+vµ˜ÉÐÙ"˜[’FUÏóRŠo;ÃRØñ¬`öFNç”â3#­ŒmL=ƒ šŒ4åPõ%$Ðl¢ÓÉuöÎ * cÝLate+ïr"n꣓uUC›—iظ̀èéJ…›Ç]B\ð kÙΰX5¹P°jØìÃ:ÄÉ)Bˆp(^H˜i%ƒ¹…¯n ZÍükn »‰Ý’É_>N¶§¢‚ Ïœ&3A†32g R4ìÑd«Š Z”8?lçyÒO¤®«‹m'áˆf@çØh¬ÕŒ%sÆžUÊuÅÌ6ë’3iÊ­ Å•¾¹ÛÍ¢Ä%Áp77õš‘DLý^a÷E™9ÍšV\ÑEW ™p¼ vX8)â¬ä4iFf(Må¼aú„}îŽà.ÁÔl?ºFò´,ƒN@6ßÍ 7üwåž3ô½á§ÉEš5ÙF¼îŒ†p JÒ-‹†Ãf‹n1íR^¢¾:ít[½­“BÞY‹ñÔ™dïÁ3‰›©R÷­»­M΄A-µVÔvmê‚ϼ.(SžYìn‘Z¦Q_;¥S™©[ZÌx|Úœ™3ÓK†FR^Ñ9»fpÎUœg ‡sPY‘1O‰ð/ ›}›ëMÑîX k#…ÈãIªRr ÜŠ[ Ü€ ܬFßÁíD¨-Î Æ;¸&-†´Šià{¸OP<ì’Á´1¤MÚ¹ƒt¨†·\Í×ku§¸;5ÙnHXv‘¨!]r1%ûð ‰ Ã0§²Ò„t *‡Ü1½ðT]BØ­¬ÜtáÂ-å†ì”¸!»¤ÇKå2C.—+%‹ã¥Ū2C¾!W*¢or•\Mx´ÖÕ²ZÅm¸…UŒ3W¹¥ªŒqŸ\ÉêlE,rRzüà´…[UÆíºV®3ä[r½!7(GÜ(Wr“|Û›åjCnÁí†Ü*·ò%*ûÜŲ!·ËwYX¹À¤Š2Îu]Ì4y®‚Ó‡Y <'”kïP͆Ü%w't°3²ÝluY9LáÙC¾'÷d˜R‹{23$*Š ¼ƒ0d·\/€!{ä^C¾/÷hrŸ7å†ÜŸÅžkCPáæ™ŸɈ: ù¡\lȃò÷™nÑEñâbÅ`ÈÃ*ÅÆ¹c&{ý>Vi%±¬=f Ù½ƒwbª¼eic›^ÏRĉ^ÒÉw÷w¶`Ö× „OðFŸ3<,ôdn>g?Ü_çy2°Ï|ô—Ÿ˜Þ%õ €Áz¢Xç>"£Nd1ìV“fY72³pLbÊh1s}Á¸½6=£JqŠ®ÒÁÅ´Ï*£É9¡¤ôDuXàU ªëÇ»?›¹²}eÊг¡›§[»Ö‚eN(åóqæ%ÏB=—:‚ñFsWÂú®Áz˱~Œ-)u+Z v{¶©—p,‘|”•¸”ƒÕ{þâî`8žE< ÔrÐ_n¾ÆÛ·¥Cc^¼{[܉բ’z×v„ ç46º˜ð—<[]¿kŒt6SN¶¾oÌÆ;:낊´š»ÔƒÚC“êÕqÖ»›¦[àc¥¡`©ÛÑ|ݽóÛ(~®zvú‚V†7\eŸ £"šzü–¸ª>²ÝL°žP_·k¡°©pÊ6#í‰+Lé€üh¤1I`E™4c…Ò/·]AËin±çع¼™<í±hw׆ڧ0=ëÕ—g3†Nj'"³@#yëYk>nV²0=tziÎH_û»…ò×r3Þ %?~u©'þ\“‡éßv³ÇBä‘‹ Aå ¯Š7ºÝo}m°hüÜ~½ý ÂÇ¡öW„‡sú Èé_&º%î@,yÛÂÝñŽäÅ‘å<ހà MçÙ<ïkéš³®àÇÖ­²0nGRZÕžñA<[1ëQ; hK½&§i13|d³7ØLó]$7$åJ“¦þÙAÈh5㡘ٚz=©ïæ‚ÖÂè´ž¿_‘Ó.Ÿóq*:±€'©ª—£õF†à&kümþñ¹loU}Áõ²ãï¤ášíwùkr9ârÙxÊúám>ß3ÈyÂ⼃­Î˜æâNŽ ›wánöWñ¹})”¬…ìm^YùAh½ðïO ñYL+,ãl"G€íÆ®ß˱‡ý÷ùÇ7<£ÐÜ7hb>Åxú‘×ܽ¹ìiäô!_pÆŒhèÇÈæ² 9€Qå}(à Âðôa´`·¼®F…‚¿Â˜ZoeÀÛ‹±»å±€·°¨ãv£ ã›ë„Æ}r§½8i7N"eÀKâ“{1±Öðõâ\N‚IAUÀ[°°“k|6e)Š­Ðüå¹Èâ=•Lg“iŠÅtªEëñ:¤ðúRt“ŸÄÔ=("õ4RïA~?¦ó(N{,$ªõ)³¾>ÌÈ¡»Æ)Y>gGK;¼åÈ®Õ,JÍ¡¼ª²%TZXÖ‹rE\Þ‹ ÕO¬õü½¨Ü€?i.UÁMjºªÑ[“W”§\Vý æÒ*þRv×ê™"uG¤žYÕxmžì;þâ>,¦.’®®³¾Ó‡ÒKéÖ‘ÍlÜwlfe/N¯ØoEˆŠ§'QÁöÛõb¶ãô Wb#Ó`cm3Æ< ñרŠ_ã"¼KÊ÷° Ÿ£ÇÑ*#`Êx´É)h—btH):åLl—&„evH'¢Ò….¹ËMˆÉ^ÄåQþ~;å9ôÈ˸TÞÄ7äC\)À5ò®“?ãz9†sr˜–*öÅhêåÃp?Û»0à‡=ŒQÖœFÍ {•ºØtw›‚ñt‰c1~DŽÌÎÁ†k½ŒûßUôaŽ ±Ò!Œ¯t0¨F!SE/ÎÜwüƒ²XžÂSýá'æMâ©Íd_ø8ç¼ç¾‘g¦ôMÍ'¡Ð9Íóø×K ô(=SXº-,õ3úð,-Nž¡=ÓÏu†Sá9ÎPôièÔðœ†çÙ Ýñ¦Q³ûc"™áÛ%¹Ïp;°üªs›Ë`q·–x<¿™ð¹à6V¦€¹‹è‹~,¦ï–Ôz*-wÔü‡¼®FŽG|¶˜:%f)ÅXJ¨X–²œBV4[J^ Ï‘²^l×úT{À”€ß œúp…íÃäå¢ÁËÇ÷ü…gÄ9Ü…*Ô+±/#ß’½ZáJNxy½çæ*ú™ŒuìR6+í|*,í&©‘£VäUÀV} 5^ƇbiÌÒ•bY­¼Ð‡5»µùÉ…çyžÇÚæ\µÐ$hêÅ:4¯"iÏù4¥ˆh¹¾pƒm”7ƒ¼ÙãH´ßÌ8¼à‰T ^ÊÈRè”Çx 0ÓK%³°k˜ŸAæg„鵓r7sä~ÆÝ!ÆÙo_ÿŒçðžÇÇœ9Ì`9†Ÿ‹Ž_K_”¼$³ñ²,Á+² ¯J;~);ñšÜ†×å%¼!¯âMyxw§•Ø#){9í%ÊqÇGˆÒÏ2wR»ŸãŒÞ0 /r5{‚—,º5¤ÙËðqÃBH»\ˆ—‰ƒš Öd^pôK¼ÆPΓñ7xY§ñ+òçb–Ü‹7X:y¨ñóx“Yçµ²F园ɯSšü-1ÍÞáï8gËèOÉø{zSe× yµNv½¥a®•`¿aZx¼úà 5Öøm‹èCãd"æQL´ðtLîq:ɛŠeÍc%,3w„…Çä]}sÚêê²Sž}ÆÞÇ~e?š2<‹Ê_¯p媲>lJ¯›0Ý©›j½§ìA^Ãió† uoQ£ÜEûŽ¿Ãø¹pê8Ð~?ÞâžoSÑw/¿å-ýOijw‰g¿ÃÞ¶Kñ/´ÿýžU°üGÒy•^¤}×B±•Œ«‡,ÌZJ¾÷,;–ó–ô;É¢Ÿ½òøxŽb´†f9Ír¶öKêaß2ÿJ|ß‹sð=ijSž8TÞPqhQn§ÈsʃØYQä™Uëµ@Ýë”O~lm.¼ÈI=oÓA`‹2/-ÉõÖìõ'a*oµõ¢}CÓ‘Ms­‡wÅý¨iVÕò„*,ØK¿:&U¦@Äcéå©HbÏ{V5”ky¿†E=ð!Æâ#Þ&³Pÿ==÷ k Oц?âr®]?1Ë>gŽAäù’y{8u cÑaÝ*^®Ž°òHÝ*‡R·Ê!çV¹•g©ò-y‡hÇà·.Ž#¨f€N>Œ©_À{EV43$§øñïøçf®f¯N¹8÷Ѭ·Áœ´;ÙËlçÎdþOü— sNöÃÂù¿]w–aìÌÈûŸÔi‰µ ;{±g<¹Oajaø v<sð[©€Gò¸%.ÇX"œüÐ"ùQ kGOa©XÇg\Ÿp³±ŸÏ>Î>Á¾›â.a¿“ý.ö=¼¸Œ¿Ç³¿œýì¿AÉ#Ù_Éþ›ì¯òäð´;q é¯eéV)^ñåý?PK A‹å>É&org/gradle/cli/ParsedCommandLine.class•Wiwg~FÛÈòÄ‹ê%v“TMc[–å’ñR·Ž›8¶SâÆÆ)-L¬‰¬TÖ(£‘·”.PhÙ¡liÙ7 ’`rX¾Áá;ßøÆŸ œœ˜ç}g$KÖ¸1GçÌÜ÷Î}Ÿ÷Þç.3úǽ?þÀü.‚v˜*òø`Ö!‰‹*¬‚΢ .¶ŠbuŽf¹¸T“¸,.+*žWñBM0#hÄ'ëñ".©øT=^ÂËa¼¢âÕ·}:‚|FÅkt ã³âþ¹0^÷7„ÅçÅÎ/Ô㋸$–__Vñ•0¾A¾V¯ãMaó qù¦¸¼©â[ ͼ1s…#+3¶•É¥©™¼ /ëE;“˜Òóà êf2éœn-CÁÉê§#Î2«çÒÀð¤i¥Ò–žÊ ÙÌÀ“ºU0RãæÒ’žKMfrÆ)yâð(‘ò–Q0r¶£*T>cØ4y¤Zãq ²Œ%sÙH•ŒË¶¥Yéâñ©hªÀ™Ìô¾Mª-°C#™\ÆUЯ08a–~.k ÷Î*Œ›)CxÏð¦‹Kç ë)ñLAtÒ\г³º•kWYçpÎ#„AÍ™ ´¼äÌ FA|»”ÒWÓݳwó/뀽˜)xØÖàÓV5KÔ¶x±  ­:Ô•|)ÜÃö#÷wOP¿cÆÖžcI(ßVñÃ^yØ¢ÈUØ6K¥Þïõ¤ÿbÑ´±\jÂÌú½Óîµ3Tp‘UG(ˆŒí|ÑVÐQ³áH1“M– 7S8–± ´RΊ|{…çY›#Û¶õô·nQ/”ª¬5^kÑKošu·O;=F‚¸m,·RÚÙ¯h¤q3›5$ßbwcÖLOËF¶Ü™mÞÆ ž¶¼ßûLïÐÏn"ªÝöûª9mØG7M”h©z*gJwr‹vè©”DœÕ³Ec úY®ÁeçyíK„?ëa{ÿòÿ?ÂÕœqZ:¯«fy Ó×ÈŒY´ŒcÑöm5ðû…Óã Ý é¸^Xd‹kèÇþšùÞဂ6žŽY–¾"Öð|PÃ[x[Ãwñ= ßÇÄîç1sµ=>4ü?Rñc¶ÂfÖUüDÃOñ3Ýñ8ë*$cÕ/GWý†º*ÀSç.°„5œÂ“~ŽU¾n¶˜ |ɘ†_à—=¦0­a ç4ü WU\Ó0³~ßp´WLöHZÏ–¼:zyÁpyØéøëé*ôÄr¦Kç}j¿Ècü­†ë¸ªážÑð®Ö’[û£v.•”2}Ri›ŒÆ—c9SV´UõPÉPŒIÎir+÷°©9¹¨ã‘´Ž°gËS§¹ Óù´ØQ¥¨Z³yˆœÛ‡ãµàµOBçMkI'Æ GÃ>ýÞ ï=Ÿ7r©‘W=¶~©„Ìœ­gDô­1[¼f(O :º½6y…ÙP=𸟳J8žJe³œÒÇÃü2mç‡sQÑëP0À•ïãš-^^äúЦ5[¼¼þêy?ŒAÊC€2?TjÞH܆’¸ßümøo"@1H1tꆦXG1rõ}kÐL%×°CÁœ¤Ð à¯hœ¾ƒ&Ú4úo!º† ;‚®]LHÒ°e(”ø=¡ŽÀZý˜[]ÿ×êú;7dÃò?‚Æk'W­ü¾o£ÔÎÏñ ùAþØ…ì†=xá5Äð:IáŽCüa£b!ZÀcxœ(DÃÌp1Ž')Å1ÒóaÊïŽæ8¥”÷!°NÎü*’*&TþïÀ=t«hTÑÄÕÐý_éP;É=œ'¼’XœáÙ­/ÚúÚçý F«ÞÆÎ™ù€ë¥bXˆ@Çu #Bw¶vÉp§ú\‡}bÈ9¹Ã»¼‡x?}düÁ©À¨“•¡€àTò}HH.ßÁÝo!’Œîº…ÝsÉèyëV¬ü£«ëOÞÂC×ËIØ/ë¥a$¡qÖa’xA1c¬¾ã¤x‚š)R_J@{ñ& (ü+“}š?Av˜ö3xŠþG¸û f™”«97­ðßCTE§Bºï"¦¢å]t¸Œ”Fœ×.ã'¨ññޜ軅؜ ›t<ìõ2¯i Êâ1éi›³¡ì_3ã%œ‚§ß6ì ;AØ“÷ýžq“÷6ïA-ÁöV4Rg©‘Z¦l G® ¸¶ºþoÿµrNÚ$«gسdyŽE:ú+ŽŽ‘ÉN:$ôËÌ•œèųøxU¡ Í'\ž5øïB%Ç»6 Zç3¾]^ᜈ¢kéô>lšJþ ;ï k>ÚeÞ'*ù6zþ’Eä—Ge¤)ö¤Aù<],;[í¢ÃS;\ô¬Oº†r=l8>Y ŠÃ߀äŠ^ÚÜ9ÙŠÎ ºðNL¯ç‘vczÂÍ­&@S܇¹›Òšg\¬H«VvWc£òŒ .¸ˆ97­{ªXšŘ”ã°—GôoøÛ )ãªÈ‘¶,ÏI8åsöÈQ¦HI 0­›$AbïsŒÖ9ûŠ{ö`_ið–«*^QUt¥ Õ ¢š¹èó‰ñûÏåŒ9%ö<'ì tçE¾B^âKãårÖvs?ê–Ø`ÙÑAé^EAEXP QP –dȹÿPK AyßtÚE,org/gradle/cli/ParsedCommandLineOption.classS]OÔ@=ݯîGeùPa„eQª¨ø"ˆhHV1YƒÁ·awR»í¦íá§ðl⋘¨IÔg”ñN[`Y$ñ¡Ó™Û{Ï=çÜéï?ߘ“4²(ª˜H#‚b ¸ž¦å†ŠÉ$ô4¸™Á-L%q[¾ï¨¸+ßÓr¹§â¾Š [ÌlpWA¶´É¶˜Þð„©—„ëÍ(H•…a1¯áp#-Ÿgƒ³É,C/{ްŒ™9*IÌ Kxs ¢…ñU±E»JÅ%añ—Ú:w^³u“"¹’]aæ*s„<‡Á˜·!ˆI¡d;†n8¬jr½b ýs\^]´k5fU%ÔJݶEí’÷V¥Ý…ñ³”´•=Vy÷‚Õé£ j”;*i=z&xŽÔ «V£Qã–§ §p6K:dÇ)¹ñKn07T@–½U.Û §ÂŸ Évàé“ICzt°]p¶-)kèDNÃ(Æ t]6Mn0“,ñøÒû ÷±(#ÍWmîæ-ÛËo°-žgÖvÞ¿“²Ñ°Š‡f0« ?L'æùZÃôDÝäA¦K©@Ó϶*Õðó$¡Ñÿï)”•õM^!ÛO†îŒ+vï–i¥áÊQ,7_… ”¬ŽÒÀZ~“¾«Â]ªÕ½m\¡(K? LºHï.:EÐ8íÉrZ/PdQÚÙâ>”â!"kûˆ~E쳟}‘Vù_‚*bTÓG;-ÈÇ%ôûø¸bí„XÓÅoˆï¢í‰µœºäÏâÄ"¡Âpú(=@&‚_Ðö¨2êwì%Ž ^*õè$üAêPÀPS÷é°û =1D:¥š!䉩ä¡ÓIfÅ%þÞ±„n‚‰‡05W(v•¾bžRD ×$ÈÄÚ"xÓjÊ2D¬Ï§ìç†xr7‚k> º½!âóV.p£]Á.ÔØG²àÓ±ô€ãDÇ\“Ô8"Ùy Rð‰ŒÿPK A\vÆB| :org/gradle/cli/ProjectPropertiesCommandLineConverter.class’KOÂ@…ÏD|?PâìÀšuã#QŒ+¢$÷C;–1m‡  ÿJW&.üþ(ãª1ØDã,îéœ9ßôv¦oï/¯ö±[@yl汕G)‡ívÙ }FHWkw„LSºœ°Ü!¿]®nY×7ÎZK:Ì¿cJDóØÌ螎ZRy¶§˜ësÛñ…ÝVò;ÚHŸ+-ø )ƒ€…n´kS†#cruLXõøgh|Ó×B†„j­õÀFÌöYèÙ­Dè™èÎè%×LøÜ%”ÖŽñŽ…Ž*‡_‰¨å½?õÖˆ:("‡<Ú„bJÕö ®­ØŠtòfë^*K÷¸Õ ßµ¦ XUÞðV½Œ£Üi01Èk ÂÁp8ƒwZ±ß8T0gî?Pôa¦Î›™m”ŒÎí=ƒžÌC S³s ¦§£‹| Ë1\áôZêq-}CÓ_èJšžEˉèjš™E+ ¨ùw'©õPK A Ï8=|ü9org/gradle/cli/SystemPropertiesCommandLineConverter.class’ËJÃ@†ÏØ«mµ¶ÖjÕEÜ5BPÄ…R/Pé~šÓ‘$&ÓBÞJW‚ À‡'i©AÄYœ3óÏÿÍœ¹¼¼¾Àl— "l¡Y„Íl E Ê<&Ï dÚú@¶ËÇH ÚgÞLÝŠ{:r”Rïs‹:C*X4NĬœ°€ÀQŸ Û´;hZ3a ѽÜG!]îºÔG‹v¹7S"Š5eb o}ɸG ÑÖûtFM‡z¶9‚y¶²¶~X{()spL`7e.°KV, øTXxÉ¢Šõ¿”fDT E¤G ÄPÇWãJm®h~²­Æ49Aíjx­µÑ° ­ÓsÃhöÌ gÔ™¢n8üÇ5©Û] .FÔ’¿s°9õàQˉ΢ⲙ*•sû/@žUg J*æc±e+sƒÊ+1¾ Õî$p¦¾ô´€6¿¡™/t-Í,¢;©h-Í.¢Z ª>kìZÿPK AýØ?¢gradle-cli-classpath.properties+(ÊÏJM.)¶å**Í+ÉÌMµåPK A%gradle-cli-parameter-names.propertiesPK A íAMETA-INF/PK Am±>=@?¤)META-INF/MANIFEST.MFPK AíA›org/PK A íA¿org/gradle/PK AíAêorg/gradle/wrapper/PK A•%Ó¦¹/¤org/gradle/wrapper/BootstrapMainStarter$1.classPK Ai,«$ -¤#org/gradle/wrapper/BootstrapMainStarter.classPK AhQþ}¢Ò#¤org/gradle/wrapper/Download$1.classPK Az`äù9ØA¤p org/gradle/wrapper/Download$DefaultDownloadProgressListener.classPK AVUPL4¤org/gradle/wrapper/Download$ProxyAuthenticator.classPK Aä£âüx!¤rorg/gradle/wrapper/Download.classPK AyL¢¡Ê1¤­org/gradle/wrapper/DownloadProgressListener.classPK A!9|¶„ 3¤ org/gradle/wrapper/ExclusiveFileAccessManager.classPK Aì„,y†-¤¤'org/gradle/wrapper/GradleUserHomeLookup.classPK A™c67§ *¤h*org/gradle/wrapper/GradleWrapperMain.classPK AúâæªÛ"¤W4org/gradle/wrapper/IDownload.classPK A9lâV†"¤A5org/gradle/wrapper/Install$1.classPK A¯ î|-¤×=org/gradle/wrapper/Install$InstallCheck.classPK At˾¤@- ¤ž@org/gradle/wrapper/Install.classPK Að¿:öo4¤€Uorg/gradle/wrapper/Logger.classPK AJJ¯'ï8¤,Xorg/gradle/wrapper/PathAssembler$LocalDistribution.classPK A´çtx7‘&¤Zorg/gradle/wrapper/PathAssembler.classPK A„ÍëÂ| 0¤Šaorg/gradle/wrapper/SystemPropertiesHandler.classPK Aª=©°?-¤šforg/gradle/wrapper/WrapperConfiguration.classPK AGü¨ (¤•iorg/gradle/wrapper/WrapperExecutor.classPK AÔe‹ #¤ðrgradle-wrapper-classpath.propertiesPK A)¤Psgradle-wrapper-parameter-names.propertiesPK AíA™sorg/gradle/cli/PK AÕÜ?®<S1¤Èsorg/gradle/cli/AbstractCommandLineConverter.classPK A׃µ³Xì ;¤Svorg/gradle/cli/AbstractPropertiesCommandLineConverter.classPK A}­ÎyGK1¤{org/gradle/cli/CommandLineArgumentException.classPK A³ßâúg)¤š|org/gradle/cli/CommandLineConverter.classPK ASf Õg&¤ú}org/gradle/cli/CommandLineOption.classPK Aü튯¥å(¤@„org/gradle/cli/CommandLineParser$1.classPK A$f{K¿ ;¤+…org/gradle/cli/CommandLineParser$AfterFirstSubCommand.classPK A¥D£¢&3¤Ïˆorg/gradle/cli/CommandLineParser$AfterOptions.classPK AŒ‹Müu <¤Â‹org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.classPK A´*«ZMïF¤org/gradle/cli/CommandLineParser$CaseInsensitiveStringComparator.classPK A|ìRÎÐ&=¤É’org/gradle/cli/CommandLineParser$KnownOptionParserState.classPK A$ľ¢¥ô<¤ô™org/gradle/cli/CommandLineParser$MissingOptionArgState.classPK ATK>ªÄ=¤óœorg/gradle/cli/CommandLineParser$OptionAwareParserState.classPK A˜%àÌ»ª7¤øŸorg/gradle/cli/CommandLineParser$OptionComparator.classPK AäfC˜§£8¤£org/gradle/cli/CommandLineParser$OptionParserState.classPK A¢Æ÷E«¶3¤¥org/gradle/cli/CommandLineParser$OptionString.classPK AgAq²”x=¤¨org/gradle/cli/CommandLineParser$OptionStringComparator.classPK A`M~U¸2¤ðªorg/gradle/cli/CommandLineParser$ParserState.classPK ApÍX Ýk?¤D­org/gradle/cli/CommandLineParser$UnknownOptionParserState.classPK A£=l)&¤~°org/gradle/cli/CommandLineParser.classPK A‹å>É&¤ØÂorg/gradle/cli/ParsedCommandLine.classPK AyßtÚE,¤åÊorg/gradle/cli/ParsedCommandLineOption.classPK A\vÆB| :¤ Îorg/gradle/cli/ProjectPropertiesCommandLineConverter.classPK A Ï8=|ü9¤ÝÏorg/gradle/cli/SystemPropertiesCommandLineConverter.classPK AýØ?¢¤°Ñgradle-cli-classpath.propertiesPK A%¤Ògradle-cli-parameter-names.propertiesPK66êGÒlibwebp-1.4.0/config.sub0000755000014400001440000010511614606317243012045 0ustar #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libwebp-1.4.0/ltmain.sh0000755000014400001440000121237714606317241011714 0ustar #! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.4.7 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.7 Debian-2.4.7-7+build1" package_revision=2.4.7 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. if test -z "$_G_HAVE_PLUSEQ_OP" && \ __PLUSEQ_TEST="a" && \ __PLUSEQ_TEST+=" b" 2>/dev/null && \ test "a b" = "$__PLUSEQ_TEST"; then _G_HAVE_PLUSEQ_OP=yes fi if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd _G_rc_run_hooks=false case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.7' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion Debian-2.4.7-7+build1 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. -pthread) case $host in *solaris2*) ;; *) case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac ;; esac continue ;; -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $func_quote_arg_result" func_append compiler_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $wl$func_quote_arg_result" func_append compiler_flags " $wl$func_quote_arg_result" func_append linker_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xassembler) prev=xassembler continue ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC # -static-* direct GCC to link specific libraries statically # -fcilkplus Cilk Plus language extension features for C/C++ # -Wa,* Pass flags directly to the assembler -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus|-Wa,*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_arg pretty "$arg" arg=$func_quote_arg_result fi ;; # Some other compiler flag. -* | +*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type '$version_type'" ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf | midnightbsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty "$var_value" relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done func_quote eval cd "`pwd`" func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty,unquoted "$var_value" relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" fi done # Quote the link command for shipping. func_quote eval cd "`pwd`" relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" func_quote_arg pretty,unquoted "$relink_command" relink_command=$func_quote_arg_unquoted_result if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: libwebp-1.4.0/PATENTS0000644000014400001440000000263414606317060011121 0ustar Additional IP Rights Grant (Patents) ------------------------------------ "These implementations" means the copyrightable works that implement the WebM codecs distributed by Google as part of the WebM Project. Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, transfer, and otherwise run, modify and propagate the contents of these implementations of WebM, where such license applies only to those patent claims, both currently owned by Google and acquired in the future, licensable by Google that are necessarily infringed by these implementations of WebM. This grant does not include claims that would be infringed only as a consequence of further modification of these implementations. If you or your agent or exclusive licensee institute or order or agree to the institution of patent litigation or any other patent enforcement activity against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that any of these implementations of WebM or any code incorporated within any of these implementations of WebM constitute direct or contributory patent infringement, or inducement of patent infringement, then any patent rights granted to you under this License for these implementations of WebM shall terminate as of the date such litigation is filed. libwebp-1.4.0/CONTRIBUTING.md0000644000014400001440000000513214606317060012305 0ustar # How to Contribute We'd love to accept your patches and contributions to this project. There are just a few small guidelines you need to follow. ## Contributor License Agreement Contributions to this project must be accompanied by a Contributor License Agreement. You (or your employer) retain the copyright to your contribution; this simply gives us permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Code reviews All submissions, including submissions by project members, require review. We use a [Gerrit](https://www.gerritcodereview.com) instance hosted at https://chromium-review.googlesource.com for this purpose. ## Sending patches The basic git workflow for modifying libwebp code and sending for review is: 1. Get the latest version of the repository locally: ```sh git clone https://chromium.googlesource.com/webm/libwebp && cd libwebp ``` 2. Copy the commit-msg script into ./git/hooks (this will add an ID to all of your commits): ```sh curl -Lo .git/hooks/commit-msg https://chromium-review.googlesource.com/tools/hooks/commit-msg && chmod u+x .git/hooks/commit-msg ``` 3. Modify the local copy of libwebp. Make sure the code [builds successfully](https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/building.md#cmake). 4. Choose a short and representative commit message: ```sh git commit -a -m "Set commit message here" ``` 5. Send the patch for review: ```sh git push https://chromium-review.googlesource.com/webm/libwebp HEAD:refs/for/main ``` Go to https://chromium-review.googlesource.com to view your patch and request a review from the maintainers. See the [WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/) for additional details. ## Code Style The C code style is based on the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) and `clang-format --style=Google`, though this project doesn't use the tool to enforce the formatting. CMake files are formatted with [cmake-format](https://cmake-format.readthedocs.io/en/latest/). `cmake-format -i` can be used to format individual files, it will use the settings from `.cmake-format.py`. ## Community Guidelines This project follows [Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). libwebp-1.4.0/Makefile.vc0000644000014400001440000004471314606317060012133 0ustar # # Stem for static libs and DLLs # LIBWEBPDECODER_BASENAME = libwebpdecoder LIBWEBP_BASENAME = libwebp LIBWEBPMUX_BASENAME = libwebpmux LIBWEBPDEMUX_BASENAME = libwebpdemux LIBSHARPYUV_BASENAME = libsharpyuv !IFNDEF ARCH !IF ! [ cl 2>&1 | find "x86" > NUL ] ARCH = x86 !ELSE IF ! [ cl 2>&1 | find "x64" > NUL ] ARCH = x64 !ELSE IF ! [ cl 2>&1 | find "ARM64" > NUL ] ARCH = ARM64 !ELSE IF ! [ cl 2>&1 | find "ARM" > NUL ] ARCH = ARM !ELSE !ERROR Unable to auto-detect toolchain architecture! \ If cl.exe is in your PATH rerun nmake with ARCH=. !ENDIF !ENDIF !IF "$(ARCH)" == "x86" PLATFORM_LDFLAGS = /SAFESEH !ENDIF ############################################################# ## Nothing more to do below this line! NOLOGO = /nologo CCNODBG = cl.exe $(NOLOGO) /O2 /DNDEBUG CCDEBUG = cl.exe $(NOLOGO) /Od /Zi /D_DEBUG /RTC1 CFLAGS = /I. /Isrc $(NOLOGO) /W3 /EHsc /c CFLAGS = $(CFLAGS) /DWIN32 /D_CRT_SECURE_NO_WARNINGS /DWIN32_LEAN_AND_MEAN LDFLAGS = /LARGEADDRESSAWARE /MANIFEST:EMBED /NXCOMPAT /DYNAMICBASE LDFLAGS = $(LDFLAGS) $(PLATFORM_LDFLAGS) LNKDLL = link.exe /DLL $(NOLOGO) LNKEXE = link.exe $(NOLOGO) LNKLIB = lib.exe $(NOLOGO) RCNODBG = rc.exe $(NOLOGO) /l"0x0409" # 0x409 = U.S. English RCDEBUG = $(RCNODBG) /D_DEBUG !IF "$(ARCH)" == "ARM" CFLAGS = $(CFLAGS) /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP /DWEBP_USE_THREAD !ELSE CFLAGS = $(CFLAGS) /DHAVE_WINCODEC_H /DWEBP_USE_THREAD !ENDIF CFGSET = FALSE !IF "$(OBJDIR)" == "" OUTDIR = ..\obj\ !ELSE OUTDIR = $(OBJDIR) !ENDIF ############################################################## # Runtime library configuration !IF "$(RTLIBCFG)" == "static" RTLIB = /MT RTLIBD = /MTd !ELSE IF "$(RTLIBCFG)" == "legacy" RTLIBCFG = static RTLIB = /MT RTLIBD = /MTd CFLAGS = $(CFLAGS) /GS- /arch:IA32 !ELSE RTLIB = /MD RTLIBD = /MDd !ENDIF DIRBASE = $(OUTDIR)\$(CFG)\$(ARCH) DIROBJ = $(DIRBASE)\obj DIRLIB = $(DIRBASE)\lib DIRINC = $(DIRBASE)\include DIRBIN = $(DIRBASE)\bin LIBWEBP_PDBNAME = $(DIROBJ)\$(LIBWEBP_BASENAME).pdb OUTPUT_DIRS = $(DIRBIN) $(DIRINC) $(DIRLIB) \ $(DIROBJ)\dec \ $(DIROBJ)\demux \ $(DIROBJ)\dsp \ $(DIROBJ)\enc \ $(DIROBJ)\examples \ $(DIROBJ)\extras \ $(DIROBJ)\imageio \ $(DIROBJ)\mux \ $(DIROBJ)\sharpyuv \ $(DIROBJ)\utils \ # Target configuration !IF "$(CFG)" == "release-static" CC = $(CCNODBG) STATICLIBBUILD = TRUE !ELSE IF "$(CFG)" == "debug-static" CC = $(CCDEBUG) RTLIB = $(RTLIBD) STATICLIBBUILD = TRUE LIBWEBPDECODER_BASENAME = $(LIBWEBPDECODER_BASENAME)_debug LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug !ELSE IF "$(CFG)" == "release-dynamic" CC = $(CCNODBG) RC = $(RCNODBG) DLLBUILD = TRUE !ELSE IF "$(CFG)" == "debug-dynamic" CC = $(CCDEBUG) RC = $(RCDEBUG) RTLIB = $(RTLIBD) DLLBUILD = TRUE LIBWEBPDECODER_BASENAME = $(LIBWEBPDECODER_BASENAME)_debug LIBWEBP_BASENAME = $(LIBWEBP_BASENAME)_debug LIBWEBPMUX_BASENAME = $(LIBWEBPMUX_BASENAME)_debug LIBWEBPDEMUX_BASENAME = $(LIBWEBPDEMUX_BASENAME)_debug LIBSHARPYUV_BASENAME = $(LIBSHARPYUV_BASENAME)_debug !ENDIF !IF "$(STATICLIBBUILD)" == "TRUE" CC = $(CC) $(RTLIB) CFGSET = TRUE LIBWEBPDECODER = $(DIRLIB)\$(LIBWEBPDECODER_BASENAME).lib LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME).lib LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME).lib LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME).lib LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME).lib !ELSE IF "$(DLLBUILD)" == "TRUE" CC = $(CC) /I$(DIROBJ) $(RTLIB) /DWEBP_DLL LIBWEBPDECODER = $(DIRLIB)\$(LIBWEBPDECODER_BASENAME)_dll.lib LIBWEBP = $(DIRLIB)\$(LIBWEBP_BASENAME)_dll.lib LIBWEBPMUX = $(DIRLIB)\$(LIBWEBPMUX_BASENAME)_dll.lib LIBWEBPDEMUX = $(DIRLIB)\$(LIBWEBPDEMUX_BASENAME)_dll.lib LIBSHARPYUV = $(DIRLIB)\$(LIBSHARPYUV_BASENAME)_dll.lib LIBWEBP_PDBNAME = $(DIROBJ)\$(LIBWEBP_BASENAME)_dll.pdb CFGSET = TRUE !ENDIF !IF "$(UNICODE)" == "1" CFLAGS = $(CFLAGS) /D_UNICODE /DUNICODE !ENDIF ####################### # Usage # !IF "$(CFGSET)" == "FALSE" !MESSAGE Usage: nmake /f Makefile.vc [CFG=] !MESSAGE . [OBJDIR=] [RTLIBCFG=] [UNICODE=1] [] !MESSAGE !MESSAGE where is one of: !MESSAGE - release-static - release static library !MESSAGE - debug-static - debug static library !MESSAGE - release-dynamic - release dynamic link library (DLL) !MESSAGE - debug-dynamic - debug dynamic link library (DLL) !MESSAGE !MESSAGE may be: !MESSAGE - clean - perform a clean for CFG !MESSAGE - experimental - build CFG with experimental !MESSAGE . features enabled. !MESSAGE - (empty) - build libwebp-based targets for CFG !MESSAGE - all - build (de)mux-based targets for CFG !MESSAGE - gif2webp - requires libgif & >= VS2013 !MESSAGE - anim_diff - requires libgif & >= VS2013 !MESSAGE - anim_dump !MESSAGE !MESSAGE RTLIBCFG controls the runtime library linkage - 'static' or 'dynamic'. !MESSAGE 'legacy' will produce a Windows 2000 compatible library. !MESSAGE OBJDIR is the path where you like to build (obj, bins, etc.), !MESSAGE defaults to ..\obj !IF "$(CFG)" != "" !MESSAGE !ERROR please choose a valid configuration instead of "$(CFG)" !ENDIF !ENDIF ####################### # Rules # !IF "$(CFGSET)" == "TRUE" # A config was provided, so the library can be built. # SHARPYUV_OBJS = \ $(DIROBJ)\sharpyuv\sharpyuv.obj \ $(DIROBJ)\sharpyuv\sharpyuv_cpu.obj \ $(DIROBJ)\sharpyuv\sharpyuv_csp.obj \ $(DIROBJ)\sharpyuv\sharpyuv_dsp.obj \ $(DIROBJ)\sharpyuv\sharpyuv_gamma.obj \ $(DIROBJ)\sharpyuv\sharpyuv_neon.obj \ $(DIROBJ)\sharpyuv\sharpyuv_sse2.obj \ DEC_OBJS = \ $(DIROBJ)\dec\alpha_dec.obj \ $(DIROBJ)\dec\buffer_dec.obj \ $(DIROBJ)\dec\frame_dec.obj \ $(DIROBJ)\dec\idec_dec.obj \ $(DIROBJ)\dec\io_dec.obj \ $(DIROBJ)\dec\quant_dec.obj \ $(DIROBJ)\dec\tree_dec.obj \ $(DIROBJ)\dec\vp8_dec.obj \ $(DIROBJ)\dec\vp8l_dec.obj \ $(DIROBJ)\dec\webp_dec.obj \ DEMUX_OBJS = \ $(DIROBJ)\demux\anim_decode.obj \ $(DIROBJ)\demux\demux.obj \ DSP_DEC_OBJS = \ $(DIROBJ)\dsp\alpha_processing.obj \ $(DIROBJ)\dsp\alpha_processing_mips_dsp_r2.obj \ $(DIROBJ)\dsp\alpha_processing_neon.obj \ $(DIROBJ)\dsp\alpha_processing_sse2.obj \ $(DIROBJ)\dsp\alpha_processing_sse41.obj \ $(DIROBJ)\dsp\cpu.obj \ $(DIROBJ)\dsp\dec.obj \ $(DIROBJ)\dsp\dec_clip_tables.obj \ $(DIROBJ)\dsp\dec_mips32.obj \ $(DIROBJ)\dsp\dec_mips_dsp_r2.obj \ $(DIROBJ)\dsp\dec_msa.obj \ $(DIROBJ)\dsp\dec_neon.obj \ $(DIROBJ)\dsp\dec_sse2.obj \ $(DIROBJ)\dsp\dec_sse41.obj \ $(DIROBJ)\dsp\filters.obj \ $(DIROBJ)\dsp\filters_mips_dsp_r2.obj \ $(DIROBJ)\dsp\filters_msa.obj \ $(DIROBJ)\dsp\filters_neon.obj \ $(DIROBJ)\dsp\filters_sse2.obj \ $(DIROBJ)\dsp\lossless.obj \ $(DIROBJ)\dsp\lossless_mips_dsp_r2.obj \ $(DIROBJ)\dsp\lossless_msa.obj \ $(DIROBJ)\dsp\lossless_neon.obj \ $(DIROBJ)\dsp\lossless_sse2.obj \ $(DIROBJ)\dsp\lossless_sse41.obj \ $(DIROBJ)\dsp\rescaler.obj \ $(DIROBJ)\dsp\rescaler_mips32.obj \ $(DIROBJ)\dsp\rescaler_mips_dsp_r2.obj \ $(DIROBJ)\dsp\rescaler_msa.obj \ $(DIROBJ)\dsp\rescaler_neon.obj \ $(DIROBJ)\dsp\rescaler_sse2.obj \ $(DIROBJ)\dsp\upsampling.obj \ $(DIROBJ)\dsp\upsampling_mips_dsp_r2.obj \ $(DIROBJ)\dsp\upsampling_msa.obj \ $(DIROBJ)\dsp\upsampling_neon.obj \ $(DIROBJ)\dsp\upsampling_sse2.obj \ $(DIROBJ)\dsp\upsampling_sse41.obj \ $(DIROBJ)\dsp\yuv.obj \ $(DIROBJ)\dsp\yuv_mips32.obj \ $(DIROBJ)\dsp\yuv_mips_dsp_r2.obj \ $(DIROBJ)\dsp\yuv_neon.obj \ $(DIROBJ)\dsp\yuv_sse2.obj \ $(DIROBJ)\dsp\yuv_sse41.obj \ DSP_ENC_OBJS = \ $(DIROBJ)\dsp\cost.obj \ $(DIROBJ)\dsp\cost_mips32.obj \ $(DIROBJ)\dsp\cost_mips_dsp_r2.obj \ $(DIROBJ)\dsp\cost_neon.obj \ $(DIROBJ)\dsp\cost_sse2.obj \ $(DIROBJ)\dsp\enc.obj \ $(DIROBJ)\dsp\enc_mips32.obj \ $(DIROBJ)\dsp\enc_mips_dsp_r2.obj \ $(DIROBJ)\dsp\enc_msa.obj \ $(DIROBJ)\dsp\enc_neon.obj \ $(DIROBJ)\dsp\enc_sse2.obj \ $(DIROBJ)\dsp\enc_sse41.obj \ $(DIROBJ)\dsp\lossless_enc.obj \ $(DIROBJ)\dsp\lossless_enc_mips32.obj \ $(DIROBJ)\dsp\lossless_enc_mips_dsp_r2.obj \ $(DIROBJ)\dsp\lossless_enc_msa.obj \ $(DIROBJ)\dsp\lossless_enc_neon.obj \ $(DIROBJ)\dsp\lossless_enc_sse2.obj \ $(DIROBJ)\dsp\lossless_enc_sse41.obj \ $(DIROBJ)\dsp\ssim.obj \ $(DIROBJ)\dsp\ssim_sse2.obj \ EX_ANIM_UTIL_OBJS = \ $(DIROBJ)\examples\anim_util.obj \ IMAGEIO_DEC_OBJS = \ $(DIROBJ)\imageio\image_dec.obj \ $(DIROBJ)\imageio\jpegdec.obj \ $(DIROBJ)\imageio\metadata.obj \ $(DIROBJ)\imageio\pngdec.obj \ $(DIROBJ)\imageio\pnmdec.obj \ $(DIROBJ)\imageio\tiffdec.obj \ $(DIROBJ)\imageio\webpdec.obj \ $(DIROBJ)\imageio\wicdec.obj \ IMAGEIO_ENC_OBJS = \ $(DIROBJ)\imageio\image_enc.obj \ EX_GIF_DEC_OBJS = \ $(DIROBJ)\examples\gifdec.obj \ EX_UTIL_OBJS = \ $(DIROBJ)\examples\example_util.obj \ ENC_OBJS = \ $(DIROBJ)\enc\alpha_enc.obj \ $(DIROBJ)\enc\analysis_enc.obj \ $(DIROBJ)\enc\backward_references_cost_enc.obj \ $(DIROBJ)\enc\backward_references_enc.obj \ $(DIROBJ)\enc\config_enc.obj \ $(DIROBJ)\enc\cost_enc.obj \ $(DIROBJ)\enc\filter_enc.obj \ $(DIROBJ)\enc\frame_enc.obj \ $(DIROBJ)\enc\histogram_enc.obj \ $(DIROBJ)\enc\iterator_enc.obj \ $(DIROBJ)\enc\near_lossless_enc.obj \ $(DIROBJ)\enc\picture_enc.obj \ $(DIROBJ)\enc\picture_csp_enc.obj \ $(DIROBJ)\enc\picture_psnr_enc.obj \ $(DIROBJ)\enc\picture_rescale_enc.obj \ $(DIROBJ)\enc\picture_tools_enc.obj \ $(DIROBJ)\enc\predictor_enc.obj \ $(DIROBJ)\enc\quant_enc.obj \ $(DIROBJ)\enc\syntax_enc.obj \ $(DIROBJ)\enc\token_enc.obj \ $(DIROBJ)\enc\tree_enc.obj \ $(DIROBJ)\enc\vp8l_enc.obj \ $(DIROBJ)\enc\webp_enc.obj \ EXTRAS_OBJS = \ $(DIROBJ)\extras\extras.obj \ $(DIROBJ)\extras\quality_estimate.obj \ $(DIROBJ)\extras\sharpyuv_risk_table.obj \ IMAGEIO_UTIL_OBJS = \ $(DIROBJ)\imageio\imageio_util.obj \ MUX_OBJS = \ $(DIROBJ)\mux\anim_encode.obj \ $(DIROBJ)\mux\muxedit.obj \ $(DIROBJ)\mux\muxinternal.obj \ $(DIROBJ)\mux\muxread.obj \ UTILS_DEC_OBJS = \ $(DIROBJ)\utils\bit_reader_utils.obj \ $(DIROBJ)\utils\color_cache_utils.obj \ $(DIROBJ)\utils\filters_utils.obj \ $(DIROBJ)\utils\huffman_utils.obj \ $(DIROBJ)\utils\palette.obj \ $(DIROBJ)\utils\quant_levels_dec_utils.obj \ $(DIROBJ)\utils\rescaler_utils.obj \ $(DIROBJ)\utils\random_utils.obj \ $(DIROBJ)\utils\thread_utils.obj \ $(DIROBJ)\utils\utils.obj \ UTILS_ENC_OBJS = \ $(DIROBJ)\utils\bit_writer_utils.obj \ $(DIROBJ)\utils\huffman_encode_utils.obj \ $(DIROBJ)\utils\quant_levels_utils.obj \ LIBWEBPDECODER_OBJS = $(DEC_OBJS) $(DSP_DEC_OBJS) $(UTILS_DEC_OBJS) LIBWEBP_OBJS = $(LIBWEBPDECODER_OBJS) $(ENC_OBJS) \ $(DSP_ENC_OBJS) $(UTILS_ENC_OBJS) $(DLL_OBJS) LIBWEBPMUX_OBJS = $(MUX_OBJS) $(LIBWEBPMUX_OBJS) LIBWEBPDEMUX_OBJS = $(DEMUX_OBJS) $(LIBWEBPDEMUX_OBJS) LIBSHARPYUV_OBJS = $(SHARPYUV_OBJS) OUT_LIBS = $(LIBWEBPDECODER) $(LIBWEBP) $(LIBSHARPYUV) !IF "$(ARCH)" == "ARM" ex: $(OUT_LIBS) all: ex !ELSE OUT_EXAMPLES = $(DIRBIN)\cwebp.exe $(DIRBIN)\dwebp.exe EXTRA_EXAMPLES = $(DIRBIN)\vwebp.exe $(DIRBIN)\webpmux.exe \ $(DIRBIN)\img2webp.exe $(DIRBIN)\get_disto.exe \ $(DIRBIN)\webp_quality.exe $(DIRBIN)\vwebp_sdl.exe \ $(DIRBIN)\webpinfo.exe ex: $(OUT_LIBS) $(OUT_EXAMPLES) all: ex $(EXTRA_EXAMPLES) # NB: gif2webp.exe and anim_diff.exe are excluded from 'all' as libgif requires # C99 support which is only available from VS2013 onward. gif2webp: $(DIRBIN)\gif2webp.exe anim_diff: $(DIRBIN)\anim_diff.exe anim_dump: $(DIRBIN)\anim_dump.exe $(DIRBIN)\anim_diff.exe: $(DIROBJ)\examples\anim_diff.obj $(EX_ANIM_UTIL_OBJS) $(DIRBIN)\anim_diff.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\anim_diff.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP) $(DIRBIN)\anim_dump.exe: $(DIROBJ)\examples\anim_dump.obj $(EX_ANIM_UTIL_OBJS) $(DIRBIN)\anim_dump.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\anim_dump.exe: $(EX_GIF_DEC_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP) $(DIRBIN)\anim_dump.exe: $(IMAGEIO_ENC_OBJS) $(DIRBIN)\cwebp.exe: $(DIROBJ)\examples\cwebp.obj $(IMAGEIO_DEC_OBJS) $(DIRBIN)\cwebp.exe: $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\cwebp.exe: $(LIBWEBPDEMUX) $(LIBSHARPYUV) $(DIRBIN)\dwebp.exe: $(DIROBJ)\examples\dwebp.obj $(IMAGEIO_DEC_OBJS) $(DIRBIN)\dwebp.exe: $(IMAGEIO_ENC_OBJS) $(DIRBIN)\dwebp.exe: $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\dwebp.exe: $(LIBWEBPDEMUX) $(DIRBIN)\gif2webp.exe: $(DIROBJ)\examples\gif2webp.obj $(EX_GIF_DEC_OBJS) $(DIRBIN)\gif2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBPMUX) $(DIRBIN)\gif2webp.exe: $(LIBWEBP) $(DIRBIN)\vwebp.exe: $(DIROBJ)\examples\vwebp.obj $(EX_UTIL_OBJS) $(DIRBIN)\vwebp.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP) $(DIRBIN)\vwebp_sdl.exe: $(DIROBJ)\extras\vwebp_sdl.obj $(DIRBIN)\vwebp_sdl.exe: $(DIROBJ)\extras\webp_to_sdl.obj $(DIRBIN)\vwebp_sdl.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBP) $(DIRBIN)\webpmux.exe: $(DIROBJ)\examples\webpmux.obj $(LIBWEBPMUX) $(DIRBIN)\webpmux.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBP) $(DIRBIN)\img2webp.exe: $(DIROBJ)\examples\img2webp.obj $(LIBWEBPMUX) $(DIRBIN)\img2webp.exe: $(IMAGEIO_DEC_OBJS) $(DIRBIN)\img2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\img2webp.exe: $(LIBWEBPDEMUX) $(LIBWEBP) $(LIBSHARPYUV) $(DIRBIN)\get_disto.exe: $(DIROBJ)\extras\get_disto.obj $(DIRBIN)\get_disto.exe: $(IMAGEIO_DEC_OBJS) $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\get_disto.exe: $(LIBWEBPDEMUX) $(LIBWEBP) $(DIRBIN)\webp_quality.exe: $(DIROBJ)\extras\webp_quality.obj $(DIRBIN)\webp_quality.exe: $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\webp_quality.exe: $(EXTRAS_OBJS) # EXTRA_OBJS requires private symbols from dsp. Explicitly add those when # building libwebp as a dll. !IF "$(DLLBUILD)" == "TRUE" $(DIRBIN)\webp_quality.exe: $(DSP_DEC_OBJS) !ENDIF $(DIRBIN)\webp_quality.exe: $(LIBWEBP) $(DIRBIN)\webpinfo.exe: $(DIROBJ)\examples\webpinfo.obj $(DIRBIN)\webpinfo.exe: $(IMAGEIO_DEC_OBJS) $(DIRBIN)\webpinfo.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(DIRBIN)\webpinfo.exe: $(LIBWEBPDEMUX) $(LIBWEBP) $(OUT_EXAMPLES): $(EX_UTIL_OBJS) $(LIBWEBP) $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS): $(OUTPUT_DIRS) $(IMAGEIO_DEC_OBJS) $(IMAGEIO_ENC_OBJS) $(EXTRAS_OBJS): $(OUTPUT_DIRS) !ENDIF # ARCH == ARM $(LIBSHARPYUV): $(LIBSHARPYUV_OBJS) $(LIBWEBPDECODER): $(LIBWEBPDECODER_OBJS) $(LIBWEBP): $(LIBWEBP_OBJS) $(LIBSHARPYUV) $(LIBWEBPMUX): $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX): $(LIBWEBPDEMUX_OBJS) $(LIBWEBP_OBJS) $(LIBWEBPMUX_OBJS) $(LIBWEBPDEMUX_OBJS) $(LIBSHARPYUV_OBJS): \ $(OUTPUT_DIRS) !IF "$(DLLBUILD)" == "TRUE" {$(DIROBJ)}.c{$(DIROBJ)}.obj: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$@ $< {src}.rc{$(DIROBJ)}.res: $(RC) /fo$@ $< {src\demux}.rc{$(DIROBJ)\demux}.res: $(RC) /fo$@ $< {src\mux}.rc{$(DIROBJ)\mux}.res: $(RC) /fo$@ $< {sharpyuv}.rc{$(DIROBJ)\sharpyuv}.res: $(RC) /fo$@ $< $(LIBSHARPYUV): $(DIROBJ)\sharpyuv\$(LIBSHARPYUV_BASENAME:_debug=).res $(LIBWEBP): $(LIBSHARPYUV) $(DIROBJ)\$(LIBWEBP_BASENAME:_debug=).res $(LIBWEBPDECODER): $(DIROBJ)\$(LIBWEBPDECODER_BASENAME:_debug=).res $(LIBWEBPMUX): $(LIBWEBP) $(DIROBJ)\mux\$(LIBWEBPMUX_BASENAME:_debug=).res $(LIBWEBPDEMUX): $(LIBWEBP) $(DIROBJ)\demux\$(LIBWEBPDEMUX_BASENAME:_debug=).res $(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV): $(LNKDLL) /out:$(DIRBIN)\$(@B:_dll=.dll) /implib:$@ $(LFLAGS) $** -xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y !ELSE $(LIBWEBPDECODER) $(LIBWEBP) $(LIBWEBPMUX) $(LIBWEBPDEMUX) $(LIBSHARPYUV): $(LNKLIB) /out:$@ $** -xcopy $(DIROBJ)\*.pdb $(DIRLIB) /y !ENDIF $(OUTPUT_DIRS): @if not exist "$(@)" mkdir "$(@)" .SUFFIXES: .c .obj .res .exe # File-specific flag builds. Note batch rules take precedence over wildcards, # so for now name each file individually. $(DIROBJ)\examples\anim_diff.obj: examples\anim_diff.c $(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \ /Fo$(DIROBJ)\examples\ examples\$(@B).c $(DIROBJ)\examples\anim_dump.obj: examples\anim_dump.c $(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \ /Fo$(DIROBJ)\examples\ examples\$(@B).c $(DIROBJ)\examples\anim_util.obj: examples\anim_util.c $(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \ /Fo$(DIROBJ)\examples\ examples\$(@B).c $(DIROBJ)\examples\gif2webp.obj: examples\gif2webp.c $(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \ /Fo$(DIROBJ)\examples\ examples\$(@B).c $(DIROBJ)\examples\gifdec.obj: examples\gifdec.c $(CC) $(CFLAGS) /DWEBP_HAVE_GIF /Fd$(LIBWEBP_PDBNAME) \ /Fo$(DIROBJ)\examples\ examples\$(@B).c # Batch rules {examples}.c{$(DIROBJ)\examples}.obj:: $(CC) $(CFLAGS) /Fd$(DIROBJ)\examples\ /Fo$(DIROBJ)\examples\ $< {extras}.c{$(DIROBJ)\extras}.obj:: $(CC) $(CFLAGS) /Fd$(DIROBJ)\extras\ /Fo$(DIROBJ)\extras\ $< {imageio}.c{$(DIROBJ)\imageio}.obj:: $(CC) $(CFLAGS) /Fd$(DIROBJ)\imageio\ /Fo$(DIROBJ)\imageio\ $< {sharpyuv}.c{$(DIROBJ)\sharpyuv}.obj:: $(CC) $(CFLAGS) /Fd$(DIROBJ)\sharpyuv\ /Fo$(DIROBJ)\sharpyuv\ $< {src\dec}.c{$(DIROBJ)\dec}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dec\ $< {src\demux}.c{$(DIROBJ)\demux}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\demux\ $< {src\dsp}.c{$(DIROBJ)\dsp}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\dsp\ $< {src\enc}.c{$(DIROBJ)\enc}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\enc\ $< {src\mux}.c{$(DIROBJ)\mux}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\mux\ $< {src\utils}.c{$(DIROBJ)\utils}.obj:: $(CC) $(CFLAGS) /Fd$(LIBWEBP_PDBNAME) /Fo$(DIROBJ)\utils\ $< LNKLIBS = ole32.lib windowscodecs.lib shlwapi.lib !IF "$(UNICODE)" == "1" LNKLIBS = $(LNKLIBS) Shell32.lib !ENDIF {$(DIROBJ)\examples}.obj{$(DIRBIN)}.exe: $(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS) {$(DIROBJ)\extras}.obj{$(DIRBIN)}.exe: $(LNKEXE) $(LDFLAGS) /OUT:$@ $** $(LNKLIBS) clean:: @-erase /s $(DIROBJ)\*.dll 2> NUL @-erase /s $(DIROBJ)\*.exp 2> NUL @-erase /s $(DIROBJ)\*.idb 2> NUL @-erase /s $(DIROBJ)\*.lib 2> NUL @-erase /s $(DIROBJ)\*.obj 2> NUL @-erase /s $(DIROBJ)\*.pch 2> NUL @-erase /s $(DIROBJ)\*.pdb 2> NUL @-erase /s $(DIROBJ)\*.res 2> NUL !ENDIF # End of case where a config was provided. libwebp-1.4.0/gradle.properties0000644000014400001440000000070314606317060013427 0ustar # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html # Versions for gradle BUILD_TOOLS_VERSION=23.0.3 COMPILE_SDK_VERSION=23 ANDROID_GRADLE_PLUGIN_VERSION=1.5.0 GRADLE_DOWNLOAD_TASK_VERSION=2.1.0 libwebp-1.4.0/.pylintrc0000644000014400001440000003434314606317060011727 0ustar # This Pylint rcfile contains a best-effort configuration to uphold the # best-practices and style described in the Google Python style guide: # https://google.github.io/styleguide/pyguide.html # # Its canonical open-source location is: # https://google.github.io/styleguide/pylintrc [MASTER] # Files or directories to be skipped. They should be base names, not paths. ignore=third_party # Files or directories matching the regex patterns are skipped. The regex # matches against base names, not paths. ignore-patterns= # Pickle collected data for later comparisons. persistent=no # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=4 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=abstract-method, apply-builtin, arguments-differ, attribute-defined-outside-init, backtick, bad-option-value, basestring-builtin, buffer-builtin, c-extension-no-member, consider-using-enumerate, cmp-builtin, cmp-method, coerce-builtin, coerce-method, delslice-method, div-method, duplicate-code, eq-without-hash, execfile-builtin, file-builtin, filter-builtin-not-iterating, fixme, getslice-method, global-statement, hex-method, idiv-method, implicit-str-concat-in-sequence, import-error, import-self, import-star-module-level, inconsistent-return-statements, input-builtin, intern-builtin, invalid-str-codec, locally-disabled, long-builtin, long-suffix, map-builtin-not-iterating, misplaced-comparison-constant, missing-function-docstring, metaclass-assignment, next-method-called, next-method-defined, no-absolute-import, no-else-break, no-else-continue, no-else-raise, no-else-return, no-init, # added no-member, no-name-in-module, no-self-use, nonzero-method, oct-method, old-division, old-ne-operator, old-octal-literal, old-raise-syntax, parameter-unpacking, print-statement, raising-string, range-builtin-not-iterating, raw_input-builtin, rdiv-method, reduce-builtin, relative-import, reload-builtin, round-builtin, setslice-method, signature-differs, standarderror-builtin, suppressed-message, sys-max-int, too-few-public-methods, too-many-ancestors, too-many-arguments, too-many-boolean-expressions, too-many-branches, too-many-instance-attributes, too-many-locals, too-many-nested-blocks, too-many-public-methods, too-many-return-statements, too-many-statements, trailing-newlines, unichr-builtin, unicode-builtin, unnecessary-pass, unpacking-in-except, useless-else-on-loop, useless-object-inheritance, useless-suppression, using-cmp-argument, wrong-import-order, xrange-builtin, zip-builtin-not-iterating, [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". This option is deprecated # and it will be removed in Pylint 2.0. files-output=no # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [BASIC] # Good variable names which should always be accepted, separated by a comma good-names=main,_,PRESUBMIT # Bad variable names which should always be refused, separated by a comma bad-names= # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl # Regular expression matching correct function names function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ # Regular expression matching correct variable names variable-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct constant names const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ # Regular expression matching correct attribute names attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ # Regular expression matching correct argument names argument-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct class attribute names class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ # Regular expression matching correct inline iteration names inlinevar-rgx=^[a-z][a-z0-9_]*$ # Regular expression matching correct class names class-rgx=^_?[A-Z][a-zA-Z0-9]*$ # Regular expression matching correct module names module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ # Regular expression matching correct method names method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=10 [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= [FORMAT] # Maximum number of characters on a single line. max-line-length=80 # TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt # lines made too long by directives to pytype. # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=(?x)( ^\s*(\#\ )??$| ^\s*(from\s+\S+\s+)?import\s+.+$) # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=yes # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check= # Maximum number of lines in a module max-module-lines=99999 # String used as indentation unit. The internal Google style guide mandates 2 # spaces. Google's externaly-published style guide says 4, consistent with # PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google # projects (like TensorFlow). indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=TODO [STRING] # This flag controls whether inconsistent-quotes generates a warning when the # character used as a quote delimiter is used inconsistently within a module. check-quote-consistency=yes [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging,absl.logging,tensorflow.io.logging [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub, TERMIOS, Bastion, rexec, sets # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant, absl # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict, _fields, _replace, _source, _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls, class_ # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=StandardError, Exception, BaseException libwebp-1.4.0/ChangeLog0000644000014400001440000076305114606317060011641 0ustar 8a6a55bb update NEWS cf7c5a5d provide a way to opt-out/override WEBP_NODISCARD cc34288a update ChangeLog (tag: v1.4.0-rc1) f13c0886 NEWS: fix date 74555950 Merge "vwebp: fix window title when options are given" into 1.4.0 d781646c vwebp: fix window title when options are given c2e394de update NEWS f6d15cb7 bump version to 1.4.0 57c388b8 update AUTHORS b3d1b2cb Merge changes I26f4aa22,I83386b6c,I320ed1a2 into main 07216886 webp-container-spec: fix VP8 chunk ref ('VP8'->'VP8 ') f88666eb webp_js/*.html: fix canvas mapping e2c8f233 cmake,wasm: simplify SDL2 related flags d537cd37 cmake: fix vwebp_sdl compile w/libsdl-org release 6c484cbf CMakeLists.txt: add missing WEBP_BUILD_EXTRAS check 7b0bc235 man/cwebp.1: add more detail to -partition_limit 3c0011bb WebPMuxGetChunk: add an assert 955a3d14 Merge "muxread,MuxGet: add an assert" into main 00abc000 muxread,MuxGet: add an assert 40e85a0b Have the window title reflect the filename. 1bf46358 man/cwebp.1: clarify -pass > 1 behavior w/o -size/-psnr eba03acb webp-container-spec: replace 'above' with 'earlier' a16d30cb webp-container-spec: clarify chunk order requirements 8a7e9112 Merge "CMakeLists.txt: apply cmake-format" into main 7fac6c1b Merge "Copy C code to not have multiplication overflow" into main e2922e43 Merge "Check for the presence of the ANDROID_ABI variable" into main 501d9274 Copy C code to not have multiplication overflow fba7d62e CMakeLists.txt: apply cmake-format 661c1b66 Merge "windows exports: use dllexport attribute, instead of visibility." into main 8487860a windows exports: use dllexport attribute, instead of visibility. 8ea678b9 webp/mux.h: data lifetime note w/copy_data=0 79e05c7f Check for the presence of the ANDROID_ABI variable 45f995a3 Expose functions for managing non-image chunks on WebPAnimEncoder 1fb9f3dc gifdec: fix ErrorGIFNotAvailable() declaration 4723db65 cosmetics: s/SANITY_CHECK/DCHECK/ f4b9bc9e clear -Wextra-semi-stmt warnings 713982b8 Limit animdecoder_fuzzer to 320MB cbe825e4 cmake: fix sharpyuv simd files' build f99305e9 Makefile.vc: add ARM64 support 5efd6300 mv SharpYuvEstimate420Risk to extras/ e78e924f Makefile.vc: add sharpyuv_risk_table.obj d7a0506d Add YUV420 riskiness metric. 89c5b917 Merge "BuildHuffmanTable check sorted[] array bounds before writing" into main 34c80749 Remove alpha encoding pessimization. 13d9c30b Add a WEBP_NODISCARD 24d7f9cb Switch code to SDL2. 0b56dedc BuildHuffmanTable check sorted[] array bounds before writing a429c0de sharpyuv: convert some for() to do/while f0cd7861 DoSharpArgbToYuv: remove constant from loop 339231cc SharpYuvConvertWithOptions,cosmetics: fix formatting 307071f1 Remove medium/large code model-specific inline asm deadc339 Fix transfer functions where toGamma and toLinear are swapped. e7b78d43 Merge "Fix bug in FromLinearLog100." into main 15a1309e Merge "webp-lossless-bitstream-spec: delete extra blank line" into main 54ca9752 Fix bug in FromLinearLog100. d2cb2d8c Dereference after NULL check. e9d50107 webp-lossless-bitstream-spec: delete extra blank line 78657971 Merge changes Ief442c90,Ie6e9c9a5 into main e30a5884 webp-lossless-bitstream-spec: update variable names 09ca1368 Merge "webp-container-spec: change assert to MUST be TRUE" into main 38cb4fc0 iosbuild,xcframeworkbuild: add SharpYuv framework 40afa926 webp-lossless-bitstream-spec: simplify abstract 9db21143 webp-container-spec: change assert to MUST be TRUE cdbf88ae Fix typo in API docs for incremental decoding 05c46984 Reformat vcpkg build instructions. 8534f539 Merge "Never send VP8_STATUS_SUSPENDED back in non-incremental." into main 35e197bd Never send VP8_STATUS_SUSPENDED back in non-incremental. 61441425 Add vcpkg installation instructions dce8397f Fix next is invalid pointer when WebPSafeMalloc fails 57c58105 Cmake: wrong public macro WEBP_INCLUDE_DIRS c1ffd9ac Merge "vp8l_enc: fix non-C90 code" into main a3965948 Merge changes If628bb93,Ic79f6309,I45f0db23 into main f80e9b7e vp8l_enc: fix non-C90 code accd141d Update lossless spec for two simple codes. ac17ffff Fix non-C90 code. 433c7dca Fix static analyzer warnings. 5fac76cf Merge tag 'v1.3.2' ca332209 update ChangeLog (tag: v1.3.2) 1ace578c update NEWS 63234c42 bump version to 1.3.2 a35ea50d Add a fuzzer for ReadHuffmanCodes 95ea5226 Fix invalid incremental decoding check. 2af26267 Fix OOB write in BuildHuffmanTable. 902bc919 Fix OOB write in BuildHuffmanTable. 7ba44f80 Homogenize "__asm__ volatile" vs "asm volatile" 68e27135 webp-container-spec: reorder example chunk layout 943b932a Merge changes I6a4d0a04,Ibc37b91e into main 1cc94f95 decode.h: wrap idec example in /* */ 63acdd1e decode.h: fix decode example aac5c5d0 ReadHuffmanCode: rm redundant num code lengths check a2de25f6 webp-lossless-bitstream-spec: normalize list item case 68820f0e webp-lossless-bitstream-spec: normalize pixel ref cdb31aa8 webp-lossless-bitstream-spec: add missing periods 0535a8cf webp-lossless-bitstream-spec: fix grammar b6c4ce26 normalize numbered list item format dd7364c3 Merge "palette.c: fix msvc warnings" into main c63c5df6 palette.c: fix msvc warnings 0a2cad51 webp-container-spec: move terms from intro section dd88d2ff webp-lossless-bitstream-spec: color_cache -> color cache 6e750547 Merge changes I644d7d39,Icf05491e,Ic02e6652,I63b11258 into main 67a7cc2b webp-lossless-bitstream-spec: fix code blocks 1432ebba Refactor palette sorting computation. cd436142 webp-lossless-bitstream-spec: block -> chunk 3cb66f64 webp-lossless-bitstream-spec: add some missing commas 56471a53 webp-lossless-bitstream-spec: normalize item text in 5.1 af7fbfd2 vp8l_dec,ReadTransform: improve error status reporting 7d8e0896 vp8l_dec: add VP8LSetError() a71ce1cf animencoder_fuzzer: fix error check w/Nallocfuzz e94b36d6 webp-lossless-bitstream-spec: relocate details from 5.1 84628e56 webp-lossless-bitstream-spec: clarify image width changes ee722997 alpha_dec: add missing VP8SetError() 0081693d enc_dec_fuzzer: use WebPDecode() 0fcb311c enc_dec_fuzzer: fix WebPEncode/pic.error_code check 982c177c webp-lossless-bitstream-spec: fix struct member refs 56cf5625 webp-lossless-bitstream-spec: use RFC 7405 for ABNF 6c6b3fd3 webp-lossless-bitstream-spec,cosmetics: delete blank lines 29b9eb15 Merge changes Id56ca4fd,I662bd1d7 into main 47c0af8d ReadHuffmanCodes: rm max_alphabet_size calc b92deba3 animencoder_fuzzer: no WebPAnimEncoderAssemble check w/nallocfuzz 6be9bf8b animencoder_fuzzer: fix leak on alloc failure 5c965e55 vp8l_dec,cosmetics: add some /*param=*/ comments e4fc2f78 webp-lossless-bitstream-spec: add validity note for max_symbol 71916726 webp-lossless-bitstream-spec: fix max_symbol definition eac3bd5c Have the palette code be in its own file. e2c85878 Add an initializer for the SharpYuvOptions struct. 4222b006 Merge tag 'v1.3.1' 25d94f47 Implement more transfer functions in libsharpyuv 2153a679 Merge changes Id0300937,I5dba5ccf,I57bb68e0,I2dba7b4e,I172aca36, ... into main 4298e976 webp-lossless-bitstream-spec: add PredictorTransformOutput cd7e02be webp-lossless-bitstream-spec: fix RIFF-header ABNF 6c3845f9 webp-lossless-bitstream-spec: split LZ77 Backward Ref section 7f1b6799 webp-lossless-bitstream-spec: split Meta Prefix Codes section 7b634d8f webp-lossless-bitstream-spec: note transform order 6d6d4915 webp-lossless-bitstream-spec: update transformations text fd7bb21c update ChangeLog (tag: v1.3.1-rc2, tag: v1.3.1) e1adea50 update NEWS 6b1c722a lossless_common.h,cosmetics: fix a typo 08d60d60 webp-lossless-bitstream-spec: split code length section 7a12afcc webp-lossless-bitstream-spec: rm unused anchor 43393320 enc/*: normalize WebPEncodingSetError() calls 287fdefe enc/*: add missing WebPEncodingSetError() calls c3bd7cff EncodeAlphaInternal: add missing error check 14a9dbfb webp-lossless-bitstream-spec: refine single node text 64819c7c Implement ExtractGreen_SSE2 d49cfbb3 vp8l_enc,WriteImage: add missing error check 2e5a9ec3 muxread,MuxImageParse: add missing error checks ebb6f949 cmake,emscripten: explicitly set stack size 59a2b1f9 WebPDecodeYUV: check u/v/stride/uv_stride ptrs 8e965ccb Call png_get_channels() to see if image has alpha fe80fbbd webp-container-spec: add some missing commas e8ed3176 Merge "treat FILTER_NONE as a regular Unfilter[] call" into main 03a7a048 webp-lossless-bitstream-spec: rm redundant statement c437c7aa webp-lossless-bitstream-spec: mv up prefix code group def e4f17a31 webp-lossless-bitstream-spec: fix section reference e2ecd5e9 webp-lossless-bitstream-spec: clarify ABNF syntax 8b55425a webp-lossless-bitstream-spec: refine pixel copy text 29c9f2d4 webp-lossless-bitstream-spec: minor wording updates 6b02f660 treat FILTER_NONE as a regular Unfilter[] call 7f75c91c webp-container-spec: fix location of informative msg f6499943 webp-container-spec: consistently quote FourCCs 49918af3 webp-container-spec: minor wording updates 7f0a3419 update ChangeLog (tag: v1.3.1-rc1) bab7efbe update NEWS 7138bf8f bump version to 1.3.1 435b4ded update AUTHORS 47351229 update .mailmap 46bc4fc9 Merge "Switch ExtraCost to ints and implement it in SSE." into main 828b4ce0 Switch ExtraCost to ints and implement it in SSE. ff6c7f4e CONTRIBUTING.md: add C style / cmake-format notes dd530437 add .cmake-format.py adbe2cb1 cmake,cosmetics: apply cmake-format 15b36508 doc/webp-container-spec: rm future codec comment c369c4bf doc/webp-lossless-bitstream-spec: improve link text 1de35f47 doc/webp-container-spec: don't use 'currently' bb06a16e doc/webp-container-spec: prefer present tense 9f38b71e doc/webp-lossless-bitstream-spec: prefer present tense 7acb6b82 doc/webp-container-spec: avoid i.e. & e.g. 4967e7cd doc/webp-lossless-bitstream-spec: avoid i.e. & e.g. e3366659 Merge "Do not find_package image libraries if not needed." into main 428588ef clarify single leaf node trees and use of canonical prefix coding 709ec152 Do not find_package image libraries if not needed. 8dd80ef8 fuzz_utils.h: lower kFuzzPxLimit w/ASan 8f187b9f Clean message calls in CMake cba30078 WebPConfig.cmake.in: use calculated include path 6cf9a76a Merge "webp-lossless-bitstream-spec: remove use of 'dynamics'" into main 740943b2 Merge "Specialize and optimize ITransform_SSE2 using do_two" into main 2d547e24 Compare kFuzzPxLimit to max_num_operations ac42dde1 Specialize and optimize ITransform_SSE2 using do_two 17e0ef1d webp-lossless-bitstream-spec: remove use of 'dynamics' ed274371 neon.h,cosmetics: clear a couple lint warnings 3fb82947 cpu.h,cosmetics: segment defines 0c496a4f cpu.h: add WEBP_AARCH64 8151f388 move VP8GetCPUInfo declaration to cpu.c 916548c2 Make kFuzzPxLimit sanitizer dependent 4070b271 advanced_api_fuzzer: reduce scaling limit 761f49c3 Merge "webp-lossless-bitstream-spec: add missing bits to ABNF" into main 84d04c48 webp-lossless-bitstream-spec: add missing bits to ABNF 0696e1a7 advanced_api_fuzzer: reduce scaling limit 93d88aa2 Merge "deps.cmake: remove unneeded header checks" into main 118e0035 deps.cmake: remove unneeded header checks 4c3d7018 webp-lossless-bitstream-spec: condense normal-prefix-code a6a09b32 webp-lossless-bitstream-spec: fix 2 code typos 50ac4f7c Merge "cpu.h: enable NEON w/_M_ARM64EC" into main 4b7d7b4f Add contribution instructions 0afbd97b cpu.h: enable NEON w/_M_ARM64EC 349f4353 Merge changes Ibd89e56b,Ic57e7f84,I89096614 into main 8f7513b7 upsampling_neon.c: fix WEBP_SWAP_16BIT_CSP check cbf624b5 advanced_api_fuzzer: reduce scaling limit 89edfdd1 Skip slow scaling in libwebp advanced_api_fuzzer 859f19f7 Reduce libwebp advanced_api_fuzzer threshold a4f04835 Merge changes Ic389aaa2,I329ccd79 into main 1275fac8 Makefile.vc: fix img2webp link w/dynamic cfg 2fe27bb9 img2webp: normalize help output 24bed3d9 cwebp: reflow -near_lossless help text 0825faa4 img2webp: add -sharp_yuv/-near_lossless d64e6d7d Merge "PaletteSortModifiedZeng: fix leak on error" into main 0e12a22d Merge "EncodeAlphaInternal: clear result->bw on error" into main 0edbb6ea PaletteSortModifiedZeng: fix leak on error 41ffe04e Merge "Update yapf style from "chromium" to "yapf"" into main 2d9d9265 Update yapf style from "chromium" to "yapf" a486d800 EncodeAlphaInternal: clear result->bw on error 1347a32d Skip big scaled advanced_api_fuzzer 52b6f067 Fix scaling limit in advanced_api_fuzzer.c 73618428 Limit scaling in libwebp advanced_api_fuzzer.c b54d21a0 Merge "CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty" into main 31c28db5 libwebp{,demux,mux}.pc.in: Requires -> Requires.private d9a505ff CMakeLists.txt: allow CMAKE_INSTALL_RPATH to be set empty bdf33d03 Merge tag 'v1.3.0' b5577769 update ChangeLog (tag: v1.3.0-rc1, tag: v1.3.0) 0ba77244 update NEWS e763eb1e bump version to 1.3.0 2a8686fc update AUTHORS 106a57c1 Merge "*/Android.mk: add a check for NDK_ROOT" into main c5e841c4 Merge "extras: WebpToSDL -> WebPToSDL" into main dbc30715 Merge "xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION" into main 6fc1a9f9 */Android.mk: add a check for NDK_ROOT d3e151fc doc/api.md,webp_js/README.md: Webp -> WebP ed92a626 extras: WebpToSDL -> WebPToSDL 6eb0189b xcframeworkbuild.sh: bump MACOSX_CATALYST_MIN_VERSION 1d58575b CMake: align .pc variables with autoconf e5fe2cfc webp-lossless-bitstream-spec,cosmetics: reflow paragraphs 0ceeeab9 webp-lossless-bitstream-spec: add amendment note 607611cd Merge "webp-container-spec: normalize section title case" into main f853685e lossless: SUBTRACT_GREEN -> SUBTRACT_GREEN_TRANSFORM 786497e4 webp-lossless-bitstream-spec: fix inv color txfm description c6ac672d webp-lossless-bitstream-spec: fix num_code_lengths check b5700efb webp-lossless-bitstream-spec,cosmetics: grammar/capitalization d8ed8c11 webp-container-spec: normalize section title case 52ec0b8f Merge changes Ie975dbb5,Ifc8c93af,I6ca7c5d6,I2e8d66f5,I152477b8 into main 5097ef62 webp-container-spec,cosmetics: grammar/capitalization e3ba2b1f webp-lossless-bitstream-spec,cosmetics: reflow abstract 1e8e3ded webp-lossless-bitstream-spec: reword abstract re alpha 017cb6fa webp-container-spec,cosmetics: normalize range syntax f6a4684b webp-lossless-bitstream-spec,cosmetics: normalize range syntax 54ebd5a3 webp-lossless-bitstream-spec: limit dist map lut to 69 cols 44741f9c webp-lossless-bitstream-spec: fix dist mapping example fad0ece7 pnmdec.c: use snprintf instead of sprintf 3f73e8f7 sharpyuv: add SharpYuvGetVersion() ce2f2d66 SharpYuvConvert: fix a race on SharpYuvGetCPUInfo a458e308 sharpyuv_dsp.h: restore sharpyuv_cpu.h include 9ba800a7 Merge changes Id72fbf3b,Ic59d23a2 into main 979c0ebb sharpyuv: add SharpYuvGetCPUInfo 8bab09a4 Merge "*.pc.in: rename lib_prefix to webp_libname_prefix" into main 769387c5 cpu.c,cosmetics: fix a typo a02978c2 sharpyuv/Makefile.am+cmake: add missing -lm 28aedcb9 *.pc.in: rename lib_prefix to webp_libname_prefix c42e6d5a configure.ac: export an empty lib_prefix variable dfc843aa Merge "*.pc.in: add lib prefix to lib names w/MSVC" into main 2498209b *.pc.in: add lib prefix to lib names w/MSVC ac252b61 Merge "analysis_enc.c: fix a dead store warning" into main 56944762 analysis_enc.c: fix a dead store warning d34f9b99 Merge "webp-lossless-bitstream-spec: convert BNF to ABNF" into main dc05b4db Merge changes I96bc063c,I45880467,If9e18e5a,I6ee938e4,I0a410b28, ... into main 83270c7f webp-container-spec: add prose for rendering process 73b19b64 webp-container-spec: note reserved fields MUST be ignored 57101d3f webp-lossless-bitstream-spec: improve 'small' color table stmt dfd32e45 webp-container-spec: remove redundant sentence 8a6185dd doc/webp-*: fix some punctuation, grammar 72776530 webp-lossless-bitstream-spec: convert BNF to ABNF d992bb08 cmake: rename cpufeatures target to cpufeatures-webp 3ed2b275 webp-container-spec: clarify background color note 951c292d webp-container-spec: come too late -> out of order 902dd787 webp-container-spec: prefer hex literals a8f6b5ee webp-container-spec: change SHOULD to MUST w/ANIM chunk 1dc59435 webp-container-spec: add unknown fields MUST be ignored 280a810f webp-container-spec: make padding byte=0 a MUST 41f0bf68 webp-container-spec: update note on trailing data 6bdd36db webp-container-spec: clarify Chunk Size is in bytes 87e36c48 Merge "webp_js/README.md,cosmetics: reflow some lines" into main 5b01f321 Merge "Update Windows makefile to build libsharpyuv library." into main 19b1a71c webp_js/README.md,cosmetics: reflow some lines 780db756 Update Windows makefile to build libsharpyuv library. e407d4b3 CMakeLists.txt: replace GLUT_glut_LIBRARY w/GLUT::GLUT abf73d62 Merge "WebPConfig.cmake.in: add find_dependency(Threads)" into main 25807fb4 Merge "cmake: restore compatibility with cmake < 3.12" into main 5dbc4bfa WebPConfig.cmake.in: add find_dependency(Threads) b2a175dd Merge "Update wasm instructions." into main cb90f76b Update wasm instructions. 02d15258 cmake: restore compatibility with cmake < 3.12 5ba046e2 CMake: add_definitions -> add_compile_options e68765af dsp,neon: use vaddv in a few more places e8f83de2 Set libsharpyuv include dir to 'webp' subdirectory. 15a91ab1 cmake,cosmetics: apply cmake-format 0dd49d1a CMakeLists.txt: set @ONLY in configure_file() calls 62b1bfe8 Merge changes I2877e7bb,I777cad70,I15af7d1a,I686e6740,If10538a9, ... into main 95c8fe5f Merge changes Iecea3603,I9dc228ab into main e7c805cf picture_csp_enc.c: remove SafeInitSharpYuv 6af8845a sharpyuv: prefer webp/types.h 639619ce cmake: fix dll exports 782ed48c sharpyuv,SharpYuvInit: add mutex protection when available cad0d5ad sharyuv_{neon,sse2}.c: merge WEBP_USE_* sections ef70ee06 add a few missing includes for NULL f0f9eda4 sharpyuv.h: remove 9b902cba Merge "picture_csp_enc.c,CheckNonOpaque: rm unneeded local" into main 9c1d457c cmake/cpu.cmake: remove unused variable 9ac25bcb CMakeLists.txt,win32: match naming convention used by nmake 76c353ba picture_csp_enc.c,CheckNonOpaque: rm unneeded local 5000de54 Merge "cwebp: fix WebPPictureHasTransparency call" into main e1729309 Merge "WebPPictureHasTransparency: add missing pointer check" into main 00ff988a vp8l_enc,AddSingleSubGreen: clear int sanitizer warnings e2fecc22 dsp/lossless_enc.c: clear int sanitizer warnings 129cf9e9 dsp/lossless.c: clear int sanitizer warnings ad7d1753 dsp/lossless_enc.c: clear int sanitizer warnings 5037220e VP8LSubtractGreenFromBlueAndRed_C: clear int sanitizer warnings 2ee786c7 upsampling_sse2.c: clear int sanitizer warnings 4cc157d4 ParseOptionalChunks: clear int sanitizer warning 892cf033 BuildHuffmanTable: clear int sanitizer warning 3a9a4d45 VP8GetSigned: clear int sanitizer warnings 704a3d0a dsp/lossless.c: quiet int sanitizer warnings 1a6c109c WebPPictureHasTransparency: add missing pointer check c626e7d5 cwebp: fix WebPPictureHasTransparency call 866e349c Merge tag 'v1.2.4' c170df38 Merge "Create libsharpyuv.a in makefile.unix." into main 9d7ff74a Create libsharpyuv.a in makefile.unix. 0d1f1254 update ChangeLog (tag: v1.2.4) fcbc2d78 Merge "doc/*.txt: restrict code to 69 columns" into main 4ad0e189 Merge "webp-container-spec.txt: normalize fourcc spelling" into main 980d2488 update NEWS 9fde8127 bump version to 1.2.4 7a0a9935 doc/*.txt: restrict code to 69 columns c040a615 webp-container-spec.txt: normalize fourcc spelling aff1c546 dsp,x86: normalize types w/_mm_cvtsi128_si32 calls ab540ae0 dsp,x86: normalize types w/_mm_cvtsi32_si128 calls 8980362e dsp,x86: normalize types w/_mm_set* calls (2) e626925c lossless: fix crunch mode w/WEBP_REDUCE_SIZE 83539239 dsp,x86: normalize types w/_mm_set* calls 8a4576ce webp-container-spec.txt: replace & with & db870881 Merge "webp-container-spec.txt: make reserved 0 values a MUST" into main 01d7d378 webp-lossless-bitstream-spec: number all sections 337cf69f webp-lossless-bitstream-spec: mv Nomenclature after Intro 79be856e Merge changes I7111d1f7,I872cd62c into main 5b87983a webp-container-spec.txt: make reserved 0 values a MUST bd939123 Merge changes I7a25b1a6,I51b2c2a0,I87d0cbcf,I6ec60af6,I0a3fe9dc into main 04764b56 libwebp.pc: add libsharpyuv to requires 7deee810 libsharpyuv: add pkg-config file 1a64a7e6 webp-container-spec.txt: clarify some SHOULDs bec2c88a webp-container-spec.txt: move ChunkHeader to terminology c9359332 webp-container-spec.txt: clarify 'VP8 '/'XMP ' fourccs 70fe3063 webp-container-spec.txt: rightsize table entries ddbf3f3f webp-container-spec.txt: update 'key words' text c151e95b utils.h,WEBP_ALIGN: make bitmask unsigned 748e92bb add WebPInt32ToMem 3fe15b67 Merge "Build libsharpyuv as a full installable library." into main 4f402f34 add WebPMemToInt32 a3b68c19 Build libsharpyuv as a full installable library. b4994eaa CMake: set rpath for shared objects 94cd7117 Merge "CMake: fix dylib versioning" into main e91451b6 Fix the lossless specs a bit more. 231bdfb7 CMake: fix dylib versioning bfad7ab5 CMakeLists.txt: correct libwebpmux name in WebPConfig.cmake c2e3fd30 Revert "cmake: fix webpmux lib name for cmake linking" 7366f7f3 Merge "lossless: fix crunch mode w/WEBP_REDUCE_SIZE" into main 84163d9d lossless: fix crunch mode w/WEBP_REDUCE_SIZE d01c1eb3 webp-lossless-bitstream-spec,cosmetics: normalize capitalization 8813ca8e Merge tag 'v1.2.3' 3c4a0fbf update ChangeLog (tag: v1.2.3) 56a480e8 dsp/cpu.h: add missing extern "C" 62b45bdd update ChangeLog (tag: v1.2.3-rc1) 8764ec7a Merge changes Idb037953,Id582e395 into 1.2.3 bcb872c3 vwebp: fix file name display in windows unicode build 67c44ac5 webpmux: fix -frame option in windows unicode build 8278825a makefile.unix: add sharpyuv objects to clean target 14a49e01 update NEWS 34b1dc33 bump version to 1.2.3 0b397fda update AUTHORS c16488ac update .mailmap 5a2d929c Merge "unicode.h: set console mode before using wprintf" into main 169f867f unicode.h: set console mode before using wprintf a94b855c Merge "libsharpyuv: add version defines" into main f83bdb52 libsharpyuv: add version defines bef0d797 unicode_gif.h: fix -Wdeclaration-after-statement 404c1622 Rename Huffman coding to prefix coding in the bitstream spec 8895f8a3 Merge "run_static_analysis.sh: fix scan-build archive path" into main 92a673d2 Merge "Add -fvisibility=hidden flag in CMakeLists." into main 67c1d722 Merge "add WEBP_MSAN" into main 1124ff66 Add -fvisibility=hidden flag in CMakeLists. e15b3560 add WEBP_MSAN ec9e782a sharpyuv: remove minimum image size from sharpyuv library 7bd07f3b run_static_analysis.sh: fix scan-build archive path 5ecee06f Merge "sharpyuv: increase precision of gamma<->linear conversion" into main f81dd7d6 Merge changes I3d17d529,I53026880,I1bd61639,I6bd4b25d,Icfec8fba into main 2d607ee6 sharpyuv: increase precision of gamma<->linear conversion 266cbbc5 sharpyuv: add 32bit version of SharpYuvFilterRow. 9fc12274 CMake: add src to webpinfo includes 7d18f40a CMake: add WEBP_BUILD_WEBPINFO to list of checks for exampleutil 11309aa5 CMake: add WEBP_BUILD_WEBPMUX to list of checks for exampleutil 4bc762f7 CMake: link imageioutil to exampleutil after defined 0d1b9bc4 WEBP_DEP_LIBRARIES: use Threads::Threads 20ef48f0 Merge "sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv." into main 93c54371 sharpyuv: add support for 10/12/16 bit rgb and 10/12 bit yuv. 53cf2b49 normalize WebPValidatePicture declaration w/definition d3006f4b sharpyuv: slightly improve precision ea967098 Merge changes Ia01bd397,Ibf3771af into main 11bc8410 Merge changes I2d317c4b,I9e77f6db into main 30453ea4 Add an internal WebPValidatePicture. 6c43219a Some renamings for consistency. 4f59fa73 update .mailmap e74f8a62 webp-lossless-bitstream-spec,cosmetics: normalize range syntax 5a709ec0 webp-lossless-bitstream-spec,cosmetics: fix code typo a2093acc webp-lossless-bitstream-spec: add amendment note 86c66930 webp-lossless-bitstream-spec: fix BNF 232f22da webp-lossless-bitstream-spec: fix 'simple code' snippet 44dd765d webp-lossless-bitstream-spec: fix ColorTransform impl 7a7e33e9 webp-lossless-bitstream-spec: fix TR-pixel right border note 86f94ee0 Update lossless spec with Huffman codes. a3927cc8 sharpyuv.c,cosmetics: fix indent 6c45cef7 Make sure the stride has a minimum value in the importer. 0c8b0e67 sharpyuv: cleanup/cosmetic changes dc3841e0 {histogram,predictor}_enc: quiet int -> float warnings a19a25bb Replace doubles by floats in lossless misc cost estimations. 42888f6c Add an option to enable static builds. 7efcf3cc Merge "Fix typo in color constants: Marix -> Matrix" into main 8f4b5c62 Fix typo in color constants: Marix -> Matrix 90084d84 Merge "demux,IsValidExtendedFormat: remove unused variable" into main ed643f61 Merge changes I452d2485,Ic6d75475 into main 8fa053d1 Rename SharpYUV to SharpYuv for consistency. 99a87562 SharpYuvComputeConversionMatrix: quiet int->float warnings deb426be Makefile.vc: add sharpyuv_csp.obj to SHARPYUV_OBJS 779597d4 demux,IsValidExtendedFormat: remove unused variable 40e8aa57 Merge "libsharpyuv: add colorspace utilities" into main 01a05de1 libsharpyuv: add colorspace utilities 2de4b05a Merge changes Id9890a60,I376d81e6,I1c958838 into main b8bca81f Merge "configure.ac: use LT_INIT if available" into main e8e77b9c Merge changes I479bc487,I39864691,I5d486c2c,I186d13be into main 7e7d5d50 Merge ".gitignore: add Android Studio & VS code dirs" into main 10c50848 normalize label indent 89f774e6 mux{edit,internal}: fix leaks on error 2d3293ad ExUtilInitCommandLineArguments: fix leak on error ec34fd70 anim_util: fix leaks on error e4717287 gif2webp: fix segfault on OOM e3cfafaf GetBackwardReferences: fail on alloc error a828a59b BackwardReferencesHashChainDistanceOnly: fix segfault on OOM fe153fae VP8LEncodeStream: fix segfault on OOM 919acc0e .gitignore: add Android Studio & VS code dirs efa0731b configure.ac: use LT_INIT if available 0957fd69 tiffdec: add grayscale support e685feef Merge "Make libsharpyuv self-contained by removing dependency on cpu.c" into main 841960b6 Make libsharpyuv self-contained by removing dependency on cpu.c 617cf036 image_dec: add WebPGetEnabledInputFileFormats() 7a68afaa Let SharpArgbToYuv caller pass in an RGB>YUV conversion matrix. 34bb332c man/cwebp.1: add note about crop/resize order f0e9351c webp-lossless-bitstream-spec,cosmetics: fix some typos 5ccbd6ed vp8l_dec.c,cosmetics: fix a few typos c3d0c2d7 fix ios build scripts after sharpyuv dep added d0d2292e Merge "Make libwebp depend on libsharpyuv." into main 03d12190 alpha_processing_neon.c: fix 0x01... typo d55d447c Make libwebp depend on libsharpyuv. e4cbcdd2 Fix lossless encoding for MIPS. 924e7ca6 alpha_processing_neon.c: fix Dispatch/ExtractAlpha_NEON 0fa0ea54 Makefile.vc: use /MANIFEST:EMBED 29cc95ce Basic version of libsharpyuv in libwebp, in C. a30f2190 examples/webpmux.c: fix a couple of typos 66b3ce23 Fix bad overflow check in ReadTIFF() 54e61a38 Markdownify libwebp docs and reorganize them. b4533deb CMakeLists.txt,cosmetics: break long line b9d2f9cd quant_enc.c: use WEBP_RESTRICT qualifier ec178f2c Add progress hook granularity in lossless 26139c73 Rename MAX_COST to MAX_BIT_COST in histogram_enc.c 13b82816 cmake: fix webpmux lib name for cmake linking 88b6a396 webp-container-spec.txt,cosmetics: normalize formatting 6f496540 Merge tag 'v1.2.2' 4074acf8 dsp.h: bump msvc arm64 version requirement to 16.6 b0a86089 update ChangeLog (tag: v1.2.2) 6db8248c libwebp: Fix VP8EncTokenLoop() progress 827a307f BMP enc: fix the transparency case db25f1b4 libwebp: Fix VP8EncTokenLoop() progress 286e7fce libwebp: do not destroy jpeg codec twice on error 6e8a4126 libwebp: do not destroy jpeg codec twice on error faf21968 Merge "BMP enc: fix the transparency case" into main 480cd51d BMP enc: fix the transparency case 9195ea05 update ChangeLog (tag: v1.2.2-rc2) 4acae017 update NEWS 883f0633 man/img2webp.1: update date 567e1f44 Reword img2webp synopsis command line 1b0c15db man/img2webp.1: update date 17bade38 Merge "Reword img2webp synopsis command line" into main a80954a1 Reword img2webp synopsis command line f084244d anim_decode: fix alpha blending with big-endian b217b4ff webpinfo: fix fourcc comparison w/big-endian ec497b75 Merge "anim_decode: fix alpha blending with big-endian" into main e4886716 anim_decode: fix alpha blending with big-endian e3cb052c webpinfo: fix fourcc comparison w/big-endian a510fedb patch-check: detect duplicated files f035d2e4 update ChangeLog (tag: v1.2.2-rc1) 7031946a update NEWS 973390b6 bump version to 1.2.2 abd6664f update AUTHORS 5b7e7930 Merge "add missing USE_{MSA,NEON} checks in headers" into main 02ca04c3 add missing USE_{MSA,NEON} checks in headers e94716e2 xcframeworkbuild.sh: place headers in a subdir c846efd8 patch-check: commit subject length check b6f756e8 update http links 8f5cb4c1 update rfc links 8ea81561 change VP8LPredictorFunc signature to avoid reading 'left' 6b1d18c3 webpmux: fix the -bgcolor description 3368d876 Merge "webpmux: add "-set bgcolor A,R,G,B"" into main f213abf6 webpinfo: print the number of warnings 50c97c30 webpmux: add "-set bgcolor A,R,G,B" 2c206aaf Remove CMakeLists.txt check in compile.sh 96e3dfef Merge "infra/common.sh: add shard_should_run()" into main 0e0f74b7 infra/common.sh: add shard_should_run() 35b7436a Jenkins scripts port: update shell function comments 21d24b4c webp-container-spec.txt: remove 'experimental' markers cdcf8902 Merge "Port Jenkins script: compile" into main dc683cde Jenkins scripts port: static analysis 0858494e Port Jenkins script: compile c2cf6a93 Jenkins scripts port: android compilation df0e808f presubmit: Add pylint-2.7 and .pylintrc 676c57db patch-check: shfmt 7bb7f747 patch-check: Add shellcheck abcd1797 Reformat docstrings and imports edaf0895 Port Jenkins scripts: compile js b9622063 Set CheckPatchFormatted flags to fail on diffs e23cd548 dsp.h: enable NEON w/VS2019+ ARM64 targets 3875c7de CMakeLists.txt: set minimum version to 3.7 1a8f0d45 Have a hard-coded value for memset in TrellisQuantizeBlock. 93480160 Speed up TrellisQuantizeBlock 45eaacc9 Convert deprecated uint32 to uint32_t. 42592af8 webp,cmake: Remove unnecessary include dirs e298e05f Add patch-check steps in PRESUBMIT.py 29148919 Merge tag 'v1.2.1' 9ce5843d update ChangeLog (tag: v1.2.1) d9191588 fuzzer/*: normalize src/ includes c5bc3624 fuzzer/*: normalize src/ includes 53b6f762 fix indent d2caaba4 fix indent 731246ba update ChangeLog (tag: v1.2.1-rc2) d250f01d dsp/*: use WEBP_HAVE_* to determine Init availability 1fe31625 dsp/*: use WEBP_HAVE_* to determine Init availability 3a4d3ecd update NEWS b2bc8093 bump version to 1.2.1 e542fc7a update AUTHORS e0241154 Merge "libwebp/CMake: Add to webp incl" into main edea6444 libwebp/CMake: Add to webp incl ece18e55 dsp.h: respect --disable-sse2/sse4.1/neon a89a3230 wicdec: support alpha from WebP WIC decoder 26f4aa01 Merge "alpha_processing: fix visual studio warnings" into main 8f594663 alpha_processing: fix visual studio warnings 46d844e6 Merge "cpu.cmake: fix compiler flag detection w/3.17.0+" into main 298d26ea Merge changes I593adf92,If20675e7,Ifac68eac into main a1e5dae0 alpha_processing*: use WEBP_RESTRICT qualifier 327ef24f cpu.cmake: fix compiler flag detection w/3.17.0+ f70819de configure: enable libwebpmux by default dc7e2b42 configure: add informational notices when disabling binaries 9df23ddd configure: move lib flag checks before binaries a2e18f10 Merge "WebPConfig.config.in: correct WEBP_INCLUDE_DIRS" into main e1a8d4f3 Merge "bit_reader_inl_utils: uniformly apply WEBP_RESTRICT" into main 4de35f43 rescaler.c: fix alignment 0f13eec7 bit_reader_inl_utils: uniformly apply WEBP_RESTRICT 277d3074 Fix size_t overflow in WebPRescalerInit 97adbba5 WebPConfig.config.in: correct WEBP_INCLUDE_DIRS b60d4603 advanced_api_fuzzer: add extreme config value coverage 72fe52f6 anim_encode.c,cosmetics: normalize indent 116d235c anim_encode: Fix encoded_frames_[] overflow 6f445b3e CMake: set CMP0072 to NEW b1cf887f define WEBP_RESTRICT for MSVC 3e265136 Add WEBP_RESTRICT & use it in VP8BitReader f6d29247 vp8l_dec::ProcessRows: fix int overflow in multiply de3b4ba8 CMake: add WEBP_BUILD_LIBWEBPMUX 7f09d3d1 CMakeLists.txt: rm libwebpmux dep from anim_{diff,dump} 4edea4a6 Init{RGB,YUV}Rescaler: fix a few more int overflows c9e26bdb rescaler_utils: set max valid scaled w/h to INT_MAX/2 28d488e6 utils.h: add SizeOverflow() 695bdaa2 Export/EmitRescaledRowsRGBA: fix pointer offset int overflow 685d073e Init{RGB,YUV}Rescaler: fix int overflows in multiplication d38bd0dd WebPFlipBuffer: fix integer overflow 109ff0f1 utils: allow MALLOC_LIMIT to indicate a max a2fce867 WebPRescalerImportRowExpand_C: promote some vals before multiply 776983d4 AllocateBuffer: fix int multiplication overflow check 315abbd6 Merge "Revert "Do not use a palette for one color images."" eae815d0 Merge changes Ica3bbf75,I82f82954 afbca5a1 Require Emscripten 2.0.18 3320416b CMakeLists,emscripten: use EXPORTED_RUNTIME_METHODS 29145ed6 Update README instructions for using Emscripten 1f579139 cosmetics: remove use of 'sanity' / 'master' 29b6129c WebPAnimEncoderNewInternal: remove some unnecessary inits b60869a1 Revert "Do not use a palette for one color images." 6fb4cddc demux: move padded size calc post unpadded validation 05b72d42 vp8l_enc.c: normalize index types b6513fba Do not use a palette for one color images. 98bbe35b Fix multi-threading with palettes. b1674240 Add modified Zeng's method to palette sorting. 88c90c45 add CONTRIBUTING.md 6a9916d7 WebPRescalerInit: add missing int64_t promotion b6cf52d5 WebPIoInitFromOptions: treat use_scaling as a bool 3b12b7f4 WebPIoInitFromOptions: treat use_cropping as a bool 595fa13f add WebPCheckCropDimensions() 8fdaecb0 Disable cross-color when palette is used. 8933bac2 WebPIoInitFromOptions: respect incoming bypass_filtering val 7d416ff0 webpdec,cosmetics: match error text to function call ec6cfeb5 Fix typo on WebPPictureAlloc() in README 7e58a1a2 *.cmake: add license header 5651a6b2 cmake: fix .so versioning 25ae67b3 xcframeworkbuild.sh: add arm64 simulator target 5d4ee4c3 cosmetics: remove use of the term 'dummy' 01b38ee1 faster CollectColorXXXTransforms_SSE41 652aa344 Merge "Use BitCtz for FastSLog2Slow_C" 0320e1e3 add the missing default BitsCtz() code 8886f620 Use BitCtz for FastSLog2Slow_C fae41617 faster CombinedShannonEntropy_SSE2 5bd2704e Introduce the BitCtz() function. fee64287 Merge "wicdec,icc: treat unsupported op as non-fatal" 33ddb894 lossless_sse{2,41}: remove some unneeded includes b27ea852 wicdec,icc: treat unsupported op as non-fatal b78494a9 Merge "Fix undefined signed shift." e79974cd Fix undefined signed shift. a8853394 SSE4.1 versions of BGRA to RGB/BGR color-space conversions a09a6472 SSE4.1 version of TransformColorInverse 401da22b Merge "pngdec: check version before using png_get_chunk_malloc_max" 26907822 pngdec: check version before using png_get_chunk_malloc_max 06c1e72e Code cleanup 8f0d41aa Merge changes Id135bbf4,I99e59797 373eb170 gif2webp: don't store loop-count if there's only 1 frame 759b9d5a cmake: add WEBP_USE_THREAD option 926ce921 cmake: don't install binaries from extras/ 9c367bc6 WebPAnimDecoderNewInternal: validate bitstream before alloc 47f64f6e filters_sse2: import Chromium change cc3577e9 fuzzer/*: use src/ based include paths 004d77ff Merge tag 'v1.2.0' fedac6cc update ChangeLog (tag: v1.2.0-rc3, tag: v1.2.0) 170a8712 Fix check_c_source_compiles with pthread. ceddb5fc Fix check_c_source_compiles with pthread. 85995719 disable CombinedShannonEntropy_SSE2 on x86 289757fe TiffDec: enforce stricter mem/dimension limit on tiles 8af7436f Merge "{ios,xcframework}build.sh: make min version(s) more visible" into 1.2.0 e56c3c5b pngdec: raise memory limit if needed 8696147d pngdec: raise memory limit if needed 13b8e9fe {ios,xcframework}build.sh: make min version(s) more visible a9225410 animdecoder_fuzzer: fix memory leak d6c2285d update gradle to 6.1.1 8df77fb1 animdecoder_fuzzer: fix memory leak 52ce6333 update NEWS 28c49820 bump version to 1.2.0 7363dff2 webp/encode.h: restore WEBP_ENCODER_ABI_VERSION to v1.1.0 826aafa5 update AUTHORS 63258823 animdecoder_fuzzer: validate canvas size 9eb26381 CMake: remove duplicate "include(GNUInstallDirs)" 2e7bed79 WebPPicture: clarify the ownership of user-owned data. cccf5e33 webpmux: add an '-set loop ' option c9a3f6a1 Merge changes Ie29f9867,I289c54c4 319f56f1 iosbuild.sh: sync some aspects of xcframeworkbuild.sh e8e8db98 add xcframeworkbuild.sh ae545534 dsp.h: allow config.h to override MSVC SIMD autodetection fef789f3 Merge "cmake: fix per-file assembly flags" fc14fc03 Have C encoding predictors use decoding predictors. 7656f0b3 README,cosmetics: fix a couple typos d2e245ea cmake: disable webp.js if WEBP_ENABLE_SIMD=1 96099a79 cmake: fix per-file assembly flags 5abb5582 Merge "cmake: fix compilation w/Xcode generator" 8484a120 cmake: fix compilation w/Xcode generator d7bf01c9 Merge changes Ifcae0f38,Iee2d7401 36c81ff6 WASM-SIMD: port 2 patches from rreverser@'s tree 988b02ab Merge "Couple of fixes to allow SIMD on Emscripten" 26faf770 wicdec: fail with animated images ab2d08a8 [cd]webp: document lack of animated webp support 52273943 Couple of fixes to allow SIMD on Emscripten 8870ba7f Fix skia bug #10952 4b3c6953 Detect if StoreFrame read more than anmf_payload_size bytes 17fd4ba8 webp/decode.h,cosmetics: normalize 'flip' comment 411d3677 remove some unreachable break statements 3700ffd7 WebPPictureHasTransparency: remove unreachable return 83604bf3 {animencoder,enc_dec}_fuzzer: convert some abort()s to returns eb44119c Merge changes I8ae09473,I678c8b1e 9f6055fc fuzz_utils.h: rename max() to Max() 695788e7 fuzz_utils.h: make functions WEBP_INLINE 906c1fcd make ImgIoUtilReadFile use WebPMalloc instead of malloc 8cb7e536 rename demux_api_fuzzer.c -> mux_demux_api_fuzzer.c 443db47d add animdecoder_fuzzer.cc 36a6eea3 Merge "import fuzzers from oss-fuzz/chromium" ec5f12c1 Makefile.vc: remove deprecated /Gm option 64425a08 picture_tools_enc: fix windows build warning bd94090a import fuzzers from oss-fuzz/chromium cf847cba use WEBP_DSP_INIT_FUNC for Init{GammaTables*,GetCoeffs} 55a080e5 Add WebPReplaceTransparentPixels() in dsp 84739717 GetBackgroundColorGIF: promote to uint32_t before << 24 def64e92 cwebp: Fix -print_psnr for near_lossless cf2f88b3 Add palette and spatial for q >= 75 and -m 5 f0110bae Add no-color cache configuration to the cruncher 749a8b99 Better estimate of the cache cost. 4f9f00cc Use spatial predictors on top of palette no matter what. 7658c686 Add spatial prediction on top of palette in cruncher. 133ff0e3 webp_js: force WASM=0 option explicitly e3c259a2 Fix integer overflow in EmitFancyRGB. b3ff0bde man/{gif2,img2}webp,webpmux: normalize some wording f9b30586 fix ABI breakage introduced by 6a0ff358 1d58dcfc README.webp_js: update note about emscripten version 44070266 README.webp_js: s/fastcomp/upstream/ 2565fa8f README.webp_js: update cmake command 47309ef5 webp: WEBP_OFFSET_PTR() 687ab00e DC{4,8,16}_NEON: replace vmovl w/vaddl 1b92fe75 DC16_NEON,aarch64: use vaddlv 53f3d8cf dec_neon,DC8_NEON: use vaddlv instead of movl+vaddv 27d08240 Fix integer overflow in WebPAnimDecoderGetNext() 69776e38 Merge "remove call to MBAnalyzeBestIntra4Mode for method >= 5" a99078c1 remove call to MBAnalyzeBestIntra4Mode for method >= 5 22e404cc CMakeLists.txt: fix set(CACHE) argument order 71690b52 fix MSVC warning 6a0ff358 Enc: add a qmin / qmax range for quality factor 0fa56f30 Merge tag 'v1.1.0' 6cf504d0 PNM decoding: handle max_value != 255 d7844e97 update ChangeLog (tag: v1.1.0-rc2, tag: v1.1.0) 7f006436 Makefile.vc: fix webp_quality.exe link cf047e83 Makefile.vc: fix webp_quality.exe link c074c653 update NEWS 30f09551 bump version to 1.1.0 a76694a1 update AUTHORS 6e3ef7b3 extras: fix WEBP_SWAP_16BIT_CSP check 47178dbd extras: add WebPUnmultiplyARGB() convenience function 22cbae33 idec_dec: fix 0 offset of NULL pointer 290dd0b4 muxread: fix 0 offset of NULL pointer 0df474ac Merge "lossless_(enc_|)sse2: avoid offsetting a NULL pointer" c6b75a19 lossless_(enc_|)sse2: avoid offsetting a NULL pointer 295e5e38 fix UBSAN warning e2575e05 DC8_NEON,aarch64: use vaddv b0e09e34 dec_neon: Fix build failure under some toolchains cf0e903c dsp/lossless: Fix non gcc ARM builds bb7bc40b Remove ubsan errors. 78881b76 CMake: fix GLUT library link 9f750f7a cmake: fix BUILD_SHARED_LIBS build on mac 17850e74 libwebp: Remove char-subscripts warning in pnmdec.c 2fa2552d Merge "Expose WebPMalloc() in addition to WebPFree()" a4df4aae Expose WebPMalloc() in addition to WebPFree() 853ea3d8 imageio/tiff: Return error before allocating bad tile size af650c0b Fix a Wxor-used-as-pow false positive 601ef17c libwebp.py: update to swig 3.0.12 0e48d889 bugfix: last alpha rows were incorrectly decoded 24d2ccb4 webp: Fix imageio ReadPNM() TUPLTYPE fab8f9cf cosmetics: normalize '*' association 94138e0e update .gitignore 0fe1a89d update ChangeLog (tag: v1.0.3-rc1, tag: v1.0.3) 2ad0916d update NEWS 1287362b bump version to 1.0.3 7b968cc2 update AUTHORS 9d6988f4 Fix the oscillating prediction problem at low quality 312f74d0 makefile.unix: allow *_LIBS to be overridden w/EXTRA_LIBS 92dbf237 filters_sse2,cosmetics: shorten some long lines a277d197 filters_sse2.c: quiet integer sanitizer warnings 804540f1 Fix cpufeatures in CMake. bf00c15b Add CMake option for bittrace. a788b498 filters_sse2.c: quiet integer sanitizer warnings e6a92c5e filters.c: quiet integer sanitizer warnings ec1cc40a lossless.c: remove U32 -> S8 conversion warnings 1106478f remove conversion U32 -> S8 warnings 812a6b49 lossless_enc: fix some conversion warning 4627c1c9 lossless_enc,TransformColorBlue: quiet uint32_t conv warning c84673a6 lossless_enc_sse{2,41}: quiet signed conv warnings 776a7757 dec_sse2: quiet signed conv warnings bd39c063 Merge "thread_utils: release mutex before signaling" 0550576f Merge "(alpha_processing,enc}_sse2: quiet signed conv warnings" 6682f2c4 thread_utils: release mutex before signaling e78dea75 (alpha_processing,enc}_sse2: quiet signed conv warnings 9acf18ba iosbuild.sh: add WebP{Demux,Mux}.framework b9be7e65 vwebp: remove the -fit option (and make it default) 1394a2bb Merge "README.webp_js: update Emscripten.cmake note" dd3e7f8a README.webp_js: update Emscripten.cmake note 32cf8801 predictor_enc,GetBestGreenRedToBlue: quiet implicit conv warnings e1c8acb5 Merge "vwebp: add a -fit option" cbd23dd5 vwebp: add a -fit option 2e672351 bit_writer_utils,Flush: quiet implicit conversion warnings 1326988d swig: update libwebp_python_wrap.c 0e7f8548 update generated swig files 17ed1438 Merge "PutLE{16,24}: quiet implicit conversion warnings" 24686538 PutLE{16,24}: quiet implicit conversion warnings 153bb3a0 fix some clang-7 warnings: ab2dc893 Rescaler: fix rounding error aa65f89a HistogramCombineStochastic: fix free of uninit value af0bac64 Merge "encode.h: mention 'exact' default in WebPEncodeLossless*" 6d2e11ec encode.h: mention 'exact' default in WebPEncodeLossless* 8c3f04fe AndroidCPUInfo: reorder terms in conditional fcfd9c71 BitTrace: if BITTRACE is > 0, record and print syntax bits used 067031ea Speedups for unused Huffman groups. 01ac46ba libwebp: Display "libjpeg error:" in imageio/jpegdec d9a662e1 WebPRescalerGetScaledDimensions: round scaled dimension up 62eb3f08 libwebp: Fix missing '{' in README e05f785a Merge "unicode,INIT_WARGV: add missing cast" 63c9a69f tag the VP8LHashPix() function for potential uint roll-over 2b7214ab unicode,INIT_WARGV: add missing cast bf424b46 tag the GetPixPairHash64() function for potential uint roll-over 7d05d6ca Have the color cache computation be u32-bit only. 6bcf8769 Remove BINARYEN_METHOD in wasm settings. 2b98df90 update ChangeLog (tag: v1.0.2-rc1, tag: v1.0.2) 61e372b7 update NEWS 7ae658a0 bump version to 1.0.2 51c4907d update AUTHORS 666bd6c6 man/cwebp.1: refine near-lossless text 561cdce5 Clarify the doc about GetFeatures. aec2cf02 near_lossless: fix fuzzing-detected integer overflow 928a75de webp: Fix VP8LBitWriterClone() bug 5173d4ee neon IsFlat 5b081219 IsFlat: inline when possible 381b7b54 IsFlat: use int for thresh 6ed15ea1 fix unprobable leak in webp_sdl.c 22bbb24e Merge "IsFlat: return int" 8b3fb238 Merge tag 'v1.0.1' f435de95 IsFlat: return int 41521aed utils.h: only define WEBP_NEED_LOG_TABLE_8BIT when needed 9f4d4a3f neon: GetResidualCost 0fd7514b neon: SetResidualCoeffs f95a996c Simpler histogram clustering. e85d3313 update ChangeLog (tag: v1.0.1-rc2, tag: v1.0.1) fa8210e4 Fix pair update in stochastic entropy merging. fd198f73 add codereview.settings 825389ac README.mux: add a reference to the AnimDecoder API 3be698c3 CMake: fix webp_js compilation 485ff86f Fix pair update in stochastic entropy merging. 4cd0582d CMake: fix webp_js compilation 4cbb4caf update NEWS f5a5918d bump version to 1.0.1 d61385db Speed-up: Make sure we only initialize histograms when needed. 6752904b Speed-up: Make sure we only initialize histograms when needed. 0c570316 update AUTHORS 301a2dda img2webp: add help note about arguments from a file f0abab92 Speedups for empty histograms. f2dfd925 Split HistogramAdd to only have the high level logic in C. 06b7bc7d Fix compilation on windows and clang-cl+ninja. b6284d82 img2webp: add help note about arguments from a file decf6f6b Speedups for empty histograms. dea3e899 Split HistogramAdd to only have the high level logic in C. 632798ae Merge "Fix compilation on windows and clang-cl+ninja." dc1a9518 Merge "libwebp: Unicode command tools on Windows" 9cf9841b libwebp: Unicode command tools on Windows 98179495 remove some minor TODOs a376e7b9 Fix compilation on windows and clang-cl+ninja. cbf82cc0 Remove AVX2 files. 5030e902 Merge "TIFF decoder: remove unused KINV definition" ac543311 Remove a few more useless #defines 123d3306 TIFF decoder: remove unused KINV definition ef1094b0 Merge "- install pkg-config files during the CMake build" b911fbc9 libwebp: Remove duplicate GIFDisplayError in anim_util eee00b66 - install pkg-config files during the CMake build ac3ec8c9 Merge "Clean-up the common sources in dsp." 3e13da7b Clean-up the common sources in dsp. 5c395f1d libwebp: cmake-format all e7a69729 libwebp: Add extras targets in CMakeLists.txt e52485d6 libwebp: Rename macros in webpmux.c 92dc0f09 clean-up MakeInputImageCopy() 39952de2 VP8IteratorImport: add missing 'const' 382af7a2 clean-up WebPBlendAlpha 14d020f6 libwebp: Use ExUtilGet*() in anim_diff 0d92ff25 libwebp: remove useless variable in gif2webp 556cb1b4 Merge "CMake: Set WEBP_BUILD_GIF2WEBP to off" da26ee49 CMake: Set WEBP_BUILD_GIF2WEBP to off b2a867c0 cwebp: Don't premultiply during -resize if -exact 637141bc pngdec: fix build w/libpng < 1.4.x bc5092b1 pngdec: set memory functions 50d8345a Fix CMake math library. 6aa3e8aa Fix math library on Visual Studio. d71df4e2 Fix math library finding in CMake. de08d727 cosmetics: normalize include guard comment 009562b4 vwebp: Fix bug when Dispose then NoBlend frames 423f2579 Fix up CMake to create targets. 907208f9 Wait for all threads to be done in DecodeRemaining. 4649b3c4 vwebp: Add background color display option 78ad57a3 Fix bad glClearColor parameters da96d8d9 Allow for a non-initialized alpha decompressor in DoRemap. 2563db47 fix rescaling rounding inaccuracy 211f37ee fix endian problems in pattern copy 5f0f5c07 Make sure partition #0 is read before VP8 data in IDecode. de98732b fix GetColorf() bug 4338cd36 misc fixes in libwebpmux e00af13e fix signatures after a9ceda7ff1 a9ceda7f Speed-up chunk list operations. 2281bbf6 Merge "Better handling of bogus Huffman codes." 39cb9aad Better handling of bogus Huffman codes. 89cc9d37 Merge "fix read-overflow while parsing VP8X chunk" 95fd6507 fix read-overflow while parsing VP8X chunk 9e729fe1 Fix VP8IoTeardownHook being called twice on worker sync failure 29fb8562 Merge "muxread,anmf: fail on multiple image chunks" eb82ce76 muxread,anmf: fail on multiple image chunks 1344a2e9 fix alpha-filtering crash when image width is larger than radius be738c6d muxread,ChunkVerifyAndAssign: validate chunk_size 2c70ad76 muxread,CreateInternal: fix riff size checks 569001f1 Fix for thread race heap-use-after-free c56a02d9 Android.mk: use LOCAL_EXPORT_C_INCLUDES w/public libs 15795596 CMakeLists.txt,cosmetics: normalize if() formatting 1a44c233 Merge "cmake: add support for webpmux" e9569ad7 Merge "configure,*am,cosmetics: s/WANT_/BUILD_/" 35c7de6f cmake: add support for webpmux 0f25e61c WebpToSDL(): fix the return value in case of error 5d8985de configure,*am,cosmetics: s/WANT_/BUILD_/ 895fd28f Merge "man/Makefile.am: add img2webp.1" 5cf3e2af man/Makefile.am: add img2webp.1 2a9de5b9 Add build rules for anim_diff & anim_dump utils. 71ed73cf fix invalid check for buffer size af0e4fbb gif2webp: fix transcode of loop count=65535 dce5d764 Limit memory allocation when reading invalid Huffman codes. f9df0081 Merge "cmake: quiet glut deprecation warnings on OS X" dc39b16f webpmux.1: correct grammar c7aa1264 cwebp.c: fix a missing \n 53aa51e9 Merge tag 'v1.0.0' 698b8844 update ChangeLog (tag: v1.0.0) 8d510751 webp-container-spec: correct frame duration=0 note e6b2164e vwebp: Copy Chrome's behavior w/frame duration == 0 094b3b28 cmake: quiet glut deprecation warnings on OS X 71c39a06 webp-container-spec: correct frame duration=0 note fd3d5756 vwebp: Copy Chrome's behavior w/frame duration == 0 b0c966fb Build vwebp from CMake. d20b7707 update ChangeLog (tag: v1.0.0-rc3) 0d5fad46 add WEBP_DSP_INIT / WEBP_DSP_INIT_FUNC d77bf512 add WEBP_DSP_INIT / WEBP_DSP_INIT_FUNC c1cb86af fix 16b overflow in SSE2 e577feb7 makefile.unix: add DEBUG flag for compiling w/ debug-symbol 99be34b3 cwebp,get_disto: fix bpp output e122e511 cwebp,get_disto: fix bpp output f5565ca8 cmake: Make sure we use near-lossless by default. d898dc14 fix bug in WebPImport565: alpha value was not set 1c8f358d Fix CMake with WASM. a0215fb7 webp_js: fix webp_js demo html 882784b0 update ChangeLog (tag: v1.0.0-rc2) 2f930e08 Revert "Use proper targets for CMake." 8165e8fb Use proper targets for CMake. 3f157dd5 Remove some very hard TODOs. abb47760 Merge "Use proper targets for CMake." cd758a17 {de,}mux/Makefile.am: add missing headers e155dda0 Use proper targets for CMake. b892b8ba makefile.unix,dist: use ascii for text output 64a57d05 add -version option to anim_dump,anim_diff and img2webp 994be82d Merge "Remove some very hard TODOs." 4033e1d7 Remove some very hard TODOs. fc1b8e3a webp_js: fix webp_js demo html 15aa48d9 update ChangeLog (tag: v1.0.0-rc1) e607dabc update AUTHORS 38410c08 [CFI] Remove function pointer casts 978eec25 [CFI] Remove function pointer casts c57b2736 bump version to 1.0.0 cba28853 update NEWS c909d531 Merge "remove some deprecation warning on MacOSX" 217443c7 remove some deprecation warning on MacOSX b672bdfa configure: quiet glut deprecation warnings on OS X daa9fcaf configure: use sdl-config if available dd174cae Merge "imagedec: support metadata reading for WebP image decoding" 641cedcc imagedec: support metadata reading for WebP image decoding 065b2ce1 anim_diff: add a couple missing newlines in Help() c4cc1147 Merge "gif2webp: force low duration frames to 100ms" 09333097 gif2webp: force low duration frames to 100ms e03f0ec3 sharp_yuv: use 14b fixed-point precision for gamma b2db361c image_enc,WebPWritePNG: move locals after setjmp 74e82ec6 Merge "WebPPictureDistortion: fix big-endian results order" 645d04ca Merge "cwebp,get_disto: report bpp" 120f58c3 Merge "lossless*sse2: improve non-const 16-bit vector creation" a7fe9412 WebPPictureDistortion: fix big-endian results order e26fe066 cwebp,get_disto: report bpp 9df64e28 Merge changes Id5b4a1a4,Ia20ce844 8043504f lossless*sse2: improve non-const 16-bit vector creation 1e3dfc48 Import: extract condition from loop 3b07d327 Import,RGBA: fix for BigEndian import 551948e4 Remove unused argument in VP8LBitsEntropy. 3005237a ReadWebP: fix for big-endian 499c395a Merge "anim_diff: expose the -max_diff option" f69dcd69 Merge "remove WEBP_EXPERIMENTAL_FEATURES" 07d884d5 anim_diff: expose the -max_diff option f4dd9256 remove WEBP_EXPERIMENTAL_FEATURES 94a8377b extract the command-line parsing helpers to example_util fc09e6e2 PNM decoder: prevent unsupported depth=2 PAM case. 6de58603 MIPS64: Fix defined-but-not-used errors with WEBP_REDUCE_CSP cbde5728 gif2webp: add support for reading from stdin cf1c5054 Add an SSE4 version of some lossless color transforms. 45a8b5eb Fix lint error with man page. cff38e8f Merge "PNG decoder: handle gAMA chunk" 59cb1a48 Merge "enable dc error-diffusion always" 78318b30 PNG decoder: handle gAMA chunk 664c21dd Merge "remove some TODOs" 815652de enable dc error-diffusion always aec45cec remove some TODOs 5715dfce fix block-count[] increment in case of large image c2d04f3e enable DC error-diffusion always for multi-pass 96bf07c5 use DC error diffusion for U/V at low-quality 1c59020b fix missing sse41 targets in makefile.unix 7a8e814b cosmetics: s/color_space/colorspace/ 05f6fe24 upsampling: rm asserts w/REDUCE_CSP+OMIT_C_CODE b4cf5597 Merge "Upsampling SSE2/SSE4 speedup." ccbeb32c Makefile.vc: add missing sse41 files 55403a9a Upsampling SSE2/SSE4 speedup. 807b53c4 Implement the upsampling/yuv functions in SSE41 84101a81 Fix wasm WebP compilation 8bebd2a3 fix warning on MSVC a7f93fe3 webpmux: allow reading argument from a file b69f18a7 gif2webp.1: fix -loop_compatibility layout 72d530c0 Merge "fix lossless decoding w/WEBP_REDUCE_SIZE" 296c7dc4 fix lossless decoding w/WEBP_REDUCE_SIZE 0d5d029c Merge "ImgIoUtilReadFile: fix file leak upon error" ae568ce7 ImgIoUtilReadFile: fix file leak upon error 796b5a8a Merge tag 'v0.6.1' 6b7a95fd update ChangeLog (tag: v0.6.1) f66955de WEBP_REDUCE_CSP: restrict colorspace support 1af0df76 Merge "WEBP_REDUCE_CSP: restrict colorspace support" 6de20df0 WEBP_REDUCE_CSP: restrict colorspace support a289d8e7 update ChangeLog (tag: v0.6.1-rc2) c10a493c vwebp: disable double buffering on windows & mac 0d4466c2 webp_to_sdl.c: fix file mode 1b27bf8b WEBP_REDUCE_SIZE: disable all rescaler code 126be109 webpinfo: add -version option 0df22b9e WEBP_REDUCE_SIZE: disable all rescaler code 9add62b5 bump version to 0.6.1 d3e26144 update NEWS 2edda639 README: add webpinfo section 9ca568ef Merge "right-size some tables" 31f1995c Merge "SSE2 implementation of HasAlphaXXX" a80c46bd SSE2 implementation of HasAlphaXXX 083507f2 right-size some tables 2e5785b2 anim_utils.c: remove warning when !defined(WEBP_HAVE_GIF) b299c47e add WEBP_REDUCE_SIZE f593d71a enc: disable pic->stats/extra_info w/WEBP_DISABLE_STATS 541179a9 Merge "predictor_enc: fix build w/--disable-near-lossless" 5755a7ec predictor_enc: fix build w/--disable-near-lossless eab5bab7 add WEBP_DISABLE_STATS 8052c585 remove some petty TODOs from vwebp. c245343d move LOAD8x4 and STORE8x2 closer to their use location b9e734fd dec,cosmetics: normalize function naming style c188d546 dec: harmonize function suffixes 28c5ac81 dec_sse41: harmonize function suffixes e65b72a3 Merge "introduce WebPHasAlpha8b and WebPHasAlpha32b" b94cee98 dec_sse2: remove HE8uv_SSE2 44a0ee3f introduce WebPHasAlpha8b and WebPHasAlpha32b aebf59ac Merge "WebPPictureAllocARGB: align argb allocation" c184665e WebPPictureAllocARGB: align argb allocation 3daf7509 WebPParseHeaders: remove obsolete animation TODO 80285d97 cmake: avoid security warnings under msvc 650eac55 cmake: don't set -Wall with MSVC c462cd00 Remove useless code. 01a98217 Merge "remove WebPWorkerImpl declaration from the header" 3c49fc47 Merge "thread_utils: fix potentially bad call to Execute" fde2782e thread_utils: fix potentially bad call to Execute 2a270c1d remove WebPWorkerImpl declaration from the header f1f437cc remove mention of 'lossy-only parameters' from the doc 3879074d Merge "WebPMemToUint32: remove ptr cast to int" 04b029d2 WebPMemToUint32: remove ptr cast to int b7971d0e dsp: avoid defining _C functions w/NEON builds 6ba98764 webpdec: correct alloc size check w/use_argb 5cfb3b0f normalize include guards f433205e Merge changes Ia17c7dfc,I75423abb,Ia2f716b4,I161caa14,I4210081a, ... 8d033b14 {dec,enc}_neon: harmonize function suffixes x2 0295e981 upsampling_neon: harmonize function suffixes d572c4e5 yuv_neon: harmonize function suffixes ab9c2500 rescaler_neon: harmonize function suffixes 93e0ce27 lossless_neon: harmonize function suffixes 22fbc50e lossless_enc_neon: harmonize function suffixes 447875b4 filters_neon,cosmetics: fix indent e51bdd43 remove unused VP8TokenToStats() function 785da7ea enc_neon: harmonize function suffixes bc1a251f dec_neon: harmonize function suffixes 61e535f1 dsp/lossless: workaround gcc-4.8 bug on arm 68b2eab7 cwebp: fix alpha reporting w/lossless & metadata 30042faa WebPDemuxGetI: add doc details around WebPFormatFeature 0a17f471 Merge "WIP: list includes as descendants of the project dir" a4399721 WIP: list includes as descendants of the project dir 08275708 Merge "Make sure we reach the full range for alpha blending." d361a6a7 yuv_sse2: harmonize function suffixes 6921aa6f upsampling_sse2: harmonize function suffixes 08c67d3e ssim_sse2: harmonize function suffixes 582a1b57 rescaler_sse2: harmonize function suffixes 2c1b18ba lossless_sse2: harmonize function suffixes 0ac46e81 lossless_enc_sse2: harmonize function suffixes bc634d57 enc_sse2: harmonize function suffixes bcb7347c dec_sse2: harmonize function suffixes e14ad93c Make sure we reach the full range for alpha blending. 7038ca8d demux,StoreFrame: restore hdr size check to min req fb3daad6 cpu: fix ssse3 check be590e06 Merge "Fix CMake redefinition for HAVE_CPU_FEATURES_H" 35f736e1 Fix CMake redefinition for HAVE_CPU_FEATURES_H a5216efc Fix integer overflow warning. a9c8916b decode.h,WebPIDecGetRGB: clarify output ptr validity 3c74c645 gif2webp: handle 1-frame case properly + fix anim_diff c7f295d3 Merge "gif2webp: introduce -loop_compatibility option" b4e04677 gif2webp: introduce -loop_compatibility option f78da3de add LOCAL_CLANG_PREREQ and avoid WORK_AROUND_GCC w/3.8+ 01c426f1 define WEBP_USE_INTRINSICS w/gcc-4.9+ 8635973d use sdl-config (if available) to determine the link flags e9459382 use CPPFLAGS before CFLAGS 4a9d788e Merge "Android.mk,mips: fix clang build with r15" 4fbdc9fb Android.mk,mips: fix clang build with r15 a80fcc4a ifdef code not used by Chrome/Android. 3993af12 Fix signed integer overflows. f66f94ef anim_dump: small tool to dump frames from animated WebP 6eba857b Merge "rationalize the Makefile.am" c5e34fba function definition cleanup 3822762a rationalize the Makefile.am 501ef6e4 configure style fix: animdiff -> anim_diff f8bdc268 Merge "protect against NULL dump_folder[] value in ReadAnimatedImage()" 23bfc652 protect against NULL dump_folder[] value in ReadAnimatedImage() 8dc3d71b cosmetics,ReadAnimatedWebP: correct function comment 5bd40066 Merge changes I66a64a0a,I4d2e520f 7945575c cosmetics,webpinfo: remove an else after a return 8729fa11 cosmetics,cwebp: remove an else after a return f324b7f9 cosmetics: normalize fn proto & decl param names 869eb369 CMake cleanups. 289e62a3 Remove declaration of unimplemented VP8ApplyNearLosslessPredict 20a94186 pnmdec,PAM: validate depth before calculating bytes_per_px 34130afe anim_encode: fix integer overflow 42c79aa6 Merge "Encoder: harmonize function suffixes" b09307dc Encoder: harmonize function suffixes bed0456d Merge "SSIM: harmonize the function suffix" 54f6a3cf lossless_sse2.c: fix some missed suffix changes 088f1dcc SSIM: harmonize the function suffix 86fc4dd9 webpdec: use ImgIoUtilCheckSizeArgumentsOverflow 08ea9ecd imageio: add ability restrict max image size 6f9daa4a jpegdec,ReadError: fix leaks on error a0f72a4f VP8LTransformColorFunc: drop an non-respected 'const' from the signature. 8c934902 Merge "Lossess dec: harmonize the function suffixes" 622242aa Lossess dec: harmonize the function suffixes 1411f027 Lossless Enc: harmonize the function suffixes 24ad2e3c add const to two variables 46efe062 Merge "Allow the lossless cruncher to work for alpha." 8c3f9a47 Speed-up LZ77. 1aef4c71 Allow the lossless cruncher to work for alpha. b8821dbd Improve the box LZ77 speed. 7beed280 add missing ()s to macro parameters 6473d20b Merge "fix Android standalone toolchain build" dcefed95 Merge "build.gradle: fix arm64 build" 0c83a8bc Merge "yuv: harmonize suffix naming" c6d1db4b fix Android standalone toolchain build 663a6d9d unify the ALTERNATE_CODE flag usage 73ea9f27 yuv: harmonize suffix naming c71b68ac build.gradle: fix arm64 build c4568b47 Rescaler: harmonize the suffix naming 6cb13b05 Merge "alpha_processing: harmonize the naming suffixes to be _C()" 83a3e69a Merge "simplify WEBP_EXTERN macro" 7295fde2 Merge "filters: harmonize the suffixes naming to _SSE2(), _C(), etc." 8e42ba4c simplify WEBP_EXTERN macro 331ab34b cost*.c: harmonize the suffix namings b161f670 filters: harmonize the suffixes naming to _SSE2(), _C(), etc. dec5e4d3 alpha_processing: harmonize the naming suffixes to be _C() 6878d427 fix memory leak in SDL_Init() 461ae555 Merge "configure: fix warnings in sdl check" 62486a22 configure: test for -Wundef 92982609 dsp.h: fix -Wundef w/__mips_dsp_rev 0265cede configure: fix warnings in sdl check 88c73d8a backward_references_enc.h: fix WINDOW_SIZE_BITS check 4ea49f6b rescaler_sse2.c: fix WEBP_RESCALER_FIX -> _RFIX typo 1b526638 Clean-up some CMake 87f57a4b Merge "cmake: fix gif lib detection when cross compiling" b34a9db1 cosmetics,dec_sse2: remove some redundant comments 471c5755 cmake: fix gif lib detection when cross compiling c793417a cmake: disable gif2webp if gif lib isn't found dcbc1c88 cmake: split gif detection from IMG deps 66ad84f0 Merge "muxread: remove unreachable code" 50ec3ab7 muxread: remove unreachable code 7d67a164 Lossy encoding: smoothen transparent areas to improve compression e50650c7 Merge "fix signature for DISABLE_TOKEN_BUFFER compilation" 671d2567 fix signature for DISABLE_TOKEN_BUFFER compilation d6755580 cpu.cmake: use unique flag to test simd disable flags 28914528 Merge "Remove the argb* files." 8acb4942 Remove the argb* files. 3b62347b README: correct cmake invocation note 7ca0df13 Have the SSE2 version of PackARGB use common code. 7b250459 Merge "Re-use the transformed image when trying several LZ77 in lossless." e132072f Re-use the transformed image when trying several LZ77 in lossless. 5d7a50ef Get code to compile in C++. 7b012987 configure: test for -Wparentheses-equality f0569adb Fix man pages for multi-threading. f1d5a397 multithread cruncher: only copy stats when picture->stats != NULL f8c2ac15 Multi-thread the lossless cruncher. a88c6522 Merge "Integrate a new LZ77 looking for matches in the neighborhood of a pixel only." 8f6df1d0 Unroll Predictors 10, 11 and 12. 355c3d1b Integrate a new LZ77 looking for matches in the neighborhood of a pixel only. a1779a01 Refactor LZ77 handling in preparation for a new method. 67de68b5 Android.mk/build.gradle: fix mips build with clang from r14b f209a548 Use the plane code and not the distance when computing statistics. b903b80c Split cost-based backward references in its own file. 498cad34 Cosmetic changes in backward reference. e4eb4587 lossless, VP8LTransformColor_C: make sure no overflow happens with colors. af6deaff webpinfo: handle alpha flag mismatch 7caef29b Fix typo that creeped in. 39e19f92 Merge "near lossless: fix unsigned int overflow warnings." 9bbc0891 near lossless: fix unsigned int overflow warnings. e1118d62 Merge "cosmetics,FindClosestDiscretized: use uint in mask creation" 186bc9b7 Merge "webpinfo: tolerate ALPH+VP8L" b5887297 cosmetics,FindClosestDiscretized: use uint in mask creation f1784aee near_lossless,FindClosestDiscretized: use unsigned ops 0d20abb3 webpinfo: tolerate ALPH+VP8L 972104b3 webpmux: tolerate false positive Alpha flag dd7e83cc tiffdec,ReadTIFF: ensure data_size is < tsize_t max d988eb7b tiffdec,MyRead: quiet -Wshorten-64-to-32 warning dabda707 webpinfo: add support to parse Alpha bitstream 4c117643 webpinfo: correct background color output, BGRA->ARGB defc98d7 Doc: clarify the role of quality in WebPConfig. d78ff780 Merge "Fix code to compile with C++." c8f14093 Fix code to compile with C++. 497dc6a7 pnmdec: sanitize invalid header output d78e5867 Merge "configure: test for -Wconstant-conversion" 481e91eb Merge "pnmdec,PAM: set bytes_per_px based on depth when missing" 93b12753 configure: test for -Wconstant-conversion 645f0c53 pnmdec,PAM: set bytes_per_px based on depth when missing e9154605 Merge "vwebp: activate GLUT double-buffering" 818d795b vwebp: activate GLUT double-buffering d63e6f4b Add a man page for webpinfo 4d708435 Merge "NEON: implement ConvertRGB24ToY/BGR24/ARGB/RGBA32ToUV/ARGBToUV" faf42213 NEON: implement ConvertRGB24ToY/BGR24/ARGB/RGBA32ToUV/ARGBToUV b4d576fa Install man pages with CMake. cbc1b921 webpinfo: add features to parse bitstream header e644c556 Fix bad bit writer initialization. b62cdad2 Merge "Implement a cruncher for lossless at method 6." da3e4dfb use the exact constant for the gamma transfer function a9c701e0 Merge "tiffdec: fix EXTRASAMPLES check" adab8ce0 Implement a cruncher for lossless at method 6. 1b92b237 Merge "Fix VP8ApplyNearLossless to respect const and stride." 1923ff02 tiffdec: fix EXTRASAMPLES check 97cce5ba tiffdec: only request EXTRASAMPLES w/> 3 samples/px 0dcd85b6 Fix VP8ApplyNearLossless to respect const and stride. f7682189 yuv: rationalize the C/SSE2 function naming 52245424 NEON implementation of some Sharp-YUV420 functions 690efd82 Avoid several backward reference copies. 4bb1f607 src/dec/vp8_dec.h, cosmetics: fix comments 285748be cmake: build/install webpinfo 78fd199c backward_references_enc.c: clear -Wshadow warnings ae836410 WebPLog2FloorC: clear -Wshadow warning d0b7404e Merge "WASM support" 134e314f WASM support c08adb6f Merge "VP8LEnc: remove use of BitsLog2Ceiling()" 28c37ebd VP8LEnc: remove use of BitsLog2Ceiling() 2cb58ab2 webpinfo: output format as a human readable string bb175a93 Merge "rename some symbols clashing with MSVC headers" 39eda658 Remove a duplicated pixel hash implementation. 36b8274d rename some symbols clashing with MSVC headers 274daf54 Add webpinfo tool. ec5036e4 add explicit reference to /usr/local/{lib,inc} 18f0dfac Merge "fix TIFF encoder regarding rgbA/RGBA" 4e2b0b50 Merge "webpdec.h: fix a doc typo" e2eeabff Merge "Install binaries, libraries and headers in CMake." 836607e6 webpdec.h: fix a doc typo 9273e441 fix TIFF encoder regarding rgbA/RGBA 17e3c11f Add limited PAM decoding support 5f624871 Install binaries, libraries and headers in CMake. 976adac1 Merge "lossless incremental decoding: fix missing eos_ test" f8fad4fa lossless incremental decoding: fix missing eos_ test 27415d41 Merge "vwebp_sdl: fix the makefile.unix" 49566182 Merge "ImgIoUtilWriteFile(): use ImgIoUtilSetBinaryMode" 6f75a51b Analyze the transform entropy on the whole image. a5e4e3af Use palette only if we can in entropy analysis. 75a9c3c4 Improve compression by better entropy analysis. 39cf6f4f vwebp_sdl: fix the makefile.unix 699b0416 ImgIoUtilWriteFile(): use ImgIoUtilSetBinaryMode 7d985bd1 Fix small entropy analysis bug. 6e7caf06 Optimize the color cache size. 833c9219 More efficient stochastic histogram merge. 5183326b Refactor the greedy histogram merge. 99f6f462 Merge "histogram_enc.c,MyRand: s/ul/u/ for unsigned constants" 80a22186 ssim.c: remove dead include a128dfff histogram_enc.c,MyRand: s/ul/u/ for unsigned constants 693bf74e move the SSIM calculation code in ssim.c / ssim_sse2.c 10d791ca Merge "Fix the random generator in HistogramCombineStochastic." fa63a966 Fix the random generator in HistogramCombineStochastic. 16be192f VP8LSetBitPos: remove the eos_ setting 027151ca don't erase the surface before blitting. 4105d565 disable WEBP_USE_XXX optimisations when EMSCRIPTEN is defined 9ee32a75 Merge "WebP-JS: emscripten-based Javascript decoder" ca9f7b7d WebP-JS: emscripten-based Javascript decoder 868aa690 Perform greedy histogram merge in a unified way. 5b393f2d Merge "fix path typo for vwebp_sdl in Makefile.vc" e0012bea CMake: only use libwebpdecoder for building dwebp 84c2a7b0 fix path typo for vwebp_sdl in Makefile.vc 1b0e4abf Merge "Add a flag to disable SIMD optimizations." 32263250 Add a flag to disable SIMD optimizations. b494fdec optimize the ARGB->ARGB Import to use memcpy f1536039 Merge "ReadWebP: decode directly into a pre-allocated buffer" e69ed291 ReadWebP: decode directly into a pre-allocated buffer 57d8de8a Merge "vwebp_sdl: simple viewer based on SDL" 5cfd4ebc LZ77 interval speedups. Faster, smaller, simpler. 1e7ad88b PNM header decoder: add some basic numerical validation 17c7890c Merge "Add a decoder only library for WebP in CMake." be733786 Merge "Add clang build fix for MSA" 03cda0e4 Add a decoder only library for WebP in CMake. aa893914 Add clang build fix for MSA 31a92e97 Merge "imageio: add limited PNM support for reading" dcf9d82a imageio: add limited PNM support for reading 6524fcd6 vwebp_sdl: simple viewer based on SDL 6cf24a24 get_disto: fix reference file read 43d472aa Merge tag 'v0.6.0' 50d1a848 update ChangeLog (tag: v0.6.0, origin/0.6.0) 20a7fea0 extras/Makefile.am: fix libwebpextras.la reference 415f3ffe update ChangeLog (tag: v0.6.0-rc3) 3c6d1224 update NEWS ee4a4141 update AUTHORS 32ed856f Fix "all|no frames are keyframes" settings. 1c3190b6 Merge "Fix "all|no frames are keyframes" settings." f4dc56fd disable GradientUnfilter_NEON 4f3e3bbd disable GradientUnfilter_NEON 2dc0bdca Fix "all|no frames are keyframes" settings. 0d8e0588 img2webp: treat -loop as a no-op w/single images b0450139 ReadImage(): restore size reporting 0ad3b4ef update ChangeLog (tag: v0.6.0-rc2) 6451709e img2webp,get_disto: fix image decode w/WIC builds 92504d21 get_disto: make ReadPicture() return a bool c3e4b3a9 update NEWS 3363eb6d man/img2webp.1: fix formatting warning 4d1312f2 update NEWS 36c42ea4 bump version to 0.6.0 bb498a51 update AUTHORS 84cef16f Makefile.vc: fix CFG=debug-dynamic build 919f9e2f Merge "add .rc files for windows dll versioning" f1ae8af4 Merge ".gitignore: add img2webp" 4689ce16 cwebp: add a -sharp_yuv option for 'sharp' RGB->YUV conversion 79bf46f1 rename the pretentious SmartYUV into SharpYUV eb1dc89a silently expose use_delta_palette in the WebPConfig API c85b0dde .gitignore: add img2webp 43d3f01a add .rc files for windows dll versioning 668e1dd4 src/{dec,enc,utils}: give filenames a unique suffix 0e6b7f33 Merge "iosbuild.sh: only add required headers to framework" 29ed6f9a iosbuild.sh: only add required headers to framework 71c53f1a NEON: speed-up strong filtering 73f567ea Merge "get_disto: remove redundant reader check" 9e14276f Merge "makefiles: prune get_disto & webp_quality deps" 99965bac Merge "Makefile.vc: add get_disto.exe, webp_quality.exe" d4912238 get_disto: remove redundant reader check ea482409 makefiles: prune get_disto & webp_quality deps 2ede5a19 Makefile.vc: add get_disto.exe, webp_quality.exe a345068a ARM: speed up bitreader by avoiding tables 1dc82a6b Merge "introduce a generic GetCoeffs() function pointer" 8074b89e introduce a generic GetCoeffs() function pointer 749a45a5 Merge "NEON: implement alpha-filters (horizontal/vertical/gradient)" 74c053b5 Merge "NEON: fix overflow in SSE NxN calculation" 0a3aeff7 Merge "dsp: WebPExtractGreen function for alpha decompression" 1de931c6 NEON: implement alpha-filters (horizontal/vertical/gradient) 9b3aca40 NEON: fix overflow in SSE NxN calculation 1c07a3c6 dsp: WebPExtractGreen function for alpha decompression 9ed5e3e5 use pointers for WebPRescaler's in WebPDecParams db013a8d Merge "ARM: don't use USE_GENERIC_TREE" fcd4784d use a 8b table for C-version for clz() fbb5c473 ARM: don't use USE_GENERIC_TREE 8fda5612 Merge "add a kSlowSSSE3 feature for CPUInfo" 86bbd245 add a kSlowSSSE3 feature for CPUInfo 7c2779e9 Get code to fully compile in C++. 250c3586 Merge "When compiling as C++, avoid narrowing warnings." c0648ac2 When compiling as C++, avoid narrowing warnings. 0d55f60c 40% faster ApplyAlphaMultiply_SSE2 49d0280d NEON: implement several alpha-processing functions 48b1e85f SSE2: 15% faster alpha-processing functions e3b8abbc fix warning from static analysis. 28fe054e SSE2: 30% faster ApplyAlphaMultiply() f44acd25 Merge "Properly compute the optimal color cache size." 527844fe Properly compute the optimal color cache size. be0ef639 fix a comment typo 8874b162 Fix a non-deterministic color cache size computation. d712e20d Do not allow a color cache size bigger than the number of colors. ecff04f6 re-introduce some comments in Huffman Cost. 259e9828 replace 'ptr + y * stride' by 'ptr += stride' 00b08c88 Merge "NEON: 5% faster conversion to RGB565 and RGBA4444" 0e7f4447 Merge "NEON: faster fancy upsampling" b016cb91 NEON: faster fancy upsampling 1cb63801 Call the C function to finish off lossless SSE loops only when necessary. 875fafc1 Implement BundleColorMap in SSE2. 3674d49e Merge "remove Clang warnings with unused arch arguments." f04eb376 Merge tag 'v0.5.2' 341d711c NEON: 5% faster conversion to RGB565 and RGBA4444 abb54827 remove Clang warnings with unused arch arguments. ece9684f update ChangeLog (tag: v0.5.2-rc2, tag: v0.5.2) aa7744ca anim_util: quiet implicit conv warnings in 32-bit d9120271 jpegdec: correct ContextFill signature 24eb3940 Remove some errors when compiling the code as C++. a4a8e5f3 vwebp: clear canvas during resize w/o animation 67c25ad5 vwebp: clear canvas during resize w/o animation a4bbe4b3 fix indentation 31ca2a80 tiffdec: restore libtiff 3.9.x compatibility b2f77b57 update NEWS 5ab6d9de AnimEncoder: avoid freeing uninitialized memory pointer. f29bf582 WebPAnimEncoder: If 'minimize_size' and 'allow_mixed' on, try lossy + lossless. 3ebe1c00 AnimEncoder: avoid freeing uninitialized memory pointer. df780e0e fix a potential overflow with MALLOC_LIMIT 58fc5078 Merge "PredictorSub: implement fully-SSE2 version" 9cc42167 PredictorSub: implement fully-SSE2 version 0aa1f35c remove dependency of imageio/ to stopwatch.h cb9ec84b Merge "remove the dependency to stop_watch.[ch] in imageio" dc0c01fb Merge "anim_util: quiet implicit conv warnings in 32-bit" 827d3c50 Merge "fix a potential overflow with MALLOC_LIMIT" 1e2e25b0 anim_util: quiet implicit conv warnings in 32-bit 218460cd bump version to 0.5.2 de7d654d update AUTHORS & .mailmap 273367c1 Merge "dsp/lossless.c,cosmetics: fix indent" 76bbcf2e fix a potential overflow with MALLOC_LIMIT 8ac1abfe Merge "jpegdec: correct ContextFill signature" cb215aed remove the dependency to stop_watch.[ch] in imageio 2423017a dsp/lossless.c,cosmetics: fix indent 74a12b10 iosbuild.sh: add WebPDecoder.framework + encoder a9cc7621 Merge "iosbuild.sh: add WebPDecoder.framework + encoder" fbba5bc2 optimize predictor #1 in plain-C For some reason, gcc has hard time inlining this one... 9ae0b3f6 Merge "SSE2: slightly (~2%) faster Predictor #1" c1f97bd7 SSE2: slightly (~2%) faster Predictor #1 ea664b89 SSE2: 10% faster Predictor #11 be7dcc08 AnimEncoder: Correctly skip a frame when sub-rectangle is empty. 40885830 Fix assertions in WebPRescalerExportRow() 1d5046d1 iosbuild.sh: add WebPDecoder.framework + encoder cec72014 jpegdec: correct ContextFill signature 8f38c72e fix a typo in WebPPictureYUVAToARGB's doc 33ca93f9 systematically call WebPDemuxReleaseIterator() on dec->prev_iter_ 76e19073 doc: use two's complement explicitly for uint8->int8 conversion f91ba963 Anim_encoder: correctly handle enc->prev_candidate_undecided_ 25d74e65 WebPPictureDistortion(): free() -> WebPSafeFree() 03f1c008 mux/Makefile.am: add missing -lm 58410cd6 fix bug in RefineUsingDistortion() e168af8c fix filtering auto-adjustment ed9dec41 fix doc and code snippet for WebPINewDecoder() doc 3c49178f prevent 32b overflow for very large canvas_width / height 9595f290 fix anim_util.c compilation when HAVE_GIF is not defined. 7ec9552c Make gif transparent color to be transparent black b3fb8bb6 slightly faster Predictor #11 in NEON 9871335f Add a CMake option for WEBP_SWAP_16BIT_CSP. 0ae32226 Fix missing cpu-features for Android. ab4c8056 cpu.cmake: improve webp_check_compiler_flag output eec5fa3a Provide support for CMake on Android studio 2.2. 004d5690 Split the main CMake file. 4fe5d588 Android.mk: use -fvisibility=hidden bd63a31a vwebp: ensure setenv() is available in stdlib.h 363a5681 vwebp: handle window resizing properly a0d2753f lower WEBP_MAX_ALLOCABLE_MEMORY default 31fe11a5 fix infinite loop in case of PARTITION0 overflow 532215dd Change the rule of picking UV mode in MBAnalyzeBestUVMode() 9c75dbd3 cwebp.1: improve some grammar af2e05cb vwebp: Clear previous frame when a key triggers a redraw 26ffa296 Add descriptions of default configuration in help info. 7416280d Fix an unsigned integer overflow error in enc/cost.h 13cf1d2e Do token recording and counting in a single loop eb9a4b97 Reset segment id if we decide not to update segment map 42ebe3b7 configure: fix NEON flag detection under gcc 6 76ebbfff NEON: implement predictor #13 95b12a08 Merge "Revert Average3 and Average4" 54ab2e75 Revert Average3 and Average4 fe12330c 3-5% faster Predictor #5, #6, #7 and #10 for NEON fbfb3bef ~2% faster predictor #10 for NEON d4b7d801 lossless_sse2: use the local functions a5e3b225 Lossless decoder SSE2 improvements. 58a1f124 ~2% faster predictor #12 in NEON. 906c3b63 Merge "Implement lossless transforms in NEON." d23abe4e Implement lossless transforms in NEON. 2e6cb6f3 Give more flexibility to the predictor generating macro. 28e0bb70 Merge "Fix race condition in multi-threading initialization." 64704530 Fix race condition in multi-threading initialization. bded7848 img2webp: fix default -lossless value and use pic.argb=1 0e61a513 Merge "img2webp: convert a sequence of images to an animated webp" 1cc79e92 AnimEncoder: Correctly skip a frame when sub-rectangle is empty. 03f40955 img2webp: convert a sequence of images to an animated webp ea72cd60 add missing 'extern' keyword for predictor dcl 67879e6d SSE implementation of decoding predictors. 34aee990 Merge "vwebp: make 'd' key toggle the debugging of fragments" a41296ae Fix potentially uninitialized value. c85adb33 vwebp: make 'd' key toggle the debugging of fragments 4239a148 Make the lossless predictors work on a batch of pixels. bc18ebad fix extra 'const's in signatures 71e2f5ca Remove memcpy in lossless decoding. 7474d46e Do not use a register array in SSE. 67748b41 Improve latency of FTransform2. 16951b19 Merge "Provide an SSE implementation of ConvertBGRAToRGB" 6540cd0e Provide an SSE implementation of ConvertBGRAToRGB de568abf Android.mk: use -fvisibility=hidden 3c2a61b0 remove some unneeded casts 9ac063c3 add dsp functions for SmartYUV 22efabdd Merge "smart_yuv: switch to planar instead of packed r/g/b processing" 1d6e7bf3 smart_yuv: switch to planar instead of packed r/g/b processing 0a3838ca fix bug in RefineUsingDistortion() c0699515 webpmux -duration: set default 'end' value equal to 'start' 83cbfa09 Import: use relative pointer offsets a1ade40e PreprocessARGB: use relative pointer offsets fd4d090f ConvertWRGBToYUV: use relative pointer offsets 9daad459 ImportYUVAFromRGBA: use relative pointer offsets f90c60d1 Merge "add a "-duration duration,start,end" option to webpmux" 3f182d36 add a "-duration duration,start,end" option to webpmux 342e15f0 Import: use relative pointer offsets 1147ab4e PreprocessARGB: use relative pointer offsets e4cd4daf fix filtering auto-adjustment e7152856 fix doc and code snippet for WebPINewDecoder() doc de9fa507 ConvertWRGBToYUV: use relative pointer offsets deb1b831 ImportYUVAFromRGBA: use relative pointer offsets c284780f imageio_util: add ImgIoUtilCheckSizeArgumentsOverflow e375080d gifdec,Remap: avoid out of bounds colormap read c222a053 additional fix for stride type as size_t bb233617 fix potential overflow when width * height * 4 >= (1<<32) 883d41fb gif2webp: fix crash with NULL extension data cac9a36a gifdec,Remap: avoid out of bounds colormap read 4595e01f Revert "gifdec,Remap: avoid out of bounds colormap read" fb52d443 gifdec: make some constants unsigned f048d38d gifdec,Remap: avoid out of bounds colormap read 31b1e343 fix SSIM metric ... by ignoring too-dark area 2f51b614 introduce WebPPlaneDistortion to compute plane distortion 0104d730 configure: fix NEON flag detection under gcc 6 265abbe9 Merge "additional fix for stride type as size_t" f7601aa6 Merge "Introduce a generic WebPGetImageReader(type) function" ce873320 Introduce a generic WebPGetImageReader(type) function 2a2773ea imageio/*dec,Read*: add input parameter checks 9f5c8eca additional fix for stride type as size_t 4eb5df28 remove unused stride fields from VP8Iterator 11bc423a MIN_LENGTH cleanups. 273d035a Merge "fix a typo in WebPPictureYUVAToARGB's doc" 4db82a17 Merge "fix potential overflow when width * height * 4 >= (1<<32)" e2affacc fix potential overflow when width * height * 4 >= (1<<32) dc789ada fix a typo in WebPPictureYUVAToARGB's doc 539f5a68 Fix non-included header in config.c. aaf2a6a6 systematically call WebPDemuxReleaseIterator() on dec->prev_iter_ 20ef9915 Merge "imageio_util: add ImgIoUtilCheckSizeArgumentsOverflow" bc86b7a8 imageio_util: add ImgIoUtilCheckSizeArgumentsOverflow 806f6279 gif2webp: fix crash with NULL extension data 68ae5b67 Add libwebp/src/mux/animi.h 28ce3043 Remove some errors when compiling the code as C++. b34abcb8 Favor keeping the areas locally similar in spatial prediction mode selection ba843a92 fix some SSIM calculations 51b71fd2 Merge "vwebp: ensure setenv() is available in stdlib.h" fb01743a get_disto: fix the r/g/b order for luma calculation bfab8947 vwebp: ensure setenv() is available in stdlib.h 9310d192 vwebp: handle window resizing properly f79450ca Speedup ApplyMap. cfdda7c6 Merge "prevent 32b overflow for very large canvas_width / height" e36396ba Merge "get_disto: new option to compute SSIM map and convert to gray" 18a9a0ab Add an API to import a color-mapped image. 30d43706 Speed-up Combined entropy for palettized histograms. 36aa087b get_disto: new option to compute SSIM map and convert to gray 86a84b35 2x faster SSE2 implementation of SSIMGet b8384b53 lower WEBP_MAX_ALLOCABLE_MEMORY default 1c364400 prevent 32b overflow for very large canvas_width / height eee0cce1 Merge "Small LZ77 speedups." 5f1caf29 Small LZ77 speedups. 1effde7b fix anim_util.c compilation when HAVE_GIF is not defined. a2fe9bf4 Speedup TrellisQuantizeBlock(). 573cce27 smartYUV improvements 21e7537a fix infinite loop in case of PARTITION0 overflow 053a1565 Merge "Change the rule of picking UV mode in MBAnalyzeBestUVMode()" 1377ac2e Change the rule of picking UV mode in MBAnalyzeBestUVMode() 7c1fb7d0 fix uint32_t initialization (0. -> 0) bfff0bf3 speed-up SSIM calculation 64577de8 De-VP8L-ize GetEntropUnrefinedHelper. a7be7328 Merge "refactor the PSNR / SSIM calculation code" 50c3d7da refactor the PSNR / SSIM calculation code d6228aed indentation fix after I7055d3ee3bd7ed5e78e94ae82cb858fa7db3ddc0 dd538b19 Remove unused declaration. 6cc48b17 Move some lossless logic out of dsp. 78363e9e Merge "Remove a redundant call to InitLeft() in VP8IteratorReset()" ffd01929 Refactor VP8IteratorNext(). c4f6d9c9 Remove a redundant call to InitLeft() in VP8IteratorReset() c27d8210 Merge "smartYUV: simplify main loop" 07795296 smartYUV: simplify main loop c9b45863 Split off common lossless dsp inline functions. 490ae5b1 smartYUV: improve initial state for faster convergence 894232be smartYUV: fix and simplify the over-zealous stop criterion 8de08483 Remove unused code in webpi.h 41cab7fe imageio/Android.mk: correct imagedec dependencies 82c91c70 Merge "libimageenc.a: extract image-saving code from dwebp" af1ad3e2 libimageenc.a: extract image-saving code from dwebp dd7309e3 Merge "doc: use two's complement explicitly for uint8->int8 conversion" 6105777e Merge "add gif2webp to CMake" 13ae011e doc: use two's complement explicitly for uint8->int8 conversion 4bda0cfb add gif2webp to CMake 6029c7fe Merge "remove mention of fragment, frgm, FRGM, etc." 545c147f remove mention of fragment, frgm, FRGM, etc. 5b46f7fc cwebp.1: improve some grammar 9e478f80 dec/vp8l.c: add assertions in EmitRescaledRowsRGBA/YUVA 43bd8958 Make gif transparent color to be transparent black 0887fc2d Merge "get_disto: add a '-o file' option to save a diff map" 0de48e18 get_disto: add a '-o file' option to save a diff map 0a57ad0d cosmetics: WebPSafeAlloc -> WebPSafeMalloc 0a4699bc Merge "WebPPictureDistortion(): free() -> WebPSafeFree()" 29fedbf5 Anim_encoder: correctly handle enc->prev_candidate_undecided_ 32dead4e WebPPictureDistortion(): free() -> WebPSafeFree() 85cd5d06 Smarter LZ77 for uniform regions. 6585075f Change PixelsAreSimilar() to handle black pixels correctly. c0a27fd2 vwebp: Clear previous frame when a key triggers a redraw 57a5e3b6 webp_quality should return '0' in case of success. 7f1b897b Faster stochastic histogram merging. 48c810b8 Merge "remove WEBP_FORCE_ALIGNED and use memcpy() instead." 3884972e remove WEBP_FORCE_ALIGNED and use memcpy() instead. 485cac1a switch libimagedec.a and libimageio_util.a to avoid undefined symbol 005e15b1 Merge "{extras,mux}/Makefile.am: add missing -lm" 6ab496ed fix some 'unsigned integer overflow' warnings in ubsan 8a4ebc6a Revert "fix 'unsigned integer overflow' warnings in ubsan" 9d4f209f Merge changes I25711dd5,I43188fab e44f5248 fix 'unsigned integer overflow' warnings in ubsan 27b5d991 Fix assertions in WebPRescalerExportRow() 74f6f9e7 Add descriptions of default configuration in help info. aaf2530c {extras,mux}/Makefile.am: add missing -lm 1269dc7c Refactor VP8LColorCacheContains() 40872fb2 dec_neon,NeedsHev: micro optimization 7b54e26b Add a CMake option for WEBP_SWAP_16BIT_CSP. d2223d8d Fix missing cpu-features for Android. bf16a4b4 Merge "cpu.cmake: improve webp_check_compiler_flag output" ee1057e3 cpu.cmake: improve webp_check_compiler_flag output b551e587 cosmetics: add {}s on continued control statements d2e4484e dsp/Makefile.am: put msa source in correct lib c7f66c82 Merge "utils/thread.c,cosmetics: join a few lines" 98d8f295 Merge "examples/Makefile.am,cosmetics: sort binary targets" 39f4ffbc utils/thread.c,cosmetics: join a few lines a86ce2b1 Merge "extras/Makefile.am: don't install libwebpextras" 6fa9fe24 extras/Makefile.am: don't install libwebpextras 0b2c58a9 Fix an unsigned integer overflow error in enc/cost.h d7ce4a2e examples/Makefile.am,cosmetics: sort binary targets 386e4ba2 Reset segment id if we decide not to update segment map 7b87e848 Merge "Add MSA optimized YUV to RGB upsampling functions" d3ddacb6 Add MSA optimized YUV to RGB upsampling functions eb98d8d8 webp_quality: detect lossless format and features ebee57f4 move imageio/example_util.[hc] (back to) examples/ 99542bbf webpdec: s/ExUtil// da573cf4 imageio_util: s/ExUtil/ImgIoUtil/ bdda5bd4 split example_util.h 15ed462b .gitignore: add extras/{get_disto,webp_quality} 7be57489 Merge "VP8EstimateQuality(): roughty estimate webp bitstream quality factor" 57020525 Makefile.vc: add missing imageio target e8ab6a82 VP8EstimateQuality(): roughty estimate webp bitstream quality factor fee7b3d6 Merge "'extras/get_disto' example: compute PSNR between two files" 1e7d4401 'extras/get_disto' example: compute PSNR between two files 4cecab63 pngdec.c,jpegdec.[hc]: remove unnecessary includes 259f0434 makefile.unix: normalize image decode lib name ed34c39b fix: examples/libexample_dec.a => imageio/libexample_dec.a 33d8d0d4 Merge "move examples/{example_util,image_dec} to imageio/" c960b82e Merge "extras.h: correct include guard" fe3cd28a Merge ".gitignore: add .gradle, /build" 45fbeba5 Merge "Do token recording and counting in a single loop" 4f33c820 .gitignore: add .gradle, /build c379b55a move examples/{example_util,image_dec} to imageio/ 5108d9aa extras.h: correct include guard ad497fbc move src/extras to the top-level 0c0fb832 Do token recording and counting in a single loop 9ac74f92 Add MSA optimized rescaling functions cb19dbc1 Add MSA optimized color transform functions 3f4042b5 WebPAnimEncoder: If 'minimize_size' and 'allow_mixed' on, try lossy + lossless. 5e2eb89e cosmetics,dsp/*msa.c: associate '*' with the type 5b60db5c FastMBAnalyze() for quick i16/i4 decision 567e6977 Add MSA optimized CollectHistogram function c54ab8dd Add MSA optimized quantization functions ec6f68c5 Merge "Remove QuantizeBlockWHT() in enc.c" 2a5c417c Apply the RLE heuristic to LZ77. 91b59e88 Remove QuantizeBlockWHT() in enc.c fe572737 Add MSA optimized SSE functions 6b53ca87 cosmetics,(dec|enc)_sse2.c: fix indent b15d00d9 Merge "Add MSA optimized encoder IntraChromaPreds function" afe3cec8 Add MSA optimized encoder IntraChromaPreds function fc8cad9f reduce the number of malloc/free cycles in huffman.c 7b4b05e0 Add MSA optimized encoder Intra16Preds function c18787a0 Add MSA optimized encoder Intra4Preds function 479d1908 webpmux: Also print compression info per frame. a80e8cfd Provide support for CMake on Android studio 2.2. 6c628410 Split the main CMake file. bbb6ecd9 Merge "Add MSA optimized distortion functions" 7915396f Add MSA optimized distortion functions 652e944f Merge "build.gradle: remove tab" c0991a14 io,EmitRescaledAlphaYUV: factor out a common expr 48bf5ed1 build.gradle: remove tab bfef6c9f Merge tag 'v0.5.1' 3d97bb75 update ChangeLog (tag: v0.5.1) deb54d91 Clarify the expected 'config' lifespan in WebPIDecode() 435308e0 Add MSA optimized encoder transform functions dce64bfa Add MSA optimized alpha filter functions 429120d0 Add MSA optimized color transform functions c7e2d245 update ChangeLog (tag: v0.5.1-rc5) 55b2fede normalize the macros' "do {...} while (0)" constructs 701c772e Add MSA optimized colorspace conversion functions c7eb06f7 Fix corner case in CostManagerInit. f918cb10 fix rescaling bug: alpha plane wasn't filled with 0xff ab7937a5 gif2webp: normalize the number of .'s in the help message 3cdec847 vwebp: normalize the number of .'s in the help message bdf6241e cwebp: normalize the number of .'s in the help message 06a38c7b fix rescaling bug: alpha plane wasn't filled with 0xff 319e37be Improve lossless compression. 6a197937 Add MSA optimized intra pred chroma functions 447adbce 'our bug tracker' -> 'the bug tracker' 97b9e644 normalize the number of .'s in the help message 293d786f Added MSA optimized intra prediction 16x16 functions 0afa0ce2 Added MSA optimized intra prediction 4x4 functions a6621bac Added MSA optimized simple edge filtering functions bb50bf42 pngdec,ReadFunc: throw an error on invalid read 38063af1 decode.h,WebPGetInfo: normalize function comment 1ebf193c Added MSA optimized chroma edge filtering functions 9ad2352d Merge "Added MSA optimized edge filtering functions" 60751096 Added MSA optimized edge filtering functions 9e8e1b7b Inline GetResidual for speed. 7d58d1b7 Speed-up uniform-region processing. 8ec7032b simplify HistogramCombineEntropyBin() 23e29cb1 Merge "Fix a boundary case in BackwardReferencesHashChainDistanceOnly." into 0.5.1 472a049b remove bin_map[] allocation altogether 0bb23b2c free -> WebPSafeFree() a977b4b5 Merge "rewrite the bin_map clustering to use less memory" 3591ba66 rewrite the bin_map clustering to use less memory e6ac450c utils.[hc]: s/MAX_COLOR_COUNT/MAX_PALETTE_SIZE/ e7b91772 Merge "DecodeImageData(): change the incorrect assert" into 0.5.1 2abfa54f DecodeImageData(): change the incorrect assert 5a48fcd8 Merge "configure: test for -Wfloat-conversion" 0174d18d Fix a boundary case in BackwardReferencesHashChainDistanceOnly. 6a9c262a Merge "Added MSA optimized transform functions" cfbcc5ec Make sure to consider small distances in LZ77. 5e60c42a Added MSA optimized transform functions 3dc28d76 configure: test for -Wfloat-conversion f2a0946a add some asserts to delimit the perimeter of CostManager's operation 9a583c66 fix invalid-write bug for alpha-decoding f66512db make gradlew executable 6fda58f1 backward_references: quiet double->int warning a48cc9d2 Merge "Fix a compression regression for images with long uniform regions." into 0.5.1 cc2720c1 Merge "Revert an LZ77 boundary constant." into 0.5.1 059aab4f Fix a compression regression for images with long uniform regions. b0c7e49e Check more backward matches with higher quality. a3611513 Revert an LZ77 boundary constant. 8190374c README: fix typo 7551db44 update NEWS 0fb2269c bump version to 0.5.1 f4537610 update AUTHORS & .mailmap 3259571e Refactor GetColorPalette method. 1df5e260 avoid using tmp histogram in PreparePair() 7685123a fix comment typos a246b921 Speedup backward references. 76d73f18 Merge "CostManager: introduce a free-list of ~10 intervals" eab39d81 CostManager: introduce a free-list of ~10 intervals 4c59aac0 Merge "mips msa webp configuration" 043c33f1 Merge "Improve speed and compression in backward reference for lossless." 71be9b8c Merge "clarify variable names in HistogramRemap()" 0ba7fd70 Improve speed and compression in backward reference for lossless. 0481d42a CostManager: cache one interval and re-use it when possible 41b7e6b5 Merge "histogram: fix bin calculation" 96c3d624 histogram: fix bin calculation fe9e31ef clarify variable names in HistogramRemap() ce3c8247 disable near-lossless quantization if palette is used e11da081 mips msa webp configuration 5f8f998d mux: Presence of unknown chunks should trigger VP8X chunk output. cadec0b1 Merge "Sync mips32 and dsp_r2 YUV->RGB code with C verison" d9637758 Compute the hash chain once and for all for lossless compression. 50a48665 Sync mips32 and dsp_r2 YUV->RGB code with C verison eee788e2 Merge "introduce a common signature for all image reader function" d77b877c introduce a common signature for all image reader function ca8d9519 remove some obsolete TODOs ae2a7222 collect all decoding utilities from examples/ in libexampledec.a 0b8ae852 Merge "Move DitherCombine8x8 to dsp/dec.c" 77cad885 Merge "ReadWebP: avoid conversion to ARGB if final format is YUVA" ab8d6698 ReadWebP: avoid conversion to ARGB if final format is YUVA f8b7ce9e Merge "test pointer to NULL explicitly" 5df6f214 test pointer to NULL explicitly 77f21c9c Move DitherCombine8x8 to dsp/dec.c c9e6d865 Add gradle support c65f41e8 Revert "Add gradle support" bf731ede Add gradle support 08333b85 WebPAnimEncoder: Detect when canvas is modified, restore only when needed. 0209d7e6 Merge "speed-up MapToPalette() with binary search" fdd29a3d speed-up MapToPalette() with binary search cf4a651b Revert "Refactor GetColorPalette method." 0a27aca3 Merge changes Idfa8ce83,I19adc9c4 f25c4406 WebPAnimEncoder: Restore original canvas between multiple encodes. 169004b1 Refactor GetColorPalette method. 576362ab VP8LDoFillBitWindow: support big-endian in fast path ac49e4e4 bit_reader.c: s/VP8L_USE_UNALIGNED_LOAD/VP8L_USE_FAST_LOAD/ d39ceb58 VP8LDoFillBitWindow: remove stale TODO 2ec2de14 Merge "Speed-up BackwardReferencesHashChainDistanceOnly." 3e023c17 Speed-up BackwardReferencesHashChainDistanceOnly. f2e1efbe Improve near lossless compression when a prediction filter is used. e15afbce dsp.h: fix ubsan macro name e53c9ccb dsp.h: add WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW af81fdb7 utils.h: quiet -fsanitize=undefined warnings ea0be354 dsp.h: remove utils.h include cd276aec utils/*.c: ../utils/utils.h -> ./utils.h c8927131 utils/Makefile.am: add some missing headers ea24e026 Merge "dsp.h: add WEBP_UBSAN_IGNORE_UNDEF" 369e264e dsp.h: add WEBP_UBSAN_IGNORE_UNDEF 0d020a78 Merge "add runtime NEON detection" 5ee2136a Merge "add VP8LAddPixels() to lossless.h" 47435a61 add VP8LAddPixels() to lossless.h 8fa6ac68 remove two ubsan warnings 74fb56fb add runtime NEON detection 4154a839 MIPS update to new Unfilter API c80b9fc8 Merge "cherry-pick decoder fix for 64-bit android devices" 6235147e cherry-pick decoder fix for 64-bit android devices d41b8c43 configure: test for -Wformat-* w/-Wformat present 5f95589f Fix WEBP_ALIGN in case the argument is a pointer to a type larger than a byte. 2309fd5c replace num_parts_ by num_parts_minus_one_ (unsigned) 9629f4bc SimplifySegments: quiet -Warray-bounds warning de47492e Merge "update the Unfilter API in dsp to process one row independently" 2102ccd0 update the Unfilter API in dsp to process one row independently e3912d56 WebPAnimEncoder: Restore canvas before evaluating blending possibility. 6e12e1e3 WebPAnimEncoder: Fix for single-frame optimization. 602f344a Merge changes I1d03acac,Ifcb64219 95ecccf6 only apply color-mapping for alpha on the cropped area 47dd0708 anim_diff: Add an experimental option for max inter-frame diff. aa809cfe only allocate alpha_plane_ up to crop_bottom row 31f2b8d8 WebPAnimEncoder: FlattenSimilarPixels(): look for similar 774dfbdc perform alpha filtering within the decoding loop a4cae68d lossless decoding: only process decoded row up to last_row 238cdcdb Only call WebPDequantizeLevels() on cropped area cf6c713a alpha: preparatory cleanup b95ac0a2 Merge "VP8GetHeaders(): initialize VP8Io with sane value for crop/scale dimensions" 89231394 VP8GetHeaders(): initialize VP8Io with sane value for crop/scale dimensions 5828e199 use_8b_decode -> use_8b_decode_ 8dca0247 fix bug in alpha.c that was triggering a memory error in incremental mode 9a950c53 WebPAnimEncoder: Disable filtering when blending is used with lossy encoding. eb423903 WebPAnimEncoder: choose max diff for framerect based on quality. ff0a94be WebPAnimEncoder lossy: ignore small pixel differences for frame rectangles. f8040084 gif2webp: Remove the 'prev_to_prev_canvas' buffer. 6d8c07d3 Merge "WebPDequantizeLevels(): use stride in CountLevels()" d96fe5e0 WebPDequantizeLevels(): use stride in CountLevels() ec1b2407 WebPPictureImport*: check output pointer c0768769 Merge "Revert "Re-enable encoding of alpha plane with color cache for next release."" 41f14bcb WebPPictureImport*: check src pointer 64eed387 Pass stride parameter to WebPDequantizeLevels() 97934e24 Revert "Re-enable encoding of alpha plane with color cache for next release." e88c4ca0 fix -m 2 mode-cost evaluation (causing partition0 overflow) 4562e83d Merge "add extra meaning to WebPDecBuffer::is_external_memory" abdb109f add extra meaning to WebPDecBuffer::is_external_memory 875aec70 enc_neon,cosmetics: break long comment 71e856cf GetMBSSIM,cosmetics: fix alignment a90edffb fix missing 'extern' for SSIM function in dsp/ 423ecaf4 move some SSIM-accumulation function for dsp/ f08e6624 Merge "Fix FindClosestDiscretized in near lossless:" 0d40cc5e enc_neon,Disto4x4: remove an unnecessary transpose e8feb20e Fix FindClosestDiscretized in near lossless: 82006430 anim_util: quiet static analysis warning a6f23c49 Merge "AnimEncoder: Support progress hook and user data." a5193774 Merge "Near lossless feature: fix some comments." da98d31c AnimEncoder: Support progress hook and user data. 33357131 Near lossless feature: fix some comments. 0beed01a cosmetics: fix indent after 2f5e898 6753f35c Merge "FTransformWHT optimization." 6583bb1a Improve SSE4.1 implementation of TTransform. 7561d0c3 FTransformWHT optimization. 7ccdb734 fix indentation after patch #328220 6ec0d2a9 clarify the logic of the error path when decoding fails. 8aa352b2 Merge "Remove an unnecessary transposition in TTransform." db860884 Merge "remove useless #include" 9960c316 Remove an unnecessary transposition in TTransform. 6e36b511 Small speedup in FTransform. 9dbd4aad Merge "fix C and SIMD flags completion." e60853ea Add missing common_sse2.h file to makefile.unix 696eb2b0 fix C and SIMD flags completion. 2b4fe33e Merge "fix multiple allocation for transform buffer" 2f5e8986 fix multiple allocation for transform buffer bf2b4f11 Regroup common SSE code + optimization. 4ed650a1 force "-pass 6" if -psnr or -size is used but -pass isn't. 3ef1ce98 yuv_sse2: fix -Wconstant-conversion warning a7a03e9f Merge changes I4852d18f,I51ccb85d 5e122bd6 gif2webp: set enc_options.verbose = 0 w/-quiet ab3c2583 anim_encode,DefaultEncoderOptions: init verbose 8f0dee77 Merge "configure: fix builtin detection w/-Werror" 4a7b85a9 cmake: fix builtin detection w/-Werror b74657fb configure: fix builtin detection w/-Werror 3661b980 Add a CMakeLists.txt 75f4af4d remove useless #include 6c1d7631 avoid Yoda style for comparison 8ce975ac SSE optimization for vector mismatch. 7db53831 Merge tag 'v0.5.0' 37f04949 update ChangeLog (tag: v0.5.0-rc1, tag: v0.5.0, origin/0.5.0) 7e7b6ccc faster rgb565/rgb4444/argb output 4c7f565f update NEWS 1f62b6b2 update AUTHORS e224fdc8 update mailmap 71100500 bump version to 0.5.0 230a685e README: update help text, repo link d48e427b Merge "demux: accept raw bitstreams" 99a01f4f Merge "Unify some entropy functions." 4b025f10 Merge "configure: disable asserts by default" 92cbddf8 Merge "fix PrintBlockInfo()" ca509a33 Unify some entropy functions. 367bf903 fix PrintBlockInfo() b0547ff0 move back common constants for lossless_enc*.c into the .h fb4c7832 lossless: simpler alpha cleanup preprocessing ba7f4b68 Merge "anim_diff: add brief description of options" 47ddd5a4 Move some codec logic out of ./dsp . b4106c44 anim_diff: add brief description of options 357f455d yuv_sse2: fix 32-bit visual studio build b9d80fa4 configure: disable asserts by default 7badd3da cosmetic fix: sizeof(type) -> sizeof(*var) 80ce27d3 Speed up 24-bit packing / unpacking in YUV / RGB conversions. 68eebcb0 remove a TODO about rotation 2dee2966 remove few obsolete TODO about aligned loads in SSE2 e0c0bb34 remove TODO about unused ref_lf_delta[] 9cf1cc2b remove few TODO: * 256 -> RD_DISTO_MULT * don't use TDisto for UV mode picking 79189645 Merge changes from topic 'demux-fragment-cleanup' 47399f92 demux: remove GetFragment() d3cfb79a demux: remove dead fragment related TODO ab714b8a demux, Frame: remove is_fragment_ field b105921c yuv_sse2, cosmetics: fix indent 466c92e8 demux,WebPIterator: remove fragment_num/num_fragments 11714ff1 demux: remove WebPDemuxSelectFragment c0f7cc47 fix for bug #280: UMR in next->bits 578beeb8 Merge "enc/Makefile.am: add missing headers" 1a819f00 makefile.unix: make visibility=hidden the default d4f9c2ef enc/Makefile.am: add missing headers 846caff4 configure: check for -fvisibility=hidden 3f3ea2c5 demux: accept raw bitstreams d6dad5d0 man cwebp: add precision about exactness of the 'lossless' mode 46bb1e34 Merge "gifdec: remove utils.h include" 2b882e94 Merge "Makefile.vc: define WEBP_HAVE_GIF for gifdec.c" 892b9238 Merge "man/*, AUTHORS: clarify origin of the tool" e5687a18 Merge "fix optimized build with -mcmodel=medium" e56e6859 Makefile.vc: define WEBP_HAVE_GIF for gifdec.c 4077d944 gifdec: remove utils.h include b5e30dac man/*, AUTHORS: clarify origin of the tool b275e598 fix optimized build with -mcmodel=medium 64da45a9 cosmetics, cwebp: fix indent 038a060d Merge "add disto-based refinement for UV mode (if method = 1 or 2)" 2835089d Provide an SSE2 implementation of CombinedShannonEntropy. e6c93519 add disto-based refinement for UV mode (if method = 1 or 2) 04507dc9 Merge "fix undefined behaviour during shift, using a cast" 793c5261 Merge "wicdec: add support for reading from stdin" d3d16397 Optimize the heap usage in HistogramCombineGreedy. 202a710b fix undefined behaviour during shift, using a cast 14d27a46 improve method #2 by merging DistoRefine() and SimpleQuantize() cb1ce996 Merge "10% faster table-less SSE2/NEON version of YUV->RGB conversion" ac761a37 10% faster table-less SSE2/NEON version of YUV->RGB conversion 79fcf29a wicdec: add support for reading from stdin 015f173f Merge "cwebp: add support for stdin input" a9947c32 cwebp: add support for stdin input 7eb01ff3 Merge "Improved alpha cleanup for the webp encoder when prediction transform is used." fb8c9106 Merge "introduce WebPMemToUint32 and WebPUint32ToMem for memory access" bd91af20 Merge "bit_reader: remove aarch64 BITS TODO" 6c702b81 Speed up hash chain initialization using memset. 4c60f63c make ReadPNG and ReadJPEG take a filename instead of a FILE 464ed10f bit_reader: remove aarch64 BITS TODO d478e589 Merge "configure: update issue tracker" 69381113 Improved alpha cleanup for the webp encoder when prediction transform is used. 2c08aac8 introduce WebPMemToUint32 and WebPUint32ToMem for memory access 010ca3d1 Fix FindMatchLength with non-aligned buffers. a90e1e3f README: add prerequisites for an autoconf build 458f0866 configure: update issue tracker 33914595 vwebp: work around the transparent background with GLUT bug e4a7eed4 cosmetics: fix indent 08375129 Merge "Make a separate case for low_effort in CopyImageWithPrediction" aa2eb2d4 Merge "cosmetics: fix indent" b7551e90 cosmetics: fix indent 5bda52d4 Make a separate case for low_effort in CopyImageWithPrediction 66fa598a Merge "configure: fix intrinsics build w/older gcc" 5ae220be backward_references.c: Fixed compiler warning 1556da09 Merge "configure: restore 2 warnings" 71a17e58 configure: restore 2 warnings 9eeabc07 configure: fix intrinsics build w/older gcc 363babe2 Merge "fix some warning about unaligned 32b reads" a1411782 Optimization in hash chain comparison for 64 bit Arrays were compared 32 bits at a time, it is now done 64 bits at a time. Overall encoding speed-up is only of 0.2% on @skal's small PNG corpus. It is of 3% on my initial 1.3 Mp desktop screenshot image. 829bd141 Combine Huffman cost and bit entropy into one loop a7a954c8 Merge "lossless: make prediction in encoder work per scanline" 61b605b4 Merge "fix of undefined multiply (int32 overflow)" 239421c5 lossless: make prediction in encoder work per scanline f5ca40e0 fix of undefined multiply (int32 overflow) 5cd2ef4c Merge changes from topic 'win-threading-compat' 76ce9187 Makefile.vc: enable WEBP_USE_THREAD for windows phone d2afe974 thread: use CreateThread for windows phone 0fd0e12b thread: use WaitForSingleObjectEx if available 63fadc9f thread: use InitializeCriticalSectionEx if available 110ad583 thread: use native windows cond var if available 912c9fdf dec/webp: use GetLE(24|32) from utils f1694481 utils/GetLE32: correct uint32 promotion 158763de Merge "always call WebPInitSamplers(), don't try to be smart" 3770f3bb Merge "cleanup the YFIX/TFIX difference by removing some code and #define" a40f60a9 Merge "3% speed improvement for lossless webp encoder for low effort mode:" ed1c2bc6 always call WebPInitSamplers(), don't try to be smart b8c44f1a 3% speed improvement for lossless webp encoder for low effort mode: 997e1038 cleanup the YFIX/TFIX difference by removing some code and #define d73d1c8b Merge "Make discarding invisible RGB values (cleanup alpha) the default." 1f9be97c Make discarding invisible RGB values (cleanup alpha) the default. f240117b Make dwebp listen more to the -quiet flag b37b0179 fix for issue #275: don't compare to out-of-bound pointers 21735e06 speed-up trivial one-symbol decoding case for lossless 397863bd Refactor CopyPlane() and CopyPixels() methods: put them in utils. 6ecd72f8 Re-enable encoding of alpha plane with color cache for next release. 1f7148a4 Merge "remove unused fields from WebPDecoderOptions and WebPBitstreamFeatures" 6ae395fa Merge "use ExReadFile() for ReadYUV()" 8076a00e gitignore list: add anim_diff. 1c1702d8 use ExReadFile() for ReadYUV() 775d3a37 remove unused fields from WebPDecoderOptions and WebPBitstreamFeatures c13245c7 AnimEncoder: Add a GetError() method. 688b265d AnimDecoder API: Add a GetDemuxer() method. 1aa4e3d6 WebPAnimDecoder: add an option to enable multi-threaded decoding. 3584abca AnimDecoder: option to decode to common color modes. afd5a62c Merge "mux.h does NOT need to include encode.h" 8550d443 Merge "migrate anim_diff tool from C++ to C89" 96201e50 migrate anim_diff tool from C++ to C89 945cfa3b mux.h does NOT need to include encode.h 8da07e8d Merge "~2x faster SSE2 RGB24toY, BGR24toY, ARGBToY|UV" bfd3fc02 ~2x faster SSE2 RGB24toY, BGR24toY, ARGBToY|UV 02432427 man/cwebp.1, cosmetics: escape '-'s 96f5b423 man/cwebp: group lossy-only options 52fdbdfe extract some RGB24 to Luma conversion function from enc/ to dsp/ ab8c2300 add missing \n 8304179a sync NEWS with 0.4.4 5bd04a08 sync versions with 0.4.4 8f1fcc15 Merge "Move ARGB->YUV functions from dec/vp8l.c to dsp/yuv.c" 25bf2ce5 fix some warning about unaligned 32b reads 922268fd s/TIFF/WebP fa8927ef Move ARGB->YUV functions from dec/vp8l.c to dsp/yuv.c 9b373598 Merge "for ReadXXXX() image-readers, use the value of pic->use_argb" f7c507a5 Merge "remove unnecessary #include "yuv.h"" 7861578b for ReadXXXX() image-readers, use the value of pic->use_argb 14e4043b remove unnecessary #include "yuv.h" 469ba2cd vwebp: fix incorrect clipping w/NO_BLEND 4b9186b2 update issue tracker url d64d376c change WEBP_ALIGN_CST value to 31 f717b828 vp8l.c, cosmetics: fix indent after 95509f9 927ccdc4 Merge "fix alignment of allocated memory in AllocateTransformBuffer" fea94b2b fix alignment of allocated memory in AllocateTransformBuffer 5aa8d61f Merge "MIPS: rescaler code synced with C implementation" e7fb267d MIPS: rescaler code synced with C implementation 93c86ed5 Merge "format_constants.h: MKFOURCC, correct cast" 5d791d26 format_constants.h: MKFOURCC, correct cast 65726cd3 dsp/lossless: Average2, make a constant unsigned d26d9def Use __has_builtin to check clang support 12ec204e moved ALIGN_CST into util/utils.h and renamed WEBP_ALIGN_xxx a2640838 Merge "rescaler: ~20% faster SSE2 implementation for lossless ImportRowExpand" 3fb600d5 Merge "wicdec: fix alpha detection w/64bpp BGRA/RGBA" 67c547fd rescaler: ~20% faster SSE2 implementation for lossless ImportRowExpand 99e3f812 Merge "large re-organization of the delta-palettization code" 95509f99 large re-organization of the delta-palettization code 74fb458b fix for weird msvc warning message ae49ad86 Merge "SSE2 implementation of ImportRowShrink" 932fd4df SSE2 implementation of ImportRowShrink badfcbaa wicdec: fix alpha detection w/64bpp BGRA/RGBA 35cafa6c Merge "iosbuild: fix linking with Xcode 7 / iOS SDK 9" b0c9d8af label rename: NO_CHANGE -> NoChange b4e731cd neon-implementation for rescaler code db1321a6 iosbuild: fix linking with Xcode 7 / iOS SDK 9 6dfa5e3e rescaler: better handling of the fxy_scale=0 special case. 55c05293 Revert "rescaler: better handling of the fxy_scale=0 special case." 9f226bf8 rescaler: better handling of the fxy_scale=0 special case. f7b8f907 delta_palettization.*: add copyright c1e1b710 Changed delta palette to compress better 0dd28267 Merge "Add delta_palettization feature to WebP" 48f66b66 Add delta_palettization feature to WebP 27933e2a anim_encoder: drop a frame if it has same pixels as the prev frame. df9f6ec8 Merge "webpmux/DisplayInfo: send non-error output to stdout" 8af4993b Merge "rescaler_mips_dsp_r2: cosmetics, fix indent" 2b9d2495 Merge "rescaler: cosmetics, join two lines" cc020a8c webpmux/DisplayInfo: send non-error output to stdout a288e746 configure: add -Wshorten-64-to-32 c4c3cf2d pngdec: fix type conversion warnings bef8e97d webpmux: fix type conversion warning 5a84460d rescaler_mips_dsp_r2: cosmetics, fix indent acde0aae rescaler: cosmetics, join two lines 306ce4fd rescaler: move the 1x1 or 2x1 handling one level up cced974b remove _mm_set_epi64x(), which is too specific 56668c9f fix warnings about uint64_t -> uint32_t conversion 76a7dc39 rescaler: add some SSE2 code 1df1d0ee rescaler: harmonize function protos 9ba1894b rescaler: simplify ImportRow logic 5ff0079e fix rescaler vertical interpolation cd82440e VP8LAllocateHistogramSet: align histogram[] entries a406b1dd Merge "fix memory over-allocation in lossless rescaler init" 0fde33e3 add missing const in VP8InitFrame signature ac7d5e8d fix memory over-allocation in lossless rescaler init 017f8ccc Loosen the buffer size checks for Y/U/V/A too. 15ca5014 loosen the padding check on buffer size d623a870 dec_neon: add whitespace around stringizing operator 29377d55 dsp/mips: cosmetics: add whitespace around XSTR macro eebaf97f dsp/mips: add whitespace around stringizing operator d39dc8f3 Create a WebPAnimDecoder API. 03fb7522 gif2webp: print output file size 14efabbf Android: limit use of cpufeatures 7b83adbe preparatory cosmetics for Rescaler code fix and clean-up 77fb41c2 dec/vp8l/DecodeAlphaData: remove redundant cast 90fcfcd9 Insert less hash chain entries from the beginnings of long copies. bd55604d SSE2: add yuv444 converters, re-using yuv_sse2.c 41a5d99d add a -quiet option to 'dwebp' 80ab3edb Merge "README: update dwebp help output after 1e595fe" 32b71b2e README: update dwebp help output after 1e595fe 3ec11827 use the DispatchAlpha() call from dsp c5f00621 incorporate bzero() into WebPRescalerInit() instead of call site 3ebcdd41 remove duplicate "#include " 1e595fe1 dwebp: add -resize as a synonym for -scale 24a96932 dec: allow 0 as a scaling dimension b9187242 utils/rescaler: add WebPRescalerGetScaledDimensions 923e8eda Merge "update NEWS" 020fd099 Merge "WebPPictureDistortion: support ARGB format for 'pic' when computing distortion." 6a5292f6 update NEWS 56a2e9f5 WebPPictureDistortion: support ARGB format for 'pic' when computing distortion. 0ae582e4 configure: test and add -Wunreachable-code c2f9dc06 bit_writer: convert VP8L macro values to immediates b969f888 Reduce magic in palette reordering acb297e9 anim_diff: add a -raw_comparison flag 155c1b22 Merge changes I76f4d6fe,I45434639 717e4d5a mips32/mipsDSPr2: function ImportRow rebased 7df93893 fix rescaling bug (uninitialized read, see bug #254). 5cdcd561 lossless_enc_neon: add VP8LTransformColor a53c3369 lossless_neon: add VP8LTransformColorInverse 99131e7f Merge changes I9fb25a89,Ibc648e9e c4556766 simplify the main loop for downscaling 2a010f99 lossless_neon: remove predictors 5-13 ca221bbc ll_enc_neon: enable VP8LSubtractGreenFromBlueAndRed 585d93db Container spec: clarify ordering of ALPH chunk. 01d61fd9 lossless: ~20 % speedup f722c8f0 lossless: Speed up ComputeCacheEntropy by 40 % 1ceecdc8 add a VP8LColorCacheSet() method for color cache 17eb6099 lossless: Allow copying from prev row in rle-mode. f3a7a5bf lossless: bit writer optimization d97b9ff7 Merge changes from topic 'lossless-enc-improvements' 0250dfcc msvc: fix pointer type warning in BitsLog2Floor 52931fd5 lossless: combine the Huffman code with extra bits c4855ca2 lossless: Inlining add literal 8e9c94de lossless: simplify HashChainFindCopy heuristics 888429f4 lossless: 0.5 % compression density improvement 7b23b198 lossless: Add zeroes into the predicted histograms. 85b44d8a lossless: encoding, don't compute unnecessary histo d92453f3 lossless: Remove about 25 % of the speed degradation 2cce0317 Faster alpha coding for webp 5e75642e lossless: rle mode not to accept lengths smaller than 4. 84326e4a lossless: Less code for the entropy selection 16ab951a lossless: 0.37 % compression density improvement 822f113e add WebPFree() to the API 0ae2c2e4 SSE2/SSE41: optimize SSE_16xN loops 39216e59 cosmetics: fix indent after 32462a07 559e54ca Merge "SSE2: slightly faster FTransformWHT" 8ef9a63b SSE2: slightly faster FTransformWHT f27f7735 lossless_neon: enable VP8LAddGreenToBlueAndRed 36e9c4bc SSE2: minor cosmetrics on in-loop filter code 4741fac4 dsp/lossless_*sse2: remove some unnecessary inlines 1819965e fix warning ("left shift of negative value") using a cast 70170014 SSE2: speed-up some lossless-encoding functions abcb0128 Merge "SSE2: slightly faster (~5%) AddGreenToBlueAndRed()" 2df5bd30 Merge "Speedup to HuffmanCostCombinedCount" 9e356d6b SSE2: slightly faster (~5%) AddGreenToBlueAndRed() fc6c75a2 SSE2: 53% faster TransformColor[Inverse] 49073da6 SSE2: 46% speed-up of TransformColor[Inverse] 32462a07 Speedup to HuffmanCostCombinedCount f3d687e3 SSE4.1 implementation of some lossless encoding functions bfc300c7 SSE4.1 implementation of some alpha-processing functions 7f9c98f2 Merge "sse2 in-loop: simplify SignedShift8b() a bit" ef314a5d dec_sse2/GetNotHEV: micro optimization a729cff9 sse2 in-loop: simplify SignedShift8b() a bit 422ec9fb simplify Load8x4() a bit 8df238ec Merge "remove some duplicate FlipSign()" 751506c4 remove some duplicate FlipSign() 65ef5afc Merge "lossless: 0.13% compression density gain" 2beef2f2 lossless: 0.13% compression density gain 3033f24c lossless: 0.06 % compression density improvement 64960da9 dec_neon: add VE8uv / VE16 14dbd87b dec_neon: add HE8uv / HE16 ac768011 introduce FTransform2 to perform two transforms at a time. aa6065ae dec_neon: use vld1_dup(mem) rather than vdup(mem[0]) 8b63ac78 Merge "dec_neon: add TM16" f51be09e Merge "dec_neon/TrueMotion: simply left border load" dc48196b dec_neon: add TM16 ea95b305 dec_neon/TrueMotion: simply left border load f262d612 speed-up SetResidualSSE2 bf46d0ac fix mips2 build target 929a0fdc enc_sse2/TTransform: simplify abs calculation 17dbd058 enc_sse2/CollectHistogram: simplify abs calculation a6c15936 dec_neon: add DC16 intra predictors 03b4f50d Makefile.vc: add anim_diff build support. 1b989874 Merge changes I9cd84125,Iee7e387f,I7548be72 acd7b5af Introduce a test tool anim_diff. f274a96c dsp/enc_sse2: add luma4 intra predictors 040b11bd dsp/enc_sse2: add chroma intra predictors aee021bb dsp/enc_sse2: add luma16 intra predictors 9e00a499 makefile.unix: remove superclean target cefc9c09 makefile.unix: clean up after extras target 4c9af023 dec_neon: add DC8uvNoTopLeft dd55b873 Merge "doc/webp-container-spec: update repo browser link" f0486968 doc/webp-container-spec: update repo browser link 9287761d Merge "GetResidualCostSSE2: simplify abs calculation" 0e009366 dsp/cpu.c(x86): check maximum supported cpuid feature b243a4bc GetResidualCostSSE2: simplify abs calculation 6d4602b8 Merge "fix typo: constitutes -> constitute" 5fe1fe37 fix typo: constitutes -> constitute b83bd7c4 Merge "populate 'libwebpextras' with: import gray, rgb565 and rgb4444 functions" b0114a32 Merge "histogram.h: cosmetics: remove unnecessary includes" feab45ef gifdec: Move inclusion of webp/config.h to header. dbba67d1 histogram.h: cosmetics: remove unnecessary includes e978fec6 Merge "VP8LBitReader: fix remaining ubsan error with large shifts" d6fe5884 Merge "ReconstructRow: move some one-time inits out of the main loop" a21d647c ReconstructRow: move some one-time inits out of the main loop 7a01c3c3 VP8LBitReader: fix remaining ubsan error with large shifts 7fa67c9b change GetPixPairHash64() return type to uint32_t ec1fb9f8 Merge "dsp/enc.c: cosmetics: move DST() def closer to use" 7073bfb3 Merge "split 64-mult hashing into two 32-bit multiplies" 0768b252 dsp/enc.c: cosmetics: move DST() def closer to use 6a48b8f0 Merge "fix MSVC size_t->int conversion warning" 1db07cde Merge "anim_encode: cosmetics: fix alignment" e28271a3 anim_encode: cosmetics: fix alignment 7fe357b8 split 64-mult hashing into two 32-bit multiplies af74c145 populate 'libwebpextras' with: import gray, rgb565 and rgb4444 functions 61214134 remove VP8Residual::cost unused field e2544823 fix MSVC size_t->int conversion warning b69a6c35 vwebp: don't redefine snprintf with VS2015+ 0ac29c51 AnimEncoder API: Consistent use of trailing underscores in struct. d4845550 AnimEncoder API: Use timestamp instead of duration as input to Add(). 9904e365 dsp/dec_sse2: DC8uv / DC8uvNoLeft speedup 7df20497 dsp/dec_sse2: DC16 / DC16NoLeft speedup 8e515dfe Merge "makefile.unix: add some missing headers" db12250f cosmetics: vp8enci.h: break long line bf516a87 makefile.unix: add some missing headers b44eda3f dsp: add DSP_INIT_STUB 03e76e96 clarify the comment about double-setting the status in SetError() 9fecdd71 remove unused EmitRGB() 43f010dd move ReconstructRow to top 82d98020 add a dec/common.h header to collect common enc/dec #defines 5d4744a2 Merge "enc_sse41: add Disto4x4 / Disto16x16" e38886a7 mux.h: Bump up ABI version 46305ca6 configure: add --disable- 2fc8b658 CPPFLAGS->CFLAGS for detecting sse4.1 in preprocessor 1a338fb3 enc_sse41: add Disto4x4 / Disto16x16 94055503 encoding SSE4.1 stub for StoreHistogram + Quantize + SSE_16xN c64659e1 remove duplicate variables after the lossless{_enc}.c split 67ba7c7a enc_sse2: call local FTransform in CollectHistogram 18249799 dsp: s/VP8LSetHistogramData/VP8SetHistogramData/ ede5e158 cosmetics: dsp/lossless.h: reorder prototypes 553051f7 dsp/lossless: split enc/dec functions 9064adc8 Merge "conditionally add -msse4.1 in Makefile.unix" cecf5096 dsp/yuv*.c: rework WEBP_USE_ ifdef 6584d398 dsp/upsampling*.c: rework WEBP_USE_ ifdef 80809422 dsp/rescaler*.c: rework WEBP_USE_ ifdef 1d93ddec dsp/lossless*.c: rework WEBP_USE_ ifdef 73805ff2 dsp/filters*.c: rework WEBP_USE_ ifdef fbdcef24 dsp/enc*.c: rework WEBP_USE_ ifdef 66de69c1 dsp/dec*.c: rework WEBP_USE_ ifdef 48e4ffd1 dsp/cost*.c: rework WEBP_USE_ ifdef 29fd6f90 dsp/argb*.c: rework WEBP_USE_ ifdef 80ff3813 dsp/alpha*.c: rework WEBP_USE_ ifdef bf09cf1e conditionally add -msse4.1 in Makefile.unix e9570dd9 stub for SSE4.1 support. 4a95384b Merge "dsp: add sse4.1 detection" cabf4bd2 dsp: add sse4.1 detection 4ecba1ab thread.h: rename interface param b8d706c8 Merge "sync versions with 0.4.3" ae64a711 Merge "add shell for libwebpextras" 92a5da9c sync versions with 0.4.3 9d4e2d16 Merge "~30% faster smart-yuv (-pre 4) with early-out criterion" b1bdbbab ~30% faster smart-yuv (-pre 4) with early-out criterion 7efb9748 Merge "Disable NEON code on Native Client" ac4f5784 Disable NEON code on Native Client 0873f85b AnimEncoder API: Support input frames in YUV(A) format. 5c176d2d add shell for libwebpextras 44bd9561 fix signature for VP8RecordCoeffTokens() c9b8ea0e small cosmetics on TokenBuffer. 76394c09 Merge "MIPS: dspr2: added optimization for TrueMotion" 0f773693 WebPPictureRescale: add a note about 0 width/height 241bb5d9 MIPS: dspr2: added optimization for TrueMotion 6cef0e4f examples/Android.mk: add webpmux_example target 53c16ff0 Android.mk: add webpmux target 21852a00 Android.mk: add webpdemux target 8697a3bc Android.mk: add webpdecoder{,_static} targets 4a670491 Android.mk: split source lists per-directory b5e79422 MIPS: dspr2: Added optimization for some convert functions 0f595db6 MIPS: dspr2: Added optimization for some convert functions 8a218b4a MIPS: [mips32|dspr2]: GetResidualCost rebased ef987500 Speedup method StoreImageToBitMask by 5%. 602a00f9 fix iOS arm64 build with Xcode 6.3 23820507 1-2% faster encoding by removing an indirection in GetResidualCost() eddb7e70 MIPS: dspr2: added otpimization for DC8uv, DC8uvNoTop and DC8uvNoLeft 73ba2915 MIPS: dspr2: added optimization for functions RD4 and LD4 c7129da5 Merge "4-5% faster encoding using SSE2 for GetResidualCost" 94380d00 MIPS: dspr2: added optimizaton for functions VE4 and DC4 2a407092 4-5% faster encoding using SSE2 for GetResidualCost 17e19862 Merge "MIPS: dspr2: added optimization for simple filtering functions" 3ec404c4 Merge "dsp: normalize WEBP_TSAN_IGNORE_FUNCTION usage" b969f5df dsp: normalize WEBP_TSAN_IGNORE_FUNCTION usage d7b8e711 MIPS: dspr2: added optimization for simple filtering functions 235f774e Merge "MIPS: dspr2: Added optimization for function VP8LTransformColorInverse_C" 42a8a628 MIPS: dspr2: Added optimization for function VP8LTransformColorInverse_C b442bef3 Merge "ApplyFiltersAndEncode: only copy lossless stats" b510fbfe doc/webp-container-spec: note MSB order for chunk diagrams 9bc0f922 ApplyFiltersAndEncode: only copy lossless stats 3030f115 Merge "dsp/mips: add some missing TSan annotations" dfcf4593 Merge "MIPS: dspr2: Added optimization for function VP8LAddGreenToBlueAndRed_C" 55c75a25 dsp/mips: add some missing TSan annotations 2cb879f0 MIPS: dspr2: Added optimization for function VP8LAddGreenToBlueAndRed_C e1556010 move some cost tables from enc/ to dsp/ c3a03168 Merge "picture_csp: fix build w/USE_GAMMA_COMPRESSION undefined" 39537d7c Merge "VP8LDspInitMIPSdspR2: add missing TSan annotation" 1dd419ce picture_csp: fix build w/USE_GAMMA_COMPRESSION undefined 43fd3543 VP8LDspInitMIPSdspR2: add missing TSan annotation c7233dfc Merge "VP8LDspInit: remove memcpy" 0ec4da96 picture_csp::InitGammaTables*: add missing TSan annotations 35579a49 VP8LDspInit: remove memcpy 97f6aff8 VP8YUVInit: add missing TSan annotation f9016d66 dsp/enc::InitTables: add missing TSan annotation e3d9771a VP8EncDspCostInit*: add missing TSan annotations d97c143d Merge "doc/webp-container-spec: cosmetics" 309b7908 MIPS: mips32: Added optimization for function SetResidualCoeffs a987faed MIPS: dspr2: added optimization for function GetResidualCost e7d3df23 doc/webp-container-spec: cosmetics be6635e9 Merge "VP8TBufferClear: remove some misleading const's" 02971e72 Merge "VP8EmitTokens: remove unnecessary param void cast" 3b77e5a7 VP8TBufferClear: remove some misleading const's aa139c8f VP8EmitTokens: remove unnecessary param void cast c24d8f14 cosmetics: upsampling_sse2: add const to some casts 1829c42c cosmetics: lossless_sse2: add const to some casts 183168f3 cosmetics: enc_sse2: add const to some casts 860badca cosmetics: dec_sse2: add const to some casts 0254db97 cosmetics: argb_sse2: add const to some casts 1aadf856 cosmetics: alpha_processing_sse2: add const to some casts 1579de3c vwebp: clear canvas at the beginning of each loop 4b9fa5d0 Merge "webp-container-spec: clarify background clear on loop" 4c82284d Updated the near-lossless level mapping. 56039479 webp-container-spec: clarify background clear on loop 19f0ba0e Implement true-motion prediction in SSE2 774d4cb7 make VP8PredLuma16[] array non-const d7eabb80 Merge "MIPS: dspr2: Added optimization for function CollectHistogram" fe42739c Use integers for kmin/kmax for simplicity. b9df35f7 AnimEncode API: kmax=0 should imply all keyframes. 6ce296da MIPS: dspr2: Added optimization for function CollectHistogram 2c906c40 vwebp: remove unnecessary static Help() prototype be0fd1d5 Merge "dec/vp8: clear 'dither_' on skipped blocks" e96170fe Merge "vwebp/animation: display last frame on end-of-loop" 0f017b56 vwebp/animation: display last frame on end-of-loop c86b40cc enc/near_lossless.c: fix alignment 66935fb9 dec/vp8: clear 'dither_' on skipped blocks b7de7946 Merge "lossless_neon: enable subtract green for aarch64" 77724f70 SSE2 version of GradientUnfilter 416e1cea lossless_neon: enable subtract green for aarch64 72831f6b Speedup AnalyzeAndInit for low effort compression. a6597483 Speedup Analyze methods for lossless compression. 98c81386 Enable Near-lossless feature. c6b24543 AnimEncoder API: Fix for kmax=1 and default kmin case. 022d2f88 add SSE2 variants for alpha filtering functions 2db15a95 Temporarily disable encoding of alpha plane with color cache. 1d575ccd Merge "Lossless decoding: Remove an unnecessary if condition." cafa1d88 Merge "Simplify backward refs calculation for low-effort." 7afdaf84 Alpha coding: reorganize the filter/unfiltering code 4d6d7285 Simplify backward refs calculation for low-effort. ec0d1be5 Cleaup Near-lossless code. 9814ddb6 Remove the post-transform near-lossless heuristic. 4509e32e Lossless decoding: Remove an unnecessary if condition. f2ebc4a8 Merge "Regression fix for lossless decoding" 783a8cda Regression fix for lossless decoding 9a062b8e AnimEncoder: Bugfix for kmin = 1 and kmax = 2. 0f027a72 simplify smart RGB->YUV conversion code 0d5b334e BackwardReferencesHashChainFollowChosenPath: remove unused variable f480d1a7 Fix to near lossless artefacts on palettized images. d4615d08 Merge changes Ia1686828,I399fda40 cb4a18a7 rename HashChainInit into HashChainReset f079e487 use uint16_t for chosen_path[] da091212 MIPS: dspr2: Added optimization for function FTransformWHT b8c20135 Merge "wicdec: (msvs) quiet some /analyze warnings" 9b228b54 wicdec: (msvs) quiet some /analyze warnings daeb276a Merge "MIPS: dspr2: Added optimization for MultARGBRow function" cc087424 Merge "dsp/cpu: (msvs) add include for __cpuidex" 4a82aab5 Merge changes I87544e92,I0bb6cda5 7a191398 dwebp/WritePNG: mark png variables volatile 775dfad2 dwebp: include setjmp.h w/WEBP_HAVE_PNG 47d26be7 dwebp: correct sign in format strings f0e0677b VP8LEncodeStream: add an assert c5f7747f VP8LColorCacheCopy: promote an int before shifting 0de5f33e dsp/cpu: (msvs) add include for __cpuidex 7d850f7b MIPS: dspr2: Added optimization for MultARGBRow function 54875293 MIPS: dspr2: added optimization for function QuantizeBlock 4fbe9cf2 dsp/cpu: (msvs) avoid immintrin.h on _M_ARM 3fd59039 simplify/reorganize arguments for CollectColorBlueTransforms b9e356b9 Disable costly TraceBackwards for method=0. a7e7caa4 MIPS: dspr2: added optimization for function TransformColorRed 2cb39180 Merge "MIPS: dspr2: added optimization for function TransformColorBlue" 279e6613 Merge "dsp/cpu: add include for _xgetbv() w/MSVS" b6c0428e dsp/cpu: add include for _xgetbv() w/MSVS d1c4ffae gif2webp: Move GIF decoding related code to a support library. 07c39559 Merge "AnimEncoder API: Add info in README.mux" 7b161973 MIPS: dspr2: added optimization for function TransformColorBlue d7c4b02a cpu: fix AVX2 detection for gcc/clang targets 9d299469 AnimEncoder API: Add info in README.mux d581ba40 follow-up: clean up WebPRescalerXXX dsp function f8740f0d dsp: s/USE_INTRINSICS/WEBP_USE_INTRINSICS/ ce73abe0 Merge "introduce a separate WebPRescalerDspInit to initialize pointers" ab66beca introduce a separate WebPRescalerDspInit to initialize pointers 205c7f26 fix handling of zero-sized partition #0 corner case cbcdd5ff Merge "move rescaler functions to rescaler* files in src/dsp/" bf586e88 Merge changes I230b3532,Idf3057a7 6dc79dc2 Merge "anim_encode: fix type conversion warnings" 11fce25a Merge "dec_neon: remove returns from void functions" c4e63f99 Makefile.vc: add gif2webp target 4f43d38c enable NEON for Windows ARM builds 3f6615ac Makefile.vc: add rudimentary Windows ARM support e7c5954c dec_neon: remove returns from void functions f79c163b anim_encode: fix type conversion warnings 0f54f1ec Remove gif2webp_util which is no longer needed. cbcbedd0 move rescaler functions to rescaler* files in src/dsp/ ac79ed19 webpmux: remove experimental fragment handling e8694d4d mux: remove experimental FRGM parsing 9e92b6ea AnimEncoder API: Optimize single-frame animated images abbae279 Merge "Move over gif2webp to the new AnimEncoder API." a28c4b36 MIPS: move WORK_AROUND_GCC define to appropriate place 012d2c60 MIPS: dspr2: added optimization for functions SSEAxB 67720c8b Move over gif2webp to the new AnimEncoder API. 9241ecf4 MIPS: dspr2: added optimization for function Average 9422211d Merge "Tune BackwardReferencesLz77 for low_effort (m=0)." df40057b Merge "Speedup VP8LGetHistoImageSymbols for low effort (m=0) mode." ea08466d Tune BackwardReferencesLz77 for low_effort (m=0). b0b973c3 Speedup VP8LGetHistoImageSymbols for low effort (m=0) mode. c6d32927 argb_sse2: cosmetics 67f601cd make the 'last_cpuinfo_used' variable names unique b9489861 AnimEncoder API: Init method for default options. 856f8ec1 Merge "AnimEncoder API: Remove AnimEncoderFrameOptions." c537514d Merge "AnimEncoder API: GenerateCandidates bugfix." dc0ce039 Merge "AnimEncoder API: Compute change rectangle for first frame too." f00b639b Merge "AnimEncoder API: In Assemble(), always set animation parameters." 29ed796c Merge "AnimEncoder lib cleanup: prev to prev canvas not needed." 9f0dd6e5 Merge "WebPAnimEncoder API: Header and implementation" 5e56bbe0 AnimEncoder API: Remove AnimEncoderFrameOptions. b902c3ea AnimEncoder API: GenerateCandidates bugfix. ef3c39bb AnimEncoder API: Compute change rectangle for first frame too. eec423ab AnimEncoder API: In Assemble(), always set animation parameters. ae1c046e AnimEncoder lib cleanup: prev to prev canvas not needed. 4b997ae4 WebPAnimEncoder API: Header and implementation 72208bec move argb_*.o build target to encoder list 95920538 Merge "multi-thread fix: lock each entry points with a static var" 4c1b300a Merge "SSE2 implementation of VP8PackARGB" fbcc2004 Merge "add -Wformat-nonliteral and -Wformat-security" 80d950d9 add -Wformat-nonliteral and -Wformat-security 04c20e75 Merge "MIPS: dspr2: added optimization for function Intra4Preds" a437694a multi-thread fix: lock each entry points with a static var ca7f60db SSE2 implementation of VP8PackARGB 72d573f6 simplify the PackARGB signature 4e2589ff demux: restore strict fragment flag check 4ba8e074 Merge "webp-container-spec: remove references to fragments" e752f0a6 Merge "demux: remove experimental FRGM parsing" f8abb112 Merge changes I109ec4d9,I73fe7743 ae2188a4 MIPS: dspr2: added optimization for function Intra4Preds 1f4b8642 move VP8EncDspARGBInit() call closer to where it's needed 14108d78 dec_neon: add DC8uvNoTop / DC8uvNoLeft d8340da7 dec_neon: add DC8uv a66e66c7 webp-container-spec: remove references to fragments 7ce8788b MIPS: dspr2: added optimization for function MakeARGB32 012e623d demux: remove experimental FRGM parsing 87c3d531 method=0: Don't evaluate any predictor 6f4fcb98 Merge "MIPS: dspr2: added optimization for function ImportRow" 24284459 replace unneeded calls to HistogramCopy() by swaps bdf7b40c MIPS: dspr2: added optimization for function ImportRow e66a9225 Merge "MIPS: dspr2: added optimization for function ExportRowC" c279fec1 MIPS: dspr2: added optimization for function ExportRowC 31a9cf64 Speedup WebP lossless compression for low effort (m=0) mode with following: - Disable Cross-Color transform. - Evaluate predictors #11 (paeth), #12 and #13 only. 9275d91c MIPS: dspr2: added optimization for function TrueMotion 26106d66 Merge "enc_neon: fix building with non-Xcode clang (iOS)" 1c4e3efe unroll the kBands[] indirection to remove a dereference in GetCoeffs() a3946b89 enc_neon: fix building with non-Xcode clang (iOS) 8ed9c00d Merge "simplify the Histogram struct, to only store max_value and last_nz" bad77571 simplify the Histogram struct, to only store max_value and last_nz 3cca0dc7 MIPS: dspr2: Added optimization for DCMode function 37e395fd MIPS: fix functions to use generic BPS istead of hardcoded value 9475bef4 PickBestUV: fix VP8Copy16x8 invocation 441f273f Merge changes I55f8da52,Id73a1e96 4a279a68 cosmetics: add some missing != NULL comparisons 66ad3725 factorize BPS definition in dsp.h and add VP8Copy16x8 432e5b55 make ALIGN_xxx naming consistent 57606047 encoder: switch BPS to 32 instead of 16 1b66bbe9 MIPS: dspr2: added optimization for function TransformColor_C c6d0f9e7 histogram: cosmetics f399d307 Merge changes I6eac17e5,I32d2b514 9de9074c dec_neon: add TM8uv 8e517eca bit_reader/kVP8NewRange: range_t -> uint8_t e1857139 dsp: initialize VP8PredChroma8 in VP8DspInit() e0c809ad Move Entropy methods to lossless.c a96ccf8f iosbuild: add x64_64 simulator support a0df5510 Remove handling for WEBP_HINT_GRAPH 413dfc0c Move static method definition before its usage. 0f235665 Update BackwardRefsWithLocalCache. d69e36ec Remove TODOs from lossless encoder code. fdaac8e0 Optmize VP8LGetBackwardReferences LZ77 references. 2f0e2ba8 MIPS: dspr2: added optimization for function Select a3e79a46 Merge "WebPEncode: Support encoding same pic twice (even if modified)" e4f4dddb WebPEncode: Support encoding same pic twice (even if modified) cbc3fbb4 Merge "Updated VP8LGetBackwardReferences and color cache." 95a9bd85 Updated VP8LGetBackwardReferences and color cache. 54f2c14c MIPS: dspr2: added optimization for function FTransform aa42f423 MIPS: dspr2: Added optimization for function VP8LSubtractGreenFromBlueAndRed 11a25f75 Merge "FlattenSimilarBlocks should only be tried when blending is possible." 5cccdadf FlattenSimilarBlocks should only be tried when blending is possible. 95ca44a7 MIPS: dspr2: added optimization for Disto4x4 4171b672 backward_references.c: reindent after c8581b0 c8581b06 Optimize BackwardReferences for RLE encoding. 5798eee6 MIPS: dspr2: unfilters bugfix (Ie7b7387478a6b5c3f08691628ae00f059cf6d899) 4167a3f5 Optimize backwardreferences d18554c3 Merge "webp/types.h: use inline for clang++/-std=c++11" 7489b0e7 gif2webp: Add '-min-size' option to get best compression. 77bdddf0 Speed up BackwardReferences 6638710b webp/types.h: use inline for clang++/-std=c++11 abf04205 Enable entropy based merge histo for (q<100) 572022a3 filters_mips_dsp_r2.c: disable unfilters a28e21b1 MIPS: dspr2: Added optimization for function ClampedAddSubtractFull 18d5a1ef MIPS: dspr2: added optimization for function ClampedAddSubtractHalf 829a8c19 MIPS: dspr2: added optimization for ITransform c94ed49e gif2webp: Use the default hint instead of WEBP_HINT_GRAPH. 653ace55 Increase the MAX_COLOR_CACHE_BITS from 9 to 10. 919220c7 Change the logic adjusting the Histogram bits. 53b096c0 Merge "Fix bug in VP8LCalculateEstimateForCacheSize." e912bd55 Fix bug in VP8LCalculateEstimateForCacheSize. 541d7839 Merge "dec_neon: add RD4 intra predictor" f8cd0672 Merge "Makefile.vc: add a 'legacy' RTLIBCFG option" 22881c99 dec_neon: add RD4 intra predictor 613d281e update NEWS 1304eb34 Merge "dec_neon: DC4: use pair-wise adds for top row" 34c20c06 Makefile.vc: add a 'legacy' RTLIBCFG option 7083006b Merge "dsp/dec_{neon,sse2}: VE4: normalize variable names" 0db9031c dsp/dec_{neon,sse2}: VE4: normalize variable names b5bc1530 dec_neon: DC4: use pair-wise adds for top row 5b90d8fe Unify the API between VP8BitWriter and VP8LBitWriter f7ada560 Merge changes I2e06907b,Ia9ed4ca6,I782282ff 5beb6bf0 Merge "dec_neon: add VE4 intra predictor" eba6ce06 dec_neon: add DC4 intra predictor 79abfbd9 dec_neon: add TM4 intra predictor fe395f0e dec_neon: add LD4 intra predictor 32de385e dec_neon: add VE4 intra predictor 72395ba9 Merge "Modify CostModel to allocate optimal memory." 65e5eb8a gif2webp: Support GIF_DISPOSE_RESTORE_PREVIOUS e4c829ef gif2webp: Handle frames with odd offsets + disposal to background. c2b5a039 Modify CostModel to allocate optimal memory. b7a33d7e implement VE4/HE4/RD4/... in SSE2 97c76f1f make VP8PredLuma4[] non-const and initialize array in VP8DspInit() 0ea8c6c2 Merge "PrintReg: output to stderr" d7ff2f97 Merge "stopwatch.h: fix includes" f85ec712 PrintReg: output to stderr 54edbf65 stopwatch.h: fix includes 139142e4 Optimize BackwardReferenceHashChainFollowPath. 5f36b68d enc/backward_references.c: fix indent e0e9960d Merge "sync version numbers to 0.4.2 release" 64ac5144 sync version numbers to 0.4.2 release c24f8954 Simplify and speedup Backward refs computation. d1c359ef fix shared object build with -fvisibility=hidden a4c3a31b WEBP_TSAN_IGNORE_FUNCTION: fix gcc compat warning f358eeb8 add code for testing random incremental decoding in dwebp 80247291 mark some init function as being safe for thread_sanitizer. 79b5bdbf bit_reader.h: cosmetics: fix a typo 6c673681 Improved near-lossless mode. 0ce27e71 enc_mips32: workaround gcc-4.9 bug aca1b98f enc/vp8l.c: fix indent ca005027 Evaluate non-palette compression for palette image c8a87bb6 AssignSegments: quiet -Warray-bounds warning 32f67e30 Merge "enc_neon: initialize vectors w/vdup_n_u32" fabc65da 1-3% faster encoding optimizing SSE_NxN functions 7534d716 enc_neon: initialize vectors w/vdup_n_u32 5f813912 Merge "Fix return code of EncodeImageInternal()" e321abe4 Fix return code of EncodeImageInternal() f82cb06a optimize palette ordering f545feee don't set the alpha value for histogram index image 2d9b0a44 add WebPDispatchAlphaToGreen() to dsp 1bd4c2ad Merge "Change Entropy based Histogram Combine heuristic." e295b8f1 Merge "iosbuild: cleanup" 1be4e760 Merge "iosbuild: output autoconf req. on failure" d5e498d4 Change Entropy based Histogram Combine heuristic. 47a2d8e1 fix MSVC float->int conversion warning 041956f6 iosbuild: cleanup 767eb402 iosbuild: output autoconf req. on failure 35ad48b8 HistoHeapInit: correct positions allocation size 45d9635f lossless: entropy clustering for high qualities. dc37df8c fix type warning for VS9_x64 9f7d9e6d iosbuild: make iOS 6 the minimum requirement fdd6528b Remove unused VP8LDecoder member variable ea3bba5a Merge "rewrite Disto4x4 in enc_neon.c with intrinsic" f060dfc4 add lossless incremental decoding support ab70794d rewrite Disto4x4 in enc_neon.c with intrinsic d4471637 MIPS: dspr2: added optimization for function FilterLoop24 2aef54d4 Merge "prepare VP8LDecodeImage for incremental decode" aed0f5a2 Merge "MIPS: dspr2: added optimization for function FilterLoop26" 28630685 prepare VP8LDecodeImage for incremental decode 248f3aed remove br->error_ field 49e15044 MIPS: dspr2: added optimization for function FilterLoop26 38128cb9 iobuild.sh: only install .h files in Headers c792d412 Premultiply with alpha during U/V downsampling 0cc811d7 gif2webp: Background color correction d7167ff7 Amend the lossless spec according to issue #205, #206 and #224 b901416b Record the lossless size stats. cddd3340 Add a WebPExtractAlpha function to dsp 0716a98e fix indent after I0204949917836f74c0eb4ba5a7f4052a4797833b f9ced95a Optimize lossless decoding for trivial(ARB) codes. 924fcfd9 Merge "webpmux: simplify InitializeConfig()" c0a462ca webpmux: simplify InitializeConfig() 6986bb5e webpmux: fix indent f89e1690 webpmux: fix exit status on numeric value parse error 2172cb62 Merge "webpmux: fix loop_count range check" e3b343ec Merge "examples: warn on invalid numeric parameters" 0e23c487 webpmux: fix loop_count range check 6208338a Merge "fix loop bug in DispatchAlpha()" d51f3e40 gif2webp: Handle frames with missing graphic control extension 690b491a fix loop bug in DispatchAlpha() 96d43a87 examples: warn on invalid numeric parameters 3101f537 MIPS: dspr2: added optimization for TransformOne a6bb9b17 SSE2 for inverse Mult(ARGB)Row and ApplyAlphaMultiply d84a8ffd Remove default initialization of decoder status. be70b86c configure: simplify libpng-config invocation e0a99321 Rectify bug in lossless incremental decoding. e2502a97 MIPS: dspr2: added optimization for TransformAC3 24e1072a MIPS: dspr2: added optimization for TransformDC c0e84df8 Merge "Slightly faster lossless decoding (1%)" 8dd28bb5 Slightly faster lossless decoding (1%) f0103595 MIPS: dspr2: added optimization for ColorIndexInverseTransforms d3242aee make VP8LSetBitPos() set br->eos_ flag a9decb55 Lossless decoding: fix eos_ flag condition 3fea6a28 fix erroneous dec->status_ setting 80b8099f MIPS: dspr2: add some specific mips code to commit I2c3f2b12f8df15b785fad5a9c56316e954ae0c53 e5640625 Merge "further refine the COPY_PATTERN optim for DecodeAlpha" 854509fe enc/histogram.c: reindent after f4059d0 34421964 Merge "~3-5% faster encoding optimizing PickBestIntra*()" 865069c1 further refine the COPY_PATTERN optim for DecodeAlpha a5956228 added C-level optimization for DecodeAlphaData function 187d379d add a fallback to ALPHA_NO_COMPRESSION a48a2d76 ~3-5% faster encoding optimizing PickBestIntra*() a6140194 ExUtilReadFromStdin: (windows) open stdin in bin mode e80eab1f webpmux: (windows) open stdout in binary mode e9bfb116 cwebp: (windows) open stdout in binary mode 5927e15b example_util: add ExUtilSetBinaryMode 30f3b75b webpmux man page: Clarify some title, descriptions and examples 77d4c7e3 address cosmetic comments from patch #71380 f75dfbf2 Speed up Huffman decoding for lossless 637b3888 dsp/lossless: workaround gcc-4.9 bug on arm 8323a903 dsp.h: collect gcc/clang version test macros e6c4b52f move static initialization of WebPYUV444Converters[] to the Init function. 49911d4d Merge "fix indentation" f4059d0c Code cleanup for HistogramRemap. e632b092 fix indentation f5c04d64 Merge "add a DispatchAlpha() for SSE2 that handles 8 pixels at a time" fc98edd9 add a DispatchAlpha() for SSE2 that handles 8 pixels at a time 73d361dd introduce VP8EncQuantize2Blocks to quantize two blocks at a time 0b21c30b MIPS: dspr2: added optimization for EmitAlphaRGB 953acd56 enc_neon: enable QuantizeBlock for aarch64 f4ae1437 MIPS: mips32: code rebase 56977154 MIPS: dspr2: added optimizations for VP8YuvTo* 2523aa73 SmartRGBYUV: fix odd-width problem with pixel replication ee52dc4e fix some MSVC64 warning about float conversion 3fca851a cpu: check for _MSC_VER before using msvc inline asm e2a83d71 faster RGB->YUV conversion function (~7% speedup) de2d03e1 Merge "Add smart RGB->YUV conversion option -pre 4" 3fc4c539 Add smart RGB->YUV conversion option -pre 4 b4dc4069 MIPS: dspr2: added optimization for (un)filters 137e6090 Merge "configure: add work around for gcc-4.9 aarch64 bug" b61c9cec MIPS: dspr2: Optimization of some simple point-sampling functions e2b8cec0 configure: add work around for gcc-4.9 aarch64 bug 98c54107 MIPS: mips32r2: added optimization for BSwap32 dab702b3 Update PATENTS to reflect s/VP8/WebM/g b564f7c7 Merge "MIPS: detect mips32r6 and disable mips32r1 code" b7e5a5c4 MIPS: detect mips32r6 and disable mips32r1 code 63c2fc02 Correctly use the AC_CANONICAL_* macros bb07022b Merge "cosmetics" e300c9d8 cosmetics 0e519eea Merge "cosmetics: remove some extraneous 'extern's" 3ef0f08a Merge "vp8enci.h: cosmetics: fix '*' placement" 4c6dde37 bit_writer: cosmetics: rename kFlush() -> Flush() f7b4c48b cosmetics: remove some extraneous 'extern's b47fb00a vp8enci.h: cosmetics: fix '*' placement b5a36cc9 add -near_lossless [0..100] experimental option 0524d9e5 dsp: detect mips64 & disable mips32 code d3485d96 cwebp.1: fix quality description placement 29a9fe22 Merge tag 'v0.4.1' 8af27718 update ChangeLog (tag: v0.4.1, origin/0.4.1) e09e9ff6 Record & log the image pre-processing time. f59c0b4b iosbuild.sh: specify optimization flags 8d34ea3e update ChangeLog (tag: v0.4.1-rc1) dbc3da66 makefile.unix: add vwebp.1 to the dist target 89a7c83c update ChangeLog ffe67ee9 Merge "update NEWS for the next release" into 0.4.1 2def1fe6 gif2webp: dust up the help message fb668d78 remove -noalphadither option from README/vwebp.1 e49f693b update NEWS for the next release cd013580 Merge "update AUTHORS" into 0.4.1 268d01eb update AUTHORS 85213b9b bump version to 0.4.1 695f80ae Merge "restore mux API compatibility" into 0.4.1 862d296c restore mux API compatibility 8f6f8c5d remove the !WEBP_REFERENCE_IMPLEMENTATION tweak in Put8x8uv d713a696 Merge changes If4debc15,I437a5d5f into 0.4.1 c2fc52e4 restore encode API compatibility 793368e8 restore decode API compatibility b8984f31 gif2webp: fix compile with giflib 5.1.0 222f9b1a gif2webp: simplify giflib version checking d2cc61b7 Extend MakeARGB32() to accept Alpha channel. 4595b62b Merge "use explicit size of kErrorMessages[] arrays" 157de015 Merge "Actuate memory stats for PRINT_MEMORY_INFO" fbda2f49 JPEG decoder: delay conversion to YUV to WebPEncode() call 0b747b1b use explicit size of kErrorMessages[] arrays 3398d81a Actuate memory stats for PRINT_MEMORY_INFO 6f3202be Merge "move WebPPictureInit to picture.c" 6c347bbb move WebPPictureInit to picture.c fb3acf19 fix configure message for multi-thread 40b086f7 configure: check for _beginthreadex 1549d620 reorder the YUVA->ARGB and ARGB->YUVA functions correctly c6461bfd Merge "extract colorspace code from picture.c into picture_csp.c" 736f2a17 extract colorspace code from picture.c into picture_csp.c 645daa03 Merge "configure: check for -Wformat-security" abafed86 configure: check for -Wformat-security fbadb480 split monolithic picture.c into picture_{tools,psnr,rescale}.c c76f07ec dec_neon/TransformAC3: initialize vector w/vcreate bb4fc051 gif2webp: Allow single-frame animations 46fd44c1 thread: remove harmless race on status_ in End() 5a1a7264 Merge "configure: check for __builtin_bswapXX()" 6781423b configure: check for __builtin_bswapXX() 6450c48d configure: fix iOS builds 6422e683 VP8LFillBitWindow: enable fast path for 32-bit builds 4f7f52b2 VP8LFillBitWindow: respect WEBP_FORCE_ALIGNED e458badc endian_inl.h: implement htoleXX with BSwapXX f2664d1a endian_inl.h: add BSwap16 6fbf5345 Merge "configure: add --enable-aligned" dc0f479d configure: add --enable-aligned 9cc69e2b Merge "configure: support WIC + OpenGL under mingw64" 257adfb0 remove experimental YUV444 YUV422 and YUV400 code 10f4257c configure: support WIC + OpenGL under mingw64 380cca4f configure.ac: add AC_C_BIGENDIAN ee70a901 endian_inl.h: add BSwap64 47779d46 endian_inl.h: add BSwap32 d5104b1f utils: add endian_inl.h 58ab6224 Merge "make alpha-detection loop in IsKeyFrame() in good x/y order" 9d562902 make alpha-detection loop in IsKeyFrame() in good x/y order 516971b1 lossless: Remove unaligned read warning b8b596f6 Merge "configure.ac: add an autoconf version prerequisite" 34b02f8c configure.ac: add an autoconf version prerequisite e59f5360 neon: normalize vdup_n_* usage 6ee7160d Merge changes I0da7b3d3,Idad2f278,I4accc305 abc02f24 Merge "fix (uncompiled) typo" bc03670f neon: add INIT_VECTOR4 6c1c632b neon: add INIT_VECTOR3 dc7687e5 neon: add INIT_VECTOR2 4536e7c4 add WebPMuxSetCanvasSize() to the mux API 824eab10 fix (uncompiled) typo 1f3e5f1e remove unused 'shift' argument and QFIX2 define 8e867051 Merge "VP8LoadNewBytes: use __builtin_bswap32 if available" 1b6a2635 Merge "Fix handling of weird GIF with canvas dimension 0x0" 1da3d461 VP8LoadNewBytes: use __builtin_bswap32 if available 1582e402 Fix handling of weird GIF with canvas dimension 0x0 b8811dac Merge "rename interface -> winterface" db8b8b5f Fix logic in the GIF LOOP-detection parsing 25aaddc8 rename interface -> winterface 5584d9d2 make WebPSetWorkerInterface() check its arguments a9ef7ef9 Merge "cosmetics: update thread.h comments" c6af9991 Merge "dust up the help message" 0a8b8863 dust up the help message a9cf3191 cosmetics: update thread.h comments 27bfeee4 QuantizeBlock SSE2 Optimization: 2bc0dc3e Merge "webpmux: warn when odd frame offsets are used" 3114ebe4 Merge changes Id8edd3c1,Id418eb96,Ide05e3be c0726634 webpmux: warn when odd frame offsets are used c5c6b408 Merge "add alpha dithering for lossy" d5146784 examples/Android.mk: add cwebp ca0fa7c7 Android.mk: move dwebp to examples/Android.mk 73d8fca0 Android.mk: add ENABLE_SHARED flag 6e93317f muxread: fix out of bounds read 8b0f6a48 Makefile.vc: fix CFLAGS assignment w/HAVE_AVX2=1 bbe32df1 add alpha dithering for lossy 79020767 Merge "make error-code reporting consistent upon malloc failure" 77bf4410 make error-code reporting consistent upon malloc failure 7a93c000 **/Makefile.am: remove unused AM_CPPFLAGS 24e30805 Add an interface abstraction to the WebP worker thread implementation d6cd6358 Merge "fix orig_rect==NULL case" 2bfd1ffa fix orig_rect==NULL case 059e21c1 Merge "configure: move config.h to src/webp/config.h" f05fe006 properly report back encoding error code in WebPFrameCacheAddFrame() 32b31379 configure: move config.h to src/webp/config.h 90090d99 Merge changes I7c675e51,I84f7d785 ae7661b3 makefiles: define WEBP_HAVE_AVX2 when appropriate 69fce2ea remove the special casing for res->first in VP8SetResidualCoeffs 6e61a3a9 configure: test for -msse2 b9d2efc6 rename upsampling_mips32.c to yuv_mips32.c bdfeebaa dsp/yuv: move sse2 functions to yuv_sse2.c 46b32e86 Merge "configure: set WEBP_HAVE_AVX2 when available" 88305db4 Merge "VP8RandomBits2: prevent signed int overflow" 73fee88c VP8RandomBits2: prevent signed int overflow db4860b3 enc_sse2: prevent signed int overflow 3fdaf4d2 Merge "real fix for longjmp warning" 385e3340 real fix for longjmp warning 230a0555 configure: set WEBP_HAVE_AVX2 when available a2ac8a42 restore original value_/range_ field order 5e2ee56f Merge "remove libwebpdspdecode dep on libwebpdsp_avx2" 61362db5 remove libwebpdspdecode dep on libwebpdsp_avx2 42c447ae Merge "lossy bit-reader clean-up:" 479ffd8b Merge "remove unused #include's" 9754d39a Merge "strong filtering speed-up (~2-3% x86, ~1-2% for NEON)" 158aff9b remove unused #include's 09545eea lossy bit-reader clean-up: ea8b0a17 strong filtering speed-up (~2-3% x86, ~1-2% for NEON) 6679f899 Optimize VP8SetResidualCoeffs. ac591cf2 fix for gcc-4.9 warnings about longjmp + local variables 4dfa86b2 dsp/cpu: NaCl has no support for xgetbv 4c398699 Merge "cwebp: fallback to native webp decode in WIC builds" 33aa497e Merge "cwebp: add some missing newlines in longhelp output" c9b340a2 fix missing WebPInitAlphaProcessing call for premultiplied colorspace output 57897bae Merge "lossless_neon: use vcreate_*() where appropriate" 6aa4777b Merge "(enc|dec)_neon: use vcreate_*() where appropriate" 0d346e41 Always reinit VP8TransformWHT instead of hard-coding 7d039fc3 cwebp: fallback to native webp decode in WIC builds d471f424 cwebp: add some missing newlines in longhelp output bf0e0030 lossless_neon: use vcreate_*() where appropriate 9251c2f6 (enc|dec)_neon: use vcreate_*() where appropriate 399b916d lossy decoding: correct alpha-rescaling for YUVA format 78c12ed8 Merge "Makefile.vc: add rudimentary avx2 support" dc5b122f try to remove the spurious warning for static analysis ddfefd62 Makefile.vc: add rudimentary avx2 support a8911643 Merge "simplify VP8LInitBitReader()" fdbcd44d simplify VP8LInitBitReader() 7c004287 makefile.unix: add rudimentary avx2 support 515e35cf Merge "add stub dsp/enc_avx2.c" a05dc140 SSE2: yuv->rgb speed-up for point-sampling 178e9a69 add stub dsp/enc_avx2.c 1b99c09c Merge "configure: add a test for -mavx2" fe728071 configure: add a test for -mavx2 e46a247c cpu: fix check for __cpuidex availability 176fda26 fix the bit-writer for lossless in 32bit mode 541784c7 dsp.h: add a check for AVX2 / define WEBP_USE_AVX2 bdb151ee dsp/cpu: add AVX2 detection ab9f2f86 Merge "revamp the point-sampling functions by processing a full plane" a2f8b289 revamp the point-sampling functions by processing a full plane ef076026 use decoder's DSP functions for autofilter 2b5cb326 Merge "dsp/cpu: add AVX detection" df08e67e dsp/cpu: add AVX detection e2f405c9 Merge "clean-up and slight speed-up in-loop filtering SSE2" f60957bf clean-up and slight speed-up in-loop filtering SSE2 9fc3ae46 .gitattributes: treat .ppm as binary 3da924b5 Merge "dsp/WEBP_USE_NEON: test for __aarch64__" c7164490 Android.mk: always include *_neon.c in the build a577b23a dsp/WEBP_USE_NEON: test for __aarch64__ 54bfffca move RemapBitReader() from idec.c to bit_reader code 34168ecb Merge "remove all unused layer code" f1e77173 remove all unused layer code b0757db7 Code cleanup for VP8LGetHistoImageSymbols. 5fe628d3 make the token page size be variable instead of fixed 8192 f948d08c memory debug: allow setting pre-defined malloc failure points ca3d746e use block-based allocation for backward refs storage, and free-lists 1ba61b09 enable NEON intrinsics in aarch64 builds b9d2bb67 dsp/neon.h: coalesce intrinsics-related defines b5c75258 iosbuild: add support for iOSv7/aarch64 9383afd5 Reduce number of memory allocations while decoding lossless. 888e63ed Merge "dsp/lossless: prevent signed int overflow in left shift ops" 8137f3ed Merge "instrument memory allocation routines for debugging" 2aa18736 instrument memory allocation routines for debugging d3bcf72b Don't allocate VP8LHashChain, but treat like automatic object bd6b8619 dsp/lossless: prevent signed int overflow in left shift ops b7f19b83 Merge "dec/vp8l: prevent signed int overflow in left shift ops" 29059d51 Merge "remove some uint64_t casts and use." e69a1df4 dec/vp8l: prevent signed int overflow in left shift ops cf5eb8ad remove some uint64_t casts and use. 38e2db3e MIPS: MIPS32r1: Added optimization for HistogramAdd. e0609ade dwebp: fix exit code on webp load failure bbd358a8 Merge "example_util.h: avoid forward declaring enums" 8955da21 example_util.h: avoid forward declaring enums 6d6865f0 Added SSE2 variants for Average2/3/4 b3a616b3 make HistogramAdd() a pointer in dsp c8bbb636 dec_neon: relocate some inline-asm defines 4e393bb9 dec_neon: enable intrinsics-only functions ba99a922 dec_neon: use positive tests for USE_INTRINSICS 69058ff8 Merge "example_util: add ExUtilDecodeWebPIncremental" a7828e8b dec_neon: make WORK_AROUND_GCC conditional on version 3f3d717a Merge "enc_neon: enable intrinsics-only functions" de3cb6c8 Merge "move LOCAL_GCC_VERSION def to dsp.h" 1b2fe14d example_util: add ExUtilDecodeWebPIncremental ca49e7ad Merge "enc_neon: move Transpose4x4 to dsp/neon.h" ad900abd Merge "fix warning about size_t -> int conversion" 4825b436 fix warning about size_t -> int conversion 42b35e08 enc_neon: enable intrinsics-only functions f937e012 move LOCAL_GCC_VERSION def to dsp.h 5e1a17ef enc_neon: move Transpose4x4 to dsp/neon.h c7b92a5a dec_neon: (WORK_AROUND_GCC) delete unused Load4x8 8e5f90b0 Merge "make ExUtilLoadWebP() accept NULL bitstream param." 05d4c1b7 Merge "cwebp: add webpdec" ddeb6ac8 cwebp: add webpdec 35d7d095 Merge "Reduce memory footprint for encoding WebP lossless." 0b896101 Reduce memory footprint for encoding WebP lossless. f0b65c9a make ExUtilLoadWebP() accept NULL bitstream param. 9c0a60cc Merge "dwebp: move webp decoding to example_util" 1d62acf6 MIPS: MIPS32r1: Added optimization for HuffmanCost functions. 4a0e7390 dwebp: move webp decoding to example_util c0220460 Merge "Bugfix: Incremental decode of lossy-alpha" 8c7cd722 Bugfix: Incremental decode of lossy-alpha 7955152d MIPS: fix error with number of registers. b1dabe37 Merge "Move the HuffmanCost() function to dsp lib" 75b12006 Move the HuffmanCost() function to dsp lib 2772b8bd MIPS: fix assembler error revealed by clang's debug build 6653b601 enc_mips32: fix unused symbol warning in debug 8dec1209 enc_mips32: disable ITransform(One) in debug builds 98519dd5 enc_neon: convert Disto4x4 to intrinsics fe9317c9 cosmetics: 953b0746 enc_neon: cosmetics a9fc697c Merge "WIP: extract the float-calculation of HuffmanCost from loop" 3f84b521 Merge "replace some mult-long (vmull_u8) with mult-long-accumulate (vmlal_u8)" 4ae0533f MIPS: MIPS32r1: Added optimizations for ExtraCost functions. b30a04cf WIP: extract the float-calculation of HuffmanCost from loop a8fe8ce2 Merge "NEON intrinsics version of CollectHistogram" 95203d2d NEON intrinsics version of CollectHistogram 7ca2e74b replace some mult-long (vmull_u8) with mult-long-accumulate (vmlal_u8) 41c6efbd fix lossless_neon.c 8ff96a02 NEON intrinsics version of FTransform 0214f4a9 Merge "MIPS: MIPS32r1: Added optimizations for FastLog2" baabf1ea MIPS: MIPS32r1: Added optimizations for FastLog2 3d49871d NEON functions for lossless coding 3fe02915 MIPS: MIPS32r1: Added optimizations for SSE functions. c503b485 Merge "fix the gcc-4.6.0 bug by implementing alternative method" abe6f487 fix the gcc-4.6.0 bug by implementing alternative method 5598bdec enc_mips32.c: fix file mode 2b1b4d5a MIPS: MIPS32r1: Add optimization for GetResidualCost f0a1f3cd Merge "MIPS: MIPS32r1: Added optimization for FTransform" 7231f610 MIPS: MIPS32r1: Added optimization for FTransform 869eaf6c ~30% encoding speedup: use NEON for QuantizeBlock() f758af6b enc_neon: convert FTransformWHT to intrinsics 7dad095b MIPS: MIPS32r1: Added optimization for Disto4x4 (TTransform) 2298d5f3 MIPS: MIPS32r1: Added optimization for QuantizeBlock e88150c9 Merge "MIPS: MIPS32r1: Add optimization for ITransform" de693f25 lossless_neon: disable VP8LConvert* functions 4143332b NEON intrinsics for encoding 0ca2914b MIPS: MIPS32r1: Add optimization for ITransform 71bca5ec dec_neon: use vst_lane instead of vget_lane bf061052 Intrinsics NEON version of TransformOne 19c6f1ba Merge "dec_neon: use vld?_lane instead of vset?_lane" 7a94c0cf upsampling_neon: drop NEON suffix from local functions d14669c8 upsampling_sse2: drop SSE2 suffix from local functions 2ca42a4f enc_sse2: drop SSE2 suffix from local functions d038e619 dec_sse2: drop SSE2 suffix from local functions fa52d752 dec_neon: use vld?_lane instead of vset?_lane c520e77d cosmetic: fix long line 4b0f2dae Merge "add intrinsics NEON code for chroma strong-filtering" e351ec07 add intrinsics NEON code for chroma strong-filtering aaf734b8 Merge "Add SSE2 version of forward cross-color transform" c90a902e Add SSE2 version of forward cross-color transform bc374ff3 Use histogram_bits to initalize transform_bits. 2132992d Merge "Add strong filtering intrinsics (inner and outer edges)" 5fbff3a6 Add strong filtering intrinsics (inner and outer edges) d4813f0c Add SSE2 function for Inverse Cross-color Transform 26029568 dec_neon: add strong loopfilter intrinsics cca7d7ef Merge "add intrinsics version of SimpleHFilter16NEON()" 1a05dfa7 windows: fix dll builds d6c50d8a Merge "add some colorspace conversion functions in NEON" 4fd7c82e SSE2 variants of Subtract-Green: Rectify loop condition 97e5fac3 add some colorspace conversion functions in NEON b9a7a45f add intrinsics version of SimpleHFilter16NEON() daccbf40 add light filtering NEON intrinsics af444608 fix typo in STORE_WHT 6af6b8e1 Tune HistogramCombineBin for large images. af93bdd6 use WebPSafe[CM]alloc/WebPSafeFree instead of [cm]alloc/free 51f406a5 lossless_sse2: relocate VP8LDspInitSSE2 proto 0f4f721b separate SSE2 lossless functions into its own file 514fc251 VP8LConvertFromBGRA: use conversion function pointers 6d2f3527 dsp/dec: TransformDCUV: use VP8TransformDC defc8e1b Merge "fix out-of-bound read during alpha-plane decoding" fbed3643 Merge "dsp: reuse wht transform from dec in encoder" d8467084 Merge "Add SSE2 version of ARGB -> BGR/RGB/... conversion functions" 207d03b4 fix out-of-bound read during alpha-plane decoding d1b33ad5 2-5% faster trellis with clang/MacOS (and ~2-3% on ARM) 369c26dd Add SSE2 version of ARGB -> BGR/RGB/... conversion functions df230f27 dsp: reuse wht transform from dec in encoder 80e218d4 Android.mk: fix build with APP_ABI=armeabi-v7a-hard 59daf083 Merge "cosmetics:" 53622008 cosmetics: 3e7f34a3 AssignSegments: quiet array-bounds warning 3c2ebf58 Merge "UpdateHistogramCost: avoid implicit double->float" cf821c82 UpdateHistogramCost: avoid implicit double->float 312e638f Extend the search space for GetBestGreenRedToBlue 1c58526f Fix few nits fef22704 Optimize and re-structure VP8LGetHistoImageSymbols 068b14ac Optimize lossless decoding. 5f0cfa80 Do a binary search to get the optimum cache bits. 24ca3678 Merge "allow 'cwebp -o -' to emit output to stdout" e12f874e allow 'cwebp -o -' to emit output to stdout 2bcad89b allow some more stdin/stout I/O 84ed4b3a fix cwebp.1 typos after patch #69199 65b99f1c add a -z option to cwebp, and WebPConfigLosslessPreset() function 30176619 4-5% faster trellis by removing some unneeded calculations. 687a58ec histogram.c: reindent after b33e8a0 06d456f6 Merge "~3-4% faster lossless encoding" c60de260 ~3-4% faster lossless encoding 42eb06fc Merge "few cosmetics after patch #69079" 82af8264 few cosmetics after patch #69079 b33e8a05 Refactor code for HistogramCombine. ca1bfff5 Merge "5-10% encoding speedup with faster trellis (-m 6)" 5aeeb087 5-10% encoding speedup with faster trellis (-m 6) 82ae1bf2 cosmetics: normalize VP8GetCPUInfo checks e3dd9243 Merge "Refactor GetBestPredictorForTile for future tuning." 206cc1be Refactor GetBestPredictorForTile for future tuning. 3cb84062 Merge "speed-up trellis quant (~5-10% overall speed-up)" b66f2227 Merge "lossy encoding: ~3% speed-up" 4287d0d4 speed-up trellis quant (~5-10% overall speed-up) 390c8b31 lossy encoding: ~3% speed-up 9a463c4a Merge "dec_neon: convert TransformWHT to intrinsics" e8605e96 Merge "dec_neon: add ConvertU8ToS16" 4aa3e412 MIPS: MIPS32r1: rescaler bugfix c16cd99a Speed up lossless encoder. 9d6b5ff1 dec_neon: convert TransformWHT to intrinsics 2ff0aae2 dec_neon: add ConvertU8ToS16 77a8f919 fix compilation with USE_YUVj flag 4acbec1b Merge changes I3b240ffb,Ia9370283,Ia2d28728 2719bb7e dec_neon: TransformAC3: work on packed vectors b7b60ca1 dec_neon: add SaturateAndStore4x4 b7685d73 Rescale: let ImportRow / ExportRow be pointer-to-function e02f16ef dec_neon.c: convert TransformDC to intrinsics 9cba963f add missing file 8992ddb7 use static clipping tables 0235d5e4 1-2% faster quantization in SSE2 b2fbc36c fix VC12-x64 warning 6e37cb94 Merge "cosmetics: backward_references.c: reindent after a7d2ee3" a42ea974 cosmetics: backward_references.c: reindent after a7d2ee3 6c327442 Merge "fix missing __BIG_ENDIAN__ definition on some platform" a8b6aad1 fix missing __BIG_ENDIAN__ definition on some platform fde2904b Increase initial buffer size for VP8L Bit Writer. a7d2ee39 Optimize cache estimate logic. 7fb6095b Merge "dec_neon.c: add TransformAC3" bf182e83 VP8LBitWriter: use a bit-accumulator 3f40b4a5 Merge "MIPS: MIPS32r1: clang macro warning resolved" 1684f4ee WebP Decoder: Mark some truncated bitstreams as invalid acbedac4 MIPS: MIPS32r1: clang macro warning resolved 228e4877 dec_neon.c: add TransformAC3 393f89b7 Android.mk: avoid gcc-specific flags with clang 32aeaf11 revamp VP8LColorSpaceTransform() a bit 0c7cc4ca Merge "Don't dereference NULL, ensure HashChain fully initialized" 391316fe Don't dereference NULL, ensure HashChain fully initialized 926ff402 WEBP_SWAP_16BIT_CSP: remove code dup 1d1cd3bb Fix decode bug for rgbA_4444/RGBA_4444 color-modes. 939e70e7 update AUTHORS file 8934a622 cosmetics: *_mips32.c dd438c9a MIPS: MIPS32r1: Optimization of some simple point-sampling functions. PATCH [6/6] 53520911 Added support for calling sampling functions via pointers. d16c6974 MIPS: MIPS32r1: Optimization of filter functions. PATCH [5/6] 04336fc7 MIPS: MIPS32r1: Optimization of function TransformOne. PATCH [4/6] 92d8fc7d MIPS: MIPS32r1: Optimization of function WebPRescalerImportRow. PATCH [3/6] bbc23ff3 parse one row of intra modes altogether a2f608f9 Merge "MIPS: MIPS32r1: Optimization of function WebPRescalerExportRow. [2/6]" 88230854 MIPS: MIPS32r1: Optimization of function WebPRescalerExportRow. [2/6] c5a5b028 decode mt+incremental: fix segfault in debug builds 9882b2f9 always use fast-analysis for all methods. 000adac0 Merge "autoconf: update ax_pthread.m4" 2d2fc37d update .gitignore 5bf4255a Merge "Make it possible to avoid automagic dependencies" c1cb1933 disable NEON for arm64 platform 73a304e9 Make it possible to avoid automagic dependencies 4d493f8d MIPS: MIPS32r1: Decoder bit reader function optimized. PATCH [1/6] c741183c make WebPCleanupTransparentArea work with argb picture 5da18552 add a decoding option to flip image vertically 00c3c4e1 Merge "add man/vwebp.1" 2c6bb428 add man/vwebp.1 ea59a8e9 Merge "Merge tag 'v0.4.0'" 7574bed4 fix comments related to array sizes 0b5a90fd dwebp.1: fix option formatting effcb0fd Merge tag 'v0.4.0' 7c76255d autoconf: update ax_pthread.m4 fff2a11b make -short work with -print_ssim, -print_psnr, etc. 68e7901d update ChangeLog (tag: v0.4.0-rc1, tag: v0.4.0, origin/0.4.0) 256e4333 update NEWS description with new general features 29625340 Merge "gif2webp: don't use C99 %zu" into 0.4.0 3b9f9dd0 gif2webp: don't use C99 %zu b5b2e3c7 cwebp: fix metadata output w/lossy+alpha ad26df1a makefile.unix: clean up libgif2webp_util.a c3b45570 update Changelog ca841121 Merge "bump version to 0.4.0" into 0.4.0 8c524db8 bump version to 0.4.0 eec2398c update AUTHORS & .mailmap b9bbf6a1 update NEWS for 0.4.0 c72e0811 Merge "dec/webp.c: don't wait for data before reporting w/h" 5ad65314 dec/frame.c: fix formatting f7fc4bc8 dec/webp.c: don't wait for data before reporting w/h 66a32af5 Merge "NEON speed up" 26d842eb NEON speed up f307f98b Merge "webpmux: let -- stop parameter parsing" fe051da7 Merge "README: add a section on gif2webp" 6fd2bd62 Merge "manpage pedantry" 4af19007 README: add a section on gif2webp 6f36ade9 manpage pedantry f9016cb9 README: update dwebp options b4fa0a47 webpmux: let -- stop parameter parsing a9a20acf gif2webp: Add a multi-threaded encode option 495bef41 fix bug in TrellisQuantize 605a7127 simplify __cplusplus ifdef 33109f99 Merge "drop: ifdef __cplusplus checks from C files" 7f9de0b9 Merge changes I994a5587,I8467bb71,I13b50688,I1e2c9c7b 5459030b gif2webp: let -- stop parameter parsing a4b0aa06 vwebp: let -- stop parameter parsing 98af68fe cwebp: let -- stop parameter parsing a33831e2 dwebp: let -- stop parameter parsing 36301249 add some checks on error paths ce4c7139 Merge "autoconf: add --disable-wic" 5227d991 drop: ifdef __cplusplus checks from C files f6453559 dwebp.1: fix typo f91034f2 Merge "cwebp: print metadata stats when no output file is given" d4934553 gif2webp: Backward compatibility for giflib version <= 4.1.3 4c617d32 gif2webp: Disable output of ICC profile by default 73b731fb introduce a special quantization function for WHT 41c0cc4b Make Forward WHT transform use 32bit fixed-point calculation a3359f5d Only compute quantization params once 70490437 cwebp: print metadata stats when no output file is given d513bb62 * fix off-by-one zthresh calculation * remove the sharpening for non luma-AC coeffs * adjust the bias a little bit to compensate for this ad9dec0c Merge "cosmetics: dwebp: fix local function name format" f737f037 Merge "dwebp: remove a dead store" 3c3a70da Merge "makefile.unix: install binaries in $(DESTDIR)/bin/" 150b655f Merge "Android.mk: add some release compile flags" dbebd33b cosmetics: dwebp: fix local function name format 27749951 dwebp: remove a dead store a01e04fe autoconf: add --disable-wic 5009b227 makefile.unix: install binaries in $(DESTDIR)/bin/ bab30fca Merge "fix -print_psnr / ssim options" ebef7fb3 fix -print_psnr / ssim options cb637855 Merge "fix bug due to overzealous check in WebPPictureYUVAToARGB()" 8189885b Merge "EstimateBestFilter: use an int to iterate WEBP_FILTER_TYPE" 4ad7d335 Android.mk: add some release compile flags c12e2369 cosmetics: fix a few typos 6f104034 fix bug due to overzealous check in WebPPictureYUVAToARGB() 3f6c35c6 EstimateBestFilter: use an int to iterate WEBP_FILTER_TYPE cc55790e Merge changes I8bb7a4dc,I2c180051,I021a014f,I8a224a62 c536afb5 Merge "cosmetics: fix some typos" cbdd3e6e add a -dither dithering option to the decoder e8124012 Updated iosbuild.sh for XCode 5.x 4931c329 cosmetics: fix some typos 05aacf77 mux: add some missing casts 617d9348 enc/vp8l: add a missing cast 46db2865 idec: add some missing casts b524e336 ErrorStatusLossless: correct return type cb261f79 fix a descaling bug for vertical/horizontal U/V interpolation bcb3955c Merge changes I48968468,I181bc736 73f52133 gif2webp: Add a mixed compression mode 6198715e demux: split chunk parsing from ParseVP8X d2e3f4e6 demux: add a tail pointer for chunks 87cffcc3 demux: cosmetics: s/has_frames/is_animation/ e18e6677 demux: strictly enforce the animation flag c4f39f4a demux: cosmetics: remove a useless break 61cb884d demux: (non-exp) fail if the fragmented flag is set ff379db3 few % speedup of lossless encoding df3649a2 remove all disabled code related to P-frames 6d0cb3de Merge "gif2webp: kmin = 0 should suppress key-frame addition." 36555983 gif2webp: kmin = 0 should suppress key-frame addition. 7708e609 Merge "detect flatness in blocks and favor DC prediction" 06b1503e Merge "add comment about the kLevelsFromDelta[][] LUT generation" 5935259c add comment about the kLevelsFromDelta[][] LUT generation e3312ea6 detect flatness in blocks and favor DC prediction ebc9b1ee Merge "VPLBitReader bugfix: Catch error if bit_pos > LBITS too." 96ad0e0a VPLBitReader bugfix: Catch error if bit_pos > LBITS too. a014e9c9 tune quantization biases toward higher precision 1e898619 add helpful PrintBlockInfo() function 596a6d73 make use of 'extern' consistent in function declarations c8d48c6e Merge "extract random utils to their own file util/random.[ch]" 98aa33cf extract random utils to their own file util/random.[ch] 432a723e Merge "swig: add basic go bindings" fab618b5 Merge "rename libwebp.i -> libwebp.swig" e4e7fcd6 swig: add basic go bindings d3408720 Merge "fast auto-determined filtering strength" f8bfd5cd fast auto-determined filtering strength ac0bf951 small clean-up in ExpandMatrix() 1939607e rename libwebp.i -> libwebp.swig 43148b6c filtering: precompute ilimit and hev_threshold 18f992ec simplify f_inner calculation a little 241d11f1 add missing const 86c0031e add a 'format' field to WebPBitstreamFeatures dde91fde Demux: Correct the extended format validation 5d6c5bd2 add entry for '-resize' option in cwebp's man 7c098d18 Use some gamma-curve range compression when computing U/V average 0b2b0504 Use deterministic random-dithering during RGB->YUV conversion 8a2fa099 Add a second multi-thread method 7d6f2da0 Merge "up to 20% faster multi-threaded decoding" 266f63ea Merge "libwebp.jar: build w/Java 1.6 for Android compat" 0532149c up to 20% faster multi-threaded decoding 38efdc2e Simplify the gif2webp tool: move the optimization details to util de899516 libwebp.jar: build w/Java 1.6 for Android compat cb221552 Decode a full row of bitstream before reconstructing dca8a4d3 Merge "NEON/simple loopfilter: avoid q4-q7 registers" 9e84d901 Merge "NEON/TransformWHT: avoid q4-q7 registers" fc10249b NEON/simple loopfilter: avoid q4-q7 registers 2f09d63e NEON/TransformWHT: avoid q4-q7 registers 77585a2b Merge "use a macrofunc for setting NzCoeffs bits" d155507c Merge "use HINT_GRAPH as image_hint for gif source" 9c561646 Merge "only print GIF_DISPOSE_WARNING once" 05879865 use HINT_GRAPH as image_hint for gif source 0b28d7ab use a macrofunc for setting NzCoeffs bits f9bbc2a0 Special-case sparse transform 00125196 gif2webp: detect and flatten uniformly similar blocks 0deaf0fa only print GIF_DISPOSE_WARNING once 6a8c0eb7 Merge "small optimization in segment-smoothing loop" f7146bc1 small optimization in segment-smoothing loop 5a7533ce small gif2webp fix 4df0c89e Merge changes Ic697660c,I27285521 5b2e6bd3 Android.mk: add a dwebp target f910a84e Android.mk: update build flags 63f9aba4 special-case WHT transform when there's only DC 80911aef Merge "7-8% faster decoding by rewriting GetCoeffs()" 606c4304 gif2webp: Improved compression for lossy animated WebP fb887f7f gif2webp: Different kmin/kmax defaults for lossy and lossless 2a981366 7-8% faster decoding by rewriting GetCoeffs() 92d47e4c improve VP8L signature detection by checking the version bits too 5cd43e43 Add -incremental option to dwebp 54b8e3f6 webpmux: DisplayInfo(): remove unnecessary error checks. 40ae3520 fix memleak in WebPIDelete() d9662658 mux.h doc: WebPMuxGetFrame() can return WEBP_MUX_MEMORY_ERROR too. 0e6747f8 webpmux -info: display dimensions and has_alpha per frame d78a82c4 Sanity check for underflow 8498f4bf Merge "remove -Wshadow warnings" e89c6fc8 Avoid a potential memleak 3ebe1757 Merge "break down the proba 4D-array into some handy structs" 6a44550a break down the proba 4D-array into some handy structs 2f5e8934 remove -Wshadow warnings bf3a29b3 Merge "add proper WEBP_HAVE_GIF and WEBP_HAVE_GL flags" 2b0a7593 Merge "fix some warnings from static analysis" 22dd07ce mux.h: Some doc corrections 79ff0346 add proper WEBP_HAVE_GIF and WEBP_HAVE_GL flags d51f45f0 fix some warnings from static analysis d134307b fix conversion warning on MSVC d538cea8 gif2webp: Support a 'min' and 'max' key frame interval 80b54e1c allow search with token buffer loop and fix PARTITION0 problem b7d4e042 add VP8EstimateTokenSize() 10fddf53 enc/quant.c: silence a warning 399cd456 Merge "fix compile error on ARM/gcc" 9f24519e encoder: misc rate-related fixes c663bb21 Merge "simplify VP8IteratorSaveBoundary() arg passing" fa46b312 Demux.h: Correct a method name reference f8398c9d fix compile error on ARM/gcc f691f0e4 simplify VP8IteratorSaveBoundary() arg passing 42542be8 up to 6% faster encoding with clang compiler 93402f02 multi-threaded segment analysis 7e2d6595 Merge "remove the PACK() bit-packing tricks" c13fecf9 remove the PACK() bit-packing tricks 2fd091c9 Merge "use NULL for lf_stats_ testing, not bool" b11c9d62 dwebp: use default dct_method 4bb8465f Merge "(de)mux.h: wrap pseudo-code in /* */" cfb56b17 make -pass option work with token buffers 5416aab4 (de)mux.h: wrap pseudo-code in /* */ 35dba337 use NULL for lf_stats_ testing, not bool 733a7faa enc->Iterator memory cleanup e81fac86 Add support for "no blend" in webpmux binary 3b80bc48 gif2webp: Separate out each step into a method bef7e9cc Add doc precision about demux object keeping pointers to data. 61405a14 dwebp: enable stdout output with WIC 6eabb886 Merge "Animated WebP: add "do no blend" option to spec" be20decb fix compilation for BITS 24 e58cc137 Merge "dwebp: s/unsigned char/uint8_t/" 72501d43 dwebp: s/unsigned char/uint8_t/ 2c9633e8 Merge "gif2webp: Insert independent frames at regular intervals." f0d6a14b gif2webp: Insert independent frames at regular intervals. b25a6fbf yuv.h: fix indent ede3602e Merge "cosmetics: fix indent" 3a65122a dwebp: fix stdout related output 388a7249 cosmetics: fix indent 4c7322c8 Merge "dsp: msvc compatibility" d50c7e32 Merge "5-7% faster SSE2 versions of YUV->RGB conversion functions" b8ab7847 Merge "simplify upsampler calls: only allow 'bottom' to be NULL" df6cebfa 5-7% faster SSE2 versions of YUV->RGB conversion functions ad6ac32d simplify upsampler calls: only allow 'bottom' to be NULL a5e8afaf output to stdout if file name is "-" f358450f dsp: msvc compatibility 43a7c8eb Merge "cosmetics" 4c5f19c1 Merge "bit_reader.h: cosmetics" f72fab70 cosmetics 14dd5e78 fix const-ness b20aec49 Merge "Support for 'do not blend' option in vwebp" dcf65222 Support for 'do not blend' option in vwebp d5bad033 Animated WebP: add "do no blend" option to spec a2f5f73d Merge "Support for "Do not blend" in mux and demux libraries" e081f2f3 Pack code & extra_bits to Struct (VP8LPrefixCode). 6284854b Support for "Do not blend" in mux and demux libraries f486aaa9 Merge "slightly faster ParseIntraMode" d1718632 slightly faster ParseIntraMode 3ceca8ad bit_reader.h: cosmetics 69257f70 Create LUT for PrefixEncode. 988b7084 add WebPWorkerExecute() for convenient bypass 06e24987 Merge "VP8EncIterator clean-up" de4d4ad5 VP8EncIterator clean-up 7bbe9529 Merge "cosmetics: thread.c: drop a redundant comment" da411485 cosmetics: thread.c: drop a redundant comment feb4b6e6 thread.h: #ifdef when checking WEBP_USE_THREAD 8924a3a7 thread.c: drop WebPWorker prefix from static funcs 1aed8f2a Merge "fix indent" 4038ed15 fix indent 1693fd9b Demux: A new state WEBP_DEMUX_PARSE_ERROR 8dcae8b3 fix rescaling-with-alpha inaccuracy 11249abf Merge changes I9b4dc36c,I4e0eef4d 52508a1f Mux: support parsing unknown chunks within a frame/fragment. 05db0572 WebPMuxSetChunk: remove unused variable 8ba1bf61 Stricter check for presence of alpha when writing lossless images a03c3516 Demux: WebPIterator now also denotes if the frame has alpha. 6df743a3 Decoder: handle fragments case correctly too. faa4b07e Support for unknown chunks in mux library 7d60bbc6 Speed up HashChainFindCopy function. 66740140 Speedup Alpha plane encoding. b7346a1e 0.1 % speedup to decoding c606182e webp-container-spec: Tighten language added by last a34a5029 pngdec: output error messages from libpng e84c625d Merge "Detect canvas and image size mismatch in decoder." f626fe2e Detect canvas and image size mismatch in decoder. f5fbdee0 demux: stricter image bounds check 30c8158a add extra assert in Huffman decode code 8967b9f3 SSE2 for lossless decoding (critical) functions. 699d80ea Jump-lookup for Huffman coding c34307ab fix some VS9 warnings about type conversion eeada35c pngdec: add missing include 54b65108 gif2webp: If aligning to even offsets, extra pixels should be transparent 0bcf5ce3 Merge "remove a malloc() in case we're using only FILTER_NONE for alpha" 2c07143b remove a malloc() in case we're using only FILTER_NONE for alpha a4d5f59d Faster lossless decoding fd53bb75 Merge "alternate LUT-base reverse-bits code" d1c166ef Merge "Container spec: a clarification on background color." fdb91779 Rename a method 5e967532 Container spec: a clarification on background color. 30e77d0f Merge branch '0.3.0' 1b631e29 alternate LUT-base reverse-bits code 24cc307a ~20% faster lossless decoding 313d853f Speedup for decoding lossless WebP photographs: 24ee098a change the bytes_per_pixels_ field into more evocative use_8b_decode 2a04b034 update ChangeLog (tag: v0.3.1-rc2, tag: v0.3.1) 7288950b Regression fix for alpha channels using color cache: 2e377b53 wicdec: silence a format warning ad9e42a6 muxedit: silence some uninitialized warnings 3307c163 Don't set alpha-channel to 0xff for alpha->green uplift 5130770c Merge "wicdec: silence a format warning" a37eff47 Regression fix for alpha channels using color cache: 241cf99b Merge "muxedit: silence some uninitialized warnings" c8f9c84d Regression fix for alpha unfiltering: 14cd5c6c muxedit: silence some uninitialized warnings a368db81 dec/vp8l: quiet vs9 x64 type conversion warning ffae9f31 wicdec: silence a format warning 8cf0701e Alpha encoding: never filter in case of NO_COMPRESSION 825e73b1 update ChangeLog (tag: v0.3.1-rc1) abf6f691 update NEWS 5a92c1a5 bump version to 0.3.1 86daf77c store top Y/U/V samples in packed fashion 67bc353e Revert "add WebPBlendAlpha() function to blend colors against background" 068db59e Intertwined decoding of alpha and RGB 38cc0114 Simplify forward-WHT + SSE2 version 3fa595a5 Support decoding upto given row in DECODE_DATA_FUNC 520f005f DequantizeLevels(): Add 'row' and 'num_rows' args 47374b82 Alpha unfilter for given set of rows f32097e0 probe input file and quick-check for WebP format. a2aed1d0 configure: improve gl/glut library test c7e89cbb update copyright text a00380d2 configure: remove use of AS_VAR_APPEND a94a88dd fix EXIF parsing in PNG a71e5d84 add doc precision for WebPPictureCopy() and WebPPictureView() 8287012e remove datatype qualifier for vmnv e1908430 fix a memory leak in gif2webp 0b18b9ee fix two minor memory leaks in webpmux db5095d5 remove some cruft from swig/libwebp.jar 850e956f README: update swig notes bddd9b0a swig/python: add minimal documentation d573a8d5 swig: add python encode support 6b931875 swig/java: reduce wrapper function code duplication 6fe536f4 swig/java: rework uint8_t typemap a2ea4643 Fix the bug in ApplyPalette. 7bb28d2a webp/lossless: fix big endian BGRA output f036d4bf Speed up ApplyPalette for ARGB pixels. 8112c8cf remove some warnings: cc128e0b Further reduce memory to decode lossy+alpha images 07db70d2 fix for big-endian eda8a7de gif2webp: Fix signed/unsigned comparison mismatch 31f346fe Makefile.vc: fix libwebpdemux dll variable typo 6c76d28e swig: add python (decode) support b4f5bb6c swig: cosmetics 498d4dd6 WebP-Lossless encoding improvements. 26e72442 swig: ifdef some Java specific code 8ecec686 configure: add warning related flags e676b043 configure: add GLUT detection; build vwebp b0ffc437 Alpha decoding: significantly reduce memory usage 20aa7a8d configure: add --enable-everything b8307cc0 configure.ac: add some helper macros 980e7ae9 Remove the gcc compilation comments 7f25ff99 gif2webp: Fix ICC and XMP support d8e53211 Add missing name to AUTHORS 11edf5e2 Demux: Fix a potential memleak c7b92184 don't forward declare enums 7a650c6a prevent signed int overflow in left shift ops 31bea324 add precision about dynamic output reallocation with IDecoder c22877f7 Add incremental support for extended format files 5051245f Makefile.vc: have 'all' target build everything 8191deca Makefile.vc: flags cleanup b9d74735 Makefile.vc: drop /FD flag 5568dbcf update gitignore f4c7b654 WebPEncode: An additional check. Start VP8EncLoop/VP8EncTokenLoop only if VP8EncStartAlpha succeeded. 1fb04bec pngdec: Avoid a double-free. dcbb1ca5 add WebPBlendAlpha() function to blend colors against background bc9f5fbe configure.ac: add AM_PROG_AR for automake >= 1.12 bf867bf2 Tuned cross_color parameter (step) for lower qual 90e2ec5a Merge "probe input file and quick-check for WebP format." 7180d7ff Merge "update copyright text" 830f72b7 probe input file and quick-check for WebP format. 2ccf58d6 configure: improve gl/glut library test d640614d update copyright text c2113ad4 Merge "configure: remove use of AS_VAR_APPEND" 9326a56f configure: remove use of AS_VAR_APPEND ea63d619 fix a type warning on VS9 x86 bec11092 fix EXIF parsing in PNG b6e65f3d Merge "fix warnings for vs9 x64" 438946dc fix warnings for vs9 x64 f4710e3b collect macroblock reconstruction data in VP8MBData struct 23d28e21 add doc precision for WebPPictureCopy() and WebPPictureView() 518f2cd7 cosmetics: gif2webp: fix indent af358e68 Merge "remove datatype qualifier for vmnv" 3fe91635 remove datatype qualifier for vmnv 764fdffa fix a memory leak in gif2webp 3e59a74d fix two minor memory leaks in webpmux 47b9862f Merge "README: update swig notes" 325d15ff remove some cruft from swig/libwebp.jar 4a7627c2 README: update swig notes 5da81e33 Merge "swig/python: add minimal documentation" f39e08f2 Merge "swig: add python encode support" 6ca4a3e3 Merge "swig/java: reduce wrapper function code duplication" 8f8702b0 Merge "swig/java: rework uint8_t typemap" 91413be2 reduce memory for VP8MB and remove bitfields use 7413394e Fix the memory leak in ApplyFilters. 2053c2cf simplify the alpha-filter testing loop 825b64db swig/python: add minimal documentation 14677e11 swig: add python encode support a5c297c8 swig/java: reduce wrapper function code duplication ad4a367d swig/java: rework uint8_t typemap 0d25876b use uint8_t for inv_palette[] afa3450c Fix the bug in ApplyPalette. 2d6ac422 Merge "webp/lossless: fix big endian BGRA output" 2ca83968 webp/lossless: fix big endian BGRA output 742110cc Speed up ApplyPalette for ARGB pixels. 2451e47d misc code cleanup 83db4043 Merge "swig: add python (decode) support" eeeea8b5 Merge "swig: cosmetics" d5f9b8f3 Merge "libwebp: fix vp8 encoder mem alloc offsetting" d8edd835 libwebp: fix vp8 encoder mem alloc offsetting 8983b83e remove use of bit-fields in VP8FInfo 87a4fca2 remove some warnings: ba8f74e2 Merge "fix for big-endian" a65067fa Merge "Further reduce memory to decode lossy+alpha images" 64c84486 Further reduce memory to decode lossy+alpha images 332130b9 Mux: make a few methods static 44370617 fix for big-endian 5199eab5 Merge "add uncompressed TIFF output support" a3aede97 add uncompressed TIFF output support f975b67f Merge "gif2webp: Fix signed/unsigned comparison mismatch" 5fbc734b Merge "GetFeatures: Detect invalid VP8X/VP8/VP8L data" d5060c87 Merge "mux.h: A comment fix + some consistency fixes" 352d0dee GetFeatures: Detect invalid VP8X/VP8/VP8L data 3ef79fef Cosmetic: "width * height" 043e1ae4 gif2webp: Fix signed/unsigned comparison mismatch 5818cff7 mux.h: A comment fix + some consistency fixes 1153f888 Merge "swig: ifdef some Java specific code" 3eeedae1 Makefile.vc: fix libwebpdemux dll variable typo f980faf4 swig: add python (decode) support 7f5f42bb swig: cosmetics 8eae188a WebP-Lossless encoding improvements. c7247c4c swig: ifdef some Java specific code 4cb234d5 Merge "Mux: make ValidateForSingleImage() method static" ed6f5308 Merge "Add GetCanvasSize() method to mux" 1d530c9a Mux: make ValidateForSingleImage() method static bba4c2b2 configure: add warning related flags fffefd18 Add GetCanvasSize() method to mux 732da8d0 Merge "configure: add GLUT detection; build vwebp" 0e513f7a configure: add GLUT detection; build vwebp 55d1c150 Merge "Alpha decoding: significantly reduce memory usage" 13d99fb5 Merge "configure: add --enable-everything" 2bf698fe Merge "configure.ac: add some helper macros" edccd194 Alpha decoding: significantly reduce memory usage 3cafcc9a configure: add --enable-everything 4ef14477 configure.ac: add some helper macros a4e1cdbb Remove the gcc compilation comments 6393fe4b Cosmetic fixes 9c4ce971 Simplify forward-WHT + SSE2 version 878b9da5 fix missed optim 00046171 VP8GetInfo(): Check for zero width or height. 9bf31293 align VP8Encoder::nz_ allocation 5da165cf fix CheckMode() signature 0ece07dc Merge "explicitly pad bitfields to 32-bits" 9dbc9d19 explicitly pad bitfields to 32-bits 5369a80f Merge "prevent signed int overflow in left shift ops" 70e39712 Merge "cosmetics: remove unnecessary ';'s" d3136ce2 Merge "don't forward declare enums" b26e5ad5 gif2webp: Fix ICC and XMP support 46089b20 Add missing name to AUTHORS 94328d64 Demux: Fix a potential memleak 96e948d7 don't forward declare enums f4f90880 prevent signed int overflow in left shift ops 0261545e cosmetics: remove unnecessary ';'s 7ebdf110 Merge "Fix few missing comparisons to NULL" 1579989e Fix few missing comparisons to NULL ea1b21cf Cleaned up VP8GetHeaders() so that it parses only frame header b66caee4 dwebp: add support for BMP output ff885bfe add precision about dynamic output reallocation with IDecoder 79241d5a Merge "Makefile.vc: have 'all' target build everything" ac1c729b Merge "Makefile.vc: flags cleanup" 118a055c Merge "Makefile.vc: drop /FD flag" ecad0109 Merge "update gitignore" a681b4f4 Rename PRE_VP8 state to WEBP_HEADER ead4d478 Add incremental support for extended format files 69d0f926 Makefile.vc: have 'all' target build everything 52967498 Makefile.vc: flags cleanup c61baf0c Makefile.vc: drop /FD flag 3a15125d update gitignore 5167ca47 Merge "WebPEncode: An additional check. Start VP8EncLoop/VP8EncTokenLoop only if VP8EncStartAlpha succeeded." 67708d67 WebPEncode: An additional check. Start VP8EncLoop/VP8EncTokenLoop only if VP8EncStartAlpha succeeded. b68912af pngdec: Avoid a double-free. 82abbe12 Merge "configure.ac: add AM_PROG_AR for automake >= 1.12" e7d9548c add WebPBlendAlpha() function to blend colors against background ed4dc717 configure.ac: add AM_PROG_AR for automake >= 1.12 df4a406d Merge branch '0.3.0' 1e0d4b8c Update ChangeLog (tag: v0.3.0-rc7, tag: v0.3.0) d52b405d Cosmetic fixes 6cb4a618 misc style fix 68111ab0 add missing YUVA->ARGB automatic conversion in WebPEncode() e9a7990b Cosmetic fixes 403bfe82 Container spec: Clarify frame disposal 2aaa423b Merge "add missing YUVA->ARGB automatic conversion in WebPEncode()" 07d87bda add missing YUVA->ARGB automatic conversion in WebPEncode() 142c4629 misc style fix 3e7a13a0 Merge "Container spec: clarify the background color field" into 0.3.0 14af7745 container doc: add a note about the 'ANMF' payload cc635efa Container spec: clarify the background color field e3e33949 container doc: move RIFF description to own section 4299f398 libwebp/mux: fix double free 33f9a692 Merge "demux: keep a frame tail pointer; used in AddFrame" into 0.3.0 a2a7b959 use WebPDataCopy() instead of re-coding it. 6f18f12f demux: keep a frame tail pointer; used in AddFrame e5af49e9 add doc precision about WebPParseHeaders() return codes db46daab Merge "Makefile.vc: fix dynamic builds" into 0.3.0 53c77afc Merge "gif2webp: Bgcolor fix for a special case" into 0.3.0 a5ebd143 gif2webp: Bgcolor fix for a special case 6378f238 Merge "vwebp/animation: fix background dispose" into 0.3.0 3c8eb9a8 fix bad saturation order in QuantizeBlock 04c7a2ec vwebp/animation: fix background dispose 81a50695 Makefile.vc: fix dynamic builds 5f25c396 update ChangeLog (tag: v0.3.0-rc6) 14d42af2 examples: don't use C99 %zu 5ccf1fe5 update ChangeLog 2560c243 update NEWS f43bafc3 Merge changes Iecccb09c,If5ee9fd2,I3e181ce4 into 0.3.0 a788644f dwebp: warn when decoding animated webp's 302efcdb Decode: return more meaningful error for animation ad452735 WebPBitstreamFeatures: add has_animation field 783dfa49 disable FRGM decoding for good in libwebpmux 4b956be0 Update ChangeLog ad8b86d7 update NEWS 3e084f63 Merge "demux cosmetics: comments/rename internal function" into 0.3.0 d3f8c621 Merge "move WebPFeatureFlags declaration" into 0.3.0 7386fe50 Merge "libwebp{demux,mux}: install mux_types.h" into 0.3.0 d6cd4e90 Merge "bump decode abi" into 0.3.0 17f8da5c bump decode abi 97684ae2 Merge "add doc precision about WebPDemuxPartial()" into 0.3.0 f933fd2a move WebPFeatureFlags declaration 289bc47b libwebp{demux,mux}: install mux_types.h 224e8d46 add doc precision about WebPDemuxPartial() 4c18e80c demux cosmetics: comments/rename internal function 7cfd1bf1 update AUTHORS 401f7b85 Merge "speed-up lossless (~3%) with ad-hoc histogram cost evaluation" into 0.3.0 1fc8ffca Merge "makefile.unix: dist related changes" into 0.3.0 8a89c6ed Merge changes I466c377f,Ib761ebd3,I694857fc into 0.3.0 f4ffb2d5 speed-up lossless (~3%) with ad-hoc histogram cost evaluation 723847d5 gif2webp: only write error messages to stderr 701b9e2a makefile.unix: dist related changes bb85b437 Merge "update NEWS" into 0.3.0 59423a24 gif2webp: fix crash on open failure with libgif5 9acb17de gif2webp: silence a unused param warning 7d9fdc23 Merge "README updates" into 0.3.0 5621934e Merge "build: fix install race on shared headers" into 0.3.0 70809d89 Merge "bump version to 0.3.0" into 0.3.0 d851cd1d demux: make the parse a bit more strict 28bb4107 update NEWS cef93882 bump version to 0.3.0 9048494d build: fix install race on shared headers 1e67e8ef README updates 42b611a4 Merge "configure: drop experimental from mux/demux" into 0.3.0 096a8e32 Merge "vwebp: add color profile support" into 0.3.0 ddfee5dc vwebp: add color profile support 0d6927d3 Merge "Mark fragment options as experimental in webpmux" into 0.3.0 5dbd4030 Mark fragment options as experimental in webpmux a0a6648c configure: drop experimental from mux/demux ee65bad8 Merge "add support for BITS > 32" into 0.3.0 744930db add support for BITS > 32 7dd288f0 cwebp: fix build 19a8dd01 Merge "Makefile.vc: add vwebp.exe target" into 0.3.0 50eeddad Merge "examples: normalize icc related program arguments" into 0.3.0 757f637f Merge "Makefile.vc: add libwebpdecoder target" into 0.3.0 b65c4b7c Makefile.vc: add libwebpdecoder target f8db7b4a Merge "vwebp: replace doubles w/floats where appropriate" into 0.3.0 d99aa56f Makefile.vc: add vwebp.exe target 013023e7 vwebp: replace doubles w/floats where appropriate 9b3db894 README.mux: add version reference 7b6a26cf Merge "cwebp: output metadata statistics" into 0.3.0 d8dc72a0 examples: normalize icc related program arguments 7bfc9056 Merge "make alpha unfilter work in-place" into 0.3.0 0037b2d2 Merge "add LUT-free reference code for YUV->RGB conversion." into 0.3.0 166bf744 Merge "demux: disable fragment parsing" into 0.3.0 126974b4 add LUT-free reference code for YUV->RGB conversion. 0aef3ebd make alpha unfilter work in-place 14ef5005 Merge "Remove 'status: experimental' from container spec" into 0.3.0 d40c98e1 Merge "webpmux binary: tiny style fix" into 0.3.0 0bc42689 cwebp: output metadata statistics bc039803 Merge "autoconf: normalize experimental define" into 0.3.0 d1e21b13 Remove 'status: experimental' from container spec 7681bb96 webpmux binary: tiny style fix a3dd3d0f avoid installing example_util.h 252320e2 demux: disable fragment parsing 537bde05 autoconf: normalize experimental define 5e338e0b Merge changes I33e8a613,I8e8a7b44 into 0.3.0 d9d0ea1b Merge changes If21e3ec7,I991fc30b into 0.3.0 627f5ca6 automake: add reference to libwebp for mux/demux eef73d07 don't consolidate proba stats too often 05ec4cc2 libwebp{,decoder}.pc: add pthread flags 1bfcf5bf add libwebpmux.pc 26ca843d add libwebpdemux.pc 69e25906 Merge "Tune Lossless compression for lower qualities." 0478b5d2 Tune Lossless compression for lower qualities. 39f7586f add a mention of parallel alpha encoding in the NEWS 5a21d967 Merge "1.5x-2x faster encoding for method 3 and up" 9bfbdd14 1.5x-2x faster encoding for method 3 and up 27dc741b Correct frame options order in README.mux be2fd173 Mux: fix a scenario with bad ANMF/FRGM size 19eb012c Merge "Demux: Add option to get frame count using GetI()" 7368b8cb Merge "WebPGetFeatures() out of if condition for clarity." f604c9a4 Merge "fix windows build" 153f94e8 fix windows build 847b4924 Merge "vwebp: use magenta for 'i'nfo display" 25ea46bd Merge "vwebp: add keyboard shortcuts to help output" bea7ccaf vwebp: use magenta for 'i'nfo display 8fab161a webpmux: correct -frame param order in help output 03cc23d6 vwebp: add keyboard shortcuts to help output 068eba8d Demux: Add option to get frame count using GetI() 988b8f56 WebPGetFeatures() out of if condition for clarity. 6933d910 Merge "gif2webp: Be lenient about background color index." 4d0f7c55 Merge "WebPGetFeatures() behavior change:" fdeeb01d gif2webp: Be lenient about background color index. ad250320 Merge "multi-threaded alpha encoding for lossy" 4e32d3e1 Merge "fix compilation of token.c" f817930a multi-threaded alpha encoding for lossy 88050351 fix compilation of token.c fc816219 code using the actual values for num_parts_, not the ones from config 72655350 Merge "move the config check from .c to .h" dd9e76f7 move the config check from .c to .h 956b217a WebPGetFeatures() behavior change: df02e4ce WebPDemuxGetI behavior change: 633c004d Merge "rebalance method tools (-m) for methods [0..4]" 58ca6f65 rebalance method tools (-m) for methods [0..4] 7648c3cc Merge "describe rd-opt levels introduce VP8RDLevel enum" 67fb1003 Merge "autoconf: enable silent-rules by default" a5042a32 GetVersion() methods for mux and demux 5189957e describe rd-opt levels introduce VP8RDLevel enum 4e094ace autoconf: enable silent-rules by default b7eaa85d inline VP8LFastLog2() and VP8LFastSLog2 for small values 5cf7792e split quant_levels.c into decoder and encoder version e5d3ffe2 Merge "Update code example in README.mux" ac5a9156 Update code example in README.mux 38a91e99 Add example code snippet for demux API 5f557f3c README.mux: add info about Demux API and vwebp c0ba0903 backward_references: avoid signed integer overflow 943386db disable SSE2 for now 9479fb7d lossless encoding speedup ec2030a8 merge two lines together b67956c0 Merge "Remove ReadOneBit() and ReadSymbolUnsafe()" 1667bded Remove ReadOneBit() and ReadSymbolUnsafe() 3151669b wicdec + dwebp cosmetics: normalize formatting 92668da6 change default filtering parameters: * type is now 'strong' * strength is now '60' b7490f85 introduce WEBP_REFERENCE_IMPLEMENTATION compile option 33838857 faster decoding (3%-6%) 5c3e381b Merge "add a -jpeg_like option" c2311046 remove unused declaration of VP8Zigzag 36152957 Merge "wicdec: add alpha support for paletted formats" c9f16490 wicdec: add alpha support for paletted formats 1262f81e Merge "wicdec: silence some warnings" e7ea61eb wicdec: silence some warnings 23c0f354 fix missing intptr_t->int cast for MSVC e895059a add a -jpeg_like option 1f803f64 Merge "Tune alpha quality mapping to more reasonable values." 1267d498 Tune alpha quality mapping to more reasonable values. 043076e2 Merge "speed-up lossless in BackwardTrace" f3a44dcd remove one malloc from TraceBackwards() 0fc1a3a0 speed-up lossless in BackwardTrace 7c732e59 cwebp: centralize WebPCleanupTransparentArea() 7381254e Merge "wicdec: add ICC profile extraction" e83ff7de wicdec: add ICC profile extraction 146c6e3b Merge "cosmetics: pngdec: normalize default label location" a8f549d7 Merge "manpages: italicize option parameters" e118db83 Merge "encode.h: note the need to free() WebPMemoryWriter" 1dfee6db cosmetics: pngdec: normalize default label location 14c38200 manpages: italicize option parameters 7defbfad encode.h: note the need to free() WebPMemoryWriter 88d382a0 cwebp: cleanup after memory_writer 12d6cecf fix extra space in dwebp.1 man b01681a9 Fix for demuxer frame iteration: 56c12aa6 Demuxer creation fix: 66c810bc add a -yuv option to dwebp (very similar to -pgm) 841a3ba5 Merge "Remove -Wshadow warnings." 8fd02527 Merge "upsampling_neon.c: fix build" 6efed268 Remove -Wshadow warnings. 60904aa6 Merge "allow WebPINewRGB/YUVA to be passed a NULL output buffer." b7adf376 allow WebPINewRGB/YUVA to be passed a NULL output buffer. 27f8f742 upsampling_neon.c: fix build 06b9cdf1 gitignore: add IOS related directories f112221e Merge "Fix more comments for iobuild.sh" fe4d25dd Fix more comments for iobuild.sh 1de3e252 Merge "NEON optimised yuv to rgb conversion" 090b708a NEON optimised yuv to rgb conversion daa06476 Merge "Add ios build script for building iOS library." 79fe39e2 Add ios build script for building iOS library. 126c035f remove some more -Wshadow warnings 522e9d61 Merge "cwebp: enable '-metadata'" 76ec5fa1 cwebp: enable '-metadata' aeb91a9d Merge "cosmetics: break a few long lines" be7c96b0 cosmetics: break a few long lines cff8ddb6 Merge "add libwebpdecoder.pc" 93148ab8 Merge "libwebp.pc.in: detab" 6477f955 Merge "Makefile.vc: normalize path separator" bed1ed7c add libwebpdecoder.pc 46168b2d libwebp.pc.in: detab a941a346 Fixed few nits in the build files. dd7a49b2 Makefile.vc: normalize path separator 9161be86 Merge "cwebp: extract WIC decoding to its own module" 08e7c58e Merge "Provide an option to build decoder library." 0aeba528 Provide an option to build decoder library. 757ebcb1 catch malloc(0)/calloc(0) with an assert 152ec3d2 Merge "handle malloc(0) and calloc(0) uniformly on all platforms" a452a555 cwebp: extract WIC decoding to its own module 2b252a53 Merge "Provide option to swap bytes for 16 bit colormodes" 94a48b4b Provide option to swap bytes for 16 bit colormodes 42f8f934 handle malloc(0) and calloc(0) uniformly on all platforms 8b2152c5 Merge "add an extra assert to check memory bounds" 0d19fbff remove some -Wshadow warnings cd22f655 add an extra assert to check memory bounds 8189feda Merge "Add details and reference about the YUV->RGB conversion" 1d2702b1 Merge "Formatting fixes in lossless bitstream spec" 8425aaee Formatting fixes in lossless bitstream spec a556cb1a Add details and reference about the YUV->RGB conversion d8f21e0b add link to SSIM description on Wikipedia 18e9167e Merge "WebP-lossless spec clarifications:" 98e25b9b Merge "cwebp: add -metadata option" f01c2a53 WebP-lossless spec clarifications: f4a97970 Merge "Disto4x4 and Disto16x16 in NEON" 47b7b0ba Disto4x4 and Disto16x16 in NEON 7eaee9f1 cwebp: add -metadata option 36c52c2c tiffdec: use toff_t for exif ifd offset 7c8111e4 Merge "cwebp/tiffdec: add TIFF metadata extraction" e6409adc Remove redundant include from dsp/lossless code. 1ab5b3a7 Merge "configure: fix --with-gifincludedir" 03c749eb configure: fix --with-gifincludedir 8b650635 multiple libgif versions support for gif2webp 476e293f gif2webp: Use DGifOpenFileName() b50f277b tiffdec: correct format string 2b9048e3 Merge "tiffdec: check error returns for width/height" a1b5a9a3 Merge "cwebp/tiff: use the first image directory" 079423f5 tiffdec: check error returns for width/height d62824af Merge "cwebp/jpegdec: add JPEG metadata extraction" 03afaca4 Merge "cwebp: add PNG metadata extraction" 2c724968 cwebp/jpegdec: add JPEG metadata extraction dba64d91 cwebp: add PNG metadata extraction 1f075f89 Lossless spec corrections/rewording/clarifications 2914ecfd cwebp/tiffdec: add TIFF metadata extraction d82a3e33 More corrections/clarifications in lossless spec: bd002557 cwebp/tiff: use the first image directory df7aa076 Merge "Cleanup around jpegdec" 0f57dcc3 decoding speed-up (~1%) bcec339b Lossless bitstream clarification: 6bf20874 add examples/metadata.c 207f89c0 Merge "configure: add libwebpdemux status to summary" 1bd287a6 Cleanup around jpegdec 91455679 Merge "cosmetics: use '== 0' in size checks" d6b88b76 cosmetics: use '== 0' in size checks d3dace2f cosmetics: jpegdec 2f69af73 configure: add libwebpdemux status to summary 1c1c5646 cwebp: extract tiff decoding to its own module 6a871d66 cwebp: extract jpeg decoding to its own module 2ee228f9 cwebp: extract png decoding to its own module 4679db00 Merge "cwebp: add metadata framework" 63aba3ae cwebp: add metadata framework 931bd516 lossless bitstream: block size bits correction e4fc4c1c lossless bitstream: block size bits correction d65ec678 fix build, move token.c to src/enc/ 657f5c91 move token buffer to its own file (token.c) c34a3758 introduce GetLargeValue() to slim-fast GetCoeffs(). d5838cd5 faster non-transposing SSE2 4x4 FTransform f76191f9 speed up GetResidualCost() ba2aa0fd Add support for BITS=24 case 2e7f6e8e makefile.unix: Dependency on libraries dca84219 Merge "Separate out mux and demux code and libraries:" 23782f95 Separate out mux and demux code and libraries: bd56a01f configure: add summary output 90e5e319 dwebp manual: point to webpmux, gif2webp. 540790ca gif2webp.c: add a note about prerequisites d1edf697 cwebp man page: meaning of '-q' for lossy/lossless 79efa1d0 Add man page for gif2webp utility 2243e40c Merge "gif2webp build support with autoconf tools" c40efca1 gif2webp build support with autoconf tools 6523e2d4 WebP Container: 4da788da Merge "simplify the fwd transform" 42c3b550 simplify the fwd transform 41a6ced9 user GLfloat instead of float b5426119 fix indentation 68f282f7 * handle offset in anim viewer 'vwebp' * fix gif2webp to handle disposal method and odd offset correctly 118cb312 Merge "add SSE2 version of Sum of Square error for 16x16, 16x8 and 8x8 case" 8a7c3cc8 Merge "Change the order of -frame argument to be more natural" 99e0a707 Merge "Simplify the texture evaluation Disto4x4()" 0f923c3f make the bundling work in a tmp buffer e5c3b3f5 Simplify the texture evaluation Disto4x4() 48600084 Change the order of -frame argument to be more natural 35bfd4c0 add SSE2 version of Sum of Square error for 16x16, 16x8 and 8x8 case a7305c2e Clarification for unknown chunks 4c4398e2 Refine WebP Container Spec wrt unknown chunks. 2ca642e0 Rectify WebPMuxGetFeatures: 7caab1d8 Some cosmetic/comment fixes. 60b2651a Merge "Write a GIF to WebP converter based on libgif." c7127a4d Merge "Add NEON version of FTransformWHT" 11b27212 Write a GIF to WebP converter based on libgif. e9a15a37 ExUtilWriteFile() to write memory segment to file 74356eb5 Add a simple cleanup step in mux assembly: 51bb1e5d mux.h: correct WebPDemuxSelectFragment() prototype 22a0fd9d Add NEON version of FTransformWHT fa30c863 Update mux code to match the spec wrt animation d9c5fbef by-pass Analysis pass in case segments=1 d2ad4450 Merge changes Ibeccffc3,Id1585b16 5c8be251 Merge "Chunk fourCCs for XMP/EXIF" a00a3daf Use 'frgm' instead of 'tile' in webpmux parameters 81b8a741 Design change in ANMF and FRGM chunks: f903cbab Chunk fourCCs for XMP/EXIF 812933d6 Tune performance of HistogramCombine 52ad1979 Animation specification in container spec 001b9302 Image fragment specification in container spec 391f9db9 Ordering of description of bits in container spec d5735776 Metadata specification in container spec 1c4609b1 Merge commit 'v0.2.1' 0ca584cb Merge "Color profile specification in container spec" e8b41ad1 add NEON asm version for WHT inverse transform af6f0db2 Color profile specification in container spec a61a824b Merge "Add NULL check in chunk APIs" 0e8b7eed fix WebPPictureView() unassigned strides 75e5f17e ARM/NEON: 30% encoding speed-up 02b43568 Add NULL check in chunk APIs a0770727 mux struct naming 6c66dde8 Merge "Tune Lossless encoder" ab5ea217 Tune Lossless encoder 74fefc8c Update ChangeLog (tag: v0.2.1, origin/0.2.0) 92f8059c Rename some chunks: 3bb4bbeb Merge "Mux API change:" d0c79f05 Mux API change: abc06044 Merge "update NEWS" into 0.2.0 57cf313b update NEWS 25f585c4 bump version to 0.2.1 fed7c048 libwebp: validate chunk size in ParseOptionalChunks 552cd9bc cwebp (windows): fix alpha image import on XP b14fea99 autoconf/libwebp: enable dll builds for mingw 4a8fb272 [cd]webp: always output windows errors d6621580 fix double to float conversion warning 72b96a69 cwebp: fix jpg encodes on XP 734f762a VP8LAllocateHistogramSet: fix overflow in size calculation f9cb58fb GetHistoBits: fix integer overflow b30add20 EncodeImageInternal: fix uninitialized free 3de58d77 fix the -g/O3 discrepancy for 32bit compile 77aa7d50 fix the BITS=8 case e5970bda Make *InitSSE2() functions be empty on non-SSE2 platform ef5cc47e make *InitSSE2() functions be empty on non-SSE2 platform c4ea259d make VP8DspInitNEON() public 8344eadf Merge "libwebp: validate chunk size in ParseOptionalChunks" 4828bb93 Merge "cwebp (windows): fix alpha image import on XP" 30763333 libwebp: validate chunk size in ParseOptionalChunks 70481898 AccumulateLSIM: fix double -> float warnings eda8ee4b cwebp (windows): fix alpha image import on XP c6e98658 Merge "add EXPERIMENTAL code for YUV-JPEG colorspace" f0360b4f add EXPERIMENTAL code for YUV-JPEG colorspace f86e6abe add LSIM metric to WebPPictureDistortion() c3aa215a Speed up HistogramCombine for lower qualities. 1765cb1c Merge "autoconf/libwebp: enable dll builds for mingw" a13562e8 autoconf/libwebp: enable dll builds for mingw 9f469b57 typo: no_fancy -> no_fancy_upsampling 1a27f2f8 Merge "fix double to float conversion warning" cf1e90de Merge "cwebp: fix jpg encodes on XP" f2b5d19b [cd]webp: always output windows errors e855208c fix double to float conversion warning ecd66f77 cwebp: fix jpg encodes on XP 7b3eb372 Tune lossless compression to get better gains. ce8bff45 Merge "VP8LAllocateHistogramSet: fix overflow in size calculation" ab5b67a1 Merge "EncodeImageInternal: fix uninitialized free" 7fee5d12 Merge "GetHistoBits: fix integer overflow" a6ae04d4 VP8LAllocateHistogramSet: fix overflow in size calculation 80237c43 GetHistoBits: fix integer overflow 8a997235 EncodeImageInternal: fix uninitialized free 0b9e6829 minor cosmetics a792b913 fix the -g/O3 discrepancy for 32bit compile 73ba4357 Merge "detect and merge similar segments" fee66275 detect and merge similar segments 0c44f415 src/webp/*.h: don't forward declare enums in C++ d7a5ac86 vwebp: use demux interface 931e0ea1 Merge "replace 'typedef struct {} X;" by "typedef struct X X; struct X {};"" 8f216f7e remove cases of equal comparison for qsort() 28d25c82 replace 'typedef struct {} X;" by "typedef struct X X; struct X {};" 2afee60a speed up for ARM using 8bit for boolean decoder 5725caba new segmentation algorithm 2cf1f815 Merge "fix the BITS=8 case" 12f78aec fix the BITS=8 case 6920c71f fix MSVC warnings regarding implicit uint64 to uint32 conversions f6c096aa webpmux binary: Rename 'xmp' option to 'meta' ddfe871a webpmux help correction b7c55442 Merge "Make *InitSSE2() functions be empty on non-SSE2 platform" 1c04a0d4 Common APIs for chunks metadata and color profile. 2a3117a1 Merge "Create WebPMuxFrameInfo struct for Mux APIs" 5c3a7231 Make *InitSSE2() functions be empty on non-SSE2 platform 7c6e60f4 make *InitSSE2() functions be empty on non-SSE2 platform c7eb4576 make VP8DspInitNEON() public ab3234ae Create WebPMuxFrameInfo struct for Mux APIs e3990fd8 Alignment fixes e55fbd6d Merge branch '0.2.0' 4238bc0a Update ChangeLog (tag: v0.2.0) c655380c dec/io.c: cosmetics fe1958f1 RGBA4444: harmonize lossless/lossy alpha values 681cb30a fix RGBA4444 output w/fancy upsampling f06c1d8f Merge "Alignment fix" into 0.2.0 f56e98fd Alignment fix 6fe843ba avoid rgb-premultiply if there's only trivial alpha values 528a11af fix the ARGB4444 premultiply arithmetic a0a48855 Lossless decoder fix for a special transform order 62dd9bb2 Update encoding heuristic w.r.t palette colors. 6f4272b0 remove unused ApplyInverseTransform() 93bf0faa Update ChangeLog (tag: v0.2.0-rc1) 5934fc59 update AUTHORS 014a711d update NEWS 43b0d610 add support for ARGB -> YUVA conversion for lossless decoder 33705ca0 bump version to 0.2.0 c40d7ef1 fix alpha-plane check + add extra checks a06f8023 MODE_YUVA: set alpha to opaque if the image has none 52a87dd7 Merge "silence one more warning" into 0.2.0 3b023093 silence one more warning f94b04f0 move some RGB->YUV functions to yuv.h 4b71ba03 README: sync [cd]webp help output c9ae57f5 man/dwebp.1: add links to output file format details 292ec5cc quiet a few 'uninitialized' warnings 4af3f6c4 fix indentation 9b261bf5 remove the last NOT_HAVE_LOG2 instances 323dc4d9 remove use of log2(). Use VP8LFastLog2() instead. 8c515d54 Merge "harness some malloc/calloc to use WebPSafeMalloc and WebPSafeCalloc" into 0.2.0 d4b4bb02 Merge changes I46090628,I1a41b2ce into 0.2.0 bff34ac1 harness some malloc/calloc to use WebPSafeMalloc and WebPSafeCalloc a3c063c7 Merge "extra size check for security" into 0.2.0 5e796300 Merge "WebPEncode: clear stats at the start of encode" into 0.2.0 f1edf62f Merge "rationalize use of color-cache" into 0.2.0 c1933317 extra size check for security 906be657 rationalize use of color-cache dd1c3873 Add image-hint for low-color images. 4eb7aa64 Merge "WebPCheckMalloc() and WebPCheckCalloc():" into 0.2.0 80cc7303 WebPCheckMalloc() and WebPCheckCalloc(): 183cba83 check VP8LBitWriterInit return cbfa9eec lossless: fix crash on user abort 256afefa cwebp: exit immediately on version mismatch 475d87d7 WebPEncode: clear stats at the start of encode a7cc7291 fix type and conversion warnings 7d853d79 add stats for lossless d39177b7 make QuantizeLevels() store the sum of squared error 5955cf5e replace x*155/100 by x*101581>>16 7d732f90 make QuantizeLevels() store the sum of squared error e45a446a replace x*155/100 by x*101581>>16 159b75d3 cwebp output size consistency: cbee59eb Merge commit 'v0.1.99' 1889e9b6 dwebp: report -alpha option 3bc3f7c0 Merge "dwebp: add PAM output support" into 0.2.0 d919ed06 dwebp: add PAM output support 85e215d3 README/manpages/configure: update website link c3a207b9 Update ChangeLog (tag: v0.1.99) d1fd7826 Merge "add extra precision about default values and behaviour" into 0.2.0 efc826e0 add extra precision about default values and behaviour 9f29635d header/doc clean up ff9fd1ba Makefile.vc: fix webpmux.exe *-dynamic builds 8aacc7b0 remove INAM, ICOP, ... chunks from the test webp file. 2fc13015 harmonize authors as "Name (mail@address)" 4a9f37b7 Merge "update NEWS" into 0.2.0 7415ae13 makefile.unix: provide examples/webpmux target ce82cedc update NEWS 641e28e8 Merge "man/cwebp.1: wording, change the date" into 0.2.0 c37c23e5 README: cosmetics 3976dcd5 man/cwebp.1: wording, change the date 3e5bbe1c Merge "rename 'use_argb_input' to 'use_argb'" into 0.2.0 ce90847a Merge "add some padding bytes areas for later use" into 0.2.0 2390dabc Merge "fixing the findings by Frederic Kayser to the bitstream spec" into 0.2.0 02751591 add a very crude progress report for lossless a4b9b1c6 Remove some unused enum values. dd108176 rename 'use_argb_input' to 'use_argb' 90516ae8 add some padding bytes areas for later use d03b2503 fixing the findings by Frederic Kayser to the bitstream spec ce156afc add missing ABI compatibility checks 9d45416a Merge "Doc: container spec text tweaks" into 0.2.0 4e2e0a8c Doc: container spec text tweaks f7f16a29 add ABI compatibility check 2a775570 Merge "swig: add WebPEncodeLossless* wrappers" into 0.2.0 a3ec6225 mux.h: remove '* const' from function parameters 31426eba encode.h: remove '* const' from function parameters 9838e5d5 decode.h: remove '* const' from function parameters 4972302d swig: add WebPEncodeLossless* wrappers 9ff00cae bump encoder/decoder versions c2416c9b add lossless quick encoding functions to the public API 4c1f5d64 Merge "NEWS: mention decode_vp8.h is no longer installed" into 0.2.0 6cb2277d NEWS: mention decode_vp8.h is no longer installed d5e5ad63 move decode_vp8.h from webp/ to dec/ 8d3b04a2 Merge "header clean-up" into 0.2.0 02201c35 Merge "remove one malloc() by making color_cache non dynamic" into 0.2.0 d708ec14 Merge "move MIN/MAX_HISTO_BITS to format_constants.h" into 0.2.0 ab2da3e9 Merge "add a malloc() check" into 0.2.0 2d571bd8 add a malloc() check 7f0c178e remove one malloc() by making color_cache non dynamic 6569cd7c Merge "VP8LFillBitWindow: use 64-bit path for msvc x64 builds" into 0.2.0 23d34f31 header clean-up 2a3ab6f9 move MIN/MAX_HISTO_BITS to format_constants.h 985d3da6 Merge "shuffle variables in HashChainFindCopy" into 0.2.0 cdf885c6 shuffle variables in HashChainFindCopy c3b014db Android.mk: add missing lossless files 8c1cc6b5 makefile.unix dist: explicitly name installed includes 7f4647ee Merge "clarify the colorspace naming and byte ordering of decoded samples" into 0.2.0 cbf69724 clarify the colorspace naming and byte ordering of decoded samples 857650c8 Mux: Add WebPDataInit() and remove WebPImageInfo ff771e77 don't install webp/decode_vp8.h 596dff78 VP8LFillBitWindow: use 64-bit path for msvc x64 builds 3ca7ce98 Merge "doc: remove non-finalized chunk references" into 0.2.0 1efaa5a3 Merge "bump versions" into 0.2.0 51fa13e1 Merge "README: update cwebp help output" into 0.2.0 12f9aede README: update cwebp help output f0b5defb bump versions 4c42a61b update AUTHORS 6431a1ce doc: remove non-finalized chunk references 8130c4cc Merge "build: remove libwebpmux from default targets/config" 23b44438 Merge "configure: broaden test for libpng-config" 85bff2cd Merge "doc: correct lossless prefix coding table & code" 05108f6e Merge "More spec/code matching in mux:" 6808e69d More spec/code matching in mux: bd2b46f5 Merge "doc/webp-container-spec: light cosmetics" 20ead329 doc/webp-container-spec: light cosmetics 1d40a8bc configure: add pthread detection b5e9067a fix some int <-> size_t mix for buffer sizes e41a7596 build: remove libwebpmux from default targets/config 0fc2baae configure: broaden test for libpng-config 45b8272c Merge "restore authorship to lossless bitstream doc" 06ba0590 restore authorship to lossless bitstream doc 44a09a3c add missing description of the alpha filtering methods 63db87dd Merge "vwebp: add checkboard background for alpha display" a73b8978 vwebp: add checkboard background for alpha display 939158ce Merge "vwebp: fix info display" b35c07d9 vwebp: fix info display 48b39eb1 fix underflow for very short bitstreams 7e622984 cosmetics: param alignment, manpage wording 1bd7dd50 Merge changes I7b0afb0d,I7ecc9708 ac69e63e Merge "Updated cwebp man's help for Alpha & Lossless." c0e8859d Get rid of image_info_ from WebPChunk struct. 135ca69e WebP Container Spec: eb6f9b8a Updated cwebp man's help for Alpha & Lossless. 0fa844fb cosmetic fixes on assert and 'const' where applicable 7f22bd25 check limit of width * height is 32 bits 16c46e83 autoconf/make: cosmetics: break long lines ab22a07a configure: add helper macro to define --with-* c17699b3 configure: add libtiff test 0e09732c Merge "cwebp: fix crash with yuv input + lossless" 88a510ff Merge "fix big-endian VP8LWriteBits" da99e3bf Merge "Makefile.vc: split mux into separate lib" 7bda392b cwebp: fix crash with yuv input + lossless f56a369a fix big-endian VP8LWriteBits 54169d6c Merge "cwebp: name InputFileFormat members consistently" e2feefa9 Makefile.vc: split mux into separate lib 27caa5aa Merge "cwebp: add basic TIFF support" d8921dd4 cwebp: name InputFileFormat members consistently 6f76d246 cwebp: add basic TIFF support 4691407b Merge changes If39ab7f5,I3658b5ae cca7c7b8 Fixed nit: 10 -> 10.f 5d09a244 WebPMuxCreate() error handling: 777341c3 Fix a memleak in WebPMuxCreate() 61c9d161 doc: correct lossless prefix coding table & code 4c397579 Merge "mark VP8{,L}{GetInfo,CheckSignature} as WEBP_EXTERN" e4e36cc6 Merge "Mux: Allow only some frames/tiles to have alpha." ad2aad3c Merge "WebP Decoding error handling:" 97649c8f Mux: Allow only some frames/tiles to have alpha. f864be3b Lower the quality settings for Alpha encoding. 3ba81bbe WebP Decoding error handling: fcc69923 add automatic YUVA/ARGB conversion during WebPEncode() 802e012a fix compilation in non-FANCY_UPSAMPLING mode e012dfd9 make width/height coding match the spec 228d96a5 mark VP8{,L}{GetInfo,CheckSignature} as WEBP_EXTERN 637a314f remove the now unused *KeepA variants d11f6fcc webpmux returns error strings rather than numbers fcec0593 makefile.unix: cwebp: fix OSX link 6b811f1b Merge "doc: remove lossless pdf" c9634821 doc: remove lossless pdf b9ae4f0d cosmetics after mux changes b74ed6e, b494ad5 b494ad50 Mux: only allow adding frame/tiles at the end. 2c341b0e Merge "Added image characteristic hint for the codec." d373076a Added image characteristic hint for the codec. 2ed2adb5 Merge "msvc: add intrinsic based BitsLog2Floor" e595e7c5 Merge "add demux.c to the makefiles" da47b5bd Merge "demux: add {Next,Prev}Chunk" e5f46742 add demux.c to the makefiles 4708393c demux: add {Next,Prev}Chunk e8a0a821 demux: quiet msvc warnings 7f8472a6 Update the WebP Container Spec. 31b68fe6 cleanup WebPPicture struct and API 9144a186 add overflow check before calling malloc() 81720c91 consistency cosmetics 2ebe8394 Merge "Add kramdown version information to README" 71443084 enc/vp8l.c: fix build b7ac19fe Add kramdown version information to README efdcb667 Merge "Edit for consistency, usage and grammar." 08220102 Enable alpha in vvwebp 8de9a084 Merge "Mux API change:" b74ed6e7 Mux API change: 233a589e take picture->argb_stride into account for lossless coding 04e33f17 Edit for consistency, usage and grammar. a575b4bc Merge "cosmetics: add missing const" 8d99b0f4 Merge "cosmetics: remove unimplemented function proto" 69d02217 cosmetics: add missing const 5b08318b cosmetics: remove unimplemented function proto b7fb0ed5 Log warning for unsupported options for lossless. e1f769fe msvc: add intrinsic based BitsLog2Floor 8a69c7d8 Bug-fix: Clamp backward dist to 1. b5b6ac97 Merge "Bring the special writer 'WebPMemoryWriter' to public API" a6a1909f Merge "Fix floating point exception with cwebp -progress" f2cee067 Fix floating point exception with cwebp -progress 91b7a8c7 Bring the special writer 'WebPMemoryWriter' to public API 310e2972 support resize and crop for RGBA input a89835d3 Merge changes Ice662960,Ie8d7aa90,I2d996d5e,I01c04772 ce614c0c Merge "dec/vp8: avoid setting decoder status twice" 900285da dec/vp8: avoid setting decoder status twice 8227adc8 Merge changes I6f02b0d0,I5cbc9c0a,I9dd9d4ed,Id684d2a1 dcda59c1 Merge "demux: rename SetTile to SelectTile" 622ef12e demux: rename SetTile to SelectTile 81ebd375 Merge "demux: add {Next,Prev}Frame" 02dd37a2 demux: add {Next,Prev}Frame 4b79fa59 Merge "Limit the maximum size of huffman Image to 16MB." 9aa34b34 Manually number "chapters," as chapter numbers are used in the narrative. 2a4c6c29 Re-wrap at <= 72 columns a45adc19 Apply inline emphasis and monospacing, per gdoc / PDF 91011206 Incorporate gdoc changes through 2012-06-08 7a182487 Removed CodeRay syntax declarations ... b3ec18c5 Provide for code-block syntax highlighting. 709d7702 Replace high ASCII artifacts (curly quotes, etc.). 930e8abb Lossless WebP doc largely ported to markdown text. 18cae37b msvc: silence some build warnings b3923084 Limit the maximum size of huffman Image to 16MB. f180df2a Merge "libwebp/demux: add Frame/Chunk iteration" 2bbe1c9a Merge "Enable lossless encoder code" d0601b01 Merge changes I1d97a633,I81c59093 78f3e345 Enable lossless encoder code d974a9cc Merge "libwebp/demux: add simple format parsing" 26bf2232 Merge "libwebp: add WebPDemux stub functions" 2f666688 Merge "modify WebPParseHeaders to allow reuse by GetFeatures" b402b1fb libwebp/demux: add Frame/Chunk iteration ad9ada3b libwebp/demux: add WebPDemuxGetI 2f2d4d58 libwebp/demux: add extended format parsing 962dcef6 libwebp/demux: add simple format parsing f8f94081 libwebp: add WebPDemux stub functions fb47bb5c Merge "NumNamedElements() should take an enum param." 7c689805 Fix asserts in Palette and BackwardReference code. fbdcb7ea NumNamedElements() should take an enum param. fb4943bd modify WebPParseHeaders to allow reuse by GetFeatures 3697b5ce write an ad-hoc EncodeImageInternal variant eaee9e79 Bug-Fix: Decode small (less than 32 bytes) images. 0bceae48 Merge "cwebp: fix alpha reporting in stats output" 0424b1ef Rebase default encoding settings. c71ff9e3 cwebp: fix alpha reporting in stats output e2ffe446 Merge "Stop indefinite recursion for Huffman Image." 70eb2bd6 Stop indefinite recursion for Huffman Image. f3bab8eb Update vwebp 6d5c797c Remove support for partial files in Mux. f1df5587 WebPMuxAssemble() returns WebPData*. 814a0639 Rename 'Add' APIs to 'Set'. bbb0218f Update Mux psuedo-code examples. 4fc4a47f Use WebPData in MUX set APIs c67bc979 Merge "add WebPPictureImportRGBX() and WebPPictureImportBGRX()" 27519bc2 add WebPPictureImportRGBX() and WebPPictureImportBGRX() f80cd27e factorize code in Import() 9b715026 histogram: add log2 wrapper 8c34378f Merge "fix some implicit type conversion warnings" 42f6df9d fix some implicit type conversion warnings 250c16e3 Merge "doc: update lossless pdf" 9d9daba4 Merge "add a PDF of the lossless spec" 8fbb9188 prefer webp/types.h over stdint.h 0ca170c2 doc: update lossless pdf 0862ac6e add a PDF of the lossless spec 437999fb introduce a generic WebPPictureHasTransparency() function d2b6c6c0 cosmetic fixes after Idaba281a b4e6645c Merge "add colorspace for premultiplied alpha" 48f82757 add colorspace for premultiplied alpha 069f903a Change in lossless bit-stream. 5f7bb3f5 Merge "WebPReportProgress: use non-encoder specific params" f18281ff WebPReportProgress: use non-encoder specific params 9ef32283 Add support for raw lossless bitstream in decoder. 7cbee29a Fix bug: InitIo reseting fancy_upsampling flag. 880fd98c vwebp: fix exit w/freeglut 1875d926 trap two unchecked error conditions 87b4a908 no need to have mux.h as noinst clause in enc/ 88f41ec6 doc: fix bit alignment in VP8X chunk 52f5a4ef Merge "fix bug with lossy-alpha output stride" 3bde22d7 fix bug with lossy-alpha output stride 42d61b6d update the spec for the lossy-alpha compression methods. e75dc805 Move some more defines to format_constants.h c13f6632 Move consts to internal header format_constants.h 7f2dfc92 use a bit-set transforms_seen_ instead of looping 18da1f53 modulate alpha-compression effort according to config.method f5f2fff6 Merge "Alpha flag fix for lossless." c975c44e Alpha flag fix for lossless. 4f067fb2 Merge "Android: only build dec_neon with NEON support" 255c66b4 Android: only build dec_neon with NEON support 8f9117a9 cosmetics: signature fixes 39bf5d64 use header-less lossless bitstream for alpha channel 75d7f3b2 Merge "make input data be 'const' for VP8LInverseTransform()" 9a721c6d make input data be 'const' for VP8LInverseTransform() 9fc64edc Disallow re-use of same transformation. 98ec717f use a function pointer for ProcessRows() f7ae5e37 cosmetics: join line 140b89a3 factor out buffer alloc in AllocateARGBBuffers() a107dfa8 Rectify WebPParseOptionalChunks(). 237eab67 Add two more color-spaces for lossless decoding. 27f417ab fix orthographic typo 489ec335 add VP8LEncodeStream() to compress lossless image stream fa8bc3db make WebPEncodingSetError() take a const picture 638528cd bitstream update for lossy alpha compression d73e63a7 add DequantizeLevels() placeholder ec122e09 remove arch-dependent rand() d40e7653 fix alignment 1dd6a8b6 Merge "remove tcoder, switch alpha-plane compression to lossless" 3e863dda remove tcoder, switch alpha-plane compression to lossless 8d77dc29 Add support for lossless in mux: 831bd131 Make tile size a function of encoding method. 778c5228 Merge "remove some variable shadowing" 817c9dce Few more HuffmanTreeToken conversions. 37a77a6b remove some variable shadowing 89c07c96 Merge "normalize example header includes" 4aff411f Merge "add example_util.[hc]" 00b29e28 normalize example header includes 061263a7 add example_util.[hc] c6882c49 merge all tree processing into a single VP8LProcessTree() 9c7a3cf5 fix VP8LHistogramNumCodes to handle the case palette_code_bits == 0 b5551d2e Merge "Added HuffmanTreeCode Struct for tree codes." 8b85d01c Added HuffmanTreeCode Struct for tree codes. 093f76d8 Merge "Allocate single memory in GetHuffBitLengthsAndCodes." 41d80494 Allocate single memory in GetHuffBitLengthsAndCodes. 1b04f6d2 Correct size in VP8L header. 2924a5ae Makefile.vc: split object lists based on directory c8f24165 Merge "add assert(tokens)" 43239947 add assert(tokens) 9f547450 Catch an error in DecodeImageData(). ac8e5e42 minor typo and style fix 9f566d1d clean-up around Huffman-encode c579a710 Introduce CHUNK_SIZE_BYTES in muxi.h. 14757f8a Make sure huffman trees always have valid symbols 41050618 makefile.unix: add support for building vwebp 48b37721 Merge "fixed signed/unsigned comparison warning" 57f696da Merge "EncodeImageInternal: fix potential leak" d972cdf2 EncodeImageInternal: fix potential leak 5cd12c3d fixed signed/unsigned comparison warning cdca30d0 Merge "cosmetics: shorten long line" e025fb55 cosmetics: shorten long line 22671ed6 Merge "enc/vp8l: fix double free on error" e1b9b052 Merge "cosmetics: VP8LCreateHuffmanTree: fix indent" a8e725f8 enc/vp8l: fix double free on error 27541fbd cosmetics: VP8LCreateHuffmanTree: fix indent 1d38b258 cwebp/windows: use MAKE_REFGUID where appropriate 817ef6e9 Merge "cwebp: fix WIC/Microsoft SDK compatibility issue" 902d3e3b cwebp: fix WIC/Microsoft SDK compatibility issue 89d803c4 Merge "Fix a crash due to wrong pointer-integer arithmetic." cb1bd741 Merge "Fix a crash in lossless decoder." de2fe202 Merge "Some cleanup in VP8LCreateHuffmanTree() (and related functions CompareHuffmanTrees() and SetBitDepths()): - Move 'tree_size' initialization and malloc for 'tree + tree_pool' outside the loop. - Some renames/tweaks for readability." ce69177a Fix a crash due to wrong pointer-integer arithmetic. e40a3684 Fix a crash in lossless decoder. 3927ff3a remove unneeded error condition for WebPMuxNumNamedElements() 2c140e11 Some cleanup in VP8LCreateHuffmanTree() (and related functions CompareHuffmanTrees() and SetBitDepths()): - Move 'tree_size' initialization and malloc for 'tree + tree_pool' outside the loop. - Some renames/tweaks for readability. 861a5b7b add support for animation eb5c16cc Merge "Set correct encode size in encoder's stats." 4abe04a2 fix the return value and handle missing input file case. 2fafb855 Set correct encode size in encoder's stats. e7167a2b Provide one entry point for backward references. c4ccab64 Print relevant lossless encoding stats in cwebp. e3302cfd GetHuffBitLengthsAndCodes: reduce level of indirection b5f2a9ed enc/vp8l: fix uninitialized variable warning 7885f8b2 makefile.unix: add lossless encoder files 1261a4c8 Merge "cosmetics" 3926b5be Merge "dsp/cpu.c: Android: fix crash on non-neon arm builds" 834f937f dsp/cpu.c: Android: fix crash on non-neon arm builds 126e1606 cosmetics e38602d2 Merge branch 'lossless_encoder' e8d3d6a0 split StoreHuffmanCode() into smaller functions d0d88990 more consolidation: introduce VP8LHistogramSet 1a210ef1 big code clean-up and refactoring and optimization 41b5c8ff Some cosmetics in histogram.c ada6ff77 Approximate FastLog between value range [256, 8192] ec123ca3 Forgot to update out_bit_costs to symbol_bit_costs at one instance. cf33ccd1 Evaluate output cluster's bit_costs once in HistogramRefine. 781c01f4 Simple Huffman code changes. a2849bc5 Lossless decoder: remove an unneeded param in ReadHuffmanCodeLengths(). b39e7487 Reducing emerging palette size from 11 to 9 bits. bfc73db4 Move GetHistImageSymbols to histogram.c 889a5786 Improve predict vs no-predict heuristic. 01f50663 code-moving and clean-up 31035f3b reduce memory usage by allocating only one histo fbb501b8 Restrict histo_bits to ensure histo_image size is under 32MB 8415ddf3 further simplification for the meta-Huffman coding e4917299 A quick pass of cleanup in backward reference code 83332b3c Make transform bits a function of encode method (-m). 72920caa introduce -lossless option, protected by USE_LOSSLESS_ENCODER c6ac4dfb Run TraceBackwards for higher qualities. 412222c8 Make histo_bits and transform_bits function of quality. 149b5098 Update lossless encoder strategy: 0e6fa065 cache_bits passed to EncodeImageInternal() e38b40a9 Factorize code for clearing HtreeGroup. 6f4a16ea Removing the indirection of meta-huffman tables. 3d33ecd1 Some renaming/comments related to palette in lossless encoder. 4d02d586 Lossless encoder: correction in Palette storage 4a636235 fix a memleak in EncodeImageInternal() 0993a611 Full and final fix for prediction transform afd2102f Fix cross-color transform in lossless encoder b96d8740 Need to write a '0' bit at the end of transforms. 54dad7e5 Color cache size should be counted as 0 when cache bits = 0 4f0c5caf Fix prediction transform in lossless encoder. 36dabdad Fix memory leak in method EncodeImageInternal for histogram_image. 352a4f49 Get rid of PackLiteralBitLengths() d673b6b9 Change the predictor function to pass left pixel b2f99465 Fix CopyTileWithPrediction() 84547f54 Add EncodeImageInternal() method. 6b38378a Guard the lossless encoder (in flux) under a flag 09f7532c Fix few nits (const qualifiers) 648be393 Added implementation for various lossless functions 32714ce3 Add VP8L prefix to backward ref & histogram methods. fcba7be2 Fixed header file tag (WEBP_UTILS_HUFFMAN_ENCODE_H_) bc703746 Add backward_ref, histogram & huffman encode modules from lossless. fdccaadd Fixing nits 227110c4 libwebp interface changes for lossless encoding. 50679acf minor style fixes b38dfccf remove unneeded reference to NUM_LITERAL_CODES 8979675b harmonize header description c04eb7be tcoder.c: define NOT_HAVE_LOG2 for MSVC builds 9a214fa1 Merge "VP8[L]GetInfo: check input pointers" 5c5be8ba VP8[L]GetInfo: check input pointers 0c188fec Merge changes I431acdfe,I713659b7 b3515c62 mux: drop 'chunk' from ChunkInfo member names aea7923c muxi.h: remove some unused defines 01422492 update NEWS file for next release 29e3f7ec Merge "dec: remove deprecated WebPINew()" 4718e449 Merge "muxedit: a few more size_t changes" 82654f96 Merge "muxedit: remove a few redundant NULL checks" 02f27fbd dec: remove deprecated WebPINew() ccddb3fc muxedit: remove a few redundant NULL checks a6cdf710 muxedit: a few more size_t changes a3846892 Merge "mux: remove unused LIST_ID" 11ae46ae alpha.c: quiet some size_t -> int conversion warnings dee46692 mux: remove unused LIST_ID 03f1f493 mux: add version checked entry points 6a0abdaa Merge "doc: tile/alpha corrections" c8139fbe Merge "few cosmetics" 68338737 Merge "lossless: remove some size_t -> int conversions" 5249e94a doc: tile/alpha corrections d96e722b huffman: quiet int64 -> int conversion warning 532020f2 lossless: remove some size_t -> int conversions 23be6edf few cosmetics 1349edad Merge "configure: AC_ARG_* use AS_HELP_STRING" bfbcc60a configure: AC_ARG_* use AS_HELP_STRING 1427ca8e Merge "Makefile.am: header file maintenance" 087332e3 Merge "remove unused parameter 'round' from CalcProba()" 9630e168 remove unused parameter 'round' from CalcProba() 92092eaa Merge "bit_reader.h: correct include" a87fc3f6 Merge "mux: ensure # images = # tiles" 53af99b1 Merge "mux: use size_t consistently" 39a57dae Makefile.am: header file maintenance 1bd0bd0d bit_reader.h: correct include 326a3c6b mux: ensure # images = # tiles 95667b8d mux: use size_t consistently 231ec1fb Removing the indirection of meta-huffman tables. 15ebcbaa check return pointer from MuxImageGetListFromId b0d6c4a7 Merge "configure: remove test for zlib.h" 8cccac50 Merge "dsp/lossless: silence some build warnings" b08819a6 dsp/lossless: silence some build warnings 7ae22521 Android.mk: SSE2 & NEON updates 0a49e3f3 Merge "makefile.unix add missing header files" 2e75a9a1 Merge "decode.h: use size_t consistently" fa13035e configure: remove test for zlib.h d3adc81d makefile.unix add missing header files 262fe01b Merge "makefile.unix & Android.mk: cosmetics" 4cce137e Merge "enc_sse2 add missing stdlib.h include" 80256b85 enc_sse2 add missing stdlib.h include 9b3d1f3a decode.h: use size_t consistently 64083d3c Merge "Makefile.am: cosmetics" dceb8b4d Merge changes If1331d3c,I86fe3847 0e33d7bf Merge "webp/decode.h: fix prototypes" fac0f12e rename BitReader to VP8LBitReader fbd82b5a types.h: centralize use of stddef.h 2154835f Makefile.am: cosmetics 1c92bd37 vp8io: use size_t for buffer size 90ead710 fix some more uint32_t -> size_t typing cbe705c7 webp/decode.h: fix prototypes 3f8ec1c2 makefile.unix & Android.mk: cosmetics 217ec7f4 Remove tabs in configure.ac b3d35fc1 Merge "Android.mk & Makefile.vc: add new files" 0df04b9e Android.mk & Makefile.vc: add new files e4f20c5b Merge "automake: replace 'silent-rules' w/AM_SILENT_RULES" 8d254a09 cosmetics 6860c2ea fix some uint32_t -> size_t typing 4af1858a Fix a crash due to max symbol in a tree >= alphabet size 6f01b830 split the VP8 and VP8L decoding properly f2623dbe enable lossless decoder b96efd7d add dec/vp8i.h changes from experimental 19f6398e add dec/vp8l{i.h,.c} from experimental c4ae53c8 add utils/bit_reader.[hc] changes from experimental 514d0089 add dsp/lossless.[hc] from experimental 9c67291d add utils/huffman.[hc] from experimental 337914a0 add utils/color_cache.[hc] from experimental b3bf8fe7 the read-overflow code-path wasn't reporting as an error 1db888ba take colorspace into account when cropping 61c2d51f move the rescaling code into its own file and make enc/ and dec/ use it. efc2016a Make rescaler methods generic 3eacee81 Move rescaler methods out of io.c. a69b893d automake: replace 'silent-rules' w/AM_SILENT_RULES 6f7bf645 issue 111: fix little-endian problem in bit-reader ed278e22 Removed unnecessary lookup cd8c3ba7 fix some warnings: down-cast and possibly-uninitialized variable 0a7102ba ~1% improvement of alpha compression 3bc1b141 Merge "Reformat container doc" dc17abdc mux: cosmetics cb5810df Merge "WebPMuxGetImage: allow image param to be NULL" 506a4af2 mux: cosmetics 135e8b19 WebPMuxGetImage: allow image param to be NULL de556b68 Merge "README.mux: reword some descriptions" 0ee2aeb9 Makefile.vc: use batch mode rules d9acddc0 msvc: move {i,p}db creation to object directory 237c9aa7 Merge "expose WebPFree function for DLL builds" b3e4054f silence msvc debug build warning 45feb55d expose WebPFree function for DLL builds 11316d84 README.mux: reword some descriptions 4be52f4a factorize WebPMuxValidate 14f6b9f6 mux: light cleanup 5e96a5db add more param checks to WebPPictureDistortion() 8abaf820 Merge "silence some type size related warnings" 1601a39b silence some type size related warnings f3abe520 Merge "idec: simplify buffer size calculation" a9c5cd4c idec: simplify buffer size calculation 7b06bd7f Merge "configure/automake: add silent-rules option" e9a7d145 Reformat container doc d4e5c7f3 configure/automake: add silent-rules option 5081db78 configure/automake: no -version-info for convenience libs 85b6ff68 Merge "idec: fix WebPIUpdate failure" 7bb6a9cc idec: fix internal state corruption 89cd1bb8 idec: fix WebPIUpdate failure 01b63806 4-5% faster decoding, optimized byte loads in arithmetic decoder. 631117ea Merge "cosmetics & warnings" a0b2736d cosmetics & warnings f73947f4 use 32bit for storing dequant coeffs, instead of 16b. b9600308 Merge "store prediction mode array as uint8_t[16], not int[16]." 7b67881a store prediction mode array as uint8_t[16], not int[16]. cab8d4dc Merge "NEON TransformOne" ba503fda NEON TransformOne 9f740e3b Merge "gcc warning fix: remove the 'const' qualifier." f76d3587 gcc warning fix: remove the 'const' qualifier. e78478d6 Merge "webpmux: make more use of WebPData" f85bba3d Merge "manpages: add BUGS section" 48a43bbf Merge "makefile.unix: variable cosmetics" c274dc96 makefile.unix: variable cosmetics 1f7b8595 re-organize the error-handling in the main loop a bit 1336fa71 Only recompute level_cost_[] when needed 771ee449 manpages: add BUGS section 0f7820e6 webpmux: make more use of WebPData 974aaff3 examples: logging updates 6c14aadd Merge "better token buffer code" f4054250 better token buffer code 18d959fa Merge "mux: add WebPData type" eec4b877 mux: add WebPData type 0de3096b use 16bit counters for recording proba counts 7f23678d fix for LevelCost + little speed-up 7107d544 further speed-up/cleanup of RecordCoeffs() and GetResidualCost() fd221040 Introduce Token buffer (unused for now) 5fa148f4 Merge "speed-up GetResidualCost()" 28a9d9b4 speed-up GetResidualCost() 11e7dadd Merge "misc cosmetics" 378086bd misc cosmetics d61479f9 add -print_psnr and -print_ssim options to cwebp. 2e3e8b2e add a WebPCleanupTransparentArea() method 552c1217 Merge "mux: plug some memory leaks on error" a2a81f7d Merge "fix Mach-O shared library build" b3482c43 Merge "fix gcc-4.0 apple 32-bit build" e4e3ec19 fix gcc-4.0 apple 32-bit build b0d2fecf mux: plug some memory leaks on error f0d2c7a7 pass of cosmetics b309a6f9 fix Mach-O shared library build 241ddd38 doc: delete mux container pdf 8b1ba272 doc: update VP8 decode guide link 7e4371c5 WebPMuxCreate: fix unchecked malloc eb425586 Merge "have makefile.unix clean up src/webp/*~ too" a85c3631 Merge "correct EncodeAlpha documentation" a33842fd Merge "Update webp container spec with alpha filter options." 8d6490da Incremental support for some of the mux APIs. b8375abd have makefile.unix clean up src/webp/*~ too b5855fc7 correct EncodeAlpha documentation dba37fea Update webp container spec with alpha filter options. 2e74ec8b fix compile under MINGW 716d1d7f fix suboptimal MAX_LEN cut-off limit 57cab7b8 Harmonize the alpha-filter predictions at boundary 3a989534 Merge "Fix bug for Alpha in RGBA_4444 color-mode." 8ca2076d Introduce a 'fast' alpha mode 221a06bb Fix bug for Alpha in RGBA_4444 color-mode. ad1e163a cosmetics: normalize copyright headers c77424d7 cosmetics: light include cleanup 9d0e17c9 fix msvc build breakage after 252028a 7c4c177c Some readability fixes for mux library d8a47e66 Merge "Add predictive filtering option for Alpha." 252028aa Add predictive filtering option for Alpha. 9b69be1c Merge "Simplify mux library code" a056170e Simplify mux library code 992187a3 improve log2 test e852f832 update Android.mk file list a90cb2be reduce number of copies and mallocs in alpha plane enc/dec b1662b05 fix some more type conversion warnings w/MSVC 223d8c60 fix some uint64_t -> int conversion warnings with MSC c1a0437b Merge "simplify checks for enabling SSE2 code" f06817aa simplify checks for enabling SSE2 code 948d4fe9 silence a msvc build warning 91179549 vwebp: msvc build tweaks 7937b409 simple WebP viewer, based on OpenGL 6aac1df1 add a bunch of missing 'extern "C"' 421eb99d Merge "Remove assigned-but-not-used variable "br"" 91e27f45 better fitting names for upsampling functions a5d7ed5c Remove assigned-but-not-used variable "br" f62d2c94 remove unused 'has_alpha' from VP8GetInfo() signature 08e86582 trap alpha-decoding error b361eca1 add cut-off to arith coder probability update. 8666a93a Some bug-fixes for images with alpha. 273a12a0 fix off-by-1 diff in case cropping and simple filtering 2f741d1e webpmux: ReadImage: fix ptr free in error case 721f3f48 fix alpha decode 60942c8c fix the has_alpha_ order 30971c9e Implement progress report (and user abort) eda520a9 cosmetics after 9523f2a 38bd5bb5 Merge "Better alpha support in webpmux binary" ccbaebfe Merge "Updated the includes to relative paths." d71fbdcc fix small typo in error message array cdf97aa2 Better alpha support in webpmux binary 885f25bc Updated the includes to relative paths. a0ec9aac Update WebP encoder (cwebp) to support Alpha. 667b769a Fixed the include for types.h within mux.h 9523f2a5 Add Alpha Encode support from WebPEncode. 16612ddd Merge "Add Alpha Decode support from WebPDecode." d117a940 Add Alpha Decode support from WebPDecode. 67228734 cosmetics after e1947a9 e1947a92 Add Alpha encode/decode code. afc4c5d6 simplify code by introducing a CopyPlane() helper func 113b3128 Merge "MUX API Updates" c398f595 MUX API Updates 5acf04ef remove orphan source file 059f03ef Merge "dec: validate colorspace before using as array index" 70a03989 Merge "factorize some code" 9b243b3d factorize some code 372e2b46 Correct a bug in ReadPNG() with GRAY_ALPHA images 469d6eb9 Merge "Makefile.am: remove redundant noinst_HEADERS" 9fe3372f dec: validate colorspace before using as array index 8962030f remove orphan source file ced3e3f4 Makefile.am: remove redundant noinst_HEADERS 964387ed use WEBP_INLINE for inline function declarations 90880a11 Merge "manpages: break long lines" b5910895 Merge "manpages: minor formatting updates" 4c451e4a Merge "Rectify the Chunk parsing logic." 04e84cf1 examples: slight cleanup 099717ce manpages: break long lines 1daf39bb manpages: minor formatting updates abd030b5 fix missing "(void)" in function signature f6a7d758 remove useless test f07b2138 Rectify the Chunk parsing logic. b8634f7d webpmux: fix lib link order 42c2e682 Fix missing coma (on uncompiled code) d8329d41 Android.mk: add missing source files 13a54df5 Merge "More aggressive copy-edit; add TODO; validate HTML5" 868b96ae More aggressive copy-edit; add TODO; validate HTML5 767afea2 configure: check for a symbol contained in libpng 408b8918 Merge "Linewrap at 72 cols. Casual copy-edit." 3ae318c7 Merge "Restore (most) emphasis; add emphasis to normative RFC 2119 terms (MUST, etc.)" 918eb2d8 Merge "Basic container doc source clean-up; fix lists and pseudocode blocks." 03bec9e0 Linewrap at 72 cols. Casual copy-edit. 2678d819 Restore (most) emphasis; add emphasis to normative RFC 2119 terms (MUST, etc.) 428674da Basic container doc source clean-up; fix lists and pseudocode blocks. 6a77d928 Merge "Makefile.vc: cosmetics" 28c38e8c Merge "Makefile.vc: condense directory creation rules" 55be2cf8 Initial import of container spec document, from pdftotext transform. a82a788b Makefile.vc: cosmetics c8f41ce5 Makefile.vc: condense directory creation rules 2b877cd0 Some fixes to Makefile.vc to support the src\mux directory. 3eb969b3 Merge "Add Makefile.vc for Mux library & binary." e78e971e Add Makefile.vc for Mux library & binary. 6aedde58 Add manual for WebPMux tool. 8a360d0a Merge "Added WebPMux Binary." a4f32cae Added WebPMux Binary. f3bf4c76 Added Mux Container Spec & README for MUX-API. 9f761cfa Changed function signature for WebPMuxCreate 5f31b5ec Merge "Add Mux library for manipulating WebP container." 2315785f Add Mux library for manipulating WebP container. 7e198abb update ChangeLog (tag: v0.1.3) dfc9c1ea Harmonize the dates 28ad70c5 Fix PNG decoding bug 846e93c5 Update AUTHORS & add .mailmap 563e52d6 cosmetics after '76036f5 Refactor decoder library' 76036f54 Refactor decoder library 377ef43c configure.ac: update AC_INIT params 7a8d8762 use a user-visible MACRO for max width/height. d4e9f559 NEON decode support in WebP 0ee683b5 update libtool version-info fdbe02c5 windows: match _cond_destroy logic w/return variable name 206b686b README: correct advanced decode api pseudo-code 6a32a0f5 make VP8BitReader a typedef, for better re-use b112e836 create a libwebputils under src/utils ee697d9f harmonize the include guards and #endif comments a1ec07a6 Fixing compiler error in non x86 arch. dcfa509a Fixed recursive inclusion of bit_writer.h and vp8enci.h. e06ac088 create a separate libwebpdsp under src/dsp ebeb412a use unsigned int for bitfields 341cc56a make kNewRange a static array 227a91e5 README: minor wording update 05bd8e6a add man pages to dist 812dfa1a bump up versions in preparations for 0.1.3 a5b78c81 wrap alpha-related options under WEBP_EXPERIMENTAL_FEATURES flag 34dc7907 regen ChangeLog for 0.1.3-rc2 7c436630 Silence some (more) Visual Studio warnings. 60306e8c add top-level gitattributes 2aa6b80e Slience some Visual Studio warnings. 4cbbb290 Merge "bump up version for next freeze" a3291674 bump up version for next freeze c7e86aba cosmetics: fix comment line lengths c9e037ab makefile.unix: add simple dist target 87d58ce9 makefile.unix: rule maintenance d477de77 mend fac15ec7 Update NEWS & README for next release V0.1.3 6215595c Merge "add a -partition_limit option to limit the number of bits used by intra4x4" 3814b76c Merge "reorganize chunk-parsing code" 900286e0 add a -partition_limit option to limit the number of bits used by intra4x4 cd12b4b0 add the missing cost for I4/I16 mode selection dfcc2136 reorganize chunk-parsing code 3cf20306 initialize pointers to function within VP8DspInit() d21b4795 Merge "windows: add decode threading support" 473ae953 fix hang on thread creation failure fccca420 windows: add decode threading support a31f843a Use the exact PNG_INCLUDES/PNG_LIBS when testing for -lpng ad9b45f1 Merge "Makefile.vc: rule maintenance" 565a2cab Makefile.vc: rule maintenance 2d0da681 makefile.unix: disable Wvla by default fc7815d6 multi-thread decoding: ~25-30% faster acd8ba42 io->teardown() was not always called upon error c85527b1 Merge "Makefile.vc: add DLL configs" e1e9be35 cosmetics: spelling/grammar in README and lib headers b4d0ef8f Makefile.vc: add DLL configs 998754a7 remove unused nb_i4_ and nb_i16_ fields. 9f01ce3a rename WebPDecBuffer::memory -> private_memory fb5d659b fix an overflow bug in LUT calculation d646d5c7 swig: add WebPDecodeARGB 78aeed40 add missing WebPDecodeARGBInto() and switch ARGB4444 to RGBA4444 as was intended cd7c5292 explicitly mark library functions as extern 19db59f8 add support for RGB565, ARGB4444 and ARGB colorspace (decoder) c915fb2a encoder speed-up: hardcode special level values c558bdad Rename and improve the API to retrieve decoded area bf599d74 Merge "makefile.unix: disable -Wvla by default" c9ea03d7 SSE2 version of strong filtering 993af3e2 makefile.unix: disable -Wvla by default 3827e1bc Merge "examples: (windows/WIC) add alpha support" e291fae0 SSE2 functions for the fancy upsampler. a06bbe2e add WebPISetIOHooks() to set some custom hooks on the incremental decoder object. 7643a6f2 Merge "makefile.unix: use uname to detect OSX environment" 5142a0be export alpha channel (if present) when dumping to PGM format 14d5731c makefile.unix: use uname to detect OSX environment 08057062 examples: quiet warnings 3cfe0888 examples: (windows/WIC) add alpha support 13ed94b8 add compile warning for variable-length-array 5a18eb1a Merge "add Advanced Decoding Interface" 5c4f27f9 add missing \n f4c4e416 80 cols fix d2603105 add Advanced Decoding Interface bd2f65f6 sse2 version of the complex filter 96ed9ce0 perform two idct transforms at a time when possible 01af7b69 use aligned stored 0e1d1fdf Merge "Makefile.vc: add experimental target" 2a1292a6 Makefile.vc: add experimental target 23bf351e Enable decode SSE2 for Visual Studio 131a4b7b dec/dsp_sse2: fix visual studio compile 00d9d680 swig: file reorganization 7fc7e0d9 Merge "swig/java: basic encode support" 3be57b16 fix MSVC compile for WEBP_EXPERIMENTAL_FEATURES 40a7e347 dec/dsp: disable sse2 for Visual Studio builds e4d540c8 add SSE2 code for transform 54f2170a swig/java: basic encode support c5d4584b call function pointers instead of C-version ea43f045 Merge "configure: mingw32 targets: test for WIC support" a11009d7 SSE2 version of simple in-loop filtering 42548da9 shave one unneeded filter-cache line 31f9dc6f configure: mingw32 targets: test for WIC support 19559699 Merge "split expression in two." 415dbe46 split expression in two. e29072a8 configure: test for zlib only w/--enable-experimental b2b0090b Simplify Visual Studio ifdefs ca7a2fd6 Add error reporting from encoding failures. 6c9405db Merge "Makefile.vc: require CFG with clean target" 0424ecd9 Makefile.vc: require CFG with clean target 003417c7 Enable SSE2 for Visual Studio builds af10db4a little speed up for VP8BitUpdate() e71418f8 more MSVC files to ignore 46d90363 cosmetics edf59ab3 typo fix 72229f5f Add support for x64 and SSE2 builds under Windows. 92e5c6e1 VP8GetInfo() + WebPResetDecParams() 416b7a6b raise the fixed-point precision for the rescaler aa87e4e0 fix alignment eb66670c disable WEBP_EXPERIMENTAL_FEATURES c5ae7f65 typo fix: USE_ => WEBP_ d041efae swig: add libwebp.jar/libwebp_java_wrap.c f6fb3877 add swig interface e9273902 align buffer for double too 842c009b fix -strong option d0a70387 Merge "cosmetics" fc0a02e5 fix the dichotomy loop 38369c03 cosmetics 8dfc4c6f factorize and unify GetAlpha() between the C and SSE2 version 6d0e66c2 prepare experimentation with yuv444 / 422 79cc49f5 add a --enable-experimental option to './configure' d7575238 sse2 version of CollectHistogram() c1c728d6 add an extra #ifdef WEBP_EXPERIMENTAL_FEATURES to avoid 'unused variable' warning 60c61d2d always call VP*EncDeleteAlpha() unconditionnally, for simplicity 0f8c6384 simply don't call WriteExtensions() if WEBP_EXPERIMENTAL_FEATURES is not defined 47c661d5 rename swap -> swap_rb 10d55bbb move chunk[] declaration out of the for() loop 517cec21 fix indentation f7d9e261 fix merge problems 8fd42b3a add a stride 'a_stride' for the alpha plane b8dcbf2f fix alpha-plane copy and crop methods cdef89de fix some 'unused variable' warning fb29c262 SSE2 version of the fwd transform and the squared sum metric 2ab4b72f EXPERIMENTAL: add support for alpha channel cfbf88a6 add SSE2 functions. ~2x faster encoding on average. e7ff3f9a merge two ITransforms together when applicable and change the TTransform to return the sum directly. ca554137 fix WebPIDecGetRGB() to accept any RGB(A) mode, not just MODE_RGB 8aa50efd fix some 'man' typos d3f3bdda update ChangeLog (tag: v0.1.2) d7e9a69c update contributor list 261abb8e add a 'superclean' section 276ae825 Remove files not mean to be in git, and update .gitignore 24868455 build: prepare libwebp.pc 14ceb6e8 add "-version" description to man pages b247a3b2 Create the m4 directory, and also place .gitignore in there for libtool. cdd734c9 Resolve automake warnings c5fa726e build: add pkgconfig files b20aaca2 build: just use autoreconf, avoid calling tools manually 4b0b0d66 cwebp: use modern functions efbc6c41 update Android.mk 7777570b better version of ChangeLog fa70d2b7 update version number in the DOC f8db5d5d more C89-fixes 0de013b3 fix typos 650ffa3b add version getters for decoder and encoder be4867d2 doc for incremental decoding 56732a1b add idec.obj in MSVC makefile 208afb5e add c++ guards 8bf76fe0 add incremental decoding 1f288328 'inline' isn't defined in strict ansi c89 8b77c632 move the quantization function to dsp.c b2c3575c add a 'last_y' field to WebPDecParams 2654c3da correctly pass along the exact same status returned from ParsePartitions 4704146a add missing precision in the man 6d978a6c add error messages 6463e6ab add some install instructions, and fix intel-mac flags 05fb7bfc Merge ".gitignore: initial version" c33f0195 .gitignore: initial version e532b9ab Makefile: allow out of tree builds 4c0da7aa enable sparse dc/ac transforms 07dbb8d5 clarify the return logic 5c69e1bb fix bigger-by-1 array 7c5267e3 fix a (harmless) typo: non_zero_ -> non_zero_ac_ bc752135 fix missing free() af3e2aaa remove trailing spaces 13e50da6 make the bitreader preload at least 8bits, instead of post-load them (this makes initialization easier and will be helpful for incremental decoding). Modify ParsePartitions() to accommodate for truncated input. f4888f77 emit 9 - nb_bits trailing zeros instead of 8 3db65255 separate block-parsing into a visible VP8DecodeMB() a871de02 add missing extern "C" b3ce8c52 remove a gcc warning about type pun by using a proper union'd type e1863715 update after addition of webpi.h 3e856e2d Extract some useful functions around decoding buffer WebPDecParams. d5bc05a4 make the filtering process match libvpx and ffvp8 dd60138d add man pages for cwebp(1) and dwebp(1) c4fa3644 fix header 5b70b378 * add an option to bypass_filtering in VP8Io. b97a4003 simplify QuantizeBlock code a bit 84b58ebb add more checks around picture allocation b65a3e10 remove absolute_delta_ field and syntax code 0744e842 Dont' open output file until we're sure the input file is valid d5bd54c7 fix typo and buggy line f7a9549d Add a simple top-level makefile.unix for quick & easy build. 5f36b944 update the doc for the -f option f61d14aa a WebP encoder converts PNG & JPEG to WebP 81c96621 oops: forgotten call to Initialize() + move the error message to a more useful place 87ffa005 typo: fix a missing 'R', was confusing. b04b857a * add decoding measurement using stopwatch.h (use -v option) * support PNG output through WIC on Win32 746a4820 * make (*put)() hook return a bool for abort request. * add an enum for VP8Status() to make things clearer 73c973e6 * strengthen riff/chunk size checks * don't consider odd-sized chunks being an error 1dc4611a add support for PNG output (default) regularize include guards 860641df fix a typo: sizeof(kYModeProbaInter0) => sizeof(kUVModeProbaInter0) 3254fc52 fix some petty constness fix the ./configure file too 504d3393 fix eof_ mis-initialization 2bc0778f leftover Makefile.* from previous commit d2cf04e4 move Makefile.am one level below, to src/dec fix typos here and there dwebp is now an installed program ade92de8 typo: vp8.h -> decode_vp8.h d7241241 forgot to declare types.h to be installed 6421a7a4 move the decoder sourcetree to a sub-location src/dec to make room for future libs sources a9b3eab6 correct layout name is IMC4. 2330522c handle corner case of zero-dimensions 280c3658 make VP8Init() handle short buffers (< 2 bytes) correctly b1c9e8b4 handle error cases more robustly 0e94935c Merge "table-less version of clip_8b()" 1e0a2d25 table-less version of clip_8b() e12109ee dwebp: change -yuv option to -raw change the layout to IMC2 d72180a4 speed-up fancy upscaler 9145f3bc reset eof_ at construction time a7ee0559 simplify the logic of GetCoeffs() f67b5939 lot of cosmetics ea27d7c6 fix endian problem on PowerPC beb0a1ba fix signature of VP8StoreBlock b128c5e2 Merge "fancy chroma upscaling" 6a37a2aa fancy chroma upscaling ff565edc fix two numeric typos 5a936a0a use uintptr_t for casting pointers to ints e14a0301 for cross_compiling=yes to prevent executing any binary 83b545ee add vc9+ makefile 296f6914 fix output loop for small height cbfbb5c3 convert to plain-C f09f96ee Fix declaration after statement warning 5981ee55 Fix UV plane ac/dc quantizer transposition c8d15efa convert to ANSI-C c3f41cb4 Initial commit libwebp-1.4.0/compile0000755000014400001440000001635014606317243011441 0ustar #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libwebp-1.4.0/man/0000755000014400001440000000000014606317244010632 5ustar libwebp-1.4.0/man/img2webp.10000644000014400001440000000761714606317060012437 0ustar .\" Hey, EMACS: -*- nroff -*- .TH IMG2WEBP 1 "March 17, 2023" .SH NAME img2webp \- create animated WebP file from a sequence of input images. .SH SYNOPSIS .B img2webp [file_options] [[frame_options] frame_file]... [\-o webp_file] .br .B img2webp argument_file_name .br .SH DESCRIPTION This manual page documents the .B img2webp command. .PP \fBimg2webp\fP compresses a sequence of images using the animated WebP format. Input images can either be PNG, JPEG, TIFF or WebP. If a single file name (not starting with the character '\-') is supplied as the argument, the command line arguments are actually tokenized from this file. This allows for easy scripting or using a large number of arguments. .SH FILE-LEVEL OPTIONS The file-level options are applied at the beginning of the compression process, before the input frames are read. .TP .BI \-o " string Specify the name of the output WebP file. .TP .BI \-min_size Encode images to achieve smallest size. This disables key frame insertion and picks the parameters resulting in the smallest output for each frame. It uses lossless compression by default, but can be combined with \-q, \-m, \-lossy or \-mixed options. .TP .BI \-kmin " int .TP .BI \-kmax " int Specify the minimum and maximum distance between consecutive key frames (independently decodable frames) in the output animation. The tool will insert some key frames into the output animation as needed so that this criteria is satisfied. .br .B \-mixed Mixed compression mode: optimize compression of the image by picking either lossy or lossless compression for each frame heuristically. This global option disables the local option \fB-lossy\fP and \fB-lossless\fP . .TP .BI \-near_lossless " int Specify the level of near\-lossless image preprocessing. This option adjusts pixel values to help compressibility, but has minimal impact on the visual quality. It triggers lossless compression mode automatically. The range is 0 (maximum preprocessing) to 100 (no preprocessing, the default). The typical value is around 60. Note that lossy with \fB\-q 100\fP can at times yield better results. .TP .B \-sharp_yuv Use more accurate and sharper RGB->YUV conversion if needed. Note that this process is slower than the default 'fast' RGB->YUV conversion. .TP .BI \-loop " int Specifies the number of times the animation should loop. Using '0' means 'loop indefinitely'. .TP .BI \-v Be more verbose. .TP .B \-h, \-help A short usage summary. .TP .B \-version Print the version numbers of the relevant libraries used. .SH PER-FRAME OPTIONS The per-frame options are applied for the images following as arguments in the command line. They can be modified any number of times preceding each particular input image. .TP .BI \-d " int Specify the image duration in milliseconds. .TP .B \-lossless, \-lossy Compress the next image(s) using lossless or lossy compression mode. The default mode is lossless. .TP .BI \-q " float Specify the compression factor between 0 and 100. The default is 75. .TP .BI \-m " int Specify the compression method to use. This parameter controls the trade off between encoding speed and the compressed file size and quality. Possible values range from 0 to 6. Default value is 4. .SH EXAMPLE img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp .br .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH AUTHORS \fBimg2webp\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Pascal Massimino , for the Debian project (and may be used by others). .SH SEE ALSO .BR webpmux (1), .BR gif2webp (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/dwebp.10000644000014400001440000001133014606317060012007 0ustar .\" Hey, EMACS: -*- nroff -*- .TH DWEBP 1 "November 17, 2021" .SH NAME dwebp \- decompress a WebP file to an image file .SH SYNOPSIS .B dwebp .RI [ options ] " input_file.webp .br .SH DESCRIPTION This manual page documents the .B dwebp command. .PP \fBdwebp\fP decompresses WebP files into PNG, PAM, PPM or PGM images. Note: Animated WebP files are not supported. .SH OPTIONS The basic options are: .TP .B \-h Print usage summary. .TP .B \-version Print the version number (as major.minor.revision) and exit. .TP .BI \-o " string Specify the name of the output file (as PNG format by default). Using "-" as output name will direct output to 'stdout'. .TP .BI \-\- " string Explicitly specify the input file. This option is useful if the input file starts with an '\-' for instance. This option must appear \fBlast\fP. Any other options afterward will be ignored. If the input file is "\-", the data will be read from \fIstdin\fP instead of a file. .TP .B \-bmp Change the output format to uncompressed BMP. .TP .B \-tiff Change the output format to uncompressed TIFF. .TP .B \-pam Change the output format to PAM (retains alpha). .TP .B \-ppm Change the output format to PPM (discards alpha). .TP .B \-pgm Change the output format to PGM. The output consists of luma/chroma samples instead of RGB, using the IMC4 layout. This option is mainly for verification and debugging purposes. .TP .B \-yuv Change the output format to raw YUV. The output consists of luma/chroma-U/chroma-V samples instead of RGB, saved sequentially as individual planes. This option is mainly for verification and debugging purposes. .TP .B \-nofancy Don't use the fancy upscaler for YUV420. This may lead to jaggy edges (especially the red ones), but should be faster. .TP .B \-nofilter Don't use the in-loop filtering process even if it is required by the bitstream. This may produce visible blocks on the non-compliant output, but it will make the decoding faster. .TP .BI \-dither " strength Specify a dithering \fBstrength\fP between 0 and 100. Dithering is a post-processing effect applied to chroma components in lossy compression. It helps by smoothing gradients and avoiding banding artifacts. .TP .BI \-alpha_dither If the compressed file contains a transparency plane that was quantized during compression, this flag will allow dithering the reconstructed plane in order to generate smoother transparency gradients. .TP .B \-nodither Disable all dithering (default). .TP .B \-mt Use multi-threading for decoding, if possible. .TP .BI \-crop " x_position y_position width height Crop the decoded picture to a rectangle with top-left corner at coordinates (\fBx_position\fP, \fBy_position\fP) and size \fBwidth\fP x \fBheight\fP. This cropping area must be fully contained within the source rectangle. The top-left corner will be snapped to even coordinates if needed. This option is meant to reduce the memory needed for cropping large images. Note: the cropping is applied \fIbefore\fP any scaling. .TP .B \-flip Flip decoded image vertically (can be useful for OpenGL textures for instance). .TP \fB\-resize\fR, \fB\-scale\fI width height\fR Rescale the decoded picture to dimension \fBwidth\fP x \fBheight\fP. This option is mostly intended to reducing the memory needed to decode large images, when only a small version is needed (thumbnail, preview, etc.). Note: scaling is applied \fIafter\fP cropping. If either (but not both) of the \fBwidth\fP or \fBheight\fP parameters is 0, the value will be calculated preserving the aspect-ratio. .TP .B \-quiet Do not print anything. .TP .B \-v Print extra information (decoding time in particular). .TP .B \-noasm Disable all assembly optimizations. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES dwebp picture.webp \-o output.png .br dwebp picture.webp \-ppm \-o output.ppm .br dwebp \-o output.ppm \-\- \-\-\-picture.webp .br cat picture.webp | dwebp \-o \- \-\- \- > output.ppm .SH AUTHORS \fBdwebp\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Pascal Massimino , for the Debian project (and may be used by others). .SH SEE ALSO .BR cwebp (1), .BR gif2webp (1), .BR webpmux (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. .SS Output file format details PAM: http://netpbm.sourceforge.net/doc/pam.html .br PGM: http://netpbm.sourceforge.net/doc/pgm.html .br PPM: http://netpbm.sourceforge.net/doc/ppm.html .br PNG: http://www.libpng.org/pub/png/png-sitemap.html#info libwebp-1.4.0/man/webpmux.10000644000014400001440000001470714606317060012410 0ustar .\" Hey, EMACS: -*- nroff -*- .TH WEBPMUX 1 "November 17, 2021" .SH NAME webpmux \- create animated WebP files from non\-animated WebP images, extract frames from animated WebP images, and manage XMP/EXIF metadata and ICC profile. .SH SYNOPSIS .B webpmux \-get .I GET_OPTIONS .I INPUT .B \-o .I OUTPUT .br .B webpmux \-set .I SET_OPTIONS .I INPUT .B \-o .I OUTPUT .br .B webpmux \-strip .I STRIP_OPTIONS .I INPUT .B \-o .I OUTPUT .br .B webpmux \-frame .I FRAME_OPTIONS .B [ \-frame ... ] [ \-loop .I LOOP_COUNT .B ] .br .RS 8 .B [ \-bgcolor .I BACKGROUND_COLOR .B ] \-o .I OUTPUT .RE .br .B webpmux \-duration .I DURATION OPTIONS .B [ \-duration ... ] .I INPUT .B \-o .I OUTPUT .br .B webpmux \-info .I INPUT .br .B webpmux [\-h|\-help] .br .B webpmux \-version .br .B webpmux argument_file_name .SH DESCRIPTION This manual page documents the .B webpmux command. .PP \fBwebpmux\fP can be used to create/extract from animated WebP files, as well as to add/extract/strip XMP/EXIF metadata and ICC profile. If a single file name (not starting with the character '\-') is supplied as the argument, the command line arguments are actually tokenized from this file. This allows for easy scripting or using a large number of arguments. .SH OPTIONS .SS GET_OPTIONS (\-get): .TP .B icc Get ICC profile. .TP .B exif Get EXIF metadata. .TP .B xmp Get XMP metadata. .TP .BI frame " n Get nth frame from an animated image. (n = 0 has a special meaning: last frame). .SS SET_OPTIONS (\-set) .TP .BI loop " loop_count Set loop count on an animated file. .P Where: 'loop_count' must be in range [0, 65535]. .TP .BI bgcolor " A,R,G,B Set the background color of the canvas on an animated file. .P where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying the Alpha, Red, Green and Blue component values respectively. .TP .BI icc " file.icc Set ICC profile. .P Where: 'file.icc' contains the ICC profile to be set. .TP .BI exif " file.exif Set EXIF metadata. .P Where: 'file.exif' contains the EXIF metadata to be set. .TP .BI xmp " file.xmp Set XMP metadata. .P Where: 'file.xmp' contains the XMP metadata to be set. .SS STRIP_OPTIONS (\-strip) .TP .B icc Strip ICC profile. .TP .B exif Strip EXIF metadata. .TP .B xmp Strip XMP metadata. .SS DURATION_OPTIONS (\-duration) Amend the duration of a specific interval of frames. This option is only effective on animated WebP and has no effect on a single-frame file. .TP .I duration[,start[,end]] Where: .br .B duration is the duration for the interval in milliseconds (mandatory). Must be non-negative. .br .B start is the starting frame index of the interval (optional). .br .B end is the ending frame index (inclusive) of the interval (optional). .TP The three typical usages of this option are: .br .B -duration d set the duration to 'd' for the whole animation. .br .B -duration d,f set the duration of frame 'f' to 'd'. .br .B -duration d,start,end set the duration to 'd' for the whole [start,end] interval. .TP .P Note that the frames outside of the [start, end] interval will remain untouched. The 'end' value '0' has the special meaning 'last frame of the animation'. .TP .I Reminder: frame indexing starts at '1'. .br .SS FRAME_OPTIONS (\-frame) Create an animated WebP file from multiple (non\-animated) WebP images. .TP .I file_i +di[+xi+yi[+mi[bi]]] Where: 'file_i' is the i'th frame (WebP format), 'xi','yi' specify the image offset for this frame, 'di' is the pause duration before next frame, 'mi' is the dispose method for this frame (0 for NONE or 1 for BACKGROUND) and 'bi' is the blending method for this frame (+b for BLEND or \-b for NO_BLEND). Argument 'bi' can be omitted and will default to +b (BLEND). Also, 'mi' can be omitted if 'bi' is omitted and will default to 0 (NONE). Finally, if 'mi' and 'bi' are omitted then 'xi' and 'yi' can be omitted and will default to +0+0. .TP .BI \-loop " n Loop the frames n number of times. 0 indicates the frames should loop forever. Valid range is 0 to 65535 [Default: 0 (infinite)]. .TP .BI \-bgcolor " A,R,G,B Background color of the canvas. .br where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying the Alpha, Red, Green and Blue component values respectively [Default: 255,255,255,255]. .SS INPUT .TP Input file in WebP format. .SS OUTPUT (\-o) .TP Output file in WebP format. .SS Note: .TP The nature of EXIF, XMP and ICC data is not checked and is assumed to be valid. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES .P Add ICC profile: .br webpmux \-set icc image_profile.icc in.webp \-o icc_container.webp .P Extract ICC profile: .br webpmux \-get icc icc_container.webp \-o image_profile.icc .P Strip ICC profile: .br webpmux \-strip icc icc_container.webp \-o without_icc.webp .P Add XMP metadata: .br webpmux \-set xmp image_metadata.xmp in.webp \-o xmp_container.webp .P Extract XMP metadata: .br webpmux \-get xmp xmp_container.webp \-o image_metadata.xmp .P Strip XMP metadata: .br webpmux \-strip xmp xmp_container.webp \-o without_xmp.webp .P Add EXIF metadata: .br webpmux \-set exif image_metadata.exif in.webp \-o exif_container.webp .P Extract EXIF metadata: .br webpmux \-get exif exif_container.webp \-o image_metadata.exif .P Strip EXIF metadata: .br webpmux \-strip exif exif_container.webp \-o without_exif.webp .P Create an animated WebP file from 3 (non\-animated) WebP images: .br webpmux \-frame 1.webp +100 \-frame 2.webp +100+50+50 .br .RS 8 \-frame 3.webp +100+50+50+1+b \-loop 10 \-bgcolor 255,255,255,255 .br \-o anim_container.webp .RE .P Get the 2nd frame from an animated WebP file: .br webpmux \-get frame 2 anim_container.webp \-o frame_2.webp .P Using \-get/\-set/\-strip with input file name starting with '\-': .br webpmux \-set icc image_profile.icc \-o icc_container.webp \-\- \-\-\-in.webp .br webpmux \-get icc \-o image_profile.icc \-\- \-\-\-icc_container.webp .br webpmux \-strip icc \-o without_icc.webp \-\- \-\-\-icc_container.webp .SH AUTHORS \fBwebpmux\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Vikas Arora , for the Debian project (and may be used by others). .SH SEE ALSO .BR cwebp (1), .BR dwebp (1), .BR gif2webp (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/webpinfo.10000644000014400001440000000344114606317060012523 0ustar .\" Hey, EMACS: -*- nroff -*- .TH WEBPINFO 1 "November 17, 2021" .SH NAME webpinfo \- print out the chunk level structure of WebP files along with basic integrity checks. .SH SYNOPSIS .B webpinfo .I OPTIONS .I INPUT .br .B webpinfo [\-h|\-help|\-H|\-longhelp] .br .SH DESCRIPTION This manual page documents the .B webpinfo command. .PP \fBwebpinfo\fP can be used to print out the chunk level structure and bitstream header information of WebP files. It can also check if the files are of valid WebP format. .SH OPTIONS .TP .B \-version Print the version number (as major.minor.revision) and exit. .TP .B \-quiet Do not show chunk parsing information. .TP .B \-diag Show parsing error diagnosis. .TP .B \-summary Show chunk stats summary. .TP .BI \-bitstream_info Parse bitstream header. .TP .B \-h, \-help A short usage summary. .TP .B \-H, \-longhelp Detailed usage instructions. .SH INPUT Input files in WebP format. Input files must come last, following options (if any). There can be multiple input files. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES .br webpinfo \-h .br webpinfo \-diag \-summary input_file.webp .br webpinfo \-bitstream_info input_file_1.webp input_file_2.webp .br webpinfo *.webp .SH AUTHORS \fBwebpinfo\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Hui Su , for the Debian project (and may be used by others). .SH SEE ALSO .BR webpmux (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/cwebp.10000644000014400001440000003217614606317060012021 0ustar .\" Hey, EMACS: -*- nroff -*- .TH CWEBP 1 "March 26, 2024" .SH NAME cwebp \- compress an image file to a WebP file .SH SYNOPSIS .B cwebp .RI [ options ] " input_file \-o output_file.webp .br .SH DESCRIPTION This manual page documents the .B cwebp command. .PP \fBcwebp\fP compresses an image using the WebP format. Input format can be either PNG, JPEG, TIFF, WebP or raw Y'CbCr samples. Note: Animated PNG and WebP files are not supported. .SH OPTIONS The basic options are: .TP .BI \-o " string Specify the name of the output WebP file. If omitted, \fBcwebp\fP will perform compression but only report statistics. Using "\-" as output name will direct output to 'stdout'. .TP .BI \-\- " string Explicitly specify the input file. This option is useful if the input file starts with a '\-' for instance. This option must appear \fBlast\fP. Any other options afterward will be ignored. .TP .B \-h, \-help A short usage summary. .TP .B \-H, \-longhelp A summary of all the possible options. .TP .B \-version Print the version number (as major.minor.revision) and exit. .TP .B \-lossless Encode the image without any loss. For images with fully transparent area, the invisible pixel values (R/G/B or Y/U/V) will be preserved only if the \-exact option is used. .TP .BI \-near_lossless " int Specify the level of near\-lossless image preprocessing. This option adjusts pixel values to help compressibility, but has minimal impact on the visual quality. It triggers lossless compression mode automatically. The range is 0 (maximum preprocessing) to 100 (no preprocessing, the default). The typical value is around 60. Note that lossy with \fB\-q 100\fP can at times yield better results. .TP .BI \-q " float Specify the compression factor for RGB channels between 0 and 100. The default is 75. .br In case of lossy compression (default), a small factor produces a smaller file with lower quality. Best quality is achieved by using a value of 100. .br In case of lossless compression (specified by the \fB\-lossless\fP option), a small factor enables faster compression speed, but produces a larger file. Maximum compression is achieved by using a value of 100. .TP .BI \-z " int Switch on \fBlossless\fP compression mode with the specified level between 0 and 9, with level 0 being the fastest, 9 being the slowest. Fast mode produces larger file size than slower ones. A good default is \fB\-z 6\fP. This option is actually a shortcut for some predefined settings for quality and method. If options \fB\-q\fP or \fB\-m\fP are subsequently used, they will invalidate the effect of this option. .TP .BI \-alpha_q " int Specify the compression factor for alpha compression between 0 and 100. Lossless compression of alpha is achieved using a value of 100, while the lower values result in a lossy compression. The default is 100. .TP .BI \-preset " string Specify a set of pre\-defined parameters to suit a particular type of source material. Possible values are: \fBdefault\fP, \fBphoto\fP, \fBpicture\fP, \fBdrawing\fP, \fBicon\fP, \fBtext\fP. Since \fB\-preset\fP overwrites the other parameters' values (except the \fB\-q\fP one), this option should preferably appear first in the order of the arguments. .TP .BI \-m " int Specify the compression method to use. This parameter controls the trade off between encoding speed and the compressed file size and quality. Possible values range from 0 to 6. Default value is 4. When higher values are used, the encoder will spend more time inspecting additional encoding possibilities and decide on the quality gain. Lower value can result in faster processing time at the expense of larger file size and lower compression quality. .TP .BI \-crop " x_position y_position width height Crop the source to a rectangle with top\-left corner at coordinates (\fBx_position\fP, \fBy_position\fP) and size \fBwidth\fP x \fBheight\fP. This cropping area must be fully contained within the source rectangle. Note: the cropping is applied \fIbefore\fP any scaling. .TP .BI \-resize " width height Resize the source to a rectangle with size \fBwidth\fP x \fBheight\fP. If either (but not both) of the \fBwidth\fP or \fBheight\fP parameters is 0, the value will be calculated preserving the aspect\-ratio. Note: scaling is applied \fIafter\fP cropping. .TP .B \-mt Use multi\-threading for encoding, if possible. .TP .B \-low_memory Reduce memory usage of lossy encoding by saving four times the compressed size (typically). This will make the encoding slower and the output slightly different in size and distortion. This flag is only effective for methods 3 and up, and is off by default. Note that leaving this flag off will have some side effects on the bitstream: it forces certain bitstream features like number of partitions (forced to 1). Note that a more detailed report of bitstream size is printed by \fBcwebp\fP when using this option. .SS LOSSY OPTIONS These options are only effective when doing lossy encoding (the default, with or without alpha). .TP .BI \-size " int Specify a target size (in bytes) to try and reach for the compressed output. The compressor will make several passes of partial encoding in order to get as close as possible to this target. If both \fB\-size\fP and \fB\-psnr\fP are used, \fB\-size\fP value will prevail. .TP .BI \-psnr " float Specify a target PSNR (in dB) to try and reach for the compressed output. The compressor will make several passes of partial encoding in order to get as close as possible to this target. If both \fB\-size\fP and \fB\-psnr\fP are used, \fB\-size\fP value will prevail. .TP .BI \-pass " int Set a maximum number of passes to use during the dichotomy used by options \fB\-size\fP or \fB\-psnr\fP. Maximum value is 10, default is 1. If options \fB\-size\fP or \fB\-psnr\fP were used, but \fB\-pass\fP wasn't specified, a default value of '6' passes will be used. If \fB\-pass\fP is specified, but neither \fB-size\fP nor \fB-psnr\fP are, a target PSNR of 40dB will be used. .TP .BI \-qrange " int int Specifies the permissible interval for the quality factor. This is particularly useful when using multi-pass (\fB\-size\fP or \fB\-psnr\fP options). Default is 0 100. If the quality factor is outside this range, it will be clamped. If the minimum value must be less or equal to the maximum one. .TP .B \-af Turns auto\-filter on. This algorithm will spend additional time optimizing the filtering strength to reach a well\-balanced quality. .TP .B \-jpeg_like Change the internal parameter mapping to better match the expected size of JPEG compression. This flag will generally produce an output file of similar size to its JPEG equivalent (for the same \fB\-q\fP setting), but with less visual distortion. .TP Advanced options: .TP .BI \-f " int Specify the strength of the deblocking filter, between 0 (no filtering) and 100 (maximum filtering). A value of 0 will turn off any filtering. Higher value will increase the strength of the filtering process applied after decoding the picture. The higher the value the smoother the picture will appear. Typical values are usually in the range of 20 to 50. .TP .BI \-sharpness " int Specify the sharpness of the filtering (if used). Range is 0 (sharpest) to 7 (least sharp). Default is 0. .TP .B \-strong Use strong filtering (if filtering is being used thanks to the \fB\-f\fP option). Strong filtering is on by default. .TP .B \-nostrong Disable strong filtering (if filtering is being used thanks to the \fB\-f\fP option) and use simple filtering instead. .TP .B \-sharp_yuv Use more accurate and sharper RGB->YUV conversion if needed. Note that this process is slower than the default 'fast' RGB->YUV conversion. .TP .BI \-sns " int Specify the amplitude of the spatial noise shaping. Spatial noise shaping (or \fBsns\fP for short) refers to a general collection of built\-in algorithms used to decide which area of the picture should use relatively less bits, and where else to better transfer these bits. The possible range goes from 0 (algorithm is off) to 100 (the maximal effect). The default value is 50. .TP .BI \-segments " int Change the number of partitions to use during the segmentation of the sns algorithm. Segments should be in range 1 to 4. Default value is 4. This option has no effect for methods 3 and up, unless \fB\-low_memory\fP is used. .TP .BI \-partition_limit " int Degrade quality by limiting the number of bits used by some macroblocks. Range is 0 (no degradation, the default) to 100 (full degradation). Useful values are usually around 30\-70 for moderately large images. In the VP8 format, the so\-called control partition has a limit of 512k and is used to store the following information: whether the macroblock is skipped, which segment it belongs to, whether it is coded as intra 4x4 or intra 16x16 mode, and finally the prediction modes to use for each of the sub\-blocks. For a very large image, 512k only leaves room for a few bits per 16x16 macroblock. The absolute minimum is 4 bits per macroblock. Skip, segment, and mode information can use up almost all these 4 bits (although the case is unlikely), which is problematic for very large images. The partition_limit factor controls how frequently the most bit\-costly mode (intra 4x4) will be used. This is useful in case the 512k limit is reached and the following message is displayed: \fIError code: 6 (PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k)\fP. If using \fB\-partition_limit\fP is not enough to meet the 512k constraint, one should use less segments in order to save more header bits per macroblock. See the \fB\-segments\fP option. Note the \fB-m\fP and \fB-q\fP options also influence the encoder's decisions and ability to hit this limit. .SS LOGGING OPTIONS These options control the level of output: .TP .B \-v Print extra information (encoding time in particular). .TP .B \-print_psnr Compute and report average PSNR (Peak\-Signal\-To\-Noise ratio). .TP .B \-print_ssim Compute and report average SSIM (structural similarity metric, see https://en.wikipedia.org/wiki/SSIM for additional details). .TP .B \-print_lsim Compute and report local similarity metric (sum of lowest error amongst the collocated pixel neighbors). .TP .B \-progress Report encoding progress in percent. .TP .B \-quiet Do not print anything. .TP .B \-short Only print brief information (output file size and PSNR) for testing purposes. .TP .BI \-map " int Output additional ASCII\-map of encoding information. Possible map values range from 1 to 6. This is only meant to help debugging. .SS ADDITIONAL OPTIONS More advanced options are: .TP .BI \-s " width height Specify that the input file actually consists of raw Y'CbCr samples following the ITU\-R BT.601 recommendation, in 4:2:0 linear format. The luma plane has size \fBwidth\fP x \fBheight\fP. .TP .BI \-pre " int Specify some preprocessing steps. Using a value of '2' will trigger quality\-dependent pseudo\-random dithering during RGBA\->YUVA conversion (lossy compression only). .TP .BI \-alpha_filter " string Specify the predictive filtering method for the alpha plane. One of 'none', \&'fast' or 'best', in increasing complexity and slowness order. Default is \&'fast'. Internally, alpha filtering is performed using four possible predictions (none, horizontal, vertical, gradient). The 'best' mode will try each mode in turn and pick the one which gives the smaller size. The 'fast' mode will just try to form an a priori guess without testing all modes. .TP .BI \-alpha_method " int Specify the algorithm used for alpha compression: 0 or 1. Algorithm 0 denotes no compression, 1 uses WebP lossless format for compression. The default is 1. .TP .B \-exact Preserve RGB values in transparent area. The default is off, to help compressibility. .TP .BI \-blend_alpha " int This option blends the alpha channel (if present) with the source using the background color specified in hexadecimal as 0xrrggbb. The alpha channel is afterward reset to the opaque value 255. .TP .B \-noalpha Using this option will discard the alpha channel. .TP .BI \-hint " string Specify the hint about input image type. Possible values are: \fBphoto\fP, \fBpicture\fP or \fBgraph\fP. .TP .BI \-metadata " string A comma separated list of metadata to copy from the input to the output if present. Valid values: \fBall\fP, \fBnone\fP, \fBexif\fP, \fBicc\fP, \fBxmp\fP. The default is \fBnone\fP. Note: each input format may not support all combinations. .TP .B \-noasm Disable all assembly optimizations. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES cwebp \-q 50 -lossless picture.png \-o picture_lossless.webp .br cwebp \-q 70 picture_with_alpha.png \-o picture_with_alpha.webp .br cwebp \-sns 70 \-f 50 \-size 60000 picture.png \-o picture.webp .br cwebp \-o picture.webp \-\- \-\-\-picture.png .SH AUTHORS \fBcwebp\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Pascal Massimino , for the Debian project (and may be used by others). .SH SEE ALSO .BR dwebp (1), .BR gif2webp (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/Makefile.am0000644000014400001440000000043514606317060012664 0ustar man_MANS = cwebp.1 dwebp.1 if BUILD_MUX man_MANS += webpmux.1 endif if BUILD_GIF2WEBP man_MANS += gif2webp.1 endif if BUILD_IMG2WEBP man_MANS += img2webp.1 endif if BUILD_VWEBP man_MANS += vwebp.1 endif if BUILD_WEBPINFO man_MANS += webpinfo.1 endif EXTRA_DIST = $(man_MANS) libwebp-1.4.0/man/vwebp.10000644000014400001440000000476614606317060012050 0ustar .\" Hey, EMACS: -*- nroff -*- .TH VWEBP 1 "November 17, 2021" .SH NAME vwebp \- decompress a WebP file and display it in a window .SH SYNOPSIS .B vwebp .RI [ options ] " input_file.webp .br .SH DESCRIPTION This manual page documents the .B vwebp command. .PP \fBvwebp\fP decompresses a WebP file and displays it in a window using OpenGL. .SH OPTIONS .TP .B \-h Print usage summary. .TP .B \-version Print version number and exit. .TP .B \-noicc Don't use the ICC profile if present. .TP .B \-nofancy Don't use the fancy YUV420 upscaler. .TP .B \-nofilter Disable in-loop filtering. .TP .BI \-dither " strength Specify a dithering \fBstrength\fP between 0 and 100. Dithering is a post-processing effect applied to chroma components in lossy compression. It helps by smoothing gradients and avoiding banding artifacts. Default: 50. .TP .BI \-noalphadither By default, quantized transparency planes are dithered during decompression, to smooth the gradients. This flag will prevent this dithering. .TP .B \-usebgcolor Fill transparent areas with the bitstream's own background color instead of checkerboard only. Default is white for non-animated images. .TP .B \-mt Use multi-threading for decoding, if possible. .TP .B \-info Display image information on top of the decoded image. .TP .BI \-\- " string Explicitly specify the input file. This option is useful if the input file starts with an '\-' for instance. This option must appear \fBlast\fP. Any other options afterward will be ignored. If the input file is "\-", the data will be read from \fIstdin\fP instead of a file. .TP .SH KEYBOARD SHORTCUTS .TP .B 'c' Toggle use of color profile. .TP .B 'b' Toggle display of background color. .TP .B 'i' Overlay file information. .TP .B 'd' Disable blending and disposal process, for debugging purposes. .TP .B 'q' / 'Q' / ESC Quit. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES vwebp picture.webp .br vwebp picture.webp -mt -dither 0 .br vwebp \-\- \-\-\-picture.webp .SH AUTHORS \fBvwebp\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written for the Debian project (and may be used by others). .SH SEE ALSO .BR dwebp (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/gif2webp.10000644000014400001440000001267414606317060012427 0ustar .\" Hey, EMACS: -*- nroff -*- .TH GIF2WEBP 1 "November 17, 2021" .SH NAME gif2webp \- Convert a GIF image to WebP .SH SYNOPSIS .B gif2webp .RI [ options ] " input_file.gif \-o output_file.webp .br .SH DESCRIPTION This manual page documents the .B gif2webp command. .PP \fBgif2webp\fP converts a GIF image to a WebP image. .SH OPTIONS The basic options are: .TP .BI \-o " string Specify the name of the output WebP file. If omitted, \fBgif2webp\fP will perform conversion but only report statistics. Using "\-" as output name will direct output to 'stdout'. .TP .BI \-\- " string Explicitly specify the input file. This option is useful if the input file starts with an '\-' for instance. This option must appear \fBlast\fP. Any other options afterward will be ignored. If the input file is "\-", the data will be read from \fIstdin\fP instead of a file. .TP .B \-h, \-help Usage information. .TP .B \-version Print the version number (as major.minor.revision) and exit. .TP .B \-lossy Encode the image using lossy compression. .TP .B \-mixed Mixed compression mode: optimize compression of the image by picking either lossy or lossless compression for each frame heuristically. .TP .BI \-q " float Specify the compression factor for RGB channels between 0 and 100. The default is 75. .br In case of lossless compression (default), a small factor enables faster compression speed, but produces a larger file. Maximum compression is achieved by using a value of 100. .br In case of lossy compression (specified by the \-lossy option), a small factor produces a smaller file with lower quality. Best quality is achieved by using a value of 100. .TP .BI \-m " int Specify the compression method to use. This parameter controls the trade off between encoding speed and the compressed file size and quality. Possible values range from 0 to 6. Default value is 4. When higher values are used, the encoder will spend more time inspecting additional encoding possibilities and decide on the quality gain. Lower value can result is faster processing time at the expense of larger file size and lower compression quality. .TP .BI \-min_size Encode image to achieve smallest size. This disables key frame insertion and picks the dispose method resulting in the smallest output for each frame. It uses lossless compression by default, but can be combined with \-q, \-m, \-lossy or \-mixed options. .TP .BI \-kmin " int .TP .BI \-kmax " int Specify the minimum and maximum distance between consecutive key frames (independently decodable frames) in the output animation. The tool will insert some key frames into the output animation as needed so that this criteria is satisfied. .br A 'kmax' value of 0 will turn off insertion of key frames. A 'kmax' value of 1 will result in all frames being key frames. 'kmin' value is not taken into account in both these special cases. Typical values are in the range 3 to 30. Default values are kmin = 9, kmax = 17 for lossless compression and kmin = 3, kmax = 5 for lossy compression. .br These two options are relevant only for animated images with large number of frames (>50). .br When lower values are used, more frames will be converted to key frames. This may lead to smaller number of frames required to decode a frame on average, thereby improving the decoding performance. But this may lead to slightly bigger file sizes. Higher values may lead to worse decoding performance, but smaller file sizes. .br Some restrictions: .br (i) kmin < kmax, .br (ii) kmin >= kmax / 2 + 1 and .br (iii) kmax - kmin <= 30. .br If any of these restrictions are not met, they will be enforced automatically. .TP .BI \-metadata " string A comma separated list of metadata to copy from the input to the output if present. Valid values: \fBall\fP, \fBnone\fP, \fBicc\fP, \fBxmp\fP. The default is \fBxmp\fP. .TP .BI \-f " int For lossy encoding only (specified by the \-lossy option). Specify the strength of the deblocking filter, between 0 (no filtering) and 100 (maximum filtering). A value of 0 will turn off any filtering. Higher value will increase the strength of the filtering process applied after decoding the picture. The higher the value the smoother the picture will appear. Typical values are usually in the range of 20 to 50. .TP .B \-mt Use multi-threading for encoding, if possible. .TP .B \-loop_compatibility If enabled, handle the loop information in a compatible fashion for Chrome version prior to M62 (inclusive) and Firefox. .TP .B \-v Print extra information. .TP .B \-quiet Do not print anything. .SH BUGS Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp .br Patches welcome! See this page to get started: https://www.webmproject.org/code/contribute/submitting\-patches/ .SH EXAMPLES gif2webp picture.gif \-o picture.webp .br gif2webp \-q 70 picture.gif \-o picture.webp .br gif2webp \-lossy \-m 3 picture.gif \-o picture_lossy.webp .br gif2webp \-lossy \-f 50 picture.gif \-o picture.webp .br gif2webp \-q 70 \-o picture.webp \-\- \-\-\-picture.gif .br cat picture.gif | gif2webp \-o \- \-\- \- > output.webp .SH AUTHORS \fBgif2webp\fP is a part of libwebp and was written by the WebP team. .br The latest source tree is available at https://chromium.googlesource.com/webm/libwebp .PP This manual page was written by Urvang Joshi , for the Debian project (and may be used by others). .SH SEE ALSO .BR cwebp (1), .BR dwebp (1), .BR webpmux (1) .br Please refer to https://developers.google.com/speed/webp/ for additional information. libwebp-1.4.0/man/Makefile.in0000644000014400001440000003767614606317244012722 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_MUX_TRUE@am__append_1 = webpmux.1 @BUILD_GIF2WEBP_TRUE@am__append_2 = gif2webp.1 @BUILD_IMG2WEBP_TRUE@am__append_3 = img2webp.1 @BUILD_VWEBP_TRUE@am__append_4 = vwebp.1 @BUILD_WEBPINFO_TRUE@am__append_5 = webpinfo.1 subdir = man ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ man_MANS = cwebp.1 dwebp.1 $(am__append_1) $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags-am uninstall uninstall-am uninstall-man \ uninstall-man1 .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/configure.ac0000644000014400001440000007072314606317060012352 0ustar AC_INIT([libwebp], [1.4.0], [https://bugs.chromium.org/p/webp],, [https://developers.google.com/speed/webp]) AC_CANONICAL_HOST AC_PREREQ([2.60]) AM_INIT_AUTOMAKE([-Wall foreign subdir-objects]) dnl === automake >= 1.12 requires this for 'unusual archivers' support. dnl === it must occur before LT_INIT (AC_PROG_LIBTOOL). m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl === AC_PROG_LIBTOOL is deprecated. m4_ifdef([LT_INIT], [LT_INIT], [AC_PROG_LIBTOOL]) AC_PROG_SED AM_PROG_CC_C_O dnl === Enable less verbose output when building. m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl == test endianness AC_C_BIGENDIAN dnl === SET_IF_UNSET(shell_var, value) dnl === Set the shell variable 'shell_var' to 'value' if it is unset. AC_DEFUN([SET_IF_UNSET], [test "${$1+set}" = "set" || $1=$2]) AC_ARG_ENABLE([everything], AS_HELP_STRING([--enable-everything], [Enable all optional targets. These can still be disabled with --disable-target]), [SET_IF_UNSET([enable_libsharpyuv], [$enableval]) SET_IF_UNSET([enable_libwebpdecoder], [$enableval]) SET_IF_UNSET([enable_libwebpdemux], [$enableval]) SET_IF_UNSET([enable_libwebpextras], [$enableval]) SET_IF_UNSET([enable_libwebpmux], [$enableval])]) dnl === Check whether libwebpmux should be built AC_MSG_CHECKING(whether libwebpmux is to be built) AC_ARG_ENABLE([libwebpmux], AS_HELP_STRING([--disable-libwebpmux], [Disable libwebpmux @<:@default=no@:>@]), [], [enable_libwebpmux=yes]) AC_MSG_RESULT(${enable_libwebpmux-no}) AM_CONDITIONAL([BUILD_MUX], [test "$enable_libwebpmux" = "yes"]) dnl === Check whether libwebpdemux should be built AC_MSG_CHECKING(whether libwebpdemux is to be built) AC_ARG_ENABLE([libwebpdemux], AS_HELP_STRING([--disable-libwebpdemux], [Disable libwebpdemux @<:@default=no@:>@]), [], [enable_libwebpdemux=yes]) AC_MSG_RESULT(${enable_libwebpdemux-no}) AM_CONDITIONAL([BUILD_DEMUX], [test "$enable_libwebpdemux" = "yes"]) dnl === Check whether decoder library should be built. AC_MSG_CHECKING(whether decoder library is to be built) AC_ARG_ENABLE([libwebpdecoder], AS_HELP_STRING([--enable-libwebpdecoder], [Build libwebpdecoder @<:@default=no@:>@])) AC_MSG_RESULT(${enable_libwebpdecoder-no}) AM_CONDITIONAL([BUILD_LIBWEBPDECODER], [test "$enable_libwebpdecoder" = "yes"]) dnl === Check whether libwebpextras should be built AC_MSG_CHECKING(whether libwebpextras is to be built) AC_ARG_ENABLE([libwebpextras], AS_HELP_STRING([--enable-libwebpextras], [Build libwebpextras @<:@default=no@:>@])) AC_MSG_RESULT(${enable_libwebpextras-no}) AM_CONDITIONAL([BUILD_EXTRAS], [test "$enable_libwebpextras" = "yes"]) dnl === If --enable-asserts is not defined, define NDEBUG AC_MSG_CHECKING(whether asserts are enabled) AC_ARG_ENABLE([asserts], AS_HELP_STRING([--enable-asserts], [Enable assert checks])) if test "x${enable_asserts-no}" = "xno"; then AM_CPPFLAGS="${AM_CPPFLAGS} -DNDEBUG" fi AC_MSG_RESULT(${enable_asserts-no}) AC_SUBST([AM_CPPFLAGS]) AC_ARG_WITH([pkgconfigdir], AS_HELP_STRING([--with-pkgconfigdir=DIR], [Path to the pkgconfig directory @<:@LIBDIR/pkgconfig@:>@]), [pkgconfigdir="$withval"], [pkgconfigdir='${libdir}/pkgconfig']) AC_SUBST([pkgconfigdir]) dnl === TEST_AND_ADD_CFLAGS(var, flag) dnl === Checks whether $CC supports 'flag' and adds it to 'var' dnl === on success. AC_DEFUN([TEST_AND_ADD_CFLAGS], [SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror $2" AC_MSG_CHECKING([whether $CC supports $2]) dnl Note AC_LANG_PROGRAM([]) uses an old-style main definition. AC_COMPILE_IFELSE([AC_LANG_SOURCE([int main(void) { return 0; }])], [AC_MSG_RESULT([yes])] dnl Simply append the variable avoiding a dnl compatibility ifdef for AS_VAR_APPEND as this dnl variable shouldn't grow all that large. [$1="${$1} $2"], [AC_MSG_RESULT([no])]) CFLAGS="$SAVED_CFLAGS"]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-fvisibility=hidden]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wall]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wconstant-conversion]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wdeclaration-after-statement]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wextra]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wextra-semi-stmt]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wfloat-conversion]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wformat -Wformat-nonliteral]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wformat -Wformat-security]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wmissing-declarations]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wmissing-prototypes]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wold-style-definition]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wparentheses-equality]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wshadow]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wshorten-64-to-32]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wstrict-prototypes]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wundef]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunreachable-code-aggressive]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunreachable-code]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunused-but-set-variable]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wunused]) TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wvla]) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62040 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61622 AS_IF([test "$GCC" = "yes" ], [ gcc_version=`$CC -dumpversion` gcc_wht_bug="" case "$host_cpu" in aarch64|arm64) case "$gcc_version" in 4.9|4.9.0|4.9.1) gcc_wht_bug=yes ;; esac esac AS_IF([test "$gcc_wht_bug" = "yes"], [ TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-frename-registers])])]) # Use -flax-vector-conversions, if available, when building intrinsics with # older versions of gcc. The flag appeared in 4.3.x, but if backported, and # -fno-lax-vector-conversions is set, errors may occur with the intrinsics # files along with the older system includes, e.g., emmintrin.h. # Originally observed with cc (GCC) 4.2.1 20070831 patched [FreeBSD] (9.3). # https://bugs.chromium.org/p/webp/issues/detail?id=274 AS_IF([test "$GCC" = "yes" ], [ case "$host_cpu" in amd64|i?86|x86_64) AC_COMPILE_IFELSE( dnl only check for -flax-vector-conversions with older gcc, skip dnl clang as it reports itself as 4.2.1, but the flag isn't needed. [AC_LANG_SOURCE([#if !defined(__clang__) && defined(__GNUC__) && \ ((__GNUC__ << 8) | __GNUC_MINOR__) < 0x403 #error old gcc #endif int main(void) { return 0; } ])],, [TEST_AND_ADD_CFLAGS([INTRINSICS_CFLAGS], [-flax-vector-conversions])]) ;; esac]) AC_SUBST([AM_CFLAGS]) dnl === Check for machine specific flags AC_ARG_ENABLE([sse4.1], AS_HELP_STRING([--disable-sse4.1], [Disable detection of SSE4.1 support @<:@default=auto@:>@])) AS_IF([test "x$enable_sse4_1" != "xno" -a "x$enable_sse2" != "xno"], [ SSE41_FLAGS="$INTRINSICS_CFLAGS $SSE41_FLAGS" TEST_AND_ADD_CFLAGS([SSE41_FLAGS], [-msse4.1]) AS_IF([test -n "$SSE41_FLAGS"], [ SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $SSE41_FLAGS" AC_CHECK_HEADER([smmintrin.h], [AC_DEFINE(WEBP_HAVE_SSE41, [1], [Set to 1 if SSE4.1 is supported])], [SSE41_FLAGS=""]) CFLAGS=$SAVED_CFLAGS]) AC_SUBST([SSE41_FLAGS])]) AC_ARG_ENABLE([sse2], AS_HELP_STRING([--disable-sse2], [Disable detection of SSE2 support @<:@default=auto@:>@])) AS_IF([test "x$enable_sse2" != "xno"], [ SSE2_FLAGS="$INTRINSICS_CFLAGS $SSE2_FLAGS" TEST_AND_ADD_CFLAGS([SSE2_FLAGS], [-msse2]) AS_IF([test -n "$SSE2_FLAGS"], [ SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $SSE2_FLAGS" AC_CHECK_HEADER([emmintrin.h], [AC_DEFINE(WEBP_HAVE_SSE2, [1], [Set to 1 if SSE2 is supported])], [SSE2_FLAGS=""]) CFLAGS=$SAVED_CFLAGS]) AC_SUBST([SSE2_FLAGS])]) AC_ARG_ENABLE([neon], AS_HELP_STRING([--disable-neon], [Disable detection of NEON support @<:@default=auto@:>@])) AC_ARG_ENABLE([neon_rtcd], AS_HELP_STRING([--disable-neon-rtcd], [Disable runtime detection of NEON support via /proc/cpuinfo on Linux hosts @<:@default=auto@:>@])) # For ARM(7) hosts: # Both NEON flags unset and NEON support detected = build all modules with NEON # NEON detected with the use of -mfpu=neon = build only NEON modules with NEON AS_IF([test "x$enable_neon" != "xno"], [ case "$host_cpu" in arm|armv7*) # Test for NEON support without flags before falling back to -mfpu=neon for flag in '' '-mfpu=neon'; do LOCAL_NEON_FLAGS="$INTRINSICS_CFLAGS $NEON_FLAGS" TEST_AND_ADD_CFLAGS([LOCAL_NEON_FLAGS], [$flag]) SAVED_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $LOCAL_NEON_FLAGS" dnl Note AC_LANG_PROGRAM([]) uses an old-style main definition. AC_COMPILE_IFELSE([AC_LANG_SOURCE([ #include int main(void) { int8x8_t v = vdup_n_s8(0); (void)v; return 0; }])], [NEON_FLAGS="$(echo $LOCAL_NEON_FLAGS | $SED 's/^ *//')" AS_IF([test -n "$NEON_FLAGS"], [ AS_IF([test "${host_os%%-*}" = "linux" -o \ "x$enable_neon_rtcd" = "xno"], [ CFLAGS=$SAVED_CFLAGS AC_DEFINE(WEBP_HAVE_NEON, [1], [Set to 1 if NEON is supported]) break ],[ AC_MSG_WARN(m4_normalize([NEON runtime cpu-detection is unavailable for ${host_os%%-*}. Force with CFLAGS=-mfpu=neon or --disable-neon-rtcd.])) enable_neon_rtcd=no NEON_FLAGS="" ]) ],[ CFLAGS=$SAVED_CFLAGS AC_DEFINE(WEBP_HAVE_NEON, [1], [Set to 1 if NEON is supported]) break ])]) CFLAGS=$SAVED_CFLAGS done AS_IF([test -n "$NEON_FLAGS"], [ # If NEON is available and rtcd is disabled apply NEON_FLAGS globally. AS_IF([test "x$enable_neon_rtcd" = "xno"], [ AM_CFLAGS="$AM_CFLAGS $NEON_FLAGS" NEON_FLAGS=""], [AC_DEFINE(WEBP_HAVE_NEON_RTCD, [1], [Set to 1 if runtime detection of NEON is enabled])])]) case "$host_os" in *android*) AC_CHECK_HEADERS([cpu-features.h]) ;; esac ;; aarch64*|arm64*) AC_DEFINE(WEBP_HAVE_NEON, [1], [Set to 1 if NEON is supported]) ;; esac AC_SUBST([NEON_FLAGS])]) dnl === CLEAR_LIBVARS([var_pfx]) dnl === Clears _{INCLUDES,LIBS}. AC_DEFUN([CLEAR_LIBVARS], [$1_INCLUDES=""; $1_LIBS=""]) dnl === WITHLIB_OPTION([opt_pfx], [outvar_pfx]) dnl === Defines --with-{include,lib}dir options which set dnl === the variables _{INCLUDES,LIBS}. AC_DEFUN([WITHLIB_OPTION], [AC_ARG_WITH([$1includedir], AS_HELP_STRING([--with-$1includedir=DIR], [use $2 includes from DIR]), $2_INCLUDES="-I$withval") AC_ARG_WITH([$1libdir], AS_HELP_STRING([--with-$1libdir=DIR], [use $2 libraries from DIR]), [$2_LIBS="-L$withval"])]) dnl === LIBCHECK_PROLOGUE([var_pfx]) dnl === Caches the current values of CPPFLAGS/LIBS in SAVED_* then dnl === prepends the current values with _{INCLUDES,LIBS}. AC_DEFUN([LIBCHECK_PROLOGUE], [SAVED_CPPFLAGS=$CPPFLAGS SAVED_LIBS=$LIBS CPPFLAGS="$$1_INCLUDES $CPPFLAGS" LIBS="$$1_LIBS $LIBS"]) dnl === LIBCHECK_EPILOGUE([var_pfx]) dnl === Restores the values of CPPFLAGS/LIBS from SAVED_* and exports dnl === _{INCLUDES,LIBS} with AC_SUBST. AC_DEFUN([LIBCHECK_EPILOGUE], [AC_SUBST($1_LIBS) AC_SUBST($1_INCLUDES) CPPFLAGS=$SAVED_CPPFLAGS LIBS=$SAVED_LIBS]) dnl === Check for gcc builtins dnl === CHECK_FOR_BUILTIN([builtin], [param], [define]) dnl === links a C AC_LANG_PROGRAM, with () dnl === AC_DEFINE'ing if successful. AC_DEFUN([CHECK_FOR_BUILTIN], [AC_LANG_PUSH([C]) AC_MSG_CHECKING([for $1]) AC_LINK_IFELSE([AC_LANG_PROGRAM([], [(void)$1($2)])], [AC_MSG_RESULT([yes]) AC_DEFINE([$3], [1], [Set to 1 if $1 is available])], [AC_MSG_RESULT([no])]), AC_LANG_POP]) dnl AC_CHECK_FUNC doesn't work with builtin's. CHECK_FOR_BUILTIN([__builtin_bswap16], [1u << 15], [HAVE_BUILTIN_BSWAP16]) CHECK_FOR_BUILTIN([__builtin_bswap32], [1u << 31], [HAVE_BUILTIN_BSWAP32]) CHECK_FOR_BUILTIN([__builtin_bswap64], [1ull << 63], [HAVE_BUILTIN_BSWAP64]) dnl === Check for pthread support AC_ARG_ENABLE([threading], AS_HELP_STRING([--disable-threading], [Disable detection of thread support]),, [enable_threading=yes]) if test "$enable_threading" = "yes"; then AC_MSG_NOTICE([checking for threading support...]) AX_PTHREAD([AC_DEFINE([WEBP_USE_THREAD], [1], [Undefine this to disable thread support.]) LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" ], [AC_CHECK_FUNC([_beginthreadex], [AC_DEFINE([WEBP_USE_THREAD], [1], [Undefine this to disable thread support.])], [enable_threading=no])]) fi AC_MSG_NOTICE([checking if threading is enabled... ${enable_threading-no}]) dnl === check for OpenGL/GLUT support === AC_ARG_ENABLE([gl], AS_HELP_STRING([--disable-gl], [Disable detection of OpenGL support @<:@default=auto@:>@])) AS_IF([test "x$enable_gl" != "xno"], [ CLEAR_LIBVARS([GL]) WITHLIB_OPTION([gl], [GL]) LIBCHECK_PROLOGUE([GL]) glut_cflags="none" glut_ldflags="none" case $host_os in darwin*) # Special case for OSX builds. Append these to give the user a chance to # override with --with-gl* glut_cflags="$glut_cflags|-framework GLUT -framework OpenGL" glut_ldflags="$glut_ldflags|-framework GLUT -framework OpenGL" # quiet deprecation warnings for glut TEST_AND_ADD_CFLAGS([AM_CFLAGS], [-Wno-deprecated-declarations]) ;; esac GLUT_SAVED_CPPFLAGS="$CPPFLAGS" SAVED_IFS="$IFS" IFS="|" for flag in $glut_cflags; do # restore IFS immediately as the autoconf macros may need the default. IFS="$SAVED_IFS" unset ac_cv_header_GL_glut_h unset ac_cv_header_OpenGL_glut_h case $flag in none) ;; *) CPPFLAGS="$flag $CPPFLAGS";; esac AC_CHECK_HEADERS([GL/glut.h GLUT/glut.h OpenGL/glut.h], [glut_headers=yes; test "$flag" = "none" || GL_INCLUDES="$CPPFLAGS"; break]) CPPFLAGS="$GLUT_SAVED_CPPFLAGS" test "$glut_headers" = "yes" && break done IFS="$SAVED_IFS" if test "$glut_headers" = "yes"; then AC_LANG_PUSH([C]) GLUT_SAVED_LDFLAGS="$LDFLAGS" SAVED_IFS="$IFS" IFS="|" for flag in $glut_ldflags; do # restore IFS immediately as the autoconf macros may need the default. IFS="$SAVED_IFS" unset ac_cv_search_glBegin case $flag in none) ;; *) LDFLAGS="$flag $LDFLAGS";; esac # find libGL GL_SAVED_LIBS="$LIBS" AC_SEARCH_LIBS([glBegin], [GL OpenGL opengl32]) LIBS="$GL_SAVED_LIBS" # A direct link to libGL may not be necessary on e.g., linux. GLUT_SAVED_LIBS="$LIBS" for lib in "" "-lglut" "-lglut $ac_cv_search_glBegin"; do LIBS="$lib" AC_LINK_IFELSE( [AC_LANG_PROGRAM([ #ifdef __cplusplus # define EXTERN_C extern "C" #else # define EXTERN_C #endif EXTERN_C char glOrtho(); EXTERN_C char glutMainLoop(); ],[ glOrtho(); glutMainLoop(); ]) ], AC_DEFINE(WEBP_HAVE_GL, [1], [Set to 1 if OpenGL is supported]) [glut_support=yes], [] ) if test "$glut_support" = "yes"; then GL_LIBS="$LDFLAGS $lib" break fi done LIBS="$GLUT_SAVED_LIBS" LDFLAGS="$GLUT_SAVED_LDFLAGS" test "$glut_support" = "yes" && break done IFS="$SAVED_IFS" AC_LANG_POP fi LIBCHECK_EPILOGUE([GL]) if test "$glut_support" = "yes" -a "$enable_libwebpdemux" = "yes"; then build_vwebp=yes else AC_MSG_NOTICE( m4_normalize([Not building vwebp. OpenGL libraries and --enable-libwebpdemux are required.])) fi ]) AM_CONDITIONAL([BUILD_VWEBP], [test "$build_vwebp" = "yes"]) dnl === check for SDL support === AC_ARG_ENABLE([sdl], AS_HELP_STRING([--disable-sdl], [Disable detection of SDL support @<:@default=auto@:>@])) AS_IF([test "x$enable_sdl" != "xno"], [ CLEAR_LIBVARS([SDL]) AC_PATH_PROGS([LIBSDL_CONFIG], [sdl2-config]) if test -n "$LIBSDL_CONFIG"; then SDL_INCLUDES=`$LIBSDL_CONFIG --cflags` SDL_LIBS="`$LIBSDL_CONFIG --libs`" fi WITHLIB_OPTION([sdl], [SDL]) sdl_header="no" LIBCHECK_PROLOGUE([SDL]) AC_CHECK_HEADER([SDL2/SDL.h], [sdl_header="SDL2/SDL.h"], [AC_MSG_WARN(SDL2 library not available - no SDL.h)]) if test x"$sdl_header" != "xno"; then AC_LANG_PUSH(C) SDL_SAVED_LIBS="$LIBS" for lib in "" "-lSDL2" "-lSDL2main -lSDL2"; do LIBS="$SDL_SAVED_LIBS $lib" # Perform a full link to ensure SDL_main is resolved if needed. AC_LINK_IFELSE( [AC_LANG_SOURCE([ #include <$sdl_header> int main(int argc, char** argv) { SDL_Init(0); return 0; }])], [SDL_LIBS="$LDFLAGS $LIBS" SDL_INCLUDES="$SDL_INCLUDES -DWEBP_HAVE_SDL" AC_DEFINE(WEBP_HAVE_SDL, [1], [Set to 1 if SDL library is installed]) sdl_support=yes] ) if test x"$sdl_support" = "xyes"; then break fi done # LIBS is restored by LIBCHECK_EPILOGUE AC_LANG_POP if test x"$sdl_header" = "xSDL.h"; then SDL_INCLUDES="$SDL_INCLUDES -DWEBP_HAVE_JUST_SDL_H" fi fi LIBCHECK_EPILOGUE([SDL]) if test x"$sdl_support" = "xyes"; then build_vwebp_sdl=yes else AC_MSG_NOTICE([Not building vwebp-sdl. SDL library is required.]) fi ]) AM_CONDITIONAL([BUILD_VWEBP_SDL], [test "$build_vwebp_sdl" = "yes"]) dnl === check for PNG support === AC_ARG_ENABLE([png], AS_HELP_STRING([--disable-png], [Disable detection of PNG format support @<:@default=auto@:>@])) AS_IF([test "x$enable_png" != "xno"], [ CLEAR_LIBVARS([PNG]) AC_PATH_PROGS([LIBPNG_CONFIG], [libpng-config libpng16-config libpng15-config libpng14-config \ libpng12-config]) if test -n "$LIBPNG_CONFIG"; then PNG_INCLUDES=`$LIBPNG_CONFIG --cflags` PNG_LIBS="`$LIBPNG_CONFIG --ldflags`" fi WITHLIB_OPTION([png], [PNG]) LIBCHECK_PROLOGUE([PNG]) AC_CHECK_HEADER(png.h, AC_SEARCH_LIBS(png_get_libpng_ver, [png], [test "$ac_cv_search_png_get_libpng_ver" = "none required" \ || PNG_LIBS="$PNG_LIBS $ac_cv_search_png_get_libpng_ver" PNG_INCLUDES="$PNG_INCLUDES -DWEBP_HAVE_PNG" AC_DEFINE(WEBP_HAVE_PNG, [1], [Set to 1 if PNG library is installed]) png_support=yes ], [AC_MSG_WARN(Optional png library not found) PNG_LIBS="" PNG_INCLUDES="" ], [$MATH_LIBS]), [AC_MSG_WARN(png library not available - no png.h) PNG_LIBS="" PNG_INCLUDES="" ], ) LIBCHECK_EPILOGUE([PNG]) ]) dnl === check for JPEG support === AC_ARG_ENABLE([jpeg], AS_HELP_STRING([--disable-jpeg], [Disable detection of JPEG format support @<:@default=auto@:>@])) AS_IF([test "x$enable_jpeg" != "xno"], [ CLEAR_LIBVARS([JPEG]) WITHLIB_OPTION([jpeg], [JPEG]) LIBCHECK_PROLOGUE([JPEG]) AC_CHECK_HEADER(jpeglib.h, AC_CHECK_LIB(jpeg, jpeg_set_defaults, [JPEG_LIBS="$JPEG_LIBS -ljpeg" JPEG_INCLUDES="$JPEG_INCLUDES -DWEBP_HAVE_JPEG" AC_DEFINE(WEBP_HAVE_JPEG, [1], [Set to 1 if JPEG library is installed]) jpeg_support=yes ], AC_MSG_WARN(Optional jpeg library not found), [$MATH_LIBS]), AC_MSG_WARN(jpeg library not available - no jpeglib.h) ) LIBCHECK_EPILOGUE([JPEG]) ]) dnl === check for TIFF support === AC_ARG_ENABLE([tiff], AS_HELP_STRING([--disable-tiff], [Disable detection of TIFF format support @<:@default=auto@:>@])) AS_IF([test "x$enable_tiff" != "xno"], [ CLEAR_LIBVARS([TIFF]) WITHLIB_OPTION([tiff], [TIFF]) LIBCHECK_PROLOGUE([TIFF]) AC_CHECK_HEADER(tiffio.h, AC_CHECK_LIB(tiff, TIFFGetVersion, [TIFF_LIBS="$TIFF_LIBS -ltiff" TIFF_INCLUDES="$TIFF_INCLUDES -DWEBP_HAVE_TIFF" AC_DEFINE(WEBP_HAVE_TIFF, [1], [Set to 1 if TIFF library is installed]) tiff_support=yes ], AC_MSG_WARN(Optional tiff library not found), [$MATH_LIBS]), AC_MSG_WARN(tiff library not available - no tiffio.h) ) LIBCHECK_EPILOGUE([TIFF]) ]) dnl === check for GIF support === AC_ARG_ENABLE([gif], AS_HELP_STRING([--disable-gif], [Disable detection of GIF format support @<:@default=auto@:>@])) AS_IF([test "x$enable_gif" != "xno"], [ CLEAR_LIBVARS([GIF]) WITHLIB_OPTION([gif], [GIF]) LIBCHECK_PROLOGUE([GIF]) AC_CHECK_HEADER(gif_lib.h, AC_CHECK_LIB([gif], [DGifOpenFileHandle], [GIF_LIBS="$GIF_LIBS -lgif" AC_DEFINE(WEBP_HAVE_GIF, [1], [Set to 1 if GIF library is installed]) gif_support=yes ], AC_MSG_WARN(Optional gif library not found), [$MATH_LIBS]), AC_MSG_WARN(gif library not available - no gif_lib.h) ) LIBCHECK_EPILOGUE([GIF]) if test "$gif_support" = "yes" -a \ "$enable_libwebpdemux" = "yes"; then build_anim_diff=yes else AC_MSG_NOTICE( [Not building anim_diff. libgif and --enable-libwebpdemux are required.]) fi if test "$gif_support" = "yes" -a \ "$enable_libwebpmux" = "yes"; then build_gif2webp=yes else AC_MSG_NOTICE( [Not building gif2webp. libgif and --enable-libwebpmux are required.]) fi ]) AM_CONDITIONAL([BUILD_ANIMDIFF], [test "${build_anim_diff}" = "yes"]) AM_CONDITIONAL([BUILD_GIF2WEBP], [test "${build_gif2webp}" = "yes"]) if test "$enable_libwebpdemux" = "yes" -a "$enable_libwebpmux" = "yes"; then build_img2webp=yes else AC_MSG_NOTICE( m4_normalize([Not building img2webp. --enable-libwebpdemux & --enable-libwebpmux are required.])) fi AM_CONDITIONAL([BUILD_IMG2WEBP], [test "${build_img2webp}" = "yes"]) if test "$enable_libwebpmux" = "yes"; then build_webpinfo=yes else AC_MSG_NOTICE([Not building webpinfo. --enable-libwebpdemux is required.]) fi AM_CONDITIONAL([BUILD_WEBPINFO], [test "${build_webpinfo}" = "yes"]) dnl === check for WIC support === AC_ARG_ENABLE([wic], AS_HELP_STRING([--disable-wic], [Disable Windows Imaging Component (WIC) detection. @<:@default=auto@:>@]),, [enable_wic=yes]) case $host_os in mingw*) if test "$enable_wic" = "yes"; then AC_CHECK_HEADERS([wincodec.h shlwapi.h windows.h]) if test "$ac_cv_header_wincodec_h" = "yes"; then AC_MSG_CHECKING(for Windows Imaging Component support) SAVED_LIBS=$LIBS LIBS="-lshlwapi -lole32 $LIBS" # match include structure from [cd]webp.c wic_headers=" #define INITGUID #define CINTERFACE #define COBJMACROS #define _WIN32_IE 0x500 #include #include #include " # test for functions from each lib and the GUID is created properly wic_main=" int main(void) { CLSID_WICImagingFactory; CoInitialize(NULL); SHCreateStreamOnFile(NULL, 0, NULL); return 0; } " AC_LANG_PUSH(C) AC_LINK_IFELSE( [AC_LANG_SOURCE([ $wic_headers $wic_main])], [wic_support=yes], [wic_support=no] ) AC_LANG_POP test "$wic_support" = "yes" || LIBS=$SAVED_LIBS AC_MSG_RESULT(${wic_support-no}) fi fi esac dnl === If --enable-swap-16bit-csp is defined, add -DWEBP_SWAP_16BIT_CSP=1 USE_SWAP_16BIT_CSP="" AC_MSG_CHECKING(if --enable-swap-16bit-csp option is specified) AC_ARG_ENABLE([swap-16bit-csp], AS_HELP_STRING([--enable-swap-16bit-csp], [Enable byte swap for 16 bit colorspaces])) if test "$enable_swap_16bit_csp" = "yes"; then USE_SWAP_16BIT_CSP="-DWEBP_SWAP_16BIT_CSP=1" fi AC_MSG_RESULT(${enable_swap_16bit_csp-no}) AC_SUBST(USE_SWAP_16BIT_CSP) dnl === If --disable-near-lossless is defined, add -DWEBP_NEAR_LOSSLESS=0 AC_DEFINE(WEBP_NEAR_LOSSLESS, [1], [Enable near lossless encoding]) AC_MSG_CHECKING(if --disable-near-lossless option is specified) AC_ARG_ENABLE([near_lossless], AS_HELP_STRING([--disable-near-lossless], [Disable near lossless encoding]), [], [enable_near_lossless=yes]) if test "$enable_near_lossless" = "no"; then AC_DEFINE(WEBP_NEAR_LOSSLESS, [0], [Enable near lossless encoding]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi dnl ========================= dnl Add an empty webp_libname_prefix variable for use in *.pc.in. AC_SUBST([webp_libname_prefix]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([src/webp/config.h]) AC_CONFIG_FILES([Makefile src/Makefile man/Makefile \ examples/Makefile extras/Makefile imageio/Makefile \ sharpyuv/Makefile sharpyuv/libsharpyuv.pc \ src/dec/Makefile src/enc/Makefile src/dsp/Makefile \ src/demux/Makefile src/mux/Makefile \ src/utils/Makefile \ src/libwebp.pc src/libwebpdecoder.pc \ src/demux/libwebpdemux.pc src/mux/libwebpmux.pc]) dnl fix exports from MinGW builds AC_CONFIG_COMMANDS_POST([$SED -i 's/-DDLL_EXPORT/-DWEBP_DLL/' config.status]) AC_OUTPUT AC_MSG_NOTICE([ WebP Configuration Summary -------------------------- Shared libraries: ${enable_shared} Static libraries: ${enable_static} Threading support: ${enable_threading-no} libwebp: yes libwebpdecoder: ${enable_libwebpdecoder-no} libwebpdemux: ${enable_libwebpdemux-no} libwebpmux: ${enable_libwebpmux-no} libwebpextras: ${enable_libwebpextras-no} Tools: cwebp : ${enable_libwebpdemux-no} Input format support ==================== JPEG : ${jpeg_support-no} PNG : ${png_support-no} TIFF : ${tiff_support-no} WIC : ${wic_support-no} dwebp : ${enable_libwebpdemux-no} Output format support ===================== PNG : ${png_support-no} WIC : ${wic_support-no} GIF support : ${gif_support-no} anim_diff : ${build_anim_diff-no} gif2webp : ${build_gif2webp-no} img2webp : ${build_img2webp-no} webpmux : ${enable_libwebpmux-no} vwebp : ${build_vwebp-no} webpinfo : ${build_webpinfo-no} SDL support : ${sdl_support-no} vwebp_sdl : ${build_vwebp_sdl-no} ]) libwebp-1.4.0/CMakeLists.txt0000644000014400001440000007676014606317060012633 0ustar # Copyright (c) 2020 Google LLC. # # Use of this source code is governed by a BSD-style license # that can be found in the LICENSE file in the root of the source # tree. An additional intellectual property rights grant can be found # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. if(APPLE) cmake_minimum_required(VERSION 3.17) else() cmake_minimum_required(VERSION 3.7) endif() if(POLICY CMP0072) cmake_policy(SET CMP0072 NEW) endif() project(WebP C) # Options for coder / decoder executables. if(BUILD_SHARED_LIBS) set(WEBP_LINK_STATIC_DEFAULT OFF) else() set(WEBP_LINK_STATIC_DEFAULT ON) endif() option(WEBP_LINK_STATIC "Link using static libraries. If OFF, use dynamic libraries." ${WEBP_LINK_STATIC_DEFAULT}) if(NOT EMSCRIPTEN) # Disable SIMD on Emscripten by default, as it's a new unstable Wasm feature. # Users can still explicitly opt-in to make a SIMD-enabled build. set(WEBP_ENABLE_SIMD_DEFAULT ON) endif() option(WEBP_ENABLE_SIMD "Enable any SIMD optimization." ${WEBP_ENABLE_SIMD_DEFAULT}) option(WEBP_BUILD_ANIM_UTILS "Build animation utilities." ON) option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." ON) option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." ON) option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." ON) option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." ON) option(WEBP_BUILD_VWEBP "Build the vwebp viewer tool." ON) option(WEBP_BUILD_WEBPINFO "Build the webpinfo command line tool." ON) option(WEBP_BUILD_LIBWEBPMUX "Build the libwebpmux library." ON) option(WEBP_BUILD_WEBPMUX "Build the webpmux command line tool." ON) option(WEBP_BUILD_EXTRAS "Build extras." ON) option(WEBP_BUILD_WEBP_JS "Emscripten build of webp.js." OFF) option(WEBP_USE_THREAD "Enable threading support" ON) option(WEBP_NEAR_LOSSLESS "Enable near-lossless encoding" ON) option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces." OFF) set(WEBP_BITTRACE "0" CACHE STRING "Bit trace mode (0=none, 1=bit, 2=bytes)") set_property(CACHE WEBP_BITTRACE PROPERTY STRINGS 0 1 2) option(WEBP_ENABLE_WUNUSED_RESULT "Add [[nodiscard]] to some functions. \ CMake must be at least 3.21 to force C23" OFF) if(WEBP_LINK_STATIC) if(WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) else() set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() set(CMAKE_POSITION_INDEPENDENT_CODE ON) # vwebp does not compile on Ubuntu with static libraries so disabling it for # now. set(WEBP_BUILD_VWEBP OFF) endif() # Option needed for handling Unicode file names on Windows. if(WIN32) option(WEBP_UNICODE "Build Unicode executables." ON) endif() if(WEBP_BUILD_WEBP_JS) set(WEBP_BUILD_ANIM_UTILS OFF) set(WEBP_BUILD_CWEBP OFF) set(WEBP_BUILD_DWEBP OFF) set(WEBP_BUILD_GIF2WEBP OFF) set(WEBP_BUILD_IMG2WEBP OFF) set(WEBP_BUILD_VWEBP OFF) set(WEBP_BUILD_WEBPINFO OFF) set(WEBP_BUILD_WEBPMUX OFF) set(WEBP_BUILD_EXTRAS OFF) set(WEBP_USE_THREAD OFF) if(WEBP_ENABLE_SIMD) message(NOTICE "wasm2js does not support SIMD, disabling webp.js generation.") endif() endif() set(SHARPYUV_DEP_LIBRARIES) set(SHARPYUV_DEP_INCLUDE_DIRS) set(WEBP_DEP_LIBRARIES) set(WEBP_DEP_INCLUDE_DIRS) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type: Release, Debug, MinSizeRel or RelWithDebInfo" FORCE) endif() # Include dependencies. if(WEBP_BUILD_ANIM_UTILS OR WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR WEBP_BUILD_EXTRAS OR WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP) set(WEBP_FIND_IMG_LIBS TRUE) else() set(WEBP_FIND_IMG_LIBS FALSE) endif() include(cmake/deps.cmake) include(GNUInstallDirs) if(BUILD_SHARED_LIBS AND NOT DEFINED CMAKE_INSTALL_RPATH) # Set the rpath to match autoconf/libtool behavior. Note this must be set # before target creation. set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") endif() # ############################################################################## # Options. if(WEBP_ENABLE_SWAP_16BIT_CSP) add_definitions(-DWEBP_SWAP_16BIT_CSP=1) endif() if(NOT WEBP_BITTRACE STREQUAL "0") add_definitions(-DBITTRACE=${WEBP_BITTRACE}) endif() if(WEBP_UNICODE) # Windows recommends setting both UNICODE and _UNICODE. add_definitions(-DUNICODE -D_UNICODE) endif() if(WIN32 AND BUILD_SHARED_LIBS) add_definitions(-DWEBP_DLL) endif() # pkg-config variables used by *.pc.in. set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix "\${prefix}") if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") set(libdir "${CMAKE_INSTALL_LIBDIR}") else() set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") endif() if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") else() set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") endif() set(PTHREAD_LIBS ${CMAKE_THREAD_LIBS_INIT}) set(INSTALLED_LIBRARIES) if(MSVC) # match the naming convention used by nmake set(webp_libname_prefix "lib") set(CMAKE_SHARED_LIBRARY_PREFIX "${webp_libname_prefix}") set(CMAKE_IMPORT_LIBRARY_PREFIX "${webp_libname_prefix}") set(CMAKE_STATIC_LIBRARY_PREFIX "${webp_libname_prefix}") endif() if(NOT WIN32) set(CMAKE_C_VISIBILITY_PRESET hidden) endif() if(WEBP_ENABLE_WUNUSED_RESULT) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0) set(CMAKE_C_STANDARD 23) else() unset(CMAKE_C_STANDARD) add_compile_options($<$:-std=gnu2x>) endif() add_compile_options(-Wunused-result) add_definitions(-DWEBP_ENABLE_NODISCARD=1) endif() # ############################################################################## # Android only. if(ANDROID) include_directories(${ANDROID_NDK}/sources/android/cpufeatures) add_library(cpufeatures-webp STATIC ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) list(APPEND INSTALLED_LIBRARIES cpufeatures-webp) target_link_libraries(cpufeatures-webp dl) set(SHARPYUV_DEP_LIBRARIES ${SHARPYUV_DEP_LIBRARIES} cpufeatures-webp) set(WEBP_DEP_LIBRARIES ${WEBP_DEP_LIBRARIES} cpufeatures-webp) set(cpufeatures_include_dir ${ANDROID_NDK}/sources/android/cpufeatures) set(SHARPYUV_DEP_INCLUDE_DIRS ${SHARPYUV_DEP_INCLUDE_DIRS} ${cpufeatures_include_dir}) set(WEBP_DEP_INCLUDE_DIRS ${WEBP_DEP_INCLUDE_DIRS} ${cpufeatures_include_dir}) add_definitions(-DHAVE_CPU_FEATURES_H=1) set(HAVE_CPU_FEATURES_H 1) else() set(HAVE_CPU_FEATURES_H 0) endif() function(configure_pkg_config FILE) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.in" "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" @ONLY) if(HAVE_MATH_LIBRARY) # MSVC doesn't have libm file(READ ${CMAKE_CURRENT_BINARY_DIR}/${FILE} data) string(REPLACE "-lm" "" data ${data}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${FILE} ${data}) endif() install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${FILE}" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endfunction() # ############################################################################## # WebP source files. Read the Makefile.am to get the source files. # We expect the Makefiles to define the sources as defined in the first regex. # E.g.: libimagedec_la_SOURCES = image_dec.c image_dec.h function(parse_Makefile_am FOLDER VAR SRC_REGEX) file(READ ${FOLDER}/Makefile.am MAKEFILE_AM) string(REGEX MATCHALL "${SRC_REGEX}_SOURCES[ ]*\\+?=[ ]+[0-9a-z\\._ ]*" FILES_PER_LINE ${MAKEFILE_AM}) set(SRCS ${${VAR}}) foreach(FILES ${FILES_PER_LINE}) string(FIND ${FILES} "=" OFFSET) math(EXPR OFFSET "${OFFSET} + 2") string(SUBSTRING ${FILES} ${OFFSET} -1 FILES) if(FILES) string(REGEX MATCHALL "[0-9a-z\\._]+" FILES ${FILES}) foreach(FILE ${FILES}) list(APPEND SRCS ${FOLDER}/${FILE}) endforeach() endif() endforeach() set(${VAR} ${SRCS} PARENT_SCOPE) endfunction() set(WEBP_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) parse_makefile_am(${WEBP_SRC_DIR}/dec "WEBP_DEC_SRCS" "") parse_makefile_am(${WEBP_SRC_DIR}/demux "WEBP_DEMUX_SRCS" "") parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_COMMON_SRCS" "COMMON") parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "ENC") parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_ENC_SRCS" "dsp_[^ ]*") parse_makefile_am(${WEBP_SRC_DIR}/dsp "WEBP_DSP_DEC_SRCS" "decode_[^ ]*") parse_makefile_am(${WEBP_SRC_DIR}/enc "WEBP_ENC_SRCS" "") parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_COMMON_SRCS" "COMMON") parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_ENC_SRCS" "ENC") parse_makefile_am(${WEBP_SRC_DIR}/utils "WEBP_UTILS_DEC_SRCS" "decode_[^ ]*") # Remove the files specific to SIMD we don't use. foreach(FILE ${WEBP_SIMD_FILES_NOT_TO_INCLUDE}) list(REMOVE_ITEM WEBP_DSP_ENC_SRCS ${FILE}) list(REMOVE_ITEM WEBP_DSP_DEC_SRCS ${FILE}) endforeach() # Generate the config.h file. configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/webp/config.h @ONLY) add_definitions(-DHAVE_CONFIG_H) # Set the version numbers. macro(set_version FILE TARGET_NAME NAME_IN_MAKEFILE) file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} SOURCE_FILE) string(REGEX MATCH "${NAME_IN_MAKEFILE}_la_LDFLAGS[^\n]* -version-info [0-9:]+" TMP ${SOURCE_FILE}) string(REGEX MATCH "[0-9:]+" TMP ${TMP}) string(REGEX REPLACE ":" " " LT_VERSION ${TMP}) # See the libtool docs for more information: # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info # # c=, a=, r= # # libtool generates a .so file as .so.[c-a].a.r, while -version-info c:r:a is # passed to libtool. # # We set FULL = [c-a].a.r and MAJOR = [c-a]. separate_arguments(LT_VERSION) list(GET LT_VERSION 0 LT_CURRENT) list(GET LT_VERSION 1 LT_REVISION) list(GET LT_VERSION 2 LT_AGE) math(EXPR LT_CURRENT_MINUS_AGE "${LT_CURRENT} - ${LT_AGE}") set_target_properties( ${TARGET_NAME} PROPERTIES VERSION ${LT_CURRENT_MINUS_AGE}.${LT_AGE}.${LT_REVISION} SOVERSION ${LT_CURRENT_MINUS_AGE}) if(APPLE) # For compatibility, set MACHO_COMPATIBILITY_VERSION and # MACHO_CURRENT_VERSION to match libtool. These properties were introduced # in 3.17: # https://cmake.org/cmake/help/latest/prop_tgt/MACHO_COMPATIBILITY_VERSION.html math(EXPR LIBWEBP_MACHO_COMPATIBILITY_VERSION "${LT_CURRENT} + 1") set_target_properties( ${TARGET_NAME} PROPERTIES MACHO_COMPATIBILITY_VERSION ${LIBWEBP_MACHO_COMPATIBILITY_VERSION} MACHO_CURRENT_VERSION ${LIBWEBP_MACHO_COMPATIBILITY_VERSION}.${LT_REVISION}) endif() endmacro() # ############################################################################## # Build the webpdecoder library. # Creates a source file with an unused stub function in $CMAKE_BINARY_DIR and # adds it to the specified target. Currently used only with Xcode. # # See also: # https://cmake.org/cmake/help/v3.18/command/add_library.html#object-libraries # "Some native build systems (such as Xcode) may not like targets that have only # object files, so consider adding at least one real source file to any target # that references $." function(libwebp_add_stub_file TARGET) set(stub_source_dir "${CMAKE_BINARY_DIR}") set(stub_source_file "${stub_source_dir}/libwebp_${TARGET}_stub.c") set(stub_source_code "// Generated file. DO NOT EDIT!\n" "// C source file created for target ${TARGET}.\n" "void libwebp_${TARGET}_stub_function(void)\;\n" "void libwebp_${TARGET}_stub_function(void) {}\n") file(WRITE "${stub_source_file}" ${stub_source_code}) target_sources(${TARGET} PRIVATE ${stub_source_file}) endfunction() parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv "WEBP_SHARPYUV_SRCS" "") add_library(sharpyuv ${WEBP_SHARPYUV_SRCS}) target_link_libraries(sharpyuv ${SHARPYUV_DEP_LIBRARIES}) set_version(sharpyuv/Makefile.am sharpyuv sharpyuv) target_include_directories( sharpyuv PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) set_target_properties( sharpyuv PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/sharpyuv/sharpyuv_csp.h") configure_pkg_config("sharpyuv/libsharpyuv.pc") install( TARGETS sharpyuv EXPORT ${PROJECT_NAME}Targets PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp/sharpyuv INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/webp ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) if(MSVC) # avoid security warnings for e.g., fopen() used in the examples. add_definitions(-D_CRT_SECURE_NO_WARNINGS) else() add_compile_options(-Wall) endif() include_directories(${WEBP_DEP_INCLUDE_DIRS}) add_library(webpdecode OBJECT ${WEBP_DEC_SRCS}) target_include_directories(webpdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_library(webpdspdecode OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS}) target_include_directories(webpdspdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_library(webputilsdecode OBJECT ${WEBP_UTILS_COMMON_SRCS} ${WEBP_UTILS_DEC_SRCS}) target_include_directories(webputilsdecode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_library( webpdecoder $ $ $) if(XCODE) libwebp_add_stub_file(webpdecoder) endif() target_link_libraries(webpdecoder ${WEBP_DEP_LIBRARIES}) target_include_directories( webpdecoder PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} INTERFACE $ $) set_target_properties( webpdecoder PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") configure_pkg_config("src/libwebpdecoder.pc") # Build the webp library. add_library(webpencode OBJECT ${WEBP_ENC_SRCS}) target_include_directories( webpencode PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) add_library(webpdsp OBJECT ${WEBP_DSP_COMMON_SRCS} ${WEBP_DSP_DEC_SRCS} ${WEBP_DSP_ENC_SRCS}) target_include_directories(webpdsp PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_library(webputils OBJECT ${WEBP_UTILS_COMMON_SRCS} ${WEBP_UTILS_DEC_SRCS} ${WEBP_UTILS_ENC_SRCS}) target_include_directories(webputils PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_library(webp $ $ $ $) target_link_libraries(webp sharpyuv) if(XCODE) libwebp_add_stub_file(webp) endif() target_link_libraries(webp ${WEBP_DEP_LIBRARIES}) target_include_directories( webp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} PUBLIC $ $) set_target_properties( webp PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/encode.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") # Make sure the OBJECT libraries are built with position independent code (it is # not ON by default). set_target_properties(webpdecode webpdspdecode webputilsdecode webpencode webpdsp webputils PROPERTIES POSITION_INDEPENDENT_CODE ON) configure_pkg_config("src/libwebp.pc") # Build the webp demux library. add_library(webpdemux ${WEBP_DEMUX_SRCS}) target_link_libraries(webpdemux webp) target_include_directories( webpdemux PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} PUBLIC $) set_target_properties( webpdemux PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/decode.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/demux.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h") configure_pkg_config("src/demux/libwebpdemux.pc") set_version(src/Makefile.am webp webp) set_version(src/Makefile.am webpdecoder webpdecoder) set_version(src/demux/Makefile.am webpdemux webpdemux) file(READ ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac CONFIGURE_FILE) string(REGEX MATCH "AC_INIT\\([^\n]*\\[[0-9\\.]+\\]" TMP ${CONFIGURE_FILE}) string(REGEX MATCH "[0-9\\.]+" PROJECT_VERSION ${TMP}) # Define the libraries to install. list(APPEND INSTALLED_LIBRARIES webpdecoder webp webpdemux) # Deal with SIMD. Change the compile flags for SIMD files we use. list(LENGTH WEBP_SIMD_FILES_TO_INCLUDE WEBP_SIMD_FILES_TO_INCLUDE_LENGTH) math(EXPR WEBP_SIMD_FILES_TO_INCLUDE_RANGE "${WEBP_SIMD_FILES_TO_INCLUDE_LENGTH}-1") foreach(I_FILE RANGE ${WEBP_SIMD_FILES_TO_INCLUDE_RANGE}) list(GET WEBP_SIMD_FILES_TO_INCLUDE ${I_FILE} FILE) list(GET WEBP_SIMD_FLAGS_TO_INCLUDE ${I_FILE} SIMD_COMPILE_FLAG) set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS ${SIMD_COMPILE_FLAG}) endforeach() if(NOT WEBP_BUILD_LIBWEBPMUX) set(WEBP_BUILD_GIF2WEBP OFF) set(WEBP_BUILD_IMG2WEBP OFF) set(WEBP_BUILD_WEBPMUX OFF) endif() if(WEBP_BUILD_GIF2WEBP AND NOT GIF_FOUND) set(WEBP_BUILD_GIF2WEBP OFF) endif() if(WEBP_BUILD_ANIM_UTILS AND NOT GIF_FOUND) set(WEBP_BUILD_ANIM_UTILS OFF) endif() # Build the executables if asked for. if(WEBP_BUILD_ANIM_UTILS OR WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR WEBP_BUILD_EXTRAS OR WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP OR WEBP_BUILD_VWEBP OR WEBP_BUILD_WEBPMUX OR WEBP_BUILD_WEBPINFO) # Example utility library. parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "EXAMPLEUTIL_SRCS" "example_util_[^ ]*") list(APPEND EXAMPLEUTIL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h) add_library(exampleutil STATIC ${EXAMPLEUTIL_SRCS}) target_include_directories( exampleutil PUBLIC $) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEIOUTILS_SRCS" "imageio_util_[^ ]*") add_library(imageioutil STATIC ${IMAGEIOUTILS_SRCS}) target_link_libraries(imageioutil webp) target_link_libraries(exampleutil imageioutil) # Image-decoding utility library. parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEDEC_SRCS" "imagedec_[^ ]*") add_library(imagedec STATIC ${IMAGEDEC_SRCS}) target_link_libraries(imagedec imageioutil webpdemux webp ${WEBP_DEP_IMG_LIBRARIES}) # Image-encoding utility library. parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/imageio "IMAGEENC_SRCS" "imageenc_[^ ]*") add_library(imageenc STATIC ${IMAGEENC_SRCS}) target_link_libraries(imageenc imageioutil webp) set_property( TARGET exampleutil imageioutil imagedec imageenc PROPERTY INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src) target_include_directories(imagedec PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS}) target_include_directories(imageenc PRIVATE ${WEBP_DEP_IMG_INCLUDE_DIRS}) endif() if(WEBP_BUILD_DWEBP) # dwebp parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "DWEBP_SRCS" "dwebp") add_executable(dwebp ${DWEBP_SRCS}) target_link_libraries(dwebp exampleutil imagedec imageenc) target_include_directories(dwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) install(TARGETS dwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_CWEBP) # cwebp parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "CWEBP_SRCS" "cwebp") add_executable(cwebp ${CWEBP_SRCS}) target_link_libraries(cwebp exampleutil imagedec webp) target_include_directories(cwebp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}) install(TARGETS cwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_LIBWEBPMUX) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "WEBP_MUX_SRCS" "") add_library(libwebpmux ${WEBP_MUX_SRCS}) target_link_libraries(libwebpmux webp) target_include_directories(libwebpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) set_version(src/mux/Makefile.am libwebpmux webpmux) set_target_properties( libwebpmux PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/mux_types.h;\ ${CMAKE_CURRENT_SOURCE_DIR}/src/webp/types.h;") set_target_properties(libwebpmux PROPERTIES OUTPUT_NAME webpmux) list(APPEND INSTALLED_LIBRARIES libwebpmux) configure_pkg_config("src/mux/libwebpmux.pc") endif() if(WEBP_BUILD_GIF2WEBP) # gif2webp include_directories(${WEBP_DEP_GIF_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "GIF2WEBP_SRCS" "gif2webp") add_executable(gif2webp ${GIF2WEBP_SRCS}) target_link_libraries(gif2webp exampleutil imageioutil webp libwebpmux ${WEBP_DEP_GIF_LIBRARIES}) target_include_directories(gif2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) install(TARGETS gif2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_IMG2WEBP) # img2webp include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "IMG2WEBP_SRCS" "img2webp") add_executable(img2webp ${IMG2WEBP_SRCS}) target_link_libraries(img2webp exampleutil imagedec imageioutil webp libwebpmux) target_include_directories(img2webp PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}) install(TARGETS img2webp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_VWEBP) # vwebp find_package(GLUT) if(GLUT_FOUND) include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "VWEBP_SRCS" "vwebp") add_executable(vwebp ${VWEBP_SRCS}) target_link_libraries( vwebp ${OPENGL_LIBRARIES} exampleutil GLUT::GLUT imageioutil webp webpdemux) target_include_directories( vwebp PRIVATE ${GLUT_INCLUDE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${OPENGL_INCLUDE_DIR}) install(TARGETS vwebp RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") check_c_compiler_flag("-Wno-deprecated-declarations" HAS_NO_DEPRECATED) if(HAS_NO_DEPRECATED) target_compile_options(vwebp PRIVATE "-Wno-deprecated-declarations") endif() endif() endif() endif() if(WEBP_BUILD_WEBPINFO) # webpinfo include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPINFO_SRCS" "webpinfo") add_executable(webpinfo ${WEBPINFO_SRCS}) target_link_libraries(webpinfo exampleutil imageioutil) target_include_directories(webpinfo PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src) install(TARGETS webpinfo RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_WEBPMUX) # webpmux parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "WEBPMUX_SRCS" "webpmux") add_executable(webpmux ${WEBPMUX_SRCS}) target_link_libraries(webpmux exampleutil imageioutil libwebpmux webp) target_include_directories(webpmux PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) install(TARGETS webpmux RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(WEBP_BUILD_EXTRAS) set(EXTRAS_MAKEFILE "${CMAKE_CURRENT_SOURCE_DIR}/extras") parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_EXTRAS_SRCS" "libwebpextras_la") parse_makefile_am(${EXTRAS_MAKEFILE} "GET_DISTO_SRCS" "get_disto") parse_makefile_am(${EXTRAS_MAKEFILE} "WEBP_QUALITY_SRCS" "webp_quality") parse_makefile_am(${EXTRAS_MAKEFILE} "VWEBP_SDL_SRCS" "vwebp_sdl") # libextras add_library(extras STATIC ${WEBP_EXTRAS_SRCS}) target_include_directories( extras PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) # get_disto add_executable(get_disto ${GET_DISTO_SRCS}) target_link_libraries(get_disto imagedec) target_include_directories(get_disto PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src) # webp_quality add_executable(webp_quality ${WEBP_QUALITY_SRCS}) target_link_libraries(webp_quality exampleutil imagedec extras) target_include_directories(webp_quality PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) # vwebp_sdl find_package(SDL2 QUIET) if(WEBP_BUILD_VWEBP AND SDL2_FOUND) add_executable(vwebp_sdl ${VWEBP_SDL_SRCS}) target_link_libraries(vwebp_sdl ${SDL2_LIBRARIES} imageioutil webp) target_include_directories( vwebp_sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL2_INCLUDE_DIRS}) set(WEBP_HAVE_SDL 1) target_compile_definitions(vwebp_sdl PUBLIC WEBP_HAVE_SDL) set(CMAKE_REQUIRED_INCLUDES "${SDL2_INCLUDE_DIRS}") check_c_source_compiles( " #define SDL_MAIN_HANDLED #include \"SDL.h\" int main(void) { return 0; } " HAVE_JUST_SDL_H) set(CMAKE_REQUIRED_INCLUDES) if(HAVE_JUST_SDL_H) target_compile_definitions(vwebp_sdl PRIVATE WEBP_HAVE_JUST_SDL_H) endif() endif() endif() if(WEBP_BUILD_WEBP_JS) # The default stack size changed from 5MB to 64KB in 3.1.27. See # https://crbug.com/webp/614. if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "3.1.27") # TOTAL_STACK size was renamed to STACK_SIZE in 3.1.27. The old name was # kept for compatibility, but prefer the new one in case it is removed in # the future. set(emscripten_stack_size "-sSTACK_SIZE=5MB") else() set(emscripten_stack_size "-sTOTAL_STACK=5MB") endif() find_package(SDL2 REQUIRED) # wasm2js does not support SIMD. if(NOT WEBP_ENABLE_SIMD) # JavaScript version add_executable(webp_js ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c) target_link_libraries(webp_js webpdecoder SDL2) target_include_directories(webp_js PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) set(WEBP_HAVE_SDL 1) set_target_properties( webp_js PROPERTIES # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at # compile time to ensure the headers are downloaded. COMPILE_OPTIONS "${SDL2_LIBRARIES}" LINK_FLAGS "-sWASM=0 ${emscripten_stack_size} \ -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \ -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \ -sALLOW_MEMORY_GROWTH") set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp) target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL) endif() # WASM version add_executable(webp_wasm ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c) target_link_libraries(webp_wasm webpdecoder SDL2) target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) set_target_properties( webp_wasm PROPERTIES # Emscripten puts -sUSE_SDL2=1 in this variable, though it's needed at # compile time to ensure the headers are downloaded. COMPILE_OPTIONS "${SDL2_LIBRARIES}" LINK_FLAGS "-sWASM=1 ${emscripten_stack_size} \ -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \ -sEXPORTED_RUNTIME_METHODS=cwrap ${SDL2_LIBRARIES} \ -sALLOW_MEMORY_GROWTH") target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL) target_compile_definitions(webpdspdecode PUBLIC EMSCRIPTEN) endif() if(WEBP_BUILD_ANIM_UTILS) # anim_diff include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DIFF_SRCS" "anim_diff") add_executable(anim_diff ${ANIM_DIFF_SRCS}) target_link_libraries( anim_diff exampleutil imagedec imageenc imageioutil webp webpdemux ${WEBP_DEP_GIF_LIBRARIES}) target_include_directories(anim_diff PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) # anim_dump include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS} ${WEBP_DEP_GIF_INCLUDE_DIRS}) parse_makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/examples "ANIM_DUMP_SRCS" "anim_dump") add_executable(anim_dump ${ANIM_DUMP_SRCS}) target_link_libraries( anim_dump exampleutil imagedec imageenc imageioutil webp webpdemux ${WEBP_DEP_GIF_LIBRARIES}) target_include_directories(anim_dump PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src) endif() # Install the different headers and libraries. install( TARGETS ${INSTALLED_LIBRARIES} EXPORT ${PROJECT_NAME}Targets PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/webp INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) set(ConfigPackageLocation ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/cmake/) install(EXPORT ${PROJECT_NAME}Targets NAMESPACE ${PROJECT_NAME}:: DESTINATION ${ConfigPackageLocation}) # Create the CMake version file. include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake" VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion) # Create the Config file. include(CMakePackageConfigHelpers) # Fix libwebpmux reference. The target name libwebpmux is used for compatibility # purposes, but the library mentioned in WebPConfig.cmake should be the # unprefixed version. Note string(...) can be replaced with list(TRANSFORM ...) # if cmake_minimum_required is >= 3.12. string(REGEX REPLACE "libwebpmux" "webpmux" INSTALLED_LIBRARIES "${INSTALLED_LIBRARIES}") if(MSVC) # For compatibility with nmake, MSVC builds use a custom prefix (lib) that # needs to be included in the library name. string(REGEX REPLACE "[A-Za-z0-9_]+" "${CMAKE_STATIC_LIBRARY_PREFIX}\\0" INSTALLED_LIBRARIES "${INSTALLED_LIBRARIES}") endif() configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/WebPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake INSTALL_DESTINATION ${ConfigPackageLocation} PATH_VARS CMAKE_INSTALL_INCLUDEDIR) # Install the generated CMake files. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/WebPConfigVersion.cmake" "${CMAKE_CURRENT_BINARY_DIR}/WebPConfig.cmake" DESTINATION ${ConfigPackageLocation}) # Install the man pages. set(MAN_PAGES cwebp.1 dwebp.1 gif2webp.1 img2webp.1 vwebp.1 webpmux.1 webpinfo.1) set(EXEC_BUILDS "CWEBP" "DWEBP" "GIF2WEBP" "IMG2WEBP" "VWEBP" "WEBPMUX" "WEBPINFO") list(LENGTH MAN_PAGES MAN_PAGES_LENGTH) math(EXPR MAN_PAGES_RANGE "${MAN_PAGES_LENGTH} - 1") foreach(I_MAN RANGE ${MAN_PAGES_RANGE}) list(GET EXEC_BUILDS ${I_MAN} EXEC_BUILD) if(WEBP_BUILD_${EXEC_BUILD}) list(GET MAN_PAGES ${I_MAN} MAN_PAGE) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/man/${MAN_PAGE} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) endif() endforeach() libwebp-1.4.0/gradlew.bat0000644000014400001440000000557614606317060012205 0ustar @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega libwebp-1.4.0/depcomp0000755000014400001440000005602014606317244011437 0ustar #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program 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 General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libwebp-1.4.0/Makefile.in0000644000014400001440000006426414606317243012137 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_EXTRAS_TRUE@am__append_1 = extras subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = sharpyuv src imageio man extras examples am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/src/webp/config.h.in AUTHORS COPYING ChangeLog \ NEWS README.md ar-lib compile config.guess config.sub \ install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = sharpyuv src imageio man $(am__append_1) examples EXTRA_DIST = COPYING autogen.sh all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): src/webp/config.h: src/webp/stamp-h1 @test -f $@ || rm -f src/webp/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/webp/stamp-h1 src/webp/stamp-h1: $(top_srcdir)/src/webp/config.h.in $(top_builddir)/config.status @rm -f src/webp/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/webp/config.h $(top_srcdir)/src/webp/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f src/webp/stamp-h1 touch $@ distclean-hdr: -rm -f src/webp/config.h src/webp/stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip dist-zstd distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/COPYING0000644000014400001440000000273014606317060011110 0ustar Copyright (c) 2010, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libwebp-1.4.0/infra/0000755000014400001440000000000014606317060011152 5ustar libwebp-1.4.0/infra/compile_js.sh0000755000014400001440000000516714606317060013646 0ustar #!/bin/bash # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -ex readonly WORKSPACE="${WORKSPACE:-"$(mktemp -d -t webp.js.XXX)"}" readonly BUILD_DIR="${WORKSPACE}/webp_js/" readonly LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")" # shellcheck source=infra/common.sh source "${LIBWEBP_ROOT}/infra/common.sh" usage() { cat << EOF Usage: $(basename "$0") Environment variables: WORKSPACE directory where the build is done EMSDK_DIR directory where emsdk is installed EOF } [[ -d "${EMSDK_DIR:?Not defined}" ]] \ || (log_err "${EMSDK_DIR} is not a valid directory." && exit 1) # shellcheck source=/opt/emsdk/emsdk_env.sh source "${EMSDK_DIR}/emsdk_env.sh" readonly EMSCRIPTEN=${EMSCRIPTEN:-"${EMSDK}/upstream/emscripten"} readonly \ EMSCRIPTEN_CMAKE_FILE="${EMSCRIPTEN}/cmake/Modules/Platform/Emscripten.cmake" make_build_dir "${BUILD_DIR}" pushd "${BUILD_DIR}" opts=("-GUnix Makefiles" "-DWEBP_BUILD_WEBP_JS=ON") if [[ -z "$(command -v emcmake)" ]]; then opts+=("-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_CMAKE_FILE}") cmake \ "${opts[@]}" \ "${LIBWEBP_ROOT}" make -j else emcmake cmake \ "${opts[@]}" \ "${LIBWEBP_ROOT}" emmake make -j fi popd libwebp-1.4.0/infra/compile_android.sh0000755000014400001440000001432514606317060014646 0ustar #!/bin/bash # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -xe LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")" readonly LIBWEBP_ROOT readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.android.XXX)"} # shellcheck source=infra/common.sh source "${LIBWEBP_ROOT}/infra/common.sh" usage() { cat << EOF Usage: $(basename "$0") BUILD_TYPE APP_ABI Options: BUILD_TYPE supported build types: static static-debug shared shared-debug APP_ABI supported application binary interfaces: armeabi-v7a arm64-v8a x86 x86_64 Environment variables: WORKSPACE directory where the build is done. ANDROID_NDK_DIR directory where the android ndk tools are. EOF } ################################################################################ echo "Building libwebp for Android in ${WORKSPACE}" if [[ ! -d "${WORKSPACE}" ]]; then log_err "${WORKSPACE} directory does not exist." exit 1 fi readonly BUILD_TYPE=${1:?"BUILD_TYPE is not defined.$( echo usage )"} readonly APP_ABI=${2:?"APP_ABI not defined.$( echo usage )"} readonly ANDROID_NDK_DIR=${ANDROID_NDK_DIR:?"ANDROID_NDK_DIR is not defined.$( echo usage )"} readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}" readonly STANDALONE_ANDROID_DIR="${WORKSPACE}/android" if [[ ! -x "${ANDROID_NDK_DIR}/ndk-build" ]]; then log_err "unable to find ndk-build in ANDROID_NDK_DIR: ${ANDROID_NDK_DIR}." exit 1 fi CFLAGS= LDFLAGS= opts=() case "${BUILD_TYPE}" in *debug) readonly APP_OPTIM="debug" CFLAGS="-O0 -g" opts+=("--enable-asserts") ;; static* | shared*) readonly APP_OPTIM="release" CFLAGS="-O2 -g" ;; *) usage exit 1 ;; esac case "${BUILD_TYPE}" in shared*) readonly SHARED="1" ;; *) readonly SHARED="0" CFLAGS="${CFLAGS} -fPIE" LDFLAGS="${LDFLAGS} -Wl,-pie" opts+=("--disable-shared") ;; esac # Create a fresh build directory make_build_dir "${BUILD_DIR}" cd "${BUILD_DIR}" ln -s "${LIBWEBP_ROOT}" jni "${ANDROID_NDK_DIR}/ndk-build" -j2 \ APP_ABI="${APP_ABI}" \ APP_OPTIM="${APP_OPTIM}" \ ENABLE_SHARED="${SHARED}" cd "${LIBWEBP_ROOT}" ./autogen.sh case "${APP_ABI}" in armeabi*) arch="arm" ;; arm64*) arch="arm64" ;; *) arch="${APP_ABI}" ;; esac # TODO(b/185520507): remove this and use the binaries from # toolchains/llvm/prebuilt/ directly. rm -rf "${STANDALONE_ANDROID_DIR}" "${ANDROID_NDK_DIR}/build/tools/make_standalone_toolchain.py" \ --api 24 --arch "${arch}" --stl gnustl --install-dir \ "${STANDALONE_ANDROID_DIR}" export PATH="${STANDALONE_ANDROID_DIR}/bin:${PATH}" rm -rf "${BUILD_DIR}" make_build_dir "${BUILD_DIR}" cd "${BUILD_DIR}" case "${arch}" in arm) host="arm-linux-androideabi" case "${APP_ABI}" in armeabi) ;; armeabi-v7a) CFLAGS="${CFLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp" ;; *) ;; # No configuration needed esac ;; arm64) host="aarch64-linux-android" ;; x86) host="i686-linux-android" ;; x86_64) host="x86_64-linux-android" ;; *) ;; # Skip configuration esac setup_ccache CC="clang" "${LIBWEBP_ROOT}/configure" --host "${host}" --build \ "$("${LIBWEBP_ROOT}/config.guess")" CC="${CC}" CFLAGS="${CFLAGS}" \ LDFLAGS="${LDFLAGS}" "${opts[@]}" make -j if [[ "${GERRIT_REFSPEC:-}" = "refs/heads/portable-intrinsics" ]] \ || [[ "${GERRIT_BRANCH:-}" = "portable-intrinsics" ]]; then cd "${WORKSPACE}" rm -rf build && mkdir build cd build standalone="${WORKSPACE}/android" cmake ../libwebp \ -DWEBP_BUILD_DWEBP=1 \ -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ -DCMAKE_C_FLAGS=-fPIE \ -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ -DCMAKE_BUILD_TYPE=Release \ -DWEBP_ENABLE_WASM=1 make -j2 cd "${WORKSPACE}" make_build_dir "${BUILD_DIR}" cd "${BUILD_DIR}" case "${APP_ABI}" in armeabi-v7a | arm64*) cmake "${LIBWEBP_ROOT}" \ -DWEBP_BUILD_DWEBP=1 \ -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ -DCMAKE_C_FLAGS='-fPIE -DENABLE_NEON_BUILTIN_MULHI_INT16X8' \ -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ -DCMAKE_BUILD_TYPE=Release \ -DWEBP_ENABLE_WASM=1 make -j2 ;; x86*) cmake "${LIBWEBP_ROOT}" \ -DWEBP_BUILD_DWEBP=1 \ -DCMAKE_C_COMPILER="${standalone}/bin/clang" \ -DCMAKE_PREFIX_PATH="${standalone}/sysroot/usr/lib" \ -DCMAKE_C_FLAGS='-fPIE -DENABLE_X86_BUILTIN_MULHI_INT16X8' \ -DCMAKE_EXE_LINKER_FLAGS=-Wl,-pie \ -DCMAKE_BUILD_TYPE=Release \ -DWEBP_ENABLE_WASM=1 make -j2 ;; *) log_err "APP_ABI not supported." exit 1 ;; esac fi libwebp-1.4.0/infra/common.sh0000644000014400001440000000704114606317060013000 0ustar # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. log_err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2 } ####################################### # Create build directory. Build directory will be deleted if it exists. # Arguments: # None. # Returns: # mkdir result. ####################################### make_build_dir() { if [[ "$#" -ne 1 ]]; then return 1 fi local build_dir build_dir="$1" rm -rf "${build_dir}" mkdir -p "${build_dir}" } ####################################### # Cleanup files from the build directory. # Globals: # LIBWEBP_ROOT repository's root path. # Arguments: # $1 build directory. ####################################### cleanup() { # $1 is not completely removed to allow for binary artifacts to be # extracted. find "${1:?"Build directory not defined"}" \ \( -name "*.[ao]" -o -name "*.l[ao]" \) -exec rm -f {} + } ####################################### # Setup ccache for toolchain. # Globals: # PATH # Arguments: # None. ####################################### setup_ccache() { if [[ -x "$(command -v ccache)" ]]; then export CCACHE_CPP2=yes export PATH="/usr/lib/ccache:${PATH}" fi } ####################################### # Detects whether test block should be run in the current test shard. # Globals: # TEST_TOTAL_SHARDS: Valid range: [1, N]. Defaults to 1. # TEST_SHARD_INDEX: Valid range: [0, TEST_TOTAL_SHARDS). Defaults to 0. # libwebp_test_id: current test number; incremented with each call. # Arguments: # None # Returns: # true if the shard is active # false if the shard is inactive ####################################### shard_should_run() { TEST_TOTAL_SHARDS=${TEST_TOTAL_SHARDS:=1} TEST_SHARD_INDEX=${TEST_SHARD_INDEX:=0} libwebp_test_id=${libwebp_test_id:=-1} : $((libwebp_test_id += 1)) if [[ "${TEST_SHARD_INDEX}" -lt 0 || "${TEST_SHARD_INDEX}" -ge "${TEST_TOTAL_SHARDS}" ]]; then log_err "Invalid TEST_SHARD_INDEX (${TEST_SHARD_INDEX})!" \ "Expected [0, ${TEST_TOTAL_SHARDS})." fi [[ "$((libwebp_test_id % TEST_TOTAL_SHARDS))" -eq "${TEST_SHARD_INDEX}" ]] } libwebp-1.4.0/infra/run_static_analysis.sh0000755000014400001440000000606614606317060015577 0ustar #!/bin/bash # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -xe LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")" readonly LIBWEBP_ROOT readonly WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.scanbuild.XXX)"} # shellcheck source=infra/common.sh source "${LIBWEBP_ROOT}/infra/common.sh" usage() { cat << EOF Usage: $(basename "$0") MODE Options: MODE supported scan modes: (shallow|deep) Environment variables: WORKSPACE directory where the build is done. EOF } ####################################### # Wrap clang-tools scan-build. # Globals: # OUTPUT_DIR target directory where scan-build report is generated. # MODE scan-build mode # Arguments: # $* scan-build additional args. # Returns: # scan-build retcode ####################################### scan_build() { scan-build -o "${OUTPUT_DIR}" --use-analyzer="$(command -v clang)" \ -analyzer-config mode="${MODE}" "$*" } MODE=${1:?"MODE is not specified.$( echo usage )"} readonly OUTPUT_DIR="${WORKSPACE}/output-${MODE}" readonly BUILD_DIR="${WORKSPACE}/build" make_build_dir "${OUTPUT_DIR}" make_build_dir "${BUILD_DIR}" cd "${LIBWEBP_ROOT}" ./autogen.sh cd "${BUILD_DIR}" grep -m 1 -q 'enable-asserts' "${LIBWEBP_ROOT}/configure.ac" \ && args='--enable-asserts' scan_build "${LIBWEBP_ROOT}/configure" --enable-everything "${args}" scan_build make -j4 index="$(find "${OUTPUT_DIR}" -name index.html)" if [[ -f "${index}" ]]; then mv "$(dirname "${index}")/"* "${OUTPUT_DIR}" else # make a empty report to wipe out any old bug reports. cat << EOT > "${OUTPUT_DIR}/index.html" No bugs reported. EOT fi libwebp-1.4.0/infra/compile.sh0000755000014400001440000002677614606317060013163 0ustar #!/bin/bash # Copyright (c) 2021, Google Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # * Neither the name of Google nor the names of its contributors may # be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -xe LIBWEBP_ROOT="$(realpath "$(dirname "$0")/..")" WORKSPACE=${WORKSPACE:-"$(mktemp -d -t webp.XXX)"} # shellcheck source=infra/common.sh source "${LIBWEBP_ROOT}/infra/common.sh" usage() { cat << EOF Usage: compile.sh BUILD_TYPE TARGET Options: BUILD_TYPE supported build type: (shared, static, static-debug) TARGET supported target platforms: aarch64-linux-clang aarch64-linux-gnu arm-linux-gnueabi arm-neon-linux-gnueabi cmake cmake-aarch64 cmake-arm cmake-clang disable-near-lossless disable-sse4.1 disable-stats force-aligned-32 force-aligned-64 gradle i686-linux-asan i686-linux-clang i686-linux-gnu i686-w64-mingw32 mips2el-linux-gnu mips32dspr2el-linux-gnu mips32eb-linux-gnu mips32el-linux-gnu mips32r2el-linux-gnu mips32r5el-linux-gnu mips64r2el-linux-gnu mips64r6el-linux-gnu native reduce-csp reduce-size reduce-size-disable-stats visibility-default-gnu visibility-hidden-clang visibility-hidden-gnu wasm x86_64-linux-clang x86_64-linux-gnu x86_64-linux-msan x86_64-w64-mingw32 Environment variables: WORKSPACE directory where the build is done EOF } ################################################################################ echo "Building libwebp in ${WORKSPACE}" if [[ ! -d "${WORKSPACE}" ]]; then log_err "${WORKSPACE} directory does not exist" exit 1 fi BUILD_TYPE=${1:?"Build type not defined.$( echo usage )"} TARGET=${2:?"Target not defined.$( echo usage )"} readonly BUILD_DIR="${WORKSPACE}/build-${BUILD_TYPE}" trap 'cleanup ${BUILD_DIR}' EXIT make_build_dir "${BUILD_DIR}" config_flags=() case "${BUILD_TYPE}" in shared*) ;; # Valid BUILD_TYPE but no setup required static*) config_flags+=("--disable-shared") ;; experimental) config_flags+=("--enable-experimental") ;; *) log_err "Invalid BUILD_TYPE" usage exit 1 ;; esac if grep -m 1 -q "enable-asserts" "${LIBWEBP_ROOT}/configure.ac"; then config_flags+=("--enable-asserts") fi case "${TARGET}" in aarch64-linux-clang) TARGET="aarch64-linux-gnu" CC="clang" CC="${CC} --target=aarch64-linux-gnu" export CC export CFLAGS="-isystem /usr/aarch64-linux-gnu/include" ;; arm-linux-gnueabi) export CFLAGS="-O3 -march=armv7-a -mfloat-abi=softfp -ftree-vectorize" ;; arm-neon-linux-gnueabi) TARGET="arm-linux-gnueabi" CFLAGS="-O3 -march=armv7-a -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" export CFLAGS ;; mips2el-linux-gnu) export CFLAGS="-EL -O2 -mips2" TARGET="mipsel-linux-gnu" ;; mips32el-linux-gnu) export CFLAGS="-EL -O2 -mips32" TARGET="mipsel-linux-gnu" ;; mips32r2el-linux-gnu) export CFLAGS="-EL -O2 -mips32r2" TARGET="mipsel-linux-gnu" ;; mips32dspr2el-linux-gnu) export CFLAGS="-EL -O2 -mdspr2" TARGET="mipsel-linux-gnu" ;; mips32r5el-linux-gnu) export CFLAGS="-EL -O2 -mips32r5 -mmsa" TARGET="mipsel-linux-gnu" ;; mips32eb-linux-gnu) export CFLAGS="-EB -O2 -mips32" TARGET="mips-linux-gnu" ;; mips64r2el-linux-gnu) export CFLAGS="-EL -O2 -mips64r2 -mabi=64" TARGET="mips64el-linux-gnuabi64" ;; mips64r6el-linux-gnu) export CFLAGS="-EL -O2 -mips64r6 -mabi=64 -mmsa" TARGET="mips-img-linux-gnu" ;; i686-linux-gnu) export CC="gcc -m32" ;; i686-linux-clang) TARGET="i686-linux-gnu" export CC="clang -m32" ;; i686-linux-asan) TARGET="i686-linux-gnu" export CC="clang -m32 -fsanitize=address" ;; i686-linux-msan) TARGET="i686-linux-gnu" export CC="clang -m32 -fsanitize=memory" ;; x86_64-linux-clang) TARGET="x86_64-linux-gnu" export CC=clang ;; x86_64-linux-msan) TARGET="x86_64-linux-gnu" export CC="clang -fsanitize=memory" ;; force-aligned-32) config_flags+=("--enable-aligned") TARGET="i686-linux-gnu" export CC="gcc -m32" ;; force-aligned-64) config_flags+=("--enable-aligned") TARGET="x86_64-linux-gnu" ;; visibility-default-*) export CFLAGS="-O2 -g -fvisibility=default" TARGET="x86_64-linux-gnu" ;; visibility-hidden-*) export CFLAGS="-O2 -g -fvisibility=hidden" if [[ "${TARGET}" = "visibility-hidden-clang" ]]; then export CC=clang fi TARGET="x86_64-linux-gnu" ;; disable-sse4.1) grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0 config_flags+=("--${TARGET}") TARGET="x86_64-linux-gnu" ;; disable-near-lossless) grep "${TARGET}" "${LIBWEBP_ROOT}/configure.ac" || exit 0 config_flags+=("--${TARGET}") TARGET="x86_64-linux-gnu" ;; disable-stats) git -C "${LIBWEBP_ROOT}" grep WEBP_DISABLE_STATS || exit 0 export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS" TARGET="x86_64-linux-gnu" ;; reduce-size) git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_SIZE || exit 0 export CFLAGS="-O2 -g -DWEBP_REDUCE_SIZE" TARGET="x86_64-linux-gnu" ;; reduce-size-disable-stats) git -C "${LIBWEBP_ROOT}" grep -e WEBP_DISABLE_STATS -e WEBP_REDUCE_SIZE \ || exit 0 export CFLAGS="-O2 -g -DWEBP_DISABLE_STATS -DWEBP_REDUCE_SIZE" TARGET="x86_64-linux-gnu" ;; reduce-csp) git -C "${LIBWEBP_ROOT}" grep WEBP_REDUCE_CSP || exit 0 export CFLAGS="-O2 -g -DWEBP_REDUCE_CSP" TARGET="x86_64-linux-gnu" ;; x86_64-linux-gnu | *mingw32 | aarch64*) ;; # Default target configuration # non-configure based builds native) setup_ccache # exercise makefile.unix then quit make -C "${LIBWEBP_ROOT}" -f makefile.unix -j all for tgt in extras examples/anim_diff; do grep -q -m 1 "${tgt}" "${LIBWEBP_ROOT}/makefile.unix" \ && make -C "${LIBWEBP_ROOT}" -f makefile.unix -j "${tgt}" done [[ -d "${LIBWEBP_ROOT}/tests/fuzzer" ]] \ && make -j -C "${LIBWEBP_ROOT}/tests/fuzzer" -f makefile.unix exit 0 ;; cmake*) setup_ccache # exercise cmake then quit opts=() case "${TARGET}" in cmake-clang) opts+=("-DCMAKE_C_COMPILER=clang") ;; cmake-arm) opts+=("-DCMAKE_C_COMPILER=arm-linux-gnueabi-gcc") case "${GERRIT_BRANCH:-}" in portable-intrinsics | 0.6.1) exit 0 ;; *) ;; # Skip configuration esac ;; cmake-aarch64) opts+=("-DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc") case "${GERRIT_BRANCH:-}" in portable-intrinsics | 0.6.1) exit 0 ;; *) ;; # Skip configuration esac ;; *) ;; # Skip configuration esac case "${BUILD_TYPE}" in static*) opts+=("-DBUILD_SHARED_LIBS=OFF") ;; experimental) opts+=("-DWEBP_EXPERIMENTAL_FEATURES=ON" "-DBUILD_SHARED_LIBS=ON") ;; *) opts+=("-DBUILD_SHARED_LIBS=ON") ;; esac case "${BUILD_TYPE}" in *debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;; *) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;; esac cd "${BUILD_DIR}" opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON") grep -m 1 -q WEBP_BUILD_GIF2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \ && opts+=("-DWEBP_BUILD_GIF2WEBP=ON") grep -m 1 -q WEBP_BUILD_IMG2WEBP "${LIBWEBP_ROOT}/CMakeLists.txt" \ && opts+=("-DWEBP_BUILD_IMG2WEBP=ON") cmake "${opts[@]}" "${LIBWEBP_ROOT}" make VERBOSE=1 -j case "${BUILD_TYPE}" in static) mkdir -p examples cp [cd]webp examples ;; *) ;; # Skip configuration. esac grep "install" "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0 make DESTDIR="${BUILD_DIR}/webp-install" install/strip mkdir tmp cd tmp cat > CMakeLists.txt << EOF cmake_minimum_required(VERSION 2.8.7) project(libwebp C) find_package(WebP) if (NOT WebP_FOUND) message(FATAL_ERROR "WebP package not found") endif () message("WebP_FOUND: \${WebP_FOUND}") message("WebP_INCLUDE_DIRS: \${WebP_INCLUDE_DIRS}") message("WebP_LIBRARIES: \${WebP_LIBRARIES}") message("WEBP_INCLUDE_DIRS: \${WEBP_INCLUDE_DIRS}") message("WEBP_LIBRARIES: \${WEBP_LIBRARIES}") EOF cmake . "${opts[@]}" \ "-DCMAKE_PREFIX_PATH=${BUILD_DIR}/webp-install/usr/local" exit 0 ;; gradle) setup_ccache # exercise gradle then quit [[ -f "${LIBWEBP_ROOT}/gradlew" ]] || exit 0 cd "${BUILD_DIR}" # TODO -g / --gradle-user-home could be used if there's a race between jobs "${LIBWEBP_ROOT}/gradlew" -p "${LIBWEBP_ROOT}" buildAllExecutables exit 0 ;; wasm) grep -m 1 -q WEBP_ENABLE_WASM "${LIBWEBP_ROOT}/CMakeLists.txt" || exit 0 opts+=("-DCMAKE_C_COMPILER=clang" "-DWEBP_ENABLE_WASM=ON") opts+=("-DWEBP_BUILD_CWEBP=ON" "-DWEBP_BUILD_DWEBP=ON") case "${BUILD_TYPE}" in *debug) opts+=("-DCMAKE_BUILD_TYPE=Debug") ;; *) opts+=("-DCMAKE_BUILD_TYPE=RelWithDebInfo") ;; esac cd "${BUILD_DIR}" cmake "${opts[@]}" "${LIBWEBP_ROOT}" make VERBOSE=1 -j mkdir examples case "${BUILD_TYPE}" in static) mkdir -p examples cp [cd]webp examples ;; *) ;; # Skip configuration esac exit 0 ;; *) log_err "Invalid TARGET" usage exit 1 ;; esac case "${TARGET}" in *mingw32) ;; # Skip configuration *) case "${TARGET}-${CC}" in static-debug-gcc* | static-debug-) CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0 -g" CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage -O0 -g" export CFLAGS CXXFLAGS ;; *) ;; # This case should not be reached. esac ;; esac setup_ccache cd "${LIBWEBP_ROOT}" ./autogen.sh cd "${BUILD_DIR}" "${LIBWEBP_ROOT}/configure" \ --host "${TARGET}" --build "$("${LIBWEBP_ROOT}/config.guess")" \ --enable-everything "${config_flags[@]}" make -j V=1 libwebp-1.4.0/iosbuild.sh0000755000014400001440000001323614606317060012231 0ustar #!/bin/bash # # This script generates 'WebP.framework' and 'WebPDecoder.framework', # 'WebPDemux.framework' and 'WebPMux.framework'. # An iOS app can decode WebP images by including 'WebPDecoder.framework' and # both encode and decode WebP images by including 'WebP.framework'. # # Run ./iosbuild.sh to generate the frameworks under the current directory # (the previous build will be erased if it exists). # # This script is inspired by the build script written by Carson McDonald. # (https://www.ioncannon.net/programming/1483/using-webp-to-reduce-native-ios-app-size/). set -e # Set this variable based on the desired minimum deployment target. readonly IOS_MIN_VERSION=6.0 # Extract the latest SDK version from the final field of the form: iphoneosX.Y readonly SDK=$(xcodebuild -showsdks \ | grep iphoneos | sort | tail -n 1 | awk '{print substr($NF, 9)}' ) # Extract Xcode version. readonly XCODE=$(xcodebuild -version | grep Xcode | cut -d " " -f2) if [[ -z "${XCODE}" ]]; then echo "Xcode not available" exit 1 fi readonly OLDPATH=${PATH} # Add iPhoneOS-V6 to the list of platforms below if you need armv6 support. # Note that iPhoneOS-V6 support is not available with the iOS6 SDK. PLATFORMS="iPhoneSimulator iPhoneSimulator64" PLATFORMS+=" iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-V7-arm64" readonly PLATFORMS readonly SRCDIR=$(dirname $0) readonly TOPDIR=$(pwd) readonly BUILDDIR="${TOPDIR}/iosbuild" readonly TARGETDIR="${TOPDIR}/WebP.framework" readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework" readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework" readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework" readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework" readonly DEVELOPER=$(xcode-select --print-path) readonly PLATFORMSROOT="${DEVELOPER}/Platforms" readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo) LIBLIST='' DECLIBLIST='' MUXLIBLIST='' DEMUXLIBLIST='' if [[ -z "${SDK}" ]]; then echo "iOS SDK not available" exit 1 elif [[ ${SDK%%.*} -gt 8 ]]; then EXTRA_CFLAGS="-fembed-bitcode" elif [[ ${SDK%%.*} -le 6 ]]; then echo "You need iOS SDK version 6.0 or above" exit 1 fi echo "Xcode Version: ${XCODE}" echo "iOS SDK Version: ${SDK}" if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \ || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \ || -e "${SHARPYUVTARGETDIR}" ]]; then cat << EOF WARNING: The following directories will be deleted: WARNING: ${BUILDDIR} WARNING: ${TARGETDIR} WARNING: ${DECTARGETDIR} WARNING: ${MUXTARGETDIR} WARNING: ${DEMUXTARGETDIR} WARNING: ${SHARPYUVTARGETDIR} WARNING: The build will continue in 5 seconds... EOF sleep 5 fi rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \ ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR} mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \ ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \ ${SHARPYUVTARGETDIR}/Headers/ if [[ ! -e ${SRCDIR}/configure ]]; then if ! (cd ${SRCDIR} && sh autogen.sh); then cat << EOF Error creating configure script! This script requires the autoconf/automake and libtool to build. MacPorts can be used to obtain these: https://www.macports.org/install.php EOF exit 1 fi fi for PLATFORM in ${PLATFORMS}; do ARCH2="" if [[ "${PLATFORM}" == "iPhoneOS-V7-arm64" ]]; then PLATFORM="iPhoneOS" ARCH="aarch64" ARCH2="arm64" elif [[ "${PLATFORM}" == "iPhoneOS-V7s" ]]; then PLATFORM="iPhoneOS" ARCH="armv7s" elif [[ "${PLATFORM}" == "iPhoneOS-V7" ]]; then PLATFORM="iPhoneOS" ARCH="armv7" elif [[ "${PLATFORM}" == "iPhoneOS-V6" ]]; then PLATFORM="iPhoneOS" ARCH="armv6" elif [[ "${PLATFORM}" == "iPhoneSimulator64" ]]; then PLATFORM="iPhoneSimulator" ARCH="x86_64" else ARCH="i386" fi ROOTDIR="${BUILDDIR}/${PLATFORM}-${SDK}-${ARCH}" mkdir -p "${ROOTDIR}" DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain" SDKROOT="${PLATFORMSROOT}/" SDKROOT+="${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDK}.sdk/" CFLAGS="-arch ${ARCH2:-${ARCH}} -pipe -isysroot ${SDKROOT} -O3 -DNDEBUG" CFLAGS+=" -miphoneos-version-min=${IOS_MIN_VERSION} ${EXTRA_CFLAGS}" set -x export PATH="${DEVROOT}/usr/bin:${OLDPATH}" ${SRCDIR}/configure --host=${ARCH}-apple-darwin --prefix=${ROOTDIR} \ --build=$(${SRCDIR}/config.guess) \ --disable-shared --enable-static \ --enable-libwebpdecoder --enable-swap-16bit-csp \ --enable-libwebpmux \ CFLAGS="${CFLAGS}" set +x # Build only the libraries, skip the examples. make V=0 -C sharpyuv install make V=0 -C src install LIBLIST+=" ${ROOTDIR}/lib/libwebp.a" DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a" MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a" DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a" SHARPYUVLIBLIST+=" ${ROOTDIR}/lib/libsharpyuv.a" make clean export PATH=${OLDPATH} done echo "LIBLIST = ${LIBLIST}" cp -a ${SRCDIR}/src/webp/{decode,encode,types}.h ${TARGETDIR}/Headers/ ${LIPO} -create ${LIBLIST} -output ${TARGETDIR}/WebP echo "DECLIBLIST = ${DECLIBLIST}" cp -a ${SRCDIR}/src/webp/{decode,types}.h ${DECTARGETDIR}/Headers/ ${LIPO} -create ${DECLIBLIST} -output ${DECTARGETDIR}/WebPDecoder echo "MUXLIBLIST = ${MUXLIBLIST}" cp -a ${SRCDIR}/src/webp/{types,mux,mux_types}.h \ ${MUXTARGETDIR}/Headers/ ${LIPO} -create ${MUXLIBLIST} -output ${MUXTARGETDIR}/WebPMux echo "DEMUXLIBLIST = ${DEMUXLIBLIST}" cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \ ${DEMUXTARGETDIR}/Headers/ ${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux echo "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}" cp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \ ${SHARPYUVTARGETDIR}/Headers/ ${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv echo "SUCCESS" libwebp-1.4.0/sharpyuv/0000755000014400001440000000000014606317244011740 5ustar libwebp-1.4.0/sharpyuv/sharpyuv_csp.c0000644000014400001440000000740114606317060014630 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Colorspace utilities. #include "sharpyuv/sharpyuv_csp.h" #include #include #include static int ToFixed16(float f) { return (int)floor(f * (1 << 16) + 0.5f); } void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space, SharpYuvConversionMatrix* matrix) { const float kr = yuv_color_space->kr; const float kb = yuv_color_space->kb; const float kg = 1.0f - kr - kb; const float cr = 0.5f / (1.0f - kb); const float cb = 0.5f / (1.0f - kr); const int shift = yuv_color_space->bit_depth - 8; const float denom = (float)((1 << yuv_color_space->bit_depth) - 1); float scale_y = 1.0f; float add_y = 0.0f; float scale_u = cr; float scale_v = cb; float add_uv = (float)(128 << shift); assert(yuv_color_space->bit_depth >= 8); if (yuv_color_space->range == kSharpYuvRangeLimited) { scale_y *= (219 << shift) / denom; scale_u *= (224 << shift) / denom; scale_v *= (224 << shift) / denom; add_y = (float)(16 << shift); } matrix->rgb_to_y[0] = ToFixed16(kr * scale_y); matrix->rgb_to_y[1] = ToFixed16(kg * scale_y); matrix->rgb_to_y[2] = ToFixed16(kb * scale_y); matrix->rgb_to_y[3] = ToFixed16(add_y); matrix->rgb_to_u[0] = ToFixed16(-kr * scale_u); matrix->rgb_to_u[1] = ToFixed16(-kg * scale_u); matrix->rgb_to_u[2] = ToFixed16((1 - kb) * scale_u); matrix->rgb_to_u[3] = ToFixed16(add_uv); matrix->rgb_to_v[0] = ToFixed16((1 - kr) * scale_v); matrix->rgb_to_v[1] = ToFixed16(-kg * scale_v); matrix->rgb_to_v[2] = ToFixed16(-kb * scale_v); matrix->rgb_to_v[3] = ToFixed16(add_uv); } // Matrices are in YUV_FIX fixed point precision. // WebP's matrix, similar but not identical to kRec601LimitedMatrix. static const SharpYuvConversionMatrix kWebpMatrix = { {16839, 33059, 6420, 16 << 16}, {-9719, -19081, 28800, 128 << 16}, {28800, -24116, -4684, 128 << 16}, }; // Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeLimited static const SharpYuvConversionMatrix kRec601LimitedMatrix = { {16829, 33039, 6416, 16 << 16}, {-9714, -19071, 28784, 128 << 16}, {28784, -24103, -4681, 128 << 16}, }; // Kr=0.2990f Kb=0.1140f bits=8 range=kSharpYuvRangeFull static const SharpYuvConversionMatrix kRec601FullMatrix = { {19595, 38470, 7471, 0}, {-11058, -21710, 32768, 128 << 16}, {32768, -27439, -5329, 128 << 16}, }; // Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeLimited static const SharpYuvConversionMatrix kRec709LimitedMatrix = { {11966, 40254, 4064, 16 << 16}, {-6596, -22189, 28784, 128 << 16}, {28784, -26145, -2639, 128 << 16}, }; // Kr=0.2126f Kb=0.0722f bits=8 range=kSharpYuvRangeFull static const SharpYuvConversionMatrix kRec709FullMatrix = { {13933, 46871, 4732, 0}, {-7509, -25259, 32768, 128 << 16}, {32768, -29763, -3005, 128 << 16}, }; const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( SharpYuvMatrixType matrix_type) { switch (matrix_type) { case kSharpYuvMatrixWebp: return &kWebpMatrix; case kSharpYuvMatrixRec601Limited: return &kRec601LimitedMatrix; case kSharpYuvMatrixRec601Full: return &kRec601FullMatrix; case kSharpYuvMatrixRec709Limited: return &kRec709LimitedMatrix; case kSharpYuvMatrixRec709Full: return &kRec709FullMatrix; case kSharpYuvMatrixNum: return NULL; } return NULL; } libwebp-1.4.0/sharpyuv/sharpyuv_neon.c0000644000014400001440000001624514606317060015010 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical functions for Sharp YUV. // // Author: Skal (pascal.massimino@gmail.com) #include "sharpyuv/sharpyuv_dsp.h" #if defined(WEBP_USE_NEON) #include #include #include static uint16_t clip_NEON(int v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; } static uint64_t SharpYuvUpdateY_NEON(const uint16_t* ref, const uint16_t* src, uint16_t* dst, int len, int bit_depth) { const int max_y = (1 << bit_depth) - 1; int i; const int16x8_t zero = vdupq_n_s16(0); const int16x8_t max = vdupq_n_s16(max_y); uint64x2_t sum = vdupq_n_u64(0); uint64_t diff; for (i = 0; i + 8 <= len; i += 8) { const int16x8_t A = vreinterpretq_s16_u16(vld1q_u16(ref + i)); const int16x8_t B = vreinterpretq_s16_u16(vld1q_u16(src + i)); const int16x8_t C = vreinterpretq_s16_u16(vld1q_u16(dst + i)); const int16x8_t D = vsubq_s16(A, B); // diff_y const int16x8_t F = vaddq_s16(C, D); // new_y const uint16x8_t H = vreinterpretq_u16_s16(vmaxq_s16(vminq_s16(F, max), zero)); const int16x8_t I = vabsq_s16(D); // abs(diff_y) vst1q_u16(dst + i, H); sum = vpadalq_u32(sum, vpaddlq_u16(vreinterpretq_u16_s16(I))); } diff = vgetq_lane_u64(sum, 0) + vgetq_lane_u64(sum, 1); for (; i < len; ++i) { const int diff_y = ref[i] - src[i]; const int new_y = (int)(dst[i]) + diff_y; dst[i] = clip_NEON(new_y, max_y); diff += (uint64_t)(abs(diff_y)); } return diff; } static void SharpYuvUpdateRGB_NEON(const int16_t* ref, const int16_t* src, int16_t* dst, int len) { int i; for (i = 0; i + 8 <= len; i += 8) { const int16x8_t A = vld1q_s16(ref + i); const int16x8_t B = vld1q_s16(src + i); const int16x8_t C = vld1q_s16(dst + i); const int16x8_t D = vsubq_s16(A, B); // diff_uv const int16x8_t E = vaddq_s16(C, D); // new_uv vst1q_s16(dst + i, E); } for (; i < len; ++i) { const int diff_uv = ref[i] - src[i]; dst[i] += diff_uv; } } static void SharpYuvFilterRow16_NEON(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { const int max_y = (1 << bit_depth) - 1; int i; const int16x8_t max = vdupq_n_s16(max_y); const int16x8_t zero = vdupq_n_s16(0); for (i = 0; i + 8 <= len; i += 8) { const int16x8_t a0 = vld1q_s16(A + i + 0); const int16x8_t a1 = vld1q_s16(A + i + 1); const int16x8_t b0 = vld1q_s16(B + i + 0); const int16x8_t b1 = vld1q_s16(B + i + 1); const int16x8_t a0b1 = vaddq_s16(a0, b1); const int16x8_t a1b0 = vaddq_s16(a1, b0); const int16x8_t a0a1b0b1 = vaddq_s16(a0b1, a1b0); // A0+A1+B0+B1 const int16x8_t a0b1_2 = vaddq_s16(a0b1, a0b1); // 2*(A0+B1) const int16x8_t a1b0_2 = vaddq_s16(a1b0, a1b0); // 2*(A1+B0) const int16x8_t c0 = vshrq_n_s16(vaddq_s16(a0b1_2, a0a1b0b1), 3); const int16x8_t c1 = vshrq_n_s16(vaddq_s16(a1b0_2, a0a1b0b1), 3); const int16x8_t e0 = vrhaddq_s16(c1, a0); const int16x8_t e1 = vrhaddq_s16(c0, a1); const int16x8x2_t f = vzipq_s16(e0, e1); const int16x8_t g0 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 0)); const int16x8_t g1 = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i + 8)); const int16x8_t h0 = vaddq_s16(g0, f.val[0]); const int16x8_t h1 = vaddq_s16(g1, f.val[1]); const int16x8_t i0 = vmaxq_s16(vminq_s16(h0, max), zero); const int16x8_t i1 = vmaxq_s16(vminq_s16(h1, max), zero); vst1q_u16(out + 2 * i + 0, vreinterpretq_u16_s16(i0)); vst1q_u16(out + 2 * i + 8, vreinterpretq_u16_s16(i1)); } for (; i < len; ++i) { const int a0b1 = A[i + 0] + B[i + 1]; const int a1b0 = A[i + 1] + B[i + 0]; const int a0a1b0b1 = a0b1 + a1b0 + 8; const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4; const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4; out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y); out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y); } } static void SharpYuvFilterRow32_NEON(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { const int max_y = (1 << bit_depth) - 1; int i; const uint16x8_t max = vdupq_n_u16(max_y); for (i = 0; i + 4 <= len; i += 4) { const int16x4_t a0 = vld1_s16(A + i + 0); const int16x4_t a1 = vld1_s16(A + i + 1); const int16x4_t b0 = vld1_s16(B + i + 0); const int16x4_t b1 = vld1_s16(B + i + 1); const int32x4_t a0b1 = vaddl_s16(a0, b1); const int32x4_t a1b0 = vaddl_s16(a1, b0); const int32x4_t a0a1b0b1 = vaddq_s32(a0b1, a1b0); // A0+A1+B0+B1 const int32x4_t a0b1_2 = vaddq_s32(a0b1, a0b1); // 2*(A0+B1) const int32x4_t a1b0_2 = vaddq_s32(a1b0, a1b0); // 2*(A1+B0) const int32x4_t c0 = vshrq_n_s32(vaddq_s32(a0b1_2, a0a1b0b1), 3); const int32x4_t c1 = vshrq_n_s32(vaddq_s32(a1b0_2, a0a1b0b1), 3); const int32x4_t e0 = vrhaddq_s32(c1, vmovl_s16(a0)); const int32x4_t e1 = vrhaddq_s32(c0, vmovl_s16(a1)); const int32x4x2_t f = vzipq_s32(e0, e1); const int16x8_t g = vreinterpretq_s16_u16(vld1q_u16(best_y + 2 * i)); const int32x4_t h0 = vaddw_s16(f.val[0], vget_low_s16(g)); const int32x4_t h1 = vaddw_s16(f.val[1], vget_high_s16(g)); const uint16x8_t i_16 = vcombine_u16(vqmovun_s32(h0), vqmovun_s32(h1)); const uint16x8_t i_clamped = vminq_u16(i_16, max); vst1q_u16(out + 2 * i + 0, i_clamped); } for (; i < len; ++i) { const int a0b1 = A[i + 0] + B[i + 1]; const int a1b0 = A[i + 1] + B[i + 0]; const int a0a1b0b1 = a0b1 + a1b0 + 8; const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4; const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4; out[2 * i + 0] = clip_NEON(best_y[2 * i + 0] + v0, max_y); out[2 * i + 1] = clip_NEON(best_y[2 * i + 1] + v1, max_y); } } static void SharpYuvFilterRow_NEON(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { if (bit_depth <= 10) { SharpYuvFilterRow16_NEON(A, B, len, best_y, out, bit_depth); } else { SharpYuvFilterRow32_NEON(A, B, len, best_y, out, bit_depth); } } //------------------------------------------------------------------------------ extern void InitSharpYuvNEON(void); WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) { SharpYuvUpdateY = SharpYuvUpdateY_NEON; SharpYuvUpdateRGB = SharpYuvUpdateRGB_NEON; SharpYuvFilterRow = SharpYuvFilterRow_NEON; } #else // !WEBP_USE_NEON extern void InitSharpYuvNEON(void); void InitSharpYuvNEON(void) {} #endif // WEBP_USE_NEON libwebp-1.4.0/sharpyuv/sharpyuv_sse2.c0000644000014400001440000002100614606317060014714 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical functions for Sharp YUV. // // Author: Skal (pascal.massimino@gmail.com) #include "sharpyuv/sharpyuv_dsp.h" #if defined(WEBP_USE_SSE2) #include #include static uint16_t clip_SSE2(int v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; } static uint64_t SharpYuvUpdateY_SSE2(const uint16_t* ref, const uint16_t* src, uint16_t* dst, int len, int bit_depth) { const int max_y = (1 << bit_depth) - 1; uint64_t diff = 0; uint32_t tmp[4]; int i; const __m128i zero = _mm_setzero_si128(); const __m128i max = _mm_set1_epi16(max_y); const __m128i one = _mm_set1_epi16(1); __m128i sum = zero; for (i = 0; i + 8 <= len; i += 8) { const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i)); const __m128i B = _mm_loadu_si128((const __m128i*)(src + i)); const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i)); const __m128i D = _mm_sub_epi16(A, B); // diff_y const __m128i E = _mm_cmpgt_epi16(zero, D); // sign (-1 or 0) const __m128i F = _mm_add_epi16(C, D); // new_y const __m128i G = _mm_or_si128(E, one); // -1 or 1 const __m128i H = _mm_max_epi16(_mm_min_epi16(F, max), zero); const __m128i I = _mm_madd_epi16(D, G); // sum(abs(...)) _mm_storeu_si128((__m128i*)(dst + i), H); sum = _mm_add_epi32(sum, I); } _mm_storeu_si128((__m128i*)tmp, sum); diff = tmp[3] + tmp[2] + tmp[1] + tmp[0]; for (; i < len; ++i) { const int diff_y = ref[i] - src[i]; const int new_y = (int)dst[i] + diff_y; dst[i] = clip_SSE2(new_y, max_y); diff += (uint64_t)abs(diff_y); } return diff; } static void SharpYuvUpdateRGB_SSE2(const int16_t* ref, const int16_t* src, int16_t* dst, int len) { int i = 0; for (i = 0; i + 8 <= len; i += 8) { const __m128i A = _mm_loadu_si128((const __m128i*)(ref + i)); const __m128i B = _mm_loadu_si128((const __m128i*)(src + i)); const __m128i C = _mm_loadu_si128((const __m128i*)(dst + i)); const __m128i D = _mm_sub_epi16(A, B); // diff_uv const __m128i E = _mm_add_epi16(C, D); // new_uv _mm_storeu_si128((__m128i*)(dst + i), E); } for (; i < len; ++i) { const int diff_uv = ref[i] - src[i]; dst[i] += diff_uv; } } static void SharpYuvFilterRow16_SSE2(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { const int max_y = (1 << bit_depth) - 1; int i; const __m128i kCst8 = _mm_set1_epi16(8); const __m128i max = _mm_set1_epi16(max_y); const __m128i zero = _mm_setzero_si128(); for (i = 0; i + 8 <= len; i += 8) { const __m128i a0 = _mm_loadu_si128((const __m128i*)(A + i + 0)); const __m128i a1 = _mm_loadu_si128((const __m128i*)(A + i + 1)); const __m128i b0 = _mm_loadu_si128((const __m128i*)(B + i + 0)); const __m128i b1 = _mm_loadu_si128((const __m128i*)(B + i + 1)); const __m128i a0b1 = _mm_add_epi16(a0, b1); const __m128i a1b0 = _mm_add_epi16(a1, b0); const __m128i a0a1b0b1 = _mm_add_epi16(a0b1, a1b0); // A0+A1+B0+B1 const __m128i a0a1b0b1_8 = _mm_add_epi16(a0a1b0b1, kCst8); const __m128i a0b1_2 = _mm_add_epi16(a0b1, a0b1); // 2*(A0+B1) const __m128i a1b0_2 = _mm_add_epi16(a1b0, a1b0); // 2*(A1+B0) const __m128i c0 = _mm_srai_epi16(_mm_add_epi16(a0b1_2, a0a1b0b1_8), 3); const __m128i c1 = _mm_srai_epi16(_mm_add_epi16(a1b0_2, a0a1b0b1_8), 3); const __m128i d0 = _mm_add_epi16(c1, a0); const __m128i d1 = _mm_add_epi16(c0, a1); const __m128i e0 = _mm_srai_epi16(d0, 1); const __m128i e1 = _mm_srai_epi16(d1, 1); const __m128i f0 = _mm_unpacklo_epi16(e0, e1); const __m128i f1 = _mm_unpackhi_epi16(e0, e1); const __m128i g0 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0)); const __m128i g1 = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 8)); const __m128i h0 = _mm_add_epi16(g0, f0); const __m128i h1 = _mm_add_epi16(g1, f1); const __m128i i0 = _mm_max_epi16(_mm_min_epi16(h0, max), zero); const __m128i i1 = _mm_max_epi16(_mm_min_epi16(h1, max), zero); _mm_storeu_si128((__m128i*)(out + 2 * i + 0), i0); _mm_storeu_si128((__m128i*)(out + 2 * i + 8), i1); } for (; i < len; ++i) { // (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 = // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4 // We reuse the common sub-expressions. const int a0b1 = A[i + 0] + B[i + 1]; const int a1b0 = A[i + 1] + B[i + 0]; const int a0a1b0b1 = a0b1 + a1b0 + 8; const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4; const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4; out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y); out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y); } } static WEBP_INLINE __m128i s16_to_s32(__m128i in) { return _mm_srai_epi32(_mm_unpacklo_epi16(in, in), 16); } static void SharpYuvFilterRow32_SSE2(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { const int max_y = (1 << bit_depth) - 1; int i; const __m128i kCst8 = _mm_set1_epi32(8); const __m128i max = _mm_set1_epi16(max_y); const __m128i zero = _mm_setzero_si128(); for (i = 0; i + 4 <= len; i += 4) { const __m128i a0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 0))); const __m128i a1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(A + i + 1))); const __m128i b0 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 0))); const __m128i b1 = s16_to_s32(_mm_loadl_epi64((const __m128i*)(B + i + 1))); const __m128i a0b1 = _mm_add_epi32(a0, b1); const __m128i a1b0 = _mm_add_epi32(a1, b0); const __m128i a0a1b0b1 = _mm_add_epi32(a0b1, a1b0); // A0+A1+B0+B1 const __m128i a0a1b0b1_8 = _mm_add_epi32(a0a1b0b1, kCst8); const __m128i a0b1_2 = _mm_add_epi32(a0b1, a0b1); // 2*(A0+B1) const __m128i a1b0_2 = _mm_add_epi32(a1b0, a1b0); // 2*(A1+B0) const __m128i c0 = _mm_srai_epi32(_mm_add_epi32(a0b1_2, a0a1b0b1_8), 3); const __m128i c1 = _mm_srai_epi32(_mm_add_epi32(a1b0_2, a0a1b0b1_8), 3); const __m128i d0 = _mm_add_epi32(c1, a0); const __m128i d1 = _mm_add_epi32(c0, a1); const __m128i e0 = _mm_srai_epi32(d0, 1); const __m128i e1 = _mm_srai_epi32(d1, 1); const __m128i f0 = _mm_unpacklo_epi32(e0, e1); const __m128i f1 = _mm_unpackhi_epi32(e0, e1); const __m128i g = _mm_loadu_si128((const __m128i*)(best_y + 2 * i + 0)); const __m128i h_16 = _mm_add_epi16(g, _mm_packs_epi32(f0, f1)); const __m128i final = _mm_max_epi16(_mm_min_epi16(h_16, max), zero); _mm_storeu_si128((__m128i*)(out + 2 * i + 0), final); } for (; i < len; ++i) { // (9 * A0 + 3 * A1 + 3 * B0 + B1 + 8) >> 4 = // = (8 * A0 + 2 * (A1 + B0) + (A0 + A1 + B0 + B1 + 8)) >> 4 // We reuse the common sub-expressions. const int a0b1 = A[i + 0] + B[i + 1]; const int a1b0 = A[i + 1] + B[i + 0]; const int a0a1b0b1 = a0b1 + a1b0 + 8; const int v0 = (8 * A[i + 0] + 2 * a1b0 + a0a1b0b1) >> 4; const int v1 = (8 * A[i + 1] + 2 * a0b1 + a0a1b0b1) >> 4; out[2 * i + 0] = clip_SSE2(best_y[2 * i + 0] + v0, max_y); out[2 * i + 1] = clip_SSE2(best_y[2 * i + 1] + v1, max_y); } } static void SharpYuvFilterRow_SSE2(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { if (bit_depth <= 10) { SharpYuvFilterRow16_SSE2(A, B, len, best_y, out, bit_depth); } else { SharpYuvFilterRow32_SSE2(A, B, len, best_y, out, bit_depth); } } //------------------------------------------------------------------------------ extern void InitSharpYuvSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvSSE2(void) { SharpYuvUpdateY = SharpYuvUpdateY_SSE2; SharpYuvUpdateRGB = SharpYuvUpdateRGB_SSE2; SharpYuvFilterRow = SharpYuvFilterRow_SSE2; } #else // !WEBP_USE_SSE2 extern void InitSharpYuvSSE2(void); void InitSharpYuvSSE2(void) {} #endif // WEBP_USE_SSE2 libwebp-1.4.0/sharpyuv/libsharpyuv.pc.in0000644000014400001440000000046614606317060015243 0ustar prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@/webp Name: libsharpyuv Description: Library for sharp RGB to YUV conversion Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -l@webp_libname_prefix@sharpyuv Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ libwebp-1.4.0/sharpyuv/Makefile.am0000644000014400001440000000270414606317060013773 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src lib_LTLIBRARIES = libsharpyuv.la noinst_LTLIBRARIES = noinst_LTLIBRARIES += libsharpyuv_sse2.la noinst_LTLIBRARIES += libsharpyuv_neon.la libsharpyuvinclude_HEADERS = libsharpyuvinclude_HEADERS += sharpyuv.h libsharpyuvinclude_HEADERS += sharpyuv_csp.h noinst_HEADERS = noinst_HEADERS += ../src/dsp/cpu.c noinst_HEADERS += ../src/dsp/cpu.h noinst_HEADERS += ../src/webp/types.h libsharpyuv_sse2_la_SOURCES = libsharpyuv_sse2_la_SOURCES += sharpyuv_sse2.c libsharpyuv_sse2_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS) libsharpyuv_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) libsharpyuv_neon_la_SOURCES = libsharpyuv_neon_la_SOURCES += sharpyuv_neon.c libsharpyuv_neon_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS) libsharpyuv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_FLAGS) libsharpyuv_la_SOURCES = libsharpyuv_la_SOURCES += sharpyuv_cpu.c sharpyuv_cpu.h libsharpyuv_la_SOURCES += sharpyuv_csp.c sharpyuv_csp.h libsharpyuv_la_SOURCES += sharpyuv_dsp.c sharpyuv_dsp.h libsharpyuv_la_SOURCES += sharpyuv_gamma.c sharpyuv_gamma.h libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS) libsharpyuv_la_LDFLAGS = -no-undefined -version-info 1:0:1 -lm libsharpyuv_la_LIBADD = libsharpyuv_la_LIBADD += libsharpyuv_sse2.la libsharpyuv_la_LIBADD += libsharpyuv_neon.la libsharpyuvincludedir = $(includedir)/webp/sharpyuv pkgconfig_DATA = libsharpyuv.pc libwebp-1.4.0/sharpyuv/sharpyuv_dsp.c0000644000014400001440000000650114606317060014631 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical functions for Sharp YUV. // // Author: Skal (pascal.massimino@gmail.com) #include "sharpyuv/sharpyuv_dsp.h" #include #include #include "sharpyuv/sharpyuv_cpu.h" #include "src/webp/types.h" //----------------------------------------------------------------------------- #if !WEBP_NEON_OMIT_C_CODE static uint16_t clip(int v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; } static uint64_t SharpYuvUpdateY_C(const uint16_t* ref, const uint16_t* src, uint16_t* dst, int len, int bit_depth) { uint64_t diff = 0; int i; const int max_y = (1 << bit_depth) - 1; for (i = 0; i < len; ++i) { const int diff_y = ref[i] - src[i]; const int new_y = (int)dst[i] + diff_y; dst[i] = clip(new_y, max_y); diff += (uint64_t)abs(diff_y); } return diff; } static void SharpYuvUpdateRGB_C(const int16_t* ref, const int16_t* src, int16_t* dst, int len) { int i; for (i = 0; i < len; ++i) { const int diff_uv = ref[i] - src[i]; dst[i] += diff_uv; } } static void SharpYuvFilterRow_C(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth) { int i; const int max_y = (1 << bit_depth) - 1; for (i = 0; i < len; ++i, ++A, ++B) { const int v0 = (A[0] * 9 + A[1] * 3 + B[0] * 3 + B[1] + 8) >> 4; const int v1 = (A[1] * 9 + A[0] * 3 + B[1] * 3 + B[0] + 8) >> 4; out[2 * i + 0] = clip(best_y[2 * i + 0] + v0, max_y); out[2 * i + 1] = clip(best_y[2 * i + 1] + v1, max_y); } } #endif // !WEBP_NEON_OMIT_C_CODE //----------------------------------------------------------------------------- uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref, uint16_t* dst, int len, int bit_depth); void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref, int16_t* dst, int len); void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth); extern VP8CPUInfo SharpYuvGetCPUInfo; extern void InitSharpYuvSSE2(void); extern void InitSharpYuvNEON(void); void SharpYuvInitDsp(void) { #if !WEBP_NEON_OMIT_C_CODE SharpYuvUpdateY = SharpYuvUpdateY_C; SharpYuvUpdateRGB = SharpYuvUpdateRGB_C; SharpYuvFilterRow = SharpYuvFilterRow_C; #endif if (SharpYuvGetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (SharpYuvGetCPUInfo(kSSE2)) { InitSharpYuvSSE2(); } #endif // WEBP_HAVE_SSE2 } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (SharpYuvGetCPUInfo != NULL && SharpYuvGetCPUInfo(kNEON))) { InitSharpYuvNEON(); } #endif // WEBP_HAVE_NEON assert(SharpYuvUpdateY != NULL); assert(SharpYuvUpdateRGB != NULL); assert(SharpYuvFilterRow != NULL); } libwebp-1.4.0/sharpyuv/sharpyuv.c0000644000014400001440000005240214606317060013764 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Sharp RGB to YUV conversion. // // Author: Skal (pascal.massimino@gmail.com) #include "sharpyuv/sharpyuv.h" #include #include #include #include #include #include "src/webp/types.h" #include "sharpyuv/sharpyuv_cpu.h" #include "sharpyuv/sharpyuv_dsp.h" #include "sharpyuv/sharpyuv_gamma.h" //------------------------------------------------------------------------------ int SharpYuvGetVersion(void) { return SHARPYUV_VERSION; } //------------------------------------------------------------------------------ // Sharp RGB->YUV conversion static const int kNumIterations = 4; #define YUV_FIX 16 // fixed-point precision for RGB->YUV static const int kYuvHalf = 1 << (YUV_FIX - 1); // Max bit depth so that intermediate calculations fit in 16 bits. static const int kMaxBitDepth = 14; // Returns the precision shift to use based on the input rgb_bit_depth. static int GetPrecisionShift(int rgb_bit_depth) { // Try to add 2 bits of precision if it fits in kMaxBitDepth. Otherwise remove // bits if needed. return ((rgb_bit_depth + 2) <= kMaxBitDepth) ? 2 : (kMaxBitDepth - rgb_bit_depth); } typedef int16_t fixed_t; // signed type with extra precision for UV typedef uint16_t fixed_y_t; // unsigned type with extra precision for W //------------------------------------------------------------------------------ static uint8_t clip_8b(fixed_t v) { return (!(v & ~0xff)) ? (uint8_t)v : (v < 0) ? 0u : 255u; } static uint16_t clip(fixed_t v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; } static fixed_y_t clip_bit_depth(int y, int bit_depth) { const int max = (1 << bit_depth) - 1; return (!(y & ~max)) ? (fixed_y_t)y : (y < 0) ? 0 : max; } //------------------------------------------------------------------------------ static int RGBToGray(int64_t r, int64_t g, int64_t b) { const int64_t luma = 13933 * r + 46871 * g + 4732 * b + kYuvHalf; return (int)(luma >> YUV_FIX); } static uint32_t ScaleDown(uint16_t a, uint16_t b, uint16_t c, uint16_t d, int rgb_bit_depth, SharpYuvTransferFunctionType transfer_type) { const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth); const uint32_t A = SharpYuvGammaToLinear(a, bit_depth, transfer_type); const uint32_t B = SharpYuvGammaToLinear(b, bit_depth, transfer_type); const uint32_t C = SharpYuvGammaToLinear(c, bit_depth, transfer_type); const uint32_t D = SharpYuvGammaToLinear(d, bit_depth, transfer_type); return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth, transfer_type); } static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w, int rgb_bit_depth, SharpYuvTransferFunctionType transfer_type) { const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth); int i = 0; do { const uint32_t R = SharpYuvGammaToLinear(src[0 * w + i], bit_depth, transfer_type); const uint32_t G = SharpYuvGammaToLinear(src[1 * w + i], bit_depth, transfer_type); const uint32_t B = SharpYuvGammaToLinear(src[2 * w + i], bit_depth, transfer_type); const uint32_t Y = RGBToGray(R, G, B); dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth, transfer_type); } while (++i < w); } static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2, fixed_t* dst, int uv_w, int rgb_bit_depth, SharpYuvTransferFunctionType transfer_type) { int i = 0; do { const int r = ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1], src2[0 * uv_w + 0], src2[0 * uv_w + 1], rgb_bit_depth, transfer_type); const int g = ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1], src2[2 * uv_w + 0], src2[2 * uv_w + 1], rgb_bit_depth, transfer_type); const int b = ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1], src2[4 * uv_w + 0], src2[4 * uv_w + 1], rgb_bit_depth, transfer_type); const int W = RGBToGray(r, g, b); dst[0 * uv_w] = (fixed_t)(r - W); dst[1 * uv_w] = (fixed_t)(g - W); dst[2 * uv_w] = (fixed_t)(b - W); dst += 1; src1 += 2; src2 += 2; } while (++i < uv_w); } static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) { int i = 0; assert(w > 0); do { y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]); } while (++i < w); } //------------------------------------------------------------------------------ static WEBP_INLINE fixed_y_t Filter2(int A, int B, int W0, int bit_depth) { const int v0 = (A * 3 + B + 2) >> 2; return clip_bit_depth(v0 + W0, bit_depth); } //------------------------------------------------------------------------------ static WEBP_INLINE int Shift(int v, int shift) { return (shift >= 0) ? (v << shift) : (v >> -shift); } static void ImportOneRow(const uint8_t* const r_ptr, const uint8_t* const g_ptr, const uint8_t* const b_ptr, int rgb_step, int rgb_bit_depth, int pic_width, fixed_y_t* const dst) { // Convert the rgb_step from a number of bytes to a number of uint8_t or // uint16_t values depending the bit depth. const int step = (rgb_bit_depth > 8) ? rgb_step / 2 : rgb_step; int i = 0; const int w = (pic_width + 1) & ~1; do { const int off = i * step; const int shift = GetPrecisionShift(rgb_bit_depth); if (rgb_bit_depth == 8) { dst[i + 0 * w] = Shift(r_ptr[off], shift); dst[i + 1 * w] = Shift(g_ptr[off], shift); dst[i + 2 * w] = Shift(b_ptr[off], shift); } else { dst[i + 0 * w] = Shift(((uint16_t*)r_ptr)[off], shift); dst[i + 1 * w] = Shift(((uint16_t*)g_ptr)[off], shift); dst[i + 2 * w] = Shift(((uint16_t*)b_ptr)[off], shift); } } while (++i < pic_width); if (pic_width & 1) { // replicate rightmost pixel dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1]; dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1]; dst[pic_width + 2 * w] = dst[pic_width + 2 * w - 1]; } } static void InterpolateTwoRows(const fixed_y_t* const best_y, const fixed_t* prev_uv, const fixed_t* cur_uv, const fixed_t* next_uv, int w, fixed_y_t* out1, fixed_y_t* out2, int rgb_bit_depth) { const int uv_w = w >> 1; const int len = (w - 1) >> 1; // length to filter int k = 3; const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth); while (k-- > 0) { // process each R/G/B segments in turn // special boundary case for i==0 out1[0] = Filter2(cur_uv[0], prev_uv[0], best_y[0], bit_depth); out2[0] = Filter2(cur_uv[0], next_uv[0], best_y[w], bit_depth); SharpYuvFilterRow(cur_uv, prev_uv, len, best_y + 0 + 1, out1 + 1, bit_depth); SharpYuvFilterRow(cur_uv, next_uv, len, best_y + w + 1, out2 + 1, bit_depth); // special boundary case for i == w - 1 when w is even if (!(w & 1)) { out1[w - 1] = Filter2(cur_uv[uv_w - 1], prev_uv[uv_w - 1], best_y[w - 1 + 0], bit_depth); out2[w - 1] = Filter2(cur_uv[uv_w - 1], next_uv[uv_w - 1], best_y[w - 1 + w], bit_depth); } out1 += w; out2 += w; prev_uv += uv_w; cur_uv += uv_w; next_uv += uv_w; } } static WEBP_INLINE int RGBToYUVComponent(int r, int g, int b, const int coeffs[4], int sfix) { const int srounder = 1 << (YUV_FIX + sfix - 1); const int luma = coeffs[0] * r + coeffs[1] * g + coeffs[2] * b + coeffs[3] + srounder; return (luma >> (YUV_FIX + sfix)); } static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv, uint8_t* y_ptr, int y_stride, uint8_t* u_ptr, int u_stride, uint8_t* v_ptr, int v_stride, int rgb_bit_depth, int yuv_bit_depth, int width, int height, const SharpYuvConversionMatrix* yuv_matrix) { int i, j; const fixed_t* const best_uv_base = best_uv; const int w = (width + 1) & ~1; const int h = (height + 1) & ~1; const int uv_w = w >> 1; const int uv_h = h >> 1; const int sfix = GetPrecisionShift(rgb_bit_depth); const int yuv_max = (1 << yuv_bit_depth) - 1; best_uv = best_uv_base; j = 0; do { i = 0; do { const int off = (i >> 1); const int W = best_y[i]; const int r = best_uv[off + 0 * uv_w] + W; const int g = best_uv[off + 1 * uv_w] + W; const int b = best_uv[off + 2 * uv_w] + W; const int y = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_y, sfix); if (yuv_bit_depth <= 8) { y_ptr[i] = clip_8b(y); } else { ((uint16_t*)y_ptr)[i] = clip(y, yuv_max); } } while (++i < width); best_y += w; best_uv += (j & 1) * 3 * uv_w; y_ptr += y_stride; } while (++j < height); best_uv = best_uv_base; j = 0; do { i = 0; do { // Note r, g and b values here are off by W, but a constant offset on all // 3 components doesn't change the value of u and v with a YCbCr matrix. const int r = best_uv[i + 0 * uv_w]; const int g = best_uv[i + 1 * uv_w]; const int b = best_uv[i + 2 * uv_w]; const int u = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_u, sfix); const int v = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_v, sfix); if (yuv_bit_depth <= 8) { u_ptr[i] = clip_8b(u); v_ptr[i] = clip_8b(v); } else { ((uint16_t*)u_ptr)[i] = clip(u, yuv_max); ((uint16_t*)v_ptr)[i] = clip(v, yuv_max); } } while (++i < uv_w); best_uv += 3 * uv_w; u_ptr += u_stride; v_ptr += v_stride; } while (++j < uv_h); return 1; } //------------------------------------------------------------------------------ // Main function static void* SafeMalloc(uint64_t nmemb, size_t size) { const uint64_t total_size = nmemb * (uint64_t)size; if (total_size != (size_t)total_size) return NULL; return malloc((size_t)total_size); } #define SAFE_ALLOC(W, H, T) ((T*)SafeMalloc((uint64_t)(W) * (H), sizeof(T))) static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, uint8_t* y_ptr, int y_stride, uint8_t* u_ptr, int u_stride, uint8_t* v_ptr, int v_stride, int yuv_bit_depth, int width, int height, const SharpYuvConversionMatrix* yuv_matrix, SharpYuvTransferFunctionType transfer_type) { // we expand the right/bottom border if needed const int w = (width + 1) & ~1; const int h = (height + 1) & ~1; const int uv_w = w >> 1; const int uv_h = h >> 1; const int y_bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth); uint64_t prev_diff_y_sum = ~0; int j, iter; // TODO(skal): allocate one big memory chunk. But for now, it's easier // for valgrind debugging to have several chunks. fixed_y_t* const tmp_buffer = SAFE_ALLOC(w * 3, 2, fixed_y_t); // scratch fixed_y_t* const best_y_base = SAFE_ALLOC(w, h, fixed_y_t); fixed_y_t* const target_y_base = SAFE_ALLOC(w, h, fixed_y_t); fixed_y_t* const best_rgb_y = SAFE_ALLOC(w, 2, fixed_y_t); fixed_t* const best_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t); fixed_t* const target_uv_base = SAFE_ALLOC(uv_w * 3, uv_h, fixed_t); fixed_t* const best_rgb_uv = SAFE_ALLOC(uv_w * 3, 1, fixed_t); fixed_y_t* best_y = best_y_base; fixed_y_t* target_y = target_y_base; fixed_t* best_uv = best_uv_base; fixed_t* target_uv = target_uv_base; const uint64_t diff_y_threshold = (uint64_t)(3.0 * w * h); int ok; assert(w > 0); assert(h > 0); if (best_y_base == NULL || best_uv_base == NULL || target_y_base == NULL || target_uv_base == NULL || best_rgb_y == NULL || best_rgb_uv == NULL || tmp_buffer == NULL) { ok = 0; goto End; } // Import RGB samples to W/RGB representation. for (j = 0; j < height; j += 2) { const int is_last_row = (j == height - 1); fixed_y_t* const src1 = tmp_buffer + 0 * w; fixed_y_t* const src2 = tmp_buffer + 3 * w; // prepare two rows of input ImportOneRow(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth, width, src1); if (!is_last_row) { ImportOneRow(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride, rgb_step, rgb_bit_depth, width, src2); } else { memcpy(src2, src1, 3 * w * sizeof(*src2)); } StoreGray(src1, best_y + 0, w); StoreGray(src2, best_y + w, w); UpdateW(src1, target_y, w, rgb_bit_depth, transfer_type); UpdateW(src2, target_y + w, w, rgb_bit_depth, transfer_type); UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth, transfer_type); memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv)); best_y += 2 * w; best_uv += 3 * uv_w; target_y += 2 * w; target_uv += 3 * uv_w; r_ptr += 2 * rgb_stride; g_ptr += 2 * rgb_stride; b_ptr += 2 * rgb_stride; } // Iterate and resolve clipping conflicts. for (iter = 0; iter < kNumIterations; ++iter) { const fixed_t* cur_uv = best_uv_base; const fixed_t* prev_uv = best_uv_base; uint64_t diff_y_sum = 0; best_y = best_y_base; best_uv = best_uv_base; target_y = target_y_base; target_uv = target_uv_base; j = 0; do { fixed_y_t* const src1 = tmp_buffer + 0 * w; fixed_y_t* const src2 = tmp_buffer + 3 * w; { const fixed_t* const next_uv = cur_uv + ((j < h - 2) ? 3 * uv_w : 0); InterpolateTwoRows(best_y, prev_uv, cur_uv, next_uv, w, src1, src2, rgb_bit_depth); prev_uv = cur_uv; cur_uv = next_uv; } UpdateW(src1, best_rgb_y + 0 * w, w, rgb_bit_depth, transfer_type); UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth, transfer_type); UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth, transfer_type); // update two rows of Y and one row of RGB diff_y_sum += SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w, y_bit_depth); SharpYuvUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w); best_y += 2 * w; best_uv += 3 * uv_w; target_y += 2 * w; target_uv += 3 * uv_w; j += 2; } while (j < h); // test exit condition if (iter > 0) { if (diff_y_sum < diff_y_threshold) break; if (diff_y_sum > prev_diff_y_sum) break; } prev_diff_y_sum = diff_y_sum; } // final reconstruction ok = ConvertWRGBToYUV(best_y_base, best_uv_base, y_ptr, y_stride, u_ptr, u_stride, v_ptr, v_stride, rgb_bit_depth, yuv_bit_depth, width, height, yuv_matrix); End: free(best_y_base); free(best_uv_base); free(target_y_base); free(target_uv_base); free(best_rgb_y); free(best_rgb_uv); free(tmp_buffer); return ok; } #undef SAFE_ALLOC #if defined(WEBP_USE_THREAD) && !defined(_WIN32) #include // NOLINT #define LOCK_ACCESS \ static pthread_mutex_t sharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; \ if (pthread_mutex_lock(&sharpyuv_lock)) return #define UNLOCK_ACCESS_AND_RETURN \ do { \ (void)pthread_mutex_unlock(&sharpyuv_lock); \ return; \ } while (0) #else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32)) #define LOCK_ACCESS do {} while (0) #define UNLOCK_ACCESS_AND_RETURN return #endif // defined(WEBP_USE_THREAD) && !defined(_WIN32) // Hidden exported init function. // By default SharpYuvConvert calls it with SharpYuvGetCPUInfo. If needed, // users can declare it as extern and call it with an alternate VP8CPUInfo // function. extern VP8CPUInfo SharpYuvGetCPUInfo; SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func); void SharpYuvInit(VP8CPUInfo cpu_info_func) { static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used = (VP8CPUInfo)&sharpyuv_last_cpuinfo_used; LOCK_ACCESS; // Only update SharpYuvGetCPUInfo when called from external code to avoid a // race on reading the value in SharpYuvConvert(). if (cpu_info_func != (VP8CPUInfo)&SharpYuvGetCPUInfo) { SharpYuvGetCPUInfo = cpu_info_func; } if (sharpyuv_last_cpuinfo_used == SharpYuvGetCPUInfo) { UNLOCK_ACCESS_AND_RETURN; } SharpYuvInitDsp(); SharpYuvInitGammaTables(); sharpyuv_last_cpuinfo_used = SharpYuvGetCPUInfo; UNLOCK_ACCESS_AND_RETURN; } int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, void* y_ptr, int y_stride, void* u_ptr, int u_stride, void* v_ptr, int v_stride, int yuv_bit_depth, int width, int height, const SharpYuvConversionMatrix* yuv_matrix) { SharpYuvOptions options; options.yuv_matrix = yuv_matrix; options.transfer_type = kSharpYuvTransferFunctionSrgb; return SharpYuvConvertWithOptions( r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride, rgb_bit_depth, y_ptr, y_stride, u_ptr, u_stride, v_ptr, v_stride, yuv_bit_depth, width, height, &options); } int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix* yuv_matrix, SharpYuvOptions* options, int version) { const int major = (version >> 24); const int minor = (version >> 16) & 0xff; if (options == NULL || yuv_matrix == NULL || (major == SHARPYUV_VERSION_MAJOR && major == 0 && minor != SHARPYUV_VERSION_MINOR) || (major != SHARPYUV_VERSION_MAJOR)) { return 0; } options->yuv_matrix = yuv_matrix; options->transfer_type = kSharpYuvTransferFunctionSrgb; return 1; } int SharpYuvConvertWithOptions(const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, void* y_ptr, int y_stride, void* u_ptr, int u_stride, void* v_ptr, int v_stride, int yuv_bit_depth, int width, int height, const SharpYuvOptions* options) { const SharpYuvConversionMatrix* yuv_matrix = options->yuv_matrix; SharpYuvTransferFunctionType transfer_type = options->transfer_type; SharpYuvConversionMatrix scaled_matrix; const int rgb_max = (1 << rgb_bit_depth) - 1; const int rgb_round = 1 << (rgb_bit_depth - 1); const int yuv_max = (1 << yuv_bit_depth) - 1; const int sfix = GetPrecisionShift(rgb_bit_depth); if (width < 1 || height < 1 || width == INT_MAX || height == INT_MAX || r_ptr == NULL || g_ptr == NULL || b_ptr == NULL || y_ptr == NULL || u_ptr == NULL || v_ptr == NULL) { return 0; } if (rgb_bit_depth != 8 && rgb_bit_depth != 10 && rgb_bit_depth != 12 && rgb_bit_depth != 16) { return 0; } if (yuv_bit_depth != 8 && yuv_bit_depth != 10 && yuv_bit_depth != 12) { return 0; } if (rgb_bit_depth > 8 && (rgb_step % 2 != 0 || rgb_stride % 2 != 0)) { // Step/stride should be even for uint16_t buffers. return 0; } if (yuv_bit_depth > 8 && (y_stride % 2 != 0 || u_stride % 2 != 0 || v_stride % 2 != 0)) { // Stride should be even for uint16_t buffers. return 0; } // The address of the function pointer is used to avoid a read race. SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo); // Add scaling factor to go from rgb_bit_depth to yuv_bit_depth, to the // rgb->yuv conversion matrix. if (rgb_bit_depth == yuv_bit_depth) { memcpy(&scaled_matrix, yuv_matrix, sizeof(scaled_matrix)); } else { int i; for (i = 0; i < 3; ++i) { scaled_matrix.rgb_to_y[i] = (yuv_matrix->rgb_to_y[i] * yuv_max + rgb_round) / rgb_max; scaled_matrix.rgb_to_u[i] = (yuv_matrix->rgb_to_u[i] * yuv_max + rgb_round) / rgb_max; scaled_matrix.rgb_to_v[i] = (yuv_matrix->rgb_to_v[i] * yuv_max + rgb_round) / rgb_max; } } // Also incorporate precision change scaling. scaled_matrix.rgb_to_y[3] = Shift(yuv_matrix->rgb_to_y[3], sfix); scaled_matrix.rgb_to_u[3] = Shift(yuv_matrix->rgb_to_u[3], sfix); scaled_matrix.rgb_to_v[3] = Shift(yuv_matrix->rgb_to_v[3], sfix); return DoSharpArgbToYuv(r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride, rgb_bit_depth, y_ptr, y_stride, u_ptr, u_stride, v_ptr, v_stride, yuv_bit_depth, width, height, &scaled_matrix, transfer_type); } //------------------------------------------------------------------------------ libwebp-1.4.0/sharpyuv/sharpyuv_dsp.h0000644000014400001440000000226014606317060014634 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical functions for Sharp YUV. #ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_ #define WEBP_SHARPYUV_SHARPYUV_DSP_H_ #include "sharpyuv/sharpyuv_cpu.h" #include "src/webp/types.h" extern uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref, uint16_t* dst, int len, int bit_depth); extern void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref, int16_t* dst, int len); extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth); void SharpYuvInitDsp(void); #endif // WEBP_SHARPYUV_SHARPYUV_DSP_H_ libwebp-1.4.0/sharpyuv/sharpyuv_csp.h0000644000014400001440000000342414606317060014636 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Colorspace utilities. #ifndef WEBP_SHARPYUV_SHARPYUV_CSP_H_ #define WEBP_SHARPYUV_SHARPYUV_CSP_H_ #include "sharpyuv/sharpyuv.h" #ifdef __cplusplus extern "C" { #endif // Range of YUV values. typedef enum { kSharpYuvRangeFull, // YUV values between [0;255] (for 8 bit) kSharpYuvRangeLimited // Y in [16;235], YUV in [16;240] (for 8 bit) } SharpYuvRange; // Constants that define a YUV color space. typedef struct { // Kr and Kb are defined such that: // Y = Kr * r + Kg * g + Kb * b where Kg = 1 - Kr - Kb. float kr; float kb; int bit_depth; // 8, 10 or 12 SharpYuvRange range; } SharpYuvColorSpace; // Fills in 'matrix' for the given YUVColorSpace. SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix( const SharpYuvColorSpace* yuv_color_space, SharpYuvConversionMatrix* matrix); // Enums for precomputed conversion matrices. typedef enum { kSharpYuvMatrixWebp = 0, kSharpYuvMatrixRec601Limited, kSharpYuvMatrixRec601Full, kSharpYuvMatrixRec709Limited, kSharpYuvMatrixRec709Full, kSharpYuvMatrixNum } SharpYuvMatrixType; // Returns a pointer to a matrix for one of the predefined colorspaces. SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( SharpYuvMatrixType matrix_type); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_SHARPYUV_SHARPYUV_CSP_H_ libwebp-1.4.0/sharpyuv/Makefile.in0000644000014400001440000010745514606317244014021 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sharpyuv ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(libsharpyuvinclude_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = libsharpyuv.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(libsharpyuvincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) libsharpyuv_la_DEPENDENCIES = libsharpyuv_sse2.la libsharpyuv_neon.la am_libsharpyuv_la_OBJECTS = libsharpyuv_la-sharpyuv_cpu.lo \ libsharpyuv_la-sharpyuv_csp.lo libsharpyuv_la-sharpyuv_dsp.lo \ libsharpyuv_la-sharpyuv_gamma.lo libsharpyuv_la-sharpyuv.lo libsharpyuv_la_OBJECTS = $(am_libsharpyuv_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libsharpyuv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libsharpyuv_la_LDFLAGS) $(LDFLAGS) -o \ $@ libsharpyuv_neon_la_LIBADD = am_libsharpyuv_neon_la_OBJECTS = libsharpyuv_neon_la-sharpyuv_neon.lo libsharpyuv_neon_la_OBJECTS = $(am_libsharpyuv_neon_la_OBJECTS) libsharpyuv_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libsharpyuv_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libsharpyuv_sse2_la_LIBADD = am_libsharpyuv_sse2_la_OBJECTS = libsharpyuv_sse2_la-sharpyuv_sse2.lo libsharpyuv_sse2_la_OBJECTS = $(am_libsharpyuv_sse2_la_OBJECTS) libsharpyuv_sse2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libsharpyuv_sse2_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libsharpyuv_la-sharpyuv.Plo \ ./$(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Plo \ ./$(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Plo \ ./$(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Plo \ ./$(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Plo \ ./$(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Plo \ ./$(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsharpyuv_la_SOURCES) $(libsharpyuv_neon_la_SOURCES) \ $(libsharpyuv_sse2_la_SOURCES) DIST_SOURCES = $(libsharpyuv_la_SOURCES) \ $(libsharpyuv_neon_la_SOURCES) $(libsharpyuv_sse2_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(libsharpyuvinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libsharpyuv.pc.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) \ -I$(top_builddir)/src -I$(top_srcdir)/src AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ lib_LTLIBRARIES = libsharpyuv.la noinst_LTLIBRARIES = libsharpyuv_sse2.la libsharpyuv_neon.la libsharpyuvinclude_HEADERS = sharpyuv.h sharpyuv_csp.h noinst_HEADERS = ../src/dsp/cpu.c ../src/dsp/cpu.h ../src/webp/types.h libsharpyuv_sse2_la_SOURCES = sharpyuv_sse2.c libsharpyuv_sse2_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS) libsharpyuv_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) libsharpyuv_neon_la_SOURCES = sharpyuv_neon.c libsharpyuv_neon_la_CPPFLAGS = $(libsharpyuv_la_CPPFLAGS) libsharpyuv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_FLAGS) libsharpyuv_la_SOURCES = sharpyuv_cpu.c sharpyuv_cpu.h sharpyuv_csp.c \ sharpyuv_csp.h sharpyuv_dsp.c sharpyuv_dsp.h sharpyuv_gamma.c \ sharpyuv_gamma.h sharpyuv.c sharpyuv.h libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS) libsharpyuv_la_LDFLAGS = -no-undefined -version-info 1:0:1 -lm libsharpyuv_la_LIBADD = libsharpyuv_sse2.la libsharpyuv_neon.la libsharpyuvincludedir = $(includedir)/webp/sharpyuv pkgconfig_DATA = libsharpyuv.pc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sharpyuv/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sharpyuv/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libsharpyuv.pc: $(top_builddir)/config.status $(srcdir)/libsharpyuv.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsharpyuv.la: $(libsharpyuv_la_OBJECTS) $(libsharpyuv_la_DEPENDENCIES) $(EXTRA_libsharpyuv_la_DEPENDENCIES) $(AM_V_CCLD)$(libsharpyuv_la_LINK) -rpath $(libdir) $(libsharpyuv_la_OBJECTS) $(libsharpyuv_la_LIBADD) $(LIBS) libsharpyuv_neon.la: $(libsharpyuv_neon_la_OBJECTS) $(libsharpyuv_neon_la_DEPENDENCIES) $(EXTRA_libsharpyuv_neon_la_DEPENDENCIES) $(AM_V_CCLD)$(libsharpyuv_neon_la_LINK) $(libsharpyuv_neon_la_OBJECTS) $(libsharpyuv_neon_la_LIBADD) $(LIBS) libsharpyuv_sse2.la: $(libsharpyuv_sse2_la_OBJECTS) $(libsharpyuv_sse2_la_DEPENDENCIES) $(EXTRA_libsharpyuv_sse2_la_DEPENDENCIES) $(AM_V_CCLD)$(libsharpyuv_sse2_la_LINK) $(libsharpyuv_sse2_la_OBJECTS) $(libsharpyuv_sse2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_la-sharpyuv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libsharpyuv_la-sharpyuv_cpu.lo: sharpyuv_cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsharpyuv_la-sharpyuv_cpu.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Tpo -c -o libsharpyuv_la-sharpyuv_cpu.lo `test -f 'sharpyuv_cpu.c' || echo '$(srcdir)/'`sharpyuv_cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Tpo $(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_cpu.c' object='libsharpyuv_la-sharpyuv_cpu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsharpyuv_la-sharpyuv_cpu.lo `test -f 'sharpyuv_cpu.c' || echo '$(srcdir)/'`sharpyuv_cpu.c libsharpyuv_la-sharpyuv_csp.lo: sharpyuv_csp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsharpyuv_la-sharpyuv_csp.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Tpo -c -o libsharpyuv_la-sharpyuv_csp.lo `test -f 'sharpyuv_csp.c' || echo '$(srcdir)/'`sharpyuv_csp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Tpo $(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_csp.c' object='libsharpyuv_la-sharpyuv_csp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsharpyuv_la-sharpyuv_csp.lo `test -f 'sharpyuv_csp.c' || echo '$(srcdir)/'`sharpyuv_csp.c libsharpyuv_la-sharpyuv_dsp.lo: sharpyuv_dsp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsharpyuv_la-sharpyuv_dsp.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Tpo -c -o libsharpyuv_la-sharpyuv_dsp.lo `test -f 'sharpyuv_dsp.c' || echo '$(srcdir)/'`sharpyuv_dsp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Tpo $(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_dsp.c' object='libsharpyuv_la-sharpyuv_dsp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsharpyuv_la-sharpyuv_dsp.lo `test -f 'sharpyuv_dsp.c' || echo '$(srcdir)/'`sharpyuv_dsp.c libsharpyuv_la-sharpyuv_gamma.lo: sharpyuv_gamma.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsharpyuv_la-sharpyuv_gamma.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Tpo -c -o libsharpyuv_la-sharpyuv_gamma.lo `test -f 'sharpyuv_gamma.c' || echo '$(srcdir)/'`sharpyuv_gamma.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Tpo $(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_gamma.c' object='libsharpyuv_la-sharpyuv_gamma.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsharpyuv_la-sharpyuv_gamma.lo `test -f 'sharpyuv_gamma.c' || echo '$(srcdir)/'`sharpyuv_gamma.c libsharpyuv_la-sharpyuv.lo: sharpyuv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsharpyuv_la-sharpyuv.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_la-sharpyuv.Tpo -c -o libsharpyuv_la-sharpyuv.lo `test -f 'sharpyuv.c' || echo '$(srcdir)/'`sharpyuv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_la-sharpyuv.Tpo $(DEPDIR)/libsharpyuv_la-sharpyuv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv.c' object='libsharpyuv_la-sharpyuv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsharpyuv_la-sharpyuv.lo `test -f 'sharpyuv.c' || echo '$(srcdir)/'`sharpyuv.c libsharpyuv_neon_la-sharpyuv_neon.lo: sharpyuv_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_neon_la_CPPFLAGS) $(CPPFLAGS) $(libsharpyuv_neon_la_CFLAGS) $(CFLAGS) -MT libsharpyuv_neon_la-sharpyuv_neon.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Tpo -c -o libsharpyuv_neon_la-sharpyuv_neon.lo `test -f 'sharpyuv_neon.c' || echo '$(srcdir)/'`sharpyuv_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Tpo $(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_neon.c' object='libsharpyuv_neon_la-sharpyuv_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_neon_la_CPPFLAGS) $(CPPFLAGS) $(libsharpyuv_neon_la_CFLAGS) $(CFLAGS) -c -o libsharpyuv_neon_la-sharpyuv_neon.lo `test -f 'sharpyuv_neon.c' || echo '$(srcdir)/'`sharpyuv_neon.c libsharpyuv_sse2_la-sharpyuv_sse2.lo: sharpyuv_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libsharpyuv_sse2_la_CFLAGS) $(CFLAGS) -MT libsharpyuv_sse2_la-sharpyuv_sse2.lo -MD -MP -MF $(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Tpo -c -o libsharpyuv_sse2_la-sharpyuv_sse2.lo `test -f 'sharpyuv_sse2.c' || echo '$(srcdir)/'`sharpyuv_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Tpo $(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sharpyuv_sse2.c' object='libsharpyuv_sse2_la-sharpyuv_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsharpyuv_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libsharpyuv_sse2_la_CFLAGS) $(CFLAGS) -c -o libsharpyuv_sse2_la-sharpyuv_sse2.lo `test -f 'sharpyuv_sse2.c' || echo '$(srcdir)/'`sharpyuv_sse2.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-libsharpyuvincludeHEADERS: $(libsharpyuvinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libsharpyuvinclude_HEADERS)'; test -n "$(libsharpyuvincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libsharpyuvincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libsharpyuvincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libsharpyuvincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libsharpyuvincludedir)" || exit $$?; \ done uninstall-libsharpyuvincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libsharpyuvinclude_HEADERS)'; test -n "$(libsharpyuvincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libsharpyuvincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(libsharpyuvincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Plo -rm -f ./$(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Plo -rm -f ./$(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libsharpyuvincludeHEADERS \ install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_cpu.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_csp.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_dsp.Plo -rm -f ./$(DEPDIR)/libsharpyuv_la-sharpyuv_gamma.Plo -rm -f ./$(DEPDIR)/libsharpyuv_neon_la-sharpyuv_neon.Plo -rm -f ./$(DEPDIR)/libsharpyuv_sse2_la-sharpyuv_sse2.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-libsharpyuvincludeHEADERS uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-libsharpyuvincludeHEADERS \ install-man install-pdf install-pdf-am install-pkgconfigDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-libsharpyuvincludeHEADERS uninstall-pkgconfigDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/sharpyuv/sharpyuv_gamma.c0000644000014400001440000003242614606317060015132 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Gamma correction utilities. #include "sharpyuv/sharpyuv_gamma.h" #include #include #include #include "src/webp/types.h" // Gamma correction compensates loss of resolution during chroma subsampling. // Size of pre-computed table for converting from gamma to linear. #define GAMMA_TO_LINEAR_TAB_BITS 10 #define GAMMA_TO_LINEAR_TAB_SIZE (1 << GAMMA_TO_LINEAR_TAB_BITS) static uint32_t kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 2]; #define LINEAR_TO_GAMMA_TAB_BITS 9 #define LINEAR_TO_GAMMA_TAB_SIZE (1 << LINEAR_TO_GAMMA_TAB_BITS) static uint32_t kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 2]; static const double kGammaF = 1. / 0.45; #define GAMMA_TO_LINEAR_BITS 16 static volatile int kGammaTablesSOk = 0; void SharpYuvInitGammaTables(void) { assert(GAMMA_TO_LINEAR_BITS <= 16); if (!kGammaTablesSOk) { int v; const double a = 0.09929682680944; const double thresh = 0.018053968510807; const double final_scale = 1 << GAMMA_TO_LINEAR_BITS; // Precompute gamma to linear table. { const double norm = 1. / GAMMA_TO_LINEAR_TAB_SIZE; const double a_rec = 1. / (1. + a); for (v = 0; v <= GAMMA_TO_LINEAR_TAB_SIZE; ++v) { const double g = norm * v; double value; if (g <= thresh * 4.5) { value = g / 4.5; } else { value = pow(a_rec * (g + a), kGammaF); } kGammaToLinearTabS[v] = (uint32_t)(value * final_scale + .5); } // to prevent small rounding errors to cause read-overflow: kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE + 1] = kGammaToLinearTabS[GAMMA_TO_LINEAR_TAB_SIZE]; } // Precompute linear to gamma table. { const double scale = 1. / LINEAR_TO_GAMMA_TAB_SIZE; for (v = 0; v <= LINEAR_TO_GAMMA_TAB_SIZE; ++v) { const double g = scale * v; double value; if (g <= thresh) { value = 4.5 * g; } else { value = (1. + a) * pow(g, 1. / kGammaF) - a; } kLinearToGammaTabS[v] = (uint32_t)(final_scale * value + 0.5); } // to prevent small rounding errors to cause read-overflow: kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE + 1] = kLinearToGammaTabS[LINEAR_TO_GAMMA_TAB_SIZE]; } kGammaTablesSOk = 1; } } static WEBP_INLINE int Shift(int v, int shift) { return (shift >= 0) ? (v << shift) : (v >> -shift); } static WEBP_INLINE uint32_t FixedPointInterpolation(int v, uint32_t* tab, int tab_pos_shift_right, int tab_value_shift) { const uint32_t tab_pos = Shift(v, -tab_pos_shift_right); // fractional part, in 'tab_pos_shift' fixed-point precision const uint32_t x = v - (tab_pos << tab_pos_shift_right); // fractional part // v0 / v1 are in kGammaToLinearBits fixed-point precision (range [0..1]) const uint32_t v0 = Shift(tab[tab_pos + 0], tab_value_shift); const uint32_t v1 = Shift(tab[tab_pos + 1], tab_value_shift); // Final interpolation. const uint32_t v2 = (v1 - v0) * x; // note: v1 >= v0. const int half = (tab_pos_shift_right > 0) ? 1 << (tab_pos_shift_right - 1) : 0; const uint32_t result = v0 + ((v2 + half) >> tab_pos_shift_right); return result; } static uint32_t ToLinearSrgb(uint16_t v, int bit_depth) { const int shift = GAMMA_TO_LINEAR_TAB_BITS - bit_depth; if (shift > 0) { return kGammaToLinearTabS[v << shift]; } return FixedPointInterpolation(v, kGammaToLinearTabS, -shift, 0); } static uint16_t FromLinearSrgb(uint32_t value, int bit_depth) { return FixedPointInterpolation( value, kLinearToGammaTabS, (GAMMA_TO_LINEAR_BITS - LINEAR_TO_GAMMA_TAB_BITS), bit_depth - GAMMA_TO_LINEAR_BITS); } //////////////////////////////////////////////////////////////////////////////// #define CLAMP(x, low, high) \ (((x) < (low)) ? (low) : (((high) < (x)) ? (high) : (x))) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) static WEBP_INLINE float Roundf(float x) { if (x < 0) return (float)ceil((double)(x - 0.5f)); else return (float)floor((double)(x + 0.5f)); } static WEBP_INLINE float Powf(float base, float exp) { return (float)pow((double)base, (double)exp); } static WEBP_INLINE float Log10f(float x) { return (float)log10((double)x); } static float ToLinear709(float gamma) { if (gamma < 0.f) { return 0.f; } else if (gamma < 4.5f * 0.018053968510807f) { return gamma / 4.5f; } else if (gamma < 1.f) { return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f); } return 1.f; } static float FromLinear709(float linear) { if (linear < 0.f) { return 0.f; } else if (linear < 0.018053968510807f) { return linear * 4.5f; } else if (linear < 1.f) { return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f; } return 1.f; } static float ToLinear470M(float gamma) { return Powf(CLAMP(gamma, 0.f, 1.f), 2.2f); } static float FromLinear470M(float linear) { return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.2f); } static float ToLinear470Bg(float gamma) { return Powf(CLAMP(gamma, 0.f, 1.f), 2.8f); } static float FromLinear470Bg(float linear) { return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.8f); } static float ToLinearSmpte240(float gamma) { if (gamma < 0.f) { return 0.f; } else if (gamma < 4.f * 0.022821585529445f) { return gamma / 4.f; } else if (gamma < 1.f) { return Powf((gamma + 0.111572195921731f) / 1.111572195921731f, 1.f / 0.45f); } return 1.f; } static float FromLinearSmpte240(float linear) { if (linear < 0.f) { return 0.f; } else if (linear < 0.022821585529445f) { return linear * 4.f; } else if (linear < 1.f) { return 1.111572195921731f * Powf(linear, 0.45f) - 0.111572195921731f; } return 1.f; } static float ToLinearLog100(float gamma) { // The function is non-bijective so choose the middle of [0, 0.01]. const float mid_interval = 0.01f / 2.f; return (gamma <= 0.0f) ? mid_interval : Powf(10.0f, 2.f * (MIN(gamma, 1.f) - 1.0f)); } static float FromLinearLog100(float linear) { return (linear < 0.01f) ? 0.0f : 1.0f + Log10f(MIN(linear, 1.f)) / 2.0f; } static float ToLinearLog100Sqrt10(float gamma) { // The function is non-bijective so choose the middle of [0, 0.00316227766f[. const float mid_interval = 0.00316227766f / 2.f; return (gamma <= 0.0f) ? mid_interval : Powf(10.0f, 2.5f * (MIN(gamma, 1.f) - 1.0f)); } static float FromLinearLog100Sqrt10(float linear) { return (linear < 0.00316227766f) ? 0.0f : 1.0f + Log10f(MIN(linear, 1.f)) / 2.5f; } static float ToLinearIec61966(float gamma) { if (gamma <= -4.5f * 0.018053968510807f) { return Powf((-gamma + 0.09929682680944f) / -1.09929682680944f, 1.f / 0.45f); } else if (gamma < 4.5f * 0.018053968510807f) { return gamma / 4.5f; } return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f); } static float FromLinearIec61966(float linear) { if (linear <= -0.018053968510807f) { return -1.09929682680944f * Powf(-linear, 0.45f) + 0.09929682680944f; } else if (linear < 0.018053968510807f) { return linear * 4.5f; } return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f; } static float ToLinearBt1361(float gamma) { if (gamma < -0.25f) { return -0.25f; } else if (gamma < 0.f) { return Powf((gamma - 0.02482420670236f) / -0.27482420670236f, 1.f / 0.45f) / -4.f; } else if (gamma < 4.5f * 0.018053968510807f) { return gamma / 4.5f; } else if (gamma < 1.f) { return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f); } return 1.f; } static float FromLinearBt1361(float linear) { if (linear < -0.25f) { return -0.25f; } else if (linear < 0.f) { return -0.27482420670236f * Powf(-4.f * linear, 0.45f) + 0.02482420670236f; } else if (linear < 0.018053968510807f) { return linear * 4.5f; } else if (linear < 1.f) { return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f; } return 1.f; } static float ToLinearPq(float gamma) { if (gamma > 0.f) { const float pow_gamma = Powf(gamma, 32.f / 2523.f); const float num = MAX(pow_gamma - 107.f / 128.f, 0.0f); const float den = MAX(2413.f / 128.f - 2392.f / 128.f * pow_gamma, FLT_MIN); return Powf(num / den, 4096.f / 653.f); } return 0.f; } static float FromLinearPq(float linear) { if (linear > 0.f) { const float pow_linear = Powf(linear, 653.f / 4096.f); const float num = 107.f / 128.f + 2413.f / 128.f * pow_linear; const float den = 1.0f + 2392.f / 128.f * pow_linear; return Powf(num / den, 2523.f / 32.f); } return 0.f; } static float ToLinearSmpte428(float gamma) { return Powf(MAX(gamma, 0.f), 2.6f) / 0.91655527974030934f; } static float FromLinearSmpte428(float linear) { return Powf(0.91655527974030934f * MAX(linear, 0.f), 1.f / 2.6f); } // Conversion in BT.2100 requires RGB info. Simplify to gamma correction here. static float ToLinearHlg(float gamma) { if (gamma < 0.f) { return 0.f; } else if (gamma <= 0.5f) { return Powf((gamma * gamma) * (1.f / 3.f), 1.2f); } return Powf((expf((gamma - 0.55991073f) / 0.17883277f) + 0.28466892f) / 12.0f, 1.2f); } static float FromLinearHlg(float linear) { linear = Powf(linear, 1.f / 1.2f); if (linear < 0.f) { return 0.f; } else if (linear <= (1.f / 12.f)) { return sqrtf(3.f * linear); } return 0.17883277f * logf(12.f * linear - 0.28466892f) + 0.55991073f; } uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth, SharpYuvTransferFunctionType transfer_type) { float v_float, linear; if (transfer_type == kSharpYuvTransferFunctionSrgb) { return ToLinearSrgb(v, bit_depth); } v_float = (float)v / ((1 << bit_depth) - 1); switch (transfer_type) { case kSharpYuvTransferFunctionBt709: case kSharpYuvTransferFunctionBt601: case kSharpYuvTransferFunctionBt2020_10Bit: case kSharpYuvTransferFunctionBt2020_12Bit: linear = ToLinear709(v_float); break; case kSharpYuvTransferFunctionBt470M: linear = ToLinear470M(v_float); break; case kSharpYuvTransferFunctionBt470Bg: linear = ToLinear470Bg(v_float); break; case kSharpYuvTransferFunctionSmpte240: linear = ToLinearSmpte240(v_float); break; case kSharpYuvTransferFunctionLinear: return v; case kSharpYuvTransferFunctionLog100: linear = ToLinearLog100(v_float); break; case kSharpYuvTransferFunctionLog100_Sqrt10: linear = ToLinearLog100Sqrt10(v_float); break; case kSharpYuvTransferFunctionIec61966: linear = ToLinearIec61966(v_float); break; case kSharpYuvTransferFunctionBt1361: linear = ToLinearBt1361(v_float); break; case kSharpYuvTransferFunctionSmpte2084: linear = ToLinearPq(v_float); break; case kSharpYuvTransferFunctionSmpte428: linear = ToLinearSmpte428(v_float); break; case kSharpYuvTransferFunctionHlg: linear = ToLinearHlg(v_float); break; default: assert(0); linear = 0; break; } return (uint32_t)Roundf(linear * ((1 << 16) - 1)); } uint16_t SharpYuvLinearToGamma(uint32_t v, int bit_depth, SharpYuvTransferFunctionType transfer_type) { float v_float, linear; if (transfer_type == kSharpYuvTransferFunctionSrgb) { return FromLinearSrgb(v, bit_depth); } v_float = (float)v / ((1 << 16) - 1); switch (transfer_type) { case kSharpYuvTransferFunctionBt709: case kSharpYuvTransferFunctionBt601: case kSharpYuvTransferFunctionBt2020_10Bit: case kSharpYuvTransferFunctionBt2020_12Bit: linear = FromLinear709(v_float); break; case kSharpYuvTransferFunctionBt470M: linear = FromLinear470M(v_float); break; case kSharpYuvTransferFunctionBt470Bg: linear = FromLinear470Bg(v_float); break; case kSharpYuvTransferFunctionSmpte240: linear = FromLinearSmpte240(v_float); break; case kSharpYuvTransferFunctionLinear: return v; case kSharpYuvTransferFunctionLog100: linear = FromLinearLog100(v_float); break; case kSharpYuvTransferFunctionLog100_Sqrt10: linear = FromLinearLog100Sqrt10(v_float); break; case kSharpYuvTransferFunctionIec61966: linear = FromLinearIec61966(v_float); break; case kSharpYuvTransferFunctionBt1361: linear = FromLinearBt1361(v_float); break; case kSharpYuvTransferFunctionSmpte2084: linear = FromLinearPq(v_float); break; case kSharpYuvTransferFunctionSmpte428: linear = FromLinearSmpte428(v_float); break; case kSharpYuvTransferFunctionHlg: linear = FromLinearHlg(v_float); break; default: assert(0); linear = 0; break; } return (uint16_t)Roundf(linear * ((1 << bit_depth) - 1)); } libwebp-1.4.0/sharpyuv/libsharpyuv.rc0000644000014400001440000000201014606317060014623 0ustar #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" #undef APSTUDIO_READONLY_SYMBOLS #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO FILEVERSION 0,0,4,0 PRODUCTVERSION 0,0,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Google, Inc." VALUE "FileDescription", "libsharpyuv DLL" VALUE "FileVersion", "0.4.0" VALUE "InternalName", "libsharpyuv.dll" VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "libsharpyuv.dll" VALUE "ProductName", "SharpYuv Library" VALUE "ProductVersion", "0.4.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources libwebp-1.4.0/sharpyuv/sharpyuv_cpu.c0000644000014400001440000000121414606317060014626 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // #include "sharpyuv/sharpyuv_cpu.h" // Include src/dsp/cpu.c to create SharpYuvGetCPUInfo from VP8GetCPUInfo. The // function pointer is renamed in sharpyuv_cpu.h. #include "src/dsp/cpu.c" libwebp-1.4.0/sharpyuv/sharpyuv_cpu.h0000644000014400001440000000152714606317060014642 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // #ifndef WEBP_SHARPYUV_SHARPYUV_CPU_H_ #define WEBP_SHARPYUV_SHARPYUV_CPU_H_ #include "sharpyuv/sharpyuv.h" // Avoid exporting SharpYuvGetCPUInfo in shared object / DLL builds. // SharpYuvInit() replaces the use of the function pointer. #undef WEBP_EXTERN #define WEBP_EXTERN extern #define VP8GetCPUInfo SharpYuvGetCPUInfo #include "src/dsp/cpu.h" #endif // WEBP_SHARPYUV_SHARPYUV_CPU_H_ libwebp-1.4.0/sharpyuv/sharpyuv.h0000644000014400001440000001607314606317060013775 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Sharp RGB to YUV conversion. #ifndef WEBP_SHARPYUV_SHARPYUV_H_ #define WEBP_SHARPYUV_SHARPYUV_H_ #ifdef __cplusplus extern "C" { #endif #ifndef SHARPYUV_EXTERN #ifdef WEBP_EXTERN #define SHARPYUV_EXTERN WEBP_EXTERN #else // This explicitly marks library functions and allows for changing the // signature for e.g., Windows DLL builds. #if defined(_WIN32) && defined(WEBP_DLL) #define SHARPYUV_EXTERN __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 #define SHARPYUV_EXTERN extern __attribute__((visibility("default"))) #else #define SHARPYUV_EXTERN extern #endif /* defined(_WIN32) && defined(WEBP_DLL) */ #endif /* WEBP_EXTERN */ #endif /* SHARPYUV_EXTERN */ #ifndef SHARPYUV_INLINE #ifdef WEBP_INLINE #define SHARPYUV_INLINE WEBP_INLINE #else #ifndef _MSC_VER #if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) #define SHARPYUV_INLINE inline #else #define SHARPYUV_INLINE #endif #else #define SHARPYUV_INLINE __forceinline #endif /* _MSC_VER */ #endif /* WEBP_INLINE */ #endif /* SHARPYUV_INLINE */ // SharpYUV API version following the convention from semver.org #define SHARPYUV_VERSION_MAJOR 0 #define SHARPYUV_VERSION_MINOR 4 #define SHARPYUV_VERSION_PATCH 0 // Version as a uint32_t. The major number is the high 8 bits. // The minor number is the middle 8 bits. The patch number is the low 16 bits. #define SHARPYUV_MAKE_VERSION(MAJOR, MINOR, PATCH) \ (((MAJOR) << 24) | ((MINOR) << 16) | (PATCH)) #define SHARPYUV_VERSION \ SHARPYUV_MAKE_VERSION(SHARPYUV_VERSION_MAJOR, SHARPYUV_VERSION_MINOR, \ SHARPYUV_VERSION_PATCH) // Returns the library's version number, packed in hexadecimal. See // SHARPYUV_VERSION. SHARPYUV_EXTERN int SharpYuvGetVersion(void); // RGB to YUV conversion matrix, in 16 bit fixed point. // y = rgb_to_y[0] * r + rgb_to_y[1] * g + rgb_to_y[2] * b + rgb_to_y[3] // u = rgb_to_u[0] * r + rgb_to_u[1] * g + rgb_to_u[2] * b + rgb_to_u[3] // v = rgb_to_v[0] * r + rgb_to_v[1] * g + rgb_to_v[2] * b + rgb_to_v[3] // Then y, u and v values are divided by 1<<16 and rounded. typedef struct { int rgb_to_y[4]; int rgb_to_u[4]; int rgb_to_v[4]; } SharpYuvConversionMatrix; typedef struct SharpYuvOptions SharpYuvOptions; // Enums for transfer functions, as defined in H.273, // https://www.itu.int/rec/T-REC-H.273-202107-I/en typedef enum SharpYuvTransferFunctionType { // 0 is reserved kSharpYuvTransferFunctionBt709 = 1, // 2 is unspecified // 3 is reserved kSharpYuvTransferFunctionBt470M = 4, kSharpYuvTransferFunctionBt470Bg = 5, kSharpYuvTransferFunctionBt601 = 6, kSharpYuvTransferFunctionSmpte240 = 7, kSharpYuvTransferFunctionLinear = 8, kSharpYuvTransferFunctionLog100 = 9, kSharpYuvTransferFunctionLog100_Sqrt10 = 10, kSharpYuvTransferFunctionIec61966 = 11, kSharpYuvTransferFunctionBt1361 = 12, kSharpYuvTransferFunctionSrgb = 13, kSharpYuvTransferFunctionBt2020_10Bit = 14, kSharpYuvTransferFunctionBt2020_12Bit = 15, kSharpYuvTransferFunctionSmpte2084 = 16, // PQ kSharpYuvTransferFunctionSmpte428 = 17, kSharpYuvTransferFunctionHlg = 18, kSharpYuvTransferFunctionNum } SharpYuvTransferFunctionType; // Converts RGB to YUV420 using a downsampling algorithm that minimizes // artefacts caused by chroma subsampling. // This is slower than standard downsampling (averaging of 4 UV values). // Assumes that the image will be upsampled using a bilinear filter. If nearest // neighbor is used instead, the upsampled image might look worse than with // standard downsampling. // r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point // to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise. // rgb_step: distance in bytes between two horizontally adjacent pixels on the // r, g and b channels. If rgb_bit_depth is > 8, it should be a // multiple of 2. // rgb_stride: distance in bytes between two vertically adjacent pixels on the // r, g, and b channels. If rgb_bit_depth is > 8, it should be a // multiple of 2. // rgb_bit_depth: number of bits for each r/g/b value. One of: 8, 10, 12, 16. // Note: 16 bit input is truncated to 14 bits before conversion to yuv. // yuv_bit_depth: number of bits for each y/u/v value. One of: 8, 10, 12. // y_ptr, u_ptr, v_ptr: pointers to the destination y, u and v channels. Should // point to uint8_t buffers if yuv_bit_depth is 8, or uint16_t buffers // otherwise. // y_stride, u_stride, v_stride: distance in bytes between two vertically // adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they // should be multiples of 2. // width, height: width and height of the image in pixels // This function calls SharpYuvConvertWithOptions with a default transfer // function of kSharpYuvTransferFunctionSrgb. SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, void* y_ptr, int y_stride, void* u_ptr, int u_stride, void* v_ptr, int v_stride, int yuv_bit_depth, int width, int height, const SharpYuvConversionMatrix* yuv_matrix); struct SharpYuvOptions { // This matrix cannot be NULL and can be initialized by // SharpYuvComputeConversionMatrix. const SharpYuvConversionMatrix* yuv_matrix; SharpYuvTransferFunctionType transfer_type; }; // Internal, version-checked, entry point SHARPYUV_EXTERN int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix*, SharpYuvOptions*, int); // Should always be called, to initialize a fresh SharpYuvOptions // structure before modification. SharpYuvOptionsInit() must have succeeded // before using the 'options' object. static SHARPYUV_INLINE int SharpYuvOptionsInit( const SharpYuvConversionMatrix* yuv_matrix, SharpYuvOptions* options) { return SharpYuvOptionsInitInternal(yuv_matrix, options, SHARPYUV_VERSION); } SHARPYUV_EXTERN int SharpYuvConvertWithOptions( const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step, int rgb_stride, int rgb_bit_depth, void* y_ptr, int y_stride, void* u_ptr, int u_stride, void* v_ptr, int v_stride, int yuv_bit_depth, int width, int height, const SharpYuvOptions* options); // TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422 // support (it's rarely used in practice, especially for images). #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_SHARPYUV_SHARPYUV_H_ libwebp-1.4.0/sharpyuv/sharpyuv_gamma.h0000644000014400001440000000247714606317060015142 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Gamma correction utilities. #ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_ #define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_ #include "sharpyuv/sharpyuv.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Initializes precomputed tables. Must be called once before calling // SharpYuvGammaToLinear or SharpYuvLinearToGamma. void SharpYuvInitGammaTables(void); // Converts a 'bit_depth'-bit gamma color value to a 16-bit linear value. uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth, SharpYuvTransferFunctionType transfer_type); // Converts a 16-bit linear color value to a 'bit_depth'-bit gamma value. uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth, SharpYuvTransferFunctionType transfer_type); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_SHARPYUV_SHARPYUV_GAMMA_H_ libwebp-1.4.0/examples/0000755000014400001440000000000014606317243011674 5ustar libwebp-1.4.0/examples/anim_util.h0000644000014400001440000000443614606317060014032 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for animated images #ifndef WEBP_EXAMPLES_ANIM_UTIL_H_ #define WEBP_EXAMPLES_ANIM_UTIL_H_ #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "webp/types.h" #ifdef __cplusplus extern "C" { #endif typedef enum { ANIM_GIF, ANIM_WEBP } AnimatedFileFormat; typedef struct { uint8_t* rgba; // Decoded and reconstructed full frame. int duration; // Frame duration in milliseconds. int is_key_frame; // True if this frame is a key-frame. } DecodedFrame; typedef struct { AnimatedFileFormat format; uint32_t canvas_width; uint32_t canvas_height; uint32_t bgcolor; uint32_t loop_count; DecodedFrame* frames; uint32_t num_frames; void* raw_mem; } AnimatedImage; // Deallocate everything in 'image' (but not the object itself). void ClearAnimatedImage(AnimatedImage* const image); // Read animated image file into 'AnimatedImage' struct. // If 'dump_frames' is true, dump frames to 'dump_folder'. // Previous content of 'image' is obliterated. // Upon successful return, content of 'image' must be deleted by // calling 'ClearAnimatedImage'. int ReadAnimatedImage(const char filename[], AnimatedImage* const image, int dump_frames, const char dump_folder[]); // Given two RGBA buffers, calculate max pixel difference and PSNR. // If 'premultiply' is true, R/G/B values will be pre-multiplied by the // transparency before comparison. void GetDiffAndPSNR(const uint8_t rgba1[], const uint8_t rgba2[], uint32_t width, uint32_t height, int premultiply, int* const max_diff, double* const psnr); // Return library versions used by anim_util. void GetAnimatedImageVersions(int* const decoder_version, int* const demux_version); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_EXAMPLES_ANIM_UTIL_H_ libwebp-1.4.0/examples/cwebp.c0000644000014400001440000013740614606317060013150 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // simple command line calling the WebPEncode function. // Encodes a raw .YUV into WebP bitstream // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "../examples/example_util.h" #include "../imageio/image_dec.h" #include "../imageio/imageio_util.h" #include "../imageio/webpdec.h" #include "./stopwatch.h" #include "./unicode.h" #include "sharpyuv/sharpyuv.h" #include "webp/encode.h" #ifndef WEBP_DLL #ifdef __cplusplus extern "C" { #endif extern void* VP8GetCPUInfo; // opaque forward declaration. #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DLL //------------------------------------------------------------------------------ static int verbose = 0; static int ReadYUV(const uint8_t* const data, size_t data_size, WebPPicture* const pic) { const int use_argb = pic->use_argb; const int uv_width = (pic->width + 1) / 2; const int uv_height = (pic->height + 1) / 2; const int y_plane_size = pic->width * pic->height; const int uv_plane_size = uv_width * uv_height; const size_t expected_data_size = y_plane_size + 2 * uv_plane_size; if (data_size != expected_data_size) { fprintf(stderr, "input data doesn't have the expected size (%d instead of %d)\n", (int)data_size, (int)expected_data_size); return 0; } pic->use_argb = 0; if (!WebPPictureAlloc(pic)) return 0; ImgIoUtilCopyPlane(data, pic->width, pic->y, pic->y_stride, pic->width, pic->height); ImgIoUtilCopyPlane(data + y_plane_size, uv_width, pic->u, pic->uv_stride, uv_width, uv_height); ImgIoUtilCopyPlane(data + y_plane_size + uv_plane_size, uv_width, pic->v, pic->uv_stride, uv_width, uv_height); return use_argb ? WebPPictureYUVAToARGB(pic) : 1; } #ifdef HAVE_WINCODEC_H static int ReadPicture(const char* const filename, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { int ok = 0; const uint8_t* data = NULL; size_t data_size = 0; if (pic->width != 0 && pic->height != 0) { ok = ImgIoUtilReadFile(filename, &data, &data_size); ok = ok && ReadYUV(data, data_size, pic); } else { // If no size specified, try to decode it using WIC. ok = ReadPictureWithWIC(filename, pic, keep_alpha, metadata); if (!ok) { ok = ImgIoUtilReadFile(filename, &data, &data_size); ok = ok && ReadWebP(data, data_size, pic, keep_alpha, metadata); } } if (!ok) { WFPRINTF(stderr, "Error! Could not process file %s\n", (const W_CHAR*)filename); } WebPFree((void*)data); return ok; } #else // !HAVE_WINCODEC_H static int ReadPicture(const char* const filename, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { const uint8_t* data = NULL; size_t data_size = 0; int ok = 0; ok = ImgIoUtilReadFile(filename, &data, &data_size); if (!ok) goto End; if (pic->width == 0 || pic->height == 0) { WebPImageReader reader = WebPGuessImageReader(data, data_size); ok = reader(data, data_size, pic, keep_alpha, metadata); } else { // If image size is specified, infer it as YUV format. ok = ReadYUV(data, data_size, pic); } End: if (!ok) { WFPRINTF(stderr, "Error! Could not process file %s\n", (const W_CHAR*)filename); } WebPFree((void*)data); return ok; } #endif // !HAVE_WINCODEC_H static void AllocExtraInfo(WebPPicture* const pic) { const int mb_w = (pic->width + 15) / 16; const int mb_h = (pic->height + 15) / 16; pic->extra_info = (uint8_t*)WebPMalloc(mb_w * mb_h * sizeof(*pic->extra_info)); } static void PrintByteCount(const int bytes[4], int total_size, int* const totals) { int s; int total = 0; for (s = 0; s < 4; ++s) { fprintf(stderr, "| %7d ", bytes[s]); total += bytes[s]; if (totals) totals[s] += bytes[s]; } fprintf(stderr, "| %7d (%.1f%%)\n", total, 100.f * total / total_size); } static void PrintPercents(const int counts[4]) { int s; const int total = counts[0] + counts[1] + counts[2] + counts[3]; for (s = 0; s < 4; ++s) { fprintf(stderr, "| %3d%%", (int)(100. * counts[s] / total + .5)); } fprintf(stderr, "| %7d\n", total); } static void PrintValues(const int values[4]) { int s; for (s = 0; s < 4; ++s) { fprintf(stderr, "| %7d ", values[s]); } fprintf(stderr, "|\n"); } static void PrintFullLosslessInfo(const WebPAuxStats* const stats, const char* const description) { fprintf(stderr, "Lossless-%s compressed size: %d bytes\n", description, stats->lossless_size); fprintf(stderr, " * Header size: %d bytes, image data size: %d\n", stats->lossless_hdr_size, stats->lossless_data_size); if (stats->lossless_features) { fprintf(stderr, " * Lossless features used:"); if (stats->lossless_features & 1) fprintf(stderr, " PREDICTION"); if (stats->lossless_features & 2) fprintf(stderr, " CROSS-COLOR-TRANSFORM"); if (stats->lossless_features & 4) fprintf(stderr, " SUBTRACT-GREEN"); if (stats->lossless_features & 8) fprintf(stderr, " PALETTE"); fprintf(stderr, "\n"); } fprintf(stderr, " * Precision Bits: histogram=%d transform=%d cache=%d\n", stats->histogram_bits, stats->transform_bits, stats->cache_bits); if (stats->palette_size > 0) { fprintf(stderr, " * Palette size: %d\n", stats->palette_size); } } static void PrintExtraInfoLossless(const WebPPicture* const pic, int short_output, const char* const file_name) { const WebPAuxStats* const stats = pic->stats; if (short_output) { fprintf(stderr, "%7d %2.2f\n", stats->coded_size, stats->PSNR[3]); } else { WFPRINTF(stderr, "File: %s\n", (const W_CHAR*)file_name); fprintf(stderr, "Dimension: %d x %d\n", pic->width, pic->height); fprintf(stderr, "Output: %d bytes (%.2f bpp)\n", stats->coded_size, 8.f * stats->coded_size / pic->width / pic->height); PrintFullLosslessInfo(stats, "ARGB"); } } static void PrintExtraInfoLossy(const WebPPicture* const pic, int short_output, int full_details, const char* const file_name) { const WebPAuxStats* const stats = pic->stats; if (short_output) { fprintf(stderr, "%7d %2.2f\n", stats->coded_size, stats->PSNR[3]); } else { const int num_i4 = stats->block_count[0]; const int num_i16 = stats->block_count[1]; const int num_skip = stats->block_count[2]; const int total = num_i4 + num_i16; WFPRINTF(stderr, "File: %s\n", (const W_CHAR*)file_name); fprintf(stderr, "Dimension: %d x %d%s\n", pic->width, pic->height, stats->alpha_data_size ? " (with alpha)" : ""); fprintf(stderr, "Output: " "%d bytes Y-U-V-All-PSNR %2.2f %2.2f %2.2f %2.2f dB\n" " (%.2f bpp)\n", stats->coded_size, stats->PSNR[0], stats->PSNR[1], stats->PSNR[2], stats->PSNR[3], 8.f * stats->coded_size / pic->width / pic->height); if (total > 0) { int totals[4] = { 0, 0, 0, 0 }; fprintf(stderr, "block count: intra4: %6d (%.2f%%)\n" " intra16: %6d (%.2f%%)\n" " skipped: %6d (%.2f%%)\n", num_i4, 100.f * num_i4 / total, num_i16, 100.f * num_i16 / total, num_skip, 100.f * num_skip / total); fprintf(stderr, "bytes used: header: %6d (%.1f%%)\n" " mode-partition: %6d (%.1f%%)\n", stats->header_bytes[0], 100.f * stats->header_bytes[0] / stats->coded_size, stats->header_bytes[1], 100.f * stats->header_bytes[1] / stats->coded_size); if (stats->alpha_data_size > 0) { fprintf(stderr, " transparency: %6d (%.1f dB)\n", stats->alpha_data_size, stats->PSNR[4]); } fprintf(stderr, " Residuals bytes " "|segment 1|segment 2|segment 3" "|segment 4| total\n"); if (full_details) { fprintf(stderr, " intra4-coeffs: "); PrintByteCount(stats->residual_bytes[0], stats->coded_size, totals); fprintf(stderr, " intra16-coeffs: "); PrintByteCount(stats->residual_bytes[1], stats->coded_size, totals); fprintf(stderr, " chroma coeffs: "); PrintByteCount(stats->residual_bytes[2], stats->coded_size, totals); } fprintf(stderr, " macroblocks: "); PrintPercents(stats->segment_size); fprintf(stderr, " quantizer: "); PrintValues(stats->segment_quant); fprintf(stderr, " filter level: "); PrintValues(stats->segment_level); if (full_details) { fprintf(stderr, "------------------+---------"); fprintf(stderr, "+---------+---------+---------+-----------------\n"); fprintf(stderr, " segments total: "); PrintByteCount(totals, stats->coded_size, NULL); } } if (stats->lossless_size > 0) { PrintFullLosslessInfo(stats, "alpha"); } } } static void PrintMapInfo(const WebPPicture* const pic) { if (pic->extra_info != NULL) { const int mb_w = (pic->width + 15) / 16; const int mb_h = (pic->height + 15) / 16; const int type = pic->extra_info_type; int x, y; for (y = 0; y < mb_h; ++y) { for (x = 0; x < mb_w; ++x) { const int c = pic->extra_info[x + y * mb_w]; if (type == 1) { // intra4/intra16 fprintf(stderr, "%c", "+."[c]); } else if (type == 2) { // segments fprintf(stderr, "%c", ".-*X"[c]); } else if (type == 3) { // quantizers fprintf(stderr, "%.2d ", c); } else if (type == 6 || type == 7) { fprintf(stderr, "%3d ", c); } else { fprintf(stderr, "0x%.2x ", c); } } fprintf(stderr, "\n"); } } } //------------------------------------------------------------------------------ static int MyWriter(const uint8_t* data, size_t data_size, const WebPPicture* const pic) { FILE* const out = (FILE*)pic->custom_ptr; return data_size ? (fwrite(data, data_size, 1, out) == 1) : 1; } // Dumps a picture as a PGM file using the IMC4 layout. static int DumpPicture(const WebPPicture* const picture, const char* PGM_name) { int y; int ok = 0; const int uv_width = (picture->width + 1) / 2; const int uv_height = (picture->height + 1) / 2; const int stride = (picture->width + 1) & ~1; const uint8_t* src_y = picture->y; const uint8_t* src_u = picture->u; const uint8_t* src_v = picture->v; const uint8_t* src_a = picture->a; const int alpha_height = WebPPictureHasTransparency(picture) ? picture->height : 0; const int height = picture->height + uv_height + alpha_height; FILE* const f = WFOPEN(PGM_name, "wb"); if (f == NULL) return 0; fprintf(f, "P5\n%d %d\n255\n", stride, height); for (y = 0; y < picture->height; ++y) { if (fwrite(src_y, picture->width, 1, f) != 1) goto Error; if (picture->width & 1) fputc(0, f); // pad src_y += picture->y_stride; } for (y = 0; y < uv_height; ++y) { if (fwrite(src_u, uv_width, 1, f) != 1) goto Error; if (fwrite(src_v, uv_width, 1, f) != 1) goto Error; src_u += picture->uv_stride; src_v += picture->uv_stride; } for (y = 0; y < alpha_height; ++y) { if (fwrite(src_a, picture->width, 1, f) != 1) goto Error; if (picture->width & 1) fputc(0, f); // pad src_a += picture->a_stride; } ok = 1; Error: fclose(f); return ok; } // ----------------------------------------------------------------------------- // Metadata writing. enum { METADATA_EXIF = (1 << 0), METADATA_ICC = (1 << 1), METADATA_XMP = (1 << 2), METADATA_ALL = METADATA_EXIF | METADATA_ICC | METADATA_XMP }; static const int kChunkHeaderSize = 8; static const int kTagSize = 4; static void PrintMetadataInfo(const Metadata* const metadata, int metadata_written) { if (metadata == NULL || metadata_written == 0) return; fprintf(stderr, "Metadata:\n"); if (metadata_written & METADATA_ICC) { fprintf(stderr, " * ICC profile: %6d bytes\n", (int)metadata->iccp.size); } if (metadata_written & METADATA_EXIF) { fprintf(stderr, " * EXIF data: %6d bytes\n", (int)metadata->exif.size); } if (metadata_written & METADATA_XMP) { fprintf(stderr, " * XMP data: %6d bytes\n", (int)metadata->xmp.size); } } // Outputs, in little endian, 'num' bytes from 'val' to 'out'. static int WriteLE(FILE* const out, uint32_t val, int num) { uint8_t buf[4]; int i; for (i = 0; i < num; ++i) { buf[i] = (uint8_t)(val & 0xff); val >>= 8; } return (fwrite(buf, num, 1, out) == 1); } static int WriteLE24(FILE* const out, uint32_t val) { return WriteLE(out, val, 3); } static int WriteLE32(FILE* const out, uint32_t val) { return WriteLE(out, val, 4); } static int WriteMetadataChunk(FILE* const out, const char fourcc[4], const MetadataPayload* const payload) { const uint8_t zero = 0; const size_t need_padding = payload->size & 1; int ok = (fwrite(fourcc, kTagSize, 1, out) == 1); ok = ok && WriteLE32(out, (uint32_t)payload->size); ok = ok && (fwrite(payload->bytes, payload->size, 1, out) == 1); return ok && (fwrite(&zero, need_padding, need_padding, out) == need_padding); } // Sets 'flag' in 'vp8x_flags' and updates 'metadata_size' with the size of the // chunk if there is metadata and 'keep' is true. static int UpdateFlagsAndSize(const MetadataPayload* const payload, int keep, int flag, uint32_t* vp8x_flags, uint64_t* metadata_size) { if (keep && payload->bytes != NULL && payload->size > 0) { *vp8x_flags |= flag; *metadata_size += kChunkHeaderSize + payload->size + (payload->size & 1); return 1; } return 0; } // Writes a WebP file using the image contained in 'memory_writer' and the // metadata from 'metadata'. Metadata is controlled by 'keep_metadata' and the // availability in 'metadata'. Returns true on success. // For details see doc/webp-container-spec.txt#extended-file-format. static int WriteWebPWithMetadata(FILE* const out, const WebPPicture* const picture, const WebPMemoryWriter* const memory_writer, const Metadata* const metadata, int keep_metadata, int* const metadata_written) { const char kVP8XHeader[] = "VP8X\x0a\x00\x00\x00"; const int kAlphaFlag = 0x10; const int kEXIFFlag = 0x08; const int kICCPFlag = 0x20; const int kXMPFlag = 0x04; const size_t kRiffHeaderSize = 12; const size_t kMaxChunkPayload = ~0 - kChunkHeaderSize - 1; const size_t kMinSize = kRiffHeaderSize + kChunkHeaderSize; uint32_t flags = 0; uint64_t metadata_size = 0; const int write_exif = UpdateFlagsAndSize(&metadata->exif, !!(keep_metadata & METADATA_EXIF), kEXIFFlag, &flags, &metadata_size); const int write_iccp = UpdateFlagsAndSize(&metadata->iccp, !!(keep_metadata & METADATA_ICC), kICCPFlag, &flags, &metadata_size); const int write_xmp = UpdateFlagsAndSize(&metadata->xmp, !!(keep_metadata & METADATA_XMP), kXMPFlag, &flags, &metadata_size); uint8_t* webp = memory_writer->mem; size_t webp_size = memory_writer->size; *metadata_written = 0; if (webp_size < kMinSize) return 0; if (webp_size - kChunkHeaderSize + metadata_size > kMaxChunkPayload) { fprintf(stderr, "Error! Addition of metadata would exceed " "container size limit.\n"); return 0; } if (metadata_size > 0) { const int kVP8XChunkSize = 18; const int has_vp8x = !memcmp(webp + kRiffHeaderSize, "VP8X", kTagSize); const uint32_t riff_size = (uint32_t)(webp_size - kChunkHeaderSize + (has_vp8x ? 0 : kVP8XChunkSize) + metadata_size); // RIFF int ok = (fwrite(webp, kTagSize, 1, out) == 1); // RIFF size (file header size is not recorded) ok = ok && WriteLE32(out, riff_size); webp += kChunkHeaderSize; webp_size -= kChunkHeaderSize; // WEBP ok = ok && (fwrite(webp, kTagSize, 1, out) == 1); webp += kTagSize; webp_size -= kTagSize; if (has_vp8x) { // update the existing VP8X flags webp[kChunkHeaderSize] |= (uint8_t)(flags & 0xff); ok = ok && (fwrite(webp, kVP8XChunkSize, 1, out) == 1); webp += kVP8XChunkSize; webp_size -= kVP8XChunkSize; } else { const int is_lossless = !memcmp(webp, "VP8L", kTagSize); if (is_lossless) { // Presence of alpha is stored in the 37th bit (29th after the // signature) of VP8L data. if (webp[kChunkHeaderSize + 4] & (1 << 4)) flags |= kAlphaFlag; } ok = ok && (fwrite(kVP8XHeader, kChunkHeaderSize, 1, out) == 1); ok = ok && WriteLE32(out, flags); ok = ok && WriteLE24(out, picture->width - 1); ok = ok && WriteLE24(out, picture->height - 1); } if (write_iccp) { ok = ok && WriteMetadataChunk(out, "ICCP", &metadata->iccp); *metadata_written |= METADATA_ICC; } // Image ok = ok && (fwrite(webp, webp_size, 1, out) == 1); if (write_exif) { ok = ok && WriteMetadataChunk(out, "EXIF", &metadata->exif); *metadata_written |= METADATA_EXIF; } if (write_xmp) { ok = ok && WriteMetadataChunk(out, "XMP ", &metadata->xmp); *metadata_written |= METADATA_XMP; } return ok; } // No metadata, just write the original image file. return (fwrite(webp, webp_size, 1, out) == 1); } //------------------------------------------------------------------------------ static int ProgressReport(int percent, const WebPPicture* const picture) { fprintf(stderr, "[%s]: %3d %% \r", (char*)picture->user_data, percent); return 1; // all ok } //------------------------------------------------------------------------------ static void HelpShort(void) { printf("Usage:\n\n"); printf(" cwebp [options] -q quality input.png -o output.webp\n\n"); printf("where quality is between 0 (poor) to 100 (very good).\n"); printf("Typical value is around 80.\n\n"); printf("Try -longhelp for an exhaustive list of advanced options.\n"); } static void HelpLong(void) { printf("Usage:\n"); printf(" cwebp [-preset <...>] [options] in_file [-o out_file]\n\n"); printf("If input size (-s) for an image is not specified, it is\n" "assumed to be a PNG, JPEG, TIFF or WebP file.\n"); printf("Note: Animated PNG and WebP files are not supported.\n"); #ifdef HAVE_WINCODEC_H printf("Windows builds can take as input any of the files handled by WIC.\n"); #endif printf("\nOptions:\n"); printf(" -h / -help ............. short help\n"); printf(" -H / -longhelp ......... long help\n"); printf(" -q ............. quality factor (0:small..100:big), " "default=75\n"); printf(" -alpha_q ......... transparency-compression quality (0..100)," "\n default=100\n"); printf(" -preset ....... preset setting, one of:\n"); printf(" default, photo, picture,\n"); printf(" drawing, icon, text\n"); printf(" -preset must come first, as it overwrites other parameters\n"); printf(" -z ............... activates lossless preset with given\n" " level in [0:fast, ..., 9:slowest]\n"); printf("\n"); printf(" -m ............... compression method (0=fast, 6=slowest), " "default=4\n"); printf(" -segments ........ number of segments to use (1..4), " "default=4\n"); printf(" -size ............ target size (in bytes)\n"); printf(" -psnr .......... target PSNR (in dB. typically: 42)\n"); printf("\n"); printf(" -s ......... input size (width x height) for YUV\n"); printf(" -sns ............. spatial noise shaping (0:off, 100:max), " "default=50\n"); printf(" -f ............... filter strength (0=off..100), " "default=60\n"); printf(" -sharpness ....... " "filter sharpness (0:most .. 7:least sharp), default=0\n"); printf(" -strong ................ use strong filter instead " "of simple (default)\n"); printf(" -nostrong .............. use simple filter instead of strong\n"); printf(" -sharp_yuv ............. use sharper (and slower) RGB->YUV " "conversion\n"); printf(" -partition_limit . limit quality to fit the 512k limit on\n"); printf(" " "the first partition (0=no degradation ... 100=full)\n"); printf(" -pass ............ analysis pass number (1..10)\n"); printf(" -qrange .... specifies the permissible quality range\n" " (default: 0 100)\n"); printf(" -crop .. crop picture with the given rectangle\n"); printf(" -resize ........ resize picture (*after* any cropping)\n"); printf(" -mt .................... use multi-threading if available\n"); printf(" -low_memory ............ reduce memory usage (slower encoding)\n"); printf(" -map ............. print map of extra info\n"); printf(" -print_psnr ............ prints averaged PSNR distortion\n"); printf(" -print_ssim ............ prints averaged SSIM distortion\n"); printf(" -print_lsim ............ prints local-similarity distortion\n"); printf(" -d .......... dump the compressed output (PGM file)\n"); printf(" -alpha_method .... transparency-compression method (0..1), " "default=1\n"); printf(" -alpha_filter . predictive filtering for alpha plane,\n"); printf(" one of: none, fast (default) or best\n"); printf(" -exact ................. preserve RGB values in transparent area, " "default=off\n"); printf(" -blend_alpha ..... blend colors against background color\n" " expressed as RGB values written in\n" " hexadecimal, e.g. 0xc0e0d0 for red=0xc0\n" " green=0xe0 and blue=0xd0\n"); printf(" -noalpha ............... discard any transparency information\n"); printf(" -lossless .............. encode image losslessly, default=off\n"); printf(" -near_lossless ... use near-lossless image preprocessing\n" " (0..100=off), default=100\n"); printf(" -hint ......... specify image characteristics hint,\n"); printf(" one of: photo, picture or graph\n"); printf("\n"); printf(" -metadata ..... comma separated list of metadata to\n"); printf(" "); printf("copy from the input to the output if present.\n"); printf(" " "Valid values: all, none (default), exif, icc, xmp\n"); printf("\n"); printf(" -short ................. condense printed message\n"); printf(" -quiet ................. don't print anything\n"); printf(" -version ............... print version number and exit\n"); #ifndef WEBP_DLL printf(" -noasm ................. disable all assembly optimizations\n"); #endif printf(" -v ..................... verbose, e.g. print encoding/decoding " "times\n"); printf(" -progress .............. report encoding progress\n"); printf("\n"); printf("Experimental Options:\n"); printf(" -jpeg_like ............. roughly match expected JPEG size\n"); printf(" -af .................... auto-adjust filter strength\n"); printf(" -pre ............. pre-processing filter\n"); printf("\n"); printf("Supported input formats:\n %s\n", WebPGetEnabledInputFileFormats()); } //------------------------------------------------------------------------------ // Error messages static const char* const kErrorMessages[VP8_ENC_ERROR_LAST] = { "OK", "OUT_OF_MEMORY: Out of memory allocating objects", "BITSTREAM_OUT_OF_MEMORY: Out of memory re-allocating byte buffer", "NULL_PARAMETER: NULL parameter passed to function", "INVALID_CONFIGURATION: configuration is invalid", "BAD_DIMENSION: Bad picture dimension. Maximum width and height " "allowed is 16383 pixels.", "PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k.\n" "To reduce the size of this partition, try using less segments " "with the -segments option, and eventually reduce the number of " "header bits using -partition_limit. More details are available " "in the manual (`man cwebp`)", "PARTITION_OVERFLOW: Partition is too big to fit 16M", "BAD_WRITE: Picture writer returned an I/O error", "FILE_TOO_BIG: File would be too big to fit in 4G", "USER_ABORT: encoding abort requested by user" }; //------------------------------------------------------------------------------ int main(int argc, const char* argv[]) { int return_value = -1; const char* in_file = NULL, *out_file = NULL, *dump_file = NULL; FILE* out = NULL; int c; int short_output = 0; int quiet = 0; int keep_alpha = 1; int blend_alpha = 0; uint32_t background_color = 0xffffffu; int crop = 0, crop_x = 0, crop_y = 0, crop_w = 0, crop_h = 0; int resize_w = 0, resize_h = 0; int lossless_preset = 6; int use_lossless_preset = -1; // -1=unset, 0=don't use, 1=use it int show_progress = 0; int keep_metadata = 0; int metadata_written = 0; WebPPicture picture; int print_distortion = -1; // -1=off, 0=PSNR, 1=SSIM, 2=LSIM WebPPicture original_picture; // when PSNR or SSIM is requested WebPConfig config; WebPAuxStats stats; WebPMemoryWriter memory_writer; int use_memory_writer; Metadata metadata; Stopwatch stop_watch; INIT_WARGV(argc, argv); MetadataInit(&metadata); WebPMemoryWriterInit(&memory_writer); if (!WebPPictureInit(&picture) || !WebPPictureInit(&original_picture) || !WebPConfigInit(&config)) { fprintf(stderr, "Error! Version mismatch!\n"); FREE_WARGV_AND_RETURN(-1); } if (argc == 1) { HelpShort(); FREE_WARGV_AND_RETURN(0); } for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { HelpShort(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) { HelpLong(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-o") && c + 1 < argc) { out_file = (const char*)GET_WARGV(argv, ++c); } else if (!strcmp(argv[c], "-d") && c + 1 < argc) { dump_file = (const char*)GET_WARGV(argv, ++c); config.show_compressed = 1; } else if (!strcmp(argv[c], "-print_psnr")) { config.show_compressed = 1; print_distortion = 0; } else if (!strcmp(argv[c], "-print_ssim")) { config.show_compressed = 1; print_distortion = 1; } else if (!strcmp(argv[c], "-print_lsim")) { config.show_compressed = 1; print_distortion = 2; } else if (!strcmp(argv[c], "-short")) { ++short_output; } else if (!strcmp(argv[c], "-s") && c + 2 < argc) { picture.width = ExUtilGetInt(argv[++c], 0, &parse_error); picture.height = ExUtilGetInt(argv[++c], 0, &parse_error); if (picture.width > WEBP_MAX_DIMENSION || picture.width < 0 || picture.height > WEBP_MAX_DIMENSION || picture.height < 0) { fprintf(stderr, "Specified dimension (%d x %d) is out of range.\n", picture.width, picture.height); goto Error; } } else if (!strcmp(argv[c], "-m") && c + 1 < argc) { config.method = ExUtilGetInt(argv[++c], 0, &parse_error); use_lossless_preset = 0; // disable -z option } else if (!strcmp(argv[c], "-q") && c + 1 < argc) { config.quality = ExUtilGetFloat(argv[++c], &parse_error); use_lossless_preset = 0; // disable -z option } else if (!strcmp(argv[c], "-z") && c + 1 < argc) { lossless_preset = ExUtilGetInt(argv[++c], 0, &parse_error); if (use_lossless_preset != 0) use_lossless_preset = 1; } else if (!strcmp(argv[c], "-alpha_q") && c + 1 < argc) { config.alpha_quality = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-alpha_method") && c + 1 < argc) { config.alpha_compression = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-alpha_cleanup")) { // This flag is obsolete, does opposite of -exact. config.exact = 0; } else if (!strcmp(argv[c], "-exact")) { config.exact = 1; } else if (!strcmp(argv[c], "-blend_alpha") && c + 1 < argc) { blend_alpha = 1; // background color is given in hex with an optional '0x' prefix background_color = ExUtilGetInt(argv[++c], 16, &parse_error); background_color = background_color & 0x00ffffffu; } else if (!strcmp(argv[c], "-alpha_filter") && c + 1 < argc) { ++c; if (!strcmp(argv[c], "none")) { config.alpha_filtering = 0; } else if (!strcmp(argv[c], "fast")) { config.alpha_filtering = 1; } else if (!strcmp(argv[c], "best")) { config.alpha_filtering = 2; } else { fprintf(stderr, "Error! Unrecognized alpha filter: %s\n", argv[c]); goto Error; } } else if (!strcmp(argv[c], "-noalpha")) { keep_alpha = 0; } else if (!strcmp(argv[c], "-lossless")) { config.lossless = 1; } else if (!strcmp(argv[c], "-near_lossless") && c + 1 < argc) { config.near_lossless = ExUtilGetInt(argv[++c], 0, &parse_error); config.lossless = 1; // use near-lossless only with lossless } else if (!strcmp(argv[c], "-hint") && c + 1 < argc) { ++c; if (!strcmp(argv[c], "photo")) { config.image_hint = WEBP_HINT_PHOTO; } else if (!strcmp(argv[c], "picture")) { config.image_hint = WEBP_HINT_PICTURE; } else if (!strcmp(argv[c], "graph")) { config.image_hint = WEBP_HINT_GRAPH; } else { fprintf(stderr, "Error! Unrecognized image hint: %s\n", argv[c]); goto Error; } } else if (!strcmp(argv[c], "-size") && c + 1 < argc) { config.target_size = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-psnr") && c + 1 < argc) { config.target_PSNR = ExUtilGetFloat(argv[++c], &parse_error); } else if (!strcmp(argv[c], "-sns") && c + 1 < argc) { config.sns_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-f") && c + 1 < argc) { config.filter_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-af")) { config.autofilter = 1; } else if (!strcmp(argv[c], "-jpeg_like")) { config.emulate_jpeg_size = 1; } else if (!strcmp(argv[c], "-mt")) { ++config.thread_level; // increase thread level } else if (!strcmp(argv[c], "-low_memory")) { config.low_memory = 1; } else if (!strcmp(argv[c], "-strong")) { config.filter_type = 1; } else if (!strcmp(argv[c], "-nostrong")) { config.filter_type = 0; } else if (!strcmp(argv[c], "-sharpness") && c + 1 < argc) { config.filter_sharpness = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-sharp_yuv")) { config.use_sharp_yuv = 1; } else if (!strcmp(argv[c], "-pass") && c + 1 < argc) { config.pass = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-qrange") && c + 2 < argc) { config.qmin = ExUtilGetInt(argv[++c], 0, &parse_error); config.qmax = ExUtilGetInt(argv[++c], 0, &parse_error); if (config.qmin < 0) config.qmin = 0; if (config.qmax > 100) config.qmax = 100; } else if (!strcmp(argv[c], "-pre") && c + 1 < argc) { config.preprocessing = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-segments") && c + 1 < argc) { config.segments = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-partition_limit") && c + 1 < argc) { config.partition_limit = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-map") && c + 1 < argc) { picture.extra_info_type = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-crop") && c + 4 < argc) { crop = 1; crop_x = ExUtilGetInt(argv[++c], 0, &parse_error); crop_y = ExUtilGetInt(argv[++c], 0, &parse_error); crop_w = ExUtilGetInt(argv[++c], 0, &parse_error); crop_h = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-resize") && c + 2 < argc) { resize_w = ExUtilGetInt(argv[++c], 0, &parse_error); resize_h = ExUtilGetInt(argv[++c], 0, &parse_error); #ifndef WEBP_DLL } else if (!strcmp(argv[c], "-noasm")) { VP8GetCPUInfo = NULL; #endif } else if (!strcmp(argv[c], "-version")) { const int version = WebPGetEncoderVersion(); const int sharpyuv_version = SharpYuvGetVersion(); printf("%d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); printf("libsharpyuv: %d.%d.%d\n", (sharpyuv_version >> 24) & 0xff, (sharpyuv_version >> 16) & 0xffff, sharpyuv_version & 0xff); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-progress")) { show_progress = 1; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-preset") && c + 1 < argc) { WebPPreset preset; ++c; if (!strcmp(argv[c], "default")) { preset = WEBP_PRESET_DEFAULT; } else if (!strcmp(argv[c], "photo")) { preset = WEBP_PRESET_PHOTO; } else if (!strcmp(argv[c], "picture")) { preset = WEBP_PRESET_PICTURE; } else if (!strcmp(argv[c], "drawing")) { preset = WEBP_PRESET_DRAWING; } else if (!strcmp(argv[c], "icon")) { preset = WEBP_PRESET_ICON; } else if (!strcmp(argv[c], "text")) { preset = WEBP_PRESET_TEXT; } else { fprintf(stderr, "Error! Unrecognized preset: %s\n", argv[c]); goto Error; } if (!WebPConfigPreset(&config, preset, config.quality)) { fprintf(stderr, "Error! Could initialize configuration with preset.\n"); goto Error; } } else if (!strcmp(argv[c], "-metadata") && c + 1 < argc) { static const struct { const char* option; int flag; } kTokens[] = { { "all", METADATA_ALL }, { "none", 0 }, { "exif", METADATA_EXIF }, { "icc", METADATA_ICC }, { "xmp", METADATA_XMP }, }; const size_t kNumTokens = sizeof(kTokens) / sizeof(kTokens[0]); const char* start = argv[++c]; const char* const end = start + strlen(start); while (start < end) { size_t i; const char* token = strchr(start, ','); if (token == NULL) token = end; for (i = 0; i < kNumTokens; ++i) { if ((size_t)(token - start) == strlen(kTokens[i].option) && !strncmp(start, kTokens[i].option, strlen(kTokens[i].option))) { if (kTokens[i].flag != 0) { keep_metadata |= kTokens[i].flag; } else { keep_metadata = 0; } break; } } if (i == kNumTokens) { fprintf(stderr, "Error! Unknown metadata type '%.*s'\n", (int)(token - start), start); FREE_WARGV_AND_RETURN(-1); } start = token + 1; } #ifdef HAVE_WINCODEC_H if (keep_metadata != 0 && keep_metadata != METADATA_ICC) { // TODO(jzern): remove when -metadata is supported on all platforms. fprintf(stderr, "Warning: only ICC profile extraction is currently" " supported on this platform!\n"); } #endif } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (!strcmp(argv[c], "--")) { if (c + 1 < argc) in_file = (const char*)GET_WARGV(argv, ++c); break; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); HelpLong(); FREE_WARGV_AND_RETURN(-1); } else { in_file = (const char*)GET_WARGV(argv, c); } if (parse_error) { HelpLong(); FREE_WARGV_AND_RETURN(-1); } } if (in_file == NULL) { fprintf(stderr, "No input file specified!\n"); HelpShort(); goto Error; } if (use_lossless_preset == 1) { if (!WebPConfigLosslessPreset(&config, lossless_preset)) { fprintf(stderr, "Invalid lossless preset (-z %d)\n", lossless_preset); goto Error; } } // Check for unsupported command line options for lossless mode and log // warning for such options. if (!quiet && config.lossless == 1) { if (config.target_size > 0 || config.target_PSNR > 0) { fprintf(stderr, "Encoding for specified size or PSNR is not supported" " for lossless encoding. Ignoring such option(s)!\n"); } if (config.partition_limit > 0) { fprintf(stderr, "Partition limit option is not required for lossless" " encoding. Ignoring this option!\n"); } } // If a target size or PSNR was given, but somehow the -pass option was // omitted, force a reasonable value. if (config.target_size > 0 || config.target_PSNR > 0) { if (config.pass == 1) config.pass = 6; } if (!WebPValidateConfig(&config)) { fprintf(stderr, "Error! Invalid configuration.\n"); goto Error; } // Read the input. We need to decide if we prefer ARGB or YUVA // samples, depending on the expected compression mode (this saves // some conversion steps). picture.use_argb = (config.lossless || config.use_sharp_yuv || config.preprocessing > 0 || crop || (resize_w | resize_h) > 0); if (verbose) { StopwatchReset(&stop_watch); } if (!ReadPicture(in_file, &picture, keep_alpha, (keep_metadata == 0) ? NULL : &metadata)) { WFPRINTF(stderr, "Error! Cannot read input picture file '%s'\n", (const W_CHAR*)in_file); goto Error; } picture.progress_hook = (show_progress && !quiet) ? ProgressReport : NULL; if (blend_alpha) { WebPBlendAlpha(&picture, background_color); } if (verbose) { const double read_time = StopwatchReadAndReset(&stop_watch); fprintf(stderr, "Time to read input: %.3fs\n", read_time); } // The bitstream should be kept in memory when metadata must be appended // before writing it to a file/stream, and/or when the near-losslessly encoded // bitstream must be decoded for distortion computation (lossy will modify the // 'picture' but not the lossless pipeline). // Otherwise directly write the bitstream to a file. use_memory_writer = (out_file != NULL && keep_metadata) || (!quiet && print_distortion >= 0 && config.lossless && config.near_lossless < 100); // Open the output if (out_file != NULL) { const int use_stdout = !WSTRCMP(out_file, "-"); out = use_stdout ? ImgIoUtilSetBinaryMode(stdout) : WFOPEN(out_file, "wb"); if (out == NULL) { WFPRINTF(stderr, "Error! Cannot open output file '%s'\n", (const W_CHAR*)out_file); goto Error; } else { if (!short_output && !quiet) { WFPRINTF(stderr, "Saving file '%s'\n", (const W_CHAR*)out_file); } } if (use_memory_writer) { picture.writer = WebPMemoryWrite; picture.custom_ptr = (void*)&memory_writer; } else { picture.writer = MyWriter; picture.custom_ptr = (void*)out; } } else { out = NULL; if (use_memory_writer) { picture.writer = WebPMemoryWrite; picture.custom_ptr = (void*)&memory_writer; } if (!quiet && !short_output) { fprintf(stderr, "No output file specified (no -o flag). Encoding will\n"); fprintf(stderr, "be performed, but its results discarded.\n\n"); } } if (!quiet) { picture.stats = &stats; picture.user_data = (void*)in_file; } // Crop & resize. if (verbose) { StopwatchReset(&stop_watch); } if (crop != 0) { // We use self-cropping using a view. if (!WebPPictureView(&picture, crop_x, crop_y, crop_w, crop_h, &picture)) { fprintf(stderr, "Error! Cannot crop picture\n"); goto Error; } } if ((resize_w | resize_h) > 0) { WebPPicture picture_no_alpha; if (config.exact) { // If -exact, we can't premultiply RGB by A otherwise RGB is lost if A=0. // We rescale an opaque copy and assemble scaled A and non-premultiplied // RGB channels. This is slower but it's a very uncommon use case. Color // leak at sharp alpha edges is possible. if (!WebPPictureCopy(&picture, &picture_no_alpha)) { fprintf(stderr, "Error! Cannot copy temporary picture\n"); goto Error; } // We enforced picture.use_argb = 1 above. Now, remove the alpha values. { int x, y; uint32_t* argb_no_alpha = picture_no_alpha.argb; for (y = 0; y < picture_no_alpha.height; ++y) { for (x = 0; x < picture_no_alpha.width; ++x) { argb_no_alpha[x] |= 0xff000000; // Opaque copy. } argb_no_alpha += picture_no_alpha.argb_stride; } } if (!WebPPictureRescale(&picture_no_alpha, resize_w, resize_h)) { fprintf(stderr, "Error! Cannot resize temporary picture\n"); goto Error; } } if (!WebPPictureRescale(&picture, resize_w, resize_h)) { fprintf(stderr, "Error! Cannot resize picture\n"); goto Error; } if (config.exact) { // Put back the alpha information. int x, y; uint32_t* argb_no_alpha = picture_no_alpha.argb; uint32_t* argb = picture.argb; for (y = 0; y < picture_no_alpha.height; ++y) { for (x = 0; x < picture_no_alpha.width; ++x) { argb[x] = (argb[x] & 0xff000000) | (argb_no_alpha[x] & 0x00ffffff); } argb_no_alpha += picture_no_alpha.argb_stride; argb += picture.argb_stride; } WebPPictureFree(&picture_no_alpha); } } if (verbose && (crop != 0 || (resize_w | resize_h) > 0)) { const double preproc_time = StopwatchReadAndReset(&stop_watch); fprintf(stderr, "Time to crop/resize picture: %.3fs\n", preproc_time); } if (picture.extra_info_type > 0) { AllocExtraInfo(&picture); } // Save original picture for later comparison. Only for lossy as lossless does // not modify 'picture' (even near-lossless). if (print_distortion >= 0 && !config.lossless && !WebPPictureCopy(&picture, &original_picture)) { fprintf(stderr, "Error! Cannot copy temporary picture\n"); goto Error; } // Compress. if (verbose) { StopwatchReset(&stop_watch); } if (!WebPEncode(&config, &picture)) { fprintf(stderr, "Error! Cannot encode picture as WebP\n"); fprintf(stderr, "Error code: %d (%s)\n", picture.error_code, kErrorMessages[picture.error_code]); goto Error; } if (verbose) { const double encode_time = StopwatchReadAndReset(&stop_watch); fprintf(stderr, "Time to encode picture: %.3fs\n", encode_time); } // Get the decompressed image for the lossless pipeline. if (!quiet && print_distortion >= 0 && config.lossless) { if (config.near_lossless == 100) { // Pure lossless: image was not modified, make 'original_picture' a view // of 'picture' by copying all members except the freeable pointers. original_picture = picture; original_picture.memory_ = original_picture.memory_argb_ = NULL; } else { // Decode the bitstream stored in 'memory_writer' to get the altered image // to 'picture'; save the 'original_picture' beforehand. assert(use_memory_writer); original_picture = picture; if (!WebPPictureInit(&picture)) { // Do not free 'picture'. fprintf(stderr, "Error! Version mismatch!\n"); goto Error; } picture.use_argb = 1; if (!ReadWebP( memory_writer.mem, memory_writer.size, &picture, /*keep_alpha=*/WebPPictureHasTransparency(&original_picture), /*metadata=*/NULL)) { fprintf(stderr, "Error! Cannot decode encoded WebP bitstream\n"); fprintf(stderr, "Error code: %d (%s)\n", picture.error_code, kErrorMessages[picture.error_code]); goto Error; } picture.stats = original_picture.stats; } original_picture.stats = NULL; } // Write the YUV planes to a PGM file. Only available for lossy. if (dump_file) { if (picture.use_argb) { fprintf(stderr, "Warning: can't dump file (-d option) " "in lossless mode.\n"); } else if (!DumpPicture(&picture, dump_file)) { WFPRINTF(stderr, "Warning, couldn't dump picture %s\n", (const W_CHAR*)dump_file); } } if (use_memory_writer && out != NULL && !WriteWebPWithMetadata(out, &picture, &memory_writer, &metadata, keep_metadata, &metadata_written)) { fprintf(stderr, "Error writing WebP file!\n"); goto Error; } if (out == NULL && keep_metadata) { // output is disabled, just display the metadata stats. const struct { const MetadataPayload* const payload; int flag; } *iter, info[] = {{&metadata.exif, METADATA_EXIF}, {&metadata.iccp, METADATA_ICC}, {&metadata.xmp, METADATA_XMP}, {NULL, 0}}; uint32_t unused1 = 0; uint64_t unused2 = 0; for (iter = info; iter->payload != NULL; ++iter) { if (UpdateFlagsAndSize(iter->payload, !!(keep_metadata & iter->flag), /*flag=*/0, &unused1, &unused2)) { metadata_written |= iter->flag; } } } if (!quiet) { if (!short_output || print_distortion < 0) { if (config.lossless) { PrintExtraInfoLossless(&picture, short_output, in_file); } else { PrintExtraInfoLossy(&picture, short_output, config.low_memory, in_file); } } if (!short_output && picture.extra_info_type > 0) { PrintMapInfo(&picture); } if (print_distortion >= 0) { // print distortion static const char* distortion_names[] = { "PSNR", "SSIM", "LSIM" }; float values[5]; if (!WebPPictureDistortion(&picture, &original_picture, print_distortion, values)) { fprintf(stderr, "Error while computing the distortion.\n"); goto Error; } if (!short_output) { fprintf(stderr, "%s: ", distortion_names[print_distortion]); fprintf(stderr, "B:%.2f G:%.2f R:%.2f A:%.2f Total:%.2f\n", values[0], values[1], values[2], values[3], values[4]); } else { fprintf(stderr, "%7d %.4f\n", picture.stats->coded_size, values[4]); } } if (!short_output) { PrintMetadataInfo(&metadata, metadata_written); } } return_value = 0; Error: WebPMemoryWriterClear(&memory_writer); WebPFree(picture.extra_info); MetadataFree(&metadata); WebPPictureFree(&picture); WebPPictureFree(&original_picture); if (out != NULL && out != stdout) { fclose(out); } FREE_WARGV_AND_RETURN(return_value); } //------------------------------------------------------------------------------ libwebp-1.4.0/examples/dwebp.c0000644000014400001440000003607214606317060013146 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Command-line tool for decoding a WebP image. // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "../examples/example_util.h" #include "../imageio/image_enc.h" #include "../imageio/webpdec.h" #include "./stopwatch.h" #include "./unicode.h" static int verbose = 0; static int quiet = 0; #ifndef WEBP_DLL #ifdef __cplusplus extern "C" { #endif extern void* VP8GetCPUInfo; // opaque forward declaration. #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DLL static int SaveOutput(const WebPDecBuffer* const buffer, WebPOutputFileFormat format, const char* const out_file) { const int use_stdout = (out_file != NULL) && !WSTRCMP(out_file, "-"); int ok = 1; Stopwatch stop_watch; if (verbose) { StopwatchReset(&stop_watch); } ok = WebPSaveImage(buffer, format, out_file); if (ok) { if (!quiet) { if (use_stdout) { fprintf(stderr, "Saved to stdout\n"); } else { WFPRINTF(stderr, "Saved file %s\n", (const W_CHAR*)out_file); } } if (verbose) { const double write_time = StopwatchReadAndReset(&stop_watch); fprintf(stderr, "Time to write output: %.3fs\n", write_time); } } else { if (use_stdout) { fprintf(stderr, "Error writing to stdout !!\n"); } else { WFPRINTF(stderr, "Error writing file %s !!\n", (const W_CHAR*)out_file); } } return ok; } static void Help(void) { printf("Usage: dwebp in_file [options] [-o out_file]\n\n" "Decodes the WebP image file to PNG format [Default].\n" "Note: Animated WebP files are not supported.\n\n" "Use following options to convert into alternate image formats:\n" " -pam ......... save the raw RGBA samples as a color PAM\n" " -ppm ......... save the raw RGB samples as a color PPM\n" " -bmp ......... save as uncompressed BMP format\n" " -tiff ........ save as uncompressed TIFF format\n" " -pgm ......... save the raw YUV samples as a grayscale PGM\n" " file with IMC4 layout\n" " -yuv ......... save the raw YUV samples in flat layout\n" "\n" " Other options are:\n" " -version ..... print version number and exit\n" " -nofancy ..... don't use the fancy YUV420 upscaler\n" " -nofilter .... disable in-loop filtering\n" " -nodither .... disable dithering\n" " -dither .. dithering strength (in 0..100)\n" " -alpha_dither use alpha-plane dithering if needed\n" " -mt .......... use multi-threading\n" " -crop ... crop output with the given rectangle\n" " -resize ......... resize output (*after* any cropping)\n" " -flip ........ flip the output vertically\n" " -alpha ....... only save the alpha plane\n" " -incremental . use incremental decoding (useful for tests)\n" " -h ........... this help message\n" " -v ........... verbose (e.g. print encoding/decoding times)\n" " -quiet ....... quiet mode, don't print anything\n" #ifndef WEBP_DLL " -noasm ....... disable all assembly optimizations\n" #endif ); } static const char* const kFormatType[] = { "unspecified", "lossy", "lossless" }; static uint8_t* AllocateExternalBuffer(WebPDecoderConfig* config, WebPOutputFileFormat format, int use_external_memory) { uint8_t* external_buffer = NULL; WebPDecBuffer* const output_buffer = &config->output; int w = config->input.width; int h = config->input.height; if (config->options.use_scaling) { w = config->options.scaled_width; h = config->options.scaled_height; } else if (config->options.use_cropping) { w = config->options.crop_width; h = config->options.crop_height; } if (format >= RGB && format <= rgbA_4444) { const int bpp = (format == RGB || format == BGR) ? 3 : (format == RGBA_4444 || format == rgbA_4444 || format == RGB_565) ? 2 : 4; uint32_t stride = bpp * w + 7; // <- just for exercising external_buffer = (uint8_t*)WebPMalloc(stride * h); if (external_buffer == NULL) return NULL; output_buffer->u.RGBA.stride = stride; output_buffer->u.RGBA.size = stride * h; output_buffer->u.RGBA.rgba = external_buffer; } else { // YUV and YUVA const int has_alpha = WebPIsAlphaMode(output_buffer->colorspace); uint8_t* tmp; uint32_t stride = w + 3; uint32_t uv_stride = (w + 1) / 2 + 13; uint32_t total_size = stride * h * (has_alpha ? 2 : 1) + 2 * uv_stride * (h + 1) / 2; assert(format >= YUV && format <= YUVA); external_buffer = (uint8_t*)WebPMalloc(total_size); if (external_buffer == NULL) return NULL; tmp = external_buffer; output_buffer->u.YUVA.y = tmp; output_buffer->u.YUVA.y_stride = stride; output_buffer->u.YUVA.y_size = stride * h; tmp += output_buffer->u.YUVA.y_size; if (has_alpha) { output_buffer->u.YUVA.a = tmp; output_buffer->u.YUVA.a_stride = stride; output_buffer->u.YUVA.a_size = stride * h; tmp += output_buffer->u.YUVA.a_size; } else { output_buffer->u.YUVA.a = NULL; output_buffer->u.YUVA.a_stride = 0; } output_buffer->u.YUVA.u = tmp; output_buffer->u.YUVA.u_stride = uv_stride; output_buffer->u.YUVA.u_size = uv_stride * (h + 1) / 2; tmp += output_buffer->u.YUVA.u_size; output_buffer->u.YUVA.v = tmp; output_buffer->u.YUVA.v_stride = uv_stride; output_buffer->u.YUVA.v_size = uv_stride * (h + 1) / 2; tmp += output_buffer->u.YUVA.v_size; assert(tmp <= external_buffer + total_size); } output_buffer->is_external_memory = use_external_memory; return external_buffer; } int main(int argc, const char* argv[]) { int ok = 0; const char* in_file = NULL; const char* out_file = NULL; WebPDecoderConfig config; WebPDecBuffer* const output_buffer = &config.output; WebPBitstreamFeatures* const bitstream = &config.input; WebPOutputFileFormat format = PNG; uint8_t* external_buffer = NULL; int use_external_memory = 0; const uint8_t* data = NULL; int incremental = 0; int c; INIT_WARGV(argc, argv); if (!WebPInitDecoderConfig(&config)) { fprintf(stderr, "Library version mismatch!\n"); FREE_WARGV_AND_RETURN(-1); } for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = (const char*)GET_WARGV(argv, ++c); } else if (!strcmp(argv[c], "-alpha")) { format = ALPHA_PLANE_ONLY; } else if (!strcmp(argv[c], "-nofancy")) { config.options.no_fancy_upsampling = 1; } else if (!strcmp(argv[c], "-nofilter")) { config.options.bypass_filtering = 1; } else if (!strcmp(argv[c], "-pam")) { format = PAM; } else if (!strcmp(argv[c], "-ppm")) { format = PPM; } else if (!strcmp(argv[c], "-bmp")) { format = BMP; } else if (!strcmp(argv[c], "-tiff")) { format = TIFF; } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-version")) { const int version = WebPGetDecoderVersion(); printf("%d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-pgm")) { format = PGM; } else if (!strcmp(argv[c], "-yuv")) { format = RAW_YUV; } else if (!strcmp(argv[c], "-pixel_format") && c < argc - 1) { const char* const fmt = argv[++c]; if (!strcmp(fmt, "RGB")) format = RGB; else if (!strcmp(fmt, "RGBA")) format = RGBA; else if (!strcmp(fmt, "BGR")) format = BGR; else if (!strcmp(fmt, "BGRA")) format = BGRA; else if (!strcmp(fmt, "ARGB")) format = ARGB; else if (!strcmp(fmt, "RGBA_4444")) format = RGBA_4444; else if (!strcmp(fmt, "RGB_565")) format = RGB_565; else if (!strcmp(fmt, "rgbA")) format = rgbA; else if (!strcmp(fmt, "bgrA")) format = bgrA; else if (!strcmp(fmt, "Argb")) format = Argb; else if (!strcmp(fmt, "rgbA_4444")) format = rgbA_4444; else if (!strcmp(fmt, "YUV")) format = YUV; else if (!strcmp(fmt, "YUVA")) format = YUVA; else { fprintf(stderr, "Can't parse pixel_format %s\n", fmt); parse_error = 1; } } else if (!strcmp(argv[c], "-external_memory") && c < argc - 1) { use_external_memory = ExUtilGetInt(argv[++c], 0, &parse_error); parse_error |= (use_external_memory > 2 || use_external_memory < 0); if (parse_error) { fprintf(stderr, "Can't parse 'external_memory' value %s\n", argv[c]); } } else if (!strcmp(argv[c], "-mt")) { config.options.use_threads = 1; } else if (!strcmp(argv[c], "-alpha_dither")) { config.options.alpha_dithering_strength = 100; } else if (!strcmp(argv[c], "-nodither")) { config.options.dithering_strength = 0; } else if (!strcmp(argv[c], "-dither") && c < argc - 1) { config.options.dithering_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-crop") && c < argc - 4) { config.options.use_cropping = 1; config.options.crop_left = ExUtilGetInt(argv[++c], 0, &parse_error); config.options.crop_top = ExUtilGetInt(argv[++c], 0, &parse_error); config.options.crop_width = ExUtilGetInt(argv[++c], 0, &parse_error); config.options.crop_height = ExUtilGetInt(argv[++c], 0, &parse_error); } else if ((!strcmp(argv[c], "-scale") || !strcmp(argv[c], "-resize")) && c < argc - 2) { // '-scale' is left for compatibility config.options.use_scaling = 1; config.options.scaled_width = ExUtilGetInt(argv[++c], 0, &parse_error); config.options.scaled_height = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-flip")) { config.options.flip = 1; } else if (!strcmp(argv[c], "-v")) { verbose = 1; #ifndef WEBP_DLL } else if (!strcmp(argv[c], "-noasm")) { VP8GetCPUInfo = NULL; #endif } else if (!strcmp(argv[c], "-incremental")) { incremental = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) in_file = (const char*)GET_WARGV(argv, ++c); break; } else if (argv[c][0] == '-') { fprintf(stderr, "Unknown option '%s'\n", argv[c]); Help(); FREE_WARGV_AND_RETURN(-1); } else { in_file = (const char*)GET_WARGV(argv, c); } if (parse_error) { Help(); FREE_WARGV_AND_RETURN(-1); } } if (in_file == NULL) { fprintf(stderr, "missing input file!!\n"); Help(); FREE_WARGV_AND_RETURN(-1); } if (quiet) verbose = 0; { VP8StatusCode status = VP8_STATUS_OK; size_t data_size = 0; if (!LoadWebP(in_file, &data, &data_size, bitstream)) { FREE_WARGV_AND_RETURN(-1); } switch (format) { case PNG: #ifdef HAVE_WINCODEC_H output_buffer->colorspace = bitstream->has_alpha ? MODE_BGRA : MODE_BGR; #else output_buffer->colorspace = bitstream->has_alpha ? MODE_RGBA : MODE_RGB; #endif break; case PAM: output_buffer->colorspace = MODE_RGBA; break; case PPM: output_buffer->colorspace = MODE_RGB; // drops alpha for PPM break; case BMP: output_buffer->colorspace = bitstream->has_alpha ? MODE_BGRA : MODE_BGR; break; case TIFF: output_buffer->colorspace = bitstream->has_alpha ? MODE_RGBA : MODE_RGB; break; case PGM: case RAW_YUV: output_buffer->colorspace = bitstream->has_alpha ? MODE_YUVA : MODE_YUV; break; case ALPHA_PLANE_ONLY: output_buffer->colorspace = MODE_YUVA; break; // forced modes: case RGB: output_buffer->colorspace = MODE_RGB; break; case RGBA: output_buffer->colorspace = MODE_RGBA; break; case BGR: output_buffer->colorspace = MODE_BGR; break; case BGRA: output_buffer->colorspace = MODE_BGRA; break; case ARGB: output_buffer->colorspace = MODE_ARGB; break; case RGBA_4444: output_buffer->colorspace = MODE_RGBA_4444; break; case RGB_565: output_buffer->colorspace = MODE_RGB_565; break; case rgbA: output_buffer->colorspace = MODE_rgbA; break; case bgrA: output_buffer->colorspace = MODE_bgrA; break; case Argb: output_buffer->colorspace = MODE_Argb; break; case rgbA_4444: output_buffer->colorspace = MODE_rgbA_4444; break; case YUV: output_buffer->colorspace = MODE_YUV; break; case YUVA: output_buffer->colorspace = MODE_YUVA; break; default: goto Exit; } if (use_external_memory > 0 && format >= RGB) { external_buffer = AllocateExternalBuffer(&config, format, use_external_memory); if (external_buffer == NULL) goto Exit; } { Stopwatch stop_watch; if (verbose) StopwatchReset(&stop_watch); if (incremental) { status = DecodeWebPIncremental(data, data_size, &config); } else { status = DecodeWebP(data, data_size, &config); } if (verbose) { const double decode_time = StopwatchReadAndReset(&stop_watch); fprintf(stderr, "Time to decode picture: %.3fs\n", decode_time); } } ok = (status == VP8_STATUS_OK); if (!ok) { PrintWebPError(in_file, status); goto Exit; } } if (out_file != NULL) { if (!quiet) { WFPRINTF(stderr, "Decoded %s.", (const W_CHAR*)in_file); fprintf(stderr, " Dimensions: %d x %d %s. Format: %s. Now saving...\n", output_buffer->width, output_buffer->height, bitstream->has_alpha ? " (with alpha)" : "", kFormatType[bitstream->format]); } ok = SaveOutput(output_buffer, format, out_file); } else { if (!quiet) { WFPRINTF(stderr, "File %s can be decoded ", (const W_CHAR*)in_file); fprintf(stderr, "(dimensions: %d x %d %s. Format: %s).\n", output_buffer->width, output_buffer->height, bitstream->has_alpha ? " (with alpha)" : "", kFormatType[bitstream->format]); fprintf(stderr, "Nothing written; " "use -o flag to save the result as e.g. PNG.\n"); } } Exit: WebPFreeDecBuffer(output_buffer); WebPFree((void*)external_buffer); WebPFree((void*)data); FREE_WARGV_AND_RETURN(ok ? 0 : -1); } //------------------------------------------------------------------------------ libwebp-1.4.0/examples/anim_util.c0000644000014400001440000006406014606317060014024 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for animated images #include "./anim_util.h" #include #include #include #include #if defined(WEBP_HAVE_GIF) #include #endif #include "webp/format_constants.h" #include "webp/decode.h" #include "webp/demux.h" #include "../imageio/imageio_util.h" #include "./gifdec.h" #include "./unicode.h" #include "./unicode_gif.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif static const int kNumChannels = 4; // ----------------------------------------------------------------------------- // Common utilities. #if defined(WEBP_HAVE_GIF) // Returns true if the frame covers the full canvas. static int IsFullFrame(int width, int height, int canvas_width, int canvas_height) { return (width == canvas_width && height == canvas_height); } #endif // WEBP_HAVE_GIF static int CheckSizeForOverflow(uint64_t size) { return (size == (size_t)size); } static int AllocateFrames(AnimatedImage* const image, uint32_t num_frames) { uint32_t i; uint8_t* mem = NULL; DecodedFrame* frames = NULL; const uint64_t rgba_size = (uint64_t)image->canvas_width * kNumChannels * image->canvas_height; const uint64_t total_size = (uint64_t)num_frames * rgba_size * sizeof(*mem); const uint64_t total_frame_size = (uint64_t)num_frames * sizeof(*frames); if (!CheckSizeForOverflow(total_size) || !CheckSizeForOverflow(total_frame_size)) { return 0; } mem = (uint8_t*)WebPMalloc((size_t)total_size); frames = (DecodedFrame*)WebPMalloc((size_t)total_frame_size); if (mem == NULL || frames == NULL) { WebPFree(mem); WebPFree(frames); return 0; } WebPFree(image->raw_mem); image->num_frames = num_frames; image->frames = frames; for (i = 0; i < num_frames; ++i) { frames[i].rgba = mem + i * rgba_size; frames[i].duration = 0; frames[i].is_key_frame = 0; } image->raw_mem = mem; return 1; } void ClearAnimatedImage(AnimatedImage* const image) { if (image != NULL) { WebPFree(image->raw_mem); WebPFree(image->frames); image->num_frames = 0; image->frames = NULL; image->raw_mem = NULL; } } #if defined(WEBP_HAVE_GIF) // Clear the canvas to transparent. static void ZeroFillCanvas(uint8_t* rgba, uint32_t canvas_width, uint32_t canvas_height) { memset(rgba, 0, canvas_width * kNumChannels * canvas_height); } // Clear given frame rectangle to transparent. static void ZeroFillFrameRect(uint8_t* rgba, int rgba_stride, int x_offset, int y_offset, int width, int height) { int j; assert(width * kNumChannels <= rgba_stride); rgba += y_offset * rgba_stride + x_offset * kNumChannels; for (j = 0; j < height; ++j) { memset(rgba, 0, width * kNumChannels); rgba += rgba_stride; } } // Copy width * height pixels from 'src' to 'dst'. static void CopyCanvas(const uint8_t* src, uint8_t* dst, uint32_t width, uint32_t height) { assert(src != NULL && dst != NULL); memcpy(dst, src, width * kNumChannels * height); } // Copy pixels in the given rectangle from 'src' to 'dst' honoring the 'stride'. static void CopyFrameRectangle(const uint8_t* src, uint8_t* dst, int stride, int x_offset, int y_offset, int width, int height) { int j; const int width_in_bytes = width * kNumChannels; const size_t offset = y_offset * stride + x_offset * kNumChannels; assert(width_in_bytes <= stride); src += offset; dst += offset; for (j = 0; j < height; ++j) { memcpy(dst, src, width_in_bytes); src += stride; dst += stride; } } #endif // WEBP_HAVE_GIF // Canonicalize all transparent pixels to transparent black to aid comparison. static void CleanupTransparentPixels(uint32_t* rgba, uint32_t width, uint32_t height) { const uint32_t* const rgba_end = rgba + width * height; while (rgba < rgba_end) { const uint8_t alpha = (*rgba >> 24) & 0xff; if (alpha == 0) { *rgba = 0; } ++rgba; } } // Dump frame to a PAM file. Returns true on success. static int DumpFrame(const char filename[], const char dump_folder[], uint32_t frame_num, const uint8_t rgba[], int canvas_width, int canvas_height) { int ok = 0; size_t max_len; int y; const W_CHAR* base_name = NULL; W_CHAR* file_name = NULL; FILE* f = NULL; const char* row; if (dump_folder == NULL) dump_folder = (const char*)TO_W_CHAR("."); base_name = WSTRRCHR(filename, '/'); base_name = (base_name == NULL) ? (const W_CHAR*)filename : base_name + 1; max_len = WSTRLEN(dump_folder) + 1 + WSTRLEN(base_name) + strlen("_frame_") + strlen(".pam") + 8; file_name = (W_CHAR*)WebPMalloc(max_len * sizeof(*file_name)); if (file_name == NULL) goto End; if (WSNPRINTF(file_name, max_len, "%s/%s_frame_%d.pam", (const W_CHAR*)dump_folder, base_name, frame_num) < 0) { fprintf(stderr, "Error while generating file name\n"); goto End; } f = WFOPEN(file_name, "wb"); if (f == NULL) { WFPRINTF(stderr, "Error opening file for writing: %s\n", file_name); ok = 0; goto End; } if (fprintf(f, "P7\nWIDTH %d\nHEIGHT %d\n" "DEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", canvas_width, canvas_height) < 0) { WFPRINTF(stderr, "Write error for file %s\n", file_name); goto End; } row = (const char*)rgba; for (y = 0; y < canvas_height; ++y) { if (fwrite(row, canvas_width * kNumChannels, 1, f) != 1) { WFPRINTF(stderr, "Error writing to file: %s\n", file_name); goto End; } row += canvas_width * kNumChannels; } ok = 1; End: if (f != NULL) fclose(f); WebPFree(file_name); return ok; } // ----------------------------------------------------------------------------- // WebP Decoding. // Returns true if this is a valid WebP bitstream. static int IsWebP(const WebPData* const webp_data) { return (WebPGetInfo(webp_data->bytes, webp_data->size, NULL, NULL) != 0); } // Read animated WebP bitstream 'webp_data' into 'AnimatedImage' struct. static int ReadAnimatedWebP(const char filename[], const WebPData* const webp_data, AnimatedImage* const image, int dump_frames, const char dump_folder[]) { int ok = 0; int dump_ok = 1; uint32_t frame_index = 0; int prev_frame_timestamp = 0; WebPAnimDecoder* dec; WebPAnimInfo anim_info; memset(image, 0, sizeof(*image)); dec = WebPAnimDecoderNew(webp_data, NULL); if (dec == NULL) { WFPRINTF(stderr, "Error parsing image: %s\n", (const W_CHAR*)filename); goto End; } if (!WebPAnimDecoderGetInfo(dec, &anim_info)) { fprintf(stderr, "Error getting global info about the animation\n"); goto End; } // Animation properties. image->canvas_width = anim_info.canvas_width; image->canvas_height = anim_info.canvas_height; image->loop_count = anim_info.loop_count; image->bgcolor = anim_info.bgcolor; // Allocate frames. if (!AllocateFrames(image, anim_info.frame_count)) goto End; // Decode frames. while (WebPAnimDecoderHasMoreFrames(dec)) { DecodedFrame* curr_frame; uint8_t* curr_rgba; uint8_t* frame_rgba; int timestamp; if (!WebPAnimDecoderGetNext(dec, &frame_rgba, ×tamp)) { fprintf(stderr, "Error decoding frame #%u\n", frame_index); goto End; } assert(frame_index < anim_info.frame_count); curr_frame = &image->frames[frame_index]; curr_rgba = curr_frame->rgba; curr_frame->duration = timestamp - prev_frame_timestamp; curr_frame->is_key_frame = 0; // Unused. memcpy(curr_rgba, frame_rgba, image->canvas_width * kNumChannels * image->canvas_height); // Needed only because we may want to compare with GIF later. CleanupTransparentPixels((uint32_t*)curr_rgba, image->canvas_width, image->canvas_height); if (dump_frames && dump_ok) { dump_ok = DumpFrame(filename, dump_folder, frame_index, curr_rgba, image->canvas_width, image->canvas_height); if (!dump_ok) { // Print error once, but continue decode loop. fprintf(stderr, "Error dumping frames to %s\n", dump_folder); } } ++frame_index; prev_frame_timestamp = timestamp; } ok = dump_ok; if (ok) image->format = ANIM_WEBP; End: WebPAnimDecoderDelete(dec); return ok; } // ----------------------------------------------------------------------------- // GIF Decoding. #if defined(WEBP_HAVE_GIF) // Returns true if this is a valid GIF bitstream. static int IsGIF(const WebPData* const data) { return data->size > GIF_STAMP_LEN && (!memcmp(GIF_STAMP, data->bytes, GIF_STAMP_LEN) || !memcmp(GIF87_STAMP, data->bytes, GIF_STAMP_LEN) || !memcmp(GIF89_STAMP, data->bytes, GIF_STAMP_LEN)); } // GIFLIB_MAJOR is only defined in libgif >= 4.2.0. #if defined(GIFLIB_MAJOR) && defined(GIFLIB_MINOR) # define LOCAL_GIF_VERSION ((GIFLIB_MAJOR << 8) | GIFLIB_MINOR) # define LOCAL_GIF_PREREQ(maj, min) \ (LOCAL_GIF_VERSION >= (((maj) << 8) | (min))) #else # define LOCAL_GIF_VERSION 0 # define LOCAL_GIF_PREREQ(maj, min) 0 #endif #if !LOCAL_GIF_PREREQ(5, 0) // Added in v5.0 typedef struct { int DisposalMode; #define DISPOSAL_UNSPECIFIED 0 // No disposal specified #define DISPOSE_DO_NOT 1 // Leave image in place #define DISPOSE_BACKGROUND 2 // Set area to background color #define DISPOSE_PREVIOUS 3 // Restore to previous content int UserInputFlag; // User confirmation required before disposal int DelayTime; // Pre-display delay in 0.01sec units int TransparentColor; // Palette index for transparency, -1 if none #define NO_TRANSPARENT_COLOR -1 } GraphicsControlBlock; static int DGifExtensionToGCB(const size_t GifExtensionLength, const GifByteType* GifExtension, GraphicsControlBlock* gcb) { if (GifExtensionLength != 4) { return GIF_ERROR; } gcb->DisposalMode = (GifExtension[0] >> 2) & 0x07; gcb->UserInputFlag = (GifExtension[0] & 0x02) != 0; gcb->DelayTime = GifExtension[1] | (GifExtension[2] << 8); if (GifExtension[0] & 0x01) { gcb->TransparentColor = (int)GifExtension[3]; } else { gcb->TransparentColor = NO_TRANSPARENT_COLOR; } return GIF_OK; } static int DGifSavedExtensionToGCB(GifFileType* GifFile, int ImageIndex, GraphicsControlBlock* gcb) { int i; if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) { return GIF_ERROR; } gcb->DisposalMode = DISPOSAL_UNSPECIFIED; gcb->UserInputFlag = 0; gcb->DelayTime = 0; gcb->TransparentColor = NO_TRANSPARENT_COLOR; for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; i++) { ExtensionBlock* ep = &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; if (ep->Function == GRAPHICS_EXT_FUNC_CODE) { return DGifExtensionToGCB( ep->ByteCount, (const GifByteType*)ep->Bytes, gcb); } } return GIF_ERROR; } #define CONTINUE_EXT_FUNC_CODE 0x00 // Signature was changed in v5.0 #define DGifOpenFileName(a, b) DGifOpenFileName(a) #endif // !LOCAL_GIF_PREREQ(5, 0) // Signature changed in v5.1 #if !LOCAL_GIF_PREREQ(5, 1) #define DGifCloseFile(a, b) DGifCloseFile(a) #endif static int IsKeyFrameGIF(const GifImageDesc* prev_desc, int prev_dispose, const DecodedFrame* const prev_frame, int canvas_width, int canvas_height) { if (prev_frame == NULL) return 1; if (prev_dispose == DISPOSE_BACKGROUND) { if (IsFullFrame(prev_desc->Width, prev_desc->Height, canvas_width, canvas_height)) { return 1; } if (prev_frame->is_key_frame) return 1; } return 0; } static int GetTransparentIndexGIF(GifFileType* gif) { GraphicsControlBlock first_gcb; memset(&first_gcb, 0, sizeof(first_gcb)); DGifSavedExtensionToGCB(gif, 0, &first_gcb); return first_gcb.TransparentColor; } static uint32_t GetBackgroundColorGIF(GifFileType* gif) { const int transparent_index = GetTransparentIndexGIF(gif); const ColorMapObject* const color_map = gif->SColorMap; if (transparent_index != NO_TRANSPARENT_COLOR && gif->SBackGroundColor == transparent_index) { return 0x00000000; // Special case: transparent black. } else if (color_map == NULL || color_map->Colors == NULL || gif->SBackGroundColor >= color_map->ColorCount) { return 0xffffffff; // Invalid: assume white. } else { const GifColorType color = color_map->Colors[gif->SBackGroundColor]; return (0xffu << 24) | (color.Red << 16) | (color.Green << 8) | (color.Blue << 0); } } // Find appropriate app extension and get loop count from the next extension. // We use Chrome's interpretation of the 'loop_count' semantics: // if not present -> loop once // if present and loop_count == 0, return 0 ('infinite'). // if present and loop_count != 0, it's the number of *extra* loops // so we need to return loop_count + 1 as total loop number. static uint32_t GetLoopCountGIF(const GifFileType* const gif) { int i; for (i = 0; i < gif->ImageCount; ++i) { const SavedImage* const image = &gif->SavedImages[i]; int j; for (j = 0; (j + 1) < image->ExtensionBlockCount; ++j) { const ExtensionBlock* const eb1 = image->ExtensionBlocks + j; const ExtensionBlock* const eb2 = image->ExtensionBlocks + j + 1; const char* const signature = (const char*)eb1->Bytes; const int signature_is_ok = (eb1->Function == APPLICATION_EXT_FUNC_CODE) && (eb1->ByteCount == 11) && (!memcmp(signature, "NETSCAPE2.0", 11) || !memcmp(signature, "ANIMEXTS1.0", 11)); if (signature_is_ok && eb2->Function == CONTINUE_EXT_FUNC_CODE && eb2->ByteCount >= 3 && eb2->Bytes[0] == 1) { const uint32_t extra_loop = ((uint32_t)(eb2->Bytes[2]) << 8) + ((uint32_t)(eb2->Bytes[1]) << 0); return (extra_loop > 0) ? extra_loop + 1 : 0; } } } return 1; // Default. } // Get duration of 'n'th frame in milliseconds. static int GetFrameDurationGIF(GifFileType* gif, int n) { GraphicsControlBlock gcb; memset(&gcb, 0, sizeof(gcb)); DGifSavedExtensionToGCB(gif, n, &gcb); return gcb.DelayTime * 10; } // Returns true if frame 'target' completely covers 'covered'. static int CoversFrameGIF(const GifImageDesc* const target, const GifImageDesc* const covered) { return target->Left <= covered->Left && covered->Left + covered->Width <= target->Left + target->Width && target->Top <= covered->Top && covered->Top + covered->Height <= target->Top + target->Height; } static void RemapPixelsGIF(const uint8_t* const src, const ColorMapObject* const cmap, int transparent_color, int len, uint8_t* dst) { int i; for (i = 0; i < len; ++i) { if (src[i] != transparent_color) { // If a pixel in the current frame is transparent, we don't modify it, so // that we can see-through the corresponding pixel from an earlier frame. const GifColorType c = cmap->Colors[src[i]]; dst[4 * i + 0] = c.Red; dst[4 * i + 1] = c.Green; dst[4 * i + 2] = c.Blue; dst[4 * i + 3] = 0xff; } } } static int ReadFrameGIF(const SavedImage* const gif_image, const ColorMapObject* cmap, int transparent_color, int out_stride, uint8_t* const dst) { const GifImageDesc* image_desc = &gif_image->ImageDesc; const uint8_t* in; uint8_t* out; int j; if (image_desc->ColorMap) cmap = image_desc->ColorMap; if (cmap == NULL || cmap->ColorCount != (1 << cmap->BitsPerPixel)) { fprintf(stderr, "Potentially corrupt color map.\n"); return 0; } in = (const uint8_t*)gif_image->RasterBits; out = dst + image_desc->Top * out_stride + image_desc->Left * kNumChannels; for (j = 0; j < image_desc->Height; ++j) { RemapPixelsGIF(in, cmap, transparent_color, image_desc->Width, out); in += image_desc->Width; out += out_stride; } return 1; } // Read animated GIF bitstream from 'filename' into 'AnimatedImage' struct. static int ReadAnimatedGIF(const char filename[], AnimatedImage* const image, int dump_frames, const char dump_folder[]) { uint32_t frame_count; uint32_t canvas_width, canvas_height; uint32_t i; int gif_error; GifFileType* gif; gif = DGifOpenFileUnicode((const W_CHAR*)filename, NULL); if (gif == NULL) { WFPRINTF(stderr, "Could not read file: %s.\n", (const W_CHAR*)filename); return 0; } gif_error = DGifSlurp(gif); if (gif_error != GIF_OK) { WFPRINTF(stderr, "Could not parse image: %s.\n", (const W_CHAR*)filename); GIFDisplayError(gif, gif_error); DGifCloseFile(gif, NULL); return 0; } // Animation properties. image->canvas_width = (uint32_t)gif->SWidth; image->canvas_height = (uint32_t)gif->SHeight; if (image->canvas_width > MAX_CANVAS_SIZE || image->canvas_height > MAX_CANVAS_SIZE) { fprintf(stderr, "Invalid canvas dimension: %d x %d\n", image->canvas_width, image->canvas_height); DGifCloseFile(gif, NULL); return 0; } image->loop_count = GetLoopCountGIF(gif); image->bgcolor = GetBackgroundColorGIF(gif); frame_count = (uint32_t)gif->ImageCount; if (frame_count == 0) { DGifCloseFile(gif, NULL); return 0; } if (image->canvas_width == 0 || image->canvas_height == 0) { image->canvas_width = gif->SavedImages[0].ImageDesc.Width; image->canvas_height = gif->SavedImages[0].ImageDesc.Height; gif->SavedImages[0].ImageDesc.Left = 0; gif->SavedImages[0].ImageDesc.Top = 0; if (image->canvas_width == 0 || image->canvas_height == 0) { fprintf(stderr, "Invalid canvas size in GIF.\n"); DGifCloseFile(gif, NULL); return 0; } } // Allocate frames. if (!AllocateFrames(image, frame_count)) { DGifCloseFile(gif, NULL); return 0; } canvas_width = image->canvas_width; canvas_height = image->canvas_height; // Decode and reconstruct frames. for (i = 0; i < frame_count; ++i) { const int canvas_width_in_bytes = canvas_width * kNumChannels; const SavedImage* const curr_gif_image = &gif->SavedImages[i]; GraphicsControlBlock curr_gcb; DecodedFrame* curr_frame; uint8_t* curr_rgba; memset(&curr_gcb, 0, sizeof(curr_gcb)); DGifSavedExtensionToGCB(gif, i, &curr_gcb); curr_frame = &image->frames[i]; curr_rgba = curr_frame->rgba; curr_frame->duration = GetFrameDurationGIF(gif, i); // Force frames with a small or no duration to 100ms to be consistent // with web browsers and other transcoding tools (like gif2webp itself). if (curr_frame->duration <= 10) curr_frame->duration = 100; if (i == 0) { // Initialize as transparent. curr_frame->is_key_frame = 1; ZeroFillCanvas(curr_rgba, canvas_width, canvas_height); } else { DecodedFrame* const prev_frame = &image->frames[i - 1]; const GifImageDesc* const prev_desc = &gif->SavedImages[i - 1].ImageDesc; GraphicsControlBlock prev_gcb; memset(&prev_gcb, 0, sizeof(prev_gcb)); DGifSavedExtensionToGCB(gif, i - 1, &prev_gcb); curr_frame->is_key_frame = IsKeyFrameGIF(prev_desc, prev_gcb.DisposalMode, prev_frame, canvas_width, canvas_height); if (curr_frame->is_key_frame) { // Initialize as transparent. ZeroFillCanvas(curr_rgba, canvas_width, canvas_height); } else { int prev_frame_disposed, curr_frame_opaque; int prev_frame_completely_covered; // Initialize with previous canvas. uint8_t* const prev_rgba = image->frames[i - 1].rgba; CopyCanvas(prev_rgba, curr_rgba, canvas_width, canvas_height); // Dispose previous frame rectangle. prev_frame_disposed = (prev_gcb.DisposalMode == DISPOSE_BACKGROUND || prev_gcb.DisposalMode == DISPOSE_PREVIOUS); curr_frame_opaque = (curr_gcb.TransparentColor == NO_TRANSPARENT_COLOR); prev_frame_completely_covered = curr_frame_opaque && CoversFrameGIF(&curr_gif_image->ImageDesc, prev_desc); if (prev_frame_disposed && !prev_frame_completely_covered) { switch (prev_gcb.DisposalMode) { case DISPOSE_BACKGROUND: { ZeroFillFrameRect(curr_rgba, canvas_width_in_bytes, prev_desc->Left, prev_desc->Top, prev_desc->Width, prev_desc->Height); break; } case DISPOSE_PREVIOUS: { int src_frame_num = i - 2; while (src_frame_num >= 0) { GraphicsControlBlock src_frame_gcb; memset(&src_frame_gcb, 0, sizeof(src_frame_gcb)); DGifSavedExtensionToGCB(gif, src_frame_num, &src_frame_gcb); if (src_frame_gcb.DisposalMode != DISPOSE_PREVIOUS) break; --src_frame_num; } if (src_frame_num >= 0) { // Restore pixels inside previous frame rectangle to // corresponding pixels in source canvas. uint8_t* const src_frame_rgba = image->frames[src_frame_num].rgba; CopyFrameRectangle(src_frame_rgba, curr_rgba, canvas_width_in_bytes, prev_desc->Left, prev_desc->Top, prev_desc->Width, prev_desc->Height); } else { // Source canvas doesn't exist. So clear previous frame // rectangle to background. ZeroFillFrameRect(curr_rgba, canvas_width_in_bytes, prev_desc->Left, prev_desc->Top, prev_desc->Width, prev_desc->Height); } break; } default: break; // Nothing to do. } } } } // Decode current frame. if (!ReadFrameGIF(curr_gif_image, gif->SColorMap, curr_gcb.TransparentColor, canvas_width_in_bytes, curr_rgba)) { DGifCloseFile(gif, NULL); return 0; } if (dump_frames) { if (!DumpFrame(filename, dump_folder, i, curr_rgba, canvas_width, canvas_height)) { DGifCloseFile(gif, NULL); return 0; } } } image->format = ANIM_GIF; DGifCloseFile(gif, NULL); return 1; } #else static int IsGIF(const WebPData* const data) { (void)data; return 0; } static int ReadAnimatedGIF(const char filename[], AnimatedImage* const image, int dump_frames, const char dump_folder[]) { (void)filename; (void)image; (void)dump_frames; (void)dump_folder; fprintf(stderr, "GIF support not compiled. Please install the libgif-dev " "package before building.\n"); return 0; } #endif // WEBP_HAVE_GIF // ----------------------------------------------------------------------------- int ReadAnimatedImage(const char filename[], AnimatedImage* const image, int dump_frames, const char dump_folder[]) { int ok = 0; WebPData webp_data; WebPDataInit(&webp_data); memset(image, 0, sizeof(*image)); if (!ImgIoUtilReadFile(filename, &webp_data.bytes, &webp_data.size)) { WFPRINTF(stderr, "Error reading file: %s\n", (const W_CHAR*)filename); return 0; } if (IsWebP(&webp_data)) { ok = ReadAnimatedWebP(filename, &webp_data, image, dump_frames, dump_folder); } else if (IsGIF(&webp_data)) { ok = ReadAnimatedGIF(filename, image, dump_frames, dump_folder); } else { WFPRINTF(stderr, "Unknown file type: %s. Supported file types are WebP and GIF\n", (const W_CHAR*)filename); ok = 0; } if (!ok) ClearAnimatedImage(image); WebPDataClear(&webp_data); return ok; } static void Accumulate(double v1, double v2, double* const max_diff, double* const sse) { const double diff = fabs(v1 - v2); if (diff > *max_diff) *max_diff = diff; *sse += diff * diff; } void GetDiffAndPSNR(const uint8_t rgba1[], const uint8_t rgba2[], uint32_t width, uint32_t height, int premultiply, int* const max_diff, double* const psnr) { const uint32_t stride = width * kNumChannels; const int kAlphaChannel = kNumChannels - 1; double f_max_diff = 0.; double sse = 0.; uint32_t x, y; for (y = 0; y < height; ++y) { for (x = 0; x < stride; x += kNumChannels) { int k; const size_t offset = (size_t)y * stride + x; const int alpha1 = rgba1[offset + kAlphaChannel]; const int alpha2 = rgba2[offset + kAlphaChannel]; Accumulate(alpha1, alpha2, &f_max_diff, &sse); if (!premultiply) { for (k = 0; k < kAlphaChannel; ++k) { Accumulate(rgba1[offset + k], rgba2[offset + k], &f_max_diff, &sse); } } else { // premultiply R/G/B channels with alpha value for (k = 0; k < kAlphaChannel; ++k) { Accumulate(rgba1[offset + k] * alpha1 / 255., rgba2[offset + k] * alpha2 / 255., &f_max_diff, &sse); } } } } *max_diff = (int)f_max_diff; if (*max_diff == 0) { *psnr = 99.; // PSNR when images are identical. } else { sse /= stride * height; *psnr = 4.3429448 * log(255. * 255. / sse); } } void GetAnimatedImageVersions(int* const decoder_version, int* const demux_version) { *decoder_version = WebPGetDecoderVersion(); *demux_version = WebPGetDemuxVersion(); } libwebp-1.4.0/examples/img2webp.c0000644000014400001440000002620614606317060013557 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // generate an animated WebP out of a sequence of images // (PNG, JPEG, ...) // // Example usage: // img2webp -o out.webp -q 40 -mixed -duration 40 input??.png // // Author: skal@google.com (Pascal Massimino) #include #include #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "../examples/example_util.h" #include "../imageio/image_dec.h" #include "../imageio/imageio_util.h" #include "./stopwatch.h" #include "./unicode.h" #include "sharpyuv/sharpyuv.h" #include "webp/encode.h" #include "webp/mux.h" //------------------------------------------------------------------------------ static void Help(void) { printf("Usage:\n\n"); printf(" img2webp [file_options] [[frame_options] frame_file]..."); printf(" [-o webp_file]\n\n"); printf("File-level options (only used at the start of compression):\n"); printf(" -min_size ............ minimize size\n"); printf(" -kmax .......... maximum number of frame between key-frames\n" " (0=only keyframes)\n"); printf(" -kmin .......... minimum number of frame between key-frames\n" " (0=disable key-frames altogether)\n"); printf(" -mixed ............... use mixed lossy/lossless automatic mode\n"); printf(" -near_lossless . use near-lossless image preprocessing\n" " (0..100=off), default=100\n"); printf(" -sharp_yuv ........... use sharper (and slower) RGB->YUV " "conversion\n " "(lossy only)\n"); printf(" -loop .......... loop count (default: 0, = infinite loop)\n"); printf(" -v ................... verbose mode\n"); printf(" -h ................... this help\n"); printf(" -version ............. print version number and exit\n"); printf("\n"); printf("Per-frame options (only used for subsequent images input):\n"); printf(" -d ............. frame duration in ms (default: 100)\n"); printf(" -lossless ........... use lossless mode (default)\n"); printf(" -lossy ... ........... use lossy mode\n"); printf(" -q ........... quality\n"); printf(" -m ............. method to use\n"); printf("\n"); printf("example: img2webp -loop 2 in0.png -lossy in1.jpg\n" " -d 80 in2.tiff -o out.webp\n"); printf("\nNote: if a single file name is passed as the argument, the " "arguments will be\n"); printf("tokenized from this file. The file name must not start with " "the character '-'.\n"); printf("\nSupported input formats:\n %s\n", WebPGetEnabledInputFileFormats()); } //------------------------------------------------------------------------------ static int ReadImage(const char filename[], WebPPicture* const pic) { const uint8_t* data = NULL; size_t data_size = 0; WebPImageReader reader; int ok; #ifdef HAVE_WINCODEC_H // Try to decode the file using WIC falling back to the other readers for // e.g., WebP. ok = ReadPictureWithWIC(filename, pic, 1, NULL); if (ok) return 1; #endif if (!ImgIoUtilReadFile(filename, &data, &data_size)) return 0; reader = WebPGuessImageReader(data, data_size); ok = reader(data, data_size, pic, 1, NULL); WebPFree((void*)data); return ok; } static int SetLoopCount(int loop_count, WebPData* const webp_data) { int ok = 1; WebPMuxError err; uint32_t features; WebPMuxAnimParams new_params; WebPMux* const mux = WebPMuxCreate(webp_data, 1); if (mux == NULL) return 0; err = WebPMuxGetFeatures(mux, &features); ok = (err == WEBP_MUX_OK); if (!ok || !(features & ANIMATION_FLAG)) goto End; err = WebPMuxGetAnimationParams(mux, &new_params); ok = (err == WEBP_MUX_OK); if (ok) { new_params.loop_count = loop_count; err = WebPMuxSetAnimationParams(mux, &new_params); ok = (err == WEBP_MUX_OK); } if (ok) { WebPDataClear(webp_data); err = WebPMuxAssemble(mux, webp_data); ok = (err == WEBP_MUX_OK); } End: WebPMuxDelete(mux); if (!ok) { fprintf(stderr, "Error during loop-count setting\n"); } return ok; } //------------------------------------------------------------------------------ int main(int argc, const char* argv[]) { const char* output = NULL; WebPAnimEncoder* enc = NULL; int verbose = 0; int pic_num = 0; int duration = 100; int timestamp_ms = 0; int loop_count = 0; int width = 0, height = 0; WebPAnimEncoderOptions anim_config; WebPConfig config; WebPPicture pic; WebPData webp_data; int c; int have_input = 0; CommandLineArguments cmd_args; int ok; INIT_WARGV(argc, argv); ok = ExUtilInitCommandLineArguments(argc - 1, argv + 1, &cmd_args); if (!ok) FREE_WARGV_AND_RETURN(1); argc = cmd_args.argc_; argv = cmd_args.argv_; WebPDataInit(&webp_data); if (!WebPAnimEncoderOptionsInit(&anim_config) || !WebPConfigInit(&config) || !WebPPictureInit(&pic)) { fprintf(stderr, "Library version mismatch!\n"); ok = 0; goto End; } // 1st pass of option parsing for (c = 0; ok && c < argc; ++c) { if (argv[c][0] == '-') { int parse_error = 0; if (!strcmp(argv[c], "-o") && c + 1 < argc) { argv[c] = NULL; output = (const char*)GET_WARGV_SHIFTED(argv, ++c); } else if (!strcmp(argv[c], "-kmin") && c + 1 < argc) { argv[c] = NULL; anim_config.kmin = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-kmax") && c + 1 < argc) { argv[c] = NULL; anim_config.kmax = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-loop") && c + 1 < argc) { argv[c] = NULL; loop_count = ExUtilGetInt(argv[++c], 0, &parse_error); if (loop_count < 0) { fprintf(stderr, "Invalid non-positive loop-count (%d)\n", loop_count); parse_error = 1; } } else if (!strcmp(argv[c], "-min_size")) { anim_config.minimize_size = 1; } else if (!strcmp(argv[c], "-mixed")) { anim_config.allow_mixed = 1; config.lossless = 0; } else if (!strcmp(argv[c], "-near_lossless") && c + 1 < argc) { argv[c] = NULL; config.near_lossless = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-sharp_yuv")) { config.use_sharp_yuv = 1; } else if (!strcmp(argv[c], "-v")) { verbose = 1; } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-version")) { const int enc_version = WebPGetEncoderVersion(); const int mux_version = WebPGetMuxVersion(); const int sharpyuv_version = SharpYuvGetVersion(); printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n", (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff, enc_version & 0xff, (mux_version >> 16) & 0xff, (mux_version >> 8) & 0xff, mux_version & 0xff); printf("libsharpyuv: %d.%d.%d\n", (sharpyuv_version >> 24) & 0xff, (sharpyuv_version >> 16) & 0xffff, sharpyuv_version & 0xff); goto End; } else { continue; } ok = !parse_error; if (!ok) goto End; argv[c] = NULL; // mark option as 'parsed' during 1st pass } else { have_input |= 1; } } if (!have_input) { fprintf(stderr, "No input file(s) for generating animation!\n"); goto End; } // image-reading pass pic_num = 0; config.lossless = 1; for (c = 0; ok && c < argc; ++c) { if (argv[c] == NULL) continue; if (argv[c][0] == '-') { // parse local options int parse_error = 0; if (!strcmp(argv[c], "-lossy")) { if (!anim_config.allow_mixed) config.lossless = 0; } else if (!strcmp(argv[c], "-lossless")) { if (!anim_config.allow_mixed) config.lossless = 1; } else if (!strcmp(argv[c], "-q") && c + 1 < argc) { config.quality = ExUtilGetFloat(argv[++c], &parse_error); } else if (!strcmp(argv[c], "-m") && c + 1 < argc) { config.method = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-d") && c + 1 < argc) { duration = ExUtilGetInt(argv[++c], 0, &parse_error); if (duration <= 0) { fprintf(stderr, "Invalid negative duration (%d)\n", duration); parse_error = 1; } } else { parse_error = 1; // shouldn't be here. fprintf(stderr, "Unknown option [%s]\n", argv[c]); } ok = !parse_error; if (!ok) goto End; continue; } if (ok) { ok = WebPValidateConfig(&config); if (!ok) { fprintf(stderr, "Invalid configuration.\n"); goto End; } } // read next input image pic.use_argb = 1; ok = ReadImage((const char*)GET_WARGV_SHIFTED(argv, c), &pic); if (!ok) goto End; if (enc == NULL) { width = pic.width; height = pic.height; enc = WebPAnimEncoderNew(width, height, &anim_config); ok = (enc != NULL); if (!ok) { fprintf(stderr, "Could not create WebPAnimEncoder object.\n"); } } if (ok) { ok = (width == pic.width && height == pic.height); if (!ok) { fprintf(stderr, "Frame #%d dimension mismatched! " "Got %d x %d. Was expecting %d x %d.\n", pic_num, pic.width, pic.height, width, height); } } if (ok) { ok = WebPAnimEncoderAdd(enc, &pic, timestamp_ms, &config); if (!ok) { fprintf(stderr, "Error while adding frame #%d\n", pic_num); } } WebPPictureFree(&pic); if (!ok) goto End; if (verbose) { WFPRINTF(stderr, "Added frame #%3d at time %4d (file: %s)\n", pic_num, timestamp_ms, GET_WARGV_SHIFTED(argv, c)); } timestamp_ms += duration; ++pic_num; } // add a last fake frame to signal the last duration ok = ok && WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL); ok = ok && WebPAnimEncoderAssemble(enc, &webp_data); if (!ok) { fprintf(stderr, "Error during final animation assembly.\n"); } End: // free resources WebPAnimEncoderDelete(enc); if (ok && loop_count > 0) { // Re-mux to add loop count. ok = SetLoopCount(loop_count, &webp_data); } if (ok) { if (output != NULL) { ok = ImgIoUtilWriteFile(output, webp_data.bytes, webp_data.size); if (ok) WFPRINTF(stderr, "output file: %s ", (const W_CHAR*)output); } else { fprintf(stderr, "[no output file specified] "); } } if (ok) { fprintf(stderr, "[%d frames, %u bytes].\n", pic_num, (unsigned int)webp_data.size); } WebPDataClear(&webp_data); ExUtilDeleteCommandLineArguments(&cmd_args); FREE_WARGV_AND_RETURN(ok ? 0 : 1); } libwebp-1.4.0/examples/Android.mk0000644000014400001440000000411314606317060013601 0ustar # Ignore this file during non-NDK builds. ifdef NDK_ROOT LOCAL_PATH := $(call my-dir) ################################################################################ # libexample_util include $(CLEAR_VARS) LOCAL_SRC_FILES := \ example_util.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src LOCAL_MODULE := example_util include $(BUILD_STATIC_LIBRARY) ################################################################################ # cwebp include $(CLEAR_VARS) # Note: to enable jpeg/png encoding the sources from AOSP can be used with # minor modification to their Android.mk files. LOCAL_SRC_FILES := \ cwebp.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webpdemux webp LOCAL_MODULE := cwebp include $(BUILD_EXECUTABLE) ################################################################################ # dwebp include $(CLEAR_VARS) LOCAL_SRC_FILES := \ dwebp.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_STATIC_LIBRARIES := example_util imagedec imageenc webpdemux webp LOCAL_MODULE := dwebp include $(BUILD_EXECUTABLE) ################################################################################ # webpmux include $(CLEAR_VARS) LOCAL_SRC_FILES := \ webpmux.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_STATIC_LIBRARIES := example_util imageio_util webpmux webp LOCAL_MODULE := webpmux_example include $(BUILD_EXECUTABLE) ################################################################################ # img2webp include $(CLEAR_VARS) LOCAL_SRC_FILES := \ img2webp.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webpmux webpdemux \ webp LOCAL_MODULE := img2webp_example include $(BUILD_EXECUTABLE) ################################################################################ # webpinfo include $(CLEAR_VARS) LOCAL_SRC_FILES := \ webpinfo.c \ LOCAL_CFLAGS := $(WEBP_CFLAGS) LOCAL_STATIC_LIBRARIES := example_util imageio_util webp LOCAL_MODULE := webpinfo_example include $(BUILD_EXECUTABLE) endif # NDK_ROOT libwebp-1.4.0/examples/vwebp.c0000644000014400001440000005211214606317060013161 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple OpenGL-based WebP file viewer. // // Author: Skal (pascal.massimino@gmail.com) #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #if defined(__unix__) || defined(__CYGWIN__) #define _POSIX_C_SOURCE 200112L // for setenv #endif #include #include #include #include #if defined(WEBP_HAVE_GL) #if defined(HAVE_GLUT_GLUT_H) #include #else #include #ifdef FREEGLUT #include #endif #endif #ifdef WEBP_HAVE_QCMS #include #endif #include "webp/decode.h" #include "webp/demux.h" #include "../examples/example_util.h" #include "../imageio/imageio_util.h" #include "./unicode.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif // Unfortunate global variables. Gathered into a struct for comfort. static struct { int has_animation; int has_color_profile; int done; int decoding_error; int print_info; int only_deltas; int use_color_profile; int draw_anim_background_color; int canvas_width, canvas_height; int loop_count; uint32_t bg_color; const char* file_name; WebPData data; WebPDecoderConfig config; const WebPDecBuffer* pic; WebPDemuxer* dmux; WebPIterator curr_frame; WebPIterator prev_frame; WebPChunkIterator iccp; int viewport_width, viewport_height; } kParams; static void ClearPreviousPic(void) { WebPFreeDecBuffer((WebPDecBuffer*)kParams.pic); kParams.pic = NULL; } static void ClearParams(void) { ClearPreviousPic(); WebPDataClear(&kParams.data); WebPDemuxReleaseIterator(&kParams.curr_frame); WebPDemuxReleaseIterator(&kParams.prev_frame); WebPDemuxReleaseChunkIterator(&kParams.iccp); WebPDemuxDelete(kParams.dmux); kParams.dmux = NULL; } // Sets the previous frame to the dimensions of the canvas and has it dispose // to background to cause the canvas to be cleared. static void ClearPreviousFrame(void) { WebPIterator* const prev = &kParams.prev_frame; prev->width = kParams.canvas_width; prev->height = kParams.canvas_height; prev->x_offset = prev->y_offset = 0; prev->dispose_method = WEBP_MUX_DISPOSE_BACKGROUND; } // ----------------------------------------------------------------------------- // Color profile handling static int ApplyColorProfile(const WebPData* const profile, WebPDecBuffer* const rgba) { #ifdef WEBP_HAVE_QCMS int i, ok = 0; uint8_t* line; uint8_t major_revision; qcms_profile* input_profile = NULL; qcms_profile* output_profile = NULL; qcms_transform* transform = NULL; const qcms_data_type input_type = QCMS_DATA_RGBA_8; const qcms_data_type output_type = QCMS_DATA_RGBA_8; const qcms_intent intent = QCMS_INTENT_DEFAULT; if (profile == NULL || rgba == NULL) return 0; if (profile->bytes == NULL || profile->size < 10) return 1; major_revision = profile->bytes[8]; qcms_enable_iccv4(); input_profile = qcms_profile_from_memory(profile->bytes, profile->size); // qcms_profile_is_bogus() is broken with ICCv4. if (input_profile == NULL || (major_revision < 4 && qcms_profile_is_bogus(input_profile))) { fprintf(stderr, "Color profile is bogus!\n"); goto Error; } output_profile = qcms_profile_sRGB(); if (output_profile == NULL) { fprintf(stderr, "Error creating output color profile!\n"); goto Error; } qcms_profile_precache_output_transform(output_profile); transform = qcms_transform_create(input_profile, input_type, output_profile, output_type, intent); if (transform == NULL) { fprintf(stderr, "Error creating color transform!\n"); goto Error; } line = rgba->u.RGBA.rgba; for (i = 0; i < rgba->height; ++i, line += rgba->u.RGBA.stride) { qcms_transform_data(transform, line, line, rgba->width); } ok = 1; Error: if (input_profile != NULL) qcms_profile_release(input_profile); if (output_profile != NULL) qcms_profile_release(output_profile); if (transform != NULL) qcms_transform_release(transform); return ok; #else (void)profile; (void)rgba; return 1; #endif // WEBP_HAVE_QCMS } //------------------------------------------------------------------------------ // File decoding static int Decode(void) { // Fills kParams.curr_frame const WebPIterator* const curr = &kParams.curr_frame; WebPDecoderConfig* const config = &kParams.config; WebPDecBuffer* const output_buffer = &config->output; int ok = 0; ClearPreviousPic(); output_buffer->colorspace = MODE_RGBA; ok = (WebPDecode(curr->fragment.bytes, curr->fragment.size, config) == VP8_STATUS_OK); if (!ok) { fprintf(stderr, "Decoding of frame #%d failed!\n", curr->frame_num); } else { kParams.pic = output_buffer; if (kParams.use_color_profile) { ok = ApplyColorProfile(&kParams.iccp.chunk, output_buffer); if (!ok) { fprintf(stderr, "Applying color profile to frame #%d failed!\n", curr->frame_num); } } } return ok; } static void decode_callback(int what) { if (what == 0 && !kParams.done) { int duration = 0; if (kParams.dmux != NULL) { WebPIterator* const curr = &kParams.curr_frame; if (!WebPDemuxNextFrame(curr)) { WebPDemuxReleaseIterator(curr); if (WebPDemuxGetFrame(kParams.dmux, 1, curr)) { --kParams.loop_count; kParams.done = (kParams.loop_count == 0); if (kParams.done) return; ClearPreviousFrame(); } else { kParams.decoding_error = 1; kParams.done = 1; return; } } duration = curr->duration; // Behavior copied from Chrome, cf: // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/ // platform/graphics/DeferredImageDecoder.cpp? // rcl=b4c33049f096cd283f32be9a58b9a9e768227c26&l=246 if (duration <= 10) duration = 100; } if (!Decode()) { kParams.decoding_error = 1; kParams.done = 1; } else { glutPostRedisplay(); glutTimerFunc(duration, decode_callback, what); } } } //------------------------------------------------------------------------------ // Callbacks static void HandleKey(unsigned char key, int pos_x, int pos_y) { // Note: rescaling the window or toggling some features during an animation // generates visual artifacts. This is not fixed because refreshing the frame // may require rendering the whole animation from start till current frame. (void)pos_x; (void)pos_y; if (key == 'q' || key == 'Q' || key == 27 /* Esc */) { #ifdef FREEGLUT glutLeaveMainLoop(); #else ClearParams(); exit(0); #endif } else if (key == 'c') { if (kParams.has_color_profile && !kParams.decoding_error) { kParams.use_color_profile = 1 - kParams.use_color_profile; if (kParams.has_animation) { // Restart the completed animation to pickup the color profile change. if (kParams.done && kParams.loop_count == 0) { kParams.loop_count = (int)WebPDemuxGetI(kParams.dmux, WEBP_FF_LOOP_COUNT) + 1; kParams.done = 0; // Start the decode loop immediately. glutTimerFunc(0, decode_callback, 0); } } else { Decode(); glutPostRedisplay(); } } } else if (key == 'b') { kParams.draw_anim_background_color = 1 - kParams.draw_anim_background_color; if (!kParams.has_animation) ClearPreviousFrame(); glutPostRedisplay(); } else if (key == 'i') { kParams.print_info = 1 - kParams.print_info; if (!kParams.has_animation) ClearPreviousFrame(); glutPostRedisplay(); } else if (key == 'd') { kParams.only_deltas = 1 - kParams.only_deltas; glutPostRedisplay(); } } static void HandleReshape(int width, int height) { // Note: reshape doesn't preserve aspect ratio, and might // be handling larger-than-screen pictures incorrectly. glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); kParams.viewport_width = width; kParams.viewport_height = height; if (!kParams.has_animation) ClearPreviousFrame(); } static void PrintString(const char* const text) { void* const font = GLUT_BITMAP_9_BY_15; int i; for (i = 0; text[i]; ++i) { glutBitmapCharacter(font, text[i]); } } static void PrintStringW(const char* const text) { #if defined(_WIN32) && defined(_UNICODE) void* const font = GLUT_BITMAP_9_BY_15; const W_CHAR* const wtext = (const W_CHAR*)text; int i; for (i = 0; wtext[i]; ++i) { glutBitmapCharacter(font, wtext[i]); } #else PrintString(text); #endif } static float GetColorf(uint32_t color, int shift) { return ((color >> shift) & 0xff) / 255.f; } static void DrawCheckerBoard(void) { const int square_size = 8; // must be a power of 2 int x, y; GLint viewport[4]; // x, y, width, height glPushMatrix(); glGetIntegerv(GL_VIEWPORT, viewport); // shift to integer coordinates with (0,0) being top-left. glOrtho(0, viewport[2], viewport[3], 0, -1, 1); for (y = 0; y < viewport[3]; y += square_size) { for (x = 0; x < viewport[2]; x += square_size) { const GLubyte color = 128 + 64 * (!((x + y) & square_size)); glColor3ub(color, color, color); glRecti(x, y, x + square_size, y + square_size); } } glPopMatrix(); } static void DrawBackground(void) { // Whole window cleared with clear color, checkerboard rendered on top of it. glClear(GL_COLOR_BUFFER_BIT); DrawCheckerBoard(); // ANIM background color rendered (blend) on top. Default is white for still // images (without ANIM chunk). glClear() can't be used for that (no blend). if (kParams.draw_anim_background_color) { glPushMatrix(); glLoadIdentity(); glColor4f(GetColorf(kParams.bg_color, 16), // BGRA from spec GetColorf(kParams.bg_color, 8), GetColorf(kParams.bg_color, 0), GetColorf(kParams.bg_color, 24)); glRecti(-1, -1, +1, +1); glPopMatrix(); } } // Draw background in a scissored rectangle. static void DrawBackgroundScissored(int window_x, int window_y, int frame_w, int frame_h) { // Only update the requested area, not the whole canvas. window_x = window_x * kParams.viewport_width / kParams.canvas_width; window_y = window_y * kParams.viewport_height / kParams.canvas_height; frame_w = frame_w * kParams.viewport_width / kParams.canvas_width; frame_h = frame_h * kParams.viewport_height / kParams.canvas_height; // glScissor() takes window coordinates (0,0 at bottom left). window_y = kParams.viewport_height - window_y - frame_h; glEnable(GL_SCISSOR_TEST); glScissor(window_x, window_y, frame_w, frame_h); DrawBackground(); glDisable(GL_SCISSOR_TEST); } static void HandleDisplay(void) { const WebPDecBuffer* const pic = kParams.pic; const WebPIterator* const curr = &kParams.curr_frame; WebPIterator* const prev = &kParams.prev_frame; GLfloat xoff, yoff; if (pic == NULL) return; glPushMatrix(); glPixelZoom((GLfloat)(+1. / kParams.canvas_width * kParams.viewport_width), (GLfloat)(-1. / kParams.canvas_height * kParams.viewport_height)); xoff = (GLfloat)(2. * curr->x_offset / kParams.canvas_width); yoff = (GLfloat)(2. * curr->y_offset / kParams.canvas_height); glRasterPos2f(-1.f + xoff, 1.f - yoff); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ROW_LENGTH, pic->u.RGBA.stride / 4); if (kParams.only_deltas) { DrawBackground(); } else { // The rectangle of the previous frame might be different than the current // frame, so we may need to DrawBackgroundScissored for both. if (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { // Clear the previous frame rectangle. DrawBackgroundScissored(prev->x_offset, prev->y_offset, prev->width, prev->height); } if (curr->blend_method == WEBP_MUX_NO_BLEND) { // We simulate no-blending behavior by first clearing the current frame // rectangle and then alpha-blending against it. DrawBackgroundScissored(curr->x_offset, curr->y_offset, curr->width, curr->height); } } *prev = *curr; glDrawPixels(pic->width, pic->height, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)pic->u.RGBA.rgba); if (kParams.print_info) { char tmp[32]; glColor4f(0.90f, 0.0f, 0.90f, 1.0f); glRasterPos2f(-0.95f, 0.90f); PrintStringW(kParams.file_name); snprintf(tmp, sizeof(tmp), "Dimension:%d x %d", pic->width, pic->height); glColor4f(0.90f, 0.0f, 0.90f, 1.0f); glRasterPos2f(-0.95f, 0.80f); PrintString(tmp); if (curr->x_offset != 0 || curr->y_offset != 0) { snprintf(tmp, sizeof(tmp), " (offset:%d,%d)", curr->x_offset, curr->y_offset); glRasterPos2f(-0.95f, 0.70f); PrintString(tmp); } } glPopMatrix(); #if defined(__APPLE__) || defined(_WIN32) glFlush(); #else glutSwapBuffers(); #endif } static void StartDisplay(const char* filename) { int width = kParams.canvas_width; int height = kParams.canvas_height; int screen_width, screen_height; const char viewername[] = " - WebP viewer"; // max linux file len + viewername string char title[4096 + sizeof(viewername)] = ""; // TODO(webp:365) GLUT_DOUBLE results in flickering / old frames to be // partially displayed with animated webp + alpha. #if defined(__APPLE__) || defined(_WIN32) glutInitDisplayMode(GLUT_RGBA); #else glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); #endif screen_width = glutGet(GLUT_SCREEN_WIDTH); screen_height = glutGet(GLUT_SCREEN_HEIGHT); if (width > screen_width || height > screen_height) { if (width > screen_width) { height = (height * screen_width + width - 1) / width; width = screen_width; } if (height > screen_height) { width = (width * screen_height + height - 1) / height; height = screen_height; } } snprintf(title, sizeof(title), "%s%s", filename, viewername); glutInitWindowSize(width, height); glutCreateWindow(title); glutDisplayFunc(HandleDisplay); glutReshapeFunc(HandleReshape); glutIdleFunc(NULL); glutKeyboardFunc(HandleKey); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glClearColor(0, 0, 0, 0); // window will be cleared to black (no blend) DrawBackground(); } //------------------------------------------------------------------------------ // Main static void Help(void) { printf( "Usage: vwebp in_file [options]\n\n" "Decodes the WebP image file and visualize it using OpenGL\n" "Options are:\n" " -version ..... print version number and exit\n" " -noicc ....... don't use the icc profile if present\n" " -nofancy ..... don't use the fancy YUV420 upscaler\n" " -nofilter .... disable in-loop filtering\n" " -dither dithering strength (0..100), default=50\n" " -noalphadither disable alpha plane dithering\n" " -usebgcolor .. display background color\n" " -mt .......... use multi-threading\n" " -info ........ print info\n" " -h ........... this help message\n" "\n" "Keyboard shortcuts:\n" " 'c' ................ toggle use of color profile\n" " 'b' ................ toggle background color display\n" " 'i' ................ overlay file information\n" " 'd' ................ disable blending & disposal (debug)\n" " 'q' / 'Q' / ESC .... quit\n"); } int main(int argc, char* argv[]) { int c, file_name_argv_index = 1; WebPDecoderConfig* const config = &kParams.config; WebPIterator* const curr = &kParams.curr_frame; INIT_WARGV(argc, argv); if (!WebPInitDecoderConfig(config)) { fprintf(stderr, "Library version mismatch!\n"); FREE_WARGV_AND_RETURN(-1); } config->options.dithering_strength = 50; config->options.alpha_dithering_strength = 100; kParams.use_color_profile = 1; // Background color hidden by default to see transparent areas. kParams.draw_anim_background_color = 0; for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-noicc")) { kParams.use_color_profile = 0; } else if (!strcmp(argv[c], "-nofancy")) { config->options.no_fancy_upsampling = 1; } else if (!strcmp(argv[c], "-nofilter")) { config->options.bypass_filtering = 1; } else if (!strcmp(argv[c], "-noalphadither")) { config->options.alpha_dithering_strength = 0; } else if (!strcmp(argv[c], "-usebgcolor")) { kParams.draw_anim_background_color = 1; } else if (!strcmp(argv[c], "-dither") && c + 1 < argc) { config->options.dithering_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-info")) { kParams.print_info = 1; } else if (!strcmp(argv[c], "-version")) { const int dec_version = WebPGetDecoderVersion(); const int dmux_version = WebPGetDemuxVersion(); printf("WebP Decoder version: %d.%d.%d\nWebP Demux version: %d.%d.%d\n", (dec_version >> 16) & 0xff, (dec_version >> 8) & 0xff, dec_version & 0xff, (dmux_version >> 16) & 0xff, (dmux_version >> 8) & 0xff, dmux_version & 0xff); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-mt")) { config->options.use_threads = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) { kParams.file_name = (const char*)GET_WARGV(argv, ++c); file_name_argv_index = c; } break; } else if (argv[c][0] == '-') { printf("Unknown option '%s'\n", argv[c]); Help(); FREE_WARGV_AND_RETURN(-1); } else { kParams.file_name = (const char*)GET_WARGV(argv, c); file_name_argv_index = c; } if (parse_error) { Help(); FREE_WARGV_AND_RETURN(-1); } } if (kParams.file_name == NULL) { printf("missing input file!!\n"); Help(); FREE_WARGV_AND_RETURN(0); } if (!ImgIoUtilReadFile(kParams.file_name, &kParams.data.bytes, &kParams.data.size)) { goto Error; } if (!WebPGetInfo(kParams.data.bytes, kParams.data.size, NULL, NULL)) { fprintf(stderr, "Input file doesn't appear to be WebP format.\n"); goto Error; } kParams.dmux = WebPDemux(&kParams.data); if (kParams.dmux == NULL) { fprintf(stderr, "Could not create demuxing object!\n"); goto Error; } kParams.canvas_width = WebPDemuxGetI(kParams.dmux, WEBP_FF_CANVAS_WIDTH); kParams.canvas_height = WebPDemuxGetI(kParams.dmux, WEBP_FF_CANVAS_HEIGHT); if (kParams.print_info) { printf("Canvas: %d x %d\n", kParams.canvas_width, kParams.canvas_height); } ClearPreviousFrame(); memset(&kParams.iccp, 0, sizeof(kParams.iccp)); kParams.has_color_profile = !!(WebPDemuxGetI(kParams.dmux, WEBP_FF_FORMAT_FLAGS) & ICCP_FLAG); if (kParams.has_color_profile) { #ifdef WEBP_HAVE_QCMS if (!WebPDemuxGetChunk(kParams.dmux, "ICCP", 1, &kParams.iccp)) goto Error; printf("VP8X: Found color profile\n"); #else fprintf(stderr, "Warning: color profile present, but qcms is unavailable!\n" "Build libqcms from Mozilla or Chromium and define WEBP_HAVE_QCMS " "before building.\n"); #endif } if (!WebPDemuxGetFrame(kParams.dmux, 1, curr)) goto Error; kParams.has_animation = (curr->num_frames > 1); kParams.loop_count = (int)WebPDemuxGetI(kParams.dmux, WEBP_FF_LOOP_COUNT); kParams.bg_color = WebPDemuxGetI(kParams.dmux, WEBP_FF_BACKGROUND_COLOR); printf("VP8X: Found %d images in file (loop count = %d)\n", curr->num_frames, kParams.loop_count); // Decode first frame if (!Decode()) goto Error; // Position iterator to last frame. Next call to HandleDisplay will wrap over. // We take this into account by bumping up loop_count. if (!WebPDemuxGetFrame(kParams.dmux, 0, curr)) goto Error; if (kParams.loop_count) ++kParams.loop_count; #if defined(__unix__) || defined(__CYGWIN__) // Work around GLUT compositor bug. // https://bugs.launchpad.net/ubuntu/+source/freeglut/+bug/369891 setenv("XLIB_SKIP_ARGB_VISUALS", "1", 1); #endif // Start display (and timer) glutInit(&argc, argv); #ifdef FREEGLUT glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION); #endif StartDisplay(argv[file_name_argv_index]); if (kParams.has_animation) glutTimerFunc(0, decode_callback, 0); glutMainLoop(); // Should only be reached when using FREEGLUT: ClearParams(); FREE_WARGV_AND_RETURN(0); Error: ClearParams(); FREE_WARGV_AND_RETURN(-1); } #else // !WEBP_HAVE_GL int main(int argc, const char* argv[]) { fprintf(stderr, "OpenGL support not enabled in %s.\n", argv[0]); (void)argc; return 0; } #endif //------------------------------------------------------------------------------ libwebp-1.4.0/examples/unicode_gif.h0000644000014400001440000000362014606317060014316 0ustar // Copyright 2018 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // giflib doesn't have a Unicode DGifOpenFileName(). Let's make one. // // Author: Yannis Guyon (yguyon@google.com) #ifndef WEBP_EXAMPLES_UNICODE_GIF_H_ #define WEBP_EXAMPLES_UNICODE_GIF_H_ #include "./unicode.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" // For WEBP_HAVE_GIF #endif #if defined(WEBP_HAVE_GIF) #ifdef _WIN32 #include // Not standard, needed for _topen and flags. #include #endif #include #include #include "./gifdec.h" #if !defined(STDIN_FILENO) #define STDIN_FILENO 0 #endif static GifFileType* DGifOpenFileUnicode(const W_CHAR* file_name, int* error) { if (!WSTRCMP(file_name, "-")) { #if LOCAL_GIF_PREREQ(5, 0) return DGifOpenFileHandle(STDIN_FILENO, error); #else (void)error; return DGifOpenFileHandle(STDIN_FILENO); #endif } #if defined(_WIN32) && defined(_UNICODE) { int file_handle = _wopen(file_name, _O_RDONLY | _O_BINARY); if (file_handle == -1) { if (error != NULL) *error = D_GIF_ERR_OPEN_FAILED; return NULL; } #if LOCAL_GIF_PREREQ(5, 0) return DGifOpenFileHandle(file_handle, error); #else return DGifOpenFileHandle(file_handle); #endif } #else #if LOCAL_GIF_PREREQ(5, 0) return DGifOpenFileName(file_name, error); #else return DGifOpenFileName(file_name); #endif #endif // defined(_WIN32) && defined(_UNICODE) // DGifCloseFile() is called later. } #endif // defined(WEBP_HAVE_GIF) #endif // WEBP_EXAMPLES_UNICODE_GIF_H_ libwebp-1.4.0/examples/example_util.c0000644000014400001440000001015414606317060014526 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utility functions used by the example programs. // #include "./example_util.h" #include #include #include #include #include "webp/mux_types.h" #include "../imageio/imageio_util.h" //------------------------------------------------------------------------------ // String parsing uint32_t ExUtilGetUInt(const char* const v, int base, int* const error) { char* end = NULL; const uint32_t n = (v != NULL) ? (uint32_t)strtoul(v, &end, base) : 0u; if (end == v && error != NULL && !*error) { *error = 1; fprintf(stderr, "Error! '%s' is not an integer.\n", (v != NULL) ? v : "(null)"); } return n; } int ExUtilGetInt(const char* const v, int base, int* const error) { return (int)ExUtilGetUInt(v, base, error); } int ExUtilGetInts(const char* v, int base, int max_output, int output[]) { int n, error = 0; for (n = 0; v != NULL && n < max_output; ++n) { const int value = ExUtilGetInt(v, base, &error); if (error) return -1; output[n] = value; v = strchr(v, ','); if (v != NULL) ++v; // skip over the trailing ',' } return n; } float ExUtilGetFloat(const char* const v, int* const error) { char* end = NULL; const float f = (v != NULL) ? (float)strtod(v, &end) : 0.f; if (end == v && error != NULL && !*error) { *error = 1; fprintf(stderr, "Error! '%s' is not a floating point number.\n", (v != NULL) ? v : "(null)"); } return f; } //------------------------------------------------------------------------------ static void ResetCommandLineArguments(int argc, const char* argv[], CommandLineArguments* const args) { assert(args != NULL); args->argc_ = argc; args->argv_ = argv; args->own_argv_ = 0; WebPDataInit(&args->argv_data_); } void ExUtilDeleteCommandLineArguments(CommandLineArguments* const args) { if (args != NULL) { if (args->own_argv_) { WebPFree((void*)args->argv_); WebPDataClear(&args->argv_data_); } ResetCommandLineArguments(0, NULL, args); } } #define MAX_ARGC 16384 int ExUtilInitCommandLineArguments(int argc, const char* argv[], CommandLineArguments* const args) { if (args == NULL || argv == NULL) return 0; ResetCommandLineArguments(argc, argv, args); if (argc == 1 && argv[0][0] != '-') { char* cur; const char sep[] = " \t\r\n\f\v"; #if defined(_WIN32) && defined(_UNICODE) fprintf(stderr, "Error: Reading arguments from a file is a feature unavailable " "with Unicode binaries.\n"); return 0; #endif if (!ExUtilReadFileToWebPData(argv[0], &args->argv_data_)) { return 0; } args->own_argv_ = 1; args->argv_ = (const char**)WebPMalloc(MAX_ARGC * sizeof(*args->argv_)); if (args->argv_ == NULL) { ExUtilDeleteCommandLineArguments(args); return 0; } argc = 0; for (cur = strtok((char*)args->argv_data_.bytes, sep); cur != NULL; cur = strtok(NULL, sep)) { if (argc == MAX_ARGC) { fprintf(stderr, "ERROR: Arguments limit %d reached\n", MAX_ARGC); ExUtilDeleteCommandLineArguments(args); return 0; } assert(strlen(cur) != 0); args->argv_[argc++] = cur; } args->argc_ = argc; } return 1; } //------------------------------------------------------------------------------ int ExUtilReadFileToWebPData(const char* const filename, WebPData* const webp_data) { const uint8_t* data; size_t size; if (webp_data == NULL) return 0; if (!ImgIoUtilReadFile(filename, &data, &size)) return 0; webp_data->bytes = data; webp_data->size = size; return 1; } libwebp-1.4.0/examples/unicode.h0000644000014400001440000001062414606317060013473 0ustar // Copyright 2018 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Unicode support for Windows. The main idea is to maintain an array of Unicode // arguments (wargv) and use it only for file paths. The regular argv is used // for everything else. // // Author: Yannis Guyon (yguyon@google.com) #ifndef WEBP_EXAMPLES_UNICODE_H_ #define WEBP_EXAMPLES_UNICODE_H_ #include #if defined(_WIN32) && defined(_UNICODE) // wchar_t is used instead of TCHAR because we only perform additional work when // Unicode is enabled and because the output of CommandLineToArgvW() is wchar_t. #include #include #include #include #include // Create a wchar_t array containing Unicode parameters. #define INIT_WARGV(ARGC, ARGV) \ int wargc; \ const W_CHAR** const wargv = \ (const W_CHAR**)CommandLineToArgvW(GetCommandLineW(), &wargc); \ do { \ if (wargv == NULL || wargc != (ARGC)) { \ fprintf(stderr, "Error: Unable to get Unicode arguments.\n"); \ FREE_WARGV_AND_RETURN(-1); \ } \ } while (0) // Use this to get a Unicode argument (e.g. file path). #define GET_WARGV(UNUSED, C) wargv[C] // For cases where argv is shifted by one compared to wargv. #define GET_WARGV_SHIFTED(UNUSED, C) wargv[(C) + 1] #define GET_WARGV_OR_NULL() wargv // Release resources. LocalFree() is needed after CommandLineToArgvW(). #define FREE_WARGV() LOCAL_FREE((W_CHAR** const)wargv) #define LOCAL_FREE(WARGV) \ do { \ if ((WARGV) != NULL) LocalFree(WARGV); \ } while (0) #define W_CHAR wchar_t // WCHAR without underscore might already be defined. #define TO_W_CHAR(STR) (L##STR) #define WFOPEN(ARG, OPT) _wfopen((const W_CHAR*)ARG, TO_W_CHAR(OPT)) #define WFPRINTF(STREAM, STR, ...) \ do { \ int prev_mode; \ fflush(STREAM); \ prev_mode = _setmode(_fileno(STREAM), _O_U8TEXT); \ fwprintf(STREAM, TO_W_CHAR(STR), __VA_ARGS__); \ fflush(STREAM); \ (void)_setmode(_fileno(STREAM), prev_mode); \ } while (0) #define WPRINTF(STR, ...) WFPRINTF(stdout, STR, __VA_ARGS__) #define WSTRLEN(FILENAME) wcslen((const W_CHAR*)FILENAME) #define WSTRCMP(FILENAME, STR) wcscmp((const W_CHAR*)FILENAME, TO_W_CHAR(STR)) #define WSTRRCHR(FILENAME, STR) wcsrchr((const W_CHAR*)FILENAME, TO_W_CHAR(STR)) #define WSNPRINTF(A, B, STR, ...) _snwprintf(A, B, TO_W_CHAR(STR), __VA_ARGS__) #else #include // Unicode file paths work as is on Unix platforms, and no extra work is done on // Windows either if Unicode is disabled. #define INIT_WARGV(ARGC, ARGV) #define GET_WARGV(ARGV, C) (ARGV)[C] #define GET_WARGV_SHIFTED(ARGV, C) (ARGV)[C] #define GET_WARGV_OR_NULL() NULL #define FREE_WARGV() #define LOCAL_FREE(WARGV) #define W_CHAR char #define TO_W_CHAR(STR) (STR) #define WFOPEN(ARG, OPT) fopen(ARG, OPT) #define WPRINTF(STR, ...) printf(STR, __VA_ARGS__) #define WFPRINTF(STREAM, STR, ...) fprintf(STREAM, STR, __VA_ARGS__) #define WSTRLEN(FILENAME) strlen(FILENAME) #define WSTRCMP(FILENAME, STR) strcmp(FILENAME, STR) #define WSTRRCHR(FILENAME, STR) strrchr(FILENAME, STR) #define WSNPRINTF(A, B, STR, ...) snprintf(A, B, STR, __VA_ARGS__) #endif // defined(_WIN32) && defined(_UNICODE) // Don't forget to free wargv before returning (e.g. from main). #define FREE_WARGV_AND_RETURN(VALUE) \ do { \ FREE_WARGV(); \ return (VALUE); \ } while (0) #endif // WEBP_EXAMPLES_UNICODE_H_ libwebp-1.4.0/examples/webpmux.c0000644000014400001440000012466114606317060013536 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Simple command-line to create a WebP container file and to extract or strip // relevant data from the container file. // // Authors: Vikas (vikaas.arora@gmail.com), // Urvang (urvang@google.com) /* Usage examples: Create container WebP file: webpmux -frame anim_1.webp +100+10+10 \ -frame anim_2.webp +100+25+25+1 \ -frame anim_3.webp +100+50+50+1 \ -frame anim_4.webp +100 \ -loop 10 -bgcolor 128,255,255,255 \ -o out_animation_container.webp webpmux -set icc image_profile.icc in.webp -o out_icc_container.webp webpmux -set exif image_metadata.exif in.webp -o out_exif_container.webp webpmux -set xmp image_metadata.xmp in.webp -o out_xmp_container.webp webpmux -set loop 1 in.webp -o out_looped.webp Extract relevant data from WebP container file: webpmux -get frame n in.webp -o out_frame.webp webpmux -get icc in.webp -o image_profile.icc webpmux -get exif in.webp -o image_metadata.exif webpmux -get xmp in.webp -o image_metadata.xmp Strip data from WebP Container file: webpmux -strip icc in.webp -o out.webp webpmux -strip exif in.webp -o out.webp webpmux -strip xmp in.webp -o out.webp Change duration of frame intervals: webpmux -duration 150 in.webp -o out.webp webpmux -duration 33,2 in.webp -o out.webp webpmux -duration 200,10,0 -duration 150,6,50 in.webp -o out.webp Misc: webpmux -info in.webp webpmux [ -h | -help ] webpmux -version webpmux argument_file_name */ #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include #include #include #include #include "webp/decode.h" #include "webp/mux.h" #include "../examples/example_util.h" #include "../imageio/imageio_util.h" #include "./unicode.h" //------------------------------------------------------------------------------ // Config object to parse command-line arguments. typedef enum { NIL_ACTION = 0, ACTION_GET, ACTION_SET, ACTION_STRIP, ACTION_INFO, ACTION_HELP, ACTION_DURATION } ActionType; typedef enum { NIL_SUBTYPE = 0, SUBTYPE_ANMF, SUBTYPE_LOOP, SUBTYPE_BGCOLOR } FeatureSubType; typedef struct { FeatureSubType subtype_; const char* filename_; const char* params_; } FeatureArg; typedef enum { NIL_FEATURE = 0, FEATURE_EXIF, FEATURE_XMP, FEATURE_ICCP, FEATURE_ANMF, FEATURE_DURATION, FEATURE_LOOP, FEATURE_BGCOLOR, LAST_FEATURE } FeatureType; static const char* const kFourccList[LAST_FEATURE] = { NULL, "EXIF", "XMP ", "ICCP", "ANMF" }; static const char* const kDescriptions[LAST_FEATURE] = { NULL, "EXIF metadata", "XMP metadata", "ICC profile", "Animation frame" }; typedef struct { CommandLineArguments cmd_args_; ActionType action_type_; const char* input_; const char* output_; FeatureType type_; FeatureArg* args_; int arg_count_; } Config; //------------------------------------------------------------------------------ // Helper functions. static int CountOccurrences(const CommandLineArguments* const args, const char* const arg) { int i; int num_occurences = 0; for (i = 0; i < args->argc_; ++i) { if (!strcmp(args->argv_[i], arg)) { ++num_occurences; } } return num_occurences; } static const char* const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = { "WEBP_MUX_NOT_FOUND", "WEBP_MUX_INVALID_ARGUMENT", "WEBP_MUX_BAD_DATA", "WEBP_MUX_MEMORY_ERROR", "WEBP_MUX_NOT_ENOUGH_DATA" }; static const char* ErrorString(WebPMuxError err) { assert(err <= WEBP_MUX_NOT_FOUND && err >= WEBP_MUX_NOT_ENOUGH_DATA); return kErrorMessages[-err]; } #define RETURN_IF_ERROR(ERR_MSG) \ do { \ if (err != WEBP_MUX_OK) { \ fprintf(stderr, ERR_MSG); \ return err; \ } \ } while (0) #define RETURN_IF_ERROR3(ERR_MSG, FORMAT_STR1, FORMAT_STR2) \ do { \ if (err != WEBP_MUX_OK) { \ fprintf(stderr, ERR_MSG, FORMAT_STR1, FORMAT_STR2); \ return err; \ } \ } while (0) #define ERROR_GOTO1(ERR_MSG, LABEL) \ do { \ fprintf(stderr, ERR_MSG); \ ok = 0; \ goto LABEL; \ } while (0) #define ERROR_GOTO2(ERR_MSG, FORMAT_STR, LABEL) \ do { \ fprintf(stderr, ERR_MSG, FORMAT_STR); \ ok = 0; \ goto LABEL; \ } while (0) #define ERROR_GOTO3(ERR_MSG, FORMAT_STR1, FORMAT_STR2, LABEL) \ do { \ fprintf(stderr, ERR_MSG, FORMAT_STR1, FORMAT_STR2); \ ok = 0; \ goto LABEL; \ } while (0) static WebPMuxError DisplayInfo(const WebPMux* mux) { int width, height; uint32_t flag; WebPMuxError err = WebPMuxGetCanvasSize(mux, &width, &height); assert(err == WEBP_MUX_OK); // As WebPMuxCreate() was successful earlier. printf("Canvas size: %d x %d\n", width, height); err = WebPMuxGetFeatures(mux, &flag); RETURN_IF_ERROR("Failed to retrieve features\n"); if (flag == 0) { printf("No features present.\n"); return err; } // Print the features present. printf("Features present:"); if (flag & ANIMATION_FLAG) printf(" animation"); if (flag & ICCP_FLAG) printf(" ICC profile"); if (flag & EXIF_FLAG) printf(" EXIF metadata"); if (flag & XMP_FLAG) printf(" XMP metadata"); if (flag & ALPHA_FLAG) printf(" transparency"); printf("\n"); if (flag & ANIMATION_FLAG) { const WebPChunkId id = WEBP_CHUNK_ANMF; const char* const type_str = "frame"; int nFrames; WebPMuxAnimParams params; err = WebPMuxGetAnimationParams(mux, ¶ms); assert(err == WEBP_MUX_OK); printf("Background color : 0x%.8X Loop Count : %d\n", params.bgcolor, params.loop_count); err = WebPMuxNumChunks(mux, id, &nFrames); assert(err == WEBP_MUX_OK); printf("Number of %ss: %d\n", type_str, nFrames); if (nFrames > 0) { int i; printf("No.: width height alpha x_offset y_offset "); printf("duration dispose blend "); printf("image_size compression\n"); for (i = 1; i <= nFrames; i++) { WebPMuxFrameInfo frame; err = WebPMuxGetFrame(mux, i, &frame); if (err == WEBP_MUX_OK) { WebPBitstreamFeatures features; const VP8StatusCode status = WebPGetFeatures( frame.bitstream.bytes, frame.bitstream.size, &features); assert(status == VP8_STATUS_OK); // Checked by WebPMuxCreate(). (void)status; printf("%3d: %5d %5d %5s %8d %8d ", i, features.width, features.height, features.has_alpha ? "yes" : "no", frame.x_offset, frame.y_offset); { const char* const dispose = (frame.dispose_method == WEBP_MUX_DISPOSE_NONE) ? "none" : "background"; const char* const blend = (frame.blend_method == WEBP_MUX_BLEND) ? "yes" : "no"; printf("%8d %10s %5s ", frame.duration, dispose, blend); } printf("%10d %11s\n", (int)frame.bitstream.size, (features.format == 1) ? "lossy" : (features.format == 2) ? "lossless" : "undefined"); } WebPDataClear(&frame.bitstream); RETURN_IF_ERROR3("Failed to retrieve %s#%d\n", type_str, i); } } } if (flag & ICCP_FLAG) { WebPData icc_profile; err = WebPMuxGetChunk(mux, "ICCP", &icc_profile); assert(err == WEBP_MUX_OK); printf("Size of the ICC profile data: %d\n", (int)icc_profile.size); } if (flag & EXIF_FLAG) { WebPData exif; err = WebPMuxGetChunk(mux, "EXIF", &exif); assert(err == WEBP_MUX_OK); printf("Size of the EXIF metadata: %d\n", (int)exif.size); } if (flag & XMP_FLAG) { WebPData xmp; err = WebPMuxGetChunk(mux, "XMP ", &xmp); assert(err == WEBP_MUX_OK); printf("Size of the XMP metadata: %d\n", (int)xmp.size); } if ((flag & ALPHA_FLAG) && !(flag & ANIMATION_FLAG)) { WebPMuxFrameInfo image; err = WebPMuxGetFrame(mux, 1, &image); if (err == WEBP_MUX_OK) { printf("Size of the image (with alpha): %d\n", (int)image.bitstream.size); } WebPDataClear(&image.bitstream); RETURN_IF_ERROR("Failed to retrieve the image\n"); } return WEBP_MUX_OK; } static void PrintHelp(void) { printf("Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT\n"); printf(" webpmux -set SET_OPTIONS INPUT -o OUTPUT\n"); printf(" webpmux -duration DURATION_OPTIONS [-duration ...]\n"); printf(" INPUT -o OUTPUT\n"); printf(" webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT\n"); printf(" webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]" "\n"); printf(" [-bgcolor BACKGROUND_COLOR] -o OUTPUT\n"); printf(" webpmux -info INPUT\n"); printf(" webpmux [-h|-help]\n"); printf(" webpmux -version\n"); printf(" webpmux argument_file_name\n"); printf("\n"); printf("GET_OPTIONS:\n"); printf(" Extract relevant data:\n"); printf(" icc get ICC profile\n"); printf(" exif get EXIF metadata\n"); printf(" xmp get XMP metadata\n"); printf(" frame n get nth frame\n"); printf("\n"); printf("SET_OPTIONS:\n"); printf(" Set color profile/metadata/parameters:\n"); printf(" loop LOOP_COUNT set the loop count\n"); printf(" bgcolor BACKGROUND_COLOR set the animation background color\n"); printf(" icc file.icc set ICC profile\n"); printf(" exif file.exif set EXIF metadata\n"); printf(" xmp file.xmp set XMP metadata\n"); printf(" where: 'file.icc' contains the ICC profile to be set,\n"); printf(" 'file.exif' contains the EXIF metadata to be set\n"); printf(" 'file.xmp' contains the XMP metadata to be set\n"); printf("\n"); printf("DURATION_OPTIONS:\n"); printf(" Set duration of selected frames:\n"); printf(" duration set duration for all frames\n"); printf(" duration,frame set duration of a particular frame\n"); printf(" duration,start,end set duration of frames in the\n"); printf(" interval [start,end])\n"); printf(" where: 'duration' is the duration in milliseconds\n"); printf(" 'start' is the start frame index\n"); printf(" 'end' is the inclusive end frame index\n"); printf(" The special 'end' value '0' means: last frame.\n"); printf("\n"); printf("STRIP_OPTIONS:\n"); printf(" Strip color profile/metadata:\n"); printf(" icc strip ICC profile\n"); printf(" exif strip EXIF metadata\n"); printf(" xmp strip XMP metadata\n"); printf("\n"); printf("FRAME_OPTIONS(i):\n"); printf(" Create animation:\n"); printf(" file_i +di[+xi+yi[+mi[bi]]]\n"); printf(" where: 'file_i' is the i'th animation frame (WebP format),\n"); printf(" 'di' is the pause duration before next frame,\n"); printf(" 'xi','yi' specify the image offset for this frame,\n"); printf(" 'mi' is the dispose method for this frame (0 or 1),\n"); printf(" 'bi' is the blending method for this frame (+b or -b)" "\n"); printf("\n"); printf("LOOP_COUNT:\n"); printf(" Number of times to repeat the animation.\n"); printf(" Valid range is 0 to 65535 [Default: 0 (infinite)].\n"); printf("\n"); printf("BACKGROUND_COLOR:\n"); printf(" Background color of the canvas.\n"); printf(" A,R,G,B\n"); printf(" where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 " "specifying\n"); printf(" the Alpha, Red, Green and Blue component values " "respectively\n"); printf(" [Default: 255,255,255,255]\n"); printf("\nINPUT & OUTPUT are in WebP format.\n"); printf("\nNote: The nature of EXIF, XMP and ICC data is not checked"); printf(" and is assumed to be\nvalid.\n"); printf("\nNote: if a single file name is passed as the argument, the " "arguments will be\n"); printf("tokenized from this file. The file name must not start with " "the character '-'.\n"); } static void WarnAboutOddOffset(const WebPMuxFrameInfo* const info) { if ((info->x_offset | info->y_offset) & 1) { fprintf(stderr, "Warning: odd offsets will be snapped to even values" " (%d, %d) -> (%d, %d)\n", info->x_offset, info->y_offset, info->x_offset & ~1, info->y_offset & ~1); } } static int CreateMux(const char* const filename, WebPMux** mux) { WebPData bitstream; assert(mux != NULL); if (!ExUtilReadFileToWebPData(filename, &bitstream)) return 0; *mux = WebPMuxCreate(&bitstream, 1); WebPDataClear(&bitstream); if (*mux != NULL) return 1; WFPRINTF(stderr, "Failed to create mux object from file %s.\n", (const W_CHAR*)filename); return 0; } static int WriteData(const char* filename, const WebPData* const webpdata) { int ok = 0; FILE* fout = WSTRCMP(filename, "-") ? WFOPEN(filename, "wb") : ImgIoUtilSetBinaryMode(stdout); if (fout == NULL) { WFPRINTF(stderr, "Error opening output WebP file %s!\n", (const W_CHAR*)filename); return 0; } if (fwrite(webpdata->bytes, webpdata->size, 1, fout) != 1) { WFPRINTF(stderr, "Error writing file %s!\n", (const W_CHAR*)filename); } else { WFPRINTF(stderr, "Saved file %s (%d bytes)\n", (const W_CHAR*)filename, (int)webpdata->size); ok = 1; } if (fout != stdout) fclose(fout); return ok; } static int WriteWebP(WebPMux* const mux, const char* filename) { int ok; WebPData webp_data; const WebPMuxError err = WebPMuxAssemble(mux, &webp_data); if (err != WEBP_MUX_OK) { fprintf(stderr, "Error (%s) assembling the WebP file.\n", ErrorString(err)); return 0; } ok = WriteData(filename, &webp_data); WebPDataClear(&webp_data); return ok; } static WebPMux* DuplicateMuxHeader(const WebPMux* const mux) { WebPMux* new_mux = WebPMuxNew(); WebPMuxAnimParams p; WebPMuxError err; int i; int ok = 1; if (new_mux == NULL) return NULL; err = WebPMuxGetAnimationParams(mux, &p); if (err == WEBP_MUX_OK) { err = WebPMuxSetAnimationParams(new_mux, &p); if (err != WEBP_MUX_OK) { ERROR_GOTO2("Error (%s) handling animation params.\n", ErrorString(err), End); } } else { /* it might not be an animation. Just keep moving. */ } for (i = 1; i <= 3; ++i) { WebPData metadata; err = WebPMuxGetChunk(mux, kFourccList[i], &metadata); if (err == WEBP_MUX_OK && metadata.size > 0) { err = WebPMuxSetChunk(new_mux, kFourccList[i], &metadata, 1); if (err != WEBP_MUX_OK) { ERROR_GOTO1("Error transferring metadata in DuplicateMuxHeader().", End); } } } End: if (!ok) { WebPMuxDelete(new_mux); new_mux = NULL; } return new_mux; } static int ParseFrameArgs(const char* args, WebPMuxFrameInfo* const info) { int dispose_method, unused; char plus_minus, blend_method; const int num_args = sscanf(args, "+%d+%d+%d+%d%c%c+%d", &info->duration, &info->x_offset, &info->y_offset, &dispose_method, &plus_minus, &blend_method, &unused); switch (num_args) { case 1: info->x_offset = info->y_offset = 0; // fall through case 3: dispose_method = 0; // fall through case 4: plus_minus = '+'; blend_method = 'b'; // fall through case 6: break; case 2: case 5: default: return 0; } WarnAboutOddOffset(info); // Note: The validity of the following conversion is checked by // WebPMuxPushFrame(). info->dispose_method = (WebPMuxAnimDispose)dispose_method; if (blend_method != 'b') return 0; if (plus_minus != '-' && plus_minus != '+') return 0; info->blend_method = (plus_minus == '+') ? WEBP_MUX_BLEND : WEBP_MUX_NO_BLEND; return 1; } static int ParseBgcolorArgs(const char* args, uint32_t* const bgcolor) { uint32_t a, r, g, b; if (sscanf(args, "%u,%u,%u,%u", &a, &r, &g, &b) != 4) return 0; if (a >= 256 || r >= 256 || g >= 256 || b >= 256) return 0; *bgcolor = (a << 24) | (r << 16) | (g << 8) | (b << 0); return 1; } //------------------------------------------------------------------------------ // Clean-up. static void DeleteConfig(Config* const config) { if (config != NULL) { free(config->args_); ExUtilDeleteCommandLineArguments(&config->cmd_args_); memset(config, 0, sizeof(*config)); } } //------------------------------------------------------------------------------ // Parsing. // Basic syntactic checks on the command-line arguments. // Returns 1 on valid, 0 otherwise. // Also fills up num_feature_args to be number of feature arguments given. // (e.g. if there are 4 '-frame's and 1 '-loop', then num_feature_args = 5). static int ValidateCommandLine(const CommandLineArguments* const cmd_args, int* num_feature_args) { int num_frame_args; int num_loop_args; int num_bgcolor_args; int num_durations_args; int ok = 1; assert(num_feature_args != NULL); *num_feature_args = 0; // Simple checks. if (CountOccurrences(cmd_args, "-get") > 1) { ERROR_GOTO1("ERROR: Multiple '-get' arguments specified.\n", ErrValidate); } if (CountOccurrences(cmd_args, "-set") > 1) { ERROR_GOTO1("ERROR: Multiple '-set' arguments specified.\n", ErrValidate); } if (CountOccurrences(cmd_args, "-strip") > 1) { ERROR_GOTO1("ERROR: Multiple '-strip' arguments specified.\n", ErrValidate); } if (CountOccurrences(cmd_args, "-info") > 1) { ERROR_GOTO1("ERROR: Multiple '-info' arguments specified.\n", ErrValidate); } if (CountOccurrences(cmd_args, "-o") > 1) { ERROR_GOTO1("ERROR: Multiple output files specified.\n", ErrValidate); } // Compound checks. num_frame_args = CountOccurrences(cmd_args, "-frame"); num_loop_args = CountOccurrences(cmd_args, "-loop"); num_bgcolor_args = CountOccurrences(cmd_args, "-bgcolor"); num_durations_args = CountOccurrences(cmd_args, "-duration"); if (num_loop_args > 1) { ERROR_GOTO1("ERROR: Multiple loop counts specified.\n", ErrValidate); } if (num_bgcolor_args > 1) { ERROR_GOTO1("ERROR: Multiple background colors specified.\n", ErrValidate); } if ((num_frame_args == 0) && (num_loop_args + num_bgcolor_args > 0)) { ERROR_GOTO1("ERROR: Loop count and background color are relevant only in " "case of animation.\n", ErrValidate); } if (num_durations_args > 0 && num_frame_args != 0) { ERROR_GOTO1("ERROR: Can not combine -duration and -frame commands.\n", ErrValidate); } assert(ok == 1); if (num_durations_args > 0) { *num_feature_args = num_durations_args; } else if (num_frame_args == 0) { // Single argument ('set' action for ICCP/EXIF/XMP, OR a 'get' action). *num_feature_args = 1; } else { // Multiple arguments ('set' action for animation) *num_feature_args = num_frame_args + num_loop_args + num_bgcolor_args; } ErrValidate: return ok; } #define ACTION_IS_NIL (config->action_type_ == NIL_ACTION) #define FEATURETYPE_IS_NIL (config->type_ == NIL_FEATURE) #define CHECK_NUM_ARGS_AT_LEAST(NUM, LABEL) \ do { \ if (argc < i + (NUM)) { \ fprintf(stderr, "ERROR: Too few arguments for '%s'.\n", argv[i]); \ goto LABEL; \ } \ } while (0) #define CHECK_NUM_ARGS_AT_MOST(NUM, LABEL) \ do { \ if (argc > i + (NUM)) { \ fprintf(stderr, "ERROR: Too many arguments for '%s'.\n", argv[i]); \ goto LABEL; \ } \ } while (0) #define CHECK_NUM_ARGS_EXACTLY(NUM, LABEL) \ do { \ CHECK_NUM_ARGS_AT_LEAST(NUM, LABEL); \ CHECK_NUM_ARGS_AT_MOST(NUM, LABEL); \ } while (0) // Parses command-line arguments to fill up config object. Also performs some // semantic checks. unicode_argv contains wchar_t arguments or is null. static int ParseCommandLine(Config* config, const W_CHAR** const unicode_argv) { int i = 0; int feature_arg_index = 0; int ok = 1; int argc = config->cmd_args_.argc_; const char* const* argv = config->cmd_args_.argv_; // Unicode file paths will be used if available. const char* const* wargv = (unicode_argv != NULL) ? (const char**)(unicode_argv + 1) : argv; while (i < argc) { FeatureArg* const arg = &config->args_[feature_arg_index]; if (argv[i][0] == '-') { // One of the action types or output. if (!strcmp(argv[i], "-set")) { if (ACTION_IS_NIL) { config->action_type_ = ACTION_SET; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } ++i; } else if (!strcmp(argv[i], "-duration")) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); if (ACTION_IS_NIL || config->action_type_ == ACTION_DURATION) { config->action_type_ = ACTION_DURATION; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } if (FEATURETYPE_IS_NIL || config->type_ == FEATURE_DURATION) { config->type_ = FEATURE_DURATION; } else { ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse); } arg->params_ = argv[i + 1]; ++feature_arg_index; i += 2; } else if (!strcmp(argv[i], "-get")) { if (ACTION_IS_NIL) { config->action_type_ = ACTION_GET; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } ++i; } else if (!strcmp(argv[i], "-strip")) { if (ACTION_IS_NIL) { config->action_type_ = ACTION_STRIP; config->arg_count_ = 0; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } ++i; } else if (!strcmp(argv[i], "-frame")) { CHECK_NUM_ARGS_AT_LEAST(3, ErrParse); if (ACTION_IS_NIL || config->action_type_ == ACTION_SET) { config->action_type_ = ACTION_SET; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } if (FEATURETYPE_IS_NIL || config->type_ == FEATURE_ANMF) { config->type_ = FEATURE_ANMF; } else { ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse); } arg->subtype_ = SUBTYPE_ANMF; arg->filename_ = wargv[i + 1]; arg->params_ = argv[i + 2]; ++feature_arg_index; i += 3; } else if (!strcmp(argv[i], "-loop") || !strcmp(argv[i], "-bgcolor")) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); if (ACTION_IS_NIL || config->action_type_ == ACTION_SET) { config->action_type_ = ACTION_SET; } else { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } if (FEATURETYPE_IS_NIL || config->type_ == FEATURE_ANMF) { config->type_ = FEATURE_ANMF; } else { ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse); } arg->subtype_ = !strcmp(argv[i], "-loop") ? SUBTYPE_LOOP : SUBTYPE_BGCOLOR; arg->params_ = argv[i + 1]; ++feature_arg_index; i += 2; } else if (!strcmp(argv[i], "-o")) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); config->output_ = wargv[i + 1]; i += 2; } else if (!strcmp(argv[i], "-info")) { CHECK_NUM_ARGS_EXACTLY(2, ErrParse); if (config->action_type_ != NIL_ACTION) { ERROR_GOTO1("ERROR: Multiple actions specified.\n", ErrParse); } else { config->action_type_ = ACTION_INFO; config->arg_count_ = 0; config->input_ = wargv[i + 1]; } i += 2; } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "-help")) { PrintHelp(); DeleteConfig(config); LOCAL_FREE((W_CHAR** const)unicode_argv); exit(0); } else if (!strcmp(argv[i], "-version")) { const int version = WebPGetMuxVersion(); printf("%d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); DeleteConfig(config); LOCAL_FREE((W_CHAR** const)unicode_argv); exit(0); } else if (!strcmp(argv[i], "--")) { if (i < argc - 1) { ++i; if (config->input_ == NULL) { config->input_ = wargv[i]; } else { ERROR_GOTO2("ERROR at '%s': Multiple input files specified.\n", argv[i], ErrParse); } } break; } else { ERROR_GOTO2("ERROR: Unknown option: '%s'.\n", argv[i], ErrParse); } } else { // One of the feature types or input. if (ACTION_IS_NIL) { ERROR_GOTO1("ERROR: Action must be specified before other arguments.\n", ErrParse); } if (!strcmp(argv[i], "icc") || !strcmp(argv[i], "exif") || !strcmp(argv[i], "xmp")) { if (FEATURETYPE_IS_NIL) { config->type_ = (!strcmp(argv[i], "icc")) ? FEATURE_ICCP : (!strcmp(argv[i], "exif")) ? FEATURE_EXIF : FEATURE_XMP; } else { ERROR_GOTO1("ERROR: Multiple features specified.\n", ErrParse); } if (config->action_type_ == ACTION_SET) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); arg->filename_ = wargv[i + 1]; ++feature_arg_index; i += 2; } else { ++i; } } else if (!strcmp(argv[i], "frame") && (config->action_type_ == ACTION_GET)) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); config->type_ = FEATURE_ANMF; arg->params_ = argv[i + 1]; ++feature_arg_index; i += 2; } else if (!strcmp(argv[i], "loop") && (config->action_type_ == ACTION_SET)) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); config->type_ = FEATURE_LOOP; arg->params_ = argv[i + 1]; ++feature_arg_index; i += 2; } else if (!strcmp(argv[i], "bgcolor") && (config->action_type_ == ACTION_SET)) { CHECK_NUM_ARGS_AT_LEAST(2, ErrParse); config->type_ = FEATURE_BGCOLOR; arg->params_ = argv[i + 1]; ++feature_arg_index; i += 2; } else { // Assume input file. if (config->input_ == NULL) { config->input_ = wargv[i]; } else { ERROR_GOTO2("ERROR at '%s': Multiple input files specified.\n", argv[i], ErrParse); } ++i; } } } ErrParse: return ok; } // Additional checks after config is filled. static int ValidateConfig(Config* const config) { int ok = 1; // Action. if (ACTION_IS_NIL) { ERROR_GOTO1("ERROR: No action specified.\n", ErrValidate2); } // Feature type. if (FEATURETYPE_IS_NIL && config->action_type_ != ACTION_INFO) { ERROR_GOTO1("ERROR: No feature specified.\n", ErrValidate2); } // Input file. if (config->input_ == NULL) { if (config->action_type_ != ACTION_SET) { ERROR_GOTO1("ERROR: No input file specified.\n", ErrValidate2); } else if (config->type_ != FEATURE_ANMF) { ERROR_GOTO1("ERROR: No input file specified.\n", ErrValidate2); } } // Output file. if (config->output_ == NULL && config->action_type_ != ACTION_INFO) { ERROR_GOTO1("ERROR: No output file specified.\n", ErrValidate2); } ErrValidate2: return ok; } // Create config object from command-line arguments. static int InitializeConfig(int argc, const char* argv[], Config* const config, const W_CHAR** const unicode_argv) { int num_feature_args = 0; int ok; memset(config, 0, sizeof(*config)); ok = ExUtilInitCommandLineArguments(argc, argv, &config->cmd_args_); if (!ok) return 0; // Validate command-line arguments. if (!ValidateCommandLine(&config->cmd_args_, &num_feature_args)) { ERROR_GOTO1("Exiting due to command-line parsing error.\n", Err1); } config->arg_count_ = num_feature_args; config->args_ = (FeatureArg*)calloc(num_feature_args, sizeof(*config->args_)); if (config->args_ == NULL) { ERROR_GOTO1("ERROR: Memory allocation error.\n", Err1); } // Parse command-line. if (!ParseCommandLine(config, unicode_argv) || !ValidateConfig(config)) { ERROR_GOTO1("Exiting due to command-line parsing error.\n", Err1); } Err1: return ok; } #undef ACTION_IS_NIL #undef FEATURETYPE_IS_NIL #undef CHECK_NUM_ARGS_AT_LEAST #undef CHECK_NUM_ARGS_AT_MOST #undef CHECK_NUM_ARGS_EXACTLY //------------------------------------------------------------------------------ // Processing. static int GetFrame(const WebPMux* mux, const Config* config) { WebPMuxError err = WEBP_MUX_OK; WebPMux* mux_single = NULL; int num = 0; int ok = 1; int parse_error = 0; const WebPChunkId id = WEBP_CHUNK_ANMF; WebPMuxFrameInfo info; WebPDataInit(&info.bitstream); num = ExUtilGetInt(config->args_[0].params_, 10, &parse_error); if (num < 0) { ERROR_GOTO1("ERROR: Frame/Fragment index must be non-negative.\n", ErrGet); } if (parse_error) goto ErrGet; err = WebPMuxGetFrame(mux, num, &info); if (err == WEBP_MUX_OK && info.id != id) err = WEBP_MUX_NOT_FOUND; if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR (%s): Could not get frame %d.\n", ErrorString(err), num, ErrGet); } mux_single = WebPMuxNew(); if (mux_single == NULL) { err = WEBP_MUX_MEMORY_ERROR; ERROR_GOTO2("ERROR (%s): Could not allocate a mux object.\n", ErrorString(err), ErrGet); } err = WebPMuxSetImage(mux_single, &info.bitstream, 1); if (err != WEBP_MUX_OK) { ERROR_GOTO2("ERROR (%s): Could not create single image mux object.\n", ErrorString(err), ErrGet); } ok = WriteWebP(mux_single, config->output_); ErrGet: WebPDataClear(&info.bitstream); WebPMuxDelete(mux_single); return ok && !parse_error; } // Read and process config. static int Process(const Config* config) { WebPMux* mux = NULL; WebPData chunk; WebPMuxError err = WEBP_MUX_OK; int ok = 1; switch (config->action_type_) { case ACTION_GET: { ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; switch (config->type_) { case FEATURE_ANMF: ok = GetFrame(mux, config); break; case FEATURE_ICCP: case FEATURE_EXIF: case FEATURE_XMP: err = WebPMuxGetChunk(mux, kFourccList[config->type_], &chunk); if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR (%s): Could not get the %s.\n", ErrorString(err), kDescriptions[config->type_], Err2); } ok = WriteData(config->output_, &chunk); break; default: ERROR_GOTO1("ERROR: Invalid feature for action 'get'.\n", Err2); break; } break; } case ACTION_SET: { switch (config->type_) { case FEATURE_ANMF: { int i; WebPMuxAnimParams params = { 0xFFFFFFFF, 0 }; mux = WebPMuxNew(); if (mux == NULL) { ERROR_GOTO2("ERROR (%s): Could not allocate a mux object.\n", ErrorString(WEBP_MUX_MEMORY_ERROR), Err2); } for (i = 0; i < config->arg_count_; ++i) { switch (config->args_[i].subtype_) { case SUBTYPE_BGCOLOR: { uint32_t bgcolor; ok = ParseBgcolorArgs(config->args_[i].params_, &bgcolor); if (!ok) { ERROR_GOTO1("ERROR: Could not parse the background color \n", Err2); } params.bgcolor = bgcolor; break; } case SUBTYPE_LOOP: { int parse_error = 0; const int loop_count = ExUtilGetInt(config->args_[i].params_, 10, &parse_error); if (loop_count < 0 || loop_count > 65535) { // Note: This is only a 'necessary' condition for loop_count // to be valid. The 'sufficient' conditioned in checked in // WebPMuxSetAnimationParams() method called later. ERROR_GOTO1("ERROR: Loop count must be in the range 0 to " "65535.\n", Err2); } ok = !parse_error; if (!ok) goto Err2; params.loop_count = loop_count; break; } case SUBTYPE_ANMF: { WebPMuxFrameInfo frame; frame.id = WEBP_CHUNK_ANMF; ok = ExUtilReadFileToWebPData(config->args_[i].filename_, &frame.bitstream); if (!ok) goto Err2; ok = ParseFrameArgs(config->args_[i].params_, &frame); if (!ok) { WebPDataClear(&frame.bitstream); ERROR_GOTO1("ERROR: Could not parse frame properties.\n", Err2); } err = WebPMuxPushFrame(mux, &frame, 1); WebPDataClear(&frame.bitstream); if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR (%s): Could not add a frame at index %d." "\n", ErrorString(err), i, Err2); } break; } default: { ERROR_GOTO1("ERROR: Invalid subtype for 'frame'", Err2); break; } } } err = WebPMuxSetAnimationParams(mux, ¶ms); if (err != WEBP_MUX_OK) { ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n", ErrorString(err), Err2); } break; } case FEATURE_ICCP: case FEATURE_EXIF: case FEATURE_XMP: { ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; ok = ExUtilReadFileToWebPData(config->args_[0].filename_, &chunk); if (!ok) goto Err2; err = WebPMuxSetChunk(mux, kFourccList[config->type_], &chunk, 1); WebPDataClear(&chunk); if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR (%s): Could not set the %s.\n", ErrorString(err), kDescriptions[config->type_], Err2); } break; } case FEATURE_LOOP: { WebPMuxAnimParams params = { 0xFFFFFFFF, 0 }; int parse_error = 0; const int loop_count = ExUtilGetInt(config->args_[0].params_, 10, &parse_error); if (loop_count < 0 || loop_count > 65535 || parse_error) { ERROR_GOTO1("ERROR: Loop count must be in the range 0 to 65535.\n", Err2); } ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; ok = (WebPMuxGetAnimationParams(mux, ¶ms) == WEBP_MUX_OK); if (!ok) { ERROR_GOTO1("ERROR: input file does not seem to be an animation.\n", Err2); } params.loop_count = loop_count; err = WebPMuxSetAnimationParams(mux, ¶ms); ok = (err == WEBP_MUX_OK); if (!ok) { ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n", ErrorString(err), Err2); } break; } case FEATURE_BGCOLOR: { WebPMuxAnimParams params = { 0xFFFFFFFF, 0 }; uint32_t bgcolor; ok = ParseBgcolorArgs(config->args_[0].params_, &bgcolor); if (!ok) { ERROR_GOTO1("ERROR: Could not parse the background color.\n", Err2); } ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; ok = (WebPMuxGetAnimationParams(mux, ¶ms) == WEBP_MUX_OK); if (!ok) { ERROR_GOTO1("ERROR: input file does not seem to be an animation.\n", Err2); } params.bgcolor = bgcolor; err = WebPMuxSetAnimationParams(mux, ¶ms); ok = (err == WEBP_MUX_OK); if (!ok) { ERROR_GOTO2("ERROR (%s): Could not set animation parameters.\n", ErrorString(err), Err2); } break; } default: { ERROR_GOTO1("ERROR: Invalid feature for action 'set'.\n", Err2); break; } } ok = WriteWebP(mux, config->output_); break; } case ACTION_DURATION: { int num_frames; ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; err = WebPMuxNumChunks(mux, WEBP_CHUNK_ANMF, &num_frames); ok = (err == WEBP_MUX_OK); if (!ok) { ERROR_GOTO1("ERROR: can not parse the number of frames.\n", Err2); } if (num_frames == 0) { fprintf(stderr, "Doesn't look like the source is animated. " "Skipping duration setting.\n"); ok = WriteWebP(mux, config->output_); if (!ok) goto Err2; } else { int i; int* durations = NULL; WebPMux* new_mux = DuplicateMuxHeader(mux); if (new_mux == NULL) goto Err2; durations = (int*)WebPMalloc((size_t)num_frames * sizeof(*durations)); if (durations == NULL) goto Err2; for (i = 0; i < num_frames; ++i) durations[i] = -1; // Parse intervals to process. for (i = 0; i < config->arg_count_; ++i) { int k; int args[3]; int duration, start, end; const int nb_args = ExUtilGetInts(config->args_[i].params_, 10, 3, args); ok = (nb_args >= 1); if (!ok) goto Err3; duration = args[0]; if (duration < 0) { ERROR_GOTO1("ERROR: duration must be strictly positive.\n", Err3); } if (nb_args == 1) { // only duration is present -> use full interval start = 1; end = num_frames; } else { start = args[1]; if (start <= 0) { start = 1; } else if (start > num_frames) { start = num_frames; } end = (nb_args >= 3) ? args[2] : start; if (end == 0 || end > num_frames) end = num_frames; } for (k = start; k <= end; ++k) { assert(k >= 1 && k <= num_frames); durations[k - 1] = duration; } } // Apply non-negative durations to their destination frames. for (i = 1; i <= num_frames; ++i) { WebPMuxFrameInfo frame; err = WebPMuxGetFrame(mux, i, &frame); if (err != WEBP_MUX_OK || frame.id != WEBP_CHUNK_ANMF) { ERROR_GOTO2("ERROR: can not retrieve frame #%d.\n", i, Err3); } if (durations[i - 1] >= 0) frame.duration = durations[i - 1]; err = WebPMuxPushFrame(new_mux, &frame, 1); if (err != WEBP_MUX_OK) { ERROR_GOTO2("ERROR: error push frame data #%d\n", i, Err3); } WebPDataClear(&frame.bitstream); } WebPMuxDelete(mux); ok = WriteWebP(new_mux, config->output_); mux = new_mux; // transfer for the WebPMuxDelete() call new_mux = NULL; Err3: WebPFree(durations); WebPMuxDelete(new_mux); if (!ok) goto Err2; } break; } case ACTION_STRIP: { ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; if (config->type_ == FEATURE_ICCP || config->type_ == FEATURE_EXIF || config->type_ == FEATURE_XMP) { err = WebPMuxDeleteChunk(mux, kFourccList[config->type_]); if (err != WEBP_MUX_OK) { ERROR_GOTO3("ERROR (%s): Could not strip the %s.\n", ErrorString(err), kDescriptions[config->type_], Err2); } } else { ERROR_GOTO1("ERROR: Invalid feature for action 'strip'.\n", Err2); break; } ok = WriteWebP(mux, config->output_); break; } case ACTION_INFO: { ok = CreateMux(config->input_, &mux); if (!ok) goto Err2; ok = (DisplayInfo(mux) == WEBP_MUX_OK); break; } default: { assert(0); // Invalid action. break; } } Err2: WebPMuxDelete(mux); return ok; } //------------------------------------------------------------------------------ // Main. int main(int argc, const char* argv[]) { Config config; int ok; INIT_WARGV(argc, argv); ok = InitializeConfig(argc - 1, argv + 1, &config, GET_WARGV_OR_NULL()); if (ok) { ok = Process(&config); } else { PrintHelp(); } DeleteConfig(&config); FREE_WARGV_AND_RETURN(!ok); } //------------------------------------------------------------------------------ libwebp-1.4.0/examples/test_ref.ppm0000644000014400001440000014001714606317060014225 0ustar P6 128 128 255 ËáûËáûËáûËáûËáûËáûËáûËáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÐãýÐãýÐãýÐãýÒäþÒäþÒäþÒäþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒäþÒäþÒäþÒäþÓåÿÓåÿÓåÿÓåÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûËáûËáûËáûËáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÏäýÐãýÐãýÐãýÒäþÒäþÒäþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒäþÒäþÒäþÒäþÓåÿÓåÿÓåÿÓåÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûËáûËáûËáûËáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÏäûÏäûÏäûÏäûÐåýÐåýÐåýÐåýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒäþÒäþÒäþÒäþÓåÿÓåÿÓåÿÓåÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûËáûËáûËáûËáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÌáûÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÎåûÎåûÎåûÎåûÏæýÏæýÏæýÏæýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒäþÒäþÒäþÒäþÓåÿÓåÿÓåÿÓåÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûÌâýÌâýÌâýÌâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÎåûÎåùÎåùÎåùÏæúÏæúÏæúÏæýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓåÿÓåÿÓåÿÓåÿÔæÿÔæÿÔæÿÔæÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÒèùÒèùÒèùÒèùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûÌâýÌâýÌâýÌâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåýÒèûÒèûÒèûÒèûÐæúÐæúÐæúÐæúÐåýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓåÿÓåÿÓåÿÓåÿÔæÿÔæÿÔæÿÔæÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÒèùÒèùÒèùÒèùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûÌâýÌâýÌâýÌâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåýÐæúÒåøÒåøÒåøÒåøÒåøÒåøÐæúÐåýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓåÿÓåÿÓåÿÓåÿÔæÿÔæÿÔæÿÔæÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÒèùÒèùÒèùÒèùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ËáûËáûËáûËáûÌâýÌâýÌâýÌâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäÿÐãÿÐãÿÐãÿÏäýÏäýÏäýÐãýÒäþÒåýÒåýÒåýÏáóÏáóÏáóÏáñÔåöÔåöÔåöÔåøÒåúÒåýÒåýÐåýÐåýÐåýÐåýÐåþÓåÿÓåÿÓåÿÓåÿÔæÿÔæÿÔæÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÔèÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéÿÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÔêûÔêûÔêûÔêûÔêûÔêûÔêûÔêûÓéúÓéúÓéúÓéúÒèùÒèùÒèùÒèùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒæÿÐåþÒäþÐãýÎáúÒâûÐáúÕåÿÎáýÔæÿÔæÿÓãýÏßøÉÚð·ÆÜ‡–ª‰—©›­±»ÎŸª»©³ÅÌÖèÖáòÓáñÖèøÔåö×éûÒåøÒåúÖêÿÐæúÒæþÓæþÓæþÓæþÓæþÔèÿÔèÿÔèÿÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÕëÿÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëý×ëþ×ëþ×ëþ×ëþÖêýÖêýÖêýÖêýÕéûÕéûÕéûÕéûÔèúÔèúÔèúÔèúÓæùÓæùÓæùÓæùÒåøÒåøÒåøÒåøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒäþÒäþÓãý×èÿÕãþÒßúÕäÿÌÛøÈÙò«Åm{•dqˆhtŒlvŒs{…‹y‘‡Ÿ‘—¨¤ªº°¶Æ½ÆÕÎÜêÓäóÕæ÷ÔåöÖèúÓæùÐäùÔêþÓæûÓæûÓæûÓæûÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëý×ëþ×ëþ×ëþ×ëþÖêýÖêýÖêýÖêýÕéûÕéûÕéûÕéûÔèúÔèúÔèúÔèúÓæùÓæùÓæùÓæùÒåøÒåøÒåøÒåøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÌáùÎãûÓåÿÕèÿÒâûÓãýÔâýÙæÿÓáû©·Òlz•\j„mz”hqŒmw‚‹¡†‰ž¥‚–‡‹ž‚”°³Å¸½Ë•›©¿ËÙÓãòÖæö׿øÔåöÖèúÕéûÐä÷ÓæûÓæûÓæûÓæûÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëý×ëþ×ëþ×ëþ×ëþÖêýÖêýÖêýÖêýÕéûÕéûÕéûÕéûÔèúÔèúÔèúÔèúÓæùÓæùÓæùÓæùÒåøÒåøÒåøÒåøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ÍâýÍâýÍâýÍâýÎãþÎãþÎãþÎãþÎãûÎãûÎãûÎãûÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓèÿÒæÿÐãýÏâûÓãýÕåÿ±¿Úªr€›Wd~\i‚~‹¤˜¢½jq‡Žªz˜„…›œ²‚„š…†›‚…–—𩲴Á¯³¿–Ÿ¬±½ËÆÔäÔâòÙèùÔãôÖèúÕæùÓæûÓæûÓæûÓæûÔèýÔèýÔèýÔèýÕéþÕéþÕéþÕéþÕéþÕéþÕéþÕéþÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëýÕëý×ëþ×ëþ×ëþ×ëþÖêýÖêýÖêýÖêýÕéûÕéûÕéûÕéûÔèúÔèúÔèúÔèúÓæùÓæùÓæùÓæùÒåøÒåøÒåøÒåøÐæøÐæøÐæøÐæøÏå÷Ïå÷Ïå÷Ïå÷ÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓèÿÉÞ÷ÚìÿÔæÿÈÙòy‰£M[vXfVc}[deo‰ipŒ‡Žªfj‡Œ¬xz—}}˜~{•qo†‘¥—–©‰ˆ˜——¤ž¡­ÆÌÚ½ÆÕ˜¢±¯¹ËÖáò×å÷Úèù׿úÖæýÔèýÔèýÔèýÔèýÔèýÔèýÔèýÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþ×íÿ×íÿ×íÿ×íÿ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÖêýÕéûÔèúÕéûÕéûÕéûÕéûÓæùÓæùÓæùÓæùÓæùÓæùÓæùÓæùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒæÿÒäþÅ×ñfwM]wLZtMZsOXq_f€jq~žrv“rs“ˆ‰©……¤ss‘vs}–ž²›š¬€€šš¥¤¨²·»Ç‹ž‘—¨ˆ‘¡­¶ÈÓÝïÚä÷ÛéúÖèúÔèýÔèýÔèýÔèýÔèýÔèýÔèýÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþ×íÿ×íÿ×íÿ×íÿ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÖêýÕéûÔèúÕéûÕéûÕéûÕéûÓæùÓæùÓæùÓæùÓæùÓæùÓæùÓæùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒæÿÏäý½ÏéXk…IZsL\vP^yN[tbi‚sx‘Ž“¬€‚Ÿ~€‚‚¢©¨Ë¡}}›qq~—œ²œž­‚…‘±´¿¤¨²„¨¬º{€Ž‰Ÿ˜ž¯³»Î×ßò×å÷ÖèúÔèýÔèýÔèýÔèýÔèýÔèýÔèýÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþ×íÿ×íÿ×íÿ×íÿ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÖêýÕéûÔèúÕéûÕéûÕéûÕéûÓæùÓæùÓæùÓæùÓæùÓæùÓæùÓæùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÎãþÎãþÎãþÎãþÏäÿÏäÿÏäÿÏäÿÏäýÏäýÏäýÏäýÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåýÐåýÐåþÐåþÍßù[m‡GWqLZtIWrFQmox“›Ÿ´¡¤¸‘•ªyzss¤¤Â½¹Ù²°Ì‰‹£lm„z{vx‰œž««¯¹ÌÏÚ“›Œš›ž©˜›¨„‘•£ª°ÀÔÚê×âó׿úÔèýÔèýÔèýÔèýÔèýÔèýÔèýÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖêÿÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþÖìþ×íÿ×íÿ×íÿ×íÿ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÖêýÕéûÔèúÕéûÕéûÕéûÕéûÓæùÓæùÓæùÓæùÓæùÓæùÓæùÓæùÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐæøÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÏåÿÏåÿÏæþÏæþÎãúÏåùÖêÿÒåýºÍæk~šJXvLWvLTqFNkQXtlqˆÆÈÚ£¥²áäï··Ä…„–£¢·ÎÍâÝÜïìëû¸¸Å£¢²yy†——£²²»ººÆˆˆ‘•–œž¤­­·•˜£‚…‘¡¥±¬±¿ÕÞíÖå÷×éûÔèúÓæùÔêþÔêþÔéÿÕéþÖêÿÙêýÙêýÙêýÙêýÙêýÙêýÙêýÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×íÿ×íý×íý×íý×íý×íý×íý×íý×íý×íý×íý×íý×íý×íý×íý×íýÙíýÙíýÙíýÙíý×ìû×ìû×ìû×ìû×íýÖìûÕëúÔêùÔêùÔêùÔêùÔêùÓéøÓéøÓéøÓéøÒè÷Òè÷Òè÷Òè÷ÐæöÐæöÐæöÐæöÐæöÐæöÐæöÐæöÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÏåÿÏåÿÏæþÐåýÕêÿÐäùÏãø¬ÀÕVi‚IXvN\yHPpLSpHOlei†¨“•¢²²»ÚÛáÒÒÛ‚‘”“£º¹ÉÌÌÙ°°»——£ŒŒ˜yy†··À££¬žžª‹›š¡¯­´ªª³»»Åª­¸œŸªšžª£©·ÌÚêÒãóÚëûÚíÿÕéûÔêþÔéÿÕéþÙêýÙêýÙêýÙêýÙêýÙêýÙêýÙêýÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìú×ïûÖíúÕìùÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÏæþÏæþÐåþÐåýÐäûÐäû½ÍãSc{FVpIWtS^}MUtLSpHOllp“•­ˆ‹š¡©Ž‘—‰•jly…‡–wy†“Ÿikxjlysv…ˆ‹šÉÍ×…ˆ“xz‡œ¦¥¯©¨±šš£­­·²¶À•˜£¦«¶‡Ž˜¦²ÀÈÖæ×è÷×éùÙêýÕéþÕéþÕéþÙêýÙêýÙêýÙêýÙêýÙêýÙêýÙêýÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìú×ïûÖíúÕìùÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÏæþÐåýÐåýÒåýÒåý£³ÌTd}IWqIWrQ]{P\zOWwLTqFMjcf„z–il~x{†y}…z~ˆ]_o~€¥¨´kmzikxehw^artwˆŽ~€‡‰˜sv…iit£¢«ÂÂÌ••ž‰—}€‹‘–¡†‹•—ž©ÌÕâÖâðÝëûÜëý×éûÕéûÕéþÙêýÙêýÙêýÙêýÙêýÙêýÙêýÙêýÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìú×ïûÖíúÕìùÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÓèÿÎãúÕéÿÈÜóqšIZrJXrIWrO[yJVtPXxT\{FNkV]zv}˜osX\pqv„fkw‚‡“fj{ˆŒ†‘sx„†‹˜y}Žhkei}X]kty‡‡‹œcewbbo†„°°»½½È±´½ÇËÓ·½Ä¡¦­·»Æ¶ºÅÀÇÒ×ãïÙæ÷ÙèùÖèúÙìÿÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÙìÿÙìÿÙìÿÙìÿ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìúÕìùÕìùÕìùÕìùÔëøÔëøÔëøÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåýÎäøÓæûÄ×ï^o‡HXqM[vDQlP\xNZxIUsLTsMUtHPm]e‚krŽSZsSWoW[pfj{qt†txŒjm]arZ^lmq‚^bv[^sdh}fj{dhyil€ehy~~‹˜–£¢¢­©©´¢¥­»¿Çª°·±·¾ÁÅËÌÏ×¶ºÅÁÈÓÚåóÚèøÛìýÖêýÖêýÖêýÖêýÖêý×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþ×ëþÙìÿÙìÿÙìÿÙìÿ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìúÕìùÕìùÕìùÕìùÔëøÔëøÔëøÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåýÕéþ²ÆÛTdzEUmM[tAOjWcMXwJSrS[zIQqJSr[c€^f„NWrLSoPTqINhW\sim‚X]tae}V\oX^qU[m]bwW\s]bykq„flV[pTWkqp€•“¡ªª¶˜˜¤ˆŒ”Œ—…‹²¶»·¸»ÌËÏÚÝå½Á̹ÂÏÔâòÛêûÕéûÖêýÕëýÕëýÕëýÖìþÖìþÖìþÖìþ×ëþ×ëþ×ëþ×ëþÙìÿÙìÿÙìÿÙìÿ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìúÕìùÕìùÕìùÕìùÔëøÔëøÔëøÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÐåþÒåý³ÄÚN^tIZpIWqHVqQ_zJXvLWvNZxEPoLWvQZyV^{W_}U\yOVsQUsTWt{€š\azSWqPUoPUlOTiV[pmr‡TXrOTmmr‡x}‘_d{X\qz}Œœœ¨›––¢z~ˆ†‰”{‰ww€Œ‹‘ÆÅÌÌÌÕ¥ª´°·ÁÅÐÞ×åöÛëúÙêúÖêýÖêýÕëýÖìþÖìþÖìþÖìþ×ëþ×ëþ×ëþ×ëþÙìÿÙìÿÙìÿÙìÿ×íý×íý×íý×íý×íý×íý×íý×íý×ïû×ïû×ïû×ïû×ïû×ïû×ïû×ïûÙíûÙíûÙíûÙíû×ìú×ìú×ìú×ìúÕìùÕìùÕìùÕìùÔëøÔëøÔëøÔëøÔëøÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÐèôÒæþÒæþÒæþÒæþÓèÿÓèÿÓèÿÓèÿÒäþÔæÿÕèÿÐãýÐãýÕèÿÕèÿ¨¸ÒZhN[tN[tO]xQ_zM[vLZtL\vJZwBQoP^{Q]{W_W]~W[{UXwQUs\_}hl†TXrLOmIMkDGdDH_EI^‚‡œlq‹TXr~‚š„›TWtaeqv„¦ª´‡‹•~€qp€‡†–Œœ‚€‰‡”¡Ÿ©ÅÅг·Á¡¥°¤©³ÅÌÕÙâìÜêúÞíÿÚëûÖëúÖìû×íý×ðþÙñÿ×íýÙíýÙíýÙíýÙíýÙíýÙíýÙíý×íý×ïû×ïû×ïûÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðúÙðúÙðúÙðú×ïù×ïù×ïù×ïùÖíúÖíúÖíúÖíúÕìùÕìùÕìùÕìùÕìùÔëøÔëøÔëøÓê÷Óê÷ÒéöÒéöÓê÷ÒéöÒéöÒéöÒéöÐèôÐèôÐèôÒæþÒæþÒæþÒæþÓèÿÓèÿÓèÿÓèÿÒäþÖéÿÒäþÓåÿÐãýÐãý}©O_yNZvNVsLWsQ]yLWsN\wN\wHXrIZsHWtSa~S^}[abe†hi‹WXxW[yVZwZ^xTWtPTrOSqNQoBGaINc{€•^c}[_y–›²€…œX\yQVpjo}ˆ—¢¤±­°¿wv†‰ˆ›‰†šš–ª‰‡•rp}——£¿¿Ë„‡¢¥­»ÁÆÉÐÚÝé÷ÙæøÜëýÝïÿÚïþÙïþÖïýÕíû×íýÙíýÙíýÙíýÙíýÙíýÙíýÙíý×ïû×ïû×ïû×ïûÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðúÙðúÙðúÙðú×ïù×ïù×ïù×ïùÖíúÖíúÖíúÖíúÕìùÕìùÕìùÕìùÕìùÕìùÕìùÔëøÓê÷Óê÷Óê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÐèôÒæþÒæþÒæþÒæþÓèÿÓèÿÓèÿÓèÿÔæÿÓãýÖæÿÕåÿÛëÿw‡¡M]wDQlLWsLTqS[xV^{O[wS^zLWsBPkLZtO]xUa}Zbls_copž^bUXv\azW\vGJiHLjMPmFJbIObX^qZ^vy~•Ÿ¥¸w{UZq[_tty‡ty…‡‰–ž…„”‰ˆ˜£¡±¬ªº»»Èvv‚‹ŸŸ«¦ª²©¬´¤¨°¹¾ÈÛæôÛéùÛëúÙêùÛðþÙðýÖïûÕíú×íýÙíýÙíýÙíýÙíýÙíýÙíýÙíý×ïû×ïû×ïû×ïûÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðúÙðúÙðúÙðú×ïù×ïù×ïù×ïùÖíúÖíúÖíúÖíúÕìùÕìùÕìùÕìùÕìùÕìùÕìùÕìùÔëøÓê÷Óê÷Óê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÐèôÒæþÒæþÒæþÒæþÓèÿÓèÿÓèÿÔèÿÖæÿÔäþÓãý×èÿ~ލHXrHXrIWrIUqMUrQZwNVsQZwPXvNVsJVrS_yO\vU^y^eVZw^bsv“†ˆ¥y}šUZs]byX]wPTqPTqMQkNSjPViLQdSWo~‚—ž¤·jp‚]bw[_trv‡UZhZ\kkm}€šš¦±¯½À¾Ì©©¶ffsxx…‰‰•Œš–š¢˜œ¤ž£­ÆÏÞÝëûÜêúÛëúÙíûÖíúÙðýÚñþÙíýÙíýÙíýÙíýÙíýÙíýÙíýÙíý×ïû×ïû×ïû×ïûÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðúÙðúÙðúÙðú×ïù×ïù×ïù×ïùÖíúÖíúÖíúÖíúÕìùÕìùÕìùÕìùÕìùÕìùÕìùÕìùÔëøÔëøÔëøÓê÷Óê÷Óê÷Óê÷Óê÷ÒéöÒéöÒéöÒéöÒæþÒæþÒæþÒæþÒæþÒæþÒæþÓæþÚêÿÏÝøÎÜ÷hvHVqHVqHVqGUpHTpOWtU]zLTqLTqOVsLSpS\wOXqV]wU\v]b{ptŽjoˆkmˆz}—kp‰X]wLPhNSjTWtOSpW\vLPhMQfPUjV[rae}U[mU[mkp…X]r^bv^bvehybdseerŸŸ«©¦³¢Ÿ¬‹‰škm}fixtw„Œ˜˜¢¤±Ÿ¥³ÎÚèÜêøÙéöÞñýÙíùÙðúÕìùÚïþÚïþÚïþÚïþÚïþÚïþÚïþÚïþÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñûÚñûÚñûÚñûÙðúÙðúÙðúÙðú×ïû×ïû×ïû×ïûÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÕìùÔëøÔëøÔëøÔëøÔëøÔëøÓê÷ÒéöÒéöÒéöÒæþÒæþÒæþÒæþÒæþÒæþÒæþÓæþÕåÿÎÜ÷drFToIWrESmFToMXtS^zU]zHPmLSpJQoU\y\c€sw”[_w\ax^czdi€chchdf_bzSWoNSjX]r\ax\azOTmPUlae}QVmHMdLPjINhMQfdj}y~“ejVZojm‚€–‹œŽ‡‡“¨¦°žž¨y{‹…‡˜€‚‘z}Œ}{Œœ‘‘ž¨ª·•›©ÀÉÙÙäòÙæôÚê÷ÜïúÙíùÛòýÚïýÚïþÚïþÚïþÚïþÚïþÚïþÚïþÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñûÚñûÚñûÚñûÙðúÙðúÙðúÙðú×ïû×ïû×ïû×ïûÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÕìùÔëøÔëøÔëøÔëøÔëøÓê÷ÒéöÒéöÒæþÒæþÒæþÒæþÒæþÒæþÒæþÓæþÕãþw‚žHTpMXtO[wLWsNZvT_{P\xLTqIQoLSpOSq\_~il‹„¡mpˆSVkdh}…ˆW[p[^sUZoNShV[r_h~^fzw“qx‘PWqPXockDJdGNjNUqFMiXawt}€ˆœV[rSUmtw‘¦”–¨ª››¤±°·‰‹xz‡‚”„†—‹ž}{Œ”“£œš¨´´Á‘–¤¦°½ËÖâÜëöÝíøÝðù×íöÚïúÚïýÚïþÚïþÚïþÚïþÚïþÚïþÚïþÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñûÚñûÚñûÚñûÙðúÙðúÙðúÙðú×ïû×ïû×ïû×ïûÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÔëøÔëøÔëøÔëøÔëøÔëøÓê÷ÒéöÒæÿÒæþÒæþÒæþÒæþÓæþÓæþÕåþ}‹¥DOkIUqMXtJVrMXtP\xS^zLWvHPpGNkELiNQodh…Œª¦©Ä›ž³[^r{“ilSVkQUjMQfGLaJSf_h{ltˆW_vT[t^eJSiGNhNUqLSoFMjFMiIPjrzV^tLPhOQlxz“˜š°„…š‡†–˜¸·¾•”‚‚„†—„†—xw‰ts„Ÿ››¨´´Á«­º—œ¨©°ºÍÙâÛêòÚêôßòûÜòúÚïýÚïþÚïþÚïþÚïþÚïþÚïþÚïýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÙðýÚñþÚñþÚñþÚñþÚñþÚñþÚñþÚñûÚñûÚñûÚñûÚñûÙðúÙðúÙðúÙðú×ïù×ïû×ïû×ïûÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÖíúÔëøÔëøÔëøÔëøÔëøÔëøÔëøÓê÷ÓèÿÐåþÓåÿÓåÿÒåýÓãûÔäúm{•LWsJSpJSpNVsT\yZbXa~NVvGOqFLoGMmIPlQXrbj~𢴴ºÍˆ¢fk€im‚\axNSjJOfQVmLPeV[p^cxchFIfMTqHOlFOjNUqZa}FIfQUrMPmTWtej„MQkMQkWZt}šxz“[\rbasfev˜–¤›‹˜ŽŒœŸœ°]\oa_r‹‰šŸŸ¬ÄÄл»Ç¤¤­¡¤¯¦­·Ë×ÞÝìôÝð÷ÝðùÜïúÜíýÜíýÜíýÜñÿÜñÿÛòÿÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÜóþÜóþÜóþÜóþÜóþÜóþÜóþÜóûÛòúÛòúÚñùÚñùÚñùÚñùÚñùÚñùÙðøÙðúÙðúÙðú×ïù×ïù×ïù×ïù×ïù×ïù×ïù×ïùÖíøÖíøÖíøÖíøÕì÷Õì÷Õì÷Õì÷ÔëöÔëöÔëöÓêôÐãýÖéÿÓæþÔäýÔäý×åÿp~—TazNVsLTsLTsNVvV^~V^~NVvEMlGMpNTwLSpFMi[cypxŒ¦¶«´Ä^cx_d{\axW\sTXpNSjNSj\avioZ^sdi‚FIfGNkIOpGOlSZvfk…^c}}›[_yPTqei†OTmNSlbdª]_x]^t{zzyŒœšªŽŒœ•Ÿ—“¤ž›¯]Zm[Zlkj}›¬³³¿º¹Â¾½Ä¬¬¶¨­´±»ÄÐÝäßñøÚêôÝíúÝíúÜïúÜïúÜñýÜñýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÕìôÕìôÕìôÕìôÔëóÔëóÔëóÓêò×éûÒãöÕåû׿ýÖäþ„ªIVpW_}PXxMUwMUwPXzU]NVxGOqDLmNTwIOpBIfJQmLTjmv‰¯·Épx‹W\schZ^vMQiSWoOTkPUjaez\btioae}AEbLSpLSpGOlJQkW\sswŒ£¥¾twX[vik†JMjQTopršMOh\]syx‹‰ˆ˜£¡±‹˜˜¨ˆšsp„ro‚a_r^]p‰Œ›¯¯º³²»·¶½ÀÀÉ£ª¯¶¿¿ÌÓÛêòÜì÷ÝíúÝíúÜïúÜïúÜñýÜñýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÕìôÕìôÕìôÕìôÔëóÔëóÔëóÓêòÕåô×è÷Öå÷×äùŒ˜°PZtS\wLTqQZyNVxNVxQZ{OWyHPrFNpIQqQWxW^{LSoMTmHOiS[qz‚–[cwX]wV[tHMf@E\INebf~PUjrx‹iodjzPUjHMfOVrHOlMUrFMiHMdX\qjm‚ei~š€‚›PSkik„wy‘lo‡TWl_av{zŽ¢Ÿ­Žœ¡œ«“ŽŸŒŸ¡rq„ZXkmp¡¡¬–•žº¹ÀËËÔ›ž¦ž¥¯¬·¿ËÖßÛêôÝíúÝíúÜïúÜïúÜñýÜñýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÛòýÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÜóûÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÕìôÕìôÕìôÕìôÔëóÔëóÔëóÓêò•¤¯¯¾È½ËÙz…–S\rV]wQXtV]zS[zT\{PXxLTsFNmIQqOWwT\{W^zQXtJQkELeELeNUoU]sGNhGLePTqNSlUZqMQipt‰[_tz€jq{}„ŽX^oHMdT[wOVsNVvSZwUWrHI_TUkrsˆ€•wxhi~st‰UXmMPeUXmst‰Œœ••¢­«¹•“Ÿ¤Ÿ¯ª¥·¨¤¸¢ž²¡Ÿ²qp‚mp››¦¡Ÿ©¬«²´´¾³·¿Ÿ¤¯«²»ª±»ÙäðáïýÜìùáóÿáóÿÜñýÜñýÛòýÛòýÜóþÜóþÜóþÜóþÜóþÜóþÜóþÜóþÝôýÝôýÝôýÝôýÝôýÝôýÝôýÝôýÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÖíöÖíöÖíöÖíöÕìôÕìôÕìôÔëóeqzit~NZeOXhPXlX]tX]w[^{QXvS[xS[xPXvNVsQZwT\yT\yMTmMTmBIcAHbMTmELeBIc@GcIMjOSpOTmjoˆrwŽhldj}MScPWaahrMScV[pT[tQXvOWtT[wVXqVWlijqs…actqs…ŒŽvx‰SVjTWlW[ohj{‘¡¦¦³œš¦›¨¶±À£ž°Ž‹žŒˆœ¢š˜«“¢›š˜¢Œ“¹¹ÂÅÅΦª´¯³¾¦«·¶¿ÌáïýÞïûáóÿáóÿÜñýÜñýÛòýÛòýÜóþÜóþÜóþÜóþÜóþÜóþÜóþÜóþÝôýÝôýÝôýÝôýÝôýÝôýÝôýÝôýÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÖíöÖíöÖíöÖíöÕìôÕìôÕìôÔë󀉔y‚bkxNTdV\oX\qW[p^aySZsU^yU^yQ[vS\wU^yS\wNWpFNdAI_BJa>E^GNhGNj7>Z;B_?Ba?B_BGaX]wINech}‰¢GM]DIWOUeafy_dyJSiMTmWawdl€[]ofevsr‚hfwfevml}š˜«ž¡²qtˆ_cxadx[]o€¦¦³›¨œš¦­©¸–‘£}yzw‹{z†…—•—¦œŽ–Œ‹‘©©²ÀÀɲ¶À¸»Æ´·Äœ¢°ÁÏÝÜìùáóÿÞñýÜñýÜñýÛòýÛòýÜóþÜóþÜóþÜóþÜóþÜóþÜóþÜóþÝôýÝôýÝôýÝôýÝôýÝôýÝôýÝôýÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÖíöÖíöÖíöÖíöÕìôÕìôÕìôÔë󅌖t{†pt€lqhlzehyTVh_avZ^sXatU]sPXoQXrT[tNUoELeAHbDH_AF_@GaELh=Da=Da@Gd>A_>A^JNkHMfAF]PUjOTiOUhX^qsyŒejOTiS[qFNdLViT\pX\pZ\m^arihzdcvjiy‹‰š£¢´rsˆy}~“xz‰wy†„„——£‰‡”~{‰‡…“‰‡—‰†…—‹‰š”–£ŒŒ—š˜¢¸·¾»»Å¾¾Ç¿¿Ë½½È¶¶Áª¯º›¦ÓãðáñþÜïúÞñýÜñýÜñýÛòýÜóþÜóþÜóþÜóþÜóþÜóþÜóþÜóþÝôýÝôýÝôýÝôýÝôýÝôýÝôýÝôýÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÖíöÖíöÖíöÖíöÖíöÖíöÖíöÖíöÕìôÕìôÕìôÔë󓕘£ˆŒ–‹Ž˜ÆÉÔ±±½šš¥››¨sv‚hjyps…VZmUZqPUoLOlFIhFIhGHhEFeAEc@Db@Dd>Dd>Eb>Eb?FbHOkFMiAHbAHbBIcNVlXatS[m]eydl€U]sLSlJQkLSlTWtHJhOQj]^tcdyxz‰±±¾‡†–mp}~“‘”£ž¡­–˜¥‚…‘Žvv‚Œss€‹‹—Žž€……‘““Ÿ©œ›¤­¬¶º¹Â¾½Æ¤£¬¹¸Á¾½Æ²¶À—ž©œ¨³ßïùáñûÛíùßòþÝòÿÚïúÞóÿÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÝöúÝöúÝöúÝöúÜôùÜôùÜôùÜôùÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÕïöÕïöÕïöÕïöÔíôÔíôÔíôÓì󖉋›œ¢¢£©³´ºÙÚßÈÉϬ­³½¾Ä··À¨ª·[]obc{bdMNmIMkJLkLMlIJjFGi@Dd@Dd>Dd>Eb?Fb>EaGNjDJfBIeAHd?FbFMfDLb@H\IQeckQZpIPjFMfOVrMPoLOmPSm]_x]^spr„……‘~}“~€‘vx‡‡‰–¢¥°£¥²prvx‡Ž……‘ss€ŽŽ›~~‹šªš—¤œ›¤¤£¬ÓÒÛ¤£¬­¬¶³²»°°¹±¶À‚Œ–ÒÝéßïùáñþáóÿßôÿÝòþÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÝöúÝöúÝöúÝöúÜôùÜôùÜôùÜôùÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÕïöÕïöÕïöÕïöÔíôÔíôÔíôÓìóÁÂÆ¤¥©Œ”•˜—˜œÞßãÎÏÓÅÆÉ¿ÀÄ´¶»··Â{zcd}hh†VWyLMoILiJMjHJhEFe@Db@Db>Eb>Eb?Fb>EaELhAHdAHdAHd>Ea@GcELh>E^ELe]e{JSiGOcNVjV^rPUoNSlOQjX\qQShbdvom€{z{}‘mpQTc[]j…ˆ“‹š†ˆ—ŒŽ††“ddqbboyy†ˆˆ•ŒŒ˜œ““Ÿ›¨›š£ž¦²±ºž¦¦¥¯¡Ÿ©š´¹Ä˜Ÿª¬¶ÀâíùáñûÞñýÛðûÝòþÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÝöúÝöúÝöúÝöúÜôùÜôùÜôùÜôùÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÕïöÕïöÕïöÕïöÔíôÔíôÔíôÓìóÉËÍ´¶¸¦¨ª‘“•‹ŒŽ·¸ºÜÝßÚÛݸ¹»²³·ÇÇЪ©¹zxdd€__NOoDFaDFaAD^?A^@Da@Db>Eb>Eb@Gc>EaDJf?Fb=D_@Gc>Ea@GcFMi@GcJQkXawPXoJSfXasPXlGLcQVm\_tQUjSTi\^pts„vt‡‚—ik}UWfikxx{†…‡”‡‰˜‘¡^^kzz‡‚‚‰‰–‡‡”‘‘ž””¡”‘ž£¢«¡Ÿ©±°¹†…Ž£¢«¢¡ªŸŸ©²¶À­²½‹‘œÚãíãòýáóýÞóÿáöÿÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞôýÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÝöúÝöúÝöúÝöúÜôùÜôùÜôùÜôùÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ï÷×ï÷×ï÷×ï÷ÕïöÕïöÕïöÕïöÔíôÔíôÔíôÓì󩫪¾À¿‘”“ˆ‹‰mpoz}{ËÍÌßâáÖÖÖÒÒÔÁÀÇÀ¾Ë²±Ä–”«de~OOkHLaGJ_HJcFHa@E^=@]:A]=D_>Ea?Fb>Ea;B^>Ea?Fb@GcAHdMTmSZsHPfFNdS[qOWmQZpLTjJOi_d{JNc_cw]_qjl{llyŒy{VXjWZirtlpz€‚•—¦¢¤³””¡ww„}}‰‹‹—††“””¡¡¡­““Ÿ›˜¥”“œ›š£ÆÅΣ¢«ž¦ª©²°¯¸ßß黻ǔ˜£ºÄÎÝìôáóýßöþÛòúÞôýÞôýÞôýÞôýßöþßöþßöþßöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞ÷ûÞ÷ûÞ÷ûÞ÷ûÝöúÝöúÝöúÝöúÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ñø×ñø×ñø×ñøÖð÷Öð÷Öð÷Õïö~±²´‰‹‚…deh‘”¯°²ÎÎθ¶·ÓÐÔÜÚÞÒÐ×°­ºª©¹wvˆWXmOSdNQeNQeLOd@E\>B\:A]>Ea?Fb>Ea;B^=D_@Gc?Fb>Ea=D]=E[FNdDLbMUkS[qQZpT[tU\vV[rejTWlX\pcewjlyyy…ŽŽ›y{\^plo~y{ˆ‹Ž˜”–£vx‡~€••¢‘‘ž‚‚““Ÿ••¢‰‰–––£˜˜¥Ÿª¡Ÿ©¦¥¯Ÿž¨±°¹£¢«©¨±ª©²±°¹´³½¬°º‹‘›ßëôÛíôÞôýß÷ÿÞôýÞôýÞôýÞôýßöþßöþßöþßöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞ÷ûÞ÷ûÞ÷ûÞ÷ûÝöúÝöúÝöúÝöúÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ñø×ñø×ñø×ñøÖð÷Öð÷Öð÷Õïö¡¢¥”•˜‚„‡{}€dei…†‰˜šššœ›˜šÅÀÁÛÙÜÓÐÔÍÌÐÆÅ̰°¹eisV[fTXfQUfOSfAF]>B\;B^?Fb>Ea;B^=D_=D_?Fb>Ea=D_;B\BJaEMa@H^MUkIQhJSiNUoV^tdi~{”W[odhysv…z}Œ¢¢¯qp€VXjxzŒrt„vx…€„Ž“•¢fixdfvŽŽ›ww„‡‡”££°¾¾Ë——¤››¨œš¦š˜¢¯­·ÁÀÉ¥¤­´³½­¬¶°¯¸¦£«ÍÉÔ½½Æž£­©¶½Þð÷ÞôúÝöúÞôýÞôýÞôýÞôýßöþßöþßöþßöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞöþÞ÷ûÞ÷ûÞ÷ûÞ÷ûÝöúÝöúÝöúÝöúÜóûÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ñø×ñø×ñø×ñøÖð÷Öð÷Öð÷Õïö°±´°±´¥¦ªŽ“{}€efjmor_^c¯¬°ÕÓÖ—•˜¦¤¨”Œ‹•–œ‰‰“^blV[fSWePTeBF[?D[?B_>Ea;B^=D_=D_>Ea:A];B^=D_>EaFNdAI_;DZJQkHOiBIc;B\AHbV[pafy]arhlzy{‹ž­jiywy‹bdvjl{}Œfiv~€oq~zz‡˜˜¤ŽŽšœ‡‡“~~‰““Ÿ««¸““žœ›¤¡Ÿ©˜—¡£¢«œ¥ª©²Ÿž¨¶´»¥¢ªÒÐ×ÀÁǯ´»¥°¶Úéðßñ÷ãöýÞôúÞôýÞôýÞôýßöþßöûßöûßöûÞöþÞöþÞöþÞöþÞöþÞ÷ûÞ÷ûÞ÷ûÞ÷ûÞ÷ûÞ÷ûÞ÷ûÝöúÝöúÝöúÝöúÜôùÜóûÜóûÜóûÛòúÛòúÛòúÛòúÚñùÚñùÚñùÚñùÙðøÙðøÙðøÙðø×ñø×ñø×ñø×ñøÖð÷Öð÷Öð÷Õïö¶´¹¨¦«Ÿž£š˜~}zy~‹‰Žtsxqpt«ª¯ÄÂÉŒ“VU^WV_ljwyy…lpzTWbSVaUWfGJ^GIb@Da>Eb?Fc>Gb=Fa;E];E];E_;E_;E_?Ha?Ha?Ha?Hc@Id>Gb>GbAHdMQiNSh_ctqv„‡‰–Žvt…sr‚zy‰kjzvt…~Žyy†••¢““Ÿ––¢±°¹©¨¯ž¦•”€‰”‘žŽ›¡ž«¢¡ª—–Ÿ‹‰£¢©ÐÏÖª©°¥¤«°¯³±°´ª«¯³¸º²¶»°¶½´»ÂÖáæßïöáóúÝöúÞ÷ûÞ÷ûßøýáùýâøýá÷ûá÷ýá÷ýá÷ýá÷ýâøþâøýâøýâøýáùýáùýßøûÞ÷úÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöúÝöúÝöúÜôùÜôùÜôùÜôùÛóøÛóøÛóøÛóøÚò÷Úò÷Úò÷Úò÷×ñö×ñö×ñö×ñöÖðôÖðôÖðôÕïórqv¥¤©›šžœ›Ÿ{z“‘–„‚‡wvz€†¥¤«º¹Â˜—¡a^k_]jb_mdbpss\_hNQ\\^kNQeGIbDGd>A_?Fc>Fc=Fa;E];E];E_;Da;Da>Gb>G_>Gb>Gb=Fa=Fa?GdELhUZsOTi]ar€…“‚…‘sv‚yxˆkjzom~dcs~މˆ˜~~‹}}‰šš¥““œ°¯¶¬«°¨¦­›š¡•”¬«´”‘ž”‘ž¥¤­–•ž”“𢡍´³¸ÅÄÈÓÒÖ½»À¬­°ª«­º»¿»¿Å¤¨°ÀÆÍž¤«äï÷âôûÞ÷ûÝöúÜôùâúþÞ÷úß÷øãùþá÷ýá÷ýá÷ýá÷ýâøýâøýâùúâùúáùýáùýßøûÞ÷úÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÜôøÜôøÜôøÜôøÛóøÛóøÛóøÛóøÚò÷Úò÷Úò÷Úò÷×òô×òô×òô×òôÖñóÖñóÖñóÕðò}{€wvzrqvvty€…°¯³¡Ÿ¤”‹‰‰ˆ‰ˆ‘š˜¢„ŽŒ‰–a^lZWe^^j[^iZ]h]_lPTeJNcGLe@Db?Fc>Fc=Fa;E_;E_;E_;Da;Da=Fa=F^=Fa=Fa=Fa=Fa?GdELh\azOTicfx€…“jly\^k{z‹_^oVUebaqqp€~Ž}}‰ss€˜–©¨¯«ª¯¯­´œ£¡Ÿ©ÆÅΨ¥²Ž›­¬¶‘šž¤¥¤«¡Ÿ¤ÂÁÆëêïÌËÏÆÆÈ±±³ÅÆÉ¾¿Å¯²º½ÀÈ“˜ŸÁÌÔßñøßöûÞôúßöûßöúãùþâúûÞ÷úá÷ýá÷ýá÷ýá÷ýâøýâøýâùúâùúáùýáùýßøûÞ÷úÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÜôøÜôøÜôøÜôøÛóøÛóøÛóøÛóøÚò÷Úò÷Úò÷Úò÷×òô×òô×òô×òôÖñóÖñóÖñóÕðò¿¾Â‰ˆ\[_edi„‚‡±°´¶´¹—–›”“š‹‰„‚Œ[Zc…‚¿½É“žcao]]iVZdkoy_boNQcNQfGLeGJh?Fb>Fc=Fa;E_;E_;E_;Da;E_=F^=F^=Fa=Fa@Id>Gb>FcAHdGLeX]rcfxdiw]_leht~Žbaq\[ksr‚xw‡{z‹‚‚yy†‰‰•••ž£¢©ª©­³²¹ž¤”“œª©²¡ž«¤¢¯·¶¿Œ‹”¤£ªª©°¦¥ª©¨¬ÇÆËÁÀ޽¿¿¿Áº¹¾ÆÇ͹¹Â¾ÁɾÁÉ”ÒáéÞñøä÷þäúÿâøýá÷ûßøùáùýá÷ýá÷ýá÷ýá÷ýâøýâøýâùúâùúáùýáùýßøûÞ÷úÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÜôøÜôøÜôøÜôøÛóøÛóøÛóøÛóøÚò÷Úò÷Úò÷Úò÷×òô×òô×òô×òôÖñóÖñóÖñóÕðò©¨¬´³¸edi~‚¡Ÿ¤—–›­¬±¬«°š˜Ÿ–•œž¦~}†WUb¬ª·ÍËÙhesbbmps~Z]ecfq_drMPdINeJOiAHd=Fa=Eb;Da;Da;Da;E_;E_;E];E];E_;E_>Gb;E_AIfJQmJOiW\qZ]olq_boz}‰€ml}ihxrq~}vt…tttt””Ÿ¦¬«²¬«°ª©°š˜Ÿ“‘›ž¦¥£°½ºÇ¦¥¯–•žŒ“š˜Ÿœ›Ÿ¦¥ª¿¾ÂÆÅÉÀ¾ÁÅÂÆ¿¾ÂÔÓÚ²²»»»Å¾ÁÉŸ¤¯…šÉÙáäöýÜïöá÷ûãùþãûýäýÿâøþâøþâøþâøþâøýâøýâùúâùúáùýáùýáùýáùýßøûßøûßøûßøûÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÛó÷Ûó÷Ûó÷Ûó÷ÚòöÚòöÚòöÚòö×òô×òô×òô×òôÖñóÖñóÖñóÕðò»º¿ÂÁÆ¡Ÿ¤Œ‹©¨¬£¢¦–•𔓗¨¦­œ›¢ž¦°¯¸‚€[Xe^\j¸¶Ä]]iX\f_ck\_jlq}fj{DH]GLcDJd>Gb=Eb;Da;Da;Da;E_;E_;E];E];E_;E_=Fa;E_?GdGNjPUoQVkSVhlqvx…y{ˆedtedtxw‡xw‡sr‚„‚“‰‰–qq~‰‰•¨¨±ÆÅ̽»À±°·½»ÂŸž¨Ž—“{y†€ˆ˜¤£ª“‘˜”¦¥ª»º¿ËÉÎÈÆÉËÈÌÂÀÅÀ¿Æ»ºÄ¿¿ÈÂÂ̰´¿}†œ¥ßï÷èùÿáôùá÷ûáùúáùýâøþâøþâøþâøþâøýâøýâùúâùúáùýáùýáùýáùýßøûßøûßøûßøûÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÛó÷Ûó÷Ûó÷Ûó÷ÚòöÚòöÚòöÚòö×òô×òô×òô×òôÖñóÖñóÖñóÕðòÐÏÔ¯­²¥¤©¦¥ª—–››šžœ¡‘•‘—ˆ‡Ž–•ž¸·ÀÆÄÐ^\ib_mqo}SS^Z]h[^fadohlx}FL^=AVFMf@Id=Eb=Eb;Da;Da;E_;E];E];E];E_;E_:D^:D^=EbAHdFJdNShMPb]bp„‘ž„‚“‡†–xw‡€yxˆ€šŒtt€ŽŽ—±°·º¹¾¦¥¬¹¸¿­¬¶–•ž¥£°š˜—¡š˜¢•”›š˜ŸŽ‘©¨¬»º¿ËÉÎâßãÔÎÓÄÁÆÌÈÐÏÎ×ÎÍÖ»»Å¦ª´£ª´y‚¬¸Áè÷ÿåùþßöúßøùßøûâøþâøþâøþâøþâøýâøýâùúâùúáùýáùýáùýáùýßøûßøûßøûßøûÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÛóôÛóôÛóôÛóôÚòóÚòóÚòóÚòó×òô×òô×òô×òôÖñóÖñóÖñóÕðòÈÇ̪©­–•𝭲©¨¬£¢¦³²·­¬±£¢¦{z‡†œ›¤¤¢¯ljwVTbVVcNP]Z]hilwbepcfqimyrv‡FL^BJaDJd?Fb>Eb=Da;Da;E_;E];E];E_;E_;E_9B]:D^;Da=D_@Ga?D[FI]ps…ŒŽœž«——¤‚‘‚‘xw‡~Ž€€‡‡”„„vv††¿¾Å²±¶ª©°–•œ‰ˆ‘¡Ÿ©¸·À©¨±»ºÄ­¬³¸·¾¡Ÿ¦—–›­¬±¾½ÁÄÂÇÍËÎÍËι·»½º¿°¯¶³²»ÁÁËÁÁ˾ÁÌ¢¦²‚‰”Ë×ÞåôûèûÿâøýßøûáùýáùþâøþâøýâøýâøýáùúáùúáùúáùýáùýáùýßøûßøûßøûßøûÞ÷úÞ÷úÞ÷úÞ÷úÝöùÝöùÝöùÝöùÛóôÛóôÛóôÛóôÚòóÚòóÚòóÚòó×òô×òô×òô×òôÖñóÖñóÖñóÕðòÇÇÉÏÏÒÀÀÂ¥¥¨““•¨¨ª··¹¯¯±›››œœœ‚…rsy˜˜¢hhtNM]NP_SUdacrllxffrllxrt}ŽfizAEZHJcJNkDGd>A_9@];B^@Ga?Fb?Fc>Eb>Eb=D_;B^;B^=D_;B\AF_DHb@B[LOcmpŽ˜›¨‹‹—zz‡Žrr~xx„tt€‹‚‚Œ¶·½¹ºÀ°±·¥¦¬•–œ«¬²³´º±²¸¯­´²±¶·¶ºº¹¾Ÿž£¡Ÿ¤½»ÀÇÆËÁÀŲ±¶´³¸º¹¾³²·ÐÏÖÆÅÌÄÂɾ½Æ´´ÀŽ‘œ•œ¥Ýêñè÷ÿåøÿá÷ýáûþáûþâúþãúûäûýãûýâýýâýýâúûâúûâúûâúûáùúáùúáùúáùúßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÛööÛööÛööÛööÚôôÚôôÚôôÚôôÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÞÞáÈÈ˽½¿³³¶••—““•ÀÀÂÇÇÉ«««¯¯¯º»¾‰‹Ž[^fTVcPSbX[lVXjbdsoo{±±½››¦~~‰hhtkjz^_tHI_HJeMOlFIf?B_9@\;B^>Eb>Eb>Eb>Eb>Ea=D_;B^;B^;B\@Ga>A^@E^QUjNQcUWd…••¡……‡‡“iitffrllx€€Œ‰‰•°°¹´¶»±²¸£¤ª…†Œ¯°¶¦¨­²³¹¹¸½²±¶¸·»ÁÀʏ½›šž¢¡¥»º¿ÉÈ͹¸½¬«°·¶º´³¸Ù×ÜÄÂÇÈÇÎÀ½Ç¥¤­²²»‡Œ–¥¯¹ßëôæ÷ÿäúÿáûþáûûâúûãúûäûýãûýâýýâýýâûùâûùâûùâûùáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÛööÛööÛööÛööÚôôÚôôÚôôÚôôÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðßßâÒÒÔššœŸ££¥““•­­°³³¶¯¯¯ŸŸŸ—˜›¯°³z~†jlyNP_QTewy‹hjyzz‡””¡ÈÈÔ\\hllyts„y{PQfEG_HJeGJhAEb=D_>Ea>Eb>Eb=Da=Da>Ea>Ea=D_;B^=D]9@Z@Da?D]PTi^bsdfswz…]]immy‰‰•{{‡jjvzz†††‘““ž¢¢«³´º¹ºÀ²³¹–—‘“˜³´º©ª°¸·»²±¶­¬±¯­²¾½Á¸·»±°´¥¤©¾½ÁÇÆËº¹¾”“—½»À·¶ºÀ¿ÄÎÍÔÇÆÏ°¯¸½½Æšž©x‰±½Æéøÿä÷þâúþáûûâúûâúûãûýãûýâýýâýýâûùâûùâûùâûùáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÛööÛööÛööÛööÚôôÚôôÚôôÚôôÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÌÌÎ××Ú³³¶ªª¬°°²¬¬¯ššœ””–¡¡¡¥¥¥£¤¦¤¥©˜œ¤‚…‘WZiTVhpr„\^m~Žffs““ŸZZe‰‰–¡¡­¤¦¶twˆEH]FHaLPjGJh?Fb;B^=Da=Da=Da=Da=D_>Ea>Ea=D_>E^:A[;?\@E^NQfcfx…‡”£¦±ŒŒ—€€Œww‚„„{{‡‹œŽŽš˜˜¢´¶»³´º³´º¤¥«‚ˆ¤¥«¡¢¨´³¸³²·±°´·¶ºÌËϽ»À¾½Á¹¸½¿¾Â»º¿ÆÅɘ—œÌËÏÂÁÆìëðáßæÄÂÌÇÆÏ¶¶¿°³¾y€‹‰“ë÷ÿãôûãùþáûûâúûâúûãûýãûýâýýâýýâûùâûùâûùâûùáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÛööÛööÛööÛööÚôôÚôôÚôôÚôôÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÄÄÆÌÌÎÏÏÒ¸¸ººº½³³¶ÂÂŬ¬¯˜˜˜“”–—˜œœŸ¨‡‰–LN]IL]qs‚lo~kjzNM]FFSOO\eeq~~‹y{ˆ…‡–_cw>@XOTmFIfAHd>Ea>Eb>Eb>Eb>Eb9@\:A]>Ea>Ea=D]=D];?\HMfHLa\_q„¬°º¯¯º““ž††‘‰‰•ŽŽšˆˆ”——£ˆˆ”¦¥¦¬¯°¶²³¹¸¹¿š›¡Ž”°±·´³¸¹¸½±°´º¹¾ÅÄÈÇÆË½»À¹¸½ÅÄÈÈÇÌÅÄȤ£¨¨¦«ÖÕÚãâæÝÜãÔÓÜËÉÓÀÀÉÍÐÛ–›¦—¢ÈÎÜë÷ÿãùþãûýâýýâýýâýýâýýãûýãûýãýúâûùáúøáúøáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÜ÷÷Ü÷÷Ü÷÷Ü÷÷ÛööÛööÛööÛööÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÀÀ··¹ËË;¾À¨¨ª¶¶¸ÈÈËÇÇɲ²²ªªª¬­°Ÿ¡¤˜œ¤›ªGIXIL]SUdehw„‚“XWhML\^^k]]ipp{Ž‘œ¯±À“–ªILdINhHLiAHdAHd?Fc>Eb>Eb>Eb:A]:A]=D_>Ea>E^@Ga>A^AF_AEZ]arrt{‰}}ˆˆˆ”……›——£¥¥±ŸŸ«¦¦°ª«±¸¹¿¶·½­¯´±²¸†‡ª«±»º¿ÌËÏÂÁÆ«ª¯¹¸½ÍÌÐÄÂǺ¹¾·¶º½»À¾½Á±°´¿¾ÂßÞãÄÂÇÝÜãíìöÂÁËÇÇÐÐÐÜÅÇÔ”Ÿª¯½ëôÿåùþâúûâýýâýýâýýâýýãûýãûýãýúâûùáúøáúøáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÜ÷÷Ü÷÷Ü÷÷Ü÷÷ÛööÛööÛööÛööÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÁÁĺº½ÅÅǾ¾À“¥¥¨»»¾ÁÁÄÅÅž¾¾³´·°±´¬°¸”–£LN]OQc\^macr…„”ji{TScbboZZejjs¯²ºº½É_ctVZo@E^>A^FMiBIeBIf?Fc>Eb>Eb:A];B^=D_=D_?F_>E^@Da@E^GJ_\_q{~‹z~ˆss††‘……‹‹‹–˜˜¤““ž›¤¤­ÍÎÔ»½Â³´º¤¥«Ÿ¡¦­¯´ž¤±°´¿¾ÂÏÎÓ­¬±±°´ž¢¯­²ÂÁÆ¿¾Â³²·¸·»«ª¯º¹¾¿¾ÂÍÌÐ÷öýÙ×áÄÂ̽½ÆÆÆÒ××äšœ©“¢ÉÐÛèùÿâúûâýýßþýßþýâýýãûýäûýãýúâûùáúøáúøáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÜ÷÷Ü÷÷Ü÷÷Ü÷÷ÛööÛööÛööÛööÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïðÇÇÉÄÄÆ½½¿½½¿¦¦©¹¹»±±³³³³ÁÁ¿ÇÇDz³¶°±´ªª³¡¡­NM_IL]UWiik}PObqp‚edt^^kaaljjs­­·©¬·}Ž{}‘SUmFHcHLiGJhDJfAJe>Gb>Ea:A];B^>Ea=D_?F_9@Z@DaFJd=?WLOc~‚Žwz…ooz‚‚Ž——£‚‚Žˆˆ”––¢……–—•–œ³´º¿ÀÆŒ“¡¢¨½½Æ¦¨­¨¦«ÅÄÈÎÍÒ´³¸¬«°·¶ºÀ¿Ä²±¶»º¿ÅÄÈÇÆË¶´¹À¿ÄÎÍÒÜÛßÔÓ××ÖÝãâé¿ÀƬ¬¶ÀÀÌ´´ÁŒœ¡¬áð÷åùûâúûâýýâýýâýýãûýãýúãýúâûùáúøáúøáúøáúøáúøáúøßøùßøùßøùßøùÞ÷øÞ÷øÞ÷øÞ÷øÜ÷÷Ü÷÷Ü÷÷Ü÷÷ÛööÛööÛööÛööÙñòÙñòÙñòÙñò×ðñ×ðñ×ðñÖïð‘‘‘ÀÀÀ«««ËË˾¾¾ÁÁÁ¹¹¹½½½ÄÄÁ¿¿¿ÎÎЭ¬³¯¬¹Ÿ­PMaNMbHF]qo†\[pzyŒ€\\i‚‚Žllv}~„‚‚Œ˜˜¤­¬½›²NLeNLhJMjJTlGTkANe=F^=D]:A[;?\=@]?D]?D]?B_?B_AF_?DXfmx~„‹swvvŽŽ—~~‡ww„žž«‡‡“–¥¤«‹‰“£¢«“‘˜œ›¤¯¬¹¡Ÿ©¢¡¥²²´ÏÏÒÀÀÂÆÆÈ±±³££¥±±³½½¿ÈÈËÇÇÉÂÂÅÄÄÆÇÇÉÍÍÏÌÌÎñðôöôùÈÇÌ­¬³¿¾ÅÅÄÍ‘œ–š¤¸ÂËæöýäöùëÿÿãýúãþûÞýùâþøäþùãýøâû÷âû÷áúöáúöáúöáúøßù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÝ÷ôÝ÷ôÝ÷ôÝ÷ôÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïxxxÌÌÌÒÒÒ¶¶¶ÌÌÌœœœ‡‡‡°°°¦¦¤¢¢¢¸¸º²±¸°­º¢Ÿ­OL_LH^VTkWUlMLahfy˜˜¥ddpœœ¥ss}iho…„‹¥¤­±¯½ÉÆÚ‰†XToTTpDMeN[rDPh>G_:A[:A[>A^>A^?D]?D]?B_?B_BFc=AXZ_my~ˆtx‚ppyˆˆ‘‰‰•““Ÿ‹‹—zz‡””ŸŽ—Ÿž¥–•žŒ••”Ž—¶³À»ºÄš˜²²´ÁÁĸ¸º¿¿ÁÇÇɬ¬¯¡¡£»»¾ÆÆÈ¾¾ÀÁÁÄÀÀÂÅÅÇÌÌÎÇÇÉããåÂÂÅÒÐÕ·¶ºÀ¿Æ¿¾Å«ª³ŽŽ—¢©²áëóåöùéúþåýûáúøâÿúÞý÷ãÿùãýøâû÷âû÷áúöáúöáúöáúößù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÝ÷ôÝ÷ôÝ÷ôÝ÷ôÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïllj––”ÏÏÍ¿¿½¸¸¶~~{……‚¿¿½¡¡žžžœ££¥±°´©¨±«©¶HFTOM]XWjXWjSQb\\ittww‚{{…fhmomt–•œ¯­·¾»È½ºË²¯Â[WmVWpBIcQ[vISmBIe=D_>A^?B_>A^?D]?D]?D]?D]?B_BG^MSasx„xz‡zz‡Œ––£{{‡šš£……Ž‚‚Žzx…˜–£œ¥—–Ÿ—–Ÿ–•žª©°ÇÆÍ°¯³³³¶««­±±³²²´««­¿¿ÁÆÆÈ³³¶ÁÁÄÇÇÉÁÁĹ¹»½½¿ÈÈËÈÈ˽½¿ÇÇɸ·»ÁÀʏ¿ÉÈϹ¸Á‹‹”Œ›ÆÐÙíúÿèùýåùùåÿýßûöáÿùãÿùãýøâû÷âû÷áúöáúöáúöáúößù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÝ÷ôÝ÷ôÝ÷ôÝ÷ôÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïaa^yywÙÙÖËËÈÈÈÆ……‚wwt¡¡žŸ¡œ´´²ŸŸ¢¦¥¬œ›¤VTaLIVNN[UUbPP\EEPaalMMVMNThiokjož¢½»Â£¢«ÄÁÏ»¹Éws‡QPeFJdMTpNUqHLiEHeAEb>A^=A[?D[?D[?D]?D]?B_DHbBHXqvsv‚qq~wv†——¤……Ž‹Œ‘˜””Ÿqo}Œ‰–¥¤­¨¦°›¨›š£–»º¿¸¸º¸¸º»»¾ÄÄÆ»»¾´´·²²´íí𸸺ÅÅÇÂÂÅÅÅǽ½¿´´···¹¹¹»¨¨ªÉÉÌÄÂǺ¹¾±°·¸·¾ÈÇОž¨‚‡‘“š£Üéíâòöæúúãúùãÿùâþøäþùãýøâû÷âû÷áúöáúöáúöáúößù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÝ÷ôÝ÷ôÝ÷ôÝ÷ôÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïVWSopk½¾¹½¾¹Œvwr€}”•‚„²³¯³³±„„„¡¡£Œ‹–•œkjqddmTT]TT]OOXZ[aTU[NOSdeiomrˆ‡Œ¥¤©£¢©ÂÁ˦¤±qo}edtSVk?D]OTmOTmHLiBFc;?\>B\?DX?DX>BZ>B\AEb>B\?EWzsv‚oo{ml}š––Ÿ‚„‰¦““ž›rp}Ž—±°¹°­ºž¦Œ‹‘Ž“±±³ÁÁÄÄÄÆºº½ÆÆÈÆÆÈÉÉÌÌÌθ¸ºÌÌÎÇÇÉÅÅÇÀÀÂÀÀºº½²²´ºº½èèêÜÛß¿¾Â½»Â¸·¾ÍÌÕÈÈÒ‡‹•y€‰©³¹íúÿä÷÷åýûäþùáý÷åÿúäþùãýøãýøâû÷âû÷âû÷âû÷ßù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÜöóÜöóÜöóÜöóÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïTUPbc^}~y«¬¨¢£žbc^‡ˆ„stpklh‹Œ‡‹‹ˆ€€~€€€‡‡‰°°²°¯³ijm]^bXZ]deiZ[^\]aTUXefjooqwwy¹¹»œ›Ÿ¹¸¿Œ‹”°¯¸††“cewLOdPTiPSkOQlIMj?B_>B\?DX@EZ?D[?D]?B_?D]BH[jo}€‚{{ˆddqxx…œœ¨††‘‘›˜˜¤£¡­“xw€Ž—°¯¸±°¹˜—ž†…Œ«ª¯»»¾ÄÄÆÉÉ̾¾ÀÌÌÎÈÈËââäÍÍϸ¸ºËËÍÉÉÌÇÇÉÂÂÅÁÁÄÂÂÅ»»¾ÀÀÂÄÂÇÈÇÌÇÆÍ¨¦­ÒÐÚÅÅΟ£­{€‹†”Ôáååøøåùùãýøãÿùåÿúäþùãýøãýøâû÷âû÷âû÷âû÷ßù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÜöóÜöóÜöóÜöóÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïUVOef_lmf©ª£‰‹„WXQ„…~mohde^stpjkfddbaa^eeeŸŸŸŽŽŽijljkm^_b]^aefi„…‡LMOijlrrtkkkžžž‹‹——šjimfel…„}}ˆfivUWiPQfPSkOTmDGd;B\@EZAGZ@E\?D]?B_@E^BH[SWey}‡yy‚mmwww‚……‘Ž……‘šš¥Œ•Ÿž¥Ÿž¨‚‹”“œ³²»š—¤Œ‹”¤£¨»»¾ÅÅÇÕÕ×ÏÏÒÆÆÈÔÔÖÈÈËßßâ»»¾ÍÍÏÇÇÉÈÈËÌÌÎËËÍÆÆÈÂÂÅÎÎÐÇÆË¬«°¶´»«ª±º¹ÂÎÎ×¾ÁÌ{€‹‚‰Ÿ¬±ãóôæúúæþúåÿúåÿúäþùãýøãýøâû÷âû÷âû÷âû÷ßù÷ßù÷ßù÷ßù÷ÞøöÞøöÞøöÞøöÜöóÜöóÜöóÜöóÜöóÜöóÜöóÛôòÚóñÚóñÚóñÚóñÙòðÙòðÙòð×ñïUVQ[\Wfhclmffha^_Xef_cd][\U^_[^_[Z[ViifccaŽŽŒttrceddfe]_^TVUehf{}bcekmlsssiiilll‘‘‘}}}vvxxxz{z‰ˆ€‡ddpVXhTUjTVoINh@E^AGZAGZ@EZ?D[?B_@E^>BWBFWkmz€€‰llvxx„‡‡”jiytt‚‚މˆ–•œŸž¨¨¦°zy‚ˆ†“ŽŒš…‚”“—¤¤¦··¹ÄÄÆÎÎÐÎÎÐÐÐÓ××ÚÔÔÖÛÛÝÏÏÒÎÎÐÏÏÒÌÌÎËËÍÍÍÏÅÅÇÈÈËÂÁƾ½Ä´³º·¶½²±ºÒÐÚÒÒÝŒš„‰~ˆŽÞïðêýýêÿþãýøåÿúäþùãýøãýøâû÷âû÷âû÷âû÷ßù÷áø÷áø÷áø÷ß÷öß÷öß÷öß÷öÝôóÝôóÝôóÝôóÝôóÝôóÝôóÜóòÛòñÛòñÛòñÛòñÚñðÚñðÚñðÙðïOOM[[Xiif…†klhefbcd]cd]NOJTTQUUSQQOppmppmXXVddbjjhbb_[[XWWUffdjjjjjjffdhheddbaa^^^\iifxxxqqqttrmmmomr__iPO_LMbGIbAD\AEVLOaNQf?AZAD\?AZ?BWBFZacr††‘}}ˆkkx‰‰–ˆˆ•ddq‹ŽŽ—‡‡˜˜˜¢ªª¶‹‹—˜˜¥˜Œžž¡°°²ÀÀÂËËÍÀÀÂÏÏÒÔÔÖÈÈËÛÛÝÅÅÇÒÒÔÆÆÈÇÇÉÆÆÈÍÍÏÆÆÆËËÍÉÈϾ½Ä­¬±¥¤©³²»ÆÄÐÒÐÚ·¶¿‡‹“‘šê÷ùéûùéþúäý÷æÿùåþøäý÷äý÷ãûöãûöãûöãú÷áøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óáöòáöòáöòáöòßôñßôñßôñÞóðÞóðÝòïÝòïÝòïÝòïÜñíÜñíÜñíSSSNNNkkissqqrm]^Zbc\ijeQQOLLIZZWMMJbb_ŽŽŒ^^\ZZWiifbb_\\Z[[Xbb_hheaa^ddbeecVVTddbaa^__]eeceecmmksrojieiii…„ˆ__kTScTVhQUfLP\UZeUXjEH\AEZ?AZ?BWBDXIHXlly††“}}‰‚‚Ž©©´¤¤°„„__kppyˆ””Ÿ••¢””¡¡¡­ªª³”žž¡´´···¹ËËÍÉÉÌÅÅÇÎÎÐÇÇÉÛÛÝÍÍÏÓÓÕÄÄÆÉÉÌÓÓÕÝÝßÚÚÚÆÆÈÆÅÌÄÂÉËÉΜ¡¯­·¿½ÉËÇÒÖÕÞœ£•šßíìëþûéþùæÿùæÿùåþøäý÷äý÷ãûöãûöãûöãûöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óáöòáöòáöòáöòßôñßôñßôñÞóðÞóðÝòïÝòïÝòïÝòïÜñíÜñíÜñíJJJMMM]][hhefhcbc^_aZfhcTTQOOM__]TTQUUS‚‚€~~{SSPbc^]^Z[\W\]Xbc^efb^_[efbiifPPN]][eechhemmkjjhddbppmbb____Ž{}‚^^hZZeX\dU[_\biZ^jFI[@DW@DXBF[HI^TSeiivzz‡ww‚–£¤ª²³¹ÅÆÌ‰‰•bboZZfŽ““žŽŽ—““œ¶¶¿¶´¹œœž¸¸º¸¸ºÂÂÅÒÒÔÂÂÅÐÐÓÔÔÖÔÔÖÓÓÕÐÐÓÇÇÉÆÆÈÈÈË¥¥¨···»»¾ÄÂÇÉÈÍ¿¾ÂÇÆË›š£²±ºÍÉÔ¾½ÆÀÁÇŽ”˜Üêéåøöéþùäý÷æÿùåþøäý÷äý÷ãûöãûöãûöãûöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óáöòáöòáöòáöòßôñßôñßôñÞóðÞóðÞóðÝòïÝòïÝòïÝòïÜñíÜñíAAALLLUUSccabc^Z[V^_Xab]WWUXXVUUSNNLXXVeec““LLI[\WWXTWXTZ[V_a\\]X\]X_a\^^\ZZW]][eeceecmmkjjhZZWffd[]\^a_vxwˆ‰Œklo]^bZ[]X]\]bcX\dDFS@BTDEZLMbTVhLJ[aam~~‰€€‰…†Œ¡¢¥¶·¹ÆÇËÆÆÒ……‘XWhbbo‹‹”„…‹——¡¤¥«ž¢¥¥¨¨¨ªÀÀ¶¶¸»»¾ËËÍÌÌÎÀÀÂÌÌÎÆÆÈÆÆÈÎÎÐÉÉÌŽŽyy{‹‹‹¨¨ªÂÂÅÀ¿Ä¿¾ÂÕÔÛ«ª±“‘›¹¶ÀÏÎ×Ö×Ý•›ŸÍÛÚèúøêÿúèÿúæÿùåþøäý÷äý÷ãûöãûöãûöãûöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óáöòáöòáöòáöòßôñßôñßôñÞóðÞóðÞóðÝòïÝòïÝòïÝòïÜñíÜñíHHHNNNVVTffd]^ZNOJQSL_a\WWU\\ZPPNPPN^^\cca}}zVVTXZU_aZWXQ_aZab[\]VZ[T_a\bb_]][ZZW^^\eeceecddbUUSX[ZX[Z^a_ceddddiiihheTVSTVQ[]Z^_cQQ[IIVEDTML\^]m]]jaaliir‚ˆ}~‰‹¯±°¾¿ÁÉÉÓÎÎÛ‡†–QQ^qqz˜šŸ˜˜¢–~}ÅÅǬ¬¯¿¿ÁËËÍÀÀž¾ÀÍÍÏÆÆÈ¸¸º½½¿ÎÎÐÍÍÏÓÓÕÎÎÐÌÌί¯±¾¾ÀÉÈ͸·¾½»ÂÐÏÖ“‘˜¹¶ÀÍÌÕÜÝãÍÓ×Õãâéûùæû÷ãûöæÿùåþøäý÷äý÷ãûöãûöãûöãûöäùöäùöäùöäùöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óßôñßôñßôñÞóðßôñßôñÞóðÞóðÝòïÝòïÝòïÝòïOOOGGGQQO]][VWSMNIUVOab]]][__]__][[XVVTaa^aa^]][TUPhibUVObc\bc\]^WWXQ^_[[[X]][VVT]][eecddbddbVXWSWXX]^[\^bdcbbbccalljWXTZ[Vbd_abdTU[JJTFFQJJVWWcaajijp\]c€„z{~}~¥¨¦±²´ÁÁËÐÐÝÍÍÚss€^^j››¤››¤¢¢«š˜¿¿Á³³¶ÅÅdz³¶ÈÈËÂÂÅËËÍÓÓÕÒÒÔªª¬ŸŸ¢¹¹»ËËÍÓÓÕÔÔÖããåééë··¹ÄÂÇËÉв±ºÂÁȯ­´¯«¶ÁÀÉÎÏÕÙÞãÛéèèúøæû÷äý÷æÿùåþøäý÷äý÷ãûöãûöãûöãûöäùöäùöäùöäùöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óßôñßôñßôñÞóðßôñßôñÞóðÞóðÝòïÝòïÝòïÝòïZZZPPPQQOOOMPQMNOJWXQ^_[[[X^^\__]\\ZVVTcca^^\ZZW_a\de^XZSde^ab[_aZbc\TUPZZW]][\\Z__]cca__]aa^VXWUZ[PUWNSUcdfiik]]]cab[ZWVWSccaddd\[_WV]TSZSQVTSW]^bvwycdfqrttwvwyx›œ˜šœ©ª°ÉÉÓ××á¾¾É[[hxx…ˆˆ•””‰ˆ½½¿ÝÝߢ¢¤°°²¾¾ÀÌÌÎÂÂÅËËÍÒÒÔ¦¦©––˜½½¿ÆÆÈÕÕ×ÚÚÜææéææéÛÛÛ¿¿ÁÍÌÕ¿¾ÇÍÌÓÈÇΣŸª·¶¿ÀÁÇÝãèáïíèúøèýøåþøæÿùåþøäý÷äý÷ãûöãûöãûöãûöäùöäùöäùöäùöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óßôñßôñßôñÞóðßôñßôñÞóðÞóðÝòïÝòïÝòïÝòïXXXaa^XXVTTQOPLOPLWXQZ[V[\Weec__]bb_[[X__]XXVUVQbc\de^STMXZSde^cd]]^WUVOWXTSSP]][XXV]][XXV[[XTVSNSTGLMEIJ_acaac]]]b_a_^\VVTcca^^^VVXTTVWWZZZ\WWWZ\[fih_ba_bafihqsrŽ‚…‹Œ‘ÅÆÌÖ×ÝÒÓÙ¥¥±vveeq‡‡“‡†Ž“âá囚ž´´·ÅÅÇÍÍÏÈÈËÈÈËÒÒÔÍÍÏææéÒÒÔÍÍÏÌÌÎßßâååèññóäääÇÇÉÆÅÌÐÏÖÈÇÎÄÂǽ¹Á­¬³ÅÆÉÎÔÖßëëé÷ôêûøêýùéþùåþøäý÷äý÷ãûöãûöãûöåúöäùöäùöäùöäùöãøôãøôãøôãøôâ÷óâ÷óâ÷óâ÷óßôñßóóßóóÞòòßôñßôñÞóðÞóðÝòïÝññÝññÝññUUS\]X_a\UVQQSNIJFOPL\]XZ[V]^Z^_[]^Z]^ZWXTZ[VXZUab[de^[\UMNG^_XWXQZ[TZ[TVWSWXT_a\XZUab]QSNXZU\\ZNPMVXWGIHXXXeee^^\aa^ccaUUSeecddbZZZSSS___[[[OOO[[[hhhXXVddbjjhyyw‡‡‡€€‚Œ‹¿¾ÅÒÒÔÈÈ˶´¹£¢¦~}„^]fvs€ˆ†“Ÿž¨“‘˜ž¢ÞÞáÒÒÔÌÌÌÇÇÉÅÅÇßßâÉÉÌÖÖÙÐÐÓÒÒÔÙÙÛÞÞÞêêêêêêÕÕÕÅÅÇÈÈË××ÚÀÀÂÀÀ··¹½¾ÀÉÎÏËÒÒÙßÝìöòìøôêýùéþùèýöåúóéþ÷åúóäùòäùôãööä÷÷ä÷ôåøöãöòåøôåøôâôñâôñâôñâôòáóñáóóáòöáòöáòöáóñáóðáóñáóñßòòßñôßñôßñôOPLUVQ]^ZZ[VHIEEFAMNIXZUTUP]^Z^_[WXT^_[XZUTUP]^Z\]V]^WXZSEF?WXQUVOZ[TZ[TXZU]^Z[\WZ[V^_[STOQSN]^ZSSP\\ZPPNVVTZZWQQOWWU\\ZPPNXXViif^^\LLIUUSWWUSSP^^^cca_a\cd_rsowxsttrqqs{z—–›¤¤¦‚‚‚ŸŸŸ¹¹»˜—œ€‰dbp}zˆ‡…‘Œ•–•œ©¨¬ÂÂÅÀÀÀÇÇÉÐÐÓÖÖÙºº½ÏÏÒÛÛÝÈÈËÉÉÌÝÝÝ×××ßßßÖÖÖÄÄÄÍÍÍÌÌÌÅÅÅÁÁÁÇÇǰ²±ÅÇÆÅÉÈÂÇÆìñðïøôìþúêÿúéþ÷éþ÷åúöèýøåúóâ÷òæù÷åøøãöóâôòæùöãöòâöïåøôâôñâôòáóñßòòáóóáòöáòøáòöáóñáóñáóñáóóßòòßñôßñ÷ßñ÷IJFQSN^_[^_[JLGBD?GHDTUPSTO\]X]^ZVWS^_[XZUTUP]^ZZ[T[\U]^WGHAVWPVWP[\UXZSXZS^_XZ[TXZS\]VNOHOPI^_[]^ZZ[VQSNSTO^_[QSNSTOXZUQSNWXTjkfXZUMNIQSNZ[V[[X__]eec_a\de^fhadeappmlllihl~}rrp€€~¥¥¥‰ˆ£¢©ecpb_lljw´³½´³ºœ¡±±³––˜´´·ÕÕ×ÛÛÝÜÜÞÍÍÏÖÖÙÈÈËÐÐÓÓÓÓÐÐÐÜÜÜÓÓÓÍÍÍÔÔÔÆÆÆÈÈÈÆÆÆ¾¾¾‹Œ¹»ºÎÓÒÁÆÅ×ÜÛôþúìþøèûôåøôåøôéûùåøöä÷ôæù÷âôòãöóåøôæùöãöòåøôåøôâôñä÷ôãöóâôôâôôáóóáòöáòöáòöáóñáóñáóóáóóßòòßñôßñôßñôHIETUPbc^^_[MNI>?:EFA[\WXZU\]X]^Z\]X]^ZWXTZ[VXZU^_X^_Xbc\STM[\U[\U]^WVWPZ[T]^WZ[TUVO[\UHIBQSL_aZUVQWXTWXTQSN\]XOPLSTO]^ZPQM\]XijeXZUVWSUVQbc^^_[ccaab]fhacd]bc\de^efb___aacqqsmmmhheqqo{{~ÂÁÆ{z„\[d[Zcdcjjimˆ‡Œ¨¨ª••—««­ËËÍÇÇÉßßâÔÔÖÕÕ×ÕÕ×ÓÓÕÙÙÙÙÙÙßßßáááÔÔÔÍÍÍÕÕÕÌÌ̹¹¹ÉÉÌœŸ²³¶³¸¹ÐÕÖÌÐÒéððíûùëûúìýûéùúéùýéøÿè÷ÿåôûå÷úä÷÷ä÷÷ãöóä÷ôâôòâôñä÷ôä÷ôãööãööâôôáóóáóóáóóáóóáóóáóóáóóáóóßòòßòòßòòßñôIJFIJFZ[V\]XLMH9:6BD?]^ZVWSUVQXZU\]X[\WZ[V^_[WXTab[\]V]^WXZSNOHTUNXZSXZSZ[Q]^UbcZ\]T\]TTULWXOZ[TSTMXZS]^WLMFZ[T[\U_aZbc\OPI]^Wde^bc\^_XWXQab[]^Z[\W^_[hibde\abX_aZ]^Zbb_VVXjjljjh_a\jkfccahhj¦¥ªÌËÏŽ”•”›zy~~‚ªª¬¥¥¨bbd­­°¾¾À¤¤¦¾¾ÀÀÀÂÍÍÏÓÓÕÒÒÔÜÜÜåååßßßâââÜÜÜÔÔÔÈÈÈÁÁÁÆÆÈÅÄÈž¢°±´­²´ÂÇÉÛßââèêêôøéöúÕâé·ÂÌ—£±—¢´š£¹¡«¾·ÅÓ°À˺ÌÓÍÞäâó÷áóóÝðíä÷ôÝððáóóáóóßòòáóóáóóáóóáóóáóóáóóáóóáóóáóóáóóáóóáóóLMHLMH\]X^_[QSN?@;EFA[\WOPLQSNZ[VVWSZ[VZ[VZ[VUVQ\]V[\U]^W\]VJLEPQJUVOUVOWXO\]TabXZ[QQSITULXZP[\SOPIWXQbc\UVOTUNWXQ[\U[\UNOHde^ab[[\U\]VUVO]^WXZS\]Xcd]Z[Q]^Ucd[]^UZ[T__]ZZZfffbb_Z[V_a\bb____‹‹žž¡¶´¹²±¶‰ˆ~~€œœž¸¸ºkkm‚‚…‘œœž¨¨ª´´·²²´½½¿ÍÍÏÐÐÐÚÚÚßßßéééæææÛÛÛÌÌ̸¸ºÎÍÒ¿¾Â¡¢¥©ª­«°²´¹»ÎÓÕáæëÏÖÝÇÎ×­´¿Ÿ¥¶¬±Æ¢»„‡¤„‹¦„¥€Ÿ‹›¨—¨²¨¹ÀÆ×ÝÜíñÞðóäöùâó÷ßñôÞññáóóáóóáóñáóñáòöáòöáòöáóóáóóáóóáóñáóñVWSQSN[\WZ[V[\WGHDHIEXZUNOJSTOZ[VXZUZ[VVWSXZUOPLWXQXZSWXQXZSGHAMNGPQJQSLSTJ[\S_aWUVMMNEQSIUVMZ[Q\]VQSLXZSXZSVWPZ[TXZSUVOOPIde^^_XWXQ\]VTUN[\UUVOZ[VZ[T]^U_bU^aTbcZUVOaa^\\\bbb\\ZXZUbc^iif^^^iiikkk´´·¡¡£‡‡‰œœž¥¥¨jjl‡‡‰ÄÄÆ””–††ˆ••—¹¹»¹¹»„‘‘‘ÒÒÒðððÔÔÔÙÙÙåååÙÙÙÆÆÈÂÁÆÎÍÔš›¡¬­³°³¹¥©¯»¿ÅÞâèëñóÖÜáÇÌÖ¸½Ëßãø±³ÎŽ­„‹¨~‹¢z‰›}ŒŽŸŽž­¡­¢²¿¾ÎÙÙêñãôúáòöÝððáóóáóñáóñáóñáòöáòøáòöáóóáóóáóñáóñáóðWXTTUP]^Z\]Xab]MNIJLGWXTIJFPQMNOJ[\W[\WPQMZ[VIJFUVOVWPOPIPQMDE@IJFNOJNOJPQJZ[Q^_VSTJOPGOPGNOFXZP[\UNOHUVOVWPIJDSTMWXQUVOPQJ\]V_aZZ[T^_XUVO[\UTUP\]XZ[V_aWcd[WXO\]Tab]^^\]][aa^\]X^_[dealmieecbbbTTQddb———¢¢¢}}}«««›››SSUyy{»»¾……‡ppr€€‚¾¾À˜˜›†††ppp¶¶¶äääíííæææâââÝÝÝÏÏÏÄÂÇÄÂÇÁÂÆŽ“±²¶—˜œ¨©¬ÒÖÙèìïÓ×Ú»¿Ç½Á͸»Ïœž·€‚Ÿ…¢}†ž{ˆ{ˆy†›x…š}‰žˆ•ª•£´¡¯½ËÜãáòøáòöáóóáóñáóðáóðáóóáòöáòöáóóáóóáóñáóñáóñSTOVWSWXTUVQUVQVWSPQMXZUGHDJLGOPLab]LMH[\WPQMIJFQSNMNISTOTTQIIGNNLLLLMMJSTOSTMUVOUVOQSLWXQSTMVWPVWPPQJOPISTMGHAQSLPQJSTMUVMUVM\]V^_XXZUUVQUVQMMJTTQZ[V]^W_aZab[[\UXZU^^\[[X\\Zdeade^ab[lmiffd__]UVQZ[Tjkf}~yool‚‚€iifXXXlll¡¡¡ŒŒŒ•••žžž~~~hhhddb““¸¸¶ÎÎÌååãÕÕÓÖÖÔ¯¯¬ÇÇǺº½ÐÐÓ±±³©©«ŸŸ¢Ÿ¥¦©ÍÎÒæèí¯¯¸©«¸›¯Ž¥†‡Ÿ„†¡ˆ¤”˜­Ÿ¤»¤©À“—¯‰Ž¨„t{•…¢¤²ÂÕåðáòøÞòòßôðßôíãøñâôñãóòãóòãóôâòóâòöâòöâòöJLGPQMVWSVWS[\WXZUNOJSTOGHDIJFUVQ_a\LMHWXTNOJEFAQSNLMHNNLUUSLLLLLLGGIJJJOPLPQJTUNTUNSTMMNGZ[T[\UVWPPQJOPISTMNOHLMFSTMOPIUVMUVMXZS]^WVWSTUPOOMHHFPPNXXV]^Zab[cd]^_[XXV]][^^\__]^_[^_XUVO^_[XXVTUPQSLVWNcd]mohbc^xytffd\\Z___qqq‡‡‡†††vvvmmm\\\^^\qrm¦¨£‰‹†×ÙÔ«¬¨ÄÅÀ‹ÌÌÌ···ÎÎÎÐÐÐÛÛÛ½½½ºººªª¬ÝÜãÒÐÚ¾¾É¬«»”–¨‡ˆˆ‰¢‰‹£…‡Ÿ†ˆ¡“«›¶¢¤½–˜±Ž©„ˆŸy‚˜‡•¦£±¿ÕæíÞðóÛðìáöïßôíâôñãóòãóòãóôâòóâòöâñøâñøFGBNOJTUPVWSVWSTUPJLGOPLPQMLMHZ[VTUPJLGVWSVWSNOJOPLMNIMMJSSPPPPGGG@@BGGGIJFQSLMNGUVONOHWXQ]^W^_XVWPPQJOPISTMUVOHIBOPINOHUVMUVMVWN[\UQSLUVQQSNPQMOOMVVTWXTZ[Tef_deaZZW^^\[[Xaa^XZU^_X[\U]^ZPPNJLGUVO\]Tab[bc\TUPefb[[XQQO\\Z__]eeeqqqxxxiiiqqsVVV\\Zffdlljyyw¶¶³{{y——•rrp´´´³³³ÆÆÆÁÁÁÈÈȬ¬¬½½½»»¾âáèÇÅÒÍÌÜ–•¨‘“©€˜{{—„„¢€‚Ÿwy–~€›‘ª£¦»²¶ÉŸ£´–©€ˆœ{†˜‚¡¬»ÆÚëñæùùãøôáöñâôòãóòãóôãóôâòóâòöâòöâòö@@>FFDJJHJJHVVTPPNBB@DE@QSNJLG[\WTUPJLGTUPUVQIJFIJFPQMNNLOOMSSSEEE::=EEEHIEHIEQSNQSNNOJQSNTUPZ[VVWSPQMOPLSTOXZUIJFJLGNOHJLBTULXZP]^WNOHSTOMNIJLGPPNPPNOPLPQJ]^Wbc^XXVVVT\\ZccaPQMVWPWXQWXTJJHGHDVWP]^U^_XXZSPQMcd_bb_]][TTQ\\Z___hhh[[[TTV^^aLLNNNNbb_ddbiif‚‚€eecmmk]][ŸŸŸ³³³ººº¾¾¾………{{{žžžÂÂÅÙ×ÜÆÅÎÆÆÒ°¯¿Ö×ì¿ÀÙ••±††¤wx—xy˜}œ€‚›‹Ž£”—©¢°šŸ­•©t‘w“Œ›¥ÏÞæÜíóßñôä÷÷ãóôãóôãóôãóôâòóâòóâòóâòö>>>AAAMMMFFFHHHJJJAAA@@>PQMPQMXZUMNI@A=HIENOJEFAGHDFGBFFDGGENNNAAA99;>>>DDA@@>LLIMMJLLIJJHNNLOOMUUSMMJIIGPPN]][SSPJJHMNISTJWXO^_X^_XPQMEFAHHFIIGLLIPPNVWSSTM^_X]^ZSSPTTQUUS]][UVQUVOZ[TUVQHHFMNIWXQ_aWab[]^WUVQ\]XZZWPPNUVQXXVQQO[[[UUUMMOONSGGIPPPZZZZZZ\\\TTT[[[\\\iii‹‹‹Â–––°°°sss€€€ˆˆˆžžž½½ºÉÉÇÀÁÅ••žÅÇÖÐÒæ˜š²‡‡¥{}œxy˜xz•}—‚†š˜œ­šžª¨­»¢ª½‹“¦r}Žsލ·ÆÐÜíôÛìòãó÷äôöãóôäôöãóôâòóâòóâòó666;;;GGG>>>DDDAAA>>>AAAMMJJLGPQMNOJBD?HIELMHDE@DE@EFAEEBDDASSSFFF88:::=;;;@@>??=IIGGGELLIGGEFFDOOMLLIFFDQQOXXVSSPNNLHIELMFSTJ\]V^_XWXTGHDFFDDDAGGEJJHQSNMNG[\U]^ZSSPOOMVVTXXVUVQPQJVWPLMHIIGSTO^_Xfh^fhabc\VWSQSNSSPXXVNOJTUPWWUPPPQQTGGIHGLA@ENNP[[[UUU___WWWSSS]]]ZZZbbbœœœ~~~jjjlllooo‚‚‚‹‹‹±²­ÇÈά«xy¦ª´}Ž‚—xy‘rty{–{~–wz…˜¢šž¬£¨¶¢¨º˜¬rzlwˆr}ŽŒšª²ÀÎãóþâñøãó÷äôøâòóãóôãóôâòñâòñ>>@::=FFHFFHJJMHHJBBE999MMJIJFGHDDE@BD?FGBLMHGHDBD?FGBFFDBB@TTTJJJ88:99;888777>>>BBBLLLEEEGGGGGGJJJFFFGGGQQQQQQUUUOOODDAMNGPQHVWPVWPWXTIJFLLILLINNLLLIMNIHIB^_Xfhc\\ZTTQWWU[[XZ[VUVOWXQOPLHHFTUPbc\ijahibab[XZUFGBJJHXXVOPLXZUUUSNNNSSUPPSQPUDBGJJMUUWPPS^^aJJMHHJPPSbbd^^acceXX[VVX[[]ddf~~€‚‚…¯¯¯–––£¤¦mot˜z~ˆoq~qs‚ps‡{”{”rv‹tx„‡œ‚†›Ž‘¦—œ±‘¦iq…fo‚s~ˆ“¥—¥·ÄÒâÜëóâñøâòöâòóãóôãóòãóòâóð???>>>IIIGGI??A;;>AADAAAEEBHIEEFA?@;?@;BD?LMHMNIDE@IJFIIGDDAQQQNNN:::;;;777666===AAAJJJNNNMMMNNNGGG>>>JJJPPPMMMVVVLLLFFDGHDMNGUVOVWP]^ZOPLQQOQQOJJHEEBHIEFGBUVQbc^VVTJJHOOMZ[VVWSXZUQSNXZULLI]][^_Xde\cd]\]Vab]NOJNNLSSP\]XXZUXXVJJHQQQPPSUTXLJOFEIIHMNMQZZ\PPSMMOOOQ[[][[]]]___bWWZTTViikŽŽooq‚‚…yy{ˆ‰fhkz~„kotfjrilwoq~vx‡rt„fizwx„…›~•„†žˆ‹£…‰¡vz‰‘¤qypyˆ‘ª˜¥ºÅÔÞÛêñßðóßðñâòóãóòãóòãóò480794BEALNM>?A236687FHE@@>FFDFFD>>;GGEAA?FFDHHFDDALLIJJHJJHVVT]][TTQFFD442997;;9@@>DDALLIJJHBB@BEAEGFILJEFHFGINPO@BAGIFDDAIIGUVQ[\WOPLLMH997???GGEBB@FFDEEB]][[[XQQONNLLMHSTONOJWWUSSPMMMIIIUUSef_de\ab[ef_cd_TUPMMJNNLWWU\\Z[[XTUPMMJNNLUUUSSUDEJEFLFGMVW[MNQIJNIJMUVX[[[QQQUUUVVVOOO]]]eeeeeeefi^_bijlabdcdhopshilefjdekqqzssjjwrq‹‰œ˜—¬‡ˆž„„ŸoqŒcfzw}{”s{‘t{˜~‡¢›¬ÌÙßßìïâðïäôöáñòãööáóóAE:AE=EGBDFE9:=013687ILHEEBLLIGGE886663@@>GGEEEB??=MMJPPNQQOaa^bb_XXVTTQ??=@@>;;9DDAFFDLLIJJHAA?JMIEGFGHJFGIDEGIJMJMLFHEFFFGGGVVTXZUQSNTTQ???;;;FFD@@>FFDNNLiif__]SSPSSPMNIOPLOOMJJHQQQFFFDDFBBBVWPab[ab[TUP\]XVVTMMJMMJSSSWWWPPNXZUIJFNNLNNNOOQFGMDDMGHNTU[NOSEFIEFHVWZSSSMMMTTTXXXQQQVVV[[[WWW^_bUVX^_b]^a]^abcebce]^abcfdei{}‚ffpvv‚Œœ«ª½Œ‰¡‰‰¥ij‚advsx†£¦º{€—tx–t{—€ˆ›¤ÛèêäòñãóôäôöÛííä÷÷BF;=@8>@;>@?78:-/1243BEAMMJOOMFFD220220??=EEBGGE@@>IIGJJHLLIUUSbb_ccaaa^OOMEEB997BB@DDALLIJJHBB@DFB>@??@B?@B:;>@ADNPOILHLLLNNNZZW\]XUVQOOMPPP@@@LLIMMJIIGJJHbb___]TTQLLIUVQMNIOOMNNLNNN===::=???PQMXZS[\WGHD\\ZLLIFFFIIIQQQWWWLLIXZUJLGOOMOOOJJMGHL@AGEFLNOSOPTFGIFGIWZXMMMHHHNNNTTTVVVUUUSSSWWWTUWUVX\]_VWZbce]^a]^abcebcfdeibci^^hhhsllyzy‰‹‰žˆ‰¢qrˆikzšœ©¬°Á–š¯qsrwr{‹v€ˆÅÒÔâðïáñôãó÷åö÷ßðñTWMNQI?A=@BA@AD347243?A>NNLIIG??=774>>;;;9==:JJHGGEHHFHHFQQOJJHQQOSSPXXV]][HHF774AA???=IIGMMJGGE:=9;>=@AD=>@;=?;=?EGFDFBGGGOOOOOMXZUWXTJJHJJJ???LLIHHFAA?GGEZZWTTQJJHJJHHIEHIEHHFGGE@@@;;;88:AAA\]XXZUXZUUUSLLI???IIIGGGJJJQQQQQO_a\QSNQQOSSSFFH@AE;=BBDGGHLPQTMNPMONX[ZJJJEEEIIINNNIIITTTTTTVVVOPSNOQTUWVWZXZ\_acXZ\[\^^_cefjfhmQSXeeoddpxx…†…•‘“¨z}Ž_bomq{ž—˜­~—txqw…w‰Ÿª­Üéëäñøâñøãó÷áñò[^TOSJ8:68:9@AD124364>@=LLIJJHAA?::8HHF;;9??=QQOBB@??=QQOSSPNNLOOMOOMNNLZZWEEB::8EEBEEBFFDLLIPPN9;80219:=46801389;>@?@B?FFFQQQSSPNOJXZUSSP>>>BBBOOMLLIGGEFFDOOMHHFBB@BB@EFA?@;AA?DDADDD???::=EEEPPNPQM[[XAA?>>>:::FFHPPSFFFMMMNNLXZUSTOMMJSSSIIL?@D:;?GHLSTVIJMMONNPOUWTOOONNNFFFMMMHHHQQQOOOQQQLMONOQOPSMNPXZ\]^aVWZPQTVWZVW[^_c]^b[\b_afffpmmyz}‰acp[^feiqmp}‰ˆ˜{zoq‚lq{ipw‡“ÅÏÕáëóÞëòßìñéöúTWMLOGDFA;>=@AD679132@B?LLIQQOGGE774MMJEEBAA?NNLEEBAA?PPNLLIWWULLIFFDIIGVVTAA?442??=BB@IIGJJHTTQ>@=79889;/02124>?A?A@GIFGGGEEEHHFQSN[\W^^\LLLLLLLLIIIGJJHEEBIIGIIGAA?GGE@A=DE@HHF@@>BBBHHHEEGBBBJJHMMJZZWBBB@@@NNPGGIMMODDDAAA>>;NOJXZUMMJPPPIIIBDFBDGNOQZ[]LNMLNMJMIQTPVVVQQQEEELLLHHHNNNSSSVVVPQTOPSPQTFGITUW[\^UVXTUWQSUTUW\]_^_cOPTVW[cdhklrdhpSV^W\^efjss}€€vt…oo{eiqekpv~¶½ÄÜãì¸ÁÌâìòâïóMPFMPHNPL=?>=>@78:8:9LNJGGENNLHHF>>;PPNNNL>>;JJHBB@@@>MMJFFDUUSTTQNNLHHFWWU@@>331;;9DDAQQOIIGUUSFHE;>=89;34789;@AD:=;>@=HHH>>>HHF]^Zab]\\ZZZZLLLLLIMMJHHF@@>DDAEEB774IIG@A=;=8FFDBB@DDDJJJNNPGGGGGELLI[[[EEENNPQQT@?DBBE;;;>>>??=QSN^_[LLIJJJIIIGHJHILMNPUWVNPOHJGEGDMOLSSSVVVLLLOOOMMMJJJWWWWWWVWZMNPIJMIJMPQTPQTZ[]WX[LMONOQ[\^_acUVXUVX^_bbceX]_TX[dehdehdcjvt~wtjirbfibhjjpt£©°¿ÆÐ”žÌÖÜÙãæIMBSVNPSN=?>=>@1249;:HJGMMJFFD??=@@>AA?UUS>>;TTQFFDGGEUUSMMJLLIOOMOOMLLI\\ZEEB663>>;FFD[[XFFDNNLBEA8:92364682369;:HJGILHDDDFFDIJFJLG[\WPQMJJH??=GGETTQJJH886>>;MMJ;;9HHFFGB?@;NNLIIGFFFSSSUUU???GGGMMM^^^JJMIILEDHDBG;:?88:>>>==:HIE^_[GGEFFFHHJBDFFGIGHJSUTOQPGIF@B?ILHGGEXXXWWWVVVSSSHHHXXXUUUQTSQSUGHJMNPMNPNOQXZ\\]_QSUPQTVXWX[Z[]\UWV^a_abd^cdPUVacbbdcbaehfmmlsbah^cdejkilrv{‚‚‡“}„Ž»ÂÉÙãæGH?PQJWXTMMM@@B//1BBBBB@JMH:=8362798>@?TVSFHDTVQDE@MNIVWSOPLNOJJLGMNIHIEQQOOOM9:6FGBVWSab]GHDLMHJJJ>>@224224DDDIII??=DDALLIHHFMNINOJVWP^_XSTMHIEJJHMMJDDA442::8886886EEBNNL@@>EEBTTQAA?LLIXXVIIIOOOEEETTVPPSVUZFEIBAH:9>88:???@@>JJH]][AA????JJMABFFGJHIMFGIXZ\MONILJMOLIIGTTQ^^\MMJTTQPPNNNLTTQSUTQTSNPOLNMILJILJQTS\^][\^UVXUVXVWZ^_b[\^[\^]^a\]__ac\]_^_babd^_c^_c_ac^_bijlhioeiq_dp^co€‡Ž•œ£@A8MNGOPLIIIDDF113:::;;9PSNAD?3644768:9NPO@B>OSJNOJLMHOPLLMHPQMFGBLMHAB>UUS[[XGHD?@;HIBZ[THIBJLGFFH327224BBELLLPPPAA???=??=??=HHFNOJPQM\]VUVONOHJLGPPNNNL;;9442663774GGEPPNBB@AA?QQOIIGEEBPPNSSPWWWIIIGGI??AFEI@?D=;B98=779??ADDDZZWaa^LLL@@BJJM9:>?@DDEHFGJOPSGHJGIHJMLJJHOPLZ[VUVQXZUVWSQSNVVTPSQX[ZWZXLNMHJIFHGJMLUWV\]_TUWQSUTUWZ[]WX[STVXZ\[\^XZ\[\^Z[]^_bQSUVWZ\]_bbbcce_afadlX\fX]hsy€}„‹GH?LMFTUPFFFQQT113111;;9MOJAD@/10/02468JML=?;JMHNOJIJFOPLMNIGHD?@;IJFEFAFFDUUSWXTPQMNOHWXQJLEQSNLLL99;,,/;;;UUUUUSNNL@@>@@>>>>EEBGGELMHVWSNOHGHABD?MMJPPNHHF886220997@@>SSPDDA==:NNLJJHFFDPPNTTQWWUJJJNNNHHJ@@B;:??>BIHM@@B??AMMMZZWZZWQQQ;;>GGI:;?;=@?@DBDGMNPHILGIHHJIMMJNNLUUSZZWVVTUUSPPNTTQQTSWZXVXWOQPHJIGIHGIHOQPXZ\QSUNOQVWZXZ\Z[]PQTWX[XZ\VWZXZ\WX[]^aPQTQSU]^a_acWX[TU[[^fSV^LOW_ej_ejLMDQSLNOJ@@@SSU>>@777;;9LNJFHE236347679LMO>@=MOLPPNIIGOOMEEBBB@AA?FFDDDAMMJVVTVWSFGBFG@VWPQSLVWSFFF447;;;777LLITTQHIEEFADDDAAAGGGIIGFFDTUPQSNMNIMMJUUSMMJPPN==:++)997??=TTQDDA>>;LLILLIIIGNNLPPN\\ZIIGUUULLLWWZMMOFEI87;668==?HHHQQO\\ZJJJMMOHHJ89=9:>@AEHIMIJMEFHADB?A@OOOQQQSSSVVVNNNQQQNNNPPPSUTLNMMONSUTNPOILJHJIMONWX[TUWJLNMNPTUWTUWIJMTUWTUWWX[TUWVWZUVXSTVJLNXZ\WX[OTVIMSPTZQU]OSXZ^aW\^VWNUVOMNIDDDOOQTTVHHH::8>@==?>*+-&(+67:@AD@BAEGFFFF>>>FFFFFFMMMPPPPPPMMJAA?QQOWXTHIEIJDNOHTUNPQMJJHGGGTTTFFDIIGVWSSTO>?:888668>>>AAA>>;HHFPPNSSPSSPMMJNNLQQOIIG774442??=VVTOOMEEBFFDUUSMMJIIGMMJXZUXXVWWULLLTTTLLN--0336113>>@HHHUUS\\ZOOOLLN??A67::;?=>AGHLDEGFGI=?>EGFLLLTTVLLNOOQLLNNNPGGIQQQSUTOQPQTSOQPWZXPSQOQPZ\[VWZUVXGHJLMOPQTXZ\FGIHILPQTQSUTUWWX[STVZ[]MNPPQTMQSPUWJNTBFLLOUVZ_TXZTUWWXOLMFHIE???DDFGGI>>>11/79878:)*-*+/237469468:=;DDD======AAADDD@@@@@@DDDEEBUUSVWS?@;@A:FG@VWP[\WQQO[[[SSPEEBNOJQSNOPI894AAA>>@>>@======JJHPPNJJHIIGMMJHHFNNLOOM@@>AA?BB@UUSVVTNNLHHFSSPIIGMMJJJHUVQSTOLLIQQONNNOOO;;>IIL88:;;>QQQOOM[[X\\\BBEDDF?@D?@D;=@>?BDEGDEG9;:;>=EEGPPSJJMGGIGGIJJMFFHLLNJMLMONQTSPSQSUTSUTUWVTVUOPSNOQEFHIJMIJMPQTBDFFGILMOPQTSTVTUWMNPVWZTUWOTUFMMPVXPTZEHNIMSTUXQTSQTSUVMPQJEFABBB??AEEGBBB886243236(),/0634:67:78:=?>FFH::=::=??AAAD::=::=AAATTQVVTWXTMNIJLEFG@NOHOPLTTQ^^\]][GHDMNIQSLEF?9:6IILGFJ??A::=999HHHMMJGGEGGEJJHGGENNLSSPGGE??=;;9OOMWWUTTQGGEIIGJJHNNLFFDQSNLMHMNILLINNLNNNFFF@@@GGIMMOUUUGGEXXVNNNAAD88:78;9:>?@D@AE:;>>?A?A@@BAEEGNNPLLNFFHEEGGGIEEGEEGFHGMONOQPSUTTVUQTSVXWOQPTUWNOQEFHEFHBDFMNPHILNOQHILJLNPQTQSUHILPQTWX[MQSAGIMSUQW\IMSMQTTUWTTQVVTJLEIJDHIE??=BBBQQQIII444-/1236+,0/03-/29:>;=??A@JJM447@@B@@B>>@::=::=>>@@@@UUS[\WGHD?@;BD?OPLWXTPPN\\Z\\ZLMHGHDLMHDE@==:LLNMMOAAD==?777AAAJJHLLIHHFBB@>>;@@>@@>BB@>>>999HHHPPPMMJFFDJJHFFDFFDLLIMNINOJJJHIIGMMJ[[[XXXUUULLNPPSQQQDDAUUSPPP99;44778;=>AIJNIJM9:=?@BDEGBDFBBEEEGFFHBBBBBBEEGFFHAADEGFNPONPOSUTPSQILJVXWVXWUVXOPSJLNJLNEFHJLNFGIFGIFGIHILLMOPQTHILMNPWX[GLM=BEJPSOUWJOQLPQPSQNPMTTQNOJOPLPQMGHDDE@GGEBBE87;:;A01778;013124468:;>>?AEEG779779AADIIL99;336::=HHHZZWUUSEEB>>;FFDLLI[[XPPNZZZ\\\PPNBB@MMJBB@BBBDFEILJ;>=FHG=?>8:9MONFHGLNM@B?9;8=?;?A>;>=78:348=>AGHJHJIILHLNIJMIHJGFHGHJINPOFHGFHGFHGLMO?@B:;>ABEIJMEGF?A>TVSOQP@AD89;/039:>FGIUWV=?>;=?:;>?@D=>AEFHSUTOQNEGD=?>@AD?@BLNMNPOPSQQTSQTSJMLNPOX[ZTUWPQTIJMNOQJLNGHJGHJIJMDFEGIHGIHMONFHGLNMVXWMNPINOHMNMQSLPQHMNINOMQPQTSPPNMMJLMHDE>;=8AA?>>@32911:/06;=@6796879;:9:=:;>>>@224779??A==?224//1668===IIGVVTNNL>>;EEBPPNTTQZZZXXX\\\IIIAAAGGGFFF@@@?A@BEDDFEBED:=;8:9JMLEGFILJ>@?362362:=;89;46923967=@AEDFEEGDGIEFHEEGFDFEJLNNOQDEGABEFGIQSUDEG9:=BDFABEDFE@B?OQNTVUIJMABE2379:>EFHVXWEGF;=?78;:;?>?BIJMTVSTVQJMHBEADEG?@DGHJHJILNMQTSMONHJILNMTVUWX[OPSIJMMNPPQTJLNEFHABEGIHHJINPOLNMJMLSUTTVUMONFJLEIJINOHMNEIJGLMINOLPQIIGQQOTUPFG@9:6??===?329,,6-/4?@D?@B243=?>;=?>?A?@D12667:78;-/2+,0126;=?>>>HHFUUSQQOAA?AA?JJHUUSUUUZZZWWWPPP@@@JJJEEEEEEADB@BAHJIADB9;:9;:HJIEGFMONDFE9;8796=?>9:=46912889??@D=?>;>:?A=BEAFHGILJGHJJLN?@B?@B?@BQSUNOQLMO>?AEFHILJ?A>NPMSUTHIL@AD:;?ABFGHJVXWSUT>?A78;89=469GHJQTPWZUOQMILHEFH>?BJLNHILFGIGHJEFHBDFFGILMONOQIJMGHJEFHJLNJLNHILEFHEGFFHGJMLEGFBEDMONQTSNPOHMNGLMLPQJOPBGHDHIGLMINOQQOUUSUVQGHA=>9BB@AAD98?//8+,2>?BEFH687ADB:;>:;>>?B126:;?:;?237014348:;>???MMJLLIDDA>>;FFDHHFQQOWWWUUUZZZPPPEEEIIINNNGGG@BA8:9=?>:=;7989;:FHGDFEHJIDFE=?;9;8DFE>?A469/0667=>?B>@?=?;FHDFHEFHGFHG>?AFGI?@BBDF;=?EFH;=?9:=78:?@B=?>=?>PSQLNM=>@67:67:ABFDEGJML\^]GHJ>?B89=:;?MNPPSOTVQOQMILHGHJABFHILGHJEFHEFH?@B?@BBDFFGIHILMNPNOQ?@BIJMJLNIJMEFHFHGNPOJMLFHGILJMONVXWLNMEIJDHIHMNGLM?DEAFGDHIFJLSSPWWUWXTPQJ=>9??=DDFA@GEEN12878;347798@BA@AD4687;>&*037=14:-17*-3*-3-/2:::NNLQQOIIG??=AA?GGELLINNNUUUWWWNNNAAAHHHQQQGGGEGF?A@9;:ADB8:99;:DFE@BAEGFBED@B?=?;GIH9:=126-/478>;=@ADB>@=BE@?A>:=;798>?A;=?67978:67989;78:3479:>:;?9:=>?AGHJPQTFGJ46989=?@DEFHEGF\^]LMO=>A12667:FGIQTPX[V^a\JMIHIL;=@?@D>?B?@D?@D;=@:;?@AEHIMGHJ?@BJLN9:=ABELMODEG=>@HJIOQPJMLFHGFHGEGFNPOHJIAFG@EFDHIAFG>BD;@ABGHGLMOOMUUSUVQOPI894886==?>=D88A/0689=6799;:ADB>?A12637=$(-,06(+1*-3(+1*-3014;;;LLINNLHHF@@>==:??=HHFJJJUUUTTTQQQ===GGGMMMIII@BA=?>9;:HJI?A@>@?DFEBEDADBBEDEGDGIFILJ;=?46912834:78;>@?>@=GIEEGDBEDADB>?A9:=12434767989;89;67:78>;=B89=89;DEGNOSDEJ12878;=>AABEDFE[]\PQTBDG9:>FGJMNPSUQWZU]_[PSOLMO?@D;=@:;??@D>?B78;9:>ABFIJNMNPGHJPQT@ADGHJIJMGHJGHJPSQOQPNPOEGFGIHEGFMONMONFJLDHIFJLDHI;@A;@ABGHEIJSSPUUSPQMGHA340997;;>218++4,-378;679364>@?>?A469-17&*2/2:,08%)1%)1*-6239PPPQQOBB@442==:??=;;9==:IIIOOOUUUSSS;;;AAAIIIDDD@BA=?>>@?JMLEGF?A@?A@?A@9;:?A@GIFLNJILJ;=?469128/060149;::=9FHDBEA=?>8:99:=67901334746878:78:46934:89?46967:HIMIJN?@F67=34889=?@BDFESUTPQTDEH>?BGHLIJMOQNSUPZ\WUWTOPS?@D9:@9:@>?E:;A78>89?=>D@AEABEABENOQEFHEFHFGIJLNLMOGIHGIHMONJMLGIHADBFHGHJIBGH?DE@EF=AB9>?;@ABGHBGHNNLQSNOPIFG@:;7::8779,+2%&,,-3469124687>?A;=?014),4#&/&*2"%-"%-#&,*-3348DFELLIFFD??=886DDALLIGGEBBBNNNPPNTTQ;;9IIG@@@>>>9;:@BAGIHPSQOQPEGFDFE?A@=?>BEDLNJQTPGIH9:=126-/467=237:=;=?;@B?=?;9;:78:89=67:01434812634834812622;33=12878;IJNNOSDEJ78>12889==>@ABESTVVWZJLNFGJNOSHILILHJMHQTOTVSMON;=?9:>67=:;A9:@12878>>?EABH>?B?@BHILABE89;?@BJLNIJMFHGJMLLNMQTSNPOADBFHGIJMDHI?DE?DE;@A7;=;@ABGH@EFPQMMNGOPISTMMNIBBB=;@43:)*0()/78;3474689:=78;/06**6%%1$$-%%/()/126236013>@?BED@BA9;:;>=ADBFHGLNMPPPHHFQSNQSNHIELMHHHFBBB78:@ADFHEMOLLNJJMIIJM@AD>?ADFEOQNNPMADB78:34:,,612812689;9;::=;89;78;78>14:14=03;/2=-1;69A26>03;009009/0678;GHJJLO@AG34:1289:@?@D=>AFGJVWZEFHEFH@@BLLNFFFIIGUUSUUSNNLGGGEFH89=34:67=11:88A66?88A?@DEFHHILBDF=>@=>@GHJEFHEFHBDFIJMNOQGHJGHJEFHHIL:;?=>A>?B:;?9:>9:>=>A:;?PQJIJDZ[TMNIDDA===76:218*+1,-3:;?236-/1348128((1))4%%2%%1&&0&(--/2468687?A@:=;798798?A@?A@BEDADB???GGGJLGOPI892>?:???;;>89=ABEFHENPLQTOGIFFGIFGJBDFABEGIHNPMJML=>@239,,634:67=9:>236?@B?@D;=B46;37?,0:+-:02?13@79F14?,08--922;017237:;>QSVFGM67=34:78>EFL=>DBDGNOSGHJ>?A??ALLNHHHFFFSSPWWUPQMEEBNOQ?@D34:239//866?11=>>G?@DDEGGHJ@AD:;>=>@DEGDEG>?A=>@HILNOQMNPFGIABEGHJDEH@AE;=@78;=>A=>A>?B=>AQSLGHAWXQOPLBB@III649107+,2128>?B013+,/126/06%%/&&2$$1%%1))2%&,*+/9:=>@?>@?9;:364243:=;BED>@?>@?GGIGGGNNLLMHAB>IIG;;;==?9:>>?A>@=DFASUP@B?;=?@AE@AD9:=:=;GIFNPO?@B017//834:89?=>A89;>?A89=34:34:26>+/9*,9/1>13@79F14?,0822>//8,-3348?@BOPT@AG23923967=DEJ;=BABFMNQHIL;=?JJMIILFFFHHHVVTTTQMNIHHFX[ZWX\89=67=34:66?11:88A=>A@AEABF:;?78;;=@?@DABF?@B>?AHILNOQMNPFGIABEGHJ?@D9:>67:469BDGEFIBDGDEHLMFQSLTUNNOJMMJ@@@327/-4()/128=>A)*,*+-/03,-3$$-%%1$$1&&2**3#$*&(+;=?BEDEGF679/02679679:;>ABE@ADDDFDDFNNLPPNOOMMMJJJMAAD>?BDEG>@=>@;NPL:=9124014@AD>?A:=;BEALNM=>@-/400967=23934812478:78;67=34:/2:-1;,/;+-:-0=68E26@03;11=11:,-3014FGISTWIJP67=-/467==>D9:@ABFQSVIJM=>@>>@@@BEEEFFFTTQVVTOPLFFDZ\[abdABF237/0612899B67=BDIEFIEFI=>A469:;?;=@@AE?@B=>@DEGHILGHJGHJEFHHILGHL=>A469126>?BBDG@AE?@DSTMIJDQSLVWSEEB@@@98=/-4()/128;=@+,/*+-)*-#$*$$-%%1##0$$0&&0&(-)*-BDFILJ236/03,-1348;=@67:78;34898===?GGGLLLAAA???336-,1+,0236AD@HJFTVQGIF124/03=>@>?AADBEGDBED89;,-3++412846;78;01378:89=89?78>,08(+6-0=02?+-:+-:+/9+/7--9,,6,-3469LMOLMPNOU:;A/0646;89?9:@@AEIJN@AD9:=AAD==?:::AAATTQ[[XLMHLLIZ\[TUWMNP=>A126/06*+19:@;=B;=B>?E46;67==>D?@F>?B;=?;=?BDFEFHIJMIJMHILFGIDEGEFH679124?@BHILHILDEG?@9@A:PQJUVQTTQFFF438(&-()/78>BDG/02)*,)*-#$*%%/##/""/$$0**3()/014GHJTUW89=/03+,0-/2/03014:;?237,+0;:?BBEHHHEEE@@B76:0/34699:=:=9?A=OQMLNJ:;>78;89;;=?>@?=?;>@?78:-/4,,646;46;469,-089;67:128-/4+/7),7,/;,/;*,9*,9*-8*-6--9,,6&(-9:>JLNJLOQSXLMS0172399:@46;BDGDEH>?A;=?HHJ99;888>>>MMJOOMIJFMNIPSOTVUUVXNOQ:;?014/0646;89?67=78>34:01789?;=B:;A9:>468=>@EFHGHJGHJEFHBDFDEGABE9:=89;=>@DEGEFH>?A:;4>?8PQJWXTMMJBBB327%$+*+1?@FJLO347,-0,-1)*0++4((3$$1**666?$%+126BDFSTV:;?-/4,-3+,2239-/4017)*00/698=HHJHHHEEE??A98=/-4:;?;=?8:79;7NPLJMI9:=67:89;@AD@BA9;88:9679/06--746;128126,-078:4699:@ABH+/7),7,/;(*7)+8)+8),7),4))4009+,278;BDFFGJFGM:;A9:@01723934:>?B@AE;=?:;>>>@::=>>>===IIGOOMSTOQSNLNJQTSNPOIJM469-/2126;=B:;A66?33=22;11:77@;;E;=B@AE9:=;=?@AD?@BDEGGHJIJMHJI=?>687798=?>ADBFHGADB>?8:;4IJDTUPIIGHHH:9>&%,+,2DEJQSV78:124237/0622;%%1""/**699B()/78;?@BQSU9:>+,2/06,-3,-39:@89?67=43::9>AADHHHBBB::=76:+*189=78:;>::=8QTOEGD-/1+,0236>?A>@?241364468017--7017,-3014/0223678;78>34:*-6*-8+-:$&3(*7(*7(+6(+3++7))2,-39:>GHJIJNOPVQSX@AG017*+146;;=@?@D89;89;??A==?777;;;FFDOOMTUPPQMLNJSUQLNMGHJ/03-/2+,0;=B??H66?22;33=33=22;33=67=78;4689:=9:=@ADEFHHILIJMDFE4763648:9@BA@BAFHGHJIlibwebp-1.4.0/examples/Makefile.am0000644000014400001440000000706314606317060013733 0ustar AM_CPPFLAGS += -I$(top_builddir)/src -I$(top_srcdir)/src bin_PROGRAMS = if BUILD_DEMUX bin_PROGRAMS += dwebp cwebp endif if BUILD_ANIMDIFF noinst_PROGRAMS = anim_diff anim_dump endif if BUILD_GIF2WEBP bin_PROGRAMS += gif2webp endif if BUILD_IMG2WEBP bin_PROGRAMS += img2webp endif if BUILD_MUX bin_PROGRAMS += webpmux endif if BUILD_VWEBP bin_PROGRAMS += vwebp endif if BUILD_WEBPINFO bin_PROGRAMS += webpinfo endif noinst_LTLIBRARIES = libexample_util.la libexample_util_la_SOURCES = example_util.c example_util.h libexample_util_la_LIBADD = ../src/libwebp.la anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h gifdec.c gifdec.h anim_diff_CPPFLAGS = $(AM_CPPFLAGS) $(GIF_INCLUDES) anim_diff_LDADD = anim_diff_LDADD += ../src/demux/libwebpdemux.la anim_diff_LDADD += libexample_util.la anim_diff_LDADD += ../imageio/libimageio_util.la anim_diff_LDADD += $(GIF_LIBS) -lm anim_dump_SOURCES = anim_dump.c anim_util.c anim_util.h gifdec.c gifdec.h anim_dump_CPPFLAGS = $(AM_CPPFLAGS) $(PNG_INCLUDES) anim_dump_CPPFLAGS += $(GIF_INCLUDES) anim_dump_LDADD = anim_dump_LDADD += ../src/demux/libwebpdemux.la anim_dump_LDADD += libexample_util.la anim_dump_LDADD += ../imageio/libimageio_util.la anim_dump_LDADD += ../imageio/libimageenc.la anim_dump_LDADD += $(PNG_LIBS) $(GIF_LIBS) $(TIFF_LIBS) -lm cwebp_SOURCES = cwebp.c stopwatch.h cwebp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir) cwebp_LDADD = cwebp_LDADD += libexample_util.la cwebp_LDADD += ../imageio/libimageio_util.la cwebp_LDADD += ../imageio/libimagedec.la cwebp_LDADD += ../src/libwebp.la cwebp_LDADD += $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS) dwebp_SOURCES = dwebp.c stopwatch.h dwebp_CPPFLAGS = $(AM_CPPFLAGS) dwebp_CPPFLAGS += $(JPEG_INCLUDES) $(PNG_INCLUDES) dwebp_LDADD = dwebp_LDADD += libexample_util.la dwebp_LDADD += ../imageio/libimagedec.la dwebp_LDADD += ../imageio/libimageenc.la dwebp_LDADD += ../imageio/libimageio_util.la dwebp_LDADD += ../src/libwebp.la dwebp_LDADD +=$(PNG_LIBS) $(JPEG_LIBS) gif2webp_SOURCES = gif2webp.c gifdec.c gifdec.h gif2webp_CPPFLAGS = $(AM_CPPFLAGS) $(GIF_INCLUDES) gif2webp_LDADD = gif2webp_LDADD += libexample_util.la gif2webp_LDADD += ../imageio/libimageio_util.la gif2webp_LDADD += ../src/mux/libwebpmux.la gif2webp_LDADD += ../src/libwebp.la gif2webp_LDADD += $(GIF_LIBS) vwebp_SOURCES = vwebp.c vwebp_CPPFLAGS = $(AM_CPPFLAGS) $(GL_INCLUDES) vwebp_LDADD = vwebp_LDADD += libexample_util.la vwebp_LDADD += ../imageio/libimageio_util.la vwebp_LDADD += ../src/demux/libwebpdemux.la vwebp_LDADD += $(GL_LIBS) webpmux_SOURCES = webpmux.c webpmux_CPPFLAGS = $(AM_CPPFLAGS) webpmux_LDADD = webpmux_LDADD += libexample_util.la webpmux_LDADD += ../imageio/libimageio_util.la webpmux_LDADD += ../src/mux/libwebpmux.la webpmux_LDADD += ../src/libwebp.la img2webp_SOURCES = img2webp.c img2webp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir) img2webp_LDADD = img2webp_LDADD += libexample_util.la img2webp_LDADD += ../imageio/libimageio_util.la img2webp_LDADD += ../imageio/libimagedec.la img2webp_LDADD += ../src/mux/libwebpmux.la img2webp_LDADD += ../src/libwebp.la img2webp_LDADD += $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) webpinfo_SOURCES = webpinfo.c webpinfo_CPPFLAGS = $(AM_CPPFLAGS) webpinfo_LDADD = webpinfo_LDADD += libexample_util.la webpinfo_LDADD += ../imageio/libimageio_util.la webpinfo_LDADD += ../src/libwebp.la if BUILD_LIBWEBPDECODER anim_diff_LDADD += ../src/libwebpdecoder.la anim_dump_LDADD += ../src/libwebpdecoder.la vwebp_LDADD += ../src/libwebpdecoder.la else anim_diff_LDADD += ../src/libwebp.la anim_dump_LDADD += ../src/libwebp.la vwebp_LDADD += ../src/libwebp.la endif libwebp-1.4.0/examples/webpinfo.c0000644000014400001440000011755314606317060013662 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Command-line tool to print out the chunk level structure of WebP files // along with basic integrity checks. // // Author: Hui Su (huisu@google.com) #include #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #include "../imageio/imageio_util.h" #include "./unicode.h" #include "webp/decode.h" #include "webp/format_constants.h" #include "webp/mux_types.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif #define LOG_ERROR(MESSAGE) \ do { \ if (webp_info->show_diagnosis_) { \ fprintf(stderr, "Error: %s\n", MESSAGE); \ } \ } while (0) #define LOG_WARN(MESSAGE) \ do { \ if (webp_info->show_diagnosis_) { \ fprintf(stderr, "Warning: %s\n", MESSAGE); \ } \ ++webp_info->num_warnings_; \ } while (0) static const char* const kFormats[3] = { "Unknown", "Lossy", "Lossless" }; static const char* const kLosslessTransforms[4] = { "Predictor", "Cross Color", "Subtract Green", "Color Indexing" }; static const char* const kAlphaFilterMethods[4] = { "None", "Horizontal", "Vertical", "Gradient" }; typedef enum { WEBP_INFO_OK = 0, WEBP_INFO_TRUNCATED_DATA, WEBP_INFO_PARSE_ERROR, WEBP_INFO_INVALID_PARAM, WEBP_INFO_BITSTREAM_ERROR, WEBP_INFO_MISSING_DATA, WEBP_INFO_INVALID_COMMAND } WebPInfoStatus; typedef enum ChunkID { CHUNK_VP8, CHUNK_VP8L, CHUNK_VP8X, CHUNK_ALPHA, CHUNK_ANIM, CHUNK_ANMF, CHUNK_ICCP, CHUNK_EXIF, CHUNK_XMP, CHUNK_UNKNOWN, CHUNK_TYPES = CHUNK_UNKNOWN } ChunkID; typedef struct { size_t start_; size_t end_; const uint8_t* buf_; } MemBuffer; typedef struct { size_t offset_; size_t size_; const uint8_t* payload_; ChunkID id_; } ChunkData; typedef struct WebPInfo { int canvas_width_; int canvas_height_; int loop_count_; int num_frames_; int chunk_counts_[CHUNK_TYPES]; int anmf_subchunk_counts_[3]; // 0 VP8; 1 VP8L; 2 ALPH. uint32_t bgcolor_; int feature_flags_; int has_alpha_; // Used for parsing ANMF chunks. int frame_width_, frame_height_; size_t anim_frame_data_size_; int is_processing_anim_frame_, seen_alpha_subchunk_, seen_image_subchunk_; // Print output control. int quiet_, show_diagnosis_, show_summary_; int num_warnings_; int parse_bitstream_; } WebPInfo; static void WebPInfoInit(WebPInfo* const webp_info) { memset(webp_info, 0, sizeof(*webp_info)); } static const uint32_t kWebPChunkTags[CHUNK_TYPES] = { MKFOURCC('V', 'P', '8', ' '), MKFOURCC('V', 'P', '8', 'L'), MKFOURCC('V', 'P', '8', 'X'), MKFOURCC('A', 'L', 'P', 'H'), MKFOURCC('A', 'N', 'I', 'M'), MKFOURCC('A', 'N', 'M', 'F'), MKFOURCC('I', 'C', 'C', 'P'), MKFOURCC('E', 'X', 'I', 'F'), MKFOURCC('X', 'M', 'P', ' '), }; // ----------------------------------------------------------------------------- // Data reading. static int GetLE16(const uint8_t* const data) { return (data[0] << 0) | (data[1] << 8); } static int GetLE24(const uint8_t* const data) { return GetLE16(data) | (data[2] << 16); } static uint32_t GetLE32(const uint8_t* const data) { return GetLE16(data) | ((uint32_t)GetLE16(data + 2) << 16); } static int ReadLE16(const uint8_t** data) { const int val = GetLE16(*data); *data += 2; return val; } static int ReadLE24(const uint8_t** data) { const int val = GetLE24(*data); *data += 3; return val; } static uint32_t ReadLE32(const uint8_t** data) { const uint32_t val = GetLE32(*data); *data += 4; return val; } static int ReadFileToWebPData(const char* const filename, WebPData* const webp_data) { const uint8_t* data; size_t size; if (!ImgIoUtilReadFile(filename, &data, &size)) return 0; webp_data->bytes = data; webp_data->size = size; return 1; } // ----------------------------------------------------------------------------- // MemBuffer object. static void InitMemBuffer(MemBuffer* const mem, const WebPData* webp_data) { mem->buf_ = webp_data->bytes; mem->start_ = 0; mem->end_ = webp_data->size; } static size_t MemDataSize(const MemBuffer* const mem) { return (mem->end_ - mem->start_); } static const uint8_t* GetBuffer(MemBuffer* const mem) { return mem->buf_ + mem->start_; } static void Skip(MemBuffer* const mem, size_t size) { mem->start_ += size; } static uint32_t ReadMemBufLE32(MemBuffer* const mem) { const uint8_t* const data = mem->buf_ + mem->start_; const uint32_t val = GetLE32(data); assert(MemDataSize(mem) >= 4); Skip(mem, 4); return val; } // ----------------------------------------------------------------------------- // Lossy bitstream analysis. static int GetBits(const uint8_t* const data, size_t data_size, size_t nb, int* val, uint64_t* const bit_pos) { *val = 0; while (nb-- > 0) { const uint64_t p = (*bit_pos)++; if ((p >> 3) >= data_size) { return 0; } else { const int bit = !!(data[p >> 3] & (128 >> ((p & 7)))); *val = (*val << 1) | bit; } } return 1; } static int GetSignedBits(const uint8_t* const data, size_t data_size, size_t nb, int* val, uint64_t* const bit_pos) { int sign; if (!GetBits(data, data_size, nb, val, bit_pos)) return 0; if (!GetBits(data, data_size, 1, &sign, bit_pos)) return 0; if (sign) *val = -(*val); return 1; } #define GET_BITS(v, n) \ do { \ if (!GetBits(data, data_size, n, &(v), bit_pos)) { \ LOG_ERROR("Truncated lossy bitstream."); \ return WEBP_INFO_TRUNCATED_DATA; \ } \ } while (0) #define GET_SIGNED_BITS(v, n) \ do { \ if (!GetSignedBits(data, data_size, n, &(v), bit_pos)) { \ LOG_ERROR("Truncated lossy bitstream."); \ return WEBP_INFO_TRUNCATED_DATA; \ } \ } while (0) static WebPInfoStatus ParseLossySegmentHeader(const WebPInfo* const webp_info, const uint8_t* const data, size_t data_size, uint64_t* const bit_pos) { int use_segment; GET_BITS(use_segment, 1); printf(" Use segment: %d\n", use_segment); if (use_segment) { int update_map, update_data; GET_BITS(update_map, 1); GET_BITS(update_data, 1); printf(" Update map: %d\n" " Update data: %d\n", update_map, update_data); if (update_data) { int i, a_delta; int quantizer[4] = {0, 0, 0, 0}; int filter_strength[4] = {0, 0, 0, 0}; GET_BITS(a_delta, 1); printf(" Absolute delta: %d\n", a_delta); for (i = 0; i < 4; ++i) { int bit; GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(quantizer[i], 7); } for (i = 0; i < 4; ++i) { int bit; GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(filter_strength[i], 6); } printf(" Quantizer: %d %d %d %d\n", quantizer[0], quantizer[1], quantizer[2], quantizer[3]); printf(" Filter strength: %d %d %d %d\n", filter_strength[0], filter_strength[1], filter_strength[2], filter_strength[3]); } if (update_map) { int i; int prob_segment[3] = {255, 255, 255}; for (i = 0; i < 3; ++i) { int bit; GET_BITS(bit, 1); if (bit) GET_BITS(prob_segment[i], 8); } printf(" Prob segment: %d %d %d\n", prob_segment[0], prob_segment[1], prob_segment[2]); } } return WEBP_INFO_OK; } static WebPInfoStatus ParseLossyFilterHeader(const WebPInfo* const webp_info, const uint8_t* const data, size_t data_size, uint64_t* const bit_pos) { int simple_filter, level, sharpness, use_lf_delta; GET_BITS(simple_filter, 1); GET_BITS(level, 6); GET_BITS(sharpness, 3); GET_BITS(use_lf_delta, 1); printf(" Simple filter: %d\n", simple_filter); printf(" Level: %d\n", level); printf(" Sharpness: %d\n", sharpness); printf(" Use lf delta: %d\n", use_lf_delta); if (use_lf_delta) { int update; GET_BITS(update, 1); printf(" Update lf delta: %d\n", update); if (update) { int i; for (i = 0; i < 4 + 4; ++i) { int temp; GET_BITS(temp, 1); if (temp) GET_BITS(temp, 7); } } } return WEBP_INFO_OK; } static WebPInfoStatus ParseLossyHeader(const ChunkData* const chunk_data, const WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; size_t data_size = chunk_data->size_ - CHUNK_HEADER_SIZE; const uint32_t bits = (uint32_t)data[0] | (data[1] << 8) | (data[2] << 16); const int key_frame = !(bits & 1); const int profile = (bits >> 1) & 7; const int display = (bits >> 4) & 1; const uint32_t partition0_length = (bits >> 5); WebPInfoStatus status = WEBP_INFO_OK; uint64_t bit_position = 0; uint64_t* const bit_pos = &bit_position; int colorspace, clamp_type; printf(" Parsing lossy bitstream...\n"); // Calling WebPGetFeatures() in ProcessImageChunk() should ensure this. assert(chunk_data->size_ >= CHUNK_HEADER_SIZE + 10); if (profile > 3) { LOG_ERROR("Unknown profile."); return WEBP_INFO_BITSTREAM_ERROR; } if (!display) { LOG_ERROR("Frame is not displayable."); return WEBP_INFO_BITSTREAM_ERROR; } data += 3; data_size -= 3; printf( " Key frame: %s\n" " Profile: %d\n" " Display: Yes\n" " Part. 0 length: %d\n", key_frame ? "Yes" : "No", profile, partition0_length); if (key_frame) { if (!(data[0] == 0x9d && data[1] == 0x01 && data[2] == 0x2a)) { LOG_ERROR("Invalid lossy bitstream signature."); return WEBP_INFO_BITSTREAM_ERROR; } printf(" Width: %d\n" " X scale: %d\n" " Height: %d\n" " Y scale: %d\n", ((data[4] << 8) | data[3]) & 0x3fff, data[4] >> 6, ((data[6] << 8) | data[5]) & 0x3fff, data[6] >> 6); data += 7; data_size -= 7; } else { LOG_ERROR("Non-keyframe detected in lossy bitstream."); return WEBP_INFO_BITSTREAM_ERROR; } if (partition0_length >= data_size) { LOG_ERROR("Bad partition length."); return WEBP_INFO_BITSTREAM_ERROR; } GET_BITS(colorspace, 1); GET_BITS(clamp_type, 1); printf(" Color space: %d\n", colorspace); printf(" Clamp type: %d\n", clamp_type); status = ParseLossySegmentHeader(webp_info, data, data_size, bit_pos); if (status != WEBP_INFO_OK) return status; status = ParseLossyFilterHeader(webp_info, data, data_size, bit_pos); if (status != WEBP_INFO_OK) return status; { // Partition number and size. const uint8_t* part_size = data + partition0_length; int num_parts, i; size_t part_data_size; GET_BITS(num_parts, 2); num_parts = 1 << num_parts; if ((int)(data_size - partition0_length) < (num_parts - 1) * 3) { LOG_ERROR("Truncated lossy bitstream."); return WEBP_INFO_TRUNCATED_DATA; } part_data_size = data_size - partition0_length - (num_parts - 1) * 3; printf(" Total partitions: %d\n", num_parts); for (i = 1; i < num_parts; ++i) { const size_t psize = part_size[0] | (part_size[1] << 8) | (part_size[2] << 16); if (psize > part_data_size) { LOG_ERROR("Truncated partition."); return WEBP_INFO_TRUNCATED_DATA; } printf(" Part. %d length: %d\n", i, (int)psize); part_data_size -= psize; part_size += 3; } } // Quantizer. { int base_q, bit; int dq_y1_dc = 0, dq_y2_dc = 0, dq_y2_ac = 0, dq_uv_dc = 0, dq_uv_ac = 0; GET_BITS(base_q, 7); GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(dq_y1_dc, 4); GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(dq_y2_dc, 4); GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(dq_y2_ac, 4); GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(dq_uv_dc, 4); GET_BITS(bit, 1); if (bit) GET_SIGNED_BITS(dq_uv_ac, 4); printf(" Base Q: %d\n", base_q); printf(" DQ Y1 DC: %d\n", dq_y1_dc); printf(" DQ Y2 DC: %d\n", dq_y2_dc); printf(" DQ Y2 AC: %d\n", dq_y2_ac); printf(" DQ UV DC: %d\n", dq_uv_dc); printf(" DQ UV AC: %d\n", dq_uv_ac); } if ((*bit_pos >> 3) >= partition0_length) { LOG_ERROR("Truncated lossy bitstream."); return WEBP_INFO_TRUNCATED_DATA; } return WEBP_INFO_OK; } // ----------------------------------------------------------------------------- // Lossless bitstream analysis. static int LLGetBits(const uint8_t* const data, size_t data_size, size_t nb, int* val, uint64_t* const bit_pos) { uint32_t i = 0; *val = 0; while (i < nb) { const uint64_t p = (*bit_pos)++; if ((p >> 3) >= data_size) { return 0; } else { const int bit = !!(data[p >> 3] & (1 << ((p & 7)))); *val = *val | (bit << i); ++i; } } return 1; } #define LL_GET_BITS(v, n) \ do { \ if (!LLGetBits(data, data_size, n, &(v), bit_pos)) { \ LOG_ERROR("Truncated lossless bitstream."); \ return WEBP_INFO_TRUNCATED_DATA; \ } \ } while (0) static WebPInfoStatus ParseLosslessTransform(WebPInfo* const webp_info, const uint8_t* const data, size_t data_size, uint64_t* const bit_pos) { int use_transform, block_size, n_colors; LL_GET_BITS(use_transform, 1); printf(" Use transform: %s\n", use_transform ? "Yes" : "No"); if (use_transform) { int type; LL_GET_BITS(type, 2); printf(" 1st transform: %s (%d)\n", kLosslessTransforms[type], type); switch (type) { case PREDICTOR_TRANSFORM: case CROSS_COLOR_TRANSFORM: LL_GET_BITS(block_size, 3); block_size = 1 << (block_size + 2); printf(" Tran. block size: %d\n", block_size); break; case COLOR_INDEXING_TRANSFORM: LL_GET_BITS(n_colors, 8); n_colors += 1; printf(" No. of colors: %d\n", n_colors); break; default: break; } } return WEBP_INFO_OK; } static WebPInfoStatus ParseLosslessHeader(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; size_t data_size = chunk_data->size_ - CHUNK_HEADER_SIZE; uint64_t bit_position = 0; uint64_t* const bit_pos = &bit_position; WebPInfoStatus status; printf(" Parsing lossless bitstream...\n"); if (data_size < VP8L_FRAME_HEADER_SIZE) { LOG_ERROR("Truncated lossless bitstream."); return WEBP_INFO_TRUNCATED_DATA; } if (data[0] != VP8L_MAGIC_BYTE) { LOG_ERROR("Invalid lossless bitstream signature."); return WEBP_INFO_BITSTREAM_ERROR; } data += 1; data_size -= 1; { int width, height, has_alpha, version; LL_GET_BITS(width, 14); LL_GET_BITS(height, 14); LL_GET_BITS(has_alpha, 1); LL_GET_BITS(version, 3); width += 1; height += 1; printf(" Width: %d\n", width); printf(" Height: %d\n", height); printf(" Alpha: %d\n", has_alpha); printf(" Version: %d\n", version); } status = ParseLosslessTransform(webp_info, data, data_size, bit_pos); if (status != WEBP_INFO_OK) return status; return WEBP_INFO_OK; } static WebPInfoStatus ParseAlphaHeader(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; size_t data_size = chunk_data->size_ - CHUNK_HEADER_SIZE; if (data_size <= ALPHA_HEADER_LEN) { LOG_ERROR("Truncated ALPH chunk."); return WEBP_INFO_TRUNCATED_DATA; } printf(" Parsing ALPH chunk...\n"); { const int compression_method = (data[0] >> 0) & 0x03; const int filter = (data[0] >> 2) & 0x03; const int pre_processing = (data[0] >> 4) & 0x03; const int reserved_bits = (data[0] >> 6) & 0x03; printf(" Compression: %d\n", compression_method); printf(" Filter: %s (%d)\n", kAlphaFilterMethods[filter], filter); printf(" Pre-processing: %d\n", pre_processing); if (compression_method > ALPHA_LOSSLESS_COMPRESSION) { LOG_ERROR("Invalid Alpha compression method."); return WEBP_INFO_BITSTREAM_ERROR; } if (pre_processing > ALPHA_PREPROCESSED_LEVELS) { LOG_ERROR("Invalid Alpha pre-processing method."); return WEBP_INFO_BITSTREAM_ERROR; } if (reserved_bits != 0) { LOG_WARN("Reserved bits in ALPH chunk header are not all 0."); } data += ALPHA_HEADER_LEN; data_size -= ALPHA_HEADER_LEN; if (compression_method == ALPHA_LOSSLESS_COMPRESSION) { uint64_t bit_pos = 0; WebPInfoStatus status = ParseLosslessTransform(webp_info, data, data_size, &bit_pos); if (status != WEBP_INFO_OK) return status; } } return WEBP_INFO_OK; } // ----------------------------------------------------------------------------- // Chunk parsing. static WebPInfoStatus ParseRIFFHeader(WebPInfo* const webp_info, MemBuffer* const mem) { const size_t min_size = RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE; size_t riff_size; if (MemDataSize(mem) < min_size) { LOG_ERROR("Truncated data detected when parsing RIFF header."); return WEBP_INFO_TRUNCATED_DATA; } if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) || memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) { LOG_ERROR("Corrupted RIFF header."); return WEBP_INFO_PARSE_ERROR; } riff_size = GetLE32(GetBuffer(mem) + TAG_SIZE); if (riff_size < CHUNK_HEADER_SIZE) { LOG_ERROR("RIFF size is too small."); return WEBP_INFO_PARSE_ERROR; } if (riff_size > MAX_CHUNK_PAYLOAD) { LOG_ERROR("RIFF size is over limit."); return WEBP_INFO_PARSE_ERROR; } riff_size += CHUNK_HEADER_SIZE; if (!webp_info->quiet_) { printf("RIFF HEADER:\n"); printf(" File size: %6d\n", (int)riff_size); } if (riff_size < mem->end_) { LOG_WARN("RIFF size is smaller than the file size."); mem->end_ = riff_size; } else if (riff_size > mem->end_) { LOG_ERROR("Truncated data detected when parsing RIFF payload."); return WEBP_INFO_TRUNCATED_DATA; } Skip(mem, RIFF_HEADER_SIZE); return WEBP_INFO_OK; } static WebPInfoStatus ParseChunk(const WebPInfo* const webp_info, MemBuffer* const mem, ChunkData* const chunk_data) { memset(chunk_data, 0, sizeof(*chunk_data)); if (MemDataSize(mem) < CHUNK_HEADER_SIZE) { LOG_ERROR("Truncated data detected when parsing chunk header."); return WEBP_INFO_TRUNCATED_DATA; } else { const size_t chunk_start_offset = mem->start_; const uint32_t fourcc = ReadMemBufLE32(mem); const uint32_t payload_size = ReadMemBufLE32(mem); const uint32_t payload_size_padded = payload_size + (payload_size & 1); const size_t chunk_size = CHUNK_HEADER_SIZE + payload_size_padded; int i; if (payload_size > MAX_CHUNK_PAYLOAD) { LOG_ERROR("Size of chunk payload is over limit."); return WEBP_INFO_INVALID_PARAM; } if (payload_size_padded > MemDataSize(mem)){ LOG_ERROR("Truncated data detected when parsing chunk payload."); return WEBP_INFO_TRUNCATED_DATA; } for (i = 0; i < CHUNK_TYPES; ++i) { if (kWebPChunkTags[i] == fourcc) break; } chunk_data->offset_ = chunk_start_offset; chunk_data->size_ = chunk_size; chunk_data->id_ = (ChunkID)i; chunk_data->payload_ = GetBuffer(mem); if (chunk_data->id_ == CHUNK_ANMF) { if (payload_size != payload_size_padded) { LOG_ERROR("ANMF chunk size should always be even."); return WEBP_INFO_PARSE_ERROR; } // There are sub-chunks to be parsed in an ANMF chunk. Skip(mem, ANMF_CHUNK_SIZE); } else { Skip(mem, payload_size_padded); } return WEBP_INFO_OK; } } // ----------------------------------------------------------------------------- // Chunk analysis. static WebPInfoStatus ProcessVP8XChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; if (webp_info->chunk_counts_[CHUNK_VP8] || webp_info->chunk_counts_[CHUNK_VP8L] || webp_info->chunk_counts_[CHUNK_VP8X]) { LOG_ERROR("Already seen a VP8/VP8L/VP8X chunk when parsing VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } if (chunk_data->size_ != VP8X_CHUNK_SIZE + CHUNK_HEADER_SIZE) { LOG_ERROR("Corrupted VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } ++webp_info->chunk_counts_[CHUNK_VP8X]; webp_info->feature_flags_ = *data; data += 4; webp_info->canvas_width_ = 1 + ReadLE24(&data); webp_info->canvas_height_ = 1 + ReadLE24(&data); if (!webp_info->quiet_) { printf(" ICCP: %d\n Alpha: %d\n EXIF: %d\n XMP: %d\n Animation: %d\n", (webp_info->feature_flags_ & ICCP_FLAG) != 0, (webp_info->feature_flags_ & ALPHA_FLAG) != 0, (webp_info->feature_flags_ & EXIF_FLAG) != 0, (webp_info->feature_flags_ & XMP_FLAG) != 0, (webp_info->feature_flags_ & ANIMATION_FLAG) != 0); printf(" Canvas size %d x %d\n", webp_info->canvas_width_, webp_info->canvas_height_); } if (webp_info->canvas_width_ > MAX_CANVAS_SIZE) { LOG_WARN("Canvas width is out of range in VP8X chunk."); } if (webp_info->canvas_height_ > MAX_CANVAS_SIZE) { LOG_WARN("Canvas height is out of range in VP8X chunk."); } if ((uint64_t)webp_info->canvas_width_ * webp_info->canvas_height_ > MAX_IMAGE_AREA) { LOG_WARN("Canvas area is out of range in VP8X chunk."); } return WEBP_INFO_OK; } static WebPInfoStatus ProcessANIMChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; if (!webp_info->chunk_counts_[CHUNK_VP8X]) { LOG_ERROR("ANIM chunk detected before VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } if (chunk_data->size_ != ANIM_CHUNK_SIZE + CHUNK_HEADER_SIZE) { LOG_ERROR("Corrupted ANIM chunk."); return WEBP_INFO_PARSE_ERROR; } webp_info->bgcolor_ = ReadLE32(&data); webp_info->loop_count_ = ReadLE16(&data); ++webp_info->chunk_counts_[CHUNK_ANIM]; if (!webp_info->quiet_) { printf(" Background color:(ARGB) %02x %02x %02x %02x\n", (webp_info->bgcolor_ >> 24) & 0xff, (webp_info->bgcolor_ >> 16) & 0xff, (webp_info->bgcolor_ >> 8) & 0xff, webp_info->bgcolor_ & 0xff); printf(" Loop count : %d\n", webp_info->loop_count_); } if (webp_info->loop_count_ > MAX_LOOP_COUNT) { LOG_WARN("Loop count is out of range in ANIM chunk."); } return WEBP_INFO_OK; } static WebPInfoStatus ProcessANMFChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_; int offset_x, offset_y, width, height, duration, blend, dispose, temp; if (webp_info->is_processing_anim_frame_) { LOG_ERROR("ANMF chunk detected within another ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } if (!webp_info->chunk_counts_[CHUNK_ANIM]) { LOG_ERROR("ANMF chunk detected before ANIM chunk."); return WEBP_INFO_PARSE_ERROR; } if (chunk_data->size_ <= CHUNK_HEADER_SIZE + ANMF_CHUNK_SIZE) { LOG_ERROR("Truncated data detected when parsing ANMF chunk."); return WEBP_INFO_TRUNCATED_DATA; } offset_x = 2 * ReadLE24(&data); offset_y = 2 * ReadLE24(&data); width = 1 + ReadLE24(&data); height = 1 + ReadLE24(&data); duration = ReadLE24(&data); temp = *data; dispose = temp & 1; blend = (temp >> 1) & 1; ++webp_info->chunk_counts_[CHUNK_ANMF]; if (!webp_info->quiet_) { printf(" Offset_X: %d\n Offset_Y: %d\n Width: %d\n Height: %d\n" " Duration: %d\n Dispose: %d\n Blend: %d\n", offset_x, offset_y, width, height, duration, dispose, blend); } if (duration > MAX_DURATION) { LOG_ERROR("Invalid duration parameter in ANMF chunk."); return WEBP_INFO_INVALID_PARAM; } if (offset_x > MAX_POSITION_OFFSET || offset_y > MAX_POSITION_OFFSET) { LOG_ERROR("Invalid offset parameters in ANMF chunk."); return WEBP_INFO_INVALID_PARAM; } if ((uint64_t)offset_x + width > (uint64_t)webp_info->canvas_width_ || (uint64_t)offset_y + height > (uint64_t)webp_info->canvas_height_) { LOG_ERROR("Frame exceeds canvas in ANMF chunk."); return WEBP_INFO_INVALID_PARAM; } webp_info->is_processing_anim_frame_ = 1; webp_info->seen_alpha_subchunk_ = 0; webp_info->seen_image_subchunk_ = 0; webp_info->frame_width_ = width; webp_info->frame_height_ = height; webp_info->anim_frame_data_size_ = chunk_data->size_ - CHUNK_HEADER_SIZE - ANMF_CHUNK_SIZE; return WEBP_INFO_OK; } static WebPInfoStatus ProcessImageChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { const uint8_t* data = chunk_data->payload_ - CHUNK_HEADER_SIZE; WebPBitstreamFeatures features; const VP8StatusCode vp8_status = WebPGetFeatures(data, chunk_data->size_, &features); if (vp8_status != VP8_STATUS_OK) { LOG_ERROR("VP8/VP8L bitstream error."); return WEBP_INFO_BITSTREAM_ERROR; } if (!webp_info->quiet_) { assert(features.format >= 0 && features.format <= 2); printf(" Width: %d\n Height: %d\n Alpha: %d\n Animation: %d\n" " Format: %s (%d)\n", features.width, features.height, features.has_alpha, features.has_animation, kFormats[features.format], features.format); } if (webp_info->is_processing_anim_frame_) { ++webp_info->anmf_subchunk_counts_[chunk_data->id_ == CHUNK_VP8 ? 0 : 1]; if (chunk_data->id_ == CHUNK_VP8L && webp_info->seen_alpha_subchunk_) { LOG_ERROR("Both VP8L and ALPH sub-chunks are present in an ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->frame_width_ != features.width || webp_info->frame_height_ != features.height) { LOG_ERROR("Frame size in VP8/VP8L sub-chunk differs from ANMF header."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->seen_image_subchunk_) { LOG_ERROR("Consecutive VP8/VP8L sub-chunks in an ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } webp_info->seen_image_subchunk_ = 1; } else { if (webp_info->chunk_counts_[CHUNK_VP8] || webp_info->chunk_counts_[CHUNK_VP8L]) { LOG_ERROR("Multiple VP8/VP8L chunks detected."); return WEBP_INFO_PARSE_ERROR; } if (chunk_data->id_ == CHUNK_VP8L && webp_info->chunk_counts_[CHUNK_ALPHA]) { LOG_WARN("Both VP8L and ALPH chunks are detected."); } if (webp_info->chunk_counts_[CHUNK_ANIM] || webp_info->chunk_counts_[CHUNK_ANMF]) { LOG_ERROR("VP8/VP8L chunk and ANIM/ANMF chunk are both detected."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->chunk_counts_[CHUNK_VP8X]) { if (webp_info->canvas_width_ != features.width || webp_info->canvas_height_ != features.height) { LOG_ERROR("Image size in VP8/VP8L chunk differs from VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } } else { webp_info->canvas_width_ = features.width; webp_info->canvas_height_ = features.height; if (webp_info->canvas_width_ < 1 || webp_info->canvas_height_ < 1 || webp_info->canvas_width_ > MAX_CANVAS_SIZE || webp_info->canvas_height_ > MAX_CANVAS_SIZE || (uint64_t)webp_info->canvas_width_ * webp_info->canvas_height_ > MAX_IMAGE_AREA) { LOG_WARN("Invalid parameters in VP8/VP8L chunk."); } } ++webp_info->chunk_counts_[chunk_data->id_]; } ++webp_info->num_frames_; webp_info->has_alpha_ |= features.has_alpha; if (webp_info->parse_bitstream_) { const int is_lossy = (chunk_data->id_ == CHUNK_VP8); const WebPInfoStatus status = is_lossy ? ParseLossyHeader(chunk_data, webp_info) : ParseLosslessHeader(chunk_data, webp_info); if (status != WEBP_INFO_OK) return status; } return WEBP_INFO_OK; } static WebPInfoStatus ProcessALPHChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { if (webp_info->is_processing_anim_frame_) { ++webp_info->anmf_subchunk_counts_[2]; if (webp_info->seen_alpha_subchunk_) { LOG_ERROR("Consecutive ALPH sub-chunks in an ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } webp_info->seen_alpha_subchunk_ = 1; if (webp_info->seen_image_subchunk_) { LOG_ERROR("ALPHA sub-chunk detected after VP8 sub-chunk " "in an ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } } else { if (webp_info->chunk_counts_[CHUNK_ANIM] || webp_info->chunk_counts_[CHUNK_ANMF]) { LOG_ERROR("ALPHA chunk and ANIM/ANMF chunk are both detected."); return WEBP_INFO_PARSE_ERROR; } if (!webp_info->chunk_counts_[CHUNK_VP8X]) { LOG_ERROR("ALPHA chunk detected before VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->chunk_counts_[CHUNK_VP8]) { LOG_ERROR("ALPHA chunk detected after VP8 chunk."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->chunk_counts_[CHUNK_ALPHA]) { LOG_ERROR("Multiple ALPHA chunks detected."); return WEBP_INFO_PARSE_ERROR; } ++webp_info->chunk_counts_[CHUNK_ALPHA]; } webp_info->has_alpha_ = 1; if (webp_info->parse_bitstream_) { const WebPInfoStatus status = ParseAlphaHeader(chunk_data, webp_info); if (status != WEBP_INFO_OK) return status; } return WEBP_INFO_OK; } static WebPInfoStatus ProcessICCPChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { (void)chunk_data; if (!webp_info->chunk_counts_[CHUNK_VP8X]) { LOG_ERROR("ICCP chunk detected before VP8X chunk."); return WEBP_INFO_PARSE_ERROR; } if (webp_info->chunk_counts_[CHUNK_VP8] || webp_info->chunk_counts_[CHUNK_VP8L] || webp_info->chunk_counts_[CHUNK_ANIM]) { LOG_ERROR("ICCP chunk detected after image data."); return WEBP_INFO_PARSE_ERROR; } ++webp_info->chunk_counts_[CHUNK_ICCP]; return WEBP_INFO_OK; } static WebPInfoStatus ProcessChunk(const ChunkData* const chunk_data, WebPInfo* const webp_info) { WebPInfoStatus status = WEBP_INFO_OK; ChunkID id = chunk_data->id_; if (chunk_data->id_ == CHUNK_UNKNOWN) { char error_message[50]; snprintf(error_message, 50, "Unknown chunk at offset %6d, length %6d", (int)chunk_data->offset_, (int)chunk_data->size_); LOG_WARN(error_message); } else { if (!webp_info->quiet_) { char tag[4]; uint32_t fourcc = kWebPChunkTags[chunk_data->id_]; #ifdef WORDS_BIGENDIAN fourcc = (fourcc >> 24) | ((fourcc >> 8) & 0xff00) | ((fourcc << 8) & 0xff0000) | (fourcc << 24); #endif memcpy(tag, &fourcc, sizeof(tag)); printf("Chunk %c%c%c%c at offset %6d, length %6d\n", tag[0], tag[1], tag[2], tag[3], (int)chunk_data->offset_, (int)chunk_data->size_); } } switch (id) { case CHUNK_VP8: case CHUNK_VP8L: status = ProcessImageChunk(chunk_data, webp_info); break; case CHUNK_VP8X: status = ProcessVP8XChunk(chunk_data, webp_info); break; case CHUNK_ALPHA: status = ProcessALPHChunk(chunk_data, webp_info); break; case CHUNK_ANIM: status = ProcessANIMChunk(chunk_data, webp_info); break; case CHUNK_ANMF: status = ProcessANMFChunk(chunk_data, webp_info); break; case CHUNK_ICCP: status = ProcessICCPChunk(chunk_data, webp_info); break; case CHUNK_EXIF: case CHUNK_XMP: ++webp_info->chunk_counts_[id]; break; case CHUNK_UNKNOWN: default: break; } if (webp_info->is_processing_anim_frame_ && id != CHUNK_ANMF) { if (webp_info->anim_frame_data_size_ == chunk_data->size_) { if (!webp_info->seen_image_subchunk_) { LOG_ERROR("No VP8/VP8L chunk detected in an ANMF chunk."); return WEBP_INFO_PARSE_ERROR; } webp_info->is_processing_anim_frame_ = 0; } else if (webp_info->anim_frame_data_size_ > chunk_data->size_) { webp_info->anim_frame_data_size_ -= chunk_data->size_; } else { LOG_ERROR("Truncated data detected when parsing ANMF chunk."); return WEBP_INFO_TRUNCATED_DATA; } } return status; } static WebPInfoStatus Validate(WebPInfo* const webp_info) { if (webp_info->num_frames_ < 1) { LOG_ERROR("No image/frame detected."); return WEBP_INFO_MISSING_DATA; } if (webp_info->chunk_counts_[CHUNK_VP8X]) { const int iccp = !!(webp_info->feature_flags_ & ICCP_FLAG); const int exif = !!(webp_info->feature_flags_ & EXIF_FLAG); const int xmp = !!(webp_info->feature_flags_ & XMP_FLAG); const int animation = !!(webp_info->feature_flags_ & ANIMATION_FLAG); const int alpha = !!(webp_info->feature_flags_ & ALPHA_FLAG); if (!alpha && webp_info->has_alpha_) { LOG_ERROR("Unexpected alpha data detected."); return WEBP_INFO_PARSE_ERROR; } if (alpha && !webp_info->has_alpha_) { LOG_WARN("Alpha flag is set with no alpha data present."); } if (iccp && !webp_info->chunk_counts_[CHUNK_ICCP]) { LOG_ERROR("Missing ICCP chunk."); return WEBP_INFO_MISSING_DATA; } if (exif && !webp_info->chunk_counts_[CHUNK_EXIF]) { LOG_ERROR("Missing EXIF chunk."); return WEBP_INFO_MISSING_DATA; } if (xmp && !webp_info->chunk_counts_[CHUNK_XMP]) { LOG_ERROR("Missing XMP chunk."); return WEBP_INFO_MISSING_DATA; } if (!iccp && webp_info->chunk_counts_[CHUNK_ICCP]) { LOG_ERROR("Unexpected ICCP chunk detected."); return WEBP_INFO_PARSE_ERROR; } if (!exif && webp_info->chunk_counts_[CHUNK_EXIF]) { LOG_ERROR("Unexpected EXIF chunk detected."); return WEBP_INFO_PARSE_ERROR; } if (!xmp && webp_info->chunk_counts_[CHUNK_XMP]) { LOG_ERROR("Unexpected XMP chunk detected."); return WEBP_INFO_PARSE_ERROR; } // Incomplete animation frame. if (webp_info->is_processing_anim_frame_) return WEBP_INFO_MISSING_DATA; if (!animation && webp_info->num_frames_ > 1) { LOG_ERROR("More than 1 frame detected in non-animation file."); return WEBP_INFO_PARSE_ERROR; } if (animation && (!webp_info->chunk_counts_[CHUNK_ANIM] || !webp_info->chunk_counts_[CHUNK_ANMF])) { LOG_ERROR("No ANIM/ANMF chunk detected in animation file."); return WEBP_INFO_PARSE_ERROR; } } return WEBP_INFO_OK; } static void ShowSummary(const WebPInfo* const webp_info) { int i; printf("Summary:\n"); printf("Number of frames: %d\n", webp_info->num_frames_); printf("Chunk type : VP8 VP8L VP8X ALPH ANIM ANMF(VP8 /VP8L/ALPH) ICCP " "EXIF XMP\n"); printf("Chunk counts: "); for (i = 0; i < CHUNK_TYPES; ++i) { printf("%4d ", webp_info->chunk_counts_[i]); if (i == CHUNK_ANMF) { printf("%4d %4d %4d ", webp_info->anmf_subchunk_counts_[0], webp_info->anmf_subchunk_counts_[1], webp_info->anmf_subchunk_counts_[2]); } } printf("\n"); } static WebPInfoStatus AnalyzeWebP(WebPInfo* const webp_info, const WebPData* webp_data) { ChunkData chunk_data; MemBuffer mem_buffer; WebPInfoStatus webp_info_status = WEBP_INFO_OK; InitMemBuffer(&mem_buffer, webp_data); webp_info_status = ParseRIFFHeader(webp_info, &mem_buffer); if (webp_info_status != WEBP_INFO_OK) goto Error; // Loop through all the chunks. Terminate immediately in case of error. while (webp_info_status == WEBP_INFO_OK && MemDataSize(&mem_buffer) > 0) { webp_info_status = ParseChunk(webp_info, &mem_buffer, &chunk_data); if (webp_info_status != WEBP_INFO_OK) goto Error; webp_info_status = ProcessChunk(&chunk_data, webp_info); } if (webp_info_status != WEBP_INFO_OK) goto Error; if (webp_info->show_summary_) ShowSummary(webp_info); // Final check. webp_info_status = Validate(webp_info); Error: if (!webp_info->quiet_) { if (webp_info_status == WEBP_INFO_OK) { printf("No error detected.\n"); } else { printf("Errors detected.\n"); } if (webp_info->num_warnings_ > 0) { printf("There were %d warning(s).\n", webp_info->num_warnings_); } } return webp_info_status; } static void Help(void) { printf("Usage: webpinfo [options] in_files\n" "Note: there could be multiple input files;\n" " options must come before input files.\n" "Options:\n" " -version ........... Print version number and exit.\n" " -quiet ............. Do not show chunk parsing information.\n" " -diag .............. Show parsing error diagnosis.\n" " -summary ........... Show chunk stats summary.\n" " -bitstream_info .... Parse bitstream header.\n"); } int main(int argc, const char* argv[]) { int c, quiet = 0, show_diag = 0, show_summary = 0; int parse_bitstream = 0; WebPInfoStatus webp_info_status = WEBP_INFO_OK; WebPInfo webp_info; INIT_WARGV(argc, argv); if (argc == 1) { Help(); FREE_WARGV_AND_RETURN(WEBP_INFO_OK); } // Parse command-line input. for (c = 1; c < argc; ++c) { if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help") || !strcmp(argv[c], "-H") || !strcmp(argv[c], "-longhelp")) { Help(); FREE_WARGV_AND_RETURN(WEBP_INFO_OK); } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; } else if (!strcmp(argv[c], "-diag")) { show_diag = 1; } else if (!strcmp(argv[c], "-summary")) { show_summary = 1; } else if (!strcmp(argv[c], "-bitstream_info")) { parse_bitstream = 1; } else if (!strcmp(argv[c], "-version")) { const int version = WebPGetDecoderVersion(); printf("WebP Decoder version: %d.%d.%d\n", (version >> 16) & 0xff, (version >> 8) & 0xff, version & 0xff); FREE_WARGV_AND_RETURN(0); } else { // Assume the remaining are all input files. break; } } if (c == argc) { Help(); FREE_WARGV_AND_RETURN(WEBP_INFO_INVALID_COMMAND); } // Process input files one by one. for (; c < argc; ++c) { WebPData webp_data; const W_CHAR* in_file = NULL; WebPInfoInit(&webp_info); webp_info.quiet_ = quiet; webp_info.show_diagnosis_ = show_diag; webp_info.show_summary_ = show_summary; webp_info.parse_bitstream_ = parse_bitstream; in_file = GET_WARGV(argv, c); if (in_file == NULL || !ReadFileToWebPData((const char*)in_file, &webp_data)) { webp_info_status = WEBP_INFO_INVALID_COMMAND; WFPRINTF(stderr, "Failed to open input file %s.\n", in_file); continue; } if (!webp_info.quiet_) WPRINTF("File: %s\n", in_file); webp_info_status = AnalyzeWebP(&webp_info, &webp_data); WebPDataClear(&webp_data); } FREE_WARGV_AND_RETURN(webp_info_status); } libwebp-1.4.0/examples/gifdec.h0000644000014400001440000000764714606317060013301 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // GIF decode. #ifndef WEBP_EXAMPLES_GIFDEC_H_ #define WEBP_EXAMPLES_GIFDEC_H_ #include #include "webp/types.h" #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #ifdef WEBP_HAVE_GIF #include #endif #ifdef __cplusplus extern "C" { #endif // GIFLIB_MAJOR is only defined in libgif >= 4.2.0. #if defined(GIFLIB_MAJOR) && defined(GIFLIB_MINOR) # define LOCAL_GIF_VERSION ((GIFLIB_MAJOR << 8) | GIFLIB_MINOR) # define LOCAL_GIF_PREREQ(maj, min) \ (LOCAL_GIF_VERSION >= (((maj) << 8) | (min))) #else # define LOCAL_GIF_VERSION 0 # define LOCAL_GIF_PREREQ(maj, min) 0 #endif #define GIF_INDEX_INVALID (-1) typedef enum GIFDisposeMethod { GIF_DISPOSE_NONE, GIF_DISPOSE_BACKGROUND, GIF_DISPOSE_RESTORE_PREVIOUS } GIFDisposeMethod; typedef struct { int x_offset, y_offset, width, height; } GIFFrameRect; struct WebPData; struct WebPPicture; #ifndef WEBP_HAVE_GIF struct ColorMapObject; struct GifFileType; typedef unsigned char GifByteType; #endif // Given the index of background color and transparent color, returns the // corresponding background color (in BGRA format) in 'bgcolor'. void GIFGetBackgroundColor(const struct ColorMapObject* const color_map, int bgcolor_index, int transparent_index, uint32_t* const bgcolor); // Parses the given graphics extension data to get frame duration (in 1ms // units), dispose method and transparent color index. // Returns true on success. int GIFReadGraphicsExtension(const GifByteType* const buf, int* const duration, GIFDisposeMethod* const dispose, int* const transparent_index); // Reads the next GIF frame from 'gif' into 'picture'. Also, returns the GIF // frame dimensions and offsets in 'rect'. // Returns true on success. int GIFReadFrame(struct GifFileType* const gif, int transparent_index, GIFFrameRect* const gif_rect, struct WebPPicture* const picture); // Parses loop count from the given Netscape extension data. int GIFReadLoopCount(struct GifFileType* const gif, GifByteType** const buf, int* const loop_count); // Parses the given ICC or XMP extension data and stores it into 'metadata'. // Returns true on success. int GIFReadMetadata(struct GifFileType* const gif, GifByteType** const buf, struct WebPData* const metadata); // Dispose the pixels within 'rect' of 'curr_canvas' based on 'dispose' method // and 'prev_canvas'. void GIFDisposeFrame(GIFDisposeMethod dispose, const GIFFrameRect* const rect, const struct WebPPicture* const prev_canvas, struct WebPPicture* const curr_canvas); // Given 'src' picture and its frame rectangle 'rect', blend it into 'dst'. void GIFBlendFrames(const struct WebPPicture* const src, const GIFFrameRect* const rect, struct WebPPicture* const dst); // Prints an error string based on 'gif_error'. void GIFDisplayError(const struct GifFileType* const gif, int gif_error); // In the given 'pic', clear the pixels in 'rect' to transparent color. void GIFClearPic(struct WebPPicture* const pic, const GIFFrameRect* const rect); // Copy pixels from 'src' to 'dst' honoring strides. 'src' and 'dst' are assumed // to be already allocated. void GIFCopyPixels(const struct WebPPicture* const src, struct WebPPicture* const dst); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_EXAMPLES_GIFDEC_H_ libwebp-1.4.0/examples/anim_diff.c0000644000014400001440000002567114606317060013764 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Checks if given pair of animated GIF/WebP images are identical: // That is: their reconstructed canvases match pixel-by-pixel and their other // animation properties (loop count etc) also match. // // example: anim_diff foo.gif bar.webp #include #include #include #include // for 'strtod'. #include // for 'strcmp'. #include "./anim_util.h" #include "./example_util.h" #include "./unicode.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif // Returns true if 'a + b' will overflow. static int AdditionWillOverflow(int a, int b) { return (b > 0) && (a > INT_MAX - b); } static int FramesAreEqual(const uint8_t* const rgba1, const uint8_t* const rgba2, int width, int height) { const int stride = width * 4; // Always true for 'DecodedFrame.rgba'. return !memcmp(rgba1, rgba2, stride * height); } static WEBP_INLINE int PixelsAreSimilar(uint32_t src, uint32_t dst, int max_allowed_diff) { const int src_a = (src >> 24) & 0xff; const int src_r = (src >> 16) & 0xff; const int src_g = (src >> 8) & 0xff; const int src_b = (src >> 0) & 0xff; const int dst_a = (dst >> 24) & 0xff; const int dst_r = (dst >> 16) & 0xff; const int dst_g = (dst >> 8) & 0xff; const int dst_b = (dst >> 0) & 0xff; return (abs(src_r * src_a - dst_r * dst_a) <= (max_allowed_diff * 255)) && (abs(src_g * src_a - dst_g * dst_a) <= (max_allowed_diff * 255)) && (abs(src_b * src_a - dst_b * dst_a) <= (max_allowed_diff * 255)) && (abs(src_a - dst_a) <= max_allowed_diff); } static int FramesAreSimilar(const uint8_t* const rgba1, const uint8_t* const rgba2, int width, int height, int max_allowed_diff) { int i, j; assert(max_allowed_diff > 0); for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { const int stride = width * 4; const size_t offset = j * stride + i; if (!PixelsAreSimilar(rgba1[offset], rgba2[offset], max_allowed_diff)) { return 0; } } } return 1; } // Minimize number of frames by combining successive frames that have at max // 'max_diff' difference per channel between corresponding pixels. static void MinimizeAnimationFrames(AnimatedImage* const img, int max_diff) { uint32_t i; for (i = 1; i < img->num_frames; ++i) { DecodedFrame* const frame1 = &img->frames[i - 1]; DecodedFrame* const frame2 = &img->frames[i]; const uint8_t* const rgba1 = frame1->rgba; const uint8_t* const rgba2 = frame2->rgba; int should_merge_frames = 0; // If merging frames will result in integer overflow for 'duration', // skip merging. if (AdditionWillOverflow(frame1->duration, frame2->duration)) continue; if (max_diff > 0) { should_merge_frames = FramesAreSimilar(rgba1, rgba2, img->canvas_width, img->canvas_height, max_diff); } else { should_merge_frames = FramesAreEqual(rgba1, rgba2, img->canvas_width, img->canvas_height); } if (should_merge_frames) { // Merge 'i+1'th frame into 'i'th frame. frame1->duration += frame2->duration; if (i + 1 < img->num_frames) { memmove(&img->frames[i], &img->frames[i + 1], (img->num_frames - i - 1) * sizeof(*img->frames)); } --img->num_frames; --i; } } } static int CompareValues(uint32_t a, uint32_t b, const char* output_str) { if (a != b) { fprintf(stderr, "%s: %d vs %d\n", output_str, a, b); return 0; } return 1; } static int CompareBackgroundColor(uint32_t bg1, uint32_t bg2, int premultiply) { if (premultiply) { const int alpha1 = (bg1 >> 24) & 0xff; const int alpha2 = (bg2 >> 24) & 0xff; if (alpha1 == 0 && alpha2 == 0) return 1; } if (bg1 != bg2) { fprintf(stderr, "Background color mismatch: 0x%08x vs 0x%08x\n", bg1, bg2); return 0; } return 1; } // Note: As long as frame durations and reconstructed frames are identical, it // is OK for other aspects like offsets, dispose/blend method to vary. static int CompareAnimatedImagePair(const AnimatedImage* const img1, const AnimatedImage* const img2, int premultiply, double min_psnr) { int ok = 1; const int is_multi_frame_image = (img1->num_frames > 1); uint32_t i; ok = CompareValues(img1->canvas_width, img2->canvas_width, "Canvas width mismatch") && ok; ok = CompareValues(img1->canvas_height, img2->canvas_height, "Canvas height mismatch") && ok; ok = CompareValues(img1->num_frames, img2->num_frames, "Frame count mismatch") && ok; if (!ok) return 0; // These are fatal failures, can't proceed. if (is_multi_frame_image) { // Checks relevant for multi-frame images only. int max_loop_count_workaround = 0; // Transcodes to webp increase the gif loop count by 1 for compatibility. // When the gif has the maximum value the webp value will be off by one. if ((img1->format == ANIM_GIF && img1->loop_count == 65536 && img2->format == ANIM_WEBP && img2->loop_count == 65535) || (img1->format == ANIM_WEBP && img1->loop_count == 65535 && img2->format == ANIM_GIF && img2->loop_count == 65536)) { max_loop_count_workaround = 1; } ok = (max_loop_count_workaround || CompareValues(img1->loop_count, img2->loop_count, "Loop count mismatch")) && ok; ok = CompareBackgroundColor(img1->bgcolor, img2->bgcolor, premultiply) && ok; } for (i = 0; i < img1->num_frames; ++i) { // Pixel-by-pixel comparison. const uint8_t* const rgba1 = img1->frames[i].rgba; const uint8_t* const rgba2 = img2->frames[i].rgba; int max_diff; double psnr; if (is_multi_frame_image) { // Check relevant for multi-frame images only. const char format[] = "Frame #%d, duration mismatch"; char tmp[sizeof(format) + 8]; ok = ok && (snprintf(tmp, sizeof(tmp), format, i) >= 0); ok = ok && CompareValues(img1->frames[i].duration, img2->frames[i].duration, tmp); } GetDiffAndPSNR(rgba1, rgba2, img1->canvas_width, img1->canvas_height, premultiply, &max_diff, &psnr); if (min_psnr > 0.) { if (psnr < min_psnr) { fprintf(stderr, "Frame #%d, psnr = %.2lf (min_psnr = %f)\n", i, psnr, min_psnr); ok = 0; } } else { if (max_diff != 0) { fprintf(stderr, "Frame #%d, max pixel diff: %d\n", i, max_diff); ok = 0; } } } return ok; } static void Help(void) { printf("Usage: anim_diff [options]\n"); printf("\nOptions:\n"); printf(" -dump_frames dump decoded frames in PAM format\n"); printf(" -min_psnr ... minimum per-frame PSNR\n"); printf(" -raw_comparison ..... if this flag is not used, RGB is\n"); printf(" premultiplied before comparison\n"); printf(" -max_diff ..... maximum allowed difference per channel\n" " between corresponding pixels in subsequent\n" " frames\n"); printf(" -h .................. this help\n"); printf(" -version ............ print version number and exit\n"); } int main(int argc, const char* argv[]) { int return_code = -1; int dump_frames = 0; const char* dump_folder = NULL; double min_psnr = 0.; int got_input1 = 0; int got_input2 = 0; int premultiply = 1; int max_diff = 0; int i, c; const char* files[2] = { NULL, NULL }; AnimatedImage images[2]; INIT_WARGV(argc, argv); for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-dump_frames")) { if (c < argc - 1) { dump_frames = 1; dump_folder = (const char*)GET_WARGV(argv, ++c); } else { parse_error = 1; } } else if (!strcmp(argv[c], "-min_psnr")) { if (c < argc - 1) { min_psnr = ExUtilGetFloat(argv[++c], &parse_error); } else { parse_error = 1; } } else if (!strcmp(argv[c], "-raw_comparison")) { premultiply = 0; } else if (!strcmp(argv[c], "-max_diff")) { if (c < argc - 1) { max_diff = ExUtilGetInt(argv[++c], 0, &parse_error); } else { parse_error = 1; } } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-version")) { int dec_version, demux_version; GetAnimatedImageVersions(&dec_version, &demux_version); printf("WebP Decoder version: %d.%d.%d\nWebP Demux version: %d.%d.%d\n", (dec_version >> 16) & 0xff, (dec_version >> 8) & 0xff, (dec_version >> 0) & 0xff, (demux_version >> 16) & 0xff, (demux_version >> 8) & 0xff, (demux_version >> 0) & 0xff); FREE_WARGV_AND_RETURN(0); } else { if (!got_input1) { files[0] = (const char*)GET_WARGV(argv, c); got_input1 = 1; } else if (!got_input2) { files[1] = (const char*)GET_WARGV(argv, c); got_input2 = 1; } else { parse_error = 1; } } if (parse_error) { Help(); FREE_WARGV_AND_RETURN(-1); } } if (argc < 3) { Help(); FREE_WARGV_AND_RETURN(-1); } if (!got_input2) { Help(); FREE_WARGV_AND_RETURN(-1); } if (dump_frames) { WPRINTF("Dumping decoded frames in: %s\n", (const W_CHAR*)dump_folder); } memset(images, 0, sizeof(images)); for (i = 0; i < 2; ++i) { WPRINTF("Decoding file: %s\n", (const W_CHAR*)files[i]); if (!ReadAnimatedImage(files[i], &images[i], dump_frames, dump_folder)) { WFPRINTF(stderr, "Error decoding file: %s\n Aborting.\n", (const W_CHAR*)files[i]); return_code = -2; goto End; } else { MinimizeAnimationFrames(&images[i], max_diff); } } if (!CompareAnimatedImagePair(&images[0], &images[1], premultiply, min_psnr)) { WFPRINTF(stderr, "\nFiles %s and %s differ.\n", (const W_CHAR*)files[0], (const W_CHAR*)files[1]); return_code = -3; } else { WPRINTF("\nFiles %s and %s are identical.\n", (const W_CHAR*)files[0], (const W_CHAR*)files[1]); return_code = 0; } End: ClearAnimatedImage(&images[0]); ClearAnimatedImage(&images[1]); FREE_WARGV_AND_RETURN(return_code); } libwebp-1.4.0/examples/anim_dump.c0000644000014400001440000001053214606317060014007 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Decodes an animated WebP file and dumps the decoded frames as PNG or TIFF. // // Author: Skal (pascal.massimino@gmail.com) #include #include // for 'strcmp'. #include "./anim_util.h" #include "webp/decode.h" #include "../imageio/image_enc.h" #include "./unicode.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif static void Help(void) { printf("Usage: anim_dump [options] files...\n"); printf("\nOptions:\n"); printf(" -folder .... dump folder (default: '.')\n"); printf(" -prefix .... prefix for dumped frames " "(default: 'dump_')\n"); printf(" -tiff ............... save frames as TIFF\n"); printf(" -pam ................ save frames as PAM\n"); printf(" -h .................. this help\n"); printf(" -version ............ print version number and exit\n"); } int main(int argc, const char* argv[]) { int error = 0; const W_CHAR* dump_folder = TO_W_CHAR("."); const W_CHAR* prefix = TO_W_CHAR("dump_"); const W_CHAR* suffix = TO_W_CHAR("png"); WebPOutputFileFormat format = PNG; int c; INIT_WARGV(argc, argv); if (argc < 2) { Help(); FREE_WARGV_AND_RETURN(-1); } for (c = 1; !error && c < argc; ++c) { if (!strcmp(argv[c], "-folder")) { if (c + 1 == argc) { fprintf(stderr, "missing argument after option '%s'\n", argv[c]); error = 1; break; } dump_folder = GET_WARGV(argv, ++c); } else if (!strcmp(argv[c], "-prefix")) { if (c + 1 == argc) { fprintf(stderr, "missing argument after option '%s'\n", argv[c]); error = 1; break; } prefix = GET_WARGV(argv, ++c); } else if (!strcmp(argv[c], "-tiff")) { format = TIFF; suffix = TO_W_CHAR("tiff"); } else if (!strcmp(argv[c], "-pam")) { format = PAM; suffix = TO_W_CHAR("pam"); } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-version")) { int dec_version, demux_version; GetAnimatedImageVersions(&dec_version, &demux_version); printf("WebP Decoder version: %d.%d.%d\nWebP Demux version: %d.%d.%d\n", (dec_version >> 16) & 0xff, (dec_version >> 8) & 0xff, (dec_version >> 0) & 0xff, (demux_version >> 16) & 0xff, (demux_version >> 8) & 0xff, (demux_version >> 0) & 0xff); FREE_WARGV_AND_RETURN(0); } else { uint32_t i; AnimatedImage image; const W_CHAR* const file = GET_WARGV(argv, c); memset(&image, 0, sizeof(image)); WPRINTF("Decoding file: %s as %s/%sxxxx.%s\n", file, dump_folder, prefix, suffix); if (!ReadAnimatedImage((const char*)file, &image, 0, NULL)) { WFPRINTF(stderr, "Error decoding file: %s\n Aborting.\n", file); error = 1; break; } for (i = 0; !error && i < image.num_frames; ++i) { W_CHAR out_file[1024]; WebPDecBuffer buffer; if (!WebPInitDecBuffer(&buffer)) { fprintf(stderr, "Cannot init dec buffer\n"); error = 1; continue; } buffer.colorspace = MODE_RGBA; buffer.is_external_memory = 1; buffer.width = image.canvas_width; buffer.height = image.canvas_height; buffer.u.RGBA.rgba = image.frames[i].rgba; buffer.u.RGBA.stride = buffer.width * sizeof(uint32_t); buffer.u.RGBA.size = buffer.u.RGBA.stride * buffer.height; WSNPRINTF(out_file, sizeof(out_file), "%s/%s%.4d.%s", dump_folder, prefix, i, suffix); if (!WebPSaveImage(&buffer, format, (const char*)out_file)) { WFPRINTF(stderr, "Error while saving image '%s'\n", out_file); error = 1; } WebPFreeDecBuffer(&buffer); } ClearAnimatedImage(&image); } } FREE_WARGV_AND_RETURN(error ? 1 : 0); } libwebp-1.4.0/examples/example_util.h0000644000014400001440000000530514606317060014535 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utility functions used by the example programs. // #ifndef WEBP_EXAMPLES_EXAMPLE_UTIL_H_ #define WEBP_EXAMPLES_EXAMPLE_UTIL_H_ #include "webp/types.h" #include "webp/mux_types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // String parsing // Parses 'v' using strto(ul|l|d)(). If error is non-NULL, '*error' is set to // true on failure while on success it is left unmodified to allow chaining of // calls. An error is only printed on the first occurrence. uint32_t ExUtilGetUInt(const char* const v, int base, int* const error); int ExUtilGetInt(const char* const v, int base, int* const error); float ExUtilGetFloat(const char* const v, int* const error); // This variant of ExUtilGetInt() will parse multiple integers from a // comma-separated list. Up to 'max_output' integers are parsed. // The result is placed in the output[] array, and the number of integers // actually parsed is returned, or -1 if an error occurred. int ExUtilGetInts(const char* v, int base, int max_output, int output[]); // Reads a file named 'filename' into a WebPData structure. The content of // webp_data is overwritten. Returns false in case of error. int ExUtilReadFileToWebPData(const char* const filename, WebPData* const webp_data); //------------------------------------------------------------------------------ // Command-line arguments typedef struct { int argc_; const char** argv_; WebPData argv_data_; int own_argv_; } CommandLineArguments; // Initializes the structure from the command-line parameters. If there is // only one parameter and it does not start with a '-', then it is assumed to // be a file name. This file will be read and tokenized into command-line // arguments. The content of 'args' is overwritten. // Returns false in case of error (memory allocation failure, non // existing file, too many arguments, ...). int ExUtilInitCommandLineArguments(int argc, const char* argv[], CommandLineArguments* const args); // Deallocate all memory and reset 'args'. void ExUtilDeleteCommandLineArguments(CommandLineArguments* const args); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_EXAMPLES_EXAMPLE_UTIL_H_ libwebp-1.4.0/examples/gifdec.c0000644000014400001440000003246714606317060013272 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // GIF decode. #include "./gifdec.h" #include #ifdef WEBP_HAVE_GIF #include #include #include #include "webp/encode.h" #include "webp/mux_types.h" #define GIF_TRANSPARENT_COLOR 0x00000000u #define GIF_WHITE_COLOR 0xffffffffu #define GIF_TRANSPARENT_MASK 0x01 #define GIF_DISPOSE_MASK 0x07 #define GIF_DISPOSE_SHIFT 2 // from utils/utils.h #ifdef __cplusplus extern "C" { #endif extern void WebPCopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height); extern void WebPCopyPixels(const WebPPicture* const src, WebPPicture* const dst); #ifdef __cplusplus } #endif void GIFGetBackgroundColor(const ColorMapObject* const color_map, int bgcolor_index, int transparent_index, uint32_t* const bgcolor) { if (transparent_index != GIF_INDEX_INVALID && bgcolor_index == transparent_index) { *bgcolor = GIF_TRANSPARENT_COLOR; // Special case. } else if (color_map == NULL || color_map->Colors == NULL || bgcolor_index >= color_map->ColorCount) { *bgcolor = GIF_WHITE_COLOR; fprintf(stderr, "GIF decode warning: invalid background color index. Assuming " "white background.\n"); } else { const GifColorType color = color_map->Colors[bgcolor_index]; *bgcolor = (0xffu << 24) | (color.Red << 16) | (color.Green << 8) | (color.Blue << 0); } } int GIFReadGraphicsExtension(const GifByteType* const buf, int* const duration, GIFDisposeMethod* const dispose, int* const transparent_index) { const int flags = buf[1]; const int dispose_raw = (flags >> GIF_DISPOSE_SHIFT) & GIF_DISPOSE_MASK; const int duration_raw = buf[2] | (buf[3] << 8); // In 10 ms units. if (buf[0] != 4) return 0; *duration = duration_raw * 10; // Duration is in 1 ms units. switch (dispose_raw) { case 3: *dispose = GIF_DISPOSE_RESTORE_PREVIOUS; break; case 2: *dispose = GIF_DISPOSE_BACKGROUND; break; case 1: case 0: default: *dispose = GIF_DISPOSE_NONE; break; } *transparent_index = (flags & GIF_TRANSPARENT_MASK) ? buf[4] : GIF_INDEX_INVALID; return 1; } static int Remap(const GifFileType* const gif, const uint8_t* const src, int len, int transparent_index, uint32_t* dst) { int i; const GifColorType* colors; const ColorMapObject* const cmap = gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap; if (cmap == NULL) return 1; if (cmap->Colors == NULL || cmap->ColorCount <= 0) return 0; colors = cmap->Colors; for (i = 0; i < len; ++i) { if (src[i] == transparent_index) { dst[i] = GIF_TRANSPARENT_COLOR; } else if (src[i] < cmap->ColorCount) { const GifColorType c = colors[src[i]]; dst[i] = c.Blue | (c.Green << 8) | (c.Red << 16) | (0xffu << 24); } else { return 0; } } return 1; } int GIFReadFrame(GifFileType* const gif, int transparent_index, GIFFrameRect* const gif_rect, WebPPicture* const picture) { WebPPicture sub_image; const GifImageDesc* const image_desc = &gif->Image; uint32_t* dst = NULL; uint8_t* tmp = NULL; const GIFFrameRect rect = { image_desc->Left, image_desc->Top, image_desc->Width, image_desc->Height }; const uint64_t memory_needed = 4 * rect.width * (uint64_t)rect.height; int ok = 0; *gif_rect = rect; if (memory_needed != (size_t)memory_needed || memory_needed > (4ULL << 32)) { fprintf(stderr, "Image is too large (%d x %d).", rect.width, rect.height); return 0; } // Use a view for the sub-picture: if (!WebPPictureView(picture, rect.x_offset, rect.y_offset, rect.width, rect.height, &sub_image)) { fprintf(stderr, "Sub-image %dx%d at position %d,%d is invalid!\n", rect.width, rect.height, rect.x_offset, rect.y_offset); return 0; } dst = sub_image.argb; tmp = (uint8_t*)WebPMalloc(rect.width * sizeof(*tmp)); if (tmp == NULL) goto End; if (image_desc->Interlace) { // Interlaced image. // We need 4 passes, with the following offsets and jumps. const int interlace_offsets[] = { 0, 4, 2, 1 }; const int interlace_jumps[] = { 8, 8, 4, 2 }; int pass; for (pass = 0; pass < 4; ++pass) { const size_t stride = (size_t)sub_image.argb_stride; int y = interlace_offsets[pass]; uint32_t* row = dst + y * stride; const size_t jump = interlace_jumps[pass] * stride; for (; y < rect.height; y += interlace_jumps[pass], row += jump) { if (DGifGetLine(gif, tmp, rect.width) == GIF_ERROR) goto End; if (!Remap(gif, tmp, rect.width, transparent_index, row)) goto End; } } } else { // Non-interlaced image. int y; uint32_t* ptr = dst; for (y = 0; y < rect.height; ++y, ptr += sub_image.argb_stride) { if (DGifGetLine(gif, tmp, rect.width) == GIF_ERROR) goto End; if (!Remap(gif, tmp, rect.width, transparent_index, ptr)) goto End; } } ok = 1; End: if (!ok) picture->error_code = sub_image.error_code; WebPPictureFree(&sub_image); WebPFree(tmp); return ok; } int GIFReadLoopCount(GifFileType* const gif, GifByteType** const buf, int* const loop_count) { assert(!memcmp(*buf + 1, "NETSCAPE2.0", 11) || !memcmp(*buf + 1, "ANIMEXTS1.0", 11)); if (DGifGetExtensionNext(gif, buf) == GIF_ERROR) { return 0; } if (*buf == NULL) { return 0; // Loop count sub-block missing. } if ((*buf)[0] < 3 || (*buf)[1] != 1) { return 0; // wrong size/marker } *loop_count = (*buf)[2] | ((*buf)[3] << 8); return 1; } int GIFReadMetadata(GifFileType* const gif, GifByteType** const buf, WebPData* const metadata) { const int is_xmp = !memcmp(*buf + 1, "XMP DataXMP", 11); const int is_icc = !memcmp(*buf + 1, "ICCRGBG1012", 11); assert(is_xmp || is_icc); (void)is_icc; // silence unused warning. // Construct metadata from sub-blocks. // Usual case (including ICC profile): In each sub-block, the // first byte specifies its size in bytes (0 to 255) and the // rest of the bytes contain the data. // Special case for XMP data: In each sub-block, the first byte // is also part of the XMP payload. XMP in GIF also has a 257 // byte padding data. See the XMP specification for details. while (1) { WebPData subblock; const uint8_t* tmp; if (DGifGetExtensionNext(gif, buf) == GIF_ERROR) { return 0; } if (*buf == NULL) break; // Finished. subblock.size = is_xmp ? (*buf)[0] + 1 : (*buf)[0]; assert(subblock.size > 0); subblock.bytes = is_xmp ? *buf : *buf + 1; // Note: We store returned value in 'tmp' first, to avoid // leaking old memory in metadata->bytes on error. tmp = (uint8_t*)realloc((void*)metadata->bytes, metadata->size + subblock.size); if (tmp == NULL) { return 0; } memcpy((void*)(tmp + metadata->size), subblock.bytes, subblock.size); metadata->bytes = tmp; metadata->size += subblock.size; } if (is_xmp) { // XMP padding data is 0x01, 0xff, 0xfe ... 0x01, 0x00. const size_t xmp_pading_size = 257; if (metadata->size > xmp_pading_size) { metadata->size -= xmp_pading_size; } } return 1; } static void ClearRectangle(WebPPicture* const picture, int left, int top, int width, int height) { int i, j; const size_t stride = picture->argb_stride; uint32_t* dst = picture->argb + top * stride + left; for (j = 0; j < height; ++j, dst += stride) { for (i = 0; i < width; ++i) dst[i] = GIF_TRANSPARENT_COLOR; } } void GIFClearPic(WebPPicture* const pic, const GIFFrameRect* const rect) { if (rect != NULL) { ClearRectangle(pic, rect->x_offset, rect->y_offset, rect->width, rect->height); } else { ClearRectangle(pic, 0, 0, pic->width, pic->height); } } void GIFCopyPixels(const WebPPicture* const src, WebPPicture* const dst) { WebPCopyPixels(src, dst); } void GIFDisposeFrame(GIFDisposeMethod dispose, const GIFFrameRect* const rect, const WebPPicture* const prev_canvas, WebPPicture* const curr_canvas) { assert(rect != NULL); if (dispose == GIF_DISPOSE_BACKGROUND) { GIFClearPic(curr_canvas, rect); } else if (dispose == GIF_DISPOSE_RESTORE_PREVIOUS) { const size_t src_stride = prev_canvas->argb_stride; const uint32_t* const src = prev_canvas->argb + rect->x_offset + rect->y_offset * src_stride; const size_t dst_stride = curr_canvas->argb_stride; uint32_t* const dst = curr_canvas->argb + rect->x_offset + rect->y_offset * dst_stride; assert(prev_canvas != NULL); WebPCopyPlane((uint8_t*)src, (int)(4 * src_stride), (uint8_t*)dst, (int)(4 * dst_stride), 4 * rect->width, rect->height); } } void GIFBlendFrames(const WebPPicture* const src, const GIFFrameRect* const rect, WebPPicture* const dst) { int i, j; const size_t src_stride = src->argb_stride; const size_t dst_stride = dst->argb_stride; assert(src->width == dst->width && src->height == dst->height); for (j = rect->y_offset; j < rect->y_offset + rect->height; ++j) { for (i = rect->x_offset; i < rect->x_offset + rect->width; ++i) { const uint32_t src_pixel = src->argb[j * src_stride + i]; const int src_alpha = src_pixel >> 24; if (src_alpha != 0) { dst->argb[j * dst_stride + i] = src_pixel; } } } } void GIFDisplayError(const GifFileType* const gif, int gif_error) { // libgif 4.2.0 has retired PrintGifError() and added GifErrorString(). #if LOCAL_GIF_PREREQ(4,2) #if LOCAL_GIF_PREREQ(5,0) // Static string actually, hence the const char* cast. const char* error_str = (const char*)GifErrorString( (gif == NULL) ? gif_error : gif->Error); #else const char* error_str = (const char*)GifErrorString(); (void)gif; #endif if (error_str == NULL) error_str = "Unknown error"; fprintf(stderr, "GIFLib Error %d: %s\n", gif_error, error_str); #else (void)gif; fprintf(stderr, "GIFLib Error %d: ", gif_error); PrintGifError(); fprintf(stderr, "\n"); #endif } #else // !WEBP_HAVE_GIF static void ErrorGIFNotAvailable(void) { fprintf(stderr, "GIF support not compiled. Please install the libgif-dev " "package before building.\n"); } void GIFGetBackgroundColor(const struct ColorMapObject* const color_map, int bgcolor_index, int transparent_index, uint32_t* const bgcolor) { (void)color_map; (void)bgcolor_index; (void)transparent_index; (void)bgcolor; ErrorGIFNotAvailable(); } int GIFReadGraphicsExtension(const GifByteType* const data, int* const duration, GIFDisposeMethod* const dispose, int* const transparent_index) { (void)data; (void)duration; (void)dispose; (void)transparent_index; ErrorGIFNotAvailable(); return 0; } int GIFReadFrame(struct GifFileType* const gif, int transparent_index, GIFFrameRect* const gif_rect, struct WebPPicture* const picture) { (void)gif; (void)transparent_index; (void)gif_rect; (void)picture; ErrorGIFNotAvailable(); return 0; } int GIFReadLoopCount(struct GifFileType* const gif, GifByteType** const buf, int* const loop_count) { (void)gif; (void)buf; (void)loop_count; ErrorGIFNotAvailable(); return 0; } int GIFReadMetadata(struct GifFileType* const gif, GifByteType** const buf, struct WebPData* const metadata) { (void)gif; (void)buf; (void)metadata; ErrorGIFNotAvailable(); return 0; } void GIFDisposeFrame(GIFDisposeMethod dispose, const GIFFrameRect* const rect, const struct WebPPicture* const prev_canvas, struct WebPPicture* const curr_canvas) { (void)dispose; (void)rect; (void)prev_canvas; (void)curr_canvas; ErrorGIFNotAvailable(); } void GIFBlendFrames(const struct WebPPicture* const src, const GIFFrameRect* const rect, struct WebPPicture* const dst) { (void)src; (void)rect; (void)dst; ErrorGIFNotAvailable(); } void GIFDisplayError(const struct GifFileType* const gif, int gif_error) { (void)gif; (void)gif_error; ErrorGIFNotAvailable(); } void GIFClearPic(struct WebPPicture* const pic, const GIFFrameRect* const rect) { (void)pic; (void)rect; ErrorGIFNotAvailable(); } void GIFCopyPixels(const struct WebPPicture* const src, struct WebPPicture* const dst) { (void)src; (void)dst; ErrorGIFNotAvailable(); } #endif // WEBP_HAVE_GIF // ----------------------------------------------------------------------------- libwebp-1.4.0/examples/test.webp0000644000014400001440000001142014606317060013525 0ustar RIFFWEBPVP8 üÐ>*€€……ˆ…„ˆ‚ÁÓ/'Ug*Ngñ7ÿÝŒý¾9ýúŸçSn ü+ó/Á×­}ÏõsÉ_YZ…ü³íçê?¼þãüeþ¼ÿ’:‚ûý_оÃm£ýoüïP^ðÅÿâÛþç ß[¿ç{€ÿ2þaþÛÕOó~uÿKìýûgýoóߘß$Ÿñ™üÞöïôÏþOó_ÿ«?òÿ¼{^ÿÿ÷=û…ì±úÇÿ‡ÞüÖáÌ·Å"ó$úÑ—w/­ÿ2 Šn<•BWª}7Òãßæ’¢$B˜ …áÒÔEIþK‡¹¯§åa‹šl¹6Ï•ò&/„V/M:žÈ'çî½×½•í–7È>™´æ1ØhŽÜŸm®•xœøŠ˜š0ÎK=»ø†qF YAbÖ‡uäŽ×"[ËÈ1‰Ðª¿2¾+²!‘Ou¢þ†f"$cnËÚ.½Ñ½y s‘/"UºJž?.\«6…löÿ-ŽÂ0º©”çÿFt“úD0aC˜Ìæ `â9ÜmÌNn!믂&—¶sßwfäëD›hpË2Í1a ÿÿ,µ«uZÀ§(×ψ'”Å õ¼„ˆpN4o°LBj]î~Pù¶Ê:MX¿uß=ÕëC¥í¥÷f¸s=æ{!Øô]pz»¹ þÿþõt|Ÿÿ’ùçý^i£ÿɼ/î,i ¤pO~ñ¿>¬Üè#4@íFuñs¡ÁÄð? ¥TýTôÛÓ(äQ9:Xivo‚üÒµ‘Tž â;ô%ÄÇ¡ü®-ÿ°NË,€v'LŸôV#?eâö«êvoÖó ØYmÞIóiUº…;€·Ý}-·Fb0–{€572…¸F0ïJMˆ6uùp¦b£uap‹k}9,•ŸÊØŠ[êSÆŸÂ9ãœð¥Òe‹ugÑ/^­¶fO+XW<·ˆaøµNf¿Ößûè–v{þa“—ùD/¿î,»žéM!Y`uL  Ù"Á‘ª”•5×âj[è*Ý\ر¸§ô>8Q­¿µÿzé=4t͈Šî—uå ·Ðú2{=¼/wï ÑWéÅÓ*\G©u1ÿÁµ[cè%½Mï–Ïr6?þüD5}ÌbƒôÓóÃ*Üþs;•Ú[={¹ÿ¦eqÓVÿñ PåÚZûý¹X–â²åªÒŸAxzUÀh¦.ürç ×òú¢þ¯FæOÖQM4î êÀ'üWŒXÐ-Ì«ôjj²²ê¶½ã؂ꗊm€0Jz‹îUegßIDw€5&ôÒSÄìèüÈïÛo”oÿž˜y\‘òm¢ÝþìéÊEƒ-B±~^,Êã.u‡ˆÞšÛ÷_³WJÙð[¿†$Þ_ø€¡Â“ÁĹC6k â_À~»#Ô’ ˆ°9C4e v¨•\]µÿVù¦³t?ÓŸñ5àˆ¦Ñ ¯)9reÈÈúj^–JÉÉhMD‰¤%XqoËzxcBÏŒB°t¨2,í£ÈòiÑF¶@Q!)JœI±"†híwg÷,¥¤µè¹À’w­¬SSªßVØXÒ@Ë‘ïË7æŽ;h}ÇMäÙýô CX9È}™qïó¬ñÑ\G}„ãà1±tñnM„¡/éÙç¬Ó%m(³.uAÊ%f>ÚaÙ  !AÁmž*š˜òÜgvÛ/-ür¹zQBÜ4{Hâ:épcéé‡õT:øÏ)ƒÂÍém.ôoìZ’¹æÐ61à qCr)›sÖøs;Æþû1“M¿oo( ðZC6EfÆ«ùO– ^|Õô{iø‘Àì¹§`s ¢`ý*œ­4q ¢øYˆ:àæô?殄°â=Ø Wõ 念Úo*e q&{})%îZÓ‡¢»ÄAD?fÚ@‰‘¢<ñ=ùf8T0ÅDö,ð»N ¨Æcç†FˆÜu ]ï¢ru«ÊtMKžã%ó:«–—B…~ÅFPðGYƒùNklÂ}à¥*œØùI’[xD„gT™ºÛø¹O1º\Â&h æVbh¦^=GÚ™˜“> •d,C ø Ï×°üDñôÏ}Fï®xleŠ‚JñBõFEV’¢–¸ÜÂŒWÄ®ÈZôßæ€tœ0eÎ.è§ò±åûíKvµëò%ì‡zqæâ\KKr°h¦ŽOÏ^îl‡›"ÄÜè"&>³h§j›Œ­À‡ŒHÕ‘áF“ÞNü+B5Ï_TÁ‘ãžÆl+Y¤³kJ8–`×ò kŒPFŒö«qï|[µýøU«›è9ÁÔp^êbÿ¼›A¶³û]š1oª1ú‘ëçþ뼿Š–7!–yL¤zŸ6¬Ïɘϒsü>Î[8”MÒv°Ä\,—·I·E¸GRÌ¡ùøìþA?TUøgEö×ð4:yQROMôÌ[“¿ öPÔ<j]ÖÜ·Wa×`1Pý­ÍÁÇèLdW¸ FˆÀTº¯°¬y¡—(ôsÔ¦IŒÉ@©˜[‘÷1÷–wó˜/a_]‹q £ÎÇWG|yó›©*Wwî— û ™Øˆ‹Yy¯üTñ°‰¢Ùÿ™æ±”Šz+úwœ×î×7É "¨3× ^­Z–%xepÍ}NƒOmnõÁm߈¾B~´ð˜S!u÷ú˜XÅÃç\Õî‡3Û80oÿiüÝ?Áª«½eòû®-,ÍRÈPükV8€ã]¨ÖÍ“{&6™Ã¹t«tŽ«‰"³G…1´;JPZøÂÞ*/f š^7®ú϶¯¥Ù¨Ç o·a—&»ó2ŽÐVïœ$®‡Tà£ô-#Òÿn…f¶ÙìßL'$yY;š+eìÿ¨<¾Öp†zî]€muÍkÔù»GäDz$9aŸ.ß‘62a}ó¯Qü‚E_¦9˜>S2äO›»f¯ìaÜ!ËÚT¼èOÑÿUøE©:Æ"´QØF^~}‰<5eµÝäŸæÌéO^Û>ôAìŠó_¦–yŸþéF/<×î¹¾ƒÄÊ.¾ÊŠB¸ÍV'öâZ8u©á'„âYÁ„OK{:X!GÌèÃ%SÂ[uËrwXþódËhs0`šÈê»g´&Á´4d±WŽyÀšL]—=\H4ä$^Çxð^T#:›4¡¶ú‘aÀSôWÆz#WŽÓ´[c¾d3þQDNâ×düU¯(‘Šª‡ü/’mÊvÞdQ(z¿Å³~Ùq Í¼5öÓŸ‚ô—§ÉÅëçWà‚”ço"Ï;àØ5Ê`ã;-ïz±Ôv Êiª»Í˜h½çHÃÔÇO-›ÀN7övæ{ûnûll¿A'ì0· ŸH3ÞÀŒ7$ªüìŠ s¾§ý1ú|õ ?©œŠ#ïù-LÚ9]°&“ÓuÕvÝ)®R€´TSz[` «7Ò–Äw9Ž8ü²°4ýaqtçQW×å±L8%À ¸j%±h“]Ò¬EY®e$z˜sg“¹ûíTÓË¿!]•⺠ló‹|ÑRðKÓ›Ýh§ÊcrÏ3ñÈ«TM—À5”²óß›t¸‰ðpÌËÏ},æ: kë(xW·NTï•°òÇϱà0«N9ûІkàßä¿k¤ÖžXA7ÜçÐ*ä‘㕞‰p3cŸVq)´Îc( ûQ…ºÖeO‚<ÔçAnÀ1Ý2h]°(gx'Ó ‰qæÏšþÓ‘ðÃk.¤ù™+¥‚Ì}"UCf7þ1Eäʽ°Q2 Õ,Å€_Ü®¶YÙà5ôœžWކ?‡ ¸$Auü|u~°1Ž ÏöM¸ê™Ø·ÿ庖£ÿ”1.ÐÒeIÖáã²až Äµ)±š›¨'@Ó„7­ÑÖ»¤ÅwOSŸ 4>©x`Ëè”ÐÉfñ‰=.‘¿"s z›‡hÇ«ífl¼C?_;^»¢ðî º TÝC{ÔÊIr_æûö ¬H)±XÔÀ:IR¢"o7ŽP §bP!&399)LìÉ…dРõž%¤Dó[ϾàBÄ1`E4´*ã› 3zBÄÈöYZfúGÖ˜üúŒ¦Jµž)§WÛZõþ—OÊ_Öv¡ÑŽG部B«´Ó¢Cf™<ìy DHǹŒØ¿>²¼€ìXÆí€ÄÇ›‰ø>¾d1†NÀ‘FCg£·@g€_`€7¹M@1âÎ0ê’ëíCÛg¾RŸ”³ú±>1UGˆü™m®+PͲÎî`¯Öä†0iËr)š¼¥3GºÀŒ*`½Ç‘j̨jõà €ãP˜¬™SZ$èÉ®›ãeÆBg|ñx—øR¨ò@_Ÿv"ºì„¹b(^eP;Ú;ÐåÖtî6µLž¬’çïj|ŽÐ4"<ÕZ¸+ªF|BýyT€2ÙéÀ$z&6@Fðž†Ëž$´~îI昰s3Ç"qZ[:ÎùÓ«NnŸ2À»V<1ÁÙ÷iF#»hÁ„±¿Û²ýäU-©0ý z$}Á!ˆG %Ž¥ïFîÔ¥¿7¢tC*áÊ Tþ´<©ÔžÂ_0 ÓÌKÆQ&_|/´öA³`§qôë<ºH óű²Œ>Yüo Äo>&CslÞ)?¶ZϹ­T¾ªÕ´²ïGÎÅÈØê†FæË>:jáö84G"‡@ÐÁ.´† Z–+ËtÖ,fí⢬^„^¶¢;örk~ÊŒY—ä<‘ û¢…ý ÑåF#¡´v‘Ã]YÚHê’ž¨šHÊ=%†ÏJ„s,P©KHŸœl2¾8N ËÔp±Ñ˜¡®É+q3UyH“*”¶TĨmÌó}ä¾=jnuª(Š<b|¹BÍèþ'§^†¹F¦¬F ì ý*#Ú‡0±£ÔV_ü‚²? C 7‘' Dhî»i’€tè4ïZº³ÃçÞélibwebp-1.4.0/examples/gif2webp.c0000644000014400001440000005012014606317060013540 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // simple tool to convert animated GIFs to WebP // // Authors: Skal (pascal.massimino@gmail.com) // Urvang (urvang@google.com) #include #include #include #include #ifdef HAVE_CONFIG_H #include "webp/config.h" #endif #ifdef WEBP_HAVE_GIF #if defined(HAVE_UNISTD_H) && HAVE_UNISTD_H #include #endif #include #include "webp/encode.h" #include "webp/mux.h" #include "../examples/example_util.h" #include "../imageio/imageio_util.h" #include "./gifdec.h" #include "./unicode.h" #include "./unicode_gif.h" #if !defined(STDIN_FILENO) #define STDIN_FILENO 0 #endif //------------------------------------------------------------------------------ static int transparent_index = GIF_INDEX_INVALID; // Opaque by default. static const char* const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = { "WEBP_MUX_NOT_FOUND", "WEBP_MUX_INVALID_ARGUMENT", "WEBP_MUX_BAD_DATA", "WEBP_MUX_MEMORY_ERROR", "WEBP_MUX_NOT_ENOUGH_DATA" }; static const char* ErrorString(WebPMuxError err) { assert(err <= WEBP_MUX_NOT_FOUND && err >= WEBP_MUX_NOT_ENOUGH_DATA); return kErrorMessages[-err]; } enum { METADATA_ICC = (1 << 0), METADATA_XMP = (1 << 1), METADATA_ALL = METADATA_ICC | METADATA_XMP }; //------------------------------------------------------------------------------ static void Help(void) { printf("Usage:\n"); printf(" gif2webp [options] gif_file -o webp_file\n"); printf("Options:\n"); printf(" -h / -help ............. this help\n"); printf(" -lossy ................. encode image using lossy compression\n"); printf(" -mixed ................. for each frame in the image, pick lossy\n" " or lossless compression heuristically\n"); printf(" -q ............. quality factor (0:small..100:big)\n"); printf(" -m ............... compression method (0=fast, 6=slowest)\n"); printf(" -min_size .............. minimize output size (default:off)\n" " lossless compression by default; can be\n" " combined with -q, -m, -lossy or -mixed\n" " options\n"); printf(" -kmin ............ min distance between key frames\n"); printf(" -kmax ............ max distance between key frames\n"); printf(" -f ............... filter strength (0=off..100)\n"); printf(" -metadata ..... comma separated list of metadata to\n"); printf(" "); printf("copy from the input to the output if present\n"); printf(" "); printf("Valid values: all, none, icc, xmp (default)\n"); printf(" -loop_compatibility .... use compatibility mode for Chrome\n"); printf(" version prior to M62 (inclusive)\n"); printf(" -mt .................... use multi-threading if available\n"); printf("\n"); printf(" -version ............... print version number and exit\n"); printf(" -v ..................... verbose\n"); printf(" -quiet ................. don't print anything\n"); printf("\n"); } //------------------------------------------------------------------------------ int main(int argc, const char* argv[]) { int verbose = 0; int gif_error = GIF_ERROR; WebPMuxError err = WEBP_MUX_OK; int ok = 0; const W_CHAR* in_file = NULL, *out_file = NULL; GifFileType* gif = NULL; int frame_duration = 0; int frame_timestamp = 0; GIFDisposeMethod orig_dispose = GIF_DISPOSE_NONE; WebPPicture frame; // Frame rectangle only (not disposed). WebPPicture curr_canvas; // Not disposed. WebPPicture prev_canvas; // Disposed. WebPAnimEncoder* enc = NULL; WebPAnimEncoderOptions enc_options; WebPConfig config; int frame_number = 0; // Whether we are processing the first frame. int done; int c; int quiet = 0; WebPData webp_data; int keep_metadata = METADATA_XMP; // ICC not output by default. WebPData icc_data; int stored_icc = 0; // Whether we have already stored an ICC profile. WebPData xmp_data; int stored_xmp = 0; // Whether we have already stored an XMP profile. int loop_count = 0; // default: infinite int stored_loop_count = 0; // Whether we have found an explicit loop count. int loop_compatibility = 0; WebPMux* mux = NULL; int default_kmin = 1; // Whether to use default kmin value. int default_kmax = 1; INIT_WARGV(argc, argv); if (!WebPConfigInit(&config) || !WebPAnimEncoderOptionsInit(&enc_options) || !WebPPictureInit(&frame) || !WebPPictureInit(&curr_canvas) || !WebPPictureInit(&prev_canvas)) { fprintf(stderr, "Error! Version mismatch!\n"); FREE_WARGV_AND_RETURN(-1); } config.lossless = 1; // Use lossless compression by default. WebPDataInit(&webp_data); WebPDataInit(&icc_data); WebPDataInit(&xmp_data); if (argc == 1) { Help(); FREE_WARGV_AND_RETURN(0); } for (c = 1; c < argc; ++c) { int parse_error = 0; if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { Help(); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-o") && c < argc - 1) { out_file = GET_WARGV(argv, ++c); } else if (!strcmp(argv[c], "-lossy")) { config.lossless = 0; } else if (!strcmp(argv[c], "-mixed")) { enc_options.allow_mixed = 1; config.lossless = 0; } else if (!strcmp(argv[c], "-loop_compatibility")) { loop_compatibility = 1; } else if (!strcmp(argv[c], "-q") && c < argc - 1) { config.quality = ExUtilGetFloat(argv[++c], &parse_error); } else if (!strcmp(argv[c], "-m") && c < argc - 1) { config.method = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-min_size")) { enc_options.minimize_size = 1; } else if (!strcmp(argv[c], "-kmax") && c < argc - 1) { enc_options.kmax = ExUtilGetInt(argv[++c], 0, &parse_error); default_kmax = 0; } else if (!strcmp(argv[c], "-kmin") && c < argc - 1) { enc_options.kmin = ExUtilGetInt(argv[++c], 0, &parse_error); default_kmin = 0; } else if (!strcmp(argv[c], "-f") && c < argc - 1) { config.filter_strength = ExUtilGetInt(argv[++c], 0, &parse_error); } else if (!strcmp(argv[c], "-metadata") && c < argc - 1) { static const struct { const char* option; int flag; } kTokens[] = { { "all", METADATA_ALL }, { "none", 0 }, { "icc", METADATA_ICC }, { "xmp", METADATA_XMP }, }; const size_t kNumTokens = sizeof(kTokens) / sizeof(*kTokens); const char* start = argv[++c]; const char* const end = start + strlen(start); keep_metadata = 0; while (start < end) { size_t i; const char* token = strchr(start, ','); if (token == NULL) token = end; for (i = 0; i < kNumTokens; ++i) { if ((size_t)(token - start) == strlen(kTokens[i].option) && !strncmp(start, kTokens[i].option, strlen(kTokens[i].option))) { if (kTokens[i].flag != 0) { keep_metadata |= kTokens[i].flag; } else { keep_metadata = 0; } break; } } if (i == kNumTokens) { fprintf(stderr, "Error! Unknown metadata type '%.*s'\n", (int)(token - start), start); Help(); FREE_WARGV_AND_RETURN(-1); } start = token + 1; } } else if (!strcmp(argv[c], "-mt")) { ++config.thread_level; } else if (!strcmp(argv[c], "-version")) { const int enc_version = WebPGetEncoderVersion(); const int mux_version = WebPGetMuxVersion(); printf("WebP Encoder version: %d.%d.%d\nWebP Mux version: %d.%d.%d\n", (enc_version >> 16) & 0xff, (enc_version >> 8) & 0xff, enc_version & 0xff, (mux_version >> 16) & 0xff, (mux_version >> 8) & 0xff, mux_version & 0xff); FREE_WARGV_AND_RETURN(0); } else if (!strcmp(argv[c], "-quiet")) { quiet = 1; enc_options.verbose = 0; } else if (!strcmp(argv[c], "-v")) { verbose = 1; enc_options.verbose = 1; } else if (!strcmp(argv[c], "--")) { if (c < argc - 1) in_file = GET_WARGV(argv, ++c); break; } else if (argv[c][0] == '-') { fprintf(stderr, "Error! Unknown option '%s'\n", argv[c]); Help(); FREE_WARGV_AND_RETURN(-1); } else { in_file = GET_WARGV(argv, c); } if (parse_error) { Help(); FREE_WARGV_AND_RETURN(-1); } } // Appropriate default kmin, kmax values for lossy and lossless. if (default_kmin) { enc_options.kmin = config.lossless ? 9 : 3; } if (default_kmax) { enc_options.kmax = config.lossless ? 17 : 5; } if (!WebPValidateConfig(&config)) { fprintf(stderr, "Error! Invalid configuration.\n"); goto End; } if (in_file == NULL) { fprintf(stderr, "No input file specified!\n"); Help(); goto End; } // Start the decoder object gif = DGifOpenFileUnicode(in_file, &gif_error); if (gif == NULL) goto End; // Loop over GIF images done = 0; do { GifRecordType type; if (DGifGetRecordType(gif, &type) == GIF_ERROR) goto End; switch (type) { case IMAGE_DESC_RECORD_TYPE: { GIFFrameRect gif_rect; GifImageDesc* const image_desc = &gif->Image; if (!DGifGetImageDesc(gif)) goto End; if (frame_number == 0) { if (verbose) { printf("Canvas screen: %d x %d\n", gif->SWidth, gif->SHeight); } // Fix some broken GIF global headers that report // 0 x 0 screen dimension. if (gif->SWidth == 0 || gif->SHeight == 0) { image_desc->Left = 0; image_desc->Top = 0; gif->SWidth = image_desc->Width; gif->SHeight = image_desc->Height; if (gif->SWidth <= 0 || gif->SHeight <= 0) { goto End; } if (verbose) { printf("Fixed canvas screen dimension to: %d x %d\n", gif->SWidth, gif->SHeight); } } // Allocate current buffer. frame.width = gif->SWidth; frame.height = gif->SHeight; frame.use_argb = 1; if (!WebPPictureAlloc(&frame)) goto End; GIFClearPic(&frame, NULL); if (!(WebPPictureCopy(&frame, &curr_canvas) && WebPPictureCopy(&frame, &prev_canvas))) { fprintf(stderr, "Error allocating canvas.\n"); goto End; } // Background color. GIFGetBackgroundColor(gif->SColorMap, gif->SBackGroundColor, transparent_index, &enc_options.anim_params.bgcolor); // Initialize encoder. enc = WebPAnimEncoderNew(curr_canvas.width, curr_canvas.height, &enc_options); if (enc == NULL) { fprintf(stderr, "Error! Could not create encoder object. Possibly due to " "a memory error.\n"); goto End; } } // Some even more broken GIF can have sub-rect with zero width/height. if (image_desc->Width == 0 || image_desc->Height == 0) { image_desc->Width = gif->SWidth; image_desc->Height = gif->SHeight; } if (!GIFReadFrame(gif, transparent_index, &gif_rect, &frame)) { goto End; } // Blend frame rectangle with previous canvas to compose full canvas. // Note that 'curr_canvas' is same as 'prev_canvas' at this point. GIFBlendFrames(&frame, &gif_rect, &curr_canvas); if (!WebPAnimEncoderAdd(enc, &curr_canvas, frame_timestamp, &config)) { fprintf(stderr, "Error while adding frame #%d: %s\n", frame_number, WebPAnimEncoderGetError(enc)); goto End; } else { ++frame_number; } // Update canvases. GIFDisposeFrame(orig_dispose, &gif_rect, &prev_canvas, &curr_canvas); GIFCopyPixels(&curr_canvas, &prev_canvas); // Force frames with a small or no duration to 100ms to be consistent // with web browsers and other transcoding tools. This also avoids // incorrect durations between frames when padding frames are // discarded. if (frame_duration <= 10) { frame_duration = 100; } // Update timestamp (for next frame). frame_timestamp += frame_duration; // In GIF, graphic control extensions are optional for a frame, so we // may not get one before reading the next frame. To handle this case, // we reset frame properties to reasonable defaults for the next frame. orig_dispose = GIF_DISPOSE_NONE; frame_duration = 0; transparent_index = GIF_INDEX_INVALID; break; } case EXTENSION_RECORD_TYPE: { int extension; GifByteType* data = NULL; if (DGifGetExtension(gif, &extension, &data) == GIF_ERROR) { goto End; } if (data == NULL) continue; switch (extension) { case COMMENT_EXT_FUNC_CODE: { break; // Do nothing for now. } case GRAPHICS_EXT_FUNC_CODE: { if (!GIFReadGraphicsExtension(data, &frame_duration, &orig_dispose, &transparent_index)) { goto End; } break; } case PLAINTEXT_EXT_FUNC_CODE: { break; } case APPLICATION_EXT_FUNC_CODE: { if (data[0] != 11) break; // Chunk is too short if (!memcmp(data + 1, "NETSCAPE2.0", 11) || !memcmp(data + 1, "ANIMEXTS1.0", 11)) { if (!GIFReadLoopCount(gif, &data, &loop_count)) { goto End; } if (verbose) { fprintf(stderr, "Loop count: %d\n", loop_count); } stored_loop_count = loop_compatibility ? (loop_count != 0) : 1; } else { // An extension containing metadata. // We only store the first encountered chunk of each type, and // only if requested by the user. const int is_xmp = (keep_metadata & METADATA_XMP) && !stored_xmp && !memcmp(data + 1, "XMP DataXMP", 11); const int is_icc = (keep_metadata & METADATA_ICC) && !stored_icc && !memcmp(data + 1, "ICCRGBG1012", 11); if (is_xmp || is_icc) { if (!GIFReadMetadata(gif, &data, is_xmp ? &xmp_data : &icc_data)) { goto End; } if (is_icc) { stored_icc = 1; } else if (is_xmp) { stored_xmp = 1; } } } break; } default: { break; // skip } } while (data != NULL) { if (DGifGetExtensionNext(gif, &data) == GIF_ERROR) goto End; } break; } case TERMINATE_RECORD_TYPE: { done = 1; break; } default: { if (verbose) { fprintf(stderr, "Skipping over unknown record type %d\n", type); } break; } } } while (!done); // Last NULL frame. if (!WebPAnimEncoderAdd(enc, NULL, frame_timestamp, NULL)) { fprintf(stderr, "Error flushing WebP muxer.\n"); fprintf(stderr, "%s\n", WebPAnimEncoderGetError(enc)); } if (!WebPAnimEncoderAssemble(enc, &webp_data)) { fprintf(stderr, "%s\n", WebPAnimEncoderGetError(enc)); goto End; } // If there's only one frame, we don't need to handle loop count. if (frame_number == 1) { loop_count = 0; } else if (!loop_compatibility) { if (!stored_loop_count) { // if no loop-count element is seen, the default is '1' (loop-once) // and we need to signal it explicitly in WebP. Note however that // in case there's a single frame, we still don't need to store it. if (frame_number > 1) { stored_loop_count = 1; loop_count = 1; } } else if (loop_count > 0 && loop_count < 65535) { // adapt GIF's semantic to WebP's (except in the infinite-loop case) loop_count += 1; } } // loop_count of 0 is the default (infinite), so no need to signal it if (loop_count == 0) stored_loop_count = 0; if (stored_loop_count || stored_icc || stored_xmp) { // Re-mux to add loop count and/or metadata as needed. mux = WebPMuxCreate(&webp_data, 1); if (mux == NULL) { fprintf(stderr, "ERROR: Could not re-mux to add loop count/metadata.\n"); goto End; } WebPDataClear(&webp_data); if (stored_loop_count) { // Update loop count. WebPMuxAnimParams new_params; err = WebPMuxGetAnimationParams(mux, &new_params); if (err != WEBP_MUX_OK) { fprintf(stderr, "ERROR (%s): Could not fetch loop count.\n", ErrorString(err)); goto End; } new_params.loop_count = loop_count; err = WebPMuxSetAnimationParams(mux, &new_params); if (err != WEBP_MUX_OK) { fprintf(stderr, "ERROR (%s): Could not update loop count.\n", ErrorString(err)); goto End; } } if (stored_icc) { // Add ICCP chunk. err = WebPMuxSetChunk(mux, "ICCP", &icc_data, 1); if (verbose) { fprintf(stderr, "ICC size: %d\n", (int)icc_data.size); } if (err != WEBP_MUX_OK) { fprintf(stderr, "ERROR (%s): Could not set ICC chunk.\n", ErrorString(err)); goto End; } } if (stored_xmp) { // Add XMP chunk. err = WebPMuxSetChunk(mux, "XMP ", &xmp_data, 1); if (verbose) { fprintf(stderr, "XMP size: %d\n", (int)xmp_data.size); } if (err != WEBP_MUX_OK) { fprintf(stderr, "ERROR (%s): Could not set XMP chunk.\n", ErrorString(err)); goto End; } } err = WebPMuxAssemble(mux, &webp_data); if (err != WEBP_MUX_OK) { fprintf(stderr, "ERROR (%s): Could not assemble when re-muxing to add " "loop count/metadata.\n", ErrorString(err)); goto End; } } if (out_file != NULL) { if (!ImgIoUtilWriteFile((const char*)out_file, webp_data.bytes, webp_data.size)) { WFPRINTF(stderr, "Error writing output file: %s\n", out_file); goto End; } if (!quiet) { if (!WSTRCMP(out_file, "-")) { fprintf(stderr, "Saved %d bytes to STDIO\n", (int)webp_data.size); } else { WFPRINTF(stderr, "Saved output file (%d bytes): %s\n", (int)webp_data.size, out_file); } } } else { if (!quiet) { fprintf(stderr, "Nothing written; use -o flag to save the result " "(%d bytes).\n", (int)webp_data.size); } } // All OK. ok = 1; gif_error = GIF_OK; End: WebPDataClear(&icc_data); WebPDataClear(&xmp_data); WebPMuxDelete(mux); WebPDataClear(&webp_data); WebPPictureFree(&frame); WebPPictureFree(&curr_canvas); WebPPictureFree(&prev_canvas); WebPAnimEncoderDelete(enc); if (gif_error != GIF_OK) { GIFDisplayError(gif, gif_error); } if (gif != NULL) { #if LOCAL_GIF_PREREQ(5,1) DGifCloseFile(gif, &gif_error); #else DGifCloseFile(gif); #endif } FREE_WARGV_AND_RETURN(!ok); } #else // !WEBP_HAVE_GIF int main(int argc, const char* argv[]) { fprintf(stderr, "GIF support not enabled in %s.\n", argv[0]); (void)argc; return 0; } #endif //------------------------------------------------------------------------------ libwebp-1.4.0/examples/Makefile.in0000644000014400001440000016024314606317243013747 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) @BUILD_DEMUX_TRUE@am__append_1 = dwebp cwebp @BUILD_ANIMDIFF_TRUE@noinst_PROGRAMS = anim_diff$(EXEEXT) \ @BUILD_ANIMDIFF_TRUE@ anim_dump$(EXEEXT) @BUILD_GIF2WEBP_TRUE@am__append_2 = gif2webp @BUILD_IMG2WEBP_TRUE@am__append_3 = img2webp @BUILD_MUX_TRUE@am__append_4 = webpmux @BUILD_VWEBP_TRUE@am__append_5 = vwebp @BUILD_WEBPINFO_TRUE@am__append_6 = webpinfo @BUILD_LIBWEBPDECODER_TRUE@am__append_7 = ../src/libwebpdecoder.la @BUILD_LIBWEBPDECODER_TRUE@am__append_8 = ../src/libwebpdecoder.la @BUILD_LIBWEBPDECODER_TRUE@am__append_9 = ../src/libwebpdecoder.la @BUILD_LIBWEBPDECODER_FALSE@am__append_10 = ../src/libwebp.la @BUILD_LIBWEBPDECODER_FALSE@am__append_11 = ../src/libwebp.la @BUILD_LIBWEBPDECODER_FALSE@am__append_12 = ../src/libwebp.la subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @BUILD_DEMUX_TRUE@am__EXEEXT_1 = dwebp$(EXEEXT) cwebp$(EXEEXT) @BUILD_GIF2WEBP_TRUE@am__EXEEXT_2 = gif2webp$(EXEEXT) @BUILD_IMG2WEBP_TRUE@am__EXEEXT_3 = img2webp$(EXEEXT) @BUILD_MUX_TRUE@am__EXEEXT_4 = webpmux$(EXEEXT) @BUILD_VWEBP_TRUE@am__EXEEXT_5 = vwebp$(EXEEXT) @BUILD_WEBPINFO_TRUE@am__EXEEXT_6 = webpinfo$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) libexample_util_la_DEPENDENCIES = ../src/libwebp.la am_libexample_util_la_OBJECTS = example_util.lo libexample_util_la_OBJECTS = $(am_libexample_util_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_anim_diff_OBJECTS = anim_diff-anim_diff.$(OBJEXT) \ anim_diff-anim_util.$(OBJEXT) anim_diff-gifdec.$(OBJEXT) anim_diff_OBJECTS = $(am_anim_diff_OBJECTS) am__DEPENDENCIES_1 = anim_diff_DEPENDENCIES = ../src/demux/libwebpdemux.la \ libexample_util.la ../imageio/libimageio_util.la \ $(am__DEPENDENCIES_1) $(am__append_7) $(am__append_10) am_anim_dump_OBJECTS = anim_dump-anim_dump.$(OBJEXT) \ anim_dump-anim_util.$(OBJEXT) anim_dump-gifdec.$(OBJEXT) anim_dump_OBJECTS = $(am_anim_dump_OBJECTS) anim_dump_DEPENDENCIES = ../src/demux/libwebpdemux.la \ libexample_util.la ../imageio/libimageio_util.la \ ../imageio/libimageenc.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_8) \ $(am__append_11) am_cwebp_OBJECTS = cwebp-cwebp.$(OBJEXT) cwebp_OBJECTS = $(am_cwebp_OBJECTS) cwebp_DEPENDENCIES = libexample_util.la ../imageio/libimageio_util.la \ ../imageio/libimagedec.la ../src/libwebp.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_dwebp_OBJECTS = dwebp-dwebp.$(OBJEXT) dwebp_OBJECTS = $(am_dwebp_OBJECTS) dwebp_DEPENDENCIES = libexample_util.la ../imageio/libimagedec.la \ ../imageio/libimageenc.la ../imageio/libimageio_util.la \ ../src/libwebp.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_gif2webp_OBJECTS = gif2webp-gif2webp.$(OBJEXT) \ gif2webp-gifdec.$(OBJEXT) gif2webp_OBJECTS = $(am_gif2webp_OBJECTS) gif2webp_DEPENDENCIES = libexample_util.la \ ../imageio/libimageio_util.la ../src/mux/libwebpmux.la \ ../src/libwebp.la $(am__DEPENDENCIES_1) am_img2webp_OBJECTS = img2webp-img2webp.$(OBJEXT) img2webp_OBJECTS = $(am_img2webp_OBJECTS) img2webp_DEPENDENCIES = libexample_util.la \ ../imageio/libimageio_util.la ../imageio/libimagedec.la \ ../src/mux/libwebpmux.la ../src/libwebp.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_vwebp_OBJECTS = vwebp-vwebp.$(OBJEXT) vwebp_OBJECTS = $(am_vwebp_OBJECTS) vwebp_DEPENDENCIES = libexample_util.la ../imageio/libimageio_util.la \ ../src/demux/libwebpdemux.la $(am__DEPENDENCIES_1) \ $(am__append_9) $(am__append_12) am_webpinfo_OBJECTS = webpinfo-webpinfo.$(OBJEXT) webpinfo_OBJECTS = $(am_webpinfo_OBJECTS) webpinfo_DEPENDENCIES = libexample_util.la \ ../imageio/libimageio_util.la ../src/libwebp.la am_webpmux_OBJECTS = webpmux-webpmux.$(OBJEXT) webpmux_OBJECTS = $(am_webpmux_OBJECTS) webpmux_DEPENDENCIES = libexample_util.la \ ../imageio/libimageio_util.la ../src/mux/libwebpmux.la \ ../src/libwebp.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/anim_diff-anim_diff.Po \ ./$(DEPDIR)/anim_diff-anim_util.Po \ ./$(DEPDIR)/anim_diff-gifdec.Po \ ./$(DEPDIR)/anim_dump-anim_dump.Po \ ./$(DEPDIR)/anim_dump-anim_util.Po \ ./$(DEPDIR)/anim_dump-gifdec.Po ./$(DEPDIR)/cwebp-cwebp.Po \ ./$(DEPDIR)/dwebp-dwebp.Po ./$(DEPDIR)/example_util.Plo \ ./$(DEPDIR)/gif2webp-gif2webp.Po \ ./$(DEPDIR)/gif2webp-gifdec.Po \ ./$(DEPDIR)/img2webp-img2webp.Po ./$(DEPDIR)/vwebp-vwebp.Po \ ./$(DEPDIR)/webpinfo-webpinfo.Po \ ./$(DEPDIR)/webpmux-webpmux.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libexample_util_la_SOURCES) $(anim_diff_SOURCES) \ $(anim_dump_SOURCES) $(cwebp_SOURCES) $(dwebp_SOURCES) \ $(gif2webp_SOURCES) $(img2webp_SOURCES) $(vwebp_SOURCES) \ $(webpinfo_SOURCES) $(webpmux_SOURCES) DIST_SOURCES = $(libexample_util_la_SOURCES) $(anim_diff_SOURCES) \ $(anim_dump_SOURCES) $(cwebp_SOURCES) $(dwebp_SOURCES) \ $(gif2webp_SOURCES) $(img2webp_SOURCES) $(vwebp_SOURCES) \ $(webpinfo_SOURCES) $(webpmux_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir)/src -I$(top_srcdir)/src AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libexample_util.la libexample_util_la_SOURCES = example_util.c example_util.h libexample_util_la_LIBADD = ../src/libwebp.la anim_diff_SOURCES = anim_diff.c anim_util.c anim_util.h gifdec.c gifdec.h anim_diff_CPPFLAGS = $(AM_CPPFLAGS) $(GIF_INCLUDES) anim_diff_LDADD = ../src/demux/libwebpdemux.la libexample_util.la \ ../imageio/libimageio_util.la $(GIF_LIBS) -lm $(am__append_7) \ $(am__append_10) anim_dump_SOURCES = anim_dump.c anim_util.c anim_util.h gifdec.c gifdec.h anim_dump_CPPFLAGS = $(AM_CPPFLAGS) $(PNG_INCLUDES) $(GIF_INCLUDES) anim_dump_LDADD = ../src/demux/libwebpdemux.la libexample_util.la \ ../imageio/libimageio_util.la ../imageio/libimageenc.la \ $(PNG_LIBS) $(GIF_LIBS) $(TIFF_LIBS) -lm $(am__append_8) \ $(am__append_11) cwebp_SOURCES = cwebp.c stopwatch.h cwebp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir) cwebp_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../imageio/libimagedec.la ../src/libwebp.la $(JPEG_LIBS) \ $(PNG_LIBS) $(TIFF_LIBS) dwebp_SOURCES = dwebp.c stopwatch.h dwebp_CPPFLAGS = $(AM_CPPFLAGS) $(JPEG_INCLUDES) $(PNG_INCLUDES) dwebp_LDADD = libexample_util.la ../imageio/libimagedec.la \ ../imageio/libimageenc.la ../imageio/libimageio_util.la \ ../src/libwebp.la $(PNG_LIBS) $(JPEG_LIBS) gif2webp_SOURCES = gif2webp.c gifdec.c gifdec.h gif2webp_CPPFLAGS = $(AM_CPPFLAGS) $(GIF_INCLUDES) gif2webp_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../src/mux/libwebpmux.la ../src/libwebp.la $(GIF_LIBS) vwebp_SOURCES = vwebp.c vwebp_CPPFLAGS = $(AM_CPPFLAGS) $(GL_INCLUDES) vwebp_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../src/demux/libwebpdemux.la $(GL_LIBS) $(am__append_9) \ $(am__append_12) webpmux_SOURCES = webpmux.c webpmux_CPPFLAGS = $(AM_CPPFLAGS) webpmux_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../src/mux/libwebpmux.la ../src/libwebp.la img2webp_SOURCES = img2webp.c img2webp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir) img2webp_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../imageio/libimagedec.la ../src/mux/libwebpmux.la \ ../src/libwebp.la $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) webpinfo_SOURCES = webpinfo.c webpinfo_CPPFLAGS = $(AM_CPPFLAGS) webpinfo_LDADD = libexample_util.la ../imageio/libimageio_util.la \ ../src/libwebp.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libexample_util.la: $(libexample_util_la_OBJECTS) $(libexample_util_la_DEPENDENCIES) $(EXTRA_libexample_util_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libexample_util_la_OBJECTS) $(libexample_util_la_LIBADD) $(LIBS) anim_diff$(EXEEXT): $(anim_diff_OBJECTS) $(anim_diff_DEPENDENCIES) $(EXTRA_anim_diff_DEPENDENCIES) @rm -f anim_diff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(anim_diff_OBJECTS) $(anim_diff_LDADD) $(LIBS) anim_dump$(EXEEXT): $(anim_dump_OBJECTS) $(anim_dump_DEPENDENCIES) $(EXTRA_anim_dump_DEPENDENCIES) @rm -f anim_dump$(EXEEXT) $(AM_V_CCLD)$(LINK) $(anim_dump_OBJECTS) $(anim_dump_LDADD) $(LIBS) cwebp$(EXEEXT): $(cwebp_OBJECTS) $(cwebp_DEPENDENCIES) $(EXTRA_cwebp_DEPENDENCIES) @rm -f cwebp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cwebp_OBJECTS) $(cwebp_LDADD) $(LIBS) dwebp$(EXEEXT): $(dwebp_OBJECTS) $(dwebp_DEPENDENCIES) $(EXTRA_dwebp_DEPENDENCIES) @rm -f dwebp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dwebp_OBJECTS) $(dwebp_LDADD) $(LIBS) gif2webp$(EXEEXT): $(gif2webp_OBJECTS) $(gif2webp_DEPENDENCIES) $(EXTRA_gif2webp_DEPENDENCIES) @rm -f gif2webp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gif2webp_OBJECTS) $(gif2webp_LDADD) $(LIBS) img2webp$(EXEEXT): $(img2webp_OBJECTS) $(img2webp_DEPENDENCIES) $(EXTRA_img2webp_DEPENDENCIES) @rm -f img2webp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(img2webp_OBJECTS) $(img2webp_LDADD) $(LIBS) vwebp$(EXEEXT): $(vwebp_OBJECTS) $(vwebp_DEPENDENCIES) $(EXTRA_vwebp_DEPENDENCIES) @rm -f vwebp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(vwebp_OBJECTS) $(vwebp_LDADD) $(LIBS) webpinfo$(EXEEXT): $(webpinfo_OBJECTS) $(webpinfo_DEPENDENCIES) $(EXTRA_webpinfo_DEPENDENCIES) @rm -f webpinfo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(webpinfo_OBJECTS) $(webpinfo_LDADD) $(LIBS) webpmux$(EXEEXT): $(webpmux_OBJECTS) $(webpmux_DEPENDENCIES) $(EXTRA_webpmux_DEPENDENCIES) @rm -f webpmux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(webpmux_OBJECTS) $(webpmux_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_diff-anim_diff.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_diff-anim_util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_diff-gifdec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_dump-anim_dump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_dump-anim_util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_dump-gifdec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwebp-cwebp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwebp-dwebp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gif2webp-gif2webp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gif2webp-gifdec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/img2webp-img2webp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vwebp-vwebp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webpinfo-webpinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/webpmux-webpmux.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< anim_diff-anim_diff.o: anim_diff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-anim_diff.o -MD -MP -MF $(DEPDIR)/anim_diff-anim_diff.Tpo -c -o anim_diff-anim_diff.o `test -f 'anim_diff.c' || echo '$(srcdir)/'`anim_diff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-anim_diff.Tpo $(DEPDIR)/anim_diff-anim_diff.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_diff.c' object='anim_diff-anim_diff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-anim_diff.o `test -f 'anim_diff.c' || echo '$(srcdir)/'`anim_diff.c anim_diff-anim_diff.obj: anim_diff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-anim_diff.obj -MD -MP -MF $(DEPDIR)/anim_diff-anim_diff.Tpo -c -o anim_diff-anim_diff.obj `if test -f 'anim_diff.c'; then $(CYGPATH_W) 'anim_diff.c'; else $(CYGPATH_W) '$(srcdir)/anim_diff.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-anim_diff.Tpo $(DEPDIR)/anim_diff-anim_diff.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_diff.c' object='anim_diff-anim_diff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-anim_diff.obj `if test -f 'anim_diff.c'; then $(CYGPATH_W) 'anim_diff.c'; else $(CYGPATH_W) '$(srcdir)/anim_diff.c'; fi` anim_diff-anim_util.o: anim_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-anim_util.o -MD -MP -MF $(DEPDIR)/anim_diff-anim_util.Tpo -c -o anim_diff-anim_util.o `test -f 'anim_util.c' || echo '$(srcdir)/'`anim_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-anim_util.Tpo $(DEPDIR)/anim_diff-anim_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_util.c' object='anim_diff-anim_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-anim_util.o `test -f 'anim_util.c' || echo '$(srcdir)/'`anim_util.c anim_diff-anim_util.obj: anim_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-anim_util.obj -MD -MP -MF $(DEPDIR)/anim_diff-anim_util.Tpo -c -o anim_diff-anim_util.obj `if test -f 'anim_util.c'; then $(CYGPATH_W) 'anim_util.c'; else $(CYGPATH_W) '$(srcdir)/anim_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-anim_util.Tpo $(DEPDIR)/anim_diff-anim_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_util.c' object='anim_diff-anim_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-anim_util.obj `if test -f 'anim_util.c'; then $(CYGPATH_W) 'anim_util.c'; else $(CYGPATH_W) '$(srcdir)/anim_util.c'; fi` anim_diff-gifdec.o: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-gifdec.o -MD -MP -MF $(DEPDIR)/anim_diff-gifdec.Tpo -c -o anim_diff-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-gifdec.Tpo $(DEPDIR)/anim_diff-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='anim_diff-gifdec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c anim_diff-gifdec.obj: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_diff-gifdec.obj -MD -MP -MF $(DEPDIR)/anim_diff-gifdec.Tpo -c -o anim_diff-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_diff-gifdec.Tpo $(DEPDIR)/anim_diff-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='anim_diff-gifdec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_diff_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_diff-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` anim_dump-anim_dump.o: anim_dump.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-anim_dump.o -MD -MP -MF $(DEPDIR)/anim_dump-anim_dump.Tpo -c -o anim_dump-anim_dump.o `test -f 'anim_dump.c' || echo '$(srcdir)/'`anim_dump.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-anim_dump.Tpo $(DEPDIR)/anim_dump-anim_dump.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_dump.c' object='anim_dump-anim_dump.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-anim_dump.o `test -f 'anim_dump.c' || echo '$(srcdir)/'`anim_dump.c anim_dump-anim_dump.obj: anim_dump.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-anim_dump.obj -MD -MP -MF $(DEPDIR)/anim_dump-anim_dump.Tpo -c -o anim_dump-anim_dump.obj `if test -f 'anim_dump.c'; then $(CYGPATH_W) 'anim_dump.c'; else $(CYGPATH_W) '$(srcdir)/anim_dump.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-anim_dump.Tpo $(DEPDIR)/anim_dump-anim_dump.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_dump.c' object='anim_dump-anim_dump.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-anim_dump.obj `if test -f 'anim_dump.c'; then $(CYGPATH_W) 'anim_dump.c'; else $(CYGPATH_W) '$(srcdir)/anim_dump.c'; fi` anim_dump-anim_util.o: anim_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-anim_util.o -MD -MP -MF $(DEPDIR)/anim_dump-anim_util.Tpo -c -o anim_dump-anim_util.o `test -f 'anim_util.c' || echo '$(srcdir)/'`anim_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-anim_util.Tpo $(DEPDIR)/anim_dump-anim_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_util.c' object='anim_dump-anim_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-anim_util.o `test -f 'anim_util.c' || echo '$(srcdir)/'`anim_util.c anim_dump-anim_util.obj: anim_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-anim_util.obj -MD -MP -MF $(DEPDIR)/anim_dump-anim_util.Tpo -c -o anim_dump-anim_util.obj `if test -f 'anim_util.c'; then $(CYGPATH_W) 'anim_util.c'; else $(CYGPATH_W) '$(srcdir)/anim_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-anim_util.Tpo $(DEPDIR)/anim_dump-anim_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='anim_util.c' object='anim_dump-anim_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-anim_util.obj `if test -f 'anim_util.c'; then $(CYGPATH_W) 'anim_util.c'; else $(CYGPATH_W) '$(srcdir)/anim_util.c'; fi` anim_dump-gifdec.o: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-gifdec.o -MD -MP -MF $(DEPDIR)/anim_dump-gifdec.Tpo -c -o anim_dump-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-gifdec.Tpo $(DEPDIR)/anim_dump-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='anim_dump-gifdec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c anim_dump-gifdec.obj: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT anim_dump-gifdec.obj -MD -MP -MF $(DEPDIR)/anim_dump-gifdec.Tpo -c -o anim_dump-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/anim_dump-gifdec.Tpo $(DEPDIR)/anim_dump-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='anim_dump-gifdec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(anim_dump_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o anim_dump-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` cwebp-cwebp.o: cwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cwebp-cwebp.o -MD -MP -MF $(DEPDIR)/cwebp-cwebp.Tpo -c -o cwebp-cwebp.o `test -f 'cwebp.c' || echo '$(srcdir)/'`cwebp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cwebp-cwebp.Tpo $(DEPDIR)/cwebp-cwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cwebp.c' object='cwebp-cwebp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cwebp-cwebp.o `test -f 'cwebp.c' || echo '$(srcdir)/'`cwebp.c cwebp-cwebp.obj: cwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cwebp-cwebp.obj -MD -MP -MF $(DEPDIR)/cwebp-cwebp.Tpo -c -o cwebp-cwebp.obj `if test -f 'cwebp.c'; then $(CYGPATH_W) 'cwebp.c'; else $(CYGPATH_W) '$(srcdir)/cwebp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cwebp-cwebp.Tpo $(DEPDIR)/cwebp-cwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cwebp.c' object='cwebp-cwebp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cwebp-cwebp.obj `if test -f 'cwebp.c'; then $(CYGPATH_W) 'cwebp.c'; else $(CYGPATH_W) '$(srcdir)/cwebp.c'; fi` dwebp-dwebp.o: dwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dwebp-dwebp.o -MD -MP -MF $(DEPDIR)/dwebp-dwebp.Tpo -c -o dwebp-dwebp.o `test -f 'dwebp.c' || echo '$(srcdir)/'`dwebp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dwebp-dwebp.Tpo $(DEPDIR)/dwebp-dwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dwebp.c' object='dwebp-dwebp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dwebp-dwebp.o `test -f 'dwebp.c' || echo '$(srcdir)/'`dwebp.c dwebp-dwebp.obj: dwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dwebp-dwebp.obj -MD -MP -MF $(DEPDIR)/dwebp-dwebp.Tpo -c -o dwebp-dwebp.obj `if test -f 'dwebp.c'; then $(CYGPATH_W) 'dwebp.c'; else $(CYGPATH_W) '$(srcdir)/dwebp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dwebp-dwebp.Tpo $(DEPDIR)/dwebp-dwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dwebp.c' object='dwebp-dwebp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dwebp-dwebp.obj `if test -f 'dwebp.c'; then $(CYGPATH_W) 'dwebp.c'; else $(CYGPATH_W) '$(srcdir)/dwebp.c'; fi` gif2webp-gif2webp.o: gif2webp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gif2webp-gif2webp.o -MD -MP -MF $(DEPDIR)/gif2webp-gif2webp.Tpo -c -o gif2webp-gif2webp.o `test -f 'gif2webp.c' || echo '$(srcdir)/'`gif2webp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gif2webp-gif2webp.Tpo $(DEPDIR)/gif2webp-gif2webp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gif2webp.c' object='gif2webp-gif2webp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gif2webp-gif2webp.o `test -f 'gif2webp.c' || echo '$(srcdir)/'`gif2webp.c gif2webp-gif2webp.obj: gif2webp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gif2webp-gif2webp.obj -MD -MP -MF $(DEPDIR)/gif2webp-gif2webp.Tpo -c -o gif2webp-gif2webp.obj `if test -f 'gif2webp.c'; then $(CYGPATH_W) 'gif2webp.c'; else $(CYGPATH_W) '$(srcdir)/gif2webp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gif2webp-gif2webp.Tpo $(DEPDIR)/gif2webp-gif2webp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gif2webp.c' object='gif2webp-gif2webp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gif2webp-gif2webp.obj `if test -f 'gif2webp.c'; then $(CYGPATH_W) 'gif2webp.c'; else $(CYGPATH_W) '$(srcdir)/gif2webp.c'; fi` gif2webp-gifdec.o: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gif2webp-gifdec.o -MD -MP -MF $(DEPDIR)/gif2webp-gifdec.Tpo -c -o gif2webp-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gif2webp-gifdec.Tpo $(DEPDIR)/gif2webp-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='gif2webp-gifdec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gif2webp-gifdec.o `test -f 'gifdec.c' || echo '$(srcdir)/'`gifdec.c gif2webp-gifdec.obj: gifdec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gif2webp-gifdec.obj -MD -MP -MF $(DEPDIR)/gif2webp-gifdec.Tpo -c -o gif2webp-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gif2webp-gifdec.Tpo $(DEPDIR)/gif2webp-gifdec.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gifdec.c' object='gif2webp-gifdec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gif2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gif2webp-gifdec.obj `if test -f 'gifdec.c'; then $(CYGPATH_W) 'gifdec.c'; else $(CYGPATH_W) '$(srcdir)/gifdec.c'; fi` img2webp-img2webp.o: img2webp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT img2webp-img2webp.o -MD -MP -MF $(DEPDIR)/img2webp-img2webp.Tpo -c -o img2webp-img2webp.o `test -f 'img2webp.c' || echo '$(srcdir)/'`img2webp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2webp-img2webp.Tpo $(DEPDIR)/img2webp-img2webp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='img2webp.c' object='img2webp-img2webp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o img2webp-img2webp.o `test -f 'img2webp.c' || echo '$(srcdir)/'`img2webp.c img2webp-img2webp.obj: img2webp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT img2webp-img2webp.obj -MD -MP -MF $(DEPDIR)/img2webp-img2webp.Tpo -c -o img2webp-img2webp.obj `if test -f 'img2webp.c'; then $(CYGPATH_W) 'img2webp.c'; else $(CYGPATH_W) '$(srcdir)/img2webp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/img2webp-img2webp.Tpo $(DEPDIR)/img2webp-img2webp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='img2webp.c' object='img2webp-img2webp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(img2webp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o img2webp-img2webp.obj `if test -f 'img2webp.c'; then $(CYGPATH_W) 'img2webp.c'; else $(CYGPATH_W) '$(srcdir)/img2webp.c'; fi` vwebp-vwebp.o: vwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp-vwebp.o -MD -MP -MF $(DEPDIR)/vwebp-vwebp.Tpo -c -o vwebp-vwebp.o `test -f 'vwebp.c' || echo '$(srcdir)/'`vwebp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp-vwebp.Tpo $(DEPDIR)/vwebp-vwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vwebp.c' object='vwebp-vwebp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp-vwebp.o `test -f 'vwebp.c' || echo '$(srcdir)/'`vwebp.c vwebp-vwebp.obj: vwebp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vwebp-vwebp.obj -MD -MP -MF $(DEPDIR)/vwebp-vwebp.Tpo -c -o vwebp-vwebp.obj `if test -f 'vwebp.c'; then $(CYGPATH_W) 'vwebp.c'; else $(CYGPATH_W) '$(srcdir)/vwebp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/vwebp-vwebp.Tpo $(DEPDIR)/vwebp-vwebp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vwebp.c' object='vwebp-vwebp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(vwebp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vwebp-vwebp.obj `if test -f 'vwebp.c'; then $(CYGPATH_W) 'vwebp.c'; else $(CYGPATH_W) '$(srcdir)/vwebp.c'; fi` webpinfo-webpinfo.o: webpinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webpinfo-webpinfo.o -MD -MP -MF $(DEPDIR)/webpinfo-webpinfo.Tpo -c -o webpinfo-webpinfo.o `test -f 'webpinfo.c' || echo '$(srcdir)/'`webpinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webpinfo-webpinfo.Tpo $(DEPDIR)/webpinfo-webpinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webpinfo.c' object='webpinfo-webpinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webpinfo-webpinfo.o `test -f 'webpinfo.c' || echo '$(srcdir)/'`webpinfo.c webpinfo-webpinfo.obj: webpinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webpinfo-webpinfo.obj -MD -MP -MF $(DEPDIR)/webpinfo-webpinfo.Tpo -c -o webpinfo-webpinfo.obj `if test -f 'webpinfo.c'; then $(CYGPATH_W) 'webpinfo.c'; else $(CYGPATH_W) '$(srcdir)/webpinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webpinfo-webpinfo.Tpo $(DEPDIR)/webpinfo-webpinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webpinfo.c' object='webpinfo-webpinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webpinfo-webpinfo.obj `if test -f 'webpinfo.c'; then $(CYGPATH_W) 'webpinfo.c'; else $(CYGPATH_W) '$(srcdir)/webpinfo.c'; fi` webpmux-webpmux.o: webpmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpmux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webpmux-webpmux.o -MD -MP -MF $(DEPDIR)/webpmux-webpmux.Tpo -c -o webpmux-webpmux.o `test -f 'webpmux.c' || echo '$(srcdir)/'`webpmux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webpmux-webpmux.Tpo $(DEPDIR)/webpmux-webpmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webpmux.c' object='webpmux-webpmux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpmux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webpmux-webpmux.o `test -f 'webpmux.c' || echo '$(srcdir)/'`webpmux.c webpmux-webpmux.obj: webpmux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpmux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT webpmux-webpmux.obj -MD -MP -MF $(DEPDIR)/webpmux-webpmux.Tpo -c -o webpmux-webpmux.obj `if test -f 'webpmux.c'; then $(CYGPATH_W) 'webpmux.c'; else $(CYGPATH_W) '$(srcdir)/webpmux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/webpmux-webpmux.Tpo $(DEPDIR)/webpmux-webpmux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webpmux.c' object='webpmux-webpmux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(webpmux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o webpmux-webpmux.obj `if test -f 'webpmux.c'; then $(CYGPATH_W) 'webpmux.c'; else $(CYGPATH_W) '$(srcdir)/webpmux.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/anim_diff-anim_diff.Po -rm -f ./$(DEPDIR)/anim_diff-anim_util.Po -rm -f ./$(DEPDIR)/anim_diff-gifdec.Po -rm -f ./$(DEPDIR)/anim_dump-anim_dump.Po -rm -f ./$(DEPDIR)/anim_dump-anim_util.Po -rm -f ./$(DEPDIR)/anim_dump-gifdec.Po -rm -f ./$(DEPDIR)/cwebp-cwebp.Po -rm -f ./$(DEPDIR)/dwebp-dwebp.Po -rm -f ./$(DEPDIR)/example_util.Plo -rm -f ./$(DEPDIR)/gif2webp-gif2webp.Po -rm -f ./$(DEPDIR)/gif2webp-gifdec.Po -rm -f ./$(DEPDIR)/img2webp-img2webp.Po -rm -f ./$(DEPDIR)/vwebp-vwebp.Po -rm -f ./$(DEPDIR)/webpinfo-webpinfo.Po -rm -f ./$(DEPDIR)/webpmux-webpmux.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/anim_diff-anim_diff.Po -rm -f ./$(DEPDIR)/anim_diff-anim_util.Po -rm -f ./$(DEPDIR)/anim_diff-gifdec.Po -rm -f ./$(DEPDIR)/anim_dump-anim_dump.Po -rm -f ./$(DEPDIR)/anim_dump-anim_util.Po -rm -f ./$(DEPDIR)/anim_dump-gifdec.Po -rm -f ./$(DEPDIR)/cwebp-cwebp.Po -rm -f ./$(DEPDIR)/dwebp-dwebp.Po -rm -f ./$(DEPDIR)/example_util.Plo -rm -f ./$(DEPDIR)/gif2webp-gif2webp.Po -rm -f ./$(DEPDIR)/gif2webp-gifdec.Po -rm -f ./$(DEPDIR)/img2webp-img2webp.Po -rm -f ./$(DEPDIR)/vwebp-vwebp.Po -rm -f ./$(DEPDIR)/webpinfo-webpinfo.Po -rm -f ./$(DEPDIR)/webpmux-webpmux.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/examples/stopwatch.h0000644000014400001440000000346614606317060014067 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Helper functions to measure elapsed time. // // Author: Mikolaj Zalewski (mikolajz@google.com) #ifndef WEBP_EXAMPLES_STOPWATCH_H_ #define WEBP_EXAMPLES_STOPWATCH_H_ #include "webp/types.h" #if defined _WIN32 && !defined __GNUC__ #include typedef LARGE_INTEGER Stopwatch; static WEBP_INLINE void StopwatchReset(Stopwatch* watch) { QueryPerformanceCounter(watch); } static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) { const LARGE_INTEGER old_value = *watch; LARGE_INTEGER freq; if (!QueryPerformanceCounter(watch)) return 0.0; if (!QueryPerformanceFrequency(&freq)) return 0.0; if (freq.QuadPart == 0) return 0.0; return (watch->QuadPart - old_value.QuadPart) / (double)freq.QuadPart; } #else /* !_WIN32 */ #include // memcpy #include typedef struct timeval Stopwatch; static WEBP_INLINE void StopwatchReset(Stopwatch* watch) { gettimeofday(watch, NULL); } static WEBP_INLINE double StopwatchReadAndReset(Stopwatch* watch) { struct timeval old_value; double delta_sec, delta_usec; memcpy(&old_value, watch, sizeof(old_value)); gettimeofday(watch, NULL); delta_sec = (double)watch->tv_sec - old_value.tv_sec; delta_usec = (double)watch->tv_usec - old_value.tv_usec; return delta_sec + delta_usec / 1000000.0; } #endif /* _WIN32 */ #endif // WEBP_EXAMPLES_STOPWATCH_H_ libwebp-1.4.0/aclocal.m40000644000014400001440000012670314606317242011726 0ustar # generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, [m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) AC_LANG_POP([C])]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_pthread.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) libwebp-1.4.0/src/0000755000014400001440000000000014606317244010646 5ustar libwebp-1.4.0/src/dsp/0000755000014400001440000000000014606317244011434 5ustar libwebp-1.4.0/src/dsp/upsampling_sse41.c0000644000014400001440000003142114606317060014773 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE41 version of YUV to RGB upsampling functions. // // Author: somnath@google.com (Somnath Banerjee) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include #include #include #include "src/dsp/yuv.h" #ifdef FANCY_UPSAMPLING #if !defined(WEBP_REDUCE_CSP) // We compute (9*a + 3*b + 3*c + d + 8) / 16 as follows // u = (9*a + 3*b + 3*c + d + 8) / 16 // = (a + (a + 3*b + 3*c + d) / 8 + 1) / 2 // = (a + m + 1) / 2 // where m = (a + 3*b + 3*c + d) / 8 // = ((a + b + c + d) / 2 + b + c) / 4 // // Let's say k = (a + b + c + d) / 4. // We can compute k as // k = (s + t + 1) / 2 - ((a^d) | (b^c) | (s^t)) & 1 // where s = (a + d + 1) / 2 and t = (b + c + 1) / 2 // // Then m can be written as // m = (k + t + 1) / 2 - (((b^c) & (s^t)) | (k^t)) & 1 // Computes out = (k + in + 1) / 2 - ((ij & (s^t)) | (k^in)) & 1 #define GET_M(ij, in, out) do { \ const __m128i tmp0 = _mm_avg_epu8(k, (in)); /* (k + in + 1) / 2 */ \ const __m128i tmp1 = _mm_and_si128((ij), st); /* (ij) & (s^t) */ \ const __m128i tmp2 = _mm_xor_si128(k, (in)); /* (k^in) */ \ const __m128i tmp3 = _mm_or_si128(tmp1, tmp2); /* ((ij) & (s^t)) | (k^in) */\ const __m128i tmp4 = _mm_and_si128(tmp3, one); /* & 1 -> lsb_correction */ \ (out) = _mm_sub_epi8(tmp0, tmp4); /* (k + in + 1) / 2 - lsb_correction */ \ } while (0) // pack and store two alternating pixel rows #define PACK_AND_STORE(a, b, da, db, out) do { \ const __m128i t_a = _mm_avg_epu8(a, da); /* (9a + 3b + 3c + d + 8) / 16 */ \ const __m128i t_b = _mm_avg_epu8(b, db); /* (3a + 9b + c + 3d + 8) / 16 */ \ const __m128i t_1 = _mm_unpacklo_epi8(t_a, t_b); \ const __m128i t_2 = _mm_unpackhi_epi8(t_a, t_b); \ _mm_store_si128(((__m128i*)(out)) + 0, t_1); \ _mm_store_si128(((__m128i*)(out)) + 1, t_2); \ } while (0) // Loads 17 pixels each from rows r1 and r2 and generates 32 pixels. #define UPSAMPLE_32PIXELS(r1, r2, out) do { \ const __m128i one = _mm_set1_epi8(1); \ const __m128i a = _mm_loadu_si128((const __m128i*)&(r1)[0]); \ const __m128i b = _mm_loadu_si128((const __m128i*)&(r1)[1]); \ const __m128i c = _mm_loadu_si128((const __m128i*)&(r2)[0]); \ const __m128i d = _mm_loadu_si128((const __m128i*)&(r2)[1]); \ \ const __m128i s = _mm_avg_epu8(a, d); /* s = (a + d + 1) / 2 */ \ const __m128i t = _mm_avg_epu8(b, c); /* t = (b + c + 1) / 2 */ \ const __m128i st = _mm_xor_si128(s, t); /* st = s^t */ \ \ const __m128i ad = _mm_xor_si128(a, d); /* ad = a^d */ \ const __m128i bc = _mm_xor_si128(b, c); /* bc = b^c */ \ \ const __m128i t1 = _mm_or_si128(ad, bc); /* (a^d) | (b^c) */ \ const __m128i t2 = _mm_or_si128(t1, st); /* (a^d) | (b^c) | (s^t) */ \ const __m128i t3 = _mm_and_si128(t2, one); /* (a^d) | (b^c) | (s^t) & 1 */ \ const __m128i t4 = _mm_avg_epu8(s, t); \ const __m128i k = _mm_sub_epi8(t4, t3); /* k = (a + b + c + d) / 4 */ \ __m128i diag1, diag2; \ \ GET_M(bc, t, diag1); /* diag1 = (a + 3b + 3c + d) / 8 */ \ GET_M(ad, s, diag2); /* diag2 = (3a + b + c + 3d) / 8 */ \ \ /* pack the alternate pixels */ \ PACK_AND_STORE(a, b, diag1, diag2, (out) + 0); /* store top */ \ PACK_AND_STORE(c, d, diag2, diag1, (out) + 2 * 32); /* store bottom */ \ } while (0) // Turn the macro into a function for reducing code-size when non-critical static void Upsample32Pixels_SSE41(const uint8_t r1[], const uint8_t r2[], uint8_t* const out) { UPSAMPLE_32PIXELS(r1, r2, out); } #define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) { \ uint8_t r1[17], r2[17]; \ memcpy(r1, (tb), (num_pixels)); \ memcpy(r2, (bb), (num_pixels)); \ /* replicate last byte */ \ memset(r1 + (num_pixels), r1[(num_pixels) - 1], 17 - (num_pixels)); \ memset(r2 + (num_pixels), r2[(num_pixels) - 1], 17 - (num_pixels)); \ /* using the shared function instead of the macro saves ~3k code size */ \ Upsample32Pixels_SSE41(r1, r2, out); \ } #define CONVERT2RGB_32(FUNC, XSTEP, top_y, bottom_y, \ top_dst, bottom_dst, cur_x) do { \ FUNC##32_SSE41((top_y) + (cur_x), r_u, r_v, (top_dst) + (cur_x) * (XSTEP)); \ if ((bottom_y) != NULL) { \ FUNC##32_SSE41((bottom_y) + (cur_x), r_u + 64, r_v + 64, \ (bottom_dst) + (cur_x) * (XSTEP)); \ } \ } while (0) #define SSE4_UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ int uv_pos, pos; \ /* 16byte-aligned array to cache reconstructed u and v */ \ uint8_t uv_buf[14 * 32 + 15] = { 0 }; \ uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \ uint8_t* const r_v = r_u + 32; \ \ assert(top_y != NULL); \ { /* Treat the first pixel in regular way */ \ const int u_diag = ((top_u[0] + cur_u[0]) >> 1) + 1; \ const int v_diag = ((top_v[0] + cur_v[0]) >> 1) + 1; \ const int u0_t = (top_u[0] + u_diag) >> 1; \ const int v0_t = (top_v[0] + v_diag) >> 1; \ FUNC(top_y[0], u0_t, v0_t, top_dst); \ if (bottom_y != NULL) { \ const int u0_b = (cur_u[0] + u_diag) >> 1; \ const int v0_b = (cur_v[0] + v_diag) >> 1; \ FUNC(bottom_y[0], u0_b, v0_b, bottom_dst); \ } \ } \ /* For UPSAMPLE_32PIXELS, 17 u/v values must be read-able for each block */ \ for (pos = 1, uv_pos = 0; pos + 32 + 1 <= len; pos += 32, uv_pos += 16) { \ UPSAMPLE_32PIXELS(top_u + uv_pos, cur_u + uv_pos, r_u); \ UPSAMPLE_32PIXELS(top_v + uv_pos, cur_v + uv_pos, r_v); \ CONVERT2RGB_32(FUNC, XSTEP, top_y, bottom_y, top_dst, bottom_dst, pos); \ } \ if (len > 1) { \ const int left_over = ((len + 1) >> 1) - (pos >> 1); \ uint8_t* const tmp_top_dst = r_u + 4 * 32; \ uint8_t* const tmp_bottom_dst = tmp_top_dst + 4 * 32; \ uint8_t* const tmp_top = tmp_bottom_dst + 4 * 32; \ uint8_t* const tmp_bottom = (bottom_y == NULL) ? NULL : tmp_top + 32; \ assert(left_over > 0); \ UPSAMPLE_LAST_BLOCK(top_u + uv_pos, cur_u + uv_pos, left_over, r_u); \ UPSAMPLE_LAST_BLOCK(top_v + uv_pos, cur_v + uv_pos, left_over, r_v); \ memcpy(tmp_top, top_y + pos, len - pos); \ if (bottom_y != NULL) memcpy(tmp_bottom, bottom_y + pos, len - pos); \ CONVERT2RGB_32(FUNC, XSTEP, tmp_top, tmp_bottom, tmp_top_dst, \ tmp_bottom_dst, 0); \ memcpy(top_dst + pos * (XSTEP), tmp_top_dst, (len - pos) * (XSTEP)); \ if (bottom_y != NULL) { \ memcpy(bottom_dst + pos * (XSTEP), tmp_bottom_dst, \ (len - pos) * (XSTEP)); \ } \ } \ } // SSE4 variants of the fancy upsampler. SSE4_UPSAMPLE_FUNC(UpsampleRgbLinePair_SSE41, VP8YuvToRgb, 3) SSE4_UPSAMPLE_FUNC(UpsampleBgrLinePair_SSE41, VP8YuvToBgr, 3) #undef GET_M #undef PACK_AND_STORE #undef UPSAMPLE_32PIXELS #undef UPSAMPLE_LAST_BLOCK #undef CONVERT2RGB #undef CONVERT2RGB_32 #undef SSE4_UPSAMPLE_FUNC #endif // WEBP_REDUCE_CSP //------------------------------------------------------------------------------ // Entry point extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; extern void WebPInitUpsamplersSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersSSE41(void) { #if !defined(WEBP_REDUCE_CSP) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair_SSE41; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair_SSE41; #endif // WEBP_REDUCE_CSP } #endif // FANCY_UPSAMPLING //------------------------------------------------------------------------------ extern WebPYUV444Converter WebPYUV444Converters[/* MODE_LAST */]; extern void WebPInitYUV444ConvertersSSE41(void); #define YUV444_FUNC(FUNC_NAME, CALL, CALL_C, XSTEP) \ extern void CALL_C(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len); \ static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i; \ const int max_len = len & ~31; \ for (i = 0; i < max_len; i += 32) { \ CALL(y + i, u + i, v + i, dst + i * (XSTEP)); \ } \ if (i < len) { /* C-fallback */ \ CALL_C(y + i, u + i, v + i, dst + i * (XSTEP), len - i); \ } \ } #if !defined(WEBP_REDUCE_CSP) YUV444_FUNC(Yuv444ToRgb_SSE41, VP8YuvToRgb32_SSE41, WebPYuv444ToRgb_C, 3) YUV444_FUNC(Yuv444ToBgr_SSE41, VP8YuvToBgr32_SSE41, WebPYuv444ToBgr_C, 3) #endif // WEBP_REDUCE_CSP WEBP_TSAN_IGNORE_FUNCTION void WebPInitYUV444ConvertersSSE41(void) { #if !defined(WEBP_REDUCE_CSP) WebPYUV444Converters[MODE_RGB] = Yuv444ToRgb_SSE41; WebPYUV444Converters[MODE_BGR] = Yuv444ToBgr_SSE41; #endif // WEBP_REDUCE_CSP } #else WEBP_DSP_INIT_STUB(WebPInitYUV444ConvertersSSE41) #endif // WEBP_USE_SSE41 #if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_SSE41)) WEBP_DSP_INIT_STUB(WebPInitUpsamplersSSE41) #endif libwebp-1.4.0/src/dsp/dec_mips32.c0000644000014400001440000006412314606317060013532 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of dsp functions // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS32) #include "src/dsp/mips_macro.h" static const int kC1 = WEBP_TRANSFORM_AC3_C1; static const int kC2 = WEBP_TRANSFORM_AC3_C2; static WEBP_INLINE int abs_mips32(int x) { const int sign = x >> 31; return (x ^ sign) - sign; } // 4 pixels in, 2 pixels out static WEBP_INLINE void do_filter2(uint8_t* p, int step) { const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step]; const int a = 3 * (q0 - p0) + VP8ksclip1[p1 - q1]; const int a1 = VP8ksclip2[(a + 4) >> 3]; const int a2 = VP8ksclip2[(a + 3) >> 3]; p[-step] = VP8kclip1[p0 + a2]; p[ 0] = VP8kclip1[q0 - a1]; } // 4 pixels in, 4 pixels out static WEBP_INLINE void do_filter4(uint8_t* p, int step) { const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step]; const int a = 3 * (q0 - p0); const int a1 = VP8ksclip2[(a + 4) >> 3]; const int a2 = VP8ksclip2[(a + 3) >> 3]; const int a3 = (a1 + 1) >> 1; p[-2 * step] = VP8kclip1[p1 + a3]; p[- step] = VP8kclip1[p0 + a2]; p[ 0] = VP8kclip1[q0 - a1]; p[ step] = VP8kclip1[q1 - a3]; } // 6 pixels in, 6 pixels out static WEBP_INLINE void do_filter6(uint8_t* p, int step) { const int p2 = p[-3 * step], p1 = p[-2 * step], p0 = p[-step]; const int q0 = p[0], q1 = p[step], q2 = p[2 * step]; const int a = VP8ksclip1[3 * (q0 - p0) + VP8ksclip1[p1 - q1]]; // a is in [-128,127], a1 in [-27,27], a2 in [-18,18] and a3 in [-9,9] const int a1 = (27 * a + 63) >> 7; // eq. to ((3 * a + 7) * 9) >> 7 const int a2 = (18 * a + 63) >> 7; // eq. to ((2 * a + 7) * 9) >> 7 const int a3 = (9 * a + 63) >> 7; // eq. to ((1 * a + 7) * 9) >> 7 p[-3 * step] = VP8kclip1[p2 + a3]; p[-2 * step] = VP8kclip1[p1 + a2]; p[- step] = VP8kclip1[p0 + a1]; p[ 0] = VP8kclip1[q0 - a1]; p[ step] = VP8kclip1[q1 - a2]; p[ 2 * step] = VP8kclip1[q2 - a3]; } static WEBP_INLINE int hev(const uint8_t* p, int step, int thresh) { const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step]; return (abs_mips32(p1 - p0) > thresh) || (abs_mips32(q1 - q0) > thresh); } static WEBP_INLINE int needs_filter(const uint8_t* p, int step, int t) { const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step]; return ((4 * abs_mips32(p0 - q0) + abs_mips32(p1 - q1)) <= t); } static WEBP_INLINE int needs_filter2(const uint8_t* p, int step, int t, int it) { const int p3 = p[-4 * step], p2 = p[-3 * step]; const int p1 = p[-2 * step], p0 = p[-step]; const int q0 = p[0], q1 = p[step], q2 = p[2 * step], q3 = p[3 * step]; if ((4 * abs_mips32(p0 - q0) + abs_mips32(p1 - q1)) > t) { return 0; } return abs_mips32(p3 - p2) <= it && abs_mips32(p2 - p1) <= it && abs_mips32(p1 - p0) <= it && abs_mips32(q3 - q2) <= it && abs_mips32(q2 - q1) <= it && abs_mips32(q1 - q0) <= it; } static WEBP_INLINE void FilterLoop26(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { const int thresh2 = 2 * thresh + 1; while (size-- > 0) { if (needs_filter2(p, hstride, thresh2, ithresh)) { if (hev(p, hstride, hev_thresh)) { do_filter2(p, hstride); } else { do_filter6(p, hstride); } } p += vstride; } } static WEBP_INLINE void FilterLoop24(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { const int thresh2 = 2 * thresh + 1; while (size-- > 0) { if (needs_filter2(p, hstride, thresh2, ithresh)) { if (hev(p, hstride, hev_thresh)) { do_filter2(p, hstride); } else { do_filter4(p, hstride); } } p += vstride; } } // on macroblock edges static void VFilter16(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(p, stride, 1, 16, thresh, ithresh, hev_thresh); } static void HFilter16(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(p, 1, stride, 16, thresh, ithresh, hev_thresh); } // 8-pixels wide variant, for chroma filtering static void VFilter8(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(u, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop26(v, stride, 1, 8, thresh, ithresh, hev_thresh); } static void HFilter8(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(u, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop26(v, 1, stride, 8, thresh, ithresh, hev_thresh); } static void VFilter8i(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24(u + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop24(v + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); } static void HFilter8i(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24(u + 4, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop24(v + 4, 1, stride, 8, thresh, ithresh, hev_thresh); } // on three inner edges static void VFilter16i(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; FilterLoop24(p, stride, 1, 16, thresh, ithresh, hev_thresh); } } static void HFilter16i(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4; FilterLoop24(p, 1, stride, 16, thresh, ithresh, hev_thresh); } } //------------------------------------------------------------------------------ // Simple In-loop filtering (Paragraph 15.2) static void SimpleVFilter16(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; for (i = 0; i < 16; ++i) { if (needs_filter(p + i, stride, thresh2)) { do_filter2(p + i, stride); } } } static void SimpleHFilter16(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; for (i = 0; i < 16; ++i) { if (needs_filter(p + i * stride, 1, thresh2)) { do_filter2(p + i * stride, 1); } } } static void SimpleVFilter16i(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; SimpleVFilter16(p, stride, thresh); } } static void SimpleHFilter16i(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4; SimpleHFilter16(p, stride, thresh); } } static void TransformOne(const int16_t* in, uint8_t* dst) { int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14; int temp15, temp16, temp17, temp18, temp19; int16_t* p_in = (int16_t*)in; // loops unrolled and merged to avoid usage of tmp buffer // and to reduce number of stalls. MUL macro is written // in assembler and inlined __asm__ volatile( "lh %[temp0], 0(%[in]) \n\t" "lh %[temp8], 16(%[in]) \n\t" "lh %[temp4], 8(%[in]) \n\t" "lh %[temp12], 24(%[in]) \n\t" "addu %[temp16], %[temp0], %[temp8] \n\t" "subu %[temp0], %[temp0], %[temp8] \n\t" "mul %[temp8], %[temp4], %[kC2] \n\t" MUL_SHIFT_C1(temp17, temp12) MUL_SHIFT_C1_IO(temp4, temp19) "mul %[temp12], %[temp12], %[kC2] \n\t" "lh %[temp1], 2(%[in]) \n\t" "lh %[temp5], 10(%[in]) \n\t" "lh %[temp9], 18(%[in]) \n\t" "lh %[temp13], 26(%[in]) \n\t" "sra %[temp8], %[temp8], 16 \n\t" "sra %[temp12], %[temp12], 16 \n\t" "lh %[temp2], 4(%[in]) \n\t" "lh %[temp6], 12(%[in]) \n\t" "lh %[temp10], 20(%[in]) \n\t" "lh %[temp14], 28(%[in]) \n\t" "subu %[temp17], %[temp8], %[temp17] \n\t" "addu %[temp4], %[temp4], %[temp12] \n\t" "addu %[temp8], %[temp16], %[temp4] \n\t" "subu %[temp4], %[temp16], %[temp4] \n\t" "addu %[temp16], %[temp1], %[temp9] \n\t" "subu %[temp1], %[temp1], %[temp9] \n\t" "lh %[temp3], 6(%[in]) \n\t" "lh %[temp7], 14(%[in]) \n\t" "lh %[temp11], 22(%[in]) \n\t" "lh %[temp15], 30(%[in]) \n\t" "addu %[temp12], %[temp0], %[temp17] \n\t" "subu %[temp0], %[temp0], %[temp17] \n\t" "mul %[temp9], %[temp5], %[kC2] \n\t" MUL_SHIFT_C1(temp17, temp13) MUL_SHIFT_C1_IO(temp5, temp19) "mul %[temp13], %[temp13], %[kC2] \n\t" "sra %[temp9], %[temp9], 16 \n\t" "subu %[temp17], %[temp9], %[temp17] \n\t" "sra %[temp13], %[temp13], 16 \n\t" "addu %[temp5], %[temp5], %[temp13] \n\t" "addu %[temp13], %[temp1], %[temp17] \n\t" "subu %[temp1], %[temp1], %[temp17] \n\t" MUL_SHIFT_C1(temp17, temp14) "mul %[temp14], %[temp14], %[kC2] \n\t" "addu %[temp9], %[temp16], %[temp5] \n\t" "subu %[temp5], %[temp16], %[temp5] \n\t" "addu %[temp16], %[temp2], %[temp10] \n\t" "subu %[temp2], %[temp2], %[temp10] \n\t" "mul %[temp10], %[temp6], %[kC2] \n\t" MUL_SHIFT_C1_IO(temp6, temp19) "sra %[temp14], %[temp14], 16 \n\t" "sra %[temp10], %[temp10], 16 \n\t" "subu %[temp17], %[temp10], %[temp17] \n\t" "addu %[temp6], %[temp6], %[temp14] \n\t" "addu %[temp10], %[temp16], %[temp6] \n\t" "subu %[temp6], %[temp16], %[temp6] \n\t" "addu %[temp14], %[temp2], %[temp17] \n\t" "subu %[temp2], %[temp2], %[temp17] \n\t" MUL_SHIFT_C1(temp17, temp15) "mul %[temp15], %[temp15], %[kC2] \n\t" "addu %[temp16], %[temp3], %[temp11] \n\t" "subu %[temp3], %[temp3], %[temp11] \n\t" "mul %[temp11], %[temp7], %[kC2] \n\t" MUL_SHIFT_C1_IO(temp7, temp19) "addiu %[temp8], %[temp8], 4 \n\t" "addiu %[temp12], %[temp12], 4 \n\t" "addiu %[temp0], %[temp0], 4 \n\t" "addiu %[temp4], %[temp4], 4 \n\t" "sra %[temp15], %[temp15], 16 \n\t" "sra %[temp11], %[temp11], 16 \n\t" "subu %[temp17], %[temp11], %[temp17] \n\t" "addu %[temp7], %[temp7], %[temp15] \n\t" "addu %[temp15], %[temp3], %[temp17] \n\t" "subu %[temp3], %[temp3], %[temp17] \n\t" "addu %[temp11], %[temp16], %[temp7] \n\t" "subu %[temp7], %[temp16], %[temp7] \n\t" "addu %[temp16], %[temp8], %[temp10] \n\t" "subu %[temp8], %[temp8], %[temp10] \n\t" "mul %[temp10], %[temp9], %[kC2] \n\t" MUL_SHIFT_C1(temp17, temp11) MUL_SHIFT_C1_IO(temp9, temp19) "mul %[temp11], %[temp11], %[kC2] \n\t" "sra %[temp10], %[temp10], 16 \n\t" "sra %[temp11], %[temp11], 16 \n\t" "subu %[temp17], %[temp10], %[temp17] \n\t" "addu %[temp11], %[temp9], %[temp11] \n\t" "addu %[temp10], %[temp12], %[temp14] \n\t" "subu %[temp12], %[temp12], %[temp14] \n\t" "mul %[temp14], %[temp13], %[kC2] \n\t" MUL_SHIFT_C1(temp9, temp15) MUL_SHIFT_C1_IO(temp13, temp19) "mul %[temp15], %[temp15], %[kC2] \n\t" "sra %[temp14], %[temp14], 16 \n\t" "sra %[temp15], %[temp15], 16 \n\t" "subu %[temp9], %[temp14], %[temp9] \n\t" "addu %[temp15], %[temp13], %[temp15] \n\t" "addu %[temp14], %[temp0], %[temp2] \n\t" "subu %[temp0], %[temp0], %[temp2] \n\t" "mul %[temp2], %[temp1], %[kC2] \n\t" MUL_SHIFT_C1(temp13, temp3) MUL_SHIFT_C1_IO(temp1, temp19) "mul %[temp3], %[temp3], %[kC2] \n\t" "sra %[temp2], %[temp2], 16 \n\t" "sra %[temp3], %[temp3], 16 \n\t" "subu %[temp13], %[temp2], %[temp13] \n\t" "addu %[temp3], %[temp1], %[temp3] \n\t" "addu %[temp2], %[temp4], %[temp6] \n\t" "subu %[temp4], %[temp4], %[temp6] \n\t" "mul %[temp6], %[temp5], %[kC2] \n\t" MUL_SHIFT_C1(temp1, temp7) MUL_SHIFT_C1_IO(temp5, temp19) "mul %[temp7], %[temp7], %[kC2] \n\t" "sra %[temp6], %[temp6], 16 \n\t" "sra %[temp7], %[temp7], 16 \n\t" "subu %[temp1], %[temp6], %[temp1] \n\t" "addu %[temp7], %[temp5], %[temp7] \n\t" "addu %[temp5], %[temp16], %[temp11] \n\t" "subu %[temp16], %[temp16], %[temp11] \n\t" "addu %[temp11], %[temp8], %[temp17] \n\t" "subu %[temp8], %[temp8], %[temp17] \n\t" "sra %[temp5], %[temp5], 3 \n\t" "sra %[temp16], %[temp16], 3 \n\t" "sra %[temp11], %[temp11], 3 \n\t" "sra %[temp8], %[temp8], 3 \n\t" "addu %[temp17], %[temp10], %[temp15] \n\t" "subu %[temp10], %[temp10], %[temp15] \n\t" "addu %[temp15], %[temp12], %[temp9] \n\t" "subu %[temp12], %[temp12], %[temp9] \n\t" "sra %[temp17], %[temp17], 3 \n\t" "sra %[temp10], %[temp10], 3 \n\t" "sra %[temp15], %[temp15], 3 \n\t" "sra %[temp12], %[temp12], 3 \n\t" "addu %[temp9], %[temp14], %[temp3] \n\t" "subu %[temp14], %[temp14], %[temp3] \n\t" "addu %[temp3], %[temp0], %[temp13] \n\t" "subu %[temp0], %[temp0], %[temp13] \n\t" "sra %[temp9], %[temp9], 3 \n\t" "sra %[temp14], %[temp14], 3 \n\t" "sra %[temp3], %[temp3], 3 \n\t" "sra %[temp0], %[temp0], 3 \n\t" "addu %[temp13], %[temp2], %[temp7] \n\t" "subu %[temp2], %[temp2], %[temp7] \n\t" "addu %[temp7], %[temp4], %[temp1] \n\t" "subu %[temp4], %[temp4], %[temp1] \n\t" "sra %[temp13], %[temp13], 3 \n\t" "sra %[temp2], %[temp2], 3 \n\t" "sra %[temp7], %[temp7], 3 \n\t" "sra %[temp4], %[temp4], 3 \n\t" "addiu %[temp6], $zero, 255 \n\t" "lbu %[temp1], 0+0*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp1], %[temp1], %[temp5] \n\t" "sra %[temp5], %[temp1], 8 \n\t" "sra %[temp18], %[temp1], 31 \n\t" "beqz %[temp5], 1f \n\t" "xor %[temp1], %[temp1], %[temp1] \n\t" "movz %[temp1], %[temp6], %[temp18] \n\t" "1: \n\t" "lbu %[temp18], 1+0*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp1], 0+0*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp18], %[temp18], %[temp11] \n\t" "sra %[temp11], %[temp18], 8 \n\t" "sra %[temp1], %[temp18], 31 \n\t" "beqz %[temp11], 2f \n\t" "xor %[temp18], %[temp18], %[temp18] \n\t" "movz %[temp18], %[temp6], %[temp1] \n\t" "2: \n\t" "lbu %[temp1], 2+0*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp18], 1+0*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp1], %[temp1], %[temp8] \n\t" "sra %[temp8], %[temp1], 8 \n\t" "sra %[temp18], %[temp1], 31 \n\t" "beqz %[temp8], 3f \n\t" "xor %[temp1], %[temp1], %[temp1] \n\t" "movz %[temp1], %[temp6], %[temp18] \n\t" "3: \n\t" "lbu %[temp18], 3+0*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp1], 2+0*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp18], %[temp18], %[temp16] \n\t" "sra %[temp16], %[temp18], 8 \n\t" "sra %[temp1], %[temp18], 31 \n\t" "beqz %[temp16], 4f \n\t" "xor %[temp18], %[temp18], %[temp18] \n\t" "movz %[temp18], %[temp6], %[temp1] \n\t" "4: \n\t" "sb %[temp18], 3+0*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp5], 0+1*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp8], 1+1*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp11], 2+1*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp16], 3+1*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp5], %[temp5], %[temp17] \n\t" "addu %[temp8], %[temp8], %[temp15] \n\t" "addu %[temp11], %[temp11], %[temp12] \n\t" "addu %[temp16], %[temp16], %[temp10] \n\t" "sra %[temp18], %[temp5], 8 \n\t" "sra %[temp1], %[temp5], 31 \n\t" "beqz %[temp18], 5f \n\t" "xor %[temp5], %[temp5], %[temp5] \n\t" "movz %[temp5], %[temp6], %[temp1] \n\t" "5: \n\t" "sra %[temp18], %[temp8], 8 \n\t" "sra %[temp1], %[temp8], 31 \n\t" "beqz %[temp18], 6f \n\t" "xor %[temp8], %[temp8], %[temp8] \n\t" "movz %[temp8], %[temp6], %[temp1] \n\t" "6: \n\t" "sra %[temp18], %[temp11], 8 \n\t" "sra %[temp1], %[temp11], 31 \n\t" "sra %[temp17], %[temp16], 8 \n\t" "sra %[temp15], %[temp16], 31 \n\t" "beqz %[temp18], 7f \n\t" "xor %[temp11], %[temp11], %[temp11] \n\t" "movz %[temp11], %[temp6], %[temp1] \n\t" "7: \n\t" "beqz %[temp17], 8f \n\t" "xor %[temp16], %[temp16], %[temp16] \n\t" "movz %[temp16], %[temp6], %[temp15] \n\t" "8: \n\t" "sb %[temp5], 0+1*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp8], 1+1*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp11], 2+1*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp16], 3+1*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp5], 0+2*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp8], 1+2*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp11], 2+2*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp16], 3+2*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp5], %[temp5], %[temp9] \n\t" "addu %[temp8], %[temp8], %[temp3] \n\t" "addu %[temp11], %[temp11], %[temp0] \n\t" "addu %[temp16], %[temp16], %[temp14] \n\t" "sra %[temp18], %[temp5], 8 \n\t" "sra %[temp1], %[temp5], 31 \n\t" "sra %[temp17], %[temp8], 8 \n\t" "sra %[temp15], %[temp8], 31 \n\t" "sra %[temp12], %[temp11], 8 \n\t" "sra %[temp10], %[temp11], 31 \n\t" "sra %[temp9], %[temp16], 8 \n\t" "sra %[temp3], %[temp16], 31 \n\t" "beqz %[temp18], 9f \n\t" "xor %[temp5], %[temp5], %[temp5] \n\t" "movz %[temp5], %[temp6], %[temp1] \n\t" "9: \n\t" "beqz %[temp17], 10f \n\t" "xor %[temp8], %[temp8], %[temp8] \n\t" "movz %[temp8], %[temp6], %[temp15] \n\t" "10: \n\t" "beqz %[temp12], 11f \n\t" "xor %[temp11], %[temp11], %[temp11] \n\t" "movz %[temp11], %[temp6], %[temp10] \n\t" "11: \n\t" "beqz %[temp9], 12f \n\t" "xor %[temp16], %[temp16], %[temp16] \n\t" "movz %[temp16], %[temp6], %[temp3] \n\t" "12: \n\t" "sb %[temp5], 0+2*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp8], 1+2*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp11], 2+2*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp16], 3+2*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp5], 0+3*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp8], 1+3*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp11], 2+3*" XSTR(BPS) "(%[dst]) \n\t" "lbu %[temp16], 3+3*" XSTR(BPS) "(%[dst]) \n\t" "addu %[temp5], %[temp5], %[temp13] \n\t" "addu %[temp8], %[temp8], %[temp7] \n\t" "addu %[temp11], %[temp11], %[temp4] \n\t" "addu %[temp16], %[temp16], %[temp2] \n\t" "sra %[temp18], %[temp5], 8 \n\t" "sra %[temp1], %[temp5], 31 \n\t" "sra %[temp17], %[temp8], 8 \n\t" "sra %[temp15], %[temp8], 31 \n\t" "sra %[temp12], %[temp11], 8 \n\t" "sra %[temp10], %[temp11], 31 \n\t" "sra %[temp9], %[temp16], 8 \n\t" "sra %[temp3], %[temp16], 31 \n\t" "beqz %[temp18], 13f \n\t" "xor %[temp5], %[temp5], %[temp5] \n\t" "movz %[temp5], %[temp6], %[temp1] \n\t" "13: \n\t" "beqz %[temp17], 14f \n\t" "xor %[temp8], %[temp8], %[temp8] \n\t" "movz %[temp8], %[temp6], %[temp15] \n\t" "14: \n\t" "beqz %[temp12], 15f \n\t" "xor %[temp11], %[temp11], %[temp11] \n\t" "movz %[temp11], %[temp6], %[temp10] \n\t" "15: \n\t" "beqz %[temp9], 16f \n\t" "xor %[temp16], %[temp16], %[temp16] \n\t" "movz %[temp16], %[temp6], %[temp3] \n\t" "16: \n\t" "sb %[temp5], 0+3*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp8], 1+3*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp11], 2+3*" XSTR(BPS) "(%[dst]) \n\t" "sb %[temp16], 3+3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11), [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), [temp14]"=&r"(temp14), [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), [temp17]"=&r"(temp17), [temp18]"=&r"(temp18), [temp19]"=&r"(temp19) : [in]"r"(p_in), [kC1]"r"(kC1), [kC2]"r"(kC2), [dst]"r"(dst) : "memory", "hi", "lo" ); } static void TransformTwo(const int16_t* in, uint8_t* dst, int do_two) { TransformOne(in, dst); if (do_two) { TransformOne(in + 16, dst + 4); } } //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitMIPS32(void) { VP8InitClipTables(); VP8Transform = TransformTwo; VP8VFilter16 = VFilter16; VP8HFilter16 = HFilter16; VP8VFilter8 = VFilter8; VP8HFilter8 = HFilter8; VP8VFilter16i = VFilter16i; VP8HFilter16i = HFilter16i; VP8VFilter8i = VFilter8i; VP8HFilter8i = HFilter8i; VP8SimpleVFilter16 = SimpleVFilter16; VP8SimpleHFilter16 = SimpleHFilter16; VP8SimpleVFilter16i = SimpleVFilter16i; VP8SimpleHFilter16i = SimpleHFilter16i; } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(VP8DspInitMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/lossless.h0000644000014400001440000002725614606317060013464 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transforms and color space conversion methods for lossless decoder. // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) #ifndef WEBP_DSP_LOSSLESS_H_ #define WEBP_DSP_LOSSLESS_H_ #include "src/webp/types.h" #include "src/webp/decode.h" #include "src/enc/histogram_enc.h" #include "src/utils/utils.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Decoding typedef uint32_t (*VP8LPredictorFunc)(const uint32_t* const left, const uint32_t* const top); extern VP8LPredictorFunc VP8LPredictors[16]; uint32_t VP8LPredictor0_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor1_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor2_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor3_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor4_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor5_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor6_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor7_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor8_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor9_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor10_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor11_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor12_C(const uint32_t* const left, const uint32_t* const top); uint32_t VP8LPredictor13_C(const uint32_t* const left, const uint32_t* const top); // These Add/Sub function expects upper[-1] and out[-1] to be readable. typedef void (*VP8LPredictorAddSubFunc)(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out); extern VP8LPredictorAddSubFunc VP8LPredictorsAdd[16]; extern VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16]; typedef void (*VP8LProcessDecBlueAndRedFunc)(const uint32_t* src, int num_pixels, uint32_t* dst); extern VP8LProcessDecBlueAndRedFunc VP8LAddGreenToBlueAndRed; typedef struct { // Note: the members are uint8_t, so that any negative values are // automatically converted to "mod 256" values. uint8_t green_to_red_; uint8_t green_to_blue_; uint8_t red_to_blue_; } VP8LMultipliers; typedef void (*VP8LTransformColorInverseFunc)(const VP8LMultipliers* const m, const uint32_t* src, int num_pixels, uint32_t* dst); extern VP8LTransformColorInverseFunc VP8LTransformColorInverse; struct VP8LTransform; // Defined in dec/vp8li.h. // Performs inverse transform of data given transform information, start and end // rows. Transform will be applied to rows [row_start, row_end[. // The *in and *out pointers refer to source and destination data respectively // corresponding to the intermediate row (row_start). void VP8LInverseTransform(const struct VP8LTransform* const transform, int row_start, int row_end, const uint32_t* const in, uint32_t* const out); // Color space conversion. typedef void (*VP8LConvertFunc)(const uint32_t* src, int num_pixels, uint8_t* dst); extern VP8LConvertFunc VP8LConvertBGRAToRGB; extern VP8LConvertFunc VP8LConvertBGRAToRGBA; extern VP8LConvertFunc VP8LConvertBGRAToRGBA4444; extern VP8LConvertFunc VP8LConvertBGRAToRGB565; extern VP8LConvertFunc VP8LConvertBGRAToBGR; // Converts from BGRA to other color spaces. void VP8LConvertFromBGRA(const uint32_t* const in_data, int num_pixels, WEBP_CSP_MODE out_colorspace, uint8_t* const rgba); typedef void (*VP8LMapARGBFunc)(const uint32_t* src, const uint32_t* const color_map, uint32_t* dst, int y_start, int y_end, int width); typedef void (*VP8LMapAlphaFunc)(const uint8_t* src, const uint32_t* const color_map, uint8_t* dst, int y_start, int y_end, int width); extern VP8LMapARGBFunc VP8LMapColor32b; extern VP8LMapAlphaFunc VP8LMapColor8b; // Similar to the static method ColorIndexInverseTransform() that is part of // lossless.c, but used only for alpha decoding. It takes uint8_t (rather than // uint32_t) arguments for 'src' and 'dst'. void VP8LColorIndexInverseTransformAlpha( const struct VP8LTransform* const transform, int y_start, int y_end, const uint8_t* src, uint8_t* dst); // Expose some C-only fallback functions void VP8LTransformColorInverse_C(const VP8LMultipliers* const m, const uint32_t* src, int num_pixels, uint32_t* dst); void VP8LConvertBGRAToRGB_C(const uint32_t* src, int num_pixels, uint8_t* dst); void VP8LConvertBGRAToRGBA_C(const uint32_t* src, int num_pixels, uint8_t* dst); void VP8LConvertBGRAToRGBA4444_C(const uint32_t* src, int num_pixels, uint8_t* dst); void VP8LConvertBGRAToRGB565_C(const uint32_t* src, int num_pixels, uint8_t* dst); void VP8LConvertBGRAToBGR_C(const uint32_t* src, int num_pixels, uint8_t* dst); void VP8LAddGreenToBlueAndRed_C(const uint32_t* src, int num_pixels, uint32_t* dst); // Must be called before calling any of the above methods. void VP8LDspInit(void); //------------------------------------------------------------------------------ // Encoding typedef void (*VP8LProcessEncBlueAndRedFunc)(uint32_t* dst, int num_pixels); extern VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed; typedef void (*VP8LTransformColorFunc)(const VP8LMultipliers* const m, uint32_t* dst, int num_pixels); extern VP8LTransformColorFunc VP8LTransformColor; typedef void (*VP8LCollectColorBlueTransformsFunc)( const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]); extern VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms; typedef void (*VP8LCollectColorRedTransformsFunc)( const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]); extern VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms; // Expose some C-only fallback functions void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data, int num_pixels); void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels); void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]); void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]); extern VP8LPredictorAddSubFunc VP8LPredictorsSub[16]; extern VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16]; // ----------------------------------------------------------------------------- // Huffman-cost related functions. typedef uint32_t (*VP8LCostFunc)(const uint32_t* population, int length); typedef uint32_t (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y, int length); typedef float (*VP8LCombinedShannonEntropyFunc)(const int X[256], const int Y[256]); extern VP8LCostFunc VP8LExtraCost; extern VP8LCostCombinedFunc VP8LExtraCostCombined; extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy; typedef struct { // small struct to hold counters int counts[2]; // index: 0=zero streak, 1=non-zero streak int streaks[2][2]; // [zero/non-zero][streak<3 / streak>=3] } VP8LStreaks; typedef struct { // small struct to hold bit entropy results float entropy; // entropy uint32_t sum; // sum of the population int nonzeros; // number of non-zero elements in the population uint32_t max_val; // maximum value in the population uint32_t nonzero_code; // index of the last non-zero in the population } VP8LBitEntropy; void VP8LBitEntropyInit(VP8LBitEntropy* const entropy); // Get the combined symbol bit entropy and Huffman cost stats for the // distributions 'X' and 'Y'. Those results can then be refined according to // codec specific heuristics. typedef void (*VP8LGetCombinedEntropyUnrefinedFunc)( const uint32_t X[], const uint32_t Y[], int length, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats); extern VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined; // Get the entropy for the distribution 'X'. typedef void (*VP8LGetEntropyUnrefinedFunc)(const uint32_t X[], int length, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats); extern VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined; void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n, VP8LBitEntropy* const entropy); typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b, uint32_t* out, int size); extern VP8LAddVectorFunc VP8LAddVector; typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size); extern VP8LAddVectorEqFunc VP8LAddVectorEq; void VP8LHistogramAdd(const VP8LHistogram* const a, const VP8LHistogram* const b, VP8LHistogram* const out); // ----------------------------------------------------------------------------- // PrefixEncode() typedef int (*VP8LVectorMismatchFunc)(const uint32_t* const array1, const uint32_t* const array2, int length); // Returns the first index where array1 and array2 are different. extern VP8LVectorMismatchFunc VP8LVectorMismatch; typedef void (*VP8LBundleColorMapFunc)(const uint8_t* const row, int width, int xbits, uint32_t* dst); extern VP8LBundleColorMapFunc VP8LBundleColorMap; void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits, uint32_t* dst); // Must be called before calling any of the above methods. void VP8LEncDspInit(void); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_LOSSLESS_H_ libwebp-1.4.0/src/dsp/rescaler_sse2.c0000644000014400001440000003451314606317060014336 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 Rescaling functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) && !defined(WEBP_REDUCE_SIZE) #include #include #include "src/utils/rescaler_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Implementations of critical functions ImportRow / ExportRow #define ROUNDER (WEBP_RESCALER_ONE >> 1) #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) #define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX) // input: 8 bytes ABCDEFGH -> output: A0E0B0F0C0G0D0H0 static void LoadTwoPixels_SSE2(const uint8_t* const src, __m128i* out) { const __m128i zero = _mm_setzero_si128(); const __m128i A = _mm_loadl_epi64((const __m128i*)(src)); // ABCDEFGH const __m128i B = _mm_unpacklo_epi8(A, zero); // A0B0C0D0E0F0G0H0 const __m128i C = _mm_srli_si128(B, 8); // E0F0G0H0 *out = _mm_unpacklo_epi16(B, C); } // input: 8 bytes ABCDEFGH -> output: A0B0C0D0E0F0G0H0 static void LoadEightPixels_SSE2(const uint8_t* const src, __m128i* out) { const __m128i zero = _mm_setzero_si128(); const __m128i A = _mm_loadl_epi64((const __m128i*)(src)); // ABCDEFGH *out = _mm_unpacklo_epi8(A, zero); } static void RescalerImportRowExpand_SSE2(WebPRescaler* const wrk, const uint8_t* src) { rescaler_t* frow = wrk->frow; const rescaler_t* const frow_end = frow + wrk->dst_width * wrk->num_channels; const int x_add = wrk->x_add; int accum = x_add; __m128i cur_pixels; // SSE2 implementation only works with 16b signed arithmetic at max. if (wrk->src_width < 8 || accum >= (1 << 15)) { WebPRescalerImportRowExpand_C(wrk, src); return; } assert(!WebPRescalerInputDone(wrk)); assert(wrk->x_expand); if (wrk->num_channels == 4) { LoadTwoPixels_SSE2(src, &cur_pixels); src += 4; while (1) { const __m128i mult = _mm_set1_epi32(((x_add - accum) << 16) | accum); const __m128i out = _mm_madd_epi16(cur_pixels, mult); _mm_storeu_si128((__m128i*)frow, out); frow += 4; if (frow >= frow_end) break; accum -= wrk->x_sub; if (accum < 0) { LoadTwoPixels_SSE2(src, &cur_pixels); src += 4; accum += x_add; } } } else { int left; const uint8_t* const src_limit = src + wrk->src_width - 8; LoadEightPixels_SSE2(src, &cur_pixels); src += 7; left = 7; while (1) { const __m128i mult = _mm_cvtsi32_si128(((x_add - accum) << 16) | accum); const __m128i out = _mm_madd_epi16(cur_pixels, mult); assert(sizeof(*frow) == sizeof(uint32_t)); WebPInt32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out)); frow += 1; if (frow >= frow_end) break; accum -= wrk->x_sub; if (accum < 0) { if (--left) { cur_pixels = _mm_srli_si128(cur_pixels, 2); } else if (src <= src_limit) { LoadEightPixels_SSE2(src, &cur_pixels); src += 7; left = 7; } else { // tail cur_pixels = _mm_srli_si128(cur_pixels, 2); cur_pixels = _mm_insert_epi16(cur_pixels, src[1], 1); src += 1; left = 1; } accum += x_add; } } } assert(accum == 0); } static void RescalerImportRowShrink_SSE2(WebPRescaler* const wrk, const uint8_t* src) { const int x_sub = wrk->x_sub; int accum = 0; const __m128i zero = _mm_setzero_si128(); const __m128i mult0 = _mm_set1_epi16(x_sub); const __m128i mult1 = _mm_set1_epi32(wrk->fx_scale); const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER); __m128i sum = zero; rescaler_t* frow = wrk->frow; const rescaler_t* const frow_end = wrk->frow + 4 * wrk->dst_width; if (wrk->num_channels != 4 || wrk->x_add > (x_sub << 7)) { WebPRescalerImportRowShrink_C(wrk, src); return; } assert(!WebPRescalerInputDone(wrk)); assert(!wrk->x_expand); for (; frow < frow_end; frow += 4) { __m128i base = zero; accum += wrk->x_add; while (accum > 0) { const __m128i A = _mm_cvtsi32_si128(WebPMemToInt32(src)); src += 4; base = _mm_unpacklo_epi8(A, zero); // To avoid overflow, we need: base * x_add / x_sub < 32768 // => x_add < x_sub << 7. That's a 1/128 reduction ratio limit. sum = _mm_add_epi16(sum, base); accum -= x_sub; } { // Emit next horizontal pixel. const __m128i mult = _mm_set1_epi16(-accum); const __m128i frac0 = _mm_mullo_epi16(base, mult); // 16b x 16b -> 32b const __m128i frac1 = _mm_mulhi_epu16(base, mult); const __m128i frac = _mm_unpacklo_epi16(frac0, frac1); // frac is 32b const __m128i A0 = _mm_mullo_epi16(sum, mult0); const __m128i A1 = _mm_mulhi_epu16(sum, mult0); const __m128i B0 = _mm_unpacklo_epi16(A0, A1); // sum * x_sub const __m128i frow_out = _mm_sub_epi32(B0, frac); // sum * x_sub - frac const __m128i D0 = _mm_srli_epi64(frac, 32); const __m128i D1 = _mm_mul_epu32(frac, mult1); // 32b x 16b -> 64b const __m128i D2 = _mm_mul_epu32(D0, mult1); const __m128i E1 = _mm_add_epi64(D1, rounder); const __m128i E2 = _mm_add_epi64(D2, rounder); const __m128i F1 = _mm_shuffle_epi32(E1, 1 | (3 << 2)); const __m128i F2 = _mm_shuffle_epi32(E2, 1 | (3 << 2)); const __m128i G = _mm_unpacklo_epi32(F1, F2); sum = _mm_packs_epi32(G, zero); _mm_storeu_si128((__m128i*)frow, frow_out); } } assert(accum == 0); } //------------------------------------------------------------------------------ // Row export // load *src as epi64, multiply by mult and store result in [out0 ... out3] static WEBP_INLINE void LoadDispatchAndMult_SSE2(const rescaler_t* const src, const __m128i* const mult, __m128i* const out0, __m128i* const out1, __m128i* const out2, __m128i* const out3) { const __m128i A0 = _mm_loadu_si128((const __m128i*)(src + 0)); const __m128i A1 = _mm_loadu_si128((const __m128i*)(src + 4)); const __m128i A2 = _mm_srli_epi64(A0, 32); const __m128i A3 = _mm_srli_epi64(A1, 32); if (mult != NULL) { *out0 = _mm_mul_epu32(A0, *mult); *out1 = _mm_mul_epu32(A1, *mult); *out2 = _mm_mul_epu32(A2, *mult); *out3 = _mm_mul_epu32(A3, *mult); } else { *out0 = A0; *out1 = A1; *out2 = A2; *out3 = A3; } } static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0, const __m128i* const A1, const __m128i* const A2, const __m128i* const A3, const __m128i* const mult, uint8_t* const dst) { const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER); const __m128i mask = _mm_set_epi32(~0, 0, ~0, 0); const __m128i B0 = _mm_mul_epu32(*A0, *mult); const __m128i B1 = _mm_mul_epu32(*A1, *mult); const __m128i B2 = _mm_mul_epu32(*A2, *mult); const __m128i B3 = _mm_mul_epu32(*A3, *mult); const __m128i C0 = _mm_add_epi64(B0, rounder); const __m128i C1 = _mm_add_epi64(B1, rounder); const __m128i C2 = _mm_add_epi64(B2, rounder); const __m128i C3 = _mm_add_epi64(B3, rounder); const __m128i D0 = _mm_srli_epi64(C0, WEBP_RESCALER_RFIX); const __m128i D1 = _mm_srli_epi64(C1, WEBP_RESCALER_RFIX); #if (WEBP_RESCALER_RFIX < 32) const __m128i D2 = _mm_and_si128(_mm_slli_epi64(C2, 32 - WEBP_RESCALER_RFIX), mask); const __m128i D3 = _mm_and_si128(_mm_slli_epi64(C3, 32 - WEBP_RESCALER_RFIX), mask); #else const __m128i D2 = _mm_and_si128(C2, mask); const __m128i D3 = _mm_and_si128(C3, mask); #endif const __m128i E0 = _mm_or_si128(D0, D2); const __m128i E1 = _mm_or_si128(D1, D3); const __m128i F = _mm_packs_epi32(E0, E1); const __m128i G = _mm_packus_epi16(F, F); _mm_storel_epi64((__m128i*)dst, G); } static void RescalerExportRowExpand_SSE2(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* const frow = wrk->frow; const __m128i mult = _mm_set_epi32(0, wrk->fy_scale, 0, wrk->fy_scale); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0 && wrk->y_sub + wrk->y_accum >= 0); assert(wrk->y_expand); if (wrk->y_accum == 0) { for (x_out = 0; x_out + 8 <= x_out_max; x_out += 8) { __m128i A0, A1, A2, A3; LoadDispatchAndMult_SSE2(frow + x_out, NULL, &A0, &A1, &A2, &A3); ProcessRow_SSE2(&A0, &A1, &A2, &A3, &mult, dst + x_out); } for (; x_out < x_out_max; ++x_out) { const uint32_t J = frow[x_out]; const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } else { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); const __m128i mA = _mm_set_epi32(0, A, 0, A); const __m128i mB = _mm_set_epi32(0, B, 0, B); const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER); for (x_out = 0; x_out + 8 <= x_out_max; x_out += 8) { __m128i A0, A1, A2, A3, B0, B1, B2, B3; LoadDispatchAndMult_SSE2(frow + x_out, &mA, &A0, &A1, &A2, &A3); LoadDispatchAndMult_SSE2(irow + x_out, &mB, &B0, &B1, &B2, &B3); { const __m128i C0 = _mm_add_epi64(A0, B0); const __m128i C1 = _mm_add_epi64(A1, B1); const __m128i C2 = _mm_add_epi64(A2, B2); const __m128i C3 = _mm_add_epi64(A3, B3); const __m128i D0 = _mm_add_epi64(C0, rounder); const __m128i D1 = _mm_add_epi64(C1, rounder); const __m128i D2 = _mm_add_epi64(C2, rounder); const __m128i D3 = _mm_add_epi64(C3, rounder); const __m128i E0 = _mm_srli_epi64(D0, WEBP_RESCALER_RFIX); const __m128i E1 = _mm_srli_epi64(D1, WEBP_RESCALER_RFIX); const __m128i E2 = _mm_srli_epi64(D2, WEBP_RESCALER_RFIX); const __m128i E3 = _mm_srli_epi64(D3, WEBP_RESCALER_RFIX); ProcessRow_SSE2(&E0, &E1, &E2, &E3, &mult, dst + x_out); } } for (; x_out < x_out_max; ++x_out) { const uint64_t I = (uint64_t)A * frow[x_out] + (uint64_t)B * irow[x_out]; const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } } static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* const frow = wrk->frow; const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); if (yscale) { const int scale_xy = wrk->fxy_scale; const __m128i mult_xy = _mm_set_epi32(0, scale_xy, 0, scale_xy); const __m128i mult_y = _mm_set_epi32(0, yscale, 0, yscale); for (x_out = 0; x_out + 8 <= x_out_max; x_out += 8) { __m128i A0, A1, A2, A3, B0, B1, B2, B3; LoadDispatchAndMult_SSE2(irow + x_out, NULL, &A0, &A1, &A2, &A3); LoadDispatchAndMult_SSE2(frow + x_out, &mult_y, &B0, &B1, &B2, &B3); { const __m128i D0 = _mm_srli_epi64(B0, WEBP_RESCALER_RFIX); // = frac const __m128i D1 = _mm_srli_epi64(B1, WEBP_RESCALER_RFIX); const __m128i D2 = _mm_srli_epi64(B2, WEBP_RESCALER_RFIX); const __m128i D3 = _mm_srli_epi64(B3, WEBP_RESCALER_RFIX); const __m128i E0 = _mm_sub_epi64(A0, D0); // irow[x] - frac const __m128i E1 = _mm_sub_epi64(A1, D1); const __m128i E2 = _mm_sub_epi64(A2, D2); const __m128i E3 = _mm_sub_epi64(A3, D3); const __m128i F2 = _mm_slli_epi64(D2, 32); const __m128i F3 = _mm_slli_epi64(D3, 32); const __m128i G0 = _mm_or_si128(D0, F2); const __m128i G1 = _mm_or_si128(D1, F3); _mm_storeu_si128((__m128i*)(irow + x_out + 0), G0); _mm_storeu_si128((__m128i*)(irow + x_out + 4), G1); ProcessRow_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out); } } for (; x_out < x_out_max; ++x_out) { const uint32_t frac = (int)MULT_FIX_FLOOR(frow[x_out], yscale); const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = frac; // new fractional start } } else { const uint32_t scale = wrk->fxy_scale; const __m128i mult = _mm_set_epi32(0, scale, 0, scale); const __m128i zero = _mm_setzero_si128(); for (x_out = 0; x_out + 8 <= x_out_max; x_out += 8) { __m128i A0, A1, A2, A3; LoadDispatchAndMult_SSE2(irow + x_out, NULL, &A0, &A1, &A2, &A3); _mm_storeu_si128((__m128i*)(irow + x_out + 0), zero); _mm_storeu_si128((__m128i*)(irow + x_out + 4), zero); ProcessRow_SSE2(&A0, &A1, &A2, &A3, &mult, dst + x_out); } for (; x_out < x_out_max; ++x_out) { const int v = (int)MULT_FIX(irow[x_out], scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = 0; } } } #undef MULT_FIX_FLOOR #undef MULT_FIX #undef ROUNDER //------------------------------------------------------------------------------ extern void WebPRescalerDspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitSSE2(void) { WebPRescalerImportRowExpand = RescalerImportRowExpand_SSE2; WebPRescalerImportRowShrink = RescalerImportRowShrink_SSE2; WebPRescalerExportRowExpand = RescalerExportRowExpand_SSE2; WebPRescalerExportRowShrink = RescalerExportRowShrink_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(WebPRescalerDspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/lossless.c0000644000014400001440000006206414606317060013453 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transforms and color space conversion methods for lossless decoder. // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) // Urvang Joshi (urvang@google.com) #include "src/dsp/dsp.h" #include #include #include #include "src/dec/vp8li_dec.h" #include "src/utils/endian_inl_utils.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" //------------------------------------------------------------------------------ // Image transforms. static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) { return (((a0 ^ a1) & 0xfefefefeu) >> 1) + (a0 & a1); } static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) { return Average2(Average2(a0, a2), a1); } static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3) { return Average2(Average2(a0, a1), Average2(a2, a3)); } static WEBP_INLINE uint32_t Clip255(uint32_t a) { if (a < 256) { return a; } // return 0, when a is a negative integer. // return 255, when a is positive. return ~a >> 24; } static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) { return Clip255((uint32_t)(a + b - c)); } static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1, uint32_t c2) { const int a = AddSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24); const int r = AddSubtractComponentFull((c0 >> 16) & 0xff, (c1 >> 16) & 0xff, (c2 >> 16) & 0xff); const int g = AddSubtractComponentFull((c0 >> 8) & 0xff, (c1 >> 8) & 0xff, (c2 >> 8) & 0xff); const int b = AddSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff); return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b; } static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) { return Clip255((uint32_t)(a + (a - b) / 2)); } static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1, uint32_t c2) { const uint32_t ave = Average2(c0, c1); const int a = AddSubtractComponentHalf(ave >> 24, c2 >> 24); const int r = AddSubtractComponentHalf((ave >> 16) & 0xff, (c2 >> 16) & 0xff); const int g = AddSubtractComponentHalf((ave >> 8) & 0xff, (c2 >> 8) & 0xff); const int b = AddSubtractComponentHalf((ave >> 0) & 0xff, (c2 >> 0) & 0xff); return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b; } // gcc <= 4.9 on ARM generates incorrect code in Select() when Sub3() is // inlined. #if defined(__arm__) && defined(__GNUC__) && LOCAL_GCC_VERSION <= 0x409 # define LOCAL_INLINE __attribute__ ((noinline)) #else # define LOCAL_INLINE WEBP_INLINE #endif static LOCAL_INLINE int Sub3(int a, int b, int c) { const int pb = b - c; const int pa = a - c; return abs(pb) - abs(pa); } #undef LOCAL_INLINE static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) { const int pa_minus_pb = Sub3((a >> 24) , (b >> 24) , (c >> 24) ) + Sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) + Sub3((a >> 8) & 0xff, (b >> 8) & 0xff, (c >> 8) & 0xff) + Sub3((a ) & 0xff, (b ) & 0xff, (c ) & 0xff); return (pa_minus_pb <= 0) ? a : b; } //------------------------------------------------------------------------------ // Predictors uint32_t VP8LPredictor0_C(const uint32_t* const left, const uint32_t* const top) { (void)top; (void)left; return ARGB_BLACK; } uint32_t VP8LPredictor1_C(const uint32_t* const left, const uint32_t* const top) { (void)top; return *left; } uint32_t VP8LPredictor2_C(const uint32_t* const left, const uint32_t* const top) { (void)left; return top[0]; } uint32_t VP8LPredictor3_C(const uint32_t* const left, const uint32_t* const top) { (void)left; return top[1]; } uint32_t VP8LPredictor4_C(const uint32_t* const left, const uint32_t* const top) { (void)left; return top[-1]; } uint32_t VP8LPredictor5_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average3(*left, top[0], top[1]); return pred; } uint32_t VP8LPredictor6_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2(*left, top[-1]); return pred; } uint32_t VP8LPredictor7_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2(*left, top[0]); return pred; } uint32_t VP8LPredictor8_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2(top[-1], top[0]); (void)left; return pred; } uint32_t VP8LPredictor9_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2(top[0], top[1]); (void)left; return pred; } uint32_t VP8LPredictor10_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average4(*left, top[-1], top[0], top[1]); return pred; } uint32_t VP8LPredictor11_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Select(top[0], *left, top[-1]); return pred; } uint32_t VP8LPredictor12_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = ClampedAddSubtractFull(*left, top[0], top[-1]); return pred; } uint32_t VP8LPredictor13_C(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = ClampedAddSubtractHalf(*left, top[0], top[-1]); return pred; } static void PredictorAdd0_C(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int x; (void)upper; for (x = 0; x < num_pixels; ++x) out[x] = VP8LAddPixels(in[x], ARGB_BLACK); } static void PredictorAdd1_C(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint32_t left = out[-1]; (void)upper; for (i = 0; i < num_pixels; ++i) { out[i] = left = VP8LAddPixels(in[i], left); } } GENERATE_PREDICTOR_ADD(VP8LPredictor2_C, PredictorAdd2_C) GENERATE_PREDICTOR_ADD(VP8LPredictor3_C, PredictorAdd3_C) GENERATE_PREDICTOR_ADD(VP8LPredictor4_C, PredictorAdd4_C) GENERATE_PREDICTOR_ADD(VP8LPredictor5_C, PredictorAdd5_C) GENERATE_PREDICTOR_ADD(VP8LPredictor6_C, PredictorAdd6_C) GENERATE_PREDICTOR_ADD(VP8LPredictor7_C, PredictorAdd7_C) GENERATE_PREDICTOR_ADD(VP8LPredictor8_C, PredictorAdd8_C) GENERATE_PREDICTOR_ADD(VP8LPredictor9_C, PredictorAdd9_C) GENERATE_PREDICTOR_ADD(VP8LPredictor10_C, PredictorAdd10_C) GENERATE_PREDICTOR_ADD(VP8LPredictor11_C, PredictorAdd11_C) GENERATE_PREDICTOR_ADD(VP8LPredictor12_C, PredictorAdd12_C) GENERATE_PREDICTOR_ADD(VP8LPredictor13_C, PredictorAdd13_C) //------------------------------------------------------------------------------ // Inverse prediction. static void PredictorInverseTransform_C(const VP8LTransform* const transform, int y_start, int y_end, const uint32_t* in, uint32_t* out) { const int width = transform->xsize_; if (y_start == 0) { // First Row follows the L (mode=1) mode. PredictorAdd0_C(in, NULL, 1, out); PredictorAdd1_C(in + 1, NULL, width - 1, out + 1); in += width; out += width; ++y_start; } { int y = y_start; const int tile_width = 1 << transform->bits_; const int mask = tile_width - 1; const int tiles_per_row = VP8LSubSampleSize(width, transform->bits_); const uint32_t* pred_mode_base = transform->data_ + (y >> transform->bits_) * tiles_per_row; while (y < y_end) { const uint32_t* pred_mode_src = pred_mode_base; int x = 1; // First pixel follows the T (mode=2) mode. PredictorAdd2_C(in, out - width, 1, out); // .. the rest: while (x < width) { const VP8LPredictorAddSubFunc pred_func = VP8LPredictorsAdd[((*pred_mode_src++) >> 8) & 0xf]; int x_end = (x & ~mask) + tile_width; if (x_end > width) x_end = width; pred_func(in + x, out + x - width, x_end - x, out + x); x = x_end; } in += width; out += width; ++y; if ((y & mask) == 0) { // Use the same mask, since tiles are squares. pred_mode_base += tiles_per_row; } } } } // Add green to blue and red channels (i.e. perform the inverse transform of // 'subtract green'). void VP8LAddGreenToBlueAndRed_C(const uint32_t* src, int num_pixels, uint32_t* dst) { int i; for (i = 0; i < num_pixels; ++i) { const uint32_t argb = src[i]; const uint32_t green = ((argb >> 8) & 0xff); uint32_t red_blue = (argb & 0x00ff00ffu); red_blue += (green << 16) | green; red_blue &= 0x00ff00ffu; dst[i] = (argb & 0xff00ff00u) | red_blue; } } static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) { return ((int)color_pred * color) >> 5; } static WEBP_INLINE void ColorCodeToMultipliers(uint32_t color_code, VP8LMultipliers* const m) { m->green_to_red_ = (color_code >> 0) & 0xff; m->green_to_blue_ = (color_code >> 8) & 0xff; m->red_to_blue_ = (color_code >> 16) & 0xff; } void VP8LTransformColorInverse_C(const VP8LMultipliers* const m, const uint32_t* src, int num_pixels, uint32_t* dst) { int i; for (i = 0; i < num_pixels; ++i) { const uint32_t argb = src[i]; const int8_t green = (int8_t)(argb >> 8); const uint32_t red = argb >> 16; int new_red = red & 0xff; int new_blue = argb & 0xff; new_red += ColorTransformDelta((int8_t)m->green_to_red_, green); new_red &= 0xff; new_blue += ColorTransformDelta((int8_t)m->green_to_blue_, green); new_blue += ColorTransformDelta((int8_t)m->red_to_blue_, (int8_t)new_red); new_blue &= 0xff; dst[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue); } } // Color space inverse transform. static void ColorSpaceInverseTransform_C(const VP8LTransform* const transform, int y_start, int y_end, const uint32_t* src, uint32_t* dst) { const int width = transform->xsize_; const int tile_width = 1 << transform->bits_; const int mask = tile_width - 1; const int safe_width = width & ~mask; const int remaining_width = width - safe_width; const int tiles_per_row = VP8LSubSampleSize(width, transform->bits_); int y = y_start; const uint32_t* pred_row = transform->data_ + (y >> transform->bits_) * tiles_per_row; while (y < y_end) { const uint32_t* pred = pred_row; VP8LMultipliers m = { 0, 0, 0 }; const uint32_t* const src_safe_end = src + safe_width; const uint32_t* const src_end = src + width; while (src < src_safe_end) { ColorCodeToMultipliers(*pred++, &m); VP8LTransformColorInverse(&m, src, tile_width, dst); src += tile_width; dst += tile_width; } if (src < src_end) { // Left-overs using C-version. ColorCodeToMultipliers(*pred++, &m); VP8LTransformColorInverse(&m, src, remaining_width, dst); src += remaining_width; dst += remaining_width; } ++y; if ((y & mask) == 0) pred_row += tiles_per_row; } } // Separate out pixels packed together using pixel-bundling. // We define two methods for ARGB data (uint32_t) and alpha-only data (uint8_t). #define COLOR_INDEX_INVERSE(FUNC_NAME, F_NAME, STATIC_DECL, TYPE, BIT_SUFFIX, \ GET_INDEX, GET_VALUE) \ static void F_NAME(const TYPE* src, const uint32_t* const color_map, \ TYPE* dst, int y_start, int y_end, int width) { \ int y; \ for (y = y_start; y < y_end; ++y) { \ int x; \ for (x = 0; x < width; ++x) { \ *dst++ = GET_VALUE(color_map[GET_INDEX(*src++)]); \ } \ } \ } \ STATIC_DECL void FUNC_NAME(const VP8LTransform* const transform, \ int y_start, int y_end, const TYPE* src, \ TYPE* dst) { \ int y; \ const int bits_per_pixel = 8 >> transform->bits_; \ const int width = transform->xsize_; \ const uint32_t* const color_map = transform->data_; \ if (bits_per_pixel < 8) { \ const int pixels_per_byte = 1 << transform->bits_; \ const int count_mask = pixels_per_byte - 1; \ const uint32_t bit_mask = (1 << bits_per_pixel) - 1; \ for (y = y_start; y < y_end; ++y) { \ uint32_t packed_pixels = 0; \ int x; \ for (x = 0; x < width; ++x) { \ /* We need to load fresh 'packed_pixels' once every */ \ /* 'pixels_per_byte' increments of x. Fortunately, pixels_per_byte */ \ /* is a power of 2, so can just use a mask for that, instead of */ \ /* decrementing a counter. */ \ if ((x & count_mask) == 0) packed_pixels = GET_INDEX(*src++); \ *dst++ = GET_VALUE(color_map[packed_pixels & bit_mask]); \ packed_pixels >>= bits_per_pixel; \ } \ } \ } else { \ VP8LMapColor##BIT_SUFFIX(src, color_map, dst, y_start, y_end, width); \ } \ } COLOR_INDEX_INVERSE(ColorIndexInverseTransform_C, MapARGB_C, static, uint32_t, 32b, VP8GetARGBIndex, VP8GetARGBValue) COLOR_INDEX_INVERSE(VP8LColorIndexInverseTransformAlpha, MapAlpha_C, , uint8_t, 8b, VP8GetAlphaIndex, VP8GetAlphaValue) #undef COLOR_INDEX_INVERSE void VP8LInverseTransform(const VP8LTransform* const transform, int row_start, int row_end, const uint32_t* const in, uint32_t* const out) { const int width = transform->xsize_; assert(row_start < row_end); assert(row_end <= transform->ysize_); switch (transform->type_) { case SUBTRACT_GREEN_TRANSFORM: VP8LAddGreenToBlueAndRed(in, (row_end - row_start) * width, out); break; case PREDICTOR_TRANSFORM: PredictorInverseTransform_C(transform, row_start, row_end, in, out); if (row_end != transform->ysize_) { // The last predicted row in this iteration will be the top-pred row // for the first row in next iteration. memcpy(out - width, out + (row_end - row_start - 1) * width, width * sizeof(*out)); } break; case CROSS_COLOR_TRANSFORM: ColorSpaceInverseTransform_C(transform, row_start, row_end, in, out); break; case COLOR_INDEXING_TRANSFORM: if (in == out && transform->bits_ > 0) { // Move packed pixels to the end of unpacked region, so that unpacking // can occur seamlessly. // Also, note that this is the only transform that applies on // the effective width of VP8LSubSampleSize(xsize_, bits_). All other // transforms work on effective width of xsize_. const int out_stride = (row_end - row_start) * width; const int in_stride = (row_end - row_start) * VP8LSubSampleSize(transform->xsize_, transform->bits_); uint32_t* const src = out + out_stride - in_stride; memmove(src, out, in_stride * sizeof(*src)); ColorIndexInverseTransform_C(transform, row_start, row_end, src, out); } else { ColorIndexInverseTransform_C(transform, row_start, row_end, in, out); } break; } } //------------------------------------------------------------------------------ // Color space conversion. static int is_big_endian(void) { static const union { uint16_t w; uint8_t b[2]; } tmp = { 1 }; return (tmp.b[0] != 1); } void VP8LConvertBGRAToRGB_C(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; *dst++ = (argb >> 16) & 0xff; *dst++ = (argb >> 8) & 0xff; *dst++ = (argb >> 0) & 0xff; } } void VP8LConvertBGRAToRGBA_C(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; *dst++ = (argb >> 16) & 0xff; *dst++ = (argb >> 8) & 0xff; *dst++ = (argb >> 0) & 0xff; *dst++ = (argb >> 24) & 0xff; } } void VP8LConvertBGRAToRGBA4444_C(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; const uint8_t rg = ((argb >> 16) & 0xf0) | ((argb >> 12) & 0xf); const uint8_t ba = ((argb >> 0) & 0xf0) | ((argb >> 28) & 0xf); #if (WEBP_SWAP_16BIT_CSP == 1) *dst++ = ba; *dst++ = rg; #else *dst++ = rg; *dst++ = ba; #endif } } void VP8LConvertBGRAToRGB565_C(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; const uint8_t rg = ((argb >> 16) & 0xf8) | ((argb >> 13) & 0x7); const uint8_t gb = ((argb >> 5) & 0xe0) | ((argb >> 3) & 0x1f); #if (WEBP_SWAP_16BIT_CSP == 1) *dst++ = gb; *dst++ = rg; #else *dst++ = rg; *dst++ = gb; #endif } } void VP8LConvertBGRAToBGR_C(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; *dst++ = (argb >> 0) & 0xff; *dst++ = (argb >> 8) & 0xff; *dst++ = (argb >> 16) & 0xff; } } static void CopyOrSwap(const uint32_t* src, int num_pixels, uint8_t* dst, int swap_on_big_endian) { if (is_big_endian() == swap_on_big_endian) { const uint32_t* const src_end = src + num_pixels; while (src < src_end) { const uint32_t argb = *src++; WebPUint32ToMem(dst, BSwap32(argb)); dst += sizeof(argb); } } else { memcpy(dst, src, num_pixels * sizeof(*src)); } } void VP8LConvertFromBGRA(const uint32_t* const in_data, int num_pixels, WEBP_CSP_MODE out_colorspace, uint8_t* const rgba) { switch (out_colorspace) { case MODE_RGB: VP8LConvertBGRAToRGB(in_data, num_pixels, rgba); break; case MODE_RGBA: VP8LConvertBGRAToRGBA(in_data, num_pixels, rgba); break; case MODE_rgbA: VP8LConvertBGRAToRGBA(in_data, num_pixels, rgba); WebPApplyAlphaMultiply(rgba, 0, num_pixels, 1, 0); break; case MODE_BGR: VP8LConvertBGRAToBGR(in_data, num_pixels, rgba); break; case MODE_BGRA: CopyOrSwap(in_data, num_pixels, rgba, 1); break; case MODE_bgrA: CopyOrSwap(in_data, num_pixels, rgba, 1); WebPApplyAlphaMultiply(rgba, 0, num_pixels, 1, 0); break; case MODE_ARGB: CopyOrSwap(in_data, num_pixels, rgba, 0); break; case MODE_Argb: CopyOrSwap(in_data, num_pixels, rgba, 0); WebPApplyAlphaMultiply(rgba, 1, num_pixels, 1, 0); break; case MODE_RGBA_4444: VP8LConvertBGRAToRGBA4444(in_data, num_pixels, rgba); break; case MODE_rgbA_4444: VP8LConvertBGRAToRGBA4444(in_data, num_pixels, rgba); WebPApplyAlphaMultiply4444(rgba, num_pixels, 1, 0); break; case MODE_RGB_565: VP8LConvertBGRAToRGB565(in_data, num_pixels, rgba); break; default: assert(0); // Code flow should not reach here. } } //------------------------------------------------------------------------------ VP8LProcessDecBlueAndRedFunc VP8LAddGreenToBlueAndRed; VP8LPredictorAddSubFunc VP8LPredictorsAdd[16]; VP8LPredictorFunc VP8LPredictors[16]; // exposed plain-C implementations VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16]; VP8LTransformColorInverseFunc VP8LTransformColorInverse; VP8LConvertFunc VP8LConvertBGRAToRGB; VP8LConvertFunc VP8LConvertBGRAToRGBA; VP8LConvertFunc VP8LConvertBGRAToRGBA4444; VP8LConvertFunc VP8LConvertBGRAToRGB565; VP8LConvertFunc VP8LConvertBGRAToBGR; VP8LMapARGBFunc VP8LMapColor32b; VP8LMapAlphaFunc VP8LMapColor8b; extern VP8CPUInfo VP8GetCPUInfo; extern void VP8LDspInitSSE2(void); extern void VP8LDspInitSSE41(void); extern void VP8LDspInitNEON(void); extern void VP8LDspInitMIPSdspR2(void); extern void VP8LDspInitMSA(void); #define COPY_PREDICTOR_ARRAY(IN, OUT) do { \ (OUT)[0] = IN##0_C; \ (OUT)[1] = IN##1_C; \ (OUT)[2] = IN##2_C; \ (OUT)[3] = IN##3_C; \ (OUT)[4] = IN##4_C; \ (OUT)[5] = IN##5_C; \ (OUT)[6] = IN##6_C; \ (OUT)[7] = IN##7_C; \ (OUT)[8] = IN##8_C; \ (OUT)[9] = IN##9_C; \ (OUT)[10] = IN##10_C; \ (OUT)[11] = IN##11_C; \ (OUT)[12] = IN##12_C; \ (OUT)[13] = IN##13_C; \ (OUT)[14] = IN##0_C; /* <- padding security sentinels*/ \ (OUT)[15] = IN##0_C; \ } while (0); WEBP_DSP_INIT_FUNC(VP8LDspInit) { COPY_PREDICTOR_ARRAY(VP8LPredictor, VP8LPredictors) COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd) COPY_PREDICTOR_ARRAY(PredictorAdd, VP8LPredictorsAdd_C) #if !WEBP_NEON_OMIT_C_CODE VP8LAddGreenToBlueAndRed = VP8LAddGreenToBlueAndRed_C; VP8LTransformColorInverse = VP8LTransformColorInverse_C; VP8LConvertBGRAToRGBA = VP8LConvertBGRAToRGBA_C; VP8LConvertBGRAToRGB = VP8LConvertBGRAToRGB_C; VP8LConvertBGRAToBGR = VP8LConvertBGRAToBGR_C; #endif VP8LConvertBGRAToRGBA4444 = VP8LConvertBGRAToRGBA4444_C; VP8LConvertBGRAToRGB565 = VP8LConvertBGRAToRGB565_C; VP8LMapColor32b = MapARGB_C; VP8LMapColor8b = MapAlpha_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8LDspInitSSE2(); #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { VP8LDspInitSSE41(); } #endif } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8LDspInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { VP8LDspInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { VP8LDspInitNEON(); } #endif assert(VP8LAddGreenToBlueAndRed != NULL); assert(VP8LTransformColorInverse != NULL); assert(VP8LConvertBGRAToRGBA != NULL); assert(VP8LConvertBGRAToRGB != NULL); assert(VP8LConvertBGRAToBGR != NULL); assert(VP8LConvertBGRAToRGBA4444 != NULL); assert(VP8LConvertBGRAToRGB565 != NULL); assert(VP8LMapColor32b != NULL); assert(VP8LMapColor8b != NULL); } #undef COPY_PREDICTOR_ARRAY //------------------------------------------------------------------------------ libwebp-1.4.0/src/dsp/dec_sse41.c0000644000014400001440000000250014606317060013343 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE4 version of some decoding functions. // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include #include "src/dec/vp8i_dec.h" #include "src/utils/utils.h" static void HE16_SSE41(uint8_t* dst) { // horizontal int j; const __m128i kShuffle3 = _mm_set1_epi8(3); for (j = 16; j > 0; --j) { const __m128i in = _mm_cvtsi32_si128(WebPMemToInt32(dst - 4)); const __m128i values = _mm_shuffle_epi8(in, kShuffle3); _mm_storeu_si128((__m128i*)dst, values); dst += BPS; } } //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitSSE41(void) { VP8PredLuma16[3] = HE16_SSE41; } #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(VP8DspInitSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/dec_sse2.c0000644000014400001440000013500214606317060013264 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 version of some decoding functions (idct, loop filtering). // // Author: somnath@google.com (Somnath Banerjee) // cduvivier@google.com (Christian Duvivier) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) // The 3-coeff sparse transform in SSE2 is not really faster than the plain-C // one it seems => disable it by default. Uncomment the following to enable: #if !defined(USE_TRANSFORM_AC3) #define USE_TRANSFORM_AC3 0 // ALTERNATE_CODE #endif #include #include "src/dsp/common_sse2.h" #include "src/dec/vp8i_dec.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Transforms (Paragraph 14.4) static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) { // This implementation makes use of 16-bit fixed point versions of two // multiply constants: // K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16 // K2 = sqrt(2) * sin (pi/8) ~= 35468 / 2^16 // // To be able to use signed 16-bit integers, we use the following trick to // have constants within range: // - Associated constants are obtained by subtracting the 16-bit fixed point // version of one: // k = K - (1 << 16) => K = k + (1 << 16) // K1 = 85267 => k1 = 20091 // K2 = 35468 => k2 = -30068 // - The multiplication of a variable by a constant become the sum of the // variable and the multiplication of that variable by the associated // constant: // (x * K) >> 16 = (x * (k + (1 << 16))) >> 16 = ((x * k ) >> 16) + x const __m128i k1 = _mm_set1_epi16(20091); const __m128i k2 = _mm_set1_epi16(-30068); __m128i T0, T1, T2, T3; // Load and concatenate the transform coefficients (we'll do two transforms // in parallel). In the case of only one transform, the second half of the // vectors will just contain random value we'll never use nor store. __m128i in0, in1, in2, in3; { in0 = _mm_loadl_epi64((const __m128i*)&in[0]); in1 = _mm_loadl_epi64((const __m128i*)&in[4]); in2 = _mm_loadl_epi64((const __m128i*)&in[8]); in3 = _mm_loadl_epi64((const __m128i*)&in[12]); // a00 a10 a20 a30 x x x x // a01 a11 a21 a31 x x x x // a02 a12 a22 a32 x x x x // a03 a13 a23 a33 x x x x if (do_two) { const __m128i inB0 = _mm_loadl_epi64((const __m128i*)&in[16]); const __m128i inB1 = _mm_loadl_epi64((const __m128i*)&in[20]); const __m128i inB2 = _mm_loadl_epi64((const __m128i*)&in[24]); const __m128i inB3 = _mm_loadl_epi64((const __m128i*)&in[28]); in0 = _mm_unpacklo_epi64(in0, inB0); in1 = _mm_unpacklo_epi64(in1, inB1); in2 = _mm_unpacklo_epi64(in2, inB2); in3 = _mm_unpacklo_epi64(in3, inB3); // a00 a10 a20 a30 b00 b10 b20 b30 // a01 a11 a21 a31 b01 b11 b21 b31 // a02 a12 a22 a32 b02 b12 b22 b32 // a03 a13 a23 a33 b03 b13 b23 b33 } } // Vertical pass and subsequent transpose. { // First pass, c and d calculations are longer because of the "trick" // multiplications. const __m128i a = _mm_add_epi16(in0, in2); const __m128i b = _mm_sub_epi16(in0, in2); // c = MUL(in1, K2) - MUL(in3, K1) = MUL(in1, k2) - MUL(in3, k1) + in1 - in3 const __m128i c1 = _mm_mulhi_epi16(in1, k2); const __m128i c2 = _mm_mulhi_epi16(in3, k1); const __m128i c3 = _mm_sub_epi16(in1, in3); const __m128i c4 = _mm_sub_epi16(c1, c2); const __m128i c = _mm_add_epi16(c3, c4); // d = MUL(in1, K1) + MUL(in3, K2) = MUL(in1, k1) + MUL(in3, k2) + in1 + in3 const __m128i d1 = _mm_mulhi_epi16(in1, k1); const __m128i d2 = _mm_mulhi_epi16(in3, k2); const __m128i d3 = _mm_add_epi16(in1, in3); const __m128i d4 = _mm_add_epi16(d1, d2); const __m128i d = _mm_add_epi16(d3, d4); // Second pass. const __m128i tmp0 = _mm_add_epi16(a, d); const __m128i tmp1 = _mm_add_epi16(b, c); const __m128i tmp2 = _mm_sub_epi16(b, c); const __m128i tmp3 = _mm_sub_epi16(a, d); // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&tmp0, &tmp1, &tmp2, &tmp3, &T0, &T1, &T2, &T3); } // Horizontal pass and subsequent transpose. { // First pass, c and d calculations are longer because of the "trick" // multiplications. const __m128i four = _mm_set1_epi16(4); const __m128i dc = _mm_add_epi16(T0, four); const __m128i a = _mm_add_epi16(dc, T2); const __m128i b = _mm_sub_epi16(dc, T2); // c = MUL(T1, K2) - MUL(T3, K1) = MUL(T1, k2) - MUL(T3, k1) + T1 - T3 const __m128i c1 = _mm_mulhi_epi16(T1, k2); const __m128i c2 = _mm_mulhi_epi16(T3, k1); const __m128i c3 = _mm_sub_epi16(T1, T3); const __m128i c4 = _mm_sub_epi16(c1, c2); const __m128i c = _mm_add_epi16(c3, c4); // d = MUL(T1, K1) + MUL(T3, K2) = MUL(T1, k1) + MUL(T3, k2) + T1 + T3 const __m128i d1 = _mm_mulhi_epi16(T1, k1); const __m128i d2 = _mm_mulhi_epi16(T3, k2); const __m128i d3 = _mm_add_epi16(T1, T3); const __m128i d4 = _mm_add_epi16(d1, d2); const __m128i d = _mm_add_epi16(d3, d4); // Second pass. const __m128i tmp0 = _mm_add_epi16(a, d); const __m128i tmp1 = _mm_add_epi16(b, c); const __m128i tmp2 = _mm_sub_epi16(b, c); const __m128i tmp3 = _mm_sub_epi16(a, d); const __m128i shifted0 = _mm_srai_epi16(tmp0, 3); const __m128i shifted1 = _mm_srai_epi16(tmp1, 3); const __m128i shifted2 = _mm_srai_epi16(tmp2, 3); const __m128i shifted3 = _mm_srai_epi16(tmp3, 3); // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&shifted0, &shifted1, &shifted2, &shifted3, &T0, &T1, &T2, &T3); } // Add inverse transform to 'dst' and store. { const __m128i zero = _mm_setzero_si128(); // Load the reference(s). __m128i dst0, dst1, dst2, dst3; if (do_two) { // Load eight bytes/pixels per line. dst0 = _mm_loadl_epi64((__m128i*)(dst + 0 * BPS)); dst1 = _mm_loadl_epi64((__m128i*)(dst + 1 * BPS)); dst2 = _mm_loadl_epi64((__m128i*)(dst + 2 * BPS)); dst3 = _mm_loadl_epi64((__m128i*)(dst + 3 * BPS)); } else { // Load four bytes/pixels per line. dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS)); dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS)); dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS)); dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS)); } // Convert to 16b. dst0 = _mm_unpacklo_epi8(dst0, zero); dst1 = _mm_unpacklo_epi8(dst1, zero); dst2 = _mm_unpacklo_epi8(dst2, zero); dst3 = _mm_unpacklo_epi8(dst3, zero); // Add the inverse transform(s). dst0 = _mm_add_epi16(dst0, T0); dst1 = _mm_add_epi16(dst1, T1); dst2 = _mm_add_epi16(dst2, T2); dst3 = _mm_add_epi16(dst3, T3); // Unsigned saturate to 8b. dst0 = _mm_packus_epi16(dst0, dst0); dst1 = _mm_packus_epi16(dst1, dst1); dst2 = _mm_packus_epi16(dst2, dst2); dst3 = _mm_packus_epi16(dst3, dst3); // Store the results. if (do_two) { // Store eight bytes/pixels per line. _mm_storel_epi64((__m128i*)(dst + 0 * BPS), dst0); _mm_storel_epi64((__m128i*)(dst + 1 * BPS), dst1); _mm_storel_epi64((__m128i*)(dst + 2 * BPS), dst2); _mm_storel_epi64((__m128i*)(dst + 3 * BPS), dst3); } else { // Store four bytes/pixels per line. WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); } } } #if (USE_TRANSFORM_AC3 == 1) static void TransformAC3(const int16_t* in, uint8_t* dst) { const __m128i A = _mm_set1_epi16(in[0] + 4); const __m128i c4 = _mm_set1_epi16(WEBP_TRANSFORM_AC3_MUL2(in[4])); const __m128i d4 = _mm_set1_epi16(WEBP_TRANSFORM_AC3_MUL1(in[4])); const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]); const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]); const __m128i CD = _mm_set_epi16(0, 0, 0, 0, -d1, -c1, c1, d1); const __m128i B = _mm_adds_epi16(A, CD); const __m128i m0 = _mm_adds_epi16(B, d4); const __m128i m1 = _mm_adds_epi16(B, c4); const __m128i m2 = _mm_subs_epi16(B, c4); const __m128i m3 = _mm_subs_epi16(B, d4); const __m128i zero = _mm_setzero_si128(); // Load the source pixels. __m128i dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS)); __m128i dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS)); __m128i dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS)); __m128i dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS)); // Convert to 16b. dst0 = _mm_unpacklo_epi8(dst0, zero); dst1 = _mm_unpacklo_epi8(dst1, zero); dst2 = _mm_unpacklo_epi8(dst2, zero); dst3 = _mm_unpacklo_epi8(dst3, zero); // Add the inverse transform. dst0 = _mm_adds_epi16(dst0, _mm_srai_epi16(m0, 3)); dst1 = _mm_adds_epi16(dst1, _mm_srai_epi16(m1, 3)); dst2 = _mm_adds_epi16(dst2, _mm_srai_epi16(m2, 3)); dst3 = _mm_adds_epi16(dst3, _mm_srai_epi16(m3, 3)); // Unsigned saturate to 8b. dst0 = _mm_packus_epi16(dst0, dst0); dst1 = _mm_packus_epi16(dst1, dst1); dst2 = _mm_packus_epi16(dst2, dst2); dst3 = _mm_packus_epi16(dst3, dst3); // Store the results. WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); } #endif // USE_TRANSFORM_AC3 //------------------------------------------------------------------------------ // Loop Filter (Paragraph 15) // Compute abs(p - q) = subs(p - q) OR subs(q - p) #define MM_ABS(p, q) _mm_or_si128( \ _mm_subs_epu8((q), (p)), \ _mm_subs_epu8((p), (q))) // Shift each byte of "x" by 3 bits while preserving by the sign bit. static WEBP_INLINE void SignedShift8b_SSE2(__m128i* const x) { const __m128i zero = _mm_setzero_si128(); const __m128i lo_0 = _mm_unpacklo_epi8(zero, *x); const __m128i hi_0 = _mm_unpackhi_epi8(zero, *x); const __m128i lo_1 = _mm_srai_epi16(lo_0, 3 + 8); const __m128i hi_1 = _mm_srai_epi16(hi_0, 3 + 8); *x = _mm_packs_epi16(lo_1, hi_1); } #define FLIP_SIGN_BIT2(a, b) do { \ (a) = _mm_xor_si128(a, sign_bit); \ (b) = _mm_xor_si128(b, sign_bit); \ } while (0) #define FLIP_SIGN_BIT4(a, b, c, d) do { \ FLIP_SIGN_BIT2(a, b); \ FLIP_SIGN_BIT2(c, d); \ } while (0) // input/output is uint8_t static WEBP_INLINE void GetNotHEV_SSE2(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, int hev_thresh, __m128i* const not_hev) { const __m128i zero = _mm_setzero_si128(); const __m128i t_1 = MM_ABS(*p1, *p0); const __m128i t_2 = MM_ABS(*q1, *q0); const __m128i h = _mm_set1_epi8(hev_thresh); const __m128i t_max = _mm_max_epu8(t_1, t_2); const __m128i t_max_h = _mm_subs_epu8(t_max, h); *not_hev = _mm_cmpeq_epi8(t_max_h, zero); // not_hev <= t1 && not_hev <= t2 } // input pixels are int8_t static WEBP_INLINE void GetBaseDelta_SSE2(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, __m128i* const delta) { // beware of addition order, for saturation! const __m128i p1_q1 = _mm_subs_epi8(*p1, *q1); // p1 - q1 const __m128i q0_p0 = _mm_subs_epi8(*q0, *p0); // q0 - p0 const __m128i s1 = _mm_adds_epi8(p1_q1, q0_p0); // p1 - q1 + 1 * (q0 - p0) const __m128i s2 = _mm_adds_epi8(q0_p0, s1); // p1 - q1 + 2 * (q0 - p0) const __m128i s3 = _mm_adds_epi8(q0_p0, s2); // p1 - q1 + 3 * (q0 - p0) *delta = s3; } // input and output are int8_t static WEBP_INLINE void DoSimpleFilter_SSE2(__m128i* const p0, __m128i* const q0, const __m128i* const fl) { const __m128i k3 = _mm_set1_epi8(3); const __m128i k4 = _mm_set1_epi8(4); __m128i v3 = _mm_adds_epi8(*fl, k3); __m128i v4 = _mm_adds_epi8(*fl, k4); SignedShift8b_SSE2(&v4); // v4 >> 3 SignedShift8b_SSE2(&v3); // v3 >> 3 *q0 = _mm_subs_epi8(*q0, v4); // q0 -= v4 *p0 = _mm_adds_epi8(*p0, v3); // p0 += v3 } // Updates values of 2 pixels at MB edge during complex filtering. // Update operations: // q = q - delta and p = p + delta; where delta = [(a_hi >> 7), (a_lo >> 7)] // Pixels 'pi' and 'qi' are int8_t on input, uint8_t on output (sign flip). static WEBP_INLINE void Update2Pixels_SSE2(__m128i* const pi, __m128i* const qi, const __m128i* const a0_lo, const __m128i* const a0_hi) { const __m128i a1_lo = _mm_srai_epi16(*a0_lo, 7); const __m128i a1_hi = _mm_srai_epi16(*a0_hi, 7); const __m128i delta = _mm_packs_epi16(a1_lo, a1_hi); const __m128i sign_bit = _mm_set1_epi8((char)0x80); *pi = _mm_adds_epi8(*pi, delta); *qi = _mm_subs_epi8(*qi, delta); FLIP_SIGN_BIT2(*pi, *qi); } // input pixels are uint8_t static WEBP_INLINE void NeedsFilter_SSE2(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, int thresh, __m128i* const mask) { const __m128i m_thresh = _mm_set1_epi8((char)thresh); const __m128i t1 = MM_ABS(*p1, *q1); // abs(p1 - q1) const __m128i kFE = _mm_set1_epi8((char)0xFE); const __m128i t2 = _mm_and_si128(t1, kFE); // set lsb of each byte to zero const __m128i t3 = _mm_srli_epi16(t2, 1); // abs(p1 - q1) / 2 const __m128i t4 = MM_ABS(*p0, *q0); // abs(p0 - q0) const __m128i t5 = _mm_adds_epu8(t4, t4); // abs(p0 - q0) * 2 const __m128i t6 = _mm_adds_epu8(t5, t3); // abs(p0-q0)*2 + abs(p1-q1)/2 const __m128i t7 = _mm_subs_epu8(t6, m_thresh); // mask <= m_thresh *mask = _mm_cmpeq_epi8(t7, _mm_setzero_si128()); } //------------------------------------------------------------------------------ // Edge filtering functions // Applies filter on 2 pixels (p0 and q0) static WEBP_INLINE void DoFilter2_SSE2(__m128i* const p1, __m128i* const p0, __m128i* const q0, __m128i* const q1, int thresh) { __m128i a, mask; const __m128i sign_bit = _mm_set1_epi8((char)0x80); // convert p1/q1 to int8_t (for GetBaseDelta_SSE2) const __m128i p1s = _mm_xor_si128(*p1, sign_bit); const __m128i q1s = _mm_xor_si128(*q1, sign_bit); NeedsFilter_SSE2(p1, p0, q0, q1, thresh, &mask); FLIP_SIGN_BIT2(*p0, *q0); GetBaseDelta_SSE2(&p1s, p0, q0, &q1s, &a); a = _mm_and_si128(a, mask); // mask filter values we don't care about DoSimpleFilter_SSE2(p0, q0, &a); FLIP_SIGN_BIT2(*p0, *q0); } // Applies filter on 4 pixels (p1, p0, q0 and q1) static WEBP_INLINE void DoFilter4_SSE2(__m128i* const p1, __m128i* const p0, __m128i* const q0, __m128i* const q1, const __m128i* const mask, int hev_thresh) { const __m128i zero = _mm_setzero_si128(); const __m128i sign_bit = _mm_set1_epi8((char)0x80); const __m128i k64 = _mm_set1_epi8(64); const __m128i k3 = _mm_set1_epi8(3); const __m128i k4 = _mm_set1_epi8(4); __m128i not_hev; __m128i t1, t2, t3; // compute hev mask GetNotHEV_SSE2(p1, p0, q0, q1, hev_thresh, ¬_hev); // convert to signed values FLIP_SIGN_BIT4(*p1, *p0, *q0, *q1); t1 = _mm_subs_epi8(*p1, *q1); // p1 - q1 t1 = _mm_andnot_si128(not_hev, t1); // hev(p1 - q1) t2 = _mm_subs_epi8(*q0, *p0); // q0 - p0 t1 = _mm_adds_epi8(t1, t2); // hev(p1 - q1) + 1 * (q0 - p0) t1 = _mm_adds_epi8(t1, t2); // hev(p1 - q1) + 2 * (q0 - p0) t1 = _mm_adds_epi8(t1, t2); // hev(p1 - q1) + 3 * (q0 - p0) t1 = _mm_and_si128(t1, *mask); // mask filter values we don't care about t2 = _mm_adds_epi8(t1, k3); // 3 * (q0 - p0) + hev(p1 - q1) + 3 t3 = _mm_adds_epi8(t1, k4); // 3 * (q0 - p0) + hev(p1 - q1) + 4 SignedShift8b_SSE2(&t2); // (3 * (q0 - p0) + hev(p1 - q1) + 3) >> 3 SignedShift8b_SSE2(&t3); // (3 * (q0 - p0) + hev(p1 - q1) + 4) >> 3 *p0 = _mm_adds_epi8(*p0, t2); // p0 += t2 *q0 = _mm_subs_epi8(*q0, t3); // q0 -= t3 FLIP_SIGN_BIT2(*p0, *q0); // this is equivalent to signed (a + 1) >> 1 calculation t2 = _mm_add_epi8(t3, sign_bit); t3 = _mm_avg_epu8(t2, zero); t3 = _mm_sub_epi8(t3, k64); t3 = _mm_and_si128(not_hev, t3); // if !hev *q1 = _mm_subs_epi8(*q1, t3); // q1 -= t3 *p1 = _mm_adds_epi8(*p1, t3); // p1 += t3 FLIP_SIGN_BIT2(*p1, *q1); } // Applies filter on 6 pixels (p2, p1, p0, q0, q1 and q2) static WEBP_INLINE void DoFilter6_SSE2(__m128i* const p2, __m128i* const p1, __m128i* const p0, __m128i* const q0, __m128i* const q1, __m128i* const q2, const __m128i* const mask, int hev_thresh) { const __m128i zero = _mm_setzero_si128(); const __m128i sign_bit = _mm_set1_epi8((char)0x80); __m128i a, not_hev; // compute hev mask GetNotHEV_SSE2(p1, p0, q0, q1, hev_thresh, ¬_hev); FLIP_SIGN_BIT4(*p1, *p0, *q0, *q1); FLIP_SIGN_BIT2(*p2, *q2); GetBaseDelta_SSE2(p1, p0, q0, q1, &a); { // do simple filter on pixels with hev const __m128i m = _mm_andnot_si128(not_hev, *mask); const __m128i f = _mm_and_si128(a, m); DoSimpleFilter_SSE2(p0, q0, &f); } { // do strong filter on pixels with not hev const __m128i k9 = _mm_set1_epi16(0x0900); const __m128i k63 = _mm_set1_epi16(63); const __m128i m = _mm_and_si128(not_hev, *mask); const __m128i f = _mm_and_si128(a, m); const __m128i f_lo = _mm_unpacklo_epi8(zero, f); const __m128i f_hi = _mm_unpackhi_epi8(zero, f); const __m128i f9_lo = _mm_mulhi_epi16(f_lo, k9); // Filter (lo) * 9 const __m128i f9_hi = _mm_mulhi_epi16(f_hi, k9); // Filter (hi) * 9 const __m128i a2_lo = _mm_add_epi16(f9_lo, k63); // Filter * 9 + 63 const __m128i a2_hi = _mm_add_epi16(f9_hi, k63); // Filter * 9 + 63 const __m128i a1_lo = _mm_add_epi16(a2_lo, f9_lo); // Filter * 18 + 63 const __m128i a1_hi = _mm_add_epi16(a2_hi, f9_hi); // Filter * 18 + 63 const __m128i a0_lo = _mm_add_epi16(a1_lo, f9_lo); // Filter * 27 + 63 const __m128i a0_hi = _mm_add_epi16(a1_hi, f9_hi); // Filter * 27 + 63 Update2Pixels_SSE2(p2, q2, &a2_lo, &a2_hi); Update2Pixels_SSE2(p1, q1, &a1_lo, &a1_hi); Update2Pixels_SSE2(p0, q0, &a0_lo, &a0_hi); } } // reads 8 rows across a vertical edge. static WEBP_INLINE void Load8x4_SSE2(const uint8_t* const b, int stride, __m128i* const p, __m128i* const q) { // A0 = 63 62 61 60 23 22 21 20 43 42 41 40 03 02 01 00 // A1 = 73 72 71 70 33 32 31 30 53 52 51 50 13 12 11 10 const __m128i A0 = _mm_set_epi32( WebPMemToInt32(&b[6 * stride]), WebPMemToInt32(&b[2 * stride]), WebPMemToInt32(&b[4 * stride]), WebPMemToInt32(&b[0 * stride])); const __m128i A1 = _mm_set_epi32( WebPMemToInt32(&b[7 * stride]), WebPMemToInt32(&b[3 * stride]), WebPMemToInt32(&b[5 * stride]), WebPMemToInt32(&b[1 * stride])); // B0 = 53 43 52 42 51 41 50 40 13 03 12 02 11 01 10 00 // B1 = 73 63 72 62 71 61 70 60 33 23 32 22 31 21 30 20 const __m128i B0 = _mm_unpacklo_epi8(A0, A1); const __m128i B1 = _mm_unpackhi_epi8(A0, A1); // C0 = 33 23 13 03 32 22 12 02 31 21 11 01 30 20 10 00 // C1 = 73 63 53 43 72 62 52 42 71 61 51 41 70 60 50 40 const __m128i C0 = _mm_unpacklo_epi16(B0, B1); const __m128i C1 = _mm_unpackhi_epi16(B0, B1); // *p = 71 61 51 41 31 21 11 01 70 60 50 40 30 20 10 00 // *q = 73 63 53 43 33 23 13 03 72 62 52 42 32 22 12 02 *p = _mm_unpacklo_epi32(C0, C1); *q = _mm_unpackhi_epi32(C0, C1); } static WEBP_INLINE void Load16x4_SSE2(const uint8_t* const r0, const uint8_t* const r8, int stride, __m128i* const p1, __m128i* const p0, __m128i* const q0, __m128i* const q1) { // Assume the pixels around the edge (|) are numbered as follows // 00 01 | 02 03 // 10 11 | 12 13 // ... | ... // e0 e1 | e2 e3 // f0 f1 | f2 f3 // // r0 is pointing to the 0th row (00) // r8 is pointing to the 8th row (80) // Load // p1 = 71 61 51 41 31 21 11 01 70 60 50 40 30 20 10 00 // q0 = 73 63 53 43 33 23 13 03 72 62 52 42 32 22 12 02 // p0 = f1 e1 d1 c1 b1 a1 91 81 f0 e0 d0 c0 b0 a0 90 80 // q1 = f3 e3 d3 c3 b3 a3 93 83 f2 e2 d2 c2 b2 a2 92 82 Load8x4_SSE2(r0, stride, p1, q0); Load8x4_SSE2(r8, stride, p0, q1); { // p1 = f0 e0 d0 c0 b0 a0 90 80 70 60 50 40 30 20 10 00 // p0 = f1 e1 d1 c1 b1 a1 91 81 71 61 51 41 31 21 11 01 // q0 = f2 e2 d2 c2 b2 a2 92 82 72 62 52 42 32 22 12 02 // q1 = f3 e3 d3 c3 b3 a3 93 83 73 63 53 43 33 23 13 03 const __m128i t1 = *p1; const __m128i t2 = *q0; *p1 = _mm_unpacklo_epi64(t1, *p0); *p0 = _mm_unpackhi_epi64(t1, *p0); *q0 = _mm_unpacklo_epi64(t2, *q1); *q1 = _mm_unpackhi_epi64(t2, *q1); } } static WEBP_INLINE void Store4x4_SSE2(__m128i* const x, uint8_t* dst, int stride) { int i; for (i = 0; i < 4; ++i, dst += stride) { WebPInt32ToMem(dst, _mm_cvtsi128_si32(*x)); *x = _mm_srli_si128(*x, 4); } } // Transpose back and store static WEBP_INLINE void Store16x4_SSE2(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, uint8_t* r0, uint8_t* r8, int stride) { __m128i t1, p1_s, p0_s, q0_s, q1_s; // p0 = 71 70 61 60 51 50 41 40 31 30 21 20 11 10 01 00 // p1 = f1 f0 e1 e0 d1 d0 c1 c0 b1 b0 a1 a0 91 90 81 80 t1 = *p0; p0_s = _mm_unpacklo_epi8(*p1, t1); p1_s = _mm_unpackhi_epi8(*p1, t1); // q0 = 73 72 63 62 53 52 43 42 33 32 23 22 13 12 03 02 // q1 = f3 f2 e3 e2 d3 d2 c3 c2 b3 b2 a3 a2 93 92 83 82 t1 = *q0; q0_s = _mm_unpacklo_epi8(t1, *q1); q1_s = _mm_unpackhi_epi8(t1, *q1); // p0 = 33 32 31 30 23 22 21 20 13 12 11 10 03 02 01 00 // q0 = 73 72 71 70 63 62 61 60 53 52 51 50 43 42 41 40 t1 = p0_s; p0_s = _mm_unpacklo_epi16(t1, q0_s); q0_s = _mm_unpackhi_epi16(t1, q0_s); // p1 = b3 b2 b1 b0 a3 a2 a1 a0 93 92 91 90 83 82 81 80 // q1 = f3 f2 f1 f0 e3 e2 e1 e0 d3 d2 d1 d0 c3 c2 c1 c0 t1 = p1_s; p1_s = _mm_unpacklo_epi16(t1, q1_s); q1_s = _mm_unpackhi_epi16(t1, q1_s); Store4x4_SSE2(&p0_s, r0, stride); r0 += 4 * stride; Store4x4_SSE2(&q0_s, r0, stride); Store4x4_SSE2(&p1_s, r8, stride); r8 += 4 * stride; Store4x4_SSE2(&q1_s, r8, stride); } //------------------------------------------------------------------------------ // Simple In-loop filtering (Paragraph 15.2) static void SimpleVFilter16_SSE2(uint8_t* p, int stride, int thresh) { // Load __m128i p1 = _mm_loadu_si128((__m128i*)&p[-2 * stride]); __m128i p0 = _mm_loadu_si128((__m128i*)&p[-stride]); __m128i q0 = _mm_loadu_si128((__m128i*)&p[0]); __m128i q1 = _mm_loadu_si128((__m128i*)&p[stride]); DoFilter2_SSE2(&p1, &p0, &q0, &q1, thresh); // Store _mm_storeu_si128((__m128i*)&p[-stride], p0); _mm_storeu_si128((__m128i*)&p[0], q0); } static void SimpleHFilter16_SSE2(uint8_t* p, int stride, int thresh) { __m128i p1, p0, q0, q1; p -= 2; // beginning of p1 Load16x4_SSE2(p, p + 8 * stride, stride, &p1, &p0, &q0, &q1); DoFilter2_SSE2(&p1, &p0, &q0, &q1, thresh); Store16x4_SSE2(&p1, &p0, &q0, &q1, p, p + 8 * stride, stride); } static void SimpleVFilter16i_SSE2(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; SimpleVFilter16_SSE2(p, stride, thresh); } } static void SimpleHFilter16i_SSE2(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4; SimpleHFilter16_SSE2(p, stride, thresh); } } //------------------------------------------------------------------------------ // Complex In-loop filtering (Paragraph 15.3) #define MAX_DIFF1(p3, p2, p1, p0, m) do { \ (m) = MM_ABS(p1, p0); \ (m) = _mm_max_epu8(m, MM_ABS(p3, p2)); \ (m) = _mm_max_epu8(m, MM_ABS(p2, p1)); \ } while (0) #define MAX_DIFF2(p3, p2, p1, p0, m) do { \ (m) = _mm_max_epu8(m, MM_ABS(p1, p0)); \ (m) = _mm_max_epu8(m, MM_ABS(p3, p2)); \ (m) = _mm_max_epu8(m, MM_ABS(p2, p1)); \ } while (0) #define LOAD_H_EDGES4(p, stride, e1, e2, e3, e4) do { \ (e1) = _mm_loadu_si128((__m128i*)&(p)[0 * (stride)]); \ (e2) = _mm_loadu_si128((__m128i*)&(p)[1 * (stride)]); \ (e3) = _mm_loadu_si128((__m128i*)&(p)[2 * (stride)]); \ (e4) = _mm_loadu_si128((__m128i*)&(p)[3 * (stride)]); \ } while (0) #define LOADUV_H_EDGE(p, u, v, stride) do { \ const __m128i U = _mm_loadl_epi64((__m128i*)&(u)[(stride)]); \ const __m128i V = _mm_loadl_epi64((__m128i*)&(v)[(stride)]); \ (p) = _mm_unpacklo_epi64(U, V); \ } while (0) #define LOADUV_H_EDGES4(u, v, stride, e1, e2, e3, e4) do { \ LOADUV_H_EDGE(e1, u, v, 0 * (stride)); \ LOADUV_H_EDGE(e2, u, v, 1 * (stride)); \ LOADUV_H_EDGE(e3, u, v, 2 * (stride)); \ LOADUV_H_EDGE(e4, u, v, 3 * (stride)); \ } while (0) #define STOREUV(p, u, v, stride) do { \ _mm_storel_epi64((__m128i*)&(u)[(stride)], p); \ (p) = _mm_srli_si128(p, 8); \ _mm_storel_epi64((__m128i*)&(v)[(stride)], p); \ } while (0) static WEBP_INLINE void ComplexMask_SSE2(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, int thresh, int ithresh, __m128i* const mask) { const __m128i it = _mm_set1_epi8(ithresh); const __m128i diff = _mm_subs_epu8(*mask, it); const __m128i thresh_mask = _mm_cmpeq_epi8(diff, _mm_setzero_si128()); __m128i filter_mask; NeedsFilter_SSE2(p1, p0, q0, q1, thresh, &filter_mask); *mask = _mm_and_si128(thresh_mask, filter_mask); } // on macroblock edges static void VFilter16_SSE2(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { __m128i t1; __m128i mask; __m128i p2, p1, p0, q0, q1, q2; // Load p3, p2, p1, p0 LOAD_H_EDGES4(p - 4 * stride, stride, t1, p2, p1, p0); MAX_DIFF1(t1, p2, p1, p0, mask); // Load q0, q1, q2, q3 LOAD_H_EDGES4(p, stride, q0, q1, q2, t1); MAX_DIFF2(t1, q2, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter6_SSE2(&p2, &p1, &p0, &q0, &q1, &q2, &mask, hev_thresh); // Store _mm_storeu_si128((__m128i*)&p[-3 * stride], p2); _mm_storeu_si128((__m128i*)&p[-2 * stride], p1); _mm_storeu_si128((__m128i*)&p[-1 * stride], p0); _mm_storeu_si128((__m128i*)&p[+0 * stride], q0); _mm_storeu_si128((__m128i*)&p[+1 * stride], q1); _mm_storeu_si128((__m128i*)&p[+2 * stride], q2); } static void HFilter16_SSE2(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { __m128i mask; __m128i p3, p2, p1, p0, q0, q1, q2, q3; uint8_t* const b = p - 4; Load16x4_SSE2(b, b + 8 * stride, stride, &p3, &p2, &p1, &p0); MAX_DIFF1(p3, p2, p1, p0, mask); Load16x4_SSE2(p, p + 8 * stride, stride, &q0, &q1, &q2, &q3); MAX_DIFF2(q3, q2, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter6_SSE2(&p2, &p1, &p0, &q0, &q1, &q2, &mask, hev_thresh); Store16x4_SSE2(&p3, &p2, &p1, &p0, b, b + 8 * stride, stride); Store16x4_SSE2(&q0, &q1, &q2, &q3, p, p + 8 * stride, stride); } // on three inner edges static void VFilter16i_SSE2(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; __m128i p3, p2, p1, p0; // loop invariants LOAD_H_EDGES4(p, stride, p3, p2, p1, p0); // prologue for (k = 3; k > 0; --k) { __m128i mask, tmp1, tmp2; uint8_t* const b = p + 2 * stride; // beginning of p1 p += 4 * stride; MAX_DIFF1(p3, p2, p1, p0, mask); // compute partial mask LOAD_H_EDGES4(p, stride, p3, p2, tmp1, tmp2); MAX_DIFF2(p3, p2, tmp1, tmp2, mask); // p3 and p2 are not just temporary variables here: they will be // re-used for next span. And q2/q3 will become p1/p0 accordingly. ComplexMask_SSE2(&p1, &p0, &p3, &p2, thresh, ithresh, &mask); DoFilter4_SSE2(&p1, &p0, &p3, &p2, &mask, hev_thresh); // Store _mm_storeu_si128((__m128i*)&b[0 * stride], p1); _mm_storeu_si128((__m128i*)&b[1 * stride], p0); _mm_storeu_si128((__m128i*)&b[2 * stride], p3); _mm_storeu_si128((__m128i*)&b[3 * stride], p2); // rotate samples p1 = tmp1; p0 = tmp2; } } static void HFilter16i_SSE2(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; __m128i p3, p2, p1, p0; // loop invariants Load16x4_SSE2(p, p + 8 * stride, stride, &p3, &p2, &p1, &p0); // prologue for (k = 3; k > 0; --k) { __m128i mask, tmp1, tmp2; uint8_t* const b = p + 2; // beginning of p1 p += 4; // beginning of q0 (and next span) MAX_DIFF1(p3, p2, p1, p0, mask); // compute partial mask Load16x4_SSE2(p, p + 8 * stride, stride, &p3, &p2, &tmp1, &tmp2); MAX_DIFF2(p3, p2, tmp1, tmp2, mask); ComplexMask_SSE2(&p1, &p0, &p3, &p2, thresh, ithresh, &mask); DoFilter4_SSE2(&p1, &p0, &p3, &p2, &mask, hev_thresh); Store16x4_SSE2(&p1, &p0, &p3, &p2, b, b + 8 * stride, stride); // rotate samples p1 = tmp1; p0 = tmp2; } } // 8-pixels wide variant, for chroma filtering static void VFilter8_SSE2(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { __m128i mask; __m128i t1, p2, p1, p0, q0, q1, q2; // Load p3, p2, p1, p0 LOADUV_H_EDGES4(u - 4 * stride, v - 4 * stride, stride, t1, p2, p1, p0); MAX_DIFF1(t1, p2, p1, p0, mask); // Load q0, q1, q2, q3 LOADUV_H_EDGES4(u, v, stride, q0, q1, q2, t1); MAX_DIFF2(t1, q2, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter6_SSE2(&p2, &p1, &p0, &q0, &q1, &q2, &mask, hev_thresh); // Store STOREUV(p2, u, v, -3 * stride); STOREUV(p1, u, v, -2 * stride); STOREUV(p0, u, v, -1 * stride); STOREUV(q0, u, v, 0 * stride); STOREUV(q1, u, v, 1 * stride); STOREUV(q2, u, v, 2 * stride); } static void HFilter8_SSE2(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { __m128i mask; __m128i p3, p2, p1, p0, q0, q1, q2, q3; uint8_t* const tu = u - 4; uint8_t* const tv = v - 4; Load16x4_SSE2(tu, tv, stride, &p3, &p2, &p1, &p0); MAX_DIFF1(p3, p2, p1, p0, mask); Load16x4_SSE2(u, v, stride, &q0, &q1, &q2, &q3); MAX_DIFF2(q3, q2, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter6_SSE2(&p2, &p1, &p0, &q0, &q1, &q2, &mask, hev_thresh); Store16x4_SSE2(&p3, &p2, &p1, &p0, tu, tv, stride); Store16x4_SSE2(&q0, &q1, &q2, &q3, u, v, stride); } static void VFilter8i_SSE2(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { __m128i mask; __m128i t1, t2, p1, p0, q0, q1; // Load p3, p2, p1, p0 LOADUV_H_EDGES4(u, v, stride, t2, t1, p1, p0); MAX_DIFF1(t2, t1, p1, p0, mask); u += 4 * stride; v += 4 * stride; // Load q0, q1, q2, q3 LOADUV_H_EDGES4(u, v, stride, q0, q1, t1, t2); MAX_DIFF2(t2, t1, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter4_SSE2(&p1, &p0, &q0, &q1, &mask, hev_thresh); // Store STOREUV(p1, u, v, -2 * stride); STOREUV(p0, u, v, -1 * stride); STOREUV(q0, u, v, 0 * stride); STOREUV(q1, u, v, 1 * stride); } static void HFilter8i_SSE2(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { __m128i mask; __m128i t1, t2, p1, p0, q0, q1; Load16x4_SSE2(u, v, stride, &t2, &t1, &p1, &p0); // p3, p2, p1, p0 MAX_DIFF1(t2, t1, p1, p0, mask); u += 4; // beginning of q0 v += 4; Load16x4_SSE2(u, v, stride, &q0, &q1, &t1, &t2); // q0, q1, q2, q3 MAX_DIFF2(t2, t1, q1, q0, mask); ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask); DoFilter4_SSE2(&p1, &p0, &q0, &q1, &mask, hev_thresh); u -= 2; // beginning of p1 v -= 2; Store16x4_SSE2(&p1, &p0, &q0, &q1, u, v, stride); } //------------------------------------------------------------------------------ // 4x4 predictions #define DST(x, y) dst[(x) + (y) * BPS] #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2) // We use the following 8b-arithmetic tricks: // (a + 2 * b + c + 2) >> 2 = (AC + b + 1) >> 1 // where: AC = (a + c) >> 1 = [(a + c + 1) >> 1] - [(a^c) & 1] // and: // (a + 2 * b + c + 2) >> 2 = (AB + BC + 1) >> 1 - (ab|bc)&lsb // where: AC = (a + b + 1) >> 1, BC = (b + c + 1) >> 1 // and ab = a ^ b, bc = b ^ c, lsb = (AC^BC)&1 static void VE4_SSE2(uint8_t* dst) { // vertical const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((__m128i*)(dst - BPS - 1)); const __m128i BCDEFGH0 = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH00 = _mm_srli_si128(ABCDEFGH, 2); const __m128i a = _mm_avg_epu8(ABCDEFGH, CDEFGH00); const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one); const __m128i b = _mm_subs_epu8(a, lsb); const __m128i avg = _mm_avg_epu8(b, BCDEFGH0); const int vals = _mm_cvtsi128_si32(avg); int i; for (i = 0; i < 4; ++i) { WebPInt32ToMem(dst + i * BPS, vals); } } static void LD4_SSE2(uint8_t* dst) { // Down-Left const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((__m128i*)(dst - BPS)); const __m128i BCDEFGH0 = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH00 = _mm_srli_si128(ABCDEFGH, 2); const __m128i CDEFGHH0 = _mm_insert_epi16(CDEFGH00, dst[-BPS + 7], 3); const __m128i avg1 = _mm_avg_epu8(ABCDEFGH, CDEFGHH0); const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static void VR4_SSE2(uint8_t* dst) { // Vertical-Right const __m128i one = _mm_set1_epi8(1); const int I = dst[-1 + 0 * BPS]; const int J = dst[-1 + 1 * BPS]; const int K = dst[-1 + 2 * BPS]; const int X = dst[-1 - BPS]; const __m128i XABCD = _mm_loadl_epi64((__m128i*)(dst - BPS - 1)); const __m128i ABCD0 = _mm_srli_si128(XABCD, 1); const __m128i abcd = _mm_avg_epu8(XABCD, ABCD0); const __m128i _XABCD = _mm_slli_si128(XABCD, 1); const __m128i IXABCD = _mm_insert_epi16(_XABCD, (short)(I | (X << 8)), 0); const __m128i avg1 = _mm_avg_epu8(IXABCD, ABCD0); const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i efgh = _mm_avg_epu8(avg2, XABCD); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); // these two are hard to implement in SSE2, so we keep the C-version: DST(0, 2) = AVG3(J, I, X); DST(0, 3) = AVG3(K, J, I); } static void VL4_SSE2(uint8_t* dst) { // Vertical-Left const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((__m128i*)(dst - BPS)); const __m128i BCDEFGH_ = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH__ = _mm_srli_si128(ABCDEFGH, 2); const __m128i avg1 = _mm_avg_epu8(ABCDEFGH, BCDEFGH_); const __m128i avg2 = _mm_avg_epu8(CDEFGH__, BCDEFGH_); const __m128i avg3 = _mm_avg_epu8(avg1, avg2); const __m128i lsb1 = _mm_and_si128(_mm_xor_si128(avg1, avg2), one); const __m128i ab = _mm_xor_si128(ABCDEFGH, BCDEFGH_); const __m128i bc = _mm_xor_si128(CDEFGH__, BCDEFGH_); const __m128i abbc = _mm_or_si128(ab, bc); const __m128i lsb2 = _mm_and_si128(abbc, lsb1); const __m128i avg4 = _mm_subs_epu8(avg3, lsb2); const uint32_t extra_out = (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); // these two are hard to get and irregular DST(3, 2) = (extra_out >> 0) & 0xff; DST(3, 3) = (extra_out >> 8) & 0xff; } static void RD4_SSE2(uint8_t* dst) { // Down-right const __m128i one = _mm_set1_epi8(1); const __m128i XABCD = _mm_loadl_epi64((__m128i*)(dst - BPS - 1)); const __m128i ____XABCD = _mm_slli_si128(XABCD, 4); const uint32_t I = dst[-1 + 0 * BPS]; const uint32_t J = dst[-1 + 1 * BPS]; const uint32_t K = dst[-1 + 2 * BPS]; const uint32_t L = dst[-1 + 3 * BPS]; const __m128i LKJI_____ = _mm_cvtsi32_si128((int)(L | (K << 8) | (J << 16) | (I << 24))); const __m128i LKJIXABCD = _mm_or_si128(LKJI_____, ____XABCD); const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1); const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2); const __m128i avg1 = _mm_avg_epu8(JIXABCD__, LKJIXABCD); const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } #undef DST #undef AVG3 //------------------------------------------------------------------------------ // Luma 16x16 static WEBP_INLINE void TrueMotion_SSE2(uint8_t* dst, int size) { const uint8_t* top = dst - BPS; const __m128i zero = _mm_setzero_si128(); int y; if (size == 4) { const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top)); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); for (y = 0; y < 4; ++y, dst += BPS) { const int val = dst[-1] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); WebPInt32ToMem(dst, _mm_cvtsi128_si32(out)); } } else if (size == 8) { const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); for (y = 0; y < 8; ++y, dst += BPS) { const int val = dst[-1] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); _mm_storel_epi64((__m128i*)dst, out); } } else { const __m128i top_values = _mm_loadu_si128((const __m128i*)top); const __m128i top_base_0 = _mm_unpacklo_epi8(top_values, zero); const __m128i top_base_1 = _mm_unpackhi_epi8(top_values, zero); for (y = 0; y < 16; ++y, dst += BPS) { const int val = dst[-1] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out_0 = _mm_add_epi16(base, top_base_0); const __m128i out_1 = _mm_add_epi16(base, top_base_1); const __m128i out = _mm_packus_epi16(out_0, out_1); _mm_storeu_si128((__m128i*)dst, out); } } } static void TM4_SSE2(uint8_t* dst) { TrueMotion_SSE2(dst, 4); } static void TM8uv_SSE2(uint8_t* dst) { TrueMotion_SSE2(dst, 8); } static void TM16_SSE2(uint8_t* dst) { TrueMotion_SSE2(dst, 16); } static void VE16_SSE2(uint8_t* dst) { const __m128i top = _mm_loadu_si128((const __m128i*)(dst - BPS)); int j; for (j = 0; j < 16; ++j) { _mm_storeu_si128((__m128i*)(dst + j * BPS), top); } } static void HE16_SSE2(uint8_t* dst) { // horizontal int j; for (j = 16; j > 0; --j) { const __m128i values = _mm_set1_epi8((char)dst[-1]); _mm_storeu_si128((__m128i*)dst, values); dst += BPS; } } static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) { int j; const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 16; ++j) { _mm_storeu_si128((__m128i*)(dst + j * BPS), values); } } static void DC16_SSE2(uint8_t* dst) { // DC const __m128i zero = _mm_setzero_si128(); const __m128i top = _mm_loadu_si128((const __m128i*)(dst - BPS)); const __m128i sad8x2 = _mm_sad_epu8(top, zero); // sum the two sads: sad8x2[0:1] + sad8x2[8:9] const __m128i sum = _mm_add_epi16(sad8x2, _mm_shuffle_epi32(sad8x2, 2)); int left = 0; int j; for (j = 0; j < 16; ++j) { left += dst[-1 + j * BPS]; } { const int DC = _mm_cvtsi128_si32(sum) + left + 16; Put16_SSE2(DC >> 5, dst); } } static void DC16NoTop_SSE2(uint8_t* dst) { // DC with top samples unavailable int DC = 8; int j; for (j = 0; j < 16; ++j) { DC += dst[-1 + j * BPS]; } Put16_SSE2(DC >> 4, dst); } static void DC16NoLeft_SSE2(uint8_t* dst) { // DC with left samples unavailable const __m128i zero = _mm_setzero_si128(); const __m128i top = _mm_loadu_si128((const __m128i*)(dst - BPS)); const __m128i sad8x2 = _mm_sad_epu8(top, zero); // sum the two sads: sad8x2[0:1] + sad8x2[8:9] const __m128i sum = _mm_add_epi16(sad8x2, _mm_shuffle_epi32(sad8x2, 2)); const int DC = _mm_cvtsi128_si32(sum) + 8; Put16_SSE2(DC >> 4, dst); } static void DC16NoTopLeft_SSE2(uint8_t* dst) { // DC with no top & left samples Put16_SSE2(0x80, dst); } //------------------------------------------------------------------------------ // Chroma static void VE8uv_SSE2(uint8_t* dst) { // vertical int j; const __m128i top = _mm_loadl_epi64((const __m128i*)(dst - BPS)); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), top); } } // helper for chroma-DC predictions static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) { int j; const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), values); } } static void DC8uv_SSE2(uint8_t* dst) { // DC const __m128i zero = _mm_setzero_si128(); const __m128i top = _mm_loadl_epi64((const __m128i*)(dst - BPS)); const __m128i sum = _mm_sad_epu8(top, zero); int left = 0; int j; for (j = 0; j < 8; ++j) { left += dst[-1 + j * BPS]; } { const int DC = _mm_cvtsi128_si32(sum) + left + 8; Put8x8uv_SSE2(DC >> 4, dst); } } static void DC8uvNoLeft_SSE2(uint8_t* dst) { // DC with no left samples const __m128i zero = _mm_setzero_si128(); const __m128i top = _mm_loadl_epi64((const __m128i*)(dst - BPS)); const __m128i sum = _mm_sad_epu8(top, zero); const int DC = _mm_cvtsi128_si32(sum) + 4; Put8x8uv_SSE2(DC >> 3, dst); } static void DC8uvNoTop_SSE2(uint8_t* dst) { // DC with no top samples int dc0 = 4; int i; for (i = 0; i < 8; ++i) { dc0 += dst[-1 + i * BPS]; } Put8x8uv_SSE2(dc0 >> 3, dst); } static void DC8uvNoTopLeft_SSE2(uint8_t* dst) { // DC with nothing Put8x8uv_SSE2(0x80, dst); } //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitSSE2(void) { VP8Transform = Transform_SSE2; #if (USE_TRANSFORM_AC3 == 1) VP8TransformAC3 = TransformAC3_SSE2; #endif VP8VFilter16 = VFilter16_SSE2; VP8HFilter16 = HFilter16_SSE2; VP8VFilter8 = VFilter8_SSE2; VP8HFilter8 = HFilter8_SSE2; VP8VFilter16i = VFilter16i_SSE2; VP8HFilter16i = HFilter16i_SSE2; VP8VFilter8i = VFilter8i_SSE2; VP8HFilter8i = HFilter8i_SSE2; VP8SimpleVFilter16 = SimpleVFilter16_SSE2; VP8SimpleHFilter16 = SimpleHFilter16_SSE2; VP8SimpleVFilter16i = SimpleVFilter16i_SSE2; VP8SimpleHFilter16i = SimpleHFilter16i_SSE2; VP8PredLuma4[1] = TM4_SSE2; VP8PredLuma4[2] = VE4_SSE2; VP8PredLuma4[4] = RD4_SSE2; VP8PredLuma4[5] = VR4_SSE2; VP8PredLuma4[6] = LD4_SSE2; VP8PredLuma4[7] = VL4_SSE2; VP8PredLuma16[0] = DC16_SSE2; VP8PredLuma16[1] = TM16_SSE2; VP8PredLuma16[2] = VE16_SSE2; VP8PredLuma16[3] = HE16_SSE2; VP8PredLuma16[4] = DC16NoTop_SSE2; VP8PredLuma16[5] = DC16NoLeft_SSE2; VP8PredLuma16[6] = DC16NoTopLeft_SSE2; VP8PredChroma8[0] = DC8uv_SSE2; VP8PredChroma8[1] = TM8uv_SSE2; VP8PredChroma8[2] = VE8uv_SSE2; VP8PredChroma8[4] = DC8uvNoTop_SSE2; VP8PredChroma8[5] = DC8uvNoLeft_SSE2; VP8PredChroma8[6] = DC8uvNoTopLeft_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8DspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/upsampling_msa.c0000644000014400001440000006757414606317060014636 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA version of YUV to RGB upsampling functions. // // Author: Prashant Patil (prashant.patil@imgtec.com) #include #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include "src/dsp/msa_macro.h" #include "src/dsp/yuv.h" #ifdef FANCY_UPSAMPLING #define ILVR_UW2(in, out0, out1) do { \ const v8i16 t0 = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)in); \ out0 = (v4u32)__msa_ilvr_h((v8i16)zero, t0); \ out1 = (v4u32)__msa_ilvl_h((v8i16)zero, t0); \ } while (0) #define ILVRL_UW4(in, out0, out1, out2, out3) do { \ v16u8 t0, t1; \ ILVRL_B2_UB(zero, in, t0, t1); \ ILVRL_H2_UW(zero, t0, out0, out1); \ ILVRL_H2_UW(zero, t1, out2, out3); \ } while (0) #define MULTHI_16(in0, in1, in2, in3, cnst, out0, out1) do { \ const v4i32 const0 = (v4i32)__msa_fill_w(cnst * 256); \ v4u32 temp0, temp1, temp2, temp3; \ MUL4(in0, const0, in1, const0, in2, const0, in3, const0, \ temp0, temp1, temp2, temp3); \ PCKOD_H2_UH(temp1, temp0, temp3, temp2, out0, out1); \ } while (0) #define MULTHI_8(in0, in1, cnst, out0) do { \ const v4i32 const0 = (v4i32)__msa_fill_w(cnst * 256); \ v4u32 temp0, temp1; \ MUL2(in0, const0, in1, const0, temp0, temp1); \ out0 = (v8u16)__msa_pckod_h((v8i16)temp1, (v8i16)temp0); \ } while (0) #define CALC_R16(y0, y1, v0, v1, dst) do { \ const v8i16 const_a = (v8i16)__msa_fill_h(14234); \ const v8i16 a0 = __msa_adds_s_h((v8i16)y0, (v8i16)v0); \ const v8i16 a1 = __msa_adds_s_h((v8i16)y1, (v8i16)v1); \ v8i16 b0 = __msa_subs_s_h(a0, const_a); \ v8i16 b1 = __msa_subs_s_h(a1, const_a); \ SRAI_H2_SH(b0, b1, 6); \ CLIP_SH2_0_255(b0, b1); \ dst = (v16u8)__msa_pckev_b((v16i8)b1, (v16i8)b0); \ } while (0) #define CALC_R8(y0, v0, dst) do { \ const v8i16 const_a = (v8i16)__msa_fill_h(14234); \ const v8i16 a0 = __msa_adds_s_h((v8i16)y0, (v8i16)v0); \ v8i16 b0 = __msa_subs_s_h(a0, const_a); \ b0 = SRAI_H(b0, 6); \ CLIP_SH_0_255(b0); \ dst = (v16u8)__msa_pckev_b((v16i8)b0, (v16i8)b0); \ } while (0) #define CALC_G16(y0, y1, u0, u1, v0, v1, dst) do { \ const v8i16 const_a = (v8i16)__msa_fill_h(8708); \ v8i16 a0 = __msa_subs_s_h((v8i16)y0, (v8i16)u0); \ v8i16 a1 = __msa_subs_s_h((v8i16)y1, (v8i16)u1); \ const v8i16 b0 = __msa_subs_s_h(a0, (v8i16)v0); \ const v8i16 b1 = __msa_subs_s_h(a1, (v8i16)v1); \ a0 = __msa_adds_s_h(b0, const_a); \ a1 = __msa_adds_s_h(b1, const_a); \ SRAI_H2_SH(a0, a1, 6); \ CLIP_SH2_0_255(a0, a1); \ dst = (v16u8)__msa_pckev_b((v16i8)a1, (v16i8)a0); \ } while (0) #define CALC_G8(y0, u0, v0, dst) do { \ const v8i16 const_a = (v8i16)__msa_fill_h(8708); \ v8i16 a0 = __msa_subs_s_h((v8i16)y0, (v8i16)u0); \ const v8i16 b0 = __msa_subs_s_h(a0, (v8i16)v0); \ a0 = __msa_adds_s_h(b0, const_a); \ a0 = SRAI_H(a0, 6); \ CLIP_SH_0_255(a0); \ dst = (v16u8)__msa_pckev_b((v16i8)a0, (v16i8)a0); \ } while (0) #define CALC_B16(y0, y1, u0, u1, dst) do { \ const v8u16 const_a = (v8u16)__msa_fill_h(17685); \ const v8u16 a0 = __msa_adds_u_h((v8u16)y0, u0); \ const v8u16 a1 = __msa_adds_u_h((v8u16)y1, u1); \ v8u16 b0 = __msa_subs_u_h(a0, const_a); \ v8u16 b1 = __msa_subs_u_h(a1, const_a); \ SRAI_H2_UH(b0, b1, 6); \ CLIP_UH2_0_255(b0, b1); \ dst = (v16u8)__msa_pckev_b((v16i8)b1, (v16i8)b0); \ } while (0) #define CALC_B8(y0, u0, dst) do { \ const v8u16 const_a = (v8u16)__msa_fill_h(17685); \ const v8u16 a0 = __msa_adds_u_h((v8u16)y0, u0); \ v8u16 b0 = __msa_subs_u_h(a0, const_a); \ b0 = SRAI_H(b0, 6); \ CLIP_UH_0_255(b0); \ dst = (v16u8)__msa_pckev_b((v16i8)b0, (v16i8)b0); \ } while (0) #define CALC_RGB16(y, u, v, R, G, B) do { \ const v16u8 zero = { 0 }; \ v8u16 y0, y1, u0, u1, v0, v1; \ v4u32 p0, p1, p2, p3; \ const v16u8 in_y = LD_UB(y); \ const v16u8 in_u = LD_UB(u); \ const v16u8 in_v = LD_UB(v); \ ILVRL_UW4(in_y, p0, p1, p2, p3); \ MULTHI_16(p0, p1, p2, p3, 19077, y0, y1); \ ILVRL_UW4(in_v, p0, p1, p2, p3); \ MULTHI_16(p0, p1, p2, p3, 26149, v0, v1); \ CALC_R16(y0, y1, v0, v1, R); \ MULTHI_16(p0, p1, p2, p3, 13320, v0, v1); \ ILVRL_UW4(in_u, p0, p1, p2, p3); \ MULTHI_16(p0, p1, p2, p3, 6419, u0, u1); \ CALC_G16(y0, y1, u0, u1, v0, v1, G); \ MULTHI_16(p0, p1, p2, p3, 33050, u0, u1); \ CALC_B16(y0, y1, u0, u1, B); \ } while (0) #define CALC_RGB8(y, u, v, R, G, B) do { \ const v16u8 zero = { 0 }; \ v8u16 y0, u0, v0; \ v4u32 p0, p1; \ const v16u8 in_y = LD_UB(y); \ const v16u8 in_u = LD_UB(u); \ const v16u8 in_v = LD_UB(v); \ ILVR_UW2(in_y, p0, p1); \ MULTHI_8(p0, p1, 19077, y0); \ ILVR_UW2(in_v, p0, p1); \ MULTHI_8(p0, p1, 26149, v0); \ CALC_R8(y0, v0, R); \ MULTHI_8(p0, p1, 13320, v0); \ ILVR_UW2(in_u, p0, p1); \ MULTHI_8(p0, p1, 6419, u0); \ CALC_G8(y0, u0, v0, G); \ MULTHI_8(p0, p1, 33050, u0); \ CALC_B8(y0, u0, B); \ } while (0) #define STORE16_3(a0, a1, a2, dst) do { \ const v16u8 mask0 = { 0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, \ 8, 9, 20, 10 }; \ const v16u8 mask1 = { 0, 21, 1, 2, 22, 3, 4, 23, 5, 6, 24, 7, \ 8, 25, 9, 10 }; \ const v16u8 mask2 = { 26, 0, 1, 27, 2, 3, 28, 4, 5, 29, 6, 7, \ 30, 8, 9, 31 }; \ v16u8 out0, out1, out2, tmp0, tmp1, tmp2; \ ILVRL_B2_UB(a1, a0, tmp0, tmp1); \ out0 = VSHF_UB(tmp0, a2, mask0); \ tmp2 = SLDI_UB(tmp1, tmp0, 11); \ out1 = VSHF_UB(tmp2, a2, mask1); \ tmp2 = SLDI_UB(tmp1, tmp1, 6); \ out2 = VSHF_UB(tmp2, a2, mask2); \ ST_UB(out0, dst + 0); \ ST_UB(out1, dst + 16); \ ST_UB(out2, dst + 32); \ } while (0) #define STORE8_3(a0, a1, a2, dst) do { \ int64_t out_m; \ const v16u8 mask0 = { 0, 1, 16, 2, 3, 17, 4, 5, 18, 6, 7, 19, \ 8, 9, 20, 10 }; \ const v16u8 mask1 = { 11, 21, 12, 13, 22, 14, 15, 23, \ 255, 255, 255, 255, 255, 255, 255, 255 }; \ const v16u8 tmp0 = (v16u8)__msa_ilvr_b((v16i8)a1, (v16i8)a0); \ v16u8 out0, out1; \ VSHF_B2_UB(tmp0, a2, tmp0, a2, mask0, mask1, out0, out1); \ ST_UB(out0, dst); \ out_m = __msa_copy_s_d((v2i64)out1, 0); \ SD(out_m, dst + 16); \ } while (0) #define STORE16_4(a0, a1, a2, a3, dst) do { \ v16u8 tmp0, tmp1, tmp2, tmp3; \ v16u8 out0, out1, out2, out3; \ ILVRL_B2_UB(a1, a0, tmp0, tmp1); \ ILVRL_B2_UB(a3, a2, tmp2, tmp3); \ ILVRL_H2_UB(tmp2, tmp0, out0, out1); \ ILVRL_H2_UB(tmp3, tmp1, out2, out3); \ ST_UB(out0, dst + 0); \ ST_UB(out1, dst + 16); \ ST_UB(out2, dst + 32); \ ST_UB(out3, dst + 48); \ } while (0) #define STORE8_4(a0, a1, a2, a3, dst) do { \ v16u8 tmp0, tmp1, tmp2, tmp3; \ ILVR_B2_UB(a1, a0, a3, a2, tmp0, tmp1); \ ILVRL_H2_UB(tmp1, tmp0, tmp2, tmp3); \ ST_UB(tmp2, dst + 0); \ ST_UB(tmp3, dst + 16); \ } while (0) #define STORE2_16(a0, a1, dst) do { \ v16u8 out0, out1; \ ILVRL_B2_UB(a1, a0, out0, out1); \ ST_UB(out0, dst + 0); \ ST_UB(out1, dst + 16); \ } while (0) #define STORE2_8(a0, a1, dst) do { \ const v16u8 out0 = (v16u8)__msa_ilvr_b((v16i8)a1, (v16i8)a0); \ ST_UB(out0, dst); \ } while (0) #define CALC_RGBA4444(y, u, v, out0, out1, N, dst) do { \ CALC_RGB##N(y, u, v, R, G, B); \ tmp0 = ANDI_B(R, 0xf0); \ tmp1 = SRAI_B(G, 4); \ RG = tmp0 | tmp1; \ tmp0 = ANDI_B(B, 0xf0); \ BA = ORI_B(tmp0, 0x0f); \ STORE2_##N(out0, out1, dst); \ } while (0) #define CALC_RGB565(y, u, v, out0, out1, N, dst) do { \ CALC_RGB##N(y, u, v, R, G, B); \ tmp0 = ANDI_B(R, 0xf8); \ tmp1 = SRAI_B(G, 5); \ RG = tmp0 | tmp1; \ tmp0 = SLLI_B(G, 3); \ tmp1 = ANDI_B(tmp0, 0xe0); \ tmp0 = SRAI_B(B, 3); \ GB = tmp0 | tmp1; \ STORE2_##N(out0, out1, dst); \ } while (0) static WEBP_INLINE int Clip8(int v) { return v < 0 ? 0 : v > 255 ? 255 : v; } static void YuvToRgb(int y, int u, int v, uint8_t* const rgb) { const int y1 = MultHi(y, 19077); const int r1 = y1 + MultHi(v, 26149) - 14234; const int g1 = y1 - MultHi(u, 6419) - MultHi(v, 13320) + 8708; const int b1 = y1 + MultHi(u, 33050) - 17685; rgb[0] = Clip8(r1 >> 6); rgb[1] = Clip8(g1 >> 6); rgb[2] = Clip8(b1 >> 6); } static void YuvToBgr(int y, int u, int v, uint8_t* const bgr) { const int y1 = MultHi(y, 19077); const int r1 = y1 + MultHi(v, 26149) - 14234; const int g1 = y1 - MultHi(u, 6419) - MultHi(v, 13320) + 8708; const int b1 = y1 + MultHi(u, 33050) - 17685; bgr[0] = Clip8(b1 >> 6); bgr[1] = Clip8(g1 >> 6); bgr[2] = Clip8(r1 >> 6); } #if !defined(WEBP_REDUCE_CSP) static void YuvToRgb565(int y, int u, int v, uint8_t* const rgb) { const int y1 = MultHi(y, 19077); const int r1 = y1 + MultHi(v, 26149) - 14234; const int g1 = y1 - MultHi(u, 6419) - MultHi(v, 13320) + 8708; const int b1 = y1 + MultHi(u, 33050) - 17685; const int r = Clip8(r1 >> 6); const int g = Clip8(g1 >> 6); const int b = Clip8(b1 >> 6); const int rg = (r & 0xf8) | (g >> 5); const int gb = ((g << 3) & 0xe0) | (b >> 3); #if (WEBP_SWAP_16BIT_CSP == 1) rgb[0] = gb; rgb[1] = rg; #else rgb[0] = rg; rgb[1] = gb; #endif } static void YuvToRgba4444(int y, int u, int v, uint8_t* const argb) { const int y1 = MultHi(y, 19077); const int r1 = y1 + MultHi(v, 26149) - 14234; const int g1 = y1 - MultHi(u, 6419) - MultHi(v, 13320) + 8708; const int b1 = y1 + MultHi(u, 33050) - 17685; const int r = Clip8(r1 >> 6); const int g = Clip8(g1 >> 6); const int b = Clip8(b1 >> 6); const int rg = (r & 0xf0) | (g >> 4); const int ba = (b & 0xf0) | 0x0f; // overwrite the lower 4 bits #if (WEBP_SWAP_16BIT_CSP == 1) argb[0] = ba; argb[1] = rg; #else argb[0] = rg; argb[1] = ba; #endif } static void YuvToArgb(uint8_t y, uint8_t u, uint8_t v, uint8_t* const argb) { argb[0] = 0xff; YuvToRgb(y, u, v, argb + 1); } #endif // WEBP_REDUCE_CSP static void YuvToBgra(uint8_t y, uint8_t u, uint8_t v, uint8_t* const bgra) { YuvToBgr(y, u, v, bgra); bgra[3] = 0xff; } static void YuvToRgba(uint8_t y, uint8_t u, uint8_t v, uint8_t* const rgba) { YuvToRgb(y, u, v, rgba); rgba[3] = 0xff; } #if !defined(WEBP_REDUCE_CSP) static void YuvToRgbLine(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B; while (length >= 16) { CALC_RGB16(y, u, v, R, G, B); STORE16_3(R, G, B, dst); y += 16; u += 16; v += 16; dst += 16 * 3; length -= 16; } if (length > 8) { uint8_t temp[3 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB16(temp, u, v, R, G, B); STORE16_3(R, G, B, temp); memcpy(dst, temp, length * 3 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[3 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB8(temp, u, v, R, G, B); STORE8_3(R, G, B, temp); memcpy(dst, temp, length * 3 * sizeof(*dst)); } } static void YuvToBgrLine(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B; while (length >= 16) { CALC_RGB16(y, u, v, R, G, B); STORE16_3(B, G, R, dst); y += 16; u += 16; v += 16; dst += 16 * 3; length -= 16; } if (length > 8) { uint8_t temp[3 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB16(temp, u, v, R, G, B); STORE16_3(B, G, R, temp); memcpy(dst, temp, length * 3 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[3 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB8(temp, u, v, R, G, B); STORE8_3(B, G, R, temp); memcpy(dst, temp, length * 3 * sizeof(*dst)); } } #endif // WEBP_REDUCE_CSP static void YuvToRgbaLine(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B; const v16u8 A = (v16u8)__msa_ldi_b(ALPHAVAL); while (length >= 16) { CALC_RGB16(y, u, v, R, G, B); STORE16_4(R, G, B, A, dst); y += 16; u += 16; v += 16; dst += 16 * 4; length -= 16; } if (length > 8) { uint8_t temp[4 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB16(&temp[0], u, v, R, G, B); STORE16_4(R, G, B, A, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[4 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB8(temp, u, v, R, G, B); STORE8_4(R, G, B, A, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } } static void YuvToBgraLine(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B; const v16u8 A = (v16u8)__msa_ldi_b(ALPHAVAL); while (length >= 16) { CALC_RGB16(y, u, v, R, G, B); STORE16_4(B, G, R, A, dst); y += 16; u += 16; v += 16; dst += 16 * 4; length -= 16; } if (length > 8) { uint8_t temp[4 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB16(temp, u, v, R, G, B); STORE16_4(B, G, R, A, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[4 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB8(temp, u, v, R, G, B); STORE8_4(B, G, R, A, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } } #if !defined(WEBP_REDUCE_CSP) static void YuvToArgbLine(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B; const v16u8 A = (v16u8)__msa_ldi_b(ALPHAVAL); while (length >= 16) { CALC_RGB16(y, u, v, R, G, B); STORE16_4(A, R, G, B, dst); y += 16; u += 16; v += 16; dst += 16 * 4; length -= 16; } if (length > 8) { uint8_t temp[4 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB16(temp, u, v, R, G, B); STORE16_4(A, R, G, B, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[4 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); CALC_RGB8(temp, u, v, R, G, B); STORE8_4(A, R, G, B, temp); memcpy(dst, temp, length * 4 * sizeof(*dst)); } } static void YuvToRgba4444Line(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B, RG, BA, tmp0, tmp1; while (length >= 16) { #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGBA4444(y, u, v, BA, RG, 16, dst); #else CALC_RGBA4444(y, u, v, RG, BA, 16, dst); #endif y += 16; u += 16; v += 16; dst += 16 * 2; length -= 16; } if (length > 8) { uint8_t temp[2 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGBA4444(temp, u, v, BA, RG, 16, temp); #else CALC_RGBA4444(temp, u, v, RG, BA, 16, temp); #endif memcpy(dst, temp, length * 2 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[2 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGBA4444(temp, u, v, BA, RG, 8, temp); #else CALC_RGBA4444(temp, u, v, RG, BA, 8, temp); #endif memcpy(dst, temp, length * 2 * sizeof(*dst)); } } static void YuvToRgb565Line(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int length) { v16u8 R, G, B, RG, GB, tmp0, tmp1; while (length >= 16) { #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGB565(y, u, v, GB, RG, 16, dst); #else CALC_RGB565(y, u, v, RG, GB, 16, dst); #endif y += 16; u += 16; v += 16; dst += 16 * 2; length -= 16; } if (length > 8) { uint8_t temp[2 * 16] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGB565(temp, u, v, GB, RG, 16, temp); #else CALC_RGB565(temp, u, v, RG, GB, 16, temp); #endif memcpy(dst, temp, length * 2 * sizeof(*dst)); } else if (length > 0) { uint8_t temp[2 * 8] = { 0 }; memcpy(temp, y, length * sizeof(*temp)); #if (WEBP_SWAP_16BIT_CSP == 1) CALC_RGB565(temp, u, v, GB, RG, 8, temp); #else CALC_RGB565(temp, u, v, RG, GB, 8, temp); #endif memcpy(dst, temp, length * 2 * sizeof(*dst)); } } #endif // WEBP_REDUCE_CSP #define UPSAMPLE_32PIXELS(a, b, c, d) do { \ v16u8 s = __msa_aver_u_b(a, d); \ v16u8 t = __msa_aver_u_b(b, c); \ const v16u8 st = s ^ t; \ v16u8 ad = a ^ d; \ v16u8 bc = b ^ c; \ v16u8 t0 = ad | bc; \ v16u8 t1 = t0 | st; \ v16u8 t2 = ANDI_B(t1, 1); \ v16u8 t3 = __msa_aver_u_b(s, t); \ const v16u8 k = t3 - t2; \ v16u8 diag1, diag2; \ AVER_UB2_UB(t, k, s, k, t0, t1); \ bc = bc & st; \ ad = ad & st; \ t = t ^ k; \ s = s ^ k; \ t2 = bc | t; \ t3 = ad | s; \ t2 = ANDI_B(t2, 1); \ t3 = ANDI_B(t3, 1); \ SUB2(t0, t2, t1, t3, diag1, diag2); \ AVER_UB2_UB(a, diag1, b, diag2, t0, t1); \ ILVRL_B2_UB(t1, t0, a, b); \ if (pbot_y != NULL) { \ AVER_UB2_UB(c, diag2, d, diag1, t0, t1); \ ILVRL_B2_UB(t1, t0, c, d); \ } \ } while (0) #define UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bot_dst, int len) \ { \ int size = (len - 1) >> 1; \ uint8_t temp_u[64]; \ uint8_t temp_v[64]; \ const uint32_t tl_uv = ((top_u[0]) | ((top_v[0]) << 16)); \ const uint32_t l_uv = ((cur_u[0]) | ((cur_v[0]) << 16)); \ const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ const uint8_t* ptop_y = &top_y[1]; \ uint8_t* ptop_dst = top_dst + XSTEP; \ const uint8_t* pbot_y = &bot_y[1]; \ uint8_t* pbot_dst = bot_dst + XSTEP; \ \ FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \ if (bot_y != NULL) { \ const uint32_t uv1 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ FUNC(bot_y[0], uv1 & 0xff, (uv1 >> 16), bot_dst); \ } \ while (size >= 16) { \ v16u8 tu0, tu1, tv0, tv1, cu0, cu1, cv0, cv1; \ LD_UB2(top_u, 1, tu0, tu1); \ LD_UB2(cur_u, 1, cu0, cu1); \ LD_UB2(top_v, 1, tv0, tv1); \ LD_UB2(cur_v, 1, cv0, cv1); \ UPSAMPLE_32PIXELS(tu0, tu1, cu0, cu1); \ UPSAMPLE_32PIXELS(tv0, tv1, cv0, cv1); \ ST_UB4(tu0, tu1, cu0, cu1, &temp_u[0], 16); \ ST_UB4(tv0, tv1, cv0, cv1, &temp_v[0], 16); \ FUNC##Line(ptop_y, &temp_u[ 0], &temp_v[0], ptop_dst, 32); \ if (bot_y != NULL) { \ FUNC##Line(pbot_y, &temp_u[32], &temp_v[32], pbot_dst, 32); \ } \ ptop_y += 32; \ pbot_y += 32; \ ptop_dst += XSTEP * 32; \ pbot_dst += XSTEP * 32; \ top_u += 16; \ top_v += 16; \ cur_u += 16; \ cur_v += 16; \ size -= 16; \ } \ if (size > 0) { \ v16u8 tu0, tu1, tv0, tv1, cu0, cu1, cv0, cv1; \ memcpy(&temp_u[ 0], top_u, 17 * sizeof(uint8_t)); \ memcpy(&temp_u[32], cur_u, 17 * sizeof(uint8_t)); \ memcpy(&temp_v[ 0], top_v, 17 * sizeof(uint8_t)); \ memcpy(&temp_v[32], cur_v, 17 * sizeof(uint8_t)); \ LD_UB2(&temp_u[ 0], 1, tu0, tu1); \ LD_UB2(&temp_u[32], 1, cu0, cu1); \ LD_UB2(&temp_v[ 0], 1, tv0, tv1); \ LD_UB2(&temp_v[32], 1, cv0, cv1); \ UPSAMPLE_32PIXELS(tu0, tu1, cu0, cu1); \ UPSAMPLE_32PIXELS(tv0, tv1, cv0, cv1); \ ST_UB4(tu0, tu1, cu0, cu1, &temp_u[0], 16); \ ST_UB4(tv0, tv1, cv0, cv1, &temp_v[0], 16); \ FUNC##Line(ptop_y, &temp_u[ 0], &temp_v[0], ptop_dst, size * 2); \ if (bot_y != NULL) { \ FUNC##Line(pbot_y, &temp_u[32], &temp_v[32], pbot_dst, size * 2); \ } \ top_u += size; \ top_v += size; \ cur_u += size; \ cur_v += size; \ } \ if (!(len & 1)) { \ const uint32_t t0 = ((top_u[0]) | ((top_v[0]) << 16)); \ const uint32_t c0 = ((cur_u[0]) | ((cur_v[0]) << 16)); \ const uint32_t tmp0 = (3 * t0 + c0 + 0x00020002u) >> 2; \ FUNC(top_y[len - 1], tmp0 & 0xff, (tmp0 >> 16), \ top_dst + (len - 1) * XSTEP); \ if (bot_y != NULL) { \ const uint32_t tmp1 = (3 * c0 + t0 + 0x00020002u) >> 2; \ FUNC(bot_y[len - 1], tmp1 & 0xff, (tmp1 >> 16), \ bot_dst + (len - 1) * XSTEP); \ } \ } \ } UPSAMPLE_FUNC(UpsampleRgbaLinePair, YuvToRgba, 4) UPSAMPLE_FUNC(UpsampleBgraLinePair, YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) UPSAMPLE_FUNC(UpsampleRgbLinePair, YuvToRgb, 3) UPSAMPLE_FUNC(UpsampleBgrLinePair, YuvToBgr, 3) UPSAMPLE_FUNC(UpsampleArgbLinePair, YuvToArgb, 4) UPSAMPLE_FUNC(UpsampleRgba4444LinePair, YuvToRgba4444, 2) UPSAMPLE_FUNC(UpsampleRgb565LinePair, YuvToRgb565, 2) #endif // WEBP_REDUCE_CSP //------------------------------------------------------------------------------ // Entry point extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; extern void WebPInitUpsamplersMSA(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersMSA(void) { WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair; WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair; WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair; WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair; #if !defined(WEBP_REDUCE_CSP) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair; WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair; WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair; WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair; WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair; WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair; #endif // WEBP_REDUCE_CSP } #endif // FANCY_UPSAMPLING #endif // WEBP_USE_MSA #if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_MSA)) WEBP_DSP_INIT_STUB(WebPInitUpsamplersMSA) #endif libwebp-1.4.0/src/dsp/lossless_enc_neon.c0000644000014400001440000001210414606317060015305 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON variant of methods for lossless encoder // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include #include "src/dsp/lossless.h" #include "src/dsp/neon.h" //------------------------------------------------------------------------------ // Subtract-Green Transform // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use // non-standard versions there. #if defined(__APPLE__) && WEBP_AARCH64 && \ defined(__apple_build_version__) && (__apple_build_version__< 6020037) #define USE_VTBLQ #endif #ifdef USE_VTBLQ // 255 = byte will be zeroed static const uint8_t kGreenShuffle[16] = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; static WEBP_INLINE uint8x16_t DoGreenShuffle_NEON(const uint8x16_t argb, const uint8x16_t shuffle) { return vcombine_u8(vtbl1q_u8(argb, vget_low_u8(shuffle)), vtbl1q_u8(argb, vget_high_u8(shuffle))); } #else // !USE_VTBLQ // 255 = byte will be zeroed static const uint8_t kGreenShuffle[8] = { 1, 255, 1, 255, 5, 255, 5, 255 }; static WEBP_INLINE uint8x16_t DoGreenShuffle_NEON(const uint8x16_t argb, const uint8x8_t shuffle) { return vcombine_u8(vtbl1_u8(vget_low_u8(argb), shuffle), vtbl1_u8(vget_high_u8(argb), shuffle)); } #endif // USE_VTBLQ static void SubtractGreenFromBlueAndRed_NEON(uint32_t* argb_data, int num_pixels) { const uint32_t* const end = argb_data + (num_pixels & ~3); #ifdef USE_VTBLQ const uint8x16_t shuffle = vld1q_u8(kGreenShuffle); #else const uint8x8_t shuffle = vld1_u8(kGreenShuffle); #endif for (; argb_data < end; argb_data += 4) { const uint8x16_t argb = vld1q_u8((uint8_t*)argb_data); const uint8x16_t greens = DoGreenShuffle_NEON(argb, shuffle); vst1q_u8((uint8_t*)argb_data, vsubq_u8(argb, greens)); } // fallthrough and finish off with plain-C VP8LSubtractGreenFromBlueAndRed_C(argb_data, num_pixels & 3); } //------------------------------------------------------------------------------ // Color Transform static void TransformColor_NEON(const VP8LMultipliers* const m, uint32_t* argb_data, int num_pixels) { // sign-extended multiplying constants, pre-shifted by 6. #define CST(X) (((int16_t)(m->X << 8)) >> 6) const int16_t rb[8] = { CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_) }; const int16x8_t mults_rb = vld1q_s16(rb); const int16_t b2[8] = { 0, CST(red_to_blue_), 0, CST(red_to_blue_), 0, CST(red_to_blue_), 0, CST(red_to_blue_), }; const int16x8_t mults_b2 = vld1q_s16(b2); #undef CST #ifdef USE_VTBLQ static const uint8_t kg0g0[16] = { 255, 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13 }; const uint8x16_t shuffle = vld1q_u8(kg0g0); #else static const uint8_t k0g0g[8] = { 255, 1, 255, 1, 255, 5, 255, 5 }; const uint8x8_t shuffle = vld1_u8(k0g0g); #endif const uint32x4_t mask_rb = vdupq_n_u32(0x00ff00ffu); // red-blue masks int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t in = vld1q_u8((uint8_t*)(argb_data + i)); // 0 g 0 g const uint8x16_t greens = DoGreenShuffle_NEON(in, shuffle); // x dr x db1 const int16x8_t A = vqdmulhq_s16(vreinterpretq_s16_u8(greens), mults_rb); // r 0 b 0 const int16x8_t B = vshlq_n_s16(vreinterpretq_s16_u8(in), 8); // x db2 0 0 const int16x8_t C = vqdmulhq_s16(B, mults_b2); // 0 0 x db2 const uint32x4_t D = vshrq_n_u32(vreinterpretq_u32_s16(C), 16); // x dr x db const int8x16_t E = vaddq_s8(vreinterpretq_s8_u32(D), vreinterpretq_s8_s16(A)); // 0 dr 0 db const uint32x4_t F = vandq_u32(vreinterpretq_u32_s8(E), mask_rb); const int8x16_t out = vsubq_s8(vreinterpretq_s8_u8(in), vreinterpretq_s8_u32(F)); vst1q_s8((int8_t*)(argb_data + i), out); } // fallthrough and finish off with plain-C VP8LTransformColor_C(m, argb_data + i, num_pixels - i); } #undef USE_VTBLQ //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitNEON(void) { VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_NEON; VP8LTransformColor = TransformColor_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8LEncDspInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/dsp.h0000644000014400001440000005264314606317060012401 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical functions. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DSP_DSP_H_ #define WEBP_DSP_DSP_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/dsp/cpu.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif #define BPS 32 // this is the common stride for enc/dec //------------------------------------------------------------------------------ // WEBP_RESTRICT // Declares a pointer with the restrict type qualifier if available. // This allows code to hint to the compiler that only this pointer references a // particular object or memory region within the scope of the block in which it // is declared. This may allow for improved optimizations due to the lack of // pointer aliasing. See also: // https://en.cppreference.com/w/c/language/restrict #if defined(__GNUC__) #define WEBP_RESTRICT __restrict__ #elif defined(_MSC_VER) #define WEBP_RESTRICT __restrict #else #define WEBP_RESTRICT #endif //------------------------------------------------------------------------------ // Init stub generator // Defines an init function stub to ensure each module exposes a symbol, // avoiding a compiler warning. #define WEBP_DSP_INIT_STUB(func) \ extern void func(void); \ void func(void) {} //------------------------------------------------------------------------------ // Encoding // Transforms // VP8Idct: Does one of two inverse transforms. If do_two is set, the transforms // will be done for (ref, in, dst) and (ref + 4, in + 16, dst + 4). typedef void (*VP8Idct)(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two); typedef void (*VP8Fdct)(const uint8_t* src, const uint8_t* ref, int16_t* out); typedef void (*VP8WHT)(const int16_t* in, int16_t* out); extern VP8Idct VP8ITransform; extern VP8Fdct VP8FTransform; extern VP8Fdct VP8FTransform2; // performs two transforms at a time extern VP8WHT VP8FTransformWHT; // Predictions // *dst is the destination block. *top and *left can be NULL. typedef void (*VP8IntraPreds)(uint8_t* dst, const uint8_t* left, const uint8_t* top); typedef void (*VP8Intra4Preds)(uint8_t* dst, const uint8_t* top); extern VP8Intra4Preds VP8EncPredLuma4; extern VP8IntraPreds VP8EncPredLuma16; extern VP8IntraPreds VP8EncPredChroma8; typedef int (*VP8Metric)(const uint8_t* pix, const uint8_t* ref); extern VP8Metric VP8SSE16x16, VP8SSE16x8, VP8SSE8x8, VP8SSE4x4; typedef int (*VP8WMetric)(const uint8_t* pix, const uint8_t* ref, const uint16_t* const weights); // The weights for VP8TDisto4x4 and VP8TDisto16x16 contain a row-major // 4 by 4 symmetric matrix. extern VP8WMetric VP8TDisto4x4, VP8TDisto16x16; // Compute the average (DC) of four 4x4 blocks. // Each sub-4x4 block #i sum is stored in dc[i]. typedef void (*VP8MeanMetric)(const uint8_t* ref, uint32_t dc[4]); extern VP8MeanMetric VP8Mean16x4; typedef void (*VP8BlockCopy)(const uint8_t* src, uint8_t* dst); extern VP8BlockCopy VP8Copy4x4; extern VP8BlockCopy VP8Copy16x8; // Quantization struct VP8Matrix; // forward declaration typedef int (*VP8QuantizeBlock)(int16_t in[16], int16_t out[16], const struct VP8Matrix* const mtx); // Same as VP8QuantizeBlock, but quantizes two consecutive blocks. typedef int (*VP8Quantize2Blocks)(int16_t in[32], int16_t out[32], const struct VP8Matrix* const mtx); extern VP8QuantizeBlock VP8EncQuantizeBlock; extern VP8Quantize2Blocks VP8EncQuantize2Blocks; // specific to 2nd transform: typedef int (*VP8QuantizeBlockWHT)(int16_t in[16], int16_t out[16], const struct VP8Matrix* const mtx); extern VP8QuantizeBlockWHT VP8EncQuantizeBlockWHT; extern const int VP8DspScan[16 + 4 + 4]; // Collect histogram for susceptibility calculation. #define MAX_COEFF_THRESH 31 // size of histogram used by CollectHistogram. typedef struct { // We only need to store max_value and last_non_zero, not the distribution. int max_value; int last_non_zero; } VP8Histogram; typedef void (*VP8CHisto)(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo); extern VP8CHisto VP8CollectHistogram; // General-purpose util function to help VP8CollectHistogram(). void VP8SetHistogramData(const int distribution[MAX_COEFF_THRESH + 1], VP8Histogram* const histo); // must be called before using any of the above void VP8EncDspInit(void); //------------------------------------------------------------------------------ // cost functions (encoding) extern const uint16_t VP8EntropyCost[256]; // 8bit fixed-point log(p) // approximate cost per level: extern const uint16_t VP8LevelFixedCosts[2047 /*MAX_LEVEL*/ + 1]; extern const uint8_t VP8EncBands[16 + 1]; struct VP8Residual; typedef void (*VP8SetResidualCoeffsFunc)(const int16_t* const coeffs, struct VP8Residual* const res); extern VP8SetResidualCoeffsFunc VP8SetResidualCoeffs; // Cost calculation function. typedef int (*VP8GetResidualCostFunc)(int ctx0, const struct VP8Residual* const res); extern VP8GetResidualCostFunc VP8GetResidualCost; // must be called before anything using the above void VP8EncDspCostInit(void); //------------------------------------------------------------------------------ // SSIM / PSNR utils // struct for accumulating statistical moments typedef struct { uint32_t w; // sum(w_i) : sum of weights uint32_t xm, ym; // sum(w_i * x_i), sum(w_i * y_i) uint32_t xxm, xym, yym; // sum(w_i * x_i * x_i), etc. } VP8DistoStats; // Compute the final SSIM value // The non-clipped version assumes stats->w = (2 * VP8_SSIM_KERNEL + 1)^2. double VP8SSIMFromStats(const VP8DistoStats* const stats); double VP8SSIMFromStatsClipped(const VP8DistoStats* const stats); #define VP8_SSIM_KERNEL 3 // total size of the kernel: 2 * VP8_SSIM_KERNEL + 1 typedef double (*VP8SSIMGetClippedFunc)(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2, int xo, int yo, // center position int W, int H); // plane dimension #if !defined(WEBP_REDUCE_SIZE) // This version is called with the guarantee that you can load 8 bytes and // 8 rows at offset src1 and src2 typedef double (*VP8SSIMGetFunc)(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2); extern VP8SSIMGetFunc VP8SSIMGet; // unclipped / unchecked extern VP8SSIMGetClippedFunc VP8SSIMGetClipped; // with clipping #endif #if !defined(WEBP_DISABLE_STATS) typedef uint32_t (*VP8AccumulateSSEFunc)(const uint8_t* src1, const uint8_t* src2, int len); extern VP8AccumulateSSEFunc VP8AccumulateSSE; #endif // must be called before using any of the above directly void VP8SSIMDspInit(void); //------------------------------------------------------------------------------ // Decoding typedef void (*VP8DecIdct)(const int16_t* coeffs, uint8_t* dst); // when doing two transforms, coeffs is actually int16_t[2][16]. typedef void (*VP8DecIdct2)(const int16_t* coeffs, uint8_t* dst, int do_two); extern VP8DecIdct2 VP8Transform; extern VP8DecIdct VP8TransformAC3; extern VP8DecIdct VP8TransformUV; extern VP8DecIdct VP8TransformDC; extern VP8DecIdct VP8TransformDCUV; extern VP8WHT VP8TransformWHT; #define WEBP_TRANSFORM_AC3_C1 20091 #define WEBP_TRANSFORM_AC3_C2 35468 #define WEBP_TRANSFORM_AC3_MUL1(a) ((((a) * WEBP_TRANSFORM_AC3_C1) >> 16) + (a)) #define WEBP_TRANSFORM_AC3_MUL2(a) (((a) * WEBP_TRANSFORM_AC3_C2) >> 16) // *dst is the destination block, with stride BPS. Boundary samples are // assumed accessible when needed. typedef void (*VP8PredFunc)(uint8_t* dst); extern VP8PredFunc VP8PredLuma16[/* NUM_B_DC_MODES */]; extern VP8PredFunc VP8PredChroma8[/* NUM_B_DC_MODES */]; extern VP8PredFunc VP8PredLuma4[/* NUM_BMODES */]; // clipping tables (for filtering) extern const int8_t* const VP8ksclip1; // clips [-1020, 1020] to [-128, 127] extern const int8_t* const VP8ksclip2; // clips [-112, 112] to [-16, 15] extern const uint8_t* const VP8kclip1; // clips [-255,511] to [0,255] extern const uint8_t* const VP8kabs0; // abs(x) for x in [-255,255] // must be called first void VP8InitClipTables(void); // simple filter (only for luma) typedef void (*VP8SimpleFilterFunc)(uint8_t* p, int stride, int thresh); extern VP8SimpleFilterFunc VP8SimpleVFilter16; extern VP8SimpleFilterFunc VP8SimpleHFilter16; extern VP8SimpleFilterFunc VP8SimpleVFilter16i; // filter 3 inner edges extern VP8SimpleFilterFunc VP8SimpleHFilter16i; // regular filter (on both macroblock edges and inner edges) typedef void (*VP8LumaFilterFunc)(uint8_t* luma, int stride, int thresh, int ithresh, int hev_t); typedef void (*VP8ChromaFilterFunc)(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_t); // on outer edge extern VP8LumaFilterFunc VP8VFilter16; extern VP8LumaFilterFunc VP8HFilter16; extern VP8ChromaFilterFunc VP8VFilter8; extern VP8ChromaFilterFunc VP8HFilter8; // on inner edge extern VP8LumaFilterFunc VP8VFilter16i; // filtering 3 inner edges altogether extern VP8LumaFilterFunc VP8HFilter16i; extern VP8ChromaFilterFunc VP8VFilter8i; // filtering u and v altogether extern VP8ChromaFilterFunc VP8HFilter8i; // Dithering. Combines dithering values (centered around 128) with dst[], // according to: dst[] = clip(dst[] + (((dither[]-128) + 8) >> 4) #define VP8_DITHER_DESCALE 4 #define VP8_DITHER_DESCALE_ROUNDER (1 << (VP8_DITHER_DESCALE - 1)) #define VP8_DITHER_AMP_BITS 7 #define VP8_DITHER_AMP_CENTER (1 << VP8_DITHER_AMP_BITS) extern void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst, int dst_stride); // must be called before anything using the above void VP8DspInit(void); //------------------------------------------------------------------------------ // WebP I/O #define FANCY_UPSAMPLING // undefined to remove fancy upsampling support // Convert a pair of y/u/v lines together to the output rgb/a colorspace. // bottom_y can be NULL if only one line of output is needed (at top/bottom). typedef void (*WebPUpsampleLinePairFunc)( const uint8_t* top_y, const uint8_t* bottom_y, const uint8_t* top_u, const uint8_t* top_v, const uint8_t* cur_u, const uint8_t* cur_v, uint8_t* top_dst, uint8_t* bottom_dst, int len); #ifdef FANCY_UPSAMPLING // Fancy upsampling functions to convert YUV to RGB(A) modes extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; #endif // FANCY_UPSAMPLING // Per-row point-sampling methods. typedef void (*WebPSamplerRowFunc)(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len); // Generic function to apply 'WebPSamplerRowFunc' to the whole plane: void WebPSamplerProcessPlane(const uint8_t* y, int y_stride, const uint8_t* u, const uint8_t* v, int uv_stride, uint8_t* dst, int dst_stride, int width, int height, WebPSamplerRowFunc func); // Sampling functions to convert rows of YUV to RGB(A) extern WebPSamplerRowFunc WebPSamplers[/* MODE_LAST */]; // General function for converting two lines of ARGB or RGBA. // 'alpha_is_last' should be true if 0xff000000 is stored in memory as // as 0x00, 0x00, 0x00, 0xff (little endian). WebPUpsampleLinePairFunc WebPGetLinePairConverter(int alpha_is_last); // YUV444->RGB converters typedef void (*WebPYUV444Converter)(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len); extern WebPYUV444Converter WebPYUV444Converters[/* MODE_LAST */]; // Must be called before using the WebPUpsamplers[] (and for premultiplied // colorspaces like rgbA, rgbA4444, etc) void WebPInitUpsamplers(void); // Must be called before using WebPSamplers[] void WebPInitSamplers(void); // Must be called before using WebPYUV444Converters[] void WebPInitYUV444Converters(void); //------------------------------------------------------------------------------ // ARGB -> YUV converters // Convert ARGB samples to luma Y. extern void (*WebPConvertARGBToY)(const uint32_t* argb, uint8_t* y, int width); // Convert ARGB samples to U/V with downsampling. do_store should be '1' for // even lines and '0' for odd ones. 'src_width' is the original width, not // the U/V one. extern void (*WebPConvertARGBToUV)(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store); // Convert a row of accumulated (four-values) of rgba32 toward U/V extern void (*WebPConvertRGBA32ToUV)(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width); // Convert RGB or BGR to Y extern void (*WebPConvertRGB24ToY)(const uint8_t* rgb, uint8_t* y, int width); extern void (*WebPConvertBGR24ToY)(const uint8_t* bgr, uint8_t* y, int width); // used for plain-C fallback. extern void WebPConvertARGBToUV_C(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store); extern void WebPConvertRGBA32ToUV_C(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width); // Must be called before using the above. void WebPInitConvertARGBToYUV(void); //------------------------------------------------------------------------------ // Rescaler struct WebPRescaler; // Import a row of data and save its contribution in the rescaler. // 'channel' denotes the channel number to be imported. 'Expand' corresponds to // the wrk->x_expand case. Otherwise, 'Shrink' is to be used. typedef void (*WebPRescalerImportRowFunc)(struct WebPRescaler* const wrk, const uint8_t* src); extern WebPRescalerImportRowFunc WebPRescalerImportRowExpand; extern WebPRescalerImportRowFunc WebPRescalerImportRowShrink; // Export one row (starting at x_out position) from rescaler. // 'Expand' corresponds to the wrk->y_expand case. // Otherwise 'Shrink' is to be used typedef void (*WebPRescalerExportRowFunc)(struct WebPRescaler* const wrk); extern WebPRescalerExportRowFunc WebPRescalerExportRowExpand; extern WebPRescalerExportRowFunc WebPRescalerExportRowShrink; // Plain-C implementation, as fall-back. extern void WebPRescalerImportRowExpand_C(struct WebPRescaler* const wrk, const uint8_t* src); extern void WebPRescalerImportRowShrink_C(struct WebPRescaler* const wrk, const uint8_t* src); extern void WebPRescalerExportRowExpand_C(struct WebPRescaler* const wrk); extern void WebPRescalerExportRowShrink_C(struct WebPRescaler* const wrk); // Main entry calls: extern void WebPRescalerImportRow(struct WebPRescaler* const wrk, const uint8_t* src); // Export one row (starting at x_out position) from rescaler. extern void WebPRescalerExportRow(struct WebPRescaler* const wrk); // Must be called first before using the above. void WebPRescalerDspInit(void); //------------------------------------------------------------------------------ // Utilities for processing transparent channel. // Apply alpha pre-multiply on an rgba, bgra or argb plane of size w * h. // alpha_first should be 0 for argb, 1 for rgba or bgra (where alpha is last). extern void (*WebPApplyAlphaMultiply)( uint8_t* rgba, int alpha_first, int w, int h, int stride); // Same, buf specifically for RGBA4444 format extern void (*WebPApplyAlphaMultiply4444)( uint8_t* rgba4444, int w, int h, int stride); // Dispatch the values from alpha[] plane to the ARGB destination 'dst'. // Returns true if alpha[] plane has non-trivial values different from 0xff. extern int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint8_t* WEBP_RESTRICT dst, int dst_stride); // Transfer packed 8b alpha[] values to green channel in dst[], zero'ing the // A/R/B values. 'dst_stride' is the stride for dst[] in uint32_t units. extern void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint32_t* WEBP_RESTRICT dst, int dst_stride); // Extract the alpha values from 32b values in argb[] and pack them into alpha[] // (this is the opposite of WebPDispatchAlpha). // Returns true if there's only trivial 0xff alpha values. extern int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT argb, int argb_stride, int width, int height, uint8_t* WEBP_RESTRICT alpha, int alpha_stride); // Extract the green values from 32b values in argb[] and pack them into alpha[] // (this is the opposite of WebPDispatchAlphaToGreen). extern void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb, uint8_t* WEBP_RESTRICT alpha, int size); // Pre-Multiply operation transforms x into x * A / 255 (where x=Y,R,G or B). // Un-Multiply operation transforms x into x * 255 / A. // Pre-Multiply or Un-Multiply (if 'inverse' is true) argb values in a row. extern void (*WebPMultARGBRow)(uint32_t* const ptr, int width, int inverse); // Same a WebPMultARGBRow(), but for several rows. void WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows, int inverse); // Same for a row of single values, with side alpha values. extern void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr, const uint8_t* WEBP_RESTRICT const alpha, int width, int inverse); // Same a WebPMultRow(), but for several 'num_rows' rows. void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride, const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int num_rows, int inverse); // Plain-C versions, used as fallback by some implementations. void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr, const uint8_t* WEBP_RESTRICT const alpha, int width, int inverse); void WebPMultARGBRow_C(uint32_t* const ptr, int width, int inverse); #ifdef WORDS_BIGENDIAN // ARGB packing function: a/r/g/b input is rgba or bgra order. extern void (*WebPPackARGB)(const uint8_t* WEBP_RESTRICT a, const uint8_t* WEBP_RESTRICT r, const uint8_t* WEBP_RESTRICT g, const uint8_t* WEBP_RESTRICT b, int len, uint32_t* WEBP_RESTRICT out); #endif // RGB packing function. 'step' can be 3 or 4. r/g/b input is rgb or bgr order. extern void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r, const uint8_t* WEBP_RESTRICT g, const uint8_t* WEBP_RESTRICT b, int len, int step, uint32_t* WEBP_RESTRICT out); // This function returns true if src[i] contains a value different from 0xff. extern int (*WebPHasAlpha8b)(const uint8_t* src, int length); // This function returns true if src[4*i] contains a value different from 0xff. extern int (*WebPHasAlpha32b)(const uint8_t* src, int length); // replaces transparent values in src[] by 'color'. extern void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color); // To be called first before using the above. void WebPInitAlphaProcessing(void); //------------------------------------------------------------------------------ // Filter functions typedef enum { // Filter types. WEBP_FILTER_NONE = 0, WEBP_FILTER_HORIZONTAL, WEBP_FILTER_VERTICAL, WEBP_FILTER_GRADIENT, WEBP_FILTER_LAST = WEBP_FILTER_GRADIENT + 1, // end marker WEBP_FILTER_BEST, // meta-types WEBP_FILTER_FAST } WEBP_FILTER_TYPE; typedef void (*WebPFilterFunc)(const uint8_t* in, int width, int height, int stride, uint8_t* out); // In-place un-filtering. // Warning! 'prev_line' pointer can be equal to 'cur_line' or 'preds'. typedef void (*WebPUnfilterFunc)(const uint8_t* prev_line, const uint8_t* preds, uint8_t* cur_line, int width); // Filter the given data using the given predictor. // 'in' corresponds to a 2-dimensional pixel array of size (stride * height) // in raster order. // 'stride' is number of bytes per scan line (with possible padding). // 'out' should be pre-allocated. extern WebPFilterFunc WebPFilters[WEBP_FILTER_LAST]; // In-place reconstruct the original data from the given filtered data. // The reconstruction will be done for 'num_rows' rows starting from 'row' // (assuming rows upto 'row - 1' are already reconstructed). extern WebPUnfilterFunc WebPUnfilters[WEBP_FILTER_LAST]; // To be called first before using the above. void VP8FiltersInit(void); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_DSP_H_ libwebp-1.4.0/src/dsp/enc_mips_dsp_r2.c0000644000014400001440000024041714606317060014652 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of speed-critical encoding functions. // // Author(s): Darko Laus (darko.laus@imgtec.com) // Mirko Raus (mirko.raus@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/mips_macro.h" #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" static const int kC1 = WEBP_TRANSFORM_AC3_C1; static const int kC2 = WEBP_TRANSFORM_AC3_C2; // O - output // I - input (macro doesn't change it) #define ADD_SUB_HALVES_X4(O0, O1, O2, O3, O4, O5, O6, O7, \ I0, I1, I2, I3, I4, I5, I6, I7) \ "addq.ph %[" #O0 "], %[" #I0 "], %[" #I1 "] \n\t" \ "subq.ph %[" #O1 "], %[" #I0 "], %[" #I1 "] \n\t" \ "addq.ph %[" #O2 "], %[" #I2 "], %[" #I3 "] \n\t" \ "subq.ph %[" #O3 "], %[" #I2 "], %[" #I3 "] \n\t" \ "addq.ph %[" #O4 "], %[" #I4 "], %[" #I5 "] \n\t" \ "subq.ph %[" #O5 "], %[" #I4 "], %[" #I5 "] \n\t" \ "addq.ph %[" #O6 "], %[" #I6 "], %[" #I7 "] \n\t" \ "subq.ph %[" #O7 "], %[" #I6 "], %[" #I7 "] \n\t" // IO - input/output #define ABS_X8(IO0, IO1, IO2, IO3, IO4, IO5, IO6, IO7) \ "absq_s.ph %[" #IO0 "], %[" #IO0 "] \n\t" \ "absq_s.ph %[" #IO1 "], %[" #IO1 "] \n\t" \ "absq_s.ph %[" #IO2 "], %[" #IO2 "] \n\t" \ "absq_s.ph %[" #IO3 "], %[" #IO3 "] \n\t" \ "absq_s.ph %[" #IO4 "], %[" #IO4 "] \n\t" \ "absq_s.ph %[" #IO5 "], %[" #IO5 "] \n\t" \ "absq_s.ph %[" #IO6 "], %[" #IO6 "] \n\t" \ "absq_s.ph %[" #IO7 "], %[" #IO7 "] \n\t" // dpa.w.ph $ac0 temp0 ,temp1 // $ac += temp0[31..16] * temp1[31..16] + temp0[15..0] * temp1[15..0] // dpax.w.ph $ac0 temp0 ,temp1 // $ac += temp0[31..16] * temp1[15..0] + temp0[15..0] * temp1[31..16] // O - output // I - input (macro doesn't change it) #define MUL_HALF(O0, I0, I1, I2, I3, I4, I5, I6, I7, \ I8, I9, I10, I11, I12, I13, I14, I15) \ "mult $ac0, $zero, $zero \n\t" \ "dpa.w.ph $ac0, %[" #I2 "], %[" #I0 "] \n\t" \ "dpax.w.ph $ac0, %[" #I5 "], %[" #I6 "] \n\t" \ "dpa.w.ph $ac0, %[" #I8 "], %[" #I9 "] \n\t" \ "dpax.w.ph $ac0, %[" #I11 "], %[" #I4 "] \n\t" \ "dpa.w.ph $ac0, %[" #I12 "], %[" #I7 "] \n\t" \ "dpax.w.ph $ac0, %[" #I13 "], %[" #I1 "] \n\t" \ "dpa.w.ph $ac0, %[" #I14 "], %[" #I3 "] \n\t" \ "dpax.w.ph $ac0, %[" #I15 "], %[" #I10 "] \n\t" \ "mflo %[" #O0 "], $ac0 \n\t" #define OUTPUT_EARLY_CLOBBER_REGS_17() \ OUTPUT_EARLY_CLOBBER_REGS_10(), \ [temp11]"=&r"(temp11), [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), \ [temp14]"=&r"(temp14), [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), \ [temp17]"=&r"(temp17) // macro for one horizontal pass in FTransform // temp0..temp15 holds tmp[0]..tmp[15] // A - offset in bytes to load from src and ref buffers // TEMP0..TEMP3 - registers for corresponding tmp elements #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \ "lw %[" #TEMP0 "], 0(%[args]) \n\t" \ "lw %[" #TEMP1 "], 4(%[args]) \n\t" \ "lw %[" #TEMP2 "], " XSTR(BPS) "*" #A "(%[" #TEMP0 "]) \n\t" \ "lw %[" #TEMP3 "], " XSTR(BPS) "*" #A "(%[" #TEMP1 "]) \n\t" \ "preceu.ph.qbl %[" #TEMP0 "], %[" #TEMP2 "] \n\t" \ "preceu.ph.qbl %[" #TEMP1 "], %[" #TEMP3 "] \n\t" \ "preceu.ph.qbr %[" #TEMP2 "], %[" #TEMP2 "] \n\t" \ "preceu.ph.qbr %[" #TEMP3 "], %[" #TEMP3 "] \n\t" \ "subq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \ "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP3 "] \n\t" \ "rotr %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \ "addq.ph %[" #TEMP1 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \ "subq.ph %[" #TEMP3 "], %[" #TEMP2 "], %[" #TEMP0 "] \n\t" \ "seh %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \ "sra %[temp16], %[" #TEMP1 "], 16 \n\t" \ "seh %[temp19], %[" #TEMP3 "] \n\t" \ "sra %[" #TEMP3 "], %[" #TEMP3 "], 16 \n\t" \ "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp16] \n\t" \ "addu %[" #TEMP0 "], %[" #TEMP0 "], %[temp16] \n\t" \ "mul %[temp17], %[temp19], %[c2217] \n\t" \ "mul %[temp18], %[" #TEMP3 "], %[c5352] \n\t" \ "mul %[" #TEMP1 "], %[temp19], %[c5352] \n\t" \ "mul %[temp16], %[" #TEMP3 "], %[c2217] \n\t" \ "sll %[" #TEMP2 "], %[" #TEMP2 "], 3 \n\t" \ "sll %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \ "subu %[" #TEMP3 "], %[temp17], %[temp18] \n\t" \ "addu %[" #TEMP1 "], %[temp16], %[" #TEMP1 "] \n\t" \ "addiu %[" #TEMP3 "], %[" #TEMP3 "], 937 \n\t" \ "addiu %[" #TEMP1 "], %[" #TEMP1 "], 1812 \n\t" \ "sra %[" #TEMP3 "], %[" #TEMP3 "], 9 \n\t" \ "sra %[" #TEMP1 "], %[" #TEMP1 "], 9 \n\t" // macro for one vertical pass in FTransform // temp0..temp15 holds tmp[0]..tmp[15] // A..D - offsets in bytes to store to out buffer // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \ "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \ "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \ "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \ "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \ "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \ "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \ "mul %[temp18], %[temp18], %[c5352] \n\t" \ "addiu %[temp16], %[temp16], 7 \n\t" \ "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \ "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \ "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \ "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \ "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \ "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \ "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \ "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \ "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \ "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \ "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \ "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \ "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \ "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t" static void FTransform_MIPSdspR2(const uint8_t* src, const uint8_t* ref, int16_t* out) { const int c2217 = 2217; const int c5352 = 5352; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; int temp17, temp18, temp19, temp20; const int* const args[3] = { (const int*)src, (const int*)ref, (const int*)out }; __asm__ volatile ( HORIZONTAL_PASS(0, temp0, temp1, temp2, temp3) HORIZONTAL_PASS(1, temp4, temp5, temp6, temp7) HORIZONTAL_PASS(2, temp8, temp9, temp10, temp11) HORIZONTAL_PASS(3, temp12, temp13, temp14, temp15) "lw %[temp20], 8(%[args]) \n\t" VERTICAL_PASS(0, 8, 16, 24, temp0, temp4, temp8, temp12) VERTICAL_PASS(2, 10, 18, 26, temp1, temp5, temp9, temp13) VERTICAL_PASS(4, 12, 20, 28, temp2, temp6, temp10, temp14) VERTICAL_PASS(6, 14, 22, 30, temp3, temp7, temp11, temp15) OUTPUT_EARLY_CLOBBER_REGS_18(), [temp0]"=&r"(temp0), [temp19]"=&r"(temp19), [temp20]"=&r"(temp20) : [args]"r"(args), [c2217]"r"(c2217), [c5352]"r"(c5352) : "memory", "hi", "lo" ); } #undef VERTICAL_PASS #undef HORIZONTAL_PASS static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in, uint8_t* dst) { int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18; __asm__ volatile ( "ulw %[temp1], 0(%[in]) \n\t" "ulw %[temp2], 16(%[in]) \n\t" LOAD_IN_X2(temp5, temp6, 24, 26) ADD_SUB_HALVES(temp3, temp4, temp1, temp2) LOAD_IN_X2(temp1, temp2, 8, 10) MUL_SHIFT_SUM(temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp10, temp8, temp9, temp7, temp1, temp2, temp5, temp6, temp13, temp11, temp14, temp12) INSERT_HALF_X2(temp8, temp7, temp10, temp9) "ulw %[temp17], 4(%[in]) \n\t" "ulw %[temp18], 20(%[in]) \n\t" ADD_SUB_HALVES(temp1, temp2, temp3, temp8) ADD_SUB_HALVES(temp5, temp6, temp4, temp7) ADD_SUB_HALVES(temp7, temp8, temp17, temp18) LOAD_IN_X2(temp17, temp18, 12, 14) LOAD_IN_X2(temp9, temp10, 28, 30) MUL_SHIFT_SUM(temp11, temp12, temp13, temp14, temp15, temp16, temp4, temp17, temp12, temp14, temp11, temp13, temp17, temp18, temp9, temp10, temp15, temp4, temp16, temp17) INSERT_HALF_X2(temp11, temp12, temp13, temp14) ADD_SUB_HALVES(temp17, temp8, temp8, temp11) ADD_SUB_HALVES(temp3, temp4, temp7, temp12) // horizontal SRA_16(temp9, temp10, temp11, temp12, temp1, temp2, temp5, temp6) INSERT_HALF_X2(temp1, temp6, temp5, temp2) SRA_16(temp13, temp14, temp15, temp16, temp3, temp4, temp17, temp8) "repl.ph %[temp2], 0x4 \n\t" INSERT_HALF_X2(temp3, temp8, temp17, temp4) "addq.ph %[temp1], %[temp1], %[temp2] \n\t" "addq.ph %[temp6], %[temp6], %[temp2] \n\t" ADD_SUB_HALVES(temp2, temp4, temp1, temp3) ADD_SUB_HALVES(temp5, temp7, temp6, temp8) MUL_SHIFT_SUM(temp1, temp3, temp6, temp8, temp9, temp13, temp17, temp18, temp3, temp13, temp1, temp9, temp9, temp13, temp11, temp15, temp6, temp17, temp8, temp18) MUL_SHIFT_SUM(temp6, temp8, temp18, temp17, temp11, temp15, temp12, temp16, temp8, temp15, temp6, temp11, temp12, temp16, temp10, temp14, temp18, temp12, temp17, temp16) INSERT_HALF_X2(temp1, temp3, temp9, temp13) INSERT_HALF_X2(temp6, temp8, temp11, temp15) SHIFT_R_SUM_X2(temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp2, temp4, temp5, temp7, temp3, temp1, temp8, temp6) PACK_2_HALVES_TO_WORD(temp1, temp2, temp3, temp4, temp9, temp12, temp13, temp16, temp11, temp10, temp15, temp14) LOAD_WITH_OFFSET_X4(temp10, temp11, temp14, temp15, ref, 0, 0, 0, 0, 0, 1, 2, 3, BPS) CONVERT_2_BYTES_TO_HALF(temp5, temp6, temp7, temp8, temp17, temp18, temp10, temp11, temp10, temp11, temp14, temp15) STORE_SAT_SUM_X2(temp5, temp6, temp7, temp8, temp17, temp18, temp10, temp11, temp9, temp12, temp1, temp2, temp13, temp16, temp3, temp4, dst, 0, 1, 2, 3, BPS) OUTPUT_EARLY_CLOBBER_REGS_18() : [dst]"r"(dst), [in]"r"(in), [kC1]"r"(kC1), [kC2]"r"(kC2), [ref]"r"(ref) : "memory", "hi", "lo" ); } static void ITransform_MIPSdspR2(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { ITransformOne(ref, in, dst); if (do_two) { ITransformOne(ref + 4, in + 16, dst + 4); } } static int Disto4x4_MIPSdspR2(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17; __asm__ volatile ( LOAD_WITH_OFFSET_X4(temp1, temp2, temp3, temp4, a, 0, 0, 0, 0, 0, 1, 2, 3, BPS) CONVERT_2_BYTES_TO_HALF(temp5, temp6, temp7, temp8, temp9,temp10, temp11, temp12, temp1, temp2, temp3, temp4) ADD_SUB_HALVES_X4(temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12) PACK_2_HALVES_TO_WORD(temp9, temp10, temp11, temp12, temp1, temp3, temp5, temp7, temp2, temp4, temp6, temp8) ADD_SUB_HALVES_X4(temp2, temp4, temp6, temp8, temp9, temp1, temp3, temp10, temp1, temp9, temp3, temp10, temp5, temp11, temp7, temp12) ADD_SUB_HALVES_X4(temp5, temp11, temp7, temp2, temp9, temp3, temp6, temp12, temp2, temp9, temp6, temp3, temp4, temp1, temp8, temp10) ADD_SUB_HALVES_X4(temp1, temp4, temp10, temp8, temp7, temp11, temp5, temp2, temp5, temp7, temp11, temp2, temp9, temp6, temp3, temp12) ABS_X8(temp1, temp4, temp10, temp8, temp7, temp11, temp5, temp2) LOAD_WITH_OFFSET_X4(temp3, temp6, temp9, temp12, w, 0, 4, 8, 12, 0, 0, 0, 0, 0) LOAD_WITH_OFFSET_X4(temp13, temp14, temp15, temp16, w, 0, 4, 8, 12, 1, 1, 1, 1, 16) MUL_HALF(temp17, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16) LOAD_WITH_OFFSET_X4(temp1, temp2, temp3, temp4, b, 0, 0, 0, 0, 0, 1, 2, 3, BPS) CONVERT_2_BYTES_TO_HALF(temp5,temp6, temp7, temp8, temp9,temp10, temp11, temp12, temp1, temp2, temp3, temp4) ADD_SUB_HALVES_X4(temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12) PACK_2_HALVES_TO_WORD(temp9, temp10, temp11, temp12, temp1, temp3, temp5, temp7, temp2, temp4, temp6, temp8) ADD_SUB_HALVES_X4(temp2, temp4, temp6, temp8, temp9, temp1, temp3, temp10, temp1, temp9, temp3, temp10, temp5, temp11, temp7, temp12) ADD_SUB_HALVES_X4(temp5, temp11, temp7, temp2, temp9, temp3, temp6, temp12, temp2, temp9, temp6, temp3, temp4, temp1, temp8, temp10) ADD_SUB_HALVES_X4(temp1, temp4, temp10, temp8, temp7, temp11, temp5, temp2, temp5, temp7, temp11, temp2, temp9, temp6, temp3, temp12) ABS_X8(temp1, temp4, temp10, temp8, temp7, temp11, temp5, temp2) LOAD_WITH_OFFSET_X4(temp3, temp6, temp9, temp12, w, 0, 4, 8, 12, 0, 0, 0, 0, 0) LOAD_WITH_OFFSET_X4(temp13, temp14, temp15, temp16, w, 0, 4, 8, 12, 1, 1, 1, 1, 16) MUL_HALF(temp3, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16) OUTPUT_EARLY_CLOBBER_REGS_17() : [a]"r"(a), [b]"r"(b), [w]"r"(w) : "memory", "hi", "lo" ); return abs(temp3 - temp17) >> 5; } static int Disto16x16_MIPSdspR2(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_MIPSdspR2(a + x + y, b + x + y, w); } } return D; } //------------------------------------------------------------------------------ // Intra predictions #define FILL_PART(J, SIZE) \ "usw %[value], 0+" #J "*" XSTR(BPS) "(%[dst]) \n\t" \ "usw %[value], 4+" #J "*" XSTR(BPS) "(%[dst]) \n\t" \ ".if " #SIZE " == 16 \n\t" \ "usw %[value], 8+" #J "*" XSTR(BPS) "(%[dst]) \n\t" \ "usw %[value], 12+" #J "*" XSTR(BPS) "(%[dst]) \n\t" \ ".endif \n\t" #define FILL_8_OR_16(DST, VALUE, SIZE) do { \ int value = (VALUE); \ __asm__ volatile ( \ "replv.qb %[value], %[value] \n\t" \ FILL_PART( 0, SIZE) \ FILL_PART( 1, SIZE) \ FILL_PART( 2, SIZE) \ FILL_PART( 3, SIZE) \ FILL_PART( 4, SIZE) \ FILL_PART( 5, SIZE) \ FILL_PART( 6, SIZE) \ FILL_PART( 7, SIZE) \ ".if " #SIZE " == 16 \n\t" \ FILL_PART( 8, 16) \ FILL_PART( 9, 16) \ FILL_PART(10, 16) \ FILL_PART(11, 16) \ FILL_PART(12, 16) \ FILL_PART(13, 16) \ FILL_PART(14, 16) \ FILL_PART(15, 16) \ ".endif \n\t" \ : [value]"+&r"(value) \ : [dst]"r"((DST)) \ : "memory" \ ); \ } while (0) #define VERTICAL_PRED(DST, TOP, SIZE) \ static WEBP_INLINE void VerticalPred##SIZE(uint8_t* (DST), \ const uint8_t* (TOP)) { \ int j; \ if ((TOP)) { \ for (j = 0; j < (SIZE); ++j) memcpy((DST) + j * BPS, (TOP), (SIZE)); \ } else { \ FILL_8_OR_16((DST), 127, (SIZE)); \ } \ } VERTICAL_PRED(dst, top, 8) VERTICAL_PRED(dst, top, 16) #undef VERTICAL_PRED #define HORIZONTAL_PRED(DST, LEFT, SIZE) \ static WEBP_INLINE void HorizontalPred##SIZE(uint8_t* (DST), \ const uint8_t* (LEFT)) { \ if (LEFT) { \ int j; \ for (j = 0; j < (SIZE); ++j) { \ memset((DST) + j * BPS, (LEFT)[j], (SIZE)); \ } \ } else { \ FILL_8_OR_16((DST), 129, (SIZE)); \ } \ } HORIZONTAL_PRED(dst, left, 8) HORIZONTAL_PRED(dst, left, 16) #undef HORIZONTAL_PRED #define CLIPPING() \ "preceu.ph.qbl %[temp2], %[temp0] \n\t" \ "preceu.ph.qbr %[temp0], %[temp0] \n\t" \ "preceu.ph.qbl %[temp3], %[temp1] \n\t" \ "preceu.ph.qbr %[temp1], %[temp1] \n\t" \ "addu.ph %[temp2], %[temp2], %[leftY_1] \n\t" \ "addu.ph %[temp0], %[temp0], %[leftY_1] \n\t" \ "addu.ph %[temp3], %[temp3], %[leftY_1] \n\t" \ "addu.ph %[temp1], %[temp1], %[leftY_1] \n\t" \ "shll_s.ph %[temp2], %[temp2], 7 \n\t" \ "shll_s.ph %[temp0], %[temp0], 7 \n\t" \ "shll_s.ph %[temp3], %[temp3], 7 \n\t" \ "shll_s.ph %[temp1], %[temp1], 7 \n\t" \ "precrqu_s.qb.ph %[temp0], %[temp2], %[temp0] \n\t" \ "precrqu_s.qb.ph %[temp1], %[temp3], %[temp1] \n\t" #define CLIP_8B_TO_DST(DST, LEFT, TOP, SIZE) do { \ int leftY_1 = ((int)(LEFT)[y] << 16) + (LEFT)[y]; \ int temp0, temp1, temp2, temp3; \ __asm__ volatile ( \ "replv.ph %[leftY_1], %[leftY_1] \n\t" \ "ulw %[temp0], 0(%[top]) \n\t" \ "ulw %[temp1], 4(%[top]) \n\t" \ "subu.ph %[leftY_1], %[leftY_1], %[left_1] \n\t" \ CLIPPING() \ "usw %[temp0], 0(%[dst]) \n\t" \ "usw %[temp1], 4(%[dst]) \n\t" \ ".if " #SIZE " == 16 \n\t" \ "ulw %[temp0], 8(%[top]) \n\t" \ "ulw %[temp1], 12(%[top]) \n\t" \ CLIPPING() \ "usw %[temp0], 8(%[dst]) \n\t" \ "usw %[temp1], 12(%[dst]) \n\t" \ ".endif \n\t" \ : [leftY_1]"+&r"(leftY_1), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), \ [temp2]"=&r"(temp2), [temp3]"=&r"(temp3) \ : [left_1]"r"(left_1), [top]"r"((TOP)), [dst]"r"((DST)) \ : "memory" \ ); \ } while (0) #define CLIP_TO_DST(DST, LEFT, TOP, SIZE) do { \ int y; \ const int left_1 = ((int)(LEFT)[-1] << 16) + (LEFT)[-1]; \ for (y = 0; y < (SIZE); ++y) { \ CLIP_8B_TO_DST((DST), (LEFT), (TOP), (SIZE)); \ (DST) += BPS; \ } \ } while (0) #define TRUE_MOTION(DST, LEFT, TOP, SIZE) \ static WEBP_INLINE void TrueMotion##SIZE(uint8_t* (DST), const uint8_t* (LEFT),\ const uint8_t* (TOP)) { \ if ((LEFT) != NULL) { \ if ((TOP) != NULL) { \ CLIP_TO_DST((DST), (LEFT), (TOP), (SIZE)); \ } else { \ HorizontalPred##SIZE((DST), (LEFT)); \ } \ } else { \ /* true motion without left samples (hence: with default 129 value) */ \ /* is equivalent to VE prediction where you just copy the top samples. */ \ /* Note that if top samples are not available, the default value is */ \ /* then 129, and not 127 as in the VerticalPred case. */ \ if ((TOP) != NULL) { \ VerticalPred##SIZE((DST), (TOP)); \ } else { \ FILL_8_OR_16((DST), 129, (SIZE)); \ } \ } \ } TRUE_MOTION(dst, left, top, 8) TRUE_MOTION(dst, left, top, 16) #undef TRUE_MOTION #undef CLIP_TO_DST #undef CLIP_8B_TO_DST #undef CLIPPING static WEBP_INLINE void DCMode16(uint8_t* dst, const uint8_t* left, const uint8_t* top) { int DC, DC1; int temp0, temp1, temp2, temp3; __asm__ volatile( "beqz %[top], 2f \n\t" LOAD_WITH_OFFSET_X4(temp0, temp1, temp2, temp3, top, 0, 4, 8, 12, 0, 0, 0, 0, 0) "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "raddu.w.qb %[temp2], %[temp2] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp3] \n\t" "addu %[DC], %[temp0], %[temp2] \n\t" "move %[DC1], %[DC] \n\t" "beqz %[left], 1f \n\t" LOAD_WITH_OFFSET_X4(temp0, temp1, temp2, temp3, left, 0, 4, 8, 12, 0, 0, 0, 0, 0) "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "raddu.w.qb %[temp2], %[temp2] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp3] \n\t" "addu %[DC1], %[temp0], %[temp2] \n\t" "1: \n\t" "addu %[DC], %[DC], %[DC1] \n\t" "j 3f \n\t" "2: \n\t" "beqz %[left], 4f \n\t" LOAD_WITH_OFFSET_X4(temp0, temp1, temp2, temp3, left, 0, 4, 8, 12, 0, 0, 0, 0, 0) "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "raddu.w.qb %[temp2], %[temp2] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp3] \n\t" "addu %[DC], %[temp0], %[temp2] \n\t" "addu %[DC], %[DC], %[DC] \n\t" "3: \n\t" "shra_r.w %[DC], %[DC], 5 \n\t" "j 5f \n\t" "4: \n\t" "li %[DC], 0x80 \n\t" "5: \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [DC]"=&r"(DC), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [DC1]"=&r"(DC1) : [left]"r"(left), [top]"r"(top) : "memory" ); FILL_8_OR_16(dst, DC, 16); } static WEBP_INLINE void DCMode8(uint8_t* dst, const uint8_t* left, const uint8_t* top) { int DC, DC1; int temp0, temp1, temp2, temp3; __asm__ volatile( "beqz %[top], 2f \n\t" "ulw %[temp0], 0(%[top]) \n\t" "ulw %[temp1], 4(%[top]) \n\t" "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "addu %[DC], %[temp0], %[temp1] \n\t" "move %[DC1], %[DC] \n\t" "beqz %[left], 1f \n\t" "ulw %[temp2], 0(%[left]) \n\t" "ulw %[temp3], 4(%[left]) \n\t" "raddu.w.qb %[temp2], %[temp2] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "addu %[DC1], %[temp2], %[temp3] \n\t" "1: \n\t" "addu %[DC], %[DC], %[DC1] \n\t" "j 3f \n\t" "2: \n\t" "beqz %[left], 4f \n\t" "ulw %[temp2], 0(%[left]) \n\t" "ulw %[temp3], 4(%[left]) \n\t" "raddu.w.qb %[temp2], %[temp2] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "addu %[DC], %[temp2], %[temp3] \n\t" "addu %[DC], %[DC], %[DC] \n\t" "3: \n\t" "shra_r.w %[DC], %[DC], 4 \n\t" "j 5f \n\t" "4: \n\t" "li %[DC], 0x80 \n\t" "5: \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [DC]"=&r"(DC), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [DC1]"=&r"(DC1) : [left]"r"(left), [top]"r"(top) : "memory" ); FILL_8_OR_16(dst, DC, 8); } static void DC4(uint8_t* dst, const uint8_t* top) { int temp0, temp1; __asm__ volatile( "ulw %[temp0], 0(%[top]) \n\t" "ulw %[temp1], -5(%[top]) \n\t" "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addiu %[temp0], %[temp0], 4 \n\t" "srl %[temp0], %[temp0], 3 \n\t" "replv.qb %[temp0], %[temp0] \n\t" "usw %[temp0], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp0], 1*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp0], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp0], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void TM4(uint8_t* dst, const uint8_t* top) { int a10, a32, temp0, temp1, temp2, temp3, temp4, temp5; const int c35 = 0xff00ff; __asm__ volatile ( "lbu %[temp1], 0(%[top]) \n\t" "lbu %[a10], 1(%[top]) \n\t" "lbu %[temp2], 2(%[top]) \n\t" "lbu %[a32], 3(%[top]) \n\t" "ulw %[temp0], -5(%[top]) \n\t" "lbu %[temp4], -1(%[top]) \n\t" "append %[a10], %[temp1], 16 \n\t" "append %[a32], %[temp2], 16 \n\t" "replv.ph %[temp4], %[temp4] \n\t" "shrl.ph %[temp1], %[temp0], 8 \n\t" "and %[temp0], %[temp0], %[c35] \n\t" "subu.ph %[temp1], %[temp1], %[temp4] \n\t" "subu.ph %[temp0], %[temp0], %[temp4] \n\t" "srl %[temp2], %[temp1], 16 \n\t" "srl %[temp3], %[temp0], 16 \n\t" "replv.ph %[temp2], %[temp2] \n\t" "replv.ph %[temp3], %[temp3] \n\t" "replv.ph %[temp4], %[temp1] \n\t" "replv.ph %[temp5], %[temp0] \n\t" "addu.ph %[temp0], %[temp3], %[a10] \n\t" "addu.ph %[temp1], %[temp3], %[a32] \n\t" "addu.ph %[temp3], %[temp2], %[a10] \n\t" "addu.ph %[temp2], %[temp2], %[a32] \n\t" "shll_s.ph %[temp0], %[temp0], 7 \n\t" "shll_s.ph %[temp1], %[temp1], 7 \n\t" "shll_s.ph %[temp3], %[temp3], 7 \n\t" "shll_s.ph %[temp2], %[temp2], 7 \n\t" "precrqu_s.qb.ph %[temp0], %[temp1], %[temp0] \n\t" "precrqu_s.qb.ph %[temp1], %[temp2], %[temp3] \n\t" "addu.ph %[temp2], %[temp5], %[a10] \n\t" "addu.ph %[temp3], %[temp5], %[a32] \n\t" "addu.ph %[temp5], %[temp4], %[a10] \n\t" "addu.ph %[temp4], %[temp4], %[a32] \n\t" "shll_s.ph %[temp2], %[temp2], 7 \n\t" "shll_s.ph %[temp3], %[temp3], 7 \n\t" "shll_s.ph %[temp4], %[temp4], 7 \n\t" "shll_s.ph %[temp5], %[temp5], 7 \n\t" "precrqu_s.qb.ph %[temp2], %[temp3], %[temp2] \n\t" "precrqu_s.qb.ph %[temp3], %[temp4], %[temp5] \n\t" "usw %[temp1], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp0], 1*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp3], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp2], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [a10]"=&r"(a10), [a32]"=&r"(a32) : [c35]"r"(c35), [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void VE4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6; __asm__ volatile( "ulw %[temp0], -1(%[top]) \n\t" "ulh %[temp1], 3(%[top]) \n\t" "preceu.ph.qbr %[temp2], %[temp0] \n\t" "preceu.ph.qbl %[temp3], %[temp0] \n\t" "preceu.ph.qbr %[temp4], %[temp1] \n\t" "packrl.ph %[temp5], %[temp3], %[temp2] \n\t" "packrl.ph %[temp6], %[temp4], %[temp3] \n\t" "shll.ph %[temp5], %[temp5], 1 \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp2], %[temp5], %[temp2] \n\t" "addq.ph %[temp6], %[temp6], %[temp4] \n\t" "addq.ph %[temp2], %[temp2], %[temp3] \n\t" "addq.ph %[temp6], %[temp6], %[temp3] \n\t" "shra_r.ph %[temp2], %[temp2], 2 \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "precr.qb.ph %[temp4], %[temp6], %[temp2] \n\t" "usw %[temp4], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp4], 1*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp4], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp4], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void HE4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6; __asm__ volatile( "ulw %[temp0], -4(%[top]) \n\t" "lbu %[temp1], -5(%[top]) \n\t" "preceu.ph.qbr %[temp2], %[temp0] \n\t" "preceu.ph.qbl %[temp3], %[temp0] \n\t" "replv.ph %[temp4], %[temp1] \n\t" "packrl.ph %[temp5], %[temp3], %[temp2] \n\t" "packrl.ph %[temp6], %[temp2], %[temp4] \n\t" "shll.ph %[temp5], %[temp5], 1 \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp3], %[temp3], %[temp5] \n\t" "addq.ph %[temp3], %[temp3], %[temp2] \n\t" "addq.ph %[temp2], %[temp2], %[temp6] \n\t" "addq.ph %[temp2], %[temp2], %[temp4] \n\t" "shra_r.ph %[temp3], %[temp3], 2 \n\t" "shra_r.ph %[temp2], %[temp2], 2 \n\t" "replv.qb %[temp0], %[temp3] \n\t" "replv.qb %[temp1], %[temp2] \n\t" "srl %[temp3], %[temp3], 16 \n\t" "srl %[temp2], %[temp2], 16 \n\t" "replv.qb %[temp3], %[temp3] \n\t" "replv.qb %[temp2], %[temp2] \n\t" "usw %[temp3], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp0], 1*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp2], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp1], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void RD4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4, temp5; int temp6, temp7, temp8, temp9, temp10, temp11; __asm__ volatile( "ulw %[temp0], -5(%[top]) \n\t" "ulw %[temp1], -1(%[top]) \n\t" "preceu.ph.qbl %[temp2], %[temp0] \n\t" "preceu.ph.qbr %[temp3], %[temp0] \n\t" "preceu.ph.qbr %[temp4], %[temp1] \n\t" "preceu.ph.qbl %[temp5], %[temp1] \n\t" "packrl.ph %[temp6], %[temp2], %[temp3] \n\t" "packrl.ph %[temp7], %[temp4], %[temp2] \n\t" "packrl.ph %[temp8], %[temp5], %[temp4] \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp9], %[temp2], %[temp6] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "addq.ph %[temp9], %[temp9], %[temp3] \n\t" "shll.ph %[temp8], %[temp8], 1 \n\t" "shra_r.ph %[temp9], %[temp9], 2 \n\t" "addq.ph %[temp10], %[temp4], %[temp7] \n\t" "addq.ph %[temp11], %[temp5], %[temp8] \n\t" "addq.ph %[temp10], %[temp10], %[temp2] \n\t" "addq.ph %[temp11], %[temp11], %[temp4] \n\t" "shra_r.ph %[temp10], %[temp10], 2 \n\t" "shra_r.ph %[temp11], %[temp11], 2 \n\t" "lbu %[temp0], 3(%[top]) \n\t" "lbu %[temp1], 2(%[top]) \n\t" "lbu %[temp2], 1(%[top]) \n\t" "sll %[temp1], %[temp1], 1 \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp0], %[temp0], %[temp2] \n\t" "precr.qb.ph %[temp9], %[temp10], %[temp9] \n\t" "shra_r.w %[temp0], %[temp0], 2 \n\t" "precr.qb.ph %[temp10], %[temp11], %[temp10] \n\t" "usw %[temp9], 3*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp10], 1*" XSTR(BPS) "(%[dst]) \n\t" "prepend %[temp9], %[temp11], 8 \n\t" "prepend %[temp10], %[temp0], 8 \n\t" "usw %[temp9], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp10], 0*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void VR4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( "ulw %[temp0], -4(%[top]) \n\t" "ulw %[temp1], 0(%[top]) \n\t" "preceu.ph.qbl %[temp2], %[temp0] \n\t" "preceu.ph.qbr %[temp0], %[temp0] \n\t" "preceu.ph.qbla %[temp3], %[temp1] \n\t" "preceu.ph.qbra %[temp1], %[temp1] \n\t" "packrl.ph %[temp7], %[temp3], %[temp2] \n\t" "addqh_r.ph %[temp4], %[temp1], %[temp3] \n\t" "move %[temp6], %[temp1] \n\t" "append %[temp1], %[temp2], 16 \n\t" "shll.ph %[temp9], %[temp6], 1 \n\t" "addqh_r.ph %[temp5], %[temp7], %[temp6] \n\t" "shll.ph %[temp8], %[temp7], 1 \n\t" "addu.ph %[temp3], %[temp7], %[temp3] \n\t" "addu.ph %[temp1], %[temp1], %[temp6] \n\t" "packrl.ph %[temp7], %[temp2], %[temp0] \n\t" "addu.ph %[temp6], %[temp0], %[temp2] \n\t" "addu.ph %[temp3], %[temp3], %[temp9] \n\t" "addu.ph %[temp1], %[temp1], %[temp8] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "shra_r.ph %[temp3], %[temp3], 2 \n\t" "shra_r.ph %[temp1], %[temp1], 2 \n\t" "addu.ph %[temp6], %[temp6], %[temp7] \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "precrq.ph.w %[temp8], %[temp4], %[temp5] \n\t" "append %[temp4], %[temp5], 16 \n\t" "precrq.ph.w %[temp2], %[temp3], %[temp1] \n\t" "append %[temp3], %[temp1], 16 \n\t" "precr.qb.ph %[temp8], %[temp8], %[temp4] \n\t" "precr.qb.ph %[temp3], %[temp2], %[temp3] \n\t" "usw %[temp8], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp3], 1*" XSTR(BPS) "(%[dst]) \n\t" "append %[temp3], %[temp6], 8 \n\t" "srl %[temp6], %[temp6], 16 \n\t" "append %[temp8], %[temp6], 8 \n\t" "usw %[temp3], 3*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp8], 2*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void LD4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4, temp5; int temp6, temp7, temp8, temp9, temp10, temp11; __asm__ volatile( "ulw %[temp0], 0(%[top]) \n\t" "ulw %[temp1], 4(%[top]) \n\t" "preceu.ph.qbl %[temp2], %[temp0] \n\t" "preceu.ph.qbr %[temp3], %[temp0] \n\t" "preceu.ph.qbr %[temp4], %[temp1] \n\t" "preceu.ph.qbl %[temp5], %[temp1] \n\t" "packrl.ph %[temp6], %[temp2], %[temp3] \n\t" "packrl.ph %[temp7], %[temp4], %[temp2] \n\t" "packrl.ph %[temp8], %[temp5], %[temp4] \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp9], %[temp2], %[temp6] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "addq.ph %[temp9], %[temp9], %[temp3] \n\t" "shll.ph %[temp8], %[temp8], 1 \n\t" "shra_r.ph %[temp9], %[temp9], 2 \n\t" "addq.ph %[temp10], %[temp4], %[temp7] \n\t" "addq.ph %[temp11], %[temp5], %[temp8] \n\t" "addq.ph %[temp10], %[temp10], %[temp2] \n\t" "addq.ph %[temp11], %[temp11], %[temp4] \n\t" "shra_r.ph %[temp10], %[temp10], 2 \n\t" "shra_r.ph %[temp11], %[temp11], 2 \n\t" "srl %[temp1], %[temp1], 24 \n\t" "sll %[temp1], %[temp1], 1 \n\t" "raddu.w.qb %[temp5], %[temp5] \n\t" "precr.qb.ph %[temp9], %[temp10], %[temp9] \n\t" "precr.qb.ph %[temp10], %[temp11], %[temp10] \n\t" "addu %[temp1], %[temp1], %[temp5] \n\t" "shra_r.w %[temp1], %[temp1], 2 \n\t" "usw %[temp9], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp10], 2*" XSTR(BPS) "(%[dst]) \n\t" "prepend %[temp9], %[temp11], 8 \n\t" "prepend %[temp10], %[temp1], 8 \n\t" "usw %[temp9], 1*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp10], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void VL4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( "ulw %[temp0], 0(%[top]) \n\t" "ulw %[temp1], 4(%[top]) \n\t" "preceu.ph.qbla %[temp2], %[temp0] \n\t" "preceu.ph.qbra %[temp0], %[temp0] \n\t" "preceu.ph.qbl %[temp3], %[temp1] \n\t" "preceu.ph.qbr %[temp1], %[temp1] \n\t" "addqh_r.ph %[temp4], %[temp0], %[temp2] \n\t" "packrl.ph %[temp7], %[temp1], %[temp0] \n\t" "precrq.ph.w %[temp6], %[temp1], %[temp2] \n\t" "shll.ph %[temp9], %[temp2], 1 \n\t" "addqh_r.ph %[temp5], %[temp7], %[temp2] \n\t" "shll.ph %[temp8], %[temp7], 1 \n\t" "addu.ph %[temp2], %[temp2], %[temp6] \n\t" "addu.ph %[temp0], %[temp0], %[temp7] \n\t" "packrl.ph %[temp7], %[temp3], %[temp1] \n\t" "addu.ph %[temp6], %[temp1], %[temp3] \n\t" "addu.ph %[temp2], %[temp2], %[temp8] \n\t" "addu.ph %[temp0], %[temp0], %[temp9] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "shra_r.ph %[temp2], %[temp2], 2 \n\t" "shra_r.ph %[temp0], %[temp0], 2 \n\t" "addu.ph %[temp6], %[temp6], %[temp7] \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "precrq.ph.w %[temp8], %[temp5], %[temp4] \n\t" "append %[temp5], %[temp4], 16 \n\t" "precrq.ph.w %[temp3], %[temp2], %[temp0] \n\t" "append %[temp2], %[temp0], 16 \n\t" "precr.qb.ph %[temp8], %[temp8], %[temp5] \n\t" "precr.qb.ph %[temp3], %[temp3], %[temp2] \n\t" "usw %[temp8], 0*" XSTR(BPS) "(%[dst]) \n\t" "prepend %[temp8], %[temp6], 8 \n\t" "usw %[temp3], 1*" XSTR(BPS) "(%[dst]) \n\t" "srl %[temp6], %[temp6], 16 \n\t" "prepend %[temp3], %[temp6], 8 \n\t" "usw %[temp8], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp3], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void HD4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( "ulw %[temp0], -5(%[top]) \n\t" "ulw %[temp1], -1(%[top]) \n\t" "preceu.ph.qbla %[temp2], %[temp0] \n\t" "preceu.ph.qbra %[temp0], %[temp0] \n\t" "preceu.ph.qbl %[temp3], %[temp1] \n\t" "preceu.ph.qbr %[temp1], %[temp1] \n\t" "addqh_r.ph %[temp4], %[temp0], %[temp2] \n\t" "packrl.ph %[temp7], %[temp1], %[temp0] \n\t" "precrq.ph.w %[temp6], %[temp1], %[temp2] \n\t" "shll.ph %[temp9], %[temp2], 1 \n\t" "addqh_r.ph %[temp5], %[temp7], %[temp2] \n\t" "shll.ph %[temp8], %[temp7], 1 \n\t" "addu.ph %[temp2], %[temp2], %[temp6] \n\t" "addu.ph %[temp0], %[temp0], %[temp7] \n\t" "packrl.ph %[temp7], %[temp3], %[temp1] \n\t" "addu.ph %[temp6], %[temp1], %[temp3] \n\t" "addu.ph %[temp2], %[temp2], %[temp8] \n\t" "addu.ph %[temp0], %[temp0], %[temp9] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "shra_r.ph %[temp2], %[temp2], 2 \n\t" "shra_r.ph %[temp0], %[temp0], 2 \n\t" "addu.ph %[temp6], %[temp6], %[temp7] \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "precrq.ph.w %[temp1], %[temp2], %[temp5] \n\t" "precrq.ph.w %[temp3], %[temp0], %[temp4] \n\t" "precr.qb.ph %[temp7], %[temp6], %[temp1] \n\t" "precr.qb.ph %[temp6], %[temp1], %[temp3] \n\t" "usw %[temp7], 0*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp6], 1*" XSTR(BPS) "(%[dst]) \n\t" "append %[temp2], %[temp5], 16 \n\t" "append %[temp0], %[temp4], 16 \n\t" "precr.qb.ph %[temp5], %[temp3], %[temp2] \n\t" "precr.qb.ph %[temp4], %[temp2], %[temp0] \n\t" "usw %[temp5], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp4], 3*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void HU4(uint8_t* dst, const uint8_t* top) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; __asm__ volatile ( "ulw %[temp0], -5(%[top]) \n\t" "preceu.ph.qbl %[temp1], %[temp0] \n\t" "preceu.ph.qbr %[temp2], %[temp0] \n\t" "packrl.ph %[temp3], %[temp1], %[temp2] \n\t" "replv.qb %[temp7], %[temp2] \n\t" "addqh_r.ph %[temp4], %[temp1], %[temp3] \n\t" "addqh_r.ph %[temp5], %[temp3], %[temp2] \n\t" "shll.ph %[temp6], %[temp3], 1 \n\t" "addu.ph %[temp3], %[temp2], %[temp3] \n\t" "addu.ph %[temp6], %[temp1], %[temp6] \n\t" "shll.ph %[temp0], %[temp2], 1 \n\t" "addu.ph %[temp6], %[temp6], %[temp2] \n\t" "addu.ph %[temp0], %[temp3], %[temp0] \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "shra_r.ph %[temp0], %[temp0], 2 \n\t" "packrl.ph %[temp3], %[temp6], %[temp5] \n\t" "precrq.ph.w %[temp2], %[temp6], %[temp4] \n\t" "append %[temp0], %[temp5], 16 \n\t" "precr.qb.ph %[temp3], %[temp3], %[temp2] \n\t" "usw %[temp3], 0*" XSTR(BPS) "(%[dst]) \n\t" "precr.qb.ph %[temp1], %[temp7], %[temp0] \n\t" "usw %[temp7], 3*" XSTR(BPS) "(%[dst]) \n\t" "packrl.ph %[temp2], %[temp1], %[temp3] \n\t" "usw %[temp1], 2*" XSTR(BPS) "(%[dst]) \n\t" "usw %[temp2], 1*" XSTR(BPS) "(%[dst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } //------------------------------------------------------------------------------ // Chroma 8x8 prediction (paragraph 12.2) static void IntraChromaPreds_MIPSdspR2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { // U block DCMode8(C8DC8 + dst, left, top); VerticalPred8(C8VE8 + dst, top); HorizontalPred8(C8HE8 + dst, left); TrueMotion8(C8TM8 + dst, left, top); // V block dst += 8; if (top) top += 8; if (left) left += 16; DCMode8(C8DC8 + dst, left, top); VerticalPred8(C8VE8 + dst, top); HorizontalPred8(C8HE8 + dst, left); TrueMotion8(C8TM8 + dst, left, top); } //------------------------------------------------------------------------------ // luma 16x16 prediction (paragraph 12.3) static void Intra16Preds_MIPSdspR2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { DCMode16(I16DC16 + dst, left, top); VerticalPred16(I16VE16 + dst, top); HorizontalPred16(I16HE16 + dst, left); TrueMotion16(I16TM16 + dst, left, top); } // Left samples are top[-5 .. -2], top_left is top[-1], top are // located at top[0..3], and top right is top[4..7] static void Intra4Preds_MIPSdspR2(uint8_t* dst, const uint8_t* top) { DC4(I4DC4 + dst, top); TM4(I4TM4 + dst, top); VE4(I4VE4 + dst, top); HE4(I4HE4 + dst, top); RD4(I4RD4 + dst, top); VR4(I4VR4 + dst, top); LD4(I4LD4 + dst, top); VL4(I4VL4 + dst, top); HD4(I4HD4 + dst, top); HU4(I4HU4 + dst, top); } //------------------------------------------------------------------------------ // Metric #if !defined(WORK_AROUND_GCC) #define GET_SSE_INNER(A) \ "lw %[temp0], " #A "(%[a]) \n\t" \ "lw %[temp1], " #A "(%[b]) \n\t" \ "preceu.ph.qbr %[temp2], %[temp0] \n\t" \ "preceu.ph.qbl %[temp0], %[temp0] \n\t" \ "preceu.ph.qbr %[temp3], %[temp1] \n\t" \ "preceu.ph.qbl %[temp1], %[temp1] \n\t" \ "subq.ph %[temp2], %[temp2], %[temp3] \n\t" \ "subq.ph %[temp0], %[temp0], %[temp1] \n\t" \ "dpa.w.ph $ac0, %[temp2], %[temp2] \n\t" \ "dpa.w.ph $ac0, %[temp0], %[temp0] \n\t" #define GET_SSE(A, B, C, D) \ GET_SSE_INNER(A) \ GET_SSE_INNER(B) \ GET_SSE_INNER(C) \ GET_SSE_INNER(D) static int SSE16x16_MIPSdspR2(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3; __asm__ volatile ( "mult $zero, $zero \n\t" GET_SSE( 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS) GET_SSE( 1 * BPS, 4 + 1 * BPS, 8 + 1 * BPS, 12 + 1 * BPS) GET_SSE( 2 * BPS, 4 + 2 * BPS, 8 + 2 * BPS, 12 + 2 * BPS) GET_SSE( 3 * BPS, 4 + 3 * BPS, 8 + 3 * BPS, 12 + 3 * BPS) GET_SSE( 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS) GET_SSE( 5 * BPS, 4 + 5 * BPS, 8 + 5 * BPS, 12 + 5 * BPS) GET_SSE( 6 * BPS, 4 + 6 * BPS, 8 + 6 * BPS, 12 + 6 * BPS) GET_SSE( 7 * BPS, 4 + 7 * BPS, 8 + 7 * BPS, 12 + 7 * BPS) GET_SSE( 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS) GET_SSE( 9 * BPS, 4 + 9 * BPS, 8 + 9 * BPS, 12 + 9 * BPS) GET_SSE(10 * BPS, 4 + 10 * BPS, 8 + 10 * BPS, 12 + 10 * BPS) GET_SSE(11 * BPS, 4 + 11 * BPS, 8 + 11 * BPS, 12 + 11 * BPS) GET_SSE(12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS) GET_SSE(13 * BPS, 4 + 13 * BPS, 8 + 13 * BPS, 12 + 13 * BPS) GET_SSE(14 * BPS, 4 + 14 * BPS, 8 + 14 * BPS, 12 + 14 * BPS) GET_SSE(15 * BPS, 4 + 15 * BPS, 8 + 15 * BPS, 12 + 15 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE16x8_MIPSdspR2(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3; __asm__ volatile ( "mult $zero, $zero \n\t" GET_SSE( 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS) GET_SSE( 1 * BPS, 4 + 1 * BPS, 8 + 1 * BPS, 12 + 1 * BPS) GET_SSE( 2 * BPS, 4 + 2 * BPS, 8 + 2 * BPS, 12 + 2 * BPS) GET_SSE( 3 * BPS, 4 + 3 * BPS, 8 + 3 * BPS, 12 + 3 * BPS) GET_SSE( 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS) GET_SSE( 5 * BPS, 4 + 5 * BPS, 8 + 5 * BPS, 12 + 5 * BPS) GET_SSE( 6 * BPS, 4 + 6 * BPS, 8 + 6 * BPS, 12 + 6 * BPS) GET_SSE( 7 * BPS, 4 + 7 * BPS, 8 + 7 * BPS, 12 + 7 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE8x8_MIPSdspR2(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3; __asm__ volatile ( "mult $zero, $zero \n\t" GET_SSE(0 * BPS, 4 + 0 * BPS, 1 * BPS, 4 + 1 * BPS) GET_SSE(2 * BPS, 4 + 2 * BPS, 3 * BPS, 4 + 3 * BPS) GET_SSE(4 * BPS, 4 + 4 * BPS, 5 * BPS, 4 + 5 * BPS) GET_SSE(6 * BPS, 4 + 6 * BPS, 7 * BPS, 4 + 7 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE4x4_MIPSdspR2(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3; __asm__ volatile ( "mult $zero, $zero \n\t" GET_SSE(0 * BPS, 1 * BPS, 2 * BPS, 3 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } #undef GET_SSE #undef GET_SSE_INNER #endif // !WORK_AROUND_GCC #undef FILL_8_OR_16 #undef FILL_PART #undef OUTPUT_EARLY_CLOBBER_REGS_17 #undef MUL_HALF #undef ABS_X8 #undef ADD_SUB_HALVES_X4 //------------------------------------------------------------------------------ // Quantization // // macro for one pass through for loop in QuantizeBlock reading 2 values at time // QUANTDIV macro inlined // J - offset in bytes (kZigzag[n] * 2) // K - offset in bytes (kZigzag[n] * 4) // N - offset in bytes (n * 2) // N1 - offset in bytes ((n + 1) * 2) #define QUANTIZE_ONE(J, K, N, N1) \ "ulw %[temp1], " #J "(%[ppin]) \n\t" \ "ulw %[temp2], " #J "(%[ppsharpen]) \n\t" \ "lhu %[temp3], " #K "(%[ppzthresh]) \n\t" \ "lhu %[temp6], " #K "+4(%[ppzthresh]) \n\t" \ "absq_s.ph %[temp4], %[temp1] \n\t" \ "ins %[temp3], %[temp6], 16, 16 \n\t" \ "addu.ph %[coeff], %[temp4], %[temp2] \n\t" \ "shra.ph %[sign], %[temp1], 15 \n\t" \ "li %[level], 0x10001 \n\t" \ "cmp.lt.ph %[temp3], %[coeff] \n\t" \ "lhu %[temp1], " #J "(%[ppiq]) \n\t" \ "pick.ph %[temp5], %[level], $0 \n\t" \ "lw %[temp2], " #K "(%[ppbias]) \n\t" \ "beqz %[temp5], 0f \n\t" \ "lhu %[temp3], " #J "(%[ppq]) \n\t" \ "beq %[temp5], %[level], 1f \n\t" \ "andi %[temp5], %[temp5], 0x1 \n\t" \ "andi %[temp4], %[coeff], 0xffff \n\t" \ "beqz %[temp5], 2f \n\t" \ "mul %[level], %[temp4], %[temp1] \n\t" \ "sh $0, " #J "+2(%[ppin]) \n\t" \ "sh $0, " #N1 "(%[pout]) \n\t" \ "addu %[level], %[level], %[temp2] \n\t" \ "sra %[level], %[level], 17 \n\t" \ "slt %[temp4], %[max_level], %[level] \n\t" \ "movn %[level], %[max_level], %[temp4] \n\t" \ "andi %[temp6], %[sign], 0xffff \n\t" \ "xor %[level], %[level], %[temp6] \n\t" \ "subu %[level], %[level], %[temp6] \n\t" \ "mul %[temp5], %[level], %[temp3] \n\t" \ "or %[ret], %[ret], %[level] \n\t" \ "sh %[level], " #N "(%[pout]) \n\t" \ "sh %[temp5], " #J "(%[ppin]) \n\t" \ "j 3f \n\t" \ "2: \n\t" \ "lhu %[temp1], " #J "+2(%[ppiq]) \n\t" \ "srl %[temp5], %[coeff], 16 \n\t" \ "mul %[level], %[temp5], %[temp1] \n\t" \ "lw %[temp2], " #K "+4(%[ppbias]) \n\t" \ "lhu %[temp3], " #J "+2(%[ppq]) \n\t" \ "addu %[level], %[level], %[temp2] \n\t" \ "sra %[level], %[level], 17 \n\t" \ "srl %[temp6], %[sign], 16 \n\t" \ "slt %[temp4], %[max_level], %[level] \n\t" \ "movn %[level], %[max_level], %[temp4] \n\t" \ "xor %[level], %[level], %[temp6] \n\t" \ "subu %[level], %[level], %[temp6] \n\t" \ "mul %[temp5], %[level], %[temp3] \n\t" \ "sh $0, " #J "(%[ppin]) \n\t" \ "sh $0, " #N "(%[pout]) \n\t" \ "or %[ret], %[ret], %[level] \n\t" \ "sh %[temp5], " #J "+2(%[ppin]) \n\t" \ "sh %[level], " #N1 "(%[pout]) \n\t" \ "j 3f \n\t" \ "1: \n\t" \ "lhu %[temp1], " #J "(%[ppiq]) \n\t" \ "lw %[temp2], " #K "(%[ppbias]) \n\t" \ "ulw %[temp3], " #J "(%[ppq]) \n\t" \ "andi %[temp5], %[coeff], 0xffff \n\t" \ "srl %[temp0], %[coeff], 16 \n\t" \ "lhu %[temp6], " #J "+2(%[ppiq]) \n\t" \ "lw %[coeff], " #K "+4(%[ppbias]) \n\t" \ "mul %[level], %[temp5], %[temp1] \n\t" \ "mul %[temp4], %[temp0], %[temp6] \n\t" \ "addu %[level], %[level], %[temp2] \n\t" \ "addu %[temp4], %[temp4], %[coeff] \n\t" \ "precrq.ph.w %[level], %[temp4], %[level] \n\t" \ "shra.ph %[level], %[level], 1 \n\t" \ "cmp.lt.ph %[max_level1],%[level] \n\t" \ "pick.ph %[level], %[max_level], %[level] \n\t" \ "xor %[level], %[level], %[sign] \n\t" \ "subu.ph %[level], %[level], %[sign] \n\t" \ "mul.ph %[temp3], %[level], %[temp3] \n\t" \ "or %[ret], %[ret], %[level] \n\t" \ "sh %[level], " #N "(%[pout]) \n\t" \ "srl %[level], %[level], 16 \n\t" \ "sh %[level], " #N1 "(%[pout]) \n\t" \ "usw %[temp3], " #J "(%[ppin]) \n\t" \ "j 3f \n\t" \ "0: \n\t" \ "sh $0, " #N "(%[pout]) \n\t" \ "sh $0, " #N1 "(%[pout]) \n\t" \ "usw $0, " #J "(%[ppin]) \n\t" \ "3: \n\t" static int QuantizeBlock_MIPSdspR2(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { int temp0, temp1, temp2, temp3, temp4, temp5,temp6; int sign, coeff, level; int max_level = MAX_LEVEL; int max_level1 = max_level << 16 | max_level; int ret = 0; int16_t* ppin = &in[0]; int16_t* pout = &out[0]; const uint16_t* ppsharpen = &mtx->sharpen_[0]; const uint32_t* ppzthresh = &mtx->zthresh_[0]; const uint16_t* ppq = &mtx->q_[0]; const uint16_t* ppiq = &mtx->iq_[0]; const uint32_t* ppbias = &mtx->bias_[0]; __asm__ volatile ( QUANTIZE_ONE( 0, 0, 0, 2) QUANTIZE_ONE( 4, 8, 10, 12) QUANTIZE_ONE( 8, 16, 4, 8) QUANTIZE_ONE(12, 24, 14, 24) QUANTIZE_ONE(16, 32, 6, 16) QUANTIZE_ONE(20, 40, 22, 26) QUANTIZE_ONE(24, 48, 18, 20) QUANTIZE_ONE(28, 56, 28, 30) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [sign]"=&r"(sign), [coeff]"=&r"(coeff), [level]"=&r"(level), [temp6]"=&r"(temp6), [ret]"+&r"(ret) : [ppin]"r"(ppin), [pout]"r"(pout), [max_level1]"r"(max_level1), [ppiq]"r"(ppiq), [max_level]"r"(max_level), [ppbias]"r"(ppbias), [ppzthresh]"r"(ppzthresh), [ppsharpen]"r"(ppsharpen), [ppq]"r"(ppq) : "memory", "hi", "lo" ); return (ret != 0); } static int Quantize2Blocks_MIPSdspR2(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; nz = QuantizeBlock_MIPSdspR2(in + 0 * 16, out + 0 * 16, mtx) << 0; nz |= QuantizeBlock_MIPSdspR2(in + 1 * 16, out + 1 * 16, mtx) << 1; return nz; } #undef QUANTIZE_ONE // macro for one horizontal pass in FTransformWHT // temp0..temp7 holds tmp[0]..tmp[15] // A, B, C, D - offset in bytes to load from in buffer // TEMP0, TEMP1 - registers for corresponding tmp elements #define HORIZONTAL_PASS_WHT(A, B, C, D, TEMP0, TEMP1) \ "lh %[" #TEMP0 "], " #A "(%[in]) \n\t" \ "lh %[" #TEMP1 "], " #B "(%[in]) \n\t" \ "lh %[temp8], " #C "(%[in]) \n\t" \ "lh %[temp9], " #D "(%[in]) \n\t" \ "ins %[" #TEMP1 "], %[" #TEMP0 "], 16, 16 \n\t" \ "ins %[temp9], %[temp8], 16, 16 \n\t" \ "subq.ph %[temp8], %[" #TEMP1 "], %[temp9] \n\t" \ "addq.ph %[temp9], %[" #TEMP1 "], %[temp9] \n\t" \ "precrq.ph.w %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \ "append %[temp8], %[temp9], 16 \n\t" \ "subq.ph %[" #TEMP1 "], %[" #TEMP0 "], %[temp8] \n\t" \ "addq.ph %[" #TEMP0 "], %[" #TEMP0 "], %[temp8] \n\t" \ "rotr %[" #TEMP1 "], %[" #TEMP1 "], 16 \n\t" // macro for one vertical pass in FTransformWHT // temp0..temp7 holds tmp[0]..tmp[15] // A, B, C, D - offsets in bytes to store to out buffer // TEMP0, TEMP2, TEMP4 and TEMP6 - registers for corresponding tmp elements #define VERTICAL_PASS_WHT(A, B, C, D, TEMP0, TEMP2, TEMP4, TEMP6) \ "addq.ph %[temp8], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \ "addq.ph %[temp9], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \ "subq.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \ "subq.ph %[" #TEMP6 "], %[" #TEMP0 "], %[" #TEMP4 "] \n\t" \ "addqh.ph %[" #TEMP0 "], %[temp8], %[temp9] \n\t" \ "subqh.ph %[" #TEMP4 "], %[" #TEMP6 "], %[" #TEMP2 "] \n\t" \ "addqh.ph %[" #TEMP2 "], %[" #TEMP2 "], %[" #TEMP6 "] \n\t" \ "subqh.ph %[" #TEMP6 "], %[temp8], %[temp9] \n\t" \ "usw %[" #TEMP0 "], " #A "(%[out]) \n\t" \ "usw %[" #TEMP2 "], " #B "(%[out]) \n\t" \ "usw %[" #TEMP4 "], " #C "(%[out]) \n\t" \ "usw %[" #TEMP6 "], " #D "(%[out]) \n\t" static void FTransformWHT_MIPSdspR2(const int16_t* in, int16_t* out) { int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( HORIZONTAL_PASS_WHT( 0, 32, 64, 96, temp0, temp1) HORIZONTAL_PASS_WHT(128, 160, 192, 224, temp2, temp3) HORIZONTAL_PASS_WHT(256, 288, 320, 352, temp4, temp5) HORIZONTAL_PASS_WHT(384, 416, 448, 480, temp6, temp7) VERTICAL_PASS_WHT(0, 8, 16, 24, temp0, temp2, temp4, temp6) VERTICAL_PASS_WHT(4, 12, 20, 28, temp1, temp3, temp5, temp7) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [in]"r"(in), [out]"r"(out) : "memory" ); } #undef VERTICAL_PASS_WHT #undef HORIZONTAL_PASS_WHT // macro for converting coefficients to bin // convert 8 coeffs at time // A, B, C, D - offsets in bytes to load from out buffer #define CONVERT_COEFFS_TO_BIN(A, B, C, D) \ "ulw %[temp0], " #A "(%[out]) \n\t" \ "ulw %[temp1], " #B "(%[out]) \n\t" \ "ulw %[temp2], " #C "(%[out]) \n\t" \ "ulw %[temp3], " #D "(%[out]) \n\t" \ "absq_s.ph %[temp0], %[temp0] \n\t" \ "absq_s.ph %[temp1], %[temp1] \n\t" \ "absq_s.ph %[temp2], %[temp2] \n\t" \ "absq_s.ph %[temp3], %[temp3] \n\t" \ "shra.ph %[temp0], %[temp0], 3 \n\t" \ "shra.ph %[temp1], %[temp1], 3 \n\t" \ "shra.ph %[temp2], %[temp2], 3 \n\t" \ "shra.ph %[temp3], %[temp3], 3 \n\t" \ "shll_s.ph %[temp0], %[temp0], 10 \n\t" \ "shll_s.ph %[temp1], %[temp1], 10 \n\t" \ "shll_s.ph %[temp2], %[temp2], 10 \n\t" \ "shll_s.ph %[temp3], %[temp3], 10 \n\t" \ "shrl.ph %[temp0], %[temp0], 10 \n\t" \ "shrl.ph %[temp1], %[temp1], 10 \n\t" \ "shrl.ph %[temp2], %[temp2], 10 \n\t" \ "shrl.ph %[temp3], %[temp3], 10 \n\t" \ "shll.ph %[temp0], %[temp0], 2 \n\t" \ "shll.ph %[temp1], %[temp1], 2 \n\t" \ "shll.ph %[temp2], %[temp2], 2 \n\t" \ "shll.ph %[temp3], %[temp3], 2 \n\t" \ "ext %[temp4], %[temp0], 0, 16 \n\t" \ "ext %[temp0], %[temp0], 16, 16 \n\t" \ "addu %[temp4], %[temp4], %[dist] \n\t" \ "addu %[temp0], %[temp0], %[dist] \n\t" \ "ext %[temp5], %[temp1], 0, 16 \n\t" \ "lw %[temp8], 0(%[temp4]) \n\t" \ "ext %[temp1], %[temp1], 16, 16 \n\t" \ "addu %[temp5], %[temp5], %[dist] \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp4]) \n\t" \ "lw %[temp8], 0(%[temp0]) \n\t" \ "addu %[temp1], %[temp1], %[dist] \n\t" \ "ext %[temp6], %[temp2], 0, 16 \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp0]) \n\t" \ "lw %[temp8], 0(%[temp5]) \n\t" \ "ext %[temp2], %[temp2], 16, 16 \n\t" \ "addu %[temp6], %[temp6], %[dist] \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp5]) \n\t" \ "lw %[temp8], 0(%[temp1]) \n\t" \ "addu %[temp2], %[temp2], %[dist] \n\t" \ "ext %[temp7], %[temp3], 0, 16 \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp1]) \n\t" \ "lw %[temp8], 0(%[temp6]) \n\t" \ "ext %[temp3], %[temp3], 16, 16 \n\t" \ "addu %[temp7], %[temp7], %[dist] \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp6]) \n\t" \ "lw %[temp8], 0(%[temp2]) \n\t" \ "addu %[temp3], %[temp3], %[dist] \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp2]) \n\t" \ "lw %[temp8], 0(%[temp7]) \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp7]) \n\t" \ "lw %[temp8], 0(%[temp3]) \n\t" \ "addiu %[temp8], %[temp8], 1 \n\t" \ "sw %[temp8], 0(%[temp3]) \n\t" static void CollectHistogram_MIPSdspR2(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; const int max_coeff = (MAX_COEFF_THRESH << 16) + MAX_COEFF_THRESH; for (j = start_block; j < end_block; ++j) { int16_t out[16]; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; VP8FTransform(ref + VP8DspScan[j], pred + VP8DspScan[j], out); // Convert coefficients to bin. __asm__ volatile ( CONVERT_COEFFS_TO_BIN( 0, 4, 8, 12) CONVERT_COEFFS_TO_BIN(16, 20, 24, 28) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8) : [dist]"r"(distribution), [out]"r"(out), [max_coeff]"r"(max_coeff) : "memory" ); } VP8SetHistogramData(distribution, histo); } #undef CONVERT_COEFFS_TO_BIN //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitMIPSdspR2(void) { VP8FTransform = FTransform_MIPSdspR2; VP8FTransformWHT = FTransformWHT_MIPSdspR2; VP8ITransform = ITransform_MIPSdspR2; VP8TDisto4x4 = Disto4x4_MIPSdspR2; VP8TDisto16x16 = Disto16x16_MIPSdspR2; VP8EncPredLuma16 = Intra16Preds_MIPSdspR2; VP8EncPredChroma8 = IntraChromaPreds_MIPSdspR2; VP8EncPredLuma4 = Intra4Preds_MIPSdspR2; #if !defined(WORK_AROUND_GCC) VP8SSE16x16 = SSE16x16_MIPSdspR2; VP8SSE8x8 = SSE8x8_MIPSdspR2; VP8SSE16x8 = SSE16x8_MIPSdspR2; VP8SSE4x4 = SSE4x4_MIPSdspR2; #endif VP8EncQuantizeBlock = QuantizeBlock_MIPSdspR2; VP8EncQuantize2Blocks = Quantize2Blocks_MIPSdspR2; VP8CollectHistogram = CollectHistogram_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8EncDspInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/dec_msa.c0000644000014400001440000011744014606317060013176 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA version of dsp functions // // Author(s): Prashant Patil (prashant.patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include "src/dsp/msa_macro.h" //------------------------------------------------------------------------------ // Transforms #define IDCT_1D_W(in0, in1, in2, in3, out0, out1, out2, out3) { \ v4i32 a1_m, b1_m, c1_m, d1_m; \ v4i32 c_tmp1_m, c_tmp2_m, d_tmp1_m, d_tmp2_m; \ const v4i32 cospi8sqrt2minus1 = __msa_fill_w(20091); \ const v4i32 sinpi8sqrt2 = __msa_fill_w(35468); \ \ a1_m = in0 + in2; \ b1_m = in0 - in2; \ c_tmp1_m = (in1 * sinpi8sqrt2) >> 16; \ c_tmp2_m = in3 + ((in3 * cospi8sqrt2minus1) >> 16); \ c1_m = c_tmp1_m - c_tmp2_m; \ d_tmp1_m = in1 + ((in1 * cospi8sqrt2minus1) >> 16); \ d_tmp2_m = (in3 * sinpi8sqrt2) >> 16; \ d1_m = d_tmp1_m + d_tmp2_m; \ BUTTERFLY_4(a1_m, b1_m, c1_m, d1_m, out0, out1, out2, out3); \ } static void TransformOne(const int16_t* in, uint8_t* dst) { v8i16 input0, input1; v4i32 in0, in1, in2, in3, hz0, hz1, hz2, hz3, vt0, vt1, vt2, vt3; v4i32 res0, res1, res2, res3; const v16i8 zero = { 0 }; v16i8 dest0, dest1, dest2, dest3; LD_SH2(in, 8, input0, input1); UNPCK_SH_SW(input0, in0, in1); UNPCK_SH_SW(input1, in2, in3); IDCT_1D_W(in0, in1, in2, in3, hz0, hz1, hz2, hz3); TRANSPOSE4x4_SW_SW(hz0, hz1, hz2, hz3, hz0, hz1, hz2, hz3); IDCT_1D_W(hz0, hz1, hz2, hz3, vt0, vt1, vt2, vt3); SRARI_W4_SW(vt0, vt1, vt2, vt3, 3); TRANSPOSE4x4_SW_SW(vt0, vt1, vt2, vt3, vt0, vt1, vt2, vt3); LD_SB4(dst, BPS, dest0, dest1, dest2, dest3); ILVR_B4_SW(zero, dest0, zero, dest1, zero, dest2, zero, dest3, res0, res1, res2, res3); ILVR_H4_SW(zero, res0, zero, res1, zero, res2, zero, res3, res0, res1, res2, res3); ADD4(res0, vt0, res1, vt1, res2, vt2, res3, vt3, res0, res1, res2, res3); CLIP_SW4_0_255(res0, res1, res2, res3); PCKEV_B2_SW(res0, res1, res2, res3, vt0, vt1); res0 = (v4i32)__msa_pckev_b((v16i8)vt0, (v16i8)vt1); ST4x4_UB(res0, res0, 3, 2, 1, 0, dst, BPS); } static void TransformTwo(const int16_t* in, uint8_t* dst, int do_two) { TransformOne(in, dst); if (do_two) { TransformOne(in + 16, dst + 4); } } static void TransformWHT(const int16_t* in, int16_t* out) { v8i16 input0, input1; const v8i16 mask0 = { 0, 1, 2, 3, 8, 9, 10, 11 }; const v8i16 mask1 = { 4, 5, 6, 7, 12, 13, 14, 15 }; const v8i16 mask2 = { 0, 4, 8, 12, 1, 5, 9, 13 }; const v8i16 mask3 = { 3, 7, 11, 15, 2, 6, 10, 14 }; v8i16 tmp0, tmp1, tmp2, tmp3; v8i16 out0, out1; LD_SH2(in, 8, input0, input1); input1 = SLDI_SH(input1, input1, 8); tmp0 = input0 + input1; tmp1 = input0 - input1; VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); out0 = tmp2 + tmp3; out1 = tmp2 - tmp3; VSHF_H2_SH(out0, out1, out0, out1, mask2, mask3, input0, input1); tmp0 = input0 + input1; tmp1 = input0 - input1; VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); tmp0 = tmp2 + tmp3; tmp1 = tmp2 - tmp3; ADDVI_H2_SH(tmp0, 3, tmp1, 3, out0, out1); SRAI_H2_SH(out0, out1, 3); out[0] = __msa_copy_s_h(out0, 0); out[16] = __msa_copy_s_h(out0, 4); out[32] = __msa_copy_s_h(out1, 0); out[48] = __msa_copy_s_h(out1, 4); out[64] = __msa_copy_s_h(out0, 1); out[80] = __msa_copy_s_h(out0, 5); out[96] = __msa_copy_s_h(out1, 1); out[112] = __msa_copy_s_h(out1, 5); out[128] = __msa_copy_s_h(out0, 2); out[144] = __msa_copy_s_h(out0, 6); out[160] = __msa_copy_s_h(out1, 2); out[176] = __msa_copy_s_h(out1, 6); out[192] = __msa_copy_s_h(out0, 3); out[208] = __msa_copy_s_h(out0, 7); out[224] = __msa_copy_s_h(out1, 3); out[240] = __msa_copy_s_h(out1, 7); } static void TransformDC(const int16_t* in, uint8_t* dst) { const int DC = (in[0] + 4) >> 3; const v8i16 tmp0 = __msa_fill_h(DC); ADDBLK_ST4x4_UB(tmp0, tmp0, tmp0, tmp0, dst, BPS); } static void TransformAC3(const int16_t* in, uint8_t* dst) { const int a = in[0] + 4; const int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]); const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]); const int in2 = WEBP_TRANSFORM_AC3_MUL2(in[1]); const int in3 = WEBP_TRANSFORM_AC3_MUL1(in[1]); v4i32 tmp0 = { 0 }; v4i32 out0 = __msa_fill_w(a + d4); v4i32 out1 = __msa_fill_w(a + c4); v4i32 out2 = __msa_fill_w(a - c4); v4i32 out3 = __msa_fill_w(a - d4); v4i32 res0, res1, res2, res3; const v4i32 zero = { 0 }; v16u8 dest0, dest1, dest2, dest3; INSERT_W4_SW(in3, in2, -in2, -in3, tmp0); ADD4(out0, tmp0, out1, tmp0, out2, tmp0, out3, tmp0, out0, out1, out2, out3); SRAI_W4_SW(out0, out1, out2, out3, 3); LD_UB4(dst, BPS, dest0, dest1, dest2, dest3); ILVR_B4_SW(zero, dest0, zero, dest1, zero, dest2, zero, dest3, res0, res1, res2, res3); ILVR_H4_SW(zero, res0, zero, res1, zero, res2, zero, res3, res0, res1, res2, res3); ADD4(res0, out0, res1, out1, res2, out2, res3, out3, res0, res1, res2, res3); CLIP_SW4_0_255(res0, res1, res2, res3); PCKEV_B2_SW(res0, res1, res2, res3, out0, out1); res0 = (v4i32)__msa_pckev_b((v16i8)out0, (v16i8)out1); ST4x4_UB(res0, res0, 3, 2, 1, 0, dst, BPS); } //------------------------------------------------------------------------------ // Edge filtering functions #define FLIP_SIGN2(in0, in1, out0, out1) { \ out0 = (v16i8)__msa_xori_b(in0, 0x80); \ out1 = (v16i8)__msa_xori_b(in1, 0x80); \ } #define FLIP_SIGN4(in0, in1, in2, in3, out0, out1, out2, out3) { \ FLIP_SIGN2(in0, in1, out0, out1); \ FLIP_SIGN2(in2, in3, out2, out3); \ } #define FILT_VAL(q0_m, p0_m, mask, filt) do { \ v16i8 q0_sub_p0; \ q0_sub_p0 = __msa_subs_s_b(q0_m, p0_m); \ filt = __msa_adds_s_b(filt, q0_sub_p0); \ filt = __msa_adds_s_b(filt, q0_sub_p0); \ filt = __msa_adds_s_b(filt, q0_sub_p0); \ filt = filt & mask; \ } while (0) #define FILT2(q_m, p_m, q, p) do { \ u_r = SRAI_H(temp1, 7); \ u_r = __msa_sat_s_h(u_r, 7); \ u_l = SRAI_H(temp3, 7); \ u_l = __msa_sat_s_h(u_l, 7); \ u = __msa_pckev_b((v16i8)u_l, (v16i8)u_r); \ q_m = __msa_subs_s_b(q_m, u); \ p_m = __msa_adds_s_b(p_m, u); \ q = __msa_xori_b((v16u8)q_m, 0x80); \ p = __msa_xori_b((v16u8)p_m, 0x80); \ } while (0) #define LPF_FILTER4_4W(p1, p0, q0, q1, mask, hev) do { \ v16i8 p1_m, p0_m, q0_m, q1_m; \ v16i8 filt, t1, t2; \ const v16i8 cnst4b = __msa_ldi_b(4); \ const v16i8 cnst3b = __msa_ldi_b(3); \ \ FLIP_SIGN4(p1, p0, q0, q1, p1_m, p0_m, q0_m, q1_m); \ filt = __msa_subs_s_b(p1_m, q1_m); \ filt = filt & hev; \ FILT_VAL(q0_m, p0_m, mask, filt); \ t1 = __msa_adds_s_b(filt, cnst4b); \ t1 = SRAI_B(t1, 3); \ t2 = __msa_adds_s_b(filt, cnst3b); \ t2 = SRAI_B(t2, 3); \ q0_m = __msa_subs_s_b(q0_m, t1); \ q0 = __msa_xori_b((v16u8)q0_m, 0x80); \ p0_m = __msa_adds_s_b(p0_m, t2); \ p0 = __msa_xori_b((v16u8)p0_m, 0x80); \ filt = __msa_srari_b(t1, 1); \ hev = __msa_xori_b(hev, 0xff); \ filt = filt & hev; \ q1_m = __msa_subs_s_b(q1_m, filt); \ q1 = __msa_xori_b((v16u8)q1_m, 0x80); \ p1_m = __msa_adds_s_b(p1_m, filt); \ p1 = __msa_xori_b((v16u8)p1_m, 0x80); \ } while (0) #define LPF_MBFILTER(p2, p1, p0, q0, q1, q2, mask, hev) do { \ v16i8 p2_m, p1_m, p0_m, q2_m, q1_m, q0_m; \ v16i8 u, filt, t1, t2, filt_sign; \ v8i16 filt_r, filt_l, u_r, u_l; \ v8i16 temp0, temp1, temp2, temp3; \ const v16i8 cnst4b = __msa_ldi_b(4); \ const v16i8 cnst3b = __msa_ldi_b(3); \ const v8i16 cnst9h = __msa_ldi_h(9); \ const v8i16 cnst63h = __msa_ldi_h(63); \ \ FLIP_SIGN4(p1, p0, q0, q1, p1_m, p0_m, q0_m, q1_m); \ filt = __msa_subs_s_b(p1_m, q1_m); \ FILT_VAL(q0_m, p0_m, mask, filt); \ FLIP_SIGN2(p2, q2, p2_m, q2_m); \ t2 = filt & hev; \ /* filt_val &= ~hev */ \ hev = __msa_xori_b(hev, 0xff); \ filt = filt & hev; \ t1 = __msa_adds_s_b(t2, cnst4b); \ t1 = SRAI_B(t1, 3); \ t2 = __msa_adds_s_b(t2, cnst3b); \ t2 = SRAI_B(t2, 3); \ q0_m = __msa_subs_s_b(q0_m, t1); \ p0_m = __msa_adds_s_b(p0_m, t2); \ filt_sign = __msa_clti_s_b(filt, 0); \ ILVRL_B2_SH(filt_sign, filt, filt_r, filt_l); \ /* update q2/p2 */ \ temp0 = filt_r * cnst9h; \ temp1 = temp0 + cnst63h; \ temp2 = filt_l * cnst9h; \ temp3 = temp2 + cnst63h; \ FILT2(q2_m, p2_m, q2, p2); \ /* update q1/p1 */ \ temp1 = temp1 + temp0; \ temp3 = temp3 + temp2; \ FILT2(q1_m, p1_m, q1, p1); \ /* update q0/p0 */ \ temp1 = temp1 + temp0; \ temp3 = temp3 + temp2; \ FILT2(q0_m, p0_m, q0, p0); \ } while (0) #define LPF_MASK_HEV(p3_in, p2_in, p1_in, p0_in, \ q0_in, q1_in, q2_in, q3_in, \ limit_in, b_limit_in, thresh_in, \ hev_out, mask_out) do { \ v16u8 p3_asub_p2_m, p2_asub_p1_m, p1_asub_p0_m, q1_asub_q0_m; \ v16u8 p1_asub_q1_m, p0_asub_q0_m, q3_asub_q2_m, q2_asub_q1_m; \ v16u8 flat_out; \ \ /* absolute subtraction of pixel values */ \ p3_asub_p2_m = __msa_asub_u_b(p3_in, p2_in); \ p2_asub_p1_m = __msa_asub_u_b(p2_in, p1_in); \ p1_asub_p0_m = __msa_asub_u_b(p1_in, p0_in); \ q1_asub_q0_m = __msa_asub_u_b(q1_in, q0_in); \ q2_asub_q1_m = __msa_asub_u_b(q2_in, q1_in); \ q3_asub_q2_m = __msa_asub_u_b(q3_in, q2_in); \ p0_asub_q0_m = __msa_asub_u_b(p0_in, q0_in); \ p1_asub_q1_m = __msa_asub_u_b(p1_in, q1_in); \ /* calculation of hev */ \ flat_out = __msa_max_u_b(p1_asub_p0_m, q1_asub_q0_m); \ hev_out = (thresh_in < flat_out); \ /* calculation of mask */ \ p0_asub_q0_m = __msa_adds_u_b(p0_asub_q0_m, p0_asub_q0_m); \ p1_asub_q1_m = SRAI_B(p1_asub_q1_m, 1); \ p0_asub_q0_m = __msa_adds_u_b(p0_asub_q0_m, p1_asub_q1_m); \ mask_out = (b_limit_in < p0_asub_q0_m); \ mask_out = __msa_max_u_b(flat_out, mask_out); \ p3_asub_p2_m = __msa_max_u_b(p3_asub_p2_m, p2_asub_p1_m); \ mask_out = __msa_max_u_b(p3_asub_p2_m, mask_out); \ q2_asub_q1_m = __msa_max_u_b(q2_asub_q1_m, q3_asub_q2_m); \ mask_out = __msa_max_u_b(q2_asub_q1_m, mask_out); \ mask_out = (limit_in < mask_out); \ mask_out = __msa_xori_b(mask_out, 0xff); \ } while (0) #define ST6x1_UB(in0, in0_idx, in1, in1_idx, pdst, stride) do { \ const uint16_t tmp0_h = __msa_copy_s_h((v8i16)in1, in1_idx); \ const uint32_t tmp0_w = __msa_copy_s_w((v4i32)in0, in0_idx); \ SW(tmp0_w, pdst); \ SH(tmp0_h, pdst + stride); \ } while (0) #define ST6x4_UB(in0, start_in0_idx, in1, start_in1_idx, pdst, stride) do { \ uint8_t* ptmp1 = (uint8_t*)pdst; \ ST6x1_UB(in0, start_in0_idx, in1, start_in1_idx, ptmp1, 4); \ ptmp1 += stride; \ ST6x1_UB(in0, start_in0_idx + 1, in1, start_in1_idx + 1, ptmp1, 4); \ ptmp1 += stride; \ ST6x1_UB(in0, start_in0_idx + 2, in1, start_in1_idx + 2, ptmp1, 4); \ ptmp1 += stride; \ ST6x1_UB(in0, start_in0_idx + 3, in1, start_in1_idx + 3, ptmp1, 4); \ } while (0) #define LPF_SIMPLE_FILT(p1_in, p0_in, q0_in, q1_in, mask) do { \ v16i8 p1_m, p0_m, q0_m, q1_m, filt, filt1, filt2; \ const v16i8 cnst4b = __msa_ldi_b(4); \ const v16i8 cnst3b = __msa_ldi_b(3); \ \ FLIP_SIGN4(p1_in, p0_in, q0_in, q1_in, p1_m, p0_m, q0_m, q1_m); \ filt = __msa_subs_s_b(p1_m, q1_m); \ FILT_VAL(q0_m, p0_m, mask, filt); \ filt1 = __msa_adds_s_b(filt, cnst4b); \ filt1 = SRAI_B(filt1, 3); \ filt2 = __msa_adds_s_b(filt, cnst3b); \ filt2 = SRAI_B(filt2, 3); \ q0_m = __msa_subs_s_b(q0_m, filt1); \ p0_m = __msa_adds_s_b(p0_m, filt2); \ q0_in = __msa_xori_b((v16u8)q0_m, 0x80); \ p0_in = __msa_xori_b((v16u8)p0_m, 0x80); \ } while (0) #define LPF_SIMPLE_MASK(p1, p0, q0, q1, b_limit, mask) do { \ v16u8 p1_a_sub_q1, p0_a_sub_q0; \ \ p0_a_sub_q0 = __msa_asub_u_b(p0, q0); \ p1_a_sub_q1 = __msa_asub_u_b(p1, q1); \ p1_a_sub_q1 = (v16u8)__msa_srli_b((v16i8)p1_a_sub_q1, 1); \ p0_a_sub_q0 = __msa_adds_u_b(p0_a_sub_q0, p0_a_sub_q0); \ mask = __msa_adds_u_b(p0_a_sub_q0, p1_a_sub_q1); \ mask = (mask <= b_limit); \ } while (0) static void VFilter16(uint8_t* src, int stride, int b_limit_in, int limit_in, int thresh_in) { uint8_t* ptemp = src - 4 * stride; v16u8 p3, p2, p1, p0, q3, q2, q1, q0; v16u8 mask, hev; const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); LD_UB8(ptemp, stride, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_MBFILTER(p2, p1, p0, q0, q1, q2, mask, hev); ptemp = src - 3 * stride; ST_UB4(p2, p1, p0, q0, ptemp, stride); ptemp += (4 * stride); ST_UB2(q1, q2, ptemp, stride); } static void HFilter16(uint8_t* src, int stride, int b_limit_in, int limit_in, int thresh_in) { uint8_t* ptmp = src - 4; v16u8 p3, p2, p1, p0, q3, q2, q1, q0; v16u8 mask, hev; v16u8 row0, row1, row2, row3, row4, row5, row6, row7, row8; v16u8 row9, row10, row11, row12, row13, row14, row15; v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); LD_UB8(ptmp, stride, row0, row1, row2, row3, row4, row5, row6, row7); ptmp += (8 * stride); LD_UB8(ptmp, stride, row8, row9, row10, row11, row12, row13, row14, row15); TRANSPOSE16x8_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14, row15, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_MBFILTER(p2, p1, p0, q0, q1, q2, mask, hev); ILVR_B2_SH(p1, p2, q0, p0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp3, tmp4); ILVL_B2_SH(p1, p2, q0, p0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp6, tmp7); ILVRL_B2_SH(q2, q1, tmp2, tmp5); ptmp = src - 3; ST6x1_UB(tmp3, 0, tmp2, 0, ptmp, 4); ptmp += stride; ST6x1_UB(tmp3, 1, tmp2, 1, ptmp, 4); ptmp += stride; ST6x1_UB(tmp3, 2, tmp2, 2, ptmp, 4); ptmp += stride; ST6x1_UB(tmp3, 3, tmp2, 3, ptmp, 4); ptmp += stride; ST6x1_UB(tmp4, 0, tmp2, 4, ptmp, 4); ptmp += stride; ST6x1_UB(tmp4, 1, tmp2, 5, ptmp, 4); ptmp += stride; ST6x1_UB(tmp4, 2, tmp2, 6, ptmp, 4); ptmp += stride; ST6x1_UB(tmp4, 3, tmp2, 7, ptmp, 4); ptmp += stride; ST6x1_UB(tmp6, 0, tmp5, 0, ptmp, 4); ptmp += stride; ST6x1_UB(tmp6, 1, tmp5, 1, ptmp, 4); ptmp += stride; ST6x1_UB(tmp6, 2, tmp5, 2, ptmp, 4); ptmp += stride; ST6x1_UB(tmp6, 3, tmp5, 3, ptmp, 4); ptmp += stride; ST6x1_UB(tmp7, 0, tmp5, 4, ptmp, 4); ptmp += stride; ST6x1_UB(tmp7, 1, tmp5, 5, ptmp, 4); ptmp += stride; ST6x1_UB(tmp7, 2, tmp5, 6, ptmp, 4); ptmp += stride; ST6x1_UB(tmp7, 3, tmp5, 7, ptmp, 4); } // on three inner edges static void VFilterHorEdge16i(uint8_t* src, int stride, int b_limit, int limit, int thresh) { v16u8 mask, hev; v16u8 p3, p2, p1, p0, q3, q2, q1, q0; const v16u8 thresh0 = (v16u8)__msa_fill_b(thresh); const v16u8 b_limit0 = (v16u8)__msa_fill_b(b_limit); const v16u8 limit0 = (v16u8)__msa_fill_b(limit); LD_UB8((src - 4 * stride), stride, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit0, b_limit0, thresh0, hev, mask); LPF_FILTER4_4W(p1, p0, q0, q1, mask, hev); ST_UB4(p1, p0, q0, q1, (src - 2 * stride), stride); } static void VFilter16i(uint8_t* src_y, int stride, int b_limit, int limit, int thresh) { VFilterHorEdge16i(src_y + 4 * stride, stride, b_limit, limit, thresh); VFilterHorEdge16i(src_y + 8 * stride, stride, b_limit, limit, thresh); VFilterHorEdge16i(src_y + 12 * stride, stride, b_limit, limit, thresh); } static void HFilterVertEdge16i(uint8_t* src, int stride, int b_limit, int limit, int thresh) { v16u8 mask, hev; v16u8 p3, p2, p1, p0, q3, q2, q1, q0; v16u8 row0, row1, row2, row3, row4, row5, row6, row7; v16u8 row8, row9, row10, row11, row12, row13, row14, row15; v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; const v16u8 thresh0 = (v16u8)__msa_fill_b(thresh); const v16u8 b_limit0 = (v16u8)__msa_fill_b(b_limit); const v16u8 limit0 = (v16u8)__msa_fill_b(limit); LD_UB8(src - 4, stride, row0, row1, row2, row3, row4, row5, row6, row7); LD_UB8(src - 4 + (8 * stride), stride, row8, row9, row10, row11, row12, row13, row14, row15); TRANSPOSE16x8_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14, row15, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit0, b_limit0, thresh0, hev, mask); LPF_FILTER4_4W(p1, p0, q0, q1, mask, hev); ILVR_B2_SH(p0, p1, q1, q0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp2, tmp3); ILVL_B2_SH(p0, p1, q1, q0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp4, tmp5); src -= 2; ST4x8_UB(tmp2, tmp3, src, stride); src += (8 * stride); ST4x8_UB(tmp4, tmp5, src, stride); } static void HFilter16i(uint8_t* src_y, int stride, int b_limit, int limit, int thresh) { HFilterVertEdge16i(src_y + 4, stride, b_limit, limit, thresh); HFilterVertEdge16i(src_y + 8, stride, b_limit, limit, thresh); HFilterVertEdge16i(src_y + 12, stride, b_limit, limit, thresh); } // 8-pixels wide variants, for chroma filtering static void VFilter8(uint8_t* src_u, uint8_t* src_v, int stride, int b_limit_in, int limit_in, int thresh_in) { uint8_t* ptmp_src_u = src_u - 4 * stride; uint8_t* ptmp_src_v = src_v - 4 * stride; uint64_t p2_d, p1_d, p0_d, q0_d, q1_d, q2_d; v16u8 p3, p2, p1, p0, q3, q2, q1, q0, mask, hev; v16u8 p3_u, p2_u, p1_u, p0_u, q3_u, q2_u, q1_u, q0_u; v16u8 p3_v, p2_v, p1_v, p0_v, q3_v, q2_v, q1_v, q0_v; const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); LD_UB8(ptmp_src_u, stride, p3_u, p2_u, p1_u, p0_u, q0_u, q1_u, q2_u, q3_u); LD_UB8(ptmp_src_v, stride, p3_v, p2_v, p1_v, p0_v, q0_v, q1_v, q2_v, q3_v); ILVR_D4_UB(p3_v, p3_u, p2_v, p2_u, p1_v, p1_u, p0_v, p0_u, p3, p2, p1, p0); ILVR_D4_UB(q0_v, q0_u, q1_v, q1_u, q2_v, q2_u, q3_v, q3_u, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_MBFILTER(p2, p1, p0, q0, q1, q2, mask, hev); p2_d = __msa_copy_s_d((v2i64)p2, 0); p1_d = __msa_copy_s_d((v2i64)p1, 0); p0_d = __msa_copy_s_d((v2i64)p0, 0); q0_d = __msa_copy_s_d((v2i64)q0, 0); q1_d = __msa_copy_s_d((v2i64)q1, 0); q2_d = __msa_copy_s_d((v2i64)q2, 0); ptmp_src_u += stride; SD4(p2_d, p1_d, p0_d, q0_d, ptmp_src_u, stride); ptmp_src_u += (4 * stride); SD(q1_d, ptmp_src_u); ptmp_src_u += stride; SD(q2_d, ptmp_src_u); p2_d = __msa_copy_s_d((v2i64)p2, 1); p1_d = __msa_copy_s_d((v2i64)p1, 1); p0_d = __msa_copy_s_d((v2i64)p0, 1); q0_d = __msa_copy_s_d((v2i64)q0, 1); q1_d = __msa_copy_s_d((v2i64)q1, 1); q2_d = __msa_copy_s_d((v2i64)q2, 1); ptmp_src_v += stride; SD4(p2_d, p1_d, p0_d, q0_d, ptmp_src_v, stride); ptmp_src_v += (4 * stride); SD(q1_d, ptmp_src_v); ptmp_src_v += stride; SD(q2_d, ptmp_src_v); } static void HFilter8(uint8_t* src_u, uint8_t* src_v, int stride, int b_limit_in, int limit_in, int thresh_in) { uint8_t* ptmp_src_u = src_u - 4; uint8_t* ptmp_src_v = src_v - 4; v16u8 p3, p2, p1, p0, q3, q2, q1, q0, mask, hev; v16u8 row0, row1, row2, row3, row4, row5, row6, row7, row8; v16u8 row9, row10, row11, row12, row13, row14, row15; v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); LD_UB8(ptmp_src_u, stride, row0, row1, row2, row3, row4, row5, row6, row7); LD_UB8(ptmp_src_v, stride, row8, row9, row10, row11, row12, row13, row14, row15); TRANSPOSE16x8_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14, row15, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_MBFILTER(p2, p1, p0, q0, q1, q2, mask, hev); ILVR_B2_SH(p1, p2, q0, p0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp3, tmp4); ILVL_B2_SH(p1, p2, q0, p0, tmp0, tmp1); ILVRL_H2_SH(tmp1, tmp0, tmp6, tmp7); ILVRL_B2_SH(q2, q1, tmp2, tmp5); ptmp_src_u += 1; ST6x4_UB(tmp3, 0, tmp2, 0, ptmp_src_u, stride); ptmp_src_u += 4 * stride; ST6x4_UB(tmp4, 0, tmp2, 4, ptmp_src_u, stride); ptmp_src_v += 1; ST6x4_UB(tmp6, 0, tmp5, 0, ptmp_src_v, stride); ptmp_src_v += 4 * stride; ST6x4_UB(tmp7, 0, tmp5, 4, ptmp_src_v, stride); } static void VFilter8i(uint8_t* src_u, uint8_t* src_v, int stride, int b_limit_in, int limit_in, int thresh_in) { uint64_t p1_d, p0_d, q0_d, q1_d; v16u8 p3, p2, p1, p0, q3, q2, q1, q0, mask, hev; v16u8 p3_u, p2_u, p1_u, p0_u, q3_u, q2_u, q1_u, q0_u; v16u8 p3_v, p2_v, p1_v, p0_v, q3_v, q2_v, q1_v, q0_v; const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); LD_UB8(src_u, stride, p3_u, p2_u, p1_u, p0_u, q0_u, q1_u, q2_u, q3_u); src_u += (5 * stride); LD_UB8(src_v, stride, p3_v, p2_v, p1_v, p0_v, q0_v, q1_v, q2_v, q3_v); src_v += (5 * stride); ILVR_D4_UB(p3_v, p3_u, p2_v, p2_u, p1_v, p1_u, p0_v, p0_u, p3, p2, p1, p0); ILVR_D4_UB(q0_v, q0_u, q1_v, q1_u, q2_v, q2_u, q3_v, q3_u, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_FILTER4_4W(p1, p0, q0, q1, mask, hev); p1_d = __msa_copy_s_d((v2i64)p1, 0); p0_d = __msa_copy_s_d((v2i64)p0, 0); q0_d = __msa_copy_s_d((v2i64)q0, 0); q1_d = __msa_copy_s_d((v2i64)q1, 0); SD4(q1_d, q0_d, p0_d, p1_d, src_u, -stride); p1_d = __msa_copy_s_d((v2i64)p1, 1); p0_d = __msa_copy_s_d((v2i64)p0, 1); q0_d = __msa_copy_s_d((v2i64)q0, 1); q1_d = __msa_copy_s_d((v2i64)q1, 1); SD4(q1_d, q0_d, p0_d, p1_d, src_v, -stride); } static void HFilter8i(uint8_t* src_u, uint8_t* src_v, int stride, int b_limit_in, int limit_in, int thresh_in) { v16u8 p3, p2, p1, p0, q3, q2, q1, q0, mask, hev; v16u8 row0, row1, row2, row3, row4, row5, row6, row7, row8; v16u8 row9, row10, row11, row12, row13, row14, row15; v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; const v16u8 thresh = (v16u8)__msa_fill_b(thresh_in); const v16u8 limit = (v16u8)__msa_fill_b(limit_in); const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); LD_UB8(src_u, stride, row0, row1, row2, row3, row4, row5, row6, row7); LD_UB8(src_v, stride, row8, row9, row10, row11, row12, row13, row14, row15); TRANSPOSE16x8_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14, row15, p3, p2, p1, p0, q0, q1, q2, q3); LPF_MASK_HEV(p3, p2, p1, p0, q0, q1, q2, q3, limit, b_limit, thresh, hev, mask); LPF_FILTER4_4W(p1, p0, q0, q1, mask, hev); ILVR_B2_SW(p0, p1, q1, q0, tmp0, tmp1); ILVRL_H2_SW(tmp1, tmp0, tmp2, tmp3); ILVL_B2_SW(p0, p1, q1, q0, tmp0, tmp1); ILVRL_H2_SW(tmp1, tmp0, tmp4, tmp5); src_u += 2; ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, src_u, stride); src_u += 4 * stride; ST4x4_UB(tmp3, tmp3, 0, 1, 2, 3, src_u, stride); src_v += 2; ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, src_v, stride); src_v += 4 * stride; ST4x4_UB(tmp5, tmp5, 0, 1, 2, 3, src_v, stride); } static void SimpleVFilter16(uint8_t* src, int stride, int b_limit_in) { v16u8 p1, p0, q1, q0, mask; const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); LD_UB4(src - 2 * stride, stride, p1, p0, q0, q1); LPF_SIMPLE_MASK(p1, p0, q0, q1, b_limit, mask); LPF_SIMPLE_FILT(p1, p0, q0, q1, mask); ST_UB2(p0, q0, src - stride, stride); } static void SimpleHFilter16(uint8_t* src, int stride, int b_limit_in) { v16u8 p1, p0, q1, q0, mask, row0, row1, row2, row3, row4, row5, row6, row7; v16u8 row8, row9, row10, row11, row12, row13, row14, row15; v8i16 tmp0, tmp1; const v16u8 b_limit = (v16u8)__msa_fill_b(b_limit_in); uint8_t* ptemp_src = src - 2; LD_UB8(ptemp_src, stride, row0, row1, row2, row3, row4, row5, row6, row7); LD_UB8(ptemp_src + 8 * stride, stride, row8, row9, row10, row11, row12, row13, row14, row15); TRANSPOSE16x4_UB_UB(row0, row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, row13, row14, row15, p1, p0, q0, q1); LPF_SIMPLE_MASK(p1, p0, q0, q1, b_limit, mask); LPF_SIMPLE_FILT(p1, p0, q0, q1, mask); ILVRL_B2_SH(q0, p0, tmp1, tmp0); ptemp_src += 1; ST2x4_UB(tmp1, 0, ptemp_src, stride); ptemp_src += 4 * stride; ST2x4_UB(tmp1, 4, ptemp_src, stride); ptemp_src += 4 * stride; ST2x4_UB(tmp0, 0, ptemp_src, stride); ptemp_src += 4 * stride; ST2x4_UB(tmp0, 4, ptemp_src, stride); ptemp_src += 4 * stride; } static void SimpleVFilter16i(uint8_t* src_y, int stride, int b_limit_in) { SimpleVFilter16(src_y + 4 * stride, stride, b_limit_in); SimpleVFilter16(src_y + 8 * stride, stride, b_limit_in); SimpleVFilter16(src_y + 12 * stride, stride, b_limit_in); } static void SimpleHFilter16i(uint8_t* src_y, int stride, int b_limit_in) { SimpleHFilter16(src_y + 4, stride, b_limit_in); SimpleHFilter16(src_y + 8, stride, b_limit_in); SimpleHFilter16(src_y + 12, stride, b_limit_in); } //------------------------------------------------------------------------------ // Intra predictions //------------------------------------------------------------------------------ // 4x4 static void DC4(uint8_t* dst) { // DC uint32_t dc = 4; int i; for (i = 0; i < 4; ++i) dc += dst[i - BPS] + dst[-1 + i * BPS]; dc >>= 3; dc = dc | (dc << 8) | (dc << 16) | (dc << 24); SW4(dc, dc, dc, dc, dst, BPS); } static void TM4(uint8_t* dst) { const uint8_t* const ptemp = dst - BPS - 1; v8i16 T, d, r0, r1, r2, r3; const v16i8 zero = { 0 }; const v8i16 TL = (v8i16)__msa_fill_h(ptemp[0 * BPS]); const v8i16 L0 = (v8i16)__msa_fill_h(ptemp[1 * BPS]); const v8i16 L1 = (v8i16)__msa_fill_h(ptemp[2 * BPS]); const v8i16 L2 = (v8i16)__msa_fill_h(ptemp[3 * BPS]); const v8i16 L3 = (v8i16)__msa_fill_h(ptemp[4 * BPS]); const v16u8 T1 = LD_UB(ptemp + 1); T = (v8i16)__msa_ilvr_b(zero, (v16i8)T1); d = T - TL; ADD4(d, L0, d, L1, d, L2, d, L3, r0, r1, r2, r3); CLIP_SH4_0_255(r0, r1, r2, r3); PCKEV_ST4x4_UB(r0, r1, r2, r3, dst, BPS); } static void VE4(uint8_t* dst) { // vertical const uint8_t* const ptop = dst - BPS - 1; const uint32_t val0 = LW(ptop + 0); const uint32_t val1 = LW(ptop + 4); uint32_t out; v16u8 A = { 0 }, B, C, AC, B2, R; INSERT_W2_UB(val0, val1, A); B = SLDI_UB(A, A, 1); C = SLDI_UB(A, A, 2); AC = __msa_ave_u_b(A, C); B2 = __msa_ave_u_b(B, B); R = __msa_aver_u_b(AC, B2); out = __msa_copy_s_w((v4i32)R, 0); SW4(out, out, out, out, dst, BPS); } static void RD4(uint8_t* dst) { // Down-right const uint8_t* const ptop = dst - 1 - BPS; uint32_t val0 = LW(ptop + 0); uint32_t val1 = LW(ptop + 4); uint32_t val2, val3; v16u8 A, B, C, AC, B2, R, A1 = { 0 }; INSERT_W2_UB(val0, val1, A1); A = SLDI_UB(A1, A1, 12); A = (v16u8)__msa_insert_b((v16i8)A, 3, ptop[1 * BPS]); A = (v16u8)__msa_insert_b((v16i8)A, 2, ptop[2 * BPS]); A = (v16u8)__msa_insert_b((v16i8)A, 1, ptop[3 * BPS]); A = (v16u8)__msa_insert_b((v16i8)A, 0, ptop[4 * BPS]); B = SLDI_UB(A, A, 1); C = SLDI_UB(A, A, 2); AC = __msa_ave_u_b(A, C); B2 = __msa_ave_u_b(B, B); R = __msa_aver_u_b(AC, B2); val3 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val2 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val1 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val0 = __msa_copy_s_w((v4i32)R, 0); SW4(val0, val1, val2, val3, dst, BPS); } static void LD4(uint8_t* dst) { // Down-Left const uint8_t* const ptop = dst - BPS; uint32_t val0 = LW(ptop + 0); uint32_t val1 = LW(ptop + 4); uint32_t val2, val3; v16u8 A = { 0 }, B, C, AC, B2, R; INSERT_W2_UB(val0, val1, A); B = SLDI_UB(A, A, 1); C = SLDI_UB(A, A, 2); C = (v16u8)__msa_insert_b((v16i8)C, 6, ptop[7]); AC = __msa_ave_u_b(A, C); B2 = __msa_ave_u_b(B, B); R = __msa_aver_u_b(AC, B2); val0 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val1 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val2 = __msa_copy_s_w((v4i32)R, 0); R = SLDI_UB(R, R, 1); val3 = __msa_copy_s_w((v4i32)R, 0); SW4(val0, val1, val2, val3, dst, BPS); } // 16x16 static void DC16(uint8_t* dst) { // DC uint32_t dc = 16; int i; const v16u8 rtop = LD_UB(dst - BPS); const v8u16 dctop = __msa_hadd_u_h(rtop, rtop); v16u8 out; for (i = 0; i < 16; ++i) { dc += dst[-1 + i * BPS]; } dc += HADD_UH_U32(dctop); out = (v16u8)__msa_fill_b(dc >> 5); ST_UB8(out, out, out, out, out, out, out, out, dst, BPS); ST_UB8(out, out, out, out, out, out, out, out, dst + 8 * BPS, BPS); } static void TM16(uint8_t* dst) { int j; v8i16 d1, d2; const v16i8 zero = { 0 }; const v8i16 TL = (v8i16)__msa_fill_h(dst[-1 - BPS]); const v16i8 T = LD_SB(dst - BPS); ILVRL_B2_SH(zero, T, d1, d2); SUB2(d1, TL, d2, TL, d1, d2); for (j = 0; j < 16; j += 4) { v16i8 t0, t1, t2, t3; v8i16 r0, r1, r2, r3, r4, r5, r6, r7; const v8i16 L0 = (v8i16)__msa_fill_h(dst[-1 + 0 * BPS]); const v8i16 L1 = (v8i16)__msa_fill_h(dst[-1 + 1 * BPS]); const v8i16 L2 = (v8i16)__msa_fill_h(dst[-1 + 2 * BPS]); const v8i16 L3 = (v8i16)__msa_fill_h(dst[-1 + 3 * BPS]); ADD4(d1, L0, d1, L1, d1, L2, d1, L3, r0, r1, r2, r3); ADD4(d2, L0, d2, L1, d2, L2, d2, L3, r4, r5, r6, r7); CLIP_SH4_0_255(r0, r1, r2, r3); CLIP_SH4_0_255(r4, r5, r6, r7); PCKEV_B4_SB(r4, r0, r5, r1, r6, r2, r7, r3, t0, t1, t2, t3); ST_SB4(t0, t1, t2, t3, dst, BPS); dst += 4 * BPS; } } static void VE16(uint8_t* dst) { // vertical const v16u8 rtop = LD_UB(dst - BPS); ST_UB8(rtop, rtop, rtop, rtop, rtop, rtop, rtop, rtop, dst, BPS); ST_UB8(rtop, rtop, rtop, rtop, rtop, rtop, rtop, rtop, dst + 8 * BPS, BPS); } static void HE16(uint8_t* dst) { // horizontal int j; for (j = 16; j > 0; j -= 4) { const v16u8 L0 = (v16u8)__msa_fill_b(dst[-1 + 0 * BPS]); const v16u8 L1 = (v16u8)__msa_fill_b(dst[-1 + 1 * BPS]); const v16u8 L2 = (v16u8)__msa_fill_b(dst[-1 + 2 * BPS]); const v16u8 L3 = (v16u8)__msa_fill_b(dst[-1 + 3 * BPS]); ST_UB4(L0, L1, L2, L3, dst, BPS); dst += 4 * BPS; } } static void DC16NoTop(uint8_t* dst) { // DC with top samples not available int j; uint32_t dc = 8; v16u8 out; for (j = 0; j < 16; ++j) { dc += dst[-1 + j * BPS]; } out = (v16u8)__msa_fill_b(dc >> 4); ST_UB8(out, out, out, out, out, out, out, out, dst, BPS); ST_UB8(out, out, out, out, out, out, out, out, dst + 8 * BPS, BPS); } static void DC16NoLeft(uint8_t* dst) { // DC with left samples not available uint32_t dc = 8; const v16u8 rtop = LD_UB(dst - BPS); const v8u16 dctop = __msa_hadd_u_h(rtop, rtop); v16u8 out; dc += HADD_UH_U32(dctop); out = (v16u8)__msa_fill_b(dc >> 4); ST_UB8(out, out, out, out, out, out, out, out, dst, BPS); ST_UB8(out, out, out, out, out, out, out, out, dst + 8 * BPS, BPS); } static void DC16NoTopLeft(uint8_t* dst) { // DC with nothing const v16u8 out = (v16u8)__msa_fill_b(0x80); ST_UB8(out, out, out, out, out, out, out, out, dst, BPS); ST_UB8(out, out, out, out, out, out, out, out, dst + 8 * BPS, BPS); } // Chroma #define STORE8x8(out, dst) do { \ SD4(out, out, out, out, dst + 0 * BPS, BPS); \ SD4(out, out, out, out, dst + 4 * BPS, BPS); \ } while (0) static void DC8uv(uint8_t* dst) { // DC uint32_t dc = 8; int i; uint64_t out; const v16u8 rtop = LD_UB(dst - BPS); const v8u16 temp0 = __msa_hadd_u_h(rtop, rtop); const v4u32 temp1 = __msa_hadd_u_w(temp0, temp0); const v2u64 temp2 = __msa_hadd_u_d(temp1, temp1); v16u8 dctemp; for (i = 0; i < 8; ++i) { dc += dst[-1 + i * BPS]; } dc += __msa_copy_s_w((v4i32)temp2, 0); dctemp = (v16u8)__msa_fill_b(dc >> 4); out = __msa_copy_s_d((v2i64)dctemp, 0); STORE8x8(out, dst); } static void TM8uv(uint8_t* dst) { int j; const v16i8 T1 = LD_SB(dst - BPS); const v16i8 zero = { 0 }; const v8i16 T = (v8i16)__msa_ilvr_b(zero, T1); const v8i16 TL = (v8i16)__msa_fill_h(dst[-1 - BPS]); const v8i16 d = T - TL; for (j = 0; j < 8; j += 4) { v16i8 t0, t1; v8i16 r0 = (v8i16)__msa_fill_h(dst[-1 + 0 * BPS]); v8i16 r1 = (v8i16)__msa_fill_h(dst[-1 + 1 * BPS]); v8i16 r2 = (v8i16)__msa_fill_h(dst[-1 + 2 * BPS]); v8i16 r3 = (v8i16)__msa_fill_h(dst[-1 + 3 * BPS]); ADD4(d, r0, d, r1, d, r2, d, r3, r0, r1, r2, r3); CLIP_SH4_0_255(r0, r1, r2, r3); PCKEV_B2_SB(r1, r0, r3, r2, t0, t1); ST4x4_UB(t0, t1, 0, 2, 0, 2, dst, BPS); ST4x4_UB(t0, t1, 1, 3, 1, 3, dst + 4, BPS); dst += 4 * BPS; } } static void VE8uv(uint8_t* dst) { // vertical const v16u8 rtop = LD_UB(dst - BPS); const uint64_t out = __msa_copy_s_d((v2i64)rtop, 0); STORE8x8(out, dst); } static void HE8uv(uint8_t* dst) { // horizontal int j; for (j = 0; j < 8; j += 4) { const v16u8 L0 = (v16u8)__msa_fill_b(dst[-1 + 0 * BPS]); const v16u8 L1 = (v16u8)__msa_fill_b(dst[-1 + 1 * BPS]); const v16u8 L2 = (v16u8)__msa_fill_b(dst[-1 + 2 * BPS]); const v16u8 L3 = (v16u8)__msa_fill_b(dst[-1 + 3 * BPS]); const uint64_t out0 = __msa_copy_s_d((v2i64)L0, 0); const uint64_t out1 = __msa_copy_s_d((v2i64)L1, 0); const uint64_t out2 = __msa_copy_s_d((v2i64)L2, 0); const uint64_t out3 = __msa_copy_s_d((v2i64)L3, 0); SD4(out0, out1, out2, out3, dst, BPS); dst += 4 * BPS; } } static void DC8uvNoLeft(uint8_t* dst) { // DC with no left samples const uint32_t dc = 4; const v16u8 rtop = LD_UB(dst - BPS); const v8u16 temp0 = __msa_hadd_u_h(rtop, rtop); const v4u32 temp1 = __msa_hadd_u_w(temp0, temp0); const v2u64 temp2 = __msa_hadd_u_d(temp1, temp1); const uint32_t sum_m = __msa_copy_s_w((v4i32)temp2, 0); const v16u8 dcval = (v16u8)__msa_fill_b((dc + sum_m) >> 3); const uint64_t out = __msa_copy_s_d((v2i64)dcval, 0); STORE8x8(out, dst); } static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples uint32_t dc = 4; int i; uint64_t out; v16u8 dctemp; for (i = 0; i < 8; ++i) { dc += dst[-1 + i * BPS]; } dctemp = (v16u8)__msa_fill_b(dc >> 3); out = __msa_copy_s_d((v2i64)dctemp, 0); STORE8x8(out, dst); } static void DC8uvNoTopLeft(uint8_t* dst) { // DC with nothing const uint64_t out = 0x8080808080808080ULL; STORE8x8(out, dst); } //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitMSA(void) { VP8TransformWHT = TransformWHT; VP8Transform = TransformTwo; VP8TransformDC = TransformDC; VP8TransformAC3 = TransformAC3; VP8VFilter16 = VFilter16; VP8HFilter16 = HFilter16; VP8VFilter16i = VFilter16i; VP8HFilter16i = HFilter16i; VP8VFilter8 = VFilter8; VP8HFilter8 = HFilter8; VP8VFilter8i = VFilter8i; VP8HFilter8i = HFilter8i; VP8SimpleVFilter16 = SimpleVFilter16; VP8SimpleHFilter16 = SimpleHFilter16; VP8SimpleVFilter16i = SimpleVFilter16i; VP8SimpleHFilter16i = SimpleHFilter16i; VP8PredLuma4[0] = DC4; VP8PredLuma4[1] = TM4; VP8PredLuma4[2] = VE4; VP8PredLuma4[4] = RD4; VP8PredLuma4[6] = LD4; VP8PredLuma16[0] = DC16; VP8PredLuma16[1] = TM16; VP8PredLuma16[2] = VE16; VP8PredLuma16[3] = HE16; VP8PredLuma16[4] = DC16NoTop; VP8PredLuma16[5] = DC16NoLeft; VP8PredLuma16[6] = DC16NoTopLeft; VP8PredChroma8[0] = DC8uv; VP8PredChroma8[1] = TM8uv; VP8PredChroma8[2] = VE8uv; VP8PredChroma8[3] = HE8uv; VP8PredChroma8[4] = DC8uvNoTop; VP8PredChroma8[5] = DC8uvNoLeft; VP8PredChroma8[6] = DC8uvNoTopLeft; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(VP8DspInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/cost_mips32.c0000644000014400001440000001577514606317060013760 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS32) #include "src/enc/cost_enc.h" static int GetResidualCost_MIPS32(int ctx0, const VP8Residual* const res) { int temp0, temp1; int v_reg, ctx_reg; int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 int p0 = res->prob[n][ctx0][0]; CostArrayPtr const costs = res->costs; const uint16_t* t = costs[n][ctx0]; // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0 // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll // be missing during the loop. int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; const int16_t* res_coeffs = res->coeffs; const int res_last = res->last; const int const_max_level = MAX_VARIABLE_LEVEL; const int const_2 = 2; const uint16_t** p_costs = &costs[n][0]; const size_t inc_p_costs = NUM_CTX * sizeof(*p_costs); if (res->last < 0) { return VP8BitCost(0, p0); } __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "subu %[temp1], %[res_last], %[n] \n\t" "sll %[temp0], %[n], 1 \n\t" "blez %[temp1], 2f \n\t" " addu %[res_coeffs], %[res_coeffs], %[temp0] \n\t" "1: \n\t" "lh %[v_reg], 0(%[res_coeffs]) \n\t" "addiu %[n], %[n], 1 \n\t" "negu %[temp0], %[v_reg] \n\t" "slti %[temp1], %[v_reg], 0 \n\t" "movn %[v_reg], %[temp0], %[temp1] \n\t" "sltiu %[temp0], %[v_reg], 2 \n\t" "move %[ctx_reg], %[v_reg] \n\t" "movz %[ctx_reg], %[const_2], %[temp0] \n\t" "sll %[temp1], %[v_reg], 1 \n\t" "addu %[temp1], %[temp1], %[VP8LevelFixedCosts] \n\t" "lhu %[temp1], 0(%[temp1]) \n\t" "slt %[temp0], %[v_reg], %[const_max_level] \n\t" "movz %[v_reg], %[const_max_level], %[temp0] \n\t" "addu %[cost], %[cost], %[temp1] \n\t" "sll %[v_reg], %[v_reg], 1 \n\t" "sll %[ctx_reg], %[ctx_reg], 2 \n\t" "addu %[v_reg], %[v_reg], %[t] \n\t" "lhu %[temp0], 0(%[v_reg]) \n\t" "addu %[p_costs], %[p_costs], %[inc_p_costs] \n\t" "addu %[t], %[p_costs], %[ctx_reg] \n\t" "addu %[cost], %[cost], %[temp0] \n\t" "addiu %[res_coeffs], %[res_coeffs], 2 \n\t" "bne %[n], %[res_last], 1b \n\t" " lw %[t], 0(%[t]) \n\t" "2: \n\t" ".set pop \n\t" : [cost]"+&r"(cost), [t]"+&r"(t), [n]"+&r"(n), [v_reg]"=&r"(v_reg), [ctx_reg]"=&r"(ctx_reg), [p_costs]"+&r"(p_costs), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [res_coeffs]"+&r"(res_coeffs) : [const_2]"r"(const_2), [const_max_level]"r"(const_max_level), [VP8LevelFixedCosts]"r"(VP8LevelFixedCosts), [res_last]"r"(res_last), [inc_p_costs]"r"(inc_p_costs) : "memory" ); // Last coefficient is always non-zero { const int v = abs(res->coeffs[n]); assert(v != 0); cost += VP8LevelCost(t, v); if (n < 15) { const int b = VP8EncBands[n + 1]; const int ctx = (v == 1) ? 1 : 2; const int last_p0 = res->prob[b][ctx][0]; cost += VP8BitCost(0, last_p0); } } return cost; } static void SetResidualCoeffs_MIPS32(const int16_t* const coeffs, VP8Residual* const res) { const int16_t* p_coeffs = (int16_t*)coeffs; int temp0, temp1, temp2, n, n1; assert(res->first == 0 || coeffs[0] == 0); __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "addiu %[p_coeffs], %[p_coeffs], 28 \n\t" "li %[n], 15 \n\t" "li %[temp2], -1 \n\t" "0: \n\t" "ulw %[temp0], 0(%[p_coeffs]) \n\t" "beqz %[temp0], 1f \n\t" #if defined(WORDS_BIGENDIAN) " sll %[temp1], %[temp0], 16 \n\t" #else " srl %[temp1], %[temp0], 16 \n\t" #endif "addiu %[n1], %[n], -1 \n\t" "movz %[temp0], %[n1], %[temp1] \n\t" "movn %[temp0], %[n], %[temp1] \n\t" "j 2f \n\t" " addiu %[temp2], %[temp0], 0 \n\t" "1: \n\t" "addiu %[n], %[n], -2 \n\t" "bgtz %[n], 0b \n\t" " addiu %[p_coeffs], %[p_coeffs], -4 \n\t" "2: \n\t" ".set pop \n\t" : [p_coeffs]"+&r"(p_coeffs), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [n]"=&r"(n), [n1]"=&r"(n1) : : "memory" ); res->last = temp2; res->coeffs = coeffs; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspCostInitMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspCostInitMIPS32(void) { VP8GetResidualCost = GetResidualCost_MIPS32; VP8SetResidualCoeffs = SetResidualCoeffs_MIPS32; } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(VP8EncDspCostInitMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/lossless_msa.c0000644000014400001440000003135214606317060014307 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA variant of methods for lossless decoder // // Author: Prashant Patil (prashant.patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include "src/dsp/lossless.h" #include "src/dsp/msa_macro.h" //------------------------------------------------------------------------------ // Colorspace conversion functions #define CONVERT16_BGRA_XXX(psrc, pdst, m0, m1, m2) do { \ v16u8 src0, src1, src2, src3, dst0, dst1, dst2; \ LD_UB4(psrc, 16, src0, src1, src2, src3); \ VSHF_B2_UB(src0, src1, src1, src2, m0, m1, dst0, dst1); \ dst2 = VSHF_UB(src2, src3, m2); \ ST_UB2(dst0, dst1, pdst, 16); \ ST_UB(dst2, pdst + 32); \ } while (0) #define CONVERT12_BGRA_XXX(psrc, pdst, m0, m1, m2) do { \ uint32_t pix_w; \ v16u8 src0, src1, src2, dst0, dst1, dst2; \ LD_UB3(psrc, 16, src0, src1, src2); \ VSHF_B2_UB(src0, src1, src1, src2, m0, m1, dst0, dst1); \ dst2 = VSHF_UB(src2, src2, m2); \ ST_UB2(dst0, dst1, pdst, 16); \ pix_w = __msa_copy_s_w((v4i32)dst2, 0); \ SW(pix_w, pdst + 32); \ } while (0) #define CONVERT8_BGRA_XXX(psrc, pdst, m0, m1) do { \ uint64_t pix_d; \ v16u8 src0, src1, src2 = { 0 }, dst0, dst1; \ LD_UB2(psrc, 16, src0, src1); \ VSHF_B2_UB(src0, src1, src1, src2, m0, m1, dst0, dst1); \ ST_UB(dst0, pdst); \ pix_d = __msa_copy_s_d((v2i64)dst1, 0); \ SD(pix_d, pdst + 16); \ } while (0) #define CONVERT4_BGRA_XXX(psrc, pdst, m) do { \ const v16u8 src0 = LD_UB(psrc); \ const v16u8 dst0 = VSHF_UB(src0, src0, m); \ uint64_t pix_d = __msa_copy_s_d((v2i64)dst0, 0); \ uint32_t pix_w = __msa_copy_s_w((v4i32)dst0, 2); \ SD(pix_d, pdst + 0); \ SW(pix_w, pdst + 8); \ } while (0) #define CONVERT1_BGRA_BGR(psrc, pdst) do { \ const int32_t b = (psrc)[0]; \ const int32_t g = (psrc)[1]; \ const int32_t r = (psrc)[2]; \ (pdst)[0] = b; \ (pdst)[1] = g; \ (pdst)[2] = r; \ } while (0) #define CONVERT1_BGRA_RGB(psrc, pdst) do { \ const int32_t b = (psrc)[0]; \ const int32_t g = (psrc)[1]; \ const int32_t r = (psrc)[2]; \ (pdst)[0] = r; \ (pdst)[1] = g; \ (pdst)[2] = b; \ } while (0) #define TRANSFORM_COLOR_INVERSE_8(src0, src1, dst0, dst1, \ c0, c1, mask0, mask1) do { \ v8i16 g0, g1, t0, t1, t2, t3; \ v4i32 t4, t5; \ VSHF_B2_SH(src0, src0, src1, src1, mask0, mask0, g0, g1); \ DOTP_SB2_SH(g0, g1, c0, c0, t0, t1); \ SRAI_H2_SH(t0, t1, 5); \ t0 = __msa_addv_h(t0, (v8i16)src0); \ t1 = __msa_addv_h(t1, (v8i16)src1); \ t4 = __msa_srli_w((v4i32)t0, 16); \ t5 = __msa_srli_w((v4i32)t1, 16); \ DOTP_SB2_SH(t4, t5, c1, c1, t2, t3); \ SRAI_H2_SH(t2, t3, 5); \ ADD2(t0, t2, t1, t3, t0, t1); \ VSHF_B2_UB(src0, t0, src1, t1, mask1, mask1, dst0, dst1); \ } while (0) #define TRANSFORM_COLOR_INVERSE_4(src, dst, c0, c1, mask0, mask1) do { \ const v16i8 g0 = VSHF_SB(src, src, mask0); \ v8i16 t0 = __msa_dotp_s_h(c0, g0); \ v8i16 t1; \ v4i32 t2; \ t0 = SRAI_H(t0, 5); \ t0 = __msa_addv_h(t0, (v8i16)src); \ t2 = __msa_srli_w((v4i32)t0, 16); \ t1 = __msa_dotp_s_h(c1, (v16i8)t2); \ t1 = SRAI_H(t1, 5); \ t0 = t0 + t1; \ dst = VSHF_UB(src, t0, mask1); \ } while (0) static void ConvertBGRAToRGBA_MSA(const uint32_t* src, int num_pixels, uint8_t* dst) { int i; const uint8_t* ptemp_src = (const uint8_t*)src; uint8_t* ptemp_dst = (uint8_t*)dst; v16u8 src0, dst0; const v16u8 mask = { 2, 1, 0, 3, 6, 5, 4, 7, 10, 9, 8, 11, 14, 13, 12, 15 }; while (num_pixels >= 8) { v16u8 src1, dst1; LD_UB2(ptemp_src, 16, src0, src1); VSHF_B2_UB(src0, src0, src1, src1, mask, mask, dst0, dst1); ST_UB2(dst0, dst1, ptemp_dst, 16); ptemp_src += 32; ptemp_dst += 32; num_pixels -= 8; } if (num_pixels > 0) { if (num_pixels >= 4) { src0 = LD_UB(ptemp_src); dst0 = VSHF_UB(src0, src0, mask); ST_UB(dst0, ptemp_dst); ptemp_src += 16; ptemp_dst += 16; num_pixels -= 4; } for (i = 0; i < num_pixels; i++) { const uint8_t b = ptemp_src[2]; const uint8_t g = ptemp_src[1]; const uint8_t r = ptemp_src[0]; const uint8_t a = ptemp_src[3]; ptemp_dst[0] = b; ptemp_dst[1] = g; ptemp_dst[2] = r; ptemp_dst[3] = a; ptemp_src += 4; ptemp_dst += 4; } } } static void ConvertBGRAToBGR_MSA(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint8_t* ptemp_src = (const uint8_t*)src; uint8_t* ptemp_dst = (uint8_t*)dst; const v16u8 mask0 = { 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20 }; const v16u8 mask1 = { 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25 }; const v16u8 mask2 = { 10, 12, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26, 28, 29, 30 }; while (num_pixels >= 16) { CONVERT16_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1, mask2); ptemp_src += 64; ptemp_dst += 48; num_pixels -= 16; } if (num_pixels > 0) { if (num_pixels >= 12) { CONVERT12_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1, mask2); ptemp_src += 48; ptemp_dst += 36; num_pixels -= 12; } else if (num_pixels >= 8) { CONVERT8_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1); ptemp_src += 32; ptemp_dst += 24; num_pixels -= 8; } else if (num_pixels >= 4) { CONVERT4_BGRA_XXX(ptemp_src, ptemp_dst, mask0); ptemp_src += 16; ptemp_dst += 12; num_pixels -= 4; } if (num_pixels == 3) { CONVERT1_BGRA_BGR(ptemp_src + 0, ptemp_dst + 0); CONVERT1_BGRA_BGR(ptemp_src + 4, ptemp_dst + 3); CONVERT1_BGRA_BGR(ptemp_src + 8, ptemp_dst + 6); } else if (num_pixels == 2) { CONVERT1_BGRA_BGR(ptemp_src + 0, ptemp_dst + 0); CONVERT1_BGRA_BGR(ptemp_src + 4, ptemp_dst + 3); } else if (num_pixels == 1) { CONVERT1_BGRA_BGR(ptemp_src, ptemp_dst); } } } static void ConvertBGRAToRGB_MSA(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint8_t* ptemp_src = (const uint8_t*)src; uint8_t* ptemp_dst = (uint8_t*)dst; const v16u8 mask0 = { 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, 18, 17, 16, 22 }; const v16u8 mask1 = { 5, 4, 10, 9, 8, 14, 13, 12, 18, 17, 16, 22, 21, 20, 26, 25 }; const v16u8 mask2 = { 8, 14, 13, 12, 18, 17, 16, 22, 21, 20, 26, 25, 24, 30, 29, 28 }; while (num_pixels >= 16) { CONVERT16_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1, mask2); ptemp_src += 64; ptemp_dst += 48; num_pixels -= 16; } if (num_pixels) { if (num_pixels >= 12) { CONVERT12_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1, mask2); ptemp_src += 48; ptemp_dst += 36; num_pixels -= 12; } else if (num_pixels >= 8) { CONVERT8_BGRA_XXX(ptemp_src, ptemp_dst, mask0, mask1); ptemp_src += 32; ptemp_dst += 24; num_pixels -= 8; } else if (num_pixels >= 4) { CONVERT4_BGRA_XXX(ptemp_src, ptemp_dst, mask0); ptemp_src += 16; ptemp_dst += 12; num_pixels -= 4; } if (num_pixels == 3) { CONVERT1_BGRA_RGB(ptemp_src + 0, ptemp_dst + 0); CONVERT1_BGRA_RGB(ptemp_src + 4, ptemp_dst + 3); CONVERT1_BGRA_RGB(ptemp_src + 8, ptemp_dst + 6); } else if (num_pixels == 2) { CONVERT1_BGRA_RGB(ptemp_src + 0, ptemp_dst + 0); CONVERT1_BGRA_RGB(ptemp_src + 4, ptemp_dst + 3); } else if (num_pixels == 1) { CONVERT1_BGRA_RGB(ptemp_src, ptemp_dst); } } } static void AddGreenToBlueAndRed_MSA(const uint32_t* const src, int num_pixels, uint32_t* dst) { int i; const uint8_t* in = (const uint8_t*)src; uint8_t* out = (uint8_t*)dst; v16u8 src0, dst0, tmp0; const v16u8 mask = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; while (num_pixels >= 8) { v16u8 src1, dst1, tmp1; LD_UB2(in, 16, src0, src1); VSHF_B2_UB(src0, src1, src1, src0, mask, mask, tmp0, tmp1); ADD2(src0, tmp0, src1, tmp1, dst0, dst1); ST_UB2(dst0, dst1, out, 16); in += 32; out += 32; num_pixels -= 8; } if (num_pixels > 0) { if (num_pixels >= 4) { src0 = LD_UB(in); tmp0 = VSHF_UB(src0, src0, mask); dst0 = src0 + tmp0; ST_UB(dst0, out); in += 16; out += 16; num_pixels -= 4; } for (i = 0; i < num_pixels; i++) { const uint8_t b = in[0]; const uint8_t g = in[1]; const uint8_t r = in[2]; out[0] = (b + g) & 0xff; out[1] = g; out[2] = (r + g) & 0xff; out[4] = in[4]; out += 4; } } } static void TransformColorInverse_MSA(const VP8LMultipliers* const m, const uint32_t* src, int num_pixels, uint32_t* dst) { v16u8 src0, dst0; const v16i8 g2br = (v16i8)__msa_fill_w(m->green_to_blue_ | (m->green_to_red_ << 16)); const v16i8 r2b = (v16i8)__msa_fill_w(m->red_to_blue_); const v16u8 mask0 = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; const v16u8 mask1 = { 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 28, 13, 30, 15 }; while (num_pixels >= 8) { v16u8 src1, dst1; LD_UB2(src, 4, src0, src1); TRANSFORM_COLOR_INVERSE_8(src0, src1, dst0, dst1, g2br, r2b, mask0, mask1); ST_UB2(dst0, dst1, dst, 4); src += 8; dst += 8; num_pixels -= 8; } if (num_pixels > 0) { if (num_pixels >= 4) { src0 = LD_UB(src); TRANSFORM_COLOR_INVERSE_4(src0, dst0, g2br, r2b, mask0, mask1); ST_UB(dst0, dst); src += 4; dst += 4; num_pixels -= 4; } if (num_pixels > 0) { src0 = LD_UB(src); TRANSFORM_COLOR_INVERSE_4(src0, dst0, g2br, r2b, mask0, mask1); if (num_pixels == 3) { const uint64_t pix_d = __msa_copy_s_d((v2i64)dst0, 0); const uint32_t pix_w = __msa_copy_s_w((v4i32)dst0, 2); SD(pix_d, dst + 0); SW(pix_w, dst + 2); } else if (num_pixels == 2) { const uint64_t pix_d = __msa_copy_s_d((v2i64)dst0, 0); SD(pix_d, dst); } else { const uint32_t pix_w = __msa_copy_s_w((v4i32)dst0, 0); SW(pix_w, dst); } } } } //------------------------------------------------------------------------------ // Entry point extern void VP8LDspInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitMSA(void) { VP8LConvertBGRAToRGBA = ConvertBGRAToRGBA_MSA; VP8LConvertBGRAToBGR = ConvertBGRAToBGR_MSA; VP8LConvertBGRAToRGB = ConvertBGRAToRGB_MSA; VP8LAddGreenToBlueAndRed = AddGreenToBlueAndRed_MSA; VP8LTransformColorInverse = TransformColorInverse_MSA; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(VP8LDspInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/dec.c0000644000014400001440000006556614606317060012351 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical decoding functions, default plain-C implementations. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dsp/dsp.h" #include "src/dec/vp8i_dec.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ static WEBP_INLINE uint8_t clip_8b(int v) { return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255; } //------------------------------------------------------------------------------ // Transforms (Paragraph 14.4) #define STORE(x, y, v) \ dst[(x) + (y) * BPS] = clip_8b(dst[(x) + (y) * BPS] + ((v) >> 3)) #define STORE2(y, dc, d, c) do { \ const int DC = (dc); \ STORE(0, y, DC + (d)); \ STORE(1, y, DC + (c)); \ STORE(2, y, DC - (c)); \ STORE(3, y, DC - (d)); \ } while (0) #if !WEBP_NEON_OMIT_C_CODE static void TransformOne_C(const int16_t* in, uint8_t* dst) { int C[4 * 4], *tmp; int i; tmp = C; for (i = 0; i < 4; ++i) { // vertical pass const int a = in[0] + in[8]; // [-4096, 4094] const int b = in[0] - in[8]; // [-4095, 4095] const int c = WEBP_TRANSFORM_AC3_MUL2(in[4]) - WEBP_TRANSFORM_AC3_MUL1(in[12]); // [-3783, 3783] const int d = WEBP_TRANSFORM_AC3_MUL1(in[4]) + WEBP_TRANSFORM_AC3_MUL2(in[12]); // [-3785, 3781] tmp[0] = a + d; // [-7881, 7875] tmp[1] = b + c; // [-7878, 7878] tmp[2] = b - c; // [-7878, 7878] tmp[3] = a - d; // [-7877, 7879] tmp += 4; in++; } // Each pass is expanding the dynamic range by ~3.85 (upper bound). // The exact value is (2. + (20091 + 35468) / 65536). // After the second pass, maximum interval is [-3794, 3794], assuming // an input in [-2048, 2047] interval. We then need to add a dst value // in the [0, 255] range. // In the worst case scenario, the input to clip_8b() can be as large as // [-60713, 60968]. tmp = C; for (i = 0; i < 4; ++i) { // horizontal pass const int dc = tmp[0] + 4; const int a = dc + tmp[8]; const int b = dc - tmp[8]; const int c = WEBP_TRANSFORM_AC3_MUL2(tmp[4]) - WEBP_TRANSFORM_AC3_MUL1(tmp[12]); const int d = WEBP_TRANSFORM_AC3_MUL1(tmp[4]) + WEBP_TRANSFORM_AC3_MUL2(tmp[12]); STORE(0, 0, a + d); STORE(1, 0, b + c); STORE(2, 0, b - c); STORE(3, 0, a - d); tmp++; dst += BPS; } } // Simplified transform when only in[0], in[1] and in[4] are non-zero static void TransformAC3_C(const int16_t* in, uint8_t* dst) { const int a = in[0] + 4; const int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]); const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]); const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]); const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]); STORE2(0, a + d4, d1, c1); STORE2(1, a + c4, d1, c1); STORE2(2, a - c4, d1, c1); STORE2(3, a - d4, d1, c1); } #undef STORE2 static void TransformTwo_C(const int16_t* in, uint8_t* dst, int do_two) { TransformOne_C(in, dst); if (do_two) { TransformOne_C(in + 16, dst + 4); } } #endif // !WEBP_NEON_OMIT_C_CODE static void TransformUV_C(const int16_t* in, uint8_t* dst) { VP8Transform(in + 0 * 16, dst, 1); VP8Transform(in + 2 * 16, dst + 4 * BPS, 1); } #if !WEBP_NEON_OMIT_C_CODE static void TransformDC_C(const int16_t* in, uint8_t* dst) { const int DC = in[0] + 4; int i, j; for (j = 0; j < 4; ++j) { for (i = 0; i < 4; ++i) { STORE(i, j, DC); } } } #endif // !WEBP_NEON_OMIT_C_CODE static void TransformDCUV_C(const int16_t* in, uint8_t* dst) { if (in[0 * 16]) VP8TransformDC(in + 0 * 16, dst); if (in[1 * 16]) VP8TransformDC(in + 1 * 16, dst + 4); if (in[2 * 16]) VP8TransformDC(in + 2 * 16, dst + 4 * BPS); if (in[3 * 16]) VP8TransformDC(in + 3 * 16, dst + 4 * BPS + 4); } #undef STORE //------------------------------------------------------------------------------ // Paragraph 14.3 #if !WEBP_NEON_OMIT_C_CODE static void TransformWHT_C(const int16_t* in, int16_t* out) { int tmp[16]; int i; for (i = 0; i < 4; ++i) { const int a0 = in[0 + i] + in[12 + i]; const int a1 = in[4 + i] + in[ 8 + i]; const int a2 = in[4 + i] - in[ 8 + i]; const int a3 = in[0 + i] - in[12 + i]; tmp[0 + i] = a0 + a1; tmp[8 + i] = a0 - a1; tmp[4 + i] = a3 + a2; tmp[12 + i] = a3 - a2; } for (i = 0; i < 4; ++i) { const int dc = tmp[0 + i * 4] + 3; // w/ rounder const int a0 = dc + tmp[3 + i * 4]; const int a1 = tmp[1 + i * 4] + tmp[2 + i * 4]; const int a2 = tmp[1 + i * 4] - tmp[2 + i * 4]; const int a3 = dc - tmp[3 + i * 4]; out[ 0] = (a0 + a1) >> 3; out[16] = (a3 + a2) >> 3; out[32] = (a0 - a1) >> 3; out[48] = (a3 - a2) >> 3; out += 64; } } #endif // !WEBP_NEON_OMIT_C_CODE void (*VP8TransformWHT)(const int16_t* in, int16_t* out); //------------------------------------------------------------------------------ // Intra predictions #define DST(x, y) dst[(x) + (y) * BPS] #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE void TrueMotion(uint8_t* dst, int size) { const uint8_t* top = dst - BPS; const uint8_t* const clip0 = VP8kclip1 - top[-1]; int y; for (y = 0; y < size; ++y) { const uint8_t* const clip = clip0 + dst[-1]; int x; for (x = 0; x < size; ++x) { dst[x] = clip[top[x]]; } dst += BPS; } } static void TM4_C(uint8_t* dst) { TrueMotion(dst, 4); } static void TM8uv_C(uint8_t* dst) { TrueMotion(dst, 8); } static void TM16_C(uint8_t* dst) { TrueMotion(dst, 16); } //------------------------------------------------------------------------------ // 16x16 static void VE16_C(uint8_t* dst) { // vertical int j; for (j = 0; j < 16; ++j) { memcpy(dst + j * BPS, dst - BPS, 16); } } static void HE16_C(uint8_t* dst) { // horizontal int j; for (j = 16; j > 0; --j) { memset(dst, dst[-1], 16); dst += BPS; } } static WEBP_INLINE void Put16(int v, uint8_t* dst) { int j; for (j = 0; j < 16; ++j) { memset(dst + j * BPS, v, 16); } } static void DC16_C(uint8_t* dst) { // DC int DC = 16; int j; for (j = 0; j < 16; ++j) { DC += dst[-1 + j * BPS] + dst[j - BPS]; } Put16(DC >> 5, dst); } static void DC16NoTop_C(uint8_t* dst) { // DC with top samples not available int DC = 8; int j; for (j = 0; j < 16; ++j) { DC += dst[-1 + j * BPS]; } Put16(DC >> 4, dst); } static void DC16NoLeft_C(uint8_t* dst) { // DC with left samples not available int DC = 8; int i; for (i = 0; i < 16; ++i) { DC += dst[i - BPS]; } Put16(DC >> 4, dst); } static void DC16NoTopLeft_C(uint8_t* dst) { // DC with no top and left samples Put16(0x80, dst); } #endif // !WEBP_NEON_OMIT_C_CODE VP8PredFunc VP8PredLuma16[NUM_B_DC_MODES]; //------------------------------------------------------------------------------ // 4x4 #define AVG3(a, b, c) ((uint8_t)(((a) + 2 * (b) + (c) + 2) >> 2)) #define AVG2(a, b) (((a) + (b) + 1) >> 1) #if !WEBP_NEON_OMIT_C_CODE static void VE4_C(uint8_t* dst) { // vertical const uint8_t* top = dst - BPS; const uint8_t vals[4] = { AVG3(top[-1], top[0], top[1]), AVG3(top[ 0], top[1], top[2]), AVG3(top[ 1], top[2], top[3]), AVG3(top[ 2], top[3], top[4]) }; int i; for (i = 0; i < 4; ++i) { memcpy(dst + i * BPS, vals, sizeof(vals)); } } #endif // !WEBP_NEON_OMIT_C_CODE static void HE4_C(uint8_t* dst) { // horizontal const int A = dst[-1 - BPS]; const int B = dst[-1]; const int C = dst[-1 + BPS]; const int D = dst[-1 + 2 * BPS]; const int E = dst[-1 + 3 * BPS]; WebPUint32ToMem(dst + 0 * BPS, 0x01010101U * AVG3(A, B, C)); WebPUint32ToMem(dst + 1 * BPS, 0x01010101U * AVG3(B, C, D)); WebPUint32ToMem(dst + 2 * BPS, 0x01010101U * AVG3(C, D, E)); WebPUint32ToMem(dst + 3 * BPS, 0x01010101U * AVG3(D, E, E)); } #if !WEBP_NEON_OMIT_C_CODE static void DC4_C(uint8_t* dst) { // DC uint32_t dc = 4; int i; for (i = 0; i < 4; ++i) dc += dst[i - BPS] + dst[-1 + i * BPS]; dc >>= 3; for (i = 0; i < 4; ++i) memset(dst + i * BPS, dc, 4); } static void RD4_C(uint8_t* dst) { // Down-right const int I = dst[-1 + 0 * BPS]; const int J = dst[-1 + 1 * BPS]; const int K = dst[-1 + 2 * BPS]; const int L = dst[-1 + 3 * BPS]; const int X = dst[-1 - BPS]; const int A = dst[0 - BPS]; const int B = dst[1 - BPS]; const int C = dst[2 - BPS]; const int D = dst[3 - BPS]; DST(0, 3) = AVG3(J, K, L); DST(1, 3) = DST(0, 2) = AVG3(I, J, K); DST(2, 3) = DST(1, 2) = DST(0, 1) = AVG3(X, I, J); DST(3, 3) = DST(2, 2) = DST(1, 1) = DST(0, 0) = AVG3(A, X, I); DST(3, 2) = DST(2, 1) = DST(1, 0) = AVG3(B, A, X); DST(3, 1) = DST(2, 0) = AVG3(C, B, A); DST(3, 0) = AVG3(D, C, B); } static void LD4_C(uint8_t* dst) { // Down-Left const int A = dst[0 - BPS]; const int B = dst[1 - BPS]; const int C = dst[2 - BPS]; const int D = dst[3 - BPS]; const int E = dst[4 - BPS]; const int F = dst[5 - BPS]; const int G = dst[6 - BPS]; const int H = dst[7 - BPS]; DST(0, 0) = AVG3(A, B, C); DST(1, 0) = DST(0, 1) = AVG3(B, C, D); DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E); DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F); DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G); DST(3, 2) = DST(2, 3) = AVG3(F, G, H); DST(3, 3) = AVG3(G, H, H); } #endif // !WEBP_NEON_OMIT_C_CODE static void VR4_C(uint8_t* dst) { // Vertical-Right const int I = dst[-1 + 0 * BPS]; const int J = dst[-1 + 1 * BPS]; const int K = dst[-1 + 2 * BPS]; const int X = dst[-1 - BPS]; const int A = dst[0 - BPS]; const int B = dst[1 - BPS]; const int C = dst[2 - BPS]; const int D = dst[3 - BPS]; DST(0, 0) = DST(1, 2) = AVG2(X, A); DST(1, 0) = DST(2, 2) = AVG2(A, B); DST(2, 0) = DST(3, 2) = AVG2(B, C); DST(3, 0) = AVG2(C, D); DST(0, 3) = AVG3(K, J, I); DST(0, 2) = AVG3(J, I, X); DST(0, 1) = DST(1, 3) = AVG3(I, X, A); DST(1, 1) = DST(2, 3) = AVG3(X, A, B); DST(2, 1) = DST(3, 3) = AVG3(A, B, C); DST(3, 1) = AVG3(B, C, D); } static void VL4_C(uint8_t* dst) { // Vertical-Left const int A = dst[0 - BPS]; const int B = dst[1 - BPS]; const int C = dst[2 - BPS]; const int D = dst[3 - BPS]; const int E = dst[4 - BPS]; const int F = dst[5 - BPS]; const int G = dst[6 - BPS]; const int H = dst[7 - BPS]; DST(0, 0) = AVG2(A, B); DST(1, 0) = DST(0, 2) = AVG2(B, C); DST(2, 0) = DST(1, 2) = AVG2(C, D); DST(3, 0) = DST(2, 2) = AVG2(D, E); DST(0, 1) = AVG3(A, B, C); DST(1, 1) = DST(0, 3) = AVG3(B, C, D); DST(2, 1) = DST(1, 3) = AVG3(C, D, E); DST(3, 1) = DST(2, 3) = AVG3(D, E, F); DST(3, 2) = AVG3(E, F, G); DST(3, 3) = AVG3(F, G, H); } static void HU4_C(uint8_t* dst) { // Horizontal-Up const int I = dst[-1 + 0 * BPS]; const int J = dst[-1 + 1 * BPS]; const int K = dst[-1 + 2 * BPS]; const int L = dst[-1 + 3 * BPS]; DST(0, 0) = AVG2(I, J); DST(2, 0) = DST(0, 1) = AVG2(J, K); DST(2, 1) = DST(0, 2) = AVG2(K, L); DST(1, 0) = AVG3(I, J, K); DST(3, 0) = DST(1, 1) = AVG3(J, K, L); DST(3, 1) = DST(1, 2) = AVG3(K, L, L); DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L; } static void HD4_C(uint8_t* dst) { // Horizontal-Down const int I = dst[-1 + 0 * BPS]; const int J = dst[-1 + 1 * BPS]; const int K = dst[-1 + 2 * BPS]; const int L = dst[-1 + 3 * BPS]; const int X = dst[-1 - BPS]; const int A = dst[0 - BPS]; const int B = dst[1 - BPS]; const int C = dst[2 - BPS]; DST(0, 0) = DST(2, 1) = AVG2(I, X); DST(0, 1) = DST(2, 2) = AVG2(J, I); DST(0, 2) = DST(2, 3) = AVG2(K, J); DST(0, 3) = AVG2(L, K); DST(3, 0) = AVG3(A, B, C); DST(2, 0) = AVG3(X, A, B); DST(1, 0) = DST(3, 1) = AVG3(I, X, A); DST(1, 1) = DST(3, 2) = AVG3(J, I, X); DST(1, 2) = DST(3, 3) = AVG3(K, J, I); DST(1, 3) = AVG3(L, K, J); } #undef DST #undef AVG3 #undef AVG2 VP8PredFunc VP8PredLuma4[NUM_BMODES]; //------------------------------------------------------------------------------ // Chroma #if !WEBP_NEON_OMIT_C_CODE static void VE8uv_C(uint8_t* dst) { // vertical int j; for (j = 0; j < 8; ++j) { memcpy(dst + j * BPS, dst - BPS, 8); } } static void HE8uv_C(uint8_t* dst) { // horizontal int j; for (j = 0; j < 8; ++j) { memset(dst, dst[-1], 8); dst += BPS; } } // helper for chroma-DC predictions static WEBP_INLINE void Put8x8uv(uint8_t value, uint8_t* dst) { int j; for (j = 0; j < 8; ++j) { memset(dst + j * BPS, value, 8); } } static void DC8uv_C(uint8_t* dst) { // DC int dc0 = 8; int i; for (i = 0; i < 8; ++i) { dc0 += dst[i - BPS] + dst[-1 + i * BPS]; } Put8x8uv(dc0 >> 4, dst); } static void DC8uvNoLeft_C(uint8_t* dst) { // DC with no left samples int dc0 = 4; int i; for (i = 0; i < 8; ++i) { dc0 += dst[i - BPS]; } Put8x8uv(dc0 >> 3, dst); } static void DC8uvNoTop_C(uint8_t* dst) { // DC with no top samples int dc0 = 4; int i; for (i = 0; i < 8; ++i) { dc0 += dst[-1 + i * BPS]; } Put8x8uv(dc0 >> 3, dst); } static void DC8uvNoTopLeft_C(uint8_t* dst) { // DC with nothing Put8x8uv(0x80, dst); } #endif // !WEBP_NEON_OMIT_C_CODE VP8PredFunc VP8PredChroma8[NUM_B_DC_MODES]; //------------------------------------------------------------------------------ // Edge filtering functions #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC // 4 pixels in, 2 pixels out static WEBP_INLINE void DoFilter2_C(uint8_t* p, int step) { const int p1 = p[-2*step], p0 = p[-step], q0 = p[0], q1 = p[step]; const int a = 3 * (q0 - p0) + VP8ksclip1[p1 - q1]; // in [-893,892] const int a1 = VP8ksclip2[(a + 4) >> 3]; // in [-16,15] const int a2 = VP8ksclip2[(a + 3) >> 3]; p[-step] = VP8kclip1[p0 + a2]; p[ 0] = VP8kclip1[q0 - a1]; } // 4 pixels in, 4 pixels out static WEBP_INLINE void DoFilter4_C(uint8_t* p, int step) { const int p1 = p[-2*step], p0 = p[-step], q0 = p[0], q1 = p[step]; const int a = 3 * (q0 - p0); const int a1 = VP8ksclip2[(a + 4) >> 3]; const int a2 = VP8ksclip2[(a + 3) >> 3]; const int a3 = (a1 + 1) >> 1; p[-2*step] = VP8kclip1[p1 + a3]; p[- step] = VP8kclip1[p0 + a2]; p[ 0] = VP8kclip1[q0 - a1]; p[ step] = VP8kclip1[q1 - a3]; } // 6 pixels in, 6 pixels out static WEBP_INLINE void DoFilter6_C(uint8_t* p, int step) { const int p2 = p[-3*step], p1 = p[-2*step], p0 = p[-step]; const int q0 = p[0], q1 = p[step], q2 = p[2*step]; const int a = VP8ksclip1[3 * (q0 - p0) + VP8ksclip1[p1 - q1]]; // a is in [-128,127], a1 in [-27,27], a2 in [-18,18] and a3 in [-9,9] const int a1 = (27 * a + 63) >> 7; // eq. to ((3 * a + 7) * 9) >> 7 const int a2 = (18 * a + 63) >> 7; // eq. to ((2 * a + 7) * 9) >> 7 const int a3 = (9 * a + 63) >> 7; // eq. to ((1 * a + 7) * 9) >> 7 p[-3*step] = VP8kclip1[p2 + a3]; p[-2*step] = VP8kclip1[p1 + a2]; p[- step] = VP8kclip1[p0 + a1]; p[ 0] = VP8kclip1[q0 - a1]; p[ step] = VP8kclip1[q1 - a2]; p[ 2*step] = VP8kclip1[q2 - a3]; } static WEBP_INLINE int Hev(const uint8_t* p, int step, int thresh) { const int p1 = p[-2*step], p0 = p[-step], q0 = p[0], q1 = p[step]; return (VP8kabs0[p1 - p0] > thresh) || (VP8kabs0[q1 - q0] > thresh); } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE int NeedsFilter_C(const uint8_t* p, int step, int t) { const int p1 = p[-2 * step], p0 = p[-step], q0 = p[0], q1 = p[step]; return ((4 * VP8kabs0[p0 - q0] + VP8kabs0[p1 - q1]) <= t); } #endif // !WEBP_NEON_OMIT_C_CODE #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static WEBP_INLINE int NeedsFilter2_C(const uint8_t* p, int step, int t, int it) { const int p3 = p[-4 * step], p2 = p[-3 * step], p1 = p[-2 * step]; const int p0 = p[-step], q0 = p[0]; const int q1 = p[step], q2 = p[2 * step], q3 = p[3 * step]; if ((4 * VP8kabs0[p0 - q0] + VP8kabs0[p1 - q1]) > t) return 0; return VP8kabs0[p3 - p2] <= it && VP8kabs0[p2 - p1] <= it && VP8kabs0[p1 - p0] <= it && VP8kabs0[q3 - q2] <= it && VP8kabs0[q2 - q1] <= it && VP8kabs0[q1 - q0] <= it; } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC //------------------------------------------------------------------------------ // Simple In-loop filtering (Paragraph 15.2) #if !WEBP_NEON_OMIT_C_CODE static void SimpleVFilter16_C(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; for (i = 0; i < 16; ++i) { if (NeedsFilter_C(p + i, stride, thresh2)) { DoFilter2_C(p + i, stride); } } } static void SimpleHFilter16_C(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; for (i = 0; i < 16; ++i) { if (NeedsFilter_C(p + i * stride, 1, thresh2)) { DoFilter2_C(p + i * stride, 1); } } } static void SimpleVFilter16i_C(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; SimpleVFilter16_C(p, stride, thresh); } } static void SimpleHFilter16i_C(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4; SimpleHFilter16_C(p, stride, thresh); } } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ // Complex In-loop filtering (Paragraph 15.3) #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static WEBP_INLINE void FilterLoop26_C(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { const int thresh2 = 2 * thresh + 1; while (size-- > 0) { if (NeedsFilter2_C(p, hstride, thresh2, ithresh)) { if (Hev(p, hstride, hev_thresh)) { DoFilter2_C(p, hstride); } else { DoFilter6_C(p, hstride); } } p += vstride; } } static WEBP_INLINE void FilterLoop24_C(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { const int thresh2 = 2 * thresh + 1; while (size-- > 0) { if (NeedsFilter2_C(p, hstride, thresh2, ithresh)) { if (Hev(p, hstride, hev_thresh)) { DoFilter2_C(p, hstride); } else { DoFilter4_C(p, hstride); } } p += vstride; } } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC #if !WEBP_NEON_OMIT_C_CODE // on macroblock edges static void VFilter16_C(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26_C(p, stride, 1, 16, thresh, ithresh, hev_thresh); } static void HFilter16_C(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26_C(p, 1, stride, 16, thresh, ithresh, hev_thresh); } // on three inner edges static void VFilter16i_C(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; FilterLoop24_C(p, stride, 1, 16, thresh, ithresh, hev_thresh); } } #endif // !WEBP_NEON_OMIT_C_CODE #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static void HFilter16i_C(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4; FilterLoop24_C(p, 1, stride, 16, thresh, ithresh, hev_thresh); } } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC #if !WEBP_NEON_OMIT_C_CODE // 8-pixels wide variant, for chroma filtering static void VFilter8_C(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26_C(u, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop26_C(v, stride, 1, 8, thresh, ithresh, hev_thresh); } #endif // !WEBP_NEON_OMIT_C_CODE #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static void HFilter8_C(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26_C(u, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop26_C(v, 1, stride, 8, thresh, ithresh, hev_thresh); } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC #if !WEBP_NEON_OMIT_C_CODE static void VFilter8i_C(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24_C(u + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop24_C(v + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); } #endif // !WEBP_NEON_OMIT_C_CODE #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static void HFilter8i_C(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24_C(u + 4, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop24_C(v + 4, 1, stride, 8, thresh, ithresh, hev_thresh); } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC //------------------------------------------------------------------------------ static void DitherCombine8x8_C(const uint8_t* dither, uint8_t* dst, int dst_stride) { int i, j; for (j = 0; j < 8; ++j) { for (i = 0; i < 8; ++i) { const int delta0 = dither[i] - VP8_DITHER_AMP_CENTER; const int delta1 = (delta0 + VP8_DITHER_DESCALE_ROUNDER) >> VP8_DITHER_DESCALE; dst[i] = clip_8b((int)dst[i] + delta1); } dst += dst_stride; dither += 8; } } //------------------------------------------------------------------------------ VP8DecIdct2 VP8Transform; VP8DecIdct VP8TransformAC3; VP8DecIdct VP8TransformUV; VP8DecIdct VP8TransformDC; VP8DecIdct VP8TransformDCUV; VP8LumaFilterFunc VP8VFilter16; VP8LumaFilterFunc VP8HFilter16; VP8ChromaFilterFunc VP8VFilter8; VP8ChromaFilterFunc VP8HFilter8; VP8LumaFilterFunc VP8VFilter16i; VP8LumaFilterFunc VP8HFilter16i; VP8ChromaFilterFunc VP8VFilter8i; VP8ChromaFilterFunc VP8HFilter8i; VP8SimpleFilterFunc VP8SimpleVFilter16; VP8SimpleFilterFunc VP8SimpleHFilter16; VP8SimpleFilterFunc VP8SimpleVFilter16i; VP8SimpleFilterFunc VP8SimpleHFilter16i; void (*VP8DitherCombine8x8)(const uint8_t* dither, uint8_t* dst, int dst_stride); extern VP8CPUInfo VP8GetCPUInfo; extern void VP8DspInitSSE2(void); extern void VP8DspInitSSE41(void); extern void VP8DspInitNEON(void); extern void VP8DspInitMIPS32(void); extern void VP8DspInitMIPSdspR2(void); extern void VP8DspInitMSA(void); WEBP_DSP_INIT_FUNC(VP8DspInit) { VP8InitClipTables(); #if !WEBP_NEON_OMIT_C_CODE VP8TransformWHT = TransformWHT_C; VP8Transform = TransformTwo_C; VP8TransformDC = TransformDC_C; VP8TransformAC3 = TransformAC3_C; #endif VP8TransformUV = TransformUV_C; VP8TransformDCUV = TransformDCUV_C; #if !WEBP_NEON_OMIT_C_CODE VP8VFilter16 = VFilter16_C; VP8VFilter16i = VFilter16i_C; VP8HFilter16 = HFilter16_C; VP8VFilter8 = VFilter8_C; VP8VFilter8i = VFilter8i_C; VP8SimpleVFilter16 = SimpleVFilter16_C; VP8SimpleHFilter16 = SimpleHFilter16_C; VP8SimpleVFilter16i = SimpleVFilter16i_C; VP8SimpleHFilter16i = SimpleHFilter16i_C; #endif #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC VP8HFilter16i = HFilter16i_C; VP8HFilter8 = HFilter8_C; VP8HFilter8i = HFilter8i_C; #endif #if !WEBP_NEON_OMIT_C_CODE VP8PredLuma4[0] = DC4_C; VP8PredLuma4[1] = TM4_C; VP8PredLuma4[2] = VE4_C; VP8PredLuma4[4] = RD4_C; VP8PredLuma4[6] = LD4_C; #endif VP8PredLuma4[3] = HE4_C; VP8PredLuma4[5] = VR4_C; VP8PredLuma4[7] = VL4_C; VP8PredLuma4[8] = HD4_C; VP8PredLuma4[9] = HU4_C; #if !WEBP_NEON_OMIT_C_CODE VP8PredLuma16[0] = DC16_C; VP8PredLuma16[1] = TM16_C; VP8PredLuma16[2] = VE16_C; VP8PredLuma16[3] = HE16_C; VP8PredLuma16[4] = DC16NoTop_C; VP8PredLuma16[5] = DC16NoLeft_C; VP8PredLuma16[6] = DC16NoTopLeft_C; VP8PredChroma8[0] = DC8uv_C; VP8PredChroma8[1] = TM8uv_C; VP8PredChroma8[2] = VE8uv_C; VP8PredChroma8[3] = HE8uv_C; VP8PredChroma8[4] = DC8uvNoTop_C; VP8PredChroma8[5] = DC8uvNoLeft_C; VP8PredChroma8[6] = DC8uvNoTopLeft_C; #endif VP8DitherCombine8x8 = DitherCombine8x8_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8DspInitSSE2(); #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { VP8DspInitSSE41(); } #endif } #endif #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { VP8DspInitMIPS32(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8DspInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { VP8DspInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { VP8DspInitNEON(); } #endif assert(VP8TransformWHT != NULL); assert(VP8Transform != NULL); assert(VP8TransformDC != NULL); assert(VP8TransformAC3 != NULL); assert(VP8TransformUV != NULL); assert(VP8TransformDCUV != NULL); assert(VP8VFilter16 != NULL); assert(VP8HFilter16 != NULL); assert(VP8VFilter8 != NULL); assert(VP8HFilter8 != NULL); assert(VP8VFilter16i != NULL); assert(VP8HFilter16i != NULL); assert(VP8VFilter8i != NULL); assert(VP8HFilter8i != NULL); assert(VP8SimpleVFilter16 != NULL); assert(VP8SimpleHFilter16 != NULL); assert(VP8SimpleVFilter16i != NULL); assert(VP8SimpleHFilter16i != NULL); assert(VP8PredLuma4[0] != NULL); assert(VP8PredLuma4[1] != NULL); assert(VP8PredLuma4[2] != NULL); assert(VP8PredLuma4[3] != NULL); assert(VP8PredLuma4[4] != NULL); assert(VP8PredLuma4[5] != NULL); assert(VP8PredLuma4[6] != NULL); assert(VP8PredLuma4[7] != NULL); assert(VP8PredLuma4[8] != NULL); assert(VP8PredLuma4[9] != NULL); assert(VP8PredLuma16[0] != NULL); assert(VP8PredLuma16[1] != NULL); assert(VP8PredLuma16[2] != NULL); assert(VP8PredLuma16[3] != NULL); assert(VP8PredLuma16[4] != NULL); assert(VP8PredLuma16[5] != NULL); assert(VP8PredLuma16[6] != NULL); assert(VP8PredChroma8[0] != NULL); assert(VP8PredChroma8[1] != NULL); assert(VP8PredChroma8[2] != NULL); assert(VP8PredChroma8[3] != NULL); assert(VP8PredChroma8[4] != NULL); assert(VP8PredChroma8[5] != NULL); assert(VP8PredChroma8[6] != NULL); assert(VP8DitherCombine8x8 != NULL); } libwebp-1.4.0/src/dsp/dec_clip_tables.c0000644000014400001440000005662414606317060014705 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Clipping tables for filtering // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" // define to 0 to have run-time table initialization #if !defined(USE_STATIC_TABLES) #define USE_STATIC_TABLES 1 // ALTERNATE_CODE #endif #if (USE_STATIC_TABLES == 1) static const uint8_t abs0[255 + 255 + 1] = { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, 0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0, 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8, 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0, 0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0, 0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; static const uint8_t sclip1[1020 + 1020 + 1] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f }; static const uint8_t sclip2[112 + 112 + 1] = { 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f }; static const uint8_t clip1[255 + 511 + 1] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; #else // uninitialized tables static uint8_t abs0[255 + 255 + 1]; static int8_t sclip1[1020 + 1020 + 1]; static int8_t sclip2[112 + 112 + 1]; static uint8_t clip1[255 + 511 + 1]; // We declare this variable 'volatile' to prevent instruction reordering // and make sure it's set to true _last_ (so as to be thread-safe) static volatile int tables_ok = 0; #endif // USE_STATIC_TABLES const int8_t* const VP8ksclip1 = (const int8_t*)&sclip1[1020]; const int8_t* const VP8ksclip2 = (const int8_t*)&sclip2[112]; const uint8_t* const VP8kclip1 = &clip1[255]; const uint8_t* const VP8kabs0 = &abs0[255]; WEBP_TSAN_IGNORE_FUNCTION void VP8InitClipTables(void) { #if (USE_STATIC_TABLES == 0) int i; if (!tables_ok) { for (i = -255; i <= 255; ++i) { abs0[255 + i] = (i < 0) ? -i : i; } for (i = -1020; i <= 1020; ++i) { sclip1[1020 + i] = (i < -128) ? -128 : (i > 127) ? 127 : i; } for (i = -112; i <= 112; ++i) { sclip2[112 + i] = (i < -16) ? -16 : (i > 15) ? 15 : i; } for (i = -255; i <= 255 + 255; ++i) { clip1[255 + i] = (i < 0) ? 0 : (i > 255) ? 255 : i; } tables_ok = 1; } #endif // USE_STATIC_TABLES } libwebp-1.4.0/src/dsp/rescaler_neon.c0000644000014400001440000001640114606317060014415 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON version of rescaling functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) && !defined(WEBP_REDUCE_SIZE) #include #include #include "src/dsp/neon.h" #include "src/utils/rescaler_utils.h" #define ROUNDER (WEBP_RESCALER_ONE >> 1) #define MULT_FIX_C(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) #define MULT_FIX_FLOOR_C(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX) #define LOAD_32x4(SRC, DST) const uint32x4_t DST = vld1q_u32((SRC)) #define LOAD_32x8(SRC, DST0, DST1) \ LOAD_32x4(SRC + 0, DST0); \ LOAD_32x4(SRC + 4, DST1) #define STORE_32x8(SRC0, SRC1, DST) do { \ vst1q_u32((DST) + 0, SRC0); \ vst1q_u32((DST) + 4, SRC1); \ } while (0) #if (WEBP_RESCALER_RFIX == 32) #define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1)) // note: B is actualy scale>>1. See MAKE_HALF_CST #define MULT_FIX(A, B) \ vreinterpretq_u32_s32(vqrdmulhq_s32(vreinterpretq_s32_u32((A)), (B))) #define MULT_FIX_FLOOR(A, B) \ vreinterpretq_u32_s32(vqdmulhq_s32(vreinterpretq_s32_u32((A)), (B))) #else #error "MULT_FIX/WEBP_RESCALER_RFIX need some more work" #endif static uint32x4_t Interpolate_NEON(const rescaler_t* const frow, const rescaler_t* const irow, uint32_t A, uint32_t B) { LOAD_32x4(frow, A0); LOAD_32x4(irow, B0); const uint64x2_t C0 = vmull_n_u32(vget_low_u32(A0), A); const uint64x2_t C1 = vmull_n_u32(vget_high_u32(A0), A); const uint64x2_t D0 = vmlal_n_u32(C0, vget_low_u32(B0), B); const uint64x2_t D1 = vmlal_n_u32(C1, vget_high_u32(B0), B); const uint32x4_t E = vcombine_u32( vrshrn_n_u64(D0, WEBP_RESCALER_RFIX), vrshrn_n_u64(D1, WEBP_RESCALER_RFIX)); return E; } static void RescalerExportRowExpand_NEON(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const int max_span = x_out_max & ~7; const rescaler_t* const frow = wrk->frow; const uint32_t fy_scale = wrk->fy_scale; const int32x4_t fy_scale_half = MAKE_HALF_CST(fy_scale); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(wrk->y_expand); assert(wrk->y_sub != 0); if (wrk->y_accum == 0) { for (x_out = 0; x_out < max_span; x_out += 8) { LOAD_32x4(frow + x_out + 0, A0); LOAD_32x4(frow + x_out + 4, A1); const uint32x4_t B0 = MULT_FIX(A0, fy_scale_half); const uint32x4_t B1 = MULT_FIX(A1, fy_scale_half); const uint16x4_t C0 = vmovn_u32(B0); const uint16x4_t C1 = vmovn_u32(B1); const uint8x8_t D = vqmovn_u16(vcombine_u16(C0, C1)); vst1_u8(dst + x_out, D); } for (; x_out < x_out_max; ++x_out) { const uint32_t J = frow[x_out]; const int v = (int)MULT_FIX_C(J, fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } else { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); for (x_out = 0; x_out < max_span; x_out += 8) { const uint32x4_t C0 = Interpolate_NEON(frow + x_out + 0, irow + x_out + 0, A, B); const uint32x4_t C1 = Interpolate_NEON(frow + x_out + 4, irow + x_out + 4, A, B); const uint32x4_t D0 = MULT_FIX(C0, fy_scale_half); const uint32x4_t D1 = MULT_FIX(C1, fy_scale_half); const uint16x4_t E0 = vmovn_u32(D0); const uint16x4_t E1 = vmovn_u32(D1); const uint8x8_t F = vqmovn_u16(vcombine_u16(E0, E1)); vst1_u8(dst + x_out, F); } for (; x_out < x_out_max; ++x_out) { const uint64_t I = (uint64_t)A * frow[x_out] + (uint64_t)B * irow[x_out]; const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); const int v = (int)MULT_FIX_C(J, fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } } static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const int max_span = x_out_max & ~7; const rescaler_t* const frow = wrk->frow; const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum); const uint32_t fxy_scale = wrk->fxy_scale; const uint32x4_t zero = vdupq_n_u32(0); const int32x4_t yscale_half = MAKE_HALF_CST(yscale); const int32x4_t fxy_scale_half = MAKE_HALF_CST(fxy_scale); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); if (yscale) { for (x_out = 0; x_out < max_span; x_out += 8) { LOAD_32x8(frow + x_out, in0, in1); LOAD_32x8(irow + x_out, in2, in3); const uint32x4_t A0 = MULT_FIX_FLOOR(in0, yscale_half); const uint32x4_t A1 = MULT_FIX_FLOOR(in1, yscale_half); const uint32x4_t B0 = vqsubq_u32(in2, A0); const uint32x4_t B1 = vqsubq_u32(in3, A1); const uint32x4_t C0 = MULT_FIX(B0, fxy_scale_half); const uint32x4_t C1 = MULT_FIX(B1, fxy_scale_half); const uint16x4_t D0 = vmovn_u32(C0); const uint16x4_t D1 = vmovn_u32(C1); const uint8x8_t E = vqmovn_u16(vcombine_u16(D0, D1)); vst1_u8(dst + x_out, E); STORE_32x8(A0, A1, irow + x_out); } for (; x_out < x_out_max; ++x_out) { const uint32_t frac = (uint32_t)MULT_FIX_FLOOR_C(frow[x_out], yscale); const int v = (int)MULT_FIX_C(irow[x_out] - frac, fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = frac; // new fractional start } } else { for (x_out = 0; x_out < max_span; x_out += 8) { LOAD_32x8(irow + x_out, in0, in1); const uint32x4_t A0 = MULT_FIX(in0, fxy_scale_half); const uint32x4_t A1 = MULT_FIX(in1, fxy_scale_half); const uint16x4_t B0 = vmovn_u32(A0); const uint16x4_t B1 = vmovn_u32(A1); const uint8x8_t C = vqmovn_u16(vcombine_u16(B0, B1)); vst1_u8(dst + x_out, C); STORE_32x8(zero, zero, irow + x_out); } for (; x_out < x_out_max; ++x_out) { const int v = (int)MULT_FIX_C(irow[x_out], fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = 0; } } } #undef MULT_FIX_FLOOR_C #undef MULT_FIX_C #undef MULT_FIX_FLOOR #undef MULT_FIX #undef ROUNDER //------------------------------------------------------------------------------ extern void WebPRescalerDspInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitNEON(void) { WebPRescalerExportRowExpand = RescalerExportRowExpand_NEON; WebPRescalerExportRowShrink = RescalerExportRowShrink_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(WebPRescalerDspInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/msa_macro.h0000644000014400001440000017526514606317060013562 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA common macros // // Author(s): Prashant Patil (prashant.patil@imgtec.com) #ifndef WEBP_DSP_MSA_MACRO_H_ #define WEBP_DSP_MSA_MACRO_H_ #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include #include #if defined(__clang__) #define CLANG_BUILD #endif #ifdef CLANG_BUILD #define ALPHAVAL (-1) #define ADDVI_H(a, b) __msa_addvi_h((v8i16)a, b) #define ADDVI_W(a, b) __msa_addvi_w((v4i32)a, b) #define SRAI_B(a, b) __msa_srai_b((v16i8)a, b) #define SRAI_H(a, b) __msa_srai_h((v8i16)a, b) #define SRAI_W(a, b) __msa_srai_w((v4i32)a, b) #define SRLI_H(a, b) __msa_srli_h((v8i16)a, b) #define SLLI_B(a, b) __msa_slli_b((v4i32)a, b) #define ANDI_B(a, b) __msa_andi_b((v16u8)a, b) #define ORI_B(a, b) __msa_ori_b((v16u8)a, b) #else #define ALPHAVAL (0xff) #define ADDVI_H(a, b) (a + b) #define ADDVI_W(a, b) (a + b) #define SRAI_B(a, b) (a >> b) #define SRAI_H(a, b) (a >> b) #define SRAI_W(a, b) (a >> b) #define SRLI_H(a, b) (a << b) #define SLLI_B(a, b) (a << b) #define ANDI_B(a, b) (a & b) #define ORI_B(a, b) (a | b) #endif #define LD_B(RTYPE, psrc) *((RTYPE*)(psrc)) #define LD_UB(...) LD_B(v16u8, __VA_ARGS__) #define LD_SB(...) LD_B(v16i8, __VA_ARGS__) #define LD_H(RTYPE, psrc) *((RTYPE*)(psrc)) #define LD_UH(...) LD_H(v8u16, __VA_ARGS__) #define LD_SH(...) LD_H(v8i16, __VA_ARGS__) #define LD_W(RTYPE, psrc) *((RTYPE*)(psrc)) #define LD_UW(...) LD_W(v4u32, __VA_ARGS__) #define LD_SW(...) LD_W(v4i32, __VA_ARGS__) #define ST_B(RTYPE, in, pdst) *((RTYPE*)(pdst)) = in #define ST_UB(...) ST_B(v16u8, __VA_ARGS__) #define ST_SB(...) ST_B(v16i8, __VA_ARGS__) #define ST_H(RTYPE, in, pdst) *((RTYPE*)(pdst)) = in #define ST_UH(...) ST_H(v8u16, __VA_ARGS__) #define ST_SH(...) ST_H(v8i16, __VA_ARGS__) #define ST_W(RTYPE, in, pdst) *((RTYPE*)(pdst)) = in #define ST_UW(...) ST_W(v4u32, __VA_ARGS__) #define ST_SW(...) ST_W(v4i32, __VA_ARGS__) #define MSA_LOAD_FUNC(TYPE, INSTR, FUNC_NAME) \ static inline TYPE FUNC_NAME(const void* const psrc) { \ const uint8_t* const psrc_m = (const uint8_t*)psrc; \ TYPE val_m; \ __asm__ volatile("" #INSTR " %[val_m], %[psrc_m] \n\t" \ : [val_m] "=r"(val_m) \ : [psrc_m] "m"(*psrc_m)); \ return val_m; \ } #define MSA_LOAD(psrc, FUNC_NAME) FUNC_NAME(psrc) #define MSA_STORE_FUNC(TYPE, INSTR, FUNC_NAME) \ static inline void FUNC_NAME(TYPE val, void* const pdst) { \ uint8_t* const pdst_m = (uint8_t*)pdst; \ TYPE val_m = val; \ __asm__ volatile(" " #INSTR " %[val_m], %[pdst_m] \n\t" \ : [pdst_m] "=m"(*pdst_m) \ : [val_m] "r"(val_m)); \ } #define MSA_STORE(val, pdst, FUNC_NAME) FUNC_NAME(val, pdst) #if (__mips_isa_rev >= 6) MSA_LOAD_FUNC(uint16_t, lh, msa_lh); #define LH(psrc) MSA_LOAD(psrc, msa_lh) MSA_LOAD_FUNC(uint32_t, lw, msa_lw); #define LW(psrc) MSA_LOAD(psrc, msa_lw) #if (__mips == 64) MSA_LOAD_FUNC(uint64_t, ld, msa_ld); #define LD(psrc) MSA_LOAD(psrc, msa_ld) #else // !(__mips == 64) #define LD(psrc) ((((uint64_t)MSA_LOAD(psrc + 4, msa_lw)) << 32) | \ MSA_LOAD(psrc, msa_lw)) #endif // (__mips == 64) MSA_STORE_FUNC(uint16_t, sh, msa_sh); #define SH(val, pdst) MSA_STORE(val, pdst, msa_sh) MSA_STORE_FUNC(uint32_t, sw, msa_sw); #define SW(val, pdst) MSA_STORE(val, pdst, msa_sw) MSA_STORE_FUNC(uint64_t, sd, msa_sd); #define SD(val, pdst) MSA_STORE(val, pdst, msa_sd) #else // !(__mips_isa_rev >= 6) MSA_LOAD_FUNC(uint16_t, ulh, msa_ulh); #define LH(psrc) MSA_LOAD(psrc, msa_ulh) MSA_LOAD_FUNC(uint32_t, ulw, msa_ulw); #define LW(psrc) MSA_LOAD(psrc, msa_ulw) #if (__mips == 64) MSA_LOAD_FUNC(uint64_t, uld, msa_uld); #define LD(psrc) MSA_LOAD(psrc, msa_uld) #else // !(__mips == 64) #define LD(psrc) ((((uint64_t)MSA_LOAD(psrc + 4, msa_ulw)) << 32) | \ MSA_LOAD(psrc, msa_ulw)) #endif // (__mips == 64) MSA_STORE_FUNC(uint16_t, ush, msa_ush); #define SH(val, pdst) MSA_STORE(val, pdst, msa_ush) MSA_STORE_FUNC(uint32_t, usw, msa_usw); #define SW(val, pdst) MSA_STORE(val, pdst, msa_usw) #define SD(val, pdst) do { \ uint8_t* const pdst_sd_m = (uint8_t*)(pdst); \ const uint32_t val0_m = (uint32_t)(val & 0x00000000FFFFFFFF); \ const uint32_t val1_m = (uint32_t)((val >> 32) & 0x00000000FFFFFFFF); \ SW(val0_m, pdst_sd_m); \ SW(val1_m, pdst_sd_m + 4); \ } while (0) #endif // (__mips_isa_rev >= 6) /* Description : Load 4 words with stride * Arguments : Inputs - psrc, stride * Outputs - out0, out1, out2, out3 * Details : Load word in 'out0' from (psrc) * Load word in 'out1' from (psrc + stride) * Load word in 'out2' from (psrc + 2 * stride) * Load word in 'out3' from (psrc + 3 * stride) */ #define LW4(psrc, stride, out0, out1, out2, out3) do { \ const uint8_t* ptmp = (const uint8_t*)psrc; \ out0 = LW(ptmp); \ ptmp += stride; \ out1 = LW(ptmp); \ ptmp += stride; \ out2 = LW(ptmp); \ ptmp += stride; \ out3 = LW(ptmp); \ } while (0) /* Description : Store words with stride * Arguments : Inputs - in0, in1, in2, in3, pdst, stride * Details : Store word from 'in0' to (pdst) * Store word from 'in1' to (pdst + stride) * Store word from 'in2' to (pdst + 2 * stride) * Store word from 'in3' to (pdst + 3 * stride) */ #define SW4(in0, in1, in2, in3, pdst, stride) do { \ uint8_t* ptmp = (uint8_t*)pdst; \ SW(in0, ptmp); \ ptmp += stride; \ SW(in1, ptmp); \ ptmp += stride; \ SW(in2, ptmp); \ ptmp += stride; \ SW(in3, ptmp); \ } while (0) #define SW3(in0, in1, in2, pdst, stride) do { \ uint8_t* ptmp = (uint8_t*)pdst; \ SW(in0, ptmp); \ ptmp += stride; \ SW(in1, ptmp); \ ptmp += stride; \ SW(in2, ptmp); \ } while (0) #define SW2(in0, in1, pdst, stride) do { \ uint8_t* ptmp = (uint8_t*)pdst; \ SW(in0, ptmp); \ ptmp += stride; \ SW(in1, ptmp); \ } while (0) /* Description : Store 4 double words with stride * Arguments : Inputs - in0, in1, in2, in3, pdst, stride * Details : Store double word from 'in0' to (pdst) * Store double word from 'in1' to (pdst + stride) * Store double word from 'in2' to (pdst + 2 * stride) * Store double word from 'in3' to (pdst + 3 * stride) */ #define SD4(in0, in1, in2, in3, pdst, stride) do { \ uint8_t* ptmp = (uint8_t*)pdst; \ SD(in0, ptmp); \ ptmp += stride; \ SD(in1, ptmp); \ ptmp += stride; \ SD(in2, ptmp); \ ptmp += stride; \ SD(in3, ptmp); \ } while (0) /* Description : Load vectors with 16 byte elements with stride * Arguments : Inputs - psrc, stride * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Load 16 byte elements in 'out0' from (psrc) * Load 16 byte elements in 'out1' from (psrc + stride) */ #define LD_B2(RTYPE, psrc, stride, out0, out1) do { \ out0 = LD_B(RTYPE, psrc); \ out1 = LD_B(RTYPE, psrc + stride); \ } while (0) #define LD_UB2(...) LD_B2(v16u8, __VA_ARGS__) #define LD_SB2(...) LD_B2(v16i8, __VA_ARGS__) #define LD_B3(RTYPE, psrc, stride, out0, out1, out2) do { \ LD_B2(RTYPE, psrc, stride, out0, out1); \ out2 = LD_B(RTYPE, psrc + 2 * stride); \ } while (0) #define LD_UB3(...) LD_B3(v16u8, __VA_ARGS__) #define LD_SB3(...) LD_B3(v16i8, __VA_ARGS__) #define LD_B4(RTYPE, psrc, stride, out0, out1, out2, out3) do { \ LD_B2(RTYPE, psrc, stride, out0, out1); \ LD_B2(RTYPE, psrc + 2 * stride , stride, out2, out3); \ } while (0) #define LD_UB4(...) LD_B4(v16u8, __VA_ARGS__) #define LD_SB4(...) LD_B4(v16i8, __VA_ARGS__) #define LD_B8(RTYPE, psrc, stride, \ out0, out1, out2, out3, out4, out5, out6, out7) do { \ LD_B4(RTYPE, psrc, stride, out0, out1, out2, out3); \ LD_B4(RTYPE, psrc + 4 * stride, stride, out4, out5, out6, out7); \ } while (0) #define LD_UB8(...) LD_B8(v16u8, __VA_ARGS__) #define LD_SB8(...) LD_B8(v16i8, __VA_ARGS__) /* Description : Load vectors with 8 halfword elements with stride * Arguments : Inputs - psrc, stride * Outputs - out0, out1 * Details : Load 8 halfword elements in 'out0' from (psrc) * Load 8 halfword elements in 'out1' from (psrc + stride) */ #define LD_H2(RTYPE, psrc, stride, out0, out1) do { \ out0 = LD_H(RTYPE, psrc); \ out1 = LD_H(RTYPE, psrc + stride); \ } while (0) #define LD_UH2(...) LD_H2(v8u16, __VA_ARGS__) #define LD_SH2(...) LD_H2(v8i16, __VA_ARGS__) /* Description : Load vectors with 4 word elements with stride * Arguments : Inputs - psrc, stride * Outputs - out0, out1, out2, out3 * Details : Load 4 word elements in 'out0' from (psrc + 0 * stride) * Load 4 word elements in 'out1' from (psrc + 1 * stride) * Load 4 word elements in 'out2' from (psrc + 2 * stride) * Load 4 word elements in 'out3' from (psrc + 3 * stride) */ #define LD_W2(RTYPE, psrc, stride, out0, out1) do { \ out0 = LD_W(RTYPE, psrc); \ out1 = LD_W(RTYPE, psrc + stride); \ } while (0) #define LD_UW2(...) LD_W2(v4u32, __VA_ARGS__) #define LD_SW2(...) LD_W2(v4i32, __VA_ARGS__) #define LD_W3(RTYPE, psrc, stride, out0, out1, out2) do { \ LD_W2(RTYPE, psrc, stride, out0, out1); \ out2 = LD_W(RTYPE, psrc + 2 * stride); \ } while (0) #define LD_UW3(...) LD_W3(v4u32, __VA_ARGS__) #define LD_SW3(...) LD_W3(v4i32, __VA_ARGS__) #define LD_W4(RTYPE, psrc, stride, out0, out1, out2, out3) do { \ LD_W2(RTYPE, psrc, stride, out0, out1); \ LD_W2(RTYPE, psrc + 2 * stride, stride, out2, out3); \ } while (0) #define LD_UW4(...) LD_W4(v4u32, __VA_ARGS__) #define LD_SW4(...) LD_W4(v4i32, __VA_ARGS__) /* Description : Store vectors of 16 byte elements with stride * Arguments : Inputs - in0, in1, pdst, stride * Details : Store 16 byte elements from 'in0' to (pdst) * Store 16 byte elements from 'in1' to (pdst + stride) */ #define ST_B2(RTYPE, in0, in1, pdst, stride) do { \ ST_B(RTYPE, in0, pdst); \ ST_B(RTYPE, in1, pdst + stride); \ } while (0) #define ST_UB2(...) ST_B2(v16u8, __VA_ARGS__) #define ST_SB2(...) ST_B2(v16i8, __VA_ARGS__) #define ST_B4(RTYPE, in0, in1, in2, in3, pdst, stride) do { \ ST_B2(RTYPE, in0, in1, pdst, stride); \ ST_B2(RTYPE, in2, in3, pdst + 2 * stride, stride); \ } while (0) #define ST_UB4(...) ST_B4(v16u8, __VA_ARGS__) #define ST_SB4(...) ST_B4(v16i8, __VA_ARGS__) #define ST_B8(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, \ pdst, stride) do { \ ST_B4(RTYPE, in0, in1, in2, in3, pdst, stride); \ ST_B4(RTYPE, in4, in5, in6, in7, pdst + 4 * stride, stride); \ } while (0) #define ST_UB8(...) ST_B8(v16u8, __VA_ARGS__) /* Description : Store vectors of 4 word elements with stride * Arguments : Inputs - in0, in1, in2, in3, pdst, stride * Details : Store 4 word elements from 'in0' to (pdst + 0 * stride) * Store 4 word elements from 'in1' to (pdst + 1 * stride) * Store 4 word elements from 'in2' to (pdst + 2 * stride) * Store 4 word elements from 'in3' to (pdst + 3 * stride) */ #define ST_W2(RTYPE, in0, in1, pdst, stride) do { \ ST_W(RTYPE, in0, pdst); \ ST_W(RTYPE, in1, pdst + stride); \ } while (0) #define ST_UW2(...) ST_W2(v4u32, __VA_ARGS__) #define ST_SW2(...) ST_W2(v4i32, __VA_ARGS__) #define ST_W3(RTYPE, in0, in1, in2, pdst, stride) do { \ ST_W2(RTYPE, in0, in1, pdst, stride); \ ST_W(RTYPE, in2, pdst + 2 * stride); \ } while (0) #define ST_UW3(...) ST_W3(v4u32, __VA_ARGS__) #define ST_SW3(...) ST_W3(v4i32, __VA_ARGS__) #define ST_W4(RTYPE, in0, in1, in2, in3, pdst, stride) do { \ ST_W2(RTYPE, in0, in1, pdst, stride); \ ST_W2(RTYPE, in2, in3, pdst + 2 * stride, stride); \ } while (0) #define ST_UW4(...) ST_W4(v4u32, __VA_ARGS__) #define ST_SW4(...) ST_W4(v4i32, __VA_ARGS__) /* Description : Store vectors of 8 halfword elements with stride * Arguments : Inputs - in0, in1, pdst, stride * Details : Store 8 halfword elements from 'in0' to (pdst) * Store 8 halfword elements from 'in1' to (pdst + stride) */ #define ST_H2(RTYPE, in0, in1, pdst, stride) do { \ ST_H(RTYPE, in0, pdst); \ ST_H(RTYPE, in1, pdst + stride); \ } while (0) #define ST_UH2(...) ST_H2(v8u16, __VA_ARGS__) #define ST_SH2(...) ST_H2(v8i16, __VA_ARGS__) /* Description : Store 2x4 byte block to destination memory from input vector * Arguments : Inputs - in, stidx, pdst, stride * Details : Index 'stidx' halfword element from 'in' vector is copied to * the GP register and stored to (pdst) * Index 'stidx+1' halfword element from 'in' vector is copied to * the GP register and stored to (pdst + stride) * Index 'stidx+2' halfword element from 'in' vector is copied to * the GP register and stored to (pdst + 2 * stride) * Index 'stidx+3' halfword element from 'in' vector is copied to * the GP register and stored to (pdst + 3 * stride) */ #define ST2x4_UB(in, stidx, pdst, stride) do { \ uint8_t* pblk_2x4_m = (uint8_t*)pdst; \ const uint16_t out0_m = __msa_copy_s_h((v8i16)in, stidx); \ const uint16_t out1_m = __msa_copy_s_h((v8i16)in, stidx + 1); \ const uint16_t out2_m = __msa_copy_s_h((v8i16)in, stidx + 2); \ const uint16_t out3_m = __msa_copy_s_h((v8i16)in, stidx + 3); \ SH(out0_m, pblk_2x4_m); \ pblk_2x4_m += stride; \ SH(out1_m, pblk_2x4_m); \ pblk_2x4_m += stride; \ SH(out2_m, pblk_2x4_m); \ pblk_2x4_m += stride; \ SH(out3_m, pblk_2x4_m); \ } while (0) /* Description : Store 4x4 byte block to destination memory from input vector * Arguments : Inputs - in0, in1, pdst, stride * Details : 'Idx0' word element from input vector 'in0' is copied to the * GP register and stored to (pdst) * 'Idx1' word element from input vector 'in0' is copied to the * GP register and stored to (pdst + stride) * 'Idx2' word element from input vector 'in0' is copied to the * GP register and stored to (pdst + 2 * stride) * 'Idx3' word element from input vector 'in0' is copied to the * GP register and stored to (pdst + 3 * stride) */ #define ST4x4_UB(in0, in1, idx0, idx1, idx2, idx3, pdst, stride) do { \ uint8_t* const pblk_4x4_m = (uint8_t*)pdst; \ const uint32_t out0_m = __msa_copy_s_w((v4i32)in0, idx0); \ const uint32_t out1_m = __msa_copy_s_w((v4i32)in0, idx1); \ const uint32_t out2_m = __msa_copy_s_w((v4i32)in1, idx2); \ const uint32_t out3_m = __msa_copy_s_w((v4i32)in1, idx3); \ SW4(out0_m, out1_m, out2_m, out3_m, pblk_4x4_m, stride); \ } while (0) #define ST4x8_UB(in0, in1, pdst, stride) do { \ uint8_t* const pblk_4x8 = (uint8_t*)pdst; \ ST4x4_UB(in0, in0, 0, 1, 2, 3, pblk_4x8, stride); \ ST4x4_UB(in1, in1, 0, 1, 2, 3, pblk_4x8 + 4 * stride, stride); \ } while (0) /* Description : Immediate number of elements to slide * Arguments : Inputs - in0, in1, slide_val * Outputs - out * Return Type - as per RTYPE * Details : Byte elements from 'in1' vector are slid into 'in0' by * value specified in the 'slide_val' */ #define SLDI_B(RTYPE, in0, in1, slide_val) \ (RTYPE)__msa_sldi_b((v16i8)in0, (v16i8)in1, slide_val) \ #define SLDI_UB(...) SLDI_B(v16u8, __VA_ARGS__) #define SLDI_SB(...) SLDI_B(v16i8, __VA_ARGS__) #define SLDI_SH(...) SLDI_B(v8i16, __VA_ARGS__) /* Description : Shuffle byte vector elements as per mask vector * Arguments : Inputs - in0, in1, in2, in3, mask0, mask1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Byte elements from 'in0' & 'in1' are copied selectively to * 'out0' as per control vector 'mask0' */ #define VSHF_B(RTYPE, in0, in1, mask) \ (RTYPE)__msa_vshf_b((v16i8)mask, (v16i8)in1, (v16i8)in0) #define VSHF_UB(...) VSHF_B(v16u8, __VA_ARGS__) #define VSHF_SB(...) VSHF_B(v16i8, __VA_ARGS__) #define VSHF_UH(...) VSHF_B(v8u16, __VA_ARGS__) #define VSHF_SH(...) VSHF_B(v8i16, __VA_ARGS__) #define VSHF_B2(RTYPE, in0, in1, in2, in3, mask0, mask1, out0, out1) do { \ out0 = VSHF_B(RTYPE, in0, in1, mask0); \ out1 = VSHF_B(RTYPE, in2, in3, mask1); \ } while (0) #define VSHF_B2_UB(...) VSHF_B2(v16u8, __VA_ARGS__) #define VSHF_B2_SB(...) VSHF_B2(v16i8, __VA_ARGS__) #define VSHF_B2_UH(...) VSHF_B2(v8u16, __VA_ARGS__) #define VSHF_B2_SH(...) VSHF_B2(v8i16, __VA_ARGS__) /* Description : Shuffle halfword vector elements as per mask vector * Arguments : Inputs - in0, in1, in2, in3, mask0, mask1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : halfword elements from 'in0' & 'in1' are copied selectively to * 'out0' as per control vector 'mask0' */ #define VSHF_H2(RTYPE, in0, in1, in2, in3, mask0, mask1, out0, out1) do { \ out0 = (RTYPE)__msa_vshf_h((v8i16)mask0, (v8i16)in1, (v8i16)in0); \ out1 = (RTYPE)__msa_vshf_h((v8i16)mask1, (v8i16)in3, (v8i16)in2); \ } while (0) #define VSHF_H2_UH(...) VSHF_H2(v8u16, __VA_ARGS__) #define VSHF_H2_SH(...) VSHF_H2(v8i16, __VA_ARGS__) /* Description : Dot product of byte vector elements * Arguments : Inputs - mult0, mult1, cnst0, cnst1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Signed byte elements from 'mult0' are multiplied with * signed byte elements from 'cnst0' producing a result * twice the size of input i.e. signed halfword. * The multiplication result of adjacent odd-even elements * are added together and written to the 'out0' vector */ #define DOTP_SB2(RTYPE, mult0, mult1, cnst0, cnst1, out0, out1) do { \ out0 = (RTYPE)__msa_dotp_s_h((v16i8)mult0, (v16i8)cnst0); \ out1 = (RTYPE)__msa_dotp_s_h((v16i8)mult1, (v16i8)cnst1); \ } while (0) #define DOTP_SB2_SH(...) DOTP_SB2(v8i16, __VA_ARGS__) /* Description : Dot product of halfword vector elements * Arguments : Inputs - mult0, mult1, cnst0, cnst1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Signed halfword elements from 'mult0' are multiplied with * signed halfword elements from 'cnst0' producing a result * twice the size of input i.e. signed word. * The multiplication result of adjacent odd-even elements * are added together and written to the 'out0' vector */ #define DOTP_SH2(RTYPE, mult0, mult1, cnst0, cnst1, out0, out1) do { \ out0 = (RTYPE)__msa_dotp_s_w((v8i16)mult0, (v8i16)cnst0); \ out1 = (RTYPE)__msa_dotp_s_w((v8i16)mult1, (v8i16)cnst1); \ } while (0) #define DOTP_SH2_SW(...) DOTP_SH2(v4i32, __VA_ARGS__) /* Description : Dot product of unsigned word vector elements * Arguments : Inputs - mult0, mult1, cnst0, cnst1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Unsigned word elements from 'mult0' are multiplied with * unsigned word elements from 'cnst0' producing a result * twice the size of input i.e. unsigned double word. * The multiplication result of adjacent odd-even elements * are added together and written to the 'out0' vector */ #define DOTP_UW2(RTYPE, mult0, mult1, cnst0, cnst1, out0, out1) do { \ out0 = (RTYPE)__msa_dotp_u_d((v4u32)mult0, (v4u32)cnst0); \ out1 = (RTYPE)__msa_dotp_u_d((v4u32)mult1, (v4u32)cnst1); \ } while (0) #define DOTP_UW2_UD(...) DOTP_UW2(v2u64, __VA_ARGS__) /* Description : Dot product & addition of halfword vector elements * Arguments : Inputs - mult0, mult1, cnst0, cnst1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Signed halfword elements from 'mult0' are multiplied with * signed halfword elements from 'cnst0' producing a result * twice the size of input i.e. signed word. * The multiplication result of adjacent odd-even elements * are added to the 'out0' vector */ #define DPADD_SH2(RTYPE, mult0, mult1, cnst0, cnst1, out0, out1) do { \ out0 = (RTYPE)__msa_dpadd_s_w((v4i32)out0, (v8i16)mult0, (v8i16)cnst0); \ out1 = (RTYPE)__msa_dpadd_s_w((v4i32)out1, (v8i16)mult1, (v8i16)cnst1); \ } while (0) #define DPADD_SH2_SW(...) DPADD_SH2(v4i32, __VA_ARGS__) /* Description : Clips all signed halfword elements of input vector * between 0 & 255 * Arguments : Input/output - val * Return Type - signed halfword */ #define CLIP_SH_0_255(val) do { \ const v8i16 max_m = __msa_ldi_h(255); \ val = __msa_maxi_s_h((v8i16)val, 0); \ val = __msa_min_s_h(max_m, (v8i16)val); \ } while (0) #define CLIP_SH2_0_255(in0, in1) do { \ CLIP_SH_0_255(in0); \ CLIP_SH_0_255(in1); \ } while (0) #define CLIP_SH4_0_255(in0, in1, in2, in3) do { \ CLIP_SH2_0_255(in0, in1); \ CLIP_SH2_0_255(in2, in3); \ } while (0) /* Description : Clips all unsigned halfword elements of input vector * between 0 & 255 * Arguments : Input - in * Output - out_m * Return Type - unsigned halfword */ #define CLIP_UH_0_255(in) do { \ const v8u16 max_m = (v8u16)__msa_ldi_h(255); \ in = __msa_maxi_u_h((v8u16) in, 0); \ in = __msa_min_u_h((v8u16) max_m, (v8u16) in); \ } while (0) #define CLIP_UH2_0_255(in0, in1) do { \ CLIP_UH_0_255(in0); \ CLIP_UH_0_255(in1); \ } while (0) /* Description : Clips all signed word elements of input vector * between 0 & 255 * Arguments : Input/output - val * Return Type - signed word */ #define CLIP_SW_0_255(val) do { \ const v4i32 max_m = __msa_ldi_w(255); \ val = __msa_maxi_s_w((v4i32)val, 0); \ val = __msa_min_s_w(max_m, (v4i32)val); \ } while (0) #define CLIP_SW4_0_255(in0, in1, in2, in3) do { \ CLIP_SW_0_255(in0); \ CLIP_SW_0_255(in1); \ CLIP_SW_0_255(in2); \ CLIP_SW_0_255(in3); \ } while (0) /* Description : Horizontal addition of 4 signed word elements of input vector * Arguments : Input - in (signed word vector) * Output - sum_m (i32 sum) * Return Type - signed word (GP) * Details : 4 signed word elements of 'in' vector are added together and * the resulting integer sum is returned */ static WEBP_INLINE int32_t func_hadd_sw_s32(v4i32 in) { const v2i64 res0_m = __msa_hadd_s_d((v4i32)in, (v4i32)in); const v2i64 res1_m = __msa_splati_d(res0_m, 1); const v2i64 out = res0_m + res1_m; int32_t sum_m = __msa_copy_s_w((v4i32)out, 0); return sum_m; } #define HADD_SW_S32(in) func_hadd_sw_s32(in) /* Description : Horizontal addition of 8 signed halfword elements * Arguments : Input - in (signed halfword vector) * Output - sum_m (s32 sum) * Return Type - signed word * Details : 8 signed halfword elements of input vector are added * together and the resulting integer sum is returned */ static WEBP_INLINE int32_t func_hadd_sh_s32(v8i16 in) { const v4i32 res = __msa_hadd_s_w(in, in); const v2i64 res0 = __msa_hadd_s_d(res, res); const v2i64 res1 = __msa_splati_d(res0, 1); const v2i64 res2 = res0 + res1; const int32_t sum_m = __msa_copy_s_w((v4i32)res2, 0); return sum_m; } #define HADD_SH_S32(in) func_hadd_sh_s32(in) /* Description : Horizontal addition of 8 unsigned halfword elements * Arguments : Input - in (unsigned halfword vector) * Output - sum_m (u32 sum) * Return Type - unsigned word * Details : 8 unsigned halfword elements of input vector are added * together and the resulting integer sum is returned */ static WEBP_INLINE uint32_t func_hadd_uh_u32(v8u16 in) { uint32_t sum_m; const v4u32 res_m = __msa_hadd_u_w(in, in); v2u64 res0_m = __msa_hadd_u_d(res_m, res_m); v2u64 res1_m = (v2u64)__msa_splati_d((v2i64)res0_m, 1); res0_m = res0_m + res1_m; sum_m = __msa_copy_s_w((v4i32)res0_m, 0); return sum_m; } #define HADD_UH_U32(in) func_hadd_uh_u32(in) /* Description : Horizontal addition of signed half word vector elements Arguments : Inputs - in0, in1 Outputs - out0, out1 Return Type - as per RTYPE Details : Each signed odd half word element from 'in0' is added to even signed half word element from 'in0' (pairwise) and the halfword result is written in 'out0' */ #define HADD_SH2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_hadd_s_w((v8i16)in0, (v8i16)in0); \ out1 = (RTYPE)__msa_hadd_s_w((v8i16)in1, (v8i16)in1); \ } while (0) #define HADD_SH2_SW(...) HADD_SH2(v4i32, __VA_ARGS__) #define HADD_SH4(RTYPE, in0, in1, in2, in3, out0, out1, out2, out3) do { \ HADD_SH2(RTYPE, in0, in1, out0, out1); \ HADD_SH2(RTYPE, in2, in3, out2, out3); \ } while (0) #define HADD_SH4_SW(...) HADD_SH4(v4i32, __VA_ARGS__) /* Description : Horizontal subtraction of unsigned byte vector elements * Arguments : Inputs - in0, in1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Each unsigned odd byte element from 'in0' is subtracted from * even unsigned byte element from 'in0' (pairwise) and the * halfword result is written to 'out0' */ #define HSUB_UB2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_hsub_u_h((v16u8)in0, (v16u8)in0); \ out1 = (RTYPE)__msa_hsub_u_h((v16u8)in1, (v16u8)in1); \ } while (0) #define HSUB_UB2_UH(...) HSUB_UB2(v8u16, __VA_ARGS__) #define HSUB_UB2_SH(...) HSUB_UB2(v8i16, __VA_ARGS__) #define HSUB_UB2_SW(...) HSUB_UB2(v4i32, __VA_ARGS__) /* Description : Set element n input vector to GPR value * Arguments : Inputs - in0, in1, in2, in3 * Output - out * Return Type - as per RTYPE * Details : Set element 0 in vector 'out' to value specified in 'in0' */ #define INSERT_W2(RTYPE, in0, in1, out) do { \ out = (RTYPE)__msa_insert_w((v4i32)out, 0, in0); \ out = (RTYPE)__msa_insert_w((v4i32)out, 1, in1); \ } while (0) #define INSERT_W2_UB(...) INSERT_W2(v16u8, __VA_ARGS__) #define INSERT_W2_SB(...) INSERT_W2(v16i8, __VA_ARGS__) #define INSERT_W4(RTYPE, in0, in1, in2, in3, out) do { \ out = (RTYPE)__msa_insert_w((v4i32)out, 0, in0); \ out = (RTYPE)__msa_insert_w((v4i32)out, 1, in1); \ out = (RTYPE)__msa_insert_w((v4i32)out, 2, in2); \ out = (RTYPE)__msa_insert_w((v4i32)out, 3, in3); \ } while (0) #define INSERT_W4_UB(...) INSERT_W4(v16u8, __VA_ARGS__) #define INSERT_W4_SB(...) INSERT_W4(v16i8, __VA_ARGS__) #define INSERT_W4_SW(...) INSERT_W4(v4i32, __VA_ARGS__) /* Description : Set element n of double word input vector to GPR value * Arguments : Inputs - in0, in1 * Output - out * Return Type - as per RTYPE * Details : Set element 0 in vector 'out' to GPR value specified in 'in0' * Set element 1 in vector 'out' to GPR value specified in 'in1' */ #define INSERT_D2(RTYPE, in0, in1, out) do { \ out = (RTYPE)__msa_insert_d((v2i64)out, 0, in0); \ out = (RTYPE)__msa_insert_d((v2i64)out, 1, in1); \ } while (0) #define INSERT_D2_UB(...) INSERT_D2(v16u8, __VA_ARGS__) #define INSERT_D2_SB(...) INSERT_D2(v16i8, __VA_ARGS__) /* Description : Interleave even byte elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even byte elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVEV_B2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_b((v16i8)in1, (v16i8)in0); \ out1 = (RTYPE)__msa_ilvev_b((v16i8)in3, (v16i8)in2); \ } while (0) #define ILVEV_B2_UB(...) ILVEV_B2(v16u8, __VA_ARGS__) #define ILVEV_B2_SB(...) ILVEV_B2(v16i8, __VA_ARGS__) #define ILVEV_B2_UH(...) ILVEV_B2(v8u16, __VA_ARGS__) #define ILVEV_B2_SH(...) ILVEV_B2(v8i16, __VA_ARGS__) #define ILVEV_B2_SD(...) ILVEV_B2(v2i64, __VA_ARGS__) /* Description : Interleave odd byte elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Odd byte elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVOD_B2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvod_b((v16i8)in1, (v16i8)in0); \ out1 = (RTYPE)__msa_ilvod_b((v16i8)in3, (v16i8)in2); \ } while (0) #define ILVOD_B2_UB(...) ILVOD_B2(v16u8, __VA_ARGS__) #define ILVOD_B2_SB(...) ILVOD_B2(v16i8, __VA_ARGS__) #define ILVOD_B2_UH(...) ILVOD_B2(v8u16, __VA_ARGS__) #define ILVOD_B2_SH(...) ILVOD_B2(v8i16, __VA_ARGS__) #define ILVOD_B2_SD(...) ILVOD_B2(v2i64, __VA_ARGS__) /* Description : Interleave even halfword elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even halfword elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVEV_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_h((v8i16)in1, (v8i16)in0); \ out1 = (RTYPE)__msa_ilvev_h((v8i16)in3, (v8i16)in2); \ } while (0) #define ILVEV_H2_UB(...) ILVEV_H2(v16u8, __VA_ARGS__) #define ILVEV_H2_UH(...) ILVEV_H2(v8u16, __VA_ARGS__) #define ILVEV_H2_SH(...) ILVEV_H2(v8i16, __VA_ARGS__) #define ILVEV_H2_SW(...) ILVEV_H2(v4i32, __VA_ARGS__) /* Description : Interleave odd halfword elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Odd halfword elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVOD_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvod_h((v8i16)in1, (v8i16)in0); \ out1 = (RTYPE)__msa_ilvod_h((v8i16)in3, (v8i16)in2); \ } while (0) #define ILVOD_H2_UB(...) ILVOD_H2(v16u8, __VA_ARGS__) #define ILVOD_H2_UH(...) ILVOD_H2(v8u16, __VA_ARGS__) #define ILVOD_H2_SH(...) ILVOD_H2(v8i16, __VA_ARGS__) #define ILVOD_H2_SW(...) ILVOD_H2(v4i32, __VA_ARGS__) /* Description : Interleave even word elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even word elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVEV_W2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_w((v4i32)in1, (v4i32)in0); \ out1 = (RTYPE)__msa_ilvev_w((v4i32)in3, (v4i32)in2); \ } while (0) #define ILVEV_W2_UB(...) ILVEV_W2(v16u8, __VA_ARGS__) #define ILVEV_W2_SB(...) ILVEV_W2(v16i8, __VA_ARGS__) #define ILVEV_W2_UH(...) ILVEV_W2(v8u16, __VA_ARGS__) #define ILVEV_W2_SD(...) ILVEV_W2(v2i64, __VA_ARGS__) /* Description : Interleave even-odd word elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even word elements of 'in0' and 'in1' are interleaved * and written to 'out0' * Odd word elements of 'in2' and 'in3' are interleaved * and written to 'out1' */ #define ILVEVOD_W2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_w((v4i32)in1, (v4i32)in0); \ out1 = (RTYPE)__msa_ilvod_w((v4i32)in3, (v4i32)in2); \ } while (0) #define ILVEVOD_W2_UB(...) ILVEVOD_W2(v16u8, __VA_ARGS__) #define ILVEVOD_W2_UH(...) ILVEVOD_W2(v8u16, __VA_ARGS__) #define ILVEVOD_W2_SH(...) ILVEVOD_W2(v8i16, __VA_ARGS__) #define ILVEVOD_W2_SW(...) ILVEVOD_W2(v4i32, __VA_ARGS__) /* Description : Interleave even-odd half-word elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even half-word elements of 'in0' and 'in1' are interleaved * and written to 'out0' * Odd half-word elements of 'in2' and 'in3' are interleaved * and written to 'out1' */ #define ILVEVOD_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_h((v8i16)in1, (v8i16)in0); \ out1 = (RTYPE)__msa_ilvod_h((v8i16)in3, (v8i16)in2); \ } while (0) #define ILVEVOD_H2_UB(...) ILVEVOD_H2(v16u8, __VA_ARGS__) #define ILVEVOD_H2_UH(...) ILVEVOD_H2(v8u16, __VA_ARGS__) #define ILVEVOD_H2_SH(...) ILVEVOD_H2(v8i16, __VA_ARGS__) #define ILVEVOD_H2_SW(...) ILVEVOD_H2(v4i32, __VA_ARGS__) /* Description : Interleave even double word elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even double word elements of 'in0' and 'in1' are interleaved * and written to 'out0' */ #define ILVEV_D2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvev_d((v2i64)in1, (v2i64)in0); \ out1 = (RTYPE)__msa_ilvev_d((v2i64)in3, (v2i64)in2); \ } while (0) #define ILVEV_D2_UB(...) ILVEV_D2(v16u8, __VA_ARGS__) #define ILVEV_D2_SB(...) ILVEV_D2(v16i8, __VA_ARGS__) #define ILVEV_D2_SW(...) ILVEV_D2(v4i32, __VA_ARGS__) #define ILVEV_D2_SD(...) ILVEV_D2(v2i64, __VA_ARGS__) /* Description : Interleave left half of byte elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Left half of byte elements of 'in0' and 'in1' are interleaved * and written to 'out0'. */ #define ILVL_B2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvl_b((v16i8)in0, (v16i8)in1); \ out1 = (RTYPE)__msa_ilvl_b((v16i8)in2, (v16i8)in3); \ } while (0) #define ILVL_B2_UB(...) ILVL_B2(v16u8, __VA_ARGS__) #define ILVL_B2_SB(...) ILVL_B2(v16i8, __VA_ARGS__) #define ILVL_B2_UH(...) ILVL_B2(v8u16, __VA_ARGS__) #define ILVL_B2_SH(...) ILVL_B2(v8i16, __VA_ARGS__) #define ILVL_B2_SW(...) ILVL_B2(v4i32, __VA_ARGS__) /* Description : Interleave right half of byte elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Right half of byte elements of 'in0' and 'in1' are interleaved * and written to out0. */ #define ILVR_B2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_b((v16i8)in0, (v16i8)in1); \ out1 = (RTYPE)__msa_ilvr_b((v16i8)in2, (v16i8)in3); \ } while (0) #define ILVR_B2_UB(...) ILVR_B2(v16u8, __VA_ARGS__) #define ILVR_B2_SB(...) ILVR_B2(v16i8, __VA_ARGS__) #define ILVR_B2_UH(...) ILVR_B2(v8u16, __VA_ARGS__) #define ILVR_B2_SH(...) ILVR_B2(v8i16, __VA_ARGS__) #define ILVR_B2_SW(...) ILVR_B2(v4i32, __VA_ARGS__) #define ILVR_B4(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ ILVR_B2(RTYPE, in0, in1, in2, in3, out0, out1); \ ILVR_B2(RTYPE, in4, in5, in6, in7, out2, out3); \ } while (0) #define ILVR_B4_UB(...) ILVR_B4(v16u8, __VA_ARGS__) #define ILVR_B4_SB(...) ILVR_B4(v16i8, __VA_ARGS__) #define ILVR_B4_UH(...) ILVR_B4(v8u16, __VA_ARGS__) #define ILVR_B4_SH(...) ILVR_B4(v8i16, __VA_ARGS__) #define ILVR_B4_SW(...) ILVR_B4(v4i32, __VA_ARGS__) /* Description : Interleave right half of halfword elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Right half of halfword elements of 'in0' and 'in1' are * interleaved and written to 'out0'. */ #define ILVR_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_h((v8i16)in0, (v8i16)in1); \ out1 = (RTYPE)__msa_ilvr_h((v8i16)in2, (v8i16)in3); \ } while (0) #define ILVR_H2_UB(...) ILVR_H2(v16u8, __VA_ARGS__) #define ILVR_H2_SH(...) ILVR_H2(v8i16, __VA_ARGS__) #define ILVR_H2_SW(...) ILVR_H2(v4i32, __VA_ARGS__) #define ILVR_H4(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ ILVR_H2(RTYPE, in0, in1, in2, in3, out0, out1); \ ILVR_H2(RTYPE, in4, in5, in6, in7, out2, out3); \ } while (0) #define ILVR_H4_UB(...) ILVR_H4(v16u8, __VA_ARGS__) #define ILVR_H4_SH(...) ILVR_H4(v8i16, __VA_ARGS__) #define ILVR_H4_SW(...) ILVR_H4(v4i32, __VA_ARGS__) /* Description : Interleave right half of double word elements from vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Right half of double word elements of 'in0' and 'in1' are * interleaved and written to 'out0'. */ #define ILVR_D2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_d((v2i64)in0, (v2i64)in1); \ out1 = (RTYPE)__msa_ilvr_d((v2i64)in2, (v2i64)in3); \ } while (0) #define ILVR_D2_UB(...) ILVR_D2(v16u8, __VA_ARGS__) #define ILVR_D2_SB(...) ILVR_D2(v16i8, __VA_ARGS__) #define ILVR_D2_SH(...) ILVR_D2(v8i16, __VA_ARGS__) #define ILVR_D4(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ ILVR_D2(RTYPE, in0, in1, in2, in3, out0, out1); \ ILVR_D2(RTYPE, in4, in5, in6, in7, out2, out3); \ } while (0) #define ILVR_D4_SB(...) ILVR_D4(v16i8, __VA_ARGS__) #define ILVR_D4_UB(...) ILVR_D4(v16u8, __VA_ARGS__) /* Description : Interleave both left and right half of input vectors * Arguments : Inputs - in0, in1 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Right half of byte elements from 'in0' and 'in1' are * interleaved and written to 'out0' */ #define ILVRL_B2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_b((v16i8)in0, (v16i8)in1); \ out1 = (RTYPE)__msa_ilvl_b((v16i8)in0, (v16i8)in1); \ } while (0) #define ILVRL_B2_UB(...) ILVRL_B2(v16u8, __VA_ARGS__) #define ILVRL_B2_SB(...) ILVRL_B2(v16i8, __VA_ARGS__) #define ILVRL_B2_UH(...) ILVRL_B2(v8u16, __VA_ARGS__) #define ILVRL_B2_SH(...) ILVRL_B2(v8i16, __VA_ARGS__) #define ILVRL_B2_SW(...) ILVRL_B2(v4i32, __VA_ARGS__) #define ILVRL_H2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_h((v8i16)in0, (v8i16)in1); \ out1 = (RTYPE)__msa_ilvl_h((v8i16)in0, (v8i16)in1); \ } while (0) #define ILVRL_H2_UB(...) ILVRL_H2(v16u8, __VA_ARGS__) #define ILVRL_H2_SB(...) ILVRL_H2(v16i8, __VA_ARGS__) #define ILVRL_H2_SH(...) ILVRL_H2(v8i16, __VA_ARGS__) #define ILVRL_H2_SW(...) ILVRL_H2(v4i32, __VA_ARGS__) #define ILVRL_H2_UW(...) ILVRL_H2(v4u32, __VA_ARGS__) #define ILVRL_W2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_ilvr_w((v4i32)in0, (v4i32)in1); \ out1 = (RTYPE)__msa_ilvl_w((v4i32)in0, (v4i32)in1); \ } while (0) #define ILVRL_W2_UB(...) ILVRL_W2(v16u8, __VA_ARGS__) #define ILVRL_W2_SH(...) ILVRL_W2(v8i16, __VA_ARGS__) #define ILVRL_W2_SW(...) ILVRL_W2(v4i32, __VA_ARGS__) #define ILVRL_W2_UW(...) ILVRL_W2(v4u32, __VA_ARGS__) /* Description : Pack even byte elements of vector pairs * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even byte elements of 'in0' are copied to the left half of * 'out0' & even byte elements of 'in1' are copied to the right * half of 'out0'. */ #define PCKEV_B2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_pckev_b((v16i8)in0, (v16i8)in1); \ out1 = (RTYPE)__msa_pckev_b((v16i8)in2, (v16i8)in3); \ } while (0) #define PCKEV_B2_SB(...) PCKEV_B2(v16i8, __VA_ARGS__) #define PCKEV_B2_UB(...) PCKEV_B2(v16u8, __VA_ARGS__) #define PCKEV_B2_SH(...) PCKEV_B2(v8i16, __VA_ARGS__) #define PCKEV_B2_SW(...) PCKEV_B2(v4i32, __VA_ARGS__) #define PCKEV_B4(RTYPE, in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ PCKEV_B2(RTYPE, in0, in1, in2, in3, out0, out1); \ PCKEV_B2(RTYPE, in4, in5, in6, in7, out2, out3); \ } while (0) #define PCKEV_B4_SB(...) PCKEV_B4(v16i8, __VA_ARGS__) #define PCKEV_B4_UB(...) PCKEV_B4(v16u8, __VA_ARGS__) #define PCKEV_B4_SH(...) PCKEV_B4(v8i16, __VA_ARGS__) #define PCKEV_B4_SW(...) PCKEV_B4(v4i32, __VA_ARGS__) /* Description : Pack even halfword elements of vector pairs * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even halfword elements of 'in0' are copied to the left half of * 'out0' & even halfword elements of 'in1' are copied to the * right half of 'out0'. */ #define PCKEV_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_pckev_h((v8i16)in0, (v8i16)in1); \ out1 = (RTYPE)__msa_pckev_h((v8i16)in2, (v8i16)in3); \ } while (0) #define PCKEV_H2_UH(...) PCKEV_H2(v8u16, __VA_ARGS__) #define PCKEV_H2_SH(...) PCKEV_H2(v8i16, __VA_ARGS__) #define PCKEV_H2_SW(...) PCKEV_H2(v4i32, __VA_ARGS__) #define PCKEV_H2_UW(...) PCKEV_H2(v4u32, __VA_ARGS__) /* Description : Pack even word elements of vector pairs * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Even word elements of 'in0' are copied to the left half of * 'out0' & even word elements of 'in1' are copied to the * right half of 'out0'. */ #define PCKEV_W2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_pckev_w((v4i32)in0, (v4i32)in1); \ out1 = (RTYPE)__msa_pckev_w((v4i32)in2, (v4i32)in3); \ } while (0) #define PCKEV_W2_UH(...) PCKEV_W2(v8u16, __VA_ARGS__) #define PCKEV_W2_SH(...) PCKEV_W2(v8i16, __VA_ARGS__) #define PCKEV_W2_SW(...) PCKEV_W2(v4i32, __VA_ARGS__) #define PCKEV_W2_UW(...) PCKEV_W2(v4u32, __VA_ARGS__) /* Description : Pack odd halfword elements of vector pairs * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Odd halfword elements of 'in0' are copied to the left half of * 'out0' & odd halfword elements of 'in1' are copied to the * right half of 'out0'. */ #define PCKOD_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_pckod_h((v8i16)in0, (v8i16)in1); \ out1 = (RTYPE)__msa_pckod_h((v8i16)in2, (v8i16)in3); \ } while (0) #define PCKOD_H2_UH(...) PCKOD_H2(v8u16, __VA_ARGS__) #define PCKOD_H2_SH(...) PCKOD_H2(v8i16, __VA_ARGS__) #define PCKOD_H2_SW(...) PCKOD_H2(v4i32, __VA_ARGS__) #define PCKOD_H2_UW(...) PCKOD_H2(v4u32, __VA_ARGS__) /* Description : Arithmetic immediate shift right all elements of word vector * Arguments : Inputs - in0, in1, shift * Outputs - in place operation * Return Type - as per input vector RTYPE * Details : Each element of vector 'in0' is right shifted by 'shift' and * the result is written in-place. 'shift' is a GP variable. */ #define SRAI_W2(RTYPE, in0, in1, shift_val) do { \ in0 = (RTYPE)SRAI_W(in0, shift_val); \ in1 = (RTYPE)SRAI_W(in1, shift_val); \ } while (0) #define SRAI_W2_SW(...) SRAI_W2(v4i32, __VA_ARGS__) #define SRAI_W2_UW(...) SRAI_W2(v4u32, __VA_ARGS__) #define SRAI_W4(RTYPE, in0, in1, in2, in3, shift_val) do { \ SRAI_W2(RTYPE, in0, in1, shift_val); \ SRAI_W2(RTYPE, in2, in3, shift_val); \ } while (0) #define SRAI_W4_SW(...) SRAI_W4(v4i32, __VA_ARGS__) #define SRAI_W4_UW(...) SRAI_W4(v4u32, __VA_ARGS__) /* Description : Arithmetic shift right all elements of half-word vector * Arguments : Inputs - in0, in1, shift * Outputs - in place operation * Return Type - as per input vector RTYPE * Details : Each element of vector 'in0' is right shifted by 'shift' and * the result is written in-place. 'shift' is a GP variable. */ #define SRAI_H2(RTYPE, in0, in1, shift_val) do { \ in0 = (RTYPE)SRAI_H(in0, shift_val); \ in1 = (RTYPE)SRAI_H(in1, shift_val); \ } while (0) #define SRAI_H2_SH(...) SRAI_H2(v8i16, __VA_ARGS__) #define SRAI_H2_UH(...) SRAI_H2(v8u16, __VA_ARGS__) /* Description : Arithmetic rounded shift right all elements of word vector * Arguments : Inputs - in0, in1, shift * Outputs - in place operation * Return Type - as per input vector RTYPE * Details : Each element of vector 'in0' is right shifted by 'shift' and * the result is written in-place. 'shift' is a GP variable. */ #define SRARI_W2(RTYPE, in0, in1, shift) do { \ in0 = (RTYPE)__msa_srari_w((v4i32)in0, shift); \ in1 = (RTYPE)__msa_srari_w((v4i32)in1, shift); \ } while (0) #define SRARI_W2_SW(...) SRARI_W2(v4i32, __VA_ARGS__) #define SRARI_W4(RTYPE, in0, in1, in2, in3, shift) do { \ SRARI_W2(RTYPE, in0, in1, shift); \ SRARI_W2(RTYPE, in2, in3, shift); \ } while (0) #define SRARI_W4_SH(...) SRARI_W4(v8i16, __VA_ARGS__) #define SRARI_W4_UW(...) SRARI_W4(v4u32, __VA_ARGS__) #define SRARI_W4_SW(...) SRARI_W4(v4i32, __VA_ARGS__) /* Description : Shift right arithmetic rounded double words * Arguments : Inputs - in0, in1, shift * Outputs - in place operation * Return Type - as per RTYPE * Details : Each element of vector 'in0' is shifted right arithmetically by * the number of bits in the corresponding element in the vector * 'shift'. The last discarded bit is added to shifted value for * rounding and the result is written in-place. * 'shift' is a vector. */ #define SRAR_D2(RTYPE, in0, in1, shift) do { \ in0 = (RTYPE)__msa_srar_d((v2i64)in0, (v2i64)shift); \ in1 = (RTYPE)__msa_srar_d((v2i64)in1, (v2i64)shift); \ } while (0) #define SRAR_D2_SW(...) SRAR_D2(v4i32, __VA_ARGS__) #define SRAR_D2_SD(...) SRAR_D2(v2i64, __VA_ARGS__) #define SRAR_D2_UD(...) SRAR_D2(v2u64, __VA_ARGS__) #define SRAR_D4(RTYPE, in0, in1, in2, in3, shift) do { \ SRAR_D2(RTYPE, in0, in1, shift); \ SRAR_D2(RTYPE, in2, in3, shift); \ } while (0) #define SRAR_D4_SD(...) SRAR_D4(v2i64, __VA_ARGS__) #define SRAR_D4_UD(...) SRAR_D4(v2u64, __VA_ARGS__) /* Description : Addition of 2 pairs of half-word vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Details : Each element in 'in0' is added to 'in1' and result is written * to 'out0'. */ #define ADDVI_H2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)ADDVI_H(in0, in1); \ out1 = (RTYPE)ADDVI_H(in2, in3); \ } while (0) #define ADDVI_H2_SH(...) ADDVI_H2(v8i16, __VA_ARGS__) #define ADDVI_H2_UH(...) ADDVI_H2(v8u16, __VA_ARGS__) /* Description : Addition of 2 pairs of word vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Details : Each element in 'in0' is added to 'in1' and result is written * to 'out0'. */ #define ADDVI_W2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)ADDVI_W(in0, in1); \ out1 = (RTYPE)ADDVI_W(in2, in3); \ } while (0) #define ADDVI_W2_SW(...) ADDVI_W2(v4i32, __VA_ARGS__) /* Description : Fill 2 pairs of word vectors with GP registers * Arguments : Inputs - in0, in1 * Outputs - out0, out1 * Details : GP register in0 is replicated in each word element of out0 * GP register in1 is replicated in each word element of out1 */ #define FILL_W2(RTYPE, in0, in1, out0, out1) do { \ out0 = (RTYPE)__msa_fill_w(in0); \ out1 = (RTYPE)__msa_fill_w(in1); \ } while (0) #define FILL_W2_SW(...) FILL_W2(v4i32, __VA_ARGS__) /* Description : Addition of 2 pairs of vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Details : Each element in 'in0' is added to 'in1' and result is written * to 'out0'. */ #define ADD2(in0, in1, in2, in3, out0, out1) do { \ out0 = in0 + in1; \ out1 = in2 + in3; \ } while (0) #define ADD4(in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ ADD2(in0, in1, in2, in3, out0, out1); \ ADD2(in4, in5, in6, in7, out2, out3); \ } while (0) /* Description : Subtraction of 2 pairs of vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Details : Each element in 'in1' is subtracted from 'in0' and result is * written to 'out0'. */ #define SUB2(in0, in1, in2, in3, out0, out1) do { \ out0 = in0 - in1; \ out1 = in2 - in3; \ } while (0) #define SUB3(in0, in1, in2, in3, in4, in5, out0, out1, out2) do { \ out0 = in0 - in1; \ out1 = in2 - in3; \ out2 = in4 - in5; \ } while (0) #define SUB4(in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ out0 = in0 - in1; \ out1 = in2 - in3; \ out2 = in4 - in5; \ out3 = in6 - in7; \ } while (0) /* Description : Addition - Subtraction of input vectors * Arguments : Inputs - in0, in1 * Outputs - out0, out1 * Details : Each element in 'in1' is added to 'in0' and result is * written to 'out0'. * Each element in 'in1' is subtracted from 'in0' and result is * written to 'out1'. */ #define ADDSUB2(in0, in1, out0, out1) do { \ out0 = in0 + in1; \ out1 = in0 - in1; \ } while (0) /* Description : Multiplication of pairs of vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1 * Details : Each element from 'in0' is multiplied with elements from 'in1' * and the result is written to 'out0' */ #define MUL2(in0, in1, in2, in3, out0, out1) do { \ out0 = in0 * in1; \ out1 = in2 * in3; \ } while (0) #define MUL4(in0, in1, in2, in3, in4, in5, in6, in7, \ out0, out1, out2, out3) do { \ MUL2(in0, in1, in2, in3, out0, out1); \ MUL2(in4, in5, in6, in7, out2, out3); \ } while (0) /* Description : Sign extend halfword elements from right half of the vector * Arguments : Input - in (halfword vector) * Output - out (sign extended word vector) * Return Type - signed word * Details : Sign bit of halfword elements from input vector 'in' is * extracted and interleaved with same vector 'in0' to generate * 4 word elements keeping sign intact */ #define UNPCK_R_SH_SW(in, out) do { \ const v8i16 sign_m = __msa_clti_s_h((v8i16)in, 0); \ out = (v4i32)__msa_ilvr_h(sign_m, (v8i16)in); \ } while (0) /* Description : Sign extend halfword elements from input vector and return * the result in pair of vectors * Arguments : Input - in (halfword vector) * Outputs - out0, out1 (sign extended word vectors) * Return Type - signed word * Details : Sign bit of halfword elements from input vector 'in' is * extracted and interleaved right with same vector 'in0' to * generate 4 signed word elements in 'out0' * Then interleaved left with same vector 'in0' to * generate 4 signed word elements in 'out1' */ #define UNPCK_SH_SW(in, out0, out1) do { \ const v8i16 tmp_m = __msa_clti_s_h((v8i16)in, 0); \ ILVRL_H2_SW(tmp_m, in, out0, out1); \ } while (0) /* Description : Butterfly of 4 input vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1, out2, out3 * Details : Butterfly operation */ #define BUTTERFLY_4(in0, in1, in2, in3, out0, out1, out2, out3) do { \ out0 = in0 + in3; \ out1 = in1 + in2; \ out2 = in1 - in2; \ out3 = in0 - in3; \ } while (0) /* Description : Transpose 16x4 block into 4x16 with byte elements in vectors * Arguments : Inputs - in0, in1, in2, in3, in4, in5, in6, in7, * in8, in9, in10, in11, in12, in13, in14, in15 * Outputs - out0, out1, out2, out3 * Return Type - unsigned byte */ #define TRANSPOSE16x4_UB_UB(in0, in1, in2, in3, in4, in5, in6, in7, \ in8, in9, in10, in11, in12, in13, in14, in15, \ out0, out1, out2, out3) do { \ v2i64 tmp0_m, tmp1_m, tmp2_m, tmp3_m, tmp4_m, tmp5_m; \ ILVEV_W2_SD(in0, in4, in8, in12, tmp2_m, tmp3_m); \ ILVEV_W2_SD(in1, in5, in9, in13, tmp0_m, tmp1_m); \ ILVEV_D2_UB(tmp2_m, tmp3_m, tmp0_m, tmp1_m, out1, out3); \ ILVEV_W2_SD(in2, in6, in10, in14, tmp4_m, tmp5_m); \ ILVEV_W2_SD(in3, in7, in11, in15, tmp0_m, tmp1_m); \ ILVEV_D2_SD(tmp4_m, tmp5_m, tmp0_m, tmp1_m, tmp2_m, tmp3_m); \ ILVEV_B2_SD(out1, out3, tmp2_m, tmp3_m, tmp0_m, tmp1_m); \ ILVEVOD_H2_UB(tmp0_m, tmp1_m, tmp0_m, tmp1_m, out0, out2); \ ILVOD_B2_SD(out1, out3, tmp2_m, tmp3_m, tmp0_m, tmp1_m); \ ILVEVOD_H2_UB(tmp0_m, tmp1_m, tmp0_m, tmp1_m, out1, out3); \ } while (0) /* Description : Transpose 16x8 block into 8x16 with byte elements in vectors * Arguments : Inputs - in0, in1, in2, in3, in4, in5, in6, in7, * in8, in9, in10, in11, in12, in13, in14, in15 * Outputs - out0, out1, out2, out3, out4, out5, out6, out7 * Return Type - unsigned byte */ #define TRANSPOSE16x8_UB_UB(in0, in1, in2, in3, in4, in5, in6, in7, \ in8, in9, in10, in11, in12, in13, in14, in15, \ out0, out1, out2, out3, out4, out5, \ out6, out7) do { \ v8i16 tmp0_m, tmp1_m, tmp4_m, tmp5_m, tmp6_m, tmp7_m; \ v4i32 tmp2_m, tmp3_m; \ ILVEV_D2_UB(in0, in8, in1, in9, out7, out6); \ ILVEV_D2_UB(in2, in10, in3, in11, out5, out4); \ ILVEV_D2_UB(in4, in12, in5, in13, out3, out2); \ ILVEV_D2_UB(in6, in14, in7, in15, out1, out0); \ ILVEV_B2_SH(out7, out6, out5, out4, tmp0_m, tmp1_m); \ ILVOD_B2_SH(out7, out6, out5, out4, tmp4_m, tmp5_m); \ ILVEV_B2_UB(out3, out2, out1, out0, out5, out7); \ ILVOD_B2_SH(out3, out2, out1, out0, tmp6_m, tmp7_m); \ ILVEV_H2_SW(tmp0_m, tmp1_m, out5, out7, tmp2_m, tmp3_m); \ ILVEVOD_W2_UB(tmp2_m, tmp3_m, tmp2_m, tmp3_m, out0, out4); \ ILVOD_H2_SW(tmp0_m, tmp1_m, out5, out7, tmp2_m, tmp3_m); \ ILVEVOD_W2_UB(tmp2_m, tmp3_m, tmp2_m, tmp3_m, out2, out6); \ ILVEV_H2_SW(tmp4_m, tmp5_m, tmp6_m, tmp7_m, tmp2_m, tmp3_m); \ ILVEVOD_W2_UB(tmp2_m, tmp3_m, tmp2_m, tmp3_m, out1, out5); \ ILVOD_H2_SW(tmp4_m, tmp5_m, tmp6_m, tmp7_m, tmp2_m, tmp3_m); \ ILVEVOD_W2_UB(tmp2_m, tmp3_m, tmp2_m, tmp3_m, out3, out7); \ } while (0) /* Description : Transpose 4x4 block with word elements in vectors * Arguments : Inputs - in0, in1, in2, in3 * Outputs - out0, out1, out2, out3 * Return Type - as per RTYPE */ #define TRANSPOSE4x4_W(RTYPE, in0, in1, in2, in3, \ out0, out1, out2, out3) do { \ v4i32 s0_m, s1_m, s2_m, s3_m; \ ILVRL_W2_SW(in1, in0, s0_m, s1_m); \ ILVRL_W2_SW(in3, in2, s2_m, s3_m); \ out0 = (RTYPE)__msa_ilvr_d((v2i64)s2_m, (v2i64)s0_m); \ out1 = (RTYPE)__msa_ilvl_d((v2i64)s2_m, (v2i64)s0_m); \ out2 = (RTYPE)__msa_ilvr_d((v2i64)s3_m, (v2i64)s1_m); \ out3 = (RTYPE)__msa_ilvl_d((v2i64)s3_m, (v2i64)s1_m); \ } while (0) #define TRANSPOSE4x4_SW_SW(...) TRANSPOSE4x4_W(v4i32, __VA_ARGS__) /* Description : Add block 4x4 * Arguments : Inputs - in0, in1, in2, in3, pdst, stride * Details : Least significant 4 bytes from each input vector are added to * the destination bytes, clipped between 0-255 and stored. */ #define ADDBLK_ST4x4_UB(in0, in1, in2, in3, pdst, stride) do { \ uint32_t src0_m, src1_m, src2_m, src3_m; \ v8i16 inp0_m, inp1_m, res0_m, res1_m; \ v16i8 dst0_m = { 0 }; \ v16i8 dst1_m = { 0 }; \ const v16i8 zero_m = { 0 }; \ ILVR_D2_SH(in1, in0, in3, in2, inp0_m, inp1_m); \ LW4(pdst, stride, src0_m, src1_m, src2_m, src3_m); \ INSERT_W2_SB(src0_m, src1_m, dst0_m); \ INSERT_W2_SB(src2_m, src3_m, dst1_m); \ ILVR_B2_SH(zero_m, dst0_m, zero_m, dst1_m, res0_m, res1_m); \ ADD2(res0_m, inp0_m, res1_m, inp1_m, res0_m, res1_m); \ CLIP_SH2_0_255(res0_m, res1_m); \ PCKEV_B2_SB(res0_m, res0_m, res1_m, res1_m, dst0_m, dst1_m); \ ST4x4_UB(dst0_m, dst1_m, 0, 1, 0, 1, pdst, stride); \ } while (0) /* Description : Pack even byte elements, extract 0 & 2 index words from pair * of results and store 4 words in destination memory as per * stride * Arguments : Inputs - in0, in1, in2, in3, pdst, stride */ #define PCKEV_ST4x4_UB(in0, in1, in2, in3, pdst, stride) do { \ v16i8 tmp0_m, tmp1_m; \ PCKEV_B2_SB(in1, in0, in3, in2, tmp0_m, tmp1_m); \ ST4x4_UB(tmp0_m, tmp1_m, 0, 2, 0, 2, pdst, stride); \ } while (0) /* Description : average with rounding (in0 + in1 + 1) / 2. * Arguments : Inputs - in0, in1, in2, in3, * Outputs - out0, out1 * Return Type - as per RTYPE * Details : Each unsigned byte element from 'in0' vector is added with * each unsigned byte element from 'in1' vector. Then the average * with rounding is calculated and written to 'out0' */ #define AVER_UB2(RTYPE, in0, in1, in2, in3, out0, out1) do { \ out0 = (RTYPE)__msa_aver_u_b((v16u8)in0, (v16u8)in1); \ out1 = (RTYPE)__msa_aver_u_b((v16u8)in2, (v16u8)in3); \ } while (0) #define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__) #endif // WEBP_USE_MSA #endif // WEBP_DSP_MSA_MACRO_H_ libwebp-1.4.0/src/dsp/lossless_neon.c0000644000014400001440000006337614606317060014501 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON variant of methods for lossless decoder // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include #include "src/dsp/lossless.h" #include "src/dsp/neon.h" //------------------------------------------------------------------------------ // Colorspace conversion functions #if !defined(WORK_AROUND_GCC) // gcc 4.6.0 had some trouble (NDK-r9) with this code. We only use it for // gcc-4.8.x at least. static void ConvertBGRAToRGBA_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~15); for (; src < end; src += 16) { uint8x16x4_t pixel = vld4q_u8((uint8_t*)src); // swap B and R. (VSWP d0,d2 has no intrinsics equivalent!) const uint8x16_t tmp = pixel.val[0]; pixel.val[0] = pixel.val[2]; pixel.val[2] = tmp; vst4q_u8(dst, pixel); dst += 64; } VP8LConvertBGRAToRGBA_C(src, num_pixels & 15, dst); // left-overs } static void ConvertBGRAToBGR_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~15); for (; src < end; src += 16) { const uint8x16x4_t pixel = vld4q_u8((uint8_t*)src); const uint8x16x3_t tmp = { { pixel.val[0], pixel.val[1], pixel.val[2] } }; vst3q_u8(dst, tmp); dst += 48; } VP8LConvertBGRAToBGR_C(src, num_pixels & 15, dst); // left-overs } static void ConvertBGRAToRGB_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~15); for (; src < end; src += 16) { const uint8x16x4_t pixel = vld4q_u8((uint8_t*)src); const uint8x16x3_t tmp = { { pixel.val[2], pixel.val[1], pixel.val[0] } }; vst3q_u8(dst, tmp); dst += 48; } VP8LConvertBGRAToRGB_C(src, num_pixels & 15, dst); // left-overs } #else // WORK_AROUND_GCC // gcc-4.6.0 fallback static const uint8_t kRGBAShuffle[8] = { 2, 1, 0, 3, 6, 5, 4, 7 }; static void ConvertBGRAToRGBA_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~1); const uint8x8_t shuffle = vld1_u8(kRGBAShuffle); for (; src < end; src += 2) { const uint8x8_t pixels = vld1_u8((uint8_t*)src); vst1_u8(dst, vtbl1_u8(pixels, shuffle)); dst += 8; } VP8LConvertBGRAToRGBA_C(src, num_pixels & 1, dst); // left-overs } static const uint8_t kBGRShuffle[3][8] = { { 0, 1, 2, 4, 5, 6, 8, 9 }, { 10, 12, 13, 14, 16, 17, 18, 20 }, { 21, 22, 24, 25, 26, 28, 29, 30 } }; static void ConvertBGRAToBGR_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~7); const uint8x8_t shuffle0 = vld1_u8(kBGRShuffle[0]); const uint8x8_t shuffle1 = vld1_u8(kBGRShuffle[1]); const uint8x8_t shuffle2 = vld1_u8(kBGRShuffle[2]); for (; src < end; src += 8) { uint8x8x4_t pixels; INIT_VECTOR4(pixels, vld1_u8((const uint8_t*)(src + 0)), vld1_u8((const uint8_t*)(src + 2)), vld1_u8((const uint8_t*)(src + 4)), vld1_u8((const uint8_t*)(src + 6))); vst1_u8(dst + 0, vtbl4_u8(pixels, shuffle0)); vst1_u8(dst + 8, vtbl4_u8(pixels, shuffle1)); vst1_u8(dst + 16, vtbl4_u8(pixels, shuffle2)); dst += 8 * 3; } VP8LConvertBGRAToBGR_C(src, num_pixels & 7, dst); // left-overs } static const uint8_t kRGBShuffle[3][8] = { { 2, 1, 0, 6, 5, 4, 10, 9 }, { 8, 14, 13, 12, 18, 17, 16, 22 }, { 21, 20, 26, 25, 24, 30, 29, 28 } }; static void ConvertBGRAToRGB_NEON(const uint32_t* src, int num_pixels, uint8_t* dst) { const uint32_t* const end = src + (num_pixels & ~7); const uint8x8_t shuffle0 = vld1_u8(kRGBShuffle[0]); const uint8x8_t shuffle1 = vld1_u8(kRGBShuffle[1]); const uint8x8_t shuffle2 = vld1_u8(kRGBShuffle[2]); for (; src < end; src += 8) { uint8x8x4_t pixels; INIT_VECTOR4(pixels, vld1_u8((const uint8_t*)(src + 0)), vld1_u8((const uint8_t*)(src + 2)), vld1_u8((const uint8_t*)(src + 4)), vld1_u8((const uint8_t*)(src + 6))); vst1_u8(dst + 0, vtbl4_u8(pixels, shuffle0)); vst1_u8(dst + 8, vtbl4_u8(pixels, shuffle1)); vst1_u8(dst + 16, vtbl4_u8(pixels, shuffle2)); dst += 8 * 3; } VP8LConvertBGRAToRGB_C(src, num_pixels & 7, dst); // left-overs } #endif // !WORK_AROUND_GCC //------------------------------------------------------------------------------ // Predictor Transform #define LOAD_U32_AS_U8(IN) vreinterpret_u8_u32(vdup_n_u32((IN))) #define LOAD_U32P_AS_U8(IN) vreinterpret_u8_u32(vld1_u32((IN))) #define LOADQ_U32_AS_U8(IN) vreinterpretq_u8_u32(vdupq_n_u32((IN))) #define LOADQ_U32P_AS_U8(IN) vreinterpretq_u8_u32(vld1q_u32((IN))) #define GET_U8_AS_U32(IN) vget_lane_u32(vreinterpret_u32_u8((IN)), 0) #define GETQ_U8_AS_U32(IN) vgetq_lane_u32(vreinterpretq_u32_u8((IN)), 0) #define STOREQ_U8_AS_U32P(OUT, IN) vst1q_u32((OUT), vreinterpretq_u32_u8((IN))) #define ROTATE32_LEFT(L) vextq_u8((L), (L), 12) // D|C|B|A -> C|B|A|D static WEBP_INLINE uint8x8_t Average2_u8_NEON(uint32_t a0, uint32_t a1) { const uint8x8_t A0 = LOAD_U32_AS_U8(a0); const uint8x8_t A1 = LOAD_U32_AS_U8(a1); return vhadd_u8(A0, A1); } static WEBP_INLINE uint32_t ClampedAddSubtractHalf_NEON(uint32_t c0, uint32_t c1, uint32_t c2) { const uint8x8_t avg = Average2_u8_NEON(c0, c1); // Remove one to c2 when bigger than avg. const uint8x8_t C2 = LOAD_U32_AS_U8(c2); const uint8x8_t cmp = vcgt_u8(C2, avg); const uint8x8_t C2_1 = vadd_u8(C2, cmp); // Compute half of the difference between avg and c2. const int8x8_t diff_avg = vreinterpret_s8_u8(vhsub_u8(avg, C2_1)); // Compute the sum with avg and saturate. const int16x8_t avg_16 = vreinterpretq_s16_u16(vmovl_u8(avg)); const uint8x8_t res = vqmovun_s16(vaddw_s8(avg_16, diff_avg)); const uint32_t output = GET_U8_AS_U32(res); return output; } static WEBP_INLINE uint32_t Average2_NEON(uint32_t a0, uint32_t a1) { const uint8x8_t avg_u8x8 = Average2_u8_NEON(a0, a1); const uint32_t avg = GET_U8_AS_U32(avg_u8x8); return avg; } static WEBP_INLINE uint32_t Average3_NEON(uint32_t a0, uint32_t a1, uint32_t a2) { const uint8x8_t avg0 = Average2_u8_NEON(a0, a2); const uint8x8_t A1 = LOAD_U32_AS_U8(a1); const uint32_t avg = GET_U8_AS_U32(vhadd_u8(avg0, A1)); return avg; } static uint32_t Predictor5_NEON(const uint32_t* const left, const uint32_t* const top) { return Average3_NEON(*left, top[0], top[1]); } static uint32_t Predictor6_NEON(const uint32_t* const left, const uint32_t* const top) { return Average2_NEON(*left, top[-1]); } static uint32_t Predictor7_NEON(const uint32_t* const left, const uint32_t* const top) { return Average2_NEON(*left, top[0]); } static uint32_t Predictor13_NEON(const uint32_t* const left, const uint32_t* const top) { return ClampedAddSubtractHalf_NEON(*left, top[0], top[-1]); } // Batch versions of those functions. // Predictor0: ARGB_BLACK. static void PredictorAdd0_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const uint8x16_t black = vreinterpretq_u8_u32(vdupq_n_u32(ARGB_BLACK)); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t res = vaddq_u8(src, black); STOREQ_U8_AS_U32P(&out[i], res); } VP8LPredictorsAdd_C[0](in + i, upper + i, num_pixels - i, out + i); } // Predictor1: left. static void PredictorAdd1_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const uint8x16_t zero = LOADQ_U32_AS_U8(0); for (i = 0; i + 4 <= num_pixels; i += 4) { // a | b | c | d const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); // 0 | a | b | c const uint8x16_t shift0 = vextq_u8(zero, src, 12); // a | a + b | b + c | c + d const uint8x16_t sum0 = vaddq_u8(src, shift0); // 0 | 0 | a | a + b const uint8x16_t shift1 = vextq_u8(zero, sum0, 8); // a | a + b | a + b + c | a + b + c + d const uint8x16_t sum1 = vaddq_u8(sum0, shift1); const uint8x16_t prev = LOADQ_U32_AS_U8(out[i - 1]); const uint8x16_t res = vaddq_u8(sum1, prev); STOREQ_U8_AS_U32P(&out[i], res); } VP8LPredictorsAdd_C[1](in + i, upper + i, num_pixels - i, out + i); } // Macro that adds 32-bit integers from IN using mod 256 arithmetic // per 8 bit channel. #define GENERATE_PREDICTOR_1(X, IN) \ static void PredictorAdd##X##_NEON(const uint32_t* in, \ const uint32_t* upper, int num_pixels, \ uint32_t* out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); \ const uint8x16_t other = LOADQ_U32P_AS_U8(&(IN)); \ const uint8x16_t res = vaddq_u8(src, other); \ STOREQ_U8_AS_U32P(&out[i], res); \ } \ VP8LPredictorsAdd_C[(X)](in + i, upper + i, num_pixels - i, out + i); \ } // Predictor2: Top. GENERATE_PREDICTOR_1(2, upper[i]) // Predictor3: Top-right. GENERATE_PREDICTOR_1(3, upper[i + 1]) // Predictor4: Top-left. GENERATE_PREDICTOR_1(4, upper[i - 1]) #undef GENERATE_PREDICTOR_1 // Predictor5: average(average(left, TR), T) #define DO_PRED5(LANE) do { \ const uint8x16_t avgLTR = vhaddq_u8(L, TR); \ const uint8x16_t avg = vhaddq_u8(avgLTR, T); \ const uint8x16_t res = vaddq_u8(avg, src); \ vst1q_lane_u32(&out[i + (LANE)], vreinterpretq_u32_u8(res), (LANE)); \ L = ROTATE32_LEFT(res); \ } while (0) static void PredictorAdd5_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i + 0]); const uint8x16_t TR = LOADQ_U32P_AS_U8(&upper[i + 1]); DO_PRED5(0); DO_PRED5(1); DO_PRED5(2); DO_PRED5(3); } VP8LPredictorsAdd_C[5](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED5 #define DO_PRED67(LANE) do { \ const uint8x16_t avg = vhaddq_u8(L, top); \ const uint8x16_t res = vaddq_u8(avg, src); \ vst1q_lane_u32(&out[i + (LANE)], vreinterpretq_u32_u8(res), (LANE)); \ L = ROTATE32_LEFT(res); \ } while (0) // Predictor6: average(left, TL) static void PredictorAdd6_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t top = LOADQ_U32P_AS_U8(&upper[i - 1]); DO_PRED67(0); DO_PRED67(1); DO_PRED67(2); DO_PRED67(3); } VP8LPredictorsAdd_C[6](in + i, upper + i, num_pixels - i, out + i); } // Predictor7: average(left, T) static void PredictorAdd7_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t top = LOADQ_U32P_AS_U8(&upper[i]); DO_PRED67(0); DO_PRED67(1); DO_PRED67(2); DO_PRED67(3); } VP8LPredictorsAdd_C[7](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED67 #define GENERATE_PREDICTOR_2(X, IN) \ static void PredictorAdd##X##_NEON(const uint32_t* in, \ const uint32_t* upper, int num_pixels, \ uint32_t* out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); \ const uint8x16_t Tother = LOADQ_U32P_AS_U8(&(IN)); \ const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i]); \ const uint8x16_t avg = vhaddq_u8(T, Tother); \ const uint8x16_t res = vaddq_u8(avg, src); \ STOREQ_U8_AS_U32P(&out[i], res); \ } \ VP8LPredictorsAdd_C[(X)](in + i, upper + i, num_pixels - i, out + i); \ } // Predictor8: average TL T. GENERATE_PREDICTOR_2(8, upper[i - 1]) // Predictor9: average T TR. GENERATE_PREDICTOR_2(9, upper[i + 1]) #undef GENERATE_PREDICTOR_2 // Predictor10: average of (average of (L,TL), average of (T, TR)). #define DO_PRED10(LANE) do { \ const uint8x16_t avgLTL = vhaddq_u8(L, TL); \ const uint8x16_t avg = vhaddq_u8(avgTTR, avgLTL); \ const uint8x16_t res = vaddq_u8(avg, src); \ vst1q_lane_u32(&out[i + (LANE)], vreinterpretq_u32_u8(res), (LANE)); \ L = ROTATE32_LEFT(res); \ } while (0) static void PredictorAdd10_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t TL = LOADQ_U32P_AS_U8(&upper[i - 1]); const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i]); const uint8x16_t TR = LOADQ_U32P_AS_U8(&upper[i + 1]); const uint8x16_t avgTTR = vhaddq_u8(T, TR); DO_PRED10(0); DO_PRED10(1); DO_PRED10(2); DO_PRED10(3); } VP8LPredictorsAdd_C[10](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED10 // Predictor11: select. #define DO_PRED11(LANE) do { \ const uint8x16_t sumLin = vaddq_u8(L, src); /* in + L */ \ const uint8x16_t pLTL = vabdq_u8(L, TL); /* |L - TL| */ \ const uint16x8_t sum_LTL = vpaddlq_u8(pLTL); \ const uint32x4_t pa = vpaddlq_u16(sum_LTL); \ const uint32x4_t mask = vcleq_u32(pa, pb); \ const uint8x16_t res = vbslq_u8(vreinterpretq_u8_u32(mask), sumTin, sumLin); \ vst1q_lane_u32(&out[i + (LANE)], vreinterpretq_u32_u8(res), (LANE)); \ L = ROTATE32_LEFT(res); \ } while (0) static void PredictorAdd11_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i]); const uint8x16_t TL = LOADQ_U32P_AS_U8(&upper[i - 1]); const uint8x16_t pTTL = vabdq_u8(T, TL); // |T - TL| const uint16x8_t sum_TTL = vpaddlq_u8(pTTL); const uint32x4_t pb = vpaddlq_u16(sum_TTL); const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t sumTin = vaddq_u8(T, src); // in + T DO_PRED11(0); DO_PRED11(1); DO_PRED11(2); DO_PRED11(3); } VP8LPredictorsAdd_C[11](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED11 // Predictor12: ClampedAddSubtractFull. #define DO_PRED12(DIFF, LANE) do { \ const uint8x8_t pred = \ vqmovun_s16(vaddq_s16(vreinterpretq_s16_u16(L), (DIFF))); \ const uint8x8_t res = \ vadd_u8(pred, (LANE <= 1) ? vget_low_u8(src) : vget_high_u8(src)); \ const uint16x8_t res16 = vmovl_u8(res); \ vst1_lane_u32(&out[i + (LANE)], vreinterpret_u32_u8(res), (LANE) & 1); \ /* rotate in the left predictor for next iteration */ \ L = vextq_u16(res16, res16, 4); \ } while (0) static void PredictorAdd12_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint16x8_t L = vmovl_u8(LOAD_U32_AS_U8(out[-1])); for (i = 0; i + 4 <= num_pixels; i += 4) { // load four pixels of source const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); // precompute the difference T - TL once for all, stored as s16 const uint8x16_t TL = LOADQ_U32P_AS_U8(&upper[i - 1]); const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i]); const int16x8_t diff_lo = vreinterpretq_s16_u16(vsubl_u8(vget_low_u8(T), vget_low_u8(TL))); const int16x8_t diff_hi = vreinterpretq_s16_u16(vsubl_u8(vget_high_u8(T), vget_high_u8(TL))); // loop over the four reconstructed pixels DO_PRED12(diff_lo, 0); DO_PRED12(diff_lo, 1); DO_PRED12(diff_hi, 2); DO_PRED12(diff_hi, 3); } VP8LPredictorsAdd_C[12](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED12 // Predictor13: ClampedAddSubtractHalf #define DO_PRED13(LANE, LOW_OR_HI) do { \ const uint8x16_t avg = vhaddq_u8(L, T); \ const uint8x16_t cmp = vcgtq_u8(TL, avg); \ const uint8x16_t TL_1 = vaddq_u8(TL, cmp); \ /* Compute half of the difference between avg and TL'. */ \ const int8x8_t diff_avg = \ vreinterpret_s8_u8(LOW_OR_HI(vhsubq_u8(avg, TL_1))); \ /* Compute the sum with avg and saturate. */ \ const int16x8_t avg_16 = vreinterpretq_s16_u16(vmovl_u8(LOW_OR_HI(avg))); \ const uint8x8_t delta = vqmovun_s16(vaddw_s8(avg_16, diff_avg)); \ const uint8x8_t res = vadd_u8(LOW_OR_HI(src), delta); \ const uint8x16_t res2 = vcombine_u8(res, res); \ vst1_lane_u32(&out[i + (LANE)], vreinterpret_u32_u8(res), (LANE) & 1); \ L = ROTATE32_LEFT(res2); \ } while (0) static void PredictorAdd13_NEON(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; uint8x16_t L = LOADQ_U32_AS_U8(out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t src = LOADQ_U32P_AS_U8(&in[i]); const uint8x16_t T = LOADQ_U32P_AS_U8(&upper[i]); const uint8x16_t TL = LOADQ_U32P_AS_U8(&upper[i - 1]); DO_PRED13(0, vget_low_u8); DO_PRED13(1, vget_low_u8); DO_PRED13(2, vget_high_u8); DO_PRED13(3, vget_high_u8); } VP8LPredictorsAdd_C[13](in + i, upper + i, num_pixels - i, out + i); } #undef DO_PRED13 #undef LOAD_U32_AS_U8 #undef LOAD_U32P_AS_U8 #undef LOADQ_U32_AS_U8 #undef LOADQ_U32P_AS_U8 #undef GET_U8_AS_U32 #undef GETQ_U8_AS_U32 #undef STOREQ_U8_AS_U32P #undef ROTATE32_LEFT //------------------------------------------------------------------------------ // Subtract-Green Transform // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use // non-standard versions there. #if defined(__APPLE__) && WEBP_AARCH64 && \ defined(__apple_build_version__) && (__apple_build_version__< 6020037) #define USE_VTBLQ #endif #ifdef USE_VTBLQ // 255 = byte will be zeroed static const uint8_t kGreenShuffle[16] = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; static WEBP_INLINE uint8x16_t DoGreenShuffle_NEON(const uint8x16_t argb, const uint8x16_t shuffle) { return vcombine_u8(vtbl1q_u8(argb, vget_low_u8(shuffle)), vtbl1q_u8(argb, vget_high_u8(shuffle))); } #else // !USE_VTBLQ // 255 = byte will be zeroed static const uint8_t kGreenShuffle[8] = { 1, 255, 1, 255, 5, 255, 5, 255 }; static WEBP_INLINE uint8x16_t DoGreenShuffle_NEON(const uint8x16_t argb, const uint8x8_t shuffle) { return vcombine_u8(vtbl1_u8(vget_low_u8(argb), shuffle), vtbl1_u8(vget_high_u8(argb), shuffle)); } #endif // USE_VTBLQ static void AddGreenToBlueAndRed_NEON(const uint32_t* src, int num_pixels, uint32_t* dst) { const uint32_t* const end = src + (num_pixels & ~3); #ifdef USE_VTBLQ const uint8x16_t shuffle = vld1q_u8(kGreenShuffle); #else const uint8x8_t shuffle = vld1_u8(kGreenShuffle); #endif for (; src < end; src += 4, dst += 4) { const uint8x16_t argb = vld1q_u8((const uint8_t*)src); const uint8x16_t greens = DoGreenShuffle_NEON(argb, shuffle); vst1q_u8((uint8_t*)dst, vaddq_u8(argb, greens)); } // fallthrough and finish off with plain-C VP8LAddGreenToBlueAndRed_C(src, num_pixels & 3, dst); } //------------------------------------------------------------------------------ // Color Transform static void TransformColorInverse_NEON(const VP8LMultipliers* const m, const uint32_t* const src, int num_pixels, uint32_t* dst) { // sign-extended multiplying constants, pre-shifted by 6. #define CST(X) (((int16_t)(m->X << 8)) >> 6) const int16_t rb[8] = { CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_), CST(green_to_blue_), CST(green_to_red_) }; const int16x8_t mults_rb = vld1q_s16(rb); const int16_t b2[8] = { 0, CST(red_to_blue_), 0, CST(red_to_blue_), 0, CST(red_to_blue_), 0, CST(red_to_blue_), }; const int16x8_t mults_b2 = vld1q_s16(b2); #undef CST #ifdef USE_VTBLQ static const uint8_t kg0g0[16] = { 255, 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13 }; const uint8x16_t shuffle = vld1q_u8(kg0g0); #else static const uint8_t k0g0g[8] = { 255, 1, 255, 1, 255, 5, 255, 5 }; const uint8x8_t shuffle = vld1_u8(k0g0g); #endif const uint32x4_t mask_ag = vdupq_n_u32(0xff00ff00u); int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const uint8x16_t in = vld1q_u8((const uint8_t*)(src + i)); const uint32x4_t a0g0 = vandq_u32(vreinterpretq_u32_u8(in), mask_ag); // 0 g 0 g const uint8x16_t greens = DoGreenShuffle_NEON(in, shuffle); // x dr x db1 const int16x8_t A = vqdmulhq_s16(vreinterpretq_s16_u8(greens), mults_rb); // x r' x b' const int8x16_t B = vaddq_s8(vreinterpretq_s8_u8(in), vreinterpretq_s8_s16(A)); // r' 0 b' 0 const int16x8_t C = vshlq_n_s16(vreinterpretq_s16_s8(B), 8); // x db2 0 0 const int16x8_t D = vqdmulhq_s16(C, mults_b2); // 0 x db2 0 const uint32x4_t E = vshrq_n_u32(vreinterpretq_u32_s16(D), 8); // r' x b'' 0 const int8x16_t F = vaddq_s8(vreinterpretq_s8_u32(E), vreinterpretq_s8_s16(C)); // 0 r' 0 b'' const uint16x8_t G = vshrq_n_u16(vreinterpretq_u16_s8(F), 8); const uint32x4_t out = vorrq_u32(vreinterpretq_u32_u16(G), a0g0); vst1q_u32(dst + i, out); } // Fall-back to C-version for left-overs. VP8LTransformColorInverse_C(m, src + i, num_pixels - i, dst + i); } #undef USE_VTBLQ //------------------------------------------------------------------------------ // Entry point extern void VP8LDspInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitNEON(void) { VP8LPredictors[5] = Predictor5_NEON; VP8LPredictors[6] = Predictor6_NEON; VP8LPredictors[7] = Predictor7_NEON; VP8LPredictors[13] = Predictor13_NEON; VP8LPredictorsAdd[0] = PredictorAdd0_NEON; VP8LPredictorsAdd[1] = PredictorAdd1_NEON; VP8LPredictorsAdd[2] = PredictorAdd2_NEON; VP8LPredictorsAdd[3] = PredictorAdd3_NEON; VP8LPredictorsAdd[4] = PredictorAdd4_NEON; VP8LPredictorsAdd[5] = PredictorAdd5_NEON; VP8LPredictorsAdd[6] = PredictorAdd6_NEON; VP8LPredictorsAdd[7] = PredictorAdd7_NEON; VP8LPredictorsAdd[8] = PredictorAdd8_NEON; VP8LPredictorsAdd[9] = PredictorAdd9_NEON; VP8LPredictorsAdd[10] = PredictorAdd10_NEON; VP8LPredictorsAdd[11] = PredictorAdd11_NEON; VP8LPredictorsAdd[12] = PredictorAdd12_NEON; VP8LPredictorsAdd[13] = PredictorAdd13_NEON; VP8LConvertBGRAToRGBA = ConvertBGRAToRGBA_NEON; VP8LConvertBGRAToBGR = ConvertBGRAToBGR_NEON; VP8LConvertBGRAToRGB = ConvertBGRAToRGB_NEON; VP8LAddGreenToBlueAndRed = AddGreenToBlueAndRed_NEON; VP8LTransformColorInverse = TransformColorInverse_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8LDspInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/filters.c0000644000014400001440000002311514606317060013246 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Spatial prediction using various filters // // Author: Urvang (urvang@google.com) #include "src/dsp/dsp.h" #include #include #include //------------------------------------------------------------------------------ // Helpful macro. #define DCHECK(in, out) \ do { \ assert((in) != NULL); \ assert((out) != NULL); \ assert(width > 0); \ assert(height > 0); \ assert(stride >= width); \ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \ (void)height; /* Silence unused warning. */ \ } while (0) #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE void PredictLine_C(const uint8_t* src, const uint8_t* pred, uint8_t* dst, int length, int inverse) { int i; if (inverse) { for (i = 0; i < length; ++i) dst[i] = (uint8_t)(src[i] + pred[i]); } else { for (i = 0; i < length; ++i) dst[i] = (uint8_t)(src[i] - pred[i]); } } //------------------------------------------------------------------------------ // Horizontal filter. static WEBP_INLINE void DoHorizontalFilter_C(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; if (row == 0) { // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLine_C(in + 1, preds, out + 1, width - 1, inverse); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { // Leftmost pixel is predicted from above. PredictLine_C(in, preds - stride, out, 1, inverse); PredictLine_C(in + 1, preds, out + 1, width - 1, inverse); ++row; preds += stride; in += stride; out += stride; } } //------------------------------------------------------------------------------ // Vertical filter. static WEBP_INLINE void DoVerticalFilter_C(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; if (row == 0) { // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLine_C(in + 1, preds, out + 1, width - 1, inverse); row = 1; in += stride; out += stride; } else { // We are starting from in-between. Make sure 'preds' points to prev row. preds -= stride; } // Filter line-by-line. while (row < last_row) { PredictLine_C(in, preds, out, width, inverse); ++row; preds += stride; in += stride; out += stride; } } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ // Gradient filter. static WEBP_INLINE int GradientPredictor_C(uint8_t a, uint8_t b, uint8_t c) { const int g = a + b - c; return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit } #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE void DoGradientFilter_C(const uint8_t* in, int width, int height, int stride, int row, int num_rows, int inverse, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = inverse ? out : in; // left prediction for top scan-line if (row == 0) { out[0] = in[0]; PredictLine_C(in + 1, preds, out + 1, width - 1, inverse); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { int w; // leftmost pixel: predict from above. PredictLine_C(in, preds - stride, out, 1, inverse); for (w = 1; w < width; ++w) { const int pred = GradientPredictor_C(preds[w - 1], preds[w - stride], preds[w - stride - 1]); out[w] = (uint8_t)(in[w] + (inverse ? pred : -pred)); } ++row; preds += stride; in += stride; out += stride; } } #endif // !WEBP_NEON_OMIT_C_CODE #undef DCHECK //------------------------------------------------------------------------------ #if !WEBP_NEON_OMIT_C_CODE static void HorizontalFilter_C(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoHorizontalFilter_C(data, width, height, stride, 0, height, 0, filtered_data); } static void VerticalFilter_C(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoVerticalFilter_C(data, width, height, stride, 0, height, 0, filtered_data); } static void GradientFilter_C(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoGradientFilter_C(data, width, height, stride, 0, height, 0, filtered_data); } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ static void NoneUnfilter_C(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { (void)prev; if (out != in) memcpy(out, in, width * sizeof(*out)); } static void HorizontalUnfilter_C(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { uint8_t pred = (prev == NULL) ? 0 : prev[0]; int i; for (i = 0; i < width; ++i) { out[i] = (uint8_t)(pred + in[i]); pred = out[i]; } } #if !WEBP_NEON_OMIT_C_CODE static void VerticalUnfilter_C(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_C(NULL, in, out, width); } else { int i; for (i = 0; i < width; ++i) out[i] = (uint8_t)(prev[i] + in[i]); } } #endif // !WEBP_NEON_OMIT_C_CODE static void GradientUnfilter_C(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_C(NULL, in, out, width); } else { uint8_t top = prev[0], top_left = top, left = top; int i; for (i = 0; i < width; ++i) { top = prev[i]; // need to read this first, in case prev==out left = (uint8_t)(in[i] + GradientPredictor_C(left, top, top_left)); top_left = top; out[i] = left; } } } //------------------------------------------------------------------------------ // Init function WebPFilterFunc WebPFilters[WEBP_FILTER_LAST]; WebPUnfilterFunc WebPUnfilters[WEBP_FILTER_LAST]; extern VP8CPUInfo VP8GetCPUInfo; extern void VP8FiltersInitMIPSdspR2(void); extern void VP8FiltersInitMSA(void); extern void VP8FiltersInitNEON(void); extern void VP8FiltersInitSSE2(void); WEBP_DSP_INIT_FUNC(VP8FiltersInit) { WebPUnfilters[WEBP_FILTER_NONE] = NoneUnfilter_C; #if !WEBP_NEON_OMIT_C_CODE WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_C; WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_C; #endif WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_C; WebPFilters[WEBP_FILTER_NONE] = NULL; #if !WEBP_NEON_OMIT_C_CODE WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_C; WebPFilters[WEBP_FILTER_VERTICAL] = VerticalFilter_C; WebPFilters[WEBP_FILTER_GRADIENT] = GradientFilter_C; #endif if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8FiltersInitSSE2(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8FiltersInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { VP8FiltersInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { VP8FiltersInitNEON(); } #endif assert(WebPUnfilters[WEBP_FILTER_NONE] != NULL); assert(WebPUnfilters[WEBP_FILTER_HORIZONTAL] != NULL); assert(WebPUnfilters[WEBP_FILTER_VERTICAL] != NULL); assert(WebPUnfilters[WEBP_FILTER_GRADIENT] != NULL); assert(WebPFilters[WEBP_FILTER_HORIZONTAL] != NULL); assert(WebPFilters[WEBP_FILTER_VERTICAL] != NULL); assert(WebPFilters[WEBP_FILTER_GRADIENT] != NULL); } libwebp-1.4.0/src/dsp/mips_macro.h0000644000014400001440000003027414606317060013740 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS common macros #ifndef WEBP_DSP_MIPS_MACRO_H_ #define WEBP_DSP_MIPS_MACRO_H_ #if defined(__GNUC__) && defined(__ANDROID__) && LOCAL_GCC_VERSION == 0x409 #define WORK_AROUND_GCC #endif #define STR(s) #s #define XSTR(s) STR(s) // O0[31..16 | 15..0] = I0[31..16 | 15..0] + I1[31..16 | 15..0] // O1[31..16 | 15..0] = I0[31..16 | 15..0] - I1[31..16 | 15..0] // O - output // I - input (macro doesn't change it) #define ADD_SUB_HALVES(O0, O1, \ I0, I1) \ "addq.ph %[" #O0 "], %[" #I0 "], %[" #I1 "] \n\t" \ "subq.ph %[" #O1 "], %[" #I0 "], %[" #I1 "] \n\t" // O - output // I - input (macro doesn't change it) // I[0/1] - offset in bytes #define LOAD_IN_X2(O0, O1, \ I0, I1) \ "lh %[" #O0 "], " #I0 "(%[in]) \n\t" \ "lh %[" #O1 "], " #I1 "(%[in]) \n\t" // I0 - location // I1..I9 - offsets in bytes #define LOAD_WITH_OFFSET_X4(O0, O1, O2, O3, \ I0, I1, I2, I3, I4, I5, I6, I7, I8, I9) \ "ulw %[" #O0 "], " #I1 "+" XSTR(I9) "*" #I5 "(%[" #I0 "]) \n\t" \ "ulw %[" #O1 "], " #I2 "+" XSTR(I9) "*" #I6 "(%[" #I0 "]) \n\t" \ "ulw %[" #O2 "], " #I3 "+" XSTR(I9) "*" #I7 "(%[" #I0 "]) \n\t" \ "ulw %[" #O3 "], " #I4 "+" XSTR(I9) "*" #I8 "(%[" #I0 "]) \n\t" // O - output // I - input (macro doesn't change it so it should be different from I) #define MUL_SHIFT_C1(O, I) \ "mul %[" #O "], %[" #I "], %[kC1] \n\t" \ "sra %[" #O "], %[" #O "], 16 \n\t" \ "addu %[" #O "], %[" #O "], %[" #I "] \n\t" #define MUL_SHIFT_C2(O, I) \ "mul %[" #O "], %[" #I "], %[kC2] \n\t" \ "sra %[" #O "], %[" #O "], 16 \n\t" // Same as #define MUL_SHIFT_C1 but I and O are the same. It stores the // intermediary result in TMP. #define MUL_SHIFT_C1_IO(IO, TMP) \ "mul %[" #TMP "], %[" #IO "], %[kC1] \n\t" \ "sra %[" #TMP "], %[" #TMP "], 16 \n\t" \ "addu %[" #IO "], %[" #TMP "], %[" #IO "] \n\t" // O - output // IO - input/output // I - input (macro doesn't change it) #define MUL_SHIFT_SUM(O0, O1, O2, O3, O4, O5, O6, O7, \ IO0, IO1, IO2, IO3, \ I0, I1, I2, I3, I4, I5, I6, I7) \ MUL_SHIFT_C2(O0, I0) \ MUL_SHIFT_C1(O1, I0) \ MUL_SHIFT_C2(O2, I1) \ MUL_SHIFT_C1(O3, I1) \ MUL_SHIFT_C2(O4, I2) \ MUL_SHIFT_C1(O5, I2) \ MUL_SHIFT_C2(O6, I3) \ MUL_SHIFT_C1(O7, I3) \ "addu %[" #IO0 "], %[" #IO0 "], %[" #I4 "] \n\t" \ "addu %[" #IO1 "], %[" #IO1 "], %[" #I5 "] \n\t" \ "subu %[" #IO2 "], %[" #IO2 "], %[" #I6 "] \n\t" \ "subu %[" #IO3 "], %[" #IO3 "], %[" #I7 "] \n\t" // O - output // I - input (macro doesn't change it) #define INSERT_HALF_X2(O0, O1, \ I0, I1) \ "ins %[" #O0 "], %[" #I0 "], 16, 16 \n\t" \ "ins %[" #O1 "], %[" #I1 "], 16, 16 \n\t" // O - output // I - input (macro doesn't change it) #define SRA_16(O0, O1, O2, O3, \ I0, I1, I2, I3) \ "sra %[" #O0 "], %[" #I0 "], 16 \n\t" \ "sra %[" #O1 "], %[" #I1 "], 16 \n\t" \ "sra %[" #O2 "], %[" #I2 "], 16 \n\t" \ "sra %[" #O3 "], %[" #I3 "], 16 \n\t" // temp0[31..16 | 15..0] = temp8[31..16 | 15..0] + temp12[31..16 | 15..0] // temp1[31..16 | 15..0] = temp8[31..16 | 15..0] - temp12[31..16 | 15..0] // temp0[31..16 | 15..0] = temp0[31..16 >> 3 | 15..0 >> 3] // temp1[31..16 | 15..0] = temp1[31..16 >> 3 | 15..0 >> 3] // O - output // I - input (macro doesn't change it) #define SHIFT_R_SUM_X2(O0, O1, O2, O3, O4, O5, O6, O7, \ I0, I1, I2, I3, I4, I5, I6, I7) \ "addq.ph %[" #O0 "], %[" #I0 "], %[" #I4 "] \n\t" \ "subq.ph %[" #O1 "], %[" #I0 "], %[" #I4 "] \n\t" \ "addq.ph %[" #O2 "], %[" #I1 "], %[" #I5 "] \n\t" \ "subq.ph %[" #O3 "], %[" #I1 "], %[" #I5 "] \n\t" \ "addq.ph %[" #O4 "], %[" #I2 "], %[" #I6 "] \n\t" \ "subq.ph %[" #O5 "], %[" #I2 "], %[" #I6 "] \n\t" \ "addq.ph %[" #O6 "], %[" #I3 "], %[" #I7 "] \n\t" \ "subq.ph %[" #O7 "], %[" #I3 "], %[" #I7 "] \n\t" \ "shra.ph %[" #O0 "], %[" #O0 "], 3 \n\t" \ "shra.ph %[" #O1 "], %[" #O1 "], 3 \n\t" \ "shra.ph %[" #O2 "], %[" #O2 "], 3 \n\t" \ "shra.ph %[" #O3 "], %[" #O3 "], 3 \n\t" \ "shra.ph %[" #O4 "], %[" #O4 "], 3 \n\t" \ "shra.ph %[" #O5 "], %[" #O5 "], 3 \n\t" \ "shra.ph %[" #O6 "], %[" #O6 "], 3 \n\t" \ "shra.ph %[" #O7 "], %[" #O7 "], 3 \n\t" // precrq.ph.w temp0, temp8, temp2 // temp0 = temp8[31..16] | temp2[31..16] // ins temp2, temp8, 16, 16 // temp2 = temp8[31..16] | temp2[15..0] // O - output // IO - input/output // I - input (macro doesn't change it) #define PACK_2_HALVES_TO_WORD(O0, O1, O2, O3, \ IO0, IO1, IO2, IO3, \ I0, I1, I2, I3) \ "precrq.ph.w %[" #O0 "], %[" #I0 "], %[" #IO0 "] \n\t" \ "precrq.ph.w %[" #O1 "], %[" #I1 "], %[" #IO1 "] \n\t" \ "ins %[" #IO0 "], %[" #I0 "], 16, 16 \n\t" \ "ins %[" #IO1 "], %[" #I1 "], 16, 16 \n\t" \ "precrq.ph.w %[" #O2 "], %[" #I2 "], %[" #IO2 "] \n\t" \ "precrq.ph.w %[" #O3 "], %[" #I3 "], %[" #IO3 "] \n\t" \ "ins %[" #IO2 "], %[" #I2 "], 16, 16 \n\t" \ "ins %[" #IO3 "], %[" #I3 "], 16, 16 \n\t" // preceu.ph.qbr temp0, temp8 // temp0 = 0 | 0 | temp8[23..16] | temp8[7..0] // preceu.ph.qbl temp1, temp8 // temp1 = temp8[23..16] | temp8[7..0] | 0 | 0 // O - output // I - input (macro doesn't change it) #define CONVERT_2_BYTES_TO_HALF(O0, O1, O2, O3, O4, O5, O6, O7, \ I0, I1, I2, I3) \ "preceu.ph.qbr %[" #O0 "], %[" #I0 "] \n\t" \ "preceu.ph.qbl %[" #O1 "], %[" #I0 "] \n\t" \ "preceu.ph.qbr %[" #O2 "], %[" #I1 "] \n\t" \ "preceu.ph.qbl %[" #O3 "], %[" #I1 "] \n\t" \ "preceu.ph.qbr %[" #O4 "], %[" #I2 "] \n\t" \ "preceu.ph.qbl %[" #O5 "], %[" #I2 "] \n\t" \ "preceu.ph.qbr %[" #O6 "], %[" #I3 "] \n\t" \ "preceu.ph.qbl %[" #O7 "], %[" #I3 "] \n\t" // temp0[31..16 | 15..0] = temp0[31..16 | 15..0] + temp8[31..16 | 15..0] // temp0[31..16 | 15..0] = temp0[31..16 <<(s) 7 | 15..0 <<(s) 7] // temp1..temp7 same as temp0 // precrqu_s.qb.ph temp0, temp1, temp0: // temp0 = temp1[31..24] | temp1[15..8] | temp0[31..24] | temp0[15..8] // store temp0 to dst // IO - input/output // I - input (macro doesn't change it) #define STORE_SAT_SUM_X2(IO0, IO1, IO2, IO3, IO4, IO5, IO6, IO7, \ I0, I1, I2, I3, I4, I5, I6, I7, \ I8, I9, I10, I11, I12, I13) \ "addq.ph %[" #IO0 "], %[" #IO0 "], %[" #I0 "] \n\t" \ "addq.ph %[" #IO1 "], %[" #IO1 "], %[" #I1 "] \n\t" \ "addq.ph %[" #IO2 "], %[" #IO2 "], %[" #I2 "] \n\t" \ "addq.ph %[" #IO3 "], %[" #IO3 "], %[" #I3 "] \n\t" \ "addq.ph %[" #IO4 "], %[" #IO4 "], %[" #I4 "] \n\t" \ "addq.ph %[" #IO5 "], %[" #IO5 "], %[" #I5 "] \n\t" \ "addq.ph %[" #IO6 "], %[" #IO6 "], %[" #I6 "] \n\t" \ "addq.ph %[" #IO7 "], %[" #IO7 "], %[" #I7 "] \n\t" \ "shll_s.ph %[" #IO0 "], %[" #IO0 "], 7 \n\t" \ "shll_s.ph %[" #IO1 "], %[" #IO1 "], 7 \n\t" \ "shll_s.ph %[" #IO2 "], %[" #IO2 "], 7 \n\t" \ "shll_s.ph %[" #IO3 "], %[" #IO3 "], 7 \n\t" \ "shll_s.ph %[" #IO4 "], %[" #IO4 "], 7 \n\t" \ "shll_s.ph %[" #IO5 "], %[" #IO5 "], 7 \n\t" \ "shll_s.ph %[" #IO6 "], %[" #IO6 "], 7 \n\t" \ "shll_s.ph %[" #IO7 "], %[" #IO7 "], 7 \n\t" \ "precrqu_s.qb.ph %[" #IO0 "], %[" #IO1 "], %[" #IO0 "] \n\t" \ "precrqu_s.qb.ph %[" #IO2 "], %[" #IO3 "], %[" #IO2 "] \n\t" \ "precrqu_s.qb.ph %[" #IO4 "], %[" #IO5 "], %[" #IO4 "] \n\t" \ "precrqu_s.qb.ph %[" #IO6 "], %[" #IO7 "], %[" #IO6 "] \n\t" \ "usw %[" #IO0 "], " XSTR(I13) "*" #I9 "(%[" #I8 "]) \n\t" \ "usw %[" #IO2 "], " XSTR(I13) "*" #I10 "(%[" #I8 "]) \n\t" \ "usw %[" #IO4 "], " XSTR(I13) "*" #I11 "(%[" #I8 "]) \n\t" \ "usw %[" #IO6 "], " XSTR(I13) "*" #I12 "(%[" #I8 "]) \n\t" #define OUTPUT_EARLY_CLOBBER_REGS_10() \ : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), \ [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), \ [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), \ [temp10]"=&r"(temp10) #define OUTPUT_EARLY_CLOBBER_REGS_18() \ OUTPUT_EARLY_CLOBBER_REGS_10(), \ [temp11]"=&r"(temp11), [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), \ [temp14]"=&r"(temp14), [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), \ [temp17]"=&r"(temp17), [temp18]"=&r"(temp18) #endif // WEBP_DSP_MIPS_MACRO_H_ libwebp-1.4.0/src/dsp/enc_msa.c0000644000014400001440000007756114606317060013221 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA version of encoder dsp functions. // // Author: Prashant Patil (prashant.patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include #include "src/dsp/msa_macro.h" #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Transforms #define IDCT_1D_W(in0, in1, in2, in3, out0, out1, out2, out3) do { \ v4i32 a1_m, b1_m, c1_m, d1_m; \ const v4i32 cospi8sqrt2minus1 = __msa_fill_w(20091); \ const v4i32 sinpi8sqrt2 = __msa_fill_w(35468); \ v4i32 c_tmp1_m = in1 * sinpi8sqrt2; \ v4i32 c_tmp2_m = in3 * cospi8sqrt2minus1; \ v4i32 d_tmp1_m = in1 * cospi8sqrt2minus1; \ v4i32 d_tmp2_m = in3 * sinpi8sqrt2; \ \ ADDSUB2(in0, in2, a1_m, b1_m); \ SRAI_W2_SW(c_tmp1_m, c_tmp2_m, 16); \ c_tmp2_m = c_tmp2_m + in3; \ c1_m = c_tmp1_m - c_tmp2_m; \ SRAI_W2_SW(d_tmp1_m, d_tmp2_m, 16); \ d_tmp1_m = d_tmp1_m + in1; \ d1_m = d_tmp1_m + d_tmp2_m; \ BUTTERFLY_4(a1_m, b1_m, c1_m, d1_m, out0, out1, out2, out3); \ } while (0) static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in, uint8_t* dst) { v8i16 input0, input1; v4i32 in0, in1, in2, in3, hz0, hz1, hz2, hz3, vt0, vt1, vt2, vt3; v4i32 res0, res1, res2, res3; v16i8 dest0, dest1, dest2, dest3; const v16i8 zero = { 0 }; LD_SH2(in, 8, input0, input1); UNPCK_SH_SW(input0, in0, in1); UNPCK_SH_SW(input1, in2, in3); IDCT_1D_W(in0, in1, in2, in3, hz0, hz1, hz2, hz3); TRANSPOSE4x4_SW_SW(hz0, hz1, hz2, hz3, hz0, hz1, hz2, hz3); IDCT_1D_W(hz0, hz1, hz2, hz3, vt0, vt1, vt2, vt3); SRARI_W4_SW(vt0, vt1, vt2, vt3, 3); TRANSPOSE4x4_SW_SW(vt0, vt1, vt2, vt3, vt0, vt1, vt2, vt3); LD_SB4(ref, BPS, dest0, dest1, dest2, dest3); ILVR_B4_SW(zero, dest0, zero, dest1, zero, dest2, zero, dest3, res0, res1, res2, res3); ILVR_H4_SW(zero, res0, zero, res1, zero, res2, zero, res3, res0, res1, res2, res3); ADD4(res0, vt0, res1, vt1, res2, vt2, res3, vt3, res0, res1, res2, res3); CLIP_SW4_0_255(res0, res1, res2, res3); PCKEV_B2_SW(res0, res1, res2, res3, vt0, vt1); res0 = (v4i32)__msa_pckev_b((v16i8)vt0, (v16i8)vt1); ST4x4_UB(res0, res0, 3, 2, 1, 0, dst, BPS); } static void ITransform_MSA(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { ITransformOne(ref, in, dst); if (do_two) { ITransformOne(ref + 4, in + 16, dst + 4); } } static void FTransform_MSA(const uint8_t* src, const uint8_t* ref, int16_t* out) { uint64_t out0, out1, out2, out3; uint32_t in0, in1, in2, in3; v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; v8i16 t0, t1, t2, t3; v16u8 srcl0, srcl1, src0 = { 0 }, src1 = { 0 }; const v8i16 mask0 = { 0, 4, 8, 12, 1, 5, 9, 13 }; const v8i16 mask1 = { 3, 7, 11, 15, 2, 6, 10, 14 }; const v8i16 mask2 = { 4, 0, 5, 1, 6, 2, 7, 3 }; const v8i16 mask3 = { 0, 4, 1, 5, 2, 6, 3, 7 }; const v8i16 cnst0 = { 2217, -5352, 2217, -5352, 2217, -5352, 2217, -5352 }; const v8i16 cnst1 = { 5352, 2217, 5352, 2217, 5352, 2217, 5352, 2217 }; LW4(src, BPS, in0, in1, in2, in3); INSERT_W4_UB(in0, in1, in2, in3, src0); LW4(ref, BPS, in0, in1, in2, in3); INSERT_W4_UB(in0, in1, in2, in3, src1); ILVRL_B2_UB(src0, src1, srcl0, srcl1); HSUB_UB2_SH(srcl0, srcl1, t0, t1); VSHF_H2_SH(t0, t1, t0, t1, mask0, mask1, t2, t3); ADDSUB2(t2, t3, t0, t1); t0 = SRLI_H(t0, 3); VSHF_H2_SH(t0, t0, t1, t1, mask2, mask3, t3, t2); tmp0 = __msa_hadd_s_w(t3, t3); tmp2 = __msa_hsub_s_w(t3, t3); FILL_W2_SW(1812, 937, tmp1, tmp3); DPADD_SH2_SW(t2, t2, cnst0, cnst1, tmp3, tmp1); SRAI_W2_SW(tmp1, tmp3, 9); PCKEV_H2_SH(tmp1, tmp0, tmp3, tmp2, t0, t1); VSHF_H2_SH(t0, t1, t0, t1, mask0, mask1, t2, t3); ADDSUB2(t2, t3, t0, t1); VSHF_H2_SH(t0, t0, t1, t1, mask2, mask3, t3, t2); tmp0 = __msa_hadd_s_w(t3, t3); tmp2 = __msa_hsub_s_w(t3, t3); ADDVI_W2_SW(tmp0, 7, tmp2, 7, tmp0, tmp2); SRAI_W2_SW(tmp0, tmp2, 4); FILL_W2_SW(12000, 51000, tmp1, tmp3); DPADD_SH2_SW(t2, t2, cnst0, cnst1, tmp3, tmp1); SRAI_W2_SW(tmp1, tmp3, 16); UNPCK_R_SH_SW(t1, tmp4); tmp5 = __msa_ceqi_w(tmp4, 0); tmp4 = (v4i32)__msa_nor_v((v16u8)tmp5, (v16u8)tmp5); tmp5 = __msa_fill_w(1); tmp5 = (v4i32)__msa_and_v((v16u8)tmp5, (v16u8)tmp4); tmp1 += tmp5; PCKEV_H2_SH(tmp1, tmp0, tmp3, tmp2, t0, t1); out0 = __msa_copy_s_d((v2i64)t0, 0); out1 = __msa_copy_s_d((v2i64)t0, 1); out2 = __msa_copy_s_d((v2i64)t1, 0); out3 = __msa_copy_s_d((v2i64)t1, 1); SD4(out0, out1, out2, out3, out, 8); } static void FTransformWHT_MSA(const int16_t* in, int16_t* out) { v8i16 in0 = { 0 }; v8i16 in1 = { 0 }; v8i16 tmp0, tmp1, tmp2, tmp3; v8i16 out0, out1; const v8i16 mask0 = { 0, 1, 2, 3, 8, 9, 10, 11 }; const v8i16 mask1 = { 4, 5, 6, 7, 12, 13, 14, 15 }; const v8i16 mask2 = { 0, 4, 8, 12, 1, 5, 9, 13 }; const v8i16 mask3 = { 3, 7, 11, 15, 2, 6, 10, 14 }; in0 = __msa_insert_h(in0, 0, in[ 0]); in0 = __msa_insert_h(in0, 1, in[ 64]); in0 = __msa_insert_h(in0, 2, in[128]); in0 = __msa_insert_h(in0, 3, in[192]); in0 = __msa_insert_h(in0, 4, in[ 16]); in0 = __msa_insert_h(in0, 5, in[ 80]); in0 = __msa_insert_h(in0, 6, in[144]); in0 = __msa_insert_h(in0, 7, in[208]); in1 = __msa_insert_h(in1, 0, in[ 48]); in1 = __msa_insert_h(in1, 1, in[112]); in1 = __msa_insert_h(in1, 2, in[176]); in1 = __msa_insert_h(in1, 3, in[240]); in1 = __msa_insert_h(in1, 4, in[ 32]); in1 = __msa_insert_h(in1, 5, in[ 96]); in1 = __msa_insert_h(in1, 6, in[160]); in1 = __msa_insert_h(in1, 7, in[224]); ADDSUB2(in0, in1, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); ADDSUB2(tmp2, tmp3, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask2, mask3, in0, in1); ADDSUB2(in0, in1, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); ADDSUB2(tmp2, tmp3, out0, out1); SRAI_H2_SH(out0, out1, 1); ST_SH2(out0, out1, out, 8); } static int TTransform_MSA(const uint8_t* in, const uint16_t* w) { int sum; uint32_t in0_m, in1_m, in2_m, in3_m; v16i8 src0 = { 0 }; v8i16 in0, in1, tmp0, tmp1, tmp2, tmp3; v4i32 dst0, dst1; const v16i8 zero = { 0 }; const v8i16 mask0 = { 0, 1, 2, 3, 8, 9, 10, 11 }; const v8i16 mask1 = { 4, 5, 6, 7, 12, 13, 14, 15 }; const v8i16 mask2 = { 0, 4, 8, 12, 1, 5, 9, 13 }; const v8i16 mask3 = { 3, 7, 11, 15, 2, 6, 10, 14 }; LW4(in, BPS, in0_m, in1_m, in2_m, in3_m); INSERT_W4_SB(in0_m, in1_m, in2_m, in3_m, src0); ILVRL_B2_SH(zero, src0, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask2, mask3, in0, in1); ADDSUB2(in0, in1, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); ADDSUB2(tmp2, tmp3, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask2, mask3, in0, in1); ADDSUB2(in0, in1, tmp0, tmp1); VSHF_H2_SH(tmp0, tmp1, tmp0, tmp1, mask0, mask1, tmp2, tmp3); ADDSUB2(tmp2, tmp3, tmp0, tmp1); tmp0 = __msa_add_a_h(tmp0, (v8i16)zero); tmp1 = __msa_add_a_h(tmp1, (v8i16)zero); LD_SH2(w, 8, tmp2, tmp3); DOTP_SH2_SW(tmp0, tmp1, tmp2, tmp3, dst0, dst1); dst0 = dst0 + dst1; sum = HADD_SW_S32(dst0); return sum; } static int Disto4x4_MSA(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { const int sum1 = TTransform_MSA(a, w); const int sum2 = TTransform_MSA(b, w); return abs(sum2 - sum1) >> 5; } static int Disto16x16_MSA(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_MSA(a + x + y, b + x + y, w); } } return D; } //------------------------------------------------------------------------------ // Histogram static void CollectHistogram_MSA(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; for (j = start_block; j < end_block; ++j) { int16_t out[16]; VP8FTransform(ref + VP8DspScan[j], pred + VP8DspScan[j], out); { int k; v8i16 coeff0, coeff1; const v8i16 zero = { 0 }; const v8i16 max_coeff_thr = __msa_ldi_h(MAX_COEFF_THRESH); LD_SH2(&out[0], 8, coeff0, coeff1); coeff0 = __msa_add_a_h(coeff0, zero); coeff1 = __msa_add_a_h(coeff1, zero); SRAI_H2_SH(coeff0, coeff1, 3); coeff0 = __msa_min_s_h(coeff0, max_coeff_thr); coeff1 = __msa_min_s_h(coeff1, max_coeff_thr); ST_SH2(coeff0, coeff1, &out[0], 8); for (k = 0; k < 16; ++k) { ++distribution[out[k]]; } } } VP8SetHistogramData(distribution, histo); } //------------------------------------------------------------------------------ // Intra predictions // luma 4x4 prediction #define DST(x, y) dst[(x) + (y) * BPS] #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2) #define AVG2(a, b) (((a) + (b) + 1) >> 1) static WEBP_INLINE void VE4(uint8_t* dst, const uint8_t* top) { // vertical const v16u8 A1 = { 0 }; const uint64_t val_m = LD(top - 1); const v16u8 A = (v16u8)__msa_insert_d((v2i64)A1, 0, val_m); const v16u8 B = SLDI_UB(A, A, 1); const v16u8 C = SLDI_UB(A, A, 2); const v16u8 AC = __msa_ave_u_b(A, C); const v16u8 B2 = __msa_ave_u_b(B, B); const v16u8 R = __msa_aver_u_b(AC, B2); const uint32_t out = __msa_copy_s_w((v4i32)R, 0); SW4(out, out, out, out, dst, BPS); } static WEBP_INLINE void HE4(uint8_t* dst, const uint8_t* top) { // horizontal const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; WebPUint32ToMem(dst + 0 * BPS, 0x01010101U * AVG3(X, I, J)); WebPUint32ToMem(dst + 1 * BPS, 0x01010101U * AVG3(I, J, K)); WebPUint32ToMem(dst + 2 * BPS, 0x01010101U * AVG3(J, K, L)); WebPUint32ToMem(dst + 3 * BPS, 0x01010101U * AVG3(K, L, L)); } static WEBP_INLINE void DC4(uint8_t* dst, const uint8_t* top) { uint32_t dc = 4; int i; for (i = 0; i < 4; ++i) dc += top[i] + top[-5 + i]; dc >>= 3; dc = dc | (dc << 8) | (dc << 16) | (dc << 24); SW4(dc, dc, dc, dc, dst, BPS); } static WEBP_INLINE void RD4(uint8_t* dst, const uint8_t* top) { const v16u8 A2 = { 0 }; const uint64_t val_m = LD(top - 5); const v16u8 A1 = (v16u8)__msa_insert_d((v2i64)A2, 0, val_m); const v16u8 A = (v16u8)__msa_insert_b((v16i8)A1, 8, top[3]); const v16u8 B = SLDI_UB(A, A, 1); const v16u8 C = SLDI_UB(A, A, 2); const v16u8 AC = __msa_ave_u_b(A, C); const v16u8 B2 = __msa_ave_u_b(B, B); const v16u8 R0 = __msa_aver_u_b(AC, B2); const v16u8 R1 = SLDI_UB(R0, R0, 1); const v16u8 R2 = SLDI_UB(R1, R1, 1); const v16u8 R3 = SLDI_UB(R2, R2, 1); const uint32_t val0 = __msa_copy_s_w((v4i32)R0, 0); const uint32_t val1 = __msa_copy_s_w((v4i32)R1, 0); const uint32_t val2 = __msa_copy_s_w((v4i32)R2, 0); const uint32_t val3 = __msa_copy_s_w((v4i32)R3, 0); SW4(val3, val2, val1, val0, dst, BPS); } static WEBP_INLINE void LD4(uint8_t* dst, const uint8_t* top) { const v16u8 A1 = { 0 }; const uint64_t val_m = LD(top); const v16u8 A = (v16u8)__msa_insert_d((v2i64)A1, 0, val_m); const v16u8 B = SLDI_UB(A, A, 1); const v16u8 C1 = SLDI_UB(A, A, 2); const v16u8 C = (v16u8)__msa_insert_b((v16i8)C1, 6, top[7]); const v16u8 AC = __msa_ave_u_b(A, C); const v16u8 B2 = __msa_ave_u_b(B, B); const v16u8 R0 = __msa_aver_u_b(AC, B2); const v16u8 R1 = SLDI_UB(R0, R0, 1); const v16u8 R2 = SLDI_UB(R1, R1, 1); const v16u8 R3 = SLDI_UB(R2, R2, 1); const uint32_t val0 = __msa_copy_s_w((v4i32)R0, 0); const uint32_t val1 = __msa_copy_s_w((v4i32)R1, 0); const uint32_t val2 = __msa_copy_s_w((v4i32)R2, 0); const uint32_t val3 = __msa_copy_s_w((v4i32)R3, 0); SW4(val0, val1, val2, val3, dst, BPS); } static WEBP_INLINE void VR4(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; DST(0, 0) = DST(1, 2) = AVG2(X, A); DST(1, 0) = DST(2, 2) = AVG2(A, B); DST(2, 0) = DST(3, 2) = AVG2(B, C); DST(3, 0) = AVG2(C, D); DST(0, 3) = AVG3(K, J, I); DST(0, 2) = AVG3(J, I, X); DST(0, 1) = DST(1, 3) = AVG3(I, X, A); DST(1, 1) = DST(2, 3) = AVG3(X, A, B); DST(2, 1) = DST(3, 3) = AVG3(A, B, C); DST(3, 1) = AVG3(B, C, D); } static WEBP_INLINE void VL4(uint8_t* dst, const uint8_t* top) { const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; const int E = top[4]; const int F = top[5]; const int G = top[6]; const int H = top[7]; DST(0, 0) = AVG2(A, B); DST(1, 0) = DST(0, 2) = AVG2(B, C); DST(2, 0) = DST(1, 2) = AVG2(C, D); DST(3, 0) = DST(2, 2) = AVG2(D, E); DST(0, 1) = AVG3(A, B, C); DST(1, 1) = DST(0, 3) = AVG3(B, C, D); DST(2, 1) = DST(1, 3) = AVG3(C, D, E); DST(3, 1) = DST(2, 3) = AVG3(D, E, F); DST(3, 2) = AVG3(E, F, G); DST(3, 3) = AVG3(F, G, H); } static WEBP_INLINE void HU4(uint8_t* dst, const uint8_t* top) { const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; DST(0, 0) = AVG2(I, J); DST(2, 0) = DST(0, 1) = AVG2(J, K); DST(2, 1) = DST(0, 2) = AVG2(K, L); DST(1, 0) = AVG3(I, J, K); DST(3, 0) = DST(1, 1) = AVG3(J, K, L); DST(3, 1) = DST(1, 2) = AVG3(K, L, L); DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L; } static WEBP_INLINE void HD4(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; const int A = top[0]; const int B = top[1]; const int C = top[2]; DST(0, 0) = DST(2, 1) = AVG2(I, X); DST(0, 1) = DST(2, 2) = AVG2(J, I); DST(0, 2) = DST(2, 3) = AVG2(K, J); DST(0, 3) = AVG2(L, K); DST(3, 0) = AVG3(A, B, C); DST(2, 0) = AVG3(X, A, B); DST(1, 0) = DST(3, 1) = AVG3(I, X, A); DST(1, 1) = DST(3, 2) = AVG3(J, I, X); DST(1, 2) = DST(3, 3) = AVG3(K, J, I); DST(1, 3) = AVG3(L, K, J); } static WEBP_INLINE void TM4(uint8_t* dst, const uint8_t* top) { const v16i8 zero = { 0 }; const v8i16 TL = (v8i16)__msa_fill_h(top[-1]); const v8i16 L0 = (v8i16)__msa_fill_h(top[-2]); const v8i16 L1 = (v8i16)__msa_fill_h(top[-3]); const v8i16 L2 = (v8i16)__msa_fill_h(top[-4]); const v8i16 L3 = (v8i16)__msa_fill_h(top[-5]); const v16u8 T1 = LD_UB(top); const v8i16 T = (v8i16)__msa_ilvr_b(zero, (v16i8)T1); const v8i16 d = T - TL; v8i16 r0, r1, r2, r3; ADD4(d, L0, d, L1, d, L2, d, L3, r0, r1, r2, r3); CLIP_SH4_0_255(r0, r1, r2, r3); PCKEV_ST4x4_UB(r0, r1, r2, r3, dst, BPS); } #undef DST #undef AVG3 #undef AVG2 static void Intra4Preds_MSA(uint8_t* dst, const uint8_t* top) { DC4(I4DC4 + dst, top); TM4(I4TM4 + dst, top); VE4(I4VE4 + dst, top); HE4(I4HE4 + dst, top); RD4(I4RD4 + dst, top); VR4(I4VR4 + dst, top); LD4(I4LD4 + dst, top); VL4(I4VL4 + dst, top); HD4(I4HD4 + dst, top); HU4(I4HU4 + dst, top); } // luma 16x16 prediction #define STORE16x16(out, dst) do { \ ST_UB8(out, out, out, out, out, out, out, out, dst + 0 * BPS, BPS); \ ST_UB8(out, out, out, out, out, out, out, out, dst + 8 * BPS, BPS); \ } while (0) static WEBP_INLINE void VerticalPred16x16(uint8_t* dst, const uint8_t* top) { if (top != NULL) { const v16u8 out = LD_UB(top); STORE16x16(out, dst); } else { const v16u8 out = (v16u8)__msa_fill_b(0x7f); STORE16x16(out, dst); } } static WEBP_INLINE void HorizontalPred16x16(uint8_t* dst, const uint8_t* left) { if (left != NULL) { int j; for (j = 0; j < 16; j += 4) { const v16u8 L0 = (v16u8)__msa_fill_b(left[0]); const v16u8 L1 = (v16u8)__msa_fill_b(left[1]); const v16u8 L2 = (v16u8)__msa_fill_b(left[2]); const v16u8 L3 = (v16u8)__msa_fill_b(left[3]); ST_UB4(L0, L1, L2, L3, dst, BPS); dst += 4 * BPS; left += 4; } } else { const v16u8 out = (v16u8)__msa_fill_b(0x81); STORE16x16(out, dst); } } static WEBP_INLINE void TrueMotion16x16(uint8_t* dst, const uint8_t* left, const uint8_t* top) { if (left != NULL) { if (top != NULL) { int j; v8i16 d1, d2; const v16i8 zero = { 0 }; const v8i16 TL = (v8i16)__msa_fill_h(left[-1]); const v16u8 T = LD_UB(top); ILVRL_B2_SH(zero, T, d1, d2); SUB2(d1, TL, d2, TL, d1, d2); for (j = 0; j < 16; j += 4) { v16i8 t0, t1, t2, t3; v8i16 r0, r1, r2, r3, r4, r5, r6, r7; const v8i16 L0 = (v8i16)__msa_fill_h(left[j + 0]); const v8i16 L1 = (v8i16)__msa_fill_h(left[j + 1]); const v8i16 L2 = (v8i16)__msa_fill_h(left[j + 2]); const v8i16 L3 = (v8i16)__msa_fill_h(left[j + 3]); ADD4(d1, L0, d1, L1, d1, L2, d1, L3, r0, r1, r2, r3); ADD4(d2, L0, d2, L1, d2, L2, d2, L3, r4, r5, r6, r7); CLIP_SH4_0_255(r0, r1, r2, r3); CLIP_SH4_0_255(r4, r5, r6, r7); PCKEV_B4_SB(r4, r0, r5, r1, r6, r2, r7, r3, t0, t1, t2, t3); ST_SB4(t0, t1, t2, t3, dst, BPS); dst += 4 * BPS; } } else { HorizontalPred16x16(dst, left); } } else { if (top != NULL) { VerticalPred16x16(dst, top); } else { const v16u8 out = (v16u8)__msa_fill_b(0x81); STORE16x16(out, dst); } } } static WEBP_INLINE void DCMode16x16(uint8_t* dst, const uint8_t* left, const uint8_t* top) { int DC; v16u8 out; if (top != NULL && left != NULL) { const v16u8 rtop = LD_UB(top); const v8u16 dctop = __msa_hadd_u_h(rtop, rtop); const v16u8 rleft = LD_UB(left); const v8u16 dcleft = __msa_hadd_u_h(rleft, rleft); const v8u16 dctemp = dctop + dcleft; DC = HADD_UH_U32(dctemp); DC = (DC + 16) >> 5; } else if (left != NULL) { // left but no top const v16u8 rleft = LD_UB(left); const v8u16 dcleft = __msa_hadd_u_h(rleft, rleft); DC = HADD_UH_U32(dcleft); DC = (DC + DC + 16) >> 5; } else if (top != NULL) { // top but no left const v16u8 rtop = LD_UB(top); const v8u16 dctop = __msa_hadd_u_h(rtop, rtop); DC = HADD_UH_U32(dctop); DC = (DC + DC + 16) >> 5; } else { // no top, no left, nothing. DC = 0x80; } out = (v16u8)__msa_fill_b(DC); STORE16x16(out, dst); } static void Intra16Preds_MSA(uint8_t* dst, const uint8_t* left, const uint8_t* top) { DCMode16x16(I16DC16 + dst, left, top); VerticalPred16x16(I16VE16 + dst, top); HorizontalPred16x16(I16HE16 + dst, left); TrueMotion16x16(I16TM16 + dst, left, top); } // Chroma 8x8 prediction #define CALC_DC8(in, out) do { \ const v8u16 temp0 = __msa_hadd_u_h(in, in); \ const v4u32 temp1 = __msa_hadd_u_w(temp0, temp0); \ const v2i64 temp2 = (v2i64)__msa_hadd_u_d(temp1, temp1); \ const v2i64 temp3 = __msa_splati_d(temp2, 1); \ const v2i64 temp4 = temp3 + temp2; \ const v16i8 temp5 = (v16i8)__msa_srari_d(temp4, 4); \ const v2i64 temp6 = (v2i64)__msa_splati_b(temp5, 0); \ out = __msa_copy_s_d(temp6, 0); \ } while (0) #define STORE8x8(out, dst) do { \ SD4(out, out, out, out, dst + 0 * BPS, BPS); \ SD4(out, out, out, out, dst + 4 * BPS, BPS); \ } while (0) static WEBP_INLINE void VerticalPred8x8(uint8_t* dst, const uint8_t* top) { if (top != NULL) { const uint64_t out = LD(top); STORE8x8(out, dst); } else { const uint64_t out = 0x7f7f7f7f7f7f7f7fULL; STORE8x8(out, dst); } } static WEBP_INLINE void HorizontalPred8x8(uint8_t* dst, const uint8_t* left) { if (left != NULL) { int j; for (j = 0; j < 8; j += 4) { const v16u8 L0 = (v16u8)__msa_fill_b(left[0]); const v16u8 L1 = (v16u8)__msa_fill_b(left[1]); const v16u8 L2 = (v16u8)__msa_fill_b(left[2]); const v16u8 L3 = (v16u8)__msa_fill_b(left[3]); const uint64_t out0 = __msa_copy_s_d((v2i64)L0, 0); const uint64_t out1 = __msa_copy_s_d((v2i64)L1, 0); const uint64_t out2 = __msa_copy_s_d((v2i64)L2, 0); const uint64_t out3 = __msa_copy_s_d((v2i64)L3, 0); SD4(out0, out1, out2, out3, dst, BPS); dst += 4 * BPS; left += 4; } } else { const uint64_t out = 0x8181818181818181ULL; STORE8x8(out, dst); } } static WEBP_INLINE void TrueMotion8x8(uint8_t* dst, const uint8_t* left, const uint8_t* top) { if (left != NULL) { if (top != NULL) { int j; const v8i16 TL = (v8i16)__msa_fill_h(left[-1]); const v16u8 T1 = LD_UB(top); const v16i8 zero = { 0 }; const v8i16 T = (v8i16)__msa_ilvr_b(zero, (v16i8)T1); const v8i16 d = T - TL; for (j = 0; j < 8; j += 4) { uint64_t out0, out1, out2, out3; v16i8 t0, t1; v8i16 r0 = (v8i16)__msa_fill_h(left[j + 0]); v8i16 r1 = (v8i16)__msa_fill_h(left[j + 1]); v8i16 r2 = (v8i16)__msa_fill_h(left[j + 2]); v8i16 r3 = (v8i16)__msa_fill_h(left[j + 3]); ADD4(d, r0, d, r1, d, r2, d, r3, r0, r1, r2, r3); CLIP_SH4_0_255(r0, r1, r2, r3); PCKEV_B2_SB(r1, r0, r3, r2, t0, t1); out0 = __msa_copy_s_d((v2i64)t0, 0); out1 = __msa_copy_s_d((v2i64)t0, 1); out2 = __msa_copy_s_d((v2i64)t1, 0); out3 = __msa_copy_s_d((v2i64)t1, 1); SD4(out0, out1, out2, out3, dst, BPS); dst += 4 * BPS; } } else { HorizontalPred8x8(dst, left); } } else { if (top != NULL) { VerticalPred8x8(dst, top); } else { const uint64_t out = 0x8181818181818181ULL; STORE8x8(out, dst); } } } static WEBP_INLINE void DCMode8x8(uint8_t* dst, const uint8_t* left, const uint8_t* top) { uint64_t out; v16u8 src = { 0 }; if (top != NULL && left != NULL) { const uint64_t left_m = LD(left); const uint64_t top_m = LD(top); INSERT_D2_UB(left_m, top_m, src); CALC_DC8(src, out); } else if (left != NULL) { // left but no top const uint64_t left_m = LD(left); INSERT_D2_UB(left_m, left_m, src); CALC_DC8(src, out); } else if (top != NULL) { // top but no left const uint64_t top_m = LD(top); INSERT_D2_UB(top_m, top_m, src); CALC_DC8(src, out); } else { // no top, no left, nothing. src = (v16u8)__msa_fill_b(0x80); out = __msa_copy_s_d((v2i64)src, 0); } STORE8x8(out, dst); } static void IntraChromaPreds_MSA(uint8_t* dst, const uint8_t* left, const uint8_t* top) { // U block DCMode8x8(C8DC8 + dst, left, top); VerticalPred8x8(C8VE8 + dst, top); HorizontalPred8x8(C8HE8 + dst, left); TrueMotion8x8(C8TM8 + dst, left, top); // V block dst += 8; if (top != NULL) top += 8; if (left != NULL) left += 16; DCMode8x8(C8DC8 + dst, left, top); VerticalPred8x8(C8VE8 + dst, top); HorizontalPred8x8(C8HE8 + dst, left); TrueMotion8x8(C8TM8 + dst, left, top); } //------------------------------------------------------------------------------ // Metric #define PACK_DOTP_UB4_SW(in0, in1, in2, in3, out0, out1, out2, out3) do { \ v16u8 tmp0, tmp1; \ v8i16 tmp2, tmp3; \ ILVRL_B2_UB(in0, in1, tmp0, tmp1); \ HSUB_UB2_SH(tmp0, tmp1, tmp2, tmp3); \ DOTP_SH2_SW(tmp2, tmp3, tmp2, tmp3, out0, out1); \ ILVRL_B2_UB(in2, in3, tmp0, tmp1); \ HSUB_UB2_SH(tmp0, tmp1, tmp2, tmp3); \ DOTP_SH2_SW(tmp2, tmp3, tmp2, tmp3, out2, out3); \ } while (0) #define PACK_DPADD_UB4_SW(in0, in1, in2, in3, out0, out1, out2, out3) do { \ v16u8 tmp0, tmp1; \ v8i16 tmp2, tmp3; \ ILVRL_B2_UB(in0, in1, tmp0, tmp1); \ HSUB_UB2_SH(tmp0, tmp1, tmp2, tmp3); \ DPADD_SH2_SW(tmp2, tmp3, tmp2, tmp3, out0, out1); \ ILVRL_B2_UB(in2, in3, tmp0, tmp1); \ HSUB_UB2_SH(tmp0, tmp1, tmp2, tmp3); \ DPADD_SH2_SW(tmp2, tmp3, tmp2, tmp3, out2, out3); \ } while (0) static int SSE16x16_MSA(const uint8_t* a, const uint8_t* b) { uint32_t sum; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; v16u8 ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7; v4i32 out0, out1, out2, out3; LD_UB8(a, BPS, src0, src1, src2, src3, src4, src5, src6, src7); LD_UB8(b, BPS, ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7); PACK_DOTP_UB4_SW(src0, ref0, src1, ref1, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src2, ref2, src3, ref3, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src4, ref4, src5, ref5, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src6, ref6, src7, ref7, out0, out1, out2, out3); a += 8 * BPS; b += 8 * BPS; LD_UB8(a, BPS, src0, src1, src2, src3, src4, src5, src6, src7); LD_UB8(b, BPS, ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7); PACK_DPADD_UB4_SW(src0, ref0, src1, ref1, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src2, ref2, src3, ref3, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src4, ref4, src5, ref5, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src6, ref6, src7, ref7, out0, out1, out2, out3); out0 += out1; out2 += out3; out0 += out2; sum = HADD_SW_S32(out0); return sum; } static int SSE16x8_MSA(const uint8_t* a, const uint8_t* b) { uint32_t sum; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; v16u8 ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7; v4i32 out0, out1, out2, out3; LD_UB8(a, BPS, src0, src1, src2, src3, src4, src5, src6, src7); LD_UB8(b, BPS, ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7); PACK_DOTP_UB4_SW(src0, ref0, src1, ref1, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src2, ref2, src3, ref3, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src4, ref4, src5, ref5, out0, out1, out2, out3); PACK_DPADD_UB4_SW(src6, ref6, src7, ref7, out0, out1, out2, out3); out0 += out1; out2 += out3; out0 += out2; sum = HADD_SW_S32(out0); return sum; } static int SSE8x8_MSA(const uint8_t* a, const uint8_t* b) { uint32_t sum; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; v16u8 ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7; v16u8 t0, t1, t2, t3; v4i32 out0, out1, out2, out3; LD_UB8(a, BPS, src0, src1, src2, src3, src4, src5, src6, src7); LD_UB8(b, BPS, ref0, ref1, ref2, ref3, ref4, ref5, ref6, ref7); ILVR_B4_UB(src0, src1, src2, src3, ref0, ref1, ref2, ref3, t0, t1, t2, t3); PACK_DOTP_UB4_SW(t0, t2, t1, t3, out0, out1, out2, out3); ILVR_B4_UB(src4, src5, src6, src7, ref4, ref5, ref6, ref7, t0, t1, t2, t3); PACK_DPADD_UB4_SW(t0, t2, t1, t3, out0, out1, out2, out3); out0 += out1; out2 += out3; out0 += out2; sum = HADD_SW_S32(out0); return sum; } static int SSE4x4_MSA(const uint8_t* a, const uint8_t* b) { uint32_t sum = 0; uint32_t src0, src1, src2, src3, ref0, ref1, ref2, ref3; v16u8 src = { 0 }, ref = { 0 }, tmp0, tmp1; v8i16 diff0, diff1; v4i32 out0, out1; LW4(a, BPS, src0, src1, src2, src3); LW4(b, BPS, ref0, ref1, ref2, ref3); INSERT_W4_UB(src0, src1, src2, src3, src); INSERT_W4_UB(ref0, ref1, ref2, ref3, ref); ILVRL_B2_UB(src, ref, tmp0, tmp1); HSUB_UB2_SH(tmp0, tmp1, diff0, diff1); DOTP_SH2_SW(diff0, diff1, diff0, diff1, out0, out1); out0 += out1; sum = HADD_SW_S32(out0); return sum; } //------------------------------------------------------------------------------ // Quantization static int QuantizeBlock_MSA(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { int sum; v8i16 in0, in1, sh0, sh1, out0, out1; v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, sign0, sign1; v4i32 s0, s1, s2, s3, b0, b1, b2, b3, t0, t1, t2, t3; const v8i16 zero = { 0 }; const v8i16 zigzag0 = { 0, 1, 4, 8, 5, 2, 3, 6 }; const v8i16 zigzag1 = { 9, 12, 13, 10, 7, 11, 14, 15 }; const v8i16 maxlevel = __msa_fill_h(MAX_LEVEL); LD_SH2(&in[0], 8, in0, in1); LD_SH2(&mtx->sharpen_[0], 8, sh0, sh1); tmp4 = __msa_add_a_h(in0, zero); tmp5 = __msa_add_a_h(in1, zero); ILVRL_H2_SH(sh0, tmp4, tmp0, tmp1); ILVRL_H2_SH(sh1, tmp5, tmp2, tmp3); HADD_SH4_SW(tmp0, tmp1, tmp2, tmp3, s0, s1, s2, s3); sign0 = (in0 < zero); sign1 = (in1 < zero); // sign LD_SH2(&mtx->iq_[0], 8, tmp0, tmp1); // iq ILVRL_H2_SW(zero, tmp0, t0, t1); ILVRL_H2_SW(zero, tmp1, t2, t3); LD_SW4(&mtx->bias_[0], 4, b0, b1, b2, b3); // bias MUL4(t0, s0, t1, s1, t2, s2, t3, s3, t0, t1, t2, t3); ADD4(b0, t0, b1, t1, b2, t2, b3, t3, b0, b1, b2, b3); SRAI_W4_SW(b0, b1, b2, b3, 17); PCKEV_H2_SH(b1, b0, b3, b2, tmp2, tmp3); tmp0 = (tmp2 > maxlevel); tmp1 = (tmp3 > maxlevel); tmp2 = (v8i16)__msa_bmnz_v((v16u8)tmp2, (v16u8)maxlevel, (v16u8)tmp0); tmp3 = (v8i16)__msa_bmnz_v((v16u8)tmp3, (v16u8)maxlevel, (v16u8)tmp1); SUB2(zero, tmp2, zero, tmp3, tmp0, tmp1); tmp2 = (v8i16)__msa_bmnz_v((v16u8)tmp2, (v16u8)tmp0, (v16u8)sign0); tmp3 = (v8i16)__msa_bmnz_v((v16u8)tmp3, (v16u8)tmp1, (v16u8)sign1); LD_SW4(&mtx->zthresh_[0], 4, t0, t1, t2, t3); // zthresh t0 = (s0 > t0); t1 = (s1 > t1); t2 = (s2 > t2); t3 = (s3 > t3); PCKEV_H2_SH(t1, t0, t3, t2, tmp0, tmp1); tmp4 = (v8i16)__msa_bmnz_v((v16u8)zero, (v16u8)tmp2, (v16u8)tmp0); tmp5 = (v8i16)__msa_bmnz_v((v16u8)zero, (v16u8)tmp3, (v16u8)tmp1); LD_SH2(&mtx->q_[0], 8, tmp0, tmp1); MUL2(tmp4, tmp0, tmp5, tmp1, in0, in1); VSHF_H2_SH(tmp4, tmp5, tmp4, tmp5, zigzag0, zigzag1, out0, out1); ST_SH2(in0, in1, &in[0], 8); ST_SH2(out0, out1, &out[0], 8); out0 = __msa_add_a_h(out0, out1); sum = HADD_SH_S32(out0); return (sum > 0); } static int Quantize2Blocks_MSA(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; nz = VP8EncQuantizeBlock(in + 0 * 16, out + 0 * 16, mtx) << 0; nz |= VP8EncQuantizeBlock(in + 1 * 16, out + 1 * 16, mtx) << 1; return nz; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitMSA(void) { VP8ITransform = ITransform_MSA; VP8FTransform = FTransform_MSA; VP8FTransformWHT = FTransformWHT_MSA; VP8TDisto4x4 = Disto4x4_MSA; VP8TDisto16x16 = Disto16x16_MSA; VP8CollectHistogram = CollectHistogram_MSA; VP8EncPredLuma4 = Intra4Preds_MSA; VP8EncPredLuma16 = Intra16Preds_MSA; VP8EncPredChroma8 = IntraChromaPreds_MSA; VP8SSE16x16 = SSE16x16_MSA; VP8SSE16x8 = SSE16x8_MSA; VP8SSE8x8 = SSE8x8_MSA; VP8SSE4x4 = SSE4x4_MSA; VP8EncQuantizeBlock = QuantizeBlock_MSA; VP8EncQuantize2Blocks = Quantize2Blocks_MSA; VP8EncQuantizeBlockWHT = QuantizeBlock_MSA; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(VP8EncDspInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/quant.h0000644000014400001440000000510714606317060012734 0ustar // Copyright 2018 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- #ifndef WEBP_DSP_QUANT_H_ #define WEBP_DSP_QUANT_H_ #include #include "src/dsp/dsp.h" #include "src/webp/types.h" #if defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) && \ !defined(WEBP_HAVE_NEON_RTCD) #include #define IsFlat IsFlat_NEON static uint32_t horizontal_add_uint32x4(const uint32x4_t a) { #if WEBP_AARCH64 return vaddvq_u32(a); #else const uint64x2_t b = vpaddlq_u32(a); const uint32x2_t c = vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)), vreinterpret_u32_u64(vget_high_u64(b))); return vget_lane_u32(c, 0); #endif } static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks, int thresh) { const int16x8_t tst_ones = vdupq_n_s16(-1); uint32x4_t sum = vdupq_n_u32(0); int i; for (i = 0; i < num_blocks; ++i) { // Set DC to zero. const int16x8_t a_0 = vsetq_lane_s16(0, vld1q_s16(levels), 0); const int16x8_t a_1 = vld1q_s16(levels + 8); const uint16x8_t b_0 = vshrq_n_u16(vtstq_s16(a_0, tst_ones), 15); const uint16x8_t b_1 = vshrq_n_u16(vtstq_s16(a_1, tst_ones), 15); sum = vpadalq_u16(sum, b_0); sum = vpadalq_u16(sum, b_1); levels += 16; } return thresh >= (int)horizontal_add_uint32x4(sum); } #else #define IsFlat IsFlat_C static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks, int thresh) { int score = 0; while (num_blocks-- > 0) { // TODO(skal): refine positional scoring? int i; for (i = 1; i < 16; ++i) { // omit DC, we're only interested in AC score += (levels[i] != 0); if (score > thresh) return 0; } levels += 16; } return 1; } #endif // defined(WEBP_USE_NEON) && !defined(WEBP_ANDROID_NEON) && // !defined(WEBP_HAVE_NEON_RTCD) static WEBP_INLINE int IsFlatSource16(const uint8_t* src) { const uint32_t v = src[0] * 0x01010101u; int i; for (i = 0; i < 16; ++i) { if (memcmp(src + 0, &v, 4) || memcmp(src + 4, &v, 4) || memcmp(src + 8, &v, 4) || memcmp(src + 12, &v, 4)) { return 0; } src += BPS; } return 1; } #endif // WEBP_DSP_QUANT_H_ libwebp-1.4.0/src/dsp/cpu.c0000644000014400001440000001666314606317060012377 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // CPU detection // // Author: Christian Duvivier (cduvivier@google.com) #include "src/dsp/cpu.h" #if defined(WEBP_HAVE_NEON_RTCD) #include #include #endif #if defined(WEBP_ANDROID_NEON) #include #endif //------------------------------------------------------------------------------ // SSE2 detection. // // apple/darwin gcc-4.0.1 defines __PIC__, but not __pic__ with -fPIC. #if (defined(__pic__) || defined(__PIC__)) && defined(__i386__) static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) { __asm__ volatile ( "mov %%ebx, %%edi\n" "cpuid\n" "xchg %%edi, %%ebx\n" : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) : "a"(info_type), "c"(0)); } #elif defined(__i386__) || defined(__x86_64__) static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) { __asm__ volatile ( "cpuid\n" : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3]) : "a"(info_type), "c"(0)); } #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 150030729 // >= VS2008 SP1 #include #define GetCPUInfo(info, type) __cpuidex(info, type, 0) // set ecx=0 #define WEBP_HAVE_MSC_CPUID #elif _MSC_VER > 1310 #include #define GetCPUInfo __cpuid #define WEBP_HAVE_MSC_CPUID #endif #endif // NaCl has no support for xgetbv or the raw opcode. #if !defined(__native_client__) && (defined(__i386__) || defined(__x86_64__)) static WEBP_INLINE uint64_t xgetbv(void) { const uint32_t ecx = 0; uint32_t eax, edx; // Use the raw opcode for xgetbv for compatibility with older toolchains. __asm__ volatile ( ".byte 0x0f, 0x01, 0xd0\n" : "=a"(eax), "=d"(edx) : "c" (ecx)); return ((uint64_t)edx << 32) | eax; } #elif (defined(_M_X64) || defined(_M_IX86)) && \ defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 160040219 // >= VS2010 SP1 #include #define xgetbv() _xgetbv(0) #elif defined(_MSC_VER) && defined(_M_IX86) static WEBP_INLINE uint64_t xgetbv(void) { uint32_t eax_, edx_; __asm { xor ecx, ecx // ecx = 0 // Use the raw opcode for xgetbv for compatibility with older toolchains. __asm _emit 0x0f __asm _emit 0x01 __asm _emit 0xd0 mov eax_, eax mov edx_, edx } return ((uint64_t)edx_ << 32) | eax_; } #else #define xgetbv() 0U // no AVX for older x64 or unrecognized toolchains. #endif #if defined(__i386__) || defined(__x86_64__) || defined(WEBP_HAVE_MSC_CPUID) // helper function for run-time detection of slow SSSE3 platforms static int CheckSlowModel(int info) { // Table listing display models with longer latencies for the bsr instruction // (ie 2 cycles vs 10/16 cycles) and some SSSE3 instructions like pshufb. // Refer to Intel 64 and IA-32 Architectures Optimization Reference Manual. static const uint8_t kSlowModels[] = { 0x37, 0x4a, 0x4d, // Silvermont Microarchitecture 0x1c, 0x26, 0x27 // Atom Microarchitecture }; const uint32_t model = ((info & 0xf0000) >> 12) | ((info >> 4) & 0xf); const uint32_t family = (info >> 8) & 0xf; if (family == 0x06) { size_t i; for (i = 0; i < sizeof(kSlowModels) / sizeof(kSlowModels[0]); ++i) { if (model == kSlowModels[i]) return 1; } } return 0; } static int x86CPUInfo(CPUFeature feature) { int max_cpuid_value; int cpu_info[4]; int is_intel = 0; // get the highest feature value cpuid supports GetCPUInfo(cpu_info, 0); max_cpuid_value = cpu_info[0]; if (max_cpuid_value < 1) { return 0; } else { const int VENDOR_ID_INTEL_EBX = 0x756e6547; // uneG const int VENDOR_ID_INTEL_EDX = 0x49656e69; // Ieni const int VENDOR_ID_INTEL_ECX = 0x6c65746e; // letn is_intel = (cpu_info[1] == VENDOR_ID_INTEL_EBX && cpu_info[2] == VENDOR_ID_INTEL_ECX && cpu_info[3] == VENDOR_ID_INTEL_EDX); // genuine Intel? } GetCPUInfo(cpu_info, 1); if (feature == kSSE2) { return !!(cpu_info[3] & (1 << 26)); } if (feature == kSSE3) { return !!(cpu_info[2] & (1 << 0)); } if (feature == kSlowSSSE3) { if (is_intel && (cpu_info[2] & (1 << 9))) { // SSSE3? return CheckSlowModel(cpu_info[0]); } return 0; } if (feature == kSSE4_1) { return !!(cpu_info[2] & (1 << 19)); } if (feature == kAVX) { // bits 27 (OSXSAVE) & 28 (256-bit AVX) if ((cpu_info[2] & 0x18000000) == 0x18000000) { // XMM state and YMM state enabled by the OS. return (xgetbv() & 0x6) == 0x6; } } if (feature == kAVX2) { if (x86CPUInfo(kAVX) && max_cpuid_value >= 7) { GetCPUInfo(cpu_info, 7); return !!(cpu_info[1] & (1 << 5)); } } return 0; } WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = x86CPUInfo; #elif defined(WEBP_ANDROID_NEON) // NB: needs to be before generic NEON test. static int AndroidCPUInfo(CPUFeature feature) { const AndroidCpuFamily cpu_family = android_getCpuFamily(); const uint64_t cpu_features = android_getCpuFeatures(); if (feature == kNEON) { return cpu_family == ANDROID_CPU_FAMILY_ARM && (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) != 0; } return 0; } WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = AndroidCPUInfo; #elif defined(EMSCRIPTEN) // also needs to be before generic NEON test // Use compile flags as an indicator of SIMD support instead of a runtime check. static int wasmCPUInfo(CPUFeature feature) { switch (feature) { #ifdef WEBP_HAVE_SSE2 case kSSE2: return 1; #endif #ifdef WEBP_HAVE_SSE41 case kSSE3: case kSlowSSSE3: case kSSE4_1: return 1; #endif #ifdef WEBP_HAVE_NEON case kNEON: return 1; #endif default: break; } return 0; } WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo; #elif defined(WEBP_HAVE_NEON) // In most cases this function doesn't check for NEON support (it's assumed by // the configuration), but enables turning off NEON at runtime, for testing // purposes, by setting VP8GetCPUInfo = NULL. static int armCPUInfo(CPUFeature feature) { if (feature != kNEON) return 0; #if defined(__linux__) && defined(WEBP_HAVE_NEON_RTCD) { int has_neon = 0; char line[200]; FILE* const cpuinfo = fopen("/proc/cpuinfo", "r"); if (cpuinfo == NULL) return 0; while (fgets(line, sizeof(line), cpuinfo)) { if (!strncmp(line, "Features", 8)) { if (strstr(line, " neon ") != NULL) { has_neon = 1; break; } } } fclose(cpuinfo); return has_neon; } #else return 1; #endif } WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = armCPUInfo; #elif defined(WEBP_USE_MIPS32) || defined(WEBP_USE_MIPS_DSP_R2) || \ defined(WEBP_USE_MSA) static int mipsCPUInfo(CPUFeature feature) { if ((feature == kMIPS32) || (feature == kMIPSdspR2) || (feature == kMSA)) { return 1; } else { return 0; } } WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = mipsCPUInfo; #else WEBP_EXTERN VP8CPUInfo VP8GetCPUInfo; VP8CPUInfo VP8GetCPUInfo = NULL; #endif libwebp-1.4.0/src/dsp/upsampling.c0000644000014400001440000003470514606317060013764 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV to RGB upsampling functions. // // Author: somnath@google.com (Somnath Banerjee) #include "src/dsp/dsp.h" #include "src/dsp/yuv.h" #include //------------------------------------------------------------------------------ // Fancy upsampler #ifdef FANCY_UPSAMPLING // Fancy upsampling functions to convert YUV to RGB WebPUpsampleLinePairFunc WebPUpsamplers[MODE_LAST]; // Given samples laid out in a square as: // [a b] // [c d] // we interpolate u/v as: // ([9*a + 3*b + 3*c + d 3*a + 9*b + 3*c + d] + [8 8]) / 16 // ([3*a + b + 9*c + 3*d a + 3*b + 3*c + 9*d] [8 8]) / 16 // We process u and v together stashed into 32bit (16bit each). #define LOAD_UV(u, v) ((u) | ((v) << 16)) #define UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ int x; \ const int last_pixel_pair = (len - 1) >> 1; \ uint32_t tl_uv = LOAD_UV(top_u[0], top_v[0]); /* top-left sample */ \ uint32_t l_uv = LOAD_UV(cur_u[0], cur_v[0]); /* left-sample */ \ assert(top_y != NULL); \ { \ const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ FUNC(bottom_y[0], uv0 & 0xff, (uv0 >> 16), bottom_dst); \ } \ for (x = 1; x <= last_pixel_pair; ++x) { \ const uint32_t t_uv = LOAD_UV(top_u[x], top_v[x]); /* top sample */ \ const uint32_t uv = LOAD_UV(cur_u[x], cur_v[x]); /* sample */ \ /* precompute invariant values associated with first and second diagonals*/\ const uint32_t avg = tl_uv + t_uv + l_uv + uv + 0x00080008u; \ const uint32_t diag_12 = (avg + 2 * (t_uv + l_uv)) >> 3; \ const uint32_t diag_03 = (avg + 2 * (tl_uv + uv)) >> 3; \ { \ const uint32_t uv0 = (diag_12 + tl_uv) >> 1; \ const uint32_t uv1 = (diag_03 + t_uv) >> 1; \ FUNC(top_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ top_dst + (2 * x - 1) * (XSTEP)); \ FUNC(top_y[2 * x - 0], uv1 & 0xff, (uv1 >> 16), \ top_dst + (2 * x - 0) * (XSTEP)); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (diag_03 + l_uv) >> 1; \ const uint32_t uv1 = (diag_12 + uv) >> 1; \ FUNC(bottom_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ bottom_dst + (2 * x - 1) * (XSTEP)); \ FUNC(bottom_y[2 * x + 0], uv1 & 0xff, (uv1 >> 16), \ bottom_dst + (2 * x + 0) * (XSTEP)); \ } \ tl_uv = t_uv; \ l_uv = uv; \ } \ if (!(len & 1)) { \ { \ const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ FUNC(top_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ top_dst + (len - 1) * (XSTEP)); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ FUNC(bottom_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ bottom_dst + (len - 1) * (XSTEP)); \ } \ } \ } // All variants implemented. #if !WEBP_NEON_OMIT_C_CODE UPSAMPLE_FUNC(UpsampleRgbaLinePair_C, VP8YuvToRgba, 4) UPSAMPLE_FUNC(UpsampleBgraLinePair_C, VP8YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) UPSAMPLE_FUNC(UpsampleArgbLinePair_C, VP8YuvToArgb, 4) UPSAMPLE_FUNC(UpsampleRgbLinePair_C, VP8YuvToRgb, 3) UPSAMPLE_FUNC(UpsampleBgrLinePair_C, VP8YuvToBgr, 3) UPSAMPLE_FUNC(UpsampleRgba4444LinePair_C, VP8YuvToRgba4444, 2) UPSAMPLE_FUNC(UpsampleRgb565LinePair_C, VP8YuvToRgb565, 2) #else static void EmptyUpsampleFunc(const uint8_t* top_y, const uint8_t* bottom_y, const uint8_t* top_u, const uint8_t* top_v, const uint8_t* cur_u, const uint8_t* cur_v, uint8_t* top_dst, uint8_t* bottom_dst, int len) { (void)top_y; (void)bottom_y; (void)top_u; (void)top_v; (void)cur_u; (void)cur_v; (void)top_dst; (void)bottom_dst; (void)len; assert(0); // COLORSPACE SUPPORT NOT COMPILED } #define UpsampleArgbLinePair_C EmptyUpsampleFunc #define UpsampleRgbLinePair_C EmptyUpsampleFunc #define UpsampleBgrLinePair_C EmptyUpsampleFunc #define UpsampleRgba4444LinePair_C EmptyUpsampleFunc #define UpsampleRgb565LinePair_C EmptyUpsampleFunc #endif // WEBP_REDUCE_CSP #endif #undef LOAD_UV #undef UPSAMPLE_FUNC #endif // FANCY_UPSAMPLING //------------------------------------------------------------------------------ #if !defined(FANCY_UPSAMPLING) #define DUAL_SAMPLE_FUNC(FUNC_NAME, FUNC) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* bot_u, const uint8_t* bot_v, \ uint8_t* top_dst, uint8_t* bot_dst, int len) { \ const int half_len = len >> 1; \ int x; \ assert(top_dst != NULL); \ { \ for (x = 0; x < half_len; ++x) { \ FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x + 0); \ FUNC(top_y[2 * x + 1], top_u[x], top_v[x], top_dst + 8 * x + 4); \ } \ if (len & 1) FUNC(top_y[2 * x + 0], top_u[x], top_v[x], top_dst + 8 * x); \ } \ if (bot_dst != NULL) { \ for (x = 0; x < half_len; ++x) { \ FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x + 0); \ FUNC(bot_y[2 * x + 1], bot_u[x], bot_v[x], bot_dst + 8 * x + 4); \ } \ if (len & 1) FUNC(bot_y[2 * x + 0], bot_u[x], bot_v[x], bot_dst + 8 * x); \ } \ } DUAL_SAMPLE_FUNC(DualLineSamplerBGRA, VP8YuvToBgra) DUAL_SAMPLE_FUNC(DualLineSamplerARGB, VP8YuvToArgb) #undef DUAL_SAMPLE_FUNC #endif // !FANCY_UPSAMPLING WebPUpsampleLinePairFunc WebPGetLinePairConverter(int alpha_is_last) { WebPInitUpsamplers(); #ifdef FANCY_UPSAMPLING return WebPUpsamplers[alpha_is_last ? MODE_BGRA : MODE_ARGB]; #else return (alpha_is_last ? DualLineSamplerBGRA : DualLineSamplerARGB); #endif } //------------------------------------------------------------------------------ // YUV444 converter #define YUV444_FUNC(FUNC_NAME, FUNC, XSTEP) \ extern void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len); \ void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i; \ for (i = 0; i < len; ++i) FUNC(y[i], u[i], v[i], &dst[i * (XSTEP)]); \ } YUV444_FUNC(WebPYuv444ToRgba_C, VP8YuvToRgba, 4) YUV444_FUNC(WebPYuv444ToBgra_C, VP8YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) YUV444_FUNC(WebPYuv444ToRgb_C, VP8YuvToRgb, 3) YUV444_FUNC(WebPYuv444ToBgr_C, VP8YuvToBgr, 3) YUV444_FUNC(WebPYuv444ToArgb_C, VP8YuvToArgb, 4) YUV444_FUNC(WebPYuv444ToRgba4444_C, VP8YuvToRgba4444, 2) YUV444_FUNC(WebPYuv444ToRgb565_C, VP8YuvToRgb565, 2) #else static void EmptyYuv444Func(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { (void)y; (void)u; (void)v; (void)dst; (void)len; } #define WebPYuv444ToRgb_C EmptyYuv444Func #define WebPYuv444ToBgr_C EmptyYuv444Func #define WebPYuv444ToArgb_C EmptyYuv444Func #define WebPYuv444ToRgba4444_C EmptyYuv444Func #define WebPYuv444ToRgb565_C EmptyYuv444Func #endif // WEBP_REDUCE_CSP #undef YUV444_FUNC WebPYUV444Converter WebPYUV444Converters[MODE_LAST]; extern VP8CPUInfo VP8GetCPUInfo; extern void WebPInitYUV444ConvertersMIPSdspR2(void); extern void WebPInitYUV444ConvertersSSE2(void); extern void WebPInitYUV444ConvertersSSE41(void); WEBP_DSP_INIT_FUNC(WebPInitYUV444Converters) { WebPYUV444Converters[MODE_RGBA] = WebPYuv444ToRgba_C; WebPYUV444Converters[MODE_BGRA] = WebPYuv444ToBgra_C; WebPYUV444Converters[MODE_RGB] = WebPYuv444ToRgb_C; WebPYUV444Converters[MODE_BGR] = WebPYuv444ToBgr_C; WebPYUV444Converters[MODE_ARGB] = WebPYuv444ToArgb_C; WebPYUV444Converters[MODE_RGBA_4444] = WebPYuv444ToRgba4444_C; WebPYUV444Converters[MODE_RGB_565] = WebPYuv444ToRgb565_C; WebPYUV444Converters[MODE_rgbA] = WebPYuv444ToRgba_C; WebPYUV444Converters[MODE_bgrA] = WebPYuv444ToBgra_C; WebPYUV444Converters[MODE_Argb] = WebPYuv444ToArgb_C; WebPYUV444Converters[MODE_rgbA_4444] = WebPYuv444ToRgba4444_C; if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPInitYUV444ConvertersSSE2(); } #endif #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { WebPInitYUV444ConvertersSSE41(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { WebPInitYUV444ConvertersMIPSdspR2(); } #endif } } //------------------------------------------------------------------------------ // Main calls extern void WebPInitUpsamplersSSE2(void); extern void WebPInitUpsamplersSSE41(void); extern void WebPInitUpsamplersNEON(void); extern void WebPInitUpsamplersMIPSdspR2(void); extern void WebPInitUpsamplersMSA(void); WEBP_DSP_INIT_FUNC(WebPInitUpsamplers) { #ifdef FANCY_UPSAMPLING #if !WEBP_NEON_OMIT_C_CODE WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair_C; WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair_C; WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair_C; WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair_C; WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair_C; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair_C; WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair_C; WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair_C; WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair_C; WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair_C; WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair_C; #endif // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPInitUpsamplersSSE2(); } #endif #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { WebPInitUpsamplersSSE41(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { WebPInitUpsamplersMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { WebPInitUpsamplersMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { WebPInitUpsamplersNEON(); } #endif assert(WebPUpsamplers[MODE_RGBA] != NULL); assert(WebPUpsamplers[MODE_BGRA] != NULL); assert(WebPUpsamplers[MODE_rgbA] != NULL); assert(WebPUpsamplers[MODE_bgrA] != NULL); #if !defined(WEBP_REDUCE_CSP) || !WEBP_NEON_OMIT_C_CODE assert(WebPUpsamplers[MODE_RGB] != NULL); assert(WebPUpsamplers[MODE_BGR] != NULL); assert(WebPUpsamplers[MODE_ARGB] != NULL); assert(WebPUpsamplers[MODE_RGBA_4444] != NULL); assert(WebPUpsamplers[MODE_RGB_565] != NULL); assert(WebPUpsamplers[MODE_Argb] != NULL); assert(WebPUpsamplers[MODE_rgbA_4444] != NULL); #endif #endif // FANCY_UPSAMPLING } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dsp/lossless_common.h0000644000014400001440000001633614606317060015031 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transforms and color space conversion methods for lossless decoder. // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) // Vincent Rabaud (vrabaud@google.com) #ifndef WEBP_DSP_LOSSLESS_COMMON_H_ #define WEBP_DSP_LOSSLESS_COMMON_H_ #include "src/dsp/cpu.h" #include "src/utils/utils.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Decoding // color mapping related functions. static WEBP_INLINE uint32_t VP8GetARGBIndex(uint32_t idx) { return (idx >> 8) & 0xff; } static WEBP_INLINE uint8_t VP8GetAlphaIndex(uint8_t idx) { return idx; } static WEBP_INLINE uint32_t VP8GetARGBValue(uint32_t val) { return val; } static WEBP_INLINE uint8_t VP8GetAlphaValue(uint32_t val) { return (val >> 8) & 0xff; } //------------------------------------------------------------------------------ // Misc methods. // Computes sampled size of 'size' when sampling using 'sampling bits'. static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size, uint32_t sampling_bits) { return (size + (1 << sampling_bits) - 1) >> sampling_bits; } // Converts near lossless quality into max number of bits shaved off. static WEBP_INLINE int VP8LNearLosslessBits(int near_lossless_quality) { // 100 -> 0 // 80..99 -> 1 // 60..79 -> 2 // 40..59 -> 3 // 20..39 -> 4 // 0..19 -> 5 return 5 - near_lossless_quality / 20; } // ----------------------------------------------------------------------------- // Faster logarithm for integers. Small values use a look-up table. // The threshold till approximate version of log_2 can be used. // Practically, we can get rid of the call to log() as the two values match to // very high degree (the ratio of these two is 0.99999x). // Keeping a high threshold for now. #define APPROX_LOG_WITH_CORRECTION_MAX 65536 #define APPROX_LOG_MAX 4096 #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086 #define LOG_LOOKUP_IDX_MAX 256 extern const float kLog2Table[LOG_LOOKUP_IDX_MAX]; extern const float kSLog2Table[LOG_LOOKUP_IDX_MAX]; typedef float (*VP8LFastLog2SlowFunc)(uint32_t v); extern VP8LFastLog2SlowFunc VP8LFastLog2Slow; extern VP8LFastLog2SlowFunc VP8LFastSLog2Slow; static WEBP_INLINE float VP8LFastLog2(uint32_t v) { return (v < LOG_LOOKUP_IDX_MAX) ? kLog2Table[v] : VP8LFastLog2Slow(v); } // Fast calculation of v * log2(v) for integer input. static WEBP_INLINE float VP8LFastSLog2(uint32_t v) { return (v < LOG_LOOKUP_IDX_MAX) ? kSLog2Table[v] : VP8LFastSLog2Slow(v); } // ----------------------------------------------------------------------------- // PrefixEncode() // Splitting of distance and length codes into prefixes and // extra bits. The prefixes are encoded with an entropy code // while the extra bits are stored just as normal bits. static WEBP_INLINE void VP8LPrefixEncodeBitsNoLUT(int distance, int* const code, int* const extra_bits) { const int highest_bit = BitsLog2Floor(--distance); const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; *extra_bits = highest_bit - 1; *code = 2 * highest_bit + second_highest_bit; } static WEBP_INLINE void VP8LPrefixEncodeNoLUT(int distance, int* const code, int* const extra_bits, int* const extra_bits_value) { const int highest_bit = BitsLog2Floor(--distance); const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; *extra_bits = highest_bit - 1; *extra_bits_value = distance & ((1 << *extra_bits) - 1); *code = 2 * highest_bit + second_highest_bit; } #define PREFIX_LOOKUP_IDX_MAX 512 typedef struct { int8_t code_; int8_t extra_bits_; } VP8LPrefixCode; // These tables are derived using VP8LPrefixEncodeNoLUT. extern const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX]; extern const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX]; static WEBP_INLINE void VP8LPrefixEncodeBits(int distance, int* const code, int* const extra_bits) { if (distance < PREFIX_LOOKUP_IDX_MAX) { const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; *code = prefix_code.code_; *extra_bits = prefix_code.extra_bits_; } else { VP8LPrefixEncodeBitsNoLUT(distance, code, extra_bits); } } static WEBP_INLINE void VP8LPrefixEncode(int distance, int* const code, int* const extra_bits, int* const extra_bits_value) { if (distance < PREFIX_LOOKUP_IDX_MAX) { const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; *code = prefix_code.code_; *extra_bits = prefix_code.extra_bits_; *extra_bits_value = kPrefixEncodeExtraBitsValue[distance]; } else { VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value); } } // Sum of each component, mod 256. static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE uint32_t VP8LAddPixels(uint32_t a, uint32_t b) { const uint32_t alpha_and_green = (a & 0xff00ff00u) + (b & 0xff00ff00u); const uint32_t red_and_blue = (a & 0x00ff00ffu) + (b & 0x00ff00ffu); return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); } // Difference of each component, mod 256. static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { const uint32_t alpha_and_green = 0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u); const uint32_t red_and_blue = 0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu); return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); } //------------------------------------------------------------------------------ // Transform-related functions used in both encoding and decoding. // Macros used to create a batch predictor that iteratively uses a // one-pixel predictor. // The predictor is added to the output pixel (which // is therefore considered as a residual) to get the final prediction. #define GENERATE_PREDICTOR_ADD(PREDICTOR, PREDICTOR_ADD) \ static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \ int num_pixels, uint32_t* out) { \ int x; \ assert(upper != NULL); \ for (x = 0; x < num_pixels; ++x) { \ const uint32_t pred = (PREDICTOR)(&out[x - 1], upper + x); \ out[x] = VP8LAddPixels(in[x], pred); \ } \ } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_LOSSLESS_COMMON_H_ libwebp-1.4.0/src/dsp/dec_mips_dsp_r2.c0000644000014400001440000014311614606317060014636 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of dsp functions // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/mips_macro.h" static const int kC1 = WEBP_TRANSFORM_AC3_C1; static const int kC2 = WEBP_TRANSFORM_AC3_C2; static void TransformDC(const int16_t* in, uint8_t* dst) { int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10; __asm__ volatile ( LOAD_WITH_OFFSET_X4(temp1, temp2, temp3, temp4, dst, 0, 0, 0, 0, 0, 1, 2, 3, BPS) "lh %[temp5], 0(%[in]) \n\t" "addiu %[temp5], %[temp5], 4 \n\t" "ins %[temp5], %[temp5], 16, 16 \n\t" "shra.ph %[temp5], %[temp5], 3 \n\t" CONVERT_2_BYTES_TO_HALF(temp6, temp7, temp8, temp9, temp10, temp1, temp2, temp3, temp1, temp2, temp3, temp4) STORE_SAT_SUM_X2(temp6, temp7, temp8, temp9, temp10, temp1, temp2, temp3, temp5, temp5, temp5, temp5, temp5, temp5, temp5, temp5, dst, 0, 1, 2, 3, BPS) OUTPUT_EARLY_CLOBBER_REGS_10() : [in]"r"(in), [dst]"r"(dst) : "memory" ); } static void TransformAC3(const int16_t* in, uint8_t* dst) { const int a = in[0] + 4; int c4 = WEBP_TRANSFORM_AC3_MUL2(in[4]); const int d4 = WEBP_TRANSFORM_AC3_MUL1(in[4]); const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]); const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]); int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18; __asm__ volatile ( "ins %[c4], %[d4], 16, 16 \n\t" "replv.ph %[temp1], %[a] \n\t" "replv.ph %[temp4], %[d1] \n\t" ADD_SUB_HALVES(temp2, temp3, temp1, c4) "replv.ph %[temp5], %[c1] \n\t" SHIFT_R_SUM_X2(temp1, temp6, temp7, temp8, temp2, temp9, temp10, temp4, temp2, temp2, temp3, temp3, temp4, temp5, temp4, temp5) LOAD_WITH_OFFSET_X4(temp3, temp5, temp11, temp12, dst, 0, 0, 0, 0, 0, 1, 2, 3, BPS) CONVERT_2_BYTES_TO_HALF(temp13, temp14, temp3, temp15, temp5, temp16, temp11, temp17, temp3, temp5, temp11, temp12) PACK_2_HALVES_TO_WORD(temp12, temp18, temp7, temp6, temp1, temp8, temp2, temp4, temp7, temp6, temp10, temp9) STORE_SAT_SUM_X2(temp13, temp14, temp3, temp15, temp5, temp16, temp11, temp17, temp12, temp18, temp1, temp8, temp2, temp4, temp7, temp6, dst, 0, 1, 2, 3, BPS) OUTPUT_EARLY_CLOBBER_REGS_18(), [c4]"+&r"(c4) : [dst]"r"(dst), [a]"r"(a), [d1]"r"(d1), [d4]"r"(d4), [c1]"r"(c1) : "memory" ); } static void TransformOne(const int16_t* in, uint8_t* dst) { int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18; __asm__ volatile ( "ulw %[temp1], 0(%[in]) \n\t" "ulw %[temp2], 16(%[in]) \n\t" LOAD_IN_X2(temp5, temp6, 24, 26) ADD_SUB_HALVES(temp3, temp4, temp1, temp2) LOAD_IN_X2(temp1, temp2, 8, 10) MUL_SHIFT_SUM(temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp10, temp8, temp9, temp7, temp1, temp2, temp5, temp6, temp13, temp11, temp14, temp12) INSERT_HALF_X2(temp8, temp7, temp10, temp9) "ulw %[temp17], 4(%[in]) \n\t" "ulw %[temp18], 20(%[in]) \n\t" ADD_SUB_HALVES(temp1, temp2, temp3, temp8) ADD_SUB_HALVES(temp5, temp6, temp4, temp7) ADD_SUB_HALVES(temp7, temp8, temp17, temp18) LOAD_IN_X2(temp17, temp18, 12, 14) LOAD_IN_X2(temp9, temp10, 28, 30) MUL_SHIFT_SUM(temp11, temp12, temp13, temp14, temp15, temp16, temp4, temp17, temp12, temp14, temp11, temp13, temp17, temp18, temp9, temp10, temp15, temp4, temp16, temp17) INSERT_HALF_X2(temp11, temp12, temp13, temp14) ADD_SUB_HALVES(temp17, temp8, temp8, temp11) ADD_SUB_HALVES(temp3, temp4, temp7, temp12) // horizontal SRA_16(temp9, temp10, temp11, temp12, temp1, temp2, temp5, temp6) INSERT_HALF_X2(temp1, temp6, temp5, temp2) SRA_16(temp13, temp14, temp15, temp16, temp3, temp4, temp17, temp8) "repl.ph %[temp2], 0x4 \n\t" INSERT_HALF_X2(temp3, temp8, temp17, temp4) "addq.ph %[temp1], %[temp1], %[temp2] \n\t" "addq.ph %[temp6], %[temp6], %[temp2] \n\t" ADD_SUB_HALVES(temp2, temp4, temp1, temp3) ADD_SUB_HALVES(temp5, temp7, temp6, temp8) MUL_SHIFT_SUM(temp1, temp3, temp6, temp8, temp9, temp13, temp17, temp18, temp3, temp13, temp1, temp9, temp9, temp13, temp11, temp15, temp6, temp17, temp8, temp18) MUL_SHIFT_SUM(temp6, temp8, temp18, temp17, temp11, temp15, temp12, temp16, temp8, temp15, temp6, temp11, temp12, temp16, temp10, temp14, temp18, temp12, temp17, temp16) INSERT_HALF_X2(temp1, temp3, temp9, temp13) INSERT_HALF_X2(temp6, temp8, temp11, temp15) SHIFT_R_SUM_X2(temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp2, temp4, temp5, temp7, temp3, temp1, temp8, temp6) PACK_2_HALVES_TO_WORD(temp1, temp2, temp3, temp4, temp9, temp12, temp13, temp16, temp11, temp10, temp15, temp14) LOAD_WITH_OFFSET_X4(temp10, temp11, temp14, temp15, dst, 0, 0, 0, 0, 0, 1, 2, 3, BPS) CONVERT_2_BYTES_TO_HALF(temp5, temp6, temp7, temp8, temp17, temp18, temp10, temp11, temp10, temp11, temp14, temp15) STORE_SAT_SUM_X2(temp5, temp6, temp7, temp8, temp17, temp18, temp10, temp11, temp9, temp12, temp1, temp2, temp13, temp16, temp3, temp4, dst, 0, 1, 2, 3, BPS) OUTPUT_EARLY_CLOBBER_REGS_18() : [dst]"r"(dst), [in]"r"(in), [kC1]"r"(kC1), [kC2]"r"(kC2) : "memory", "hi", "lo" ); } static void TransformTwo(const int16_t* in, uint8_t* dst, int do_two) { TransformOne(in, dst); if (do_two) { TransformOne(in + 16, dst + 4); } } static WEBP_INLINE void FilterLoop26(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { const int thresh2 = 2 * thresh + 1; int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9; int temp10, temp11, temp12, temp13, temp14, temp15; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "1: \n\t" "negu %[temp1], %[hstride] \n\t" "addiu %[size], %[size], -1 \n\t" "sll %[temp2], %[hstride], 1 \n\t" "sll %[temp3], %[temp1], 1 \n\t" "addu %[temp4], %[temp2], %[hstride] \n\t" "addu %[temp5], %[temp3], %[temp1] \n\t" "lbu %[temp7], 0(%[p]) \n\t" "sll %[temp6], %[temp3], 1 \n\t" "lbux %[temp8], %[temp5](%[p]) \n\t" "lbux %[temp9], %[temp3](%[p]) \n\t" "lbux %[temp10], %[temp1](%[p]) \n\t" "lbux %[temp11], %[temp6](%[p]) \n\t" "lbux %[temp12], %[hstride](%[p]) \n\t" "lbux %[temp13], %[temp2](%[p]) \n\t" "lbux %[temp14], %[temp4](%[p]) \n\t" "subu %[temp1], %[temp10], %[temp7] \n\t" "subu %[temp2], %[temp9], %[temp12] \n\t" "absq_s.w %[temp3], %[temp1] \n\t" "absq_s.w %[temp4], %[temp2] \n\t" "negu %[temp1], %[temp1] \n\t" "sll %[temp3], %[temp3], 2 \n\t" "addu %[temp15], %[temp3], %[temp4] \n\t" "subu %[temp3], %[temp15], %[thresh2] \n\t" "sll %[temp6], %[temp1], 1 \n\t" "bgtz %[temp3], 3f \n\t" " subu %[temp4], %[temp11], %[temp8] \n\t" "absq_s.w %[temp4], %[temp4] \n\t" "shll_s.w %[temp2], %[temp2], 24 \n\t" "subu %[temp4], %[temp4], %[ithresh] \n\t" "bgtz %[temp4], 3f \n\t" " subu %[temp3], %[temp8], %[temp9] \n\t" "absq_s.w %[temp3], %[temp3] \n\t" "subu %[temp3], %[temp3], %[ithresh] \n\t" "bgtz %[temp3], 3f \n\t" " subu %[temp5], %[temp9], %[temp10] \n\t" "absq_s.w %[temp3], %[temp5] \n\t" "absq_s.w %[temp5], %[temp5] \n\t" "subu %[temp3], %[temp3], %[ithresh] \n\t" "bgtz %[temp3], 3f \n\t" " subu %[temp3], %[temp14], %[temp13] \n\t" "absq_s.w %[temp3], %[temp3] \n\t" "slt %[temp5], %[hev_thresh], %[temp5] \n\t" "subu %[temp3], %[temp3], %[ithresh] \n\t" "bgtz %[temp3], 3f \n\t" " subu %[temp3], %[temp13], %[temp12] \n\t" "absq_s.w %[temp3], %[temp3] \n\t" "sra %[temp4], %[temp2], 24 \n\t" "subu %[temp3], %[temp3], %[ithresh] \n\t" "bgtz %[temp3], 3f \n\t" " subu %[temp15], %[temp12], %[temp7] \n\t" "absq_s.w %[temp3], %[temp15] \n\t" "absq_s.w %[temp15], %[temp15] \n\t" "subu %[temp3], %[temp3], %[ithresh] \n\t" "bgtz %[temp3], 3f \n\t" " slt %[temp15], %[hev_thresh], %[temp15] \n\t" "addu %[temp3], %[temp6], %[temp1] \n\t" "or %[temp2], %[temp5], %[temp15] \n\t" "addu %[temp5], %[temp4], %[temp3] \n\t" "beqz %[temp2], 4f \n\t" " shra_r.w %[temp1], %[temp5], 3 \n\t" "addiu %[temp2], %[temp5], 3 \n\t" "sra %[temp2], %[temp2], 3 \n\t" "shll_s.w %[temp1], %[temp1], 27 \n\t" "shll_s.w %[temp2], %[temp2], 27 \n\t" "subu %[temp3], %[p], %[hstride] \n\t" "sra %[temp1], %[temp1], 27 \n\t" "sra %[temp2], %[temp2], 27 \n\t" "subu %[temp1], %[temp7], %[temp1] \n\t" "addu %[temp2], %[temp10], %[temp2] \n\t" "lbux %[temp2], %[temp2](%[VP8kclip1]) \n\t" "lbux %[temp1], %[temp1](%[VP8kclip1]) \n\t" "sb %[temp2], 0(%[temp3]) \n\t" "j 3f \n\t" " sb %[temp1], 0(%[p]) \n\t" "4: \n\t" "shll_s.w %[temp5], %[temp5], 24 \n\t" "subu %[temp14], %[p], %[hstride] \n\t" "subu %[temp11], %[temp14], %[hstride] \n\t" "sra %[temp6], %[temp5], 24 \n\t" "sll %[temp1], %[temp6], 3 \n\t" "subu %[temp15], %[temp11], %[hstride] \n\t" "addu %[temp2], %[temp6], %[temp1] \n\t" "sll %[temp3], %[temp2], 1 \n\t" "addu %[temp4], %[temp3], %[temp2] \n\t" "addiu %[temp2], %[temp2], 63 \n\t" "addiu %[temp3], %[temp3], 63 \n\t" "addiu %[temp4], %[temp4], 63 \n\t" "sra %[temp2], %[temp2], 7 \n\t" "sra %[temp3], %[temp3], 7 \n\t" "sra %[temp4], %[temp4], 7 \n\t" "addu %[temp1], %[temp8], %[temp2] \n\t" "addu %[temp5], %[temp9], %[temp3] \n\t" "addu %[temp6], %[temp10], %[temp4] \n\t" "subu %[temp8], %[temp7], %[temp4] \n\t" "subu %[temp7], %[temp12], %[temp3] \n\t" "addu %[temp10], %[p], %[hstride] \n\t" "subu %[temp9], %[temp13], %[temp2] \n\t" "addu %[temp12], %[temp10], %[hstride] \n\t" "lbux %[temp2], %[temp1](%[VP8kclip1]) \n\t" "lbux %[temp3], %[temp5](%[VP8kclip1]) \n\t" "lbux %[temp4], %[temp6](%[VP8kclip1]) \n\t" "lbux %[temp5], %[temp8](%[VP8kclip1]) \n\t" "lbux %[temp6], %[temp7](%[VP8kclip1]) \n\t" "lbux %[temp8], %[temp9](%[VP8kclip1]) \n\t" "sb %[temp2], 0(%[temp15]) \n\t" "sb %[temp3], 0(%[temp11]) \n\t" "sb %[temp4], 0(%[temp14]) \n\t" "sb %[temp5], 0(%[p]) \n\t" "sb %[temp6], 0(%[temp10]) \n\t" "sb %[temp8], 0(%[temp12]) \n\t" "3: \n\t" "bgtz %[size], 1b \n\t" " addu %[p], %[p], %[vstride] \n\t" ".set pop \n\t" : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),[temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7),[temp8]"=&r"(temp8),[temp9]"=&r"(temp9), [temp10]"=&r"(temp10),[temp11]"=&r"(temp11),[temp12]"=&r"(temp12), [temp13]"=&r"(temp13),[temp14]"=&r"(temp14),[temp15]"=&r"(temp15), [size]"+&r"(size), [p]"+&r"(p) : [hstride]"r"(hstride), [thresh2]"r"(thresh2), [ithresh]"r"(ithresh),[vstride]"r"(vstride), [hev_thresh]"r"(hev_thresh), [VP8kclip1]"r"(VP8kclip1) : "memory" ); } static WEBP_INLINE void FilterLoop24(uint8_t* p, int hstride, int vstride, int size, int thresh, int ithresh, int hev_thresh) { int p0, q0, p1, q1, p2, q2, p3, q3; int step1, step2, temp1, temp2, temp3, temp4; uint8_t* pTemp0; uint8_t* pTemp1; const int thresh2 = 2 * thresh + 1; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "bltz %[size], 3f \n\t" " nop \n\t" "2: \n\t" "negu %[step1], %[hstride] \n\t" "lbu %[q0], 0(%[p]) \n\t" "lbux %[p0], %[step1](%[p]) \n\t" "subu %[step1], %[step1], %[hstride] \n\t" "lbux %[q1], %[hstride](%[p]) \n\t" "subu %[temp1], %[p0], %[q0] \n\t" "lbux %[p1], %[step1](%[p]) \n\t" "addu %[step2], %[hstride], %[hstride] \n\t" "absq_s.w %[temp2], %[temp1] \n\t" "subu %[temp3], %[p1], %[q1] \n\t" "absq_s.w %[temp4], %[temp3] \n\t" "sll %[temp2], %[temp2], 2 \n\t" "addu %[temp2], %[temp2], %[temp4] \n\t" "subu %[temp4], %[temp2], %[thresh2] \n\t" "subu %[step1], %[step1], %[hstride] \n\t" "bgtz %[temp4], 0f \n\t" " lbux %[p2], %[step1](%[p]) \n\t" "subu %[step1], %[step1], %[hstride] \n\t" "lbux %[q2], %[step2](%[p]) \n\t" "lbux %[p3], %[step1](%[p]) \n\t" "subu %[temp4], %[p2], %[p1] \n\t" "addu %[step2], %[step2], %[hstride] \n\t" "subu %[temp2], %[p3], %[p2] \n\t" "absq_s.w %[temp4], %[temp4] \n\t" "absq_s.w %[temp2], %[temp2] \n\t" "lbux %[q3], %[step2](%[p]) \n\t" "subu %[temp4], %[temp4], %[ithresh] \n\t" "negu %[temp1], %[temp1] \n\t" "bgtz %[temp4], 0f \n\t" " subu %[temp2], %[temp2], %[ithresh] \n\t" "subu %[p3], %[p1], %[p0] \n\t" "bgtz %[temp2], 0f \n\t" " absq_s.w %[p3], %[p3] \n\t" "subu %[temp4], %[q3], %[q2] \n\t" "subu %[pTemp0], %[p], %[hstride] \n\t" "absq_s.w %[temp4], %[temp4] \n\t" "subu %[temp2], %[p3], %[ithresh] \n\t" "sll %[step1], %[temp1], 1 \n\t" "bgtz %[temp2], 0f \n\t" " subu %[temp4], %[temp4], %[ithresh] \n\t" "subu %[temp2], %[q2], %[q1] \n\t" "bgtz %[temp4], 0f \n\t" " absq_s.w %[temp2], %[temp2] \n\t" "subu %[q3], %[q1], %[q0] \n\t" "absq_s.w %[q3], %[q3] \n\t" "subu %[temp2], %[temp2], %[ithresh] \n\t" "addu %[temp1], %[temp1], %[step1] \n\t" "bgtz %[temp2], 0f \n\t" " subu %[temp4], %[q3], %[ithresh] \n\t" "slt %[p3], %[hev_thresh], %[p3] \n\t" "bgtz %[temp4], 0f \n\t" " slt %[q3], %[hev_thresh], %[q3] \n\t" "or %[q3], %[q3], %[p3] \n\t" "bgtz %[q3], 1f \n\t" " shra_r.w %[temp2], %[temp1], 3 \n\t" "addiu %[temp1], %[temp1], 3 \n\t" "sra %[temp1], %[temp1], 3 \n\t" "shll_s.w %[temp2], %[temp2], 27 \n\t" "shll_s.w %[temp1], %[temp1], 27 \n\t" "addu %[pTemp1], %[p], %[hstride] \n\t" "sra %[temp2], %[temp2], 27 \n\t" "sra %[temp1], %[temp1], 27 \n\t" "addiu %[step1], %[temp2], 1 \n\t" "sra %[step1], %[step1], 1 \n\t" "addu %[p0], %[p0], %[temp1] \n\t" "addu %[p1], %[p1], %[step1] \n\t" "subu %[q0], %[q0], %[temp2] \n\t" "subu %[q1], %[q1], %[step1] \n\t" "lbux %[temp2], %[p0](%[VP8kclip1]) \n\t" "lbux %[temp3], %[q0](%[VP8kclip1]) \n\t" "lbux %[temp4], %[q1](%[VP8kclip1]) \n\t" "sb %[temp2], 0(%[pTemp0]) \n\t" "lbux %[temp1], %[p1](%[VP8kclip1]) \n\t" "subu %[pTemp0], %[pTemp0], %[hstride] \n\t" "sb %[temp3], 0(%[p]) \n\t" "sb %[temp4], 0(%[pTemp1]) \n\t" "j 0f \n\t" " sb %[temp1], 0(%[pTemp0]) \n\t" "1: \n\t" "shll_s.w %[temp3], %[temp3], 24 \n\t" "sra %[temp3], %[temp3], 24 \n\t" "addu %[temp1], %[temp1], %[temp3] \n\t" "shra_r.w %[temp2], %[temp1], 3 \n\t" "addiu %[temp1], %[temp1], 3 \n\t" "shll_s.w %[temp2], %[temp2], 27 \n\t" "sra %[temp1], %[temp1], 3 \n\t" "shll_s.w %[temp1], %[temp1], 27 \n\t" "sra %[temp2], %[temp2], 27 \n\t" "sra %[temp1], %[temp1], 27 \n\t" "addu %[p0], %[p0], %[temp1] \n\t" "subu %[q0], %[q0], %[temp2] \n\t" "lbux %[temp1], %[p0](%[VP8kclip1]) \n\t" "lbux %[temp2], %[q0](%[VP8kclip1]) \n\t" "sb %[temp2], 0(%[p]) \n\t" "sb %[temp1], 0(%[pTemp0]) \n\t" "0: \n\t" "subu %[size], %[size], 1 \n\t" "bgtz %[size], 2b \n\t" " addu %[p], %[p], %[vstride] \n\t" "3: \n\t" ".set pop \n\t" : [p0]"=&r"(p0), [q0]"=&r"(q0), [p1]"=&r"(p1), [q1]"=&r"(q1), [p2]"=&r"(p2), [q2]"=&r"(q2), [p3]"=&r"(p3), [q3]"=&r"(q3), [step2]"=&r"(step2), [step1]"=&r"(step1), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [pTemp0]"=&r"(pTemp0), [pTemp1]"=&r"(pTemp1), [p]"+&r"(p), [size]"+&r"(size) : [vstride]"r"(vstride), [ithresh]"r"(ithresh), [hev_thresh]"r"(hev_thresh), [hstride]"r"(hstride), [VP8kclip1]"r"(VP8kclip1), [thresh2]"r"(thresh2) : "memory" ); } // on macroblock edges static void VFilter16(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(p, stride, 1, 16, thresh, ithresh, hev_thresh); } static void HFilter16(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(p, 1, stride, 16, thresh, ithresh, hev_thresh); } // 8-pixels wide variant, for chroma filtering static void VFilter8(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(u, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop26(v, stride, 1, 8, thresh, ithresh, hev_thresh); } static void HFilter8(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop26(u, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop26(v, 1, stride, 8, thresh, ithresh, hev_thresh); } // on three inner edges static void VFilter16i(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; FilterLoop24(p, stride, 1, 16, thresh, ithresh, hev_thresh); } } static void HFilter16i(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { int k; for (k = 3; k > 0; --k) { p += 4; FilterLoop24(p, 1, stride, 16, thresh, ithresh, hev_thresh); } } static void VFilter8i(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24(u + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); FilterLoop24(v + 4 * stride, stride, 1, 8, thresh, ithresh, hev_thresh); } static void HFilter8i(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { FilterLoop24(u + 4, 1, stride, 8, thresh, ithresh, hev_thresh); FilterLoop24(v + 4, 1, stride, 8, thresh, ithresh, hev_thresh); } //------------------------------------------------------------------------------ // Simple In-loop filtering (Paragraph 15.2) static void SimpleVFilter16(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; uint8_t* p1 = p - stride; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "li %[i], 16 \n\t" "0: \n\t" "negu %[temp4], %[stride] \n\t" "sll %[temp5], %[temp4], 1 \n\t" "lbu %[temp2], 0(%[p]) \n\t" "lbux %[temp3], %[stride](%[p]) \n\t" "lbux %[temp1], %[temp4](%[p]) \n\t" "lbux %[temp0], %[temp5](%[p]) \n\t" "subu %[temp7], %[temp1], %[temp2] \n\t" "subu %[temp6], %[temp0], %[temp3] \n\t" "absq_s.w %[temp4], %[temp7] \n\t" "absq_s.w %[temp5], %[temp6] \n\t" "sll %[temp4], %[temp4], 2 \n\t" "subu %[temp5], %[temp5], %[thresh2] \n\t" "addu %[temp5], %[temp4], %[temp5] \n\t" "negu %[temp8], %[temp7] \n\t" "bgtz %[temp5], 1f \n\t" " addiu %[i], %[i], -1 \n\t" "sll %[temp4], %[temp8], 1 \n\t" "shll_s.w %[temp5], %[temp6], 24 \n\t" "addu %[temp3], %[temp4], %[temp8] \n\t" "sra %[temp5], %[temp5], 24 \n\t" "addu %[temp3], %[temp3], %[temp5] \n\t" "addiu %[temp7], %[temp3], 3 \n\t" "sra %[temp7], %[temp7], 3 \n\t" "shra_r.w %[temp8], %[temp3], 3 \n\t" "shll_s.w %[temp0], %[temp7], 27 \n\t" "shll_s.w %[temp4], %[temp8], 27 \n\t" "sra %[temp0], %[temp0], 27 \n\t" "sra %[temp4], %[temp4], 27 \n\t" "addu %[temp7], %[temp1], %[temp0] \n\t" "subu %[temp2], %[temp2], %[temp4] \n\t" "lbux %[temp3], %[temp7](%[VP8kclip1]) \n\t" "lbux %[temp4], %[temp2](%[VP8kclip1]) \n\t" "sb %[temp3], 0(%[p1]) \n\t" "sb %[temp4], 0(%[p]) \n\t" "1: \n\t" "addiu %[p1], %[p1], 1 \n\t" "bgtz %[i], 0b \n\t" " addiu %[p], %[p], 1 \n\t" " .set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [p]"+&r"(p), [i]"=&r"(i), [p1]"+&r"(p1) : [stride]"r"(stride), [VP8kclip1]"r"(VP8kclip1), [thresh2]"r"(thresh2) : "memory" ); } // TEMP0 = SRC[A + A1 * BPS] // TEMP1 = SRC[B + B1 * BPS] // TEMP2 = SRC[C + C1 * BPS] // TEMP3 = SRC[D + D1 * BPS] #define LOAD_4_BYTES(TEMP0, TEMP1, TEMP2, TEMP3, \ A, A1, B, B1, C, C1, D, D1, SRC) \ "lbu %[" #TEMP0 "], " #A "+" #A1 "*" XSTR(BPS) "(%[" #SRC "]) \n\t" \ "lbu %[" #TEMP1 "], " #B "+" #B1 "*" XSTR(BPS) "(%[" #SRC "]) \n\t" \ "lbu %[" #TEMP2 "], " #C "+" #C1 "*" XSTR(BPS) "(%[" #SRC "]) \n\t" \ "lbu %[" #TEMP3 "], " #D "+" #D1 "*" XSTR(BPS) "(%[" #SRC "]) \n\t" \ static void SimpleHFilter16(uint8_t* p, int stride, int thresh) { int i; const int thresh2 = 2 * thresh + 1; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "li %[i], 16 \n\t" "0: \n\t" LOAD_4_BYTES(temp0, temp1, temp2, temp3, -2, 0, -1, 0, 0, 0, 1, 0, p) "subu %[temp7], %[temp1], %[temp2] \n\t" "subu %[temp6], %[temp0], %[temp3] \n\t" "absq_s.w %[temp4], %[temp7] \n\t" "absq_s.w %[temp5], %[temp6] \n\t" "sll %[temp4], %[temp4], 2 \n\t" "addu %[temp5], %[temp4], %[temp5] \n\t" "subu %[temp5], %[temp5], %[thresh2] \n\t" "negu %[temp8], %[temp7] \n\t" "bgtz %[temp5], 1f \n\t" " addiu %[i], %[i], -1 \n\t" "sll %[temp4], %[temp8], 1 \n\t" "shll_s.w %[temp5], %[temp6], 24 \n\t" "addu %[temp3], %[temp4], %[temp8] \n\t" "sra %[temp5], %[temp5], 24 \n\t" "addu %[temp3], %[temp3], %[temp5] \n\t" "addiu %[temp7], %[temp3], 3 \n\t" "sra %[temp7], %[temp7], 3 \n\t" "shra_r.w %[temp8], %[temp3], 3 \n\t" "shll_s.w %[temp0], %[temp7], 27 \n\t" "shll_s.w %[temp4], %[temp8], 27 \n\t" "sra %[temp0], %[temp0], 27 \n\t" "sra %[temp4], %[temp4], 27 \n\t" "addu %[temp7], %[temp1], %[temp0] \n\t" "subu %[temp2], %[temp2], %[temp4] \n\t" "lbux %[temp3], %[temp7](%[VP8kclip1]) \n\t" "lbux %[temp4], %[temp2](%[VP8kclip1]) \n\t" "sb %[temp3], -1(%[p]) \n\t" "sb %[temp4], 0(%[p]) \n\t" "1: \n\t" "bgtz %[i], 0b \n\t" " addu %[p], %[p], %[stride] \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [p]"+&r"(p), [i]"=&r"(i) : [stride]"r"(stride), [VP8kclip1]"r"(VP8kclip1), [thresh2]"r"(thresh2) : "memory" ); } static void SimpleVFilter16i(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4 * stride; SimpleVFilter16(p, stride, thresh); } } static void SimpleHFilter16i(uint8_t* p, int stride, int thresh) { int k; for (k = 3; k > 0; --k) { p += 4; SimpleHFilter16(p, stride, thresh); } } // DST[A * BPS] = TEMP0 // DST[B + C * BPS] = TEMP1 #define STORE_8_BYTES(TEMP0, TEMP1, A, B, C, DST) \ "usw %[" #TEMP0 "], " #A "*" XSTR(BPS) "(%[" #DST "]) \n\t" \ "usw %[" #TEMP1 "], " #B "+" #C "*" XSTR(BPS) "(%[" #DST "]) \n\t" static void VE4(uint8_t* dst) { // vertical const uint8_t* top = dst - BPS; int temp0, temp1, temp2, temp3, temp4, temp5, temp6; __asm__ volatile ( "ulw %[temp0], -1(%[top]) \n\t" "ulh %[temp1], 3(%[top]) \n\t" "preceu.ph.qbr %[temp2], %[temp0] \n\t" "preceu.ph.qbl %[temp3], %[temp0] \n\t" "preceu.ph.qbr %[temp4], %[temp1] \n\t" "packrl.ph %[temp5], %[temp3], %[temp2] \n\t" "packrl.ph %[temp6], %[temp4], %[temp3] \n\t" "shll.ph %[temp5], %[temp5], 1 \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp2], %[temp5], %[temp2] \n\t" "addq.ph %[temp6], %[temp6], %[temp4] \n\t" "addq.ph %[temp2], %[temp2], %[temp3] \n\t" "addq.ph %[temp6], %[temp6], %[temp3] \n\t" "shra_r.ph %[temp2], %[temp2], 2 \n\t" "shra_r.ph %[temp6], %[temp6], 2 \n\t" "precr.qb.ph %[temp4], %[temp6], %[temp2] \n\t" STORE_8_BYTES(temp4, temp4, 0, 0, 1, dst) STORE_8_BYTES(temp4, temp4, 2, 0, 3, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6) : [top]"r"(top), [dst]"r"(dst) : "memory" ); } static void DC4(uint8_t* dst) { // DC int temp0, temp1, temp2, temp3, temp4; __asm__ volatile ( "ulw %[temp0], -1*" XSTR(BPS) "(%[dst]) \n\t" LOAD_4_BYTES(temp1, temp2, temp3, temp4, -1, 0, -1, 1, -1, 2, -1, 3, dst) "ins %[temp1], %[temp2], 8, 8 \n\t" "ins %[temp1], %[temp3], 16, 8 \n\t" "ins %[temp1], %[temp4], 24, 8 \n\t" "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "shra_r.w %[temp0], %[temp0], 3 \n\t" "replv.qb %[temp0], %[temp0] \n\t" STORE_8_BYTES(temp0, temp0, 0, 0, 1, dst) STORE_8_BYTES(temp0, temp0, 2, 0, 3, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4) : [dst]"r"(dst) : "memory" ); } static void RD4(uint8_t* dst) { // Down-right int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8; __asm__ volatile ( LOAD_4_BYTES(temp0, temp1, temp2, temp3, -1, 0, -1, 1, -1, 2, -1, 3, dst) "ulw %[temp7], -1-" XSTR(BPS) "(%[dst]) \n\t" "ins %[temp1], %[temp0], 16, 16 \n\t" "preceu.ph.qbr %[temp5], %[temp7] \n\t" "ins %[temp2], %[temp1], 16, 16 \n\t" "preceu.ph.qbl %[temp4], %[temp7] \n\t" "ins %[temp3], %[temp2], 16, 16 \n\t" "shll.ph %[temp2], %[temp2], 1 \n\t" "addq.ph %[temp3], %[temp3], %[temp1] \n\t" "packrl.ph %[temp6], %[temp5], %[temp1] \n\t" "addq.ph %[temp3], %[temp3], %[temp2] \n\t" "addq.ph %[temp1], %[temp1], %[temp5] \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp1], %[temp1], %[temp6] \n\t" "packrl.ph %[temp0], %[temp4], %[temp5] \n\t" "addq.ph %[temp8], %[temp5], %[temp4] \n\t" "shra_r.ph %[temp3], %[temp3], 2 \n\t" "shll.ph %[temp0], %[temp0], 1 \n\t" "shra_r.ph %[temp1], %[temp1], 2 \n\t" "addq.ph %[temp8], %[temp0], %[temp8] \n\t" "lbu %[temp5], 3-" XSTR(BPS) "(%[dst]) \n\t" "precrq.ph.w %[temp7], %[temp7], %[temp7] \n\t" "shra_r.ph %[temp8], %[temp8], 2 \n\t" "ins %[temp7], %[temp5], 0, 8 \n\t" "precr.qb.ph %[temp2], %[temp1], %[temp3] \n\t" "raddu.w.qb %[temp4], %[temp7] \n\t" "precr.qb.ph %[temp6], %[temp8], %[temp1] \n\t" "shra_r.w %[temp4], %[temp4], 2 \n\t" STORE_8_BYTES(temp2, temp6, 3, 0, 1, dst) "prepend %[temp2], %[temp8], 8 \n\t" "prepend %[temp6], %[temp4], 8 \n\t" STORE_8_BYTES(temp2, temp6, 2, 0, 0, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8) : [dst]"r"(dst) : "memory" ); } // TEMP0 = SRC[A * BPS] // TEMP1 = SRC[B + C * BPS] #define LOAD_8_BYTES(TEMP0, TEMP1, A, B, C, SRC) \ "ulw %[" #TEMP0 "], " #A "*" XSTR(BPS) "(%[" #SRC "]) \n\t" \ "ulw %[" #TEMP1 "], " #B "+" #C "*" XSTR(BPS) "(%[" #SRC "]) \n\t" static void LD4(uint8_t* dst) { // Down-Left int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( LOAD_8_BYTES(temp0, temp1, -1, 4, -1, dst) "preceu.ph.qbl %[temp2], %[temp0] \n\t" "preceu.ph.qbr %[temp3], %[temp0] \n\t" "preceu.ph.qbr %[temp4], %[temp1] \n\t" "preceu.ph.qbl %[temp5], %[temp1] \n\t" "packrl.ph %[temp6], %[temp2], %[temp3] \n\t" "packrl.ph %[temp7], %[temp4], %[temp2] \n\t" "packrl.ph %[temp8], %[temp5], %[temp4] \n\t" "shll.ph %[temp6], %[temp6], 1 \n\t" "addq.ph %[temp9], %[temp2], %[temp6] \n\t" "shll.ph %[temp7], %[temp7], 1 \n\t" "addq.ph %[temp9], %[temp9], %[temp3] \n\t" "shll.ph %[temp8], %[temp8], 1 \n\t" "shra_r.ph %[temp9], %[temp9], 2 \n\t" "addq.ph %[temp3], %[temp4], %[temp7] \n\t" "addq.ph %[temp0], %[temp5], %[temp8] \n\t" "addq.ph %[temp3], %[temp3], %[temp2] \n\t" "addq.ph %[temp0], %[temp0], %[temp4] \n\t" "shra_r.ph %[temp3], %[temp3], 2 \n\t" "shra_r.ph %[temp0], %[temp0], 2 \n\t" "srl %[temp1], %[temp1], 24 \n\t" "sll %[temp1], %[temp1], 1 \n\t" "raddu.w.qb %[temp5], %[temp5] \n\t" "precr.qb.ph %[temp9], %[temp3], %[temp9] \n\t" "precr.qb.ph %[temp3], %[temp0], %[temp3] \n\t" "addu %[temp1], %[temp1], %[temp5] \n\t" "shra_r.w %[temp1], %[temp1], 2 \n\t" STORE_8_BYTES(temp9, temp3, 0, 0, 2, dst) "prepend %[temp9], %[temp0], 8 \n\t" "prepend %[temp3], %[temp1], 8 \n\t" STORE_8_BYTES(temp9, temp3, 1, 0, 3, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [dst]"r"(dst) : "memory" ); } //------------------------------------------------------------------------------ // Chroma static void DC8uv(uint8_t* dst) { // DC int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8, temp9; __asm__ volatile ( LOAD_8_BYTES(temp0, temp1, -1, 4, -1, dst) LOAD_4_BYTES(temp2, temp3, temp4, temp5, -1, 0, -1, 1, -1, 2, -1, 3, dst) LOAD_4_BYTES(temp6, temp7, temp8, temp9, -1, 4, -1, 5, -1, 6, -1, 7, dst) "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp3] \n\t" "addu %[temp4], %[temp4], %[temp5] \n\t" "addu %[temp6], %[temp6], %[temp7] \n\t" "addu %[temp8], %[temp8], %[temp9] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp4] \n\t" "addu %[temp6], %[temp6], %[temp8] \n\t" "addu %[temp0], %[temp0], %[temp2] \n\t" "addu %[temp0], %[temp0], %[temp6] \n\t" "shra_r.w %[temp0], %[temp0], 4 \n\t" "replv.qb %[temp0], %[temp0] \n\t" STORE_8_BYTES(temp0, temp0, 0, 4, 0, dst) STORE_8_BYTES(temp0, temp0, 1, 4, 1, dst) STORE_8_BYTES(temp0, temp0, 2, 4, 2, dst) STORE_8_BYTES(temp0, temp0, 3, 4, 3, dst) STORE_8_BYTES(temp0, temp0, 4, 4, 4, dst) STORE_8_BYTES(temp0, temp0, 5, 4, 5, dst) STORE_8_BYTES(temp0, temp0, 6, 4, 6, dst) STORE_8_BYTES(temp0, temp0, 7, 4, 7, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9) : [dst]"r"(dst) : "memory" ); } static void DC8uvNoLeft(uint8_t* dst) { // DC with no left samples int temp0, temp1; __asm__ volatile ( LOAD_8_BYTES(temp0, temp1, -1, 4, -1, dst) "raddu.w.qb %[temp0], %[temp0] \n\t" "raddu.w.qb %[temp1], %[temp1] \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "shra_r.w %[temp0], %[temp0], 3 \n\t" "replv.qb %[temp0], %[temp0] \n\t" STORE_8_BYTES(temp0, temp0, 0, 4, 0, dst) STORE_8_BYTES(temp0, temp0, 1, 4, 1, dst) STORE_8_BYTES(temp0, temp0, 2, 4, 2, dst) STORE_8_BYTES(temp0, temp0, 3, 4, 3, dst) STORE_8_BYTES(temp0, temp0, 4, 4, 4, dst) STORE_8_BYTES(temp0, temp0, 5, 4, 5, dst) STORE_8_BYTES(temp0, temp0, 6, 4, 6, dst) STORE_8_BYTES(temp0, temp0, 7, 4, 7, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1) : [dst]"r"(dst) : "memory" ); } static void DC8uvNoTop(uint8_t* dst) { // DC with no top samples int temp0, temp1, temp2, temp3, temp4; int temp5, temp6, temp7, temp8; __asm__ volatile ( LOAD_4_BYTES(temp2, temp3, temp4, temp5, -1, 0, -1, 1, -1, 2, -1, 3, dst) LOAD_4_BYTES(temp6, temp7, temp8, temp1, -1, 4, -1, 5, -1, 6, -1, 7, dst) "addu %[temp2], %[temp2], %[temp3] \n\t" "addu %[temp4], %[temp4], %[temp5] \n\t" "addu %[temp6], %[temp6], %[temp7] \n\t" "addu %[temp8], %[temp8], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp4] \n\t" "addu %[temp6], %[temp6], %[temp8] \n\t" "addu %[temp0], %[temp6], %[temp2] \n\t" "shra_r.w %[temp0], %[temp0], 3 \n\t" "replv.qb %[temp0], %[temp0] \n\t" STORE_8_BYTES(temp0, temp0, 0, 4, 0, dst) STORE_8_BYTES(temp0, temp0, 1, 4, 1, dst) STORE_8_BYTES(temp0, temp0, 2, 4, 2, dst) STORE_8_BYTES(temp0, temp0, 3, 4, 3, dst) STORE_8_BYTES(temp0, temp0, 4, 4, 4, dst) STORE_8_BYTES(temp0, temp0, 5, 4, 5, dst) STORE_8_BYTES(temp0, temp0, 6, 4, 6, dst) STORE_8_BYTES(temp0, temp0, 7, 4, 7, dst) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8) : [dst]"r"(dst) : "memory" ); } #undef LOAD_8_BYTES #undef STORE_8_BYTES #undef LOAD_4_BYTES #define CLIPPING(SIZE) \ "preceu.ph.qbl %[temp2], %[temp0] \n\t" \ "preceu.ph.qbr %[temp0], %[temp0] \n\t" \ ".if " #SIZE " == 8 \n\t" \ "preceu.ph.qbl %[temp3], %[temp1] \n\t" \ "preceu.ph.qbr %[temp1], %[temp1] \n\t" \ ".endif \n\t" \ "addu.ph %[temp2], %[temp2], %[dst_1] \n\t" \ "addu.ph %[temp0], %[temp0], %[dst_1] \n\t" \ ".if " #SIZE " == 8 \n\t" \ "addu.ph %[temp3], %[temp3], %[dst_1] \n\t" \ "addu.ph %[temp1], %[temp1], %[dst_1] \n\t" \ ".endif \n\t" \ "shll_s.ph %[temp2], %[temp2], 7 \n\t" \ "shll_s.ph %[temp0], %[temp0], 7 \n\t" \ ".if " #SIZE " == 8 \n\t" \ "shll_s.ph %[temp3], %[temp3], 7 \n\t" \ "shll_s.ph %[temp1], %[temp1], 7 \n\t" \ ".endif \n\t" \ "precrqu_s.qb.ph %[temp0], %[temp2], %[temp0] \n\t" \ ".if " #SIZE " == 8 \n\t" \ "precrqu_s.qb.ph %[temp1], %[temp3], %[temp1] \n\t" \ ".endif \n\t" #define CLIP_8B_TO_DST(DST, TOP, SIZE) do { \ int dst_1 = ((int)(DST)[-1] << 16) + (DST)[-1]; \ int temp0, temp1, temp2, temp3; \ __asm__ volatile ( \ ".if " #SIZE " < 8 \n\t" \ "ulw %[temp0], 0(%[top]) \n\t" \ "subu.ph %[dst_1], %[dst_1], %[top_1] \n\t" \ CLIPPING(4) \ "usw %[temp0], 0(%[dst]) \n\t" \ ".else \n\t" \ "ulw %[temp0], 0(%[top]) \n\t" \ "ulw %[temp1], 4(%[top]) \n\t" \ "subu.ph %[dst_1], %[dst_1], %[top_1] \n\t" \ CLIPPING(8) \ "usw %[temp0], 0(%[dst]) \n\t" \ "usw %[temp1], 4(%[dst]) \n\t" \ ".if " #SIZE " == 16 \n\t" \ "ulw %[temp0], 8(%[top]) \n\t" \ "ulw %[temp1], 12(%[top]) \n\t" \ CLIPPING(8) \ "usw %[temp0], 8(%[dst]) \n\t" \ "usw %[temp1], 12(%[dst]) \n\t" \ ".endif \n\t" \ ".endif \n\t" \ : [dst_1]"+&r"(dst_1), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), \ [temp2]"=&r"(temp2), [temp3]"=&r"(temp3) \ : [top_1]"r"(top_1), [top]"r"((TOP)), [dst]"r"((DST)) \ : "memory" \ ); \ } while (0) #define CLIP_TO_DST(DST, SIZE) do { \ int y; \ const uint8_t* top = (DST) - BPS; \ const int top_1 = ((int)top[-1] << 16) + top[-1]; \ for (y = 0; y < (SIZE); ++y) { \ CLIP_8B_TO_DST((DST), top, (SIZE)); \ (DST) += BPS; \ } \ } while (0) #define TRUE_MOTION(DST, SIZE) \ static void TrueMotion##SIZE(uint8_t* (DST)) { \ CLIP_TO_DST((DST), (SIZE)); \ } TRUE_MOTION(dst, 4) TRUE_MOTION(dst, 8) TRUE_MOTION(dst, 16) #undef TRUE_MOTION #undef CLIP_TO_DST #undef CLIP_8B_TO_DST #undef CLIPPING //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitMIPSdspR2(void) { VP8TransformDC = TransformDC; VP8TransformAC3 = TransformAC3; VP8Transform = TransformTwo; VP8VFilter16 = VFilter16; VP8HFilter16 = HFilter16; VP8VFilter8 = VFilter8; VP8HFilter8 = HFilter8; VP8VFilter16i = VFilter16i; VP8HFilter16i = HFilter16i; VP8VFilter8i = VFilter8i; VP8HFilter8i = HFilter8i; VP8SimpleVFilter16 = SimpleVFilter16; VP8SimpleHFilter16 = SimpleHFilter16; VP8SimpleVFilter16i = SimpleVFilter16i; VP8SimpleHFilter16i = SimpleHFilter16i; VP8PredLuma4[0] = DC4; VP8PredLuma4[1] = TrueMotion4; VP8PredLuma4[2] = VE4; VP8PredLuma4[4] = RD4; VP8PredLuma4[6] = LD4; VP8PredChroma8[0] = DC8uv; VP8PredChroma8[1] = TrueMotion8; VP8PredChroma8[4] = DC8uvNoTop; VP8PredChroma8[5] = DC8uvNoLeft; VP8PredLuma16[1] = TrueMotion16; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8DspInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/alpha_processing_sse2.c0000644000014400001440000004112614606317060016055 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for processing transparent channel. // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include //------------------------------------------------------------------------------ static int DispatchAlpha_SSE2(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint8_t* WEBP_RESTRICT dst, int dst_stride) { // alpha_and stores an 'and' operation of all the alpha[] values. The final // value is not 0xff if any of the alpha[] is not equal to 0xff. uint32_t alpha_and = 0xff; int i, j; const __m128i zero = _mm_setzero_si128(); const __m128i rgb_mask = _mm_set1_epi32((int)0xffffff00); // to preserve RGB const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte // 'dst[4 * width - 4]', because we don't know if alpha is the first or the // last byte of the quadruplet. const int limit = (width - 1) & ~7; for (j = 0; j < height; ++j) { __m128i* out = (__m128i*)dst; for (i = 0; i < limit; i += 8) { // load 8 alpha bytes const __m128i a0 = _mm_loadl_epi64((const __m128i*)&alpha[i]); const __m128i a1 = _mm_unpacklo_epi8(a0, zero); const __m128i a2_lo = _mm_unpacklo_epi16(a1, zero); const __m128i a2_hi = _mm_unpackhi_epi16(a1, zero); // load 8 dst pixels (32 bytes) const __m128i b0_lo = _mm_loadu_si128(out + 0); const __m128i b0_hi = _mm_loadu_si128(out + 1); // mask dst alpha values const __m128i b1_lo = _mm_and_si128(b0_lo, rgb_mask); const __m128i b1_hi = _mm_and_si128(b0_hi, rgb_mask); // combine const __m128i b2_lo = _mm_or_si128(b1_lo, a2_lo); const __m128i b2_hi = _mm_or_si128(b1_hi, a2_hi); // store _mm_storeu_si128(out + 0, b2_lo); _mm_storeu_si128(out + 1, b2_hi); // accumulate eight alpha 'and' in parallel all_alphas = _mm_and_si128(all_alphas, a0); out += 2; } for (; i < width; ++i) { const uint32_t alpha_value = alpha[i]; dst[4 * i] = alpha_value; alpha_and &= alpha_value; } alpha += alpha_stride; dst += dst_stride; } // Combine the eight alpha 'and' into a 8-bit mask. alpha_and &= _mm_movemask_epi8(_mm_cmpeq_epi8(all_alphas, all_0xff)); return (alpha_and != 0xff); } static void DispatchAlphaToGreen_SSE2(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint32_t* WEBP_RESTRICT dst, int dst_stride) { int i, j; const __m128i zero = _mm_setzero_si128(); const int limit = width & ~15; for (j = 0; j < height; ++j) { for (i = 0; i < limit; i += 16) { // process 16 alpha bytes const __m128i a0 = _mm_loadu_si128((const __m128i*)&alpha[i]); const __m128i a1 = _mm_unpacklo_epi8(zero, a0); // note the 'zero' first! const __m128i b1 = _mm_unpackhi_epi8(zero, a0); const __m128i a2_lo = _mm_unpacklo_epi16(a1, zero); const __m128i b2_lo = _mm_unpacklo_epi16(b1, zero); const __m128i a2_hi = _mm_unpackhi_epi16(a1, zero); const __m128i b2_hi = _mm_unpackhi_epi16(b1, zero); _mm_storeu_si128((__m128i*)&dst[i + 0], a2_lo); _mm_storeu_si128((__m128i*)&dst[i + 4], a2_hi); _mm_storeu_si128((__m128i*)&dst[i + 8], b2_lo); _mm_storeu_si128((__m128i*)&dst[i + 12], b2_hi); } for (; i < width; ++i) dst[i] = alpha[i] << 8; alpha += alpha_stride; dst += dst_stride; } } static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride, int width, int height, uint8_t* WEBP_RESTRICT alpha, int alpha_stride) { // alpha_and stores an 'and' operation of all the alpha[] values. The final // value is not 0xff if any of the alpha[] is not equal to 0xff. uint32_t alpha_and = 0xff; int i, j; const __m128i a_mask = _mm_set1_epi32(0xff); // to preserve alpha const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte // 'src[4 * width - 4]', because we don't know if alpha is the first or the // last byte of the quadruplet. const int limit = (width - 1) & ~7; for (j = 0; j < height; ++j) { const __m128i* src = (const __m128i*)argb; for (i = 0; i < limit; i += 8) { // load 32 argb bytes const __m128i a0 = _mm_loadu_si128(src + 0); const __m128i a1 = _mm_loadu_si128(src + 1); const __m128i b0 = _mm_and_si128(a0, a_mask); const __m128i b1 = _mm_and_si128(a1, a_mask); const __m128i c0 = _mm_packs_epi32(b0, b1); const __m128i d0 = _mm_packus_epi16(c0, c0); // store _mm_storel_epi64((__m128i*)&alpha[i], d0); // accumulate eight alpha 'and' in parallel all_alphas = _mm_and_si128(all_alphas, d0); src += 2; } for (; i < width; ++i) { const uint32_t alpha_value = argb[4 * i]; alpha[i] = alpha_value; alpha_and &= alpha_value; } argb += argb_stride; alpha += alpha_stride; } // Combine the eight alpha 'and' into a 8-bit mask. alpha_and &= _mm_movemask_epi8(_mm_cmpeq_epi8(all_alphas, all_0xff)); return (alpha_and == 0xff); } static void ExtractGreen_SSE2(const uint32_t* WEBP_RESTRICT argb, uint8_t* WEBP_RESTRICT alpha, int size) { int i; const __m128i mask = _mm_set1_epi32(0xff); const __m128i* src = (const __m128i*)argb; for (i = 0; i + 16 <= size; i += 16, src += 4) { const __m128i a0 = _mm_loadu_si128(src + 0); const __m128i a1 = _mm_loadu_si128(src + 1); const __m128i a2 = _mm_loadu_si128(src + 2); const __m128i a3 = _mm_loadu_si128(src + 3); const __m128i b0 = _mm_srli_epi32(a0, 8); const __m128i b1 = _mm_srli_epi32(a1, 8); const __m128i b2 = _mm_srli_epi32(a2, 8); const __m128i b3 = _mm_srli_epi32(a3, 8); const __m128i c0 = _mm_and_si128(b0, mask); const __m128i c1 = _mm_and_si128(b1, mask); const __m128i c2 = _mm_and_si128(b2, mask); const __m128i c3 = _mm_and_si128(b3, mask); const __m128i d0 = _mm_packs_epi32(c0, c1); const __m128i d1 = _mm_packs_epi32(c2, c3); const __m128i e = _mm_packus_epi16(d0, d1); // store _mm_storeu_si128((__m128i*)&alpha[i], e); } if (i + 8 <= size) { const __m128i a0 = _mm_loadu_si128(src + 0); const __m128i a1 = _mm_loadu_si128(src + 1); const __m128i b0 = _mm_srli_epi32(a0, 8); const __m128i b1 = _mm_srli_epi32(a1, 8); const __m128i c0 = _mm_and_si128(b0, mask); const __m128i c1 = _mm_and_si128(b1, mask); const __m128i d = _mm_packs_epi32(c0, c1); const __m128i e = _mm_packus_epi16(d, d); _mm_storel_epi64((__m128i*)&alpha[i], e); i += 8; } for (; i < size; ++i) alpha[i] = argb[i] >> 8; } //------------------------------------------------------------------------------ // Non-dither premultiplied modes #define MULTIPLIER(a) ((a) * 0x8081) #define PREMULTIPLY(x, m) (((x) * (m)) >> 23) // We can't use a 'const int' for the SHUFFLE value, because it has to be an // immediate in the _mm_shufflexx_epi16() instruction. We really need a macro. // We use: v / 255 = (v * 0x8081) >> 23, where v = alpha * {r,g,b} is a 16bit // value. #define APPLY_ALPHA(RGBX, SHUFFLE) do { \ const __m128i argb0 = _mm_loadu_si128((const __m128i*)&(RGBX)); \ const __m128i argb1_lo = _mm_unpacklo_epi8(argb0, zero); \ const __m128i argb1_hi = _mm_unpackhi_epi8(argb0, zero); \ const __m128i alpha0_lo = _mm_or_si128(argb1_lo, kMask); \ const __m128i alpha0_hi = _mm_or_si128(argb1_hi, kMask); \ const __m128i alpha1_lo = _mm_shufflelo_epi16(alpha0_lo, SHUFFLE); \ const __m128i alpha1_hi = _mm_shufflelo_epi16(alpha0_hi, SHUFFLE); \ const __m128i alpha2_lo = _mm_shufflehi_epi16(alpha1_lo, SHUFFLE); \ const __m128i alpha2_hi = _mm_shufflehi_epi16(alpha1_hi, SHUFFLE); \ /* alpha2 = [ff a0 a0 a0][ff a1 a1 a1] */ \ const __m128i A0_lo = _mm_mullo_epi16(alpha2_lo, argb1_lo); \ const __m128i A0_hi = _mm_mullo_epi16(alpha2_hi, argb1_hi); \ const __m128i A1_lo = _mm_mulhi_epu16(A0_lo, kMult); \ const __m128i A1_hi = _mm_mulhi_epu16(A0_hi, kMult); \ const __m128i A2_lo = _mm_srli_epi16(A1_lo, 7); \ const __m128i A2_hi = _mm_srli_epi16(A1_hi, 7); \ const __m128i A3 = _mm_packus_epi16(A2_lo, A2_hi); \ _mm_storeu_si128((__m128i*)&(RGBX), A3); \ } while (0) static void ApplyAlphaMultiply_SSE2(uint8_t* rgba, int alpha_first, int w, int h, int stride) { const __m128i zero = _mm_setzero_si128(); const __m128i kMult = _mm_set1_epi16((short)0x8081); const __m128i kMask = _mm_set_epi16(0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0); const int kSpan = 4; while (h-- > 0) { uint32_t* const rgbx = (uint32_t*)rgba; int i; if (!alpha_first) { for (i = 0; i + kSpan <= w; i += kSpan) { APPLY_ALPHA(rgbx[i], _MM_SHUFFLE(2, 3, 3, 3)); } } else { for (i = 0; i + kSpan <= w; i += kSpan) { APPLY_ALPHA(rgbx[i], _MM_SHUFFLE(0, 0, 0, 1)); } } // Finish with left-overs. for (; i < w; ++i) { uint8_t* const rgb = rgba + (alpha_first ? 1 : 0); const uint8_t* const alpha = rgba + (alpha_first ? 0 : 3); const uint32_t a = alpha[4 * i]; if (a != 0xff) { const uint32_t mult = MULTIPLIER(a); rgb[4 * i + 0] = PREMULTIPLY(rgb[4 * i + 0], mult); rgb[4 * i + 1] = PREMULTIPLY(rgb[4 * i + 1], mult); rgb[4 * i + 2] = PREMULTIPLY(rgb[4 * i + 2], mult); } } rgba += stride; } } #undef MULTIPLIER #undef PREMULTIPLY //------------------------------------------------------------------------------ // Alpha detection static int HasAlpha8b_SSE2(const uint8_t* src, int length) { const __m128i all_0xff = _mm_set1_epi8((char)0xff); int i = 0; for (; i + 16 <= length; i += 16) { const __m128i v = _mm_loadu_si128((const __m128i*)(src + i)); const __m128i bits = _mm_cmpeq_epi8(v, all_0xff); const int mask = _mm_movemask_epi8(bits); if (mask != 0xffff) return 1; } for (; i < length; ++i) if (src[i] != 0xff) return 1; return 0; } static int HasAlpha32b_SSE2(const uint8_t* src, int length) { const __m128i alpha_mask = _mm_set1_epi32(0xff); const __m128i all_0xff = _mm_set1_epi8((char)0xff); int i = 0; // We don't know if we can access the last 3 bytes after the last alpha // value 'src[4 * length - 4]' (because we don't know if alpha is the first // or the last byte of the quadruplet). Hence the '-3' protection below. length = length * 4 - 3; // size in bytes for (; i + 64 <= length; i += 64) { const __m128i a0 = _mm_loadu_si128((const __m128i*)(src + i + 0)); const __m128i a1 = _mm_loadu_si128((const __m128i*)(src + i + 16)); const __m128i a2 = _mm_loadu_si128((const __m128i*)(src + i + 32)); const __m128i a3 = _mm_loadu_si128((const __m128i*)(src + i + 48)); const __m128i b0 = _mm_and_si128(a0, alpha_mask); const __m128i b1 = _mm_and_si128(a1, alpha_mask); const __m128i b2 = _mm_and_si128(a2, alpha_mask); const __m128i b3 = _mm_and_si128(a3, alpha_mask); const __m128i c0 = _mm_packs_epi32(b0, b1); const __m128i c1 = _mm_packs_epi32(b2, b3); const __m128i d = _mm_packus_epi16(c0, c1); const __m128i bits = _mm_cmpeq_epi8(d, all_0xff); const int mask = _mm_movemask_epi8(bits); if (mask != 0xffff) return 1; } for (; i + 32 <= length; i += 32) { const __m128i a0 = _mm_loadu_si128((const __m128i*)(src + i + 0)); const __m128i a1 = _mm_loadu_si128((const __m128i*)(src + i + 16)); const __m128i b0 = _mm_and_si128(a0, alpha_mask); const __m128i b1 = _mm_and_si128(a1, alpha_mask); const __m128i c = _mm_packs_epi32(b0, b1); const __m128i d = _mm_packus_epi16(c, c); const __m128i bits = _mm_cmpeq_epi8(d, all_0xff); const int mask = _mm_movemask_epi8(bits); if (mask != 0xffff) return 1; } for (; i <= length; i += 4) if (src[i] != 0xff) return 1; return 0; } static void AlphaReplace_SSE2(uint32_t* src, int length, uint32_t color) { const __m128i m_color = _mm_set1_epi32((int)color); const __m128i zero = _mm_setzero_si128(); int i = 0; for (; i + 8 <= length; i += 8) { const __m128i a0 = _mm_loadu_si128((const __m128i*)(src + i + 0)); const __m128i a1 = _mm_loadu_si128((const __m128i*)(src + i + 4)); const __m128i b0 = _mm_srai_epi32(a0, 24); const __m128i b1 = _mm_srai_epi32(a1, 24); const __m128i c0 = _mm_cmpeq_epi32(b0, zero); const __m128i c1 = _mm_cmpeq_epi32(b1, zero); const __m128i d0 = _mm_and_si128(c0, m_color); const __m128i d1 = _mm_and_si128(c1, m_color); const __m128i e0 = _mm_andnot_si128(c0, a0); const __m128i e1 = _mm_andnot_si128(c1, a1); _mm_storeu_si128((__m128i*)(src + i + 0), _mm_or_si128(d0, e0)); _mm_storeu_si128((__m128i*)(src + i + 4), _mm_or_si128(d1, e1)); } for (; i < length; ++i) if ((src[i] >> 24) == 0) src[i] = color; } // ----------------------------------------------------------------------------- // Apply alpha value to rows static void MultARGBRow_SSE2(uint32_t* const ptr, int width, int inverse) { int x = 0; if (!inverse) { const int kSpan = 2; const __m128i zero = _mm_setzero_si128(); const __m128i k128 = _mm_set1_epi16(128); const __m128i kMult = _mm_set1_epi16(0x0101); const __m128i kMask = _mm_set_epi16(0, 0xff, 0, 0, 0, 0xff, 0, 0); for (x = 0; x + kSpan <= width; x += kSpan) { // To compute 'result = (int)(a * x / 255. + .5)', we use: // tmp = a * v + 128, result = (tmp * 0x0101u) >> 16 const __m128i A0 = _mm_loadl_epi64((const __m128i*)&ptr[x]); const __m128i A1 = _mm_unpacklo_epi8(A0, zero); const __m128i A2 = _mm_or_si128(A1, kMask); const __m128i A3 = _mm_shufflelo_epi16(A2, _MM_SHUFFLE(2, 3, 3, 3)); const __m128i A4 = _mm_shufflehi_epi16(A3, _MM_SHUFFLE(2, 3, 3, 3)); // here, A4 = [ff a0 a0 a0][ff a1 a1 a1] const __m128i A5 = _mm_mullo_epi16(A4, A1); const __m128i A6 = _mm_add_epi16(A5, k128); const __m128i A7 = _mm_mulhi_epu16(A6, kMult); const __m128i A10 = _mm_packus_epi16(A7, zero); _mm_storel_epi64((__m128i*)&ptr[x], A10); } } width -= x; if (width > 0) WebPMultARGBRow_C(ptr + x, width, inverse); } static void MultRow_SSE2(uint8_t* WEBP_RESTRICT const ptr, const uint8_t* WEBP_RESTRICT const alpha, int width, int inverse) { int x = 0; if (!inverse) { const __m128i zero = _mm_setzero_si128(); const __m128i k128 = _mm_set1_epi16(128); const __m128i kMult = _mm_set1_epi16(0x0101); for (x = 0; x + 8 <= width; x += 8) { const __m128i v0 = _mm_loadl_epi64((__m128i*)&ptr[x]); const __m128i a0 = _mm_loadl_epi64((const __m128i*)&alpha[x]); const __m128i v1 = _mm_unpacklo_epi8(v0, zero); const __m128i a1 = _mm_unpacklo_epi8(a0, zero); const __m128i v2 = _mm_mullo_epi16(v1, a1); const __m128i v3 = _mm_add_epi16(v2, k128); const __m128i v4 = _mm_mulhi_epu16(v3, kMult); const __m128i v5 = _mm_packus_epi16(v4, zero); _mm_storel_epi64((__m128i*)&ptr[x], v5); } } width -= x; if (width > 0) WebPMultRow_C(ptr + x, alpha + x, width, inverse); } //------------------------------------------------------------------------------ // Entry point extern void WebPInitAlphaProcessingSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingSSE2(void) { WebPMultARGBRow = MultARGBRow_SSE2; WebPMultRow = MultRow_SSE2; WebPApplyAlphaMultiply = ApplyAlphaMultiply_SSE2; WebPDispatchAlpha = DispatchAlpha_SSE2; WebPDispatchAlphaToGreen = DispatchAlphaToGreen_SSE2; WebPExtractAlpha = ExtractAlpha_SSE2; WebPExtractGreen = ExtractGreen_SSE2; WebPHasAlpha8b = HasAlpha8b_SSE2; WebPHasAlpha32b = HasAlpha32b_SSE2; WebPAlphaReplace = AlphaReplace_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(WebPInitAlphaProcessingSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/upsampling_neon.c0000644000014400001440000003646114606317060015004 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON version of YUV to RGB upsampling functions. // // Author: mans@mansr.com (Mans Rullgard) // Based on SSE code by: somnath@google.com (Somnath Banerjee) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include #include #include #include "src/dsp/neon.h" #include "src/dsp/yuv.h" #ifdef FANCY_UPSAMPLING //----------------------------------------------------------------------------- // U/V upsampling // Loads 9 pixels each from rows r1 and r2 and generates 16 pixels. #define UPSAMPLE_16PIXELS(r1, r2, out) do { \ const uint8x8_t a = vld1_u8(r1 + 0); \ const uint8x8_t b = vld1_u8(r1 + 1); \ const uint8x8_t c = vld1_u8(r2 + 0); \ const uint8x8_t d = vld1_u8(r2 + 1); \ /* a + b + c + d */ \ const uint16x8_t ad = vaddl_u8(a, d); \ const uint16x8_t bc = vaddl_u8(b, c); \ const uint16x8_t abcd = vaddq_u16(ad, bc); \ /* 3a + b + c + 3d */ \ const uint16x8_t al = vaddq_u16(abcd, vshlq_n_u16(ad, 1)); \ /* a + 3b + 3c + d */ \ const uint16x8_t bl = vaddq_u16(abcd, vshlq_n_u16(bc, 1)); \ \ const uint8x8_t diag2 = vshrn_n_u16(al, 3); \ const uint8x8_t diag1 = vshrn_n_u16(bl, 3); \ \ const uint8x8_t A = vrhadd_u8(a, diag1); \ const uint8x8_t B = vrhadd_u8(b, diag2); \ const uint8x8_t C = vrhadd_u8(c, diag2); \ const uint8x8_t D = vrhadd_u8(d, diag1); \ \ uint8x8x2_t A_B, C_D; \ INIT_VECTOR2(A_B, A, B); \ INIT_VECTOR2(C_D, C, D); \ vst2_u8(out + 0, A_B); \ vst2_u8(out + 32, C_D); \ } while (0) // Turn the macro into a function for reducing code-size when non-critical static void Upsample16Pixels_NEON(const uint8_t* r1, const uint8_t* r2, uint8_t* out) { UPSAMPLE_16PIXELS(r1, r2, out); } #define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) { \ uint8_t r1[9], r2[9]; \ memcpy(r1, (tb), (num_pixels)); \ memcpy(r2, (bb), (num_pixels)); \ /* replicate last byte */ \ memset(r1 + (num_pixels), r1[(num_pixels) - 1], 9 - (num_pixels)); \ memset(r2 + (num_pixels), r2[(num_pixels) - 1], 9 - (num_pixels)); \ Upsample16Pixels_NEON(r1, r2, out); \ } //----------------------------------------------------------------------------- // YUV->RGB conversion // note: we represent the 33050 large constant as 32768 + 282 static const int16_t kCoeffs1[4] = { 19077, 26149, 6419, 13320 }; #define v255 vdup_n_u8(255) #define STORE_Rgb(out, r, g, b) do { \ uint8x8x3_t r_g_b; \ INIT_VECTOR3(r_g_b, r, g, b); \ vst3_u8(out, r_g_b); \ } while (0) #define STORE_Bgr(out, r, g, b) do { \ uint8x8x3_t b_g_r; \ INIT_VECTOR3(b_g_r, b, g, r); \ vst3_u8(out, b_g_r); \ } while (0) #define STORE_Rgba(out, r, g, b) do { \ uint8x8x4_t r_g_b_v255; \ INIT_VECTOR4(r_g_b_v255, r, g, b, v255); \ vst4_u8(out, r_g_b_v255); \ } while (0) #define STORE_Bgra(out, r, g, b) do { \ uint8x8x4_t b_g_r_v255; \ INIT_VECTOR4(b_g_r_v255, b, g, r, v255); \ vst4_u8(out, b_g_r_v255); \ } while (0) #define STORE_Argb(out, r, g, b) do { \ uint8x8x4_t v255_r_g_b; \ INIT_VECTOR4(v255_r_g_b, v255, r, g, b); \ vst4_u8(out, v255_r_g_b); \ } while (0) #if (WEBP_SWAP_16BIT_CSP == 0) #define ZIP_U8(lo, hi) vzip_u8((lo), (hi)) #else #define ZIP_U8(lo, hi) vzip_u8((hi), (lo)) #endif #define STORE_Rgba4444(out, r, g, b) do { \ const uint8x8_t rg = vsri_n_u8(r, g, 4); /* shift g, insert r */ \ const uint8x8_t ba = vsri_n_u8(b, v255, 4); /* shift a, insert b */ \ const uint8x8x2_t rgba4444 = ZIP_U8(rg, ba); \ vst1q_u8(out, vcombine_u8(rgba4444.val[0], rgba4444.val[1])); \ } while (0) #define STORE_Rgb565(out, r, g, b) do { \ const uint8x8_t rg = vsri_n_u8(r, g, 5); /* shift g and insert r */ \ const uint8x8_t g1 = vshl_n_u8(g, 3); /* pre-shift g: 3bits */ \ const uint8x8_t gb = vsri_n_u8(g1, b, 3); /* shift b and insert g */ \ const uint8x8x2_t rgb565 = ZIP_U8(rg, gb); \ vst1q_u8(out, vcombine_u8(rgb565.val[0], rgb565.val[1])); \ } while (0) #define CONVERT8(FMT, XSTEP, N, src_y, src_uv, out, cur_x) do { \ int i; \ for (i = 0; i < N; i += 8) { \ const int off = ((cur_x) + i) * XSTEP; \ const uint8x8_t y = vld1_u8((src_y) + (cur_x) + i); \ const uint8x8_t u = vld1_u8((src_uv) + i + 0); \ const uint8x8_t v = vld1_u8((src_uv) + i + 16); \ const int16x8_t Y0 = vreinterpretq_s16_u16(vshll_n_u8(y, 7)); \ const int16x8_t U0 = vreinterpretq_s16_u16(vshll_n_u8(u, 7)); \ const int16x8_t V0 = vreinterpretq_s16_u16(vshll_n_u8(v, 7)); \ const int16x8_t Y1 = vqdmulhq_lane_s16(Y0, coeff1, 0); \ const int16x8_t R0 = vqdmulhq_lane_s16(V0, coeff1, 1); \ const int16x8_t G0 = vqdmulhq_lane_s16(U0, coeff1, 2); \ const int16x8_t G1 = vqdmulhq_lane_s16(V0, coeff1, 3); \ const int16x8_t B0 = vqdmulhq_n_s16(U0, 282); \ const int16x8_t R1 = vqaddq_s16(Y1, R_Rounder); \ const int16x8_t G2 = vqaddq_s16(Y1, G_Rounder); \ const int16x8_t B1 = vqaddq_s16(Y1, B_Rounder); \ const int16x8_t R2 = vqaddq_s16(R0, R1); \ const int16x8_t G3 = vqaddq_s16(G0, G1); \ const int16x8_t B2 = vqaddq_s16(B0, B1); \ const int16x8_t G4 = vqsubq_s16(G2, G3); \ const int16x8_t B3 = vqaddq_s16(B2, U0); \ const uint8x8_t R = vqshrun_n_s16(R2, YUV_FIX2); \ const uint8x8_t G = vqshrun_n_s16(G4, YUV_FIX2); \ const uint8x8_t B = vqshrun_n_s16(B3, YUV_FIX2); \ STORE_ ## FMT(out + off, R, G, B); \ } \ } while (0) #define CONVERT1(FUNC, XSTEP, N, src_y, src_uv, rgb, cur_x) { \ int i; \ for (i = 0; i < N; i++) { \ const int off = ((cur_x) + i) * XSTEP; \ const int y = src_y[(cur_x) + i]; \ const int u = (src_uv)[i]; \ const int v = (src_uv)[i + 16]; \ FUNC(y, u, v, rgb + off); \ } \ } #define CONVERT2RGB_8(FMT, XSTEP, top_y, bottom_y, uv, \ top_dst, bottom_dst, cur_x, len) { \ CONVERT8(FMT, XSTEP, len, top_y, uv, top_dst, cur_x); \ if (bottom_y != NULL) { \ CONVERT8(FMT, XSTEP, len, bottom_y, (uv) + 32, bottom_dst, cur_x); \ } \ } #define CONVERT2RGB_1(FUNC, XSTEP, top_y, bottom_y, uv, \ top_dst, bottom_dst, cur_x, len) { \ CONVERT1(FUNC, XSTEP, len, top_y, uv, top_dst, cur_x); \ if (bottom_y != NULL) { \ CONVERT1(FUNC, XSTEP, len, bottom_y, (uv) + 32, bottom_dst, cur_x); \ } \ } #define NEON_UPSAMPLE_FUNC(FUNC_NAME, FMT, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ int block; \ /* 16 byte aligned array to cache reconstructed u and v */ \ uint8_t uv_buf[2 * 32 + 15]; \ uint8_t* const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \ const int uv_len = (len + 1) >> 1; \ /* 9 pixels must be read-able for each block */ \ const int num_blocks = (uv_len - 1) >> 3; \ const int leftover = uv_len - num_blocks * 8; \ const int last_pos = 1 + 16 * num_blocks; \ \ const int u_diag = ((top_u[0] + cur_u[0]) >> 1) + 1; \ const int v_diag = ((top_v[0] + cur_v[0]) >> 1) + 1; \ \ const int16x4_t coeff1 = vld1_s16(kCoeffs1); \ const int16x8_t R_Rounder = vdupq_n_s16(-14234); \ const int16x8_t G_Rounder = vdupq_n_s16(8708); \ const int16x8_t B_Rounder = vdupq_n_s16(-17685); \ \ /* Treat the first pixel in regular way */ \ assert(top_y != NULL); \ { \ const int u0 = (top_u[0] + u_diag) >> 1; \ const int v0 = (top_v[0] + v_diag) >> 1; \ VP8YuvTo ## FMT(top_y[0], u0, v0, top_dst); \ } \ if (bottom_y != NULL) { \ const int u0 = (cur_u[0] + u_diag) >> 1; \ const int v0 = (cur_v[0] + v_diag) >> 1; \ VP8YuvTo ## FMT(bottom_y[0], u0, v0, bottom_dst); \ } \ \ for (block = 0; block < num_blocks; ++block) { \ UPSAMPLE_16PIXELS(top_u, cur_u, r_uv); \ UPSAMPLE_16PIXELS(top_v, cur_v, r_uv + 16); \ CONVERT2RGB_8(FMT, XSTEP, top_y, bottom_y, r_uv, \ top_dst, bottom_dst, 16 * block + 1, 16); \ top_u += 8; \ cur_u += 8; \ top_v += 8; \ cur_v += 8; \ } \ \ UPSAMPLE_LAST_BLOCK(top_u, cur_u, leftover, r_uv); \ UPSAMPLE_LAST_BLOCK(top_v, cur_v, leftover, r_uv + 16); \ CONVERT2RGB_1(VP8YuvTo ## FMT, XSTEP, top_y, bottom_y, r_uv, \ top_dst, bottom_dst, last_pos, len - last_pos); \ } // NEON variants of the fancy upsampler. NEON_UPSAMPLE_FUNC(UpsampleRgbaLinePair_NEON, Rgba, 4) NEON_UPSAMPLE_FUNC(UpsampleBgraLinePair_NEON, Bgra, 4) #if !defined(WEBP_REDUCE_CSP) NEON_UPSAMPLE_FUNC(UpsampleRgbLinePair_NEON, Rgb, 3) NEON_UPSAMPLE_FUNC(UpsampleBgrLinePair_NEON, Bgr, 3) NEON_UPSAMPLE_FUNC(UpsampleArgbLinePair_NEON, Argb, 4) NEON_UPSAMPLE_FUNC(UpsampleRgba4444LinePair_NEON, Rgba4444, 2) NEON_UPSAMPLE_FUNC(UpsampleRgb565LinePair_NEON, Rgb565, 2) #endif // WEBP_REDUCE_CSP //------------------------------------------------------------------------------ // Entry point extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; extern void WebPInitUpsamplersNEON(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersNEON(void) { WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair_NEON; WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair_NEON; WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair_NEON; WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair_NEON; #if !defined(WEBP_REDUCE_CSP) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair_NEON; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair_NEON; WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair_NEON; WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair_NEON; WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair_NEON; WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair_NEON; WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair_NEON; #endif // WEBP_REDUCE_CSP } #endif // FANCY_UPSAMPLING #endif // WEBP_USE_NEON #if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_NEON)) WEBP_DSP_INIT_STUB(WebPInitUpsamplersNEON) #endif libwebp-1.4.0/src/dsp/lossless_enc_msa.c0000644000014400001440000001314214606317060015131 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA variant of Image transform methods for lossless encoder. // // Authors: Prashant Patil (Prashant.Patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include "src/dsp/lossless.h" #include "src/dsp/msa_macro.h" #define TRANSFORM_COLOR_8(src0, src1, dst0, dst1, c0, c1, mask0, mask1) do { \ v8i16 g0, g1, t0, t1, t2, t3; \ v4i32 t4, t5; \ VSHF_B2_SH(src0, src0, src1, src1, mask0, mask0, g0, g1); \ DOTP_SB2_SH(g0, g1, c0, c0, t0, t1); \ SRAI_H2_SH(t0, t1, 5); \ t0 = __msa_subv_h((v8i16)src0, t0); \ t1 = __msa_subv_h((v8i16)src1, t1); \ t4 = __msa_srli_w((v4i32)src0, 16); \ t5 = __msa_srli_w((v4i32)src1, 16); \ DOTP_SB2_SH(t4, t5, c1, c1, t2, t3); \ SRAI_H2_SH(t2, t3, 5); \ SUB2(t0, t2, t1, t3, t0, t1); \ VSHF_B2_UB(src0, t0, src1, t1, mask1, mask1, dst0, dst1); \ } while (0) #define TRANSFORM_COLOR_4(src, dst, c0, c1, mask0, mask1) do { \ const v16i8 g0 = VSHF_SB(src, src, mask0); \ v8i16 t0 = __msa_dotp_s_h(c0, g0); \ v8i16 t1; \ v4i32 t2; \ t0 = SRAI_H(t0, 5); \ t0 = __msa_subv_h((v8i16)src, t0); \ t2 = __msa_srli_w((v4i32)src, 16); \ t1 = __msa_dotp_s_h(c1, (v16i8)t2); \ t1 = SRAI_H(t1, 5); \ t0 = t0 - t1; \ dst = VSHF_UB(src, t0, mask1); \ } while (0) static void TransformColor_MSA(const VP8LMultipliers* const m, uint32_t* data, int num_pixels) { v16u8 src0, dst0; const v16i8 g2br = (v16i8)__msa_fill_w(m->green_to_blue_ | (m->green_to_red_ << 16)); const v16i8 r2b = (v16i8)__msa_fill_w(m->red_to_blue_); const v16u8 mask0 = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; const v16u8 mask1 = { 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 28, 13, 30, 15 }; while (num_pixels >= 8) { v16u8 src1, dst1; LD_UB2(data, 4, src0, src1); TRANSFORM_COLOR_8(src0, src1, dst0, dst1, g2br, r2b, mask0, mask1); ST_UB2(dst0, dst1, data, 4); data += 8; num_pixels -= 8; } if (num_pixels > 0) { if (num_pixels >= 4) { src0 = LD_UB(data); TRANSFORM_COLOR_4(src0, dst0, g2br, r2b, mask0, mask1); ST_UB(dst0, data); data += 4; num_pixels -= 4; } if (num_pixels > 0) { src0 = LD_UB(data); TRANSFORM_COLOR_4(src0, dst0, g2br, r2b, mask0, mask1); if (num_pixels == 3) { const uint64_t pix_d = __msa_copy_s_d((v2i64)dst0, 0); const uint32_t pix_w = __msa_copy_s_w((v4i32)dst0, 2); SD(pix_d, data + 0); SW(pix_w, data + 2); } else if (num_pixels == 2) { const uint64_t pix_d = __msa_copy_s_d((v2i64)dst0, 0); SD(pix_d, data); } else { const uint32_t pix_w = __msa_copy_s_w((v4i32)dst0, 0); SW(pix_w, data); } } } } static void SubtractGreenFromBlueAndRed_MSA(uint32_t* argb_data, int num_pixels) { int i; uint8_t* ptemp_data = (uint8_t*)argb_data; v16u8 src0, dst0, tmp0; const v16u8 mask = { 1, 255, 1, 255, 5, 255, 5, 255, 9, 255, 9, 255, 13, 255, 13, 255 }; while (num_pixels >= 8) { v16u8 src1, dst1, tmp1; LD_UB2(ptemp_data, 16, src0, src1); VSHF_B2_UB(src0, src1, src1, src0, mask, mask, tmp0, tmp1); SUB2(src0, tmp0, src1, tmp1, dst0, dst1); ST_UB2(dst0, dst1, ptemp_data, 16); ptemp_data += 8 * 4; num_pixels -= 8; } if (num_pixels > 0) { if (num_pixels >= 4) { src0 = LD_UB(ptemp_data); tmp0 = VSHF_UB(src0, src0, mask); dst0 = src0 - tmp0; ST_UB(dst0, ptemp_data); ptemp_data += 4 * 4; num_pixels -= 4; } for (i = 0; i < num_pixels; i++) { const uint8_t b = ptemp_data[0]; const uint8_t g = ptemp_data[1]; const uint8_t r = ptemp_data[2]; ptemp_data[0] = (b - g) & 0xff; ptemp_data[2] = (r - g) & 0xff; ptemp_data += 4; } } } //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitMSA(void) { VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_MSA; VP8LTransformColor = TransformColor_MSA; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(VP8LEncDspInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/alpha_processing_neon.c0000644000014400001440000001613514606317060016142 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for processing transparent channel, NEON version. // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include "src/dsp/neon.h" //------------------------------------------------------------------------------ #define MULTIPLIER(a) ((a) * 0x8081) #define PREMULTIPLY(x, m) (((x) * (m)) >> 23) #define MULTIPLY_BY_ALPHA(V, ALPHA, OTHER) do { \ const uint8x8_t alpha = (V).val[(ALPHA)]; \ const uint16x8_t r1 = vmull_u8((V).val[1], alpha); \ const uint16x8_t g1 = vmull_u8((V).val[2], alpha); \ const uint16x8_t b1 = vmull_u8((V).val[(OTHER)], alpha); \ /* we use: v / 255 = (v + 1 + (v >> 8)) >> 8 */ \ const uint16x8_t r2 = vsraq_n_u16(r1, r1, 8); \ const uint16x8_t g2 = vsraq_n_u16(g1, g1, 8); \ const uint16x8_t b2 = vsraq_n_u16(b1, b1, 8); \ const uint16x8_t r3 = vaddq_u16(r2, kOne); \ const uint16x8_t g3 = vaddq_u16(g2, kOne); \ const uint16x8_t b3 = vaddq_u16(b2, kOne); \ (V).val[1] = vshrn_n_u16(r3, 8); \ (V).val[2] = vshrn_n_u16(g3, 8); \ (V).val[(OTHER)] = vshrn_n_u16(b3, 8); \ } while (0) static void ApplyAlphaMultiply_NEON(uint8_t* rgba, int alpha_first, int w, int h, int stride) { const uint16x8_t kOne = vdupq_n_u16(1u); while (h-- > 0) { uint32_t* const rgbx = (uint32_t*)rgba; int i = 0; if (alpha_first) { for (; i + 8 <= w; i += 8) { // load aaaa...|rrrr...|gggg...|bbbb... uint8x8x4_t RGBX = vld4_u8((const uint8_t*)(rgbx + i)); MULTIPLY_BY_ALPHA(RGBX, 0, 3); vst4_u8((uint8_t*)(rgbx + i), RGBX); } } else { for (; i + 8 <= w; i += 8) { uint8x8x4_t RGBX = vld4_u8((const uint8_t*)(rgbx + i)); MULTIPLY_BY_ALPHA(RGBX, 3, 0); vst4_u8((uint8_t*)(rgbx + i), RGBX); } } // Finish with left-overs. for (; i < w; ++i) { uint8_t* const rgb = rgba + (alpha_first ? 1 : 0); const uint8_t* const alpha = rgba + (alpha_first ? 0 : 3); const uint32_t a = alpha[4 * i]; if (a != 0xff) { const uint32_t mult = MULTIPLIER(a); rgb[4 * i + 0] = PREMULTIPLY(rgb[4 * i + 0], mult); rgb[4 * i + 1] = PREMULTIPLY(rgb[4 * i + 1], mult); rgb[4 * i + 2] = PREMULTIPLY(rgb[4 * i + 2], mult); } } rgba += stride; } } #undef MULTIPLY_BY_ALPHA #undef MULTIPLIER #undef PREMULTIPLY //------------------------------------------------------------------------------ static int DispatchAlpha_NEON(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint8_t* WEBP_RESTRICT dst, int dst_stride) { uint32_t alpha_mask = 0xffu; uint8x8_t mask8 = vdup_n_u8(0xff); uint32_t tmp[2]; int i, j; for (j = 0; j < height; ++j) { // We don't know if alpha is first or last in dst[] (depending on rgbA/Argb // mode). So we must be sure dst[4*i + 8 - 1] is writable for the store. // Hence the test with 'width - 1' instead of just 'width'. for (i = 0; i + 8 <= width - 1; i += 8) { uint8x8x4_t rgbX = vld4_u8((const uint8_t*)(dst + 4 * i)); const uint8x8_t alphas = vld1_u8(alpha + i); rgbX.val[0] = alphas; vst4_u8((uint8_t*)(dst + 4 * i), rgbX); mask8 = vand_u8(mask8, alphas); } for (; i < width; ++i) { const uint32_t alpha_value = alpha[i]; dst[4 * i] = alpha_value; alpha_mask &= alpha_value; } alpha += alpha_stride; dst += dst_stride; } vst1_u8((uint8_t*)tmp, mask8); alpha_mask *= 0x01010101; alpha_mask &= tmp[0]; alpha_mask &= tmp[1]; return (alpha_mask != 0xffffffffu); } static void DispatchAlphaToGreen_NEON(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint32_t* WEBP_RESTRICT dst, int dst_stride) { int i, j; uint8x8x4_t greens; // leave A/R/B channels zero'd. greens.val[0] = vdup_n_u8(0); greens.val[2] = vdup_n_u8(0); greens.val[3] = vdup_n_u8(0); for (j = 0; j < height; ++j) { for (i = 0; i + 8 <= width; i += 8) { greens.val[1] = vld1_u8(alpha + i); vst4_u8((uint8_t*)(dst + i), greens); } for (; i < width; ++i) dst[i] = alpha[i] << 8; alpha += alpha_stride; dst += dst_stride; } } static int ExtractAlpha_NEON(const uint8_t* WEBP_RESTRICT argb, int argb_stride, int width, int height, uint8_t* WEBP_RESTRICT alpha, int alpha_stride) { uint32_t alpha_mask = 0xffu; uint8x8_t mask8 = vdup_n_u8(0xff); uint32_t tmp[2]; int i, j; for (j = 0; j < height; ++j) { // We don't know if alpha is first or last in dst[] (depending on rgbA/Argb // mode). So we must be sure dst[4*i + 8 - 1] is writable for the store. // Hence the test with 'width - 1' instead of just 'width'. for (i = 0; i + 8 <= width - 1; i += 8) { const uint8x8x4_t rgbX = vld4_u8((const uint8_t*)(argb + 4 * i)); const uint8x8_t alphas = rgbX.val[0]; vst1_u8((uint8_t*)(alpha + i), alphas); mask8 = vand_u8(mask8, alphas); } for (; i < width; ++i) { alpha[i] = argb[4 * i]; alpha_mask &= alpha[i]; } argb += argb_stride; alpha += alpha_stride; } vst1_u8((uint8_t*)tmp, mask8); alpha_mask *= 0x01010101; alpha_mask &= tmp[0]; alpha_mask &= tmp[1]; return (alpha_mask == 0xffffffffu); } static void ExtractGreen_NEON(const uint32_t* WEBP_RESTRICT argb, uint8_t* WEBP_RESTRICT alpha, int size) { int i; for (i = 0; i + 16 <= size; i += 16) { const uint8x16x4_t rgbX = vld4q_u8((const uint8_t*)(argb + i)); const uint8x16_t greens = rgbX.val[1]; vst1q_u8(alpha + i, greens); } for (; i < size; ++i) alpha[i] = (argb[i] >> 8) & 0xff; } //------------------------------------------------------------------------------ extern void WebPInitAlphaProcessingNEON(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingNEON(void) { WebPApplyAlphaMultiply = ApplyAlphaMultiply_NEON; WebPDispatchAlpha = DispatchAlpha_NEON; WebPDispatchAlphaToGreen = DispatchAlphaToGreen_NEON; WebPExtractAlpha = ExtractAlpha_NEON; WebPExtractGreen = ExtractGreen_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(WebPInitAlphaProcessingNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/yuv_neon.c0000644000014400001440000001553414606317060013446 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV->RGB conversion functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/yuv.h" #if defined(WEBP_USE_NEON) #include #include #include "src/dsp/neon.h" //----------------------------------------------------------------------------- static uint8x8_t ConvertRGBToY_NEON(const uint8x8_t R, const uint8x8_t G, const uint8x8_t B) { const uint16x8_t r = vmovl_u8(R); const uint16x8_t g = vmovl_u8(G); const uint16x8_t b = vmovl_u8(B); const uint16x4_t r_lo = vget_low_u16(r); const uint16x4_t r_hi = vget_high_u16(r); const uint16x4_t g_lo = vget_low_u16(g); const uint16x4_t g_hi = vget_high_u16(g); const uint16x4_t b_lo = vget_low_u16(b); const uint16x4_t b_hi = vget_high_u16(b); const uint32x4_t tmp0_lo = vmull_n_u16( r_lo, 16839u); const uint32x4_t tmp0_hi = vmull_n_u16( r_hi, 16839u); const uint32x4_t tmp1_lo = vmlal_n_u16(tmp0_lo, g_lo, 33059u); const uint32x4_t tmp1_hi = vmlal_n_u16(tmp0_hi, g_hi, 33059u); const uint32x4_t tmp2_lo = vmlal_n_u16(tmp1_lo, b_lo, 6420u); const uint32x4_t tmp2_hi = vmlal_n_u16(tmp1_hi, b_hi, 6420u); const uint16x8_t Y1 = vcombine_u16(vrshrn_n_u32(tmp2_lo, 16), vrshrn_n_u32(tmp2_hi, 16)); const uint16x8_t Y2 = vaddq_u16(Y1, vdupq_n_u16(16)); return vqmovn_u16(Y2); } static void ConvertRGB24ToY_NEON(const uint8_t* rgb, uint8_t* y, int width) { int i; for (i = 0; i + 8 <= width; i += 8, rgb += 3 * 8) { const uint8x8x3_t RGB = vld3_u8(rgb); const uint8x8_t Y = ConvertRGBToY_NEON(RGB.val[0], RGB.val[1], RGB.val[2]); vst1_u8(y + i, Y); } for (; i < width; ++i, rgb += 3) { // left-over y[i] = VP8RGBToY(rgb[0], rgb[1], rgb[2], YUV_HALF); } } static void ConvertBGR24ToY_NEON(const uint8_t* bgr, uint8_t* y, int width) { int i; for (i = 0; i + 8 <= width; i += 8, bgr += 3 * 8) { const uint8x8x3_t BGR = vld3_u8(bgr); const uint8x8_t Y = ConvertRGBToY_NEON(BGR.val[2], BGR.val[1], BGR.val[0]); vst1_u8(y + i, Y); } for (; i < width; ++i, bgr += 3) { // left-over y[i] = VP8RGBToY(bgr[2], bgr[1], bgr[0], YUV_HALF); } } static void ConvertARGBToY_NEON(const uint32_t* argb, uint8_t* y, int width) { int i; for (i = 0; i + 8 <= width; i += 8) { const uint8x8x4_t RGB = vld4_u8((const uint8_t*)&argb[i]); const uint8x8_t Y = ConvertRGBToY_NEON(RGB.val[2], RGB.val[1], RGB.val[0]); vst1_u8(y + i, Y); } for (; i < width; ++i) { // left-over const uint32_t p = argb[i]; y[i] = VP8RGBToY((p >> 16) & 0xff, (p >> 8) & 0xff, (p >> 0) & 0xff, YUV_HALF); } } //----------------------------------------------------------------------------- // computes: DST_s16 = [(C0 * r + C1 * g + C2 * b) >> 16] + CST #define MULTIPLY_16b_PREAMBLE(r, g, b) \ const int16x4_t r_lo = vreinterpret_s16_u16(vget_low_u16(r)); \ const int16x4_t r_hi = vreinterpret_s16_u16(vget_high_u16(r)); \ const int16x4_t g_lo = vreinterpret_s16_u16(vget_low_u16(g)); \ const int16x4_t g_hi = vreinterpret_s16_u16(vget_high_u16(g)); \ const int16x4_t b_lo = vreinterpret_s16_u16(vget_low_u16(b)); \ const int16x4_t b_hi = vreinterpret_s16_u16(vget_high_u16(b)) #define MULTIPLY_16b(C0, C1, C2, CST, DST_s16) do { \ const int32x4_t tmp0_lo = vmull_n_s16( r_lo, C0); \ const int32x4_t tmp0_hi = vmull_n_s16( r_hi, C0); \ const int32x4_t tmp1_lo = vmlal_n_s16(tmp0_lo, g_lo, C1); \ const int32x4_t tmp1_hi = vmlal_n_s16(tmp0_hi, g_hi, C1); \ const int32x4_t tmp2_lo = vmlal_n_s16(tmp1_lo, b_lo, C2); \ const int32x4_t tmp2_hi = vmlal_n_s16(tmp1_hi, b_hi, C2); \ const int16x8_t tmp3 = vcombine_s16(vshrn_n_s32(tmp2_lo, 16), \ vshrn_n_s32(tmp2_hi, 16)); \ DST_s16 = vaddq_s16(tmp3, vdupq_n_s16(CST)); \ } while (0) // This needs to be a macro, since (128 << SHIFT) needs to be an immediate. #define CONVERT_RGB_TO_UV(r, g, b, SHIFT, U_DST, V_DST) do { \ MULTIPLY_16b_PREAMBLE(r, g, b); \ MULTIPLY_16b(-9719, -19081, 28800, 128 << SHIFT, U_DST); \ MULTIPLY_16b(28800, -24116, -4684, 128 << SHIFT, V_DST); \ } while (0) static void ConvertRGBA32ToUV_NEON(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width) { int i; for (i = 0; i + 8 <= width; i += 8, rgb += 4 * 8) { const uint16x8x4_t RGB = vld4q_u16((const uint16_t*)rgb); int16x8_t U, V; CONVERT_RGB_TO_UV(RGB.val[0], RGB.val[1], RGB.val[2], 2, U, V); vst1_u8(u + i, vqrshrun_n_s16(U, 2)); vst1_u8(v + i, vqrshrun_n_s16(V, 2)); } for (; i < width; i += 1, rgb += 4) { const int r = rgb[0], g = rgb[1], b = rgb[2]; u[i] = VP8RGBToU(r, g, b, YUV_HALF << 2); v[i] = VP8RGBToV(r, g, b, YUV_HALF << 2); } } static void ConvertARGBToUV_NEON(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store) { int i; for (i = 0; i + 16 <= src_width; i += 16, u += 8, v += 8) { const uint8x16x4_t RGB = vld4q_u8((const uint8_t*)&argb[i]); const uint16x8_t R = vpaddlq_u8(RGB.val[2]); // pair-wise adds const uint16x8_t G = vpaddlq_u8(RGB.val[1]); const uint16x8_t B = vpaddlq_u8(RGB.val[0]); int16x8_t U_tmp, V_tmp; CONVERT_RGB_TO_UV(R, G, B, 1, U_tmp, V_tmp); { const uint8x8_t U = vqrshrun_n_s16(U_tmp, 1); const uint8x8_t V = vqrshrun_n_s16(V_tmp, 1); if (do_store) { vst1_u8(u, U); vst1_u8(v, V); } else { const uint8x8_t prev_u = vld1_u8(u); const uint8x8_t prev_v = vld1_u8(v); vst1_u8(u, vrhadd_u8(U, prev_u)); vst1_u8(v, vrhadd_u8(V, prev_v)); } } } if (i < src_width) { // left-over WebPConvertARGBToUV_C(argb + i, u, v, src_width - i, do_store); } } //------------------------------------------------------------------------------ extern void WebPInitConvertARGBToYUVNEON(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitConvertARGBToYUVNEON(void) { WebPConvertRGB24ToY = ConvertRGB24ToY_NEON; WebPConvertBGR24ToY = ConvertBGR24ToY_NEON; WebPConvertARGBToY = ConvertARGBToY_NEON; WebPConvertARGBToUV = ConvertARGBToUV_NEON; WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/cost_sse2.c0000644000014400001440000001056514606317060013507 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 version of cost functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ static void SetResidualCoeffs_SSE2(const int16_t* const coeffs, VP8Residual* const res) { const __m128i c0 = _mm_loadu_si128((const __m128i*)(coeffs + 0)); const __m128i c1 = _mm_loadu_si128((const __m128i*)(coeffs + 8)); // Use SSE2 to compare 16 values with a single instruction. const __m128i zero = _mm_setzero_si128(); const __m128i m0 = _mm_packs_epi16(c0, c1); const __m128i m1 = _mm_cmpeq_epi8(m0, zero); // Get the comparison results as a bitmask into 16bits. Negate the mask to get // the position of entries that are not equal to zero. We don't need to mask // out least significant bits according to res->first, since coeffs[0] is 0 // if res->first > 0. const uint32_t mask = 0x0000ffffu ^ (uint32_t)_mm_movemask_epi8(m1); // The position of the most significant non-zero bit indicates the position of // the last non-zero value. assert(res->first == 0 || coeffs[0] == 0); res->last = mask ? BitsLog2Floor(mask) : -1; res->coeffs = coeffs; } static int GetResidualCost_SSE2(int ctx0, const VP8Residual* const res) { uint8_t levels[16], ctxs[16]; uint16_t abs_levels[16]; int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 const int p0 = res->prob[n][ctx0][0]; CostArrayPtr const costs = res->costs; const uint16_t* t = costs[n][ctx0]; // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0 // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll // be missing during the loop. int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; if (res->last < 0) { return VP8BitCost(0, p0); } { // precompute clamped levels and contexts, packed to 8b. const __m128i zero = _mm_setzero_si128(); const __m128i kCst2 = _mm_set1_epi8(2); const __m128i kCst67 = _mm_set1_epi8(MAX_VARIABLE_LEVEL); const __m128i c0 = _mm_loadu_si128((const __m128i*)&res->coeffs[0]); const __m128i c1 = _mm_loadu_si128((const __m128i*)&res->coeffs[8]); const __m128i D0 = _mm_sub_epi16(zero, c0); const __m128i D1 = _mm_sub_epi16(zero, c1); const __m128i E0 = _mm_max_epi16(c0, D0); // abs(v), 16b const __m128i E1 = _mm_max_epi16(c1, D1); const __m128i F = _mm_packs_epi16(E0, E1); const __m128i G = _mm_min_epu8(F, kCst2); // context = 0,1,2 const __m128i H = _mm_min_epu8(F, kCst67); // clamp_level in [0..67] _mm_storeu_si128((__m128i*)&ctxs[0], G); _mm_storeu_si128((__m128i*)&levels[0], H); _mm_storeu_si128((__m128i*)&abs_levels[0], E0); _mm_storeu_si128((__m128i*)&abs_levels[8], E1); } for (; n < res->last; ++n) { const int ctx = ctxs[n]; const int level = levels[n]; const int flevel = abs_levels[n]; // full level cost += VP8LevelFixedCosts[flevel] + t[level]; // simplified VP8LevelCost() t = costs[n + 1][ctx]; } // Last coefficient is always non-zero { const int level = levels[n]; const int flevel = abs_levels[n]; assert(flevel != 0); cost += VP8LevelFixedCosts[flevel] + t[level]; if (n < 15) { const int b = VP8EncBands[n + 1]; const int ctx = ctxs[n]; const int last_p0 = res->prob[b][ctx][0]; cost += VP8BitCost(0, last_p0); } } return cost; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspCostInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspCostInitSSE2(void) { VP8SetResidualCoeffs = SetResidualCoeffs_SSE2; VP8GetResidualCost = GetResidualCost_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8EncDspCostInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/cpu.h0000644000014400001440000002120314606317060012366 0ustar // Copyright 2022 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // CPU detection functions and macros. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DSP_CPU_H_ #define WEBP_DSP_CPU_H_ #include #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/webp/types.h" #if defined(__GNUC__) #define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__) #define LOCAL_GCC_PREREQ(maj, min) (LOCAL_GCC_VERSION >= (((maj) << 8) | (min))) #else #define LOCAL_GCC_VERSION 0 #define LOCAL_GCC_PREREQ(maj, min) 0 #endif #if defined(__clang__) #define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__) #define LOCAL_CLANG_PREREQ(maj, min) \ (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min))) #else #define LOCAL_CLANG_VERSION 0 #define LOCAL_CLANG_PREREQ(maj, min) 0 #endif #ifndef __has_builtin #define __has_builtin(x) 0 #endif //------------------------------------------------------------------------------ // x86 defines. #if !defined(HAVE_CONFIG_H) #if defined(_MSC_VER) && _MSC_VER > 1310 && \ (defined(_M_X64) || defined(_M_IX86)) #define WEBP_MSC_SSE2 // Visual C++ SSE2 targets #endif #if defined(_MSC_VER) && _MSC_VER >= 1500 && \ (defined(_M_X64) || defined(_M_IX86)) #define WEBP_MSC_SSE41 // Visual C++ SSE4.1 targets #endif #endif // WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp // files without intrinsics, allowing the corresponding Init() to be called. // Files containing intrinsics will need to be built targeting the instruction // set so should succeed on one of the earlier tests. #if (defined(__SSE2__) || defined(WEBP_MSC_SSE2)) && \ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE2)) #define WEBP_USE_SSE2 #endif #if defined(WEBP_USE_SSE2) && !defined(WEBP_HAVE_SSE2) #define WEBP_HAVE_SSE2 #endif #if (defined(__SSE4_1__) || defined(WEBP_MSC_SSE41)) && \ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_SSE41)) #define WEBP_USE_SSE41 #endif #if defined(WEBP_USE_SSE41) && !defined(WEBP_HAVE_SSE41) #define WEBP_HAVE_SSE41 #endif #undef WEBP_MSC_SSE41 #undef WEBP_MSC_SSE2 //------------------------------------------------------------------------------ // Arm defines. // The intrinsics currently cause compiler errors with arm-nacl-gcc and the // inline assembly would need to be modified for use with Native Client. #if ((defined(__ARM_NEON__) || defined(__aarch64__)) && \ (!defined(HAVE_CONFIG_H) || defined(WEBP_HAVE_NEON))) && \ !defined(__native_client__) #define WEBP_USE_NEON #endif #if !defined(WEBP_USE_NEON) && defined(__ANDROID__) && \ defined(__ARM_ARCH_7A__) && defined(HAVE_CPU_FEATURES_H) #define WEBP_ANDROID_NEON // Android targets that may have NEON #define WEBP_USE_NEON #endif // Note: ARM64 is supported in Visual Studio 2017, but requires the direct // inclusion of arm64_neon.h; Visual Studio 2019 includes this file in // arm_neon.h. Compile errors were seen with Visual Studio 2019 16.4 with // vtbl4_u8(); a fix was made in 16.6. #if defined(_MSC_VER) && \ ((_MSC_VER >= 1700 && defined(_M_ARM)) || \ (_MSC_VER >= 1926 && (defined(_M_ARM64) || defined(_M_ARM64EC)))) #define WEBP_USE_NEON #define WEBP_USE_INTRINSICS #endif #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) #define WEBP_AARCH64 1 #else #define WEBP_AARCH64 0 #endif #if defined(WEBP_USE_NEON) && !defined(WEBP_HAVE_NEON) #define WEBP_HAVE_NEON #endif //------------------------------------------------------------------------------ // MIPS defines. #if defined(__mips__) && !defined(__mips64) && defined(__mips_isa_rev) && \ (__mips_isa_rev >= 1) && (__mips_isa_rev < 6) #define WEBP_USE_MIPS32 #if (__mips_isa_rev >= 2) #define WEBP_USE_MIPS32_R2 #if defined(__mips_dspr2) || (defined(__mips_dsp_rev) && __mips_dsp_rev >= 2) #define WEBP_USE_MIPS_DSP_R2 #endif #endif #endif #if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) #define WEBP_USE_MSA #endif //------------------------------------------------------------------------------ #ifndef WEBP_DSP_OMIT_C_CODE #define WEBP_DSP_OMIT_C_CODE 1 #endif #if defined(WEBP_USE_NEON) && WEBP_DSP_OMIT_C_CODE #define WEBP_NEON_OMIT_C_CODE 1 #else #define WEBP_NEON_OMIT_C_CODE 0 #endif #if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || WEBP_AARCH64) #define WEBP_NEON_WORK_AROUND_GCC 1 #else #define WEBP_NEON_WORK_AROUND_GCC 0 #endif //------------------------------------------------------------------------------ // This macro prevents thread_sanitizer from reporting known concurrent writes. #define WEBP_TSAN_IGNORE_FUNCTION #if defined(__has_feature) #if __has_feature(thread_sanitizer) #undef WEBP_TSAN_IGNORE_FUNCTION #define WEBP_TSAN_IGNORE_FUNCTION __attribute__((no_sanitize_thread)) #endif #endif #if defined(__has_feature) #if __has_feature(memory_sanitizer) #define WEBP_MSAN #endif #endif #if defined(WEBP_USE_THREAD) && !defined(_WIN32) #include // NOLINT #define WEBP_DSP_INIT(func) \ do { \ static volatile VP8CPUInfo func##_last_cpuinfo_used = \ (VP8CPUInfo)&func##_last_cpuinfo_used; \ static pthread_mutex_t func##_lock = PTHREAD_MUTEX_INITIALIZER; \ if (pthread_mutex_lock(&func##_lock)) break; \ if (func##_last_cpuinfo_used != VP8GetCPUInfo) func(); \ func##_last_cpuinfo_used = VP8GetCPUInfo; \ (void)pthread_mutex_unlock(&func##_lock); \ } while (0) #else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32)) #define WEBP_DSP_INIT(func) \ do { \ static volatile VP8CPUInfo func##_last_cpuinfo_used = \ (VP8CPUInfo)&func##_last_cpuinfo_used; \ if (func##_last_cpuinfo_used == VP8GetCPUInfo) break; \ func(); \ func##_last_cpuinfo_used = VP8GetCPUInfo; \ } while (0) #endif // defined(WEBP_USE_THREAD) && !defined(_WIN32) // Defines an Init + helper function that control multiple initialization of // function pointers / tables. /* Usage: WEBP_DSP_INIT_FUNC(InitFunc) { ...function body } */ #define WEBP_DSP_INIT_FUNC(name) \ static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void); \ WEBP_TSAN_IGNORE_FUNCTION void name(void) { WEBP_DSP_INIT(name##_body); } \ static WEBP_TSAN_IGNORE_FUNCTION void name##_body(void) #define WEBP_UBSAN_IGNORE_UNDEF #define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW #if defined(__clang__) && defined(__has_attribute) #if __has_attribute(no_sanitize) // This macro prevents the undefined behavior sanitizer from reporting // failures. This is only meant to silence unaligned loads on platforms that // are known to support them. #undef WEBP_UBSAN_IGNORE_UNDEF #define WEBP_UBSAN_IGNORE_UNDEF __attribute__((no_sanitize("undefined"))) // This macro prevents the undefined behavior sanitizer from reporting // failures related to unsigned integer overflows. This is only meant to // silence cases where this well defined behavior is expected. #undef WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW #define WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW \ __attribute__((no_sanitize("unsigned-integer-overflow"))) #endif #endif // If 'ptr' is NULL, returns NULL. Otherwise returns 'ptr + off'. // Prevents undefined behavior sanitizer nullptr-with-nonzero-offset warning. #if !defined(WEBP_OFFSET_PTR) #define WEBP_OFFSET_PTR(ptr, off) (((ptr) == NULL) ? NULL : ((ptr) + (off))) #endif // Regularize the definition of WEBP_SWAP_16BIT_CSP (backward compatibility) #if !defined(WEBP_SWAP_16BIT_CSP) #define WEBP_SWAP_16BIT_CSP 0 #endif // some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__) #if !defined(WORDS_BIGENDIAN) && \ (defined(__BIG_ENDIAN__) || defined(_M_PPC) || \ (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))) #define WORDS_BIGENDIAN #endif typedef enum { kSSE2, kSSE3, kSlowSSSE3, // special feature for slow SSSE3 architectures kSSE4_1, kAVX, kAVX2, kNEON, kMIPS32, kMIPSdspR2, kMSA } CPUFeature; // returns true if the CPU supports the feature. typedef int (*VP8CPUInfo)(CPUFeature feature); #endif // WEBP_DSP_CPU_H_ libwebp-1.4.0/src/dsp/lossless_sse41.c0000644000014400001440000001231714606317060014466 0ustar // Copyright 2021 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE41 variant of methods for lossless decoder #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include "src/dsp/common_sse41.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" //------------------------------------------------------------------------------ // Color-space conversion functions static void TransformColorInverse_SSE41(const VP8LMultipliers* const m, const uint32_t* const src, int num_pixels, uint32_t* dst) { // sign-extended multiplying constants, pre-shifted by 5. #define CST(X) (((int16_t)(m->X << 8)) >> 5) // sign-extend const __m128i mults_rb = _mm_set1_epi32((int)((uint32_t)CST(green_to_red_) << 16 | (CST(green_to_blue_) & 0xffff))); const __m128i mults_b2 = _mm_set1_epi32(CST(red_to_blue_)); #undef CST const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); const __m128i perm1 = _mm_setr_epi8(-1, 1, -1, 1, -1, 5, -1, 5, -1, 9, -1, 9, -1, 13, -1, 13); const __m128i perm2 = _mm_setr_epi8(-1, 2, -1, -1, -1, 6, -1, -1, -1, 10, -1, -1, -1, 14, -1, -1); int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i A = _mm_loadu_si128((const __m128i*)(src + i)); const __m128i B = _mm_shuffle_epi8(A, perm1); // argb -> g0g0 const __m128i C = _mm_mulhi_epi16(B, mults_rb); const __m128i D = _mm_add_epi8(A, C); const __m128i E = _mm_shuffle_epi8(D, perm2); const __m128i F = _mm_mulhi_epi16(E, mults_b2); const __m128i G = _mm_add_epi8(D, F); const __m128i out = _mm_blendv_epi8(G, A, mask_ag); _mm_storeu_si128((__m128i*)&dst[i], out); } // Fall-back to C-version for left-overs. if (i != num_pixels) { VP8LTransformColorInverse_C(m, src + i, num_pixels - i, dst + i); } } //------------------------------------------------------------------------------ #define ARGB_TO_RGB_SSE41 do { \ while (num_pixels >= 16) { \ const __m128i in0 = _mm_loadu_si128(in + 0); \ const __m128i in1 = _mm_loadu_si128(in + 1); \ const __m128i in2 = _mm_loadu_si128(in + 2); \ const __m128i in3 = _mm_loadu_si128(in + 3); \ const __m128i a0 = _mm_shuffle_epi8(in0, perm0); \ const __m128i a1 = _mm_shuffle_epi8(in1, perm1); \ const __m128i a2 = _mm_shuffle_epi8(in2, perm2); \ const __m128i a3 = _mm_shuffle_epi8(in3, perm3); \ const __m128i b0 = _mm_blend_epi16(a0, a1, 0xc0); \ const __m128i b1 = _mm_blend_epi16(a1, a2, 0xf0); \ const __m128i b2 = _mm_blend_epi16(a2, a3, 0xfc); \ _mm_storeu_si128(out + 0, b0); \ _mm_storeu_si128(out + 1, b1); \ _mm_storeu_si128(out + 2, b2); \ in += 4; \ out += 3; \ num_pixels -= 16; \ } \ } while (0) static void ConvertBGRAToRGB_SSE41(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; const __m128i perm0 = _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1); const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39); const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e); const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93); ARGB_TO_RGB_SSE41; // left-overs if (num_pixels > 0) { VP8LConvertBGRAToRGB_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } static void ConvertBGRAToBGR_SSE41(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; const __m128i perm0 = _mm_setr_epi8(0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, -1, -1, -1, -1); const __m128i perm1 = _mm_shuffle_epi32(perm0, 0x39); const __m128i perm2 = _mm_shuffle_epi32(perm0, 0x4e); const __m128i perm3 = _mm_shuffle_epi32(perm0, 0x93); ARGB_TO_RGB_SSE41; // left-overs if (num_pixels > 0) { VP8LConvertBGRAToBGR_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } #undef ARGB_TO_RGB_SSE41 //------------------------------------------------------------------------------ // Entry point extern void VP8LDspInitSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitSSE41(void) { VP8LTransformColorInverse = TransformColorInverse_SSE41; VP8LConvertBGRAToRGB = ConvertBGRAToRGB_SSE41; VP8LConvertBGRAToBGR = ConvertBGRAToBGR_SSE41; } #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(VP8LDspInitSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/Makefile.am0000644000014400001440000001670414606317060013474 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) noinst_LTLIBRARIES = noinst_LTLIBRARIES += libwebpdsp.la noinst_LTLIBRARIES += libwebpdsp_sse2.la noinst_LTLIBRARIES += libwebpdspdecode_sse2.la noinst_LTLIBRARIES += libwebpdsp_sse41.la noinst_LTLIBRARIES += libwebpdspdecode_sse41.la noinst_LTLIBRARIES += libwebpdsp_neon.la noinst_LTLIBRARIES += libwebpdspdecode_neon.la noinst_LTLIBRARIES += libwebpdsp_msa.la noinst_LTLIBRARIES += libwebpdspdecode_msa.la noinst_LTLIBRARIES += libwebpdsp_mips32.la noinst_LTLIBRARIES += libwebpdspdecode_mips32.la noinst_LTLIBRARIES += libwebpdsp_mips_dsp_r2.la noinst_LTLIBRARIES += libwebpdspdecode_mips_dsp_r2.la if BUILD_LIBWEBPDECODER noinst_LTLIBRARIES += libwebpdspdecode.la endif common_HEADERS = ../webp/types.h commondir = $(includedir)/webp COMMON_SOURCES = COMMON_SOURCES += alpha_processing.c COMMON_SOURCES += cpu.c COMMON_SOURCES += cpu.h COMMON_SOURCES += dec.c COMMON_SOURCES += dec_clip_tables.c COMMON_SOURCES += dsp.h COMMON_SOURCES += filters.c COMMON_SOURCES += lossless.c COMMON_SOURCES += lossless.h COMMON_SOURCES += lossless_common.h COMMON_SOURCES += rescaler.c COMMON_SOURCES += upsampling.c COMMON_SOURCES += yuv.c COMMON_SOURCES += yuv.h ENC_SOURCES = ENC_SOURCES += cost.c ENC_SOURCES += enc.c ENC_SOURCES += lossless_enc.c ENC_SOURCES += quant.h ENC_SOURCES += ssim.c libwebpdspdecode_sse41_la_SOURCES = libwebpdspdecode_sse41_la_SOURCES += alpha_processing_sse41.c libwebpdspdecode_sse41_la_SOURCES += dec_sse41.c libwebpdspdecode_sse41_la_SOURCES += lossless_sse41.c libwebpdspdecode_sse41_la_SOURCES += upsampling_sse41.c libwebpdspdecode_sse41_la_SOURCES += yuv_sse41.c libwebpdspdecode_sse41_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdspdecode_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_FLAGS) libwebpdspdecode_sse2_la_SOURCES = libwebpdspdecode_sse2_la_SOURCES += alpha_processing_sse2.c libwebpdspdecode_sse2_la_SOURCES += common_sse2.h libwebpdspdecode_sse2_la_SOURCES += dec_sse2.c libwebpdspdecode_sse2_la_SOURCES += filters_sse2.c libwebpdspdecode_sse2_la_SOURCES += lossless_sse2.c libwebpdspdecode_sse2_la_SOURCES += rescaler_sse2.c libwebpdspdecode_sse2_la_SOURCES += upsampling_sse2.c libwebpdspdecode_sse2_la_SOURCES += yuv_sse2.c libwebpdspdecode_sse2_la_CPPFLAGS = $(libwebpdsp_sse2_la_CPPFLAGS) libwebpdspdecode_sse2_la_CFLAGS = $(libwebpdsp_sse2_la_CFLAGS) libwebpdspdecode_neon_la_SOURCES = libwebpdspdecode_neon_la_SOURCES += alpha_processing_neon.c libwebpdspdecode_neon_la_SOURCES += dec_neon.c libwebpdspdecode_neon_la_SOURCES += filters_neon.c libwebpdspdecode_neon_la_SOURCES += lossless_neon.c libwebpdspdecode_neon_la_SOURCES += neon.h libwebpdspdecode_neon_la_SOURCES += rescaler_neon.c libwebpdspdecode_neon_la_SOURCES += upsampling_neon.c libwebpdspdecode_neon_la_SOURCES += yuv_neon.c libwebpdspdecode_neon_la_CPPFLAGS = $(libwebpdsp_neon_la_CPPFLAGS) libwebpdspdecode_neon_la_CFLAGS = $(libwebpdsp_neon_la_CFLAGS) libwebpdspdecode_msa_la_SOURCES = libwebpdspdecode_msa_la_SOURCES += dec_msa.c libwebpdspdecode_msa_la_SOURCES += filters_msa.c libwebpdspdecode_msa_la_SOURCES += lossless_msa.c libwebpdspdecode_msa_la_SOURCES += msa_macro.h libwebpdspdecode_msa_la_SOURCES += rescaler_msa.c libwebpdspdecode_msa_la_SOURCES += upsampling_msa.c libwebpdspdecode_msa_la_CPPFLAGS = $(libwebpdsp_msa_la_CPPFLAGS) libwebpdspdecode_msa_la_CFLAGS = $(libwebpdsp_msa_la_CFLAGS) libwebpdspdecode_mips32_la_SOURCES = libwebpdspdecode_mips32_la_SOURCES += dec_mips32.c libwebpdspdecode_mips32_la_SOURCES += mips_macro.h libwebpdspdecode_mips32_la_SOURCES += rescaler_mips32.c libwebpdspdecode_mips32_la_SOURCES += yuv_mips32.c libwebpdspdecode_mips32_la_CPPFLAGS = $(libwebpdsp_mips32_la_CPPFLAGS) libwebpdspdecode_mips32_la_CFLAGS = $(libwebpdsp_mips32_la_CFLAGS) libwebpdspdecode_mips_dsp_r2_la_SOURCES = libwebpdspdecode_mips_dsp_r2_la_SOURCES += alpha_processing_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += dec_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += filters_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += lossless_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += mips_macro.h libwebpdspdecode_mips_dsp_r2_la_SOURCES += rescaler_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += upsampling_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_SOURCES += yuv_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) libwebpdspdecode_mips_dsp_r2_la_CFLAGS = $(libwebpdsp_mips_dsp_r2_la_CFLAGS) libwebpdsp_sse2_la_SOURCES = libwebpdsp_sse2_la_SOURCES += cost_sse2.c libwebpdsp_sse2_la_SOURCES += enc_sse2.c libwebpdsp_sse2_la_SOURCES += lossless_enc_sse2.c libwebpdsp_sse2_la_SOURCES += ssim_sse2.c libwebpdsp_sse2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) libwebpdsp_sse2_la_LIBADD = libwebpdspdecode_sse2.la libwebpdsp_sse41_la_SOURCES = libwebpdsp_sse41_la_SOURCES += enc_sse41.c libwebpdsp_sse41_la_SOURCES += lossless_enc_sse41.c libwebpdsp_sse41_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_FLAGS) libwebpdsp_sse41_la_LIBADD = libwebpdspdecode_sse41.la libwebpdsp_neon_la_SOURCES = libwebpdsp_neon_la_SOURCES += cost_neon.c libwebpdsp_neon_la_SOURCES += enc_neon.c libwebpdsp_neon_la_SOURCES += lossless_enc_neon.c libwebpdsp_neon_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_FLAGS) libwebpdsp_neon_la_LIBADD = libwebpdspdecode_neon.la libwebpdsp_msa_la_SOURCES = libwebpdsp_msa_la_SOURCES += enc_msa.c libwebpdsp_msa_la_SOURCES += lossless_enc_msa.c libwebpdsp_msa_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_msa_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_msa_la_LIBADD = libwebpdspdecode_msa.la libwebpdsp_mips32_la_SOURCES = libwebpdsp_mips32_la_SOURCES += cost_mips32.c libwebpdsp_mips32_la_SOURCES += enc_mips32.c libwebpdsp_mips32_la_SOURCES += lossless_enc_mips32.c libwebpdsp_mips32_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_mips32_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_mips32_la_LIBADD = libwebpdspdecode_mips32.la libwebpdsp_mips_dsp_r2_la_SOURCES = libwebpdsp_mips_dsp_r2_la_SOURCES += cost_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la_SOURCES += enc_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la_SOURCES += lossless_enc_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_mips_dsp_r2_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_mips_dsp_r2_la_LIBADD = libwebpdspdecode_mips_dsp_r2.la libwebpdsp_la_SOURCES = $(COMMON_SOURCES) $(ENC_SOURCES) noinst_HEADERS = noinst_HEADERS += ../dec/vp8_dec.h noinst_HEADERS += ../webp/decode.h libwebpdsp_la_CPPFLAGS = libwebpdsp_la_CPPFLAGS += $(AM_CPPFLAGS) libwebpdsp_la_CPPFLAGS += $(USE_SWAP_16BIT_CSP) libwebpdsp_la_LDFLAGS = -lm libwebpdsp_la_LIBADD = libwebpdsp_la_LIBADD += libwebpdsp_sse2.la libwebpdsp_la_LIBADD += libwebpdsp_sse41.la libwebpdsp_la_LIBADD += libwebpdsp_neon.la libwebpdsp_la_LIBADD += libwebpdsp_msa.la libwebpdsp_la_LIBADD += libwebpdsp_mips32.la libwebpdsp_la_LIBADD += libwebpdsp_mips_dsp_r2.la if BUILD_LIBWEBPDECODER libwebpdspdecode_la_SOURCES = $(COMMON_SOURCES) libwebpdspdecode_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdspdecode_la_LDFLAGS = $(libwebpdsp_la_LDFLAGS) libwebpdspdecode_la_LIBADD = libwebpdspdecode_la_LIBADD += libwebpdspdecode_sse2.la libwebpdspdecode_la_LIBADD += libwebpdspdecode_sse41.la libwebpdspdecode_la_LIBADD += libwebpdspdecode_neon.la libwebpdspdecode_la_LIBADD += libwebpdspdecode_msa.la libwebpdspdecode_la_LIBADD += libwebpdspdecode_mips32.la libwebpdspdecode_la_LIBADD += libwebpdspdecode_mips_dsp_r2.la endif libwebp-1.4.0/src/dsp/lossless_enc.c0000644000014400001440000011463514606317060014302 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transform methods for lossless encoder. // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) // Urvang Joshi (urvang@google.com) #include "src/dsp/dsp.h" #include #include #include #include "src/dec/vp8li_dec.h" #include "src/utils/endian_inl_utils.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/dsp/yuv.h" // lookup table for small values of log2(int) const float kLog2Table[LOG_LOOKUP_IDX_MAX] = { 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f, 1.5849625007211560f, 2.0000000000000000f, 2.3219280948873621f, 2.5849625007211560f, 2.8073549220576041f, 3.0000000000000000f, 3.1699250014423121f, 3.3219280948873621f, 3.4594316186372973f, 3.5849625007211560f, 3.7004397181410921f, 3.8073549220576041f, 3.9068905956085187f, 4.0000000000000000f, 4.0874628412503390f, 4.1699250014423121f, 4.2479275134435852f, 4.3219280948873626f, 4.3923174227787606f, 4.4594316186372973f, 4.5235619560570130f, 4.5849625007211560f, 4.6438561897747243f, 4.7004397181410917f, 4.7548875021634682f, 4.8073549220576037f, 4.8579809951275718f, 4.9068905956085187f, 4.9541963103868749f, 5.0000000000000000f, 5.0443941193584533f, 5.0874628412503390f, 5.1292830169449663f, 5.1699250014423121f, 5.2094533656289501f, 5.2479275134435852f, 5.2854022188622487f, 5.3219280948873626f, 5.3575520046180837f, 5.3923174227787606f, 5.4262647547020979f, 5.4594316186372973f, 5.4918530963296747f, 5.5235619560570130f, 5.5545888516776376f, 5.5849625007211560f, 5.6147098441152083f, 5.6438561897747243f, 5.6724253419714951f, 5.7004397181410917f, 5.7279204545631987f, 5.7548875021634682f, 5.7813597135246599f, 5.8073549220576037f, 5.8328900141647412f, 5.8579809951275718f, 5.8826430493618415f, 5.9068905956085187f, 5.9307373375628866f, 5.9541963103868749f, 5.9772799234999167f, 6.0000000000000000f, 6.0223678130284543f, 6.0443941193584533f, 6.0660891904577720f, 6.0874628412503390f, 6.1085244567781691f, 6.1292830169449663f, 6.1497471195046822f, 6.1699250014423121f, 6.1898245588800175f, 6.2094533656289501f, 6.2288186904958804f, 6.2479275134435852f, 6.2667865406949010f, 6.2854022188622487f, 6.3037807481771030f, 6.3219280948873626f, 6.3398500028846243f, 6.3575520046180837f, 6.3750394313469245f, 6.3923174227787606f, 6.4093909361377017f, 6.4262647547020979f, 6.4429434958487279f, 6.4594316186372973f, 6.4757334309663976f, 6.4918530963296747f, 6.5077946401986963f, 6.5235619560570130f, 6.5391588111080309f, 6.5545888516776376f, 6.5698556083309478f, 6.5849625007211560f, 6.5999128421871278f, 6.6147098441152083f, 6.6293566200796094f, 6.6438561897747243f, 6.6582114827517946f, 6.6724253419714951f, 6.6865005271832185f, 6.7004397181410917f, 6.7142455176661224f, 6.7279204545631987f, 6.7414669864011464f, 6.7548875021634682f, 6.7681843247769259f, 6.7813597135246599f, 6.7944158663501061f, 6.8073549220576037f, 6.8201789624151878f, 6.8328900141647412f, 6.8454900509443747f, 6.8579809951275718f, 6.8703647195834047f, 6.8826430493618415f, 6.8948177633079437f, 6.9068905956085187f, 6.9188632372745946f, 6.9307373375628866f, 6.9425145053392398f, 6.9541963103868749f, 6.9657842846620869f, 6.9772799234999167f, 6.9886846867721654f, 7.0000000000000000f, 7.0112272554232539f, 7.0223678130284543f, 7.0334230015374501f, 7.0443941193584533f, 7.0552824355011898f, 7.0660891904577720f, 7.0768155970508308f, 7.0874628412503390f, 7.0980320829605263f, 7.1085244567781691f, 7.1189410727235076f, 7.1292830169449663f, 7.1395513523987936f, 7.1497471195046822f, 7.1598713367783890f, 7.1699250014423121f, 7.1799090900149344f, 7.1898245588800175f, 7.1996723448363644f, 7.2094533656289501f, 7.2191685204621611f, 7.2288186904958804f, 7.2384047393250785f, 7.2479275134435852f, 7.2573878426926521f, 7.2667865406949010f, 7.2761244052742375f, 7.2854022188622487f, 7.2946207488916270f, 7.3037807481771030f, 7.3128829552843557f, 7.3219280948873626f, 7.3309168781146167f, 7.3398500028846243f, 7.3487281542310771f, 7.3575520046180837f, 7.3663222142458160f, 7.3750394313469245f, 7.3837042924740519f, 7.3923174227787606f, 7.4008794362821843f, 7.4093909361377017f, 7.4178525148858982f, 7.4262647547020979f, 7.4346282276367245f, 7.4429434958487279f, 7.4512111118323289f, 7.4594316186372973f, 7.4676055500829976f, 7.4757334309663976f, 7.4838157772642563f, 7.4918530963296747f, 7.4998458870832056f, 7.5077946401986963f, 7.5156998382840427f, 7.5235619560570130f, 7.5313814605163118f, 7.5391588111080309f, 7.5468944598876364f, 7.5545888516776376f, 7.5622424242210728f, 7.5698556083309478f, 7.5774288280357486f, 7.5849625007211560f, 7.5924570372680806f, 7.5999128421871278f, 7.6073303137496104f, 7.6147098441152083f, 7.6220518194563764f, 7.6293566200796094f, 7.6366246205436487f, 7.6438561897747243f, 7.6510516911789281f, 7.6582114827517946f, 7.6653359171851764f, 7.6724253419714951f, 7.6794800995054464f, 7.6865005271832185f, 7.6934869574993252f, 7.7004397181410917f, 7.7073591320808825f, 7.7142455176661224f, 7.7210991887071855f, 7.7279204545631987f, 7.7347096202258383f, 7.7414669864011464f, 7.7481928495894605f, 7.7548875021634682f, 7.7615512324444795f, 7.7681843247769259f, 7.7747870596011736f, 7.7813597135246599f, 7.7879025593914317f, 7.7944158663501061f, 7.8008998999203047f, 7.8073549220576037f, 7.8137811912170374f, 7.8201789624151878f, 7.8265484872909150f, 7.8328900141647412f, 7.8392037880969436f, 7.8454900509443747f, 7.8517490414160571f, 7.8579809951275718f, 7.8641861446542797f, 7.8703647195834047f, 7.8765169465649993f, 7.8826430493618415f, 7.8887432488982591f, 7.8948177633079437f, 7.9008668079807486f, 7.9068905956085187f, 7.9128893362299619f, 7.9188632372745946f, 7.9248125036057812f, 7.9307373375628866f, 7.9366379390025709f, 7.9425145053392398f, 7.9483672315846778f, 7.9541963103868749f, 7.9600019320680805f, 7.9657842846620869f, 7.9715435539507719f, 7.9772799234999167f, 7.9829935746943103f, 7.9886846867721654f, 7.9943534368588577f }; const float kSLog2Table[LOG_LOOKUP_IDX_MAX] = { 0.00000000f, 0.00000000f, 2.00000000f, 4.75488750f, 8.00000000f, 11.60964047f, 15.50977500f, 19.65148445f, 24.00000000f, 28.52932501f, 33.21928095f, 38.05374781f, 43.01955001f, 48.10571634f, 53.30296891f, 58.60335893f, 64.00000000f, 69.48686830f, 75.05865003f, 80.71062276f, 86.43856190f, 92.23866588f, 98.10749561f, 104.04192499f, 110.03910002f, 116.09640474f, 122.21143267f, 128.38196256f, 134.60593782f, 140.88144886f, 147.20671787f, 153.58008562f, 160.00000000f, 166.46500594f, 172.97373660f, 179.52490559f, 186.11730005f, 192.74977453f, 199.42124551f, 206.13068654f, 212.87712380f, 219.65963219f, 226.47733176f, 233.32938445f, 240.21499122f, 247.13338933f, 254.08384998f, 261.06567603f, 268.07820003f, 275.12078236f, 282.19280949f, 289.29369244f, 296.42286534f, 303.57978409f, 310.76392512f, 317.97478424f, 325.21187564f, 332.47473081f, 339.76289772f, 347.07593991f, 354.41343574f, 361.77497759f, 369.16017124f, 376.56863518f, 384.00000000f, 391.45390785f, 398.93001188f, 406.42797576f, 413.94747321f, 421.48818752f, 429.04981119f, 436.63204548f, 444.23460010f, 451.85719280f, 459.49954906f, 467.16140179f, 474.84249102f, 482.54256363f, 490.26137307f, 497.99867911f, 505.75424759f, 513.52785023f, 521.31926438f, 529.12827280f, 536.95466351f, 544.79822957f, 552.65876890f, 560.53608414f, 568.42998244f, 576.34027536f, 584.26677867f, 592.20931226f, 600.16769996f, 608.14176943f, 616.13135206f, 624.13628279f, 632.15640007f, 640.19154569f, 648.24156472f, 656.30630539f, 664.38561898f, 672.47935976f, 680.58738488f, 688.70955430f, 696.84573069f, 704.99577935f, 713.15956818f, 721.33696754f, 729.52785023f, 737.73209140f, 745.94956849f, 754.18016116f, 762.42375127f, 770.68022275f, 778.94946161f, 787.23135586f, 795.52579543f, 803.83267219f, 812.15187982f, 820.48331383f, 828.82687147f, 837.18245171f, 845.54995518f, 853.92928416f, 862.32034249f, 870.72303558f, 879.13727036f, 887.56295522f, 896.00000000f, 904.44831595f, 912.90781569f, 921.37841320f, 929.86002376f, 938.35256392f, 946.85595152f, 955.37010560f, 963.89494641f, 972.43039537f, 980.97637504f, 989.53280911f, 998.09962237f, 1006.67674069f, 1015.26409097f, 1023.86160116f, 1032.46920021f, 1041.08681805f, 1049.71438560f, 1058.35183469f, 1066.99909811f, 1075.65610955f, 1084.32280357f, 1092.99911564f, 1101.68498204f, 1110.38033993f, 1119.08512727f, 1127.79928282f, 1136.52274614f, 1145.25545758f, 1153.99735821f, 1162.74838989f, 1171.50849518f, 1180.27761738f, 1189.05570047f, 1197.84268914f, 1206.63852876f, 1215.44316535f, 1224.25654560f, 1233.07861684f, 1241.90932703f, 1250.74862473f, 1259.59645914f, 1268.45278005f, 1277.31753781f, 1286.19068338f, 1295.07216828f, 1303.96194457f, 1312.85996488f, 1321.76618236f, 1330.68055071f, 1339.60302413f, 1348.53355734f, 1357.47210556f, 1366.41862452f, 1375.37307041f, 1384.33539991f, 1393.30557020f, 1402.28353887f, 1411.26926400f, 1420.26270412f, 1429.26381818f, 1438.27256558f, 1447.28890615f, 1456.31280014f, 1465.34420819f, 1474.38309138f, 1483.42941118f, 1492.48312945f, 1501.54420843f, 1510.61261078f, 1519.68829949f, 1528.77123795f, 1537.86138993f, 1546.95871952f, 1556.06319119f, 1565.17476976f, 1574.29342040f, 1583.41910860f, 1592.55180020f, 1601.69146137f, 1610.83805860f, 1619.99155871f, 1629.15192882f, 1638.31913637f, 1647.49314911f, 1656.67393509f, 1665.86146266f, 1675.05570047f, 1684.25661744f, 1693.46418280f, 1702.67836605f, 1711.89913698f, 1721.12646563f, 1730.36032233f, 1739.60067768f, 1748.84750254f, 1758.10076802f, 1767.36044551f, 1776.62650662f, 1785.89892323f, 1795.17766747f, 1804.46271172f, 1813.75402857f, 1823.05159087f, 1832.35537170f, 1841.66534438f, 1850.98148244f, 1860.30375965f, 1869.63214999f, 1878.96662767f, 1888.30716711f, 1897.65374295f, 1907.00633003f, 1916.36490342f, 1925.72943838f, 1935.09991037f, 1944.47629506f, 1953.85856831f, 1963.24670620f, 1972.64068498f, 1982.04048108f, 1991.44607117f, 2000.85743204f, 2010.27454072f, 2019.69737440f, 2029.12591044f, 2038.56012640f }; const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX] = { { 0, 0}, { 0, 0}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 1}, { 4, 1}, { 5, 1}, { 5, 1}, { 6, 2}, { 6, 2}, { 6, 2}, { 6, 2}, { 7, 2}, { 7, 2}, { 7, 2}, { 7, 2}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, }; const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126 }; static float FastSLog2Slow_C(uint32_t v) { assert(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_WITH_CORRECTION_MAX) { #if !defined(WEBP_HAVE_SLOW_CLZ_CTZ) // use clz if available const int log_cnt = BitsLog2Floor(v) - 7; const uint32_t y = 1 << log_cnt; int correction = 0; const float v_f = (float)v; const uint32_t orig_v = v; v >>= log_cnt; #else int log_cnt = 0; uint32_t y = 1; int correction = 0; const float v_f = (float)v; const uint32_t orig_v = v; do { ++log_cnt; v = v >> 1; y = y << 1; } while (v >= LOG_LOOKUP_IDX_MAX); #endif // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256 // Xf = floor(Xf) * (1 + (v % y) / v) // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v) // The correction factor: log(1 + d) ~ d; for very small d values, so // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v // LOG_2_RECIPROCAL ~ 23/16 correction = (23 * (orig_v & (y - 1))) >> 4; return v_f * (kLog2Table[v] + log_cnt) + correction; } else { return (float)(LOG_2_RECIPROCAL * v * log((double)v)); } } static float FastLog2Slow_C(uint32_t v) { assert(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_WITH_CORRECTION_MAX) { #if !defined(WEBP_HAVE_SLOW_CLZ_CTZ) // use clz if available const int log_cnt = BitsLog2Floor(v) - 7; const uint32_t y = 1 << log_cnt; const uint32_t orig_v = v; double log_2; v >>= log_cnt; #else int log_cnt = 0; uint32_t y = 1; const uint32_t orig_v = v; double log_2; do { ++log_cnt; v = v >> 1; y = y << 1; } while (v >= LOG_LOOKUP_IDX_MAX); #endif log_2 = kLog2Table[v] + log_cnt; if (orig_v >= APPROX_LOG_MAX) { // Since the division is still expensive, add this correction factor only // for large values of 'v'. const int correction = (23 * (orig_v & (y - 1))) >> 4; log_2 += (double)correction / orig_v; } return (float)log_2; } else { return (float)(LOG_2_RECIPROCAL * log((double)v)); } } //------------------------------------------------------------------------------ // Methods to calculate Entropy (Shannon). // Compute the combined Shanon's entropy for distribution {X} and {X+Y} static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) { int i; float retval = 0.f; int sumX = 0, sumXY = 0; for (i = 0; i < 256; ++i) { const int x = X[i]; if (x != 0) { const int xy = x + Y[i]; sumX += x; retval -= VP8LFastSLog2(x); sumXY += xy; retval -= VP8LFastSLog2(xy); } else if (Y[i] != 0) { sumXY += Y[i]; retval -= VP8LFastSLog2(Y[i]); } } retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY); return retval; } void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) { entropy->entropy = 0.; entropy->sum = 0; entropy->nonzeros = 0; entropy->max_val = 0; entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM; } void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n, VP8LBitEntropy* const entropy) { int i; VP8LBitEntropyInit(entropy); for (i = 0; i < n; ++i) { if (array[i] != 0) { entropy->sum += array[i]; entropy->nonzero_code = i; ++entropy->nonzeros; entropy->entropy -= VP8LFastSLog2(array[i]); if (entropy->max_val < array[i]) { entropy->max_val = array[i]; } } } entropy->entropy += VP8LFastSLog2(entropy->sum); } static WEBP_INLINE void GetEntropyUnrefinedHelper( uint32_t val, int i, uint32_t* const val_prev, int* const i_prev, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) { const int streak = i - *i_prev; // Gather info for the bit entropy. if (*val_prev != 0) { bit_entropy->sum += (*val_prev) * streak; bit_entropy->nonzeros += streak; bit_entropy->nonzero_code = *i_prev; bit_entropy->entropy -= VP8LFastSLog2(*val_prev) * streak; if (bit_entropy->max_val < *val_prev) { bit_entropy->max_val = *val_prev; } } // Gather info for the Huffman cost. stats->counts[*val_prev != 0] += (streak > 3); stats->streaks[*val_prev != 0][(streak > 3)] += streak; *val_prev = val; *i_prev = i; } static void GetEntropyUnrefined_C(const uint32_t X[], int length, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) { int i; int i_prev = 0; uint32_t x_prev = X[0]; memset(stats, 0, sizeof(*stats)); VP8LBitEntropyInit(bit_entropy); for (i = 1; i < length; ++i) { const uint32_t x = X[i]; if (x != x_prev) { GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats); } } GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats); bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum); } static void GetCombinedEntropyUnrefined_C(const uint32_t X[], const uint32_t Y[], int length, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) { int i = 1; int i_prev = 0; uint32_t xy_prev = X[0] + Y[0]; memset(stats, 0, sizeof(*stats)); VP8LBitEntropyInit(bit_entropy); for (i = 1; i < length; ++i) { const uint32_t xy = X[i] + Y[i]; if (xy != xy_prev) { GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats); } } GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats); bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum); } //------------------------------------------------------------------------------ void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) { int i; for (i = 0; i < num_pixels; ++i) { const int argb = (int)argb_data[i]; const int green = (argb >> 8) & 0xff; const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff; const uint32_t new_b = (((argb >> 0) & 0xff) - green) & 0xff; argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b; } } static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) { return ((int)color_pred * color) >> 5; } static WEBP_INLINE int8_t U32ToS8(uint32_t v) { return (int8_t)(v & 0xff); } void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data, int num_pixels) { int i; for (i = 0; i < num_pixels; ++i) { const uint32_t argb = data[i]; const int8_t green = U32ToS8(argb >> 8); const int8_t red = U32ToS8(argb >> 16); int new_red = red & 0xff; int new_blue = argb & 0xff; new_red -= ColorTransformDelta((int8_t)m->green_to_red_, green); new_red &= 0xff; new_blue -= ColorTransformDelta((int8_t)m->green_to_blue_, green); new_blue -= ColorTransformDelta((int8_t)m->red_to_blue_, red); new_blue &= 0xff; data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue); } } static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red, uint32_t argb) { const int8_t green = U32ToS8(argb >> 8); int new_red = argb >> 16; new_red -= ColorTransformDelta((int8_t)green_to_red, green); return (new_red & 0xff); } static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue, uint8_t red_to_blue, uint32_t argb) { const int8_t green = U32ToS8(argb >> 8); const int8_t red = U32ToS8(argb >> 16); int new_blue = argb & 0xff; new_blue -= ColorTransformDelta((int8_t)green_to_blue, green); new_blue -= ColorTransformDelta((int8_t)red_to_blue, red); return (new_blue & 0xff); } void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]) { while (tile_height-- > 0) { int x; for (x = 0; x < tile_width; ++x) { ++histo[TransformColorRed((uint8_t)green_to_red, argb[x])]; } argb += stride; } } void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]) { while (tile_height-- > 0) { int x; for (x = 0; x < tile_width; ++x) { ++histo[TransformColorBlue((uint8_t)green_to_blue, (uint8_t)red_to_blue, argb[x])]; } argb += stride; } } //------------------------------------------------------------------------------ static int VectorMismatch_C(const uint32_t* const array1, const uint32_t* const array2, int length) { int match_len = 0; while (match_len < length && array1[match_len] == array2[match_len]) { ++match_len; } return match_len; } // Bundles multiple (1, 2, 4 or 8) pixels into a single pixel. void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits, uint32_t* dst) { int x; if (xbits > 0) { const int bit_depth = 1 << (3 - xbits); const int mask = (1 << xbits) - 1; uint32_t code = 0xff000000; for (x = 0; x < width; ++x) { const int xsub = x & mask; if (xsub == 0) { code = 0xff000000; } code |= row[x] << (8 + bit_depth * xsub); dst[x >> xbits] = code; } } else { for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8); } } //------------------------------------------------------------------------------ static uint32_t ExtraCost_C(const uint32_t* population, int length) { int i; uint32_t cost = population[4] + population[5]; assert(length % 2 == 0); for (i = 2; i < length / 2 - 1; ++i) { cost += i * (population[2 * i + 2] + population[2 * i + 3]); } return cost; } static uint32_t ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y, int length) { int i; uint32_t cost = X[4] + Y[4] + X[5] + Y[5]; assert(length % 2 == 0); for (i = 2; i < length / 2 - 1; ++i) { const int xy0 = X[2 * i + 2] + Y[2 * i + 2]; const int xy1 = X[2 * i + 3] + Y[2 * i + 3]; cost += i * (xy0 + xy1); } return cost; } //------------------------------------------------------------------------------ static void AddVector_C(const uint32_t* a, const uint32_t* b, uint32_t* out, int size) { int i; for (i = 0; i < size; ++i) out[i] = a[i] + b[i]; } static void AddVectorEq_C(const uint32_t* a, uint32_t* out, int size) { int i; for (i = 0; i < size; ++i) out[i] += a[i]; } #define ADD(X, ARG, LEN) do { \ if (a->is_used_[X]) { \ if (b->is_used_[X]) { \ VP8LAddVector(a->ARG, b->ARG, out->ARG, (LEN)); \ } else { \ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \ } \ } else if (b->is_used_[X]) { \ memcpy(&out->ARG[0], &b->ARG[0], (LEN) * sizeof(out->ARG[0])); \ } else { \ memset(&out->ARG[0], 0, (LEN) * sizeof(out->ARG[0])); \ } \ } while (0) #define ADD_EQ(X, ARG, LEN) do { \ if (a->is_used_[X]) { \ if (out->is_used_[X]) { \ VP8LAddVectorEq(a->ARG, out->ARG, (LEN)); \ } else { \ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \ } \ } \ } while (0) void VP8LHistogramAdd(const VP8LHistogram* const a, const VP8LHistogram* const b, VP8LHistogram* const out) { int i; const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_); assert(a->palette_code_bits_ == b->palette_code_bits_); if (b != out) { ADD(0, literal_, literal_size); ADD(1, red_, NUM_LITERAL_CODES); ADD(2, blue_, NUM_LITERAL_CODES); ADD(3, alpha_, NUM_LITERAL_CODES); ADD(4, distance_, NUM_DISTANCE_CODES); for (i = 0; i < 5; ++i) { out->is_used_[i] = (a->is_used_[i] | b->is_used_[i]); } } else { ADD_EQ(0, literal_, literal_size); ADD_EQ(1, red_, NUM_LITERAL_CODES); ADD_EQ(2, blue_, NUM_LITERAL_CODES); ADD_EQ(3, alpha_, NUM_LITERAL_CODES); ADD_EQ(4, distance_, NUM_DISTANCE_CODES); for (i = 0; i < 5; ++i) out->is_used_[i] |= a->is_used_[i]; } } #undef ADD #undef ADD_EQ //------------------------------------------------------------------------------ // Image transforms. static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK); (void)upper; } static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]); (void)upper; } // It subtracts the prediction from the input pixel and stores the residual // in the output pixel. #define GENERATE_PREDICTOR_SUB(PREDICTOR_I) \ static void PredictorSub##PREDICTOR_I##_C(const uint32_t* in, \ const uint32_t* upper, \ int num_pixels, uint32_t* out) { \ int x; \ assert(upper != NULL); \ for (x = 0; x < num_pixels; ++x) { \ const uint32_t pred = \ VP8LPredictor##PREDICTOR_I##_C(&in[x - 1], upper + x); \ out[x] = VP8LSubPixels(in[x], pred); \ } \ } GENERATE_PREDICTOR_SUB(2) GENERATE_PREDICTOR_SUB(3) GENERATE_PREDICTOR_SUB(4) GENERATE_PREDICTOR_SUB(5) GENERATE_PREDICTOR_SUB(6) GENERATE_PREDICTOR_SUB(7) GENERATE_PREDICTOR_SUB(8) GENERATE_PREDICTOR_SUB(9) GENERATE_PREDICTOR_SUB(10) GENERATE_PREDICTOR_SUB(11) GENERATE_PREDICTOR_SUB(12) GENERATE_PREDICTOR_SUB(13) //------------------------------------------------------------------------------ VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed; VP8LTransformColorFunc VP8LTransformColor; VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms; VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms; VP8LFastLog2SlowFunc VP8LFastLog2Slow; VP8LFastLog2SlowFunc VP8LFastSLog2Slow; VP8LCostFunc VP8LExtraCost; VP8LCostCombinedFunc VP8LExtraCostCombined; VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy; VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined; VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined; VP8LAddVectorFunc VP8LAddVector; VP8LAddVectorEqFunc VP8LAddVectorEq; VP8LVectorMismatchFunc VP8LVectorMismatch; VP8LBundleColorMapFunc VP8LBundleColorMap; VP8LPredictorAddSubFunc VP8LPredictorsSub[16]; VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16]; extern VP8CPUInfo VP8GetCPUInfo; extern void VP8LEncDspInitSSE2(void); extern void VP8LEncDspInitSSE41(void); extern void VP8LEncDspInitNEON(void); extern void VP8LEncDspInitMIPS32(void); extern void VP8LEncDspInitMIPSdspR2(void); extern void VP8LEncDspInitMSA(void); WEBP_DSP_INIT_FUNC(VP8LEncDspInit) { VP8LDspInit(); #if !WEBP_NEON_OMIT_C_CODE VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C; VP8LTransformColor = VP8LTransformColor_C; #endif VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C; VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C; VP8LFastLog2Slow = FastLog2Slow_C; VP8LFastSLog2Slow = FastSLog2Slow_C; VP8LExtraCost = ExtraCost_C; VP8LExtraCostCombined = ExtraCostCombined_C; VP8LCombinedShannonEntropy = CombinedShannonEntropy_C; VP8LGetEntropyUnrefined = GetEntropyUnrefined_C; VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C; VP8LAddVector = AddVector_C; VP8LAddVectorEq = AddVectorEq_C; VP8LVectorMismatch = VectorMismatch_C; VP8LBundleColorMap = VP8LBundleColorMap_C; VP8LPredictorsSub[0] = PredictorSub0_C; VP8LPredictorsSub[1] = PredictorSub1_C; VP8LPredictorsSub[2] = PredictorSub2_C; VP8LPredictorsSub[3] = PredictorSub3_C; VP8LPredictorsSub[4] = PredictorSub4_C; VP8LPredictorsSub[5] = PredictorSub5_C; VP8LPredictorsSub[6] = PredictorSub6_C; VP8LPredictorsSub[7] = PredictorSub7_C; VP8LPredictorsSub[8] = PredictorSub8_C; VP8LPredictorsSub[9] = PredictorSub9_C; VP8LPredictorsSub[10] = PredictorSub10_C; VP8LPredictorsSub[11] = PredictorSub11_C; VP8LPredictorsSub[12] = PredictorSub12_C; VP8LPredictorsSub[13] = PredictorSub13_C; VP8LPredictorsSub[14] = PredictorSub0_C; // <- padding security sentinels VP8LPredictorsSub[15] = PredictorSub0_C; VP8LPredictorsSub_C[0] = PredictorSub0_C; VP8LPredictorsSub_C[1] = PredictorSub1_C; VP8LPredictorsSub_C[2] = PredictorSub2_C; VP8LPredictorsSub_C[3] = PredictorSub3_C; VP8LPredictorsSub_C[4] = PredictorSub4_C; VP8LPredictorsSub_C[5] = PredictorSub5_C; VP8LPredictorsSub_C[6] = PredictorSub6_C; VP8LPredictorsSub_C[7] = PredictorSub7_C; VP8LPredictorsSub_C[8] = PredictorSub8_C; VP8LPredictorsSub_C[9] = PredictorSub9_C; VP8LPredictorsSub_C[10] = PredictorSub10_C; VP8LPredictorsSub_C[11] = PredictorSub11_C; VP8LPredictorsSub_C[12] = PredictorSub12_C; VP8LPredictorsSub_C[13] = PredictorSub13_C; VP8LPredictorsSub_C[14] = PredictorSub0_C; // <- padding security sentinels VP8LPredictorsSub_C[15] = PredictorSub0_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8LEncDspInitSSE2(); #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { VP8LEncDspInitSSE41(); } #endif } #endif #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { VP8LEncDspInitMIPS32(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8LEncDspInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { VP8LEncDspInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { VP8LEncDspInitNEON(); } #endif assert(VP8LSubtractGreenFromBlueAndRed != NULL); assert(VP8LTransformColor != NULL); assert(VP8LCollectColorBlueTransforms != NULL); assert(VP8LCollectColorRedTransforms != NULL); assert(VP8LFastLog2Slow != NULL); assert(VP8LFastSLog2Slow != NULL); assert(VP8LExtraCost != NULL); assert(VP8LExtraCostCombined != NULL); assert(VP8LCombinedShannonEntropy != NULL); assert(VP8LGetEntropyUnrefined != NULL); assert(VP8LGetCombinedEntropyUnrefined != NULL); assert(VP8LAddVector != NULL); assert(VP8LAddVectorEq != NULL); assert(VP8LVectorMismatch != NULL); assert(VP8LBundleColorMap != NULL); assert(VP8LPredictorsSub[0] != NULL); assert(VP8LPredictorsSub[1] != NULL); assert(VP8LPredictorsSub[2] != NULL); assert(VP8LPredictorsSub[3] != NULL); assert(VP8LPredictorsSub[4] != NULL); assert(VP8LPredictorsSub[5] != NULL); assert(VP8LPredictorsSub[6] != NULL); assert(VP8LPredictorsSub[7] != NULL); assert(VP8LPredictorsSub[8] != NULL); assert(VP8LPredictorsSub[9] != NULL); assert(VP8LPredictorsSub[10] != NULL); assert(VP8LPredictorsSub[11] != NULL); assert(VP8LPredictorsSub[12] != NULL); assert(VP8LPredictorsSub[13] != NULL); assert(VP8LPredictorsSub[14] != NULL); assert(VP8LPredictorsSub[15] != NULL); assert(VP8LPredictorsSub_C[0] != NULL); assert(VP8LPredictorsSub_C[1] != NULL); assert(VP8LPredictorsSub_C[2] != NULL); assert(VP8LPredictorsSub_C[3] != NULL); assert(VP8LPredictorsSub_C[4] != NULL); assert(VP8LPredictorsSub_C[5] != NULL); assert(VP8LPredictorsSub_C[6] != NULL); assert(VP8LPredictorsSub_C[7] != NULL); assert(VP8LPredictorsSub_C[8] != NULL); assert(VP8LPredictorsSub_C[9] != NULL); assert(VP8LPredictorsSub_C[10] != NULL); assert(VP8LPredictorsSub_C[11] != NULL); assert(VP8LPredictorsSub_C[12] != NULL); assert(VP8LPredictorsSub_C[13] != NULL); assert(VP8LPredictorsSub_C[14] != NULL); assert(VP8LPredictorsSub_C[15] != NULL); } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dsp/rescaler_msa.c0000644000014400001440000004172314606317060014243 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA version of rescaling functions // // Author: Prashant Patil (prashant.patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) && !defined(WEBP_REDUCE_SIZE) #include #include "src/utils/rescaler_utils.h" #include "src/dsp/msa_macro.h" #define ROUNDER (WEBP_RESCALER_ONE >> 1) #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) #define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX) #define CALC_MULT_FIX_16(in0, in1, in2, in3, scale, shift, dst) do { \ v4u32 tmp0, tmp1, tmp2, tmp3; \ v16u8 t0, t1, t2, t3, t4, t5; \ v2u64 out0, out1, out2, out3; \ ILVRL_W2_UW(zero, in0, tmp0, tmp1); \ ILVRL_W2_UW(zero, in1, tmp2, tmp3); \ DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1); \ DOTP_UW2_UD(tmp2, tmp3, scale, scale, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ PCKEV_B2_UB(out1, out0, out3, out2, t0, t1); \ ILVRL_W2_UW(zero, in2, tmp0, tmp1); \ ILVRL_W2_UW(zero, in3, tmp2, tmp3); \ DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1); \ DOTP_UW2_UD(tmp2, tmp3, scale, scale, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ PCKEV_B2_UB(out1, out0, out3, out2, t2, t3); \ PCKEV_B2_UB(t1, t0, t3, t2, t4, t5); \ dst = (v16u8)__msa_pckev_b((v16i8)t5, (v16i8)t4); \ } while (0) #define CALC_MULT_FIX_4(in0, scale, shift, dst) do { \ v4u32 tmp0, tmp1; \ v16i8 t0, t1; \ v2u64 out0, out1; \ ILVRL_W2_UW(zero, in0, tmp0, tmp1); \ DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1); \ SRAR_D2_UD(out0, out1, shift); \ t0 = __msa_pckev_b((v16i8)out1, (v16i8)out0); \ t1 = __msa_pckev_b(t0, t0); \ t0 = __msa_pckev_b(t1, t1); \ dst = __msa_copy_s_w((v4i32)t0, 0); \ } while (0) #define CALC_MULT_FIX1_16(in0, in1, in2, in3, fyscale, shift, \ dst0, dst1, dst2, dst3) do { \ v4u32 tmp0, tmp1, tmp2, tmp3; \ v2u64 out0, out1, out2, out3; \ ILVRL_W2_UW(zero, in0, tmp0, tmp1); \ ILVRL_W2_UW(zero, in1, tmp2, tmp3); \ DOTP_UW2_UD(tmp0, tmp1, fyscale, fyscale, out0, out1); \ DOTP_UW2_UD(tmp2, tmp3, fyscale, fyscale, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ PCKEV_W2_UW(out1, out0, out3, out2, dst0, dst1); \ ILVRL_W2_UW(zero, in2, tmp0, tmp1); \ ILVRL_W2_UW(zero, in3, tmp2, tmp3); \ DOTP_UW2_UD(tmp0, tmp1, fyscale, fyscale, out0, out1); \ DOTP_UW2_UD(tmp2, tmp3, fyscale, fyscale, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ PCKEV_W2_UW(out1, out0, out3, out2, dst2, dst3); \ } while (0) #define CALC_MULT_FIX1_4(in0, scale, shift, dst) do { \ v4u32 tmp0, tmp1; \ v2u64 out0, out1; \ ILVRL_W2_UW(zero, in0, tmp0, tmp1); \ DOTP_UW2_UD(tmp0, tmp1, scale, scale, out0, out1); \ SRAR_D2_UD(out0, out1, shift); \ dst = (v4u32)__msa_pckev_w((v4i32)out1, (v4i32)out0); \ } while (0) #define CALC_MULT_FIX2_16(in0, in1, in2, in3, mult, scale, shift, \ dst0, dst1) do { \ v4u32 tmp0, tmp1, tmp2, tmp3; \ v2u64 out0, out1, out2, out3; \ ILVRL_W2_UW(in0, in2, tmp0, tmp1); \ ILVRL_W2_UW(in1, in3, tmp2, tmp3); \ DOTP_UW2_UD(tmp0, tmp1, mult, mult, out0, out1); \ DOTP_UW2_UD(tmp2, tmp3, mult, mult, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ DOTP_UW2_UD(out0, out1, scale, scale, out0, out1); \ DOTP_UW2_UD(out2, out3, scale, scale, out2, out3); \ SRAR_D4_UD(out0, out1, out2, out3, shift); \ PCKEV_B2_UB(out1, out0, out3, out2, dst0, dst1); \ } while (0) #define CALC_MULT_FIX2_4(in0, in1, mult, scale, shift, dst) do { \ v4u32 tmp0, tmp1; \ v2u64 out0, out1; \ v16i8 t0, t1; \ ILVRL_W2_UW(in0, in1, tmp0, tmp1); \ DOTP_UW2_UD(tmp0, tmp1, mult, mult, out0, out1); \ SRAR_D2_UD(out0, out1, shift); \ DOTP_UW2_UD(out0, out1, scale, scale, out0, out1); \ SRAR_D2_UD(out0, out1, shift); \ t0 = __msa_pckev_b((v16i8)out1, (v16i8)out0); \ t1 = __msa_pckev_b(t0, t0); \ t0 = __msa_pckev_b(t1, t1); \ dst = __msa_copy_s_w((v4i32)t0, 0); \ } while (0) static WEBP_INLINE void ExportRowExpand_0(const uint32_t* frow, uint8_t* dst, int length, WebPRescaler* const wrk) { const v4u32 scale = (v4u32)__msa_fill_w(wrk->fy_scale); const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX); const v4i32 zero = { 0 }; while (length >= 16) { v4u32 src0, src1, src2, src3; v16u8 out; LD_UW4(frow, 4, src0, src1, src2, src3); CALC_MULT_FIX_16(src0, src1, src2, src3, scale, shift, out); ST_UB(out, dst); length -= 16; frow += 16; dst += 16; } if (length > 0) { int x_out; if (length >= 12) { uint32_t val0_m, val1_m, val2_m; v4u32 src0, src1, src2; LD_UW3(frow, 4, src0, src1, src2); CALC_MULT_FIX_4(src0, scale, shift, val0_m); CALC_MULT_FIX_4(src1, scale, shift, val1_m); CALC_MULT_FIX_4(src2, scale, shift, val2_m); SW3(val0_m, val1_m, val2_m, dst, 4); length -= 12; frow += 12; dst += 12; } else if (length >= 8) { uint32_t val0_m, val1_m; v4u32 src0, src1; LD_UW2(frow, 4, src0, src1); CALC_MULT_FIX_4(src0, scale, shift, val0_m); CALC_MULT_FIX_4(src1, scale, shift, val1_m); SW2(val0_m, val1_m, dst, 4); length -= 8; frow += 8; dst += 8; } else if (length >= 4) { uint32_t val0_m; const v4u32 src0 = LD_UW(frow); CALC_MULT_FIX_4(src0, scale, shift, val0_m); SW(val0_m, dst); length -= 4; frow += 4; dst += 4; } for (x_out = 0; x_out < length; ++x_out) { const uint32_t J = frow[x_out]; const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } } static WEBP_INLINE void ExportRowExpand_1(const uint32_t* frow, uint32_t* irow, uint8_t* dst, int length, WebPRescaler* const wrk) { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); const v4i32 B1 = __msa_fill_w(B); const v4i32 A1 = __msa_fill_w(A); const v4i32 AB = __msa_ilvr_w(A1, B1); const v4u32 scale = (v4u32)__msa_fill_w(wrk->fy_scale); const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX); while (length >= 16) { v4u32 frow0, frow1, frow2, frow3, irow0, irow1, irow2, irow3; v16u8 t0, t1, t2, t3, t4, t5; LD_UW4(frow, 4, frow0, frow1, frow2, frow3); LD_UW4(irow, 4, irow0, irow1, irow2, irow3); CALC_MULT_FIX2_16(frow0, frow1, irow0, irow1, AB, scale, shift, t0, t1); CALC_MULT_FIX2_16(frow2, frow3, irow2, irow3, AB, scale, shift, t2, t3); PCKEV_B2_UB(t1, t0, t3, t2, t4, t5); t0 = (v16u8)__msa_pckev_b((v16i8)t5, (v16i8)t4); ST_UB(t0, dst); frow += 16; irow += 16; dst += 16; length -= 16; } if (length > 0) { int x_out; if (length >= 12) { uint32_t val0_m, val1_m, val2_m; v4u32 frow0, frow1, frow2, irow0, irow1, irow2; LD_UW3(frow, 4, frow0, frow1, frow2); LD_UW3(irow, 4, irow0, irow1, irow2); CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m); CALC_MULT_FIX2_4(frow1, irow1, AB, scale, shift, val1_m); CALC_MULT_FIX2_4(frow2, irow2, AB, scale, shift, val2_m); SW3(val0_m, val1_m, val2_m, dst, 4); frow += 12; irow += 12; dst += 12; length -= 12; } else if (length >= 8) { uint32_t val0_m, val1_m; v4u32 frow0, frow1, irow0, irow1; LD_UW2(frow, 4, frow0, frow1); LD_UW2(irow, 4, irow0, irow1); CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m); CALC_MULT_FIX2_4(frow1, irow1, AB, scale, shift, val1_m); SW2(val0_m, val1_m, dst, 4); frow += 4; irow += 4; dst += 4; length -= 4; } else if (length >= 4) { uint32_t val0_m; const v4u32 frow0 = LD_UW(frow + 0); const v4u32 irow0 = LD_UW(irow + 0); CALC_MULT_FIX2_4(frow0, irow0, AB, scale, shift, val0_m); SW(val0_m, dst); frow += 4; irow += 4; dst += 4; length -= 4; } for (x_out = 0; x_out < length; ++x_out) { const uint64_t I = (uint64_t)A * frow[x_out] + (uint64_t)B * irow[x_out]; const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } } static void RescalerExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) { uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* frow = wrk->frow; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(wrk->y_expand); assert(wrk->y_sub != 0); if (wrk->y_accum == 0) { ExportRowExpand_0(frow, dst, x_out_max, wrk); } else { ExportRowExpand_1(frow, irow, dst, x_out_max, wrk); } } #if 0 // disabled for now. TODO(skal): make match the C-code static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow, uint8_t* dst, int length, const uint32_t yscale, WebPRescaler* const wrk) { const v4u32 y_scale = (v4u32)__msa_fill_w(yscale); const v4u32 fxyscale = (v4u32)__msa_fill_w(wrk->fxy_scale); const v4u32 shiftval = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX); const v4i32 zero = { 0 }; while (length >= 16) { v4u32 src0, src1, src2, src3, frac0, frac1, frac2, frac3; v16u8 out; LD_UW4(frow, 4, src0, src1, src2, src3); CALC_MULT_FIX1_16(src0, src1, src2, src3, y_scale, shiftval, frac0, frac1, frac2, frac3); LD_UW4(irow, 4, src0, src1, src2, src3); SUB4(src0, frac0, src1, frac1, src2, frac2, src3, frac3, src0, src1, src2, src3); CALC_MULT_FIX_16(src0, src1, src2, src3, fxyscale, shiftval, out); ST_UB(out, dst); ST_UW4(frac0, frac1, frac2, frac3, irow, 4); frow += 16; irow += 16; dst += 16; length -= 16; } if (length > 0) { int x_out; if (length >= 12) { uint32_t val0_m, val1_m, val2_m; v4u32 src0, src1, src2, frac0, frac1, frac2; LD_UW3(frow, 4, src0, src1, src2); CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0); CALC_MULT_FIX1_4(src1, y_scale, shiftval, frac1); CALC_MULT_FIX1_4(src2, y_scale, shiftval, frac2); LD_UW3(irow, 4, src0, src1, src2); SUB3(src0, frac0, src1, frac1, src2, frac2, src0, src1, src2); CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m); CALC_MULT_FIX_4(src1, fxyscale, shiftval, val1_m); CALC_MULT_FIX_4(src2, fxyscale, shiftval, val2_m); SW3(val0_m, val1_m, val2_m, dst, 4); ST_UW3(frac0, frac1, frac2, irow, 4); frow += 12; irow += 12; dst += 12; length -= 12; } else if (length >= 8) { uint32_t val0_m, val1_m; v4u32 src0, src1, frac0, frac1; LD_UW2(frow, 4, src0, src1); CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0); CALC_MULT_FIX1_4(src1, y_scale, shiftval, frac1); LD_UW2(irow, 4, src0, src1); SUB2(src0, frac0, src1, frac1, src0, src1); CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m); CALC_MULT_FIX_4(src1, fxyscale, shiftval, val1_m); SW2(val0_m, val1_m, dst, 4); ST_UW2(frac0, frac1, irow, 4); frow += 8; irow += 8; dst += 8; length -= 8; } else if (length >= 4) { uint32_t val0_m; v4u32 frac0; v4u32 src0 = LD_UW(frow); CALC_MULT_FIX1_4(src0, y_scale, shiftval, frac0); src0 = LD_UW(irow); src0 = src0 - frac0; CALC_MULT_FIX_4(src0, fxyscale, shiftval, val0_m); SW(val0_m, dst); ST_UW(frac0, irow); frow += 4; irow += 4; dst += 4; length -= 4; } for (x_out = 0; x_out < length; ++x_out) { const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(frow[x_out], yscale); const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = frac; } } } static WEBP_INLINE void ExportRowShrink_1(uint32_t* irow, uint8_t* dst, int length, WebPRescaler* const wrk) { const v4u32 scale = (v4u32)__msa_fill_w(wrk->fxy_scale); const v4u32 shift = (v4u32)__msa_fill_w(WEBP_RESCALER_RFIX); const v4i32 zero = { 0 }; while (length >= 16) { v4u32 src0, src1, src2, src3; v16u8 dst0; LD_UW4(irow, 4, src0, src1, src2, src3); CALC_MULT_FIX_16(src0, src1, src2, src3, scale, shift, dst0); ST_UB(dst0, dst); ST_SW4(zero, zero, zero, zero, irow, 4); length -= 16; irow += 16; dst += 16; } if (length > 0) { int x_out; if (length >= 12) { uint32_t val0_m, val1_m, val2_m; v4u32 src0, src1, src2; LD_UW3(irow, 4, src0, src1, src2); CALC_MULT_FIX_4(src0, scale, shift, val0_m); CALC_MULT_FIX_4(src1, scale, shift, val1_m); CALC_MULT_FIX_4(src2, scale, shift, val2_m); SW3(val0_m, val1_m, val2_m, dst, 4); ST_SW3(zero, zero, zero, irow, 4); length -= 12; irow += 12; dst += 12; } else if (length >= 8) { uint32_t val0_m, val1_m; v4u32 src0, src1; LD_UW2(irow, 4, src0, src1); CALC_MULT_FIX_4(src0, scale, shift, val0_m); CALC_MULT_FIX_4(src1, scale, shift, val1_m); SW2(val0_m, val1_m, dst, 4); ST_SW2(zero, zero, irow, 4); length -= 8; irow += 8; dst += 8; } else if (length >= 4) { uint32_t val0_m; const v4u32 src0 = LD_UW(irow + 0); CALC_MULT_FIX_4(src0, scale, shift, val0_m); SW(val0_m, dst); ST_SW(zero, irow); length -= 4; irow += 4; dst += 4; } for (x_out = 0; x_out < length; ++x_out) { const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = 0; } } } static void RescalerExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) { uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* frow = wrk->frow; const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); if (yscale) { ExportRowShrink_0(frow, irow, dst, x_out_max, yscale, wrk); } else { ExportRowShrink_1(irow, dst, x_out_max, wrk); } } #endif // 0 //------------------------------------------------------------------------------ // Entry point extern void WebPRescalerDspInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMSA(void) { WebPRescalerExportRowExpand = RescalerExportRowExpand_MIPSdspR2; // WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(WebPRescalerDspInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/alpha_processing_sse41.c0000644000014400001440000000724114606317060016140 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for processing transparent channel, SSE4.1 variant. // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include //------------------------------------------------------------------------------ static int ExtractAlpha_SSE41(const uint8_t* WEBP_RESTRICT argb, int argb_stride, int width, int height, uint8_t* WEBP_RESTRICT alpha, int alpha_stride) { // alpha_and stores an 'and' operation of all the alpha[] values. The final // value is not 0xff if any of the alpha[] is not equal to 0xff. uint32_t alpha_and = 0xff; int i, j; const __m128i all_0xff = _mm_set1_epi32(~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte // 'src[4 * width - 4]', because we don't know if alpha is the first or the // last byte of the quadruplet. const int limit = (width - 1) & ~15; const __m128i kCstAlpha0 = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); const __m128i kCstAlpha1 = _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0, -1, -1, -1, -1); const __m128i kCstAlpha2 = _mm_set_epi8(-1, -1, -1, -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1); const __m128i kCstAlpha3 = _mm_set_epi8(12, 8, 4, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); for (j = 0; j < height; ++j) { const __m128i* src = (const __m128i*)argb; for (i = 0; i < limit; i += 16) { // load 64 argb bytes const __m128i a0 = _mm_loadu_si128(src + 0); const __m128i a1 = _mm_loadu_si128(src + 1); const __m128i a2 = _mm_loadu_si128(src + 2); const __m128i a3 = _mm_loadu_si128(src + 3); const __m128i b0 = _mm_shuffle_epi8(a0, kCstAlpha0); const __m128i b1 = _mm_shuffle_epi8(a1, kCstAlpha1); const __m128i b2 = _mm_shuffle_epi8(a2, kCstAlpha2); const __m128i b3 = _mm_shuffle_epi8(a3, kCstAlpha3); const __m128i c0 = _mm_or_si128(b0, b1); const __m128i c1 = _mm_or_si128(b2, b3); const __m128i d0 = _mm_or_si128(c0, c1); // store _mm_storeu_si128((__m128i*)&alpha[i], d0); // accumulate sixteen alpha 'and' in parallel all_alphas = _mm_and_si128(all_alphas, d0); src += 4; } for (; i < width; ++i) { const uint32_t alpha_value = argb[4 * i]; alpha[i] = alpha_value; alpha_and &= alpha_value; } argb += argb_stride; alpha += alpha_stride; } // Combine the sixteen alpha 'and' into an 8-bit mask. alpha_and |= 0xff00u; // pretend the upper bits [8..15] were tested ok. alpha_and &= _mm_movemask_epi8(_mm_cmpeq_epi8(all_alphas, all_0xff)); return (alpha_and == 0xffffu); } //------------------------------------------------------------------------------ // Entry point extern void WebPInitAlphaProcessingSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingSSE41(void) { WebPExtractAlpha = ExtractAlpha_SSE41; } #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(WebPInitAlphaProcessingSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/lossless_enc_sse41.c0000644000014400001440000001715314606317060015316 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE4.1 variant of methods for lossless encoder // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include #include #include "src/dsp/lossless.h" //------------------------------------------------------------------------------ // Cost operations. static WEBP_INLINE uint32_t HorizontalSum_SSE41(__m128i cost) { cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 8)); cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 4)); return _mm_cvtsi128_si32(cost); } static uint32_t ExtraCost_SSE41(const uint32_t* const a, int length) { int i; __m128i cost = _mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]); assert(length % 8 == 0); for (i = 8; i + 8 <= length; i += 8) { const int j = (i - 2) >> 1; const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]); const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j); const __m128i a2 = _mm_hadd_epi32(a0, a1); const __m128i mul = _mm_mullo_epi32(a2, w); cost = _mm_add_epi32(mul, cost); } return HorizontalSum_SSE41(cost); } static uint32_t ExtraCostCombined_SSE41(const uint32_t* const a, const uint32_t* const b, int length) { int i; __m128i cost = _mm_add_epi32(_mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]), _mm_set_epi32(2 * b[7], 2 * b[6], b[5], b[4])); assert(length % 8 == 0); for (i = 8; i + 8 <= length; i += 8) { const int j = (i - 2) >> 1; const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]); const __m128i b0 = _mm_loadu_si128((const __m128i*)&b[i]); const __m128i b1 = _mm_loadu_si128((const __m128i*)&b[i + 4]); const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j); const __m128i a2 = _mm_hadd_epi32(a0, a1); const __m128i b2 = _mm_hadd_epi32(b0, b1); const __m128i mul = _mm_mullo_epi32(_mm_add_epi32(a2, b2), w); cost = _mm_add_epi32(mul, cost); } return HorizontalSum_SSE41(cost); } //------------------------------------------------------------------------------ // Subtract-Green Transform static void SubtractGreenFromBlueAndRed_SSE41(uint32_t* argb_data, int num_pixels) { int i; const __m128i kCstShuffle = _mm_set_epi8(-1, 13, -1, 13, -1, 9, -1, 9, -1, 5, -1, 5, -1, 1, -1, 1); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); const __m128i in_0g0g = _mm_shuffle_epi8(in, kCstShuffle); const __m128i out = _mm_sub_epi8(in, in_0g0g); _mm_storeu_si128((__m128i*)&argb_data[i], out); } // fallthrough and finish off with plain-C if (i != num_pixels) { VP8LSubtractGreenFromBlueAndRed_C(argb_data + i, num_pixels - i); } } //------------------------------------------------------------------------------ // Color Transform // For sign-extended multiplying constants, pre-shifted by 5: #define CST_5b(X) (((int16_t)((uint16_t)(X) << 8)) >> 5) #define MK_CST_16(HI, LO) \ _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff))) static void CollectColorBlueTransforms_SSE41(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]) { const __m128i mult = MK_CST_16(CST_5b(red_to_blue) + 256,CST_5b(green_to_blue)); const __m128i perm = _mm_setr_epi8(-1, 1, -1, 2, -1, 5, -1, 6, -1, 9, -1, 10, -1, 13, -1, 14); if (tile_width >= 4) { int y; for (y = 0; y < tile_height; ++y) { const uint32_t* const src = argb + y * stride; const __m128i A1 = _mm_loadu_si128((const __m128i*)src); const __m128i B1 = _mm_shuffle_epi8(A1, perm); const __m128i C1 = _mm_mulhi_epi16(B1, mult); const __m128i D1 = _mm_sub_epi16(A1, C1); __m128i E = _mm_add_epi16(_mm_srli_epi32(D1, 16), D1); int x; for (x = 4; x + 4 <= tile_width; x += 4) { const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x)); __m128i B2, C2, D2; ++histo[_mm_extract_epi8(E, 0)]; B2 = _mm_shuffle_epi8(A2, perm); ++histo[_mm_extract_epi8(E, 4)]; C2 = _mm_mulhi_epi16(B2, mult); ++histo[_mm_extract_epi8(E, 8)]; D2 = _mm_sub_epi16(A2, C2); ++histo[_mm_extract_epi8(E, 12)]; E = _mm_add_epi16(_mm_srli_epi32(D2, 16), D2); } ++histo[_mm_extract_epi8(E, 0)]; ++histo[_mm_extract_epi8(E, 4)]; ++histo[_mm_extract_epi8(E, 8)]; ++histo[_mm_extract_epi8(E, 12)]; } } { const int left_over = tile_width & 3; if (left_over > 0) { VP8LCollectColorBlueTransforms_C(argb + tile_width - left_over, stride, left_over, tile_height, green_to_blue, red_to_blue, histo); } } } static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]) { const __m128i mult = MK_CST_16(0, CST_5b(green_to_red)); const __m128i mask_g = _mm_set1_epi32(0x0000ff00); if (tile_width >= 4) { int y; for (y = 0; y < tile_height; ++y) { const uint32_t* const src = argb + y * stride; const __m128i A1 = _mm_loadu_si128((const __m128i*)src); const __m128i B1 = _mm_and_si128(A1, mask_g); const __m128i C1 = _mm_madd_epi16(B1, mult); __m128i D = _mm_sub_epi16(A1, C1); int x; for (x = 4; x + 4 <= tile_width; x += 4) { const __m128i A2 = _mm_loadu_si128((const __m128i*)(src + x)); __m128i B2, C2; ++histo[_mm_extract_epi8(D, 2)]; B2 = _mm_and_si128(A2, mask_g); ++histo[_mm_extract_epi8(D, 6)]; C2 = _mm_madd_epi16(B2, mult); ++histo[_mm_extract_epi8(D, 10)]; ++histo[_mm_extract_epi8(D, 14)]; D = _mm_sub_epi16(A2, C2); } ++histo[_mm_extract_epi8(D, 2)]; ++histo[_mm_extract_epi8(D, 6)]; ++histo[_mm_extract_epi8(D, 10)]; ++histo[_mm_extract_epi8(D, 14)]; } } { const int left_over = tile_width & 3; if (left_over > 0) { VP8LCollectColorRedTransforms_C(argb + tile_width - left_over, stride, left_over, tile_height, green_to_red, histo); } } } #undef MK_CST_16 //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE41(void) { VP8LExtraCost = ExtraCost_SSE41; VP8LExtraCostCombined = ExtraCostCombined_SSE41; VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_SSE41; VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE41; VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE41; } #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(VP8LEncDspInitSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/yuv.c0000644000014400001440000002120114606317060012413 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV->RGB conversion functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/yuv.h" #include #include //----------------------------------------------------------------------------- // Plain-C version #define ROW_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* y, \ const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ const uint8_t* const end = dst + (len & ~1) * (XSTEP); \ while (dst != end) { \ FUNC(y[0], u[0], v[0], dst); \ FUNC(y[1], u[0], v[0], dst + (XSTEP)); \ y += 2; \ ++u; \ ++v; \ dst += 2 * (XSTEP); \ } \ if (len & 1) { \ FUNC(y[0], u[0], v[0], dst); \ } \ } \ // All variants implemented. ROW_FUNC(YuvToRgbRow, VP8YuvToRgb, 3) ROW_FUNC(YuvToBgrRow, VP8YuvToBgr, 3) ROW_FUNC(YuvToRgbaRow, VP8YuvToRgba, 4) ROW_FUNC(YuvToBgraRow, VP8YuvToBgra, 4) ROW_FUNC(YuvToArgbRow, VP8YuvToArgb, 4) ROW_FUNC(YuvToRgba4444Row, VP8YuvToRgba4444, 2) ROW_FUNC(YuvToRgb565Row, VP8YuvToRgb565, 2) #undef ROW_FUNC // Main call for processing a plane with a WebPSamplerRowFunc function: void WebPSamplerProcessPlane(const uint8_t* y, int y_stride, const uint8_t* u, const uint8_t* v, int uv_stride, uint8_t* dst, int dst_stride, int width, int height, WebPSamplerRowFunc func) { int j; for (j = 0; j < height; ++j) { func(y, u, v, dst, width); y += y_stride; if (j & 1) { u += uv_stride; v += uv_stride; } dst += dst_stride; } } //----------------------------------------------------------------------------- // Main call WebPSamplerRowFunc WebPSamplers[MODE_LAST]; extern VP8CPUInfo VP8GetCPUInfo; extern void WebPInitSamplersSSE2(void); extern void WebPInitSamplersSSE41(void); extern void WebPInitSamplersMIPS32(void); extern void WebPInitSamplersMIPSdspR2(void); WEBP_DSP_INIT_FUNC(WebPInitSamplers) { WebPSamplers[MODE_RGB] = YuvToRgbRow; WebPSamplers[MODE_RGBA] = YuvToRgbaRow; WebPSamplers[MODE_BGR] = YuvToBgrRow; WebPSamplers[MODE_BGRA] = YuvToBgraRow; WebPSamplers[MODE_ARGB] = YuvToArgbRow; WebPSamplers[MODE_RGBA_4444] = YuvToRgba4444Row; WebPSamplers[MODE_RGB_565] = YuvToRgb565Row; WebPSamplers[MODE_rgbA] = YuvToRgbaRow; WebPSamplers[MODE_bgrA] = YuvToBgraRow; WebPSamplers[MODE_Argb] = YuvToArgbRow; WebPSamplers[MODE_rgbA_4444] = YuvToRgba4444Row; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPInitSamplersSSE2(); } #endif // WEBP_HAVE_SSE2 #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { WebPInitSamplersSSE41(); } #endif // WEBP_HAVE_SSE41 #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { WebPInitSamplersMIPS32(); } #endif // WEBP_USE_MIPS32 #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { WebPInitSamplersMIPSdspR2(); } #endif // WEBP_USE_MIPS_DSP_R2 } } //----------------------------------------------------------------------------- // ARGB -> YUV converters static void ConvertARGBToY_C(const uint32_t* argb, uint8_t* y, int width) { int i; for (i = 0; i < width; ++i) { const uint32_t p = argb[i]; y[i] = VP8RGBToY((p >> 16) & 0xff, (p >> 8) & 0xff, (p >> 0) & 0xff, YUV_HALF); } } void WebPConvertARGBToUV_C(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store) { // No rounding. Last pixel is dealt with separately. const int uv_width = src_width >> 1; int i; for (i = 0; i < uv_width; ++i) { const uint32_t v0 = argb[2 * i + 0]; const uint32_t v1 = argb[2 * i + 1]; // VP8RGBToU/V expects four accumulated pixels. Hence we need to // scale r/g/b value by a factor 2. We just shift v0/v1 one bit less. const int r = ((v0 >> 15) & 0x1fe) + ((v1 >> 15) & 0x1fe); const int g = ((v0 >> 7) & 0x1fe) + ((v1 >> 7) & 0x1fe); const int b = ((v0 << 1) & 0x1fe) + ((v1 << 1) & 0x1fe); const int tmp_u = VP8RGBToU(r, g, b, YUV_HALF << 2); const int tmp_v = VP8RGBToV(r, g, b, YUV_HALF << 2); if (do_store) { u[i] = tmp_u; v[i] = tmp_v; } else { // Approximated average-of-four. But it's an acceptable diff. u[i] = (u[i] + tmp_u + 1) >> 1; v[i] = (v[i] + tmp_v + 1) >> 1; } } if (src_width & 1) { // last pixel const uint32_t v0 = argb[2 * i + 0]; const int r = (v0 >> 14) & 0x3fc; const int g = (v0 >> 6) & 0x3fc; const int b = (v0 << 2) & 0x3fc; const int tmp_u = VP8RGBToU(r, g, b, YUV_HALF << 2); const int tmp_v = VP8RGBToV(r, g, b, YUV_HALF << 2); if (do_store) { u[i] = tmp_u; v[i] = tmp_v; } else { u[i] = (u[i] + tmp_u + 1) >> 1; v[i] = (v[i] + tmp_v + 1) >> 1; } } } //----------------------------------------------------------------------------- static void ConvertRGB24ToY_C(const uint8_t* rgb, uint8_t* y, int width) { int i; for (i = 0; i < width; ++i, rgb += 3) { y[i] = VP8RGBToY(rgb[0], rgb[1], rgb[2], YUV_HALF); } } static void ConvertBGR24ToY_C(const uint8_t* bgr, uint8_t* y, int width) { int i; for (i = 0; i < width; ++i, bgr += 3) { y[i] = VP8RGBToY(bgr[2], bgr[1], bgr[0], YUV_HALF); } } void WebPConvertRGBA32ToUV_C(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width) { int i; for (i = 0; i < width; i += 1, rgb += 4) { const int r = rgb[0], g = rgb[1], b = rgb[2]; u[i] = VP8RGBToU(r, g, b, YUV_HALF << 2); v[i] = VP8RGBToV(r, g, b, YUV_HALF << 2); } } //----------------------------------------------------------------------------- void (*WebPConvertRGB24ToY)(const uint8_t* rgb, uint8_t* y, int width); void (*WebPConvertBGR24ToY)(const uint8_t* bgr, uint8_t* y, int width); void (*WebPConvertRGBA32ToUV)(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width); void (*WebPConvertARGBToY)(const uint32_t* argb, uint8_t* y, int width); void (*WebPConvertARGBToUV)(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store); extern void WebPInitConvertARGBToYUVSSE2(void); extern void WebPInitConvertARGBToYUVSSE41(void); extern void WebPInitConvertARGBToYUVNEON(void); WEBP_DSP_INIT_FUNC(WebPInitConvertARGBToYUV) { WebPConvertARGBToY = ConvertARGBToY_C; WebPConvertARGBToUV = WebPConvertARGBToUV_C; WebPConvertRGB24ToY = ConvertRGB24ToY_C; WebPConvertBGR24ToY = ConvertBGR24ToY_C; WebPConvertRGBA32ToUV = WebPConvertRGBA32ToUV_C; if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPInitConvertARGBToYUVSSE2(); } #endif // WEBP_HAVE_SSE2 #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { WebPInitConvertARGBToYUVSSE41(); } #endif // WEBP_HAVE_SSE41 } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { WebPInitConvertARGBToYUVNEON(); } #endif // WEBP_HAVE_NEON assert(WebPConvertARGBToY != NULL); assert(WebPConvertARGBToUV != NULL); assert(WebPConvertRGB24ToY != NULL); assert(WebPConvertBGR24ToY != NULL); assert(WebPConvertRGBA32ToUV != NULL); } libwebp-1.4.0/src/dsp/filters_neon.c0000644000014400001440000002670314606317060014273 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON variant of alpha filters // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include #include "src/dsp/neon.h" //------------------------------------------------------------------------------ // Helpful macros. #define DCHECK(in, out) \ do { \ assert(in != NULL); \ assert(out != NULL); \ assert(width > 0); \ assert(height > 0); \ assert(stride >= width); \ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \ (void)height; /* Silence unused warning. */ \ } while (0) // load eight u8 and widen to s16 #define U8_TO_S16(A) vreinterpretq_s16_u16(vmovl_u8(A)) #define LOAD_U8_TO_S16(A) U8_TO_S16(vld1_u8(A)) // shift left or right by N byte, inserting zeros #define SHIFT_RIGHT_N_Q(A, N) vextq_u8((A), zero, (N)) #define SHIFT_LEFT_N_Q(A, N) vextq_u8(zero, (A), (16 - (N)) % 16) // rotate left by N bytes #define ROTATE_LEFT_N(A, N) vext_u8((A), (A), (N)) // rotate right by N bytes #define ROTATE_RIGHT_N(A, N) vext_u8((A), (A), (8 - (N)) % 8) static void PredictLine_NEON(const uint8_t* src, const uint8_t* pred, uint8_t* dst, int length) { int i; assert(length >= 0); for (i = 0; i + 16 <= length; i += 16) { const uint8x16_t A = vld1q_u8(&src[i]); const uint8x16_t B = vld1q_u8(&pred[i]); const uint8x16_t C = vsubq_u8(A, B); vst1q_u8(&dst[i], C); } for (; i < length; ++i) dst[i] = src[i] - pred[i]; } // Special case for left-based prediction (when preds==dst-1 or preds==src-1). static void PredictLineLeft_NEON(const uint8_t* src, uint8_t* dst, int length) { PredictLine_NEON(src, src - 1, dst, length); } //------------------------------------------------------------------------------ // Horizontal filter. static WEBP_INLINE void DoHorizontalFilter_NEON(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; if (row == 0) { // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLineLeft_NEON(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { // Leftmost pixel is predicted from above. out[0] = in[0] - in[-stride]; PredictLineLeft_NEON(in + 1, out + 1, width - 1); ++row; in += stride; out += stride; } } static void HorizontalFilter_NEON(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoHorizontalFilter_NEON(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ // Vertical filter. static WEBP_INLINE void DoVerticalFilter_NEON(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; if (row == 0) { // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLineLeft_NEON(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { PredictLine_NEON(in, in - stride, out, width); ++row; in += stride; out += stride; } } static void VerticalFilter_NEON(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoVerticalFilter_NEON(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ // Gradient filter. static WEBP_INLINE int GradientPredictor_C(uint8_t a, uint8_t b, uint8_t c) { const int g = a + b - c; return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit } static void GradientPredictDirect_NEON(const uint8_t* const row, const uint8_t* const top, uint8_t* const out, int length) { int i; for (i = 0; i + 8 <= length; i += 8) { const uint8x8_t A = vld1_u8(&row[i - 1]); const uint8x8_t B = vld1_u8(&top[i + 0]); const int16x8_t C = vreinterpretq_s16_u16(vaddl_u8(A, B)); const int16x8_t D = LOAD_U8_TO_S16(&top[i - 1]); const uint8x8_t E = vqmovun_s16(vsubq_s16(C, D)); const uint8x8_t F = vld1_u8(&row[i + 0]); vst1_u8(&out[i], vsub_u8(F, E)); } for (; i < length; ++i) { out[i] = row[i] - GradientPredictor_C(row[i - 1], top[i], top[i - 1]); } } static WEBP_INLINE void DoGradientFilter_NEON(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; // left prediction for top scan-line if (row == 0) { out[0] = in[0]; PredictLineLeft_NEON(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { out[0] = in[0] - in[-stride]; GradientPredictDirect_NEON(in + 1, in + 1 - stride, out + 1, width - 1); ++row; in += stride; out += stride; } } static void GradientFilter_NEON(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoGradientFilter_NEON(data, width, height, stride, 0, height, filtered_data); } #undef DCHECK //------------------------------------------------------------------------------ // Inverse transforms static void HorizontalUnfilter_NEON(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { int i; const uint8x16_t zero = vdupq_n_u8(0); uint8x16_t last; out[0] = in[0] + (prev == NULL ? 0 : prev[0]); if (width <= 1) return; last = vsetq_lane_u8(out[0], zero, 0); for (i = 1; i + 16 <= width; i += 16) { const uint8x16_t A0 = vld1q_u8(&in[i]); const uint8x16_t A1 = vaddq_u8(A0, last); const uint8x16_t A2 = SHIFT_LEFT_N_Q(A1, 1); const uint8x16_t A3 = vaddq_u8(A1, A2); const uint8x16_t A4 = SHIFT_LEFT_N_Q(A3, 2); const uint8x16_t A5 = vaddq_u8(A3, A4); const uint8x16_t A6 = SHIFT_LEFT_N_Q(A5, 4); const uint8x16_t A7 = vaddq_u8(A5, A6); const uint8x16_t A8 = SHIFT_LEFT_N_Q(A7, 8); const uint8x16_t A9 = vaddq_u8(A7, A8); vst1q_u8(&out[i], A9); last = SHIFT_RIGHT_N_Q(A9, 15); } for (; i < width; ++i) out[i] = in[i] + out[i - 1]; } static void VerticalUnfilter_NEON(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_NEON(NULL, in, out, width); } else { int i; assert(width >= 0); for (i = 0; i + 16 <= width; i += 16) { const uint8x16_t A = vld1q_u8(&in[i]); const uint8x16_t B = vld1q_u8(&prev[i]); const uint8x16_t C = vaddq_u8(A, B); vst1q_u8(&out[i], C); } for (; i < width; ++i) out[i] = in[i] + prev[i]; } } // GradientUnfilter_NEON is correct but slower than the C-version, // at least on ARM64. For armv7, it's a wash. // So best is to disable it for now, but keep the idea around... #if !defined(USE_GRADIENT_UNFILTER) #define USE_GRADIENT_UNFILTER 0 // ALTERNATE_CODE #endif #if (USE_GRADIENT_UNFILTER == 1) #define GRAD_PROCESS_LANE(L) do { \ const uint8x8_t tmp1 = ROTATE_RIGHT_N(pred, 1); /* rotate predictor in */ \ const int16x8_t tmp2 = vaddq_s16(BC, U8_TO_S16(tmp1)); \ const uint8x8_t delta = vqmovun_s16(tmp2); \ pred = vadd_u8(D, delta); \ out = vext_u8(out, ROTATE_LEFT_N(pred, (L)), 1); \ } while (0) static void GradientPredictInverse_NEON(const uint8_t* const in, const uint8_t* const top, uint8_t* const row, int length) { if (length > 0) { int i; uint8x8_t pred = vdup_n_u8(row[-1]); // left sample uint8x8_t out = vdup_n_u8(0); for (i = 0; i + 8 <= length; i += 8) { const int16x8_t B = LOAD_U8_TO_S16(&top[i + 0]); const int16x8_t C = LOAD_U8_TO_S16(&top[i - 1]); const int16x8_t BC = vsubq_s16(B, C); // unclipped gradient basis B - C const uint8x8_t D = vld1_u8(&in[i]); // base input GRAD_PROCESS_LANE(0); GRAD_PROCESS_LANE(1); GRAD_PROCESS_LANE(2); GRAD_PROCESS_LANE(3); GRAD_PROCESS_LANE(4); GRAD_PROCESS_LANE(5); GRAD_PROCESS_LANE(6); GRAD_PROCESS_LANE(7); vst1_u8(&row[i], out); } for (; i < length; ++i) { row[i] = in[i] + GradientPredictor_C(row[i - 1], top[i], top[i - 1]); } } } #undef GRAD_PROCESS_LANE static void GradientUnfilter_NEON(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_NEON(NULL, in, out, width); } else { out[0] = in[0] + prev[0]; // predict from above GradientPredictInverse_NEON(in + 1, prev + 1, out + 1, width - 1); } } #endif // USE_GRADIENT_UNFILTER //------------------------------------------------------------------------------ // Entry point extern void VP8FiltersInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitNEON(void) { WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_NEON; WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_NEON; #if (USE_GRADIENT_UNFILTER == 1) WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_NEON; #endif WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_NEON; WebPFilters[WEBP_FILTER_VERTICAL] = VerticalFilter_NEON; WebPFilters[WEBP_FILTER_GRADIENT] = GradientFilter_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8FiltersInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/enc_mips32.c0000644000014400001440000010431214606317060013537 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of speed-critical encoding functions. // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) // Slobodan Prijic (slobodan.prijic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS32) #include "src/dsp/mips_macro.h" #include "src/enc/vp8i_enc.h" #include "src/enc/cost_enc.h" static const int kC1 = WEBP_TRANSFORM_AC3_C1; static const int kC2 = WEBP_TRANSFORM_AC3_C2; // macro for one vertical pass in ITransformOne // MUL macro inlined // temp0..temp15 holds tmp[0]..tmp[15] // A..D - offsets in bytes to load from in buffer // TEMP0..TEMP3 - registers for corresponding tmp elements // TEMP4..TEMP5 - temporary registers #define VERTICAL_PASS(A, B, C, D, TEMP4, TEMP0, TEMP1, TEMP2, TEMP3) \ "lh %[temp16], " #A "(%[temp20]) \n\t" \ "lh %[temp18], " #B "(%[temp20]) \n\t" \ "lh %[temp17], " #C "(%[temp20]) \n\t" \ "lh %[temp19], " #D "(%[temp20]) \n\t" \ "addu %[" #TEMP4 "], %[temp16], %[temp18] \n\t" \ "subu %[temp16], %[temp16], %[temp18] \n\t" \ "mul %[" #TEMP0 "], %[temp17], %[kC2] \n\t" \ MUL_SHIFT_C1_IO(temp17, temp18) \ MUL_SHIFT_C1(temp18, temp19) \ "mul %[temp19], %[temp19], %[kC2] \n\t" \ "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\n" \ "sra %[temp19], %[temp19], 16 \n\n" \ "subu %[" #TEMP2 "], %[" #TEMP0 "], %[temp18] \n\t" \ "addu %[" #TEMP3 "], %[temp17], %[temp19] \n\t" \ "addu %[" #TEMP0 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t" \ "addu %[" #TEMP1 "], %[temp16], %[" #TEMP2 "] \n\t" \ "subu %[" #TEMP2 "], %[temp16], %[" #TEMP2 "] \n\t" \ "subu %[" #TEMP3 "], %[" #TEMP4 "], %[" #TEMP3 "] \n\t" // macro for one horizontal pass in ITransformOne // MUL and STORE macros inlined // a = clip_8b(a) is replaced with: a = max(a, 0); a = min(a, 255) // temp0..temp15 holds tmp[0]..tmp[15] // A - offset in bytes to load from ref and store to dst buffer // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements #define HORIZONTAL_PASS(A, TEMP0, TEMP4, TEMP8, TEMP12) \ "addiu %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \ "subu %[temp17], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \ "mul %[" #TEMP0 "], %[" #TEMP4 "], %[kC2] \n\t" \ MUL_SHIFT_C1_IO(TEMP4, TEMP8) \ MUL_SHIFT_C1(TEMP8, TEMP12) \ "mul %[" #TEMP12 "], %[" #TEMP12 "], %[kC2] \n\t" \ "sra %[" #TEMP0 "], %[" #TEMP0 "], 16 \n\t" \ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \ "subu %[temp18], %[" #TEMP0 "], %[" #TEMP8 "] \n\t" \ "addu %[temp19], %[" #TEMP4 "], %[" #TEMP12 "] \n\t" \ "addu %[" #TEMP0 "], %[temp16], %[temp19] \n\t" \ "addu %[" #TEMP4 "], %[temp17], %[temp18] \n\t" \ "subu %[" #TEMP8 "], %[temp17], %[temp18] \n\t" \ "subu %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \ "lw %[temp20], 0(%[args]) \n\t" \ "sra %[" #TEMP0 "], %[" #TEMP0 "], 3 \n\t" \ "sra %[" #TEMP4 "], %[" #TEMP4 "], 3 \n\t" \ "sra %[" #TEMP8 "], %[" #TEMP8 "], 3 \n\t" \ "sra %[" #TEMP12 "], %[" #TEMP12 "], 3 \n\t" \ "lbu %[temp16], 0+" XSTR(BPS) "*" #A "(%[temp20]) \n\t" \ "lbu %[temp17], 1+" XSTR(BPS) "*" #A "(%[temp20]) \n\t" \ "lbu %[temp18], 2+" XSTR(BPS) "*" #A "(%[temp20]) \n\t" \ "lbu %[temp19], 3+" XSTR(BPS) "*" #A "(%[temp20]) \n\t" \ "addu %[" #TEMP0 "], %[temp16], %[" #TEMP0 "] \n\t" \ "addu %[" #TEMP4 "], %[temp17], %[" #TEMP4 "] \n\t" \ "addu %[" #TEMP8 "], %[temp18], %[" #TEMP8 "] \n\t" \ "addu %[" #TEMP12 "], %[temp19], %[" #TEMP12 "] \n\t" \ "slt %[temp16], %[" #TEMP0 "], $zero \n\t" \ "slt %[temp17], %[" #TEMP4 "], $zero \n\t" \ "slt %[temp18], %[" #TEMP8 "], $zero \n\t" \ "slt %[temp19], %[" #TEMP12 "], $zero \n\t" \ "movn %[" #TEMP0 "], $zero, %[temp16] \n\t" \ "movn %[" #TEMP4 "], $zero, %[temp17] \n\t" \ "movn %[" #TEMP8 "], $zero, %[temp18] \n\t" \ "movn %[" #TEMP12 "], $zero, %[temp19] \n\t" \ "addiu %[temp20], $zero, 255 \n\t" \ "slt %[temp16], %[" #TEMP0 "], %[temp20] \n\t" \ "slt %[temp17], %[" #TEMP4 "], %[temp20] \n\t" \ "slt %[temp18], %[" #TEMP8 "], %[temp20] \n\t" \ "slt %[temp19], %[" #TEMP12 "], %[temp20] \n\t" \ "movz %[" #TEMP0 "], %[temp20], %[temp16] \n\t" \ "movz %[" #TEMP4 "], %[temp20], %[temp17] \n\t" \ "lw %[temp16], 8(%[args]) \n\t" \ "movz %[" #TEMP8 "], %[temp20], %[temp18] \n\t" \ "movz %[" #TEMP12 "], %[temp20], %[temp19] \n\t" \ "sb %[" #TEMP0 "], 0+" XSTR(BPS) "*" #A "(%[temp16]) \n\t" \ "sb %[" #TEMP4 "], 1+" XSTR(BPS) "*" #A "(%[temp16]) \n\t" \ "sb %[" #TEMP8 "], 2+" XSTR(BPS) "*" #A "(%[temp16]) \n\t" \ "sb %[" #TEMP12 "], 3+" XSTR(BPS) "*" #A "(%[temp16]) \n\t" // Does one or two inverse transforms. static WEBP_INLINE void ITransformOne_MIPS32(const uint8_t* ref, const int16_t* in, uint8_t* dst) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6; int temp7, temp8, temp9, temp10, temp11, temp12, temp13; int temp14, temp15, temp16, temp17, temp18, temp19, temp20; const int* args[3] = {(const int*)ref, (const int*)in, (const int*)dst}; __asm__ volatile( "lw %[temp20], 4(%[args]) \n\t" VERTICAL_PASS(0, 16, 8, 24, temp4, temp0, temp1, temp2, temp3) VERTICAL_PASS(2, 18, 10, 26, temp8, temp4, temp5, temp6, temp7) VERTICAL_PASS(4, 20, 12, 28, temp12, temp8, temp9, temp10, temp11) VERTICAL_PASS(6, 22, 14, 30, temp20, temp12, temp13, temp14, temp15) HORIZONTAL_PASS(0, temp0, temp4, temp8, temp12) HORIZONTAL_PASS(1, temp1, temp5, temp9, temp13) HORIZONTAL_PASS(2, temp2, temp6, temp10, temp14) HORIZONTAL_PASS(3, temp3, temp7, temp11, temp15) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11), [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), [temp14]"=&r"(temp14), [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), [temp17]"=&r"(temp17), [temp18]"=&r"(temp18), [temp19]"=&r"(temp19), [temp20]"=&r"(temp20) : [args]"r"(args), [kC1]"r"(kC1), [kC2]"r"(kC2) : "memory", "hi", "lo" ); } static void ITransform_MIPS32(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { ITransformOne_MIPS32(ref, in, dst); if (do_two) { ITransformOne_MIPS32(ref + 4, in + 16, dst + 4); } } #undef VERTICAL_PASS #undef HORIZONTAL_PASS // macro for one pass through for loop in QuantizeBlock // QUANTDIV macro inlined // J - offset in bytes (kZigzag[n] * 2) // K - offset in bytes (kZigzag[n] * 4) // N - offset in bytes (n * 2) #define QUANTIZE_ONE(J, K, N) \ "lh %[temp0], " #J "(%[ppin]) \n\t" \ "lhu %[temp1], " #J "(%[ppsharpen]) \n\t" \ "lw %[temp2], " #K "(%[ppzthresh]) \n\t" \ "sra %[sign], %[temp0], 15 \n\t" \ "xor %[coeff], %[temp0], %[sign] \n\t" \ "subu %[coeff], %[coeff], %[sign] \n\t" \ "addu %[coeff], %[coeff], %[temp1] \n\t" \ "slt %[temp4], %[temp2], %[coeff] \n\t" \ "addiu %[temp5], $zero, 0 \n\t" \ "addiu %[level], $zero, 0 \n\t" \ "beqz %[temp4], 2f \n\t" \ "lhu %[temp1], " #J "(%[ppiq]) \n\t" \ "lw %[temp2], " #K "(%[ppbias]) \n\t" \ "lhu %[temp3], " #J "(%[ppq]) \n\t" \ "mul %[level], %[coeff], %[temp1] \n\t" \ "addu %[level], %[level], %[temp2] \n\t" \ "sra %[level], %[level], 17 \n\t" \ "slt %[temp4], %[max_level], %[level] \n\t" \ "movn %[level], %[max_level], %[temp4] \n\t" \ "xor %[level], %[level], %[sign] \n\t" \ "subu %[level], %[level], %[sign] \n\t" \ "mul %[temp5], %[level], %[temp3] \n\t" \ "2: \n\t" \ "sh %[temp5], " #J "(%[ppin]) \n\t" \ "sh %[level], " #N "(%[pout]) \n\t" static int QuantizeBlock_MIPS32(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { int temp0, temp1, temp2, temp3, temp4, temp5; int sign, coeff, level, i; int max_level = MAX_LEVEL; int16_t* ppin = &in[0]; int16_t* pout = &out[0]; const uint16_t* ppsharpen = &mtx->sharpen_[0]; const uint32_t* ppzthresh = &mtx->zthresh_[0]; const uint16_t* ppq = &mtx->q_[0]; const uint16_t* ppiq = &mtx->iq_[0]; const uint32_t* ppbias = &mtx->bias_[0]; __asm__ volatile( QUANTIZE_ONE( 0, 0, 0) QUANTIZE_ONE( 2, 4, 2) QUANTIZE_ONE( 8, 16, 4) QUANTIZE_ONE(16, 32, 6) QUANTIZE_ONE(10, 20, 8) QUANTIZE_ONE( 4, 8, 10) QUANTIZE_ONE( 6, 12, 12) QUANTIZE_ONE(12, 24, 14) QUANTIZE_ONE(18, 36, 16) QUANTIZE_ONE(24, 48, 18) QUANTIZE_ONE(26, 52, 20) QUANTIZE_ONE(20, 40, 22) QUANTIZE_ONE(14, 28, 24) QUANTIZE_ONE(22, 44, 26) QUANTIZE_ONE(28, 56, 28) QUANTIZE_ONE(30, 60, 30) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [sign]"=&r"(sign), [coeff]"=&r"(coeff), [level]"=&r"(level) : [pout]"r"(pout), [ppin]"r"(ppin), [ppiq]"r"(ppiq), [max_level]"r"(max_level), [ppbias]"r"(ppbias), [ppzthresh]"r"(ppzthresh), [ppsharpen]"r"(ppsharpen), [ppq]"r"(ppq) : "memory", "hi", "lo" ); // moved out from macro to increase possibility for earlier breaking for (i = 15; i >= 0; i--) { if (out[i]) return 1; } return 0; } static int Quantize2Blocks_MIPS32(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; nz = QuantizeBlock_MIPS32(in + 0 * 16, out + 0 * 16, mtx) << 0; nz |= QuantizeBlock_MIPS32(in + 1 * 16, out + 1 * 16, mtx) << 1; return nz; } #undef QUANTIZE_ONE // macro for one horizontal pass in Disto4x4 (TTransform) // two calls of function TTransform are merged into single one // A - offset in bytes to load from a and b buffers // E..H - offsets in bytes to store first results to tmp buffer // E1..H1 - offsets in bytes to store second results to tmp buffer #define HORIZONTAL_PASS(A, E, F, G, H, E1, F1, G1, H1) \ "lbu %[temp0], 0+" XSTR(BPS) "*" #A "(%[a]) \n\t" \ "lbu %[temp1], 1+" XSTR(BPS) "*" #A "(%[a]) \n\t" \ "lbu %[temp2], 2+" XSTR(BPS) "*" #A "(%[a]) \n\t" \ "lbu %[temp3], 3+" XSTR(BPS) "*" #A "(%[a]) \n\t" \ "lbu %[temp4], 0+" XSTR(BPS) "*" #A "(%[b]) \n\t" \ "lbu %[temp5], 1+" XSTR(BPS) "*" #A "(%[b]) \n\t" \ "lbu %[temp6], 2+" XSTR(BPS) "*" #A "(%[b]) \n\t" \ "lbu %[temp7], 3+" XSTR(BPS) "*" #A "(%[b]) \n\t" \ "addu %[temp8], %[temp0], %[temp2] \n\t" \ "subu %[temp0], %[temp0], %[temp2] \n\t" \ "addu %[temp2], %[temp1], %[temp3] \n\t" \ "subu %[temp1], %[temp1], %[temp3] \n\t" \ "addu %[temp3], %[temp4], %[temp6] \n\t" \ "subu %[temp4], %[temp4], %[temp6] \n\t" \ "addu %[temp6], %[temp5], %[temp7] \n\t" \ "subu %[temp5], %[temp5], %[temp7] \n\t" \ "addu %[temp7], %[temp8], %[temp2] \n\t" \ "subu %[temp2], %[temp8], %[temp2] \n\t" \ "addu %[temp8], %[temp0], %[temp1] \n\t" \ "subu %[temp0], %[temp0], %[temp1] \n\t" \ "addu %[temp1], %[temp3], %[temp6] \n\t" \ "subu %[temp3], %[temp3], %[temp6] \n\t" \ "addu %[temp6], %[temp4], %[temp5] \n\t" \ "subu %[temp4], %[temp4], %[temp5] \n\t" \ "sw %[temp7], " #E "(%[tmp]) \n\t" \ "sw %[temp2], " #H "(%[tmp]) \n\t" \ "sw %[temp8], " #F "(%[tmp]) \n\t" \ "sw %[temp0], " #G "(%[tmp]) \n\t" \ "sw %[temp1], " #E1 "(%[tmp]) \n\t" \ "sw %[temp3], " #H1 "(%[tmp]) \n\t" \ "sw %[temp6], " #F1 "(%[tmp]) \n\t" \ "sw %[temp4], " #G1 "(%[tmp]) \n\t" // macro for one vertical pass in Disto4x4 (TTransform) // two calls of function TTransform are merged into single one // since only one accu is available in mips32r1 instruction set // first is done second call of function TTransform and after // that first one. // const int sum1 = TTransform(a, w); // const int sum2 = TTransform(b, w); // return abs(sum2 - sum1) >> 5; // (sum2 - sum1) is calculated with madds (sub2) and msubs (sub1) // A..D - offsets in bytes to load first results from tmp buffer // A1..D1 - offsets in bytes to load second results from tmp buffer // E..H - offsets in bytes to load from w buffer #define VERTICAL_PASS(A, B, C, D, A1, B1, C1, D1, E, F, G, H) \ "lw %[temp0], " #A1 "(%[tmp]) \n\t" \ "lw %[temp1], " #C1 "(%[tmp]) \n\t" \ "lw %[temp2], " #B1 "(%[tmp]) \n\t" \ "lw %[temp3], " #D1 "(%[tmp]) \n\t" \ "addu %[temp8], %[temp0], %[temp1] \n\t" \ "subu %[temp0], %[temp0], %[temp1] \n\t" \ "addu %[temp1], %[temp2], %[temp3] \n\t" \ "subu %[temp2], %[temp2], %[temp3] \n\t" \ "addu %[temp3], %[temp8], %[temp1] \n\t" \ "subu %[temp8], %[temp8], %[temp1] \n\t" \ "addu %[temp1], %[temp0], %[temp2] \n\t" \ "subu %[temp0], %[temp0], %[temp2] \n\t" \ "sra %[temp4], %[temp3], 31 \n\t" \ "sra %[temp5], %[temp1], 31 \n\t" \ "sra %[temp6], %[temp0], 31 \n\t" \ "sra %[temp7], %[temp8], 31 \n\t" \ "xor %[temp3], %[temp3], %[temp4] \n\t" \ "xor %[temp1], %[temp1], %[temp5] \n\t" \ "xor %[temp0], %[temp0], %[temp6] \n\t" \ "xor %[temp8], %[temp8], %[temp7] \n\t" \ "subu %[temp3], %[temp3], %[temp4] \n\t" \ "subu %[temp1], %[temp1], %[temp5] \n\t" \ "subu %[temp0], %[temp0], %[temp6] \n\t" \ "subu %[temp8], %[temp8], %[temp7] \n\t" \ "lhu %[temp4], " #E "(%[w]) \n\t" \ "lhu %[temp5], " #F "(%[w]) \n\t" \ "lhu %[temp6], " #G "(%[w]) \n\t" \ "lhu %[temp7], " #H "(%[w]) \n\t" \ "madd %[temp4], %[temp3] \n\t" \ "madd %[temp5], %[temp1] \n\t" \ "madd %[temp6], %[temp0] \n\t" \ "madd %[temp7], %[temp8] \n\t" \ "lw %[temp0], " #A "(%[tmp]) \n\t" \ "lw %[temp1], " #C "(%[tmp]) \n\t" \ "lw %[temp2], " #B "(%[tmp]) \n\t" \ "lw %[temp3], " #D "(%[tmp]) \n\t" \ "addu %[temp8], %[temp0], %[temp1] \n\t" \ "subu %[temp0], %[temp0], %[temp1] \n\t" \ "addu %[temp1], %[temp2], %[temp3] \n\t" \ "subu %[temp2], %[temp2], %[temp3] \n\t" \ "addu %[temp3], %[temp8], %[temp1] \n\t" \ "subu %[temp1], %[temp8], %[temp1] \n\t" \ "addu %[temp8], %[temp0], %[temp2] \n\t" \ "subu %[temp0], %[temp0], %[temp2] \n\t" \ "sra %[temp2], %[temp3], 31 \n\t" \ "xor %[temp3], %[temp3], %[temp2] \n\t" \ "subu %[temp3], %[temp3], %[temp2] \n\t" \ "msub %[temp4], %[temp3] \n\t" \ "sra %[temp2], %[temp8], 31 \n\t" \ "sra %[temp3], %[temp0], 31 \n\t" \ "sra %[temp4], %[temp1], 31 \n\t" \ "xor %[temp8], %[temp8], %[temp2] \n\t" \ "xor %[temp0], %[temp0], %[temp3] \n\t" \ "xor %[temp1], %[temp1], %[temp4] \n\t" \ "subu %[temp8], %[temp8], %[temp2] \n\t" \ "subu %[temp0], %[temp0], %[temp3] \n\t" \ "subu %[temp1], %[temp1], %[temp4] \n\t" \ "msub %[temp5], %[temp8] \n\t" \ "msub %[temp6], %[temp0] \n\t" \ "msub %[temp7], %[temp1] \n\t" static int Disto4x4_MIPS32(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int tmp[32]; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; __asm__ volatile( HORIZONTAL_PASS(0, 0, 4, 8, 12, 64, 68, 72, 76) HORIZONTAL_PASS(1, 16, 20, 24, 28, 80, 84, 88, 92) HORIZONTAL_PASS(2, 32, 36, 40, 44, 96, 100, 104, 108) HORIZONTAL_PASS(3, 48, 52, 56, 60, 112, 116, 120, 124) "mthi $zero \n\t" "mtlo $zero \n\t" VERTICAL_PASS( 0, 16, 32, 48, 64, 80, 96, 112, 0, 8, 16, 24) VERTICAL_PASS( 4, 20, 36, 52, 68, 84, 100, 116, 2, 10, 18, 26) VERTICAL_PASS( 8, 24, 40, 56, 72, 88, 104, 120, 4, 12, 20, 28) VERTICAL_PASS(12, 28, 44, 60, 76, 92, 108, 124, 6, 14, 22, 30) "mflo %[temp0] \n\t" "sra %[temp1], %[temp0], 31 \n\t" "xor %[temp0], %[temp0], %[temp1] \n\t" "subu %[temp0], %[temp0], %[temp1] \n\t" "sra %[temp0], %[temp0], 5 \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8) : [a]"r"(a), [b]"r"(b), [w]"r"(w), [tmp]"r"(tmp) : "memory", "hi", "lo" ); return temp0; } #undef VERTICAL_PASS #undef HORIZONTAL_PASS static int Disto16x16_MIPS32(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_MIPS32(a + x + y, b + x + y, w); } } return D; } // macro for one horizontal pass in FTransform // temp0..temp15 holds tmp[0]..tmp[15] // A - offset in bytes to load from src and ref buffers // TEMP0..TEMP3 - registers for corresponding tmp elements #define HORIZONTAL_PASS(A, TEMP0, TEMP1, TEMP2, TEMP3) \ "lw %[" #TEMP1 "], 0(%[args]) \n\t" \ "lw %[" #TEMP2 "], 4(%[args]) \n\t" \ "lbu %[temp16], 0+" XSTR(BPS) "*" #A "(%[" #TEMP1 "]) \n\t" \ "lbu %[temp17], 0+" XSTR(BPS) "*" #A "(%[" #TEMP2 "]) \n\t" \ "lbu %[temp18], 1+" XSTR(BPS) "*" #A "(%[" #TEMP1 "]) \n\t" \ "lbu %[temp19], 1+" XSTR(BPS) "*" #A "(%[" #TEMP2 "]) \n\t" \ "subu %[temp20], %[temp16], %[temp17] \n\t" \ "lbu %[temp16], 2+" XSTR(BPS) "*" #A "(%[" #TEMP1 "]) \n\t" \ "lbu %[temp17], 2+" XSTR(BPS) "*" #A "(%[" #TEMP2 "]) \n\t" \ "subu %[" #TEMP0 "], %[temp18], %[temp19] \n\t" \ "lbu %[temp18], 3+" XSTR(BPS) "*" #A "(%[" #TEMP1 "]) \n\t" \ "lbu %[temp19], 3+" XSTR(BPS) "*" #A "(%[" #TEMP2 "]) \n\t" \ "subu %[" #TEMP1 "], %[temp16], %[temp17] \n\t" \ "subu %[" #TEMP2 "], %[temp18], %[temp19] \n\t" \ "addu %[" #TEMP3 "], %[temp20], %[" #TEMP2 "] \n\t" \ "subu %[" #TEMP2 "], %[temp20], %[" #TEMP2 "] \n\t" \ "addu %[temp20], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \ "subu %[" #TEMP0 "], %[" #TEMP0 "], %[" #TEMP1 "] \n\t" \ "mul %[temp16], %[" #TEMP2 "], %[c5352] \n\t" \ "mul %[temp17], %[" #TEMP2 "], %[c2217] \n\t" \ "mul %[temp18], %[" #TEMP0 "], %[c5352] \n\t" \ "mul %[temp19], %[" #TEMP0 "], %[c2217] \n\t" \ "addu %[" #TEMP1 "], %[" #TEMP3 "], %[temp20] \n\t" \ "subu %[temp20], %[" #TEMP3 "], %[temp20] \n\t" \ "sll %[" #TEMP0 "], %[" #TEMP1 "], 3 \n\t" \ "sll %[" #TEMP2 "], %[temp20], 3 \n\t" \ "addiu %[temp16], %[temp16], 1812 \n\t" \ "addiu %[temp17], %[temp17], 937 \n\t" \ "addu %[temp16], %[temp16], %[temp19] \n\t" \ "subu %[temp17], %[temp17], %[temp18] \n\t" \ "sra %[" #TEMP1 "], %[temp16], 9 \n\t" \ "sra %[" #TEMP3 "], %[temp17], 9 \n\t" // macro for one vertical pass in FTransform // temp0..temp15 holds tmp[0]..tmp[15] // A..D - offsets in bytes to store to out buffer // TEMP0, TEMP4, TEMP8 and TEMP12 - registers for corresponding tmp elements #define VERTICAL_PASS(A, B, C, D, TEMP0, TEMP4, TEMP8, TEMP12) \ "addu %[temp16], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \ "subu %[temp19], %[" #TEMP0 "], %[" #TEMP12 "] \n\t" \ "addu %[temp17], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \ "subu %[temp18], %[" #TEMP4 "], %[" #TEMP8 "] \n\t" \ "mul %[" #TEMP8 "], %[temp19], %[c2217] \n\t" \ "mul %[" #TEMP12 "], %[temp18], %[c2217] \n\t" \ "mul %[" #TEMP4 "], %[temp19], %[c5352] \n\t" \ "mul %[temp18], %[temp18], %[c5352] \n\t" \ "addiu %[temp16], %[temp16], 7 \n\t" \ "addu %[" #TEMP0 "], %[temp16], %[temp17] \n\t" \ "sra %[" #TEMP0 "], %[" #TEMP0 "], 4 \n\t" \ "addu %[" #TEMP12 "], %[" #TEMP12 "], %[" #TEMP4 "] \n\t" \ "subu %[" #TEMP4 "], %[temp16], %[temp17] \n\t" \ "sra %[" #TEMP4 "], %[" #TEMP4 "], 4 \n\t" \ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 30000 \n\t" \ "addiu %[" #TEMP12 "], %[" #TEMP12 "], 12000 \n\t" \ "addiu %[" #TEMP8 "], %[" #TEMP8 "], 21000 \n\t" \ "subu %[" #TEMP8 "], %[" #TEMP8 "], %[temp18] \n\t" \ "sra %[" #TEMP12 "], %[" #TEMP12 "], 16 \n\t" \ "sra %[" #TEMP8 "], %[" #TEMP8 "], 16 \n\t" \ "addiu %[temp16], %[" #TEMP12 "], 1 \n\t" \ "movn %[" #TEMP12 "], %[temp16], %[temp19] \n\t" \ "sh %[" #TEMP0 "], " #A "(%[temp20]) \n\t" \ "sh %[" #TEMP4 "], " #C "(%[temp20]) \n\t" \ "sh %[" #TEMP8 "], " #D "(%[temp20]) \n\t" \ "sh %[" #TEMP12 "], " #B "(%[temp20]) \n\t" static void FTransform_MIPS32(const uint8_t* src, const uint8_t* ref, int16_t* out) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8; int temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16; int temp17, temp18, temp19, temp20; const int c2217 = 2217; const int c5352 = 5352; const int* const args[3] = { (const int*)src, (const int*)ref, (const int*)out }; __asm__ volatile( HORIZONTAL_PASS(0, temp0, temp1, temp2, temp3) HORIZONTAL_PASS(1, temp4, temp5, temp6, temp7) HORIZONTAL_PASS(2, temp8, temp9, temp10, temp11) HORIZONTAL_PASS(3, temp12, temp13, temp14, temp15) "lw %[temp20], 8(%[args]) \n\t" VERTICAL_PASS(0, 8, 16, 24, temp0, temp4, temp8, temp12) VERTICAL_PASS(2, 10, 18, 26, temp1, temp5, temp9, temp13) VERTICAL_PASS(4, 12, 20, 28, temp2, temp6, temp10, temp14) VERTICAL_PASS(6, 14, 22, 30, temp3, temp7, temp11, temp15) : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11), [temp12]"=&r"(temp12), [temp13]"=&r"(temp13), [temp14]"=&r"(temp14), [temp15]"=&r"(temp15), [temp16]"=&r"(temp16), [temp17]"=&r"(temp17), [temp18]"=&r"(temp18), [temp19]"=&r"(temp19), [temp20]"=&r"(temp20) : [args]"r"(args), [c2217]"r"(c2217), [c5352]"r"(c5352) : "memory", "hi", "lo" ); } #undef VERTICAL_PASS #undef HORIZONTAL_PASS #if !defined(WORK_AROUND_GCC) #define GET_SSE_INNER(A, B, C, D) \ "lbu %[temp0], " #A "(%[a]) \n\t" \ "lbu %[temp1], " #A "(%[b]) \n\t" \ "lbu %[temp2], " #B "(%[a]) \n\t" \ "lbu %[temp3], " #B "(%[b]) \n\t" \ "lbu %[temp4], " #C "(%[a]) \n\t" \ "lbu %[temp5], " #C "(%[b]) \n\t" \ "lbu %[temp6], " #D "(%[a]) \n\t" \ "lbu %[temp7], " #D "(%[b]) \n\t" \ "subu %[temp0], %[temp0], %[temp1] \n\t" \ "subu %[temp2], %[temp2], %[temp3] \n\t" \ "subu %[temp4], %[temp4], %[temp5] \n\t" \ "subu %[temp6], %[temp6], %[temp7] \n\t" \ "madd %[temp0], %[temp0] \n\t" \ "madd %[temp2], %[temp2] \n\t" \ "madd %[temp4], %[temp4] \n\t" \ "madd %[temp6], %[temp6] \n\t" #define GET_SSE(A, B, C, D) \ GET_SSE_INNER(A, A + 1, A + 2, A + 3) \ GET_SSE_INNER(B, B + 1, B + 2, B + 3) \ GET_SSE_INNER(C, C + 1, C + 2, C + 3) \ GET_SSE_INNER(D, D + 1, D + 2, D + 3) static int SSE16x16_MIPS32(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; __asm__ volatile( "mult $zero, $zero \n\t" GET_SSE( 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS) GET_SSE( 1 * BPS, 4 + 1 * BPS, 8 + 1 * BPS, 12 + 1 * BPS) GET_SSE( 2 * BPS, 4 + 2 * BPS, 8 + 2 * BPS, 12 + 2 * BPS) GET_SSE( 3 * BPS, 4 + 3 * BPS, 8 + 3 * BPS, 12 + 3 * BPS) GET_SSE( 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS) GET_SSE( 5 * BPS, 4 + 5 * BPS, 8 + 5 * BPS, 12 + 5 * BPS) GET_SSE( 6 * BPS, 4 + 6 * BPS, 8 + 6 * BPS, 12 + 6 * BPS) GET_SSE( 7 * BPS, 4 + 7 * BPS, 8 + 7 * BPS, 12 + 7 * BPS) GET_SSE( 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS) GET_SSE( 9 * BPS, 4 + 9 * BPS, 8 + 9 * BPS, 12 + 9 * BPS) GET_SSE(10 * BPS, 4 + 10 * BPS, 8 + 10 * BPS, 12 + 10 * BPS) GET_SSE(11 * BPS, 4 + 11 * BPS, 8 + 11 * BPS, 12 + 11 * BPS) GET_SSE(12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS) GET_SSE(13 * BPS, 4 + 13 * BPS, 8 + 13 * BPS, 12 + 13 * BPS) GET_SSE(14 * BPS, 4 + 14 * BPS, 8 + 14 * BPS, 12 + 14 * BPS) GET_SSE(15 * BPS, 4 + 15 * BPS, 8 + 15 * BPS, 12 + 15 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE16x8_MIPS32(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; __asm__ volatile( "mult $zero, $zero \n\t" GET_SSE( 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS) GET_SSE( 1 * BPS, 4 + 1 * BPS, 8 + 1 * BPS, 12 + 1 * BPS) GET_SSE( 2 * BPS, 4 + 2 * BPS, 8 + 2 * BPS, 12 + 2 * BPS) GET_SSE( 3 * BPS, 4 + 3 * BPS, 8 + 3 * BPS, 12 + 3 * BPS) GET_SSE( 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS) GET_SSE( 5 * BPS, 4 + 5 * BPS, 8 + 5 * BPS, 12 + 5 * BPS) GET_SSE( 6 * BPS, 4 + 6 * BPS, 8 + 6 * BPS, 12 + 6 * BPS) GET_SSE( 7 * BPS, 4 + 7 * BPS, 8 + 7 * BPS, 12 + 7 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE8x8_MIPS32(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; __asm__ volatile( "mult $zero, $zero \n\t" GET_SSE(0 * BPS, 4 + 0 * BPS, 1 * BPS, 4 + 1 * BPS) GET_SSE(2 * BPS, 4 + 2 * BPS, 3 * BPS, 4 + 3 * BPS) GET_SSE(4 * BPS, 4 + 4 * BPS, 5 * BPS, 4 + 5 * BPS) GET_SSE(6 * BPS, 4 + 6 * BPS, 7 * BPS, 4 + 7 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } static int SSE4x4_MIPS32(const uint8_t* a, const uint8_t* b) { int count; int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; __asm__ volatile( "mult $zero, $zero \n\t" GET_SSE(0 * BPS, 1 * BPS, 2 * BPS, 3 * BPS) "mflo %[count] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [count]"=&r"(count) : [a]"r"(a), [b]"r"(b) : "memory", "hi", "lo" ); return count; } #undef GET_SSE #undef GET_SSE_INNER #endif // !WORK_AROUND_GCC //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitMIPS32(void) { VP8ITransform = ITransform_MIPS32; VP8FTransform = FTransform_MIPS32; VP8EncQuantizeBlock = QuantizeBlock_MIPS32; VP8EncQuantize2Blocks = Quantize2Blocks_MIPS32; VP8TDisto4x4 = Disto4x4_MIPS32; VP8TDisto16x16 = Disto16x16_MIPS32; #if !defined(WORK_AROUND_GCC) VP8SSE16x16 = SSE16x16_MIPS32; VP8SSE8x8 = SSE8x8_MIPS32; VP8SSE16x8 = SSE16x8_MIPS32; VP8SSE4x4 = SSE4x4_MIPS32; #endif } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(VP8EncDspInitMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/common_sse2.h0000644000014400001440000001755014606317060014035 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 code common to several files. // // Author: Vincent Rabaud (vrabaud@google.com) #ifndef WEBP_DSP_COMMON_SSE2_H_ #define WEBP_DSP_COMMON_SSE2_H_ #ifdef __cplusplus extern "C" { #endif #if defined(WEBP_USE_SSE2) #include //------------------------------------------------------------------------------ // Quite useful macro for debugging. Left here for convenience. #if 0 #include static WEBP_INLINE void PrintReg(const __m128i r, const char* const name, int size) { int n; union { __m128i r; uint8_t i8[16]; uint16_t i16[8]; uint32_t i32[4]; uint64_t i64[2]; } tmp; tmp.r = r; fprintf(stderr, "%s\t: ", name); if (size == 8) { for (n = 0; n < 16; ++n) fprintf(stderr, "%.2x ", tmp.i8[n]); } else if (size == 16) { for (n = 0; n < 8; ++n) fprintf(stderr, "%.4x ", tmp.i16[n]); } else if (size == 32) { for (n = 0; n < 4; ++n) fprintf(stderr, "%.8x ", tmp.i32[n]); } else { for (n = 0; n < 2; ++n) fprintf(stderr, "%.16lx ", tmp.i64[n]); } fprintf(stderr, "\n"); } #endif //------------------------------------------------------------------------------ // Math functions. // Return the sum of all the 8b in the register. static WEBP_INLINE int VP8HorizontalAdd8b(const __m128i* const a) { const __m128i zero = _mm_setzero_si128(); const __m128i sad8x2 = _mm_sad_epu8(*a, zero); // sum the two sads: sad8x2[0:1] + sad8x2[8:9] const __m128i sum = _mm_add_epi32(sad8x2, _mm_shuffle_epi32(sad8x2, 2)); return _mm_cvtsi128_si32(sum); } // Transpose two 4x4 16b matrices horizontally stored in registers. static WEBP_INLINE void VP8Transpose_2_4x4_16b( const __m128i* const in0, const __m128i* const in1, const __m128i* const in2, const __m128i* const in3, __m128i* const out0, __m128i* const out1, __m128i* const out2, __m128i* const out3) { // Transpose the two 4x4. // a00 a01 a02 a03 b00 b01 b02 b03 // a10 a11 a12 a13 b10 b11 b12 b13 // a20 a21 a22 a23 b20 b21 b22 b23 // a30 a31 a32 a33 b30 b31 b32 b33 const __m128i transpose0_0 = _mm_unpacklo_epi16(*in0, *in1); const __m128i transpose0_1 = _mm_unpacklo_epi16(*in2, *in3); const __m128i transpose0_2 = _mm_unpackhi_epi16(*in0, *in1); const __m128i transpose0_3 = _mm_unpackhi_epi16(*in2, *in3); // a00 a10 a01 a11 a02 a12 a03 a13 // a20 a30 a21 a31 a22 a32 a23 a33 // b00 b10 b01 b11 b02 b12 b03 b13 // b20 b30 b21 b31 b22 b32 b23 b33 const __m128i transpose1_0 = _mm_unpacklo_epi32(transpose0_0, transpose0_1); const __m128i transpose1_1 = _mm_unpacklo_epi32(transpose0_2, transpose0_3); const __m128i transpose1_2 = _mm_unpackhi_epi32(transpose0_0, transpose0_1); const __m128i transpose1_3 = _mm_unpackhi_epi32(transpose0_2, transpose0_3); // a00 a10 a20 a30 a01 a11 a21 a31 // b00 b10 b20 b30 b01 b11 b21 b31 // a02 a12 a22 a32 a03 a13 a23 a33 // b02 b12 a22 b32 b03 b13 b23 b33 *out0 = _mm_unpacklo_epi64(transpose1_0, transpose1_1); *out1 = _mm_unpackhi_epi64(transpose1_0, transpose1_1); *out2 = _mm_unpacklo_epi64(transpose1_2, transpose1_3); *out3 = _mm_unpackhi_epi64(transpose1_2, transpose1_3); // a00 a10 a20 a30 b00 b10 b20 b30 // a01 a11 a21 a31 b01 b11 b21 b31 // a02 a12 a22 a32 b02 b12 b22 b32 // a03 a13 a23 a33 b03 b13 b23 b33 } //------------------------------------------------------------------------------ // Channel mixing. // Function used several times in VP8PlanarTo24b. // It samples the in buffer as follows: one every two unsigned char is stored // at the beginning of the buffer, while the other half is stored at the end. #define VP8PlanarTo24bHelper(IN, OUT) \ do { \ const __m128i v_mask = _mm_set1_epi16(0x00ff); \ /* Take one every two upper 8b values.*/ \ (OUT##0) = _mm_packus_epi16(_mm_and_si128((IN##0), v_mask), \ _mm_and_si128((IN##1), v_mask)); \ (OUT##1) = _mm_packus_epi16(_mm_and_si128((IN##2), v_mask), \ _mm_and_si128((IN##3), v_mask)); \ (OUT##2) = _mm_packus_epi16(_mm_and_si128((IN##4), v_mask), \ _mm_and_si128((IN##5), v_mask)); \ /* Take one every two lower 8b values.*/ \ (OUT##3) = _mm_packus_epi16(_mm_srli_epi16((IN##0), 8), \ _mm_srli_epi16((IN##1), 8)); \ (OUT##4) = _mm_packus_epi16(_mm_srli_epi16((IN##2), 8), \ _mm_srli_epi16((IN##3), 8)); \ (OUT##5) = _mm_packus_epi16(_mm_srli_epi16((IN##4), 8), \ _mm_srli_epi16((IN##5), 8)); \ } while (0) // Pack the planar buffers // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // triplet by triplet in the output buffer rgb as rgbrgbrgbrgb ... static WEBP_INLINE void VP8PlanarTo24b_SSE2( __m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3, __m128i* const in4, __m128i* const in5) { // The input is 6 registers of sixteen 8b but for the sake of explanation, // let's take 6 registers of four 8b values. // To pack, we will keep taking one every two 8b integer and move it // around as follows: // Input: // r0r1r2r3 | r4r5r6r7 | g0g1g2g3 | g4g5g6g7 | b0b1b2b3 | b4b5b6b7 // Split the 6 registers in two sets of 3 registers: the first set as the even // 8b bytes, the second the odd ones: // r0r2r4r6 | g0g2g4g6 | b0b2b4b6 | r1r3r5r7 | g1g3g5g7 | b1b3b5b7 // Repeat the same permutations twice more: // r0r4g0g4 | b0b4r1r5 | g1g5b1b5 | r2r6g2g6 | b2b6r3r7 | g3g7b3b7 // r0g0b0r1 | g1b1r2g2 | b2r3g3b3 | r4g4b4r5 | g5b5r6g6 | b6r7g7b7 __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; VP8PlanarTo24bHelper(*in, tmp); VP8PlanarTo24bHelper(tmp, *in); VP8PlanarTo24bHelper(*in, tmp); // We need to do it two more times than the example as we have sixteen bytes. { __m128i out0, out1, out2, out3, out4, out5; VP8PlanarTo24bHelper(tmp, out); VP8PlanarTo24bHelper(out, *in); } } #undef VP8PlanarTo24bHelper // Convert four packed four-channel buffers like argbargbargbargb... into the // split channels aaaaa ... rrrr ... gggg .... bbbbb ...... static WEBP_INLINE void VP8L32bToPlanar_SSE2(__m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3) { // Column-wise transpose. const __m128i A0 = _mm_unpacklo_epi8(*in0, *in1); const __m128i A1 = _mm_unpackhi_epi8(*in0, *in1); const __m128i A2 = _mm_unpacklo_epi8(*in2, *in3); const __m128i A3 = _mm_unpackhi_epi8(*in2, *in3); const __m128i B0 = _mm_unpacklo_epi8(A0, A1); const __m128i B1 = _mm_unpackhi_epi8(A0, A1); const __m128i B2 = _mm_unpacklo_epi8(A2, A3); const __m128i B3 = _mm_unpackhi_epi8(A2, A3); // C0 = g7 g6 ... g1 g0 | b7 b6 ... b1 b0 // C1 = a7 a6 ... a1 a0 | r7 r6 ... r1 r0 const __m128i C0 = _mm_unpacklo_epi8(B0, B1); const __m128i C1 = _mm_unpackhi_epi8(B0, B1); const __m128i C2 = _mm_unpacklo_epi8(B2, B3); const __m128i C3 = _mm_unpackhi_epi8(B2, B3); // Gather the channels. *in0 = _mm_unpackhi_epi64(C1, C3); *in1 = _mm_unpacklo_epi64(C1, C3); *in2 = _mm_unpackhi_epi64(C0, C2); *in3 = _mm_unpacklo_epi64(C0, C2); } #endif // WEBP_USE_SSE2 #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_COMMON_SSE2_H_ libwebp-1.4.0/src/dsp/lossless_enc_mips32.c0000644000014400001440000003452014606317060015471 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of lossless functions // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #if defined(WEBP_USE_MIPS32) #include #include #include #include static float FastSLog2Slow_MIPS32(uint32_t v) { assert(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_WITH_CORRECTION_MAX) { uint32_t log_cnt, y, correction; const int c24 = 24; const float v_f = (float)v; uint32_t temp; // Xf = 256 = 2^8 // log_cnt is index of leading one in upper 24 bits __asm__ volatile( "clz %[log_cnt], %[v] \n\t" "addiu %[y], $zero, 1 \n\t" "subu %[log_cnt], %[c24], %[log_cnt] \n\t" "sllv %[y], %[y], %[log_cnt] \n\t" "srlv %[temp], %[v], %[log_cnt] \n\t" : [log_cnt]"=&r"(log_cnt), [y]"=&r"(y), [temp]"=r"(temp) : [c24]"r"(c24), [v]"r"(v) ); // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256 // Xf = floor(Xf) * (1 + (v % y) / v) // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v) // The correction factor: log(1 + d) ~ d; for very small d values, so // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v // LOG_2_RECIPROCAL ~ 23/16 // (v % y) = (v % 2^log_cnt) = v & (2^log_cnt - 1) correction = (23 * (v & (y - 1))) >> 4; return v_f * (kLog2Table[temp] + log_cnt) + correction; } else { return (float)(LOG_2_RECIPROCAL * v * log((double)v)); } } static float FastLog2Slow_MIPS32(uint32_t v) { assert(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_WITH_CORRECTION_MAX) { uint32_t log_cnt, y; const int c24 = 24; double log_2; uint32_t temp; __asm__ volatile( "clz %[log_cnt], %[v] \n\t" "addiu %[y], $zero, 1 \n\t" "subu %[log_cnt], %[c24], %[log_cnt] \n\t" "sllv %[y], %[y], %[log_cnt] \n\t" "srlv %[temp], %[v], %[log_cnt] \n\t" : [log_cnt]"=&r"(log_cnt), [y]"=&r"(y), [temp]"=r"(temp) : [c24]"r"(c24), [v]"r"(v) ); log_2 = kLog2Table[temp] + log_cnt; if (v >= APPROX_LOG_MAX) { // Since the division is still expensive, add this correction factor only // for large values of 'v'. const uint32_t correction = (23 * (v & (y - 1))) >> 4; log_2 += (double)correction / v; } return (float)log_2; } else { return (float)(LOG_2_RECIPROCAL * log((double)v)); } } // C version of this function: // int i = 0; // int64_t cost = 0; // const uint32_t* pop = &population[4]; // const uint32_t* LoopEnd = &population[length]; // while (pop != LoopEnd) { // ++i; // cost += i * *pop; // cost += i * *(pop + 1); // pop += 2; // } // return cost; static uint32_t ExtraCost_MIPS32(const uint32_t* const population, int length) { int i, temp0, temp1; const uint32_t* pop = &population[4]; const uint32_t* const LoopEnd = &population[length]; __asm__ volatile( "mult $zero, $zero \n\t" "xor %[i], %[i], %[i] \n\t" "beq %[pop], %[LoopEnd], 2f \n\t" "1: \n\t" "lw %[temp0], 0(%[pop]) \n\t" "lw %[temp1], 4(%[pop]) \n\t" "addiu %[i], %[i], 1 \n\t" "addiu %[pop], %[pop], 8 \n\t" "madd %[i], %[temp0] \n\t" "madd %[i], %[temp1] \n\t" "bne %[pop], %[LoopEnd], 1b \n\t" "2: \n\t" "mfhi %[temp0] \n\t" "mflo %[temp1] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [i]"=&r"(i), [pop]"+r"(pop) : [LoopEnd]"r"(LoopEnd) : "memory", "hi", "lo" ); return ((int64_t)temp0 << 32 | temp1); } // C version of this function: // int i = 0; // int64_t cost = 0; // const uint32_t* pX = &X[4]; // const uint32_t* pY = &Y[4]; // const uint32_t* LoopEnd = &X[length]; // while (pX != LoopEnd) { // const uint32_t xy0 = *pX + *pY; // const uint32_t xy1 = *(pX + 1) + *(pY + 1); // ++i; // cost += i * xy0; // cost += i * xy1; // pX += 2; // pY += 2; // } // return cost; static uint32_t ExtraCostCombined_MIPS32(const uint32_t* const X, const uint32_t* const Y, int length) { int i, temp0, temp1, temp2, temp3; const uint32_t* pX = &X[4]; const uint32_t* pY = &Y[4]; const uint32_t* const LoopEnd = &X[length]; __asm__ volatile( "mult $zero, $zero \n\t" "xor %[i], %[i], %[i] \n\t" "beq %[pX], %[LoopEnd], 2f \n\t" "1: \n\t" "lw %[temp0], 0(%[pX]) \n\t" "lw %[temp1], 0(%[pY]) \n\t" "lw %[temp2], 4(%[pX]) \n\t" "lw %[temp3], 4(%[pY]) \n\t" "addiu %[i], %[i], 1 \n\t" "addu %[temp0], %[temp0], %[temp1] \n\t" "addu %[temp2], %[temp2], %[temp3] \n\t" "addiu %[pX], %[pX], 8 \n\t" "addiu %[pY], %[pY], 8 \n\t" "madd %[i], %[temp0] \n\t" "madd %[i], %[temp2] \n\t" "bne %[pX], %[LoopEnd], 1b \n\t" "2: \n\t" "mfhi %[temp0] \n\t" "mflo %[temp1] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [i]"=&r"(i), [pX]"+r"(pX), [pY]"+r"(pY) : [LoopEnd]"r"(LoopEnd) : "memory", "hi", "lo" ); return ((int64_t)temp0 << 32 | temp1); } #define HUFFMAN_COST_PASS \ __asm__ volatile( \ "sll %[temp1], %[temp0], 3 \n\t" \ "addiu %[temp3], %[streak], -3 \n\t" \ "addu %[temp2], %[pstreaks], %[temp1] \n\t" \ "blez %[temp3], 1f \n\t" \ "srl %[temp1], %[temp1], 1 \n\t" \ "addu %[temp3], %[pcnts], %[temp1] \n\t" \ "lw %[temp0], 4(%[temp2]) \n\t" \ "lw %[temp1], 0(%[temp3]) \n\t" \ "addu %[temp0], %[temp0], %[streak] \n\t" \ "addiu %[temp1], %[temp1], 1 \n\t" \ "sw %[temp0], 4(%[temp2]) \n\t" \ "sw %[temp1], 0(%[temp3]) \n\t" \ "b 2f \n\t" \ "1: \n\t" \ "lw %[temp0], 0(%[temp2]) \n\t" \ "addu %[temp0], %[temp0], %[streak] \n\t" \ "sw %[temp0], 0(%[temp2]) \n\t" \ "2: \n\t" \ : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \ [temp3]"=&r"(temp3), [temp0]"+r"(temp0) \ : [pstreaks]"r"(pstreaks), [pcnts]"r"(pcnts), \ [streak]"r"(streak) \ : "memory" \ ); // Returns the various RLE counts static WEBP_INLINE void GetEntropyUnrefinedHelper( uint32_t val, int i, uint32_t* const val_prev, int* const i_prev, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) { int* const pstreaks = &stats->streaks[0][0]; int* const pcnts = &stats->counts[0]; int temp0, temp1, temp2, temp3; const int streak = i - *i_prev; // Gather info for the bit entropy. if (*val_prev != 0) { bit_entropy->sum += (*val_prev) * streak; bit_entropy->nonzeros += streak; bit_entropy->nonzero_code = *i_prev; bit_entropy->entropy -= VP8LFastSLog2(*val_prev) * streak; if (bit_entropy->max_val < *val_prev) { bit_entropy->max_val = *val_prev; } } // Gather info for the Huffman cost. temp0 = (*val_prev != 0); HUFFMAN_COST_PASS *val_prev = val; *i_prev = i; } static void GetEntropyUnrefined_MIPS32(const uint32_t X[], int length, VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) { int i; int i_prev = 0; uint32_t x_prev = X[0]; memset(stats, 0, sizeof(*stats)); VP8LBitEntropyInit(bit_entropy); for (i = 1; i < length; ++i) { const uint32_t x = X[i]; if (x != x_prev) { GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats); } } GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats); bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum); } static void GetCombinedEntropyUnrefined_MIPS32(const uint32_t X[], const uint32_t Y[], int length, VP8LBitEntropy* const entropy, VP8LStreaks* const stats) { int i = 1; int i_prev = 0; uint32_t xy_prev = X[0] + Y[0]; memset(stats, 0, sizeof(*stats)); VP8LBitEntropyInit(entropy); for (i = 1; i < length; ++i) { const uint32_t xy = X[i] + Y[i]; if (xy != xy_prev) { GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, entropy, stats); } } GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, entropy, stats); entropy->entropy += VP8LFastSLog2(entropy->sum); } #define ASM_START \ __asm__ volatile( \ ".set push \n\t" \ ".set at \n\t" \ ".set macro \n\t" \ "1: \n\t" // P2 = P0 + P1 // A..D - offsets // E - temp variable to tell macro // if pointer should be incremented // literal_ and successive histograms could be unaligned // so we must use ulw and usw #define ADD_TO_OUT(A, B, C, D, E, P0, P1, P2) \ "ulw %[temp0], " #A "(%[" #P0 "]) \n\t" \ "ulw %[temp1], " #B "(%[" #P0 "]) \n\t" \ "ulw %[temp2], " #C "(%[" #P0 "]) \n\t" \ "ulw %[temp3], " #D "(%[" #P0 "]) \n\t" \ "ulw %[temp4], " #A "(%[" #P1 "]) \n\t" \ "ulw %[temp5], " #B "(%[" #P1 "]) \n\t" \ "ulw %[temp6], " #C "(%[" #P1 "]) \n\t" \ "ulw %[temp7], " #D "(%[" #P1 "]) \n\t" \ "addu %[temp4], %[temp4], %[temp0] \n\t" \ "addu %[temp5], %[temp5], %[temp1] \n\t" \ "addu %[temp6], %[temp6], %[temp2] \n\t" \ "addu %[temp7], %[temp7], %[temp3] \n\t" \ "addiu %[" #P0 "], %[" #P0 "], 16 \n\t" \ ".if " #E " == 1 \n\t" \ "addiu %[" #P1 "], %[" #P1 "], 16 \n\t" \ ".endif \n\t" \ "usw %[temp4], " #A "(%[" #P2 "]) \n\t" \ "usw %[temp5], " #B "(%[" #P2 "]) \n\t" \ "usw %[temp6], " #C "(%[" #P2 "]) \n\t" \ "usw %[temp7], " #D "(%[" #P2 "]) \n\t" \ "addiu %[" #P2 "], %[" #P2 "], 16 \n\t" \ "bne %[" #P0 "], %[LoopEnd], 1b \n\t" \ ".set pop \n\t" \ #define ASM_END_COMMON_0 \ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), \ [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), \ [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), \ [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), \ [pa]"+r"(pa), [pout]"+r"(pout) #define ASM_END_COMMON_1 \ : [LoopEnd]"r"(LoopEnd) \ : "memory", "at" \ ); #define ASM_END_0 \ ASM_END_COMMON_0 \ , [pb]"+r"(pb) \ ASM_END_COMMON_1 #define ASM_END_1 \ ASM_END_COMMON_0 \ ASM_END_COMMON_1 static void AddVector_MIPS32(const uint32_t* pa, const uint32_t* pb, uint32_t* pout, int size) { uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; const int end = ((size) / 4) * 4; const uint32_t* const LoopEnd = pa + end; int i; ASM_START ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout) ASM_END_0 for (i = 0; i < size - end; ++i) pout[i] = pa[i] + pb[i]; } static void AddVectorEq_MIPS32(const uint32_t* pa, uint32_t* pout, int size) { uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; const int end = ((size) / 4) * 4; const uint32_t* const LoopEnd = pa + end; int i; ASM_START ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout) ASM_END_1 for (i = 0; i < size - end; ++i) pout[i] += pa[i]; } #undef ASM_END_1 #undef ASM_END_0 #undef ASM_END_COMMON_1 #undef ASM_END_COMMON_0 #undef ADD_TO_OUT #undef ASM_START //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitMIPS32(void) { VP8LFastSLog2Slow = FastSLog2Slow_MIPS32; VP8LFastLog2Slow = FastLog2Slow_MIPS32; VP8LExtraCost = ExtraCost_MIPS32; VP8LExtraCostCombined = ExtraCostCombined_MIPS32; VP8LGetEntropyUnrefined = GetEntropyUnrefined_MIPS32; VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_MIPS32; VP8LAddVector = AddVector_MIPS32; VP8LAddVectorEq = AddVectorEq_MIPS32; } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(VP8LEncDspInitMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/dec_neon.c0000644000014400001440000020701614606317060013354 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // ARM NEON version of dsp functions and loop filtering. // // Authors: Somnath Banerjee (somnath@google.com) // Johann Koenig (johannkoenig@google.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include "src/dsp/neon.h" #include "src/dec/vp8i_dec.h" //------------------------------------------------------------------------------ // NxM Loading functions #if !defined(WORK_AROUND_GCC) // This intrinsics version makes gcc-4.6.3 crash during Load4x??() compilation // (register alloc, probably). The variants somewhat mitigate the problem, but // not quite. HFilter16i() remains problematic. static WEBP_INLINE uint8x8x4_t Load4x8_NEON(const uint8_t* const src, int stride) { const uint8x8_t zero = vdup_n_u8(0); uint8x8x4_t out; INIT_VECTOR4(out, zero, zero, zero, zero); out = vld4_lane_u8(src + 0 * stride, out, 0); out = vld4_lane_u8(src + 1 * stride, out, 1); out = vld4_lane_u8(src + 2 * stride, out, 2); out = vld4_lane_u8(src + 3 * stride, out, 3); out = vld4_lane_u8(src + 4 * stride, out, 4); out = vld4_lane_u8(src + 5 * stride, out, 5); out = vld4_lane_u8(src + 6 * stride, out, 6); out = vld4_lane_u8(src + 7 * stride, out, 7); return out; } static WEBP_INLINE void Load4x16_NEON(const uint8_t* const src, int stride, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1) { // row0 = p1[0..7]|p0[0..7]|q0[0..7]|q1[0..7] // row8 = p1[8..15]|p0[8..15]|q0[8..15]|q1[8..15] const uint8x8x4_t row0 = Load4x8_NEON(src - 2 + 0 * stride, stride); const uint8x8x4_t row8 = Load4x8_NEON(src - 2 + 8 * stride, stride); *p1 = vcombine_u8(row0.val[0], row8.val[0]); *p0 = vcombine_u8(row0.val[1], row8.val[1]); *q0 = vcombine_u8(row0.val[2], row8.val[2]); *q1 = vcombine_u8(row0.val[3], row8.val[3]); } #else // WORK_AROUND_GCC #define LOADQ_LANE_32b(VALUE, LANE) do { \ (VALUE) = vld1q_lane_u32((const uint32_t*)src, (VALUE), (LANE)); \ src += stride; \ } while (0) static WEBP_INLINE void Load4x16_NEON(const uint8_t* src, int stride, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1) { const uint32x4_t zero = vdupq_n_u32(0); uint32x4x4_t in; INIT_VECTOR4(in, zero, zero, zero, zero); src -= 2; LOADQ_LANE_32b(in.val[0], 0); LOADQ_LANE_32b(in.val[1], 0); LOADQ_LANE_32b(in.val[2], 0); LOADQ_LANE_32b(in.val[3], 0); LOADQ_LANE_32b(in.val[0], 1); LOADQ_LANE_32b(in.val[1], 1); LOADQ_LANE_32b(in.val[2], 1); LOADQ_LANE_32b(in.val[3], 1); LOADQ_LANE_32b(in.val[0], 2); LOADQ_LANE_32b(in.val[1], 2); LOADQ_LANE_32b(in.val[2], 2); LOADQ_LANE_32b(in.val[3], 2); LOADQ_LANE_32b(in.val[0], 3); LOADQ_LANE_32b(in.val[1], 3); LOADQ_LANE_32b(in.val[2], 3); LOADQ_LANE_32b(in.val[3], 3); // Transpose four 4x4 parts: { const uint8x16x2_t row01 = vtrnq_u8(vreinterpretq_u8_u32(in.val[0]), vreinterpretq_u8_u32(in.val[1])); const uint8x16x2_t row23 = vtrnq_u8(vreinterpretq_u8_u32(in.val[2]), vreinterpretq_u8_u32(in.val[3])); const uint16x8x2_t row02 = vtrnq_u16(vreinterpretq_u16_u8(row01.val[0]), vreinterpretq_u16_u8(row23.val[0])); const uint16x8x2_t row13 = vtrnq_u16(vreinterpretq_u16_u8(row01.val[1]), vreinterpretq_u16_u8(row23.val[1])); *p1 = vreinterpretq_u8_u16(row02.val[0]); *p0 = vreinterpretq_u8_u16(row13.val[0]); *q0 = vreinterpretq_u8_u16(row02.val[1]); *q1 = vreinterpretq_u8_u16(row13.val[1]); } } #undef LOADQ_LANE_32b #endif // !WORK_AROUND_GCC static WEBP_INLINE void Load8x16_NEON( const uint8_t* const src, int stride, uint8x16_t* const p3, uint8x16_t* const p2, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1, uint8x16_t* const q2, uint8x16_t* const q3) { Load4x16_NEON(src - 2, stride, p3, p2, p1, p0); Load4x16_NEON(src + 2, stride, q0, q1, q2, q3); } static WEBP_INLINE void Load16x4_NEON(const uint8_t* const src, int stride, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1) { *p1 = vld1q_u8(src - 2 * stride); *p0 = vld1q_u8(src - 1 * stride); *q0 = vld1q_u8(src + 0 * stride); *q1 = vld1q_u8(src + 1 * stride); } static WEBP_INLINE void Load16x8_NEON( const uint8_t* const src, int stride, uint8x16_t* const p3, uint8x16_t* const p2, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1, uint8x16_t* const q2, uint8x16_t* const q3) { Load16x4_NEON(src - 2 * stride, stride, p3, p2, p1, p0); Load16x4_NEON(src + 2 * stride, stride, q0, q1, q2, q3); } static WEBP_INLINE void Load8x8x2_NEON( const uint8_t* const u, const uint8_t* const v, int stride, uint8x16_t* const p3, uint8x16_t* const p2, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1, uint8x16_t* const q2, uint8x16_t* const q3) { // We pack the 8x8 u-samples in the lower half of the uint8x16_t destination // and the v-samples on the higher half. *p3 = vcombine_u8(vld1_u8(u - 4 * stride), vld1_u8(v - 4 * stride)); *p2 = vcombine_u8(vld1_u8(u - 3 * stride), vld1_u8(v - 3 * stride)); *p1 = vcombine_u8(vld1_u8(u - 2 * stride), vld1_u8(v - 2 * stride)); *p0 = vcombine_u8(vld1_u8(u - 1 * stride), vld1_u8(v - 1 * stride)); *q0 = vcombine_u8(vld1_u8(u + 0 * stride), vld1_u8(v + 0 * stride)); *q1 = vcombine_u8(vld1_u8(u + 1 * stride), vld1_u8(v + 1 * stride)); *q2 = vcombine_u8(vld1_u8(u + 2 * stride), vld1_u8(v + 2 * stride)); *q3 = vcombine_u8(vld1_u8(u + 3 * stride), vld1_u8(v + 3 * stride)); } #if !defined(WORK_AROUND_GCC) #define LOAD_UV_8(ROW) \ vcombine_u8(vld1_u8(u - 4 + (ROW) * stride), vld1_u8(v - 4 + (ROW) * stride)) static WEBP_INLINE void Load8x8x2T_NEON( const uint8_t* const u, const uint8_t* const v, int stride, uint8x16_t* const p3, uint8x16_t* const p2, uint8x16_t* const p1, uint8x16_t* const p0, uint8x16_t* const q0, uint8x16_t* const q1, uint8x16_t* const q2, uint8x16_t* const q3) { // We pack the 8x8 u-samples in the lower half of the uint8x16_t destination // and the v-samples on the higher half. const uint8x16_t row0 = LOAD_UV_8(0); const uint8x16_t row1 = LOAD_UV_8(1); const uint8x16_t row2 = LOAD_UV_8(2); const uint8x16_t row3 = LOAD_UV_8(3); const uint8x16_t row4 = LOAD_UV_8(4); const uint8x16_t row5 = LOAD_UV_8(5); const uint8x16_t row6 = LOAD_UV_8(6); const uint8x16_t row7 = LOAD_UV_8(7); // Perform two side-by-side 8x8 transposes // u00 u01 u02 u03 u04 u05 u06 u07 | v00 v01 v02 v03 v04 v05 v06 v07 // u10 u11 u12 u13 u14 u15 u16 u17 | v10 v11 v12 ... // u20 u21 u22 u23 u24 u25 u26 u27 | v20 v21 ... // u30 u31 u32 u33 u34 u35 u36 u37 | ... // u40 u41 u42 u43 u44 u45 u46 u47 | ... // u50 u51 u52 u53 u54 u55 u56 u57 | ... // u60 u61 u62 u63 u64 u65 u66 u67 | v60 ... // u70 u71 u72 u73 u74 u75 u76 u77 | v70 v71 v72 ... const uint8x16x2_t row01 = vtrnq_u8(row0, row1); // u00 u10 u02 u12 ... // u01 u11 u03 u13 ... const uint8x16x2_t row23 = vtrnq_u8(row2, row3); // u20 u30 u22 u32 ... // u21 u31 u23 u33 ... const uint8x16x2_t row45 = vtrnq_u8(row4, row5); // ... const uint8x16x2_t row67 = vtrnq_u8(row6, row7); // ... const uint16x8x2_t row02 = vtrnq_u16(vreinterpretq_u16_u8(row01.val[0]), vreinterpretq_u16_u8(row23.val[0])); const uint16x8x2_t row13 = vtrnq_u16(vreinterpretq_u16_u8(row01.val[1]), vreinterpretq_u16_u8(row23.val[1])); const uint16x8x2_t row46 = vtrnq_u16(vreinterpretq_u16_u8(row45.val[0]), vreinterpretq_u16_u8(row67.val[0])); const uint16x8x2_t row57 = vtrnq_u16(vreinterpretq_u16_u8(row45.val[1]), vreinterpretq_u16_u8(row67.val[1])); const uint32x4x2_t row04 = vtrnq_u32(vreinterpretq_u32_u16(row02.val[0]), vreinterpretq_u32_u16(row46.val[0])); const uint32x4x2_t row26 = vtrnq_u32(vreinterpretq_u32_u16(row02.val[1]), vreinterpretq_u32_u16(row46.val[1])); const uint32x4x2_t row15 = vtrnq_u32(vreinterpretq_u32_u16(row13.val[0]), vreinterpretq_u32_u16(row57.val[0])); const uint32x4x2_t row37 = vtrnq_u32(vreinterpretq_u32_u16(row13.val[1]), vreinterpretq_u32_u16(row57.val[1])); *p3 = vreinterpretq_u8_u32(row04.val[0]); *p2 = vreinterpretq_u8_u32(row15.val[0]); *p1 = vreinterpretq_u8_u32(row26.val[0]); *p0 = vreinterpretq_u8_u32(row37.val[0]); *q0 = vreinterpretq_u8_u32(row04.val[1]); *q1 = vreinterpretq_u8_u32(row15.val[1]); *q2 = vreinterpretq_u8_u32(row26.val[1]); *q3 = vreinterpretq_u8_u32(row37.val[1]); } #undef LOAD_UV_8 #endif // !WORK_AROUND_GCC static WEBP_INLINE void Store2x8_NEON(const uint8x8x2_t v, uint8_t* const dst, int stride) { vst2_lane_u8(dst + 0 * stride, v, 0); vst2_lane_u8(dst + 1 * stride, v, 1); vst2_lane_u8(dst + 2 * stride, v, 2); vst2_lane_u8(dst + 3 * stride, v, 3); vst2_lane_u8(dst + 4 * stride, v, 4); vst2_lane_u8(dst + 5 * stride, v, 5); vst2_lane_u8(dst + 6 * stride, v, 6); vst2_lane_u8(dst + 7 * stride, v, 7); } static WEBP_INLINE void Store2x16_NEON(const uint8x16_t p0, const uint8x16_t q0, uint8_t* const dst, int stride) { uint8x8x2_t lo, hi; lo.val[0] = vget_low_u8(p0); lo.val[1] = vget_low_u8(q0); hi.val[0] = vget_high_u8(p0); hi.val[1] = vget_high_u8(q0); Store2x8_NEON(lo, dst - 1 + 0 * stride, stride); Store2x8_NEON(hi, dst - 1 + 8 * stride, stride); } #if !defined(WORK_AROUND_GCC) static WEBP_INLINE void Store4x8_NEON(const uint8x8x4_t v, uint8_t* const dst, int stride) { vst4_lane_u8(dst + 0 * stride, v, 0); vst4_lane_u8(dst + 1 * stride, v, 1); vst4_lane_u8(dst + 2 * stride, v, 2); vst4_lane_u8(dst + 3 * stride, v, 3); vst4_lane_u8(dst + 4 * stride, v, 4); vst4_lane_u8(dst + 5 * stride, v, 5); vst4_lane_u8(dst + 6 * stride, v, 6); vst4_lane_u8(dst + 7 * stride, v, 7); } static WEBP_INLINE void Store4x16_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, uint8_t* const dst, int stride) { uint8x8x4_t lo, hi; INIT_VECTOR4(lo, vget_low_u8(p1), vget_low_u8(p0), vget_low_u8(q0), vget_low_u8(q1)); INIT_VECTOR4(hi, vget_high_u8(p1), vget_high_u8(p0), vget_high_u8(q0), vget_high_u8(q1)); Store4x8_NEON(lo, dst - 2 + 0 * stride, stride); Store4x8_NEON(hi, dst - 2 + 8 * stride, stride); } #endif // !WORK_AROUND_GCC static WEBP_INLINE void Store16x2_NEON(const uint8x16_t p0, const uint8x16_t q0, uint8_t* const dst, int stride) { vst1q_u8(dst - stride, p0); vst1q_u8(dst, q0); } static WEBP_INLINE void Store16x4_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, uint8_t* const dst, int stride) { Store16x2_NEON(p1, p0, dst - stride, stride); Store16x2_NEON(q0, q1, dst + stride, stride); } static WEBP_INLINE void Store8x2x2_NEON(const uint8x16_t p0, const uint8x16_t q0, uint8_t* const u, uint8_t* const v, int stride) { // p0 and q0 contain the u+v samples packed in low/high halves. vst1_u8(u - stride, vget_low_u8(p0)); vst1_u8(u, vget_low_u8(q0)); vst1_u8(v - stride, vget_high_u8(p0)); vst1_u8(v, vget_high_u8(q0)); } static WEBP_INLINE void Store8x4x2_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, uint8_t* const u, uint8_t* const v, int stride) { // The p1...q1 registers contain the u+v samples packed in low/high halves. Store8x2x2_NEON(p1, p0, u - stride, v - stride, stride); Store8x2x2_NEON(q0, q1, u + stride, v + stride, stride); } #if !defined(WORK_AROUND_GCC) #define STORE6_LANE(DST, VAL0, VAL1, LANE) do { \ vst3_lane_u8((DST) - 3, (VAL0), (LANE)); \ vst3_lane_u8((DST) + 0, (VAL1), (LANE)); \ (DST) += stride; \ } while (0) static WEBP_INLINE void Store6x8x2_NEON( const uint8x16_t p2, const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, const uint8x16_t q2, uint8_t* u, uint8_t* v, int stride) { uint8x8x3_t u0, u1, v0, v1; INIT_VECTOR3(u0, vget_low_u8(p2), vget_low_u8(p1), vget_low_u8(p0)); INIT_VECTOR3(u1, vget_low_u8(q0), vget_low_u8(q1), vget_low_u8(q2)); INIT_VECTOR3(v0, vget_high_u8(p2), vget_high_u8(p1), vget_high_u8(p0)); INIT_VECTOR3(v1, vget_high_u8(q0), vget_high_u8(q1), vget_high_u8(q2)); STORE6_LANE(u, u0, u1, 0); STORE6_LANE(u, u0, u1, 1); STORE6_LANE(u, u0, u1, 2); STORE6_LANE(u, u0, u1, 3); STORE6_LANE(u, u0, u1, 4); STORE6_LANE(u, u0, u1, 5); STORE6_LANE(u, u0, u1, 6); STORE6_LANE(u, u0, u1, 7); STORE6_LANE(v, v0, v1, 0); STORE6_LANE(v, v0, v1, 1); STORE6_LANE(v, v0, v1, 2); STORE6_LANE(v, v0, v1, 3); STORE6_LANE(v, v0, v1, 4); STORE6_LANE(v, v0, v1, 5); STORE6_LANE(v, v0, v1, 6); STORE6_LANE(v, v0, v1, 7); } #undef STORE6_LANE static WEBP_INLINE void Store4x8x2_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, uint8_t* const u, uint8_t* const v, int stride) { uint8x8x4_t u0, v0; INIT_VECTOR4(u0, vget_low_u8(p1), vget_low_u8(p0), vget_low_u8(q0), vget_low_u8(q1)); INIT_VECTOR4(v0, vget_high_u8(p1), vget_high_u8(p0), vget_high_u8(q0), vget_high_u8(q1)); vst4_lane_u8(u - 2 + 0 * stride, u0, 0); vst4_lane_u8(u - 2 + 1 * stride, u0, 1); vst4_lane_u8(u - 2 + 2 * stride, u0, 2); vst4_lane_u8(u - 2 + 3 * stride, u0, 3); vst4_lane_u8(u - 2 + 4 * stride, u0, 4); vst4_lane_u8(u - 2 + 5 * stride, u0, 5); vst4_lane_u8(u - 2 + 6 * stride, u0, 6); vst4_lane_u8(u - 2 + 7 * stride, u0, 7); vst4_lane_u8(v - 2 + 0 * stride, v0, 0); vst4_lane_u8(v - 2 + 1 * stride, v0, 1); vst4_lane_u8(v - 2 + 2 * stride, v0, 2); vst4_lane_u8(v - 2 + 3 * stride, v0, 3); vst4_lane_u8(v - 2 + 4 * stride, v0, 4); vst4_lane_u8(v - 2 + 5 * stride, v0, 5); vst4_lane_u8(v - 2 + 6 * stride, v0, 6); vst4_lane_u8(v - 2 + 7 * stride, v0, 7); } #endif // !WORK_AROUND_GCC // Zero extend 'v' to an int16x8_t. static WEBP_INLINE int16x8_t ConvertU8ToS16_NEON(uint8x8_t v) { return vreinterpretq_s16_u16(vmovl_u8(v)); } // Performs unsigned 8b saturation on 'dst01' and 'dst23' storing the result // to the corresponding rows of 'dst'. static WEBP_INLINE void SaturateAndStore4x4_NEON(uint8_t* const dst, const int16x8_t dst01, const int16x8_t dst23) { // Unsigned saturate to 8b. const uint8x8_t dst01_u8 = vqmovun_s16(dst01); const uint8x8_t dst23_u8 = vqmovun_s16(dst23); // Store the results. vst1_lane_u32((uint32_t*)(dst + 0 * BPS), vreinterpret_u32_u8(dst01_u8), 0); vst1_lane_u32((uint32_t*)(dst + 1 * BPS), vreinterpret_u32_u8(dst01_u8), 1); vst1_lane_u32((uint32_t*)(dst + 2 * BPS), vreinterpret_u32_u8(dst23_u8), 0); vst1_lane_u32((uint32_t*)(dst + 3 * BPS), vreinterpret_u32_u8(dst23_u8), 1); } static WEBP_INLINE void Add4x4_NEON(const int16x8_t row01, const int16x8_t row23, uint8_t* const dst) { uint32x2_t dst01 = vdup_n_u32(0); uint32x2_t dst23 = vdup_n_u32(0); // Load the source pixels. dst01 = vld1_lane_u32((uint32_t*)(dst + 0 * BPS), dst01, 0); dst23 = vld1_lane_u32((uint32_t*)(dst + 2 * BPS), dst23, 0); dst01 = vld1_lane_u32((uint32_t*)(dst + 1 * BPS), dst01, 1); dst23 = vld1_lane_u32((uint32_t*)(dst + 3 * BPS), dst23, 1); { // Convert to 16b. const int16x8_t dst01_s16 = ConvertU8ToS16_NEON(vreinterpret_u8_u32(dst01)); const int16x8_t dst23_s16 = ConvertU8ToS16_NEON(vreinterpret_u8_u32(dst23)); // Descale with rounding. const int16x8_t out01 = vrsraq_n_s16(dst01_s16, row01, 3); const int16x8_t out23 = vrsraq_n_s16(dst23_s16, row23, 3); // Add the inverse transform. SaturateAndStore4x4_NEON(dst, out01, out23); } } //----------------------------------------------------------------------------- // Simple In-loop filtering (Paragraph 15.2) static uint8x16_t NeedsFilter_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, int thresh) { const uint8x16_t thresh_v = vdupq_n_u8((uint8_t)thresh); const uint8x16_t a_p0_q0 = vabdq_u8(p0, q0); // abs(p0-q0) const uint8x16_t a_p1_q1 = vabdq_u8(p1, q1); // abs(p1-q1) const uint8x16_t a_p0_q0_2 = vqaddq_u8(a_p0_q0, a_p0_q0); // 2 * abs(p0-q0) const uint8x16_t a_p1_q1_2 = vshrq_n_u8(a_p1_q1, 1); // abs(p1-q1) / 2 const uint8x16_t sum = vqaddq_u8(a_p0_q0_2, a_p1_q1_2); const uint8x16_t mask = vcgeq_u8(thresh_v, sum); return mask; } static int8x16_t FlipSign_NEON(const uint8x16_t v) { const uint8x16_t sign_bit = vdupq_n_u8(0x80); return vreinterpretq_s8_u8(veorq_u8(v, sign_bit)); } static uint8x16_t FlipSignBack_NEON(const int8x16_t v) { const int8x16_t sign_bit = vdupq_n_s8(0x80); return vreinterpretq_u8_s8(veorq_s8(v, sign_bit)); } static int8x16_t GetBaseDelta_NEON(const int8x16_t p1, const int8x16_t p0, const int8x16_t q0, const int8x16_t q1) { const int8x16_t q0_p0 = vqsubq_s8(q0, p0); // (q0-p0) const int8x16_t p1_q1 = vqsubq_s8(p1, q1); // (p1-q1) const int8x16_t s1 = vqaddq_s8(p1_q1, q0_p0); // (p1-q1) + 1 * (q0 - p0) const int8x16_t s2 = vqaddq_s8(q0_p0, s1); // (p1-q1) + 2 * (q0 - p0) const int8x16_t s3 = vqaddq_s8(q0_p0, s2); // (p1-q1) + 3 * (q0 - p0) return s3; } static int8x16_t GetBaseDelta0_NEON(const int8x16_t p0, const int8x16_t q0) { const int8x16_t q0_p0 = vqsubq_s8(q0, p0); // (q0-p0) const int8x16_t s1 = vqaddq_s8(q0_p0, q0_p0); // 2 * (q0 - p0) const int8x16_t s2 = vqaddq_s8(q0_p0, s1); // 3 * (q0 - p0) return s2; } //------------------------------------------------------------------------------ static void ApplyFilter2NoFlip_NEON(const int8x16_t p0s, const int8x16_t q0s, const int8x16_t delta, int8x16_t* const op0, int8x16_t* const oq0) { const int8x16_t kCst3 = vdupq_n_s8(0x03); const int8x16_t kCst4 = vdupq_n_s8(0x04); const int8x16_t delta_p3 = vqaddq_s8(delta, kCst3); const int8x16_t delta_p4 = vqaddq_s8(delta, kCst4); const int8x16_t delta3 = vshrq_n_s8(delta_p3, 3); const int8x16_t delta4 = vshrq_n_s8(delta_p4, 3); *op0 = vqaddq_s8(p0s, delta3); *oq0 = vqsubq_s8(q0s, delta4); } #if defined(WEBP_USE_INTRINSICS) static void ApplyFilter2_NEON(const int8x16_t p0s, const int8x16_t q0s, const int8x16_t delta, uint8x16_t* const op0, uint8x16_t* const oq0) { const int8x16_t kCst3 = vdupq_n_s8(0x03); const int8x16_t kCst4 = vdupq_n_s8(0x04); const int8x16_t delta_p3 = vqaddq_s8(delta, kCst3); const int8x16_t delta_p4 = vqaddq_s8(delta, kCst4); const int8x16_t delta3 = vshrq_n_s8(delta_p3, 3); const int8x16_t delta4 = vshrq_n_s8(delta_p4, 3); const int8x16_t sp0 = vqaddq_s8(p0s, delta3); const int8x16_t sq0 = vqsubq_s8(q0s, delta4); *op0 = FlipSignBack_NEON(sp0); *oq0 = FlipSignBack_NEON(sq0); } static void DoFilter2_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, const uint8x16_t mask, uint8x16_t* const op0, uint8x16_t* const oq0) { const int8x16_t p1s = FlipSign_NEON(p1); const int8x16_t p0s = FlipSign_NEON(p0); const int8x16_t q0s = FlipSign_NEON(q0); const int8x16_t q1s = FlipSign_NEON(q1); const int8x16_t delta0 = GetBaseDelta_NEON(p1s, p0s, q0s, q1s); const int8x16_t delta1 = vandq_s8(delta0, vreinterpretq_s8_u8(mask)); ApplyFilter2_NEON(p0s, q0s, delta1, op0, oq0); } static void SimpleVFilter16_NEON(uint8_t* p, int stride, int thresh) { uint8x16_t p1, p0, q0, q1, op0, oq0; Load16x4_NEON(p, stride, &p1, &p0, &q0, &q1); { const uint8x16_t mask = NeedsFilter_NEON(p1, p0, q0, q1, thresh); DoFilter2_NEON(p1, p0, q0, q1, mask, &op0, &oq0); } Store16x2_NEON(op0, oq0, p, stride); } static void SimpleHFilter16_NEON(uint8_t* p, int stride, int thresh) { uint8x16_t p1, p0, q0, q1, oq0, op0; Load4x16_NEON(p, stride, &p1, &p0, &q0, &q1); { const uint8x16_t mask = NeedsFilter_NEON(p1, p0, q0, q1, thresh); DoFilter2_NEON(p1, p0, q0, q1, mask, &op0, &oq0); } Store2x16_NEON(op0, oq0, p, stride); } #else // Load/Store vertical edge #define LOAD8x4(c1, c2, c3, c4, b1, b2, stride) \ "vld4.8 {" #c1 "[0]," #c2 "[0]," #c3 "[0]," #c4 "[0]}," #b1 "," #stride "\n" \ "vld4.8 {" #c1 "[1]," #c2 "[1]," #c3 "[1]," #c4 "[1]}," #b2 "," #stride "\n" \ "vld4.8 {" #c1 "[2]," #c2 "[2]," #c3 "[2]," #c4 "[2]}," #b1 "," #stride "\n" \ "vld4.8 {" #c1 "[3]," #c2 "[3]," #c3 "[3]," #c4 "[3]}," #b2 "," #stride "\n" \ "vld4.8 {" #c1 "[4]," #c2 "[4]," #c3 "[4]," #c4 "[4]}," #b1 "," #stride "\n" \ "vld4.8 {" #c1 "[5]," #c2 "[5]," #c3 "[5]," #c4 "[5]}," #b2 "," #stride "\n" \ "vld4.8 {" #c1 "[6]," #c2 "[6]," #c3 "[6]," #c4 "[6]}," #b1 "," #stride "\n" \ "vld4.8 {" #c1 "[7]," #c2 "[7]," #c3 "[7]," #c4 "[7]}," #b2 "," #stride "\n" #define STORE8x2(c1, c2, p, stride) \ "vst2.8 {" #c1 "[0], " #c2 "[0]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[1], " #c2 "[1]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[2], " #c2 "[2]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[3], " #c2 "[3]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[4], " #c2 "[4]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[5], " #c2 "[5]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[6], " #c2 "[6]}," #p "," #stride " \n" \ "vst2.8 {" #c1 "[7], " #c2 "[7]}," #p "," #stride " \n" #define QRegs "q0", "q1", "q2", "q3", \ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" #define FLIP_SIGN_BIT2(a, b, s) \ "veor " #a "," #a "," #s " \n" \ "veor " #b "," #b "," #s " \n" \ #define FLIP_SIGN_BIT4(a, b, c, d, s) \ FLIP_SIGN_BIT2(a, b, s) \ FLIP_SIGN_BIT2(c, d, s) \ #define NEEDS_FILTER(p1, p0, q0, q1, thresh, mask) \ "vabd.u8 q15," #p0 "," #q0 " \n" /* abs(p0 - q0) */ \ "vabd.u8 q14," #p1 "," #q1 " \n" /* abs(p1 - q1) */ \ "vqadd.u8 q15, q15, q15 \n" /* abs(p0 - q0) * 2 */ \ "vshr.u8 q14, q14, #1 \n" /* abs(p1 - q1) / 2 */ \ "vqadd.u8 q15, q15, q14 \n" /* abs(p0 - q0) * 2 + abs(p1 - q1) / 2 */ \ "vdup.8 q14, " #thresh " \n" \ "vcge.u8 " #mask ", q14, q15 \n" /* mask <= thresh */ #define GET_BASE_DELTA(p1, p0, q0, q1, o) \ "vqsub.s8 q15," #q0 "," #p0 " \n" /* (q0 - p0) */ \ "vqsub.s8 " #o "," #p1 "," #q1 " \n" /* (p1 - q1) */ \ "vqadd.s8 " #o "," #o ", q15 \n" /* (p1 - q1) + 1 * (p0 - q0) */ \ "vqadd.s8 " #o "," #o ", q15 \n" /* (p1 - q1) + 2 * (p0 - q0) */ \ "vqadd.s8 " #o "," #o ", q15 \n" /* (p1 - q1) + 3 * (p0 - q0) */ #define DO_SIMPLE_FILTER(p0, q0, fl) \ "vmov.i8 q15, #0x03 \n" \ "vqadd.s8 q15, q15, " #fl " \n" /* filter1 = filter + 3 */ \ "vshr.s8 q15, q15, #3 \n" /* filter1 >> 3 */ \ "vqadd.s8 " #p0 "," #p0 ", q15 \n" /* p0 += filter1 */ \ \ "vmov.i8 q15, #0x04 \n" \ "vqadd.s8 q15, q15, " #fl " \n" /* filter1 = filter + 4 */ \ "vshr.s8 q15, q15, #3 \n" /* filter2 >> 3 */ \ "vqsub.s8 " #q0 "," #q0 ", q15 \n" /* q0 -= filter2 */ // Applies filter on 2 pixels (p0 and q0) #define DO_FILTER2(p1, p0, q0, q1, thresh) \ NEEDS_FILTER(p1, p0, q0, q1, thresh, q9) /* filter mask in q9 */ \ "vmov.i8 q10, #0x80 \n" /* sign bit */ \ FLIP_SIGN_BIT4(p1, p0, q0, q1, q10) /* convert to signed value */ \ GET_BASE_DELTA(p1, p0, q0, q1, q11) /* get filter level */ \ "vand q9, q9, q11 \n" /* apply filter mask */ \ DO_SIMPLE_FILTER(p0, q0, q9) /* apply filter */ \ FLIP_SIGN_BIT2(p0, q0, q10) static void SimpleVFilter16_NEON(uint8_t* p, int stride, int thresh) { __asm__ volatile ( "sub %[p], %[p], %[stride], lsl #1 \n" // p -= 2 * stride "vld1.u8 {q1}, [%[p]], %[stride] \n" // p1 "vld1.u8 {q2}, [%[p]], %[stride] \n" // p0 "vld1.u8 {q3}, [%[p]], %[stride] \n" // q0 "vld1.u8 {q12}, [%[p]] \n" // q1 DO_FILTER2(q1, q2, q3, q12, %[thresh]) "sub %[p], %[p], %[stride], lsl #1 \n" // p -= 2 * stride "vst1.u8 {q2}, [%[p]], %[stride] \n" // store op0 "vst1.u8 {q3}, [%[p]] \n" // store oq0 : [p] "+r"(p) : [stride] "r"(stride), [thresh] "r"(thresh) : "memory", QRegs ); } static void SimpleHFilter16_NEON(uint8_t* p, int stride, int thresh) { __asm__ volatile ( "sub r4, %[p], #2 \n" // base1 = p - 2 "lsl r6, %[stride], #1 \n" // r6 = 2 * stride "add r5, r4, %[stride] \n" // base2 = base1 + stride LOAD8x4(d2, d3, d4, d5, [r4], [r5], r6) LOAD8x4(d24, d25, d26, d27, [r4], [r5], r6) "vswp d3, d24 \n" // p1:q1 p0:q3 "vswp d5, d26 \n" // q0:q2 q1:q4 "vswp q2, q12 \n" // p1:q1 p0:q2 q0:q3 q1:q4 DO_FILTER2(q1, q2, q12, q13, %[thresh]) "sub %[p], %[p], #1 \n" // p - 1 "vswp d5, d24 \n" STORE8x2(d4, d5, [%[p]], %[stride]) STORE8x2(d24, d25, [%[p]], %[stride]) : [p] "+r"(p) : [stride] "r"(stride), [thresh] "r"(thresh) : "memory", "r4", "r5", "r6", QRegs ); } #undef LOAD8x4 #undef STORE8x2 #endif // WEBP_USE_INTRINSICS static void SimpleVFilter16i_NEON(uint8_t* p, int stride, int thresh) { uint32_t k; for (k = 3; k != 0; --k) { p += 4 * stride; SimpleVFilter16_NEON(p, stride, thresh); } } static void SimpleHFilter16i_NEON(uint8_t* p, int stride, int thresh) { uint32_t k; for (k = 3; k != 0; --k) { p += 4; SimpleHFilter16_NEON(p, stride, thresh); } } //------------------------------------------------------------------------------ // Complex In-loop filtering (Paragraph 15.3) static uint8x16_t NeedsHev_NEON(const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, int hev_thresh) { const uint8x16_t hev_thresh_v = vdupq_n_u8((uint8_t)hev_thresh); const uint8x16_t a_p1_p0 = vabdq_u8(p1, p0); // abs(p1 - p0) const uint8x16_t a_q1_q0 = vabdq_u8(q1, q0); // abs(q1 - q0) const uint8x16_t a_max = vmaxq_u8(a_p1_p0, a_q1_q0); const uint8x16_t mask = vcgtq_u8(a_max, hev_thresh_v); return mask; } static uint8x16_t NeedsFilter2_NEON(const uint8x16_t p3, const uint8x16_t p2, const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, const uint8x16_t q2, const uint8x16_t q3, int ithresh, int thresh) { const uint8x16_t ithresh_v = vdupq_n_u8((uint8_t)ithresh); const uint8x16_t a_p3_p2 = vabdq_u8(p3, p2); // abs(p3 - p2) const uint8x16_t a_p2_p1 = vabdq_u8(p2, p1); // abs(p2 - p1) const uint8x16_t a_p1_p0 = vabdq_u8(p1, p0); // abs(p1 - p0) const uint8x16_t a_q3_q2 = vabdq_u8(q3, q2); // abs(q3 - q2) const uint8x16_t a_q2_q1 = vabdq_u8(q2, q1); // abs(q2 - q1) const uint8x16_t a_q1_q0 = vabdq_u8(q1, q0); // abs(q1 - q0) const uint8x16_t max1 = vmaxq_u8(a_p3_p2, a_p2_p1); const uint8x16_t max2 = vmaxq_u8(a_p1_p0, a_q3_q2); const uint8x16_t max3 = vmaxq_u8(a_q2_q1, a_q1_q0); const uint8x16_t max12 = vmaxq_u8(max1, max2); const uint8x16_t max123 = vmaxq_u8(max12, max3); const uint8x16_t mask2 = vcgeq_u8(ithresh_v, max123); const uint8x16_t mask1 = NeedsFilter_NEON(p1, p0, q0, q1, thresh); const uint8x16_t mask = vandq_u8(mask1, mask2); return mask; } // 4-points filter static void ApplyFilter4_NEON( const int8x16_t p1, const int8x16_t p0, const int8x16_t q0, const int8x16_t q1, const int8x16_t delta0, uint8x16_t* const op1, uint8x16_t* const op0, uint8x16_t* const oq0, uint8x16_t* const oq1) { const int8x16_t kCst3 = vdupq_n_s8(0x03); const int8x16_t kCst4 = vdupq_n_s8(0x04); const int8x16_t delta1 = vqaddq_s8(delta0, kCst4); const int8x16_t delta2 = vqaddq_s8(delta0, kCst3); const int8x16_t a1 = vshrq_n_s8(delta1, 3); const int8x16_t a2 = vshrq_n_s8(delta2, 3); const int8x16_t a3 = vrshrq_n_s8(a1, 1); // a3 = (a1 + 1) >> 1 *op0 = FlipSignBack_NEON(vqaddq_s8(p0, a2)); // clip(p0 + a2) *oq0 = FlipSignBack_NEON(vqsubq_s8(q0, a1)); // clip(q0 - a1) *op1 = FlipSignBack_NEON(vqaddq_s8(p1, a3)); // clip(p1 + a3) *oq1 = FlipSignBack_NEON(vqsubq_s8(q1, a3)); // clip(q1 - a3) } static void DoFilter4_NEON( const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, const uint8x16_t mask, const uint8x16_t hev_mask, uint8x16_t* const op1, uint8x16_t* const op0, uint8x16_t* const oq0, uint8x16_t* const oq1) { // This is a fused version of DoFilter2() calling ApplyFilter2 directly const int8x16_t p1s = FlipSign_NEON(p1); int8x16_t p0s = FlipSign_NEON(p0); int8x16_t q0s = FlipSign_NEON(q0); const int8x16_t q1s = FlipSign_NEON(q1); const uint8x16_t simple_lf_mask = vandq_u8(mask, hev_mask); // do_filter2 part (simple loopfilter on pixels with hev) { const int8x16_t delta = GetBaseDelta_NEON(p1s, p0s, q0s, q1s); const int8x16_t simple_lf_delta = vandq_s8(delta, vreinterpretq_s8_u8(simple_lf_mask)); ApplyFilter2NoFlip_NEON(p0s, q0s, simple_lf_delta, &p0s, &q0s); } // do_filter4 part (complex loopfilter on pixels without hev) { const int8x16_t delta0 = GetBaseDelta0_NEON(p0s, q0s); // we use: (mask & hev_mask) ^ mask = mask & !hev_mask const uint8x16_t complex_lf_mask = veorq_u8(simple_lf_mask, mask); const int8x16_t complex_lf_delta = vandq_s8(delta0, vreinterpretq_s8_u8(complex_lf_mask)); ApplyFilter4_NEON(p1s, p0s, q0s, q1s, complex_lf_delta, op1, op0, oq0, oq1); } } // 6-points filter static void ApplyFilter6_NEON( const int8x16_t p2, const int8x16_t p1, const int8x16_t p0, const int8x16_t q0, const int8x16_t q1, const int8x16_t q2, const int8x16_t delta, uint8x16_t* const op2, uint8x16_t* const op1, uint8x16_t* const op0, uint8x16_t* const oq0, uint8x16_t* const oq1, uint8x16_t* const oq2) { // We have to compute: X = (9*a+63) >> 7, Y = (18*a+63)>>7, Z = (27*a+63) >> 7 // Turns out, there's a common sub-expression S=9 * a - 1 that can be used // with the special vqrshrn_n_s16 rounding-shift-and-narrow instruction: // X = (S + 64) >> 7, Y = (S + 32) >> 6, Z = (18 * a + S + 64) >> 7 const int8x8_t delta_lo = vget_low_s8(delta); const int8x8_t delta_hi = vget_high_s8(delta); const int8x8_t kCst9 = vdup_n_s8(9); const int16x8_t kCstm1 = vdupq_n_s16(-1); const int8x8_t kCst18 = vdup_n_s8(18); const int16x8_t S_lo = vmlal_s8(kCstm1, kCst9, delta_lo); // S = 9 * a - 1 const int16x8_t S_hi = vmlal_s8(kCstm1, kCst9, delta_hi); const int16x8_t Z_lo = vmlal_s8(S_lo, kCst18, delta_lo); // S + 18 * a const int16x8_t Z_hi = vmlal_s8(S_hi, kCst18, delta_hi); const int8x8_t a3_lo = vqrshrn_n_s16(S_lo, 7); // (9 * a + 63) >> 7 const int8x8_t a3_hi = vqrshrn_n_s16(S_hi, 7); const int8x8_t a2_lo = vqrshrn_n_s16(S_lo, 6); // (9 * a + 31) >> 6 const int8x8_t a2_hi = vqrshrn_n_s16(S_hi, 6); const int8x8_t a1_lo = vqrshrn_n_s16(Z_lo, 7); // (27 * a + 63) >> 7 const int8x8_t a1_hi = vqrshrn_n_s16(Z_hi, 7); const int8x16_t a1 = vcombine_s8(a1_lo, a1_hi); const int8x16_t a2 = vcombine_s8(a2_lo, a2_hi); const int8x16_t a3 = vcombine_s8(a3_lo, a3_hi); *op0 = FlipSignBack_NEON(vqaddq_s8(p0, a1)); // clip(p0 + a1) *oq0 = FlipSignBack_NEON(vqsubq_s8(q0, a1)); // clip(q0 - q1) *oq1 = FlipSignBack_NEON(vqsubq_s8(q1, a2)); // clip(q1 - a2) *op1 = FlipSignBack_NEON(vqaddq_s8(p1, a2)); // clip(p1 + a2) *oq2 = FlipSignBack_NEON(vqsubq_s8(q2, a3)); // clip(q2 - a3) *op2 = FlipSignBack_NEON(vqaddq_s8(p2, a3)); // clip(p2 + a3) } static void DoFilter6_NEON( const uint8x16_t p2, const uint8x16_t p1, const uint8x16_t p0, const uint8x16_t q0, const uint8x16_t q1, const uint8x16_t q2, const uint8x16_t mask, const uint8x16_t hev_mask, uint8x16_t* const op2, uint8x16_t* const op1, uint8x16_t* const op0, uint8x16_t* const oq0, uint8x16_t* const oq1, uint8x16_t* const oq2) { // This is a fused version of DoFilter2() calling ApplyFilter2 directly const int8x16_t p2s = FlipSign_NEON(p2); const int8x16_t p1s = FlipSign_NEON(p1); int8x16_t p0s = FlipSign_NEON(p0); int8x16_t q0s = FlipSign_NEON(q0); const int8x16_t q1s = FlipSign_NEON(q1); const int8x16_t q2s = FlipSign_NEON(q2); const uint8x16_t simple_lf_mask = vandq_u8(mask, hev_mask); const int8x16_t delta0 = GetBaseDelta_NEON(p1s, p0s, q0s, q1s); // do_filter2 part (simple loopfilter on pixels with hev) { const int8x16_t simple_lf_delta = vandq_s8(delta0, vreinterpretq_s8_u8(simple_lf_mask)); ApplyFilter2NoFlip_NEON(p0s, q0s, simple_lf_delta, &p0s, &q0s); } // do_filter6 part (complex loopfilter on pixels without hev) { // we use: (mask & hev_mask) ^ mask = mask & !hev_mask const uint8x16_t complex_lf_mask = veorq_u8(simple_lf_mask, mask); const int8x16_t complex_lf_delta = vandq_s8(delta0, vreinterpretq_s8_u8(complex_lf_mask)); ApplyFilter6_NEON(p2s, p1s, p0s, q0s, q1s, q2s, complex_lf_delta, op2, op1, op0, oq0, oq1, oq2); } } // on macroblock edges static void VFilter16_NEON(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; Load16x8_NEON(p, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op2, op1, op0, oq0, oq1, oq2; DoFilter6_NEON(p2, p1, p0, q0, q1, q2, mask, hev_mask, &op2, &op1, &op0, &oq0, &oq1, &oq2); Store16x2_NEON(op2, op1, p - 2 * stride, stride); Store16x2_NEON(op0, oq0, p + 0 * stride, stride); Store16x2_NEON(oq1, oq2, p + 2 * stride, stride); } } static void HFilter16_NEON(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; Load8x16_NEON(p, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op2, op1, op0, oq0, oq1, oq2; DoFilter6_NEON(p2, p1, p0, q0, q1, q2, mask, hev_mask, &op2, &op1, &op0, &oq0, &oq1, &oq2); Store2x16_NEON(op2, op1, p - 2, stride); Store2x16_NEON(op0, oq0, p + 0, stride); Store2x16_NEON(oq1, oq2, p + 2, stride); } } // on three inner edges static void VFilter16i_NEON(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { uint32_t k; uint8x16_t p3, p2, p1, p0; Load16x4_NEON(p + 2 * stride, stride, &p3, &p2, &p1, &p0); for (k = 3; k != 0; --k) { uint8x16_t q0, q1, q2, q3; p += 4 * stride; Load16x4_NEON(p + 2 * stride, stride, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); // p3 and p2 are not just temporary variables here: they will be // re-used for next span. And q2/q3 will become p1/p0 accordingly. DoFilter4_NEON(p1, p0, q0, q1, mask, hev_mask, &p1, &p0, &p3, &p2); Store16x4_NEON(p1, p0, p3, p2, p, stride); p1 = q2; p0 = q3; } } } #if !defined(WORK_AROUND_GCC) static void HFilter16i_NEON(uint8_t* p, int stride, int thresh, int ithresh, int hev_thresh) { uint32_t k; uint8x16_t p3, p2, p1, p0; Load4x16_NEON(p + 2, stride, &p3, &p2, &p1, &p0); for (k = 3; k != 0; --k) { uint8x16_t q0, q1, q2, q3; p += 4; Load4x16_NEON(p + 2, stride, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); DoFilter4_NEON(p1, p0, q0, q1, mask, hev_mask, &p1, &p0, &p3, &p2); Store4x16_NEON(p1, p0, p3, p2, p, stride); p1 = q2; p0 = q3; } } } #endif // !WORK_AROUND_GCC // 8-pixels wide variant, for chroma filtering static void VFilter8_NEON(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; Load8x8x2_NEON(u, v, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op2, op1, op0, oq0, oq1, oq2; DoFilter6_NEON(p2, p1, p0, q0, q1, q2, mask, hev_mask, &op2, &op1, &op0, &oq0, &oq1, &oq2); Store8x2x2_NEON(op2, op1, u - 2 * stride, v - 2 * stride, stride); Store8x2x2_NEON(op0, oq0, u + 0 * stride, v + 0 * stride, stride); Store8x2x2_NEON(oq1, oq2, u + 2 * stride, v + 2 * stride, stride); } } static void VFilter8i_NEON(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; u += 4 * stride; v += 4 * stride; Load8x8x2_NEON(u, v, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op1, op0, oq0, oq1; DoFilter4_NEON(p1, p0, q0, q1, mask, hev_mask, &op1, &op0, &oq0, &oq1); Store8x4x2_NEON(op1, op0, oq0, oq1, u, v, stride); } } #if !defined(WORK_AROUND_GCC) static void HFilter8_NEON(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; Load8x8x2T_NEON(u, v, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op2, op1, op0, oq0, oq1, oq2; DoFilter6_NEON(p2, p1, p0, q0, q1, q2, mask, hev_mask, &op2, &op1, &op0, &oq0, &oq1, &oq2); Store6x8x2_NEON(op2, op1, op0, oq0, oq1, oq2, u, v, stride); } } static void HFilter8i_NEON(uint8_t* u, uint8_t* v, int stride, int thresh, int ithresh, int hev_thresh) { uint8x16_t p3, p2, p1, p0, q0, q1, q2, q3; u += 4; v += 4; Load8x8x2T_NEON(u, v, stride, &p3, &p2, &p1, &p0, &q0, &q1, &q2, &q3); { const uint8x16_t mask = NeedsFilter2_NEON(p3, p2, p1, p0, q0, q1, q2, q3, ithresh, thresh); const uint8x16_t hev_mask = NeedsHev_NEON(p1, p0, q0, q1, hev_thresh); uint8x16_t op1, op0, oq0, oq1; DoFilter4_NEON(p1, p0, q0, q1, mask, hev_mask, &op1, &op0, &oq0, &oq1); Store4x8x2_NEON(op1, op0, oq0, oq1, u, v, stride); } } #endif // !WORK_AROUND_GCC //----------------------------------------------------------------------------- // Inverse transforms (Paragraph 14.4) // Technically these are unsigned but vqdmulh is only available in signed. // vqdmulh returns high half (effectively >> 16) but also doubles the value, // changing the >> 16 to >> 15 and requiring an additional >> 1. // We use this to our advantage with kC2. The canonical value is 35468. // However, the high bit is set so treating it as signed will give incorrect // results. We avoid this by down shifting by 1 here to clear the highest bit. // Combined with the doubling effect of vqdmulh we get >> 16. // This can not be applied to kC1 because the lowest bit is set. Down shifting // the constant would reduce precision. // libwebp uses a trick to avoid some extra addition that libvpx does. // Instead of: // temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16); // libwebp adds 1 << 16 to cospi8sqrt2minus1 (kC1). However, this causes the // same issue with kC1 and vqdmulh that we work around by down shifting kC2 static const int16_t kC1 = WEBP_TRANSFORM_AC3_C1; static const int16_t kC2 = WEBP_TRANSFORM_AC3_C2 / 2; // half of kC2, actually. See comment above. #if defined(WEBP_USE_INTRINSICS) static WEBP_INLINE void Transpose8x2_NEON(const int16x8_t in0, const int16x8_t in1, int16x8x2_t* const out) { // a0 a1 a2 a3 | b0 b1 b2 b3 => a0 b0 c0 d0 | a1 b1 c1 d1 // c0 c1 c2 c3 | d0 d1 d2 d3 a2 b2 c2 d2 | a3 b3 c3 d3 const int16x8x2_t tmp0 = vzipq_s16(in0, in1); // a0 c0 a1 c1 a2 c2 ... // b0 d0 b1 d1 b2 d2 ... *out = vzipq_s16(tmp0.val[0], tmp0.val[1]); } static WEBP_INLINE void TransformPass_NEON(int16x8x2_t* const rows) { // {rows} = in0 | in4 // in8 | in12 // B1 = in4 | in12 const int16x8_t B1 = vcombine_s16(vget_high_s16(rows->val[0]), vget_high_s16(rows->val[1])); // C0 = kC1 * in4 | kC1 * in12 // C1 = kC2 * in4 | kC2 * in12 const int16x8_t C0 = vsraq_n_s16(B1, vqdmulhq_n_s16(B1, kC1), 1); const int16x8_t C1 = vqdmulhq_n_s16(B1, kC2); const int16x4_t a = vqadd_s16(vget_low_s16(rows->val[0]), vget_low_s16(rows->val[1])); // in0 + in8 const int16x4_t b = vqsub_s16(vget_low_s16(rows->val[0]), vget_low_s16(rows->val[1])); // in0 - in8 // c = kC2 * in4 - kC1 * in12 // d = kC1 * in4 + kC2 * in12 const int16x4_t c = vqsub_s16(vget_low_s16(C1), vget_high_s16(C0)); const int16x4_t d = vqadd_s16(vget_low_s16(C0), vget_high_s16(C1)); const int16x8_t D0 = vcombine_s16(a, b); // D0 = a | b const int16x8_t D1 = vcombine_s16(d, c); // D1 = d | c const int16x8_t E0 = vqaddq_s16(D0, D1); // a+d | b+c const int16x8_t E_tmp = vqsubq_s16(D0, D1); // a-d | b-c const int16x8_t E1 = vcombine_s16(vget_high_s16(E_tmp), vget_low_s16(E_tmp)); Transpose8x2_NEON(E0, E1, rows); } static void TransformOne_NEON(const int16_t* in, uint8_t* dst) { int16x8x2_t rows; INIT_VECTOR2(rows, vld1q_s16(in + 0), vld1q_s16(in + 8)); TransformPass_NEON(&rows); TransformPass_NEON(&rows); Add4x4_NEON(rows.val[0], rows.val[1], dst); } #else static void TransformOne_NEON(const int16_t* in, uint8_t* dst) { const int kBPS = BPS; // kC1, kC2. Padded because vld1.16 loads 8 bytes const int16_t constants[4] = { kC1, kC2, 0, 0 }; /* Adapted from libvpx: vp8/common/arm/neon/shortidct4x4llm_neon.asm */ __asm__ volatile ( "vld1.16 {q1, q2}, [%[in]] \n" "vld1.16 {d0}, [%[constants]] \n" /* d2: in[0] * d3: in[8] * d4: in[4] * d5: in[12] */ "vswp d3, d4 \n" /* q8 = {in[4], in[12]} * kC1 * 2 >> 16 * q9 = {in[4], in[12]} * kC2 >> 16 */ "vqdmulh.s16 q8, q2, d0[0] \n" "vqdmulh.s16 q9, q2, d0[1] \n" /* d22 = a = in[0] + in[8] * d23 = b = in[0] - in[8] */ "vqadd.s16 d22, d2, d3 \n" "vqsub.s16 d23, d2, d3 \n" /* The multiplication should be x * kC1 >> 16 * However, with vqdmulh we get x * kC1 * 2 >> 16 * (multiply, double, return high half) * We avoided this in kC2 by pre-shifting the constant. * q8 = in[4]/[12] * kC1 >> 16 */ "vshr.s16 q8, q8, #1 \n" /* Add {in[4], in[12]} back after the multiplication. This is handled by * adding 1 << 16 to kC1 in the libwebp C code. */ "vqadd.s16 q8, q2, q8 \n" /* d20 = c = in[4]*kC2 - in[12]*kC1 * d21 = d = in[4]*kC1 + in[12]*kC2 */ "vqsub.s16 d20, d18, d17 \n" "vqadd.s16 d21, d19, d16 \n" /* d2 = tmp[0] = a + d * d3 = tmp[1] = b + c * d4 = tmp[2] = b - c * d5 = tmp[3] = a - d */ "vqadd.s16 d2, d22, d21 \n" "vqadd.s16 d3, d23, d20 \n" "vqsub.s16 d4, d23, d20 \n" "vqsub.s16 d5, d22, d21 \n" "vzip.16 q1, q2 \n" "vzip.16 q1, q2 \n" "vswp d3, d4 \n" /* q8 = {tmp[4], tmp[12]} * kC1 * 2 >> 16 * q9 = {tmp[4], tmp[12]} * kC2 >> 16 */ "vqdmulh.s16 q8, q2, d0[0] \n" "vqdmulh.s16 q9, q2, d0[1] \n" /* d22 = a = tmp[0] + tmp[8] * d23 = b = tmp[0] - tmp[8] */ "vqadd.s16 d22, d2, d3 \n" "vqsub.s16 d23, d2, d3 \n" /* See long winded explanations prior */ "vshr.s16 q8, q8, #1 \n" "vqadd.s16 q8, q2, q8 \n" /* d20 = c = in[4]*kC2 - in[12]*kC1 * d21 = d = in[4]*kC1 + in[12]*kC2 */ "vqsub.s16 d20, d18, d17 \n" "vqadd.s16 d21, d19, d16 \n" /* d2 = tmp[0] = a + d * d3 = tmp[1] = b + c * d4 = tmp[2] = b - c * d5 = tmp[3] = a - d */ "vqadd.s16 d2, d22, d21 \n" "vqadd.s16 d3, d23, d20 \n" "vqsub.s16 d4, d23, d20 \n" "vqsub.s16 d5, d22, d21 \n" "vld1.32 d6[0], [%[dst]], %[kBPS] \n" "vld1.32 d6[1], [%[dst]], %[kBPS] \n" "vld1.32 d7[0], [%[dst]], %[kBPS] \n" "vld1.32 d7[1], [%[dst]], %[kBPS] \n" "sub %[dst], %[dst], %[kBPS], lsl #2 \n" /* (val) + 4 >> 3 */ "vrshr.s16 d2, d2, #3 \n" "vrshr.s16 d3, d3, #3 \n" "vrshr.s16 d4, d4, #3 \n" "vrshr.s16 d5, d5, #3 \n" "vzip.16 q1, q2 \n" "vzip.16 q1, q2 \n" /* Must accumulate before saturating */ "vmovl.u8 q8, d6 \n" "vmovl.u8 q9, d7 \n" "vqadd.s16 q1, q1, q8 \n" "vqadd.s16 q2, q2, q9 \n" "vqmovun.s16 d0, q1 \n" "vqmovun.s16 d1, q2 \n" "vst1.32 d0[0], [%[dst]], %[kBPS] \n" "vst1.32 d0[1], [%[dst]], %[kBPS] \n" "vst1.32 d1[0], [%[dst]], %[kBPS] \n" "vst1.32 d1[1], [%[dst]] \n" : [in] "+r"(in), [dst] "+r"(dst) /* modified registers */ : [kBPS] "r"(kBPS), [constants] "r"(constants) /* constants */ : "memory", "q0", "q1", "q2", "q8", "q9", "q10", "q11" /* clobbered */ ); } #endif // WEBP_USE_INTRINSICS static void TransformTwo_NEON(const int16_t* in, uint8_t* dst, int do_two) { TransformOne_NEON(in, dst); if (do_two) { TransformOne_NEON(in + 16, dst + 4); } } static void TransformDC_NEON(const int16_t* in, uint8_t* dst) { const int16x8_t DC = vdupq_n_s16(in[0]); Add4x4_NEON(DC, DC, dst); } //------------------------------------------------------------------------------ #define STORE_WHT(dst, col, rows) do { \ *dst = vgetq_lane_s32(rows.val[0], col); (dst) += 16; \ *dst = vgetq_lane_s32(rows.val[1], col); (dst) += 16; \ *dst = vgetq_lane_s32(rows.val[2], col); (dst) += 16; \ *dst = vgetq_lane_s32(rows.val[3], col); (dst) += 16; \ } while (0) static void TransformWHT_NEON(const int16_t* in, int16_t* out) { int32x4x4_t tmp; { // Load the source. const int16x4_t in00_03 = vld1_s16(in + 0); const int16x4_t in04_07 = vld1_s16(in + 4); const int16x4_t in08_11 = vld1_s16(in + 8); const int16x4_t in12_15 = vld1_s16(in + 12); const int32x4_t a0 = vaddl_s16(in00_03, in12_15); // in[0..3] + in[12..15] const int32x4_t a1 = vaddl_s16(in04_07, in08_11); // in[4..7] + in[8..11] const int32x4_t a2 = vsubl_s16(in04_07, in08_11); // in[4..7] - in[8..11] const int32x4_t a3 = vsubl_s16(in00_03, in12_15); // in[0..3] - in[12..15] tmp.val[0] = vaddq_s32(a0, a1); tmp.val[1] = vaddq_s32(a3, a2); tmp.val[2] = vsubq_s32(a0, a1); tmp.val[3] = vsubq_s32(a3, a2); // Arrange the temporary results column-wise. tmp = Transpose4x4_NEON(tmp); } { const int32x4_t kCst3 = vdupq_n_s32(3); const int32x4_t dc = vaddq_s32(tmp.val[0], kCst3); // add rounder const int32x4_t a0 = vaddq_s32(dc, tmp.val[3]); const int32x4_t a1 = vaddq_s32(tmp.val[1], tmp.val[2]); const int32x4_t a2 = vsubq_s32(tmp.val[1], tmp.val[2]); const int32x4_t a3 = vsubq_s32(dc, tmp.val[3]); tmp.val[0] = vaddq_s32(a0, a1); tmp.val[1] = vaddq_s32(a3, a2); tmp.val[2] = vsubq_s32(a0, a1); tmp.val[3] = vsubq_s32(a3, a2); // right shift the results by 3. tmp.val[0] = vshrq_n_s32(tmp.val[0], 3); tmp.val[1] = vshrq_n_s32(tmp.val[1], 3); tmp.val[2] = vshrq_n_s32(tmp.val[2], 3); tmp.val[3] = vshrq_n_s32(tmp.val[3], 3); STORE_WHT(out, 0, tmp); STORE_WHT(out, 1, tmp); STORE_WHT(out, 2, tmp); STORE_WHT(out, 3, tmp); } } #undef STORE_WHT //------------------------------------------------------------------------------ static void TransformAC3_NEON(const int16_t* in, uint8_t* dst) { const int16x4_t A = vld1_dup_s16(in); const int16x4_t c4 = vdup_n_s16(WEBP_TRANSFORM_AC3_MUL2(in[4])); const int16x4_t d4 = vdup_n_s16(WEBP_TRANSFORM_AC3_MUL1(in[4])); const int c1 = WEBP_TRANSFORM_AC3_MUL2(in[1]); const int d1 = WEBP_TRANSFORM_AC3_MUL1(in[1]); const uint64_t cd = (uint64_t)( d1 & 0xffff) << 0 | (uint64_t)( c1 & 0xffff) << 16 | (uint64_t)(-c1 & 0xffff) << 32 | (uint64_t)(-d1 & 0xffff) << 48; const int16x4_t CD = vcreate_s16(cd); const int16x4_t B = vqadd_s16(A, CD); const int16x8_t m0_m1 = vcombine_s16(vqadd_s16(B, d4), vqadd_s16(B, c4)); const int16x8_t m2_m3 = vcombine_s16(vqsub_s16(B, c4), vqsub_s16(B, d4)); Add4x4_NEON(m0_m1, m2_m3, dst); } //------------------------------------------------------------------------------ // 4x4 static void DC4_NEON(uint8_t* dst) { // DC const uint8x8_t A = vld1_u8(dst - BPS); // top row const uint16x4_t p0 = vpaddl_u8(A); // cascading summation of the top const uint16x4_t p1 = vpadd_u16(p0, p0); const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1); const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1); const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1); const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1); const uint16x8_t s0 = vaddl_u8(L0, L1); const uint16x8_t s1 = vaddl_u8(L2, L3); const uint16x8_t s01 = vaddq_u16(s0, s1); const uint16x8_t sum = vaddq_u16(s01, vcombine_u16(p1, p1)); const uint8x8_t dc0 = vrshrn_n_u16(sum, 3); // (sum + 4) >> 3 const uint8x8_t dc = vdup_lane_u8(dc0, 0); int i; for (i = 0; i < 4; ++i) { vst1_lane_u32((uint32_t*)(dst + i * BPS), vreinterpret_u32_u8(dc), 0); } } // TrueMotion (4x4 + 8x8) static WEBP_INLINE void TrueMotion_NEON(uint8_t* dst, int size) { const uint8x8_t TL = vld1_dup_u8(dst - BPS - 1); // top-left pixel 'A[-1]' const uint8x8_t T = vld1_u8(dst - BPS); // top row 'A[0..3]' const int16x8_t d = vreinterpretq_s16_u16(vsubl_u8(T, TL)); // A[c] - A[-1] int y; for (y = 0; y < size; y += 4) { // left edge const int16x8_t L0 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 0 * BPS - 1)); const int16x8_t L1 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 1 * BPS - 1)); const int16x8_t L2 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 2 * BPS - 1)); const int16x8_t L3 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 3 * BPS - 1)); const int16x8_t r0 = vaddq_s16(L0, d); // L[r] + A[c] - A[-1] const int16x8_t r1 = vaddq_s16(L1, d); const int16x8_t r2 = vaddq_s16(L2, d); const int16x8_t r3 = vaddq_s16(L3, d); // Saturate and store the result. const uint32x2_t r0_u32 = vreinterpret_u32_u8(vqmovun_s16(r0)); const uint32x2_t r1_u32 = vreinterpret_u32_u8(vqmovun_s16(r1)); const uint32x2_t r2_u32 = vreinterpret_u32_u8(vqmovun_s16(r2)); const uint32x2_t r3_u32 = vreinterpret_u32_u8(vqmovun_s16(r3)); if (size == 4) { vst1_lane_u32((uint32_t*)(dst + 0 * BPS), r0_u32, 0); vst1_lane_u32((uint32_t*)(dst + 1 * BPS), r1_u32, 0); vst1_lane_u32((uint32_t*)(dst + 2 * BPS), r2_u32, 0); vst1_lane_u32((uint32_t*)(dst + 3 * BPS), r3_u32, 0); } else { vst1_u32((uint32_t*)(dst + 0 * BPS), r0_u32); vst1_u32((uint32_t*)(dst + 1 * BPS), r1_u32); vst1_u32((uint32_t*)(dst + 2 * BPS), r2_u32); vst1_u32((uint32_t*)(dst + 3 * BPS), r3_u32); } dst += 4 * BPS; } } static void TM4_NEON(uint8_t* dst) { TrueMotion_NEON(dst, 4); } static void VE4_NEON(uint8_t* dst) { // vertical // NB: avoid vld1_u64 here as an alignment hint may be added -> SIGBUS. const uint64x1_t A0 = vreinterpret_u64_u8(vld1_u8(dst - BPS - 1)); // top row const uint64x1_t A1 = vshr_n_u64(A0, 8); const uint64x1_t A2 = vshr_n_u64(A0, 16); const uint8x8_t ABCDEFGH = vreinterpret_u8_u64(A0); const uint8x8_t BCDEFGH0 = vreinterpret_u8_u64(A1); const uint8x8_t CDEFGH00 = vreinterpret_u8_u64(A2); const uint8x8_t b = vhadd_u8(ABCDEFGH, CDEFGH00); const uint8x8_t avg = vrhadd_u8(b, BCDEFGH0); int i; for (i = 0; i < 4; ++i) { vst1_lane_u32((uint32_t*)(dst + i * BPS), vreinterpret_u32_u8(avg), 0); } } static void RD4_NEON(uint8_t* dst) { // Down-right const uint8x8_t XABCD_u8 = vld1_u8(dst - BPS - 1); const uint64x1_t XABCD = vreinterpret_u64_u8(XABCD_u8); const uint64x1_t ____XABC = vshl_n_u64(XABCD, 32); const uint32_t I = dst[-1 + 0 * BPS]; const uint32_t J = dst[-1 + 1 * BPS]; const uint32_t K = dst[-1 + 2 * BPS]; const uint32_t L = dst[-1 + 3 * BPS]; const uint64x1_t LKJI____ = vcreate_u64((uint64_t)L | (K << 8) | (J << 16) | (I << 24)); const uint64x1_t LKJIXABC = vorr_u64(LKJI____, ____XABC); const uint8x8_t KJIXABC_ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 8)); const uint8x8_t JIXABC__ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 16)); const uint8_t D = vget_lane_u8(XABCD_u8, 4); const uint8x8_t JIXABCD_ = vset_lane_u8(D, JIXABC__, 6); const uint8x8_t LKJIXABC_u8 = vreinterpret_u8_u64(LKJIXABC); const uint8x8_t avg1 = vhadd_u8(JIXABCD_, LKJIXABC_u8); const uint8x8_t avg2 = vrhadd_u8(avg1, KJIXABC_); const uint64x1_t avg2_u64 = vreinterpret_u64_u8(avg2); const uint32x2_t r3 = vreinterpret_u32_u8(avg2); const uint32x2_t r2 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 8)); const uint32x2_t r1 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 16)); const uint32x2_t r0 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 24)); vst1_lane_u32((uint32_t*)(dst + 0 * BPS), r0, 0); vst1_lane_u32((uint32_t*)(dst + 1 * BPS), r1, 0); vst1_lane_u32((uint32_t*)(dst + 2 * BPS), r2, 0); vst1_lane_u32((uint32_t*)(dst + 3 * BPS), r3, 0); } static void LD4_NEON(uint8_t* dst) { // Down-left // Note using the same shift trick as VE4() is slower here. const uint8x8_t ABCDEFGH = vld1_u8(dst - BPS + 0); const uint8x8_t BCDEFGH0 = vld1_u8(dst - BPS + 1); const uint8x8_t CDEFGH00 = vld1_u8(dst - BPS + 2); const uint8x8_t CDEFGHH0 = vset_lane_u8(dst[-BPS + 7], CDEFGH00, 6); const uint8x8_t avg1 = vhadd_u8(ABCDEFGH, CDEFGHH0); const uint8x8_t avg2 = vrhadd_u8(avg1, BCDEFGH0); const uint64x1_t avg2_u64 = vreinterpret_u64_u8(avg2); const uint32x2_t r0 = vreinterpret_u32_u8(avg2); const uint32x2_t r1 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 8)); const uint32x2_t r2 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 16)); const uint32x2_t r3 = vreinterpret_u32_u64(vshr_n_u64(avg2_u64, 24)); vst1_lane_u32((uint32_t*)(dst + 0 * BPS), r0, 0); vst1_lane_u32((uint32_t*)(dst + 1 * BPS), r1, 0); vst1_lane_u32((uint32_t*)(dst + 2 * BPS), r2, 0); vst1_lane_u32((uint32_t*)(dst + 3 * BPS), r3, 0); } //------------------------------------------------------------------------------ // Chroma static void VE8uv_NEON(uint8_t* dst) { // vertical const uint8x8_t top = vld1_u8(dst - BPS); int j; for (j = 0; j < 8; ++j) { vst1_u8(dst + j * BPS, top); } } static void HE8uv_NEON(uint8_t* dst) { // horizontal int j; for (j = 0; j < 8; ++j) { const uint8x8_t left = vld1_dup_u8(dst - 1); vst1_u8(dst, left); dst += BPS; } } static WEBP_INLINE void DC8_NEON(uint8_t* dst, int do_top, int do_left) { uint16x8_t sum_top; uint16x8_t sum_left; uint8x8_t dc0; if (do_top) { const uint8x8_t A = vld1_u8(dst - BPS); // top row #if WEBP_AARCH64 const uint16_t p2 = vaddlv_u8(A); sum_top = vdupq_n_u16(p2); #else const uint16x4_t p0 = vpaddl_u8(A); // cascading summation of the top const uint16x4_t p1 = vpadd_u16(p0, p0); const uint16x4_t p2 = vpadd_u16(p1, p1); sum_top = vcombine_u16(p2, p2); #endif } if (do_left) { const uint8x8_t L0 = vld1_u8(dst + 0 * BPS - 1); const uint8x8_t L1 = vld1_u8(dst + 1 * BPS - 1); const uint8x8_t L2 = vld1_u8(dst + 2 * BPS - 1); const uint8x8_t L3 = vld1_u8(dst + 3 * BPS - 1); const uint8x8_t L4 = vld1_u8(dst + 4 * BPS - 1); const uint8x8_t L5 = vld1_u8(dst + 5 * BPS - 1); const uint8x8_t L6 = vld1_u8(dst + 6 * BPS - 1); const uint8x8_t L7 = vld1_u8(dst + 7 * BPS - 1); const uint16x8_t s0 = vaddl_u8(L0, L1); const uint16x8_t s1 = vaddl_u8(L2, L3); const uint16x8_t s2 = vaddl_u8(L4, L5); const uint16x8_t s3 = vaddl_u8(L6, L7); const uint16x8_t s01 = vaddq_u16(s0, s1); const uint16x8_t s23 = vaddq_u16(s2, s3); sum_left = vaddq_u16(s01, s23); } if (do_top && do_left) { const uint16x8_t sum = vaddq_u16(sum_left, sum_top); dc0 = vrshrn_n_u16(sum, 4); } else if (do_top) { dc0 = vrshrn_n_u16(sum_top, 3); } else if (do_left) { dc0 = vrshrn_n_u16(sum_left, 3); } else { dc0 = vdup_n_u8(0x80); } { const uint8x8_t dc = vdup_lane_u8(dc0, 0); int i; for (i = 0; i < 8; ++i) { vst1_u32((uint32_t*)(dst + i * BPS), vreinterpret_u32_u8(dc)); } } } static void DC8uv_NEON(uint8_t* dst) { DC8_NEON(dst, 1, 1); } static void DC8uvNoTop_NEON(uint8_t* dst) { DC8_NEON(dst, 0, 1); } static void DC8uvNoLeft_NEON(uint8_t* dst) { DC8_NEON(dst, 1, 0); } static void DC8uvNoTopLeft_NEON(uint8_t* dst) { DC8_NEON(dst, 0, 0); } static void TM8uv_NEON(uint8_t* dst) { TrueMotion_NEON(dst, 8); } //------------------------------------------------------------------------------ // 16x16 static void VE16_NEON(uint8_t* dst) { // vertical const uint8x16_t top = vld1q_u8(dst - BPS); int j; for (j = 0; j < 16; ++j) { vst1q_u8(dst + j * BPS, top); } } static void HE16_NEON(uint8_t* dst) { // horizontal int j; for (j = 0; j < 16; ++j) { const uint8x16_t left = vld1q_dup_u8(dst - 1); vst1q_u8(dst, left); dst += BPS; } } static WEBP_INLINE void DC16_NEON(uint8_t* dst, int do_top, int do_left) { uint16x8_t sum_top; uint16x8_t sum_left; uint8x8_t dc0; if (do_top) { const uint8x16_t A = vld1q_u8(dst - BPS); // top row #if WEBP_AARCH64 const uint16_t p3 = vaddlvq_u8(A); sum_top = vdupq_n_u16(p3); #else const uint16x8_t p0 = vpaddlq_u8(A); // cascading summation of the top const uint16x4_t p1 = vadd_u16(vget_low_u16(p0), vget_high_u16(p0)); const uint16x4_t p2 = vpadd_u16(p1, p1); const uint16x4_t p3 = vpadd_u16(p2, p2); sum_top = vcombine_u16(p3, p3); #endif } if (do_left) { int i; sum_left = vdupq_n_u16(0); for (i = 0; i < 16; i += 8) { const uint8x8_t L0 = vld1_u8(dst + (i + 0) * BPS - 1); const uint8x8_t L1 = vld1_u8(dst + (i + 1) * BPS - 1); const uint8x8_t L2 = vld1_u8(dst + (i + 2) * BPS - 1); const uint8x8_t L3 = vld1_u8(dst + (i + 3) * BPS - 1); const uint8x8_t L4 = vld1_u8(dst + (i + 4) * BPS - 1); const uint8x8_t L5 = vld1_u8(dst + (i + 5) * BPS - 1); const uint8x8_t L6 = vld1_u8(dst + (i + 6) * BPS - 1); const uint8x8_t L7 = vld1_u8(dst + (i + 7) * BPS - 1); const uint16x8_t s0 = vaddl_u8(L0, L1); const uint16x8_t s1 = vaddl_u8(L2, L3); const uint16x8_t s2 = vaddl_u8(L4, L5); const uint16x8_t s3 = vaddl_u8(L6, L7); const uint16x8_t s01 = vaddq_u16(s0, s1); const uint16x8_t s23 = vaddq_u16(s2, s3); const uint16x8_t sum = vaddq_u16(s01, s23); sum_left = vaddq_u16(sum_left, sum); } } if (do_top && do_left) { const uint16x8_t sum = vaddq_u16(sum_left, sum_top); dc0 = vrshrn_n_u16(sum, 5); } else if (do_top) { dc0 = vrshrn_n_u16(sum_top, 4); } else if (do_left) { dc0 = vrshrn_n_u16(sum_left, 4); } else { dc0 = vdup_n_u8(0x80); } { const uint8x16_t dc = vdupq_lane_u8(dc0, 0); int i; for (i = 0; i < 16; ++i) { vst1q_u8(dst + i * BPS, dc); } } } static void DC16TopLeft_NEON(uint8_t* dst) { DC16_NEON(dst, 1, 1); } static void DC16NoTop_NEON(uint8_t* dst) { DC16_NEON(dst, 0, 1); } static void DC16NoLeft_NEON(uint8_t* dst) { DC16_NEON(dst, 1, 0); } static void DC16NoTopLeft_NEON(uint8_t* dst) { DC16_NEON(dst, 0, 0); } static void TM16_NEON(uint8_t* dst) { const uint8x8_t TL = vld1_dup_u8(dst - BPS - 1); // top-left pixel 'A[-1]' const uint8x16_t T = vld1q_u8(dst - BPS); // top row 'A[0..15]' // A[c] - A[-1] const int16x8_t d_lo = vreinterpretq_s16_u16(vsubl_u8(vget_low_u8(T), TL)); const int16x8_t d_hi = vreinterpretq_s16_u16(vsubl_u8(vget_high_u8(T), TL)); int y; for (y = 0; y < 16; y += 4) { // left edge const int16x8_t L0 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 0 * BPS - 1)); const int16x8_t L1 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 1 * BPS - 1)); const int16x8_t L2 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 2 * BPS - 1)); const int16x8_t L3 = ConvertU8ToS16_NEON(vld1_dup_u8(dst + 3 * BPS - 1)); const int16x8_t r0_lo = vaddq_s16(L0, d_lo); // L[r] + A[c] - A[-1] const int16x8_t r1_lo = vaddq_s16(L1, d_lo); const int16x8_t r2_lo = vaddq_s16(L2, d_lo); const int16x8_t r3_lo = vaddq_s16(L3, d_lo); const int16x8_t r0_hi = vaddq_s16(L0, d_hi); const int16x8_t r1_hi = vaddq_s16(L1, d_hi); const int16x8_t r2_hi = vaddq_s16(L2, d_hi); const int16x8_t r3_hi = vaddq_s16(L3, d_hi); // Saturate and store the result. const uint8x16_t row0 = vcombine_u8(vqmovun_s16(r0_lo), vqmovun_s16(r0_hi)); const uint8x16_t row1 = vcombine_u8(vqmovun_s16(r1_lo), vqmovun_s16(r1_hi)); const uint8x16_t row2 = vcombine_u8(vqmovun_s16(r2_lo), vqmovun_s16(r2_hi)); const uint8x16_t row3 = vcombine_u8(vqmovun_s16(r3_lo), vqmovun_s16(r3_hi)); vst1q_u8(dst + 0 * BPS, row0); vst1q_u8(dst + 1 * BPS, row1); vst1q_u8(dst + 2 * BPS, row2); vst1q_u8(dst + 3 * BPS, row3); dst += 4 * BPS; } } //------------------------------------------------------------------------------ // Entry point extern void VP8DspInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8DspInitNEON(void) { VP8Transform = TransformTwo_NEON; VP8TransformAC3 = TransformAC3_NEON; VP8TransformDC = TransformDC_NEON; VP8TransformWHT = TransformWHT_NEON; VP8VFilter16 = VFilter16_NEON; VP8VFilter16i = VFilter16i_NEON; VP8HFilter16 = HFilter16_NEON; #if !defined(WORK_AROUND_GCC) VP8HFilter16i = HFilter16i_NEON; #endif VP8VFilter8 = VFilter8_NEON; VP8VFilter8i = VFilter8i_NEON; #if !defined(WORK_AROUND_GCC) VP8HFilter8 = HFilter8_NEON; VP8HFilter8i = HFilter8i_NEON; #endif VP8SimpleVFilter16 = SimpleVFilter16_NEON; VP8SimpleHFilter16 = SimpleHFilter16_NEON; VP8SimpleVFilter16i = SimpleVFilter16i_NEON; VP8SimpleHFilter16i = SimpleHFilter16i_NEON; VP8PredLuma4[0] = DC4_NEON; VP8PredLuma4[1] = TM4_NEON; VP8PredLuma4[2] = VE4_NEON; VP8PredLuma4[4] = RD4_NEON; VP8PredLuma4[6] = LD4_NEON; VP8PredLuma16[0] = DC16TopLeft_NEON; VP8PredLuma16[1] = TM16_NEON; VP8PredLuma16[2] = VE16_NEON; VP8PredLuma16[3] = HE16_NEON; VP8PredLuma16[4] = DC16NoTop_NEON; VP8PredLuma16[5] = DC16NoLeft_NEON; VP8PredLuma16[6] = DC16NoTopLeft_NEON; VP8PredChroma8[0] = DC8uv_NEON; VP8PredChroma8[1] = TM8uv_NEON; VP8PredChroma8[2] = VE8uv_NEON; VP8PredChroma8[3] = HE8uv_NEON; VP8PredChroma8[4] = DC8uvNoTop_NEON; VP8PredChroma8[5] = DC8uvNoLeft_NEON; VP8PredChroma8[6] = DC8uvNoTopLeft_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8DspInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/cost_mips_dsp_r2.c0000644000014400001440000001133014606317060015043 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/enc/cost_enc.h" static int GetResidualCost_MIPSdspR2(int ctx0, const VP8Residual* const res) { int temp0, temp1; int v_reg, ctx_reg; int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 int p0 = res->prob[n][ctx0][0]; CostArrayPtr const costs = res->costs; const uint16_t* t = costs[n][ctx0]; // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0 // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll // be missing during the loop. int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; const int16_t* res_coeffs = res->coeffs; const int res_last = res->last; const int const_max_level = MAX_VARIABLE_LEVEL; const int const_2 = 2; const uint16_t** p_costs = &costs[n][0]; const size_t inc_p_costs = NUM_CTX * sizeof(*p_costs); if (res->last < 0) { return VP8BitCost(0, p0); } __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "subu %[temp1], %[res_last], %[n] \n\t" "blez %[temp1], 2f \n\t" " nop \n\t" "1: \n\t" "sll %[temp0], %[n], 1 \n\t" "lhx %[v_reg], %[temp0](%[res_coeffs]) \n\t" "addiu %[n], %[n], 1 \n\t" "absq_s.w %[v_reg], %[v_reg] \n\t" "sltiu %[temp0], %[v_reg], 2 \n\t" "move %[ctx_reg], %[v_reg] \n\t" "movz %[ctx_reg], %[const_2], %[temp0] \n\t" "sll %[temp1], %[v_reg], 1 \n\t" "lhx %[temp1], %[temp1](%[VP8LevelFixedCosts]) \n\t" "slt %[temp0], %[v_reg], %[const_max_level] \n\t" "movz %[v_reg], %[const_max_level], %[temp0] \n\t" "addu %[cost], %[cost], %[temp1] \n\t" "sll %[v_reg], %[v_reg], 1 \n\t" "sll %[ctx_reg], %[ctx_reg], 2 \n\t" "lhx %[temp0], %[v_reg](%[t]) \n\t" "addu %[p_costs], %[p_costs], %[inc_p_costs] \n\t" "addu %[t], %[p_costs], %[ctx_reg] \n\t" "addu %[cost], %[cost], %[temp0] \n\t" "bne %[n], %[res_last], 1b \n\t" " lw %[t], 0(%[t]) \n\t" "2: \n\t" ".set pop \n\t" : [cost]"+&r"(cost), [t]"+&r"(t), [n]"+&r"(n), [v_reg]"=&r"(v_reg), [ctx_reg]"=&r"(ctx_reg), [p_costs]"+&r"(p_costs), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1) : [const_2]"r"(const_2), [const_max_level]"r"(const_max_level), [VP8LevelFixedCosts]"r"(VP8LevelFixedCosts), [res_last]"r"(res_last), [res_coeffs]"r"(res_coeffs), [inc_p_costs]"r"(inc_p_costs) : "memory" ); // Last coefficient is always non-zero { const int v = abs(res->coeffs[n]); assert(v != 0); cost += VP8LevelCost(t, v); if (n < 15) { const int b = VP8EncBands[n + 1]; const int ctx = (v == 1) ? 1 : 2; const int last_p0 = res->prob[b][ctx][0]; cost += VP8BitCost(0, last_p0); } } return cost; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspCostInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspCostInitMIPSdspR2(void) { VP8GetResidualCost = GetResidualCost_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8EncDspCostInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/upsampling_mips_dsp_r2.c0000644000014400001440000003177414606317060016270 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV to RGB upsampling functions. // // Author(s): Branimir Vasic (branimir.vasic@imgtec.com) // Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include #include "src/dsp/yuv.h" #define YUV_TO_RGB(Y, U, V, R, G, B) do { \ const int t1 = MultHi(Y, 19077); \ const int t2 = MultHi(V, 13320); \ R = MultHi(V, 26149); \ G = MultHi(U, 6419); \ B = MultHi(U, 33050); \ R = t1 + R; \ G = t1 - G; \ B = t1 + B; \ R = R - 14234; \ G = G - t2 + 8708; \ B = B - 17685; \ __asm__ volatile ( \ "shll_s.w %[" #R "], %[" #R "], 17 \n\t" \ "shll_s.w %[" #G "], %[" #G "], 17 \n\t" \ "shll_s.w %[" #B "], %[" #B "], 17 \n\t" \ "precrqu_s.qb.ph %[" #R "], %[" #R "], $zero \n\t" \ "precrqu_s.qb.ph %[" #G "], %[" #G "], $zero \n\t" \ "precrqu_s.qb.ph %[" #B "], %[" #B "], $zero \n\t" \ "srl %[" #R "], %[" #R "], 24 \n\t" \ "srl %[" #G "], %[" #G "], 24 \n\t" \ "srl %[" #B "], %[" #B "], 24 \n\t" \ : [R]"+r"(R), [G]"+r"(G), [B]"+r"(B) \ : \ ); \ } while (0) #if !defined(WEBP_REDUCE_CSP) static WEBP_INLINE void YuvToRgb(int y, int u, int v, uint8_t* const rgb) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); rgb[0] = r; rgb[1] = g; rgb[2] = b; } static WEBP_INLINE void YuvToBgr(int y, int u, int v, uint8_t* const bgr) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); bgr[0] = b; bgr[1] = g; bgr[2] = r; } static WEBP_INLINE void YuvToRgb565(int y, int u, int v, uint8_t* const rgb) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); { const int rg = (r & 0xf8) | (g >> 5); const int gb = ((g << 3) & 0xe0) | (b >> 3); #if (WEBP_SWAP_16BIT_CSP == 1) rgb[0] = gb; rgb[1] = rg; #else rgb[0] = rg; rgb[1] = gb; #endif } } static WEBP_INLINE void YuvToRgba4444(int y, int u, int v, uint8_t* const argb) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); { const int rg = (r & 0xf0) | (g >> 4); const int ba = (b & 0xf0) | 0x0f; // overwrite the lower 4 bits #if (WEBP_SWAP_16BIT_CSP == 1) argb[0] = ba; argb[1] = rg; #else argb[0] = rg; argb[1] = ba; #endif } } #endif // WEBP_REDUCE_CSP //----------------------------------------------------------------------------- // Alpha handling variants #if !defined(WEBP_REDUCE_CSP) static WEBP_INLINE void YuvToArgb(uint8_t y, uint8_t u, uint8_t v, uint8_t* const argb) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); argb[0] = 0xff; argb[1] = r; argb[2] = g; argb[3] = b; } #endif // WEBP_REDUCE_CSP static WEBP_INLINE void YuvToBgra(uint8_t y, uint8_t u, uint8_t v, uint8_t* const bgra) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); bgra[0] = b; bgra[1] = g; bgra[2] = r; bgra[3] = 0xff; } static WEBP_INLINE void YuvToRgba(uint8_t y, uint8_t u, uint8_t v, uint8_t* const rgba) { int r, g, b; YUV_TO_RGB(y, u, v, r, g, b); rgba[0] = r; rgba[1] = g; rgba[2] = b; rgba[3] = 0xff; } //------------------------------------------------------------------------------ // Fancy upsampler #ifdef FANCY_UPSAMPLING // Given samples laid out in a square as: // [a b] // [c d] // we interpolate u/v as: // ([9*a + 3*b + 3*c + d 3*a + 9*b + 3*c + d] + [8 8]) / 16 // ([3*a + b + 9*c + 3*d a + 3*b + 3*c + 9*d] [8 8]) / 16 // We process u and v together stashed into 32bit (16bit each). #define LOAD_UV(u, v) ((u) | ((v) << 16)) #define UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ int x; \ const int last_pixel_pair = (len - 1) >> 1; \ uint32_t tl_uv = LOAD_UV(top_u[0], top_v[0]); /* top-left sample */ \ uint32_t l_uv = LOAD_UV(cur_u[0], cur_v[0]); /* left-sample */ \ assert(top_y != NULL); \ { \ const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ FUNC(bottom_y[0], uv0 & 0xff, (uv0 >> 16), bottom_dst); \ } \ for (x = 1; x <= last_pixel_pair; ++x) { \ const uint32_t t_uv = LOAD_UV(top_u[x], top_v[x]); /* top sample */ \ const uint32_t uv = LOAD_UV(cur_u[x], cur_v[x]); /* sample */ \ /* precompute invariant values associated with first and second diagonals*/\ const uint32_t avg = tl_uv + t_uv + l_uv + uv + 0x00080008u; \ const uint32_t diag_12 = (avg + 2 * (t_uv + l_uv)) >> 3; \ const uint32_t diag_03 = (avg + 2 * (tl_uv + uv)) >> 3; \ { \ const uint32_t uv0 = (diag_12 + tl_uv) >> 1; \ const uint32_t uv1 = (diag_03 + t_uv) >> 1; \ FUNC(top_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ top_dst + (2 * x - 1) * XSTEP); \ FUNC(top_y[2 * x - 0], uv1 & 0xff, (uv1 >> 16), \ top_dst + (2 * x - 0) * XSTEP); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (diag_03 + l_uv) >> 1; \ const uint32_t uv1 = (diag_12 + uv) >> 1; \ FUNC(bottom_y[2 * x - 1], uv0 & 0xff, (uv0 >> 16), \ bottom_dst + (2 * x - 1) * XSTEP); \ FUNC(bottom_y[2 * x + 0], uv1 & 0xff, (uv1 >> 16), \ bottom_dst + (2 * x + 0) * XSTEP); \ } \ tl_uv = t_uv; \ l_uv = uv; \ } \ if (!(len & 1)) { \ { \ const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2; \ FUNC(top_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ top_dst + (len - 1) * XSTEP); \ } \ if (bottom_y != NULL) { \ const uint32_t uv0 = (3 * l_uv + tl_uv + 0x00020002u) >> 2; \ FUNC(bottom_y[len - 1], uv0 & 0xff, (uv0 >> 16), \ bottom_dst + (len - 1) * XSTEP); \ } \ } \ } // All variants implemented. UPSAMPLE_FUNC(UpsampleRgbaLinePair, YuvToRgba, 4) UPSAMPLE_FUNC(UpsampleBgraLinePair, YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) UPSAMPLE_FUNC(UpsampleRgbLinePair, YuvToRgb, 3) UPSAMPLE_FUNC(UpsampleBgrLinePair, YuvToBgr, 3) UPSAMPLE_FUNC(UpsampleArgbLinePair, YuvToArgb, 4) UPSAMPLE_FUNC(UpsampleRgba4444LinePair, YuvToRgba4444, 2) UPSAMPLE_FUNC(UpsampleRgb565LinePair, YuvToRgb565, 2) #endif // WEBP_REDUCE_CSP #undef LOAD_UV #undef UPSAMPLE_FUNC //------------------------------------------------------------------------------ // Entry point extern void WebPInitUpsamplersMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersMIPSdspR2(void) { WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair; WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair; WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair; WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair; #if !defined(WEBP_REDUCE_CSP) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair; WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair; WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair; WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair; WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair; WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair; #endif // WEBP_REDUCE_CSP } #endif // FANCY_UPSAMPLING //------------------------------------------------------------------------------ // YUV444 converter #define YUV444_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i; \ for (i = 0; i < len; ++i) FUNC(y[i], u[i], v[i], &dst[i * XSTEP]); \ } YUV444_FUNC(Yuv444ToRgba, YuvToRgba, 4) YUV444_FUNC(Yuv444ToBgra, YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) YUV444_FUNC(Yuv444ToRgb, YuvToRgb, 3) YUV444_FUNC(Yuv444ToBgr, YuvToBgr, 3) YUV444_FUNC(Yuv444ToArgb, YuvToArgb, 4) YUV444_FUNC(Yuv444ToRgba4444, YuvToRgba4444, 2) YUV444_FUNC(Yuv444ToRgb565, YuvToRgb565, 2) #endif // WEBP_REDUCE_CSP #undef YUV444_FUNC //------------------------------------------------------------------------------ // Entry point extern void WebPInitYUV444ConvertersMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitYUV444ConvertersMIPSdspR2(void) { WebPYUV444Converters[MODE_RGBA] = Yuv444ToRgba; WebPYUV444Converters[MODE_BGRA] = Yuv444ToBgra; WebPYUV444Converters[MODE_rgbA] = Yuv444ToRgba; WebPYUV444Converters[MODE_bgrA] = Yuv444ToBgra; #if !defined(WEBP_REDUCE_CSP) WebPYUV444Converters[MODE_RGB] = Yuv444ToRgb; WebPYUV444Converters[MODE_BGR] = Yuv444ToBgr; WebPYUV444Converters[MODE_ARGB] = Yuv444ToArgb; WebPYUV444Converters[MODE_RGBA_4444] = Yuv444ToRgba4444; WebPYUV444Converters[MODE_RGB_565] = Yuv444ToRgb565; WebPYUV444Converters[MODE_Argb] = Yuv444ToArgb; WebPYUV444Converters[MODE_rgbA_4444] = Yuv444ToRgba4444; #endif // WEBP_REDUCE_CSP } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(WebPInitYUV444ConvertersMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 #if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_MIPS_DSP_R2)) WEBP_DSP_INIT_STUB(WebPInitUpsamplersMIPSdspR2) #endif libwebp-1.4.0/src/dsp/lossless_sse2.c0000644000014400001440000007444014606317060014410 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 variant of methods for lossless decoder // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include "src/dsp/common_sse2.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include //------------------------------------------------------------------------------ // Predictor Transform static WEBP_INLINE uint32_t ClampedAddSubtractFull_SSE2(uint32_t c0, uint32_t c1, uint32_t c2) { const __m128i zero = _mm_setzero_si128(); const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero); const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero); const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero); const __m128i V1 = _mm_add_epi16(C0, C1); const __m128i V2 = _mm_sub_epi16(V1, C2); const __m128i b = _mm_packus_epi16(V2, V2); return (uint32_t)_mm_cvtsi128_si32(b); } static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0, uint32_t c1, uint32_t c2) { const __m128i zero = _mm_setzero_si128(); const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero); const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero); const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero); const __m128i avg = _mm_add_epi16(C1, C0); const __m128i A0 = _mm_srli_epi16(avg, 1); const __m128i A1 = _mm_sub_epi16(A0, B0); const __m128i BgtA = _mm_cmpgt_epi16(B0, A0); const __m128i A2 = _mm_sub_epi16(A1, BgtA); const __m128i A3 = _mm_srai_epi16(A2, 1); const __m128i A4 = _mm_add_epi16(A0, A3); const __m128i A5 = _mm_packus_epi16(A4, A4); return (uint32_t)_mm_cvtsi128_si32(A5); } static WEBP_INLINE uint32_t Select_SSE2(uint32_t a, uint32_t b, uint32_t c) { int pa_minus_pb; const __m128i zero = _mm_setzero_si128(); const __m128i A0 = _mm_cvtsi32_si128((int)a); const __m128i B0 = _mm_cvtsi32_si128((int)b); const __m128i C0 = _mm_cvtsi32_si128((int)c); const __m128i AC0 = _mm_subs_epu8(A0, C0); const __m128i CA0 = _mm_subs_epu8(C0, A0); const __m128i BC0 = _mm_subs_epu8(B0, C0); const __m128i CB0 = _mm_subs_epu8(C0, B0); const __m128i AC = _mm_or_si128(AC0, CA0); const __m128i BC = _mm_or_si128(BC0, CB0); const __m128i pa = _mm_unpacklo_epi8(AC, zero); // |a - c| const __m128i pb = _mm_unpacklo_epi8(BC, zero); // |b - c| const __m128i diff = _mm_sub_epi16(pb, pa); { int16_t out[8]; _mm_storeu_si128((__m128i*)out, diff); pa_minus_pb = out[0] + out[1] + out[2] + out[3]; } return (pa_minus_pb <= 0) ? a : b; } static WEBP_INLINE void Average2_m128i(const __m128i* const a0, const __m128i* const a1, __m128i* const avg) { // (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1) const __m128i ones = _mm_set1_epi8(1); const __m128i avg1 = _mm_avg_epu8(*a0, *a1); const __m128i one = _mm_and_si128(_mm_xor_si128(*a0, *a1), ones); *avg = _mm_sub_epi8(avg1, one); } static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0, const uint32_t a1, __m128i* const avg) { // (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1) const __m128i ones = _mm_set1_epi8(1); const __m128i A0 = _mm_cvtsi32_si128((int)a0); const __m128i A1 = _mm_cvtsi32_si128((int)a1); const __m128i avg1 = _mm_avg_epu8(A0, A1); const __m128i one = _mm_and_si128(_mm_xor_si128(A0, A1), ones); *avg = _mm_sub_epi8(avg1, one); } static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) { const __m128i zero = _mm_setzero_si128(); const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a0), zero); const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero); const __m128i sum = _mm_add_epi16(A1, A0); return _mm_srli_epi16(sum, 1); } static WEBP_INLINE uint32_t Average2_SSE2(uint32_t a0, uint32_t a1) { __m128i output; Average2_uint32_SSE2(a0, a1, &output); return (uint32_t)_mm_cvtsi128_si32(output); } static WEBP_INLINE uint32_t Average3_SSE2(uint32_t a0, uint32_t a1, uint32_t a2) { const __m128i zero = _mm_setzero_si128(); const __m128i avg1 = Average2_uint32_16_SSE2(a0, a2); const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero); const __m128i sum = _mm_add_epi16(avg1, A1); const __m128i avg2 = _mm_srli_epi16(sum, 1); const __m128i A2 = _mm_packus_epi16(avg2, avg2); return (uint32_t)_mm_cvtsi128_si32(A2); } static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3) { const __m128i avg1 = Average2_uint32_16_SSE2(a0, a1); const __m128i avg2 = Average2_uint32_16_SSE2(a2, a3); const __m128i sum = _mm_add_epi16(avg2, avg1); const __m128i avg3 = _mm_srli_epi16(sum, 1); const __m128i A0 = _mm_packus_epi16(avg3, avg3); return (uint32_t)_mm_cvtsi128_si32(A0); } static uint32_t Predictor5_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average3_SSE2(*left, top[0], top[1]); return pred; } static uint32_t Predictor6_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2_SSE2(*left, top[-1]); return pred; } static uint32_t Predictor7_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2_SSE2(*left, top[0]); return pred; } static uint32_t Predictor8_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2_SSE2(top[-1], top[0]); (void)left; return pred; } static uint32_t Predictor9_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average2_SSE2(top[0], top[1]); (void)left; return pred; } static uint32_t Predictor10_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Average4_SSE2(*left, top[-1], top[0], top[1]); return pred; } static uint32_t Predictor11_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = Select_SSE2(top[0], *left, top[-1]); return pred; } static uint32_t Predictor12_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = ClampedAddSubtractFull_SSE2(*left, top[0], top[-1]); return pred; } static uint32_t Predictor13_SSE2(const uint32_t* const left, const uint32_t* const top) { const uint32_t pred = ClampedAddSubtractHalf_SSE2(*left, top[0], top[-1]); return pred; } // Batch versions of those functions. // Predictor0: ARGB_BLACK. static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i black = _mm_set1_epi32((int)ARGB_BLACK); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i res = _mm_add_epi8(src, black); _mm_storeu_si128((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsAdd_C[0](in + i, NULL, num_pixels - i, out + i); } (void)upper; } // Predictor1: left. static void PredictorAdd1_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; __m128i prev = _mm_set1_epi32((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { // a | b | c | d const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); // 0 | a | b | c const __m128i shift0 = _mm_slli_si128(src, 4); // a | a + b | b + c | c + d const __m128i sum0 = _mm_add_epi8(src, shift0); // 0 | 0 | a | a + b const __m128i shift1 = _mm_slli_si128(sum0, 8); // a | a + b | a + b + c | a + b + c + d const __m128i sum1 = _mm_add_epi8(sum0, shift1); const __m128i res = _mm_add_epi8(sum1, prev); _mm_storeu_si128((__m128i*)&out[i], res); // replicate prev output on the four lanes prev = _mm_shuffle_epi32(res, (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6)); } if (i != num_pixels) { VP8LPredictorsAdd_C[1](in + i, upper + i, num_pixels - i, out + i); } } // Macro that adds 32-bit integers from IN using mod 256 arithmetic // per 8 bit channel. #define GENERATE_PREDICTOR_1(X, IN) \ static void PredictorAdd##X##_SSE2(const uint32_t* in, const uint32_t* upper, \ int num_pixels, uint32_t* out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \ const __m128i other = _mm_loadu_si128((const __m128i*)&(IN)); \ const __m128i res = _mm_add_epi8(src, other); \ _mm_storeu_si128((__m128i*)&out[i], res); \ } \ if (i != num_pixels) { \ VP8LPredictorsAdd_C[(X)](in + i, upper + i, num_pixels - i, out + i); \ } \ } // Predictor2: Top. GENERATE_PREDICTOR_1(2, upper[i]) // Predictor3: Top-right. GENERATE_PREDICTOR_1(3, upper[i + 1]) // Predictor4: Top-left. GENERATE_PREDICTOR_1(4, upper[i - 1]) #undef GENERATE_PREDICTOR_1 // Due to averages with integers, values cannot be accumulated in parallel for // predictors 5 to 7. GENERATE_PREDICTOR_ADD(Predictor5_SSE2, PredictorAdd5_SSE2) GENERATE_PREDICTOR_ADD(Predictor6_SSE2, PredictorAdd6_SSE2) GENERATE_PREDICTOR_ADD(Predictor7_SSE2, PredictorAdd7_SSE2) #define GENERATE_PREDICTOR_2(X, IN) \ static void PredictorAdd##X##_SSE2(const uint32_t* in, const uint32_t* upper, \ int num_pixels, uint32_t* out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const __m128i Tother = _mm_loadu_si128((const __m128i*)&(IN)); \ const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); \ const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \ __m128i avg, res; \ Average2_m128i(&T, &Tother, &avg); \ res = _mm_add_epi8(avg, src); \ _mm_storeu_si128((__m128i*)&out[i], res); \ } \ if (i != num_pixels) { \ VP8LPredictorsAdd_C[(X)](in + i, upper + i, num_pixels - i, out + i); \ } \ } // Predictor8: average TL T. GENERATE_PREDICTOR_2(8, upper[i - 1]) // Predictor9: average T TR. GENERATE_PREDICTOR_2(9, upper[i + 1]) #undef GENERATE_PREDICTOR_2 // Predictor10: average of (average of (L,TL), average of (T, TR)). #define DO_PRED10(OUT) do { \ __m128i avgLTL, avg; \ Average2_m128i(&L, &TL, &avgLTL); \ Average2_m128i(&avgTTR, &avgLTL, &avg); \ L = _mm_add_epi8(avg, src); \ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \ } while (0) #define DO_PRED10_SHIFT do { \ /* Rotate the pre-computed values for the next iteration.*/ \ avgTTR = _mm_srli_si128(avgTTR, 4); \ TL = _mm_srli_si128(TL, 4); \ src = _mm_srli_si128(src, 4); \ } while (0) static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; __m128i L = _mm_cvtsi32_si128((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i TR = _mm_loadu_si128((const __m128i*)&upper[i + 1]); __m128i avgTTR; Average2_m128i(&T, &TR, &avgTTR); DO_PRED10(0); DO_PRED10_SHIFT; DO_PRED10(1); DO_PRED10_SHIFT; DO_PRED10(2); DO_PRED10_SHIFT; DO_PRED10(3); } if (i != num_pixels) { VP8LPredictorsAdd_C[10](in + i, upper + i, num_pixels - i, out + i); } } #undef DO_PRED10 #undef DO_PRED10_SHIFT // Predictor11: select. #define DO_PRED11(OUT) do { \ const __m128i L_lo = _mm_unpacklo_epi32(L, T); \ const __m128i TL_lo = _mm_unpacklo_epi32(TL, T); \ const __m128i pb = _mm_sad_epu8(L_lo, TL_lo); /* pb = sum |L-TL|*/ \ const __m128i mask = _mm_cmpgt_epi32(pb, pa); \ const __m128i A = _mm_and_si128(mask, L); \ const __m128i B = _mm_andnot_si128(mask, T); \ const __m128i pred = _mm_or_si128(A, B); /* pred = (pa > b)? L : T*/ \ L = _mm_add_epi8(src, pred); \ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \ } while (0) #define DO_PRED11_SHIFT do { \ /* Shift the pre-computed value for the next iteration.*/ \ T = _mm_srli_si128(T, 4); \ TL = _mm_srli_si128(TL, 4); \ src = _mm_srli_si128(src, 4); \ pa = _mm_srli_si128(pa, 4); \ } while (0) static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; __m128i pa; __m128i L = _mm_cvtsi32_si128((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); { // We can unpack with any value on the upper 32 bits, provided it's the // same on both operands (so that their sum of abs diff is zero). Here we // use T. const __m128i T_lo = _mm_unpacklo_epi32(T, T); const __m128i TL_lo = _mm_unpacklo_epi32(TL, T); const __m128i T_hi = _mm_unpackhi_epi32(T, T); const __m128i TL_hi = _mm_unpackhi_epi32(TL, T); const __m128i s_lo = _mm_sad_epu8(T_lo, TL_lo); const __m128i s_hi = _mm_sad_epu8(T_hi, TL_hi); pa = _mm_packs_epi32(s_lo, s_hi); // pa = sum |T-TL| } DO_PRED11(0); DO_PRED11_SHIFT; DO_PRED11(1); DO_PRED11_SHIFT; DO_PRED11(2); DO_PRED11_SHIFT; DO_PRED11(3); } if (i != num_pixels) { VP8LPredictorsAdd_C[11](in + i, upper + i, num_pixels - i, out + i); } } #undef DO_PRED11 #undef DO_PRED11_SHIFT // Predictor12: ClampedAddSubtractFull. #define DO_PRED12(DIFF, LANE, OUT) do { \ const __m128i all = _mm_add_epi16(L, (DIFF)); \ const __m128i alls = _mm_packus_epi16(all, all); \ const __m128i res = _mm_add_epi8(src, alls); \ out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(res); \ L = _mm_unpacklo_epi8(res, zero); \ } while (0) #define DO_PRED12_SHIFT(DIFF, LANE) do { \ /* Shift the pre-computed value for the next iteration.*/ \ if ((LANE) == 0) (DIFF) = _mm_srli_si128((DIFF), 8); \ src = _mm_srli_si128(src, 4); \ } while (0) static void PredictorAdd12_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i zero = _mm_setzero_si128(); const __m128i L8 = _mm_cvtsi32_si128((int)out[-1]); __m128i L = _mm_unpacklo_epi8(L8, zero); for (i = 0; i + 4 <= num_pixels; i += 4) { // Load 4 pixels at a time. __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i T_lo = _mm_unpacklo_epi8(T, zero); const __m128i T_hi = _mm_unpackhi_epi8(T, zero); const __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); const __m128i TL_lo = _mm_unpacklo_epi8(TL, zero); const __m128i TL_hi = _mm_unpackhi_epi8(TL, zero); __m128i diff_lo = _mm_sub_epi16(T_lo, TL_lo); __m128i diff_hi = _mm_sub_epi16(T_hi, TL_hi); DO_PRED12(diff_lo, 0, 0); DO_PRED12_SHIFT(diff_lo, 0); DO_PRED12(diff_lo, 1, 1); DO_PRED12_SHIFT(diff_lo, 1); DO_PRED12(diff_hi, 0, 2); DO_PRED12_SHIFT(diff_hi, 0); DO_PRED12(diff_hi, 1, 3); } if (i != num_pixels) { VP8LPredictorsAdd_C[12](in + i, upper + i, num_pixels - i, out + i); } } #undef DO_PRED12 #undef DO_PRED12_SHIFT // Due to averages with integers, values cannot be accumulated in parallel for // predictors 13. GENERATE_PREDICTOR_ADD(Predictor13_SSE2, PredictorAdd13_SSE2) //------------------------------------------------------------------------------ // Subtract-Green Transform static void AddGreenToBlueAndRed_SSE2(const uint32_t* const src, int num_pixels, uint32_t* dst) { int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb const __m128i A = _mm_srli_epi16(in, 8); // 0 a 0 g const __m128i B = _mm_shufflelo_epi16(A, _MM_SHUFFLE(2, 2, 0, 0)); const __m128i C = _mm_shufflehi_epi16(B, _MM_SHUFFLE(2, 2, 0, 0)); // 0g0g const __m128i out = _mm_add_epi8(in, C); _mm_storeu_si128((__m128i*)&dst[i], out); } // fallthrough and finish off with plain-C if (i != num_pixels) { VP8LAddGreenToBlueAndRed_C(src + i, num_pixels - i, dst + i); } } //------------------------------------------------------------------------------ // Color Transform static void TransformColorInverse_SSE2(const VP8LMultipliers* const m, const uint32_t* const src, int num_pixels, uint32_t* dst) { // sign-extended multiplying constants, pre-shifted by 5. #define CST(X) (((int16_t)(m->X << 8)) >> 5) // sign-extend #define MK_CST_16(HI, LO) \ _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff))) const __m128i mults_rb = MK_CST_16(CST(green_to_red_), CST(green_to_blue_)); const __m128i mults_b2 = MK_CST_16(CST(red_to_blue_), 0); #undef MK_CST_16 #undef CST const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb const __m128i A = _mm_and_si128(in, mask_ag); // a 0 g 0 const __m128i B = _mm_shufflelo_epi16(A, _MM_SHUFFLE(2, 2, 0, 0)); const __m128i C = _mm_shufflehi_epi16(B, _MM_SHUFFLE(2, 2, 0, 0)); // g0g0 const __m128i D = _mm_mulhi_epi16(C, mults_rb); // x dr x db1 const __m128i E = _mm_add_epi8(in, D); // x r' x b' const __m128i F = _mm_slli_epi16(E, 8); // r' 0 b' 0 const __m128i G = _mm_mulhi_epi16(F, mults_b2); // x db2 0 0 const __m128i H = _mm_srli_epi32(G, 8); // 0 x db2 0 const __m128i I = _mm_add_epi8(H, F); // r' x b'' 0 const __m128i J = _mm_srli_epi16(I, 8); // 0 r' 0 b'' const __m128i out = _mm_or_si128(J, A); _mm_storeu_si128((__m128i*)&dst[i], out); } // Fall-back to C-version for left-overs. if (i != num_pixels) { VP8LTransformColorInverse_C(m, src + i, num_pixels - i, dst + i); } } //------------------------------------------------------------------------------ // Color-space conversion functions static void ConvertBGRAToRGB_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 32) { // Load the BGRA buffers. __m128i in0 = _mm_loadu_si128(in + 0); __m128i in1 = _mm_loadu_si128(in + 1); __m128i in2 = _mm_loadu_si128(in + 2); __m128i in3 = _mm_loadu_si128(in + 3); __m128i in4 = _mm_loadu_si128(in + 4); __m128i in5 = _mm_loadu_si128(in + 5); __m128i in6 = _mm_loadu_si128(in + 6); __m128i in7 = _mm_loadu_si128(in + 7); VP8L32bToPlanar_SSE2(&in0, &in1, &in2, &in3); VP8L32bToPlanar_SSE2(&in4, &in5, &in6, &in7); // At this points, in1/in5 contains red only, in2/in6 green only ... // Pack the colors in 24b RGB. VP8PlanarTo24b_SSE2(&in1, &in5, &in2, &in6, &in3, &in7); _mm_storeu_si128(out + 0, in1); _mm_storeu_si128(out + 1, in5); _mm_storeu_si128(out + 2, in2); _mm_storeu_si128(out + 3, in6); _mm_storeu_si128(out + 4, in3); _mm_storeu_si128(out + 5, in7); in += 8; out += 6; num_pixels -= 32; } // left-overs if (num_pixels > 0) { VP8LConvertBGRAToRGB_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } static void ConvertBGRAToRGBA_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ff); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 8) { const __m128i A1 = _mm_loadu_si128(in++); const __m128i A2 = _mm_loadu_si128(in++); const __m128i B1 = _mm_and_si128(A1, red_blue_mask); // R 0 B 0 const __m128i B2 = _mm_and_si128(A2, red_blue_mask); // R 0 B 0 const __m128i C1 = _mm_andnot_si128(red_blue_mask, A1); // 0 G 0 A const __m128i C2 = _mm_andnot_si128(red_blue_mask, A2); // 0 G 0 A const __m128i D1 = _mm_shufflelo_epi16(B1, _MM_SHUFFLE(2, 3, 0, 1)); const __m128i D2 = _mm_shufflelo_epi16(B2, _MM_SHUFFLE(2, 3, 0, 1)); const __m128i E1 = _mm_shufflehi_epi16(D1, _MM_SHUFFLE(2, 3, 0, 1)); const __m128i E2 = _mm_shufflehi_epi16(D2, _MM_SHUFFLE(2, 3, 0, 1)); const __m128i F1 = _mm_or_si128(E1, C1); const __m128i F2 = _mm_or_si128(E2, C2); _mm_storeu_si128(out++, F1); _mm_storeu_si128(out++, F2); num_pixels -= 8; } // left-overs if (num_pixels > 0) { VP8LConvertBGRAToRGBA_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i mask_0x0f = _mm_set1_epi8(0x0f); const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 8) { const __m128i bgra0 = _mm_loadu_si128(in++); // bgra0|bgra1|bgra2|bgra3 const __m128i bgra4 = _mm_loadu_si128(in++); // bgra4|bgra5|bgra6|bgra7 const __m128i v0l = _mm_unpacklo_epi8(bgra0, bgra4); // b0b4g0g4r0r4a0a4... const __m128i v0h = _mm_unpackhi_epi8(bgra0, bgra4); // b2b6g2g6r2r6a2a6... const __m128i v1l = _mm_unpacklo_epi8(v0l, v0h); // b0b2b4b6g0g2g4g6... const __m128i v1h = _mm_unpackhi_epi8(v0l, v0h); // b1b3b5b7g1g3g5g7... const __m128i v2l = _mm_unpacklo_epi8(v1l, v1h); // b0...b7 | g0...g7 const __m128i v2h = _mm_unpackhi_epi8(v1l, v1h); // r0...r7 | a0...a7 const __m128i ga0 = _mm_unpackhi_epi64(v2l, v2h); // g0...g7 | a0...a7 const __m128i rb0 = _mm_unpacklo_epi64(v2h, v2l); // r0...r7 | b0...b7 const __m128i ga1 = _mm_srli_epi16(ga0, 4); // g0-|g1-|...|a6-|a7- const __m128i rb1 = _mm_and_si128(rb0, mask_0xf0); // -r0|-r1|...|-b6|-a7 const __m128i ga2 = _mm_and_si128(ga1, mask_0x0f); // g0-|g1-|...|a6-|a7- const __m128i rgba0 = _mm_or_si128(ga2, rb1); // rg0..rg7 | ba0..ba7 const __m128i rgba1 = _mm_srli_si128(rgba0, 8); // ba0..ba7 | 0 #if (WEBP_SWAP_16BIT_CSP == 1) const __m128i rgba = _mm_unpacklo_epi8(rgba1, rgba0); // barg0...barg7 #else const __m128i rgba = _mm_unpacklo_epi8(rgba0, rgba1); // rgba0...rgba7 #endif _mm_storeu_si128(out++, rgba); num_pixels -= 8; } // left-overs if (num_pixels > 0) { VP8LConvertBGRAToRGBA4444_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } static void ConvertBGRAToRGB565_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i mask_0xe0 = _mm_set1_epi8((char)0xe0); const __m128i mask_0xf8 = _mm_set1_epi8((char)0xf8); const __m128i mask_0x07 = _mm_set1_epi8(0x07); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 8) { const __m128i bgra0 = _mm_loadu_si128(in++); // bgra0|bgra1|bgra2|bgra3 const __m128i bgra4 = _mm_loadu_si128(in++); // bgra4|bgra5|bgra6|bgra7 const __m128i v0l = _mm_unpacklo_epi8(bgra0, bgra4); // b0b4g0g4r0r4a0a4... const __m128i v0h = _mm_unpackhi_epi8(bgra0, bgra4); // b2b6g2g6r2r6a2a6... const __m128i v1l = _mm_unpacklo_epi8(v0l, v0h); // b0b2b4b6g0g2g4g6... const __m128i v1h = _mm_unpackhi_epi8(v0l, v0h); // b1b3b5b7g1g3g5g7... const __m128i v2l = _mm_unpacklo_epi8(v1l, v1h); // b0...b7 | g0...g7 const __m128i v2h = _mm_unpackhi_epi8(v1l, v1h); // r0...r7 | a0...a7 const __m128i ga0 = _mm_unpackhi_epi64(v2l, v2h); // g0...g7 | a0...a7 const __m128i rb0 = _mm_unpacklo_epi64(v2h, v2l); // r0...r7 | b0...b7 const __m128i rb1 = _mm_and_si128(rb0, mask_0xf8); // -r0..-r7|-b0..-b7 const __m128i g_lo1 = _mm_srli_epi16(ga0, 5); const __m128i g_lo2 = _mm_and_si128(g_lo1, mask_0x07); // g0-...g7-|xx (3b) const __m128i g_hi1 = _mm_slli_epi16(ga0, 3); const __m128i g_hi2 = _mm_and_si128(g_hi1, mask_0xe0); // -g0...-g7|xx (3b) const __m128i b0 = _mm_srli_si128(rb1, 8); // -b0...-b7|0 const __m128i rg1 = _mm_or_si128(rb1, g_lo2); // gr0...gr7|xx const __m128i b1 = _mm_srli_epi16(b0, 3); const __m128i gb1 = _mm_or_si128(b1, g_hi2); // bg0...bg7|xx #if (WEBP_SWAP_16BIT_CSP == 1) const __m128i rgba = _mm_unpacklo_epi8(gb1, rg1); // rggb0...rggb7 #else const __m128i rgba = _mm_unpacklo_epi8(rg1, gb1); // bgrb0...bgrb7 #endif _mm_storeu_si128(out++, rgba); num_pixels -= 8; } // left-overs if (num_pixels > 0) { VP8LConvertBGRAToRGB565_C((const uint32_t*)in, num_pixels, (uint8_t*)out); } } static void ConvertBGRAToBGR_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i mask_l = _mm_set_epi32(0, 0x00ffffff, 0, 0x00ffffff); const __m128i mask_h = _mm_set_epi32(0x00ffffff, 0, 0x00ffffff, 0); const __m128i* in = (const __m128i*)src; const uint8_t* const end = dst + num_pixels * 3; // the last storel_epi64 below writes 8 bytes starting at offset 18 while (dst + 26 <= end) { const __m128i bgra0 = _mm_loadu_si128(in++); // bgra0|bgra1|bgra2|bgra3 const __m128i bgra4 = _mm_loadu_si128(in++); // bgra4|bgra5|bgra6|bgra7 const __m128i a0l = _mm_and_si128(bgra0, mask_l); // bgr0|0|bgr0|0 const __m128i a4l = _mm_and_si128(bgra4, mask_l); // bgr0|0|bgr0|0 const __m128i a0h = _mm_and_si128(bgra0, mask_h); // 0|bgr0|0|bgr0 const __m128i a4h = _mm_and_si128(bgra4, mask_h); // 0|bgr0|0|bgr0 const __m128i b0h = _mm_srli_epi64(a0h, 8); // 000b|gr00|000b|gr00 const __m128i b4h = _mm_srli_epi64(a4h, 8); // 000b|gr00|000b|gr00 const __m128i c0 = _mm_or_si128(a0l, b0h); // rgbrgb00|rgbrgb00 const __m128i c4 = _mm_or_si128(a4l, b4h); // rgbrgb00|rgbrgb00 const __m128i c2 = _mm_srli_si128(c0, 8); const __m128i c6 = _mm_srli_si128(c4, 8); _mm_storel_epi64((__m128i*)(dst + 0), c0); _mm_storel_epi64((__m128i*)(dst + 6), c2); _mm_storel_epi64((__m128i*)(dst + 12), c4); _mm_storel_epi64((__m128i*)(dst + 18), c6); dst += 24; num_pixels -= 8; } // left-overs if (num_pixels > 0) { VP8LConvertBGRAToBGR_C((const uint32_t*)in, num_pixels, dst); } } //------------------------------------------------------------------------------ // Entry point extern void VP8LDspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitSSE2(void) { VP8LPredictors[5] = Predictor5_SSE2; VP8LPredictors[6] = Predictor6_SSE2; VP8LPredictors[7] = Predictor7_SSE2; VP8LPredictors[8] = Predictor8_SSE2; VP8LPredictors[9] = Predictor9_SSE2; VP8LPredictors[10] = Predictor10_SSE2; VP8LPredictors[11] = Predictor11_SSE2; VP8LPredictors[12] = Predictor12_SSE2; VP8LPredictors[13] = Predictor13_SSE2; VP8LPredictorsAdd[0] = PredictorAdd0_SSE2; VP8LPredictorsAdd[1] = PredictorAdd1_SSE2; VP8LPredictorsAdd[2] = PredictorAdd2_SSE2; VP8LPredictorsAdd[3] = PredictorAdd3_SSE2; VP8LPredictorsAdd[4] = PredictorAdd4_SSE2; VP8LPredictorsAdd[5] = PredictorAdd5_SSE2; VP8LPredictorsAdd[6] = PredictorAdd6_SSE2; VP8LPredictorsAdd[7] = PredictorAdd7_SSE2; VP8LPredictorsAdd[8] = PredictorAdd8_SSE2; VP8LPredictorsAdd[9] = PredictorAdd9_SSE2; VP8LPredictorsAdd[10] = PredictorAdd10_SSE2; VP8LPredictorsAdd[11] = PredictorAdd11_SSE2; VP8LPredictorsAdd[12] = PredictorAdd12_SSE2; VP8LPredictorsAdd[13] = PredictorAdd13_SSE2; VP8LAddGreenToBlueAndRed = AddGreenToBlueAndRed_SSE2; VP8LTransformColorInverse = TransformColorInverse_SSE2; VP8LConvertBGRAToRGB = ConvertBGRAToRGB_SSE2; VP8LConvertBGRAToRGBA = ConvertBGRAToRGBA_SSE2; VP8LConvertBGRAToRGBA4444 = ConvertBGRAToRGBA4444_SSE2; VP8LConvertBGRAToRGB565 = ConvertBGRAToRGB565_SSE2; VP8LConvertBGRAToBGR = ConvertBGRAToBGR_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8LDspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/enc_sse2.c0000644000014400001440000016416414606317060013311 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 version of speed-critical encoding functions. // // Author: Christian Duvivier (cduvivier@google.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include // for abs() #include #include "src/dsp/common_sse2.h" #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Transforms (Paragraph 14.4) // Does one inverse transform. static void ITransform_One_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst) { // This implementation makes use of 16-bit fixed point versions of two // multiply constants: // K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16 // K2 = sqrt(2) * sin (pi/8) ~= 35468 / 2^16 // // To be able to use signed 16-bit integers, we use the following trick to // have constants within range: // - Associated constants are obtained by subtracting the 16-bit fixed point // version of one: // k = K - (1 << 16) => K = k + (1 << 16) // K1 = 85267 => k1 = 20091 // K2 = 35468 => k2 = -30068 // - The multiplication of a variable by a constant become the sum of the // variable and the multiplication of that variable by the associated // constant: // (x * K) >> 16 = (x * (k + (1 << 16))) >> 16 = ((x * k ) >> 16) + x const __m128i k1k2 = _mm_set_epi16(-30068, -30068, -30068, -30068, 20091, 20091, 20091, 20091); const __m128i k2k1 = _mm_set_epi16(20091, 20091, 20091, 20091, -30068, -30068, -30068, -30068); const __m128i zero = _mm_setzero_si128(); const __m128i zero_four = _mm_set_epi16(0, 0, 0, 0, 4, 4, 4, 4); __m128i T01, T23; // Load and concatenate the transform coefficients. const __m128i in01 = _mm_loadu_si128((const __m128i*)&in[0]); const __m128i in23 = _mm_loadu_si128((const __m128i*)&in[8]); // a00 a10 a20 a30 a01 a11 a21 a31 // a02 a12 a22 a32 a03 a13 a23 a33 // Vertical pass and subsequent transpose. { const __m128i in1 = _mm_unpackhi_epi64(in01, in01); const __m128i in3 = _mm_unpackhi_epi64(in23, in23); // First pass, c and d calculations are longer because of the "trick" // multiplications. // c = MUL(in1, K2) - MUL(in3, K1) = MUL(in1, k2) - MUL(in3, k1) + in1 - in3 // d = MUL(in1, K1) + MUL(in3, K2) = MUL(in1, k1) + MUL(in3, k2) + in1 + in3 const __m128i a_d3 = _mm_add_epi16(in01, in23); const __m128i b_c3 = _mm_sub_epi16(in01, in23); const __m128i c1d1 = _mm_mulhi_epi16(in1, k2k1); const __m128i c2d2 = _mm_mulhi_epi16(in3, k1k2); const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3); const __m128i c4 = _mm_sub_epi16(c1d1, c2d2); const __m128i c = _mm_add_epi16(c3, c4); const __m128i d4u = _mm_add_epi16(c1d1, c2d2); const __m128i du = _mm_add_epi16(a_d3, d4u); const __m128i d = _mm_unpackhi_epi64(du, du); // Second pass. const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3); const __m128i comb_dc = _mm_unpacklo_epi64(d, c); const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc); const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc); const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2)); const __m128i transpose_0 = _mm_unpacklo_epi16(tmp01, tmp23); const __m128i transpose_1 = _mm_unpackhi_epi16(tmp01, tmp23); // a00 a20 a01 a21 a02 a22 a03 a23 // a10 a30 a11 a31 a12 a32 a13 a33 T01 = _mm_unpacklo_epi16(transpose_0, transpose_1); T23 = _mm_unpackhi_epi16(transpose_0, transpose_1); // a00 a10 a20 a30 a01 a11 a21 a31 // a02 a12 a22 a32 a03 a13 a23 a33 } // Horizontal pass and subsequent transpose. { const __m128i T1 = _mm_unpackhi_epi64(T01, T01); const __m128i T3 = _mm_unpackhi_epi64(T23, T23); // First pass, c and d calculations are longer because of the "trick" // multiplications. const __m128i dc = _mm_add_epi16(T01, zero_four); // c = MUL(T1, K2) - MUL(T3, K1) = MUL(T1, k2) - MUL(T3, k1) + T1 - T3 // d = MUL(T1, K1) + MUL(T3, K2) = MUL(T1, k1) + MUL(T3, k2) + T1 + T3 const __m128i a_d3 = _mm_add_epi16(dc, T23); const __m128i b_c3 = _mm_sub_epi16(dc, T23); const __m128i c1d1 = _mm_mulhi_epi16(T1, k2k1); const __m128i c2d2 = _mm_mulhi_epi16(T3, k1k2); const __m128i c3 = _mm_unpackhi_epi64(b_c3, b_c3); const __m128i c4 = _mm_sub_epi16(c1d1, c2d2); const __m128i c = _mm_add_epi16(c3, c4); const __m128i d4u = _mm_add_epi16(c1d1, c2d2); const __m128i du = _mm_add_epi16(a_d3, d4u); const __m128i d = _mm_unpackhi_epi64(du, du); // Second pass. const __m128i comb_ab = _mm_unpacklo_epi64(a_d3, b_c3); const __m128i comb_dc = _mm_unpacklo_epi64(d, c); const __m128i tmp01 = _mm_add_epi16(comb_ab, comb_dc); const __m128i tmp32 = _mm_sub_epi16(comb_ab, comb_dc); const __m128i tmp23 = _mm_shuffle_epi32(tmp32, _MM_SHUFFLE(1, 0, 3, 2)); const __m128i shifted01 = _mm_srai_epi16(tmp01, 3); const __m128i shifted23 = _mm_srai_epi16(tmp23, 3); // a00 a01 a02 a03 a10 a11 a12 a13 // a20 a21 a22 a23 a30 a31 a32 a33 const __m128i transpose_0 = _mm_unpacklo_epi16(shifted01, shifted23); const __m128i transpose_1 = _mm_unpackhi_epi16(shifted01, shifted23); // a00 a20 a01 a21 a02 a22 a03 a23 // a10 a30 a11 a31 a12 a32 a13 a33 T01 = _mm_unpacklo_epi16(transpose_0, transpose_1); T23 = _mm_unpackhi_epi16(transpose_0, transpose_1); // a00 a10 a20 a30 a01 a11 a21 a31 // a02 a12 a22 a32 a03 a13 a23 a33 } // Add inverse transform to 'ref' and store. { // Load the reference(s). __m128i ref01, ref23, ref0123; int32_t buf[4]; // Load four bytes/pixels per line. const __m128i ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS])); const __m128i ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS])); const __m128i ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS])); const __m128i ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS])); ref01 = _mm_unpacklo_epi32(ref0, ref1); ref23 = _mm_unpacklo_epi32(ref2, ref3); // Convert to 16b. ref01 = _mm_unpacklo_epi8(ref01, zero); ref23 = _mm_unpacklo_epi8(ref23, zero); // Add the inverse transform(s). ref01 = _mm_add_epi16(ref01, T01); ref23 = _mm_add_epi16(ref23, T23); // Unsigned saturate to 8b. ref0123 = _mm_packus_epi16(ref01, ref23); _mm_storeu_si128((__m128i *)buf, ref0123); // Store four bytes/pixels per line. WebPInt32ToMem(&dst[0 * BPS], buf[0]); WebPInt32ToMem(&dst[1 * BPS], buf[1]); WebPInt32ToMem(&dst[2 * BPS], buf[2]); WebPInt32ToMem(&dst[3 * BPS], buf[3]); } } // Does two inverse transforms. static void ITransform_Two_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst) { // This implementation makes use of 16-bit fixed point versions of two // multiply constants: // K1 = sqrt(2) * cos (pi/8) ~= 85627 / 2^16 // K2 = sqrt(2) * sin (pi/8) ~= 35468 / 2^16 // // To be able to use signed 16-bit integers, we use the following trick to // have constants within range: // - Associated constants are obtained by subtracting the 16-bit fixed point // version of one: // k = K - (1 << 16) => K = k + (1 << 16) // K1 = 85267 => k1 = 20091 // K2 = 35468 => k2 = -30068 // - The multiplication of a variable by a constant become the sum of the // variable and the multiplication of that variable by the associated // constant: // (x * K) >> 16 = (x * (k + (1 << 16))) >> 16 = ((x * k ) >> 16) + x const __m128i k1 = _mm_set1_epi16(20091); const __m128i k2 = _mm_set1_epi16(-30068); __m128i T0, T1, T2, T3; // Load and concatenate the transform coefficients (we'll do two inverse // transforms in parallel). __m128i in0, in1, in2, in3; { const __m128i tmp0 = _mm_loadu_si128((const __m128i*)&in[0]); const __m128i tmp1 = _mm_loadu_si128((const __m128i*)&in[8]); const __m128i tmp2 = _mm_loadu_si128((const __m128i*)&in[16]); const __m128i tmp3 = _mm_loadu_si128((const __m128i*)&in[24]); in0 = _mm_unpacklo_epi64(tmp0, tmp2); in1 = _mm_unpackhi_epi64(tmp0, tmp2); in2 = _mm_unpacklo_epi64(tmp1, tmp3); in3 = _mm_unpackhi_epi64(tmp1, tmp3); // a00 a10 a20 a30 b00 b10 b20 b30 // a01 a11 a21 a31 b01 b11 b21 b31 // a02 a12 a22 a32 b02 b12 b22 b32 // a03 a13 a23 a33 b03 b13 b23 b33 } // Vertical pass and subsequent transpose. { // First pass, c and d calculations are longer because of the "trick" // multiplications. const __m128i a = _mm_add_epi16(in0, in2); const __m128i b = _mm_sub_epi16(in0, in2); // c = MUL(in1, K2) - MUL(in3, K1) = MUL(in1, k2) - MUL(in3, k1) + in1 - in3 const __m128i c1 = _mm_mulhi_epi16(in1, k2); const __m128i c2 = _mm_mulhi_epi16(in3, k1); const __m128i c3 = _mm_sub_epi16(in1, in3); const __m128i c4 = _mm_sub_epi16(c1, c2); const __m128i c = _mm_add_epi16(c3, c4); // d = MUL(in1, K1) + MUL(in3, K2) = MUL(in1, k1) + MUL(in3, k2) + in1 + in3 const __m128i d1 = _mm_mulhi_epi16(in1, k1); const __m128i d2 = _mm_mulhi_epi16(in3, k2); const __m128i d3 = _mm_add_epi16(in1, in3); const __m128i d4 = _mm_add_epi16(d1, d2); const __m128i d = _mm_add_epi16(d3, d4); // Second pass. const __m128i tmp0 = _mm_add_epi16(a, d); const __m128i tmp1 = _mm_add_epi16(b, c); const __m128i tmp2 = _mm_sub_epi16(b, c); const __m128i tmp3 = _mm_sub_epi16(a, d); // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&tmp0, &tmp1, &tmp2, &tmp3, &T0, &T1, &T2, &T3); } // Horizontal pass and subsequent transpose. { // First pass, c and d calculations are longer because of the "trick" // multiplications. const __m128i four = _mm_set1_epi16(4); const __m128i dc = _mm_add_epi16(T0, four); const __m128i a = _mm_add_epi16(dc, T2); const __m128i b = _mm_sub_epi16(dc, T2); // c = MUL(T1, K2) - MUL(T3, K1) = MUL(T1, k2) - MUL(T3, k1) + T1 - T3 const __m128i c1 = _mm_mulhi_epi16(T1, k2); const __m128i c2 = _mm_mulhi_epi16(T3, k1); const __m128i c3 = _mm_sub_epi16(T1, T3); const __m128i c4 = _mm_sub_epi16(c1, c2); const __m128i c = _mm_add_epi16(c3, c4); // d = MUL(T1, K1) + MUL(T3, K2) = MUL(T1, k1) + MUL(T3, k2) + T1 + T3 const __m128i d1 = _mm_mulhi_epi16(T1, k1); const __m128i d2 = _mm_mulhi_epi16(T3, k2); const __m128i d3 = _mm_add_epi16(T1, T3); const __m128i d4 = _mm_add_epi16(d1, d2); const __m128i d = _mm_add_epi16(d3, d4); // Second pass. const __m128i tmp0 = _mm_add_epi16(a, d); const __m128i tmp1 = _mm_add_epi16(b, c); const __m128i tmp2 = _mm_sub_epi16(b, c); const __m128i tmp3 = _mm_sub_epi16(a, d); const __m128i shifted0 = _mm_srai_epi16(tmp0, 3); const __m128i shifted1 = _mm_srai_epi16(tmp1, 3); const __m128i shifted2 = _mm_srai_epi16(tmp2, 3); const __m128i shifted3 = _mm_srai_epi16(tmp3, 3); // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&shifted0, &shifted1, &shifted2, &shifted3, &T0, &T1, &T2, &T3); } // Add inverse transform to 'ref' and store. { const __m128i zero = _mm_setzero_si128(); // Load the reference(s). __m128i ref0, ref1, ref2, ref3; // Load eight bytes/pixels per line. ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]); ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]); ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]); ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]); // Convert to 16b. ref0 = _mm_unpacklo_epi8(ref0, zero); ref1 = _mm_unpacklo_epi8(ref1, zero); ref2 = _mm_unpacklo_epi8(ref2, zero); ref3 = _mm_unpacklo_epi8(ref3, zero); // Add the inverse transform(s). ref0 = _mm_add_epi16(ref0, T0); ref1 = _mm_add_epi16(ref1, T1); ref2 = _mm_add_epi16(ref2, T2); ref3 = _mm_add_epi16(ref3, T3); // Unsigned saturate to 8b. ref0 = _mm_packus_epi16(ref0, ref0); ref1 = _mm_packus_epi16(ref1, ref1); ref2 = _mm_packus_epi16(ref2, ref2); ref3 = _mm_packus_epi16(ref3, ref3); // Store eight bytes/pixels per line. _mm_storel_epi64((__m128i*)&dst[0 * BPS], ref0); _mm_storel_epi64((__m128i*)&dst[1 * BPS], ref1); _mm_storel_epi64((__m128i*)&dst[2 * BPS], ref2); _mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3); } } // Does one or two inverse transforms. static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { if (do_two) { ITransform_Two_SSE2(ref, in, dst); } else { ITransform_One_SSE2(ref, in, dst); } } static void FTransformPass1_SSE2(const __m128i* const in01, const __m128i* const in23, __m128i* const out01, __m128i* const out32) { const __m128i k937 = _mm_set1_epi32(937); const __m128i k1812 = _mm_set1_epi32(1812); const __m128i k88p = _mm_set_epi16(8, 8, 8, 8, 8, 8, 8, 8); const __m128i k88m = _mm_set_epi16(-8, 8, -8, 8, -8, 8, -8, 8); const __m128i k5352_2217p = _mm_set_epi16(2217, 5352, 2217, 5352, 2217, 5352, 2217, 5352); const __m128i k5352_2217m = _mm_set_epi16(-5352, 2217, -5352, 2217, -5352, 2217, -5352, 2217); // *in01 = 00 01 10 11 02 03 12 13 // *in23 = 20 21 30 31 22 23 32 33 const __m128i shuf01_p = _mm_shufflehi_epi16(*in01, _MM_SHUFFLE(2, 3, 0, 1)); const __m128i shuf23_p = _mm_shufflehi_epi16(*in23, _MM_SHUFFLE(2, 3, 0, 1)); // 00 01 10 11 03 02 13 12 // 20 21 30 31 23 22 33 32 const __m128i s01 = _mm_unpacklo_epi64(shuf01_p, shuf23_p); const __m128i s32 = _mm_unpackhi_epi64(shuf01_p, shuf23_p); // 00 01 10 11 20 21 30 31 // 03 02 13 12 23 22 33 32 const __m128i a01 = _mm_add_epi16(s01, s32); const __m128i a32 = _mm_sub_epi16(s01, s32); // [d0 + d3 | d1 + d2 | ...] = [a0 a1 | a0' a1' | ... ] // [d0 - d3 | d1 - d2 | ...] = [a3 a2 | a3' a2' | ... ] const __m128i tmp0 = _mm_madd_epi16(a01, k88p); // [ (a0 + a1) << 3, ... ] const __m128i tmp2 = _mm_madd_epi16(a01, k88m); // [ (a0 - a1) << 3, ... ] const __m128i tmp1_1 = _mm_madd_epi16(a32, k5352_2217p); const __m128i tmp3_1 = _mm_madd_epi16(a32, k5352_2217m); const __m128i tmp1_2 = _mm_add_epi32(tmp1_1, k1812); const __m128i tmp3_2 = _mm_add_epi32(tmp3_1, k937); const __m128i tmp1 = _mm_srai_epi32(tmp1_2, 9); const __m128i tmp3 = _mm_srai_epi32(tmp3_2, 9); const __m128i s03 = _mm_packs_epi32(tmp0, tmp2); const __m128i s12 = _mm_packs_epi32(tmp1, tmp3); const __m128i s_lo = _mm_unpacklo_epi16(s03, s12); // 0 1 0 1 0 1... const __m128i s_hi = _mm_unpackhi_epi16(s03, s12); // 2 3 2 3 2 3 const __m128i v23 = _mm_unpackhi_epi32(s_lo, s_hi); *out01 = _mm_unpacklo_epi32(s_lo, s_hi); *out32 = _mm_shuffle_epi32(v23, _MM_SHUFFLE(1, 0, 3, 2)); // 3 2 3 2 3 2.. } static void FTransformPass2_SSE2(const __m128i* const v01, const __m128i* const v32, int16_t* out) { const __m128i zero = _mm_setzero_si128(); const __m128i seven = _mm_set1_epi16(7); const __m128i k5352_2217 = _mm_set_epi16(5352, 2217, 5352, 2217, 5352, 2217, 5352, 2217); const __m128i k2217_5352 = _mm_set_epi16(2217, -5352, 2217, -5352, 2217, -5352, 2217, -5352); const __m128i k12000_plus_one = _mm_set1_epi32(12000 + (1 << 16)); const __m128i k51000 = _mm_set1_epi32(51000); // Same operations are done on the (0,3) and (1,2) pairs. // a3 = v0 - v3 // a2 = v1 - v2 const __m128i a32 = _mm_sub_epi16(*v01, *v32); const __m128i a22 = _mm_unpackhi_epi64(a32, a32); const __m128i b23 = _mm_unpacklo_epi16(a22, a32); const __m128i c1 = _mm_madd_epi16(b23, k5352_2217); const __m128i c3 = _mm_madd_epi16(b23, k2217_5352); const __m128i d1 = _mm_add_epi32(c1, k12000_plus_one); const __m128i d3 = _mm_add_epi32(c3, k51000); const __m128i e1 = _mm_srai_epi32(d1, 16); const __m128i e3 = _mm_srai_epi32(d3, 16); // f1 = ((b3 * 5352 + b2 * 2217 + 12000) >> 16) // f3 = ((b3 * 2217 - b2 * 5352 + 51000) >> 16) const __m128i f1 = _mm_packs_epi32(e1, e1); const __m128i f3 = _mm_packs_epi32(e3, e3); // g1 = f1 + (a3 != 0); // The compare will return (0xffff, 0) for (==0, !=0). To turn that into the // desired (0, 1), we add one earlier through k12000_plus_one. // -> g1 = f1 + 1 - (a3 == 0) const __m128i g1 = _mm_add_epi16(f1, _mm_cmpeq_epi16(a32, zero)); // a0 = v0 + v3 // a1 = v1 + v2 const __m128i a01 = _mm_add_epi16(*v01, *v32); const __m128i a01_plus_7 = _mm_add_epi16(a01, seven); const __m128i a11 = _mm_unpackhi_epi64(a01, a01); const __m128i c0 = _mm_add_epi16(a01_plus_7, a11); const __m128i c2 = _mm_sub_epi16(a01_plus_7, a11); // d0 = (a0 + a1 + 7) >> 4; // d2 = (a0 - a1 + 7) >> 4; const __m128i d0 = _mm_srai_epi16(c0, 4); const __m128i d2 = _mm_srai_epi16(c2, 4); const __m128i d0_g1 = _mm_unpacklo_epi64(d0, g1); const __m128i d2_f3 = _mm_unpacklo_epi64(d2, f3); _mm_storeu_si128((__m128i*)&out[0], d0_g1); _mm_storeu_si128((__m128i*)&out[8], d2_f3); } static void FTransform_SSE2(const uint8_t* src, const uint8_t* ref, int16_t* out) { const __m128i zero = _mm_setzero_si128(); // Load src. const __m128i src0 = _mm_loadl_epi64((const __m128i*)&src[0 * BPS]); const __m128i src1 = _mm_loadl_epi64((const __m128i*)&src[1 * BPS]); const __m128i src2 = _mm_loadl_epi64((const __m128i*)&src[2 * BPS]); const __m128i src3 = _mm_loadl_epi64((const __m128i*)&src[3 * BPS]); // 00 01 02 03 * // 10 11 12 13 * // 20 21 22 23 * // 30 31 32 33 * // Shuffle. const __m128i src_0 = _mm_unpacklo_epi16(src0, src1); const __m128i src_1 = _mm_unpacklo_epi16(src2, src3); // 00 01 10 11 02 03 12 13 * * ... // 20 21 30 31 22 22 32 33 * * ... // Load ref. const __m128i ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]); const __m128i ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]); const __m128i ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]); const __m128i ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]); const __m128i ref_0 = _mm_unpacklo_epi16(ref0, ref1); const __m128i ref_1 = _mm_unpacklo_epi16(ref2, ref3); // Convert both to 16 bit. const __m128i src_0_16b = _mm_unpacklo_epi8(src_0, zero); const __m128i src_1_16b = _mm_unpacklo_epi8(src_1, zero); const __m128i ref_0_16b = _mm_unpacklo_epi8(ref_0, zero); const __m128i ref_1_16b = _mm_unpacklo_epi8(ref_1, zero); // Compute the difference. const __m128i row01 = _mm_sub_epi16(src_0_16b, ref_0_16b); const __m128i row23 = _mm_sub_epi16(src_1_16b, ref_1_16b); __m128i v01, v32; // First pass FTransformPass1_SSE2(&row01, &row23, &v01, &v32); // Second pass FTransformPass2_SSE2(&v01, &v32, out); } static void FTransform2_SSE2(const uint8_t* src, const uint8_t* ref, int16_t* out) { const __m128i zero = _mm_setzero_si128(); // Load src and convert to 16b. const __m128i src0 = _mm_loadl_epi64((const __m128i*)&src[0 * BPS]); const __m128i src1 = _mm_loadl_epi64((const __m128i*)&src[1 * BPS]); const __m128i src2 = _mm_loadl_epi64((const __m128i*)&src[2 * BPS]); const __m128i src3 = _mm_loadl_epi64((const __m128i*)&src[3 * BPS]); const __m128i src_0 = _mm_unpacklo_epi8(src0, zero); const __m128i src_1 = _mm_unpacklo_epi8(src1, zero); const __m128i src_2 = _mm_unpacklo_epi8(src2, zero); const __m128i src_3 = _mm_unpacklo_epi8(src3, zero); // Load ref and convert to 16b. const __m128i ref0 = _mm_loadl_epi64((const __m128i*)&ref[0 * BPS]); const __m128i ref1 = _mm_loadl_epi64((const __m128i*)&ref[1 * BPS]); const __m128i ref2 = _mm_loadl_epi64((const __m128i*)&ref[2 * BPS]); const __m128i ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]); const __m128i ref_0 = _mm_unpacklo_epi8(ref0, zero); const __m128i ref_1 = _mm_unpacklo_epi8(ref1, zero); const __m128i ref_2 = _mm_unpacklo_epi8(ref2, zero); const __m128i ref_3 = _mm_unpacklo_epi8(ref3, zero); // Compute difference. -> 00 01 02 03 00' 01' 02' 03' const __m128i diff0 = _mm_sub_epi16(src_0, ref_0); const __m128i diff1 = _mm_sub_epi16(src_1, ref_1); const __m128i diff2 = _mm_sub_epi16(src_2, ref_2); const __m128i diff3 = _mm_sub_epi16(src_3, ref_3); // Unpack and shuffle // 00 01 02 03 0 0 0 0 // 10 11 12 13 0 0 0 0 // 20 21 22 23 0 0 0 0 // 30 31 32 33 0 0 0 0 const __m128i shuf01l = _mm_unpacklo_epi32(diff0, diff1); const __m128i shuf23l = _mm_unpacklo_epi32(diff2, diff3); const __m128i shuf01h = _mm_unpackhi_epi32(diff0, diff1); const __m128i shuf23h = _mm_unpackhi_epi32(diff2, diff3); __m128i v01l, v32l; __m128i v01h, v32h; // First pass FTransformPass1_SSE2(&shuf01l, &shuf23l, &v01l, &v32l); FTransformPass1_SSE2(&shuf01h, &shuf23h, &v01h, &v32h); // Second pass FTransformPass2_SSE2(&v01l, &v32l, out + 0); FTransformPass2_SSE2(&v01h, &v32h, out + 16); } static void FTransformWHTRow_SSE2(const int16_t* const in, __m128i* const out) { const __m128i kMult = _mm_set_epi16(-1, 1, -1, 1, 1, 1, 1, 1); const __m128i src0 = _mm_loadl_epi64((__m128i*)&in[0 * 16]); const __m128i src1 = _mm_loadl_epi64((__m128i*)&in[1 * 16]); const __m128i src2 = _mm_loadl_epi64((__m128i*)&in[2 * 16]); const __m128i src3 = _mm_loadl_epi64((__m128i*)&in[3 * 16]); const __m128i A01 = _mm_unpacklo_epi16(src0, src1); // A0 A1 | ... const __m128i A23 = _mm_unpacklo_epi16(src2, src3); // A2 A3 | ... const __m128i B0 = _mm_adds_epi16(A01, A23); // a0 | a1 | ... const __m128i B1 = _mm_subs_epi16(A01, A23); // a3 | a2 | ... const __m128i C0 = _mm_unpacklo_epi32(B0, B1); // a0 | a1 | a3 | a2 | ... const __m128i C1 = _mm_unpacklo_epi32(B1, B0); // a3 | a2 | a0 | a1 | ... const __m128i D = _mm_unpacklo_epi64(C0, C1); // a0 a1 a3 a2 a3 a2 a0 a1 *out = _mm_madd_epi16(D, kMult); } static void FTransformWHT_SSE2(const int16_t* in, int16_t* out) { // Input is 12b signed. __m128i row0, row1, row2, row3; // Rows are 14b signed. FTransformWHTRow_SSE2(in + 0 * 64, &row0); FTransformWHTRow_SSE2(in + 1 * 64, &row1); FTransformWHTRow_SSE2(in + 2 * 64, &row2); FTransformWHTRow_SSE2(in + 3 * 64, &row3); { // The a* are 15b signed. const __m128i a0 = _mm_add_epi32(row0, row2); const __m128i a1 = _mm_add_epi32(row1, row3); const __m128i a2 = _mm_sub_epi32(row1, row3); const __m128i a3 = _mm_sub_epi32(row0, row2); const __m128i a0a3 = _mm_packs_epi32(a0, a3); const __m128i a1a2 = _mm_packs_epi32(a1, a2); // The b* are 16b signed. const __m128i b0b1 = _mm_add_epi16(a0a3, a1a2); const __m128i b3b2 = _mm_sub_epi16(a0a3, a1a2); const __m128i tmp_b2b3 = _mm_unpackhi_epi64(b3b2, b3b2); const __m128i b2b3 = _mm_unpacklo_epi64(tmp_b2b3, b3b2); _mm_storeu_si128((__m128i*)&out[0], _mm_srai_epi16(b0b1, 1)); _mm_storeu_si128((__m128i*)&out[8], _mm_srai_epi16(b2b3, 1)); } } //------------------------------------------------------------------------------ // Compute susceptibility based on DCT-coeff histograms: // the higher, the "easier" the macroblock is to compress. static void CollectHistogram_SSE2(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { const __m128i zero = _mm_setzero_si128(); const __m128i max_coeff_thresh = _mm_set1_epi16(MAX_COEFF_THRESH); int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; for (j = start_block; j < end_block; ++j) { int16_t out[16]; int k; FTransform_SSE2(ref + VP8DspScan[j], pred + VP8DspScan[j], out); // Convert coefficients to bin (within out[]). { // Load. const __m128i out0 = _mm_loadu_si128((__m128i*)&out[0]); const __m128i out1 = _mm_loadu_si128((__m128i*)&out[8]); const __m128i d0 = _mm_sub_epi16(zero, out0); const __m128i d1 = _mm_sub_epi16(zero, out1); const __m128i abs0 = _mm_max_epi16(out0, d0); // abs(v), 16b const __m128i abs1 = _mm_max_epi16(out1, d1); // v = abs(out) >> 3 const __m128i v0 = _mm_srai_epi16(abs0, 3); const __m128i v1 = _mm_srai_epi16(abs1, 3); // bin = min(v, MAX_COEFF_THRESH) const __m128i bin0 = _mm_min_epi16(v0, max_coeff_thresh); const __m128i bin1 = _mm_min_epi16(v1, max_coeff_thresh); // Store. _mm_storeu_si128((__m128i*)&out[0], bin0); _mm_storeu_si128((__m128i*)&out[8], bin1); } // Convert coefficients to bin. for (k = 0; k < 16; ++k) { ++distribution[out[k]]; } } VP8SetHistogramData(distribution, histo); } //------------------------------------------------------------------------------ // Intra predictions // helper for chroma-DC predictions static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) { int j; const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), values); } } static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) { int j; const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 16; ++j) { _mm_store_si128((__m128i*)(dst + j * BPS), values); } } static WEBP_INLINE void Fill_SSE2(uint8_t* dst, int value, int size) { if (size == 4) { int j; for (j = 0; j < 4; ++j) { memset(dst + j * BPS, value, 4); } } else if (size == 8) { Put8x8uv_SSE2(value, dst); } else { Put16_SSE2(value, dst); } } static WEBP_INLINE void VE8uv_SSE2(uint8_t* dst, const uint8_t* top) { int j; const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), top_values); } } static WEBP_INLINE void VE16_SSE2(uint8_t* dst, const uint8_t* top) { const __m128i top_values = _mm_load_si128((const __m128i*)top); int j; for (j = 0; j < 16; ++j) { _mm_store_si128((__m128i*)(dst + j * BPS), top_values); } } static WEBP_INLINE void VerticalPred_SSE2(uint8_t* dst, const uint8_t* top, int size) { if (top != NULL) { if (size == 8) { VE8uv_SSE2(dst, top); } else { VE16_SSE2(dst, top); } } else { Fill_SSE2(dst, 127, size); } } static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) { int j; for (j = 0; j < 8; ++j) { const __m128i values = _mm_set1_epi8((char)left[j]); _mm_storel_epi64((__m128i*)dst, values); dst += BPS; } } static WEBP_INLINE void HE16_SSE2(uint8_t* dst, const uint8_t* left) { int j; for (j = 0; j < 16; ++j) { const __m128i values = _mm_set1_epi8((char)left[j]); _mm_store_si128((__m128i*)dst, values); dst += BPS; } } static WEBP_INLINE void HorizontalPred_SSE2(uint8_t* dst, const uint8_t* left, int size) { if (left != NULL) { if (size == 8) { HE8uv_SSE2(dst, left); } else { HE16_SSE2(dst, left); } } else { Fill_SSE2(dst, 129, size); } } static WEBP_INLINE void TM_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top, int size) { const __m128i zero = _mm_setzero_si128(); int y; if (size == 8) { const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); for (y = 0; y < 8; ++y, dst += BPS) { const int val = left[y] - left[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); _mm_storel_epi64((__m128i*)dst, out); } } else { const __m128i top_values = _mm_load_si128((const __m128i*)top); const __m128i top_base_0 = _mm_unpacklo_epi8(top_values, zero); const __m128i top_base_1 = _mm_unpackhi_epi8(top_values, zero); for (y = 0; y < 16; ++y, dst += BPS) { const int val = left[y] - left[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out_0 = _mm_add_epi16(base, top_base_0); const __m128i out_1 = _mm_add_epi16(base, top_base_1); const __m128i out = _mm_packus_epi16(out_0, out_1); _mm_store_si128((__m128i*)dst, out); } } } static WEBP_INLINE void TrueMotion_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top, int size) { if (left != NULL) { if (top != NULL) { TM_SSE2(dst, left, top, size); } else { HorizontalPred_SSE2(dst, left, size); } } else { // true motion without left samples (hence: with default 129 value) // is equivalent to VE prediction where you just copy the top samples. // Note that if top samples are not available, the default value is // then 129, and not 127 as in the VerticalPred case. if (top != NULL) { VerticalPred_SSE2(dst, top, size); } else { Fill_SSE2(dst, 129, size); } } } static WEBP_INLINE void DC8uv_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); const __m128i left_values = _mm_loadl_epi64((const __m128i*)left); const __m128i combined = _mm_unpacklo_epi64(top_values, left_values); const int DC = VP8HorizontalAdd8b(&combined) + 8; Put8x8uv_SSE2(DC >> 4, dst); } static WEBP_INLINE void DC8uvNoLeft_SSE2(uint8_t* dst, const uint8_t* top) { const __m128i zero = _mm_setzero_si128(); const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); const __m128i sum = _mm_sad_epu8(top_values, zero); const int DC = _mm_cvtsi128_si32(sum) + 4; Put8x8uv_SSE2(DC >> 3, dst); } static WEBP_INLINE void DC8uvNoTop_SSE2(uint8_t* dst, const uint8_t* left) { // 'left' is contiguous so we can reuse the top summation. DC8uvNoLeft_SSE2(dst, left); } static WEBP_INLINE void DC8uvNoTopLeft_SSE2(uint8_t* dst) { Put8x8uv_SSE2(0x80, dst); } static WEBP_INLINE void DC8uvMode_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { if (top != NULL) { if (left != NULL) { // top and left present DC8uv_SSE2(dst, left, top); } else { // top, but no left DC8uvNoLeft_SSE2(dst, top); } } else if (left != NULL) { // left but no top DC8uvNoTop_SSE2(dst, left); } else { // no top, no left, nothing. DC8uvNoTopLeft_SSE2(dst); } } static WEBP_INLINE void DC16_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { const __m128i top_row = _mm_load_si128((const __m128i*)top); const __m128i left_row = _mm_load_si128((const __m128i*)left); const int DC = VP8HorizontalAdd8b(&top_row) + VP8HorizontalAdd8b(&left_row) + 16; Put16_SSE2(DC >> 5, dst); } static WEBP_INLINE void DC16NoLeft_SSE2(uint8_t* dst, const uint8_t* top) { const __m128i top_row = _mm_load_si128((const __m128i*)top); const int DC = VP8HorizontalAdd8b(&top_row) + 8; Put16_SSE2(DC >> 4, dst); } static WEBP_INLINE void DC16NoTop_SSE2(uint8_t* dst, const uint8_t* left) { // 'left' is contiguous so we can reuse the top summation. DC16NoLeft_SSE2(dst, left); } static WEBP_INLINE void DC16NoTopLeft_SSE2(uint8_t* dst) { Put16_SSE2(0x80, dst); } static WEBP_INLINE void DC16Mode_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { if (top != NULL) { if (left != NULL) { // top and left present DC16_SSE2(dst, left, top); } else { // top, but no left DC16NoLeft_SSE2(dst, top); } } else if (left != NULL) { // left but no top DC16NoTop_SSE2(dst, left); } else { // no top, no left, nothing. DC16NoTopLeft_SSE2(dst); } } //------------------------------------------------------------------------------ // 4x4 predictions #define DST(x, y) dst[(x) + (y) * BPS] #define AVG3(a, b, c) (((a) + 2 * (b) + (c) + 2) >> 2) #define AVG2(a, b) (((a) + (b) + 1) >> 1) // We use the following 8b-arithmetic tricks: // (a + 2 * b + c + 2) >> 2 = (AC + b + 1) >> 1 // where: AC = (a + c) >> 1 = [(a + c + 1) >> 1] - [(a^c) & 1] // and: // (a + 2 * b + c + 2) >> 2 = (AB + BC + 1) >> 1 - (ab|bc)&lsb // where: AC = (a + b + 1) >> 1, BC = (b + c + 1) >> 1 // and ab = a ^ b, bc = b ^ c, lsb = (AC^BC)&1 static WEBP_INLINE void VE4_SSE2(uint8_t* dst, const uint8_t* top) { // vertical const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((__m128i*)(top - 1)); const __m128i BCDEFGH0 = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH00 = _mm_srli_si128(ABCDEFGH, 2); const __m128i a = _mm_avg_epu8(ABCDEFGH, CDEFGH00); const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one); const __m128i b = _mm_subs_epu8(a, lsb); const __m128i avg = _mm_avg_epu8(b, BCDEFGH0); const int vals = _mm_cvtsi128_si32(avg); int i; for (i = 0; i < 4; ++i) { WebPInt32ToMem(dst + i * BPS, vals); } } static WEBP_INLINE void HE4_SSE2(uint8_t* dst, const uint8_t* top) { // horizontal const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; WebPUint32ToMem(dst + 0 * BPS, 0x01010101U * AVG3(X, I, J)); WebPUint32ToMem(dst + 1 * BPS, 0x01010101U * AVG3(I, J, K)); WebPUint32ToMem(dst + 2 * BPS, 0x01010101U * AVG3(J, K, L)); WebPUint32ToMem(dst + 3 * BPS, 0x01010101U * AVG3(K, L, L)); } static WEBP_INLINE void DC4_SSE2(uint8_t* dst, const uint8_t* top) { uint32_t dc = 4; int i; for (i = 0; i < 4; ++i) dc += top[i] + top[-5 + i]; Fill_SSE2(dst, dc >> 3, 4); } static WEBP_INLINE void LD4_SSE2(uint8_t* dst, const uint8_t* top) { // Down-Left const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((const __m128i*)top); const __m128i BCDEFGH0 = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH00 = _mm_srli_si128(ABCDEFGH, 2); const __m128i CDEFGHH0 = _mm_insert_epi16(CDEFGH00, top[7], 3); const __m128i avg1 = _mm_avg_epu8(ABCDEFGH, CDEFGHH0); const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static WEBP_INLINE void VR4_SSE2(uint8_t* dst, const uint8_t* top) { // Vertical-Right const __m128i one = _mm_set1_epi8(1); const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int X = top[-1]; const __m128i XABCD = _mm_loadl_epi64((const __m128i*)(top - 1)); const __m128i ABCD0 = _mm_srli_si128(XABCD, 1); const __m128i abcd = _mm_avg_epu8(XABCD, ABCD0); const __m128i _XABCD = _mm_slli_si128(XABCD, 1); const __m128i IXABCD = _mm_insert_epi16(_XABCD, (short)(I | (X << 8)), 0); const __m128i avg1 = _mm_avg_epu8(IXABCD, ABCD0); const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i efgh = _mm_avg_epu8(avg2, XABCD); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); // these two are hard to implement in SSE2, so we keep the C-version: DST(0, 2) = AVG3(J, I, X); DST(0, 3) = AVG3(K, J, I); } static WEBP_INLINE void VL4_SSE2(uint8_t* dst, const uint8_t* top) { // Vertical-Left const __m128i one = _mm_set1_epi8(1); const __m128i ABCDEFGH = _mm_loadl_epi64((const __m128i*)top); const __m128i BCDEFGH_ = _mm_srli_si128(ABCDEFGH, 1); const __m128i CDEFGH__ = _mm_srli_si128(ABCDEFGH, 2); const __m128i avg1 = _mm_avg_epu8(ABCDEFGH, BCDEFGH_); const __m128i avg2 = _mm_avg_epu8(CDEFGH__, BCDEFGH_); const __m128i avg3 = _mm_avg_epu8(avg1, avg2); const __m128i lsb1 = _mm_and_si128(_mm_xor_si128(avg1, avg2), one); const __m128i ab = _mm_xor_si128(ABCDEFGH, BCDEFGH_); const __m128i bc = _mm_xor_si128(CDEFGH__, BCDEFGH_); const __m128i abbc = _mm_or_si128(ab, bc); const __m128i lsb2 = _mm_and_si128(abbc, lsb1); const __m128i avg4 = _mm_subs_epu8(avg3, lsb2); const uint32_t extra_out = (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); // these two are hard to get and irregular DST(3, 2) = (extra_out >> 0) & 0xff; DST(3, 3) = (extra_out >> 8) & 0xff; } static WEBP_INLINE void RD4_SSE2(uint8_t* dst, const uint8_t* top) { // Down-right const __m128i one = _mm_set1_epi8(1); const __m128i LKJIXABC = _mm_loadl_epi64((const __m128i*)(top - 5)); const __m128i LKJIXABCD = _mm_insert_epi16(LKJIXABC, top[3], 4); const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1); const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2); const __m128i avg1 = _mm_avg_epu8(JIXABCD__, LKJIXABCD); const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_); WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static WEBP_INLINE void HU4_SSE2(uint8_t* dst, const uint8_t* top) { const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; DST(0, 0) = AVG2(I, J); DST(2, 0) = DST(0, 1) = AVG2(J, K); DST(2, 1) = DST(0, 2) = AVG2(K, L); DST(1, 0) = AVG3(I, J, K); DST(3, 0) = DST(1, 1) = AVG3(J, K, L); DST(3, 1) = DST(1, 2) = AVG3(K, L, L); DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L; } static WEBP_INLINE void HD4_SSE2(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; const int A = top[0]; const int B = top[1]; const int C = top[2]; DST(0, 0) = DST(2, 1) = AVG2(I, X); DST(0, 1) = DST(2, 2) = AVG2(J, I); DST(0, 2) = DST(2, 3) = AVG2(K, J); DST(0, 3) = AVG2(L, K); DST(3, 0) = AVG3(A, B, C); DST(2, 0) = AVG3(X, A, B); DST(1, 0) = DST(3, 1) = AVG3(I, X, A); DST(1, 1) = DST(3, 2) = AVG3(J, I, X); DST(1, 2) = DST(3, 3) = AVG3(K, J, I); DST(1, 3) = AVG3(L, K, J); } static WEBP_INLINE void TM4_SSE2(uint8_t* dst, const uint8_t* top) { const __m128i zero = _mm_setzero_si128(); const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top)); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); int y; for (y = 0; y < 4; ++y, dst += BPS) { const int val = top[-2 - y] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); WebPInt32ToMem(dst, _mm_cvtsi128_si32(out)); } } #undef DST #undef AVG3 #undef AVG2 //------------------------------------------------------------------------------ // luma 4x4 prediction // Left samples are top[-5 .. -2], top_left is top[-1], top are // located at top[0..3], and top right is top[4..7] static void Intra4Preds_SSE2(uint8_t* dst, const uint8_t* top) { DC4_SSE2(I4DC4 + dst, top); TM4_SSE2(I4TM4 + dst, top); VE4_SSE2(I4VE4 + dst, top); HE4_SSE2(I4HE4 + dst, top); RD4_SSE2(I4RD4 + dst, top); VR4_SSE2(I4VR4 + dst, top); LD4_SSE2(I4LD4 + dst, top); VL4_SSE2(I4VL4 + dst, top); HD4_SSE2(I4HD4 + dst, top); HU4_SSE2(I4HU4 + dst, top); } //------------------------------------------------------------------------------ // Chroma 8x8 prediction (paragraph 12.2) static void IntraChromaPreds_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { // U block DC8uvMode_SSE2(C8DC8 + dst, left, top); VerticalPred_SSE2(C8VE8 + dst, top, 8); HorizontalPred_SSE2(C8HE8 + dst, left, 8); TrueMotion_SSE2(C8TM8 + dst, left, top, 8); // V block dst += 8; if (top != NULL) top += 8; if (left != NULL) left += 16; DC8uvMode_SSE2(C8DC8 + dst, left, top); VerticalPred_SSE2(C8VE8 + dst, top, 8); HorizontalPred_SSE2(C8HE8 + dst, left, 8); TrueMotion_SSE2(C8TM8 + dst, left, top, 8); } //------------------------------------------------------------------------------ // luma 16x16 prediction (paragraph 12.3) static void Intra16Preds_SSE2(uint8_t* dst, const uint8_t* left, const uint8_t* top) { DC16Mode_SSE2(I16DC16 + dst, left, top); VerticalPred_SSE2(I16VE16 + dst, top, 16); HorizontalPred_SSE2(I16HE16 + dst, left, 16); TrueMotion_SSE2(I16TM16 + dst, left, top, 16); } //------------------------------------------------------------------------------ // Metric static WEBP_INLINE void SubtractAndAccumulate_SSE2(const __m128i a, const __m128i b, __m128i* const sum) { // take abs(a-b) in 8b const __m128i a_b = _mm_subs_epu8(a, b); const __m128i b_a = _mm_subs_epu8(b, a); const __m128i abs_a_b = _mm_or_si128(a_b, b_a); // zero-extend to 16b const __m128i zero = _mm_setzero_si128(); const __m128i C0 = _mm_unpacklo_epi8(abs_a_b, zero); const __m128i C1 = _mm_unpackhi_epi8(abs_a_b, zero); // multiply with self const __m128i sum1 = _mm_madd_epi16(C0, C0); const __m128i sum2 = _mm_madd_epi16(C1, C1); *sum = _mm_add_epi32(sum1, sum2); } static WEBP_INLINE int SSE_16xN_SSE2(const uint8_t* a, const uint8_t* b, int num_pairs) { __m128i sum = _mm_setzero_si128(); int32_t tmp[4]; int i; for (i = 0; i < num_pairs; ++i) { const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[BPS * 0]); const __m128i b0 = _mm_loadu_si128((const __m128i*)&b[BPS * 0]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[BPS * 1]); const __m128i b1 = _mm_loadu_si128((const __m128i*)&b[BPS * 1]); __m128i sum1, sum2; SubtractAndAccumulate_SSE2(a0, b0, &sum1); SubtractAndAccumulate_SSE2(a1, b1, &sum2); sum = _mm_add_epi32(sum, _mm_add_epi32(sum1, sum2)); a += 2 * BPS; b += 2 * BPS; } _mm_storeu_si128((__m128i*)tmp, sum); return (tmp[3] + tmp[2] + tmp[1] + tmp[0]); } static int SSE16x16_SSE2(const uint8_t* a, const uint8_t* b) { return SSE_16xN_SSE2(a, b, 8); } static int SSE16x8_SSE2(const uint8_t* a, const uint8_t* b) { return SSE_16xN_SSE2(a, b, 4); } #define LOAD_8x16b(ptr) \ _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(ptr)), zero) static int SSE8x8_SSE2(const uint8_t* a, const uint8_t* b) { const __m128i zero = _mm_setzero_si128(); int num_pairs = 4; __m128i sum = zero; int32_t tmp[4]; while (num_pairs-- > 0) { const __m128i a0 = LOAD_8x16b(&a[BPS * 0]); const __m128i a1 = LOAD_8x16b(&a[BPS * 1]); const __m128i b0 = LOAD_8x16b(&b[BPS * 0]); const __m128i b1 = LOAD_8x16b(&b[BPS * 1]); // subtract const __m128i c0 = _mm_subs_epi16(a0, b0); const __m128i c1 = _mm_subs_epi16(a1, b1); // multiply/accumulate with self const __m128i d0 = _mm_madd_epi16(c0, c0); const __m128i d1 = _mm_madd_epi16(c1, c1); // collect const __m128i sum01 = _mm_add_epi32(d0, d1); sum = _mm_add_epi32(sum, sum01); a += 2 * BPS; b += 2 * BPS; } _mm_storeu_si128((__m128i*)tmp, sum); return (tmp[3] + tmp[2] + tmp[1] + tmp[0]); } #undef LOAD_8x16b static int SSE4x4_SSE2(const uint8_t* a, const uint8_t* b) { const __m128i zero = _mm_setzero_si128(); // Load values. Note that we read 8 pixels instead of 4, // but the a/b buffers are over-allocated to that effect. const __m128i a0 = _mm_loadl_epi64((const __m128i*)&a[BPS * 0]); const __m128i a1 = _mm_loadl_epi64((const __m128i*)&a[BPS * 1]); const __m128i a2 = _mm_loadl_epi64((const __m128i*)&a[BPS * 2]); const __m128i a3 = _mm_loadl_epi64((const __m128i*)&a[BPS * 3]); const __m128i b0 = _mm_loadl_epi64((const __m128i*)&b[BPS * 0]); const __m128i b1 = _mm_loadl_epi64((const __m128i*)&b[BPS * 1]); const __m128i b2 = _mm_loadl_epi64((const __m128i*)&b[BPS * 2]); const __m128i b3 = _mm_loadl_epi64((const __m128i*)&b[BPS * 3]); // Combine pair of lines. const __m128i a01 = _mm_unpacklo_epi32(a0, a1); const __m128i a23 = _mm_unpacklo_epi32(a2, a3); const __m128i b01 = _mm_unpacklo_epi32(b0, b1); const __m128i b23 = _mm_unpacklo_epi32(b2, b3); // Convert to 16b. const __m128i a01s = _mm_unpacklo_epi8(a01, zero); const __m128i a23s = _mm_unpacklo_epi8(a23, zero); const __m128i b01s = _mm_unpacklo_epi8(b01, zero); const __m128i b23s = _mm_unpacklo_epi8(b23, zero); // subtract, square and accumulate const __m128i d0 = _mm_subs_epi16(a01s, b01s); const __m128i d1 = _mm_subs_epi16(a23s, b23s); const __m128i e0 = _mm_madd_epi16(d0, d0); const __m128i e1 = _mm_madd_epi16(d1, d1); const __m128i sum = _mm_add_epi32(e0, e1); int32_t tmp[4]; _mm_storeu_si128((__m128i*)tmp, sum); return (tmp[3] + tmp[2] + tmp[1] + tmp[0]); } //------------------------------------------------------------------------------ static void Mean16x4_SSE2(const uint8_t* ref, uint32_t dc[4]) { const __m128i mask = _mm_set1_epi16(0x00ff); const __m128i a0 = _mm_loadu_si128((const __m128i*)&ref[BPS * 0]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&ref[BPS * 1]); const __m128i a2 = _mm_loadu_si128((const __m128i*)&ref[BPS * 2]); const __m128i a3 = _mm_loadu_si128((const __m128i*)&ref[BPS * 3]); const __m128i b0 = _mm_srli_epi16(a0, 8); // hi byte const __m128i b1 = _mm_srli_epi16(a1, 8); const __m128i b2 = _mm_srli_epi16(a2, 8); const __m128i b3 = _mm_srli_epi16(a3, 8); const __m128i c0 = _mm_and_si128(a0, mask); // lo byte const __m128i c1 = _mm_and_si128(a1, mask); const __m128i c2 = _mm_and_si128(a2, mask); const __m128i c3 = _mm_and_si128(a3, mask); const __m128i d0 = _mm_add_epi32(b0, c0); const __m128i d1 = _mm_add_epi32(b1, c1); const __m128i d2 = _mm_add_epi32(b2, c2); const __m128i d3 = _mm_add_epi32(b3, c3); const __m128i e0 = _mm_add_epi32(d0, d1); const __m128i e1 = _mm_add_epi32(d2, d3); const __m128i f0 = _mm_add_epi32(e0, e1); uint16_t tmp[8]; _mm_storeu_si128((__m128i*)tmp, f0); dc[0] = tmp[0] + tmp[1]; dc[1] = tmp[2] + tmp[3]; dc[2] = tmp[4] + tmp[5]; dc[3] = tmp[6] + tmp[7]; } //------------------------------------------------------------------------------ // Texture distortion // // We try to match the spectral content (weighted) between source and // reconstructed samples. // Hadamard transform // Returns the weighted sum of the absolute value of transformed coefficients. // w[] contains a row-major 4 by 4 symmetric matrix. static int TTransform_SSE2(const uint8_t* inA, const uint8_t* inB, const uint16_t* const w) { int32_t sum[4]; __m128i tmp_0, tmp_1, tmp_2, tmp_3; const __m128i zero = _mm_setzero_si128(); // Load and combine inputs. { const __m128i inA_0 = _mm_loadl_epi64((const __m128i*)&inA[BPS * 0]); const __m128i inA_1 = _mm_loadl_epi64((const __m128i*)&inA[BPS * 1]); const __m128i inA_2 = _mm_loadl_epi64((const __m128i*)&inA[BPS * 2]); const __m128i inA_3 = _mm_loadl_epi64((const __m128i*)&inA[BPS * 3]); const __m128i inB_0 = _mm_loadl_epi64((const __m128i*)&inB[BPS * 0]); const __m128i inB_1 = _mm_loadl_epi64((const __m128i*)&inB[BPS * 1]); const __m128i inB_2 = _mm_loadl_epi64((const __m128i*)&inB[BPS * 2]); const __m128i inB_3 = _mm_loadl_epi64((const __m128i*)&inB[BPS * 3]); // Combine inA and inB (we'll do two transforms in parallel). const __m128i inAB_0 = _mm_unpacklo_epi32(inA_0, inB_0); const __m128i inAB_1 = _mm_unpacklo_epi32(inA_1, inB_1); const __m128i inAB_2 = _mm_unpacklo_epi32(inA_2, inB_2); const __m128i inAB_3 = _mm_unpacklo_epi32(inA_3, inB_3); tmp_0 = _mm_unpacklo_epi8(inAB_0, zero); tmp_1 = _mm_unpacklo_epi8(inAB_1, zero); tmp_2 = _mm_unpacklo_epi8(inAB_2, zero); tmp_3 = _mm_unpacklo_epi8(inAB_3, zero); // a00 a01 a02 a03 b00 b01 b02 b03 // a10 a11 a12 a13 b10 b11 b12 b13 // a20 a21 a22 a23 b20 b21 b22 b23 // a30 a31 a32 a33 b30 b31 b32 b33 } // Vertical pass first to avoid a transpose (vertical and horizontal passes // are commutative because w/kWeightY is symmetric) and subsequent transpose. { // Calculate a and b (two 4x4 at once). const __m128i a0 = _mm_add_epi16(tmp_0, tmp_2); const __m128i a1 = _mm_add_epi16(tmp_1, tmp_3); const __m128i a2 = _mm_sub_epi16(tmp_1, tmp_3); const __m128i a3 = _mm_sub_epi16(tmp_0, tmp_2); const __m128i b0 = _mm_add_epi16(a0, a1); const __m128i b1 = _mm_add_epi16(a3, a2); const __m128i b2 = _mm_sub_epi16(a3, a2); const __m128i b3 = _mm_sub_epi16(a0, a1); // a00 a01 a02 a03 b00 b01 b02 b03 // a10 a11 a12 a13 b10 b11 b12 b13 // a20 a21 a22 a23 b20 b21 b22 b23 // a30 a31 a32 a33 b30 b31 b32 b33 // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&b0, &b1, &b2, &b3, &tmp_0, &tmp_1, &tmp_2, &tmp_3); } // Horizontal pass and difference of weighted sums. { // Load all inputs. const __m128i w_0 = _mm_loadu_si128((const __m128i*)&w[0]); const __m128i w_8 = _mm_loadu_si128((const __m128i*)&w[8]); // Calculate a and b (two 4x4 at once). const __m128i a0 = _mm_add_epi16(tmp_0, tmp_2); const __m128i a1 = _mm_add_epi16(tmp_1, tmp_3); const __m128i a2 = _mm_sub_epi16(tmp_1, tmp_3); const __m128i a3 = _mm_sub_epi16(tmp_0, tmp_2); const __m128i b0 = _mm_add_epi16(a0, a1); const __m128i b1 = _mm_add_epi16(a3, a2); const __m128i b2 = _mm_sub_epi16(a3, a2); const __m128i b3 = _mm_sub_epi16(a0, a1); // Separate the transforms of inA and inB. __m128i A_b0 = _mm_unpacklo_epi64(b0, b1); __m128i A_b2 = _mm_unpacklo_epi64(b2, b3); __m128i B_b0 = _mm_unpackhi_epi64(b0, b1); __m128i B_b2 = _mm_unpackhi_epi64(b2, b3); { const __m128i d0 = _mm_sub_epi16(zero, A_b0); const __m128i d1 = _mm_sub_epi16(zero, A_b2); const __m128i d2 = _mm_sub_epi16(zero, B_b0); const __m128i d3 = _mm_sub_epi16(zero, B_b2); A_b0 = _mm_max_epi16(A_b0, d0); // abs(v), 16b A_b2 = _mm_max_epi16(A_b2, d1); B_b0 = _mm_max_epi16(B_b0, d2); B_b2 = _mm_max_epi16(B_b2, d3); } // weighted sums A_b0 = _mm_madd_epi16(A_b0, w_0); A_b2 = _mm_madd_epi16(A_b2, w_8); B_b0 = _mm_madd_epi16(B_b0, w_0); B_b2 = _mm_madd_epi16(B_b2, w_8); A_b0 = _mm_add_epi32(A_b0, A_b2); B_b0 = _mm_add_epi32(B_b0, B_b2); // difference of weighted sums A_b0 = _mm_sub_epi32(A_b0, B_b0); _mm_storeu_si128((__m128i*)&sum[0], A_b0); } return sum[0] + sum[1] + sum[2] + sum[3]; } static int Disto4x4_SSE2(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { const int diff_sum = TTransform_SSE2(a, b, w); return abs(diff_sum) >> 5; } static int Disto16x16_SSE2(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_SSE2(a + x + y, b + x + y, w); } } return D; } //------------------------------------------------------------------------------ // Quantization // static WEBP_INLINE int DoQuantizeBlock_SSE2(int16_t in[16], int16_t out[16], const uint16_t* const sharpen, const VP8Matrix* const mtx) { const __m128i max_coeff_2047 = _mm_set1_epi16(MAX_LEVEL); const __m128i zero = _mm_setzero_si128(); __m128i coeff0, coeff8; __m128i out0, out8; __m128i packed_out; // Load all inputs. __m128i in0 = _mm_loadu_si128((__m128i*)&in[0]); __m128i in8 = _mm_loadu_si128((__m128i*)&in[8]); const __m128i iq0 = _mm_loadu_si128((const __m128i*)&mtx->iq_[0]); const __m128i iq8 = _mm_loadu_si128((const __m128i*)&mtx->iq_[8]); const __m128i q0 = _mm_loadu_si128((const __m128i*)&mtx->q_[0]); const __m128i q8 = _mm_loadu_si128((const __m128i*)&mtx->q_[8]); // extract sign(in) (0x0000 if positive, 0xffff if negative) const __m128i sign0 = _mm_cmpgt_epi16(zero, in0); const __m128i sign8 = _mm_cmpgt_epi16(zero, in8); // coeff = abs(in) = (in ^ sign) - sign coeff0 = _mm_xor_si128(in0, sign0); coeff8 = _mm_xor_si128(in8, sign8); coeff0 = _mm_sub_epi16(coeff0, sign0); coeff8 = _mm_sub_epi16(coeff8, sign8); // coeff = abs(in) + sharpen if (sharpen != NULL) { const __m128i sharpen0 = _mm_loadu_si128((const __m128i*)&sharpen[0]); const __m128i sharpen8 = _mm_loadu_si128((const __m128i*)&sharpen[8]); coeff0 = _mm_add_epi16(coeff0, sharpen0); coeff8 = _mm_add_epi16(coeff8, sharpen8); } // out = (coeff * iQ + B) >> QFIX { // doing calculations with 32b precision (QFIX=17) // out = (coeff * iQ) const __m128i coeff_iQ0H = _mm_mulhi_epu16(coeff0, iq0); const __m128i coeff_iQ0L = _mm_mullo_epi16(coeff0, iq0); const __m128i coeff_iQ8H = _mm_mulhi_epu16(coeff8, iq8); const __m128i coeff_iQ8L = _mm_mullo_epi16(coeff8, iq8); __m128i out_00 = _mm_unpacklo_epi16(coeff_iQ0L, coeff_iQ0H); __m128i out_04 = _mm_unpackhi_epi16(coeff_iQ0L, coeff_iQ0H); __m128i out_08 = _mm_unpacklo_epi16(coeff_iQ8L, coeff_iQ8H); __m128i out_12 = _mm_unpackhi_epi16(coeff_iQ8L, coeff_iQ8H); // out = (coeff * iQ + B) const __m128i bias_00 = _mm_loadu_si128((const __m128i*)&mtx->bias_[0]); const __m128i bias_04 = _mm_loadu_si128((const __m128i*)&mtx->bias_[4]); const __m128i bias_08 = _mm_loadu_si128((const __m128i*)&mtx->bias_[8]); const __m128i bias_12 = _mm_loadu_si128((const __m128i*)&mtx->bias_[12]); out_00 = _mm_add_epi32(out_00, bias_00); out_04 = _mm_add_epi32(out_04, bias_04); out_08 = _mm_add_epi32(out_08, bias_08); out_12 = _mm_add_epi32(out_12, bias_12); // out = QUANTDIV(coeff, iQ, B, QFIX) out_00 = _mm_srai_epi32(out_00, QFIX); out_04 = _mm_srai_epi32(out_04, QFIX); out_08 = _mm_srai_epi32(out_08, QFIX); out_12 = _mm_srai_epi32(out_12, QFIX); // pack result as 16b out0 = _mm_packs_epi32(out_00, out_04); out8 = _mm_packs_epi32(out_08, out_12); // if (coeff > 2047) coeff = 2047 out0 = _mm_min_epi16(out0, max_coeff_2047); out8 = _mm_min_epi16(out8, max_coeff_2047); } // get sign back (if (sign[j]) out_n = -out_n) out0 = _mm_xor_si128(out0, sign0); out8 = _mm_xor_si128(out8, sign8); out0 = _mm_sub_epi16(out0, sign0); out8 = _mm_sub_epi16(out8, sign8); // in = out * Q in0 = _mm_mullo_epi16(out0, q0); in8 = _mm_mullo_epi16(out8, q8); _mm_storeu_si128((__m128i*)&in[0], in0); _mm_storeu_si128((__m128i*)&in[8], in8); // zigzag the output before storing it. // // The zigzag pattern can almost be reproduced with a small sequence of // shuffles. After it, we only need to swap the 7th (ending up in third // position instead of twelfth) and 8th values. { __m128i outZ0, outZ8; outZ0 = _mm_shufflehi_epi16(out0, _MM_SHUFFLE(2, 1, 3, 0)); outZ0 = _mm_shuffle_epi32 (outZ0, _MM_SHUFFLE(3, 1, 2, 0)); outZ0 = _mm_shufflehi_epi16(outZ0, _MM_SHUFFLE(3, 1, 0, 2)); outZ8 = _mm_shufflelo_epi16(out8, _MM_SHUFFLE(3, 0, 2, 1)); outZ8 = _mm_shuffle_epi32 (outZ8, _MM_SHUFFLE(3, 1, 2, 0)); outZ8 = _mm_shufflelo_epi16(outZ8, _MM_SHUFFLE(1, 3, 2, 0)); _mm_storeu_si128((__m128i*)&out[0], outZ0); _mm_storeu_si128((__m128i*)&out[8], outZ8); packed_out = _mm_packs_epi16(outZ0, outZ8); } { const int16_t outZ_12 = out[12]; const int16_t outZ_3 = out[3]; out[3] = outZ_12; out[12] = outZ_3; } // detect if all 'out' values are zeroes or not return (_mm_movemask_epi8(_mm_cmpeq_epi8(packed_out, zero)) != 0xffff); } static int QuantizeBlock_SSE2(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { return DoQuantizeBlock_SSE2(in, out, &mtx->sharpen_[0], mtx); } static int QuantizeBlockWHT_SSE2(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { return DoQuantizeBlock_SSE2(in, out, NULL, mtx); } static int Quantize2Blocks_SSE2(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; const uint16_t* const sharpen = &mtx->sharpen_[0]; nz = DoQuantizeBlock_SSE2(in + 0 * 16, out + 0 * 16, sharpen, mtx) << 0; nz |= DoQuantizeBlock_SSE2(in + 1 * 16, out + 1 * 16, sharpen, mtx) << 1; return nz; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitSSE2(void) { VP8CollectHistogram = CollectHistogram_SSE2; VP8EncPredLuma16 = Intra16Preds_SSE2; VP8EncPredChroma8 = IntraChromaPreds_SSE2; VP8EncPredLuma4 = Intra4Preds_SSE2; VP8EncQuantizeBlock = QuantizeBlock_SSE2; VP8EncQuantize2Blocks = Quantize2Blocks_SSE2; VP8EncQuantizeBlockWHT = QuantizeBlockWHT_SSE2; VP8ITransform = ITransform_SSE2; VP8FTransform = FTransform_SSE2; VP8FTransform2 = FTransform2_SSE2; VP8FTransformWHT = FTransformWHT_SSE2; VP8SSE16x16 = SSE16x16_SSE2; VP8SSE16x8 = SSE16x8_SSE2; VP8SSE8x8 = SSE8x8_SSE2; VP8SSE4x4 = SSE4x4_SSE2; VP8TDisto4x4 = Disto4x4_SSE2; VP8TDisto16x16 = Disto16x16_SSE2; VP8Mean16x4 = Mean16x4_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8EncDspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/common_sse41.h0000644000014400001440000001106214606317060014110 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE4 code common to several files. // // Author: Vincent Rabaud (vrabaud@google.com) #ifndef WEBP_DSP_COMMON_SSE41_H_ #define WEBP_DSP_COMMON_SSE41_H_ #ifdef __cplusplus extern "C" { #endif #if defined(WEBP_USE_SSE41) #include //------------------------------------------------------------------------------ // Channel mixing. // Shuffles the input buffer as A0 0 0 A1 0 0 A2 ... #define WEBP_SSE41_SHUFF(OUT, IN0, IN1) \ OUT##0 = _mm_shuffle_epi8(*IN0, shuff0); \ OUT##1 = _mm_shuffle_epi8(*IN0, shuff1); \ OUT##2 = _mm_shuffle_epi8(*IN0, shuff2); \ OUT##3 = _mm_shuffle_epi8(*IN1, shuff0); \ OUT##4 = _mm_shuffle_epi8(*IN1, shuff1); \ OUT##5 = _mm_shuffle_epi8(*IN1, shuff2); // Pack the planar buffers // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // triplet by triplet in the output buffer rgb as rgbrgbrgbrgb ... static WEBP_INLINE void VP8PlanarTo24b_SSE41( __m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3, __m128i* const in4, __m128i* const in5) { __m128i R0, R1, R2, R3, R4, R5; __m128i G0, G1, G2, G3, G4, G5; __m128i B0, B1, B2, B3, B4, B5; // Process R. { const __m128i shuff0 = _mm_set_epi8( 5, -1, -1, 4, -1, -1, 3, -1, -1, 2, -1, -1, 1, -1, -1, 0); const __m128i shuff1 = _mm_set_epi8( -1, 10, -1, -1, 9, -1, -1, 8, -1, -1, 7, -1, -1, 6, -1, -1); const __m128i shuff2 = _mm_set_epi8( -1, -1, 15, -1, -1, 14, -1, -1, 13, -1, -1, 12, -1, -1, 11, -1); WEBP_SSE41_SHUFF(R, in0, in1) } // Process G. { // Same as before, just shifted to the left by one and including the right // padding. const __m128i shuff0 = _mm_set_epi8( -1, -1, 4, -1, -1, 3, -1, -1, 2, -1, -1, 1, -1, -1, 0, -1); const __m128i shuff1 = _mm_set_epi8( 10, -1, -1, 9, -1, -1, 8, -1, -1, 7, -1, -1, 6, -1, -1, 5); const __m128i shuff2 = _mm_set_epi8( -1, 15, -1, -1, 14, -1, -1, 13, -1, -1, 12, -1, -1, 11, -1, -1); WEBP_SSE41_SHUFF(G, in2, in3) } // Process B. { const __m128i shuff0 = _mm_set_epi8( -1, 4, -1, -1, 3, -1, -1, 2, -1, -1, 1, -1, -1, 0, -1, -1); const __m128i shuff1 = _mm_set_epi8( -1, -1, 9, -1, -1, 8, -1, -1, 7, -1, -1, 6, -1, -1, 5, -1); const __m128i shuff2 = _mm_set_epi8( 15, -1, -1, 14, -1, -1, 13, -1, -1, 12, -1, -1, 11, -1, -1, 10); WEBP_SSE41_SHUFF(B, in4, in5) } // OR the different channels. { const __m128i RG0 = _mm_or_si128(R0, G0); const __m128i RG1 = _mm_or_si128(R1, G1); const __m128i RG2 = _mm_or_si128(R2, G2); const __m128i RG3 = _mm_or_si128(R3, G3); const __m128i RG4 = _mm_or_si128(R4, G4); const __m128i RG5 = _mm_or_si128(R5, G5); *in0 = _mm_or_si128(RG0, B0); *in1 = _mm_or_si128(RG1, B1); *in2 = _mm_or_si128(RG2, B2); *in3 = _mm_or_si128(RG3, B3); *in4 = _mm_or_si128(RG4, B4); *in5 = _mm_or_si128(RG5, B5); } } #undef WEBP_SSE41_SHUFF // Convert four packed four-channel buffers like argbargbargbargb... into the // split channels aaaaa ... rrrr ... gggg .... bbbbb ...... static WEBP_INLINE void VP8L32bToPlanar_SSE41(__m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3) { // aaaarrrrggggbbbb const __m128i shuff0 = _mm_set_epi8(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0); const __m128i A0 = _mm_shuffle_epi8(*in0, shuff0); const __m128i A1 = _mm_shuffle_epi8(*in1, shuff0); const __m128i A2 = _mm_shuffle_epi8(*in2, shuff0); const __m128i A3 = _mm_shuffle_epi8(*in3, shuff0); // A0A1R0R1 // G0G1B0B1 // A2A3R2R3 // G0G1B0B1 const __m128i B0 = _mm_unpacklo_epi32(A0, A1); const __m128i B1 = _mm_unpackhi_epi32(A0, A1); const __m128i B2 = _mm_unpacklo_epi32(A2, A3); const __m128i B3 = _mm_unpackhi_epi32(A2, A3); *in3 = _mm_unpacklo_epi64(B0, B2); *in2 = _mm_unpackhi_epi64(B0, B2); *in1 = _mm_unpacklo_epi64(B1, B3); *in0 = _mm_unpackhi_epi64(B1, B3); } #endif // WEBP_USE_SSE41 #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_COMMON_SSE41_H_ libwebp-1.4.0/src/dsp/cost_neon.c0000644000014400001440000001032014606317060013557 0ustar // Copyright 2018 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // ARM NEON version of cost functions #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include "src/dsp/neon.h" #include "src/enc/cost_enc.h" static const uint8_t position[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; static void SetResidualCoeffs_NEON(const int16_t* const coeffs, VP8Residual* const res) { const int16x8_t minus_one = vdupq_n_s16(-1); const int16x8_t coeffs_0 = vld1q_s16(coeffs); const int16x8_t coeffs_1 = vld1q_s16(coeffs + 8); const uint16x8_t eob_0 = vtstq_s16(coeffs_0, minus_one); const uint16x8_t eob_1 = vtstq_s16(coeffs_1, minus_one); const uint8x16_t eob = vcombine_u8(vqmovn_u16(eob_0), vqmovn_u16(eob_1)); const uint8x16_t masked = vandq_u8(eob, vld1q_u8(position)); #if WEBP_AARCH64 res->last = vmaxvq_u8(masked) - 1; #else const uint8x8_t eob_8x8 = vmax_u8(vget_low_u8(masked), vget_high_u8(masked)); const uint16x8_t eob_16x8 = vmovl_u8(eob_8x8); const uint16x4_t eob_16x4 = vmax_u16(vget_low_u16(eob_16x8), vget_high_u16(eob_16x8)); const uint32x4_t eob_32x4 = vmovl_u16(eob_16x4); uint32x2_t eob_32x2 = vmax_u32(vget_low_u32(eob_32x4), vget_high_u32(eob_32x4)); eob_32x2 = vpmax_u32(eob_32x2, eob_32x2); vst1_lane_s32(&res->last, vreinterpret_s32_u32(eob_32x2), 0); --res->last; #endif // WEBP_AARCH64 res->coeffs = coeffs; } static int GetResidualCost_NEON(int ctx0, const VP8Residual* const res) { uint8_t levels[16], ctxs[16]; uint16_t abs_levels[16]; int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 const int p0 = res->prob[n][ctx0][0]; CostArrayPtr const costs = res->costs; const uint16_t* t = costs[n][ctx0]; // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0 // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll // be missing during the loop. int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; if (res->last < 0) { return VP8BitCost(0, p0); } { // precompute clamped levels and contexts, packed to 8b. const uint8x16_t kCst2 = vdupq_n_u8(2); const uint8x16_t kCst67 = vdupq_n_u8(MAX_VARIABLE_LEVEL); const int16x8_t c0 = vld1q_s16(res->coeffs); const int16x8_t c1 = vld1q_s16(res->coeffs + 8); const uint16x8_t E0 = vreinterpretq_u16_s16(vabsq_s16(c0)); const uint16x8_t E1 = vreinterpretq_u16_s16(vabsq_s16(c1)); const uint8x16_t F = vcombine_u8(vqmovn_u16(E0), vqmovn_u16(E1)); const uint8x16_t G = vminq_u8(F, kCst2); // context = 0,1,2 const uint8x16_t H = vminq_u8(F, kCst67); // clamp_level in [0..67] vst1q_u8(ctxs, G); vst1q_u8(levels, H); vst1q_u16(abs_levels, E0); vst1q_u16(abs_levels + 8, E1); } for (; n < res->last; ++n) { const int ctx = ctxs[n]; const int level = levels[n]; const int flevel = abs_levels[n]; // full level cost += VP8LevelFixedCosts[flevel] + t[level]; // simplified VP8LevelCost() t = costs[n + 1][ctx]; } // Last coefficient is always non-zero { const int level = levels[n]; const int flevel = abs_levels[n]; assert(flevel != 0); cost += VP8LevelFixedCosts[flevel] + t[level]; if (n < 15) { const int b = VP8EncBands[n + 1]; const int ctx = ctxs[n]; const int last_p0 = res->prob[b][ctx][0]; cost += VP8BitCost(0, last_p0); } } return cost; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspCostInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspCostInitNEON(void) { VP8SetResidualCoeffs = SetResidualCoeffs_NEON; VP8GetResidualCost = GetResidualCost_NEON; } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8EncDspCostInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/filters_msa.c0000644000014400001440000001330414606317060014105 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MSA variant of alpha filters // // Author: Prashant Patil (prashant.patil@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MSA) #include "src/dsp/msa_macro.h" #include static WEBP_INLINE void PredictLineInverse0(const uint8_t* src, const uint8_t* pred, uint8_t* dst, int length) { v16u8 src0, pred0, dst0; assert(length >= 0); while (length >= 32) { v16u8 src1, pred1, dst1; LD_UB2(src, 16, src0, src1); LD_UB2(pred, 16, pred0, pred1); SUB2(src0, pred0, src1, pred1, dst0, dst1); ST_UB2(dst0, dst1, dst, 16); src += 32; pred += 32; dst += 32; length -= 32; } if (length > 0) { int i; if (length >= 16) { src0 = LD_UB(src); pred0 = LD_UB(pred); dst0 = src0 - pred0; ST_UB(dst0, dst); src += 16; pred += 16; dst += 16; length -= 16; } for (i = 0; i < length; i++) { dst[i] = src[i] - pred[i]; } } } //------------------------------------------------------------------------------ // Helpful macro. #define DCHECK(in, out) \ do { \ assert(in != NULL); \ assert(out != NULL); \ assert(width > 0); \ assert(height > 0); \ assert(stride >= width); \ } while (0) //------------------------------------------------------------------------------ // Horrizontal filter static void HorizontalFilter_MSA(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { const uint8_t* preds = data; const uint8_t* in = data; uint8_t* out = filtered_data; int row = 1; DCHECK(in, out); // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLineInverse0(in + 1, preds, out + 1, width - 1); preds += stride; in += stride; out += stride; // Filter line-by-line. while (row < height) { // Leftmost pixel is predicted from above. PredictLineInverse0(in, preds - stride, out, 1); PredictLineInverse0(in + 1, preds, out + 1, width - 1); ++row; preds += stride; in += stride; out += stride; } } //------------------------------------------------------------------------------ // Gradient filter static WEBP_INLINE void PredictLineGradient(const uint8_t* pinput, const uint8_t* ppred, uint8_t* poutput, int stride, int size) { int w; const v16i8 zero = { 0 }; while (size >= 16) { v16u8 pred0, dst0; v8i16 a0, a1, b0, b1, c0, c1; const v16u8 tmp0 = LD_UB(ppred - 1); const v16u8 tmp1 = LD_UB(ppred - stride); const v16u8 tmp2 = LD_UB(ppred - stride - 1); const v16u8 src0 = LD_UB(pinput); ILVRL_B2_SH(zero, tmp0, a0, a1); ILVRL_B2_SH(zero, tmp1, b0, b1); ILVRL_B2_SH(zero, tmp2, c0, c1); ADD2(a0, b0, a1, b1, a0, a1); SUB2(a0, c0, a1, c1, a0, a1); CLIP_SH2_0_255(a0, a1); pred0 = (v16u8)__msa_pckev_b((v16i8)a1, (v16i8)a0); dst0 = src0 - pred0; ST_UB(dst0, poutput); ppred += 16; pinput += 16; poutput += 16; size -= 16; } for (w = 0; w < size; ++w) { const int pred = ppred[w - 1] + ppred[w - stride] - ppred[w - stride - 1]; poutput[w] = pinput[w] - (pred < 0 ? 0 : pred > 255 ? 255 : pred); } } static void GradientFilter_MSA(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { const uint8_t* in = data; const uint8_t* preds = data; uint8_t* out = filtered_data; int row = 1; DCHECK(in, out); // left prediction for top scan-line out[0] = in[0]; PredictLineInverse0(in + 1, preds, out + 1, width - 1); preds += stride; in += stride; out += stride; // Filter line-by-line. while (row < height) { out[0] = in[0] - preds[- stride]; PredictLineGradient(preds + 1, in + 1, out + 1, stride, width - 1); ++row; preds += stride; in += stride; out += stride; } } //------------------------------------------------------------------------------ // Vertical filter static void VerticalFilter_MSA(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { const uint8_t* in = data; const uint8_t* preds = data; uint8_t* out = filtered_data; int row = 1; DCHECK(in, out); // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLineInverse0(in + 1, preds, out + 1, width - 1); in += stride; out += stride; // Filter line-by-line. while (row < height) { PredictLineInverse0(in, preds, out, width); ++row; preds += stride; in += stride; out += stride; } } #undef DCHECK //------------------------------------------------------------------------------ // Entry point extern void VP8FiltersInitMSA(void); WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitMSA(void) { WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_MSA; WebPFilters[WEBP_FILTER_VERTICAL] = VerticalFilter_MSA; WebPFilters[WEBP_FILTER_GRADIENT] = GradientFilter_MSA; } #else // !WEBP_USE_MSA WEBP_DSP_INIT_STUB(VP8FiltersInitMSA) #endif // WEBP_USE_MSA libwebp-1.4.0/src/dsp/neon.h0000644000014400001440000000767714606317060012561 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // NEON common code. #ifndef WEBP_DSP_NEON_H_ #define WEBP_DSP_NEON_H_ #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include // Right now, some intrinsics functions seem slower, so we disable them // everywhere except newer clang/gcc or aarch64 where the inline assembly is // incompatible. #if LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 9) || WEBP_AARCH64 #define WEBP_USE_INTRINSICS // use intrinsics when possible #endif #define INIT_VECTOR2(v, a, b) do { \ v.val[0] = a; \ v.val[1] = b; \ } while (0) #define INIT_VECTOR3(v, a, b, c) do { \ v.val[0] = a; \ v.val[1] = b; \ v.val[2] = c; \ } while (0) #define INIT_VECTOR4(v, a, b, c, d) do { \ v.val[0] = a; \ v.val[1] = b; \ v.val[2] = c; \ v.val[3] = d; \ } while (0) // if using intrinsics, this flag avoids some functions that make gcc-4.6.3 // crash ("internal compiler error: in immed_double_const, at emit-rtl."). // (probably similar to gcc.gnu.org/bugzilla/show_bug.cgi?id=48183) #if !(LOCAL_CLANG_PREREQ(3, 8) || LOCAL_GCC_PREREQ(4, 8) || WEBP_AARCH64) #define WORK_AROUND_GCC #endif static WEBP_INLINE int32x4x4_t Transpose4x4_NEON(const int32x4x4_t rows) { uint64x2x2_t row01, row23; row01.val[0] = vreinterpretq_u64_s32(rows.val[0]); row01.val[1] = vreinterpretq_u64_s32(rows.val[1]); row23.val[0] = vreinterpretq_u64_s32(rows.val[2]); row23.val[1] = vreinterpretq_u64_s32(rows.val[3]); // Transpose 64-bit values (there's no vswp equivalent) { const uint64x1_t row0h = vget_high_u64(row01.val[0]); const uint64x1_t row2l = vget_low_u64(row23.val[0]); const uint64x1_t row1h = vget_high_u64(row01.val[1]); const uint64x1_t row3l = vget_low_u64(row23.val[1]); row01.val[0] = vcombine_u64(vget_low_u64(row01.val[0]), row2l); row23.val[0] = vcombine_u64(row0h, vget_high_u64(row23.val[0])); row01.val[1] = vcombine_u64(vget_low_u64(row01.val[1]), row3l); row23.val[1] = vcombine_u64(row1h, vget_high_u64(row23.val[1])); } { const int32x4x2_t out01 = vtrnq_s32(vreinterpretq_s32_u64(row01.val[0]), vreinterpretq_s32_u64(row01.val[1])); const int32x4x2_t out23 = vtrnq_s32(vreinterpretq_s32_u64(row23.val[0]), vreinterpretq_s32_u64(row23.val[1])); int32x4x4_t out; out.val[0] = out01.val[0]; out.val[1] = out01.val[1]; out.val[2] = out23.val[0]; out.val[3] = out23.val[1]; return out; } } #if 0 // Useful debug macro. #include #define PRINT_REG(REG, SIZE) do { \ int i; \ printf("%s \t[%d]: 0x", #REG, SIZE); \ if (SIZE == 8) { \ uint8_t _tmp[8]; \ vst1_u8(_tmp, (REG)); \ for (i = 0; i < 8; ++i) printf("%.2x ", _tmp[i]); \ } else if (SIZE == 16) { \ uint16_t _tmp[4]; \ vst1_u16(_tmp, (REG)); \ for (i = 0; i < 4; ++i) printf("%.4x ", _tmp[i]); \ } \ printf("\n"); \ } while (0) #endif #endif // WEBP_USE_NEON #endif // WEBP_DSP_NEON_H_ libwebp-1.4.0/src/dsp/ssim.c0000644000014400001440000001235414606317060012554 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // distortion calculation // // Author: Skal (pascal.massimino@gmail.com) #include #include // for abs() #include "src/dsp/dsp.h" #if !defined(WEBP_REDUCE_SIZE) //------------------------------------------------------------------------------ // SSIM / PSNR // hat-shaped filter. Sum of coefficients is equal to 16. static const uint32_t kWeight[2 * VP8_SSIM_KERNEL + 1] = { 1, 2, 3, 4, 3, 2, 1 }; static const uint32_t kWeightSum = 16 * 16; // sum{kWeight}^2 static WEBP_INLINE double SSIMCalculation( const VP8DistoStats* const stats, uint32_t N /*num samples*/) { const uint32_t w2 = N * N; const uint32_t C1 = 20 * w2; const uint32_t C2 = 60 * w2; const uint32_t C3 = 8 * 8 * w2; // 'dark' limit ~= 6 const uint64_t xmxm = (uint64_t)stats->xm * stats->xm; const uint64_t ymym = (uint64_t)stats->ym * stats->ym; if (xmxm + ymym >= C3) { const int64_t xmym = (int64_t)stats->xm * stats->ym; const int64_t sxy = (int64_t)stats->xym * N - xmym; // can be negative const uint64_t sxx = (uint64_t)stats->xxm * N - xmxm; const uint64_t syy = (uint64_t)stats->yym * N - ymym; // we descale by 8 to prevent overflow during the fnum/fden multiply. const uint64_t num_S = (2 * (uint64_t)(sxy < 0 ? 0 : sxy) + C2) >> 8; const uint64_t den_S = (sxx + syy + C2) >> 8; const uint64_t fnum = (2 * xmym + C1) * num_S; const uint64_t fden = (xmxm + ymym + C1) * den_S; const double r = (double)fnum / fden; assert(r >= 0. && r <= 1.0); return r; } return 1.; // area is too dark to contribute meaningfully } double VP8SSIMFromStats(const VP8DistoStats* const stats) { return SSIMCalculation(stats, kWeightSum); } double VP8SSIMFromStatsClipped(const VP8DistoStats* const stats) { return SSIMCalculation(stats, stats->w); } static double SSIMGetClipped_C(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2, int xo, int yo, int W, int H) { VP8DistoStats stats = { 0, 0, 0, 0, 0, 0 }; const int ymin = (yo - VP8_SSIM_KERNEL < 0) ? 0 : yo - VP8_SSIM_KERNEL; const int ymax = (yo + VP8_SSIM_KERNEL > H - 1) ? H - 1 : yo + VP8_SSIM_KERNEL; const int xmin = (xo - VP8_SSIM_KERNEL < 0) ? 0 : xo - VP8_SSIM_KERNEL; const int xmax = (xo + VP8_SSIM_KERNEL > W - 1) ? W - 1 : xo + VP8_SSIM_KERNEL; int x, y; src1 += ymin * stride1; src2 += ymin * stride2; for (y = ymin; y <= ymax; ++y, src1 += stride1, src2 += stride2) { for (x = xmin; x <= xmax; ++x) { const uint32_t w = kWeight[VP8_SSIM_KERNEL + x - xo] * kWeight[VP8_SSIM_KERNEL + y - yo]; const uint32_t s1 = src1[x]; const uint32_t s2 = src2[x]; stats.w += w; stats.xm += w * s1; stats.ym += w * s2; stats.xxm += w * s1 * s1; stats.xym += w * s1 * s2; stats.yym += w * s2 * s2; } } return VP8SSIMFromStatsClipped(&stats); } static double SSIMGet_C(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2) { VP8DistoStats stats = { 0, 0, 0, 0, 0, 0 }; int x, y; for (y = 0; y <= 2 * VP8_SSIM_KERNEL; ++y, src1 += stride1, src2 += stride2) { for (x = 0; x <= 2 * VP8_SSIM_KERNEL; ++x) { const uint32_t w = kWeight[x] * kWeight[y]; const uint32_t s1 = src1[x]; const uint32_t s2 = src2[x]; stats.xm += w * s1; stats.ym += w * s2; stats.xxm += w * s1 * s1; stats.xym += w * s1 * s2; stats.yym += w * s2 * s2; } } return VP8SSIMFromStats(&stats); } #endif // !defined(WEBP_REDUCE_SIZE) //------------------------------------------------------------------------------ #if !defined(WEBP_DISABLE_STATS) static uint32_t AccumulateSSE_C(const uint8_t* src1, const uint8_t* src2, int len) { int i; uint32_t sse2 = 0; assert(len <= 65535); // to ensure that accumulation fits within uint32_t for (i = 0; i < len; ++i) { const int32_t diff = src1[i] - src2[i]; sse2 += diff * diff; } return sse2; } #endif //------------------------------------------------------------------------------ #if !defined(WEBP_REDUCE_SIZE) VP8SSIMGetFunc VP8SSIMGet; VP8SSIMGetClippedFunc VP8SSIMGetClipped; #endif #if !defined(WEBP_DISABLE_STATS) VP8AccumulateSSEFunc VP8AccumulateSSE; #endif extern VP8CPUInfo VP8GetCPUInfo; extern void VP8SSIMDspInitSSE2(void); WEBP_DSP_INIT_FUNC(VP8SSIMDspInit) { #if !defined(WEBP_REDUCE_SIZE) VP8SSIMGetClipped = SSIMGetClipped_C; VP8SSIMGet = SSIMGet_C; #endif #if !defined(WEBP_DISABLE_STATS) VP8AccumulateSSE = AccumulateSSE_C; #endif if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8SSIMDspInitSSE2(); } #endif } } libwebp-1.4.0/src/dsp/ssim_sse2.c0000644000014400001440000001323514606317060013507 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 version of distortion calculation // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include #include "src/dsp/common_sse2.h" #if !defined(WEBP_DISABLE_STATS) // Helper function static WEBP_INLINE void SubtractAndSquare_SSE2(const __m128i a, const __m128i b, __m128i* const sum) { // take abs(a-b) in 8b const __m128i a_b = _mm_subs_epu8(a, b); const __m128i b_a = _mm_subs_epu8(b, a); const __m128i abs_a_b = _mm_or_si128(a_b, b_a); // zero-extend to 16b const __m128i zero = _mm_setzero_si128(); const __m128i C0 = _mm_unpacklo_epi8(abs_a_b, zero); const __m128i C1 = _mm_unpackhi_epi8(abs_a_b, zero); // multiply with self const __m128i sum1 = _mm_madd_epi16(C0, C0); const __m128i sum2 = _mm_madd_epi16(C1, C1); *sum = _mm_add_epi32(sum1, sum2); } //------------------------------------------------------------------------------ // SSIM / PSNR entry point static uint32_t AccumulateSSE_SSE2(const uint8_t* src1, const uint8_t* src2, int len) { int i = 0; uint32_t sse2 = 0; if (len >= 16) { const int limit = len - 32; int32_t tmp[4]; __m128i sum1; __m128i sum = _mm_setzero_si128(); __m128i a0 = _mm_loadu_si128((const __m128i*)&src1[i]); __m128i b0 = _mm_loadu_si128((const __m128i*)&src2[i]); i += 16; while (i <= limit) { const __m128i a1 = _mm_loadu_si128((const __m128i*)&src1[i]); const __m128i b1 = _mm_loadu_si128((const __m128i*)&src2[i]); __m128i sum2; i += 16; SubtractAndSquare_SSE2(a0, b0, &sum1); sum = _mm_add_epi32(sum, sum1); a0 = _mm_loadu_si128((const __m128i*)&src1[i]); b0 = _mm_loadu_si128((const __m128i*)&src2[i]); i += 16; SubtractAndSquare_SSE2(a1, b1, &sum2); sum = _mm_add_epi32(sum, sum2); } SubtractAndSquare_SSE2(a0, b0, &sum1); sum = _mm_add_epi32(sum, sum1); _mm_storeu_si128((__m128i*)tmp, sum); sse2 += (tmp[3] + tmp[2] + tmp[1] + tmp[0]); } for (; i < len; ++i) { const int32_t diff = src1[i] - src2[i]; sse2 += diff * diff; } return sse2; } #endif // !defined(WEBP_DISABLE_STATS) #if !defined(WEBP_REDUCE_SIZE) static uint32_t HorizontalAdd16b_SSE2(const __m128i* const m) { uint16_t tmp[8]; const __m128i a = _mm_srli_si128(*m, 8); const __m128i b = _mm_add_epi16(*m, a); _mm_storeu_si128((__m128i*)tmp, b); return (uint32_t)tmp[3] + tmp[2] + tmp[1] + tmp[0]; } static uint32_t HorizontalAdd32b_SSE2(const __m128i* const m) { const __m128i a = _mm_srli_si128(*m, 8); const __m128i b = _mm_add_epi32(*m, a); const __m128i c = _mm_add_epi32(b, _mm_srli_si128(b, 4)); return (uint32_t)_mm_cvtsi128_si32(c); } static const uint16_t kWeight[] = { 1, 2, 3, 4, 3, 2, 1, 0 }; #define ACCUMULATE_ROW(WEIGHT) do { \ /* compute row weight (Wx * Wy) */ \ const __m128i Wy = _mm_set1_epi16((WEIGHT)); \ const __m128i W = _mm_mullo_epi16(Wx, Wy); \ /* process 8 bytes at a time (7 bytes, actually) */ \ const __m128i a0 = _mm_loadl_epi64((const __m128i*)src1); \ const __m128i b0 = _mm_loadl_epi64((const __m128i*)src2); \ /* convert to 16b and multiply by weight */ \ const __m128i a1 = _mm_unpacklo_epi8(a0, zero); \ const __m128i b1 = _mm_unpacklo_epi8(b0, zero); \ const __m128i wa1 = _mm_mullo_epi16(a1, W); \ const __m128i wb1 = _mm_mullo_epi16(b1, W); \ /* accumulate */ \ xm = _mm_add_epi16(xm, wa1); \ ym = _mm_add_epi16(ym, wb1); \ xxm = _mm_add_epi32(xxm, _mm_madd_epi16(a1, wa1)); \ xym = _mm_add_epi32(xym, _mm_madd_epi16(a1, wb1)); \ yym = _mm_add_epi32(yym, _mm_madd_epi16(b1, wb1)); \ src1 += stride1; \ src2 += stride2; \ } while (0) static double SSIMGet_SSE2(const uint8_t* src1, int stride1, const uint8_t* src2, int stride2) { VP8DistoStats stats; const __m128i zero = _mm_setzero_si128(); __m128i xm = zero, ym = zero; // 16b accums __m128i xxm = zero, yym = zero, xym = zero; // 32b accum const __m128i Wx = _mm_loadu_si128((const __m128i*)kWeight); assert(2 * VP8_SSIM_KERNEL + 1 == 7); ACCUMULATE_ROW(1); ACCUMULATE_ROW(2); ACCUMULATE_ROW(3); ACCUMULATE_ROW(4); ACCUMULATE_ROW(3); ACCUMULATE_ROW(2); ACCUMULATE_ROW(1); stats.xm = HorizontalAdd16b_SSE2(&xm); stats.ym = HorizontalAdd16b_SSE2(&ym); stats.xxm = HorizontalAdd32b_SSE2(&xxm); stats.xym = HorizontalAdd32b_SSE2(&xym); stats.yym = HorizontalAdd32b_SSE2(&yym); return VP8SSIMFromStats(&stats); } #endif // !defined(WEBP_REDUCE_SIZE) extern void VP8SSIMDspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8SSIMDspInitSSE2(void) { #if !defined(WEBP_DISABLE_STATS) VP8AccumulateSSE = AccumulateSSE_SSE2; #endif #if !defined(WEBP_REDUCE_SIZE) VP8SSIMGet = SSIMGet_SSE2; #endif } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8SSIMDspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/lossless_enc_mips_dsp_r2.c0000644000014400001440000003336714606317060016605 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transform methods for lossless encoder. // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/lossless.h" static void SubtractGreenFromBlueAndRed_MIPSdspR2(uint32_t* argb_data, int num_pixels) { uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; uint32_t* const p_loop1_end = argb_data + (num_pixels & ~3); uint32_t* const p_loop2_end = p_loop1_end + (num_pixels & 3); __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[argb_data], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[argb_data]) \n\t" "lw %[temp1], 4(%[argb_data]) \n\t" "lw %[temp2], 8(%[argb_data]) \n\t" "lw %[temp3], 12(%[argb_data]) \n\t" "ext %[temp4], %[temp0], 8, 8 \n\t" "ext %[temp5], %[temp1], 8, 8 \n\t" "ext %[temp6], %[temp2], 8, 8 \n\t" "ext %[temp7], %[temp3], 8, 8 \n\t" "addiu %[argb_data], %[argb_data], 16 \n\t" "replv.ph %[temp4], %[temp4] \n\t" "replv.ph %[temp5], %[temp5] \n\t" "replv.ph %[temp6], %[temp6] \n\t" "replv.ph %[temp7], %[temp7] \n\t" "subu.qb %[temp0], %[temp0], %[temp4] \n\t" "subu.qb %[temp1], %[temp1], %[temp5] \n\t" "subu.qb %[temp2], %[temp2], %[temp6] \n\t" "subu.qb %[temp3], %[temp3], %[temp7] \n\t" "sw %[temp0], -16(%[argb_data]) \n\t" "sw %[temp1], -12(%[argb_data]) \n\t" "sw %[temp2], -8(%[argb_data]) \n\t" "bne %[argb_data], %[p_loop1_end], 0b \n\t" " sw %[temp3], -4(%[argb_data]) \n\t" "3: \n\t" "beq %[argb_data], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[argb_data]) \n\t" "addiu %[argb_data], %[argb_data], 4 \n\t" "ext %[temp4], %[temp0], 8, 8 \n\t" "replv.ph %[temp4], %[temp4] \n\t" "subu.qb %[temp0], %[temp0], %[temp4] \n\t" "bne %[argb_data], %[p_loop2_end], 1b \n\t" " sw %[temp0], -4(%[argb_data]) \n\t" "2: \n\t" ".set pop \n\t" : [argb_data]"+&r"(argb_data), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static WEBP_INLINE uint32_t ColorTransformDelta(int8_t color_pred, int8_t color) { return (uint32_t)((int)(color_pred) * color) >> 5; } static void TransformColor_MIPSdspR2(const VP8LMultipliers* const m, uint32_t* data, int num_pixels) { int temp0, temp1, temp2, temp3, temp4, temp5; uint32_t argb, argb1, new_red, new_red1; const uint32_t G_to_R = m->green_to_red_; const uint32_t G_to_B = m->green_to_blue_; const uint32_t R_to_B = m->red_to_blue_; uint32_t* const p_loop_end = data + (num_pixels & ~1); __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[data], %[p_loop_end], 1f \n\t" " nop \n\t" "replv.ph %[temp0], %[G_to_R] \n\t" "replv.ph %[temp1], %[G_to_B] \n\t" "replv.ph %[temp2], %[R_to_B] \n\t" "shll.ph %[temp0], %[temp0], 8 \n\t" "shll.ph %[temp1], %[temp1], 8 \n\t" "shll.ph %[temp2], %[temp2], 8 \n\t" "shra.ph %[temp0], %[temp0], 8 \n\t" "shra.ph %[temp1], %[temp1], 8 \n\t" "shra.ph %[temp2], %[temp2], 8 \n\t" "0: \n\t" "lw %[argb], 0(%[data]) \n\t" "lw %[argb1], 4(%[data]) \n\t" "lhu %[new_red], 2(%[data]) \n\t" "lhu %[new_red1], 6(%[data]) \n\t" "precrq.qb.ph %[temp3], %[argb], %[argb1] \n\t" "precr.qb.ph %[temp4], %[argb], %[argb1] \n\t" "preceu.ph.qbra %[temp3], %[temp3] \n\t" "preceu.ph.qbla %[temp4], %[temp4] \n\t" "shll.ph %[temp3], %[temp3], 8 \n\t" "shll.ph %[temp4], %[temp4], 8 \n\t" "shra.ph %[temp3], %[temp3], 8 \n\t" "shra.ph %[temp4], %[temp4], 8 \n\t" "mul.ph %[temp5], %[temp3], %[temp0] \n\t" "mul.ph %[temp3], %[temp3], %[temp1] \n\t" "mul.ph %[temp4], %[temp4], %[temp2] \n\t" "addiu %[data], %[data], 8 \n\t" "ins %[new_red1], %[new_red], 16, 16 \n\t" "ins %[argb1], %[argb], 16, 16 \n\t" "shra.ph %[temp5], %[temp5], 5 \n\t" "shra.ph %[temp3], %[temp3], 5 \n\t" "shra.ph %[temp4], %[temp4], 5 \n\t" "subu.ph %[new_red1], %[new_red1], %[temp5] \n\t" "subu.ph %[argb1], %[argb1], %[temp3] \n\t" "preceu.ph.qbra %[temp5], %[new_red1] \n\t" "subu.ph %[argb1], %[argb1], %[temp4] \n\t" "preceu.ph.qbra %[temp3], %[argb1] \n\t" "sb %[temp5], -2(%[data]) \n\t" "sb %[temp3], -4(%[data]) \n\t" "sra %[temp5], %[temp5], 16 \n\t" "sra %[temp3], %[temp3], 16 \n\t" "sb %[temp5], -6(%[data]) \n\t" "bne %[data], %[p_loop_end], 0b \n\t" " sb %[temp3], -8(%[data]) \n\t" "1: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [new_red1]"=&r"(new_red1), [new_red]"=&r"(new_red), [argb]"=&r"(argb), [argb1]"=&r"(argb1), [data]"+&r"(data) : [G_to_R]"r"(G_to_R), [R_to_B]"r"(R_to_B), [G_to_B]"r"(G_to_B), [p_loop_end]"r"(p_loop_end) : "memory", "hi", "lo" ); if (num_pixels & 1) { const uint32_t argb_ = data[0]; const uint32_t green = argb_ >> 8; const uint32_t red = argb_ >> 16; uint32_t new_blue = argb_; new_red = red; new_red -= ColorTransformDelta(m->green_to_red_, green); new_red &= 0xff; new_blue -= ColorTransformDelta(m->green_to_blue_, green); new_blue -= ColorTransformDelta(m->red_to_blue_, red); new_blue &= 0xff; data[0] = (argb_ & 0xff00ff00u) | (new_red << 16) | (new_blue); } } static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue, uint8_t red_to_blue, uint32_t argb) { const uint32_t green = argb >> 8; const uint32_t red = argb >> 16; uint8_t new_blue = argb; new_blue -= ColorTransformDelta(green_to_blue, green); new_blue -= ColorTransformDelta(red_to_blue, red); return (new_blue & 0xff); } static void CollectColorBlueTransforms_MIPSdspR2(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]) { const int rtb = (red_to_blue << 16) | (red_to_blue & 0xffff); const int gtb = (green_to_blue << 16) | (green_to_blue & 0xffff); const uint32_t mask = 0xff00ffu; while (tile_height-- > 0) { int x; const uint32_t* p_argb = argb; argb += stride; for (x = 0; x < (tile_width >> 1); ++x) { int temp0, temp1, temp2, temp3, temp4, temp5, temp6; __asm__ volatile ( "lw %[temp0], 0(%[p_argb]) \n\t" "lw %[temp1], 4(%[p_argb]) \n\t" "precr.qb.ph %[temp2], %[temp0], %[temp1] \n\t" "ins %[temp1], %[temp0], 16, 16 \n\t" "shra.ph %[temp2], %[temp2], 8 \n\t" "shra.ph %[temp3], %[temp1], 8 \n\t" "mul.ph %[temp5], %[temp2], %[rtb] \n\t" "mul.ph %[temp6], %[temp3], %[gtb] \n\t" "and %[temp4], %[temp1], %[mask] \n\t" "addiu %[p_argb], %[p_argb], 8 \n\t" "shra.ph %[temp5], %[temp5], 5 \n\t" "shra.ph %[temp6], %[temp6], 5 \n\t" "subu.qb %[temp2], %[temp4], %[temp5] \n\t" "subu.qb %[temp2], %[temp2], %[temp6] \n\t" : [p_argb]"+&r"(p_argb), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6) : [rtb]"r"(rtb), [gtb]"r"(gtb), [mask]"r"(mask) : "memory", "hi", "lo" ); ++histo[(uint8_t)(temp2 >> 16)]; ++histo[(uint8_t)temp2]; } if (tile_width & 1) { ++histo[TransformColorBlue(green_to_blue, red_to_blue, *p_argb)]; } } } static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red, uint32_t argb) { const uint32_t green = argb >> 8; uint32_t new_red = argb >> 16; new_red -= ColorTransformDelta(green_to_red, green); return (new_red & 0xff); } static void CollectColorRedTransforms_MIPSdspR2(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]) { const int gtr = (green_to_red << 16) | (green_to_red & 0xffff); while (tile_height-- > 0) { int x; const uint32_t* p_argb = argb; argb += stride; for (x = 0; x < (tile_width >> 1); ++x) { int temp0, temp1, temp2, temp3, temp4; __asm__ volatile ( "lw %[temp0], 0(%[p_argb]) \n\t" "lw %[temp1], 4(%[p_argb]) \n\t" "precrq.ph.w %[temp4], %[temp0], %[temp1] \n\t" "ins %[temp1], %[temp0], 16, 16 \n\t" "shra.ph %[temp3], %[temp1], 8 \n\t" "mul.ph %[temp2], %[temp3], %[gtr] \n\t" "addiu %[p_argb], %[p_argb], 8 \n\t" "shra.ph %[temp2], %[temp2], 5 \n\t" "subu.qb %[temp2], %[temp4], %[temp2] \n\t" : [p_argb]"+&r"(p_argb), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4) : [gtr]"r"(gtr) : "memory", "hi", "lo" ); ++histo[(uint8_t)(temp2 >> 16)]; ++histo[(uint8_t)temp2]; } if (tile_width & 1) { ++histo[TransformColorRed(green_to_red, *p_argb)]; } } } //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitMIPSdspR2(void) { VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_MIPSdspR2; VP8LTransformColor = TransformColor_MIPSdspR2; VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_MIPSdspR2; VP8LCollectColorRedTransforms = CollectColorRedTransforms_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8LEncDspInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/rescaler_mips32.c0000644000014400001440000003215214606317060014574 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of rescaling functions // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS32) && !defined(WEBP_REDUCE_SIZE) #include #include "src/utils/rescaler_utils.h" //------------------------------------------------------------------------------ // Row import static void ImportRowShrink_MIPS32(WebPRescaler* const wrk, const uint8_t* src) { const int x_stride = wrk->num_channels; const int x_out_max = wrk->dst_width * wrk->num_channels; const int fx_scale = wrk->fx_scale; const int x_add = wrk->x_add; const int x_sub = wrk->x_sub; const int x_stride1 = x_stride << 2; int channel; assert(!wrk->x_expand); assert(!WebPRescalerInputDone(wrk)); for (channel = 0; channel < x_stride; ++channel) { const uint8_t* src1 = src + channel; rescaler_t* frow = wrk->frow + channel; int temp1, temp2, temp3; int base, frac, sum; int accum, accum1; int loop_c = x_out_max - channel; __asm__ volatile ( "li %[temp1], 0x8000 \n\t" "li %[temp2], 0x10000 \n\t" "li %[sum], 0 \n\t" "li %[accum], 0 \n\t" "1: \n\t" "addu %[accum], %[accum], %[x_add] \n\t" "li %[base], 0 \n\t" "blez %[accum], 3f \n\t" "2: \n\t" "lbu %[base], 0(%[src1]) \n\t" "subu %[accum], %[accum], %[x_sub] \n\t" "addu %[src1], %[src1], %[x_stride] \n\t" "addu %[sum], %[sum], %[base] \n\t" "bgtz %[accum], 2b \n\t" "3: \n\t" "negu %[accum1], %[accum] \n\t" "mul %[frac], %[base], %[accum1] \n\t" "mul %[temp3], %[sum], %[x_sub] \n\t" "subu %[loop_c], %[loop_c], %[x_stride] \n\t" "mult %[temp1], %[temp2] \n\t" "maddu %[frac], %[fx_scale] \n\t" "mfhi %[sum] \n\t" "subu %[temp3], %[temp3], %[frac] \n\t" "sw %[temp3], 0(%[frow]) \n\t" "addu %[frow], %[frow], %[x_stride1] \n\t" "bgtz %[loop_c], 1b \n\t" : [accum]"=&r"(accum), [src1]"+r"(src1), [temp3]"=&r"(temp3), [sum]"=&r"(sum), [base]"=&r"(base), [frac]"=&r"(frac), [frow]"+r"(frow), [accum1]"=&r"(accum1), [temp2]"=&r"(temp2), [temp1]"=&r"(temp1) : [x_stride]"r"(x_stride), [fx_scale]"r"(fx_scale), [x_sub]"r"(x_sub), [x_add]"r"(x_add), [loop_c]"r"(loop_c), [x_stride1]"r"(x_stride1) : "memory", "hi", "lo" ); assert(accum == 0); } } static void ImportRowExpand_MIPS32(WebPRescaler* const wrk, const uint8_t* src) { const int x_stride = wrk->num_channels; const int x_out_max = wrk->dst_width * wrk->num_channels; const int x_add = wrk->x_add; const int x_sub = wrk->x_sub; const int src_width = wrk->src_width; const int x_stride1 = x_stride << 2; int channel; assert(wrk->x_expand); assert(!WebPRescalerInputDone(wrk)); for (channel = 0; channel < x_stride; ++channel) { const uint8_t* src1 = src + channel; rescaler_t* frow = wrk->frow + channel; int temp1, temp2, temp3, temp4; int frac; int accum; int x_out = channel; __asm__ volatile ( "addiu %[temp3], %[src_width], -1 \n\t" "lbu %[temp2], 0(%[src1]) \n\t" "addu %[src1], %[src1], %[x_stride] \n\t" "bgtz %[temp3], 0f \n\t" "addiu %[temp1], %[temp2], 0 \n\t" "b 3f \n\t" "0: \n\t" "lbu %[temp1], 0(%[src1]) \n\t" "3: \n\t" "addiu %[accum], %[x_add], 0 \n\t" "1: \n\t" "subu %[temp3], %[temp2], %[temp1] \n\t" "mul %[temp3], %[temp3], %[accum] \n\t" "mul %[temp4], %[temp1], %[x_add] \n\t" "addu %[temp3], %[temp4], %[temp3] \n\t" "sw %[temp3], 0(%[frow]) \n\t" "addu %[frow], %[frow], %[x_stride1] \n\t" "addu %[x_out], %[x_out], %[x_stride] \n\t" "subu %[temp3], %[x_out], %[x_out_max] \n\t" "bgez %[temp3], 2f \n\t" "subu %[accum], %[accum], %[x_sub] \n\t" "bgez %[accum], 4f \n\t" "addiu %[temp2], %[temp1], 0 \n\t" "addu %[src1], %[src1], %[x_stride] \n\t" "lbu %[temp1], 0(%[src1]) \n\t" "addu %[accum], %[accum], %[x_add] \n\t" "4: \n\t" "b 1b \n\t" "2: \n\t" : [src1]"+r"(src1), [accum]"=&r"(accum), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [x_out]"+r"(x_out), [frac]"=&r"(frac), [frow]"+r"(frow) : [x_stride]"r"(x_stride), [x_add]"r"(x_add), [x_sub]"r"(x_sub), [x_stride1]"r"(x_stride1), [src_width]"r"(src_width), [x_out_max]"r"(x_out_max) : "memory", "hi", "lo" ); assert(wrk->x_sub == 0 /* <- special case for src_width=1 */ || accum == 0); } } //------------------------------------------------------------------------------ // Row export static void ExportRowExpand_MIPS32(WebPRescaler* const wrk) { uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* frow = wrk->frow; int temp0, temp1, temp3, temp4, temp5, loop_end; const int temp2 = (int)wrk->fy_scale; const int temp6 = x_out_max << 2; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(wrk->y_expand); assert(wrk->y_sub != 0); if (wrk->y_accum == 0) { __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "addiu %[dst], %[dst], 1 \n\t" "addiu %[frow], %[frow], 4 \n\t" "mult %[temp3], %[temp4] \n\t" "maddu %[temp0], %[temp2] \n\t" "mfhi %[temp5] \n\t" "sb %[temp5], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end) : [temp2]"r"(temp2), [temp6]"r"(temp6) : "memory", "hi", "lo" ); } else { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "lw %[temp1], 0(%[irow]) \n\t" "addiu %[dst], %[dst], 1 \n\t" "mult %[temp3], %[temp4] \n\t" "maddu %[A], %[temp0] \n\t" "maddu %[B], %[temp1] \n\t" "addiu %[frow], %[frow], 4 \n\t" "addiu %[irow], %[irow], 4 \n\t" "mfhi %[temp5] \n\t" "mult %[temp3], %[temp4] \n\t" "maddu %[temp5], %[temp2] \n\t" "mfhi %[temp5] \n\t" "sb %[temp5], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end) : [temp2]"r"(temp2), [temp6]"r"(temp6), [A]"r"(A), [B]"r"(B) : "memory", "hi", "lo" ); } } #if 0 // disabled for now. TODO(skal): make match the C-code static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) { const int x_out_max = wrk->dst_width * wrk->num_channels; uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const rescaler_t* frow = wrk->frow; const int yscale = wrk->fy_scale * (-wrk->y_accum); int temp0, temp1, temp3, temp4, temp5, loop_end; const int temp2 = (int)wrk->fxy_scale; const int temp6 = x_out_max << 2; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); assert(wrk->fxy_scale != 0); if (yscale) { __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "mult %[temp3], %[temp4] \n\t" "addiu %[frow], %[frow], 4 \n\t" "maddu %[temp0], %[yscale] \n\t" "mfhi %[temp1] \n\t" "lw %[temp0], 0(%[irow]) \n\t" "addiu %[dst], %[dst], 1 \n\t" "addiu %[irow], %[irow], 4 \n\t" "subu %[temp0], %[temp0], %[temp1] \n\t" "mult %[temp3], %[temp4] \n\t" "maddu %[temp0], %[temp2] \n\t" "mfhi %[temp5] \n\t" "sw %[temp1], -4(%[irow]) \n\t" "sb %[temp5], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end) : [temp2]"r"(temp2), [yscale]"r"(yscale), [temp6]"r"(temp6) : "memory", "hi", "lo" ); } else { __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[irow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[irow]) \n\t" "addiu %[dst], %[dst], 1 \n\t" "addiu %[irow], %[irow], 4 \n\t" "mult %[temp3], %[temp4] \n\t" "maddu %[temp0], %[temp2] \n\t" "mfhi %[temp5] \n\t" "sw $zero, -4(%[irow]) \n\t" "sb %[temp5], -1(%[dst]) \n\t" "bne %[irow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end) : [temp2]"r"(temp2), [temp6]"r"(temp6) : "memory", "hi", "lo" ); } } #endif // 0 //------------------------------------------------------------------------------ // Entry point extern void WebPRescalerDspInitMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPS32(void) { WebPRescalerImportRowExpand = ImportRowExpand_MIPS32; WebPRescalerImportRowShrink = ImportRowShrink_MIPS32; WebPRescalerExportRowExpand = ExportRowExpand_MIPS32; // WebPRescalerExportRowShrink = ExportRowShrink_MIPS32; } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(WebPRescalerDspInitMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/filters_sse2.c0000644000014400001440000003146514606317060014211 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 variant of alpha filters // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include #include #include //------------------------------------------------------------------------------ // Helpful macro. #define DCHECK(in, out) \ do { \ assert((in) != NULL); \ assert((out) != NULL); \ assert(width > 0); \ assert(height > 0); \ assert(stride >= width); \ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \ (void)height; /* Silence unused warning. */ \ } while (0) static void PredictLineTop_SSE2(const uint8_t* src, const uint8_t* pred, uint8_t* dst, int length) { int i; const int max_pos = length & ~31; assert(length >= 0); for (i = 0; i < max_pos; i += 32) { const __m128i A0 = _mm_loadu_si128((const __m128i*)&src[i + 0]); const __m128i A1 = _mm_loadu_si128((const __m128i*)&src[i + 16]); const __m128i B0 = _mm_loadu_si128((const __m128i*)&pred[i + 0]); const __m128i B1 = _mm_loadu_si128((const __m128i*)&pred[i + 16]); const __m128i C0 = _mm_sub_epi8(A0, B0); const __m128i C1 = _mm_sub_epi8(A1, B1); _mm_storeu_si128((__m128i*)&dst[i + 0], C0); _mm_storeu_si128((__m128i*)&dst[i + 16], C1); } for (; i < length; ++i) dst[i] = src[i] - pred[i]; } // Special case for left-based prediction (when preds==dst-1 or preds==src-1). static void PredictLineLeft_SSE2(const uint8_t* src, uint8_t* dst, int length) { int i; const int max_pos = length & ~31; assert(length >= 0); for (i = 0; i < max_pos; i += 32) { const __m128i A0 = _mm_loadu_si128((const __m128i*)(src + i + 0 )); const __m128i B0 = _mm_loadu_si128((const __m128i*)(src + i + 0 - 1)); const __m128i A1 = _mm_loadu_si128((const __m128i*)(src + i + 16 )); const __m128i B1 = _mm_loadu_si128((const __m128i*)(src + i + 16 - 1)); const __m128i C0 = _mm_sub_epi8(A0, B0); const __m128i C1 = _mm_sub_epi8(A1, B1); _mm_storeu_si128((__m128i*)(dst + i + 0), C0); _mm_storeu_si128((__m128i*)(dst + i + 16), C1); } for (; i < length; ++i) dst[i] = src[i] - src[i - 1]; } //------------------------------------------------------------------------------ // Horizontal filter. static WEBP_INLINE void DoHorizontalFilter_SSE2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; if (row == 0) { // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLineLeft_SSE2(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { // Leftmost pixel is predicted from above. out[0] = in[0] - in[-stride]; PredictLineLeft_SSE2(in + 1, out + 1, width - 1); ++row; in += stride; out += stride; } } //------------------------------------------------------------------------------ // Vertical filter. static WEBP_INLINE void DoVerticalFilter_SSE2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; if (row == 0) { // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLineLeft_SSE2(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { PredictLineTop_SSE2(in, in - stride, out, width); ++row; in += stride; out += stride; } } //------------------------------------------------------------------------------ // Gradient filter. static WEBP_INLINE int GradientPredictor_SSE2(uint8_t a, uint8_t b, uint8_t c) { const int g = a + b - c; return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit } static void GradientPredictDirect_SSE2(const uint8_t* const row, const uint8_t* const top, uint8_t* const out, int length) { const int max_pos = length & ~7; int i; const __m128i zero = _mm_setzero_si128(); for (i = 0; i < max_pos; i += 8) { const __m128i A0 = _mm_loadl_epi64((const __m128i*)&row[i - 1]); const __m128i B0 = _mm_loadl_epi64((const __m128i*)&top[i]); const __m128i C0 = _mm_loadl_epi64((const __m128i*)&top[i - 1]); const __m128i D = _mm_loadl_epi64((const __m128i*)&row[i]); const __m128i A1 = _mm_unpacklo_epi8(A0, zero); const __m128i B1 = _mm_unpacklo_epi8(B0, zero); const __m128i C1 = _mm_unpacklo_epi8(C0, zero); const __m128i E = _mm_add_epi16(A1, B1); const __m128i F = _mm_sub_epi16(E, C1); const __m128i G = _mm_packus_epi16(F, zero); const __m128i H = _mm_sub_epi8(D, G); _mm_storel_epi64((__m128i*)(out + i), H); } for (; i < length; ++i) { const int delta = GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]); out[i] = (uint8_t)(row[i] - delta); } } static WEBP_INLINE void DoGradientFilter_SSE2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; // left prediction for top scan-line if (row == 0) { out[0] = in[0]; PredictLineLeft_SSE2(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } // Filter line-by-line. while (row < last_row) { out[0] = (uint8_t)(in[0] - in[-stride]); GradientPredictDirect_SSE2(in + 1, in + 1 - stride, out + 1, width - 1); ++row; in += stride; out += stride; } } #undef DCHECK //------------------------------------------------------------------------------ static void HorizontalFilter_SSE2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoHorizontalFilter_SSE2(data, width, height, stride, 0, height, filtered_data); } static void VerticalFilter_SSE2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoVerticalFilter_SSE2(data, width, height, stride, 0, height, filtered_data); } static void GradientFilter_SSE2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoGradientFilter_SSE2(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ // Inverse transforms static void HorizontalUnfilter_SSE2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { int i; __m128i last; out[0] = (uint8_t)(in[0] + (prev == NULL ? 0 : prev[0])); if (width <= 1) return; last = _mm_set_epi32(0, 0, 0, out[0]); for (i = 1; i + 8 <= width; i += 8) { const __m128i A0 = _mm_loadl_epi64((const __m128i*)(in + i)); const __m128i A1 = _mm_add_epi8(A0, last); const __m128i A2 = _mm_slli_si128(A1, 1); const __m128i A3 = _mm_add_epi8(A1, A2); const __m128i A4 = _mm_slli_si128(A3, 2); const __m128i A5 = _mm_add_epi8(A3, A4); const __m128i A6 = _mm_slli_si128(A5, 4); const __m128i A7 = _mm_add_epi8(A5, A6); _mm_storel_epi64((__m128i*)(out + i), A7); last = _mm_srli_epi64(A7, 56); } for (; i < width; ++i) out[i] = (uint8_t)(in[i] + out[i - 1]); } static void VerticalUnfilter_SSE2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_SSE2(NULL, in, out, width); } else { int i; const int max_pos = width & ~31; assert(width >= 0); for (i = 0; i < max_pos; i += 32) { const __m128i A0 = _mm_loadu_si128((const __m128i*)&in[i + 0]); const __m128i A1 = _mm_loadu_si128((const __m128i*)&in[i + 16]); const __m128i B0 = _mm_loadu_si128((const __m128i*)&prev[i + 0]); const __m128i B1 = _mm_loadu_si128((const __m128i*)&prev[i + 16]); const __m128i C0 = _mm_add_epi8(A0, B0); const __m128i C1 = _mm_add_epi8(A1, B1); _mm_storeu_si128((__m128i*)&out[i + 0], C0); _mm_storeu_si128((__m128i*)&out[i + 16], C1); } for (; i < width; ++i) out[i] = (uint8_t)(in[i] + prev[i]); } } static void GradientPredictInverse_SSE2(const uint8_t* const in, const uint8_t* const top, uint8_t* const row, int length) { if (length > 0) { int i; const int max_pos = length & ~7; const __m128i zero = _mm_setzero_si128(); __m128i A = _mm_set_epi32(0, 0, 0, row[-1]); // left sample for (i = 0; i < max_pos; i += 8) { const __m128i tmp0 = _mm_loadl_epi64((const __m128i*)&top[i]); const __m128i tmp1 = _mm_loadl_epi64((const __m128i*)&top[i - 1]); const __m128i B = _mm_unpacklo_epi8(tmp0, zero); const __m128i C = _mm_unpacklo_epi8(tmp1, zero); const __m128i D = _mm_loadl_epi64((const __m128i*)&in[i]); // base input const __m128i E = _mm_sub_epi16(B, C); // unclipped gradient basis B - C __m128i out = zero; // accumulator for output __m128i mask_hi = _mm_set_epi32(0, 0, 0, 0xff); int k = 8; while (1) { const __m128i tmp3 = _mm_add_epi16(A, E); // delta = A + B - C const __m128i tmp4 = _mm_packus_epi16(tmp3, zero); // saturate delta const __m128i tmp5 = _mm_add_epi8(tmp4, D); // add to in[] A = _mm_and_si128(tmp5, mask_hi); // 1-complement clip out = _mm_or_si128(out, A); // accumulate output if (--k == 0) break; A = _mm_slli_si128(A, 1); // rotate left sample mask_hi = _mm_slli_si128(mask_hi, 1); // rotate mask A = _mm_unpacklo_epi8(A, zero); // convert 8b->16b } A = _mm_srli_si128(A, 7); // prepare left sample for next iteration _mm_storel_epi64((__m128i*)&row[i], out); } for (; i < length; ++i) { const int delta = GradientPredictor_SSE2(row[i - 1], top[i], top[i - 1]); row[i] = (uint8_t)(in[i] + delta); } } } static void GradientUnfilter_SSE2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_SSE2(NULL, in, out, width); } else { out[0] = (uint8_t)(in[0] + prev[0]); // predict from above GradientPredictInverse_SSE2(in + 1, prev + 1, out + 1, width - 1); } } //------------------------------------------------------------------------------ // Entry point extern void VP8FiltersInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitSSE2(void) { WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_SSE2; #if defined(CHROMIUM) // TODO(crbug.com/654974) (void)VerticalUnfilter_SSE2; #else WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_SSE2; #endif WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_SSE2; WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_SSE2; WebPFilters[WEBP_FILTER_VERTICAL] = VerticalFilter_SSE2; WebPFilters[WEBP_FILTER_GRADIENT] = GradientFilter_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8FiltersInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/upsampling_sse2.c0000644000014400001440000003503014606317060014710 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 version of YUV to RGB upsampling functions. // // Author: somnath@google.com (Somnath Banerjee) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include #include #include "src/dsp/yuv.h" #ifdef FANCY_UPSAMPLING // We compute (9*a + 3*b + 3*c + d + 8) / 16 as follows // u = (9*a + 3*b + 3*c + d + 8) / 16 // = (a + (a + 3*b + 3*c + d) / 8 + 1) / 2 // = (a + m + 1) / 2 // where m = (a + 3*b + 3*c + d) / 8 // = ((a + b + c + d) / 2 + b + c) / 4 // // Let's say k = (a + b + c + d) / 4. // We can compute k as // k = (s + t + 1) / 2 - ((a^d) | (b^c) | (s^t)) & 1 // where s = (a + d + 1) / 2 and t = (b + c + 1) / 2 // // Then m can be written as // m = (k + t + 1) / 2 - (((b^c) & (s^t)) | (k^t)) & 1 // Computes out = (k + in + 1) / 2 - ((ij & (s^t)) | (k^in)) & 1 #define GET_M(ij, in, out) do { \ const __m128i tmp0 = _mm_avg_epu8(k, (in)); /* (k + in + 1) / 2 */ \ const __m128i tmp1 = _mm_and_si128((ij), st); /* (ij) & (s^t) */ \ const __m128i tmp2 = _mm_xor_si128(k, (in)); /* (k^in) */ \ const __m128i tmp3 = _mm_or_si128(tmp1, tmp2); /* ((ij) & (s^t)) | (k^in) */\ const __m128i tmp4 = _mm_and_si128(tmp3, one); /* & 1 -> lsb_correction */ \ (out) = _mm_sub_epi8(tmp0, tmp4); /* (k + in + 1) / 2 - lsb_correction */ \ } while (0) // pack and store two alternating pixel rows #define PACK_AND_STORE(a, b, da, db, out) do { \ const __m128i t_a = _mm_avg_epu8(a, da); /* (9a + 3b + 3c + d + 8) / 16 */ \ const __m128i t_b = _mm_avg_epu8(b, db); /* (3a + 9b + c + 3d + 8) / 16 */ \ const __m128i t_1 = _mm_unpacklo_epi8(t_a, t_b); \ const __m128i t_2 = _mm_unpackhi_epi8(t_a, t_b); \ _mm_store_si128(((__m128i*)(out)) + 0, t_1); \ _mm_store_si128(((__m128i*)(out)) + 1, t_2); \ } while (0) // Loads 17 pixels each from rows r1 and r2 and generates 32 pixels. #define UPSAMPLE_32PIXELS(r1, r2, out) do { \ const __m128i one = _mm_set1_epi8(1); \ const __m128i a = _mm_loadu_si128((const __m128i*)&(r1)[0]); \ const __m128i b = _mm_loadu_si128((const __m128i*)&(r1)[1]); \ const __m128i c = _mm_loadu_si128((const __m128i*)&(r2)[0]); \ const __m128i d = _mm_loadu_si128((const __m128i*)&(r2)[1]); \ \ const __m128i s = _mm_avg_epu8(a, d); /* s = (a + d + 1) / 2 */ \ const __m128i t = _mm_avg_epu8(b, c); /* t = (b + c + 1) / 2 */ \ const __m128i st = _mm_xor_si128(s, t); /* st = s^t */ \ \ const __m128i ad = _mm_xor_si128(a, d); /* ad = a^d */ \ const __m128i bc = _mm_xor_si128(b, c); /* bc = b^c */ \ \ const __m128i t1 = _mm_or_si128(ad, bc); /* (a^d) | (b^c) */ \ const __m128i t2 = _mm_or_si128(t1, st); /* (a^d) | (b^c) | (s^t) */ \ const __m128i t3 = _mm_and_si128(t2, one); /* (a^d) | (b^c) | (s^t) & 1 */ \ const __m128i t4 = _mm_avg_epu8(s, t); \ const __m128i k = _mm_sub_epi8(t4, t3); /* k = (a + b + c + d) / 4 */ \ __m128i diag1, diag2; \ \ GET_M(bc, t, diag1); /* diag1 = (a + 3b + 3c + d) / 8 */ \ GET_M(ad, s, diag2); /* diag2 = (3a + b + c + 3d) / 8 */ \ \ /* pack the alternate pixels */ \ PACK_AND_STORE(a, b, diag1, diag2, (out) + 0); /* store top */ \ PACK_AND_STORE(c, d, diag2, diag1, (out) + 2 * 32); /* store bottom */ \ } while (0) // Turn the macro into a function for reducing code-size when non-critical static void Upsample32Pixels_SSE2(const uint8_t r1[], const uint8_t r2[], uint8_t* const out) { UPSAMPLE_32PIXELS(r1, r2, out); } #define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) { \ uint8_t r1[17], r2[17]; \ memcpy(r1, (tb), (num_pixels)); \ memcpy(r2, (bb), (num_pixels)); \ /* replicate last byte */ \ memset(r1 + (num_pixels), r1[(num_pixels) - 1], 17 - (num_pixels)); \ memset(r2 + (num_pixels), r2[(num_pixels) - 1], 17 - (num_pixels)); \ /* using the shared function instead of the macro saves ~3k code size */ \ Upsample32Pixels_SSE2(r1, r2, out); \ } #define CONVERT2RGB_32(FUNC, XSTEP, top_y, bottom_y, \ top_dst, bottom_dst, cur_x) do { \ FUNC##32_SSE2((top_y) + (cur_x), r_u, r_v, (top_dst) + (cur_x) * (XSTEP)); \ if ((bottom_y) != NULL) { \ FUNC##32_SSE2((bottom_y) + (cur_x), r_u + 64, r_v + 64, \ (bottom_dst) + (cur_x) * (XSTEP)); \ } \ } while (0) #define SSE2_UPSAMPLE_FUNC(FUNC_NAME, FUNC, XSTEP) \ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ const uint8_t* top_u, const uint8_t* top_v, \ const uint8_t* cur_u, const uint8_t* cur_v, \ uint8_t* top_dst, uint8_t* bottom_dst, int len) { \ int uv_pos, pos; \ /* 16byte-aligned array to cache reconstructed u and v */ \ uint8_t uv_buf[14 * 32 + 15] = { 0 }; \ uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~(uintptr_t)15); \ uint8_t* const r_v = r_u + 32; \ \ assert(top_y != NULL); \ { /* Treat the first pixel in regular way */ \ const int u_diag = ((top_u[0] + cur_u[0]) >> 1) + 1; \ const int v_diag = ((top_v[0] + cur_v[0]) >> 1) + 1; \ const int u0_t = (top_u[0] + u_diag) >> 1; \ const int v0_t = (top_v[0] + v_diag) >> 1; \ FUNC(top_y[0], u0_t, v0_t, top_dst); \ if (bottom_y != NULL) { \ const int u0_b = (cur_u[0] + u_diag) >> 1; \ const int v0_b = (cur_v[0] + v_diag) >> 1; \ FUNC(bottom_y[0], u0_b, v0_b, bottom_dst); \ } \ } \ /* For UPSAMPLE_32PIXELS, 17 u/v values must be read-able for each block */ \ for (pos = 1, uv_pos = 0; pos + 32 + 1 <= len; pos += 32, uv_pos += 16) { \ UPSAMPLE_32PIXELS(top_u + uv_pos, cur_u + uv_pos, r_u); \ UPSAMPLE_32PIXELS(top_v + uv_pos, cur_v + uv_pos, r_v); \ CONVERT2RGB_32(FUNC, XSTEP, top_y, bottom_y, top_dst, bottom_dst, pos); \ } \ if (len > 1) { \ const int left_over = ((len + 1) >> 1) - (pos >> 1); \ uint8_t* const tmp_top_dst = r_u + 4 * 32; \ uint8_t* const tmp_bottom_dst = tmp_top_dst + 4 * 32; \ uint8_t* const tmp_top = tmp_bottom_dst + 4 * 32; \ uint8_t* const tmp_bottom = (bottom_y == NULL) ? NULL : tmp_top + 32; \ assert(left_over > 0); \ UPSAMPLE_LAST_BLOCK(top_u + uv_pos, cur_u + uv_pos, left_over, r_u); \ UPSAMPLE_LAST_BLOCK(top_v + uv_pos, cur_v + uv_pos, left_over, r_v); \ memcpy(tmp_top, top_y + pos, len - pos); \ if (bottom_y != NULL) memcpy(tmp_bottom, bottom_y + pos, len - pos); \ CONVERT2RGB_32(FUNC, XSTEP, tmp_top, tmp_bottom, tmp_top_dst, \ tmp_bottom_dst, 0); \ memcpy(top_dst + pos * (XSTEP), tmp_top_dst, (len - pos) * (XSTEP)); \ if (bottom_y != NULL) { \ memcpy(bottom_dst + pos * (XSTEP), tmp_bottom_dst, \ (len - pos) * (XSTEP)); \ } \ } \ } // SSE2 variants of the fancy upsampler. SSE2_UPSAMPLE_FUNC(UpsampleRgbaLinePair_SSE2, VP8YuvToRgba, 4) SSE2_UPSAMPLE_FUNC(UpsampleBgraLinePair_SSE2, VP8YuvToBgra, 4) #if !defined(WEBP_REDUCE_CSP) SSE2_UPSAMPLE_FUNC(UpsampleRgbLinePair_SSE2, VP8YuvToRgb, 3) SSE2_UPSAMPLE_FUNC(UpsampleBgrLinePair_SSE2, VP8YuvToBgr, 3) SSE2_UPSAMPLE_FUNC(UpsampleArgbLinePair_SSE2, VP8YuvToArgb, 4) SSE2_UPSAMPLE_FUNC(UpsampleRgba4444LinePair_SSE2, VP8YuvToRgba4444, 2) SSE2_UPSAMPLE_FUNC(UpsampleRgb565LinePair_SSE2, VP8YuvToRgb565, 2) #endif // WEBP_REDUCE_CSP #undef GET_M #undef PACK_AND_STORE #undef UPSAMPLE_32PIXELS #undef UPSAMPLE_LAST_BLOCK #undef CONVERT2RGB #undef CONVERT2RGB_32 #undef SSE2_UPSAMPLE_FUNC //------------------------------------------------------------------------------ // Entry point extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; extern void WebPInitUpsamplersSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitUpsamplersSSE2(void) { WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePair_SSE2; WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePair_SSE2; WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePair_SSE2; WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePair_SSE2; #if !defined(WEBP_REDUCE_CSP) WebPUpsamplers[MODE_RGB] = UpsampleRgbLinePair_SSE2; WebPUpsamplers[MODE_BGR] = UpsampleBgrLinePair_SSE2; WebPUpsamplers[MODE_ARGB] = UpsampleArgbLinePair_SSE2; WebPUpsamplers[MODE_Argb] = UpsampleArgbLinePair_SSE2; WebPUpsamplers[MODE_RGB_565] = UpsampleRgb565LinePair_SSE2; WebPUpsamplers[MODE_RGBA_4444] = UpsampleRgba4444LinePair_SSE2; WebPUpsamplers[MODE_rgbA_4444] = UpsampleRgba4444LinePair_SSE2; #endif // WEBP_REDUCE_CSP } #endif // FANCY_UPSAMPLING //------------------------------------------------------------------------------ extern WebPYUV444Converter WebPYUV444Converters[/* MODE_LAST */]; extern void WebPInitYUV444ConvertersSSE2(void); #define YUV444_FUNC(FUNC_NAME, CALL, CALL_C, XSTEP) \ extern void CALL_C(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len); \ static void FUNC_NAME(const uint8_t* y, const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i; \ const int max_len = len & ~31; \ for (i = 0; i < max_len; i += 32) { \ CALL(y + i, u + i, v + i, dst + i * (XSTEP)); \ } \ if (i < len) { /* C-fallback */ \ CALL_C(y + i, u + i, v + i, dst + i * (XSTEP), len - i); \ } \ } YUV444_FUNC(Yuv444ToRgba_SSE2, VP8YuvToRgba32_SSE2, WebPYuv444ToRgba_C, 4) YUV444_FUNC(Yuv444ToBgra_SSE2, VP8YuvToBgra32_SSE2, WebPYuv444ToBgra_C, 4) #if !defined(WEBP_REDUCE_CSP) YUV444_FUNC(Yuv444ToRgb_SSE2, VP8YuvToRgb32_SSE2, WebPYuv444ToRgb_C, 3) YUV444_FUNC(Yuv444ToBgr_SSE2, VP8YuvToBgr32_SSE2, WebPYuv444ToBgr_C, 3) YUV444_FUNC(Yuv444ToArgb_SSE2, VP8YuvToArgb32_SSE2, WebPYuv444ToArgb_C, 4) YUV444_FUNC(Yuv444ToRgba4444_SSE2, VP8YuvToRgba444432_SSE2, \ WebPYuv444ToRgba4444_C, 2) YUV444_FUNC(Yuv444ToRgb565_SSE2, VP8YuvToRgb56532_SSE2, WebPYuv444ToRgb565_C, 2) #endif // WEBP_REDUCE_CSP WEBP_TSAN_IGNORE_FUNCTION void WebPInitYUV444ConvertersSSE2(void) { WebPYUV444Converters[MODE_RGBA] = Yuv444ToRgba_SSE2; WebPYUV444Converters[MODE_BGRA] = Yuv444ToBgra_SSE2; WebPYUV444Converters[MODE_rgbA] = Yuv444ToRgba_SSE2; WebPYUV444Converters[MODE_bgrA] = Yuv444ToBgra_SSE2; #if !defined(WEBP_REDUCE_CSP) WebPYUV444Converters[MODE_RGB] = Yuv444ToRgb_SSE2; WebPYUV444Converters[MODE_BGR] = Yuv444ToBgr_SSE2; WebPYUV444Converters[MODE_ARGB] = Yuv444ToArgb_SSE2; WebPYUV444Converters[MODE_RGBA_4444] = Yuv444ToRgba4444_SSE2; WebPYUV444Converters[MODE_RGB_565] = Yuv444ToRgb565_SSE2; WebPYUV444Converters[MODE_Argb] = Yuv444ToArgb_SSE2; WebPYUV444Converters[MODE_rgbA_4444] = Yuv444ToRgba4444_SSE2; #endif // WEBP_REDUCE_CSP } #else WEBP_DSP_INIT_STUB(WebPInitYUV444ConvertersSSE2) #endif // WEBP_USE_SSE2 #if !(defined(FANCY_UPSAMPLING) && defined(WEBP_USE_SSE2)) WEBP_DSP_INIT_STUB(WebPInitUpsamplersSSE2) #endif libwebp-1.4.0/src/dsp/rescaler_mips_dsp_r2.c0000644000014400001440000003722014606317060015701 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of rescaling functions // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) && !defined(WEBP_REDUCE_SIZE) #include #include "src/utils/rescaler_utils.h" #define ROUNDER (WEBP_RESCALER_ONE >> 1) #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) #define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX) //------------------------------------------------------------------------------ // Row export #if 0 // disabled for now. TODO(skal): make match the C-code static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) { int i; const int x_out_max = wrk->dst_width * wrk->num_channels; uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const rescaler_t* frow = wrk->frow; const int yscale = wrk->fy_scale * (-wrk->y_accum); int temp0, temp1, temp2, temp3, temp4, temp5, loop_end; const int temp7 = (int)wrk->fxy_scale; const int temp6 = (x_out_max & ~0x3) << 2; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); assert(wrk->fxy_scale != 0); if (yscale) { if (x_out_max >= 4) { int temp8, temp9, temp10, temp11; __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "lw %[temp1], 4(%[frow]) \n\t" "lw %[temp2], 8(%[frow]) \n\t" "lw %[temp5], 12(%[frow]) \n\t" "mult $ac0, %[temp3], %[temp4] \n\t" "maddu $ac0, %[temp0], %[yscale] \n\t" "mult $ac1, %[temp3], %[temp4] \n\t" "maddu $ac1, %[temp1], %[yscale] \n\t" "mult $ac2, %[temp3], %[temp4] \n\t" "maddu $ac2, %[temp2], %[yscale] \n\t" "mult $ac3, %[temp3], %[temp4] \n\t" "maddu $ac3, %[temp5], %[yscale] \n\t" "addiu %[frow], %[frow], 16 \n\t" "mfhi %[temp0], $ac0 \n\t" "mfhi %[temp1], $ac1 \n\t" "mfhi %[temp2], $ac2 \n\t" "mfhi %[temp5], $ac3 \n\t" "lw %[temp8], 0(%[irow]) \n\t" "lw %[temp9], 4(%[irow]) \n\t" "lw %[temp10], 8(%[irow]) \n\t" "lw %[temp11], 12(%[irow]) \n\t" "addiu %[dst], %[dst], 4 \n\t" "addiu %[irow], %[irow], 16 \n\t" "subu %[temp8], %[temp8], %[temp0] \n\t" "subu %[temp9], %[temp9], %[temp1] \n\t" "subu %[temp10], %[temp10], %[temp2] \n\t" "subu %[temp11], %[temp11], %[temp5] \n\t" "mult $ac0, %[temp3], %[temp4] \n\t" "maddu $ac0, %[temp8], %[temp7] \n\t" "mult $ac1, %[temp3], %[temp4] \n\t" "maddu $ac1, %[temp9], %[temp7] \n\t" "mult $ac2, %[temp3], %[temp4] \n\t" "maddu $ac2, %[temp10], %[temp7] \n\t" "mult $ac3, %[temp3], %[temp4] \n\t" "maddu $ac3, %[temp11], %[temp7] \n\t" "mfhi %[temp8], $ac0 \n\t" "mfhi %[temp9], $ac1 \n\t" "mfhi %[temp10], $ac2 \n\t" "mfhi %[temp11], $ac3 \n\t" "sw %[temp0], -16(%[irow]) \n\t" "sw %[temp1], -12(%[irow]) \n\t" "sw %[temp2], -8(%[irow]) \n\t" "sw %[temp5], -4(%[irow]) \n\t" "sb %[temp8], -4(%[dst]) \n\t" "sb %[temp9], -3(%[dst]) \n\t" "sb %[temp10], -2(%[dst]) \n\t" "sb %[temp11], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11), [temp2]"=&r"(temp2) : [temp7]"r"(temp7), [yscale]"r"(yscale), [temp6]"r"(temp6) : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo" ); } for (i = 0; i < (x_out_max & 0x3); ++i) { const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(*frow++, yscale); const int v = (int)MULT_FIX(*irow - frac, wrk->fxy_scale); *dst++ = (v > 255) ? 255u : (uint8_t)v; *irow++ = frac; // new fractional start } } else { if (x_out_max >= 4) { __asm__ volatile ( "li %[temp3], 0x10000 \n\t" "li %[temp4], 0x8000 \n\t" "addu %[loop_end], %[irow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[irow]) \n\t" "lw %[temp1], 4(%[irow]) \n\t" "lw %[temp2], 8(%[irow]) \n\t" "lw %[temp5], 12(%[irow]) \n\t" "addiu %[dst], %[dst], 4 \n\t" "addiu %[irow], %[irow], 16 \n\t" "mult $ac0, %[temp3], %[temp4] \n\t" "maddu $ac0, %[temp0], %[temp7] \n\t" "mult $ac1, %[temp3], %[temp4] \n\t" "maddu $ac1, %[temp1], %[temp7] \n\t" "mult $ac2, %[temp3], %[temp4] \n\t" "maddu $ac2, %[temp2], %[temp7] \n\t" "mult $ac3, %[temp3], %[temp4] \n\t" "maddu $ac3, %[temp5], %[temp7] \n\t" "mfhi %[temp0], $ac0 \n\t" "mfhi %[temp1], $ac1 \n\t" "mfhi %[temp2], $ac2 \n\t" "mfhi %[temp5], $ac3 \n\t" "sw $zero, -16(%[irow]) \n\t" "sw $zero, -12(%[irow]) \n\t" "sw $zero, -8(%[irow]) \n\t" "sw $zero, -4(%[irow]) \n\t" "sb %[temp0], -4(%[dst]) \n\t" "sb %[temp1], -3(%[dst]) \n\t" "sb %[temp2], -2(%[dst]) \n\t" "sb %[temp5], -1(%[dst]) \n\t" "bne %[irow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end), [temp2]"=&r"(temp2) : [temp7]"r"(temp7), [temp6]"r"(temp6) : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo" ); } for (i = 0; i < (x_out_max & 0x3); ++i) { const int v = (int)MULT_FIX_FLOOR(*irow, wrk->fxy_scale); *dst++ = (v > 255) ? 255u : (uint8_t)v; *irow++ = 0; } } } #endif // 0 static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) { int i; uint8_t* dst = wrk->dst; rescaler_t* irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* frow = wrk->frow; int temp0, temp1, temp2, temp3, temp4, temp5, loop_end; const int temp6 = (x_out_max & ~0x3) << 2; const int temp7 = (int)wrk->fy_scale; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(wrk->y_expand); assert(wrk->y_sub != 0); if (wrk->y_accum == 0) { if (x_out_max >= 4) { __asm__ volatile ( "li %[temp4], 0x10000 \n\t" "li %[temp5], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "lw %[temp1], 4(%[frow]) \n\t" "lw %[temp2], 8(%[frow]) \n\t" "lw %[temp3], 12(%[frow]) \n\t" "addiu %[dst], %[dst], 4 \n\t" "addiu %[frow], %[frow], 16 \n\t" "mult $ac0, %[temp4], %[temp5] \n\t" "maddu $ac0, %[temp0], %[temp7] \n\t" "mult $ac1, %[temp4], %[temp5] \n\t" "maddu $ac1, %[temp1], %[temp7] \n\t" "mult $ac2, %[temp4], %[temp5] \n\t" "maddu $ac2, %[temp2], %[temp7] \n\t" "mult $ac3, %[temp4], %[temp5] \n\t" "maddu $ac3, %[temp3], %[temp7] \n\t" "mfhi %[temp0], $ac0 \n\t" "mfhi %[temp1], $ac1 \n\t" "mfhi %[temp2], $ac2 \n\t" "mfhi %[temp3], $ac3 \n\t" "sb %[temp0], -4(%[dst]) \n\t" "sb %[temp1], -3(%[dst]) \n\t" "sb %[temp2], -2(%[dst]) \n\t" "sb %[temp3], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end), [temp2]"=&r"(temp2) : [temp7]"r"(temp7), [temp6]"r"(temp6) : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo" ); } for (i = 0; i < (x_out_max & 0x3); ++i) { const uint32_t J = *frow++; const int v = (int)MULT_FIX(J, wrk->fy_scale); *dst++ = (v > 255) ? 255u : (uint8_t)v; } } else { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); if (x_out_max >= 4) { int temp8, temp9, temp10, temp11; __asm__ volatile ( "li %[temp8], 0x10000 \n\t" "li %[temp9], 0x8000 \n\t" "addu %[loop_end], %[frow], %[temp6] \n\t" "1: \n\t" "lw %[temp0], 0(%[frow]) \n\t" "lw %[temp1], 4(%[frow]) \n\t" "lw %[temp2], 8(%[frow]) \n\t" "lw %[temp3], 12(%[frow]) \n\t" "lw %[temp4], 0(%[irow]) \n\t" "lw %[temp5], 4(%[irow]) \n\t" "lw %[temp10], 8(%[irow]) \n\t" "lw %[temp11], 12(%[irow]) \n\t" "addiu %[dst], %[dst], 4 \n\t" "mult $ac0, %[temp8], %[temp9] \n\t" "maddu $ac0, %[A], %[temp0] \n\t" "maddu $ac0, %[B], %[temp4] \n\t" "mult $ac1, %[temp8], %[temp9] \n\t" "maddu $ac1, %[A], %[temp1] \n\t" "maddu $ac1, %[B], %[temp5] \n\t" "mult $ac2, %[temp8], %[temp9] \n\t" "maddu $ac2, %[A], %[temp2] \n\t" "maddu $ac2, %[B], %[temp10] \n\t" "mult $ac3, %[temp8], %[temp9] \n\t" "maddu $ac3, %[A], %[temp3] \n\t" "maddu $ac3, %[B], %[temp11] \n\t" "addiu %[frow], %[frow], 16 \n\t" "addiu %[irow], %[irow], 16 \n\t" "mfhi %[temp0], $ac0 \n\t" "mfhi %[temp1], $ac1 \n\t" "mfhi %[temp2], $ac2 \n\t" "mfhi %[temp3], $ac3 \n\t" "mult $ac0, %[temp8], %[temp9] \n\t" "maddu $ac0, %[temp0], %[temp7] \n\t" "mult $ac1, %[temp8], %[temp9] \n\t" "maddu $ac1, %[temp1], %[temp7] \n\t" "mult $ac2, %[temp8], %[temp9] \n\t" "maddu $ac2, %[temp2], %[temp7] \n\t" "mult $ac3, %[temp8], %[temp9] \n\t" "maddu $ac3, %[temp3], %[temp7] \n\t" "mfhi %[temp0], $ac0 \n\t" "mfhi %[temp1], $ac1 \n\t" "mfhi %[temp2], $ac2 \n\t" "mfhi %[temp3], $ac3 \n\t" "sb %[temp0], -4(%[dst]) \n\t" "sb %[temp1], -3(%[dst]) \n\t" "sb %[temp2], -2(%[dst]) \n\t" "sb %[temp3], -1(%[dst]) \n\t" "bne %[frow], %[loop_end], 1b \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [frow]"+r"(frow), [irow]"+r"(irow), [dst]"+r"(dst), [loop_end]"=&r"(loop_end), [temp8]"=&r"(temp8), [temp9]"=&r"(temp9), [temp10]"=&r"(temp10), [temp11]"=&r"(temp11), [temp2]"=&r"(temp2) : [temp7]"r"(temp7), [temp6]"r"(temp6), [A]"r"(A), [B]"r"(B) : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo" ); } for (i = 0; i < (x_out_max & 0x3); ++i) { const uint64_t I = (uint64_t)A * *frow++ + (uint64_t)B * *irow++; const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); const int v = (int)MULT_FIX(J, wrk->fy_scale); *dst++ = (v > 255) ? 255u : (uint8_t)v; } } } #undef MULT_FIX_FLOOR #undef MULT_FIX #undef ROUNDER //------------------------------------------------------------------------------ // Entry point extern void WebPRescalerDspInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPSdspR2(void) { WebPRescalerExportRowExpand = ExportRowExpand_MIPSdspR2; // WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(WebPRescalerDspInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/yuv_sse41.c0000644000014400001440000005625314606317060013451 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV->RGB conversion functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/yuv.h" #if defined(WEBP_USE_SSE41) #include #include #include "src/dsp/common_sse41.h" #include "src/utils/utils.h" //----------------------------------------------------------------------------- // Convert spans of 32 pixels to various RGB formats for the fancy upsampler. // These constants are 14b fixed-point version of ITU-R BT.601 constants. // R = (19077 * y + 26149 * v - 14234) >> 6 // G = (19077 * y - 6419 * u - 13320 * v + 8708) >> 6 // B = (19077 * y + 33050 * u - 17685) >> 6 static void ConvertYUV444ToRGB_SSE41(const __m128i* const Y0, const __m128i* const U0, const __m128i* const V0, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i k19077 = _mm_set1_epi16(19077); const __m128i k26149 = _mm_set1_epi16(26149); const __m128i k14234 = _mm_set1_epi16(14234); // 33050 doesn't fit in a signed short: only use this with unsigned arithmetic const __m128i k33050 = _mm_set1_epi16((short)33050); const __m128i k17685 = _mm_set1_epi16(17685); const __m128i k6419 = _mm_set1_epi16(6419); const __m128i k13320 = _mm_set1_epi16(13320); const __m128i k8708 = _mm_set1_epi16(8708); const __m128i Y1 = _mm_mulhi_epu16(*Y0, k19077); const __m128i R0 = _mm_mulhi_epu16(*V0, k26149); const __m128i R1 = _mm_sub_epi16(Y1, k14234); const __m128i R2 = _mm_add_epi16(R1, R0); const __m128i G0 = _mm_mulhi_epu16(*U0, k6419); const __m128i G1 = _mm_mulhi_epu16(*V0, k13320); const __m128i G2 = _mm_add_epi16(Y1, k8708); const __m128i G3 = _mm_add_epi16(G0, G1); const __m128i G4 = _mm_sub_epi16(G2, G3); // be careful with the saturated *unsigned* arithmetic here! const __m128i B0 = _mm_mulhi_epu16(*U0, k33050); const __m128i B1 = _mm_adds_epu16(B0, Y1); const __m128i B2 = _mm_subs_epu16(B1, k17685); // use logical shift for B2, which can be larger than 32767 *R = _mm_srai_epi16(R2, 6); // range: [-14234, 30815] *G = _mm_srai_epi16(G4, 6); // range: [-10953, 27710] *B = _mm_srli_epi16(B2, 6); // range: [0, 34238] } // Load the bytes into the *upper* part of 16b words. That's "<< 8", basically. static WEBP_INLINE __m128i Load_HI_16_SSE41(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); return _mm_unpacklo_epi8(zero, _mm_loadl_epi64((const __m128i*)src)); } // Load and replicate the U/V samples static WEBP_INLINE __m128i Load_UV_HI_8_SSE41(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src)); const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0); return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples } // Convert 32 samples of YUV444 to R/G/B static void YUV444ToRGB_SSE41(const uint8_t* const y, const uint8_t* const u, const uint8_t* const v, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i Y0 = Load_HI_16_SSE41(y), U0 = Load_HI_16_SSE41(u), V0 = Load_HI_16_SSE41(v); ConvertYUV444ToRGB_SSE41(&Y0, &U0, &V0, R, G, B); } // Convert 32 samples of YUV420 to R/G/B static void YUV420ToRGB_SSE41(const uint8_t* const y, const uint8_t* const u, const uint8_t* const v, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i Y0 = Load_HI_16_SSE41(y), U0 = Load_UV_HI_8_SSE41(u), V0 = Load_UV_HI_8_SSE41(v); ConvertYUV444ToRGB_SSE41(&Y0, &U0, &V0, R, G, B); } // Pack the planar buffers // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // triplet by triplet in the output buffer rgb as rgbrgbrgbrgb ... static WEBP_INLINE void PlanarTo24b_SSE41( __m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3, __m128i* const in4, __m128i* const in5, uint8_t* const rgb) { // The input is 6 registers of sixteen 8b but for the sake of explanation, // let's take 6 registers of four 8b values. // To pack, we will keep taking one every two 8b integer and move it // around as follows: // Input: // r0r1r2r3 | r4r5r6r7 | g0g1g2g3 | g4g5g6g7 | b0b1b2b3 | b4b5b6b7 // Split the 6 registers in two sets of 3 registers: the first set as the even // 8b bytes, the second the odd ones: // r0r2r4r6 | g0g2g4g6 | b0b2b4b6 | r1r3r5r7 | g1g3g5g7 | b1b3b5b7 // Repeat the same permutations twice more: // r0r4g0g4 | b0b4r1r5 | g1g5b1b5 | r2r6g2g6 | b2b6r3r7 | g3g7b3b7 // r0g0b0r1 | g1b1r2g2 | b2r3g3b3 | r4g4b4r5 | g5b5r6g6 | b6r7g7b7 VP8PlanarTo24b_SSE41(in0, in1, in2, in3, in4, in5); _mm_storeu_si128((__m128i*)(rgb + 0), *in0); _mm_storeu_si128((__m128i*)(rgb + 16), *in1); _mm_storeu_si128((__m128i*)(rgb + 32), *in2); _mm_storeu_si128((__m128i*)(rgb + 48), *in3); _mm_storeu_si128((__m128i*)(rgb + 64), *in4); _mm_storeu_si128((__m128i*)(rgb + 80), *in5); } void VP8YuvToRgb32_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i rgb0, rgb1, rgb2, rgb3, rgb4, rgb5; YUV444ToRGB_SSE41(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV444ToRGB_SSE41(y + 8, u + 8, v + 8, &R1, &G1, &B1); YUV444ToRGB_SSE41(y + 16, u + 16, v + 16, &R2, &G2, &B2); YUV444ToRGB_SSE41(y + 24, u + 24, v + 24, &R3, &G3, &B3); // Cast to 8b and store as RRRRGGGGBBBB. rgb0 = _mm_packus_epi16(R0, R1); rgb1 = _mm_packus_epi16(R2, R3); rgb2 = _mm_packus_epi16(G0, G1); rgb3 = _mm_packus_epi16(G2, G3); rgb4 = _mm_packus_epi16(B0, B1); rgb5 = _mm_packus_epi16(B2, B3); // Pack as RGBRGBRGBRGB. PlanarTo24b_SSE41(&rgb0, &rgb1, &rgb2, &rgb3, &rgb4, &rgb5, dst); } void VP8YuvToBgr32_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i bgr0, bgr1, bgr2, bgr3, bgr4, bgr5; YUV444ToRGB_SSE41(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV444ToRGB_SSE41(y + 8, u + 8, v + 8, &R1, &G1, &B1); YUV444ToRGB_SSE41(y + 16, u + 16, v + 16, &R2, &G2, &B2); YUV444ToRGB_SSE41(y + 24, u + 24, v + 24, &R3, &G3, &B3); // Cast to 8b and store as BBBBGGGGRRRR. bgr0 = _mm_packus_epi16(B0, B1); bgr1 = _mm_packus_epi16(B2, B3); bgr2 = _mm_packus_epi16(G0, G1); bgr3 = _mm_packus_epi16(G2, G3); bgr4 = _mm_packus_epi16(R0, R1); bgr5= _mm_packus_epi16(R2, R3); // Pack as BGRBGRBGRBGR. PlanarTo24b_SSE41(&bgr0, &bgr1, &bgr2, &bgr3, &bgr4, &bgr5, dst); } //----------------------------------------------------------------------------- // Arbitrary-length row conversion functions static void YuvToRgbRow_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { int n; for (n = 0; n + 32 <= len; n += 32, dst += 32 * 3) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i rgb0, rgb1, rgb2, rgb3, rgb4, rgb5; YUV420ToRGB_SSE41(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV420ToRGB_SSE41(y + 8, u + 4, v + 4, &R1, &G1, &B1); YUV420ToRGB_SSE41(y + 16, u + 8, v + 8, &R2, &G2, &B2); YUV420ToRGB_SSE41(y + 24, u + 12, v + 12, &R3, &G3, &B3); // Cast to 8b and store as RRRRGGGGBBBB. rgb0 = _mm_packus_epi16(R0, R1); rgb1 = _mm_packus_epi16(R2, R3); rgb2 = _mm_packus_epi16(G0, G1); rgb3 = _mm_packus_epi16(G2, G3); rgb4 = _mm_packus_epi16(B0, B1); rgb5 = _mm_packus_epi16(B2, B3); // Pack as RGBRGBRGBRGB. PlanarTo24b_SSE41(&rgb0, &rgb1, &rgb2, &rgb3, &rgb4, &rgb5, dst); y += 32; u += 16; v += 16; } for (; n < len; ++n) { // Finish off VP8YuvToRgb(y[0], u[0], v[0], dst); dst += 3; y += 1; u += (n & 1); v += (n & 1); } } static void YuvToBgrRow_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { int n; for (n = 0; n + 32 <= len; n += 32, dst += 32 * 3) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i bgr0, bgr1, bgr2, bgr3, bgr4, bgr5; YUV420ToRGB_SSE41(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV420ToRGB_SSE41(y + 8, u + 4, v + 4, &R1, &G1, &B1); YUV420ToRGB_SSE41(y + 16, u + 8, v + 8, &R2, &G2, &B2); YUV420ToRGB_SSE41(y + 24, u + 12, v + 12, &R3, &G3, &B3); // Cast to 8b and store as BBBBGGGGRRRR. bgr0 = _mm_packus_epi16(B0, B1); bgr1 = _mm_packus_epi16(B2, B3); bgr2 = _mm_packus_epi16(G0, G1); bgr3 = _mm_packus_epi16(G2, G3); bgr4 = _mm_packus_epi16(R0, R1); bgr5 = _mm_packus_epi16(R2, R3); // Pack as BGRBGRBGRBGR. PlanarTo24b_SSE41(&bgr0, &bgr1, &bgr2, &bgr3, &bgr4, &bgr5, dst); y += 32; u += 16; v += 16; } for (; n < len; ++n) { // Finish off VP8YuvToBgr(y[0], u[0], v[0], dst); dst += 3; y += 1; u += (n & 1); v += (n & 1); } } //------------------------------------------------------------------------------ // Entry point extern void WebPInitSamplersSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersSSE41(void) { WebPSamplers[MODE_RGB] = YuvToRgbRow_SSE41; WebPSamplers[MODE_BGR] = YuvToBgrRow_SSE41; } //------------------------------------------------------------------------------ // RGB24/32 -> YUV converters // Load eight 16b-words from *src. #define LOAD_16(src) _mm_loadu_si128((const __m128i*)(src)) // Store either 16b-words into *dst #define STORE_16(V, dst) _mm_storeu_si128((__m128i*)(dst), (V)) #define WEBP_SSE41_SHUFF(OUT) do { \ const __m128i tmp0 = _mm_shuffle_epi8(A0, shuff0); \ const __m128i tmp1 = _mm_shuffle_epi8(A1, shuff1); \ const __m128i tmp2 = _mm_shuffle_epi8(A2, shuff2); \ const __m128i tmp3 = _mm_shuffle_epi8(A3, shuff0); \ const __m128i tmp4 = _mm_shuffle_epi8(A4, shuff1); \ const __m128i tmp5 = _mm_shuffle_epi8(A5, shuff2); \ \ /* OR everything to get one channel */ \ const __m128i tmp6 = _mm_or_si128(tmp0, tmp1); \ const __m128i tmp7 = _mm_or_si128(tmp3, tmp4); \ out[OUT + 0] = _mm_or_si128(tmp6, tmp2); \ out[OUT + 1] = _mm_or_si128(tmp7, tmp5); \ } while (0); // Unpack the 8b input rgbrgbrgbrgb ... as contiguous registers: // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // Similar to PlanarTo24bHelper(), but in reverse order. static WEBP_INLINE void RGB24PackedToPlanar_SSE41( const uint8_t* const rgb, __m128i* const out /*out[6]*/) { const __m128i A0 = _mm_loadu_si128((const __m128i*)(rgb + 0)); const __m128i A1 = _mm_loadu_si128((const __m128i*)(rgb + 16)); const __m128i A2 = _mm_loadu_si128((const __m128i*)(rgb + 32)); const __m128i A3 = _mm_loadu_si128((const __m128i*)(rgb + 48)); const __m128i A4 = _mm_loadu_si128((const __m128i*)(rgb + 64)); const __m128i A5 = _mm_loadu_si128((const __m128i*)(rgb + 80)); // Compute RR. { const __m128i shuff0 = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 12, 9, 6, 3, 0); const __m128i shuff1 = _mm_set_epi8( -1, -1, -1, -1, -1, 14, 11, 8, 5, 2, -1, -1, -1, -1, -1, -1); const __m128i shuff2 = _mm_set_epi8( 13, 10, 7, 4, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); WEBP_SSE41_SHUFF(0) } // Compute GG. { const __m128i shuff0 = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 10, 7, 4, 1); const __m128i shuff1 = _mm_set_epi8( -1, -1, -1, -1, -1, 15, 12, 9, 6, 3, 0, -1, -1, -1, -1, -1); const __m128i shuff2 = _mm_set_epi8( 14, 11, 8, 5, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); WEBP_SSE41_SHUFF(2) } // Compute BB. { const __m128i shuff0 = _mm_set_epi8( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, 11, 8, 5, 2); const __m128i shuff1 = _mm_set_epi8( -1, -1, -1, -1, -1, -1, 13, 10, 7, 4, 1, -1, -1, -1, -1, -1); const __m128i shuff2 = _mm_set_epi8( 15, 12, 9, 6, 3, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); WEBP_SSE41_SHUFF(4) } } #undef WEBP_SSE41_SHUFF // Convert 8 packed ARGB to r[], g[], b[] static WEBP_INLINE void RGB32PackedToPlanar_SSE41( const uint32_t* const argb, __m128i* const rgb /*in[6]*/) { const __m128i zero = _mm_setzero_si128(); __m128i a0 = LOAD_16(argb + 0); __m128i a1 = LOAD_16(argb + 4); __m128i a2 = LOAD_16(argb + 8); __m128i a3 = LOAD_16(argb + 12); VP8L32bToPlanar_SSE41(&a0, &a1, &a2, &a3); rgb[0] = _mm_unpacklo_epi8(a1, zero); rgb[1] = _mm_unpackhi_epi8(a1, zero); rgb[2] = _mm_unpacklo_epi8(a2, zero); rgb[3] = _mm_unpackhi_epi8(a2, zero); rgb[4] = _mm_unpacklo_epi8(a3, zero); rgb[5] = _mm_unpackhi_epi8(a3, zero); } // This macro computes (RG * MULT_RG + GB * MULT_GB + ROUNDER) >> DESCALE_FIX // It's a macro and not a function because we need to use immediate values with // srai_epi32, e.g. #define TRANSFORM(RG_LO, RG_HI, GB_LO, GB_HI, MULT_RG, MULT_GB, \ ROUNDER, DESCALE_FIX, OUT) do { \ const __m128i V0_lo = _mm_madd_epi16(RG_LO, MULT_RG); \ const __m128i V0_hi = _mm_madd_epi16(RG_HI, MULT_RG); \ const __m128i V1_lo = _mm_madd_epi16(GB_LO, MULT_GB); \ const __m128i V1_hi = _mm_madd_epi16(GB_HI, MULT_GB); \ const __m128i V2_lo = _mm_add_epi32(V0_lo, V1_lo); \ const __m128i V2_hi = _mm_add_epi32(V0_hi, V1_hi); \ const __m128i V3_lo = _mm_add_epi32(V2_lo, ROUNDER); \ const __m128i V3_hi = _mm_add_epi32(V2_hi, ROUNDER); \ const __m128i V5_lo = _mm_srai_epi32(V3_lo, DESCALE_FIX); \ const __m128i V5_hi = _mm_srai_epi32(V3_hi, DESCALE_FIX); \ (OUT) = _mm_packs_epi32(V5_lo, V5_hi); \ } while (0) #define MK_CST_16(A, B) _mm_set_epi16((B), (A), (B), (A), (B), (A), (B), (A)) static WEBP_INLINE void ConvertRGBToY_SSE41(const __m128i* const R, const __m128i* const G, const __m128i* const B, __m128i* const Y) { const __m128i kRG_y = MK_CST_16(16839, 33059 - 16384); const __m128i kGB_y = MK_CST_16(16384, 6420); const __m128i kHALF_Y = _mm_set1_epi32((16 << YUV_FIX) + YUV_HALF); const __m128i RG_lo = _mm_unpacklo_epi16(*R, *G); const __m128i RG_hi = _mm_unpackhi_epi16(*R, *G); const __m128i GB_lo = _mm_unpacklo_epi16(*G, *B); const __m128i GB_hi = _mm_unpackhi_epi16(*G, *B); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_y, kGB_y, kHALF_Y, YUV_FIX, *Y); } static WEBP_INLINE void ConvertRGBToUV_SSE41(const __m128i* const R, const __m128i* const G, const __m128i* const B, __m128i* const U, __m128i* const V) { const __m128i kRG_u = MK_CST_16(-9719, -19081); const __m128i kGB_u = MK_CST_16(0, 28800); const __m128i kRG_v = MK_CST_16(28800, 0); const __m128i kGB_v = MK_CST_16(-24116, -4684); const __m128i kHALF_UV = _mm_set1_epi32(((128 << YUV_FIX) + YUV_HALF) << 2); const __m128i RG_lo = _mm_unpacklo_epi16(*R, *G); const __m128i RG_hi = _mm_unpackhi_epi16(*R, *G); const __m128i GB_lo = _mm_unpacklo_epi16(*G, *B); const __m128i GB_hi = _mm_unpackhi_epi16(*G, *B); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_u, kGB_u, kHALF_UV, YUV_FIX + 2, *U); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_v, kGB_v, kHALF_UV, YUV_FIX + 2, *V); } #undef MK_CST_16 #undef TRANSFORM static void ConvertRGB24ToY_SSE41(const uint8_t* rgb, uint8_t* y, int width) { const int max_width = width & ~31; int i; for (i = 0; i < max_width; rgb += 3 * 16 * 2) { __m128i rgb_plane[6]; int j; RGB24PackedToPlanar_SSE41(rgb, rgb_plane); for (j = 0; j < 2; ++j, i += 16) { const __m128i zero = _mm_setzero_si128(); __m128i r, g, b, Y0, Y1; // Convert to 16-bit Y. r = _mm_unpacklo_epi8(rgb_plane[0 + j], zero); g = _mm_unpacklo_epi8(rgb_plane[2 + j], zero); b = _mm_unpacklo_epi8(rgb_plane[4 + j], zero); ConvertRGBToY_SSE41(&r, &g, &b, &Y0); // Convert to 16-bit Y. r = _mm_unpackhi_epi8(rgb_plane[0 + j], zero); g = _mm_unpackhi_epi8(rgb_plane[2 + j], zero); b = _mm_unpackhi_epi8(rgb_plane[4 + j], zero); ConvertRGBToY_SSE41(&r, &g, &b, &Y1); // Cast to 8-bit and store. STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } } for (; i < width; ++i, rgb += 3) { // left-over y[i] = VP8RGBToY(rgb[0], rgb[1], rgb[2], YUV_HALF); } } static void ConvertBGR24ToY_SSE41(const uint8_t* bgr, uint8_t* y, int width) { const int max_width = width & ~31; int i; for (i = 0; i < max_width; bgr += 3 * 16 * 2) { __m128i bgr_plane[6]; int j; RGB24PackedToPlanar_SSE41(bgr, bgr_plane); for (j = 0; j < 2; ++j, i += 16) { const __m128i zero = _mm_setzero_si128(); __m128i r, g, b, Y0, Y1; // Convert to 16-bit Y. b = _mm_unpacklo_epi8(bgr_plane[0 + j], zero); g = _mm_unpacklo_epi8(bgr_plane[2 + j], zero); r = _mm_unpacklo_epi8(bgr_plane[4 + j], zero); ConvertRGBToY_SSE41(&r, &g, &b, &Y0); // Convert to 16-bit Y. b = _mm_unpackhi_epi8(bgr_plane[0 + j], zero); g = _mm_unpackhi_epi8(bgr_plane[2 + j], zero); r = _mm_unpackhi_epi8(bgr_plane[4 + j], zero); ConvertRGBToY_SSE41(&r, &g, &b, &Y1); // Cast to 8-bit and store. STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } } for (; i < width; ++i, bgr += 3) { // left-over y[i] = VP8RGBToY(bgr[2], bgr[1], bgr[0], YUV_HALF); } } static void ConvertARGBToY_SSE41(const uint32_t* argb, uint8_t* y, int width) { const int max_width = width & ~15; int i; for (i = 0; i < max_width; i += 16) { __m128i Y0, Y1, rgb[6]; RGB32PackedToPlanar_SSE41(&argb[i], rgb); ConvertRGBToY_SSE41(&rgb[0], &rgb[2], &rgb[4], &Y0); ConvertRGBToY_SSE41(&rgb[1], &rgb[3], &rgb[5], &Y1); STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } for (; i < width; ++i) { // left-over const uint32_t p = argb[i]; y[i] = VP8RGBToY((p >> 16) & 0xff, (p >> 8) & 0xff, (p >> 0) & 0xff, YUV_HALF); } } // Horizontal add (doubled) of two 16b values, result is 16b. // in: A | B | C | D | ... -> out: 2*(A+B) | 2*(C+D) | ... static void HorizontalAddPack_SSE41(const __m128i* const A, const __m128i* const B, __m128i* const out) { const __m128i k2 = _mm_set1_epi16(2); const __m128i C = _mm_madd_epi16(*A, k2); const __m128i D = _mm_madd_epi16(*B, k2); *out = _mm_packs_epi32(C, D); } static void ConvertARGBToUV_SSE41(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store) { const int max_width = src_width & ~31; int i; for (i = 0; i < max_width; i += 32, u += 16, v += 16) { __m128i rgb[6], U0, V0, U1, V1; RGB32PackedToPlanar_SSE41(&argb[i], rgb); HorizontalAddPack_SSE41(&rgb[0], &rgb[1], &rgb[0]); HorizontalAddPack_SSE41(&rgb[2], &rgb[3], &rgb[2]); HorizontalAddPack_SSE41(&rgb[4], &rgb[5], &rgb[4]); ConvertRGBToUV_SSE41(&rgb[0], &rgb[2], &rgb[4], &U0, &V0); RGB32PackedToPlanar_SSE41(&argb[i + 16], rgb); HorizontalAddPack_SSE41(&rgb[0], &rgb[1], &rgb[0]); HorizontalAddPack_SSE41(&rgb[2], &rgb[3], &rgb[2]); HorizontalAddPack_SSE41(&rgb[4], &rgb[5], &rgb[4]); ConvertRGBToUV_SSE41(&rgb[0], &rgb[2], &rgb[4], &U1, &V1); U0 = _mm_packus_epi16(U0, U1); V0 = _mm_packus_epi16(V0, V1); if (!do_store) { const __m128i prev_u = LOAD_16(u); const __m128i prev_v = LOAD_16(v); U0 = _mm_avg_epu8(U0, prev_u); V0 = _mm_avg_epu8(V0, prev_v); } STORE_16(U0, u); STORE_16(V0, v); } if (i < src_width) { // left-over WebPConvertARGBToUV_C(argb + i, u, v, src_width - i, do_store); } } // Convert 16 packed ARGB 16b-values to r[], g[], b[] static WEBP_INLINE void RGBA32PackedToPlanar_16b_SSE41( const uint16_t* const rgbx, __m128i* const r, __m128i* const g, __m128i* const b) { const __m128i in0 = LOAD_16(rgbx + 0); // r0 | g0 | b0 |x| r1 | g1 | b1 |x const __m128i in1 = LOAD_16(rgbx + 8); // r2 | g2 | b2 |x| r3 | g3 | b3 |x const __m128i in2 = LOAD_16(rgbx + 16); // r4 | ... const __m128i in3 = LOAD_16(rgbx + 24); // r6 | ... // aarrggbb as 16-bit. const __m128i shuff0 = _mm_set_epi8(-1, -1, -1, -1, 13, 12, 5, 4, 11, 10, 3, 2, 9, 8, 1, 0); const __m128i shuff1 = _mm_set_epi8(13, 12, 5, 4, -1, -1, -1, -1, 11, 10, 3, 2, 9, 8, 1, 0); const __m128i A0 = _mm_shuffle_epi8(in0, shuff0); const __m128i A1 = _mm_shuffle_epi8(in1, shuff1); const __m128i A2 = _mm_shuffle_epi8(in2, shuff0); const __m128i A3 = _mm_shuffle_epi8(in3, shuff1); // R0R1G0G1 // B0B1**** // R2R3G2G3 // B2B3**** // (OR is used to free port 5 for the unpack) const __m128i B0 = _mm_unpacklo_epi32(A0, A1); const __m128i B1 = _mm_or_si128(A0, A1); const __m128i B2 = _mm_unpacklo_epi32(A2, A3); const __m128i B3 = _mm_or_si128(A2, A3); // Gather the channels. *r = _mm_unpacklo_epi64(B0, B2); *g = _mm_unpackhi_epi64(B0, B2); *b = _mm_unpackhi_epi64(B1, B3); } static void ConvertRGBA32ToUV_SSE41(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width) { const int max_width = width & ~15; const uint16_t* const last_rgb = rgb + 4 * max_width; while (rgb < last_rgb) { __m128i r, g, b, U0, V0, U1, V1; RGBA32PackedToPlanar_16b_SSE41(rgb + 0, &r, &g, &b); ConvertRGBToUV_SSE41(&r, &g, &b, &U0, &V0); RGBA32PackedToPlanar_16b_SSE41(rgb + 32, &r, &g, &b); ConvertRGBToUV_SSE41(&r, &g, &b, &U1, &V1); STORE_16(_mm_packus_epi16(U0, U1), u); STORE_16(_mm_packus_epi16(V0, V1), v); u += 16; v += 16; rgb += 2 * 32; } if (max_width < width) { // left-over WebPConvertRGBA32ToUV_C(rgb, u, v, width - max_width); } } //------------------------------------------------------------------------------ extern void WebPInitConvertARGBToYUVSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitConvertARGBToYUVSSE41(void) { WebPConvertARGBToY = ConvertARGBToY_SSE41; WebPConvertARGBToUV = ConvertARGBToUV_SSE41; WebPConvertRGB24ToY = ConvertRGB24ToY_SSE41; WebPConvertBGR24ToY = ConvertBGR24ToY_SSE41; WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_SSE41; } //------------------------------------------------------------------------------ #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(WebPInitSamplersSSE41) WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/cost.c0000644000014400001440000004356014606317060012554 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #include "src/enc/cost_enc.h" //------------------------------------------------------------------------------ // Boolean-cost cost table const uint16_t VP8EntropyCost[256] = { 1792, 1792, 1792, 1536, 1536, 1408, 1366, 1280, 1280, 1216, 1178, 1152, 1110, 1076, 1061, 1024, 1024, 992, 968, 951, 939, 911, 896, 878, 871, 854, 838, 820, 811, 794, 786, 768, 768, 752, 740, 732, 720, 709, 704, 690, 683, 672, 666, 655, 647, 640, 631, 622, 615, 607, 598, 592, 586, 576, 572, 564, 559, 555, 547, 541, 534, 528, 522, 512, 512, 504, 500, 494, 488, 483, 477, 473, 467, 461, 458, 452, 448, 443, 438, 434, 427, 424, 419, 415, 410, 406, 403, 399, 394, 390, 384, 384, 377, 374, 370, 366, 362, 359, 355, 351, 347, 342, 342, 336, 333, 330, 326, 323, 320, 316, 312, 308, 305, 302, 299, 296, 293, 288, 287, 283, 280, 277, 274, 272, 268, 266, 262, 256, 256, 256, 251, 248, 245, 242, 240, 237, 234, 232, 228, 226, 223, 221, 218, 216, 214, 211, 208, 205, 203, 201, 198, 196, 192, 191, 188, 187, 183, 181, 179, 176, 175, 171, 171, 168, 165, 163, 160, 159, 156, 154, 152, 150, 148, 146, 144, 142, 139, 138, 135, 133, 131, 128, 128, 125, 123, 121, 119, 117, 115, 113, 111, 110, 107, 105, 103, 102, 100, 98, 96, 94, 92, 91, 89, 86, 86, 83, 82, 80, 77, 76, 74, 73, 71, 69, 67, 66, 64, 63, 61, 59, 57, 55, 54, 52, 51, 49, 47, 46, 44, 43, 41, 40, 38, 36, 35, 33, 32, 30, 29, 27, 25, 24, 22, 21, 19, 18, 16, 15, 13, 12, 10, 9, 7, 6, 4, 3 }; //------------------------------------------------------------------------------ // Level cost tables // fixed costs for coding levels, deduce from the coding tree. // This is only the part that doesn't depend on the probability state. const uint16_t VP8LevelFixedCosts[MAX_LEVEL + 1] = { 0, 256, 256, 256, 256, 432, 618, 630, 731, 640, 640, 828, 901, 948, 1021, 1101, 1174, 1221, 1294, 1042, 1085, 1115, 1158, 1202, 1245, 1275, 1318, 1337, 1380, 1410, 1453, 1497, 1540, 1570, 1613, 1280, 1295, 1317, 1332, 1358, 1373, 1395, 1410, 1454, 1469, 1491, 1506, 1532, 1547, 1569, 1584, 1601, 1616, 1638, 1653, 1679, 1694, 1716, 1731, 1775, 1790, 1812, 1827, 1853, 1868, 1890, 1905, 1727, 1733, 1742, 1748, 1759, 1765, 1774, 1780, 1800, 1806, 1815, 1821, 1832, 1838, 1847, 1853, 1878, 1884, 1893, 1899, 1910, 1916, 1925, 1931, 1951, 1957, 1966, 1972, 1983, 1989, 1998, 2004, 2027, 2033, 2042, 2048, 2059, 2065, 2074, 2080, 2100, 2106, 2115, 2121, 2132, 2138, 2147, 2153, 2178, 2184, 2193, 2199, 2210, 2216, 2225, 2231, 2251, 2257, 2266, 2272, 2283, 2289, 2298, 2304, 2168, 2174, 2183, 2189, 2200, 2206, 2215, 2221, 2241, 2247, 2256, 2262, 2273, 2279, 2288, 2294, 2319, 2325, 2334, 2340, 2351, 2357, 2366, 2372, 2392, 2398, 2407, 2413, 2424, 2430, 2439, 2445, 2468, 2474, 2483, 2489, 2500, 2506, 2515, 2521, 2541, 2547, 2556, 2562, 2573, 2579, 2588, 2594, 2619, 2625, 2634, 2640, 2651, 2657, 2666, 2672, 2692, 2698, 2707, 2713, 2724, 2730, 2739, 2745, 2540, 2546, 2555, 2561, 2572, 2578, 2587, 2593, 2613, 2619, 2628, 2634, 2645, 2651, 2660, 2666, 2691, 2697, 2706, 2712, 2723, 2729, 2738, 2744, 2764, 2770, 2779, 2785, 2796, 2802, 2811, 2817, 2840, 2846, 2855, 2861, 2872, 2878, 2887, 2893, 2913, 2919, 2928, 2934, 2945, 2951, 2960, 2966, 2991, 2997, 3006, 3012, 3023, 3029, 3038, 3044, 3064, 3070, 3079, 3085, 3096, 3102, 3111, 3117, 2981, 2987, 2996, 3002, 3013, 3019, 3028, 3034, 3054, 3060, 3069, 3075, 3086, 3092, 3101, 3107, 3132, 3138, 3147, 3153, 3164, 3170, 3179, 3185, 3205, 3211, 3220, 3226, 3237, 3243, 3252, 3258, 3281, 3287, 3296, 3302, 3313, 3319, 3328, 3334, 3354, 3360, 3369, 3375, 3386, 3392, 3401, 3407, 3432, 3438, 3447, 3453, 3464, 3470, 3479, 3485, 3505, 3511, 3520, 3526, 3537, 3543, 3552, 3558, 2816, 2822, 2831, 2837, 2848, 2854, 2863, 2869, 2889, 2895, 2904, 2910, 2921, 2927, 2936, 2942, 2967, 2973, 2982, 2988, 2999, 3005, 3014, 3020, 3040, 3046, 3055, 3061, 3072, 3078, 3087, 3093, 3116, 3122, 3131, 3137, 3148, 3154, 3163, 3169, 3189, 3195, 3204, 3210, 3221, 3227, 3236, 3242, 3267, 3273, 3282, 3288, 3299, 3305, 3314, 3320, 3340, 3346, 3355, 3361, 3372, 3378, 3387, 3393, 3257, 3263, 3272, 3278, 3289, 3295, 3304, 3310, 3330, 3336, 3345, 3351, 3362, 3368, 3377, 3383, 3408, 3414, 3423, 3429, 3440, 3446, 3455, 3461, 3481, 3487, 3496, 3502, 3513, 3519, 3528, 3534, 3557, 3563, 3572, 3578, 3589, 3595, 3604, 3610, 3630, 3636, 3645, 3651, 3662, 3668, 3677, 3683, 3708, 3714, 3723, 3729, 3740, 3746, 3755, 3761, 3781, 3787, 3796, 3802, 3813, 3819, 3828, 3834, 3629, 3635, 3644, 3650, 3661, 3667, 3676, 3682, 3702, 3708, 3717, 3723, 3734, 3740, 3749, 3755, 3780, 3786, 3795, 3801, 3812, 3818, 3827, 3833, 3853, 3859, 3868, 3874, 3885, 3891, 3900, 3906, 3929, 3935, 3944, 3950, 3961, 3967, 3976, 3982, 4002, 4008, 4017, 4023, 4034, 4040, 4049, 4055, 4080, 4086, 4095, 4101, 4112, 4118, 4127, 4133, 4153, 4159, 4168, 4174, 4185, 4191, 4200, 4206, 4070, 4076, 4085, 4091, 4102, 4108, 4117, 4123, 4143, 4149, 4158, 4164, 4175, 4181, 4190, 4196, 4221, 4227, 4236, 4242, 4253, 4259, 4268, 4274, 4294, 4300, 4309, 4315, 4326, 4332, 4341, 4347, 4370, 4376, 4385, 4391, 4402, 4408, 4417, 4423, 4443, 4449, 4458, 4464, 4475, 4481, 4490, 4496, 4521, 4527, 4536, 4542, 4553, 4559, 4568, 4574, 4594, 4600, 4609, 4615, 4626, 4632, 4641, 4647, 3515, 3521, 3530, 3536, 3547, 3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620, 3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698, 3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771, 3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847, 3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920, 3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998, 4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071, 4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988, 3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061, 4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139, 4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212, 4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288, 4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361, 4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439, 4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512, 4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360, 4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433, 4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511, 4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584, 4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660, 4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733, 4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811, 4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884, 4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801, 4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874, 4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952, 4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025, 5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101, 5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174, 5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252, 5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325, 5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636, 4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709, 4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787, 4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860, 4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936, 4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009, 5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087, 5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160, 5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077, 5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150, 5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228, 5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301, 5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377, 5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450, 5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528, 5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601, 5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449, 5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522, 5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600, 5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673, 5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749, 5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822, 5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900, 5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973, 5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890, 5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963, 5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041, 6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114, 6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190, 6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263, 6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341, 6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414, 6420, 6429, 6435, 3515, 3521, 3530, 3536, 3547, 3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620, 3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698, 3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771, 3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847, 3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920, 3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998, 4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071, 4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988, 3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061, 4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139, 4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212, 4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288, 4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361, 4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439, 4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512, 4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360, 4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433, 4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511, 4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584, 4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660, 4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733, 4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811, 4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884, 4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801, 4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874, 4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952, 4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025, 5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101, 5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174, 5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252, 5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325, 5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636, 4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709, 4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787, 4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860, 4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936, 4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009, 5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087, 5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160, 5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077, 5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150, 5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228, 5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301, 5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377, 5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450, 5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528, 5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601, 5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449, 5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522, 5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600, 5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673, 5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749, 5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822, 5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900, 5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973, 5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890, 5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963, 5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041, 6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114, 6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190, 6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263, 6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341, 6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414, 6420, 6429, 6435, 5303, 5309, 5318, 5324, 5335, 5341, 5350, 5356, 5376, 5382, 5391, 5397, 5408, 5414, 5423, 5429, 5454, 5460, 5469, 5475, 5486, 5492, 5501, 5507, 5527, 5533, 5542, 5548, 5559, 5565, 5574, 5580, 5603, 5609, 5618, 5624, 5635, 5641, 5650, 5656, 5676, 5682, 5691, 5697, 5708, 5714, 5723, 5729, 5754, 5760, 5769, 5775, 5786, 5792, 5801, 5807, 5827, 5833, 5842, 5848, 5859, 5865, 5874, 5880, 5744, 5750, 5759, 5765, 5776, 5782, 5791, 5797, 5817, 5823, 5832, 5838, 5849, 5855, 5864, 5870, 5895, 5901, 5910, 5916, 5927, 5933, 5942, 5948, 5968, 5974, 5983, 5989, 6000, 6006, 6015, 6021, 6044, 6050, 6059, 6065, 6076, 6082, 6091, 6097, 6117, 6123, 6132, 6138, 6149, 6155, 6164, 6170, 6195, 6201, 6210, 6216, 6227, 6233, 6242, 6248, 6268, 6274, 6283, 6289, 6300, 6306, 6315, 6321, 6116, 6122, 6131, 6137, 6148, 6154, 6163, 6169, 6189, 6195, 6204, 6210, 6221, 6227, 6236, 6242, 6267, 6273, 6282, 6288, 6299, 6305, 6314, 6320, 6340, 6346, 6355, 6361, 6372, 6378, 6387, 6393, 6416, 6422, 6431, 6437, 6448, 6454, 6463, 6469, 6489, 6495, 6504, 6510, 6521, 6527, 6536, 6542, 6567, 6573, 6582, 6588, 6599, 6605, 6614, 6620, 6640, 6646, 6655, 6661, 6672, 6678, 6687, 6693, 6557, 6563, 6572, 6578, 6589, 6595, 6604, 6610, 6630, 6636, 6645, 6651, 6662, 6668, 6677, 6683, 6708, 6714, 6723, 6729, 6740, 6746, 6755, 6761, 6781, 6787, 6796, 6802, 6813, 6819, 6828, 6834, 6857, 6863, 6872, 6878, 6889, 6895, 6904, 6910, 6930, 6936, 6945, 6951, 6962, 6968, 6977, 6983, 7008, 7014, 7023, 7029, 7040, 7046, 7055, 7061, 7081, 7087, 7096, 7102, 7113, 7119, 7128, 7134, 6392, 6398, 6407, 6413, 6424, 6430, 6439, 6445, 6465, 6471, 6480, 6486, 6497, 6503, 6512, 6518, 6543, 6549, 6558, 6564, 6575, 6581, 6590, 6596, 6616, 6622, 6631, 6637, 6648, 6654, 6663, 6669, 6692, 6698, 6707, 6713, 6724, 6730, 6739, 6745, 6765, 6771, 6780, 6786, 6797, 6803, 6812, 6818, 6843, 6849, 6858, 6864, 6875, 6881, 6890, 6896, 6916, 6922, 6931, 6937, 6948, 6954, 6963, 6969, 6833, 6839, 6848, 6854, 6865, 6871, 6880, 6886, 6906, 6912, 6921, 6927, 6938, 6944, 6953, 6959, 6984, 6990, 6999, 7005, 7016, 7022, 7031, 7037, 7057, 7063, 7072, 7078, 7089, 7095, 7104, 7110, 7133, 7139, 7148, 7154, 7165, 7171, 7180, 7186, 7206, 7212, 7221, 7227, 7238, 7244, 7253, 7259, 7284, 7290, 7299, 7305, 7316, 7322, 7331, 7337, 7357, 7363, 7372, 7378, 7389, 7395, 7404, 7410, 7205, 7211, 7220, 7226, 7237, 7243, 7252, 7258, 7278, 7284, 7293, 7299, 7310, 7316, 7325, 7331, 7356, 7362, 7371, 7377, 7388, 7394, 7403, 7409, 7429, 7435, 7444, 7450, 7461, 7467, 7476, 7482, 7505, 7511, 7520, 7526, 7537, 7543, 7552, 7558, 7578, 7584, 7593, 7599, 7610, 7616, 7625, 7631, 7656, 7662, 7671, 7677, 7688, 7694, 7703, 7709, 7729, 7735, 7744, 7750, 7761 }; //------------------------------------------------------------------------------ // Tables for level coding const uint8_t VP8EncBands[16 + 1] = { 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0 // sentinel }; //------------------------------------------------------------------------------ // Mode costs static int GetResidualCost_C(int ctx0, const VP8Residual* const res) { int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 const int p0 = res->prob[n][ctx0][0]; CostArrayPtr const costs = res->costs; const uint16_t* t = costs[n][ctx0]; // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0 // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll // be missing during the loop. int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; if (res->last < 0) { return VP8BitCost(0, p0); } for (; n < res->last; ++n) { const int v = abs(res->coeffs[n]); const int ctx = (v >= 2) ? 2 : v; cost += VP8LevelCost(t, v); t = costs[n + 1][ctx]; } // Last coefficient is always non-zero { const int v = abs(res->coeffs[n]); assert(v != 0); cost += VP8LevelCost(t, v); if (n < 15) { const int b = VP8EncBands[n + 1]; const int ctx = (v == 1) ? 1 : 2; const int last_p0 = res->prob[b][ctx][0]; cost += VP8BitCost(0, last_p0); } } return cost; } static void SetResidualCoeffs_C(const int16_t* const coeffs, VP8Residual* const res) { int n; res->last = -1; assert(res->first == 0 || coeffs[0] == 0); for (n = 15; n >= 0; --n) { if (coeffs[n]) { res->last = n; break; } } res->coeffs = coeffs; } //------------------------------------------------------------------------------ // init function VP8GetResidualCostFunc VP8GetResidualCost; VP8SetResidualCoeffsFunc VP8SetResidualCoeffs; extern VP8CPUInfo VP8GetCPUInfo; extern void VP8EncDspCostInitMIPS32(void); extern void VP8EncDspCostInitMIPSdspR2(void); extern void VP8EncDspCostInitSSE2(void); extern void VP8EncDspCostInitNEON(void); WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) { VP8GetResidualCost = GetResidualCost_C; VP8SetResidualCoeffs = SetResidualCoeffs_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { VP8EncDspCostInitMIPS32(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8EncDspCostInitMIPSdspR2(); } #endif #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8EncDspCostInitSSE2(); } #endif #if defined(WEBP_HAVE_NEON) if (VP8GetCPUInfo(kNEON)) { VP8EncDspCostInitNEON(); } #endif } } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dsp/yuv_sse2.c0000644000014400001440000007005214606317060013357 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // YUV->RGB conversion functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/yuv.h" #if defined(WEBP_USE_SSE2) #include #include #include "src/dsp/common_sse2.h" #include "src/utils/utils.h" //----------------------------------------------------------------------------- // Convert spans of 32 pixels to various RGB formats for the fancy upsampler. // These constants are 14b fixed-point version of ITU-R BT.601 constants. // R = (19077 * y + 26149 * v - 14234) >> 6 // G = (19077 * y - 6419 * u - 13320 * v + 8708) >> 6 // B = (19077 * y + 33050 * u - 17685) >> 6 static void ConvertYUV444ToRGB_SSE2(const __m128i* const Y0, const __m128i* const U0, const __m128i* const V0, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i k19077 = _mm_set1_epi16(19077); const __m128i k26149 = _mm_set1_epi16(26149); const __m128i k14234 = _mm_set1_epi16(14234); // 33050 doesn't fit in a signed short: only use this with unsigned arithmetic const __m128i k33050 = _mm_set1_epi16((short)33050); const __m128i k17685 = _mm_set1_epi16(17685); const __m128i k6419 = _mm_set1_epi16(6419); const __m128i k13320 = _mm_set1_epi16(13320); const __m128i k8708 = _mm_set1_epi16(8708); const __m128i Y1 = _mm_mulhi_epu16(*Y0, k19077); const __m128i R0 = _mm_mulhi_epu16(*V0, k26149); const __m128i R1 = _mm_sub_epi16(Y1, k14234); const __m128i R2 = _mm_add_epi16(R1, R0); const __m128i G0 = _mm_mulhi_epu16(*U0, k6419); const __m128i G1 = _mm_mulhi_epu16(*V0, k13320); const __m128i G2 = _mm_add_epi16(Y1, k8708); const __m128i G3 = _mm_add_epi16(G0, G1); const __m128i G4 = _mm_sub_epi16(G2, G3); // be careful with the saturated *unsigned* arithmetic here! const __m128i B0 = _mm_mulhi_epu16(*U0, k33050); const __m128i B1 = _mm_adds_epu16(B0, Y1); const __m128i B2 = _mm_subs_epu16(B1, k17685); // use logical shift for B2, which can be larger than 32767 *R = _mm_srai_epi16(R2, 6); // range: [-14234, 30815] *G = _mm_srai_epi16(G4, 6); // range: [-10953, 27710] *B = _mm_srli_epi16(B2, 6); // range: [0, 34238] } // Load the bytes into the *upper* part of 16b words. That's "<< 8", basically. static WEBP_INLINE __m128i Load_HI_16_SSE2(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); return _mm_unpacklo_epi8(zero, _mm_loadl_epi64((const __m128i*)src)); } // Load and replicate the U/V samples static WEBP_INLINE __m128i Load_UV_HI_8_SSE2(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src)); const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0); return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples } // Convert 32 samples of YUV444 to R/G/B static void YUV444ToRGB_SSE2(const uint8_t* const y, const uint8_t* const u, const uint8_t* const v, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i Y0 = Load_HI_16_SSE2(y), U0 = Load_HI_16_SSE2(u), V0 = Load_HI_16_SSE2(v); ConvertYUV444ToRGB_SSE2(&Y0, &U0, &V0, R, G, B); } // Convert 32 samples of YUV420 to R/G/B static void YUV420ToRGB_SSE2(const uint8_t* const y, const uint8_t* const u, const uint8_t* const v, __m128i* const R, __m128i* const G, __m128i* const B) { const __m128i Y0 = Load_HI_16_SSE2(y), U0 = Load_UV_HI_8_SSE2(u), V0 = Load_UV_HI_8_SSE2(v); ConvertYUV444ToRGB_SSE2(&Y0, &U0, &V0, R, G, B); } // Pack R/G/B/A results into 32b output. static WEBP_INLINE void PackAndStore4_SSE2(const __m128i* const R, const __m128i* const G, const __m128i* const B, const __m128i* const A, uint8_t* const dst) { const __m128i rb = _mm_packus_epi16(*R, *B); const __m128i ga = _mm_packus_epi16(*G, *A); const __m128i rg = _mm_unpacklo_epi8(rb, ga); const __m128i ba = _mm_unpackhi_epi8(rb, ga); const __m128i RGBA_lo = _mm_unpacklo_epi16(rg, ba); const __m128i RGBA_hi = _mm_unpackhi_epi16(rg, ba); _mm_storeu_si128((__m128i*)(dst + 0), RGBA_lo); _mm_storeu_si128((__m128i*)(dst + 16), RGBA_hi); } // Pack R/G/B/A results into 16b output. static WEBP_INLINE void PackAndStore4444_SSE2(const __m128i* const R, const __m128i* const G, const __m128i* const B, const __m128i* const A, uint8_t* const dst) { #if (WEBP_SWAP_16BIT_CSP == 0) const __m128i rg0 = _mm_packus_epi16(*R, *G); const __m128i ba0 = _mm_packus_epi16(*B, *A); #else const __m128i rg0 = _mm_packus_epi16(*B, *A); const __m128i ba0 = _mm_packus_epi16(*R, *G); #endif const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0); const __m128i rb1 = _mm_unpacklo_epi8(rg0, ba0); // rbrbrbrbrb... const __m128i ga1 = _mm_unpackhi_epi8(rg0, ba0); // gagagagaga... const __m128i rb2 = _mm_and_si128(rb1, mask_0xf0); const __m128i ga2 = _mm_srli_epi16(_mm_and_si128(ga1, mask_0xf0), 4); const __m128i rgba4444 = _mm_or_si128(rb2, ga2); _mm_storeu_si128((__m128i*)dst, rgba4444); } // Pack R/G/B results into 16b output. static WEBP_INLINE void PackAndStore565_SSE2(const __m128i* const R, const __m128i* const G, const __m128i* const B, uint8_t* const dst) { const __m128i r0 = _mm_packus_epi16(*R, *R); const __m128i g0 = _mm_packus_epi16(*G, *G); const __m128i b0 = _mm_packus_epi16(*B, *B); const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8((char)0xf8)); const __m128i b1 = _mm_and_si128(_mm_srli_epi16(b0, 3), _mm_set1_epi8(0x1f)); const __m128i g1 = _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8((char)0xe0)), 5); const __m128i g2 = _mm_slli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0x1c)), 3); const __m128i rg = _mm_or_si128(r1, g1); const __m128i gb = _mm_or_si128(g2, b1); #if (WEBP_SWAP_16BIT_CSP == 0) const __m128i rgb565 = _mm_unpacklo_epi8(rg, gb); #else const __m128i rgb565 = _mm_unpacklo_epi8(gb, rg); #endif _mm_storeu_si128((__m128i*)dst, rgb565); } // Pack the planar buffers // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // triplet by triplet in the output buffer rgb as rgbrgbrgbrgb ... static WEBP_INLINE void PlanarTo24b_SSE2(__m128i* const in0, __m128i* const in1, __m128i* const in2, __m128i* const in3, __m128i* const in4, __m128i* const in5, uint8_t* const rgb) { // The input is 6 registers of sixteen 8b but for the sake of explanation, // let's take 6 registers of four 8b values. // To pack, we will keep taking one every two 8b integer and move it // around as follows: // Input: // r0r1r2r3 | r4r5r6r7 | g0g1g2g3 | g4g5g6g7 | b0b1b2b3 | b4b5b6b7 // Split the 6 registers in two sets of 3 registers: the first set as the even // 8b bytes, the second the odd ones: // r0r2r4r6 | g0g2g4g6 | b0b2b4b6 | r1r3r5r7 | g1g3g5g7 | b1b3b5b7 // Repeat the same permutations twice more: // r0r4g0g4 | b0b4r1r5 | g1g5b1b5 | r2r6g2g6 | b2b6r3r7 | g3g7b3b7 // r0g0b0r1 | g1b1r2g2 | b2r3g3b3 | r4g4b4r5 | g5b5r6g6 | b6r7g7b7 VP8PlanarTo24b_SSE2(in0, in1, in2, in3, in4, in5); _mm_storeu_si128((__m128i*)(rgb + 0), *in0); _mm_storeu_si128((__m128i*)(rgb + 16), *in1); _mm_storeu_si128((__m128i*)(rgb + 32), *in2); _mm_storeu_si128((__m128i*)(rgb + 48), *in3); _mm_storeu_si128((__m128i*)(rgb + 64), *in4); _mm_storeu_si128((__m128i*)(rgb + 80), *in5); } void VP8YuvToRgba32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n < 32; n += 8, dst += 32) { __m128i R, G, B; YUV444ToRGB_SSE2(y + n, u + n, v + n, &R, &G, &B); PackAndStore4_SSE2(&R, &G, &B, &kAlpha, dst); } } void VP8YuvToBgra32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n < 32; n += 8, dst += 32) { __m128i R, G, B; YUV444ToRGB_SSE2(y + n, u + n, v + n, &R, &G, &B); PackAndStore4_SSE2(&B, &G, &R, &kAlpha, dst); } } void VP8YuvToArgb32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n < 32; n += 8, dst += 32) { __m128i R, G, B; YUV444ToRGB_SSE2(y + n, u + n, v + n, &R, &G, &B); PackAndStore4_SSE2(&kAlpha, &R, &G, &B, dst); } } void VP8YuvToRgba444432_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n < 32; n += 8, dst += 16) { __m128i R, G, B; YUV444ToRGB_SSE2(y + n, u + n, v + n, &R, &G, &B); PackAndStore4444_SSE2(&R, &G, &B, &kAlpha, dst); } } void VP8YuvToRgb56532_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { int n; for (n = 0; n < 32; n += 8, dst += 16) { __m128i R, G, B; YUV444ToRGB_SSE2(y + n, u + n, v + n, &R, &G, &B); PackAndStore565_SSE2(&R, &G, &B, dst); } } void VP8YuvToRgb32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i rgb0, rgb1, rgb2, rgb3, rgb4, rgb5; YUV444ToRGB_SSE2(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV444ToRGB_SSE2(y + 8, u + 8, v + 8, &R1, &G1, &B1); YUV444ToRGB_SSE2(y + 16, u + 16, v + 16, &R2, &G2, &B2); YUV444ToRGB_SSE2(y + 24, u + 24, v + 24, &R3, &G3, &B3); // Cast to 8b and store as RRRRGGGGBBBB. rgb0 = _mm_packus_epi16(R0, R1); rgb1 = _mm_packus_epi16(R2, R3); rgb2 = _mm_packus_epi16(G0, G1); rgb3 = _mm_packus_epi16(G2, G3); rgb4 = _mm_packus_epi16(B0, B1); rgb5 = _mm_packus_epi16(B2, B3); // Pack as RGBRGBRGBRGB. PlanarTo24b_SSE2(&rgb0, &rgb1, &rgb2, &rgb3, &rgb4, &rgb5, dst); } void VP8YuvToBgr32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i bgr0, bgr1, bgr2, bgr3, bgr4, bgr5; YUV444ToRGB_SSE2(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV444ToRGB_SSE2(y + 8, u + 8, v + 8, &R1, &G1, &B1); YUV444ToRGB_SSE2(y + 16, u + 16, v + 16, &R2, &G2, &B2); YUV444ToRGB_SSE2(y + 24, u + 24, v + 24, &R3, &G3, &B3); // Cast to 8b and store as BBBBGGGGRRRR. bgr0 = _mm_packus_epi16(B0, B1); bgr1 = _mm_packus_epi16(B2, B3); bgr2 = _mm_packus_epi16(G0, G1); bgr3 = _mm_packus_epi16(G2, G3); bgr4 = _mm_packus_epi16(R0, R1); bgr5= _mm_packus_epi16(R2, R3); // Pack as BGRBGRBGRBGR. PlanarTo24b_SSE2(&bgr0, &bgr1, &bgr2, &bgr3, &bgr4, &bgr5, dst); } //----------------------------------------------------------------------------- // Arbitrary-length row conversion functions static void YuvToRgbaRow_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n + 8 <= len; n += 8, dst += 32) { __m128i R, G, B; YUV420ToRGB_SSE2(y, u, v, &R, &G, &B); PackAndStore4_SSE2(&R, &G, &B, &kAlpha, dst); y += 8; u += 4; v += 4; } for (; n < len; ++n) { // Finish off VP8YuvToRgba(y[0], u[0], v[0], dst); dst += 4; y += 1; u += (n & 1); v += (n & 1); } } static void YuvToBgraRow_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n + 8 <= len; n += 8, dst += 32) { __m128i R, G, B; YUV420ToRGB_SSE2(y, u, v, &R, &G, &B); PackAndStore4_SSE2(&B, &G, &R, &kAlpha, dst); y += 8; u += 4; v += 4; } for (; n < len; ++n) { // Finish off VP8YuvToBgra(y[0], u[0], v[0], dst); dst += 4; y += 1; u += (n & 1); v += (n & 1); } } static void YuvToArgbRow_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { const __m128i kAlpha = _mm_set1_epi16(255); int n; for (n = 0; n + 8 <= len; n += 8, dst += 32) { __m128i R, G, B; YUV420ToRGB_SSE2(y, u, v, &R, &G, &B); PackAndStore4_SSE2(&kAlpha, &R, &G, &B, dst); y += 8; u += 4; v += 4; } for (; n < len; ++n) { // Finish off VP8YuvToArgb(y[0], u[0], v[0], dst); dst += 4; y += 1; u += (n & 1); v += (n & 1); } } static void YuvToRgbRow_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { int n; for (n = 0; n + 32 <= len; n += 32, dst += 32 * 3) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i rgb0, rgb1, rgb2, rgb3, rgb4, rgb5; YUV420ToRGB_SSE2(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV420ToRGB_SSE2(y + 8, u + 4, v + 4, &R1, &G1, &B1); YUV420ToRGB_SSE2(y + 16, u + 8, v + 8, &R2, &G2, &B2); YUV420ToRGB_SSE2(y + 24, u + 12, v + 12, &R3, &G3, &B3); // Cast to 8b and store as RRRRGGGGBBBB. rgb0 = _mm_packus_epi16(R0, R1); rgb1 = _mm_packus_epi16(R2, R3); rgb2 = _mm_packus_epi16(G0, G1); rgb3 = _mm_packus_epi16(G2, G3); rgb4 = _mm_packus_epi16(B0, B1); rgb5 = _mm_packus_epi16(B2, B3); // Pack as RGBRGBRGBRGB. PlanarTo24b_SSE2(&rgb0, &rgb1, &rgb2, &rgb3, &rgb4, &rgb5, dst); y += 32; u += 16; v += 16; } for (; n < len; ++n) { // Finish off VP8YuvToRgb(y[0], u[0], v[0], dst); dst += 3; y += 1; u += (n & 1); v += (n & 1); } } static void YuvToBgrRow_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst, int len) { int n; for (n = 0; n + 32 <= len; n += 32, dst += 32 * 3) { __m128i R0, R1, R2, R3, G0, G1, G2, G3, B0, B1, B2, B3; __m128i bgr0, bgr1, bgr2, bgr3, bgr4, bgr5; YUV420ToRGB_SSE2(y + 0, u + 0, v + 0, &R0, &G0, &B0); YUV420ToRGB_SSE2(y + 8, u + 4, v + 4, &R1, &G1, &B1); YUV420ToRGB_SSE2(y + 16, u + 8, v + 8, &R2, &G2, &B2); YUV420ToRGB_SSE2(y + 24, u + 12, v + 12, &R3, &G3, &B3); // Cast to 8b and store as BBBBGGGGRRRR. bgr0 = _mm_packus_epi16(B0, B1); bgr1 = _mm_packus_epi16(B2, B3); bgr2 = _mm_packus_epi16(G0, G1); bgr3 = _mm_packus_epi16(G2, G3); bgr4 = _mm_packus_epi16(R0, R1); bgr5 = _mm_packus_epi16(R2, R3); // Pack as BGRBGRBGRBGR. PlanarTo24b_SSE2(&bgr0, &bgr1, &bgr2, &bgr3, &bgr4, &bgr5, dst); y += 32; u += 16; v += 16; } for (; n < len; ++n) { // Finish off VP8YuvToBgr(y[0], u[0], v[0], dst); dst += 3; y += 1; u += (n & 1); v += (n & 1); } } //------------------------------------------------------------------------------ // Entry point extern void WebPInitSamplersSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersSSE2(void) { WebPSamplers[MODE_RGB] = YuvToRgbRow_SSE2; WebPSamplers[MODE_RGBA] = YuvToRgbaRow_SSE2; WebPSamplers[MODE_BGR] = YuvToBgrRow_SSE2; WebPSamplers[MODE_BGRA] = YuvToBgraRow_SSE2; WebPSamplers[MODE_ARGB] = YuvToArgbRow_SSE2; } //------------------------------------------------------------------------------ // RGB24/32 -> YUV converters // Load eight 16b-words from *src. #define LOAD_16(src) _mm_loadu_si128((const __m128i*)(src)) // Store either 16b-words into *dst #define STORE_16(V, dst) _mm_storeu_si128((__m128i*)(dst), (V)) // Function that inserts a value of the second half of the in buffer in between // every two char of the first half. static WEBP_INLINE void RGB24PackedToPlanarHelper_SSE2( const __m128i* const in /*in[6]*/, __m128i* const out /*out[6]*/) { out[0] = _mm_unpacklo_epi8(in[0], in[3]); out[1] = _mm_unpackhi_epi8(in[0], in[3]); out[2] = _mm_unpacklo_epi8(in[1], in[4]); out[3] = _mm_unpackhi_epi8(in[1], in[4]); out[4] = _mm_unpacklo_epi8(in[2], in[5]); out[5] = _mm_unpackhi_epi8(in[2], in[5]); } // Unpack the 8b input rgbrgbrgbrgb ... as contiguous registers: // rrrr... rrrr... gggg... gggg... bbbb... bbbb.... // Similar to PlanarTo24bHelper(), but in reverse order. static WEBP_INLINE void RGB24PackedToPlanar_SSE2( const uint8_t* const rgb, __m128i* const out /*out[6]*/) { __m128i tmp[6]; tmp[0] = _mm_loadu_si128((const __m128i*)(rgb + 0)); tmp[1] = _mm_loadu_si128((const __m128i*)(rgb + 16)); tmp[2] = _mm_loadu_si128((const __m128i*)(rgb + 32)); tmp[3] = _mm_loadu_si128((const __m128i*)(rgb + 48)); tmp[4] = _mm_loadu_si128((const __m128i*)(rgb + 64)); tmp[5] = _mm_loadu_si128((const __m128i*)(rgb + 80)); RGB24PackedToPlanarHelper_SSE2(tmp, out); RGB24PackedToPlanarHelper_SSE2(out, tmp); RGB24PackedToPlanarHelper_SSE2(tmp, out); RGB24PackedToPlanarHelper_SSE2(out, tmp); RGB24PackedToPlanarHelper_SSE2(tmp, out); } // Convert 8 packed ARGB to r[], g[], b[] static WEBP_INLINE void RGB32PackedToPlanar_SSE2(const uint32_t* const argb, __m128i* const rgb /*in[6]*/) { const __m128i zero = _mm_setzero_si128(); __m128i a0 = LOAD_16(argb + 0); __m128i a1 = LOAD_16(argb + 4); __m128i a2 = LOAD_16(argb + 8); __m128i a3 = LOAD_16(argb + 12); VP8L32bToPlanar_SSE2(&a0, &a1, &a2, &a3); rgb[0] = _mm_unpacklo_epi8(a1, zero); rgb[1] = _mm_unpackhi_epi8(a1, zero); rgb[2] = _mm_unpacklo_epi8(a2, zero); rgb[3] = _mm_unpackhi_epi8(a2, zero); rgb[4] = _mm_unpacklo_epi8(a3, zero); rgb[5] = _mm_unpackhi_epi8(a3, zero); } // This macro computes (RG * MULT_RG + GB * MULT_GB + ROUNDER) >> DESCALE_FIX // It's a macro and not a function because we need to use immediate values with // srai_epi32, e.g. #define TRANSFORM(RG_LO, RG_HI, GB_LO, GB_HI, MULT_RG, MULT_GB, \ ROUNDER, DESCALE_FIX, OUT) do { \ const __m128i V0_lo = _mm_madd_epi16(RG_LO, MULT_RG); \ const __m128i V0_hi = _mm_madd_epi16(RG_HI, MULT_RG); \ const __m128i V1_lo = _mm_madd_epi16(GB_LO, MULT_GB); \ const __m128i V1_hi = _mm_madd_epi16(GB_HI, MULT_GB); \ const __m128i V2_lo = _mm_add_epi32(V0_lo, V1_lo); \ const __m128i V2_hi = _mm_add_epi32(V0_hi, V1_hi); \ const __m128i V3_lo = _mm_add_epi32(V2_lo, ROUNDER); \ const __m128i V3_hi = _mm_add_epi32(V2_hi, ROUNDER); \ const __m128i V5_lo = _mm_srai_epi32(V3_lo, DESCALE_FIX); \ const __m128i V5_hi = _mm_srai_epi32(V3_hi, DESCALE_FIX); \ (OUT) = _mm_packs_epi32(V5_lo, V5_hi); \ } while (0) #define MK_CST_16(A, B) _mm_set_epi16((B), (A), (B), (A), (B), (A), (B), (A)) static WEBP_INLINE void ConvertRGBToY_SSE2(const __m128i* const R, const __m128i* const G, const __m128i* const B, __m128i* const Y) { const __m128i kRG_y = MK_CST_16(16839, 33059 - 16384); const __m128i kGB_y = MK_CST_16(16384, 6420); const __m128i kHALF_Y = _mm_set1_epi32((16 << YUV_FIX) + YUV_HALF); const __m128i RG_lo = _mm_unpacklo_epi16(*R, *G); const __m128i RG_hi = _mm_unpackhi_epi16(*R, *G); const __m128i GB_lo = _mm_unpacklo_epi16(*G, *B); const __m128i GB_hi = _mm_unpackhi_epi16(*G, *B); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_y, kGB_y, kHALF_Y, YUV_FIX, *Y); } static WEBP_INLINE void ConvertRGBToUV_SSE2(const __m128i* const R, const __m128i* const G, const __m128i* const B, __m128i* const U, __m128i* const V) { const __m128i kRG_u = MK_CST_16(-9719, -19081); const __m128i kGB_u = MK_CST_16(0, 28800); const __m128i kRG_v = MK_CST_16(28800, 0); const __m128i kGB_v = MK_CST_16(-24116, -4684); const __m128i kHALF_UV = _mm_set1_epi32(((128 << YUV_FIX) + YUV_HALF) << 2); const __m128i RG_lo = _mm_unpacklo_epi16(*R, *G); const __m128i RG_hi = _mm_unpackhi_epi16(*R, *G); const __m128i GB_lo = _mm_unpacklo_epi16(*G, *B); const __m128i GB_hi = _mm_unpackhi_epi16(*G, *B); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_u, kGB_u, kHALF_UV, YUV_FIX + 2, *U); TRANSFORM(RG_lo, RG_hi, GB_lo, GB_hi, kRG_v, kGB_v, kHALF_UV, YUV_FIX + 2, *V); } #undef MK_CST_16 #undef TRANSFORM static void ConvertRGB24ToY_SSE2(const uint8_t* rgb, uint8_t* y, int width) { const int max_width = width & ~31; int i; for (i = 0; i < max_width; rgb += 3 * 16 * 2) { __m128i rgb_plane[6]; int j; RGB24PackedToPlanar_SSE2(rgb, rgb_plane); for (j = 0; j < 2; ++j, i += 16) { const __m128i zero = _mm_setzero_si128(); __m128i r, g, b, Y0, Y1; // Convert to 16-bit Y. r = _mm_unpacklo_epi8(rgb_plane[0 + j], zero); g = _mm_unpacklo_epi8(rgb_plane[2 + j], zero); b = _mm_unpacklo_epi8(rgb_plane[4 + j], zero); ConvertRGBToY_SSE2(&r, &g, &b, &Y0); // Convert to 16-bit Y. r = _mm_unpackhi_epi8(rgb_plane[0 + j], zero); g = _mm_unpackhi_epi8(rgb_plane[2 + j], zero); b = _mm_unpackhi_epi8(rgb_plane[4 + j], zero); ConvertRGBToY_SSE2(&r, &g, &b, &Y1); // Cast to 8-bit and store. STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } } for (; i < width; ++i, rgb += 3) { // left-over y[i] = VP8RGBToY(rgb[0], rgb[1], rgb[2], YUV_HALF); } } static void ConvertBGR24ToY_SSE2(const uint8_t* bgr, uint8_t* y, int width) { const int max_width = width & ~31; int i; for (i = 0; i < max_width; bgr += 3 * 16 * 2) { __m128i bgr_plane[6]; int j; RGB24PackedToPlanar_SSE2(bgr, bgr_plane); for (j = 0; j < 2; ++j, i += 16) { const __m128i zero = _mm_setzero_si128(); __m128i r, g, b, Y0, Y1; // Convert to 16-bit Y. b = _mm_unpacklo_epi8(bgr_plane[0 + j], zero); g = _mm_unpacklo_epi8(bgr_plane[2 + j], zero); r = _mm_unpacklo_epi8(bgr_plane[4 + j], zero); ConvertRGBToY_SSE2(&r, &g, &b, &Y0); // Convert to 16-bit Y. b = _mm_unpackhi_epi8(bgr_plane[0 + j], zero); g = _mm_unpackhi_epi8(bgr_plane[2 + j], zero); r = _mm_unpackhi_epi8(bgr_plane[4 + j], zero); ConvertRGBToY_SSE2(&r, &g, &b, &Y1); // Cast to 8-bit and store. STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } } for (; i < width; ++i, bgr += 3) { // left-over y[i] = VP8RGBToY(bgr[2], bgr[1], bgr[0], YUV_HALF); } } static void ConvertARGBToY_SSE2(const uint32_t* argb, uint8_t* y, int width) { const int max_width = width & ~15; int i; for (i = 0; i < max_width; i += 16) { __m128i Y0, Y1, rgb[6]; RGB32PackedToPlanar_SSE2(&argb[i], rgb); ConvertRGBToY_SSE2(&rgb[0], &rgb[2], &rgb[4], &Y0); ConvertRGBToY_SSE2(&rgb[1], &rgb[3], &rgb[5], &Y1); STORE_16(_mm_packus_epi16(Y0, Y1), y + i); } for (; i < width; ++i) { // left-over const uint32_t p = argb[i]; y[i] = VP8RGBToY((p >> 16) & 0xff, (p >> 8) & 0xff, (p >> 0) & 0xff, YUV_HALF); } } // Horizontal add (doubled) of two 16b values, result is 16b. // in: A | B | C | D | ... -> out: 2*(A+B) | 2*(C+D) | ... static void HorizontalAddPack_SSE2(const __m128i* const A, const __m128i* const B, __m128i* const out) { const __m128i k2 = _mm_set1_epi16(2); const __m128i C = _mm_madd_epi16(*A, k2); const __m128i D = _mm_madd_epi16(*B, k2); *out = _mm_packs_epi32(C, D); } static void ConvertARGBToUV_SSE2(const uint32_t* argb, uint8_t* u, uint8_t* v, int src_width, int do_store) { const int max_width = src_width & ~31; int i; for (i = 0; i < max_width; i += 32, u += 16, v += 16) { __m128i rgb[6], U0, V0, U1, V1; RGB32PackedToPlanar_SSE2(&argb[i], rgb); HorizontalAddPack_SSE2(&rgb[0], &rgb[1], &rgb[0]); HorizontalAddPack_SSE2(&rgb[2], &rgb[3], &rgb[2]); HorizontalAddPack_SSE2(&rgb[4], &rgb[5], &rgb[4]); ConvertRGBToUV_SSE2(&rgb[0], &rgb[2], &rgb[4], &U0, &V0); RGB32PackedToPlanar_SSE2(&argb[i + 16], rgb); HorizontalAddPack_SSE2(&rgb[0], &rgb[1], &rgb[0]); HorizontalAddPack_SSE2(&rgb[2], &rgb[3], &rgb[2]); HorizontalAddPack_SSE2(&rgb[4], &rgb[5], &rgb[4]); ConvertRGBToUV_SSE2(&rgb[0], &rgb[2], &rgb[4], &U1, &V1); U0 = _mm_packus_epi16(U0, U1); V0 = _mm_packus_epi16(V0, V1); if (!do_store) { const __m128i prev_u = LOAD_16(u); const __m128i prev_v = LOAD_16(v); U0 = _mm_avg_epu8(U0, prev_u); V0 = _mm_avg_epu8(V0, prev_v); } STORE_16(U0, u); STORE_16(V0, v); } if (i < src_width) { // left-over WebPConvertARGBToUV_C(argb + i, u, v, src_width - i, do_store); } } // Convert 16 packed ARGB 16b-values to r[], g[], b[] static WEBP_INLINE void RGBA32PackedToPlanar_16b_SSE2( const uint16_t* const rgbx, __m128i* const r, __m128i* const g, __m128i* const b) { const __m128i in0 = LOAD_16(rgbx + 0); // r0 | g0 | b0 |x| r1 | g1 | b1 |x const __m128i in1 = LOAD_16(rgbx + 8); // r2 | g2 | b2 |x| r3 | g3 | b3 |x const __m128i in2 = LOAD_16(rgbx + 16); // r4 | ... const __m128i in3 = LOAD_16(rgbx + 24); // r6 | ... // column-wise transpose const __m128i A0 = _mm_unpacklo_epi16(in0, in1); const __m128i A1 = _mm_unpackhi_epi16(in0, in1); const __m128i A2 = _mm_unpacklo_epi16(in2, in3); const __m128i A3 = _mm_unpackhi_epi16(in2, in3); const __m128i B0 = _mm_unpacklo_epi16(A0, A1); // r0 r1 r2 r3 | g0 g1 .. const __m128i B1 = _mm_unpackhi_epi16(A0, A1); // b0 b1 b2 b3 | x x x x const __m128i B2 = _mm_unpacklo_epi16(A2, A3); // r4 r5 r6 r7 | g4 g5 .. const __m128i B3 = _mm_unpackhi_epi16(A2, A3); // b4 b5 b6 b7 | x x x x *r = _mm_unpacklo_epi64(B0, B2); *g = _mm_unpackhi_epi64(B0, B2); *b = _mm_unpacklo_epi64(B1, B3); } static void ConvertRGBA32ToUV_SSE2(const uint16_t* rgb, uint8_t* u, uint8_t* v, int width) { const int max_width = width & ~15; const uint16_t* const last_rgb = rgb + 4 * max_width; while (rgb < last_rgb) { __m128i r, g, b, U0, V0, U1, V1; RGBA32PackedToPlanar_16b_SSE2(rgb + 0, &r, &g, &b); ConvertRGBToUV_SSE2(&r, &g, &b, &U0, &V0); RGBA32PackedToPlanar_16b_SSE2(rgb + 32, &r, &g, &b); ConvertRGBToUV_SSE2(&r, &g, &b, &U1, &V1); STORE_16(_mm_packus_epi16(U0, U1), u); STORE_16(_mm_packus_epi16(V0, V1), v); u += 16; v += 16; rgb += 2 * 32; } if (max_width < width) { // left-over WebPConvertRGBA32ToUV_C(rgb, u, v, width - max_width); } } //------------------------------------------------------------------------------ extern void WebPInitConvertARGBToYUVSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitConvertARGBToYUVSSE2(void) { WebPConvertARGBToY = ConvertARGBToY_SSE2; WebPConvertARGBToUV = ConvertARGBToUV_SSE2; WebPConvertRGB24ToY = ConvertRGB24ToY_SSE2; WebPConvertBGR24ToY = ConvertBGR24ToY_SSE2; WebPConvertRGBA32ToUV = ConvertRGBA32ToUV_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(WebPInitSamplersSSE2) WEBP_DSP_INIT_STUB(WebPInitConvertARGBToYUVSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/dsp/Makefile.in0000644000014400001440000044647014606317244013520 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_LIBWEBPDECODER_TRUE@am__append_1 = libwebpdspdecode.la subdir = src/dsp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(common_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwebpdsp_la_DEPENDENCIES = libwebpdsp_sse2.la libwebpdsp_sse41.la \ libwebpdsp_neon.la libwebpdsp_msa.la libwebpdsp_mips32.la \ libwebpdsp_mips_dsp_r2.la am__objects_1 = libwebpdsp_la-alpha_processing.lo libwebpdsp_la-cpu.lo \ libwebpdsp_la-dec.lo libwebpdsp_la-dec_clip_tables.lo \ libwebpdsp_la-filters.lo libwebpdsp_la-lossless.lo \ libwebpdsp_la-rescaler.lo libwebpdsp_la-upsampling.lo \ libwebpdsp_la-yuv.lo am__objects_2 = libwebpdsp_la-cost.lo libwebpdsp_la-enc.lo \ libwebpdsp_la-lossless_enc.lo libwebpdsp_la-ssim.lo am_libwebpdsp_la_OBJECTS = $(am__objects_1) $(am__objects_2) libwebpdsp_la_OBJECTS = $(am_libwebpdsp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebpdsp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libwebpdsp_la_LDFLAGS) $(LDFLAGS) -o $@ libwebpdsp_mips32_la_DEPENDENCIES = libwebpdspdecode_mips32.la am_libwebpdsp_mips32_la_OBJECTS = libwebpdsp_mips32_la-cost_mips32.lo \ libwebpdsp_mips32_la-enc_mips32.lo \ libwebpdsp_mips32_la-lossless_enc_mips32.lo libwebpdsp_mips32_la_OBJECTS = $(am_libwebpdsp_mips32_la_OBJECTS) libwebpdsp_mips32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdsp_mips_dsp_r2_la_DEPENDENCIES = \ libwebpdspdecode_mips_dsp_r2.la am_libwebpdsp_mips_dsp_r2_la_OBJECTS = \ libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo \ libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo \ libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo libwebpdsp_mips_dsp_r2_la_OBJECTS = \ $(am_libwebpdsp_mips_dsp_r2_la_OBJECTS) libwebpdsp_mips_dsp_r2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdsp_msa_la_DEPENDENCIES = libwebpdspdecode_msa.la am_libwebpdsp_msa_la_OBJECTS = libwebpdsp_msa_la-enc_msa.lo \ libwebpdsp_msa_la-lossless_enc_msa.lo libwebpdsp_msa_la_OBJECTS = $(am_libwebpdsp_msa_la_OBJECTS) libwebpdsp_msa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_msa_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ libwebpdsp_neon_la_DEPENDENCIES = libwebpdspdecode_neon.la am_libwebpdsp_neon_la_OBJECTS = libwebpdsp_neon_la-cost_neon.lo \ libwebpdsp_neon_la-enc_neon.lo \ libwebpdsp_neon_la-lossless_enc_neon.lo libwebpdsp_neon_la_OBJECTS = $(am_libwebpdsp_neon_la_OBJECTS) libwebpdsp_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdsp_sse2_la_DEPENDENCIES = libwebpdspdecode_sse2.la am_libwebpdsp_sse2_la_OBJECTS = libwebpdsp_sse2_la-cost_sse2.lo \ libwebpdsp_sse2_la-enc_sse2.lo \ libwebpdsp_sse2_la-lossless_enc_sse2.lo \ libwebpdsp_sse2_la-ssim_sse2.lo libwebpdsp_sse2_la_OBJECTS = $(am_libwebpdsp_sse2_la_OBJECTS) libwebpdsp_sse2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdsp_sse41_la_DEPENDENCIES = libwebpdspdecode_sse41.la am_libwebpdsp_sse41_la_OBJECTS = libwebpdsp_sse41_la-enc_sse41.lo \ libwebpdsp_sse41_la-lossless_enc_sse41.lo libwebpdsp_sse41_la_OBJECTS = $(am_libwebpdsp_sse41_la_OBJECTS) libwebpdsp_sse41_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdsp_sse41_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ @BUILD_LIBWEBPDECODER_TRUE@libwebpdspdecode_la_DEPENDENCIES = \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_sse2.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_sse41.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_neon.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_msa.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_mips32.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_mips_dsp_r2.la am__libwebpdspdecode_la_SOURCES_DIST = alpha_processing.c cpu.c cpu.h \ dec.c dec_clip_tables.c dsp.h filters.c lossless.c lossless.h \ lossless_common.h rescaler.c upsampling.c yuv.c yuv.h am__objects_3 = libwebpdspdecode_la-alpha_processing.lo \ libwebpdspdecode_la-cpu.lo libwebpdspdecode_la-dec.lo \ libwebpdspdecode_la-dec_clip_tables.lo \ libwebpdspdecode_la-filters.lo libwebpdspdecode_la-lossless.lo \ libwebpdspdecode_la-rescaler.lo \ libwebpdspdecode_la-upsampling.lo libwebpdspdecode_la-yuv.lo @BUILD_LIBWEBPDECODER_TRUE@am_libwebpdspdecode_la_OBJECTS = \ @BUILD_LIBWEBPDECODER_TRUE@ $(am__objects_3) libwebpdspdecode_la_OBJECTS = $(am_libwebpdspdecode_la_OBJECTS) libwebpdspdecode_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libwebpdspdecode_la_LDFLAGS) \ $(LDFLAGS) -o $@ @BUILD_LIBWEBPDECODER_TRUE@am_libwebpdspdecode_la_rpath = libwebpdspdecode_mips32_la_LIBADD = am_libwebpdspdecode_mips32_la_OBJECTS = \ libwebpdspdecode_mips32_la-dec_mips32.lo \ libwebpdspdecode_mips32_la-rescaler_mips32.lo \ libwebpdspdecode_mips32_la-yuv_mips32.lo libwebpdspdecode_mips32_la_OBJECTS = \ $(am_libwebpdspdecode_mips32_la_OBJECTS) libwebpdspdecode_mips32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdspdecode_mips_dsp_r2_la_LIBADD = am_libwebpdspdecode_mips_dsp_r2_la_OBJECTS = libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo \ libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo libwebpdspdecode_mips_dsp_r2_la_OBJECTS = \ $(am_libwebpdspdecode_mips_dsp_r2_la_OBJECTS) libwebpdspdecode_mips_dsp_r2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ libwebpdspdecode_msa_la_LIBADD = am_libwebpdspdecode_msa_la_OBJECTS = \ libwebpdspdecode_msa_la-dec_msa.lo \ libwebpdspdecode_msa_la-filters_msa.lo \ libwebpdspdecode_msa_la-lossless_msa.lo \ libwebpdspdecode_msa_la-rescaler_msa.lo \ libwebpdspdecode_msa_la-upsampling_msa.lo libwebpdspdecode_msa_la_OBJECTS = \ $(am_libwebpdspdecode_msa_la_OBJECTS) libwebpdspdecode_msa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdspdecode_neon_la_LIBADD = am_libwebpdspdecode_neon_la_OBJECTS = \ libwebpdspdecode_neon_la-alpha_processing_neon.lo \ libwebpdspdecode_neon_la-dec_neon.lo \ libwebpdspdecode_neon_la-filters_neon.lo \ libwebpdspdecode_neon_la-lossless_neon.lo \ libwebpdspdecode_neon_la-rescaler_neon.lo \ libwebpdspdecode_neon_la-upsampling_neon.lo \ libwebpdspdecode_neon_la-yuv_neon.lo libwebpdspdecode_neon_la_OBJECTS = \ $(am_libwebpdspdecode_neon_la_OBJECTS) libwebpdspdecode_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdspdecode_sse2_la_LIBADD = am_libwebpdspdecode_sse2_la_OBJECTS = \ libwebpdspdecode_sse2_la-alpha_processing_sse2.lo \ libwebpdspdecode_sse2_la-dec_sse2.lo \ libwebpdspdecode_sse2_la-filters_sse2.lo \ libwebpdspdecode_sse2_la-lossless_sse2.lo \ libwebpdspdecode_sse2_la-rescaler_sse2.lo \ libwebpdspdecode_sse2_la-upsampling_sse2.lo \ libwebpdspdecode_sse2_la-yuv_sse2.lo libwebpdspdecode_sse2_la_OBJECTS = \ $(am_libwebpdspdecode_sse2_la_OBJECTS) libwebpdspdecode_sse2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ libwebpdspdecode_sse41_la_LIBADD = am_libwebpdspdecode_sse41_la_OBJECTS = \ libwebpdspdecode_sse41_la-alpha_processing_sse41.lo \ libwebpdspdecode_sse41_la-dec_sse41.lo \ libwebpdspdecode_sse41_la-lossless_sse41.lo \ libwebpdspdecode_sse41_la-upsampling_sse41.lo \ libwebpdspdecode_sse41_la-yuv_sse41.lo libwebpdspdecode_sse41_la_OBJECTS = \ $(am_libwebpdspdecode_sse41_la_OBJECTS) libwebpdspdecode_sse41_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libwebpdsp_la-alpha_processing.Plo \ ./$(DEPDIR)/libwebpdsp_la-cost.Plo \ ./$(DEPDIR)/libwebpdsp_la-cpu.Plo \ ./$(DEPDIR)/libwebpdsp_la-dec.Plo \ ./$(DEPDIR)/libwebpdsp_la-dec_clip_tables.Plo \ ./$(DEPDIR)/libwebpdsp_la-enc.Plo \ ./$(DEPDIR)/libwebpdsp_la-filters.Plo \ ./$(DEPDIR)/libwebpdsp_la-lossless.Plo \ ./$(DEPDIR)/libwebpdsp_la-lossless_enc.Plo \ ./$(DEPDIR)/libwebpdsp_la-rescaler.Plo \ ./$(DEPDIR)/libwebpdsp_la-ssim.Plo \ ./$(DEPDIR)/libwebpdsp_la-upsampling.Plo \ ./$(DEPDIR)/libwebpdsp_la-yuv.Plo \ ./$(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Plo \ ./$(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Plo \ ./$(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Plo \ ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdsp_msa_la-enc_msa.Plo \ ./$(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Plo \ ./$(DEPDIR)/libwebpdsp_neon_la-cost_neon.Plo \ ./$(DEPDIR)/libwebpdsp_neon_la-enc_neon.Plo \ ./$(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Plo \ ./$(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Plo \ ./$(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Plo \ ./$(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Plo \ ./$(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Plo \ ./$(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Plo \ ./$(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-alpha_processing.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-cpu.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-dec.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-filters.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-lossless.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-rescaler.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-upsampling.Plo \ ./$(DEPDIR)/libwebpdspdecode_la-yuv.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Plo \ ./$(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Plo \ ./$(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Plo \ ./$(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Plo \ ./$(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Plo \ ./$(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Plo \ ./$(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpdsp_la_SOURCES) $(libwebpdsp_mips32_la_SOURCES) \ $(libwebpdsp_mips_dsp_r2_la_SOURCES) \ $(libwebpdsp_msa_la_SOURCES) $(libwebpdsp_neon_la_SOURCES) \ $(libwebpdsp_sse2_la_SOURCES) $(libwebpdsp_sse41_la_SOURCES) \ $(libwebpdspdecode_la_SOURCES) \ $(libwebpdspdecode_mips32_la_SOURCES) \ $(libwebpdspdecode_mips_dsp_r2_la_SOURCES) \ $(libwebpdspdecode_msa_la_SOURCES) \ $(libwebpdspdecode_neon_la_SOURCES) \ $(libwebpdspdecode_sse2_la_SOURCES) \ $(libwebpdspdecode_sse41_la_SOURCES) DIST_SOURCES = $(libwebpdsp_la_SOURCES) \ $(libwebpdsp_mips32_la_SOURCES) \ $(libwebpdsp_mips_dsp_r2_la_SOURCES) \ $(libwebpdsp_msa_la_SOURCES) $(libwebpdsp_neon_la_SOURCES) \ $(libwebpdsp_sse2_la_SOURCES) $(libwebpdsp_sse41_la_SOURCES) \ $(am__libwebpdspdecode_la_SOURCES_DIST) \ $(libwebpdspdecode_mips32_la_SOURCES) \ $(libwebpdspdecode_mips_dsp_r2_la_SOURCES) \ $(libwebpdspdecode_msa_la_SOURCES) \ $(libwebpdspdecode_neon_la_SOURCES) \ $(libwebpdspdecode_sse2_la_SOURCES) \ $(libwebpdspdecode_sse41_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(commondir)" HEADERS = $(common_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libwebpdsp.la libwebpdsp_sse2.la \ libwebpdspdecode_sse2.la libwebpdsp_sse41.la \ libwebpdspdecode_sse41.la libwebpdsp_neon.la \ libwebpdspdecode_neon.la libwebpdsp_msa.la \ libwebpdspdecode_msa.la libwebpdsp_mips32.la \ libwebpdspdecode_mips32.la libwebpdsp_mips_dsp_r2.la \ libwebpdspdecode_mips_dsp_r2.la $(am__append_1) common_HEADERS = ../webp/types.h commondir = $(includedir)/webp COMMON_SOURCES = alpha_processing.c cpu.c cpu.h dec.c \ dec_clip_tables.c dsp.h filters.c lossless.c lossless.h \ lossless_common.h rescaler.c upsampling.c yuv.c yuv.h ENC_SOURCES = cost.c enc.c lossless_enc.c quant.h ssim.c libwebpdspdecode_sse41_la_SOURCES = alpha_processing_sse41.c \ dec_sse41.c lossless_sse41.c upsampling_sse41.c yuv_sse41.c libwebpdspdecode_sse41_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdspdecode_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_FLAGS) libwebpdspdecode_sse2_la_SOURCES = alpha_processing_sse2.c \ common_sse2.h dec_sse2.c filters_sse2.c lossless_sse2.c \ rescaler_sse2.c upsampling_sse2.c yuv_sse2.c libwebpdspdecode_sse2_la_CPPFLAGS = $(libwebpdsp_sse2_la_CPPFLAGS) libwebpdspdecode_sse2_la_CFLAGS = $(libwebpdsp_sse2_la_CFLAGS) libwebpdspdecode_neon_la_SOURCES = alpha_processing_neon.c dec_neon.c \ filters_neon.c lossless_neon.c neon.h rescaler_neon.c \ upsampling_neon.c yuv_neon.c libwebpdspdecode_neon_la_CPPFLAGS = $(libwebpdsp_neon_la_CPPFLAGS) libwebpdspdecode_neon_la_CFLAGS = $(libwebpdsp_neon_la_CFLAGS) libwebpdspdecode_msa_la_SOURCES = dec_msa.c filters_msa.c \ lossless_msa.c msa_macro.h rescaler_msa.c upsampling_msa.c libwebpdspdecode_msa_la_CPPFLAGS = $(libwebpdsp_msa_la_CPPFLAGS) libwebpdspdecode_msa_la_CFLAGS = $(libwebpdsp_msa_la_CFLAGS) libwebpdspdecode_mips32_la_SOURCES = dec_mips32.c mips_macro.h \ rescaler_mips32.c yuv_mips32.c libwebpdspdecode_mips32_la_CPPFLAGS = $(libwebpdsp_mips32_la_CPPFLAGS) libwebpdspdecode_mips32_la_CFLAGS = $(libwebpdsp_mips32_la_CFLAGS) libwebpdspdecode_mips_dsp_r2_la_SOURCES = \ alpha_processing_mips_dsp_r2.c dec_mips_dsp_r2.c \ filters_mips_dsp_r2.c lossless_mips_dsp_r2.c mips_macro.h \ rescaler_mips_dsp_r2.c upsampling_mips_dsp_r2.c \ yuv_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) libwebpdspdecode_mips_dsp_r2_la_CFLAGS = $(libwebpdsp_mips_dsp_r2_la_CFLAGS) libwebpdsp_sse2_la_SOURCES = cost_sse2.c enc_sse2.c \ lossless_enc_sse2.c ssim_sse2.c libwebpdsp_sse2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_sse2_la_CFLAGS = $(AM_CFLAGS) $(SSE2_FLAGS) libwebpdsp_sse2_la_LIBADD = libwebpdspdecode_sse2.la libwebpdsp_sse41_la_SOURCES = enc_sse41.c lossless_enc_sse41.c libwebpdsp_sse41_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_sse41_la_CFLAGS = $(AM_CFLAGS) $(SSE41_FLAGS) libwebpdsp_sse41_la_LIBADD = libwebpdspdecode_sse41.la libwebpdsp_neon_la_SOURCES = cost_neon.c enc_neon.c \ lossless_enc_neon.c libwebpdsp_neon_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_FLAGS) libwebpdsp_neon_la_LIBADD = libwebpdspdecode_neon.la libwebpdsp_msa_la_SOURCES = enc_msa.c lossless_enc_msa.c libwebpdsp_msa_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_msa_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_msa_la_LIBADD = libwebpdspdecode_msa.la libwebpdsp_mips32_la_SOURCES = cost_mips32.c enc_mips32.c \ lossless_enc_mips32.c libwebpdsp_mips32_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_mips32_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_mips32_la_LIBADD = libwebpdspdecode_mips32.la libwebpdsp_mips_dsp_r2_la_SOURCES = cost_mips_dsp_r2.c \ enc_mips_dsp_r2.c lossless_enc_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) libwebpdsp_mips_dsp_r2_la_CFLAGS = $(AM_CFLAGS) libwebpdsp_mips_dsp_r2_la_LIBADD = libwebpdspdecode_mips_dsp_r2.la libwebpdsp_la_SOURCES = $(COMMON_SOURCES) $(ENC_SOURCES) noinst_HEADERS = ../dec/vp8_dec.h ../webp/decode.h libwebpdsp_la_CPPFLAGS = $(AM_CPPFLAGS) $(USE_SWAP_16BIT_CSP) libwebpdsp_la_LDFLAGS = -lm libwebpdsp_la_LIBADD = libwebpdsp_sse2.la libwebpdsp_sse41.la \ libwebpdsp_neon.la libwebpdsp_msa.la libwebpdsp_mips32.la \ libwebpdsp_mips_dsp_r2.la @BUILD_LIBWEBPDECODER_TRUE@libwebpdspdecode_la_SOURCES = $(COMMON_SOURCES) @BUILD_LIBWEBPDECODER_TRUE@libwebpdspdecode_la_CPPFLAGS = $(libwebpdsp_la_CPPFLAGS) @BUILD_LIBWEBPDECODER_TRUE@libwebpdspdecode_la_LDFLAGS = $(libwebpdsp_la_LDFLAGS) @BUILD_LIBWEBPDECODER_TRUE@libwebpdspdecode_la_LIBADD = \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_sse2.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_sse41.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_neon.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_msa.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_mips32.la \ @BUILD_LIBWEBPDECODER_TRUE@ libwebpdspdecode_mips_dsp_r2.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/dsp/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/dsp/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpdsp.la: $(libwebpdsp_la_OBJECTS) $(libwebpdsp_la_DEPENDENCIES) $(EXTRA_libwebpdsp_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_la_LINK) $(libwebpdsp_la_OBJECTS) $(libwebpdsp_la_LIBADD) $(LIBS) libwebpdsp_mips32.la: $(libwebpdsp_mips32_la_OBJECTS) $(libwebpdsp_mips32_la_DEPENDENCIES) $(EXTRA_libwebpdsp_mips32_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_mips32_la_LINK) $(libwebpdsp_mips32_la_OBJECTS) $(libwebpdsp_mips32_la_LIBADD) $(LIBS) libwebpdsp_mips_dsp_r2.la: $(libwebpdsp_mips_dsp_r2_la_OBJECTS) $(libwebpdsp_mips_dsp_r2_la_DEPENDENCIES) $(EXTRA_libwebpdsp_mips_dsp_r2_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_mips_dsp_r2_la_LINK) $(libwebpdsp_mips_dsp_r2_la_OBJECTS) $(libwebpdsp_mips_dsp_r2_la_LIBADD) $(LIBS) libwebpdsp_msa.la: $(libwebpdsp_msa_la_OBJECTS) $(libwebpdsp_msa_la_DEPENDENCIES) $(EXTRA_libwebpdsp_msa_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_msa_la_LINK) $(libwebpdsp_msa_la_OBJECTS) $(libwebpdsp_msa_la_LIBADD) $(LIBS) libwebpdsp_neon.la: $(libwebpdsp_neon_la_OBJECTS) $(libwebpdsp_neon_la_DEPENDENCIES) $(EXTRA_libwebpdsp_neon_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_neon_la_LINK) $(libwebpdsp_neon_la_OBJECTS) $(libwebpdsp_neon_la_LIBADD) $(LIBS) libwebpdsp_sse2.la: $(libwebpdsp_sse2_la_OBJECTS) $(libwebpdsp_sse2_la_DEPENDENCIES) $(EXTRA_libwebpdsp_sse2_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_sse2_la_LINK) $(libwebpdsp_sse2_la_OBJECTS) $(libwebpdsp_sse2_la_LIBADD) $(LIBS) libwebpdsp_sse41.la: $(libwebpdsp_sse41_la_OBJECTS) $(libwebpdsp_sse41_la_DEPENDENCIES) $(EXTRA_libwebpdsp_sse41_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdsp_sse41_la_LINK) $(libwebpdsp_sse41_la_OBJECTS) $(libwebpdsp_sse41_la_LIBADD) $(LIBS) libwebpdspdecode.la: $(libwebpdspdecode_la_OBJECTS) $(libwebpdspdecode_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_la_LINK) $(am_libwebpdspdecode_la_rpath) $(libwebpdspdecode_la_OBJECTS) $(libwebpdspdecode_la_LIBADD) $(LIBS) libwebpdspdecode_mips32.la: $(libwebpdspdecode_mips32_la_OBJECTS) $(libwebpdspdecode_mips32_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_mips32_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_mips32_la_LINK) $(libwebpdspdecode_mips32_la_OBJECTS) $(libwebpdspdecode_mips32_la_LIBADD) $(LIBS) libwebpdspdecode_mips_dsp_r2.la: $(libwebpdspdecode_mips_dsp_r2_la_OBJECTS) $(libwebpdspdecode_mips_dsp_r2_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_mips_dsp_r2_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_mips_dsp_r2_la_LINK) $(libwebpdspdecode_mips_dsp_r2_la_OBJECTS) $(libwebpdspdecode_mips_dsp_r2_la_LIBADD) $(LIBS) libwebpdspdecode_msa.la: $(libwebpdspdecode_msa_la_OBJECTS) $(libwebpdspdecode_msa_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_msa_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_msa_la_LINK) $(libwebpdspdecode_msa_la_OBJECTS) $(libwebpdspdecode_msa_la_LIBADD) $(LIBS) libwebpdspdecode_neon.la: $(libwebpdspdecode_neon_la_OBJECTS) $(libwebpdspdecode_neon_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_neon_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_neon_la_LINK) $(libwebpdspdecode_neon_la_OBJECTS) $(libwebpdspdecode_neon_la_LIBADD) $(LIBS) libwebpdspdecode_sse2.la: $(libwebpdspdecode_sse2_la_OBJECTS) $(libwebpdspdecode_sse2_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_sse2_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_sse2_la_LINK) $(libwebpdspdecode_sse2_la_OBJECTS) $(libwebpdspdecode_sse2_la_LIBADD) $(LIBS) libwebpdspdecode_sse41.la: $(libwebpdspdecode_sse41_la_OBJECTS) $(libwebpdspdecode_sse41_la_DEPENDENCIES) $(EXTRA_libwebpdspdecode_sse41_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdspdecode_sse41_la_LINK) $(libwebpdspdecode_sse41_la_OBJECTS) $(libwebpdspdecode_sse41_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-alpha_processing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-cost.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-cpu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-dec_clip_tables.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-lossless.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-lossless_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-rescaler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-ssim.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-upsampling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_la-yuv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_msa_la-enc_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_neon_la-cost_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_neon_la-enc_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-alpha_processing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-cpu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-filters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-lossless.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-rescaler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-upsampling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_la-yuv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libwebpdsp_la-alpha_processing.lo: alpha_processing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-alpha_processing.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-alpha_processing.Tpo -c -o libwebpdsp_la-alpha_processing.lo `test -f 'alpha_processing.c' || echo '$(srcdir)/'`alpha_processing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-alpha_processing.Tpo $(DEPDIR)/libwebpdsp_la-alpha_processing.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing.c' object='libwebpdsp_la-alpha_processing.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-alpha_processing.lo `test -f 'alpha_processing.c' || echo '$(srcdir)/'`alpha_processing.c libwebpdsp_la-cpu.lo: cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-cpu.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-cpu.Tpo -c -o libwebpdsp_la-cpu.lo `test -f 'cpu.c' || echo '$(srcdir)/'`cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-cpu.Tpo $(DEPDIR)/libwebpdsp_la-cpu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cpu.c' object='libwebpdsp_la-cpu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-cpu.lo `test -f 'cpu.c' || echo '$(srcdir)/'`cpu.c libwebpdsp_la-dec.lo: dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-dec.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-dec.Tpo -c -o libwebpdsp_la-dec.lo `test -f 'dec.c' || echo '$(srcdir)/'`dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-dec.Tpo $(DEPDIR)/libwebpdsp_la-dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec.c' object='libwebpdsp_la-dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-dec.lo `test -f 'dec.c' || echo '$(srcdir)/'`dec.c libwebpdsp_la-dec_clip_tables.lo: dec_clip_tables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-dec_clip_tables.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-dec_clip_tables.Tpo -c -o libwebpdsp_la-dec_clip_tables.lo `test -f 'dec_clip_tables.c' || echo '$(srcdir)/'`dec_clip_tables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-dec_clip_tables.Tpo $(DEPDIR)/libwebpdsp_la-dec_clip_tables.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_clip_tables.c' object='libwebpdsp_la-dec_clip_tables.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-dec_clip_tables.lo `test -f 'dec_clip_tables.c' || echo '$(srcdir)/'`dec_clip_tables.c libwebpdsp_la-filters.lo: filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-filters.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-filters.Tpo -c -o libwebpdsp_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-filters.Tpo $(DEPDIR)/libwebpdsp_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libwebpdsp_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c libwebpdsp_la-lossless.lo: lossless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-lossless.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-lossless.Tpo -c -o libwebpdsp_la-lossless.lo `test -f 'lossless.c' || echo '$(srcdir)/'`lossless.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-lossless.Tpo $(DEPDIR)/libwebpdsp_la-lossless.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless.c' object='libwebpdsp_la-lossless.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-lossless.lo `test -f 'lossless.c' || echo '$(srcdir)/'`lossless.c libwebpdsp_la-rescaler.lo: rescaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-rescaler.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-rescaler.Tpo -c -o libwebpdsp_la-rescaler.lo `test -f 'rescaler.c' || echo '$(srcdir)/'`rescaler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-rescaler.Tpo $(DEPDIR)/libwebpdsp_la-rescaler.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler.c' object='libwebpdsp_la-rescaler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-rescaler.lo `test -f 'rescaler.c' || echo '$(srcdir)/'`rescaler.c libwebpdsp_la-upsampling.lo: upsampling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-upsampling.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-upsampling.Tpo -c -o libwebpdsp_la-upsampling.lo `test -f 'upsampling.c' || echo '$(srcdir)/'`upsampling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-upsampling.Tpo $(DEPDIR)/libwebpdsp_la-upsampling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling.c' object='libwebpdsp_la-upsampling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-upsampling.lo `test -f 'upsampling.c' || echo '$(srcdir)/'`upsampling.c libwebpdsp_la-yuv.lo: yuv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-yuv.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-yuv.Tpo -c -o libwebpdsp_la-yuv.lo `test -f 'yuv.c' || echo '$(srcdir)/'`yuv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-yuv.Tpo $(DEPDIR)/libwebpdsp_la-yuv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv.c' object='libwebpdsp_la-yuv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-yuv.lo `test -f 'yuv.c' || echo '$(srcdir)/'`yuv.c libwebpdsp_la-cost.lo: cost.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-cost.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-cost.Tpo -c -o libwebpdsp_la-cost.lo `test -f 'cost.c' || echo '$(srcdir)/'`cost.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-cost.Tpo $(DEPDIR)/libwebpdsp_la-cost.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost.c' object='libwebpdsp_la-cost.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-cost.lo `test -f 'cost.c' || echo '$(srcdir)/'`cost.c libwebpdsp_la-enc.lo: enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-enc.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-enc.Tpo -c -o libwebpdsp_la-enc.lo `test -f 'enc.c' || echo '$(srcdir)/'`enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-enc.Tpo $(DEPDIR)/libwebpdsp_la-enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc.c' object='libwebpdsp_la-enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-enc.lo `test -f 'enc.c' || echo '$(srcdir)/'`enc.c libwebpdsp_la-lossless_enc.lo: lossless_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-lossless_enc.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-lossless_enc.Tpo -c -o libwebpdsp_la-lossless_enc.lo `test -f 'lossless_enc.c' || echo '$(srcdir)/'`lossless_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-lossless_enc.Tpo $(DEPDIR)/libwebpdsp_la-lossless_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc.c' object='libwebpdsp_la-lossless_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-lossless_enc.lo `test -f 'lossless_enc.c' || echo '$(srcdir)/'`lossless_enc.c libwebpdsp_la-ssim.lo: ssim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdsp_la-ssim.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_la-ssim.Tpo -c -o libwebpdsp_la-ssim.lo `test -f 'ssim.c' || echo '$(srcdir)/'`ssim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_la-ssim.Tpo $(DEPDIR)/libwebpdsp_la-ssim.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssim.c' object='libwebpdsp_la-ssim.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdsp_la-ssim.lo `test -f 'ssim.c' || echo '$(srcdir)/'`ssim.c libwebpdsp_mips32_la-cost_mips32.lo: cost_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips32_la-cost_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Tpo -c -o libwebpdsp_mips32_la-cost_mips32.lo `test -f 'cost_mips32.c' || echo '$(srcdir)/'`cost_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Tpo $(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost_mips32.c' object='libwebpdsp_mips32_la-cost_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips32_la-cost_mips32.lo `test -f 'cost_mips32.c' || echo '$(srcdir)/'`cost_mips32.c libwebpdsp_mips32_la-enc_mips32.lo: enc_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips32_la-enc_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Tpo -c -o libwebpdsp_mips32_la-enc_mips32.lo `test -f 'enc_mips32.c' || echo '$(srcdir)/'`enc_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Tpo $(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_mips32.c' object='libwebpdsp_mips32_la-enc_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips32_la-enc_mips32.lo `test -f 'enc_mips32.c' || echo '$(srcdir)/'`enc_mips32.c libwebpdsp_mips32_la-lossless_enc_mips32.lo: lossless_enc_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips32_la-lossless_enc_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Tpo -c -o libwebpdsp_mips32_la-lossless_enc_mips32.lo `test -f 'lossless_enc_mips32.c' || echo '$(srcdir)/'`lossless_enc_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Tpo $(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_mips32.c' object='libwebpdsp_mips32_la-lossless_enc_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips32_la-lossless_enc_mips32.lo `test -f 'lossless_enc_mips32.c' || echo '$(srcdir)/'`lossless_enc_mips32.c libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo: cost_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Tpo -c -o libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo `test -f 'cost_mips_dsp_r2.c' || echo '$(srcdir)/'`cost_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost_mips_dsp_r2.c' object='libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.lo `test -f 'cost_mips_dsp_r2.c' || echo '$(srcdir)/'`cost_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo: enc_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Tpo -c -o libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo `test -f 'enc_mips_dsp_r2.c' || echo '$(srcdir)/'`enc_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_mips_dsp_r2.c' object='libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.lo `test -f 'enc_mips_dsp_r2.c' || echo '$(srcdir)/'`enc_mips_dsp_r2.c libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo: lossless_enc_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Tpo -c -o libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo `test -f 'lossless_enc_mips_dsp_r2.c' || echo '$(srcdir)/'`lossless_enc_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_mips_dsp_r2.c' object='libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.lo `test -f 'lossless_enc_mips_dsp_r2.c' || echo '$(srcdir)/'`lossless_enc_mips_dsp_r2.c libwebpdsp_msa_la-enc_msa.lo: enc_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_msa_la-enc_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_msa_la-enc_msa.Tpo -c -o libwebpdsp_msa_la-enc_msa.lo `test -f 'enc_msa.c' || echo '$(srcdir)/'`enc_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_msa_la-enc_msa.Tpo $(DEPDIR)/libwebpdsp_msa_la-enc_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_msa.c' object='libwebpdsp_msa_la-enc_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_msa_la-enc_msa.lo `test -f 'enc_msa.c' || echo '$(srcdir)/'`enc_msa.c libwebpdsp_msa_la-lossless_enc_msa.lo: lossless_enc_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_msa_la-lossless_enc_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Tpo -c -o libwebpdsp_msa_la-lossless_enc_msa.lo `test -f 'lossless_enc_msa.c' || echo '$(srcdir)/'`lossless_enc_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Tpo $(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_msa.c' object='libwebpdsp_msa_la-lossless_enc_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_msa_la-lossless_enc_msa.lo `test -f 'lossless_enc_msa.c' || echo '$(srcdir)/'`lossless_enc_msa.c libwebpdsp_neon_la-cost_neon.lo: cost_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_neon_la-cost_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_neon_la-cost_neon.Tpo -c -o libwebpdsp_neon_la-cost_neon.lo `test -f 'cost_neon.c' || echo '$(srcdir)/'`cost_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_neon_la-cost_neon.Tpo $(DEPDIR)/libwebpdsp_neon_la-cost_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost_neon.c' object='libwebpdsp_neon_la-cost_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_neon_la-cost_neon.lo `test -f 'cost_neon.c' || echo '$(srcdir)/'`cost_neon.c libwebpdsp_neon_la-enc_neon.lo: enc_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_neon_la-enc_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_neon_la-enc_neon.Tpo -c -o libwebpdsp_neon_la-enc_neon.lo `test -f 'enc_neon.c' || echo '$(srcdir)/'`enc_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_neon_la-enc_neon.Tpo $(DEPDIR)/libwebpdsp_neon_la-enc_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_neon.c' object='libwebpdsp_neon_la-enc_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_neon_la-enc_neon.lo `test -f 'enc_neon.c' || echo '$(srcdir)/'`enc_neon.c libwebpdsp_neon_la-lossless_enc_neon.lo: lossless_enc_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_neon_la-lossless_enc_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Tpo -c -o libwebpdsp_neon_la-lossless_enc_neon.lo `test -f 'lossless_enc_neon.c' || echo '$(srcdir)/'`lossless_enc_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Tpo $(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_neon.c' object='libwebpdsp_neon_la-lossless_enc_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_neon_la-lossless_enc_neon.lo `test -f 'lossless_enc_neon.c' || echo '$(srcdir)/'`lossless_enc_neon.c libwebpdsp_sse2_la-cost_sse2.lo: cost_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse2_la-cost_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Tpo -c -o libwebpdsp_sse2_la-cost_sse2.lo `test -f 'cost_sse2.c' || echo '$(srcdir)/'`cost_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Tpo $(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost_sse2.c' object='libwebpdsp_sse2_la-cost_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse2_la-cost_sse2.lo `test -f 'cost_sse2.c' || echo '$(srcdir)/'`cost_sse2.c libwebpdsp_sse2_la-enc_sse2.lo: enc_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse2_la-enc_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Tpo -c -o libwebpdsp_sse2_la-enc_sse2.lo `test -f 'enc_sse2.c' || echo '$(srcdir)/'`enc_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Tpo $(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_sse2.c' object='libwebpdsp_sse2_la-enc_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse2_la-enc_sse2.lo `test -f 'enc_sse2.c' || echo '$(srcdir)/'`enc_sse2.c libwebpdsp_sse2_la-lossless_enc_sse2.lo: lossless_enc_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse2_la-lossless_enc_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Tpo -c -o libwebpdsp_sse2_la-lossless_enc_sse2.lo `test -f 'lossless_enc_sse2.c' || echo '$(srcdir)/'`lossless_enc_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Tpo $(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_sse2.c' object='libwebpdsp_sse2_la-lossless_enc_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse2_la-lossless_enc_sse2.lo `test -f 'lossless_enc_sse2.c' || echo '$(srcdir)/'`lossless_enc_sse2.c libwebpdsp_sse2_la-ssim_sse2.lo: ssim_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse2_la-ssim_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Tpo -c -o libwebpdsp_sse2_la-ssim_sse2.lo `test -f 'ssim_sse2.c' || echo '$(srcdir)/'`ssim_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Tpo $(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ssim_sse2.c' object='libwebpdsp_sse2_la-ssim_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse2_la-ssim_sse2.lo `test -f 'ssim_sse2.c' || echo '$(srcdir)/'`ssim_sse2.c libwebpdsp_sse41_la-enc_sse41.lo: enc_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse41_la-enc_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Tpo -c -o libwebpdsp_sse41_la-enc_sse41.lo `test -f 'enc_sse41.c' || echo '$(srcdir)/'`enc_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Tpo $(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enc_sse41.c' object='libwebpdsp_sse41_la-enc_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse41_la-enc_sse41.lo `test -f 'enc_sse41.c' || echo '$(srcdir)/'`enc_sse41.c libwebpdsp_sse41_la-lossless_enc_sse41.lo: lossless_enc_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdsp_sse41_la-lossless_enc_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Tpo -c -o libwebpdsp_sse41_la-lossless_enc_sse41.lo `test -f 'lossless_enc_sse41.c' || echo '$(srcdir)/'`lossless_enc_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Tpo $(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_enc_sse41.c' object='libwebpdsp_sse41_la-lossless_enc_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdsp_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdsp_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdsp_sse41_la-lossless_enc_sse41.lo `test -f 'lossless_enc_sse41.c' || echo '$(srcdir)/'`lossless_enc_sse41.c libwebpdspdecode_la-alpha_processing.lo: alpha_processing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-alpha_processing.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-alpha_processing.Tpo -c -o libwebpdspdecode_la-alpha_processing.lo `test -f 'alpha_processing.c' || echo '$(srcdir)/'`alpha_processing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-alpha_processing.Tpo $(DEPDIR)/libwebpdspdecode_la-alpha_processing.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing.c' object='libwebpdspdecode_la-alpha_processing.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-alpha_processing.lo `test -f 'alpha_processing.c' || echo '$(srcdir)/'`alpha_processing.c libwebpdspdecode_la-cpu.lo: cpu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-cpu.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-cpu.Tpo -c -o libwebpdspdecode_la-cpu.lo `test -f 'cpu.c' || echo '$(srcdir)/'`cpu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-cpu.Tpo $(DEPDIR)/libwebpdspdecode_la-cpu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cpu.c' object='libwebpdspdecode_la-cpu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-cpu.lo `test -f 'cpu.c' || echo '$(srcdir)/'`cpu.c libwebpdspdecode_la-dec.lo: dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-dec.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-dec.Tpo -c -o libwebpdspdecode_la-dec.lo `test -f 'dec.c' || echo '$(srcdir)/'`dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-dec.Tpo $(DEPDIR)/libwebpdspdecode_la-dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec.c' object='libwebpdspdecode_la-dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-dec.lo `test -f 'dec.c' || echo '$(srcdir)/'`dec.c libwebpdspdecode_la-dec_clip_tables.lo: dec_clip_tables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-dec_clip_tables.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Tpo -c -o libwebpdspdecode_la-dec_clip_tables.lo `test -f 'dec_clip_tables.c' || echo '$(srcdir)/'`dec_clip_tables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Tpo $(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_clip_tables.c' object='libwebpdspdecode_la-dec_clip_tables.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-dec_clip_tables.lo `test -f 'dec_clip_tables.c' || echo '$(srcdir)/'`dec_clip_tables.c libwebpdspdecode_la-filters.lo: filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-filters.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-filters.Tpo -c -o libwebpdspdecode_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-filters.Tpo $(DEPDIR)/libwebpdspdecode_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='libwebpdspdecode_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c libwebpdspdecode_la-lossless.lo: lossless.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-lossless.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-lossless.Tpo -c -o libwebpdspdecode_la-lossless.lo `test -f 'lossless.c' || echo '$(srcdir)/'`lossless.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-lossless.Tpo $(DEPDIR)/libwebpdspdecode_la-lossless.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless.c' object='libwebpdspdecode_la-lossless.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-lossless.lo `test -f 'lossless.c' || echo '$(srcdir)/'`lossless.c libwebpdspdecode_la-rescaler.lo: rescaler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-rescaler.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-rescaler.Tpo -c -o libwebpdspdecode_la-rescaler.lo `test -f 'rescaler.c' || echo '$(srcdir)/'`rescaler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-rescaler.Tpo $(DEPDIR)/libwebpdspdecode_la-rescaler.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler.c' object='libwebpdspdecode_la-rescaler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-rescaler.lo `test -f 'rescaler.c' || echo '$(srcdir)/'`rescaler.c libwebpdspdecode_la-upsampling.lo: upsampling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-upsampling.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-upsampling.Tpo -c -o libwebpdspdecode_la-upsampling.lo `test -f 'upsampling.c' || echo '$(srcdir)/'`upsampling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-upsampling.Tpo $(DEPDIR)/libwebpdspdecode_la-upsampling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling.c' object='libwebpdspdecode_la-upsampling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-upsampling.lo `test -f 'upsampling.c' || echo '$(srcdir)/'`upsampling.c libwebpdspdecode_la-yuv.lo: yuv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_la-yuv.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_la-yuv.Tpo -c -o libwebpdspdecode_la-yuv.lo `test -f 'yuv.c' || echo '$(srcdir)/'`yuv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_la-yuv.Tpo $(DEPDIR)/libwebpdspdecode_la-yuv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv.c' object='libwebpdspdecode_la-yuv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_la-yuv.lo `test -f 'yuv.c' || echo '$(srcdir)/'`yuv.c libwebpdspdecode_mips32_la-dec_mips32.lo: dec_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips32_la-dec_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Tpo -c -o libwebpdspdecode_mips32_la-dec_mips32.lo `test -f 'dec_mips32.c' || echo '$(srcdir)/'`dec_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Tpo $(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_mips32.c' object='libwebpdspdecode_mips32_la-dec_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips32_la-dec_mips32.lo `test -f 'dec_mips32.c' || echo '$(srcdir)/'`dec_mips32.c libwebpdspdecode_mips32_la-rescaler_mips32.lo: rescaler_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips32_la-rescaler_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Tpo -c -o libwebpdspdecode_mips32_la-rescaler_mips32.lo `test -f 'rescaler_mips32.c' || echo '$(srcdir)/'`rescaler_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Tpo $(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler_mips32.c' object='libwebpdspdecode_mips32_la-rescaler_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips32_la-rescaler_mips32.lo `test -f 'rescaler_mips32.c' || echo '$(srcdir)/'`rescaler_mips32.c libwebpdspdecode_mips32_la-yuv_mips32.lo: yuv_mips32.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips32_la-yuv_mips32.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Tpo -c -o libwebpdspdecode_mips32_la-yuv_mips32.lo `test -f 'yuv_mips32.c' || echo '$(srcdir)/'`yuv_mips32.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Tpo $(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv_mips32.c' object='libwebpdspdecode_mips32_la-yuv_mips32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips32_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips32_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips32_la-yuv_mips32.lo `test -f 'yuv_mips32.c' || echo '$(srcdir)/'`yuv_mips32.c libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo: alpha_processing_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo `test -f 'alpha_processing_mips_dsp_r2.c' || echo '$(srcdir)/'`alpha_processing_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.lo `test -f 'alpha_processing_mips_dsp_r2.c' || echo '$(srcdir)/'`alpha_processing_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo: dec_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo `test -f 'dec_mips_dsp_r2.c' || echo '$(srcdir)/'`dec_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.lo `test -f 'dec_mips_dsp_r2.c' || echo '$(srcdir)/'`dec_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo: filters_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo `test -f 'filters_mips_dsp_r2.c' || echo '$(srcdir)/'`filters_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.lo `test -f 'filters_mips_dsp_r2.c' || echo '$(srcdir)/'`filters_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo: lossless_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo `test -f 'lossless_mips_dsp_r2.c' || echo '$(srcdir)/'`lossless_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.lo `test -f 'lossless_mips_dsp_r2.c' || echo '$(srcdir)/'`lossless_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo: rescaler_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo `test -f 'rescaler_mips_dsp_r2.c' || echo '$(srcdir)/'`rescaler_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.lo `test -f 'rescaler_mips_dsp_r2.c' || echo '$(srcdir)/'`rescaler_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo: upsampling_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo `test -f 'upsampling_mips_dsp_r2.c' || echo '$(srcdir)/'`upsampling_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.lo `test -f 'upsampling_mips_dsp_r2.c' || echo '$(srcdir)/'`upsampling_mips_dsp_r2.c libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo: yuv_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Tpo -c -o libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo `test -f 'yuv_mips_dsp_r2.c' || echo '$(srcdir)/'`yuv_mips_dsp_r2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Tpo $(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv_mips_dsp_r2.c' object='libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_mips_dsp_r2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_mips_dsp_r2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.lo `test -f 'yuv_mips_dsp_r2.c' || echo '$(srcdir)/'`yuv_mips_dsp_r2.c libwebpdspdecode_msa_la-dec_msa.lo: dec_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_msa_la-dec_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Tpo -c -o libwebpdspdecode_msa_la-dec_msa.lo `test -f 'dec_msa.c' || echo '$(srcdir)/'`dec_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Tpo $(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_msa.c' object='libwebpdspdecode_msa_la-dec_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_msa_la-dec_msa.lo `test -f 'dec_msa.c' || echo '$(srcdir)/'`dec_msa.c libwebpdspdecode_msa_la-filters_msa.lo: filters_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_msa_la-filters_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Tpo -c -o libwebpdspdecode_msa_la-filters_msa.lo `test -f 'filters_msa.c' || echo '$(srcdir)/'`filters_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Tpo $(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters_msa.c' object='libwebpdspdecode_msa_la-filters_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_msa_la-filters_msa.lo `test -f 'filters_msa.c' || echo '$(srcdir)/'`filters_msa.c libwebpdspdecode_msa_la-lossless_msa.lo: lossless_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_msa_la-lossless_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Tpo -c -o libwebpdspdecode_msa_la-lossless_msa.lo `test -f 'lossless_msa.c' || echo '$(srcdir)/'`lossless_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Tpo $(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_msa.c' object='libwebpdspdecode_msa_la-lossless_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_msa_la-lossless_msa.lo `test -f 'lossless_msa.c' || echo '$(srcdir)/'`lossless_msa.c libwebpdspdecode_msa_la-rescaler_msa.lo: rescaler_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_msa_la-rescaler_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Tpo -c -o libwebpdspdecode_msa_la-rescaler_msa.lo `test -f 'rescaler_msa.c' || echo '$(srcdir)/'`rescaler_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Tpo $(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler_msa.c' object='libwebpdspdecode_msa_la-rescaler_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_msa_la-rescaler_msa.lo `test -f 'rescaler_msa.c' || echo '$(srcdir)/'`rescaler_msa.c libwebpdspdecode_msa_la-upsampling_msa.lo: upsampling_msa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_msa_la-upsampling_msa.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Tpo -c -o libwebpdspdecode_msa_la-upsampling_msa.lo `test -f 'upsampling_msa.c' || echo '$(srcdir)/'`upsampling_msa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Tpo $(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling_msa.c' object='libwebpdspdecode_msa_la-upsampling_msa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_msa_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_msa_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_msa_la-upsampling_msa.lo `test -f 'upsampling_msa.c' || echo '$(srcdir)/'`upsampling_msa.c libwebpdspdecode_neon_la-alpha_processing_neon.lo: alpha_processing_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-alpha_processing_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Tpo -c -o libwebpdspdecode_neon_la-alpha_processing_neon.lo `test -f 'alpha_processing_neon.c' || echo '$(srcdir)/'`alpha_processing_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing_neon.c' object='libwebpdspdecode_neon_la-alpha_processing_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-alpha_processing_neon.lo `test -f 'alpha_processing_neon.c' || echo '$(srcdir)/'`alpha_processing_neon.c libwebpdspdecode_neon_la-dec_neon.lo: dec_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-dec_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Tpo -c -o libwebpdspdecode_neon_la-dec_neon.lo `test -f 'dec_neon.c' || echo '$(srcdir)/'`dec_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_neon.c' object='libwebpdspdecode_neon_la-dec_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-dec_neon.lo `test -f 'dec_neon.c' || echo '$(srcdir)/'`dec_neon.c libwebpdspdecode_neon_la-filters_neon.lo: filters_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-filters_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Tpo -c -o libwebpdspdecode_neon_la-filters_neon.lo `test -f 'filters_neon.c' || echo '$(srcdir)/'`filters_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters_neon.c' object='libwebpdspdecode_neon_la-filters_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-filters_neon.lo `test -f 'filters_neon.c' || echo '$(srcdir)/'`filters_neon.c libwebpdspdecode_neon_la-lossless_neon.lo: lossless_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-lossless_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Tpo -c -o libwebpdspdecode_neon_la-lossless_neon.lo `test -f 'lossless_neon.c' || echo '$(srcdir)/'`lossless_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_neon.c' object='libwebpdspdecode_neon_la-lossless_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-lossless_neon.lo `test -f 'lossless_neon.c' || echo '$(srcdir)/'`lossless_neon.c libwebpdspdecode_neon_la-rescaler_neon.lo: rescaler_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-rescaler_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Tpo -c -o libwebpdspdecode_neon_la-rescaler_neon.lo `test -f 'rescaler_neon.c' || echo '$(srcdir)/'`rescaler_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler_neon.c' object='libwebpdspdecode_neon_la-rescaler_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-rescaler_neon.lo `test -f 'rescaler_neon.c' || echo '$(srcdir)/'`rescaler_neon.c libwebpdspdecode_neon_la-upsampling_neon.lo: upsampling_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-upsampling_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Tpo -c -o libwebpdspdecode_neon_la-upsampling_neon.lo `test -f 'upsampling_neon.c' || echo '$(srcdir)/'`upsampling_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling_neon.c' object='libwebpdspdecode_neon_la-upsampling_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-upsampling_neon.lo `test -f 'upsampling_neon.c' || echo '$(srcdir)/'`upsampling_neon.c libwebpdspdecode_neon_la-yuv_neon.lo: yuv_neon.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_neon_la-yuv_neon.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Tpo -c -o libwebpdspdecode_neon_la-yuv_neon.lo `test -f 'yuv_neon.c' || echo '$(srcdir)/'`yuv_neon.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Tpo $(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv_neon.c' object='libwebpdspdecode_neon_la-yuv_neon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_neon_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_neon_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_neon_la-yuv_neon.lo `test -f 'yuv_neon.c' || echo '$(srcdir)/'`yuv_neon.c libwebpdspdecode_sse2_la-alpha_processing_sse2.lo: alpha_processing_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-alpha_processing_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Tpo -c -o libwebpdspdecode_sse2_la-alpha_processing_sse2.lo `test -f 'alpha_processing_sse2.c' || echo '$(srcdir)/'`alpha_processing_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing_sse2.c' object='libwebpdspdecode_sse2_la-alpha_processing_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-alpha_processing_sse2.lo `test -f 'alpha_processing_sse2.c' || echo '$(srcdir)/'`alpha_processing_sse2.c libwebpdspdecode_sse2_la-dec_sse2.lo: dec_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-dec_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Tpo -c -o libwebpdspdecode_sse2_la-dec_sse2.lo `test -f 'dec_sse2.c' || echo '$(srcdir)/'`dec_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_sse2.c' object='libwebpdspdecode_sse2_la-dec_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-dec_sse2.lo `test -f 'dec_sse2.c' || echo '$(srcdir)/'`dec_sse2.c libwebpdspdecode_sse2_la-filters_sse2.lo: filters_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-filters_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Tpo -c -o libwebpdspdecode_sse2_la-filters_sse2.lo `test -f 'filters_sse2.c' || echo '$(srcdir)/'`filters_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters_sse2.c' object='libwebpdspdecode_sse2_la-filters_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-filters_sse2.lo `test -f 'filters_sse2.c' || echo '$(srcdir)/'`filters_sse2.c libwebpdspdecode_sse2_la-lossless_sse2.lo: lossless_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-lossless_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Tpo -c -o libwebpdspdecode_sse2_la-lossless_sse2.lo `test -f 'lossless_sse2.c' || echo '$(srcdir)/'`lossless_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_sse2.c' object='libwebpdspdecode_sse2_la-lossless_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-lossless_sse2.lo `test -f 'lossless_sse2.c' || echo '$(srcdir)/'`lossless_sse2.c libwebpdspdecode_sse2_la-rescaler_sse2.lo: rescaler_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-rescaler_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Tpo -c -o libwebpdspdecode_sse2_la-rescaler_sse2.lo `test -f 'rescaler_sse2.c' || echo '$(srcdir)/'`rescaler_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rescaler_sse2.c' object='libwebpdspdecode_sse2_la-rescaler_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-rescaler_sse2.lo `test -f 'rescaler_sse2.c' || echo '$(srcdir)/'`rescaler_sse2.c libwebpdspdecode_sse2_la-upsampling_sse2.lo: upsampling_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-upsampling_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Tpo -c -o libwebpdspdecode_sse2_la-upsampling_sse2.lo `test -f 'upsampling_sse2.c' || echo '$(srcdir)/'`upsampling_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling_sse2.c' object='libwebpdspdecode_sse2_la-upsampling_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-upsampling_sse2.lo `test -f 'upsampling_sse2.c' || echo '$(srcdir)/'`upsampling_sse2.c libwebpdspdecode_sse2_la-yuv_sse2.lo: yuv_sse2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse2_la-yuv_sse2.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Tpo -c -o libwebpdspdecode_sse2_la-yuv_sse2.lo `test -f 'yuv_sse2.c' || echo '$(srcdir)/'`yuv_sse2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Tpo $(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv_sse2.c' object='libwebpdspdecode_sse2_la-yuv_sse2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse2_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse2_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse2_la-yuv_sse2.lo `test -f 'yuv_sse2.c' || echo '$(srcdir)/'`yuv_sse2.c libwebpdspdecode_sse41_la-alpha_processing_sse41.lo: alpha_processing_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse41_la-alpha_processing_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Tpo -c -o libwebpdspdecode_sse41_la-alpha_processing_sse41.lo `test -f 'alpha_processing_sse41.c' || echo '$(srcdir)/'`alpha_processing_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Tpo $(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_processing_sse41.c' object='libwebpdspdecode_sse41_la-alpha_processing_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse41_la-alpha_processing_sse41.lo `test -f 'alpha_processing_sse41.c' || echo '$(srcdir)/'`alpha_processing_sse41.c libwebpdspdecode_sse41_la-dec_sse41.lo: dec_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse41_la-dec_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Tpo -c -o libwebpdspdecode_sse41_la-dec_sse41.lo `test -f 'dec_sse41.c' || echo '$(srcdir)/'`dec_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Tpo $(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dec_sse41.c' object='libwebpdspdecode_sse41_la-dec_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse41_la-dec_sse41.lo `test -f 'dec_sse41.c' || echo '$(srcdir)/'`dec_sse41.c libwebpdspdecode_sse41_la-lossless_sse41.lo: lossless_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse41_la-lossless_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Tpo -c -o libwebpdspdecode_sse41_la-lossless_sse41.lo `test -f 'lossless_sse41.c' || echo '$(srcdir)/'`lossless_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Tpo $(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='lossless_sse41.c' object='libwebpdspdecode_sse41_la-lossless_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse41_la-lossless_sse41.lo `test -f 'lossless_sse41.c' || echo '$(srcdir)/'`lossless_sse41.c libwebpdspdecode_sse41_la-upsampling_sse41.lo: upsampling_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse41_la-upsampling_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Tpo -c -o libwebpdspdecode_sse41_la-upsampling_sse41.lo `test -f 'upsampling_sse41.c' || echo '$(srcdir)/'`upsampling_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Tpo $(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upsampling_sse41.c' object='libwebpdspdecode_sse41_la-upsampling_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse41_la-upsampling_sse41.lo `test -f 'upsampling_sse41.c' || echo '$(srcdir)/'`upsampling_sse41.c libwebpdspdecode_sse41_la-yuv_sse41.lo: yuv_sse41.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -MT libwebpdspdecode_sse41_la-yuv_sse41.lo -MD -MP -MF $(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Tpo -c -o libwebpdspdecode_sse41_la-yuv_sse41.lo `test -f 'yuv_sse41.c' || echo '$(srcdir)/'`yuv_sse41.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Tpo $(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='yuv_sse41.c' object='libwebpdspdecode_sse41_la-yuv_sse41.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdspdecode_sse41_la_CPPFLAGS) $(CPPFLAGS) $(libwebpdspdecode_sse41_la_CFLAGS) $(CFLAGS) -c -o libwebpdspdecode_sse41_la-yuv_sse41.lo `test -f 'yuv_sse41.c' || echo '$(srcdir)/'`yuv_sse41.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-commonHEADERS: $(common_HEADERS) @$(NORMAL_INSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(commondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(commondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(commondir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(commondir)" || exit $$?; \ done uninstall-commonHEADERS: @$(NORMAL_UNINSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(commondir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(commondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libwebpdsp_la-alpha_processing.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-cost.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-cpu.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-dec.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-dec_clip_tables.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-enc.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-filters.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-lossless.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-lossless_enc.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-rescaler.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-ssim.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-upsampling.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-yuv.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_msa_la-enc_msa.Plo -rm -f ./$(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-cost_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-enc_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-alpha_processing.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-cpu.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-dec.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-filters.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-lossless.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-rescaler.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-upsampling.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-yuv.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-commonHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libwebpdsp_la-alpha_processing.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-cost.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-cpu.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-dec.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-dec_clip_tables.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-enc.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-filters.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-lossless.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-lossless_enc.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-rescaler.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-ssim.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-upsampling.Plo -rm -f ./$(DEPDIR)/libwebpdsp_la-yuv.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-cost_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-enc_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips32_la-lossless_enc_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-cost_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-enc_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_mips_dsp_r2_la-lossless_enc_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_msa_la-enc_msa.Plo -rm -f ./$(DEPDIR)/libwebpdsp_msa_la-lossless_enc_msa.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-cost_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-enc_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_neon_la-lossless_enc_neon.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-cost_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-enc_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-lossless_enc_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse2_la-ssim_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse41_la-enc_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdsp_sse41_la-lossless_enc_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-alpha_processing.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-cpu.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-dec.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-dec_clip_tables.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-filters.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-lossless.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-rescaler.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-upsampling.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_la-yuv.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-dec_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-rescaler_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips32_la-yuv_mips32.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-alpha_processing_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-dec_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-filters_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-lossless_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-rescaler_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-upsampling_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_mips_dsp_r2_la-yuv_mips_dsp_r2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-dec_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-filters_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-lossless_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-rescaler_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_msa_la-upsampling_msa.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-alpha_processing_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-dec_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-filters_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-lossless_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-rescaler_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-upsampling_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_neon_la-yuv_neon.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-alpha_processing_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-dec_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-filters_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-lossless_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-rescaler_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-upsampling_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse2_la-yuv_sse2.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-alpha_processing_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-dec_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-lossless_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-upsampling_sse41.Plo -rm -f ./$(DEPDIR)/libwebpdspdecode_sse41_la-yuv_sse41.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-commonHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-commonHEADERS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-commonHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/dsp/rescaler.c0000644000014400001440000001767014606317060013407 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Rescaling functions // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dsp/dsp.h" #include "src/utils/rescaler_utils.h" //------------------------------------------------------------------------------ // Implementations of critical functions ImportRow / ExportRow #define ROUNDER (WEBP_RESCALER_ONE >> 1) #define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX) #define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX) //------------------------------------------------------------------------------ // Row import void WebPRescalerImportRowExpand_C(WebPRescaler* const wrk, const uint8_t* src) { const int x_stride = wrk->num_channels; const int x_out_max = wrk->dst_width * wrk->num_channels; int channel; assert(!WebPRescalerInputDone(wrk)); assert(wrk->x_expand); for (channel = 0; channel < x_stride; ++channel) { int x_in = channel; int x_out = channel; // simple bilinear interpolation int accum = wrk->x_add; rescaler_t left = (rescaler_t)src[x_in]; rescaler_t right = (wrk->src_width > 1) ? (rescaler_t)src[x_in + x_stride] : left; x_in += x_stride; while (1) { wrk->frow[x_out] = right * wrk->x_add + (left - right) * accum; x_out += x_stride; if (x_out >= x_out_max) break; accum -= wrk->x_sub; if (accum < 0) { left = right; x_in += x_stride; assert(x_in < wrk->src_width * x_stride); right = (rescaler_t)src[x_in]; accum += wrk->x_add; } } assert(wrk->x_sub == 0 /* <- special case for src_width=1 */ || accum == 0); } } void WebPRescalerImportRowShrink_C(WebPRescaler* const wrk, const uint8_t* src) { const int x_stride = wrk->num_channels; const int x_out_max = wrk->dst_width * wrk->num_channels; int channel; assert(!WebPRescalerInputDone(wrk)); assert(!wrk->x_expand); for (channel = 0; channel < x_stride; ++channel) { int x_in = channel; int x_out = channel; uint32_t sum = 0; int accum = 0; while (x_out < x_out_max) { uint32_t base = 0; accum += wrk->x_add; while (accum > 0) { accum -= wrk->x_sub; assert(x_in < wrk->src_width * x_stride); base = src[x_in]; sum += base; x_in += x_stride; } { // Emit next horizontal pixel. const rescaler_t frac = base * (-accum); wrk->frow[x_out] = sum * wrk->x_sub - frac; // fresh fractional start for next pixel sum = (int)MULT_FIX(frac, wrk->fx_scale); } x_out += x_stride; } assert(accum == 0); } } //------------------------------------------------------------------------------ // Row export void WebPRescalerExportRowExpand_C(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* const frow = wrk->frow; assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(wrk->y_expand); assert(wrk->y_sub != 0); if (wrk->y_accum == 0) { for (x_out = 0; x_out < x_out_max; ++x_out) { const uint32_t J = frow[x_out]; const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } else { const uint32_t B = WEBP_RESCALER_FRAC(-wrk->y_accum, wrk->y_sub); const uint32_t A = (uint32_t)(WEBP_RESCALER_ONE - B); for (x_out = 0; x_out < x_out_max; ++x_out) { const uint64_t I = (uint64_t)A * frow[x_out] + (uint64_t)B * irow[x_out]; const uint32_t J = (uint32_t)((I + ROUNDER) >> WEBP_RESCALER_RFIX); const int v = (int)MULT_FIX(J, wrk->fy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; } } } void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) { int x_out; uint8_t* const dst = wrk->dst; rescaler_t* const irow = wrk->irow; const int x_out_max = wrk->dst_width * wrk->num_channels; const rescaler_t* const frow = wrk->frow; const uint32_t yscale = wrk->fy_scale * (-wrk->y_accum); assert(!WebPRescalerOutputDone(wrk)); assert(wrk->y_accum <= 0); assert(!wrk->y_expand); if (yscale) { for (x_out = 0; x_out < x_out_max; ++x_out) { const uint32_t frac = (uint32_t)MULT_FIX_FLOOR(frow[x_out], yscale); const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = frac; // new fractional start } } else { for (x_out = 0; x_out < x_out_max; ++x_out) { const int v = (int)MULT_FIX(irow[x_out], wrk->fxy_scale); dst[x_out] = (v > 255) ? 255u : (uint8_t)v; irow[x_out] = 0; } } } #undef MULT_FIX_FLOOR #undef MULT_FIX #undef ROUNDER //------------------------------------------------------------------------------ // Main entry calls void WebPRescalerImportRow(WebPRescaler* const wrk, const uint8_t* src) { assert(!WebPRescalerInputDone(wrk)); if (!wrk->x_expand) { WebPRescalerImportRowShrink(wrk, src); } else { WebPRescalerImportRowExpand(wrk, src); } } void WebPRescalerExportRow(WebPRescaler* const wrk) { if (wrk->y_accum <= 0) { assert(!WebPRescalerOutputDone(wrk)); if (wrk->y_expand) { WebPRescalerExportRowExpand(wrk); } else if (wrk->fxy_scale) { WebPRescalerExportRowShrink(wrk); } else { // special case int i; assert(wrk->src_height == wrk->dst_height && wrk->x_add == 1); assert(wrk->src_width == 1 && wrk->dst_width <= 2); for (i = 0; i < wrk->num_channels * wrk->dst_width; ++i) { wrk->dst[i] = wrk->irow[i]; wrk->irow[i] = 0; } } wrk->y_accum += wrk->y_add; wrk->dst += wrk->dst_stride; ++wrk->dst_y; } } //------------------------------------------------------------------------------ WebPRescalerImportRowFunc WebPRescalerImportRowExpand; WebPRescalerImportRowFunc WebPRescalerImportRowShrink; WebPRescalerExportRowFunc WebPRescalerExportRowExpand; WebPRescalerExportRowFunc WebPRescalerExportRowShrink; extern VP8CPUInfo VP8GetCPUInfo; extern void WebPRescalerDspInitSSE2(void); extern void WebPRescalerDspInitMIPS32(void); extern void WebPRescalerDspInitMIPSdspR2(void); extern void WebPRescalerDspInitMSA(void); extern void WebPRescalerDspInitNEON(void); WEBP_DSP_INIT_FUNC(WebPRescalerDspInit) { #if !defined(WEBP_REDUCE_SIZE) #if !WEBP_NEON_OMIT_C_CODE WebPRescalerExportRowExpand = WebPRescalerExportRowExpand_C; WebPRescalerExportRowShrink = WebPRescalerExportRowShrink_C; #endif WebPRescalerImportRowExpand = WebPRescalerImportRowExpand_C; WebPRescalerImportRowShrink = WebPRescalerImportRowShrink_C; if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPRescalerDspInitSSE2(); } #endif #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { WebPRescalerDspInitMIPS32(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { WebPRescalerDspInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { WebPRescalerDspInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { WebPRescalerDspInitNEON(); } #endif assert(WebPRescalerExportRowExpand != NULL); assert(WebPRescalerExportRowShrink != NULL); assert(WebPRescalerImportRowExpand != NULL); assert(WebPRescalerImportRowShrink != NULL); #endif // WEBP_REDUCE_SIZE } libwebp-1.4.0/src/dsp/filters_mips_dsp_r2.c0000644000014400001440000005166314606317060015560 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Spatial prediction using various filters // // Author(s): Branimir Vasic (branimir.vasic@imgtec.com) // Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/dsp.h" #include #include #include //------------------------------------------------------------------------------ // Helpful macro. #define DCHECK(in, out) \ do { \ assert(in != NULL); \ assert(out != NULL); \ assert(width > 0); \ assert(height > 0); \ assert(stride >= width); \ assert(row >= 0 && num_rows > 0 && row + num_rows <= height); \ (void)height; /* Silence unused warning. */ \ } while (0) #define DO_PREDICT_LINE(SRC, DST, LENGTH, INVERSE) do { \ const uint8_t* psrc = (uint8_t*)(SRC); \ uint8_t* pdst = (uint8_t*)(DST); \ const int ilength = (int)(LENGTH); \ int temp0, temp1, temp2, temp3, temp4, temp5, temp6; \ __asm__ volatile ( \ ".set push \n\t" \ ".set noreorder \n\t" \ "srl %[temp0], %[length], 2 \n\t" \ "beqz %[temp0], 4f \n\t" \ " andi %[temp6], %[length], 3 \n\t" \ ".if " #INVERSE " \n\t" \ "1: \n\t" \ "lbu %[temp1], -1(%[dst]) \n\t" \ "lbu %[temp2], 0(%[src]) \n\t" \ "lbu %[temp3], 1(%[src]) \n\t" \ "lbu %[temp4], 2(%[src]) \n\t" \ "lbu %[temp5], 3(%[src]) \n\t" \ "addu %[temp1], %[temp1], %[temp2] \n\t" \ "addu %[temp2], %[temp1], %[temp3] \n\t" \ "addu %[temp3], %[temp2], %[temp4] \n\t" \ "addu %[temp4], %[temp3], %[temp5] \n\t" \ "sb %[temp1], 0(%[dst]) \n\t" \ "sb %[temp2], 1(%[dst]) \n\t" \ "sb %[temp3], 2(%[dst]) \n\t" \ "sb %[temp4], 3(%[dst]) \n\t" \ "addiu %[src], %[src], 4 \n\t" \ "addiu %[temp0], %[temp0], -1 \n\t" \ "bnez %[temp0], 1b \n\t" \ " addiu %[dst], %[dst], 4 \n\t" \ ".else \n\t" \ "1: \n\t" \ "ulw %[temp1], -1(%[src]) \n\t" \ "ulw %[temp2], 0(%[src]) \n\t" \ "addiu %[src], %[src], 4 \n\t" \ "addiu %[temp0], %[temp0], -1 \n\t" \ "subu.qb %[temp3], %[temp2], %[temp1] \n\t" \ "usw %[temp3], 0(%[dst]) \n\t" \ "bnez %[temp0], 1b \n\t" \ " addiu %[dst], %[dst], 4 \n\t" \ ".endif \n\t" \ "4: \n\t" \ "beqz %[temp6], 3f \n\t" \ " nop \n\t" \ "2: \n\t" \ "lbu %[temp2], 0(%[src]) \n\t" \ ".if " #INVERSE " \n\t" \ "lbu %[temp1], -1(%[dst]) \n\t" \ "addu %[temp3], %[temp1], %[temp2] \n\t" \ ".else \n\t" \ "lbu %[temp1], -1(%[src]) \n\t" \ "subu %[temp3], %[temp1], %[temp2] \n\t" \ ".endif \n\t" \ "addiu %[src], %[src], 1 \n\t" \ "sb %[temp3], 0(%[dst]) \n\t" \ "addiu %[temp6], %[temp6], -1 \n\t" \ "bnez %[temp6], 2b \n\t" \ " addiu %[dst], %[dst], 1 \n\t" \ "3: \n\t" \ ".set pop \n\t" \ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \ [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), \ [temp6]"=&r"(temp6), [dst]"+&r"(pdst), [src]"+&r"(psrc) \ : [length]"r"(ilength) \ : "memory" \ ); \ } while (0) static WEBP_INLINE void PredictLine_MIPSdspR2(const uint8_t* src, uint8_t* dst, int length) { DO_PREDICT_LINE(src, dst, length, 0); } #define DO_PREDICT_LINE_VERTICAL(SRC, PRED, DST, LENGTH, INVERSE) do { \ const uint8_t* psrc = (uint8_t*)(SRC); \ const uint8_t* ppred = (uint8_t*)(PRED); \ uint8_t* pdst = (uint8_t*)(DST); \ const int ilength = (int)(LENGTH); \ int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; \ __asm__ volatile ( \ ".set push \n\t" \ ".set noreorder \n\t" \ "srl %[temp0], %[length], 0x3 \n\t" \ "beqz %[temp0], 4f \n\t" \ " andi %[temp7], %[length], 0x7 \n\t" \ "1: \n\t" \ "ulw %[temp1], 0(%[src]) \n\t" \ "ulw %[temp2], 0(%[pred]) \n\t" \ "ulw %[temp3], 4(%[src]) \n\t" \ "ulw %[temp4], 4(%[pred]) \n\t" \ "addiu %[src], %[src], 8 \n\t" \ ".if " #INVERSE " \n\t" \ "addu.qb %[temp5], %[temp1], %[temp2] \n\t" \ "addu.qb %[temp6], %[temp3], %[temp4] \n\t" \ ".else \n\t" \ "subu.qb %[temp5], %[temp1], %[temp2] \n\t" \ "subu.qb %[temp6], %[temp3], %[temp4] \n\t" \ ".endif \n\t" \ "addiu %[pred], %[pred], 8 \n\t" \ "usw %[temp5], 0(%[dst]) \n\t" \ "usw %[temp6], 4(%[dst]) \n\t" \ "addiu %[temp0], %[temp0], -1 \n\t" \ "bnez %[temp0], 1b \n\t" \ " addiu %[dst], %[dst], 8 \n\t" \ "4: \n\t" \ "beqz %[temp7], 3f \n\t" \ " nop \n\t" \ "2: \n\t" \ "lbu %[temp1], 0(%[src]) \n\t" \ "lbu %[temp2], 0(%[pred]) \n\t" \ "addiu %[src], %[src], 1 \n\t" \ "addiu %[pred], %[pred], 1 \n\t" \ ".if " #INVERSE " \n\t" \ "addu %[temp3], %[temp1], %[temp2] \n\t" \ ".else \n\t" \ "subu %[temp3], %[temp1], %[temp2] \n\t" \ ".endif \n\t" \ "sb %[temp3], 0(%[dst]) \n\t" \ "addiu %[temp7], %[temp7], -1 \n\t" \ "bnez %[temp7], 2b \n\t" \ " addiu %[dst], %[dst], 1 \n\t" \ "3: \n\t" \ ".set pop \n\t" \ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \ [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), \ [temp6]"=&r"(temp6), [temp7]"=&r"(temp7), [pred]"+&r"(ppred), \ [dst]"+&r"(pdst), [src]"+&r"(psrc) \ : [length]"r"(ilength) \ : "memory" \ ); \ } while (0) #define PREDICT_LINE_ONE_PASS(SRC, PRED, DST) do { \ int temp1, temp2, temp3; \ __asm__ volatile ( \ "lbu %[temp1], 0(%[src]) \n\t" \ "lbu %[temp2], 0(%[pred]) \n\t" \ "subu %[temp3], %[temp1], %[temp2] \n\t" \ "sb %[temp3], 0(%[dst]) \n\t" \ : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3) \ : [pred]"r"((PRED)), [dst]"r"((DST)), [src]"r"((SRC)) \ : "memory" \ ); \ } while (0) //------------------------------------------------------------------------------ // Horizontal filter. #define FILTER_LINE_BY_LINE do { \ while (row < last_row) { \ PREDICT_LINE_ONE_PASS(in, preds - stride, out); \ DO_PREDICT_LINE(in + 1, out + 1, width - 1, 0); \ ++row; \ preds += stride; \ in += stride; \ out += stride; \ } \ } while (0) static WEBP_INLINE void DoHorizontalFilter_MIPSdspR2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = in; if (row == 0) { // Leftmost pixel is the same as input for topmost scanline. out[0] = in[0]; PredictLine_MIPSdspR2(in + 1, out + 1, width - 1); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. FILTER_LINE_BY_LINE; } #undef FILTER_LINE_BY_LINE static void HorizontalFilter_MIPSdspR2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoHorizontalFilter_MIPSdspR2(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ // Vertical filter. #define FILTER_LINE_BY_LINE do { \ while (row < last_row) { \ DO_PREDICT_LINE_VERTICAL(in, preds, out, width, 0); \ ++row; \ preds += stride; \ in += stride; \ out += stride; \ } \ } while (0) static WEBP_INLINE void DoVerticalFilter_MIPSdspR2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = in; if (row == 0) { // Very first top-left pixel is copied. out[0] = in[0]; // Rest of top scan-line is left-predicted. PredictLine_MIPSdspR2(in + 1, out + 1, width - 1); row = 1; in += stride; out += stride; } else { // We are starting from in-between. Make sure 'preds' points to prev row. preds -= stride; } // Filter line-by-line. FILTER_LINE_BY_LINE; } #undef FILTER_LINE_BY_LINE static void VerticalFilter_MIPSdspR2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoVerticalFilter_MIPSdspR2(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ // Gradient filter. static int GradientPredictor_MIPSdspR2(uint8_t a, uint8_t b, uint8_t c) { int temp0; __asm__ volatile ( "addu %[temp0], %[a], %[b] \n\t" "subu %[temp0], %[temp0], %[c] \n\t" "shll_s.w %[temp0], %[temp0], 23 \n\t" "precrqu_s.qb.ph %[temp0], %[temp0], $zero \n\t" "srl %[temp0], %[temp0], 24 \n\t" : [temp0]"=&r"(temp0) : [a]"r"(a),[b]"r"(b),[c]"r"(c) ); return temp0; } #define FILTER_LINE_BY_LINE(PREDS, OPERATION) do { \ while (row < last_row) { \ int w; \ PREDICT_LINE_ONE_PASS(in, PREDS - stride, out); \ for (w = 1; w < width; ++w) { \ const int pred = GradientPredictor_MIPSdspR2(PREDS[w - 1], \ PREDS[w - stride], \ PREDS[w - stride - 1]); \ out[w] = in[w] OPERATION pred; \ } \ ++row; \ in += stride; \ out += stride; \ } \ } while (0) static void DoGradientFilter_MIPSdspR2(const uint8_t* in, int width, int height, int stride, int row, int num_rows, uint8_t* out) { const uint8_t* preds; const size_t start_offset = row * stride; const int last_row = row + num_rows; DCHECK(in, out); in += start_offset; out += start_offset; preds = in; // left prediction for top scan-line if (row == 0) { out[0] = in[0]; PredictLine_MIPSdspR2(in + 1, out + 1, width - 1); row = 1; preds += stride; in += stride; out += stride; } // Filter line-by-line. FILTER_LINE_BY_LINE(in, -); } #undef FILTER_LINE_BY_LINE static void GradientFilter_MIPSdspR2(const uint8_t* data, int width, int height, int stride, uint8_t* filtered_data) { DoGradientFilter_MIPSdspR2(data, width, height, stride, 0, height, filtered_data); } //------------------------------------------------------------------------------ static void HorizontalUnfilter_MIPSdspR2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { out[0] = in[0] + (prev == NULL ? 0 : prev[0]); DO_PREDICT_LINE(in + 1, out + 1, width - 1, 1); } static void VerticalUnfilter_MIPSdspR2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_MIPSdspR2(NULL, in, out, width); } else { DO_PREDICT_LINE_VERTICAL(in, prev, out, width, 1); } } static void GradientUnfilter_MIPSdspR2(const uint8_t* prev, const uint8_t* in, uint8_t* out, int width) { if (prev == NULL) { HorizontalUnfilter_MIPSdspR2(NULL, in, out, width); } else { uint8_t top = prev[0], top_left = top, left = top; int i; for (i = 0; i < width; ++i) { top = prev[i]; // need to read this first, in case prev==dst left = in[i] + GradientPredictor_MIPSdspR2(left, top, top_left); top_left = top; out[i] = left; } } } #undef DO_PREDICT_LINE_VERTICAL #undef PREDICT_LINE_ONE_PASS #undef DO_PREDICT_LINE #undef DCHECK //------------------------------------------------------------------------------ // Entry point extern void VP8FiltersInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8FiltersInitMIPSdspR2(void) { WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_MIPSdspR2; WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_MIPSdspR2; WebPUnfilters[WEBP_FILTER_GRADIENT] = GradientUnfilter_MIPSdspR2; WebPFilters[WEBP_FILTER_HORIZONTAL] = HorizontalFilter_MIPSdspR2; WebPFilters[WEBP_FILTER_VERTICAL] = VerticalFilter_MIPSdspR2; WebPFilters[WEBP_FILTER_GRADIENT] = GradientFilter_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8FiltersInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/enc.c0000644000014400001440000006023114606317060012343 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Speed-critical encoding functions. // // Author: Skal (pascal.massimino@gmail.com) #include #include // for abs() #include "src/dsp/dsp.h" #include "src/enc/vp8i_enc.h" static WEBP_INLINE uint8_t clip_8b(int v) { return (!(v & ~0xff)) ? v : (v < 0) ? 0 : 255; } #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE int clip_max(int v, int max) { return (v > max) ? max : v; } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ // Compute susceptibility based on DCT-coeff histograms: // the higher, the "easier" the macroblock is to compress. const int VP8DspScan[16 + 4 + 4] = { // Luma 0 + 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS, 0 + 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS, 0 + 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS, 0 + 12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS, 0 + 0 * BPS, 4 + 0 * BPS, 0 + 4 * BPS, 4 + 4 * BPS, // U 8 + 0 * BPS, 12 + 0 * BPS, 8 + 4 * BPS, 12 + 4 * BPS // V }; // general-purpose util function void VP8SetHistogramData(const int distribution[MAX_COEFF_THRESH + 1], VP8Histogram* const histo) { int max_value = 0, last_non_zero = 1; int k; for (k = 0; k <= MAX_COEFF_THRESH; ++k) { const int value = distribution[k]; if (value > 0) { if (value > max_value) max_value = value; last_non_zero = k; } } histo->max_value = max_value; histo->last_non_zero = last_non_zero; } #if !WEBP_NEON_OMIT_C_CODE static void CollectHistogram_C(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; for (j = start_block; j < end_block; ++j) { int k; int16_t out[16]; VP8FTransform(ref + VP8DspScan[j], pred + VP8DspScan[j], out); // Convert coefficients to bin. for (k = 0; k < 16; ++k) { const int v = abs(out[k]) >> 3; const int clipped_value = clip_max(v, MAX_COEFF_THRESH); ++distribution[clipped_value]; } } VP8SetHistogramData(distribution, histo); } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ // run-time tables (~4k) static uint8_t clip1[255 + 510 + 1]; // clips [-255,510] to [0,255] // We declare this variable 'volatile' to prevent instruction reordering // and make sure it's set to true _last_ (so as to be thread-safe) static volatile int tables_ok = 0; static WEBP_TSAN_IGNORE_FUNCTION void InitTables(void) { if (!tables_ok) { int i; for (i = -255; i <= 255 + 255; ++i) { clip1[255 + i] = clip_8b(i); } tables_ok = 1; } } //------------------------------------------------------------------------------ // Transforms (Paragraph 14.4) #if !WEBP_NEON_OMIT_C_CODE #define STORE(x, y, v) \ dst[(x) + (y) * BPS] = clip_8b(ref[(x) + (y) * BPS] + ((v) >> 3)) static WEBP_INLINE void ITransformOne(const uint8_t* ref, const int16_t* in, uint8_t* dst) { int C[4 * 4], *tmp; int i; tmp = C; for (i = 0; i < 4; ++i) { // vertical pass const int a = in[0] + in[8]; const int b = in[0] - in[8]; const int c = WEBP_TRANSFORM_AC3_MUL2(in[4]) - WEBP_TRANSFORM_AC3_MUL1(in[12]); const int d = WEBP_TRANSFORM_AC3_MUL1(in[4]) + WEBP_TRANSFORM_AC3_MUL2(in[12]); tmp[0] = a + d; tmp[1] = b + c; tmp[2] = b - c; tmp[3] = a - d; tmp += 4; in++; } tmp = C; for (i = 0; i < 4; ++i) { // horizontal pass const int dc = tmp[0] + 4; const int a = dc + tmp[8]; const int b = dc - tmp[8]; const int c = WEBP_TRANSFORM_AC3_MUL2(tmp[4]) - WEBP_TRANSFORM_AC3_MUL1(tmp[12]); const int d = WEBP_TRANSFORM_AC3_MUL1(tmp[4]) + WEBP_TRANSFORM_AC3_MUL2(tmp[12]); STORE(0, i, a + d); STORE(1, i, b + c); STORE(2, i, b - c); STORE(3, i, a - d); tmp++; } } static void ITransform_C(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { ITransformOne(ref, in, dst); if (do_two) { ITransformOne(ref + 4, in + 16, dst + 4); } } static void FTransform_C(const uint8_t* src, const uint8_t* ref, int16_t* out) { int i; int tmp[16]; for (i = 0; i < 4; ++i, src += BPS, ref += BPS) { const int d0 = src[0] - ref[0]; // 9bit dynamic range ([-255,255]) const int d1 = src[1] - ref[1]; const int d2 = src[2] - ref[2]; const int d3 = src[3] - ref[3]; const int a0 = (d0 + d3); // 10b [-510,510] const int a1 = (d1 + d2); const int a2 = (d1 - d2); const int a3 = (d0 - d3); tmp[0 + i * 4] = (a0 + a1) * 8; // 14b [-8160,8160] tmp[1 + i * 4] = (a2 * 2217 + a3 * 5352 + 1812) >> 9; // [-7536,7542] tmp[2 + i * 4] = (a0 - a1) * 8; tmp[3 + i * 4] = (a3 * 2217 - a2 * 5352 + 937) >> 9; } for (i = 0; i < 4; ++i) { const int a0 = (tmp[0 + i] + tmp[12 + i]); // 15b const int a1 = (tmp[4 + i] + tmp[ 8 + i]); const int a2 = (tmp[4 + i] - tmp[ 8 + i]); const int a3 = (tmp[0 + i] - tmp[12 + i]); out[0 + i] = (a0 + a1 + 7) >> 4; // 12b out[4 + i] = ((a2 * 2217 + a3 * 5352 + 12000) >> 16) + (a3 != 0); out[8 + i] = (a0 - a1 + 7) >> 4; out[12+ i] = ((a3 * 2217 - a2 * 5352 + 51000) >> 16); } } #endif // !WEBP_NEON_OMIT_C_CODE static void FTransform2_C(const uint8_t* src, const uint8_t* ref, int16_t* out) { VP8FTransform(src, ref, out); VP8FTransform(src + 4, ref + 4, out + 16); } #if !WEBP_NEON_OMIT_C_CODE static void FTransformWHT_C(const int16_t* in, int16_t* out) { // input is 12b signed int32_t tmp[16]; int i; for (i = 0; i < 4; ++i, in += 64) { const int a0 = (in[0 * 16] + in[2 * 16]); // 13b const int a1 = (in[1 * 16] + in[3 * 16]); const int a2 = (in[1 * 16] - in[3 * 16]); const int a3 = (in[0 * 16] - in[2 * 16]); tmp[0 + i * 4] = a0 + a1; // 14b tmp[1 + i * 4] = a3 + a2; tmp[2 + i * 4] = a3 - a2; tmp[3 + i * 4] = a0 - a1; } for (i = 0; i < 4; ++i) { const int a0 = (tmp[0 + i] + tmp[8 + i]); // 15b const int a1 = (tmp[4 + i] + tmp[12+ i]); const int a2 = (tmp[4 + i] - tmp[12+ i]); const int a3 = (tmp[0 + i] - tmp[8 + i]); const int b0 = a0 + a1; // 16b const int b1 = a3 + a2; const int b2 = a3 - a2; const int b3 = a0 - a1; out[ 0 + i] = b0 >> 1; // 15b out[ 4 + i] = b1 >> 1; out[ 8 + i] = b2 >> 1; out[12 + i] = b3 >> 1; } } #endif // !WEBP_NEON_OMIT_C_CODE #undef STORE //------------------------------------------------------------------------------ // Intra predictions static WEBP_INLINE void Fill(uint8_t* dst, int value, int size) { int j; for (j = 0; j < size; ++j) { memset(dst + j * BPS, value, size); } } static WEBP_INLINE void VerticalPred(uint8_t* dst, const uint8_t* top, int size) { int j; if (top != NULL) { for (j = 0; j < size; ++j) memcpy(dst + j * BPS, top, size); } else { Fill(dst, 127, size); } } static WEBP_INLINE void HorizontalPred(uint8_t* dst, const uint8_t* left, int size) { if (left != NULL) { int j; for (j = 0; j < size; ++j) { memset(dst + j * BPS, left[j], size); } } else { Fill(dst, 129, size); } } static WEBP_INLINE void TrueMotion(uint8_t* dst, const uint8_t* left, const uint8_t* top, int size) { int y; if (left != NULL) { if (top != NULL) { const uint8_t* const clip = clip1 + 255 - left[-1]; for (y = 0; y < size; ++y) { const uint8_t* const clip_table = clip + left[y]; int x; for (x = 0; x < size; ++x) { dst[x] = clip_table[top[x]]; } dst += BPS; } } else { HorizontalPred(dst, left, size); } } else { // true motion without left samples (hence: with default 129 value) // is equivalent to VE prediction where you just copy the top samples. // Note that if top samples are not available, the default value is // then 129, and not 127 as in the VerticalPred case. if (top != NULL) { VerticalPred(dst, top, size); } else { Fill(dst, 129, size); } } } static WEBP_INLINE void DCMode(uint8_t* dst, const uint8_t* left, const uint8_t* top, int size, int round, int shift) { int DC = 0; int j; if (top != NULL) { for (j = 0; j < size; ++j) DC += top[j]; if (left != NULL) { // top and left present for (j = 0; j < size; ++j) DC += left[j]; } else { // top, but no left DC += DC; } DC = (DC + round) >> shift; } else if (left != NULL) { // left but no top for (j = 0; j < size; ++j) DC += left[j]; DC += DC; DC = (DC + round) >> shift; } else { // no top, no left, nothing. DC = 0x80; } Fill(dst, DC, size); } //------------------------------------------------------------------------------ // Chroma 8x8 prediction (paragraph 12.2) static void IntraChromaPreds_C(uint8_t* dst, const uint8_t* left, const uint8_t* top) { // U block DCMode(C8DC8 + dst, left, top, 8, 8, 4); VerticalPred(C8VE8 + dst, top, 8); HorizontalPred(C8HE8 + dst, left, 8); TrueMotion(C8TM8 + dst, left, top, 8); // V block dst += 8; if (top != NULL) top += 8; if (left != NULL) left += 16; DCMode(C8DC8 + dst, left, top, 8, 8, 4); VerticalPred(C8VE8 + dst, top, 8); HorizontalPred(C8HE8 + dst, left, 8); TrueMotion(C8TM8 + dst, left, top, 8); } //------------------------------------------------------------------------------ // luma 16x16 prediction (paragraph 12.3) static void Intra16Preds_C(uint8_t* dst, const uint8_t* left, const uint8_t* top) { DCMode(I16DC16 + dst, left, top, 16, 16, 5); VerticalPred(I16VE16 + dst, top, 16); HorizontalPred(I16HE16 + dst, left, 16); TrueMotion(I16TM16 + dst, left, top, 16); } //------------------------------------------------------------------------------ // luma 4x4 prediction #define DST(x, y) dst[(x) + (y) * BPS] #define AVG3(a, b, c) ((uint8_t)(((a) + 2 * (b) + (c) + 2) >> 2)) #define AVG2(a, b) (((a) + (b) + 1) >> 1) static void VE4(uint8_t* dst, const uint8_t* top) { // vertical const uint8_t vals[4] = { AVG3(top[-1], top[0], top[1]), AVG3(top[ 0], top[1], top[2]), AVG3(top[ 1], top[2], top[3]), AVG3(top[ 2], top[3], top[4]) }; int i; for (i = 0; i < 4; ++i) { memcpy(dst + i * BPS, vals, 4); } } static void HE4(uint8_t* dst, const uint8_t* top) { // horizontal const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; WebPUint32ToMem(dst + 0 * BPS, 0x01010101U * AVG3(X, I, J)); WebPUint32ToMem(dst + 1 * BPS, 0x01010101U * AVG3(I, J, K)); WebPUint32ToMem(dst + 2 * BPS, 0x01010101U * AVG3(J, K, L)); WebPUint32ToMem(dst + 3 * BPS, 0x01010101U * AVG3(K, L, L)); } static void DC4(uint8_t* dst, const uint8_t* top) { uint32_t dc = 4; int i; for (i = 0; i < 4; ++i) dc += top[i] + top[-5 + i]; Fill(dst, dc >> 3, 4); } static void RD4(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; DST(0, 3) = AVG3(J, K, L); DST(0, 2) = DST(1, 3) = AVG3(I, J, K); DST(0, 1) = DST(1, 2) = DST(2, 3) = AVG3(X, I, J); DST(0, 0) = DST(1, 1) = DST(2, 2) = DST(3, 3) = AVG3(A, X, I); DST(1, 0) = DST(2, 1) = DST(3, 2) = AVG3(B, A, X); DST(2, 0) = DST(3, 1) = AVG3(C, B, A); DST(3, 0) = AVG3(D, C, B); } static void LD4(uint8_t* dst, const uint8_t* top) { const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; const int E = top[4]; const int F = top[5]; const int G = top[6]; const int H = top[7]; DST(0, 0) = AVG3(A, B, C); DST(1, 0) = DST(0, 1) = AVG3(B, C, D); DST(2, 0) = DST(1, 1) = DST(0, 2) = AVG3(C, D, E); DST(3, 0) = DST(2, 1) = DST(1, 2) = DST(0, 3) = AVG3(D, E, F); DST(3, 1) = DST(2, 2) = DST(1, 3) = AVG3(E, F, G); DST(3, 2) = DST(2, 3) = AVG3(F, G, H); DST(3, 3) = AVG3(G, H, H); } static void VR4(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; DST(0, 0) = DST(1, 2) = AVG2(X, A); DST(1, 0) = DST(2, 2) = AVG2(A, B); DST(2, 0) = DST(3, 2) = AVG2(B, C); DST(3, 0) = AVG2(C, D); DST(0, 3) = AVG3(K, J, I); DST(0, 2) = AVG3(J, I, X); DST(0, 1) = DST(1, 3) = AVG3(I, X, A); DST(1, 1) = DST(2, 3) = AVG3(X, A, B); DST(2, 1) = DST(3, 3) = AVG3(A, B, C); DST(3, 1) = AVG3(B, C, D); } static void VL4(uint8_t* dst, const uint8_t* top) { const int A = top[0]; const int B = top[1]; const int C = top[2]; const int D = top[3]; const int E = top[4]; const int F = top[5]; const int G = top[6]; const int H = top[7]; DST(0, 0) = AVG2(A, B); DST(1, 0) = DST(0, 2) = AVG2(B, C); DST(2, 0) = DST(1, 2) = AVG2(C, D); DST(3, 0) = DST(2, 2) = AVG2(D, E); DST(0, 1) = AVG3(A, B, C); DST(1, 1) = DST(0, 3) = AVG3(B, C, D); DST(2, 1) = DST(1, 3) = AVG3(C, D, E); DST(3, 1) = DST(2, 3) = AVG3(D, E, F); DST(3, 2) = AVG3(E, F, G); DST(3, 3) = AVG3(F, G, H); } static void HU4(uint8_t* dst, const uint8_t* top) { const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; DST(0, 0) = AVG2(I, J); DST(2, 0) = DST(0, 1) = AVG2(J, K); DST(2, 1) = DST(0, 2) = AVG2(K, L); DST(1, 0) = AVG3(I, J, K); DST(3, 0) = DST(1, 1) = AVG3(J, K, L); DST(3, 1) = DST(1, 2) = AVG3(K, L, L); DST(3, 2) = DST(2, 2) = DST(0, 3) = DST(1, 3) = DST(2, 3) = DST(3, 3) = L; } static void HD4(uint8_t* dst, const uint8_t* top) { const int X = top[-1]; const int I = top[-2]; const int J = top[-3]; const int K = top[-4]; const int L = top[-5]; const int A = top[0]; const int B = top[1]; const int C = top[2]; DST(0, 0) = DST(2, 1) = AVG2(I, X); DST(0, 1) = DST(2, 2) = AVG2(J, I); DST(0, 2) = DST(2, 3) = AVG2(K, J); DST(0, 3) = AVG2(L, K); DST(3, 0) = AVG3(A, B, C); DST(2, 0) = AVG3(X, A, B); DST(1, 0) = DST(3, 1) = AVG3(I, X, A); DST(1, 1) = DST(3, 2) = AVG3(J, I, X); DST(1, 2) = DST(3, 3) = AVG3(K, J, I); DST(1, 3) = AVG3(L, K, J); } static void TM4(uint8_t* dst, const uint8_t* top) { int x, y; const uint8_t* const clip = clip1 + 255 - top[-1]; for (y = 0; y < 4; ++y) { const uint8_t* const clip_table = clip + top[-2 - y]; for (x = 0; x < 4; ++x) { dst[x] = clip_table[top[x]]; } dst += BPS; } } #undef DST #undef AVG3 #undef AVG2 // Left samples are top[-5 .. -2], top_left is top[-1], top are // located at top[0..3], and top right is top[4..7] static void Intra4Preds_C(uint8_t* dst, const uint8_t* top) { DC4(I4DC4 + dst, top); TM4(I4TM4 + dst, top); VE4(I4VE4 + dst, top); HE4(I4HE4 + dst, top); RD4(I4RD4 + dst, top); VR4(I4VR4 + dst, top); LD4(I4LD4 + dst, top); VL4(I4VL4 + dst, top); HD4(I4HD4 + dst, top); HU4(I4HU4 + dst, top); } //------------------------------------------------------------------------------ // Metric #if !WEBP_NEON_OMIT_C_CODE static WEBP_INLINE int GetSSE(const uint8_t* a, const uint8_t* b, int w, int h) { int count = 0; int y, x; for (y = 0; y < h; ++y) { for (x = 0; x < w; ++x) { const int diff = (int)a[x] - b[x]; count += diff * diff; } a += BPS; b += BPS; } return count; } static int SSE16x16_C(const uint8_t* a, const uint8_t* b) { return GetSSE(a, b, 16, 16); } static int SSE16x8_C(const uint8_t* a, const uint8_t* b) { return GetSSE(a, b, 16, 8); } static int SSE8x8_C(const uint8_t* a, const uint8_t* b) { return GetSSE(a, b, 8, 8); } static int SSE4x4_C(const uint8_t* a, const uint8_t* b) { return GetSSE(a, b, 4, 4); } #endif // !WEBP_NEON_OMIT_C_CODE static void Mean16x4_C(const uint8_t* ref, uint32_t dc[4]) { int k, x, y; for (k = 0; k < 4; ++k) { uint32_t avg = 0; for (y = 0; y < 4; ++y) { for (x = 0; x < 4; ++x) { avg += ref[x + y * BPS]; } } dc[k] = avg; ref += 4; // go to next 4x4 block. } } //------------------------------------------------------------------------------ // Texture distortion // // We try to match the spectral content (weighted) between source and // reconstructed samples. #if !WEBP_NEON_OMIT_C_CODE // Hadamard transform // Returns the weighted sum of the absolute value of transformed coefficients. // w[] contains a row-major 4 by 4 symmetric matrix. static int TTransform(const uint8_t* in, const uint16_t* w) { int sum = 0; int tmp[16]; int i; // horizontal pass for (i = 0; i < 4; ++i, in += BPS) { const int a0 = in[0] + in[2]; const int a1 = in[1] + in[3]; const int a2 = in[1] - in[3]; const int a3 = in[0] - in[2]; tmp[0 + i * 4] = a0 + a1; tmp[1 + i * 4] = a3 + a2; tmp[2 + i * 4] = a3 - a2; tmp[3 + i * 4] = a0 - a1; } // vertical pass for (i = 0; i < 4; ++i, ++w) { const int a0 = tmp[0 + i] + tmp[8 + i]; const int a1 = tmp[4 + i] + tmp[12+ i]; const int a2 = tmp[4 + i] - tmp[12+ i]; const int a3 = tmp[0 + i] - tmp[8 + i]; const int b0 = a0 + a1; const int b1 = a3 + a2; const int b2 = a3 - a2; const int b3 = a0 - a1; sum += w[ 0] * abs(b0); sum += w[ 4] * abs(b1); sum += w[ 8] * abs(b2); sum += w[12] * abs(b3); } return sum; } static int Disto4x4_C(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { const int sum1 = TTransform(a, w); const int sum2 = TTransform(b, w); return abs(sum2 - sum1) >> 5; } static int Disto16x16_C(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_C(a + x + y, b + x + y, w); } } return D; } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ // Quantization // static const uint8_t kZigzag[16] = { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 }; // Simple quantization static int QuantizeBlock_C(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { int last = -1; int n; for (n = 0; n < 16; ++n) { const int j = kZigzag[n]; const int sign = (in[j] < 0); const uint32_t coeff = (sign ? -in[j] : in[j]) + mtx->sharpen_[j]; if (coeff > mtx->zthresh_[j]) { const uint32_t Q = mtx->q_[j]; const uint32_t iQ = mtx->iq_[j]; const uint32_t B = mtx->bias_[j]; int level = QUANTDIV(coeff, iQ, B); if (level > MAX_LEVEL) level = MAX_LEVEL; if (sign) level = -level; in[j] = level * (int)Q; out[n] = level; if (level) last = n; } else { out[n] = 0; in[j] = 0; } } return (last >= 0); } #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC static int Quantize2Blocks_C(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; nz = VP8EncQuantizeBlock(in + 0 * 16, out + 0 * 16, mtx) << 0; nz |= VP8EncQuantizeBlock(in + 1 * 16, out + 1 * 16, mtx) << 1; return nz; } #endif // !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC //------------------------------------------------------------------------------ // Block copy static WEBP_INLINE void Copy(const uint8_t* src, uint8_t* dst, int w, int h) { int y; for (y = 0; y < h; ++y) { memcpy(dst, src, w); src += BPS; dst += BPS; } } static void Copy4x4_C(const uint8_t* src, uint8_t* dst) { Copy(src, dst, 4, 4); } static void Copy16x8_C(const uint8_t* src, uint8_t* dst) { Copy(src, dst, 16, 8); } //------------------------------------------------------------------------------ // Initialization // Speed-critical function pointers. We have to initialize them to the default // implementations within VP8EncDspInit(). VP8CHisto VP8CollectHistogram; VP8Idct VP8ITransform; VP8Fdct VP8FTransform; VP8Fdct VP8FTransform2; VP8WHT VP8FTransformWHT; VP8Intra4Preds VP8EncPredLuma4; VP8IntraPreds VP8EncPredLuma16; VP8IntraPreds VP8EncPredChroma8; VP8Metric VP8SSE16x16; VP8Metric VP8SSE8x8; VP8Metric VP8SSE16x8; VP8Metric VP8SSE4x4; VP8WMetric VP8TDisto4x4; VP8WMetric VP8TDisto16x16; VP8MeanMetric VP8Mean16x4; VP8QuantizeBlock VP8EncQuantizeBlock; VP8Quantize2Blocks VP8EncQuantize2Blocks; VP8QuantizeBlockWHT VP8EncQuantizeBlockWHT; VP8BlockCopy VP8Copy4x4; VP8BlockCopy VP8Copy16x8; extern VP8CPUInfo VP8GetCPUInfo; extern void VP8EncDspInitSSE2(void); extern void VP8EncDspInitSSE41(void); extern void VP8EncDspInitNEON(void); extern void VP8EncDspInitMIPS32(void); extern void VP8EncDspInitMIPSdspR2(void); extern void VP8EncDspInitMSA(void); WEBP_DSP_INIT_FUNC(VP8EncDspInit) { VP8DspInit(); // common inverse transforms InitTables(); // default C implementations #if !WEBP_NEON_OMIT_C_CODE VP8ITransform = ITransform_C; VP8FTransform = FTransform_C; VP8FTransformWHT = FTransformWHT_C; VP8TDisto4x4 = Disto4x4_C; VP8TDisto16x16 = Disto16x16_C; VP8CollectHistogram = CollectHistogram_C; VP8SSE16x16 = SSE16x16_C; VP8SSE16x8 = SSE16x8_C; VP8SSE8x8 = SSE8x8_C; VP8SSE4x4 = SSE4x4_C; #endif #if !WEBP_NEON_OMIT_C_CODE || WEBP_NEON_WORK_AROUND_GCC VP8EncQuantizeBlock = QuantizeBlock_C; VP8EncQuantize2Blocks = Quantize2Blocks_C; #endif VP8FTransform2 = FTransform2_C; VP8EncPredLuma4 = Intra4Preds_C; VP8EncPredLuma16 = Intra16Preds_C; VP8EncPredChroma8 = IntraChromaPreds_C; VP8Mean16x4 = Mean16x4_C; VP8EncQuantizeBlockWHT = QuantizeBlock_C; VP8Copy4x4 = Copy4x4_C; VP8Copy16x8 = Copy16x8_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { VP8EncDspInitSSE2(); #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { VP8EncDspInitSSE41(); } #endif } #endif #if defined(WEBP_USE_MIPS32) if (VP8GetCPUInfo(kMIPS32)) { VP8EncDspInitMIPS32(); } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { VP8EncDspInitMIPSdspR2(); } #endif #if defined(WEBP_USE_MSA) if (VP8GetCPUInfo(kMSA)) { VP8EncDspInitMSA(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { VP8EncDspInitNEON(); } #endif assert(VP8ITransform != NULL); assert(VP8FTransform != NULL); assert(VP8FTransformWHT != NULL); assert(VP8TDisto4x4 != NULL); assert(VP8TDisto16x16 != NULL); assert(VP8CollectHistogram != NULL); assert(VP8SSE16x16 != NULL); assert(VP8SSE16x8 != NULL); assert(VP8SSE8x8 != NULL); assert(VP8SSE4x4 != NULL); assert(VP8EncQuantizeBlock != NULL); assert(VP8EncQuantize2Blocks != NULL); assert(VP8FTransform2 != NULL); assert(VP8EncPredLuma4 != NULL); assert(VP8EncPredLuma16 != NULL); assert(VP8EncPredChroma8 != NULL); assert(VP8Mean16x4 != NULL); assert(VP8EncQuantizeBlockWHT != NULL); assert(VP8Copy4x4 != NULL); assert(VP8Copy16x8 != NULL); } libwebp-1.4.0/src/dsp/alpha_processing.c0000644000014400001440000004600214606317060015117 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for processing transparent channel. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dsp/dsp.h" // Tables can be faster on some platform but incur some extra binary size (~2k). #if !defined(USE_TABLES_FOR_ALPHA_MULT) #define USE_TABLES_FOR_ALPHA_MULT 0 // ALTERNATE_CODE #endif // ----------------------------------------------------------------------------- #define MFIX 24 // 24bit fixed-point arithmetic #define HALF ((1u << MFIX) >> 1) #define KINV_255 ((1u << MFIX) / 255u) static uint32_t Mult(uint8_t x, uint32_t mult) { const uint32_t v = (x * mult + HALF) >> MFIX; assert(v <= 255); // <- 24bit precision is enough to ensure that. return v; } #if (USE_TABLES_FOR_ALPHA_MULT == 1) static const uint32_t kMultTables[2][256] = { { // (255u << MFIX) / alpha 0x00000000, 0xff000000, 0x7f800000, 0x55000000, 0x3fc00000, 0x33000000, 0x2a800000, 0x246db6db, 0x1fe00000, 0x1c555555, 0x19800000, 0x172e8ba2, 0x15400000, 0x139d89d8, 0x1236db6d, 0x11000000, 0x0ff00000, 0x0f000000, 0x0e2aaaaa, 0x0d6bca1a, 0x0cc00000, 0x0c249249, 0x0b9745d1, 0x0b1642c8, 0x0aa00000, 0x0a333333, 0x09cec4ec, 0x0971c71c, 0x091b6db6, 0x08cb08d3, 0x08800000, 0x0839ce73, 0x07f80000, 0x07ba2e8b, 0x07800000, 0x07492492, 0x07155555, 0x06e45306, 0x06b5e50d, 0x0689d89d, 0x06600000, 0x063831f3, 0x06124924, 0x05ee23b8, 0x05cba2e8, 0x05aaaaaa, 0x058b2164, 0x056cefa8, 0x05500000, 0x05343eb1, 0x05199999, 0x05000000, 0x04e76276, 0x04cfb2b7, 0x04b8e38e, 0x04a2e8ba, 0x048db6db, 0x0479435e, 0x04658469, 0x045270d0, 0x04400000, 0x042e29f7, 0x041ce739, 0x040c30c3, 0x03fc0000, 0x03ec4ec4, 0x03dd1745, 0x03ce540f, 0x03c00000, 0x03b21642, 0x03a49249, 0x03976fc6, 0x038aaaaa, 0x037e3f1f, 0x03722983, 0x03666666, 0x035af286, 0x034fcace, 0x0344ec4e, 0x033a5440, 0x03300000, 0x0325ed09, 0x031c18f9, 0x0312818a, 0x03092492, 0x03000000, 0x02f711dc, 0x02ee5846, 0x02e5d174, 0x02dd7baf, 0x02d55555, 0x02cd5cd5, 0x02c590b2, 0x02bdef7b, 0x02b677d4, 0x02af286b, 0x02a80000, 0x02a0fd5c, 0x029a1f58, 0x029364d9, 0x028ccccc, 0x0286562d, 0x02800000, 0x0279c952, 0x0273b13b, 0x026db6db, 0x0267d95b, 0x026217ec, 0x025c71c7, 0x0256e62a, 0x0251745d, 0x024c1bac, 0x0246db6d, 0x0241b2f9, 0x023ca1af, 0x0237a6f4, 0x0232c234, 0x022df2df, 0x02293868, 0x02249249, 0x02200000, 0x021b810e, 0x021714fb, 0x0212bb51, 0x020e739c, 0x020a3d70, 0x02061861, 0x02020408, 0x01fe0000, 0x01fa0be8, 0x01f62762, 0x01f25213, 0x01ee8ba2, 0x01ead3ba, 0x01e72a07, 0x01e38e38, 0x01e00000, 0x01dc7f10, 0x01d90b21, 0x01d5a3e9, 0x01d24924, 0x01cefa8d, 0x01cbb7e3, 0x01c880e5, 0x01c55555, 0x01c234f7, 0x01bf1f8f, 0x01bc14e5, 0x01b914c1, 0x01b61eed, 0x01b33333, 0x01b05160, 0x01ad7943, 0x01aaaaaa, 0x01a7e567, 0x01a5294a, 0x01a27627, 0x019fcbd2, 0x019d2a20, 0x019a90e7, 0x01980000, 0x01957741, 0x0192f684, 0x01907da4, 0x018e0c7c, 0x018ba2e8, 0x018940c5, 0x0186e5f0, 0x01849249, 0x018245ae, 0x01800000, 0x017dc11f, 0x017b88ee, 0x0179574e, 0x01772c23, 0x01750750, 0x0172e8ba, 0x0170d045, 0x016ebdd7, 0x016cb157, 0x016aaaaa, 0x0168a9b9, 0x0166ae6a, 0x0164b8a7, 0x0162c859, 0x0160dd67, 0x015ef7bd, 0x015d1745, 0x015b3bea, 0x01596596, 0x01579435, 0x0155c7b4, 0x01540000, 0x01523d03, 0x01507eae, 0x014ec4ec, 0x014d0fac, 0x014b5edc, 0x0149b26c, 0x01480a4a, 0x01466666, 0x0144c6af, 0x01432b16, 0x0141938b, 0x01400000, 0x013e7063, 0x013ce4a9, 0x013b5cc0, 0x0139d89d, 0x01385830, 0x0136db6d, 0x01356246, 0x0133ecad, 0x01327a97, 0x01310bf6, 0x012fa0be, 0x012e38e3, 0x012cd459, 0x012b7315, 0x012a150a, 0x0128ba2e, 0x01276276, 0x01260dd6, 0x0124bc44, 0x01236db6, 0x01222222, 0x0120d97c, 0x011f93bc, 0x011e50d7, 0x011d10c4, 0x011bd37a, 0x011a98ef, 0x0119611a, 0x01182bf2, 0x0116f96f, 0x0115c988, 0x01149c34, 0x0113716a, 0x01124924, 0x01112358, 0x01100000, 0x010edf12, 0x010dc087, 0x010ca458, 0x010b8a7d, 0x010a72f0, 0x01095da8, 0x01084a9f, 0x010739ce, 0x01062b2e, 0x01051eb8, 0x01041465, 0x01030c30, 0x01020612, 0x01010204, 0x01000000 }, { // alpha * KINV_255 0x00000000, 0x00010101, 0x00020202, 0x00030303, 0x00040404, 0x00050505, 0x00060606, 0x00070707, 0x00080808, 0x00090909, 0x000a0a0a, 0x000b0b0b, 0x000c0c0c, 0x000d0d0d, 0x000e0e0e, 0x000f0f0f, 0x00101010, 0x00111111, 0x00121212, 0x00131313, 0x00141414, 0x00151515, 0x00161616, 0x00171717, 0x00181818, 0x00191919, 0x001a1a1a, 0x001b1b1b, 0x001c1c1c, 0x001d1d1d, 0x001e1e1e, 0x001f1f1f, 0x00202020, 0x00212121, 0x00222222, 0x00232323, 0x00242424, 0x00252525, 0x00262626, 0x00272727, 0x00282828, 0x00292929, 0x002a2a2a, 0x002b2b2b, 0x002c2c2c, 0x002d2d2d, 0x002e2e2e, 0x002f2f2f, 0x00303030, 0x00313131, 0x00323232, 0x00333333, 0x00343434, 0x00353535, 0x00363636, 0x00373737, 0x00383838, 0x00393939, 0x003a3a3a, 0x003b3b3b, 0x003c3c3c, 0x003d3d3d, 0x003e3e3e, 0x003f3f3f, 0x00404040, 0x00414141, 0x00424242, 0x00434343, 0x00444444, 0x00454545, 0x00464646, 0x00474747, 0x00484848, 0x00494949, 0x004a4a4a, 0x004b4b4b, 0x004c4c4c, 0x004d4d4d, 0x004e4e4e, 0x004f4f4f, 0x00505050, 0x00515151, 0x00525252, 0x00535353, 0x00545454, 0x00555555, 0x00565656, 0x00575757, 0x00585858, 0x00595959, 0x005a5a5a, 0x005b5b5b, 0x005c5c5c, 0x005d5d5d, 0x005e5e5e, 0x005f5f5f, 0x00606060, 0x00616161, 0x00626262, 0x00636363, 0x00646464, 0x00656565, 0x00666666, 0x00676767, 0x00686868, 0x00696969, 0x006a6a6a, 0x006b6b6b, 0x006c6c6c, 0x006d6d6d, 0x006e6e6e, 0x006f6f6f, 0x00707070, 0x00717171, 0x00727272, 0x00737373, 0x00747474, 0x00757575, 0x00767676, 0x00777777, 0x00787878, 0x00797979, 0x007a7a7a, 0x007b7b7b, 0x007c7c7c, 0x007d7d7d, 0x007e7e7e, 0x007f7f7f, 0x00808080, 0x00818181, 0x00828282, 0x00838383, 0x00848484, 0x00858585, 0x00868686, 0x00878787, 0x00888888, 0x00898989, 0x008a8a8a, 0x008b8b8b, 0x008c8c8c, 0x008d8d8d, 0x008e8e8e, 0x008f8f8f, 0x00909090, 0x00919191, 0x00929292, 0x00939393, 0x00949494, 0x00959595, 0x00969696, 0x00979797, 0x00989898, 0x00999999, 0x009a9a9a, 0x009b9b9b, 0x009c9c9c, 0x009d9d9d, 0x009e9e9e, 0x009f9f9f, 0x00a0a0a0, 0x00a1a1a1, 0x00a2a2a2, 0x00a3a3a3, 0x00a4a4a4, 0x00a5a5a5, 0x00a6a6a6, 0x00a7a7a7, 0x00a8a8a8, 0x00a9a9a9, 0x00aaaaaa, 0x00ababab, 0x00acacac, 0x00adadad, 0x00aeaeae, 0x00afafaf, 0x00b0b0b0, 0x00b1b1b1, 0x00b2b2b2, 0x00b3b3b3, 0x00b4b4b4, 0x00b5b5b5, 0x00b6b6b6, 0x00b7b7b7, 0x00b8b8b8, 0x00b9b9b9, 0x00bababa, 0x00bbbbbb, 0x00bcbcbc, 0x00bdbdbd, 0x00bebebe, 0x00bfbfbf, 0x00c0c0c0, 0x00c1c1c1, 0x00c2c2c2, 0x00c3c3c3, 0x00c4c4c4, 0x00c5c5c5, 0x00c6c6c6, 0x00c7c7c7, 0x00c8c8c8, 0x00c9c9c9, 0x00cacaca, 0x00cbcbcb, 0x00cccccc, 0x00cdcdcd, 0x00cecece, 0x00cfcfcf, 0x00d0d0d0, 0x00d1d1d1, 0x00d2d2d2, 0x00d3d3d3, 0x00d4d4d4, 0x00d5d5d5, 0x00d6d6d6, 0x00d7d7d7, 0x00d8d8d8, 0x00d9d9d9, 0x00dadada, 0x00dbdbdb, 0x00dcdcdc, 0x00dddddd, 0x00dedede, 0x00dfdfdf, 0x00e0e0e0, 0x00e1e1e1, 0x00e2e2e2, 0x00e3e3e3, 0x00e4e4e4, 0x00e5e5e5, 0x00e6e6e6, 0x00e7e7e7, 0x00e8e8e8, 0x00e9e9e9, 0x00eaeaea, 0x00ebebeb, 0x00ececec, 0x00ededed, 0x00eeeeee, 0x00efefef, 0x00f0f0f0, 0x00f1f1f1, 0x00f2f2f2, 0x00f3f3f3, 0x00f4f4f4, 0x00f5f5f5, 0x00f6f6f6, 0x00f7f7f7, 0x00f8f8f8, 0x00f9f9f9, 0x00fafafa, 0x00fbfbfb, 0x00fcfcfc, 0x00fdfdfd, 0x00fefefe, 0x00ffffff } }; static WEBP_INLINE uint32_t GetScale(uint32_t a, int inverse) { return kMultTables[!inverse][a]; } #else static WEBP_INLINE uint32_t GetScale(uint32_t a, int inverse) { return inverse ? (255u << MFIX) / a : a * KINV_255; } #endif // USE_TABLES_FOR_ALPHA_MULT void WebPMultARGBRow_C(uint32_t* const ptr, int width, int inverse) { int x; for (x = 0; x < width; ++x) { const uint32_t argb = ptr[x]; if (argb < 0xff000000u) { // alpha < 255 if (argb <= 0x00ffffffu) { // alpha == 0 ptr[x] = 0; } else { const uint32_t alpha = (argb >> 24) & 0xff; const uint32_t scale = GetScale(alpha, inverse); uint32_t out = argb & 0xff000000u; out |= Mult(argb >> 0, scale) << 0; out |= Mult(argb >> 8, scale) << 8; out |= Mult(argb >> 16, scale) << 16; ptr[x] = out; } } } } void WebPMultRow_C(uint8_t* WEBP_RESTRICT const ptr, const uint8_t* WEBP_RESTRICT const alpha, int width, int inverse) { int x; for (x = 0; x < width; ++x) { const uint32_t a = alpha[x]; if (a != 255) { if (a == 0) { ptr[x] = 0; } else { const uint32_t scale = GetScale(a, inverse); ptr[x] = Mult(ptr[x], scale); } } } } #undef KINV_255 #undef HALF #undef MFIX void (*WebPMultARGBRow)(uint32_t* const ptr, int width, int inverse); void (*WebPMultRow)(uint8_t* WEBP_RESTRICT const ptr, const uint8_t* WEBP_RESTRICT const alpha, int width, int inverse); //------------------------------------------------------------------------------ // Generic per-plane calls void WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows, int inverse) { int n; for (n = 0; n < num_rows; ++n) { WebPMultARGBRow((uint32_t*)ptr, width, inverse); ptr += stride; } } void WebPMultRows(uint8_t* WEBP_RESTRICT ptr, int stride, const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int num_rows, int inverse) { int n; for (n = 0; n < num_rows; ++n) { WebPMultRow(ptr, alpha, width, inverse); ptr += stride; alpha += alpha_stride; } } //------------------------------------------------------------------------------ // Premultiplied modes // non dithered-modes // (x * a * 32897) >> 23 is bit-wise equivalent to (int)(x * a / 255.) // for all 8bit x or a. For bit-wise equivalence to (int)(x * a / 255. + .5), // one can use instead: (x * a * 65793 + (1 << 23)) >> 24 #if 1 // (int)(x * a / 255.) #define MULTIPLIER(a) ((a) * 32897U) #define PREMULTIPLY(x, m) (((x) * (m)) >> 23) #else // (int)(x * a / 255. + .5) #define MULTIPLIER(a) ((a) * 65793U) #define PREMULTIPLY(x, m) (((x) * (m) + (1U << 23)) >> 24) #endif #if !WEBP_NEON_OMIT_C_CODE static void ApplyAlphaMultiply_C(uint8_t* rgba, int alpha_first, int w, int h, int stride) { while (h-- > 0) { uint8_t* const rgb = rgba + (alpha_first ? 1 : 0); const uint8_t* const alpha = rgba + (alpha_first ? 0 : 3); int i; for (i = 0; i < w; ++i) { const uint32_t a = alpha[4 * i]; if (a != 0xff) { const uint32_t mult = MULTIPLIER(a); rgb[4 * i + 0] = PREMULTIPLY(rgb[4 * i + 0], mult); rgb[4 * i + 1] = PREMULTIPLY(rgb[4 * i + 1], mult); rgb[4 * i + 2] = PREMULTIPLY(rgb[4 * i + 2], mult); } } rgba += stride; } } #endif // !WEBP_NEON_OMIT_C_CODE #undef MULTIPLIER #undef PREMULTIPLY // rgbA4444 #define MULTIPLIER(a) ((a) * 0x1111) // 0x1111 ~= (1 << 16) / 15 static WEBP_INLINE uint8_t dither_hi(uint8_t x) { return (x & 0xf0) | (x >> 4); } static WEBP_INLINE uint8_t dither_lo(uint8_t x) { return (x & 0x0f) | (x << 4); } static WEBP_INLINE uint8_t multiply(uint8_t x, uint32_t m) { return (x * m) >> 16; } static WEBP_INLINE void ApplyAlphaMultiply4444_C(uint8_t* rgba4444, int w, int h, int stride, int rg_byte_pos /* 0 or 1 */) { while (h-- > 0) { int i; for (i = 0; i < w; ++i) { const uint32_t rg = rgba4444[2 * i + rg_byte_pos]; const uint32_t ba = rgba4444[2 * i + (rg_byte_pos ^ 1)]; const uint8_t a = ba & 0x0f; const uint32_t mult = MULTIPLIER(a); const uint8_t r = multiply(dither_hi(rg), mult); const uint8_t g = multiply(dither_lo(rg), mult); const uint8_t b = multiply(dither_hi(ba), mult); rgba4444[2 * i + rg_byte_pos] = (r & 0xf0) | ((g >> 4) & 0x0f); rgba4444[2 * i + (rg_byte_pos ^ 1)] = (b & 0xf0) | a; } rgba4444 += stride; } } #undef MULTIPLIER static void ApplyAlphaMultiply_16b_C(uint8_t* rgba4444, int w, int h, int stride) { #if (WEBP_SWAP_16BIT_CSP == 1) ApplyAlphaMultiply4444_C(rgba4444, w, h, stride, 1); #else ApplyAlphaMultiply4444_C(rgba4444, w, h, stride, 0); #endif } #if !WEBP_NEON_OMIT_C_CODE static int DispatchAlpha_C(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint8_t* WEBP_RESTRICT dst, int dst_stride) { uint32_t alpha_mask = 0xff; int i, j; for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { const uint32_t alpha_value = alpha[i]; dst[4 * i] = alpha_value; alpha_mask &= alpha_value; } alpha += alpha_stride; dst += dst_stride; } return (alpha_mask != 0xff); } static void DispatchAlphaToGreen_C(const uint8_t* WEBP_RESTRICT alpha, int alpha_stride, int width, int height, uint32_t* WEBP_RESTRICT dst, int dst_stride) { int i, j; for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { dst[i] = alpha[i] << 8; // leave A/R/B channels zero'd. } alpha += alpha_stride; dst += dst_stride; } } static int ExtractAlpha_C(const uint8_t* WEBP_RESTRICT argb, int argb_stride, int width, int height, uint8_t* WEBP_RESTRICT alpha, int alpha_stride) { uint8_t alpha_mask = 0xff; int i, j; for (j = 0; j < height; ++j) { for (i = 0; i < width; ++i) { const uint8_t alpha_value = argb[4 * i]; alpha[i] = alpha_value; alpha_mask &= alpha_value; } argb += argb_stride; alpha += alpha_stride; } return (alpha_mask == 0xff); } static void ExtractGreen_C(const uint32_t* WEBP_RESTRICT argb, uint8_t* WEBP_RESTRICT alpha, int size) { int i; for (i = 0; i < size; ++i) alpha[i] = argb[i] >> 8; } #endif // !WEBP_NEON_OMIT_C_CODE //------------------------------------------------------------------------------ static int HasAlpha8b_C(const uint8_t* src, int length) { while (length-- > 0) if (*src++ != 0xff) return 1; return 0; } static int HasAlpha32b_C(const uint8_t* src, int length) { int x; for (x = 0; length-- > 0; x += 4) if (src[x] != 0xff) return 1; return 0; } static void AlphaReplace_C(uint32_t* src, int length, uint32_t color) { int x; for (x = 0; x < length; ++x) if ((src[x] >> 24) == 0) src[x] = color; } //------------------------------------------------------------------------------ // Simple channel manipulations. static WEBP_INLINE uint32_t MakeARGB32(int a, int r, int g, int b) { return (((uint32_t)a << 24) | (r << 16) | (g << 8) | b); } #ifdef WORDS_BIGENDIAN static void PackARGB_C(const uint8_t* WEBP_RESTRICT a, const uint8_t* WEBP_RESTRICT r, const uint8_t* WEBP_RESTRICT g, const uint8_t* WEBP_RESTRICT b, int len, uint32_t* WEBP_RESTRICT out) { int i; for (i = 0; i < len; ++i) { out[i] = MakeARGB32(a[4 * i], r[4 * i], g[4 * i], b[4 * i]); } } #endif static void PackRGB_C(const uint8_t* WEBP_RESTRICT r, const uint8_t* WEBP_RESTRICT g, const uint8_t* WEBP_RESTRICT b, int len, int step, uint32_t* WEBP_RESTRICT out) { int i, offset = 0; for (i = 0; i < len; ++i) { out[i] = MakeARGB32(0xff, r[offset], g[offset], b[offset]); offset += step; } } void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int); void (*WebPApplyAlphaMultiply4444)(uint8_t*, int, int, int); int (*WebPDispatchAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int, uint8_t* WEBP_RESTRICT, int); void (*WebPDispatchAlphaToGreen)(const uint8_t* WEBP_RESTRICT, int, int, int, uint32_t* WEBP_RESTRICT, int); int (*WebPExtractAlpha)(const uint8_t* WEBP_RESTRICT, int, int, int, uint8_t* WEBP_RESTRICT, int); void (*WebPExtractGreen)(const uint32_t* WEBP_RESTRICT argb, uint8_t* WEBP_RESTRICT alpha, int size); #ifdef WORDS_BIGENDIAN void (*WebPPackARGB)(const uint8_t* a, const uint8_t* r, const uint8_t* g, const uint8_t* b, int, uint32_t*); #endif void (*WebPPackRGB)(const uint8_t* WEBP_RESTRICT r, const uint8_t* WEBP_RESTRICT g, const uint8_t* WEBP_RESTRICT b, int len, int step, uint32_t* WEBP_RESTRICT out); int (*WebPHasAlpha8b)(const uint8_t* src, int length); int (*WebPHasAlpha32b)(const uint8_t* src, int length); void (*WebPAlphaReplace)(uint32_t* src, int length, uint32_t color); //------------------------------------------------------------------------------ // Init function extern VP8CPUInfo VP8GetCPUInfo; extern void WebPInitAlphaProcessingMIPSdspR2(void); extern void WebPInitAlphaProcessingSSE2(void); extern void WebPInitAlphaProcessingSSE41(void); extern void WebPInitAlphaProcessingNEON(void); WEBP_DSP_INIT_FUNC(WebPInitAlphaProcessing) { WebPMultARGBRow = WebPMultARGBRow_C; WebPMultRow = WebPMultRow_C; WebPApplyAlphaMultiply4444 = ApplyAlphaMultiply_16b_C; #ifdef WORDS_BIGENDIAN WebPPackARGB = PackARGB_C; #endif WebPPackRGB = PackRGB_C; #if !WEBP_NEON_OMIT_C_CODE WebPApplyAlphaMultiply = ApplyAlphaMultiply_C; WebPDispatchAlpha = DispatchAlpha_C; WebPDispatchAlphaToGreen = DispatchAlphaToGreen_C; WebPExtractAlpha = ExtractAlpha_C; WebPExtractGreen = ExtractGreen_C; #endif WebPHasAlpha8b = HasAlpha8b_C; WebPHasAlpha32b = HasAlpha32b_C; WebPAlphaReplace = AlphaReplace_C; // If defined, use CPUInfo() to overwrite some pointers with faster versions. if (VP8GetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) if (VP8GetCPUInfo(kSSE2)) { WebPInitAlphaProcessingSSE2(); #if defined(WEBP_HAVE_SSE41) if (VP8GetCPUInfo(kSSE4_1)) { WebPInitAlphaProcessingSSE41(); } #endif } #endif #if defined(WEBP_USE_MIPS_DSP_R2) if (VP8GetCPUInfo(kMIPSdspR2)) { WebPInitAlphaProcessingMIPSdspR2(); } #endif } #if defined(WEBP_HAVE_NEON) if (WEBP_NEON_OMIT_C_CODE || (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) { WebPInitAlphaProcessingNEON(); } #endif assert(WebPMultARGBRow != NULL); assert(WebPMultRow != NULL); assert(WebPApplyAlphaMultiply != NULL); assert(WebPApplyAlphaMultiply4444 != NULL); assert(WebPDispatchAlpha != NULL); assert(WebPDispatchAlphaToGreen != NULL); assert(WebPExtractAlpha != NULL); assert(WebPExtractGreen != NULL); #ifdef WORDS_BIGENDIAN assert(WebPPackARGB != NULL); #endif assert(WebPPackRGB != NULL); assert(WebPHasAlpha8b != NULL); assert(WebPHasAlpha32b != NULL); assert(WebPAlphaReplace != NULL); } libwebp-1.4.0/src/dsp/yuv.h0000644000014400001440000001643414606317060012434 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // inline YUV<->RGB conversion function // // The exact naming is Y'CbCr, following the ITU-R BT.601 standard. // More information at: https://en.wikipedia.org/wiki/YCbCr // Y = 0.2569 * R + 0.5044 * G + 0.0979 * B + 16 // U = -0.1483 * R - 0.2911 * G + 0.4394 * B + 128 // V = 0.4394 * R - 0.3679 * G - 0.0715 * B + 128 // We use 16bit fixed point operations for RGB->YUV conversion (YUV_FIX). // // For the Y'CbCr to RGB conversion, the BT.601 specification reads: // R = 1.164 * (Y-16) + 1.596 * (V-128) // G = 1.164 * (Y-16) - 0.813 * (V-128) - 0.391 * (U-128) // B = 1.164 * (Y-16) + 2.018 * (U-128) // where Y is in the [16,235] range, and U/V in the [16,240] range. // // The fixed-point implementation used here is: // R = (19077 . y + 26149 . v - 14234) >> 6 // G = (19077 . y - 6419 . u - 13320 . v + 8708) >> 6 // B = (19077 . y + 33050 . u - 17685) >> 6 // where the '.' operator is the mulhi_epu16 variant: // a . b = ((a << 8) * b) >> 16 // that preserves 8 bits of fractional precision before final descaling. // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DSP_YUV_H_ #define WEBP_DSP_YUV_H_ #include "src/dsp/dsp.h" #include "src/dec/vp8_dec.h" //------------------------------------------------------------------------------ // YUV -> RGB conversion #ifdef __cplusplus extern "C" { #endif enum { YUV_FIX = 16, // fixed-point precision for RGB->YUV YUV_HALF = 1 << (YUV_FIX - 1), YUV_FIX2 = 6, // fixed-point precision for YUV->RGB YUV_MASK2 = (256 << YUV_FIX2) - 1 }; //------------------------------------------------------------------------------ // slower on x86 by ~7-8%, but bit-exact with the SSE2/NEON version static WEBP_INLINE int MultHi(int v, int coeff) { // _mm_mulhi_epu16 emulation return (v * coeff) >> 8; } static WEBP_INLINE int VP8Clip8(int v) { return ((v & ~YUV_MASK2) == 0) ? (v >> YUV_FIX2) : (v < 0) ? 0 : 255; } static WEBP_INLINE int VP8YUVToR(int y, int v) { return VP8Clip8(MultHi(y, 19077) + MultHi(v, 26149) - 14234); } static WEBP_INLINE int VP8YUVToG(int y, int u, int v) { return VP8Clip8(MultHi(y, 19077) - MultHi(u, 6419) - MultHi(v, 13320) + 8708); } static WEBP_INLINE int VP8YUVToB(int y, int u) { return VP8Clip8(MultHi(y, 19077) + MultHi(u, 33050) - 17685); } static WEBP_INLINE void VP8YuvToRgb(int y, int u, int v, uint8_t* const rgb) { rgb[0] = VP8YUVToR(y, v); rgb[1] = VP8YUVToG(y, u, v); rgb[2] = VP8YUVToB(y, u); } static WEBP_INLINE void VP8YuvToBgr(int y, int u, int v, uint8_t* const bgr) { bgr[0] = VP8YUVToB(y, u); bgr[1] = VP8YUVToG(y, u, v); bgr[2] = VP8YUVToR(y, v); } static WEBP_INLINE void VP8YuvToRgb565(int y, int u, int v, uint8_t* const rgb) { const int r = VP8YUVToR(y, v); // 5 usable bits const int g = VP8YUVToG(y, u, v); // 6 usable bits const int b = VP8YUVToB(y, u); // 5 usable bits const int rg = (r & 0xf8) | (g >> 5); const int gb = ((g << 3) & 0xe0) | (b >> 3); #if (WEBP_SWAP_16BIT_CSP == 1) rgb[0] = gb; rgb[1] = rg; #else rgb[0] = rg; rgb[1] = gb; #endif } static WEBP_INLINE void VP8YuvToRgba4444(int y, int u, int v, uint8_t* const argb) { const int r = VP8YUVToR(y, v); // 4 usable bits const int g = VP8YUVToG(y, u, v); // 4 usable bits const int b = VP8YUVToB(y, u); // 4 usable bits const int rg = (r & 0xf0) | (g >> 4); const int ba = (b & 0xf0) | 0x0f; // overwrite the lower 4 bits #if (WEBP_SWAP_16BIT_CSP == 1) argb[0] = ba; argb[1] = rg; #else argb[0] = rg; argb[1] = ba; #endif } //----------------------------------------------------------------------------- // Alpha handling variants static WEBP_INLINE void VP8YuvToArgb(uint8_t y, uint8_t u, uint8_t v, uint8_t* const argb) { argb[0] = 0xff; VP8YuvToRgb(y, u, v, argb + 1); } static WEBP_INLINE void VP8YuvToBgra(uint8_t y, uint8_t u, uint8_t v, uint8_t* const bgra) { VP8YuvToBgr(y, u, v, bgra); bgra[3] = 0xff; } static WEBP_INLINE void VP8YuvToRgba(uint8_t y, uint8_t u, uint8_t v, uint8_t* const rgba) { VP8YuvToRgb(y, u, v, rgba); rgba[3] = 0xff; } //----------------------------------------------------------------------------- // SSE2 extra functions (mostly for upsampling_sse2.c) #if defined(WEBP_USE_SSE2) // Process 32 pixels and store the result (16b, 24b or 32b per pixel) in *dst. void VP8YuvToRgba32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToRgb32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToBgra32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToBgr32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToArgb32_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToRgba444432_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToRgb56532_SSE2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); #endif // WEBP_USE_SSE2 //----------------------------------------------------------------------------- // SSE41 extra functions (mostly for upsampling_sse41.c) #if defined(WEBP_USE_SSE41) // Process 32 pixels and store the result (16b, 24b or 32b per pixel) in *dst. void VP8YuvToRgb32_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); void VP8YuvToBgr32_SSE41(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* dst); #endif // WEBP_USE_SSE41 //------------------------------------------------------------------------------ // RGB -> YUV conversion // Stub functions that can be called with various rounding values: static WEBP_INLINE int VP8ClipUV(int uv, int rounding) { uv = (uv + rounding + (128 << (YUV_FIX + 2))) >> (YUV_FIX + 2); return ((uv & ~0xff) == 0) ? uv : (uv < 0) ? 0 : 255; } static WEBP_INLINE int VP8RGBToY(int r, int g, int b, int rounding) { const int luma = 16839 * r + 33059 * g + 6420 * b; return (luma + rounding + (16 << YUV_FIX)) >> YUV_FIX; // no need to clip } static WEBP_INLINE int VP8RGBToU(int r, int g, int b, int rounding) { const int u = -9719 * r - 19081 * g + 28800 * b; return VP8ClipUV(u, rounding); } static WEBP_INLINE int VP8RGBToV(int r, int g, int b, int rounding) { const int v = +28800 * r - 24116 * g - 4684 * b; return VP8ClipUV(v, rounding); } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DSP_YUV_H_ libwebp-1.4.0/src/dsp/alpha_processing_mips_dsp_r2.c0000644000014400001440000002401114606317060017414 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for processing transparent channel. // // Author(s): Branimir Vasic (branimir.vasic@imgtec.com) // Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) static int DispatchAlpha_MIPSdspR2(const uint8_t* alpha, int alpha_stride, int width, int height, uint8_t* dst, int dst_stride) { uint32_t alpha_mask = 0xffffffff; int i, j, temp0; for (j = 0; j < height; ++j) { uint8_t* pdst = dst; const uint8_t* palpha = alpha; for (i = 0; i < (width >> 2); ++i) { int temp1, temp2, temp3; __asm__ volatile ( "ulw %[temp0], 0(%[palpha]) \n\t" "addiu %[palpha], %[palpha], 4 \n\t" "addiu %[pdst], %[pdst], 16 \n\t" "srl %[temp1], %[temp0], 8 \n\t" "srl %[temp2], %[temp0], 16 \n\t" "srl %[temp3], %[temp0], 24 \n\t" "and %[alpha_mask], %[alpha_mask], %[temp0] \n\t" "sb %[temp0], -16(%[pdst]) \n\t" "sb %[temp1], -12(%[pdst]) \n\t" "sb %[temp2], -8(%[pdst]) \n\t" "sb %[temp3], -4(%[pdst]) \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [palpha]"+r"(palpha), [pdst]"+r"(pdst), [alpha_mask]"+r"(alpha_mask) : : "memory" ); } for (i = 0; i < (width & 3); ++i) { __asm__ volatile ( "lbu %[temp0], 0(%[palpha]) \n\t" "addiu %[palpha], %[palpha], 1 \n\t" "sb %[temp0], 0(%[pdst]) \n\t" "and %[alpha_mask], %[alpha_mask], %[temp0] \n\t" "addiu %[pdst], %[pdst], 4 \n\t" : [temp0]"=&r"(temp0), [palpha]"+r"(palpha), [pdst]"+r"(pdst), [alpha_mask]"+r"(alpha_mask) : : "memory" ); } alpha += alpha_stride; dst += dst_stride; } __asm__ volatile ( "ext %[temp0], %[alpha_mask], 0, 16 \n\t" "srl %[alpha_mask], %[alpha_mask], 16 \n\t" "and %[alpha_mask], %[alpha_mask], %[temp0] \n\t" "ext %[temp0], %[alpha_mask], 0, 8 \n\t" "srl %[alpha_mask], %[alpha_mask], 8 \n\t" "and %[alpha_mask], %[alpha_mask], %[temp0] \n\t" : [temp0]"=&r"(temp0), [alpha_mask]"+r"(alpha_mask) : ); return (alpha_mask != 0xff); } static void MultARGBRow_MIPSdspR2(uint32_t* const ptr, int width, int inverse) { int x; const uint32_t c_00ffffff = 0x00ffffffu; const uint32_t c_ff000000 = 0xff000000u; const uint32_t c_8000000 = 0x00800000u; const uint32_t c_8000080 = 0x00800080u; for (x = 0; x < width; ++x) { const uint32_t argb = ptr[x]; if (argb < 0xff000000u) { // alpha < 255 if (argb <= 0x00ffffffu) { // alpha == 0 ptr[x] = 0; } else { int temp0, temp1, temp2, temp3, alpha; __asm__ volatile ( "srl %[alpha], %[argb], 24 \n\t" "replv.qb %[temp0], %[alpha] \n\t" "and %[temp0], %[temp0], %[c_00ffffff] \n\t" "beqz %[inverse], 0f \n\t" "divu $zero, %[c_ff000000], %[alpha] \n\t" "mflo %[temp0] \n\t" "0: \n\t" "andi %[temp1], %[argb], 0xff \n\t" "ext %[temp2], %[argb], 8, 8 \n\t" "ext %[temp3], %[argb], 16, 8 \n\t" "mul %[temp1], %[temp1], %[temp0] \n\t" "mul %[temp2], %[temp2], %[temp0] \n\t" "mul %[temp3], %[temp3], %[temp0] \n\t" "precrq.ph.w %[temp1], %[temp2], %[temp1] \n\t" "addu %[temp3], %[temp3], %[c_8000000] \n\t" "addu %[temp1], %[temp1], %[c_8000080] \n\t" "precrq.ph.w %[temp3], %[argb], %[temp3] \n\t" "precrq.qb.ph %[temp1], %[temp3], %[temp1] \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [alpha]"=&r"(alpha) : [inverse]"r"(inverse), [c_00ffffff]"r"(c_00ffffff), [c_8000000]"r"(c_8000000), [c_8000080]"r"(c_8000080), [c_ff000000]"r"(c_ff000000), [argb]"r"(argb) : "memory", "hi", "lo" ); ptr[x] = temp1; } } } } #ifdef WORDS_BIGENDIAN static void PackARGB_MIPSdspR2(const uint8_t* a, const uint8_t* r, const uint8_t* g, const uint8_t* b, int len, uint32_t* out) { int temp0, temp1, temp2, temp3, offset; const int rest = len & 1; const uint32_t* const loop_end = out + len - rest; const int step = 4; __asm__ volatile ( "xor %[offset], %[offset], %[offset] \n\t" "beq %[loop_end], %[out], 0f \n\t" "2: \n\t" "lbux %[temp0], %[offset](%[a]) \n\t" "lbux %[temp1], %[offset](%[r]) \n\t" "lbux %[temp2], %[offset](%[g]) \n\t" "lbux %[temp3], %[offset](%[b]) \n\t" "ins %[temp1], %[temp0], 16, 16 \n\t" "ins %[temp3], %[temp2], 16, 16 \n\t" "addiu %[out], %[out], 4 \n\t" "precr.qb.ph %[temp0], %[temp1], %[temp3] \n\t" "sw %[temp0], -4(%[out]) \n\t" "addu %[offset], %[offset], %[step] \n\t" "bne %[loop_end], %[out], 2b \n\t" "0: \n\t" "beq %[rest], $zero, 1f \n\t" "lbux %[temp0], %[offset](%[a]) \n\t" "lbux %[temp1], %[offset](%[r]) \n\t" "lbux %[temp2], %[offset](%[g]) \n\t" "lbux %[temp3], %[offset](%[b]) \n\t" "ins %[temp1], %[temp0], 16, 16 \n\t" "ins %[temp3], %[temp2], 16, 16 \n\t" "precr.qb.ph %[temp0], %[temp1], %[temp3] \n\t" "sw %[temp0], 0(%[out]) \n\t" "1: \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [offset]"=&r"(offset), [out]"+&r"(out) : [a]"r"(a), [r]"r"(r), [g]"r"(g), [b]"r"(b), [step]"r"(step), [loop_end]"r"(loop_end), [rest]"r"(rest) : "memory" ); } #endif // WORDS_BIGENDIAN static void PackRGB_MIPSdspR2(const uint8_t* r, const uint8_t* g, const uint8_t* b, int len, int step, uint32_t* out) { int temp0, temp1, temp2, offset; const int rest = len & 1; const int a = 0xff; const uint32_t* const loop_end = out + len - rest; __asm__ volatile ( "xor %[offset], %[offset], %[offset] \n\t" "beq %[loop_end], %[out], 0f \n\t" "2: \n\t" "lbux %[temp0], %[offset](%[r]) \n\t" "lbux %[temp1], %[offset](%[g]) \n\t" "lbux %[temp2], %[offset](%[b]) \n\t" "ins %[temp0], %[a], 16, 16 \n\t" "ins %[temp2], %[temp1], 16, 16 \n\t" "addiu %[out], %[out], 4 \n\t" "precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t" "sw %[temp0], -4(%[out]) \n\t" "addu %[offset], %[offset], %[step] \n\t" "bne %[loop_end], %[out], 2b \n\t" "0: \n\t" "beq %[rest], $zero, 1f \n\t" "lbux %[temp0], %[offset](%[r]) \n\t" "lbux %[temp1], %[offset](%[g]) \n\t" "lbux %[temp2], %[offset](%[b]) \n\t" "ins %[temp0], %[a], 16, 16 \n\t" "ins %[temp2], %[temp1], 16, 16 \n\t" "precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t" "sw %[temp0], 0(%[out]) \n\t" "1: \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [offset]"=&r"(offset), [out]"+&r"(out) : [a]"r"(a), [r]"r"(r), [g]"r"(g), [b]"r"(b), [step]"r"(step), [loop_end]"r"(loop_end), [rest]"r"(rest) : "memory" ); } //------------------------------------------------------------------------------ // Entry point extern void WebPInitAlphaProcessingMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingMIPSdspR2(void) { WebPDispatchAlpha = DispatchAlpha_MIPSdspR2; WebPMultARGBRow = MultARGBRow_MIPSdspR2; #ifdef WORDS_BIGENDIAN WebPPackARGB = PackARGB_MIPSdspR2; #endif WebPPackRGB = PackRGB_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(WebPInitAlphaProcessingMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/enc_sse41.c0000644000014400001440000003155214606317060013366 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE4 version of some encoding functions. // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE41) #include #include // for abs() #include "src/dsp/common_sse2.h" #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Compute susceptibility based on DCT-coeff histograms. static void CollectHistogram_SSE41(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { const __m128i max_coeff_thresh = _mm_set1_epi16(MAX_COEFF_THRESH); int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; for (j = start_block; j < end_block; ++j) { int16_t out[16]; int k; VP8FTransform(ref + VP8DspScan[j], pred + VP8DspScan[j], out); // Convert coefficients to bin (within out[]). { // Load. const __m128i out0 = _mm_loadu_si128((__m128i*)&out[0]); const __m128i out1 = _mm_loadu_si128((__m128i*)&out[8]); // v = abs(out) >> 3 const __m128i abs0 = _mm_abs_epi16(out0); const __m128i abs1 = _mm_abs_epi16(out1); const __m128i v0 = _mm_srai_epi16(abs0, 3); const __m128i v1 = _mm_srai_epi16(abs1, 3); // bin = min(v, MAX_COEFF_THRESH) const __m128i bin0 = _mm_min_epi16(v0, max_coeff_thresh); const __m128i bin1 = _mm_min_epi16(v1, max_coeff_thresh); // Store. _mm_storeu_si128((__m128i*)&out[0], bin0); _mm_storeu_si128((__m128i*)&out[8], bin1); } // Convert coefficients to bin. for (k = 0; k < 16; ++k) { ++distribution[out[k]]; } } VP8SetHistogramData(distribution, histo); } //------------------------------------------------------------------------------ // Texture distortion // // We try to match the spectral content (weighted) between source and // reconstructed samples. // Hadamard transform // Returns the weighted sum of the absolute value of transformed coefficients. // w[] contains a row-major 4 by 4 symmetric matrix. static int TTransform_SSE41(const uint8_t* inA, const uint8_t* inB, const uint16_t* const w) { int32_t sum[4]; __m128i tmp_0, tmp_1, tmp_2, tmp_3; // Load and combine inputs. { const __m128i inA_0 = _mm_loadu_si128((const __m128i*)&inA[BPS * 0]); const __m128i inA_1 = _mm_loadu_si128((const __m128i*)&inA[BPS * 1]); const __m128i inA_2 = _mm_loadu_si128((const __m128i*)&inA[BPS * 2]); // In SSE4.1, with gcc 4.8 at least (maybe other versions), // _mm_loadu_si128 is faster than _mm_loadl_epi64. But for the last lump // of inA and inB, _mm_loadl_epi64 is still used not to have an out of // bound read. const __m128i inA_3 = _mm_loadl_epi64((const __m128i*)&inA[BPS * 3]); const __m128i inB_0 = _mm_loadu_si128((const __m128i*)&inB[BPS * 0]); const __m128i inB_1 = _mm_loadu_si128((const __m128i*)&inB[BPS * 1]); const __m128i inB_2 = _mm_loadu_si128((const __m128i*)&inB[BPS * 2]); const __m128i inB_3 = _mm_loadl_epi64((const __m128i*)&inB[BPS * 3]); // Combine inA and inB (we'll do two transforms in parallel). const __m128i inAB_0 = _mm_unpacklo_epi32(inA_0, inB_0); const __m128i inAB_1 = _mm_unpacklo_epi32(inA_1, inB_1); const __m128i inAB_2 = _mm_unpacklo_epi32(inA_2, inB_2); const __m128i inAB_3 = _mm_unpacklo_epi32(inA_3, inB_3); tmp_0 = _mm_cvtepu8_epi16(inAB_0); tmp_1 = _mm_cvtepu8_epi16(inAB_1); tmp_2 = _mm_cvtepu8_epi16(inAB_2); tmp_3 = _mm_cvtepu8_epi16(inAB_3); // a00 a01 a02 a03 b00 b01 b02 b03 // a10 a11 a12 a13 b10 b11 b12 b13 // a20 a21 a22 a23 b20 b21 b22 b23 // a30 a31 a32 a33 b30 b31 b32 b33 } // Vertical pass first to avoid a transpose (vertical and horizontal passes // are commutative because w/kWeightY is symmetric) and subsequent transpose. { // Calculate a and b (two 4x4 at once). const __m128i a0 = _mm_add_epi16(tmp_0, tmp_2); const __m128i a1 = _mm_add_epi16(tmp_1, tmp_3); const __m128i a2 = _mm_sub_epi16(tmp_1, tmp_3); const __m128i a3 = _mm_sub_epi16(tmp_0, tmp_2); const __m128i b0 = _mm_add_epi16(a0, a1); const __m128i b1 = _mm_add_epi16(a3, a2); const __m128i b2 = _mm_sub_epi16(a3, a2); const __m128i b3 = _mm_sub_epi16(a0, a1); // a00 a01 a02 a03 b00 b01 b02 b03 // a10 a11 a12 a13 b10 b11 b12 b13 // a20 a21 a22 a23 b20 b21 b22 b23 // a30 a31 a32 a33 b30 b31 b32 b33 // Transpose the two 4x4. VP8Transpose_2_4x4_16b(&b0, &b1, &b2, &b3, &tmp_0, &tmp_1, &tmp_2, &tmp_3); } // Horizontal pass and difference of weighted sums. { // Load all inputs. const __m128i w_0 = _mm_loadu_si128((const __m128i*)&w[0]); const __m128i w_8 = _mm_loadu_si128((const __m128i*)&w[8]); // Calculate a and b (two 4x4 at once). const __m128i a0 = _mm_add_epi16(tmp_0, tmp_2); const __m128i a1 = _mm_add_epi16(tmp_1, tmp_3); const __m128i a2 = _mm_sub_epi16(tmp_1, tmp_3); const __m128i a3 = _mm_sub_epi16(tmp_0, tmp_2); const __m128i b0 = _mm_add_epi16(a0, a1); const __m128i b1 = _mm_add_epi16(a3, a2); const __m128i b2 = _mm_sub_epi16(a3, a2); const __m128i b3 = _mm_sub_epi16(a0, a1); // Separate the transforms of inA and inB. __m128i A_b0 = _mm_unpacklo_epi64(b0, b1); __m128i A_b2 = _mm_unpacklo_epi64(b2, b3); __m128i B_b0 = _mm_unpackhi_epi64(b0, b1); __m128i B_b2 = _mm_unpackhi_epi64(b2, b3); A_b0 = _mm_abs_epi16(A_b0); A_b2 = _mm_abs_epi16(A_b2); B_b0 = _mm_abs_epi16(B_b0); B_b2 = _mm_abs_epi16(B_b2); // weighted sums A_b0 = _mm_madd_epi16(A_b0, w_0); A_b2 = _mm_madd_epi16(A_b2, w_8); B_b0 = _mm_madd_epi16(B_b0, w_0); B_b2 = _mm_madd_epi16(B_b2, w_8); A_b0 = _mm_add_epi32(A_b0, A_b2); B_b0 = _mm_add_epi32(B_b0, B_b2); // difference of weighted sums A_b2 = _mm_sub_epi32(A_b0, B_b0); _mm_storeu_si128((__m128i*)&sum[0], A_b2); } return sum[0] + sum[1] + sum[2] + sum[3]; } static int Disto4x4_SSE41(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { const int diff_sum = TTransform_SSE41(a, b, w); return abs(diff_sum) >> 5; } static int Disto16x16_SSE41(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_SSE41(a + x + y, b + x + y, w); } } return D; } //------------------------------------------------------------------------------ // Quantization // // Generates a pshufb constant for shuffling 16b words. #define PSHUFB_CST(A,B,C,D,E,F,G,H) \ _mm_set_epi8(2 * (H) + 1, 2 * (H) + 0, 2 * (G) + 1, 2 * (G) + 0, \ 2 * (F) + 1, 2 * (F) + 0, 2 * (E) + 1, 2 * (E) + 0, \ 2 * (D) + 1, 2 * (D) + 0, 2 * (C) + 1, 2 * (C) + 0, \ 2 * (B) + 1, 2 * (B) + 0, 2 * (A) + 1, 2 * (A) + 0) static WEBP_INLINE int DoQuantizeBlock_SSE41(int16_t in[16], int16_t out[16], const uint16_t* const sharpen, const VP8Matrix* const mtx) { const __m128i max_coeff_2047 = _mm_set1_epi16(MAX_LEVEL); const __m128i zero = _mm_setzero_si128(); __m128i out0, out8; __m128i packed_out; // Load all inputs. __m128i in0 = _mm_loadu_si128((__m128i*)&in[0]); __m128i in8 = _mm_loadu_si128((__m128i*)&in[8]); const __m128i iq0 = _mm_loadu_si128((const __m128i*)&mtx->iq_[0]); const __m128i iq8 = _mm_loadu_si128((const __m128i*)&mtx->iq_[8]); const __m128i q0 = _mm_loadu_si128((const __m128i*)&mtx->q_[0]); const __m128i q8 = _mm_loadu_si128((const __m128i*)&mtx->q_[8]); // coeff = abs(in) __m128i coeff0 = _mm_abs_epi16(in0); __m128i coeff8 = _mm_abs_epi16(in8); // coeff = abs(in) + sharpen if (sharpen != NULL) { const __m128i sharpen0 = _mm_loadu_si128((const __m128i*)&sharpen[0]); const __m128i sharpen8 = _mm_loadu_si128((const __m128i*)&sharpen[8]); coeff0 = _mm_add_epi16(coeff0, sharpen0); coeff8 = _mm_add_epi16(coeff8, sharpen8); } // out = (coeff * iQ + B) >> QFIX { // doing calculations with 32b precision (QFIX=17) // out = (coeff * iQ) const __m128i coeff_iQ0H = _mm_mulhi_epu16(coeff0, iq0); const __m128i coeff_iQ0L = _mm_mullo_epi16(coeff0, iq0); const __m128i coeff_iQ8H = _mm_mulhi_epu16(coeff8, iq8); const __m128i coeff_iQ8L = _mm_mullo_epi16(coeff8, iq8); __m128i out_00 = _mm_unpacklo_epi16(coeff_iQ0L, coeff_iQ0H); __m128i out_04 = _mm_unpackhi_epi16(coeff_iQ0L, coeff_iQ0H); __m128i out_08 = _mm_unpacklo_epi16(coeff_iQ8L, coeff_iQ8H); __m128i out_12 = _mm_unpackhi_epi16(coeff_iQ8L, coeff_iQ8H); // out = (coeff * iQ + B) const __m128i bias_00 = _mm_loadu_si128((const __m128i*)&mtx->bias_[0]); const __m128i bias_04 = _mm_loadu_si128((const __m128i*)&mtx->bias_[4]); const __m128i bias_08 = _mm_loadu_si128((const __m128i*)&mtx->bias_[8]); const __m128i bias_12 = _mm_loadu_si128((const __m128i*)&mtx->bias_[12]); out_00 = _mm_add_epi32(out_00, bias_00); out_04 = _mm_add_epi32(out_04, bias_04); out_08 = _mm_add_epi32(out_08, bias_08); out_12 = _mm_add_epi32(out_12, bias_12); // out = QUANTDIV(coeff, iQ, B, QFIX) out_00 = _mm_srai_epi32(out_00, QFIX); out_04 = _mm_srai_epi32(out_04, QFIX); out_08 = _mm_srai_epi32(out_08, QFIX); out_12 = _mm_srai_epi32(out_12, QFIX); // pack result as 16b out0 = _mm_packs_epi32(out_00, out_04); out8 = _mm_packs_epi32(out_08, out_12); // if (coeff > 2047) coeff = 2047 out0 = _mm_min_epi16(out0, max_coeff_2047); out8 = _mm_min_epi16(out8, max_coeff_2047); } // put sign back out0 = _mm_sign_epi16(out0, in0); out8 = _mm_sign_epi16(out8, in8); // in = out * Q in0 = _mm_mullo_epi16(out0, q0); in8 = _mm_mullo_epi16(out8, q8); _mm_storeu_si128((__m128i*)&in[0], in0); _mm_storeu_si128((__m128i*)&in[8], in8); // zigzag the output before storing it. The re-ordering is: // 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 // -> 0 1 4[8]5 2 3 6 | 9 12 13 10 [7]11 14 15 // There's only two misplaced entries ([8] and [7]) that are crossing the // reg's boundaries. // We use pshufb instead of pshuflo/pshufhi. { const __m128i kCst_lo = PSHUFB_CST(0, 1, 4, -1, 5, 2, 3, 6); const __m128i kCst_7 = PSHUFB_CST(-1, -1, -1, -1, 7, -1, -1, -1); const __m128i tmp_lo = _mm_shuffle_epi8(out0, kCst_lo); const __m128i tmp_7 = _mm_shuffle_epi8(out0, kCst_7); // extract #7 const __m128i kCst_hi = PSHUFB_CST(1, 4, 5, 2, -1, 3, 6, 7); const __m128i kCst_8 = PSHUFB_CST(-1, -1, -1, 0, -1, -1, -1, -1); const __m128i tmp_hi = _mm_shuffle_epi8(out8, kCst_hi); const __m128i tmp_8 = _mm_shuffle_epi8(out8, kCst_8); // extract #8 const __m128i out_z0 = _mm_or_si128(tmp_lo, tmp_8); const __m128i out_z8 = _mm_or_si128(tmp_hi, tmp_7); _mm_storeu_si128((__m128i*)&out[0], out_z0); _mm_storeu_si128((__m128i*)&out[8], out_z8); packed_out = _mm_packs_epi16(out_z0, out_z8); } // detect if all 'out' values are zeroes or not return (_mm_movemask_epi8(_mm_cmpeq_epi8(packed_out, zero)) != 0xffff); } #undef PSHUFB_CST static int QuantizeBlock_SSE41(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { return DoQuantizeBlock_SSE41(in, out, &mtx->sharpen_[0], mtx); } static int QuantizeBlockWHT_SSE41(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { return DoQuantizeBlock_SSE41(in, out, NULL, mtx); } static int Quantize2Blocks_SSE41(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; const uint16_t* const sharpen = &mtx->sharpen_[0]; nz = DoQuantizeBlock_SSE41(in + 0 * 16, out + 0 * 16, sharpen, mtx) << 0; nz |= DoQuantizeBlock_SSE41(in + 1 * 16, out + 1 * 16, sharpen, mtx) << 1; return nz; } //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitSSE41(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitSSE41(void) { VP8CollectHistogram = CollectHistogram_SSE41; VP8EncQuantizeBlock = QuantizeBlock_SSE41; VP8EncQuantize2Blocks = Quantize2Blocks_SSE41; VP8EncQuantizeBlockWHT = QuantizeBlockWHT_SSE41; VP8TDisto4x4 = Disto4x4_SSE41; VP8TDisto16x16 = Disto16x16_SSE41; } #else // !WEBP_USE_SSE41 WEBP_DSP_INIT_STUB(VP8EncDspInitSSE41) #endif // WEBP_USE_SSE41 libwebp-1.4.0/src/dsp/yuv_mips32.c0000644000014400001440000001343614606317060013623 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS version of YUV to RGB upsampling functions. // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS32) #include "src/dsp/yuv.h" //------------------------------------------------------------------------------ // simple point-sampling #define ROW_FUNC(FUNC_NAME, XSTEP, R, G, B, A) \ static void FUNC_NAME(const uint8_t* y, \ const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i, r, g, b; \ int temp0, temp1, temp2, temp3, temp4; \ for (i = 0; i < (len >> 1); i++) { \ temp1 = MultHi(v[0], 26149); \ temp3 = MultHi(v[0], 13320); \ temp2 = MultHi(u[0], 6419); \ temp4 = MultHi(u[0], 33050); \ temp0 = MultHi(y[0], 19077); \ temp1 -= 14234; \ temp3 -= 8708; \ temp2 += temp3; \ temp4 -= 17685; \ r = VP8Clip8(temp0 + temp1); \ g = VP8Clip8(temp0 - temp2); \ b = VP8Clip8(temp0 + temp4); \ temp0 = MultHi(y[1], 19077); \ dst[R] = r; \ dst[G] = g; \ dst[B] = b; \ if (A) dst[A] = 0xff; \ r = VP8Clip8(temp0 + temp1); \ g = VP8Clip8(temp0 - temp2); \ b = VP8Clip8(temp0 + temp4); \ dst[R + XSTEP] = r; \ dst[G + XSTEP] = g; \ dst[B + XSTEP] = b; \ if (A) dst[A + XSTEP] = 0xff; \ y += 2; \ ++u; \ ++v; \ dst += 2 * XSTEP; \ } \ if (len & 1) { \ temp1 = MultHi(v[0], 26149); \ temp3 = MultHi(v[0], 13320); \ temp2 = MultHi(u[0], 6419); \ temp4 = MultHi(u[0], 33050); \ temp0 = MultHi(y[0], 19077); \ temp1 -= 14234; \ temp3 -= 8708; \ temp2 += temp3; \ temp4 -= 17685; \ r = VP8Clip8(temp0 + temp1); \ g = VP8Clip8(temp0 - temp2); \ b = VP8Clip8(temp0 + temp4); \ dst[R] = r; \ dst[G] = g; \ dst[B] = b; \ if (A) dst[A] = 0xff; \ } \ } ROW_FUNC(YuvToRgbRow_MIPS32, 3, 0, 1, 2, 0) ROW_FUNC(YuvToRgbaRow_MIPS32, 4, 0, 1, 2, 3) ROW_FUNC(YuvToBgrRow_MIPS32, 3, 2, 1, 0, 0) ROW_FUNC(YuvToBgraRow_MIPS32, 4, 2, 1, 0, 3) #undef ROW_FUNC //------------------------------------------------------------------------------ // Entry point extern void WebPInitSamplersMIPS32(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersMIPS32(void) { WebPSamplers[MODE_RGB] = YuvToRgbRow_MIPS32; WebPSamplers[MODE_RGBA] = YuvToRgbaRow_MIPS32; WebPSamplers[MODE_BGR] = YuvToBgrRow_MIPS32; WebPSamplers[MODE_BGRA] = YuvToBgraRow_MIPS32; } #else // !WEBP_USE_MIPS32 WEBP_DSP_INIT_STUB(WebPInitSamplersMIPS32) #endif // WEBP_USE_MIPS32 libwebp-1.4.0/src/dsp/lossless_mips_dsp_r2.c0000644000014400001440000011442014606317060015746 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transforms and color space conversion methods for lossless decoder. // // Author(s): Djordje Pesut (djordje.pesut@imgtec.com) // Jovan Zelincevic (jovan.zelincevic@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #define MAP_COLOR_FUNCS(FUNC_NAME, TYPE, GET_INDEX, GET_VALUE) \ static void FUNC_NAME(const TYPE* src, \ const uint32_t* const color_map, \ TYPE* dst, int y_start, int y_end, \ int width) { \ int y; \ for (y = y_start; y < y_end; ++y) { \ int x; \ for (x = 0; x < (width >> 2); ++x) { \ int tmp1, tmp2, tmp3, tmp4; \ __asm__ volatile ( \ ".ifc " #TYPE ", uint8_t \n\t" \ "lbu %[tmp1], 0(%[src]) \n\t" \ "lbu %[tmp2], 1(%[src]) \n\t" \ "lbu %[tmp3], 2(%[src]) \n\t" \ "lbu %[tmp4], 3(%[src]) \n\t" \ "addiu %[src], %[src], 4 \n\t" \ ".endif \n\t" \ ".ifc " #TYPE ", uint32_t \n\t" \ "lw %[tmp1], 0(%[src]) \n\t" \ "lw %[tmp2], 4(%[src]) \n\t" \ "lw %[tmp3], 8(%[src]) \n\t" \ "lw %[tmp4], 12(%[src]) \n\t" \ "ext %[tmp1], %[tmp1], 8, 8 \n\t" \ "ext %[tmp2], %[tmp2], 8, 8 \n\t" \ "ext %[tmp3], %[tmp3], 8, 8 \n\t" \ "ext %[tmp4], %[tmp4], 8, 8 \n\t" \ "addiu %[src], %[src], 16 \n\t" \ ".endif \n\t" \ "sll %[tmp1], %[tmp1], 2 \n\t" \ "sll %[tmp2], %[tmp2], 2 \n\t" \ "sll %[tmp3], %[tmp3], 2 \n\t" \ "sll %[tmp4], %[tmp4], 2 \n\t" \ "lwx %[tmp1], %[tmp1](%[color_map]) \n\t" \ "lwx %[tmp2], %[tmp2](%[color_map]) \n\t" \ "lwx %[tmp3], %[tmp3](%[color_map]) \n\t" \ "lwx %[tmp4], %[tmp4](%[color_map]) \n\t" \ ".ifc " #TYPE ", uint8_t \n\t" \ "ext %[tmp1], %[tmp1], 8, 8 \n\t" \ "ext %[tmp2], %[tmp2], 8, 8 \n\t" \ "ext %[tmp3], %[tmp3], 8, 8 \n\t" \ "ext %[tmp4], %[tmp4], 8, 8 \n\t" \ "sb %[tmp1], 0(%[dst]) \n\t" \ "sb %[tmp2], 1(%[dst]) \n\t" \ "sb %[tmp3], 2(%[dst]) \n\t" \ "sb %[tmp4], 3(%[dst]) \n\t" \ "addiu %[dst], %[dst], 4 \n\t" \ ".endif \n\t" \ ".ifc " #TYPE ", uint32_t \n\t" \ "sw %[tmp1], 0(%[dst]) \n\t" \ "sw %[tmp2], 4(%[dst]) \n\t" \ "sw %[tmp3], 8(%[dst]) \n\t" \ "sw %[tmp4], 12(%[dst]) \n\t" \ "addiu %[dst], %[dst], 16 \n\t" \ ".endif \n\t" \ : [tmp1]"=&r"(tmp1), [tmp2]"=&r"(tmp2), [tmp3]"=&r"(tmp3), \ [tmp4]"=&r"(tmp4), [src]"+&r"(src), [dst]"+r"(dst) \ : [color_map]"r"(color_map) \ : "memory" \ ); \ } \ for (x = 0; x < (width & 3); ++x) { \ *dst++ = GET_VALUE(color_map[GET_INDEX(*src++)]); \ } \ } \ } MAP_COLOR_FUNCS(MapARGB_MIPSdspR2, uint32_t, VP8GetARGBIndex, VP8GetARGBValue) MAP_COLOR_FUNCS(MapAlpha_MIPSdspR2, uint8_t, VP8GetAlphaIndex, VP8GetAlphaValue) #undef MAP_COLOR_FUNCS static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1, uint32_t c2) { int temp0, temp1, temp2, temp3, temp4, temp5; __asm__ volatile ( "preceu.ph.qbr %[temp1], %[c0] \n\t" "preceu.ph.qbl %[temp2], %[c0] \n\t" "preceu.ph.qbr %[temp3], %[c1] \n\t" "preceu.ph.qbl %[temp4], %[c1] \n\t" "preceu.ph.qbr %[temp5], %[c2] \n\t" "preceu.ph.qbl %[temp0], %[c2] \n\t" "subq.ph %[temp3], %[temp3], %[temp5] \n\t" "subq.ph %[temp4], %[temp4], %[temp0] \n\t" "addq.ph %[temp1], %[temp1], %[temp3] \n\t" "addq.ph %[temp2], %[temp2], %[temp4] \n\t" "shll_s.ph %[temp1], %[temp1], 7 \n\t" "shll_s.ph %[temp2], %[temp2], 7 \n\t" "precrqu_s.qb.ph %[temp2], %[temp2], %[temp1] \n\t" : [temp0]"=r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5) : [c0]"r"(c0), [c1]"r"(c1), [c2]"r"(c2) : "memory" ); return temp2; } static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1, uint32_t c2) { int temp0, temp1, temp2, temp3, temp4, temp5; __asm__ volatile ( "adduh.qb %[temp5], %[c0], %[c1] \n\t" "preceu.ph.qbr %[temp3], %[c2] \n\t" "preceu.ph.qbr %[temp1], %[temp5] \n\t" "preceu.ph.qbl %[temp2], %[temp5] \n\t" "preceu.ph.qbl %[temp4], %[c2] \n\t" "subq.ph %[temp3], %[temp1], %[temp3] \n\t" "subq.ph %[temp4], %[temp2], %[temp4] \n\t" "shrl.ph %[temp5], %[temp3], 15 \n\t" "shrl.ph %[temp0], %[temp4], 15 \n\t" "addq.ph %[temp3], %[temp3], %[temp5] \n\t" "addq.ph %[temp4], %[temp0], %[temp4] \n\t" "shra.ph %[temp3], %[temp3], 1 \n\t" "shra.ph %[temp4], %[temp4], 1 \n\t" "addq.ph %[temp1], %[temp1], %[temp3] \n\t" "addq.ph %[temp2], %[temp2], %[temp4] \n\t" "shll_s.ph %[temp1], %[temp1], 7 \n\t" "shll_s.ph %[temp2], %[temp2], 7 \n\t" "precrqu_s.qb.ph %[temp1], %[temp2], %[temp1] \n\t" : [temp0]"=r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=r"(temp4), [temp5]"=&r"(temp5) : [c0]"r"(c0), [c1]"r"(c1), [c2]"r"(c2) : "memory" ); return temp1; } static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) { int temp0, temp1, temp2, temp3, temp4, temp5; __asm__ volatile ( "cmpgdu.lt.qb %[temp1], %[c], %[b] \n\t" "pick.qb %[temp1], %[b], %[c] \n\t" "pick.qb %[temp2], %[c], %[b] \n\t" "cmpgdu.lt.qb %[temp4], %[c], %[a] \n\t" "pick.qb %[temp4], %[a], %[c] \n\t" "pick.qb %[temp5], %[c], %[a] \n\t" "subu.qb %[temp3], %[temp1], %[temp2] \n\t" "subu.qb %[temp0], %[temp4], %[temp5] \n\t" "raddu.w.qb %[temp3], %[temp3] \n\t" "raddu.w.qb %[temp0], %[temp0] \n\t" "subu %[temp3], %[temp3], %[temp0] \n\t" "slti %[temp0], %[temp3], 0x1 \n\t" "movz %[a], %[b], %[temp0] \n\t" : [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp0]"=&r"(temp0), [a]"+&r"(a) : [b]"r"(b), [c]"r"(c) ); return a; } static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) { __asm__ volatile ( "adduh.qb %[a0], %[a0], %[a1] \n\t" : [a0]"+r"(a0) : [a1]"r"(a1) ); return a0; } static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) { return Average2(Average2(a0, a2), a1); } static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3) { return Average2(Average2(a0, a1), Average2(a2, a3)); } static uint32_t Predictor5_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return Average3(*left, top[0], top[1]); } static uint32_t Predictor6_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return Average2(*left, top[-1]); } static uint32_t Predictor7_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return Average2(*left, top[0]); } static uint32_t Predictor8_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { (void)left; return Average2(top[-1], top[0]); } static uint32_t Predictor9_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { (void)left; return Average2(top[0], top[1]); } static uint32_t Predictor10_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return Average4(*left, top[-1], top[0], top[1]); } static uint32_t Predictor11_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return Select(top[0], *left, top[-1]); } static uint32_t Predictor12_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return ClampedAddSubtractFull(*left, top[0], top[-1]); } static uint32_t Predictor13_MIPSdspR2(const uint32_t* const left, const uint32_t* const top) { return ClampedAddSubtractHalf(*left, top[0], top[-1]); } // Add green to blue and red channels (i.e. perform the inverse transform of // 'subtract green'). static void AddGreenToBlueAndRed_MIPSdspR2(const uint32_t* src, int num_pixels, uint32_t* dst) { uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp3], 12(%[src]) \n\t" "ext %[temp4], %[temp0], 8, 8 \n\t" "ext %[temp5], %[temp1], 8, 8 \n\t" "ext %[temp6], %[temp2], 8, 8 \n\t" "ext %[temp7], %[temp3], 8, 8 \n\t" "addiu %[src], %[src], 16 \n\t" "addiu %[dst], %[dst], 16 \n\t" "replv.ph %[temp4], %[temp4] \n\t" "replv.ph %[temp5], %[temp5] \n\t" "replv.ph %[temp6], %[temp6] \n\t" "replv.ph %[temp7], %[temp7] \n\t" "addu.qb %[temp0], %[temp0], %[temp4] \n\t" "addu.qb %[temp1], %[temp1], %[temp5] \n\t" "addu.qb %[temp2], %[temp2], %[temp6] \n\t" "addu.qb %[temp3], %[temp3], %[temp7] \n\t" "sw %[temp0], -16(%[dst]) \n\t" "sw %[temp1], -12(%[dst]) \n\t" "sw %[temp2], -8(%[dst]) \n\t" "bne %[src], %[p_loop1_end], 0b \n\t" " sw %[temp3], -4(%[dst]) \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "addiu %[src], %[src], 4 \n\t" "addiu %[dst], %[dst], 4 \n\t" "ext %[temp4], %[temp0], 8, 8 \n\t" "replv.ph %[temp4], %[temp4] \n\t" "addu.qb %[temp0], %[temp0], %[temp4] \n\t" "bne %[src], %[p_loop2_end], 1b \n\t" " sw %[temp0], -4(%[dst]) \n\t" "2: \n\t" ".set pop \n\t" : [dst]"+&r"(dst), [src]"+&r"(src), [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [temp6]"=&r"(temp6), [temp7]"=&r"(temp7) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static void TransformColorInverse_MIPSdspR2(const VP8LMultipliers* const m, const uint32_t* src, int num_pixels, uint32_t* dst) { int temp0, temp1, temp2, temp3, temp4, temp5; uint32_t argb, argb1, new_red; const uint32_t G_to_R = m->green_to_red_; const uint32_t G_to_B = m->green_to_blue_; const uint32_t R_to_B = m->red_to_blue_; const uint32_t* const p_loop_end = src + (num_pixels & ~1); __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop_end], 1f \n\t" " nop \n\t" "replv.ph %[temp0], %[G_to_R] \n\t" "replv.ph %[temp1], %[G_to_B] \n\t" "replv.ph %[temp2], %[R_to_B] \n\t" "shll.ph %[temp0], %[temp0], 8 \n\t" "shll.ph %[temp1], %[temp1], 8 \n\t" "shll.ph %[temp2], %[temp2], 8 \n\t" "shra.ph %[temp0], %[temp0], 8 \n\t" "shra.ph %[temp1], %[temp1], 8 \n\t" "shra.ph %[temp2], %[temp2], 8 \n\t" "0: \n\t" "lw %[argb], 0(%[src]) \n\t" "lw %[argb1], 4(%[src]) \n\t" "sw %[argb], 0(%[dst]) \n\t" "sw %[argb1], 4(%[dst]) \n\t" "addiu %[src], %[src], 8 \n\t" "addiu %[dst], %[dst], 8 \n\t" "precrq.qb.ph %[temp3], %[argb], %[argb1] \n\t" "preceu.ph.qbra %[temp3], %[temp3] \n\t" "shll.ph %[temp3], %[temp3], 8 \n\t" "shra.ph %[temp3], %[temp3], 8 \n\t" "mul.ph %[temp5], %[temp3], %[temp0] \n\t" "mul.ph %[temp3], %[temp3], %[temp1] \n\t" "precrq.ph.w %[new_red], %[argb], %[argb1] \n\t" "ins %[argb1], %[argb], 16, 16 \n\t" "shra.ph %[temp5], %[temp5], 5 \n\t" "shra.ph %[temp3], %[temp3], 5 \n\t" "addu.ph %[new_red], %[new_red], %[temp5] \n\t" "addu.ph %[argb1], %[argb1], %[temp3] \n\t" "preceu.ph.qbra %[temp5], %[new_red] \n\t" "shll.ph %[temp4], %[temp5], 8 \n\t" "shra.ph %[temp4], %[temp4], 8 \n\t" "mul.ph %[temp4], %[temp4], %[temp2] \n\t" "sb %[temp5], -2(%[dst]) \n\t" "sra %[temp5], %[temp5], 16 \n\t" "shra.ph %[temp4], %[temp4], 5 \n\t" "addu.ph %[argb1], %[argb1], %[temp4] \n\t" "preceu.ph.qbra %[temp3], %[argb1] \n\t" "sb %[temp5], -6(%[dst]) \n\t" "sb %[temp3], -4(%[dst]) \n\t" "sra %[temp3], %[temp3], 16 \n\t" "bne %[src], %[p_loop_end], 0b \n\t" " sb %[temp3], -8(%[dst]) \n\t" "1: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [new_red]"=&r"(new_red), [argb]"=&r"(argb), [argb1]"=&r"(argb1), [dst]"+&r"(dst), [src]"+&r"(src) : [G_to_R]"r"(G_to_R), [R_to_B]"r"(R_to_B), [G_to_B]"r"(G_to_B), [p_loop_end]"r"(p_loop_end) : "memory", "hi", "lo" ); // Fall-back to C-version for left-overs. if (num_pixels & 1) VP8LTransformColorInverse_C(m, src, 1, dst); } static void ConvertBGRAToRGB_MIPSdspR2(const uint32_t* src, int num_pixels, uint8_t* dst) { int temp0, temp1, temp2, temp3; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp3], 12(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp0], 0(%[src]) \n\t" "ins %[temp3], %[temp2], 24, 8 \n\t" "sll %[temp2], %[temp2], 8 \n\t" "rotr %[temp3], %[temp3], 16 \n\t" "ins %[temp2], %[temp1], 0, 16 \n\t" "sll %[temp1], %[temp1], 8 \n\t" "wsbh %[temp3], %[temp3] \n\t" "balign %[temp0], %[temp1], 1 \n\t" "wsbh %[temp2], %[temp2] \n\t" "wsbh %[temp0], %[temp0] \n\t" "usw %[temp3], 8(%[dst]) \n\t" "rotr %[temp0], %[temp0], 16 \n\t" "usw %[temp2], 4(%[dst]) \n\t" "addiu %[src], %[src], 16 \n\t" "usw %[temp0], 0(%[dst]) \n\t" "bne %[src], %[p_loop1_end], 0b \n\t" " addiu %[dst], %[dst], 12 \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "addiu %[src], %[src], 4 \n\t" "wsbh %[temp1], %[temp0] \n\t" "addiu %[dst], %[dst], 3 \n\t" "ush %[temp1], -2(%[dst]) \n\t" "sra %[temp0], %[temp0], 16 \n\t" "bne %[src], %[p_loop2_end], 1b \n\t" " sb %[temp0], -3(%[dst]) \n\t" "2: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [dst]"+&r"(dst), [src]"+&r"(src) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static void ConvertBGRAToRGBA_MIPSdspR2(const uint32_t* src, int num_pixels, uint8_t* dst) { int temp0, temp1, temp2, temp3; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp3], 12(%[src]) \n\t" "wsbh %[temp0], %[temp0] \n\t" "wsbh %[temp1], %[temp1] \n\t" "wsbh %[temp2], %[temp2] \n\t" "wsbh %[temp3], %[temp3] \n\t" "addiu %[src], %[src], 16 \n\t" "balign %[temp0], %[temp0], 1 \n\t" "balign %[temp1], %[temp1], 1 \n\t" "balign %[temp2], %[temp2], 1 \n\t" "balign %[temp3], %[temp3], 1 \n\t" "usw %[temp0], 0(%[dst]) \n\t" "usw %[temp1], 4(%[dst]) \n\t" "usw %[temp2], 8(%[dst]) \n\t" "usw %[temp3], 12(%[dst]) \n\t" "bne %[src], %[p_loop1_end], 0b \n\t" " addiu %[dst], %[dst], 16 \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "wsbh %[temp0], %[temp0] \n\t" "addiu %[src], %[src], 4 \n\t" "balign %[temp0], %[temp0], 1 \n\t" "usw %[temp0], 0(%[dst]) \n\t" "bne %[src], %[p_loop2_end], 1b \n\t" " addiu %[dst], %[dst], 4 \n\t" "2: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [dst]"+&r"(dst), [src]"+&r"(src) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static void ConvertBGRAToRGBA4444_MIPSdspR2(const uint32_t* src, int num_pixels, uint8_t* dst) { int temp0, temp1, temp2, temp3, temp4, temp5; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp3], 12(%[src]) \n\t" "ext %[temp4], %[temp0], 28, 4 \n\t" "ext %[temp5], %[temp0], 12, 4 \n\t" "ins %[temp0], %[temp4], 0, 4 \n\t" "ext %[temp4], %[temp1], 28, 4 \n\t" "ins %[temp0], %[temp5], 16, 4 \n\t" "ext %[temp5], %[temp1], 12, 4 \n\t" "ins %[temp1], %[temp4], 0, 4 \n\t" "ext %[temp4], %[temp2], 28, 4 \n\t" "ins %[temp1], %[temp5], 16, 4 \n\t" "ext %[temp5], %[temp2], 12, 4 \n\t" "ins %[temp2], %[temp4], 0, 4 \n\t" "ext %[temp4], %[temp3], 28, 4 \n\t" "ins %[temp2], %[temp5], 16, 4 \n\t" "ext %[temp5], %[temp3], 12, 4 \n\t" "ins %[temp3], %[temp4], 0, 4 \n\t" "precr.qb.ph %[temp1], %[temp1], %[temp0] \n\t" "ins %[temp3], %[temp5], 16, 4 \n\t" "addiu %[src], %[src], 16 \n\t" "precr.qb.ph %[temp3], %[temp3], %[temp2] \n\t" #if (WEBP_SWAP_16BIT_CSP == 1) "usw %[temp1], 0(%[dst]) \n\t" "usw %[temp3], 4(%[dst]) \n\t" #else "wsbh %[temp1], %[temp1] \n\t" "wsbh %[temp3], %[temp3] \n\t" "usw %[temp1], 0(%[dst]) \n\t" "usw %[temp3], 4(%[dst]) \n\t" #endif "bne %[src], %[p_loop1_end], 0b \n\t" " addiu %[dst], %[dst], 8 \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "ext %[temp4], %[temp0], 28, 4 \n\t" "ext %[temp5], %[temp0], 12, 4 \n\t" "ins %[temp0], %[temp4], 0, 4 \n\t" "ins %[temp0], %[temp5], 16, 4 \n\t" "addiu %[src], %[src], 4 \n\t" "precr.qb.ph %[temp0], %[temp0], %[temp0] \n\t" #if (WEBP_SWAP_16BIT_CSP == 1) "ush %[temp0], 0(%[dst]) \n\t" #else "wsbh %[temp0], %[temp0] \n\t" "ush %[temp0], 0(%[dst]) \n\t" #endif "bne %[src], %[p_loop2_end], 1b \n\t" " addiu %[dst], %[dst], 2 \n\t" "2: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [dst]"+&r"(dst), [src]"+&r"(src) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static void ConvertBGRAToRGB565_MIPSdspR2(const uint32_t* src, int num_pixels, uint8_t* dst) { int temp0, temp1, temp2, temp3, temp4, temp5; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp3], 12(%[src]) \n\t" "ext %[temp4], %[temp0], 8, 16 \n\t" "ext %[temp5], %[temp0], 5, 11 \n\t" "ext %[temp0], %[temp0], 3, 5 \n\t" "ins %[temp4], %[temp5], 0, 11 \n\t" "ext %[temp5], %[temp1], 5, 11 \n\t" "ins %[temp4], %[temp0], 0, 5 \n\t" "ext %[temp0], %[temp1], 8, 16 \n\t" "ext %[temp1], %[temp1], 3, 5 \n\t" "ins %[temp0], %[temp5], 0, 11 \n\t" "ext %[temp5], %[temp2], 5, 11 \n\t" "ins %[temp0], %[temp1], 0, 5 \n\t" "ext %[temp1], %[temp2], 8, 16 \n\t" "ext %[temp2], %[temp2], 3, 5 \n\t" "ins %[temp1], %[temp5], 0, 11 \n\t" "ext %[temp5], %[temp3], 5, 11 \n\t" "ins %[temp1], %[temp2], 0, 5 \n\t" "ext %[temp2], %[temp3], 8, 16 \n\t" "ext %[temp3], %[temp3], 3, 5 \n\t" "ins %[temp2], %[temp5], 0, 11 \n\t" "append %[temp0], %[temp4], 16 \n\t" "ins %[temp2], %[temp3], 0, 5 \n\t" "addiu %[src], %[src], 16 \n\t" "append %[temp2], %[temp1], 16 \n\t" #if (WEBP_SWAP_16BIT_CSP == 1) "usw %[temp0], 0(%[dst]) \n\t" "usw %[temp2], 4(%[dst]) \n\t" #else "wsbh %[temp0], %[temp0] \n\t" "wsbh %[temp2], %[temp2] \n\t" "usw %[temp0], 0(%[dst]) \n\t" "usw %[temp2], 4(%[dst]) \n\t" #endif "bne %[src], %[p_loop1_end], 0b \n\t" " addiu %[dst], %[dst], 8 \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "ext %[temp4], %[temp0], 8, 16 \n\t" "ext %[temp5], %[temp0], 5, 11 \n\t" "ext %[temp0], %[temp0], 3, 5 \n\t" "ins %[temp4], %[temp5], 0, 11 \n\t" "addiu %[src], %[src], 4 \n\t" "ins %[temp4], %[temp0], 0, 5 \n\t" #if (WEBP_SWAP_16BIT_CSP == 1) "ush %[temp4], 0(%[dst]) \n\t" #else "wsbh %[temp4], %[temp4] \n\t" "ush %[temp4], 0(%[dst]) \n\t" #endif "bne %[src], %[p_loop2_end], 1b \n\t" " addiu %[dst], %[dst], 2 \n\t" "2: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), [dst]"+&r"(dst), [src]"+&r"(src) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } static void ConvertBGRAToBGR_MIPSdspR2(const uint32_t* src, int num_pixels, uint8_t* dst) { int temp0, temp1, temp2, temp3; const uint32_t* const p_loop1_end = src + (num_pixels & ~3); const uint32_t* const p_loop2_end = src + num_pixels; __asm__ volatile ( ".set push \n\t" ".set noreorder \n\t" "beq %[src], %[p_loop1_end], 3f \n\t" " nop \n\t" "0: \n\t" "lw %[temp0], 0(%[src]) \n\t" "lw %[temp1], 4(%[src]) \n\t" "lw %[temp2], 8(%[src]) \n\t" "lw %[temp3], 12(%[src]) \n\t" "ins %[temp0], %[temp1], 24, 8 \n\t" "sra %[temp1], %[temp1], 8 \n\t" "ins %[temp1], %[temp2], 16, 16 \n\t" "sll %[temp2], %[temp2], 8 \n\t" "balign %[temp3], %[temp2], 1 \n\t" "addiu %[src], %[src], 16 \n\t" "usw %[temp0], 0(%[dst]) \n\t" "usw %[temp1], 4(%[dst]) \n\t" "usw %[temp3], 8(%[dst]) \n\t" "bne %[src], %[p_loop1_end], 0b \n\t" " addiu %[dst], %[dst], 12 \n\t" "3: \n\t" "beq %[src], %[p_loop2_end], 2f \n\t" " nop \n\t" "1: \n\t" "lw %[temp0], 0(%[src]) \n\t" "addiu %[src], %[src], 4 \n\t" "addiu %[dst], %[dst], 3 \n\t" "ush %[temp0], -3(%[dst]) \n\t" "sra %[temp0], %[temp0], 16 \n\t" "bne %[src], %[p_loop2_end], 1b \n\t" " sb %[temp0], -1(%[dst]) \n\t" "2: \n\t" ".set pop \n\t" : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), [temp3]"=&r"(temp3), [dst]"+&r"(dst), [src]"+&r"(src) : [p_loop1_end]"r"(p_loop1_end), [p_loop2_end]"r"(p_loop2_end) : "memory" ); } //------------------------------------------------------------------------------ // Entry point extern void VP8LDspInitMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LDspInitMIPSdspR2(void) { VP8LMapColor32b = MapARGB_MIPSdspR2; VP8LMapColor8b = MapAlpha_MIPSdspR2; VP8LPredictors[5] = Predictor5_MIPSdspR2; VP8LPredictors[6] = Predictor6_MIPSdspR2; VP8LPredictors[7] = Predictor7_MIPSdspR2; VP8LPredictors[8] = Predictor8_MIPSdspR2; VP8LPredictors[9] = Predictor9_MIPSdspR2; VP8LPredictors[10] = Predictor10_MIPSdspR2; VP8LPredictors[11] = Predictor11_MIPSdspR2; VP8LPredictors[12] = Predictor12_MIPSdspR2; VP8LPredictors[13] = Predictor13_MIPSdspR2; VP8LAddGreenToBlueAndRed = AddGreenToBlueAndRed_MIPSdspR2; VP8LTransformColorInverse = TransformColorInverse_MIPSdspR2; VP8LConvertBGRAToRGB = ConvertBGRAToRGB_MIPSdspR2; VP8LConvertBGRAToRGBA = ConvertBGRAToRGBA_MIPSdspR2; VP8LConvertBGRAToRGBA4444 = ConvertBGRAToRGBA4444_MIPSdspR2; VP8LConvertBGRAToRGB565 = ConvertBGRAToRGB565_MIPSdspR2; VP8LConvertBGRAToBGR = ConvertBGRAToBGR_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(VP8LDspInitMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/enc_neon.c0000644000014400001440000011065214606317060013365 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // ARM NEON version of speed-critical encoding functions. // // adapted from libvpx (https://www.webmproject.org/code/) #include "src/dsp/dsp.h" #if defined(WEBP_USE_NEON) #include #include "src/dsp/neon.h" #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Transforms (Paragraph 14.4) // Inverse transform. // This code is pretty much the same as TransformOne in the dec_neon.c, except // for subtraction to *ref. See the comments there for algorithmic explanations. static const int16_t kC1 = WEBP_TRANSFORM_AC3_C1; static const int16_t kC2 = WEBP_TRANSFORM_AC3_C2 / 2; // half of kC2, actually. See comment above. // This code works but is *slower* than the inlined-asm version below // (with gcc-4.6). So we disable it for now. Later, it'll be conditional to // WEBP_USE_INTRINSICS define. // With gcc-4.8, it's a little faster speed than inlined-assembly. #if defined(WEBP_USE_INTRINSICS) // Treats 'v' as an uint8x8_t and zero extends to an int16x8_t. static WEBP_INLINE int16x8_t ConvertU8ToS16_NEON(uint32x2_t v) { return vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(v))); } // Performs unsigned 8b saturation on 'dst01' and 'dst23' storing the result // to the corresponding rows of 'dst'. static WEBP_INLINE void SaturateAndStore4x4_NEON(uint8_t* const dst, const int16x8_t dst01, const int16x8_t dst23) { // Unsigned saturate to 8b. const uint8x8_t dst01_u8 = vqmovun_s16(dst01); const uint8x8_t dst23_u8 = vqmovun_s16(dst23); // Store the results. vst1_lane_u32((uint32_t*)(dst + 0 * BPS), vreinterpret_u32_u8(dst01_u8), 0); vst1_lane_u32((uint32_t*)(dst + 1 * BPS), vreinterpret_u32_u8(dst01_u8), 1); vst1_lane_u32((uint32_t*)(dst + 2 * BPS), vreinterpret_u32_u8(dst23_u8), 0); vst1_lane_u32((uint32_t*)(dst + 3 * BPS), vreinterpret_u32_u8(dst23_u8), 1); } static WEBP_INLINE void Add4x4_NEON(const int16x8_t row01, const int16x8_t row23, const uint8_t* const ref, uint8_t* const dst) { uint32x2_t dst01 = vdup_n_u32(0); uint32x2_t dst23 = vdup_n_u32(0); // Load the source pixels. dst01 = vld1_lane_u32((uint32_t*)(ref + 0 * BPS), dst01, 0); dst23 = vld1_lane_u32((uint32_t*)(ref + 2 * BPS), dst23, 0); dst01 = vld1_lane_u32((uint32_t*)(ref + 1 * BPS), dst01, 1); dst23 = vld1_lane_u32((uint32_t*)(ref + 3 * BPS), dst23, 1); { // Convert to 16b. const int16x8_t dst01_s16 = ConvertU8ToS16_NEON(dst01); const int16x8_t dst23_s16 = ConvertU8ToS16_NEON(dst23); // Descale with rounding. const int16x8_t out01 = vrsraq_n_s16(dst01_s16, row01, 3); const int16x8_t out23 = vrsraq_n_s16(dst23_s16, row23, 3); // Add the inverse transform. SaturateAndStore4x4_NEON(dst, out01, out23); } } static WEBP_INLINE void Transpose8x2_NEON(const int16x8_t in0, const int16x8_t in1, int16x8x2_t* const out) { // a0 a1 a2 a3 | b0 b1 b2 b3 => a0 b0 c0 d0 | a1 b1 c1 d1 // c0 c1 c2 c3 | d0 d1 d2 d3 a2 b2 c2 d2 | a3 b3 c3 d3 const int16x8x2_t tmp0 = vzipq_s16(in0, in1); // a0 c0 a1 c1 a2 c2 ... // b0 d0 b1 d1 b2 d2 ... *out = vzipq_s16(tmp0.val[0], tmp0.val[1]); } static WEBP_INLINE void TransformPass_NEON(int16x8x2_t* const rows) { // {rows} = in0 | in4 // in8 | in12 // B1 = in4 | in12 const int16x8_t B1 = vcombine_s16(vget_high_s16(rows->val[0]), vget_high_s16(rows->val[1])); // C0 = kC1 * in4 | kC1 * in12 // C1 = kC2 * in4 | kC2 * in12 const int16x8_t C0 = vsraq_n_s16(B1, vqdmulhq_n_s16(B1, kC1), 1); const int16x8_t C1 = vqdmulhq_n_s16(B1, kC2); const int16x4_t a = vqadd_s16(vget_low_s16(rows->val[0]), vget_low_s16(rows->val[1])); // in0 + in8 const int16x4_t b = vqsub_s16(vget_low_s16(rows->val[0]), vget_low_s16(rows->val[1])); // in0 - in8 // c = kC2 * in4 - kC1 * in12 // d = kC1 * in4 + kC2 * in12 const int16x4_t c = vqsub_s16(vget_low_s16(C1), vget_high_s16(C0)); const int16x4_t d = vqadd_s16(vget_low_s16(C0), vget_high_s16(C1)); const int16x8_t D0 = vcombine_s16(a, b); // D0 = a | b const int16x8_t D1 = vcombine_s16(d, c); // D1 = d | c const int16x8_t E0 = vqaddq_s16(D0, D1); // a+d | b+c const int16x8_t E_tmp = vqsubq_s16(D0, D1); // a-d | b-c const int16x8_t E1 = vcombine_s16(vget_high_s16(E_tmp), vget_low_s16(E_tmp)); Transpose8x2_NEON(E0, E1, rows); } static void ITransformOne_NEON(const uint8_t* ref, const int16_t* in, uint8_t* dst) { int16x8x2_t rows; INIT_VECTOR2(rows, vld1q_s16(in + 0), vld1q_s16(in + 8)); TransformPass_NEON(&rows); TransformPass_NEON(&rows); Add4x4_NEON(rows.val[0], rows.val[1], ref, dst); } #else static void ITransformOne_NEON(const uint8_t* ref, const int16_t* in, uint8_t* dst) { const int kBPS = BPS; const int16_t kC1C2[] = { kC1, kC2, 0, 0 }; __asm__ volatile ( "vld1.16 {q1, q2}, [%[in]] \n" "vld1.16 {d0}, [%[kC1C2]] \n" // d2: in[0] // d3: in[8] // d4: in[4] // d5: in[12] "vswp d3, d4 \n" // q8 = {in[4], in[12]} * kC1 * 2 >> 16 // q9 = {in[4], in[12]} * kC2 >> 16 "vqdmulh.s16 q8, q2, d0[0] \n" "vqdmulh.s16 q9, q2, d0[1] \n" // d22 = a = in[0] + in[8] // d23 = b = in[0] - in[8] "vqadd.s16 d22, d2, d3 \n" "vqsub.s16 d23, d2, d3 \n" // q8 = in[4]/[12] * kC1 >> 16 "vshr.s16 q8, q8, #1 \n" // Add {in[4], in[12]} back after the multiplication. "vqadd.s16 q8, q2, q8 \n" // d20 = c = in[4]*kC2 - in[12]*kC1 // d21 = d = in[4]*kC1 + in[12]*kC2 "vqsub.s16 d20, d18, d17 \n" "vqadd.s16 d21, d19, d16 \n" // d2 = tmp[0] = a + d // d3 = tmp[1] = b + c // d4 = tmp[2] = b - c // d5 = tmp[3] = a - d "vqadd.s16 d2, d22, d21 \n" "vqadd.s16 d3, d23, d20 \n" "vqsub.s16 d4, d23, d20 \n" "vqsub.s16 d5, d22, d21 \n" "vzip.16 q1, q2 \n" "vzip.16 q1, q2 \n" "vswp d3, d4 \n" // q8 = {tmp[4], tmp[12]} * kC1 * 2 >> 16 // q9 = {tmp[4], tmp[12]} * kC2 >> 16 "vqdmulh.s16 q8, q2, d0[0] \n" "vqdmulh.s16 q9, q2, d0[1] \n" // d22 = a = tmp[0] + tmp[8] // d23 = b = tmp[0] - tmp[8] "vqadd.s16 d22, d2, d3 \n" "vqsub.s16 d23, d2, d3 \n" "vshr.s16 q8, q8, #1 \n" "vqadd.s16 q8, q2, q8 \n" // d20 = c = in[4]*kC2 - in[12]*kC1 // d21 = d = in[4]*kC1 + in[12]*kC2 "vqsub.s16 d20, d18, d17 \n" "vqadd.s16 d21, d19, d16 \n" // d2 = tmp[0] = a + d // d3 = tmp[1] = b + c // d4 = tmp[2] = b - c // d5 = tmp[3] = a - d "vqadd.s16 d2, d22, d21 \n" "vqadd.s16 d3, d23, d20 \n" "vqsub.s16 d4, d23, d20 \n" "vqsub.s16 d5, d22, d21 \n" "vld1.32 d6[0], [%[ref]], %[kBPS] \n" "vld1.32 d6[1], [%[ref]], %[kBPS] \n" "vld1.32 d7[0], [%[ref]], %[kBPS] \n" "vld1.32 d7[1], [%[ref]], %[kBPS] \n" "sub %[ref], %[ref], %[kBPS], lsl #2 \n" // (val) + 4 >> 3 "vrshr.s16 d2, d2, #3 \n" "vrshr.s16 d3, d3, #3 \n" "vrshr.s16 d4, d4, #3 \n" "vrshr.s16 d5, d5, #3 \n" "vzip.16 q1, q2 \n" "vzip.16 q1, q2 \n" // Must accumulate before saturating "vmovl.u8 q8, d6 \n" "vmovl.u8 q9, d7 \n" "vqadd.s16 q1, q1, q8 \n" "vqadd.s16 q2, q2, q9 \n" "vqmovun.s16 d0, q1 \n" "vqmovun.s16 d1, q2 \n" "vst1.32 d0[0], [%[dst]], %[kBPS] \n" "vst1.32 d0[1], [%[dst]], %[kBPS] \n" "vst1.32 d1[0], [%[dst]], %[kBPS] \n" "vst1.32 d1[1], [%[dst]] \n" : [in] "+r"(in), [dst] "+r"(dst) // modified registers : [kBPS] "r"(kBPS), [kC1C2] "r"(kC1C2), [ref] "r"(ref) // constants : "memory", "q0", "q1", "q2", "q8", "q9", "q10", "q11" // clobbered ); } #endif // WEBP_USE_INTRINSICS static void ITransform_NEON(const uint8_t* ref, const int16_t* in, uint8_t* dst, int do_two) { ITransformOne_NEON(ref, in, dst); if (do_two) { ITransformOne_NEON(ref + 4, in + 16, dst + 4); } } // Load all 4x4 pixels into a single uint8x16_t variable. static uint8x16_t Load4x4_NEON(const uint8_t* src) { uint32x4_t out = vdupq_n_u32(0); out = vld1q_lane_u32((const uint32_t*)(src + 0 * BPS), out, 0); out = vld1q_lane_u32((const uint32_t*)(src + 1 * BPS), out, 1); out = vld1q_lane_u32((const uint32_t*)(src + 2 * BPS), out, 2); out = vld1q_lane_u32((const uint32_t*)(src + 3 * BPS), out, 3); return vreinterpretq_u8_u32(out); } // Forward transform. #if defined(WEBP_USE_INTRINSICS) static WEBP_INLINE void Transpose4x4_S16_NEON(const int16x4_t A, const int16x4_t B, const int16x4_t C, const int16x4_t D, int16x8_t* const out01, int16x8_t* const out32) { const int16x4x2_t AB = vtrn_s16(A, B); const int16x4x2_t CD = vtrn_s16(C, D); const int32x2x2_t tmp02 = vtrn_s32(vreinterpret_s32_s16(AB.val[0]), vreinterpret_s32_s16(CD.val[0])); const int32x2x2_t tmp13 = vtrn_s32(vreinterpret_s32_s16(AB.val[1]), vreinterpret_s32_s16(CD.val[1])); *out01 = vreinterpretq_s16_s64( vcombine_s64(vreinterpret_s64_s32(tmp02.val[0]), vreinterpret_s64_s32(tmp13.val[0]))); *out32 = vreinterpretq_s16_s64( vcombine_s64(vreinterpret_s64_s32(tmp13.val[1]), vreinterpret_s64_s32(tmp02.val[1]))); } static WEBP_INLINE int16x8_t DiffU8ToS16_NEON(const uint8x8_t a, const uint8x8_t b) { return vreinterpretq_s16_u16(vsubl_u8(a, b)); } static void FTransform_NEON(const uint8_t* src, const uint8_t* ref, int16_t* out) { int16x8_t d0d1, d3d2; // working 4x4 int16 variables { const uint8x16_t S0 = Load4x4_NEON(src); const uint8x16_t R0 = Load4x4_NEON(ref); const int16x8_t D0D1 = DiffU8ToS16_NEON(vget_low_u8(S0), vget_low_u8(R0)); const int16x8_t D2D3 = DiffU8ToS16_NEON(vget_high_u8(S0), vget_high_u8(R0)); const int16x4_t D0 = vget_low_s16(D0D1); const int16x4_t D1 = vget_high_s16(D0D1); const int16x4_t D2 = vget_low_s16(D2D3); const int16x4_t D3 = vget_high_s16(D2D3); Transpose4x4_S16_NEON(D0, D1, D2, D3, &d0d1, &d3d2); } { // 1rst pass const int32x4_t kCst937 = vdupq_n_s32(937); const int32x4_t kCst1812 = vdupq_n_s32(1812); const int16x8_t a0a1 = vaddq_s16(d0d1, d3d2); // d0+d3 | d1+d2 (=a0|a1) const int16x8_t a3a2 = vsubq_s16(d0d1, d3d2); // d0-d3 | d1-d2 (=a3|a2) const int16x8_t a0a1_2 = vshlq_n_s16(a0a1, 3); const int16x4_t tmp0 = vadd_s16(vget_low_s16(a0a1_2), vget_high_s16(a0a1_2)); const int16x4_t tmp2 = vsub_s16(vget_low_s16(a0a1_2), vget_high_s16(a0a1_2)); const int32x4_t a3_2217 = vmull_n_s16(vget_low_s16(a3a2), 2217); const int32x4_t a2_2217 = vmull_n_s16(vget_high_s16(a3a2), 2217); const int32x4_t a2_p_a3 = vmlal_n_s16(a2_2217, vget_low_s16(a3a2), 5352); const int32x4_t a3_m_a2 = vmlsl_n_s16(a3_2217, vget_high_s16(a3a2), 5352); const int16x4_t tmp1 = vshrn_n_s32(vaddq_s32(a2_p_a3, kCst1812), 9); const int16x4_t tmp3 = vshrn_n_s32(vaddq_s32(a3_m_a2, kCst937), 9); Transpose4x4_S16_NEON(tmp0, tmp1, tmp2, tmp3, &d0d1, &d3d2); } { // 2nd pass // the (1<<16) addition is for the replacement: a3!=0 <-> 1-(a3==0) const int32x4_t kCst12000 = vdupq_n_s32(12000 + (1 << 16)); const int32x4_t kCst51000 = vdupq_n_s32(51000); const int16x8_t a0a1 = vaddq_s16(d0d1, d3d2); // d0+d3 | d1+d2 (=a0|a1) const int16x8_t a3a2 = vsubq_s16(d0d1, d3d2); // d0-d3 | d1-d2 (=a3|a2) const int16x4_t a0_k7 = vadd_s16(vget_low_s16(a0a1), vdup_n_s16(7)); const int16x4_t out0 = vshr_n_s16(vadd_s16(a0_k7, vget_high_s16(a0a1)), 4); const int16x4_t out2 = vshr_n_s16(vsub_s16(a0_k7, vget_high_s16(a0a1)), 4); const int32x4_t a3_2217 = vmull_n_s16(vget_low_s16(a3a2), 2217); const int32x4_t a2_2217 = vmull_n_s16(vget_high_s16(a3a2), 2217); const int32x4_t a2_p_a3 = vmlal_n_s16(a2_2217, vget_low_s16(a3a2), 5352); const int32x4_t a3_m_a2 = vmlsl_n_s16(a3_2217, vget_high_s16(a3a2), 5352); const int16x4_t tmp1 = vaddhn_s32(a2_p_a3, kCst12000); const int16x4_t out3 = vaddhn_s32(a3_m_a2, kCst51000); const int16x4_t a3_eq_0 = vreinterpret_s16_u16(vceq_s16(vget_low_s16(a3a2), vdup_n_s16(0))); const int16x4_t out1 = vadd_s16(tmp1, a3_eq_0); vst1_s16(out + 0, out0); vst1_s16(out + 4, out1); vst1_s16(out + 8, out2); vst1_s16(out + 12, out3); } } #else // adapted from vp8/encoder/arm/neon/shortfdct_neon.asm static const int16_t kCoeff16[] = { 5352, 5352, 5352, 5352, 2217, 2217, 2217, 2217 }; static const int32_t kCoeff32[] = { 1812, 1812, 1812, 1812, 937, 937, 937, 937, 12000, 12000, 12000, 12000, 51000, 51000, 51000, 51000 }; static void FTransform_NEON(const uint8_t* src, const uint8_t* ref, int16_t* out) { const int kBPS = BPS; const uint8_t* src_ptr = src; const uint8_t* ref_ptr = ref; const int16_t* coeff16 = kCoeff16; const int32_t* coeff32 = kCoeff32; __asm__ volatile ( // load src into q4, q5 in high half "vld1.8 {d8}, [%[src_ptr]], %[kBPS] \n" "vld1.8 {d10}, [%[src_ptr]], %[kBPS] \n" "vld1.8 {d9}, [%[src_ptr]], %[kBPS] \n" "vld1.8 {d11}, [%[src_ptr]] \n" // load ref into q6, q7 in high half "vld1.8 {d12}, [%[ref_ptr]], %[kBPS] \n" "vld1.8 {d14}, [%[ref_ptr]], %[kBPS] \n" "vld1.8 {d13}, [%[ref_ptr]], %[kBPS] \n" "vld1.8 {d15}, [%[ref_ptr]] \n" // Pack the high values in to q4 and q6 "vtrn.32 q4, q5 \n" "vtrn.32 q6, q7 \n" // d[0-3] = src - ref "vsubl.u8 q0, d8, d12 \n" "vsubl.u8 q1, d9, d13 \n" // load coeff16 into q8(d16=5352, d17=2217) "vld1.16 {q8}, [%[coeff16]] \n" // load coeff32 high half into q9 = 1812, q10 = 937 "vld1.32 {q9, q10}, [%[coeff32]]! \n" // load coeff32 low half into q11=12000, q12=51000 "vld1.32 {q11,q12}, [%[coeff32]] \n" // part 1 // Transpose. Register dN is the same as dN in C "vtrn.32 d0, d2 \n" "vtrn.32 d1, d3 \n" "vtrn.16 d0, d1 \n" "vtrn.16 d2, d3 \n" "vadd.s16 d4, d0, d3 \n" // a0 = d0 + d3 "vadd.s16 d5, d1, d2 \n" // a1 = d1 + d2 "vsub.s16 d6, d1, d2 \n" // a2 = d1 - d2 "vsub.s16 d7, d0, d3 \n" // a3 = d0 - d3 "vadd.s16 d0, d4, d5 \n" // a0 + a1 "vshl.s16 d0, d0, #3 \n" // temp[0+i*4] = (a0+a1) << 3 "vsub.s16 d2, d4, d5 \n" // a0 - a1 "vshl.s16 d2, d2, #3 \n" // (temp[2+i*4] = (a0-a1) << 3 "vmlal.s16 q9, d7, d16 \n" // a3*5352 + 1812 "vmlal.s16 q10, d7, d17 \n" // a3*2217 + 937 "vmlal.s16 q9, d6, d17 \n" // a2*2217 + a3*5352 + 1812 "vmlsl.s16 q10, d6, d16 \n" // a3*2217 + 937 - a2*5352 // temp[1+i*4] = (d2*2217 + d3*5352 + 1812) >> 9 // temp[3+i*4] = (d3*2217 + 937 - d2*5352) >> 9 "vshrn.s32 d1, q9, #9 \n" "vshrn.s32 d3, q10, #9 \n" // part 2 // transpose d0=ip[0], d1=ip[4], d2=ip[8], d3=ip[12] "vtrn.32 d0, d2 \n" "vtrn.32 d1, d3 \n" "vtrn.16 d0, d1 \n" "vtrn.16 d2, d3 \n" "vmov.s16 d26, #7 \n" "vadd.s16 d4, d0, d3 \n" // a1 = ip[0] + ip[12] "vadd.s16 d5, d1, d2 \n" // b1 = ip[4] + ip[8] "vsub.s16 d6, d1, d2 \n" // c1 = ip[4] - ip[8] "vadd.s16 d4, d4, d26 \n" // a1 + 7 "vsub.s16 d7, d0, d3 \n" // d1 = ip[0] - ip[12] "vadd.s16 d0, d4, d5 \n" // op[0] = a1 + b1 + 7 "vsub.s16 d2, d4, d5 \n" // op[8] = a1 - b1 + 7 "vmlal.s16 q11, d7, d16 \n" // d1*5352 + 12000 "vmlal.s16 q12, d7, d17 \n" // d1*2217 + 51000 "vceq.s16 d4, d7, #0 \n" "vshr.s16 d0, d0, #4 \n" "vshr.s16 d2, d2, #4 \n" "vmlal.s16 q11, d6, d17 \n" // c1*2217 + d1*5352 + 12000 "vmlsl.s16 q12, d6, d16 \n" // d1*2217 - c1*5352 + 51000 "vmvn d4, d4 \n" // !(d1 == 0) // op[4] = (c1*2217 + d1*5352 + 12000)>>16 "vshrn.s32 d1, q11, #16 \n" // op[4] += (d1!=0) "vsub.s16 d1, d1, d4 \n" // op[12]= (d1*2217 - c1*5352 + 51000)>>16 "vshrn.s32 d3, q12, #16 \n" // set result to out array "vst1.16 {q0, q1}, [%[out]] \n" : [src_ptr] "+r"(src_ptr), [ref_ptr] "+r"(ref_ptr), [coeff32] "+r"(coeff32) // modified registers : [kBPS] "r"(kBPS), [coeff16] "r"(coeff16), [out] "r"(out) // constants : "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", "q12", "q13" // clobbered ); } #endif #define LOAD_LANE_16b(VALUE, LANE) do { \ (VALUE) = vld1_lane_s16(src, (VALUE), (LANE)); \ src += stride; \ } while (0) static void FTransformWHT_NEON(const int16_t* src, int16_t* out) { const int stride = 16; const int16x4_t zero = vdup_n_s16(0); int32x4x4_t tmp0; int16x4x4_t in; INIT_VECTOR4(in, zero, zero, zero, zero); LOAD_LANE_16b(in.val[0], 0); LOAD_LANE_16b(in.val[1], 0); LOAD_LANE_16b(in.val[2], 0); LOAD_LANE_16b(in.val[3], 0); LOAD_LANE_16b(in.val[0], 1); LOAD_LANE_16b(in.val[1], 1); LOAD_LANE_16b(in.val[2], 1); LOAD_LANE_16b(in.val[3], 1); LOAD_LANE_16b(in.val[0], 2); LOAD_LANE_16b(in.val[1], 2); LOAD_LANE_16b(in.val[2], 2); LOAD_LANE_16b(in.val[3], 2); LOAD_LANE_16b(in.val[0], 3); LOAD_LANE_16b(in.val[1], 3); LOAD_LANE_16b(in.val[2], 3); LOAD_LANE_16b(in.val[3], 3); { // a0 = in[0 * 16] + in[2 * 16] // a1 = in[1 * 16] + in[3 * 16] // a2 = in[1 * 16] - in[3 * 16] // a3 = in[0 * 16] - in[2 * 16] const int32x4_t a0 = vaddl_s16(in.val[0], in.val[2]); const int32x4_t a1 = vaddl_s16(in.val[1], in.val[3]); const int32x4_t a2 = vsubl_s16(in.val[1], in.val[3]); const int32x4_t a3 = vsubl_s16(in.val[0], in.val[2]); tmp0.val[0] = vaddq_s32(a0, a1); tmp0.val[1] = vaddq_s32(a3, a2); tmp0.val[2] = vsubq_s32(a3, a2); tmp0.val[3] = vsubq_s32(a0, a1); } { const int32x4x4_t tmp1 = Transpose4x4_NEON(tmp0); // a0 = tmp[0 + i] + tmp[ 8 + i] // a1 = tmp[4 + i] + tmp[12 + i] // a2 = tmp[4 + i] - tmp[12 + i] // a3 = tmp[0 + i] - tmp[ 8 + i] const int32x4_t a0 = vaddq_s32(tmp1.val[0], tmp1.val[2]); const int32x4_t a1 = vaddq_s32(tmp1.val[1], tmp1.val[3]); const int32x4_t a2 = vsubq_s32(tmp1.val[1], tmp1.val[3]); const int32x4_t a3 = vsubq_s32(tmp1.val[0], tmp1.val[2]); const int32x4_t b0 = vhaddq_s32(a0, a1); // (a0 + a1) >> 1 const int32x4_t b1 = vhaddq_s32(a3, a2); // (a3 + a2) >> 1 const int32x4_t b2 = vhsubq_s32(a3, a2); // (a3 - a2) >> 1 const int32x4_t b3 = vhsubq_s32(a0, a1); // (a0 - a1) >> 1 const int16x4_t out0 = vmovn_s32(b0); const int16x4_t out1 = vmovn_s32(b1); const int16x4_t out2 = vmovn_s32(b2); const int16x4_t out3 = vmovn_s32(b3); vst1_s16(out + 0, out0); vst1_s16(out + 4, out1); vst1_s16(out + 8, out2); vst1_s16(out + 12, out3); } } #undef LOAD_LANE_16b //------------------------------------------------------------------------------ // Texture distortion // // We try to match the spectral content (weighted) between source and // reconstructed samples. // a 0123, b 0123 // a 4567, b 4567 // a 89ab, b 89ab // a cdef, b cdef // // transpose // // a 048c, b 048c // a 159d, b 159d // a 26ae, b 26ae // a 37bf, b 37bf // static WEBP_INLINE int16x8x4_t DistoTranspose4x4S16_NEON(int16x8x4_t q4_in) { const int16x8x2_t q2_tmp0 = vtrnq_s16(q4_in.val[0], q4_in.val[1]); const int16x8x2_t q2_tmp1 = vtrnq_s16(q4_in.val[2], q4_in.val[3]); const int32x4x2_t q2_tmp2 = vtrnq_s32(vreinterpretq_s32_s16(q2_tmp0.val[0]), vreinterpretq_s32_s16(q2_tmp1.val[0])); const int32x4x2_t q2_tmp3 = vtrnq_s32(vreinterpretq_s32_s16(q2_tmp0.val[1]), vreinterpretq_s32_s16(q2_tmp1.val[1])); q4_in.val[0] = vreinterpretq_s16_s32(q2_tmp2.val[0]); q4_in.val[2] = vreinterpretq_s16_s32(q2_tmp2.val[1]); q4_in.val[1] = vreinterpretq_s16_s32(q2_tmp3.val[0]); q4_in.val[3] = vreinterpretq_s16_s32(q2_tmp3.val[1]); return q4_in; } static WEBP_INLINE int16x8x4_t DistoHorizontalPass_NEON( const int16x8x4_t q4_in) { // {a0, a1} = {in[0] + in[2], in[1] + in[3]} // {a3, a2} = {in[0] - in[2], in[1] - in[3]} const int16x8_t q_a0 = vaddq_s16(q4_in.val[0], q4_in.val[2]); const int16x8_t q_a1 = vaddq_s16(q4_in.val[1], q4_in.val[3]); const int16x8_t q_a3 = vsubq_s16(q4_in.val[0], q4_in.val[2]); const int16x8_t q_a2 = vsubq_s16(q4_in.val[1], q4_in.val[3]); int16x8x4_t q4_out; // tmp[0] = a0 + a1 // tmp[1] = a3 + a2 // tmp[2] = a3 - a2 // tmp[3] = a0 - a1 INIT_VECTOR4(q4_out, vabsq_s16(vaddq_s16(q_a0, q_a1)), vabsq_s16(vaddq_s16(q_a3, q_a2)), vabdq_s16(q_a3, q_a2), vabdq_s16(q_a0, q_a1)); return q4_out; } static WEBP_INLINE int16x8x4_t DistoVerticalPass_NEON(const uint8x8x4_t q4_in) { const int16x8_t q_a0 = vreinterpretq_s16_u16(vaddl_u8(q4_in.val[0], q4_in.val[2])); const int16x8_t q_a1 = vreinterpretq_s16_u16(vaddl_u8(q4_in.val[1], q4_in.val[3])); const int16x8_t q_a2 = vreinterpretq_s16_u16(vsubl_u8(q4_in.val[1], q4_in.val[3])); const int16x8_t q_a3 = vreinterpretq_s16_u16(vsubl_u8(q4_in.val[0], q4_in.val[2])); int16x8x4_t q4_out; INIT_VECTOR4(q4_out, vaddq_s16(q_a0, q_a1), vaddq_s16(q_a3, q_a2), vsubq_s16(q_a3, q_a2), vsubq_s16(q_a0, q_a1)); return q4_out; } static WEBP_INLINE int16x4x4_t DistoLoadW_NEON(const uint16_t* w) { const uint16x8_t q_w07 = vld1q_u16(&w[0]); const uint16x8_t q_w8f = vld1q_u16(&w[8]); int16x4x4_t d4_w; INIT_VECTOR4(d4_w, vget_low_s16(vreinterpretq_s16_u16(q_w07)), vget_high_s16(vreinterpretq_s16_u16(q_w07)), vget_low_s16(vreinterpretq_s16_u16(q_w8f)), vget_high_s16(vreinterpretq_s16_u16(q_w8f))); return d4_w; } static WEBP_INLINE int32x2_t DistoSum_NEON(const int16x8x4_t q4_in, const int16x4x4_t d4_w) { int32x2_t d_sum; // sum += w[ 0] * abs(b0); // sum += w[ 4] * abs(b1); // sum += w[ 8] * abs(b2); // sum += w[12] * abs(b3); int32x4_t q_sum0 = vmull_s16(d4_w.val[0], vget_low_s16(q4_in.val[0])); int32x4_t q_sum1 = vmull_s16(d4_w.val[1], vget_low_s16(q4_in.val[1])); int32x4_t q_sum2 = vmull_s16(d4_w.val[2], vget_low_s16(q4_in.val[2])); int32x4_t q_sum3 = vmull_s16(d4_w.val[3], vget_low_s16(q4_in.val[3])); q_sum0 = vmlsl_s16(q_sum0, d4_w.val[0], vget_high_s16(q4_in.val[0])); q_sum1 = vmlsl_s16(q_sum1, d4_w.val[1], vget_high_s16(q4_in.val[1])); q_sum2 = vmlsl_s16(q_sum2, d4_w.val[2], vget_high_s16(q4_in.val[2])); q_sum3 = vmlsl_s16(q_sum3, d4_w.val[3], vget_high_s16(q4_in.val[3])); q_sum0 = vaddq_s32(q_sum0, q_sum1); q_sum2 = vaddq_s32(q_sum2, q_sum3); q_sum2 = vaddq_s32(q_sum0, q_sum2); d_sum = vpadd_s32(vget_low_s32(q_sum2), vget_high_s32(q_sum2)); d_sum = vpadd_s32(d_sum, d_sum); return d_sum; } #define LOAD_LANE_32b(src, VALUE, LANE) \ (VALUE) = vld1_lane_u32((const uint32_t*)(src), (VALUE), (LANE)) // Hadamard transform // Returns the weighted sum of the absolute value of transformed coefficients. // w[] contains a row-major 4 by 4 symmetric matrix. static int Disto4x4_NEON(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { uint32x2_t d_in_ab_0123 = vdup_n_u32(0); uint32x2_t d_in_ab_4567 = vdup_n_u32(0); uint32x2_t d_in_ab_89ab = vdup_n_u32(0); uint32x2_t d_in_ab_cdef = vdup_n_u32(0); uint8x8x4_t d4_in; // load data a, b LOAD_LANE_32b(a + 0 * BPS, d_in_ab_0123, 0); LOAD_LANE_32b(a + 1 * BPS, d_in_ab_4567, 0); LOAD_LANE_32b(a + 2 * BPS, d_in_ab_89ab, 0); LOAD_LANE_32b(a + 3 * BPS, d_in_ab_cdef, 0); LOAD_LANE_32b(b + 0 * BPS, d_in_ab_0123, 1); LOAD_LANE_32b(b + 1 * BPS, d_in_ab_4567, 1); LOAD_LANE_32b(b + 2 * BPS, d_in_ab_89ab, 1); LOAD_LANE_32b(b + 3 * BPS, d_in_ab_cdef, 1); INIT_VECTOR4(d4_in, vreinterpret_u8_u32(d_in_ab_0123), vreinterpret_u8_u32(d_in_ab_4567), vreinterpret_u8_u32(d_in_ab_89ab), vreinterpret_u8_u32(d_in_ab_cdef)); { // Vertical pass first to avoid a transpose (vertical and horizontal passes // are commutative because w/kWeightY is symmetric) and subsequent // transpose. const int16x8x4_t q4_v = DistoVerticalPass_NEON(d4_in); const int16x4x4_t d4_w = DistoLoadW_NEON(w); // horizontal pass const int16x8x4_t q4_t = DistoTranspose4x4S16_NEON(q4_v); const int16x8x4_t q4_h = DistoHorizontalPass_NEON(q4_t); int32x2_t d_sum = DistoSum_NEON(q4_h, d4_w); // abs(sum2 - sum1) >> 5 d_sum = vabs_s32(d_sum); d_sum = vshr_n_s32(d_sum, 5); return vget_lane_s32(d_sum, 0); } } #undef LOAD_LANE_32b static int Disto16x16_NEON(const uint8_t* const a, const uint8_t* const b, const uint16_t* const w) { int D = 0; int x, y; for (y = 0; y < 16 * BPS; y += 4 * BPS) { for (x = 0; x < 16; x += 4) { D += Disto4x4_NEON(a + x + y, b + x + y, w); } } return D; } //------------------------------------------------------------------------------ static void CollectHistogram_NEON(const uint8_t* ref, const uint8_t* pred, int start_block, int end_block, VP8Histogram* const histo) { const uint16x8_t max_coeff_thresh = vdupq_n_u16(MAX_COEFF_THRESH); int j; int distribution[MAX_COEFF_THRESH + 1] = { 0 }; for (j = start_block; j < end_block; ++j) { int16_t out[16]; FTransform_NEON(ref + VP8DspScan[j], pred + VP8DspScan[j], out); { int k; const int16x8_t a0 = vld1q_s16(out + 0); const int16x8_t b0 = vld1q_s16(out + 8); const uint16x8_t a1 = vreinterpretq_u16_s16(vabsq_s16(a0)); const uint16x8_t b1 = vreinterpretq_u16_s16(vabsq_s16(b0)); const uint16x8_t a2 = vshrq_n_u16(a1, 3); const uint16x8_t b2 = vshrq_n_u16(b1, 3); const uint16x8_t a3 = vminq_u16(a2, max_coeff_thresh); const uint16x8_t b3 = vminq_u16(b2, max_coeff_thresh); vst1q_s16(out + 0, vreinterpretq_s16_u16(a3)); vst1q_s16(out + 8, vreinterpretq_s16_u16(b3)); // Convert coefficients to bin. for (k = 0; k < 16; ++k) { ++distribution[out[k]]; } } } VP8SetHistogramData(distribution, histo); } //------------------------------------------------------------------------------ static WEBP_INLINE void AccumulateSSE16_NEON(const uint8_t* const a, const uint8_t* const b, uint32x4_t* const sum) { const uint8x16_t a0 = vld1q_u8(a); const uint8x16_t b0 = vld1q_u8(b); const uint8x16_t abs_diff = vabdq_u8(a0, b0); const uint16x8_t prod1 = vmull_u8(vget_low_u8(abs_diff), vget_low_u8(abs_diff)); const uint16x8_t prod2 = vmull_u8(vget_high_u8(abs_diff), vget_high_u8(abs_diff)); /* pair-wise adds and widen */ const uint32x4_t sum1 = vpaddlq_u16(prod1); const uint32x4_t sum2 = vpaddlq_u16(prod2); *sum = vaddq_u32(*sum, vaddq_u32(sum1, sum2)); } // Horizontal sum of all four uint32_t values in 'sum'. static int SumToInt_NEON(uint32x4_t sum) { #if WEBP_AARCH64 return (int)vaddvq_u32(sum); #else const uint64x2_t sum2 = vpaddlq_u32(sum); const uint32x2_t sum3 = vadd_u32(vreinterpret_u32_u64(vget_low_u64(sum2)), vreinterpret_u32_u64(vget_high_u64(sum2))); return (int)vget_lane_u32(sum3, 0); #endif } static int SSE16x16_NEON(const uint8_t* a, const uint8_t* b) { uint32x4_t sum = vdupq_n_u32(0); int y; for (y = 0; y < 16; ++y) { AccumulateSSE16_NEON(a + y * BPS, b + y * BPS, &sum); } return SumToInt_NEON(sum); } static int SSE16x8_NEON(const uint8_t* a, const uint8_t* b) { uint32x4_t sum = vdupq_n_u32(0); int y; for (y = 0; y < 8; ++y) { AccumulateSSE16_NEON(a + y * BPS, b + y * BPS, &sum); } return SumToInt_NEON(sum); } static int SSE8x8_NEON(const uint8_t* a, const uint8_t* b) { uint32x4_t sum = vdupq_n_u32(0); int y; for (y = 0; y < 8; ++y) { const uint8x8_t a0 = vld1_u8(a + y * BPS); const uint8x8_t b0 = vld1_u8(b + y * BPS); const uint8x8_t abs_diff = vabd_u8(a0, b0); const uint16x8_t prod = vmull_u8(abs_diff, abs_diff); sum = vpadalq_u16(sum, prod); } return SumToInt_NEON(sum); } static int SSE4x4_NEON(const uint8_t* a, const uint8_t* b) { const uint8x16_t a0 = Load4x4_NEON(a); const uint8x16_t b0 = Load4x4_NEON(b); const uint8x16_t abs_diff = vabdq_u8(a0, b0); const uint16x8_t prod1 = vmull_u8(vget_low_u8(abs_diff), vget_low_u8(abs_diff)); const uint16x8_t prod2 = vmull_u8(vget_high_u8(abs_diff), vget_high_u8(abs_diff)); /* pair-wise adds and widen */ const uint32x4_t sum1 = vpaddlq_u16(prod1); const uint32x4_t sum2 = vpaddlq_u16(prod2); return SumToInt_NEON(vaddq_u32(sum1, sum2)); } //------------------------------------------------------------------------------ // Compilation with gcc-4.6.x is problematic for now. #if !defined(WORK_AROUND_GCC) static int16x8_t Quantize_NEON(int16_t* const in, const VP8Matrix* const mtx, int offset) { const uint16x8_t sharp = vld1q_u16(&mtx->sharpen_[offset]); const uint16x8_t q = vld1q_u16(&mtx->q_[offset]); const uint16x8_t iq = vld1q_u16(&mtx->iq_[offset]); const uint32x4_t bias0 = vld1q_u32(&mtx->bias_[offset + 0]); const uint32x4_t bias1 = vld1q_u32(&mtx->bias_[offset + 4]); const int16x8_t a = vld1q_s16(in + offset); // in const uint16x8_t b = vreinterpretq_u16_s16(vabsq_s16(a)); // coeff = abs(in) const int16x8_t sign = vshrq_n_s16(a, 15); // sign const uint16x8_t c = vaddq_u16(b, sharp); // + sharpen const uint32x4_t m0 = vmull_u16(vget_low_u16(c), vget_low_u16(iq)); const uint32x4_t m1 = vmull_u16(vget_high_u16(c), vget_high_u16(iq)); const uint32x4_t m2 = vhaddq_u32(m0, bias0); const uint32x4_t m3 = vhaddq_u32(m1, bias1); // (coeff * iQ + bias) >> 1 const uint16x8_t c0 = vcombine_u16(vshrn_n_u32(m2, 16), vshrn_n_u32(m3, 16)); // QFIX=17 = 16+1 const uint16x8_t c1 = vminq_u16(c0, vdupq_n_u16(MAX_LEVEL)); const int16x8_t c2 = veorq_s16(vreinterpretq_s16_u16(c1), sign); const int16x8_t c3 = vsubq_s16(c2, sign); // restore sign const int16x8_t c4 = vmulq_s16(c3, vreinterpretq_s16_u16(q)); vst1q_s16(in + offset, c4); assert(QFIX == 17); // this function can't work as is if QFIX != 16+1 return c3; } static const uint8_t kShuffles[4][8] = { { 0, 1, 2, 3, 8, 9, 16, 17 }, { 10, 11, 4, 5, 6, 7, 12, 13 }, { 18, 19, 24, 25, 26, 27, 20, 21 }, { 14, 15, 22, 23, 28, 29, 30, 31 } }; static int QuantizeBlock_NEON(int16_t in[16], int16_t out[16], const VP8Matrix* const mtx) { const int16x8_t out0 = Quantize_NEON(in, mtx, 0); const int16x8_t out1 = Quantize_NEON(in, mtx, 8); uint8x8x4_t shuffles; // vtbl?_u8 are marked unavailable for iOS arm64 with Xcode < 6.3, use // non-standard versions there. #if defined(__APPLE__) && WEBP_AARCH64 && \ defined(__apple_build_version__) && (__apple_build_version__< 6020037) uint8x16x2_t all_out; INIT_VECTOR2(all_out, vreinterpretq_u8_s16(out0), vreinterpretq_u8_s16(out1)); INIT_VECTOR4(shuffles, vtbl2q_u8(all_out, vld1_u8(kShuffles[0])), vtbl2q_u8(all_out, vld1_u8(kShuffles[1])), vtbl2q_u8(all_out, vld1_u8(kShuffles[2])), vtbl2q_u8(all_out, vld1_u8(kShuffles[3]))); #else uint8x8x4_t all_out; INIT_VECTOR4(all_out, vreinterpret_u8_s16(vget_low_s16(out0)), vreinterpret_u8_s16(vget_high_s16(out0)), vreinterpret_u8_s16(vget_low_s16(out1)), vreinterpret_u8_s16(vget_high_s16(out1))); INIT_VECTOR4(shuffles, vtbl4_u8(all_out, vld1_u8(kShuffles[0])), vtbl4_u8(all_out, vld1_u8(kShuffles[1])), vtbl4_u8(all_out, vld1_u8(kShuffles[2])), vtbl4_u8(all_out, vld1_u8(kShuffles[3]))); #endif // Zigzag reordering vst1_u8((uint8_t*)(out + 0), shuffles.val[0]); vst1_u8((uint8_t*)(out + 4), shuffles.val[1]); vst1_u8((uint8_t*)(out + 8), shuffles.val[2]); vst1_u8((uint8_t*)(out + 12), shuffles.val[3]); // test zeros if (*(uint64_t*)(out + 0) != 0) return 1; if (*(uint64_t*)(out + 4) != 0) return 1; if (*(uint64_t*)(out + 8) != 0) return 1; if (*(uint64_t*)(out + 12) != 0) return 1; return 0; } static int Quantize2Blocks_NEON(int16_t in[32], int16_t out[32], const VP8Matrix* const mtx) { int nz; nz = QuantizeBlock_NEON(in + 0 * 16, out + 0 * 16, mtx) << 0; nz |= QuantizeBlock_NEON(in + 1 * 16, out + 1 * 16, mtx) << 1; return nz; } #endif // !WORK_AROUND_GCC //------------------------------------------------------------------------------ // Entry point extern void VP8EncDspInitNEON(void); WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspInitNEON(void) { VP8ITransform = ITransform_NEON; VP8FTransform = FTransform_NEON; VP8FTransformWHT = FTransformWHT_NEON; VP8TDisto4x4 = Disto4x4_NEON; VP8TDisto16x16 = Disto16x16_NEON; VP8CollectHistogram = CollectHistogram_NEON; VP8SSE16x16 = SSE16x16_NEON; VP8SSE16x8 = SSE16x8_NEON; VP8SSE8x8 = SSE8x8_NEON; VP8SSE4x4 = SSE4x4_NEON; #if !defined(WORK_AROUND_GCC) VP8EncQuantizeBlock = QuantizeBlock_NEON; VP8EncQuantize2Blocks = Quantize2Blocks_NEON; #endif } #else // !WEBP_USE_NEON WEBP_DSP_INIT_STUB(VP8EncDspInitNEON) #endif // WEBP_USE_NEON libwebp-1.4.0/src/dsp/yuv_mips_dsp_r2.c0000644000014400001440000001760014606317060014724 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // MIPS DSPr2 version of YUV to RGB upsampling functions. // // Author(s): Branimir Vasic (branimir.vasic@imgtec.com) // Djordje Pesut (djordje.pesut@imgtec.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_MIPS_DSP_R2) #include "src/dsp/yuv.h" //------------------------------------------------------------------------------ // simple point-sampling #define ROW_FUNC_PART_1() \ "lbu %[temp3], 0(%[v]) \n\t" \ "lbu %[temp4], 0(%[u]) \n\t" \ "lbu %[temp0], 0(%[y]) \n\t" \ "mul %[temp1], %[t_con_1], %[temp3] \n\t" \ "mul %[temp3], %[t_con_2], %[temp3] \n\t" \ "mul %[temp2], %[t_con_3], %[temp4] \n\t" \ "mul %[temp4], %[t_con_4], %[temp4] \n\t" \ "mul %[temp0], %[t_con_5], %[temp0] \n\t" \ "subu %[temp1], %[temp1], %[t_con_6] \n\t" \ "subu %[temp3], %[temp3], %[t_con_7] \n\t" \ "addu %[temp2], %[temp2], %[temp3] \n\t" \ "subu %[temp4], %[temp4], %[t_con_8] \n\t" \ #define ROW_FUNC_PART_2(R, G, B, K) \ "addu %[temp5], %[temp0], %[temp1] \n\t" \ "subu %[temp6], %[temp0], %[temp2] \n\t" \ "addu %[temp7], %[temp0], %[temp4] \n\t" \ ".if " #K " \n\t" \ "lbu %[temp0], 1(%[y]) \n\t" \ ".endif \n\t" \ "shll_s.w %[temp5], %[temp5], 17 \n\t" \ "shll_s.w %[temp6], %[temp6], 17 \n\t" \ ".if " #K " \n\t" \ "mul %[temp0], %[t_con_5], %[temp0] \n\t" \ ".endif \n\t" \ "shll_s.w %[temp7], %[temp7], 17 \n\t" \ "precrqu_s.qb.ph %[temp5], %[temp5], $zero \n\t" \ "precrqu_s.qb.ph %[temp6], %[temp6], $zero \n\t" \ "precrqu_s.qb.ph %[temp7], %[temp7], $zero \n\t" \ "srl %[temp5], %[temp5], 24 \n\t" \ "srl %[temp6], %[temp6], 24 \n\t" \ "srl %[temp7], %[temp7], 24 \n\t" \ "sb %[temp5], " #R "(%[dst]) \n\t" \ "sb %[temp6], " #G "(%[dst]) \n\t" \ "sb %[temp7], " #B "(%[dst]) \n\t" \ #define ASM_CLOBBER_LIST() \ : [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2), \ [temp3]"=&r"(temp3), [temp4]"=&r"(temp4), [temp5]"=&r"(temp5), \ [temp6]"=&r"(temp6), [temp7]"=&r"(temp7) \ : [t_con_1]"r"(t_con_1), [t_con_2]"r"(t_con_2), [t_con_3]"r"(t_con_3), \ [t_con_4]"r"(t_con_4), [t_con_5]"r"(t_con_5), [t_con_6]"r"(t_con_6), \ [u]"r"(u), [v]"r"(v), [y]"r"(y), [dst]"r"(dst), \ [t_con_7]"r"(t_con_7), [t_con_8]"r"(t_con_8) \ : "memory", "hi", "lo" \ #define ROW_FUNC(FUNC_NAME, XSTEP, R, G, B, A) \ static void FUNC_NAME(const uint8_t* y, \ const uint8_t* u, const uint8_t* v, \ uint8_t* dst, int len) { \ int i; \ uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7; \ const int t_con_1 = 26149; \ const int t_con_2 = 13320; \ const int t_con_3 = 6419; \ const int t_con_4 = 33050; \ const int t_con_5 = 19077; \ const int t_con_6 = 14234; \ const int t_con_7 = 8708; \ const int t_con_8 = 17685; \ for (i = 0; i < (len >> 1); i++) { \ __asm__ volatile ( \ ROW_FUNC_PART_1() \ ROW_FUNC_PART_2(R, G, B, 1) \ ROW_FUNC_PART_2(R + XSTEP, G + XSTEP, B + XSTEP, 0) \ ASM_CLOBBER_LIST() \ ); \ if (A) dst[A] = dst[A + XSTEP] = 0xff; \ y += 2; \ ++u; \ ++v; \ dst += 2 * XSTEP; \ } \ if (len & 1) { \ __asm__ volatile ( \ ROW_FUNC_PART_1() \ ROW_FUNC_PART_2(R, G, B, 0) \ ASM_CLOBBER_LIST() \ ); \ if (A) dst[A] = 0xff; \ } \ } ROW_FUNC(YuvToRgbRow_MIPSdspR2, 3, 0, 1, 2, 0) ROW_FUNC(YuvToRgbaRow_MIPSdspR2, 4, 0, 1, 2, 3) ROW_FUNC(YuvToBgrRow_MIPSdspR2, 3, 2, 1, 0, 0) ROW_FUNC(YuvToBgraRow_MIPSdspR2, 4, 2, 1, 0, 3) #undef ROW_FUNC #undef ASM_CLOBBER_LIST #undef ROW_FUNC_PART_2 #undef ROW_FUNC_PART_1 //------------------------------------------------------------------------------ // Entry point extern void WebPInitSamplersMIPSdspR2(void); WEBP_TSAN_IGNORE_FUNCTION void WebPInitSamplersMIPSdspR2(void) { WebPSamplers[MODE_RGB] = YuvToRgbRow_MIPSdspR2; WebPSamplers[MODE_RGBA] = YuvToRgbaRow_MIPSdspR2; WebPSamplers[MODE_BGR] = YuvToBgrRow_MIPSdspR2; WebPSamplers[MODE_BGRA] = YuvToBgraRow_MIPSdspR2; } #else // !WEBP_USE_MIPS_DSP_R2 WEBP_DSP_INIT_STUB(WebPInitSamplersMIPSdspR2) #endif // WEBP_USE_MIPS_DSP_R2 libwebp-1.4.0/src/dsp/lossless_enc_sse2.c0000644000014400001440000007100614606317060015230 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // SSE2 variant of methods for lossless encoder // // Author: Skal (pascal.massimino@gmail.com) #include "src/dsp/dsp.h" #if defined(WEBP_USE_SSE2) #include #include #include "src/dsp/lossless.h" #include "src/dsp/common_sse2.h" #include "src/dsp/lossless_common.h" // For sign-extended multiplying constants, pre-shifted by 5: #define CST_5b(X) (((int16_t)((uint16_t)(X) << 8)) >> 5) //------------------------------------------------------------------------------ // Subtract-Green Transform static void SubtractGreenFromBlueAndRed_SSE2(uint32_t* argb_data, int num_pixels) { int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb const __m128i A = _mm_srli_epi16(in, 8); // 0 a 0 g const __m128i B = _mm_shufflelo_epi16(A, _MM_SHUFFLE(2, 2, 0, 0)); const __m128i C = _mm_shufflehi_epi16(B, _MM_SHUFFLE(2, 2, 0, 0)); // 0g0g const __m128i out = _mm_sub_epi8(in, C); _mm_storeu_si128((__m128i*)&argb_data[i], out); } // fallthrough and finish off with plain-C if (i != num_pixels) { VP8LSubtractGreenFromBlueAndRed_C(argb_data + i, num_pixels - i); } } //------------------------------------------------------------------------------ // Color Transform #define MK_CST_16(HI, LO) \ _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff))) static void TransformColor_SSE2(const VP8LMultipliers* const m, uint32_t* argb_data, int num_pixels) { const __m128i mults_rb = MK_CST_16(CST_5b(m->green_to_red_), CST_5b(m->green_to_blue_)); const __m128i mults_b2 = MK_CST_16(CST_5b(m->red_to_blue_), 0); const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb const __m128i A = _mm_and_si128(in, mask_ag); // a 0 g 0 const __m128i B = _mm_shufflelo_epi16(A, _MM_SHUFFLE(2, 2, 0, 0)); const __m128i C = _mm_shufflehi_epi16(B, _MM_SHUFFLE(2, 2, 0, 0)); // g0g0 const __m128i D = _mm_mulhi_epi16(C, mults_rb); // x dr x db1 const __m128i E = _mm_slli_epi16(in, 8); // r 0 b 0 const __m128i F = _mm_mulhi_epi16(E, mults_b2); // x db2 0 0 const __m128i G = _mm_srli_epi32(F, 16); // 0 0 x db2 const __m128i H = _mm_add_epi8(G, D); // x dr x db const __m128i I = _mm_and_si128(H, mask_rb); // 0 dr 0 db const __m128i out = _mm_sub_epi8(in, I); _mm_storeu_si128((__m128i*)&argb_data[i], out); } // fallthrough and finish off with plain-C if (i != num_pixels) { VP8LTransformColor_C(m, argb_data + i, num_pixels - i); } } //------------------------------------------------------------------------------ #define SPAN 8 static void CollectColorBlueTransforms_SSE2(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_blue, int red_to_blue, int histo[]) { const __m128i mults_r = MK_CST_16(CST_5b(red_to_blue), 0); const __m128i mults_g = MK_CST_16(0, CST_5b(green_to_blue)); const __m128i mask_g = _mm_set1_epi32(0x00ff00); // green mask const __m128i mask_b = _mm_set1_epi32(0x0000ff); // blue mask int y; for (y = 0; y < tile_height; ++y) { const uint32_t* const src = argb + y * stride; int i, x; for (x = 0; x + SPAN <= tile_width; x += SPAN) { uint16_t values[SPAN]; const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]); const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]); const __m128i A0 = _mm_slli_epi16(in0, 8); // r 0 | b 0 const __m128i A1 = _mm_slli_epi16(in1, 8); const __m128i B0 = _mm_and_si128(in0, mask_g); // 0 0 | g 0 const __m128i B1 = _mm_and_si128(in1, mask_g); const __m128i C0 = _mm_mulhi_epi16(A0, mults_r); // x db | 0 0 const __m128i C1 = _mm_mulhi_epi16(A1, mults_r); const __m128i D0 = _mm_mulhi_epi16(B0, mults_g); // 0 0 | x db const __m128i D1 = _mm_mulhi_epi16(B1, mults_g); const __m128i E0 = _mm_sub_epi8(in0, D0); // x x | x b' const __m128i E1 = _mm_sub_epi8(in1, D1); const __m128i F0 = _mm_srli_epi32(C0, 16); // 0 0 | x db const __m128i F1 = _mm_srli_epi32(C1, 16); const __m128i G0 = _mm_sub_epi8(E0, F0); // 0 0 | x b' const __m128i G1 = _mm_sub_epi8(E1, F1); const __m128i H0 = _mm_and_si128(G0, mask_b); // 0 0 | 0 b const __m128i H1 = _mm_and_si128(G1, mask_b); const __m128i I = _mm_packs_epi32(H0, H1); // 0 b' | 0 b' _mm_storeu_si128((__m128i*)values, I); for (i = 0; i < SPAN; ++i) ++histo[values[i]]; } } { const int left_over = tile_width & (SPAN - 1); if (left_over > 0) { VP8LCollectColorBlueTransforms_C(argb + tile_width - left_over, stride, left_over, tile_height, green_to_blue, red_to_blue, histo); } } } static void CollectColorRedTransforms_SSE2(const uint32_t* argb, int stride, int tile_width, int tile_height, int green_to_red, int histo[]) { const __m128i mults_g = MK_CST_16(0, CST_5b(green_to_red)); const __m128i mask_g = _mm_set1_epi32(0x00ff00); // green mask const __m128i mask = _mm_set1_epi32(0xff); int y; for (y = 0; y < tile_height; ++y) { const uint32_t* const src = argb + y * stride; int i, x; for (x = 0; x + SPAN <= tile_width; x += SPAN) { uint16_t values[SPAN]; const __m128i in0 = _mm_loadu_si128((__m128i*)&src[x + 0]); const __m128i in1 = _mm_loadu_si128((__m128i*)&src[x + SPAN / 2]); const __m128i A0 = _mm_and_si128(in0, mask_g); // 0 0 | g 0 const __m128i A1 = _mm_and_si128(in1, mask_g); const __m128i B0 = _mm_srli_epi32(in0, 16); // 0 0 | x r const __m128i B1 = _mm_srli_epi32(in1, 16); const __m128i C0 = _mm_mulhi_epi16(A0, mults_g); // 0 0 | x dr const __m128i C1 = _mm_mulhi_epi16(A1, mults_g); const __m128i E0 = _mm_sub_epi8(B0, C0); // x x | x r' const __m128i E1 = _mm_sub_epi8(B1, C1); const __m128i F0 = _mm_and_si128(E0, mask); // 0 0 | 0 r' const __m128i F1 = _mm_and_si128(E1, mask); const __m128i I = _mm_packs_epi32(F0, F1); _mm_storeu_si128((__m128i*)values, I); for (i = 0; i < SPAN; ++i) ++histo[values[i]]; } } { const int left_over = tile_width & (SPAN - 1); if (left_over > 0) { VP8LCollectColorRedTransforms_C(argb + tile_width - left_over, stride, left_over, tile_height, green_to_red, histo); } } } #undef SPAN #undef MK_CST_16 //------------------------------------------------------------------------------ // Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But // that's ok since the histogram values are less than 1<<28 (max picture size). #define LINE_SIZE 16 // 8 or 16 static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out, int size) { int i; for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) { const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]); #if (LINE_SIZE == 16) const __m128i a2 = _mm_loadu_si128((const __m128i*)&a[i + 8]); const __m128i a3 = _mm_loadu_si128((const __m128i*)&a[i + 12]); #endif const __m128i b0 = _mm_loadu_si128((const __m128i*)&b[i + 0]); const __m128i b1 = _mm_loadu_si128((const __m128i*)&b[i + 4]); #if (LINE_SIZE == 16) const __m128i b2 = _mm_loadu_si128((const __m128i*)&b[i + 8]); const __m128i b3 = _mm_loadu_si128((const __m128i*)&b[i + 12]); #endif _mm_storeu_si128((__m128i*)&out[i + 0], _mm_add_epi32(a0, b0)); _mm_storeu_si128((__m128i*)&out[i + 4], _mm_add_epi32(a1, b1)); #if (LINE_SIZE == 16) _mm_storeu_si128((__m128i*)&out[i + 8], _mm_add_epi32(a2, b2)); _mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3)); #endif } for (; i < size; ++i) { out[i] = a[i] + b[i]; } } static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) { int i; for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) { const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]); const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]); #if (LINE_SIZE == 16) const __m128i a2 = _mm_loadu_si128((const __m128i*)&a[i + 8]); const __m128i a3 = _mm_loadu_si128((const __m128i*)&a[i + 12]); #endif const __m128i b0 = _mm_loadu_si128((const __m128i*)&out[i + 0]); const __m128i b1 = _mm_loadu_si128((const __m128i*)&out[i + 4]); #if (LINE_SIZE == 16) const __m128i b2 = _mm_loadu_si128((const __m128i*)&out[i + 8]); const __m128i b3 = _mm_loadu_si128((const __m128i*)&out[i + 12]); #endif _mm_storeu_si128((__m128i*)&out[i + 0], _mm_add_epi32(a0, b0)); _mm_storeu_si128((__m128i*)&out[i + 4], _mm_add_epi32(a1, b1)); #if (LINE_SIZE == 16) _mm_storeu_si128((__m128i*)&out[i + 8], _mm_add_epi32(a2, b2)); _mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3)); #endif } for (; i < size; ++i) { out[i] += a[i]; } } #undef LINE_SIZE //------------------------------------------------------------------------------ // Entropy // TODO(https://crbug.com/webp/499): this function produces different results // from the C code due to use of double/float resulting in output differences // when compared to -noasm. #if !(defined(WEBP_HAVE_SLOW_CLZ_CTZ) || defined(__i386__) || defined(_M_IX86)) static float CombinedShannonEntropy_SSE2(const int X[256], const int Y[256]) { int i; float retval = 0.f; int sumX = 0, sumXY = 0; const __m128i zero = _mm_setzero_si128(); for (i = 0; i < 256; i += 16) { const __m128i x0 = _mm_loadu_si128((const __m128i*)(X + i + 0)); const __m128i y0 = _mm_loadu_si128((const __m128i*)(Y + i + 0)); const __m128i x1 = _mm_loadu_si128((const __m128i*)(X + i + 4)); const __m128i y1 = _mm_loadu_si128((const __m128i*)(Y + i + 4)); const __m128i x2 = _mm_loadu_si128((const __m128i*)(X + i + 8)); const __m128i y2 = _mm_loadu_si128((const __m128i*)(Y + i + 8)); const __m128i x3 = _mm_loadu_si128((const __m128i*)(X + i + 12)); const __m128i y3 = _mm_loadu_si128((const __m128i*)(Y + i + 12)); const __m128i x4 = _mm_packs_epi16(_mm_packs_epi32(x0, x1), _mm_packs_epi32(x2, x3)); const __m128i y4 = _mm_packs_epi16(_mm_packs_epi32(y0, y1), _mm_packs_epi32(y2, y3)); const int32_t mx = _mm_movemask_epi8(_mm_cmpgt_epi8(x4, zero)); int32_t my = _mm_movemask_epi8(_mm_cmpgt_epi8(y4, zero)) | mx; while (my) { const int32_t j = BitsCtz(my); int xy; if ((mx >> j) & 1) { const int x = X[i + j]; sumXY += x; retval -= VP8LFastSLog2(x); } xy = X[i + j] + Y[i + j]; sumX += xy; retval -= VP8LFastSLog2(xy); my &= my - 1; } } retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY); return retval; } #else #define DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC // won't be faster #endif //------------------------------------------------------------------------------ static int VectorMismatch_SSE2(const uint32_t* const array1, const uint32_t* const array2, int length) { int match_len; if (length >= 12) { __m128i A0 = _mm_loadu_si128((const __m128i*)&array1[0]); __m128i A1 = _mm_loadu_si128((const __m128i*)&array2[0]); match_len = 0; do { // Loop unrolling and early load both provide a speedup of 10% for the // current function. Also, max_limit can be MAX_LENGTH=4096 at most. const __m128i cmpA = _mm_cmpeq_epi32(A0, A1); const __m128i B0 = _mm_loadu_si128((const __m128i*)&array1[match_len + 4]); const __m128i B1 = _mm_loadu_si128((const __m128i*)&array2[match_len + 4]); if (_mm_movemask_epi8(cmpA) != 0xffff) break; match_len += 4; { const __m128i cmpB = _mm_cmpeq_epi32(B0, B1); A0 = _mm_loadu_si128((const __m128i*)&array1[match_len + 4]); A1 = _mm_loadu_si128((const __m128i*)&array2[match_len + 4]); if (_mm_movemask_epi8(cmpB) != 0xffff) break; match_len += 4; } } while (match_len + 12 < length); } else { match_len = 0; // Unroll the potential first two loops. if (length >= 4 && _mm_movemask_epi8(_mm_cmpeq_epi32( _mm_loadu_si128((const __m128i*)&array1[0]), _mm_loadu_si128((const __m128i*)&array2[0]))) == 0xffff) { match_len = 4; if (length >= 8 && _mm_movemask_epi8(_mm_cmpeq_epi32( _mm_loadu_si128((const __m128i*)&array1[4]), _mm_loadu_si128((const __m128i*)&array2[4]))) == 0xffff) { match_len = 8; } } } while (match_len < length && array1[match_len] == array2[match_len]) { ++match_len; } return match_len; } // Bundles multiple (1, 2, 4 or 8) pixels into a single pixel. static void BundleColorMap_SSE2(const uint8_t* const row, int width, int xbits, uint32_t* dst) { int x; assert(xbits >= 0); assert(xbits <= 3); switch (xbits) { case 0: { const __m128i ff = _mm_set1_epi16((short)0xff00); const __m128i zero = _mm_setzero_si128(); // Store 0xff000000 | (row[x] << 8). for (x = 0; x + 16 <= width; x += 16, dst += 16) { const __m128i in = _mm_loadu_si128((const __m128i*)&row[x]); const __m128i in_lo = _mm_unpacklo_epi8(zero, in); const __m128i dst0 = _mm_unpacklo_epi16(in_lo, ff); const __m128i dst1 = _mm_unpackhi_epi16(in_lo, ff); const __m128i in_hi = _mm_unpackhi_epi8(zero, in); const __m128i dst2 = _mm_unpacklo_epi16(in_hi, ff); const __m128i dst3 = _mm_unpackhi_epi16(in_hi, ff); _mm_storeu_si128((__m128i*)&dst[0], dst0); _mm_storeu_si128((__m128i*)&dst[4], dst1); _mm_storeu_si128((__m128i*)&dst[8], dst2); _mm_storeu_si128((__m128i*)&dst[12], dst3); } break; } case 1: { const __m128i ff = _mm_set1_epi16((short)0xff00); const __m128i mul = _mm_set1_epi16(0x110); for (x = 0; x + 16 <= width; x += 16, dst += 8) { // 0a0b | (where a/b are 4 bits). const __m128i in = _mm_loadu_si128((const __m128i*)&row[x]); const __m128i tmp = _mm_mullo_epi16(in, mul); // aba0 const __m128i pack = _mm_and_si128(tmp, ff); // ab00 const __m128i dst0 = _mm_unpacklo_epi16(pack, ff); const __m128i dst1 = _mm_unpackhi_epi16(pack, ff); _mm_storeu_si128((__m128i*)&dst[0], dst0); _mm_storeu_si128((__m128i*)&dst[4], dst1); } break; } case 2: { const __m128i mask_or = _mm_set1_epi32((int)0xff000000); const __m128i mul_cst = _mm_set1_epi16(0x0104); const __m128i mask_mul = _mm_set1_epi16(0x0f00); for (x = 0; x + 16 <= width; x += 16, dst += 4) { // 000a000b000c000d | (where a/b/c/d are 2 bits). const __m128i in = _mm_loadu_si128((const __m128i*)&row[x]); const __m128i mul = _mm_mullo_epi16(in, mul_cst); // 00ab00b000cd00d0 const __m128i tmp = _mm_and_si128(mul, mask_mul); // 00ab000000cd0000 const __m128i shift = _mm_srli_epi32(tmp, 12); // 00000000ab000000 const __m128i pack = _mm_or_si128(shift, tmp); // 00000000abcd0000 // Convert to 0xff00**00. const __m128i res = _mm_or_si128(pack, mask_or); _mm_storeu_si128((__m128i*)dst, res); } break; } default: { assert(xbits == 3); for (x = 0; x + 16 <= width; x += 16, dst += 2) { // 0000000a00000000b... | (where a/b are 1 bit). const __m128i in = _mm_loadu_si128((const __m128i*)&row[x]); const __m128i shift = _mm_slli_epi64(in, 7); const uint32_t move = _mm_movemask_epi8(shift); dst[0] = 0xff000000 | ((move & 0xff) << 8); dst[1] = 0xff000000 | (move & 0xff00); } break; } } if (x != width) { VP8LBundleColorMap_C(row + x, width - x, xbits, dst); } } //------------------------------------------------------------------------------ // Batch version of Predictor Transform subtraction static WEBP_INLINE void Average2_m128i(const __m128i* const a0, const __m128i* const a1, __m128i* const avg) { // (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1) const __m128i ones = _mm_set1_epi8(1); const __m128i avg1 = _mm_avg_epu8(*a0, *a1); const __m128i one = _mm_and_si128(_mm_xor_si128(*a0, *a1), ones); *avg = _mm_sub_epi8(avg1, one); } // Predictor0: ARGB_BLACK. static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i black = _mm_set1_epi32((int)ARGB_BLACK); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i res = _mm_sub_epi8(src, black); _mm_storeu_si128((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsSub_C[0](in + i, NULL, num_pixels - i, out + i); } (void)upper; } #define GENERATE_PREDICTOR_1(X, IN) \ static void PredictorSub##X##_SSE2(const uint32_t* const in, \ const uint32_t* const upper, \ int num_pixels, uint32_t* const out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \ const __m128i pred = _mm_loadu_si128((const __m128i*)&(IN)); \ const __m128i res = _mm_sub_epi8(src, pred); \ _mm_storeu_si128((__m128i*)&out[i], res); \ } \ if (i != num_pixels) { \ VP8LPredictorsSub_C[(X)](in + i, WEBP_OFFSET_PTR(upper, i), \ num_pixels - i, out + i); \ } \ } GENERATE_PREDICTOR_1(1, in[i - 1]) // Predictor1: L GENERATE_PREDICTOR_1(2, upper[i]) // Predictor2: T GENERATE_PREDICTOR_1(3, upper[i + 1]) // Predictor3: TR GENERATE_PREDICTOR_1(4, upper[i - 1]) // Predictor4: TL #undef GENERATE_PREDICTOR_1 // Predictor5: avg2(avg2(L, TR), T) static void PredictorSub5_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i L = _mm_loadu_si128((const __m128i*)&in[i - 1]); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i TR = _mm_loadu_si128((const __m128i*)&upper[i + 1]); const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); __m128i avg, pred, res; Average2_m128i(&L, &TR, &avg); Average2_m128i(&avg, &T, &pred); res = _mm_sub_epi8(src, pred); _mm_storeu_si128((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsSub_C[5](in + i, upper + i, num_pixels - i, out + i); } } #define GENERATE_PREDICTOR_2(X, A, B) \ static void PredictorSub##X##_SSE2(const uint32_t* in, const uint32_t* upper, \ int num_pixels, uint32_t* out) { \ int i; \ for (i = 0; i + 4 <= num_pixels; i += 4) { \ const __m128i tA = _mm_loadu_si128((const __m128i*)&(A)); \ const __m128i tB = _mm_loadu_si128((const __m128i*)&(B)); \ const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); \ __m128i pred, res; \ Average2_m128i(&tA, &tB, &pred); \ res = _mm_sub_epi8(src, pred); \ _mm_storeu_si128((__m128i*)&out[i], res); \ } \ if (i != num_pixels) { \ VP8LPredictorsSub_C[(X)](in + i, upper + i, num_pixels - i, out + i); \ } \ } GENERATE_PREDICTOR_2(6, in[i - 1], upper[i - 1]) // Predictor6: avg(L, TL) GENERATE_PREDICTOR_2(7, in[i - 1], upper[i]) // Predictor7: avg(L, T) GENERATE_PREDICTOR_2(8, upper[i - 1], upper[i]) // Predictor8: avg(TL, T) GENERATE_PREDICTOR_2(9, upper[i], upper[i + 1]) // Predictor9: average(T, TR) #undef GENERATE_PREDICTOR_2 // Predictor10: avg(avg(L,TL), avg(T, TR)). static void PredictorSub10_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i L = _mm_loadu_si128((const __m128i*)&in[i - 1]); const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i TR = _mm_loadu_si128((const __m128i*)&upper[i + 1]); __m128i avgTTR, avgLTL, avg, res; Average2_m128i(&T, &TR, &avgTTR); Average2_m128i(&L, &TL, &avgLTL); Average2_m128i(&avgTTR, &avgLTL, &avg); res = _mm_sub_epi8(src, avg); _mm_storeu_si128((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsSub_C[10](in + i, upper + i, num_pixels - i, out + i); } } // Predictor11: select. static void GetSumAbsDiff32_SSE2(const __m128i* const A, const __m128i* const B, __m128i* const out) { // We can unpack with any value on the upper 32 bits, provided it's the same // on both operands (to that their sum of abs diff is zero). Here we use *A. const __m128i A_lo = _mm_unpacklo_epi32(*A, *A); const __m128i B_lo = _mm_unpacklo_epi32(*B, *A); const __m128i A_hi = _mm_unpackhi_epi32(*A, *A); const __m128i B_hi = _mm_unpackhi_epi32(*B, *A); const __m128i s_lo = _mm_sad_epu8(A_lo, B_lo); const __m128i s_hi = _mm_sad_epu8(A_hi, B_hi); *out = _mm_packs_epi32(s_lo, s_hi); } static void PredictorSub11_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i L = _mm_loadu_si128((const __m128i*)&in[i - 1]); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); __m128i pa, pb; GetSumAbsDiff32_SSE2(&T, &TL, &pa); // pa = sum |T-TL| GetSumAbsDiff32_SSE2(&L, &TL, &pb); // pb = sum |L-TL| { const __m128i mask = _mm_cmpgt_epi32(pb, pa); const __m128i A = _mm_and_si128(mask, L); const __m128i B = _mm_andnot_si128(mask, T); const __m128i pred = _mm_or_si128(A, B); // pred = (L > T)? L : T const __m128i res = _mm_sub_epi8(src, pred); _mm_storeu_si128((__m128i*)&out[i], res); } } if (i != num_pixels) { VP8LPredictorsSub_C[11](in + i, upper + i, num_pixels - i, out + i); } } // Predictor12: ClampedSubSubtractFull. static void PredictorSub12_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i zero = _mm_setzero_si128(); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i L = _mm_loadu_si128((const __m128i*)&in[i - 1]); const __m128i L_lo = _mm_unpacklo_epi8(L, zero); const __m128i L_hi = _mm_unpackhi_epi8(L, zero); const __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); const __m128i T_lo = _mm_unpacklo_epi8(T, zero); const __m128i T_hi = _mm_unpackhi_epi8(T, zero); const __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); const __m128i TL_lo = _mm_unpacklo_epi8(TL, zero); const __m128i TL_hi = _mm_unpackhi_epi8(TL, zero); const __m128i diff_lo = _mm_sub_epi16(T_lo, TL_lo); const __m128i diff_hi = _mm_sub_epi16(T_hi, TL_hi); const __m128i pred_lo = _mm_add_epi16(L_lo, diff_lo); const __m128i pred_hi = _mm_add_epi16(L_hi, diff_hi); const __m128i pred = _mm_packus_epi16(pred_lo, pred_hi); const __m128i res = _mm_sub_epi8(src, pred); _mm_storeu_si128((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsSub_C[12](in + i, upper + i, num_pixels - i, out + i); } } // Predictors13: ClampedAddSubtractHalf static void PredictorSub13_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i zero = _mm_setzero_si128(); for (i = 0; i + 2 <= num_pixels; i += 2) { // we can only process two pixels at a time const __m128i L = _mm_loadl_epi64((const __m128i*)&in[i - 1]); const __m128i src = _mm_loadl_epi64((const __m128i*)&in[i]); const __m128i T = _mm_loadl_epi64((const __m128i*)&upper[i]); const __m128i TL = _mm_loadl_epi64((const __m128i*)&upper[i - 1]); const __m128i L_lo = _mm_unpacklo_epi8(L, zero); const __m128i T_lo = _mm_unpacklo_epi8(T, zero); const __m128i TL_lo = _mm_unpacklo_epi8(TL, zero); const __m128i sum = _mm_add_epi16(T_lo, L_lo); const __m128i avg = _mm_srli_epi16(sum, 1); const __m128i A1 = _mm_sub_epi16(avg, TL_lo); const __m128i bit_fix = _mm_cmpgt_epi16(TL_lo, avg); const __m128i A2 = _mm_sub_epi16(A1, bit_fix); const __m128i A3 = _mm_srai_epi16(A2, 1); const __m128i A4 = _mm_add_epi16(avg, A3); const __m128i pred = _mm_packus_epi16(A4, A4); const __m128i res = _mm_sub_epi8(src, pred); _mm_storel_epi64((__m128i*)&out[i], res); } if (i != num_pixels) { VP8LPredictorsSub_C[13](in + i, upper + i, num_pixels - i, out + i); } } //------------------------------------------------------------------------------ // Entry point extern void VP8LEncDspInitSSE2(void); WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE2(void) { VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_SSE2; VP8LTransformColor = TransformColor_SSE2; VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE2; VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE2; VP8LAddVector = AddVector_SSE2; VP8LAddVectorEq = AddVectorEq_SSE2; #if !defined(DONT_USE_COMBINED_SHANNON_ENTROPY_SSE2_FUNC) VP8LCombinedShannonEntropy = CombinedShannonEntropy_SSE2; #endif VP8LVectorMismatch = VectorMismatch_SSE2; VP8LBundleColorMap = BundleColorMap_SSE2; VP8LPredictorsSub[0] = PredictorSub0_SSE2; VP8LPredictorsSub[1] = PredictorSub1_SSE2; VP8LPredictorsSub[2] = PredictorSub2_SSE2; VP8LPredictorsSub[3] = PredictorSub3_SSE2; VP8LPredictorsSub[4] = PredictorSub4_SSE2; VP8LPredictorsSub[5] = PredictorSub5_SSE2; VP8LPredictorsSub[6] = PredictorSub6_SSE2; VP8LPredictorsSub[7] = PredictorSub7_SSE2; VP8LPredictorsSub[8] = PredictorSub8_SSE2; VP8LPredictorsSub[9] = PredictorSub9_SSE2; VP8LPredictorsSub[10] = PredictorSub10_SSE2; VP8LPredictorsSub[11] = PredictorSub11_SSE2; VP8LPredictorsSub[12] = PredictorSub12_SSE2; VP8LPredictorsSub[13] = PredictorSub13_SSE2; VP8LPredictorsSub[14] = PredictorSub0_SSE2; // <- padding security sentinels VP8LPredictorsSub[15] = PredictorSub0_SSE2; } #else // !WEBP_USE_SSE2 WEBP_DSP_INIT_STUB(VP8LEncDspInitSSE2) #endif // WEBP_USE_SSE2 libwebp-1.4.0/src/libwebpdecoder.rc0000644000014400001440000000202314606317060014137 0ustar #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" #undef APSTUDIO_READONLY_SYMBOLS #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,4,0 PRODUCTVERSION 1,0,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Google, Inc." VALUE "FileDescription", "libwebpdecoder DLL" VALUE "FileVersion", "1.4.0" VALUE "InternalName", "libwebpdecoder.dll" VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "libwebpdecoder.dll" VALUE "ProductName", "WebP Image Decoder" VALUE "ProductVersion", "1.4.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources libwebp-1.4.0/src/dec/0000755000014400001440000000000014606317244011401 5ustar libwebp-1.4.0/src/dec/vp8l_dec.c0000644000014400001440000017163314606317060013260 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // main entry for the decoder // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) #include #include #include "src/dec/alphai_dec.h" #include "src/dec/vp8li_dec.h" #include "src/dsp/dsp.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/dsp/yuv.h" #include "src/utils/endian_inl_utils.h" #include "src/utils/huffman_utils.h" #include "src/utils/utils.h" #define NUM_ARGB_CACHE_ROWS 16 static const int kCodeLengthLiterals = 16; static const int kCodeLengthRepeatCode = 16; static const uint8_t kCodeLengthExtraBits[3] = { 2, 3, 7 }; static const uint8_t kCodeLengthRepeatOffsets[3] = { 3, 3, 11 }; // ----------------------------------------------------------------------------- // Five Huffman codes are used at each meta code: // 1. green + length prefix codes + color cache codes, // 2. alpha, // 3. red, // 4. blue, and, // 5. distance prefix codes. typedef enum { GREEN = 0, RED = 1, BLUE = 2, ALPHA = 3, DIST = 4 } HuffIndex; static const uint16_t kAlphabetSize[HUFFMAN_CODES_PER_META_CODE] = { NUM_LITERAL_CODES + NUM_LENGTH_CODES, NUM_LITERAL_CODES, NUM_LITERAL_CODES, NUM_LITERAL_CODES, NUM_DISTANCE_CODES }; static const uint8_t kLiteralMap[HUFFMAN_CODES_PER_META_CODE] = { 0, 1, 1, 1, 0 }; #define NUM_CODE_LENGTH_CODES 19 static const uint8_t kCodeLengthCodeOrder[NUM_CODE_LENGTH_CODES] = { 17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; #define CODE_TO_PLANE_CODES 120 static const uint8_t kCodeToPlane[CODE_TO_PLANE_CODES] = { 0x18, 0x07, 0x17, 0x19, 0x28, 0x06, 0x27, 0x29, 0x16, 0x1a, 0x26, 0x2a, 0x38, 0x05, 0x37, 0x39, 0x15, 0x1b, 0x36, 0x3a, 0x25, 0x2b, 0x48, 0x04, 0x47, 0x49, 0x14, 0x1c, 0x35, 0x3b, 0x46, 0x4a, 0x24, 0x2c, 0x58, 0x45, 0x4b, 0x34, 0x3c, 0x03, 0x57, 0x59, 0x13, 0x1d, 0x56, 0x5a, 0x23, 0x2d, 0x44, 0x4c, 0x55, 0x5b, 0x33, 0x3d, 0x68, 0x02, 0x67, 0x69, 0x12, 0x1e, 0x66, 0x6a, 0x22, 0x2e, 0x54, 0x5c, 0x43, 0x4d, 0x65, 0x6b, 0x32, 0x3e, 0x78, 0x01, 0x77, 0x79, 0x53, 0x5d, 0x11, 0x1f, 0x64, 0x6c, 0x42, 0x4e, 0x76, 0x7a, 0x21, 0x2f, 0x75, 0x7b, 0x31, 0x3f, 0x63, 0x6d, 0x52, 0x5e, 0x00, 0x74, 0x7c, 0x41, 0x4f, 0x10, 0x20, 0x62, 0x6e, 0x30, 0x73, 0x7d, 0x51, 0x5f, 0x40, 0x72, 0x7e, 0x61, 0x6f, 0x50, 0x71, 0x7f, 0x60, 0x70 }; // Memory needed for lookup tables of one Huffman tree group. Red, blue, alpha // and distance alphabets are constant (256 for red, blue and alpha, 40 for // distance) and lookup table sizes for them in worst case are 630 and 410 // respectively. Size of green alphabet depends on color cache size and is equal // to 256 (green component values) + 24 (length prefix values) // + color_cache_size (between 0 and 2048). // All values computed for 8-bit first level lookup with Mark Adler's tool: // https://github.com/madler/zlib/blob/v1.2.5/examples/enough.c #define FIXED_TABLE_SIZE (630 * 3 + 410) static const uint16_t kTableSize[12] = { FIXED_TABLE_SIZE + 654, FIXED_TABLE_SIZE + 656, FIXED_TABLE_SIZE + 658, FIXED_TABLE_SIZE + 662, FIXED_TABLE_SIZE + 670, FIXED_TABLE_SIZE + 686, FIXED_TABLE_SIZE + 718, FIXED_TABLE_SIZE + 782, FIXED_TABLE_SIZE + 912, FIXED_TABLE_SIZE + 1168, FIXED_TABLE_SIZE + 1680, FIXED_TABLE_SIZE + 2704 }; static int VP8LSetError(VP8LDecoder* const dec, VP8StatusCode error) { // The oldest error reported takes precedence over the new one. if (dec->status_ == VP8_STATUS_OK || dec->status_ == VP8_STATUS_SUSPENDED) { dec->status_ = error; } return 0; } static int DecodeImageStream(int xsize, int ysize, int is_level0, VP8LDecoder* const dec, uint32_t** const decoded_data); //------------------------------------------------------------------------------ int VP8LCheckSignature(const uint8_t* const data, size_t size) { return (size >= VP8L_FRAME_HEADER_SIZE && data[0] == VP8L_MAGIC_BYTE && (data[4] >> 5) == 0); // version } static int ReadImageInfo(VP8LBitReader* const br, int* const width, int* const height, int* const has_alpha) { if (VP8LReadBits(br, 8) != VP8L_MAGIC_BYTE) return 0; *width = VP8LReadBits(br, VP8L_IMAGE_SIZE_BITS) + 1; *height = VP8LReadBits(br, VP8L_IMAGE_SIZE_BITS) + 1; *has_alpha = VP8LReadBits(br, 1); if (VP8LReadBits(br, VP8L_VERSION_BITS) != 0) return 0; return !br->eos_; } int VP8LGetInfo(const uint8_t* data, size_t data_size, int* const width, int* const height, int* const has_alpha) { if (data == NULL || data_size < VP8L_FRAME_HEADER_SIZE) { return 0; // not enough data } else if (!VP8LCheckSignature(data, data_size)) { return 0; // bad signature } else { int w, h, a; VP8LBitReader br; VP8LInitBitReader(&br, data, data_size); if (!ReadImageInfo(&br, &w, &h, &a)) { return 0; } if (width != NULL) *width = w; if (height != NULL) *height = h; if (has_alpha != NULL) *has_alpha = a; return 1; } } //------------------------------------------------------------------------------ static WEBP_INLINE int GetCopyDistance(int distance_symbol, VP8LBitReader* const br) { int extra_bits, offset; if (distance_symbol < 4) { return distance_symbol + 1; } extra_bits = (distance_symbol - 2) >> 1; offset = (2 + (distance_symbol & 1)) << extra_bits; return offset + VP8LReadBits(br, extra_bits) + 1; } static WEBP_INLINE int GetCopyLength(int length_symbol, VP8LBitReader* const br) { // Length and distance prefixes are encoded the same way. return GetCopyDistance(length_symbol, br); } static WEBP_INLINE int PlaneCodeToDistance(int xsize, int plane_code) { if (plane_code > CODE_TO_PLANE_CODES) { return plane_code - CODE_TO_PLANE_CODES; } else { const int dist_code = kCodeToPlane[plane_code - 1]; const int yoffset = dist_code >> 4; const int xoffset = 8 - (dist_code & 0xf); const int dist = yoffset * xsize + xoffset; return (dist >= 1) ? dist : 1; // dist<1 can happen if xsize is very small } } //------------------------------------------------------------------------------ // Decodes the next Huffman code from bit-stream. // VP8LFillBitWindow(br) needs to be called at minimum every second call // to ReadSymbol, in order to pre-fetch enough bits. static WEBP_INLINE int ReadSymbol(const HuffmanCode* table, VP8LBitReader* const br) { int nbits; uint32_t val = VP8LPrefetchBits(br); table += val & HUFFMAN_TABLE_MASK; nbits = table->bits - HUFFMAN_TABLE_BITS; if (nbits > 0) { VP8LSetBitPos(br, br->bit_pos_ + HUFFMAN_TABLE_BITS); val = VP8LPrefetchBits(br); table += table->value; table += val & ((1 << nbits) - 1); } VP8LSetBitPos(br, br->bit_pos_ + table->bits); return table->value; } // Reads packed symbol depending on GREEN channel #define BITS_SPECIAL_MARKER 0x100 // something large enough (and a bit-mask) #define PACKED_NON_LITERAL_CODE 0 // must be < NUM_LITERAL_CODES static WEBP_INLINE int ReadPackedSymbols(const HTreeGroup* group, VP8LBitReader* const br, uint32_t* const dst) { const uint32_t val = VP8LPrefetchBits(br) & (HUFFMAN_PACKED_TABLE_SIZE - 1); const HuffmanCode32 code = group->packed_table[val]; assert(group->use_packed_table); if (code.bits < BITS_SPECIAL_MARKER) { VP8LSetBitPos(br, br->bit_pos_ + code.bits); *dst = code.value; return PACKED_NON_LITERAL_CODE; } else { VP8LSetBitPos(br, br->bit_pos_ + code.bits - BITS_SPECIAL_MARKER); assert(code.value >= NUM_LITERAL_CODES); return code.value; } } static int AccumulateHCode(HuffmanCode hcode, int shift, HuffmanCode32* const huff) { huff->bits += hcode.bits; huff->value |= (uint32_t)hcode.value << shift; assert(huff->bits <= HUFFMAN_TABLE_BITS); return hcode.bits; } static void BuildPackedTable(HTreeGroup* const htree_group) { uint32_t code; for (code = 0; code < HUFFMAN_PACKED_TABLE_SIZE; ++code) { uint32_t bits = code; HuffmanCode32* const huff = &htree_group->packed_table[bits]; HuffmanCode hcode = htree_group->htrees[GREEN][bits]; if (hcode.value >= NUM_LITERAL_CODES) { huff->bits = hcode.bits + BITS_SPECIAL_MARKER; huff->value = hcode.value; } else { huff->bits = 0; huff->value = 0; bits >>= AccumulateHCode(hcode, 8, huff); bits >>= AccumulateHCode(htree_group->htrees[RED][bits], 16, huff); bits >>= AccumulateHCode(htree_group->htrees[BLUE][bits], 0, huff); bits >>= AccumulateHCode(htree_group->htrees[ALPHA][bits], 24, huff); (void)bits; } } } static int ReadHuffmanCodeLengths( VP8LDecoder* const dec, const int* const code_length_code_lengths, int num_symbols, int* const code_lengths) { int ok = 0; VP8LBitReader* const br = &dec->br_; int symbol; int max_symbol; int prev_code_len = DEFAULT_CODE_LENGTH; HuffmanTables tables; if (!VP8LHuffmanTablesAllocate(1 << LENGTHS_TABLE_BITS, &tables) || !VP8LBuildHuffmanTable(&tables, LENGTHS_TABLE_BITS, code_length_code_lengths, NUM_CODE_LENGTH_CODES)) { goto End; } if (VP8LReadBits(br, 1)) { // use length const int length_nbits = 2 + 2 * VP8LReadBits(br, 3); max_symbol = 2 + VP8LReadBits(br, length_nbits); if (max_symbol > num_symbols) { goto End; } } else { max_symbol = num_symbols; } symbol = 0; while (symbol < num_symbols) { const HuffmanCode* p; int code_len; if (max_symbol-- == 0) break; VP8LFillBitWindow(br); p = &tables.curr_segment->start[VP8LPrefetchBits(br) & LENGTHS_TABLE_MASK]; VP8LSetBitPos(br, br->bit_pos_ + p->bits); code_len = p->value; if (code_len < kCodeLengthLiterals) { code_lengths[symbol++] = code_len; if (code_len != 0) prev_code_len = code_len; } else { const int use_prev = (code_len == kCodeLengthRepeatCode); const int slot = code_len - kCodeLengthLiterals; const int extra_bits = kCodeLengthExtraBits[slot]; const int repeat_offset = kCodeLengthRepeatOffsets[slot]; int repeat = VP8LReadBits(br, extra_bits) + repeat_offset; if (symbol + repeat > num_symbols) { goto End; } else { const int length = use_prev ? prev_code_len : 0; while (repeat-- > 0) code_lengths[symbol++] = length; } } } ok = 1; End: VP8LHuffmanTablesDeallocate(&tables); if (!ok) return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); return ok; } // 'code_lengths' is pre-allocated temporary buffer, used for creating Huffman // tree. static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec, int* const code_lengths, HuffmanTables* const table) { int ok = 0; int size = 0; VP8LBitReader* const br = &dec->br_; const int simple_code = VP8LReadBits(br, 1); memset(code_lengths, 0, alphabet_size * sizeof(*code_lengths)); if (simple_code) { // Read symbols, codes & code lengths directly. const int num_symbols = VP8LReadBits(br, 1) + 1; const int first_symbol_len_code = VP8LReadBits(br, 1); // The first code is either 1 bit or 8 bit code. int symbol = VP8LReadBits(br, (first_symbol_len_code == 0) ? 1 : 8); code_lengths[symbol] = 1; // The second code (if present), is always 8 bits long. if (num_symbols == 2) { symbol = VP8LReadBits(br, 8); code_lengths[symbol] = 1; } ok = 1; } else { // Decode Huffman-coded code lengths. int i; int code_length_code_lengths[NUM_CODE_LENGTH_CODES] = { 0 }; const int num_codes = VP8LReadBits(br, 4) + 4; assert(num_codes <= NUM_CODE_LENGTH_CODES); for (i = 0; i < num_codes; ++i) { code_length_code_lengths[kCodeLengthCodeOrder[i]] = VP8LReadBits(br, 3); } ok = ReadHuffmanCodeLengths(dec, code_length_code_lengths, alphabet_size, code_lengths); } ok = ok && !br->eos_; if (ok) { size = VP8LBuildHuffmanTable(table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size); } if (!ok || size == 0) { return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); } return size; } static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize, int color_cache_bits, int allow_recursion) { int i; VP8LBitReader* const br = &dec->br_; VP8LMetadata* const hdr = &dec->hdr_; uint32_t* huffman_image = NULL; HTreeGroup* htree_groups = NULL; HuffmanTables* huffman_tables = &hdr->huffman_tables_; int num_htree_groups = 1; int num_htree_groups_max = 1; int* mapping = NULL; int ok = 0; // Check the table has been 0 initialized (through InitMetadata). assert(huffman_tables->root.start == NULL); assert(huffman_tables->curr_segment == NULL); if (allow_recursion && VP8LReadBits(br, 1)) { // use meta Huffman codes. const int huffman_precision = VP8LReadBits(br, 3) + 2; const int huffman_xsize = VP8LSubSampleSize(xsize, huffman_precision); const int huffman_ysize = VP8LSubSampleSize(ysize, huffman_precision); const int huffman_pixs = huffman_xsize * huffman_ysize; if (!DecodeImageStream(huffman_xsize, huffman_ysize, /*is_level0=*/0, dec, &huffman_image)) { goto Error; } hdr->huffman_subsample_bits_ = huffman_precision; for (i = 0; i < huffman_pixs; ++i) { // The huffman data is stored in red and green bytes. const int group = (huffman_image[i] >> 8) & 0xffff; huffman_image[i] = group; if (group >= num_htree_groups_max) { num_htree_groups_max = group + 1; } } // Check the validity of num_htree_groups_max. If it seems too big, use a // smaller value for later. This will prevent big memory allocations to end // up with a bad bitstream anyway. // The value of 1000 is totally arbitrary. We know that num_htree_groups_max // is smaller than (1 << 16) and should be smaller than the number of pixels // (though the format allows it to be bigger). if (num_htree_groups_max > 1000 || num_htree_groups_max > xsize * ysize) { // Create a mapping from the used indices to the minimal set of used // values [0, num_htree_groups) mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping)); if (mapping == NULL) { VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); goto Error; } // -1 means a value is unmapped, and therefore unused in the Huffman // image. memset(mapping, 0xff, num_htree_groups_max * sizeof(*mapping)); for (num_htree_groups = 0, i = 0; i < huffman_pixs; ++i) { // Get the current mapping for the group and remap the Huffman image. int* const mapped_group = &mapping[huffman_image[i]]; if (*mapped_group == -1) *mapped_group = num_htree_groups++; huffman_image[i] = *mapped_group; } } else { num_htree_groups = num_htree_groups_max; } } if (br->eos_) goto Error; if (!ReadHuffmanCodesHelper(color_cache_bits, num_htree_groups, num_htree_groups_max, mapping, dec, huffman_tables, &htree_groups)) { goto Error; } ok = 1; // All OK. Finalize pointers. hdr->huffman_image_ = huffman_image; hdr->num_htree_groups_ = num_htree_groups; hdr->htree_groups_ = htree_groups; Error: WebPSafeFree(mapping); if (!ok) { WebPSafeFree(huffman_image); VP8LHuffmanTablesDeallocate(huffman_tables); VP8LHtreeGroupsFree(htree_groups); } return ok; } int ReadHuffmanCodesHelper(int color_cache_bits, int num_htree_groups, int num_htree_groups_max, const int* const mapping, VP8LDecoder* const dec, HuffmanTables* const huffman_tables, HTreeGroup** const htree_groups) { int i, j, ok = 0; const int max_alphabet_size = kAlphabetSize[0] + ((color_cache_bits > 0) ? 1 << color_cache_bits : 0); const int table_size = kTableSize[color_cache_bits]; int* code_lengths = NULL; if ((mapping == NULL && num_htree_groups != num_htree_groups_max) || num_htree_groups > num_htree_groups_max) { goto Error; } code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size, sizeof(*code_lengths)); *htree_groups = VP8LHtreeGroupsNew(num_htree_groups); if (*htree_groups == NULL || code_lengths == NULL || !VP8LHuffmanTablesAllocate(num_htree_groups * table_size, huffman_tables)) { VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); goto Error; } for (i = 0; i < num_htree_groups_max; ++i) { // If the index "i" is unused in the Huffman image, just make sure the // coefficients are valid but do not store them. if (mapping != NULL && mapping[i] == -1) { for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) { int alphabet_size = kAlphabetSize[j]; if (j == 0 && color_cache_bits > 0) { alphabet_size += (1 << color_cache_bits); } // Passing in NULL so that nothing gets filled. if (!ReadHuffmanCode(alphabet_size, dec, code_lengths, NULL)) { goto Error; } } } else { HTreeGroup* const htree_group = &(*htree_groups)[(mapping == NULL) ? i : mapping[i]]; HuffmanCode** const htrees = htree_group->htrees; int size; int total_size = 0; int is_trivial_literal = 1; int max_bits = 0; for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) { int alphabet_size = kAlphabetSize[j]; if (j == 0 && color_cache_bits > 0) { alphabet_size += (1 << color_cache_bits); } size = ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables); htrees[j] = huffman_tables->curr_segment->curr_table; if (size == 0) { goto Error; } if (is_trivial_literal && kLiteralMap[j] == 1) { is_trivial_literal = (htrees[j]->bits == 0); } total_size += htrees[j]->bits; huffman_tables->curr_segment->curr_table += size; if (j <= ALPHA) { int local_max_bits = code_lengths[0]; int k; for (k = 1; k < alphabet_size; ++k) { if (code_lengths[k] > local_max_bits) { local_max_bits = code_lengths[k]; } } max_bits += local_max_bits; } } htree_group->is_trivial_literal = is_trivial_literal; htree_group->is_trivial_code = 0; if (is_trivial_literal) { const int red = htrees[RED][0].value; const int blue = htrees[BLUE][0].value; const int alpha = htrees[ALPHA][0].value; htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue; if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) { htree_group->is_trivial_code = 1; htree_group->literal_arb |= htrees[GREEN][0].value << 8; } } htree_group->use_packed_table = !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS); if (htree_group->use_packed_table) BuildPackedTable(htree_group); } } ok = 1; Error: WebPSafeFree(code_lengths); if (!ok) { VP8LHuffmanTablesDeallocate(huffman_tables); VP8LHtreeGroupsFree(*htree_groups); *htree_groups = NULL; } return ok; } //------------------------------------------------------------------------------ // Scaling. #if !defined(WEBP_REDUCE_SIZE) static int AllocateAndInitRescaler(VP8LDecoder* const dec, VP8Io* const io) { const int num_channels = 4; const int in_width = io->mb_w; const int out_width = io->scaled_width; const int in_height = io->mb_h; const int out_height = io->scaled_height; const uint64_t work_size = 2 * num_channels * (uint64_t)out_width; rescaler_t* work; // Rescaler work area. const uint64_t scaled_data_size = (uint64_t)out_width; uint32_t* scaled_data; // Temporary storage for scaled BGRA data. const uint64_t memory_size = sizeof(*dec->rescaler) + work_size * sizeof(*work) + scaled_data_size * sizeof(*scaled_data); uint8_t* memory = (uint8_t*)WebPSafeMalloc(memory_size, sizeof(*memory)); if (memory == NULL) { return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); } assert(dec->rescaler_memory == NULL); dec->rescaler_memory = memory; dec->rescaler = (WebPRescaler*)memory; memory += sizeof(*dec->rescaler); work = (rescaler_t*)memory; memory += work_size * sizeof(*work); scaled_data = (uint32_t*)memory; if (!WebPRescalerInit(dec->rescaler, in_width, in_height, (uint8_t*)scaled_data, out_width, out_height, 0, num_channels, work)) { return 0; } return 1; } #endif // WEBP_REDUCE_SIZE //------------------------------------------------------------------------------ // Export to ARGB #if !defined(WEBP_REDUCE_SIZE) // We have special "export" function since we need to convert from BGRA static int Export(WebPRescaler* const rescaler, WEBP_CSP_MODE colorspace, int rgba_stride, uint8_t* const rgba) { uint32_t* const src = (uint32_t*)rescaler->dst; uint8_t* dst = rgba; const int dst_width = rescaler->dst_width; int num_lines_out = 0; while (WebPRescalerHasPendingOutput(rescaler)) { WebPRescalerExportRow(rescaler); WebPMultARGBRow(src, dst_width, 1); VP8LConvertFromBGRA(src, dst_width, colorspace, dst); dst += rgba_stride; ++num_lines_out; } return num_lines_out; } // Emit scaled rows. static int EmitRescaledRowsRGBA(const VP8LDecoder* const dec, uint8_t* in, int in_stride, int mb_h, uint8_t* const out, int out_stride) { const WEBP_CSP_MODE colorspace = dec->output_->colorspace; int num_lines_in = 0; int num_lines_out = 0; while (num_lines_in < mb_h) { uint8_t* const row_in = in + (uint64_t)num_lines_in * in_stride; uint8_t* const row_out = out + (uint64_t)num_lines_out * out_stride; const int lines_left = mb_h - num_lines_in; const int needed_lines = WebPRescaleNeededLines(dec->rescaler, lines_left); int lines_imported; assert(needed_lines > 0 && needed_lines <= lines_left); WebPMultARGBRows(row_in, in_stride, dec->rescaler->src_width, needed_lines, 0); lines_imported = WebPRescalerImport(dec->rescaler, lines_left, row_in, in_stride); assert(lines_imported == needed_lines); num_lines_in += lines_imported; num_lines_out += Export(dec->rescaler, colorspace, out_stride, row_out); } return num_lines_out; } #endif // WEBP_REDUCE_SIZE // Emit rows without any scaling. static int EmitRows(WEBP_CSP_MODE colorspace, const uint8_t* row_in, int in_stride, int mb_w, int mb_h, uint8_t* const out, int out_stride) { int lines = mb_h; uint8_t* row_out = out; while (lines-- > 0) { VP8LConvertFromBGRA((const uint32_t*)row_in, mb_w, colorspace, row_out); row_in += in_stride; row_out += out_stride; } return mb_h; // Num rows out == num rows in. } //------------------------------------------------------------------------------ // Export to YUVA static void ConvertToYUVA(const uint32_t* const src, int width, int y_pos, const WebPDecBuffer* const output) { const WebPYUVABuffer* const buf = &output->u.YUVA; // first, the luma plane WebPConvertARGBToY(src, buf->y + y_pos * buf->y_stride, width); // then U/V planes { uint8_t* const u = buf->u + (y_pos >> 1) * buf->u_stride; uint8_t* const v = buf->v + (y_pos >> 1) * buf->v_stride; // even lines: store values // odd lines: average with previous values WebPConvertARGBToUV(src, u, v, width, !(y_pos & 1)); } // Lastly, store alpha if needed. if (buf->a != NULL) { uint8_t* const a = buf->a + y_pos * buf->a_stride; #if defined(WORDS_BIGENDIAN) WebPExtractAlpha((uint8_t*)src + 0, 0, width, 1, a, 0); #else WebPExtractAlpha((uint8_t*)src + 3, 0, width, 1, a, 0); #endif } } static int ExportYUVA(const VP8LDecoder* const dec, int y_pos) { WebPRescaler* const rescaler = dec->rescaler; uint32_t* const src = (uint32_t*)rescaler->dst; const int dst_width = rescaler->dst_width; int num_lines_out = 0; while (WebPRescalerHasPendingOutput(rescaler)) { WebPRescalerExportRow(rescaler); WebPMultARGBRow(src, dst_width, 1); ConvertToYUVA(src, dst_width, y_pos, dec->output_); ++y_pos; ++num_lines_out; } return num_lines_out; } static int EmitRescaledRowsYUVA(const VP8LDecoder* const dec, uint8_t* in, int in_stride, int mb_h) { int num_lines_in = 0; int y_pos = dec->last_out_row_; while (num_lines_in < mb_h) { const int lines_left = mb_h - num_lines_in; const int needed_lines = WebPRescaleNeededLines(dec->rescaler, lines_left); int lines_imported; WebPMultARGBRows(in, in_stride, dec->rescaler->src_width, needed_lines, 0); lines_imported = WebPRescalerImport(dec->rescaler, lines_left, in, in_stride); assert(lines_imported == needed_lines); num_lines_in += lines_imported; in += needed_lines * in_stride; y_pos += ExportYUVA(dec, y_pos); } return y_pos; } static int EmitRowsYUVA(const VP8LDecoder* const dec, const uint8_t* in, int in_stride, int mb_w, int num_rows) { int y_pos = dec->last_out_row_; while (num_rows-- > 0) { ConvertToYUVA((const uint32_t*)in, mb_w, y_pos, dec->output_); in += in_stride; ++y_pos; } return y_pos; } //------------------------------------------------------------------------------ // Cropping. // Sets io->mb_y, io->mb_h & io->mb_w according to start row, end row and // crop options. Also updates the input data pointer, so that it points to the // start of the cropped window. Note that pixels are in ARGB format even if // 'in_data' is uint8_t*. // Returns true if the crop window is not empty. static int SetCropWindow(VP8Io* const io, int y_start, int y_end, uint8_t** const in_data, int pixel_stride) { assert(y_start < y_end); assert(io->crop_left < io->crop_right); if (y_end > io->crop_bottom) { y_end = io->crop_bottom; // make sure we don't overflow on last row. } if (y_start < io->crop_top) { const int delta = io->crop_top - y_start; y_start = io->crop_top; *in_data += delta * pixel_stride; } if (y_start >= y_end) return 0; // Crop window is empty. *in_data += io->crop_left * sizeof(uint32_t); io->mb_y = y_start - io->crop_top; io->mb_w = io->crop_right - io->crop_left; io->mb_h = y_end - y_start; return 1; // Non-empty crop window. } //------------------------------------------------------------------------------ static WEBP_INLINE int GetMetaIndex( const uint32_t* const image, int xsize, int bits, int x, int y) { if (bits == 0) return 0; return image[xsize * (y >> bits) + (x >> bits)]; } static WEBP_INLINE HTreeGroup* GetHtreeGroupForPos(VP8LMetadata* const hdr, int x, int y) { const int meta_index = GetMetaIndex(hdr->huffman_image_, hdr->huffman_xsize_, hdr->huffman_subsample_bits_, x, y); assert(meta_index < hdr->num_htree_groups_); return hdr->htree_groups_ + meta_index; } //------------------------------------------------------------------------------ // Main loop, with custom row-processing function typedef void (*ProcessRowsFunc)(VP8LDecoder* const dec, int row); static void ApplyInverseTransforms(VP8LDecoder* const dec, int start_row, int num_rows, const uint32_t* const rows) { int n = dec->next_transform_; const int cache_pixs = dec->width_ * num_rows; const int end_row = start_row + num_rows; const uint32_t* rows_in = rows; uint32_t* const rows_out = dec->argb_cache_; // Inverse transforms. while (n-- > 0) { VP8LTransform* const transform = &dec->transforms_[n]; VP8LInverseTransform(transform, start_row, end_row, rows_in, rows_out); rows_in = rows_out; } if (rows_in != rows_out) { // No transform called, hence just copy. memcpy(rows_out, rows_in, cache_pixs * sizeof(*rows_out)); } } // Processes (transforms, scales & color-converts) the rows decoded after the // last call. static void ProcessRows(VP8LDecoder* const dec, int row) { const uint32_t* const rows = dec->pixels_ + dec->width_ * dec->last_row_; const int num_rows = row - dec->last_row_; assert(row <= dec->io_->crop_bottom); // We can't process more than NUM_ARGB_CACHE_ROWS at a time (that's the size // of argb_cache_), but we currently don't need more than that. assert(num_rows <= NUM_ARGB_CACHE_ROWS); if (num_rows > 0) { // Emit output. VP8Io* const io = dec->io_; uint8_t* rows_data = (uint8_t*)dec->argb_cache_; const int in_stride = io->width * sizeof(uint32_t); // in unit of RGBA ApplyInverseTransforms(dec, dec->last_row_, num_rows, rows); if (!SetCropWindow(io, dec->last_row_, row, &rows_data, in_stride)) { // Nothing to output (this time). } else { const WebPDecBuffer* const output = dec->output_; if (WebPIsRGBMode(output->colorspace)) { // convert to RGBA const WebPRGBABuffer* const buf = &output->u.RGBA; uint8_t* const rgba = buf->rgba + (int64_t)dec->last_out_row_ * buf->stride; const int num_rows_out = #if !defined(WEBP_REDUCE_SIZE) io->use_scaling ? EmitRescaledRowsRGBA(dec, rows_data, in_stride, io->mb_h, rgba, buf->stride) : #endif // WEBP_REDUCE_SIZE EmitRows(output->colorspace, rows_data, in_stride, io->mb_w, io->mb_h, rgba, buf->stride); // Update 'last_out_row_'. dec->last_out_row_ += num_rows_out; } else { // convert to YUVA dec->last_out_row_ = io->use_scaling ? EmitRescaledRowsYUVA(dec, rows_data, in_stride, io->mb_h) : EmitRowsYUVA(dec, rows_data, in_stride, io->mb_w, io->mb_h); } assert(dec->last_out_row_ <= output->height); } } // Update 'last_row_'. dec->last_row_ = row; assert(dec->last_row_ <= dec->height_); } // Row-processing for the special case when alpha data contains only one // transform (color indexing), and trivial non-green literals. static int Is8bOptimizable(const VP8LMetadata* const hdr) { int i; if (hdr->color_cache_size_ > 0) return 0; // When the Huffman tree contains only one symbol, we can skip the // call to ReadSymbol() for red/blue/alpha channels. for (i = 0; i < hdr->num_htree_groups_; ++i) { HuffmanCode** const htrees = hdr->htree_groups_[i].htrees; if (htrees[RED][0].bits > 0) return 0; if (htrees[BLUE][0].bits > 0) return 0; if (htrees[ALPHA][0].bits > 0) return 0; } return 1; } static void AlphaApplyFilter(ALPHDecoder* const alph_dec, int first_row, int last_row, uint8_t* out, int stride) { if (alph_dec->filter_ != WEBP_FILTER_NONE) { int y; const uint8_t* prev_line = alph_dec->prev_line_; assert(WebPUnfilters[alph_dec->filter_] != NULL); for (y = first_row; y < last_row; ++y) { WebPUnfilters[alph_dec->filter_](prev_line, out, out, stride); prev_line = out; out += stride; } alph_dec->prev_line_ = prev_line; } } static void ExtractPalettedAlphaRows(VP8LDecoder* const dec, int last_row) { // For vertical and gradient filtering, we need to decode the part above the // crop_top row, in order to have the correct spatial predictors. ALPHDecoder* const alph_dec = (ALPHDecoder*)dec->io_->opaque; const int top_row = (alph_dec->filter_ == WEBP_FILTER_NONE || alph_dec->filter_ == WEBP_FILTER_HORIZONTAL) ? dec->io_->crop_top : dec->last_row_; const int first_row = (dec->last_row_ < top_row) ? top_row : dec->last_row_; assert(last_row <= dec->io_->crop_bottom); if (last_row > first_row) { // Special method for paletted alpha data. We only process the cropped area. const int width = dec->io_->width; uint8_t* out = alph_dec->output_ + width * first_row; const uint8_t* const in = (uint8_t*)dec->pixels_ + dec->width_ * first_row; VP8LTransform* const transform = &dec->transforms_[0]; assert(dec->next_transform_ == 1); assert(transform->type_ == COLOR_INDEXING_TRANSFORM); VP8LColorIndexInverseTransformAlpha(transform, first_row, last_row, in, out); AlphaApplyFilter(alph_dec, first_row, last_row, out, width); } dec->last_row_ = dec->last_out_row_ = last_row; } //------------------------------------------------------------------------------ // Helper functions for fast pattern copy (8b and 32b) // cyclic rotation of pattern word static WEBP_INLINE uint32_t Rotate8b(uint32_t V) { #if defined(WORDS_BIGENDIAN) return ((V & 0xff000000u) >> 24) | (V << 8); #else return ((V & 0xffu) << 24) | (V >> 8); #endif } // copy 1, 2 or 4-bytes pattern static WEBP_INLINE void CopySmallPattern8b(const uint8_t* src, uint8_t* dst, int length, uint32_t pattern) { int i; // align 'dst' to 4-bytes boundary. Adjust the pattern along the way. while ((uintptr_t)dst & 3) { *dst++ = *src++; pattern = Rotate8b(pattern); --length; } // Copy the pattern 4 bytes at a time. for (i = 0; i < (length >> 2); ++i) { ((uint32_t*)dst)[i] = pattern; } // Finish with left-overs. 'pattern' is still correctly positioned, // so no Rotate8b() call is needed. for (i <<= 2; i < length; ++i) { dst[i] = src[i]; } } static WEBP_INLINE void CopyBlock8b(uint8_t* const dst, int dist, int length) { const uint8_t* src = dst - dist; if (length >= 8) { uint32_t pattern = 0; switch (dist) { case 1: pattern = src[0]; #if defined(__arm__) || defined(_M_ARM) // arm doesn't like multiply that much pattern |= pattern << 8; pattern |= pattern << 16; #elif defined(WEBP_USE_MIPS_DSP_R2) __asm__ volatile ("replv.qb %0, %0" : "+r"(pattern)); #else pattern = 0x01010101u * pattern; #endif break; case 2: #if !defined(WORDS_BIGENDIAN) memcpy(&pattern, src, sizeof(uint16_t)); #else pattern = ((uint32_t)src[0] << 8) | src[1]; #endif #if defined(__arm__) || defined(_M_ARM) pattern |= pattern << 16; #elif defined(WEBP_USE_MIPS_DSP_R2) __asm__ volatile ("replv.ph %0, %0" : "+r"(pattern)); #else pattern = 0x00010001u * pattern; #endif break; case 4: memcpy(&pattern, src, sizeof(uint32_t)); break; default: goto Copy; } CopySmallPattern8b(src, dst, length, pattern); return; } Copy: if (dist >= length) { // no overlap -> use memcpy() memcpy(dst, src, length * sizeof(*dst)); } else { int i; for (i = 0; i < length; ++i) dst[i] = src[i]; } } // copy pattern of 1 or 2 uint32_t's static WEBP_INLINE void CopySmallPattern32b(const uint32_t* src, uint32_t* dst, int length, uint64_t pattern) { int i; if ((uintptr_t)dst & 4) { // Align 'dst' to 8-bytes boundary. *dst++ = *src++; pattern = (pattern >> 32) | (pattern << 32); --length; } assert(0 == ((uintptr_t)dst & 7)); for (i = 0; i < (length >> 1); ++i) { ((uint64_t*)dst)[i] = pattern; // Copy the pattern 8 bytes at a time. } if (length & 1) { // Finish with left-over. dst[i << 1] = src[i << 1]; } } static WEBP_INLINE void CopyBlock32b(uint32_t* const dst, int dist, int length) { const uint32_t* const src = dst - dist; if (dist <= 2 && length >= 4 && ((uintptr_t)dst & 3) == 0) { uint64_t pattern; if (dist == 1) { pattern = (uint64_t)src[0]; pattern |= pattern << 32; } else { memcpy(&pattern, src, sizeof(pattern)); } CopySmallPattern32b(src, dst, length, pattern); } else if (dist >= length) { // no overlap memcpy(dst, src, length * sizeof(*dst)); } else { int i; for (i = 0; i < length; ++i) dst[i] = src[i]; } } //------------------------------------------------------------------------------ static int DecodeAlphaData(VP8LDecoder* const dec, uint8_t* const data, int width, int height, int last_row) { int ok = 1; int row = dec->last_pixel_ / width; int col = dec->last_pixel_ % width; VP8LBitReader* const br = &dec->br_; VP8LMetadata* const hdr = &dec->hdr_; int pos = dec->last_pixel_; // current position const int end = width * height; // End of data const int last = width * last_row; // Last pixel to decode const int len_code_limit = NUM_LITERAL_CODES + NUM_LENGTH_CODES; const int mask = hdr->huffman_mask_; const HTreeGroup* htree_group = (pos < last) ? GetHtreeGroupForPos(hdr, col, row) : NULL; assert(pos <= end); assert(last_row <= height); assert(Is8bOptimizable(hdr)); while (!br->eos_ && pos < last) { int code; // Only update when changing tile. if ((col & mask) == 0) { htree_group = GetHtreeGroupForPos(hdr, col, row); } assert(htree_group != NULL); VP8LFillBitWindow(br); code = ReadSymbol(htree_group->htrees[GREEN], br); if (code < NUM_LITERAL_CODES) { // Literal data[pos] = code; ++pos; ++col; if (col >= width) { col = 0; ++row; if (row <= last_row && (row % NUM_ARGB_CACHE_ROWS == 0)) { ExtractPalettedAlphaRows(dec, row); } } } else if (code < len_code_limit) { // Backward reference int dist_code, dist; const int length_sym = code - NUM_LITERAL_CODES; const int length = GetCopyLength(length_sym, br); const int dist_symbol = ReadSymbol(htree_group->htrees[DIST], br); VP8LFillBitWindow(br); dist_code = GetCopyDistance(dist_symbol, br); dist = PlaneCodeToDistance(width, dist_code); if (pos >= dist && end - pos >= length) { CopyBlock8b(data + pos, dist, length); } else { ok = 0; goto End; } pos += length; col += length; while (col >= width) { col -= width; ++row; if (row <= last_row && (row % NUM_ARGB_CACHE_ROWS == 0)) { ExtractPalettedAlphaRows(dec, row); } } if (pos < last && (col & mask)) { htree_group = GetHtreeGroupForPos(hdr, col, row); } } else { // Not reached ok = 0; goto End; } br->eos_ = VP8LIsEndOfStream(br); } // Process the remaining rows corresponding to last row-block. ExtractPalettedAlphaRows(dec, row > last_row ? last_row : row); End: br->eos_ = VP8LIsEndOfStream(br); if (!ok || (br->eos_ && pos < end)) { return VP8LSetError( dec, br->eos_ ? VP8_STATUS_SUSPENDED : VP8_STATUS_BITSTREAM_ERROR); } dec->last_pixel_ = pos; return ok; } static void SaveState(VP8LDecoder* const dec, int last_pixel) { assert(dec->incremental_); dec->saved_br_ = dec->br_; dec->saved_last_pixel_ = last_pixel; if (dec->hdr_.color_cache_size_ > 0) { VP8LColorCacheCopy(&dec->hdr_.color_cache_, &dec->hdr_.saved_color_cache_); } } static void RestoreState(VP8LDecoder* const dec) { assert(dec->br_.eos_); dec->status_ = VP8_STATUS_SUSPENDED; dec->br_ = dec->saved_br_; dec->last_pixel_ = dec->saved_last_pixel_; if (dec->hdr_.color_cache_size_ > 0) { VP8LColorCacheCopy(&dec->hdr_.saved_color_cache_, &dec->hdr_.color_cache_); } } #define SYNC_EVERY_N_ROWS 8 // minimum number of rows between check-points static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data, int width, int height, int last_row, ProcessRowsFunc process_func) { int row = dec->last_pixel_ / width; int col = dec->last_pixel_ % width; VP8LBitReader* const br = &dec->br_; VP8LMetadata* const hdr = &dec->hdr_; uint32_t* src = data + dec->last_pixel_; uint32_t* last_cached = src; uint32_t* const src_end = data + width * height; // End of data uint32_t* const src_last = data + width * last_row; // Last pixel to decode const int len_code_limit = NUM_LITERAL_CODES + NUM_LENGTH_CODES; const int color_cache_limit = len_code_limit + hdr->color_cache_size_; int next_sync_row = dec->incremental_ ? row : 1 << 24; VP8LColorCache* const color_cache = (hdr->color_cache_size_ > 0) ? &hdr->color_cache_ : NULL; const int mask = hdr->huffman_mask_; const HTreeGroup* htree_group = (src < src_last) ? GetHtreeGroupForPos(hdr, col, row) : NULL; assert(dec->last_row_ < last_row); assert(src_last <= src_end); while (src < src_last) { int code; if (row >= next_sync_row) { SaveState(dec, (int)(src - data)); next_sync_row = row + SYNC_EVERY_N_ROWS; } // Only update when changing tile. Note we could use this test: // if "((((prev_col ^ col) | prev_row ^ row)) > mask)" -> tile changed // but that's actually slower and needs storing the previous col/row. if ((col & mask) == 0) { htree_group = GetHtreeGroupForPos(hdr, col, row); } assert(htree_group != NULL); if (htree_group->is_trivial_code) { *src = htree_group->literal_arb; goto AdvanceByOne; } VP8LFillBitWindow(br); if (htree_group->use_packed_table) { code = ReadPackedSymbols(htree_group, br, src); if (VP8LIsEndOfStream(br)) break; if (code == PACKED_NON_LITERAL_CODE) goto AdvanceByOne; } else { code = ReadSymbol(htree_group->htrees[GREEN], br); } if (VP8LIsEndOfStream(br)) break; if (code < NUM_LITERAL_CODES) { // Literal if (htree_group->is_trivial_literal) { *src = htree_group->literal_arb | (code << 8); } else { int red, blue, alpha; red = ReadSymbol(htree_group->htrees[RED], br); VP8LFillBitWindow(br); blue = ReadSymbol(htree_group->htrees[BLUE], br); alpha = ReadSymbol(htree_group->htrees[ALPHA], br); if (VP8LIsEndOfStream(br)) break; *src = ((uint32_t)alpha << 24) | (red << 16) | (code << 8) | blue; } AdvanceByOne: ++src; ++col; if (col >= width) { col = 0; ++row; if (process_func != NULL) { if (row <= last_row && (row % NUM_ARGB_CACHE_ROWS == 0)) { process_func(dec, row); } } if (color_cache != NULL) { while (last_cached < src) { VP8LColorCacheInsert(color_cache, *last_cached++); } } } } else if (code < len_code_limit) { // Backward reference int dist_code, dist; const int length_sym = code - NUM_LITERAL_CODES; const int length = GetCopyLength(length_sym, br); const int dist_symbol = ReadSymbol(htree_group->htrees[DIST], br); VP8LFillBitWindow(br); dist_code = GetCopyDistance(dist_symbol, br); dist = PlaneCodeToDistance(width, dist_code); if (VP8LIsEndOfStream(br)) break; if (src - data < (ptrdiff_t)dist || src_end - src < (ptrdiff_t)length) { goto Error; } else { CopyBlock32b(src, dist, length); } src += length; col += length; while (col >= width) { col -= width; ++row; if (process_func != NULL) { if (row <= last_row && (row % NUM_ARGB_CACHE_ROWS == 0)) { process_func(dec, row); } } } // Because of the check done above (before 'src' was incremented by // 'length'), the following holds true. assert(src <= src_end); if (col & mask) htree_group = GetHtreeGroupForPos(hdr, col, row); if (color_cache != NULL) { while (last_cached < src) { VP8LColorCacheInsert(color_cache, *last_cached++); } } } else if (code < color_cache_limit) { // Color cache const int key = code - len_code_limit; assert(color_cache != NULL); while (last_cached < src) { VP8LColorCacheInsert(color_cache, *last_cached++); } *src = VP8LColorCacheLookup(color_cache, key); goto AdvanceByOne; } else { // Not reached goto Error; } } br->eos_ = VP8LIsEndOfStream(br); // In incremental decoding: // br->eos_ && src < src_last: if 'br' reached the end of the buffer and // 'src_last' has not been reached yet, there is not enough data. 'dec' has to // be reset until there is more data. // !br->eos_ && src < src_last: this cannot happen as either the buffer is // fully read, either enough has been read to reach 'src_last'. // src >= src_last: 'src_last' is reached, all is fine. 'src' can actually go // beyond 'src_last' in case the image is cropped and an LZ77 goes further. // The buffer might have been enough or there is some left. 'br->eos_' does // not matter. assert(!dec->incremental_ || (br->eos_ && src < src_last) || src >= src_last); if (dec->incremental_ && br->eos_ && src < src_last) { RestoreState(dec); } else if ((dec->incremental_ && src >= src_last) || !br->eos_) { // Process the remaining rows corresponding to last row-block. if (process_func != NULL) { process_func(dec, row > last_row ? last_row : row); } dec->status_ = VP8_STATUS_OK; dec->last_pixel_ = (int)(src - data); // end-of-scan marker } else { // if not incremental, and we are past the end of buffer (eos_=1), then this // is a real bitstream error. goto Error; } return 1; Error: return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); } // ----------------------------------------------------------------------------- // VP8LTransform static void ClearTransform(VP8LTransform* const transform) { WebPSafeFree(transform->data_); transform->data_ = NULL; } // For security reason, we need to remap the color map to span // the total possible bundled values, and not just the num_colors. static int ExpandColorMap(int num_colors, VP8LTransform* const transform) { int i; const int final_num_colors = 1 << (8 >> transform->bits_); uint32_t* const new_color_map = (uint32_t*)WebPSafeMalloc((uint64_t)final_num_colors, sizeof(*new_color_map)); if (new_color_map == NULL) { return 0; } else { uint8_t* const data = (uint8_t*)transform->data_; uint8_t* const new_data = (uint8_t*)new_color_map; new_color_map[0] = transform->data_[0]; for (i = 4; i < 4 * num_colors; ++i) { // Equivalent to VP8LAddPixels(), on a byte-basis. new_data[i] = (data[i] + new_data[i - 4]) & 0xff; } for (; i < 4 * final_num_colors; ++i) { new_data[i] = 0; // black tail. } WebPSafeFree(transform->data_); transform->data_ = new_color_map; } return 1; } static int ReadTransform(int* const xsize, int const* ysize, VP8LDecoder* const dec) { int ok = 1; VP8LBitReader* const br = &dec->br_; VP8LTransform* transform = &dec->transforms_[dec->next_transform_]; const VP8LImageTransformType type = (VP8LImageTransformType)VP8LReadBits(br, 2); // Each transform type can only be present once in the stream. if (dec->transforms_seen_ & (1U << type)) { return 0; // Already there, let's not accept the second same transform. } dec->transforms_seen_ |= (1U << type); transform->type_ = type; transform->xsize_ = *xsize; transform->ysize_ = *ysize; transform->data_ = NULL; ++dec->next_transform_; assert(dec->next_transform_ <= NUM_TRANSFORMS); switch (type) { case PREDICTOR_TRANSFORM: case CROSS_COLOR_TRANSFORM: transform->bits_ = VP8LReadBits(br, 3) + 2; ok = DecodeImageStream(VP8LSubSampleSize(transform->xsize_, transform->bits_), VP8LSubSampleSize(transform->ysize_, transform->bits_), /*is_level0=*/0, dec, &transform->data_); break; case COLOR_INDEXING_TRANSFORM: { const int num_colors = VP8LReadBits(br, 8) + 1; const int bits = (num_colors > 16) ? 0 : (num_colors > 4) ? 1 : (num_colors > 2) ? 2 : 3; *xsize = VP8LSubSampleSize(transform->xsize_, bits); transform->bits_ = bits; ok = DecodeImageStream(num_colors, /*ysize=*/1, /*is_level0=*/0, dec, &transform->data_); if (ok && !ExpandColorMap(num_colors, transform)) { return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); } break; } case SUBTRACT_GREEN_TRANSFORM: break; default: assert(0); // can't happen break; } return ok; } // ----------------------------------------------------------------------------- // VP8LMetadata static void InitMetadata(VP8LMetadata* const hdr) { assert(hdr != NULL); memset(hdr, 0, sizeof(*hdr)); } static void ClearMetadata(VP8LMetadata* const hdr) { assert(hdr != NULL); WebPSafeFree(hdr->huffman_image_); VP8LHuffmanTablesDeallocate(&hdr->huffman_tables_); VP8LHtreeGroupsFree(hdr->htree_groups_); VP8LColorCacheClear(&hdr->color_cache_); VP8LColorCacheClear(&hdr->saved_color_cache_); InitMetadata(hdr); } // ----------------------------------------------------------------------------- // VP8LDecoder VP8LDecoder* VP8LNew(void) { VP8LDecoder* const dec = (VP8LDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec)); if (dec == NULL) return NULL; dec->status_ = VP8_STATUS_OK; dec->state_ = READ_DIM; VP8LDspInit(); // Init critical function pointers. return dec; } void VP8LClear(VP8LDecoder* const dec) { int i; if (dec == NULL) return; ClearMetadata(&dec->hdr_); WebPSafeFree(dec->pixels_); dec->pixels_ = NULL; for (i = 0; i < dec->next_transform_; ++i) { ClearTransform(&dec->transforms_[i]); } dec->next_transform_ = 0; dec->transforms_seen_ = 0; WebPSafeFree(dec->rescaler_memory); dec->rescaler_memory = NULL; dec->output_ = NULL; // leave no trace behind } void VP8LDelete(VP8LDecoder* const dec) { if (dec != NULL) { VP8LClear(dec); WebPSafeFree(dec); } } static void UpdateDecoder(VP8LDecoder* const dec, int width, int height) { VP8LMetadata* const hdr = &dec->hdr_; const int num_bits = hdr->huffman_subsample_bits_; dec->width_ = width; dec->height_ = height; hdr->huffman_xsize_ = VP8LSubSampleSize(width, num_bits); hdr->huffman_mask_ = (num_bits == 0) ? ~0 : (1 << num_bits) - 1; } static int DecodeImageStream(int xsize, int ysize, int is_level0, VP8LDecoder* const dec, uint32_t** const decoded_data) { int ok = 1; int transform_xsize = xsize; int transform_ysize = ysize; VP8LBitReader* const br = &dec->br_; VP8LMetadata* const hdr = &dec->hdr_; uint32_t* data = NULL; int color_cache_bits = 0; // Read the transforms (may recurse). if (is_level0) { while (ok && VP8LReadBits(br, 1)) { ok = ReadTransform(&transform_xsize, &transform_ysize, dec); } } // Color cache if (ok && VP8LReadBits(br, 1)) { color_cache_bits = VP8LReadBits(br, 4); ok = (color_cache_bits >= 1 && color_cache_bits <= MAX_CACHE_BITS); if (!ok) { VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); goto End; } } // Read the Huffman codes (may recurse). ok = ok && ReadHuffmanCodes(dec, transform_xsize, transform_ysize, color_cache_bits, is_level0); if (!ok) { VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); goto End; } // Finish setting up the color-cache if (color_cache_bits > 0) { hdr->color_cache_size_ = 1 << color_cache_bits; if (!VP8LColorCacheInit(&hdr->color_cache_, color_cache_bits)) { ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); goto End; } } else { hdr->color_cache_size_ = 0; } UpdateDecoder(dec, transform_xsize, transform_ysize); if (is_level0) { // level 0 complete dec->state_ = READ_HDR; goto End; } { const uint64_t total_size = (uint64_t)transform_xsize * transform_ysize; data = (uint32_t*)WebPSafeMalloc(total_size, sizeof(*data)); if (data == NULL) { ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); goto End; } } // Use the Huffman trees to decode the LZ77 encoded data. ok = DecodeImageData(dec, data, transform_xsize, transform_ysize, transform_ysize, NULL); ok = ok && !br->eos_; End: if (!ok) { WebPSafeFree(data); ClearMetadata(hdr); } else { if (decoded_data != NULL) { *decoded_data = data; } else { // We allocate image data in this function only for transforms. At level 0 // (that is: not the transforms), we shouldn't have allocated anything. assert(data == NULL); assert(is_level0); } dec->last_pixel_ = 0; // Reset for future DECODE_DATA_FUNC() calls. if (!is_level0) ClearMetadata(hdr); // Clean up temporary data behind. } return ok; } //------------------------------------------------------------------------------ // Allocate internal buffers dec->pixels_ and dec->argb_cache_. static int AllocateInternalBuffers32b(VP8LDecoder* const dec, int final_width) { const uint64_t num_pixels = (uint64_t)dec->width_ * dec->height_; // Scratch buffer corresponding to top-prediction row for transforming the // first row in the row-blocks. Not needed for paletted alpha. const uint64_t cache_top_pixels = (uint16_t)final_width; // Scratch buffer for temporary BGRA storage. Not needed for paletted alpha. const uint64_t cache_pixels = (uint64_t)final_width * NUM_ARGB_CACHE_ROWS; const uint64_t total_num_pixels = num_pixels + cache_top_pixels + cache_pixels; assert(dec->width_ <= final_width); dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint32_t)); if (dec->pixels_ == NULL) { dec->argb_cache_ = NULL; // for soundness return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); } dec->argb_cache_ = dec->pixels_ + num_pixels + cache_top_pixels; return 1; } static int AllocateInternalBuffers8b(VP8LDecoder* const dec) { const uint64_t total_num_pixels = (uint64_t)dec->width_ * dec->height_; dec->argb_cache_ = NULL; // for soundness dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint8_t)); if (dec->pixels_ == NULL) { return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); } return 1; } //------------------------------------------------------------------------------ // Special row-processing that only stores the alpha data. static void ExtractAlphaRows(VP8LDecoder* const dec, int last_row) { int cur_row = dec->last_row_; int num_rows = last_row - cur_row; const uint32_t* in = dec->pixels_ + dec->width_ * cur_row; assert(last_row <= dec->io_->crop_bottom); while (num_rows > 0) { const int num_rows_to_process = (num_rows > NUM_ARGB_CACHE_ROWS) ? NUM_ARGB_CACHE_ROWS : num_rows; // Extract alpha (which is stored in the green plane). ALPHDecoder* const alph_dec = (ALPHDecoder*)dec->io_->opaque; uint8_t* const output = alph_dec->output_; const int width = dec->io_->width; // the final width (!= dec->width_) const int cache_pixs = width * num_rows_to_process; uint8_t* const dst = output + width * cur_row; const uint32_t* const src = dec->argb_cache_; ApplyInverseTransforms(dec, cur_row, num_rows_to_process, in); WebPExtractGreen(src, dst, cache_pixs); AlphaApplyFilter(alph_dec, cur_row, cur_row + num_rows_to_process, dst, width); num_rows -= num_rows_to_process; in += num_rows_to_process * dec->width_; cur_row += num_rows_to_process; } assert(cur_row == last_row); dec->last_row_ = dec->last_out_row_ = last_row; } int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec, const uint8_t* const data, size_t data_size) { int ok = 0; VP8LDecoder* dec = VP8LNew(); if (dec == NULL) return 0; assert(alph_dec != NULL); dec->width_ = alph_dec->width_; dec->height_ = alph_dec->height_; dec->io_ = &alph_dec->io_; dec->io_->opaque = alph_dec; dec->io_->width = alph_dec->width_; dec->io_->height = alph_dec->height_; dec->status_ = VP8_STATUS_OK; VP8LInitBitReader(&dec->br_, data, data_size); if (!DecodeImageStream(alph_dec->width_, alph_dec->height_, /*is_level0=*/1, dec, /*decoded_data=*/NULL)) { goto Err; } // Special case: if alpha data uses only the color indexing transform and // doesn't use color cache (a frequent case), we will use DecodeAlphaData() // method that only needs allocation of 1 byte per pixel (alpha channel). if (dec->next_transform_ == 1 && dec->transforms_[0].type_ == COLOR_INDEXING_TRANSFORM && Is8bOptimizable(&dec->hdr_)) { alph_dec->use_8b_decode_ = 1; ok = AllocateInternalBuffers8b(dec); } else { // Allocate internal buffers (note that dec->width_ may have changed here). alph_dec->use_8b_decode_ = 0; ok = AllocateInternalBuffers32b(dec, alph_dec->width_); } if (!ok) goto Err; // Only set here, once we are sure it is valid (to avoid thread races). alph_dec->vp8l_dec_ = dec; return 1; Err: VP8LDelete(dec); return 0; } int VP8LDecodeAlphaImageStream(ALPHDecoder* const alph_dec, int last_row) { VP8LDecoder* const dec = alph_dec->vp8l_dec_; assert(dec != NULL); assert(last_row <= dec->height_); if (dec->last_row_ >= last_row) { return 1; // done } if (!alph_dec->use_8b_decode_) WebPInitAlphaProcessing(); // Decode (with special row processing). return alph_dec->use_8b_decode_ ? DecodeAlphaData(dec, (uint8_t*)dec->pixels_, dec->width_, dec->height_, last_row) : DecodeImageData(dec, dec->pixels_, dec->width_, dec->height_, last_row, ExtractAlphaRows); } //------------------------------------------------------------------------------ int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) { int width, height, has_alpha; if (dec == NULL) return 0; if (io == NULL) { return VP8LSetError(dec, VP8_STATUS_INVALID_PARAM); } dec->io_ = io; dec->status_ = VP8_STATUS_OK; VP8LInitBitReader(&dec->br_, io->data, io->data_size); if (!ReadImageInfo(&dec->br_, &width, &height, &has_alpha)) { VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR); goto Error; } dec->state_ = READ_DIM; io->width = width; io->height = height; if (!DecodeImageStream(width, height, /*is_level0=*/1, dec, /*decoded_data=*/NULL)) { goto Error; } return 1; Error: VP8LClear(dec); assert(dec->status_ != VP8_STATUS_OK); return 0; } int VP8LDecodeImage(VP8LDecoder* const dec) { VP8Io* io = NULL; WebPDecParams* params = NULL; if (dec == NULL) return 0; assert(dec->hdr_.huffman_tables_.root.start != NULL); assert(dec->hdr_.htree_groups_ != NULL); assert(dec->hdr_.num_htree_groups_ > 0); io = dec->io_; assert(io != NULL); params = (WebPDecParams*)io->opaque; assert(params != NULL); // Initialization. if (dec->state_ != READ_DATA) { dec->output_ = params->output; assert(dec->output_ != NULL); if (!WebPIoInitFromOptions(params->options, io, MODE_BGRA)) { VP8LSetError(dec, VP8_STATUS_INVALID_PARAM); goto Err; } if (!AllocateInternalBuffers32b(dec, io->width)) goto Err; #if !defined(WEBP_REDUCE_SIZE) if (io->use_scaling && !AllocateAndInitRescaler(dec, io)) goto Err; #else if (io->use_scaling) { VP8LSetError(dec, VP8_STATUS_INVALID_PARAM); goto Err; } #endif if (io->use_scaling || WebPIsPremultipliedMode(dec->output_->colorspace)) { // need the alpha-multiply functions for premultiplied output or rescaling WebPInitAlphaProcessing(); } if (!WebPIsRGBMode(dec->output_->colorspace)) { WebPInitConvertARGBToYUV(); if (dec->output_->u.YUVA.a != NULL) WebPInitAlphaProcessing(); } if (dec->incremental_) { if (dec->hdr_.color_cache_size_ > 0 && dec->hdr_.saved_color_cache_.colors_ == NULL) { if (!VP8LColorCacheInit(&dec->hdr_.saved_color_cache_, dec->hdr_.color_cache_.hash_bits_)) { VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY); goto Err; } } } dec->state_ = READ_DATA; } // Decode. if (!DecodeImageData(dec, dec->pixels_, dec->width_, dec->height_, io->crop_bottom, ProcessRows)) { goto Err; } params->last_y = dec->last_out_row_; return 1; Err: VP8LClear(dec); assert(dec->status_ != VP8_STATUS_OK); return 0; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/webpi_dec.h0000644000014400001440000001440614606317060013474 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Internal header: WebP decoding parameters and custom IO on buffer // // Author: somnath@google.com (Somnath Banerjee) #ifndef WEBP_DEC_WEBPI_DEC_H_ #define WEBP_DEC_WEBPI_DEC_H_ #ifdef __cplusplus extern "C" { #endif #include "src/utils/rescaler_utils.h" #include "src/dec/vp8_dec.h" #include "src/webp/decode.h" //------------------------------------------------------------------------------ // WebPDecParams: Decoding output parameters. Transient internal object. typedef struct WebPDecParams WebPDecParams; typedef int (*OutputFunc)(const VP8Io* const io, WebPDecParams* const p); typedef int (*OutputAlphaFunc)(const VP8Io* const io, WebPDecParams* const p, int expected_num_out_lines); typedef int (*OutputRowFunc)(WebPDecParams* const p, int y_pos, int max_out_lines); struct WebPDecParams { WebPDecBuffer* output; // output buffer. uint8_t* tmp_y, *tmp_u, *tmp_v; // cache for the fancy upsampler // or used for tmp rescaling int last_y; // coordinate of the line that was last output const WebPDecoderOptions* options; // if not NULL, use alt decoding features WebPRescaler* scaler_y, *scaler_u, *scaler_v, *scaler_a; // rescalers void* memory; // overall scratch memory for the output work. OutputFunc emit; // output RGB or YUV samples OutputAlphaFunc emit_alpha; // output alpha channel OutputRowFunc emit_alpha_row; // output one line of rescaled alpha values }; // Should be called first, before any use of the WebPDecParams object. void WebPResetDecParams(WebPDecParams* const params); //------------------------------------------------------------------------------ // Header parsing helpers // Structure storing a description of the RIFF headers. typedef struct { const uint8_t* data; // input buffer size_t data_size; // input buffer size int have_all_data; // true if all data is known to be available size_t offset; // offset to main data chunk (VP8 or VP8L) const uint8_t* alpha_data; // points to alpha chunk (if present) size_t alpha_data_size; // alpha chunk size size_t compressed_size; // VP8/VP8L compressed data size size_t riff_size; // size of the riff payload (or 0 if absent) int is_lossless; // true if a VP8L chunk is present } WebPHeaderStructure; // Skips over all valid chunks prior to the first VP8/VP8L frame header. // Returns: VP8_STATUS_OK, VP8_STATUS_BITSTREAM_ERROR (invalid header/chunk), // VP8_STATUS_NOT_ENOUGH_DATA (partial input) or VP8_STATUS_UNSUPPORTED_FEATURE // in the case of non-decodable features (animation for instance). // In 'headers', compressed_size, offset, alpha_data, alpha_size, and lossless // fields are updated appropriately upon success. VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers); //------------------------------------------------------------------------------ // Misc utils // Returns true if crop dimensions are within image bounds. int WebPCheckCropDimensions(int image_width, int image_height, int x, int y, int w, int h); // Initializes VP8Io with custom setup, io and teardown functions. The default // hooks will use the supplied 'params' as io->opaque handle. void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io); // Setup crop_xxx fields, mb_w and mb_h in io. 'src_colorspace' refers // to the *compressed* format, not the output one. WEBP_NODISCARD int WebPIoInitFromOptions( const WebPDecoderOptions* const options, VP8Io* const io, WEBP_CSP_MODE src_colorspace); //------------------------------------------------------------------------------ // Internal functions regarding WebPDecBuffer memory (in buffer.c). // Don't really need to be externally visible for now. // Prepare 'buffer' with the requested initial dimensions width/height. // If no external storage is supplied, initializes buffer by allocating output // memory and setting up the stride information. Validate the parameters. Return // an error code in case of problem (no memory, or invalid stride / size / // dimension / etc.). If *options is not NULL, also verify that the options' // parameters are valid and apply them to the width/height dimensions of the // output buffer. This takes cropping / scaling / rotation into account. // Also incorporates the options->flip flag to flip the buffer parameters if // needed. VP8StatusCode WebPAllocateDecBuffer(int width, int height, const WebPDecoderOptions* const options, WebPDecBuffer* const buffer); // Flip buffer vertically by negating the various strides. VP8StatusCode WebPFlipBuffer(WebPDecBuffer* const buffer); // Copy 'src' into 'dst' buffer, making sure 'dst' is not marked as owner of the // memory (still held by 'src'). No pixels are copied. void WebPCopyDecBuffer(const WebPDecBuffer* const src, WebPDecBuffer* const dst); // Copy and transfer ownership from src to dst (beware of parameter order!) void WebPGrabDecBuffer(WebPDecBuffer* const src, WebPDecBuffer* const dst); // Copy pixels from 'src' into a *preallocated* 'dst' buffer. Returns // VP8_STATUS_INVALID_PARAM if the 'dst' is not set up correctly for the copy. VP8StatusCode WebPCopyDecBufferPixels(const WebPDecBuffer* const src, WebPDecBuffer* const dst); // Returns true if decoding will be slow with the current configuration // and bitstream features. int WebPAvoidSlowMemory(const WebPDecBuffer* const output, const WebPBitstreamFeatures* const features); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DEC_WEBPI_DEC_H_ libwebp-1.4.0/src/dec/vp8_dec.c0000644000014400001440000005413514606317060013101 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // main entry for the decoder // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dec/alphai_dec.h" #include "src/dec/vp8i_dec.h" #include "src/dec/vp8li_dec.h" #include "src/dec/webpi_dec.h" #include "src/utils/bit_reader_inl_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ int WebPGetDecoderVersion(void) { return (DEC_MAJ_VERSION << 16) | (DEC_MIN_VERSION << 8) | DEC_REV_VERSION; } //------------------------------------------------------------------------------ // Signature and pointer-to-function for GetCoeffs() variants below. typedef int (*GetCoeffsFunc)(VP8BitReader* const br, const VP8BandProbas* const prob[], int ctx, const quant_t dq, int n, int16_t* out); static volatile GetCoeffsFunc GetCoeffs = NULL; static void InitGetCoeffs(void); //------------------------------------------------------------------------------ // VP8Decoder static void SetOk(VP8Decoder* const dec) { dec->status_ = VP8_STATUS_OK; dec->error_msg_ = "OK"; } int VP8InitIoInternal(VP8Io* const io, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_DECODER_ABI_VERSION)) { return 0; // mismatch error } if (io != NULL) { memset(io, 0, sizeof(*io)); } return 1; } VP8Decoder* VP8New(void) { VP8Decoder* const dec = (VP8Decoder*)WebPSafeCalloc(1ULL, sizeof(*dec)); if (dec != NULL) { SetOk(dec); WebPGetWorkerInterface()->Init(&dec->worker_); dec->ready_ = 0; dec->num_parts_minus_one_ = 0; InitGetCoeffs(); } return dec; } VP8StatusCode VP8Status(VP8Decoder* const dec) { if (!dec) return VP8_STATUS_INVALID_PARAM; return dec->status_; } const char* VP8StatusMessage(VP8Decoder* const dec) { if (dec == NULL) return "no object"; if (!dec->error_msg_) return "OK"; return dec->error_msg_; } void VP8Delete(VP8Decoder* const dec) { if (dec != NULL) { VP8Clear(dec); WebPSafeFree(dec); } } int VP8SetError(VP8Decoder* const dec, VP8StatusCode error, const char* const msg) { // VP8_STATUS_SUSPENDED is only meaningful in incremental decoding. assert(dec->incremental_ || error != VP8_STATUS_SUSPENDED); // The oldest error reported takes precedence over the new one. if (dec->status_ == VP8_STATUS_OK) { dec->status_ = error; dec->error_msg_ = msg; dec->ready_ = 0; } return 0; } //------------------------------------------------------------------------------ int VP8CheckSignature(const uint8_t* const data, size_t data_size) { return (data_size >= 3 && data[0] == 0x9d && data[1] == 0x01 && data[2] == 0x2a); } int VP8GetInfo(const uint8_t* data, size_t data_size, size_t chunk_size, int* const width, int* const height) { if (data == NULL || data_size < VP8_FRAME_HEADER_SIZE) { return 0; // not enough data } // check signature if (!VP8CheckSignature(data + 3, data_size - 3)) { return 0; // Wrong signature. } else { const uint32_t bits = data[0] | (data[1] << 8) | (data[2] << 16); const int key_frame = !(bits & 1); const int w = ((data[7] << 8) | data[6]) & 0x3fff; const int h = ((data[9] << 8) | data[8]) & 0x3fff; if (!key_frame) { // Not a keyframe. return 0; } if (((bits >> 1) & 7) > 3) { return 0; // unknown profile } if (!((bits >> 4) & 1)) { return 0; // first frame is invisible! } if (((bits >> 5)) >= chunk_size) { // partition_length return 0; // inconsistent size information. } if (w == 0 || h == 0) { return 0; // We don't support both width and height to be zero. } if (width) { *width = w; } if (height) { *height = h; } return 1; } } //------------------------------------------------------------------------------ // Header parsing static void ResetSegmentHeader(VP8SegmentHeader* const hdr) { assert(hdr != NULL); hdr->use_segment_ = 0; hdr->update_map_ = 0; hdr->absolute_delta_ = 1; memset(hdr->quantizer_, 0, sizeof(hdr->quantizer_)); memset(hdr->filter_strength_, 0, sizeof(hdr->filter_strength_)); } // Paragraph 9.3 static int ParseSegmentHeader(VP8BitReader* br, VP8SegmentHeader* hdr, VP8Proba* proba) { assert(br != NULL); assert(hdr != NULL); hdr->use_segment_ = VP8Get(br, "global-header"); if (hdr->use_segment_) { hdr->update_map_ = VP8Get(br, "global-header"); if (VP8Get(br, "global-header")) { // update data int s; hdr->absolute_delta_ = VP8Get(br, "global-header"); for (s = 0; s < NUM_MB_SEGMENTS; ++s) { hdr->quantizer_[s] = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 7, "global-header") : 0; } for (s = 0; s < NUM_MB_SEGMENTS; ++s) { hdr->filter_strength_[s] = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 6, "global-header") : 0; } } if (hdr->update_map_) { int s; for (s = 0; s < MB_FEATURE_TREE_PROBS; ++s) { proba->segments_[s] = VP8Get(br, "global-header") ? VP8GetValue(br, 8, "global-header") : 255u; } } } else { hdr->update_map_ = 0; } return !br->eof_; } // Paragraph 9.5 // If we don't have all the necessary data in 'buf', this function returns // VP8_STATUS_SUSPENDED in incremental decoding, VP8_STATUS_NOT_ENOUGH_DATA // otherwise. // In incremental decoding, this case is not necessarily an error. Still, no // bitreader is ever initialized to make it possible to read unavailable memory. // If we don't even have the partitions' sizes, then VP8_STATUS_NOT_ENOUGH_DATA // is returned, and this is an unrecoverable error. // If the partitions were positioned ok, VP8_STATUS_OK is returned. static VP8StatusCode ParsePartitions(VP8Decoder* const dec, const uint8_t* buf, size_t size) { VP8BitReader* const br = &dec->br_; const uint8_t* sz = buf; const uint8_t* buf_end = buf + size; const uint8_t* part_start; size_t size_left = size; size_t last_part; size_t p; dec->num_parts_minus_one_ = (1 << VP8GetValue(br, 2, "global-header")) - 1; last_part = dec->num_parts_minus_one_; if (size < 3 * last_part) { // we can't even read the sizes with sz[]! That's a failure. return VP8_STATUS_NOT_ENOUGH_DATA; } part_start = buf + last_part * 3; size_left -= last_part * 3; for (p = 0; p < last_part; ++p) { size_t psize = sz[0] | (sz[1] << 8) | (sz[2] << 16); if (psize > size_left) psize = size_left; VP8InitBitReader(dec->parts_ + p, part_start, psize); part_start += psize; size_left -= psize; sz += 3; } VP8InitBitReader(dec->parts_ + last_part, part_start, size_left); if (part_start < buf_end) return VP8_STATUS_OK; return dec->incremental_ ? VP8_STATUS_SUSPENDED // Init is ok, but there's not enough data : VP8_STATUS_NOT_ENOUGH_DATA; } // Paragraph 9.4 static int ParseFilterHeader(VP8BitReader* br, VP8Decoder* const dec) { VP8FilterHeader* const hdr = &dec->filter_hdr_; hdr->simple_ = VP8Get(br, "global-header"); hdr->level_ = VP8GetValue(br, 6, "global-header"); hdr->sharpness_ = VP8GetValue(br, 3, "global-header"); hdr->use_lf_delta_ = VP8Get(br, "global-header"); if (hdr->use_lf_delta_) { if (VP8Get(br, "global-header")) { // update lf-delta? int i; for (i = 0; i < NUM_REF_LF_DELTAS; ++i) { if (VP8Get(br, "global-header")) { hdr->ref_lf_delta_[i] = VP8GetSignedValue(br, 6, "global-header"); } } for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) { if (VP8Get(br, "global-header")) { hdr->mode_lf_delta_[i] = VP8GetSignedValue(br, 6, "global-header"); } } } } dec->filter_type_ = (hdr->level_ == 0) ? 0 : hdr->simple_ ? 1 : 2; return !br->eof_; } // Topmost call int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) { const uint8_t* buf; size_t buf_size; VP8FrameHeader* frm_hdr; VP8PictureHeader* pic_hdr; VP8BitReader* br; VP8StatusCode status; if (dec == NULL) { return 0; } SetOk(dec); if (io == NULL) { return VP8SetError(dec, VP8_STATUS_INVALID_PARAM, "null VP8Io passed to VP8GetHeaders()"); } buf = io->data; buf_size = io->data_size; if (buf_size < 4) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "Truncated header."); } // Paragraph 9.1 { const uint32_t bits = buf[0] | (buf[1] << 8) | (buf[2] << 16); frm_hdr = &dec->frm_hdr_; frm_hdr->key_frame_ = !(bits & 1); frm_hdr->profile_ = (bits >> 1) & 7; frm_hdr->show_ = (bits >> 4) & 1; frm_hdr->partition_length_ = (bits >> 5); if (frm_hdr->profile_ > 3) { return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR, "Incorrect keyframe parameters."); } if (!frm_hdr->show_) { return VP8SetError(dec, VP8_STATUS_UNSUPPORTED_FEATURE, "Frame not displayable."); } buf += 3; buf_size -= 3; } pic_hdr = &dec->pic_hdr_; if (frm_hdr->key_frame_) { // Paragraph 9.2 if (buf_size < 7) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "cannot parse picture header"); } if (!VP8CheckSignature(buf, buf_size)) { return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR, "Bad code word"); } pic_hdr->width_ = ((buf[4] << 8) | buf[3]) & 0x3fff; pic_hdr->xscale_ = buf[4] >> 6; // ratio: 1, 5/4 5/3 or 2 pic_hdr->height_ = ((buf[6] << 8) | buf[5]) & 0x3fff; pic_hdr->yscale_ = buf[6] >> 6; buf += 7; buf_size -= 7; dec->mb_w_ = (pic_hdr->width_ + 15) >> 4; dec->mb_h_ = (pic_hdr->height_ + 15) >> 4; // Setup default output area (can be later modified during io->setup()) io->width = pic_hdr->width_; io->height = pic_hdr->height_; // IMPORTANT! use some sane dimensions in crop_* and scaled_* fields. // So they can be used interchangeably without always testing for // 'use_cropping'. io->use_cropping = 0; io->crop_top = 0; io->crop_left = 0; io->crop_right = io->width; io->crop_bottom = io->height; io->use_scaling = 0; io->scaled_width = io->width; io->scaled_height = io->height; io->mb_w = io->width; // for soundness io->mb_h = io->height; // ditto VP8ResetProba(&dec->proba_); ResetSegmentHeader(&dec->segment_hdr_); } // Check if we have all the partition #0 available, and initialize dec->br_ // to read this partition (and this partition only). if (frm_hdr->partition_length_ > buf_size) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "bad partition length"); } br = &dec->br_; VP8InitBitReader(br, buf, frm_hdr->partition_length_); buf += frm_hdr->partition_length_; buf_size -= frm_hdr->partition_length_; if (frm_hdr->key_frame_) { pic_hdr->colorspace_ = VP8Get(br, "global-header"); pic_hdr->clamp_type_ = VP8Get(br, "global-header"); } if (!ParseSegmentHeader(br, &dec->segment_hdr_, &dec->proba_)) { return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR, "cannot parse segment header"); } // Filter specs if (!ParseFilterHeader(br, dec)) { return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR, "cannot parse filter header"); } status = ParsePartitions(dec, buf, buf_size); if (status != VP8_STATUS_OK) { return VP8SetError(dec, status, "cannot parse partitions"); } // quantizer change VP8ParseQuant(dec); // Frame buffer marking if (!frm_hdr->key_frame_) { return VP8SetError(dec, VP8_STATUS_UNSUPPORTED_FEATURE, "Not a key frame."); } VP8Get(br, "global-header"); // ignore the value of update_proba_ VP8ParseProba(br, dec); // sanitized state dec->ready_ = 1; return 1; } //------------------------------------------------------------------------------ // Residual decoding (Paragraph 13.2 / 13.3) static const uint8_t kCat3[] = { 173, 148, 140, 0 }; static const uint8_t kCat4[] = { 176, 155, 140, 135, 0 }; static const uint8_t kCat5[] = { 180, 157, 141, 134, 130, 0 }; static const uint8_t kCat6[] = { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 }; static const uint8_t* const kCat3456[] = { kCat3, kCat4, kCat5, kCat6 }; static const uint8_t kZigzag[16] = { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 }; // See section 13-2: https://datatracker.ietf.org/doc/html/rfc6386#section-13.2 static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) { int v; if (!VP8GetBit(br, p[3], "coeffs")) { if (!VP8GetBit(br, p[4], "coeffs")) { v = 2; } else { v = 3 + VP8GetBit(br, p[5], "coeffs"); } } else { if (!VP8GetBit(br, p[6], "coeffs")) { if (!VP8GetBit(br, p[7], "coeffs")) { v = 5 + VP8GetBit(br, 159, "coeffs"); } else { v = 7 + 2 * VP8GetBit(br, 165, "coeffs"); v += VP8GetBit(br, 145, "coeffs"); } } else { const uint8_t* tab; const int bit1 = VP8GetBit(br, p[8], "coeffs"); const int bit0 = VP8GetBit(br, p[9 + bit1], "coeffs"); const int cat = 2 * bit1 + bit0; v = 0; for (tab = kCat3456[cat]; *tab; ++tab) { v += v + VP8GetBit(br, *tab, "coeffs"); } v += 3 + (8 << cat); } } return v; } // Returns the position of the last non-zero coeff plus one static int GetCoeffsFast(VP8BitReader* const br, const VP8BandProbas* const prob[], int ctx, const quant_t dq, int n, int16_t* out) { const uint8_t* p = prob[n]->probas_[ctx]; for (; n < 16; ++n) { if (!VP8GetBit(br, p[0], "coeffs")) { return n; // previous coeff was last non-zero coeff } while (!VP8GetBit(br, p[1], "coeffs")) { // sequence of zero coeffs p = prob[++n]->probas_[0]; if (n == 16) return 16; } { // non zero coeff const VP8ProbaArray* const p_ctx = &prob[n + 1]->probas_[0]; int v; if (!VP8GetBit(br, p[2], "coeffs")) { v = 1; p = p_ctx[1]; } else { v = GetLargeValue(br, p); p = p_ctx[2]; } out[kZigzag[n]] = VP8GetSigned(br, v, "coeffs") * dq[n > 0]; } } return 16; } // This version of GetCoeffs() uses VP8GetBitAlt() which is an alternate version // of VP8GetBitAlt() targeting specific platforms. static int GetCoeffsAlt(VP8BitReader* const br, const VP8BandProbas* const prob[], int ctx, const quant_t dq, int n, int16_t* out) { const uint8_t* p = prob[n]->probas_[ctx]; for (; n < 16; ++n) { if (!VP8GetBitAlt(br, p[0], "coeffs")) { return n; // previous coeff was last non-zero coeff } while (!VP8GetBitAlt(br, p[1], "coeffs")) { // sequence of zero coeffs p = prob[++n]->probas_[0]; if (n == 16) return 16; } { // non zero coeff const VP8ProbaArray* const p_ctx = &prob[n + 1]->probas_[0]; int v; if (!VP8GetBitAlt(br, p[2], "coeffs")) { v = 1; p = p_ctx[1]; } else { v = GetLargeValue(br, p); p = p_ctx[2]; } out[kZigzag[n]] = VP8GetSigned(br, v, "coeffs") * dq[n > 0]; } } return 16; } extern VP8CPUInfo VP8GetCPUInfo; WEBP_DSP_INIT_FUNC(InitGetCoeffs) { if (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kSlowSSSE3)) { GetCoeffs = GetCoeffsAlt; } else { GetCoeffs = GetCoeffsFast; } } static WEBP_INLINE uint32_t NzCodeBits(uint32_t nz_coeffs, int nz, int dc_nz) { nz_coeffs <<= 2; nz_coeffs |= (nz > 3) ? 3 : (nz > 1) ? 2 : dc_nz; return nz_coeffs; } static int ParseResiduals(VP8Decoder* const dec, VP8MB* const mb, VP8BitReader* const token_br) { const VP8BandProbas* (* const bands)[16 + 1] = dec->proba_.bands_ptr_; const VP8BandProbas* const * ac_proba; VP8MBData* const block = dec->mb_data_ + dec->mb_x_; const VP8QuantMatrix* const q = &dec->dqm_[block->segment_]; int16_t* dst = block->coeffs_; VP8MB* const left_mb = dec->mb_info_ - 1; uint8_t tnz, lnz; uint32_t non_zero_y = 0; uint32_t non_zero_uv = 0; int x, y, ch; uint32_t out_t_nz, out_l_nz; int first; memset(dst, 0, 384 * sizeof(*dst)); if (!block->is_i4x4_) { // parse DC int16_t dc[16] = { 0 }; const int ctx = mb->nz_dc_ + left_mb->nz_dc_; const int nz = GetCoeffs(token_br, bands[1], ctx, q->y2_mat_, 0, dc); mb->nz_dc_ = left_mb->nz_dc_ = (nz > 0); if (nz > 1) { // more than just the DC -> perform the full transform VP8TransformWHT(dc, dst); } else { // only DC is non-zero -> inlined simplified transform int i; const int dc0 = (dc[0] + 3) >> 3; for (i = 0; i < 16 * 16; i += 16) dst[i] = dc0; } first = 1; ac_proba = bands[0]; } else { first = 0; ac_proba = bands[3]; } tnz = mb->nz_ & 0x0f; lnz = left_mb->nz_ & 0x0f; for (y = 0; y < 4; ++y) { int l = lnz & 1; uint32_t nz_coeffs = 0; for (x = 0; x < 4; ++x) { const int ctx = l + (tnz & 1); const int nz = GetCoeffs(token_br, ac_proba, ctx, q->y1_mat_, first, dst); l = (nz > first); tnz = (tnz >> 1) | (l << 7); nz_coeffs = NzCodeBits(nz_coeffs, nz, dst[0] != 0); dst += 16; } tnz >>= 4; lnz = (lnz >> 1) | (l << 7); non_zero_y = (non_zero_y << 8) | nz_coeffs; } out_t_nz = tnz; out_l_nz = lnz >> 4; for (ch = 0; ch < 4; ch += 2) { uint32_t nz_coeffs = 0; tnz = mb->nz_ >> (4 + ch); lnz = left_mb->nz_ >> (4 + ch); for (y = 0; y < 2; ++y) { int l = lnz & 1; for (x = 0; x < 2; ++x) { const int ctx = l + (tnz & 1); const int nz = GetCoeffs(token_br, bands[2], ctx, q->uv_mat_, 0, dst); l = (nz > 0); tnz = (tnz >> 1) | (l << 3); nz_coeffs = NzCodeBits(nz_coeffs, nz, dst[0] != 0); dst += 16; } tnz >>= 2; lnz = (lnz >> 1) | (l << 5); } // Note: we don't really need the per-4x4 details for U/V blocks. non_zero_uv |= nz_coeffs << (4 * ch); out_t_nz |= (tnz << 4) << ch; out_l_nz |= (lnz & 0xf0) << ch; } mb->nz_ = out_t_nz; left_mb->nz_ = out_l_nz; block->non_zero_y_ = non_zero_y; block->non_zero_uv_ = non_zero_uv; // We look at the mode-code of each block and check if some blocks have less // than three non-zero coeffs (code < 2). This is to avoid dithering flat and // empty blocks. block->dither_ = (non_zero_uv & 0xaaaa) ? 0 : q->dither_; return !(non_zero_y | non_zero_uv); // will be used for further optimization } //------------------------------------------------------------------------------ // Main loop int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br) { VP8MB* const left = dec->mb_info_ - 1; VP8MB* const mb = dec->mb_info_ + dec->mb_x_; VP8MBData* const block = dec->mb_data_ + dec->mb_x_; int skip = dec->use_skip_proba_ ? block->skip_ : 0; if (!skip) { skip = ParseResiduals(dec, mb, token_br); } else { left->nz_ = mb->nz_ = 0; if (!block->is_i4x4_) { left->nz_dc_ = mb->nz_dc_ = 0; } block->non_zero_y_ = 0; block->non_zero_uv_ = 0; block->dither_ = 0; } if (dec->filter_type_ > 0) { // store filter info VP8FInfo* const finfo = dec->f_info_ + dec->mb_x_; *finfo = dec->fstrengths_[block->segment_][block->is_i4x4_]; finfo->f_inner_ |= !skip; } return !token_br->eof_; } void VP8InitScanline(VP8Decoder* const dec) { VP8MB* const left = dec->mb_info_ - 1; left->nz_ = 0; left->nz_dc_ = 0; memset(dec->intra_l_, B_DC_PRED, sizeof(dec->intra_l_)); dec->mb_x_ = 0; } static int ParseFrame(VP8Decoder* const dec, VP8Io* io) { for (dec->mb_y_ = 0; dec->mb_y_ < dec->br_mb_y_; ++dec->mb_y_) { // Parse bitstream for this row. VP8BitReader* const token_br = &dec->parts_[dec->mb_y_ & dec->num_parts_minus_one_]; if (!VP8ParseIntraModeRow(&dec->br_, dec)) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "Premature end-of-partition0 encountered."); } for (; dec->mb_x_ < dec->mb_w_; ++dec->mb_x_) { if (!VP8DecodeMB(dec, token_br)) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "Premature end-of-file encountered."); } } VP8InitScanline(dec); // Prepare for next scanline // Reconstruct, filter and emit the row. if (!VP8ProcessRow(dec, io)) { return VP8SetError(dec, VP8_STATUS_USER_ABORT, "Output aborted."); } } if (dec->mt_method_ > 0) { if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) return 0; } return 1; } // Main entry point int VP8Decode(VP8Decoder* const dec, VP8Io* const io) { int ok = 0; if (dec == NULL) { return 0; } if (io == NULL) { return VP8SetError(dec, VP8_STATUS_INVALID_PARAM, "NULL VP8Io parameter in VP8Decode()."); } if (!dec->ready_) { if (!VP8GetHeaders(dec, io)) { return 0; } } assert(dec->ready_); // Finish setting up the decoding parameter. Will call io->setup(). ok = (VP8EnterCritical(dec, io) == VP8_STATUS_OK); if (ok) { // good to go. // Will allocate memory and prepare everything. if (ok) ok = VP8InitFrame(dec, io); // Main decoding loop if (ok) ok = ParseFrame(dec, io); // Exit. ok &= VP8ExitCritical(dec, io); } if (!ok) { VP8Clear(dec); return 0; } dec->ready_ = 0; return ok; } void VP8Clear(VP8Decoder* const dec) { if (dec == NULL) { return; } WebPGetWorkerInterface()->End(&dec->worker_); WebPDeallocateAlphaMemory(dec); WebPSafeFree(dec->mem_); dec->mem_ = NULL; dec->mem_size_ = 0; memset(&dec->br_, 0, sizeof(dec->br_)); dec->ready_ = 0; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/alpha_dec.c0000644000014400001440000002013014606317060013435 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha-plane decompression. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dec/alphai_dec.h" #include "src/dec/vp8_dec.h" #include "src/dec/vp8i_dec.h" #include "src/dec/vp8li_dec.h" #include "src/dsp/dsp.h" #include "src/utils/quant_levels_dec_utils.h" #include "src/utils/utils.h" #include "src/webp/format_constants.h" #include "src/webp/types.h" //------------------------------------------------------------------------------ // ALPHDecoder object. // Allocates a new alpha decoder instance. WEBP_NODISCARD static ALPHDecoder* ALPHNew(void) { ALPHDecoder* const dec = (ALPHDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec)); return dec; } // Clears and deallocates an alpha decoder instance. static void ALPHDelete(ALPHDecoder* const dec) { if (dec != NULL) { VP8LDelete(dec->vp8l_dec_); dec->vp8l_dec_ = NULL; WebPSafeFree(dec); } } //------------------------------------------------------------------------------ // Decoding. // Initialize alpha decoding by parsing the alpha header and decoding the image // header for alpha data stored using lossless compression. // Returns false in case of error in alpha header (data too short, invalid // compression method or filter, error in lossless header data etc). WEBP_NODISCARD static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data, size_t data_size, const VP8Io* const src_io, uint8_t* output) { int ok = 0; const uint8_t* const alpha_data = data + ALPHA_HEADER_LEN; const size_t alpha_data_size = data_size - ALPHA_HEADER_LEN; int rsrv; VP8Io* const io = &dec->io_; assert(data != NULL && output != NULL && src_io != NULL); VP8FiltersInit(); dec->output_ = output; dec->width_ = src_io->width; dec->height_ = src_io->height; assert(dec->width_ > 0 && dec->height_ > 0); if (data_size <= ALPHA_HEADER_LEN) { return 0; } dec->method_ = (data[0] >> 0) & 0x03; dec->filter_ = (WEBP_FILTER_TYPE)((data[0] >> 2) & 0x03); dec->pre_processing_ = (data[0] >> 4) & 0x03; rsrv = (data[0] >> 6) & 0x03; if (dec->method_ < ALPHA_NO_COMPRESSION || dec->method_ > ALPHA_LOSSLESS_COMPRESSION || dec->filter_ >= WEBP_FILTER_LAST || dec->pre_processing_ > ALPHA_PREPROCESSED_LEVELS || rsrv != 0) { return 0; } // Copy the necessary parameters from src_io to io if (!VP8InitIo(io)) { return 0; } WebPInitCustomIo(NULL, io); io->opaque = dec; io->width = src_io->width; io->height = src_io->height; io->use_cropping = src_io->use_cropping; io->crop_left = src_io->crop_left; io->crop_right = src_io->crop_right; io->crop_top = src_io->crop_top; io->crop_bottom = src_io->crop_bottom; // No need to copy the scaling parameters. if (dec->method_ == ALPHA_NO_COMPRESSION) { const size_t alpha_decoded_size = dec->width_ * dec->height_; ok = (alpha_data_size >= alpha_decoded_size); } else { assert(dec->method_ == ALPHA_LOSSLESS_COMPRESSION); ok = VP8LDecodeAlphaHeader(dec, alpha_data, alpha_data_size); } return ok; } // Decodes, unfilters and dequantizes *at least* 'num_rows' rows of alpha // starting from row number 'row'. It assumes that rows up to (row - 1) have // already been decoded. // Returns false in case of bitstream error. WEBP_NODISCARD static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) { ALPHDecoder* const alph_dec = dec->alph_dec_; const int width = alph_dec->width_; const int height = alph_dec->io_.crop_bottom; if (alph_dec->method_ == ALPHA_NO_COMPRESSION) { int y; const uint8_t* prev_line = dec->alpha_prev_line_; const uint8_t* deltas = dec->alpha_data_ + ALPHA_HEADER_LEN + row * width; uint8_t* dst = dec->alpha_plane_ + row * width; assert(deltas <= &dec->alpha_data_[dec->alpha_data_size_]); assert(WebPUnfilters[alph_dec->filter_] != NULL); for (y = 0; y < num_rows; ++y) { WebPUnfilters[alph_dec->filter_](prev_line, deltas, dst, width); prev_line = dst; dst += width; deltas += width; } dec->alpha_prev_line_ = prev_line; } else { // alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION assert(alph_dec->vp8l_dec_ != NULL); if (!VP8LDecodeAlphaImageStream(alph_dec, row + num_rows)) { return 0; } } if (row + num_rows >= height) { dec->is_alpha_decoded_ = 1; } return 1; } WEBP_NODISCARD static int AllocateAlphaPlane(VP8Decoder* const dec, const VP8Io* const io) { const int stride = io->width; const int height = io->crop_bottom; const uint64_t alpha_size = (uint64_t)stride * height; assert(dec->alpha_plane_mem_ == NULL); dec->alpha_plane_mem_ = (uint8_t*)WebPSafeMalloc(alpha_size, sizeof(*dec->alpha_plane_)); if (dec->alpha_plane_mem_ == NULL) { return VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY, "Alpha decoder initialization failed."); } dec->alpha_plane_ = dec->alpha_plane_mem_; dec->alpha_prev_line_ = NULL; return 1; } void WebPDeallocateAlphaMemory(VP8Decoder* const dec) { assert(dec != NULL); WebPSafeFree(dec->alpha_plane_mem_); dec->alpha_plane_mem_ = NULL; dec->alpha_plane_ = NULL; ALPHDelete(dec->alph_dec_); dec->alph_dec_ = NULL; } //------------------------------------------------------------------------------ // Main entry point. WEBP_NODISCARD const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, const VP8Io* const io, int row, int num_rows) { const int width = io->width; const int height = io->crop_bottom; assert(dec != NULL && io != NULL); if (row < 0 || num_rows <= 0 || row + num_rows > height) { return NULL; } if (!dec->is_alpha_decoded_) { if (dec->alph_dec_ == NULL) { // Initialize decoder. dec->alph_dec_ = ALPHNew(); if (dec->alph_dec_ == NULL) { VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY, "Alpha decoder initialization failed."); return NULL; } if (!AllocateAlphaPlane(dec, io)) goto Error; if (!ALPHInit(dec->alph_dec_, dec->alpha_data_, dec->alpha_data_size_, io, dec->alpha_plane_)) { VP8LDecoder* const vp8l_dec = dec->alph_dec_->vp8l_dec_; VP8SetError(dec, (vp8l_dec == NULL) ? VP8_STATUS_OUT_OF_MEMORY : vp8l_dec->status_, "Alpha decoder initialization failed."); goto Error; } // if we allowed use of alpha dithering, check whether it's needed at all if (dec->alph_dec_->pre_processing_ != ALPHA_PREPROCESSED_LEVELS) { dec->alpha_dithering_ = 0; // disable dithering } else { num_rows = height - row; // decode everything in one pass } } assert(dec->alph_dec_ != NULL); assert(row + num_rows <= height); if (!ALPHDecode(dec, row, num_rows)) goto Error; if (dec->is_alpha_decoded_) { // finished? ALPHDelete(dec->alph_dec_); dec->alph_dec_ = NULL; if (dec->alpha_dithering_ > 0) { uint8_t* const alpha = dec->alpha_plane_ + io->crop_top * width + io->crop_left; if (!WebPDequantizeLevels(alpha, io->crop_right - io->crop_left, io->crop_bottom - io->crop_top, width, dec->alpha_dithering_)) { goto Error; } } } } // Return a pointer to the current decoded row. return dec->alpha_plane_ + row * width; Error: WebPDeallocateAlphaMemory(dec); return NULL; } libwebp-1.4.0/src/dec/buffer_dec.c0000644000014400001440000002472014606317060013632 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Everything about WebPDecBuffer // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dec/vp8i_dec.h" #include "src/dec/webpi_dec.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // WebPDecBuffer // Number of bytes per pixel for the different color-spaces. static const uint8_t kModeBpp[MODE_LAST] = { 3, 4, 3, 4, 4, 2, 2, 4, 4, 4, 2, // pre-multiplied modes 1, 1 }; // Check that webp_csp_mode is within the bounds of WEBP_CSP_MODE. // Convert to an integer to handle both the unsigned/signed enum cases // without the need for casting to remove type limit warnings. static int IsValidColorspace(int webp_csp_mode) { return (webp_csp_mode >= MODE_RGB && webp_csp_mode < MODE_LAST); } // strictly speaking, the very last (or first, if flipped) row // doesn't require padding. #define MIN_BUFFER_SIZE(WIDTH, HEIGHT, STRIDE) \ ((uint64_t)(STRIDE) * ((HEIGHT) - 1) + (WIDTH)) static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) { int ok = 1; const WEBP_CSP_MODE mode = buffer->colorspace; const int width = buffer->width; const int height = buffer->height; if (!IsValidColorspace(mode)) { ok = 0; } else if (!WebPIsRGBMode(mode)) { // YUV checks const WebPYUVABuffer* const buf = &buffer->u.YUVA; const int uv_width = (width + 1) / 2; const int uv_height = (height + 1) / 2; const int y_stride = abs(buf->y_stride); const int u_stride = abs(buf->u_stride); const int v_stride = abs(buf->v_stride); const int a_stride = abs(buf->a_stride); const uint64_t y_size = MIN_BUFFER_SIZE(width, height, y_stride); const uint64_t u_size = MIN_BUFFER_SIZE(uv_width, uv_height, u_stride); const uint64_t v_size = MIN_BUFFER_SIZE(uv_width, uv_height, v_stride); const uint64_t a_size = MIN_BUFFER_SIZE(width, height, a_stride); ok &= (y_size <= buf->y_size); ok &= (u_size <= buf->u_size); ok &= (v_size <= buf->v_size); ok &= (y_stride >= width); ok &= (u_stride >= uv_width); ok &= (v_stride >= uv_width); ok &= (buf->y != NULL); ok &= (buf->u != NULL); ok &= (buf->v != NULL); if (mode == MODE_YUVA) { ok &= (a_stride >= width); ok &= (a_size <= buf->a_size); ok &= (buf->a != NULL); } } else { // RGB checks const WebPRGBABuffer* const buf = &buffer->u.RGBA; const int stride = abs(buf->stride); const uint64_t size = MIN_BUFFER_SIZE((uint64_t)width * kModeBpp[mode], height, stride); ok &= (size <= buf->size); ok &= (stride >= width * kModeBpp[mode]); ok &= (buf->rgba != NULL); } return ok ? VP8_STATUS_OK : VP8_STATUS_INVALID_PARAM; } #undef MIN_BUFFER_SIZE static VP8StatusCode AllocateBuffer(WebPDecBuffer* const buffer) { const int w = buffer->width; const int h = buffer->height; const WEBP_CSP_MODE mode = buffer->colorspace; if (w <= 0 || h <= 0 || !IsValidColorspace(mode)) { return VP8_STATUS_INVALID_PARAM; } if (buffer->is_external_memory <= 0 && buffer->private_memory == NULL) { uint8_t* output; int uv_stride = 0, a_stride = 0; uint64_t uv_size = 0, a_size = 0, total_size; // We need memory and it hasn't been allocated yet. // => initialize output buffer, now that dimensions are known. int stride; uint64_t size; if ((uint64_t)w * kModeBpp[mode] >= (1ull << 31)) { return VP8_STATUS_INVALID_PARAM; } stride = w * kModeBpp[mode]; size = (uint64_t)stride * h; if (!WebPIsRGBMode(mode)) { uv_stride = (w + 1) / 2; uv_size = (uint64_t)uv_stride * ((h + 1) / 2); if (mode == MODE_YUVA) { a_stride = w; a_size = (uint64_t)a_stride * h; } } total_size = size + 2 * uv_size + a_size; output = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*output)); if (output == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } buffer->private_memory = output; if (!WebPIsRGBMode(mode)) { // YUVA initialization WebPYUVABuffer* const buf = &buffer->u.YUVA; buf->y = output; buf->y_stride = stride; buf->y_size = (size_t)size; buf->u = output + size; buf->u_stride = uv_stride; buf->u_size = (size_t)uv_size; buf->v = output + size + uv_size; buf->v_stride = uv_stride; buf->v_size = (size_t)uv_size; if (mode == MODE_YUVA) { buf->a = output + size + 2 * uv_size; } buf->a_size = (size_t)a_size; buf->a_stride = a_stride; } else { // RGBA initialization WebPRGBABuffer* const buf = &buffer->u.RGBA; buf->rgba = output; buf->stride = stride; buf->size = (size_t)size; } } return CheckDecBuffer(buffer); } VP8StatusCode WebPFlipBuffer(WebPDecBuffer* const buffer) { if (buffer == NULL) { return VP8_STATUS_INVALID_PARAM; } if (WebPIsRGBMode(buffer->colorspace)) { WebPRGBABuffer* const buf = &buffer->u.RGBA; buf->rgba += (int64_t)(buffer->height - 1) * buf->stride; buf->stride = -buf->stride; } else { WebPYUVABuffer* const buf = &buffer->u.YUVA; const int64_t H = buffer->height; buf->y += (H - 1) * buf->y_stride; buf->y_stride = -buf->y_stride; buf->u += ((H - 1) >> 1) * buf->u_stride; buf->u_stride = -buf->u_stride; buf->v += ((H - 1) >> 1) * buf->v_stride; buf->v_stride = -buf->v_stride; if (buf->a != NULL) { buf->a += (H - 1) * buf->a_stride; buf->a_stride = -buf->a_stride; } } return VP8_STATUS_OK; } VP8StatusCode WebPAllocateDecBuffer(int width, int height, const WebPDecoderOptions* const options, WebPDecBuffer* const buffer) { VP8StatusCode status; if (buffer == NULL || width <= 0 || height <= 0) { return VP8_STATUS_INVALID_PARAM; } if (options != NULL) { // First, apply options if there is any. if (options->use_cropping) { const int cw = options->crop_width; const int ch = options->crop_height; const int x = options->crop_left & ~1; const int y = options->crop_top & ~1; if (!WebPCheckCropDimensions(width, height, x, y, cw, ch)) { return VP8_STATUS_INVALID_PARAM; // out of frame boundary. } width = cw; height = ch; } if (options->use_scaling) { #if !defined(WEBP_REDUCE_SIZE) int scaled_width = options->scaled_width; int scaled_height = options->scaled_height; if (!WebPRescalerGetScaledDimensions( width, height, &scaled_width, &scaled_height)) { return VP8_STATUS_INVALID_PARAM; } width = scaled_width; height = scaled_height; #else return VP8_STATUS_INVALID_PARAM; // rescaling not supported #endif } } buffer->width = width; buffer->height = height; // Then, allocate buffer for real. status = AllocateBuffer(buffer); if (status != VP8_STATUS_OK) return status; // Use the stride trick if vertical flip is needed. if (options != NULL && options->flip) { status = WebPFlipBuffer(buffer); } return status; } //------------------------------------------------------------------------------ // constructors / destructors int WebPInitDecBufferInternal(WebPDecBuffer* buffer, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_DECODER_ABI_VERSION)) { return 0; // version mismatch } if (buffer == NULL) return 0; memset(buffer, 0, sizeof(*buffer)); return 1; } void WebPFreeDecBuffer(WebPDecBuffer* buffer) { if (buffer != NULL) { if (buffer->is_external_memory <= 0) { WebPSafeFree(buffer->private_memory); } buffer->private_memory = NULL; } } void WebPCopyDecBuffer(const WebPDecBuffer* const src, WebPDecBuffer* const dst) { if (src != NULL && dst != NULL) { *dst = *src; if (src->private_memory != NULL) { dst->is_external_memory = 1; // dst buffer doesn't own the memory. dst->private_memory = NULL; } } } // Copy and transfer ownership from src to dst (beware of parameter order!) void WebPGrabDecBuffer(WebPDecBuffer* const src, WebPDecBuffer* const dst) { if (src != NULL && dst != NULL) { *dst = *src; if (src->private_memory != NULL) { src->is_external_memory = 1; // src relinquishes ownership src->private_memory = NULL; } } } VP8StatusCode WebPCopyDecBufferPixels(const WebPDecBuffer* const src_buf, WebPDecBuffer* const dst_buf) { assert(src_buf != NULL && dst_buf != NULL); assert(src_buf->colorspace == dst_buf->colorspace); dst_buf->width = src_buf->width; dst_buf->height = src_buf->height; if (CheckDecBuffer(dst_buf) != VP8_STATUS_OK) { return VP8_STATUS_INVALID_PARAM; } if (WebPIsRGBMode(src_buf->colorspace)) { const WebPRGBABuffer* const src = &src_buf->u.RGBA; const WebPRGBABuffer* const dst = &dst_buf->u.RGBA; WebPCopyPlane(src->rgba, src->stride, dst->rgba, dst->stride, src_buf->width * kModeBpp[src_buf->colorspace], src_buf->height); } else { const WebPYUVABuffer* const src = &src_buf->u.YUVA; const WebPYUVABuffer* const dst = &dst_buf->u.YUVA; WebPCopyPlane(src->y, src->y_stride, dst->y, dst->y_stride, src_buf->width, src_buf->height); WebPCopyPlane(src->u, src->u_stride, dst->u, dst->u_stride, (src_buf->width + 1) / 2, (src_buf->height + 1) / 2); WebPCopyPlane(src->v, src->v_stride, dst->v, dst->v_stride, (src_buf->width + 1) / 2, (src_buf->height + 1) / 2); if (WebPIsAlphaMode(src_buf->colorspace)) { WebPCopyPlane(src->a, src->a_stride, dst->a, dst->a_stride, src_buf->width, src_buf->height); } } return VP8_STATUS_OK; } int WebPAvoidSlowMemory(const WebPDecBuffer* const output, const WebPBitstreamFeatures* const features) { assert(output != NULL); return (output->is_external_memory >= 2) && WebPIsPremultipliedMode(output->colorspace) && (features != NULL && features->has_alpha); } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/idec_dec.c0000644000014400001440000007602314606317060013270 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Incremental decoding // // Author: somnath@google.com (Somnath Banerjee) #include #include #include #include "src/dec/alphai_dec.h" #include "src/dec/webpi_dec.h" #include "src/dec/vp8_dec.h" #include "src/dec/vp8i_dec.h" #include "src/utils/utils.h" #include "src/webp/decode.h" // In append mode, buffer allocations increase as multiples of this value. // Needs to be a power of 2. #define CHUNK_SIZE 4096 #define MAX_MB_SIZE 4096 //------------------------------------------------------------------------------ // Data structures for memory and states // Decoding states. State normally flows as: // WEBP_HEADER->VP8_HEADER->VP8_PARTS0->VP8_DATA->DONE for a lossy image, and // WEBP_HEADER->VP8L_HEADER->VP8L_DATA->DONE for a lossless image. // If there is any error the decoder goes into state ERROR. typedef enum { STATE_WEBP_HEADER, // All the data before that of the VP8/VP8L chunk. STATE_VP8_HEADER, // The VP8 Frame header (within the VP8 chunk). STATE_VP8_PARTS0, STATE_VP8_DATA, STATE_VP8L_HEADER, STATE_VP8L_DATA, STATE_DONE, STATE_ERROR } DecState; // Operating state for the MemBuffer typedef enum { MEM_MODE_NONE = 0, MEM_MODE_APPEND, MEM_MODE_MAP } MemBufferMode; // storage for partition #0 and partial data (in a rolling fashion) typedef struct { MemBufferMode mode_; // Operation mode size_t start_; // start location of the data to be decoded size_t end_; // end location size_t buf_size_; // size of the allocated buffer uint8_t* buf_; // We don't own this buffer in case WebPIUpdate() size_t part0_size_; // size of partition #0 const uint8_t* part0_buf_; // buffer to store partition #0 } MemBuffer; struct WebPIDecoder { DecState state_; // current decoding state WebPDecParams params_; // Params to store output info int is_lossless_; // for down-casting 'dec_'. void* dec_; // either a VP8Decoder or a VP8LDecoder instance VP8Io io_; MemBuffer mem_; // input memory buffer. WebPDecBuffer output_; // output buffer (when no external one is supplied, // or if the external one has slow-memory) WebPDecBuffer* final_output_; // Slow-memory output to copy to eventually. size_t chunk_size_; // Compressed VP8/VP8L size extracted from Header. int last_mb_y_; // last row reached for intra-mode decoding }; // MB context to restore in case VP8DecodeMB() fails typedef struct { VP8MB left_; VP8MB info_; VP8BitReader token_br_; } MBContext; //------------------------------------------------------------------------------ // MemBuffer: incoming data handling static WEBP_INLINE size_t MemDataSize(const MemBuffer* mem) { return (mem->end_ - mem->start_); } // Check if we need to preserve the compressed alpha data, as it may not have // been decoded yet. static int NeedCompressedAlpha(const WebPIDecoder* const idec) { if (idec->state_ == STATE_WEBP_HEADER) { // We haven't parsed the headers yet, so we don't know whether the image is // lossy or lossless. This also means that we haven't parsed the ALPH chunk. return 0; } if (idec->is_lossless_) { return 0; // ALPH chunk is not present for lossless images. } else { const VP8Decoder* const dec = (VP8Decoder*)idec->dec_; assert(dec != NULL); // Must be true as idec->state_ != STATE_WEBP_HEADER. return (dec->alpha_data_ != NULL) && !dec->is_alpha_decoded_; } } static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) { MemBuffer* const mem = &idec->mem_; const uint8_t* const new_base = mem->buf_ + mem->start_; // note: for VP8, setting up idec->io_ is only really needed at the beginning // of the decoding, till partition #0 is complete. idec->io_.data = new_base; idec->io_.data_size = MemDataSize(mem); if (idec->dec_ != NULL) { if (!idec->is_lossless_) { VP8Decoder* const dec = (VP8Decoder*)idec->dec_; const uint32_t last_part = dec->num_parts_minus_one_; if (offset != 0) { uint32_t p; for (p = 0; p <= last_part; ++p) { VP8RemapBitReader(dec->parts_ + p, offset); } // Remap partition #0 data pointer to new offset, but only in MAP // mode (in APPEND mode, partition #0 is copied into a fixed memory). if (mem->mode_ == MEM_MODE_MAP) { VP8RemapBitReader(&dec->br_, offset); } } { const uint8_t* const last_start = dec->parts_[last_part].buf_; VP8BitReaderSetBuffer(&dec->parts_[last_part], last_start, mem->buf_ + mem->end_ - last_start); } if (NeedCompressedAlpha(idec)) { ALPHDecoder* const alph_dec = dec->alph_dec_; dec->alpha_data_ += offset; if (alph_dec != NULL && alph_dec->vp8l_dec_ != NULL) { if (alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION) { VP8LDecoder* const alph_vp8l_dec = alph_dec->vp8l_dec_; assert(dec->alpha_data_size_ >= ALPHA_HEADER_LEN); VP8LBitReaderSetBuffer(&alph_vp8l_dec->br_, dec->alpha_data_ + ALPHA_HEADER_LEN, dec->alpha_data_size_ - ALPHA_HEADER_LEN); } else { // alph_dec->method_ == ALPHA_NO_COMPRESSION // Nothing special to do in this case. } } } } else { // Resize lossless bitreader VP8LDecoder* const dec = (VP8LDecoder*)idec->dec_; VP8LBitReaderSetBuffer(&dec->br_, new_base, MemDataSize(mem)); } } } // Appends data to the end of MemBuffer->buf_. It expands the allocated memory // size if required and also updates VP8BitReader's if new memory is allocated. WEBP_NODISCARD static int AppendToMemBuffer(WebPIDecoder* const idec, const uint8_t* const data, size_t data_size) { VP8Decoder* const dec = (VP8Decoder*)idec->dec_; MemBuffer* const mem = &idec->mem_; const int need_compressed_alpha = NeedCompressedAlpha(idec); const uint8_t* const old_start = (mem->buf_ == NULL) ? NULL : mem->buf_ + mem->start_; const uint8_t* const old_base = need_compressed_alpha ? dec->alpha_data_ : old_start; assert(mem->buf_ != NULL || mem->start_ == 0); assert(mem->mode_ == MEM_MODE_APPEND); if (data_size > MAX_CHUNK_PAYLOAD) { // security safeguard: trying to allocate more than what the format // allows for a chunk should be considered a smoke smell. return 0; } if (mem->end_ + data_size > mem->buf_size_) { // Need some free memory const size_t new_mem_start = old_start - old_base; const size_t current_size = MemDataSize(mem) + new_mem_start; const uint64_t new_size = (uint64_t)current_size + data_size; const uint64_t extra_size = (new_size + CHUNK_SIZE - 1) & ~(CHUNK_SIZE - 1); uint8_t* const new_buf = (uint8_t*)WebPSafeMalloc(extra_size, sizeof(*new_buf)); if (new_buf == NULL) return 0; if (old_base != NULL) memcpy(new_buf, old_base, current_size); WebPSafeFree(mem->buf_); mem->buf_ = new_buf; mem->buf_size_ = (size_t)extra_size; mem->start_ = new_mem_start; mem->end_ = current_size; } assert(mem->buf_ != NULL); memcpy(mem->buf_ + mem->end_, data, data_size); mem->end_ += data_size; assert(mem->end_ <= mem->buf_size_); DoRemap(idec, mem->buf_ + mem->start_ - old_start); return 1; } WEBP_NODISCARD static int RemapMemBuffer(WebPIDecoder* const idec, const uint8_t* const data, size_t data_size) { MemBuffer* const mem = &idec->mem_; const uint8_t* const old_buf = mem->buf_; const uint8_t* const old_start = (old_buf == NULL) ? NULL : old_buf + mem->start_; assert(old_buf != NULL || mem->start_ == 0); assert(mem->mode_ == MEM_MODE_MAP); if (data_size < mem->buf_size_) return 0; // can't remap to a shorter buffer! mem->buf_ = (uint8_t*)data; mem->end_ = mem->buf_size_ = data_size; DoRemap(idec, mem->buf_ + mem->start_ - old_start); return 1; } static void InitMemBuffer(MemBuffer* const mem) { mem->mode_ = MEM_MODE_NONE; mem->buf_ = NULL; mem->buf_size_ = 0; mem->part0_buf_ = NULL; mem->part0_size_ = 0; } static void ClearMemBuffer(MemBuffer* const mem) { assert(mem); if (mem->mode_ == MEM_MODE_APPEND) { WebPSafeFree(mem->buf_); WebPSafeFree((void*)mem->part0_buf_); } } WEBP_NODISCARD static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) { if (mem->mode_ == MEM_MODE_NONE) { mem->mode_ = expected; // switch to the expected mode } else if (mem->mode_ != expected) { return 0; // we mixed the modes => error } assert(mem->mode_ == expected); // mode is ok return 1; } // To be called last. WEBP_NODISCARD static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) { const WebPDecoderOptions* const options = idec->params_.options; WebPDecBuffer* const output = idec->params_.output; idec->state_ = STATE_DONE; if (options != NULL && options->flip) { const VP8StatusCode status = WebPFlipBuffer(output); if (status != VP8_STATUS_OK) return status; } if (idec->final_output_ != NULL) { const VP8StatusCode status = WebPCopyDecBufferPixels( output, idec->final_output_); // do the slow-copy WebPFreeDecBuffer(&idec->output_); if (status != VP8_STATUS_OK) return status; *output = *idec->final_output_; idec->final_output_ = NULL; } return VP8_STATUS_OK; } //------------------------------------------------------------------------------ // Macroblock-decoding contexts static void SaveContext(const VP8Decoder* dec, const VP8BitReader* token_br, MBContext* const context) { context->left_ = dec->mb_info_[-1]; context->info_ = dec->mb_info_[dec->mb_x_]; context->token_br_ = *token_br; } static void RestoreContext(const MBContext* context, VP8Decoder* const dec, VP8BitReader* const token_br) { dec->mb_info_[-1] = context->left_; dec->mb_info_[dec->mb_x_] = context->info_; *token_br = context->token_br_; } //------------------------------------------------------------------------------ static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) { if (idec->state_ == STATE_VP8_DATA) { // Synchronize the thread, clean-up and check for errors. (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_); } idec->state_ = STATE_ERROR; return error; } static void ChangeState(WebPIDecoder* const idec, DecState new_state, size_t consumed_bytes) { MemBuffer* const mem = &idec->mem_; idec->state_ = new_state; mem->start_ += consumed_bytes; assert(mem->start_ <= mem->end_); idec->io_.data = mem->buf_ + mem->start_; idec->io_.data_size = MemDataSize(mem); } // Headers static VP8StatusCode DecodeWebPHeaders(WebPIDecoder* const idec) { MemBuffer* const mem = &idec->mem_; const uint8_t* data = mem->buf_ + mem->start_; size_t curr_size = MemDataSize(mem); VP8StatusCode status; WebPHeaderStructure headers; headers.data = data; headers.data_size = curr_size; headers.have_all_data = 0; status = WebPParseHeaders(&headers); if (status == VP8_STATUS_NOT_ENOUGH_DATA) { return VP8_STATUS_SUSPENDED; // We haven't found a VP8 chunk yet. } else if (status != VP8_STATUS_OK) { return IDecError(idec, status); } idec->chunk_size_ = headers.compressed_size; idec->is_lossless_ = headers.is_lossless; if (!idec->is_lossless_) { VP8Decoder* const dec = VP8New(); if (dec == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } dec->incremental_ = 1; idec->dec_ = dec; dec->alpha_data_ = headers.alpha_data; dec->alpha_data_size_ = headers.alpha_data_size; ChangeState(idec, STATE_VP8_HEADER, headers.offset); } else { VP8LDecoder* const dec = VP8LNew(); if (dec == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } idec->dec_ = dec; ChangeState(idec, STATE_VP8L_HEADER, headers.offset); } return VP8_STATUS_OK; } static VP8StatusCode DecodeVP8FrameHeader(WebPIDecoder* const idec) { const uint8_t* data = idec->mem_.buf_ + idec->mem_.start_; const size_t curr_size = MemDataSize(&idec->mem_); int width, height; uint32_t bits; if (curr_size < VP8_FRAME_HEADER_SIZE) { // Not enough data bytes to extract VP8 Frame Header. return VP8_STATUS_SUSPENDED; } if (!VP8GetInfo(data, curr_size, idec->chunk_size_, &width, &height)) { return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR); } bits = data[0] | (data[1] << 8) | (data[2] << 16); idec->mem_.part0_size_ = (bits >> 5) + VP8_FRAME_HEADER_SIZE; idec->io_.data = data; idec->io_.data_size = curr_size; idec->state_ = STATE_VP8_PARTS0; return VP8_STATUS_OK; } // Partition #0 static VP8StatusCode CopyParts0Data(WebPIDecoder* const idec) { VP8Decoder* const dec = (VP8Decoder*)idec->dec_; VP8BitReader* const br = &dec->br_; const size_t part_size = br->buf_end_ - br->buf_; MemBuffer* const mem = &idec->mem_; assert(!idec->is_lossless_); assert(mem->part0_buf_ == NULL); // the following is a format limitation, no need for runtime check: assert(part_size <= mem->part0_size_); if (part_size == 0) { // can't have zero-size partition #0 return VP8_STATUS_BITSTREAM_ERROR; } if (mem->mode_ == MEM_MODE_APPEND) { // We copy and grab ownership of the partition #0 data. uint8_t* const part0_buf = (uint8_t*)WebPSafeMalloc(1ULL, part_size); if (part0_buf == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } memcpy(part0_buf, br->buf_, part_size); mem->part0_buf_ = part0_buf; VP8BitReaderSetBuffer(br, part0_buf, part_size); } else { // Else: just keep pointers to the partition #0's data in dec_->br_. } mem->start_ += part_size; return VP8_STATUS_OK; } static VP8StatusCode DecodePartition0(WebPIDecoder* const idec) { VP8Decoder* const dec = (VP8Decoder*)idec->dec_; VP8Io* const io = &idec->io_; const WebPDecParams* const params = &idec->params_; WebPDecBuffer* const output = params->output; // Wait till we have enough data for the whole partition #0 if (MemDataSize(&idec->mem_) < idec->mem_.part0_size_) { return VP8_STATUS_SUSPENDED; } if (!VP8GetHeaders(dec, io)) { const VP8StatusCode status = dec->status_; if (status == VP8_STATUS_SUSPENDED || status == VP8_STATUS_NOT_ENOUGH_DATA) { // treating NOT_ENOUGH_DATA as SUSPENDED state return VP8_STATUS_SUSPENDED; } return IDecError(idec, status); } // Allocate/Verify output buffer now dec->status_ = WebPAllocateDecBuffer(io->width, io->height, params->options, output); if (dec->status_ != VP8_STATUS_OK) { return IDecError(idec, dec->status_); } // This change must be done before calling VP8InitFrame() dec->mt_method_ = VP8GetThreadMethod(params->options, NULL, io->width, io->height); VP8InitDithering(params->options, dec); dec->status_ = CopyParts0Data(idec); if (dec->status_ != VP8_STATUS_OK) { return IDecError(idec, dec->status_); } // Finish setting up the decoding parameters. Will call io->setup(). if (VP8EnterCritical(dec, io) != VP8_STATUS_OK) { return IDecError(idec, dec->status_); } // Note: past this point, teardown() must always be called // in case of error. idec->state_ = STATE_VP8_DATA; // Allocate memory and prepare everything. if (!VP8InitFrame(dec, io)) { return IDecError(idec, dec->status_); } return VP8_STATUS_OK; } // Remaining partitions static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) { VP8Decoder* const dec = (VP8Decoder*)idec->dec_; VP8Io* const io = &idec->io_; // Make sure partition #0 has been read before, to set dec to ready_. if (!dec->ready_) { return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR); } for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) { if (idec->last_mb_y_ != dec->mb_y_) { if (!VP8ParseIntraModeRow(&dec->br_, dec)) { // note: normally, error shouldn't occur since we already have the whole // partition0 available here in DecodeRemaining(). Reaching EOF while // reading intra modes really means a BITSTREAM_ERROR. return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR); } idec->last_mb_y_ = dec->mb_y_; } for (; dec->mb_x_ < dec->mb_w_; ++dec->mb_x_) { VP8BitReader* const token_br = &dec->parts_[dec->mb_y_ & dec->num_parts_minus_one_]; MBContext context; SaveContext(dec, token_br, &context); if (!VP8DecodeMB(dec, token_br)) { // We shouldn't fail when MAX_MB data was available if (dec->num_parts_minus_one_ == 0 && MemDataSize(&idec->mem_) > MAX_MB_SIZE) { return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR); } // Synchronize the threads. if (dec->mt_method_ > 0) { if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) { return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR); } } RestoreContext(&context, dec, token_br); return VP8_STATUS_SUSPENDED; } // Release buffer only if there is only one partition if (dec->num_parts_minus_one_ == 0) { idec->mem_.start_ = token_br->buf_ - idec->mem_.buf_; assert(idec->mem_.start_ <= idec->mem_.end_); } } VP8InitScanline(dec); // Prepare for next scanline // Reconstruct, filter and emit the row. if (!VP8ProcessRow(dec, io)) { return IDecError(idec, VP8_STATUS_USER_ABORT); } } // Synchronize the thread and check for errors. if (!VP8ExitCritical(dec, io)) { idec->state_ = STATE_ERROR; // prevent re-entry in IDecError return IDecError(idec, VP8_STATUS_USER_ABORT); } dec->ready_ = 0; return FinishDecoding(idec); } static VP8StatusCode ErrorStatusLossless(WebPIDecoder* const idec, VP8StatusCode status) { if (status == VP8_STATUS_SUSPENDED || status == VP8_STATUS_NOT_ENOUGH_DATA) { return VP8_STATUS_SUSPENDED; } return IDecError(idec, status); } static VP8StatusCode DecodeVP8LHeader(WebPIDecoder* const idec) { VP8Io* const io = &idec->io_; VP8LDecoder* const dec = (VP8LDecoder*)idec->dec_; const WebPDecParams* const params = &idec->params_; WebPDecBuffer* const output = params->output; size_t curr_size = MemDataSize(&idec->mem_); assert(idec->is_lossless_); // Wait until there's enough data for decoding header. if (curr_size < (idec->chunk_size_ >> 3)) { dec->status_ = VP8_STATUS_SUSPENDED; return ErrorStatusLossless(idec, dec->status_); } if (!VP8LDecodeHeader(dec, io)) { if (dec->status_ == VP8_STATUS_BITSTREAM_ERROR && curr_size < idec->chunk_size_) { dec->status_ = VP8_STATUS_SUSPENDED; } return ErrorStatusLossless(idec, dec->status_); } // Allocate/verify output buffer now. dec->status_ = WebPAllocateDecBuffer(io->width, io->height, params->options, output); if (dec->status_ != VP8_STATUS_OK) { return IDecError(idec, dec->status_); } idec->state_ = STATE_VP8L_DATA; return VP8_STATUS_OK; } static VP8StatusCode DecodeVP8LData(WebPIDecoder* const idec) { VP8LDecoder* const dec = (VP8LDecoder*)idec->dec_; const size_t curr_size = MemDataSize(&idec->mem_); assert(idec->is_lossless_); // Switch to incremental decoding if we don't have all the bytes available. dec->incremental_ = (curr_size < idec->chunk_size_); if (!VP8LDecodeImage(dec)) { return ErrorStatusLossless(idec, dec->status_); } assert(dec->status_ == VP8_STATUS_OK || dec->status_ == VP8_STATUS_SUSPENDED); return (dec->status_ == VP8_STATUS_SUSPENDED) ? dec->status_ : FinishDecoding(idec); } // Main decoding loop static VP8StatusCode IDecode(WebPIDecoder* idec) { VP8StatusCode status = VP8_STATUS_SUSPENDED; if (idec->state_ == STATE_WEBP_HEADER) { status = DecodeWebPHeaders(idec); } else { if (idec->dec_ == NULL) { return VP8_STATUS_SUSPENDED; // can't continue if we have no decoder. } } if (idec->state_ == STATE_VP8_HEADER) { status = DecodeVP8FrameHeader(idec); } if (idec->state_ == STATE_VP8_PARTS0) { status = DecodePartition0(idec); } if (idec->state_ == STATE_VP8_DATA) { const VP8Decoder* const dec = (VP8Decoder*)idec->dec_; if (dec == NULL) { return VP8_STATUS_SUSPENDED; // can't continue if we have no decoder. } status = DecodeRemaining(idec); } if (idec->state_ == STATE_VP8L_HEADER) { status = DecodeVP8LHeader(idec); } if (idec->state_ == STATE_VP8L_DATA) { status = DecodeVP8LData(idec); } return status; } //------------------------------------------------------------------------------ // Internal constructor WEBP_NODISCARD static WebPIDecoder* NewDecoder( WebPDecBuffer* const output_buffer, const WebPBitstreamFeatures* const features) { WebPIDecoder* idec = (WebPIDecoder*)WebPSafeCalloc(1ULL, sizeof(*idec)); if (idec == NULL) { return NULL; } idec->state_ = STATE_WEBP_HEADER; idec->chunk_size_ = 0; idec->last_mb_y_ = -1; InitMemBuffer(&idec->mem_); if (!WebPInitDecBuffer(&idec->output_) || !VP8InitIo(&idec->io_)) { WebPSafeFree(idec); return NULL; } WebPResetDecParams(&idec->params_); if (output_buffer == NULL || WebPAvoidSlowMemory(output_buffer, features)) { idec->params_.output = &idec->output_; idec->final_output_ = output_buffer; if (output_buffer != NULL) { idec->params_.output->colorspace = output_buffer->colorspace; } } else { idec->params_.output = output_buffer; idec->final_output_ = NULL; } WebPInitCustomIo(&idec->params_, &idec->io_); // Plug the I/O functions. return idec; } //------------------------------------------------------------------------------ // Public functions WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer) { return NewDecoder(output_buffer, NULL); } WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size, WebPDecoderConfig* config) { WebPIDecoder* idec; WebPBitstreamFeatures tmp_features; WebPBitstreamFeatures* const features = (config == NULL) ? &tmp_features : &config->input; memset(&tmp_features, 0, sizeof(tmp_features)); // Parse the bitstream's features, if requested: if (data != NULL && data_size > 0) { if (WebPGetFeatures(data, data_size, features) != VP8_STATUS_OK) { return NULL; } } // Create an instance of the incremental decoder idec = (config != NULL) ? NewDecoder(&config->output, features) : NewDecoder(NULL, features); if (idec == NULL) { return NULL; } // Finish initialization if (config != NULL) { idec->params_.options = &config->options; } return idec; } void WebPIDelete(WebPIDecoder* idec) { if (idec == NULL) return; if (idec->dec_ != NULL) { if (!idec->is_lossless_) { if (idec->state_ == STATE_VP8_DATA) { // Synchronize the thread, clean-up and check for errors. // TODO(vrabaud) do we care about the return result? (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_); } VP8Delete((VP8Decoder*)idec->dec_); } else { VP8LDelete((VP8LDecoder*)idec->dec_); } } ClearMemBuffer(&idec->mem_); WebPFreeDecBuffer(&idec->output_); WebPSafeFree(idec); } //------------------------------------------------------------------------------ // Wrapper toward WebPINewDecoder WebPIDecoder* WebPINewRGB(WEBP_CSP_MODE csp, uint8_t* output_buffer, size_t output_buffer_size, int output_stride) { const int is_external_memory = (output_buffer != NULL) ? 1 : 0; WebPIDecoder* idec; if (csp >= MODE_YUV) return NULL; if (is_external_memory == 0) { // Overwrite parameters to sane values. output_buffer_size = 0; output_stride = 0; } else { // A buffer was passed. Validate the other params. if (output_stride == 0 || output_buffer_size == 0) { return NULL; // invalid parameter. } } idec = WebPINewDecoder(NULL); if (idec == NULL) return NULL; idec->output_.colorspace = csp; idec->output_.is_external_memory = is_external_memory; idec->output_.u.RGBA.rgba = output_buffer; idec->output_.u.RGBA.stride = output_stride; idec->output_.u.RGBA.size = output_buffer_size; return idec; } WebPIDecoder* WebPINewYUVA(uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride, uint8_t* a, size_t a_size, int a_stride) { const int is_external_memory = (luma != NULL) ? 1 : 0; WebPIDecoder* idec; WEBP_CSP_MODE colorspace; if (is_external_memory == 0) { // Overwrite parameters to sane values. luma_size = u_size = v_size = a_size = 0; luma_stride = u_stride = v_stride = a_stride = 0; u = v = a = NULL; colorspace = MODE_YUVA; } else { // A luma buffer was passed. Validate the other parameters. if (u == NULL || v == NULL) return NULL; if (luma_size == 0 || u_size == 0 || v_size == 0) return NULL; if (luma_stride == 0 || u_stride == 0 || v_stride == 0) return NULL; if (a != NULL) { if (a_size == 0 || a_stride == 0) return NULL; } colorspace = (a == NULL) ? MODE_YUV : MODE_YUVA; } idec = WebPINewDecoder(NULL); if (idec == NULL) return NULL; idec->output_.colorspace = colorspace; idec->output_.is_external_memory = is_external_memory; idec->output_.u.YUVA.y = luma; idec->output_.u.YUVA.y_stride = luma_stride; idec->output_.u.YUVA.y_size = luma_size; idec->output_.u.YUVA.u = u; idec->output_.u.YUVA.u_stride = u_stride; idec->output_.u.YUVA.u_size = u_size; idec->output_.u.YUVA.v = v; idec->output_.u.YUVA.v_stride = v_stride; idec->output_.u.YUVA.v_size = v_size; idec->output_.u.YUVA.a = a; idec->output_.u.YUVA.a_stride = a_stride; idec->output_.u.YUVA.a_size = a_size; return idec; } WebPIDecoder* WebPINewYUV(uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride) { return WebPINewYUVA(luma, luma_size, luma_stride, u, u_size, u_stride, v, v_size, v_stride, NULL, 0, 0); } //------------------------------------------------------------------------------ static VP8StatusCode IDecCheckStatus(const WebPIDecoder* const idec) { assert(idec); if (idec->state_ == STATE_ERROR) { return VP8_STATUS_BITSTREAM_ERROR; } if (idec->state_ == STATE_DONE) { return VP8_STATUS_OK; } return VP8_STATUS_SUSPENDED; } VP8StatusCode WebPIAppend(WebPIDecoder* idec, const uint8_t* data, size_t data_size) { VP8StatusCode status; if (idec == NULL || data == NULL) { return VP8_STATUS_INVALID_PARAM; } status = IDecCheckStatus(idec); if (status != VP8_STATUS_SUSPENDED) { return status; } // Check mixed calls between RemapMemBuffer and AppendToMemBuffer. if (!CheckMemBufferMode(&idec->mem_, MEM_MODE_APPEND)) { return VP8_STATUS_INVALID_PARAM; } // Append data to memory buffer if (!AppendToMemBuffer(idec, data, data_size)) { return VP8_STATUS_OUT_OF_MEMORY; } return IDecode(idec); } VP8StatusCode WebPIUpdate(WebPIDecoder* idec, const uint8_t* data, size_t data_size) { VP8StatusCode status; if (idec == NULL || data == NULL) { return VP8_STATUS_INVALID_PARAM; } status = IDecCheckStatus(idec); if (status != VP8_STATUS_SUSPENDED) { return status; } // Check mixed calls between RemapMemBuffer and AppendToMemBuffer. if (!CheckMemBufferMode(&idec->mem_, MEM_MODE_MAP)) { return VP8_STATUS_INVALID_PARAM; } // Make the memory buffer point to the new buffer if (!RemapMemBuffer(idec, data, data_size)) { return VP8_STATUS_INVALID_PARAM; } return IDecode(idec); } //------------------------------------------------------------------------------ static const WebPDecBuffer* GetOutputBuffer(const WebPIDecoder* const idec) { if (idec == NULL || idec->dec_ == NULL) { return NULL; } if (idec->state_ <= STATE_VP8_PARTS0) { return NULL; } if (idec->final_output_ != NULL) { return NULL; // not yet slow-copied } return idec->params_.output; } const WebPDecBuffer* WebPIDecodedArea(const WebPIDecoder* idec, int* left, int* top, int* width, int* height) { const WebPDecBuffer* const src = GetOutputBuffer(idec); if (left != NULL) *left = 0; if (top != NULL) *top = 0; if (src != NULL) { if (width != NULL) *width = src->width; if (height != NULL) *height = idec->params_.last_y; } else { if (width != NULL) *width = 0; if (height != NULL) *height = 0; } return src; } WEBP_NODISCARD uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y, int* width, int* height, int* stride) { const WebPDecBuffer* const src = GetOutputBuffer(idec); if (src == NULL) return NULL; if (src->colorspace >= MODE_YUV) { return NULL; } if (last_y != NULL) *last_y = idec->params_.last_y; if (width != NULL) *width = src->width; if (height != NULL) *height = src->height; if (stride != NULL) *stride = src->u.RGBA.stride; return src->u.RGBA.rgba; } WEBP_NODISCARD uint8_t* WebPIDecGetYUVA(const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, uint8_t** a, int* width, int* height, int* stride, int* uv_stride, int* a_stride) { const WebPDecBuffer* const src = GetOutputBuffer(idec); if (src == NULL) return NULL; if (src->colorspace < MODE_YUV) { return NULL; } if (last_y != NULL) *last_y = idec->params_.last_y; if (u != NULL) *u = src->u.YUVA.u; if (v != NULL) *v = src->u.YUVA.v; if (a != NULL) *a = src->u.YUVA.a; if (width != NULL) *width = src->width; if (height != NULL) *height = src->height; if (stride != NULL) *stride = src->u.YUVA.y_stride; if (uv_stride != NULL) *uv_stride = src->u.YUVA.u_stride; if (a_stride != NULL) *a_stride = src->u.YUVA.a_stride; return src->u.YUVA.y; } int WebPISetIOHooks(WebPIDecoder* const idec, VP8IoPutHook put, VP8IoSetupHook setup, VP8IoTeardownHook teardown, void* user_data) { if (idec == NULL || idec->state_ > STATE_WEBP_HEADER) { return 0; } idec->io_.put = put; idec->io_.setup = setup; idec->io_.teardown = teardown; idec->io_.opaque = user_data; return 1; } libwebp-1.4.0/src/dec/frame_dec.c0000644000014400001440000006714214606317060013460 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Frame-reconstruction function. Memory allocation. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dec/vp8i_dec.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Main reconstruction function. static const uint16_t kScan[16] = { 0 + 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS, 0 + 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS, 0 + 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS, 0 + 12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS }; static int CheckMode(int mb_x, int mb_y, int mode) { if (mode == B_DC_PRED) { if (mb_x == 0) { return (mb_y == 0) ? B_DC_PRED_NOTOPLEFT : B_DC_PRED_NOLEFT; } else { return (mb_y == 0) ? B_DC_PRED_NOTOP : B_DC_PRED; } } return mode; } static void Copy32b(uint8_t* const dst, const uint8_t* const src) { memcpy(dst, src, 4); } static WEBP_INLINE void DoTransform(uint32_t bits, const int16_t* const src, uint8_t* const dst) { switch (bits >> 30) { case 3: VP8Transform(src, dst, 0); break; case 2: VP8TransformAC3(src, dst); break; case 1: VP8TransformDC(src, dst); break; default: break; } } static void DoUVTransform(uint32_t bits, const int16_t* const src, uint8_t* const dst) { if (bits & 0xff) { // any non-zero coeff at all? if (bits & 0xaa) { // any non-zero AC coefficient? VP8TransformUV(src, dst); // note we don't use the AC3 variant for U/V } else { VP8TransformDCUV(src, dst); } } } static void ReconstructRow(const VP8Decoder* const dec, const VP8ThreadContext* ctx) { int j; int mb_x; const int mb_y = ctx->mb_y_; const int cache_id = ctx->id_; uint8_t* const y_dst = dec->yuv_b_ + Y_OFF; uint8_t* const u_dst = dec->yuv_b_ + U_OFF; uint8_t* const v_dst = dec->yuv_b_ + V_OFF; // Initialize left-most block. for (j = 0; j < 16; ++j) { y_dst[j * BPS - 1] = 129; } for (j = 0; j < 8; ++j) { u_dst[j * BPS - 1] = 129; v_dst[j * BPS - 1] = 129; } // Init top-left sample on left column too. if (mb_y > 0) { y_dst[-1 - BPS] = u_dst[-1 - BPS] = v_dst[-1 - BPS] = 129; } else { // we only need to do this init once at block (0,0). // Afterward, it remains valid for the whole topmost row. memset(y_dst - BPS - 1, 127, 16 + 4 + 1); memset(u_dst - BPS - 1, 127, 8 + 1); memset(v_dst - BPS - 1, 127, 8 + 1); } // Reconstruct one row. for (mb_x = 0; mb_x < dec->mb_w_; ++mb_x) { const VP8MBData* const block = ctx->mb_data_ + mb_x; // Rotate in the left samples from previously decoded block. We move four // pixels at a time for alignment reason, and because of in-loop filter. if (mb_x > 0) { for (j = -1; j < 16; ++j) { Copy32b(&y_dst[j * BPS - 4], &y_dst[j * BPS + 12]); } for (j = -1; j < 8; ++j) { Copy32b(&u_dst[j * BPS - 4], &u_dst[j * BPS + 4]); Copy32b(&v_dst[j * BPS - 4], &v_dst[j * BPS + 4]); } } { // bring top samples into the cache VP8TopSamples* const top_yuv = dec->yuv_t_ + mb_x; const int16_t* const coeffs = block->coeffs_; uint32_t bits = block->non_zero_y_; int n; if (mb_y > 0) { memcpy(y_dst - BPS, top_yuv[0].y, 16); memcpy(u_dst - BPS, top_yuv[0].u, 8); memcpy(v_dst - BPS, top_yuv[0].v, 8); } // predict and add residuals if (block->is_i4x4_) { // 4x4 uint32_t* const top_right = (uint32_t*)(y_dst - BPS + 16); if (mb_y > 0) { if (mb_x >= dec->mb_w_ - 1) { // on rightmost border memset(top_right, top_yuv[0].y[15], sizeof(*top_right)); } else { memcpy(top_right, top_yuv[1].y, sizeof(*top_right)); } } // replicate the top-right pixels below top_right[BPS] = top_right[2 * BPS] = top_right[3 * BPS] = top_right[0]; // predict and add residuals for all 4x4 blocks in turn. for (n = 0; n < 16; ++n, bits <<= 2) { uint8_t* const dst = y_dst + kScan[n]; VP8PredLuma4[block->imodes_[n]](dst); DoTransform(bits, coeffs + n * 16, dst); } } else { // 16x16 const int pred_func = CheckMode(mb_x, mb_y, block->imodes_[0]); VP8PredLuma16[pred_func](y_dst); if (bits != 0) { for (n = 0; n < 16; ++n, bits <<= 2) { DoTransform(bits, coeffs + n * 16, y_dst + kScan[n]); } } } { // Chroma const uint32_t bits_uv = block->non_zero_uv_; const int pred_func = CheckMode(mb_x, mb_y, block->uvmode_); VP8PredChroma8[pred_func](u_dst); VP8PredChroma8[pred_func](v_dst); DoUVTransform(bits_uv >> 0, coeffs + 16 * 16, u_dst); DoUVTransform(bits_uv >> 8, coeffs + 20 * 16, v_dst); } // stash away top samples for next block if (mb_y < dec->mb_h_ - 1) { memcpy(top_yuv[0].y, y_dst + 15 * BPS, 16); memcpy(top_yuv[0].u, u_dst + 7 * BPS, 8); memcpy(top_yuv[0].v, v_dst + 7 * BPS, 8); } } // Transfer reconstructed samples from yuv_b_ cache to final destination. { const int y_offset = cache_id * 16 * dec->cache_y_stride_; const int uv_offset = cache_id * 8 * dec->cache_uv_stride_; uint8_t* const y_out = dec->cache_y_ + mb_x * 16 + y_offset; uint8_t* const u_out = dec->cache_u_ + mb_x * 8 + uv_offset; uint8_t* const v_out = dec->cache_v_ + mb_x * 8 + uv_offset; for (j = 0; j < 16; ++j) { memcpy(y_out + j * dec->cache_y_stride_, y_dst + j * BPS, 16); } for (j = 0; j < 8; ++j) { memcpy(u_out + j * dec->cache_uv_stride_, u_dst + j * BPS, 8); memcpy(v_out + j * dec->cache_uv_stride_, v_dst + j * BPS, 8); } } } } //------------------------------------------------------------------------------ // Filtering // kFilterExtraRows[] = How many extra lines are needed on the MB boundary // for caching, given a filtering level. // Simple filter: up to 2 luma samples are read and 1 is written. // Complex filter: up to 4 luma samples are read and 3 are written. Same for // U/V, so it's 8 samples total (because of the 2x upsampling). static const uint8_t kFilterExtraRows[3] = { 0, 2, 8 }; static void DoFilter(const VP8Decoder* const dec, int mb_x, int mb_y) { const VP8ThreadContext* const ctx = &dec->thread_ctx_; const int cache_id = ctx->id_; const int y_bps = dec->cache_y_stride_; const VP8FInfo* const f_info = ctx->f_info_ + mb_x; uint8_t* const y_dst = dec->cache_y_ + cache_id * 16 * y_bps + mb_x * 16; const int ilevel = f_info->f_ilevel_; const int limit = f_info->f_limit_; if (limit == 0) { return; } assert(limit >= 3); if (dec->filter_type_ == 1) { // simple if (mb_x > 0) { VP8SimpleHFilter16(y_dst, y_bps, limit + 4); } if (f_info->f_inner_) { VP8SimpleHFilter16i(y_dst, y_bps, limit); } if (mb_y > 0) { VP8SimpleVFilter16(y_dst, y_bps, limit + 4); } if (f_info->f_inner_) { VP8SimpleVFilter16i(y_dst, y_bps, limit); } } else { // complex const int uv_bps = dec->cache_uv_stride_; uint8_t* const u_dst = dec->cache_u_ + cache_id * 8 * uv_bps + mb_x * 8; uint8_t* const v_dst = dec->cache_v_ + cache_id * 8 * uv_bps + mb_x * 8; const int hev_thresh = f_info->hev_thresh_; if (mb_x > 0) { VP8HFilter16(y_dst, y_bps, limit + 4, ilevel, hev_thresh); VP8HFilter8(u_dst, v_dst, uv_bps, limit + 4, ilevel, hev_thresh); } if (f_info->f_inner_) { VP8HFilter16i(y_dst, y_bps, limit, ilevel, hev_thresh); VP8HFilter8i(u_dst, v_dst, uv_bps, limit, ilevel, hev_thresh); } if (mb_y > 0) { VP8VFilter16(y_dst, y_bps, limit + 4, ilevel, hev_thresh); VP8VFilter8(u_dst, v_dst, uv_bps, limit + 4, ilevel, hev_thresh); } if (f_info->f_inner_) { VP8VFilter16i(y_dst, y_bps, limit, ilevel, hev_thresh); VP8VFilter8i(u_dst, v_dst, uv_bps, limit, ilevel, hev_thresh); } } } // Filter the decoded macroblock row (if needed) static void FilterRow(const VP8Decoder* const dec) { int mb_x; const int mb_y = dec->thread_ctx_.mb_y_; assert(dec->thread_ctx_.filter_row_); for (mb_x = dec->tl_mb_x_; mb_x < dec->br_mb_x_; ++mb_x) { DoFilter(dec, mb_x, mb_y); } } //------------------------------------------------------------------------------ // Precompute the filtering strength for each segment and each i4x4/i16x16 mode. static void PrecomputeFilterStrengths(VP8Decoder* const dec) { if (dec->filter_type_ > 0) { int s; const VP8FilterHeader* const hdr = &dec->filter_hdr_; for (s = 0; s < NUM_MB_SEGMENTS; ++s) { int i4x4; // First, compute the initial level int base_level; if (dec->segment_hdr_.use_segment_) { base_level = dec->segment_hdr_.filter_strength_[s]; if (!dec->segment_hdr_.absolute_delta_) { base_level += hdr->level_; } } else { base_level = hdr->level_; } for (i4x4 = 0; i4x4 <= 1; ++i4x4) { VP8FInfo* const info = &dec->fstrengths_[s][i4x4]; int level = base_level; if (hdr->use_lf_delta_) { level += hdr->ref_lf_delta_[0]; if (i4x4) { level += hdr->mode_lf_delta_[0]; } } level = (level < 0) ? 0 : (level > 63) ? 63 : level; if (level > 0) { int ilevel = level; if (hdr->sharpness_ > 0) { if (hdr->sharpness_ > 4) { ilevel >>= 2; } else { ilevel >>= 1; } if (ilevel > 9 - hdr->sharpness_) { ilevel = 9 - hdr->sharpness_; } } if (ilevel < 1) ilevel = 1; info->f_ilevel_ = ilevel; info->f_limit_ = 2 * level + ilevel; info->hev_thresh_ = (level >= 40) ? 2 : (level >= 15) ? 1 : 0; } else { info->f_limit_ = 0; // no filtering } info->f_inner_ = i4x4; } } } } //------------------------------------------------------------------------------ // Dithering // minimal amp that will provide a non-zero dithering effect #define MIN_DITHER_AMP 4 #define DITHER_AMP_TAB_SIZE 12 static const uint8_t kQuantToDitherAmp[DITHER_AMP_TAB_SIZE] = { // roughly, it's dqm->uv_mat_[1] 8, 7, 6, 4, 4, 2, 2, 2, 1, 1, 1, 1 }; void VP8InitDithering(const WebPDecoderOptions* const options, VP8Decoder* const dec) { assert(dec != NULL); if (options != NULL) { const int d = options->dithering_strength; const int max_amp = (1 << VP8_RANDOM_DITHER_FIX) - 1; const int f = (d < 0) ? 0 : (d > 100) ? max_amp : (d * max_amp / 100); if (f > 0) { int s; int all_amp = 0; for (s = 0; s < NUM_MB_SEGMENTS; ++s) { VP8QuantMatrix* const dqm = &dec->dqm_[s]; if (dqm->uv_quant_ < DITHER_AMP_TAB_SIZE) { const int idx = (dqm->uv_quant_ < 0) ? 0 : dqm->uv_quant_; dqm->dither_ = (f * kQuantToDitherAmp[idx]) >> 3; } all_amp |= dqm->dither_; } if (all_amp != 0) { VP8InitRandom(&dec->dithering_rg_, 1.0f); dec->dither_ = 1; } } // potentially allow alpha dithering dec->alpha_dithering_ = options->alpha_dithering_strength; if (dec->alpha_dithering_ > 100) { dec->alpha_dithering_ = 100; } else if (dec->alpha_dithering_ < 0) { dec->alpha_dithering_ = 0; } } } // Convert to range: [-2,2] for dither=50, [-4,4] for dither=100 static void Dither8x8(VP8Random* const rg, uint8_t* dst, int bps, int amp) { uint8_t dither[64]; int i; for (i = 0; i < 8 * 8; ++i) { dither[i] = VP8RandomBits2(rg, VP8_DITHER_AMP_BITS + 1, amp); } VP8DitherCombine8x8(dither, dst, bps); } static void DitherRow(VP8Decoder* const dec) { int mb_x; assert(dec->dither_); for (mb_x = dec->tl_mb_x_; mb_x < dec->br_mb_x_; ++mb_x) { const VP8ThreadContext* const ctx = &dec->thread_ctx_; const VP8MBData* const data = ctx->mb_data_ + mb_x; const int cache_id = ctx->id_; const int uv_bps = dec->cache_uv_stride_; if (data->dither_ >= MIN_DITHER_AMP) { uint8_t* const u_dst = dec->cache_u_ + cache_id * 8 * uv_bps + mb_x * 8; uint8_t* const v_dst = dec->cache_v_ + cache_id * 8 * uv_bps + mb_x * 8; Dither8x8(&dec->dithering_rg_, u_dst, uv_bps, data->dither_); Dither8x8(&dec->dithering_rg_, v_dst, uv_bps, data->dither_); } } } //------------------------------------------------------------------------------ // This function is called after a row of macroblocks is finished decoding. // It also takes into account the following restrictions: // * In case of in-loop filtering, we must hold off sending some of the bottom // pixels as they are yet unfiltered. They will be when the next macroblock // row is decoded. Meanwhile, we must preserve them by rotating them in the // cache area. This doesn't hold for the very bottom row of the uncropped // picture of course. // * we must clip the remaining pixels against the cropping area. The VP8Io // struct must have the following fields set correctly before calling put(): #define MACROBLOCK_VPOS(mb_y) ((mb_y) * 16) // vertical position of a MB // Finalize and transmit a complete row. Return false in case of user-abort. static int FinishRow(void* arg1, void* arg2) { VP8Decoder* const dec = (VP8Decoder*)arg1; VP8Io* const io = (VP8Io*)arg2; int ok = 1; const VP8ThreadContext* const ctx = &dec->thread_ctx_; const int cache_id = ctx->id_; const int extra_y_rows = kFilterExtraRows[dec->filter_type_]; const int ysize = extra_y_rows * dec->cache_y_stride_; const int uvsize = (extra_y_rows / 2) * dec->cache_uv_stride_; const int y_offset = cache_id * 16 * dec->cache_y_stride_; const int uv_offset = cache_id * 8 * dec->cache_uv_stride_; uint8_t* const ydst = dec->cache_y_ - ysize + y_offset; uint8_t* const udst = dec->cache_u_ - uvsize + uv_offset; uint8_t* const vdst = dec->cache_v_ - uvsize + uv_offset; const int mb_y = ctx->mb_y_; const int is_first_row = (mb_y == 0); const int is_last_row = (mb_y >= dec->br_mb_y_ - 1); if (dec->mt_method_ == 2) { ReconstructRow(dec, ctx); } if (ctx->filter_row_) { FilterRow(dec); } if (dec->dither_) { DitherRow(dec); } if (io->put != NULL) { int y_start = MACROBLOCK_VPOS(mb_y); int y_end = MACROBLOCK_VPOS(mb_y + 1); if (!is_first_row) { y_start -= extra_y_rows; io->y = ydst; io->u = udst; io->v = vdst; } else { io->y = dec->cache_y_ + y_offset; io->u = dec->cache_u_ + uv_offset; io->v = dec->cache_v_ + uv_offset; } if (!is_last_row) { y_end -= extra_y_rows; } if (y_end > io->crop_bottom) { y_end = io->crop_bottom; // make sure we don't overflow on last row. } // If dec->alpha_data_ is not NULL, we have some alpha plane present. io->a = NULL; if (dec->alpha_data_ != NULL && y_start < y_end) { io->a = VP8DecompressAlphaRows(dec, io, y_start, y_end - y_start); if (io->a == NULL) { return VP8SetError(dec, VP8_STATUS_BITSTREAM_ERROR, "Could not decode alpha data."); } } if (y_start < io->crop_top) { const int delta_y = io->crop_top - y_start; y_start = io->crop_top; assert(!(delta_y & 1)); io->y += dec->cache_y_stride_ * delta_y; io->u += dec->cache_uv_stride_ * (delta_y >> 1); io->v += dec->cache_uv_stride_ * (delta_y >> 1); if (io->a != NULL) { io->a += io->width * delta_y; } } if (y_start < y_end) { io->y += io->crop_left; io->u += io->crop_left >> 1; io->v += io->crop_left >> 1; if (io->a != NULL) { io->a += io->crop_left; } io->mb_y = y_start - io->crop_top; io->mb_w = io->crop_right - io->crop_left; io->mb_h = y_end - y_start; ok = io->put(io); } } // rotate top samples if needed if (cache_id + 1 == dec->num_caches_) { if (!is_last_row) { memcpy(dec->cache_y_ - ysize, ydst + 16 * dec->cache_y_stride_, ysize); memcpy(dec->cache_u_ - uvsize, udst + 8 * dec->cache_uv_stride_, uvsize); memcpy(dec->cache_v_ - uvsize, vdst + 8 * dec->cache_uv_stride_, uvsize); } } return ok; } #undef MACROBLOCK_VPOS //------------------------------------------------------------------------------ int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io) { int ok = 1; VP8ThreadContext* const ctx = &dec->thread_ctx_; const int filter_row = (dec->filter_type_ > 0) && (dec->mb_y_ >= dec->tl_mb_y_) && (dec->mb_y_ <= dec->br_mb_y_); if (dec->mt_method_ == 0) { // ctx->id_ and ctx->f_info_ are already set ctx->mb_y_ = dec->mb_y_; ctx->filter_row_ = filter_row; ReconstructRow(dec, ctx); ok = FinishRow(dec, io); } else { WebPWorker* const worker = &dec->worker_; // Finish previous job *before* updating context ok &= WebPGetWorkerInterface()->Sync(worker); assert(worker->status_ == OK); if (ok) { // spawn a new deblocking/output job ctx->io_ = *io; ctx->id_ = dec->cache_id_; ctx->mb_y_ = dec->mb_y_; ctx->filter_row_ = filter_row; if (dec->mt_method_ == 2) { // swap macroblock data VP8MBData* const tmp = ctx->mb_data_; ctx->mb_data_ = dec->mb_data_; dec->mb_data_ = tmp; } else { // perform reconstruction directly in main thread ReconstructRow(dec, ctx); } if (filter_row) { // swap filter info VP8FInfo* const tmp = ctx->f_info_; ctx->f_info_ = dec->f_info_; dec->f_info_ = tmp; } // (reconstruct)+filter in parallel WebPGetWorkerInterface()->Launch(worker); if (++dec->cache_id_ == dec->num_caches_) { dec->cache_id_ = 0; } } } return ok; } //------------------------------------------------------------------------------ // Finish setting up the decoding parameter once user's setup() is called. VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io) { // Call setup() first. This may trigger additional decoding features on 'io'. // Note: Afterward, we must call teardown() no matter what. if (io->setup != NULL && !io->setup(io)) { VP8SetError(dec, VP8_STATUS_USER_ABORT, "Frame setup failed"); return dec->status_; } // Disable filtering per user request if (io->bypass_filtering) { dec->filter_type_ = 0; } // Define the area where we can skip in-loop filtering, in case of cropping. // // 'Simple' filter reads two luma samples outside of the macroblock // and filters one. It doesn't filter the chroma samples. Hence, we can // avoid doing the in-loop filtering before crop_top/crop_left position. // For the 'Complex' filter, 3 samples are read and up to 3 are filtered. // Means: there's a dependency chain that goes all the way up to the // top-left corner of the picture (MB #0). We must filter all the previous // macroblocks. { const int extra_pixels = kFilterExtraRows[dec->filter_type_]; if (dec->filter_type_ == 2) { // For complex filter, we need to preserve the dependency chain. dec->tl_mb_x_ = 0; dec->tl_mb_y_ = 0; } else { // For simple filter, we can filter only the cropped region. // We include 'extra_pixels' on the other side of the boundary, since // vertical or horizontal filtering of the previous macroblock can // modify some abutting pixels. dec->tl_mb_x_ = (io->crop_left - extra_pixels) >> 4; dec->tl_mb_y_ = (io->crop_top - extra_pixels) >> 4; if (dec->tl_mb_x_ < 0) dec->tl_mb_x_ = 0; if (dec->tl_mb_y_ < 0) dec->tl_mb_y_ = 0; } // We need some 'extra' pixels on the right/bottom. dec->br_mb_y_ = (io->crop_bottom + 15 + extra_pixels) >> 4; dec->br_mb_x_ = (io->crop_right + 15 + extra_pixels) >> 4; if (dec->br_mb_x_ > dec->mb_w_) { dec->br_mb_x_ = dec->mb_w_; } if (dec->br_mb_y_ > dec->mb_h_) { dec->br_mb_y_ = dec->mb_h_; } } PrecomputeFilterStrengths(dec); return VP8_STATUS_OK; } int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io) { int ok = 1; if (dec->mt_method_ > 0) { ok = WebPGetWorkerInterface()->Sync(&dec->worker_); } if (io->teardown != NULL) { io->teardown(io); } return ok; } //------------------------------------------------------------------------------ // For multi-threaded decoding we need to use 3 rows of 16 pixels as delay line. // // Reason is: the deblocking filter cannot deblock the bottom horizontal edges // immediately, and needs to wait for first few rows of the next macroblock to // be decoded. Hence, deblocking is lagging behind by 4 or 8 pixels (depending // on strength). // With two threads, the vertical positions of the rows being decoded are: // Decode: [ 0..15][16..31][32..47][48..63][64..79][... // Deblock: [ 0..11][12..27][28..43][44..59][... // If we use two threads and two caches of 16 pixels, the sequence would be: // Decode: [ 0..15][16..31][ 0..15!!][16..31][ 0..15][... // Deblock: [ 0..11][12..27!!][-4..11][12..27][... // The problem occurs during row [12..15!!] that both the decoding and // deblocking threads are writing simultaneously. // With 3 cache lines, one get a safe write pattern: // Decode: [ 0..15][16..31][32..47][ 0..15][16..31][32..47][0.. // Deblock: [ 0..11][12..27][28..43][-4..11][12..27][28... // Note that multi-threaded output _without_ deblocking can make use of two // cache lines of 16 pixels only, since there's no lagging behind. The decoding // and output process have non-concurrent writing: // Decode: [ 0..15][16..31][ 0..15][16..31][... // io->put: [ 0..15][16..31][ 0..15][... #define MT_CACHE_LINES 3 #define ST_CACHE_LINES 1 // 1 cache row only for single-threaded case // Initialize multi/single-thread worker static int InitThreadContext(VP8Decoder* const dec) { dec->cache_id_ = 0; if (dec->mt_method_ > 0) { WebPWorker* const worker = &dec->worker_; if (!WebPGetWorkerInterface()->Reset(worker)) { return VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY, "thread initialization failed."); } worker->data1 = dec; worker->data2 = (void*)&dec->thread_ctx_.io_; worker->hook = FinishRow; dec->num_caches_ = (dec->filter_type_ > 0) ? MT_CACHE_LINES : MT_CACHE_LINES - 1; } else { dec->num_caches_ = ST_CACHE_LINES; } return 1; } int VP8GetThreadMethod(const WebPDecoderOptions* const options, const WebPHeaderStructure* const headers, int width, int height) { if (options == NULL || options->use_threads == 0) { return 0; } (void)headers; (void)width; (void)height; assert(headers == NULL || !headers->is_lossless); #if defined(WEBP_USE_THREAD) if (width >= MIN_WIDTH_FOR_THREADS) return 2; #endif return 0; } #undef MT_CACHE_LINES #undef ST_CACHE_LINES //------------------------------------------------------------------------------ // Memory setup static int AllocateMemory(VP8Decoder* const dec) { const int num_caches = dec->num_caches_; const int mb_w = dec->mb_w_; // Note: we use 'size_t' when there's no overflow risk, uint64_t otherwise. const size_t intra_pred_mode_size = 4 * mb_w * sizeof(uint8_t); const size_t top_size = sizeof(VP8TopSamples) * mb_w; const size_t mb_info_size = (mb_w + 1) * sizeof(VP8MB); const size_t f_info_size = (dec->filter_type_ > 0) ? mb_w * (dec->mt_method_ > 0 ? 2 : 1) * sizeof(VP8FInfo) : 0; const size_t yuv_size = YUV_SIZE * sizeof(*dec->yuv_b_); const size_t mb_data_size = (dec->mt_method_ == 2 ? 2 : 1) * mb_w * sizeof(*dec->mb_data_); const size_t cache_height = (16 * num_caches + kFilterExtraRows[dec->filter_type_]) * 3 / 2; const size_t cache_size = top_size * cache_height; // alpha_size is the only one that scales as width x height. const uint64_t alpha_size = (dec->alpha_data_ != NULL) ? (uint64_t)dec->pic_hdr_.width_ * dec->pic_hdr_.height_ : 0ULL; const uint64_t needed = (uint64_t)intra_pred_mode_size + top_size + mb_info_size + f_info_size + yuv_size + mb_data_size + cache_size + alpha_size + WEBP_ALIGN_CST; uint8_t* mem; if (!CheckSizeOverflow(needed)) return 0; // check for overflow if (needed > dec->mem_size_) { WebPSafeFree(dec->mem_); dec->mem_size_ = 0; dec->mem_ = WebPSafeMalloc(needed, sizeof(uint8_t)); if (dec->mem_ == NULL) { return VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY, "no memory during frame initialization."); } // down-cast is ok, thanks to WebPSafeMalloc() above. dec->mem_size_ = (size_t)needed; } mem = (uint8_t*)dec->mem_; dec->intra_t_ = mem; mem += intra_pred_mode_size; dec->yuv_t_ = (VP8TopSamples*)mem; mem += top_size; dec->mb_info_ = ((VP8MB*)mem) + 1; mem += mb_info_size; dec->f_info_ = f_info_size ? (VP8FInfo*)mem : NULL; mem += f_info_size; dec->thread_ctx_.id_ = 0; dec->thread_ctx_.f_info_ = dec->f_info_; if (dec->filter_type_ > 0 && dec->mt_method_ > 0) { // secondary cache line. The deblocking process need to make use of the // filtering strength from previous macroblock row, while the new ones // are being decoded in parallel. We'll just swap the pointers. dec->thread_ctx_.f_info_ += mb_w; } mem = (uint8_t*)WEBP_ALIGN(mem); assert((yuv_size & WEBP_ALIGN_CST) == 0); dec->yuv_b_ = mem; mem += yuv_size; dec->mb_data_ = (VP8MBData*)mem; dec->thread_ctx_.mb_data_ = (VP8MBData*)mem; if (dec->mt_method_ == 2) { dec->thread_ctx_.mb_data_ += mb_w; } mem += mb_data_size; dec->cache_y_stride_ = 16 * mb_w; dec->cache_uv_stride_ = 8 * mb_w; { const int extra_rows = kFilterExtraRows[dec->filter_type_]; const int extra_y = extra_rows * dec->cache_y_stride_; const int extra_uv = (extra_rows / 2) * dec->cache_uv_stride_; dec->cache_y_ = mem + extra_y; dec->cache_u_ = dec->cache_y_ + 16 * num_caches * dec->cache_y_stride_ + extra_uv; dec->cache_v_ = dec->cache_u_ + 8 * num_caches * dec->cache_uv_stride_ + extra_uv; dec->cache_id_ = 0; } mem += cache_size; // alpha plane dec->alpha_plane_ = alpha_size ? mem : NULL; mem += alpha_size; assert(mem <= (uint8_t*)dec->mem_ + dec->mem_size_); // note: left/top-info is initialized once for all. memset(dec->mb_info_ - 1, 0, mb_info_size); VP8InitScanline(dec); // initialize left too. // initialize top memset(dec->intra_t_, B_DC_PRED, intra_pred_mode_size); return 1; } static void InitIo(VP8Decoder* const dec, VP8Io* io) { // prepare 'io' io->mb_y = 0; io->y = dec->cache_y_; io->u = dec->cache_u_; io->v = dec->cache_v_; io->y_stride = dec->cache_y_stride_; io->uv_stride = dec->cache_uv_stride_; io->a = NULL; } int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io) { if (!InitThreadContext(dec)) return 0; // call first. Sets dec->num_caches_. if (!AllocateMemory(dec)) return 0; InitIo(dec, io); VP8DspInit(); // Init critical function pointers and look-up tables. return 1; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/vp8_dec.h0000644000014400001440000001565214606317060013107 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Low-level API for VP8 decoder // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DEC_VP8_DEC_H_ #define WEBP_DEC_VP8_DEC_H_ #include "src/webp/decode.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Lower-level API // // These functions provide fine-grained control of the decoding process. // The call flow should resemble: // // VP8Io io; // VP8InitIo(&io); // io.data = data; // io.data_size = size; // /* customize io's functions (setup()/put()/teardown()) if needed. */ // // VP8Decoder* dec = VP8New(); // int ok = VP8Decode(dec, &io); // if (!ok) printf("Error: %s\n", VP8StatusMessage(dec)); // VP8Delete(dec); // return ok; // Input / Output typedef struct VP8Io VP8Io; typedef int (*VP8IoPutHook)(const VP8Io* io); typedef int (*VP8IoSetupHook)(VP8Io* io); typedef void (*VP8IoTeardownHook)(const VP8Io* io); struct VP8Io { // set by VP8GetHeaders() int width, height; // picture dimensions, in pixels (invariable). // These are the original, uncropped dimensions. // The actual area passed to put() is stored // in mb_w / mb_h fields. // set before calling put() int mb_y; // position of the current rows (in pixels) int mb_w; // number of columns in the sample int mb_h; // number of rows in the sample const uint8_t* y, *u, *v; // rows to copy (in yuv420 format) int y_stride; // row stride for luma int uv_stride; // row stride for chroma void* opaque; // user data // called when fresh samples are available. Currently, samples are in // YUV420 format, and can be up to width x 24 in size (depending on the // in-loop filtering level, e.g.). Should return false in case of error // or abort request. The actual size of the area to update is mb_w x mb_h // in size, taking cropping into account. VP8IoPutHook put; // called just before starting to decode the blocks. // Must return false in case of setup error, true otherwise. If false is // returned, teardown() will NOT be called. But if the setup succeeded // and true is returned, then teardown() will always be called afterward. VP8IoSetupHook setup; // Called just after block decoding is finished (or when an error occurred // during put()). Is NOT called if setup() failed. VP8IoTeardownHook teardown; // this is a recommendation for the user-side yuv->rgb converter. This flag // is set when calling setup() hook and can be overwritten by it. It then // can be taken into consideration during the put() method. int fancy_upsampling; // Input buffer. size_t data_size; const uint8_t* data; // If true, in-loop filtering will not be performed even if present in the // bitstream. Switching off filtering may speed up decoding at the expense // of more visible blocking. Note that output will also be non-compliant // with the VP8 specifications. int bypass_filtering; // Cropping parameters. int use_cropping; int crop_left, crop_right, crop_top, crop_bottom; // Scaling parameters. int use_scaling; int scaled_width, scaled_height; // If non NULL, pointer to the alpha data (if present) corresponding to the // start of the current row (That is: it is pre-offset by mb_y and takes // cropping into account). const uint8_t* a; }; // Internal, version-checked, entry point WEBP_NODISCARD int VP8InitIoInternal(VP8Io* const, int); // Set the custom IO function pointers and user-data. The setter for IO hooks // should be called before initiating incremental decoding. Returns true if // WebPIDecoder object is successfully modified, false otherwise. WEBP_NODISCARD int WebPISetIOHooks(WebPIDecoder* const idec, VP8IoPutHook put, VP8IoSetupHook setup, VP8IoTeardownHook teardown, void* user_data); // Main decoding object. This is an opaque structure. typedef struct VP8Decoder VP8Decoder; // Create a new decoder object. VP8Decoder* VP8New(void); // Must be called to make sure 'io' is initialized properly. // Returns false in case of version mismatch. Upon such failure, no other // decoding function should be called (VP8Decode, VP8GetHeaders, ...) WEBP_NODISCARD static WEBP_INLINE int VP8InitIo(VP8Io* const io) { return VP8InitIoInternal(io, WEBP_DECODER_ABI_VERSION); } // Decode the VP8 frame header. Returns true if ok. // Note: 'io->data' must be pointing to the start of the VP8 frame header. WEBP_NODISCARD int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io); // Decode a picture. Will call VP8GetHeaders() if it wasn't done already. // Returns false in case of error. WEBP_NODISCARD int VP8Decode(VP8Decoder* const dec, VP8Io* const io); // Return current status of the decoder: VP8StatusCode VP8Status(VP8Decoder* const dec); // return readable string corresponding to the last status. const char* VP8StatusMessage(VP8Decoder* const dec); // Resets the decoder in its initial state, reclaiming memory. // Not a mandatory call between calls to VP8Decode(). void VP8Clear(VP8Decoder* const dec); // Destroy the decoder object. void VP8Delete(VP8Decoder* const dec); //------------------------------------------------------------------------------ // Miscellaneous VP8/VP8L bitstream probing functions. // Returns true if the next 3 bytes in data contain the VP8 signature. WEBP_EXTERN int VP8CheckSignature(const uint8_t* const data, size_t data_size); // Validates the VP8 data-header and retrieves basic header information viz // width and height. Returns 0 in case of formatting error. *width/*height // can be passed NULL. WEBP_EXTERN int VP8GetInfo( const uint8_t* data, size_t data_size, // data available so far size_t chunk_size, // total data size expected in the chunk int* const width, int* const height); // Returns true if the next byte(s) in data is a VP8L signature. WEBP_EXTERN int VP8LCheckSignature(const uint8_t* const data, size_t size); // Validates the VP8L data-header and retrieves basic header information viz // width, height and alpha. Returns 0 in case of formatting error. // width/height/has_alpha can be passed NULL. WEBP_EXTERN int VP8LGetInfo( const uint8_t* data, size_t data_size, // data available so far int* const width, int* const height, int* const has_alpha); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DEC_VP8_DEC_H_ libwebp-1.4.0/src/dec/common_dec.h0000644000014400001440000000322414606317060013652 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Definitions and macros common to encoding and decoding // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DEC_COMMON_DEC_H_ #define WEBP_DEC_COMMON_DEC_H_ // intra prediction modes enum { B_DC_PRED = 0, // 4x4 modes B_TM_PRED = 1, B_VE_PRED = 2, B_HE_PRED = 3, B_RD_PRED = 4, B_VR_PRED = 5, B_LD_PRED = 6, B_VL_PRED = 7, B_HD_PRED = 8, B_HU_PRED = 9, NUM_BMODES = B_HU_PRED + 1 - B_DC_PRED, // = 10 // Luma16 or UV modes DC_PRED = B_DC_PRED, V_PRED = B_VE_PRED, H_PRED = B_HE_PRED, TM_PRED = B_TM_PRED, B_PRED = NUM_BMODES, // refined I4x4 mode NUM_PRED_MODES = 4, // special modes B_DC_PRED_NOTOP = 4, B_DC_PRED_NOLEFT = 5, B_DC_PRED_NOTOPLEFT = 6, NUM_B_DC_MODES = 7 }; enum { MB_FEATURE_TREE_PROBS = 3, NUM_MB_SEGMENTS = 4, NUM_REF_LF_DELTAS = 4, NUM_MODE_LF_DELTAS = 4, // I4x4, ZERO, *, SPLIT MAX_NUM_PARTITIONS = 8, // Probabilities NUM_TYPES = 4, // 0: i16-AC, 1: i16-DC, 2:chroma-AC, 3:i4-AC NUM_BANDS = 8, NUM_CTX = 3, NUM_PROBAS = 11 }; #endif // WEBP_DEC_COMMON_DEC_H_ libwebp-1.4.0/src/dec/Makefile.am0000644000014400001440000000200214606317060013423 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) noinst_LTLIBRARIES = libwebpdecode.la libwebpdecode_la_SOURCES = libwebpdecode_la_SOURCES += alpha_dec.c libwebpdecode_la_SOURCES += alphai_dec.h libwebpdecode_la_SOURCES += buffer_dec.c libwebpdecode_la_SOURCES += common_dec.h libwebpdecode_la_SOURCES += vp8_dec.h libwebpdecode_la_SOURCES += frame_dec.c libwebpdecode_la_SOURCES += idec_dec.c libwebpdecode_la_SOURCES += io_dec.c libwebpdecode_la_SOURCES += quant_dec.c libwebpdecode_la_SOURCES += tree_dec.c libwebpdecode_la_SOURCES += vp8_dec.c libwebpdecode_la_SOURCES += vp8i_dec.h libwebpdecode_la_SOURCES += vp8l_dec.c libwebpdecode_la_SOURCES += vp8li_dec.h libwebpdecode_la_SOURCES += webp_dec.c libwebpdecode_la_SOURCES += webpi_dec.h libwebpdecodeinclude_HEADERS = libwebpdecodeinclude_HEADERS += ../webp/decode.h libwebpdecodeinclude_HEADERS += ../webp/types.h noinst_HEADERS = noinst_HEADERS += ../webp/format_constants.h libwebpdecode_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpdecodeincludedir = $(includedir)/webp libwebp-1.4.0/src/dec/quant_dec.c0000644000014400001440000000773514606317060013520 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Quantizer initialization // // Author: Skal (pascal.massimino@gmail.com) #include "src/dec/vp8i_dec.h" static WEBP_INLINE int clip(int v, int M) { return v < 0 ? 0 : v > M ? M : v; } // Paragraph 14.1 static const uint8_t kDcTable[128] = { 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157 }; static const uint16_t kAcTable[128] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284 }; //------------------------------------------------------------------------------ // Paragraph 9.6 void VP8ParseQuant(VP8Decoder* const dec) { VP8BitReader* const br = &dec->br_; const int base_q0 = VP8GetValue(br, 7, "global-header"); const int dqy1_dc = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 4, "global-header") : 0; const int dqy2_dc = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 4, "global-header") : 0; const int dqy2_ac = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 4, "global-header") : 0; const int dquv_dc = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 4, "global-header") : 0; const int dquv_ac = VP8Get(br, "global-header") ? VP8GetSignedValue(br, 4, "global-header") : 0; const VP8SegmentHeader* const hdr = &dec->segment_hdr_; int i; for (i = 0; i < NUM_MB_SEGMENTS; ++i) { int q; if (hdr->use_segment_) { q = hdr->quantizer_[i]; if (!hdr->absolute_delta_) { q += base_q0; } } else { if (i > 0) { dec->dqm_[i] = dec->dqm_[0]; continue; } else { q = base_q0; } } { VP8QuantMatrix* const m = &dec->dqm_[i]; m->y1_mat_[0] = kDcTable[clip(q + dqy1_dc, 127)]; m->y1_mat_[1] = kAcTable[clip(q + 0, 127)]; m->y2_mat_[0] = kDcTable[clip(q + dqy2_dc, 127)] * 2; // For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16. // The smallest precision for that is '(x*6349) >> 12' but 16 is a good // word size. m->y2_mat_[1] = (kAcTable[clip(q + dqy2_ac, 127)] * 101581) >> 16; if (m->y2_mat_[1] < 8) m->y2_mat_[1] = 8; m->uv_mat_[0] = kDcTable[clip(q + dquv_dc, 117)]; m->uv_mat_[1] = kAcTable[clip(q + dquv_ac, 127)]; m->uv_quant_ = q + dquv_ac; // for dithering strength evaluation } } } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/vp8li_dec.h0000644000014400001440000001265714606317060013436 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Lossless decoder: internal header. // // Author: Skal (pascal.massimino@gmail.com) // Vikas Arora(vikaas.arora@gmail.com) #ifndef WEBP_DEC_VP8LI_DEC_H_ #define WEBP_DEC_VP8LI_DEC_H_ #include // for memcpy() #include "src/dec/webpi_dec.h" #include "src/utils/bit_reader_utils.h" #include "src/utils/color_cache_utils.h" #include "src/utils/huffman_utils.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif typedef enum { READ_DATA = 0, READ_HDR = 1, READ_DIM = 2 } VP8LDecodeState; typedef struct VP8LTransform VP8LTransform; struct VP8LTransform { VP8LImageTransformType type_; // transform type. int bits_; // subsampling bits defining transform window. int xsize_; // transform window X index. int ysize_; // transform window Y index. uint32_t* data_; // transform data. }; typedef struct { int color_cache_size_; VP8LColorCache color_cache_; VP8LColorCache saved_color_cache_; // for incremental int huffman_mask_; int huffman_subsample_bits_; int huffman_xsize_; uint32_t* huffman_image_; int num_htree_groups_; HTreeGroup* htree_groups_; HuffmanTables huffman_tables_; } VP8LMetadata; typedef struct VP8LDecoder VP8LDecoder; struct VP8LDecoder { VP8StatusCode status_; VP8LDecodeState state_; VP8Io* io_; const WebPDecBuffer* output_; // shortcut to io->opaque->output uint32_t* pixels_; // Internal data: either uint8_t* for alpha // or uint32_t* for BGRA. uint32_t* argb_cache_; // Scratch buffer for temporary BGRA storage. VP8LBitReader br_; int incremental_; // if true, incremental decoding is expected VP8LBitReader saved_br_; // note: could be local variables too int saved_last_pixel_; int width_; int height_; int last_row_; // last input row decoded so far. int last_pixel_; // last pixel decoded so far. However, it may // not be transformed, scaled and // color-converted yet. int last_out_row_; // last row output so far. VP8LMetadata hdr_; int next_transform_; VP8LTransform transforms_[NUM_TRANSFORMS]; // or'd bitset storing the transforms types. uint32_t transforms_seen_; uint8_t* rescaler_memory; // Working memory for rescaling work. WebPRescaler* rescaler; // Common rescaler for all channels. }; //------------------------------------------------------------------------------ // internal functions. Not public. struct ALPHDecoder; // Defined in dec/alphai.h. // in vp8l.c // Decodes image header for alpha data stored using lossless compression. // Returns false in case of error. WEBP_NODISCARD int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec, const uint8_t* const data, size_t data_size); // Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are // already decoded in previous call(s), it will resume decoding from where it // was paused. // Returns false in case of bitstream error. WEBP_NODISCARD int VP8LDecodeAlphaImageStream( struct ALPHDecoder* const alph_dec, int last_row); // Allocates and initialize a new lossless decoder instance. WEBP_NODISCARD VP8LDecoder* VP8LNew(void); // Decodes the image header. Returns false in case of error. WEBP_NODISCARD int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io); // Decodes an image. It's required to decode the lossless header before calling // this function. Returns false in case of error, with updated dec->status_. WEBP_NODISCARD int VP8LDecodeImage(VP8LDecoder* const dec); // Resets the decoder in its initial state, reclaiming memory. // Preserves the dec->status_ value. void VP8LClear(VP8LDecoder* const dec); // Clears and deallocate a lossless decoder instance. void VP8LDelete(VP8LDecoder* const dec); // Helper function for reading the different Huffman codes and storing them in // 'huffman_tables' and 'htree_groups'. // If mapping is NULL 'num_htree_groups_max' must equal 'num_htree_groups'. // If it is not NULL, it maps 'num_htree_groups_max' indices to the // 'num_htree_groups' groups. If 'num_htree_groups_max' > 'num_htree_groups', // some of those indices map to -1. This is used for non-balanced codes to // limit memory usage. WEBP_NODISCARD int ReadHuffmanCodesHelper( int color_cache_bits, int num_htree_groups, int num_htree_groups_max, const int* const mapping, VP8LDecoder* const dec, HuffmanTables* const huffman_tables, HTreeGroup** const htree_groups); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DEC_VP8LI_DEC_H_ libwebp-1.4.0/src/dec/vp8i_dec.h0000644000014400001440000002706414606317060013260 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // VP8 decoder: internal header. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_DEC_VP8I_DEC_H_ #define WEBP_DEC_VP8I_DEC_H_ #include // for memcpy() #include "src/dec/common_dec.h" #include "src/dec/vp8li_dec.h" #include "src/utils/bit_reader_utils.h" #include "src/utils/random_utils.h" #include "src/utils/thread_utils.h" #include "src/dsp/dsp.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Various defines and enums // version numbers #define DEC_MAJ_VERSION 1 #define DEC_MIN_VERSION 4 #define DEC_REV_VERSION 0 // YUV-cache parameters. Cache is 32-bytes wide (= one cacheline). // Constraints are: We need to store one 16x16 block of luma samples (y), // and two 8x8 chroma blocks (u/v). These are better be 16-bytes aligned, // in order to be SIMD-friendly. We also need to store the top, left and // top-left samples (from previously decoded blocks), along with four // extra top-right samples for luma (intra4x4 prediction only). // One possible layout is, using 32 * (17 + 9) bytes: // // .+------ <- only 1 pixel high // .|yyyyt. // .|yyyyt. // .|yyyyt. // .|yyyy.. // .+--.+-- <- only 1 pixel high // .|uu.|vv // .|uu.|vv // // Every character is a 4x4 block, with legend: // '.' = unused // 'y' = y-samples 'u' = u-samples 'v' = u-samples // '|' = left sample, '-' = top sample, '+' = top-left sample // 't' = extra top-right sample for 4x4 modes #define YUV_SIZE (BPS * 17 + BPS * 9) #define Y_OFF (BPS * 1 + 8) #define U_OFF (Y_OFF + BPS * 16 + BPS) #define V_OFF (U_OFF + 16) // minimal width under which lossy multi-threading is always disabled #define MIN_WIDTH_FOR_THREADS 512 //------------------------------------------------------------------------------ // Headers typedef struct { uint8_t key_frame_; uint8_t profile_; uint8_t show_; uint32_t partition_length_; } VP8FrameHeader; typedef struct { uint16_t width_; uint16_t height_; uint8_t xscale_; uint8_t yscale_; uint8_t colorspace_; // 0 = YCbCr uint8_t clamp_type_; } VP8PictureHeader; // segment features typedef struct { int use_segment_; int update_map_; // whether to update the segment map or not int absolute_delta_; // absolute or delta values for quantizer and filter int8_t quantizer_[NUM_MB_SEGMENTS]; // quantization changes int8_t filter_strength_[NUM_MB_SEGMENTS]; // filter strength for segments } VP8SegmentHeader; // probas associated to one of the contexts typedef uint8_t VP8ProbaArray[NUM_PROBAS]; typedef struct { // all the probas associated to one band VP8ProbaArray probas_[NUM_CTX]; } VP8BandProbas; // Struct collecting all frame-persistent probabilities. typedef struct { uint8_t segments_[MB_FEATURE_TREE_PROBS]; // Type: 0:Intra16-AC 1:Intra16-DC 2:Chroma 3:Intra4 VP8BandProbas bands_[NUM_TYPES][NUM_BANDS]; const VP8BandProbas* bands_ptr_[NUM_TYPES][16 + 1]; } VP8Proba; // Filter parameters typedef struct { int simple_; // 0=complex, 1=simple int level_; // [0..63] int sharpness_; // [0..7] int use_lf_delta_; int ref_lf_delta_[NUM_REF_LF_DELTAS]; int mode_lf_delta_[NUM_MODE_LF_DELTAS]; } VP8FilterHeader; //------------------------------------------------------------------------------ // Informations about the macroblocks. typedef struct { // filter specs uint8_t f_limit_; // filter limit in [3..189], or 0 if no filtering uint8_t f_ilevel_; // inner limit in [1..63] uint8_t f_inner_; // do inner filtering? uint8_t hev_thresh_; // high edge variance threshold in [0..2] } VP8FInfo; typedef struct { // Top/Left Contexts used for syntax-parsing uint8_t nz_; // non-zero AC/DC coeffs (4bit for luma + 4bit for chroma) uint8_t nz_dc_; // non-zero DC coeff (1bit) } VP8MB; // Dequantization matrices typedef int quant_t[2]; // [DC / AC]. Can be 'uint16_t[2]' too (~slower). typedef struct { quant_t y1_mat_, y2_mat_, uv_mat_; int uv_quant_; // U/V quantizer value int dither_; // dithering amplitude (0 = off, max=255) } VP8QuantMatrix; // Data needed to reconstruct a macroblock typedef struct { int16_t coeffs_[384]; // 384 coeffs = (16+4+4) * 4*4 uint8_t is_i4x4_; // true if intra4x4 uint8_t imodes_[16]; // one 16x16 mode (#0) or sixteen 4x4 modes uint8_t uvmode_; // chroma prediction mode // bit-wise info about the content of each sub-4x4 blocks (in decoding order). // Each of the 4x4 blocks for y/u/v is associated with a 2b code according to: // code=0 -> no coefficient // code=1 -> only DC // code=2 -> first three coefficients are non-zero // code=3 -> more than three coefficients are non-zero // This allows to call specialized transform functions. uint32_t non_zero_y_; uint32_t non_zero_uv_; uint8_t dither_; // local dithering strength (deduced from non_zero_*) uint8_t skip_; uint8_t segment_; } VP8MBData; // Persistent information needed by the parallel processing typedef struct { int id_; // cache row to process (in [0..2]) int mb_y_; // macroblock position of the row int filter_row_; // true if row-filtering is needed VP8FInfo* f_info_; // filter strengths (swapped with dec->f_info_) VP8MBData* mb_data_; // reconstruction data (swapped with dec->mb_data_) VP8Io io_; // copy of the VP8Io to pass to put() } VP8ThreadContext; // Saved top samples, per macroblock. Fits into a cache-line. typedef struct { uint8_t y[16], u[8], v[8]; } VP8TopSamples; //------------------------------------------------------------------------------ // VP8Decoder: the main opaque structure handed over to user struct VP8Decoder { VP8StatusCode status_; int ready_; // true if ready to decode a picture with VP8Decode() const char* error_msg_; // set when status_ is not OK. // Main data source VP8BitReader br_; int incremental_; // if true, incremental decoding is expected // headers VP8FrameHeader frm_hdr_; VP8PictureHeader pic_hdr_; VP8FilterHeader filter_hdr_; VP8SegmentHeader segment_hdr_; // Worker WebPWorker worker_; int mt_method_; // multi-thread method: 0=off, 1=[parse+recon][filter] // 2=[parse][recon+filter] int cache_id_; // current cache row int num_caches_; // number of cached rows of 16 pixels (1, 2 or 3) VP8ThreadContext thread_ctx_; // Thread context // dimension, in macroblock units. int mb_w_, mb_h_; // Macroblock to process/filter, depending on cropping and filter_type. int tl_mb_x_, tl_mb_y_; // top-left MB that must be in-loop filtered int br_mb_x_, br_mb_y_; // last bottom-right MB that must be decoded // number of partitions minus one. uint32_t num_parts_minus_one_; // per-partition boolean decoders. VP8BitReader parts_[MAX_NUM_PARTITIONS]; // Dithering strength, deduced from decoding options int dither_; // whether to use dithering or not VP8Random dithering_rg_; // random generator for dithering // dequantization (one set of DC/AC dequant factor per segment) VP8QuantMatrix dqm_[NUM_MB_SEGMENTS]; // probabilities VP8Proba proba_; int use_skip_proba_; uint8_t skip_p_; // Boundary data cache and persistent buffers. uint8_t* intra_t_; // top intra modes values: 4 * mb_w_ uint8_t intra_l_[4]; // left intra modes values VP8TopSamples* yuv_t_; // top y/u/v samples VP8MB* mb_info_; // contextual macroblock info (mb_w_ + 1) VP8FInfo* f_info_; // filter strength info uint8_t* yuv_b_; // main block for Y/U/V (size = YUV_SIZE) uint8_t* cache_y_; // macroblock row for storing unfiltered samples uint8_t* cache_u_; uint8_t* cache_v_; int cache_y_stride_; int cache_uv_stride_; // main memory chunk for the above data. Persistent. void* mem_; size_t mem_size_; // Per macroblock non-persistent infos. int mb_x_, mb_y_; // current position, in macroblock units VP8MBData* mb_data_; // parsed reconstruction data // Filtering side-info int filter_type_; // 0=off, 1=simple, 2=complex VP8FInfo fstrengths_[NUM_MB_SEGMENTS][2]; // precalculated per-segment/type // Alpha struct ALPHDecoder* alph_dec_; // alpha-plane decoder object const uint8_t* alpha_data_; // compressed alpha data (if present) size_t alpha_data_size_; int is_alpha_decoded_; // true if alpha_data_ is decoded in alpha_plane_ uint8_t* alpha_plane_mem_; // memory allocated for alpha_plane_ uint8_t* alpha_plane_; // output. Persistent, contains the whole data. const uint8_t* alpha_prev_line_; // last decoded alpha row (or NULL) int alpha_dithering_; // derived from decoding options (0=off, 100=full) }; //------------------------------------------------------------------------------ // internal functions. Not public. // in vp8.c int VP8SetError(VP8Decoder* const dec, VP8StatusCode error, const char* const msg); // in tree.c void VP8ResetProba(VP8Proba* const proba); void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec); // parses one row of intra mode data in partition 0, returns !eof int VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec); // in quant.c void VP8ParseQuant(VP8Decoder* const dec); // in frame.c WEBP_NODISCARD int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io); // Call io->setup() and finish setting up scan parameters. // After this call returns, one must always call VP8ExitCritical() with the // same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK // if ok, otherwise sets and returns the error status on *dec. VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io); // Must always be called in pair with VP8EnterCritical(). // Returns false in case of error. WEBP_NODISCARD int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io); // Return the multi-threading method to use (0=off), depending // on options and bitstream size. Only for lossy decoding. int VP8GetThreadMethod(const WebPDecoderOptions* const options, const WebPHeaderStructure* const headers, int width, int height); // Initialize dithering post-process if needed. void VP8InitDithering(const WebPDecoderOptions* const options, VP8Decoder* const dec); // Process the last decoded row (filtering + output). WEBP_NODISCARD int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io); // To be called at the start of a new scanline, to initialize predictors. void VP8InitScanline(VP8Decoder* const dec); // Decode one macroblock. Returns false if there is not enough data. WEBP_NODISCARD int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br); // in alpha.c const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, const VP8Io* const io, int row, int num_rows); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DEC_VP8I_DEC_H_ libwebp-1.4.0/src/dec/alphai_dec.h0000644000014400001440000000320014606317060013612 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha decoder: internal header. // // Author: Urvang (urvang@google.com) #ifndef WEBP_DEC_ALPHAI_DEC_H_ #define WEBP_DEC_ALPHAI_DEC_H_ #include "src/dec/webpi_dec.h" #include "src/utils/filters_utils.h" #ifdef __cplusplus extern "C" { #endif struct VP8LDecoder; // Defined in dec/vp8li.h. typedef struct ALPHDecoder ALPHDecoder; struct ALPHDecoder { int width_; int height_; int method_; WEBP_FILTER_TYPE filter_; int pre_processing_; struct VP8LDecoder* vp8l_dec_; VP8Io io_; int use_8b_decode_; // Although alpha channel requires only 1 byte per // pixel, sometimes VP8LDecoder may need to allocate // 4 bytes per pixel internally during decode. uint8_t* output_; const uint8_t* prev_line_; // last output row (or NULL) }; //------------------------------------------------------------------------------ // internal functions. Not public. // Deallocate memory associated to dec->alpha_plane_ decoding void WebPDeallocateAlphaMemory(VP8Decoder* const dec); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_DEC_ALPHAI_DEC_H_ libwebp-1.4.0/src/dec/Makefile.in0000644000014400001440000010543014606317244013451 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/dec ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(libwebpdecodeinclude_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwebpdecode_la_LIBADD = am_libwebpdecode_la_OBJECTS = libwebpdecode_la-alpha_dec.lo \ libwebpdecode_la-buffer_dec.lo libwebpdecode_la-frame_dec.lo \ libwebpdecode_la-idec_dec.lo libwebpdecode_la-io_dec.lo \ libwebpdecode_la-quant_dec.lo libwebpdecode_la-tree_dec.lo \ libwebpdecode_la-vp8_dec.lo libwebpdecode_la-vp8l_dec.lo \ libwebpdecode_la-webp_dec.lo libwebpdecode_la_OBJECTS = $(am_libwebpdecode_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libwebpdecode_la-alpha_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-buffer_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-frame_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-idec_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-io_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-quant_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-tree_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-vp8_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-vp8l_dec.Plo \ ./$(DEPDIR)/libwebpdecode_la-webp_dec.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpdecode_la_SOURCES) DIST_SOURCES = $(libwebpdecode_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libwebpdecodeincludedir)" HEADERS = $(libwebpdecodeinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libwebpdecode.la libwebpdecode_la_SOURCES = alpha_dec.c alphai_dec.h buffer_dec.c \ common_dec.h vp8_dec.h frame_dec.c idec_dec.c io_dec.c \ quant_dec.c tree_dec.c vp8_dec.c vp8i_dec.h vp8l_dec.c \ vp8li_dec.h webp_dec.c webpi_dec.h libwebpdecodeinclude_HEADERS = ../webp/decode.h ../webp/types.h noinst_HEADERS = ../webp/format_constants.h libwebpdecode_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpdecodeincludedir = $(includedir)/webp all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/dec/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/dec/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpdecode.la: $(libwebpdecode_la_OBJECTS) $(libwebpdecode_la_DEPENDENCIES) $(EXTRA_libwebpdecode_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libwebpdecode_la_OBJECTS) $(libwebpdecode_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-alpha_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-buffer_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-frame_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-idec_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-io_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-quant_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-tree_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-vp8_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-vp8l_dec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpdecode_la-webp_dec.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libwebpdecode_la-alpha_dec.lo: alpha_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-alpha_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-alpha_dec.Tpo -c -o libwebpdecode_la-alpha_dec.lo `test -f 'alpha_dec.c' || echo '$(srcdir)/'`alpha_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-alpha_dec.Tpo $(DEPDIR)/libwebpdecode_la-alpha_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_dec.c' object='libwebpdecode_la-alpha_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-alpha_dec.lo `test -f 'alpha_dec.c' || echo '$(srcdir)/'`alpha_dec.c libwebpdecode_la-buffer_dec.lo: buffer_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-buffer_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-buffer_dec.Tpo -c -o libwebpdecode_la-buffer_dec.lo `test -f 'buffer_dec.c' || echo '$(srcdir)/'`buffer_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-buffer_dec.Tpo $(DEPDIR)/libwebpdecode_la-buffer_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buffer_dec.c' object='libwebpdecode_la-buffer_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-buffer_dec.lo `test -f 'buffer_dec.c' || echo '$(srcdir)/'`buffer_dec.c libwebpdecode_la-frame_dec.lo: frame_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-frame_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-frame_dec.Tpo -c -o libwebpdecode_la-frame_dec.lo `test -f 'frame_dec.c' || echo '$(srcdir)/'`frame_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-frame_dec.Tpo $(DEPDIR)/libwebpdecode_la-frame_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frame_dec.c' object='libwebpdecode_la-frame_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-frame_dec.lo `test -f 'frame_dec.c' || echo '$(srcdir)/'`frame_dec.c libwebpdecode_la-idec_dec.lo: idec_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-idec_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-idec_dec.Tpo -c -o libwebpdecode_la-idec_dec.lo `test -f 'idec_dec.c' || echo '$(srcdir)/'`idec_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-idec_dec.Tpo $(DEPDIR)/libwebpdecode_la-idec_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='idec_dec.c' object='libwebpdecode_la-idec_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-idec_dec.lo `test -f 'idec_dec.c' || echo '$(srcdir)/'`idec_dec.c libwebpdecode_la-io_dec.lo: io_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-io_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-io_dec.Tpo -c -o libwebpdecode_la-io_dec.lo `test -f 'io_dec.c' || echo '$(srcdir)/'`io_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-io_dec.Tpo $(DEPDIR)/libwebpdecode_la-io_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='io_dec.c' object='libwebpdecode_la-io_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-io_dec.lo `test -f 'io_dec.c' || echo '$(srcdir)/'`io_dec.c libwebpdecode_la-quant_dec.lo: quant_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-quant_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-quant_dec.Tpo -c -o libwebpdecode_la-quant_dec.lo `test -f 'quant_dec.c' || echo '$(srcdir)/'`quant_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-quant_dec.Tpo $(DEPDIR)/libwebpdecode_la-quant_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quant_dec.c' object='libwebpdecode_la-quant_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-quant_dec.lo `test -f 'quant_dec.c' || echo '$(srcdir)/'`quant_dec.c libwebpdecode_la-tree_dec.lo: tree_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-tree_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-tree_dec.Tpo -c -o libwebpdecode_la-tree_dec.lo `test -f 'tree_dec.c' || echo '$(srcdir)/'`tree_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-tree_dec.Tpo $(DEPDIR)/libwebpdecode_la-tree_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tree_dec.c' object='libwebpdecode_la-tree_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-tree_dec.lo `test -f 'tree_dec.c' || echo '$(srcdir)/'`tree_dec.c libwebpdecode_la-vp8_dec.lo: vp8_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-vp8_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-vp8_dec.Tpo -c -o libwebpdecode_la-vp8_dec.lo `test -f 'vp8_dec.c' || echo '$(srcdir)/'`vp8_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-vp8_dec.Tpo $(DEPDIR)/libwebpdecode_la-vp8_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vp8_dec.c' object='libwebpdecode_la-vp8_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-vp8_dec.lo `test -f 'vp8_dec.c' || echo '$(srcdir)/'`vp8_dec.c libwebpdecode_la-vp8l_dec.lo: vp8l_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-vp8l_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-vp8l_dec.Tpo -c -o libwebpdecode_la-vp8l_dec.lo `test -f 'vp8l_dec.c' || echo '$(srcdir)/'`vp8l_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-vp8l_dec.Tpo $(DEPDIR)/libwebpdecode_la-vp8l_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vp8l_dec.c' object='libwebpdecode_la-vp8l_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-vp8l_dec.lo `test -f 'vp8l_dec.c' || echo '$(srcdir)/'`vp8l_dec.c libwebpdecode_la-webp_dec.lo: webp_dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpdecode_la-webp_dec.lo -MD -MP -MF $(DEPDIR)/libwebpdecode_la-webp_dec.Tpo -c -o libwebpdecode_la-webp_dec.lo `test -f 'webp_dec.c' || echo '$(srcdir)/'`webp_dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpdecode_la-webp_dec.Tpo $(DEPDIR)/libwebpdecode_la-webp_dec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_dec.c' object='libwebpdecode_la-webp_dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpdecode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpdecode_la-webp_dec.lo `test -f 'webp_dec.c' || echo '$(srcdir)/'`webp_dec.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libwebpdecodeincludeHEADERS: $(libwebpdecodeinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libwebpdecodeinclude_HEADERS)'; test -n "$(libwebpdecodeincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libwebpdecodeincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libwebpdecodeincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libwebpdecodeincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libwebpdecodeincludedir)" || exit $$?; \ done uninstall-libwebpdecodeincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libwebpdecodeinclude_HEADERS)'; test -n "$(libwebpdecodeincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libwebpdecodeincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libwebpdecodeincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libwebpdecode_la-alpha_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-buffer_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-frame_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-idec_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-io_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-quant_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-tree_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-vp8_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-vp8l_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-webp_dec.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libwebpdecodeincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libwebpdecode_la-alpha_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-buffer_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-frame_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-idec_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-io_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-quant_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-tree_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-vp8_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-vp8l_dec.Plo -rm -f ./$(DEPDIR)/libwebpdecode_la-webp_dec.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libwebpdecodeincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am \ install-libwebpdecodeincludeHEADERS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-libwebpdecodeincludeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/dec/io_dec.c0000644000014400001440000005661114606317060012774 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // functions for sample output. // // Author: Skal (pascal.massimino@gmail.com) #include #include #include "src/dec/vp8i_dec.h" #include "src/dec/webpi_dec.h" #include "src/dsp/dsp.h" #include "src/dsp/yuv.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Main YUV<->RGB conversion functions static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) { WebPDecBuffer* output = p->output; const WebPYUVABuffer* const buf = &output->u.YUVA; uint8_t* const y_dst = buf->y + (size_t)io->mb_y * buf->y_stride; uint8_t* const u_dst = buf->u + (size_t)(io->mb_y >> 1) * buf->u_stride; uint8_t* const v_dst = buf->v + (size_t)(io->mb_y >> 1) * buf->v_stride; const int mb_w = io->mb_w; const int mb_h = io->mb_h; const int uv_w = (mb_w + 1) / 2; const int uv_h = (mb_h + 1) / 2; WebPCopyPlane(io->y, io->y_stride, y_dst, buf->y_stride, mb_w, mb_h); WebPCopyPlane(io->u, io->uv_stride, u_dst, buf->u_stride, uv_w, uv_h); WebPCopyPlane(io->v, io->uv_stride, v_dst, buf->v_stride, uv_w, uv_h); return io->mb_h; } // Point-sampling U/V sampler. static int EmitSampledRGB(const VP8Io* const io, WebPDecParams* const p) { WebPDecBuffer* const output = p->output; WebPRGBABuffer* const buf = &output->u.RGBA; uint8_t* const dst = buf->rgba + (size_t)io->mb_y * buf->stride; WebPSamplerProcessPlane(io->y, io->y_stride, io->u, io->v, io->uv_stride, dst, buf->stride, io->mb_w, io->mb_h, WebPSamplers[output->colorspace]); return io->mb_h; } //------------------------------------------------------------------------------ // Fancy upsampling #ifdef FANCY_UPSAMPLING static int EmitFancyRGB(const VP8Io* const io, WebPDecParams* const p) { int num_lines_out = io->mb_h; // a priori guess const WebPRGBABuffer* const buf = &p->output->u.RGBA; uint8_t* dst = buf->rgba + (size_t)io->mb_y * buf->stride; WebPUpsampleLinePairFunc upsample = WebPUpsamplers[p->output->colorspace]; const uint8_t* cur_y = io->y; const uint8_t* cur_u = io->u; const uint8_t* cur_v = io->v; const uint8_t* top_u = p->tmp_u; const uint8_t* top_v = p->tmp_v; int y = io->mb_y; const int y_end = io->mb_y + io->mb_h; const int mb_w = io->mb_w; const int uv_w = (mb_w + 1) / 2; if (y == 0) { // First line is special cased. We mirror the u/v samples at boundary. upsample(cur_y, NULL, cur_u, cur_v, cur_u, cur_v, dst, NULL, mb_w); } else { // We can finish the left-over line from previous call. upsample(p->tmp_y, cur_y, top_u, top_v, cur_u, cur_v, dst - buf->stride, dst, mb_w); ++num_lines_out; } // Loop over each output pairs of row. for (; y + 2 < y_end; y += 2) { top_u = cur_u; top_v = cur_v; cur_u += io->uv_stride; cur_v += io->uv_stride; dst += 2 * buf->stride; cur_y += 2 * io->y_stride; upsample(cur_y - io->y_stride, cur_y, top_u, top_v, cur_u, cur_v, dst - buf->stride, dst, mb_w); } // move to last row cur_y += io->y_stride; if (io->crop_top + y_end < io->crop_bottom) { // Save the unfinished samples for next call (as we're not done yet). memcpy(p->tmp_y, cur_y, mb_w * sizeof(*p->tmp_y)); memcpy(p->tmp_u, cur_u, uv_w * sizeof(*p->tmp_u)); memcpy(p->tmp_v, cur_v, uv_w * sizeof(*p->tmp_v)); // The fancy upsampler leaves a row unfinished behind // (except for the very last row) num_lines_out--; } else { // Process the very last row of even-sized picture if (!(y_end & 1)) { upsample(cur_y, NULL, cur_u, cur_v, cur_u, cur_v, dst + buf->stride, NULL, mb_w); } } return num_lines_out; } #endif /* FANCY_UPSAMPLING */ //------------------------------------------------------------------------------ static void FillAlphaPlane(uint8_t* dst, int w, int h, int stride) { int j; for (j = 0; j < h; ++j) { memset(dst, 0xff, w * sizeof(*dst)); dst += stride; } } static int EmitAlphaYUV(const VP8Io* const io, WebPDecParams* const p, int expected_num_lines_out) { const uint8_t* alpha = io->a; const WebPYUVABuffer* const buf = &p->output->u.YUVA; const int mb_w = io->mb_w; const int mb_h = io->mb_h; uint8_t* dst = buf->a + (size_t)io->mb_y * buf->a_stride; int j; (void)expected_num_lines_out; assert(expected_num_lines_out == mb_h); if (alpha != NULL) { for (j = 0; j < mb_h; ++j) { memcpy(dst, alpha, mb_w * sizeof(*dst)); alpha += io->width; dst += buf->a_stride; } } else if (buf->a != NULL) { // the user requested alpha, but there is none, set it to opaque. FillAlphaPlane(dst, mb_w, mb_h, buf->a_stride); } return 0; } static int GetAlphaSourceRow(const VP8Io* const io, const uint8_t** alpha, int* const num_rows) { int start_y = io->mb_y; *num_rows = io->mb_h; // Compensate for the 1-line delay of the fancy upscaler. // This is similar to EmitFancyRGB(). if (io->fancy_upsampling) { if (start_y == 0) { // We don't process the last row yet. It'll be done during the next call. --*num_rows; } else { --start_y; // Fortunately, *alpha data is persistent, so we can go back // one row and finish alpha blending, now that the fancy upscaler // completed the YUV->RGB interpolation. *alpha -= io->width; } if (io->crop_top + io->mb_y + io->mb_h == io->crop_bottom) { // If it's the very last call, we process all the remaining rows! *num_rows = io->crop_bottom - io->crop_top - start_y; } } return start_y; } static int EmitAlphaRGB(const VP8Io* const io, WebPDecParams* const p, int expected_num_lines_out) { const uint8_t* alpha = io->a; if (alpha != NULL) { const int mb_w = io->mb_w; const WEBP_CSP_MODE colorspace = p->output->colorspace; const int alpha_first = (colorspace == MODE_ARGB || colorspace == MODE_Argb); const WebPRGBABuffer* const buf = &p->output->u.RGBA; int num_rows; const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows); uint8_t* const base_rgba = buf->rgba + start_y * buf->stride; uint8_t* const dst = base_rgba + (alpha_first ? 0 : 3); const int has_alpha = WebPDispatchAlpha(alpha, io->width, mb_w, num_rows, dst, buf->stride); (void)expected_num_lines_out; assert(expected_num_lines_out == num_rows); // has_alpha is true if there's non-trivial alpha to premultiply with. if (has_alpha && WebPIsPremultipliedMode(colorspace)) { WebPApplyAlphaMultiply(base_rgba, alpha_first, mb_w, num_rows, buf->stride); } } return 0; } static int EmitAlphaRGBA4444(const VP8Io* const io, WebPDecParams* const p, int expected_num_lines_out) { const uint8_t* alpha = io->a; if (alpha != NULL) { const int mb_w = io->mb_w; const WEBP_CSP_MODE colorspace = p->output->colorspace; const WebPRGBABuffer* const buf = &p->output->u.RGBA; int num_rows; const size_t start_y = GetAlphaSourceRow(io, &alpha, &num_rows); uint8_t* const base_rgba = buf->rgba + start_y * buf->stride; #if (WEBP_SWAP_16BIT_CSP == 1) uint8_t* alpha_dst = base_rgba; #else uint8_t* alpha_dst = base_rgba + 1; #endif uint32_t alpha_mask = 0x0f; int i, j; for (j = 0; j < num_rows; ++j) { for (i = 0; i < mb_w; ++i) { // Fill in the alpha value (converted to 4 bits). const uint32_t alpha_value = alpha[i] >> 4; alpha_dst[2 * i] = (alpha_dst[2 * i] & 0xf0) | alpha_value; alpha_mask &= alpha_value; } alpha += io->width; alpha_dst += buf->stride; } (void)expected_num_lines_out; assert(expected_num_lines_out == num_rows); if (alpha_mask != 0x0f && WebPIsPremultipliedMode(colorspace)) { WebPApplyAlphaMultiply4444(base_rgba, mb_w, num_rows, buf->stride); } } return 0; } //------------------------------------------------------------------------------ // YUV rescaling (no final RGB conversion needed) #if !defined(WEBP_REDUCE_SIZE) static int Rescale(const uint8_t* src, int src_stride, int new_lines, WebPRescaler* const wrk) { int num_lines_out = 0; while (new_lines > 0) { // import new contributions of source rows. const int lines_in = WebPRescalerImport(wrk, new_lines, src, src_stride); src += lines_in * src_stride; new_lines -= lines_in; num_lines_out += WebPRescalerExport(wrk); // emit output row(s) } return num_lines_out; } static int EmitRescaledYUV(const VP8Io* const io, WebPDecParams* const p) { const int mb_h = io->mb_h; const int uv_mb_h = (mb_h + 1) >> 1; WebPRescaler* const scaler = p->scaler_y; int num_lines_out = 0; if (WebPIsAlphaMode(p->output->colorspace) && io->a != NULL) { // Before rescaling, we premultiply the luma directly into the io->y // internal buffer. This is OK since these samples are not used for // intra-prediction (the top samples are saved in cache_y_/u_/v_). // But we need to cast the const away, though. WebPMultRows((uint8_t*)io->y, io->y_stride, io->a, io->width, io->mb_w, mb_h, 0); } num_lines_out = Rescale(io->y, io->y_stride, mb_h, scaler); Rescale(io->u, io->uv_stride, uv_mb_h, p->scaler_u); Rescale(io->v, io->uv_stride, uv_mb_h, p->scaler_v); return num_lines_out; } static int EmitRescaledAlphaYUV(const VP8Io* const io, WebPDecParams* const p, int expected_num_lines_out) { const WebPYUVABuffer* const buf = &p->output->u.YUVA; uint8_t* const dst_a = buf->a + (size_t)p->last_y * buf->a_stride; if (io->a != NULL) { uint8_t* const dst_y = buf->y + (size_t)p->last_y * buf->y_stride; const int num_lines_out = Rescale(io->a, io->width, io->mb_h, p->scaler_a); assert(expected_num_lines_out == num_lines_out); if (num_lines_out > 0) { // unmultiply the Y WebPMultRows(dst_y, buf->y_stride, dst_a, buf->a_stride, p->scaler_a->dst_width, num_lines_out, 1); } } else if (buf->a != NULL) { // the user requested alpha, but there is none, set it to opaque. assert(p->last_y + expected_num_lines_out <= io->scaled_height); FillAlphaPlane(dst_a, io->scaled_width, expected_num_lines_out, buf->a_stride); } return 0; } static int InitYUVRescaler(const VP8Io* const io, WebPDecParams* const p) { const int has_alpha = WebPIsAlphaMode(p->output->colorspace); const WebPYUVABuffer* const buf = &p->output->u.YUVA; const int out_width = io->scaled_width; const int out_height = io->scaled_height; const int uv_out_width = (out_width + 1) >> 1; const int uv_out_height = (out_height + 1) >> 1; const int uv_in_width = (io->mb_w + 1) >> 1; const int uv_in_height = (io->mb_h + 1) >> 1; // scratch memory for luma rescaler const size_t work_size = 2 * (size_t)out_width; const size_t uv_work_size = 2 * uv_out_width; // and for each u/v ones uint64_t total_size; size_t rescaler_size; rescaler_t* work; WebPRescaler* scalers; const int num_rescalers = has_alpha ? 4 : 3; total_size = ((uint64_t)work_size + 2 * uv_work_size) * sizeof(*work); if (has_alpha) { total_size += (uint64_t)work_size * sizeof(*work); } rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST; total_size += rescaler_size; if (!CheckSizeOverflow(total_size)) { return 0; } p->memory = WebPSafeMalloc(1ULL, (size_t)total_size); if (p->memory == NULL) { return 0; // memory error } work = (rescaler_t*)p->memory; scalers = (WebPRescaler*)WEBP_ALIGN( (const uint8_t*)work + total_size - rescaler_size); p->scaler_y = &scalers[0]; p->scaler_u = &scalers[1]; p->scaler_v = &scalers[2]; p->scaler_a = has_alpha ? &scalers[3] : NULL; if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h, buf->y, out_width, out_height, buf->y_stride, 1, work) || !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height, buf->u, uv_out_width, uv_out_height, buf->u_stride, 1, work + work_size) || !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height, buf->v, uv_out_width, uv_out_height, buf->v_stride, 1, work + work_size + uv_work_size)) { return 0; } p->emit = EmitRescaledYUV; if (has_alpha) { if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h, buf->a, out_width, out_height, buf->a_stride, 1, work + work_size + 2 * uv_work_size)) { return 0; } p->emit_alpha = EmitRescaledAlphaYUV; WebPInitAlphaProcessing(); } return 1; } //------------------------------------------------------------------------------ // RGBA rescaling static int ExportRGB(WebPDecParams* const p, int y_pos) { const WebPYUV444Converter convert = WebPYUV444Converters[p->output->colorspace]; const WebPRGBABuffer* const buf = &p->output->u.RGBA; uint8_t* dst = buf->rgba + (size_t)y_pos * buf->stride; int num_lines_out = 0; // For RGB rescaling, because of the YUV420, current scan position // U/V can be +1/-1 line from the Y one. Hence the double test. while (WebPRescalerHasPendingOutput(p->scaler_y) && WebPRescalerHasPendingOutput(p->scaler_u)) { assert(y_pos + num_lines_out < p->output->height); assert(p->scaler_u->y_accum == p->scaler_v->y_accum); WebPRescalerExportRow(p->scaler_y); WebPRescalerExportRow(p->scaler_u); WebPRescalerExportRow(p->scaler_v); convert(p->scaler_y->dst, p->scaler_u->dst, p->scaler_v->dst, dst, p->scaler_y->dst_width); dst += buf->stride; ++num_lines_out; } return num_lines_out; } static int EmitRescaledRGB(const VP8Io* const io, WebPDecParams* const p) { const int mb_h = io->mb_h; const int uv_mb_h = (mb_h + 1) >> 1; int j = 0, uv_j = 0; int num_lines_out = 0; while (j < mb_h) { const int y_lines_in = WebPRescalerImport(p->scaler_y, mb_h - j, io->y + (size_t)j * io->y_stride, io->y_stride); j += y_lines_in; if (WebPRescaleNeededLines(p->scaler_u, uv_mb_h - uv_j)) { const int u_lines_in = WebPRescalerImport( p->scaler_u, uv_mb_h - uv_j, io->u + (size_t)uv_j * io->uv_stride, io->uv_stride); const int v_lines_in = WebPRescalerImport( p->scaler_v, uv_mb_h - uv_j, io->v + (size_t)uv_j * io->uv_stride, io->uv_stride); (void)v_lines_in; // remove a gcc warning assert(u_lines_in == v_lines_in); uv_j += u_lines_in; } num_lines_out += ExportRGB(p, p->last_y + num_lines_out); } return num_lines_out; } static int ExportAlpha(WebPDecParams* const p, int y_pos, int max_lines_out) { const WebPRGBABuffer* const buf = &p->output->u.RGBA; uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride; const WEBP_CSP_MODE colorspace = p->output->colorspace; const int alpha_first = (colorspace == MODE_ARGB || colorspace == MODE_Argb); uint8_t* dst = base_rgba + (alpha_first ? 0 : 3); int num_lines_out = 0; const int is_premult_alpha = WebPIsPremultipliedMode(colorspace); uint32_t non_opaque = 0; const int width = p->scaler_a->dst_width; while (WebPRescalerHasPendingOutput(p->scaler_a) && num_lines_out < max_lines_out) { assert(y_pos + num_lines_out < p->output->height); WebPRescalerExportRow(p->scaler_a); non_opaque |= WebPDispatchAlpha(p->scaler_a->dst, 0, width, 1, dst, 0); dst += buf->stride; ++num_lines_out; } if (is_premult_alpha && non_opaque) { WebPApplyAlphaMultiply(base_rgba, alpha_first, width, num_lines_out, buf->stride); } return num_lines_out; } static int ExportAlphaRGBA4444(WebPDecParams* const p, int y_pos, int max_lines_out) { const WebPRGBABuffer* const buf = &p->output->u.RGBA; uint8_t* const base_rgba = buf->rgba + (size_t)y_pos * buf->stride; #if (WEBP_SWAP_16BIT_CSP == 1) uint8_t* alpha_dst = base_rgba; #else uint8_t* alpha_dst = base_rgba + 1; #endif int num_lines_out = 0; const WEBP_CSP_MODE colorspace = p->output->colorspace; const int width = p->scaler_a->dst_width; const int is_premult_alpha = WebPIsPremultipliedMode(colorspace); uint32_t alpha_mask = 0x0f; while (WebPRescalerHasPendingOutput(p->scaler_a) && num_lines_out < max_lines_out) { int i; assert(y_pos + num_lines_out < p->output->height); WebPRescalerExportRow(p->scaler_a); for (i = 0; i < width; ++i) { // Fill in the alpha value (converted to 4 bits). const uint32_t alpha_value = p->scaler_a->dst[i] >> 4; alpha_dst[2 * i] = (alpha_dst[2 * i] & 0xf0) | alpha_value; alpha_mask &= alpha_value; } alpha_dst += buf->stride; ++num_lines_out; } if (is_premult_alpha && alpha_mask != 0x0f) { WebPApplyAlphaMultiply4444(base_rgba, width, num_lines_out, buf->stride); } return num_lines_out; } static int EmitRescaledAlphaRGB(const VP8Io* const io, WebPDecParams* const p, int expected_num_out_lines) { if (io->a != NULL) { WebPRescaler* const scaler = p->scaler_a; int lines_left = expected_num_out_lines; const int y_end = p->last_y + lines_left; while (lines_left > 0) { const int64_t row_offset = (int64_t)scaler->src_y - io->mb_y; WebPRescalerImport(scaler, io->mb_h + io->mb_y - scaler->src_y, io->a + row_offset * io->width, io->width); lines_left -= p->emit_alpha_row(p, y_end - lines_left, lines_left); } } return 0; } static int InitRGBRescaler(const VP8Io* const io, WebPDecParams* const p) { const int has_alpha = WebPIsAlphaMode(p->output->colorspace); const int out_width = io->scaled_width; const int out_height = io->scaled_height; const int uv_in_width = (io->mb_w + 1) >> 1; const int uv_in_height = (io->mb_h + 1) >> 1; // scratch memory for one rescaler const size_t work_size = 2 * (size_t)out_width; rescaler_t* work; // rescalers work area uint8_t* tmp; // tmp storage for scaled YUV444 samples before RGB conversion uint64_t tmp_size1, tmp_size2, total_size; size_t rescaler_size; WebPRescaler* scalers; const int num_rescalers = has_alpha ? 4 : 3; tmp_size1 = (uint64_t)num_rescalers * work_size; tmp_size2 = (uint64_t)num_rescalers * out_width; total_size = tmp_size1 * sizeof(*work) + tmp_size2 * sizeof(*tmp); rescaler_size = num_rescalers * sizeof(*p->scaler_y) + WEBP_ALIGN_CST; total_size += rescaler_size; if (!CheckSizeOverflow(total_size)) { return 0; } p->memory = WebPSafeMalloc(1ULL, (size_t)total_size); if (p->memory == NULL) { return 0; // memory error } work = (rescaler_t*)p->memory; tmp = (uint8_t*)(work + tmp_size1); scalers = (WebPRescaler*)WEBP_ALIGN( (const uint8_t*)work + total_size - rescaler_size); p->scaler_y = &scalers[0]; p->scaler_u = &scalers[1]; p->scaler_v = &scalers[2]; p->scaler_a = has_alpha ? &scalers[3] : NULL; if (!WebPRescalerInit(p->scaler_y, io->mb_w, io->mb_h, tmp + 0 * out_width, out_width, out_height, 0, 1, work + 0 * work_size) || !WebPRescalerInit(p->scaler_u, uv_in_width, uv_in_height, tmp + 1 * out_width, out_width, out_height, 0, 1, work + 1 * work_size) || !WebPRescalerInit(p->scaler_v, uv_in_width, uv_in_height, tmp + 2 * out_width, out_width, out_height, 0, 1, work + 2 * work_size)) { return 0; } p->emit = EmitRescaledRGB; WebPInitYUV444Converters(); if (has_alpha) { if (!WebPRescalerInit(p->scaler_a, io->mb_w, io->mb_h, tmp + 3 * out_width, out_width, out_height, 0, 1, work + 3 * work_size)) { return 0; } p->emit_alpha = EmitRescaledAlphaRGB; if (p->output->colorspace == MODE_RGBA_4444 || p->output->colorspace == MODE_rgbA_4444) { p->emit_alpha_row = ExportAlphaRGBA4444; } else { p->emit_alpha_row = ExportAlpha; } WebPInitAlphaProcessing(); } return 1; } #endif // WEBP_REDUCE_SIZE //------------------------------------------------------------------------------ // Default custom functions static int CustomSetup(VP8Io* io) { WebPDecParams* const p = (WebPDecParams*)io->opaque; const WEBP_CSP_MODE colorspace = p->output->colorspace; const int is_rgb = WebPIsRGBMode(colorspace); const int is_alpha = WebPIsAlphaMode(colorspace); p->memory = NULL; p->emit = NULL; p->emit_alpha = NULL; p->emit_alpha_row = NULL; if (!WebPIoInitFromOptions(p->options, io, is_alpha ? MODE_YUV : MODE_YUVA)) { return 0; } if (is_alpha && WebPIsPremultipliedMode(colorspace)) { WebPInitUpsamplers(); } if (io->use_scaling) { #if !defined(WEBP_REDUCE_SIZE) const int ok = is_rgb ? InitRGBRescaler(io, p) : InitYUVRescaler(io, p); if (!ok) { return 0; // memory error } #else return 0; // rescaling support not compiled #endif } else { if (is_rgb) { WebPInitSamplers(); p->emit = EmitSampledRGB; // default if (io->fancy_upsampling) { #ifdef FANCY_UPSAMPLING const int uv_width = (io->mb_w + 1) >> 1; p->memory = WebPSafeMalloc(1ULL, (size_t)(io->mb_w + 2 * uv_width)); if (p->memory == NULL) { return 0; // memory error. } p->tmp_y = (uint8_t*)p->memory; p->tmp_u = p->tmp_y + io->mb_w; p->tmp_v = p->tmp_u + uv_width; p->emit = EmitFancyRGB; WebPInitUpsamplers(); #endif } } else { p->emit = EmitYUV; } if (is_alpha) { // need transparency output p->emit_alpha = (colorspace == MODE_RGBA_4444 || colorspace == MODE_rgbA_4444) ? EmitAlphaRGBA4444 : is_rgb ? EmitAlphaRGB : EmitAlphaYUV; if (is_rgb) { WebPInitAlphaProcessing(); } } } return 1; } //------------------------------------------------------------------------------ static int CustomPut(const VP8Io* io) { WebPDecParams* const p = (WebPDecParams*)io->opaque; const int mb_w = io->mb_w; const int mb_h = io->mb_h; int num_lines_out; assert(!(io->mb_y & 1)); if (mb_w <= 0 || mb_h <= 0) { return 0; } num_lines_out = p->emit(io, p); if (p->emit_alpha != NULL) { p->emit_alpha(io, p, num_lines_out); } p->last_y += num_lines_out; return 1; } //------------------------------------------------------------------------------ static void CustomTeardown(const VP8Io* io) { WebPDecParams* const p = (WebPDecParams*)io->opaque; WebPSafeFree(p->memory); p->memory = NULL; } //------------------------------------------------------------------------------ // Main entry point void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io) { io->put = CustomPut; io->setup = CustomSetup; io->teardown = CustomTeardown; io->opaque = params; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/webp_dec.c0000644000014400001440000007464014606317060013324 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Main decoding functions for WEBP images. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/dec/vp8_dec.h" #include "src/dec/vp8i_dec.h" #include "src/dec/vp8li_dec.h" #include "src/dec/webpi_dec.h" #include "src/utils/utils.h" #include "src/webp/mux_types.h" // ALPHA_FLAG #include "src/webp/decode.h" #include "src/webp/types.h" //------------------------------------------------------------------------------ // RIFF layout is: // Offset tag // 0...3 "RIFF" 4-byte tag // 4...7 size of image data (including metadata) starting at offset 8 // 8...11 "WEBP" our form-type signature // The RIFF container (12 bytes) is followed by appropriate chunks: // 12..15 "VP8 ": 4-bytes tags, signaling the use of VP8 video format // 16..19 size of the raw VP8 image data, starting at offset 20 // 20.... the VP8 bytes // Or, // 12..15 "VP8L": 4-bytes tags, signaling the use of VP8L lossless format // 16..19 size of the raw VP8L image data, starting at offset 20 // 20.... the VP8L bytes // Or, // 12..15 "VP8X": 4-bytes tags, describing the extended-VP8 chunk. // 16..19 size of the VP8X chunk starting at offset 20. // 20..23 VP8X flags bit-map corresponding to the chunk-types present. // 24..26 Width of the Canvas Image. // 27..29 Height of the Canvas Image. // There can be extra chunks after the "VP8X" chunk (ICCP, ANMF, VP8, VP8L, // XMP, EXIF ...) // All sizes are in little-endian order. // Note: chunk data size must be padded to multiple of 2 when written. // Validates the RIFF container (if detected) and skips over it. // If a RIFF container is detected, returns: // VP8_STATUS_BITSTREAM_ERROR for invalid header, // VP8_STATUS_NOT_ENOUGH_DATA for truncated data if have_all_data is true, // and VP8_STATUS_OK otherwise. // In case there are not enough bytes (partial RIFF container), return 0 for // *riff_size. Else return the RIFF size extracted from the header. static VP8StatusCode ParseRIFF(const uint8_t** const data, size_t* const data_size, int have_all_data, size_t* const riff_size) { assert(data != NULL); assert(data_size != NULL); assert(riff_size != NULL); *riff_size = 0; // Default: no RIFF present. if (*data_size >= RIFF_HEADER_SIZE && !memcmp(*data, "RIFF", TAG_SIZE)) { if (memcmp(*data + 8, "WEBP", TAG_SIZE)) { return VP8_STATUS_BITSTREAM_ERROR; // Wrong image file signature. } else { const uint32_t size = GetLE32(*data + TAG_SIZE); // Check that we have at least one chunk (i.e "WEBP" + "VP8?nnnn"). if (size < TAG_SIZE + CHUNK_HEADER_SIZE) { return VP8_STATUS_BITSTREAM_ERROR; } if (size > MAX_CHUNK_PAYLOAD) { return VP8_STATUS_BITSTREAM_ERROR; } if (have_all_data && (size > *data_size - CHUNK_HEADER_SIZE)) { return VP8_STATUS_NOT_ENOUGH_DATA; // Truncated bitstream. } // We have a RIFF container. Skip it. *riff_size = size; *data += RIFF_HEADER_SIZE; *data_size -= RIFF_HEADER_SIZE; } } return VP8_STATUS_OK; } // Validates the VP8X header and skips over it. // Returns VP8_STATUS_BITSTREAM_ERROR for invalid VP8X header, // VP8_STATUS_NOT_ENOUGH_DATA in case of insufficient data, and // VP8_STATUS_OK otherwise. // If a VP8X chunk is found, found_vp8x is set to true and *width_ptr, // *height_ptr and *flags_ptr are set to the corresponding values extracted // from the VP8X chunk. static VP8StatusCode ParseVP8X(const uint8_t** const data, size_t* const data_size, int* const found_vp8x, int* const width_ptr, int* const height_ptr, uint32_t* const flags_ptr) { const uint32_t vp8x_size = CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE; assert(data != NULL); assert(data_size != NULL); assert(found_vp8x != NULL); *found_vp8x = 0; if (*data_size < CHUNK_HEADER_SIZE) { return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. } if (!memcmp(*data, "VP8X", TAG_SIZE)) { int width, height; uint32_t flags; const uint32_t chunk_size = GetLE32(*data + TAG_SIZE); if (chunk_size != VP8X_CHUNK_SIZE) { return VP8_STATUS_BITSTREAM_ERROR; // Wrong chunk size. } // Verify if enough data is available to validate the VP8X chunk. if (*data_size < vp8x_size) { return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. } flags = GetLE32(*data + 8); width = 1 + GetLE24(*data + 12); height = 1 + GetLE24(*data + 15); if (width * (uint64_t)height >= MAX_IMAGE_AREA) { return VP8_STATUS_BITSTREAM_ERROR; // image is too large } if (flags_ptr != NULL) *flags_ptr = flags; if (width_ptr != NULL) *width_ptr = width; if (height_ptr != NULL) *height_ptr = height; // Skip over VP8X header bytes. *data += vp8x_size; *data_size -= vp8x_size; *found_vp8x = 1; } return VP8_STATUS_OK; } // Skips to the next VP8/VP8L chunk header in the data given the size of the // RIFF chunk 'riff_size'. // Returns VP8_STATUS_BITSTREAM_ERROR if any invalid chunk size is encountered, // VP8_STATUS_NOT_ENOUGH_DATA in case of insufficient data, and // VP8_STATUS_OK otherwise. // If an alpha chunk is found, *alpha_data and *alpha_size are set // appropriately. static VP8StatusCode ParseOptionalChunks(const uint8_t** const data, size_t* const data_size, size_t const riff_size, const uint8_t** const alpha_data, size_t* const alpha_size) { const uint8_t* buf; size_t buf_size; uint32_t total_size = TAG_SIZE + // "WEBP". CHUNK_HEADER_SIZE + // "VP8Xnnnn". VP8X_CHUNK_SIZE; // data. assert(data != NULL); assert(data_size != NULL); buf = *data; buf_size = *data_size; assert(alpha_data != NULL); assert(alpha_size != NULL); *alpha_data = NULL; *alpha_size = 0; while (1) { uint32_t chunk_size; uint32_t disk_chunk_size; // chunk_size with padding *data = buf; *data_size = buf_size; if (buf_size < CHUNK_HEADER_SIZE) { // Insufficient data. return VP8_STATUS_NOT_ENOUGH_DATA; } chunk_size = GetLE32(buf + TAG_SIZE); if (chunk_size > MAX_CHUNK_PAYLOAD) { return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size. } // For odd-sized chunk-payload, there's one byte padding at the end. disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1u; total_size += disk_chunk_size; // Check that total bytes skipped so far does not exceed riff_size. if (riff_size > 0 && (total_size > riff_size)) { return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size. } // Start of a (possibly incomplete) VP8/VP8L chunk implies that we have // parsed all the optional chunks. // Note: This check must occur before the check 'buf_size < disk_chunk_size' // below to allow incomplete VP8/VP8L chunks. if (!memcmp(buf, "VP8 ", TAG_SIZE) || !memcmp(buf, "VP8L", TAG_SIZE)) { return VP8_STATUS_OK; } if (buf_size < disk_chunk_size) { // Insufficient data. return VP8_STATUS_NOT_ENOUGH_DATA; } if (!memcmp(buf, "ALPH", TAG_SIZE)) { // A valid ALPH header. *alpha_data = buf + CHUNK_HEADER_SIZE; *alpha_size = chunk_size; } // We have a full and valid chunk; skip it. buf += disk_chunk_size; buf_size -= disk_chunk_size; } } // Validates the VP8/VP8L Header ("VP8 nnnn" or "VP8L nnnn") and skips over it. // Returns VP8_STATUS_BITSTREAM_ERROR for invalid (chunk larger than // riff_size) VP8/VP8L header, // VP8_STATUS_NOT_ENOUGH_DATA in case of insufficient data, and // VP8_STATUS_OK otherwise. // If a VP8/VP8L chunk is found, *chunk_size is set to the total number of bytes // extracted from the VP8/VP8L chunk header. // The flag '*is_lossless' is set to 1 in case of VP8L chunk / raw VP8L data. static VP8StatusCode ParseVP8Header(const uint8_t** const data_ptr, size_t* const data_size, int have_all_data, size_t riff_size, size_t* const chunk_size, int* const is_lossless) { const uint8_t* const data = *data_ptr; const int is_vp8 = !memcmp(data, "VP8 ", TAG_SIZE); const int is_vp8l = !memcmp(data, "VP8L", TAG_SIZE); const uint32_t minimal_size = TAG_SIZE + CHUNK_HEADER_SIZE; // "WEBP" + "VP8 nnnn" OR // "WEBP" + "VP8Lnnnn" assert(data != NULL); assert(data_size != NULL); assert(chunk_size != NULL); assert(is_lossless != NULL); if (*data_size < CHUNK_HEADER_SIZE) { return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. } if (is_vp8 || is_vp8l) { // Bitstream contains VP8/VP8L header. const uint32_t size = GetLE32(data + TAG_SIZE); if ((riff_size >= minimal_size) && (size > riff_size - minimal_size)) { return VP8_STATUS_BITSTREAM_ERROR; // Inconsistent size information. } if (have_all_data && (size > *data_size - CHUNK_HEADER_SIZE)) { return VP8_STATUS_NOT_ENOUGH_DATA; // Truncated bitstream. } // Skip over CHUNK_HEADER_SIZE bytes from VP8/VP8L Header. *chunk_size = size; *data_ptr += CHUNK_HEADER_SIZE; *data_size -= CHUNK_HEADER_SIZE; *is_lossless = is_vp8l; } else { // Raw VP8/VP8L bitstream (no header). *is_lossless = VP8LCheckSignature(data, *data_size); *chunk_size = *data_size; } return VP8_STATUS_OK; } //------------------------------------------------------------------------------ // Fetch '*width', '*height', '*has_alpha' and fill out 'headers' based on // 'data'. All the output parameters may be NULL. If 'headers' is NULL only the // minimal amount will be read to fetch the remaining parameters. // If 'headers' is non-NULL this function will attempt to locate both alpha // data (with or without a VP8X chunk) and the bitstream chunk (VP8/VP8L). // Note: The following chunk sequences (before the raw VP8/VP8L data) are // considered valid by this function: // RIFF + VP8(L) // RIFF + VP8X + (optional chunks) + VP8(L) // ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. // VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. static VP8StatusCode ParseHeadersInternal(const uint8_t* data, size_t data_size, int* const width, int* const height, int* const has_alpha, int* const has_animation, int* const format, WebPHeaderStructure* const headers) { int canvas_width = 0; int canvas_height = 0; int image_width = 0; int image_height = 0; int found_riff = 0; int found_vp8x = 0; int animation_present = 0; const int have_all_data = (headers != NULL) ? headers->have_all_data : 0; VP8StatusCode status; WebPHeaderStructure hdrs; if (data == NULL || data_size < RIFF_HEADER_SIZE) { return VP8_STATUS_NOT_ENOUGH_DATA; } memset(&hdrs, 0, sizeof(hdrs)); hdrs.data = data; hdrs.data_size = data_size; // Skip over RIFF header. status = ParseRIFF(&data, &data_size, have_all_data, &hdrs.riff_size); if (status != VP8_STATUS_OK) { return status; // Wrong RIFF header / insufficient data. } found_riff = (hdrs.riff_size > 0); // Skip over VP8X. { uint32_t flags = 0; status = ParseVP8X(&data, &data_size, &found_vp8x, &canvas_width, &canvas_height, &flags); if (status != VP8_STATUS_OK) { return status; // Wrong VP8X / insufficient data. } animation_present = !!(flags & ANIMATION_FLAG); if (!found_riff && found_vp8x) { // Note: This restriction may be removed in the future, if it becomes // necessary to send VP8X chunk to the decoder. return VP8_STATUS_BITSTREAM_ERROR; } if (has_alpha != NULL) *has_alpha = !!(flags & ALPHA_FLAG); if (has_animation != NULL) *has_animation = animation_present; if (format != NULL) *format = 0; // default = undefined image_width = canvas_width; image_height = canvas_height; if (found_vp8x && animation_present && headers == NULL) { status = VP8_STATUS_OK; goto ReturnWidthHeight; // Just return features from VP8X header. } } if (data_size < TAG_SIZE) { status = VP8_STATUS_NOT_ENOUGH_DATA; goto ReturnWidthHeight; } // Skip over optional chunks if data started with "RIFF + VP8X" or "ALPH". if ((found_riff && found_vp8x) || (!found_riff && !found_vp8x && !memcmp(data, "ALPH", TAG_SIZE))) { status = ParseOptionalChunks(&data, &data_size, hdrs.riff_size, &hdrs.alpha_data, &hdrs.alpha_data_size); if (status != VP8_STATUS_OK) { goto ReturnWidthHeight; // Invalid chunk size / insufficient data. } } // Skip over VP8/VP8L header. status = ParseVP8Header(&data, &data_size, have_all_data, hdrs.riff_size, &hdrs.compressed_size, &hdrs.is_lossless); if (status != VP8_STATUS_OK) { goto ReturnWidthHeight; // Wrong VP8/VP8L chunk-header / insufficient data. } if (hdrs.compressed_size > MAX_CHUNK_PAYLOAD) { return VP8_STATUS_BITSTREAM_ERROR; } if (format != NULL && !animation_present) { *format = hdrs.is_lossless ? 2 : 1; } if (!hdrs.is_lossless) { if (data_size < VP8_FRAME_HEADER_SIZE) { status = VP8_STATUS_NOT_ENOUGH_DATA; goto ReturnWidthHeight; } // Validates raw VP8 data. if (!VP8GetInfo(data, data_size, (uint32_t)hdrs.compressed_size, &image_width, &image_height)) { return VP8_STATUS_BITSTREAM_ERROR; } } else { if (data_size < VP8L_FRAME_HEADER_SIZE) { status = VP8_STATUS_NOT_ENOUGH_DATA; goto ReturnWidthHeight; } // Validates raw VP8L data. if (!VP8LGetInfo(data, data_size, &image_width, &image_height, has_alpha)) { return VP8_STATUS_BITSTREAM_ERROR; } } // Validates image size coherency. if (found_vp8x) { if (canvas_width != image_width || canvas_height != image_height) { return VP8_STATUS_BITSTREAM_ERROR; } } if (headers != NULL) { *headers = hdrs; headers->offset = data - headers->data; assert((uint64_t)(data - headers->data) < MAX_CHUNK_PAYLOAD); assert(headers->offset == headers->data_size - data_size); } ReturnWidthHeight: if (status == VP8_STATUS_OK || (status == VP8_STATUS_NOT_ENOUGH_DATA && found_vp8x && headers == NULL)) { if (has_alpha != NULL) { // If the data did not contain a VP8X/VP8L chunk the only definitive way // to set this is by looking for alpha data (from an ALPH chunk). *has_alpha |= (hdrs.alpha_data != NULL); } if (width != NULL) *width = image_width; if (height != NULL) *height = image_height; return VP8_STATUS_OK; } else { return status; } } VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers) { // status is marked volatile as a workaround for a clang-3.8 (aarch64) bug volatile VP8StatusCode status; int has_animation = 0; assert(headers != NULL); // fill out headers, ignore width/height/has_alpha. status = ParseHeadersInternal(headers->data, headers->data_size, NULL, NULL, NULL, &has_animation, NULL, headers); if (status == VP8_STATUS_OK || status == VP8_STATUS_NOT_ENOUGH_DATA) { // The WebPDemux API + libwebp can be used to decode individual // uncomposited frames or the WebPAnimDecoder can be used to fully // reconstruct them (see webp/demux.h). if (has_animation) { status = VP8_STATUS_UNSUPPORTED_FEATURE; } } return status; } //------------------------------------------------------------------------------ // WebPDecParams void WebPResetDecParams(WebPDecParams* const params) { if (params != NULL) { memset(params, 0, sizeof(*params)); } } //------------------------------------------------------------------------------ // "Into" decoding variants // Main flow WEBP_NODISCARD static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size, WebPDecParams* const params) { VP8StatusCode status; VP8Io io; WebPHeaderStructure headers; headers.data = data; headers.data_size = data_size; headers.have_all_data = 1; status = WebPParseHeaders(&headers); // Process Pre-VP8 chunks. if (status != VP8_STATUS_OK) { return status; } assert(params != NULL); if (!VP8InitIo(&io)) { return VP8_STATUS_INVALID_PARAM; } io.data = headers.data + headers.offset; io.data_size = headers.data_size - headers.offset; WebPInitCustomIo(params, &io); // Plug the I/O functions. if (!headers.is_lossless) { VP8Decoder* const dec = VP8New(); if (dec == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } dec->alpha_data_ = headers.alpha_data; dec->alpha_data_size_ = headers.alpha_data_size; // Decode bitstream header, update io->width/io->height. if (!VP8GetHeaders(dec, &io)) { status = dec->status_; // An error occurred. Grab error status. } else { // Allocate/check output buffers. status = WebPAllocateDecBuffer(io.width, io.height, params->options, params->output); if (status == VP8_STATUS_OK) { // Decode // This change must be done before calling VP8Decode() dec->mt_method_ = VP8GetThreadMethod(params->options, &headers, io.width, io.height); VP8InitDithering(params->options, dec); if (!VP8Decode(dec, &io)) { status = dec->status_; } } } VP8Delete(dec); } else { VP8LDecoder* const dec = VP8LNew(); if (dec == NULL) { return VP8_STATUS_OUT_OF_MEMORY; } if (!VP8LDecodeHeader(dec, &io)) { status = dec->status_; // An error occurred. Grab error status. } else { // Allocate/check output buffers. status = WebPAllocateDecBuffer(io.width, io.height, params->options, params->output); if (status == VP8_STATUS_OK) { // Decode if (!VP8LDecodeImage(dec)) { status = dec->status_; } } } VP8LDelete(dec); } if (status != VP8_STATUS_OK) { WebPFreeDecBuffer(params->output); } else { if (params->options != NULL && params->options->flip) { // This restores the original stride values if options->flip was used // during the call to WebPAllocateDecBuffer above. status = WebPFlipBuffer(params->output); } } return status; } // Helpers WEBP_NODISCARD static uint8_t* DecodeIntoRGBABuffer(WEBP_CSP_MODE colorspace, const uint8_t* const data, size_t data_size, uint8_t* const rgba, int stride, size_t size) { WebPDecParams params; WebPDecBuffer buf; if (rgba == NULL || !WebPInitDecBuffer(&buf)) { return NULL; } WebPResetDecParams(¶ms); params.output = &buf; buf.colorspace = colorspace; buf.u.RGBA.rgba = rgba; buf.u.RGBA.stride = stride; buf.u.RGBA.size = size; buf.is_external_memory = 1; if (DecodeInto(data, data_size, ¶ms) != VP8_STATUS_OK) { return NULL; } return rgba; } uint8_t* WebPDecodeRGBInto(const uint8_t* data, size_t data_size, uint8_t* output, size_t size, int stride) { return DecodeIntoRGBABuffer(MODE_RGB, data, data_size, output, stride, size); } uint8_t* WebPDecodeRGBAInto(const uint8_t* data, size_t data_size, uint8_t* output, size_t size, int stride) { return DecodeIntoRGBABuffer(MODE_RGBA, data, data_size, output, stride, size); } uint8_t* WebPDecodeARGBInto(const uint8_t* data, size_t data_size, uint8_t* output, size_t size, int stride) { return DecodeIntoRGBABuffer(MODE_ARGB, data, data_size, output, stride, size); } uint8_t* WebPDecodeBGRInto(const uint8_t* data, size_t data_size, uint8_t* output, size_t size, int stride) { return DecodeIntoRGBABuffer(MODE_BGR, data, data_size, output, stride, size); } uint8_t* WebPDecodeBGRAInto(const uint8_t* data, size_t data_size, uint8_t* output, size_t size, int stride) { return DecodeIntoRGBABuffer(MODE_BGRA, data, data_size, output, stride, size); } uint8_t* WebPDecodeYUVInto(const uint8_t* data, size_t data_size, uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride) { WebPDecParams params; WebPDecBuffer output; if (luma == NULL || !WebPInitDecBuffer(&output)) return NULL; WebPResetDecParams(¶ms); params.output = &output; output.colorspace = MODE_YUV; output.u.YUVA.y = luma; output.u.YUVA.y_stride = luma_stride; output.u.YUVA.y_size = luma_size; output.u.YUVA.u = u; output.u.YUVA.u_stride = u_stride; output.u.YUVA.u_size = u_size; output.u.YUVA.v = v; output.u.YUVA.v_stride = v_stride; output.u.YUVA.v_size = v_size; output.is_external_memory = 1; if (DecodeInto(data, data_size, ¶ms) != VP8_STATUS_OK) { return NULL; } return luma; } //------------------------------------------------------------------------------ WEBP_NODISCARD static uint8_t* Decode(WEBP_CSP_MODE mode, const uint8_t* const data, size_t data_size, int* const width, int* const height, WebPDecBuffer* const keep_info) { WebPDecParams params; WebPDecBuffer output; if (!WebPInitDecBuffer(&output)) { return NULL; } WebPResetDecParams(¶ms); params.output = &output; output.colorspace = mode; // Retrieve (and report back) the required dimensions from bitstream. if (!WebPGetInfo(data, data_size, &output.width, &output.height)) { return NULL; } if (width != NULL) *width = output.width; if (height != NULL) *height = output.height; // Decode if (DecodeInto(data, data_size, ¶ms) != VP8_STATUS_OK) { return NULL; } if (keep_info != NULL) { // keep track of the side-info WebPCopyDecBuffer(&output, keep_info); } // return decoded samples (don't clear 'output'!) return WebPIsRGBMode(mode) ? output.u.RGBA.rgba : output.u.YUVA.y; } uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, int* width, int* height) { return Decode(MODE_RGB, data, data_size, width, height, NULL); } uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size, int* width, int* height) { return Decode(MODE_RGBA, data, data_size, width, height, NULL); } uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size, int* width, int* height) { return Decode(MODE_ARGB, data, data_size, width, height, NULL); } uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size, int* width, int* height) { return Decode(MODE_BGR, data, data_size, width, height, NULL); } uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size, int* width, int* height) { return Decode(MODE_BGRA, data, data_size, width, height, NULL); } uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size, int* width, int* height, uint8_t** u, uint8_t** v, int* stride, int* uv_stride) { // data, width and height are checked by Decode(). if (u == NULL || v == NULL || stride == NULL || uv_stride == NULL) { return NULL; } { WebPDecBuffer output; // only to preserve the side-infos uint8_t* const out = Decode(MODE_YUV, data, data_size, width, height, &output); if (out != NULL) { const WebPYUVABuffer* const buf = &output.u.YUVA; *u = buf->u; *v = buf->v; *stride = buf->y_stride; *uv_stride = buf->u_stride; assert(buf->u_stride == buf->v_stride); } return out; } } static void DefaultFeatures(WebPBitstreamFeatures* const features) { assert(features != NULL); memset(features, 0, sizeof(*features)); } static VP8StatusCode GetFeatures(const uint8_t* const data, size_t data_size, WebPBitstreamFeatures* const features) { if (features == NULL || data == NULL) { return VP8_STATUS_INVALID_PARAM; } DefaultFeatures(features); // Only parse enough of the data to retrieve the features. return ParseHeadersInternal(data, data_size, &features->width, &features->height, &features->has_alpha, &features->has_animation, &features->format, NULL); } //------------------------------------------------------------------------------ // WebPGetInfo() int WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height) { WebPBitstreamFeatures features; if (GetFeatures(data, data_size, &features) != VP8_STATUS_OK) { return 0; } if (width != NULL) { *width = features.width; } if (height != NULL) { *height = features.height; } return 1; } //------------------------------------------------------------------------------ // Advance decoding API int WebPInitDecoderConfigInternal(WebPDecoderConfig* config, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_DECODER_ABI_VERSION)) { return 0; // version mismatch } if (config == NULL) { return 0; } memset(config, 0, sizeof(*config)); DefaultFeatures(&config->input); if (!WebPInitDecBuffer(&config->output)) { return 0; } return 1; } VP8StatusCode WebPGetFeaturesInternal(const uint8_t* data, size_t data_size, WebPBitstreamFeatures* features, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_DECODER_ABI_VERSION)) { return VP8_STATUS_INVALID_PARAM; // version mismatch } if (features == NULL) { return VP8_STATUS_INVALID_PARAM; } return GetFeatures(data, data_size, features); } VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size, WebPDecoderConfig* config) { WebPDecParams params; VP8StatusCode status; if (config == NULL) { return VP8_STATUS_INVALID_PARAM; } status = GetFeatures(data, data_size, &config->input); if (status != VP8_STATUS_OK) { if (status == VP8_STATUS_NOT_ENOUGH_DATA) { return VP8_STATUS_BITSTREAM_ERROR; // Not-enough-data treated as error. } return status; } WebPResetDecParams(¶ms); params.options = &config->options; params.output = &config->output; if (WebPAvoidSlowMemory(params.output, &config->input)) { // decoding to slow memory: use a temporary in-mem buffer to decode into. WebPDecBuffer in_mem_buffer; if (!WebPInitDecBuffer(&in_mem_buffer)) { return VP8_STATUS_INVALID_PARAM; } in_mem_buffer.colorspace = config->output.colorspace; in_mem_buffer.width = config->input.width; in_mem_buffer.height = config->input.height; params.output = &in_mem_buffer; status = DecodeInto(data, data_size, ¶ms); if (status == VP8_STATUS_OK) { // do the slow-copy status = WebPCopyDecBufferPixels(&in_mem_buffer, &config->output); } WebPFreeDecBuffer(&in_mem_buffer); } else { status = DecodeInto(data, data_size, ¶ms); } return status; } //------------------------------------------------------------------------------ // Cropping and rescaling. int WebPCheckCropDimensions(int image_width, int image_height, int x, int y, int w, int h) { return !(x < 0 || y < 0 || w <= 0 || h <= 0 || x >= image_width || w > image_width || w > image_width - x || y >= image_height || h > image_height || h > image_height - y); } int WebPIoInitFromOptions(const WebPDecoderOptions* const options, VP8Io* const io, WEBP_CSP_MODE src_colorspace) { const int W = io->width; const int H = io->height; int x = 0, y = 0, w = W, h = H; // Cropping io->use_cropping = (options != NULL) && options->use_cropping; if (io->use_cropping) { w = options->crop_width; h = options->crop_height; x = options->crop_left; y = options->crop_top; if (!WebPIsRGBMode(src_colorspace)) { // only snap for YUV420 x &= ~1; y &= ~1; } if (!WebPCheckCropDimensions(W, H, x, y, w, h)) { return 0; // out of frame boundary error } } io->crop_left = x; io->crop_top = y; io->crop_right = x + w; io->crop_bottom = y + h; io->mb_w = w; io->mb_h = h; // Scaling io->use_scaling = (options != NULL) && options->use_scaling; if (io->use_scaling) { int scaled_width = options->scaled_width; int scaled_height = options->scaled_height; if (!WebPRescalerGetScaledDimensions(w, h, &scaled_width, &scaled_height)) { return 0; } io->scaled_width = scaled_width; io->scaled_height = scaled_height; } // Filter io->bypass_filtering = (options != NULL) && options->bypass_filtering; // Fancy upsampler #ifdef FANCY_UPSAMPLING io->fancy_upsampling = (options == NULL) || (!options->no_fancy_upsampling); #endif if (io->use_scaling) { // disable filter (only for large downscaling ratio). io->bypass_filtering |= (io->scaled_width < W * 3 / 4) && (io->scaled_height < H * 3 / 4); io->fancy_upsampling = 0; } return 1; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/dec/tree_dec.c0000644000014400001440000005573714606317060013334 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Coding trees and probas // // Author: Skal (pascal.massimino@gmail.com) #include "src/dec/vp8i_dec.h" #include "src/dsp/cpu.h" #include "src/utils/bit_reader_inl_utils.h" #if !defined(USE_GENERIC_TREE) #if !defined(__arm__) && !defined(_M_ARM) && !WEBP_AARCH64 // using a table is ~1-2% slower on ARM. Prefer the coded-tree approach then. #define USE_GENERIC_TREE 1 // ALTERNATE_CODE #else #define USE_GENERIC_TREE 0 #endif #endif // USE_GENERIC_TREE #if (USE_GENERIC_TREE == 1) static const int8_t kYModesIntra4[18] = { -B_DC_PRED, 1, -B_TM_PRED, 2, -B_VE_PRED, 3, 4, 6, -B_HE_PRED, 5, -B_RD_PRED, -B_VR_PRED, -B_LD_PRED, 7, -B_VL_PRED, 8, -B_HD_PRED, -B_HU_PRED }; #endif //------------------------------------------------------------------------------ // Default probabilities // Paragraph 13.5 static const uint8_t CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 }, { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 }, { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 } }, { { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 }, { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 }, { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128 }, }, { { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128 }, { 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128 }, { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128 }, }, { { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128 }, { 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128 }, { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128 } }, { { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128 }, { 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128 }, { 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128 } }, { { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128 }, { 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128 }, { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128 } }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } }, { { { 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62 }, { 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1 }, { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128 } }, { { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128 }, { 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128 }, { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128 } }, { { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128 }, { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128 }, { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128 } }, { { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128 }, { 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128 }, { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128 } }, { { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128 }, { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128 }, { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128 } }, { { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128 }, { 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128 }, { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128 } }, { { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128 }, { 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128 }, { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128 } }, { { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128 }, { 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128 }, { 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128 } } }, { { { 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128 }, { 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128 }, { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128 } }, { { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128 }, { 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128 }, { 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128 } }, { { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128 }, { 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128 }, { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128 } }, { { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128 }, { 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128 }, { 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128 } }, { { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128 }, { 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128 }, { 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128 }, { 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128 }, { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } }, { { { 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255 }, { 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128 }, { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128 } }, { { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128 }, { 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128 }, { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128 } }, { { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128 }, { 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128 }, { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128 } }, { { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128 }, { 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128 }, { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128 } }, { { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128 }, { 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128 }, { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128 } }, { { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128 }, { 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128 }, { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128 } }, { { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128 }, { 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128 }, { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128 } }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 } } } }; // Paragraph 11.5 static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { { 231, 120, 48, 89, 115, 113, 120, 152, 112 }, { 152, 179, 64, 126, 170, 118, 46, 70, 95 }, { 175, 69, 143, 80, 85, 82, 72, 155, 103 }, { 56, 58, 10, 171, 218, 189, 17, 13, 152 }, { 114, 26, 17, 163, 44, 195, 21, 10, 173 }, { 121, 24, 80, 195, 26, 62, 44, 64, 85 }, { 144, 71, 10, 38, 171, 213, 144, 34, 26 }, { 170, 46, 55, 19, 136, 160, 33, 206, 71 }, { 63, 20, 8, 114, 114, 208, 12, 9, 226 }, { 81, 40, 11, 96, 182, 84, 29, 16, 36 } }, { { 134, 183, 89, 137, 98, 101, 106, 165, 148 }, { 72, 187, 100, 130, 157, 111, 32, 75, 80 }, { 66, 102, 167, 99, 74, 62, 40, 234, 128 }, { 41, 53, 9, 178, 241, 141, 26, 8, 107 }, { 74, 43, 26, 146, 73, 166, 49, 23, 157 }, { 65, 38, 105, 160, 51, 52, 31, 115, 128 }, { 104, 79, 12, 27, 217, 255, 87, 17, 7 }, { 87, 68, 71, 44, 114, 51, 15, 186, 23 }, { 47, 41, 14, 110, 182, 183, 21, 17, 194 }, { 66, 45, 25, 102, 197, 189, 23, 18, 22 } }, { { 88, 88, 147, 150, 42, 46, 45, 196, 205 }, { 43, 97, 183, 117, 85, 38, 35, 179, 61 }, { 39, 53, 200, 87, 26, 21, 43, 232, 171 }, { 56, 34, 51, 104, 114, 102, 29, 93, 77 }, { 39, 28, 85, 171, 58, 165, 90, 98, 64 }, { 34, 22, 116, 206, 23, 34, 43, 166, 73 }, { 107, 54, 32, 26, 51, 1, 81, 43, 31 }, { 68, 25, 106, 22, 64, 171, 36, 225, 114 }, { 34, 19, 21, 102, 132, 188, 16, 76, 124 }, { 62, 18, 78, 95, 85, 57, 50, 48, 51 } }, { { 193, 101, 35, 159, 215, 111, 89, 46, 111 }, { 60, 148, 31, 172, 219, 228, 21, 18, 111 }, { 112, 113, 77, 85, 179, 255, 38, 120, 114 }, { 40, 42, 1, 196, 245, 209, 10, 25, 109 }, { 88, 43, 29, 140, 166, 213, 37, 43, 154 }, { 61, 63, 30, 155, 67, 45, 68, 1, 209 }, { 100, 80, 8, 43, 154, 1, 51, 26, 71 }, { 142, 78, 78, 16, 255, 128, 34, 197, 171 }, { 41, 40, 5, 102, 211, 183, 4, 1, 221 }, { 51, 50, 17, 168, 209, 192, 23, 25, 82 } }, { { 138, 31, 36, 171, 27, 166, 38, 44, 229 }, { 67, 87, 58, 169, 82, 115, 26, 59, 179 }, { 63, 59, 90, 180, 59, 166, 93, 73, 154 }, { 40, 40, 21, 116, 143, 209, 34, 39, 175 }, { 47, 15, 16, 183, 34, 223, 49, 45, 183 }, { 46, 17, 33, 183, 6, 98, 15, 32, 183 }, { 57, 46, 22, 24, 128, 1, 54, 17, 37 }, { 65, 32, 73, 115, 28, 128, 23, 128, 205 }, { 40, 3, 9, 115, 51, 192, 18, 6, 223 }, { 87, 37, 9, 115, 59, 77, 64, 21, 47 } }, { { 104, 55, 44, 218, 9, 54, 53, 130, 226 }, { 64, 90, 70, 205, 40, 41, 23, 26, 57 }, { 54, 57, 112, 184, 5, 41, 38, 166, 213 }, { 30, 34, 26, 133, 152, 116, 10, 32, 134 }, { 39, 19, 53, 221, 26, 114, 32, 73, 255 }, { 31, 9, 65, 234, 2, 15, 1, 118, 73 }, { 75, 32, 12, 51, 192, 255, 160, 43, 51 }, { 88, 31, 35, 67, 102, 85, 55, 186, 85 }, { 56, 21, 23, 111, 59, 205, 45, 37, 192 }, { 55, 38, 70, 124, 73, 102, 1, 34, 98 } }, { { 125, 98, 42, 88, 104, 85, 117, 175, 82 }, { 95, 84, 53, 89, 128, 100, 113, 101, 45 }, { 75, 79, 123, 47, 51, 128, 81, 171, 1 }, { 57, 17, 5, 71, 102, 57, 53, 41, 49 }, { 38, 33, 13, 121, 57, 73, 26, 1, 85 }, { 41, 10, 67, 138, 77, 110, 90, 47, 114 }, { 115, 21, 2, 10, 102, 255, 166, 23, 6 }, { 101, 29, 16, 10, 85, 128, 101, 196, 26 }, { 57, 18, 10, 102, 102, 213, 34, 20, 43 }, { 117, 20, 15, 36, 163, 128, 68, 1, 26 } }, { { 102, 61, 71, 37, 34, 53, 31, 243, 192 }, { 69, 60, 71, 38, 73, 119, 28, 222, 37 }, { 68, 45, 128, 34, 1, 47, 11, 245, 171 }, { 62, 17, 19, 70, 146, 85, 55, 62, 70 }, { 37, 43, 37, 154, 100, 163, 85, 160, 1 }, { 63, 9, 92, 136, 28, 64, 32, 201, 85 }, { 75, 15, 9, 9, 64, 255, 184, 119, 16 }, { 86, 6, 28, 5, 64, 255, 25, 248, 1 }, { 56, 8, 17, 132, 137, 255, 55, 116, 128 }, { 58, 15, 20, 82, 135, 57, 26, 121, 40 } }, { { 164, 50, 31, 137, 154, 133, 25, 35, 218 }, { 51, 103, 44, 131, 131, 123, 31, 6, 158 }, { 86, 40, 64, 135, 148, 224, 45, 183, 128 }, { 22, 26, 17, 131, 240, 154, 14, 1, 209 }, { 45, 16, 21, 91, 64, 222, 7, 1, 197 }, { 56, 21, 39, 155, 60, 138, 23, 102, 213 }, { 83, 12, 13, 54, 192, 255, 68, 47, 28 }, { 85, 26, 85, 85, 128, 128, 32, 146, 171 }, { 18, 11, 7, 63, 144, 171, 4, 4, 246 }, { 35, 27, 10, 146, 174, 171, 12, 26, 128 } }, { { 190, 80, 35, 99, 180, 80, 126, 54, 45 }, { 85, 126, 47, 87, 176, 51, 41, 20, 32 }, { 101, 75, 128, 139, 118, 146, 116, 128, 85 }, { 56, 41, 15, 176, 236, 85, 37, 9, 62 }, { 71, 30, 17, 119, 118, 255, 17, 18, 138 }, { 101, 38, 60, 138, 55, 70, 43, 26, 142 }, { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, { 138, 45, 61, 62, 219, 1, 81, 188, 64 }, { 32, 41, 20, 117, 151, 142, 20, 21, 163 }, { 112, 19, 12, 61, 195, 128, 48, 4, 24 } } }; void VP8ResetProba(VP8Proba* const proba) { memset(proba->segments_, 255u, sizeof(proba->segments_)); // proba->bands_[][] is initialized later } static void ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec, int mb_x) { uint8_t* const top = dec->intra_t_ + 4 * mb_x; uint8_t* const left = dec->intra_l_; VP8MBData* const block = dec->mb_data_ + mb_x; // Note: we don't save segment map (yet), as we don't expect // to decode more than 1 keyframe. if (dec->segment_hdr_.update_map_) { // Hardcoded tree parsing block->segment_ = !VP8GetBit(br, dec->proba_.segments_[0], "segments") ? VP8GetBit(br, dec->proba_.segments_[1], "segments") : VP8GetBit(br, dec->proba_.segments_[2], "segments") + 2; } else { block->segment_ = 0; // default for intra } if (dec->use_skip_proba_) block->skip_ = VP8GetBit(br, dec->skip_p_, "skip"); block->is_i4x4_ = !VP8GetBit(br, 145, "block-size"); if (!block->is_i4x4_) { // Hardcoded 16x16 intra-mode decision tree. const int ymode = VP8GetBit(br, 156, "pred-modes") ? (VP8GetBit(br, 128, "pred-modes") ? TM_PRED : H_PRED) : (VP8GetBit(br, 163, "pred-modes") ? V_PRED : DC_PRED); block->imodes_[0] = ymode; memset(top, ymode, 4 * sizeof(*top)); memset(left, ymode, 4 * sizeof(*left)); } else { uint8_t* modes = block->imodes_; int y; for (y = 0; y < 4; ++y) { int ymode = left[y]; int x; for (x = 0; x < 4; ++x) { const uint8_t* const prob = kBModesProba[top[x]][ymode]; #if (USE_GENERIC_TREE == 1) // Generic tree-parsing int i = kYModesIntra4[VP8GetBit(br, prob[0], "pred-modes")]; while (i > 0) { i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i], "pred-modes")]; } ymode = -i; #else // Hardcoded tree parsing ymode = !VP8GetBit(br, prob[0], "pred-modes") ? B_DC_PRED : !VP8GetBit(br, prob[1], "pred-modes") ? B_TM_PRED : !VP8GetBit(br, prob[2], "pred-modes") ? B_VE_PRED : !VP8GetBit(br, prob[3], "pred-modes") ? (!VP8GetBit(br, prob[4], "pred-modes") ? B_HE_PRED : (!VP8GetBit(br, prob[5], "pred-modes") ? B_RD_PRED : B_VR_PRED)) : (!VP8GetBit(br, prob[6], "pred-modes") ? B_LD_PRED : (!VP8GetBit(br, prob[7], "pred-modes") ? B_VL_PRED : (!VP8GetBit(br, prob[8], "pred-modes") ? B_HD_PRED : B_HU_PRED)) ); #endif // USE_GENERIC_TREE top[x] = ymode; } memcpy(modes, top, 4 * sizeof(*top)); modes += 4; left[y] = ymode; } } // Hardcoded UVMode decision tree block->uvmode_ = !VP8GetBit(br, 142, "pred-modes-uv") ? DC_PRED : !VP8GetBit(br, 114, "pred-modes-uv") ? V_PRED : VP8GetBit(br, 183, "pred-modes-uv") ? TM_PRED : H_PRED; } int VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec) { int mb_x; for (mb_x = 0; mb_x < dec->mb_w_; ++mb_x) { ParseIntraMode(br, dec, mb_x); } return !dec->br_.eof_; } //------------------------------------------------------------------------------ // Paragraph 13 static const uint8_t CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { { { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255 }, { 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255 }, { 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255 } }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255 }, { 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255 }, { 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255 }, { 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } } }; // Paragraph 9.9 static const uint8_t kBands[16 + 1] = { 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0 // extra entry as sentinel }; void VP8ParseProba(VP8BitReader* const br, VP8Decoder* const dec) { VP8Proba* const proba = &dec->proba_; int t, b, c, p; for (t = 0; t < NUM_TYPES; ++t) { for (b = 0; b < NUM_BANDS; ++b) { for (c = 0; c < NUM_CTX; ++c) { for (p = 0; p < NUM_PROBAS; ++p) { const int v = VP8GetBit(br, CoeffsUpdateProba[t][b][c][p], "global-header") ? VP8GetValue(br, 8, "global-header") : CoeffsProba0[t][b][c][p]; proba->bands_[t][b].probas_[c][p] = v; } } } for (b = 0; b < 16 + 1; ++b) { proba->bands_ptr_[t][b] = &proba->bands_[t][kBands[b]]; } } dec->use_skip_proba_ = VP8Get(br, "global-header"); if (dec->use_skip_proba_) { dec->skip_p_ = VP8GetValue(br, 8, "global-header"); } } libwebp-1.4.0/src/utils/0000755000014400001440000000000014606317244012006 5ustar libwebp-1.4.0/src/utils/rescaler_utils.h0000644000014400001440000001001714606317060015172 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Rescaling functions // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_UTILS_RESCALER_UTILS_H_ #define WEBP_UTILS_RESCALER_UTILS_H_ #ifdef __cplusplus extern "C" { #endif #include "src/webp/types.h" #define WEBP_RESCALER_RFIX 32 // fixed-point precision for multiplies #define WEBP_RESCALER_ONE (1ull << WEBP_RESCALER_RFIX) #define WEBP_RESCALER_FRAC(x, y) \ ((uint32_t)(((uint64_t)(x) << WEBP_RESCALER_RFIX) / (y))) // Structure used for on-the-fly rescaling typedef uint32_t rescaler_t; // type for side-buffer typedef struct WebPRescaler WebPRescaler; struct WebPRescaler { int x_expand; // true if we're expanding in the x direction int y_expand; // true if we're expanding in the y direction int num_channels; // bytes to jump between pixels uint32_t fx_scale; // fixed-point scaling factors uint32_t fy_scale; // '' uint32_t fxy_scale; // '' int y_accum; // vertical accumulator int y_add, y_sub; // vertical increments int x_add, x_sub; // horizontal increments int src_width, src_height; // source dimensions int dst_width, dst_height; // destination dimensions int src_y, dst_y; // row counters for input and output uint8_t* dst; int dst_stride; rescaler_t* irow, *frow; // work buffer }; // Initialize a rescaler given scratch area 'work' and dimensions of src & dst. // Returns false in case of error. int WebPRescalerInit(WebPRescaler* const rescaler, int src_width, int src_height, uint8_t* const dst, int dst_width, int dst_height, int dst_stride, int num_channels, rescaler_t* const work); // If either 'scaled_width' or 'scaled_height' (but not both) is 0 the value // will be calculated preserving the aspect ratio, otherwise the values are // left unmodified. Returns true on success, false if either value is 0 after // performing the scaling calculation. int WebPRescalerGetScaledDimensions(int src_width, int src_height, int* const scaled_width, int* const scaled_height); // Returns the number of input lines needed next to produce one output line, // considering that the maximum available input lines are 'max_num_lines'. int WebPRescaleNeededLines(const WebPRescaler* const rescaler, int max_num_lines); // Import multiple rows over all channels, until at least one row is ready to // be exported. Returns the actual number of lines that were imported. int WebPRescalerImport(WebPRescaler* const rescaler, int num_rows, const uint8_t* src, int src_stride); // Export as many rows as possible. Return the numbers of rows written. int WebPRescalerExport(WebPRescaler* const rescaler); // Return true if input is finished static WEBP_INLINE int WebPRescalerInputDone(const WebPRescaler* const rescaler) { return (rescaler->src_y >= rescaler->src_height); } // Return true if output is finished static WEBP_INLINE int WebPRescalerOutputDone(const WebPRescaler* const rescaler) { return (rescaler->dst_y >= rescaler->dst_height); } // Return true if there are pending output rows ready. static WEBP_INLINE int WebPRescalerHasPendingOutput(const WebPRescaler* const rescaler) { return !WebPRescalerOutputDone(rescaler) && (rescaler->y_accum <= 0); } //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_RESCALER_UTILS_H_ libwebp-1.4.0/src/utils/huffman_utils.h0000644000014400001440000001067014606317060015023 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for building and looking up Huffman trees. // // Author: Urvang Joshi (urvang@google.com) #ifndef WEBP_UTILS_HUFFMAN_UTILS_H_ #define WEBP_UTILS_HUFFMAN_UTILS_H_ #include #include "src/webp/format_constants.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif #define HUFFMAN_TABLE_BITS 8 #define HUFFMAN_TABLE_MASK ((1 << HUFFMAN_TABLE_BITS) - 1) #define LENGTHS_TABLE_BITS 7 #define LENGTHS_TABLE_MASK ((1 << LENGTHS_TABLE_BITS) - 1) // Huffman lookup table entry typedef struct { uint8_t bits; // number of bits used for this symbol uint16_t value; // symbol value or table offset } HuffmanCode; // long version for holding 32b values typedef struct { int bits; // number of bits used for this symbol, // or an impossible value if not a literal code. uint32_t value; // 32b packed ARGB value if literal, // or non-literal symbol otherwise } HuffmanCode32; // Contiguous memory segment of HuffmanCodes. typedef struct HuffmanTablesSegment { HuffmanCode* start; // Pointer to where we are writing into the segment. Starts at 'start' and // cannot go beyond 'start' + 'size'. HuffmanCode* curr_table; // Pointer to the next segment in the chain. struct HuffmanTablesSegment* next; int size; } HuffmanTablesSegment; // Chained memory segments of HuffmanCodes. typedef struct HuffmanTables { HuffmanTablesSegment root; // Currently processed segment. At first, this is 'root'. HuffmanTablesSegment* curr_segment; } HuffmanTables; // Allocates a HuffmanTables with 'size' contiguous HuffmanCodes. Returns 0 on // memory allocation error, 1 otherwise. WEBP_NODISCARD int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables); void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables); #define HUFFMAN_PACKED_BITS 6 #define HUFFMAN_PACKED_TABLE_SIZE (1u << HUFFMAN_PACKED_BITS) // Huffman table group. // Includes special handling for the following cases: // - is_trivial_literal: one common literal base for RED/BLUE/ALPHA (not GREEN) // - is_trivial_code: only 1 code (no bit is read from bitstream) // - use_packed_table: few enough literal symbols, so all the bit codes // can fit into a small look-up table packed_table[] // The common literal base, if applicable, is stored in 'literal_arb'. typedef struct HTreeGroup HTreeGroup; struct HTreeGroup { HuffmanCode* htrees[HUFFMAN_CODES_PER_META_CODE]; int is_trivial_literal; // True, if huffman trees for Red, Blue & Alpha // Symbols are trivial (have a single code). uint32_t literal_arb; // If is_trivial_literal is true, this is the // ARGB value of the pixel, with Green channel // being set to zero. int is_trivial_code; // true if is_trivial_literal with only one code int use_packed_table; // use packed table below for short literal code // table mapping input bits to a packed values, or escape case to literal code HuffmanCode32 packed_table[HUFFMAN_PACKED_TABLE_SIZE]; }; // Creates the instance of HTreeGroup with specified number of tree-groups. WEBP_NODISCARD HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups); // Releases the memory allocated for HTreeGroup. void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups); // Builds Huffman lookup table assuming code lengths are in symbol order. // The 'code_lengths' is pre-allocated temporary memory buffer used for creating // the huffman table. // Returns built table size or 0 in case of error (invalid tree or // memory error). WEBP_NODISCARD int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits, const int code_lengths[], int code_lengths_size); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_HUFFMAN_UTILS_H_ libwebp-1.4.0/src/utils/quant_levels_dec_utils.h0000644000014400001440000000234614606317060016715 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha plane de-quantization utility // // Author: Vikas Arora (vikasa@google.com) #ifndef WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ #define WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Apply post-processing to input 'data' of size 'width'x'height' assuming that // the source was quantized to a reduced number of levels. 'stride' is in bytes. // Strength is in [0..100] and controls the amount of dithering applied. // Returns false in case of error (data is NULL, invalid parameters, // malloc failure, ...). int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride, int strength); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ libwebp-1.4.0/src/utils/bit_writer_utils.c0000644000014400001440000002553114606317060015546 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Bit writing and boolean coder // // Author: Skal (pascal.massimino@gmail.com) // Vikas Arora (vikaas.arora@gmail.com) #include #include // for memcpy() #include #include "src/utils/bit_writer_utils.h" #include "src/utils/endian_inl_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // VP8BitWriter static int BitWriterResize(VP8BitWriter* const bw, size_t extra_size) { uint8_t* new_buf; size_t new_size; const uint64_t needed_size_64b = (uint64_t)bw->pos_ + extra_size; const size_t needed_size = (size_t)needed_size_64b; if (needed_size_64b != needed_size) { bw->error_ = 1; return 0; } if (needed_size <= bw->max_pos_) return 1; // If the following line wraps over 32bit, the test just after will catch it. new_size = 2 * bw->max_pos_; if (new_size < needed_size) new_size = needed_size; if (new_size < 1024) new_size = 1024; new_buf = (uint8_t*)WebPSafeMalloc(1ULL, new_size); if (new_buf == NULL) { bw->error_ = 1; return 0; } if (bw->pos_ > 0) { assert(bw->buf_ != NULL); memcpy(new_buf, bw->buf_, bw->pos_); } WebPSafeFree(bw->buf_); bw->buf_ = new_buf; bw->max_pos_ = new_size; return 1; } static void Flush(VP8BitWriter* const bw) { const int s = 8 + bw->nb_bits_; const int32_t bits = bw->value_ >> s; assert(bw->nb_bits_ >= 0); bw->value_ -= bits << s; bw->nb_bits_ -= 8; if ((bits & 0xff) != 0xff) { size_t pos = bw->pos_; if (!BitWriterResize(bw, bw->run_ + 1)) { return; } if (bits & 0x100) { // overflow -> propagate carry over pending 0xff's if (pos > 0) bw->buf_[pos - 1]++; } if (bw->run_ > 0) { const int value = (bits & 0x100) ? 0x00 : 0xff; for (; bw->run_ > 0; --bw->run_) bw->buf_[pos++] = value; } bw->buf_[pos++] = bits & 0xff; bw->pos_ = pos; } else { bw->run_++; // delay writing of bytes 0xff, pending eventual carry. } } //------------------------------------------------------------------------------ // renormalization static const uint8_t kNorm[128] = { // renorm_sizes[i] = 8 - log2(i) 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }; // range = ((range + 1) << kVP8Log2Range[range]) - 1 static const uint8_t kNewRange[128] = { 127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127 }; int VP8PutBit(VP8BitWriter* const bw, int bit, int prob) { const int split = (bw->range_ * prob) >> 8; if (bit) { bw->value_ += split + 1; bw->range_ -= split + 1; } else { bw->range_ = split; } if (bw->range_ < 127) { // emit 'shift' bits out and renormalize const int shift = kNorm[bw->range_]; bw->range_ = kNewRange[bw->range_]; bw->value_ <<= shift; bw->nb_bits_ += shift; if (bw->nb_bits_ > 0) Flush(bw); } return bit; } int VP8PutBitUniform(VP8BitWriter* const bw, int bit) { const int split = bw->range_ >> 1; if (bit) { bw->value_ += split + 1; bw->range_ -= split + 1; } else { bw->range_ = split; } if (bw->range_ < 127) { bw->range_ = kNewRange[bw->range_]; bw->value_ <<= 1; bw->nb_bits_ += 1; if (bw->nb_bits_ > 0) Flush(bw); } return bit; } void VP8PutBits(VP8BitWriter* const bw, uint32_t value, int nb_bits) { uint32_t mask; assert(nb_bits > 0 && nb_bits < 32); for (mask = 1u << (nb_bits - 1); mask; mask >>= 1) { VP8PutBitUniform(bw, value & mask); } } void VP8PutSignedBits(VP8BitWriter* const bw, int value, int nb_bits) { if (!VP8PutBitUniform(bw, value != 0)) return; if (value < 0) { VP8PutBits(bw, ((-value) << 1) | 1, nb_bits + 1); } else { VP8PutBits(bw, value << 1, nb_bits + 1); } } //------------------------------------------------------------------------------ int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size) { bw->range_ = 255 - 1; bw->value_ = 0; bw->run_ = 0; bw->nb_bits_ = -8; bw->pos_ = 0; bw->max_pos_ = 0; bw->error_ = 0; bw->buf_ = NULL; return (expected_size > 0) ? BitWriterResize(bw, expected_size) : 1; } uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw) { VP8PutBits(bw, 0, 9 - bw->nb_bits_); bw->nb_bits_ = 0; // pad with zeroes Flush(bw); return bw->buf_; } int VP8BitWriterAppend(VP8BitWriter* const bw, const uint8_t* data, size_t size) { assert(data != NULL); if (bw->nb_bits_ != -8) return 0; // Flush() must have been called if (!BitWriterResize(bw, size)) return 0; memcpy(bw->buf_ + bw->pos_, data, size); bw->pos_ += size; return 1; } void VP8BitWriterWipeOut(VP8BitWriter* const bw) { if (bw != NULL) { WebPSafeFree(bw->buf_); memset(bw, 0, sizeof(*bw)); } } //------------------------------------------------------------------------------ // VP8LBitWriter // This is the minimum amount of size the memory buffer is guaranteed to grow // when extra space is needed. #define MIN_EXTRA_SIZE (32768ULL) // Returns 1 on success. static int VP8LBitWriterResize(VP8LBitWriter* const bw, size_t extra_size) { uint8_t* allocated_buf; size_t allocated_size; const size_t max_bytes = bw->end_ - bw->buf_; const size_t current_size = bw->cur_ - bw->buf_; const uint64_t size_required_64b = (uint64_t)current_size + extra_size; const size_t size_required = (size_t)size_required_64b; if (size_required != size_required_64b) { bw->error_ = 1; return 0; } if (max_bytes > 0 && size_required <= max_bytes) return 1; allocated_size = (3 * max_bytes) >> 1; if (allocated_size < size_required) allocated_size = size_required; // make allocated size multiple of 1k allocated_size = (((allocated_size >> 10) + 1) << 10); allocated_buf = (uint8_t*)WebPSafeMalloc(1ULL, allocated_size); if (allocated_buf == NULL) { bw->error_ = 1; return 0; } if (current_size > 0) { memcpy(allocated_buf, bw->buf_, current_size); } WebPSafeFree(bw->buf_); bw->buf_ = allocated_buf; bw->cur_ = bw->buf_ + current_size; bw->end_ = bw->buf_ + allocated_size; return 1; } int VP8LBitWriterInit(VP8LBitWriter* const bw, size_t expected_size) { memset(bw, 0, sizeof(*bw)); return VP8LBitWriterResize(bw, expected_size); } int VP8LBitWriterClone(const VP8LBitWriter* const src, VP8LBitWriter* const dst) { const size_t current_size = src->cur_ - src->buf_; assert(src->cur_ >= src->buf_ && src->cur_ <= src->end_); if (!VP8LBitWriterResize(dst, current_size)) return 0; memcpy(dst->buf_, src->buf_, current_size); dst->bits_ = src->bits_; dst->used_ = src->used_; dst->error_ = src->error_; dst->cur_ = dst->buf_ + current_size; return 1; } void VP8LBitWriterWipeOut(VP8LBitWriter* const bw) { if (bw != NULL) { WebPSafeFree(bw->buf_); memset(bw, 0, sizeof(*bw)); } } void VP8LBitWriterReset(const VP8LBitWriter* const bw_init, VP8LBitWriter* const bw) { bw->bits_ = bw_init->bits_; bw->used_ = bw_init->used_; bw->cur_ = bw->buf_ + (bw_init->cur_ - bw_init->buf_); assert(bw->cur_ <= bw->end_); bw->error_ = bw_init->error_; } void VP8LBitWriterSwap(VP8LBitWriter* const src, VP8LBitWriter* const dst) { const VP8LBitWriter tmp = *src; *src = *dst; *dst = tmp; } void VP8LPutBitsFlushBits(VP8LBitWriter* const bw) { // If needed, make some room by flushing some bits out. if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) { const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE; if (!CheckSizeOverflow(extra_size) || !VP8LBitWriterResize(bw, (size_t)extra_size)) { bw->cur_ = bw->buf_; bw->error_ = 1; return; } } *(vp8l_wtype_t*)bw->cur_ = (vp8l_wtype_t)WSWAP((vp8l_wtype_t)bw->bits_); bw->cur_ += VP8L_WRITER_BYTES; bw->bits_ >>= VP8L_WRITER_BITS; bw->used_ -= VP8L_WRITER_BITS; } void VP8LPutBitsInternal(VP8LBitWriter* const bw, uint32_t bits, int n_bits) { assert(n_bits <= 32); // That's the max we can handle: assert(sizeof(vp8l_wtype_t) == 2); if (n_bits > 0) { vp8l_atype_t lbits = bw->bits_; int used = bw->used_; // Special case of overflow handling for 32bit accumulator (2-steps flush). #if VP8L_WRITER_BITS == 16 if (used + n_bits >= VP8L_WRITER_MAX_BITS) { // Fill up all the VP8L_WRITER_MAX_BITS so it can be flushed out below. const int shift = VP8L_WRITER_MAX_BITS - used; lbits |= (vp8l_atype_t)bits << used; used = VP8L_WRITER_MAX_BITS; n_bits -= shift; bits >>= shift; assert(n_bits <= VP8L_WRITER_MAX_BITS); } #endif // If needed, make some room by flushing some bits out. while (used >= VP8L_WRITER_BITS) { if (bw->cur_ + VP8L_WRITER_BYTES > bw->end_) { const uint64_t extra_size = (bw->end_ - bw->buf_) + MIN_EXTRA_SIZE; if (!CheckSizeOverflow(extra_size) || !VP8LBitWriterResize(bw, (size_t)extra_size)) { bw->cur_ = bw->buf_; bw->error_ = 1; return; } } *(vp8l_wtype_t*)bw->cur_ = (vp8l_wtype_t)WSWAP((vp8l_wtype_t)lbits); bw->cur_ += VP8L_WRITER_BYTES; lbits >>= VP8L_WRITER_BITS; used -= VP8L_WRITER_BITS; } bw->bits_ = lbits | ((vp8l_atype_t)bits << used); bw->used_ = used + n_bits; } } uint8_t* VP8LBitWriterFinish(VP8LBitWriter* const bw) { // flush leftover bits if (VP8LBitWriterResize(bw, (bw->used_ + 7) >> 3)) { while (bw->used_ > 0) { *bw->cur_++ = (uint8_t)bw->bits_; bw->bits_ >>= 8; bw->used_ -= 8; } bw->used_ = 0; } return bw->buf_; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/bit_reader_inl_utils.h0000644000014400001440000001340614606317060016341 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Specific inlined methods for boolean decoder [VP8GetBit() ...] // This file should be included by the .c sources that actually need to call // these methods. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_UTILS_BIT_READER_INL_UTILS_H_ #define WEBP_UTILS_BIT_READER_INL_UTILS_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include // for memcpy #include "src/dsp/dsp.h" #include "src/utils/bit_reader_utils.h" #include "src/utils/endian_inl_utils.h" #include "src/utils/utils.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Derived type lbit_t = natural type for memory I/O #if (BITS > 32) typedef uint64_t lbit_t; #elif (BITS > 16) typedef uint32_t lbit_t; #elif (BITS > 8) typedef uint16_t lbit_t; #else typedef uint8_t lbit_t; #endif extern const uint8_t kVP8Log2Range[128]; extern const uint8_t kVP8NewRange[128]; // special case for the tail byte-reading void VP8LoadFinalBytes(VP8BitReader* const br); //------------------------------------------------------------------------------ // Inlined critical functions // makes sure br->value_ has at least BITS bits worth of data static WEBP_UBSAN_IGNORE_UNDEF WEBP_INLINE void VP8LoadNewBytes(VP8BitReader* WEBP_RESTRICT const br) { assert(br != NULL && br->buf_ != NULL); // Read 'BITS' bits at a time if possible. if (br->buf_ < br->buf_max_) { // convert memory type to register type (with some zero'ing!) bit_t bits; #if defined(WEBP_USE_MIPS32) // This is needed because of un-aligned read. lbit_t in_bits; lbit_t* p_buf_ = (lbit_t*)br->buf_; __asm__ volatile( ".set push \n\t" ".set at \n\t" ".set macro \n\t" "ulw %[in_bits], 0(%[p_buf_]) \n\t" ".set pop \n\t" : [in_bits]"=r"(in_bits) : [p_buf_]"r"(p_buf_) : "memory", "at" ); #else lbit_t in_bits; memcpy(&in_bits, br->buf_, sizeof(in_bits)); #endif br->buf_ += BITS >> 3; #if !defined(WORDS_BIGENDIAN) #if (BITS > 32) bits = BSwap64(in_bits); bits >>= 64 - BITS; #elif (BITS >= 24) bits = BSwap32(in_bits); bits >>= (32 - BITS); #elif (BITS == 16) bits = BSwap16(in_bits); #else // BITS == 8 bits = (bit_t)in_bits; #endif // BITS > 32 #else // WORDS_BIGENDIAN bits = (bit_t)in_bits; if (BITS != 8 * sizeof(bit_t)) bits >>= (8 * sizeof(bit_t) - BITS); #endif br->value_ = bits | (br->value_ << BITS); br->bits_ += BITS; } else { VP8LoadFinalBytes(br); // no need to be inlined } } // Read a bit with proba 'prob'. Speed-critical function! static WEBP_INLINE int VP8GetBit(VP8BitReader* WEBP_RESTRICT const br, int prob, const char label[]) { // Don't move this declaration! It makes a big speed difference to store // 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't // alter br->range_ value. range_t range = br->range_; if (br->bits_ < 0) { VP8LoadNewBytes(br); } { const int pos = br->bits_; const range_t split = (range * prob) >> 8; const range_t value = (range_t)(br->value_ >> pos); const int bit = (value > split); if (bit) { range -= split; br->value_ -= (bit_t)(split + 1) << pos; } else { range = split + 1; } { const int shift = 7 ^ BitsLog2Floor(range); range <<= shift; br->bits_ -= shift; } br->range_ = range - 1; BT_TRACK(br); return bit; } } // simplified version of VP8GetBit() for prob=0x80 (note shift is always 1 here) static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE int VP8GetSigned(VP8BitReader* WEBP_RESTRICT const br, int v, const char label[]) { if (br->bits_ < 0) { VP8LoadNewBytes(br); } { const int pos = br->bits_; const range_t split = br->range_ >> 1; const range_t value = (range_t)(br->value_ >> pos); const int32_t mask = (int32_t)(split - value) >> 31; // -1 or 0 br->bits_ -= 1; br->range_ += (range_t)mask; br->range_ |= 1; br->value_ -= (bit_t)((split + 1) & (uint32_t)mask) << pos; BT_TRACK(br); return (v ^ mask) - mask; } } static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* WEBP_RESTRICT const br, int prob, const char label[]) { // Don't move this declaration! It makes a big speed difference to store // 'range' *before* calling VP8LoadNewBytes(), even if this function doesn't // alter br->range_ value. range_t range = br->range_; if (br->bits_ < 0) { VP8LoadNewBytes(br); } { const int pos = br->bits_; const range_t split = (range * prob) >> 8; const range_t value = (range_t)(br->value_ >> pos); int bit; // Don't use 'const int bit = (value > split);", it's slower. if (value > split) { range -= split + 1; br->value_ -= (bit_t)(split + 1) << pos; bit = 1; } else { range = split; bit = 0; } if (range <= (range_t)0x7e) { const int shift = kVP8Log2Range[range]; range = kVP8NewRange[range]; br->bits_ -= shift; } br->range_ = range; BT_TRACK(br); return bit; } } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_ libwebp-1.4.0/src/utils/random_utils.h0000644000014400001440000000411514606317060014654 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Pseudo-random utilities // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_UTILS_RANDOM_UTILS_H_ #define WEBP_UTILS_RANDOM_UTILS_H_ #include #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif #define VP8_RANDOM_DITHER_FIX 8 // fixed-point precision for dithering #define VP8_RANDOM_TABLE_SIZE 55 typedef struct { int index1_, index2_; uint32_t tab_[VP8_RANDOM_TABLE_SIZE]; int amp_; } VP8Random; // Initializes random generator with an amplitude 'dithering' in range [0..1]. void VP8InitRandom(VP8Random* const rg, float dithering); // Returns a centered pseudo-random number with 'num_bits' amplitude. // (uses D.Knuth's Difference-based random generator). // 'amp' is in VP8_RANDOM_DITHER_FIX fixed-point precision. static WEBP_INLINE int VP8RandomBits2(VP8Random* const rg, int num_bits, int amp) { int diff; assert(num_bits + VP8_RANDOM_DITHER_FIX <= 31); diff = rg->tab_[rg->index1_] - rg->tab_[rg->index2_]; if (diff < 0) diff += (1u << 31); rg->tab_[rg->index1_] = diff; if (++rg->index1_ == VP8_RANDOM_TABLE_SIZE) rg->index1_ = 0; if (++rg->index2_ == VP8_RANDOM_TABLE_SIZE) rg->index2_ = 0; // sign-extend, 0-center diff = (int)((uint32_t)diff << 1) >> (32 - num_bits); diff = (diff * amp) >> VP8_RANDOM_DITHER_FIX; // restrict range diff += 1 << (num_bits - 1); // shift back to 0.5-center return diff; } static WEBP_INLINE int VP8RandomBits(VP8Random* const rg, int num_bits) { return VP8RandomBits2(rg, num_bits, rg->amp_); } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_RANDOM_UTILS_H_ libwebp-1.4.0/src/utils/huffman_utils.c0000644000014400001440000002454314606317060015022 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for building and looking up Huffman trees. // // Author: Urvang Joshi (urvang@google.com) #include #include #include #include "src/utils/huffman_utils.h" #include "src/utils/utils.h" #include "src/webp/format_constants.h" // Huffman data read via DecodeImageStream is represented in two (red and green) // bytes. #define MAX_HTREE_GROUPS 0x10000 HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups) { HTreeGroup* const htree_groups = (HTreeGroup*)WebPSafeMalloc(num_htree_groups, sizeof(*htree_groups)); if (htree_groups == NULL) { return NULL; } assert(num_htree_groups <= MAX_HTREE_GROUPS); return htree_groups; } void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups) { if (htree_groups != NULL) { WebPSafeFree(htree_groups); } } // Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the // bit-wise reversal of the len least significant bits of key. static WEBP_INLINE uint32_t GetNextKey(uint32_t key, int len) { uint32_t step = 1 << (len - 1); while (key & step) { step >>= 1; } return step ? (key & (step - 1)) + step : key; } // Stores code in table[0], table[step], table[2*step], ..., table[end]. // Assumes that end is an integer multiple of step. static WEBP_INLINE void ReplicateValue(HuffmanCode* table, int step, int end, HuffmanCode code) { assert(end % step == 0); do { end -= step; table[end] = code; } while (end > 0); } // Returns the table width of the next 2nd level table. count is the histogram // of bit lengths for the remaining symbols, len is the code length of the next // processed symbol static WEBP_INLINE int NextTableBitSize(const int* const count, int len, int root_bits) { int left = 1 << (len - root_bits); while (len < MAX_ALLOWED_CODE_LENGTH) { left -= count[len]; if (left <= 0) break; ++len; left <<= 1; } return len - root_bits; } // sorted[code_lengths_size] is a pre-allocated array for sorting symbols // by code length. static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits, const int code_lengths[], int code_lengths_size, uint16_t sorted[]) { HuffmanCode* table = root_table; // next available space in table int total_size = 1 << root_bits; // total size root table + 2nd level table int len; // current code length int symbol; // symbol index in original or sorted table // number of codes of each length: int count[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 }; // offsets in sorted table for each length: int offset[MAX_ALLOWED_CODE_LENGTH + 1]; assert(code_lengths_size != 0); assert(code_lengths != NULL); assert((root_table != NULL && sorted != NULL) || (root_table == NULL && sorted == NULL)); assert(root_bits > 0); // Build histogram of code lengths. for (symbol = 0; symbol < code_lengths_size; ++symbol) { if (code_lengths[symbol] > MAX_ALLOWED_CODE_LENGTH) { return 0; } ++count[code_lengths[symbol]]; } // Error, all code lengths are zeros. if (count[0] == code_lengths_size) { return 0; } // Generate offsets into sorted symbol table by code length. offset[1] = 0; for (len = 1; len < MAX_ALLOWED_CODE_LENGTH; ++len) { if (count[len] > (1 << len)) { return 0; } offset[len + 1] = offset[len] + count[len]; } // Sort symbols by length, by symbol order within each length. for (symbol = 0; symbol < code_lengths_size; ++symbol) { const int symbol_code_length = code_lengths[symbol]; if (code_lengths[symbol] > 0) { if (sorted != NULL) { if(offset[symbol_code_length] >= code_lengths_size) { return 0; } sorted[offset[symbol_code_length]++] = symbol; } else { offset[symbol_code_length]++; } } } // Special case code with only one value. if (offset[MAX_ALLOWED_CODE_LENGTH] == 1) { if (sorted != NULL) { HuffmanCode code; code.bits = 0; code.value = (uint16_t)sorted[0]; ReplicateValue(table, 1, total_size, code); } return total_size; } { int step; // step size to replicate values in current table uint32_t low = 0xffffffffu; // low bits for current root entry uint32_t mask = total_size - 1; // mask for low bits uint32_t key = 0; // reversed prefix code int num_nodes = 1; // number of Huffman tree nodes int num_open = 1; // number of open branches in current tree level int table_bits = root_bits; // key length of current table int table_size = 1 << table_bits; // size of current table symbol = 0; // Fill in root table. for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) { num_open <<= 1; num_nodes += num_open; num_open -= count[len]; if (num_open < 0) { return 0; } if (root_table == NULL) continue; for (; count[len] > 0; --count[len]) { HuffmanCode code; code.bits = (uint8_t)len; code.value = (uint16_t)sorted[symbol++]; ReplicateValue(&table[key], step, table_size, code); key = GetNextKey(key, len); } } // Fill in 2nd level tables and add pointers to root table. for (len = root_bits + 1, step = 2; len <= MAX_ALLOWED_CODE_LENGTH; ++len, step <<= 1) { num_open <<= 1; num_nodes += num_open; num_open -= count[len]; if (num_open < 0) { return 0; } for (; count[len] > 0; --count[len]) { HuffmanCode code; if ((key & mask) != low) { if (root_table != NULL) table += table_size; table_bits = NextTableBitSize(count, len, root_bits); table_size = 1 << table_bits; total_size += table_size; low = key & mask; if (root_table != NULL) { root_table[low].bits = (uint8_t)(table_bits + root_bits); root_table[low].value = (uint16_t)((table - root_table) - low); } } if (root_table != NULL) { code.bits = (uint8_t)(len - root_bits); code.value = (uint16_t)sorted[symbol++]; ReplicateValue(&table[key >> root_bits], step, table_size, code); } key = GetNextKey(key, len); } } // Check if tree is full. if (num_nodes != 2 * offset[MAX_ALLOWED_CODE_LENGTH] - 1) { return 0; } } return total_size; } // Maximum code_lengths_size is 2328 (reached for 11-bit color_cache_bits). // More commonly, the value is around ~280. #define MAX_CODE_LENGTHS_SIZE \ ((1 << MAX_CACHE_BITS) + NUM_LITERAL_CODES + NUM_LENGTH_CODES) // Cut-off value for switching between heap and stack allocation. #define SORTED_SIZE_CUTOFF 512 int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits, const int code_lengths[], int code_lengths_size) { const int total_size = BuildHuffmanTable(NULL, root_bits, code_lengths, code_lengths_size, NULL); assert(code_lengths_size <= MAX_CODE_LENGTHS_SIZE); if (total_size == 0 || root_table == NULL) return total_size; if (root_table->curr_segment->curr_table + total_size >= root_table->curr_segment->start + root_table->curr_segment->size) { // If 'root_table' does not have enough memory, allocate a new segment. // The available part of root_table->curr_segment is left unused because we // need a contiguous buffer. const int segment_size = root_table->curr_segment->size; struct HuffmanTablesSegment* next = (HuffmanTablesSegment*)WebPSafeMalloc(1, sizeof(*next)); if (next == NULL) return 0; // Fill the new segment. // We need at least 'total_size' but if that value is small, it is better to // allocate a big chunk to prevent more allocations later. 'segment_size' is // therefore chosen (any other arbitrary value could be chosen). next->size = total_size > segment_size ? total_size : segment_size; next->start = (HuffmanCode*)WebPSafeMalloc(next->size, sizeof(*next->start)); if (next->start == NULL) { WebPSafeFree(next); return 0; } next->curr_table = next->start; next->next = NULL; // Point to the new segment. root_table->curr_segment->next = next; root_table->curr_segment = next; } if (code_lengths_size <= SORTED_SIZE_CUTOFF) { // use local stack-allocated array. uint16_t sorted[SORTED_SIZE_CUTOFF]; BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits, code_lengths, code_lengths_size, sorted); } else { // rare case. Use heap allocation. uint16_t* const sorted = (uint16_t*)WebPSafeMalloc(code_lengths_size, sizeof(*sorted)); if (sorted == NULL) return 0; BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits, code_lengths, code_lengths_size, sorted); WebPSafeFree(sorted); } return total_size; } int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables) { // Have 'segment' point to the first segment for now, 'root'. HuffmanTablesSegment* const root = &huffman_tables->root; huffman_tables->curr_segment = root; root->next = NULL; // Allocate root. root->start = (HuffmanCode*)WebPSafeMalloc(size, sizeof(*root->start)); if (root->start == NULL) return 0; root->curr_table = root->start; root->size = size; return 1; } void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables) { HuffmanTablesSegment *current, *next; if (huffman_tables == NULL) return; // Free the root node. current = &huffman_tables->root; next = current->next; WebPSafeFree(current->start); current->start = NULL; current->next = NULL; current = next; // Free the following nodes. while (current != NULL) { next = current->next; WebPSafeFree(current->start); WebPSafeFree(current); current = next; } } libwebp-1.4.0/src/utils/filters_utils.h0000644000014400001440000000173214606317060015046 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Spatial prediction using various filters // // Author: Urvang (urvang@google.com) #ifndef WEBP_UTILS_FILTERS_UTILS_H_ #define WEBP_UTILS_FILTERS_UTILS_H_ #include "src/webp/types.h" #include "src/dsp/dsp.h" #ifdef __cplusplus extern "C" { #endif // Fast estimate of a potentially good filter. WEBP_FILTER_TYPE WebPEstimateBestFilter(const uint8_t* data, int width, int height, int stride); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_FILTERS_UTILS_H_ libwebp-1.4.0/src/utils/endian_inl_utils.h0000644000014400001440000000544314606317060015501 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Endian related functions. #ifndef WEBP_UTILS_ENDIAN_INL_UTILS_H_ #define WEBP_UTILS_ENDIAN_INL_UTILS_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/dsp/dsp.h" #include "src/webp/types.h" #if defined(WORDS_BIGENDIAN) #define HToLE32 BSwap32 #define HToLE16 BSwap16 #else #define HToLE32(x) (x) #define HToLE16(x) (x) #endif #if !defined(HAVE_CONFIG_H) #if LOCAL_GCC_PREREQ(4,8) || __has_builtin(__builtin_bswap16) #define HAVE_BUILTIN_BSWAP16 #endif #if LOCAL_GCC_PREREQ(4,3) || __has_builtin(__builtin_bswap32) #define HAVE_BUILTIN_BSWAP32 #endif #if LOCAL_GCC_PREREQ(4,3) || __has_builtin(__builtin_bswap64) #define HAVE_BUILTIN_BSWAP64 #endif #endif // !HAVE_CONFIG_H static WEBP_INLINE uint16_t BSwap16(uint16_t x) { #if defined(HAVE_BUILTIN_BSWAP16) return __builtin_bswap16(x); #elif defined(_MSC_VER) return _byteswap_ushort(x); #else // gcc will recognize a 'rorw $8, ...' here: return (x >> 8) | ((x & 0xff) << 8); #endif // HAVE_BUILTIN_BSWAP16 } static WEBP_INLINE uint32_t BSwap32(uint32_t x) { #if defined(WEBP_USE_MIPS32_R2) uint32_t ret; __asm__ volatile ( "wsbh %[ret], %[x] \n\t" "rotr %[ret], %[ret], 16 \n\t" : [ret]"=r"(ret) : [x]"r"(x) ); return ret; #elif defined(HAVE_BUILTIN_BSWAP32) return __builtin_bswap32(x); #elif defined(__i386__) || defined(__x86_64__) uint32_t swapped_bytes; __asm__ volatile("bswap %0" : "=r"(swapped_bytes) : "0"(x)); return swapped_bytes; #elif defined(_MSC_VER) return (uint32_t)_byteswap_ulong(x); #else return (x >> 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x << 24); #endif // HAVE_BUILTIN_BSWAP32 } static WEBP_INLINE uint64_t BSwap64(uint64_t x) { #if defined(HAVE_BUILTIN_BSWAP64) return __builtin_bswap64(x); #elif defined(__x86_64__) uint64_t swapped_bytes; __asm__ volatile("bswapq %0" : "=r"(swapped_bytes) : "0"(x)); return swapped_bytes; #elif defined(_MSC_VER) return (uint64_t)_byteswap_uint64(x); #else // generic code for swapping 64-bit values (suggested by bdb@) x = ((x & 0xffffffff00000000ull) >> 32) | ((x & 0x00000000ffffffffull) << 32); x = ((x & 0xffff0000ffff0000ull) >> 16) | ((x & 0x0000ffff0000ffffull) << 16); x = ((x & 0xff00ff00ff00ff00ull) >> 8) | ((x & 0x00ff00ff00ff00ffull) << 8); return x; #endif // HAVE_BUILTIN_BSWAP64 } #endif // WEBP_UTILS_ENDIAN_INL_UTILS_H_ libwebp-1.4.0/src/utils/filters_utils.c0000644000014400001440000000474614606317060015051 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // filter estimation // // Author: Urvang (urvang@google.com) #include "src/utils/filters_utils.h" #include #include // ----------------------------------------------------------------------------- // Quick estimate of a potentially interesting filter mode to try. #define SMAX 16 #define SDIFF(a, b) (abs((a) - (b)) >> 4) // Scoring diff, in [0..SMAX) static WEBP_INLINE int GradientPredictor(uint8_t a, uint8_t b, uint8_t c) { const int g = a + b - c; return ((g & ~0xff) == 0) ? g : (g < 0) ? 0 : 255; // clip to 8bit } WEBP_FILTER_TYPE WebPEstimateBestFilter(const uint8_t* data, int width, int height, int stride) { int i, j; int bins[WEBP_FILTER_LAST][SMAX]; memset(bins, 0, sizeof(bins)); // We only sample every other pixels. That's enough. for (j = 2; j < height - 1; j += 2) { const uint8_t* const p = data + j * stride; int mean = p[0]; for (i = 2; i < width - 1; i += 2) { const int diff0 = SDIFF(p[i], mean); const int diff1 = SDIFF(p[i], p[i - 1]); const int diff2 = SDIFF(p[i], p[i - width]); const int grad_pred = GradientPredictor(p[i - 1], p[i - width], p[i - width - 1]); const int diff3 = SDIFF(p[i], grad_pred); bins[WEBP_FILTER_NONE][diff0] = 1; bins[WEBP_FILTER_HORIZONTAL][diff1] = 1; bins[WEBP_FILTER_VERTICAL][diff2] = 1; bins[WEBP_FILTER_GRADIENT][diff3] = 1; mean = (3 * mean + p[i] + 2) >> 2; } } { int filter; WEBP_FILTER_TYPE best_filter = WEBP_FILTER_NONE; int best_score = 0x7fffffff; for (filter = WEBP_FILTER_NONE; filter < WEBP_FILTER_LAST; ++filter) { int score = 0; for (i = 0; i < SMAX; ++i) { if (bins[filter][i] > 0) { score += i; } } if (score < best_score) { best_score = score; best_filter = (WEBP_FILTER_TYPE)filter; } } return best_filter; } } #undef SMAX #undef SDIFF //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/rescaler_utils.c0000644000014400001440000001343414606317060015173 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Rescaling functions // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include #include "src/dsp/dsp.h" #include "src/utils/rescaler_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ int WebPRescalerInit(WebPRescaler* const rescaler, int src_width, int src_height, uint8_t* const dst, int dst_width, int dst_height, int dst_stride, int num_channels, rescaler_t* const work) { const int x_add = src_width, x_sub = dst_width; const int y_add = src_height, y_sub = dst_height; const uint64_t total_size = 2ull * dst_width * num_channels * sizeof(*work); if (!CheckSizeOverflow(total_size)) return 0; rescaler->x_expand = (src_width < dst_width); rescaler->y_expand = (src_height < dst_height); rescaler->src_width = src_width; rescaler->src_height = src_height; rescaler->dst_width = dst_width; rescaler->dst_height = dst_height; rescaler->src_y = 0; rescaler->dst_y = 0; rescaler->dst = dst; rescaler->dst_stride = dst_stride; rescaler->num_channels = num_channels; // for 'x_expand', we use bilinear interpolation rescaler->x_add = rescaler->x_expand ? (x_sub - 1) : x_add; rescaler->x_sub = rescaler->x_expand ? (x_add - 1) : x_sub; if (!rescaler->x_expand) { // fx_scale is not used otherwise rescaler->fx_scale = WEBP_RESCALER_FRAC(1, rescaler->x_sub); } // vertical scaling parameters rescaler->y_add = rescaler->y_expand ? y_add - 1 : y_add; rescaler->y_sub = rescaler->y_expand ? y_sub - 1 : y_sub; rescaler->y_accum = rescaler->y_expand ? rescaler->y_sub : rescaler->y_add; if (!rescaler->y_expand) { // This is WEBP_RESCALER_FRAC(dst_height, x_add * y_add) without the cast. // Its value is <= WEBP_RESCALER_ONE, because dst_height <= rescaler->y_add // and rescaler->x_add >= 1; const uint64_t num = (uint64_t)dst_height * WEBP_RESCALER_ONE; const uint64_t den = (uint64_t)rescaler->x_add * rescaler->y_add; const uint64_t ratio = num / den; if (ratio != (uint32_t)ratio) { // When ratio == WEBP_RESCALER_ONE, we can't represent the ratio with the // current fixed-point precision. This happens when src_height == // rescaler->y_add (which == src_height), and rescaler->x_add == 1. // => We special-case fxy_scale = 0, in WebPRescalerExportRow(). rescaler->fxy_scale = 0; } else { rescaler->fxy_scale = (uint32_t)ratio; } rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->y_sub); } else { rescaler->fy_scale = WEBP_RESCALER_FRAC(1, rescaler->x_add); // rescaler->fxy_scale is unused here. } rescaler->irow = work; rescaler->frow = work + num_channels * dst_width; memset(work, 0, (size_t)total_size); WebPRescalerDspInit(); return 1; } int WebPRescalerGetScaledDimensions(int src_width, int src_height, int* const scaled_width, int* const scaled_height) { assert(scaled_width != NULL); assert(scaled_height != NULL); { int width = *scaled_width; int height = *scaled_height; const int max_size = INT_MAX / 2; // if width is unspecified, scale original proportionally to height ratio. if (width == 0 && src_height > 0) { width = (int)(((uint64_t)src_width * height + src_height - 1) / src_height); } // if height is unspecified, scale original proportionally to width ratio. if (height == 0 && src_width > 0) { height = (int)(((uint64_t)src_height * width + src_width - 1) / src_width); } // Check if the overall dimensions still make sense. if (width <= 0 || height <= 0 || width > max_size || height > max_size) { return 0; } *scaled_width = width; *scaled_height = height; return 1; } } //------------------------------------------------------------------------------ // all-in-one calls int WebPRescaleNeededLines(const WebPRescaler* const rescaler, int max_num_lines) { const int num_lines = (rescaler->y_accum + rescaler->y_sub - 1) / rescaler->y_sub; return (num_lines > max_num_lines) ? max_num_lines : num_lines; } int WebPRescalerImport(WebPRescaler* const rescaler, int num_lines, const uint8_t* src, int src_stride) { int total_imported = 0; while (total_imported < num_lines && !WebPRescalerHasPendingOutput(rescaler)) { if (rescaler->y_expand) { rescaler_t* const tmp = rescaler->irow; rescaler->irow = rescaler->frow; rescaler->frow = tmp; } WebPRescalerImportRow(rescaler, src); if (!rescaler->y_expand) { // Accumulate the contribution of the new row. int x; for (x = 0; x < rescaler->num_channels * rescaler->dst_width; ++x) { rescaler->irow[x] += rescaler->frow[x]; } } ++rescaler->src_y; src += src_stride; ++total_imported; rescaler->y_accum -= rescaler->y_sub; } return total_imported; } int WebPRescalerExport(WebPRescaler* const rescaler) { int total_exported = 0; while (WebPRescalerHasPendingOutput(rescaler)) { WebPRescalerExportRow(rescaler); ++total_exported; } return total_exported; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/quant_levels_dec_utils.c0000644000014400001440000002166414606317060016714 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Implement gradient smoothing: we replace a current alpha value by its // surrounding average if it's close enough (that is: the change will be less // than the minimum distance between two quantized level). // We use sliding window for computing the 2d moving average. // // Author: Skal (pascal.massimino@gmail.com) #include "src/utils/quant_levels_dec_utils.h" #include // for memset #include "src/utils/utils.h" // #define USE_DITHERING // uncomment to enable ordered dithering (not vital) #define FIX 16 // fix-point precision for averaging #define LFIX 2 // extra precision for look-up table #define LUT_SIZE ((1 << (8 + LFIX)) - 1) // look-up table size #if defined(USE_DITHERING) #define DFIX 4 // extra precision for ordered dithering #define DSIZE 4 // dithering size (must be a power of two) // cf. https://en.wikipedia.org/wiki/Ordered_dithering static const uint8_t kOrderedDither[DSIZE][DSIZE] = { { 0, 8, 2, 10 }, // coefficients are in DFIX fixed-point precision { 12, 4, 14, 6 }, { 3, 11, 1, 9 }, { 15, 7, 13, 5 } }; #else #define DFIX 0 #endif typedef struct { int width_, height_; // dimension int stride_; // stride in bytes int row_; // current input row being processed uint8_t* src_; // input pointer uint8_t* dst_; // output pointer int radius_; // filter radius (=delay) int scale_; // normalization factor, in FIX bits precision void* mem_; // all memory // various scratch buffers uint16_t* start_; uint16_t* cur_; uint16_t* end_; uint16_t* top_; uint16_t* average_; // input levels distribution int num_levels_; // number of quantized levels int min_, max_; // min and max level values int min_level_dist_; // smallest distance between two consecutive levels int16_t* correction_; // size = 1 + 2*LUT_SIZE -> ~4k memory } SmoothParams; //------------------------------------------------------------------------------ #define CLIP_8b_MASK (int)(~0U << (8 + DFIX)) static WEBP_INLINE uint8_t clip_8b(int v) { return (!(v & CLIP_8b_MASK)) ? (uint8_t)(v >> DFIX) : (v < 0) ? 0u : 255u; } #undef CLIP_8b_MASK // vertical accumulation static void VFilter(SmoothParams* const p) { const uint8_t* src = p->src_; const int w = p->width_; uint16_t* const cur = p->cur_; const uint16_t* const top = p->top_; uint16_t* const out = p->end_; uint16_t sum = 0; // all arithmetic is modulo 16bit int x; for (x = 0; x < w; ++x) { uint16_t new_value; sum += src[x]; new_value = top[x] + sum; out[x] = new_value - cur[x]; // vertical sum of 'r' pixels. cur[x] = new_value; } // move input pointers one row down p->top_ = p->cur_; p->cur_ += w; if (p->cur_ == p->end_) p->cur_ = p->start_; // roll-over // We replicate edges, as it's somewhat easier as a boundary condition. // That's why we don't update the 'src' pointer on top/bottom area: if (p->row_ >= 0 && p->row_ < p->height_ - 1) { p->src_ += p->stride_; } } // horizontal accumulation. We use mirror replication of missing pixels, as it's // a little easier to implement (surprisingly). static void HFilter(SmoothParams* const p) { const uint16_t* const in = p->end_; uint16_t* const out = p->average_; const uint32_t scale = p->scale_; const int w = p->width_; const int r = p->radius_; int x; for (x = 0; x <= r; ++x) { // left mirroring const uint16_t delta = in[x + r - 1] + in[r - x]; out[x] = (delta * scale) >> FIX; } for (; x < w - r; ++x) { // bulk middle run const uint16_t delta = in[x + r] - in[x - r - 1]; out[x] = (delta * scale) >> FIX; } for (; x < w; ++x) { // right mirroring const uint16_t delta = 2 * in[w - 1] - in[2 * w - 2 - r - x] - in[x - r - 1]; out[x] = (delta * scale) >> FIX; } } // emit one filtered output row static void ApplyFilter(SmoothParams* const p) { const uint16_t* const average = p->average_; const int w = p->width_; const int16_t* const correction = p->correction_; #if defined(USE_DITHERING) const uint8_t* const dither = kOrderedDither[p->row_ % DSIZE]; #endif uint8_t* const dst = p->dst_; int x; for (x = 0; x < w; ++x) { const int v = dst[x]; if (v < p->max_ && v > p->min_) { const int c = (v << DFIX) + correction[average[x] - (v << LFIX)]; #if defined(USE_DITHERING) dst[x] = clip_8b(c + dither[x % DSIZE]); #else dst[x] = clip_8b(c); #endif } } p->dst_ += p->stride_; // advance output pointer } //------------------------------------------------------------------------------ // Initialize correction table static void InitCorrectionLUT(int16_t* const lut, int min_dist) { // The correction curve is: // f(x) = x for x <= threshold2 // f(x) = 0 for x >= threshold1 // and a linear interpolation for range x=[threshold2, threshold1] // (along with f(-x) = -f(x) symmetry). // Note that: threshold2 = 3/4 * threshold1 const int threshold1 = min_dist << LFIX; const int threshold2 = (3 * threshold1) >> 2; const int max_threshold = threshold2 << DFIX; const int delta = threshold1 - threshold2; int i; for (i = 1; i <= LUT_SIZE; ++i) { int c = (i <= threshold2) ? (i << DFIX) : (i < threshold1) ? max_threshold * (threshold1 - i) / delta : 0; c >>= LFIX; lut[+i] = +c; lut[-i] = -c; } lut[0] = 0; } static void CountLevels(SmoothParams* const p) { int i, j, last_level; uint8_t used_levels[256] = { 0 }; const uint8_t* data = p->src_; p->min_ = 255; p->max_ = 0; for (j = 0; j < p->height_; ++j) { for (i = 0; i < p->width_; ++i) { const int v = data[i]; if (v < p->min_) p->min_ = v; if (v > p->max_) p->max_ = v; used_levels[v] = 1; } data += p->stride_; } // Compute the mininum distance between two non-zero levels. p->min_level_dist_ = p->max_ - p->min_; last_level = -1; for (i = 0; i < 256; ++i) { if (used_levels[i]) { ++p->num_levels_; if (last_level >= 0) { const int level_dist = i - last_level; if (level_dist < p->min_level_dist_) { p->min_level_dist_ = level_dist; } } last_level = i; } } } // Initialize all params. static int InitParams(uint8_t* const data, int width, int height, int stride, int radius, SmoothParams* const p) { const int R = 2 * radius + 1; // total size of the kernel const size_t size_scratch_m = (R + 1) * width * sizeof(*p->start_); const size_t size_m = width * sizeof(*p->average_); const size_t size_lut = (1 + 2 * LUT_SIZE) * sizeof(*p->correction_); const size_t total_size = size_scratch_m + size_m + size_lut; uint8_t* mem = (uint8_t*)WebPSafeMalloc(1U, total_size); if (mem == NULL) return 0; p->mem_ = (void*)mem; p->start_ = (uint16_t*)mem; p->cur_ = p->start_; p->end_ = p->start_ + R * width; p->top_ = p->end_ - width; memset(p->top_, 0, width * sizeof(*p->top_)); mem += size_scratch_m; p->average_ = (uint16_t*)mem; mem += size_m; p->width_ = width; p->height_ = height; p->stride_ = stride; p->src_ = data; p->dst_ = data; p->radius_ = radius; p->scale_ = (1 << (FIX + LFIX)) / (R * R); // normalization constant p->row_ = -radius; // analyze the input distribution so we can best-fit the threshold CountLevels(p); // correction table p->correction_ = ((int16_t*)mem) + LUT_SIZE; InitCorrectionLUT(p->correction_, p->min_level_dist_); return 1; } static void CleanupParams(SmoothParams* const p) { WebPSafeFree(p->mem_); } int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride, int strength) { int radius = 4 * strength / 100; if (strength < 0 || strength > 100) return 0; if (data == NULL || width <= 0 || height <= 0) return 0; // bad params // limit the filter size to not exceed the image dimensions if (2 * radius + 1 > width) radius = (width - 1) >> 1; if (2 * radius + 1 > height) radius = (height - 1) >> 1; if (radius > 0) { SmoothParams p; memset(&p, 0, sizeof(p)); if (!InitParams(data, width, height, stride, radius, &p)) return 0; if (p.num_levels_ > 2) { for (; p.row_ < p.height_; ++p.row_) { VFilter(&p); // accumulate average of input // Need to wait few rows in order to prime the filter, // before emitting some output. if (p.row_ >= p.radius_) { HFilter(&p); ApplyFilter(&p); } } } CleanupParams(&p); } return 1; } libwebp-1.4.0/src/utils/thread_utils.h0000644000014400001440000000715214606317060014647 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Multi-threaded worker // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_UTILS_THREAD_UTILS_H_ #define WEBP_UTILS_THREAD_UTILS_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // State of the worker thread object typedef enum { NOT_OK = 0, // object is unusable OK, // ready to work WORK // busy finishing the current task } WebPWorkerStatus; // Function to be called by the worker thread. Takes two opaque pointers as // arguments (data1 and data2), and should return false in case of error. typedef int (*WebPWorkerHook)(void*, void*); // Synchronization object used to launch job in the worker thread typedef struct { void* impl_; // platform-dependent implementation worker details WebPWorkerStatus status_; WebPWorkerHook hook; // hook to call void* data1; // first argument passed to 'hook' void* data2; // second argument passed to 'hook' int had_error; // return value of the last call to 'hook' } WebPWorker; // The interface for all thread-worker related functions. All these functions // must be implemented. typedef struct { // Must be called first, before any other method. void (*Init)(WebPWorker* const worker); // Must be called to initialize the object and spawn the thread. Re-entrant. // Will potentially launch the thread. Returns false in case of error. int (*Reset)(WebPWorker* const worker); // Makes sure the previous work is finished. Returns true if worker->had_error // was not set and no error condition was triggered by the working thread. int (*Sync)(WebPWorker* const worker); // Triggers the thread to call hook() with data1 and data2 arguments. These // hook/data1/data2 values can be changed at any time before calling this // function, but not be changed afterward until the next call to Sync(). void (*Launch)(WebPWorker* const worker); // This function is similar to Launch() except that it calls the // hook directly instead of using a thread. Convenient to bypass the thread // mechanism while still using the WebPWorker structs. Sync() must // still be called afterward (for error reporting). void (*Execute)(WebPWorker* const worker); // Kill the thread and terminate the object. To use the object again, one // must call Reset() again. void (*End)(WebPWorker* const worker); } WebPWorkerInterface; // Install a new set of threading functions, overriding the defaults. This // should be done before any workers are started, i.e., before any encoding or // decoding takes place. The contents of the interface struct are copied, it // is safe to free the corresponding memory after this call. This function is // not thread-safe. Return false in case of invalid pointer or methods. WEBP_EXTERN int WebPSetWorkerInterface( const WebPWorkerInterface* const winterface); // Retrieve the currently set thread worker interface. WEBP_EXTERN const WebPWorkerInterface* WebPGetWorkerInterface(void); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_THREAD_UTILS_H_ libwebp-1.4.0/src/utils/utils.c0000644000014400001440000002123014606317060013304 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Misc. common utility functions // // Author: Skal (pascal.massimino@gmail.com) #include "src/utils/utils.h" #include #include // for memcpy() #include "src/utils/palette.h" #include "src/webp/encode.h" // If PRINT_MEM_INFO is defined, extra info (like total memory used, number of // alloc/free etc) is printed. For debugging/tuning purpose only (it's slow, // and not multi-thread safe!). // An interesting alternative is valgrind's 'massif' tool: // https://valgrind.org/docs/manual/ms-manual.html // Here is an example command line: /* valgrind --tool=massif --massif-out-file=massif.out \ --stacks=yes --alloc-fn=WebPSafeMalloc --alloc-fn=WebPSafeCalloc ms_print massif.out */ // In addition: // * if PRINT_MEM_TRAFFIC is defined, all the details of the malloc/free cycles // are printed. // * if MALLOC_FAIL_AT is defined, the global environment variable // $MALLOC_FAIL_AT is used to simulate a memory error when calloc or malloc // is called for the nth time. Example usage: // export MALLOC_FAIL_AT=50 && ./examples/cwebp input.png // * if MALLOC_LIMIT is defined, the global environment variable $MALLOC_LIMIT // sets the maximum amount of memory (in bytes) made available to libwebp. // This can be used to emulate environment with very limited memory. // Example: export MALLOC_LIMIT=64000000 && ./examples/dwebp picture.webp // #define PRINT_MEM_INFO // #define PRINT_MEM_TRAFFIC // #define MALLOC_FAIL_AT // #define MALLOC_LIMIT //------------------------------------------------------------------------------ // Checked memory allocation #if defined(PRINT_MEM_INFO) #include static int num_malloc_calls = 0; static int num_calloc_calls = 0; static int num_free_calls = 0; static int countdown_to_fail = 0; // 0 = off typedef struct MemBlock MemBlock; struct MemBlock { void* ptr_; size_t size_; MemBlock* next_; }; static MemBlock* all_blocks = NULL; static size_t total_mem = 0; static size_t total_mem_allocated = 0; static size_t high_water_mark = 0; static size_t mem_limit = 0; static int exit_registered = 0; static void PrintMemInfo(void) { fprintf(stderr, "\nMEMORY INFO:\n"); fprintf(stderr, "num calls to: malloc = %4d\n", num_malloc_calls); fprintf(stderr, " calloc = %4d\n", num_calloc_calls); fprintf(stderr, " free = %4d\n", num_free_calls); fprintf(stderr, "total_mem: %u\n", (uint32_t)total_mem); fprintf(stderr, "total_mem allocated: %u\n", (uint32_t)total_mem_allocated); fprintf(stderr, "high-water mark: %u\n", (uint32_t)high_water_mark); while (all_blocks != NULL) { MemBlock* b = all_blocks; all_blocks = b->next_; free(b); } } static void Increment(int* const v) { if (!exit_registered) { #if defined(MALLOC_FAIL_AT) { const char* const malloc_fail_at_str = getenv("MALLOC_FAIL_AT"); if (malloc_fail_at_str != NULL) { countdown_to_fail = atoi(malloc_fail_at_str); } } #endif #if defined(MALLOC_LIMIT) { const char* const malloc_limit_str = getenv("MALLOC_LIMIT"); #if MALLOC_LIMIT > 1 mem_limit = (size_t)MALLOC_LIMIT; #endif if (malloc_limit_str != NULL) { mem_limit = atoi(malloc_limit_str); } } #endif (void)countdown_to_fail; (void)mem_limit; atexit(PrintMemInfo); exit_registered = 1; } ++*v; } static void AddMem(void* ptr, size_t size) { if (ptr != NULL) { MemBlock* const b = (MemBlock*)malloc(sizeof(*b)); if (b == NULL) abort(); b->next_ = all_blocks; all_blocks = b; b->ptr_ = ptr; b->size_ = size; total_mem += size; total_mem_allocated += size; #if defined(PRINT_MEM_TRAFFIC) #if defined(MALLOC_FAIL_AT) fprintf(stderr, "fail-count: %5d [mem=%u]\n", num_malloc_calls + num_calloc_calls, (uint32_t)total_mem); #else fprintf(stderr, "Mem: %u (+%u)\n", (uint32_t)total_mem, (uint32_t)size); #endif #endif if (total_mem > high_water_mark) high_water_mark = total_mem; } } static void SubMem(void* ptr) { if (ptr != NULL) { MemBlock** b = &all_blocks; // Inefficient search, but that's just for debugging. while (*b != NULL && (*b)->ptr_ != ptr) b = &(*b)->next_; if (*b == NULL) { fprintf(stderr, "Invalid pointer free! (%p)\n", ptr); abort(); } { MemBlock* const block = *b; *b = block->next_; total_mem -= block->size_; #if defined(PRINT_MEM_TRAFFIC) fprintf(stderr, "Mem: %u (-%u)\n", (uint32_t)total_mem, (uint32_t)block->size_); #endif free(block); } } } #else #define Increment(v) do {} while (0) #define AddMem(p, s) do {} while (0) #define SubMem(p) do {} while (0) #endif // Returns 0 in case of overflow of nmemb * size. static int CheckSizeArgumentsOverflow(uint64_t nmemb, size_t size) { const uint64_t total_size = nmemb * size; if (nmemb == 0) return 1; if ((uint64_t)size > WEBP_MAX_ALLOCABLE_MEMORY / nmemb) return 0; if (!CheckSizeOverflow(total_size)) return 0; #if defined(PRINT_MEM_INFO) && defined(MALLOC_FAIL_AT) if (countdown_to_fail > 0 && --countdown_to_fail == 0) { return 0; // fake fail! } #endif #if defined(PRINT_MEM_INFO) && defined(MALLOC_LIMIT) if (mem_limit > 0) { const uint64_t new_total_mem = (uint64_t)total_mem + total_size; if (!CheckSizeOverflow(new_total_mem) || new_total_mem > mem_limit) { return 0; // fake fail! } } #endif return 1; } void* WebPSafeMalloc(uint64_t nmemb, size_t size) { void* ptr; Increment(&num_malloc_calls); if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; assert(nmemb * size > 0); ptr = malloc((size_t)(nmemb * size)); AddMem(ptr, (size_t)(nmemb * size)); return ptr; } void* WebPSafeCalloc(uint64_t nmemb, size_t size) { void* ptr; Increment(&num_calloc_calls); if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; assert(nmemb * size > 0); ptr = calloc((size_t)nmemb, size); AddMem(ptr, (size_t)(nmemb * size)); return ptr; } void WebPSafeFree(void* const ptr) { if (ptr != NULL) { Increment(&num_free_calls); SubMem(ptr); } free(ptr); } // Public API functions. void* WebPMalloc(size_t size) { return WebPSafeMalloc(1, size); } void WebPFree(void* ptr) { WebPSafeFree(ptr); } //------------------------------------------------------------------------------ void WebPCopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height) { assert(src != NULL && dst != NULL); assert(abs(src_stride) >= width && abs(dst_stride) >= width); while (height-- > 0) { memcpy(dst, src, width); src += src_stride; dst += dst_stride; } } void WebPCopyPixels(const WebPPicture* const src, WebPPicture* const dst) { assert(src != NULL && dst != NULL); assert(src->width == dst->width && src->height == dst->height); assert(src->use_argb && dst->use_argb); WebPCopyPlane((uint8_t*)src->argb, 4 * src->argb_stride, (uint8_t*)dst->argb, 4 * dst->argb_stride, 4 * src->width, src->height); } //------------------------------------------------------------------------------ int WebPGetColorPalette(const WebPPicture* const pic, uint32_t* const palette) { return GetColorPalette(pic, palette); } //------------------------------------------------------------------------------ #if defined(WEBP_NEED_LOG_TABLE_8BIT) const uint8_t WebPLogTable8bit[256] = { // 31 ^ clz(i) 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; #endif //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/Makefile.am0000644000014400001440000000304714606317060014042 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) noinst_LTLIBRARIES = libwebputils.la if BUILD_LIBWEBPDECODER noinst_LTLIBRARIES += libwebputilsdecode.la endif common_HEADERS = ../webp/types.h commondir = $(includedir)/webp noinst_HEADERS = noinst_HEADERS += ../dsp/cpu.h noinst_HEADERS += ../dsp/dsp.h noinst_HEADERS += ../webp/decode.h noinst_HEADERS += ../webp/encode.h noinst_HEADERS += ../webp/format_constants.h COMMON_SOURCES = COMMON_SOURCES += bit_reader_utils.c COMMON_SOURCES += bit_reader_utils.h COMMON_SOURCES += bit_reader_inl_utils.h COMMON_SOURCES += color_cache_utils.c COMMON_SOURCES += color_cache_utils.h COMMON_SOURCES += endian_inl_utils.h COMMON_SOURCES += filters_utils.c COMMON_SOURCES += filters_utils.h COMMON_SOURCES += huffman_utils.c COMMON_SOURCES += huffman_utils.h COMMON_SOURCES += palette.c COMMON_SOURCES += palette.h COMMON_SOURCES += quant_levels_dec_utils.c COMMON_SOURCES += quant_levels_dec_utils.h COMMON_SOURCES += rescaler_utils.c COMMON_SOURCES += rescaler_utils.h COMMON_SOURCES += random_utils.c COMMON_SOURCES += random_utils.h COMMON_SOURCES += thread_utils.c COMMON_SOURCES += thread_utils.h COMMON_SOURCES += utils.c COMMON_SOURCES += utils.h ENC_SOURCES = ENC_SOURCES += bit_writer_utils.c ENC_SOURCES += bit_writer_utils.h ENC_SOURCES += huffman_encode_utils.c ENC_SOURCES += huffman_encode_utils.h ENC_SOURCES += quant_levels_utils.c ENC_SOURCES += quant_levels_utils.h libwebputils_la_SOURCES = $(COMMON_SOURCES) $(ENC_SOURCES) if BUILD_LIBWEBPDECODER libwebputilsdecode_la_SOURCES = $(COMMON_SOURCES) endif libwebp-1.4.0/src/utils/random_utils.c0000644000014400001440000000346214606317060014653 0ustar // Copyright 2013 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Pseudo-random utilities // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/utils/random_utils.h" //------------------------------------------------------------------------------ // 31b-range values static const uint32_t kRandomTable[VP8_RANDOM_TABLE_SIZE] = { 0x0de15230, 0x03b31886, 0x775faccb, 0x1c88626a, 0x68385c55, 0x14b3b828, 0x4a85fef8, 0x49ddb84b, 0x64fcf397, 0x5c550289, 0x4a290000, 0x0d7ec1da, 0x5940b7ab, 0x5492577d, 0x4e19ca72, 0x38d38c69, 0x0c01ee65, 0x32a1755f, 0x5437f652, 0x5abb2c32, 0x0faa57b1, 0x73f533e7, 0x685feeda, 0x7563cce2, 0x6e990e83, 0x4730a7ed, 0x4fc0d9c6, 0x496b153c, 0x4f1403fa, 0x541afb0c, 0x73990b32, 0x26d7cb1c, 0x6fcc3706, 0x2cbb77d8, 0x75762f2a, 0x6425ccdd, 0x24b35461, 0x0a7d8715, 0x220414a8, 0x141ebf67, 0x56b41583, 0x73e502e3, 0x44cab16f, 0x28264d42, 0x73baaefb, 0x0a50ebed, 0x1d6ab6fb, 0x0d3ad40b, 0x35db3b68, 0x2b081e83, 0x77ce6b95, 0x5181e5f0, 0x78853bbc, 0x009f9494, 0x27e5ed3c }; void VP8InitRandom(VP8Random* const rg, float dithering) { memcpy(rg->tab_, kRandomTable, sizeof(rg->tab_)); rg->index1_ = 0; rg->index2_ = 31; rg->amp_ = (dithering < 0.0) ? 0 : (dithering > 1.0) ? (1 << VP8_RANDOM_DITHER_FIX) : (uint32_t)((1 << VP8_RANDOM_DITHER_FIX) * dithering); } //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/palette.h0000644000014400001440000000475214606317060013621 0ustar // Copyright 2023 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for palette analysis. // // Author: Vincent Rabaud (vrabaud@google.com) #ifndef WEBP_UTILS_PALETTE_H_ #define WEBP_UTILS_PALETTE_H_ #include "src/webp/types.h" struct WebPPicture; // The different ways a palette can be sorted. typedef enum PaletteSorting { kSortedDefault = 0, // Sorts by minimizing L1 deltas between consecutive colors, giving more // weight to RGB colors. kMinimizeDelta = 1, // Implements the modified Zeng method from "A Survey on Palette Reordering // Methods for Improving the Compression of Color-Indexed Images" by Armando // J. Pinho and Antonio J. R. Neves. kModifiedZeng = 2, kUnusedPalette = 3, kPaletteSortingNum = 4 } PaletteSorting; // Returns the index of 'color' in the sorted palette 'sorted' of size // 'num_colors'. int SearchColorNoIdx(const uint32_t sorted[], uint32_t color, int num_colors); // Sort palette in increasing order and prepare an inverse mapping array. void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors, uint32_t sorted[], uint32_t idx_map[]); // Returns count of unique colors in 'pic', assuming pic->use_argb is true. // If the unique color count is more than MAX_PALETTE_SIZE, returns // MAX_PALETTE_SIZE+1. // If 'palette' is not NULL and the number of unique colors is less than or // equal to MAX_PALETTE_SIZE, also outputs the actual unique colors into // 'palette' in a sorted order. Note: 'palette' is assumed to be an array // already allocated with at least MAX_PALETTE_SIZE elements. int GetColorPalette(const struct WebPPicture* const pic, uint32_t* const palette); // Sorts the palette according to the criterion defined by 'method'. // 'palette_sorted' is the input palette sorted lexicographically, as done in // PrepareMapToPalette. Returns 0 on memory allocation error. int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic, const uint32_t* const palette_sorted, uint32_t num_colors, uint32_t* const palette); #endif // WEBP_UTILS_PALETTE_H_ libwebp-1.4.0/src/utils/color_cache_utils.h0000644000014400001440000000552714606317060015645 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Color Cache for WebP Lossless // // Authors: Jyrki Alakuijala (jyrki@google.com) // Urvang Joshi (urvang@google.com) #ifndef WEBP_UTILS_COLOR_CACHE_UTILS_H_ #define WEBP_UTILS_COLOR_CACHE_UTILS_H_ #include #include "src/dsp/dsp.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Main color cache struct. typedef struct { uint32_t* colors_; // color entries int hash_shift_; // Hash shift: 32 - hash_bits_. int hash_bits_; } VP8LColorCache; static const uint32_t kHashMul = 0x1e35a7bdu; static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE int VP8LHashPix(uint32_t argb, int shift) { return (int)((argb * kHashMul) >> shift); } static WEBP_INLINE uint32_t VP8LColorCacheLookup( const VP8LColorCache* const cc, uint32_t key) { assert((key >> cc->hash_bits_) == 0u); return cc->colors_[key]; } static WEBP_INLINE void VP8LColorCacheSet(const VP8LColorCache* const cc, uint32_t key, uint32_t argb) { assert((key >> cc->hash_bits_) == 0u); cc->colors_[key] = argb; } static WEBP_INLINE void VP8LColorCacheInsert(const VP8LColorCache* const cc, uint32_t argb) { const int key = VP8LHashPix(argb, cc->hash_shift_); cc->colors_[key] = argb; } static WEBP_INLINE int VP8LColorCacheGetIndex(const VP8LColorCache* const cc, uint32_t argb) { return VP8LHashPix(argb, cc->hash_shift_); } // Return the key if cc contains argb, and -1 otherwise. static WEBP_INLINE int VP8LColorCacheContains(const VP8LColorCache* const cc, uint32_t argb) { const int key = VP8LHashPix(argb, cc->hash_shift_); return (cc->colors_[key] == argb) ? key : -1; } //------------------------------------------------------------------------------ // Initializes the color cache with 'hash_bits' bits for the keys. // Returns false in case of memory error. int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits); void VP8LColorCacheCopy(const VP8LColorCache* const src, VP8LColorCache* const dst); // Delete the memory associated to color cache. void VP8LColorCacheClear(VP8LColorCache* const color_cache); //------------------------------------------------------------------------------ #ifdef __cplusplus } #endif #endif // WEBP_UTILS_COLOR_CACHE_UTILS_H_ libwebp-1.4.0/src/utils/bit_reader_utils.h0000644000014400001440000001672714606317060015510 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Boolean decoder // // Author: Skal (pascal.massimino@gmail.com) // Vikas Arora (vikaas.arora@gmail.com) #ifndef WEBP_UTILS_BIT_READER_UTILS_H_ #define WEBP_UTILS_BIT_READER_UTILS_H_ #include #ifdef _MSC_VER #include // _byteswap_ulong #endif #include "src/dsp/cpu.h" #include "src/webp/types.h" // Warning! This macro triggers quite some MACRO wizardry around func signature! #if !defined(BITTRACE) #define BITTRACE 0 // 0 = off, 1 = print bits, 2 = print bytes #endif #if (BITTRACE > 0) struct VP8BitReader; extern void BitTrace(const struct VP8BitReader* const br, const char label[]); #define BT_TRACK(br) BitTrace(br, label) #define VP8Get(BR, L) VP8GetValue(BR, 1, L) #else #define BT_TRACK(br) // We'll REMOVE the 'const char label[]' from all signatures and calls (!!): #define VP8GetValue(BR, N, L) VP8GetValue(BR, N) #define VP8Get(BR, L) VP8GetValue(BR, 1, L) #define VP8GetSignedValue(BR, N, L) VP8GetSignedValue(BR, N) #define VP8GetBit(BR, P, L) VP8GetBit(BR, P) #define VP8GetBitAlt(BR, P, L) VP8GetBitAlt(BR, P) #define VP8GetSigned(BR, V, L) VP8GetSigned(BR, V) #endif #ifdef __cplusplus extern "C" { #endif // The Boolean decoder needs to maintain infinite precision on the value_ field. // However, since range_ is only 8bit, we only need an active window of 8 bits // for value_. Left bits (MSB) gets zeroed and shifted away when value_ falls // below 128, range_ is updated, and fresh bits read from the bitstream are // brought in as LSB. To avoid reading the fresh bits one by one (slow), we // cache BITS of them ahead. The total of (BITS + 8) bits must fit into a // natural register (with type bit_t). To fetch BITS bits from bitstream we // use a type lbit_t. // // BITS can be any multiple of 8 from 8 to 56 (inclusive). // Pick values that fit natural register size. #if defined(__i386__) || defined(_M_IX86) // x86 32bit #define BITS 24 #elif defined(__x86_64__) || defined(_M_X64) // x86 64bit #define BITS 56 #elif defined(__arm__) || defined(_M_ARM) // ARM #define BITS 24 #elif WEBP_AARCH64 // ARM 64bit #define BITS 56 #elif defined(__mips__) // MIPS #define BITS 24 #else // reasonable default #define BITS 24 #endif //------------------------------------------------------------------------------ // Derived types and constants: // bit_t = natural register type for storing 'value_' (which is BITS+8 bits) // range_t = register for 'range_' (which is 8bits only) #if (BITS > 24) typedef uint64_t bit_t; #else typedef uint32_t bit_t; #endif typedef uint32_t range_t; //------------------------------------------------------------------------------ // Bitreader typedef struct VP8BitReader VP8BitReader; struct VP8BitReader { // boolean decoder (keep the field ordering as is!) bit_t value_; // current value range_t range_; // current range minus 1. In [127, 254] interval. int bits_; // number of valid bits left // read buffer const uint8_t* buf_; // next byte to be read const uint8_t* buf_end_; // end of read buffer const uint8_t* buf_max_; // max packed-read position on buffer int eof_; // true if input is exhausted }; // Initialize the bit reader and the boolean decoder. void VP8InitBitReader(VP8BitReader* const br, const uint8_t* const start, size_t size); // Sets the working read buffer. void VP8BitReaderSetBuffer(VP8BitReader* const br, const uint8_t* const start, size_t size); // Update internal pointers to displace the byte buffer by the // relative offset 'offset'. void VP8RemapBitReader(VP8BitReader* const br, ptrdiff_t offset); // return the next value made of 'num_bits' bits uint32_t VP8GetValue(VP8BitReader* const br, int num_bits, const char label[]); // return the next value with sign-extension. int32_t VP8GetSignedValue(VP8BitReader* const br, int num_bits, const char label[]); // bit_reader_inl.h will implement the following methods: // static WEBP_INLINE int VP8GetBit(VP8BitReader* const br, int prob, ...) // static WEBP_INLINE int VP8GetSigned(VP8BitReader* const br, int v, ...) // and should be included by the .c files that actually need them. // This is to avoid recompiling the whole library whenever this file is touched, // and also allowing platform-specific ad-hoc hacks. // ----------------------------------------------------------------------------- // Bitreader for lossless format // maximum number of bits (inclusive) the bit-reader can handle: #define VP8L_MAX_NUM_BIT_READ 24 #define VP8L_LBITS 64 // Number of bits prefetched (= bit-size of vp8l_val_t). #define VP8L_WBITS 32 // Minimum number of bytes ready after VP8LFillBitWindow. typedef uint64_t vp8l_val_t; // right now, this bit-reader can only use 64bit. typedef struct { vp8l_val_t val_; // pre-fetched bits const uint8_t* buf_; // input byte buffer size_t len_; // buffer length size_t pos_; // byte position in buf_ int bit_pos_; // current bit-reading position in val_ int eos_; // true if a bit was read past the end of buffer } VP8LBitReader; void VP8LInitBitReader(VP8LBitReader* const br, const uint8_t* const start, size_t length); // Sets a new data buffer. void VP8LBitReaderSetBuffer(VP8LBitReader* const br, const uint8_t* const buffer, size_t length); // Reads the specified number of bits from read buffer. // Flags an error in case end_of_stream or n_bits is more than the allowed limit // of VP8L_MAX_NUM_BIT_READ (inclusive). // Flags eos_ if this read attempt is going to cross the read buffer. uint32_t VP8LReadBits(VP8LBitReader* const br, int n_bits); // Return the prefetched bits, so they can be looked up. static WEBP_INLINE uint32_t VP8LPrefetchBits(VP8LBitReader* const br) { return (uint32_t)(br->val_ >> (br->bit_pos_ & (VP8L_LBITS - 1))); } // Returns true if there was an attempt at reading bit past the end of // the buffer. Doesn't set br->eos_ flag. static WEBP_INLINE int VP8LIsEndOfStream(const VP8LBitReader* const br) { assert(br->pos_ <= br->len_); return br->eos_ || ((br->pos_ == br->len_) && (br->bit_pos_ > VP8L_LBITS)); } // For jumping over a number of bits in the bit stream when accessed with // VP8LPrefetchBits and VP8LFillBitWindow. // This function does *not* set br->eos_, since it's speed-critical. // Use with extreme care! static WEBP_INLINE void VP8LSetBitPos(VP8LBitReader* const br, int val) { br->bit_pos_ = val; } // Advances the read buffer by 4 bytes to make room for reading next 32 bits. // Speed critical, but infrequent part of the code can be non-inlined. extern void VP8LDoFillBitWindow(VP8LBitReader* const br); static WEBP_INLINE void VP8LFillBitWindow(VP8LBitReader* const br) { if (br->bit_pos_ >= VP8L_WBITS) VP8LDoFillBitWindow(br); } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_BIT_READER_UTILS_H_ libwebp-1.4.0/src/utils/huffman_encode_utils.c0000644000014400001440000003232114606317060016330 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // // Entropy encoding (Huffman) for webp lossless. #include #include #include #include "src/utils/huffman_encode_utils.h" #include "src/utils/utils.h" #include "src/webp/format_constants.h" // ----------------------------------------------------------------------------- // Util function to optimize the symbol map for RLE coding // Heuristics for selecting the stride ranges to collapse. static int ValuesShouldBeCollapsedToStrideAverage(int a, int b) { return abs(a - b) < 4; } // Change the population counts in a way that the consequent // Huffman tree compression, especially its RLE-part, give smaller output. static void OptimizeHuffmanForRle(int length, uint8_t* const good_for_rle, uint32_t* const counts) { // 1) Let's make the Huffman code more compatible with rle encoding. int i; for (; length >= 0; --length) { if (length == 0) { return; // All zeros. } if (counts[length - 1] != 0) { // Now counts[0..length - 1] does not have trailing zeros. break; } } // 2) Let's mark all population counts that already can be encoded // with an rle code. { // Let's not spoil any of the existing good rle codes. // Mark any seq of 0's that is longer as 5 as a good_for_rle. // Mark any seq of non-0's that is longer as 7 as a good_for_rle. uint32_t symbol = counts[0]; int stride = 0; for (i = 0; i < length + 1; ++i) { if (i == length || counts[i] != symbol) { if ((symbol == 0 && stride >= 5) || (symbol != 0 && stride >= 7)) { int k; for (k = 0; k < stride; ++k) { good_for_rle[i - k - 1] = 1; } } stride = 1; if (i != length) { symbol = counts[i]; } } else { ++stride; } } } // 3) Let's replace those population counts that lead to more rle codes. { uint32_t stride = 0; uint32_t limit = counts[0]; uint32_t sum = 0; for (i = 0; i < length + 1; ++i) { if (i == length || good_for_rle[i] || (i != 0 && good_for_rle[i - 1]) || !ValuesShouldBeCollapsedToStrideAverage(counts[i], limit)) { if (stride >= 4 || (stride >= 3 && sum == 0)) { uint32_t k; // The stride must end, collapse what we have, if we have enough (4). uint32_t count = (sum + stride / 2) / stride; if (count < 1) { count = 1; } if (sum == 0) { // Don't make an all zeros stride to be upgraded to ones. count = 0; } for (k = 0; k < stride; ++k) { // We don't want to change value at counts[i], // that is already belonging to the next stride. Thus - 1. counts[i - k - 1] = count; } } stride = 0; sum = 0; if (i < length - 3) { // All interesting strides have a count of at least 4, // at least when non-zeros. limit = (counts[i] + counts[i + 1] + counts[i + 2] + counts[i + 3] + 2) / 4; } else if (i < length) { limit = counts[i]; } else { limit = 0; } } ++stride; if (i != length) { sum += counts[i]; if (stride >= 4) { limit = (sum + stride / 2) / stride; } } } } } // A comparer function for two Huffman trees: sorts first by 'total count' // (more comes first), and then by 'value' (more comes first). static int CompareHuffmanTrees(const void* ptr1, const void* ptr2) { const HuffmanTree* const t1 = (const HuffmanTree*)ptr1; const HuffmanTree* const t2 = (const HuffmanTree*)ptr2; if (t1->total_count_ > t2->total_count_) { return -1; } else if (t1->total_count_ < t2->total_count_) { return 1; } else { assert(t1->value_ != t2->value_); return (t1->value_ < t2->value_) ? -1 : 1; } } static void SetBitDepths(const HuffmanTree* const tree, const HuffmanTree* const pool, uint8_t* const bit_depths, int level) { if (tree->pool_index_left_ >= 0) { SetBitDepths(&pool[tree->pool_index_left_], pool, bit_depths, level + 1); SetBitDepths(&pool[tree->pool_index_right_], pool, bit_depths, level + 1); } else { bit_depths[tree->value_] = level; } } // Create an optimal Huffman tree. // // (data,length): population counts. // tree_limit: maximum bit depth (inclusive) of the codes. // bit_depths[]: how many bits are used for the symbol. // // Returns 0 when an error has occurred. // // The catch here is that the tree cannot be arbitrarily deep // // count_limit is the value that is to be faked as the minimum value // and this minimum value is raised until the tree matches the // maximum length requirement. // // This algorithm is not of excellent performance for very long data blocks, // especially when population counts are longer than 2**tree_limit, but // we are not planning to use this with extremely long blocks. // // See https://en.wikipedia.org/wiki/Huffman_coding static void GenerateOptimalTree(const uint32_t* const histogram, int histogram_size, HuffmanTree* tree, int tree_depth_limit, uint8_t* const bit_depths) { uint32_t count_min; HuffmanTree* tree_pool; int tree_size_orig = 0; int i; for (i = 0; i < histogram_size; ++i) { if (histogram[i] != 0) { ++tree_size_orig; } } if (tree_size_orig == 0) { // pretty optimal already! return; } tree_pool = tree + tree_size_orig; // For block sizes with less than 64k symbols we never need to do a // second iteration of this loop. // If we actually start running inside this loop a lot, we would perhaps // be better off with the Katajainen algorithm. assert(tree_size_orig <= (1 << (tree_depth_limit - 1))); for (count_min = 1; ; count_min *= 2) { int tree_size = tree_size_orig; // We need to pack the Huffman tree in tree_depth_limit bits. // So, we try by faking histogram entries to be at least 'count_min'. int idx = 0; int j; for (j = 0; j < histogram_size; ++j) { if (histogram[j] != 0) { const uint32_t count = (histogram[j] < count_min) ? count_min : histogram[j]; tree[idx].total_count_ = count; tree[idx].value_ = j; tree[idx].pool_index_left_ = -1; tree[idx].pool_index_right_ = -1; ++idx; } } // Build the Huffman tree. qsort(tree, tree_size, sizeof(*tree), CompareHuffmanTrees); if (tree_size > 1) { // Normal case. int tree_pool_size = 0; while (tree_size > 1) { // Finish when we have only one root. uint32_t count; tree_pool[tree_pool_size++] = tree[tree_size - 1]; tree_pool[tree_pool_size++] = tree[tree_size - 2]; count = tree_pool[tree_pool_size - 1].total_count_ + tree_pool[tree_pool_size - 2].total_count_; tree_size -= 2; { // Search for the insertion point. int k; for (k = 0; k < tree_size; ++k) { if (tree[k].total_count_ <= count) { break; } } memmove(tree + (k + 1), tree + k, (tree_size - k) * sizeof(*tree)); tree[k].total_count_ = count; tree[k].value_ = -1; tree[k].pool_index_left_ = tree_pool_size - 1; tree[k].pool_index_right_ = tree_pool_size - 2; tree_size = tree_size + 1; } } SetBitDepths(&tree[0], tree_pool, bit_depths, 0); } else if (tree_size == 1) { // Trivial case: only one element. bit_depths[tree[0].value_] = 1; } { // Test if this Huffman tree satisfies our 'tree_depth_limit' criteria. int max_depth = bit_depths[0]; for (j = 1; j < histogram_size; ++j) { if (max_depth < bit_depths[j]) { max_depth = bit_depths[j]; } } if (max_depth <= tree_depth_limit) { break; } } } } // ----------------------------------------------------------------------------- // Coding of the Huffman tree values static HuffmanTreeToken* CodeRepeatedValues(int repetitions, HuffmanTreeToken* tokens, int value, int prev_value) { assert(value <= MAX_ALLOWED_CODE_LENGTH); if (value != prev_value) { tokens->code = value; tokens->extra_bits = 0; ++tokens; --repetitions; } while (repetitions >= 1) { if (repetitions < 3) { int i; for (i = 0; i < repetitions; ++i) { tokens->code = value; tokens->extra_bits = 0; ++tokens; } break; } else if (repetitions < 7) { tokens->code = 16; tokens->extra_bits = repetitions - 3; ++tokens; break; } else { tokens->code = 16; tokens->extra_bits = 3; ++tokens; repetitions -= 6; } } return tokens; } static HuffmanTreeToken* CodeRepeatedZeros(int repetitions, HuffmanTreeToken* tokens) { while (repetitions >= 1) { if (repetitions < 3) { int i; for (i = 0; i < repetitions; ++i) { tokens->code = 0; // 0-value tokens->extra_bits = 0; ++tokens; } break; } else if (repetitions < 11) { tokens->code = 17; tokens->extra_bits = repetitions - 3; ++tokens; break; } else if (repetitions < 139) { tokens->code = 18; tokens->extra_bits = repetitions - 11; ++tokens; break; } else { tokens->code = 18; tokens->extra_bits = 0x7f; // 138 repeated 0s ++tokens; repetitions -= 138; } } return tokens; } int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode* const tree, HuffmanTreeToken* tokens, int max_tokens) { HuffmanTreeToken* const starting_token = tokens; HuffmanTreeToken* const ending_token = tokens + max_tokens; const int depth_size = tree->num_symbols; int prev_value = 8; // 8 is the initial value for rle. int i = 0; assert(tokens != NULL); while (i < depth_size) { const int value = tree->code_lengths[i]; int k = i + 1; int runs; while (k < depth_size && tree->code_lengths[k] == value) ++k; runs = k - i; if (value == 0) { tokens = CodeRepeatedZeros(runs, tokens); } else { tokens = CodeRepeatedValues(runs, tokens, value, prev_value); prev_value = value; } i += runs; assert(tokens <= ending_token); } (void)ending_token; // suppress 'unused variable' warning return (int)(tokens - starting_token); } // ----------------------------------------------------------------------------- // Pre-reversed 4-bit values. static const uint8_t kReversedBits[16] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf }; static uint32_t ReverseBits(int num_bits, uint32_t bits) { uint32_t retval = 0; int i = 0; while (i < num_bits) { i += 4; retval |= kReversedBits[bits & 0xf] << (MAX_ALLOWED_CODE_LENGTH + 1 - i); bits >>= 4; } retval >>= (MAX_ALLOWED_CODE_LENGTH + 1 - num_bits); return retval; } // Get the actual bit values for a tree of bit depths. static void ConvertBitDepthsToSymbols(HuffmanTreeCode* const tree) { // 0 bit-depth means that the symbol does not exist. int i; int len; uint32_t next_code[MAX_ALLOWED_CODE_LENGTH + 1]; int depth_count[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 }; assert(tree != NULL); len = tree->num_symbols; for (i = 0; i < len; ++i) { const int code_length = tree->code_lengths[i]; assert(code_length <= MAX_ALLOWED_CODE_LENGTH); ++depth_count[code_length]; } depth_count[0] = 0; // ignore unused symbol next_code[0] = 0; { uint32_t code = 0; for (i = 1; i <= MAX_ALLOWED_CODE_LENGTH; ++i) { code = (code + depth_count[i - 1]) << 1; next_code[i] = code; } } for (i = 0; i < len; ++i) { const int code_length = tree->code_lengths[i]; tree->codes[i] = ReverseBits(code_length, next_code[code_length]++); } } // ----------------------------------------------------------------------------- // Main entry point void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit, uint8_t* const buf_rle, HuffmanTree* const huff_tree, HuffmanTreeCode* const huff_code) { const int num_symbols = huff_code->num_symbols; memset(buf_rle, 0, num_symbols * sizeof(*buf_rle)); OptimizeHuffmanForRle(num_symbols, buf_rle, histogram); GenerateOptimalTree(histogram, num_symbols, huff_tree, tree_depth_limit, huff_code->code_lengths); // Create the actual bit codes for the bit lengths. ConvertBitDepthsToSymbols(huff_code); } libwebp-1.4.0/src/utils/color_cache_utils.c0000644000014400001440000000322514606317060015631 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Color Cache for WebP Lossless // // Author: Jyrki Alakuijala (jyrki@google.com) #include #include #include #include "src/utils/color_cache_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // VP8LColorCache. int VP8LColorCacheInit(VP8LColorCache* const color_cache, int hash_bits) { const int hash_size = 1 << hash_bits; assert(color_cache != NULL); assert(hash_bits > 0); color_cache->colors_ = (uint32_t*)WebPSafeCalloc( (uint64_t)hash_size, sizeof(*color_cache->colors_)); if (color_cache->colors_ == NULL) return 0; color_cache->hash_shift_ = 32 - hash_bits; color_cache->hash_bits_ = hash_bits; return 1; } void VP8LColorCacheClear(VP8LColorCache* const color_cache) { if (color_cache != NULL) { WebPSafeFree(color_cache->colors_); color_cache->colors_ = NULL; } } void VP8LColorCacheCopy(const VP8LColorCache* const src, VP8LColorCache* const dst) { assert(src != NULL); assert(dst != NULL); assert(src->hash_bits_ == dst->hash_bits_); memcpy(dst->colors_, src->colors_, ((size_t)1u << dst->hash_bits_) * sizeof(*dst->colors_)); } libwebp-1.4.0/src/utils/bit_writer_utils.h0000644000014400001440000001350114606317060015545 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Bit writing and boolean coder // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_UTILS_BIT_WRITER_UTILS_H_ #define WEBP_UTILS_BIT_WRITER_UTILS_H_ #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Bit-writing typedef struct VP8BitWriter VP8BitWriter; struct VP8BitWriter { int32_t range_; // range-1 int32_t value_; int run_; // number of outstanding bits int nb_bits_; // number of pending bits uint8_t* buf_; // internal buffer. Re-allocated regularly. Not owned. size_t pos_; size_t max_pos_; int error_; // true in case of error }; // Initialize the object. Allocates some initial memory based on expected_size. int VP8BitWriterInit(VP8BitWriter* const bw, size_t expected_size); // Finalize the bitstream coding. Returns a pointer to the internal buffer. uint8_t* VP8BitWriterFinish(VP8BitWriter* const bw); // Release any pending memory and zeroes the object. Not a mandatory call. // Only useful in case of error, when the internal buffer hasn't been grabbed! void VP8BitWriterWipeOut(VP8BitWriter* const bw); int VP8PutBit(VP8BitWriter* const bw, int bit, int prob); int VP8PutBitUniform(VP8BitWriter* const bw, int bit); void VP8PutBits(VP8BitWriter* const bw, uint32_t value, int nb_bits); void VP8PutSignedBits(VP8BitWriter* const bw, int value, int nb_bits); // Appends some bytes to the internal buffer. Data is copied. int VP8BitWriterAppend(VP8BitWriter* const bw, const uint8_t* data, size_t size); // return approximate write position (in bits) static WEBP_INLINE uint64_t VP8BitWriterPos(const VP8BitWriter* const bw) { const uint64_t nb_bits = 8 + bw->nb_bits_; // bw->nb_bits_ is <= 0, note return (bw->pos_ + bw->run_) * 8 + nb_bits; } // Returns a pointer to the internal buffer. static WEBP_INLINE uint8_t* VP8BitWriterBuf(const VP8BitWriter* const bw) { return bw->buf_; } // Returns the size of the internal buffer. static WEBP_INLINE size_t VP8BitWriterSize(const VP8BitWriter* const bw) { return bw->pos_; } //------------------------------------------------------------------------------ // VP8LBitWriter #if defined(__x86_64__) || defined(_M_X64) // 64bit typedef uint64_t vp8l_atype_t; // accumulator type typedef uint32_t vp8l_wtype_t; // writing type #define WSWAP HToLE32 #define VP8L_WRITER_BYTES 4 // sizeof(vp8l_wtype_t) #define VP8L_WRITER_BITS 32 // 8 * sizeof(vp8l_wtype_t) #define VP8L_WRITER_MAX_BITS 64 // 8 * sizeof(vp8l_atype_t) #else typedef uint32_t vp8l_atype_t; typedef uint16_t vp8l_wtype_t; #define WSWAP HToLE16 #define VP8L_WRITER_BYTES 2 #define VP8L_WRITER_BITS 16 #define VP8L_WRITER_MAX_BITS 32 #endif typedef struct { vp8l_atype_t bits_; // bit accumulator int used_; // number of bits used in accumulator uint8_t* buf_; // start of buffer uint8_t* cur_; // current write position uint8_t* end_; // end of buffer // After all bits are written (VP8LBitWriterFinish()), the caller must observe // the state of error_. A value of 1 indicates that a memory allocation // failure has happened during bit writing. A value of 0 indicates successful // writing of bits. int error_; } VP8LBitWriter; static WEBP_INLINE size_t VP8LBitWriterNumBytes(const VP8LBitWriter* const bw) { return (bw->cur_ - bw->buf_) + ((bw->used_ + 7) >> 3); } // Returns false in case of memory allocation error. int VP8LBitWriterInit(VP8LBitWriter* const bw, size_t expected_size); // Returns false in case of memory allocation error. int VP8LBitWriterClone(const VP8LBitWriter* const src, VP8LBitWriter* const dst); // Finalize the bitstream coding. Returns a pointer to the internal buffer. uint8_t* VP8LBitWriterFinish(VP8LBitWriter* const bw); // Release any pending memory and zeroes the object. void VP8LBitWriterWipeOut(VP8LBitWriter* const bw); // Resets the cursor of the BitWriter bw to when it was like in bw_init. void VP8LBitWriterReset(const VP8LBitWriter* const bw_init, VP8LBitWriter* const bw); // Swaps the memory held by two BitWriters. void VP8LBitWriterSwap(VP8LBitWriter* const src, VP8LBitWriter* const dst); // Internal function for VP8LPutBits flushing 32 bits from the written state. void VP8LPutBitsFlushBits(VP8LBitWriter* const bw); // PutBits internal function used in the 16 bit vp8l_wtype_t case. void VP8LPutBitsInternal(VP8LBitWriter* const bw, uint32_t bits, int n_bits); // This function writes bits into bytes in increasing addresses (little endian), // and within a byte least-significant-bit first. // This function can write up to 32 bits in one go, but VP8LBitReader can only // read 24 bits max (VP8L_MAX_NUM_BIT_READ). // VP8LBitWriter's error_ flag is set in case of memory allocation error. static WEBP_INLINE void VP8LPutBits(VP8LBitWriter* const bw, uint32_t bits, int n_bits) { if (sizeof(vp8l_wtype_t) == 4) { if (n_bits > 0) { if (bw->used_ >= 32) { VP8LPutBitsFlushBits(bw); } bw->bits_ |= (vp8l_atype_t)bits << bw->used_; bw->used_ += n_bits; } } else { VP8LPutBitsInternal(bw, bits, n_bits); } } //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_BIT_WRITER_UTILS_H_ libwebp-1.4.0/src/utils/Makefile.in0000644000014400001440000006261214606317244014062 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_LIBWEBPDECODER_TRUE@am__append_1 = libwebputilsdecode.la subdir = src/utils ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(common_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwebputils_la_LIBADD = am__objects_1 = bit_reader_utils.lo color_cache_utils.lo \ filters_utils.lo huffman_utils.lo palette.lo \ quant_levels_dec_utils.lo rescaler_utils.lo random_utils.lo \ thread_utils.lo utils.lo am__objects_2 = bit_writer_utils.lo huffman_encode_utils.lo \ quant_levels_utils.lo am_libwebputils_la_OBJECTS = $(am__objects_1) $(am__objects_2) libwebputils_la_OBJECTS = $(am_libwebputils_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebputilsdecode_la_LIBADD = am__libwebputilsdecode_la_SOURCES_DIST = bit_reader_utils.c \ bit_reader_utils.h bit_reader_inl_utils.h color_cache_utils.c \ color_cache_utils.h endian_inl_utils.h filters_utils.c \ filters_utils.h huffman_utils.c huffman_utils.h palette.c \ palette.h quant_levels_dec_utils.c quant_levels_dec_utils.h \ rescaler_utils.c rescaler_utils.h random_utils.c \ random_utils.h thread_utils.c thread_utils.h utils.c utils.h @BUILD_LIBWEBPDECODER_TRUE@am_libwebputilsdecode_la_OBJECTS = \ @BUILD_LIBWEBPDECODER_TRUE@ $(am__objects_1) libwebputilsdecode_la_OBJECTS = $(am_libwebputilsdecode_la_OBJECTS) @BUILD_LIBWEBPDECODER_TRUE@am_libwebputilsdecode_la_rpath = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/bit_reader_utils.Plo \ ./$(DEPDIR)/bit_writer_utils.Plo \ ./$(DEPDIR)/color_cache_utils.Plo \ ./$(DEPDIR)/filters_utils.Plo \ ./$(DEPDIR)/huffman_encode_utils.Plo \ ./$(DEPDIR)/huffman_utils.Plo ./$(DEPDIR)/palette.Plo \ ./$(DEPDIR)/quant_levels_dec_utils.Plo \ ./$(DEPDIR)/quant_levels_utils.Plo \ ./$(DEPDIR)/random_utils.Plo ./$(DEPDIR)/rescaler_utils.Plo \ ./$(DEPDIR)/thread_utils.Plo ./$(DEPDIR)/utils.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebputils_la_SOURCES) $(libwebputilsdecode_la_SOURCES) DIST_SOURCES = $(libwebputils_la_SOURCES) \ $(am__libwebputilsdecode_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(commondir)" HEADERS = $(common_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libwebputils.la $(am__append_1) common_HEADERS = ../webp/types.h commondir = $(includedir)/webp noinst_HEADERS = ../dsp/cpu.h ../dsp/dsp.h ../webp/decode.h \ ../webp/encode.h ../webp/format_constants.h COMMON_SOURCES = bit_reader_utils.c bit_reader_utils.h \ bit_reader_inl_utils.h color_cache_utils.c color_cache_utils.h \ endian_inl_utils.h filters_utils.c filters_utils.h \ huffman_utils.c huffman_utils.h palette.c palette.h \ quant_levels_dec_utils.c quant_levels_dec_utils.h \ rescaler_utils.c rescaler_utils.h random_utils.c \ random_utils.h thread_utils.c thread_utils.h utils.c utils.h ENC_SOURCES = bit_writer_utils.c bit_writer_utils.h \ huffman_encode_utils.c huffman_encode_utils.h \ quant_levels_utils.c quant_levels_utils.h libwebputils_la_SOURCES = $(COMMON_SOURCES) $(ENC_SOURCES) @BUILD_LIBWEBPDECODER_TRUE@libwebputilsdecode_la_SOURCES = $(COMMON_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/utils/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebputils.la: $(libwebputils_la_OBJECTS) $(libwebputils_la_DEPENDENCIES) $(EXTRA_libwebputils_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libwebputils_la_OBJECTS) $(libwebputils_la_LIBADD) $(LIBS) libwebputilsdecode.la: $(libwebputilsdecode_la_OBJECTS) $(libwebputilsdecode_la_DEPENDENCIES) $(EXTRA_libwebputilsdecode_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libwebputilsdecode_la_rpath) $(libwebputilsdecode_la_OBJECTS) $(libwebputilsdecode_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit_reader_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit_writer_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color_cache_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman_encode_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/palette.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quant_levels_dec_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quant_levels_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rescaler_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-commonHEADERS: $(common_HEADERS) @$(NORMAL_INSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(commondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(commondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(commondir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(commondir)" || exit $$?; \ done uninstall-commonHEADERS: @$(NORMAL_UNINSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(commondir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(commondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/bit_reader_utils.Plo -rm -f ./$(DEPDIR)/bit_writer_utils.Plo -rm -f ./$(DEPDIR)/color_cache_utils.Plo -rm -f ./$(DEPDIR)/filters_utils.Plo -rm -f ./$(DEPDIR)/huffman_encode_utils.Plo -rm -f ./$(DEPDIR)/huffman_utils.Plo -rm -f ./$(DEPDIR)/palette.Plo -rm -f ./$(DEPDIR)/quant_levels_dec_utils.Plo -rm -f ./$(DEPDIR)/quant_levels_utils.Plo -rm -f ./$(DEPDIR)/random_utils.Plo -rm -f ./$(DEPDIR)/rescaler_utils.Plo -rm -f ./$(DEPDIR)/thread_utils.Plo -rm -f ./$(DEPDIR)/utils.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-commonHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/bit_reader_utils.Plo -rm -f ./$(DEPDIR)/bit_writer_utils.Plo -rm -f ./$(DEPDIR)/color_cache_utils.Plo -rm -f ./$(DEPDIR)/filters_utils.Plo -rm -f ./$(DEPDIR)/huffman_encode_utils.Plo -rm -f ./$(DEPDIR)/huffman_utils.Plo -rm -f ./$(DEPDIR)/palette.Plo -rm -f ./$(DEPDIR)/quant_levels_dec_utils.Plo -rm -f ./$(DEPDIR)/quant_levels_utils.Plo -rm -f ./$(DEPDIR)/random_utils.Plo -rm -f ./$(DEPDIR)/rescaler_utils.Plo -rm -f ./$(DEPDIR)/thread_utils.Plo -rm -f ./$(DEPDIR)/utils.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-commonHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-commonHEADERS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-commonHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/utils/utils.h0000644000014400001440000001576014606317060013324 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Misc. common utility functions // // Authors: Skal (pascal.massimino@gmail.com) // Urvang (urvang@google.com) #ifndef WEBP_UTILS_UTILS_H_ #define WEBP_UTILS_UTILS_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Memory allocation // This is the maximum memory amount that libwebp will ever try to allocate. #ifndef WEBP_MAX_ALLOCABLE_MEMORY #if SIZE_MAX > (1ULL << 34) #define WEBP_MAX_ALLOCABLE_MEMORY (1ULL << 34) #else // For 32-bit targets keep this below INT_MAX to avoid valgrind warnings. #define WEBP_MAX_ALLOCABLE_MEMORY ((1ULL << 31) - (1 << 16)) #endif #endif // WEBP_MAX_ALLOCABLE_MEMORY static WEBP_INLINE int CheckSizeOverflow(uint64_t size) { return size == (size_t)size; } // size-checking safe malloc/calloc: verify that the requested size is not too // large, or return NULL. You don't need to call these for constructs like // malloc(sizeof(foo)), but only if there's picture-dependent size involved // somewhere (like: malloc(num_pixels * sizeof(*something))). That's why this // safe malloc() borrows the signature from calloc(), pointing at the dangerous // underlying multiply involved. WEBP_EXTERN void* WebPSafeMalloc(uint64_t nmemb, size_t size); // Note that WebPSafeCalloc() expects the second argument type to be 'size_t' // in order to favor the "calloc(num_foo, sizeof(foo))" pattern. WEBP_EXTERN void* WebPSafeCalloc(uint64_t nmemb, size_t size); // Companion deallocation function to the above allocations. WEBP_EXTERN void WebPSafeFree(void* const ptr); //------------------------------------------------------------------------------ // Alignment #define WEBP_ALIGN_CST 31 #define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & \ ~(uintptr_t)WEBP_ALIGN_CST) #include // memcpy() is the safe way of moving potentially unaligned 32b memory. static WEBP_INLINE uint32_t WebPMemToUint32(const uint8_t* const ptr) { uint32_t A; memcpy(&A, ptr, sizeof(A)); return A; } static WEBP_INLINE int32_t WebPMemToInt32(const uint8_t* const ptr) { return (int32_t)WebPMemToUint32(ptr); } static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) { memcpy(ptr, &val, sizeof(val)); } static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) { WebPUint32ToMem(ptr, (uint32_t)val); } //------------------------------------------------------------------------------ // Reading/writing data. // Read 16, 24 or 32 bits stored in little-endian order. static WEBP_INLINE int GetLE16(const uint8_t* const data) { return (int)(data[0] << 0) | (data[1] << 8); } static WEBP_INLINE int GetLE24(const uint8_t* const data) { return GetLE16(data) | (data[2] << 16); } static WEBP_INLINE uint32_t GetLE32(const uint8_t* const data) { return GetLE16(data) | ((uint32_t)GetLE16(data + 2) << 16); } // Store 16, 24 or 32 bits in little-endian order. static WEBP_INLINE void PutLE16(uint8_t* const data, int val) { assert(val < (1 << 16)); data[0] = (val >> 0) & 0xff; data[1] = (val >> 8) & 0xff; } static WEBP_INLINE void PutLE24(uint8_t* const data, int val) { assert(val < (1 << 24)); PutLE16(data, val & 0xffff); data[2] = (val >> 16) & 0xff; } static WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) { PutLE16(data, (int)(val & 0xffff)); PutLE16(data + 2, (int)(val >> 16)); } // use GNU builtins where available. #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) // Returns (int)floor(log2(n)). n must be > 0. static WEBP_INLINE int BitsLog2Floor(uint32_t n) { return 31 ^ __builtin_clz(n); } // counts the number of trailing zero static WEBP_INLINE int BitsCtz(uint32_t n) { return __builtin_ctz(n); } #elif defined(_MSC_VER) && _MSC_VER > 1310 && \ (defined(_M_X64) || defined(_M_IX86)) #include #pragma intrinsic(_BitScanReverse) #pragma intrinsic(_BitScanForward) static WEBP_INLINE int BitsLog2Floor(uint32_t n) { unsigned long first_set_bit; // NOLINT (runtime/int) _BitScanReverse(&first_set_bit, n); return first_set_bit; } static WEBP_INLINE int BitsCtz(uint32_t n) { unsigned long first_set_bit; // NOLINT (runtime/int) _BitScanForward(&first_set_bit, n); return first_set_bit; } #else // default: use the (slow) C-version. #define WEBP_HAVE_SLOW_CLZ_CTZ // signal that the Clz/Ctz function are slow // Returns 31 ^ clz(n) = log2(n). This is the default C-implementation, either // based on table or not. Can be used as fallback if clz() is not available. #define WEBP_NEED_LOG_TABLE_8BIT extern const uint8_t WebPLogTable8bit[256]; static WEBP_INLINE int WebPLog2FloorC(uint32_t n) { int log_value = 0; while (n >= 256) { log_value += 8; n >>= 8; } return log_value + WebPLogTable8bit[n]; } static WEBP_INLINE int BitsLog2Floor(uint32_t n) { return WebPLog2FloorC(n); } static WEBP_INLINE int BitsCtz(uint32_t n) { int i; for (i = 0; i < 32; ++i, n >>= 1) { if (n & 1) return i; } return 32; } #endif //------------------------------------------------------------------------------ // Pixel copying. struct WebPPicture; // Copy width x height pixels from 'src' to 'dst' honoring the strides. WEBP_EXTERN void WebPCopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height); // Copy ARGB pixels from 'src' to 'dst' honoring strides. 'src' and 'dst' are // assumed to be already allocated and using ARGB data. WEBP_EXTERN void WebPCopyPixels(const struct WebPPicture* const src, struct WebPPicture* const dst); //------------------------------------------------------------------------------ // Unique colors. // Returns count of unique colors in 'pic', assuming pic->use_argb is true. // If the unique color count is more than MAX_PALETTE_SIZE, returns // MAX_PALETTE_SIZE+1. // If 'palette' is not NULL and number of unique colors is less than or equal to // MAX_PALETTE_SIZE, also outputs the actual unique colors into 'palette'. // Note: 'palette' is assumed to be an array already allocated with at least // MAX_PALETTE_SIZE elements. // TODO(vrabaud) remove whenever we can break the ABI. WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic, uint32_t* const palette); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_UTILS_H_ libwebp-1.4.0/src/utils/quant_levels_utils.c0000644000014400001440000000774314606317060016103 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Quantize levels for specified number of quantization-levels ([2, 256]). // Min and max values are preserved (usual 0 and 255 for alpha plane). // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/utils/quant_levels_utils.h" #define NUM_SYMBOLS 256 #define MAX_ITER 6 // Maximum number of convergence steps. #define ERROR_THRESHOLD 1e-4 // MSE stopping criterion. // ----------------------------------------------------------------------------- // Quantize levels. int QuantizeLevels(uint8_t* const data, int width, int height, int num_levels, uint64_t* const sse) { int freq[NUM_SYMBOLS] = { 0 }; int q_level[NUM_SYMBOLS] = { 0 }; double inv_q_level[NUM_SYMBOLS] = { 0 }; int min_s = 255, max_s = 0; const size_t data_size = height * width; int i, num_levels_in, iter; double last_err = 1.e38, err = 0.; const double err_threshold = ERROR_THRESHOLD * data_size; if (data == NULL) { return 0; } if (width <= 0 || height <= 0) { return 0; } if (num_levels < 2 || num_levels > 256) { return 0; } { size_t n; num_levels_in = 0; for (n = 0; n < data_size; ++n) { num_levels_in += (freq[data[n]] == 0); if (min_s > data[n]) min_s = data[n]; if (max_s < data[n]) max_s = data[n]; ++freq[data[n]]; } } if (num_levels_in <= num_levels) goto End; // nothing to do! // Start with uniformly spread centroids. for (i = 0; i < num_levels; ++i) { inv_q_level[i] = min_s + (double)(max_s - min_s) * i / (num_levels - 1); } // Fixed values. Won't be changed. q_level[min_s] = 0; q_level[max_s] = num_levels - 1; assert(inv_q_level[0] == min_s); assert(inv_q_level[num_levels - 1] == max_s); // k-Means iterations. for (iter = 0; iter < MAX_ITER; ++iter) { double q_sum[NUM_SYMBOLS] = { 0 }; double q_count[NUM_SYMBOLS] = { 0 }; int s, slot = 0; // Assign classes to representatives. for (s = min_s; s <= max_s; ++s) { // Keep track of the nearest neighbour 'slot' while (slot < num_levels - 1 && 2 * s > inv_q_level[slot] + inv_q_level[slot + 1]) { ++slot; } if (freq[s] > 0) { q_sum[slot] += s * freq[s]; q_count[slot] += freq[s]; } q_level[s] = slot; } // Assign new representatives to classes. if (num_levels > 2) { for (slot = 1; slot < num_levels - 1; ++slot) { const double count = q_count[slot]; if (count > 0.) { inv_q_level[slot] = q_sum[slot] / count; } } } // Compute convergence error. err = 0.; for (s = min_s; s <= max_s; ++s) { const double error = s - inv_q_level[q_level[s]]; err += freq[s] * error * error; } // Check for convergence: we stop as soon as the error is no // longer improving. if (last_err - err < err_threshold) break; last_err = err; } // Remap the alpha plane to quantized values. { // double->int rounding operation can be costly, so we do it // once for all before remapping. We also perform the data[] -> slot // mapping, while at it (avoid one indirection in the final loop). uint8_t map[NUM_SYMBOLS]; int s; size_t n; for (s = min_s; s <= max_s; ++s) { const int slot = q_level[s]; map[s] = (uint8_t)(inv_q_level[slot] + .5); } // Final pass. for (n = 0; n < data_size; ++n) { data[n] = map[data[n]]; } } End: // Store sum of squared error if needed. if (sse != NULL) *sse = (uint64_t)err; return 1; } libwebp-1.4.0/src/utils/thread_utils.c0000644000014400001440000002571314606317060014645 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Multi-threaded worker // // Author: Skal (pascal.massimino@gmail.com) #include #include // for memset() #include "src/utils/thread_utils.h" #include "src/utils/utils.h" #ifdef WEBP_USE_THREAD #if defined(_WIN32) #include typedef HANDLE pthread_t; typedef CRITICAL_SECTION pthread_mutex_t; #if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater #define USE_WINDOWS_CONDITION_VARIABLE typedef CONDITION_VARIABLE pthread_cond_t; #else typedef struct { HANDLE waiting_sem_; HANDLE received_sem_; HANDLE signal_event_; } pthread_cond_t; #endif // _WIN32_WINNT >= 0x600 #ifndef WINAPI_FAMILY_PARTITION #define WINAPI_PARTITION_DESKTOP 1 #define WINAPI_FAMILY_PARTITION(x) x #endif #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) #define USE_CREATE_THREAD #endif #else // !_WIN32 #include #endif // _WIN32 typedef struct { pthread_mutex_t mutex_; pthread_cond_t condition_; pthread_t thread_; } WebPWorkerImpl; #if defined(_WIN32) //------------------------------------------------------------------------------ // simplistic pthread emulation layer #include // _beginthreadex requires __stdcall #define THREADFN unsigned int __stdcall #define THREAD_RETURN(val) (unsigned int)((DWORD_PTR)val) #if _WIN32_WINNT >= 0x0501 // Windows XP or greater #define WaitForSingleObject(obj, timeout) \ WaitForSingleObjectEx(obj, timeout, FALSE /*bAlertable*/) #endif static int pthread_create(pthread_t* const thread, const void* attr, unsigned int (__stdcall* start)(void*), void* arg) { (void)attr; #ifdef USE_CREATE_THREAD *thread = CreateThread(NULL, /* lpThreadAttributes */ 0, /* dwStackSize */ start, arg, 0, /* dwStackSize */ NULL); /* lpThreadId */ #else *thread = (pthread_t)_beginthreadex(NULL, /* void *security */ 0, /* unsigned stack_size */ start, arg, 0, /* unsigned initflag */ NULL); /* unsigned *thrdaddr */ #endif if (*thread == NULL) return 1; SetThreadPriority(*thread, THREAD_PRIORITY_ABOVE_NORMAL); return 0; } static int pthread_join(pthread_t thread, void** value_ptr) { (void)value_ptr; return (WaitForSingleObject(thread, INFINITE) != WAIT_OBJECT_0 || CloseHandle(thread) == 0); } // Mutex static int pthread_mutex_init(pthread_mutex_t* const mutex, void* mutexattr) { (void)mutexattr; #if _WIN32_WINNT >= 0x0600 // Windows Vista / Server 2008 or greater InitializeCriticalSectionEx(mutex, 0 /*dwSpinCount*/, 0 /*Flags*/); #else InitializeCriticalSection(mutex); #endif return 0; } static int pthread_mutex_lock(pthread_mutex_t* const mutex) { EnterCriticalSection(mutex); return 0; } static int pthread_mutex_unlock(pthread_mutex_t* const mutex) { LeaveCriticalSection(mutex); return 0; } static int pthread_mutex_destroy(pthread_mutex_t* const mutex) { DeleteCriticalSection(mutex); return 0; } // Condition static int pthread_cond_destroy(pthread_cond_t* const condition) { int ok = 1; #ifdef USE_WINDOWS_CONDITION_VARIABLE (void)condition; #else ok &= (CloseHandle(condition->waiting_sem_) != 0); ok &= (CloseHandle(condition->received_sem_) != 0); ok &= (CloseHandle(condition->signal_event_) != 0); #endif return !ok; } static int pthread_cond_init(pthread_cond_t* const condition, void* cond_attr) { (void)cond_attr; #ifdef USE_WINDOWS_CONDITION_VARIABLE InitializeConditionVariable(condition); #else condition->waiting_sem_ = CreateSemaphore(NULL, 0, 1, NULL); condition->received_sem_ = CreateSemaphore(NULL, 0, 1, NULL); condition->signal_event_ = CreateEvent(NULL, FALSE, FALSE, NULL); if (condition->waiting_sem_ == NULL || condition->received_sem_ == NULL || condition->signal_event_ == NULL) { pthread_cond_destroy(condition); return 1; } #endif return 0; } static int pthread_cond_signal(pthread_cond_t* const condition) { int ok = 1; #ifdef USE_WINDOWS_CONDITION_VARIABLE WakeConditionVariable(condition); #else if (WaitForSingleObject(condition->waiting_sem_, 0) == WAIT_OBJECT_0) { // a thread is waiting in pthread_cond_wait: allow it to be notified ok = SetEvent(condition->signal_event_); // wait until the event is consumed so the signaler cannot consume // the event via its own pthread_cond_wait. ok &= (WaitForSingleObject(condition->received_sem_, INFINITE) != WAIT_OBJECT_0); } #endif return !ok; } static int pthread_cond_wait(pthread_cond_t* const condition, pthread_mutex_t* const mutex) { int ok; #ifdef USE_WINDOWS_CONDITION_VARIABLE ok = SleepConditionVariableCS(condition, mutex, INFINITE); #else // note that there is a consumer available so the signal isn't dropped in // pthread_cond_signal if (!ReleaseSemaphore(condition->waiting_sem_, 1, NULL)) return 1; // now unlock the mutex so pthread_cond_signal may be issued pthread_mutex_unlock(mutex); ok = (WaitForSingleObject(condition->signal_event_, INFINITE) == WAIT_OBJECT_0); ok &= ReleaseSemaphore(condition->received_sem_, 1, NULL); pthread_mutex_lock(mutex); #endif return !ok; } #else // !_WIN32 # define THREADFN void* # define THREAD_RETURN(val) val #endif // _WIN32 //------------------------------------------------------------------------------ static THREADFN ThreadLoop(void* ptr) { WebPWorker* const worker = (WebPWorker*)ptr; WebPWorkerImpl* const impl = (WebPWorkerImpl*)worker->impl_; int done = 0; while (!done) { pthread_mutex_lock(&impl->mutex_); while (worker->status_ == OK) { // wait in idling mode pthread_cond_wait(&impl->condition_, &impl->mutex_); } if (worker->status_ == WORK) { WebPGetWorkerInterface()->Execute(worker); worker->status_ = OK; } else if (worker->status_ == NOT_OK) { // finish the worker done = 1; } // signal to the main thread that we're done (for Sync()) // Note the associated mutex does not need to be held when signaling the // condition. Unlocking the mutex first may improve performance in some // implementations, avoiding the case where the waiting thread can't // reacquire the mutex when woken. pthread_mutex_unlock(&impl->mutex_); pthread_cond_signal(&impl->condition_); } return THREAD_RETURN(NULL); // Thread is finished } // main thread state control static void ChangeState(WebPWorker* const worker, WebPWorkerStatus new_status) { // No-op when attempting to change state on a thread that didn't come up. // Checking status_ without acquiring the lock first would result in a data // race. WebPWorkerImpl* const impl = (WebPWorkerImpl*)worker->impl_; if (impl == NULL) return; pthread_mutex_lock(&impl->mutex_); if (worker->status_ >= OK) { // wait for the worker to finish while (worker->status_ != OK) { pthread_cond_wait(&impl->condition_, &impl->mutex_); } // assign new status and release the working thread if needed if (new_status != OK) { worker->status_ = new_status; // Note the associated mutex does not need to be held when signaling the // condition. Unlocking the mutex first may improve performance in some // implementations, avoiding the case where the waiting thread can't // reacquire the mutex when woken. pthread_mutex_unlock(&impl->mutex_); pthread_cond_signal(&impl->condition_); return; } } pthread_mutex_unlock(&impl->mutex_); } #endif // WEBP_USE_THREAD //------------------------------------------------------------------------------ static void Init(WebPWorker* const worker) { memset(worker, 0, sizeof(*worker)); worker->status_ = NOT_OK; } static int Sync(WebPWorker* const worker) { #ifdef WEBP_USE_THREAD ChangeState(worker, OK); #endif assert(worker->status_ <= OK); return !worker->had_error; } static int Reset(WebPWorker* const worker) { int ok = 1; worker->had_error = 0; if (worker->status_ < OK) { #ifdef WEBP_USE_THREAD WebPWorkerImpl* const impl = (WebPWorkerImpl*)WebPSafeCalloc(1, sizeof(WebPWorkerImpl)); worker->impl_ = (void*)impl; if (worker->impl_ == NULL) { return 0; } if (pthread_mutex_init(&impl->mutex_, NULL)) { goto Error; } if (pthread_cond_init(&impl->condition_, NULL)) { pthread_mutex_destroy(&impl->mutex_); goto Error; } pthread_mutex_lock(&impl->mutex_); ok = !pthread_create(&impl->thread_, NULL, ThreadLoop, worker); if (ok) worker->status_ = OK; pthread_mutex_unlock(&impl->mutex_); if (!ok) { pthread_mutex_destroy(&impl->mutex_); pthread_cond_destroy(&impl->condition_); Error: WebPSafeFree(impl); worker->impl_ = NULL; return 0; } #else worker->status_ = OK; #endif } else if (worker->status_ > OK) { ok = Sync(worker); } assert(!ok || (worker->status_ == OK)); return ok; } static void Execute(WebPWorker* const worker) { if (worker->hook != NULL) { worker->had_error |= !worker->hook(worker->data1, worker->data2); } } static void Launch(WebPWorker* const worker) { #ifdef WEBP_USE_THREAD ChangeState(worker, WORK); #else Execute(worker); #endif } static void End(WebPWorker* const worker) { #ifdef WEBP_USE_THREAD if (worker->impl_ != NULL) { WebPWorkerImpl* const impl = (WebPWorkerImpl*)worker->impl_; ChangeState(worker, NOT_OK); pthread_join(impl->thread_, NULL); pthread_mutex_destroy(&impl->mutex_); pthread_cond_destroy(&impl->condition_); WebPSafeFree(impl); worker->impl_ = NULL; } #else worker->status_ = NOT_OK; assert(worker->impl_ == NULL); #endif assert(worker->status_ == NOT_OK); } //------------------------------------------------------------------------------ static WebPWorkerInterface g_worker_interface = { Init, Reset, Sync, Launch, Execute, End }; int WebPSetWorkerInterface(const WebPWorkerInterface* const winterface) { if (winterface == NULL || winterface->Init == NULL || winterface->Reset == NULL || winterface->Sync == NULL || winterface->Launch == NULL || winterface->Execute == NULL || winterface->End == NULL) { return 0; } g_worker_interface = *winterface; return 1; } const WebPWorkerInterface* WebPGetWorkerInterface(void) { return &g_worker_interface; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/huffman_encode_utils.h0000644000014400001440000000414414606317060016337 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // // Entropy encoding (Huffman) for webp lossless #ifndef WEBP_UTILS_HUFFMAN_ENCODE_UTILS_H_ #define WEBP_UTILS_HUFFMAN_ENCODE_UTILS_H_ #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Struct for holding the tree header in coded form. typedef struct { uint8_t code; // value (0..15) or escape code (16,17,18) uint8_t extra_bits; // extra bits for escape codes } HuffmanTreeToken; // Struct to represent the tree codes (depth and bits array). typedef struct { int num_symbols; // Number of symbols. uint8_t* code_lengths; // Code lengths of the symbols. uint16_t* codes; // Symbol Codes. } HuffmanTreeCode; // Struct to represent the Huffman tree. typedef struct { uint32_t total_count_; // Symbol frequency. int value_; // Symbol value. int pool_index_left_; // Index for the left sub-tree. int pool_index_right_; // Index for the right sub-tree. } HuffmanTree; // Turn the Huffman tree into a token sequence. // Returns the number of tokens used. int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode* const tree, HuffmanTreeToken* tokens, int max_tokens); // Create an optimized tree, and tokenize it. // 'buf_rle' and 'huff_tree' are pre-allocated and the 'tree' is the constructed // huffman code tree. void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit, uint8_t* const buf_rle, HuffmanTree* const huff_tree, HuffmanTreeCode* const huff_code); #ifdef __cplusplus } #endif #endif // WEBP_UTILS_HUFFMAN_ENCODE_UTILS_H_ libwebp-1.4.0/src/utils/bit_reader_utils.c0000644000014400001440000002144514606317060015474 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Boolean decoder non-inlined methods // // Author: Skal (pascal.massimino@gmail.com) #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/dsp/cpu.h" #include "src/utils/bit_reader_inl_utils.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // VP8BitReader void VP8BitReaderSetBuffer(VP8BitReader* const br, const uint8_t* const start, size_t size) { br->buf_ = start; br->buf_end_ = start + size; br->buf_max_ = (size >= sizeof(lbit_t)) ? start + size - sizeof(lbit_t) + 1 : start; } void VP8InitBitReader(VP8BitReader* const br, const uint8_t* const start, size_t size) { assert(br != NULL); assert(start != NULL); assert(size < (1u << 31)); // limit ensured by format and upstream checks br->range_ = 255 - 1; br->value_ = 0; br->bits_ = -8; // to load the very first 8bits br->eof_ = 0; VP8BitReaderSetBuffer(br, start, size); VP8LoadNewBytes(br); } void VP8RemapBitReader(VP8BitReader* const br, ptrdiff_t offset) { if (br->buf_ != NULL) { br->buf_ += offset; br->buf_end_ += offset; br->buf_max_ += offset; } } const uint8_t kVP8Log2Range[128] = { 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }; // range = ((range - 1) << kVP8Log2Range[range]) + 1 const uint8_t kVP8NewRange[128] = { 127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239, 127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239, 247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 127 }; void VP8LoadFinalBytes(VP8BitReader* const br) { assert(br != NULL && br->buf_ != NULL); // Only read 8bits at a time if (br->buf_ < br->buf_end_) { br->bits_ += 8; br->value_ = (bit_t)(*br->buf_++) | (br->value_ << 8); } else if (!br->eof_) { br->value_ <<= 8; br->bits_ += 8; br->eof_ = 1; } else { br->bits_ = 0; // This is to avoid undefined behaviour with shifts. } } //------------------------------------------------------------------------------ // Higher-level calls uint32_t VP8GetValue(VP8BitReader* const br, int bits, const char label[]) { uint32_t v = 0; while (bits-- > 0) { v |= VP8GetBit(br, 0x80, label) << bits; } return v; } int32_t VP8GetSignedValue(VP8BitReader* const br, int bits, const char label[]) { const int value = VP8GetValue(br, bits, label); return VP8Get(br, label) ? -value : value; } //------------------------------------------------------------------------------ // VP8LBitReader #define VP8L_LOG8_WBITS 4 // Number of bytes needed to store VP8L_WBITS bits. #if defined(__arm__) || defined(_M_ARM) || WEBP_AARCH64 || \ defined(__i386__) || defined(_M_IX86) || \ defined(__x86_64__) || defined(_M_X64) #define VP8L_USE_FAST_LOAD #endif static const uint32_t kBitMask[VP8L_MAX_NUM_BIT_READ + 1] = { 0, 0x000001, 0x000003, 0x000007, 0x00000f, 0x00001f, 0x00003f, 0x00007f, 0x0000ff, 0x0001ff, 0x0003ff, 0x0007ff, 0x000fff, 0x001fff, 0x003fff, 0x007fff, 0x00ffff, 0x01ffff, 0x03ffff, 0x07ffff, 0x0fffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff }; void VP8LInitBitReader(VP8LBitReader* const br, const uint8_t* const start, size_t length) { size_t i; vp8l_val_t value = 0; assert(br != NULL); assert(start != NULL); assert(length < 0xfffffff8u); // can't happen with a RIFF chunk. br->len_ = length; br->val_ = 0; br->bit_pos_ = 0; br->eos_ = 0; if (length > sizeof(br->val_)) { length = sizeof(br->val_); } for (i = 0; i < length; ++i) { value |= (vp8l_val_t)start[i] << (8 * i); } br->val_ = value; br->pos_ = length; br->buf_ = start; } void VP8LBitReaderSetBuffer(VP8LBitReader* const br, const uint8_t* const buf, size_t len) { assert(br != NULL); assert(buf != NULL); assert(len < 0xfffffff8u); // can't happen with a RIFF chunk. br->buf_ = buf; br->len_ = len; // pos_ > len_ should be considered a param error. br->eos_ = (br->pos_ > br->len_) || VP8LIsEndOfStream(br); } static void VP8LSetEndOfStream(VP8LBitReader* const br) { br->eos_ = 1; br->bit_pos_ = 0; // To avoid undefined behaviour with shifts. } // If not at EOS, reload up to VP8L_LBITS byte-by-byte static void ShiftBytes(VP8LBitReader* const br) { while (br->bit_pos_ >= 8 && br->pos_ < br->len_) { br->val_ >>= 8; br->val_ |= ((vp8l_val_t)br->buf_[br->pos_]) << (VP8L_LBITS - 8); ++br->pos_; br->bit_pos_ -= 8; } if (VP8LIsEndOfStream(br)) { VP8LSetEndOfStream(br); } } void VP8LDoFillBitWindow(VP8LBitReader* const br) { assert(br->bit_pos_ >= VP8L_WBITS); #if defined(VP8L_USE_FAST_LOAD) if (br->pos_ + sizeof(br->val_) < br->len_) { br->val_ >>= VP8L_WBITS; br->bit_pos_ -= VP8L_WBITS; br->val_ |= (vp8l_val_t)HToLE32(WebPMemToUint32(br->buf_ + br->pos_)) << (VP8L_LBITS - VP8L_WBITS); br->pos_ += VP8L_LOG8_WBITS; return; } #endif ShiftBytes(br); // Slow path. } uint32_t VP8LReadBits(VP8LBitReader* const br, int n_bits) { assert(n_bits >= 0); // Flag an error if end_of_stream or n_bits is more than allowed limit. if (!br->eos_ && n_bits <= VP8L_MAX_NUM_BIT_READ) { const uint32_t val = VP8LPrefetchBits(br) & kBitMask[n_bits]; const int new_bits = br->bit_pos_ + n_bits; br->bit_pos_ = new_bits; ShiftBytes(br); return val; } else { VP8LSetEndOfStream(br); return 0; } } //------------------------------------------------------------------------------ // Bit-tracing tool #if (BITTRACE > 0) #include // for atexit() #include #include #define MAX_NUM_LABELS 32 static struct { const char* label; int size; int count; } kLabels[MAX_NUM_LABELS]; static int last_label = 0; static int last_pos = 0; static const uint8_t* buf_start = NULL; static int init_done = 0; static void PrintBitTraces(void) { int i; int scale = 1; int total = 0; const char* units = "bits"; #if (BITTRACE == 2) scale = 8; units = "bytes"; #endif for (i = 0; i < last_label; ++i) total += kLabels[i].size; if (total < 1) total = 1; // avoid rounding errors printf("=== Bit traces ===\n"); for (i = 0; i < last_label; ++i) { const int skip = 16 - (int)strlen(kLabels[i].label); const int value = (kLabels[i].size + scale - 1) / scale; assert(skip > 0); printf("%s \%*s: %6d %s \t[%5.2f%%] [count: %7d]\n", kLabels[i].label, skip, "", value, units, 100.f * kLabels[i].size / total, kLabels[i].count); } total = (total + scale - 1) / scale; printf("Total: %d %s\n", total, units); } void BitTrace(const struct VP8BitReader* const br, const char label[]) { int i, pos; if (!init_done) { memset(kLabels, 0, sizeof(kLabels)); atexit(PrintBitTraces); buf_start = br->buf_; init_done = 1; } pos = (int)(br->buf_ - buf_start) * 8 - br->bits_; // if there's a too large jump, we've changed partition -> reset counter if (abs(pos - last_pos) > 32) { buf_start = br->buf_; pos = 0; last_pos = 0; } if (br->range_ >= 0x7f) pos += kVP8Log2Range[br->range_ - 0x7f]; for (i = 0; i < last_label; ++i) { if (!strcmp(label, kLabels[i].label)) break; } if (i == MAX_NUM_LABELS) abort(); // overflow! kLabels[i].label = label; kLabels[i].size += pos - last_pos; kLabels[i].count += 1; if (i == last_label) ++last_label; last_pos = pos; } #endif // BITTRACE > 0 //------------------------------------------------------------------------------ libwebp-1.4.0/src/utils/palette.c0000644000014400001440000003275314606317060013616 0ustar // Copyright 2023 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Utilities for palette analysis. // // Author: Vincent Rabaud (vrabaud@google.com) #include "src/utils/palette.h" #include #include #include "src/dsp/lossless_common.h" #include "src/utils/color_cache_utils.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" // ----------------------------------------------------------------------------- // Palette reordering for smaller sum of deltas (and for smaller storage). static int PaletteCompareColorsForQsort(const void* p1, const void* p2) { const uint32_t a = WebPMemToUint32((uint8_t*)p1); const uint32_t b = WebPMemToUint32((uint8_t*)p2); assert(a != b); return (a < b) ? -1 : 1; } static WEBP_INLINE uint32_t PaletteComponentDistance(uint32_t v) { return (v <= 128) ? v : (256 - v); } // Computes a value that is related to the entropy created by the // palette entry diff. // // Note that the last & 0xff is a no-operation in the next statement, but // removed by most compilers and is here only for regularity of the code. static WEBP_INLINE uint32_t PaletteColorDistance(uint32_t col1, uint32_t col2) { const uint32_t diff = VP8LSubPixels(col1, col2); const int kMoreWeightForRGBThanForAlpha = 9; uint32_t score; score = PaletteComponentDistance((diff >> 0) & 0xff); score += PaletteComponentDistance((diff >> 8) & 0xff); score += PaletteComponentDistance((diff >> 16) & 0xff); score *= kMoreWeightForRGBThanForAlpha; score += PaletteComponentDistance((diff >> 24) & 0xff); return score; } static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) { const uint32_t tmp = *col1; *col1 = *col2; *col2 = tmp; } int SearchColorNoIdx(const uint32_t sorted[], uint32_t color, int num_colors) { int low = 0, hi = num_colors; if (sorted[low] == color) return low; // loop invariant: sorted[low] != color while (1) { const int mid = (low + hi) >> 1; if (sorted[mid] == color) { return mid; } else if (sorted[mid] < color) { low = mid; } else { hi = mid; } } assert(0); return 0; } void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors, uint32_t sorted[], uint32_t idx_map[]) { uint32_t i; memcpy(sorted, palette, num_colors * sizeof(*sorted)); qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort); for (i = 0; i < num_colors; ++i) { idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i; } } //------------------------------------------------------------------------------ #define COLOR_HASH_SIZE (MAX_PALETTE_SIZE * 4) #define COLOR_HASH_RIGHT_SHIFT 22 // 32 - log2(COLOR_HASH_SIZE). int GetColorPalette(const WebPPicture* const pic, uint32_t* const palette) { int i; int x, y; int num_colors = 0; uint8_t in_use[COLOR_HASH_SIZE] = {0}; uint32_t colors[COLOR_HASH_SIZE] = {0}; const uint32_t* argb = pic->argb; const int width = pic->width; const int height = pic->height; uint32_t last_pix = ~argb[0]; // so we're sure that last_pix != argb[0] assert(pic != NULL); assert(pic->use_argb); for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { int key; if (argb[x] == last_pix) { continue; } last_pix = argb[x]; key = VP8LHashPix(last_pix, COLOR_HASH_RIGHT_SHIFT); while (1) { if (!in_use[key]) { colors[key] = last_pix; in_use[key] = 1; ++num_colors; if (num_colors > MAX_PALETTE_SIZE) { return MAX_PALETTE_SIZE + 1; // Exact count not needed. } break; } else if (colors[key] == last_pix) { break; // The color is already there. } else { // Some other color sits here, so do linear conflict resolution. ++key; key &= (COLOR_HASH_SIZE - 1); // Key mask. } } } argb += pic->argb_stride; } if (palette != NULL) { // Fill the colors into palette. num_colors = 0; for (i = 0; i < COLOR_HASH_SIZE; ++i) { if (in_use[i]) { palette[num_colors] = colors[i]; ++num_colors; } } qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort); } return num_colors; } #undef COLOR_HASH_SIZE #undef COLOR_HASH_RIGHT_SHIFT // ----------------------------------------------------------------------------- // The palette has been sorted by alpha. This function checks if the other // components of the palette have a monotonic development with regards to // position in the palette. If all have monotonic development, there is // no benefit to re-organize them greedily. A monotonic development // would be spotted in green-only situations (like lossy alpha) or gray-scale // images. static int PaletteHasNonMonotonousDeltas(const uint32_t* const palette, int num_colors) { uint32_t predict = 0x000000; int i; uint8_t sign_found = 0x00; for (i = 0; i < num_colors; ++i) { const uint32_t diff = VP8LSubPixels(palette[i], predict); const uint8_t rd = (diff >> 16) & 0xff; const uint8_t gd = (diff >> 8) & 0xff; const uint8_t bd = (diff >> 0) & 0xff; if (rd != 0x00) { sign_found |= (rd < 0x80) ? 1 : 2; } if (gd != 0x00) { sign_found |= (gd < 0x80) ? 8 : 16; } if (bd != 0x00) { sign_found |= (bd < 0x80) ? 64 : 128; } predict = palette[i]; } return (sign_found & (sign_found << 1)) != 0; // two consequent signs. } static void PaletteSortMinimizeDeltas(const uint32_t* const palette_sorted, int num_colors, uint32_t* const palette) { uint32_t predict = 0x00000000; int i, k; memcpy(palette, palette_sorted, num_colors * sizeof(*palette)); if (!PaletteHasNonMonotonousDeltas(palette_sorted, num_colors)) return; // Find greedily always the closest color of the predicted color to minimize // deltas in the palette. This reduces storage needs since the // palette is stored with delta encoding. for (i = 0; i < num_colors; ++i) { int best_ix = i; uint32_t best_score = ~0U; for (k = i; k < num_colors; ++k) { const uint32_t cur_score = PaletteColorDistance(palette[k], predict); if (best_score > cur_score) { best_score = cur_score; best_ix = k; } } SwapColor(&palette[best_ix], &palette[i]); predict = palette[i]; } } // ----------------------------------------------------------------------------- // Modified Zeng method from "A Survey on Palette Reordering // Methods for Improving the Compression of Color-Indexed Images" by Armando J. // Pinho and Antonio J. R. Neves. // Finds the biggest cooccurrence in the matrix. static void CoOccurrenceFindMax(const uint32_t* const cooccurrence, uint32_t num_colors, uint8_t* const c1, uint8_t* const c2) { // Find the index that is most frequently located adjacent to other // (different) indexes. uint32_t best_sum = 0u; uint32_t i, j, best_cooccurrence; *c1 = 0u; for (i = 0; i < num_colors; ++i) { uint32_t sum = 0; for (j = 0; j < num_colors; ++j) sum += cooccurrence[i * num_colors + j]; if (sum > best_sum) { best_sum = sum; *c1 = i; } } // Find the index that is most frequently found adjacent to *c1. *c2 = 0u; best_cooccurrence = 0u; for (i = 0; i < num_colors; ++i) { if (cooccurrence[*c1 * num_colors + i] > best_cooccurrence) { best_cooccurrence = cooccurrence[*c1 * num_colors + i]; *c2 = i; } } assert(*c1 != *c2); } // Builds the cooccurrence matrix static int CoOccurrenceBuild(const WebPPicture* const pic, const uint32_t* const palette, uint32_t num_colors, uint32_t* cooccurrence) { uint32_t *lines, *line_top, *line_current, *line_tmp; int x, y; const uint32_t* src = pic->argb; uint32_t prev_pix = ~src[0]; uint32_t prev_idx = 0u; uint32_t idx_map[MAX_PALETTE_SIZE] = {0}; uint32_t palette_sorted[MAX_PALETTE_SIZE]; lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines)); if (lines == NULL) { return 0; } line_top = &lines[0]; line_current = &lines[pic->width]; PrepareMapToPalette(palette, num_colors, palette_sorted, idx_map); for (y = 0; y < pic->height; ++y) { for (x = 0; x < pic->width; ++x) { const uint32_t pix = src[x]; if (pix != prev_pix) { prev_idx = idx_map[SearchColorNoIdx(palette_sorted, pix, num_colors)]; prev_pix = pix; } line_current[x] = prev_idx; // 4-connectivity is what works best as mentioned in "On the relation // between Memon's and the modified Zeng's palette reordering methods". if (x > 0 && prev_idx != line_current[x - 1]) { const uint32_t left_idx = line_current[x - 1]; ++cooccurrence[prev_idx * num_colors + left_idx]; ++cooccurrence[left_idx * num_colors + prev_idx]; } if (y > 0 && prev_idx != line_top[x]) { const uint32_t top_idx = line_top[x]; ++cooccurrence[prev_idx * num_colors + top_idx]; ++cooccurrence[top_idx * num_colors + prev_idx]; } } line_tmp = line_top; line_top = line_current; line_current = line_tmp; src += pic->argb_stride; } WebPSafeFree(lines); return 1; } struct Sum { uint8_t index; uint32_t sum; }; static int PaletteSortModifiedZeng(const WebPPicture* const pic, const uint32_t* const palette_in, uint32_t num_colors, uint32_t* const palette) { uint32_t i, j, ind; uint8_t remapping[MAX_PALETTE_SIZE]; uint32_t* cooccurrence; struct Sum sums[MAX_PALETTE_SIZE]; uint32_t first, last; uint32_t num_sums; // TODO(vrabaud) check whether one color images should use palette or not. if (num_colors <= 1) return 1; // Build the co-occurrence matrix. cooccurrence = (uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence)); if (cooccurrence == NULL) { return 0; } if (!CoOccurrenceBuild(pic, palette_in, num_colors, cooccurrence)) { WebPSafeFree(cooccurrence); return 0; } // Initialize the mapping list with the two best indices. CoOccurrenceFindMax(cooccurrence, num_colors, &remapping[0], &remapping[1]); // We need to append and prepend to the list of remapping. To this end, we // actually define the next start/end of the list as indices in a vector (with // a wrap around when the end is reached). first = 0; last = 1; num_sums = num_colors - 2; // -2 because we know the first two values if (num_sums > 0) { // Initialize the sums with the first two remappings and find the best one struct Sum* best_sum = &sums[0]; best_sum->index = 0u; best_sum->sum = 0u; for (i = 0, j = 0; i < num_colors; ++i) { if (i == remapping[0] || i == remapping[1]) continue; sums[j].index = i; sums[j].sum = cooccurrence[i * num_colors + remapping[0]] + cooccurrence[i * num_colors + remapping[1]]; if (sums[j].sum > best_sum->sum) best_sum = &sums[j]; ++j; } while (num_sums > 0) { const uint8_t best_index = best_sum->index; // Compute delta to know if we need to prepend or append the best index. int32_t delta = 0; const int32_t n = num_colors - num_sums; for (ind = first, j = 0; (ind + j) % num_colors != last + 1; ++j) { const uint16_t l_j = remapping[(ind + j) % num_colors]; delta += (n - 1 - 2 * (int32_t)j) * (int32_t)cooccurrence[best_index * num_colors + l_j]; } if (delta > 0) { first = (first == 0) ? num_colors - 1 : first - 1; remapping[first] = best_index; } else { ++last; remapping[last] = best_index; } // Remove best_sum from sums. *best_sum = sums[num_sums - 1]; --num_sums; // Update all the sums and find the best one. best_sum = &sums[0]; for (i = 0; i < num_sums; ++i) { sums[i].sum += cooccurrence[best_index * num_colors + sums[i].index]; if (sums[i].sum > best_sum->sum) best_sum = &sums[i]; } } } assert((last + 1) % num_colors == first); WebPSafeFree(cooccurrence); // Re-map the palette. for (i = 0; i < num_colors; ++i) { palette[i] = palette_in[remapping[(first + i) % num_colors]]; } return 1; } // ----------------------------------------------------------------------------- int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic, const uint32_t* const palette_sorted, uint32_t num_colors, uint32_t* const palette) { switch (method) { case kSortedDefault: // Nothing to do, we have already sorted the palette. memcpy(palette, palette_sorted, num_colors * sizeof(*palette)); return 1; case kMinimizeDelta: PaletteSortMinimizeDeltas(palette_sorted, num_colors, palette); return 1; case kModifiedZeng: return PaletteSortModifiedZeng(pic, palette_sorted, num_colors, palette); case kUnusedPalette: case kPaletteSortingNum: break; } assert(0); return 0; } libwebp-1.4.0/src/utils/quant_levels_utils.h0000644000014400001440000000226314606317060016100 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha plane quantization utility // // Author: Vikas Arora (vikasa@google.com) #ifndef WEBP_UTILS_QUANT_LEVELS_UTILS_H_ #define WEBP_UTILS_QUANT_LEVELS_UTILS_H_ #include #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Replace the input 'data' of size 'width'x'height' with 'num-levels' // quantized values. If not NULL, 'sse' will contain the sum of squared error. // Valid range for 'num_levels' is [2, 256]. // Returns false in case of error (data is NULL, or parameters are invalid). int QuantizeLevels(uint8_t* const data, int width, int height, int num_levels, uint64_t* const sse); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_UTILS_QUANT_LEVELS_UTILS_H_ libwebp-1.4.0/src/libwebp.rc0000644000014400001440000000177414606317060012625 0ustar #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" #undef APSTUDIO_READONLY_SYMBOLS #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,4,0 PRODUCTVERSION 1,0,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Google, Inc." VALUE "FileDescription", "libwebp DLL" VALUE "FileVersion", "1.4.0" VALUE "InternalName", "libwebp.dll" VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "libwebp.dll" VALUE "ProductName", "WebP Image Codec" VALUE "ProductVersion", "1.4.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources libwebp-1.4.0/src/mux/0000755000014400001440000000000014606317244011457 5ustar libwebp-1.4.0/src/mux/libwebpmux.pc.in0000644000014400001440000000050614606317060014563 0ustar prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libwebpmux Description: Library for manipulating the WebP graphics format container Version: @PACKAGE_VERSION@ Requires.private: libwebp >= 0.2.0 Cflags: -I${includedir} Libs: -L${libdir} -l@webp_libname_prefix@webpmux Libs.private: -lm libwebp-1.4.0/src/mux/animi.h0000644000014400001440000000306114606317060012721 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Internal header for animation related functions. // // Author: Hui Su (huisu@google.com) #ifndef WEBP_MUX_ANIMI_H_ #define WEBP_MUX_ANIMI_H_ #include "src/webp/mux.h" #ifdef __cplusplus extern "C" { #endif // Picks the optimal rectangle between two pictures, starting with initial // values of offsets and dimensions that are passed in. The initial // values will be clipped, if necessary, to make sure the rectangle is // within the canvas. "use_argb" must be true for both pictures. // Parameters: // prev_canvas, curr_canvas - (in) two input pictures to compare. // is_lossless, quality - (in) encoding settings. // x_offset, y_offset, width, height - (in/out) rectangle between the two // input pictures. // Returns true on success. int WebPAnimEncoderRefineRect( const struct WebPPicture* const prev_canvas, const struct WebPPicture* const curr_canvas, int is_lossless, float quality, int* const x_offset, int* const y_offset, int* const width, int* const height); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_MUX_ANIMI_H_ libwebp-1.4.0/src/mux/muxinternal.c0000644000014400001440000004272414606317060014176 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Internal objects and utils for mux. // // Authors: Urvang (urvang@google.com) // Vikas (vikasa@google.com) #include #include "src/mux/muxi.h" #include "src/utils/utils.h" #define UNDEFINED_CHUNK_SIZE ((uint32_t)(-1)) const ChunkInfo kChunks[] = { { MKFOURCC('V', 'P', '8', 'X'), WEBP_CHUNK_VP8X, VP8X_CHUNK_SIZE }, { MKFOURCC('I', 'C', 'C', 'P'), WEBP_CHUNK_ICCP, UNDEFINED_CHUNK_SIZE }, { MKFOURCC('A', 'N', 'I', 'M'), WEBP_CHUNK_ANIM, ANIM_CHUNK_SIZE }, { MKFOURCC('A', 'N', 'M', 'F'), WEBP_CHUNK_ANMF, ANMF_CHUNK_SIZE }, { MKFOURCC('A', 'L', 'P', 'H'), WEBP_CHUNK_ALPHA, UNDEFINED_CHUNK_SIZE }, { MKFOURCC('V', 'P', '8', ' '), WEBP_CHUNK_IMAGE, UNDEFINED_CHUNK_SIZE }, { MKFOURCC('V', 'P', '8', 'L'), WEBP_CHUNK_IMAGE, UNDEFINED_CHUNK_SIZE }, { MKFOURCC('E', 'X', 'I', 'F'), WEBP_CHUNK_EXIF, UNDEFINED_CHUNK_SIZE }, { MKFOURCC('X', 'M', 'P', ' '), WEBP_CHUNK_XMP, UNDEFINED_CHUNK_SIZE }, { NIL_TAG, WEBP_CHUNK_UNKNOWN, UNDEFINED_CHUNK_SIZE }, { NIL_TAG, WEBP_CHUNK_NIL, UNDEFINED_CHUNK_SIZE } }; //------------------------------------------------------------------------------ int WebPGetMuxVersion(void) { return (MUX_MAJ_VERSION << 16) | (MUX_MIN_VERSION << 8) | MUX_REV_VERSION; } //------------------------------------------------------------------------------ // Life of a chunk object. void ChunkInit(WebPChunk* const chunk) { assert(chunk); memset(chunk, 0, sizeof(*chunk)); chunk->tag_ = NIL_TAG; } WebPChunk* ChunkRelease(WebPChunk* const chunk) { WebPChunk* next; if (chunk == NULL) return NULL; if (chunk->owner_) { WebPDataClear(&chunk->data_); } next = chunk->next_; ChunkInit(chunk); return next; } //------------------------------------------------------------------------------ // Chunk misc methods. CHUNK_INDEX ChunkGetIndexFromTag(uint32_t tag) { int i; for (i = 0; kChunks[i].tag != NIL_TAG; ++i) { if (tag == kChunks[i].tag) return (CHUNK_INDEX)i; } return IDX_UNKNOWN; } WebPChunkId ChunkGetIdFromTag(uint32_t tag) { int i; for (i = 0; kChunks[i].tag != NIL_TAG; ++i) { if (tag == kChunks[i].tag) return kChunks[i].id; } return WEBP_CHUNK_UNKNOWN; } uint32_t ChunkGetTagFromFourCC(const char fourcc[4]) { return MKFOURCC(fourcc[0], fourcc[1], fourcc[2], fourcc[3]); } CHUNK_INDEX ChunkGetIndexFromFourCC(const char fourcc[4]) { const uint32_t tag = ChunkGetTagFromFourCC(fourcc); return ChunkGetIndexFromTag(tag); } //------------------------------------------------------------------------------ // Chunk search methods. // Returns next chunk in the chunk list with the given tag. static WebPChunk* ChunkSearchNextInList(WebPChunk* chunk, uint32_t tag) { while (chunk != NULL && chunk->tag_ != tag) { chunk = chunk->next_; } return chunk; } WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag) { uint32_t iter = nth; first = ChunkSearchNextInList(first, tag); if (first == NULL) return NULL; while (--iter != 0) { WebPChunk* next_chunk = ChunkSearchNextInList(first->next_, tag); if (next_chunk == NULL) break; first = next_chunk; } return ((nth > 0) && (iter > 0)) ? NULL : first; } //------------------------------------------------------------------------------ // Chunk writer methods. WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data, int copy_data, uint32_t tag) { // For internally allocated chunks, always copy data & make it owner of data. if (tag == kChunks[IDX_VP8X].tag || tag == kChunks[IDX_ANIM].tag) { copy_data = 1; } ChunkRelease(chunk); if (data != NULL) { if (copy_data) { // Copy data. if (!WebPDataCopy(data, &chunk->data_)) return WEBP_MUX_MEMORY_ERROR; chunk->owner_ = 1; // Chunk is owner of data. } else { // Don't copy data. chunk->data_ = *data; } } chunk->tag_ = tag; return WEBP_MUX_OK; } WebPMuxError ChunkSetHead(WebPChunk* const chunk, WebPChunk** const chunk_list) { WebPChunk* new_chunk; assert(chunk_list != NULL); if (*chunk_list != NULL) { return WEBP_MUX_NOT_FOUND; } new_chunk = (WebPChunk*)WebPSafeMalloc(1ULL, sizeof(*new_chunk)); if (new_chunk == NULL) return WEBP_MUX_MEMORY_ERROR; *new_chunk = *chunk; chunk->owner_ = 0; new_chunk->next_ = NULL; *chunk_list = new_chunk; return WEBP_MUX_OK; } WebPMuxError ChunkAppend(WebPChunk* const chunk, WebPChunk*** const chunk_list) { WebPMuxError err; assert(chunk_list != NULL && *chunk_list != NULL); if (**chunk_list == NULL) { err = ChunkSetHead(chunk, *chunk_list); } else { WebPChunk* last_chunk = **chunk_list; while (last_chunk->next_ != NULL) last_chunk = last_chunk->next_; err = ChunkSetHead(chunk, &last_chunk->next_); if (err == WEBP_MUX_OK) *chunk_list = &last_chunk->next_; } return err; } //------------------------------------------------------------------------------ // Chunk deletion method(s). WebPChunk* ChunkDelete(WebPChunk* const chunk) { WebPChunk* const next = ChunkRelease(chunk); WebPSafeFree(chunk); return next; } void ChunkListDelete(WebPChunk** const chunk_list) { while (*chunk_list != NULL) { *chunk_list = ChunkDelete(*chunk_list); } } //------------------------------------------------------------------------------ // Chunk serialization methods. static uint8_t* ChunkEmit(const WebPChunk* const chunk, uint8_t* dst) { const size_t chunk_size = chunk->data_.size; assert(chunk); assert(chunk->tag_ != NIL_TAG); PutLE32(dst + 0, chunk->tag_); PutLE32(dst + TAG_SIZE, (uint32_t)chunk_size); assert(chunk_size == (uint32_t)chunk_size); memcpy(dst + CHUNK_HEADER_SIZE, chunk->data_.bytes, chunk_size); if (chunk_size & 1) dst[CHUNK_HEADER_SIZE + chunk_size] = 0; // Add padding. return dst + ChunkDiskSize(chunk); } uint8_t* ChunkListEmit(const WebPChunk* chunk_list, uint8_t* dst) { while (chunk_list != NULL) { dst = ChunkEmit(chunk_list, dst); chunk_list = chunk_list->next_; } return dst; } size_t ChunkListDiskSize(const WebPChunk* chunk_list) { size_t size = 0; while (chunk_list != NULL) { size += ChunkDiskSize(chunk_list); chunk_list = chunk_list->next_; } return size; } //------------------------------------------------------------------------------ // Life of a MuxImage object. void MuxImageInit(WebPMuxImage* const wpi) { assert(wpi); memset(wpi, 0, sizeof(*wpi)); } WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) { WebPMuxImage* next; if (wpi == NULL) return NULL; // There should be at most one chunk of header_, alpha_, img_ but we call // ChunkListDelete to be safe ChunkListDelete(&wpi->header_); ChunkListDelete(&wpi->alpha_); ChunkListDelete(&wpi->img_); ChunkListDelete(&wpi->unknown_); next = wpi->next_; MuxImageInit(wpi); return next; } //------------------------------------------------------------------------------ // MuxImage search methods. // Get a reference to appropriate chunk list within an image given chunk tag. static WebPChunk** GetChunkListFromId(const WebPMuxImage* const wpi, WebPChunkId id) { assert(wpi != NULL); switch (id) { case WEBP_CHUNK_ANMF: return (WebPChunk**)&wpi->header_; case WEBP_CHUNK_ALPHA: return (WebPChunk**)&wpi->alpha_; case WEBP_CHUNK_IMAGE: return (WebPChunk**)&wpi->img_; default: return NULL; } } int MuxImageCount(const WebPMuxImage* wpi_list, WebPChunkId id) { int count = 0; const WebPMuxImage* current; for (current = wpi_list; current != NULL; current = current->next_) { if (id == WEBP_CHUNK_NIL) { ++count; // Special case: count all images. } else { const WebPChunk* const wpi_chunk = *GetChunkListFromId(current, id); if (wpi_chunk != NULL) { const WebPChunkId wpi_chunk_id = ChunkGetIdFromTag(wpi_chunk->tag_); if (wpi_chunk_id == id) ++count; // Count images with a matching 'id'. } } } return count; } // Outputs a pointer to 'prev_wpi->next_', // where 'prev_wpi' is the pointer to the image at position (nth - 1). // Returns true if nth image was found. static int SearchImageToGetOrDelete(WebPMuxImage** wpi_list, uint32_t nth, WebPMuxImage*** const location) { uint32_t count = 0; assert(wpi_list); *location = wpi_list; if (nth == 0) { nth = MuxImageCount(*wpi_list, WEBP_CHUNK_NIL); if (nth == 0) return 0; // Not found. } while (*wpi_list != NULL) { WebPMuxImage* const cur_wpi = *wpi_list; ++count; if (count == nth) return 1; // Found. wpi_list = &cur_wpi->next_; *location = wpi_list; } return 0; // Not found. } //------------------------------------------------------------------------------ // MuxImage writer methods. WebPMuxError MuxImagePush(const WebPMuxImage* wpi, WebPMuxImage** wpi_list) { WebPMuxImage* new_wpi; while (*wpi_list != NULL) { WebPMuxImage* const cur_wpi = *wpi_list; if (cur_wpi->next_ == NULL) break; wpi_list = &cur_wpi->next_; } new_wpi = (WebPMuxImage*)WebPSafeMalloc(1ULL, sizeof(*new_wpi)); if (new_wpi == NULL) return WEBP_MUX_MEMORY_ERROR; *new_wpi = *wpi; new_wpi->next_ = NULL; if (*wpi_list != NULL) { (*wpi_list)->next_ = new_wpi; } else { *wpi_list = new_wpi; } return WEBP_MUX_OK; } //------------------------------------------------------------------------------ // MuxImage deletion methods. WebPMuxImage* MuxImageDelete(WebPMuxImage* const wpi) { // Delete the components of wpi. If wpi is NULL this is a noop. WebPMuxImage* const next = MuxImageRelease(wpi); WebPSafeFree(wpi); return next; } WebPMuxError MuxImageDeleteNth(WebPMuxImage** wpi_list, uint32_t nth) { assert(wpi_list); if (!SearchImageToGetOrDelete(wpi_list, nth, &wpi_list)) { return WEBP_MUX_NOT_FOUND; } *wpi_list = MuxImageDelete(*wpi_list); return WEBP_MUX_OK; } //------------------------------------------------------------------------------ // MuxImage reader methods. WebPMuxError MuxImageGetNth(const WebPMuxImage** wpi_list, uint32_t nth, WebPMuxImage** wpi) { assert(wpi_list); assert(wpi); if (!SearchImageToGetOrDelete((WebPMuxImage**)wpi_list, nth, (WebPMuxImage***)&wpi_list)) { return WEBP_MUX_NOT_FOUND; } *wpi = (WebPMuxImage*)*wpi_list; return WEBP_MUX_OK; } //------------------------------------------------------------------------------ // MuxImage serialization methods. // Size of an image. size_t MuxImageDiskSize(const WebPMuxImage* const wpi) { size_t size = 0; if (wpi->header_ != NULL) size += ChunkDiskSize(wpi->header_); if (wpi->alpha_ != NULL) size += ChunkDiskSize(wpi->alpha_); if (wpi->img_ != NULL) size += ChunkDiskSize(wpi->img_); if (wpi->unknown_ != NULL) size += ChunkListDiskSize(wpi->unknown_); return size; } // Special case as ANMF chunk encapsulates other image chunks. static uint8_t* ChunkEmitSpecial(const WebPChunk* const header, size_t total_size, uint8_t* dst) { const size_t header_size = header->data_.size; const size_t offset_to_next = total_size - CHUNK_HEADER_SIZE; assert(header->tag_ == kChunks[IDX_ANMF].tag); PutLE32(dst + 0, header->tag_); PutLE32(dst + TAG_SIZE, (uint32_t)offset_to_next); assert(header_size == (uint32_t)header_size); memcpy(dst + CHUNK_HEADER_SIZE, header->data_.bytes, header_size); if (header_size & 1) { dst[CHUNK_HEADER_SIZE + header_size] = 0; // Add padding. } return dst + ChunkDiskSize(header); } uint8_t* MuxImageEmit(const WebPMuxImage* const wpi, uint8_t* dst) { // Ordering of chunks to be emitted is strictly as follows: // 1. ANMF chunk (if present). // 2. ALPH chunk (if present). // 3. VP8/VP8L chunk. assert(wpi); if (wpi->header_ != NULL) { dst = ChunkEmitSpecial(wpi->header_, MuxImageDiskSize(wpi), dst); } if (wpi->alpha_ != NULL) dst = ChunkEmit(wpi->alpha_, dst); if (wpi->img_ != NULL) dst = ChunkEmit(wpi->img_, dst); if (wpi->unknown_ != NULL) dst = ChunkListEmit(wpi->unknown_, dst); return dst; } //------------------------------------------------------------------------------ // Helper methods for mux. int MuxHasAlpha(const WebPMuxImage* images) { while (images != NULL) { if (images->has_alpha_) return 1; images = images->next_; } return 0; } uint8_t* MuxEmitRiffHeader(uint8_t* const data, size_t size) { PutLE32(data + 0, MKFOURCC('R', 'I', 'F', 'F')); PutLE32(data + TAG_SIZE, (uint32_t)size - CHUNK_HEADER_SIZE); assert(size == (uint32_t)size); PutLE32(data + TAG_SIZE + CHUNK_SIZE_BYTES, MKFOURCC('W', 'E', 'B', 'P')); return data + RIFF_HEADER_SIZE; } WebPChunk** MuxGetChunkListFromId(const WebPMux* mux, WebPChunkId id) { assert(mux != NULL); switch (id) { case WEBP_CHUNK_VP8X: return (WebPChunk**)&mux->vp8x_; case WEBP_CHUNK_ICCP: return (WebPChunk**)&mux->iccp_; case WEBP_CHUNK_ANIM: return (WebPChunk**)&mux->anim_; case WEBP_CHUNK_EXIF: return (WebPChunk**)&mux->exif_; case WEBP_CHUNK_XMP: return (WebPChunk**)&mux->xmp_; default: return (WebPChunk**)&mux->unknown_; } } static int IsNotCompatible(int feature, int num_items) { return (feature != 0) != (num_items > 0); } #define NO_FLAG ((WebPFeatureFlags)0) // Test basic constraints: // retrieval, maximum number of chunks by index (use -1 to skip) // and feature incompatibility (use NO_FLAG to skip). // On success returns WEBP_MUX_OK and stores the chunk count in *num. static WebPMuxError ValidateChunk(const WebPMux* const mux, CHUNK_INDEX idx, WebPFeatureFlags feature, uint32_t vp8x_flags, int max, int* num) { const WebPMuxError err = WebPMuxNumChunks(mux, kChunks[idx].id, num); if (err != WEBP_MUX_OK) return err; if (max > -1 && *num > max) return WEBP_MUX_INVALID_ARGUMENT; if (feature != NO_FLAG && IsNotCompatible(vp8x_flags & feature, *num)) { return WEBP_MUX_INVALID_ARGUMENT; } return WEBP_MUX_OK; } WebPMuxError MuxValidate(const WebPMux* const mux) { int num_iccp; int num_exif; int num_xmp; int num_anim; int num_frames; int num_vp8x; int num_images; int num_alpha; uint32_t flags; WebPMuxError err; // Verify mux is not NULL. if (mux == NULL) return WEBP_MUX_INVALID_ARGUMENT; // Verify mux has at least one image. if (mux->images_ == NULL) return WEBP_MUX_INVALID_ARGUMENT; err = WebPMuxGetFeatures(mux, &flags); if (err != WEBP_MUX_OK) return err; // At most one color profile chunk. err = ValidateChunk(mux, IDX_ICCP, ICCP_FLAG, flags, 1, &num_iccp); if (err != WEBP_MUX_OK) return err; // At most one EXIF metadata. err = ValidateChunk(mux, IDX_EXIF, EXIF_FLAG, flags, 1, &num_exif); if (err != WEBP_MUX_OK) return err; // At most one XMP metadata. err = ValidateChunk(mux, IDX_XMP, XMP_FLAG, flags, 1, &num_xmp); if (err != WEBP_MUX_OK) return err; // Animation: ANIMATION_FLAG, ANIM chunk and ANMF chunk(s) are consistent. // At most one ANIM chunk. err = ValidateChunk(mux, IDX_ANIM, NO_FLAG, flags, 1, &num_anim); if (err != WEBP_MUX_OK) return err; err = ValidateChunk(mux, IDX_ANMF, NO_FLAG, flags, -1, &num_frames); if (err != WEBP_MUX_OK) return err; { const int has_animation = !!(flags & ANIMATION_FLAG); if (has_animation && (num_anim == 0 || num_frames == 0)) { return WEBP_MUX_INVALID_ARGUMENT; } if (!has_animation && (num_anim == 1 || num_frames > 0)) { return WEBP_MUX_INVALID_ARGUMENT; } if (!has_animation) { const WebPMuxImage* images = mux->images_; // There can be only one image. if (images == NULL || images->next_ != NULL) { return WEBP_MUX_INVALID_ARGUMENT; } // Size must match. if (mux->canvas_width_ > 0) { if (images->width_ != mux->canvas_width_ || images->height_ != mux->canvas_height_) { return WEBP_MUX_INVALID_ARGUMENT; } } } } // Verify either VP8X chunk is present OR there is only one elem in // mux->images_. err = ValidateChunk(mux, IDX_VP8X, NO_FLAG, flags, 1, &num_vp8x); if (err != WEBP_MUX_OK) return err; err = ValidateChunk(mux, IDX_VP8, NO_FLAG, flags, -1, &num_images); if (err != WEBP_MUX_OK) return err; if (num_vp8x == 0 && num_images != 1) return WEBP_MUX_INVALID_ARGUMENT; // ALPHA_FLAG & alpha chunk(s) are consistent. // Note: ALPHA_FLAG can be set when there is actually no Alpha data present. if (MuxHasAlpha(mux->images_)) { if (num_vp8x > 0) { // VP8X chunk is present, so it should contain ALPHA_FLAG. if (!(flags & ALPHA_FLAG)) return WEBP_MUX_INVALID_ARGUMENT; } else { // VP8X chunk is not present, so ALPH chunks should NOT be present either. err = WebPMuxNumChunks(mux, WEBP_CHUNK_ALPHA, &num_alpha); if (err != WEBP_MUX_OK) return err; if (num_alpha > 0) return WEBP_MUX_INVALID_ARGUMENT; } } return WEBP_MUX_OK; } #undef NO_FLAG //------------------------------------------------------------------------------ libwebp-1.4.0/src/mux/muxread.c0000644000014400001440000004614314606317060013274 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Read APIs for mux. // // Authors: Urvang (urvang@google.com) // Vikas (vikasa@google.com) #include #include "src/mux/muxi.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Helper method(s). // Handy MACRO. #define SWITCH_ID_LIST(INDEX, LIST) \ do { \ if (idx == (INDEX)) { \ const WebPChunk* const chunk = ChunkSearchList((LIST), nth, \ kChunks[(INDEX)].tag); \ if (chunk) { \ *data = chunk->data_; \ return WEBP_MUX_OK; \ } else { \ return WEBP_MUX_NOT_FOUND; \ } \ } \ } while (0) static WebPMuxError MuxGet(const WebPMux* const mux, CHUNK_INDEX idx, uint32_t nth, WebPData* const data) { assert(mux != NULL); assert(idx != IDX_LAST_CHUNK); assert(!IsWPI(kChunks[idx].id)); WebPDataInit(data); SWITCH_ID_LIST(IDX_VP8X, mux->vp8x_); SWITCH_ID_LIST(IDX_ICCP, mux->iccp_); SWITCH_ID_LIST(IDX_ANIM, mux->anim_); SWITCH_ID_LIST(IDX_EXIF, mux->exif_); SWITCH_ID_LIST(IDX_XMP, mux->xmp_); assert(idx != IDX_UNKNOWN); return WEBP_MUX_NOT_FOUND; } #undef SWITCH_ID_LIST // Fill the chunk with the given data (includes chunk header bytes), after some // verifications. static WebPMuxError ChunkVerifyAndAssign(WebPChunk* chunk, const uint8_t* data, size_t data_size, size_t riff_size, int copy_data) { uint32_t chunk_size; WebPData chunk_data; // Correctness checks. if (data_size < CHUNK_HEADER_SIZE) return WEBP_MUX_NOT_ENOUGH_DATA; chunk_size = GetLE32(data + TAG_SIZE); if (chunk_size > MAX_CHUNK_PAYLOAD) return WEBP_MUX_BAD_DATA; { const size_t chunk_disk_size = SizeWithPadding(chunk_size); if (chunk_disk_size > riff_size) return WEBP_MUX_BAD_DATA; if (chunk_disk_size > data_size) return WEBP_MUX_NOT_ENOUGH_DATA; } // Data assignment. chunk_data.bytes = data + CHUNK_HEADER_SIZE; chunk_data.size = chunk_size; return ChunkAssignData(chunk, &chunk_data, copy_data, GetLE32(data + 0)); } int MuxImageFinalize(WebPMuxImage* const wpi) { const WebPChunk* const img = wpi->img_; const WebPData* const image = &img->data_; const int is_lossless = (img->tag_ == kChunks[IDX_VP8L].tag); int w, h; int vp8l_has_alpha = 0; const int ok = is_lossless ? VP8LGetInfo(image->bytes, image->size, &w, &h, &vp8l_has_alpha) : VP8GetInfo(image->bytes, image->size, image->size, &w, &h); assert(img != NULL); if (ok) { // Ignore ALPH chunk accompanying VP8L. if (is_lossless && (wpi->alpha_ != NULL)) { ChunkDelete(wpi->alpha_); wpi->alpha_ = NULL; } wpi->width_ = w; wpi->height_ = h; wpi->has_alpha_ = vp8l_has_alpha || (wpi->alpha_ != NULL); } return ok; } static int MuxImageParse(const WebPChunk* const chunk, int copy_data, WebPMuxImage* const wpi) { const uint8_t* bytes = chunk->data_.bytes; size_t size = chunk->data_.size; const uint8_t* const last = (bytes == NULL) ? NULL : bytes + size; WebPChunk subchunk; size_t subchunk_size; WebPChunk** unknown_chunk_list = &wpi->unknown_; ChunkInit(&subchunk); assert(chunk->tag_ == kChunks[IDX_ANMF].tag); assert(!wpi->is_partial_); // ANMF. { const size_t hdr_size = ANMF_CHUNK_SIZE; const WebPData temp = { bytes, hdr_size }; // Each of ANMF chunk contain a header at the beginning. So, its size should // be at least 'hdr_size'. if (size < hdr_size) goto Fail; if (ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_) != WEBP_MUX_OK) { goto Fail; } } if (ChunkSetHead(&subchunk, &wpi->header_) != WEBP_MUX_OK) goto Fail; wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks. // Rest of the chunks. subchunk_size = ChunkDiskSize(&subchunk) - CHUNK_HEADER_SIZE; bytes += subchunk_size; size -= subchunk_size; while (bytes != last) { ChunkInit(&subchunk); if (ChunkVerifyAndAssign(&subchunk, bytes, size, size, copy_data) != WEBP_MUX_OK) { goto Fail; } switch (ChunkGetIdFromTag(subchunk.tag_)) { case WEBP_CHUNK_ALPHA: if (wpi->alpha_ != NULL) goto Fail; // Consecutive ALPH chunks. if (ChunkSetHead(&subchunk, &wpi->alpha_) != WEBP_MUX_OK) goto Fail; wpi->is_partial_ = 1; // Waiting for a VP8 chunk. break; case WEBP_CHUNK_IMAGE: if (wpi->img_ != NULL) goto Fail; // Only 1 image chunk allowed. if (ChunkSetHead(&subchunk, &wpi->img_) != WEBP_MUX_OK) goto Fail; if (!MuxImageFinalize(wpi)) goto Fail; wpi->is_partial_ = 0; // wpi is completely filled. break; case WEBP_CHUNK_UNKNOWN: if (wpi->is_partial_) { goto Fail; // Encountered an unknown chunk // before some image chunks. } if (ChunkAppend(&subchunk, &unknown_chunk_list) != WEBP_MUX_OK) { goto Fail; } break; default: goto Fail; } subchunk_size = ChunkDiskSize(&subchunk); bytes += subchunk_size; size -= subchunk_size; } if (wpi->is_partial_) goto Fail; return 1; Fail: ChunkRelease(&subchunk); return 0; } //------------------------------------------------------------------------------ // Create a mux object from WebP-RIFF data. WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data, int version) { size_t riff_size; uint32_t tag; const uint8_t* end; WebPMux* mux = NULL; WebPMuxImage* wpi = NULL; const uint8_t* data; size_t size; WebPChunk chunk; // Stores the end of the chunk lists so that it is faster to append data to // their ends. WebPChunk** chunk_list_ends[WEBP_CHUNK_NIL + 1] = { NULL }; ChunkInit(&chunk); if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_MUX_ABI_VERSION)) { return NULL; // version mismatch } if (bitstream == NULL) return NULL; data = bitstream->bytes; size = bitstream->size; if (data == NULL) return NULL; if (size < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE) return NULL; if (GetLE32(data + 0) != MKFOURCC('R', 'I', 'F', 'F') || GetLE32(data + CHUNK_HEADER_SIZE) != MKFOURCC('W', 'E', 'B', 'P')) { return NULL; } mux = WebPMuxNew(); if (mux == NULL) return NULL; tag = GetLE32(data + RIFF_HEADER_SIZE); if (tag != kChunks[IDX_VP8].tag && tag != kChunks[IDX_VP8L].tag && tag != kChunks[IDX_VP8X].tag) { goto Err; // First chunk should be VP8, VP8L or VP8X. } riff_size = GetLE32(data + TAG_SIZE); if (riff_size > MAX_CHUNK_PAYLOAD) goto Err; // Note this padding is historical and differs from demux.c which does not // pad the file size. riff_size = SizeWithPadding(riff_size); if (riff_size < CHUNK_HEADER_SIZE) goto Err; if (riff_size > size) goto Err; // There's no point in reading past the end of the RIFF chunk. if (size > riff_size + CHUNK_HEADER_SIZE) { size = riff_size + CHUNK_HEADER_SIZE; } end = data + size; data += RIFF_HEADER_SIZE; size -= RIFF_HEADER_SIZE; wpi = (WebPMuxImage*)WebPSafeMalloc(1ULL, sizeof(*wpi)); if (wpi == NULL) goto Err; MuxImageInit(wpi); // Loop over chunks. while (data != end) { size_t data_size; WebPChunkId id; if (ChunkVerifyAndAssign(&chunk, data, size, riff_size, copy_data) != WEBP_MUX_OK) { goto Err; } data_size = ChunkDiskSize(&chunk); id = ChunkGetIdFromTag(chunk.tag_); switch (id) { case WEBP_CHUNK_ALPHA: if (wpi->alpha_ != NULL) goto Err; // Consecutive ALPH chunks. if (ChunkSetHead(&chunk, &wpi->alpha_) != WEBP_MUX_OK) goto Err; wpi->is_partial_ = 1; // Waiting for a VP8 chunk. break; case WEBP_CHUNK_IMAGE: if (ChunkSetHead(&chunk, &wpi->img_) != WEBP_MUX_OK) goto Err; if (!MuxImageFinalize(wpi)) goto Err; wpi->is_partial_ = 0; // wpi is completely filled. PushImage: // Add this to mux->images_ list. if (MuxImagePush(wpi, &mux->images_) != WEBP_MUX_OK) goto Err; MuxImageInit(wpi); // Reset for reading next image. break; case WEBP_CHUNK_ANMF: if (wpi->is_partial_) goto Err; // Previous wpi is still incomplete. if (!MuxImageParse(&chunk, copy_data, wpi)) goto Err; ChunkRelease(&chunk); goto PushImage; default: // A non-image chunk. if (wpi->is_partial_) goto Err; // Encountered a non-image chunk before // getting all chunks of an image. if (chunk_list_ends[id] == NULL) { chunk_list_ends[id] = MuxGetChunkListFromId(mux, id); // List to add this chunk. } if (ChunkAppend(&chunk, &chunk_list_ends[id]) != WEBP_MUX_OK) goto Err; if (id == WEBP_CHUNK_VP8X) { // grab global specs if (data_size < CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE) goto Err; mux->canvas_width_ = GetLE24(data + 12) + 1; mux->canvas_height_ = GetLE24(data + 15) + 1; } break; } data += data_size; size -= data_size; ChunkInit(&chunk); } // Incomplete image. if (wpi->is_partial_) goto Err; // Validate mux if complete. if (MuxValidate(mux) != WEBP_MUX_OK) goto Err; MuxImageDelete(wpi); return mux; // All OK; Err: // Something bad happened. ChunkRelease(&chunk); MuxImageDelete(wpi); WebPMuxDelete(mux); return NULL; } //------------------------------------------------------------------------------ // Get API(s). // Validates that the given mux has a single image. static WebPMuxError ValidateForSingleImage(const WebPMux* const mux) { const int num_images = MuxImageCount(mux->images_, WEBP_CHUNK_IMAGE); const int num_frames = MuxImageCount(mux->images_, WEBP_CHUNK_ANMF); if (num_images == 0) { // No images in mux. return WEBP_MUX_NOT_FOUND; } else if (num_images == 1 && num_frames == 0) { // Valid case (single image). return WEBP_MUX_OK; } else { // Frame case OR an invalid mux. return WEBP_MUX_INVALID_ARGUMENT; } } // Get the canvas width, height and flags after validating that VP8X/VP8/VP8L // chunk and canvas size are valid. static WebPMuxError MuxGetCanvasInfo(const WebPMux* const mux, int* width, int* height, uint32_t* flags) { int w, h; uint32_t f = 0; WebPData data; assert(mux != NULL); // Check if VP8X chunk is present. if (MuxGet(mux, IDX_VP8X, 1, &data) == WEBP_MUX_OK) { if (data.size < VP8X_CHUNK_SIZE) return WEBP_MUX_BAD_DATA; f = GetLE32(data.bytes + 0); w = GetLE24(data.bytes + 4) + 1; h = GetLE24(data.bytes + 7) + 1; } else { const WebPMuxImage* const wpi = mux->images_; // Grab user-forced canvas size as default. w = mux->canvas_width_; h = mux->canvas_height_; if (w == 0 && h == 0 && ValidateForSingleImage(mux) == WEBP_MUX_OK) { // single image and not forced canvas size => use dimension of first frame assert(wpi != NULL); w = wpi->width_; h = wpi->height_; } if (wpi != NULL) { if (wpi->has_alpha_) f |= ALPHA_FLAG; } } if (w * (uint64_t)h >= MAX_IMAGE_AREA) return WEBP_MUX_BAD_DATA; if (width != NULL) *width = w; if (height != NULL) *height = h; if (flags != NULL) *flags = f; return WEBP_MUX_OK; } WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux, int* width, int* height) { if (mux == NULL || width == NULL || height == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } return MuxGetCanvasInfo(mux, width, height, NULL); } WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags) { if (mux == NULL || flags == NULL) return WEBP_MUX_INVALID_ARGUMENT; return MuxGetCanvasInfo(mux, NULL, NULL, flags); } static uint8_t* EmitVP8XChunk(uint8_t* const dst, int width, int height, uint32_t flags) { const size_t vp8x_size = CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE; assert(width >= 1 && height >= 1); assert(width <= MAX_CANVAS_SIZE && height <= MAX_CANVAS_SIZE); assert(width * (uint64_t)height < MAX_IMAGE_AREA); PutLE32(dst, MKFOURCC('V', 'P', '8', 'X')); PutLE32(dst + TAG_SIZE, VP8X_CHUNK_SIZE); PutLE32(dst + CHUNK_HEADER_SIZE, flags); PutLE24(dst + CHUNK_HEADER_SIZE + 4, width - 1); PutLE24(dst + CHUNK_HEADER_SIZE + 7, height - 1); return dst + vp8x_size; } // Assemble a single image WebP bitstream from 'wpi'. static WebPMuxError SynthesizeBitstream(const WebPMuxImage* const wpi, WebPData* const bitstream) { uint8_t* dst; // Allocate data. const int need_vp8x = (wpi->alpha_ != NULL); const size_t vp8x_size = need_vp8x ? CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE : 0; const size_t alpha_size = need_vp8x ? ChunkDiskSize(wpi->alpha_) : 0; // Note: No need to output ANMF chunk for a single image. const size_t size = RIFF_HEADER_SIZE + vp8x_size + alpha_size + ChunkDiskSize(wpi->img_); uint8_t* const data = (uint8_t*)WebPSafeMalloc(1ULL, size); if (data == NULL) return WEBP_MUX_MEMORY_ERROR; // There should be at most one alpha_ chunk and exactly one img_ chunk. assert(wpi->alpha_ == NULL || wpi->alpha_->next_ == NULL); assert(wpi->img_ != NULL && wpi->img_->next_ == NULL); // Main RIFF header. dst = MuxEmitRiffHeader(data, size); if (need_vp8x) { dst = EmitVP8XChunk(dst, wpi->width_, wpi->height_, ALPHA_FLAG); // VP8X. dst = ChunkListEmit(wpi->alpha_, dst); // ALPH. } // Bitstream. dst = ChunkListEmit(wpi->img_, dst); assert(dst == data + size); // Output. bitstream->bytes = data; bitstream->size = size; return WEBP_MUX_OK; } WebPMuxError WebPMuxGetChunk(const WebPMux* mux, const char fourcc[4], WebPData* chunk_data) { CHUNK_INDEX idx; if (mux == NULL || fourcc == NULL || chunk_data == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } idx = ChunkGetIndexFromFourCC(fourcc); assert(idx != IDX_LAST_CHUNK); if (IsWPI(kChunks[idx].id)) { // An image chunk. return WEBP_MUX_INVALID_ARGUMENT; } else if (idx != IDX_UNKNOWN) { // A known chunk type. return MuxGet(mux, idx, 1, chunk_data); } else { // An unknown chunk type. const WebPChunk* const chunk = ChunkSearchList(mux->unknown_, 1, ChunkGetTagFromFourCC(fourcc)); if (chunk == NULL) return WEBP_MUX_NOT_FOUND; *chunk_data = chunk->data_; return WEBP_MUX_OK; } } static WebPMuxError MuxGetImageInternal(const WebPMuxImage* const wpi, WebPMuxFrameInfo* const info) { // Set some defaults for unrelated fields. info->x_offset = 0; info->y_offset = 0; info->duration = 1; info->dispose_method = WEBP_MUX_DISPOSE_NONE; info->blend_method = WEBP_MUX_BLEND; // Extract data for related fields. info->id = ChunkGetIdFromTag(wpi->img_->tag_); return SynthesizeBitstream(wpi, &info->bitstream); } static WebPMuxError MuxGetFrameInternal(const WebPMuxImage* const wpi, WebPMuxFrameInfo* const frame) { const int is_frame = (wpi->header_->tag_ == kChunks[IDX_ANMF].tag); const WebPData* frame_data; if (!is_frame) return WEBP_MUX_INVALID_ARGUMENT; assert(wpi->header_ != NULL); // Already checked by WebPMuxGetFrame(). // Get frame chunk. frame_data = &wpi->header_->data_; if (frame_data->size < kChunks[IDX_ANMF].size) return WEBP_MUX_BAD_DATA; // Extract info. frame->x_offset = 2 * GetLE24(frame_data->bytes + 0); frame->y_offset = 2 * GetLE24(frame_data->bytes + 3); { const uint8_t bits = frame_data->bytes[15]; frame->duration = GetLE24(frame_data->bytes + 12); frame->dispose_method = (bits & 1) ? WEBP_MUX_DISPOSE_BACKGROUND : WEBP_MUX_DISPOSE_NONE; frame->blend_method = (bits & 2) ? WEBP_MUX_NO_BLEND : WEBP_MUX_BLEND; } frame->id = ChunkGetIdFromTag(wpi->header_->tag_); return SynthesizeBitstream(wpi, &frame->bitstream); } WebPMuxError WebPMuxGetFrame( const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame) { WebPMuxError err; WebPMuxImage* wpi; if (mux == NULL || frame == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } // Get the nth WebPMuxImage. err = MuxImageGetNth((const WebPMuxImage**)&mux->images_, nth, &wpi); if (err != WEBP_MUX_OK) return err; // Get frame info. if (wpi->header_ == NULL) { return MuxGetImageInternal(wpi, frame); } else { return MuxGetFrameInternal(wpi, frame); } } WebPMuxError WebPMuxGetAnimationParams(const WebPMux* mux, WebPMuxAnimParams* params) { WebPData anim; WebPMuxError err; if (mux == NULL || params == NULL) return WEBP_MUX_INVALID_ARGUMENT; err = MuxGet(mux, IDX_ANIM, 1, &anim); if (err != WEBP_MUX_OK) return err; if (anim.size < kChunks[WEBP_CHUNK_ANIM].size) return WEBP_MUX_BAD_DATA; params->bgcolor = GetLE32(anim.bytes); params->loop_count = GetLE16(anim.bytes + 4); return WEBP_MUX_OK; } // Get chunk index from chunk id. Returns IDX_NIL if not found. static CHUNK_INDEX ChunkGetIndexFromId(WebPChunkId id) { int i; for (i = 0; kChunks[i].id != WEBP_CHUNK_NIL; ++i) { if (id == kChunks[i].id) return (CHUNK_INDEX)i; } return IDX_NIL; } // Count number of chunks matching 'tag' in the 'chunk_list'. // If tag == NIL_TAG, any tag will be matched. static int CountChunks(const WebPChunk* const chunk_list, uint32_t tag) { int count = 0; const WebPChunk* current; for (current = chunk_list; current != NULL; current = current->next_) { if (tag == NIL_TAG || current->tag_ == tag) { count++; // Count chunks whose tags match. } } return count; } WebPMuxError WebPMuxNumChunks(const WebPMux* mux, WebPChunkId id, int* num_elements) { if (mux == NULL || num_elements == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } if (IsWPI(id)) { *num_elements = MuxImageCount(mux->images_, id); } else { WebPChunk* const* chunk_list = MuxGetChunkListFromId(mux, id); const CHUNK_INDEX idx = ChunkGetIndexFromId(id); *num_elements = CountChunks(*chunk_list, kChunks[idx].tag); } return WEBP_MUX_OK; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/mux/muxi.h0000644000014400001440000001710114606317060012606 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Internal header for mux library. // // Author: Urvang (urvang@google.com) #ifndef WEBP_MUX_MUXI_H_ #define WEBP_MUX_MUXI_H_ #include #include #include "src/dec/vp8i_dec.h" #include "src/dec/vp8li_dec.h" #include "src/webp/mux.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Defines and constants. #define MUX_MAJ_VERSION 1 #define MUX_MIN_VERSION 4 #define MUX_REV_VERSION 0 // Chunk object. typedef struct WebPChunk WebPChunk; struct WebPChunk { uint32_t tag_; int owner_; // True if *data_ memory is owned internally. // VP8X, ANIM, and other internally created chunks // like ANMF are always owned. WebPData data_; WebPChunk* next_; }; // MuxImage object. Store a full WebP image (including ANMF chunk, ALPH // chunk and VP8/VP8L chunk), typedef struct WebPMuxImage WebPMuxImage; struct WebPMuxImage { WebPChunk* header_; // Corresponds to WEBP_CHUNK_ANMF. WebPChunk* alpha_; // Corresponds to WEBP_CHUNK_ALPHA. WebPChunk* img_; // Corresponds to WEBP_CHUNK_IMAGE. WebPChunk* unknown_; // Corresponds to WEBP_CHUNK_UNKNOWN. int width_; int height_; int has_alpha_; // Through ALPH chunk or as part of VP8L. int is_partial_; // True if only some of the chunks are filled. WebPMuxImage* next_; }; // Main mux object. Stores data chunks. struct WebPMux { WebPMuxImage* images_; WebPChunk* iccp_; WebPChunk* exif_; WebPChunk* xmp_; WebPChunk* anim_; WebPChunk* vp8x_; WebPChunk* unknown_; int canvas_width_; int canvas_height_; }; // CHUNK_INDEX enum: used for indexing within 'kChunks' (defined below) only. // Note: the reason for having two enums ('WebPChunkId' and 'CHUNK_INDEX') is to // allow two different chunks to have the same id (e.g. WebPChunkId // 'WEBP_CHUNK_IMAGE' can correspond to CHUNK_INDEX 'IDX_VP8' or 'IDX_VP8L'). typedef enum { IDX_VP8X = 0, IDX_ICCP, IDX_ANIM, IDX_ANMF, IDX_ALPHA, IDX_VP8, IDX_VP8L, IDX_EXIF, IDX_XMP, IDX_UNKNOWN, IDX_NIL, IDX_LAST_CHUNK } CHUNK_INDEX; #define NIL_TAG 0x00000000u // To signal void chunk. typedef struct { uint32_t tag; WebPChunkId id; uint32_t size; } ChunkInfo; extern const ChunkInfo kChunks[IDX_LAST_CHUNK]; //------------------------------------------------------------------------------ // Chunk object management. // Initialize. void ChunkInit(WebPChunk* const chunk); // Get chunk index from chunk tag. Returns IDX_UNKNOWN if not found. CHUNK_INDEX ChunkGetIndexFromTag(uint32_t tag); // Get chunk id from chunk tag. Returns WEBP_CHUNK_UNKNOWN if not found. WebPChunkId ChunkGetIdFromTag(uint32_t tag); // Convert a fourcc string to a tag. uint32_t ChunkGetTagFromFourCC(const char fourcc[4]); // Get chunk index from fourcc. Returns IDX_UNKNOWN if given fourcc is unknown. CHUNK_INDEX ChunkGetIndexFromFourCC(const char fourcc[4]); // Search for nth chunk with given 'tag' in the chunk list. // nth = 0 means "last of the list". WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag); // Fill the chunk with the given data. WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data, int copy_data, uint32_t tag); // Sets 'chunk' as the only element in 'chunk_list' if it is empty. // On success ownership is transferred from 'chunk' to the 'chunk_list'. WebPMuxError ChunkSetHead(WebPChunk* const chunk, WebPChunk** const chunk_list); // Sets 'chunk' at last position in the 'chunk_list'. // On success ownership is transferred from 'chunk' to the 'chunk_list'. // *chunk_list also points towards the last valid element of the initial // *chunk_list. WebPMuxError ChunkAppend(WebPChunk* const chunk, WebPChunk*** const chunk_list); // Releases chunk and returns chunk->next_. WebPChunk* ChunkRelease(WebPChunk* const chunk); // Deletes given chunk & returns chunk->next_. WebPChunk* ChunkDelete(WebPChunk* const chunk); // Deletes all chunks in the given chunk list. void ChunkListDelete(WebPChunk** const chunk_list); // Returns size of the chunk including chunk header and padding byte (if any). static WEBP_INLINE size_t SizeWithPadding(size_t chunk_size) { assert(chunk_size <= MAX_CHUNK_PAYLOAD); return CHUNK_HEADER_SIZE + ((chunk_size + 1) & ~1U); } // Size of a chunk including header and padding. static WEBP_INLINE size_t ChunkDiskSize(const WebPChunk* chunk) { const size_t data_size = chunk->data_.size; return SizeWithPadding(data_size); } // Total size of a list of chunks. size_t ChunkListDiskSize(const WebPChunk* chunk_list); // Write out the given list of chunks into 'dst'. uint8_t* ChunkListEmit(const WebPChunk* chunk_list, uint8_t* dst); //------------------------------------------------------------------------------ // MuxImage object management. // Initialize. void MuxImageInit(WebPMuxImage* const wpi); // Releases image 'wpi' and returns wpi->next. WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi); // Delete image 'wpi' and return the next image in the list or NULL. // 'wpi' can be NULL. WebPMuxImage* MuxImageDelete(WebPMuxImage* const wpi); // Count number of images matching the given tag id in the 'wpi_list'. // If id == WEBP_CHUNK_NIL, all images will be matched. int MuxImageCount(const WebPMuxImage* wpi_list, WebPChunkId id); // Update width/height/has_alpha info from chunks within wpi. // Also remove ALPH chunk if not needed. int MuxImageFinalize(WebPMuxImage* const wpi); // Check if given ID corresponds to an image related chunk. static WEBP_INLINE int IsWPI(WebPChunkId id) { switch (id) { case WEBP_CHUNK_ANMF: case WEBP_CHUNK_ALPHA: case WEBP_CHUNK_IMAGE: return 1; default: return 0; } } // Pushes 'wpi' at the end of 'wpi_list'. WebPMuxError MuxImagePush(const WebPMuxImage* wpi, WebPMuxImage** wpi_list); // Delete nth image in the image list. WebPMuxError MuxImageDeleteNth(WebPMuxImage** wpi_list, uint32_t nth); // Get nth image in the image list. WebPMuxError MuxImageGetNth(const WebPMuxImage** wpi_list, uint32_t nth, WebPMuxImage** wpi); // Total size of the given image. size_t MuxImageDiskSize(const WebPMuxImage* const wpi); // Write out the given image into 'dst'. uint8_t* MuxImageEmit(const WebPMuxImage* const wpi, uint8_t* dst); //------------------------------------------------------------------------------ // Helper methods for mux. // Checks if the given image list contains at least one image with alpha. int MuxHasAlpha(const WebPMuxImage* images); // Write out RIFF header into 'data', given total data size 'size'. uint8_t* MuxEmitRiffHeader(uint8_t* const data, size_t size); // Returns the list where chunk with given ID is to be inserted in mux. WebPChunk** MuxGetChunkListFromId(const WebPMux* mux, WebPChunkId id); // Validates the given mux object. WebPMuxError MuxValidate(const WebPMux* const mux); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_MUX_MUXI_H_ libwebp-1.4.0/src/mux/muxedit.c0000644000014400001440000005272614606317060013312 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Set and delete APIs for mux. // // Authors: Urvang (urvang@google.com) // Vikas (vikasa@google.com) #include #include "src/mux/muxi.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // Life of a mux object. static void MuxInit(WebPMux* const mux) { assert(mux != NULL); memset(mux, 0, sizeof(*mux)); mux->canvas_width_ = 0; // just to be explicit mux->canvas_height_ = 0; } WebPMux* WebPNewInternal(int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_MUX_ABI_VERSION)) { return NULL; } else { WebPMux* const mux = (WebPMux*)WebPSafeMalloc(1ULL, sizeof(WebPMux)); if (mux != NULL) MuxInit(mux); return mux; } } // Delete all images in 'wpi_list'. static void DeleteAllImages(WebPMuxImage** const wpi_list) { while (*wpi_list != NULL) { *wpi_list = MuxImageDelete(*wpi_list); } } static void MuxRelease(WebPMux* const mux) { assert(mux != NULL); DeleteAllImages(&mux->images_); ChunkListDelete(&mux->vp8x_); ChunkListDelete(&mux->iccp_); ChunkListDelete(&mux->anim_); ChunkListDelete(&mux->exif_); ChunkListDelete(&mux->xmp_); ChunkListDelete(&mux->unknown_); } void WebPMuxDelete(WebPMux* mux) { if (mux != NULL) { MuxRelease(mux); WebPSafeFree(mux); } } //------------------------------------------------------------------------------ // Helper method(s). // Handy MACRO, makes MuxSet() very symmetric to MuxGet(). #define SWITCH_ID_LIST(INDEX, LIST) \ do { \ if (idx == (INDEX)) { \ err = ChunkAssignData(&chunk, data, copy_data, tag); \ if (err == WEBP_MUX_OK) { \ err = ChunkSetHead(&chunk, (LIST)); \ if (err != WEBP_MUX_OK) ChunkRelease(&chunk); \ } \ return err; \ } \ } while (0) static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag, const WebPData* const data, int copy_data) { WebPChunk chunk; WebPMuxError err = WEBP_MUX_NOT_FOUND; const CHUNK_INDEX idx = ChunkGetIndexFromTag(tag); assert(mux != NULL); assert(!IsWPI(kChunks[idx].id)); ChunkInit(&chunk); SWITCH_ID_LIST(IDX_VP8X, &mux->vp8x_); SWITCH_ID_LIST(IDX_ICCP, &mux->iccp_); SWITCH_ID_LIST(IDX_ANIM, &mux->anim_); SWITCH_ID_LIST(IDX_EXIF, &mux->exif_); SWITCH_ID_LIST(IDX_XMP, &mux->xmp_); SWITCH_ID_LIST(IDX_UNKNOWN, &mux->unknown_); return err; } #undef SWITCH_ID_LIST // Create data for frame given image data, offsets and duration. static WebPMuxError CreateFrameData( int width, int height, const WebPMuxFrameInfo* const info, WebPData* const frame) { uint8_t* frame_bytes; const size_t frame_size = kChunks[IDX_ANMF].size; assert(width > 0 && height > 0 && info->duration >= 0); assert(info->dispose_method == (info->dispose_method & 1)); // Note: assertion on upper bounds is done in PutLE24(). frame_bytes = (uint8_t*)WebPSafeMalloc(1ULL, frame_size); if (frame_bytes == NULL) return WEBP_MUX_MEMORY_ERROR; PutLE24(frame_bytes + 0, info->x_offset / 2); PutLE24(frame_bytes + 3, info->y_offset / 2); PutLE24(frame_bytes + 6, width - 1); PutLE24(frame_bytes + 9, height - 1); PutLE24(frame_bytes + 12, info->duration); frame_bytes[15] = (info->blend_method == WEBP_MUX_NO_BLEND ? 2 : 0) | (info->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND ? 1 : 0); frame->bytes = frame_bytes; frame->size = frame_size; return WEBP_MUX_OK; } // Outputs image data given a bitstream. The bitstream can either be a // single-image WebP file or raw VP8/VP8L data. // Also outputs 'is_lossless' to be true if the given bitstream is lossless. static WebPMuxError GetImageData(const WebPData* const bitstream, WebPData* const image, WebPData* const alpha, int* const is_lossless) { WebPDataInit(alpha); // Default: no alpha. if (bitstream->size < TAG_SIZE || memcmp(bitstream->bytes, "RIFF", TAG_SIZE)) { // It is NOT webp file data. Return input data as is. *image = *bitstream; } else { // It is webp file data. Extract image data from it. const WebPMuxImage* wpi; WebPMux* const mux = WebPMuxCreate(bitstream, 0); if (mux == NULL) return WEBP_MUX_BAD_DATA; wpi = mux->images_; assert(wpi != NULL && wpi->img_ != NULL); *image = wpi->img_->data_; if (wpi->alpha_ != NULL) { *alpha = wpi->alpha_->data_; } WebPMuxDelete(mux); } *is_lossless = VP8LCheckSignature(image->bytes, image->size); return WEBP_MUX_OK; } static WebPMuxError DeleteChunks(WebPChunk** chunk_list, uint32_t tag) { WebPMuxError err = WEBP_MUX_NOT_FOUND; assert(chunk_list); while (*chunk_list) { WebPChunk* const chunk = *chunk_list; if (chunk->tag_ == tag) { *chunk_list = ChunkDelete(chunk); err = WEBP_MUX_OK; } else { chunk_list = &chunk->next_; } } return err; } static WebPMuxError MuxDeleteAllNamedData(WebPMux* const mux, uint32_t tag) { const WebPChunkId id = ChunkGetIdFromTag(tag); assert(mux != NULL); if (IsWPI(id)) return WEBP_MUX_INVALID_ARGUMENT; return DeleteChunks(MuxGetChunkListFromId(mux, id), tag); } //------------------------------------------------------------------------------ // Set API(s). WebPMuxError WebPMuxSetChunk(WebPMux* mux, const char fourcc[4], const WebPData* chunk_data, int copy_data) { uint32_t tag; WebPMuxError err; if (mux == NULL || fourcc == NULL || chunk_data == NULL || chunk_data->bytes == NULL || chunk_data->size > MAX_CHUNK_PAYLOAD) { return WEBP_MUX_INVALID_ARGUMENT; } tag = ChunkGetTagFromFourCC(fourcc); // Delete existing chunk(s) with the same 'fourcc'. err = MuxDeleteAllNamedData(mux, tag); if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err; // Add the given chunk. return MuxSet(mux, tag, chunk_data, copy_data); } // Creates a chunk from given 'data' and sets it as 1st chunk in 'chunk_list'. static WebPMuxError AddDataToChunkList( const WebPData* const data, int copy_data, uint32_t tag, WebPChunk** chunk_list) { WebPChunk chunk; WebPMuxError err; ChunkInit(&chunk); err = ChunkAssignData(&chunk, data, copy_data, tag); if (err != WEBP_MUX_OK) goto Err; err = ChunkSetHead(&chunk, chunk_list); if (err != WEBP_MUX_OK) goto Err; return WEBP_MUX_OK; Err: ChunkRelease(&chunk); return err; } // Extracts image & alpha data from the given bitstream and then sets wpi.alpha_ // and wpi.img_ appropriately. static WebPMuxError SetAlphaAndImageChunks( const WebPData* const bitstream, int copy_data, WebPMuxImage* const wpi) { int is_lossless = 0; WebPData image, alpha; WebPMuxError err = GetImageData(bitstream, &image, &alpha, &is_lossless); const int image_tag = is_lossless ? kChunks[IDX_VP8L].tag : kChunks[IDX_VP8].tag; if (err != WEBP_MUX_OK) return err; if (alpha.bytes != NULL) { err = AddDataToChunkList(&alpha, copy_data, kChunks[IDX_ALPHA].tag, &wpi->alpha_); if (err != WEBP_MUX_OK) return err; } err = AddDataToChunkList(&image, copy_data, image_tag, &wpi->img_); if (err != WEBP_MUX_OK) return err; return MuxImageFinalize(wpi) ? WEBP_MUX_OK : WEBP_MUX_INVALID_ARGUMENT; } WebPMuxError WebPMuxSetImage(WebPMux* mux, const WebPData* bitstream, int copy_data) { WebPMuxImage wpi; WebPMuxError err; if (mux == NULL || bitstream == NULL || bitstream->bytes == NULL || bitstream->size > MAX_CHUNK_PAYLOAD) { return WEBP_MUX_INVALID_ARGUMENT; } if (mux->images_ != NULL) { // Only one 'simple image' can be added in mux. So, remove present images. DeleteAllImages(&mux->images_); } MuxImageInit(&wpi); err = SetAlphaAndImageChunks(bitstream, copy_data, &wpi); if (err != WEBP_MUX_OK) goto Err; // Add this WebPMuxImage to mux. err = MuxImagePush(&wpi, &mux->images_); if (err != WEBP_MUX_OK) goto Err; // All is well. return WEBP_MUX_OK; Err: // Something bad happened. MuxImageRelease(&wpi); return err; } WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info, int copy_data) { WebPMuxImage wpi; WebPMuxError err; if (mux == NULL || info == NULL) return WEBP_MUX_INVALID_ARGUMENT; if (info->id != WEBP_CHUNK_ANMF) return WEBP_MUX_INVALID_ARGUMENT; if (info->bitstream.bytes == NULL || info->bitstream.size > MAX_CHUNK_PAYLOAD) { return WEBP_MUX_INVALID_ARGUMENT; } if (mux->images_ != NULL) { const WebPMuxImage* const image = mux->images_; const uint32_t image_id = (image->header_ != NULL) ? ChunkGetIdFromTag(image->header_->tag_) : WEBP_CHUNK_IMAGE; if (image_id != info->id) { return WEBP_MUX_INVALID_ARGUMENT; // Conflicting frame types. } } MuxImageInit(&wpi); err = SetAlphaAndImageChunks(&info->bitstream, copy_data, &wpi); if (err != WEBP_MUX_OK) goto Err; assert(wpi.img_ != NULL); // As SetAlphaAndImageChunks() was successful. { WebPData frame; const uint32_t tag = kChunks[IDX_ANMF].tag; WebPMuxFrameInfo tmp = *info; tmp.x_offset &= ~1; // Snap offsets to even. tmp.y_offset &= ~1; if (tmp.x_offset < 0 || tmp.x_offset >= MAX_POSITION_OFFSET || tmp.y_offset < 0 || tmp.y_offset >= MAX_POSITION_OFFSET || (tmp.duration < 0 || tmp.duration >= MAX_DURATION) || tmp.dispose_method != (tmp.dispose_method & 1)) { err = WEBP_MUX_INVALID_ARGUMENT; goto Err; } err = CreateFrameData(wpi.width_, wpi.height_, &tmp, &frame); if (err != WEBP_MUX_OK) goto Err; // Add frame chunk (with copy_data = 1). err = AddDataToChunkList(&frame, 1, tag, &wpi.header_); WebPDataClear(&frame); // frame owned by wpi.header_ now. if (err != WEBP_MUX_OK) goto Err; } // Add this WebPMuxImage to mux. err = MuxImagePush(&wpi, &mux->images_); if (err != WEBP_MUX_OK) goto Err; // All is well. return WEBP_MUX_OK; Err: // Something bad happened. MuxImageRelease(&wpi); return err; } WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux, const WebPMuxAnimParams* params) { WebPMuxError err; uint8_t data[ANIM_CHUNK_SIZE]; const WebPData anim = { data, ANIM_CHUNK_SIZE }; if (mux == NULL || params == NULL) return WEBP_MUX_INVALID_ARGUMENT; if (params->loop_count < 0 || params->loop_count >= MAX_LOOP_COUNT) { return WEBP_MUX_INVALID_ARGUMENT; } // Delete any existing ANIM chunk(s). err = MuxDeleteAllNamedData(mux, kChunks[IDX_ANIM].tag); if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err; // Set the animation parameters. PutLE32(data, params->bgcolor); PutLE16(data + 4, params->loop_count); return MuxSet(mux, kChunks[IDX_ANIM].tag, &anim, 1); } WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux, int width, int height) { WebPMuxError err; if (mux == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } if (width < 0 || height < 0 || width > MAX_CANVAS_SIZE || height > MAX_CANVAS_SIZE) { return WEBP_MUX_INVALID_ARGUMENT; } if (width * (uint64_t)height >= MAX_IMAGE_AREA) { return WEBP_MUX_INVALID_ARGUMENT; } if ((width * height) == 0 && (width | height) != 0) { // one of width / height is zero, but not both -> invalid! return WEBP_MUX_INVALID_ARGUMENT; } // If we already assembled a VP8X chunk, invalidate it. err = MuxDeleteAllNamedData(mux, kChunks[IDX_VP8X].tag); if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err; mux->canvas_width_ = width; mux->canvas_height_ = height; return WEBP_MUX_OK; } //------------------------------------------------------------------------------ // Delete API(s). WebPMuxError WebPMuxDeleteChunk(WebPMux* mux, const char fourcc[4]) { if (mux == NULL || fourcc == NULL) return WEBP_MUX_INVALID_ARGUMENT; return MuxDeleteAllNamedData(mux, ChunkGetTagFromFourCC(fourcc)); } WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth) { if (mux == NULL) return WEBP_MUX_INVALID_ARGUMENT; return MuxImageDeleteNth(&mux->images_, nth); } //------------------------------------------------------------------------------ // Assembly of the WebP RIFF file. static WebPMuxError GetFrameInfo( const WebPChunk* const frame_chunk, int* const x_offset, int* const y_offset, int* const duration) { const WebPData* const data = &frame_chunk->data_; const size_t expected_data_size = ANMF_CHUNK_SIZE; assert(frame_chunk->tag_ == kChunks[IDX_ANMF].tag); assert(frame_chunk != NULL); if (data->size != expected_data_size) return WEBP_MUX_INVALID_ARGUMENT; *x_offset = 2 * GetLE24(data->bytes + 0); *y_offset = 2 * GetLE24(data->bytes + 3); *duration = GetLE24(data->bytes + 12); return WEBP_MUX_OK; } static WebPMuxError GetImageInfo(const WebPMuxImage* const wpi, int* const x_offset, int* const y_offset, int* const duration, int* const width, int* const height) { const WebPChunk* const frame_chunk = wpi->header_; WebPMuxError err; assert(wpi != NULL); assert(frame_chunk != NULL); // Get offsets and duration from ANMF chunk. err = GetFrameInfo(frame_chunk, x_offset, y_offset, duration); if (err != WEBP_MUX_OK) return err; // Get width and height from VP8/VP8L chunk. if (width != NULL) *width = wpi->width_; if (height != NULL) *height = wpi->height_; return WEBP_MUX_OK; } // Returns the tightest dimension for the canvas considering the image list. static WebPMuxError GetAdjustedCanvasSize(const WebPMux* const mux, int* const width, int* const height) { WebPMuxImage* wpi = NULL; assert(mux != NULL); assert(width != NULL && height != NULL); wpi = mux->images_; assert(wpi != NULL); assert(wpi->img_ != NULL); if (wpi->next_ != NULL) { int max_x = 0, max_y = 0; // if we have a chain of wpi's, header_ is necessarily set assert(wpi->header_ != NULL); // Aggregate the bounding box for animation frames. for (; wpi != NULL; wpi = wpi->next_) { int x_offset = 0, y_offset = 0, duration = 0, w = 0, h = 0; const WebPMuxError err = GetImageInfo(wpi, &x_offset, &y_offset, &duration, &w, &h); const int max_x_pos = x_offset + w; const int max_y_pos = y_offset + h; if (err != WEBP_MUX_OK) return err; assert(x_offset < MAX_POSITION_OFFSET); assert(y_offset < MAX_POSITION_OFFSET); if (max_x_pos > max_x) max_x = max_x_pos; if (max_y_pos > max_y) max_y = max_y_pos; } *width = max_x; *height = max_y; } else { // For a single image, canvas dimensions are same as image dimensions. *width = wpi->width_; *height = wpi->height_; } return WEBP_MUX_OK; } // VP8X format: // Total Size : 10, // Flags : 4 bytes, // Width : 3 bytes, // Height : 3 bytes. static WebPMuxError CreateVP8XChunk(WebPMux* const mux) { WebPMuxError err = WEBP_MUX_OK; uint32_t flags = 0; int width = 0; int height = 0; uint8_t data[VP8X_CHUNK_SIZE]; const WebPData vp8x = { data, VP8X_CHUNK_SIZE }; const WebPMuxImage* images = NULL; assert(mux != NULL); images = mux->images_; // First image. if (images == NULL || images->img_ == NULL || images->img_->data_.bytes == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } // If VP8X chunk(s) is(are) already present, remove them (and later add new // VP8X chunk with updated flags). err = MuxDeleteAllNamedData(mux, kChunks[IDX_VP8X].tag); if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err; // Set flags. if (mux->iccp_ != NULL && mux->iccp_->data_.bytes != NULL) { flags |= ICCP_FLAG; } if (mux->exif_ != NULL && mux->exif_->data_.bytes != NULL) { flags |= EXIF_FLAG; } if (mux->xmp_ != NULL && mux->xmp_->data_.bytes != NULL) { flags |= XMP_FLAG; } if (images->header_ != NULL) { if (images->header_->tag_ == kChunks[IDX_ANMF].tag) { // This is an image with animation. flags |= ANIMATION_FLAG; } } if (MuxImageCount(images, WEBP_CHUNK_ALPHA) > 0) { flags |= ALPHA_FLAG; // Some images have an alpha channel. } err = GetAdjustedCanvasSize(mux, &width, &height); if (err != WEBP_MUX_OK) return err; if (width <= 0 || height <= 0) { return WEBP_MUX_INVALID_ARGUMENT; } if (width > MAX_CANVAS_SIZE || height > MAX_CANVAS_SIZE) { return WEBP_MUX_INVALID_ARGUMENT; } if (mux->canvas_width_ != 0 || mux->canvas_height_ != 0) { if (width > mux->canvas_width_ || height > mux->canvas_height_) { return WEBP_MUX_INVALID_ARGUMENT; } width = mux->canvas_width_; height = mux->canvas_height_; } if (flags == 0 && mux->unknown_ == NULL) { // For simple file format, VP8X chunk should not be added. return WEBP_MUX_OK; } if (MuxHasAlpha(images)) { // This means some frames explicitly/implicitly contain alpha. // Note: This 'flags' update must NOT be done for a lossless image // without a VP8X chunk! flags |= ALPHA_FLAG; } PutLE32(data + 0, flags); // VP8X chunk flags. PutLE24(data + 4, width - 1); // canvas width. PutLE24(data + 7, height - 1); // canvas height. return MuxSet(mux, kChunks[IDX_VP8X].tag, &vp8x, 1); } // Cleans up 'mux' by removing any unnecessary chunks. static WebPMuxError MuxCleanup(WebPMux* const mux) { int num_frames; int num_anim_chunks; // If we have an image with a single frame, and its rectangle // covers the whole canvas, convert it to a non-animated image // (to avoid writing ANMF chunk unnecessarily). WebPMuxError err = WebPMuxNumChunks(mux, kChunks[IDX_ANMF].id, &num_frames); if (err != WEBP_MUX_OK) return err; if (num_frames == 1) { WebPMuxImage* frame = NULL; err = MuxImageGetNth((const WebPMuxImage**)&mux->images_, 1, &frame); if (err != WEBP_MUX_OK) return err; // We know that one frame does exist. assert(frame != NULL); if (frame->header_ != NULL && ((mux->canvas_width_ == 0 && mux->canvas_height_ == 0) || (frame->width_ == mux->canvas_width_ && frame->height_ == mux->canvas_height_))) { assert(frame->header_->tag_ == kChunks[IDX_ANMF].tag); ChunkDelete(frame->header_); // Removes ANMF chunk. frame->header_ = NULL; num_frames = 0; } } // Remove ANIM chunk if this is a non-animated image. err = WebPMuxNumChunks(mux, kChunks[IDX_ANIM].id, &num_anim_chunks); if (err != WEBP_MUX_OK) return err; if (num_anim_chunks >= 1 && num_frames == 0) { err = MuxDeleteAllNamedData(mux, kChunks[IDX_ANIM].tag); if (err != WEBP_MUX_OK) return err; } return WEBP_MUX_OK; } // Total size of a list of images. static size_t ImageListDiskSize(const WebPMuxImage* wpi_list) { size_t size = 0; while (wpi_list != NULL) { size += MuxImageDiskSize(wpi_list); wpi_list = wpi_list->next_; } return size; } // Write out the given list of images into 'dst'. static uint8_t* ImageListEmit(const WebPMuxImage* wpi_list, uint8_t* dst) { while (wpi_list != NULL) { dst = MuxImageEmit(wpi_list, dst); wpi_list = wpi_list->next_; } return dst; } WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data) { size_t size = 0; uint8_t* data = NULL; uint8_t* dst = NULL; WebPMuxError err; if (assembled_data == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } // Clean up returned data, in case something goes wrong. memset(assembled_data, 0, sizeof(*assembled_data)); if (mux == NULL) { return WEBP_MUX_INVALID_ARGUMENT; } // Finalize mux. err = MuxCleanup(mux); if (err != WEBP_MUX_OK) return err; err = CreateVP8XChunk(mux); if (err != WEBP_MUX_OK) return err; // Allocate data. size = ChunkListDiskSize(mux->vp8x_) + ChunkListDiskSize(mux->iccp_) + ChunkListDiskSize(mux->anim_) + ImageListDiskSize(mux->images_) + ChunkListDiskSize(mux->exif_) + ChunkListDiskSize(mux->xmp_) + ChunkListDiskSize(mux->unknown_) + RIFF_HEADER_SIZE; data = (uint8_t*)WebPSafeMalloc(1ULL, size); if (data == NULL) return WEBP_MUX_MEMORY_ERROR; // Emit header & chunks. dst = MuxEmitRiffHeader(data, size); dst = ChunkListEmit(mux->vp8x_, dst); dst = ChunkListEmit(mux->iccp_, dst); dst = ChunkListEmit(mux->anim_, dst); dst = ImageListEmit(mux->images_, dst); dst = ChunkListEmit(mux->exif_, dst); dst = ChunkListEmit(mux->xmp_, dst); dst = ChunkListEmit(mux->unknown_, dst); assert(dst == data + size); // Validate mux. err = MuxValidate(mux); if (err != WEBP_MUX_OK) { WebPSafeFree(data); data = NULL; size = 0; } // Finalize data. assembled_data->bytes = data; assembled_data->size = size; return err; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/mux/Makefile.am0000644000014400001440000000132014606317060013503 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) lib_LTLIBRARIES = libwebpmux.la libwebpmux_la_SOURCES = libwebpmux_la_SOURCES += anim_encode.c libwebpmux_la_SOURCES += animi.h libwebpmux_la_SOURCES += muxedit.c libwebpmux_la_SOURCES += muxi.h libwebpmux_la_SOURCES += muxinternal.c libwebpmux_la_SOURCES += muxread.c libwebpmuxinclude_HEADERS = libwebpmuxinclude_HEADERS += ../webp/mux.h libwebpmuxinclude_HEADERS += ../webp/mux_types.h libwebpmuxinclude_HEADERS += ../webp/types.h noinst_HEADERS = noinst_HEADERS += ../webp/format_constants.h libwebpmux_la_LIBADD = ../libwebp.la libwebpmux_la_LDFLAGS = -no-undefined -version-info 4:0:1 -lm libwebpmuxincludedir = $(includedir)/webp pkgconfig_DATA = libwebpmux.pc libwebp-1.4.0/src/mux/anim_encode.c0000644000014400001440000016405614606317060014074 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // AnimEncoder implementation. // #include #include #include // for pow() #include #include // for abs() #include "src/mux/animi.h" #include "src/utils/utils.h" #include "src/webp/decode.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" #include "src/webp/mux.h" #include "src/webp/types.h" #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #endif #define ERROR_STR_MAX_LENGTH 100 //------------------------------------------------------------------------------ // Internal structs. // Stores frame rectangle dimensions. typedef struct { int x_offset_, y_offset_, width_, height_; } FrameRectangle; // Used to store two candidates of encoded data for an animation frame. One of // the two will be chosen later. typedef struct { WebPMuxFrameInfo sub_frame_; // Encoded frame rectangle. WebPMuxFrameInfo key_frame_; // Encoded frame if it is a key-frame. int is_key_frame_; // True if 'key_frame' has been chosen. } EncodedFrame; struct WebPAnimEncoder { const int canvas_width_; // Canvas width. const int canvas_height_; // Canvas height. const WebPAnimEncoderOptions options_; // Global encoding options. FrameRectangle prev_rect_; // Previous WebP frame rectangle. WebPConfig last_config_; // Cached in case a re-encode is needed. WebPConfig last_config_reversed_; // If 'last_config_' uses lossless, then // this config uses lossy and vice versa; // only valid if 'options_.allow_mixed' // is true. WebPPicture* curr_canvas_; // Only pointer; we don't own memory. // Canvas buffers. WebPPicture curr_canvas_copy_; // Possibly modified current canvas. int curr_canvas_copy_modified_; // True if pixels in 'curr_canvas_copy_' // differ from those in 'curr_canvas_'. WebPPicture prev_canvas_; // Previous canvas. WebPPicture prev_canvas_disposed_; // Previous canvas disposed to background. // Encoded data. EncodedFrame* encoded_frames_; // Array of encoded frames. size_t size_; // Number of allocated frames. size_t start_; // Frame start index. size_t count_; // Number of valid frames. size_t flush_count_; // If >0, 'flush_count' frames starting from // 'start' are ready to be added to mux. // key-frame related. int64_t best_delta_; // min(canvas size - frame size) over the frames. // Can be negative in certain cases due to // transparent pixels in a frame. int keyframe_; // Index of selected key-frame relative to 'start_'. int count_since_key_frame_; // Frames seen since the last key-frame. int first_timestamp_; // Timestamp of the first frame. int prev_timestamp_; // Timestamp of the last added frame. int prev_candidate_undecided_; // True if it's not yet decided if previous // frame would be a sub-frame or a key-frame. // Misc. int is_first_frame_; // True if first frame is yet to be added/being added. int got_null_frame_; // True if WebPAnimEncoderAdd() has already been called // with a NULL frame. size_t in_frame_count_; // Number of input frames processed so far. size_t out_frame_count_; // Number of frames added to mux so far. This may be // different from 'in_frame_count_' due to merging. WebPMux* mux_; // Muxer to assemble the WebP bitstream. char error_str_[ERROR_STR_MAX_LENGTH]; // Error string. Empty if no error. }; // ----------------------------------------------------------------------------- // Life of WebPAnimEncoder object. #define DELTA_INFINITY (1ULL << 32) #define KEYFRAME_NONE (-1) // Reset the counters in the WebPAnimEncoder. static void ResetCounters(WebPAnimEncoder* const enc) { enc->start_ = 0; enc->count_ = 0; enc->flush_count_ = 0; enc->best_delta_ = DELTA_INFINITY; enc->keyframe_ = KEYFRAME_NONE; } static void DisableKeyframes(WebPAnimEncoderOptions* const enc_options) { enc_options->kmax = INT_MAX; enc_options->kmin = enc_options->kmax - 1; } #define MAX_CACHED_FRAMES 30 static void SanitizeEncoderOptions(WebPAnimEncoderOptions* const enc_options) { int print_warning = enc_options->verbose; if (enc_options->minimize_size) { DisableKeyframes(enc_options); } if (enc_options->kmax == 1) { // All frames will be key-frames. enc_options->kmin = 0; enc_options->kmax = 0; return; } else if (enc_options->kmax <= 0) { DisableKeyframes(enc_options); print_warning = 0; } if (enc_options->kmin >= enc_options->kmax) { enc_options->kmin = enc_options->kmax - 1; if (print_warning) { fprintf(stderr, "WARNING: Setting kmin = %d, so that kmin < kmax.\n", enc_options->kmin); } } else { const int kmin_limit = enc_options->kmax / 2 + 1; if (enc_options->kmin < kmin_limit && kmin_limit < enc_options->kmax) { // This ensures that enc.keyframe + kmin >= kmax is always true. So, we // can flush all the frames in the 'count_since_key_frame == kmax' case. enc_options->kmin = kmin_limit; if (print_warning) { fprintf(stderr, "WARNING: Setting kmin = %d, so that kmin >= kmax / 2 + 1.\n", enc_options->kmin); } } } // Limit the max number of frames that are allocated. if (enc_options->kmax - enc_options->kmin > MAX_CACHED_FRAMES) { enc_options->kmin = enc_options->kmax - MAX_CACHED_FRAMES; if (print_warning) { fprintf(stderr, "WARNING: Setting kmin = %d, so that kmax - kmin <= %d.\n", enc_options->kmin, MAX_CACHED_FRAMES); } } assert(enc_options->kmin < enc_options->kmax); } #undef MAX_CACHED_FRAMES static void DefaultEncoderOptions(WebPAnimEncoderOptions* const enc_options) { enc_options->anim_params.loop_count = 0; enc_options->anim_params.bgcolor = 0xffffffff; // White. enc_options->minimize_size = 0; DisableKeyframes(enc_options); enc_options->allow_mixed = 0; enc_options->verbose = 0; } int WebPAnimEncoderOptionsInitInternal(WebPAnimEncoderOptions* enc_options, int abi_version) { if (enc_options == NULL || WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_MUX_ABI_VERSION)) { return 0; } DefaultEncoderOptions(enc_options); return 1; } // This starting value is more fit to WebPCleanupTransparentAreaLossless(). #define TRANSPARENT_COLOR 0x00000000 static void ClearRectangle(WebPPicture* const picture, int left, int top, int width, int height) { int j; for (j = top; j < top + height; ++j) { uint32_t* const dst = picture->argb + j * picture->argb_stride; int i; for (i = left; i < left + width; ++i) { dst[i] = TRANSPARENT_COLOR; } } } static void WebPUtilClearPic(WebPPicture* const picture, const FrameRectangle* const rect) { if (rect != NULL) { ClearRectangle(picture, rect->x_offset_, rect->y_offset_, rect->width_, rect->height_); } else { ClearRectangle(picture, 0, 0, picture->width, picture->height); } } static void MarkNoError(WebPAnimEncoder* const enc) { enc->error_str_[0] = '\0'; // Empty string. } static void MarkError(WebPAnimEncoder* const enc, const char* str) { if (snprintf(enc->error_str_, ERROR_STR_MAX_LENGTH, "%s.", str) < 0) { assert(0); // FIX ME! } } static void MarkError2(WebPAnimEncoder* const enc, const char* str, int error_code) { if (snprintf(enc->error_str_, ERROR_STR_MAX_LENGTH, "%s: %d.", str, error_code) < 0) { assert(0); // FIX ME! } } WebPAnimEncoder* WebPAnimEncoderNewInternal( int width, int height, const WebPAnimEncoderOptions* enc_options, int abi_version) { WebPAnimEncoder* enc; if (WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_MUX_ABI_VERSION)) { return NULL; } if (width <= 0 || height <= 0 || (width * (uint64_t)height) >= MAX_IMAGE_AREA) { return NULL; } enc = (WebPAnimEncoder*)WebPSafeCalloc(1, sizeof(*enc)); if (enc == NULL) return NULL; MarkNoError(enc); // Dimensions and options. *(int*)&enc->canvas_width_ = width; *(int*)&enc->canvas_height_ = height; if (enc_options != NULL) { *(WebPAnimEncoderOptions*)&enc->options_ = *enc_options; SanitizeEncoderOptions((WebPAnimEncoderOptions*)&enc->options_); } else { DefaultEncoderOptions((WebPAnimEncoderOptions*)&enc->options_); } // Canvas buffers. if (!WebPPictureInit(&enc->curr_canvas_copy_) || !WebPPictureInit(&enc->prev_canvas_) || !WebPPictureInit(&enc->prev_canvas_disposed_)) { goto Err; } enc->curr_canvas_copy_.width = width; enc->curr_canvas_copy_.height = height; enc->curr_canvas_copy_.use_argb = 1; if (!WebPPictureAlloc(&enc->curr_canvas_copy_) || !WebPPictureCopy(&enc->curr_canvas_copy_, &enc->prev_canvas_) || !WebPPictureCopy(&enc->curr_canvas_copy_, &enc->prev_canvas_disposed_)) { goto Err; } WebPUtilClearPic(&enc->prev_canvas_, NULL); enc->curr_canvas_copy_modified_ = 1; // Encoded frames. ResetCounters(enc); // Note: one extra storage is for the previous frame. enc->size_ = enc->options_.kmax - enc->options_.kmin + 1; // We need space for at least 2 frames. But when kmin, kmax are both zero, // enc->size_ will be 1. So we handle that special case below. if (enc->size_ < 2) enc->size_ = 2; enc->encoded_frames_ = (EncodedFrame*)WebPSafeCalloc(enc->size_, sizeof(*enc->encoded_frames_)); if (enc->encoded_frames_ == NULL) goto Err; enc->mux_ = WebPMuxNew(); if (enc->mux_ == NULL) goto Err; enc->count_since_key_frame_ = 0; enc->first_timestamp_ = 0; enc->prev_timestamp_ = 0; enc->prev_candidate_undecided_ = 0; enc->is_first_frame_ = 1; enc->got_null_frame_ = 0; return enc; // All OK. Err: WebPAnimEncoderDelete(enc); return NULL; } // Release the data contained by 'encoded_frame'. static void FrameRelease(EncodedFrame* const encoded_frame) { if (encoded_frame != NULL) { WebPDataClear(&encoded_frame->sub_frame_.bitstream); WebPDataClear(&encoded_frame->key_frame_.bitstream); memset(encoded_frame, 0, sizeof(*encoded_frame)); } } void WebPAnimEncoderDelete(WebPAnimEncoder* enc) { if (enc != NULL) { WebPPictureFree(&enc->curr_canvas_copy_); WebPPictureFree(&enc->prev_canvas_); WebPPictureFree(&enc->prev_canvas_disposed_); if (enc->encoded_frames_ != NULL) { size_t i; for (i = 0; i < enc->size_; ++i) { FrameRelease(&enc->encoded_frames_[i]); } WebPSafeFree(enc->encoded_frames_); } WebPMuxDelete(enc->mux_); WebPSafeFree(enc); } } // ----------------------------------------------------------------------------- // Frame addition. // Returns cached frame at the given 'position'. static EncodedFrame* GetFrame(const WebPAnimEncoder* const enc, size_t position) { assert(enc->start_ + position < enc->size_); return &enc->encoded_frames_[enc->start_ + position]; } typedef int (*ComparePixelsFunc)(const uint32_t*, int, const uint32_t*, int, int, int); // Returns true if 'length' number of pixels in 'src' and 'dst' are equal, // assuming the given step sizes between pixels. // 'max_allowed_diff' is unused and only there to allow function pointer use. static WEBP_INLINE int ComparePixelsLossless(const uint32_t* src, int src_step, const uint32_t* dst, int dst_step, int length, int max_allowed_diff) { (void)max_allowed_diff; assert(length > 0); while (length-- > 0) { if (*src != *dst) { return 0; } src += src_step; dst += dst_step; } return 1; } // Helper to check if each channel in 'src' and 'dst' is at most off by // 'max_allowed_diff'. static WEBP_INLINE int PixelsAreSimilar(uint32_t src, uint32_t dst, int max_allowed_diff) { const int src_a = (src >> 24) & 0xff; const int src_r = (src >> 16) & 0xff; const int src_g = (src >> 8) & 0xff; const int src_b = (src >> 0) & 0xff; const int dst_a = (dst >> 24) & 0xff; const int dst_r = (dst >> 16) & 0xff; const int dst_g = (dst >> 8) & 0xff; const int dst_b = (dst >> 0) & 0xff; return (src_a == dst_a) && (abs(src_r - dst_r) * dst_a <= (max_allowed_diff * 255)) && (abs(src_g - dst_g) * dst_a <= (max_allowed_diff * 255)) && (abs(src_b - dst_b) * dst_a <= (max_allowed_diff * 255)); } // Returns true if 'length' number of pixels in 'src' and 'dst' are within an // error bound, assuming the given step sizes between pixels. static WEBP_INLINE int ComparePixelsLossy(const uint32_t* src, int src_step, const uint32_t* dst, int dst_step, int length, int max_allowed_diff) { assert(length > 0); while (length-- > 0) { if (!PixelsAreSimilar(*src, *dst, max_allowed_diff)) { return 0; } src += src_step; dst += dst_step; } return 1; } static int IsEmptyRect(const FrameRectangle* const rect) { return (rect->width_ == 0) || (rect->height_ == 0); } static int QualityToMaxDiff(float quality) { const double val = pow(quality / 100., 0.5); const double max_diff = 31 * (1 - val) + 1 * val; return (int)(max_diff + 0.5); } // Assumes that an initial valid guess of change rectangle 'rect' is passed. static void MinimizeChangeRectangle(const WebPPicture* const src, const WebPPicture* const dst, FrameRectangle* const rect, int is_lossless, float quality) { int i, j; const ComparePixelsFunc compare_pixels = is_lossless ? ComparePixelsLossless : ComparePixelsLossy; const int max_allowed_diff_lossy = QualityToMaxDiff(quality); const int max_allowed_diff = is_lossless ? 0 : max_allowed_diff_lossy; // Assumption/correctness checks. assert(src->width == dst->width && src->height == dst->height); assert(rect->x_offset_ + rect->width_ <= dst->width); assert(rect->y_offset_ + rect->height_ <= dst->height); // Left boundary. for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) { const uint32_t* const src_argb = &src->argb[rect->y_offset_ * src->argb_stride + i]; const uint32_t* const dst_argb = &dst->argb[rect->y_offset_ * dst->argb_stride + i]; if (compare_pixels(src_argb, src->argb_stride, dst_argb, dst->argb_stride, rect->height_, max_allowed_diff)) { --rect->width_; // Redundant column. ++rect->x_offset_; } else { break; } } if (rect->width_ == 0) goto NoChange; // Right boundary. for (i = rect->x_offset_ + rect->width_ - 1; i >= rect->x_offset_; --i) { const uint32_t* const src_argb = &src->argb[rect->y_offset_ * src->argb_stride + i]; const uint32_t* const dst_argb = &dst->argb[rect->y_offset_ * dst->argb_stride + i]; if (compare_pixels(src_argb, src->argb_stride, dst_argb, dst->argb_stride, rect->height_, max_allowed_diff)) { --rect->width_; // Redundant column. } else { break; } } if (rect->width_ == 0) goto NoChange; // Top boundary. for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) { const uint32_t* const src_argb = &src->argb[j * src->argb_stride + rect->x_offset_]; const uint32_t* const dst_argb = &dst->argb[j * dst->argb_stride + rect->x_offset_]; if (compare_pixels(src_argb, 1, dst_argb, 1, rect->width_, max_allowed_diff)) { --rect->height_; // Redundant row. ++rect->y_offset_; } else { break; } } if (rect->height_ == 0) goto NoChange; // Bottom boundary. for (j = rect->y_offset_ + rect->height_ - 1; j >= rect->y_offset_; --j) { const uint32_t* const src_argb = &src->argb[j * src->argb_stride + rect->x_offset_]; const uint32_t* const dst_argb = &dst->argb[j * dst->argb_stride + rect->x_offset_]; if (compare_pixels(src_argb, 1, dst_argb, 1, rect->width_, max_allowed_diff)) { --rect->height_; // Redundant row. } else { break; } } if (rect->height_ == 0) goto NoChange; if (IsEmptyRect(rect)) { NoChange: rect->x_offset_ = 0; rect->y_offset_ = 0; rect->width_ = 0; rect->height_ = 0; } } // Snap rectangle to even offsets (and adjust dimensions if needed). static WEBP_INLINE void SnapToEvenOffsets(FrameRectangle* const rect) { rect->width_ += (rect->x_offset_ & 1); rect->height_ += (rect->y_offset_ & 1); rect->x_offset_ &= ~1; rect->y_offset_ &= ~1; } typedef struct { int should_try_; // Should try this set of parameters. int empty_rect_allowed_; // Frame with empty rectangle can be skipped. FrameRectangle rect_ll_; // Frame rectangle for lossless compression. WebPPicture sub_frame_ll_; // Sub-frame pic for lossless compression. FrameRectangle rect_lossy_; // Frame rectangle for lossy compression. // Could be smaller than rect_ll_ as pixels // with small diffs can be ignored. WebPPicture sub_frame_lossy_; // Sub-frame pic for lossless compression. } SubFrameParams; static int SubFrameParamsInit(SubFrameParams* const params, int should_try, int empty_rect_allowed) { params->should_try_ = should_try; params->empty_rect_allowed_ = empty_rect_allowed; if (!WebPPictureInit(¶ms->sub_frame_ll_) || !WebPPictureInit(¶ms->sub_frame_lossy_)) { return 0; } return 1; } static void SubFrameParamsFree(SubFrameParams* const params) { WebPPictureFree(¶ms->sub_frame_ll_); WebPPictureFree(¶ms->sub_frame_lossy_); } // Given previous and current canvas, picks the optimal rectangle for the // current frame based on 'is_lossless' and other parameters. Assumes that the // initial guess 'rect' is valid. static int GetSubRect(const WebPPicture* const prev_canvas, const WebPPicture* const curr_canvas, int is_key_frame, int is_first_frame, int empty_rect_allowed, int is_lossless, float quality, FrameRectangle* const rect, WebPPicture* const sub_frame) { if (!is_key_frame || is_first_frame) { // Optimize frame rectangle. // Note: This behaves as expected for first frame, as 'prev_canvas' is // initialized to a fully transparent canvas in the beginning. MinimizeChangeRectangle(prev_canvas, curr_canvas, rect, is_lossless, quality); } if (IsEmptyRect(rect)) { if (empty_rect_allowed) { // No need to get 'sub_frame'. return 1; } else { // Force a 1x1 rectangle. rect->width_ = 1; rect->height_ = 1; assert(rect->x_offset_ == 0); assert(rect->y_offset_ == 0); } } SnapToEvenOffsets(rect); return WebPPictureView(curr_canvas, rect->x_offset_, rect->y_offset_, rect->width_, rect->height_, sub_frame); } // Picks optimal frame rectangle for both lossless and lossy compression. The // initial guess for frame rectangles will be the full canvas. static int GetSubRects(const WebPPicture* const prev_canvas, const WebPPicture* const curr_canvas, int is_key_frame, int is_first_frame, float quality, SubFrameParams* const params) { // Lossless frame rectangle. params->rect_ll_.x_offset_ = 0; params->rect_ll_.y_offset_ = 0; params->rect_ll_.width_ = curr_canvas->width; params->rect_ll_.height_ = curr_canvas->height; if (!GetSubRect(prev_canvas, curr_canvas, is_key_frame, is_first_frame, params->empty_rect_allowed_, 1, quality, ¶ms->rect_ll_, ¶ms->sub_frame_ll_)) { return 0; } // Lossy frame rectangle. params->rect_lossy_ = params->rect_ll_; // seed with lossless rect. return GetSubRect(prev_canvas, curr_canvas, is_key_frame, is_first_frame, params->empty_rect_allowed_, 0, quality, ¶ms->rect_lossy_, ¶ms->sub_frame_lossy_); } static WEBP_INLINE int clip(int v, int min_v, int max_v) { return (v < min_v) ? min_v : (v > max_v) ? max_v : v; } int WebPAnimEncoderRefineRect( const WebPPicture* const prev_canvas, const WebPPicture* const curr_canvas, int is_lossless, float quality, int* const x_offset, int* const y_offset, int* const width, int* const height) { FrameRectangle rect; int right, left, bottom, top; if (prev_canvas == NULL || curr_canvas == NULL || prev_canvas->width != curr_canvas->width || prev_canvas->height != curr_canvas->height || !prev_canvas->use_argb || !curr_canvas->use_argb) { return 0; } right = clip(*x_offset + *width, 0, curr_canvas->width); left = clip(*x_offset, 0, curr_canvas->width - 1); bottom = clip(*y_offset + *height, 0, curr_canvas->height); top = clip(*y_offset, 0, curr_canvas->height - 1); rect.x_offset_ = left; rect.y_offset_ = top; rect.width_ = clip(right - left, 0, curr_canvas->width - rect.x_offset_); rect.height_ = clip(bottom - top, 0, curr_canvas->height - rect.y_offset_); MinimizeChangeRectangle(prev_canvas, curr_canvas, &rect, is_lossless, quality); SnapToEvenOffsets(&rect); *x_offset = rect.x_offset_; *y_offset = rect.y_offset_; *width = rect.width_; *height = rect.height_; return 1; } static void DisposeFrameRectangle(int dispose_method, const FrameRectangle* const rect, WebPPicture* const curr_canvas) { assert(rect != NULL); if (dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { WebPUtilClearPic(curr_canvas, rect); } } static uint32_t RectArea(const FrameRectangle* const rect) { return (uint32_t)rect->width_ * rect->height_; } static int IsLosslessBlendingPossible(const WebPPicture* const src, const WebPPicture* const dst, const FrameRectangle* const rect) { int i, j; assert(src->width == dst->width && src->height == dst->height); assert(rect->x_offset_ + rect->width_ <= dst->width); assert(rect->y_offset_ + rect->height_ <= dst->height); for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) { for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) { const uint32_t src_pixel = src->argb[j * src->argb_stride + i]; const uint32_t dst_pixel = dst->argb[j * dst->argb_stride + i]; const uint32_t dst_alpha = dst_pixel >> 24; if (dst_alpha != 0xff && src_pixel != dst_pixel) { // In this case, if we use blending, we can't attain the desired // 'dst_pixel' value for this pixel. So, blending is not possible. return 0; } } } return 1; } static int IsLossyBlendingPossible(const WebPPicture* const src, const WebPPicture* const dst, const FrameRectangle* const rect, float quality) { const int max_allowed_diff_lossy = QualityToMaxDiff(quality); int i, j; assert(src->width == dst->width && src->height == dst->height); assert(rect->x_offset_ + rect->width_ <= dst->width); assert(rect->y_offset_ + rect->height_ <= dst->height); for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) { for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) { const uint32_t src_pixel = src->argb[j * src->argb_stride + i]; const uint32_t dst_pixel = dst->argb[j * dst->argb_stride + i]; const uint32_t dst_alpha = dst_pixel >> 24; if (dst_alpha != 0xff && !PixelsAreSimilar(src_pixel, dst_pixel, max_allowed_diff_lossy)) { // In this case, if we use blending, we can't attain the desired // 'dst_pixel' value for this pixel. So, blending is not possible. return 0; } } } return 1; } // For pixels in 'rect', replace those pixels in 'dst' that are same as 'src' by // transparent pixels. // Returns true if at least one pixel gets modified. static int IncreaseTransparency(const WebPPicture* const src, const FrameRectangle* const rect, WebPPicture* const dst) { int i, j; int modified = 0; assert(src != NULL && dst != NULL && rect != NULL); assert(src->width == dst->width && src->height == dst->height); for (j = rect->y_offset_; j < rect->y_offset_ + rect->height_; ++j) { const uint32_t* const psrc = src->argb + j * src->argb_stride; uint32_t* const pdst = dst->argb + j * dst->argb_stride; for (i = rect->x_offset_; i < rect->x_offset_ + rect->width_; ++i) { if (psrc[i] == pdst[i] && pdst[i] != TRANSPARENT_COLOR) { pdst[i] = TRANSPARENT_COLOR; modified = 1; } } } return modified; } #undef TRANSPARENT_COLOR // Replace similar blocks of pixels by a 'see-through' transparent block // with uniform average color. // Assumes lossy compression is being used. // Returns true if at least one pixel gets modified. static int FlattenSimilarBlocks(const WebPPicture* const src, const FrameRectangle* const rect, WebPPicture* const dst, float quality) { const int max_allowed_diff_lossy = QualityToMaxDiff(quality); int i, j; int modified = 0; const int block_size = 8; const int y_start = (rect->y_offset_ + block_size) & ~(block_size - 1); const int y_end = (rect->y_offset_ + rect->height_) & ~(block_size - 1); const int x_start = (rect->x_offset_ + block_size) & ~(block_size - 1); const int x_end = (rect->x_offset_ + rect->width_) & ~(block_size - 1); assert(src != NULL && dst != NULL && rect != NULL); assert(src->width == dst->width && src->height == dst->height); assert((block_size & (block_size - 1)) == 0); // must be a power of 2 // Iterate over each block and count similar pixels. for (j = y_start; j < y_end; j += block_size) { for (i = x_start; i < x_end; i += block_size) { int cnt = 0; int avg_r = 0, avg_g = 0, avg_b = 0; int x, y; const uint32_t* const psrc = src->argb + j * src->argb_stride + i; uint32_t* const pdst = dst->argb + j * dst->argb_stride + i; for (y = 0; y < block_size; ++y) { for (x = 0; x < block_size; ++x) { const uint32_t src_pixel = psrc[x + y * src->argb_stride]; const int alpha = src_pixel >> 24; if (alpha == 0xff && PixelsAreSimilar(src_pixel, pdst[x + y * dst->argb_stride], max_allowed_diff_lossy)) { ++cnt; avg_r += (src_pixel >> 16) & 0xff; avg_g += (src_pixel >> 8) & 0xff; avg_b += (src_pixel >> 0) & 0xff; } } } // If we have a fully similar block, we replace it with an // average transparent block. This compresses better in lossy mode. if (cnt == block_size * block_size) { const uint32_t color = (0x00 << 24) | ((avg_r / cnt) << 16) | ((avg_g / cnt) << 8) | ((avg_b / cnt) << 0); for (y = 0; y < block_size; ++y) { for (x = 0; x < block_size; ++x) { pdst[x + y * dst->argb_stride] = color; } } modified = 1; } } } return modified; } static int EncodeFrame(const WebPConfig* const config, WebPPicture* const pic, WebPMemoryWriter* const memory) { pic->use_argb = 1; pic->writer = WebPMemoryWrite; pic->custom_ptr = memory; if (!WebPEncode(config, pic)) { return 0; } return 1; } // Struct representing a candidate encoded frame including its metadata. typedef struct { WebPMemoryWriter mem_; WebPMuxFrameInfo info_; FrameRectangle rect_; int evaluate_; // True if this candidate should be evaluated. } Candidate; // Generates a candidate encoded frame given a picture and metadata. static WebPEncodingError EncodeCandidate(WebPPicture* const sub_frame, const FrameRectangle* const rect, const WebPConfig* const encoder_config, int use_blending, Candidate* const candidate) { WebPConfig config = *encoder_config; WebPEncodingError error_code = VP8_ENC_OK; assert(candidate != NULL); memset(candidate, 0, sizeof(*candidate)); // Set frame rect and info. candidate->rect_ = *rect; candidate->info_.id = WEBP_CHUNK_ANMF; candidate->info_.x_offset = rect->x_offset_; candidate->info_.y_offset = rect->y_offset_; candidate->info_.dispose_method = WEBP_MUX_DISPOSE_NONE; // Set later. candidate->info_.blend_method = use_blending ? WEBP_MUX_BLEND : WEBP_MUX_NO_BLEND; candidate->info_.duration = 0; // Set in next call to WebPAnimEncoderAdd(). // Encode picture. WebPMemoryWriterInit(&candidate->mem_); if (!config.lossless && use_blending) { // Disable filtering to avoid blockiness in reconstructed frames at the // time of decoding. config.autofilter = 0; config.filter_strength = 0; } if (!EncodeFrame(&config, sub_frame, &candidate->mem_)) { error_code = sub_frame->error_code; goto Err; } candidate->evaluate_ = 1; return error_code; Err: WebPMemoryWriterClear(&candidate->mem_); return error_code; } static void CopyCurrentCanvas(WebPAnimEncoder* const enc) { if (enc->curr_canvas_copy_modified_) { WebPCopyPixels(enc->curr_canvas_, &enc->curr_canvas_copy_); enc->curr_canvas_copy_.progress_hook = enc->curr_canvas_->progress_hook; enc->curr_canvas_copy_.user_data = enc->curr_canvas_->user_data; enc->curr_canvas_copy_modified_ = 0; } } enum { LL_DISP_NONE = 0, LL_DISP_BG, LOSSY_DISP_NONE, LOSSY_DISP_BG, CANDIDATE_COUNT }; #define MIN_COLORS_LOSSY 31 // Don't try lossy below this threshold. #define MAX_COLORS_LOSSLESS 194 // Don't try lossless above this threshold. // Generates candidates for a given dispose method given pre-filled sub-frame // 'params'. static WebPEncodingError GenerateCandidates( WebPAnimEncoder* const enc, Candidate candidates[CANDIDATE_COUNT], WebPMuxAnimDispose dispose_method, int is_lossless, int is_key_frame, SubFrameParams* const params, const WebPConfig* const config_ll, const WebPConfig* const config_lossy) { WebPEncodingError error_code = VP8_ENC_OK; const int is_dispose_none = (dispose_method == WEBP_MUX_DISPOSE_NONE); Candidate* const candidate_ll = is_dispose_none ? &candidates[LL_DISP_NONE] : &candidates[LL_DISP_BG]; Candidate* const candidate_lossy = is_dispose_none ? &candidates[LOSSY_DISP_NONE] : &candidates[LOSSY_DISP_BG]; WebPPicture* const curr_canvas = &enc->curr_canvas_copy_; const WebPPicture* const prev_canvas = is_dispose_none ? &enc->prev_canvas_ : &enc->prev_canvas_disposed_; int use_blending_ll, use_blending_lossy; int evaluate_ll, evaluate_lossy; CopyCurrentCanvas(enc); use_blending_ll = !is_key_frame && IsLosslessBlendingPossible(prev_canvas, curr_canvas, ¶ms->rect_ll_); use_blending_lossy = !is_key_frame && IsLossyBlendingPossible(prev_canvas, curr_canvas, ¶ms->rect_lossy_, config_lossy->quality); // Pick candidates to be tried. if (!enc->options_.allow_mixed) { evaluate_ll = is_lossless; evaluate_lossy = !is_lossless; } else if (enc->options_.minimize_size) { evaluate_ll = 1; evaluate_lossy = 1; } else { // Use a heuristic for trying lossless and/or lossy compression. const int num_colors = WebPGetColorPalette(¶ms->sub_frame_ll_, NULL); evaluate_ll = (num_colors < MAX_COLORS_LOSSLESS); evaluate_lossy = (num_colors >= MIN_COLORS_LOSSY); } // Generate candidates. if (evaluate_ll) { CopyCurrentCanvas(enc); if (use_blending_ll) { enc->curr_canvas_copy_modified_ = IncreaseTransparency(prev_canvas, ¶ms->rect_ll_, curr_canvas); } error_code = EncodeCandidate(¶ms->sub_frame_ll_, ¶ms->rect_ll_, config_ll, use_blending_ll, candidate_ll); if (error_code != VP8_ENC_OK) return error_code; } if (evaluate_lossy) { CopyCurrentCanvas(enc); if (use_blending_lossy) { enc->curr_canvas_copy_modified_ = FlattenSimilarBlocks(prev_canvas, ¶ms->rect_lossy_, curr_canvas, config_lossy->quality); } error_code = EncodeCandidate(¶ms->sub_frame_lossy_, ¶ms->rect_lossy_, config_lossy, use_blending_lossy, candidate_lossy); if (error_code != VP8_ENC_OK) return error_code; enc->curr_canvas_copy_modified_ = 1; } return error_code; } #undef MIN_COLORS_LOSSY #undef MAX_COLORS_LOSSLESS static void GetEncodedData(const WebPMemoryWriter* const memory, WebPData* const encoded_data) { encoded_data->bytes = memory->mem; encoded_data->size = memory->size; } // Sets dispose method of the previous frame to be 'dispose_method'. static void SetPreviousDisposeMethod(WebPAnimEncoder* const enc, WebPMuxAnimDispose dispose_method) { const size_t position = enc->count_ - 2; EncodedFrame* const prev_enc_frame = GetFrame(enc, position); assert(enc->count_ >= 2); // As current and previous frames are in enc. if (enc->prev_candidate_undecided_) { assert(dispose_method == WEBP_MUX_DISPOSE_NONE); prev_enc_frame->sub_frame_.dispose_method = dispose_method; prev_enc_frame->key_frame_.dispose_method = dispose_method; } else { WebPMuxFrameInfo* const prev_info = prev_enc_frame->is_key_frame_ ? &prev_enc_frame->key_frame_ : &prev_enc_frame->sub_frame_; prev_info->dispose_method = dispose_method; } } static int IncreasePreviousDuration(WebPAnimEncoder* const enc, int duration) { const size_t position = enc->count_ - 1; EncodedFrame* const prev_enc_frame = GetFrame(enc, position); int new_duration; assert(enc->count_ >= 1); assert(!prev_enc_frame->is_key_frame_ || prev_enc_frame->sub_frame_.duration == prev_enc_frame->key_frame_.duration); assert(prev_enc_frame->sub_frame_.duration == (prev_enc_frame->sub_frame_.duration & (MAX_DURATION - 1))); assert(duration == (duration & (MAX_DURATION - 1))); new_duration = prev_enc_frame->sub_frame_.duration + duration; if (new_duration >= MAX_DURATION) { // Special case. // Separate out previous frame from earlier merged frames to avoid overflow. // We add a 1x1 transparent frame for the previous frame, with blending on. const FrameRectangle rect = { 0, 0, 1, 1 }; const uint8_t lossless_1x1_bytes[] = { 0x52, 0x49, 0x46, 0x46, 0x14, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x10, 0x88, 0x88, 0x08 }; const WebPData lossless_1x1 = { lossless_1x1_bytes, sizeof(lossless_1x1_bytes) }; const uint8_t lossy_1x1_bytes[] = { 0x52, 0x49, 0x46, 0x46, 0x40, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x58, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x4c, 0x50, 0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x50, 0x38, 0x20, 0x18, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x9d, 0x01, 0x2a, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x34, 0x25, 0xa4, 0x00, 0x03, 0x70, 0x00, 0xfe, 0xfb, 0xfd, 0x50, 0x00 }; const WebPData lossy_1x1 = { lossy_1x1_bytes, sizeof(lossy_1x1_bytes) }; const int can_use_lossless = (enc->last_config_.lossless || enc->options_.allow_mixed); EncodedFrame* const curr_enc_frame = GetFrame(enc, enc->count_); curr_enc_frame->is_key_frame_ = 0; curr_enc_frame->sub_frame_.id = WEBP_CHUNK_ANMF; curr_enc_frame->sub_frame_.x_offset = 0; curr_enc_frame->sub_frame_.y_offset = 0; curr_enc_frame->sub_frame_.dispose_method = WEBP_MUX_DISPOSE_NONE; curr_enc_frame->sub_frame_.blend_method = WEBP_MUX_BLEND; curr_enc_frame->sub_frame_.duration = duration; if (!WebPDataCopy(can_use_lossless ? &lossless_1x1 : &lossy_1x1, &curr_enc_frame->sub_frame_.bitstream)) { return 0; } ++enc->count_; ++enc->count_since_key_frame_; enc->flush_count_ = enc->count_ - 1; enc->prev_candidate_undecided_ = 0; enc->prev_rect_ = rect; } else { // Regular case. // Increase duration of the previous frame by 'duration'. prev_enc_frame->sub_frame_.duration = new_duration; prev_enc_frame->key_frame_.duration = new_duration; } return 1; } // Pick the candidate encoded frame with smallest size and release other // candidates. // TODO(later): Perhaps a rough SSIM/PSNR produced by the encoder should // also be a criteria, in addition to sizes. static void PickBestCandidate(WebPAnimEncoder* const enc, Candidate* const candidates, int is_key_frame, EncodedFrame* const encoded_frame) { int i; int best_idx = -1; size_t best_size = ~0; for (i = 0; i < CANDIDATE_COUNT; ++i) { if (candidates[i].evaluate_) { const size_t candidate_size = candidates[i].mem_.size; if (candidate_size < best_size) { best_idx = i; best_size = candidate_size; } } } assert(best_idx != -1); for (i = 0; i < CANDIDATE_COUNT; ++i) { if (candidates[i].evaluate_) { if (i == best_idx) { WebPMuxFrameInfo* const dst = is_key_frame ? &encoded_frame->key_frame_ : &encoded_frame->sub_frame_; *dst = candidates[i].info_; GetEncodedData(&candidates[i].mem_, &dst->bitstream); if (!is_key_frame) { // Note: Previous dispose method only matters for non-keyframes. // Also, we don't want to modify previous dispose method that was // selected when a non key-frame was assumed. const WebPMuxAnimDispose prev_dispose_method = (best_idx == LL_DISP_NONE || best_idx == LOSSY_DISP_NONE) ? WEBP_MUX_DISPOSE_NONE : WEBP_MUX_DISPOSE_BACKGROUND; SetPreviousDisposeMethod(enc, prev_dispose_method); } enc->prev_rect_ = candidates[i].rect_; // save for next frame. } else { WebPMemoryWriterClear(&candidates[i].mem_); candidates[i].evaluate_ = 0; } } } } // Depending on the configuration, tries different compressions // (lossy/lossless), dispose methods, blending methods etc to encode the current // frame and outputs the best one in 'encoded_frame'. // 'frame_skipped' will be set to true if this frame should actually be skipped. static WebPEncodingError SetFrame(WebPAnimEncoder* const enc, const WebPConfig* const config, int is_key_frame, EncodedFrame* const encoded_frame, int* const frame_skipped) { int i; WebPEncodingError error_code = VP8_ENC_OK; const WebPPicture* const curr_canvas = &enc->curr_canvas_copy_; const WebPPicture* const prev_canvas = &enc->prev_canvas_; Candidate candidates[CANDIDATE_COUNT]; const int is_lossless = config->lossless; const int consider_lossless = is_lossless || enc->options_.allow_mixed; const int consider_lossy = !is_lossless || enc->options_.allow_mixed; const int is_first_frame = enc->is_first_frame_; // First frame cannot be skipped as there is no 'previous frame' to merge it // to. So, empty rectangle is not allowed for the first frame. const int empty_rect_allowed_none = !is_first_frame; // Even if there is exact pixel match between 'disposed previous canvas' and // 'current canvas', we can't skip current frame, as there may not be exact // pixel match between 'previous canvas' and 'current canvas'. So, we don't // allow empty rectangle in this case. const int empty_rect_allowed_bg = 0; // If current frame is a key-frame, dispose method of previous frame doesn't // matter, so we don't try dispose to background. // Also, if key-frame insertion is on, and previous frame could be picked as // either a sub-frame or a key-frame, then we can't be sure about what frame // rectangle would be disposed. In that case too, we don't try dispose to // background. const int dispose_bg_possible = !is_key_frame && !enc->prev_candidate_undecided_; SubFrameParams dispose_none_params; SubFrameParams dispose_bg_params; WebPConfig config_ll = *config; WebPConfig config_lossy = *config; config_ll.lossless = 1; config_lossy.lossless = 0; enc->last_config_ = *config; enc->last_config_reversed_ = config->lossless ? config_lossy : config_ll; *frame_skipped = 0; if (!SubFrameParamsInit(&dispose_none_params, 1, empty_rect_allowed_none) || !SubFrameParamsInit(&dispose_bg_params, 0, empty_rect_allowed_bg)) { return VP8_ENC_ERROR_INVALID_CONFIGURATION; } memset(candidates, 0, sizeof(candidates)); // Change-rectangle assuming previous frame was DISPOSE_NONE. if (!GetSubRects(prev_canvas, curr_canvas, is_key_frame, is_first_frame, config_lossy.quality, &dispose_none_params)) { error_code = VP8_ENC_ERROR_INVALID_CONFIGURATION; goto Err; } if ((consider_lossless && IsEmptyRect(&dispose_none_params.rect_ll_)) || (consider_lossy && IsEmptyRect(&dispose_none_params.rect_lossy_))) { // Don't encode the frame at all. Instead, the duration of the previous // frame will be increased later. assert(empty_rect_allowed_none); *frame_skipped = 1; goto End; } if (dispose_bg_possible) { // Change-rectangle assuming previous frame was DISPOSE_BACKGROUND. WebPPicture* const prev_canvas_disposed = &enc->prev_canvas_disposed_; WebPCopyPixels(prev_canvas, prev_canvas_disposed); DisposeFrameRectangle(WEBP_MUX_DISPOSE_BACKGROUND, &enc->prev_rect_, prev_canvas_disposed); if (!GetSubRects(prev_canvas_disposed, curr_canvas, is_key_frame, is_first_frame, config_lossy.quality, &dispose_bg_params)) { error_code = VP8_ENC_ERROR_INVALID_CONFIGURATION; goto Err; } assert(!IsEmptyRect(&dispose_bg_params.rect_ll_)); assert(!IsEmptyRect(&dispose_bg_params.rect_lossy_)); if (enc->options_.minimize_size) { // Try both dispose methods. dispose_bg_params.should_try_ = 1; dispose_none_params.should_try_ = 1; } else if ((is_lossless && RectArea(&dispose_bg_params.rect_ll_) < RectArea(&dispose_none_params.rect_ll_)) || (!is_lossless && RectArea(&dispose_bg_params.rect_lossy_) < RectArea(&dispose_none_params.rect_lossy_))) { dispose_bg_params.should_try_ = 1; // Pick DISPOSE_BACKGROUND. dispose_none_params.should_try_ = 0; } } if (dispose_none_params.should_try_) { error_code = GenerateCandidates( enc, candidates, WEBP_MUX_DISPOSE_NONE, is_lossless, is_key_frame, &dispose_none_params, &config_ll, &config_lossy); if (error_code != VP8_ENC_OK) goto Err; } if (dispose_bg_params.should_try_) { assert(!enc->is_first_frame_); assert(dispose_bg_possible); error_code = GenerateCandidates( enc, candidates, WEBP_MUX_DISPOSE_BACKGROUND, is_lossless, is_key_frame, &dispose_bg_params, &config_ll, &config_lossy); if (error_code != VP8_ENC_OK) goto Err; } PickBestCandidate(enc, candidates, is_key_frame, encoded_frame); goto End; Err: for (i = 0; i < CANDIDATE_COUNT; ++i) { if (candidates[i].evaluate_) { WebPMemoryWriterClear(&candidates[i].mem_); } } End: SubFrameParamsFree(&dispose_none_params); SubFrameParamsFree(&dispose_bg_params); return error_code; } // Calculate the penalty incurred if we encode given frame as a key frame // instead of a sub-frame. static int64_t KeyFramePenalty(const EncodedFrame* const encoded_frame) { return ((int64_t)encoded_frame->key_frame_.bitstream.size - encoded_frame->sub_frame_.bitstream.size); } static int CacheFrame(WebPAnimEncoder* const enc, const WebPConfig* const config) { int ok = 0; int frame_skipped = 0; WebPEncodingError error_code = VP8_ENC_OK; const size_t position = enc->count_; EncodedFrame* const encoded_frame = GetFrame(enc, position); ++enc->count_; if (enc->is_first_frame_) { // Add this as a key-frame. error_code = SetFrame(enc, config, 1, encoded_frame, &frame_skipped); if (error_code != VP8_ENC_OK) goto End; assert(frame_skipped == 0); // First frame can't be skipped, even if empty. assert(position == 0 && enc->count_ == 1); encoded_frame->is_key_frame_ = 1; enc->flush_count_ = 0; enc->count_since_key_frame_ = 0; enc->prev_candidate_undecided_ = 0; } else { ++enc->count_since_key_frame_; if (enc->count_since_key_frame_ <= enc->options_.kmin) { // Add this as a frame rectangle. error_code = SetFrame(enc, config, 0, encoded_frame, &frame_skipped); if (error_code != VP8_ENC_OK) goto End; if (frame_skipped) goto Skip; encoded_frame->is_key_frame_ = 0; enc->flush_count_ = enc->count_ - 1; enc->prev_candidate_undecided_ = 0; } else { int64_t curr_delta; FrameRectangle prev_rect_key, prev_rect_sub; // Add this as a frame rectangle to enc. error_code = SetFrame(enc, config, 0, encoded_frame, &frame_skipped); if (error_code != VP8_ENC_OK) goto End; if (frame_skipped) goto Skip; prev_rect_sub = enc->prev_rect_; // Add this as a key-frame to enc, too. error_code = SetFrame(enc, config, 1, encoded_frame, &frame_skipped); if (error_code != VP8_ENC_OK) goto End; assert(frame_skipped == 0); // Key-frame cannot be an empty rectangle. prev_rect_key = enc->prev_rect_; // Analyze size difference of the two variants. curr_delta = KeyFramePenalty(encoded_frame); if (curr_delta <= enc->best_delta_) { // Pick this as the key-frame. if (enc->keyframe_ != KEYFRAME_NONE) { EncodedFrame* const old_keyframe = GetFrame(enc, enc->keyframe_); assert(old_keyframe->is_key_frame_); old_keyframe->is_key_frame_ = 0; } encoded_frame->is_key_frame_ = 1; enc->prev_candidate_undecided_ = 1; enc->keyframe_ = (int)position; enc->best_delta_ = curr_delta; enc->flush_count_ = enc->count_ - 1; // We can flush previous frames. } else { encoded_frame->is_key_frame_ = 0; enc->prev_candidate_undecided_ = 0; } // Note: We need '>=' below because when kmin and kmax are both zero, // count_since_key_frame will always be > kmax. if (enc->count_since_key_frame_ >= enc->options_.kmax) { enc->flush_count_ = enc->count_ - 1; enc->count_since_key_frame_ = 0; enc->keyframe_ = KEYFRAME_NONE; enc->best_delta_ = DELTA_INFINITY; } if (!enc->prev_candidate_undecided_) { enc->prev_rect_ = encoded_frame->is_key_frame_ ? prev_rect_key : prev_rect_sub; } } } // Update previous to previous and previous canvases for next call. WebPCopyPixels(enc->curr_canvas_, &enc->prev_canvas_); enc->is_first_frame_ = 0; Skip: ok = 1; ++enc->in_frame_count_; End: if (!ok || frame_skipped) { FrameRelease(encoded_frame); // We reset some counters, as the frame addition failed/was skipped. --enc->count_; if (!enc->is_first_frame_) --enc->count_since_key_frame_; if (!ok) { MarkError2(enc, "ERROR adding frame. WebPEncodingError", error_code); } } enc->curr_canvas_->error_code = error_code; // report error_code assert(ok || error_code != VP8_ENC_OK); return ok; } static int FlushFrames(WebPAnimEncoder* const enc) { while (enc->flush_count_ > 0) { WebPMuxError err; EncodedFrame* const curr = GetFrame(enc, 0); const WebPMuxFrameInfo* const info = curr->is_key_frame_ ? &curr->key_frame_ : &curr->sub_frame_; assert(enc->mux_ != NULL); err = WebPMuxPushFrame(enc->mux_, info, 1); if (err != WEBP_MUX_OK) { MarkError2(enc, "ERROR adding frame. WebPMuxError", err); return 0; } if (enc->options_.verbose) { fprintf(stderr, "INFO: Added frame. offset:%d,%d dispose:%d blend:%d\n", info->x_offset, info->y_offset, info->dispose_method, info->blend_method); } ++enc->out_frame_count_; FrameRelease(curr); ++enc->start_; --enc->flush_count_; --enc->count_; if (enc->keyframe_ != KEYFRAME_NONE) --enc->keyframe_; } if (enc->count_ == 1 && enc->start_ != 0) { // Move enc->start to index 0. const int enc_start_tmp = (int)enc->start_; EncodedFrame temp = enc->encoded_frames_[0]; enc->encoded_frames_[0] = enc->encoded_frames_[enc_start_tmp]; enc->encoded_frames_[enc_start_tmp] = temp; FrameRelease(&enc->encoded_frames_[enc_start_tmp]); enc->start_ = 0; } return 1; } #undef DELTA_INFINITY #undef KEYFRAME_NONE int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp, const WebPConfig* encoder_config) { WebPConfig config; int ok; if (enc == NULL) { return 0; } MarkNoError(enc); if (!enc->is_first_frame_) { // Make sure timestamps are non-decreasing (integer wrap-around is OK). const uint32_t prev_frame_duration = (uint32_t)timestamp - enc->prev_timestamp_; if (prev_frame_duration >= MAX_DURATION) { if (frame != NULL) { frame->error_code = VP8_ENC_ERROR_INVALID_CONFIGURATION; } MarkError(enc, "ERROR adding frame: timestamps must be non-decreasing"); return 0; } if (!IncreasePreviousDuration(enc, (int)prev_frame_duration)) { return 0; } // IncreasePreviousDuration() may add a frame to avoid exceeding // MAX_DURATION which could cause CacheFrame() to over read encoded_frames_ // before the next flush. if (enc->count_ == enc->size_ && !FlushFrames(enc)) { return 0; } } else { enc->first_timestamp_ = timestamp; } if (frame == NULL) { // Special: last call. enc->got_null_frame_ = 1; enc->prev_timestamp_ = timestamp; return 1; } if (frame->width != enc->canvas_width_ || frame->height != enc->canvas_height_) { frame->error_code = VP8_ENC_ERROR_INVALID_CONFIGURATION; MarkError(enc, "ERROR adding frame: Invalid frame dimensions"); return 0; } if (!frame->use_argb) { // Convert frame from YUV(A) to ARGB. if (enc->options_.verbose) { fprintf(stderr, "WARNING: Converting frame from YUV(A) to ARGB format; " "this incurs a small loss.\n"); } if (!WebPPictureYUVAToARGB(frame)) { MarkError(enc, "ERROR converting frame from YUV(A) to ARGB"); return 0; } } if (encoder_config != NULL) { if (!WebPValidateConfig(encoder_config)) { MarkError(enc, "ERROR adding frame: Invalid WebPConfig"); return 0; } config = *encoder_config; } else { if (!WebPConfigInit(&config)) { MarkError(enc, "Cannot Init config"); return 0; } config.lossless = 1; } assert(enc->curr_canvas_ == NULL); enc->curr_canvas_ = frame; // Store reference. assert(enc->curr_canvas_copy_modified_ == 1); CopyCurrentCanvas(enc); ok = CacheFrame(enc, &config) && FlushFrames(enc); enc->curr_canvas_ = NULL; enc->curr_canvas_copy_modified_ = 1; if (ok) { enc->prev_timestamp_ = timestamp; } return ok; } // ----------------------------------------------------------------------------- // Bitstream assembly. WEBP_NODISCARD static int DecodeFrameOntoCanvas( const WebPMuxFrameInfo* const frame, WebPPicture* const canvas) { const WebPData* const image = &frame->bitstream; WebPPicture sub_image; WebPDecoderConfig config; if (!WebPInitDecoderConfig(&config)) { return 0; } WebPUtilClearPic(canvas, NULL); if (WebPGetFeatures(image->bytes, image->size, &config.input) != VP8_STATUS_OK) { return 0; } if (!WebPPictureView(canvas, frame->x_offset, frame->y_offset, config.input.width, config.input.height, &sub_image)) { return 0; } config.output.is_external_memory = 1; config.output.colorspace = MODE_BGRA; config.output.u.RGBA.rgba = (uint8_t*)sub_image.argb; config.output.u.RGBA.stride = sub_image.argb_stride * 4; config.output.u.RGBA.size = config.output.u.RGBA.stride * sub_image.height; if (WebPDecode(image->bytes, image->size, &config) != VP8_STATUS_OK) { return 0; } return 1; } static int FrameToFullCanvas(WebPAnimEncoder* const enc, const WebPMuxFrameInfo* const frame, WebPData* const full_image) { WebPPicture* const canvas_buf = &enc->curr_canvas_copy_; WebPMemoryWriter mem1, mem2; WebPMemoryWriterInit(&mem1); WebPMemoryWriterInit(&mem2); if (!DecodeFrameOntoCanvas(frame, canvas_buf)) goto Err; if (!EncodeFrame(&enc->last_config_, canvas_buf, &mem1)) goto Err; GetEncodedData(&mem1, full_image); if (enc->options_.allow_mixed) { if (!EncodeFrame(&enc->last_config_reversed_, canvas_buf, &mem2)) goto Err; if (mem2.size < mem1.size) { GetEncodedData(&mem2, full_image); WebPMemoryWriterClear(&mem1); } else { WebPMemoryWriterClear(&mem2); } } return 1; Err: WebPMemoryWriterClear(&mem1); WebPMemoryWriterClear(&mem2); return 0; } // Convert a single-frame animation to a non-animated image if appropriate. // TODO(urvang): Can we pick one of the two heuristically (based on frame // rectangle and/or presence of alpha)? static WebPMuxError OptimizeSingleFrame(WebPAnimEncoder* const enc, WebPData* const webp_data) { WebPMuxError err = WEBP_MUX_OK; int canvas_width, canvas_height; WebPMuxFrameInfo frame; WebPData full_image; WebPData webp_data2; WebPMux* const mux = WebPMuxCreate(webp_data, 0); if (mux == NULL) return WEBP_MUX_BAD_DATA; assert(enc->out_frame_count_ == 1); WebPDataInit(&frame.bitstream); WebPDataInit(&full_image); WebPDataInit(&webp_data2); err = WebPMuxGetFrame(mux, 1, &frame); if (err != WEBP_MUX_OK) goto End; if (frame.id != WEBP_CHUNK_ANMF) goto End; // Non-animation: nothing to do. err = WebPMuxGetCanvasSize(mux, &canvas_width, &canvas_height); if (err != WEBP_MUX_OK) goto End; if (!FrameToFullCanvas(enc, &frame, &full_image)) { err = WEBP_MUX_BAD_DATA; goto End; } err = WebPMuxSetImage(mux, &full_image, 1); if (err != WEBP_MUX_OK) goto End; err = WebPMuxAssemble(mux, &webp_data2); if (err != WEBP_MUX_OK) goto End; if (webp_data2.size < webp_data->size) { // Pick 'webp_data2' if smaller. WebPDataClear(webp_data); *webp_data = webp_data2; WebPDataInit(&webp_data2); } End: WebPDataClear(&frame.bitstream); WebPDataClear(&full_image); WebPMuxDelete(mux); WebPDataClear(&webp_data2); return err; } int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data) { WebPMux* mux; WebPMuxError err; if (enc == NULL) { return 0; } MarkNoError(enc); if (webp_data == NULL) { MarkError(enc, "ERROR assembling: NULL input"); return 0; } if (enc->in_frame_count_ == 0) { MarkError(enc, "ERROR: No frames to assemble"); return 0; } if (!enc->got_null_frame_ && enc->in_frame_count_ > 1 && enc->count_ > 0) { // set duration of the last frame to be avg of durations of previous frames. const double delta_time = (uint32_t)enc->prev_timestamp_ - enc->first_timestamp_; const int average_duration = (int)(delta_time / (enc->in_frame_count_ - 1)); if (!IncreasePreviousDuration(enc, average_duration)) { return 0; } } // Flush any remaining frames. enc->flush_count_ = enc->count_; if (!FlushFrames(enc)) { return 0; } // Set definitive canvas size. mux = enc->mux_; err = WebPMuxSetCanvasSize(mux, enc->canvas_width_, enc->canvas_height_); if (err != WEBP_MUX_OK) goto Err; err = WebPMuxSetAnimationParams(mux, &enc->options_.anim_params); if (err != WEBP_MUX_OK) goto Err; // Assemble into a WebP bitstream. err = WebPMuxAssemble(mux, webp_data); if (err != WEBP_MUX_OK) goto Err; if (enc->out_frame_count_ == 1) { err = OptimizeSingleFrame(enc, webp_data); if (err != WEBP_MUX_OK) goto Err; } return 1; Err: MarkError2(enc, "ERROR assembling WebP", err); return 0; } const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc) { if (enc == NULL) return NULL; return enc->error_str_; } WebPMuxError WebPAnimEncoderSetChunk( WebPAnimEncoder* enc, const char fourcc[4], const WebPData* chunk_data, int copy_data) { if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT; return WebPMuxSetChunk(enc->mux_, fourcc, chunk_data, copy_data); } WebPMuxError WebPAnimEncoderGetChunk( const WebPAnimEncoder* enc, const char fourcc[4], WebPData* chunk_data) { if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT; return WebPMuxGetChunk(enc->mux_, fourcc, chunk_data); } WebPMuxError WebPAnimEncoderDeleteChunk( WebPAnimEncoder* enc, const char fourcc[4]) { if (enc == NULL) return WEBP_MUX_INVALID_ARGUMENT; return WebPMuxDeleteChunk(enc->mux_, fourcc); } // ----------------------------------------------------------------------------- libwebp-1.4.0/src/mux/libwebpmux.rc0000644000014400001440000000200514606317060014154 0ustar #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" #undef APSTUDIO_READONLY_SYMBOLS #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,4,0 PRODUCTVERSION 1,0,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Google, Inc." VALUE "FileDescription", "libwebpmux DLL" VALUE "FileVersion", "1.4.0" VALUE "InternalName", "libwebpmux.dll" VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "libwebpmux.dll" VALUE "ProductName", "WebP Image Muxer" VALUE "ProductVersion", "1.4.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources libwebp-1.4.0/src/mux/Makefile.in0000644000014400001440000006045414606317244013535 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/mux ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(libwebpmuxinclude_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = libwebpmux.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(libwebpmuxincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libwebpmux_la_DEPENDENCIES = ../libwebp.la am_libwebpmux_la_OBJECTS = anim_encode.lo muxedit.lo muxinternal.lo \ muxread.lo libwebpmux_la_OBJECTS = $(am_libwebpmux_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebpmux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libwebpmux_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/anim_encode.Plo \ ./$(DEPDIR)/muxedit.Plo ./$(DEPDIR)/muxinternal.Plo \ ./$(DEPDIR)/muxread.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpmux_la_SOURCES) DIST_SOURCES = $(libwebpmux_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(libwebpmuxinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libwebpmux.pc.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ lib_LTLIBRARIES = libwebpmux.la libwebpmux_la_SOURCES = anim_encode.c animi.h muxedit.c muxi.h \ muxinternal.c muxread.c libwebpmuxinclude_HEADERS = ../webp/mux.h ../webp/mux_types.h \ ../webp/types.h noinst_HEADERS = ../webp/format_constants.h libwebpmux_la_LIBADD = ../libwebp.la libwebpmux_la_LDFLAGS = -no-undefined -version-info 4:0:1 -lm libwebpmuxincludedir = $(includedir)/webp pkgconfig_DATA = libwebpmux.pc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/mux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/mux/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libwebpmux.pc: $(top_builddir)/config.status $(srcdir)/libwebpmux.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpmux.la: $(libwebpmux_la_OBJECTS) $(libwebpmux_la_DEPENDENCIES) $(EXTRA_libwebpmux_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpmux_la_LINK) -rpath $(libdir) $(libwebpmux_la_OBJECTS) $(libwebpmux_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_encode.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muxedit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muxinternal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muxread.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-libwebpmuxincludeHEADERS: $(libwebpmuxinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libwebpmuxinclude_HEADERS)'; test -n "$(libwebpmuxincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libwebpmuxincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libwebpmuxincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libwebpmuxincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libwebpmuxincludedir)" || exit $$?; \ done uninstall-libwebpmuxincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libwebpmuxinclude_HEADERS)'; test -n "$(libwebpmuxincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libwebpmuxincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(libwebpmuxincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/anim_encode.Plo -rm -f ./$(DEPDIR)/muxedit.Plo -rm -f ./$(DEPDIR)/muxinternal.Plo -rm -f ./$(DEPDIR)/muxread.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libwebpmuxincludeHEADERS \ install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/anim_encode.Plo -rm -f ./$(DEPDIR)/muxedit.Plo -rm -f ./$(DEPDIR)/muxinternal.Plo -rm -f ./$(DEPDIR)/muxread.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-libwebpmuxincludeHEADERS uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES \ install-libwebpmuxincludeHEADERS install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-libLTLIBRARIES uninstall-libwebpmuxincludeHEADERS \ uninstall-pkgconfigDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/Makefile.am0000644000014400001440000000310114606317060012671 0ustar # The mux and demux libraries depend on libwebp, thus the '.' to force # the build order so it's available to them. SUBDIRS = dec enc dsp utils . if BUILD_MUX SUBDIRS += mux endif if BUILD_DEMUX SUBDIRS += demux endif lib_LTLIBRARIES = libwebp.la if BUILD_LIBWEBPDECODER lib_LTLIBRARIES += libwebpdecoder.la endif common_HEADERS = common_HEADERS += webp/decode.h common_HEADERS += webp/types.h commondir = $(includedir)/webp libwebp_la_SOURCES = libwebpinclude_HEADERS = libwebpinclude_HEADERS += webp/encode.h noinst_HEADERS = noinst_HEADERS += webp/format_constants.h libwebp_la_LIBADD = libwebp_la_LIBADD += dec/libwebpdecode.la libwebp_la_LIBADD += dsp/libwebpdsp.la libwebp_la_LIBADD += enc/libwebpencode.la libwebp_la_LIBADD += utils/libwebputils.la # Use '-no-undefined' to declare that libwebp does not depend on any libraries # other than the ones listed on the command line, i.e., after linking, it will # not have unresolved symbols. Some platforms (Windows among them) require all # symbols in shared libraries to be resolved at library creation. libwebp_la_LDFLAGS = -no-undefined -version-info 8:9:1 libwebpincludedir = $(includedir)/webp pkgconfig_DATA = libwebp.pc if BUILD_LIBWEBPDECODER libwebpdecoder_la_SOURCES = libwebpdecoder_la_LIBADD = libwebpdecoder_la_LIBADD += dec/libwebpdecode.la libwebpdecoder_la_LIBADD += dsp/libwebpdspdecode.la libwebpdecoder_la_LIBADD += utils/libwebputilsdecode.la libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 4:9:1 pkgconfig_DATA += libwebpdecoder.pc endif ${pkgconfig_DATA}: ${top_builddir}/config.status libwebp-1.4.0/src/libwebp.pc.in0000644000014400001440000000050414606317060013216 0ustar prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libwebp Description: Library for the WebP graphics format Version: @PACKAGE_VERSION@ Requires.private: libsharpyuv Cflags: -I${includedir} Libs: -L${libdir} -l@webp_libname_prefix@webp Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ libwebp-1.4.0/src/enc/0000755000014400001440000000000014606317244011413 5ustar libwebp-1.4.0/src/enc/vp8l_enc.c0000644000014400001440000021026214606317060013274 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // main entry for the lossless encoder. // // Author: Vikas Arora (vikaas.arora@gmail.com) // #include #include #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/enc/backward_references_enc.h" #include "src/enc/histogram_enc.h" #include "src/enc/vp8i_enc.h" #include "src/enc/vp8li_enc.h" #include "src/utils/bit_writer_utils.h" #include "src/utils/huffman_encode_utils.h" #include "src/utils/palette.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" // Maximum number of histogram images (sub-blocks). #define MAX_HUFF_IMAGE_SIZE 2600 // ----------------------------------------------------------------------------- // Palette // These five modes are evaluated and their respective entropy is computed. typedef enum { kDirect = 0, kSpatial = 1, kSubGreen = 2, kSpatialSubGreen = 3, kPalette = 4, kPaletteAndSpatial = 5, kNumEntropyIx = 6 } EntropyIx; typedef enum { kHistoAlpha = 0, kHistoAlphaPred, kHistoGreen, kHistoGreenPred, kHistoRed, kHistoRedPred, kHistoBlue, kHistoBluePred, kHistoRedSubGreen, kHistoRedPredSubGreen, kHistoBlueSubGreen, kHistoBluePredSubGreen, kHistoPalette, kHistoTotal // Must be last. } HistoIx; static void AddSingleSubGreen(uint32_t p, uint32_t* const r, uint32_t* const b) { const int green = (int)p >> 8; // The upper bits are masked away later. ++r[(((int)p >> 16) - green) & 0xff]; ++b[(((int)p >> 0) - green) & 0xff]; } static void AddSingle(uint32_t p, uint32_t* const a, uint32_t* const r, uint32_t* const g, uint32_t* const b) { ++a[(p >> 24) & 0xff]; ++r[(p >> 16) & 0xff]; ++g[(p >> 8) & 0xff]; ++b[(p >> 0) & 0xff]; } static WEBP_INLINE uint32_t HashPix(uint32_t pix) { // Note that masking with 0xffffffffu is for preventing an // 'unsigned int overflow' warning. Doesn't impact the compiled code. return ((((uint64_t)pix + (pix >> 19)) * 0x39c5fba7ull) & 0xffffffffu) >> 24; } static int AnalyzeEntropy(const uint32_t* argb, int width, int height, int argb_stride, int use_palette, int palette_size, int transform_bits, EntropyIx* const min_entropy_ix, int* const red_and_blue_always_zero) { // Allocate histogram set with cache_bits = 0. uint32_t* histo; if (use_palette && palette_size <= 16) { // In the case of small palettes, we pack 2, 4 or 8 pixels together. In // practice, small palettes are better than any other transform. *min_entropy_ix = kPalette; *red_and_blue_always_zero = 1; return 1; } histo = (uint32_t*)WebPSafeCalloc(kHistoTotal, sizeof(*histo) * 256); if (histo != NULL) { int i, x, y; const uint32_t* prev_row = NULL; const uint32_t* curr_row = argb; uint32_t pix_prev = argb[0]; // Skip the first pixel. for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { const uint32_t pix = curr_row[x]; const uint32_t pix_diff = VP8LSubPixels(pix, pix_prev); pix_prev = pix; if ((pix_diff == 0) || (prev_row != NULL && pix == prev_row[x])) { continue; } AddSingle(pix, &histo[kHistoAlpha * 256], &histo[kHistoRed * 256], &histo[kHistoGreen * 256], &histo[kHistoBlue * 256]); AddSingle(pix_diff, &histo[kHistoAlphaPred * 256], &histo[kHistoRedPred * 256], &histo[kHistoGreenPred * 256], &histo[kHistoBluePred * 256]); AddSingleSubGreen(pix, &histo[kHistoRedSubGreen * 256], &histo[kHistoBlueSubGreen * 256]); AddSingleSubGreen(pix_diff, &histo[kHistoRedPredSubGreen * 256], &histo[kHistoBluePredSubGreen * 256]); { // Approximate the palette by the entropy of the multiplicative hash. const uint32_t hash = HashPix(pix); ++histo[kHistoPalette * 256 + hash]; } } prev_row = curr_row; curr_row += argb_stride; } { float entropy_comp[kHistoTotal]; float entropy[kNumEntropyIx]; int k; int last_mode_to_analyze = use_palette ? kPalette : kSpatialSubGreen; int j; // Let's add one zero to the predicted histograms. The zeros are removed // too efficiently by the pix_diff == 0 comparison, at least one of the // zeros is likely to exist. ++histo[kHistoRedPredSubGreen * 256]; ++histo[kHistoBluePredSubGreen * 256]; ++histo[kHistoRedPred * 256]; ++histo[kHistoGreenPred * 256]; ++histo[kHistoBluePred * 256]; ++histo[kHistoAlphaPred * 256]; for (j = 0; j < kHistoTotal; ++j) { entropy_comp[j] = VP8LBitsEntropy(&histo[j * 256], 256); } entropy[kDirect] = entropy_comp[kHistoAlpha] + entropy_comp[kHistoRed] + entropy_comp[kHistoGreen] + entropy_comp[kHistoBlue]; entropy[kSpatial] = entropy_comp[kHistoAlphaPred] + entropy_comp[kHistoRedPred] + entropy_comp[kHistoGreenPred] + entropy_comp[kHistoBluePred]; entropy[kSubGreen] = entropy_comp[kHistoAlpha] + entropy_comp[kHistoRedSubGreen] + entropy_comp[kHistoGreen] + entropy_comp[kHistoBlueSubGreen]; entropy[kSpatialSubGreen] = entropy_comp[kHistoAlphaPred] + entropy_comp[kHistoRedPredSubGreen] + entropy_comp[kHistoGreenPred] + entropy_comp[kHistoBluePredSubGreen]; entropy[kPalette] = entropy_comp[kHistoPalette]; // When including transforms, there is an overhead in bits from // storing them. This overhead is small but matters for small images. // For spatial, there are 14 transformations. entropy[kSpatial] += VP8LSubSampleSize(width, transform_bits) * VP8LSubSampleSize(height, transform_bits) * VP8LFastLog2(14); // For color transforms: 24 as only 3 channels are considered in a // ColorTransformElement. entropy[kSpatialSubGreen] += VP8LSubSampleSize(width, transform_bits) * VP8LSubSampleSize(height, transform_bits) * VP8LFastLog2(24); // For palettes, add the cost of storing the palette. // We empirically estimate the cost of a compressed entry as 8 bits. // The palette is differential-coded when compressed hence a much // lower cost than sizeof(uint32_t)*8. entropy[kPalette] += palette_size * 8; *min_entropy_ix = kDirect; for (k = kDirect + 1; k <= last_mode_to_analyze; ++k) { if (entropy[*min_entropy_ix] > entropy[k]) { *min_entropy_ix = (EntropyIx)k; } } assert((int)*min_entropy_ix <= last_mode_to_analyze); *red_and_blue_always_zero = 1; // Let's check if the histogram of the chosen entropy mode has // non-zero red and blue values. If all are zero, we can later skip // the cross color optimization. { static const uint8_t kHistoPairs[5][2] = { { kHistoRed, kHistoBlue }, { kHistoRedPred, kHistoBluePred }, { kHistoRedSubGreen, kHistoBlueSubGreen }, { kHistoRedPredSubGreen, kHistoBluePredSubGreen }, { kHistoRed, kHistoBlue } }; const uint32_t* const red_histo = &histo[256 * kHistoPairs[*min_entropy_ix][0]]; const uint32_t* const blue_histo = &histo[256 * kHistoPairs[*min_entropy_ix][1]]; for (i = 1; i < 256; ++i) { if ((red_histo[i] | blue_histo[i]) != 0) { *red_and_blue_always_zero = 0; break; } } } } WebPSafeFree(histo); return 1; } else { return 0; } } static int GetHistoBits(int method, int use_palette, int width, int height) { // Make tile size a function of encoding method (Range: 0 to 6). int histo_bits = (use_palette ? 9 : 7) - method; while (1) { const int huff_image_size = VP8LSubSampleSize(width, histo_bits) * VP8LSubSampleSize(height, histo_bits); if (huff_image_size <= MAX_HUFF_IMAGE_SIZE) break; ++histo_bits; } return (histo_bits < MIN_HUFFMAN_BITS) ? MIN_HUFFMAN_BITS : (histo_bits > MAX_HUFFMAN_BITS) ? MAX_HUFFMAN_BITS : histo_bits; } static int GetTransformBits(int method, int histo_bits) { const int max_transform_bits = (method < 4) ? 6 : (method > 4) ? 4 : 5; const int res = (histo_bits > max_transform_bits) ? max_transform_bits : histo_bits; assert(res <= MAX_TRANSFORM_BITS); return res; } // Set of parameters to be used in each iteration of the cruncher. #define CRUNCH_SUBCONFIGS_MAX 2 typedef struct { int lz77_; int do_no_cache_; } CrunchSubConfig; typedef struct { int entropy_idx_; PaletteSorting palette_sorting_type_; CrunchSubConfig sub_configs_[CRUNCH_SUBCONFIGS_MAX]; int sub_configs_size_; } CrunchConfig; // +2 because we add a palette sorting configuration for kPalette and // kPaletteAndSpatial. #define CRUNCH_CONFIGS_MAX (kNumEntropyIx + 2 * kPaletteSortingNum) static int EncoderAnalyze(VP8LEncoder* const enc, CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX], int* const crunch_configs_size, int* const red_and_blue_always_zero) { const WebPPicture* const pic = enc->pic_; const int width = pic->width; const int height = pic->height; const WebPConfig* const config = enc->config_; const int method = config->method; const int low_effort = (config->method == 0); int i; int use_palette; int n_lz77s; // If set to 0, analyze the cache with the computed cache value. If 1, also // analyze with no-cache. int do_no_cache = 0; assert(pic != NULL && pic->argb != NULL); // Check whether a palette is possible. enc->palette_size_ = GetColorPalette(pic, enc->palette_sorted_); use_palette = (enc->palette_size_ <= MAX_PALETTE_SIZE); if (!use_palette) { enc->palette_size_ = 0; } // Empirical bit sizes. enc->histo_bits_ = GetHistoBits(method, use_palette, pic->width, pic->height); enc->transform_bits_ = GetTransformBits(method, enc->histo_bits_); if (low_effort) { // AnalyzeEntropy is somewhat slow. crunch_configs[0].entropy_idx_ = use_palette ? kPalette : kSpatialSubGreen; crunch_configs[0].palette_sorting_type_ = use_palette ? kSortedDefault : kUnusedPalette; n_lz77s = 1; *crunch_configs_size = 1; } else { EntropyIx min_entropy_ix; // Try out multiple LZ77 on images with few colors. n_lz77s = (enc->palette_size_ > 0 && enc->palette_size_ <= 16) ? 2 : 1; if (!AnalyzeEntropy(pic->argb, width, height, pic->argb_stride, use_palette, enc->palette_size_, enc->transform_bits_, &min_entropy_ix, red_and_blue_always_zero)) { return 0; } if (method == 6 && config->quality == 100) { do_no_cache = 1; // Go brute force on all transforms. *crunch_configs_size = 0; for (i = 0; i < kNumEntropyIx; ++i) { // We can only apply kPalette or kPaletteAndSpatial if we can indeed use // a palette. if ((i != kPalette && i != kPaletteAndSpatial) || use_palette) { assert(*crunch_configs_size < CRUNCH_CONFIGS_MAX); if (use_palette && (i == kPalette || i == kPaletteAndSpatial)) { int sorting_method; for (sorting_method = 0; sorting_method < kPaletteSortingNum; ++sorting_method) { const PaletteSorting typed_sorting_method = (PaletteSorting)sorting_method; // TODO(vrabaud) kSortedDefault should be tested. It is omitted // for now for backward compatibility. if (typed_sorting_method == kUnusedPalette || typed_sorting_method == kSortedDefault) { continue; } crunch_configs[(*crunch_configs_size)].entropy_idx_ = i; crunch_configs[(*crunch_configs_size)].palette_sorting_type_ = typed_sorting_method; ++*crunch_configs_size; } } else { crunch_configs[(*crunch_configs_size)].entropy_idx_ = i; crunch_configs[(*crunch_configs_size)].palette_sorting_type_ = kUnusedPalette; ++*crunch_configs_size; } } } } else { // Only choose the guessed best transform. *crunch_configs_size = 1; crunch_configs[0].entropy_idx_ = min_entropy_ix; crunch_configs[0].palette_sorting_type_ = use_palette ? kMinimizeDelta : kUnusedPalette; if (config->quality >= 75 && method == 5) { // Test with and without color cache. do_no_cache = 1; // If we have a palette, also check in combination with spatial. if (min_entropy_ix == kPalette) { *crunch_configs_size = 2; crunch_configs[1].entropy_idx_ = kPaletteAndSpatial; crunch_configs[1].palette_sorting_type_ = kMinimizeDelta; } } } } // Fill in the different LZ77s. assert(n_lz77s <= CRUNCH_SUBCONFIGS_MAX); for (i = 0; i < *crunch_configs_size; ++i) { int j; for (j = 0; j < n_lz77s; ++j) { assert(j < CRUNCH_SUBCONFIGS_MAX); crunch_configs[i].sub_configs_[j].lz77_ = (j == 0) ? kLZ77Standard | kLZ77RLE : kLZ77Box; crunch_configs[i].sub_configs_[j].do_no_cache_ = do_no_cache; } crunch_configs[i].sub_configs_size_ = n_lz77s; } return 1; } static int EncoderInit(VP8LEncoder* const enc) { const WebPPicture* const pic = enc->pic_; const int width = pic->width; const int height = pic->height; const int pix_cnt = width * height; // we round the block size up, so we're guaranteed to have // at most MAX_REFS_BLOCK_PER_IMAGE blocks used: const int refs_block_size = (pix_cnt - 1) / MAX_REFS_BLOCK_PER_IMAGE + 1; int i; if (!VP8LHashChainInit(&enc->hash_chain_, pix_cnt)) return 0; for (i = 0; i < 4; ++i) VP8LBackwardRefsInit(&enc->refs_[i], refs_block_size); return 1; } // Returns false in case of memory error. static int GetHuffBitLengthsAndCodes( const VP8LHistogramSet* const histogram_image, HuffmanTreeCode* const huffman_codes) { int i, k; int ok = 0; uint64_t total_length_size = 0; uint8_t* mem_buf = NULL; const int histogram_image_size = histogram_image->size; int max_num_symbols = 0; uint8_t* buf_rle = NULL; HuffmanTree* huff_tree = NULL; // Iterate over all histograms and get the aggregate number of codes used. for (i = 0; i < histogram_image_size; ++i) { const VP8LHistogram* const histo = histogram_image->histograms[i]; HuffmanTreeCode* const codes = &huffman_codes[5 * i]; assert(histo != NULL); for (k = 0; k < 5; ++k) { const int num_symbols = (k == 0) ? VP8LHistogramNumCodes(histo->palette_code_bits_) : (k == 4) ? NUM_DISTANCE_CODES : 256; codes[k].num_symbols = num_symbols; total_length_size += num_symbols; } } // Allocate and Set Huffman codes. { uint16_t* codes; uint8_t* lengths; mem_buf = (uint8_t*)WebPSafeCalloc(total_length_size, sizeof(*lengths) + sizeof(*codes)); if (mem_buf == NULL) goto End; codes = (uint16_t*)mem_buf; lengths = (uint8_t*)&codes[total_length_size]; for (i = 0; i < 5 * histogram_image_size; ++i) { const int bit_length = huffman_codes[i].num_symbols; huffman_codes[i].codes = codes; huffman_codes[i].code_lengths = lengths; codes += bit_length; lengths += bit_length; if (max_num_symbols < bit_length) { max_num_symbols = bit_length; } } } buf_rle = (uint8_t*)WebPSafeMalloc(1ULL, max_num_symbols); huff_tree = (HuffmanTree*)WebPSafeMalloc(3ULL * max_num_symbols, sizeof(*huff_tree)); if (buf_rle == NULL || huff_tree == NULL) goto End; // Create Huffman trees. for (i = 0; i < histogram_image_size; ++i) { HuffmanTreeCode* const codes = &huffman_codes[5 * i]; VP8LHistogram* const histo = histogram_image->histograms[i]; VP8LCreateHuffmanTree(histo->literal_, 15, buf_rle, huff_tree, codes + 0); VP8LCreateHuffmanTree(histo->red_, 15, buf_rle, huff_tree, codes + 1); VP8LCreateHuffmanTree(histo->blue_, 15, buf_rle, huff_tree, codes + 2); VP8LCreateHuffmanTree(histo->alpha_, 15, buf_rle, huff_tree, codes + 3); VP8LCreateHuffmanTree(histo->distance_, 15, buf_rle, huff_tree, codes + 4); } ok = 1; End: WebPSafeFree(huff_tree); WebPSafeFree(buf_rle); if (!ok) { WebPSafeFree(mem_buf); memset(huffman_codes, 0, 5 * histogram_image_size * sizeof(*huffman_codes)); } return ok; } static void StoreHuffmanTreeOfHuffmanTreeToBitMask( VP8LBitWriter* const bw, const uint8_t* code_length_bitdepth) { // RFC 1951 will calm you down if you are worried about this funny sequence. // This sequence is tuned from that, but more weighted for lower symbol count, // and more spiking histograms. static const uint8_t kStorageOrder[CODE_LENGTH_CODES] = { 17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; int i; // Throw away trailing zeros: int codes_to_store = CODE_LENGTH_CODES; for (; codes_to_store > 4; --codes_to_store) { if (code_length_bitdepth[kStorageOrder[codes_to_store - 1]] != 0) { break; } } VP8LPutBits(bw, codes_to_store - 4, 4); for (i = 0; i < codes_to_store; ++i) { VP8LPutBits(bw, code_length_bitdepth[kStorageOrder[i]], 3); } } static void ClearHuffmanTreeIfOnlyOneSymbol( HuffmanTreeCode* const huffman_code) { int k; int count = 0; for (k = 0; k < huffman_code->num_symbols; ++k) { if (huffman_code->code_lengths[k] != 0) { ++count; if (count > 1) return; } } for (k = 0; k < huffman_code->num_symbols; ++k) { huffman_code->code_lengths[k] = 0; huffman_code->codes[k] = 0; } } static void StoreHuffmanTreeToBitMask( VP8LBitWriter* const bw, const HuffmanTreeToken* const tokens, const int num_tokens, const HuffmanTreeCode* const huffman_code) { int i; for (i = 0; i < num_tokens; ++i) { const int ix = tokens[i].code; const int extra_bits = tokens[i].extra_bits; VP8LPutBits(bw, huffman_code->codes[ix], huffman_code->code_lengths[ix]); switch (ix) { case 16: VP8LPutBits(bw, extra_bits, 2); break; case 17: VP8LPutBits(bw, extra_bits, 3); break; case 18: VP8LPutBits(bw, extra_bits, 7); break; } } } // 'huff_tree' and 'tokens' are pre-alloacted buffers. static void StoreFullHuffmanCode(VP8LBitWriter* const bw, HuffmanTree* const huff_tree, HuffmanTreeToken* const tokens, const HuffmanTreeCode* const tree) { uint8_t code_length_bitdepth[CODE_LENGTH_CODES] = { 0 }; uint16_t code_length_bitdepth_symbols[CODE_LENGTH_CODES] = { 0 }; const int max_tokens = tree->num_symbols; int num_tokens; HuffmanTreeCode huffman_code; huffman_code.num_symbols = CODE_LENGTH_CODES; huffman_code.code_lengths = code_length_bitdepth; huffman_code.codes = code_length_bitdepth_symbols; VP8LPutBits(bw, 0, 1); num_tokens = VP8LCreateCompressedHuffmanTree(tree, tokens, max_tokens); { uint32_t histogram[CODE_LENGTH_CODES] = { 0 }; uint8_t buf_rle[CODE_LENGTH_CODES] = { 0 }; int i; for (i = 0; i < num_tokens; ++i) { ++histogram[tokens[i].code]; } VP8LCreateHuffmanTree(histogram, 7, buf_rle, huff_tree, &huffman_code); } StoreHuffmanTreeOfHuffmanTreeToBitMask(bw, code_length_bitdepth); ClearHuffmanTreeIfOnlyOneSymbol(&huffman_code); { int trailing_zero_bits = 0; int trimmed_length = num_tokens; int write_trimmed_length; int length; int i = num_tokens; while (i-- > 0) { const int ix = tokens[i].code; if (ix == 0 || ix == 17 || ix == 18) { --trimmed_length; // discount trailing zeros trailing_zero_bits += code_length_bitdepth[ix]; if (ix == 17) { trailing_zero_bits += 3; } else if (ix == 18) { trailing_zero_bits += 7; } } else { break; } } write_trimmed_length = (trimmed_length > 1 && trailing_zero_bits > 12); length = write_trimmed_length ? trimmed_length : num_tokens; VP8LPutBits(bw, write_trimmed_length, 1); if (write_trimmed_length) { if (trimmed_length == 2) { VP8LPutBits(bw, 0, 3 + 2); // nbitpairs=1, trimmed_length=2 } else { const int nbits = BitsLog2Floor(trimmed_length - 2); const int nbitpairs = nbits / 2 + 1; assert(trimmed_length > 2); assert(nbitpairs - 1 < 8); VP8LPutBits(bw, nbitpairs - 1, 3); VP8LPutBits(bw, trimmed_length - 2, nbitpairs * 2); } } StoreHuffmanTreeToBitMask(bw, tokens, length, &huffman_code); } } // 'huff_tree' and 'tokens' are pre-alloacted buffers. static void StoreHuffmanCode(VP8LBitWriter* const bw, HuffmanTree* const huff_tree, HuffmanTreeToken* const tokens, const HuffmanTreeCode* const huffman_code) { int i; int count = 0; int symbols[2] = { 0, 0 }; const int kMaxBits = 8; const int kMaxSymbol = 1 << kMaxBits; // Check whether it's a small tree. for (i = 0; i < huffman_code->num_symbols && count < 3; ++i) { if (huffman_code->code_lengths[i] != 0) { if (count < 2) symbols[count] = i; ++count; } } if (count == 0) { // emit minimal tree for empty cases // bits: small tree marker: 1, count-1: 0, large 8-bit code: 0, code: 0 VP8LPutBits(bw, 0x01, 4); } else if (count <= 2 && symbols[0] < kMaxSymbol && symbols[1] < kMaxSymbol) { VP8LPutBits(bw, 1, 1); // Small tree marker to encode 1 or 2 symbols. VP8LPutBits(bw, count - 1, 1); if (symbols[0] <= 1) { VP8LPutBits(bw, 0, 1); // Code bit for small (1 bit) symbol value. VP8LPutBits(bw, symbols[0], 1); } else { VP8LPutBits(bw, 1, 1); VP8LPutBits(bw, symbols[0], 8); } if (count == 2) { VP8LPutBits(bw, symbols[1], 8); } } else { StoreFullHuffmanCode(bw, huff_tree, tokens, huffman_code); } } static WEBP_INLINE void WriteHuffmanCode(VP8LBitWriter* const bw, const HuffmanTreeCode* const code, int code_index) { const int depth = code->code_lengths[code_index]; const int symbol = code->codes[code_index]; VP8LPutBits(bw, symbol, depth); } static WEBP_INLINE void WriteHuffmanCodeWithExtraBits( VP8LBitWriter* const bw, const HuffmanTreeCode* const code, int code_index, int bits, int n_bits) { const int depth = code->code_lengths[code_index]; const int symbol = code->codes[code_index]; VP8LPutBits(bw, (bits << depth) | symbol, depth + n_bits); } static int StoreImageToBitMask( VP8LBitWriter* const bw, int width, int histo_bits, const VP8LBackwardRefs* const refs, const uint16_t* histogram_symbols, const HuffmanTreeCode* const huffman_codes, const WebPPicture* const pic) { const int histo_xsize = histo_bits ? VP8LSubSampleSize(width, histo_bits) : 1; const int tile_mask = (histo_bits == 0) ? 0 : -(1 << histo_bits); // x and y trace the position in the image. int x = 0; int y = 0; int tile_x = x & tile_mask; int tile_y = y & tile_mask; int histogram_ix = histogram_symbols[0]; const HuffmanTreeCode* codes = huffman_codes + 5 * histogram_ix; VP8LRefsCursor c = VP8LRefsCursorInit(refs); while (VP8LRefsCursorOk(&c)) { const PixOrCopy* const v = c.cur_pos; if ((tile_x != (x & tile_mask)) || (tile_y != (y & tile_mask))) { tile_x = x & tile_mask; tile_y = y & tile_mask; histogram_ix = histogram_symbols[(y >> histo_bits) * histo_xsize + (x >> histo_bits)]; codes = huffman_codes + 5 * histogram_ix; } if (PixOrCopyIsLiteral(v)) { static const uint8_t order[] = { 1, 2, 0, 3 }; int k; for (k = 0; k < 4; ++k) { const int code = PixOrCopyLiteral(v, order[k]); WriteHuffmanCode(bw, codes + k, code); } } else if (PixOrCopyIsCacheIdx(v)) { const int code = PixOrCopyCacheIdx(v); const int literal_ix = 256 + NUM_LENGTH_CODES + code; WriteHuffmanCode(bw, codes, literal_ix); } else { int bits, n_bits; int code; const int distance = PixOrCopyDistance(v); VP8LPrefixEncode(v->len, &code, &n_bits, &bits); WriteHuffmanCodeWithExtraBits(bw, codes, 256 + code, bits, n_bits); // Don't write the distance with the extra bits code since // the distance can be up to 18 bits of extra bits, and the prefix // 15 bits, totaling to 33, and our PutBits only supports up to 32 bits. VP8LPrefixEncode(distance, &code, &n_bits, &bits); WriteHuffmanCode(bw, codes + 4, code); VP8LPutBits(bw, bits, n_bits); } x += PixOrCopyLength(v); while (x >= width) { x -= width; ++y; } VP8LRefsCursorNext(&c); } if (bw->error_) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } return 1; } // Special case of EncodeImageInternal() for cache-bits=0, histo_bits=31. // pic and percent are for progress. static int EncodeImageNoHuffman(VP8LBitWriter* const bw, const uint32_t* const argb, VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_array, int width, int height, int quality, int low_effort, const WebPPicture* const pic, int percent_range, int* const percent) { int i; int max_tokens = 0; VP8LBackwardRefs* refs; HuffmanTreeToken* tokens = NULL; HuffmanTreeCode huffman_codes[5] = {{0, NULL, NULL}}; const uint16_t histogram_symbols[1] = {0}; // only one tree, one symbol int cache_bits = 0; VP8LHistogramSet* histogram_image = NULL; HuffmanTree* const huff_tree = (HuffmanTree*)WebPSafeMalloc( 3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree)); if (huff_tree == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Calculate backward references from ARGB image. if (!VP8LHashChainFill(hash_chain, quality, argb, width, height, low_effort, pic, percent_range / 2, percent)) { goto Error; } if (!VP8LGetBackwardReferences(width, height, argb, quality, /*low_effort=*/0, kLZ77Standard | kLZ77RLE, cache_bits, /*do_no_cache=*/0, hash_chain, refs_array, &cache_bits, pic, percent_range - percent_range / 2, percent)) { goto Error; } refs = &refs_array[0]; histogram_image = VP8LAllocateHistogramSet(1, cache_bits); if (histogram_image == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } VP8LHistogramSetClear(histogram_image); // Build histogram image and symbols from backward references. VP8LHistogramStoreRefs(refs, histogram_image->histograms[0]); // Create Huffman bit lengths and codes for each histogram image. assert(histogram_image->size == 1); if (!GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // No color cache, no Huffman image. VP8LPutBits(bw, 0, 1); // Find maximum number of symbols for the huffman tree-set. for (i = 0; i < 5; ++i) { HuffmanTreeCode* const codes = &huffman_codes[i]; if (max_tokens < codes->num_symbols) { max_tokens = codes->num_symbols; } } tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens)); if (tokens == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Store Huffman codes. for (i = 0; i < 5; ++i) { HuffmanTreeCode* const codes = &huffman_codes[i]; StoreHuffmanCode(bw, huff_tree, tokens, codes); ClearHuffmanTreeIfOnlyOneSymbol(codes); } // Store actual literals. if (!StoreImageToBitMask(bw, width, 0, refs, histogram_symbols, huffman_codes, pic)) { goto Error; } Error: WebPSafeFree(tokens); WebPSafeFree(huff_tree); VP8LFreeHistogramSet(histogram_image); WebPSafeFree(huffman_codes[0].codes); return (pic->error_code == VP8_ENC_OK); } // pic and percent are for progress. static int EncodeImageInternal( VP8LBitWriter* const bw, const uint32_t* const argb, VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[4], int width, int height, int quality, int low_effort, const CrunchConfig* const config, int* cache_bits, int histogram_bits, size_t init_byte_position, int* const hdr_size, int* const data_size, const WebPPicture* const pic, int percent_range, int* const percent) { const uint32_t histogram_image_xysize = VP8LSubSampleSize(width, histogram_bits) * VP8LSubSampleSize(height, histogram_bits); int remaining_percent = percent_range; int percent_start = *percent; VP8LHistogramSet* histogram_image = NULL; VP8LHistogram* tmp_histo = NULL; int histogram_image_size = 0; size_t bit_array_size = 0; HuffmanTree* const huff_tree = (HuffmanTree*)WebPSafeMalloc( 3ULL * CODE_LENGTH_CODES, sizeof(*huff_tree)); HuffmanTreeToken* tokens = NULL; HuffmanTreeCode* huffman_codes = NULL; uint16_t* const histogram_symbols = (uint16_t*)WebPSafeMalloc( histogram_image_xysize, sizeof(*histogram_symbols)); int sub_configs_idx; int cache_bits_init, write_histogram_image; VP8LBitWriter bw_init = *bw, bw_best; int hdr_size_tmp; VP8LHashChain hash_chain_histogram; // histogram image hash chain size_t bw_size_best = ~(size_t)0; assert(histogram_bits >= MIN_HUFFMAN_BITS); assert(histogram_bits <= MAX_HUFFMAN_BITS); assert(hdr_size != NULL); assert(data_size != NULL); memset(&hash_chain_histogram, 0, sizeof(hash_chain_histogram)); if (!VP8LBitWriterInit(&bw_best, 0)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Make sure we can allocate the different objects. if (huff_tree == NULL || histogram_symbols == NULL || !VP8LHashChainInit(&hash_chain_histogram, histogram_image_xysize)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } percent_range = remaining_percent / 5; if (!VP8LHashChainFill(hash_chain, quality, argb, width, height, low_effort, pic, percent_range, percent)) { goto Error; } percent_start += percent_range; remaining_percent -= percent_range; // If the value is different from zero, it has been set during the palette // analysis. cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits; // If several iterations will happen, clone into bw_best. if ((config->sub_configs_size_ > 1 || config->sub_configs_[0].do_no_cache_) && !VP8LBitWriterClone(bw, &bw_best)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } for (sub_configs_idx = 0; sub_configs_idx < config->sub_configs_size_; ++sub_configs_idx) { const CrunchSubConfig* const sub_config = &config->sub_configs_[sub_configs_idx]; int cache_bits_best, i_cache; int i_remaining_percent = remaining_percent / config->sub_configs_size_; int i_percent_range = i_remaining_percent / 4; i_remaining_percent -= i_percent_range; if (!VP8LGetBackwardReferences( width, height, argb, quality, low_effort, sub_config->lz77_, cache_bits_init, sub_config->do_no_cache_, hash_chain, &refs_array[0], &cache_bits_best, pic, i_percent_range, percent)) { goto Error; } for (i_cache = 0; i_cache < (sub_config->do_no_cache_ ? 2 : 1); ++i_cache) { const int cache_bits_tmp = (i_cache == 0) ? cache_bits_best : 0; // Speed-up: no need to study the no-cache case if it was already studied // in i_cache == 0. if (i_cache == 1 && cache_bits_best == 0) break; // Reset the bit writer for this iteration. VP8LBitWriterReset(&bw_init, bw); // Build histogram image and symbols from backward references. histogram_image = VP8LAllocateHistogramSet(histogram_image_xysize, cache_bits_tmp); tmp_histo = VP8LAllocateHistogram(cache_bits_tmp); if (histogram_image == NULL || tmp_histo == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } i_percent_range = i_remaining_percent / 3; i_remaining_percent -= i_percent_range; if (!VP8LGetHistoImageSymbols( width, height, &refs_array[i_cache], quality, low_effort, histogram_bits, cache_bits_tmp, histogram_image, tmp_histo, histogram_symbols, pic, i_percent_range, percent)) { goto Error; } // Create Huffman bit lengths and codes for each histogram image. histogram_image_size = histogram_image->size; bit_array_size = 5 * histogram_image_size; huffman_codes = (HuffmanTreeCode*)WebPSafeCalloc(bit_array_size, sizeof(*huffman_codes)); // Note: some histogram_image entries may point to tmp_histos[], so the // latter need to outlive the following call to // GetHuffBitLengthsAndCodes(). if (huffman_codes == NULL || !GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Free combined histograms. VP8LFreeHistogramSet(histogram_image); histogram_image = NULL; // Free scratch histograms. VP8LFreeHistogram(tmp_histo); tmp_histo = NULL; // Color Cache parameters. if (cache_bits_tmp > 0) { VP8LPutBits(bw, 1, 1); VP8LPutBits(bw, cache_bits_tmp, 4); } else { VP8LPutBits(bw, 0, 1); } // Huffman image + meta huffman. write_histogram_image = (histogram_image_size > 1); VP8LPutBits(bw, write_histogram_image, 1); if (write_histogram_image) { uint32_t* const histogram_argb = (uint32_t*)WebPSafeMalloc( histogram_image_xysize, sizeof(*histogram_argb)); int max_index = 0; uint32_t i; if (histogram_argb == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } for (i = 0; i < histogram_image_xysize; ++i) { const int symbol_index = histogram_symbols[i] & 0xffff; histogram_argb[i] = (symbol_index << 8); if (symbol_index >= max_index) { max_index = symbol_index + 1; } } histogram_image_size = max_index; VP8LPutBits(bw, histogram_bits - 2, 3); i_percent_range = i_remaining_percent / 2; i_remaining_percent -= i_percent_range; if (!EncodeImageNoHuffman( bw, histogram_argb, &hash_chain_histogram, &refs_array[2], VP8LSubSampleSize(width, histogram_bits), VP8LSubSampleSize(height, histogram_bits), quality, low_effort, pic, i_percent_range, percent)) { WebPSafeFree(histogram_argb); goto Error; } WebPSafeFree(histogram_argb); } // Store Huffman codes. { int i; int max_tokens = 0; // Find maximum number of symbols for the huffman tree-set. for (i = 0; i < 5 * histogram_image_size; ++i) { HuffmanTreeCode* const codes = &huffman_codes[i]; if (max_tokens < codes->num_symbols) { max_tokens = codes->num_symbols; } } tokens = (HuffmanTreeToken*)WebPSafeMalloc(max_tokens, sizeof(*tokens)); if (tokens == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } for (i = 0; i < 5 * histogram_image_size; ++i) { HuffmanTreeCode* const codes = &huffman_codes[i]; StoreHuffmanCode(bw, huff_tree, tokens, codes); ClearHuffmanTreeIfOnlyOneSymbol(codes); } } // Store actual literals. hdr_size_tmp = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position); if (!StoreImageToBitMask(bw, width, histogram_bits, &refs_array[i_cache], histogram_symbols, huffman_codes, pic)) { goto Error; } // Keep track of the smallest image so far. if (VP8LBitWriterNumBytes(bw) < bw_size_best) { bw_size_best = VP8LBitWriterNumBytes(bw); *cache_bits = cache_bits_tmp; *hdr_size = hdr_size_tmp; *data_size = (int)(VP8LBitWriterNumBytes(bw) - init_byte_position - *hdr_size); VP8LBitWriterSwap(bw, &bw_best); } WebPSafeFree(tokens); tokens = NULL; if (huffman_codes != NULL) { WebPSafeFree(huffman_codes->codes); WebPSafeFree(huffman_codes); huffman_codes = NULL; } } } VP8LBitWriterSwap(bw, &bw_best); if (!WebPReportProgress(pic, percent_start + remaining_percent, percent)) { goto Error; } Error: WebPSafeFree(tokens); WebPSafeFree(huff_tree); VP8LFreeHistogramSet(histogram_image); VP8LFreeHistogram(tmp_histo); VP8LHashChainClear(&hash_chain_histogram); if (huffman_codes != NULL) { WebPSafeFree(huffman_codes->codes); WebPSafeFree(huffman_codes); } WebPSafeFree(histogram_symbols); VP8LBitWriterWipeOut(&bw_best); return (pic->error_code == VP8_ENC_OK); } // ----------------------------------------------------------------------------- // Transforms static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height, VP8LBitWriter* const bw) { VP8LPutBits(bw, TRANSFORM_PRESENT, 1); VP8LPutBits(bw, SUBTRACT_GREEN_TRANSFORM, 2); VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height); } static int ApplyPredictFilter(const VP8LEncoder* const enc, int width, int height, int quality, int low_effort, int used_subtract_green, VP8LBitWriter* const bw, int percent_range, int* const percent) { const int pred_bits = enc->transform_bits_; const int transform_width = VP8LSubSampleSize(width, pred_bits); const int transform_height = VP8LSubSampleSize(height, pred_bits); // we disable near-lossless quantization if palette is used. const int near_lossless_strength = enc->use_palette_ ? 100 : enc->config_->near_lossless; if (!VP8LResidualImage( width, height, pred_bits, low_effort, enc->argb_, enc->argb_scratch_, enc->transform_data_, near_lossless_strength, enc->config_->exact, used_subtract_green, enc->pic_, percent_range / 2, percent)) { return 0; } VP8LPutBits(bw, TRANSFORM_PRESENT, 1); VP8LPutBits(bw, PREDICTOR_TRANSFORM, 2); assert(pred_bits >= 2); VP8LPutBits(bw, pred_bits - 2, 3); return EncodeImageNoHuffman( bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_, (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height, quality, low_effort, enc->pic_, percent_range - percent_range / 2, percent); } static int ApplyCrossColorFilter(const VP8LEncoder* const enc, int width, int height, int quality, int low_effort, VP8LBitWriter* const bw, int percent_range, int* const percent) { const int ccolor_transform_bits = enc->transform_bits_; const int transform_width = VP8LSubSampleSize(width, ccolor_transform_bits); const int transform_height = VP8LSubSampleSize(height, ccolor_transform_bits); if (!VP8LColorSpaceTransform(width, height, ccolor_transform_bits, quality, enc->argb_, enc->transform_data_, enc->pic_, percent_range / 2, percent)) { return 0; } VP8LPutBits(bw, TRANSFORM_PRESENT, 1); VP8LPutBits(bw, CROSS_COLOR_TRANSFORM, 2); assert(ccolor_transform_bits >= 2); VP8LPutBits(bw, ccolor_transform_bits - 2, 3); return EncodeImageNoHuffman( bw, enc->transform_data_, (VP8LHashChain*)&enc->hash_chain_, (VP8LBackwardRefs*)&enc->refs_[0], transform_width, transform_height, quality, low_effort, enc->pic_, percent_range - percent_range / 2, percent); } // ----------------------------------------------------------------------------- static int WriteRiffHeader(const WebPPicture* const pic, size_t riff_size, size_t vp8l_size) { uint8_t riff[RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE + VP8L_SIGNATURE_SIZE] = { 'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P', 'V', 'P', '8', 'L', 0, 0, 0, 0, VP8L_MAGIC_BYTE, }; PutLE32(riff + TAG_SIZE, (uint32_t)riff_size); PutLE32(riff + RIFF_HEADER_SIZE + TAG_SIZE, (uint32_t)vp8l_size); return pic->writer(riff, sizeof(riff), pic); } static int WriteImageSize(const WebPPicture* const pic, VP8LBitWriter* const bw) { const int width = pic->width - 1; const int height = pic->height - 1; assert(width < WEBP_MAX_DIMENSION && height < WEBP_MAX_DIMENSION); VP8LPutBits(bw, width, VP8L_IMAGE_SIZE_BITS); VP8LPutBits(bw, height, VP8L_IMAGE_SIZE_BITS); return !bw->error_; } static int WriteRealAlphaAndVersion(VP8LBitWriter* const bw, int has_alpha) { VP8LPutBits(bw, has_alpha, 1); VP8LPutBits(bw, VP8L_VERSION, VP8L_VERSION_BITS); return !bw->error_; } static int WriteImage(const WebPPicture* const pic, VP8LBitWriter* const bw, size_t* const coded_size) { const uint8_t* const webpll_data = VP8LBitWriterFinish(bw); const size_t webpll_size = VP8LBitWriterNumBytes(bw); const size_t vp8l_size = VP8L_SIGNATURE_SIZE + webpll_size; const size_t pad = vp8l_size & 1; const size_t riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8l_size + pad; *coded_size = 0; if (bw->error_) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } if (!WriteRiffHeader(pic, riff_size, vp8l_size) || !pic->writer(webpll_data, webpll_size, pic)) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE); } if (pad) { const uint8_t pad_byte[1] = { 0 }; if (!pic->writer(pad_byte, 1, pic)) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE); } } *coded_size = CHUNK_HEADER_SIZE + riff_size; return 1; } // ----------------------------------------------------------------------------- static void ClearTransformBuffer(VP8LEncoder* const enc) { WebPSafeFree(enc->transform_mem_); enc->transform_mem_ = NULL; enc->transform_mem_size_ = 0; } // Allocates the memory for argb (W x H) buffer, 2 rows of context for // prediction and transform data. // Flags influencing the memory allocated: // enc->transform_bits_ // enc->use_predict_, enc->use_cross_color_ static int AllocateTransformBuffer(VP8LEncoder* const enc, int width, int height) { const uint64_t image_size = (uint64_t)width * height; // VP8LResidualImage needs room for 2 scanlines of uint32 pixels with an extra // pixel in each, plus 2 regular scanlines of bytes. // TODO(skal): Clean up by using arithmetic in bytes instead of words. const uint64_t argb_scratch_size = enc->use_predict_ ? (width + 1) * 2 + (width * 2 + sizeof(uint32_t) - 1) / sizeof(uint32_t) : 0; const uint64_t transform_data_size = (enc->use_predict_ || enc->use_cross_color_) ? (uint64_t)VP8LSubSampleSize(width, enc->transform_bits_) * VP8LSubSampleSize(height, enc->transform_bits_) : 0; const uint64_t max_alignment_in_words = (WEBP_ALIGN_CST + sizeof(uint32_t) - 1) / sizeof(uint32_t); const uint64_t mem_size = image_size + max_alignment_in_words + argb_scratch_size + max_alignment_in_words + transform_data_size; uint32_t* mem = enc->transform_mem_; if (mem == NULL || mem_size > enc->transform_mem_size_) { ClearTransformBuffer(enc); mem = (uint32_t*)WebPSafeMalloc(mem_size, sizeof(*mem)); if (mem == NULL) { return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } enc->transform_mem_ = mem; enc->transform_mem_size_ = (size_t)mem_size; enc->argb_content_ = kEncoderNone; } enc->argb_ = mem; mem = (uint32_t*)WEBP_ALIGN(mem + image_size); enc->argb_scratch_ = mem; mem = (uint32_t*)WEBP_ALIGN(mem + argb_scratch_size); enc->transform_data_ = mem; enc->current_width_ = width; return 1; } static int MakeInputImageCopy(VP8LEncoder* const enc) { const WebPPicture* const picture = enc->pic_; const int width = picture->width; const int height = picture->height; if (!AllocateTransformBuffer(enc, width, height)) return 0; if (enc->argb_content_ == kEncoderARGB) return 1; { uint32_t* dst = enc->argb_; const uint32_t* src = picture->argb; int y; for (y = 0; y < height; ++y) { memcpy(dst, src, width * sizeof(*dst)); dst += width; src += picture->argb_stride; } } enc->argb_content_ = kEncoderARGB; assert(enc->current_width_ == width); return 1; } // ----------------------------------------------------------------------------- #define APPLY_PALETTE_GREEDY_MAX 4 static WEBP_INLINE uint32_t SearchColorGreedy(const uint32_t palette[], int palette_size, uint32_t color) { (void)palette_size; assert(palette_size < APPLY_PALETTE_GREEDY_MAX); assert(3 == APPLY_PALETTE_GREEDY_MAX - 1); if (color == palette[0]) return 0; if (color == palette[1]) return 1; if (color == palette[2]) return 2; return 3; } static WEBP_INLINE uint32_t ApplyPaletteHash0(uint32_t color) { // Focus on the green color. return (color >> 8) & 0xff; } #define PALETTE_INV_SIZE_BITS 11 #define PALETTE_INV_SIZE (1 << PALETTE_INV_SIZE_BITS) static WEBP_INLINE uint32_t ApplyPaletteHash1(uint32_t color) { // Forget about alpha. return ((uint32_t)((color & 0x00ffffffu) * 4222244071ull)) >> (32 - PALETTE_INV_SIZE_BITS); } static WEBP_INLINE uint32_t ApplyPaletteHash2(uint32_t color) { // Forget about alpha. return ((uint32_t)((color & 0x00ffffffu) * ((1ull << 31) - 1))) >> (32 - PALETTE_INV_SIZE_BITS); } // Use 1 pixel cache for ARGB pixels. #define APPLY_PALETTE_FOR(COLOR_INDEX) do { \ uint32_t prev_pix = palette[0]; \ uint32_t prev_idx = 0; \ for (y = 0; y < height; ++y) { \ for (x = 0; x < width; ++x) { \ const uint32_t pix = src[x]; \ if (pix != prev_pix) { \ prev_idx = COLOR_INDEX; \ prev_pix = pix; \ } \ tmp_row[x] = prev_idx; \ } \ VP8LBundleColorMap(tmp_row, width, xbits, dst); \ src += src_stride; \ dst += dst_stride; \ } \ } while (0) // Remap argb values in src[] to packed palettes entries in dst[] // using 'row' as a temporary buffer of size 'width'. // We assume that all src[] values have a corresponding entry in the palette. // Note: src[] can be the same as dst[] static int ApplyPalette(const uint32_t* src, uint32_t src_stride, uint32_t* dst, uint32_t dst_stride, const uint32_t* palette, int palette_size, int width, int height, int xbits, const WebPPicture* const pic) { // TODO(skal): this tmp buffer is not needed if VP8LBundleColorMap() can be // made to work in-place. uint8_t* const tmp_row = (uint8_t*)WebPSafeMalloc(width, sizeof(*tmp_row)); int x, y; if (tmp_row == NULL) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } if (palette_size < APPLY_PALETTE_GREEDY_MAX) { APPLY_PALETTE_FOR(SearchColorGreedy(palette, palette_size, pix)); } else { int i, j; uint16_t buffer[PALETTE_INV_SIZE]; uint32_t (*const hash_functions[])(uint32_t) = { ApplyPaletteHash0, ApplyPaletteHash1, ApplyPaletteHash2 }; // Try to find a perfect hash function able to go from a color to an index // within 1 << PALETTE_INV_SIZE_BITS in order to build a hash map to go // from color to index in palette. for (i = 0; i < 3; ++i) { int use_LUT = 1; // Set each element in buffer to max uint16_t. memset(buffer, 0xff, sizeof(buffer)); for (j = 0; j < palette_size; ++j) { const uint32_t ind = hash_functions[i](palette[j]); if (buffer[ind] != 0xffffu) { use_LUT = 0; break; } else { buffer[ind] = j; } } if (use_LUT) break; } if (i == 0) { APPLY_PALETTE_FOR(buffer[ApplyPaletteHash0(pix)]); } else if (i == 1) { APPLY_PALETTE_FOR(buffer[ApplyPaletteHash1(pix)]); } else if (i == 2) { APPLY_PALETTE_FOR(buffer[ApplyPaletteHash2(pix)]); } else { uint32_t idx_map[MAX_PALETTE_SIZE]; uint32_t palette_sorted[MAX_PALETTE_SIZE]; PrepareMapToPalette(palette, palette_size, palette_sorted, idx_map); APPLY_PALETTE_FOR( idx_map[SearchColorNoIdx(palette_sorted, pix, palette_size)]); } } WebPSafeFree(tmp_row); return 1; } #undef APPLY_PALETTE_FOR #undef PALETTE_INV_SIZE_BITS #undef PALETTE_INV_SIZE #undef APPLY_PALETTE_GREEDY_MAX // Note: Expects "enc->palette_" to be set properly. static int MapImageFromPalette(VP8LEncoder* const enc, int in_place) { const WebPPicture* const pic = enc->pic_; const int width = pic->width; const int height = pic->height; const uint32_t* const palette = enc->palette_; const uint32_t* src = in_place ? enc->argb_ : pic->argb; const int src_stride = in_place ? enc->current_width_ : pic->argb_stride; const int palette_size = enc->palette_size_; int xbits; // Replace each input pixel by corresponding palette index. // This is done line by line. if (palette_size <= 4) { xbits = (palette_size <= 2) ? 3 : 2; } else { xbits = (palette_size <= 16) ? 1 : 0; } if (!AllocateTransformBuffer(enc, VP8LSubSampleSize(width, xbits), height)) { return 0; } if (!ApplyPalette(src, src_stride, enc->argb_, enc->current_width_, palette, palette_size, width, height, xbits, pic)) { return 0; } enc->argb_content_ = kEncoderPalette; return 1; } // Save palette_[] to bitstream. static WebPEncodingError EncodePalette(VP8LBitWriter* const bw, int low_effort, VP8LEncoder* const enc, int percent_range, int* const percent) { int i; uint32_t tmp_palette[MAX_PALETTE_SIZE]; const int palette_size = enc->palette_size_; const uint32_t* const palette = enc->palette_; VP8LPutBits(bw, TRANSFORM_PRESENT, 1); VP8LPutBits(bw, COLOR_INDEXING_TRANSFORM, 2); assert(palette_size >= 1 && palette_size <= MAX_PALETTE_SIZE); VP8LPutBits(bw, palette_size - 1, 8); for (i = palette_size - 1; i >= 1; --i) { tmp_palette[i] = VP8LSubPixels(palette[i], palette[i - 1]); } tmp_palette[0] = palette[0]; return EncodeImageNoHuffman(bw, tmp_palette, &enc->hash_chain_, &enc->refs_[0], palette_size, 1, /*quality=*/20, low_effort, enc->pic_, percent_range, percent); } // ----------------------------------------------------------------------------- // VP8LEncoder static VP8LEncoder* VP8LEncoderNew(const WebPConfig* const config, const WebPPicture* const picture) { VP8LEncoder* const enc = (VP8LEncoder*)WebPSafeCalloc(1ULL, sizeof(*enc)); if (enc == NULL) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); return NULL; } enc->config_ = config; enc->pic_ = picture; enc->argb_content_ = kEncoderNone; VP8LEncDspInit(); return enc; } static void VP8LEncoderDelete(VP8LEncoder* enc) { if (enc != NULL) { int i; VP8LHashChainClear(&enc->hash_chain_); for (i = 0; i < 4; ++i) VP8LBackwardRefsClear(&enc->refs_[i]); ClearTransformBuffer(enc); WebPSafeFree(enc); } } // ----------------------------------------------------------------------------- // Main call typedef struct { const WebPConfig* config_; const WebPPicture* picture_; VP8LBitWriter* bw_; VP8LEncoder* enc_; CrunchConfig crunch_configs_[CRUNCH_CONFIGS_MAX]; int num_crunch_configs_; int red_and_blue_always_zero_; WebPAuxStats* stats_; } StreamEncodeContext; static int EncodeStreamHook(void* input, void* data2) { StreamEncodeContext* const params = (StreamEncodeContext*)input; const WebPConfig* const config = params->config_; const WebPPicture* const picture = params->picture_; VP8LBitWriter* const bw = params->bw_; VP8LEncoder* const enc = params->enc_; const CrunchConfig* const crunch_configs = params->crunch_configs_; const int num_crunch_configs = params->num_crunch_configs_; const int red_and_blue_always_zero = params->red_and_blue_always_zero_; #if !defined(WEBP_DISABLE_STATS) WebPAuxStats* const stats = params->stats_; #endif const int quality = (int)config->quality; const int low_effort = (config->method == 0); #if (WEBP_NEAR_LOSSLESS == 1) const int width = picture->width; #endif const int height = picture->height; const size_t byte_position = VP8LBitWriterNumBytes(bw); int percent = 2; // for WebPProgressHook #if (WEBP_NEAR_LOSSLESS == 1) int use_near_lossless = 0; #endif int hdr_size = 0; int data_size = 0; int use_delta_palette = 0; int idx; size_t best_size = ~(size_t)0; VP8LBitWriter bw_init = *bw, bw_best; (void)data2; if (!VP8LBitWriterInit(&bw_best, 0) || (num_crunch_configs > 1 && !VP8LBitWriterClone(bw, &bw_best))) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } for (idx = 0; idx < num_crunch_configs; ++idx) { const int entropy_idx = crunch_configs[idx].entropy_idx_; int remaining_percent = 97 / num_crunch_configs, percent_range; enc->use_palette_ = (entropy_idx == kPalette) || (entropy_idx == kPaletteAndSpatial); enc->use_subtract_green_ = (entropy_idx == kSubGreen) || (entropy_idx == kSpatialSubGreen); enc->use_predict_ = (entropy_idx == kSpatial) || (entropy_idx == kSpatialSubGreen) || (entropy_idx == kPaletteAndSpatial); // When using a palette, R/B==0, hence no need to test for cross-color. if (low_effort || enc->use_palette_) { enc->use_cross_color_ = 0; } else { enc->use_cross_color_ = red_and_blue_always_zero ? 0 : enc->use_predict_; } // Reset any parameter in the encoder that is set in the previous iteration. enc->cache_bits_ = 0; VP8LBackwardRefsClear(&enc->refs_[0]); VP8LBackwardRefsClear(&enc->refs_[1]); #if (WEBP_NEAR_LOSSLESS == 1) // Apply near-lossless preprocessing. use_near_lossless = (config->near_lossless < 100) && !enc->use_palette_ && !enc->use_predict_; if (use_near_lossless) { if (!AllocateTransformBuffer(enc, width, height)) goto Error; if ((enc->argb_content_ != kEncoderNearLossless) && !VP8ApplyNearLossless(picture, config->near_lossless, enc->argb_)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } enc->argb_content_ = kEncoderNearLossless; } else { enc->argb_content_ = kEncoderNone; } #else enc->argb_content_ = kEncoderNone; #endif // Encode palette if (enc->use_palette_) { if (!PaletteSort(crunch_configs[idx].palette_sorting_type_, enc->pic_, enc->palette_sorted_, enc->palette_size_, enc->palette_)) { WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } percent_range = remaining_percent / 4; if (!EncodePalette(bw, low_effort, enc, percent_range, &percent)) { goto Error; } remaining_percent -= percent_range; if (!MapImageFromPalette(enc, use_delta_palette)) goto Error; // If using a color cache, do not have it bigger than the number of // colors. if (enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) { enc->cache_bits_ = BitsLog2Floor(enc->palette_size_) + 1; } } if (!use_delta_palette) { // In case image is not packed. if (enc->argb_content_ != kEncoderNearLossless && enc->argb_content_ != kEncoderPalette) { if (!MakeInputImageCopy(enc)) goto Error; } // ----------------------------------------------------------------------- // Apply transforms and write transform data. if (enc->use_subtract_green_) { ApplySubtractGreen(enc, enc->current_width_, height, bw); } if (enc->use_predict_) { percent_range = remaining_percent / 3; if (!ApplyPredictFilter(enc, enc->current_width_, height, quality, low_effort, enc->use_subtract_green_, bw, percent_range, &percent)) { goto Error; } remaining_percent -= percent_range; } if (enc->use_cross_color_) { percent_range = remaining_percent / 2; if (!ApplyCrossColorFilter(enc, enc->current_width_, height, quality, low_effort, bw, percent_range, &percent)) { goto Error; } remaining_percent -= percent_range; } } VP8LPutBits(bw, !TRANSFORM_PRESENT, 1); // No more transforms. // ------------------------------------------------------------------------- // Encode and write the transformed image. if (!EncodeImageInternal( bw, enc->argb_, &enc->hash_chain_, enc->refs_, enc->current_width_, height, quality, low_effort, &crunch_configs[idx], &enc->cache_bits_, enc->histo_bits_, byte_position, &hdr_size, &data_size, picture, remaining_percent, &percent)) { goto Error; } // If we are better than what we already have. if (VP8LBitWriterNumBytes(bw) < best_size) { best_size = VP8LBitWriterNumBytes(bw); // Store the BitWriter. VP8LBitWriterSwap(bw, &bw_best); #if !defined(WEBP_DISABLE_STATS) // Update the stats. if (stats != NULL) { stats->lossless_features = 0; if (enc->use_predict_) stats->lossless_features |= 1; if (enc->use_cross_color_) stats->lossless_features |= 2; if (enc->use_subtract_green_) stats->lossless_features |= 4; if (enc->use_palette_) stats->lossless_features |= 8; stats->histogram_bits = enc->histo_bits_; stats->transform_bits = enc->transform_bits_; stats->cache_bits = enc->cache_bits_; stats->palette_size = enc->palette_size_; stats->lossless_size = (int)(best_size - byte_position); stats->lossless_hdr_size = hdr_size; stats->lossless_data_size = data_size; } #endif } // Reset the bit writer for the following iteration if any. if (num_crunch_configs > 1) VP8LBitWriterReset(&bw_init, bw); } VP8LBitWriterSwap(&bw_best, bw); Error: VP8LBitWriterWipeOut(&bw_best); // The hook should return false in case of error. return (params->picture_->error_code == VP8_ENC_OK); } int VP8LEncodeStream(const WebPConfig* const config, const WebPPicture* const picture, VP8LBitWriter* const bw_main) { VP8LEncoder* const enc_main = VP8LEncoderNew(config, picture); VP8LEncoder* enc_side = NULL; CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX]; int num_crunch_configs_main, num_crunch_configs_side = 0; int idx; int red_and_blue_always_zero = 0; WebPWorker worker_main, worker_side; StreamEncodeContext params_main, params_side; // The main thread uses picture->stats, the side thread uses stats_side. WebPAuxStats stats_side; VP8LBitWriter bw_side; WebPPicture picture_side; const WebPWorkerInterface* const worker_interface = WebPGetWorkerInterface(); int ok_main; if (enc_main == NULL || !VP8LBitWriterInit(&bw_side, 0)) { VP8LEncoderDelete(enc_main); return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } // Avoid "garbage value" error from Clang's static analysis tool. if (!WebPPictureInit(&picture_side)) { goto Error; } // Analyze image (entropy, num_palettes etc) if (!EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main, &red_and_blue_always_zero) || !EncoderInit(enc_main)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Split the configs between the main and side threads (if any). if (config->thread_level > 0) { num_crunch_configs_side = num_crunch_configs_main / 2; for (idx = 0; idx < num_crunch_configs_side; ++idx) { params_side.crunch_configs_[idx] = crunch_configs[num_crunch_configs_main - num_crunch_configs_side + idx]; } params_side.num_crunch_configs_ = num_crunch_configs_side; } num_crunch_configs_main -= num_crunch_configs_side; for (idx = 0; idx < num_crunch_configs_main; ++idx) { params_main.crunch_configs_[idx] = crunch_configs[idx]; } params_main.num_crunch_configs_ = num_crunch_configs_main; // Fill in the parameters for the thread workers. { const int params_size = (num_crunch_configs_side > 0) ? 2 : 1; for (idx = 0; idx < params_size; ++idx) { // Create the parameters for each worker. WebPWorker* const worker = (idx == 0) ? &worker_main : &worker_side; StreamEncodeContext* const param = (idx == 0) ? ¶ms_main : ¶ms_side; param->config_ = config; param->red_and_blue_always_zero_ = red_and_blue_always_zero; if (idx == 0) { param->picture_ = picture; param->stats_ = picture->stats; param->bw_ = bw_main; param->enc_ = enc_main; } else { // Create a side picture (error_code is not thread-safe). if (!WebPPictureView(picture, /*left=*/0, /*top=*/0, picture->width, picture->height, &picture_side)) { assert(0); } picture_side.progress_hook = NULL; // Progress hook is not thread-safe. param->picture_ = &picture_side; // No need to free a view afterwards. param->stats_ = (picture->stats == NULL) ? NULL : &stats_side; // Create a side bit writer. if (!VP8LBitWriterClone(bw_main, &bw_side)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } param->bw_ = &bw_side; // Create a side encoder. enc_side = VP8LEncoderNew(config, &picture_side); if (enc_side == NULL || !EncoderInit(enc_side)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Copy the values that were computed for the main encoder. enc_side->histo_bits_ = enc_main->histo_bits_; enc_side->transform_bits_ = enc_main->transform_bits_; enc_side->palette_size_ = enc_main->palette_size_; memcpy(enc_side->palette_, enc_main->palette_, sizeof(enc_main->palette_)); memcpy(enc_side->palette_sorted_, enc_main->palette_sorted_, sizeof(enc_main->palette_sorted_)); param->enc_ = enc_side; } // Create the workers. worker_interface->Init(worker); worker->data1 = param; worker->data2 = NULL; worker->hook = EncodeStreamHook; } } // Start the second thread if needed. if (num_crunch_configs_side != 0) { if (!worker_interface->Reset(&worker_side)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } #if !defined(WEBP_DISABLE_STATS) // This line is here and not in the param initialization above to remove a // Clang static analyzer warning. if (picture->stats != NULL) { memcpy(&stats_side, picture->stats, sizeof(stats_side)); } #endif worker_interface->Launch(&worker_side); } // Execute the main thread. worker_interface->Execute(&worker_main); ok_main = worker_interface->Sync(&worker_main); worker_interface->End(&worker_main); if (num_crunch_configs_side != 0) { // Wait for the second thread. const int ok_side = worker_interface->Sync(&worker_side); worker_interface->End(&worker_side); if (!ok_main || !ok_side) { if (picture->error_code == VP8_ENC_OK) { assert(picture_side.error_code != VP8_ENC_OK); WebPEncodingSetError(picture, picture_side.error_code); } goto Error; } if (VP8LBitWriterNumBytes(&bw_side) < VP8LBitWriterNumBytes(bw_main)) { VP8LBitWriterSwap(bw_main, &bw_side); #if !defined(WEBP_DISABLE_STATS) if (picture->stats != NULL) { memcpy(picture->stats, &stats_side, sizeof(*picture->stats)); } #endif } } Error: VP8LBitWriterWipeOut(&bw_side); VP8LEncoderDelete(enc_main); VP8LEncoderDelete(enc_side); return (picture->error_code == VP8_ENC_OK); } #undef CRUNCH_CONFIGS_MAX #undef CRUNCH_SUBCONFIGS_MAX int VP8LEncodeImage(const WebPConfig* const config, const WebPPicture* const picture) { int width, height; int has_alpha; size_t coded_size; int percent = 0; int initial_size; VP8LBitWriter bw; if (picture == NULL) return 0; if (config == NULL || picture->argb == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER); } width = picture->width; height = picture->height; // Initialize BitWriter with size corresponding to 16 bpp to photo images and // 8 bpp for graphical images. initial_size = (config->image_hint == WEBP_HINT_GRAPH) ? width * height : width * height * 2; if (!VP8LBitWriterInit(&bw, initial_size)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } if (!WebPReportProgress(picture, 1, &percent)) { UserAbort: WebPEncodingSetError(picture, VP8_ENC_ERROR_USER_ABORT); goto Error; } // Reset stats (for pure lossless coding) if (picture->stats != NULL) { WebPAuxStats* const stats = picture->stats; memset(stats, 0, sizeof(*stats)); stats->PSNR[0] = 99.f; stats->PSNR[1] = 99.f; stats->PSNR[2] = 99.f; stats->PSNR[3] = 99.f; stats->PSNR[4] = 99.f; } // Write image size. if (!WriteImageSize(picture, &bw)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } has_alpha = WebPPictureHasTransparency(picture); // Write the non-trivial Alpha flag and lossless version. if (!WriteRealAlphaAndVersion(&bw, has_alpha)) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } if (!WebPReportProgress(picture, 2, &percent)) goto UserAbort; // Encode main image stream. if (!VP8LEncodeStream(config, picture, &bw)) goto Error; if (!WebPReportProgress(picture, 99, &percent)) goto UserAbort; // Finish the RIFF chunk. if (!WriteImage(picture, &bw, &coded_size)) goto Error; if (!WebPReportProgress(picture, 100, &percent)) goto UserAbort; #if !defined(WEBP_DISABLE_STATS) // Save size. if (picture->stats != NULL) { picture->stats->coded_size += (int)coded_size; picture->stats->lossless_size = (int)coded_size; } #endif if (picture->extra_info != NULL) { const int mb_w = (width + 15) >> 4; const int mb_h = (height + 15) >> 4; memset(picture->extra_info, 0, mb_w * mb_h * sizeof(*picture->extra_info)); } Error: if (bw.error_) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } VP8LBitWriterWipeOut(&bw); return (picture->error_code == VP8_ENC_OK); } //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/predictor_enc.c0000644000014400001440000007721014606317060014402 0ustar // Copyright 2016 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Image transform methods for lossless encoder. // // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) // Urvang Joshi (urvang@google.com) // Vincent Rabaud (vrabaud@google.com) #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/enc/vp8i_enc.h" #include "src/enc/vp8li_enc.h" #define MAX_DIFF_COST (1e30f) static const float kSpatialPredictorBias = 15.f; static const int kPredLowEffort = 11; static const uint32_t kMaskAlpha = 0xff000000; // Mostly used to reduce code size + readability static WEBP_INLINE int GetMin(int a, int b) { return (a > b) ? b : a; } //------------------------------------------------------------------------------ // Methods to calculate Entropy (Shannon). static float PredictionCostSpatial(const int counts[256], int weight_0, float exp_val) { const int significant_symbols = 256 >> 4; const float exp_decay_factor = 0.6f; float bits = (float)weight_0 * counts[0]; int i; for (i = 1; i < significant_symbols; ++i) { bits += exp_val * (counts[i] + counts[256 - i]); exp_val *= exp_decay_factor; } return (float)(-0.1 * bits); } static float PredictionCostSpatialHistogram(const int accumulated[4][256], const int tile[4][256]) { int i; float retval = 0.f; for (i = 0; i < 4; ++i) { const float kExpValue = 0.94f; retval += PredictionCostSpatial(tile[i], 1, kExpValue); retval += VP8LCombinedShannonEntropy(tile[i], accumulated[i]); } return (float)retval; } static WEBP_INLINE void UpdateHisto(int histo_argb[4][256], uint32_t argb) { ++histo_argb[0][argb >> 24]; ++histo_argb[1][(argb >> 16) & 0xff]; ++histo_argb[2][(argb >> 8) & 0xff]; ++histo_argb[3][argb & 0xff]; } //------------------------------------------------------------------------------ // Spatial transform functions. static WEBP_INLINE void PredictBatch(int mode, int x_start, int y, int num_pixels, const uint32_t* current, const uint32_t* upper, uint32_t* out) { if (x_start == 0) { if (y == 0) { // ARGB_BLACK. VP8LPredictorsSub[0](current, NULL, 1, out); } else { // Top one. VP8LPredictorsSub[2](current, upper, 1, out); } ++x_start; ++out; --num_pixels; } if (y == 0) { // Left one. VP8LPredictorsSub[1](current + x_start, NULL, num_pixels, out); } else { VP8LPredictorsSub[mode](current + x_start, upper + x_start, num_pixels, out); } } #if (WEBP_NEAR_LOSSLESS == 1) static WEBP_INLINE int GetMax(int a, int b) { return (a < b) ? b : a; } static int MaxDiffBetweenPixels(uint32_t p1, uint32_t p2) { const int diff_a = abs((int)(p1 >> 24) - (int)(p2 >> 24)); const int diff_r = abs((int)((p1 >> 16) & 0xff) - (int)((p2 >> 16) & 0xff)); const int diff_g = abs((int)((p1 >> 8) & 0xff) - (int)((p2 >> 8) & 0xff)); const int diff_b = abs((int)(p1 & 0xff) - (int)(p2 & 0xff)); return GetMax(GetMax(diff_a, diff_r), GetMax(diff_g, diff_b)); } static int MaxDiffAroundPixel(uint32_t current, uint32_t up, uint32_t down, uint32_t left, uint32_t right) { const int diff_up = MaxDiffBetweenPixels(current, up); const int diff_down = MaxDiffBetweenPixels(current, down); const int diff_left = MaxDiffBetweenPixels(current, left); const int diff_right = MaxDiffBetweenPixels(current, right); return GetMax(GetMax(diff_up, diff_down), GetMax(diff_left, diff_right)); } static uint32_t AddGreenToBlueAndRed(uint32_t argb) { const uint32_t green = (argb >> 8) & 0xff; uint32_t red_blue = argb & 0x00ff00ffu; red_blue += (green << 16) | green; red_blue &= 0x00ff00ffu; return (argb & 0xff00ff00u) | red_blue; } static void MaxDiffsForRow(int width, int stride, const uint32_t* const argb, uint8_t* const max_diffs, int used_subtract_green) { uint32_t current, up, down, left, right; int x; if (width <= 2) return; current = argb[0]; right = argb[1]; if (used_subtract_green) { current = AddGreenToBlueAndRed(current); right = AddGreenToBlueAndRed(right); } // max_diffs[0] and max_diffs[width - 1] are never used. for (x = 1; x < width - 1; ++x) { up = argb[-stride + x]; down = argb[stride + x]; left = current; current = right; right = argb[x + 1]; if (used_subtract_green) { up = AddGreenToBlueAndRed(up); down = AddGreenToBlueAndRed(down); right = AddGreenToBlueAndRed(right); } max_diffs[x] = MaxDiffAroundPixel(current, up, down, left, right); } } // Quantize the difference between the actual component value and its prediction // to a multiple of quantization, working modulo 256, taking care not to cross // a boundary (inclusive upper limit). static uint8_t NearLosslessComponent(uint8_t value, uint8_t predict, uint8_t boundary, int quantization) { const int residual = (value - predict) & 0xff; const int boundary_residual = (boundary - predict) & 0xff; const int lower = residual & ~(quantization - 1); const int upper = lower + quantization; // Resolve ties towards a value closer to the prediction (i.e. towards lower // if value comes after prediction and towards upper otherwise). const int bias = ((boundary - value) & 0xff) < boundary_residual; if (residual - lower < upper - residual + bias) { // lower is closer to residual than upper. if (residual > boundary_residual && lower <= boundary_residual) { // Halve quantization step to avoid crossing boundary. This midpoint is // on the same side of boundary as residual because midpoint >= residual // (since lower is closer than upper) and residual is above the boundary. return lower + (quantization >> 1); } return lower; } else { // upper is closer to residual than lower. if (residual <= boundary_residual && upper > boundary_residual) { // Halve quantization step to avoid crossing boundary. This midpoint is // on the same side of boundary as residual because midpoint <= residual // (since upper is closer than lower) and residual is below the boundary. return lower + (quantization >> 1); } return upper & 0xff; } } static WEBP_INLINE uint8_t NearLosslessDiff(uint8_t a, uint8_t b) { return (uint8_t)((((int)(a) - (int)(b))) & 0xff); } // Quantize every component of the difference between the actual pixel value and // its prediction to a multiple of a quantization (a power of 2, not larger than // max_quantization which is a power of 2, smaller than max_diff). Take care if // value and predict have undergone subtract green, which means that red and // blue are represented as offsets from green. static uint32_t NearLossless(uint32_t value, uint32_t predict, int max_quantization, int max_diff, int used_subtract_green) { int quantization; uint8_t new_green = 0; uint8_t green_diff = 0; uint8_t a, r, g, b; if (max_diff <= 2) { return VP8LSubPixels(value, predict); } quantization = max_quantization; while (quantization >= max_diff) { quantization >>= 1; } if ((value >> 24) == 0 || (value >> 24) == 0xff) { // Preserve transparency of fully transparent or fully opaque pixels. a = NearLosslessDiff((value >> 24) & 0xff, (predict >> 24) & 0xff); } else { a = NearLosslessComponent(value >> 24, predict >> 24, 0xff, quantization); } g = NearLosslessComponent((value >> 8) & 0xff, (predict >> 8) & 0xff, 0xff, quantization); if (used_subtract_green) { // The green offset will be added to red and blue components during decoding // to obtain the actual red and blue values. new_green = ((predict >> 8) + g) & 0xff; // The amount by which green has been adjusted during quantization. It is // subtracted from red and blue for compensation, to avoid accumulating two // quantization errors in them. green_diff = NearLosslessDiff(new_green, (value >> 8) & 0xff); } r = NearLosslessComponent(NearLosslessDiff((value >> 16) & 0xff, green_diff), (predict >> 16) & 0xff, 0xff - new_green, quantization); b = NearLosslessComponent(NearLosslessDiff(value & 0xff, green_diff), predict & 0xff, 0xff - new_green, quantization); return ((uint32_t)a << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; } #endif // (WEBP_NEAR_LOSSLESS == 1) // Stores the difference between the pixel and its prediction in "out". // In case of a lossy encoding, updates the source image to avoid propagating // the deviation further to pixels which depend on the current pixel for their // predictions. static WEBP_INLINE void GetResidual( int width, int height, uint32_t* const upper_row, uint32_t* const current_row, const uint8_t* const max_diffs, int mode, int x_start, int x_end, int y, int max_quantization, int exact, int used_subtract_green, uint32_t* const out) { if (exact) { PredictBatch(mode, x_start, y, x_end - x_start, current_row, upper_row, out); } else { const VP8LPredictorFunc pred_func = VP8LPredictors[mode]; int x; for (x = x_start; x < x_end; ++x) { uint32_t predict; uint32_t residual; if (y == 0) { predict = (x == 0) ? ARGB_BLACK : current_row[x - 1]; // Left. } else if (x == 0) { predict = upper_row[x]; // Top. } else { predict = pred_func(¤t_row[x - 1], upper_row + x); } #if (WEBP_NEAR_LOSSLESS == 1) if (max_quantization == 1 || mode == 0 || y == 0 || y == height - 1 || x == 0 || x == width - 1) { residual = VP8LSubPixels(current_row[x], predict); } else { residual = NearLossless(current_row[x], predict, max_quantization, max_diffs[x], used_subtract_green); // Update the source image. current_row[x] = VP8LAddPixels(predict, residual); // x is never 0 here so we do not need to update upper_row like below. } #else (void)max_diffs; (void)height; (void)max_quantization; (void)used_subtract_green; residual = VP8LSubPixels(current_row[x], predict); #endif if ((current_row[x] & kMaskAlpha) == 0) { // If alpha is 0, cleanup RGB. We can choose the RGB values of the // residual for best compression. The prediction of alpha itself can be // non-zero and must be kept though. We choose RGB of the residual to be // 0. residual &= kMaskAlpha; // Update the source image. current_row[x] = predict & ~kMaskAlpha; // The prediction for the rightmost pixel in a row uses the leftmost // pixel // in that row as its top-right context pixel. Hence if we change the // leftmost pixel of current_row, the corresponding change must be // applied // to upper_row as well where top-right context is being read from. if (x == 0 && y != 0) upper_row[width] = current_row[0]; } out[x - x_start] = residual; } } } // Returns best predictor and updates the accumulated histogram. // If max_quantization > 1, assumes that near lossless processing will be // applied, quantizing residuals to multiples of quantization levels up to // max_quantization (the actual quantization level depends on smoothness near // the given pixel). static int GetBestPredictorForTile(int width, int height, int tile_x, int tile_y, int bits, int accumulated[4][256], uint32_t* const argb_scratch, const uint32_t* const argb, int max_quantization, int exact, int used_subtract_green, const uint32_t* const modes) { const int kNumPredModes = 14; const int start_x = tile_x << bits; const int start_y = tile_y << bits; const int tile_size = 1 << bits; const int max_y = GetMin(tile_size, height - start_y); const int max_x = GetMin(tile_size, width - start_x); // Whether there exist columns just outside the tile. const int have_left = (start_x > 0); // Position and size of the strip covering the tile and adjacent columns if // they exist. const int context_start_x = start_x - have_left; #if (WEBP_NEAR_LOSSLESS == 1) const int context_width = max_x + have_left + (max_x < width - start_x); #endif const int tiles_per_row = VP8LSubSampleSize(width, bits); // Prediction modes of the left and above neighbor tiles. const int left_mode = (tile_x > 0) ? (modes[tile_y * tiles_per_row + tile_x - 1] >> 8) & 0xff : 0xff; const int above_mode = (tile_y > 0) ? (modes[(tile_y - 1) * tiles_per_row + tile_x] >> 8) & 0xff : 0xff; // The width of upper_row and current_row is one pixel larger than image width // to allow the top right pixel to point to the leftmost pixel of the next row // when at the right edge. uint32_t* upper_row = argb_scratch; uint32_t* current_row = upper_row + width + 1; uint8_t* const max_diffs = (uint8_t*)(current_row + width + 1); float best_diff = MAX_DIFF_COST; int best_mode = 0; int mode; int histo_stack_1[4][256]; int histo_stack_2[4][256]; // Need pointers to be able to swap arrays. int (*histo_argb)[256] = histo_stack_1; int (*best_histo)[256] = histo_stack_2; int i, j; uint32_t residuals[1 << MAX_TRANSFORM_BITS]; assert(bits <= MAX_TRANSFORM_BITS); assert(max_x <= (1 << MAX_TRANSFORM_BITS)); for (mode = 0; mode < kNumPredModes; ++mode) { float cur_diff; int relative_y; memset(histo_argb, 0, sizeof(histo_stack_1)); if (start_y > 0) { // Read the row above the tile which will become the first upper_row. // Include a pixel to the left if it exists; include a pixel to the right // in all cases (wrapping to the leftmost pixel of the next row if it does // not exist). memcpy(current_row + context_start_x, argb + (start_y - 1) * width + context_start_x, sizeof(*argb) * (max_x + have_left + 1)); } for (relative_y = 0; relative_y < max_y; ++relative_y) { const int y = start_y + relative_y; int relative_x; uint32_t* tmp = upper_row; upper_row = current_row; current_row = tmp; // Read current_row. Include a pixel to the left if it exists; include a // pixel to the right in all cases except at the bottom right corner of // the image (wrapping to the leftmost pixel of the next row if it does // not exist in the current row). memcpy(current_row + context_start_x, argb + y * width + context_start_x, sizeof(*argb) * (max_x + have_left + (y + 1 < height))); #if (WEBP_NEAR_LOSSLESS == 1) if (max_quantization > 1 && y >= 1 && y + 1 < height) { MaxDiffsForRow(context_width, width, argb + y * width + context_start_x, max_diffs + context_start_x, used_subtract_green); } #endif GetResidual(width, height, upper_row, current_row, max_diffs, mode, start_x, start_x + max_x, y, max_quantization, exact, used_subtract_green, residuals); for (relative_x = 0; relative_x < max_x; ++relative_x) { UpdateHisto(histo_argb, residuals[relative_x]); } } cur_diff = PredictionCostSpatialHistogram( (const int (*)[256])accumulated, (const int (*)[256])histo_argb); // Favor keeping the areas locally similar. if (mode == left_mode) cur_diff -= kSpatialPredictorBias; if (mode == above_mode) cur_diff -= kSpatialPredictorBias; if (cur_diff < best_diff) { int (*tmp)[256] = histo_argb; histo_argb = best_histo; best_histo = tmp; best_diff = cur_diff; best_mode = mode; } } for (i = 0; i < 4; i++) { for (j = 0; j < 256; j++) { accumulated[i][j] += best_histo[i][j]; } } return best_mode; } // Converts pixels of the image to residuals with respect to predictions. // If max_quantization > 1, applies near lossless processing, quantizing // residuals to multiples of quantization levels up to max_quantization // (the actual quantization level depends on smoothness near the given pixel). static void CopyImageWithPrediction(int width, int height, int bits, uint32_t* const modes, uint32_t* const argb_scratch, uint32_t* const argb, int low_effort, int max_quantization, int exact, int used_subtract_green) { const int tiles_per_row = VP8LSubSampleSize(width, bits); // The width of upper_row and current_row is one pixel larger than image width // to allow the top right pixel to point to the leftmost pixel of the next row // when at the right edge. uint32_t* upper_row = argb_scratch; uint32_t* current_row = upper_row + width + 1; uint8_t* current_max_diffs = (uint8_t*)(current_row + width + 1); #if (WEBP_NEAR_LOSSLESS == 1) uint8_t* lower_max_diffs = current_max_diffs + width; #endif int y; for (y = 0; y < height; ++y) { int x; uint32_t* const tmp32 = upper_row; upper_row = current_row; current_row = tmp32; memcpy(current_row, argb + y * width, sizeof(*argb) * (width + (y + 1 < height))); if (low_effort) { PredictBatch(kPredLowEffort, 0, y, width, current_row, upper_row, argb + y * width); } else { #if (WEBP_NEAR_LOSSLESS == 1) if (max_quantization > 1) { // Compute max_diffs for the lower row now, because that needs the // contents of argb for the current row, which we will overwrite with // residuals before proceeding with the next row. uint8_t* const tmp8 = current_max_diffs; current_max_diffs = lower_max_diffs; lower_max_diffs = tmp8; if (y + 2 < height) { MaxDiffsForRow(width, width, argb + (y + 1) * width, lower_max_diffs, used_subtract_green); } } #endif for (x = 0; x < width;) { const int mode = (modes[(y >> bits) * tiles_per_row + (x >> bits)] >> 8) & 0xff; int x_end = x + (1 << bits); if (x_end > width) x_end = width; GetResidual(width, height, upper_row, current_row, current_max_diffs, mode, x, x_end, y, max_quantization, exact, used_subtract_green, argb + y * width + x); x = x_end; } } } } // Finds the best predictor for each tile, and converts the image to residuals // with respect to predictions. If near_lossless_quality < 100, applies // near lossless processing, shaving off more bits of residuals for lower // qualities. int VP8LResidualImage(int width, int height, int bits, int low_effort, uint32_t* const argb, uint32_t* const argb_scratch, uint32_t* const image, int near_lossless_quality, int exact, int used_subtract_green, const WebPPicture* const pic, int percent_range, int* const percent) { const int tiles_per_row = VP8LSubSampleSize(width, bits); const int tiles_per_col = VP8LSubSampleSize(height, bits); int percent_start = *percent; int tile_y; int histo[4][256]; const int max_quantization = 1 << VP8LNearLosslessBits(near_lossless_quality); if (low_effort) { int i; for (i = 0; i < tiles_per_row * tiles_per_col; ++i) { image[i] = ARGB_BLACK | (kPredLowEffort << 8); } } else { memset(histo, 0, sizeof(histo)); for (tile_y = 0; tile_y < tiles_per_col; ++tile_y) { int tile_x; for (tile_x = 0; tile_x < tiles_per_row; ++tile_x) { const int pred = GetBestPredictorForTile( width, height, tile_x, tile_y, bits, histo, argb_scratch, argb, max_quantization, exact, used_subtract_green, image); image[tile_y * tiles_per_row + tile_x] = ARGB_BLACK | (pred << 8); } if (!WebPReportProgress( pic, percent_start + percent_range * tile_y / tiles_per_col, percent)) { return 0; } } } CopyImageWithPrediction(width, height, bits, image, argb_scratch, argb, low_effort, max_quantization, exact, used_subtract_green); return WebPReportProgress(pic, percent_start + percent_range, percent); } //------------------------------------------------------------------------------ // Color transform functions. static WEBP_INLINE void MultipliersClear(VP8LMultipliers* const m) { m->green_to_red_ = 0; m->green_to_blue_ = 0; m->red_to_blue_ = 0; } static WEBP_INLINE void ColorCodeToMultipliers(uint32_t color_code, VP8LMultipliers* const m) { m->green_to_red_ = (color_code >> 0) & 0xff; m->green_to_blue_ = (color_code >> 8) & 0xff; m->red_to_blue_ = (color_code >> 16) & 0xff; } static WEBP_INLINE uint32_t MultipliersToColorCode( const VP8LMultipliers* const m) { return 0xff000000u | ((uint32_t)(m->red_to_blue_) << 16) | ((uint32_t)(m->green_to_blue_) << 8) | m->green_to_red_; } static float PredictionCostCrossColor(const int accumulated[256], const int counts[256]) { // Favor low entropy, locally and globally. // Favor small absolute values for PredictionCostSpatial static const float kExpValue = 2.4f; return VP8LCombinedShannonEntropy(counts, accumulated) + PredictionCostSpatial(counts, 3, kExpValue); } static float GetPredictionCostCrossColorRed( const uint32_t* argb, int stride, int tile_width, int tile_height, VP8LMultipliers prev_x, VP8LMultipliers prev_y, int green_to_red, const int accumulated_red_histo[256]) { int histo[256] = { 0 }; float cur_diff; VP8LCollectColorRedTransforms(argb, stride, tile_width, tile_height, green_to_red, histo); cur_diff = PredictionCostCrossColor(accumulated_red_histo, histo); if ((uint8_t)green_to_red == prev_x.green_to_red_) { cur_diff -= 3; // favor keeping the areas locally similar } if ((uint8_t)green_to_red == prev_y.green_to_red_) { cur_diff -= 3; // favor keeping the areas locally similar } if (green_to_red == 0) { cur_diff -= 3; } return cur_diff; } static void GetBestGreenToRed( const uint32_t* argb, int stride, int tile_width, int tile_height, VP8LMultipliers prev_x, VP8LMultipliers prev_y, int quality, const int accumulated_red_histo[256], VP8LMultipliers* const best_tx) { const int kMaxIters = 4 + ((7 * quality) >> 8); // in range [4..6] int green_to_red_best = 0; int iter, offset; float best_diff = GetPredictionCostCrossColorRed( argb, stride, tile_width, tile_height, prev_x, prev_y, green_to_red_best, accumulated_red_histo); for (iter = 0; iter < kMaxIters; ++iter) { // ColorTransformDelta is a 3.5 bit fixed point, so 32 is equal to // one in color computation. Having initial delta here as 1 is sufficient // to explore the range of (-2, 2). const int delta = 32 >> iter; // Try a negative and a positive delta from the best known value. for (offset = -delta; offset <= delta; offset += 2 * delta) { const int green_to_red_cur = offset + green_to_red_best; const float cur_diff = GetPredictionCostCrossColorRed( argb, stride, tile_width, tile_height, prev_x, prev_y, green_to_red_cur, accumulated_red_histo); if (cur_diff < best_diff) { best_diff = cur_diff; green_to_red_best = green_to_red_cur; } } } best_tx->green_to_red_ = (green_to_red_best & 0xff); } static float GetPredictionCostCrossColorBlue( const uint32_t* argb, int stride, int tile_width, int tile_height, VP8LMultipliers prev_x, VP8LMultipliers prev_y, int green_to_blue, int red_to_blue, const int accumulated_blue_histo[256]) { int histo[256] = { 0 }; float cur_diff; VP8LCollectColorBlueTransforms(argb, stride, tile_width, tile_height, green_to_blue, red_to_blue, histo); cur_diff = PredictionCostCrossColor(accumulated_blue_histo, histo); if ((uint8_t)green_to_blue == prev_x.green_to_blue_) { cur_diff -= 3; // favor keeping the areas locally similar } if ((uint8_t)green_to_blue == prev_y.green_to_blue_) { cur_diff -= 3; // favor keeping the areas locally similar } if ((uint8_t)red_to_blue == prev_x.red_to_blue_) { cur_diff -= 3; // favor keeping the areas locally similar } if ((uint8_t)red_to_blue == prev_y.red_to_blue_) { cur_diff -= 3; // favor keeping the areas locally similar } if (green_to_blue == 0) { cur_diff -= 3; } if (red_to_blue == 0) { cur_diff -= 3; } return cur_diff; } #define kGreenRedToBlueNumAxis 8 #define kGreenRedToBlueMaxIters 7 static void GetBestGreenRedToBlue( const uint32_t* argb, int stride, int tile_width, int tile_height, VP8LMultipliers prev_x, VP8LMultipliers prev_y, int quality, const int accumulated_blue_histo[256], VP8LMultipliers* const best_tx) { const int8_t offset[kGreenRedToBlueNumAxis][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}}; const int8_t delta_lut[kGreenRedToBlueMaxIters] = { 16, 16, 8, 4, 2, 2, 2 }; const int iters = (quality < 25) ? 1 : (quality > 50) ? kGreenRedToBlueMaxIters : 4; int green_to_blue_best = 0; int red_to_blue_best = 0; int iter; // Initial value at origin: float best_diff = GetPredictionCostCrossColorBlue( argb, stride, tile_width, tile_height, prev_x, prev_y, green_to_blue_best, red_to_blue_best, accumulated_blue_histo); for (iter = 0; iter < iters; ++iter) { const int delta = delta_lut[iter]; int axis; for (axis = 0; axis < kGreenRedToBlueNumAxis; ++axis) { const int green_to_blue_cur = offset[axis][0] * delta + green_to_blue_best; const int red_to_blue_cur = offset[axis][1] * delta + red_to_blue_best; const float cur_diff = GetPredictionCostCrossColorBlue( argb, stride, tile_width, tile_height, prev_x, prev_y, green_to_blue_cur, red_to_blue_cur, accumulated_blue_histo); if (cur_diff < best_diff) { best_diff = cur_diff; green_to_blue_best = green_to_blue_cur; red_to_blue_best = red_to_blue_cur; } if (quality < 25 && iter == 4) { // Only axis aligned diffs for lower quality. break; // next iter. } } if (delta == 2 && green_to_blue_best == 0 && red_to_blue_best == 0) { // Further iterations would not help. break; // out of iter-loop. } } best_tx->green_to_blue_ = green_to_blue_best & 0xff; best_tx->red_to_blue_ = red_to_blue_best & 0xff; } #undef kGreenRedToBlueMaxIters #undef kGreenRedToBlueNumAxis static VP8LMultipliers GetBestColorTransformForTile( int tile_x, int tile_y, int bits, VP8LMultipliers prev_x, VP8LMultipliers prev_y, int quality, int xsize, int ysize, const int accumulated_red_histo[256], const int accumulated_blue_histo[256], const uint32_t* const argb) { const int max_tile_size = 1 << bits; const int tile_y_offset = tile_y * max_tile_size; const int tile_x_offset = tile_x * max_tile_size; const int all_x_max = GetMin(tile_x_offset + max_tile_size, xsize); const int all_y_max = GetMin(tile_y_offset + max_tile_size, ysize); const int tile_width = all_x_max - tile_x_offset; const int tile_height = all_y_max - tile_y_offset; const uint32_t* const tile_argb = argb + tile_y_offset * xsize + tile_x_offset; VP8LMultipliers best_tx; MultipliersClear(&best_tx); GetBestGreenToRed(tile_argb, xsize, tile_width, tile_height, prev_x, prev_y, quality, accumulated_red_histo, &best_tx); GetBestGreenRedToBlue(tile_argb, xsize, tile_width, tile_height, prev_x, prev_y, quality, accumulated_blue_histo, &best_tx); return best_tx; } static void CopyTileWithColorTransform(int xsize, int ysize, int tile_x, int tile_y, int max_tile_size, VP8LMultipliers color_transform, uint32_t* argb) { const int xscan = GetMin(max_tile_size, xsize - tile_x); int yscan = GetMin(max_tile_size, ysize - tile_y); argb += tile_y * xsize + tile_x; while (yscan-- > 0) { VP8LTransformColor(&color_transform, argb, xscan); argb += xsize; } } int VP8LColorSpaceTransform(int width, int height, int bits, int quality, uint32_t* const argb, uint32_t* image, const WebPPicture* const pic, int percent_range, int* const percent) { const int max_tile_size = 1 << bits; const int tile_xsize = VP8LSubSampleSize(width, bits); const int tile_ysize = VP8LSubSampleSize(height, bits); int percent_start = *percent; int accumulated_red_histo[256] = { 0 }; int accumulated_blue_histo[256] = { 0 }; int tile_x, tile_y; VP8LMultipliers prev_x, prev_y; MultipliersClear(&prev_y); MultipliersClear(&prev_x); for (tile_y = 0; tile_y < tile_ysize; ++tile_y) { for (tile_x = 0; tile_x < tile_xsize; ++tile_x) { int y; const int tile_x_offset = tile_x * max_tile_size; const int tile_y_offset = tile_y * max_tile_size; const int all_x_max = GetMin(tile_x_offset + max_tile_size, width); const int all_y_max = GetMin(tile_y_offset + max_tile_size, height); const int offset = tile_y * tile_xsize + tile_x; if (tile_y != 0) { ColorCodeToMultipliers(image[offset - tile_xsize], &prev_y); } prev_x = GetBestColorTransformForTile(tile_x, tile_y, bits, prev_x, prev_y, quality, width, height, accumulated_red_histo, accumulated_blue_histo, argb); image[offset] = MultipliersToColorCode(&prev_x); CopyTileWithColorTransform(width, height, tile_x_offset, tile_y_offset, max_tile_size, prev_x, argb); // Gather accumulated histogram data. for (y = tile_y_offset; y < all_y_max; ++y) { int ix = y * width + tile_x_offset; const int ix_end = ix + all_x_max - tile_x_offset; for (; ix < ix_end; ++ix) { const uint32_t pix = argb[ix]; if (ix >= 2 && pix == argb[ix - 2] && pix == argb[ix - 1]) { continue; // repeated pixels are handled by backward references } if (ix >= width + 2 && argb[ix - 2] == argb[ix - width - 2] && argb[ix - 1] == argb[ix - width - 1] && pix == argb[ix - width]) { continue; // repeated pixels are handled by backward references } ++accumulated_red_histo[(pix >> 16) & 0xff]; ++accumulated_blue_histo[(pix >> 0) & 0xff]; } } } if (!WebPReportProgress( pic, percent_start + percent_range * tile_y / tile_ysize, percent)) { return 0; } } return 1; } libwebp-1.4.0/src/enc/iterator_enc.c0000644000014400001440000003462414606317060014242 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // VP8Iterator: block iterator // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // VP8Iterator //------------------------------------------------------------------------------ static void InitLeft(VP8EncIterator* const it) { it->y_left_[-1] = it->u_left_[-1] = it->v_left_[-1] = (it->y_ > 0) ? 129 : 127; memset(it->y_left_, 129, 16); memset(it->u_left_, 129, 8); memset(it->v_left_, 129, 8); it->left_nz_[8] = 0; if (it->top_derr_ != NULL) { memset(&it->left_derr_, 0, sizeof(it->left_derr_)); } } static void InitTop(VP8EncIterator* const it) { const VP8Encoder* const enc = it->enc_; const size_t top_size = enc->mb_w_ * 16; memset(enc->y_top_, 127, 2 * top_size); memset(enc->nz_, 0, enc->mb_w_ * sizeof(*enc->nz_)); if (enc->top_derr_ != NULL) { memset(enc->top_derr_, 0, enc->mb_w_ * sizeof(*enc->top_derr_)); } } void VP8IteratorSetRow(VP8EncIterator* const it, int y) { VP8Encoder* const enc = it->enc_; it->x_ = 0; it->y_ = y; it->bw_ = &enc->parts_[y & (enc->num_parts_ - 1)]; it->preds_ = enc->preds_ + y * 4 * enc->preds_w_; it->nz_ = enc->nz_; it->mb_ = enc->mb_info_ + y * enc->mb_w_; it->y_top_ = enc->y_top_; it->uv_top_ = enc->uv_top_; InitLeft(it); } void VP8IteratorReset(VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; VP8IteratorSetRow(it, 0); VP8IteratorSetCountDown(it, enc->mb_w_ * enc->mb_h_); // default InitTop(it); memset(it->bit_count_, 0, sizeof(it->bit_count_)); it->do_trellis_ = 0; } void VP8IteratorSetCountDown(VP8EncIterator* const it, int count_down) { it->count_down_ = it->count_down0_ = count_down; } int VP8IteratorIsDone(const VP8EncIterator* const it) { return (it->count_down_ <= 0); } void VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it) { it->enc_ = enc; it->yuv_in_ = (uint8_t*)WEBP_ALIGN(it->yuv_mem_); it->yuv_out_ = it->yuv_in_ + YUV_SIZE_ENC; it->yuv_out2_ = it->yuv_out_ + YUV_SIZE_ENC; it->yuv_p_ = it->yuv_out2_ + YUV_SIZE_ENC; it->lf_stats_ = enc->lf_stats_; it->percent0_ = enc->percent_; it->y_left_ = (uint8_t*)WEBP_ALIGN(it->yuv_left_mem_ + 1); it->u_left_ = it->y_left_ + 16 + 16; it->v_left_ = it->u_left_ + 16; it->top_derr_ = enc->top_derr_; VP8IteratorReset(it); } int VP8IteratorProgress(const VP8EncIterator* const it, int delta) { VP8Encoder* const enc = it->enc_; if (delta && enc->pic_->progress_hook != NULL) { const int done = it->count_down0_ - it->count_down_; const int percent = (it->count_down0_ <= 0) ? it->percent0_ : it->percent0_ + delta * done / it->count_down0_; return WebPReportProgress(enc->pic_, percent, &enc->percent_); } return 1; } //------------------------------------------------------------------------------ // Import the source samples into the cache. Takes care of replicating // boundary pixels if necessary. static WEBP_INLINE int MinSize(int a, int b) { return (a < b) ? a : b; } static void ImportBlock(const uint8_t* src, int src_stride, uint8_t* dst, int w, int h, int size) { int i; for (i = 0; i < h; ++i) { memcpy(dst, src, w); if (w < size) { memset(dst + w, dst[w - 1], size - w); } dst += BPS; src += src_stride; } for (i = h; i < size; ++i) { memcpy(dst, dst - BPS, size); dst += BPS; } } static void ImportLine(const uint8_t* src, int src_stride, uint8_t* dst, int len, int total_len) { int i; for (i = 0; i < len; ++i, src += src_stride) dst[i] = *src; for (; i < total_len; ++i) dst[i] = dst[len - 1]; } void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32) { const VP8Encoder* const enc = it->enc_; const int x = it->x_, y = it->y_; const WebPPicture* const pic = enc->pic_; const uint8_t* const ysrc = pic->y + (y * pic->y_stride + x) * 16; const uint8_t* const usrc = pic->u + (y * pic->uv_stride + x) * 8; const uint8_t* const vsrc = pic->v + (y * pic->uv_stride + x) * 8; const int w = MinSize(pic->width - x * 16, 16); const int h = MinSize(pic->height - y * 16, 16); const int uv_w = (w + 1) >> 1; const int uv_h = (h + 1) >> 1; ImportBlock(ysrc, pic->y_stride, it->yuv_in_ + Y_OFF_ENC, w, h, 16); ImportBlock(usrc, pic->uv_stride, it->yuv_in_ + U_OFF_ENC, uv_w, uv_h, 8); ImportBlock(vsrc, pic->uv_stride, it->yuv_in_ + V_OFF_ENC, uv_w, uv_h, 8); if (tmp_32 == NULL) return; // Import source (uncompressed) samples into boundary. if (x == 0) { InitLeft(it); } else { if (y == 0) { it->y_left_[-1] = it->u_left_[-1] = it->v_left_[-1] = 127; } else { it->y_left_[-1] = ysrc[- 1 - pic->y_stride]; it->u_left_[-1] = usrc[- 1 - pic->uv_stride]; it->v_left_[-1] = vsrc[- 1 - pic->uv_stride]; } ImportLine(ysrc - 1, pic->y_stride, it->y_left_, h, 16); ImportLine(usrc - 1, pic->uv_stride, it->u_left_, uv_h, 8); ImportLine(vsrc - 1, pic->uv_stride, it->v_left_, uv_h, 8); } it->y_top_ = tmp_32 + 0; it->uv_top_ = tmp_32 + 16; if (y == 0) { memset(tmp_32, 127, 32 * sizeof(*tmp_32)); } else { ImportLine(ysrc - pic->y_stride, 1, tmp_32, w, 16); ImportLine(usrc - pic->uv_stride, 1, tmp_32 + 16, uv_w, 8); ImportLine(vsrc - pic->uv_stride, 1, tmp_32 + 16 + 8, uv_w, 8); } } //------------------------------------------------------------------------------ // Copy back the compressed samples into user space if requested. static void ExportBlock(const uint8_t* src, uint8_t* dst, int dst_stride, int w, int h) { while (h-- > 0) { memcpy(dst, src, w); dst += dst_stride; src += BPS; } } void VP8IteratorExport(const VP8EncIterator* const it) { const VP8Encoder* const enc = it->enc_; if (enc->config_->show_compressed) { const int x = it->x_, y = it->y_; const uint8_t* const ysrc = it->yuv_out_ + Y_OFF_ENC; const uint8_t* const usrc = it->yuv_out_ + U_OFF_ENC; const uint8_t* const vsrc = it->yuv_out_ + V_OFF_ENC; const WebPPicture* const pic = enc->pic_; uint8_t* const ydst = pic->y + (y * pic->y_stride + x) * 16; uint8_t* const udst = pic->u + (y * pic->uv_stride + x) * 8; uint8_t* const vdst = pic->v + (y * pic->uv_stride + x) * 8; int w = (pic->width - x * 16); int h = (pic->height - y * 16); if (w > 16) w = 16; if (h > 16) h = 16; // Luma plane ExportBlock(ysrc, ydst, pic->y_stride, w, h); { // U/V planes const int uv_w = (w + 1) >> 1; const int uv_h = (h + 1) >> 1; ExportBlock(usrc, udst, pic->uv_stride, uv_w, uv_h); ExportBlock(vsrc, vdst, pic->uv_stride, uv_w, uv_h); } } } //------------------------------------------------------------------------------ // Non-zero contexts setup/teardown // Nz bits: // 0 1 2 3 Y // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 // 16 17 U // 18 19 // 20 21 V // 22 23 // 24 DC-intra16 // Convert packed context to byte array #define BIT(nz, n) (!!((nz) & (1 << (n)))) void VP8IteratorNzToBytes(VP8EncIterator* const it) { const int tnz = it->nz_[0], lnz = it->nz_[-1]; int* const top_nz = it->top_nz_; int* const left_nz = it->left_nz_; // Top-Y top_nz[0] = BIT(tnz, 12); top_nz[1] = BIT(tnz, 13); top_nz[2] = BIT(tnz, 14); top_nz[3] = BIT(tnz, 15); // Top-U top_nz[4] = BIT(tnz, 18); top_nz[5] = BIT(tnz, 19); // Top-V top_nz[6] = BIT(tnz, 22); top_nz[7] = BIT(tnz, 23); // DC top_nz[8] = BIT(tnz, 24); // left-Y left_nz[0] = BIT(lnz, 3); left_nz[1] = BIT(lnz, 7); left_nz[2] = BIT(lnz, 11); left_nz[3] = BIT(lnz, 15); // left-U left_nz[4] = BIT(lnz, 17); left_nz[5] = BIT(lnz, 19); // left-V left_nz[6] = BIT(lnz, 21); left_nz[7] = BIT(lnz, 23); // left-DC is special, iterated separately } void VP8IteratorBytesToNz(VP8EncIterator* const it) { uint32_t nz = 0; const int* const top_nz = it->top_nz_; const int* const left_nz = it->left_nz_; // top nz |= (top_nz[0] << 12) | (top_nz[1] << 13); nz |= (top_nz[2] << 14) | (top_nz[3] << 15); nz |= (top_nz[4] << 18) | (top_nz[5] << 19); nz |= (top_nz[6] << 22) | (top_nz[7] << 23); nz |= (top_nz[8] << 24); // we propagate the _top_ bit, esp. for intra4 // left nz |= (left_nz[0] << 3) | (left_nz[1] << 7); nz |= (left_nz[2] << 11); nz |= (left_nz[4] << 17) | (left_nz[6] << 21); *it->nz_ = nz; } #undef BIT //------------------------------------------------------------------------------ // Advance to the next position, doing the bookkeeping. void VP8IteratorSaveBoundary(VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; const int x = it->x_, y = it->y_; const uint8_t* const ysrc = it->yuv_out_ + Y_OFF_ENC; const uint8_t* const uvsrc = it->yuv_out_ + U_OFF_ENC; if (x < enc->mb_w_ - 1) { // left int i; for (i = 0; i < 16; ++i) { it->y_left_[i] = ysrc[15 + i * BPS]; } for (i = 0; i < 8; ++i) { it->u_left_[i] = uvsrc[7 + i * BPS]; it->v_left_[i] = uvsrc[15 + i * BPS]; } // top-left (before 'top'!) it->y_left_[-1] = it->y_top_[15]; it->u_left_[-1] = it->uv_top_[0 + 7]; it->v_left_[-1] = it->uv_top_[8 + 7]; } if (y < enc->mb_h_ - 1) { // top memcpy(it->y_top_, ysrc + 15 * BPS, 16); memcpy(it->uv_top_, uvsrc + 7 * BPS, 8 + 8); } } int VP8IteratorNext(VP8EncIterator* const it) { if (++it->x_ == it->enc_->mb_w_) { VP8IteratorSetRow(it, ++it->y_); } else { it->preds_ += 4; it->mb_ += 1; it->nz_ += 1; it->y_top_ += 16; it->uv_top_ += 16; } return (0 < --it->count_down_); } //------------------------------------------------------------------------------ // Helper function to set mode properties void VP8SetIntra16Mode(const VP8EncIterator* const it, int mode) { uint8_t* preds = it->preds_; int y; for (y = 0; y < 4; ++y) { memset(preds, mode, 4); preds += it->enc_->preds_w_; } it->mb_->type_ = 1; } void VP8SetIntra4Mode(const VP8EncIterator* const it, const uint8_t* modes) { uint8_t* preds = it->preds_; int y; for (y = 4; y > 0; --y) { memcpy(preds, modes, 4 * sizeof(*modes)); preds += it->enc_->preds_w_; modes += 4; } it->mb_->type_ = 0; } void VP8SetIntraUVMode(const VP8EncIterator* const it, int mode) { it->mb_->uv_mode_ = mode; } void VP8SetSkip(const VP8EncIterator* const it, int skip) { it->mb_->skip_ = skip; } void VP8SetSegment(const VP8EncIterator* const it, int segment) { it->mb_->segment_ = segment; } //------------------------------------------------------------------------------ // Intra4x4 sub-blocks iteration // // We store and update the boundary samples into an array of 37 pixels. They // are updated as we iterate and reconstructs each intra4x4 blocks in turn. // The position of the samples has the following snake pattern: // // 16|17 18 19 20|21 22 23 24|25 26 27 28|29 30 31 32|33 34 35 36 <- Top-right // --+-----------+-----------+-----------+-----------+ // 15| 19| 23| 27| 31| // 14| 18| 22| 26| 30| // 13| 17| 21| 25| 29| // 12|13 14 15 16|17 18 19 20|21 22 23 24|25 26 27 28| // --+-----------+-----------+-----------+-----------+ // 11| 15| 19| 23| 27| // 10| 14| 18| 22| 26| // 9| 13| 17| 21| 25| // 8| 9 10 11 12|13 14 15 16|17 18 19 20|21 22 23 24| // --+-----------+-----------+-----------+-----------+ // 7| 11| 15| 19| 23| // 6| 10| 14| 18| 22| // 5| 9| 13| 17| 21| // 4| 5 6 7 8| 9 10 11 12|13 14 15 16|17 18 19 20| // --+-----------+-----------+-----------+-----------+ // 3| 7| 11| 15| 19| // 2| 6| 10| 14| 18| // 1| 5| 9| 13| 17| // 0| 1 2 3 4| 5 6 7 8| 9 10 11 12|13 14 15 16| // --+-----------+-----------+-----------+-----------+ // Array to record the position of the top sample to pass to the prediction // functions in dsp.c. static const uint8_t VP8TopLeftI4[16] = { 17, 21, 25, 29, 13, 17, 21, 25, 9, 13, 17, 21, 5, 9, 13, 17 }; void VP8IteratorStartI4(VP8EncIterator* const it) { const VP8Encoder* const enc = it->enc_; int i; it->i4_ = 0; // first 4x4 sub-block it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[0]; // Import the boundary samples for (i = 0; i < 17; ++i) { // left it->i4_boundary_[i] = it->y_left_[15 - i]; } for (i = 0; i < 16; ++i) { // top it->i4_boundary_[17 + i] = it->y_top_[i]; } // top-right samples have a special case on the far right of the picture if (it->x_ < enc->mb_w_ - 1) { for (i = 16; i < 16 + 4; ++i) { it->i4_boundary_[17 + i] = it->y_top_[i]; } } else { // else, replicate the last valid pixel four times for (i = 16; i < 16 + 4; ++i) { it->i4_boundary_[17 + i] = it->i4_boundary_[17 + 15]; } } VP8IteratorNzToBytes(it); // import the non-zero context } int VP8IteratorRotateI4(VP8EncIterator* const it, const uint8_t* const yuv_out) { const uint8_t* const blk = yuv_out + VP8Scan[it->i4_]; uint8_t* const top = it->i4_top_; int i; // Update the cache with 7 fresh samples for (i = 0; i <= 3; ++i) { top[-4 + i] = blk[i + 3 * BPS]; // store future top samples } if ((it->i4_ & 3) != 3) { // if not on the right sub-blocks #3, #7, #11, #15 for (i = 0; i <= 2; ++i) { // store future left samples top[i] = blk[3 + (2 - i) * BPS]; } } else { // else replicate top-right samples, as says the specs. for (i = 0; i <= 3; ++i) { top[i] = top[i + 4]; } } // move pointers to next sub-block ++it->i4_; if (it->i4_ == 16) { // we're done return 0; } it->i4_top_ = it->i4_boundary_ + VP8TopLeftI4[it->i4_]; return 1; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/filter_enc.c0000644000014400001440000002131214606317060013664 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Selecting filter level // // Author: somnath@google.com (Somnath Banerjee) #include #include "src/enc/vp8i_enc.h" #include "src/dsp/dsp.h" // This table gives, for a given sharpness, the filtering strength to be // used (at least) in order to filter a given edge step delta. // This is constructed by brute force inspection: for all delta, we iterate // over all possible filtering strength / thresh until needs_filter() returns // true. #define MAX_DELTA_SIZE 64 static const uint8_t kLevelsFromDelta[8][MAX_DELTA_SIZE] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 }, { 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28, 30, 31, 33, 34, 36, 37, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 61, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 }, { 0, 1, 2, 4, 5, 7, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63 } }; int VP8FilterStrengthFromDelta(int sharpness, int delta) { const int pos = (delta < MAX_DELTA_SIZE) ? delta : MAX_DELTA_SIZE - 1; assert(sharpness >= 0 && sharpness <= 7); return kLevelsFromDelta[sharpness][pos]; } //------------------------------------------------------------------------------ // Paragraph 15.4: compute the inner-edge filtering strength #if !defined(WEBP_REDUCE_SIZE) static int GetILevel(int sharpness, int level) { if (sharpness > 0) { if (sharpness > 4) { level >>= 2; } else { level >>= 1; } if (level > 9 - sharpness) { level = 9 - sharpness; } } if (level < 1) level = 1; return level; } static void DoFilter(const VP8EncIterator* const it, int level) { const VP8Encoder* const enc = it->enc_; const int ilevel = GetILevel(enc->config_->filter_sharpness, level); const int limit = 2 * level + ilevel; uint8_t* const y_dst = it->yuv_out2_ + Y_OFF_ENC; uint8_t* const u_dst = it->yuv_out2_ + U_OFF_ENC; uint8_t* const v_dst = it->yuv_out2_ + V_OFF_ENC; // copy current block to yuv_out2_ memcpy(y_dst, it->yuv_out_, YUV_SIZE_ENC * sizeof(uint8_t)); if (enc->filter_hdr_.simple_ == 1) { // simple VP8SimpleHFilter16i(y_dst, BPS, limit); VP8SimpleVFilter16i(y_dst, BPS, limit); } else { // complex const int hev_thresh = (level >= 40) ? 2 : (level >= 15) ? 1 : 0; VP8HFilter16i(y_dst, BPS, limit, ilevel, hev_thresh); VP8HFilter8i(u_dst, v_dst, BPS, limit, ilevel, hev_thresh); VP8VFilter16i(y_dst, BPS, limit, ilevel, hev_thresh); VP8VFilter8i(u_dst, v_dst, BPS, limit, ilevel, hev_thresh); } } //------------------------------------------------------------------------------ // SSIM metric for one macroblock static double GetMBSSIM(const uint8_t* yuv1, const uint8_t* yuv2) { int x, y; double sum = 0.; // compute SSIM in a 10 x 10 window for (y = VP8_SSIM_KERNEL; y < 16 - VP8_SSIM_KERNEL; y++) { for (x = VP8_SSIM_KERNEL; x < 16 - VP8_SSIM_KERNEL; x++) { sum += VP8SSIMGetClipped(yuv1 + Y_OFF_ENC, BPS, yuv2 + Y_OFF_ENC, BPS, x, y, 16, 16); } } for (x = 1; x < 7; x++) { for (y = 1; y < 7; y++) { sum += VP8SSIMGetClipped(yuv1 + U_OFF_ENC, BPS, yuv2 + U_OFF_ENC, BPS, x, y, 8, 8); sum += VP8SSIMGetClipped(yuv1 + V_OFF_ENC, BPS, yuv2 + V_OFF_ENC, BPS, x, y, 8, 8); } } return sum; } #endif // !defined(WEBP_REDUCE_SIZE) //------------------------------------------------------------------------------ // Exposed APIs: Encoder should call the following 3 functions to adjust // loop filter strength void VP8InitFilter(VP8EncIterator* const it) { #if !defined(WEBP_REDUCE_SIZE) if (it->lf_stats_ != NULL) { int s, i; for (s = 0; s < NUM_MB_SEGMENTS; s++) { for (i = 0; i < MAX_LF_LEVELS; i++) { (*it->lf_stats_)[s][i] = 0; } } VP8SSIMDspInit(); } #else (void)it; #endif } void VP8StoreFilterStats(VP8EncIterator* const it) { #if !defined(WEBP_REDUCE_SIZE) int d; VP8Encoder* const enc = it->enc_; const int s = it->mb_->segment_; const int level0 = enc->dqm_[s].fstrength_; // explore +/-quant range of values around level0 const int delta_min = -enc->dqm_[s].quant_; const int delta_max = enc->dqm_[s].quant_; const int step_size = (delta_max - delta_min >= 4) ? 4 : 1; if (it->lf_stats_ == NULL) return; // NOTE: Currently we are applying filter only across the sublock edges // There are two reasons for that. // 1. Applying filter on macro block edges will change the pixels in // the left and top macro blocks. That will be hard to restore // 2. Macro Blocks on the bottom and right are not yet compressed. So we // cannot apply filter on the right and bottom macro block edges. if (it->mb_->type_ == 1 && it->mb_->skip_) return; // Always try filter level zero (*it->lf_stats_)[s][0] += GetMBSSIM(it->yuv_in_, it->yuv_out_); for (d = delta_min; d <= delta_max; d += step_size) { const int level = level0 + d; if (level <= 0 || level >= MAX_LF_LEVELS) { continue; } DoFilter(it, level); (*it->lf_stats_)[s][level] += GetMBSSIM(it->yuv_in_, it->yuv_out2_); } #else // defined(WEBP_REDUCE_SIZE) (void)it; #endif // !defined(WEBP_REDUCE_SIZE) } void VP8AdjustFilterStrength(VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; #if !defined(WEBP_REDUCE_SIZE) if (it->lf_stats_ != NULL) { int s; for (s = 0; s < NUM_MB_SEGMENTS; s++) { int i, best_level = 0; // Improvement over filter level 0 should be at least 1e-5 (relatively) double best_v = 1.00001 * (*it->lf_stats_)[s][0]; for (i = 1; i < MAX_LF_LEVELS; i++) { const double v = (*it->lf_stats_)[s][i]; if (v > best_v) { best_v = v; best_level = i; } } enc->dqm_[s].fstrength_ = best_level; } return; } #endif // !defined(WEBP_REDUCE_SIZE) if (enc->config_->filter_strength > 0) { int max_level = 0; int s; for (s = 0; s < NUM_MB_SEGMENTS; s++) { VP8SegmentInfo* const dqm = &enc->dqm_[s]; // this '>> 3' accounts for some inverse WHT scaling const int delta = (dqm->max_edge_ * dqm->y2_.q_[1]) >> 3; const int level = VP8FilterStrengthFromDelta(enc->filter_hdr_.sharpness_, delta); if (level > dqm->fstrength_) { dqm->fstrength_ = level; } if (max_level < dqm->fstrength_) { max_level = dqm->fstrength_; } } enc->filter_hdr_.level_ = max_level; } } // ----------------------------------------------------------------------------- libwebp-1.4.0/src/enc/vp8i_enc.h0000644000014400001440000005301714606317060013301 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP encoder: internal header. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_ENC_VP8I_ENC_H_ #define WEBP_ENC_VP8I_ENC_H_ #include // for memcpy() #include "src/dec/common_dec.h" #include "src/dsp/dsp.h" #include "src/utils/bit_writer_utils.h" #include "src/utils/thread_utils.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #ifdef __cplusplus extern "C" { #endif //------------------------------------------------------------------------------ // Various defines and enums // version numbers #define ENC_MAJ_VERSION 1 #define ENC_MIN_VERSION 4 #define ENC_REV_VERSION 0 enum { MAX_LF_LEVELS = 64, // Maximum loop filter level MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost MAX_LEVEL = 2047 // max level (note: max codable is 2047 + 67) }; typedef enum { // Rate-distortion optimization levels RD_OPT_NONE = 0, // no rd-opt RD_OPT_BASIC = 1, // basic scoring (no trellis) RD_OPT_TRELLIS = 2, // perform trellis-quant on the final decision only RD_OPT_TRELLIS_ALL = 3 // trellis-quant for every scoring (much slower) } VP8RDLevel; // YUV-cache parameters. Cache is 32-bytes wide (= one cacheline). // The original or reconstructed samples can be accessed using VP8Scan[]. // The predicted blocks can be accessed using offsets to yuv_p_ and // the arrays VP8*ModeOffsets[]. // * YUV Samples area (yuv_in_/yuv_out_/yuv_out2_) // (see VP8Scan[] for accessing the blocks, along with // Y_OFF_ENC/U_OFF_ENC/V_OFF_ENC): // +----+----+ // Y_OFF_ENC |YYYY|UUVV| // U_OFF_ENC |YYYY|UUVV| // V_OFF_ENC |YYYY|....| <- 25% wasted U/V area // |YYYY|....| // +----+----+ // * Prediction area ('yuv_p_', size = PRED_SIZE_ENC) // Intra16 predictions (16x16 block each, two per row): // |I16DC16|I16TM16| // |I16VE16|I16HE16| // Chroma U/V predictions (16x8 block each, two per row): // |C8DC8|C8TM8| // |C8VE8|C8HE8| // Intra 4x4 predictions (4x4 block each) // |I4DC4 I4TM4 I4VE4 I4HE4|I4RD4 I4VR4 I4LD4 I4VL4| // |I4HD4 I4HU4 I4TMP .....|.......................| <- ~31% wasted #define YUV_SIZE_ENC (BPS * 16) #define PRED_SIZE_ENC (32 * BPS + 16 * BPS + 8 * BPS) // I16+Chroma+I4 preds #define Y_OFF_ENC (0) #define U_OFF_ENC (16) #define V_OFF_ENC (16 + 8) extern const uint16_t VP8Scan[16]; extern const uint16_t VP8UVModeOffsets[4]; extern const uint16_t VP8I16ModeOffsets[4]; extern const uint16_t VP8I4ModeOffsets[NUM_BMODES]; // Layout of prediction blocks // intra 16x16 #define I16DC16 (0 * 16 * BPS) #define I16TM16 (I16DC16 + 16) #define I16VE16 (1 * 16 * BPS) #define I16HE16 (I16VE16 + 16) // chroma 8x8, two U/V blocks side by side (hence: 16x8 each) #define C8DC8 (2 * 16 * BPS) #define C8TM8 (C8DC8 + 1 * 16) #define C8VE8 (2 * 16 * BPS + 8 * BPS) #define C8HE8 (C8VE8 + 1 * 16) // intra 4x4 #define I4DC4 (3 * 16 * BPS + 0) #define I4TM4 (I4DC4 + 4) #define I4VE4 (I4DC4 + 8) #define I4HE4 (I4DC4 + 12) #define I4RD4 (I4DC4 + 16) #define I4VR4 (I4DC4 + 20) #define I4LD4 (I4DC4 + 24) #define I4VL4 (I4DC4 + 28) #define I4HD4 (3 * 16 * BPS + 4 * BPS) #define I4HU4 (I4HD4 + 4) #define I4TMP (I4HD4 + 8) typedef int64_t score_t; // type used for scores, rate, distortion // Note that MAX_COST is not the maximum allowed by sizeof(score_t), // in order to allow overflowing computations. #define MAX_COST ((score_t)0x7fffffffffffffLL) #define QFIX 17 #define BIAS(b) ((b) << (QFIX - 8)) // Fun fact: this is the _only_ line where we're actually being lossy and // discarding bits. static WEBP_INLINE int QUANTDIV(uint32_t n, uint32_t iQ, uint32_t B) { return (int)((n * iQ + B) >> QFIX); } // Uncomment the following to remove token-buffer code: // #define DISABLE_TOKEN_BUFFER // quality below which error-diffusion is enabled #define ERROR_DIFFUSION_QUALITY 98 //------------------------------------------------------------------------------ // Headers typedef uint32_t proba_t; // 16b + 16b typedef uint8_t ProbaArray[NUM_CTX][NUM_PROBAS]; typedef proba_t StatsArray[NUM_CTX][NUM_PROBAS]; typedef uint16_t CostArray[NUM_CTX][MAX_VARIABLE_LEVEL + 1]; typedef const uint16_t* (*CostArrayPtr)[NUM_CTX]; // for easy casting typedef const uint16_t* CostArrayMap[16][NUM_CTX]; typedef double LFStats[NUM_MB_SEGMENTS][MAX_LF_LEVELS]; // filter stats typedef struct VP8Encoder VP8Encoder; // segment features typedef struct { int num_segments_; // Actual number of segments. 1 segment only = unused. int update_map_; // whether to update the segment map or not. // must be 0 if there's only 1 segment. int size_; // bit-cost for transmitting the segment map } VP8EncSegmentHeader; // Struct collecting all frame-persistent probabilities. typedef struct { uint8_t segments_[3]; // probabilities for segment tree uint8_t skip_proba_; // final probability of being skipped. ProbaArray coeffs_[NUM_TYPES][NUM_BANDS]; // 1056 bytes StatsArray stats_[NUM_TYPES][NUM_BANDS]; // 4224 bytes CostArray level_cost_[NUM_TYPES][NUM_BANDS]; // 13056 bytes CostArrayMap remapped_costs_[NUM_TYPES]; // 1536 bytes int dirty_; // if true, need to call VP8CalculateLevelCosts() int use_skip_proba_; // Note: we always use skip_proba for now. int nb_skip_; // number of skipped blocks } VP8EncProba; // Filter parameters. Not actually used in the code (we don't perform // the in-loop filtering), but filled from user's config typedef struct { int simple_; // filtering type: 0=complex, 1=simple int level_; // base filter level [0..63] int sharpness_; // [0..7] int i4x4_lf_delta_; // delta filter level for i4x4 relative to i16x16 } VP8EncFilterHeader; //------------------------------------------------------------------------------ // Informations about the macroblocks. typedef struct { // block type unsigned int type_:2; // 0=i4x4, 1=i16x16 unsigned int uv_mode_:2; unsigned int skip_:1; unsigned int segment_:2; uint8_t alpha_; // quantization-susceptibility } VP8MBInfo; typedef struct VP8Matrix { uint16_t q_[16]; // quantizer steps uint16_t iq_[16]; // reciprocals, fixed point. uint32_t bias_[16]; // rounding bias uint32_t zthresh_[16]; // value below which a coefficient is zeroed uint16_t sharpen_[16]; // frequency boosters for slight sharpening } VP8Matrix; typedef struct { VP8Matrix y1_, y2_, uv_; // quantization matrices int alpha_; // quant-susceptibility, range [-127,127]. Zero is neutral. // Lower values indicate a lower risk of blurriness. int beta_; // filter-susceptibility, range [0,255]. int quant_; // final segment quantizer. int fstrength_; // final in-loop filtering strength int max_edge_; // max edge delta (for filtering strength) int min_disto_; // minimum distortion required to trigger filtering record // reactivities int lambda_i16_, lambda_i4_, lambda_uv_; int lambda_mode_, lambda_trellis_, tlambda_; int lambda_trellis_i16_, lambda_trellis_i4_, lambda_trellis_uv_; // lambda values for distortion-based evaluation score_t i4_penalty_; // penalty for using Intra4 } VP8SegmentInfo; typedef int8_t DError[2 /* u/v */][2 /* top or left */]; // Handy transient struct to accumulate score and info during RD-optimization // and mode evaluation. typedef struct { score_t D, SD; // Distortion, spectral distortion score_t H, R, score; // header bits, rate, score. int16_t y_dc_levels[16]; // Quantized levels for luma-DC, luma-AC, chroma. int16_t y_ac_levels[16][16]; int16_t uv_levels[4 + 4][16]; int mode_i16; // mode number for intra16 prediction uint8_t modes_i4[16]; // mode numbers for intra4 predictions int mode_uv; // mode number of chroma prediction uint32_t nz; // non-zero blocks int8_t derr[2][3]; // DC diffusion errors for U/V for blocks #1/2/3 } VP8ModeScore; // Iterator structure to iterate through macroblocks, pointing to the // right neighbouring data (samples, predictions, contexts, ...) typedef struct { int x_, y_; // current macroblock uint8_t* yuv_in_; // input samples uint8_t* yuv_out_; // output samples uint8_t* yuv_out2_; // secondary buffer swapped with yuv_out_. uint8_t* yuv_p_; // scratch buffer for prediction VP8Encoder* enc_; // back-pointer VP8MBInfo* mb_; // current macroblock VP8BitWriter* bw_; // current bit-writer uint8_t* preds_; // intra mode predictors (4x4 blocks) uint32_t* nz_; // non-zero pattern uint8_t i4_boundary_[37]; // 32+5 boundary samples needed by intra4x4 uint8_t* i4_top_; // pointer to the current top boundary sample int i4_; // current intra4x4 mode being tested int top_nz_[9]; // top-non-zero context. int left_nz_[9]; // left-non-zero. left_nz[8] is independent. uint64_t bit_count_[4][3]; // bit counters for coded levels. uint64_t luma_bits_; // macroblock bit-cost for luma uint64_t uv_bits_; // macroblock bit-cost for chroma LFStats* lf_stats_; // filter stats (borrowed from enc_) int do_trellis_; // if true, perform extra level optimisation int count_down_; // number of mb still to be processed int count_down0_; // starting counter value (for progress) int percent0_; // saved initial progress percent DError left_derr_; // left error diffusion (u/v) DError* top_derr_; // top diffusion error - NULL if disabled uint8_t* y_left_; // left luma samples (addressable from index -1 to 15). uint8_t* u_left_; // left u samples (addressable from index -1 to 7) uint8_t* v_left_; // left v samples (addressable from index -1 to 7) uint8_t* y_top_; // top luma samples at position 'x_' uint8_t* uv_top_; // top u/v samples at position 'x_', packed as 16 bytes // memory for storing y/u/v_left_ uint8_t yuv_left_mem_[17 + 16 + 16 + 8 + WEBP_ALIGN_CST]; // memory for yuv_* uint8_t yuv_mem_[3 * YUV_SIZE_ENC + PRED_SIZE_ENC + WEBP_ALIGN_CST]; } VP8EncIterator; // in iterator.c // must be called first void VP8IteratorInit(VP8Encoder* const enc, VP8EncIterator* const it); // restart a scan void VP8IteratorReset(VP8EncIterator* const it); // reset iterator position to row 'y' void VP8IteratorSetRow(VP8EncIterator* const it, int y); // set count down (=number of iterations to go) void VP8IteratorSetCountDown(VP8EncIterator* const it, int count_down); // return true if iteration is finished int VP8IteratorIsDone(const VP8EncIterator* const it); // Import uncompressed samples from source. // If tmp_32 is not NULL, import boundary samples too. // tmp_32 is a 32-bytes scratch buffer that must be aligned in memory. void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32); // export decimated samples void VP8IteratorExport(const VP8EncIterator* const it); // go to next macroblock. Returns false if not finished. int VP8IteratorNext(VP8EncIterator* const it); // save the yuv_out_ boundary values to top_/left_ arrays for next iterations. void VP8IteratorSaveBoundary(VP8EncIterator* const it); // Report progression based on macroblock rows. Return 0 for user-abort request. int VP8IteratorProgress(const VP8EncIterator* const it, int delta); // Intra4x4 iterations void VP8IteratorStartI4(VP8EncIterator* const it); // returns true if not done. int VP8IteratorRotateI4(VP8EncIterator* const it, const uint8_t* const yuv_out); // Non-zero context setup/teardown void VP8IteratorNzToBytes(VP8EncIterator* const it); void VP8IteratorBytesToNz(VP8EncIterator* const it); // Helper functions to set mode properties void VP8SetIntra16Mode(const VP8EncIterator* const it, int mode); void VP8SetIntra4Mode(const VP8EncIterator* const it, const uint8_t* modes); void VP8SetIntraUVMode(const VP8EncIterator* const it, int mode); void VP8SetSkip(const VP8EncIterator* const it, int skip); void VP8SetSegment(const VP8EncIterator* const it, int segment); //------------------------------------------------------------------------------ // Paginated token buffer typedef struct VP8Tokens VP8Tokens; // struct details in token.c typedef struct { #if !defined(DISABLE_TOKEN_BUFFER) VP8Tokens* pages_; // first page VP8Tokens** last_page_; // last page uint16_t* tokens_; // set to (*last_page_)->tokens_ int left_; // how many free tokens left before the page is full int page_size_; // number of tokens per page #endif int error_; // true in case of malloc error } VP8TBuffer; // initialize an empty buffer void VP8TBufferInit(VP8TBuffer* const b, int page_size); void VP8TBufferClear(VP8TBuffer* const b); // de-allocate pages memory #if !defined(DISABLE_TOKEN_BUFFER) // Finalizes bitstream when probabilities are known. // Deletes the allocated token memory if final_pass is true. int VP8EmitTokens(VP8TBuffer* const b, VP8BitWriter* const bw, const uint8_t* const probas, int final_pass); // record the coding of coefficients without knowing the probabilities yet int VP8RecordCoeffTokens(int ctx, const struct VP8Residual* const res, VP8TBuffer* const tokens); // Estimate the final coded size given a set of 'probas'. size_t VP8EstimateTokenSize(VP8TBuffer* const b, const uint8_t* const probas); #endif // !DISABLE_TOKEN_BUFFER //------------------------------------------------------------------------------ // VP8Encoder struct VP8Encoder { const WebPConfig* config_; // user configuration and parameters WebPPicture* pic_; // input / output picture // headers VP8EncFilterHeader filter_hdr_; // filtering information VP8EncSegmentHeader segment_hdr_; // segment information int profile_; // VP8's profile, deduced from Config. // dimension, in macroblock units. int mb_w_, mb_h_; int preds_w_; // stride of the *preds_ prediction plane (=4*mb_w + 1) // number of partitions (1, 2, 4 or 8 = MAX_NUM_PARTITIONS) int num_parts_; // per-partition boolean decoders. VP8BitWriter bw_; // part0 VP8BitWriter parts_[MAX_NUM_PARTITIONS]; // token partitions VP8TBuffer tokens_; // token buffer int percent_; // for progress // transparency blob int has_alpha_; uint8_t* alpha_data_; // non-NULL if transparency is present uint32_t alpha_data_size_; WebPWorker alpha_worker_; // quantization info (one set of DC/AC dequant factor per segment) VP8SegmentInfo dqm_[NUM_MB_SEGMENTS]; int base_quant_; // nominal quantizer value. Only used // for relative coding of segments' quant. int alpha_; // global susceptibility (<=> complexity) int uv_alpha_; // U/V quantization susceptibility // global offset of quantizers, shared by all segments int dq_y1_dc_; int dq_y2_dc_, dq_y2_ac_; int dq_uv_dc_, dq_uv_ac_; // probabilities and statistics VP8EncProba proba_; uint64_t sse_[4]; // sum of Y/U/V/A squared errors for all macroblocks uint64_t sse_count_; // pixel count for the sse_[] stats int coded_size_; int residual_bytes_[3][4]; int block_count_[3]; // quality/speed settings int method_; // 0=fastest, 6=best/slowest. VP8RDLevel rd_opt_level_; // Deduced from method_. int max_i4_header_bits_; // partition #0 safeness factor int mb_header_limit_; // rough limit for header bits per MB int thread_level_; // derived from config->thread_level int do_search_; // derived from config->target_XXX int use_tokens_; // if true, use token buffer // Memory VP8MBInfo* mb_info_; // contextual macroblock infos (mb_w_ + 1) uint8_t* preds_; // predictions modes: (4*mb_w+1) * (4*mb_h+1) uint32_t* nz_; // non-zero bit context: mb_w+1 uint8_t* y_top_; // top luma samples. uint8_t* uv_top_; // top u/v samples. // U and V are packed into 16 bytes (8 U + 8 V) LFStats* lf_stats_; // autofilter stats (if NULL, autofilter is off) DError* top_derr_; // diffusion error (NULL if disabled) }; //------------------------------------------------------------------------------ // internal functions. Not public. // in tree.c extern const uint8_t VP8CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; extern const uint8_t VP8CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS]; // Reset the token probabilities to their initial (default) values void VP8DefaultProbas(VP8Encoder* const enc); // Write the token probabilities void VP8WriteProbas(VP8BitWriter* const bw, const VP8EncProba* const probas); // Writes the partition #0 modes (that is: all intra modes) void VP8CodeIntraModes(VP8Encoder* const enc); // in syntax.c // Generates the final bitstream by coding the partition0 and headers, // and appending an assembly of all the pre-coded token partitions. // Return true if everything is ok. int VP8EncWrite(VP8Encoder* const enc); // Release memory allocated for bit-writing in VP8EncLoop & seq. void VP8EncFreeBitWriters(VP8Encoder* const enc); // in frame.c extern const uint8_t VP8Cat3[]; extern const uint8_t VP8Cat4[]; extern const uint8_t VP8Cat5[]; extern const uint8_t VP8Cat6[]; // Form all the four Intra16x16 predictions in the yuv_p_ cache void VP8MakeLuma16Preds(const VP8EncIterator* const it); // Form all the four Chroma8x8 predictions in the yuv_p_ cache void VP8MakeChroma8Preds(const VP8EncIterator* const it); // Form all the ten Intra4x4 predictions in the yuv_p_ cache // for the 4x4 block it->i4_ void VP8MakeIntra4Preds(const VP8EncIterator* const it); // Rate calculation int VP8GetCostLuma16(VP8EncIterator* const it, const VP8ModeScore* const rd); int VP8GetCostLuma4(VP8EncIterator* const it, const int16_t levels[16]); int VP8GetCostUV(VP8EncIterator* const it, const VP8ModeScore* const rd); // Main coding calls int VP8EncLoop(VP8Encoder* const enc); int VP8EncTokenLoop(VP8Encoder* const enc); // in webpenc.c // Assign an error code to a picture. Return false for convenience. int WebPEncodingSetError(const WebPPicture* const pic, WebPEncodingError error); int WebPReportProgress(const WebPPicture* const pic, int percent, int* const percent_store); // in analysis.c // Main analysis loop. Decides the segmentations and complexity. // Assigns a first guess for Intra16 and uvmode_ prediction modes. int VP8EncAnalyze(VP8Encoder* const enc); // in quant.c // Sets up segment's quantization values, base_quant_ and filter strengths. void VP8SetSegmentParams(VP8Encoder* const enc, float quality); // Pick best modes and fills the levels. Returns true if skipped. int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd, VP8RDLevel rd_opt); // in alpha.c void VP8EncInitAlpha(VP8Encoder* const enc); // initialize alpha compression int VP8EncStartAlpha(VP8Encoder* const enc); // start alpha coding process int VP8EncFinishAlpha(VP8Encoder* const enc); // finalize compressed data int VP8EncDeleteAlpha(VP8Encoder* const enc); // delete compressed data // autofilter void VP8InitFilter(VP8EncIterator* const it); void VP8StoreFilterStats(VP8EncIterator* const it); void VP8AdjustFilterStrength(VP8EncIterator* const it); // returns the approximate filtering strength needed to smooth a edge // step of 'delta', given a sharpness parameter 'sharpness'. int VP8FilterStrengthFromDelta(int sharpness, int delta); // misc utils for picture_*.c: // Returns true if 'picture' is non-NULL and dimensions/colorspace are within // their valid ranges. If returning false, the 'error_code' in 'picture' is // updated. int WebPValidatePicture(const WebPPicture* const picture); // Remove reference to the ARGB/YUVA buffer (doesn't free anything). void WebPPictureResetBuffers(WebPPicture* const picture); // Allocates ARGB buffer according to set width/height (previous one is // always free'd). Preserves the YUV(A) buffer. Returns false in case of error // (invalid param, out-of-memory). int WebPPictureAllocARGB(WebPPicture* const picture); // Allocates YUVA buffer according to set width/height (previous one is always // free'd). Uses picture->csp to determine whether an alpha buffer is needed. // Preserves the ARGB buffer. // Returns false in case of error (invalid param, out-of-memory). int WebPPictureAllocYUVA(WebPPicture* const picture); // Replace samples that are fully transparent by 'color' to help compressibility // (no guarantee, though). Assumes pic->use_argb is true. void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_ENC_VP8I_ENC_H_ libwebp-1.4.0/src/enc/analysis_enc.c0000644000014400001440000003777114606317060014242 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Macroblock analysis // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include "src/enc/vp8i_enc.h" #include "src/enc/cost_enc.h" #include "src/utils/utils.h" #define MAX_ITERS_K_MEANS 6 //------------------------------------------------------------------------------ // Smooth the segment map by replacing isolated block by the majority of its // neighbours. static void SmoothSegmentMap(VP8Encoder* const enc) { int n, x, y; const int w = enc->mb_w_; const int h = enc->mb_h_; const int majority_cnt_3_x_3_grid = 5; uint8_t* const tmp = (uint8_t*)WebPSafeMalloc(w * h, sizeof(*tmp)); assert((uint64_t)(w * h) == (uint64_t)w * h); // no overflow, as per spec if (tmp == NULL) return; for (y = 1; y < h - 1; ++y) { for (x = 1; x < w - 1; ++x) { int cnt[NUM_MB_SEGMENTS] = { 0 }; const VP8MBInfo* const mb = &enc->mb_info_[x + w * y]; int majority_seg = mb->segment_; // Check the 8 neighbouring segment values. cnt[mb[-w - 1].segment_]++; // top-left cnt[mb[-w + 0].segment_]++; // top cnt[mb[-w + 1].segment_]++; // top-right cnt[mb[ - 1].segment_]++; // left cnt[mb[ + 1].segment_]++; // right cnt[mb[ w - 1].segment_]++; // bottom-left cnt[mb[ w + 0].segment_]++; // bottom cnt[mb[ w + 1].segment_]++; // bottom-right for (n = 0; n < NUM_MB_SEGMENTS; ++n) { if (cnt[n] >= majority_cnt_3_x_3_grid) { majority_seg = n; break; } } tmp[x + y * w] = majority_seg; } } for (y = 1; y < h - 1; ++y) { for (x = 1; x < w - 1; ++x) { VP8MBInfo* const mb = &enc->mb_info_[x + w * y]; mb->segment_ = tmp[x + y * w]; } } WebPSafeFree(tmp); } //------------------------------------------------------------------------------ // set segment susceptibility alpha_ / beta_ static WEBP_INLINE int clip(int v, int m, int M) { return (v < m) ? m : (v > M) ? M : v; } static void SetSegmentAlphas(VP8Encoder* const enc, const int centers[NUM_MB_SEGMENTS], int mid) { const int nb = enc->segment_hdr_.num_segments_; int min = centers[0], max = centers[0]; int n; if (nb > 1) { for (n = 0; n < nb; ++n) { if (min > centers[n]) min = centers[n]; if (max < centers[n]) max = centers[n]; } } if (max == min) max = min + 1; assert(mid <= max && mid >= min); for (n = 0; n < nb; ++n) { const int alpha = 255 * (centers[n] - mid) / (max - min); const int beta = 255 * (centers[n] - min) / (max - min); enc->dqm_[n].alpha_ = clip(alpha, -127, 127); enc->dqm_[n].beta_ = clip(beta, 0, 255); } } //------------------------------------------------------------------------------ // Compute susceptibility based on DCT-coeff histograms: // the higher, the "easier" the macroblock is to compress. #define MAX_ALPHA 255 // 8b of precision for susceptibilities. #define ALPHA_SCALE (2 * MAX_ALPHA) // scaling factor for alpha. #define DEFAULT_ALPHA (-1) #define IS_BETTER_ALPHA(alpha, best_alpha) ((alpha) > (best_alpha)) static int FinalAlphaValue(int alpha) { alpha = MAX_ALPHA - alpha; return clip(alpha, 0, MAX_ALPHA); } static int GetAlpha(const VP8Histogram* const histo) { // 'alpha' will later be clipped to [0..MAX_ALPHA] range, clamping outer // values which happen to be mostly noise. This leaves the maximum precision // for handling the useful small values which contribute most. const int max_value = histo->max_value; const int last_non_zero = histo->last_non_zero; const int alpha = (max_value > 1) ? ALPHA_SCALE * last_non_zero / max_value : 0; return alpha; } static void InitHistogram(VP8Histogram* const histo) { histo->max_value = 0; histo->last_non_zero = 1; } //------------------------------------------------------------------------------ // Simplified k-Means, to assign Nb segments based on alpha-histogram static void AssignSegments(VP8Encoder* const enc, const int alphas[MAX_ALPHA + 1]) { // 'num_segments_' is previously validated and <= NUM_MB_SEGMENTS, but an // explicit check is needed to avoid spurious warning about 'n + 1' exceeding // array bounds of 'centers' with some compilers (noticed with gcc-4.9). const int nb = (enc->segment_hdr_.num_segments_ < NUM_MB_SEGMENTS) ? enc->segment_hdr_.num_segments_ : NUM_MB_SEGMENTS; int centers[NUM_MB_SEGMENTS]; int weighted_average = 0; int map[MAX_ALPHA + 1]; int a, n, k; int min_a = 0, max_a = MAX_ALPHA, range_a; // 'int' type is ok for histo, and won't overflow int accum[NUM_MB_SEGMENTS], dist_accum[NUM_MB_SEGMENTS]; assert(nb >= 1); assert(nb <= NUM_MB_SEGMENTS); // bracket the input for (n = 0; n <= MAX_ALPHA && alphas[n] == 0; ++n) {} min_a = n; for (n = MAX_ALPHA; n > min_a && alphas[n] == 0; --n) {} max_a = n; range_a = max_a - min_a; // Spread initial centers evenly for (k = 0, n = 1; k < nb; ++k, n += 2) { assert(n < 2 * nb); centers[k] = min_a + (n * range_a) / (2 * nb); } for (k = 0; k < MAX_ITERS_K_MEANS; ++k) { // few iters are enough int total_weight; int displaced; // Reset stats for (n = 0; n < nb; ++n) { accum[n] = 0; dist_accum[n] = 0; } // Assign nearest center for each 'a' n = 0; // track the nearest center for current 'a' for (a = min_a; a <= max_a; ++a) { if (alphas[a]) { while (n + 1 < nb && abs(a - centers[n + 1]) < abs(a - centers[n])) { n++; } map[a] = n; // accumulate contribution into best centroid dist_accum[n] += a * alphas[a]; accum[n] += alphas[a]; } } // All point are classified. Move the centroids to the // center of their respective cloud. displaced = 0; weighted_average = 0; total_weight = 0; for (n = 0; n < nb; ++n) { if (accum[n]) { const int new_center = (dist_accum[n] + accum[n] / 2) / accum[n]; displaced += abs(centers[n] - new_center); centers[n] = new_center; weighted_average += new_center * accum[n]; total_weight += accum[n]; } } weighted_average = (weighted_average + total_weight / 2) / total_weight; if (displaced < 5) break; // no need to keep on looping... } // Map each original value to the closest centroid for (n = 0; n < enc->mb_w_ * enc->mb_h_; ++n) { VP8MBInfo* const mb = &enc->mb_info_[n]; const int alpha = mb->alpha_; mb->segment_ = map[alpha]; mb->alpha_ = centers[map[alpha]]; // for the record. } if (nb > 1) { const int smooth = (enc->config_->preprocessing & 1); if (smooth) SmoothSegmentMap(enc); } SetSegmentAlphas(enc, centers, weighted_average); // pick some alphas. } //------------------------------------------------------------------------------ // Macroblock analysis: collect histogram for each mode, deduce the maximal // susceptibility and set best modes for this macroblock. // Segment assignment is done later. // Number of modes to inspect for alpha_ evaluation. We don't need to test all // the possible modes during the analysis phase: we risk falling into a local // optimum, or be subject to boundary effect #define MAX_INTRA16_MODE 2 #define MAX_INTRA4_MODE 2 #define MAX_UV_MODE 2 static int MBAnalyzeBestIntra16Mode(VP8EncIterator* const it) { const int max_mode = MAX_INTRA16_MODE; int mode; int best_alpha = DEFAULT_ALPHA; int best_mode = 0; VP8MakeLuma16Preds(it); for (mode = 0; mode < max_mode; ++mode) { VP8Histogram histo; int alpha; InitHistogram(&histo); VP8CollectHistogram(it->yuv_in_ + Y_OFF_ENC, it->yuv_p_ + VP8I16ModeOffsets[mode], 0, 16, &histo); alpha = GetAlpha(&histo); if (IS_BETTER_ALPHA(alpha, best_alpha)) { best_alpha = alpha; best_mode = mode; } } VP8SetIntra16Mode(it, best_mode); return best_alpha; } static int FastMBAnalyze(VP8EncIterator* const it) { // Empirical cut-off value, should be around 16 (~=block size). We use the // [8-17] range and favor intra4 at high quality, intra16 for low quality. const int q = (int)it->enc_->config_->quality; const uint32_t kThreshold = 8 + (17 - 8) * q / 100; int k; uint32_t dc[16], m, m2; for (k = 0; k < 16; k += 4) { VP8Mean16x4(it->yuv_in_ + Y_OFF_ENC + k * BPS, &dc[k]); } for (m = 0, m2 = 0, k = 0; k < 16; ++k) { m += dc[k]; m2 += dc[k] * dc[k]; } if (kThreshold * m2 < m * m) { VP8SetIntra16Mode(it, 0); // DC16 } else { const uint8_t modes[16] = { 0 }; // DC4 VP8SetIntra4Mode(it, modes); } return 0; } static int MBAnalyzeBestUVMode(VP8EncIterator* const it) { int best_alpha = DEFAULT_ALPHA; int smallest_alpha = 0; int best_mode = 0; const int max_mode = MAX_UV_MODE; int mode; VP8MakeChroma8Preds(it); for (mode = 0; mode < max_mode; ++mode) { VP8Histogram histo; int alpha; InitHistogram(&histo); VP8CollectHistogram(it->yuv_in_ + U_OFF_ENC, it->yuv_p_ + VP8UVModeOffsets[mode], 16, 16 + 4 + 4, &histo); alpha = GetAlpha(&histo); if (IS_BETTER_ALPHA(alpha, best_alpha)) { best_alpha = alpha; } // The best prediction mode tends to be the one with the smallest alpha. if (mode == 0 || alpha < smallest_alpha) { smallest_alpha = alpha; best_mode = mode; } } VP8SetIntraUVMode(it, best_mode); return best_alpha; } static void MBAnalyze(VP8EncIterator* const it, int alphas[MAX_ALPHA + 1], int* const alpha, int* const uv_alpha) { const VP8Encoder* const enc = it->enc_; int best_alpha, best_uv_alpha; VP8SetIntra16Mode(it, 0); // default: Intra16, DC_PRED VP8SetSkip(it, 0); // not skipped VP8SetSegment(it, 0); // default segment, spec-wise. if (enc->method_ <= 1) { best_alpha = FastMBAnalyze(it); } else { best_alpha = MBAnalyzeBestIntra16Mode(it); } best_uv_alpha = MBAnalyzeBestUVMode(it); // Final susceptibility mix best_alpha = (3 * best_alpha + best_uv_alpha + 2) >> 2; best_alpha = FinalAlphaValue(best_alpha); alphas[best_alpha]++; it->mb_->alpha_ = best_alpha; // for later remapping. // Accumulate for later complexity analysis. *alpha += best_alpha; // mixed susceptibility (not just luma) *uv_alpha += best_uv_alpha; } static void DefaultMBInfo(VP8MBInfo* const mb) { mb->type_ = 1; // I16x16 mb->uv_mode_ = 0; mb->skip_ = 0; // not skipped mb->segment_ = 0; // default segment mb->alpha_ = 0; } //------------------------------------------------------------------------------ // Main analysis loop: // Collect all susceptibilities for each macroblock and record their // distribution in alphas[]. Segments is assigned a-posteriori, based on // this histogram. // We also pick an intra16 prediction mode, which shouldn't be considered // final except for fast-encode settings. We can also pick some intra4 modes // and decide intra4/intra16, but that's usually almost always a bad choice at // this stage. static void ResetAllMBInfo(VP8Encoder* const enc) { int n; for (n = 0; n < enc->mb_w_ * enc->mb_h_; ++n) { DefaultMBInfo(&enc->mb_info_[n]); } // Default susceptibilities. enc->dqm_[0].alpha_ = 0; enc->dqm_[0].beta_ = 0; // Note: we can't compute this alpha_ / uv_alpha_ -> set to default value. enc->alpha_ = 0; enc->uv_alpha_ = 0; WebPReportProgress(enc->pic_, enc->percent_ + 20, &enc->percent_); } // struct used to collect job result typedef struct { WebPWorker worker; int alphas[MAX_ALPHA + 1]; int alpha, uv_alpha; VP8EncIterator it; int delta_progress; } SegmentJob; // main work call static int DoSegmentsJob(void* arg1, void* arg2) { SegmentJob* const job = (SegmentJob*)arg1; VP8EncIterator* const it = (VP8EncIterator*)arg2; int ok = 1; if (!VP8IteratorIsDone(it)) { uint8_t tmp[32 + WEBP_ALIGN_CST]; uint8_t* const scratch = (uint8_t*)WEBP_ALIGN(tmp); do { // Let's pretend we have perfect lossless reconstruction. VP8IteratorImport(it, scratch); MBAnalyze(it, job->alphas, &job->alpha, &job->uv_alpha); ok = VP8IteratorProgress(it, job->delta_progress); } while (ok && VP8IteratorNext(it)); } return ok; } #ifdef WEBP_USE_THREAD static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) { int i; for (i = 0; i <= MAX_ALPHA; ++i) dst->alphas[i] += src->alphas[i]; dst->alpha += src->alpha; dst->uv_alpha += src->uv_alpha; } #endif // initialize the job struct with some tasks to perform static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job, int start_row, int end_row) { WebPGetWorkerInterface()->Init(&job->worker); job->worker.data1 = job; job->worker.data2 = &job->it; job->worker.hook = DoSegmentsJob; VP8IteratorInit(enc, &job->it); VP8IteratorSetRow(&job->it, start_row); VP8IteratorSetCountDown(&job->it, (end_row - start_row) * enc->mb_w_); memset(job->alphas, 0, sizeof(job->alphas)); job->alpha = 0; job->uv_alpha = 0; // only one of both jobs can record the progress, since we don't // expect the user's hook to be multi-thread safe job->delta_progress = (start_row == 0) ? 20 : 0; } // main entry point int VP8EncAnalyze(VP8Encoder* const enc) { int ok = 1; const int do_segments = enc->config_->emulate_jpeg_size || // We need the complexity evaluation. (enc->segment_hdr_.num_segments_ > 1) || (enc->method_ <= 1); // for method 0 - 1, we need preds_[] to be filled. if (do_segments) { const int last_row = enc->mb_h_; const int total_mb = last_row * enc->mb_w_; #ifdef WEBP_USE_THREAD // We give a little more than a half work to the main thread. const int split_row = (9 * last_row + 15) >> 4; const int kMinSplitRow = 2; // minimal rows needed for mt to be worth it const int do_mt = (enc->thread_level_ > 0) && (split_row >= kMinSplitRow); #else const int do_mt = 0; #endif const WebPWorkerInterface* const worker_interface = WebPGetWorkerInterface(); SegmentJob main_job; if (do_mt) { #ifdef WEBP_USE_THREAD SegmentJob side_job; // Note the use of '&' instead of '&&' because we must call the functions // no matter what. InitSegmentJob(enc, &main_job, 0, split_row); InitSegmentJob(enc, &side_job, split_row, last_row); // we don't need to call Reset() on main_job.worker, since we're calling // WebPWorkerExecute() on it ok &= worker_interface->Reset(&side_job.worker); // launch the two jobs in parallel if (ok) { worker_interface->Launch(&side_job.worker); worker_interface->Execute(&main_job.worker); ok &= worker_interface->Sync(&side_job.worker); ok &= worker_interface->Sync(&main_job.worker); } worker_interface->End(&side_job.worker); if (ok) MergeJobs(&side_job, &main_job); // merge results together #endif // WEBP_USE_THREAD } else { // Even for single-thread case, we use the generic Worker tools. InitSegmentJob(enc, &main_job, 0, last_row); worker_interface->Execute(&main_job.worker); ok &= worker_interface->Sync(&main_job.worker); } worker_interface->End(&main_job.worker); if (ok) { enc->alpha_ = main_job.alpha / total_mb; enc->uv_alpha_ = main_job.uv_alpha / total_mb; AssignSegments(enc, main_job.alphas); } } else { // Use only one default segment. ResetAllMBInfo(enc); } if (!ok) { return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise } return ok; } libwebp-1.4.0/src/enc/histogram_enc.h0000644000014400001440000001217214606317060014405 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // // Models the histograms of literal and distance codes. #ifndef WEBP_ENC_HISTOGRAM_ENC_H_ #define WEBP_ENC_HISTOGRAM_ENC_H_ #include #include "src/enc/backward_references_enc.h" #include "src/webp/format_constants.h" #include "src/webp/types.h" #ifdef __cplusplus extern "C" { #endif // Not a trivial literal symbol. #define VP8L_NON_TRIVIAL_SYM (0xffffffff) // A simple container for histograms of data. typedef struct { // literal_ contains green literal, palette-code and // copy-length-prefix histogram uint32_t* literal_; // Pointer to the allocated buffer for literal. uint32_t red_[NUM_LITERAL_CODES]; uint32_t blue_[NUM_LITERAL_CODES]; uint32_t alpha_[NUM_LITERAL_CODES]; // Backward reference prefix-code histogram. uint32_t distance_[NUM_DISTANCE_CODES]; int palette_code_bits_; uint32_t trivial_symbol_; // True, if histograms for Red, Blue & Alpha // literal symbols are single valued. float bit_cost_; // cached value of bit cost. float literal_cost_; // Cached values of dominant entropy costs: float red_cost_; // literal, red & blue. float blue_cost_; uint8_t is_used_[5]; // 5 for literal, red, blue, alpha, distance } VP8LHistogram; // Collection of histograms with fixed capacity, allocated as one // big memory chunk. Can be destroyed by calling WebPSafeFree(). typedef struct { int size; // number of slots currently in use int max_size; // maximum capacity VP8LHistogram** histograms; } VP8LHistogramSet; // Create the histogram. // // The input data is the PixOrCopy data, which models the literals, stop // codes and backward references (both distances and lengths). Also: if // palette_code_bits is >= 0, initialize the histogram with this value. void VP8LHistogramCreate(VP8LHistogram* const p, const VP8LBackwardRefs* const refs, int palette_code_bits); // Return the size of the histogram for a given cache_bits. int VP8LGetHistogramSize(int cache_bits); // Set the palette_code_bits and reset the stats. // If init_arrays is true, the arrays are also filled with 0's. void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits, int init_arrays); // Collect all the references into a histogram (without reset) void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs, VP8LHistogram* const histo); // Free the memory allocated for the histogram. void VP8LFreeHistogram(VP8LHistogram* const histo); // Free the memory allocated for the histogram set. void VP8LFreeHistogramSet(VP8LHistogramSet* const histo); // Allocate an array of pointer to histograms, allocated and initialized // using 'cache_bits'. Return NULL in case of memory error. VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits); // Set the histograms in set to 0. void VP8LHistogramSetClear(VP8LHistogramSet* const set); // Allocate and initialize histogram object with specified 'cache_bits'. // Returns NULL in case of memory error. // Special case of VP8LAllocateHistogramSet, with size equals 1. VP8LHistogram* VP8LAllocateHistogram(int cache_bits); // Accumulate a token 'v' into a histogram. void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo, const PixOrCopy* const v, int (*const distance_modifier)(int, int), int distance_modifier_arg0); static WEBP_INLINE int VP8LHistogramNumCodes(int palette_code_bits) { return NUM_LITERAL_CODES + NUM_LENGTH_CODES + ((palette_code_bits > 0) ? (1 << palette_code_bits) : 0); } // Builds the histogram image. pic and percent are for progress. // Returns false in case of error (stored in pic->error_code). int VP8LGetHistoImageSymbols(int xsize, int ysize, const VP8LBackwardRefs* const refs, int quality, int low_effort, int histogram_bits, int cache_bits, VP8LHistogramSet* const image_histo, VP8LHistogram* const tmp_histo, uint16_t* const histogram_symbols, const WebPPicture* const pic, int percent_range, int* const percent); // Returns the entropy for the symbols in the input array. float VP8LBitsEntropy(const uint32_t* const array, int n); // Estimate how many bits the combined entropy of literals and distance // approximately maps to. float VP8LHistogramEstimateBits(VP8LHistogram* const p); #ifdef __cplusplus } #endif #endif // WEBP_ENC_HISTOGRAM_ENC_H_ libwebp-1.4.0/src/enc/picture_enc.c0000644000014400001440000002215614606317060014061 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebPPicture class basis // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" //------------------------------------------------------------------------------ // WebPPicture //------------------------------------------------------------------------------ static int DummyWriter(const uint8_t* data, size_t data_size, const WebPPicture* const picture) { // The following are to prevent 'unused variable' error message. (void)data; (void)data_size; (void)picture; return 1; } int WebPPictureInitInternal(WebPPicture* picture, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_ENCODER_ABI_VERSION)) { return 0; // caller/system version mismatch! } if (picture != NULL) { memset(picture, 0, sizeof(*picture)); picture->writer = DummyWriter; WebPEncodingSetError(picture, VP8_ENC_OK); } return 1; } //------------------------------------------------------------------------------ int WebPValidatePicture(const WebPPicture* const picture) { if (picture == NULL) return 0; if (picture->width <= 0 || picture->height <= 0) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } if (picture->width <= 0 || picture->width / 4 > INT_MAX / 4 || picture->height <= 0 || picture->height / 4 > INT_MAX / 4) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } if (picture->colorspace != WEBP_YUV420 && picture->colorspace != WEBP_YUV420A) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION); } return 1; } static void WebPPictureResetBufferARGB(WebPPicture* const picture) { picture->memory_argb_ = NULL; picture->argb = NULL; picture->argb_stride = 0; } static void WebPPictureResetBufferYUVA(WebPPicture* const picture) { picture->memory_ = NULL; picture->y = picture->u = picture->v = picture->a = NULL; picture->y_stride = picture->uv_stride = 0; picture->a_stride = 0; } void WebPPictureResetBuffers(WebPPicture* const picture) { WebPPictureResetBufferARGB(picture); WebPPictureResetBufferYUVA(picture); } int WebPPictureAllocARGB(WebPPicture* const picture) { void* memory; const int width = picture->width; const int height = picture->height; const uint64_t argb_size = (uint64_t)width * height; if (!WebPValidatePicture(picture)) return 0; WebPSafeFree(picture->memory_argb_); WebPPictureResetBufferARGB(picture); // allocate a new buffer. memory = WebPSafeMalloc(argb_size + WEBP_ALIGN_CST, sizeof(*picture->argb)); if (memory == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } picture->memory_argb_ = memory; picture->argb = (uint32_t*)WEBP_ALIGN(memory); picture->argb_stride = width; return 1; } int WebPPictureAllocYUVA(WebPPicture* const picture) { const int has_alpha = (int)picture->colorspace & WEBP_CSP_ALPHA_BIT; const int width = picture->width; const int height = picture->height; const int y_stride = width; const int uv_width = (int)(((int64_t)width + 1) >> 1); const int uv_height = (int)(((int64_t)height + 1) >> 1); const int uv_stride = uv_width; int a_width, a_stride; uint64_t y_size, uv_size, a_size, total_size; uint8_t* mem; if (!WebPValidatePicture(picture)) return 0; WebPSafeFree(picture->memory_); WebPPictureResetBufferYUVA(picture); // alpha a_width = has_alpha ? width : 0; a_stride = a_width; y_size = (uint64_t)y_stride * height; uv_size = (uint64_t)uv_stride * uv_height; a_size = (uint64_t)a_stride * height; total_size = y_size + a_size + 2 * uv_size; // Security and validation checks if (width <= 0 || height <= 0 || // luma/alpha param error uv_width <= 0 || uv_height <= 0) { // u/v param error return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } // allocate a new buffer. mem = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*mem)); if (mem == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } // From now on, we're in the clear, we can no longer fail... picture->memory_ = (void*)mem; picture->y_stride = y_stride; picture->uv_stride = uv_stride; picture->a_stride = a_stride; // TODO(skal): we could align the y/u/v planes and adjust stride. picture->y = mem; mem += y_size; picture->u = mem; mem += uv_size; picture->v = mem; mem += uv_size; if (a_size > 0) { picture->a = mem; mem += a_size; } (void)mem; // makes the static analyzer happy return 1; } int WebPPictureAlloc(WebPPicture* picture) { if (picture != NULL) { WebPPictureFree(picture); // erase previous buffer if (!picture->use_argb) { return WebPPictureAllocYUVA(picture); } else { return WebPPictureAllocARGB(picture); } } return 1; } void WebPPictureFree(WebPPicture* picture) { if (picture != NULL) { WebPSafeFree(picture->memory_); WebPSafeFree(picture->memory_argb_); WebPPictureResetBuffers(picture); } } //------------------------------------------------------------------------------ // WebPMemoryWriter: Write-to-memory void WebPMemoryWriterInit(WebPMemoryWriter* writer) { writer->mem = NULL; writer->size = 0; writer->max_size = 0; } int WebPMemoryWrite(const uint8_t* data, size_t data_size, const WebPPicture* picture) { WebPMemoryWriter* const w = (WebPMemoryWriter*)picture->custom_ptr; uint64_t next_size; if (w == NULL) { return 1; } next_size = (uint64_t)w->size + data_size; if (next_size > w->max_size) { uint8_t* new_mem; uint64_t next_max_size = 2ULL * w->max_size; if (next_max_size < next_size) next_max_size = next_size; if (next_max_size < 8192ULL) next_max_size = 8192ULL; new_mem = (uint8_t*)WebPSafeMalloc(next_max_size, 1); if (new_mem == NULL) { return 0; } if (w->size > 0) { memcpy(new_mem, w->mem, w->size); } WebPSafeFree(w->mem); w->mem = new_mem; // down-cast is ok, thanks to WebPSafeMalloc w->max_size = (size_t)next_max_size; } if (data_size > 0) { memcpy(w->mem + w->size, data, data_size); w->size += data_size; } return 1; } void WebPMemoryWriterClear(WebPMemoryWriter* writer) { if (writer != NULL) { WebPSafeFree(writer->mem); writer->mem = NULL; writer->size = 0; writer->max_size = 0; } } //------------------------------------------------------------------------------ // Simplest high-level calls: typedef int (*Importer)(WebPPicture* const, const uint8_t* const, int); static size_t Encode(const uint8_t* rgba, int width, int height, int stride, Importer import, float quality_factor, int lossless, uint8_t** output) { WebPPicture pic; WebPConfig config; WebPMemoryWriter wrt; int ok; if (output == NULL) return 0; if (!WebPConfigPreset(&config, WEBP_PRESET_DEFAULT, quality_factor) || !WebPPictureInit(&pic)) { return 0; // shouldn't happen, except if system installation is broken } config.lossless = !!lossless; pic.use_argb = !!lossless; pic.width = width; pic.height = height; pic.writer = WebPMemoryWrite; pic.custom_ptr = &wrt; WebPMemoryWriterInit(&wrt); ok = import(&pic, rgba, stride) && WebPEncode(&config, &pic); WebPPictureFree(&pic); if (!ok) { WebPMemoryWriterClear(&wrt); *output = NULL; return 0; } *output = wrt.mem; return wrt.size; } #define ENCODE_FUNC(NAME, IMPORTER) \ size_t NAME(const uint8_t* in, int w, int h, int bps, float q, \ uint8_t** out) { \ return Encode(in, w, h, bps, IMPORTER, q, 0, out); \ } ENCODE_FUNC(WebPEncodeRGB, WebPPictureImportRGB) ENCODE_FUNC(WebPEncodeRGBA, WebPPictureImportRGBA) #if !defined(WEBP_REDUCE_CSP) ENCODE_FUNC(WebPEncodeBGR, WebPPictureImportBGR) ENCODE_FUNC(WebPEncodeBGRA, WebPPictureImportBGRA) #endif // WEBP_REDUCE_CSP #undef ENCODE_FUNC #define LOSSLESS_DEFAULT_QUALITY 70. #define LOSSLESS_ENCODE_FUNC(NAME, IMPORTER) \ size_t NAME(const uint8_t* in, int w, int h, int bps, uint8_t** out) { \ return Encode(in, w, h, bps, IMPORTER, LOSSLESS_DEFAULT_QUALITY, 1, out); \ } LOSSLESS_ENCODE_FUNC(WebPEncodeLosslessRGB, WebPPictureImportRGB) LOSSLESS_ENCODE_FUNC(WebPEncodeLosslessRGBA, WebPPictureImportRGBA) #if !defined(WEBP_REDUCE_CSP) LOSSLESS_ENCODE_FUNC(WebPEncodeLosslessBGR, WebPPictureImportBGR) LOSSLESS_ENCODE_FUNC(WebPEncodeLosslessBGRA, WebPPictureImportBGRA) #endif // WEBP_REDUCE_CSP #undef LOSSLESS_ENCODE_FUNC //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/backward_references_cost_enc.c0000644000014400001440000007157714606317060017430 0ustar // Copyright 2017 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Improves a given set of backward references by analyzing its bit cost. // The algorithm is similar to the Zopfli compression algorithm but tailored to // images. // // Author: Vincent Rabaud (vrabaud@google.com) // #include #include #include "src/dsp/lossless_common.h" #include "src/enc/backward_references_enc.h" #include "src/enc/histogram_enc.h" #include "src/utils/color_cache_utils.h" #include "src/utils/utils.h" #define VALUES_IN_BYTE 256 extern void VP8LClearBackwardRefs(VP8LBackwardRefs* const refs); extern int VP8LDistanceToPlaneCode(int xsize, int dist); extern void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs, const PixOrCopy v); typedef struct { float alpha_[VALUES_IN_BYTE]; float red_[VALUES_IN_BYTE]; float blue_[VALUES_IN_BYTE]; float distance_[NUM_DISTANCE_CODES]; float* literal_; } CostModel; static void ConvertPopulationCountTableToBitEstimates( int num_symbols, const uint32_t population_counts[], float output[]) { uint32_t sum = 0; int nonzeros = 0; int i; for (i = 0; i < num_symbols; ++i) { sum += population_counts[i]; if (population_counts[i] > 0) { ++nonzeros; } } if (nonzeros <= 1) { memset(output, 0, num_symbols * sizeof(*output)); } else { const float logsum = VP8LFastLog2(sum); for (i = 0; i < num_symbols; ++i) { output[i] = logsum - VP8LFastLog2(population_counts[i]); } } } static int CostModelBuild(CostModel* const m, int xsize, int cache_bits, const VP8LBackwardRefs* const refs) { int ok = 0; VP8LRefsCursor c = VP8LRefsCursorInit(refs); VP8LHistogram* const histo = VP8LAllocateHistogram(cache_bits); if (histo == NULL) goto Error; // The following code is similar to VP8LHistogramCreate but converts the // distance to plane code. VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 1); while (VP8LRefsCursorOk(&c)) { VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, VP8LDistanceToPlaneCode, xsize); VP8LRefsCursorNext(&c); } ConvertPopulationCountTableToBitEstimates( VP8LHistogramNumCodes(histo->palette_code_bits_), histo->literal_, m->literal_); ConvertPopulationCountTableToBitEstimates( VALUES_IN_BYTE, histo->red_, m->red_); ConvertPopulationCountTableToBitEstimates( VALUES_IN_BYTE, histo->blue_, m->blue_); ConvertPopulationCountTableToBitEstimates( VALUES_IN_BYTE, histo->alpha_, m->alpha_); ConvertPopulationCountTableToBitEstimates( NUM_DISTANCE_CODES, histo->distance_, m->distance_); ok = 1; Error: VP8LFreeHistogram(histo); return ok; } static WEBP_INLINE float GetLiteralCost(const CostModel* const m, uint32_t v) { return m->alpha_[v >> 24] + m->red_[(v >> 16) & 0xff] + m->literal_[(v >> 8) & 0xff] + m->blue_[v & 0xff]; } static WEBP_INLINE float GetCacheCost(const CostModel* const m, uint32_t idx) { const int literal_idx = VALUES_IN_BYTE + NUM_LENGTH_CODES + idx; return m->literal_[literal_idx]; } static WEBP_INLINE float GetLengthCost(const CostModel* const m, uint32_t length) { int code, extra_bits; VP8LPrefixEncodeBits(length, &code, &extra_bits); return m->literal_[VALUES_IN_BYTE + code] + extra_bits; } static WEBP_INLINE float GetDistanceCost(const CostModel* const m, uint32_t distance) { int code, extra_bits; VP8LPrefixEncodeBits(distance, &code, &extra_bits); return m->distance_[code] + extra_bits; } static WEBP_INLINE void AddSingleLiteralWithCostModel( const uint32_t* const argb, VP8LColorCache* const hashers, const CostModel* const cost_model, int idx, int use_color_cache, float prev_cost, float* const cost, uint16_t* const dist_array) { float cost_val = prev_cost; const uint32_t color = argb[idx]; const int ix = use_color_cache ? VP8LColorCacheContains(hashers, color) : -1; if (ix >= 0) { // use_color_cache is true and hashers contains color const float mul0 = 0.68f; cost_val += GetCacheCost(cost_model, ix) * mul0; } else { const float mul1 = 0.82f; if (use_color_cache) VP8LColorCacheInsert(hashers, color); cost_val += GetLiteralCost(cost_model, color) * mul1; } if (cost[idx] > cost_val) { cost[idx] = cost_val; dist_array[idx] = 1; // only one is inserted. } } // ----------------------------------------------------------------------------- // CostManager and interval handling // Empirical value to avoid high memory consumption but good for performance. #define COST_CACHE_INTERVAL_SIZE_MAX 500 // To perform backward reference every pixel at index index_ is considered and // the cost for the MAX_LENGTH following pixels computed. Those following pixels // at index index_ + k (k from 0 to MAX_LENGTH) have a cost of: // cost_ = distance cost at index + GetLengthCost(cost_model, k) // and the minimum value is kept. GetLengthCost(cost_model, k) is cached in an // array of size MAX_LENGTH. // Instead of performing MAX_LENGTH comparisons per pixel, we keep track of the // minimal values using intervals of constant cost. // An interval is defined by the index_ of the pixel that generated it and // is only useful in a range of indices from start_ to end_ (exclusive), i.e. // it contains the minimum value for pixels between start_ and end_. // Intervals are stored in a linked list and ordered by start_. When a new // interval has a better value, old intervals are split or removed. There are // therefore no overlapping intervals. typedef struct CostInterval CostInterval; struct CostInterval { float cost_; int start_; int end_; int index_; CostInterval* previous_; CostInterval* next_; }; // The GetLengthCost(cost_model, k) are cached in a CostCacheInterval. typedef struct { float cost_; int start_; int end_; // Exclusive. } CostCacheInterval; // This structure is in charge of managing intervals and costs. // It caches the different CostCacheInterval, caches the different // GetLengthCost(cost_model, k) in cost_cache_ and the CostInterval's (whose // count_ is limited by COST_CACHE_INTERVAL_SIZE_MAX). #define COST_MANAGER_MAX_FREE_LIST 10 typedef struct { CostInterval* head_; int count_; // The number of stored intervals. CostCacheInterval* cache_intervals_; size_t cache_intervals_size_; float cost_cache_[MAX_LENGTH]; // Contains the GetLengthCost(cost_model, k). float* costs_; uint16_t* dist_array_; // Most of the time, we only need few intervals -> use a free-list, to avoid // fragmentation with small allocs in most common cases. CostInterval intervals_[COST_MANAGER_MAX_FREE_LIST]; CostInterval* free_intervals_; // These are regularly malloc'd remains. This list can't grow larger than than // size COST_CACHE_INTERVAL_SIZE_MAX - COST_MANAGER_MAX_FREE_LIST, note. CostInterval* recycled_intervals_; } CostManager; static void CostIntervalAddToFreeList(CostManager* const manager, CostInterval* const interval) { interval->next_ = manager->free_intervals_; manager->free_intervals_ = interval; } static int CostIntervalIsInFreeList(const CostManager* const manager, const CostInterval* const interval) { return (interval >= &manager->intervals_[0] && interval <= &manager->intervals_[COST_MANAGER_MAX_FREE_LIST - 1]); } static void CostManagerInitFreeList(CostManager* const manager) { int i; manager->free_intervals_ = NULL; for (i = 0; i < COST_MANAGER_MAX_FREE_LIST; ++i) { CostIntervalAddToFreeList(manager, &manager->intervals_[i]); } } static void DeleteIntervalList(CostManager* const manager, const CostInterval* interval) { while (interval != NULL) { const CostInterval* const next = interval->next_; if (!CostIntervalIsInFreeList(manager, interval)) { WebPSafeFree((void*)interval); } // else: do nothing interval = next; } } static void CostManagerClear(CostManager* const manager) { if (manager == NULL) return; WebPSafeFree(manager->costs_); WebPSafeFree(manager->cache_intervals_); // Clear the interval lists. DeleteIntervalList(manager, manager->head_); manager->head_ = NULL; DeleteIntervalList(manager, manager->recycled_intervals_); manager->recycled_intervals_ = NULL; // Reset pointers, count_ and cache_intervals_size_. memset(manager, 0, sizeof(*manager)); CostManagerInitFreeList(manager); } static int CostManagerInit(CostManager* const manager, uint16_t* const dist_array, int pix_count, const CostModel* const cost_model) { int i; const int cost_cache_size = (pix_count > MAX_LENGTH) ? MAX_LENGTH : pix_count; manager->costs_ = NULL; manager->cache_intervals_ = NULL; manager->head_ = NULL; manager->recycled_intervals_ = NULL; manager->count_ = 0; manager->dist_array_ = dist_array; CostManagerInitFreeList(manager); // Fill in the cost_cache_. // Has to be done in two passes due to a GCC bug on i686 // related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=323 for (i = 0; i < cost_cache_size; ++i) { manager->cost_cache_[i] = GetLengthCost(cost_model, i); } manager->cache_intervals_size_ = 1; for (i = 1; i < cost_cache_size; ++i) { // Get the number of bound intervals. if (manager->cost_cache_[i] != manager->cost_cache_[i - 1]) { ++manager->cache_intervals_size_; } } // With the current cost model, we usually have below 20 intervals. // The worst case scenario with a cost model would be if every length has a // different cost, hence MAX_LENGTH but that is impossible with the current // implementation that spirals around a pixel. assert(manager->cache_intervals_size_ <= MAX_LENGTH); manager->cache_intervals_ = (CostCacheInterval*)WebPSafeMalloc( manager->cache_intervals_size_, sizeof(*manager->cache_intervals_)); if (manager->cache_intervals_ == NULL) { CostManagerClear(manager); return 0; } // Fill in the cache_intervals_. { CostCacheInterval* cur = manager->cache_intervals_; // Consecutive values in cost_cache_ are compared and if a big enough // difference is found, a new interval is created and bounded. cur->start_ = 0; cur->end_ = 1; cur->cost_ = manager->cost_cache_[0]; for (i = 1; i < cost_cache_size; ++i) { const float cost_val = manager->cost_cache_[i]; if (cost_val != cur->cost_) { ++cur; // Initialize an interval. cur->start_ = i; cur->cost_ = cost_val; } cur->end_ = i + 1; } assert((size_t)(cur - manager->cache_intervals_) + 1 == manager->cache_intervals_size_); } manager->costs_ = (float*)WebPSafeMalloc(pix_count, sizeof(*manager->costs_)); if (manager->costs_ == NULL) { CostManagerClear(manager); return 0; } // Set the initial costs_ high for every pixel as we will keep the minimum. for (i = 0; i < pix_count; ++i) manager->costs_[i] = FLT_MAX; return 1; } // Given the cost and the position that define an interval, update the cost at // pixel 'i' if it is smaller than the previously computed value. static WEBP_INLINE void UpdateCost(CostManager* const manager, int i, int position, float cost) { const int k = i - position; assert(k >= 0 && k < MAX_LENGTH); if (manager->costs_[i] > cost) { manager->costs_[i] = cost; manager->dist_array_[i] = k + 1; } } // Given the cost and the position that define an interval, update the cost for // all the pixels between 'start' and 'end' excluded. static WEBP_INLINE void UpdateCostPerInterval(CostManager* const manager, int start, int end, int position, float cost) { int i; for (i = start; i < end; ++i) UpdateCost(manager, i, position, cost); } // Given two intervals, make 'prev' be the previous one of 'next' in 'manager'. static WEBP_INLINE void ConnectIntervals(CostManager* const manager, CostInterval* const prev, CostInterval* const next) { if (prev != NULL) { prev->next_ = next; } else { manager->head_ = next; } if (next != NULL) next->previous_ = prev; } // Pop an interval in the manager. static WEBP_INLINE void PopInterval(CostManager* const manager, CostInterval* const interval) { if (interval == NULL) return; ConnectIntervals(manager, interval->previous_, interval->next_); if (CostIntervalIsInFreeList(manager, interval)) { CostIntervalAddToFreeList(manager, interval); } else { // recycle regularly malloc'd intervals too interval->next_ = manager->recycled_intervals_; manager->recycled_intervals_ = interval; } --manager->count_; assert(manager->count_ >= 0); } // Update the cost at index i by going over all the stored intervals that // overlap with i. // If 'do_clean_intervals' is set to something different than 0, intervals that // end before 'i' will be popped. static WEBP_INLINE void UpdateCostAtIndex(CostManager* const manager, int i, int do_clean_intervals) { CostInterval* current = manager->head_; while (current != NULL && current->start_ <= i) { CostInterval* const next = current->next_; if (current->end_ <= i) { if (do_clean_intervals) { // We have an outdated interval, remove it. PopInterval(manager, current); } } else { UpdateCost(manager, i, current->index_, current->cost_); } current = next; } } // Given a current orphan interval and its previous interval, before // it was orphaned (which can be NULL), set it at the right place in the list // of intervals using the start_ ordering and the previous interval as a hint. static WEBP_INLINE void PositionOrphanInterval(CostManager* const manager, CostInterval* const current, CostInterval* previous) { assert(current != NULL); if (previous == NULL) previous = manager->head_; while (previous != NULL && current->start_ < previous->start_) { previous = previous->previous_; } while (previous != NULL && previous->next_ != NULL && previous->next_->start_ < current->start_) { previous = previous->next_; } if (previous != NULL) { ConnectIntervals(manager, current, previous->next_); } else { ConnectIntervals(manager, current, manager->head_); } ConnectIntervals(manager, previous, current); } // Insert an interval in the list contained in the manager by starting at // interval_in as a hint. The intervals are sorted by start_ value. static WEBP_INLINE void InsertInterval(CostManager* const manager, CostInterval* const interval_in, float cost, int position, int start, int end) { CostInterval* interval_new; if (start >= end) return; if (manager->count_ >= COST_CACHE_INTERVAL_SIZE_MAX) { // Serialize the interval if we cannot store it. UpdateCostPerInterval(manager, start, end, position, cost); return; } if (manager->free_intervals_ != NULL) { interval_new = manager->free_intervals_; manager->free_intervals_ = interval_new->next_; } else if (manager->recycled_intervals_ != NULL) { interval_new = manager->recycled_intervals_; manager->recycled_intervals_ = interval_new->next_; } else { // malloc for good interval_new = (CostInterval*)WebPSafeMalloc(1, sizeof(*interval_new)); if (interval_new == NULL) { // Write down the interval if we cannot create it. UpdateCostPerInterval(manager, start, end, position, cost); return; } } interval_new->cost_ = cost; interval_new->index_ = position; interval_new->start_ = start; interval_new->end_ = end; PositionOrphanInterval(manager, interval_new, interval_in); ++manager->count_; } // Given a new cost interval defined by its start at position, its length value // and distance_cost, add its contributions to the previous intervals and costs. // If handling the interval or one of its subintervals becomes to heavy, its // contribution is added to the costs right away. static WEBP_INLINE void PushInterval(CostManager* const manager, float distance_cost, int position, int len) { size_t i; CostInterval* interval = manager->head_; CostInterval* interval_next; const CostCacheInterval* const cost_cache_intervals = manager->cache_intervals_; // If the interval is small enough, no need to deal with the heavy // interval logic, just serialize it right away. This constant is empirical. const int kSkipDistance = 10; if (len < kSkipDistance) { int j; for (j = position; j < position + len; ++j) { const int k = j - position; float cost_tmp; assert(k >= 0 && k < MAX_LENGTH); cost_tmp = distance_cost + manager->cost_cache_[k]; if (manager->costs_[j] > cost_tmp) { manager->costs_[j] = cost_tmp; manager->dist_array_[j] = k + 1; } } return; } for (i = 0; i < manager->cache_intervals_size_ && cost_cache_intervals[i].start_ < len; ++i) { // Define the intersection of the ith interval with the new one. int start = position + cost_cache_intervals[i].start_; const int end = position + (cost_cache_intervals[i].end_ > len ? len : cost_cache_intervals[i].end_); const float cost = distance_cost + cost_cache_intervals[i].cost_; for (; interval != NULL && interval->start_ < end; interval = interval_next) { interval_next = interval->next_; // Make sure we have some overlap if (start >= interval->end_) continue; if (cost >= interval->cost_) { // When intervals are represented, the lower, the better. // [**********************************************************[ // start end // [----------------------------------[ // interval->start_ interval->end_ // If we are worse than what we already have, add whatever we have so // far up to interval. const int start_new = interval->end_; InsertInterval(manager, interval, cost, position, start, interval->start_); start = start_new; if (start >= end) break; continue; } if (start <= interval->start_) { if (interval->end_ <= end) { // [----------------------------------[ // interval->start_ interval->end_ // [**************************************************************[ // start end // We can safely remove the old interval as it is fully included. PopInterval(manager, interval); } else { // [------------------------------------[ // interval->start_ interval->end_ // [*****************************[ // start end interval->start_ = end; break; } } else { if (end < interval->end_) { // [--------------------------------------------------------------[ // interval->start_ interval->end_ // [*****************************[ // start end // We have to split the old interval as it fully contains the new one. const int end_original = interval->end_; interval->end_ = start; InsertInterval(manager, interval, interval->cost_, interval->index_, end, end_original); interval = interval->next_; break; } else { // [------------------------------------[ // interval->start_ interval->end_ // [*****************************[ // start end interval->end_ = start; } } } // Insert the remaining interval from start to end. InsertInterval(manager, interval, cost, position, start, end); } } static int BackwardReferencesHashChainDistanceOnly( int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain, const VP8LBackwardRefs* const refs, uint16_t* const dist_array) { int i; int ok = 0; int cc_init = 0; const int pix_count = xsize * ysize; const int use_color_cache = (cache_bits > 0); const size_t literal_array_size = sizeof(float) * (VP8LHistogramNumCodes(cache_bits)); const size_t cost_model_size = sizeof(CostModel) + literal_array_size; CostModel* const cost_model = (CostModel*)WebPSafeCalloc(1ULL, cost_model_size); VP8LColorCache hashers; CostManager* cost_manager = (CostManager*)WebPSafeCalloc(1ULL, sizeof(*cost_manager)); int offset_prev = -1, len_prev = -1; float offset_cost = -1.f; int first_offset_is_constant = -1; // initialized with 'impossible' value int reach = 0; if (cost_model == NULL || cost_manager == NULL) goto Error; cost_model->literal_ = (float*)(cost_model + 1); if (use_color_cache) { cc_init = VP8LColorCacheInit(&hashers, cache_bits); if (!cc_init) goto Error; } if (!CostModelBuild(cost_model, xsize, cache_bits, refs)) { goto Error; } if (!CostManagerInit(cost_manager, dist_array, pix_count, cost_model)) { goto Error; } // We loop one pixel at a time, but store all currently best points to // non-processed locations from this point. dist_array[0] = 0; // Add first pixel as literal. AddSingleLiteralWithCostModel(argb, &hashers, cost_model, 0, use_color_cache, 0.f, cost_manager->costs_, dist_array); for (i = 1; i < pix_count; ++i) { const float prev_cost = cost_manager->costs_[i - 1]; int offset, len; VP8LHashChainFindCopy(hash_chain, i, &offset, &len); // Try adding the pixel as a literal. AddSingleLiteralWithCostModel(argb, &hashers, cost_model, i, use_color_cache, prev_cost, cost_manager->costs_, dist_array); // If we are dealing with a non-literal. if (len >= 2) { if (offset != offset_prev) { const int code = VP8LDistanceToPlaneCode(xsize, offset); offset_cost = GetDistanceCost(cost_model, code); first_offset_is_constant = 1; PushInterval(cost_manager, prev_cost + offset_cost, i, len); } else { assert(offset_cost >= 0); assert(len_prev >= 0); assert(first_offset_is_constant == 0 || first_offset_is_constant == 1); // Instead of considering all contributions from a pixel i by calling: // PushInterval(cost_manager, prev_cost + offset_cost, i, len); // we optimize these contributions in case offset_cost stays the same // for consecutive pixels. This describes a set of pixels similar to a // previous set (e.g. constant color regions). if (first_offset_is_constant) { reach = i - 1 + len_prev - 1; first_offset_is_constant = 0; } if (i + len - 1 > reach) { // We can only be go further with the same offset if the previous // length was maxed, hence len_prev == len == MAX_LENGTH. // TODO(vrabaud), bump i to the end right away (insert cache and // update cost). // TODO(vrabaud), check if one of the points in between does not have // a lower cost. // Already consider the pixel at "reach" to add intervals that are // better than whatever we add. int offset_j, len_j = 0; int j; assert(len == MAX_LENGTH || len == pix_count - i); // Figure out the last consecutive pixel within [i, reach + 1] with // the same offset. for (j = i; j <= reach; ++j) { VP8LHashChainFindCopy(hash_chain, j + 1, &offset_j, &len_j); if (offset_j != offset) { VP8LHashChainFindCopy(hash_chain, j, &offset_j, &len_j); break; } } // Update the cost at j - 1 and j. UpdateCostAtIndex(cost_manager, j - 1, 0); UpdateCostAtIndex(cost_manager, j, 0); PushInterval(cost_manager, cost_manager->costs_[j - 1] + offset_cost, j, len_j); reach = j + len_j - 1; } } } UpdateCostAtIndex(cost_manager, i, 1); offset_prev = offset; len_prev = len; } ok = !refs->error_; Error: if (cc_init) VP8LColorCacheClear(&hashers); CostManagerClear(cost_manager); WebPSafeFree(cost_model); WebPSafeFree(cost_manager); return ok; } // We pack the path at the end of *dist_array and return // a pointer to this part of the array. Example: // dist_array = [1x2xx3x2] => packed [1x2x1232], chosen_path = [1232] static void TraceBackwards(uint16_t* const dist_array, int dist_array_size, uint16_t** const chosen_path, int* const chosen_path_size) { uint16_t* path = dist_array + dist_array_size; uint16_t* cur = dist_array + dist_array_size - 1; while (cur >= dist_array) { const int k = *cur; --path; *path = k; cur -= k; } *chosen_path = path; *chosen_path_size = (int)(dist_array + dist_array_size - path); } static int BackwardReferencesHashChainFollowChosenPath( const uint32_t* const argb, int cache_bits, const uint16_t* const chosen_path, int chosen_path_size, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs) { const int use_color_cache = (cache_bits > 0); int ix; int i = 0; int ok = 0; int cc_init = 0; VP8LColorCache hashers; if (use_color_cache) { cc_init = VP8LColorCacheInit(&hashers, cache_bits); if (!cc_init) goto Error; } VP8LClearBackwardRefs(refs); for (ix = 0; ix < chosen_path_size; ++ix) { const int len = chosen_path[ix]; if (len != 1) { int k; const int offset = VP8LHashChainFindOffset(hash_chain, i); VP8LBackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(offset, len)); if (use_color_cache) { for (k = 0; k < len; ++k) { VP8LColorCacheInsert(&hashers, argb[i + k]); } } i += len; } else { PixOrCopy v; const int idx = use_color_cache ? VP8LColorCacheContains(&hashers, argb[i]) : -1; if (idx >= 0) { // use_color_cache is true and hashers contains argb[i] // push pixel as a color cache index v = PixOrCopyCreateCacheIdx(idx); } else { if (use_color_cache) VP8LColorCacheInsert(&hashers, argb[i]); v = PixOrCopyCreateLiteral(argb[i]); } VP8LBackwardRefsCursorAdd(refs, v); ++i; } } ok = !refs->error_; Error: if (cc_init) VP8LColorCacheClear(&hashers); return ok; } // Returns 1 on success. extern int VP8LBackwardReferencesTraceBackwards( int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain, const VP8LBackwardRefs* const refs_src, VP8LBackwardRefs* const refs_dst); int VP8LBackwardReferencesTraceBackwards(int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain, const VP8LBackwardRefs* const refs_src, VP8LBackwardRefs* const refs_dst) { int ok = 0; const int dist_array_size = xsize * ysize; uint16_t* chosen_path = NULL; int chosen_path_size = 0; uint16_t* dist_array = (uint16_t*)WebPSafeMalloc(dist_array_size, sizeof(*dist_array)); if (dist_array == NULL) goto Error; if (!BackwardReferencesHashChainDistanceOnly( xsize, ysize, argb, cache_bits, hash_chain, refs_src, dist_array)) { goto Error; } TraceBackwards(dist_array, dist_array_size, &chosen_path, &chosen_path_size); if (!BackwardReferencesHashChainFollowChosenPath( argb, cache_bits, chosen_path, chosen_path_size, hash_chain, refs_dst)) { goto Error; } ok = 1; Error: WebPSafeFree(dist_array); return ok; } libwebp-1.4.0/src/enc/vp8li_enc.h0000644000014400001440000001105714606317060013453 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Lossless encoder: internal header. // // Author: Vikas Arora (vikaas.arora@gmail.com) #ifndef WEBP_ENC_VP8LI_ENC_H_ #define WEBP_ENC_VP8LI_ENC_H_ #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif // Either WEBP_NEAR_LOSSLESS is defined as 0 in config.h when compiling to // disable near-lossless, or it is enabled by default. #ifndef WEBP_NEAR_LOSSLESS #define WEBP_NEAR_LOSSLESS 1 #endif #include "src/enc/backward_references_enc.h" #include "src/enc/histogram_enc.h" #include "src/utils/bit_writer_utils.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" #ifdef __cplusplus extern "C" { #endif // maximum value of transform_bits_ in VP8LEncoder. #define MAX_TRANSFORM_BITS 6 typedef enum { kEncoderNone = 0, kEncoderARGB, kEncoderNearLossless, kEncoderPalette } VP8LEncoderARGBContent; typedef struct { const WebPConfig* config_; // user configuration and parameters const WebPPicture* pic_; // input picture. uint32_t* argb_; // Transformed argb image data. VP8LEncoderARGBContent argb_content_; // Content type of the argb buffer. uint32_t* argb_scratch_; // Scratch memory for argb rows // (used for prediction). uint32_t* transform_data_; // Scratch memory for transform data. uint32_t* transform_mem_; // Currently allocated memory. size_t transform_mem_size_; // Currently allocated memory size. int current_width_; // Corresponds to packed image width. // Encoding parameters derived from quality parameter. int histo_bits_; int transform_bits_; // <= MAX_TRANSFORM_BITS. int cache_bits_; // If equal to 0, don't use color cache. // Encoding parameters derived from image characteristics. int use_cross_color_; int use_subtract_green_; int use_predict_; int use_palette_; int palette_size_; uint32_t palette_[MAX_PALETTE_SIZE]; // Sorted version of palette_ for cache purposes. uint32_t palette_sorted_[MAX_PALETTE_SIZE]; // Some 'scratch' (potentially large) objects. struct VP8LBackwardRefs refs_[4]; // Backward Refs array for temporaries. VP8LHashChain hash_chain_; // HashChain data for constructing // backward references. } VP8LEncoder; //------------------------------------------------------------------------------ // internal functions. Not public. // Encodes the picture. // Returns 0 if config or picture is NULL or picture doesn't have valid argb // input. int VP8LEncodeImage(const WebPConfig* const config, const WebPPicture* const picture); // Encodes the main image stream using the supplied bit writer. // Returns false in case of error (stored in picture->error_code). int VP8LEncodeStream(const WebPConfig* const config, const WebPPicture* const picture, VP8LBitWriter* const bw); #if (WEBP_NEAR_LOSSLESS == 1) // in near_lossless.c // Near lossless preprocessing in RGB color-space. int VP8ApplyNearLossless(const WebPPicture* const picture, int quality, uint32_t* const argb_dst); #endif //------------------------------------------------------------------------------ // Image transforms in predictor.c. // pic and percent are for progress. // Returns false in case of error (stored in pic->error_code). int VP8LResidualImage(int width, int height, int bits, int low_effort, uint32_t* const argb, uint32_t* const argb_scratch, uint32_t* const image, int near_lossless, int exact, int used_subtract_green, const WebPPicture* const pic, int percent_range, int* const percent); int VP8LColorSpaceTransform(int width, int height, int bits, int quality, uint32_t* const argb, uint32_t* image, const WebPPicture* const pic, int percent_range, int* const percent); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_ENC_VP8LI_ENC_H_ libwebp-1.4.0/src/enc/quant_enc.c0000644000014400001440000014254214606317060013540 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Quantization // // Author: Skal (pascal.massimino@gmail.com) #include #include #include // for abs() #include "src/dsp/quant.h" #include "src/enc/vp8i_enc.h" #include "src/enc/cost_enc.h" #define DO_TRELLIS_I4 1 #define DO_TRELLIS_I16 1 // not a huge gain, but ok at low bitrate. #define DO_TRELLIS_UV 0 // disable trellis for UV. Risky. Not worth. #define USE_TDISTO 1 #define MID_ALPHA 64 // neutral value for susceptibility #define MIN_ALPHA 30 // lowest usable value for susceptibility #define MAX_ALPHA 100 // higher meaningful value for susceptibility #define SNS_TO_DQ 0.9 // Scaling constant between the sns value and the QP // power-law modulation. Must be strictly less than 1. // number of non-zero coeffs below which we consider the block very flat // (and apply a penalty to complex predictions) #define FLATNESS_LIMIT_I16 0 // I16 mode (special case) #define FLATNESS_LIMIT_I4 3 // I4 mode #define FLATNESS_LIMIT_UV 2 // UV mode #define FLATNESS_PENALTY 140 // roughly ~1bit per block #define MULT_8B(a, b) (((a) * (b) + 128) >> 8) #define RD_DISTO_MULT 256 // distortion multiplier (equivalent of lambda) // #define DEBUG_BLOCK //------------------------------------------------------------------------------ #if defined(DEBUG_BLOCK) #include #include static void PrintBlockInfo(const VP8EncIterator* const it, const VP8ModeScore* const rd) { int i, j; const int is_i16 = (it->mb_->type_ == 1); const uint8_t* const y_in = it->yuv_in_ + Y_OFF_ENC; const uint8_t* const y_out = it->yuv_out_ + Y_OFF_ENC; const uint8_t* const uv_in = it->yuv_in_ + U_OFF_ENC; const uint8_t* const uv_out = it->yuv_out_ + U_OFF_ENC; printf("SOURCE / OUTPUT / ABS DELTA\n"); for (j = 0; j < 16; ++j) { for (i = 0; i < 16; ++i) printf("%3d ", y_in[i + j * BPS]); printf(" "); for (i = 0; i < 16; ++i) printf("%3d ", y_out[i + j * BPS]); printf(" "); for (i = 0; i < 16; ++i) { printf("%1d ", abs(y_in[i + j * BPS] - y_out[i + j * BPS])); } printf("\n"); } printf("\n"); // newline before the U/V block for (j = 0; j < 8; ++j) { for (i = 0; i < 8; ++i) printf("%3d ", uv_in[i + j * BPS]); printf(" "); for (i = 8; i < 16; ++i) printf("%3d ", uv_in[i + j * BPS]); printf(" "); for (i = 0; i < 8; ++i) printf("%3d ", uv_out[i + j * BPS]); printf(" "); for (i = 8; i < 16; ++i) printf("%3d ", uv_out[i + j * BPS]); printf(" "); for (i = 0; i < 8; ++i) { printf("%1d ", abs(uv_out[i + j * BPS] - uv_in[i + j * BPS])); } printf(" "); for (i = 8; i < 16; ++i) { printf("%1d ", abs(uv_out[i + j * BPS] - uv_in[i + j * BPS])); } printf("\n"); } printf("\nD:%d SD:%d R:%d H:%d nz:0x%x score:%d\n", (int)rd->D, (int)rd->SD, (int)rd->R, (int)rd->H, (int)rd->nz, (int)rd->score); if (is_i16) { printf("Mode: %d\n", rd->mode_i16); printf("y_dc_levels:"); for (i = 0; i < 16; ++i) printf("%3d ", rd->y_dc_levels[i]); printf("\n"); } else { printf("Modes[16]: "); for (i = 0; i < 16; ++i) printf("%d ", rd->modes_i4[i]); printf("\n"); } printf("y_ac_levels:\n"); for (j = 0; j < 16; ++j) { for (i = is_i16 ? 1 : 0; i < 16; ++i) { printf("%4d ", rd->y_ac_levels[j][i]); } printf("\n"); } printf("\n"); printf("uv_levels (mode=%d):\n", rd->mode_uv); for (j = 0; j < 8; ++j) { for (i = 0; i < 16; ++i) { printf("%4d ", rd->uv_levels[j][i]); } printf("\n"); } } #endif // DEBUG_BLOCK //------------------------------------------------------------------------------ static WEBP_INLINE int clip(int v, int m, int M) { return v < m ? m : v > M ? M : v; } static const uint8_t kZigzag[16] = { 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 }; static const uint8_t kDcTable[128] = { 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157 }; static const uint16_t kAcTable[128] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284 }; static const uint16_t kAcTable2[128] = { 8, 8, 9, 10, 12, 13, 15, 17, 18, 20, 21, 23, 24, 26, 27, 29, 31, 32, 34, 35, 37, 38, 40, 41, 43, 44, 46, 48, 49, 51, 52, 54, 55, 57, 58, 60, 62, 63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 79, 80, 82, 83, 85, 86, 88, 89, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 164, 167, 170, 173, 176, 179, 184, 189, 193, 198, 203, 207, 212, 217, 221, 226, 230, 235, 240, 244, 249, 254, 258, 263, 268, 274, 280, 286, 292, 299, 305, 311, 317, 323, 330, 336, 342, 348, 354, 362, 370, 379, 385, 393, 401, 409, 416, 424, 432, 440 }; static const uint8_t kBiasMatrices[3][2] = { // [luma-ac,luma-dc,chroma][dc,ac] { 96, 110 }, { 96, 108 }, { 110, 115 } }; // Sharpening by (slightly) raising the hi-frequency coeffs. // Hack-ish but helpful for mid-bitrate range. Use with care. #define SHARPEN_BITS 11 // number of descaling bits for sharpening bias static const uint8_t kFreqSharpening[16] = { 0, 30, 60, 90, 30, 60, 90, 90, 60, 90, 90, 90, 90, 90, 90, 90 }; //------------------------------------------------------------------------------ // Initialize quantization parameters in VP8Matrix // Returns the average quantizer static int ExpandMatrix(VP8Matrix* const m, int type) { int i, sum; for (i = 0; i < 2; ++i) { const int is_ac_coeff = (i > 0); const int bias = kBiasMatrices[type][is_ac_coeff]; m->iq_[i] = (1 << QFIX) / m->q_[i]; m->bias_[i] = BIAS(bias); // zthresh_ is the exact value such that QUANTDIV(coeff, iQ, B) is: // * zero if coeff <= zthresh // * non-zero if coeff > zthresh m->zthresh_[i] = ((1 << QFIX) - 1 - m->bias_[i]) / m->iq_[i]; } for (i = 2; i < 16; ++i) { m->q_[i] = m->q_[1]; m->iq_[i] = m->iq_[1]; m->bias_[i] = m->bias_[1]; m->zthresh_[i] = m->zthresh_[1]; } for (sum = 0, i = 0; i < 16; ++i) { if (type == 0) { // we only use sharpening for AC luma coeffs m->sharpen_[i] = (kFreqSharpening[i] * m->q_[i]) >> SHARPEN_BITS; } else { m->sharpen_[i] = 0; } sum += m->q_[i]; } return (sum + 8) >> 4; } static void CheckLambdaValue(int* const v) { if (*v < 1) *v = 1; } static void SetupMatrices(VP8Encoder* enc) { int i; const int tlambda_scale = (enc->method_ >= 4) ? enc->config_->sns_strength : 0; const int num_segments = enc->segment_hdr_.num_segments_; for (i = 0; i < num_segments; ++i) { VP8SegmentInfo* const m = &enc->dqm_[i]; const int q = m->quant_; int q_i4, q_i16, q_uv; m->y1_.q_[0] = kDcTable[clip(q + enc->dq_y1_dc_, 0, 127)]; m->y1_.q_[1] = kAcTable[clip(q, 0, 127)]; m->y2_.q_[0] = kDcTable[ clip(q + enc->dq_y2_dc_, 0, 127)] * 2; m->y2_.q_[1] = kAcTable2[clip(q + enc->dq_y2_ac_, 0, 127)]; m->uv_.q_[0] = kDcTable[clip(q + enc->dq_uv_dc_, 0, 117)]; m->uv_.q_[1] = kAcTable[clip(q + enc->dq_uv_ac_, 0, 127)]; q_i4 = ExpandMatrix(&m->y1_, 0); q_i16 = ExpandMatrix(&m->y2_, 1); q_uv = ExpandMatrix(&m->uv_, 2); m->lambda_i4_ = (3 * q_i4 * q_i4) >> 7; m->lambda_i16_ = (3 * q_i16 * q_i16); m->lambda_uv_ = (3 * q_uv * q_uv) >> 6; m->lambda_mode_ = (1 * q_i4 * q_i4) >> 7; m->lambda_trellis_i4_ = (7 * q_i4 * q_i4) >> 3; m->lambda_trellis_i16_ = (q_i16 * q_i16) >> 2; m->lambda_trellis_uv_ = (q_uv * q_uv) << 1; m->tlambda_ = (tlambda_scale * q_i4) >> 5; // none of these constants should be < 1 CheckLambdaValue(&m->lambda_i4_); CheckLambdaValue(&m->lambda_i16_); CheckLambdaValue(&m->lambda_uv_); CheckLambdaValue(&m->lambda_mode_); CheckLambdaValue(&m->lambda_trellis_i4_); CheckLambdaValue(&m->lambda_trellis_i16_); CheckLambdaValue(&m->lambda_trellis_uv_); CheckLambdaValue(&m->tlambda_); m->min_disto_ = 20 * m->y1_.q_[0]; // quantization-aware min disto m->max_edge_ = 0; m->i4_penalty_ = 1000 * q_i4 * q_i4; } } //------------------------------------------------------------------------------ // Initialize filtering parameters // Very small filter-strength values have close to no visual effect. So we can // save a little decoding-CPU by turning filtering off for these. #define FSTRENGTH_CUTOFF 2 static void SetupFilterStrength(VP8Encoder* const enc) { int i; // level0 is in [0..500]. Using '-f 50' as filter_strength is mid-filtering. const int level0 = 5 * enc->config_->filter_strength; for (i = 0; i < NUM_MB_SEGMENTS; ++i) { VP8SegmentInfo* const m = &enc->dqm_[i]; // We focus on the quantization of AC coeffs. const int qstep = kAcTable[clip(m->quant_, 0, 127)] >> 2; const int base_strength = VP8FilterStrengthFromDelta(enc->filter_hdr_.sharpness_, qstep); // Segments with lower complexity ('beta') will be less filtered. const int f = base_strength * level0 / (256 + m->beta_); m->fstrength_ = (f < FSTRENGTH_CUTOFF) ? 0 : (f > 63) ? 63 : f; } // We record the initial strength (mainly for the case of 1-segment only). enc->filter_hdr_.level_ = enc->dqm_[0].fstrength_; enc->filter_hdr_.simple_ = (enc->config_->filter_type == 0); enc->filter_hdr_.sharpness_ = enc->config_->filter_sharpness; } //------------------------------------------------------------------------------ // Note: if you change the values below, remember that the max range // allowed by the syntax for DQ_UV is [-16,16]. #define MAX_DQ_UV (6) #define MIN_DQ_UV (-4) // We want to emulate jpeg-like behaviour where the expected "good" quality // is around q=75. Internally, our "good" middle is around c=50. So we // map accordingly using linear piece-wise function static double QualityToCompression(double c) { const double linear_c = (c < 0.75) ? c * (2. / 3.) : 2. * c - 1.; // The file size roughly scales as pow(quantizer, 3.). Actually, the // exponent is somewhere between 2.8 and 3.2, but we're mostly interested // in the mid-quant range. So we scale the compressibility inversely to // this power-law: quant ~= compression ^ 1/3. This law holds well for // low quant. Finer modeling for high-quant would make use of kAcTable[] // more explicitly. const double v = pow(linear_c, 1 / 3.); return v; } static double QualityToJPEGCompression(double c, double alpha) { // We map the complexity 'alpha' and quality setting 'c' to a compression // exponent empirically matched to the compression curve of libjpeg6b. // On average, the WebP output size will be roughly similar to that of a // JPEG file compressed with same quality factor. const double amin = 0.30; const double amax = 0.85; const double exp_min = 0.4; const double exp_max = 0.9; const double slope = (exp_min - exp_max) / (amax - amin); // Linearly interpolate 'expn' from exp_min to exp_max // in the [amin, amax] range. const double expn = (alpha > amax) ? exp_min : (alpha < amin) ? exp_max : exp_max + slope * (alpha - amin); const double v = pow(c, expn); return v; } static int SegmentsAreEquivalent(const VP8SegmentInfo* const S1, const VP8SegmentInfo* const S2) { return (S1->quant_ == S2->quant_) && (S1->fstrength_ == S2->fstrength_); } static void SimplifySegments(VP8Encoder* const enc) { int map[NUM_MB_SEGMENTS] = { 0, 1, 2, 3 }; // 'num_segments_' is previously validated and <= NUM_MB_SEGMENTS, but an // explicit check is needed to avoid a spurious warning about 'i' exceeding // array bounds of 'dqm_' with some compilers (noticed with gcc-4.9). const int num_segments = (enc->segment_hdr_.num_segments_ < NUM_MB_SEGMENTS) ? enc->segment_hdr_.num_segments_ : NUM_MB_SEGMENTS; int num_final_segments = 1; int s1, s2; for (s1 = 1; s1 < num_segments; ++s1) { // find similar segments const VP8SegmentInfo* const S1 = &enc->dqm_[s1]; int found = 0; // check if we already have similar segment for (s2 = 0; s2 < num_final_segments; ++s2) { const VP8SegmentInfo* const S2 = &enc->dqm_[s2]; if (SegmentsAreEquivalent(S1, S2)) { found = 1; break; } } map[s1] = s2; if (!found) { if (num_final_segments != s1) { enc->dqm_[num_final_segments] = enc->dqm_[s1]; } ++num_final_segments; } } if (num_final_segments < num_segments) { // Remap int i = enc->mb_w_ * enc->mb_h_; while (i-- > 0) enc->mb_info_[i].segment_ = map[enc->mb_info_[i].segment_]; enc->segment_hdr_.num_segments_ = num_final_segments; // Replicate the trailing segment infos (it's mostly cosmetics) for (i = num_final_segments; i < num_segments; ++i) { enc->dqm_[i] = enc->dqm_[num_final_segments - 1]; } } } void VP8SetSegmentParams(VP8Encoder* const enc, float quality) { int i; int dq_uv_ac, dq_uv_dc; const int num_segments = enc->segment_hdr_.num_segments_; const double amp = SNS_TO_DQ * enc->config_->sns_strength / 100. / 128.; const double Q = quality / 100.; const double c_base = enc->config_->emulate_jpeg_size ? QualityToJPEGCompression(Q, enc->alpha_ / 255.) : QualityToCompression(Q); for (i = 0; i < num_segments; ++i) { // We modulate the base coefficient to accommodate for the quantization // susceptibility and allow denser segments to be quantized more. const double expn = 1. - amp * enc->dqm_[i].alpha_; const double c = pow(c_base, expn); const int q = (int)(127. * (1. - c)); assert(expn > 0.); enc->dqm_[i].quant_ = clip(q, 0, 127); } // purely indicative in the bitstream (except for the 1-segment case) enc->base_quant_ = enc->dqm_[0].quant_; // fill-in values for the unused segments (required by the syntax) for (i = num_segments; i < NUM_MB_SEGMENTS; ++i) { enc->dqm_[i].quant_ = enc->base_quant_; } // uv_alpha_ is normally spread around ~60. The useful range is // typically ~30 (quite bad) to ~100 (ok to decimate UV more). // We map it to the safe maximal range of MAX/MIN_DQ_UV for dq_uv. dq_uv_ac = (enc->uv_alpha_ - MID_ALPHA) * (MAX_DQ_UV - MIN_DQ_UV) / (MAX_ALPHA - MIN_ALPHA); // we rescale by the user-defined strength of adaptation dq_uv_ac = dq_uv_ac * enc->config_->sns_strength / 100; // and make it safe. dq_uv_ac = clip(dq_uv_ac, MIN_DQ_UV, MAX_DQ_UV); // We also boost the dc-uv-quant a little, based on sns-strength, since // U/V channels are quite more reactive to high quants (flat DC-blocks // tend to appear, and are unpleasant). dq_uv_dc = -4 * enc->config_->sns_strength / 100; dq_uv_dc = clip(dq_uv_dc, -15, 15); // 4bit-signed max allowed enc->dq_y1_dc_ = 0; // TODO(skal): dq-lum enc->dq_y2_dc_ = 0; enc->dq_y2_ac_ = 0; enc->dq_uv_dc_ = dq_uv_dc; enc->dq_uv_ac_ = dq_uv_ac; SetupFilterStrength(enc); // initialize segments' filtering, eventually if (num_segments > 1) SimplifySegments(enc); SetupMatrices(enc); // finalize quantization matrices } //------------------------------------------------------------------------------ // Form the predictions in cache // Must be ordered using {DC_PRED, TM_PRED, V_PRED, H_PRED} as index const uint16_t VP8I16ModeOffsets[4] = { I16DC16, I16TM16, I16VE16, I16HE16 }; const uint16_t VP8UVModeOffsets[4] = { C8DC8, C8TM8, C8VE8, C8HE8 }; // Must be indexed using {B_DC_PRED -> B_HU_PRED} as index const uint16_t VP8I4ModeOffsets[NUM_BMODES] = { I4DC4, I4TM4, I4VE4, I4HE4, I4RD4, I4VR4, I4LD4, I4VL4, I4HD4, I4HU4 }; void VP8MakeLuma16Preds(const VP8EncIterator* const it) { const uint8_t* const left = it->x_ ? it->y_left_ : NULL; const uint8_t* const top = it->y_ ? it->y_top_ : NULL; VP8EncPredLuma16(it->yuv_p_, left, top); } void VP8MakeChroma8Preds(const VP8EncIterator* const it) { const uint8_t* const left = it->x_ ? it->u_left_ : NULL; const uint8_t* const top = it->y_ ? it->uv_top_ : NULL; VP8EncPredChroma8(it->yuv_p_, left, top); } void VP8MakeIntra4Preds(const VP8EncIterator* const it) { VP8EncPredLuma4(it->yuv_p_, it->i4_top_); } //------------------------------------------------------------------------------ // Quantize // Layout: // +----+----+ // |YYYY|UUVV| 0 // |YYYY|UUVV| 4 // |YYYY|....| 8 // |YYYY|....| 12 // +----+----+ const uint16_t VP8Scan[16] = { // Luma 0 + 0 * BPS, 4 + 0 * BPS, 8 + 0 * BPS, 12 + 0 * BPS, 0 + 4 * BPS, 4 + 4 * BPS, 8 + 4 * BPS, 12 + 4 * BPS, 0 + 8 * BPS, 4 + 8 * BPS, 8 + 8 * BPS, 12 + 8 * BPS, 0 + 12 * BPS, 4 + 12 * BPS, 8 + 12 * BPS, 12 + 12 * BPS, }; static const uint16_t VP8ScanUV[4 + 4] = { 0 + 0 * BPS, 4 + 0 * BPS, 0 + 4 * BPS, 4 + 4 * BPS, // U 8 + 0 * BPS, 12 + 0 * BPS, 8 + 4 * BPS, 12 + 4 * BPS // V }; //------------------------------------------------------------------------------ // Distortion measurement static const uint16_t kWeightY[16] = { 38, 32, 20, 9, 32, 28, 17, 7, 20, 17, 10, 4, 9, 7, 4, 2 }; static const uint16_t kWeightTrellis[16] = { #if USE_TDISTO == 0 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 #else 30, 27, 19, 11, 27, 24, 17, 10, 19, 17, 12, 8, 11, 10, 8, 6 #endif }; // Init/Copy the common fields in score. static void InitScore(VP8ModeScore* const rd) { rd->D = 0; rd->SD = 0; rd->R = 0; rd->H = 0; rd->nz = 0; rd->score = MAX_COST; } static void CopyScore(VP8ModeScore* WEBP_RESTRICT const dst, const VP8ModeScore* WEBP_RESTRICT const src) { dst->D = src->D; dst->SD = src->SD; dst->R = src->R; dst->H = src->H; dst->nz = src->nz; // note that nz is not accumulated, but just copied. dst->score = src->score; } static void AddScore(VP8ModeScore* WEBP_RESTRICT const dst, const VP8ModeScore* WEBP_RESTRICT const src) { dst->D += src->D; dst->SD += src->SD; dst->R += src->R; dst->H += src->H; dst->nz |= src->nz; // here, new nz bits are accumulated. dst->score += src->score; } //------------------------------------------------------------------------------ // Performs trellis-optimized quantization. // Trellis node typedef struct { int8_t prev; // best previous node int8_t sign; // sign of coeff_i int16_t level; // level } Node; // Score state typedef struct { score_t score; // partial RD score const uint16_t* costs; // shortcut to cost tables } ScoreState; // If a coefficient was quantized to a value Q (using a neutral bias), // we test all alternate possibilities between [Q-MIN_DELTA, Q+MAX_DELTA] // We don't test negative values though. #define MIN_DELTA 0 // how much lower level to try #define MAX_DELTA 1 // how much higher #define NUM_NODES (MIN_DELTA + 1 + MAX_DELTA) #define NODE(n, l) (nodes[(n)][(l) + MIN_DELTA]) #define SCORE_STATE(n, l) (score_states[n][(l) + MIN_DELTA]) static WEBP_INLINE void SetRDScore(int lambda, VP8ModeScore* const rd) { rd->score = (rd->R + rd->H) * lambda + RD_DISTO_MULT * (rd->D + rd->SD); } static WEBP_INLINE score_t RDScoreTrellis(int lambda, score_t rate, score_t distortion) { return rate * lambda + RD_DISTO_MULT * distortion; } // Coefficient type. enum { TYPE_I16_AC = 0, TYPE_I16_DC = 1, TYPE_CHROMA_A = 2, TYPE_I4_AC = 3 }; static int TrellisQuantizeBlock(const VP8Encoder* WEBP_RESTRICT const enc, int16_t in[16], int16_t out[16], int ctx0, int coeff_type, const VP8Matrix* WEBP_RESTRICT const mtx, int lambda) { const ProbaArray* const probas = enc->proba_.coeffs_[coeff_type]; CostArrayPtr const costs = (CostArrayPtr)enc->proba_.remapped_costs_[coeff_type]; const int first = (coeff_type == TYPE_I16_AC) ? 1 : 0; Node nodes[16][NUM_NODES]; ScoreState score_states[2][NUM_NODES]; ScoreState* ss_cur = &SCORE_STATE(0, MIN_DELTA); ScoreState* ss_prev = &SCORE_STATE(1, MIN_DELTA); int best_path[3] = {-1, -1, -1}; // store best-last/best-level/best-previous score_t best_score; int n, m, p, last; { score_t cost; const int thresh = mtx->q_[1] * mtx->q_[1] / 4; const int last_proba = probas[VP8EncBands[first]][ctx0][0]; // compute the position of the last interesting coefficient last = first - 1; for (n = 15; n >= first; --n) { const int j = kZigzag[n]; const int err = in[j] * in[j]; if (err > thresh) { last = n; break; } } // we don't need to go inspect up to n = 16 coeffs. We can just go up // to last + 1 (inclusive) without losing much. if (last < 15) ++last; // compute 'skip' score. This is the max score one can do. cost = VP8BitCost(0, last_proba); best_score = RDScoreTrellis(lambda, cost, 0); // initialize source node. for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) { const score_t rate = (ctx0 == 0) ? VP8BitCost(1, last_proba) : 0; ss_cur[m].score = RDScoreTrellis(lambda, rate, 0); ss_cur[m].costs = costs[first][ctx0]; } } // traverse trellis. for (n = first; n <= last; ++n) { const int j = kZigzag[n]; const uint32_t Q = mtx->q_[j]; const uint32_t iQ = mtx->iq_[j]; const uint32_t B = BIAS(0x00); // neutral bias // note: it's important to take sign of the _original_ coeff, // so we don't have to consider level < 0 afterward. const int sign = (in[j] < 0); const uint32_t coeff0 = (sign ? -in[j] : in[j]) + mtx->sharpen_[j]; int level0 = QUANTDIV(coeff0, iQ, B); int thresh_level = QUANTDIV(coeff0, iQ, BIAS(0x80)); if (thresh_level > MAX_LEVEL) thresh_level = MAX_LEVEL; if (level0 > MAX_LEVEL) level0 = MAX_LEVEL; { // Swap current and previous score states ScoreState* const tmp = ss_cur; ss_cur = ss_prev; ss_prev = tmp; } // test all alternate level values around level0. for (m = -MIN_DELTA; m <= MAX_DELTA; ++m) { Node* const cur = &NODE(n, m); const int level = level0 + m; const int ctx = (level > 2) ? 2 : level; const int band = VP8EncBands[n + 1]; score_t base_score; score_t best_cur_score; int best_prev; score_t cost, score; ss_cur[m].costs = costs[n + 1][ctx]; if (level < 0 || level > thresh_level) { ss_cur[m].score = MAX_COST; // Node is dead. continue; } { // Compute delta_error = how much coding this level will // subtract to max_error as distortion. // Here, distortion = sum of (|coeff_i| - level_i * Q_i)^2 const int new_error = coeff0 - level * Q; const int delta_error = kWeightTrellis[j] * (new_error * new_error - coeff0 * coeff0); base_score = RDScoreTrellis(lambda, 0, delta_error); } // Inspect all possible non-dead predecessors. Retain only the best one. // The base_score is added to all scores so it is only added for the final // value after the loop. cost = VP8LevelCost(ss_prev[-MIN_DELTA].costs, level); best_cur_score = ss_prev[-MIN_DELTA].score + RDScoreTrellis(lambda, cost, 0); best_prev = -MIN_DELTA; for (p = -MIN_DELTA + 1; p <= MAX_DELTA; ++p) { // Dead nodes (with ss_prev[p].score >= MAX_COST) are automatically // eliminated since their score can't be better than the current best. cost = VP8LevelCost(ss_prev[p].costs, level); // Examine node assuming it's a non-terminal one. score = ss_prev[p].score + RDScoreTrellis(lambda, cost, 0); if (score < best_cur_score) { best_cur_score = score; best_prev = p; } } best_cur_score += base_score; // Store best finding in current node. cur->sign = sign; cur->level = level; cur->prev = best_prev; ss_cur[m].score = best_cur_score; // Now, record best terminal node (and thus best entry in the graph). if (level != 0 && best_cur_score < best_score) { const score_t last_pos_cost = (n < 15) ? VP8BitCost(0, probas[band][ctx][0]) : 0; const score_t last_pos_score = RDScoreTrellis(lambda, last_pos_cost, 0); score = best_cur_score + last_pos_score; if (score < best_score) { best_score = score; best_path[0] = n; // best eob position best_path[1] = m; // best node index best_path[2] = best_prev; // best predecessor } } } } // Fresh start // Beware! We must preserve in[0]/out[0] value for TYPE_I16_AC case. if (coeff_type == TYPE_I16_AC) { memset(in + 1, 0, 15 * sizeof(*in)); memset(out + 1, 0, 15 * sizeof(*out)); } else { memset(in, 0, 16 * sizeof(*in)); memset(out, 0, 16 * sizeof(*out)); } if (best_path[0] == -1) { return 0; // skip! } { // Unwind the best path. // Note: best-prev on terminal node is not necessarily equal to the // best_prev for non-terminal. So we patch best_path[2] in. int nz = 0; int best_node = best_path[1]; n = best_path[0]; NODE(n, best_node).prev = best_path[2]; // force best-prev for terminal for (; n >= first; --n) { const Node* const node = &NODE(n, best_node); const int j = kZigzag[n]; out[n] = node->sign ? -node->level : node->level; nz |= node->level; in[j] = out[n] * mtx->q_[j]; best_node = node->prev; } return (nz != 0); } } #undef NODE //------------------------------------------------------------------------------ // Performs: difference, transform, quantize, back-transform, add // all at once. Output is the reconstructed block in *yuv_out, and the // quantized levels in *levels. static int ReconstructIntra16(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd, uint8_t* WEBP_RESTRICT const yuv_out, int mode) { const VP8Encoder* const enc = it->enc_; const uint8_t* const ref = it->yuv_p_ + VP8I16ModeOffsets[mode]; const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC; const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_]; int nz = 0; int n; int16_t tmp[16][16], dc_tmp[16]; for (n = 0; n < 16; n += 2) { VP8FTransform2(src + VP8Scan[n], ref + VP8Scan[n], tmp[n]); } VP8FTransformWHT(tmp[0], dc_tmp); nz |= VP8EncQuantizeBlockWHT(dc_tmp, rd->y_dc_levels, &dqm->y2_) << 24; if (DO_TRELLIS_I16 && it->do_trellis_) { int x, y; VP8IteratorNzToBytes(it); for (y = 0, n = 0; y < 4; ++y) { for (x = 0; x < 4; ++x, ++n) { const int ctx = it->top_nz_[x] + it->left_nz_[y]; const int non_zero = TrellisQuantizeBlock( enc, tmp[n], rd->y_ac_levels[n], ctx, TYPE_I16_AC, &dqm->y1_, dqm->lambda_trellis_i16_); it->top_nz_[x] = it->left_nz_[y] = non_zero; rd->y_ac_levels[n][0] = 0; nz |= non_zero << n; } } } else { for (n = 0; n < 16; n += 2) { // Zero-out the first coeff, so that: a) nz is correct below, and // b) finding 'last' non-zero coeffs in SetResidualCoeffs() is simplified. tmp[n][0] = tmp[n + 1][0] = 0; nz |= VP8EncQuantize2Blocks(tmp[n], rd->y_ac_levels[n], &dqm->y1_) << n; assert(rd->y_ac_levels[n + 0][0] == 0); assert(rd->y_ac_levels[n + 1][0] == 0); } } // Transform back VP8TransformWHT(dc_tmp, tmp[0]); for (n = 0; n < 16; n += 2) { VP8ITransform(ref + VP8Scan[n], tmp[n], yuv_out + VP8Scan[n], 1); } return nz; } static int ReconstructIntra4(VP8EncIterator* WEBP_RESTRICT const it, int16_t levels[16], const uint8_t* WEBP_RESTRICT const src, uint8_t* WEBP_RESTRICT const yuv_out, int mode) { const VP8Encoder* const enc = it->enc_; const uint8_t* const ref = it->yuv_p_ + VP8I4ModeOffsets[mode]; const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_]; int nz = 0; int16_t tmp[16]; VP8FTransform(src, ref, tmp); if (DO_TRELLIS_I4 && it->do_trellis_) { const int x = it->i4_ & 3, y = it->i4_ >> 2; const int ctx = it->top_nz_[x] + it->left_nz_[y]; nz = TrellisQuantizeBlock(enc, tmp, levels, ctx, TYPE_I4_AC, &dqm->y1_, dqm->lambda_trellis_i4_); } else { nz = VP8EncQuantizeBlock(tmp, levels, &dqm->y1_); } VP8ITransform(ref, tmp, yuv_out, 0); return nz; } //------------------------------------------------------------------------------ // DC-error diffusion // Diffusion weights. We under-correct a bit (15/16th of the error is actually // diffused) to avoid 'rainbow' chessboard pattern of blocks at q~=0. #define C1 7 // fraction of error sent to the 4x4 block below #define C2 8 // fraction of error sent to the 4x4 block on the right #define DSHIFT 4 #define DSCALE 1 // storage descaling, needed to make the error fit int8_t // Quantize as usual, but also compute and return the quantization error. // Error is already divided by DSHIFT. static int QuantizeSingle(int16_t* WEBP_RESTRICT const v, const VP8Matrix* WEBP_RESTRICT const mtx) { int V = *v; const int sign = (V < 0); if (sign) V = -V; if (V > (int)mtx->zthresh_[0]) { const int qV = QUANTDIV(V, mtx->iq_[0], mtx->bias_[0]) * mtx->q_[0]; const int err = (V - qV); *v = sign ? -qV : qV; return (sign ? -err : err) >> DSCALE; } *v = 0; return (sign ? -V : V) >> DSCALE; } static void CorrectDCValues(const VP8EncIterator* WEBP_RESTRICT const it, const VP8Matrix* WEBP_RESTRICT const mtx, int16_t tmp[][16], VP8ModeScore* WEBP_RESTRICT const rd) { // | top[0] | top[1] // --------+--------+--------- // left[0] | tmp[0] tmp[1] <-> err0 err1 // left[1] | tmp[2] tmp[3] err2 err3 // // Final errors {err1,err2,err3} are preserved and later restored // as top[]/left[] on the next block. int ch; for (ch = 0; ch <= 1; ++ch) { const int8_t* const top = it->top_derr_[it->x_][ch]; const int8_t* const left = it->left_derr_[ch]; int16_t (* const c)[16] = &tmp[ch * 4]; int err0, err1, err2, err3; c[0][0] += (C1 * top[0] + C2 * left[0]) >> (DSHIFT - DSCALE); err0 = QuantizeSingle(&c[0][0], mtx); c[1][0] += (C1 * top[1] + C2 * err0) >> (DSHIFT - DSCALE); err1 = QuantizeSingle(&c[1][0], mtx); c[2][0] += (C1 * err0 + C2 * left[1]) >> (DSHIFT - DSCALE); err2 = QuantizeSingle(&c[2][0], mtx); c[3][0] += (C1 * err1 + C2 * err2) >> (DSHIFT - DSCALE); err3 = QuantizeSingle(&c[3][0], mtx); // error 'err' is bounded by mtx->q_[0] which is 132 at max. Hence // err >> DSCALE will fit in an int8_t type if DSCALE>=1. assert(abs(err1) <= 127 && abs(err2) <= 127 && abs(err3) <= 127); rd->derr[ch][0] = (int8_t)err1; rd->derr[ch][1] = (int8_t)err2; rd->derr[ch][2] = (int8_t)err3; } } static void StoreDiffusionErrors(VP8EncIterator* WEBP_RESTRICT const it, const VP8ModeScore* WEBP_RESTRICT const rd) { int ch; for (ch = 0; ch <= 1; ++ch) { int8_t* const top = it->top_derr_[it->x_][ch]; int8_t* const left = it->left_derr_[ch]; left[0] = rd->derr[ch][0]; // restore err1 left[1] = 3 * rd->derr[ch][2] >> 2; // ... 3/4th of err3 top[0] = rd->derr[ch][1]; // ... err2 top[1] = rd->derr[ch][2] - left[1]; // ... 1/4th of err3. } } #undef C1 #undef C2 #undef DSHIFT #undef DSCALE //------------------------------------------------------------------------------ static int ReconstructUV(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd, uint8_t* WEBP_RESTRICT const yuv_out, int mode) { const VP8Encoder* const enc = it->enc_; const uint8_t* const ref = it->yuv_p_ + VP8UVModeOffsets[mode]; const uint8_t* const src = it->yuv_in_ + U_OFF_ENC; const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_]; int nz = 0; int n; int16_t tmp[8][16]; for (n = 0; n < 8; n += 2) { VP8FTransform2(src + VP8ScanUV[n], ref + VP8ScanUV[n], tmp[n]); } if (it->top_derr_ != NULL) CorrectDCValues(it, &dqm->uv_, tmp, rd); if (DO_TRELLIS_UV && it->do_trellis_) { int ch, x, y; for (ch = 0, n = 0; ch <= 2; ch += 2) { for (y = 0; y < 2; ++y) { for (x = 0; x < 2; ++x, ++n) { const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y]; const int non_zero = TrellisQuantizeBlock( enc, tmp[n], rd->uv_levels[n], ctx, TYPE_CHROMA_A, &dqm->uv_, dqm->lambda_trellis_uv_); it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = non_zero; nz |= non_zero << n; } } } } else { for (n = 0; n < 8; n += 2) { nz |= VP8EncQuantize2Blocks(tmp[n], rd->uv_levels[n], &dqm->uv_) << n; } } for (n = 0; n < 8; n += 2) { VP8ITransform(ref + VP8ScanUV[n], tmp[n], yuv_out + VP8ScanUV[n], 1); } return (nz << 16); } //------------------------------------------------------------------------------ // RD-opt decision. Reconstruct each modes, evalue distortion and bit-cost. // Pick the mode is lower RD-cost = Rate + lambda * Distortion. static void StoreMaxDelta(VP8SegmentInfo* const dqm, const int16_t DCs[16]) { // We look at the first three AC coefficients to determine what is the average // delta between each sub-4x4 block. const int v0 = abs(DCs[1]); const int v1 = abs(DCs[2]); const int v2 = abs(DCs[4]); int max_v = (v1 > v0) ? v1 : v0; max_v = (v2 > max_v) ? v2 : max_v; if (max_v > dqm->max_edge_) dqm->max_edge_ = max_v; } static void SwapModeScore(VP8ModeScore** a, VP8ModeScore** b) { VP8ModeScore* const tmp = *a; *a = *b; *b = tmp; } static void SwapPtr(uint8_t** a, uint8_t** b) { uint8_t* const tmp = *a; *a = *b; *b = tmp; } static void SwapOut(VP8EncIterator* const it) { SwapPtr(&it->yuv_out_, &it->yuv_out2_); } static void PickBestIntra16(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT rd) { const int kNumBlocks = 16; VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_]; const int lambda = dqm->lambda_i16_; const int tlambda = dqm->tlambda_; const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC; VP8ModeScore rd_tmp; VP8ModeScore* rd_cur = &rd_tmp; VP8ModeScore* rd_best = rd; int mode; int is_flat = IsFlatSource16(it->yuv_in_ + Y_OFF_ENC); rd->mode_i16 = -1; for (mode = 0; mode < NUM_PRED_MODES; ++mode) { uint8_t* const tmp_dst = it->yuv_out2_ + Y_OFF_ENC; // scratch buffer rd_cur->mode_i16 = mode; // Reconstruct rd_cur->nz = ReconstructIntra16(it, rd_cur, tmp_dst, mode); // Measure RD-score rd_cur->D = VP8SSE16x16(src, tmp_dst); rd_cur->SD = tlambda ? MULT_8B(tlambda, VP8TDisto16x16(src, tmp_dst, kWeightY)) : 0; rd_cur->H = VP8FixedCostsI16[mode]; rd_cur->R = VP8GetCostLuma16(it, rd_cur); if (is_flat) { // refine the first impression (which was in pixel space) is_flat = IsFlat(rd_cur->y_ac_levels[0], kNumBlocks, FLATNESS_LIMIT_I16); if (is_flat) { // Block is very flat. We put emphasis on the distortion being very low! rd_cur->D *= 2; rd_cur->SD *= 2; } } // Since we always examine Intra16 first, we can overwrite *rd directly. SetRDScore(lambda, rd_cur); if (mode == 0 || rd_cur->score < rd_best->score) { SwapModeScore(&rd_cur, &rd_best); SwapOut(it); } } if (rd_best != rd) { memcpy(rd, rd_best, sizeof(*rd)); } SetRDScore(dqm->lambda_mode_, rd); // finalize score for mode decision. VP8SetIntra16Mode(it, rd->mode_i16); // we have a blocky macroblock (only DCs are non-zero) with fairly high // distortion, record max delta so we can later adjust the minimal filtering // strength needed to smooth these blocks out. if ((rd->nz & 0x100ffff) == 0x1000000 && rd->D > dqm->min_disto_) { StoreMaxDelta(dqm, rd->y_dc_levels); } } //------------------------------------------------------------------------------ // return the cost array corresponding to the surrounding prediction modes. static const uint16_t* GetCostModeI4(VP8EncIterator* WEBP_RESTRICT const it, const uint8_t modes[16]) { const int preds_w = it->enc_->preds_w_; const int x = (it->i4_ & 3), y = it->i4_ >> 2; const int left = (x == 0) ? it->preds_[y * preds_w - 1] : modes[it->i4_ - 1]; const int top = (y == 0) ? it->preds_[-preds_w + x] : modes[it->i4_ - 4]; return VP8FixedCostsI4[top][left]; } static int PickBestIntra4(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd) { const VP8Encoder* const enc = it->enc_; const VP8SegmentInfo* const dqm = &enc->dqm_[it->mb_->segment_]; const int lambda = dqm->lambda_i4_; const int tlambda = dqm->tlambda_; const uint8_t* const src0 = it->yuv_in_ + Y_OFF_ENC; uint8_t* const best_blocks = it->yuv_out2_ + Y_OFF_ENC; int total_header_bits = 0; VP8ModeScore rd_best; if (enc->max_i4_header_bits_ == 0) { return 0; } InitScore(&rd_best); rd_best.H = 211; // '211' is the value of VP8BitCost(0, 145) SetRDScore(dqm->lambda_mode_, &rd_best); VP8IteratorStartI4(it); do { const int kNumBlocks = 1; VP8ModeScore rd_i4; int mode; int best_mode = -1; const uint8_t* const src = src0 + VP8Scan[it->i4_]; const uint16_t* const mode_costs = GetCostModeI4(it, rd->modes_i4); uint8_t* best_block = best_blocks + VP8Scan[it->i4_]; uint8_t* tmp_dst = it->yuv_p_ + I4TMP; // scratch buffer. InitScore(&rd_i4); VP8MakeIntra4Preds(it); for (mode = 0; mode < NUM_BMODES; ++mode) { VP8ModeScore rd_tmp; int16_t tmp_levels[16]; // Reconstruct rd_tmp.nz = ReconstructIntra4(it, tmp_levels, src, tmp_dst, mode) << it->i4_; // Compute RD-score rd_tmp.D = VP8SSE4x4(src, tmp_dst); rd_tmp.SD = tlambda ? MULT_8B(tlambda, VP8TDisto4x4(src, tmp_dst, kWeightY)) : 0; rd_tmp.H = mode_costs[mode]; // Add flatness penalty, to avoid flat area to be mispredicted // by a complex mode. if (mode > 0 && IsFlat(tmp_levels, kNumBlocks, FLATNESS_LIMIT_I4)) { rd_tmp.R = FLATNESS_PENALTY * kNumBlocks; } else { rd_tmp.R = 0; } // early-out check SetRDScore(lambda, &rd_tmp); if (best_mode >= 0 && rd_tmp.score >= rd_i4.score) continue; // finish computing score rd_tmp.R += VP8GetCostLuma4(it, tmp_levels); SetRDScore(lambda, &rd_tmp); if (best_mode < 0 || rd_tmp.score < rd_i4.score) { CopyScore(&rd_i4, &rd_tmp); best_mode = mode; SwapPtr(&tmp_dst, &best_block); memcpy(rd_best.y_ac_levels[it->i4_], tmp_levels, sizeof(rd_best.y_ac_levels[it->i4_])); } } SetRDScore(dqm->lambda_mode_, &rd_i4); AddScore(&rd_best, &rd_i4); if (rd_best.score >= rd->score) { return 0; } total_header_bits += (int)rd_i4.H; // <- equal to mode_costs[best_mode]; if (total_header_bits > enc->max_i4_header_bits_) { return 0; } // Copy selected samples if not in the right place already. if (best_block != best_blocks + VP8Scan[it->i4_]) { VP8Copy4x4(best_block, best_blocks + VP8Scan[it->i4_]); } rd->modes_i4[it->i4_] = best_mode; it->top_nz_[it->i4_ & 3] = it->left_nz_[it->i4_ >> 2] = (rd_i4.nz ? 1 : 0); } while (VP8IteratorRotateI4(it, best_blocks)); // finalize state CopyScore(rd, &rd_best); VP8SetIntra4Mode(it, rd->modes_i4); SwapOut(it); memcpy(rd->y_ac_levels, rd_best.y_ac_levels, sizeof(rd->y_ac_levels)); return 1; // select intra4x4 over intra16x16 } //------------------------------------------------------------------------------ static void PickBestUV(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd) { const int kNumBlocks = 8; const VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_]; const int lambda = dqm->lambda_uv_; const uint8_t* const src = it->yuv_in_ + U_OFF_ENC; uint8_t* tmp_dst = it->yuv_out2_ + U_OFF_ENC; // scratch buffer uint8_t* dst0 = it->yuv_out_ + U_OFF_ENC; uint8_t* dst = dst0; VP8ModeScore rd_best; int mode; rd->mode_uv = -1; InitScore(&rd_best); for (mode = 0; mode < NUM_PRED_MODES; ++mode) { VP8ModeScore rd_uv; // Reconstruct rd_uv.nz = ReconstructUV(it, &rd_uv, tmp_dst, mode); // Compute RD-score rd_uv.D = VP8SSE16x8(src, tmp_dst); rd_uv.SD = 0; // not calling TDisto here: it tends to flatten areas. rd_uv.H = VP8FixedCostsUV[mode]; rd_uv.R = VP8GetCostUV(it, &rd_uv); if (mode > 0 && IsFlat(rd_uv.uv_levels[0], kNumBlocks, FLATNESS_LIMIT_UV)) { rd_uv.R += FLATNESS_PENALTY * kNumBlocks; } SetRDScore(lambda, &rd_uv); if (mode == 0 || rd_uv.score < rd_best.score) { CopyScore(&rd_best, &rd_uv); rd->mode_uv = mode; memcpy(rd->uv_levels, rd_uv.uv_levels, sizeof(rd->uv_levels)); if (it->top_derr_ != NULL) { memcpy(rd->derr, rd_uv.derr, sizeof(rd_uv.derr)); } SwapPtr(&dst, &tmp_dst); } } VP8SetIntraUVMode(it, rd->mode_uv); AddScore(rd, &rd_best); if (dst != dst0) { // copy 16x8 block if needed VP8Copy16x8(dst, dst0); } if (it->top_derr_ != NULL) { // store diffusion errors for next block StoreDiffusionErrors(it, rd); } } //------------------------------------------------------------------------------ // Final reconstruction and quantization. static void SimpleQuantize(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd) { const VP8Encoder* const enc = it->enc_; const int is_i16 = (it->mb_->type_ == 1); int nz = 0; if (is_i16) { nz = ReconstructIntra16(it, rd, it->yuv_out_ + Y_OFF_ENC, it->preds_[0]); } else { VP8IteratorStartI4(it); do { const int mode = it->preds_[(it->i4_ & 3) + (it->i4_ >> 2) * enc->preds_w_]; const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC + VP8Scan[it->i4_]; uint8_t* const dst = it->yuv_out_ + Y_OFF_ENC + VP8Scan[it->i4_]; VP8MakeIntra4Preds(it); nz |= ReconstructIntra4(it, rd->y_ac_levels[it->i4_], src, dst, mode) << it->i4_; } while (VP8IteratorRotateI4(it, it->yuv_out_ + Y_OFF_ENC)); } nz |= ReconstructUV(it, rd, it->yuv_out_ + U_OFF_ENC, it->mb_->uv_mode_); rd->nz = nz; } // Refine intra16/intra4 sub-modes based on distortion only (not rate). static void RefineUsingDistortion(VP8EncIterator* WEBP_RESTRICT const it, int try_both_modes, int refine_uv_mode, VP8ModeScore* WEBP_RESTRICT const rd) { score_t best_score = MAX_COST; int nz = 0; int mode; int is_i16 = try_both_modes || (it->mb_->type_ == 1); const VP8SegmentInfo* const dqm = &it->enc_->dqm_[it->mb_->segment_]; // Some empiric constants, of approximate order of magnitude. const int lambda_d_i16 = 106; const int lambda_d_i4 = 11; const int lambda_d_uv = 120; score_t score_i4 = dqm->i4_penalty_; score_t i4_bit_sum = 0; const score_t bit_limit = try_both_modes ? it->enc_->mb_header_limit_ : MAX_COST; // no early-out allowed if (is_i16) { // First, evaluate Intra16 distortion int best_mode = -1; const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC; for (mode = 0; mode < NUM_PRED_MODES; ++mode) { const uint8_t* const ref = it->yuv_p_ + VP8I16ModeOffsets[mode]; const score_t score = (score_t)VP8SSE16x16(src, ref) * RD_DISTO_MULT + VP8FixedCostsI16[mode] * lambda_d_i16; if (mode > 0 && VP8FixedCostsI16[mode] > bit_limit) { continue; } if (score < best_score) { best_mode = mode; best_score = score; } } if (it->x_ == 0 || it->y_ == 0) { // avoid starting a checkerboard resonance from the border. See bug #432. if (IsFlatSource16(src)) { best_mode = (it->x_ == 0) ? 0 : 2; try_both_modes = 0; // stick to i16 } } VP8SetIntra16Mode(it, best_mode); // we'll reconstruct later, if i16 mode actually gets selected } // Next, evaluate Intra4 if (try_both_modes || !is_i16) { // We don't evaluate the rate here, but just account for it through a // constant penalty (i4 mode usually needs more bits compared to i16). is_i16 = 0; VP8IteratorStartI4(it); do { int best_i4_mode = -1; score_t best_i4_score = MAX_COST; const uint8_t* const src = it->yuv_in_ + Y_OFF_ENC + VP8Scan[it->i4_]; const uint16_t* const mode_costs = GetCostModeI4(it, rd->modes_i4); VP8MakeIntra4Preds(it); for (mode = 0; mode < NUM_BMODES; ++mode) { const uint8_t* const ref = it->yuv_p_ + VP8I4ModeOffsets[mode]; const score_t score = VP8SSE4x4(src, ref) * RD_DISTO_MULT + mode_costs[mode] * lambda_d_i4; if (score < best_i4_score) { best_i4_mode = mode; best_i4_score = score; } } i4_bit_sum += mode_costs[best_i4_mode]; rd->modes_i4[it->i4_] = best_i4_mode; score_i4 += best_i4_score; if (score_i4 >= best_score || i4_bit_sum > bit_limit) { // Intra4 won't be better than Intra16. Bail out and pick Intra16. is_i16 = 1; break; } else { // reconstruct partial block inside yuv_out2_ buffer uint8_t* const tmp_dst = it->yuv_out2_ + Y_OFF_ENC + VP8Scan[it->i4_]; nz |= ReconstructIntra4(it, rd->y_ac_levels[it->i4_], src, tmp_dst, best_i4_mode) << it->i4_; } } while (VP8IteratorRotateI4(it, it->yuv_out2_ + Y_OFF_ENC)); } // Final reconstruction, depending on which mode is selected. if (!is_i16) { VP8SetIntra4Mode(it, rd->modes_i4); SwapOut(it); best_score = score_i4; } else { nz = ReconstructIntra16(it, rd, it->yuv_out_ + Y_OFF_ENC, it->preds_[0]); } // ... and UV! if (refine_uv_mode) { int best_mode = -1; score_t best_uv_score = MAX_COST; const uint8_t* const src = it->yuv_in_ + U_OFF_ENC; for (mode = 0; mode < NUM_PRED_MODES; ++mode) { const uint8_t* const ref = it->yuv_p_ + VP8UVModeOffsets[mode]; const score_t score = VP8SSE16x8(src, ref) * RD_DISTO_MULT + VP8FixedCostsUV[mode] * lambda_d_uv; if (score < best_uv_score) { best_mode = mode; best_uv_score = score; } } VP8SetIntraUVMode(it, best_mode); } nz |= ReconstructUV(it, rd, it->yuv_out_ + U_OFF_ENC, it->mb_->uv_mode_); rd->nz = nz; rd->score = best_score; } //------------------------------------------------------------------------------ // Entry point int VP8Decimate(VP8EncIterator* WEBP_RESTRICT const it, VP8ModeScore* WEBP_RESTRICT const rd, VP8RDLevel rd_opt) { int is_skipped; const int method = it->enc_->method_; InitScore(rd); // We can perform predictions for Luma16x16 and Chroma8x8 already. // Luma4x4 predictions needs to be done as-we-go. VP8MakeLuma16Preds(it); VP8MakeChroma8Preds(it); if (rd_opt > RD_OPT_NONE) { it->do_trellis_ = (rd_opt >= RD_OPT_TRELLIS_ALL); PickBestIntra16(it, rd); if (method >= 2) { PickBestIntra4(it, rd); } PickBestUV(it, rd); if (rd_opt == RD_OPT_TRELLIS) { // finish off with trellis-optim now it->do_trellis_ = 1; SimpleQuantize(it, rd); } } else { // At this point we have heuristically decided intra16 / intra4. // For method >= 2, pick the best intra4/intra16 based on SSE (~tad slower). // For method <= 1, we don't re-examine the decision but just go ahead with // quantization/reconstruction. RefineUsingDistortion(it, (method >= 2), (method >= 1), rd); } is_skipped = (rd->nz == 0); VP8SetSkip(it, is_skipped); return is_skipped; } libwebp-1.4.0/src/enc/frame_enc.c0000644000014400001440000007143714606317060013506 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // frame coding and analysis // // Author: Skal (pascal.massimino@gmail.com) #include #include #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" #include "src/dsp/dsp.h" #include "src/webp/format_constants.h" // RIFF constants #define SEGMENT_VISU 0 #define DEBUG_SEARCH 0 // useful to track search convergence //------------------------------------------------------------------------------ // multi-pass convergence #define HEADER_SIZE_ESTIMATE (RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE + \ VP8_FRAME_HEADER_SIZE) #define DQ_LIMIT 0.4 // convergence is considered reached if dq < DQ_LIMIT // we allow 2k of extra head-room in PARTITION0 limit. #define PARTITION0_SIZE_LIMIT ((VP8_MAX_PARTITION0_SIZE - 2048ULL) << 11) static float Clamp(float v, float min, float max) { return (v < min) ? min : (v > max) ? max : v; } typedef struct { // struct for organizing convergence in either size or PSNR int is_first; float dq; float q, last_q; float qmin, qmax; double value, last_value; // PSNR or size double target; int do_size_search; } PassStats; static int InitPassStats(const VP8Encoder* const enc, PassStats* const s) { const uint64_t target_size = (uint64_t)enc->config_->target_size; const int do_size_search = (target_size != 0); const float target_PSNR = enc->config_->target_PSNR; s->is_first = 1; s->dq = 10.f; s->qmin = 1.f * enc->config_->qmin; s->qmax = 1.f * enc->config_->qmax; s->q = s->last_q = Clamp(enc->config_->quality, s->qmin, s->qmax); s->target = do_size_search ? (double)target_size : (target_PSNR > 0.) ? target_PSNR : 40.; // default, just in case s->value = s->last_value = 0.; s->do_size_search = do_size_search; return do_size_search; } static float ComputeNextQ(PassStats* const s) { float dq; if (s->is_first) { dq = (s->value > s->target) ? -s->dq : s->dq; s->is_first = 0; } else if (s->value != s->last_value) { const double slope = (s->target - s->value) / (s->last_value - s->value); dq = (float)(slope * (s->last_q - s->q)); } else { dq = 0.; // we're done?! } // Limit variable to avoid large swings. s->dq = Clamp(dq, -30.f, 30.f); s->last_q = s->q; s->last_value = s->value; s->q = Clamp(s->q + s->dq, s->qmin, s->qmax); return s->q; } //------------------------------------------------------------------------------ // Tables for level coding const uint8_t VP8Cat3[] = { 173, 148, 140 }; const uint8_t VP8Cat4[] = { 176, 155, 140, 135 }; const uint8_t VP8Cat5[] = { 180, 157, 141, 134, 130 }; const uint8_t VP8Cat6[] = { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129 }; //------------------------------------------------------------------------------ // Reset the statistics about: number of skips, token proba, level cost,... static void ResetStats(VP8Encoder* const enc) { VP8EncProba* const proba = &enc->proba_; VP8CalculateLevelCosts(proba); proba->nb_skip_ = 0; } //------------------------------------------------------------------------------ // Skip decision probability #define SKIP_PROBA_THRESHOLD 250 // value below which using skip_proba is OK. static int CalcSkipProba(uint64_t nb, uint64_t total) { return (int)(total ? (total - nb) * 255 / total : 255); } // Returns the bit-cost for coding the skip probability. static int FinalizeSkipProba(VP8Encoder* const enc) { VP8EncProba* const proba = &enc->proba_; const int nb_mbs = enc->mb_w_ * enc->mb_h_; const int nb_events = proba->nb_skip_; int size; proba->skip_proba_ = CalcSkipProba(nb_events, nb_mbs); proba->use_skip_proba_ = (proba->skip_proba_ < SKIP_PROBA_THRESHOLD); size = 256; // 'use_skip_proba' bit if (proba->use_skip_proba_) { size += nb_events * VP8BitCost(1, proba->skip_proba_) + (nb_mbs - nb_events) * VP8BitCost(0, proba->skip_proba_); size += 8 * 256; // cost of signaling the skip_proba_ itself. } return size; } // Collect statistics and deduce probabilities for next coding pass. // Return the total bit-cost for coding the probability updates. static int CalcTokenProba(int nb, int total) { assert(nb <= total); return nb ? (255 - nb * 255 / total) : 255; } // Cost of coding 'nb' 1's and 'total-nb' 0's using 'proba' probability. static int BranchCost(int nb, int total, int proba) { return nb * VP8BitCost(1, proba) + (total - nb) * VP8BitCost(0, proba); } static void ResetTokenStats(VP8Encoder* const enc) { VP8EncProba* const proba = &enc->proba_; memset(proba->stats_, 0, sizeof(proba->stats_)); } static int FinalizeTokenProbas(VP8EncProba* const proba) { int has_changed = 0; int size = 0; int t, b, c, p; for (t = 0; t < NUM_TYPES; ++t) { for (b = 0; b < NUM_BANDS; ++b) { for (c = 0; c < NUM_CTX; ++c) { for (p = 0; p < NUM_PROBAS; ++p) { const proba_t stats = proba->stats_[t][b][c][p]; const int nb = (stats >> 0) & 0xffff; const int total = (stats >> 16) & 0xffff; const int update_proba = VP8CoeffsUpdateProba[t][b][c][p]; const int old_p = VP8CoeffsProba0[t][b][c][p]; const int new_p = CalcTokenProba(nb, total); const int old_cost = BranchCost(nb, total, old_p) + VP8BitCost(0, update_proba); const int new_cost = BranchCost(nb, total, new_p) + VP8BitCost(1, update_proba) + 8 * 256; const int use_new_p = (old_cost > new_cost); size += VP8BitCost(use_new_p, update_proba); if (use_new_p) { // only use proba that seem meaningful enough. proba->coeffs_[t][b][c][p] = new_p; has_changed |= (new_p != old_p); size += 8 * 256; } else { proba->coeffs_[t][b][c][p] = old_p; } } } } } proba->dirty_ = has_changed; return size; } //------------------------------------------------------------------------------ // Finalize Segment probability based on the coding tree static int GetProba(int a, int b) { const int total = a + b; return (total == 0) ? 255 // that's the default probability. : (255 * a + total / 2) / total; // rounded proba } static void ResetSegments(VP8Encoder* const enc) { int n; for (n = 0; n < enc->mb_w_ * enc->mb_h_; ++n) { enc->mb_info_[n].segment_ = 0; } } static void SetSegmentProbas(VP8Encoder* const enc) { int p[NUM_MB_SEGMENTS] = { 0 }; int n; for (n = 0; n < enc->mb_w_ * enc->mb_h_; ++n) { const VP8MBInfo* const mb = &enc->mb_info_[n]; ++p[mb->segment_]; } #if !defined(WEBP_DISABLE_STATS) if (enc->pic_->stats != NULL) { for (n = 0; n < NUM_MB_SEGMENTS; ++n) { enc->pic_->stats->segment_size[n] = p[n]; } } #endif if (enc->segment_hdr_.num_segments_ > 1) { uint8_t* const probas = enc->proba_.segments_; probas[0] = GetProba(p[0] + p[1], p[2] + p[3]); probas[1] = GetProba(p[0], p[1]); probas[2] = GetProba(p[2], p[3]); enc->segment_hdr_.update_map_ = (probas[0] != 255) || (probas[1] != 255) || (probas[2] != 255); if (!enc->segment_hdr_.update_map_) ResetSegments(enc); enc->segment_hdr_.size_ = p[0] * (VP8BitCost(0, probas[0]) + VP8BitCost(0, probas[1])) + p[1] * (VP8BitCost(0, probas[0]) + VP8BitCost(1, probas[1])) + p[2] * (VP8BitCost(1, probas[0]) + VP8BitCost(0, probas[2])) + p[3] * (VP8BitCost(1, probas[0]) + VP8BitCost(1, probas[2])); } else { enc->segment_hdr_.update_map_ = 0; enc->segment_hdr_.size_ = 0; } } //------------------------------------------------------------------------------ // Coefficient coding static int PutCoeffs(VP8BitWriter* const bw, int ctx, const VP8Residual* res) { int n = res->first; // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 const uint8_t* p = res->prob[n][ctx]; if (!VP8PutBit(bw, res->last >= 0, p[0])) { return 0; } while (n < 16) { const int c = res->coeffs[n++]; const int sign = c < 0; int v = sign ? -c : c; if (!VP8PutBit(bw, v != 0, p[1])) { p = res->prob[VP8EncBands[n]][0]; continue; } if (!VP8PutBit(bw, v > 1, p[2])) { p = res->prob[VP8EncBands[n]][1]; } else { if (!VP8PutBit(bw, v > 4, p[3])) { if (VP8PutBit(bw, v != 2, p[4])) { VP8PutBit(bw, v == 4, p[5]); } } else if (!VP8PutBit(bw, v > 10, p[6])) { if (!VP8PutBit(bw, v > 6, p[7])) { VP8PutBit(bw, v == 6, 159); } else { VP8PutBit(bw, v >= 9, 165); VP8PutBit(bw, !(v & 1), 145); } } else { int mask; const uint8_t* tab; if (v < 3 + (8 << 1)) { // VP8Cat3 (3b) VP8PutBit(bw, 0, p[8]); VP8PutBit(bw, 0, p[9]); v -= 3 + (8 << 0); mask = 1 << 2; tab = VP8Cat3; } else if (v < 3 + (8 << 2)) { // VP8Cat4 (4b) VP8PutBit(bw, 0, p[8]); VP8PutBit(bw, 1, p[9]); v -= 3 + (8 << 1); mask = 1 << 3; tab = VP8Cat4; } else if (v < 3 + (8 << 3)) { // VP8Cat5 (5b) VP8PutBit(bw, 1, p[8]); VP8PutBit(bw, 0, p[10]); v -= 3 + (8 << 2); mask = 1 << 4; tab = VP8Cat5; } else { // VP8Cat6 (11b) VP8PutBit(bw, 1, p[8]); VP8PutBit(bw, 1, p[10]); v -= 3 + (8 << 3); mask = 1 << 10; tab = VP8Cat6; } while (mask) { VP8PutBit(bw, !!(v & mask), *tab++); mask >>= 1; } } p = res->prob[VP8EncBands[n]][2]; } VP8PutBitUniform(bw, sign); if (n == 16 || !VP8PutBit(bw, n <= res->last, p[0])) { return 1; // EOB } } return 1; } static void CodeResiduals(VP8BitWriter* const bw, VP8EncIterator* const it, const VP8ModeScore* const rd) { int x, y, ch; VP8Residual res; uint64_t pos1, pos2, pos3; const int i16 = (it->mb_->type_ == 1); const int segment = it->mb_->segment_; VP8Encoder* const enc = it->enc_; VP8IteratorNzToBytes(it); pos1 = VP8BitWriterPos(bw); if (i16) { VP8InitResidual(0, 1, enc, &res); VP8SetResidualCoeffs(rd->y_dc_levels, &res); it->top_nz_[8] = it->left_nz_[8] = PutCoeffs(bw, it->top_nz_[8] + it->left_nz_[8], &res); VP8InitResidual(1, 0, enc, &res); } else { VP8InitResidual(0, 3, enc, &res); } // luma-AC for (y = 0; y < 4; ++y) { for (x = 0; x < 4; ++x) { const int ctx = it->top_nz_[x] + it->left_nz_[y]; VP8SetResidualCoeffs(rd->y_ac_levels[x + y * 4], &res); it->top_nz_[x] = it->left_nz_[y] = PutCoeffs(bw, ctx, &res); } } pos2 = VP8BitWriterPos(bw); // U/V VP8InitResidual(0, 2, enc, &res); for (ch = 0; ch <= 2; ch += 2) { for (y = 0; y < 2; ++y) { for (x = 0; x < 2; ++x) { const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y]; VP8SetResidualCoeffs(rd->uv_levels[ch * 2 + x + y * 2], &res); it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = PutCoeffs(bw, ctx, &res); } } } pos3 = VP8BitWriterPos(bw); it->luma_bits_ = pos2 - pos1; it->uv_bits_ = pos3 - pos2; it->bit_count_[segment][i16] += it->luma_bits_; it->bit_count_[segment][2] += it->uv_bits_; VP8IteratorBytesToNz(it); } // Same as CodeResiduals, but doesn't actually write anything. // Instead, it just records the event distribution. static void RecordResiduals(VP8EncIterator* const it, const VP8ModeScore* const rd) { int x, y, ch; VP8Residual res; VP8Encoder* const enc = it->enc_; VP8IteratorNzToBytes(it); if (it->mb_->type_ == 1) { // i16x16 VP8InitResidual(0, 1, enc, &res); VP8SetResidualCoeffs(rd->y_dc_levels, &res); it->top_nz_[8] = it->left_nz_[8] = VP8RecordCoeffs(it->top_nz_[8] + it->left_nz_[8], &res); VP8InitResidual(1, 0, enc, &res); } else { VP8InitResidual(0, 3, enc, &res); } // luma-AC for (y = 0; y < 4; ++y) { for (x = 0; x < 4; ++x) { const int ctx = it->top_nz_[x] + it->left_nz_[y]; VP8SetResidualCoeffs(rd->y_ac_levels[x + y * 4], &res); it->top_nz_[x] = it->left_nz_[y] = VP8RecordCoeffs(ctx, &res); } } // U/V VP8InitResidual(0, 2, enc, &res); for (ch = 0; ch <= 2; ch += 2) { for (y = 0; y < 2; ++y) { for (x = 0; x < 2; ++x) { const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y]; VP8SetResidualCoeffs(rd->uv_levels[ch * 2 + x + y * 2], &res); it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = VP8RecordCoeffs(ctx, &res); } } } VP8IteratorBytesToNz(it); } //------------------------------------------------------------------------------ // Token buffer #if !defined(DISABLE_TOKEN_BUFFER) static int RecordTokens(VP8EncIterator* const it, const VP8ModeScore* const rd, VP8TBuffer* const tokens) { int x, y, ch; VP8Residual res; VP8Encoder* const enc = it->enc_; VP8IteratorNzToBytes(it); if (it->mb_->type_ == 1) { // i16x16 const int ctx = it->top_nz_[8] + it->left_nz_[8]; VP8InitResidual(0, 1, enc, &res); VP8SetResidualCoeffs(rd->y_dc_levels, &res); it->top_nz_[8] = it->left_nz_[8] = VP8RecordCoeffTokens(ctx, &res, tokens); VP8InitResidual(1, 0, enc, &res); } else { VP8InitResidual(0, 3, enc, &res); } // luma-AC for (y = 0; y < 4; ++y) { for (x = 0; x < 4; ++x) { const int ctx = it->top_nz_[x] + it->left_nz_[y]; VP8SetResidualCoeffs(rd->y_ac_levels[x + y * 4], &res); it->top_nz_[x] = it->left_nz_[y] = VP8RecordCoeffTokens(ctx, &res, tokens); } } // U/V VP8InitResidual(0, 2, enc, &res); for (ch = 0; ch <= 2; ch += 2) { for (y = 0; y < 2; ++y) { for (x = 0; x < 2; ++x) { const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y]; VP8SetResidualCoeffs(rd->uv_levels[ch * 2 + x + y * 2], &res); it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = VP8RecordCoeffTokens(ctx, &res, tokens); } } } VP8IteratorBytesToNz(it); return !tokens->error_; } #endif // !DISABLE_TOKEN_BUFFER //------------------------------------------------------------------------------ // ExtraInfo map / Debug function #if !defined(WEBP_DISABLE_STATS) #if SEGMENT_VISU static void SetBlock(uint8_t* p, int value, int size) { int y; for (y = 0; y < size; ++y) { memset(p, value, size); p += BPS; } } #endif static void ResetSSE(VP8Encoder* const enc) { enc->sse_[0] = 0; enc->sse_[1] = 0; enc->sse_[2] = 0; // Note: enc->sse_[3] is managed by alpha.c enc->sse_count_ = 0; } static void StoreSSE(const VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; const uint8_t* const in = it->yuv_in_; const uint8_t* const out = it->yuv_out_; // Note: not totally accurate at boundary. And doesn't include in-loop filter. enc->sse_[0] += VP8SSE16x16(in + Y_OFF_ENC, out + Y_OFF_ENC); enc->sse_[1] += VP8SSE8x8(in + U_OFF_ENC, out + U_OFF_ENC); enc->sse_[2] += VP8SSE8x8(in + V_OFF_ENC, out + V_OFF_ENC); enc->sse_count_ += 16 * 16; } static void StoreSideInfo(const VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; const VP8MBInfo* const mb = it->mb_; WebPPicture* const pic = enc->pic_; if (pic->stats != NULL) { StoreSSE(it); enc->block_count_[0] += (mb->type_ == 0); enc->block_count_[1] += (mb->type_ == 1); enc->block_count_[2] += (mb->skip_ != 0); } if (pic->extra_info != NULL) { uint8_t* const info = &pic->extra_info[it->x_ + it->y_ * enc->mb_w_]; switch (pic->extra_info_type) { case 1: *info = mb->type_; break; case 2: *info = mb->segment_; break; case 3: *info = enc->dqm_[mb->segment_].quant_; break; case 4: *info = (mb->type_ == 1) ? it->preds_[0] : 0xff; break; case 5: *info = mb->uv_mode_; break; case 6: { const int b = (int)((it->luma_bits_ + it->uv_bits_ + 7) >> 3); *info = (b > 255) ? 255 : b; break; } case 7: *info = mb->alpha_; break; default: *info = 0; break; } } #if SEGMENT_VISU // visualize segments and prediction modes SetBlock(it->yuv_out_ + Y_OFF_ENC, mb->segment_ * 64, 16); SetBlock(it->yuv_out_ + U_OFF_ENC, it->preds_[0] * 64, 8); SetBlock(it->yuv_out_ + V_OFF_ENC, mb->uv_mode_ * 64, 8); #endif } static void ResetSideInfo(const VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; WebPPicture* const pic = enc->pic_; if (pic->stats != NULL) { memset(enc->block_count_, 0, sizeof(enc->block_count_)); } ResetSSE(enc); } #else // defined(WEBP_DISABLE_STATS) static void ResetSSE(VP8Encoder* const enc) { (void)enc; } static void StoreSideInfo(const VP8EncIterator* const it) { VP8Encoder* const enc = it->enc_; WebPPicture* const pic = enc->pic_; if (pic->extra_info != NULL) { if (it->x_ == 0 && it->y_ == 0) { // only do it once, at start memset(pic->extra_info, 0, enc->mb_w_ * enc->mb_h_ * sizeof(*pic->extra_info)); } } } static void ResetSideInfo(const VP8EncIterator* const it) { (void)it; } #endif // !defined(WEBP_DISABLE_STATS) static double GetPSNR(uint64_t mse, uint64_t size) { return (mse > 0 && size > 0) ? 10. * log10(255. * 255. * size / mse) : 99; } //------------------------------------------------------------------------------ // StatLoop(): only collect statistics (number of skips, token usage, ...). // This is used for deciding optimal probabilities. It also modifies the // quantizer value if some target (size, PSNR) was specified. static void SetLoopParams(VP8Encoder* const enc, float q) { // Make sure the quality parameter is inside valid bounds q = Clamp(q, 0.f, 100.f); VP8SetSegmentParams(enc, q); // setup segment quantizations and filters SetSegmentProbas(enc); // compute segment probabilities ResetStats(enc); ResetSSE(enc); } static uint64_t OneStatPass(VP8Encoder* const enc, VP8RDLevel rd_opt, int nb_mbs, int percent_delta, PassStats* const s) { VP8EncIterator it; uint64_t size = 0; uint64_t size_p0 = 0; uint64_t distortion = 0; const uint64_t pixel_count = (uint64_t)nb_mbs * 384; VP8IteratorInit(enc, &it); SetLoopParams(enc, s->q); do { VP8ModeScore info; VP8IteratorImport(&it, NULL); if (VP8Decimate(&it, &info, rd_opt)) { // Just record the number of skips and act like skip_proba is not used. ++enc->proba_.nb_skip_; } RecordResiduals(&it, &info); size += info.R + info.H; size_p0 += info.H; distortion += info.D; if (percent_delta && !VP8IteratorProgress(&it, percent_delta)) { return 0; } VP8IteratorSaveBoundary(&it); } while (VP8IteratorNext(&it) && --nb_mbs > 0); size_p0 += enc->segment_hdr_.size_; if (s->do_size_search) { size += FinalizeSkipProba(enc); size += FinalizeTokenProbas(&enc->proba_); size = ((size + size_p0 + 1024) >> 11) + HEADER_SIZE_ESTIMATE; s->value = (double)size; } else { s->value = GetPSNR(distortion, pixel_count); } return size_p0; } static int StatLoop(VP8Encoder* const enc) { const int method = enc->method_; const int do_search = enc->do_search_; const int fast_probe = ((method == 0 || method == 3) && !do_search); int num_pass_left = enc->config_->pass; const int task_percent = 20; const int percent_per_pass = (task_percent + num_pass_left / 2) / num_pass_left; const int final_percent = enc->percent_ + task_percent; const VP8RDLevel rd_opt = (method >= 3 || do_search) ? RD_OPT_BASIC : RD_OPT_NONE; int nb_mbs = enc->mb_w_ * enc->mb_h_; PassStats stats; InitPassStats(enc, &stats); ResetTokenStats(enc); // Fast mode: quick analysis pass over few mbs. Better than nothing. if (fast_probe) { if (method == 3) { // we need more stats for method 3 to be reliable. nb_mbs = (nb_mbs > 200) ? nb_mbs >> 1 : 100; } else { nb_mbs = (nb_mbs > 200) ? nb_mbs >> 2 : 50; } } while (num_pass_left-- > 0) { const int is_last_pass = (fabs(stats.dq) <= DQ_LIMIT) || (num_pass_left == 0) || (enc->max_i4_header_bits_ == 0); const uint64_t size_p0 = OneStatPass(enc, rd_opt, nb_mbs, percent_per_pass, &stats); if (size_p0 == 0) return 0; #if (DEBUG_SEARCH > 0) printf("#%d value:%.1lf -> %.1lf q:%.2f -> %.2f\n", num_pass_left, stats.last_value, stats.value, stats.last_q, stats.q); #endif if (enc->max_i4_header_bits_ > 0 && size_p0 > PARTITION0_SIZE_LIMIT) { ++num_pass_left; enc->max_i4_header_bits_ >>= 1; // strengthen header bit limitation... continue; // ...and start over } if (is_last_pass) { break; } // If no target size: just do several pass without changing 'q' if (do_search) { ComputeNextQ(&stats); if (fabs(stats.dq) <= DQ_LIMIT) break; } } if (!do_search || !stats.do_size_search) { // Need to finalize probas now, since it wasn't done during the search. FinalizeSkipProba(enc); FinalizeTokenProbas(&enc->proba_); } VP8CalculateLevelCosts(&enc->proba_); // finalize costs return WebPReportProgress(enc->pic_, final_percent, &enc->percent_); } //------------------------------------------------------------------------------ // Main loops // static const uint8_t kAverageBytesPerMB[8] = { 50, 24, 16, 9, 7, 5, 3, 2 }; static int PreLoopInitialize(VP8Encoder* const enc) { int p; int ok = 1; const int average_bytes_per_MB = kAverageBytesPerMB[enc->base_quant_ >> 4]; const int bytes_per_parts = enc->mb_w_ * enc->mb_h_ * average_bytes_per_MB / enc->num_parts_; // Initialize the bit-writers for (p = 0; ok && p < enc->num_parts_; ++p) { ok = VP8BitWriterInit(enc->parts_ + p, bytes_per_parts); } if (!ok) { VP8EncFreeBitWriters(enc); // malloc error occurred return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } return ok; } static int PostLoopFinalize(VP8EncIterator* const it, int ok) { VP8Encoder* const enc = it->enc_; if (ok) { // Finalize the partitions, check for extra errors. int p; for (p = 0; p < enc->num_parts_; ++p) { VP8BitWriterFinish(enc->parts_ + p); ok &= !enc->parts_[p].error_; } } if (ok) { // All good. Finish up. #if !defined(WEBP_DISABLE_STATS) if (enc->pic_->stats != NULL) { // finalize byte counters... int i, s; for (i = 0; i <= 2; ++i) { for (s = 0; s < NUM_MB_SEGMENTS; ++s) { enc->residual_bytes_[i][s] = (int)((it->bit_count_[s][i] + 7) >> 3); } } } #endif VP8AdjustFilterStrength(it); // ...and store filter stats. } else { // Something bad happened -> need to do some memory cleanup. VP8EncFreeBitWriters(enc); return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } return ok; } //------------------------------------------------------------------------------ // VP8EncLoop(): does the final bitstream coding. static void ResetAfterSkip(VP8EncIterator* const it) { if (it->mb_->type_ == 1) { *it->nz_ = 0; // reset all predictors it->left_nz_[8] = 0; } else { *it->nz_ &= (1 << 24); // preserve the dc_nz bit } } int VP8EncLoop(VP8Encoder* const enc) { VP8EncIterator it; int ok = PreLoopInitialize(enc); if (!ok) return 0; StatLoop(enc); // stats-collection loop VP8IteratorInit(enc, &it); VP8InitFilter(&it); do { VP8ModeScore info; const int dont_use_skip = !enc->proba_.use_skip_proba_; const VP8RDLevel rd_opt = enc->rd_opt_level_; VP8IteratorImport(&it, NULL); // Warning! order is important: first call VP8Decimate() and // *then* decide how to code the skip decision if there's one. if (!VP8Decimate(&it, &info, rd_opt) || dont_use_skip) { CodeResiduals(it.bw_, &it, &info); if (it.bw_->error_) { // enc->pic_->error_code is set in PostLoopFinalize(). ok = 0; break; } } else { // reset predictors after a skip ResetAfterSkip(&it); } StoreSideInfo(&it); VP8StoreFilterStats(&it); VP8IteratorExport(&it); ok = VP8IteratorProgress(&it, 20); VP8IteratorSaveBoundary(&it); } while (ok && VP8IteratorNext(&it)); return PostLoopFinalize(&it, ok); } //------------------------------------------------------------------------------ // Single pass using Token Buffer. #if !defined(DISABLE_TOKEN_BUFFER) #define MIN_COUNT 96 // minimum number of macroblocks before updating stats int VP8EncTokenLoop(VP8Encoder* const enc) { // Roughly refresh the proba eight times per pass int max_count = (enc->mb_w_ * enc->mb_h_) >> 3; int num_pass_left = enc->config_->pass; int remaining_progress = 40; // percents const int do_search = enc->do_search_; VP8EncIterator it; VP8EncProba* const proba = &enc->proba_; const VP8RDLevel rd_opt = enc->rd_opt_level_; const uint64_t pixel_count = (uint64_t)enc->mb_w_ * enc->mb_h_ * 384; PassStats stats; int ok; InitPassStats(enc, &stats); ok = PreLoopInitialize(enc); if (!ok) return 0; if (max_count < MIN_COUNT) max_count = MIN_COUNT; assert(enc->num_parts_ == 1); assert(enc->use_tokens_); assert(proba->use_skip_proba_ == 0); assert(rd_opt >= RD_OPT_BASIC); // otherwise, token-buffer won't be useful assert(num_pass_left > 0); while (ok && num_pass_left-- > 0) { const int is_last_pass = (fabs(stats.dq) <= DQ_LIMIT) || (num_pass_left == 0) || (enc->max_i4_header_bits_ == 0); uint64_t size_p0 = 0; uint64_t distortion = 0; int cnt = max_count; // The final number of passes is not trivial to know in advance. const int pass_progress = remaining_progress / (2 + num_pass_left); remaining_progress -= pass_progress; VP8IteratorInit(enc, &it); SetLoopParams(enc, stats.q); if (is_last_pass) { ResetTokenStats(enc); VP8InitFilter(&it); // don't collect stats until last pass (too costly) } VP8TBufferClear(&enc->tokens_); do { VP8ModeScore info; VP8IteratorImport(&it, NULL); if (--cnt < 0) { FinalizeTokenProbas(proba); VP8CalculateLevelCosts(proba); // refresh cost tables for rd-opt cnt = max_count; } VP8Decimate(&it, &info, rd_opt); ok = RecordTokens(&it, &info, &enc->tokens_); if (!ok) { WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); break; } size_p0 += info.H; distortion += info.D; if (is_last_pass) { StoreSideInfo(&it); VP8StoreFilterStats(&it); VP8IteratorExport(&it); ok = VP8IteratorProgress(&it, pass_progress); } VP8IteratorSaveBoundary(&it); } while (ok && VP8IteratorNext(&it)); if (!ok) break; size_p0 += enc->segment_hdr_.size_; if (stats.do_size_search) { uint64_t size = FinalizeTokenProbas(&enc->proba_); size += VP8EstimateTokenSize(&enc->tokens_, (const uint8_t*)proba->coeffs_); size = (size + size_p0 + 1024) >> 11; // -> size in bytes size += HEADER_SIZE_ESTIMATE; stats.value = (double)size; } else { // compute and store PSNR stats.value = GetPSNR(distortion, pixel_count); } #if (DEBUG_SEARCH > 0) printf("#%2d metric:%.1lf -> %.1lf last_q=%.2lf q=%.2lf dq=%.2lf " " range:[%.1f, %.1f]\n", num_pass_left, stats.last_value, stats.value, stats.last_q, stats.q, stats.dq, stats.qmin, stats.qmax); #endif if (enc->max_i4_header_bits_ > 0 && size_p0 > PARTITION0_SIZE_LIMIT) { ++num_pass_left; enc->max_i4_header_bits_ >>= 1; // strengthen header bit limitation... if (is_last_pass) { ResetSideInfo(&it); } continue; // ...and start over } if (is_last_pass) { break; // done } if (do_search) { ComputeNextQ(&stats); // Adjust q } } if (ok) { if (!stats.do_size_search) { FinalizeTokenProbas(&enc->proba_); } ok = VP8EmitTokens(&enc->tokens_, enc->parts_ + 0, (const uint8_t*)proba->coeffs_, 1); } ok = ok && WebPReportProgress(enc->pic_, enc->percent_ + remaining_progress, &enc->percent_); return PostLoopFinalize(&it, ok); } #else int VP8EncTokenLoop(VP8Encoder* const enc) { (void)enc; return 0; // we shouldn't be here. } #endif // DISABLE_TOKEN_BUFFER //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/backward_references_enc.h0000644000014400001440000002116414606317060016370 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // #ifndef WEBP_ENC_BACKWARD_REFERENCES_ENC_H_ #define WEBP_ENC_BACKWARD_REFERENCES_ENC_H_ #include #include #include "src/webp/types.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" #ifdef __cplusplus extern "C" { #endif // The maximum allowed limit is 11. #define MAX_COLOR_CACHE_BITS 10 // ----------------------------------------------------------------------------- // PixOrCopy enum Mode { kLiteral, kCacheIdx, kCopy, kNone }; typedef struct { // mode as uint8_t to make the memory layout to be exactly 8 bytes. uint8_t mode; uint16_t len; uint32_t argb_or_distance; } PixOrCopy; static WEBP_INLINE PixOrCopy PixOrCopyCreateCopy(uint32_t distance, uint16_t len) { PixOrCopy retval; retval.mode = kCopy; retval.argb_or_distance = distance; retval.len = len; return retval; } static WEBP_INLINE PixOrCopy PixOrCopyCreateCacheIdx(int idx) { PixOrCopy retval; assert(idx >= 0); assert(idx < (1 << MAX_COLOR_CACHE_BITS)); retval.mode = kCacheIdx; retval.argb_or_distance = idx; retval.len = 1; return retval; } static WEBP_INLINE PixOrCopy PixOrCopyCreateLiteral(uint32_t argb) { PixOrCopy retval; retval.mode = kLiteral; retval.argb_or_distance = argb; retval.len = 1; return retval; } static WEBP_INLINE int PixOrCopyIsLiteral(const PixOrCopy* const p) { return (p->mode == kLiteral); } static WEBP_INLINE int PixOrCopyIsCacheIdx(const PixOrCopy* const p) { return (p->mode == kCacheIdx); } static WEBP_INLINE int PixOrCopyIsCopy(const PixOrCopy* const p) { return (p->mode == kCopy); } static WEBP_INLINE uint32_t PixOrCopyLiteral(const PixOrCopy* const p, int component) { assert(p->mode == kLiteral); return (p->argb_or_distance >> (component * 8)) & 0xff; } static WEBP_INLINE uint32_t PixOrCopyLength(const PixOrCopy* const p) { return p->len; } static WEBP_INLINE uint32_t PixOrCopyCacheIdx(const PixOrCopy* const p) { assert(p->mode == kCacheIdx); assert(p->argb_or_distance < (1U << MAX_COLOR_CACHE_BITS)); return p->argb_or_distance; } static WEBP_INLINE uint32_t PixOrCopyDistance(const PixOrCopy* const p) { assert(p->mode == kCopy); return p->argb_or_distance; } // ----------------------------------------------------------------------------- // VP8LHashChain #define HASH_BITS 18 #define HASH_SIZE (1 << HASH_BITS) // If you change this, you need MAX_LENGTH_BITS + WINDOW_SIZE_BITS <= 32 as it // is used in VP8LHashChain. #define MAX_LENGTH_BITS 12 #define WINDOW_SIZE_BITS 20 // We want the max value to be attainable and stored in MAX_LENGTH_BITS bits. #define MAX_LENGTH ((1 << MAX_LENGTH_BITS) - 1) #if MAX_LENGTH_BITS + WINDOW_SIZE_BITS > 32 #error "MAX_LENGTH_BITS + WINDOW_SIZE_BITS > 32" #endif typedef struct VP8LHashChain VP8LHashChain; struct VP8LHashChain { // The 20 most significant bits contain the offset at which the best match // is found. These 20 bits are the limit defined by GetWindowSizeForHashChain // (through WINDOW_SIZE = 1<<20). // The lower 12 bits contain the length of the match. The 12 bit limit is // defined in MaxFindCopyLength with MAX_LENGTH=4096. uint32_t* offset_length_; // This is the maximum size of the hash_chain that can be constructed. // Typically this is the pixel count (width x height) for a given image. int size_; }; // Must be called first, to set size. int VP8LHashChainInit(VP8LHashChain* const p, int size); // Pre-compute the best matches for argb. pic and percent are for progress. int VP8LHashChainFill(VP8LHashChain* const p, int quality, const uint32_t* const argb, int xsize, int ysize, int low_effort, const WebPPicture* const pic, int percent_range, int* const percent); void VP8LHashChainClear(VP8LHashChain* const p); // release memory static WEBP_INLINE int VP8LHashChainFindOffset(const VP8LHashChain* const p, const int base_position) { return p->offset_length_[base_position] >> MAX_LENGTH_BITS; } static WEBP_INLINE int VP8LHashChainFindLength(const VP8LHashChain* const p, const int base_position) { return p->offset_length_[base_position] & ((1U << MAX_LENGTH_BITS) - 1); } static WEBP_INLINE void VP8LHashChainFindCopy(const VP8LHashChain* const p, int base_position, int* const offset_ptr, int* const length_ptr) { *offset_ptr = VP8LHashChainFindOffset(p, base_position); *length_ptr = VP8LHashChainFindLength(p, base_position); } // ----------------------------------------------------------------------------- // VP8LBackwardRefs (block-based backward-references storage) // maximum number of reference blocks the image will be segmented into #define MAX_REFS_BLOCK_PER_IMAGE 16 typedef struct PixOrCopyBlock PixOrCopyBlock; // forward declaration typedef struct VP8LBackwardRefs VP8LBackwardRefs; // Container for blocks chain struct VP8LBackwardRefs { int block_size_; // common block-size int error_; // set to true if some memory error occurred PixOrCopyBlock* refs_; // list of currently used blocks PixOrCopyBlock** tail_; // for list recycling PixOrCopyBlock* free_blocks_; // free-list PixOrCopyBlock* last_block_; // used for adding new refs (internal) }; // Initialize the object. 'block_size' is the common block size to store // references (typically, width * height / MAX_REFS_BLOCK_PER_IMAGE). void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size); // Release memory for backward references. void VP8LBackwardRefsClear(VP8LBackwardRefs* const refs); // Cursor for iterating on references content typedef struct { // public: PixOrCopy* cur_pos; // current position // private: PixOrCopyBlock* cur_block_; // current block in the refs list const PixOrCopy* last_pos_; // sentinel for switching to next block } VP8LRefsCursor; // Returns a cursor positioned at the beginning of the references list. VP8LRefsCursor VP8LRefsCursorInit(const VP8LBackwardRefs* const refs); // Returns true if cursor is pointing at a valid position. static WEBP_INLINE int VP8LRefsCursorOk(const VP8LRefsCursor* const c) { return (c->cur_pos != NULL); } // Move to next block of references. Internal, not to be called directly. void VP8LRefsCursorNextBlock(VP8LRefsCursor* const c); // Move to next position, or NULL. Should not be called if !VP8LRefsCursorOk(). static WEBP_INLINE void VP8LRefsCursorNext(VP8LRefsCursor* const c) { assert(c != NULL); assert(VP8LRefsCursorOk(c)); if (++c->cur_pos == c->last_pos_) VP8LRefsCursorNextBlock(c); } // ----------------------------------------------------------------------------- // Main entry points enum VP8LLZ77Type { kLZ77Standard = 1, kLZ77RLE = 2, kLZ77Box = 4 }; // Evaluates best possible backward references for specified quality. // The input cache_bits to 'VP8LGetBackwardReferences' sets the maximum cache // bits to use (passing 0 implies disabling the local color cache). // The optimal cache bits is evaluated and set for the *cache_bits_best // parameter with the matching refs_best. // If do_no_cache == 0, refs is an array of 2 values and the best // VP8LBackwardRefs is put in the first element. // If do_no_cache != 0, refs is an array of 3 values and the best // VP8LBackwardRefs is put in the first element, the best value with no-cache in // the second element. // In both cases, the last element is used as temporary internally. // pic and percent are for progress. // Returns false in case of error (stored in pic->error_code). int VP8LGetBackwardReferences( int width, int height, const uint32_t* const argb, int quality, int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs, int* const cache_bits_best, const WebPPicture* const pic, int percent_range, int* const percent); #ifdef __cplusplus } #endif #endif // WEBP_ENC_BACKWARD_REFERENCES_ENC_H_ libwebp-1.4.0/src/enc/histogram_enc.c0000644000014400001440000013465214606317060014410 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include #include #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/enc/backward_references_enc.h" #include "src/enc/histogram_enc.h" #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" #define MAX_BIT_COST FLT_MAX // Number of partitions for the three dominant (literal, red and blue) symbol // costs. #define NUM_PARTITIONS 4 // The size of the bin-hash corresponding to the three dominant costs. #define BIN_SIZE (NUM_PARTITIONS * NUM_PARTITIONS * NUM_PARTITIONS) // Maximum number of histograms allowed in greedy combining algorithm. #define MAX_HISTO_GREEDY 100 static void HistogramClear(VP8LHistogram* const p) { uint32_t* const literal = p->literal_; const int cache_bits = p->palette_code_bits_; const int histo_size = VP8LGetHistogramSize(cache_bits); memset(p, 0, histo_size); p->palette_code_bits_ = cache_bits; p->literal_ = literal; } // Swap two histogram pointers. static void HistogramSwap(VP8LHistogram** const A, VP8LHistogram** const B) { VP8LHistogram* const tmp = *A; *A = *B; *B = tmp; } static void HistogramCopy(const VP8LHistogram* const src, VP8LHistogram* const dst) { uint32_t* const dst_literal = dst->literal_; const int dst_cache_bits = dst->palette_code_bits_; const int literal_size = VP8LHistogramNumCodes(dst_cache_bits); const int histo_size = VP8LGetHistogramSize(dst_cache_bits); assert(src->palette_code_bits_ == dst_cache_bits); memcpy(dst, src, histo_size); dst->literal_ = dst_literal; memcpy(dst->literal_, src->literal_, literal_size * sizeof(*dst->literal_)); } int VP8LGetHistogramSize(int cache_bits) { const int literal_size = VP8LHistogramNumCodes(cache_bits); const size_t total_size = sizeof(VP8LHistogram) + sizeof(int) * literal_size; assert(total_size <= (size_t)0x7fffffff); return (int)total_size; } void VP8LFreeHistogram(VP8LHistogram* const histo) { WebPSafeFree(histo); } void VP8LFreeHistogramSet(VP8LHistogramSet* const histo) { WebPSafeFree(histo); } void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs, VP8LHistogram* const histo) { VP8LRefsCursor c = VP8LRefsCursorInit(refs); while (VP8LRefsCursorOk(&c)) { VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, NULL, 0); VP8LRefsCursorNext(&c); } } void VP8LHistogramCreate(VP8LHistogram* const p, const VP8LBackwardRefs* const refs, int palette_code_bits) { if (palette_code_bits >= 0) { p->palette_code_bits_ = palette_code_bits; } HistogramClear(p); VP8LHistogramStoreRefs(refs, p); } void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits, int init_arrays) { p->palette_code_bits_ = palette_code_bits; if (init_arrays) { HistogramClear(p); } else { p->trivial_symbol_ = 0; p->bit_cost_ = 0.; p->literal_cost_ = 0.; p->red_cost_ = 0.; p->blue_cost_ = 0.; memset(p->is_used_, 0, sizeof(p->is_used_)); } } VP8LHistogram* VP8LAllocateHistogram(int cache_bits) { VP8LHistogram* histo = NULL; const int total_size = VP8LGetHistogramSize(cache_bits); uint8_t* const memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory)); if (memory == NULL) return NULL; histo = (VP8LHistogram*)memory; // literal_ won't necessary be aligned. histo->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram)); VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 0); return histo; } // Resets the pointers of the histograms to point to the bit buffer in the set. static void HistogramSetResetPointers(VP8LHistogramSet* const set, int cache_bits) { int i; const int histo_size = VP8LGetHistogramSize(cache_bits); uint8_t* memory = (uint8_t*) (set->histograms); memory += set->max_size * sizeof(*set->histograms); for (i = 0; i < set->max_size; ++i) { memory = (uint8_t*) WEBP_ALIGN(memory); set->histograms[i] = (VP8LHistogram*) memory; // literal_ won't necessary be aligned. set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram)); memory += histo_size; } } // Returns the total size of the VP8LHistogramSet. static size_t HistogramSetTotalSize(int size, int cache_bits) { const int histo_size = VP8LGetHistogramSize(cache_bits); return (sizeof(VP8LHistogramSet) + size * (sizeof(VP8LHistogram*) + histo_size + WEBP_ALIGN_CST)); } VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) { int i; VP8LHistogramSet* set; const size_t total_size = HistogramSetTotalSize(size, cache_bits); uint8_t* memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory)); if (memory == NULL) return NULL; set = (VP8LHistogramSet*)memory; memory += sizeof(*set); set->histograms = (VP8LHistogram**)memory; set->max_size = size; set->size = size; HistogramSetResetPointers(set, cache_bits); for (i = 0; i < size; ++i) { VP8LHistogramInit(set->histograms[i], cache_bits, /*init_arrays=*/ 0); } return set; } void VP8LHistogramSetClear(VP8LHistogramSet* const set) { int i; const int cache_bits = set->histograms[0]->palette_code_bits_; const int size = set->max_size; const size_t total_size = HistogramSetTotalSize(size, cache_bits); uint8_t* memory = (uint8_t*)set; memset(memory, 0, total_size); memory += sizeof(*set); set->histograms = (VP8LHistogram**)memory; set->max_size = size; set->size = size; HistogramSetResetPointers(set, cache_bits); for (i = 0; i < size; ++i) { set->histograms[i]->palette_code_bits_ = cache_bits; } } // Removes the histogram 'i' from 'set' by setting it to NULL. static void HistogramSetRemoveHistogram(VP8LHistogramSet* const set, int i, int* const num_used) { assert(set->histograms[i] != NULL); set->histograms[i] = NULL; --*num_used; // If we remove the last valid one, shrink until the next valid one. if (i == set->size - 1) { while (set->size >= 1 && set->histograms[set->size - 1] == NULL) { --set->size; } } } // ----------------------------------------------------------------------------- void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo, const PixOrCopy* const v, int (*const distance_modifier)(int, int), int distance_modifier_arg0) { if (PixOrCopyIsLiteral(v)) { ++histo->alpha_[PixOrCopyLiteral(v, 3)]; ++histo->red_[PixOrCopyLiteral(v, 2)]; ++histo->literal_[PixOrCopyLiteral(v, 1)]; ++histo->blue_[PixOrCopyLiteral(v, 0)]; } else if (PixOrCopyIsCacheIdx(v)) { const int literal_ix = NUM_LITERAL_CODES + NUM_LENGTH_CODES + PixOrCopyCacheIdx(v); assert(histo->palette_code_bits_ != 0); ++histo->literal_[literal_ix]; } else { int code, extra_bits; VP8LPrefixEncodeBits(PixOrCopyLength(v), &code, &extra_bits); ++histo->literal_[NUM_LITERAL_CODES + code]; if (distance_modifier == NULL) { VP8LPrefixEncodeBits(PixOrCopyDistance(v), &code, &extra_bits); } else { VP8LPrefixEncodeBits( distance_modifier(distance_modifier_arg0, PixOrCopyDistance(v)), &code, &extra_bits); } ++histo->distance_[code]; } } // ----------------------------------------------------------------------------- // Entropy-related functions. static WEBP_INLINE float BitsEntropyRefine(const VP8LBitEntropy* entropy) { float mix; if (entropy->nonzeros < 5) { if (entropy->nonzeros <= 1) { return 0; } // Two symbols, they will be 0 and 1 in a Huffman code. // Let's mix in a bit of entropy to favor good clustering when // distributions of these are combined. if (entropy->nonzeros == 2) { return 0.99f * entropy->sum + 0.01f * entropy->entropy; } // No matter what the entropy says, we cannot be better than min_limit // with Huffman coding. I am mixing a bit of entropy into the // min_limit since it produces much better (~0.5 %) compression results // perhaps because of better entropy clustering. if (entropy->nonzeros == 3) { mix = 0.95f; } else { mix = 0.7f; // nonzeros == 4. } } else { mix = 0.627f; } { float min_limit = 2.f * entropy->sum - entropy->max_val; min_limit = mix * min_limit + (1.f - mix) * entropy->entropy; return (entropy->entropy < min_limit) ? min_limit : entropy->entropy; } } float VP8LBitsEntropy(const uint32_t* const array, int n) { VP8LBitEntropy entropy; VP8LBitsEntropyUnrefined(array, n, &entropy); return BitsEntropyRefine(&entropy); } static float InitialHuffmanCost(void) { // Small bias because Huffman code length is typically not stored in // full length. static const int kHuffmanCodeOfHuffmanCodeSize = CODE_LENGTH_CODES * 3; static const float kSmallBias = 9.1f; return kHuffmanCodeOfHuffmanCodeSize - kSmallBias; } // Finalize the Huffman cost based on streak numbers and length type (<3 or >=3) static float FinalHuffmanCost(const VP8LStreaks* const stats) { // The constants in this function are experimental and got rounded from // their original values in 1/8 when switched to 1/1024. float retval = InitialHuffmanCost(); // Second coefficient: Many zeros in the histogram are covered efficiently // by a run-length encode. Originally 2/8. retval += stats->counts[0] * 1.5625f + 0.234375f * stats->streaks[0][1]; // Second coefficient: Constant values are encoded less efficiently, but still // RLE'ed. Originally 6/8. retval += stats->counts[1] * 2.578125f + 0.703125f * stats->streaks[1][1]; // 0s are usually encoded more efficiently than non-0s. // Originally 15/8. retval += 1.796875f * stats->streaks[0][0]; // Originally 26/8. retval += 3.28125f * stats->streaks[1][0]; return retval; } // Get the symbol entropy for the distribution 'population'. // Set 'trivial_sym', if there's only one symbol present in the distribution. static float PopulationCost(const uint32_t* const population, int length, uint32_t* const trivial_sym, uint8_t* const is_used) { VP8LBitEntropy bit_entropy; VP8LStreaks stats; VP8LGetEntropyUnrefined(population, length, &bit_entropy, &stats); if (trivial_sym != NULL) { *trivial_sym = (bit_entropy.nonzeros == 1) ? bit_entropy.nonzero_code : VP8L_NON_TRIVIAL_SYM; } // The histogram is used if there is at least one non-zero streak. *is_used = (stats.streaks[1][0] != 0 || stats.streaks[1][1] != 0); return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats); } // trivial_at_end is 1 if the two histograms only have one element that is // non-zero: both the zero-th one, or both the last one. static WEBP_INLINE float GetCombinedEntropy(const uint32_t* const X, const uint32_t* const Y, int length, int is_X_used, int is_Y_used, int trivial_at_end) { VP8LStreaks stats; if (trivial_at_end) { // This configuration is due to palettization that transforms an indexed // pixel into 0xff000000 | (pixel << 8) in VP8LBundleColorMap. // BitsEntropyRefine is 0 for histograms with only one non-zero value. // Only FinalHuffmanCost needs to be evaluated. memset(&stats, 0, sizeof(stats)); // Deal with the non-zero value at index 0 or length-1. stats.streaks[1][0] = 1; // Deal with the following/previous zero streak. stats.counts[0] = 1; stats.streaks[0][1] = length - 1; return FinalHuffmanCost(&stats); } else { VP8LBitEntropy bit_entropy; if (is_X_used) { if (is_Y_used) { VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats); } else { VP8LGetEntropyUnrefined(X, length, &bit_entropy, &stats); } } else { if (is_Y_used) { VP8LGetEntropyUnrefined(Y, length, &bit_entropy, &stats); } else { memset(&stats, 0, sizeof(stats)); stats.counts[0] = 1; stats.streaks[0][length > 3] = length; VP8LBitEntropyInit(&bit_entropy); } } return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats); } } // Estimates the Entropy + Huffman + other block overhead size cost. float VP8LHistogramEstimateBits(VP8LHistogram* const p) { return PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_), NULL, &p->is_used_[0]) + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1]) + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2]) + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3]) + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4]) + (float)VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES) + (float)VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES); } // ----------------------------------------------------------------------------- // Various histogram combine/cost-eval functions static int GetCombinedHistogramEntropy(const VP8LHistogram* const a, const VP8LHistogram* const b, float cost_threshold, float* cost) { const int palette_code_bits = a->palette_code_bits_; int trivial_at_end = 0; assert(a->palette_code_bits_ == b->palette_code_bits_); *cost += GetCombinedEntropy(a->literal_, b->literal_, VP8LHistogramNumCodes(palette_code_bits), a->is_used_[0], b->is_used_[0], 0); *cost += (float)VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES, b->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES); if (*cost > cost_threshold) return 0; if (a->trivial_symbol_ != VP8L_NON_TRIVIAL_SYM && a->trivial_symbol_ == b->trivial_symbol_) { // A, R and B are all 0 or 0xff. const uint32_t color_a = (a->trivial_symbol_ >> 24) & 0xff; const uint32_t color_r = (a->trivial_symbol_ >> 16) & 0xff; const uint32_t color_b = (a->trivial_symbol_ >> 0) & 0xff; if ((color_a == 0 || color_a == 0xff) && (color_r == 0 || color_r == 0xff) && (color_b == 0 || color_b == 0xff)) { trivial_at_end = 1; } } *cost += GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, a->is_used_[1], b->is_used_[1], trivial_at_end); if (*cost > cost_threshold) return 0; *cost += GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, a->is_used_[2], b->is_used_[2], trivial_at_end); if (*cost > cost_threshold) return 0; *cost += GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES, a->is_used_[3], b->is_used_[3], trivial_at_end); if (*cost > cost_threshold) return 0; *cost += GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES, a->is_used_[4], b->is_used_[4], 0); *cost += (float)VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES); if (*cost > cost_threshold) return 0; return 1; } static WEBP_INLINE void HistogramAdd(const VP8LHistogram* const a, const VP8LHistogram* const b, VP8LHistogram* const out) { VP8LHistogramAdd(a, b, out); out->trivial_symbol_ = (a->trivial_symbol_ == b->trivial_symbol_) ? a->trivial_symbol_ : VP8L_NON_TRIVIAL_SYM; } // Performs out = a + b, computing the cost C(a+b) - C(a) - C(b) while comparing // to the threshold value 'cost_threshold'. The score returned is // Score = C(a+b) - C(a) - C(b), where C(a) + C(b) is known and fixed. // Since the previous score passed is 'cost_threshold', we only need to compare // the partial cost against 'cost_threshold + C(a) + C(b)' to possibly bail-out // early. static float HistogramAddEval(const VP8LHistogram* const a, const VP8LHistogram* const b, VP8LHistogram* const out, float cost_threshold) { float cost = 0; const float sum_cost = a->bit_cost_ + b->bit_cost_; cost_threshold += sum_cost; if (GetCombinedHistogramEntropy(a, b, cost_threshold, &cost)) { HistogramAdd(a, b, out); out->bit_cost_ = cost; out->palette_code_bits_ = a->palette_code_bits_; } return cost - sum_cost; } // Same as HistogramAddEval(), except that the resulting histogram // is not stored. Only the cost C(a+b) - C(a) is evaluated. We omit // the term C(b) which is constant over all the evaluations. static float HistogramAddThresh(const VP8LHistogram* const a, const VP8LHistogram* const b, float cost_threshold) { float cost; assert(a != NULL && b != NULL); cost = -a->bit_cost_; GetCombinedHistogramEntropy(a, b, cost_threshold, &cost); return cost; } // ----------------------------------------------------------------------------- // The structure to keep track of cost range for the three dominant entropy // symbols. typedef struct { float literal_max_; float literal_min_; float red_max_; float red_min_; float blue_max_; float blue_min_; } DominantCostRange; static void DominantCostRangeInit(DominantCostRange* const c) { c->literal_max_ = 0.; c->literal_min_ = MAX_BIT_COST; c->red_max_ = 0.; c->red_min_ = MAX_BIT_COST; c->blue_max_ = 0.; c->blue_min_ = MAX_BIT_COST; } static void UpdateDominantCostRange( const VP8LHistogram* const h, DominantCostRange* const c) { if (c->literal_max_ < h->literal_cost_) c->literal_max_ = h->literal_cost_; if (c->literal_min_ > h->literal_cost_) c->literal_min_ = h->literal_cost_; if (c->red_max_ < h->red_cost_) c->red_max_ = h->red_cost_; if (c->red_min_ > h->red_cost_) c->red_min_ = h->red_cost_; if (c->blue_max_ < h->blue_cost_) c->blue_max_ = h->blue_cost_; if (c->blue_min_ > h->blue_cost_) c->blue_min_ = h->blue_cost_; } static void UpdateHistogramCost(VP8LHistogram* const h) { uint32_t alpha_sym, red_sym, blue_sym; const float alpha_cost = PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym, &h->is_used_[3]); const float distance_cost = PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) + (float)VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES); const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_); h->literal_cost_ = PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) + (float)VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES); h->red_cost_ = PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]); h->blue_cost_ = PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym, &h->is_used_[2]); h->bit_cost_ = h->literal_cost_ + h->red_cost_ + h->blue_cost_ + alpha_cost + distance_cost; if ((alpha_sym | red_sym | blue_sym) == VP8L_NON_TRIVIAL_SYM) { h->trivial_symbol_ = VP8L_NON_TRIVIAL_SYM; } else { h->trivial_symbol_ = ((uint32_t)alpha_sym << 24) | (red_sym << 16) | (blue_sym << 0); } } static int GetBinIdForEntropy(float min, float max, float val) { const float range = max - min; if (range > 0.) { const float delta = val - min; return (int)((NUM_PARTITIONS - 1e-6) * delta / range); } else { return 0; } } static int GetHistoBinIndex(const VP8LHistogram* const h, const DominantCostRange* const c, int low_effort) { int bin_id = GetBinIdForEntropy(c->literal_min_, c->literal_max_, h->literal_cost_); assert(bin_id < NUM_PARTITIONS); if (!low_effort) { bin_id = bin_id * NUM_PARTITIONS + GetBinIdForEntropy(c->red_min_, c->red_max_, h->red_cost_); bin_id = bin_id * NUM_PARTITIONS + GetBinIdForEntropy(c->blue_min_, c->blue_max_, h->blue_cost_); assert(bin_id < BIN_SIZE); } return bin_id; } // Construct the histograms from backward references. static void HistogramBuild( int xsize, int histo_bits, const VP8LBackwardRefs* const backward_refs, VP8LHistogramSet* const image_histo) { int x = 0, y = 0; const int histo_xsize = VP8LSubSampleSize(xsize, histo_bits); VP8LHistogram** const histograms = image_histo->histograms; VP8LRefsCursor c = VP8LRefsCursorInit(backward_refs); assert(histo_bits > 0); VP8LHistogramSetClear(image_histo); while (VP8LRefsCursorOk(&c)) { const PixOrCopy* const v = c.cur_pos; const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits); VP8LHistogramAddSinglePixOrCopy(histograms[ix], v, NULL, 0); x += PixOrCopyLength(v); while (x >= xsize) { x -= xsize; ++y; } VP8LRefsCursorNext(&c); } } // Copies the histograms and computes its bit_cost. static const uint16_t kInvalidHistogramSymbol = (uint16_t)(-1); static void HistogramCopyAndAnalyze(VP8LHistogramSet* const orig_histo, VP8LHistogramSet* const image_histo, int* const num_used, uint16_t* const histogram_symbols) { int i, cluster_id; int num_used_orig = *num_used; VP8LHistogram** const orig_histograms = orig_histo->histograms; VP8LHistogram** const histograms = image_histo->histograms; assert(image_histo->max_size == orig_histo->max_size); for (cluster_id = 0, i = 0; i < orig_histo->max_size; ++i) { VP8LHistogram* const histo = orig_histograms[i]; UpdateHistogramCost(histo); // Skip the histogram if it is completely empty, which can happen for tiles // with no information (when they are skipped because of LZ77). if (!histo->is_used_[0] && !histo->is_used_[1] && !histo->is_used_[2] && !histo->is_used_[3] && !histo->is_used_[4]) { // The first histogram is always used. If an histogram is empty, we set // its id to be the same as the previous one: this will improve // compressibility for later LZ77. assert(i > 0); HistogramSetRemoveHistogram(image_histo, i, num_used); HistogramSetRemoveHistogram(orig_histo, i, &num_used_orig); histogram_symbols[i] = kInvalidHistogramSymbol; } else { // Copy histograms from orig_histo[] to image_histo[]. HistogramCopy(histo, histograms[i]); histogram_symbols[i] = cluster_id++; assert(cluster_id <= image_histo->max_size); } } } // Partition histograms to different entropy bins for three dominant (literal, // red and blue) symbol costs and compute the histogram aggregate bit_cost. static void HistogramAnalyzeEntropyBin(VP8LHistogramSet* const image_histo, uint16_t* const bin_map, int low_effort) { int i; VP8LHistogram** const histograms = image_histo->histograms; const int histo_size = image_histo->size; DominantCostRange cost_range; DominantCostRangeInit(&cost_range); // Analyze the dominant (literal, red and blue) entropy costs. for (i = 0; i < histo_size; ++i) { if (histograms[i] == NULL) continue; UpdateDominantCostRange(histograms[i], &cost_range); } // bin-hash histograms on three of the dominant (literal, red and blue) // symbol costs and store the resulting bin_id for each histogram. for (i = 0; i < histo_size; ++i) { // bin_map[i] is not set to a special value as its use will later be guarded // by another (histograms[i] == NULL). if (histograms[i] == NULL) continue; bin_map[i] = GetHistoBinIndex(histograms[i], &cost_range, low_effort); } } // Merges some histograms with same bin_id together if it's advantageous. // Sets the remaining histograms to NULL. static void HistogramCombineEntropyBin( VP8LHistogramSet* const image_histo, int* num_used, const uint16_t* const clusters, uint16_t* const cluster_mappings, VP8LHistogram* cur_combo, const uint16_t* const bin_map, int num_bins, float combine_cost_factor, int low_effort) { VP8LHistogram** const histograms = image_histo->histograms; int idx; struct { int16_t first; // position of the histogram that accumulates all // histograms with the same bin_id uint16_t num_combine_failures; // number of combine failures per bin_id } bin_info[BIN_SIZE]; assert(num_bins <= BIN_SIZE); for (idx = 0; idx < num_bins; ++idx) { bin_info[idx].first = -1; bin_info[idx].num_combine_failures = 0; } // By default, a cluster matches itself. for (idx = 0; idx < *num_used; ++idx) cluster_mappings[idx] = idx; for (idx = 0; idx < image_histo->size; ++idx) { int bin_id, first; if (histograms[idx] == NULL) continue; bin_id = bin_map[idx]; first = bin_info[bin_id].first; if (first == -1) { bin_info[bin_id].first = idx; } else if (low_effort) { HistogramAdd(histograms[idx], histograms[first], histograms[first]); HistogramSetRemoveHistogram(image_histo, idx, num_used); cluster_mappings[clusters[idx]] = clusters[first]; } else { // try to merge #idx into #first (both share the same bin_id) const float bit_cost = histograms[idx]->bit_cost_; const float bit_cost_thresh = -bit_cost * combine_cost_factor; const float curr_cost_diff = HistogramAddEval( histograms[first], histograms[idx], cur_combo, bit_cost_thresh); if (curr_cost_diff < bit_cost_thresh) { // Try to merge two histograms only if the combo is a trivial one or // the two candidate histograms are already non-trivial. // For some images, 'try_combine' turns out to be false for a lot of // histogram pairs. In that case, we fallback to combining // histograms as usual to avoid increasing the header size. const int try_combine = (cur_combo->trivial_symbol_ != VP8L_NON_TRIVIAL_SYM) || ((histograms[idx]->trivial_symbol_ == VP8L_NON_TRIVIAL_SYM) && (histograms[first]->trivial_symbol_ == VP8L_NON_TRIVIAL_SYM)); const int max_combine_failures = 32; if (try_combine || bin_info[bin_id].num_combine_failures >= max_combine_failures) { // move the (better) merged histogram to its final slot HistogramSwap(&cur_combo, &histograms[first]); HistogramSetRemoveHistogram(image_histo, idx, num_used); cluster_mappings[clusters[idx]] = clusters[first]; } else { ++bin_info[bin_id].num_combine_failures; } } } } if (low_effort) { // for low_effort case, update the final cost when everything is merged for (idx = 0; idx < image_histo->size; ++idx) { if (histograms[idx] == NULL) continue; UpdateHistogramCost(histograms[idx]); } } } // Implement a Lehmer random number generator with a multiplicative constant of // 48271 and a modulo constant of 2^31 - 1. static uint32_t MyRand(uint32_t* const seed) { *seed = (uint32_t)(((uint64_t)(*seed) * 48271u) % 2147483647u); assert(*seed > 0); return *seed; } // ----------------------------------------------------------------------------- // Histogram pairs priority queue // Pair of histograms. Negative idx1 value means that pair is out-of-date. typedef struct { int idx1; int idx2; float cost_diff; float cost_combo; } HistogramPair; typedef struct { HistogramPair* queue; int size; int max_size; } HistoQueue; static int HistoQueueInit(HistoQueue* const histo_queue, const int max_size) { histo_queue->size = 0; histo_queue->max_size = max_size; // We allocate max_size + 1 because the last element at index "size" is // used as temporary data (and it could be up to max_size). histo_queue->queue = (HistogramPair*)WebPSafeMalloc( histo_queue->max_size + 1, sizeof(*histo_queue->queue)); return histo_queue->queue != NULL; } static void HistoQueueClear(HistoQueue* const histo_queue) { assert(histo_queue != NULL); WebPSafeFree(histo_queue->queue); histo_queue->size = 0; histo_queue->max_size = 0; } // Pop a specific pair in the queue by replacing it with the last one // and shrinking the queue. static void HistoQueuePopPair(HistoQueue* const histo_queue, HistogramPair* const pair) { assert(pair >= histo_queue->queue && pair < (histo_queue->queue + histo_queue->size)); assert(histo_queue->size > 0); *pair = histo_queue->queue[histo_queue->size - 1]; --histo_queue->size; } // Check whether a pair in the queue should be updated as head or not. static void HistoQueueUpdateHead(HistoQueue* const histo_queue, HistogramPair* const pair) { assert(pair->cost_diff < 0.); assert(pair >= histo_queue->queue && pair < (histo_queue->queue + histo_queue->size)); assert(histo_queue->size > 0); if (pair->cost_diff < histo_queue->queue[0].cost_diff) { // Replace the best pair. const HistogramPair tmp = histo_queue->queue[0]; histo_queue->queue[0] = *pair; *pair = tmp; } } // Update the cost diff and combo of a pair of histograms. This needs to be // called when the the histograms have been merged with a third one. static void HistoQueueUpdatePair(const VP8LHistogram* const h1, const VP8LHistogram* const h2, float threshold, HistogramPair* const pair) { const float sum_cost = h1->bit_cost_ + h2->bit_cost_; pair->cost_combo = 0.; GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair->cost_combo); pair->cost_diff = pair->cost_combo - sum_cost; } // Create a pair from indices "idx1" and "idx2" provided its cost // is inferior to "threshold", a negative entropy. // It returns the cost of the pair, or 0. if it superior to threshold. static float HistoQueuePush(HistoQueue* const histo_queue, VP8LHistogram** const histograms, int idx1, int idx2, float threshold) { const VP8LHistogram* h1; const VP8LHistogram* h2; HistogramPair pair; // Stop here if the queue is full. if (histo_queue->size == histo_queue->max_size) return 0.; assert(threshold <= 0.); if (idx1 > idx2) { const int tmp = idx2; idx2 = idx1; idx1 = tmp; } pair.idx1 = idx1; pair.idx2 = idx2; h1 = histograms[idx1]; h2 = histograms[idx2]; HistoQueueUpdatePair(h1, h2, threshold, &pair); // Do not even consider the pair if it does not improve the entropy. if (pair.cost_diff >= threshold) return 0.; histo_queue->queue[histo_queue->size++] = pair; HistoQueueUpdateHead(histo_queue, &histo_queue->queue[histo_queue->size - 1]); return pair.cost_diff; } // ----------------------------------------------------------------------------- // Combines histograms by continuously choosing the one with the highest cost // reduction. static int HistogramCombineGreedy(VP8LHistogramSet* const image_histo, int* const num_used) { int ok = 0; const int image_histo_size = image_histo->size; int i, j; VP8LHistogram** const histograms = image_histo->histograms; // Priority queue of histogram pairs. HistoQueue histo_queue; // image_histo_size^2 for the queue size is safe. If you look at // HistogramCombineGreedy, and imagine that UpdateQueueFront always pushes // data to the queue, you insert at most: // - image_histo_size*(image_histo_size-1)/2 (the first two for loops) // - image_histo_size - 1 in the last for loop at the first iteration of // the while loop, image_histo_size - 2 at the second iteration ... // therefore image_histo_size*(image_histo_size-1)/2 overall too if (!HistoQueueInit(&histo_queue, image_histo_size * image_histo_size)) { goto End; } for (i = 0; i < image_histo_size; ++i) { if (image_histo->histograms[i] == NULL) continue; for (j = i + 1; j < image_histo_size; ++j) { // Initialize queue. if (image_histo->histograms[j] == NULL) continue; HistoQueuePush(&histo_queue, histograms, i, j, 0.); } } while (histo_queue.size > 0) { const int idx1 = histo_queue.queue[0].idx1; const int idx2 = histo_queue.queue[0].idx2; HistogramAdd(histograms[idx2], histograms[idx1], histograms[idx1]); histograms[idx1]->bit_cost_ = histo_queue.queue[0].cost_combo; // Remove merged histogram. HistogramSetRemoveHistogram(image_histo, idx2, num_used); // Remove pairs intersecting the just combined best pair. for (i = 0; i < histo_queue.size;) { HistogramPair* const p = histo_queue.queue + i; if (p->idx1 == idx1 || p->idx2 == idx1 || p->idx1 == idx2 || p->idx2 == idx2) { HistoQueuePopPair(&histo_queue, p); } else { HistoQueueUpdateHead(&histo_queue, p); ++i; } } // Push new pairs formed with combined histogram to the queue. for (i = 0; i < image_histo->size; ++i) { if (i == idx1 || image_histo->histograms[i] == NULL) continue; HistoQueuePush(&histo_queue, image_histo->histograms, idx1, i, 0.); } } ok = 1; End: HistoQueueClear(&histo_queue); return ok; } // Perform histogram aggregation using a stochastic approach. // 'do_greedy' is set to 1 if a greedy approach needs to be performed // afterwards, 0 otherwise. static int PairComparison(const void* idx1, const void* idx2) { // To be used with bsearch: <0 when *idx1<*idx2, >0 if >, 0 when ==. return (*(int*) idx1 - *(int*) idx2); } static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo, int* const num_used, int min_cluster_size, int* const do_greedy) { int j, iter; uint32_t seed = 1; int tries_with_no_success = 0; const int outer_iters = *num_used; const int num_tries_no_success = outer_iters / 2; VP8LHistogram** const histograms = image_histo->histograms; // Priority queue of histogram pairs. Its size of 'kHistoQueueSize' // impacts the quality of the compression and the speed: the smaller the // faster but the worse for the compression. HistoQueue histo_queue; const int kHistoQueueSize = 9; int ok = 0; // mapping from an index in image_histo with no NULL histogram to the full // blown image_histo. int* mappings; if (*num_used < min_cluster_size) { *do_greedy = 1; return 1; } mappings = (int*) WebPSafeMalloc(*num_used, sizeof(*mappings)); if (mappings == NULL) return 0; if (!HistoQueueInit(&histo_queue, kHistoQueueSize)) goto End; // Fill the initial mapping. for (j = 0, iter = 0; iter < image_histo->size; ++iter) { if (histograms[iter] == NULL) continue; mappings[j++] = iter; } assert(j == *num_used); // Collapse similar histograms in 'image_histo'. for (iter = 0; iter < outer_iters && *num_used >= min_cluster_size && ++tries_with_no_success < num_tries_no_success; ++iter) { int* mapping_index; float best_cost = (histo_queue.size == 0) ? 0.f : histo_queue.queue[0].cost_diff; int best_idx1 = -1, best_idx2 = 1; const uint32_t rand_range = (*num_used - 1) * (*num_used); // (*num_used) / 2 was chosen empirically. Less means faster but worse // compression. const int num_tries = (*num_used) / 2; // Pick random samples. for (j = 0; *num_used >= 2 && j < num_tries; ++j) { float curr_cost; // Choose two different histograms at random and try to combine them. const uint32_t tmp = MyRand(&seed) % rand_range; uint32_t idx1 = tmp / (*num_used - 1); uint32_t idx2 = tmp % (*num_used - 1); if (idx2 >= idx1) ++idx2; idx1 = mappings[idx1]; idx2 = mappings[idx2]; // Calculate cost reduction on combination. curr_cost = HistoQueuePush(&histo_queue, histograms, idx1, idx2, best_cost); if (curr_cost < 0) { // found a better pair? best_cost = curr_cost; // Empty the queue if we reached full capacity. if (histo_queue.size == histo_queue.max_size) break; } } if (histo_queue.size == 0) continue; // Get the best histograms. best_idx1 = histo_queue.queue[0].idx1; best_idx2 = histo_queue.queue[0].idx2; assert(best_idx1 < best_idx2); // Pop best_idx2 from mappings. mapping_index = (int*) bsearch(&best_idx2, mappings, *num_used, sizeof(best_idx2), &PairComparison); assert(mapping_index != NULL); memmove(mapping_index, mapping_index + 1, sizeof(*mapping_index) * ((*num_used) - (mapping_index - mappings) - 1)); // Merge the histograms and remove best_idx2 from the queue. HistogramAdd(histograms[best_idx2], histograms[best_idx1], histograms[best_idx1]); histograms[best_idx1]->bit_cost_ = histo_queue.queue[0].cost_combo; HistogramSetRemoveHistogram(image_histo, best_idx2, num_used); // Parse the queue and update each pair that deals with best_idx1, // best_idx2 or image_histo_size. for (j = 0; j < histo_queue.size;) { HistogramPair* const p = histo_queue.queue + j; const int is_idx1_best = p->idx1 == best_idx1 || p->idx1 == best_idx2; const int is_idx2_best = p->idx2 == best_idx1 || p->idx2 == best_idx2; int do_eval = 0; // The front pair could have been duplicated by a random pick so // check for it all the time nevertheless. if (is_idx1_best && is_idx2_best) { HistoQueuePopPair(&histo_queue, p); continue; } // Any pair containing one of the two best indices should only refer to // best_idx1. Its cost should also be updated. if (is_idx1_best) { p->idx1 = best_idx1; do_eval = 1; } else if (is_idx2_best) { p->idx2 = best_idx1; do_eval = 1; } // Make sure the index order is respected. if (p->idx1 > p->idx2) { const int tmp = p->idx2; p->idx2 = p->idx1; p->idx1 = tmp; } if (do_eval) { // Re-evaluate the cost of an updated pair. HistoQueueUpdatePair(histograms[p->idx1], histograms[p->idx2], 0., p); if (p->cost_diff >= 0.) { HistoQueuePopPair(&histo_queue, p); continue; } } HistoQueueUpdateHead(&histo_queue, p); ++j; } tries_with_no_success = 0; } *do_greedy = (*num_used <= min_cluster_size); ok = 1; End: HistoQueueClear(&histo_queue); WebPSafeFree(mappings); return ok; } // ----------------------------------------------------------------------------- // Histogram refinement // Find the best 'out' histogram for each of the 'in' histograms. // At call-time, 'out' contains the histograms of the clusters. // Note: we assume that out[]->bit_cost_ is already up-to-date. static void HistogramRemap(const VP8LHistogramSet* const in, VP8LHistogramSet* const out, uint16_t* const symbols) { int i; VP8LHistogram** const in_histo = in->histograms; VP8LHistogram** const out_histo = out->histograms; const int in_size = out->max_size; const int out_size = out->size; if (out_size > 1) { for (i = 0; i < in_size; ++i) { int best_out = 0; float best_bits = MAX_BIT_COST; int k; if (in_histo[i] == NULL) { // Arbitrarily set to the previous value if unused to help future LZ77. symbols[i] = symbols[i - 1]; continue; } for (k = 0; k < out_size; ++k) { float cur_bits; cur_bits = HistogramAddThresh(out_histo[k], in_histo[i], best_bits); if (k == 0 || cur_bits < best_bits) { best_bits = cur_bits; best_out = k; } } symbols[i] = best_out; } } else { assert(out_size == 1); for (i = 0; i < in_size; ++i) { symbols[i] = 0; } } // Recompute each out based on raw and symbols. VP8LHistogramSetClear(out); out->size = out_size; for (i = 0; i < in_size; ++i) { int idx; if (in_histo[i] == NULL) continue; idx = symbols[i]; HistogramAdd(in_histo[i], out_histo[idx], out_histo[idx]); } } static float GetCombineCostFactor(int histo_size, int quality) { float combine_cost_factor = 0.16f; if (quality < 90) { if (histo_size > 256) combine_cost_factor /= 2.f; if (histo_size > 512) combine_cost_factor /= 2.f; if (histo_size > 1024) combine_cost_factor /= 2.f; if (quality <= 50) combine_cost_factor /= 2.f; } return combine_cost_factor; } // Given a HistogramSet 'set', the mapping of clusters 'cluster_mapping' and the // current assignment of the cells in 'symbols', merge the clusters and // assign the smallest possible clusters values. static void OptimizeHistogramSymbols(const VP8LHistogramSet* const set, uint16_t* const cluster_mappings, int num_clusters, uint16_t* const cluster_mappings_tmp, uint16_t* const symbols) { int i, cluster_max; int do_continue = 1; // First, assign the lowest cluster to each pixel. while (do_continue) { do_continue = 0; for (i = 0; i < num_clusters; ++i) { int k; k = cluster_mappings[i]; while (k != cluster_mappings[k]) { cluster_mappings[k] = cluster_mappings[cluster_mappings[k]]; k = cluster_mappings[k]; } if (k != cluster_mappings[i]) { do_continue = 1; cluster_mappings[i] = k; } } } // Create a mapping from a cluster id to its minimal version. cluster_max = 0; memset(cluster_mappings_tmp, 0, set->max_size * sizeof(*cluster_mappings_tmp)); assert(cluster_mappings[0] == 0); // Re-map the ids. for (i = 0; i < set->max_size; ++i) { int cluster; if (symbols[i] == kInvalidHistogramSymbol) continue; cluster = cluster_mappings[symbols[i]]; assert(symbols[i] < num_clusters); if (cluster > 0 && cluster_mappings_tmp[cluster] == 0) { ++cluster_max; cluster_mappings_tmp[cluster] = cluster_max; } symbols[i] = cluster_mappings_tmp[cluster]; } // Make sure all cluster values are used. cluster_max = 0; for (i = 0; i < set->max_size; ++i) { if (symbols[i] == kInvalidHistogramSymbol) continue; if (symbols[i] <= cluster_max) continue; ++cluster_max; assert(symbols[i] == cluster_max); } } static void RemoveEmptyHistograms(VP8LHistogramSet* const image_histo) { uint32_t size; int i; for (i = 0, size = 0; i < image_histo->size; ++i) { if (image_histo->histograms[i] == NULL) continue; image_histo->histograms[size++] = image_histo->histograms[i]; } image_histo->size = size; } int VP8LGetHistoImageSymbols(int xsize, int ysize, const VP8LBackwardRefs* const refs, int quality, int low_effort, int histogram_bits, int cache_bits, VP8LHistogramSet* const image_histo, VP8LHistogram* const tmp_histo, uint16_t* const histogram_symbols, const WebPPicture* const pic, int percent_range, int* const percent) { const int histo_xsize = histogram_bits ? VP8LSubSampleSize(xsize, histogram_bits) : 1; const int histo_ysize = histogram_bits ? VP8LSubSampleSize(ysize, histogram_bits) : 1; const int image_histo_raw_size = histo_xsize * histo_ysize; VP8LHistogramSet* const orig_histo = VP8LAllocateHistogramSet(image_histo_raw_size, cache_bits); // Don't attempt linear bin-partition heuristic for // histograms of small sizes (as bin_map will be very sparse) and // maximum quality q==100 (to preserve the compression gains at that level). const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE; int entropy_combine; uint16_t* const map_tmp = WebPSafeMalloc(2 * image_histo_raw_size, sizeof(*map_tmp)); uint16_t* const cluster_mappings = map_tmp + image_histo_raw_size; int num_used = image_histo_raw_size; if (orig_histo == NULL || map_tmp == NULL) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } // Construct the histograms from backward references. HistogramBuild(xsize, histogram_bits, refs, orig_histo); // Copies the histograms and computes its bit_cost. // histogram_symbols is optimized HistogramCopyAndAnalyze(orig_histo, image_histo, &num_used, histogram_symbols); entropy_combine = (num_used > entropy_combine_num_bins * 2) && (quality < 100); if (entropy_combine) { uint16_t* const bin_map = map_tmp; const float combine_cost_factor = GetCombineCostFactor(image_histo_raw_size, quality); const uint32_t num_clusters = num_used; HistogramAnalyzeEntropyBin(image_histo, bin_map, low_effort); // Collapse histograms with similar entropy. HistogramCombineEntropyBin( image_histo, &num_used, histogram_symbols, cluster_mappings, tmp_histo, bin_map, entropy_combine_num_bins, combine_cost_factor, low_effort); OptimizeHistogramSymbols(image_histo, cluster_mappings, num_clusters, map_tmp, histogram_symbols); } // Don't combine the histograms using stochastic and greedy heuristics for // low-effort compression mode. if (!low_effort || !entropy_combine) { const float x = quality / 100.f; // cubic ramp between 1 and MAX_HISTO_GREEDY: const int threshold_size = (int)(1 + (x * x * x) * (MAX_HISTO_GREEDY - 1)); int do_greedy; if (!HistogramCombineStochastic(image_histo, &num_used, threshold_size, &do_greedy)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } if (do_greedy) { RemoveEmptyHistograms(image_histo); if (!HistogramCombineGreedy(image_histo, &num_used)) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); goto Error; } } } // Find the optimal map from original histograms to the final ones. RemoveEmptyHistograms(image_histo); HistogramRemap(orig_histo, image_histo, histogram_symbols); if (!WebPReportProgress(pic, *percent + percent_range, percent)) { goto Error; } Error: VP8LFreeHistogramSet(orig_histo); WebPSafeFree(map_tmp); return (pic->error_code == VP8_ENC_OK); } libwebp-1.4.0/src/enc/cost_enc.c0000644000014400001440000003560714606317060013363 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Cost tables for level and modes // // Author: Skal (pascal.massimino@gmail.com) #include "src/enc/cost_enc.h" //------------------------------------------------------------------------------ // Level cost tables // For each given level, the following table gives the pattern of contexts to // use for coding it (in [][0]) as well as the bit value to use for each // context (in [][1]). const uint16_t VP8LevelCodes[MAX_VARIABLE_LEVEL][2] = { {0x001, 0x000}, {0x007, 0x001}, {0x00f, 0x005}, {0x00f, 0x00d}, {0x033, 0x003}, {0x033, 0x003}, {0x033, 0x023}, {0x033, 0x023}, {0x033, 0x023}, {0x033, 0x023}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x013}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x0d3, 0x093}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x053}, {0x153, 0x153} }; static int VariableLevelCost(int level, const uint8_t probas[NUM_PROBAS]) { int pattern = VP8LevelCodes[level - 1][0]; int bits = VP8LevelCodes[level - 1][1]; int cost = 0; int i; for (i = 2; pattern; ++i) { if (pattern & 1) { cost += VP8BitCost(bits & 1, probas[i]); } bits >>= 1; pattern >>= 1; } return cost; } //------------------------------------------------------------------------------ // Pre-calc level costs once for all void VP8CalculateLevelCosts(VP8EncProba* const proba) { int ctype, band, ctx; if (!proba->dirty_) return; // nothing to do. for (ctype = 0; ctype < NUM_TYPES; ++ctype) { int n; for (band = 0; band < NUM_BANDS; ++band) { for (ctx = 0; ctx < NUM_CTX; ++ctx) { const uint8_t* const p = proba->coeffs_[ctype][band][ctx]; uint16_t* const table = proba->level_cost_[ctype][band][ctx]; const int cost0 = (ctx > 0) ? VP8BitCost(1, p[0]) : 0; const int cost_base = VP8BitCost(1, p[1]) + cost0; int v; table[0] = VP8BitCost(0, p[1]) + cost0; for (v = 1; v <= MAX_VARIABLE_LEVEL; ++v) { table[v] = cost_base + VariableLevelCost(v, p); } // Starting at level 67 and up, the variable part of the cost is // actually constant. } } for (n = 0; n < 16; ++n) { // replicate bands. We don't need to sentinel. for (ctx = 0; ctx < NUM_CTX; ++ctx) { proba->remapped_costs_[ctype][n][ctx] = proba->level_cost_[ctype][VP8EncBands[n]][ctx]; } } } proba->dirty_ = 0; } //------------------------------------------------------------------------------ // Mode cost tables. // These are the fixed probabilities (in the coding trees) turned into bit-cost // by calling VP8BitCost(). const uint16_t VP8FixedCostsUV[4] = { 302, 984, 439, 642 }; // note: these values include the fixed VP8BitCost(1, 145) mode selection cost. const uint16_t VP8FixedCostsI16[4] = { 663, 919, 872, 919 }; const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES] = { { { 40, 1151, 1723, 1874, 2103, 2019, 1628, 1777, 2226, 2137 }, { 192, 469, 1296, 1308, 1849, 1794, 1781, 1703, 1713, 1522 }, { 142, 910, 762, 1684, 1849, 1576, 1460, 1305, 1801, 1657 }, { 559, 641, 1370, 421, 1182, 1569, 1612, 1725, 863, 1007 }, { 299, 1059, 1256, 1108, 636, 1068, 1581, 1883, 869, 1142 }, { 277, 1111, 707, 1362, 1089, 672, 1603, 1541, 1545, 1291 }, { 214, 781, 1609, 1303, 1632, 2229, 726, 1560, 1713, 918 }, { 152, 1037, 1046, 1759, 1983, 2174, 1358, 742, 1740, 1390 }, { 512, 1046, 1420, 753, 752, 1297, 1486, 1613, 460, 1207 }, { 424, 827, 1362, 719, 1462, 1202, 1199, 1476, 1199, 538 } }, { { 240, 402, 1134, 1491, 1659, 1505, 1517, 1555, 1979, 2099 }, { 467, 242, 960, 1232, 1714, 1620, 1834, 1570, 1676, 1391 }, { 500, 455, 463, 1507, 1699, 1282, 1564, 982, 2114, 2114 }, { 672, 643, 1372, 331, 1589, 1667, 1453, 1938, 996, 876 }, { 458, 783, 1037, 911, 738, 968, 1165, 1518, 859, 1033 }, { 504, 815, 504, 1139, 1219, 719, 1506, 1085, 1268, 1268 }, { 333, 630, 1445, 1239, 1883, 3672, 799, 1548, 1865, 598 }, { 399, 644, 746, 1342, 1856, 1350, 1493, 613, 1855, 1015 }, { 622, 749, 1205, 608, 1066, 1408, 1290, 1406, 546, 971 }, { 500, 753, 1041, 668, 1230, 1617, 1297, 1425, 1383, 523 } }, { { 394, 553, 523, 1502, 1536, 981, 1608, 1142, 1666, 2181 }, { 655, 430, 375, 1411, 1861, 1220, 1677, 1135, 1978, 1553 }, { 690, 640, 245, 1954, 2070, 1194, 1528, 982, 1972, 2232 }, { 559, 834, 741, 867, 1131, 980, 1225, 852, 1092, 784 }, { 690, 875, 516, 959, 673, 894, 1056, 1190, 1528, 1126 }, { 740, 951, 384, 1277, 1177, 492, 1579, 1155, 1846, 1513 }, { 323, 775, 1062, 1776, 3062, 1274, 813, 1188, 1372, 655 }, { 488, 971, 484, 1767, 1515, 1775, 1115, 503, 1539, 1461 }, { 740, 1006, 998, 709, 851, 1230, 1337, 788, 741, 721 }, { 522, 1073, 573, 1045, 1346, 887, 1046, 1146, 1203, 697 } }, { { 105, 864, 1442, 1009, 1934, 1840, 1519, 1920, 1673, 1579 }, { 534, 305, 1193, 683, 1388, 2164, 1802, 1894, 1264, 1170 }, { 305, 518, 877, 1108, 1426, 3215, 1425, 1064, 1320, 1242 }, { 683, 732, 1927, 257, 1493, 2048, 1858, 1552, 1055, 947 }, { 394, 814, 1024, 660, 959, 1556, 1282, 1289, 893, 1047 }, { 528, 615, 996, 940, 1201, 635, 1094, 2515, 803, 1358 }, { 347, 614, 1609, 1187, 3133, 1345, 1007, 1339, 1017, 667 }, { 218, 740, 878, 1605, 3650, 3650, 1345, 758, 1357, 1617 }, { 672, 750, 1541, 558, 1257, 1599, 1870, 2135, 402, 1087 }, { 592, 684, 1161, 430, 1092, 1497, 1475, 1489, 1095, 822 } }, { { 228, 1056, 1059, 1368, 752, 982, 1512, 1518, 987, 1782 }, { 494, 514, 818, 942, 965, 892, 1610, 1356, 1048, 1363 }, { 512, 648, 591, 1042, 761, 991, 1196, 1454, 1309, 1463 }, { 683, 749, 1043, 676, 841, 1396, 1133, 1138, 654, 939 }, { 622, 1101, 1126, 994, 361, 1077, 1203, 1318, 877, 1219 }, { 631, 1068, 857, 1650, 651, 477, 1650, 1419, 828, 1170 }, { 555, 727, 1068, 1335, 3127, 1339, 820, 1331, 1077, 429 }, { 504, 879, 624, 1398, 889, 889, 1392, 808, 891, 1406 }, { 683, 1602, 1289, 977, 578, 983, 1280, 1708, 406, 1122 }, { 399, 865, 1433, 1070, 1072, 764, 968, 1477, 1223, 678 } }, { { 333, 760, 935, 1638, 1010, 529, 1646, 1410, 1472, 2219 }, { 512, 494, 750, 1160, 1215, 610, 1870, 1868, 1628, 1169 }, { 572, 646, 492, 1934, 1208, 603, 1580, 1099, 1398, 1995 }, { 786, 789, 942, 581, 1018, 951, 1599, 1207, 731, 768 }, { 690, 1015, 672, 1078, 582, 504, 1693, 1438, 1108, 2897 }, { 768, 1267, 571, 2005, 1243, 244, 2881, 1380, 1786, 1453 }, { 452, 899, 1293, 903, 1311, 3100, 465, 1311, 1319, 813 }, { 394, 927, 942, 1103, 1358, 1104, 946, 593, 1363, 1109 }, { 559, 1005, 1007, 1016, 658, 1173, 1021, 1164, 623, 1028 }, { 564, 796, 632, 1005, 1014, 863, 2316, 1268, 938, 764 } }, { { 266, 606, 1098, 1228, 1497, 1243, 948, 1030, 1734, 1461 }, { 366, 585, 901, 1060, 1407, 1247, 876, 1134, 1620, 1054 }, { 452, 565, 542, 1729, 1479, 1479, 1016, 886, 2938, 1150 }, { 555, 1088, 1533, 950, 1354, 895, 834, 1019, 1021, 496 }, { 704, 815, 1193, 971, 973, 640, 1217, 2214, 832, 578 }, { 672, 1245, 579, 871, 875, 774, 872, 1273, 1027, 949 }, { 296, 1134, 2050, 1784, 1636, 3425, 442, 1550, 2076, 722 }, { 342, 982, 1259, 1846, 1848, 1848, 622, 568, 1847, 1052 }, { 555, 1064, 1304, 828, 746, 1343, 1075, 1329, 1078, 494 }, { 288, 1167, 1285, 1174, 1639, 1639, 833, 2254, 1304, 509 } }, { { 342, 719, 767, 1866, 1757, 1270, 1246, 550, 1746, 2151 }, { 483, 653, 694, 1509, 1459, 1410, 1218, 507, 1914, 1266 }, { 488, 757, 447, 2979, 1813, 1268, 1654, 539, 1849, 2109 }, { 522, 1097, 1085, 851, 1365, 1111, 851, 901, 961, 605 }, { 709, 716, 841, 728, 736, 945, 941, 862, 2845, 1057 }, { 512, 1323, 500, 1336, 1083, 681, 1342, 717, 1604, 1350 }, { 452, 1155, 1372, 1900, 1501, 3290, 311, 944, 1919, 922 }, { 403, 1520, 977, 2132, 1733, 3522, 1076, 276, 3335, 1547 }, { 559, 1374, 1101, 615, 673, 2462, 974, 795, 984, 984 }, { 547, 1122, 1062, 812, 1410, 951, 1140, 622, 1268, 651 } }, { { 165, 982, 1235, 938, 1334, 1366, 1659, 1578, 964, 1612 }, { 592, 422, 925, 847, 1139, 1112, 1387, 2036, 861, 1041 }, { 403, 837, 732, 770, 941, 1658, 1250, 809, 1407, 1407 }, { 896, 874, 1071, 381, 1568, 1722, 1437, 2192, 480, 1035 }, { 640, 1098, 1012, 1032, 684, 1382, 1581, 2106, 416, 865 }, { 559, 1005, 819, 914, 710, 770, 1418, 920, 838, 1435 }, { 415, 1258, 1245, 870, 1278, 3067, 770, 1021, 1287, 522 }, { 406, 990, 601, 1009, 1265, 1265, 1267, 759, 1017, 1277 }, { 968, 1182, 1329, 788, 1032, 1292, 1705, 1714, 203, 1403 }, { 732, 877, 1279, 471, 901, 1161, 1545, 1294, 755, 755 } }, { { 111, 931, 1378, 1185, 1933, 1648, 1148, 1714, 1873, 1307 }, { 406, 414, 1030, 1023, 1910, 1404, 1313, 1647, 1509, 793 }, { 342, 640, 575, 1088, 1241, 1349, 1161, 1350, 1756, 1502 }, { 559, 766, 1185, 357, 1682, 1428, 1329, 1897, 1219, 802 }, { 473, 909, 1164, 771, 719, 2508, 1427, 1432, 722, 782 }, { 342, 892, 785, 1145, 1150, 794, 1296, 1550, 973, 1057 }, { 208, 1036, 1326, 1343, 1606, 3395, 815, 1455, 1618, 712 }, { 228, 928, 890, 1046, 3499, 1711, 994, 829, 1720, 1318 }, { 768, 724, 1058, 636, 991, 1075, 1319, 1324, 616, 825 }, { 305, 1167, 1358, 899, 1587, 1587, 987, 1988, 1332, 501 } } }; //------------------------------------------------------------------------------ // helper functions for residuals struct VP8Residual. void VP8InitResidual(int first, int coeff_type, VP8Encoder* const enc, VP8Residual* const res) { res->coeff_type = coeff_type; res->prob = enc->proba_.coeffs_[coeff_type]; res->stats = enc->proba_.stats_[coeff_type]; res->costs = enc->proba_.remapped_costs_[coeff_type]; res->first = first; } //------------------------------------------------------------------------------ // Mode costs int VP8GetCostLuma4(VP8EncIterator* const it, const int16_t levels[16]) { const int x = (it->i4_ & 3), y = (it->i4_ >> 2); VP8Residual res; VP8Encoder* const enc = it->enc_; int R = 0; int ctx; VP8InitResidual(0, 3, enc, &res); ctx = it->top_nz_[x] + it->left_nz_[y]; VP8SetResidualCoeffs(levels, &res); R += VP8GetResidualCost(ctx, &res); return R; } int VP8GetCostLuma16(VP8EncIterator* const it, const VP8ModeScore* const rd) { VP8Residual res; VP8Encoder* const enc = it->enc_; int x, y; int R = 0; VP8IteratorNzToBytes(it); // re-import the non-zero context // DC VP8InitResidual(0, 1, enc, &res); VP8SetResidualCoeffs(rd->y_dc_levels, &res); R += VP8GetResidualCost(it->top_nz_[8] + it->left_nz_[8], &res); // AC VP8InitResidual(1, 0, enc, &res); for (y = 0; y < 4; ++y) { for (x = 0; x < 4; ++x) { const int ctx = it->top_nz_[x] + it->left_nz_[y]; VP8SetResidualCoeffs(rd->y_ac_levels[x + y * 4], &res); R += VP8GetResidualCost(ctx, &res); it->top_nz_[x] = it->left_nz_[y] = (res.last >= 0); } } return R; } int VP8GetCostUV(VP8EncIterator* const it, const VP8ModeScore* const rd) { VP8Residual res; VP8Encoder* const enc = it->enc_; int ch, x, y; int R = 0; VP8IteratorNzToBytes(it); // re-import the non-zero context VP8InitResidual(0, 2, enc, &res); for (ch = 0; ch <= 2; ch += 2) { for (y = 0; y < 2; ++y) { for (x = 0; x < 2; ++x) { const int ctx = it->top_nz_[4 + ch + x] + it->left_nz_[4 + ch + y]; VP8SetResidualCoeffs(rd->uv_levels[ch * 2 + x + y * 2], &res); R += VP8GetResidualCost(ctx, &res); it->top_nz_[4 + ch + x] = it->left_nz_[4 + ch + y] = (res.last >= 0); } } } return R; } //------------------------------------------------------------------------------ // Recording of token probabilities. // We keep the table-free variant around for reference, in case. #define USE_LEVEL_CODE_TABLE // Simulate block coding, but only record statistics. // Note: no need to record the fixed probas. int VP8RecordCoeffs(int ctx, const VP8Residual* const res) { int n = res->first; // should be stats[VP8EncBands[n]], but it's equivalent for n=0 or 1 proba_t* s = res->stats[n][ctx]; if (res->last < 0) { VP8RecordStats(0, s + 0); return 0; } while (n <= res->last) { int v; VP8RecordStats(1, s + 0); // order of record doesn't matter while ((v = res->coeffs[n++]) == 0) { VP8RecordStats(0, s + 1); s = res->stats[VP8EncBands[n]][0]; } VP8RecordStats(1, s + 1); if (!VP8RecordStats(2u < (unsigned int)(v + 1), s + 2)) { // v = -1 or 1 s = res->stats[VP8EncBands[n]][1]; } else { v = abs(v); #if !defined(USE_LEVEL_CODE_TABLE) if (!VP8RecordStats(v > 4, s + 3)) { if (VP8RecordStats(v != 2, s + 4)) VP8RecordStats(v == 4, s + 5); } else if (!VP8RecordStats(v > 10, s + 6)) { VP8RecordStats(v > 6, s + 7); } else if (!VP8RecordStats((v >= 3 + (8 << 2)), s + 8)) { VP8RecordStats((v >= 3 + (8 << 1)), s + 9); } else { VP8RecordStats((v >= 3 + (8 << 3)), s + 10); } #else if (v > MAX_VARIABLE_LEVEL) { v = MAX_VARIABLE_LEVEL; } { const int bits = VP8LevelCodes[v - 1][1]; int pattern = VP8LevelCodes[v - 1][0]; int i; for (i = 0; (pattern >>= 1) != 0; ++i) { const int mask = 2 << i; if (pattern & 1) VP8RecordStats(!!(bits & mask), s + 3 + i); } } #endif s = res->stats[VP8EncBands[n]][2]; } } if (n < 16) VP8RecordStats(0, s + 0); return 1; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/Makefile.am0000644000014400001440000000325114606317060013444 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) noinst_LTLIBRARIES = libwebpencode.la libwebpencode_la_SOURCES = libwebpencode_la_SOURCES += alpha_enc.c libwebpencode_la_SOURCES += analysis_enc.c libwebpencode_la_SOURCES += backward_references_cost_enc.c libwebpencode_la_SOURCES += backward_references_enc.c libwebpencode_la_SOURCES += backward_references_enc.h libwebpencode_la_SOURCES += config_enc.c libwebpencode_la_SOURCES += cost_enc.c libwebpencode_la_SOURCES += cost_enc.h libwebpencode_la_SOURCES += filter_enc.c libwebpencode_la_SOURCES += frame_enc.c libwebpencode_la_SOURCES += histogram_enc.c libwebpencode_la_SOURCES += histogram_enc.h libwebpencode_la_SOURCES += iterator_enc.c libwebpencode_la_SOURCES += near_lossless_enc.c libwebpencode_la_SOURCES += picture_enc.c libwebpencode_la_SOURCES += picture_csp_enc.c libwebpencode_la_SOURCES += picture_psnr_enc.c libwebpencode_la_SOURCES += picture_rescale_enc.c libwebpencode_la_SOURCES += picture_tools_enc.c libwebpencode_la_SOURCES += predictor_enc.c libwebpencode_la_SOURCES += quant_enc.c libwebpencode_la_SOURCES += syntax_enc.c libwebpencode_la_SOURCES += token_enc.c libwebpencode_la_SOURCES += tree_enc.c libwebpencode_la_SOURCES += vp8i_enc.h libwebpencode_la_SOURCES += vp8l_enc.c libwebpencode_la_SOURCES += vp8li_enc.h libwebpencode_la_SOURCES += webp_enc.c libwebpencodeinclude_HEADERS = libwebpencodeinclude_HEADERS += ../webp/encode.h libwebpencodeinclude_HEADERS += ../webp/types.h noinst_HEADERS = noinst_HEADERS += ../webp/format_constants.h libwebpencode_la_LIBADD = ../../sharpyuv/libsharpyuv.la libwebpencode_la_LDFLAGS = -lm libwebpencode_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpencodeincludedir = $(includedir)/webp libwebp-1.4.0/src/enc/alpha_enc.c0000644000014400001440000003705014606317060013472 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Alpha-plane compression. // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include "src/enc/vp8i_enc.h" #include "src/dsp/dsp.h" #include "src/utils/filters_utils.h" #include "src/utils/quant_levels_utils.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #include "src/webp/format_constants.h" // ----------------------------------------------------------------------------- // Encodes the given alpha data via specified compression method 'method'. // The pre-processing (quantization) is performed if 'quality' is less than 100. // For such cases, the encoding is lossy. The valid range is [0, 100] for // 'quality' and [0, 1] for 'method': // 'method = 0' - No compression; // 'method = 1' - Use lossless coder on the alpha plane only // 'filter' values [0, 4] correspond to prediction modes none, horizontal, // vertical & gradient filters. The prediction mode 4 will try all the // prediction modes 0 to 3 and pick the best one. // 'effort_level': specifies how much effort must be spent to try and reduce // the compressed output size. In range 0 (quick) to 6 (slow). // // 'output' corresponds to the buffer containing compressed alpha data. // This buffer is allocated by this method and caller should call // WebPSafeFree(*output) when done. // 'output_size' corresponds to size of this compressed alpha buffer. // // Returns 1 on successfully encoding the alpha and // 0 if either: // invalid quality or method, or // memory allocation for the compressed data fails. #include "src/enc/vp8li_enc.h" static int EncodeLossless(const uint8_t* const data, int width, int height, int effort_level, // in [0..6] range int use_quality_100, VP8LBitWriter* const bw, WebPAuxStats* const stats) { int ok = 0; WebPConfig config; WebPPicture picture; if (!WebPPictureInit(&picture)) return 0; picture.width = width; picture.height = height; picture.use_argb = 1; picture.stats = stats; if (!WebPPictureAlloc(&picture)) return 0; // Transfer the alpha values to the green channel. WebPDispatchAlphaToGreen(data, width, picture.width, picture.height, picture.argb, picture.argb_stride); if (!WebPConfigInit(&config)) return 0; config.lossless = 1; // Enable exact, or it would alter RGB values of transparent alpha, which is // normally OK but not here since we are not encoding the input image but an // internal encoding-related image containing necessary exact information in // RGB channels. config.exact = 1; config.method = effort_level; // impact is very small // Set a low default quality for encoding alpha. Ensure that Alpha quality at // lower methods (3 and below) is less than the threshold for triggering // costly 'BackwardReferencesTraceBackwards'. // If the alpha quality is set to 100 and the method to 6, allow for a high // lossless quality to trigger the cruncher. config.quality = (use_quality_100 && effort_level == 6) ? 100 : 8.f * effort_level; assert(config.quality >= 0 && config.quality <= 100.f); ok = VP8LEncodeStream(&config, &picture, bw); WebPPictureFree(&picture); ok = ok && !bw->error_; if (!ok) { VP8LBitWriterWipeOut(bw); return 0; } return 1; } // ----------------------------------------------------------------------------- // Small struct to hold the result of a filter mode compression attempt. typedef struct { size_t score; VP8BitWriter bw; WebPAuxStats stats; } FilterTrial; // This function always returns an initialized 'bw' object, even upon error. static int EncodeAlphaInternal(const uint8_t* const data, int width, int height, int method, int filter, int reduce_levels, int effort_level, // in [0..6] range uint8_t* const tmp_alpha, FilterTrial* result) { int ok = 0; const uint8_t* alpha_src; WebPFilterFunc filter_func; uint8_t header; const size_t data_size = width * height; const uint8_t* output = NULL; size_t output_size = 0; VP8LBitWriter tmp_bw; assert((uint64_t)data_size == (uint64_t)width * height); // as per spec assert(filter >= 0 && filter < WEBP_FILTER_LAST); assert(method >= ALPHA_NO_COMPRESSION); assert(method <= ALPHA_LOSSLESS_COMPRESSION); assert(sizeof(header) == ALPHA_HEADER_LEN); filter_func = WebPFilters[filter]; if (filter_func != NULL) { filter_func(data, width, height, width, tmp_alpha); alpha_src = tmp_alpha; } else { alpha_src = data; } if (method != ALPHA_NO_COMPRESSION) { ok = VP8LBitWriterInit(&tmp_bw, data_size >> 3); ok = ok && EncodeLossless(alpha_src, width, height, effort_level, !reduce_levels, &tmp_bw, &result->stats); if (ok) { output = VP8LBitWriterFinish(&tmp_bw); if (tmp_bw.error_) { VP8LBitWriterWipeOut(&tmp_bw); memset(&result->bw, 0, sizeof(result->bw)); return 0; } output_size = VP8LBitWriterNumBytes(&tmp_bw); if (output_size > data_size) { // compressed size is larger than source! Revert to uncompressed mode. method = ALPHA_NO_COMPRESSION; VP8LBitWriterWipeOut(&tmp_bw); } } else { VP8LBitWriterWipeOut(&tmp_bw); memset(&result->bw, 0, sizeof(result->bw)); return 0; } } if (method == ALPHA_NO_COMPRESSION) { output = alpha_src; output_size = data_size; ok = 1; } // Emit final result. header = method | (filter << 2); if (reduce_levels) header |= ALPHA_PREPROCESSED_LEVELS << 4; if (!VP8BitWriterInit(&result->bw, ALPHA_HEADER_LEN + output_size)) ok = 0; ok = ok && VP8BitWriterAppend(&result->bw, &header, ALPHA_HEADER_LEN); ok = ok && VP8BitWriterAppend(&result->bw, output, output_size); if (method != ALPHA_NO_COMPRESSION) { VP8LBitWriterWipeOut(&tmp_bw); } ok = ok && !result->bw.error_; result->score = VP8BitWriterSize(&result->bw); return ok; } // ----------------------------------------------------------------------------- static int GetNumColors(const uint8_t* data, int width, int height, int stride) { int j; int colors = 0; uint8_t color[256] = { 0 }; for (j = 0; j < height; ++j) { int i; const uint8_t* const p = data + j * stride; for (i = 0; i < width; ++i) { color[p[i]] = 1; } } for (j = 0; j < 256; ++j) { if (color[j] > 0) ++colors; } return colors; } #define FILTER_TRY_NONE (1 << WEBP_FILTER_NONE) #define FILTER_TRY_ALL ((1 << WEBP_FILTER_LAST) - 1) // Given the input 'filter' option, return an OR'd bit-set of filters to try. static uint32_t GetFilterMap(const uint8_t* alpha, int width, int height, int filter, int effort_level) { uint32_t bit_map = 0U; if (filter == WEBP_FILTER_FAST) { // Quick estimate of the best candidate. int try_filter_none = (effort_level > 3); const int kMinColorsForFilterNone = 16; const int kMaxColorsForFilterNone = 192; const int num_colors = GetNumColors(alpha, width, height, width); // For low number of colors, NONE yields better compression. filter = (num_colors <= kMinColorsForFilterNone) ? WEBP_FILTER_NONE : WebPEstimateBestFilter(alpha, width, height, width); bit_map |= 1 << filter; // For large number of colors, try FILTER_NONE in addition to the best // filter as well. if (try_filter_none || num_colors > kMaxColorsForFilterNone) { bit_map |= FILTER_TRY_NONE; } } else if (filter == WEBP_FILTER_NONE) { bit_map = FILTER_TRY_NONE; } else { // WEBP_FILTER_BEST -> try all bit_map = FILTER_TRY_ALL; } return bit_map; } static void InitFilterTrial(FilterTrial* const score) { score->score = (size_t)~0U; VP8BitWriterInit(&score->bw, 0); } static int ApplyFiltersAndEncode(const uint8_t* alpha, int width, int height, size_t data_size, int method, int filter, int reduce_levels, int effort_level, uint8_t** const output, size_t* const output_size, WebPAuxStats* const stats) { int ok = 1; FilterTrial best; uint32_t try_map = GetFilterMap(alpha, width, height, filter, effort_level); InitFilterTrial(&best); if (try_map != FILTER_TRY_NONE) { uint8_t* filtered_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size); if (filtered_alpha == NULL) return 0; for (filter = WEBP_FILTER_NONE; ok && try_map; ++filter, try_map >>= 1) { if (try_map & 1) { FilterTrial trial; ok = EncodeAlphaInternal(alpha, width, height, method, filter, reduce_levels, effort_level, filtered_alpha, &trial); if (ok && trial.score < best.score) { VP8BitWriterWipeOut(&best.bw); best = trial; } else { VP8BitWriterWipeOut(&trial.bw); } } } WebPSafeFree(filtered_alpha); } else { ok = EncodeAlphaInternal(alpha, width, height, method, WEBP_FILTER_NONE, reduce_levels, effort_level, NULL, &best); } if (ok) { #if !defined(WEBP_DISABLE_STATS) if (stats != NULL) { stats->lossless_features = best.stats.lossless_features; stats->histogram_bits = best.stats.histogram_bits; stats->transform_bits = best.stats.transform_bits; stats->cache_bits = best.stats.cache_bits; stats->palette_size = best.stats.palette_size; stats->lossless_size = best.stats.lossless_size; stats->lossless_hdr_size = best.stats.lossless_hdr_size; stats->lossless_data_size = best.stats.lossless_data_size; } #else (void)stats; #endif *output_size = VP8BitWriterSize(&best.bw); *output = VP8BitWriterBuf(&best.bw); } else { VP8BitWriterWipeOut(&best.bw); } return ok; } static int EncodeAlpha(VP8Encoder* const enc, int quality, int method, int filter, int effort_level, uint8_t** const output, size_t* const output_size) { const WebPPicture* const pic = enc->pic_; const int width = pic->width; const int height = pic->height; uint8_t* quant_alpha = NULL; const size_t data_size = width * height; uint64_t sse = 0; int ok = 1; const int reduce_levels = (quality < 100); // quick correctness checks assert((uint64_t)data_size == (uint64_t)width * height); // as per spec assert(enc != NULL && pic != NULL && pic->a != NULL); assert(output != NULL && output_size != NULL); assert(width > 0 && height > 0); assert(pic->a_stride >= width); assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST); if (quality < 0 || quality > 100) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION); } if (method < ALPHA_NO_COMPRESSION || method > ALPHA_LOSSLESS_COMPRESSION) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION); } if (method == ALPHA_NO_COMPRESSION) { // Don't filter, as filtering will make no impact on compressed size. filter = WEBP_FILTER_NONE; } quant_alpha = (uint8_t*)WebPSafeMalloc(1ULL, data_size); if (quant_alpha == NULL) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } // Extract alpha data (width x height) from raw_data (stride x height). WebPCopyPlane(pic->a, pic->a_stride, quant_alpha, width, width, height); if (reduce_levels) { // No Quantization required for 'quality = 100'. // 16 alpha levels gives quite a low MSE w.r.t original alpha plane hence // mapped to moderate quality 70. Hence Quality:[0, 70] -> Levels:[2, 16] // and Quality:]70, 100] -> Levels:]16, 256]. const int alpha_levels = (quality <= 70) ? (2 + quality / 5) : (16 + (quality - 70) * 8); ok = QuantizeLevels(quant_alpha, width, height, alpha_levels, &sse); } if (ok) { VP8FiltersInit(); ok = ApplyFiltersAndEncode(quant_alpha, width, height, data_size, method, filter, reduce_levels, effort_level, output, output_size, pic->stats); if (!ok) { WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); // imprecise } #if !defined(WEBP_DISABLE_STATS) if (pic->stats != NULL) { // need stats? pic->stats->coded_size += (int)(*output_size); enc->sse_[3] = sse; } #endif } WebPSafeFree(quant_alpha); return ok; } //------------------------------------------------------------------------------ // Main calls static int CompressAlphaJob(void* arg1, void* unused) { VP8Encoder* const enc = (VP8Encoder*)arg1; const WebPConfig* config = enc->config_; uint8_t* alpha_data = NULL; size_t alpha_size = 0; const int effort_level = config->method; // maps to [0..6] const WEBP_FILTER_TYPE filter = (config->alpha_filtering == 0) ? WEBP_FILTER_NONE : (config->alpha_filtering == 1) ? WEBP_FILTER_FAST : WEBP_FILTER_BEST; if (!EncodeAlpha(enc, config->alpha_quality, config->alpha_compression, filter, effort_level, &alpha_data, &alpha_size)) { return 0; } if (alpha_size != (uint32_t)alpha_size) { // Soundness check. WebPSafeFree(alpha_data); return 0; } enc->alpha_data_size_ = (uint32_t)alpha_size; enc->alpha_data_ = alpha_data; (void)unused; return 1; } void VP8EncInitAlpha(VP8Encoder* const enc) { WebPInitAlphaProcessing(); enc->has_alpha_ = WebPPictureHasTransparency(enc->pic_); enc->alpha_data_ = NULL; enc->alpha_data_size_ = 0; if (enc->thread_level_ > 0) { WebPWorker* const worker = &enc->alpha_worker_; WebPGetWorkerInterface()->Init(worker); worker->data1 = enc; worker->data2 = NULL; worker->hook = CompressAlphaJob; } } int VP8EncStartAlpha(VP8Encoder* const enc) { if (enc->has_alpha_) { if (enc->thread_level_ > 0) { WebPWorker* const worker = &enc->alpha_worker_; // Makes sure worker is good to go. if (!WebPGetWorkerInterface()->Reset(worker)) { return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } WebPGetWorkerInterface()->Launch(worker); return 1; } else { return CompressAlphaJob(enc, NULL); // just do the job right away } } return 1; } int VP8EncFinishAlpha(VP8Encoder* const enc) { if (enc->has_alpha_) { if (enc->thread_level_ > 0) { WebPWorker* const worker = &enc->alpha_worker_; if (!WebPGetWorkerInterface()->Sync(worker)) return 0; // error } } return WebPReportProgress(enc->pic_, enc->percent_ + 20, &enc->percent_); } int VP8EncDeleteAlpha(VP8Encoder* const enc) { int ok = 1; if (enc->thread_level_ > 0) { WebPWorker* const worker = &enc->alpha_worker_; // finish anything left in flight ok = WebPGetWorkerInterface()->Sync(worker); // still need to end the worker, even if !ok WebPGetWorkerInterface()->End(worker); } WebPSafeFree(enc->alpha_data_); enc->alpha_data_ = NULL; enc->alpha_data_size_ = 0; enc->has_alpha_ = 0; return ok; } libwebp-1.4.0/src/enc/near_lossless_enc.c0000644000014400001440000001230714606317060015257 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Near-lossless image preprocessing adjusts pixel values to help // compressibility with a guarantee of maximum deviation between original and // resulting pixel values. // // Author: Jyrki Alakuijala (jyrki@google.com) // Converted to C by Aleksander Kramarz (akramarz@google.com) #include #include #include "src/dsp/lossless_common.h" #include "src/utils/utils.h" #include "src/enc/vp8li_enc.h" #if (WEBP_NEAR_LOSSLESS == 1) #define MIN_DIM_FOR_NEAR_LOSSLESS 64 #define MAX_LIMIT_BITS 5 // Quantizes the value up or down to a multiple of 1<> 1) + ((a >> bits) & 1); assert(bits > 0); if (biased > 0xff) return 0xff; return biased & ~mask; } // Applies FindClosestDiscretized to all channels of pixel. static uint32_t ClosestDiscretizedArgb(uint32_t a, int bits) { return (FindClosestDiscretized(a >> 24, bits) << 24) | (FindClosestDiscretized((a >> 16) & 0xff, bits) << 16) | (FindClosestDiscretized((a >> 8) & 0xff, bits) << 8) | (FindClosestDiscretized(a & 0xff, bits)); } // Checks if distance between corresponding channel values of pixels a and b // is within the given limit. static int IsNear(uint32_t a, uint32_t b, int limit) { int k; for (k = 0; k < 4; ++k) { const int delta = (int)((a >> (k * 8)) & 0xff) - (int)((b >> (k * 8)) & 0xff); if (delta >= limit || delta <= -limit) { return 0; } } return 1; } static int IsSmooth(const uint32_t* const prev_row, const uint32_t* const curr_row, const uint32_t* const next_row, int ix, int limit) { // Check that all pixels in 4-connected neighborhood are smooth. return (IsNear(curr_row[ix], curr_row[ix - 1], limit) && IsNear(curr_row[ix], curr_row[ix + 1], limit) && IsNear(curr_row[ix], prev_row[ix], limit) && IsNear(curr_row[ix], next_row[ix], limit)); } // Adjusts pixel values of image with given maximum error. static void NearLossless(int xsize, int ysize, const uint32_t* argb_src, int stride, int limit_bits, uint32_t* copy_buffer, uint32_t* argb_dst) { int x, y; const int limit = 1 << limit_bits; uint32_t* prev_row = copy_buffer; uint32_t* curr_row = prev_row + xsize; uint32_t* next_row = curr_row + xsize; memcpy(curr_row, argb_src, xsize * sizeof(argb_src[0])); memcpy(next_row, argb_src + stride, xsize * sizeof(argb_src[0])); for (y = 0; y < ysize; ++y, argb_src += stride, argb_dst += xsize) { if (y == 0 || y == ysize - 1) { memcpy(argb_dst, argb_src, xsize * sizeof(argb_src[0])); } else { memcpy(next_row, argb_src + stride, xsize * sizeof(argb_src[0])); argb_dst[0] = argb_src[0]; argb_dst[xsize - 1] = argb_src[xsize - 1]; for (x = 1; x < xsize - 1; ++x) { if (IsSmooth(prev_row, curr_row, next_row, x, limit)) { argb_dst[x] = curr_row[x]; } else { argb_dst[x] = ClosestDiscretizedArgb(curr_row[x], limit_bits); } } } { // Three-way swap. uint32_t* const temp = prev_row; prev_row = curr_row; curr_row = next_row; next_row = temp; } } } int VP8ApplyNearLossless(const WebPPicture* const picture, int quality, uint32_t* const argb_dst) { int i; const int xsize = picture->width; const int ysize = picture->height; const int stride = picture->argb_stride; uint32_t* const copy_buffer = (uint32_t*)WebPSafeMalloc(xsize * 3, sizeof(*copy_buffer)); const int limit_bits = VP8LNearLosslessBits(quality); assert(argb_dst != NULL); assert(limit_bits > 0); assert(limit_bits <= MAX_LIMIT_BITS); if (copy_buffer == NULL) { return 0; } // For small icon images, don't attempt to apply near-lossless compression. if ((xsize < MIN_DIM_FOR_NEAR_LOSSLESS && ysize < MIN_DIM_FOR_NEAR_LOSSLESS) || ysize < 3) { for (i = 0; i < ysize; ++i) { memcpy(argb_dst + i * xsize, picture->argb + i * picture->argb_stride, xsize * sizeof(*argb_dst)); } WebPSafeFree(copy_buffer); return 1; } NearLossless(xsize, ysize, picture->argb, stride, limit_bits, copy_buffer, argb_dst); for (i = limit_bits - 1; i != 0; --i) { NearLossless(xsize, ysize, argb_dst, xsize, i, copy_buffer, argb_dst); } WebPSafeFree(copy_buffer); return 1; } #else // (WEBP_NEAR_LOSSLESS == 1) // Define a stub to suppress compiler warnings. extern void VP8LNearLosslessStub(void); void VP8LNearLosslessStub(void) {} #endif // (WEBP_NEAR_LOSSLESS == 1) libwebp-1.4.0/src/enc/token_enc.c0000644000014400001440000002031614606317060013522 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Paginated token buffer // // A 'token' is a bit value associated with a probability, either fixed // or a later-to-be-determined after statistics have been collected. // For dynamic probability, we just record the slot id (idx) for the probability // value in the final probability array (uint8_t* probas in VP8EmitTokens). // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" #if !defined(DISABLE_TOKEN_BUFFER) // we use pages to reduce the number of memcpy() #define MIN_PAGE_SIZE 8192 // minimum number of token per page #define FIXED_PROBA_BIT (1u << 14) typedef uint16_t token_t; // bit #15: bit value // bit #14: flags for constant proba or idx // bits #0..13: slot or constant proba struct VP8Tokens { VP8Tokens* next_; // pointer to next page }; // Token data is located in memory just after the next_ field. // This macro is used to return their address and hide the trick. #define TOKEN_DATA(p) ((const token_t*)&(p)[1]) //------------------------------------------------------------------------------ void VP8TBufferInit(VP8TBuffer* const b, int page_size) { b->tokens_ = NULL; b->pages_ = NULL; b->last_page_ = &b->pages_; b->left_ = 0; b->page_size_ = (page_size < MIN_PAGE_SIZE) ? MIN_PAGE_SIZE : page_size; b->error_ = 0; } void VP8TBufferClear(VP8TBuffer* const b) { if (b != NULL) { VP8Tokens* p = b->pages_; while (p != NULL) { VP8Tokens* const next = p->next_; WebPSafeFree(p); p = next; } VP8TBufferInit(b, b->page_size_); } } static int TBufferNewPage(VP8TBuffer* const b) { VP8Tokens* page = NULL; if (!b->error_) { const size_t size = sizeof(*page) + b->page_size_ * sizeof(token_t); page = (VP8Tokens*)WebPSafeMalloc(1ULL, size); } if (page == NULL) { b->error_ = 1; return 0; } page->next_ = NULL; *b->last_page_ = page; b->last_page_ = &page->next_; b->left_ = b->page_size_; b->tokens_ = (token_t*)TOKEN_DATA(page); return 1; } //------------------------------------------------------------------------------ #define TOKEN_ID(t, b, ctx) \ (NUM_PROBAS * ((ctx) + NUM_CTX * ((b) + NUM_BANDS * (t)))) static WEBP_INLINE uint32_t AddToken(VP8TBuffer* const b, uint32_t bit, uint32_t proba_idx, proba_t* const stats) { assert(proba_idx < FIXED_PROBA_BIT); assert(bit <= 1); if (b->left_ > 0 || TBufferNewPage(b)) { const int slot = --b->left_; b->tokens_[slot] = (bit << 15) | proba_idx; } VP8RecordStats(bit, stats); return bit; } static WEBP_INLINE void AddConstantToken(VP8TBuffer* const b, uint32_t bit, uint32_t proba) { assert(proba < 256); assert(bit <= 1); if (b->left_ > 0 || TBufferNewPage(b)) { const int slot = --b->left_; b->tokens_[slot] = (bit << 15) | FIXED_PROBA_BIT | proba; } } int VP8RecordCoeffTokens(int ctx, const struct VP8Residual* const res, VP8TBuffer* const tokens) { const int16_t* const coeffs = res->coeffs; const int coeff_type = res->coeff_type; const int last = res->last; int n = res->first; uint32_t base_id = TOKEN_ID(coeff_type, n, ctx); // should be stats[VP8EncBands[n]], but it's equivalent for n=0 or 1 proba_t* s = res->stats[n][ctx]; if (!AddToken(tokens, last >= 0, base_id + 0, s + 0)) { return 0; } while (n < 16) { const int c = coeffs[n++]; const int sign = c < 0; const uint32_t v = sign ? -c : c; if (!AddToken(tokens, v != 0, base_id + 1, s + 1)) { base_id = TOKEN_ID(coeff_type, VP8EncBands[n], 0); // ctx=0 s = res->stats[VP8EncBands[n]][0]; continue; } if (!AddToken(tokens, v > 1, base_id + 2, s + 2)) { base_id = TOKEN_ID(coeff_type, VP8EncBands[n], 1); // ctx=1 s = res->stats[VP8EncBands[n]][1]; } else { if (!AddToken(tokens, v > 4, base_id + 3, s + 3)) { if (AddToken(tokens, v != 2, base_id + 4, s + 4)) { AddToken(tokens, v == 4, base_id + 5, s + 5); } } else if (!AddToken(tokens, v > 10, base_id + 6, s + 6)) { if (!AddToken(tokens, v > 6, base_id + 7, s + 7)) { AddConstantToken(tokens, v == 6, 159); } else { AddConstantToken(tokens, v >= 9, 165); AddConstantToken(tokens, !(v & 1), 145); } } else { int mask; const uint8_t* tab; uint32_t residue = v - 3; if (residue < (8 << 1)) { // VP8Cat3 (3b) AddToken(tokens, 0, base_id + 8, s + 8); AddToken(tokens, 0, base_id + 9, s + 9); residue -= (8 << 0); mask = 1 << 2; tab = VP8Cat3; } else if (residue < (8 << 2)) { // VP8Cat4 (4b) AddToken(tokens, 0, base_id + 8, s + 8); AddToken(tokens, 1, base_id + 9, s + 9); residue -= (8 << 1); mask = 1 << 3; tab = VP8Cat4; } else if (residue < (8 << 3)) { // VP8Cat5 (5b) AddToken(tokens, 1, base_id + 8, s + 8); AddToken(tokens, 0, base_id + 10, s + 9); residue -= (8 << 2); mask = 1 << 4; tab = VP8Cat5; } else { // VP8Cat6 (11b) AddToken(tokens, 1, base_id + 8, s + 8); AddToken(tokens, 1, base_id + 10, s + 9); residue -= (8 << 3); mask = 1 << 10; tab = VP8Cat6; } while (mask) { AddConstantToken(tokens, !!(residue & mask), *tab++); mask >>= 1; } } base_id = TOKEN_ID(coeff_type, VP8EncBands[n], 2); // ctx=2 s = res->stats[VP8EncBands[n]][2]; } AddConstantToken(tokens, sign, 128); if (n == 16 || !AddToken(tokens, n <= last, base_id + 0, s + 0)) { return 1; // EOB } } return 1; } #undef TOKEN_ID //------------------------------------------------------------------------------ // Final coding pass, with known probabilities int VP8EmitTokens(VP8TBuffer* const b, VP8BitWriter* const bw, const uint8_t* const probas, int final_pass) { const VP8Tokens* p = b->pages_; assert(!b->error_); while (p != NULL) { const VP8Tokens* const next = p->next_; const int N = (next == NULL) ? b->left_ : 0; int n = b->page_size_; const token_t* const tokens = TOKEN_DATA(p); while (n-- > N) { const token_t token = tokens[n]; const int bit = (token >> 15) & 1; if (token & FIXED_PROBA_BIT) { VP8PutBit(bw, bit, token & 0xffu); // constant proba } else { VP8PutBit(bw, bit, probas[token & 0x3fffu]); } } if (final_pass) WebPSafeFree((void*)p); p = next; } if (final_pass) b->pages_ = NULL; return 1; } // Size estimation size_t VP8EstimateTokenSize(VP8TBuffer* const b, const uint8_t* const probas) { size_t size = 0; const VP8Tokens* p = b->pages_; assert(!b->error_); while (p != NULL) { const VP8Tokens* const next = p->next_; const int N = (next == NULL) ? b->left_ : 0; int n = b->page_size_; const token_t* const tokens = TOKEN_DATA(p); while (n-- > N) { const token_t token = tokens[n]; const int bit = token & (1 << 15); if (token & FIXED_PROBA_BIT) { size += VP8BitCost(bit, token & 0xffu); } else { size += VP8BitCost(bit, probas[token & 0x3fffu]); } } p = next; } return size; } //------------------------------------------------------------------------------ #else // DISABLE_TOKEN_BUFFER void VP8TBufferInit(VP8TBuffer* const b, int page_size) { (void)b; (void)page_size; } void VP8TBufferClear(VP8TBuffer* const b) { (void)b; } #endif // !DISABLE_TOKEN_BUFFER libwebp-1.4.0/src/enc/picture_rescale_enc.c0000644000014400001440000002430314606317060015553 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebPPicture tools: copy, crop, rescaling and view. // // Author: Skal (pascal.massimino@gmail.com) #include "src/webp/encode.h" #include #include #include "src/enc/vp8i_enc.h" #if !defined(WEBP_REDUCE_SIZE) #include "src/utils/rescaler_utils.h" #include "src/utils/utils.h" #endif // !defined(WEBP_REDUCE_SIZE) #define HALVE(x) (((x) + 1) >> 1) // Grab the 'specs' (writer, *opaque, width, height...) from 'src' and copy them // into 'dst'. Mark 'dst' as not owning any memory. static void PictureGrabSpecs(const WebPPicture* const src, WebPPicture* const dst) { assert(src != NULL && dst != NULL); *dst = *src; WebPPictureResetBuffers(dst); } //------------------------------------------------------------------------------ // Adjust top-left corner to chroma sample position. static void SnapTopLeftPosition(const WebPPicture* const pic, int* const left, int* const top) { if (!pic->use_argb) { *left &= ~1; *top &= ~1; } } // Adjust top-left corner and verify that the sub-rectangle is valid. static int AdjustAndCheckRectangle(const WebPPicture* const pic, int* const left, int* const top, int width, int height) { SnapTopLeftPosition(pic, left, top); if ((*left) < 0 || (*top) < 0) return 0; if (width <= 0 || height <= 0) return 0; if ((*left) + width > pic->width) return 0; if ((*top) + height > pic->height) return 0; return 1; } #if !defined(WEBP_REDUCE_SIZE) int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) { if (src == NULL || dst == NULL) return 0; if (src == dst) return 1; PictureGrabSpecs(src, dst); if (!WebPPictureAlloc(dst)) return 0; if (!src->use_argb) { WebPCopyPlane(src->y, src->y_stride, dst->y, dst->y_stride, dst->width, dst->height); WebPCopyPlane(src->u, src->uv_stride, dst->u, dst->uv_stride, HALVE(dst->width), HALVE(dst->height)); WebPCopyPlane(src->v, src->uv_stride, dst->v, dst->uv_stride, HALVE(dst->width), HALVE(dst->height)); if (dst->a != NULL) { WebPCopyPlane(src->a, src->a_stride, dst->a, dst->a_stride, dst->width, dst->height); } } else { WebPCopyPlane((const uint8_t*)src->argb, 4 * src->argb_stride, (uint8_t*)dst->argb, 4 * dst->argb_stride, 4 * dst->width, dst->height); } return 1; } #endif // !defined(WEBP_REDUCE_SIZE) int WebPPictureIsView(const WebPPicture* picture) { if (picture == NULL) return 0; if (picture->use_argb) { return (picture->memory_argb_ == NULL); } return (picture->memory_ == NULL); } int WebPPictureView(const WebPPicture* src, int left, int top, int width, int height, WebPPicture* dst) { if (src == NULL || dst == NULL) return 0; // verify rectangle position. if (!AdjustAndCheckRectangle(src, &left, &top, width, height)) return 0; if (src != dst) { // beware of aliasing! We don't want to leak 'memory_'. PictureGrabSpecs(src, dst); } dst->width = width; dst->height = height; if (!src->use_argb) { dst->y = src->y + top * src->y_stride + left; dst->u = src->u + (top >> 1) * src->uv_stride + (left >> 1); dst->v = src->v + (top >> 1) * src->uv_stride + (left >> 1); dst->y_stride = src->y_stride; dst->uv_stride = src->uv_stride; if (src->a != NULL) { dst->a = src->a + top * src->a_stride + left; dst->a_stride = src->a_stride; } } else { dst->argb = src->argb + top * src->argb_stride + left; dst->argb_stride = src->argb_stride; } return 1; } #if !defined(WEBP_REDUCE_SIZE) //------------------------------------------------------------------------------ // Picture cropping int WebPPictureCrop(WebPPicture* pic, int left, int top, int width, int height) { WebPPicture tmp; if (pic == NULL) return 0; if (!AdjustAndCheckRectangle(pic, &left, &top, width, height)) return 0; PictureGrabSpecs(pic, &tmp); tmp.width = width; tmp.height = height; if (!WebPPictureAlloc(&tmp)) { return WebPEncodingSetError(pic, tmp.error_code); } if (!pic->use_argb) { const int y_offset = top * pic->y_stride + left; const int uv_offset = (top / 2) * pic->uv_stride + left / 2; WebPCopyPlane(pic->y + y_offset, pic->y_stride, tmp.y, tmp.y_stride, width, height); WebPCopyPlane(pic->u + uv_offset, pic->uv_stride, tmp.u, tmp.uv_stride, HALVE(width), HALVE(height)); WebPCopyPlane(pic->v + uv_offset, pic->uv_stride, tmp.v, tmp.uv_stride, HALVE(width), HALVE(height)); if (tmp.a != NULL) { const int a_offset = top * pic->a_stride + left; WebPCopyPlane(pic->a + a_offset, pic->a_stride, tmp.a, tmp.a_stride, width, height); } } else { const uint8_t* const src = (const uint8_t*)(pic->argb + top * pic->argb_stride + left); WebPCopyPlane(src, pic->argb_stride * 4, (uint8_t*)tmp.argb, tmp.argb_stride * 4, width * 4, height); } WebPPictureFree(pic); *pic = tmp; return 1; } //------------------------------------------------------------------------------ // Simple picture rescaler static int RescalePlane(const uint8_t* src, int src_width, int src_height, int src_stride, uint8_t* dst, int dst_width, int dst_height, int dst_stride, rescaler_t* const work, int num_channels) { WebPRescaler rescaler; int y = 0; if (!WebPRescalerInit(&rescaler, src_width, src_height, dst, dst_width, dst_height, dst_stride, num_channels, work)) { return 0; } while (y < src_height) { y += WebPRescalerImport(&rescaler, src_height - y, src + y * src_stride, src_stride); WebPRescalerExport(&rescaler); } return 1; } static void AlphaMultiplyARGB(WebPPicture* const pic, int inverse) { assert(pic->argb != NULL); WebPMultARGBRows((uint8_t*)pic->argb, pic->argb_stride * sizeof(*pic->argb), pic->width, pic->height, inverse); } static void AlphaMultiplyY(WebPPicture* const pic, int inverse) { if (pic->a != NULL) { WebPMultRows(pic->y, pic->y_stride, pic->a, pic->a_stride, pic->width, pic->height, inverse); } } int WebPPictureRescale(WebPPicture* picture, int width, int height) { WebPPicture tmp; int prev_width, prev_height; rescaler_t* work; if (picture == NULL) return 0; prev_width = picture->width; prev_height = picture->height; if (!WebPRescalerGetScaledDimensions( prev_width, prev_height, &width, &height)) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } PictureGrabSpecs(picture, &tmp); tmp.width = width; tmp.height = height; if (!WebPPictureAlloc(&tmp)) { return WebPEncodingSetError(picture, tmp.error_code); } if (!picture->use_argb) { work = (rescaler_t*)WebPSafeMalloc(2ULL * width, sizeof(*work)); if (work == NULL) { WebPPictureFree(&tmp); return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } // If present, we need to rescale alpha first (for AlphaMultiplyY). if (picture->a != NULL) { WebPInitAlphaProcessing(); if (!RescalePlane(picture->a, prev_width, prev_height, picture->a_stride, tmp.a, width, height, tmp.a_stride, work, 1)) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } } // We take transparency into account on the luma plane only. That's not // totally exact blending, but still is a good approximation. AlphaMultiplyY(picture, 0); if (!RescalePlane(picture->y, prev_width, prev_height, picture->y_stride, tmp.y, width, height, tmp.y_stride, work, 1) || !RescalePlane(picture->u, HALVE(prev_width), HALVE(prev_height), picture->uv_stride, tmp.u, HALVE(width), HALVE(height), tmp.uv_stride, work, 1) || !RescalePlane(picture->v, HALVE(prev_width), HALVE(prev_height), picture->uv_stride, tmp.v, HALVE(width), HALVE(height), tmp.uv_stride, work, 1)) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } AlphaMultiplyY(&tmp, 1); } else { work = (rescaler_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work)); if (work == NULL) { WebPPictureFree(&tmp); return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } // In order to correctly interpolate colors, we need to apply the alpha // weighting first (black-matting), scale the RGB values, and remove // the premultiplication afterward (while preserving the alpha channel). WebPInitAlphaProcessing(); AlphaMultiplyARGB(picture, 0); if (!RescalePlane((const uint8_t*)picture->argb, prev_width, prev_height, picture->argb_stride * 4, (uint8_t*)tmp.argb, width, height, tmp.argb_stride * 4, work, 4)) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_BAD_DIMENSION); } AlphaMultiplyARGB(&tmp, 1); } WebPPictureFree(picture); WebPSafeFree(work); *picture = tmp; return 1; } #else // defined(WEBP_REDUCE_SIZE) int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) { (void)src; (void)dst; return 0; } int WebPPictureCrop(WebPPicture* pic, int left, int top, int width, int height) { (void)pic; (void)left; (void)top; (void)width; (void)height; return 0; } int WebPPictureRescale(WebPPicture* pic, int width, int height) { (void)pic; (void)width; (void)height; return 0; } #endif // !defined(WEBP_REDUCE_SIZE) libwebp-1.4.0/src/enc/picture_tools_enc.c0000644000014400001440000002121414606317060015273 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebPPicture tools: alpha handling, etc. // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/enc/vp8i_enc.h" #include "src/dsp/yuv.h" //------------------------------------------------------------------------------ // Helper: clean up fully transparent area to help compressibility. #define SIZE 8 #define SIZE2 (SIZE / 2) static int IsTransparentARGBArea(const uint32_t* ptr, int stride, int size) { int y, x; for (y = 0; y < size; ++y) { for (x = 0; x < size; ++x) { if (ptr[x] & 0xff000000u) { return 0; } } ptr += stride; } return 1; } static void Flatten(uint8_t* ptr, int v, int stride, int size) { int y; for (y = 0; y < size; ++y) { memset(ptr, v, size); ptr += stride; } } static void FlattenARGB(uint32_t* ptr, uint32_t v, int stride, int size) { int x, y; for (y = 0; y < size; ++y) { for (x = 0; x < size; ++x) ptr[x] = v; ptr += stride; } } // Smoothen the luma components of transparent pixels. Return true if the whole // block is transparent. static int SmoothenBlock(const uint8_t* a_ptr, int a_stride, uint8_t* y_ptr, int y_stride, int width, int height) { int sum = 0, count = 0; int x, y; const uint8_t* alpha_ptr = a_ptr; uint8_t* luma_ptr = y_ptr; for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { if (alpha_ptr[x] != 0) { ++count; sum += luma_ptr[x]; } } alpha_ptr += a_stride; luma_ptr += y_stride; } if (count > 0 && count < width * height) { const uint8_t avg_u8 = (uint8_t)(sum / count); alpha_ptr = a_ptr; luma_ptr = y_ptr; for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { if (alpha_ptr[x] == 0) luma_ptr[x] = avg_u8; } alpha_ptr += a_stride; luma_ptr += y_stride; } } return (count == 0); } void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color) { if (pic != NULL && pic->use_argb) { int y = pic->height; uint32_t* argb = pic->argb; color &= 0xffffffu; // force alpha=0 WebPInitAlphaProcessing(); while (y-- > 0) { WebPAlphaReplace(argb, pic->width, color); argb += pic->argb_stride; } } } void WebPCleanupTransparentArea(WebPPicture* pic) { int x, y, w, h; if (pic == NULL) return; w = pic->width / SIZE; h = pic->height / SIZE; // note: we ignore the left-overs on right/bottom, except for SmoothenBlock(). if (pic->use_argb) { uint32_t argb_value = 0; for (y = 0; y < h; ++y) { int need_reset = 1; for (x = 0; x < w; ++x) { const int off = (y * pic->argb_stride + x) * SIZE; if (IsTransparentARGBArea(pic->argb + off, pic->argb_stride, SIZE)) { if (need_reset) { argb_value = pic->argb[off]; need_reset = 0; } FlattenARGB(pic->argb + off, argb_value, pic->argb_stride, SIZE); } else { need_reset = 1; } } } } else { const int width = pic->width; const int height = pic->height; const int y_stride = pic->y_stride; const int uv_stride = pic->uv_stride; const int a_stride = pic->a_stride; uint8_t* y_ptr = pic->y; uint8_t* u_ptr = pic->u; uint8_t* v_ptr = pic->v; const uint8_t* a_ptr = pic->a; int values[3] = { 0 }; if (a_ptr == NULL || y_ptr == NULL || u_ptr == NULL || v_ptr == NULL) { return; } for (y = 0; y + SIZE <= height; y += SIZE) { int need_reset = 1; for (x = 0; x + SIZE <= width; x += SIZE) { if (SmoothenBlock(a_ptr + x, a_stride, y_ptr + x, y_stride, SIZE, SIZE)) { if (need_reset) { values[0] = y_ptr[x]; values[1] = u_ptr[x >> 1]; values[2] = v_ptr[x >> 1]; need_reset = 0; } Flatten(y_ptr + x, values[0], y_stride, SIZE); Flatten(u_ptr + (x >> 1), values[1], uv_stride, SIZE2); Flatten(v_ptr + (x >> 1), values[2], uv_stride, SIZE2); } else { need_reset = 1; } } if (x < width) { SmoothenBlock(a_ptr + x, a_stride, y_ptr + x, y_stride, width - x, SIZE); } a_ptr += SIZE * a_stride; y_ptr += SIZE * y_stride; u_ptr += SIZE2 * uv_stride; v_ptr += SIZE2 * uv_stride; } if (y < height) { const int sub_height = height - y; for (x = 0; x + SIZE <= width; x += SIZE) { SmoothenBlock(a_ptr + x, a_stride, y_ptr + x, y_stride, SIZE, sub_height); } if (x < width) { SmoothenBlock(a_ptr + x, a_stride, y_ptr + x, y_stride, width - x, sub_height); } } } } #undef SIZE #undef SIZE2 //------------------------------------------------------------------------------ // Blend color and remove transparency info #define BLEND(V0, V1, ALPHA) \ ((((V0) * (255 - (ALPHA)) + (V1) * (ALPHA)) * 0x101 + 256) >> 16) #define BLEND_10BIT(V0, V1, ALPHA) \ ((((V0) * (1020 - (ALPHA)) + (V1) * (ALPHA)) * 0x101 + 1024) >> 18) static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) { return (0xff000000u | (r << 16) | (g << 8) | b); } void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb) { const int red = (background_rgb >> 16) & 0xff; const int green = (background_rgb >> 8) & 0xff; const int blue = (background_rgb >> 0) & 0xff; int x, y; if (picture == NULL) return; if (!picture->use_argb) { // omit last pixel during u/v loop const int uv_width = (picture->width >> 1); const int Y0 = VP8RGBToY(red, green, blue, YUV_HALF); // VP8RGBToU/V expects the u/v values summed over four pixels const int U0 = VP8RGBToU(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF); const int V0 = VP8RGBToV(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF); const int has_alpha = picture->colorspace & WEBP_CSP_ALPHA_BIT; uint8_t* y_ptr = picture->y; uint8_t* u_ptr = picture->u; uint8_t* v_ptr = picture->v; uint8_t* a_ptr = picture->a; if (!has_alpha || a_ptr == NULL) return; // nothing to do for (y = 0; y < picture->height; ++y) { // Luma blending for (x = 0; x < picture->width; ++x) { const uint8_t alpha = a_ptr[x]; if (alpha < 0xff) { y_ptr[x] = BLEND(Y0, y_ptr[x], alpha); } } // Chroma blending every even line if ((y & 1) == 0) { uint8_t* const a_ptr2 = (y + 1 == picture->height) ? a_ptr : a_ptr + picture->a_stride; for (x = 0; x < uv_width; ++x) { // Average four alpha values into a single blending weight. // TODO(skal): might lead to visible contouring. Can we do better? const uint32_t alpha = a_ptr[2 * x + 0] + a_ptr[2 * x + 1] + a_ptr2[2 * x + 0] + a_ptr2[2 * x + 1]; u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha); v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha); } if (picture->width & 1) { // rightmost pixel const uint32_t alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]); u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha); v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha); } } else { u_ptr += picture->uv_stride; v_ptr += picture->uv_stride; } memset(a_ptr, 0xff, picture->width); // reset alpha value to opaque a_ptr += picture->a_stride; y_ptr += picture->y_stride; } } else { uint32_t* argb = picture->argb; const uint32_t background = MakeARGB32(red, green, blue); for (y = 0; y < picture->height; ++y) { for (x = 0; x < picture->width; ++x) { const int alpha = (argb[x] >> 24) & 0xff; if (alpha != 0xff) { if (alpha > 0) { int r = (argb[x] >> 16) & 0xff; int g = (argb[x] >> 8) & 0xff; int b = (argb[x] >> 0) & 0xff; r = BLEND(red, r, alpha); g = BLEND(green, g, alpha); b = BLEND(blue, b, alpha); argb[x] = MakeARGB32(r, g, b); } else { argb[x] = background; } } } argb += picture->argb_stride; } } } #undef BLEND #undef BLEND_10BIT //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/webp_enc.c0000644000014400001440000003370314606317060013343 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP encoder: main entry point // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include #include "src/enc/cost_enc.h" #include "src/enc/vp8i_enc.h" #include "src/enc/vp8li_enc.h" #include "src/utils/utils.h" // #define PRINT_MEMORY_INFO #ifdef PRINT_MEMORY_INFO #include #endif //------------------------------------------------------------------------------ int WebPGetEncoderVersion(void) { return (ENC_MAJ_VERSION << 16) | (ENC_MIN_VERSION << 8) | ENC_REV_VERSION; } //------------------------------------------------------------------------------ // VP8Encoder //------------------------------------------------------------------------------ static void ResetSegmentHeader(VP8Encoder* const enc) { VP8EncSegmentHeader* const hdr = &enc->segment_hdr_; hdr->num_segments_ = enc->config_->segments; hdr->update_map_ = (hdr->num_segments_ > 1); hdr->size_ = 0; } static void ResetFilterHeader(VP8Encoder* const enc) { VP8EncFilterHeader* const hdr = &enc->filter_hdr_; hdr->simple_ = 1; hdr->level_ = 0; hdr->sharpness_ = 0; hdr->i4x4_lf_delta_ = 0; } static void ResetBoundaryPredictions(VP8Encoder* const enc) { // init boundary values once for all // Note: actually, initializing the preds_[] is only needed for intra4. int i; uint8_t* const top = enc->preds_ - enc->preds_w_; uint8_t* const left = enc->preds_ - 1; for (i = -1; i < 4 * enc->mb_w_; ++i) { top[i] = B_DC_PRED; } for (i = 0; i < 4 * enc->mb_h_; ++i) { left[i * enc->preds_w_] = B_DC_PRED; } enc->nz_[-1] = 0; // constant } // Mapping from config->method_ to coding tools used. //-------------------+---+---+---+---+---+---+---+ // Method | 0 | 1 | 2 | 3 |(4)| 5 | 6 | //-------------------+---+---+---+---+---+---+---+ // fast probe | x | | | x | | | | //-------------------+---+---+---+---+---+---+---+ // dynamic proba | ~ | x | x | x | x | x | x | //-------------------+---+---+---+---+---+---+---+ // fast mode analysis|[x]|[x]| | | x | x | x | //-------------------+---+---+---+---+---+---+---+ // basic rd-opt | | | | x | x | x | x | //-------------------+---+---+---+---+---+---+---+ // disto-refine i4/16| x | x | x | | | | | //-------------------+---+---+---+---+---+---+---+ // disto-refine uv | | x | x | | | | | //-------------------+---+---+---+---+---+---+---+ // rd-opt i4/16 | | | ~ | x | x | x | x | //-------------------+---+---+---+---+---+---+---+ // token buffer (opt)| | | | x | x | x | x | //-------------------+---+---+---+---+---+---+---+ // Trellis | | | | | | x |Ful| //-------------------+---+---+---+---+---+---+---+ // full-SNS | | | | | x | x | x | //-------------------+---+---+---+---+---+---+---+ static void MapConfigToTools(VP8Encoder* const enc) { const WebPConfig* const config = enc->config_; const int method = config->method; const int limit = 100 - config->partition_limit; enc->method_ = method; enc->rd_opt_level_ = (method >= 6) ? RD_OPT_TRELLIS_ALL : (method >= 5) ? RD_OPT_TRELLIS : (method >= 3) ? RD_OPT_BASIC : RD_OPT_NONE; enc->max_i4_header_bits_ = 256 * 16 * 16 * // upper bound: up to 16bit per 4x4 block (limit * limit) / (100 * 100); // ... modulated with a quadratic curve. // partition0 = 512k max. enc->mb_header_limit_ = (score_t)256 * 510 * 8 * 1024 / (enc->mb_w_ * enc->mb_h_); enc->thread_level_ = config->thread_level; enc->do_search_ = (config->target_size > 0 || config->target_PSNR > 0); if (!config->low_memory) { #if !defined(DISABLE_TOKEN_BUFFER) enc->use_tokens_ = (enc->rd_opt_level_ >= RD_OPT_BASIC); // need rd stats #endif if (enc->use_tokens_) { enc->num_parts_ = 1; // doesn't work with multi-partition } } } // Memory scaling with dimensions: // memory (bytes) ~= 2.25 * w + 0.0625 * w * h // // Typical memory footprint (614x440 picture) // encoder: 22111 // info: 4368 // preds: 17741 // top samples: 1263 // non-zero: 175 // lf-stats: 0 // total: 45658 // Transient object sizes: // VP8EncIterator: 3360 // VP8ModeScore: 872 // VP8SegmentInfo: 732 // VP8EncProba: 18352 // LFStats: 2048 // Picture size (yuv): 419328 static VP8Encoder* InitVP8Encoder(const WebPConfig* const config, WebPPicture* const picture) { VP8Encoder* enc; const int use_filter = (config->filter_strength > 0) || (config->autofilter > 0); const int mb_w = (picture->width + 15) >> 4; const int mb_h = (picture->height + 15) >> 4; const int preds_w = 4 * mb_w + 1; const int preds_h = 4 * mb_h + 1; const size_t preds_size = preds_w * preds_h * sizeof(*enc->preds_); const int top_stride = mb_w * 16; const size_t nz_size = (mb_w + 1) * sizeof(*enc->nz_) + WEBP_ALIGN_CST; const size_t info_size = mb_w * mb_h * sizeof(*enc->mb_info_); const size_t samples_size = 2 * top_stride * sizeof(*enc->y_top_) // top-luma/u/v + WEBP_ALIGN_CST; // align all const size_t lf_stats_size = config->autofilter ? sizeof(*enc->lf_stats_) + WEBP_ALIGN_CST : 0; const size_t top_derr_size = (config->quality <= ERROR_DIFFUSION_QUALITY || config->pass > 1) ? mb_w * sizeof(*enc->top_derr_) : 0; uint8_t* mem; const uint64_t size = (uint64_t)sizeof(*enc) // main struct + WEBP_ALIGN_CST // cache alignment + info_size // modes info + preds_size // prediction modes + samples_size // top/left samples + top_derr_size // top diffusion error + nz_size // coeff context bits + lf_stats_size; // autofilter stats #ifdef PRINT_MEMORY_INFO printf("===================================\n"); printf("Memory used:\n" " encoder: %ld\n" " info: %ld\n" " preds: %ld\n" " top samples: %ld\n" " top diffusion: %ld\n" " non-zero: %ld\n" " lf-stats: %ld\n" " total: %ld\n", sizeof(*enc) + WEBP_ALIGN_CST, info_size, preds_size, samples_size, top_derr_size, nz_size, lf_stats_size, size); printf("Transient object sizes:\n" " VP8EncIterator: %ld\n" " VP8ModeScore: %ld\n" " VP8SegmentInfo: %ld\n" " VP8EncProba: %ld\n" " LFStats: %ld\n", sizeof(VP8EncIterator), sizeof(VP8ModeScore), sizeof(VP8SegmentInfo), sizeof(VP8EncProba), sizeof(LFStats)); printf("Picture size (yuv): %ld\n", mb_w * mb_h * 384 * sizeof(uint8_t)); printf("===================================\n"); #endif mem = (uint8_t*)WebPSafeMalloc(size, sizeof(*mem)); if (mem == NULL) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); return NULL; } enc = (VP8Encoder*)mem; mem = (uint8_t*)WEBP_ALIGN(mem + sizeof(*enc)); memset(enc, 0, sizeof(*enc)); enc->num_parts_ = 1 << config->partitions; enc->mb_w_ = mb_w; enc->mb_h_ = mb_h; enc->preds_w_ = preds_w; enc->mb_info_ = (VP8MBInfo*)mem; mem += info_size; enc->preds_ = mem + 1 + enc->preds_w_; mem += preds_size; enc->nz_ = 1 + (uint32_t*)WEBP_ALIGN(mem); mem += nz_size; enc->lf_stats_ = lf_stats_size ? (LFStats*)WEBP_ALIGN(mem) : NULL; mem += lf_stats_size; // top samples (all 16-aligned) mem = (uint8_t*)WEBP_ALIGN(mem); enc->y_top_ = mem; enc->uv_top_ = enc->y_top_ + top_stride; mem += 2 * top_stride; enc->top_derr_ = top_derr_size ? (DError*)mem : NULL; mem += top_derr_size; assert(mem <= (uint8_t*)enc + size); enc->config_ = config; enc->profile_ = use_filter ? ((config->filter_type == 1) ? 0 : 1) : 2; enc->pic_ = picture; enc->percent_ = 0; MapConfigToTools(enc); VP8EncDspInit(); VP8DefaultProbas(enc); ResetSegmentHeader(enc); ResetFilterHeader(enc); ResetBoundaryPredictions(enc); VP8EncDspCostInit(); VP8EncInitAlpha(enc); // lower quality means smaller output -> we modulate a little the page // size based on quality. This is just a crude 1rst-order prediction. { const float scale = 1.f + config->quality * 5.f / 100.f; // in [1,6] VP8TBufferInit(&enc->tokens_, (int)(mb_w * mb_h * 4 * scale)); } return enc; } static int DeleteVP8Encoder(VP8Encoder* enc) { int ok = 1; if (enc != NULL) { ok = VP8EncDeleteAlpha(enc); VP8TBufferClear(&enc->tokens_); WebPSafeFree(enc); } return ok; } //------------------------------------------------------------------------------ #if !defined(WEBP_DISABLE_STATS) static double GetPSNR(uint64_t err, uint64_t size) { return (err > 0 && size > 0) ? 10. * log10(255. * 255. * size / err) : 99.; } static void FinalizePSNR(const VP8Encoder* const enc) { WebPAuxStats* stats = enc->pic_->stats; const uint64_t size = enc->sse_count_; const uint64_t* const sse = enc->sse_; stats->PSNR[0] = (float)GetPSNR(sse[0], size); stats->PSNR[1] = (float)GetPSNR(sse[1], size / 4); stats->PSNR[2] = (float)GetPSNR(sse[2], size / 4); stats->PSNR[3] = (float)GetPSNR(sse[0] + sse[1] + sse[2], size * 3 / 2); stats->PSNR[4] = (float)GetPSNR(sse[3], size); } #endif // !defined(WEBP_DISABLE_STATS) static void StoreStats(VP8Encoder* const enc) { #if !defined(WEBP_DISABLE_STATS) WebPAuxStats* const stats = enc->pic_->stats; if (stats != NULL) { int i, s; for (i = 0; i < NUM_MB_SEGMENTS; ++i) { stats->segment_level[i] = enc->dqm_[i].fstrength_; stats->segment_quant[i] = enc->dqm_[i].quant_; for (s = 0; s <= 2; ++s) { stats->residual_bytes[s][i] = enc->residual_bytes_[s][i]; } } FinalizePSNR(enc); stats->coded_size = enc->coded_size_; for (i = 0; i < 3; ++i) { stats->block_count[i] = enc->block_count_[i]; } } #else // defined(WEBP_DISABLE_STATS) WebPReportProgress(enc->pic_, 100, &enc->percent_); // done! #endif // !defined(WEBP_DISABLE_STATS) } int WebPEncodingSetError(const WebPPicture* const pic, WebPEncodingError error) { assert((int)error < VP8_ENC_ERROR_LAST); assert((int)error >= VP8_ENC_OK); // The oldest error reported takes precedence over the new one. if (pic->error_code == VP8_ENC_OK) { ((WebPPicture*)pic)->error_code = error; } return 0; } int WebPReportProgress(const WebPPicture* const pic, int percent, int* const percent_store) { if (percent_store != NULL && percent != *percent_store) { *percent_store = percent; if (pic->progress_hook && !pic->progress_hook(percent, pic)) { // user abort requested return WebPEncodingSetError(pic, VP8_ENC_ERROR_USER_ABORT); } } return 1; // ok } //------------------------------------------------------------------------------ int WebPEncode(const WebPConfig* config, WebPPicture* pic) { int ok = 0; if (pic == NULL) return 0; pic->error_code = VP8_ENC_OK; // all ok so far if (config == NULL) { // bad params return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER); } if (!WebPValidateConfig(config)) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION); } if (!WebPValidatePicture(pic)) return 0; if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION); } if (pic->stats != NULL) memset(pic->stats, 0, sizeof(*pic->stats)); if (!config->lossless) { VP8Encoder* enc = NULL; if (pic->use_argb || pic->y == NULL || pic->u == NULL || pic->v == NULL) { // Make sure we have YUVA samples. if (config->use_sharp_yuv || (config->preprocessing & 4)) { if (!WebPPictureSharpARGBToYUVA(pic)) { return 0; } } else { float dithering = 0.f; if (config->preprocessing & 2) { const float x = config->quality / 100.f; const float x2 = x * x; // slowly decreasing from max dithering at low quality (q->0) // to 0.5 dithering amplitude at high quality (q->100) dithering = 1.0f + (0.5f - 1.0f) * x2 * x2; } if (!WebPPictureARGBToYUVADithered(pic, WEBP_YUV420, dithering)) { return 0; } } } if (!config->exact) { WebPCleanupTransparentArea(pic); } enc = InitVP8Encoder(config, pic); if (enc == NULL) return 0; // pic->error is already set. // Note: each of the tasks below account for 20% in the progress report. ok = VP8EncAnalyze(enc); // Analysis is done, proceed to actual coding. ok = ok && VP8EncStartAlpha(enc); // possibly done in parallel if (!enc->use_tokens_) { ok = ok && VP8EncLoop(enc); } else { ok = ok && VP8EncTokenLoop(enc); } ok = ok && VP8EncFinishAlpha(enc); ok = ok && VP8EncWrite(enc); StoreStats(enc); if (!ok) { VP8EncFreeBitWriters(enc); } ok &= DeleteVP8Encoder(enc); // must always be called, even if !ok } else { // Make sure we have ARGB samples. if (pic->argb == NULL && !WebPPictureYUVAToARGB(pic)) { return 0; } if (!config->exact) { WebPReplaceTransparentPixels(pic, 0x000000); } ok = VP8LEncodeImage(config, pic); // Sets pic->error in case of problem. } return ok; } libwebp-1.4.0/src/enc/picture_csp_enc.c0000644000014400001440000007506714606317060014737 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebPPicture utils for colorspace conversion // // Author: Skal (pascal.massimino@gmail.com) #include #include #include #include "sharpyuv/sharpyuv.h" #include "sharpyuv/sharpyuv_csp.h" #include "src/enc/vp8i_enc.h" #include "src/utils/random_utils.h" #include "src/utils/utils.h" #include "src/dsp/dsp.h" #include "src/dsp/lossless.h" #include "src/dsp/yuv.h" #include "src/dsp/cpu.h" #if defined(WEBP_USE_THREAD) && !defined(_WIN32) #include #endif // Uncomment to disable gamma-compression during RGB->U/V averaging #define USE_GAMMA_COMPRESSION // If defined, use table to compute x / alpha. #define USE_INVERSE_ALPHA_TABLE #ifdef WORDS_BIGENDIAN // uint32_t 0xff000000 is 0xff,00,00,00 in memory #define CHANNEL_OFFSET(i) (i) #else // uint32_t 0xff000000 is 0x00,00,00,ff in memory #define CHANNEL_OFFSET(i) (3-(i)) #endif #define ALPHA_OFFSET CHANNEL_OFFSET(0) //------------------------------------------------------------------------------ // Detection of non-trivial transparency // Returns true if alpha[] has non-0xff values. static int CheckNonOpaque(const uint8_t* alpha, int width, int height, int x_step, int y_step) { if (alpha == NULL) return 0; WebPInitAlphaProcessing(); if (x_step == 1) { for (; height-- > 0; alpha += y_step) { if (WebPHasAlpha8b(alpha, width)) return 1; } } else { for (; height-- > 0; alpha += y_step) { if (WebPHasAlpha32b(alpha, width)) return 1; } } return 0; } // Checking for the presence of non-opaque alpha. int WebPPictureHasTransparency(const WebPPicture* picture) { if (picture == NULL) return 0; if (picture->use_argb) { if (picture->argb != NULL) { return CheckNonOpaque((const uint8_t*)picture->argb + ALPHA_OFFSET, picture->width, picture->height, 4, picture->argb_stride * sizeof(*picture->argb)); } return 0; } return CheckNonOpaque(picture->a, picture->width, picture->height, 1, picture->a_stride); } //------------------------------------------------------------------------------ // Code for gamma correction #if defined(USE_GAMMA_COMPRESSION) // Gamma correction compensates loss of resolution during chroma subsampling. #define GAMMA_FIX 12 // fixed-point precision for linear values #define GAMMA_TAB_FIX 7 // fixed-point fractional bits precision #define GAMMA_TAB_SIZE (1 << (GAMMA_FIX - GAMMA_TAB_FIX)) static const double kGamma = 0.80; static const int kGammaScale = ((1 << GAMMA_FIX) - 1); static const int kGammaTabScale = (1 << GAMMA_TAB_FIX); static const int kGammaTabRounder = (1 << GAMMA_TAB_FIX >> 1); static int kLinearToGammaTab[GAMMA_TAB_SIZE + 1]; static uint16_t kGammaToLinearTab[256]; static volatile int kGammaTablesOk = 0; static void InitGammaTables(void); extern VP8CPUInfo VP8GetCPUInfo; WEBP_DSP_INIT_FUNC(InitGammaTables) { if (!kGammaTablesOk) { int v; const double scale = (double)(1 << GAMMA_TAB_FIX) / kGammaScale; const double norm = 1. / 255.; for (v = 0; v <= 255; ++v) { kGammaToLinearTab[v] = (uint16_t)(pow(norm * v, kGamma) * kGammaScale + .5); } for (v = 0; v <= GAMMA_TAB_SIZE; ++v) { kLinearToGammaTab[v] = (int)(255. * pow(scale * v, 1. / kGamma) + .5); } kGammaTablesOk = 1; } } static WEBP_INLINE uint32_t GammaToLinear(uint8_t v) { return kGammaToLinearTab[v]; } static WEBP_INLINE int Interpolate(int v) { const int tab_pos = v >> (GAMMA_TAB_FIX + 2); // integer part const int x = v & ((kGammaTabScale << 2) - 1); // fractional part const int v0 = kLinearToGammaTab[tab_pos]; const int v1 = kLinearToGammaTab[tab_pos + 1]; const int y = v1 * x + v0 * ((kGammaTabScale << 2) - x); // interpolate assert(tab_pos + 1 < GAMMA_TAB_SIZE + 1); return y; } // Convert a linear value 'v' to YUV_FIX+2 fixed-point precision // U/V value, suitable for RGBToU/V calls. static WEBP_INLINE int LinearToGamma(uint32_t base_value, int shift) { const int y = Interpolate(base_value << shift); // final uplifted value return (y + kGammaTabRounder) >> GAMMA_TAB_FIX; // descale } #else static void InitGammaTables(void) {} static WEBP_INLINE uint32_t GammaToLinear(uint8_t v) { return v; } static WEBP_INLINE int LinearToGamma(uint32_t base_value, int shift) { return (int)(base_value << shift); } #endif // USE_GAMMA_COMPRESSION //------------------------------------------------------------------------------ // RGB -> YUV conversion static int RGBToY(int r, int g, int b, VP8Random* const rg) { return (rg == NULL) ? VP8RGBToY(r, g, b, YUV_HALF) : VP8RGBToY(r, g, b, VP8RandomBits(rg, YUV_FIX)); } static int RGBToU(int r, int g, int b, VP8Random* const rg) { return (rg == NULL) ? VP8RGBToU(r, g, b, YUV_HALF << 2) : VP8RGBToU(r, g, b, VP8RandomBits(rg, YUV_FIX + 2)); } static int RGBToV(int r, int g, int b, VP8Random* const rg) { return (rg == NULL) ? VP8RGBToV(r, g, b, YUV_HALF << 2) : VP8RGBToV(r, g, b, VP8RandomBits(rg, YUV_FIX + 2)); } //------------------------------------------------------------------------------ // Sharp RGB->YUV conversion static const int kMinDimensionIterativeConversion = 4; //------------------------------------------------------------------------------ // Main function static int PreprocessARGB(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, int step, int rgb_stride, WebPPicture* const picture) { const int ok = SharpYuvConvert( r_ptr, g_ptr, b_ptr, step, rgb_stride, /*rgb_bit_depth=*/8, picture->y, picture->y_stride, picture->u, picture->uv_stride, picture->v, picture->uv_stride, /*yuv_bit_depth=*/8, picture->width, picture->height, SharpYuvGetConversionMatrix(kSharpYuvMatrixWebp)); if (!ok) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } return ok; } //------------------------------------------------------------------------------ // "Fast" regular RGB->YUV #define SUM4(ptr, step) LinearToGamma( \ GammaToLinear((ptr)[0]) + \ GammaToLinear((ptr)[(step)]) + \ GammaToLinear((ptr)[rgb_stride]) + \ GammaToLinear((ptr)[rgb_stride + (step)]), 0) \ #define SUM2(ptr) \ LinearToGamma(GammaToLinear((ptr)[0]) + GammaToLinear((ptr)[rgb_stride]), 1) #define SUM2ALPHA(ptr) ((ptr)[0] + (ptr)[rgb_stride]) #define SUM4ALPHA(ptr) (SUM2ALPHA(ptr) + SUM2ALPHA((ptr) + 4)) #if defined(USE_INVERSE_ALPHA_TABLE) static const int kAlphaFix = 19; // Following table is (1 << kAlphaFix) / a. The (v * kInvAlpha[a]) >> kAlphaFix // formula is then equal to v / a in most (99.6%) cases. Note that this table // and constant are adjusted very tightly to fit 32b arithmetic. // In particular, they use the fact that the operands for 'v / a' are actually // derived as v = (a0.p0 + a1.p1 + a2.p2 + a3.p3) and a = a0 + a1 + a2 + a3 // with ai in [0..255] and pi in [0..1<> (kAlphaFix - 2)) #else #define DIVIDE_BY_ALPHA(sum, a) (4 * (sum) / (a)) #endif // USE_INVERSE_ALPHA_TABLE static WEBP_INLINE int LinearToGammaWeighted(const uint8_t* src, const uint8_t* a_ptr, uint32_t total_a, int step, int rgb_stride) { const uint32_t sum = a_ptr[0] * GammaToLinear(src[0]) + a_ptr[step] * GammaToLinear(src[step]) + a_ptr[rgb_stride] * GammaToLinear(src[rgb_stride]) + a_ptr[rgb_stride + step] * GammaToLinear(src[rgb_stride + step]); assert(total_a > 0 && total_a <= 4 * 0xff); #if defined(USE_INVERSE_ALPHA_TABLE) assert((uint64_t)sum * kInvAlpha[total_a] < ((uint64_t)1 << 32)); #endif return LinearToGamma(DIVIDE_BY_ALPHA(sum, total_a), 0); } static WEBP_INLINE void ConvertRowToY(const uint8_t* const r_ptr, const uint8_t* const g_ptr, const uint8_t* const b_ptr, int step, uint8_t* const dst_y, int width, VP8Random* const rg) { int i, j; for (i = 0, j = 0; i < width; i += 1, j += step) { dst_y[i] = RGBToY(r_ptr[j], g_ptr[j], b_ptr[j], rg); } } static WEBP_INLINE void AccumulateRGBA(const uint8_t* const r_ptr, const uint8_t* const g_ptr, const uint8_t* const b_ptr, const uint8_t* const a_ptr, int rgb_stride, uint16_t* dst, int width) { int i, j; // we loop over 2x2 blocks and produce one R/G/B/A value for each. for (i = 0, j = 0; i < (width >> 1); i += 1, j += 2 * 4, dst += 4) { const uint32_t a = SUM4ALPHA(a_ptr + j); int r, g, b; if (a == 4 * 0xff || a == 0) { r = SUM4(r_ptr + j, 4); g = SUM4(g_ptr + j, 4); b = SUM4(b_ptr + j, 4); } else { r = LinearToGammaWeighted(r_ptr + j, a_ptr + j, a, 4, rgb_stride); g = LinearToGammaWeighted(g_ptr + j, a_ptr + j, a, 4, rgb_stride); b = LinearToGammaWeighted(b_ptr + j, a_ptr + j, a, 4, rgb_stride); } dst[0] = r; dst[1] = g; dst[2] = b; dst[3] = a; } if (width & 1) { const uint32_t a = 2u * SUM2ALPHA(a_ptr + j); int r, g, b; if (a == 4 * 0xff || a == 0) { r = SUM2(r_ptr + j); g = SUM2(g_ptr + j); b = SUM2(b_ptr + j); } else { r = LinearToGammaWeighted(r_ptr + j, a_ptr + j, a, 0, rgb_stride); g = LinearToGammaWeighted(g_ptr + j, a_ptr + j, a, 0, rgb_stride); b = LinearToGammaWeighted(b_ptr + j, a_ptr + j, a, 0, rgb_stride); } dst[0] = r; dst[1] = g; dst[2] = b; dst[3] = a; } } static WEBP_INLINE void AccumulateRGB(const uint8_t* const r_ptr, const uint8_t* const g_ptr, const uint8_t* const b_ptr, int step, int rgb_stride, uint16_t* dst, int width) { int i, j; for (i = 0, j = 0; i < (width >> 1); i += 1, j += 2 * step, dst += 4) { dst[0] = SUM4(r_ptr + j, step); dst[1] = SUM4(g_ptr + j, step); dst[2] = SUM4(b_ptr + j, step); // MemorySanitizer may raise false positives with data that passes through // RGBA32PackedToPlanar_16b_SSE41() due to incorrect modeling of shuffles. // See https://crbug.com/webp/573. #ifdef WEBP_MSAN dst[3] = 0; #endif } if (width & 1) { dst[0] = SUM2(r_ptr + j); dst[1] = SUM2(g_ptr + j); dst[2] = SUM2(b_ptr + j); #ifdef WEBP_MSAN dst[3] = 0; #endif } } static WEBP_INLINE void ConvertRowsToUV(const uint16_t* rgb, uint8_t* const dst_u, uint8_t* const dst_v, int width, VP8Random* const rg) { int i; for (i = 0; i < width; i += 1, rgb += 4) { const int r = rgb[0], g = rgb[1], b = rgb[2]; dst_u[i] = RGBToU(r, g, b, rg); dst_v[i] = RGBToV(r, g, b, rg); } } extern void SharpYuvInit(VP8CPUInfo cpu_info_func); static int ImportYUVAFromRGBA(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, const uint8_t* a_ptr, int step, // bytes per pixel int rgb_stride, // bytes per scanline float dithering, int use_iterative_conversion, WebPPicture* const picture) { int y; const int width = picture->width; const int height = picture->height; const int has_alpha = CheckNonOpaque(a_ptr, width, height, step, rgb_stride); const int is_rgb = (r_ptr < b_ptr); // otherwise it's bgr picture->colorspace = has_alpha ? WEBP_YUV420A : WEBP_YUV420; picture->use_argb = 0; // disable smart conversion if source is too small (overkill). if (width < kMinDimensionIterativeConversion || height < kMinDimensionIterativeConversion) { use_iterative_conversion = 0; } if (!WebPPictureAllocYUVA(picture)) { return 0; } if (has_alpha) { assert(step == 4); #if defined(USE_GAMMA_COMPRESSION) && defined(USE_INVERSE_ALPHA_TABLE) assert(kAlphaFix + GAMMA_FIX <= 31); #endif } if (use_iterative_conversion) { SharpYuvInit(VP8GetCPUInfo); if (!PreprocessARGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, picture)) { return 0; } if (has_alpha) { WebPExtractAlpha(a_ptr, rgb_stride, width, height, picture->a, picture->a_stride); } } else { const int uv_width = (width + 1) >> 1; int use_dsp = (step == 3); // use special function in this case // temporary storage for accumulated R/G/B values during conversion to U/V uint16_t* const tmp_rgb = (uint16_t*)WebPSafeMalloc(4 * uv_width, sizeof(*tmp_rgb)); uint8_t* dst_y = picture->y; uint8_t* dst_u = picture->u; uint8_t* dst_v = picture->v; uint8_t* dst_a = picture->a; VP8Random base_rg; VP8Random* rg = NULL; if (dithering > 0.) { VP8InitRandom(&base_rg, dithering); rg = &base_rg; use_dsp = 0; // can't use dsp in this case } WebPInitConvertARGBToYUV(); InitGammaTables(); if (tmp_rgb == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); } // Downsample Y/U/V planes, two rows at a time for (y = 0; y < (height >> 1); ++y) { int rows_have_alpha = has_alpha; if (use_dsp) { if (is_rgb) { WebPConvertRGB24ToY(r_ptr, dst_y, width); WebPConvertRGB24ToY(r_ptr + rgb_stride, dst_y + picture->y_stride, width); } else { WebPConvertBGR24ToY(b_ptr, dst_y, width); WebPConvertBGR24ToY(b_ptr + rgb_stride, dst_y + picture->y_stride, width); } } else { ConvertRowToY(r_ptr, g_ptr, b_ptr, step, dst_y, width, rg); ConvertRowToY(r_ptr + rgb_stride, g_ptr + rgb_stride, b_ptr + rgb_stride, step, dst_y + picture->y_stride, width, rg); } dst_y += 2 * picture->y_stride; if (has_alpha) { rows_have_alpha &= !WebPExtractAlpha(a_ptr, rgb_stride, width, 2, dst_a, picture->a_stride); dst_a += 2 * picture->a_stride; } // Collect averaged R/G/B(/A) if (!rows_have_alpha) { AccumulateRGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, tmp_rgb, width); } else { AccumulateRGBA(r_ptr, g_ptr, b_ptr, a_ptr, rgb_stride, tmp_rgb, width); } // Convert to U/V if (rg == NULL) { WebPConvertRGBA32ToUV(tmp_rgb, dst_u, dst_v, uv_width); } else { ConvertRowsToUV(tmp_rgb, dst_u, dst_v, uv_width, rg); } dst_u += picture->uv_stride; dst_v += picture->uv_stride; r_ptr += 2 * rgb_stride; b_ptr += 2 * rgb_stride; g_ptr += 2 * rgb_stride; if (has_alpha) a_ptr += 2 * rgb_stride; } if (height & 1) { // extra last row int row_has_alpha = has_alpha; if (use_dsp) { if (r_ptr < b_ptr) { WebPConvertRGB24ToY(r_ptr, dst_y, width); } else { WebPConvertBGR24ToY(b_ptr, dst_y, width); } } else { ConvertRowToY(r_ptr, g_ptr, b_ptr, step, dst_y, width, rg); } if (row_has_alpha) { row_has_alpha &= !WebPExtractAlpha(a_ptr, 0, width, 1, dst_a, 0); } // Collect averaged R/G/B(/A) if (!row_has_alpha) { // Collect averaged R/G/B AccumulateRGB(r_ptr, g_ptr, b_ptr, step, /* rgb_stride = */ 0, tmp_rgb, width); } else { AccumulateRGBA(r_ptr, g_ptr, b_ptr, a_ptr, /* rgb_stride = */ 0, tmp_rgb, width); } if (rg == NULL) { WebPConvertRGBA32ToUV(tmp_rgb, dst_u, dst_v, uv_width); } else { ConvertRowsToUV(tmp_rgb, dst_u, dst_v, uv_width, rg); } } WebPSafeFree(tmp_rgb); } return 1; } #undef SUM4 #undef SUM2 #undef SUM4ALPHA #undef SUM2ALPHA //------------------------------------------------------------------------------ // call for ARGB->YUVA conversion static int PictureARGBToYUVA(WebPPicture* picture, WebPEncCSP colorspace, float dithering, int use_iterative_conversion) { if (picture == NULL) return 0; if (picture->argb == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER); } else if ((colorspace & WEBP_CSP_UV_MASK) != WEBP_YUV420) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION); } else { const uint8_t* const argb = (const uint8_t*)picture->argb; const uint8_t* const a = argb + CHANNEL_OFFSET(0); const uint8_t* const r = argb + CHANNEL_OFFSET(1); const uint8_t* const g = argb + CHANNEL_OFFSET(2); const uint8_t* const b = argb + CHANNEL_OFFSET(3); picture->colorspace = WEBP_YUV420; return ImportYUVAFromRGBA(r, g, b, a, 4, 4 * picture->argb_stride, dithering, use_iterative_conversion, picture); } } int WebPPictureARGBToYUVADithered(WebPPicture* picture, WebPEncCSP colorspace, float dithering) { return PictureARGBToYUVA(picture, colorspace, dithering, 0); } int WebPPictureARGBToYUVA(WebPPicture* picture, WebPEncCSP colorspace) { return PictureARGBToYUVA(picture, colorspace, 0.f, 0); } int WebPPictureSharpARGBToYUVA(WebPPicture* picture) { return PictureARGBToYUVA(picture, WEBP_YUV420, 0.f, 1); } // for backward compatibility int WebPPictureSmartARGBToYUVA(WebPPicture* picture) { return WebPPictureSharpARGBToYUVA(picture); } //------------------------------------------------------------------------------ // call for YUVA -> ARGB conversion int WebPPictureYUVAToARGB(WebPPicture* picture) { if (picture == NULL) return 0; if (picture->y == NULL || picture->u == NULL || picture->v == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER); } if ((picture->colorspace & WEBP_CSP_ALPHA_BIT) && picture->a == NULL) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_NULL_PARAMETER); } if ((picture->colorspace & WEBP_CSP_UV_MASK) != WEBP_YUV420) { return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION); } // Allocate a new argb buffer (discarding the previous one). if (!WebPPictureAllocARGB(picture)) return 0; picture->use_argb = 1; // Convert { int y; const int width = picture->width; const int height = picture->height; const int argb_stride = 4 * picture->argb_stride; uint8_t* dst = (uint8_t*)picture->argb; const uint8_t* cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y; WebPUpsampleLinePairFunc upsample = WebPGetLinePairConverter(ALPHA_OFFSET > 0); // First row, with replicated top samples. upsample(cur_y, NULL, cur_u, cur_v, cur_u, cur_v, dst, NULL, width); cur_y += picture->y_stride; dst += argb_stride; // Center rows. for (y = 1; y + 1 < height; y += 2) { const uint8_t* const top_u = cur_u; const uint8_t* const top_v = cur_v; cur_u += picture->uv_stride; cur_v += picture->uv_stride; upsample(cur_y, cur_y + picture->y_stride, top_u, top_v, cur_u, cur_v, dst, dst + argb_stride, width); cur_y += 2 * picture->y_stride; dst += 2 * argb_stride; } // Last row (if needed), with replicated bottom samples. if (height > 1 && !(height & 1)) { upsample(cur_y, NULL, cur_u, cur_v, cur_u, cur_v, dst, NULL, width); } // Insert alpha values if needed, in replacement for the default 0xff ones. if (picture->colorspace & WEBP_CSP_ALPHA_BIT) { for (y = 0; y < height; ++y) { uint32_t* const argb_dst = picture->argb + y * picture->argb_stride; const uint8_t* const src = picture->a + y * picture->a_stride; int x; for (x = 0; x < width; ++x) { argb_dst[x] = (argb_dst[x] & 0x00ffffffu) | ((uint32_t)src[x] << 24); } } } } return 1; } //------------------------------------------------------------------------------ // automatic import / conversion static int Import(WebPPicture* const picture, const uint8_t* rgb, int rgb_stride, int step, int swap_rb, int import_alpha) { int y; // swap_rb -> b,g,r,a , !swap_rb -> r,g,b,a const uint8_t* r_ptr = rgb + (swap_rb ? 2 : 0); const uint8_t* g_ptr = rgb + 1; const uint8_t* b_ptr = rgb + (swap_rb ? 0 : 2); const int width = picture->width; const int height = picture->height; if (abs(rgb_stride) < (import_alpha ? 4 : 3) * width) return 0; if (!picture->use_argb) { const uint8_t* a_ptr = import_alpha ? rgb + 3 : NULL; return ImportYUVAFromRGBA(r_ptr, g_ptr, b_ptr, a_ptr, step, rgb_stride, 0.f /* no dithering */, 0, picture); } if (!WebPPictureAlloc(picture)) return 0; VP8LDspInit(); WebPInitAlphaProcessing(); if (import_alpha) { // dst[] byte order is {a,r,g,b} for big-endian, {b,g,r,a} for little endian uint32_t* dst = picture->argb; const int do_copy = (ALPHA_OFFSET == 3) && swap_rb; assert(step == 4); if (do_copy) { for (y = 0; y < height; ++y) { memcpy(dst, rgb, width * 4); rgb += rgb_stride; dst += picture->argb_stride; } } else { for (y = 0; y < height; ++y) { #ifdef WORDS_BIGENDIAN // BGRA or RGBA input order. const uint8_t* a_ptr = rgb + 3; WebPPackARGB(a_ptr, r_ptr, g_ptr, b_ptr, width, dst); r_ptr += rgb_stride; g_ptr += rgb_stride; b_ptr += rgb_stride; #else // RGBA input order. Need to swap R and B. VP8LConvertBGRAToRGBA((const uint32_t*)rgb, width, (uint8_t*)dst); #endif rgb += rgb_stride; dst += picture->argb_stride; } } } else { uint32_t* dst = picture->argb; assert(step >= 3); for (y = 0; y < height; ++y) { WebPPackRGB(r_ptr, g_ptr, b_ptr, width, step, dst); r_ptr += rgb_stride; g_ptr += rgb_stride; b_ptr += rgb_stride; dst += picture->argb_stride; } } return 1; } // Public API #if !defined(WEBP_REDUCE_CSP) int WebPPictureImportBGR(WebPPicture* picture, const uint8_t* bgr, int bgr_stride) { return (picture != NULL && bgr != NULL) ? Import(picture, bgr, bgr_stride, 3, 1, 0) : 0; } int WebPPictureImportBGRA(WebPPicture* picture, const uint8_t* bgra, int bgra_stride) { return (picture != NULL && bgra != NULL) ? Import(picture, bgra, bgra_stride, 4, 1, 1) : 0; } int WebPPictureImportBGRX(WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride) { return (picture != NULL && bgrx != NULL) ? Import(picture, bgrx, bgrx_stride, 4, 1, 0) : 0; } #endif // WEBP_REDUCE_CSP int WebPPictureImportRGB(WebPPicture* picture, const uint8_t* rgb, int rgb_stride) { return (picture != NULL && rgb != NULL) ? Import(picture, rgb, rgb_stride, 3, 0, 0) : 0; } int WebPPictureImportRGBA(WebPPicture* picture, const uint8_t* rgba, int rgba_stride) { return (picture != NULL && rgba != NULL) ? Import(picture, rgba, rgba_stride, 4, 0, 1) : 0; } int WebPPictureImportRGBX(WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride) { return (picture != NULL && rgbx != NULL) ? Import(picture, rgbx, rgbx_stride, 4, 0, 0) : 0; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/backward_references_enc.c0000644000014400001440000011403114606317060016357 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Author: Jyrki Alakuijala (jyrki@google.com) // #include "src/enc/backward_references_enc.h" #include #include #include #include "src/dsp/dsp.h" #include "src/dsp/lossless.h" #include "src/dsp/lossless_common.h" #include "src/enc/histogram_enc.h" #include "src/enc/vp8i_enc.h" #include "src/utils/color_cache_utils.h" #include "src/utils/utils.h" #include "src/webp/encode.h" #define MIN_BLOCK_SIZE 256 // minimum block size for backward references #define MAX_ENTROPY (1e30f) // 1M window (4M bytes) minus 120 special codes for short distances. #define WINDOW_SIZE ((1 << WINDOW_SIZE_BITS) - 120) // Minimum number of pixels for which it is cheaper to encode a // distance + length instead of each pixel as a literal. #define MIN_LENGTH 4 // ----------------------------------------------------------------------------- static const uint8_t plane_to_code_lut[128] = { 96, 73, 55, 39, 23, 13, 5, 1, 255, 255, 255, 255, 255, 255, 255, 255, 101, 78, 58, 42, 26, 16, 8, 2, 0, 3, 9, 17, 27, 43, 59, 79, 102, 86, 62, 46, 32, 20, 10, 6, 4, 7, 11, 21, 33, 47, 63, 87, 105, 90, 70, 52, 37, 28, 18, 14, 12, 15, 19, 29, 38, 53, 71, 91, 110, 99, 82, 66, 48, 35, 30, 24, 22, 25, 31, 36, 49, 67, 83, 100, 115, 108, 94, 76, 64, 50, 44, 40, 34, 41, 45, 51, 65, 77, 95, 109, 118, 113, 103, 92, 80, 68, 60, 56, 54, 57, 61, 69, 81, 93, 104, 114, 119, 116, 111, 106, 97, 88, 84, 74, 72, 75, 85, 89, 98, 107, 112, 117 }; extern int VP8LDistanceToPlaneCode(int xsize, int dist); int VP8LDistanceToPlaneCode(int xsize, int dist) { const int yoffset = dist / xsize; const int xoffset = dist - yoffset * xsize; if (xoffset <= 8 && yoffset < 8) { return plane_to_code_lut[yoffset * 16 + 8 - xoffset] + 1; } else if (xoffset > xsize - 8 && yoffset < 7) { return plane_to_code_lut[(yoffset + 1) * 16 + 8 + (xsize - xoffset)] + 1; } return dist + 120; } // Returns the exact index where array1 and array2 are different. For an index // inferior or equal to best_len_match, the return value just has to be strictly // inferior to best_len_match. The current behavior is to return 0 if this index // is best_len_match, and the index itself otherwise. // If no two elements are the same, it returns max_limit. static WEBP_INLINE int FindMatchLength(const uint32_t* const array1, const uint32_t* const array2, int best_len_match, int max_limit) { // Before 'expensive' linear match, check if the two arrays match at the // current best length index. if (array1[best_len_match] != array2[best_len_match]) return 0; return VP8LVectorMismatch(array1, array2, max_limit); } // ----------------------------------------------------------------------------- // VP8LBackwardRefs struct PixOrCopyBlock { PixOrCopyBlock* next_; // next block (or NULL) PixOrCopy* start_; // data start int size_; // currently used size }; extern void VP8LClearBackwardRefs(VP8LBackwardRefs* const refs); void VP8LClearBackwardRefs(VP8LBackwardRefs* const refs) { assert(refs != NULL); if (refs->tail_ != NULL) { *refs->tail_ = refs->free_blocks_; // recycle all blocks at once } refs->free_blocks_ = refs->refs_; refs->tail_ = &refs->refs_; refs->last_block_ = NULL; refs->refs_ = NULL; } void VP8LBackwardRefsClear(VP8LBackwardRefs* const refs) { assert(refs != NULL); VP8LClearBackwardRefs(refs); while (refs->free_blocks_ != NULL) { PixOrCopyBlock* const next = refs->free_blocks_->next_; WebPSafeFree(refs->free_blocks_); refs->free_blocks_ = next; } } // Swaps the content of two VP8LBackwardRefs. static void BackwardRefsSwap(VP8LBackwardRefs* const refs1, VP8LBackwardRefs* const refs2) { const int point_to_refs1 = (refs1->tail_ != NULL && refs1->tail_ == &refs1->refs_); const int point_to_refs2 = (refs2->tail_ != NULL && refs2->tail_ == &refs2->refs_); const VP8LBackwardRefs tmp = *refs1; *refs1 = *refs2; *refs2 = tmp; if (point_to_refs2) refs1->tail_ = &refs1->refs_; if (point_to_refs1) refs2->tail_ = &refs2->refs_; } void VP8LBackwardRefsInit(VP8LBackwardRefs* const refs, int block_size) { assert(refs != NULL); memset(refs, 0, sizeof(*refs)); refs->tail_ = &refs->refs_; refs->block_size_ = (block_size < MIN_BLOCK_SIZE) ? MIN_BLOCK_SIZE : block_size; } VP8LRefsCursor VP8LRefsCursorInit(const VP8LBackwardRefs* const refs) { VP8LRefsCursor c; c.cur_block_ = refs->refs_; if (refs->refs_ != NULL) { c.cur_pos = c.cur_block_->start_; c.last_pos_ = c.cur_pos + c.cur_block_->size_; } else { c.cur_pos = NULL; c.last_pos_ = NULL; } return c; } void VP8LRefsCursorNextBlock(VP8LRefsCursor* const c) { PixOrCopyBlock* const b = c->cur_block_->next_; c->cur_pos = (b == NULL) ? NULL : b->start_; c->last_pos_ = (b == NULL) ? NULL : b->start_ + b->size_; c->cur_block_ = b; } // Create a new block, either from the free list or allocated static PixOrCopyBlock* BackwardRefsNewBlock(VP8LBackwardRefs* const refs) { PixOrCopyBlock* b = refs->free_blocks_; if (b == NULL) { // allocate new memory chunk const size_t total_size = sizeof(*b) + refs->block_size_ * sizeof(*b->start_); b = (PixOrCopyBlock*)WebPSafeMalloc(1ULL, total_size); if (b == NULL) { refs->error_ |= 1; return NULL; } b->start_ = (PixOrCopy*)((uint8_t*)b + sizeof(*b)); // not always aligned } else { // recycle from free-list refs->free_blocks_ = b->next_; } *refs->tail_ = b; refs->tail_ = &b->next_; refs->last_block_ = b; b->next_ = NULL; b->size_ = 0; return b; } // Return 1 on success, 0 on error. static int BackwardRefsClone(const VP8LBackwardRefs* const from, VP8LBackwardRefs* const to) { const PixOrCopyBlock* block_from = from->refs_; VP8LClearBackwardRefs(to); while (block_from != NULL) { PixOrCopyBlock* const block_to = BackwardRefsNewBlock(to); if (block_to == NULL) return 0; memcpy(block_to->start_, block_from->start_, block_from->size_ * sizeof(PixOrCopy)); block_to->size_ = block_from->size_; block_from = block_from->next_; } return 1; } extern void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs, const PixOrCopy v); void VP8LBackwardRefsCursorAdd(VP8LBackwardRefs* const refs, const PixOrCopy v) { PixOrCopyBlock* b = refs->last_block_; if (b == NULL || b->size_ == refs->block_size_) { b = BackwardRefsNewBlock(refs); if (b == NULL) return; // refs->error_ is set } b->start_[b->size_++] = v; } // ----------------------------------------------------------------------------- // Hash chains int VP8LHashChainInit(VP8LHashChain* const p, int size) { assert(p->size_ == 0); assert(p->offset_length_ == NULL); assert(size > 0); p->offset_length_ = (uint32_t*)WebPSafeMalloc(size, sizeof(*p->offset_length_)); if (p->offset_length_ == NULL) return 0; p->size_ = size; return 1; } void VP8LHashChainClear(VP8LHashChain* const p) { assert(p != NULL); WebPSafeFree(p->offset_length_); p->size_ = 0; p->offset_length_ = NULL; } // ----------------------------------------------------------------------------- static const uint32_t kHashMultiplierHi = 0xc6a4a793u; static const uint32_t kHashMultiplierLo = 0x5bd1e996u; static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE uint32_t GetPixPairHash64(const uint32_t* const argb) { uint32_t key; key = argb[1] * kHashMultiplierHi; key += argb[0] * kHashMultiplierLo; key = key >> (32 - HASH_BITS); return key; } // Returns the maximum number of hash chain lookups to do for a // given compression quality. Return value in range [8, 86]. static int GetMaxItersForQuality(int quality) { return 8 + (quality * quality) / 128; } static int GetWindowSizeForHashChain(int quality, int xsize) { const int max_window_size = (quality > 75) ? WINDOW_SIZE : (quality > 50) ? (xsize << 8) : (quality > 25) ? (xsize << 6) : (xsize << 4); assert(xsize > 0); return (max_window_size > WINDOW_SIZE) ? WINDOW_SIZE : max_window_size; } static WEBP_INLINE int MaxFindCopyLength(int len) { return (len < MAX_LENGTH) ? len : MAX_LENGTH; } int VP8LHashChainFill(VP8LHashChain* const p, int quality, const uint32_t* const argb, int xsize, int ysize, int low_effort, const WebPPicture* const pic, int percent_range, int* const percent) { const int size = xsize * ysize; const int iter_max = GetMaxItersForQuality(quality); const uint32_t window_size = GetWindowSizeForHashChain(quality, xsize); int remaining_percent = percent_range; int percent_start = *percent; int pos; int argb_comp; uint32_t base_position; int32_t* hash_to_first_index; // Temporarily use the p->offset_length_ as a hash chain. int32_t* chain = (int32_t*)p->offset_length_; assert(size > 0); assert(p->size_ != 0); assert(p->offset_length_ != NULL); if (size <= 2) { p->offset_length_[0] = p->offset_length_[size - 1] = 0; return 1; } hash_to_first_index = (int32_t*)WebPSafeMalloc(HASH_SIZE, sizeof(*hash_to_first_index)); if (hash_to_first_index == NULL) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } percent_range = remaining_percent / 2; remaining_percent -= percent_range; // Set the int32_t array to -1. memset(hash_to_first_index, 0xff, HASH_SIZE * sizeof(*hash_to_first_index)); // Fill the chain linking pixels with the same hash. argb_comp = (argb[0] == argb[1]); for (pos = 0; pos < size - 2;) { uint32_t hash_code; const int argb_comp_next = (argb[pos + 1] == argb[pos + 2]); if (argb_comp && argb_comp_next) { // Consecutive pixels with the same color will share the same hash. // We therefore use a different hash: the color and its repetition // length. uint32_t tmp[2]; uint32_t len = 1; tmp[0] = argb[pos]; // Figure out how far the pixels are the same. // The last pixel has a different 64 bit hash, as its next pixel does // not have the same color, so we just need to get to the last pixel equal // to its follower. while (pos + (int)len + 2 < size && argb[pos + len + 2] == argb[pos]) { ++len; } if (len > MAX_LENGTH) { // Skip the pixels that match for distance=1 and length>MAX_LENGTH // because they are linked to their predecessor and we automatically // check that in the main for loop below. Skipping means setting no // predecessor in the chain, hence -1. memset(chain + pos, 0xff, (len - MAX_LENGTH) * sizeof(*chain)); pos += len - MAX_LENGTH; len = MAX_LENGTH; } // Process the rest of the hash chain. while (len) { tmp[1] = len--; hash_code = GetPixPairHash64(tmp); chain[pos] = hash_to_first_index[hash_code]; hash_to_first_index[hash_code] = pos++; } argb_comp = 0; } else { // Just move one pixel forward. hash_code = GetPixPairHash64(argb + pos); chain[pos] = hash_to_first_index[hash_code]; hash_to_first_index[hash_code] = pos++; argb_comp = argb_comp_next; } if (!WebPReportProgress( pic, percent_start + percent_range * pos / (size - 2), percent)) { WebPSafeFree(hash_to_first_index); return 0; } } // Process the penultimate pixel. chain[pos] = hash_to_first_index[GetPixPairHash64(argb + pos)]; WebPSafeFree(hash_to_first_index); percent_start += percent_range; if (!WebPReportProgress(pic, percent_start, percent)) return 0; percent_range = remaining_percent; // Find the best match interval at each pixel, defined by an offset to the // pixel and a length. The right-most pixel cannot match anything to the right // (hence a best length of 0) and the left-most pixel nothing to the left // (hence an offset of 0). assert(size > 2); p->offset_length_[0] = p->offset_length_[size - 1] = 0; for (base_position = size - 2; base_position > 0;) { const int max_len = MaxFindCopyLength(size - 1 - base_position); const uint32_t* const argb_start = argb + base_position; int iter = iter_max; int best_length = 0; uint32_t best_distance = 0; uint32_t best_argb; const int min_pos = (base_position > window_size) ? base_position - window_size : 0; const int length_max = (max_len < 256) ? max_len : 256; uint32_t max_base_position; pos = chain[base_position]; if (!low_effort) { int curr_length; // Heuristic: use the comparison with the above line as an initialization. if (base_position >= (uint32_t)xsize) { curr_length = FindMatchLength(argb_start - xsize, argb_start, best_length, max_len); if (curr_length > best_length) { best_length = curr_length; best_distance = xsize; } --iter; } // Heuristic: compare to the previous pixel. curr_length = FindMatchLength(argb_start - 1, argb_start, best_length, max_len); if (curr_length > best_length) { best_length = curr_length; best_distance = 1; } --iter; // Skip the for loop if we already have the maximum. if (best_length == MAX_LENGTH) pos = min_pos - 1; } best_argb = argb_start[best_length]; for (; pos >= min_pos && --iter; pos = chain[pos]) { int curr_length; assert(base_position > (uint32_t)pos); if (argb[pos + best_length] != best_argb) continue; curr_length = VP8LVectorMismatch(argb + pos, argb_start, max_len); if (best_length < curr_length) { best_length = curr_length; best_distance = base_position - pos; best_argb = argb_start[best_length]; // Stop if we have reached a good enough length. if (best_length >= length_max) break; } } // We have the best match but in case the two intervals continue matching // to the left, we have the best matches for the left-extended pixels. max_base_position = base_position; while (1) { assert(best_length <= MAX_LENGTH); assert(best_distance <= WINDOW_SIZE); p->offset_length_[base_position] = (best_distance << MAX_LENGTH_BITS) | (uint32_t)best_length; --base_position; // Stop if we don't have a match or if we are out of bounds. if (best_distance == 0 || base_position == 0) break; // Stop if we cannot extend the matching intervals to the left. if (base_position < best_distance || argb[base_position - best_distance] != argb[base_position]) { break; } // Stop if we are matching at its limit because there could be a closer // matching interval with the same maximum length. Then again, if the // matching interval is as close as possible (best_distance == 1), we will // never find anything better so let's continue. if (best_length == MAX_LENGTH && best_distance != 1 && base_position + MAX_LENGTH < max_base_position) { break; } if (best_length < MAX_LENGTH) { ++best_length; max_base_position = base_position; } } if (!WebPReportProgress(pic, percent_start + percent_range * (size - 2 - base_position) / (size - 2), percent)) { return 0; } } return WebPReportProgress(pic, percent_start + percent_range, percent); } static WEBP_INLINE void AddSingleLiteral(uint32_t pixel, int use_color_cache, VP8LColorCache* const hashers, VP8LBackwardRefs* const refs) { PixOrCopy v; if (use_color_cache) { const uint32_t key = VP8LColorCacheGetIndex(hashers, pixel); if (VP8LColorCacheLookup(hashers, key) == pixel) { v = PixOrCopyCreateCacheIdx(key); } else { v = PixOrCopyCreateLiteral(pixel); VP8LColorCacheSet(hashers, key, pixel); } } else { v = PixOrCopyCreateLiteral(pixel); } VP8LBackwardRefsCursorAdd(refs, v); } static int BackwardReferencesRle(int xsize, int ysize, const uint32_t* const argb, int cache_bits, VP8LBackwardRefs* const refs) { const int pix_count = xsize * ysize; int i, k; const int use_color_cache = (cache_bits > 0); VP8LColorCache hashers; if (use_color_cache && !VP8LColorCacheInit(&hashers, cache_bits)) { return 0; } VP8LClearBackwardRefs(refs); // Add first pixel as literal. AddSingleLiteral(argb[0], use_color_cache, &hashers, refs); i = 1; while (i < pix_count) { const int max_len = MaxFindCopyLength(pix_count - i); const int rle_len = FindMatchLength(argb + i, argb + i - 1, 0, max_len); const int prev_row_len = (i < xsize) ? 0 : FindMatchLength(argb + i, argb + i - xsize, 0, max_len); if (rle_len >= prev_row_len && rle_len >= MIN_LENGTH) { VP8LBackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(1, rle_len)); // We don't need to update the color cache here since it is always the // same pixel being copied, and that does not change the color cache // state. i += rle_len; } else if (prev_row_len >= MIN_LENGTH) { VP8LBackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(xsize, prev_row_len)); if (use_color_cache) { for (k = 0; k < prev_row_len; ++k) { VP8LColorCacheInsert(&hashers, argb[i + k]); } } i += prev_row_len; } else { AddSingleLiteral(argb[i], use_color_cache, &hashers, refs); i++; } } if (use_color_cache) VP8LColorCacheClear(&hashers); return !refs->error_; } static int BackwardReferencesLz77(int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs) { int i; int i_last_check = -1; int ok = 0; int cc_init = 0; const int use_color_cache = (cache_bits > 0); const int pix_count = xsize * ysize; VP8LColorCache hashers; if (use_color_cache) { cc_init = VP8LColorCacheInit(&hashers, cache_bits); if (!cc_init) goto Error; } VP8LClearBackwardRefs(refs); for (i = 0; i < pix_count;) { // Alternative#1: Code the pixels starting at 'i' using backward reference. int offset = 0; int len = 0; int j; VP8LHashChainFindCopy(hash_chain, i, &offset, &len); if (len >= MIN_LENGTH) { const int len_ini = len; int max_reach = 0; const int j_max = (i + len_ini >= pix_count) ? pix_count - 1 : i + len_ini; // Only start from what we have not checked already. i_last_check = (i > i_last_check) ? i : i_last_check; // We know the best match for the current pixel but we try to find the // best matches for the current pixel AND the next one combined. // The naive method would use the intervals: // [i,i+len) + [i+len, length of best match at i+len) // while we check if we can use: // [i,j) (where j<=i+len) + [j, length of best match at j) for (j = i_last_check + 1; j <= j_max; ++j) { const int len_j = VP8LHashChainFindLength(hash_chain, j); const int reach = j + (len_j >= MIN_LENGTH ? len_j : 1); // 1 for single literal. if (reach > max_reach) { len = j - i; max_reach = reach; if (max_reach >= pix_count) break; } } } else { len = 1; } // Go with literal or backward reference. assert(len > 0); if (len == 1) { AddSingleLiteral(argb[i], use_color_cache, &hashers, refs); } else { VP8LBackwardRefsCursorAdd(refs, PixOrCopyCreateCopy(offset, len)); if (use_color_cache) { for (j = i; j < i + len; ++j) VP8LColorCacheInsert(&hashers, argb[j]); } } i += len; } ok = !refs->error_; Error: if (cc_init) VP8LColorCacheClear(&hashers); return ok; } // Compute an LZ77 by forcing matches to happen within a given distance cost. // We therefore limit the algorithm to the lowest 32 values in the PlaneCode // definition. #define WINDOW_OFFSETS_SIZE_MAX 32 static int BackwardReferencesLz77Box(int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain_best, VP8LHashChain* hash_chain, VP8LBackwardRefs* const refs) { int i; const int pix_count = xsize * ysize; uint16_t* counts; int window_offsets[WINDOW_OFFSETS_SIZE_MAX] = {0}; int window_offsets_new[WINDOW_OFFSETS_SIZE_MAX] = {0}; int window_offsets_size = 0; int window_offsets_new_size = 0; uint16_t* const counts_ini = (uint16_t*)WebPSafeMalloc(xsize * ysize, sizeof(*counts_ini)); int best_offset_prev = -1, best_length_prev = -1; if (counts_ini == NULL) return 0; // counts[i] counts how many times a pixel is repeated starting at position i. i = pix_count - 2; counts = counts_ini + i; counts[1] = 1; for (; i >= 0; --i, --counts) { if (argb[i] == argb[i + 1]) { // Max out the counts to MAX_LENGTH. counts[0] = counts[1] + (counts[1] != MAX_LENGTH); } else { counts[0] = 1; } } // Figure out the window offsets around a pixel. They are stored in a // spiraling order around the pixel as defined by VP8LDistanceToPlaneCode. { int x, y; for (y = 0; y <= 6; ++y) { for (x = -6; x <= 6; ++x) { const int offset = y * xsize + x; int plane_code; // Ignore offsets that bring us after the pixel. if (offset <= 0) continue; plane_code = VP8LDistanceToPlaneCode(xsize, offset) - 1; if (plane_code >= WINDOW_OFFSETS_SIZE_MAX) continue; window_offsets[plane_code] = offset; } } // For narrow images, not all plane codes are reached, so remove those. for (i = 0; i < WINDOW_OFFSETS_SIZE_MAX; ++i) { if (window_offsets[i] == 0) continue; window_offsets[window_offsets_size++] = window_offsets[i]; } // Given a pixel P, find the offsets that reach pixels unreachable from P-1 // with any of the offsets in window_offsets[]. for (i = 0; i < window_offsets_size; ++i) { int j; int is_reachable = 0; for (j = 0; j < window_offsets_size && !is_reachable; ++j) { is_reachable |= (window_offsets[i] == window_offsets[j] + 1); } if (!is_reachable) { window_offsets_new[window_offsets_new_size] = window_offsets[i]; ++window_offsets_new_size; } } } hash_chain->offset_length_[0] = 0; for (i = 1; i < pix_count; ++i) { int ind; int best_length = VP8LHashChainFindLength(hash_chain_best, i); int best_offset; int do_compute = 1; if (best_length >= MAX_LENGTH) { // Do not recompute the best match if we already have a maximal one in the // window. best_offset = VP8LHashChainFindOffset(hash_chain_best, i); for (ind = 0; ind < window_offsets_size; ++ind) { if (best_offset == window_offsets[ind]) { do_compute = 0; break; } } } if (do_compute) { // Figure out if we should use the offset/length from the previous pixel // as an initial guess and therefore only inspect the offsets in // window_offsets_new[]. const int use_prev = (best_length_prev > 1) && (best_length_prev < MAX_LENGTH); const int num_ind = use_prev ? window_offsets_new_size : window_offsets_size; best_length = use_prev ? best_length_prev - 1 : 0; best_offset = use_prev ? best_offset_prev : 0; // Find the longest match in a window around the pixel. for (ind = 0; ind < num_ind; ++ind) { int curr_length = 0; int j = i; int j_offset = use_prev ? i - window_offsets_new[ind] : i - window_offsets[ind]; if (j_offset < 0 || argb[j_offset] != argb[i]) continue; // The longest match is the sum of how many times each pixel is // repeated. do { const int counts_j_offset = counts_ini[j_offset]; const int counts_j = counts_ini[j]; if (counts_j_offset != counts_j) { curr_length += (counts_j_offset < counts_j) ? counts_j_offset : counts_j; break; } // The same color is repeated counts_pos times at j_offset and j. curr_length += counts_j_offset; j_offset += counts_j_offset; j += counts_j_offset; } while (curr_length <= MAX_LENGTH && j < pix_count && argb[j_offset] == argb[j]); if (best_length < curr_length) { best_offset = use_prev ? window_offsets_new[ind] : window_offsets[ind]; if (curr_length >= MAX_LENGTH) { best_length = MAX_LENGTH; break; } else { best_length = curr_length; } } } } assert(i + best_length <= pix_count); assert(best_length <= MAX_LENGTH); if (best_length <= MIN_LENGTH) { hash_chain->offset_length_[i] = 0; best_offset_prev = 0; best_length_prev = 0; } else { hash_chain->offset_length_[i] = (best_offset << MAX_LENGTH_BITS) | (uint32_t)best_length; best_offset_prev = best_offset; best_length_prev = best_length; } } hash_chain->offset_length_[0] = 0; WebPSafeFree(counts_ini); return BackwardReferencesLz77(xsize, ysize, argb, cache_bits, hash_chain, refs); } // ----------------------------------------------------------------------------- static void BackwardReferences2DLocality(int xsize, const VP8LBackwardRefs* const refs) { VP8LRefsCursor c = VP8LRefsCursorInit(refs); while (VP8LRefsCursorOk(&c)) { if (PixOrCopyIsCopy(c.cur_pos)) { const int dist = c.cur_pos->argb_or_distance; const int transformed_dist = VP8LDistanceToPlaneCode(xsize, dist); c.cur_pos->argb_or_distance = transformed_dist; } VP8LRefsCursorNext(&c); } } // Evaluate optimal cache bits for the local color cache. // The input *best_cache_bits sets the maximum cache bits to use (passing 0 // implies disabling the local color cache). The local color cache is also // disabled for the lower (<= 25) quality. // Returns 0 in case of memory error. static int CalculateBestCacheSize(const uint32_t* argb, int quality, const VP8LBackwardRefs* const refs, int* const best_cache_bits) { int i; const int cache_bits_max = (quality <= 25) ? 0 : *best_cache_bits; float entropy_min = MAX_ENTROPY; int cc_init[MAX_COLOR_CACHE_BITS + 1] = { 0 }; VP8LColorCache hashers[MAX_COLOR_CACHE_BITS + 1]; VP8LRefsCursor c = VP8LRefsCursorInit(refs); VP8LHistogram* histos[MAX_COLOR_CACHE_BITS + 1] = { NULL }; int ok = 0; assert(cache_bits_max >= 0 && cache_bits_max <= MAX_COLOR_CACHE_BITS); if (cache_bits_max == 0) { *best_cache_bits = 0; // Local color cache is disabled. return 1; } // Allocate data. for (i = 0; i <= cache_bits_max; ++i) { histos[i] = VP8LAllocateHistogram(i); if (histos[i] == NULL) goto Error; VP8LHistogramInit(histos[i], i, /*init_arrays=*/ 1); if (i == 0) continue; cc_init[i] = VP8LColorCacheInit(&hashers[i], i); if (!cc_init[i]) goto Error; } // Find the cache_bits giving the lowest entropy. The search is done in a // brute-force way as the function (entropy w.r.t cache_bits) can be // anything in practice. while (VP8LRefsCursorOk(&c)) { const PixOrCopy* const v = c.cur_pos; if (PixOrCopyIsLiteral(v)) { const uint32_t pix = *argb++; const uint32_t a = (pix >> 24) & 0xff; const uint32_t r = (pix >> 16) & 0xff; const uint32_t g = (pix >> 8) & 0xff; const uint32_t b = (pix >> 0) & 0xff; // The keys of the caches can be derived from the longest one. int key = VP8LHashPix(pix, 32 - cache_bits_max); // Do not use the color cache for cache_bits = 0. ++histos[0]->blue_[b]; ++histos[0]->literal_[g]; ++histos[0]->red_[r]; ++histos[0]->alpha_[a]; // Deal with cache_bits > 0. for (i = cache_bits_max; i >= 1; --i, key >>= 1) { if (VP8LColorCacheLookup(&hashers[i], key) == pix) { ++histos[i]->literal_[NUM_LITERAL_CODES + NUM_LENGTH_CODES + key]; } else { VP8LColorCacheSet(&hashers[i], key, pix); ++histos[i]->blue_[b]; ++histos[i]->literal_[g]; ++histos[i]->red_[r]; ++histos[i]->alpha_[a]; } } } else { int code, extra_bits, extra_bits_value; // We should compute the contribution of the (distance,length) // histograms but those are the same independently from the cache size. // As those constant contributions are in the end added to the other // histogram contributions, we can ignore them, except for the length // prefix that is part of the literal_ histogram. int len = PixOrCopyLength(v); uint32_t argb_prev = *argb ^ 0xffffffffu; VP8LPrefixEncode(len, &code, &extra_bits, &extra_bits_value); for (i = 0; i <= cache_bits_max; ++i) { ++histos[i]->literal_[NUM_LITERAL_CODES + code]; } // Update the color caches. do { if (*argb != argb_prev) { // Efficiency: insert only if the color changes. int key = VP8LHashPix(*argb, 32 - cache_bits_max); for (i = cache_bits_max; i >= 1; --i, key >>= 1) { hashers[i].colors_[key] = *argb; } argb_prev = *argb; } argb++; } while (--len != 0); } VP8LRefsCursorNext(&c); } for (i = 0; i <= cache_bits_max; ++i) { const float entropy = VP8LHistogramEstimateBits(histos[i]); if (i == 0 || entropy < entropy_min) { entropy_min = entropy; *best_cache_bits = i; } } ok = 1; Error: for (i = 0; i <= cache_bits_max; ++i) { if (cc_init[i]) VP8LColorCacheClear(&hashers[i]); VP8LFreeHistogram(histos[i]); } return ok; } // Update (in-place) backward references for specified cache_bits. static int BackwardRefsWithLocalCache(const uint32_t* const argb, int cache_bits, VP8LBackwardRefs* const refs) { int pixel_index = 0; VP8LColorCache hashers; VP8LRefsCursor c = VP8LRefsCursorInit(refs); if (!VP8LColorCacheInit(&hashers, cache_bits)) return 0; while (VP8LRefsCursorOk(&c)) { PixOrCopy* const v = c.cur_pos; if (PixOrCopyIsLiteral(v)) { const uint32_t argb_literal = v->argb_or_distance; const int ix = VP8LColorCacheContains(&hashers, argb_literal); if (ix >= 0) { // hashers contains argb_literal *v = PixOrCopyCreateCacheIdx(ix); } else { VP8LColorCacheInsert(&hashers, argb_literal); } ++pixel_index; } else { // refs was created without local cache, so it can not have cache indexes. int k; assert(PixOrCopyIsCopy(v)); for (k = 0; k < v->len; ++k) { VP8LColorCacheInsert(&hashers, argb[pixel_index++]); } } VP8LRefsCursorNext(&c); } VP8LColorCacheClear(&hashers); return 1; } static VP8LBackwardRefs* GetBackwardReferencesLowEffort( int width, int height, const uint32_t* const argb, int* const cache_bits, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs_lz77) { *cache_bits = 0; if (!BackwardReferencesLz77(width, height, argb, 0, hash_chain, refs_lz77)) { return NULL; } BackwardReferences2DLocality(width, refs_lz77); return refs_lz77; } extern int VP8LBackwardReferencesTraceBackwards( int xsize, int ysize, const uint32_t* const argb, int cache_bits, const VP8LHashChain* const hash_chain, const VP8LBackwardRefs* const refs_src, VP8LBackwardRefs* const refs_dst); static int GetBackwardReferences(int width, int height, const uint32_t* const argb, int quality, int lz77_types_to_try, int cache_bits_max, int do_no_cache, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs, int* const cache_bits_best) { VP8LHistogram* histo = NULL; int i, lz77_type; // Index 0 is for a color cache, index 1 for no cache (if needed). int lz77_types_best[2] = {0, 0}; float bit_costs_best[2] = {FLT_MAX, FLT_MAX}; VP8LHashChain hash_chain_box; VP8LBackwardRefs* const refs_tmp = &refs[do_no_cache ? 2 : 1]; int status = 0; memset(&hash_chain_box, 0, sizeof(hash_chain_box)); histo = VP8LAllocateHistogram(MAX_COLOR_CACHE_BITS); if (histo == NULL) goto Error; for (lz77_type = 1; lz77_types_to_try; lz77_types_to_try &= ~lz77_type, lz77_type <<= 1) { int res = 0; float bit_cost = 0.f; if ((lz77_types_to_try & lz77_type) == 0) continue; switch (lz77_type) { case kLZ77RLE: res = BackwardReferencesRle(width, height, argb, 0, refs_tmp); break; case kLZ77Standard: // Compute LZ77 with no cache (0 bits), as the ideal LZ77 with a color // cache is not that different in practice. res = BackwardReferencesLz77(width, height, argb, 0, hash_chain, refs_tmp); break; case kLZ77Box: if (!VP8LHashChainInit(&hash_chain_box, width * height)) goto Error; res = BackwardReferencesLz77Box(width, height, argb, 0, hash_chain, &hash_chain_box, refs_tmp); break; default: assert(0); } if (!res) goto Error; // Start with the no color cache case. for (i = 1; i >= 0; --i) { int cache_bits = (i == 1) ? 0 : cache_bits_max; if (i == 1 && !do_no_cache) continue; if (i == 0) { // Try with a color cache. if (!CalculateBestCacheSize(argb, quality, refs_tmp, &cache_bits)) { goto Error; } if (cache_bits > 0) { if (!BackwardRefsWithLocalCache(argb, cache_bits, refs_tmp)) { goto Error; } } } if (i == 0 && do_no_cache && cache_bits == 0) { // No need to re-compute bit_cost as it was computed at i == 1. } else { VP8LHistogramCreate(histo, refs_tmp, cache_bits); bit_cost = VP8LHistogramEstimateBits(histo); } if (bit_cost < bit_costs_best[i]) { if (i == 1) { // Do not swap as the full cache analysis would have the wrong // VP8LBackwardRefs to start with. if (!BackwardRefsClone(refs_tmp, &refs[1])) goto Error; } else { BackwardRefsSwap(refs_tmp, &refs[0]); } bit_costs_best[i] = bit_cost; lz77_types_best[i] = lz77_type; if (i == 0) *cache_bits_best = cache_bits; } } } assert(lz77_types_best[0] > 0); assert(!do_no_cache || lz77_types_best[1] > 0); // Improve on simple LZ77 but only for high quality (TraceBackwards is // costly). for (i = 1; i >= 0; --i) { if (i == 1 && !do_no_cache) continue; if ((lz77_types_best[i] == kLZ77Standard || lz77_types_best[i] == kLZ77Box) && quality >= 25) { const VP8LHashChain* const hash_chain_tmp = (lz77_types_best[i] == kLZ77Standard) ? hash_chain : &hash_chain_box; const int cache_bits = (i == 1) ? 0 : *cache_bits_best; float bit_cost_trace; if (!VP8LBackwardReferencesTraceBackwards(width, height, argb, cache_bits, hash_chain_tmp, &refs[i], refs_tmp)) { goto Error; } VP8LHistogramCreate(histo, refs_tmp, cache_bits); bit_cost_trace = VP8LHistogramEstimateBits(histo); if (bit_cost_trace < bit_costs_best[i]) { BackwardRefsSwap(refs_tmp, &refs[i]); } } BackwardReferences2DLocality(width, &refs[i]); if (i == 1 && lz77_types_best[0] == lz77_types_best[1] && *cache_bits_best == 0) { // If the best cache size is 0 and we have the same best LZ77, just copy // the data over and stop here. if (!BackwardRefsClone(&refs[1], &refs[0])) goto Error; break; } } status = 1; Error: VP8LHashChainClear(&hash_chain_box); VP8LFreeHistogram(histo); return status; } int VP8LGetBackwardReferences( int width, int height, const uint32_t* const argb, int quality, int low_effort, int lz77_types_to_try, int cache_bits_max, int do_no_cache, const VP8LHashChain* const hash_chain, VP8LBackwardRefs* const refs, int* const cache_bits_best, const WebPPicture* const pic, int percent_range, int* const percent) { if (low_effort) { VP8LBackwardRefs* refs_best; *cache_bits_best = cache_bits_max; refs_best = GetBackwardReferencesLowEffort( width, height, argb, cache_bits_best, hash_chain, refs); if (refs_best == NULL) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } // Set it in first position. BackwardRefsSwap(refs_best, &refs[0]); } else { if (!GetBackwardReferences(width, height, argb, quality, lz77_types_to_try, cache_bits_max, do_no_cache, hash_chain, refs, cache_bits_best)) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY); } } return WebPReportProgress(pic, *percent + percent_range, percent); } libwebp-1.4.0/src/enc/cost_enc.h0000644000014400001440000000476114606317060013365 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Cost tables for level and modes. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_ENC_COST_ENC_H_ #define WEBP_ENC_COST_ENC_H_ #include #include #include "src/enc/vp8i_enc.h" #ifdef __cplusplus extern "C" { #endif // On-the-fly info about the current set of residuals. Handy to avoid // passing zillions of params. typedef struct VP8Residual VP8Residual; struct VP8Residual { int first; int last; const int16_t* coeffs; int coeff_type; ProbaArray* prob; StatsArray* stats; CostArrayPtr costs; }; void VP8InitResidual(int first, int coeff_type, VP8Encoder* const enc, VP8Residual* const res); int VP8RecordCoeffs(int ctx, const VP8Residual* const res); // Record proba context used. static WEBP_INLINE int VP8RecordStats(int bit, proba_t* const stats) { proba_t p = *stats; // An overflow is inbound. Note we handle this at 0xfffe0000u instead of // 0xffff0000u to make sure p + 1u does not overflow. if (p >= 0xfffe0000u) { p = ((p + 1u) >> 1) & 0x7fff7fffu; // -> divide the stats by 2. } // record bit count (lower 16 bits) and increment total count (upper 16 bits). p += 0x00010000u + bit; *stats = p; return bit; } // Cost of coding one event with probability 'proba'. static WEBP_INLINE int VP8BitCost(int bit, uint8_t proba) { return !bit ? VP8EntropyCost[proba] : VP8EntropyCost[255 - proba]; } // Level cost calculations extern const uint16_t VP8LevelCodes[MAX_VARIABLE_LEVEL][2]; void VP8CalculateLevelCosts(VP8EncProba* const proba); static WEBP_INLINE int VP8LevelCost(const uint16_t* const table, int level) { return VP8LevelFixedCosts[level] + table[(level > MAX_VARIABLE_LEVEL) ? MAX_VARIABLE_LEVEL : level]; } // Mode costs extern const uint16_t VP8FixedCostsUV[4]; extern const uint16_t VP8FixedCostsI16[4]; extern const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES]; //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_ENC_COST_ENC_H_ libwebp-1.4.0/src/enc/Makefile.in0000644000014400001440000015605414606317244013473 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/enc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(libwebpencodeinclude_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libwebpencode_la_DEPENDENCIES = ../../sharpyuv/libsharpyuv.la am_libwebpencode_la_OBJECTS = libwebpencode_la-alpha_enc.lo \ libwebpencode_la-analysis_enc.lo \ libwebpencode_la-backward_references_cost_enc.lo \ libwebpencode_la-backward_references_enc.lo \ libwebpencode_la-config_enc.lo libwebpencode_la-cost_enc.lo \ libwebpencode_la-filter_enc.lo libwebpencode_la-frame_enc.lo \ libwebpencode_la-histogram_enc.lo \ libwebpencode_la-iterator_enc.lo \ libwebpencode_la-near_lossless_enc.lo \ libwebpencode_la-picture_enc.lo \ libwebpencode_la-picture_csp_enc.lo \ libwebpencode_la-picture_psnr_enc.lo \ libwebpencode_la-picture_rescale_enc.lo \ libwebpencode_la-picture_tools_enc.lo \ libwebpencode_la-predictor_enc.lo \ libwebpencode_la-quant_enc.lo libwebpencode_la-syntax_enc.lo \ libwebpencode_la-token_enc.lo libwebpencode_la-tree_enc.lo \ libwebpencode_la-vp8l_enc.lo libwebpencode_la-webp_enc.lo libwebpencode_la_OBJECTS = $(am_libwebpencode_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebpencode_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libwebpencode_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/libwebpencode_la-alpha_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-analysis_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-backward_references_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-config_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-cost_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-filter_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-frame_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-histogram_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-iterator_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-near_lossless_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-picture_csp_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-picture_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-picture_psnr_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-picture_rescale_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-picture_tools_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-predictor_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-quant_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-syntax_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-token_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-tree_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-vp8l_enc.Plo \ ./$(DEPDIR)/libwebpencode_la-webp_enc.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpencode_la_SOURCES) DIST_SOURCES = $(libwebpencode_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libwebpencodeincludedir)" HEADERS = $(libwebpencodeinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ noinst_LTLIBRARIES = libwebpencode.la libwebpencode_la_SOURCES = alpha_enc.c analysis_enc.c \ backward_references_cost_enc.c backward_references_enc.c \ backward_references_enc.h config_enc.c cost_enc.c cost_enc.h \ filter_enc.c frame_enc.c histogram_enc.c histogram_enc.h \ iterator_enc.c near_lossless_enc.c picture_enc.c \ picture_csp_enc.c picture_psnr_enc.c picture_rescale_enc.c \ picture_tools_enc.c predictor_enc.c quant_enc.c syntax_enc.c \ token_enc.c tree_enc.c vp8i_enc.h vp8l_enc.c vp8li_enc.h \ webp_enc.c libwebpencodeinclude_HEADERS = ../webp/encode.h ../webp/types.h noinst_HEADERS = ../webp/format_constants.h libwebpencode_la_LIBADD = ../../sharpyuv/libsharpyuv.la libwebpencode_la_LDFLAGS = -lm libwebpencode_la_CPPFLAGS = $(AM_CPPFLAGS) libwebpencodeincludedir = $(includedir)/webp all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/enc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/enc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpencode.la: $(libwebpencode_la_OBJECTS) $(libwebpencode_la_DEPENDENCIES) $(EXTRA_libwebpencode_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpencode_la_LINK) $(libwebpencode_la_OBJECTS) $(libwebpencode_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-alpha_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-analysis_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-backward_references_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-config_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-cost_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-filter_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-frame_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-histogram_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-iterator_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-near_lossless_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-picture_csp_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-picture_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-picture_psnr_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-picture_rescale_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-picture_tools_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-predictor_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-quant_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-syntax_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-token_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-tree_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-vp8l_enc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libwebpencode_la-webp_enc.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libwebpencode_la-alpha_enc.lo: alpha_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-alpha_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-alpha_enc.Tpo -c -o libwebpencode_la-alpha_enc.lo `test -f 'alpha_enc.c' || echo '$(srcdir)/'`alpha_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-alpha_enc.Tpo $(DEPDIR)/libwebpencode_la-alpha_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alpha_enc.c' object='libwebpencode_la-alpha_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-alpha_enc.lo `test -f 'alpha_enc.c' || echo '$(srcdir)/'`alpha_enc.c libwebpencode_la-analysis_enc.lo: analysis_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-analysis_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-analysis_enc.Tpo -c -o libwebpencode_la-analysis_enc.lo `test -f 'analysis_enc.c' || echo '$(srcdir)/'`analysis_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-analysis_enc.Tpo $(DEPDIR)/libwebpencode_la-analysis_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='analysis_enc.c' object='libwebpencode_la-analysis_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-analysis_enc.lo `test -f 'analysis_enc.c' || echo '$(srcdir)/'`analysis_enc.c libwebpencode_la-backward_references_cost_enc.lo: backward_references_cost_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-backward_references_cost_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Tpo -c -o libwebpencode_la-backward_references_cost_enc.lo `test -f 'backward_references_cost_enc.c' || echo '$(srcdir)/'`backward_references_cost_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Tpo $(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='backward_references_cost_enc.c' object='libwebpencode_la-backward_references_cost_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-backward_references_cost_enc.lo `test -f 'backward_references_cost_enc.c' || echo '$(srcdir)/'`backward_references_cost_enc.c libwebpencode_la-backward_references_enc.lo: backward_references_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-backward_references_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-backward_references_enc.Tpo -c -o libwebpencode_la-backward_references_enc.lo `test -f 'backward_references_enc.c' || echo '$(srcdir)/'`backward_references_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-backward_references_enc.Tpo $(DEPDIR)/libwebpencode_la-backward_references_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='backward_references_enc.c' object='libwebpencode_la-backward_references_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-backward_references_enc.lo `test -f 'backward_references_enc.c' || echo '$(srcdir)/'`backward_references_enc.c libwebpencode_la-config_enc.lo: config_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-config_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-config_enc.Tpo -c -o libwebpencode_la-config_enc.lo `test -f 'config_enc.c' || echo '$(srcdir)/'`config_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-config_enc.Tpo $(DEPDIR)/libwebpencode_la-config_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config_enc.c' object='libwebpencode_la-config_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-config_enc.lo `test -f 'config_enc.c' || echo '$(srcdir)/'`config_enc.c libwebpencode_la-cost_enc.lo: cost_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-cost_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-cost_enc.Tpo -c -o libwebpencode_la-cost_enc.lo `test -f 'cost_enc.c' || echo '$(srcdir)/'`cost_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-cost_enc.Tpo $(DEPDIR)/libwebpencode_la-cost_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cost_enc.c' object='libwebpencode_la-cost_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-cost_enc.lo `test -f 'cost_enc.c' || echo '$(srcdir)/'`cost_enc.c libwebpencode_la-filter_enc.lo: filter_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-filter_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-filter_enc.Tpo -c -o libwebpencode_la-filter_enc.lo `test -f 'filter_enc.c' || echo '$(srcdir)/'`filter_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-filter_enc.Tpo $(DEPDIR)/libwebpencode_la-filter_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filter_enc.c' object='libwebpencode_la-filter_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-filter_enc.lo `test -f 'filter_enc.c' || echo '$(srcdir)/'`filter_enc.c libwebpencode_la-frame_enc.lo: frame_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-frame_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-frame_enc.Tpo -c -o libwebpencode_la-frame_enc.lo `test -f 'frame_enc.c' || echo '$(srcdir)/'`frame_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-frame_enc.Tpo $(DEPDIR)/libwebpencode_la-frame_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='frame_enc.c' object='libwebpencode_la-frame_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-frame_enc.lo `test -f 'frame_enc.c' || echo '$(srcdir)/'`frame_enc.c libwebpencode_la-histogram_enc.lo: histogram_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-histogram_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-histogram_enc.Tpo -c -o libwebpencode_la-histogram_enc.lo `test -f 'histogram_enc.c' || echo '$(srcdir)/'`histogram_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-histogram_enc.Tpo $(DEPDIR)/libwebpencode_la-histogram_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='histogram_enc.c' object='libwebpencode_la-histogram_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-histogram_enc.lo `test -f 'histogram_enc.c' || echo '$(srcdir)/'`histogram_enc.c libwebpencode_la-iterator_enc.lo: iterator_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-iterator_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-iterator_enc.Tpo -c -o libwebpencode_la-iterator_enc.lo `test -f 'iterator_enc.c' || echo '$(srcdir)/'`iterator_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-iterator_enc.Tpo $(DEPDIR)/libwebpencode_la-iterator_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iterator_enc.c' object='libwebpencode_la-iterator_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-iterator_enc.lo `test -f 'iterator_enc.c' || echo '$(srcdir)/'`iterator_enc.c libwebpencode_la-near_lossless_enc.lo: near_lossless_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-near_lossless_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-near_lossless_enc.Tpo -c -o libwebpencode_la-near_lossless_enc.lo `test -f 'near_lossless_enc.c' || echo '$(srcdir)/'`near_lossless_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-near_lossless_enc.Tpo $(DEPDIR)/libwebpencode_la-near_lossless_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='near_lossless_enc.c' object='libwebpencode_la-near_lossless_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-near_lossless_enc.lo `test -f 'near_lossless_enc.c' || echo '$(srcdir)/'`near_lossless_enc.c libwebpencode_la-picture_enc.lo: picture_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-picture_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-picture_enc.Tpo -c -o libwebpencode_la-picture_enc.lo `test -f 'picture_enc.c' || echo '$(srcdir)/'`picture_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-picture_enc.Tpo $(DEPDIR)/libwebpencode_la-picture_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='picture_enc.c' object='libwebpencode_la-picture_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-picture_enc.lo `test -f 'picture_enc.c' || echo '$(srcdir)/'`picture_enc.c libwebpencode_la-picture_csp_enc.lo: picture_csp_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-picture_csp_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-picture_csp_enc.Tpo -c -o libwebpencode_la-picture_csp_enc.lo `test -f 'picture_csp_enc.c' || echo '$(srcdir)/'`picture_csp_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-picture_csp_enc.Tpo $(DEPDIR)/libwebpencode_la-picture_csp_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='picture_csp_enc.c' object='libwebpencode_la-picture_csp_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-picture_csp_enc.lo `test -f 'picture_csp_enc.c' || echo '$(srcdir)/'`picture_csp_enc.c libwebpencode_la-picture_psnr_enc.lo: picture_psnr_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-picture_psnr_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-picture_psnr_enc.Tpo -c -o libwebpencode_la-picture_psnr_enc.lo `test -f 'picture_psnr_enc.c' || echo '$(srcdir)/'`picture_psnr_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-picture_psnr_enc.Tpo $(DEPDIR)/libwebpencode_la-picture_psnr_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='picture_psnr_enc.c' object='libwebpencode_la-picture_psnr_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-picture_psnr_enc.lo `test -f 'picture_psnr_enc.c' || echo '$(srcdir)/'`picture_psnr_enc.c libwebpencode_la-picture_rescale_enc.lo: picture_rescale_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-picture_rescale_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-picture_rescale_enc.Tpo -c -o libwebpencode_la-picture_rescale_enc.lo `test -f 'picture_rescale_enc.c' || echo '$(srcdir)/'`picture_rescale_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-picture_rescale_enc.Tpo $(DEPDIR)/libwebpencode_la-picture_rescale_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='picture_rescale_enc.c' object='libwebpencode_la-picture_rescale_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-picture_rescale_enc.lo `test -f 'picture_rescale_enc.c' || echo '$(srcdir)/'`picture_rescale_enc.c libwebpencode_la-picture_tools_enc.lo: picture_tools_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-picture_tools_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-picture_tools_enc.Tpo -c -o libwebpencode_la-picture_tools_enc.lo `test -f 'picture_tools_enc.c' || echo '$(srcdir)/'`picture_tools_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-picture_tools_enc.Tpo $(DEPDIR)/libwebpencode_la-picture_tools_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='picture_tools_enc.c' object='libwebpencode_la-picture_tools_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-picture_tools_enc.lo `test -f 'picture_tools_enc.c' || echo '$(srcdir)/'`picture_tools_enc.c libwebpencode_la-predictor_enc.lo: predictor_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-predictor_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-predictor_enc.Tpo -c -o libwebpencode_la-predictor_enc.lo `test -f 'predictor_enc.c' || echo '$(srcdir)/'`predictor_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-predictor_enc.Tpo $(DEPDIR)/libwebpencode_la-predictor_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='predictor_enc.c' object='libwebpencode_la-predictor_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-predictor_enc.lo `test -f 'predictor_enc.c' || echo '$(srcdir)/'`predictor_enc.c libwebpencode_la-quant_enc.lo: quant_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-quant_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-quant_enc.Tpo -c -o libwebpencode_la-quant_enc.lo `test -f 'quant_enc.c' || echo '$(srcdir)/'`quant_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-quant_enc.Tpo $(DEPDIR)/libwebpencode_la-quant_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quant_enc.c' object='libwebpencode_la-quant_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-quant_enc.lo `test -f 'quant_enc.c' || echo '$(srcdir)/'`quant_enc.c libwebpencode_la-syntax_enc.lo: syntax_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-syntax_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-syntax_enc.Tpo -c -o libwebpencode_la-syntax_enc.lo `test -f 'syntax_enc.c' || echo '$(srcdir)/'`syntax_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-syntax_enc.Tpo $(DEPDIR)/libwebpencode_la-syntax_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='syntax_enc.c' object='libwebpencode_la-syntax_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-syntax_enc.lo `test -f 'syntax_enc.c' || echo '$(srcdir)/'`syntax_enc.c libwebpencode_la-token_enc.lo: token_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-token_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-token_enc.Tpo -c -o libwebpencode_la-token_enc.lo `test -f 'token_enc.c' || echo '$(srcdir)/'`token_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-token_enc.Tpo $(DEPDIR)/libwebpencode_la-token_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='token_enc.c' object='libwebpencode_la-token_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-token_enc.lo `test -f 'token_enc.c' || echo '$(srcdir)/'`token_enc.c libwebpencode_la-tree_enc.lo: tree_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-tree_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-tree_enc.Tpo -c -o libwebpencode_la-tree_enc.lo `test -f 'tree_enc.c' || echo '$(srcdir)/'`tree_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-tree_enc.Tpo $(DEPDIR)/libwebpencode_la-tree_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tree_enc.c' object='libwebpencode_la-tree_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-tree_enc.lo `test -f 'tree_enc.c' || echo '$(srcdir)/'`tree_enc.c libwebpencode_la-vp8l_enc.lo: vp8l_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-vp8l_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-vp8l_enc.Tpo -c -o libwebpencode_la-vp8l_enc.lo `test -f 'vp8l_enc.c' || echo '$(srcdir)/'`vp8l_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-vp8l_enc.Tpo $(DEPDIR)/libwebpencode_la-vp8l_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vp8l_enc.c' object='libwebpencode_la-vp8l_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-vp8l_enc.lo `test -f 'vp8l_enc.c' || echo '$(srcdir)/'`vp8l_enc.c libwebpencode_la-webp_enc.lo: webp_enc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libwebpencode_la-webp_enc.lo -MD -MP -MF $(DEPDIR)/libwebpencode_la-webp_enc.Tpo -c -o libwebpencode_la-webp_enc.lo `test -f 'webp_enc.c' || echo '$(srcdir)/'`webp_enc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libwebpencode_la-webp_enc.Tpo $(DEPDIR)/libwebpencode_la-webp_enc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='webp_enc.c' object='libwebpencode_la-webp_enc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libwebpencode_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libwebpencode_la-webp_enc.lo `test -f 'webp_enc.c' || echo '$(srcdir)/'`webp_enc.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libwebpencodeincludeHEADERS: $(libwebpencodeinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libwebpencodeinclude_HEADERS)'; test -n "$(libwebpencodeincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libwebpencodeincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libwebpencodeincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libwebpencodeincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libwebpencodeincludedir)" || exit $$?; \ done uninstall-libwebpencodeincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libwebpencodeinclude_HEADERS)'; test -n "$(libwebpencodeincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libwebpencodeincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libwebpencodeincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/libwebpencode_la-alpha_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-analysis_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-backward_references_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-config_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-cost_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-filter_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-frame_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-histogram_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-iterator_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-near_lossless_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_csp_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_psnr_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_rescale_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_tools_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-predictor_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-quant_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-syntax_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-token_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-tree_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-vp8l_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-webp_enc.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libwebpencodeincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/libwebpencode_la-alpha_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-analysis_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-backward_references_cost_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-backward_references_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-config_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-cost_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-filter_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-frame_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-histogram_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-iterator_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-near_lossless_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_csp_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_psnr_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_rescale_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-picture_tools_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-predictor_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-quant_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-syntax_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-token_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-tree_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-vp8l_enc.Plo -rm -f ./$(DEPDIR)/libwebpencode_la-webp_enc.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libwebpencodeincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am \ install-libwebpencodeincludeHEADERS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-libwebpencodeincludeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/enc/syntax_enc.c0000644000014400001440000003061714606317060013735 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Header syntax writing // // Author: Skal (pascal.massimino@gmail.com) #include #include "src/utils/utils.h" #include "src/webp/format_constants.h" // RIFF constants #include "src/webp/mux_types.h" // ALPHA_FLAG #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Helper functions static int IsVP8XNeeded(const VP8Encoder* const enc) { return !!enc->has_alpha_; // Currently the only case when VP8X is needed. // This could change in the future. } static int PutPaddingByte(const WebPPicture* const pic) { const uint8_t pad_byte[1] = { 0 }; return !!pic->writer(pad_byte, 1, pic); } //------------------------------------------------------------------------------ // Writers for header's various pieces (in order of appearance) static WebPEncodingError PutRIFFHeader(const VP8Encoder* const enc, size_t riff_size) { const WebPPicture* const pic = enc->pic_; uint8_t riff[RIFF_HEADER_SIZE] = { 'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P' }; assert(riff_size == (uint32_t)riff_size); PutLE32(riff + TAG_SIZE, (uint32_t)riff_size); if (!pic->writer(riff, sizeof(riff), pic)) { return VP8_ENC_ERROR_BAD_WRITE; } return VP8_ENC_OK; } static WebPEncodingError PutVP8XHeader(const VP8Encoder* const enc) { const WebPPicture* const pic = enc->pic_; uint8_t vp8x[CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE] = { 'V', 'P', '8', 'X' }; uint32_t flags = 0; assert(IsVP8XNeeded(enc)); assert(pic->width >= 1 && pic->height >= 1); assert(pic->width <= MAX_CANVAS_SIZE && pic->height <= MAX_CANVAS_SIZE); if (enc->has_alpha_) { flags |= ALPHA_FLAG; } PutLE32(vp8x + TAG_SIZE, VP8X_CHUNK_SIZE); PutLE32(vp8x + CHUNK_HEADER_SIZE, flags); PutLE24(vp8x + CHUNK_HEADER_SIZE + 4, pic->width - 1); PutLE24(vp8x + CHUNK_HEADER_SIZE + 7, pic->height - 1); if (!pic->writer(vp8x, sizeof(vp8x), pic)) { return VP8_ENC_ERROR_BAD_WRITE; } return VP8_ENC_OK; } static WebPEncodingError PutAlphaChunk(const VP8Encoder* const enc) { const WebPPicture* const pic = enc->pic_; uint8_t alpha_chunk_hdr[CHUNK_HEADER_SIZE] = { 'A', 'L', 'P', 'H' }; assert(enc->has_alpha_); // Alpha chunk header. PutLE32(alpha_chunk_hdr + TAG_SIZE, enc->alpha_data_size_); if (!pic->writer(alpha_chunk_hdr, sizeof(alpha_chunk_hdr), pic)) { return VP8_ENC_ERROR_BAD_WRITE; } // Alpha chunk data. if (!pic->writer(enc->alpha_data_, enc->alpha_data_size_, pic)) { return VP8_ENC_ERROR_BAD_WRITE; } // Padding. if ((enc->alpha_data_size_ & 1) && !PutPaddingByte(pic)) { return VP8_ENC_ERROR_BAD_WRITE; } return VP8_ENC_OK; } static WebPEncodingError PutVP8Header(const WebPPicture* const pic, size_t vp8_size) { uint8_t vp8_chunk_hdr[CHUNK_HEADER_SIZE] = { 'V', 'P', '8', ' ' }; assert(vp8_size == (uint32_t)vp8_size); PutLE32(vp8_chunk_hdr + TAG_SIZE, (uint32_t)vp8_size); if (!pic->writer(vp8_chunk_hdr, sizeof(vp8_chunk_hdr), pic)) { return VP8_ENC_ERROR_BAD_WRITE; } return VP8_ENC_OK; } static WebPEncodingError PutVP8FrameHeader(const WebPPicture* const pic, int profile, size_t size0) { uint8_t vp8_frm_hdr[VP8_FRAME_HEADER_SIZE]; uint32_t bits; if (size0 >= VP8_MAX_PARTITION0_SIZE) { // partition #0 is too big to fit return VP8_ENC_ERROR_PARTITION0_OVERFLOW; } // Paragraph 9.1. bits = 0 // keyframe (1b) | (profile << 1) // profile (3b) | (1 << 4) // visible (1b) | ((uint32_t)size0 << 5); // partition length (19b) vp8_frm_hdr[0] = (bits >> 0) & 0xff; vp8_frm_hdr[1] = (bits >> 8) & 0xff; vp8_frm_hdr[2] = (bits >> 16) & 0xff; // signature vp8_frm_hdr[3] = (VP8_SIGNATURE >> 16) & 0xff; vp8_frm_hdr[4] = (VP8_SIGNATURE >> 8) & 0xff; vp8_frm_hdr[5] = (VP8_SIGNATURE >> 0) & 0xff; // dimensions vp8_frm_hdr[6] = pic->width & 0xff; vp8_frm_hdr[7] = pic->width >> 8; vp8_frm_hdr[8] = pic->height & 0xff; vp8_frm_hdr[9] = pic->height >> 8; if (!pic->writer(vp8_frm_hdr, sizeof(vp8_frm_hdr), pic)) { return VP8_ENC_ERROR_BAD_WRITE; } return VP8_ENC_OK; } // WebP Headers. static int PutWebPHeaders(const VP8Encoder* const enc, size_t size0, size_t vp8_size, size_t riff_size) { WebPPicture* const pic = enc->pic_; WebPEncodingError err = VP8_ENC_OK; // RIFF header. err = PutRIFFHeader(enc, riff_size); if (err != VP8_ENC_OK) goto Error; // VP8X. if (IsVP8XNeeded(enc)) { err = PutVP8XHeader(enc); if (err != VP8_ENC_OK) goto Error; } // Alpha. if (enc->has_alpha_) { err = PutAlphaChunk(enc); if (err != VP8_ENC_OK) goto Error; } // VP8 header. err = PutVP8Header(pic, vp8_size); if (err != VP8_ENC_OK) goto Error; // VP8 frame header. err = PutVP8FrameHeader(pic, enc->profile_, size0); if (err != VP8_ENC_OK) goto Error; // All OK. return 1; // Error. Error: return WebPEncodingSetError(pic, err); } // Segmentation header static void PutSegmentHeader(VP8BitWriter* const bw, const VP8Encoder* const enc) { const VP8EncSegmentHeader* const hdr = &enc->segment_hdr_; const VP8EncProba* const proba = &enc->proba_; if (VP8PutBitUniform(bw, (hdr->num_segments_ > 1))) { // We always 'update' the quant and filter strength values const int update_data = 1; int s; VP8PutBitUniform(bw, hdr->update_map_); if (VP8PutBitUniform(bw, update_data)) { // we always use absolute values, not relative ones VP8PutBitUniform(bw, 1); // (segment_feature_mode = 1. Paragraph 9.3.) for (s = 0; s < NUM_MB_SEGMENTS; ++s) { VP8PutSignedBits(bw, enc->dqm_[s].quant_, 7); } for (s = 0; s < NUM_MB_SEGMENTS; ++s) { VP8PutSignedBits(bw, enc->dqm_[s].fstrength_, 6); } } if (hdr->update_map_) { for (s = 0; s < 3; ++s) { if (VP8PutBitUniform(bw, (proba->segments_[s] != 255u))) { VP8PutBits(bw, proba->segments_[s], 8); } } } } } // Filtering parameters header static void PutFilterHeader(VP8BitWriter* const bw, const VP8EncFilterHeader* const hdr) { const int use_lf_delta = (hdr->i4x4_lf_delta_ != 0); VP8PutBitUniform(bw, hdr->simple_); VP8PutBits(bw, hdr->level_, 6); VP8PutBits(bw, hdr->sharpness_, 3); if (VP8PutBitUniform(bw, use_lf_delta)) { // '0' is the default value for i4x4_lf_delta_ at frame #0. const int need_update = (hdr->i4x4_lf_delta_ != 0); if (VP8PutBitUniform(bw, need_update)) { // we don't use ref_lf_delta => emit four 0 bits VP8PutBits(bw, 0, 4); // we use mode_lf_delta for i4x4 VP8PutSignedBits(bw, hdr->i4x4_lf_delta_, 6); VP8PutBits(bw, 0, 3); // all others unused } } } // Nominal quantization parameters static void PutQuant(VP8BitWriter* const bw, const VP8Encoder* const enc) { VP8PutBits(bw, enc->base_quant_, 7); VP8PutSignedBits(bw, enc->dq_y1_dc_, 4); VP8PutSignedBits(bw, enc->dq_y2_dc_, 4); VP8PutSignedBits(bw, enc->dq_y2_ac_, 4); VP8PutSignedBits(bw, enc->dq_uv_dc_, 4); VP8PutSignedBits(bw, enc->dq_uv_ac_, 4); } // Partition sizes static int EmitPartitionsSize(const VP8Encoder* const enc, WebPPicture* const pic) { uint8_t buf[3 * (MAX_NUM_PARTITIONS - 1)]; int p; for (p = 0; p < enc->num_parts_ - 1; ++p) { const size_t part_size = VP8BitWriterSize(enc->parts_ + p); if (part_size >= VP8_MAX_PARTITION_SIZE) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_PARTITION_OVERFLOW); } buf[3 * p + 0] = (part_size >> 0) & 0xff; buf[3 * p + 1] = (part_size >> 8) & 0xff; buf[3 * p + 2] = (part_size >> 16) & 0xff; } if (p && !pic->writer(buf, 3 * p, pic)) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE); } return 1; } //------------------------------------------------------------------------------ static int GeneratePartition0(VP8Encoder* const enc) { VP8BitWriter* const bw = &enc->bw_; const int mb_size = enc->mb_w_ * enc->mb_h_; uint64_t pos1, pos2, pos3; pos1 = VP8BitWriterPos(bw); if (!VP8BitWriterInit(bw, mb_size * 7 / 8)) { // ~7 bits per macroblock return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } VP8PutBitUniform(bw, 0); // colorspace VP8PutBitUniform(bw, 0); // clamp type PutSegmentHeader(bw, enc); PutFilterHeader(bw, &enc->filter_hdr_); VP8PutBits(bw, enc->num_parts_ == 8 ? 3 : enc->num_parts_ == 4 ? 2 : enc->num_parts_ == 2 ? 1 : 0, 2); PutQuant(bw, enc); VP8PutBitUniform(bw, 0); // no proba update VP8WriteProbas(bw, &enc->proba_); pos2 = VP8BitWriterPos(bw); VP8CodeIntraModes(enc); VP8BitWriterFinish(bw); pos3 = VP8BitWriterPos(bw); #if !defined(WEBP_DISABLE_STATS) if (enc->pic_->stats) { enc->pic_->stats->header_bytes[0] = (int)((pos2 - pos1 + 7) >> 3); enc->pic_->stats->header_bytes[1] = (int)((pos3 - pos2 + 7) >> 3); enc->pic_->stats->alpha_data_size = (int)enc->alpha_data_size_; } #else (void)pos1; (void)pos2; (void)pos3; #endif if (bw->error_) { return WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY); } return 1; } void VP8EncFreeBitWriters(VP8Encoder* const enc) { int p; VP8BitWriterWipeOut(&enc->bw_); for (p = 0; p < enc->num_parts_; ++p) { VP8BitWriterWipeOut(enc->parts_ + p); } } int VP8EncWrite(VP8Encoder* const enc) { WebPPicture* const pic = enc->pic_; VP8BitWriter* const bw = &enc->bw_; const int task_percent = 19; const int percent_per_part = task_percent / enc->num_parts_; const int final_percent = enc->percent_ + task_percent; int ok = 0; size_t vp8_size, pad, riff_size; int p; // Partition #0 with header and partition sizes ok = GeneratePartition0(enc); if (!ok) return 0; // Compute VP8 size vp8_size = VP8_FRAME_HEADER_SIZE + VP8BitWriterSize(bw) + 3 * (enc->num_parts_ - 1); for (p = 0; p < enc->num_parts_; ++p) { vp8_size += VP8BitWriterSize(enc->parts_ + p); } pad = vp8_size & 1; vp8_size += pad; // Compute RIFF size // At the minimum it is: "WEBPVP8 nnnn" + VP8 data size. riff_size = TAG_SIZE + CHUNK_HEADER_SIZE + vp8_size; if (IsVP8XNeeded(enc)) { // Add size for: VP8X header + data. riff_size += CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE; } if (enc->has_alpha_) { // Add size for: ALPH header + data. const uint32_t padded_alpha_size = enc->alpha_data_size_ + (enc->alpha_data_size_ & 1); riff_size += CHUNK_HEADER_SIZE + padded_alpha_size; } // RIFF size should fit in 32-bits. if (riff_size > 0xfffffffeU) { return WebPEncodingSetError(pic, VP8_ENC_ERROR_FILE_TOO_BIG); } // Emit headers and partition #0 { const uint8_t* const part0 = VP8BitWriterBuf(bw); const size_t size0 = VP8BitWriterSize(bw); ok = ok && PutWebPHeaders(enc, size0, vp8_size, riff_size) && pic->writer(part0, size0, pic) && EmitPartitionsSize(enc, pic); VP8BitWriterWipeOut(bw); // will free the internal buffer. } // Token partitions for (p = 0; p < enc->num_parts_; ++p) { const uint8_t* const buf = VP8BitWriterBuf(enc->parts_ + p); const size_t size = VP8BitWriterSize(enc->parts_ + p); if (size) ok = ok && pic->writer(buf, size, pic); VP8BitWriterWipeOut(enc->parts_ + p); // will free the internal buffer. ok = ok && WebPReportProgress(pic, enc->percent_ + percent_per_part, &enc->percent_); } // Padding byte if (ok && pad) { ok = PutPaddingByte(pic); } enc->coded_size_ = (int)(CHUNK_HEADER_SIZE + riff_size); ok = ok && WebPReportProgress(pic, final_percent, &enc->percent_); if (!ok) WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_WRITE); return ok; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/enc/tree_enc.c0000644000014400001440000005276614606317060013357 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Coding of token probabilities, intra modes and segments. // // Author: Skal (pascal.massimino@gmail.com) #include "src/enc/vp8i_enc.h" //------------------------------------------------------------------------------ // Default probabilities // Paragraph 13.5 const uint8_t VP8CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 }, { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 }, { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 } }, { { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 }, { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 }, { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128 }, }, { { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128 }, { 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128 }, { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128 }, }, { { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128 }, { 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128 }, { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128 } }, { { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128 }, { 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128 }, { 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128 } }, { { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128 }, { 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128 }, { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128 } }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } }, { { { 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62 }, { 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1 }, { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128 } }, { { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128 }, { 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128 }, { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128 } }, { { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128 }, { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128 }, { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128 } }, { { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128 }, { 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128 }, { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128 } }, { { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128 }, { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128 }, { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128 } }, { { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128 }, { 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128 }, { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128 } }, { { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128 }, { 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128 }, { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128 } }, { { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128 }, { 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128 }, { 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128 } } }, { { { 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128 }, { 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128 }, { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128 } }, { { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128 }, { 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128 }, { 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128 } }, { { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128 }, { 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128 }, { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128 } }, { { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128 }, { 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128 }, { 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128 } }, { { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128 }, { 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128 }, { 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128 }, { 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128 }, { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128 } }, { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } }, { { { 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255 }, { 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128 }, { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128 } }, { { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128 }, { 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128 }, { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128 } }, { { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128 }, { 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128 }, { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128 } }, { { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128 }, { 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128 }, { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128 } }, { { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128 }, { 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128 }, { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128 } }, { { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128 }, { 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128 }, { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128 } }, { { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128 }, { 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128 }, { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128 } }, { { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 }, { 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 } } } }; void VP8DefaultProbas(VP8Encoder* const enc) { VP8EncProba* const probas = &enc->proba_; probas->use_skip_proba_ = 0; memset(probas->segments_, 255u, sizeof(probas->segments_)); memcpy(probas->coeffs_, VP8CoeffsProba0, sizeof(VP8CoeffsProba0)); // Note: we could hard-code the level_costs_ corresponding to VP8CoeffsProba0, // but that's ~11k of static data. Better call VP8CalculateLevelCosts() later. probas->dirty_ = 1; } // Paragraph 11.5. 900bytes. static const uint8_t kBModesProba[NUM_BMODES][NUM_BMODES][NUM_BMODES - 1] = { { { 231, 120, 48, 89, 115, 113, 120, 152, 112 }, { 152, 179, 64, 126, 170, 118, 46, 70, 95 }, { 175, 69, 143, 80, 85, 82, 72, 155, 103 }, { 56, 58, 10, 171, 218, 189, 17, 13, 152 }, { 114, 26, 17, 163, 44, 195, 21, 10, 173 }, { 121, 24, 80, 195, 26, 62, 44, 64, 85 }, { 144, 71, 10, 38, 171, 213, 144, 34, 26 }, { 170, 46, 55, 19, 136, 160, 33, 206, 71 }, { 63, 20, 8, 114, 114, 208, 12, 9, 226 }, { 81, 40, 11, 96, 182, 84, 29, 16, 36 } }, { { 134, 183, 89, 137, 98, 101, 106, 165, 148 }, { 72, 187, 100, 130, 157, 111, 32, 75, 80 }, { 66, 102, 167, 99, 74, 62, 40, 234, 128 }, { 41, 53, 9, 178, 241, 141, 26, 8, 107 }, { 74, 43, 26, 146, 73, 166, 49, 23, 157 }, { 65, 38, 105, 160, 51, 52, 31, 115, 128 }, { 104, 79, 12, 27, 217, 255, 87, 17, 7 }, { 87, 68, 71, 44, 114, 51, 15, 186, 23 }, { 47, 41, 14, 110, 182, 183, 21, 17, 194 }, { 66, 45, 25, 102, 197, 189, 23, 18, 22 } }, { { 88, 88, 147, 150, 42, 46, 45, 196, 205 }, { 43, 97, 183, 117, 85, 38, 35, 179, 61 }, { 39, 53, 200, 87, 26, 21, 43, 232, 171 }, { 56, 34, 51, 104, 114, 102, 29, 93, 77 }, { 39, 28, 85, 171, 58, 165, 90, 98, 64 }, { 34, 22, 116, 206, 23, 34, 43, 166, 73 }, { 107, 54, 32, 26, 51, 1, 81, 43, 31 }, { 68, 25, 106, 22, 64, 171, 36, 225, 114 }, { 34, 19, 21, 102, 132, 188, 16, 76, 124 }, { 62, 18, 78, 95, 85, 57, 50, 48, 51 } }, { { 193, 101, 35, 159, 215, 111, 89, 46, 111 }, { 60, 148, 31, 172, 219, 228, 21, 18, 111 }, { 112, 113, 77, 85, 179, 255, 38, 120, 114 }, { 40, 42, 1, 196, 245, 209, 10, 25, 109 }, { 88, 43, 29, 140, 166, 213, 37, 43, 154 }, { 61, 63, 30, 155, 67, 45, 68, 1, 209 }, { 100, 80, 8, 43, 154, 1, 51, 26, 71 }, { 142, 78, 78, 16, 255, 128, 34, 197, 171 }, { 41, 40, 5, 102, 211, 183, 4, 1, 221 }, { 51, 50, 17, 168, 209, 192, 23, 25, 82 } }, { { 138, 31, 36, 171, 27, 166, 38, 44, 229 }, { 67, 87, 58, 169, 82, 115, 26, 59, 179 }, { 63, 59, 90, 180, 59, 166, 93, 73, 154 }, { 40, 40, 21, 116, 143, 209, 34, 39, 175 }, { 47, 15, 16, 183, 34, 223, 49, 45, 183 }, { 46, 17, 33, 183, 6, 98, 15, 32, 183 }, { 57, 46, 22, 24, 128, 1, 54, 17, 37 }, { 65, 32, 73, 115, 28, 128, 23, 128, 205 }, { 40, 3, 9, 115, 51, 192, 18, 6, 223 }, { 87, 37, 9, 115, 59, 77, 64, 21, 47 } }, { { 104, 55, 44, 218, 9, 54, 53, 130, 226 }, { 64, 90, 70, 205, 40, 41, 23, 26, 57 }, { 54, 57, 112, 184, 5, 41, 38, 166, 213 }, { 30, 34, 26, 133, 152, 116, 10, 32, 134 }, { 39, 19, 53, 221, 26, 114, 32, 73, 255 }, { 31, 9, 65, 234, 2, 15, 1, 118, 73 }, { 75, 32, 12, 51, 192, 255, 160, 43, 51 }, { 88, 31, 35, 67, 102, 85, 55, 186, 85 }, { 56, 21, 23, 111, 59, 205, 45, 37, 192 }, { 55, 38, 70, 124, 73, 102, 1, 34, 98 } }, { { 125, 98, 42, 88, 104, 85, 117, 175, 82 }, { 95, 84, 53, 89, 128, 100, 113, 101, 45 }, { 75, 79, 123, 47, 51, 128, 81, 171, 1 }, { 57, 17, 5, 71, 102, 57, 53, 41, 49 }, { 38, 33, 13, 121, 57, 73, 26, 1, 85 }, { 41, 10, 67, 138, 77, 110, 90, 47, 114 }, { 115, 21, 2, 10, 102, 255, 166, 23, 6 }, { 101, 29, 16, 10, 85, 128, 101, 196, 26 }, { 57, 18, 10, 102, 102, 213, 34, 20, 43 }, { 117, 20, 15, 36, 163, 128, 68, 1, 26 } }, { { 102, 61, 71, 37, 34, 53, 31, 243, 192 }, { 69, 60, 71, 38, 73, 119, 28, 222, 37 }, { 68, 45, 128, 34, 1, 47, 11, 245, 171 }, { 62, 17, 19, 70, 146, 85, 55, 62, 70 }, { 37, 43, 37, 154, 100, 163, 85, 160, 1 }, { 63, 9, 92, 136, 28, 64, 32, 201, 85 }, { 75, 15, 9, 9, 64, 255, 184, 119, 16 }, { 86, 6, 28, 5, 64, 255, 25, 248, 1 }, { 56, 8, 17, 132, 137, 255, 55, 116, 128 }, { 58, 15, 20, 82, 135, 57, 26, 121, 40 } }, { { 164, 50, 31, 137, 154, 133, 25, 35, 218 }, { 51, 103, 44, 131, 131, 123, 31, 6, 158 }, { 86, 40, 64, 135, 148, 224, 45, 183, 128 }, { 22, 26, 17, 131, 240, 154, 14, 1, 209 }, { 45, 16, 21, 91, 64, 222, 7, 1, 197 }, { 56, 21, 39, 155, 60, 138, 23, 102, 213 }, { 83, 12, 13, 54, 192, 255, 68, 47, 28 }, { 85, 26, 85, 85, 128, 128, 32, 146, 171 }, { 18, 11, 7, 63, 144, 171, 4, 4, 246 }, { 35, 27, 10, 146, 174, 171, 12, 26, 128 } }, { { 190, 80, 35, 99, 180, 80, 126, 54, 45 }, { 85, 126, 47, 87, 176, 51, 41, 20, 32 }, { 101, 75, 128, 139, 118, 146, 116, 128, 85 }, { 56, 41, 15, 176, 236, 85, 37, 9, 62 }, { 71, 30, 17, 119, 118, 255, 17, 18, 138 }, { 101, 38, 60, 138, 55, 70, 43, 26, 142 }, { 146, 36, 19, 30, 171, 255, 97, 27, 20 }, { 138, 45, 61, 62, 219, 1, 81, 188, 64 }, { 32, 41, 20, 117, 151, 142, 20, 21, 163 }, { 112, 19, 12, 61, 195, 128, 48, 4, 24 } } }; static int PutI4Mode(VP8BitWriter* const bw, int mode, const uint8_t* const prob) { if (VP8PutBit(bw, mode != B_DC_PRED, prob[0])) { if (VP8PutBit(bw, mode != B_TM_PRED, prob[1])) { if (VP8PutBit(bw, mode != B_VE_PRED, prob[2])) { if (!VP8PutBit(bw, mode >= B_LD_PRED, prob[3])) { if (VP8PutBit(bw, mode != B_HE_PRED, prob[4])) { VP8PutBit(bw, mode != B_RD_PRED, prob[5]); } } else { if (VP8PutBit(bw, mode != B_LD_PRED, prob[6])) { if (VP8PutBit(bw, mode != B_VL_PRED, prob[7])) { VP8PutBit(bw, mode != B_HD_PRED, prob[8]); } } } } } } return mode; } static void PutI16Mode(VP8BitWriter* const bw, int mode) { if (VP8PutBit(bw, (mode == TM_PRED || mode == H_PRED), 156)) { VP8PutBit(bw, mode == TM_PRED, 128); // TM or HE } else { VP8PutBit(bw, mode == V_PRED, 163); // VE or DC } } static void PutUVMode(VP8BitWriter* const bw, int uv_mode) { if (VP8PutBit(bw, uv_mode != DC_PRED, 142)) { if (VP8PutBit(bw, uv_mode != V_PRED, 114)) { VP8PutBit(bw, uv_mode != H_PRED, 183); // else: TM_PRED } } } static void PutSegment(VP8BitWriter* const bw, int s, const uint8_t* p) { if (VP8PutBit(bw, s >= 2, p[0])) p += 1; VP8PutBit(bw, s & 1, p[1]); } void VP8CodeIntraModes(VP8Encoder* const enc) { VP8BitWriter* const bw = &enc->bw_; VP8EncIterator it; VP8IteratorInit(enc, &it); do { const VP8MBInfo* const mb = it.mb_; const uint8_t* preds = it.preds_; if (enc->segment_hdr_.update_map_) { PutSegment(bw, mb->segment_, enc->proba_.segments_); } if (enc->proba_.use_skip_proba_) { VP8PutBit(bw, mb->skip_, enc->proba_.skip_proba_); } if (VP8PutBit(bw, (mb->type_ != 0), 145)) { // i16x16 PutI16Mode(bw, preds[0]); } else { const int preds_w = enc->preds_w_; const uint8_t* top_pred = preds - preds_w; int x, y; for (y = 0; y < 4; ++y) { int left = preds[-1]; for (x = 0; x < 4; ++x) { const uint8_t* const probas = kBModesProba[top_pred[x]][left]; left = PutI4Mode(bw, preds[x], probas); } top_pred = preds; preds += preds_w; } } PutUVMode(bw, mb->uv_mode_); } while (VP8IteratorNext(&it)); } //------------------------------------------------------------------------------ // Paragraph 13 const uint8_t VP8CoeffsUpdateProba[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { { { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255 }, { 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255 }, { 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255 } }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255 }, { 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255 }, { 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255 } }, { { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } }, { { { 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255 }, { 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255 } }, { { 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255 }, { 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255 }, { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } }, { { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }, { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 } } } }; void VP8WriteProbas(VP8BitWriter* const bw, const VP8EncProba* const probas) { int t, b, c, p; for (t = 0; t < NUM_TYPES; ++t) { for (b = 0; b < NUM_BANDS; ++b) { for (c = 0; c < NUM_CTX; ++c) { for (p = 0; p < NUM_PROBAS; ++p) { const uint8_t p0 = probas->coeffs_[t][b][c][p]; const int update = (p0 != VP8CoeffsProba0[t][b][c][p]); if (VP8PutBit(bw, update, VP8CoeffsUpdateProba[t][b][c][p])) { VP8PutBits(bw, p0, 8); } } } } } if (VP8PutBitUniform(bw, probas->use_skip_proba_)) { VP8PutBits(bw, probas->skip_proba_, 8); } } libwebp-1.4.0/src/enc/picture_psnr_enc.c0000644000014400001440000002056414606317060015124 0ustar // Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebPPicture tools for measuring distortion // // Author: Skal (pascal.massimino@gmail.com) #include "src/webp/encode.h" #if !(defined(WEBP_DISABLE_STATS) || defined(WEBP_REDUCE_SIZE)) #include #include #include "src/dsp/dsp.h" #include "src/enc/vp8i_enc.h" #include "src/utils/utils.h" typedef double (*AccumulateFunc)(const uint8_t* src, int src_stride, const uint8_t* ref, int ref_stride, int w, int h); //------------------------------------------------------------------------------ // local-min distortion // // For every pixel in the *reference* picture, we search for the local best // match in the compressed image. This is not a symmetrical measure. #define RADIUS 2 // search radius. Shouldn't be too large. static double AccumulateLSIM(const uint8_t* src, int src_stride, const uint8_t* ref, int ref_stride, int w, int h) { int x, y; double total_sse = 0.; for (y = 0; y < h; ++y) { const int y_0 = (y - RADIUS < 0) ? 0 : y - RADIUS; const int y_1 = (y + RADIUS + 1 >= h) ? h : y + RADIUS + 1; for (x = 0; x < w; ++x) { const int x_0 = (x - RADIUS < 0) ? 0 : x - RADIUS; const int x_1 = (x + RADIUS + 1 >= w) ? w : x + RADIUS + 1; double best_sse = 255. * 255.; const double value = (double)ref[y * ref_stride + x]; int i, j; for (j = y_0; j < y_1; ++j) { const uint8_t* const s = src + j * src_stride; for (i = x_0; i < x_1; ++i) { const double diff = s[i] - value; const double sse = diff * diff; if (sse < best_sse) best_sse = sse; } } total_sse += best_sse; } } return total_sse; } #undef RADIUS static double AccumulateSSE(const uint8_t* src, int src_stride, const uint8_t* ref, int ref_stride, int w, int h) { int y; double total_sse = 0.; for (y = 0; y < h; ++y) { total_sse += VP8AccumulateSSE(src, ref, w); src += src_stride; ref += ref_stride; } return total_sse; } //------------------------------------------------------------------------------ static double AccumulateSSIM(const uint8_t* src, int src_stride, const uint8_t* ref, int ref_stride, int w, int h) { const int w0 = (w < VP8_SSIM_KERNEL) ? w : VP8_SSIM_KERNEL; const int w1 = w - VP8_SSIM_KERNEL - 1; const int h0 = (h < VP8_SSIM_KERNEL) ? h : VP8_SSIM_KERNEL; const int h1 = h - VP8_SSIM_KERNEL - 1; int x, y; double sum = 0.; for (y = 0; y < h0; ++y) { for (x = 0; x < w; ++x) { sum += VP8SSIMGetClipped(src, src_stride, ref, ref_stride, x, y, w, h); } } for (; y < h1; ++y) { for (x = 0; x < w0; ++x) { sum += VP8SSIMGetClipped(src, src_stride, ref, ref_stride, x, y, w, h); } for (; x < w1; ++x) { const int off1 = x - VP8_SSIM_KERNEL + (y - VP8_SSIM_KERNEL) * src_stride; const int off2 = x - VP8_SSIM_KERNEL + (y - VP8_SSIM_KERNEL) * ref_stride; sum += VP8SSIMGet(src + off1, src_stride, ref + off2, ref_stride); } for (; x < w; ++x) { sum += VP8SSIMGetClipped(src, src_stride, ref, ref_stride, x, y, w, h); } } for (; y < h; ++y) { for (x = 0; x < w; ++x) { sum += VP8SSIMGetClipped(src, src_stride, ref, ref_stride, x, y, w, h); } } return sum; } //------------------------------------------------------------------------------ // Distortion // Max value returned in case of exact similarity. static const double kMinDistortion_dB = 99.; static double GetPSNR(double v, double size) { return (v > 0. && size > 0.) ? -4.3429448 * log(v / (size * 255 * 255.)) : kMinDistortion_dB; } static double GetLogSSIM(double v, double size) { v = (size > 0.) ? v / size : 1.; return (v < 1.) ? -10.0 * log10(1. - v) : kMinDistortion_dB; } int WebPPlaneDistortion(const uint8_t* src, size_t src_stride, const uint8_t* ref, size_t ref_stride, int width, int height, size_t x_step, int type, float* distortion, float* result) { uint8_t* allocated = NULL; const AccumulateFunc metric = (type == 0) ? AccumulateSSE : (type == 1) ? AccumulateSSIM : AccumulateLSIM; if (src == NULL || ref == NULL || src_stride < x_step * width || ref_stride < x_step * width || result == NULL || distortion == NULL) { return 0; } VP8SSIMDspInit(); if (x_step != 1) { // extract a packed plane if needed int x, y; uint8_t* tmp1; uint8_t* tmp2; allocated = (uint8_t*)WebPSafeMalloc(2ULL * width * height, sizeof(*allocated)); if (allocated == NULL) return 0; tmp1 = allocated; tmp2 = tmp1 + (size_t)width * height; for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { tmp1[x + y * width] = src[x * x_step + y * src_stride]; tmp2[x + y * width] = ref[x * x_step + y * ref_stride]; } } src = tmp1; ref = tmp2; } *distortion = (float)metric(src, width, ref, width, width, height); WebPSafeFree(allocated); *result = (type == 1) ? (float)GetLogSSIM(*distortion, (double)width * height) : (float)GetPSNR(*distortion, (double)width * height); return 1; } #ifdef WORDS_BIGENDIAN #define BLUE_OFFSET 3 // uint32_t 0x000000ff is 0x00,00,00,ff in memory #else #define BLUE_OFFSET 0 // uint32_t 0x000000ff is 0xff,00,00,00 in memory #endif int WebPPictureDistortion(const WebPPicture* src, const WebPPicture* ref, int type, float results[5]) { int w, h, c; int ok = 0; WebPPicture p0, p1; double total_size = 0., total_distortion = 0.; if (src == NULL || ref == NULL || src->width != ref->width || src->height != ref->height || results == NULL) { return 0; } VP8SSIMDspInit(); if (!WebPPictureInit(&p0) || !WebPPictureInit(&p1)) return 0; w = src->width; h = src->height; if (!WebPPictureView(src, 0, 0, w, h, &p0)) goto Error; if (!WebPPictureView(ref, 0, 0, w, h, &p1)) goto Error; // We always measure distortion in ARGB space. if (p0.use_argb == 0 && !WebPPictureYUVAToARGB(&p0)) goto Error; if (p1.use_argb == 0 && !WebPPictureYUVAToARGB(&p1)) goto Error; for (c = 0; c < 4; ++c) { float distortion; const size_t stride0 = 4 * (size_t)p0.argb_stride; const size_t stride1 = 4 * (size_t)p1.argb_stride; // results are reported as BGRA const int offset = c ^ BLUE_OFFSET; if (!WebPPlaneDistortion((const uint8_t*)p0.argb + offset, stride0, (const uint8_t*)p1.argb + offset, stride1, w, h, 4, type, &distortion, results + c)) { goto Error; } total_distortion += distortion; total_size += w * h; } results[4] = (type == 1) ? (float)GetLogSSIM(total_distortion, total_size) : (float)GetPSNR(total_distortion, total_size); ok = 1; Error: WebPPictureFree(&p0); WebPPictureFree(&p1); return ok; } #undef BLUE_OFFSET #else // defined(WEBP_DISABLE_STATS) int WebPPlaneDistortion(const uint8_t* src, size_t src_stride, const uint8_t* ref, size_t ref_stride, int width, int height, size_t x_step, int type, float* distortion, float* result) { (void)src; (void)src_stride; (void)ref; (void)ref_stride; (void)width; (void)height; (void)x_step; (void)type; if (distortion == NULL || result == NULL) return 0; *distortion = 0.f; *result = 0.f; return 1; } int WebPPictureDistortion(const WebPPicture* src, const WebPPicture* ref, int type, float results[5]) { int i; (void)src; (void)ref; (void)type; if (results == NULL) return 0; for (i = 0; i < 5; ++i) results[i] = 0.f; return 1; } #endif // !defined(WEBP_DISABLE_STATS) libwebp-1.4.0/src/enc/config_enc.c0000644000014400001440000001321614606317060013650 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Coding tools configuration // // Author: Skal (pascal.massimino@gmail.com) #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include "src/webp/encode.h" //------------------------------------------------------------------------------ // WebPConfig //------------------------------------------------------------------------------ int WebPConfigInitInternal(WebPConfig* config, WebPPreset preset, float quality, int version) { if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_ENCODER_ABI_VERSION)) { return 0; // caller/system version mismatch! } if (config == NULL) return 0; config->quality = quality; config->target_size = 0; config->target_PSNR = 0.; config->method = 4; config->sns_strength = 50; config->filter_strength = 60; // mid-filtering config->filter_sharpness = 0; config->filter_type = 1; // default: strong (so U/V is filtered too) config->partitions = 0; config->segments = 4; config->pass = 1; config->qmin = 0; config->qmax = 100; config->show_compressed = 0; config->preprocessing = 0; config->autofilter = 0; config->partition_limit = 0; config->alpha_compression = 1; config->alpha_filtering = 1; config->alpha_quality = 100; config->lossless = 0; config->exact = 0; config->image_hint = WEBP_HINT_DEFAULT; config->emulate_jpeg_size = 0; config->thread_level = 0; config->low_memory = 0; config->near_lossless = 100; config->use_delta_palette = 0; config->use_sharp_yuv = 0; // TODO(skal): tune. switch (preset) { case WEBP_PRESET_PICTURE: config->sns_strength = 80; config->filter_sharpness = 4; config->filter_strength = 35; config->preprocessing &= ~2; // no dithering break; case WEBP_PRESET_PHOTO: config->sns_strength = 80; config->filter_sharpness = 3; config->filter_strength = 30; config->preprocessing |= 2; break; case WEBP_PRESET_DRAWING: config->sns_strength = 25; config->filter_sharpness = 6; config->filter_strength = 10; break; case WEBP_PRESET_ICON: config->sns_strength = 0; config->filter_strength = 0; // disable filtering to retain sharpness config->preprocessing &= ~2; // no dithering break; case WEBP_PRESET_TEXT: config->sns_strength = 0; config->filter_strength = 0; // disable filtering to retain sharpness config->preprocessing &= ~2; // no dithering config->segments = 2; break; case WEBP_PRESET_DEFAULT: default: break; } return WebPValidateConfig(config); } int WebPValidateConfig(const WebPConfig* config) { if (config == NULL) return 0; if (config->quality < 0 || config->quality > 100) return 0; if (config->target_size < 0) return 0; if (config->target_PSNR < 0) return 0; if (config->method < 0 || config->method > 6) return 0; if (config->segments < 1 || config->segments > 4) return 0; if (config->sns_strength < 0 || config->sns_strength > 100) return 0; if (config->filter_strength < 0 || config->filter_strength > 100) return 0; if (config->filter_sharpness < 0 || config->filter_sharpness > 7) return 0; if (config->filter_type < 0 || config->filter_type > 1) return 0; if (config->autofilter < 0 || config->autofilter > 1) return 0; if (config->pass < 1 || config->pass > 10) return 0; if (config->qmin < 0 || config->qmax > 100 || config->qmin > config->qmax) { return 0; } if (config->show_compressed < 0 || config->show_compressed > 1) return 0; if (config->preprocessing < 0 || config->preprocessing > 7) return 0; if (config->partitions < 0 || config->partitions > 3) return 0; if (config->partition_limit < 0 || config->partition_limit > 100) return 0; if (config->alpha_compression < 0) return 0; if (config->alpha_filtering < 0) return 0; if (config->alpha_quality < 0 || config->alpha_quality > 100) return 0; if (config->lossless < 0 || config->lossless > 1) return 0; if (config->near_lossless < 0 || config->near_lossless > 100) return 0; if (config->image_hint >= WEBP_HINT_LAST) return 0; if (config->emulate_jpeg_size < 0 || config->emulate_jpeg_size > 1) return 0; if (config->thread_level < 0 || config->thread_level > 1) return 0; if (config->low_memory < 0 || config->low_memory > 1) return 0; if (config->exact < 0 || config->exact > 1) return 0; if (config->use_delta_palette < 0 || config->use_delta_palette > 1) { return 0; } if (config->use_sharp_yuv < 0 || config->use_sharp_yuv > 1) return 0; return 1; } //------------------------------------------------------------------------------ #define MAX_LEVEL 9 // Mapping between -z level and -m / -q parameter settings. static const struct { uint8_t method_; uint8_t quality_; } kLosslessPresets[MAX_LEVEL + 1] = { { 0, 0 }, { 1, 20 }, { 2, 25 }, { 3, 30 }, { 3, 50 }, { 4, 50 }, { 4, 75 }, { 4, 90 }, { 5, 90 }, { 6, 100 } }; int WebPConfigLosslessPreset(WebPConfig* config, int level) { if (config == NULL || level < 0 || level > MAX_LEVEL) return 0; config->lossless = 1; config->method = kLosslessPresets[level].method_; config->quality = kLosslessPresets[level].quality_; return 1; } //------------------------------------------------------------------------------ libwebp-1.4.0/src/demux/0000755000014400001440000000000014606317244011770 5ustar libwebp-1.4.0/src/demux/libwebpdemux.pc.in0000644000014400001440000000046314606317060015407 0ustar prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libwebpdemux Description: Library for parsing the WebP graphics format container Version: @PACKAGE_VERSION@ Requires.private: libwebp >= 0.2.0 Cflags: -I${includedir} Libs: -L${libdir} -l@webp_libname_prefix@webpdemux libwebp-1.4.0/src/demux/anim_decode.c0000644000014400001440000004214714606317060014367 0ustar // Copyright 2015 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // AnimDecoder implementation. // #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include #include #include "src/utils/utils.h" #include "src/webp/decode.h" #include "src/webp/demux.h" #include "src/webp/types.h" #define NUM_CHANNELS 4 // Channel extraction from a uint32_t representation of a uint8_t RGBA/BGRA // buffer. #ifdef WORDS_BIGENDIAN #define CHANNEL_SHIFT(i) (24 - (i) * 8) #else #define CHANNEL_SHIFT(i) ((i) * 8) #endif typedef void (*BlendRowFunc)(uint32_t* const, const uint32_t* const, int); static void BlendPixelRowNonPremult(uint32_t* const src, const uint32_t* const dst, int num_pixels); static void BlendPixelRowPremult(uint32_t* const src, const uint32_t* const dst, int num_pixels); struct WebPAnimDecoder { WebPDemuxer* demux_; // Demuxer created from given WebP bitstream. WebPDecoderConfig config_; // Decoder config. // Note: we use a pointer to a function blending multiple pixels at a time to // allow possible inlining of per-pixel blending function. BlendRowFunc blend_func_; // Pointer to the chose blend row function. WebPAnimInfo info_; // Global info about the animation. uint8_t* curr_frame_; // Current canvas (not disposed). uint8_t* prev_frame_disposed_; // Previous canvas (properly disposed). int prev_frame_timestamp_; // Previous frame timestamp (milliseconds). WebPIterator prev_iter_; // Iterator object for previous frame. int prev_frame_was_keyframe_; // True if previous frame was a keyframe. int next_frame_; // Index of the next frame to be decoded // (starting from 1). }; static void DefaultDecoderOptions(WebPAnimDecoderOptions* const dec_options) { dec_options->color_mode = MODE_RGBA; dec_options->use_threads = 0; } int WebPAnimDecoderOptionsInitInternal(WebPAnimDecoderOptions* dec_options, int abi_version) { if (dec_options == NULL || WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_DEMUX_ABI_VERSION)) { return 0; } DefaultDecoderOptions(dec_options); return 1; } WEBP_NODISCARD static int ApplyDecoderOptions( const WebPAnimDecoderOptions* const dec_options, WebPAnimDecoder* const dec) { WEBP_CSP_MODE mode; WebPDecoderConfig* config = &dec->config_; assert(dec_options != NULL); mode = dec_options->color_mode; if (mode != MODE_RGBA && mode != MODE_BGRA && mode != MODE_rgbA && mode != MODE_bgrA) { return 0; } dec->blend_func_ = (mode == MODE_RGBA || mode == MODE_BGRA) ? &BlendPixelRowNonPremult : &BlendPixelRowPremult; if (!WebPInitDecoderConfig(config)) { return 0; } config->output.colorspace = mode; config->output.is_external_memory = 1; config->options.use_threads = dec_options->use_threads; // Note: config->output.u.RGBA is set at the time of decoding each frame. return 1; } WebPAnimDecoder* WebPAnimDecoderNewInternal( const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options, int abi_version) { WebPAnimDecoderOptions options; WebPAnimDecoder* dec = NULL; WebPBitstreamFeatures features; if (webp_data == NULL || WEBP_ABI_IS_INCOMPATIBLE(abi_version, WEBP_DEMUX_ABI_VERSION)) { return NULL; } // Validate the bitstream before doing expensive allocations. The demuxer may // be more tolerant than the decoder. if (WebPGetFeatures(webp_data->bytes, webp_data->size, &features) != VP8_STATUS_OK) { return NULL; } // Note: calloc() so that the pointer members are initialized to NULL. dec = (WebPAnimDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec)); if (dec == NULL) goto Error; if (dec_options != NULL) { options = *dec_options; } else { DefaultDecoderOptions(&options); } if (!ApplyDecoderOptions(&options, dec)) goto Error; dec->demux_ = WebPDemux(webp_data); if (dec->demux_ == NULL) goto Error; dec->info_.canvas_width = WebPDemuxGetI(dec->demux_, WEBP_FF_CANVAS_WIDTH); dec->info_.canvas_height = WebPDemuxGetI(dec->demux_, WEBP_FF_CANVAS_HEIGHT); dec->info_.loop_count = WebPDemuxGetI(dec->demux_, WEBP_FF_LOOP_COUNT); dec->info_.bgcolor = WebPDemuxGetI(dec->demux_, WEBP_FF_BACKGROUND_COLOR); dec->info_.frame_count = WebPDemuxGetI(dec->demux_, WEBP_FF_FRAME_COUNT); // Note: calloc() because we fill frame with zeroes as well. dec->curr_frame_ = (uint8_t*)WebPSafeCalloc( dec->info_.canvas_width * NUM_CHANNELS, dec->info_.canvas_height); if (dec->curr_frame_ == NULL) goto Error; dec->prev_frame_disposed_ = (uint8_t*)WebPSafeCalloc( dec->info_.canvas_width * NUM_CHANNELS, dec->info_.canvas_height); if (dec->prev_frame_disposed_ == NULL) goto Error; WebPAnimDecoderReset(dec); return dec; Error: WebPAnimDecoderDelete(dec); return NULL; } int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec, WebPAnimInfo* info) { if (dec == NULL || info == NULL) return 0; *info = dec->info_; return 1; } // Returns true if the frame covers the full canvas. static int IsFullFrame(int width, int height, int canvas_width, int canvas_height) { return (width == canvas_width && height == canvas_height); } // Clear the canvas to transparent. WEBP_NODISCARD static int ZeroFillCanvas(uint8_t* buf, uint32_t canvas_width, uint32_t canvas_height) { const uint64_t size = (uint64_t)canvas_width * canvas_height * NUM_CHANNELS * sizeof(*buf); if (!CheckSizeOverflow(size)) return 0; memset(buf, 0, (size_t)size); return 1; } // Clear given frame rectangle to transparent. static void ZeroFillFrameRect(uint8_t* buf, int buf_stride, int x_offset, int y_offset, int width, int height) { int j; assert(width * NUM_CHANNELS <= buf_stride); buf += y_offset * buf_stride + x_offset * NUM_CHANNELS; for (j = 0; j < height; ++j) { memset(buf, 0, width * NUM_CHANNELS); buf += buf_stride; } } // Copy width * height pixels from 'src' to 'dst'. WEBP_NODISCARD static int CopyCanvas(const uint8_t* src, uint8_t* dst, uint32_t width, uint32_t height) { const uint64_t size = (uint64_t)width * height * NUM_CHANNELS; if (!CheckSizeOverflow(size)) return 0; assert(src != NULL && dst != NULL); memcpy(dst, src, (size_t)size); return 1; } // Returns true if the current frame is a key-frame. static int IsKeyFrame(const WebPIterator* const curr, const WebPIterator* const prev, int prev_frame_was_key_frame, int canvas_width, int canvas_height) { if (curr->frame_num == 1) { return 1; } else if ((!curr->has_alpha || curr->blend_method == WEBP_MUX_NO_BLEND) && IsFullFrame(curr->width, curr->height, canvas_width, canvas_height)) { return 1; } else { return (prev->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) && (IsFullFrame(prev->width, prev->height, canvas_width, canvas_height) || prev_frame_was_key_frame); } } // Blend a single channel of 'src' over 'dst', given their alpha channel values. // 'src' and 'dst' are assumed to be NOT pre-multiplied by alpha. static uint8_t BlendChannelNonPremult(uint32_t src, uint8_t src_a, uint32_t dst, uint8_t dst_a, uint32_t scale, int shift) { const uint8_t src_channel = (src >> shift) & 0xff; const uint8_t dst_channel = (dst >> shift) & 0xff; const uint32_t blend_unscaled = src_channel * src_a + dst_channel * dst_a; assert(blend_unscaled < (1ULL << 32) / scale); return (blend_unscaled * scale) >> CHANNEL_SHIFT(3); } // Blend 'src' over 'dst' assuming they are NOT pre-multiplied by alpha. static uint32_t BlendPixelNonPremult(uint32_t src, uint32_t dst) { const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff; if (src_a == 0) { return dst; } else { const uint8_t dst_a = (dst >> CHANNEL_SHIFT(3)) & 0xff; // This is the approximate integer arithmetic for the actual formula: // dst_factor_a = (dst_a * (255 - src_a)) / 255. const uint8_t dst_factor_a = (dst_a * (256 - src_a)) >> 8; const uint8_t blend_a = src_a + dst_factor_a; const uint32_t scale = (1UL << 24) / blend_a; const uint8_t blend_r = BlendChannelNonPremult( src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(0)); const uint8_t blend_g = BlendChannelNonPremult( src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(1)); const uint8_t blend_b = BlendChannelNonPremult( src, src_a, dst, dst_factor_a, scale, CHANNEL_SHIFT(2)); assert(src_a + dst_factor_a < 256); return ((uint32_t)blend_r << CHANNEL_SHIFT(0)) | ((uint32_t)blend_g << CHANNEL_SHIFT(1)) | ((uint32_t)blend_b << CHANNEL_SHIFT(2)) | ((uint32_t)blend_a << CHANNEL_SHIFT(3)); } } // Blend 'num_pixels' in 'src' over 'dst' assuming they are NOT pre-multiplied // by alpha. static void BlendPixelRowNonPremult(uint32_t* const src, const uint32_t* const dst, int num_pixels) { int i; for (i = 0; i < num_pixels; ++i) { const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff; if (src_alpha != 0xff) { src[i] = BlendPixelNonPremult(src[i], dst[i]); } } } // Individually multiply each channel in 'pix' by 'scale'. static WEBP_INLINE uint32_t ChannelwiseMultiply(uint32_t pix, uint32_t scale) { uint32_t mask = 0x00FF00FF; uint32_t rb = ((pix & mask) * scale) >> 8; uint32_t ag = ((pix >> 8) & mask) * scale; return (rb & mask) | (ag & ~mask); } // Blend 'src' over 'dst' assuming they are pre-multiplied by alpha. static uint32_t BlendPixelPremult(uint32_t src, uint32_t dst) { const uint8_t src_a = (src >> CHANNEL_SHIFT(3)) & 0xff; return src + ChannelwiseMultiply(dst, 256 - src_a); } // Blend 'num_pixels' in 'src' over 'dst' assuming they are pre-multiplied by // alpha. static void BlendPixelRowPremult(uint32_t* const src, const uint32_t* const dst, int num_pixels) { int i; for (i = 0; i < num_pixels; ++i) { const uint8_t src_alpha = (src[i] >> CHANNEL_SHIFT(3)) & 0xff; if (src_alpha != 0xff) { src[i] = BlendPixelPremult(src[i], dst[i]); } } } // Returns two ranges ( pairs) at row 'canvas_y', that belong to // 'src' but not 'dst'. A point range is empty if the corresponding width is 0. static void FindBlendRangeAtRow(const WebPIterator* const src, const WebPIterator* const dst, int canvas_y, int* const left1, int* const width1, int* const left2, int* const width2) { const int src_max_x = src->x_offset + src->width; const int dst_max_x = dst->x_offset + dst->width; const int dst_max_y = dst->y_offset + dst->height; assert(canvas_y >= src->y_offset && canvas_y < (src->y_offset + src->height)); *left1 = -1; *width1 = 0; *left2 = -1; *width2 = 0; if (canvas_y < dst->y_offset || canvas_y >= dst_max_y || src->x_offset >= dst_max_x || src_max_x <= dst->x_offset) { *left1 = src->x_offset; *width1 = src->width; return; } if (src->x_offset < dst->x_offset) { *left1 = src->x_offset; *width1 = dst->x_offset - src->x_offset; } if (src_max_x > dst_max_x) { *left2 = dst_max_x; *width2 = src_max_x - dst_max_x; } } int WebPAnimDecoderGetNext(WebPAnimDecoder* dec, uint8_t** buf_ptr, int* timestamp_ptr) { WebPIterator iter; uint32_t width; uint32_t height; int is_key_frame; int timestamp; BlendRowFunc blend_row; if (dec == NULL || buf_ptr == NULL || timestamp_ptr == NULL) return 0; if (!WebPAnimDecoderHasMoreFrames(dec)) return 0; width = dec->info_.canvas_width; height = dec->info_.canvas_height; blend_row = dec->blend_func_; // Get compressed frame. if (!WebPDemuxGetFrame(dec->demux_, dec->next_frame_, &iter)) { return 0; } timestamp = dec->prev_frame_timestamp_ + iter.duration; // Initialize. is_key_frame = IsKeyFrame(&iter, &dec->prev_iter_, dec->prev_frame_was_keyframe_, width, height); if (is_key_frame) { if (!ZeroFillCanvas(dec->curr_frame_, width, height)) { goto Error; } } else { if (!CopyCanvas(dec->prev_frame_disposed_, dec->curr_frame_, width, height)) { goto Error; } } // Decode. { const uint8_t* in = iter.fragment.bytes; const size_t in_size = iter.fragment.size; const uint32_t stride = width * NUM_CHANNELS; // at most 25 + 2 bits const uint64_t out_offset = (uint64_t)iter.y_offset * stride + (uint64_t)iter.x_offset * NUM_CHANNELS; // 53b const uint64_t size = (uint64_t)iter.height * stride; // at most 25 + 27b WebPDecoderConfig* const config = &dec->config_; WebPRGBABuffer* const buf = &config->output.u.RGBA; if ((size_t)size != size) goto Error; buf->stride = (int)stride; buf->size = (size_t)size; buf->rgba = dec->curr_frame_ + out_offset; if (WebPDecode(in, in_size, config) != VP8_STATUS_OK) { goto Error; } } // During the decoding of current frame, we may have set some pixels to be // transparent (i.e. alpha < 255). However, the value of each of these // pixels should have been determined by blending it against the value of // that pixel in the previous frame if blending method of is WEBP_MUX_BLEND. if (iter.frame_num > 1 && iter.blend_method == WEBP_MUX_BLEND && !is_key_frame) { if (dec->prev_iter_.dispose_method == WEBP_MUX_DISPOSE_NONE) { int y; // Blend transparent pixels with pixels in previous canvas. for (y = 0; y < iter.height; ++y) { const size_t offset = (iter.y_offset + y) * width + iter.x_offset; blend_row((uint32_t*)dec->curr_frame_ + offset, (uint32_t*)dec->prev_frame_disposed_ + offset, iter.width); } } else { int y; assert(dec->prev_iter_.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND); // We need to blend a transparent pixel with its value just after // initialization. That is, blend it with: // * Fully transparent pixel if it belongs to prevRect <-- No-op. // * The pixel in the previous canvas otherwise <-- Need alpha-blending. for (y = 0; y < iter.height; ++y) { const int canvas_y = iter.y_offset + y; int left1, width1, left2, width2; FindBlendRangeAtRow(&iter, &dec->prev_iter_, canvas_y, &left1, &width1, &left2, &width2); if (width1 > 0) { const size_t offset1 = canvas_y * width + left1; blend_row((uint32_t*)dec->curr_frame_ + offset1, (uint32_t*)dec->prev_frame_disposed_ + offset1, width1); } if (width2 > 0) { const size_t offset2 = canvas_y * width + left2; blend_row((uint32_t*)dec->curr_frame_ + offset2, (uint32_t*)dec->prev_frame_disposed_ + offset2, width2); } } } } // Update info of the previous frame and dispose it for the next iteration. dec->prev_frame_timestamp_ = timestamp; WebPDemuxReleaseIterator(&dec->prev_iter_); dec->prev_iter_ = iter; dec->prev_frame_was_keyframe_ = is_key_frame; if (!CopyCanvas(dec->curr_frame_, dec->prev_frame_disposed_, width, height)) { goto Error; } if (dec->prev_iter_.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) { ZeroFillFrameRect(dec->prev_frame_disposed_, width * NUM_CHANNELS, dec->prev_iter_.x_offset, dec->prev_iter_.y_offset, dec->prev_iter_.width, dec->prev_iter_.height); } ++dec->next_frame_; // All OK, fill in the values. *buf_ptr = dec->curr_frame_; *timestamp_ptr = timestamp; return 1; Error: WebPDemuxReleaseIterator(&iter); return 0; } int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec) { if (dec == NULL) return 0; return (dec->next_frame_ <= (int)dec->info_.frame_count); } void WebPAnimDecoderReset(WebPAnimDecoder* dec) { if (dec != NULL) { dec->prev_frame_timestamp_ = 0; WebPDemuxReleaseIterator(&dec->prev_iter_); memset(&dec->prev_iter_, 0, sizeof(dec->prev_iter_)); dec->prev_frame_was_keyframe_ = 0; dec->next_frame_ = 1; } } const WebPDemuxer* WebPAnimDecoderGetDemuxer(const WebPAnimDecoder* dec) { if (dec == NULL) return NULL; return dec->demux_; } void WebPAnimDecoderDelete(WebPAnimDecoder* dec) { if (dec != NULL) { WebPDemuxReleaseIterator(&dec->prev_iter_); WebPDemuxDelete(dec->demux_); WebPSafeFree(dec->curr_frame_); WebPSafeFree(dec->prev_frame_disposed_); WebPSafeFree(dec); } } libwebp-1.4.0/src/demux/libwebpdemux.rc0000644000014400001440000000201514606317060014777 0ustar #define APSTUDIO_READONLY_SYMBOLS #include "winres.h" #undef APSTUDIO_READONLY_SYMBOLS #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,4,0 PRODUCTVERSION 1,0,4,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Google, Inc." VALUE "FileDescription", "libwebpdemux DLL" VALUE "FileVersion", "1.4.0" VALUE "InternalName", "libwebpdemux.dll" VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "libwebpdemux.dll" VALUE "ProductName", "WebP Image Demuxer" VALUE "ProductVersion", "1.4.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources libwebp-1.4.0/src/demux/Makefile.am0000644000014400001440000000115714606317060014024 0ustar AM_CPPFLAGS += -I$(top_builddir) -I$(top_srcdir) lib_LTLIBRARIES = libwebpdemux.la libwebpdemux_la_SOURCES = libwebpdemux_la_SOURCES += anim_decode.c demux.c libwebpdemuxinclude_HEADERS = libwebpdemuxinclude_HEADERS += ../webp/decode.h libwebpdemuxinclude_HEADERS += ../webp/demux.h libwebpdemuxinclude_HEADERS += ../webp/mux_types.h libwebpdemuxinclude_HEADERS += ../webp/types.h noinst_HEADERS = noinst_HEADERS += ../webp/format_constants.h libwebpdemux_la_LIBADD = ../libwebp.la libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:15:0 libwebpdemuxincludedir = $(includedir)/webp pkgconfig_DATA = libwebpdemux.pc libwebp-1.4.0/src/demux/demux.c0000644000014400001440000007660314606317060013266 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP container demux. // #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif #include #include #include #include "src/utils/utils.h" #include "src/webp/decode.h" // WebPGetFeatures #include "src/webp/demux.h" #include "src/webp/format_constants.h" #define DMUX_MAJ_VERSION 1 #define DMUX_MIN_VERSION 4 #define DMUX_REV_VERSION 0 typedef struct { size_t start_; // start location of the data size_t end_; // end location size_t riff_end_; // riff chunk end location, can be > end_. size_t buf_size_; // size of the buffer const uint8_t* buf_; } MemBuffer; typedef struct { size_t offset_; size_t size_; } ChunkData; typedef struct Frame { int x_offset_, y_offset_; int width_, height_; int has_alpha_; int duration_; WebPMuxAnimDispose dispose_method_; WebPMuxAnimBlend blend_method_; int frame_num_; int complete_; // img_components_ contains a full image. ChunkData img_components_[2]; // 0=VP8{,L} 1=ALPH struct Frame* next_; } Frame; typedef struct Chunk { ChunkData data_; struct Chunk* next_; } Chunk; struct WebPDemuxer { MemBuffer mem_; WebPDemuxState state_; int is_ext_format_; uint32_t feature_flags_; int canvas_width_, canvas_height_; int loop_count_; uint32_t bgcolor_; int num_frames_; Frame* frames_; Frame** frames_tail_; Chunk* chunks_; // non-image chunks Chunk** chunks_tail_; }; typedef enum { PARSE_OK, PARSE_NEED_MORE_DATA, PARSE_ERROR } ParseStatus; typedef struct ChunkParser { uint8_t id[4]; ParseStatus (*parse)(WebPDemuxer* const dmux); int (*valid)(const WebPDemuxer* const dmux); } ChunkParser; static ParseStatus ParseSingleImage(WebPDemuxer* const dmux); static ParseStatus ParseVP8X(WebPDemuxer* const dmux); static int IsValidSimpleFormat(const WebPDemuxer* const dmux); static int IsValidExtendedFormat(const WebPDemuxer* const dmux); static const ChunkParser kMasterChunks[] = { { { 'V', 'P', '8', ' ' }, ParseSingleImage, IsValidSimpleFormat }, { { 'V', 'P', '8', 'L' }, ParseSingleImage, IsValidSimpleFormat }, { { 'V', 'P', '8', 'X' }, ParseVP8X, IsValidExtendedFormat }, { { '0', '0', '0', '0' }, NULL, NULL }, }; //------------------------------------------------------------------------------ int WebPGetDemuxVersion(void) { return (DMUX_MAJ_VERSION << 16) | (DMUX_MIN_VERSION << 8) | DMUX_REV_VERSION; } // ----------------------------------------------------------------------------- // MemBuffer static int RemapMemBuffer(MemBuffer* const mem, const uint8_t* data, size_t size) { if (size < mem->buf_size_) return 0; // can't remap to a shorter buffer! mem->buf_ = data; mem->end_ = mem->buf_size_ = size; return 1; } static int InitMemBuffer(MemBuffer* const mem, const uint8_t* data, size_t size) { memset(mem, 0, sizeof(*mem)); return RemapMemBuffer(mem, data, size); } // Return the remaining data size available in 'mem'. static WEBP_INLINE size_t MemDataSize(const MemBuffer* const mem) { return (mem->end_ - mem->start_); } // Return true if 'size' exceeds the end of the RIFF chunk. static WEBP_INLINE int SizeIsInvalid(const MemBuffer* const mem, size_t size) { return (size > mem->riff_end_ - mem->start_); } static WEBP_INLINE void Skip(MemBuffer* const mem, size_t size) { mem->start_ += size; } static WEBP_INLINE void Rewind(MemBuffer* const mem, size_t size) { mem->start_ -= size; } static WEBP_INLINE const uint8_t* GetBuffer(MemBuffer* const mem) { return mem->buf_ + mem->start_; } // Read from 'mem' and skip the read bytes. static WEBP_INLINE uint8_t ReadByte(MemBuffer* const mem) { const uint8_t byte = mem->buf_[mem->start_]; Skip(mem, 1); return byte; } static WEBP_INLINE int ReadLE16s(MemBuffer* const mem) { const uint8_t* const data = mem->buf_ + mem->start_; const int val = GetLE16(data); Skip(mem, 2); return val; } static WEBP_INLINE int ReadLE24s(MemBuffer* const mem) { const uint8_t* const data = mem->buf_ + mem->start_; const int val = GetLE24(data); Skip(mem, 3); return val; } static WEBP_INLINE uint32_t ReadLE32(MemBuffer* const mem) { const uint8_t* const data = mem->buf_ + mem->start_; const uint32_t val = GetLE32(data); Skip(mem, 4); return val; } // ----------------------------------------------------------------------------- // Secondary chunk parsing static void AddChunk(WebPDemuxer* const dmux, Chunk* const chunk) { *dmux->chunks_tail_ = chunk; chunk->next_ = NULL; dmux->chunks_tail_ = &chunk->next_; } // Add a frame to the end of the list, ensuring the last frame is complete. // Returns true on success, false otherwise. static int AddFrame(WebPDemuxer* const dmux, Frame* const frame) { const Frame* const last_frame = *dmux->frames_tail_; if (last_frame != NULL && !last_frame->complete_) return 0; *dmux->frames_tail_ = frame; frame->next_ = NULL; dmux->frames_tail_ = &frame->next_; return 1; } static void SetFrameInfo(size_t start_offset, size_t size, int frame_num, int complete, const WebPBitstreamFeatures* const features, Frame* const frame) { frame->img_components_[0].offset_ = start_offset; frame->img_components_[0].size_ = size; frame->width_ = features->width; frame->height_ = features->height; frame->has_alpha_ |= features->has_alpha; frame->frame_num_ = frame_num; frame->complete_ = complete; } // Store image bearing chunks to 'frame'. 'min_size' is an optional size // requirement, it may be zero. static ParseStatus StoreFrame(int frame_num, uint32_t min_size, MemBuffer* const mem, Frame* const frame) { int alpha_chunks = 0; int image_chunks = 0; int done = (MemDataSize(mem) < CHUNK_HEADER_SIZE || MemDataSize(mem) < min_size); ParseStatus status = PARSE_OK; if (done) return PARSE_NEED_MORE_DATA; do { const size_t chunk_start_offset = mem->start_; const uint32_t fourcc = ReadLE32(mem); const uint32_t payload_size = ReadLE32(mem); uint32_t payload_size_padded; size_t payload_available; size_t chunk_size; if (payload_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR; payload_size_padded = payload_size + (payload_size & 1); payload_available = (payload_size_padded > MemDataSize(mem)) ? MemDataSize(mem) : payload_size_padded; chunk_size = CHUNK_HEADER_SIZE + payload_available; if (SizeIsInvalid(mem, payload_size_padded)) return PARSE_ERROR; if (payload_size_padded > MemDataSize(mem)) status = PARSE_NEED_MORE_DATA; switch (fourcc) { case MKFOURCC('A', 'L', 'P', 'H'): if (alpha_chunks == 0) { ++alpha_chunks; frame->img_components_[1].offset_ = chunk_start_offset; frame->img_components_[1].size_ = chunk_size; frame->has_alpha_ = 1; frame->frame_num_ = frame_num; Skip(mem, payload_available); } else { goto Done; } break; case MKFOURCC('V', 'P', '8', 'L'): if (alpha_chunks > 0) return PARSE_ERROR; // VP8L has its own alpha // fall through case MKFOURCC('V', 'P', '8', ' '): if (image_chunks == 0) { // Extract the bitstream features, tolerating failures when the data // is incomplete. WebPBitstreamFeatures features; const VP8StatusCode vp8_status = WebPGetFeatures(mem->buf_ + chunk_start_offset, chunk_size, &features); if (status == PARSE_NEED_MORE_DATA && vp8_status == VP8_STATUS_NOT_ENOUGH_DATA) { return PARSE_NEED_MORE_DATA; } else if (vp8_status != VP8_STATUS_OK) { // We have enough data, and yet WebPGetFeatures() failed. return PARSE_ERROR; } ++image_chunks; SetFrameInfo(chunk_start_offset, chunk_size, frame_num, status == PARSE_OK, &features, frame); Skip(mem, payload_available); } else { goto Done; } break; Done: default: // Restore fourcc/size when moving up one level in parsing. Rewind(mem, CHUNK_HEADER_SIZE); done = 1; break; } if (mem->start_ == mem->riff_end_) { done = 1; } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) { status = PARSE_NEED_MORE_DATA; } } while (!done && status == PARSE_OK); return status; } // Creates a new Frame if 'actual_size' is within bounds and 'mem' contains // enough data ('min_size') to parse the payload. // Returns PARSE_OK on success with *frame pointing to the new Frame. // Returns PARSE_NEED_MORE_DATA with insufficient data, PARSE_ERROR otherwise. static ParseStatus NewFrame(const MemBuffer* const mem, uint32_t min_size, uint32_t actual_size, Frame** frame) { if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; if (actual_size < min_size) return PARSE_ERROR; if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; *frame = (Frame*)WebPSafeCalloc(1ULL, sizeof(**frame)); return (*frame == NULL) ? PARSE_ERROR : PARSE_OK; } // Parse a 'ANMF' chunk and any image bearing chunks that immediately follow. // 'frame_chunk_size' is the previously validated, padded chunk size. static ParseStatus ParseAnimationFrame( WebPDemuxer* const dmux, uint32_t frame_chunk_size) { const int is_animation = !!(dmux->feature_flags_ & ANIMATION_FLAG); const uint32_t anmf_payload_size = frame_chunk_size - ANMF_CHUNK_SIZE; int added_frame = 0; int bits; MemBuffer* const mem = &dmux->mem_; Frame* frame; size_t start_offset; ParseStatus status = NewFrame(mem, ANMF_CHUNK_SIZE, frame_chunk_size, &frame); if (status != PARSE_OK) return status; frame->x_offset_ = 2 * ReadLE24s(mem); frame->y_offset_ = 2 * ReadLE24s(mem); frame->width_ = 1 + ReadLE24s(mem); frame->height_ = 1 + ReadLE24s(mem); frame->duration_ = ReadLE24s(mem); bits = ReadByte(mem); frame->dispose_method_ = (bits & 1) ? WEBP_MUX_DISPOSE_BACKGROUND : WEBP_MUX_DISPOSE_NONE; frame->blend_method_ = (bits & 2) ? WEBP_MUX_NO_BLEND : WEBP_MUX_BLEND; if (frame->width_ * (uint64_t)frame->height_ >= MAX_IMAGE_AREA) { WebPSafeFree(frame); return PARSE_ERROR; } // Store a frame only if the animation flag is set there is some data for // this frame is available. start_offset = mem->start_; status = StoreFrame(dmux->num_frames_ + 1, anmf_payload_size, mem, frame); if (status != PARSE_ERROR && mem->start_ - start_offset > anmf_payload_size) { status = PARSE_ERROR; } if (status != PARSE_ERROR && is_animation && frame->frame_num_ > 0) { added_frame = AddFrame(dmux, frame); if (added_frame) { ++dmux->num_frames_; } else { status = PARSE_ERROR; } } if (!added_frame) WebPSafeFree(frame); return status; } // General chunk storage, starting with the header at 'start_offset', allowing // the user to request the payload via a fourcc string. 'size' includes the // header and the unpadded payload size. // Returns true on success, false otherwise. static int StoreChunk(WebPDemuxer* const dmux, size_t start_offset, uint32_t size) { Chunk* const chunk = (Chunk*)WebPSafeCalloc(1ULL, sizeof(*chunk)); if (chunk == NULL) return 0; chunk->data_.offset_ = start_offset; chunk->data_.size_ = size; AddChunk(dmux, chunk); return 1; } // ----------------------------------------------------------------------------- // Primary chunk parsing static ParseStatus ReadHeader(MemBuffer* const mem) { const size_t min_size = RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE; uint32_t riff_size; // Basic file level validation. if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) || memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) { return PARSE_ERROR; } riff_size = GetLE32(GetBuffer(mem) + TAG_SIZE); if (riff_size < CHUNK_HEADER_SIZE) return PARSE_ERROR; if (riff_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR; // There's no point in reading past the end of the RIFF chunk mem->riff_end_ = riff_size + CHUNK_HEADER_SIZE; if (mem->buf_size_ > mem->riff_end_) { mem->buf_size_ = mem->end_ = mem->riff_end_; } Skip(mem, RIFF_HEADER_SIZE); return PARSE_OK; } static ParseStatus ParseSingleImage(WebPDemuxer* const dmux) { const size_t min_size = CHUNK_HEADER_SIZE; MemBuffer* const mem = &dmux->mem_; Frame* frame; ParseStatus status; int image_added = 0; if (dmux->frames_ != NULL) return PARSE_ERROR; if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; frame = (Frame*)WebPSafeCalloc(1ULL, sizeof(*frame)); if (frame == NULL) return PARSE_ERROR; // For the single image case we allow parsing of a partial frame, so no // minimum size is imposed here. status = StoreFrame(1, 0, &dmux->mem_, frame); if (status != PARSE_ERROR) { const int has_alpha = !!(dmux->feature_flags_ & ALPHA_FLAG); // Clear any alpha when the alpha flag is missing. if (!has_alpha && frame->img_components_[1].size_ > 0) { frame->img_components_[1].offset_ = 0; frame->img_components_[1].size_ = 0; frame->has_alpha_ = 0; } // Use the frame width/height as the canvas values for non-vp8x files. // Also, set ALPHA_FLAG if this is a lossless image with alpha. if (!dmux->is_ext_format_ && frame->width_ > 0 && frame->height_ > 0) { dmux->state_ = WEBP_DEMUX_PARSED_HEADER; dmux->canvas_width_ = frame->width_; dmux->canvas_height_ = frame->height_; dmux->feature_flags_ |= frame->has_alpha_ ? ALPHA_FLAG : 0; } if (!AddFrame(dmux, frame)) { status = PARSE_ERROR; // last frame was left incomplete } else { image_added = 1; dmux->num_frames_ = 1; } } if (!image_added) WebPSafeFree(frame); return status; } static ParseStatus ParseVP8XChunks(WebPDemuxer* const dmux) { const int is_animation = !!(dmux->feature_flags_ & ANIMATION_FLAG); MemBuffer* const mem = &dmux->mem_; int anim_chunks = 0; ParseStatus status = PARSE_OK; do { int store_chunk = 1; const size_t chunk_start_offset = mem->start_; const uint32_t fourcc = ReadLE32(mem); const uint32_t chunk_size = ReadLE32(mem); uint32_t chunk_size_padded; if (chunk_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR; chunk_size_padded = chunk_size + (chunk_size & 1); if (SizeIsInvalid(mem, chunk_size_padded)) return PARSE_ERROR; switch (fourcc) { case MKFOURCC('V', 'P', '8', 'X'): { return PARSE_ERROR; } case MKFOURCC('A', 'L', 'P', 'H'): case MKFOURCC('V', 'P', '8', ' '): case MKFOURCC('V', 'P', '8', 'L'): { // check that this isn't an animation (all frames should be in an ANMF). if (anim_chunks > 0 || is_animation) return PARSE_ERROR; Rewind(mem, CHUNK_HEADER_SIZE); status = ParseSingleImage(dmux); break; } case MKFOURCC('A', 'N', 'I', 'M'): { if (chunk_size_padded < ANIM_CHUNK_SIZE) return PARSE_ERROR; if (MemDataSize(mem) < chunk_size_padded) { status = PARSE_NEED_MORE_DATA; } else if (anim_chunks == 0) { ++anim_chunks; dmux->bgcolor_ = ReadLE32(mem); dmux->loop_count_ = ReadLE16s(mem); Skip(mem, chunk_size_padded - ANIM_CHUNK_SIZE); } else { store_chunk = 0; goto Skip; } break; } case MKFOURCC('A', 'N', 'M', 'F'): { if (anim_chunks == 0) return PARSE_ERROR; // 'ANIM' precedes frames. status = ParseAnimationFrame(dmux, chunk_size_padded); break; } case MKFOURCC('I', 'C', 'C', 'P'): { store_chunk = !!(dmux->feature_flags_ & ICCP_FLAG); goto Skip; } case MKFOURCC('E', 'X', 'I', 'F'): { store_chunk = !!(dmux->feature_flags_ & EXIF_FLAG); goto Skip; } case MKFOURCC('X', 'M', 'P', ' '): { store_chunk = !!(dmux->feature_flags_ & XMP_FLAG); goto Skip; } Skip: default: { if (chunk_size_padded <= MemDataSize(mem)) { if (store_chunk) { // Store only the chunk header and unpadded size as only the payload // will be returned to the user. if (!StoreChunk(dmux, chunk_start_offset, CHUNK_HEADER_SIZE + chunk_size)) { return PARSE_ERROR; } } Skip(mem, chunk_size_padded); } else { status = PARSE_NEED_MORE_DATA; } } } if (mem->start_ == mem->riff_end_) { break; } else if (MemDataSize(mem) < CHUNK_HEADER_SIZE) { status = PARSE_NEED_MORE_DATA; } } while (status == PARSE_OK); return status; } static ParseStatus ParseVP8X(WebPDemuxer* const dmux) { MemBuffer* const mem = &dmux->mem_; uint32_t vp8x_size; if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA; dmux->is_ext_format_ = 1; Skip(mem, TAG_SIZE); // VP8X vp8x_size = ReadLE32(mem); if (vp8x_size > MAX_CHUNK_PAYLOAD) return PARSE_ERROR; if (vp8x_size < VP8X_CHUNK_SIZE) return PARSE_ERROR; vp8x_size += vp8x_size & 1; if (SizeIsInvalid(mem, vp8x_size)) return PARSE_ERROR; if (MemDataSize(mem) < vp8x_size) return PARSE_NEED_MORE_DATA; dmux->feature_flags_ = ReadByte(mem); Skip(mem, 3); // Reserved. dmux->canvas_width_ = 1 + ReadLE24s(mem); dmux->canvas_height_ = 1 + ReadLE24s(mem); if (dmux->canvas_width_ * (uint64_t)dmux->canvas_height_ >= MAX_IMAGE_AREA) { return PARSE_ERROR; // image final dimension is too large } Skip(mem, vp8x_size - VP8X_CHUNK_SIZE); // skip any trailing data. dmux->state_ = WEBP_DEMUX_PARSED_HEADER; if (SizeIsInvalid(mem, CHUNK_HEADER_SIZE)) return PARSE_ERROR; if (MemDataSize(mem) < CHUNK_HEADER_SIZE) return PARSE_NEED_MORE_DATA; return ParseVP8XChunks(dmux); } // ----------------------------------------------------------------------------- // Format validation static int IsValidSimpleFormat(const WebPDemuxer* const dmux) { const Frame* const frame = dmux->frames_; if (dmux->state_ == WEBP_DEMUX_PARSING_HEADER) return 1; if (dmux->canvas_width_ <= 0 || dmux->canvas_height_ <= 0) return 0; if (dmux->state_ == WEBP_DEMUX_DONE && frame == NULL) return 0; if (frame->width_ <= 0 || frame->height_ <= 0) return 0; return 1; } // If 'exact' is true, check that the image resolution matches the canvas. // If 'exact' is false, check that the x/y offsets do not exceed the canvas. static int CheckFrameBounds(const Frame* const frame, int exact, int canvas_width, int canvas_height) { if (exact) { if (frame->x_offset_ != 0 || frame->y_offset_ != 0) { return 0; } if (frame->width_ != canvas_width || frame->height_ != canvas_height) { return 0; } } else { if (frame->x_offset_ < 0 || frame->y_offset_ < 0) return 0; if (frame->width_ + frame->x_offset_ > canvas_width) return 0; if (frame->height_ + frame->y_offset_ > canvas_height) return 0; } return 1; } static int IsValidExtendedFormat(const WebPDemuxer* const dmux) { const int is_animation = !!(dmux->feature_flags_ & ANIMATION_FLAG); const Frame* f = dmux->frames_; if (dmux->state_ == WEBP_DEMUX_PARSING_HEADER) return 1; if (dmux->canvas_width_ <= 0 || dmux->canvas_height_ <= 0) return 0; if (dmux->loop_count_ < 0) return 0; if (dmux->state_ == WEBP_DEMUX_DONE && dmux->frames_ == NULL) return 0; if (dmux->feature_flags_ & ~ALL_VALID_FLAGS) return 0; // invalid bitstream while (f != NULL) { const int cur_frame_set = f->frame_num_; // Check frame properties. for (; f != NULL && f->frame_num_ == cur_frame_set; f = f->next_) { const ChunkData* const image = f->img_components_; const ChunkData* const alpha = f->img_components_ + 1; if (!is_animation && f->frame_num_ > 1) return 0; if (f->complete_) { if (alpha->size_ == 0 && image->size_ == 0) return 0; // Ensure alpha precedes image bitstream. if (alpha->size_ > 0 && alpha->offset_ > image->offset_) { return 0; } if (f->width_ <= 0 || f->height_ <= 0) return 0; } else { // There shouldn't be a partial frame in a complete file. if (dmux->state_ == WEBP_DEMUX_DONE) return 0; // Ensure alpha precedes image bitstream. if (alpha->size_ > 0 && image->size_ > 0 && alpha->offset_ > image->offset_) { return 0; } // There shouldn't be any frames after an incomplete one. if (f->next_ != NULL) return 0; } if (f->width_ > 0 && f->height_ > 0 && !CheckFrameBounds(f, !is_animation, dmux->canvas_width_, dmux->canvas_height_)) { return 0; } } } return 1; } // ----------------------------------------------------------------------------- // WebPDemuxer object static void InitDemux(WebPDemuxer* const dmux, const MemBuffer* const mem) { dmux->state_ = WEBP_DEMUX_PARSING_HEADER; dmux->loop_count_ = 1; dmux->bgcolor_ = 0xFFFFFFFF; // White background by default. dmux->canvas_width_ = -1; dmux->canvas_height_ = -1; dmux->frames_tail_ = &dmux->frames_; dmux->chunks_tail_ = &dmux->chunks_; dmux->mem_ = *mem; } static ParseStatus CreateRawImageDemuxer(MemBuffer* const mem, WebPDemuxer** demuxer) { WebPBitstreamFeatures features; const VP8StatusCode status = WebPGetFeatures(mem->buf_, mem->buf_size_, &features); *demuxer = NULL; if (status != VP8_STATUS_OK) { return (status == VP8_STATUS_NOT_ENOUGH_DATA) ? PARSE_NEED_MORE_DATA : PARSE_ERROR; } { WebPDemuxer* const dmux = (WebPDemuxer*)WebPSafeCalloc(1ULL, sizeof(*dmux)); Frame* const frame = (Frame*)WebPSafeCalloc(1ULL, sizeof(*frame)); if (dmux == NULL || frame == NULL) goto Error; InitDemux(dmux, mem); SetFrameInfo(0, mem->buf_size_, 1 /*frame_num*/, 1 /*complete*/, &features, frame); if (!AddFrame(dmux, frame)) goto Error; dmux->state_ = WEBP_DEMUX_DONE; dmux->canvas_width_ = frame->width_; dmux->canvas_height_ = frame->height_; dmux->feature_flags_ |= frame->has_alpha_ ? ALPHA_FLAG : 0; dmux->num_frames_ = 1; assert(IsValidSimpleFormat(dmux)); *demuxer = dmux; return PARSE_OK; Error: WebPSafeFree(dmux); WebPSafeFree(frame); return PARSE_ERROR; } } WebPDemuxer* WebPDemuxInternal(const WebPData* data, int allow_partial, WebPDemuxState* state, int version) { const ChunkParser* parser; int partial; ParseStatus status = PARSE_ERROR; MemBuffer mem; WebPDemuxer* dmux; if (state != NULL) *state = WEBP_DEMUX_PARSE_ERROR; if (WEBP_ABI_IS_INCOMPATIBLE(version, WEBP_DEMUX_ABI_VERSION)) return NULL; if (data == NULL || data->bytes == NULL || data->size == 0) return NULL; if (!InitMemBuffer(&mem, data->bytes, data->size)) return NULL; status = ReadHeader(&mem); if (status != PARSE_OK) { // If parsing of the webp file header fails attempt to handle a raw // VP8/VP8L frame. Note 'allow_partial' is ignored in this case. if (status == PARSE_ERROR) { status = CreateRawImageDemuxer(&mem, &dmux); if (status == PARSE_OK) { if (state != NULL) *state = WEBP_DEMUX_DONE; return dmux; } } if (state != NULL) { *state = (status == PARSE_NEED_MORE_DATA) ? WEBP_DEMUX_PARSING_HEADER : WEBP_DEMUX_PARSE_ERROR; } return NULL; } partial = (mem.buf_size_ < mem.riff_end_); if (!allow_partial && partial) return NULL; dmux = (WebPDemuxer*)WebPSafeCalloc(1ULL, sizeof(*dmux)); if (dmux == NULL) return NULL; InitDemux(dmux, &mem); status = PARSE_ERROR; for (parser = kMasterChunks; parser->parse != NULL; ++parser) { if (!memcmp(parser->id, GetBuffer(&dmux->mem_), TAG_SIZE)) { status = parser->parse(dmux); if (status == PARSE_OK) dmux->state_ = WEBP_DEMUX_DONE; if (status == PARSE_NEED_MORE_DATA && !partial) status = PARSE_ERROR; if (status != PARSE_ERROR && !parser->valid(dmux)) status = PARSE_ERROR; if (status == PARSE_ERROR) dmux->state_ = WEBP_DEMUX_PARSE_ERROR; break; } } if (state != NULL) *state = dmux->state_; if (status == PARSE_ERROR) { WebPDemuxDelete(dmux); return NULL; } return dmux; } void WebPDemuxDelete(WebPDemuxer* dmux) { Chunk* c; Frame* f; if (dmux == NULL) return; for (f = dmux->frames_; f != NULL;) { Frame* const cur_frame = f; f = f->next_; WebPSafeFree(cur_frame); } for (c = dmux->chunks_; c != NULL;) { Chunk* const cur_chunk = c; c = c->next_; WebPSafeFree(cur_chunk); } WebPSafeFree(dmux); } // ----------------------------------------------------------------------------- uint32_t WebPDemuxGetI(const WebPDemuxer* dmux, WebPFormatFeature feature) { if (dmux == NULL) return 0; switch (feature) { case WEBP_FF_FORMAT_FLAGS: return dmux->feature_flags_; case WEBP_FF_CANVAS_WIDTH: return (uint32_t)dmux->canvas_width_; case WEBP_FF_CANVAS_HEIGHT: return (uint32_t)dmux->canvas_height_; case WEBP_FF_LOOP_COUNT: return (uint32_t)dmux->loop_count_; case WEBP_FF_BACKGROUND_COLOR: return dmux->bgcolor_; case WEBP_FF_FRAME_COUNT: return (uint32_t)dmux->num_frames_; } return 0; } // ----------------------------------------------------------------------------- // Frame iteration static const Frame* GetFrame(const WebPDemuxer* const dmux, int frame_num) { const Frame* f; for (f = dmux->frames_; f != NULL; f = f->next_) { if (frame_num == f->frame_num_) break; } return f; } static const uint8_t* GetFramePayload(const uint8_t* const mem_buf, const Frame* const frame, size_t* const data_size) { *data_size = 0; if (frame != NULL) { const ChunkData* const image = frame->img_components_; const ChunkData* const alpha = frame->img_components_ + 1; size_t start_offset = image->offset_; *data_size = image->size_; // if alpha exists it precedes image, update the size allowing for // intervening chunks. if (alpha->size_ > 0) { const size_t inter_size = (image->offset_ > 0) ? image->offset_ - (alpha->offset_ + alpha->size_) : 0; start_offset = alpha->offset_; *data_size += alpha->size_ + inter_size; } return mem_buf + start_offset; } return NULL; } // Create a whole 'frame' from VP8 (+ alpha) or lossless. static int SynthesizeFrame(const WebPDemuxer* const dmux, const Frame* const frame, WebPIterator* const iter) { const uint8_t* const mem_buf = dmux->mem_.buf_; size_t payload_size = 0; const uint8_t* const payload = GetFramePayload(mem_buf, frame, &payload_size); if (payload == NULL) return 0; assert(frame != NULL); iter->frame_num = frame->frame_num_; iter->num_frames = dmux->num_frames_; iter->x_offset = frame->x_offset_; iter->y_offset = frame->y_offset_; iter->width = frame->width_; iter->height = frame->height_; iter->has_alpha = frame->has_alpha_; iter->duration = frame->duration_; iter->dispose_method = frame->dispose_method_; iter->blend_method = frame->blend_method_; iter->complete = frame->complete_; iter->fragment.bytes = payload; iter->fragment.size = payload_size; return 1; } static int SetFrame(int frame_num, WebPIterator* const iter) { const Frame* frame; const WebPDemuxer* const dmux = (WebPDemuxer*)iter->private_; if (dmux == NULL || frame_num < 0) return 0; if (frame_num > dmux->num_frames_) return 0; if (frame_num == 0) frame_num = dmux->num_frames_; frame = GetFrame(dmux, frame_num); if (frame == NULL) return 0; return SynthesizeFrame(dmux, frame, iter); } int WebPDemuxGetFrame(const WebPDemuxer* dmux, int frame, WebPIterator* iter) { if (iter == NULL) return 0; memset(iter, 0, sizeof(*iter)); iter->private_ = (void*)dmux; return SetFrame(frame, iter); } int WebPDemuxNextFrame(WebPIterator* iter) { if (iter == NULL) return 0; return SetFrame(iter->frame_num + 1, iter); } int WebPDemuxPrevFrame(WebPIterator* iter) { if (iter == NULL) return 0; if (iter->frame_num <= 1) return 0; return SetFrame(iter->frame_num - 1, iter); } void WebPDemuxReleaseIterator(WebPIterator* iter) { (void)iter; } // ----------------------------------------------------------------------------- // Chunk iteration static int ChunkCount(const WebPDemuxer* const dmux, const char fourcc[4]) { const uint8_t* const mem_buf = dmux->mem_.buf_; const Chunk* c; int count = 0; for (c = dmux->chunks_; c != NULL; c = c->next_) { const uint8_t* const header = mem_buf + c->data_.offset_; if (!memcmp(header, fourcc, TAG_SIZE)) ++count; } return count; } static const Chunk* GetChunk(const WebPDemuxer* const dmux, const char fourcc[4], int chunk_num) { const uint8_t* const mem_buf = dmux->mem_.buf_; const Chunk* c; int count = 0; for (c = dmux->chunks_; c != NULL; c = c->next_) { const uint8_t* const header = mem_buf + c->data_.offset_; if (!memcmp(header, fourcc, TAG_SIZE)) ++count; if (count == chunk_num) break; } return c; } static int SetChunk(const char fourcc[4], int chunk_num, WebPChunkIterator* const iter) { const WebPDemuxer* const dmux = (WebPDemuxer*)iter->private_; int count; if (dmux == NULL || fourcc == NULL || chunk_num < 0) return 0; count = ChunkCount(dmux, fourcc); if (count == 0) return 0; if (chunk_num == 0) chunk_num = count; if (chunk_num <= count) { const uint8_t* const mem_buf = dmux->mem_.buf_; const Chunk* const chunk = GetChunk(dmux, fourcc, chunk_num); iter->chunk.bytes = mem_buf + chunk->data_.offset_ + CHUNK_HEADER_SIZE; iter->chunk.size = chunk->data_.size_ - CHUNK_HEADER_SIZE; iter->num_chunks = count; iter->chunk_num = chunk_num; return 1; } return 0; } int WebPDemuxGetChunk(const WebPDemuxer* dmux, const char fourcc[4], int chunk_num, WebPChunkIterator* iter) { if (iter == NULL) return 0; memset(iter, 0, sizeof(*iter)); iter->private_ = (void*)dmux; return SetChunk(fourcc, chunk_num, iter); } int WebPDemuxNextChunk(WebPChunkIterator* iter) { if (iter != NULL) { const char* const fourcc = (const char*)iter->chunk.bytes - CHUNK_HEADER_SIZE; return SetChunk(fourcc, iter->chunk_num + 1, iter); } return 0; } int WebPDemuxPrevChunk(WebPChunkIterator* iter) { if (iter != NULL && iter->chunk_num > 1) { const char* const fourcc = (const char*)iter->chunk.bytes - CHUNK_HEADER_SIZE; return SetChunk(fourcc, iter->chunk_num - 1, iter); } return 0; } void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter) { (void)iter; } libwebp-1.4.0/src/demux/Makefile.in0000644000014400001440000005772114606317244014051 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/demux ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(libwebpdemuxinclude_HEADERS) \ $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = libwebpdemux.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(libwebpdemuxincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libwebpdemux_la_DEPENDENCIES = ../libwebp.la am_libwebpdemux_la_OBJECTS = anim_decode.lo demux.lo libwebpdemux_la_OBJECTS = $(am_libwebpdemux_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebpdemux_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libwebpdemux_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/anim_decode.Plo \ ./$(DEPDIR)/demux.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebpdemux_la_SOURCES) DIST_SOURCES = $(libwebpdemux_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(libwebpdemuxinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libwebpdemux.pc.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_builddir) -I$(top_srcdir) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ lib_LTLIBRARIES = libwebpdemux.la libwebpdemux_la_SOURCES = anim_decode.c demux.c libwebpdemuxinclude_HEADERS = ../webp/decode.h ../webp/demux.h \ ../webp/mux_types.h ../webp/types.h noinst_HEADERS = ../webp/format_constants.h libwebpdemux_la_LIBADD = ../libwebp.la libwebpdemux_la_LDFLAGS = -no-undefined -version-info 2:15:0 libwebpdemuxincludedir = $(includedir)/webp pkgconfig_DATA = libwebpdemux.pc all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/demux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/demux/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libwebpdemux.pc: $(top_builddir)/config.status $(srcdir)/libwebpdemux.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebpdemux.la: $(libwebpdemux_la_OBJECTS) $(libwebpdemux_la_DEPENDENCIES) $(EXTRA_libwebpdemux_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdemux_la_LINK) -rpath $(libdir) $(libwebpdemux_la_OBJECTS) $(libwebpdemux_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anim_decode.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demux.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-libwebpdemuxincludeHEADERS: $(libwebpdemuxinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libwebpdemuxinclude_HEADERS)'; test -n "$(libwebpdemuxincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libwebpdemuxincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libwebpdemuxincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libwebpdemuxincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libwebpdemuxincludedir)" || exit $$?; \ done uninstall-libwebpdemuxincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libwebpdemuxinclude_HEADERS)'; test -n "$(libwebpdemuxincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libwebpdemuxincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(libwebpdemuxincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/anim_decode.Plo -rm -f ./$(DEPDIR)/demux.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libwebpdemuxincludeHEADERS \ install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/anim_decode.Plo -rm -f ./$(DEPDIR)/demux.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-libwebpdemuxincludeHEADERS uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES \ install-libwebpdemuxincludeHEADERS install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-libLTLIBRARIES uninstall-libwebpdemuxincludeHEADERS \ uninstall-pkgconfigDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/Makefile.in0000644000014400001440000007203714606317244012724 0ustar # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_MUX_TRUE@am__append_1 = mux @BUILD_DEMUX_TRUE@am__append_2 = demux @BUILD_LIBWEBPDECODER_TRUE@am__append_3 = libwebpdecoder.la @BUILD_LIBWEBPDECODER_TRUE@am__append_4 = libwebpdecoder.pc subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(common_HEADERS) \ $(libwebpinclude_HEADERS) $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/webp/config.h CONFIG_CLEAN_FILES = libwebp.pc libwebpdecoder.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(commondir)" "$(DESTDIR)$(libwebpincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libwebp_la_DEPENDENCIES = dec/libwebpdecode.la dsp/libwebpdsp.la \ enc/libwebpencode.la utils/libwebputils.la am_libwebp_la_OBJECTS = libwebp_la_OBJECTS = $(am_libwebp_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libwebp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libwebp_la_LDFLAGS) $(LDFLAGS) -o $@ @BUILD_LIBWEBPDECODER_TRUE@libwebpdecoder_la_DEPENDENCIES = \ @BUILD_LIBWEBPDECODER_TRUE@ dec/libwebpdecode.la \ @BUILD_LIBWEBPDECODER_TRUE@ dsp/libwebpdspdecode.la \ @BUILD_LIBWEBPDECODER_TRUE@ utils/libwebputilsdecode.la am_libwebpdecoder_la_OBJECTS = libwebpdecoder_la_OBJECTS = $(am_libwebpdecoder_la_OBJECTS) libwebpdecoder_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libwebpdecoder_la_LDFLAGS) $(LDFLAGS) \ -o $@ @BUILD_LIBWEBPDECODER_TRUE@am_libwebpdecoder_la_rpath = -rpath \ @BUILD_LIBWEBPDECODER_TRUE@ $(libdir) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/webp COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwebp_la_SOURCES) $(libwebpdecoder_la_SOURCES) DIST_SOURCES = $(libwebp_la_SOURCES) $(libwebpdecoder_la_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) HEADERS = $(common_HEADERS) $(libwebpinclude_HEADERS) \ $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = dec enc dsp utils . mux demux am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libwebp.pc.in \ $(srcdir)/libwebpdecoder.pc.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GIF_INCLUDES = @GIF_INCLUDES@ GIF_LIBS = @GIF_LIBS@ GL_INCLUDES = @GL_INCLUDES@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JPEG_INCLUDES = @JPEG_INCLUDES@ JPEG_LIBS = @JPEG_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBPNG_CONFIG = @LIBPNG_CONFIG@ LIBS = @LIBS@ LIBSDL_CONFIG = @LIBSDL_CONFIG@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEON_FLAGS = @NEON_FLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PNG_INCLUDES = @PNG_INCLUDES@ PNG_LIBS = @PNG_LIBS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_INCLUDES = @SDL_INCLUDES@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_FLAGS = @SSE2_FLAGS@ SSE41_FLAGS = @SSE41_FLAGS@ STRIP = @STRIP@ TIFF_INCLUDES = @TIFF_INCLUDES@ TIFF_LIBS = @TIFF_LIBS@ USE_SWAP_16BIT_CSP = @USE_SWAP_16BIT_CSP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgconfigdir = @pkgconfigdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ webp_libname_prefix = @webp_libname_prefix@ # The mux and demux libraries depend on libwebp, thus the '.' to force # the build order so it's available to them. SUBDIRS = dec enc dsp utils . $(am__append_1) $(am__append_2) lib_LTLIBRARIES = libwebp.la $(am__append_3) common_HEADERS = webp/decode.h webp/types.h commondir = $(includedir)/webp libwebp_la_SOURCES = libwebpinclude_HEADERS = webp/encode.h noinst_HEADERS = webp/format_constants.h libwebp_la_LIBADD = dec/libwebpdecode.la dsp/libwebpdsp.la \ enc/libwebpencode.la utils/libwebputils.la # Use '-no-undefined' to declare that libwebp does not depend on any libraries # other than the ones listed on the command line, i.e., after linking, it will # not have unresolved symbols. Some platforms (Windows among them) require all # symbols in shared libraries to be resolved at library creation. libwebp_la_LDFLAGS = -no-undefined -version-info 8:9:1 libwebpincludedir = $(includedir)/webp pkgconfig_DATA = libwebp.pc $(am__append_4) @BUILD_LIBWEBPDECODER_TRUE@libwebpdecoder_la_SOURCES = @BUILD_LIBWEBPDECODER_TRUE@libwebpdecoder_la_LIBADD = \ @BUILD_LIBWEBPDECODER_TRUE@ dec/libwebpdecode.la \ @BUILD_LIBWEBPDECODER_TRUE@ dsp/libwebpdspdecode.la \ @BUILD_LIBWEBPDECODER_TRUE@ utils/libwebputilsdecode.la @BUILD_LIBWEBPDECODER_TRUE@libwebpdecoder_la_LDFLAGS = -no-undefined -version-info 4:9:1 all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): libwebp.pc: $(top_builddir)/config.status $(srcdir)/libwebp.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ libwebpdecoder.pc: $(top_builddir)/config.status $(srcdir)/libwebpdecoder.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libwebp.la: $(libwebp_la_OBJECTS) $(libwebp_la_DEPENDENCIES) $(EXTRA_libwebp_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebp_la_LINK) -rpath $(libdir) $(libwebp_la_OBJECTS) $(libwebp_la_LIBADD) $(LIBS) libwebpdecoder.la: $(libwebpdecoder_la_OBJECTS) $(libwebpdecoder_la_DEPENDENCIES) $(EXTRA_libwebpdecoder_la_DEPENDENCIES) $(AM_V_CCLD)$(libwebpdecoder_la_LINK) $(am_libwebpdecoder_la_rpath) $(libwebpdecoder_la_OBJECTS) $(libwebpdecoder_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-commonHEADERS: $(common_HEADERS) @$(NORMAL_INSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(commondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(commondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(commondir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(commondir)" || exit $$?; \ done uninstall-commonHEADERS: @$(NORMAL_UNINSTALL) @list='$(common_HEADERS)'; test -n "$(commondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(commondir)'; $(am__uninstall_files_from_dir) install-libwebpincludeHEADERS: $(libwebpinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libwebpinclude_HEADERS)'; test -n "$(libwebpincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libwebpincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libwebpincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libwebpincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libwebpincludedir)" || exit $$?; \ done uninstall-libwebpincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libwebpinclude_HEADERS)'; test -n "$(libwebpincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libwebpincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(commondir)" "$(DESTDIR)$(libwebpincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-commonHEADERS install-libwebpincludeHEADERS \ install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-commonHEADERS uninstall-libLTLIBRARIES \ uninstall-libwebpincludeHEADERS uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-commonHEADERS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES \ install-libwebpincludeHEADERS install-man install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-commonHEADERS uninstall-libLTLIBRARIES \ uninstall-libwebpincludeHEADERS uninstall-pkgconfigDATA .PRECIOUS: Makefile ${pkgconfig_DATA}: ${top_builddir}/config.status # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libwebp-1.4.0/src/webp/0000755000014400001440000000000014606317243011602 5ustar libwebp-1.4.0/src/webp/demux.h0000644000014400001440000003717614606317060013110 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Demux API. // Enables extraction of image and extended format data from WebP files. // Code Example: Demuxing WebP data to extract all the frames, ICC profile // and EXIF/XMP metadata. /* WebPDemuxer* demux = WebPDemux(&webp_data); uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH); uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT); // ... (Get information about the features present in the WebP file). uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS); // ... (Iterate over all frames). WebPIterator iter; if (WebPDemuxGetFrame(demux, 1, &iter)) { do { // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(), // ... and get other frame properties like width, height, offsets etc. // ... see 'struct WebPIterator' below for more info). } while (WebPDemuxNextFrame(&iter)); WebPDemuxReleaseIterator(&iter); } // ... (Extract metadata). WebPChunkIterator chunk_iter; if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter); // ... (Consume the ICC profile in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter); // ... (Consume the EXIF metadata in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter); // ... (Consume the XMP metadata in 'chunk_iter.chunk'). WebPDemuxReleaseChunkIterator(&chunk_iter); WebPDemuxDelete(demux); */ #ifndef WEBP_WEBP_DEMUX_H_ #define WEBP_WEBP_DEMUX_H_ #include "./decode.h" // for WEBP_CSP_MODE #include "./mux_types.h" #include "./types.h" #ifdef __cplusplus extern "C" { #endif #define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b) // Note: forward declaring enumerations is not allowed in (strict) C and C++, // the types are left here for reference. // typedef enum WebPDemuxState WebPDemuxState; // typedef enum WebPFormatFeature WebPFormatFeature; typedef struct WebPDemuxer WebPDemuxer; typedef struct WebPIterator WebPIterator; typedef struct WebPChunkIterator WebPChunkIterator; typedef struct WebPAnimInfo WebPAnimInfo; typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions; //------------------------------------------------------------------------------ // Returns the version number of the demux library, packed in hexadecimal using // 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. WEBP_EXTERN int WebPGetDemuxVersion(void); //------------------------------------------------------------------------------ // Life of a Demux object typedef enum WebPDemuxState { WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing. WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header. WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete, // data may be available. WEBP_DEMUX_DONE = 2 // Entire file has been parsed. } WebPDemuxState; // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN WebPDemuxer* WebPDemuxInternal( const WebPData*, int, WebPDemuxState*, int); // Parses the full WebP file given by 'data'. For single images the WebP file // header alone or the file header and the chunk header may be absent. // Returns a WebPDemuxer object on successful parse, NULL otherwise. WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) { return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION); } // Parses the possibly incomplete WebP file given by 'data'. // If 'state' is non-NULL it will be set to indicate the status of the demuxer. // Returns NULL in case of error or if there isn't enough data to start parsing; // and a WebPDemuxer object on successful parse. // Note that WebPDemuxer keeps internal pointers to 'data' memory segment. // If this data is volatile, the demuxer object should be deleted (by calling // WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data. // This is usually an inexpensive operation. WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemuxPartial( const WebPData* data, WebPDemuxState* state) { return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION); } // Frees memory associated with 'dmux'. WEBP_EXTERN void WebPDemuxDelete(WebPDemuxer* dmux); //------------------------------------------------------------------------------ // Data/information extraction. typedef enum WebPFormatFeature { WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags // corresponding to the 'VP8X' chunk (if present). WEBP_FF_CANVAS_WIDTH, WEBP_FF_CANVAS_HEIGHT, WEBP_FF_LOOP_COUNT, // only relevant for animated file WEBP_FF_BACKGROUND_COLOR, // idem. WEBP_FF_FRAME_COUNT // Number of frames present in the demux object. // In case of a partial demux, this is the number // of frames seen so far, with the last frame // possibly being partial. } WebPFormatFeature; // Get the 'feature' value from the 'dmux'. // NOTE: values are only valid if WebPDemux() was used or WebPDemuxPartial() // returned a state > WEBP_DEMUX_PARSING_HEADER. // If 'feature' is WEBP_FF_FORMAT_FLAGS, the returned value is a bit-wise // combination of WebPFeatureFlags values. // If 'feature' is WEBP_FF_LOOP_COUNT, WEBP_FF_BACKGROUND_COLOR, the returned // value is only meaningful if the bitstream is animated. WEBP_EXTERN uint32_t WebPDemuxGetI( const WebPDemuxer* dmux, WebPFormatFeature feature); //------------------------------------------------------------------------------ // Frame iteration. struct WebPIterator { int frame_num; int num_frames; // equivalent to WEBP_FF_FRAME_COUNT. int x_offset, y_offset; // offset relative to the canvas. int width, height; // dimensions of this frame. int duration; // display duration in milliseconds. WebPMuxAnimDispose dispose_method; // dispose method for the frame. int complete; // true if 'fragment' contains a full frame. partial images // may still be decoded with the WebP incremental decoder. WebPData fragment; // The frame given by 'frame_num'. Note for historical // reasons this is called a fragment. int has_alpha; // True if the frame contains transparency. WebPMuxAnimBlend blend_method; // Blend operation for the frame. uint32_t pad[2]; // padding for later use. void* private_; // for internal use only. }; // Retrieves frame 'frame_number' from 'dmux'. // 'iter->fragment' points to the frame on return from this function. // Setting 'frame_number' equal to 0 will return the last frame of the image. // Returns false if 'dmux' is NULL or frame 'frame_number' is not present. // Call WebPDemuxReleaseIterator() when use of the iterator is complete. // NOTE: 'dmux' must persist for the lifetime of 'iter'. WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetFrame( const WebPDemuxer* dmux, int frame_number, WebPIterator* iter); // Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or // previous ('iter->frame_num' - 1) frame. These functions do not loop. // Returns true on success, false otherwise. WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter); WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter); // Releases any memory associated with 'iter'. // Must be called before any subsequent calls to WebPDemuxGetChunk() on the same // iter. Also, must be called before destroying the associated WebPDemuxer with // WebPDemuxDelete(). WEBP_EXTERN void WebPDemuxReleaseIterator(WebPIterator* iter); //------------------------------------------------------------------------------ // Chunk iteration. struct WebPChunkIterator { // The current and total number of chunks with the fourcc given to // WebPDemuxGetChunk(). int chunk_num; int num_chunks; WebPData chunk; // The payload of the chunk. uint32_t pad[6]; // padding for later use void* private_; }; // Retrieves the 'chunk_number' instance of the chunk with id 'fourcc' from // 'dmux'. // 'fourcc' is a character array containing the fourcc of the chunk to return, // e.g., "ICCP", "XMP ", "EXIF", etc. // Setting 'chunk_number' equal to 0 will return the last chunk in a set. // Returns true if the chunk is found, false otherwise. Image related chunk // payloads are accessed through WebPDemuxGetFrame() and related functions. // Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete. // NOTE: 'dmux' must persist for the lifetime of the iterator. WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux, const char fourcc[4], int chunk_number, WebPChunkIterator* iter); // Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous // ('iter->chunk_num' - 1) chunk. These functions do not loop. // Returns true on success, false otherwise. WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter); WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter); // Releases any memory associated with 'iter'. // Must be called before destroying the associated WebPDemuxer with // WebPDemuxDelete(). WEBP_EXTERN void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter); //------------------------------------------------------------------------------ // WebPAnimDecoder API // // This API allows decoding (possibly) animated WebP images. // // Code Example: /* WebPAnimDecoderOptions dec_options; WebPAnimDecoderOptionsInit(&dec_options); // Tune 'dec_options' as needed. WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options); WebPAnimInfo anim_info; WebPAnimDecoderGetInfo(dec, &anim_info); for (uint32_t i = 0; i < anim_info.loop_count; ++i) { while (WebPAnimDecoderHasMoreFrames(dec)) { uint8_t* buf; int timestamp; WebPAnimDecoderGetNext(dec, &buf, ×tamp); // ... (Render 'buf' based on 'timestamp'). // ... (Do NOT free 'buf', as it is owned by 'dec'). } WebPAnimDecoderReset(dec); } const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec); // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data). WebPAnimDecoderDelete(dec); */ typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object. // Global options. struct WebPAnimDecoderOptions { // Output colorspace. Only the following modes are supported: // MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA. WEBP_CSP_MODE color_mode; int use_threads; // If true, use multi-threaded decoding. uint32_t padding[7]; // Padding for later use. }; // Internal, version-checked, entry point. WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal( WebPAnimDecoderOptions*, int); // Should always be called, to initialize a fresh WebPAnimDecoderOptions // structure before modification. Returns false in case of version mismatch. // WebPAnimDecoderOptionsInit() must have succeeded before using the // 'dec_options' object. WEBP_NODISCARD static WEBP_INLINE int WebPAnimDecoderOptionsInit( WebPAnimDecoderOptions* dec_options) { return WebPAnimDecoderOptionsInitInternal(dec_options, WEBP_DEMUX_ABI_VERSION); } // Internal, version-checked, entry point. WEBP_NODISCARD WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal( const WebPData*, const WebPAnimDecoderOptions*, int); // Creates and initializes a WebPAnimDecoder object. // Parameters: // webp_data - (in) WebP bitstream. This should remain unchanged during the // lifetime of the output WebPAnimDecoder object. // dec_options - (in) decoding options. Can be passed NULL to choose // reasonable defaults (in particular, color mode MODE_RGBA // will be picked). // Returns: // A pointer to the newly created WebPAnimDecoder object, or NULL in case of // parsing error, invalid option or memory error. WEBP_NODISCARD static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew( const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) { return WebPAnimDecoderNewInternal(webp_data, dec_options, WEBP_DEMUX_ABI_VERSION); } // Global information about the animation.. struct WebPAnimInfo { uint32_t canvas_width; uint32_t canvas_height; uint32_t loop_count; uint32_t bgcolor; uint32_t frame_count; uint32_t pad[4]; // padding for later use }; // Get global information about the animation. // Parameters: // dec - (in) decoder instance to get information from. // info - (out) global information fetched from the animation. // Returns: // True on success. WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetInfo( const WebPAnimDecoder* dec, WebPAnimInfo* info); // Fetch the next frame from 'dec' based on options supplied to // WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size // 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The // returned buffer 'buf' is valid only until the next call to // WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete(). // Parameters: // dec - (in/out) decoder instance from which the next frame is to be fetched. // buf - (out) decoded frame. // timestamp - (out) timestamp of the frame in milliseconds. // Returns: // False if any of the arguments are NULL, or if there is a parsing or // decoding error, or if there are no more frames. Otherwise, returns true. WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec, uint8_t** buf, int* timestamp); // Check if there are more frames left to decode. // Parameters: // dec - (in) decoder instance to be checked. // Returns: // True if 'dec' is not NULL and some frames are yet to be decoded. // Otherwise, returns false. WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderHasMoreFrames( const WebPAnimDecoder* dec); // Resets the WebPAnimDecoder object, so that next call to // WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be // helpful when all frames need to be decoded multiple times (e.g. // info.loop_count times) without destroying and recreating the 'dec' object. // Parameters: // dec - (in/out) decoder instance to be reset WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec); // Grab the internal demuxer object. // Getting the demuxer object can be useful if one wants to use operations only // available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned // demuxer object is owned by 'dec' and is valid only until the next call to // WebPAnimDecoderDelete(). // // Parameters: // dec - (in) decoder instance from which the demuxer object is to be fetched. WEBP_NODISCARD WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer( const WebPAnimDecoder* dec); // Deletes the WebPAnimDecoder object. // Parameters: // dec - (in/out) decoder instance to be deleted WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_DEMUX_H_ libwebp-1.4.0/src/webp/config.h.in0000644000014400001440000000762214606317243013634 0ustar /* src/webp/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Set to 1 if __builtin_bswap16 is available */ #undef HAVE_BUILTIN_BSWAP16 /* Set to 1 if __builtin_bswap32 is available */ #undef HAVE_BUILTIN_BSWAP32 /* Set to 1 if __builtin_bswap64 is available */ #undef HAVE_BUILTIN_BSWAP64 /* Define to 1 if you have the header file. */ #undef HAVE_CPU_FEATURES_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_GLUT_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_GL_GLUT_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_OPENGL_GLUT_H /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the header file. */ #undef HAVE_SHLWAPI_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WINCODEC_H /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Set to 1 if GIF library is installed */ #undef WEBP_HAVE_GIF /* Set to 1 if OpenGL is supported */ #undef WEBP_HAVE_GL /* Set to 1 if JPEG library is installed */ #undef WEBP_HAVE_JPEG /* Set to 1 if NEON is supported */ #undef WEBP_HAVE_NEON /* Set to 1 if runtime detection of NEON is enabled */ #undef WEBP_HAVE_NEON_RTCD /* Set to 1 if PNG library is installed */ #undef WEBP_HAVE_PNG /* Set to 1 if SDL library is installed */ #undef WEBP_HAVE_SDL /* Set to 1 if SSE2 is supported */ #undef WEBP_HAVE_SSE2 /* Set to 1 if SSE4.1 is supported */ #undef WEBP_HAVE_SSE41 /* Set to 1 if TIFF library is installed */ #undef WEBP_HAVE_TIFF /* Enable near lossless encoding */ #undef WEBP_NEAR_LOSSLESS /* Undefine this to disable thread support. */ #undef WEBP_USE_THREAD /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif libwebp-1.4.0/src/webp/format_constants.h0000644000014400001440000000742414606317060015343 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Internal header for constants related to WebP file format. // // Author: Urvang (urvang@google.com) #ifndef WEBP_WEBP_FORMAT_CONSTANTS_H_ #define WEBP_WEBP_FORMAT_CONSTANTS_H_ // Create fourcc of the chunk from the chunk tag characters. #define MKFOURCC(a, b, c, d) ((a) | (b) << 8 | (c) << 16 | (uint32_t)(d) << 24) // VP8 related constants. #define VP8_SIGNATURE 0x9d012a // Signature in VP8 data. #define VP8_MAX_PARTITION0_SIZE (1 << 19) // max size of mode partition #define VP8_MAX_PARTITION_SIZE (1 << 24) // max size for token partition #define VP8_FRAME_HEADER_SIZE 10 // Size of the frame header within VP8 data. // VP8L related constants. #define VP8L_SIGNATURE_SIZE 1 // VP8L signature size. #define VP8L_MAGIC_BYTE 0x2f // VP8L signature byte. #define VP8L_IMAGE_SIZE_BITS 14 // Number of bits used to store // width and height. #define VP8L_VERSION_BITS 3 // 3 bits reserved for version. #define VP8L_VERSION 0 // version 0 #define VP8L_FRAME_HEADER_SIZE 5 // Size of the VP8L frame header. #define MAX_PALETTE_SIZE 256 #define MAX_CACHE_BITS 11 #define HUFFMAN_CODES_PER_META_CODE 5 #define ARGB_BLACK 0xff000000 #define DEFAULT_CODE_LENGTH 8 #define MAX_ALLOWED_CODE_LENGTH 15 #define NUM_LITERAL_CODES 256 #define NUM_LENGTH_CODES 24 #define NUM_DISTANCE_CODES 40 #define CODE_LENGTH_CODES 19 #define MIN_HUFFMAN_BITS 2 // min number of Huffman bits #define MAX_HUFFMAN_BITS 9 // max number of Huffman bits #define TRANSFORM_PRESENT 1 // The bit to be written when next data // to be read is a transform. #define NUM_TRANSFORMS 4 // Maximum number of allowed transform // in a bitstream. typedef enum { PREDICTOR_TRANSFORM = 0, CROSS_COLOR_TRANSFORM = 1, SUBTRACT_GREEN_TRANSFORM = 2, COLOR_INDEXING_TRANSFORM = 3 } VP8LImageTransformType; // Alpha related constants. #define ALPHA_HEADER_LEN 1 #define ALPHA_NO_COMPRESSION 0 #define ALPHA_LOSSLESS_COMPRESSION 1 #define ALPHA_PREPROCESSED_LEVELS 1 // Mux related constants. #define TAG_SIZE 4 // Size of a chunk tag (e.g. "VP8L"). #define CHUNK_SIZE_BYTES 4 // Size needed to store chunk's size. #define CHUNK_HEADER_SIZE 8 // Size of a chunk header. #define RIFF_HEADER_SIZE 12 // Size of the RIFF header ("RIFFnnnnWEBP"). #define ANMF_CHUNK_SIZE 16 // Size of an ANMF chunk. #define ANIM_CHUNK_SIZE 6 // Size of an ANIM chunk. #define VP8X_CHUNK_SIZE 10 // Size of a VP8X chunk. #define MAX_CANVAS_SIZE (1 << 24) // 24-bit max for VP8X width/height. #define MAX_IMAGE_AREA (1ULL << 32) // 32-bit max for width x height. #define MAX_LOOP_COUNT (1 << 16) // maximum value for loop-count #define MAX_DURATION (1 << 24) // maximum duration #define MAX_POSITION_OFFSET (1 << 24) // maximum frame x/y offset // Maximum chunk payload is such that adding the header and padding won't // overflow a uint32_t. #define MAX_CHUNK_PAYLOAD (~0U - CHUNK_HEADER_SIZE - 1) #endif // WEBP_WEBP_FORMAT_CONSTANTS_H_ libwebp-1.4.0/src/webp/types.h0000644000014400001440000000605114606317060013116 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Common types + memory wrappers // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_WEBP_TYPES_H_ #define WEBP_WEBP_TYPES_H_ #include // for size_t #ifndef _MSC_VER #include #if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) #define WEBP_INLINE inline #else #define WEBP_INLINE #endif #else typedef signed char int8_t; typedef unsigned char uint8_t; typedef signed short int16_t; typedef unsigned short uint16_t; typedef signed int int32_t; typedef unsigned int uint32_t; typedef unsigned long long int uint64_t; typedef long long int int64_t; #define WEBP_INLINE __forceinline #endif /* _MSC_VER */ #ifndef WEBP_NODISCARD #if defined(WEBP_ENABLE_NODISCARD) && WEBP_ENABLE_NODISCARD #if (defined(__cplusplus) && __cplusplus >= 201700L) || \ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) #define WEBP_NODISCARD [[nodiscard]] #else // gcc's __has_attribute does not work for enums. #if defined(__clang__) && defined(__has_attribute) #if __has_attribute(warn_unused_result) #define WEBP_NODISCARD __attribute__((warn_unused_result)) #else #define WEBP_NODISCARD #endif /* __has_attribute(warn_unused_result) */ #else #define WEBP_NODISCARD #endif /* defined(__clang__) && defined(__has_attribute) */ #endif /* (defined(__cplusplus) && __cplusplus >= 201700L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L) */ #else #define WEBP_NODISCARD #endif /* defined(WEBP_ENABLE_NODISCARD) && WEBP_ENABLE_NODISCARD */ #endif /* WEBP_NODISCARD */ #ifndef WEBP_EXTERN // This explicitly marks library functions and allows for changing the // signature for e.g., Windows DLL builds. # if defined(_WIN32) && defined(WEBP_DLL) # define WEBP_EXTERN __declspec(dllexport) # elif defined(__GNUC__) && __GNUC__ >= 4 # define WEBP_EXTERN extern __attribute__ ((visibility ("default"))) # else # define WEBP_EXTERN extern # endif /* defined(_WIN32) && defined(WEBP_DLL) */ #endif /* WEBP_EXTERN */ // Macro to check ABI compatibility (same major revision number) #define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8)) #ifdef __cplusplus extern "C" { #endif // Allocates 'size' bytes of memory. Returns NULL upon error. Memory // must be deallocated by calling WebPFree(). This function is made available // by the core 'libwebp' library. WEBP_NODISCARD WEBP_EXTERN void* WebPMalloc(size_t size); // Releases memory returned by the WebPDecode*() functions (from decode.h). WEBP_EXTERN void WebPFree(void* ptr); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_TYPES_H_ libwebp-1.4.0/src/webp/mux_types.h0000644000014400001440000000627314606317060014015 0ustar // Copyright 2012 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Data-types common to the mux and demux libraries. // // Author: Urvang (urvang@google.com) #ifndef WEBP_WEBP_MUX_TYPES_H_ #define WEBP_WEBP_MUX_TYPES_H_ #include // memset() #include "./types.h" #ifdef __cplusplus extern "C" { #endif // Note: forward declaring enumerations is not allowed in (strict) C and C++, // the types are left here for reference. // typedef enum WebPFeatureFlags WebPFeatureFlags; // typedef enum WebPMuxAnimDispose WebPMuxAnimDispose; // typedef enum WebPMuxAnimBlend WebPMuxAnimBlend; typedef struct WebPData WebPData; // VP8X Feature Flags. typedef enum WebPFeatureFlags { ANIMATION_FLAG = 0x00000002, XMP_FLAG = 0x00000004, EXIF_FLAG = 0x00000008, ALPHA_FLAG = 0x00000010, ICCP_FLAG = 0x00000020, ALL_VALID_FLAGS = 0x0000003e } WebPFeatureFlags; // Dispose method (animation only). Indicates how the area used by the current // frame is to be treated before rendering the next frame on the canvas. typedef enum WebPMuxAnimDispose { WEBP_MUX_DISPOSE_NONE, // Do not dispose. WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color. } WebPMuxAnimDispose; // Blend operation (animation only). Indicates how transparent pixels of the // current frame are blended with those of the previous canvas. typedef enum WebPMuxAnimBlend { WEBP_MUX_BLEND, // Blend. WEBP_MUX_NO_BLEND // Do not blend. } WebPMuxAnimBlend; // Data type used to describe 'raw' data, e.g., chunk data // (ICC profile, metadata) and WebP compressed image data. // 'bytes' memory must be allocated using WebPMalloc() and such. struct WebPData { const uint8_t* bytes; size_t size; }; // Initializes the contents of the 'webp_data' object with default values. static WEBP_INLINE void WebPDataInit(WebPData* webp_data) { if (webp_data != NULL) { memset(webp_data, 0, sizeof(*webp_data)); } } // Clears the contents of the 'webp_data' object by calling WebPFree(). // Does not deallocate the object itself. static WEBP_INLINE void WebPDataClear(WebPData* webp_data) { if (webp_data != NULL) { WebPFree((void*)webp_data->bytes); WebPDataInit(webp_data); } } // Allocates necessary storage for 'dst' and copies the contents of 'src'. // Returns true on success. WEBP_NODISCARD static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) { if (src == NULL || dst == NULL) return 0; WebPDataInit(dst); if (src->bytes != NULL && src->size != 0) { dst->bytes = (uint8_t*)WebPMalloc(src->size); if (dst->bytes == NULL) return 0; memcpy((void*)dst->bytes, src->bytes, src->size); dst->size = src->size; } return 1; } #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_MUX_TYPES_H_ libwebp-1.4.0/src/webp/mux.h0000644000014400001440000006255614606317060012577 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // RIFF container manipulation and encoding for WebP images. // // Authors: Urvang (urvang@google.com) // Vikas (vikasa@google.com) #ifndef WEBP_WEBP_MUX_H_ #define WEBP_WEBP_MUX_H_ #include "./mux_types.h" #include "./types.h" #ifdef __cplusplus extern "C" { #endif #define WEBP_MUX_ABI_VERSION 0x0109 // MAJOR(8b) + MINOR(8b) //------------------------------------------------------------------------------ // Mux API // // This API allows manipulation of WebP container images containing features // like color profile, metadata, animation. // // Code Example#1: Create a WebPMux object with image data, color profile and // XMP metadata. /* int copy_data = 0; WebPMux* mux = WebPMuxNew(); // ... (Prepare image data). WebPMuxSetImage(mux, &image, copy_data); // ... (Prepare ICCP color profile data). WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data); // ... (Prepare XMP metadata). WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data); // Get data from mux in WebP RIFF format. WebPMuxAssemble(mux, &output_data); WebPMuxDelete(mux); // ... (Consume output_data; e.g. write output_data.bytes to file). WebPDataClear(&output_data); */ // Code Example#2: Get image and color profile data from a WebP file. /* int copy_data = 0; // ... (Read data from file). WebPMux* mux = WebPMuxCreate(&data, copy_data); WebPMuxGetFrame(mux, 1, &image); // ... (Consume image; e.g. call WebPDecode() to decode the data). WebPMuxGetChunk(mux, "ICCP", &icc_profile); // ... (Consume icc_data). WebPMuxDelete(mux); WebPFree(data); */ // Note: forward declaring enumerations is not allowed in (strict) C and C++, // the types are left here for reference. // typedef enum WebPMuxError WebPMuxError; // typedef enum WebPChunkId WebPChunkId; typedef struct WebPMux WebPMux; // main opaque object. typedef struct WebPMuxFrameInfo WebPMuxFrameInfo; typedef struct WebPMuxAnimParams WebPMuxAnimParams; typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions; // Error codes typedef enum WEBP_NODISCARD WebPMuxError { WEBP_MUX_OK = 1, WEBP_MUX_NOT_FOUND = 0, WEBP_MUX_INVALID_ARGUMENT = -1, WEBP_MUX_BAD_DATA = -2, WEBP_MUX_MEMORY_ERROR = -3, WEBP_MUX_NOT_ENOUGH_DATA = -4 } WebPMuxError; // IDs for different types of chunks. typedef enum WebPChunkId { WEBP_CHUNK_VP8X, // VP8X WEBP_CHUNK_ICCP, // ICCP WEBP_CHUNK_ANIM, // ANIM WEBP_CHUNK_ANMF, // ANMF WEBP_CHUNK_DEPRECATED, // (deprecated from FRGM) WEBP_CHUNK_ALPHA, // ALPH WEBP_CHUNK_IMAGE, // VP8/VP8L WEBP_CHUNK_EXIF, // EXIF WEBP_CHUNK_XMP, // XMP WEBP_CHUNK_UNKNOWN, // Other chunks. WEBP_CHUNK_NIL } WebPChunkId; //------------------------------------------------------------------------------ // Returns the version number of the mux library, packed in hexadecimal using // 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507. WEBP_EXTERN int WebPGetMuxVersion(void); //------------------------------------------------------------------------------ // Life of a Mux object // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPNewInternal(int); // Creates an empty mux object. // Returns: // A pointer to the newly created empty mux object. // Or NULL in case of memory error. WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxNew(void) { return WebPNewInternal(WEBP_MUX_ABI_VERSION); } // Deletes the mux object. // Parameters: // mux - (in/out) object to be deleted WEBP_EXTERN void WebPMuxDelete(WebPMux* mux); //------------------------------------------------------------------------------ // Mux creation. // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int); // Creates a mux object from raw data given in WebP RIFF format. // Parameters: // bitstream - (in) the bitstream data in WebP RIFF format // copy_data - (in) value 1 indicates given data WILL be copied to the mux // object and value 0 indicates data will NOT be copied. If the // data is not copied, it must exist for the lifetime of the // mux object. // Returns: // A pointer to the mux object created from given data - on success. // NULL - In case of invalid data or memory error. WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxCreate( const WebPData* bitstream, int copy_data) { return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION); } //------------------------------------------------------------------------------ // Non-image chunks. // Note: Only non-image related chunks should be managed through chunk APIs. // (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH"). // To add, get and delete images, use WebPMuxSetImage(), WebPMuxPushFrame(), // WebPMuxGetFrame() and WebPMuxDeleteFrame(). // Adds a chunk with id 'fourcc' and data 'chunk_data' in the mux object. // Any existing chunk(s) with the same id will be removed. // Parameters: // mux - (in/out) object to which the chunk is to be added // fourcc - (in) a character array containing the fourcc of the given chunk; // e.g., "ICCP", "XMP ", "EXIF" etc. // chunk_data - (in) the chunk data to be added // copy_data - (in) value 1 indicates given data WILL be copied to the mux // object and value 0 indicates data will NOT be copied. If the // data is not copied, it must exist until a call to // WebPMuxAssemble() is made. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL // or if fourcc corresponds to an image chunk. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxSetChunk( WebPMux* mux, const char fourcc[4], const WebPData* chunk_data, int copy_data); // Gets a reference to the data of the chunk with id 'fourcc' in the mux object. // The caller should NOT free the returned data. // Parameters: // mux - (in) object from which the chunk data is to be fetched // fourcc - (in) a character array containing the fourcc of the chunk; // e.g., "ICCP", "XMP ", "EXIF" etc. // chunk_data - (out) returned chunk data // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL // or if fourcc corresponds to an image chunk. // WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given id. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxGetChunk( const WebPMux* mux, const char fourcc[4], WebPData* chunk_data); // Deletes the chunk with the given 'fourcc' from the mux object. // Parameters: // mux - (in/out) object from which the chunk is to be deleted // fourcc - (in) a character array containing the fourcc of the chunk; // e.g., "ICCP", "XMP ", "EXIF" etc. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or fourcc is NULL // or if fourcc corresponds to an image chunk. // WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given fourcc. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxDeleteChunk( WebPMux* mux, const char fourcc[4]); //------------------------------------------------------------------------------ // Images. // Encapsulates data about a single frame. struct WebPMuxFrameInfo { WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream // or a single-image WebP file. int x_offset; // x-offset of the frame. int y_offset; // y-offset of the frame. int duration; // duration of the frame (in milliseconds). WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF // or WEBP_CHUNK_IMAGE WebPMuxAnimDispose dispose_method; // Disposal method for the frame. WebPMuxAnimBlend blend_method; // Blend operation for the frame. uint32_t pad[1]; // padding for later use }; // Sets the (non-animated) image in the mux object. // Note: Any existing images (including frames) will be removed. // Parameters: // mux - (in/out) object in which the image is to be set // bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image // WebP file (non-animated) // copy_data - (in) value 1 indicates given data WILL be copied to the mux // object and value 0 indicates data will NOT be copied. If the // data is not copied, it must exist until a call to // WebPMuxAssemble() is made. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxSetImage( WebPMux* mux, const WebPData* bitstream, int copy_data); // Adds a frame at the end of the mux object. // Notes: (1) frame.id should be WEBP_CHUNK_ANMF // (2) For setting a non-animated image, use WebPMuxSetImage() instead. // (3) Type of frame being pushed must be same as the frames in mux. // (4) As WebP only supports even offsets, any odd offset will be snapped // to an even location using: offset &= ~1 // Parameters: // mux - (in/out) object to which the frame is to be added // frame - (in) frame data. // copy_data - (in) value 1 indicates given data WILL be copied to the mux // object and value 0 indicates data will NOT be copied. If the // data is not copied, it must exist until a call to // WebPMuxAssemble() is made. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL // or if content of 'frame' is invalid. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxPushFrame( WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data); // Gets the nth frame from the mux object. // The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT // owned by the 'mux' object. It MUST be deallocated by the caller by calling // WebPDataClear(). // nth=0 has a special meaning - last position. // Parameters: // mux - (in) object from which the info is to be fetched // nth - (in) index of the frame in the mux object // frame - (out) data of the returned frame // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL. // WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object. // WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxGetFrame( const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame); // Deletes a frame from the mux object. // nth=0 has a special meaning - last position. // Parameters: // mux - (in/out) object from which a frame is to be deleted // nth - (in) The position from which the frame is to be deleted // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux is NULL. // WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object // before deletion. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth); //------------------------------------------------------------------------------ // Animation. // Animation parameters. struct WebPMuxAnimParams { uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as: // Bits 00 to 07: Alpha. // Bits 08 to 15: Red. // Bits 16 to 23: Green. // Bits 24 to 31: Blue. int loop_count; // Number of times to repeat the animation [0 = infinite]. }; // Sets the animation parameters in the mux object. Any existing ANIM chunks // will be removed. // Parameters: // mux - (in/out) object in which ANIM chunk is to be set/added // params - (in) animation parameters. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxSetAnimationParams( WebPMux* mux, const WebPMuxAnimParams* params); // Gets the animation parameters from the mux object. // Parameters: // mux - (in) object from which the animation parameters to be fetched // params - (out) animation parameters extracted from the ANIM chunk // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL. // WEBP_MUX_NOT_FOUND - if ANIM chunk is not present in mux object. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxGetAnimationParams( const WebPMux* mux, WebPMuxAnimParams* params); //------------------------------------------------------------------------------ // Misc Utilities. // Sets the canvas size for the mux object. The width and height can be // specified explicitly or left as zero (0, 0). // * When width and height are specified explicitly, then this frame bound is // enforced during subsequent calls to WebPMuxAssemble() and an error is // reported if any animated frame does not completely fit within the canvas. // * When unspecified (0, 0), the constructed canvas will get the frame bounds // from the bounding-box over all frames after calling WebPMuxAssemble(). // Parameters: // mux - (in) object to which the canvas size is to be set // width - (in) canvas width // height - (in) canvas height // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux is NULL; or // width or height are invalid or out of bounds // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux, int width, int height); // Gets the canvas size from the mux object. // Note: This method assumes that the VP8X chunk, if present, is up-to-date. // That is, the mux object hasn't been modified since the last call to // WebPMuxAssemble() or WebPMuxCreate(). // Parameters: // mux - (in) object from which the canvas size is to be fetched // width - (out) canvas width // height - (out) canvas height // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux, width or height is NULL. // WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux, int* width, int* height); // Gets the feature flags from the mux object. // Note: This method assumes that the VP8X chunk, if present, is up-to-date. // That is, the mux object hasn't been modified since the last call to // WebPMuxAssemble() or WebPMuxCreate(). // Parameters: // mux - (in) object from which the features are to be fetched // flags - (out) the flags specifying which features are present in the // mux object. This will be an OR of various flag values. // Enum 'WebPFeatureFlags' can be used to test individual flag values. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux or flags is NULL. // WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxGetFeatures(const WebPMux* mux, uint32_t* flags); // Gets number of chunks with the given 'id' in the mux object. // Parameters: // mux - (in) object from which the info is to be fetched // id - (in) chunk id specifying the type of chunk // num_elements - (out) number of chunks with the given chunk id // Returns: // WEBP_MUX_INVALID_ARGUMENT - if mux, or num_elements is NULL. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux, WebPChunkId id, int* num_elements); // Assembles all chunks in WebP RIFF format and returns in 'assembled_data'. // This function also validates the mux object. // Note: The content of 'assembled_data' will be ignored and overwritten. // Also, the content of 'assembled_data' is allocated using WebPMalloc(), and // NOT owned by the 'mux' object. It MUST be deallocated by the caller by // calling WebPDataClear(). It's always safe to call WebPDataClear() upon // return, even in case of error. // Parameters: // mux - (in/out) object whose chunks are to be assembled // assembled_data - (out) assembled WebP data // Returns: // WEBP_MUX_BAD_DATA - if mux object is invalid. // WEBP_MUX_INVALID_ARGUMENT - if mux or assembled_data is NULL. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPMuxAssemble(WebPMux* mux, WebPData* assembled_data); //------------------------------------------------------------------------------ // WebPAnimEncoder API // // This API allows encoding (possibly) animated WebP images. // // Code Example: /* WebPAnimEncoderOptions enc_options; WebPAnimEncoderOptionsInit(&enc_options); // Tune 'enc_options' as needed. WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options); while() { WebPConfig config; WebPConfigInit(&config); // Tune 'config' as needed. WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config); } WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL); WebPAnimEncoderAssemble(enc, webp_data); WebPAnimEncoderDelete(enc); // Write the 'webp_data' to a file, or re-mux it further. */ typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object. // Forward declarations. Defined in encode.h. struct WebPPicture; struct WebPConfig; // Global options. struct WebPAnimEncoderOptions { WebPMuxAnimParams anim_params; // Animation parameters. int minimize_size; // If true, minimize the output size (slow). Implicitly // disables key-frame insertion. int kmin; int kmax; // Minimum and maximum distance between consecutive key // frames in the output. The library may insert some key // frames as needed to satisfy this criteria. // Note that these conditions should hold: kmax > kmin // and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then // key-frame insertion is disabled; and if kmax == 1, // then all frames will be key-frames (kmin value does // not matter for these special cases). int allow_mixed; // If true, use mixed compression mode; may choose // either lossy and lossless for each frame. int verbose; // If true, print info and warning messages to stderr. uint32_t padding[4]; // Padding for later use. }; // Internal, version-checked, entry point. WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal( WebPAnimEncoderOptions*, int); // Should always be called, to initialize a fresh WebPAnimEncoderOptions // structure before modification. Returns false in case of version mismatch. // WebPAnimEncoderOptionsInit() must have succeeded before using the // 'enc_options' object. WEBP_NODISCARD static WEBP_INLINE int WebPAnimEncoderOptionsInit( WebPAnimEncoderOptions* enc_options) { return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION); } // Internal, version-checked, entry point. WEBP_EXTERN WebPAnimEncoder* WebPAnimEncoderNewInternal( int, int, const WebPAnimEncoderOptions*, int); // Creates and initializes a WebPAnimEncoder object. // Parameters: // width/height - (in) canvas width and height of the animation. // enc_options - (in) encoding options; can be passed NULL to pick // reasonable defaults. // Returns: // A pointer to the newly created WebPAnimEncoder object. // Or NULL in case of memory error. static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew( int width, int height, const WebPAnimEncoderOptions* enc_options) { return WebPAnimEncoderNewInternal(width, height, enc_options, WEBP_MUX_ABI_VERSION); } // Optimize the given frame for WebP, encode it and add it to the // WebPAnimEncoder object. // The last call to 'WebPAnimEncoderAdd' should be with frame = NULL, which // indicates that no more frames are to be added. This call is also used to // determine the duration of the last frame. // Parameters: // enc - (in/out) object to which the frame is to be added. // frame - (in/out) frame data in ARGB or YUV(A) format. If it is in YUV(A) // format, it will be converted to ARGB, which incurs a small loss. // timestamp_ms - (in) timestamp of this frame in milliseconds. // Duration of a frame would be calculated as // "timestamp of next frame - timestamp of this frame". // Hence, timestamps should be in non-decreasing order. // config - (in) encoding options; can be passed NULL to pick // reasonable defaults. // Returns: // On error, returns false and frame->error_code is set appropriately. // Otherwise, returns true. WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAdd( WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms, const struct WebPConfig* config); // Assemble all frames added so far into a WebP bitstream. // This call should be preceded by a call to 'WebPAnimEncoderAdd' with // frame = NULL; if not, the duration of the last frame will be internally // estimated. // Parameters: // enc - (in/out) object from which the frames are to be assembled. // webp_data - (out) generated WebP bitstream. // Returns: // True on success. WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc, WebPData* webp_data); // Get error string corresponding to the most recent call using 'enc'. The // returned string is owned by 'enc' and is valid only until the next call to // WebPAnimEncoderAdd() or WebPAnimEncoderAssemble() or WebPAnimEncoderDelete(). // Parameters: // enc - (in/out) object from which the error string is to be fetched. // Returns: // NULL if 'enc' is NULL. Otherwise, returns the error string if the last call // to 'enc' had an error, or an empty string if the last call was a success. WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc); // Deletes the WebPAnimEncoder object. // Parameters: // enc - (in/out) object to be deleted WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc); //------------------------------------------------------------------------------ // Non-image chunks. // Note: Only non-image related chunks should be managed through chunk APIs. // (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH"). // Adds a chunk with id 'fourcc' and data 'chunk_data' in the enc object. // Any existing chunk(s) with the same id will be removed. // Parameters: // enc - (in/out) object to which the chunk is to be added // fourcc - (in) a character array containing the fourcc of the given chunk; // e.g., "ICCP", "XMP ", "EXIF", etc. // chunk_data - (in) the chunk data to be added // copy_data - (in) value 1 indicates given data WILL be copied to the enc // object and value 0 indicates data will NOT be copied. If the // data is not copied, it must exist until a call to // WebPAnimEncoderAssemble() is made. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if enc, fourcc or chunk_data is NULL. // WEBP_MUX_MEMORY_ERROR - on memory allocation error. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPAnimEncoderSetChunk( WebPAnimEncoder* enc, const char fourcc[4], const WebPData* chunk_data, int copy_data); // Gets a reference to the data of the chunk with id 'fourcc' in the enc object. // The caller should NOT free the returned data. // Parameters: // enc - (in) object from which the chunk data is to be fetched // fourcc - (in) a character array containing the fourcc of the chunk; // e.g., "ICCP", "XMP ", "EXIF", etc. // chunk_data - (out) returned chunk data // Returns: // WEBP_MUX_INVALID_ARGUMENT - if enc, fourcc or chunk_data is NULL. // WEBP_MUX_NOT_FOUND - If enc does not contain a chunk with the given id. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPAnimEncoderGetChunk( const WebPAnimEncoder* enc, const char fourcc[4], WebPData* chunk_data); // Deletes the chunk with the given 'fourcc' from the enc object. // Parameters: // enc - (in/out) object from which the chunk is to be deleted // fourcc - (in) a character array containing the fourcc of the chunk; // e.g., "ICCP", "XMP ", "EXIF", etc. // Returns: // WEBP_MUX_INVALID_ARGUMENT - if enc or fourcc is NULL. // WEBP_MUX_NOT_FOUND - If enc does not contain a chunk with the given fourcc. // WEBP_MUX_OK - on success. WEBP_EXTERN WebPMuxError WebPAnimEncoderDeleteChunk( WebPAnimEncoder* enc, const char fourcc[4]); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_MUX_H_ libwebp-1.4.0/src/webp/encode.h0000644000014400001440000006741314606317060013220 0ustar // Copyright 2011 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP encoder: main interface // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_WEBP_ENCODE_H_ #define WEBP_WEBP_ENCODE_H_ #include "./types.h" #ifdef __cplusplus extern "C" { #endif #define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b) // Note: forward declaring enumerations is not allowed in (strict) C and C++, // the types are left here for reference. // typedef enum WebPImageHint WebPImageHint; // typedef enum WebPEncCSP WebPEncCSP; // typedef enum WebPPreset WebPPreset; // typedef enum WebPEncodingError WebPEncodingError; typedef struct WebPConfig WebPConfig; typedef struct WebPPicture WebPPicture; // main structure for I/O typedef struct WebPAuxStats WebPAuxStats; typedef struct WebPMemoryWriter WebPMemoryWriter; // Return the encoder's version number, packed in hexadecimal using 8bits for // each of major/minor/revision. E.g: v2.5.7 is 0x020507. WEBP_EXTERN int WebPGetEncoderVersion(void); //------------------------------------------------------------------------------ // One-stop-shop call! No questions asked: // Returns the size of the compressed data (pointed to by *output), or 0 if // an error occurred. The compressed data must be released by the caller // using the call 'WebPFree(*output)'. // These functions compress using the lossy format, and the quality_factor // can go from 0 (smaller output, lower quality) to 100 (best quality, // larger output). WEBP_EXTERN size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output); WEBP_EXTERN size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride, float quality_factor, uint8_t** output); WEBP_EXTERN size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride, float quality_factor, uint8_t** output); WEBP_EXTERN size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride, float quality_factor, uint8_t** output); // These functions are the equivalent of the above, but compressing in a // lossless manner. Files are usually larger than lossy format, but will // not suffer any compression loss. // Note these functions, like the lossy versions, use the library's default // settings. For lossless this means 'exact' is disabled. RGB values in // transparent areas will be modified to improve compression. To avoid this, // use WebPEncode() and set WebPConfig::exact to 1. WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height, int stride, uint8_t** output); WEBP_EXTERN size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height, int stride, uint8_t** output); WEBP_EXTERN size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height, int stride, uint8_t** output); WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height, int stride, uint8_t** output); //------------------------------------------------------------------------------ // Coding parameters // Image characteristics hint for the underlying encoder. typedef enum WebPImageHint { WEBP_HINT_DEFAULT = 0, // default preset. WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc). WEBP_HINT_LAST } WebPImageHint; // Compression parameters. struct WebPConfig { int lossless; // Lossless encoding (0=lossy(default), 1=lossless). float quality; // between 0 and 100. For lossy, 0 gives the smallest // size and 100 the largest. For lossless, this // parameter is the amount of effort put into the // compression: 0 is the fastest but gives larger // files compared to the slowest, but best, 100. int method; // quality/speed trade-off (0=fast, 6=slower-better) WebPImageHint image_hint; // Hint for image type (lossless only for now). int target_size; // if non-zero, set the desired target size in bytes. // Takes precedence over the 'compression' parameter. float target_PSNR; // if non-zero, specifies the minimal distortion to // try to achieve. Takes precedence over target_size. int segments; // maximum number of segments to use, in [1..4] int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum. int filter_strength; // range: [0 = off .. 100 = strongest] int filter_sharpness; // range: [0 = off .. 7 = least sharp] int filter_type; // filtering type: 0 = simple, 1 = strong (only used // if filter_strength > 0 or autofilter > 0) int autofilter; // Auto adjust filter's strength [0 = off, 1 = on] int alpha_compression; // Algorithm for encoding the alpha plane (0 = none, // 1 = compressed with WebP lossless). Default is 1. int alpha_filtering; // Predictive filtering method for alpha plane. // 0: none, 1: fast, 2: best. Default if 1. int alpha_quality; // Between 0 (smallest size) and 100 (lossless). // Default is 100. int pass; // number of entropy-analysis passes (in [1..10]). int show_compressed; // if true, export the compressed picture back. // In-loop filtering is not applied. int preprocessing; // preprocessing filter: // 0=none, 1=segment-smooth, 2=pseudo-random dithering int partitions; // log2(number of token partitions) in [0..3]. Default // is set to 0 for easier progressive decoding. int partition_limit; // quality degradation allowed to fit the 512k limit // on prediction modes coding (0: no degradation, // 100: maximum possible degradation). int emulate_jpeg_size; // If true, compression parameters will be remapped // to better match the expected output size from // JPEG compression. Generally, the output size will // be similar but the degradation will be lower. int thread_level; // If non-zero, try and use multi-threaded encoding. int low_memory; // If set, reduce memory usage (but increase CPU use). int near_lossless; // Near lossless encoding [0 = max loss .. 100 = off // (default)]. int exact; // if non-zero, preserve the exact RGB values under // transparent area. Otherwise, discard this invisible // RGB information for better compression. The default // value is 0. int use_delta_palette; // reserved for future lossless feature int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion int qmin; // minimum permissible quality factor int qmax; // maximum permissible quality factor }; // Enumerate some predefined settings for WebPConfig, depending on the type // of source picture. These presets are used when calling WebPConfigPreset(). typedef enum WebPPreset { WEBP_PRESET_DEFAULT = 0, // default preset. WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details WEBP_PRESET_ICON, // small-sized colorful images WEBP_PRESET_TEXT // text-like } WebPPreset; // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int); // Should always be called, to initialize a fresh WebPConfig structure before // modification. Returns false in case of version mismatch. WebPConfigInit() // must have succeeded before using the 'config' object. // Note that the default values are lossless=0 and quality=75. WEBP_NODISCARD static WEBP_INLINE int WebPConfigInit(WebPConfig* config) { return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f, WEBP_ENCODER_ABI_VERSION); } // This function will initialize the configuration according to a predefined // set of parameters (referred to by 'preset') and a given quality factor. // This function can be called as a replacement to WebPConfigInit(). Will // return false in case of error. WEBP_NODISCARD static WEBP_INLINE int WebPConfigPreset(WebPConfig* config, WebPPreset preset, float quality) { return WebPConfigInitInternal(config, preset, quality, WEBP_ENCODER_ABI_VERSION); } // Activate the lossless compression mode with the desired efficiency level // between 0 (fastest, lowest compression) and 9 (slower, best compression). // A good default level is '6', providing a fair tradeoff between compression // speed and final compressed size. // This function will overwrite several fields from config: 'method', 'quality' // and 'lossless'. Returns false in case of parameter error. WEBP_NODISCARD WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level); // Returns true if 'config' is non-NULL and all configuration parameters are // within their valid ranges. WEBP_NODISCARD WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config); //------------------------------------------------------------------------------ // Input / Output // Structure for storing auxiliary statistics. struct WebPAuxStats { int coded_size; // final size float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha int block_count[3]; // number of intra4/intra16/skipped macroblocks int header_bytes[2]; // approximate number of bytes spent for header // and mode-partition #0 int residual_bytes[3][4]; // approximate number of bytes spent for // DC/AC/uv coefficients for each (0..3) segments. int segment_size[4]; // number of macroblocks in each segments int segment_quant[4]; // quantizer values for each segments int segment_level[4]; // filtering strength for each segments [0..63] int alpha_data_size; // size of the transparency data int layer_data_size; // size of the enhancement layer data // lossless encoder statistics uint32_t lossless_features; // bit0:predictor bit1:cross-color transform // bit2:subtract-green bit3:color indexing int histogram_bits; // number of precision bits of histogram int transform_bits; // precision bits for transform int cache_bits; // number of bits for color cache lookup int palette_size; // number of color in palette, if used int lossless_size; // final lossless size int lossless_hdr_size; // lossless header (transform, huffman etc) size int lossless_data_size; // lossless image data size uint32_t pad[2]; // padding for later use }; // Signature for output function. Should return true if writing was successful. // data/data_size is the segment of data to write, and 'picture' is for // reference (and so one can make use of picture->custom_ptr). typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size, const WebPPicture* picture); // WebPMemoryWrite: a special WebPWriterFunction that writes to memory using // the following WebPMemoryWriter object (to be set as a custom_ptr). struct WebPMemoryWriter { uint8_t* mem; // final buffer (of size 'max_size', larger than 'size'). size_t size; // final size size_t max_size; // total capacity uint32_t pad[1]; // padding for later use }; // The following must be called first before any use. WEBP_EXTERN void WebPMemoryWriterInit(WebPMemoryWriter* writer); // The following must be called to deallocate writer->mem memory. The 'writer' // object itself is not deallocated. WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer); // The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon // completion, writer.mem and writer.size will hold the coded data. // writer.mem must be freed by calling WebPMemoryWriterClear. WEBP_NODISCARD WEBP_EXTERN int WebPMemoryWrite( const uint8_t* data, size_t data_size, const WebPPicture* picture); // Progress hook, called from time to time to report progress. It can return // false to request an abort of the encoding process, or true otherwise if // everything is OK. typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture); // Color spaces. typedef enum WebPEncCSP { // chroma sampling WEBP_YUV420 = 0, // 4:2:0 WEBP_YUV420A = 4, // alpha channel variant WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present } WebPEncCSP; // Encoding error conditions. typedef enum WebPEncodingError { VP8_ENC_OK = 0, VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G VP8_ENC_ERROR_USER_ABORT, // abort request by user VP8_ENC_ERROR_LAST // list terminator. always last. } WebPEncodingError; // maximum width/height allowed (inclusive), in pixels #define WEBP_MAX_DIMENSION 16383 // Main exchange structure (input samples, output bytes, statistics) // // Once WebPPictureInit() has been called, it's ok to make all the INPUT fields // (use_argb, y/u/v, argb, ...) point to user-owned data, even if // WebPPictureAlloc() has been called. Depending on the value use_argb, // it's guaranteed that either *argb or *y/*u/*v content will be kept untouched. struct WebPPicture { // INPUT ////////////// // Main flag for encoder selecting between ARGB or YUV input. // It is recommended to use ARGB input (*argb, argb_stride) for lossless // compression, and YUV input (*y, *u, *v, etc.) for lossy compression // since these are the respective native colorspace for these formats. int use_argb; // YUV input (mostly used for input to lossy compression) WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr). int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION) uint8_t* y, *u, *v; // pointers to luma/chroma planes. int y_stride, uv_stride; // luma/chroma strides. uint8_t* a; // pointer to the alpha plane int a_stride; // stride of the alpha plane uint32_t pad1[2]; // padding for later use // ARGB input (mostly used for input to lossless compression) uint32_t* argb; // Pointer to argb (32 bit) plane. int argb_stride; // This is stride in pixels units, not bytes. uint32_t pad2[3]; // padding for later use // OUTPUT /////////////// // Byte-emission hook, to store compressed bytes as they are ready. WebPWriterFunction writer; // can be NULL void* custom_ptr; // can be used by the writer. // map for extra information (only for lossy compression mode) int extra_info_type; // 1: intra type, 2: segment, 3: quant // 4: intra-16 prediction mode, // 5: chroma prediction mode, // 6: bit cost, 7: distortion uint8_t* extra_info; // if not NULL, points to an array of size // ((width + 15) / 16) * ((height + 15) / 16) that // will be filled with a macroblock map, depending // on extra_info_type. // STATS AND REPORTS /////////////////////////// // Pointer to side statistics (updated only if not NULL) WebPAuxStats* stats; // Error code for the latest error encountered during encoding WebPEncodingError error_code; // If not NULL, report progress during encoding. WebPProgressHook progress_hook; void* user_data; // this field is free to be set to any value and // used during callbacks (like progress-report e.g.). uint32_t pad3[3]; // padding for later use // Unused for now uint8_t* pad4, *pad5; uint32_t pad6[8]; // padding for later use // PRIVATE FIELDS //////////////////// void* memory_; // row chunk of memory for yuva planes void* memory_argb_; // and for argb too. void* pad7[2]; // padding for later use }; // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int); // Should always be called, to initialize the structure. Returns false in case // of version mismatch. WebPPictureInit() must have succeeded before using the // 'picture' object. // Note that, by default, use_argb is false and colorspace is WEBP_YUV420. WEBP_NODISCARD static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) { return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION); } //------------------------------------------------------------------------------ // WebPPicture utils // Convenience allocation / deallocation based on picture->width/height: // Allocate y/u/v buffers as per colorspace/width/height specification. // Note! This function will free the previous buffer if needed. // Returns false in case of memory error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture); // Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*(). // Note that this function does _not_ free the memory used by the 'picture' // object itself. // Besides memory (which is reclaimed) all other fields of 'picture' are // preserved. WEBP_EXTERN void WebPPictureFree(WebPPicture* picture); // Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst // will fully own the copied pixels (this is not a view). The 'dst' picture need // not be initialized as its content is overwritten. // Returns false in case of memory allocation error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst); // Compute the single distortion for packed planes of samples. // 'src' will be compared to 'ref', and the raw distortion stored into // '*distortion'. The refined metric (log(MSE), log(1 - ssim),...' will be // stored in '*result'. // 'x_step' is the horizontal stride (in bytes) between samples. // 'src/ref_stride' is the byte distance between rows. // Returns false in case of error (bad parameter, memory allocation error, ...). WEBP_NODISCARD WEBP_EXTERN int WebPPlaneDistortion( const uint8_t* src, size_t src_stride, const uint8_t* ref, size_t ref_stride, int width, int height, size_t x_step, int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM float* distortion, float* result); // Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results // are in dB, stored in result[] in the B/G/R/A/All order. The distortion is // always performed using ARGB samples. Hence if the input is YUV(A), the // picture will be internally converted to ARGB (just for the measurement). // Warning: this function is rather CPU-intensive. WEBP_NODISCARD WEBP_EXTERN int WebPPictureDistortion( const WebPPicture* src, const WebPPicture* ref, int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM float result[5]); // self-crops a picture to the rectangle defined by top/left/width/height. // Returns false in case of memory allocation error, or if the rectangle is // outside of the source picture. // The rectangle for the view is defined by the top-left corner pixel // coordinates (left, top) as well as its width and height. This rectangle // must be fully be comprised inside the 'src' source picture. If the source // picture uses the YUV420 colorspace, the top and left coordinates will be // snapped to even values. WEBP_NODISCARD WEBP_EXTERN int WebPPictureCrop( WebPPicture* picture, int left, int top, int width, int height); // Extracts a view from 'src' picture into 'dst'. The rectangle for the view // is defined by the top-left corner pixel coordinates (left, top) as well // as its width and height. This rectangle must be fully be comprised inside // the 'src' source picture. If the source picture uses the YUV420 colorspace, // the top and left coordinates will be snapped to even values. // Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed // ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so, // the original dimension will be lost). Picture 'dst' need not be initialized // with WebPPictureInit() if it is different from 'src', since its content will // be overwritten. // Returns false in case of invalid parameters. WEBP_NODISCARD WEBP_EXTERN int WebPPictureView( const WebPPicture* src, int left, int top, int width, int height, WebPPicture* dst); // Returns true if the 'picture' is actually a view and therefore does // not own the memory for pixels. WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture); // Rescale a picture to new dimension width x height. // If either 'width' or 'height' (but not both) is 0 the corresponding // dimension will be calculated preserving the aspect ratio. // No gamma correction is applied. // Returns false in case of error (invalid parameter or insufficient memory). WEBP_NODISCARD WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height); // Colorspace conversion function to import RGB samples. // Previous buffer will be free'd, if any. // *rgb buffer should have a size of at least height * rgb_stride. // Returns false in case of memory error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGB( WebPPicture* picture, const uint8_t* rgb, int rgb_stride); // Same, but for RGBA buffer. WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBA( WebPPicture* picture, const uint8_t* rgba, int rgba_stride); // Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format // input buffer ignoring the alpha channel. Avoids needing to copy the data // to a temporary 24-bit RGB buffer to import the RGB only. WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBX( WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride); // Variants of the above, but taking BGR(A|X) input. WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGR( WebPPicture* picture, const uint8_t* bgr, int bgr_stride); WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRA( WebPPicture* picture, const uint8_t* bgra, int bgra_stride); WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRX( WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride); // Converts picture->argb data to the YUV420A format. The 'colorspace' // parameter is deprecated and should be equal to WEBP_YUV420. // Upon return, picture->use_argb is set to false. The presence of real // non-opaque transparent values is detected, and 'colorspace' will be // adjusted accordingly. Note that this method is lossy. // Returns false in case of error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVA( WebPPicture* picture, WebPEncCSP /*colorspace = WEBP_YUV420*/); // Same as WebPPictureARGBToYUVA(), but the conversion is done using // pseudo-random dithering with a strength 'dithering' between // 0.0 (no dithering) and 1.0 (maximum dithering). This is useful // for photographic picture. WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVADithered( WebPPicture* picture, WebPEncCSP colorspace, float dithering); // Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion // Downsampling is handled with extra care in case of color clipping. This // method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better // and sharper YUV representation. // Returns false in case of error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture); // kept for backward compatibility: WEBP_NODISCARD WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture); // Converts picture->yuv to picture->argb and sets picture->use_argb to true. // The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to // ARGB incurs a small loss too. // Note that the use of this colorspace is discouraged if one has access to the // raw ARGB samples, since using YUV420 is comparatively lossy. // Returns false in case of error. WEBP_NODISCARD WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture); // Helper function: given a width x height plane of RGBA or YUV(A) samples // clean-up or smoothen the YUV or RGB samples under fully transparent area, // to help compressibility (no guarantee, though). WEBP_EXTERN void WebPCleanupTransparentArea(WebPPicture* picture); // Scan the picture 'picture' for the presence of non fully opaque alpha values. // Returns true in such case. Otherwise returns false (indicating that the // alpha plane can be ignored altogether e.g.). WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture); // Remove the transparency information (if present) by blending the color with // the background color 'background_rgb' (specified as 24bit RGB triplet). // After this call, all alpha values are reset to 0xff. WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb); //------------------------------------------------------------------------------ // Main call // Main encoding call, after config and picture have been initialized. // 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION), // and the 'config' object must be a valid one. // Returns false in case of error, true otherwise. // In case of error, picture->error_code is updated accordingly. // 'picture' can hold the source samples in both YUV(A) or ARGB input, depending // on the value of 'picture->use_argb'. It is highly recommended to use // the former for lossy encoding, and the latter for lossless encoding // (when config.lossless is true). Automatic conversion from one format to // another is provided but they both incur some loss. WEBP_NODISCARD WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture); //------------------------------------------------------------------------------ #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_ENCODE_H_ libwebp-1.4.0/src/webp/decode.h0000644000014400001440000005663014606317060013205 0ustar // Copyright 2010 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // Main decoding functions for WebP images. // // Author: Skal (pascal.massimino@gmail.com) #ifndef WEBP_WEBP_DECODE_H_ #define WEBP_WEBP_DECODE_H_ #include "./types.h" #ifdef __cplusplus extern "C" { #endif #define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b) // Note: forward declaring enumerations is not allowed in (strict) C and C++, // the types are left here for reference. // typedef enum VP8StatusCode VP8StatusCode; // typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; typedef struct WebPRGBABuffer WebPRGBABuffer; typedef struct WebPYUVABuffer WebPYUVABuffer; typedef struct WebPDecBuffer WebPDecBuffer; typedef struct WebPIDecoder WebPIDecoder; typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; typedef struct WebPDecoderOptions WebPDecoderOptions; typedef struct WebPDecoderConfig WebPDecoderConfig; // Return the decoder's version number, packed in hexadecimal using 8bits for // each of major/minor/revision. E.g: v2.5.7 is 0x020507. WEBP_EXTERN int WebPGetDecoderVersion(void); // Retrieve basic header information: width, height. // This function will also validate the header, returning true on success, // false otherwise. '*width' and '*height' are only valid on successful return. // Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. // Note: The following chunk sequences (before the raw VP8/VP8L data) are // considered valid by this function: // RIFF + VP8(L) // RIFF + VP8X + (optional chunks) + VP8(L) // ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. // VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. WEBP_NODISCARD WEBP_EXTERN int WebPGetInfo( const uint8_t* data, size_t data_size, int* width, int* height); // Decodes WebP images pointed to by 'data' and returns RGBA samples, along // with the dimensions in *width and *height. The ordering of samples in // memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). // The returned pointer should be deleted calling WebPFree(). // Returns NULL in case of error. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBA( const uint8_t* data, size_t data_size, int* width, int* height); // Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGB( const uint8_t* data, size_t data_size, int* width, int* height); // Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRA( const uint8_t* data, size_t data_size, int* width, int* height); // Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. // If the bitstream contains transparency, it is ignored. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGB( const uint8_t* data, size_t data_size, int* width, int* height); // Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGR( const uint8_t* data, size_t data_size, int* width, int* height); // Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer // returned is the Y samples buffer. Upon return, *u and *v will point to // the U and V chroma data. These U and V buffers need NOT be passed to // WebPFree(), unlike the returned Y luma one. The dimension of the U and V // planes are both (*width + 1) / 2 and (*height + 1) / 2. // Upon return, the Y buffer has a stride returned as '*stride', while U and V // have a common stride returned as '*uv_stride'. // 'width' and 'height' may be NULL, the other pointers must not be. // Returns NULL in case of error. // (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeYUV( const uint8_t* data, size_t data_size, int* width, int* height, uint8_t** u, uint8_t** v, int* stride, int* uv_stride); // These five functions are variants of the above ones, that decode the image // directly into a pre-allocated buffer 'output_buffer'. The maximum storage // available in this buffer is indicated by 'output_buffer_size'. If this // storage is not sufficient (or an error occurred), NULL is returned. // Otherwise, output_buffer is returned, for convenience. // The parameter 'output_stride' specifies the distance (in bytes) // between scanlines. Hence, output_buffer_size is expected to be at least // output_stride x picture-height. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBAInto( const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGBInto( const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRAInto( const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); // RGB and BGR variants. Here too the transparency information, if present, // will be dropped and ignored. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBInto( const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRInto( const uint8_t* data, size_t data_size, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); // WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly // into pre-allocated luma/chroma plane buffers. This function requires the // strides to be passed: one for the luma plane and one for each of the // chroma ones. The size of each plane buffer is passed as 'luma_size', // 'u_size' and 'v_size' respectively. // Pointer to the luma plane ('*luma') is returned or NULL if an error occurred // during decoding (or because some buffers were found to be too small). WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeYUVInto( const uint8_t* data, size_t data_size, uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride); //------------------------------------------------------------------------------ // Output colorspaces and buffer // Colorspaces // Note: the naming describes the byte-ordering of packed samples in memory. // For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,... // Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels. // RGBA-4444 and RGB-565 colorspaces are represented by following byte-order: // RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ... // RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ... // In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for // these two modes: // RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ... // RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ... typedef enum WEBP_CSP_MODE { MODE_RGB = 0, MODE_RGBA = 1, MODE_BGR = 2, MODE_BGRA = 3, MODE_ARGB = 4, MODE_RGBA_4444 = 5, MODE_RGB_565 = 6, // RGB-premultiplied transparent modes (alpha value is preserved) MODE_rgbA = 7, MODE_bgrA = 8, MODE_Argb = 9, MODE_rgbA_4444 = 10, // YUV modes must come after RGB ones. MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0 MODE_LAST = 13 } WEBP_CSP_MODE; // Some useful macros: static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) { return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb || mode == MODE_rgbA_4444); } static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) { return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB || mode == MODE_RGBA_4444 || mode == MODE_YUVA || WebPIsPremultipliedMode(mode)); } static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) { return (mode < MODE_YUV); } //------------------------------------------------------------------------------ // WebPDecBuffer: Generic structure for describing the output sample buffer. struct WebPRGBABuffer { // view as RGBA uint8_t* rgba; // pointer to RGBA samples int stride; // stride in bytes from one scanline to the next. size_t size; // total size of the *rgba buffer. }; struct WebPYUVABuffer { // view as YUVA uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples int y_stride; // luma stride int u_stride, v_stride; // chroma strides int a_stride; // alpha stride size_t y_size; // luma plane size size_t u_size, v_size; // chroma planes size size_t a_size; // alpha-plane size }; // Output buffer struct WebPDecBuffer { WEBP_CSP_MODE colorspace; // Colorspace. int width, height; // Dimensions. int is_external_memory; // If non-zero, 'internal_memory' pointer is not // used. If value is '2' or more, the external // memory is considered 'slow' and multiple // read/write will be avoided. union { WebPRGBABuffer RGBA; WebPYUVABuffer YUVA; } u; // Nameless union of buffer parameters. uint32_t pad[4]; // padding for later use uint8_t* private_memory; // Internally allocated memory (only when // is_external_memory is 0). Should not be used // externally, but accessed via the buffer union. }; // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int); // Initialize the structure as empty. Must be called before any other use. // Returns false in case of version mismatch WEBP_NODISCARD static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) { return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION); } // Free any memory associated with the buffer. Must always be called last. // Note: doesn't free the 'buffer' structure itself. WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer); //------------------------------------------------------------------------------ // Enumeration of the status codes typedef enum WEBP_NODISCARD VP8StatusCode { VP8_STATUS_OK = 0, VP8_STATUS_OUT_OF_MEMORY, VP8_STATUS_INVALID_PARAM, VP8_STATUS_BITSTREAM_ERROR, VP8_STATUS_UNSUPPORTED_FEATURE, VP8_STATUS_SUSPENDED, VP8_STATUS_USER_ABORT, VP8_STATUS_NOT_ENOUGH_DATA } VP8StatusCode; //------------------------------------------------------------------------------ // Incremental decoding // // This API allows streamlined decoding of partial data. // Picture can be incrementally decoded as data become available thanks to the // WebPIDecoder object. This object can be left in a SUSPENDED state if the // picture is only partially decoded, pending additional input. // Code example: /* WebPInitDecBuffer(&output_buffer); output_buffer.colorspace = mode; ... WebPIDecoder* idec = WebPINewDecoder(&output_buffer); while (additional_data_is_available) { // ... (get additional data in some new_data[] buffer) status = WebPIAppend(idec, new_data, new_data_size); if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) { break; // an error occurred. } // The above call decodes the current available buffer. // Part of the image can now be refreshed by calling // WebPIDecGetRGB()/WebPIDecGetYUVA() etc. } WebPIDelete(idec); */ // Creates a new incremental decoder with the supplied buffer parameter. // This output_buffer can be passed NULL, in which case a default output buffer // is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer' // is kept, which means that the lifespan of 'output_buffer' must be larger than // that of the returned WebPIDecoder object. // The supplied 'output_buffer' content MUST NOT be changed between calls to // WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is // not set to 0. In such a case, it is allowed to modify the pointers, size and // stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain // within valid bounds. // All other fields of WebPDecBuffer MUST remain constant between calls. // Returns NULL if the allocation failed. WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewDecoder( WebPDecBuffer* output_buffer); // This function allocates and initializes an incremental-decoder object, which // will output the RGB/A samples specified by 'csp' into a preallocated // buffer 'output_buffer'. The size of this buffer is at least // 'output_buffer_size' and the stride (distance in bytes between two scanlines) // is specified by 'output_stride'. // Additionally, output_buffer can be passed NULL in which case the output // buffer will be allocated automatically when the decoding starts. The // colorspace 'csp' is taken into account for allocating this buffer. All other // parameters are ignored. // Returns NULL if the allocation failed, or if some parameters are invalid. WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewRGB( WEBP_CSP_MODE csp, uint8_t* output_buffer, size_t output_buffer_size, int output_stride); // This function allocates and initializes an incremental-decoder object, which // will output the raw luma/chroma samples into a preallocated planes if // supplied. The luma plane is specified by its pointer 'luma', its size // 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane // is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v // plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer // can be pass NULL in case one is not interested in the transparency plane. // Conversely, 'luma' can be passed NULL if no preallocated planes are supplied. // In this case, the output buffer will be automatically allocated (using // MODE_YUVA) when decoding starts. All parameters are then ignored. // Returns NULL if the allocation failed or if a parameter is invalid. WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUVA( uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride, uint8_t* a, size_t a_size, int a_stride); // Deprecated version of the above, without the alpha plane. // Kept for backward compatibility. WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUV( uint8_t* luma, size_t luma_size, int luma_stride, uint8_t* u, size_t u_size, int u_stride, uint8_t* v, size_t v_size, int v_stride); // Deletes the WebPIDecoder object and associated memory. Must always be called // if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded. WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec); // Copies and decodes the next available data. Returns VP8_STATUS_OK when // the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more // data is expected. Returns error in other cases. WEBP_EXTERN VP8StatusCode WebPIAppend( WebPIDecoder* idec, const uint8_t* data, size_t data_size); // A variant of the above function to be used when data buffer contains // partial data from the beginning. In this case data buffer is not copied // to the internal memory. // Note that the value of the 'data' pointer can change between calls to // WebPIUpdate, for instance when the data buffer is resized to fit larger data. WEBP_EXTERN VP8StatusCode WebPIUpdate( WebPIDecoder* idec, const uint8_t* data, size_t data_size); // Returns the RGB/A image decoded so far. Returns NULL if output params // are not initialized yet. The RGB/A output type corresponds to the colorspace // specified during call to WebPINewDecoder() or WebPINewRGB(). // *last_y is the index of last decoded row in raster scan order. Some pointers // (*last_y, *width etc.) can be NULL if corresponding information is not // needed. The values in these pointers are only valid on successful (non-NULL) // return. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetRGB( const WebPIDecoder* idec, int* last_y, int* width, int* height, int* stride); // Same as above function to get a YUVA image. Returns pointer to the luma // plane or NULL in case of error. If there is no alpha information // the alpha pointer '*a' will be returned NULL. WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetYUVA( const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, uint8_t** a, int* width, int* height, int* stride, int* uv_stride, int* a_stride); // Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the // alpha information (if present). Kept for backward compatibility. WEBP_NODISCARD static WEBP_INLINE uint8_t* WebPIDecGetYUV( const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v, int* width, int* height, int* stride, int* uv_stride) { return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height, stride, uv_stride, NULL); } // Generic call to retrieve information about the displayable area. // If non NULL, the left/right/width/height pointers are filled with the visible // rectangular area so far. // Returns NULL in case the incremental decoder object is in an invalid state. // Otherwise returns the pointer to the internal representation. This structure // is read-only, tied to WebPIDecoder's lifespan and should not be modified. WEBP_NODISCARD WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea( const WebPIDecoder* idec, int* left, int* top, int* width, int* height); //------------------------------------------------------------------------------ // Advanced decoding parametrization // // Code sample for using the advanced decoding API /* // A) Init a configuration object WebPDecoderConfig config; CHECK(WebPInitDecoderConfig(&config)); // B) optional: retrieve the bitstream's features. CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); // C) Adjust 'config', if needed config.options.no_fancy_upsampling = 1; config.output.colorspace = MODE_BGRA; // etc. // Note that you can also make config.output point to an externally // supplied memory buffer, provided it's big enough to store the decoded // picture. Otherwise, config.output will just be used to allocate memory // and store the decoded picture. // D) Decode! CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); // E) Decoded image is now in config.output (and config.output.u.RGBA) // F) Reclaim memory allocated in config's object. It's safe to call // this function even if the memory is external and wasn't allocated // by WebPDecode(). WebPFreeDecBuffer(&config.output); */ // Features gathered from the bitstream struct WebPBitstreamFeatures { int width; // Width in pixels, as read from the bitstream. int height; // Height in pixels, as read from the bitstream. int has_alpha; // True if the bitstream contains an alpha channel. int has_animation; // True if the bitstream is an animation. int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless uint32_t pad[5]; // padding for later use }; // Internal, version-checked, entry point WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal( const uint8_t*, size_t, WebPBitstreamFeatures*, int); // Retrieve features from the bitstream. The *features structure is filled // with information gathered from the bitstream. // Returns VP8_STATUS_OK when the features are successfully retrieved. Returns // VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the // features from headers. Returns error in other cases. // Note: The following chunk sequences (before the raw VP8/VP8L data) are // considered valid by this function: // RIFF + VP8(L) // RIFF + VP8X + (optional chunks) + VP8(L) // ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose. // VP8(L) <-- Not a valid WebP format: only allowed for internal purpose. static WEBP_INLINE VP8StatusCode WebPGetFeatures( const uint8_t* data, size_t data_size, WebPBitstreamFeatures* features) { return WebPGetFeaturesInternal(data, data_size, features, WEBP_DECODER_ABI_VERSION); } // Decoding options struct WebPDecoderOptions { int bypass_filtering; // if true, skip the in-loop filtering int no_fancy_upsampling; // if true, use faster pointwise upsampler int use_cropping; // if true, cropping is applied _first_ int crop_left, crop_top; // top-left position for cropping. // Will be snapped to even values. int crop_width, crop_height; // dimension of the cropping area int use_scaling; // if true, scaling is applied _afterward_ int scaled_width, scaled_height; // final resolution int use_threads; // if true, use multi-threaded decoding int dithering_strength; // dithering strength (0=Off, 100=full) int flip; // if true, flip output vertically int alpha_dithering_strength; // alpha dithering strength in [0..100] uint32_t pad[5]; // padding for later use }; // Main object storing the configuration for advanced decoding. struct WebPDecoderConfig { WebPBitstreamFeatures input; // Immutable bitstream features (optional) WebPDecBuffer output; // Output buffer (can point to external mem) WebPDecoderOptions options; // Decoding options }; // Internal, version-checked, entry point WEBP_NODISCARD WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int); // Initialize the configuration as empty. This function must always be // called first, unless WebPGetFeatures() is to be called. // Returns false in case of mismatched version. WEBP_NODISCARD static WEBP_INLINE int WebPInitDecoderConfig( WebPDecoderConfig* config) { return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION); } // Instantiate a new incremental decoder object with the requested // configuration. The bitstream can be passed using 'data' and 'data_size' // parameter, in which case the features will be parsed and stored into // config->input. Otherwise, 'data' can be NULL and no parsing will occur. // Note that 'config' can be NULL too, in which case a default configuration // is used. If 'config' is not NULL, it must outlive the WebPIDecoder object // as some references to its fields will be used. No internal copy of 'config' // is made. // The return WebPIDecoder object must always be deleted calling WebPIDelete(). // Returns NULL in case of error (and config->status will then reflect // the error condition, if available). WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPIDecode( const uint8_t* data, size_t data_size, WebPDecoderConfig* config); // Non-incremental version. This version decodes the full data at once, taking // 'config' into account. Returns decoding status (which should be VP8_STATUS_OK // if the decoding was successful). Note that 'config' cannot be NULL. WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size, WebPDecoderConfig* config); #ifdef __cplusplus } // extern "C" #endif #endif // WEBP_WEBP_DECODE_H_ libwebp-1.4.0/src/libwebpdecoder.pc.in0000644000014400001440000000050214606317060014542 0ustar prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libwebpdecoder Description: Library for the WebP graphics format (decode only) Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -l@webp_libname_prefix@webpdecoder Libs.private: -lm @PTHREAD_CFLAGS@ @PTHREAD_LIBS@